[freeplane] 01/12: Imported Upstream version 1.5.11
Felix Natter
fnatter-guest at moszumanska.debian.org
Sat Jul 16 11:42:42 UTC 2016
This is an automated email from the git hooks/post-receive script.
fnatter-guest pushed a commit to branch master
in repository freeplane.
commit 8a37f9ee04ec2f47c0b3a293056f873c68377c84
Author: Felix Natter <fnatter at gmx.net>
Date: Sat Jul 16 13:11:38 2016 +0200
Imported Upstream version 1.5.11
---
JOrtho_0.4_freeplane/.classpath | 7 -
JOrtho_0.4_freeplane/.project | 17 -
.../.settings/org.eclipse.core.resources.prefs | 3 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
.../.settings/org.eclipse.jdt.core.prefs | 12 -
JOrtho_0.4_freeplane/build.gradle | 45 +
JOrtho_0.4_freeplane/build.xml | 66 -
.../src/com/inet/jortho/CheckerListener.java | 181 -
.../com/inet/jortho/i18n/resource_cs.properties | 15 -
.../com/inet/jortho/i18n/resource_de.properties | 16 -
.../com/inet/jortho/i18n/resource_es.properties | 15 -
.../com/inet/jortho/i18n/resource_es_MX.properties | 15 -
.../com/inet/jortho/i18n/resource_fr.properties | 15 -
.../com/inet/jortho/i18n/resource_hr.properties | 16 -
.../com/inet/jortho/i18n/resource_pl.properties | 15 -
.../com/inet/jortho/i18n/resource_ru.properties | 15 -
.../src/{ => main/java}/SampleApplet.java | 0
.../src/{ => main/java}/SampleApplication.java | 0
.../java}/com/inet/jortho/AutoSpellChecker.java | 0
.../main/java/com/inet/jortho/CheckerListener.java | 181 +
.../java}/com/inet/jortho/CheckerMenu.java | 0
.../java}/com/inet/jortho/CheckerPopup.java | 0
.../java}/com/inet/jortho/Dictionary.java | 0
.../java}/com/inet/jortho/DictionaryBase.java | 0
.../com/inet/jortho/DictionaryEditDialog.java | 0
.../java}/com/inet/jortho/DictionaryFactory.java | 0
.../java}/com/inet/jortho/FileUserDictionary.java | 0
.../java}/com/inet/jortho/LanguageChangeEvent.java | 0
.../com/inet/jortho/LanguageChangeListener.java | 0
.../com/inet/jortho/LetterBasedBreakIterator.java | 0
.../java}/com/inet/jortho/PopupListener.java | 0
.../java}/com/inet/jortho/RedZigZagPainter.java | 0
.../java}/com/inet/jortho/SpellChecker.java | 0
.../java}/com/inet/jortho/SpellCheckerDialog.java | 0
.../java}/com/inet/jortho/SpellCheckerOptions.java | 0
.../java}/com/inet/jortho/Suggestion.java | 0
.../java}/com/inet/jortho/Suggestions.java | 0
.../{ => main/java}/com/inet/jortho/Tokenizer.java | 0
.../com/inet/jortho/UserDictionaryProvider.java | 0
.../src/{ => main/java}/com/inet/jortho/Utils.java | 0
.../src/{ => main/java}/com/inet/jortho/icon.png | Bin
.../{ => main/java}/com/inet/jortho/package.html | 0
.../com/inet/jortho/i18n/resource.properties | 0
.../com/inet/jortho/i18n/resource_cs.properties | 15 +
.../com/inet/jortho/i18n/resource_de.properties | 16 +
.../com/inet/jortho/i18n/resource_es.properties | 15 +
.../com/inet/jortho/i18n/resource_es_MX.properties | 15 +
.../com/inet/jortho/i18n/resource_fr.properties | 15 +
.../com/inet/jortho/i18n/resource_hr.properties | 16 +
.../com/inet/jortho/i18n/resource_it.properties | 0
.../com/inet/jortho/i18n/resource_nl.properties | 0
.../com/inet/jortho/i18n/resource_pl.properties | 15 +
.../com/inet/jortho/i18n/resource_ru.properties | 15 +
.../com/inet/jortho/i18n/resource_sk.properties | 0
.../src/{ => main/resources}/dictionaries.cnf | 0
.../src/main/resources/dictionary_en.ortho | Bin 0 -> 765704 bytes
.../java}/com/inet/jorthotests/AllTests.java | 0
.../java}/com/inet/jorthotests/EventTest.java | 0
.../java}/com/inet/jorthotests/MemoryTest.java | 0
bin.dist.gradle | 24 +
build.gradle | 251 +
build.xml | 56 -
dist.gradle | 69 +
freeplane/.classpath | 20 -
freeplane/.project | 28 -
.../.settings/org.eclipse.core.resources.prefs | 4 -
freeplane/.settings/org.eclipse.jdt.core.prefs | 25 -
freeplane/.settings/org.eclipse.jdt.ui.prefs | 5 -
.../org.eclipse.ltk.core.refactoring.prefs | 3 -
freeplane/.settings/org.eclipse.pde.core.prefs | 4 -
.../.settings/org.eclipse.wst.validation.prefs | 9 -
freeplane/META-INF/MANIFEST.MF | 123 -
freeplane/META-INF/OLD_MANIFEST.MF | 11 -
freeplane/ant/Menu_Prefs_Templates.mm | 221 -
freeplane/ant/ant.properties | 14 -
freeplane/ant/build.xml | 304 -
freeplane/ant/signjar-example.properties | 9 -
freeplane/build.gradle | 320 +
freeplane/doc/Freeplane_LaTeX.mm | 80 +-
freeplane/doc/freeplane.mm | 3033 +-
freeplane/doc/freeplaneApplications.mm | 534 -
freeplane/doc/freeplaneApplications_ja.mm | 540 -
freeplane/doc/freeplaneApplications_nl.mm | 540 -
freeplane/doc/freeplaneFunctions.mm | 182 +-
freeplane/doc/freeplaneFunctions_ja.mm | 225 +-
freeplane/doc/freeplaneFunctions_nl.mm | 174 +-
freeplane/doc/freeplaneTutorial.mm | 994 +-
freeplane/doc/freeplaneTutorial_ja.mm | 950 +-
freeplane/doc/freeplane_de.mm | 1370 +-
freeplane/doc/freeplane_es.mm | 1163 +-
freeplane/doc/freeplane_et.mm | 3391 +-
freeplane/doc/freeplane_fr.mm | 337 +-
freeplane/doc/freeplane_functionality_nl.jpg | Bin 74535 -> 0 bytes
freeplane/doc/freeplane_functionality_nl.mm | 440 -
freeplane/doc/freeplane_id.mm | 1199 +-
freeplane/doc/freeplane_it.mm | 721 +-
freeplane/doc/freeplane_ja.mm | 3086 +-
freeplane/doc/freeplane_ru.mm | 1027 +-
freeplane/doc/freeplane_vi.mm | 1165 +-
freeplane/doc/history_en.txt | 121 +-
freeplane/doc/whatsNew-1.5.x.mm | 706 +
freeplane/external-resources/templates/BigMap.mm | 115 +
.../external-resources/templates/conceptMap.mm | 10 +-
freeplane/external-resources/templates/essay.mm | 10 +-
freeplane/external-resources/templates/standard.mm | 40 +-
.../external-resources/xml/browsemodemenu.xml | 162 +
freeplane/external-resources/xml/filemodemenu.xml | 118 +
.../external-resources/xml/mindmapmodemenu.xml | 560 +
freeplane/external-resources/xml/preferences.xml | 286 +
freeplane/external-resources/xml/stylemodemenu.xml | 174 +
freeplane/external-resources/xslt/mm2adoc.xsl | 105 +
freeplane/external-resources/xslt/mm2html.xsl | 238 +-
.../external-resources/xslt/mm2latexartcl.xsl | 2 +-
freeplane/external-resources/xslt/mm2markdown.xsl | 195 +
freeplane/external-resources/xslt/mm2opml.xsl | 2 +-
.../external-resources/xslt/mm2wordml_utf8.xsl | 4 +-
freeplane/external-resources/xslt/mm2xml.xsl | 61 +
freeplane/format_translation.gradle | 70 +
freeplane/git.gradle | 46 +
freeplane/{svg-src => images-src}/Negative.svg | 0
freeplane/{svg-src => images-src}/Neutral.svg | 0
freeplane/{svg-src => images-src}/Positive.svg | 0
.../{svg-src => images-src}/Very_Positive.svg | 0
freeplane/images-src/clone.xcf | Bin 0 -> 9961 bytes
.../{svg-src => images-src}/very_negative.svg | 0
freeplane/pom.xml | 54 -
freeplane/resources/html/deployJava.js | 1 -
freeplane/resources/html/deployJava.txt | 1306 -
freeplane/resources/html/folding.css | 12 -
.../resources/images/Freeplane_app_menu_128.png | Bin 0 -> 9028 bytes
freeplane/resources/images/JonasBatista.jpg | Bin 0 -> 12003 bytes
.../resources/images/MapBackgroundClearAction.png | Bin 0 -> 950 bytes
.../resources/images/MapBackgroundImageAction.png | Bin 0 -> 666 bytes
freeplane/resources/images/algnCtr16.gif | Bin 0 -> 862 bytes
freeplane/resources/images/algnCtr16_on.gif | Bin 0 -> 1007 bytes
freeplane/resources/images/algnLft16.gif | Bin 0 -> 862 bytes
freeplane/resources/images/algnLft16_on.gif | Bin 0 -> 1007 bytes
freeplane/resources/images/algnRt16.gif | Bin 0 -> 862 bytes
freeplane/resources/images/algnRt16_on.gif | Bin 0 -> 1009 bytes
freeplane/resources/images/on_selected_node.png | Bin 0 -> 1403 bytes
.../images/on_selected_node_recursively.png | Bin 0 -> 1400 bytes
.../images/on_selected_node_recursively_small.png | Bin 0 -> 2955 bytes
.../resources/images/on_selected_node_small.png | Bin 0 -> 2929 bytes
freeplane/resources/images/on_single_node.png | Bin 0 -> 822 bytes
.../resources/images/on_single_node_small.png | Bin 0 -> 2895 bytes
.../resources/images/svg/on_selected_node.svg | 153 +
.../images/svg/on_selected_node_recursively.svg | 262 +
freeplane/resources/images/svg/on_single_node.svg | 152 +
freeplane/resources/menu_aliases.properties | 14 +
.../resources/translations/Resources_ar.properties | 4 +-
.../resources/translations/Resources_ca.properties | 14 +-
.../resources/translations/Resources_cs.properties | 63 +-
.../resources/translations/Resources_da.properties | 190 +-
.../resources/translations/Resources_de.properties | 768 +-
.../resources/translations/Resources_el.properties | 32 +-
.../resources/translations/Resources_es.properties | 50 +-
.../resources/translations/Resources_et.properties | 127 +-
.../resources/translations/Resources_eu.properties | 500 +
.../resources/translations/Resources_fr.properties | 215 +-
.../resources/translations/Resources_gl.properties | 15 +-
.../resources/translations/Resources_hr.properties | 317 +-
.../resources/translations/Resources_hu.properties | 306 +-
.../resources/translations/Resources_id.properties | 60 +-
.../resources/translations/Resources_it.properties | 102 +-
.../resources/translations/Resources_ja.properties | 314 +-
.../resources/translations/Resources_ko.properties | 573 +-
.../resources/translations/Resources_lt.properties | 13 +-
.../resources/translations/Resources_nb.properties | 29 +-
.../resources/translations/Resources_nl.properties | 82 +-
.../resources/translations/Resources_nn.properties | 17 +-
.../resources/translations/Resources_pl.properties | 679 +-
.../translations/Resources_pt_BR.properties | 443 +-
.../translations/Resources_pt_PT.properties | 276 +-
.../resources/translations/Resources_ru.properties | 64 +-
.../resources/translations/Resources_sk.properties | 18 +-
.../resources/translations/Resources_sl.properties | 21 +-
.../resources/translations/Resources_sr.properties | 3353 +-
.../resources/translations/Resources_sv.properties | 1204 +-
.../resources/translations/Resources_tr.properties | 12 +-
.../translations/Resources_uk_UA.properties | 1826 +-
.../translations/Resources_zh_CN.properties | 2029 +-
.../translations/Resources_zh_TW.properties | 170 +-
freeplane/resources/xml/ExportWithXSLT.xml | 6 +-
freeplane/resources/xml/browsemodemenu.mm | 673 -
freeplane/resources/xml/filemodemenu.mm | 508 -
freeplane/resources/xml/mapVersions.xml | 6 +
freeplane/resources/xml/mindmapmodemenu.mm | 2116 -
freeplane/resources/xml/mindmapmoderibbon.out.xml | 509 -
freeplane/resources/xml/preferences.mm | 927 -
freeplane/resources/xml/stylemodemenu.mm | 695 -
freeplane/resources/xslt/exportmm2appletmm.xsl | 24 -
freeplane/resources/xslt/freeplane2applet.xsl | 61 +-
freeplane/resources/xslt/mm2menu.xsl | 75 -
freeplane/resources/xslt/mm2preferences.xsl | 69 -
freeplane/resources/xslt/opml2mm.xsl | 2 +-
freeplane/resources/xslt/xml2mm.xsl | 148 +
freeplane/signjar.gradle | 51 +
.../src/com/thebuzzmedia/imgscalr/AsyncScalr.java | 426 -
freeplane/src/com/thebuzzmedia/imgscalr/Scalr.java | 1924 -
.../java/com/thebuzzmedia/imgscalr/AsyncScalr.java | 570 +
.../main/java/com/thebuzzmedia/imgscalr/Scalr.java | 2245 ++
.../java/net/infonode/gui/RotatableLabelUI.java | 134 +
.../core/extension/ExtensionContainer.java | 0
.../org/freeplane/core/extension/IExtension.java | 0
.../core/extension/SmallExtensionMap.java | 0
.../core/io/BackwardCompatibleQuantityWriter.java | 37 +
.../org/freeplane/core/io/IAttributeHandler.java | 0
.../org/freeplane/core/io/IAttributeWriter.java | 0
.../freeplane/core/io/IElementContentHandler.java | 0
.../org/freeplane/core/io/IElementDOMHandler.java | 0
.../org/freeplane/core/io/IElementHandler.java | 0
.../org/freeplane/core/io/IElementWriter.java | 0
.../core/io/IExtensionAttributeWriter.java | 0
.../freeplane/core/io/IExtensionElementWriter.java | 0
.../java}/org/freeplane/core/io/IHintProvider.java | 0
.../freeplane/core/io/IReadCompletionListener.java | 0
.../java}/org/freeplane/core/io/ITreeWriter.java | 0
.../java}/org/freeplane/core/io/ListHashTable.java | 0
.../java}/org/freeplane/core/io/ReadManager.java | 0
.../freeplane/core/io/UnknownElementWriter.java | 0
.../org/freeplane/core/io/UnknownElements.java | 0
.../java/org/freeplane/core/io/WriteManager.java | 93 +
.../org/freeplane/core/io/xml/StdXMLBuilder.java | 0
.../org/freeplane/core/io/xml/TreeXmlReader.java | 333 +
.../org/freeplane/core/io/xml/TreeXmlWriter.java | 0
.../java}/org/freeplane/core/io/xml/XMLParser.java | 0
.../java}/org/freeplane/core/io/xml/XMLWriter.java | 0
.../core/resources/IFreeplanePropertyListener.java | 0
.../core/resources/OptionPanelController.java | 0
.../freeplane/core/resources/ResourceBundles.java | 0
.../core/resources/ResourceController.java | 320 +
.../core/resources/SetBooleanPropertyAction.java | 61 +
.../freeplane/core/resources/TranslatedObject.java | 141 +
.../core/resources/WindowConfigurationStorage.java | 134 +
.../core/resources/components/BooleanProperty.java | 81 +
.../core/resources/components/ColorProperty.java | 135 +
.../core/resources/components/ComboProperty.java | 133 +
.../components/EditableComboProperty.java | 89 +
.../core/resources/components/FontProperty.java | 78 +
.../core/resources/components/GrabKeyDialog.java | 423 +
.../resources/components/IKeystrokeValidator.java | 0
.../resources/components/IPropertyControl.java | 30 +
.../components/IPropertyControlCreator.java | 0
.../core/resources/components/IValidator.java | 0
.../core/resources/components/IconProperty.java | 105 +
.../resources/components/KeyEventTranslator.java | 0
.../core/resources/components/KeyProperty.java | 114 +
.../resources/components/NextColumnProperty.java | 49 +
.../resources/components/NextLineProperty.java | 41 +
.../core/resources/components/NumberProperty.java | 111 +
.../core/resources/components/OptionPanel.java | 381 +
.../resources/components/OptionPanelBuilder.java | 655 +
.../OptionPanelWindowConfigurationStorage.java | 0
.../core/resources/components/PathProperty.java | 168 +
.../core/resources/components/PropertyAction.java | 138 +
.../core/resources/components/PropertyAdapter.java | 77 +
.../core/resources/components/PropertyBean.java | 60 +
.../resources/components/QuantityProperty.java | 117 +
.../resources/components/RemindValueProperty.java | 117 +
.../resources/components/SeparatorProperty.java | 52 +
.../core/resources/components/StringProperty.java | 62 +
.../core/resources/components/TabProperty.java | 60 +
.../freeplane/core/resources/components/Text.java | 56 +
.../core/resources/components/TextBoxProperty.java | 59 +
.../components/VariableSizeCardLayout.java | 0
.../org/freeplane/core/ui/AFreeplaneAction.java | 192 +
.../org/freeplane/core/ui/AMouseListener.java | 0
.../org/freeplane/core/ui/AMultipleNodeAction.java | 0
.../freeplane/core/ui/AccelerateableAction.java | 152 +
.../core/ui/ActionAcceleratorManager.java | 472 +
.../java/org/freeplane/core/ui/ActionEnabler.java | 28 +
.../ButtonModelStateChangeListenerForProperty.java | 22 +
.../java/org/freeplane/core/ui/ColorTracker.java | 133 +
.../org/freeplane/core/ui/ColoredIconCreator.java | 72 +
.../core/ui/ControllerPopupMenuListener.java | 0
.../freeplane/core/ui/DelayedMouseListener.java | 0
.../core/ui/DelegatingPopupMenuListener.java | 35 +
.../org/freeplane/core/ui/DoubleClickTimer.java | 0
.../java}/org/freeplane/core/ui/EnabledAction.java | 0
.../org/freeplane/core/ui/ExampleFileFilter.java | 0
.../java/org/freeplane/core/ui/FileOpener.java | 150 +
.../core/ui/FixedBasicComboBoxEditor.java | 0
.../core/ui/IAcceleratorChangeListener.java | 30 +
.../java}/org/freeplane/core/ui/IEditHandler.java | 0
.../org/freeplane/core/ui/IFreeplaneAction.java | 0
.../org/freeplane/core/ui/IKeyStrokeProcessor.java | 17 +
.../core/ui/IMenuItemEnabledListener.java | 0
.../org/freeplane/core/ui/IMouseListener.java | 0
.../freeplane/core/ui/IMouseWheelEventHandler.java | 0
.../core/ui/IUserInputListenerFactory.java | 85 +
.../java/org/freeplane/core/ui/IndexedTree.java | 263 +
.../freeplane/core/ui/KeyAlreadyUsedException.java | 0
.../freeplane/core/ui/LabelAndMnemonicSetter.java | 53 +
.../java/org/freeplane/core/ui/LengthUnits.java | 45 +
.../java/org/freeplane/core/ui/MenuSplitter.java | 140 +
.../core/ui/MenuSplitterConfiguration.java | 9 +
.../org/freeplane/core/ui/MouseInsideListener.java | 80 +
.../org/freeplane/core/ui/SelectableAction.java | 0
.../core/ui/SetAcceleratorOnNextClickAction.java | 0
.../core/ui/ShowSelectionAsRectangleAction.java | 0
.../org/freeplane/core/ui/TimePeriodUnits.java | 39 +
.../main/java/org/freeplane/core/ui/UIBuilder.java | 205 +
.../ui/components/ActionToggleButtonModel.java | 50 +
.../org/freeplane/core/ui/components/AutoHide.java | 0
.../core/ui/components/BitmapImagePreview.java | 105 +
.../freeplane/core/ui/components/BlindIcon.java | 0
.../ui/components/ContainerComboBoxEditor.java | 133 +
.../core/ui/components/EnterPasswordDialog.java | 0
.../freeplane/core/ui/components/FButtonBar.java | 365 +
.../core/ui/components/FreeplaneMenuBar.java | 100 +
.../core/ui/components/FreeplaneToolBar.java | 0
.../core/ui/components/IKeyBindingManager.java | 0
.../ui/components/IconSelectionPopupDialog.java | 360 +
.../core/ui/components/JAutoCheckBoxMenuItem.java | 74 +
.../ui/components/JAutoRadioButtonMenuItem.java | 75 +
.../core/ui/components/JAutoScrollBarPane.java | 0
.../core/ui/components/JAutoToggleButton.java | 0
.../core/ui/components/JComboBoxWithBorder.java | 78 +
.../core/ui/components/JFreeplaneMenuItem.java | 0
.../org/freeplane/core/ui/components/JResizer.java | 220 +
.../ui/components/JRestrictedSizeScrollPane.java | 0
.../core/ui/components/MultipleImage.java | 106 +
.../core/ui/components/ObjectAndIcon.java | 0
.../ui/components/OneTouchCollapseResizer.java | 462 +
.../components/OptionalDontShowMeAgainDialog.java | 230 +
.../ui/components/PersistentEditableComboBox.java | 0
...PropertyChangeListenerWithSelectionSupport.java | 33 +
.../freeplane/core/ui/components/ResizeEvent.java | 23 +
.../core/ui/components/ResizerListener.java | 0
.../core/ui/components/ToolbarLayout.java | 0
.../core/ui/components/TypedListCellRenderer.java | 0
.../org/freeplane/core/ui/components/UITools.java | 668 +
.../core/ui/components/calendar/JCalendar.java | 0
.../core/ui/components/calendar/JDayChooser.java | 0
.../core/ui/components/calendar/JMonthChooser.java | 376 +
.../core/ui/components/calendar/JSpinField.java | 0
.../core/ui/components/calendar/JTimeChooser.java | 0
.../ui/components/calendar/JTripleCalendar.java | 0
.../core/ui/components/calendar/JYearChooser.java | 0
.../ui/components/calendar/jcalendar-license.txt | 0
.../core/ui/components/html/CssRuleBuilder.java | 87 +
.../core/ui/components/html/ScaledEditorKit.java | 103 +
.../core/ui/components/html/ScaledHTML.java | 213 +
.../core/ui/components/html/ScaledStyleSheet.java | 61 +
.../html/SynchronousScaledEditorKit.java | 37 +
.../ui/menubuilders/FreeplaneResourceAccessor.java | 39 +
.../ui/menubuilders/XmlEntryStructureBuilder.java | 111 +
.../action/AcceleratebleActionProvider.java | 23 +
.../ui/menubuilders/action/AcceleratorBuilder.java | 37 +
.../menubuilders/action/AcceleratorDestroyer.java | 28 +
.../core/ui/menubuilders/action/ActionFinder.java | 68 +
.../menubuilders/action/ActionSelectListener.java | 19 +
.../ui/menubuilders/action/ComponentBuilder.java | 24 +
.../ui/menubuilders/action/EntriesForAction.java | 39 +
.../ui/menubuilders/action/IAcceleratorMap.java | 16 +
.../ui/menubuilders/action/IEntriesForAction.java | 10 +
.../generic/AttributeAlreadySetException.java | 10 +
.../menubuilders/generic/BuildPhaseListener.java | 8 +
.../menubuilders/generic/BuildProcessFactory.java | 9 +
.../menubuilders/generic/BuilderDestroyerPair.java | 22 +
.../generic/ChildActionEntryRemover.java | 28 +
.../ui/menubuilders/generic/ChildEntryFilter.java | 18 +
.../ui/menubuilders/generic/ChildEntryRemover.java | 14 +
.../ui/menubuilders/generic/EmptyEntryVisitor.java | 12 +
.../core/ui/menubuilders/generic/Entry.java | 253 +
.../ui/menubuilders/generic/EntryAccessor.java | 151 +
.../ui/menubuilders/generic/EntryNavigator.java | 34 +
.../generic/EntryNavigatorFactory.java | 33 +
.../menubuilders/generic/EntryPopupListener.java | 10 +
.../generic/EntryPopupListenerCollection.java | 33 +
.../core/ui/menubuilders/generic/EntryVisitor.java | 12 +
.../menubuilders/generic/IllegalEntryVisitor.java | 13 +
.../menubuilders/generic/NullResourceAccessor.java | 35 +
.../ui/menubuilders/generic/PhaseProcessor.java | 70 +
.../generic/RecursiveMenuStructureProcessor.java | 190 +
.../ui/menubuilders/generic/ResourceAccessor.java | 19 +
.../menubuilders/generic/SkippingEntryVisitor.java | 12 +
.../ui/menubuilders/generic/SubtreeProcessor.java | 57 +
.../ui/menubuilders/menu/ComponentProvider.java | 9 +
.../ui/menubuilders/menu/EmptyMenuItemBuilder.java | 45 +
.../ui/menubuilders/menu/JComponentRemover.java | 42 +
.../ui/menubuilders/menu/JMenuItemBuilder.java | 106 +
.../menubuilders/menu/JMenuRadioGroupBuilder.java | 41 +
.../core/ui/menubuilders/menu/JMenubarBuilder.java | 43 +
.../core/ui/menubuilders/menu/JToolbarBuilder.java | 26 +
.../menu/JToolbarComponentBuilder.java | 53 +
.../menu/MenuAcceleratorChangeListener.java | 30 +
.../menu/MenuActionComponentProvider.java | 57 +
.../menubuilders/menu/MenuBuildProcessFactory.java | 114 +
.../menu/MenuRadioActionComponentProvider.java | 74 +
.../core/ui/menubuilders/menu/PopupBuilder.java | 31 +
.../menu/PopupMenuListenerForEntry.java | 54 +
.../menu/ToolbarComponentProvider.java | 41 +
.../org/freeplane/core/undo/CompoundActor.java | 79 +
.../java}/org/freeplane/core/undo/IActor.java | 0
.../org/freeplane/core/undo/IUndoHandler.java | 0
.../org/freeplane/core/undo/SelectionActor.java | 89 +
.../java/org/freeplane/core/undo/UndoHandler.java | 340 +
.../java/org/freeplane/core/util/ActionUtils.java | 38 +
.../freeplane/core/util/ClassLoaderFactory.java | 48 +
.../java/org/freeplane/core/util/ColorUtils.java | 97 +
.../main/java/org/freeplane/core/util/Compat.java | 238 +
.../freeplane/core/util/ConfigurationUtils.java | 52 +
.../org/freeplane/core/util/ConstantObject.java | 32 +
.../java/org/freeplane/core/util/Convertible.java | 5 +
.../org/freeplane/core/util/DelayedRunner.java | 25 +
.../org/freeplane/core/util/FactoryMethod.java | 0
.../java/org/freeplane/core/util/FileUtils.java | 349 +
.../org/freeplane/core/util/FixedHTMLWriter.java | 0
.../freeplane/core/util/FreeplaneIconUtils.java | 0
.../org/freeplane/core/util/FreeplaneVersion.java | 227 +
.../org/freeplane/core/util/HtmlProcessor.java | 40 +
.../java/org/freeplane/core/util/HtmlUtils.java | 785 +
.../java}/org/freeplane/core/util/LogUtils.java | 0
.../freeplane/core/util/LoggingOutputStream.java | 0
.../java/org/freeplane/core/util/MenuUtils.java | 324 +
.../java/org/freeplane/core/util/ObjectRule.java | 9 +
.../main/java/org/freeplane/core/util/Pair.java | 52 +
.../java/org/freeplane/core/util/Quantity.java | 90 +
.../org/freeplane/core/util/RuleReference.java | 37 +
.../freeplane/core/util/SerializationMethod.java | 0
.../org/freeplane/core/util/StdFormatter.java | 0
.../java}/org/freeplane/core/util/SysUtils.java | 0
.../java/org/freeplane/core/util/TextUtils.java | 175 +
.../org/freeplane/core/util/TypeReference.java | 116 +
.../java}/org/freeplane/core/util/XHTMLWriter.java | 0
.../java}/org/freeplane/core/util/XmlUtils.java | 0
.../freeplane/core/util/XsltPipeReaderFactory.java | 94 +
.../core/util/collection/DoubleListModel.java | 82 +
.../util/collection/ExtendedComboBoxModel.java | 0
.../freeplane/core/util/collection/IListModel.java | 0
.../core/util/collection/MultipleValueMap.java | 0
.../core/util/collection/SortedComboBoxModel.java | 0
.../core/util/collection/SortedMapVector.java | 0
.../freeplane/features/attribute/Attribute.java | 0
.../features/attribute/AttributeBuilder.java | 337 +
.../attribute/AttributeCompareCondition.java | 128 +
.../attribute/AttributeConditionController.java | 200 +
.../attribute/AttributeContainsCondition.java | 122 +
.../features/attribute/AttributeController.java | 250 +
.../attribute/AttributeExistsCondition.java | 84 +
.../attribute/AttributeMatchesCondition.java | 118 +
.../attribute/AttributeNotExistsCondition.java | 82 +
.../features/attribute/AttributeRegistry.java | 419 +
.../AttributeRegistryComboBoxColumnModel.java | 0
.../attribute/AttributeRegistryElement.java | 0
.../attribute/AttributeRegistryTableModel.java | 0
.../attribute/AttributeTableLayoutModel.java | 87 +
.../attribute/AttributeViewTypeAction.java | 0
.../features/attribute/ColumnWidthChangeEvent.java | 0
.../features/attribute/FontSizeExtension.java | 13 +
.../attribute/HideAllAttributesAction.java | 0
.../features/attribute/IAttributeTableModel.java | 37 +
.../features/attribute/IAttributesListener.java | 0
.../attribute/IColumnWidthChangeListener.java | 0
.../attribute/ModelessAttributeController.java | 0
.../attribute/NodeAttributeTableModel.java | 269 +
.../attribute/ShowAllAttributesAction.java | 0
.../attribute/ShowSelectedAttributesAction.java | 0
.../attribute/mindmapmode/AddAttributeAction.java | 183 +
.../mindmapmode/AssignAttributeDialog.java | 509 +
.../mindmapmode/AssignAttributesAction.java | 48 +
.../mindmapmode/AttributeManagerDialog.java | 267 +
.../mindmapmode/AttributeRegistryTable.java | 0
.../attribute/mindmapmode/AttributeUtilities.java | 0
.../attribute/mindmapmode/CopyAttributes.java | 169 +
.../mindmapmode/ImportAttributesDialog.java | 360 +
.../features/attribute/mindmapmode/ListDialog.java | 339 +
.../mindmapmode/MAttributeController.java | 844 +
.../mindmapmode/RemoveAllAttributesAction.java | 0
.../mindmapmode/RemoveFirstAttributeAction.java | 0
.../mindmapmode/RemoveLastAttributeAction.java | 0
.../mindmapmode/ShowAttributeDialogAction.java | 60 +
.../features/clipboard/ClipboardController.java | 457 +
.../freeplane/features/clipboard/CopyAction.java | 0
.../freeplane/features/clipboard/CopyIDAction.java | 0
.../features/clipboard/CopyNodeURIAction.java | 0
.../features/clipboard/CopySingleAction.java | 0
.../features/clipboard/HtmlSelection.java | 60 +
.../features/clipboard/MindMapHTMLWriter.java | 421 +
.../features/clipboard/MindMapNodesSelection.java | 143 +
.../features/clipboard/SingleCopySource.java | 366 +
.../clipboard/mindmapmode/CloneAction.java | 45 +
.../features/clipboard/mindmapmode/CutAction.java | 0
.../mindmapmode/MClipboardController.java | 882 +
.../features/clipboard/mindmapmode/MoveAction.java | 45 +
.../clipboard/mindmapmode/PasteAction.java | 0
.../clipboard/mindmapmode/SelectedPasteAction.java | 0
.../org/freeplane/features/cloud/CloudBuilder.java | 156 +
.../freeplane/features/cloud/CloudController.java | 0
.../org/freeplane/features/cloud/CloudModel.java | 0
.../features/cloud/mindmapmode/CloudAction.java | 0
.../cloud/mindmapmode/CloudColorAction.java | 0
.../cloud/mindmapmode/CloudShapeAction.java | 0
.../cloud/mindmapmode/MCloudController.java | 0
.../features/edge/AutomaticEdgeColor.java | 31 +
.../features/edge/AutomaticEdgeColorHook.java | 157 +
.../org/freeplane/features/edge/EdgeBuilder.java | 175 +
.../freeplane/features/edge/EdgeController.java | 277 +
.../org/freeplane/features/edge/EdgeModel.java | 0
.../org/freeplane/features/edge/EdgeStyle.java | 0
.../features/edge/mindmapmode/EdgeColorAction.java | 0
.../features/edge/mindmapmode/EdgeStyleAction.java | 0
.../edge/mindmapmode/EdgeStyleAsParentAction.java | 0
.../features/edge/mindmapmode/EdgeWidthAction.java | 0
.../features/edge/mindmapmode/MEdgeController.java | 295 +
.../freeplane/features/encrypt/Base64Coding.java | 0
.../freeplane/features/encrypt/DesEncrypter.java | 0
.../features/encrypt/EncryptionController.java | 168 +
.../freeplane/features/encrypt/EnterPassword.java | 0
.../features/encrypt/PasswordStrategy.java | 0
.../features/encrypt/SingleDesEncrypter.java | 0
.../features/encrypt/SwingPasswordStrategy.java | 43 +
.../features/encrypt/TripleDesEncrypter.java | 0
.../features/encrypt/mindmapmode/EncryptedMap.java | 81 +
.../encrypt/mindmapmode/MEncryptionController.java | 0
.../encrypt/mindmapmode/RemoveEncryption.java | 0
.../features/export/mindmapmode/ExportAction.java | 56 +
.../mindmapmode/ExportBranchToHTMLAction.java | 0
.../export/mindmapmode/ExportController.java | 0
.../features/export/mindmapmode/ExportDialog.java | 188 +
.../export/mindmapmode/ExportToHTMLAction.java | 0
.../features/export/mindmapmode/ExportToImage.java | 0
.../export/mindmapmode/ExportToOoWriter.java | 133 +
.../export/mindmapmode/ExportWithXSLT.java | 326 +
.../features/export/mindmapmode/IExportEngine.java | 0
.../features/export/mindmapmode/ImageCreator.java | 0
.../export/mindmapmode/ImportMindmanagerFiles.java | 93 +
.../features/export/mindmapmode/ImportXmlFile.java | 73 +
.../features/export/mindmapmode/XmlImporter.java | 83 +
.../export/mindmapmode/XsltExportEngine.java | 0
.../mindmapmode/XsltExportEngineFactory.java | 0
.../features/filter/AFilterComposerDialog.java | 661 +
.../features/filter/ApplyNamedFilterAction.java | 0
.../features/filter/ApplyNoFilteringAction.java | 0
.../filter/ApplySelectedViewConditionAction.java | 0
.../features/filter/ApplyToVisibleAction.java | 0
.../features/filter/DamerauLevenshtein.java | 0
.../filter/EditDistanceStringMatchingStrategy.java | 0
.../features/filter/EditFilterAction.java | 108 +
.../filter/ExactStringMatchingStrategy.java | 0
.../java/org/freeplane/features/filter/Filter.java | 240 +
.../features/filter/FilterConditionEditor.java | 341 +
.../features/filter/FilterController.java | 657 +
.../freeplane/features/filter/FilterHistory.java | 0
.../org/freeplane/features/filter/FilterInfo.java | 0
.../features/filter/FilterMenuBuilder.java | 69 +
.../org/freeplane/features/filter/FindAction.java | 191 +
.../org/freeplane/features/filter/FoundNodes.java | 60 +
.../freeplane/features/filter/NextNodeAction.java | 0
.../filter/NextPresentationItemAction.java | 45 +
.../features/filter/PseudoDamerauLevenshtein.java | 0
.../features/filter/QuickFilterAction.java | 66 +
.../freeplane/features/filter/QuickFindAction.java | 99 +
.../features/filter/QuickFindAllAction.java | 0
.../features/filter/QuickHighlightAction.java | 0
.../features/filter/ReapplyFilterAction.java | 0
.../features/filter/RedoFilterAction.java | 0
.../features/filter/ShowAncestorsAction.java | 0
.../features/filter/ShowDescendantsAction.java | 0
.../features/filter/StringMatchingStrategy.java | 43 +
.../features/filter/UndoFilterAction.java | 0
.../filter/condition/ASelectableCondition.java | 132 +
.../filter/condition/CompareConditionAdapter.java | 214 +
.../filter/condition/ConditionFactory.java | 134 +
.../condition/ConditionNotSatisfiedDecorator.java | 0
.../filter/condition/ConditionSnapshotFactory.java | 30 +
.../filter/condition/ConjunctConditions.java | 0
.../filter/condition/DefaultConditionRenderer.java | 0
.../filter/condition/DisjunctConditions.java | 0
.../filter/condition/ICombinedCondition.java | 0
.../features/filter/condition/ICondition.java | 0
.../condition/IElementaryConditionController.java | 60 +
.../features/filter/condition/JCondition.java | 0
.../filter/condition/NoFilteringCondition.java | 0
.../filter/condition/SelectedViewCondition.java | 65 +
.../condition/SelectedViewSnapshotCondition.java | 58 +
.../features/format/DateFormatParser.java | 0
.../features/format/DatePatternFormat.java | 0
.../features/format/DecimalFormatParser.java | 0
.../features/format/DecimalPatternFormat.java | 0
.../features/format/FormatController.java | 0
.../org/freeplane/features/format/FormatUtils.java | 0
.../freeplane/features/format/FormattedDate.java | 0
.../features/format/FormattedFormula.java | 0
.../freeplane/features/format/FormattedNumber.java | 0
.../freeplane/features/format/FormattedObject.java | 0
.../features/format/FormatterPatternFormat.java | 0
.../features/format/IFormattedObject.java | 0
.../features/format/IdentityPatternFormat.java | 30 +
.../freeplane/features/format/IsoDateParser.java | 0
.../features/format/NumberLiteralParser.java | 0
.../org/freeplane/features/format/Parser.java | 0
.../freeplane/features/format/PatternFormat.java | 0
.../org/freeplane/features/format/Scanner.java | 0
.../features/format/ScannerController.java | 0
.../features/format/StandardPatternFormat.java | 26 +
.../org/freeplane/features/help/AboutAction.java | 87 +
.../features/help/DocumentationAction.java | 51 +
.../features/help/FilePropertiesAction.java | 351 +
.../freeplane/features/help/HelpController.java | 70 +
.../freeplane/features/help/HotKeyInfoAction.java | 136 +
.../features/help/OnlineDocumentationAction.java | 77 +
.../features/help/OpenSourceForgeURLAction.java | 0
.../org/freeplane/features/help/OpenURLAction.java | 0
.../freeplane/features/icon/AccumulatedIcons.java | 0
.../freeplane/features/icon/HierarchicalIcons.java | 213 +
.../freeplane/features/icon/IIconInformation.java | 35 +
.../features/icon/IStateIconProvider.java | 0
.../org/freeplane/features/icon/IconBuilder.java | 99 +
.../freeplane/features/icon/IconClickedEvent.java | 21 +
.../features/icon/IconConditionController.java | 128 +
.../features/icon/IconContainedCondition.java | 0
.../freeplane/features/icon/IconController.java | 153 +
.../features/icon/IconExistsCondition.java | 0
.../org/freeplane/features/icon/IconGroup.java | 0
.../freeplane/features/icon/IconMouseListener.java | 5 +
.../org/freeplane/features/icon/IconNotFound.java | 42 +
.../org/freeplane/features/icon/IconRegistry.java | 77 +
.../org/freeplane/features/icon/IconStore.java | 146 +
.../org/freeplane/features/icon/MindIcon.java | 0
.../features/icon/PriorityCompareCondition.java | 0
.../features/icon/PriorityConditionController.java | 135 +
.../java/org/freeplane/features/icon/UIIcon.java | 188 +
.../org/freeplane/features/icon/UIIconSet.java | 94 +
.../java/org/freeplane/features/icon/UserIcon.java | 72 +
.../org/freeplane/features/icon/ZoomedIcon.java | 90 +
.../features/icon/factory/IconStoreFactory.java | 155 +
.../features/icon/factory/ImageIconFactory.java | 0
.../features/icon/factory/MindIconFactory.java | 38 +
.../features/icon/mindmapmode/IconAction.java | 79 +
.../icon/mindmapmode/IconSelectionPlugin.java | 84 +
.../features/icon/mindmapmode/MIconController.java | 432 +
.../icon/mindmapmode/RemoveAllIconsAction.java | 73 +
.../icon/mindmapmode/RemoveIconAction.java | 76 +
.../org/freeplane/features/link/ArrowType.java | 0
.../features/link/ConnectorExistsCondition.java | 0
.../features/link/ConnectorLabelCondition.java | 115 +
.../link/ConnectorLabelContainsCondition.java | 0
.../link/ConnectorLabelEqualsCondition.java | 0
.../freeplane/features/link/ConnectorModel.java | 228 +
.../features/link/ConnectorProperties.java | 221 +
.../features/link/EvaluationDependencies.java | 0
.../freeplane/features/link/FollowLinkAction.java | 61 +
.../features/link/GotoLinkNodeAction.java | 76 +
.../features/link/HyperLinkCondition.java | 0
.../features/link/HyperLinkContainsCondition.java | 74 +
.../features/link/HyperLinkEqualsCondition.java | 75 +
.../features/link/HyperLinkExistsCondition.java | 0
.../features/link/HyperTextLinkModel.java | 80 +
.../org/freeplane/features/link/LinkBuilder.java | 363 +
.../features/link/LinkConditionController.java | 199 +
.../freeplane/features/link/LinkController.java | 970 +
.../freeplane/features/link/LinkTransformer.java | 76 +
.../java/org/freeplane/features/link/MapLinks.java | 86 +
.../org/freeplane/features/link/NodeLinkModel.java | 78 +
.../org/freeplane/features/link/NodeLinks.java | 234 +
.../features/link/NodeUpdateChangeListener.java | 68 +
.../link/mindmapmode/AddConnectorAction.java | 0
.../link/mindmapmode/AddExecutionLinkAction.java | 59 +
.../link/mindmapmode/AddLocalLinkAction.java | 0
.../link/mindmapmode/AddMenuItemLinkAction.java | 0
.../mindmapmode/ChangeConnectorArrowsAction.java | 0
.../mindmapmode/ChangeConnectorDashAction.java | 0
.../mindmapmode/ChangeConnectorShapeAction.java | 0
.../link/mindmapmode/ClearLinkAnchorAction.java | 55 +
.../link/mindmapmode/ConnectorColorAction.java | 0
.../mindmapmode/ExtractLinkFromTextAction.java | 0
.../features/link/mindmapmode/MLinkController.java | 1158 +
.../link/mindmapmode/MakeLinkFromAnchorAction.java | 136 +
.../link/mindmapmode/MakeLinkToAnchorAction.java | 58 +
.../link/mindmapmode/RemoveConnectorAction.java | 0
.../link/mindmapmode/SelectMenuItemDialog.java | 193 +
.../link/mindmapmode/SetLinkAnchorAction.java | 0
.../mindmapmode/SetLinkByFileChooserAction.java | 0
.../link/mindmapmode/SetLinkByTextFieldAction.java | 92 +
.../features/map/AMapChangeListenerAdapter.java | 33 +
.../freeplane/features/map/AlwaysUnfoldedNode.java | 54 +
.../features/map/CloneConditionController.java | 117 +
.../features/map/CloneEncryptedNodeException.java | 10 +
.../features/map/CloneOfSelectedViewCondition.java | 71 +
.../map/CloneOfSelectedViewSnapshotCondition.java | 65 +
.../java/org/freeplane/features/map/Cloner.java | 55 +
.../java/org/freeplane/features/map/Clones.java | 39 +
.../freeplane/features/map/DetachedNodeList.java | 100 +
.../freeplane/features/map/EncryptionModel.java | 190 +
.../org/freeplane/features/map/FirstGroupNode.java | 49 +
.../freeplane/features/map/FirstGroupNodeFlag.java | 8 +
.../freeplane/features/map/FoldingController.java | 337 +
.../java/org/freeplane/features/map/FreeNode.java | 68 +
.../org/freeplane/features/map/GotoNodeAction.java | 0
.../freeplane/features/map/HideChildSubtree.java | 0
.../features/map/HistoryInformationModel.java | 0
.../org/freeplane/features/map/IEncrypter.java | 0
.../freeplane/features/map/IExtensionCopier.java | 12 +
.../freeplane/features/map/IMapChangeListener.java | 37 +
.../features/map/IMapLifeCycleListener.java | 0
.../org/freeplane/features/map/IMapSelection.java | 66 +
.../features/map/IMapSelectionListener.java | 0
.../features/map/INodeChangeListener.java | 0
.../features/map/INodeSelectionListener.java | 0
.../org/freeplane/features/map/INodeView.java | 0
.../freeplane/features/map/ITooltipProvider.java | 0
.../org/freeplane/features/map/LeafCondition.java | 0
.../org/freeplane/features/map/MapChangeEvent.java | 0
.../org/freeplane/features/map/MapController.java | 1023 +
.../java/org/freeplane/features/map/MapModel.java | 299 +
.../freeplane/features/map/MapNavigationUtils.java | 0
.../java/org/freeplane/features/map/MapReader.java | 191 +
.../java/org/freeplane/features/map/MapWriter.java | 143 +
.../freeplane/features/map/MultipleNodeList.java | 91 +
.../freeplane/features/map/NodeAbsolutePath.java | 54 +
.../org/freeplane/features/map/NodeBuilder.java | 267 +
.../freeplane/features/map/NodeChangeEvent.java | 65 +
.../freeplane/features/map/NodeDeletionEvent.java | 14 +
.../freeplane/features/map/NodeIconSetModel.java | 0
.../features/map/NodeLevelCompareCondition.java | 0
.../features/map/NodeLevelConditionController.java | 185 +
.../java/org/freeplane/features/map/NodeModel.java | 722 +
.../org/freeplane/features/map/NodeMoveEvent.java | 23 +
.../freeplane/features/map/NodeRelativePath.java | 120 +
.../org/freeplane/features/map/NodeWriter.java | 202 +
.../features/map/NumberComboBoxEditor.java | 0
.../features/map/PeriodicLevelCondition.java | 0
.../org/freeplane/features/map/RootCondition.java | 0
.../org/freeplane/features/map/SharedNodeData.java | 104 +
.../features/map/ShowNextChildAction.java | 60 +
.../org/freeplane/features/map/SingleNodeList.java | 83 +
.../org/freeplane/features/map/SummaryLevels.java | 132 +
.../org/freeplane/features/map/SummaryNode.java | 109 +
.../freeplane/features/map/SummaryNodeFlag.java | 8 +
.../features/map/ToggleChildrenFoldedAction.java | 0
.../freeplane/features/map/ToggleFoldedAction.java | 52 +
.../features/map/filemode/CenterAction.java | 0
.../features/map/filemode/FMapController.java | 0
.../freeplane/features/map/filemode/FMapModel.java | 0
.../features/map/filemode/FNodeModel.java | 0
.../features/map/filemode/OpenPathAction.java | 0
.../map/mindmapmode/ChangeNodeLevelController.java | 187 +
.../ConvertCloneToIndependentNodeAction.java | 38 +
.../features/map/mindmapmode/DeleteAction.java | 60 +
.../features/map/mindmapmode/DocuMapAttribute.java | 0
.../features/map/mindmapmode/MMapController.java | 1073 +
.../features/map/mindmapmode/MMapModel.java | 137 +
.../features/map/mindmapmode/NewChildAction.java | 0
.../map/mindmapmode/NewFreeNodeAction.java | 0
.../features/map/mindmapmode/NewMapViewAction.java | 0
.../features/map/mindmapmode/NewParentNode.java | 118 +
.../map/mindmapmode/NewPreviousSiblingAction.java | 0
.../features/map/mindmapmode/NewSiblingAction.java | 0
.../features/map/mindmapmode/NewSummaryAction.java | 121 +
.../features/map/mindmapmode/NodeDownAction.java | 43 +
.../features/map/mindmapmode/NodeUpAction.java | 43 +
.../RemoveAllAlwaysUnfoldedNodeFlagsAction.java | 35 +
.../SetAlwaysUnfoldedNodeFlagsAction.java | 35 +
.../map/mindmapmode/SummaryGroupEdgeListAdder.java | 95 +
.../map/mindmapmode/SummaryNodeMapUpdater.java | 74 +
.../java}/org/freeplane/features/mapio/MapIO.java | 0
.../features/mapio/mindmapmode/MMapIO.java | 121 +
.../org/freeplane/features/mode/AController.java | 97 +
.../features/mode/CenterSelectedNodeAction.java | 0
.../features/mode/CombinedPropertyChain.java | 0
.../org/freeplane/features/mode/Controller.java | 292 +
.../features/mode/ExclusivePropertyChain.java | 0
.../freeplane/features/mode/FreeplaneActions.java | 11 +
.../features/mode/IControllerExecuteExtension.java | 0
.../freeplane/features/mode/IPropertyHandler.java | 0
.../freeplane/features/mode/ModeController.java | 449 +
.../freeplane/features/mode/MoveToRootAction.java | 51 +
.../features/mode/NodeHookDescriptor.java | 0
.../features/mode/PersistentNodeHook.java | 469 +
.../org/freeplane/features/mode/QuitAction.java | 0
.../features/mode/SelectionController.java | 71 +
.../features/mode/browsemode/BModeController.java | 0
.../features/mode/filemode/FModeController.java | 0
.../mindmapmode/LoadAcceleratorPresetsAction.java | 146 +
.../features/mode/mindmapmode/MModeController.java | 234 +
.../features/mode/mindmapmode/RedoAction.java | 67 +
.../mindmapmode/SaveAcceleratorPresetsAction.java | 77 +
.../features/mode/mindmapmode/SelectAllAction.java | 0
.../mode/mindmapmode/SelectBranchAction.java | 0
.../features/mode/mindmapmode/UndoAction.java | 102 +
.../features/nodelocation/LocationBuilder.java | 87 +
.../features/nodelocation/LocationController.java | 123 +
.../features/nodelocation/LocationModel.java | 114 +
.../mindmapmode/ChangeShiftXActor.java | 62 +
.../mindmapmode/ChangeShiftYActor.java | 62 +
.../nodelocation/mindmapmode/ChangeVGapActor.java | 61 +
.../mindmapmode/MLocationController.java | 116 +
.../mindmapmode/ResetNodeLocationAction.java | 50 +
.../features/nodestyle/NodeSizeModel.java | 88 +
.../features/nodestyle/NodeStyleBuilder.java | 409 +
.../features/nodestyle/NodeStyleController.java | 445 +
.../features/nodestyle/NodeStyleModel.java | 321 +
.../nodestyle/ShapeConfigurationModel.java | 88 +
.../nodestyle/filemode/FNodeStyleController.java | 0
.../features/nodestyle/mindmapmode/BoldAction.java | 0
.../features/nodestyle/mindmapmode/CopyFormat.java | 104 +
.../nodestyle/mindmapmode/FontFamilyAction.java | 0
.../nodestyle/mindmapmode/FontSizeAction.java | 0
.../nodestyle/mindmapmode/ItalicAction.java | 0
.../mindmapmode/MNodeStyleController.java | 668 +
.../mindmapmode/NodeBackgroundColorAction.java | 0
.../nodestyle/mindmapmode/NodeColorAction.java | 0
.../mindmapmode/NodeColorBlendAction.java | 0
.../nodestyle/mindmapmode/NodeShapeAction.java | 45 +
.../nodestyle/mindmapmode/RemoveFormatAction.java | 0
.../nodestyle/mindmapmode/RevisionPlugin.java | 0
.../nodestyle/mindmapmode/TextAlignAction.java | 67 +
.../org/freeplane/features/note/NoteBuilder.java | 0
.../freeplane/features/note/NoteController.java | 179 +
.../org/freeplane/features/note/NoteModel.java | 0
.../org/freeplane/features/note/NoteWriter.java | 72 +
.../note/mindmapmode/EditNoteInDialogAction.java | 51 +
.../features/note/mindmapmode/MNoteController.java | 359 +
.../note/mindmapmode/NoteDialogStarter.java | 73 +
.../features/note/mindmapmode/NoteManager.java | 131 +
.../note/mindmapmode/RemoveNoteAction.java | 0
.../note/mindmapmode/SelectNoteAction.java | 0
.../note/mindmapmode/SetNoteWindowPosition.java | 38 +
.../note/mindmapmode/ShowHideNoteAction.java | 0
.../features/print/AbstractPrintAction.java | 0
.../org/freeplane/features/print/BrowseAction.java | 0
.../java/org/freeplane/features/print/FitMap.java | 34 +
.../org/freeplane/features/print/PageAction.java | 199 +
.../java/org/freeplane/features/print/Preview.java | 125 +
.../freeplane/features/print/PreviewDialog.java | 0
.../org/freeplane/features/print/PrintAction.java | 0
.../freeplane/features/print/PrintController.java | 0
.../features/print/PrintDirectAction.java | 0
.../features/print/PrintPreviewAction.java | 0
.../org/freeplane/features/print/ZoomAction.java | 0
.../features/script/IScriptEditorStarter.java | 35 +
.../freeplane/features/script/IScriptStarter.java | 0
.../mindmapmode/SpellCheckerController.java | 0
.../freeplane/features/styles/AutomaticLayout.java | 12 +
.../features/styles/AutomaticLayoutController.java | 133 +
.../features/styles/ConditionalStyleModel.java | 277 +
.../org/freeplane/features/styles/IStyle.java | 0
.../features/styles/LogicalStyleController.java | 393 +
.../styles/LogicalStyleFilterController.java | 97 +
.../features/styles/LogicalStyleKeys.java | 0
.../features/styles/LogicalStyleModel.java | 0
.../org/freeplane/features/styles/MapStyle.java | 557 +
.../freeplane/features/styles/MapStyleModel.java | 343 +
.../freeplane/features/styles/MapViewLayout.java | 0
.../styles/SetBooleanMapPropertyAction.java | 82 +
.../freeplane/features/styles/StyleCondition.java | 51 +
.../features/styles/StyleContainsCondition.java | 55 +
.../freeplane/features/styles/StyleFactory.java | 13 +
.../freeplane/features/styles/StyleMapModel.java | 39 +
.../org/freeplane/features/styles/StyleNode.java | 0
.../org/freeplane/features/styles/StyleString.java | 0
.../features/styles/StyleTranslatedObject.java | 56 +
.../AManageConditionalStylesAction.java | 145 +
.../styles/mindmapmode/AssignStyleAction.java | 83 +
.../mindmapmode/ComboBoxRendererWithTooltip.java | 67 +
.../styles/mindmapmode/ConditionalStyleTable.java | 127 +
.../styles/mindmapmode/CopyMapStylesAction.java | 0
.../mindmapmode/CopyStyleExtensionsAction.java | 0
.../styles/mindmapmode/DefaultStyleRenderer.java | 0
.../mindmapmode/EditablePatternComboProperty.java | 0
.../styles/mindmapmode/FilterComposerDialog.java | 0
.../mindmapmode/MLogicalStyleController.java | 545 +
.../features/styles/mindmapmode/MUIFactory.java | 256 +
.../ManageMapConditionalStylesAction.java | 0
.../ManageNodeConditionalStylesAction.java | 94 +
.../mindmapmode/MapBackgroundColorAction.java | 69 +
.../styles/mindmapmode/NewUserStyleAction.java | 117 +
.../styles/mindmapmode/PatternProperty.java | 0
.../styles/mindmapmode/RedefineStyleAction.java | 0
.../styles/mindmapmode/ShowFormatPanelAction.java | 0
.../styles/mindmapmode/StyleEditorPanel.java | 1208 +
.../features/text/AbstractContentTransformer.java | 0
.../freeplane/features/text/DetailTextModel.java | 77 +
.../features/text/FormatContentTransformer.java | 100 +
.../text/HighlightedTransformedObject.java | 0
.../features/text/IContentTransformer.java | 0
.../text/MatchCaseNodeContainsCondition.java | 93 +
.../text/MatchCaseNoteContainsCondition.java | 93 +
.../features/text/NodeContainsCondition.java | 94 +
.../features/text/NodeMatchesRegexpCondition.java | 0
.../freeplane/features/text/NodeTextBuilder.java | 262 +
.../features/text/NodeTextCompareCondition.java | 120 +
.../features/text/NodeTextConditionController.java | 225 +
.../features/text/NoteContainsCondition.java | 0
.../org/freeplane/features/text/RichTextModel.java | 45 +
.../features/text/SetShortenerStateAction.java | 73 +
.../features/text/ShortenedTextModel.java | 0
.../freeplane/features/text/TextController.java | 417 +
.../features/text/ToggleDetailsAction.java | 106 +
.../features/text/TransformationException.java | 0
.../mindmapmode/ConditionalContentTransformer.java | 92 +
.../text/mindmapmode/DeleteDetailsAction.java | 67 +
.../features/text/mindmapmode/EditAction.java | 0
.../text/mindmapmode/EditDetailsAction.java | 59 +
.../features/text/mindmapmode/EditLongAction.java | 0
.../features/text/mindmapmode/EditNodeBase.java | 332 +
.../features/text/mindmapmode/EditNodeDialog.java | 342 +
.../features/text/mindmapmode/EditNodeWYSIWYG.java | 321 +
.../features/text/mindmapmode/EventBuffer.java | 149 +
.../FreeplaneToSHTMLPropertyChangeAdapter.java | 0
.../text/mindmapmode/IEditBaseCreator.java | 0
.../text/mindmapmode/IEditorPaneListener.java | 0
.../features/text/mindmapmode/JoinNodesAction.java | 52 +
.../features/text/mindmapmode/MTextController.java | 1041 +
.../text/mindmapmode/SHTMLEditLinkAction.java | 0
.../SHTMLSetLinkByFileChooserAction.java | 0
.../mindmapmode/SetImageByFileChooserAction.java | 0
.../features/text/mindmapmode/SortNodes.java | 76 +
.../features/text/mindmapmode/SplitNode.java | 170 +
.../text/mindmapmode/SplitToWordsAction.java | 162 +
.../text/mindmapmode/UsePlainTextAction.java | 0
.../features/time/CreationModificationPlugin.java | 0
.../features/time/TimeComboBoxEditor.java | 0
.../org/freeplane/features/time/TimeCondition.java | 69 +
.../features/time/TimeConditionController.java | 141 +
.../features/time/TimeConditionCreatedAfter.java | 0
.../features/time/TimeConditionCreatedBefore.java | 0
.../features/time/TimeConditionModifiedAfter.java | 0
.../features/time/TimeConditionModifiedBefore.java | 0
.../freeplane/features/time/TimeController.java | 33 +
.../org/freeplane/features/ui/CloseAction.java | 44 +
.../features/ui/CollapseableBoxBuilder.java | 112 +
.../org/freeplane/features/ui/FrameController.java | 665 +
.../features/ui/IMapViewChangeListener.java | 0
.../org/freeplane/features/ui/IMapViewManager.java | 148 +
.../features/ui/INodeViewLifeCycleListener.java | 0
.../freeplane/features/ui/INodeViewVisitor.java | 0
.../freeplane/features/ui/NodeDragListener.java | 0
.../features/ui/ToggleFullScreenAction.java | 0
.../freeplane/features/ui/ToggleMenubarAction.java | 0
.../features/ui/ToggleScrollbarsAction.java | 0
.../freeplane/features/ui/ToggleToolbarAction.java | 72 +
.../ui/UIComponentVisibilityDispatcher.java | 128 +
.../org/freeplane/features/ui/ViewController.java | 132 +
.../features/url/FreeplaneUriConverter.java | 75 +
.../org/freeplane/features/url/IMapConverter.java | 0
.../features/url/IMapInputStreamConverter.java | 0
.../features/url/MapConversionException.java | 0
.../features/url/MapVersionInterpreter.java | 152 +
.../features/url/NodeAndMapReference.java | 39 +
.../org/freeplane/features/url/UrlManager.java | 530 +
.../features/url/mindmapmode/DoAutomaticSave.java | 120 +
.../url/mindmapmode/DroppedMindMapOpener.java | 23 +
.../features/url/mindmapmode/DummyLockManager.java | 0
.../url/mindmapmode/ExportBranchAction.java | 184 +
.../url/mindmapmode/FileRevisionsDialog.java | 321 +
.../url/mindmapmode/ImportBranchAction.java | 71 +
.../mindmapmode/ImportExplorerFavoritesAction.java | 129 +
.../mindmapmode/ImportFolderStructureAction.java | 99 +
.../url/mindmapmode/ImportLinkedBranchAction.java | 90 +
.../ImportLinkedBranchWithoutRootAction.java | 0
.../features/url/mindmapmode/LockManager.java | 0
.../features/url/mindmapmode/MFileManager.java | 916 +
.../features/url/mindmapmode/NewMapAction.java | 0
.../url/mindmapmode/NewMapFromTemplateAction.java | 0
.../features/url/mindmapmode/OpenAction.java | 48 +
.../features/url/mindmapmode/OpenURLMapAction.java | 0
.../url/mindmapmode/OpenUserDirAction.java | 0
.../features/url/mindmapmode/RevertAction.java | 0
.../features/url/mindmapmode/SaveAction.java | 71 +
.../features/url/mindmapmode/SaveAll.java | 0
.../features/url/mindmapmode/SaveAsAction.java | 44 +
.../org/freeplane/main/addons/AddOnInstaller.java | 0
.../org/freeplane/main/addons/AddOnProperties.java | 507 +
.../freeplane/main/addons/AddOnsController.java | 251 +
.../main/applet/AppletResourceController.java | 0
.../main/applet/AppletViewController.java | 243 +
.../org/freeplane/main/applet/FreeplaneApplet.java | 229 +
.../application/ApplicationLifecycleListener.java | 5 +
.../application/ApplicationResourceController.java | 308 +
.../application/ApplicationViewController.java | 425 +
.../org/freeplane/main/application/Browser.java | 98 +
.../main/application/CommandLineParser.java | 176 +
.../main/application/ConnectedToMenuView.java | 43 +
.../main/application/FreeplaneGUIStarter.java | 434 +
.../freeplane/main/application/FreeplaneMain.java | 51 +
.../main/application/FreeplaneSplashModern.java | 163 +
.../main/application/FreeplaneStarter.java | 51 +
.../main/application/IconColorReplacer.java | 48 +
.../freeplane/main/application/LastOpenedList.java | 500 +
.../main/application/MapViewDockingWindows.java | 511 +
.../main/application/MapViewSerializer.java | 126 +
.../main/application/MenuKeyProcessor.java | 32 +
.../main/application/NavigationNextMapAction.java | 41 +
.../application/NavigationPreviousMapAction.java | 41 +
.../main/application/OpenLastOpenedAction.java | 45 +
.../main/application/SingleInstanceManager.java | 206 +
.../SplitPaneLayoutManagerDecorator.java | 85 +
.../main/application/UserPropertiesUpdater.java | 115 +
.../protocols/freeplaneresource/Handler.java | 226 +
.../main/browsemode/BModeControllerFactory.java | 112 +
.../main/browsemode/BToolbarContributor.java | 104 +
.../main/filemode/FModeControllerFactory.java | 97 +
.../headlessmode/FreeplaneHeadlessStarter.java | 140 +
.../HeadlessMModeControllerFactory.java | 148 +
.../headlessmode/HeadlessMapViewController.java | 287 +
.../main/headlessmode/HeadlessUIController.java | 245 +
.../main/mindmapmode/HttpVersionClient.java | 161 +
.../main/mindmapmode/MModeControllerFactory.java | 363 +
.../main/mindmapmode/UpdateCheckAction.java | 515 +
.../stylemode/DeleteLevelStyleAction.java | 81 +
.../stylemode/DeleteUserStyleAction.java | 82 +
.../mindmapmode/stylemode/DialogController.java | 149 +
.../mindmapmode/stylemode/EditStylesAction.java | 150 +
.../mindmapmode/stylemode/NewLevelStyleAction.java | 76 +
.../mindmapmode/stylemode/NewUserStyleAction.java | 98 +
.../mindmapmode/stylemode/SModeController.java | 131 +
.../stylemode/SModeControllerFactory.java | 227 +
.../java}/org/freeplane/main/osgi/Activator.java | 0
.../org/freeplane/main/osgi/ActivatorImpl.java | 273 +
.../main/osgi/IControllerExtensionProvider.java | 0
.../osgi/IModeControllerExtensionProvider.java | 0
.../freeplane/main/osgi/ResourcesUrlHandler.java | 34 +
.../org/freeplane/n3/nanoxml/CDATAReader.java | 0
.../n3/nanoxml/CdataContentXmlWriter.java | 0
.../org/freeplane/n3/nanoxml/ContentReader.java | 0
.../org/freeplane/n3/nanoxml/IXMLBuilder.java | 0
.../freeplane/n3/nanoxml/IXMLEntityResolver.java | 0
.../java}/org/freeplane/n3/nanoxml/IXMLParser.java | 0
.../java}/org/freeplane/n3/nanoxml/IXMLReader.java | 0
.../org/freeplane/n3/nanoxml/IXMLValidator.java | 0
.../org/freeplane/n3/nanoxml/NonValidator.java | 0
.../java}/org/freeplane/n3/nanoxml/PIReader.java | 0
.../org/freeplane/n3/nanoxml/StdXMLBuilder.java | 282 +
.../org/freeplane/n3/nanoxml/StdXMLParser.java | 0
.../org/freeplane/n3/nanoxml/StdXMLReader.java | 0
.../org/freeplane/n3/nanoxml/ValidatorPlugin.java | 0
.../org/freeplane/n3/nanoxml/XMLAttribute.java | 0
.../java}/org/freeplane/n3/nanoxml/XMLElement.java | 0
.../freeplane/n3/nanoxml/XMLEntityResolver.java | 0
.../org/freeplane/n3/nanoxml/XMLException.java | 0
.../freeplane/n3/nanoxml/XMLParseException.java | 0
.../org/freeplane/n3/nanoxml/XMLParserFactory.java | 0
.../java/org/freeplane/n3/nanoxml/XMLUtil.java | 615 +
.../n3/nanoxml/XMLValidationException.java | 0
.../java/org/freeplane/n3/nanoxml/XMLWriter.java | 280 +
.../view/swing/features/BlinkingNodeHook.java | 197 +
.../freeplane/view/swing/features/FitToPage.java | 0
.../filepreview/AddExternalImageAction.java | 0
.../filepreview/BitmapViewerComponent.java | 357 +
.../features/filepreview/BitmapViewerFactory.java | 99 +
.../filepreview/ChangeExternalImageAction.java | 0
.../filepreview/ExternalImagePopupMenu.java | 0
.../features/filepreview/ExternalResource.java | 87 +
.../swing/features/filepreview/IViewerFactory.java | 37 +
.../features/filepreview/ImageLoadingListener.java | 28 +
.../swing/features/filepreview/ImagePreview.java | 57 +
.../filepreview/MExternalImageDropListener.java | 0
.../filepreview/MapBackgroundClearAction.java | 44 +
.../filepreview/MapBackgroundImageAction.java | 58 +
.../filepreview/RemoveExternalImageAction.java | 0
.../features/filepreview/ScalableComponent.java | 48 +
.../features/filepreview/ViewerController.java | 731 +
.../features/filepreview/ViewerLayoutManager.java | 88 +
.../swing/features/nodehistory/BackAction.java | 0
.../swing/features/nodehistory/ForwardAction.java | 0
.../swing/features/nodehistory/NodeHistory.java | 0
.../swing/features/nodehistory/NodeHolder.java | 110 +
.../mindmapmode/ExtendedProgress10Action.java | 0
.../mindmapmode/ExtendedProgress25Action.java | 0
.../progress/mindmapmode/ProgressDownAction.java | 0
.../progress/mindmapmode/ProgressFactory.java | 0
.../progress/mindmapmode/ProgressIcons.java | 0
.../progress/mindmapmode/ProgressUpAction.java | 0
.../progress/mindmapmode/ProgressUtilities.java | 0
.../progress/mindmapmode/RemoveProgressAction.java | 0
.../features/time/mindmapmode/ClockState.java | 0
.../features/time/mindmapmode/PeriodPanel.java | 80 +
.../features/time/mindmapmode/PeriodUnit.java | 39 +
.../time/mindmapmode/ReminderCondition.java | 0
.../time/mindmapmode/ReminderConditionAfter.java | 0
.../time/mindmapmode/ReminderConditionBefore.java | 0
.../mindmapmode/ReminderConditionController.java | 157 +
.../mindmapmode/ReminderConditionExecuted.java | 0
.../time/mindmapmode/ReminderConditionLater.java | 0
.../time/mindmapmode/ReminderExtension.java | 172 +
.../features/time/mindmapmode/ReminderHook.java | 409 +
.../features/time/mindmapmode/TimeManagement.java | 539 +
.../features/time/mindmapmode/TimerBlinkTask.java | 85 +
.../nodelist/AllMapsNodeListAction.java | 45 +
.../mindmapmode/nodelist/CoreTextAccessor.java | 47 +
.../time/mindmapmode/nodelist/DateRenderer.java | 48 +
.../mindmapmode/nodelist/DetailTextAccessor.java | 49 +
.../nodelist/FlatNodeTableFilterModel.java | 0
.../time/mindmapmode/nodelist/IconsHolder.java | 66 +
.../time/mindmapmode/nodelist/IconsRenderer.java | 57 +
.../time/mindmapmode/nodelist/NodeList.java | 877 +
.../time/mindmapmode/nodelist/NodeListAction.java | 45 +
.../mindmapmode/nodelist/NoteTextAccessor.java | 50 +
.../time/mindmapmode/nodelist/TableSorter.java | 0
.../time/mindmapmode/nodelist/TextAccessor.java | 0
.../time/mindmapmode/nodelist/TextHolder.java | 73 +
.../time/mindmapmode/nodelist/TextRenderer.java | 42 +
.../nodelist/TimeWindowColumnSetting.java | 0
.../nodelist/TimeWindowConfigurationStorage.java | 0
.../org/freeplane/view/swing/map/ArrowIcon.java | 89 +
.../freeplane/view/swing/map/BubbleMainView.java | 49 +
.../view/swing/map/ClickableImageCreator.java | 106 +
.../view/swing/map/CloudHeightCalculator.java | 24 +
.../org/freeplane/view/swing/map/ContentPane.java | 41 +
.../view/swing/map/ContentPaneLayout.java | 68 +
.../view/swing/map/ContentSizeCalculator.java | 18 +
.../org/freeplane/view/swing/map/DetailsView.java | 50 +
.../org/freeplane/view/swing/map/FoldingMark.java | 137 +
.../org/freeplane/view/swing/map/ForkMainView.java | 137 +
.../view/swing/map/GlyphPainterMetricResetter.java | 0
.../freeplane/view/swing/map/INodeViewLayout.java | 27 +
...mediatelyValidatingPreferredSizeCalculator.java | 20 +
.../org/freeplane/view/swing/map/MainView.java | 784 +
.../org/freeplane/view/swing/map/MapScroller.java | 283 +
.../java/org/freeplane/view/swing/map/MapView.java | 2066 +
.../swing/map/MapViewChangeObserverCompound.java | 0
.../view/swing/map/MapViewController.java | 886 +
.../view/swing/map/MapViewScrollPane.java | 205 +
.../freeplane/view/swing/map/MindMapLayout.java | 0
.../org/freeplane/view/swing/map/MouseArea.java | 0
.../view/swing/map/NarrowHexagonMainView.java | 96 +
.../org/freeplane/view/swing/map/NodeTooltip.java | 169 +
.../view/swing/map/NodeTooltipManager.java | 334 +
.../org/freeplane/view/swing/map/NodeView.java | 1610 +
.../freeplane/view/swing/map/NodeViewFactory.java | 286 +
.../freeplane/view/swing/map/NodeViewLayout.java | 60 +
.../view/swing/map/NoteViewMouseListener.java | 27 +
.../freeplane/view/swing/map/OutlineLayout.java | 116 +
.../org/freeplane/view/swing/map/OvalMainView.java | 97 +
.../org/freeplane/view/swing/map/PaintingMode.java | 28 +
.../view/swing/map/RectangleMainView.java | 83 +
.../freeplane/view/swing/map/SelectableLayout.java | 67 +
.../freeplane/view/swing/map/ShapedMainView.java | 62 +
.../view/swing/map/ShowNotesInMapAction.java | 0
.../view/swing/map/SummaryEdgePainter.java | 0
.../view/swing/map/VariableInsetsMainView.java | 136 +
.../swing/map/VerticalNodeViewLayoutStrategy.java | 388 +
.../view/swing/map/ViewLayoutTypeAction.java | 84 +
.../view/swing/map/WideHexagonMainView.java | 97 +
.../org/freeplane/view/swing/map/ZoomInAction.java | 0
.../freeplane/view/swing/map/ZoomOutAction.java | 0
.../freeplane/view/swing/map/ZoomableLabel.java | 272 +
.../freeplane/view/swing/map/ZoomableLabelUI.java | 470 +
.../swing/map/attribute/AttributePanelManager.java | 262 +
.../swing/map/attribute/AttributePopupMenu.java | 0
.../view/swing/map/attribute/AttributeTable.java | 959 +
.../map/attribute/AttributeTableCellRenderer.java | 176 +
.../AttributeTableModelDecoratorAdapter.java | 158 +
.../view/swing/map/attribute/AttributeView.java | 0
.../map/attribute/AttributeViewScrollPane.java | 64 +
.../view/swing/map/attribute/CursorUpdater.java | 0
.../swing/map/attribute/EditAttributesAction.java | 0
.../ExtendedAttributeTableModelDecorator.java | 0
.../ReducedAttributeTableModelDecorator.java | 0
.../view/swing/map/cloud/ArcCloudView.java | 0
.../freeplane/view/swing/map/cloud/CloudView.java | 0
.../view/swing/map/cloud/CloudViewFactory.java | 0
.../freeplane/view/swing/map/cloud/ConvexHull.java | 0
.../view/swing/map/cloud/RectangleCloudView.java | 0
.../view/swing/map/cloud/StarCloudView.java | 0
.../view/swing/map/edge/AutomaticEdgeStyle.java | 72 +
.../view/swing/map/edge/BezierEdgeView.java | 0
.../freeplane/view/swing/map/edge/EdgeView.java | 0
.../view/swing/map/edge/EdgeViewFactory.java | 0
.../view/swing/map/edge/HiddenEdgeView.java | 0
.../view/swing/map/edge/HiddenOutlineEdgeView.java | 0
.../view/swing/map/edge/HorizontalEdgeView.java | 102 +
.../view/swing/map/edge/LinearEdgeView.java | 0
.../view/swing/map/edge/OutlineEdgeView.java | 85 +
.../view/swing/map/edge/SharpBezierEdgeView.java | 0
.../view/swing/map/edge/SharpEdgeView.java | 0
.../view/swing/map/edge/SharpLinearEdgeView.java | 0
.../view/swing/map/edge/SummaryEdgeView.java | 76 +
.../view/swing/map/link/AConnectorView.java | 0
.../view/swing/map/link/CollisionDetector.java | 0
.../view/swing/map/link/ConnectorView.java | 511 +
.../view/swing/map/link/EdgeLinkView.java | 116 +
.../freeplane/view/swing/map/link/ILinkView.java | 0
.../view/swing/map/link/OutlineLinkView.java | 0
.../freeplane/view/swing/map/link/PathBBox.java | 0
.../freeplane/view/swing/map/link/TextPainter.java | 79 +
.../mindmapmode/EditNodeExternalApplication.java | 0
.../swing/map/mindmapmode/EditNodeTextField.java | 798 +
.../swing/map/mindmapmode/ExtendedEditorKit.java | 0
.../swing/map/mindmapmode/MMapViewController.java | 146 +
.../freeplane/view/swing/ui/AltCodeChecker.java | 25 +
.../view/swing/ui/DefaultMapMouseListener.java | 199 +
.../view/swing/ui/DefaultMouseWheelListener.java | 0
.../view/swing/ui/DefaultNodeKeyListener.java | 146 +
.../swing/ui/DefaultNodeMouseMotionListener.java | 239 +
.../swing/ui/DefaultNodeMouseWheelListener.java | 33 +
.../view/swing/ui/DetailsViewMouseListener.java | 136 +
.../view/swing/ui/LinkNavigatorMouseListener.java | 0
.../freeplane/view/swing/ui/MapsMenuAction.java | 50 +
.../freeplane/view/swing/ui/ModesMenuAction.java | 43 +
.../view/swing/ui/MovedMouseEventFilter.java | 0
.../view/swing/ui/NodePopupMenuDisplayer.java | 0
.../org/freeplane/view/swing/ui/NodeSelector.java | 196 +
.../view/swing/ui/UserInputListenerFactory.java | 522 +
.../swing/ui/mindmapmode/GlassPaneManager.java | 63 +
.../ui/mindmapmode/GlassPaneNodeSelector.java | 160 +
.../view/swing/ui/mindmapmode/INodeSelector.java | 0
.../swing/ui/mindmapmode/MMapMouseListener.java | 0
.../swing/ui/mindmapmode/MNodeDragListener.java | 0
.../swing/ui/mindmapmode/MNodeDropListener.java | 323 +
.../swing/ui/mindmapmode/MNodeMotionListener.java | 396 +
.../ui/mindmapmode/MNodeMouseWheelListener.java | 57 +
.../view/swing/ui/mindmapmode/NodeSelector.java | 0
.../src/org/freeplane/core/io/WriteManager.java | 93 -
.../org/freeplane/core/io/xml/TreeXmlReader.java | 316 -
.../org/freeplane/core/resources/NamedObject.java | 148 -
.../core/resources/ResourceController.java | 291 -
.../core/resources/SetBooleanPropertyAction.java | 56 -
.../core/resources/WindowConfigurationStorage.java | 138 -
.../core/resources/components/BooleanProperty.java | 75 -
.../core/resources/components/ColorProperty.java | 140 -
.../core/resources/components/ComboProperty.java | 138 -
.../components/EditableComboProperty.java | 93 -
.../core/resources/components/FontProperty.java | 83 -
.../core/resources/components/GrabKeyDialog.java | 421 -
.../resources/components/IPropertyControl.java | 30 -
.../core/resources/components/IconProperty.java | 110 -
.../core/resources/components/KeyProperty.java | 119 -
.../resources/components/NextColumnProperty.java | 49 -
.../resources/components/NextLineProperty.java | 41 -
.../core/resources/components/NumberProperty.java | 106 -
.../core/resources/components/OptionPanel.java | 247 -
.../resources/components/OptionPanelBuilder.java | 604 -
.../core/resources/components/PathProperty.java | 173 -
.../core/resources/components/PropertyAction.java | 137 -
.../core/resources/components/PropertyAdapter.java | 76 -
.../core/resources/components/PropertyBean.java | 84 -
.../resources/components/RemindValueProperty.java | 123 -
.../resources/components/SeparatorProperty.java | 52 -
.../core/resources/components/StringProperty.java | 68 -
.../core/resources/components/TabProperty.java | 60 -
.../freeplane/core/resources/components/Text.java | 56 -
.../core/resources/components/TextBoxProperty.java | 72 -
.../org/freeplane/core/ui/AFreeplaneAction.java | 180 -
.../freeplane/core/ui/AccelerateableAction.java | 267 -
.../src/org/freeplane/core/ui/ColorTracker.java | 130 -
.../core/ui/IAcceleratorChangeListener.java | 31 -
.../freeplane/core/ui/IKeyStrokeInterceptor.java | 17 -
.../org/freeplane/core/ui/IMenuContributor.java | 26 -
.../core/ui/IUserInputListenerFactory.java | 69 -
.../src/org/freeplane/core/ui/IndexedTree.java | 251 -
.../src/org/freeplane/core/ui/MenuBuilder.java | 928 -
.../src/org/freeplane/core/ui/MenuSplitter.java | 89 -
.../org/freeplane/core/ui/MouseInsideListener.java | 80 -
freeplane/src/org/freeplane/core/ui/UIBuilder.java | 202 -
.../ui/components/ActionToggleButtonModel.java | 50 -
.../core/ui/components/BitmapImagePreview.java | 104 -
.../core/ui/components/BitmapViewerComponent.java | 259 -
.../ui/components/ContainerComboBoxEditor.java | 133 -
.../freeplane/core/ui/components/FButtonBar.java | 360 -
.../core/ui/components/FreeplaneMenuBar.java | 106 -
.../ui/components/IconSelectionPopupDialog.java | 360 -
.../core/ui/components/JAutoCheckBoxMenuItem.java | 89 -
.../ui/components/JAutoRadioButtonMenuItem.java | 89 -
.../org/freeplane/core/ui/components/JResizer.java | 173 -
.../core/ui/components/MultipleImage.java | 83 -
.../ui/components/OneTouchCollapseResizer.java | 384 -
.../components/OptionalDontShowMeAgainDialog.java | 230 -
.../freeplane/core/ui/components/ResizeEvent.java | 12 -
.../org/freeplane/core/ui/components/UITools.java | 627 -
.../core/ui/components/calendar/JMonthChooser.java | 374 -
.../core/ui/components/html/ScaledEditorKit.java | 126 -
.../core/ui/components/html/ScaledHTML.java | 213 -
.../core/ui/components/html/ScaledStyleSheet.java | 61 -
.../src/org/freeplane/core/undo/CompoundActor.java | 78 -
.../src/org/freeplane/core/undo/UndoHandler.java | 337 -
.../src/org/freeplane/core/util/ColorUtils.java | 36 -
freeplane/src/org/freeplane/core/util/Compat.java | 243 -
.../freeplane/core/util/ConfigurationUtils.java | 51 -
.../src/org/freeplane/core/util/FileUtils.java | 341 -
.../org/freeplane/core/util/FreeplaneVersion.java | 227 -
.../src/org/freeplane/core/util/HtmlUtils.java | 785 -
.../src/org/freeplane/core/util/MenuUtils.java | 304 -
.../src/org/freeplane/core/util/TextUtils.java | 170 -
.../src/org/freeplane/core/util/TypeReference.java | 116 -
.../freeplane/core/util/XsltPipeReaderFactory.java | 141 -
.../core/util/collection/DoubleListModel.java | 82 -
.../features/attribute/AttributeBuilder.java | 324 -
.../attribute/AttributeCompareCondition.java | 123 -
.../attribute/AttributeConditionController.java | 186 -
.../attribute/AttributeContainsCondition.java | 114 -
.../features/attribute/AttributeController.java | 240 -
.../attribute/AttributeExistsCondition.java | 79 -
.../attribute/AttributeMatchesCondition.java | 109 -
.../attribute/AttributeNotExistsCondition.java | 79 -
.../features/attribute/AttributeRegistry.java | 439 -
.../attribute/AttributeTableLayoutModel.java | 84 -
.../features/attribute/IAttributeTableModel.java | 35 -
.../attribute/NodeAttributeTableModel.java | 267 -
.../attribute/mindmapmode/AddAttributeAction.java | 182 -
.../mindmapmode/AssignAttributeDialog.java | 508 -
.../mindmapmode/AssignAttributesAction.java | 47 -
.../mindmapmode/AttributeManagerDialog.java | 297 -
.../attribute/mindmapmode/CopyAttributes.java | 169 -
.../mindmapmode/ImportAttributesDialog.java | 360 -
.../features/attribute/mindmapmode/ListDialog.java | 339 -
.../mindmapmode/MAttributeController.java | 870 -
.../mindmapmode/ShowAttributeDialogAction.java | 59 -
.../features/clipboard/ClipboardController.java | 432 -
.../features/clipboard/MindMapHTMLWriter.java | 430 -
.../features/clipboard/MindMapNodesSelection.java | 129 -
.../features/clipboard/SingleCopySource.java | 315 -
.../mindmapmode/MClipboardController.java | 788 -
.../org/freeplane/features/cloud/CloudBuilder.java | 150 -
.../org/freeplane/features/edge/EdgeBuilder.java | 169 -
.../freeplane/features/edge/EdgeController.java | 233 -
.../edge/mindmapmode/AutomaticEdgeColorHook.java | 134 -
.../features/edge/mindmapmode/MEdgeController.java | 290 -
.../features/encrypt/EncryptionController.java | 162 -
.../features/encrypt/SwingPasswordStrategy.java | 43 -
.../features/encrypt/mindmapmode/EncryptedMap.java | 81 -
.../features/export/mindmapmode/ExportAction.java | 56 -
.../features/export/mindmapmode/ExportDialog.java | 188 -
.../export/mindmapmode/ExportToOoWriter.java | 134 -
.../export/mindmapmode/ExportWithXSLT.java | 326 -
.../export/mindmapmode/ImportMindmanagerFiles.java | 132 -
.../features/filter/AFilterComposerDialog.java | 661 -
.../features/filter/EditFilterAction.java | 107 -
.../src/org/freeplane/features/filter/Filter.java | 239 -
.../features/filter/FilterConditionEditor.java | 340 -
.../features/filter/FilterController.java | 621 -
.../features/filter/FilterMenuBuilder.java | 57 -
.../org/freeplane/features/filter/FindAction.java | 223 -
.../filter/NextPresentationItemAction.java | 45 -
.../features/filter/QuickFilterAction.java | 59 -
.../freeplane/features/filter/QuickFindAction.java | 100 -
.../features/filter/StringMatchingStrategy.java | 42 -
.../filter/condition/ASelectableCondition.java | 123 -
.../filter/condition/CompareConditionAdapter.java | 216 -
.../filter/condition/ConditionFactory.java | 134 -
.../condition/IElementaryConditionController.java | 60 -
.../filter/condition/SelectedViewCondition.java | 61 -
.../condition/SelectedViewSnapshotCondition.java | 62 -
.../features/format/IdentityPatternFormat.java | 30 -
.../features/format/StandardPatternFormat.java | 26 -
.../org/freeplane/features/help/AboutAction.java | 89 -
.../features/help/DocumentationAction.java | 90 -
.../features/help/FilePropertiesAction.java | 352 -
.../freeplane/features/help/HelpController.java | 68 -
.../freeplane/features/help/HotKeyInfoAction.java | 147 -
.../features/help/OnlineDocumentationAction.java | 71 -
.../freeplane/features/icon/HierarchicalIcons.java | 213 -
.../freeplane/features/icon/IIconInformation.java | 33 -
.../org/freeplane/features/icon/IconBuilder.java | 93 -
.../features/icon/IconConditionController.java | 128 -
.../freeplane/features/icon/IconController.java | 136 -
.../org/freeplane/features/icon/IconNotFound.java | 44 -
.../org/freeplane/features/icon/IconRegistry.java | 76 -
.../src/org/freeplane/features/icon/IconStore.java | 146 -
.../features/icon/PriorityConditionController.java | 135 -
.../src/org/freeplane/features/icon/UIIcon.java | 191 -
.../src/org/freeplane/features/icon/UIIconSet.java | 94 -
.../src/org/freeplane/features/icon/UserIcon.java | 65 -
.../org/freeplane/features/icon/ZoomedIcon.java | 90 -
.../features/icon/factory/IconStoreFactory.java | 155 -
.../features/icon/factory/MindIconFactory.java | 46 -
.../features/icon/mindmapmode/IconAction.java | 77 -
.../icon/mindmapmode/IconSelectionPlugin.java | 87 -
.../features/icon/mindmapmode/MIconController.java | 411 -
.../icon/mindmapmode/RemoveAllIconsAction.java | 73 -
.../icon/mindmapmode/RemoveIconAction.java | 76 -
.../features/link/ConnectorLabelCondition.java | 116 -
.../freeplane/features/link/ConnectorModel.java | 223 -
.../freeplane/features/link/FollowLinkAction.java | 65 -
.../features/link/GotoLinkNodeAction.java | 57 -
.../features/link/HyperLinkContainsCondition.java | 75 -
.../features/link/HyperLinkEqualsCondition.java | 76 -
.../features/link/HyperTextLinkModel.java | 35 -
.../org/freeplane/features/link/LinkBuilder.java | 359 -
.../features/link/LinkConditionController.java | 199 -
.../freeplane/features/link/LinkController.java | 845 -
.../src/org/freeplane/features/link/LinkModel.java | 42 -
.../freeplane/features/link/LinkTransformer.java | 76 -
.../src/org/freeplane/features/link/MapLinks.java | 86 -
.../org/freeplane/features/link/NodeLinkModel.java | 48 -
.../src/org/freeplane/features/link/NodeLinks.java | 188 -
.../features/link/NodeUpdateChangeListener.java | 66 -
.../link/mindmapmode/ClearLinkAnchorAction.java | 55 -
.../features/link/mindmapmode/MLinkController.java | 1162 -
.../link/mindmapmode/MakeLinkFromAnchorAction.java | 136 -
.../link/mindmapmode/MakeLinkToAnchorAction.java | 58 -
.../link/mindmapmode/SelectMenuItemDialog.java | 183 -
.../link/mindmapmode/SetLinkByTextFieldAction.java | 92 -
.../features/map/AMapChangeListenerAdapter.java | 33 -
.../freeplane/features/map/AlwaysUnfoldedNode.java | 55 -
.../freeplane/features/map/EncryptionModel.java | 190 -
.../org/freeplane/features/map/FirstGroupNode.java | 38 -
.../freeplane/features/map/FoldingController.java | 337 -
.../src/org/freeplane/features/map/FreeNode.java | 68 -
.../freeplane/features/map/IExtensionCopier.java | 14 -
.../freeplane/features/map/IMapChangeListener.java | 37 -
.../org/freeplane/features/map/IMapSelection.java | 64 -
.../org/freeplane/features/map/MapController.java | 963 -
.../src/org/freeplane/features/map/MapModel.java | 296 -
.../src/org/freeplane/features/map/MapReader.java | 183 -
.../src/org/freeplane/features/map/MapWriter.java | 145 -
.../org/freeplane/features/map/NodeBuilder.java | 235 -
.../freeplane/features/map/NodeChangeEvent.java | 61 -
.../features/map/NodeLevelConditionController.java | 185 -
.../src/org/freeplane/features/map/NodeModel.java | 572 -
.../src/org/freeplane/features/map/NodeWriter.java | 136 -
.../features/map/ShowNextChildAction.java | 55 -
.../org/freeplane/features/map/SummaryNode.java | 72 -
.../freeplane/features/map/ToggleFoldedAction.java | 44 -
.../map/mindmapmode/ChangeNodeLevelController.java | 193 -
.../features/map/mindmapmode/DeleteAction.java | 64 -
.../features/map/mindmapmode/MMapController.java | 788 -
.../features/map/mindmapmode/MMapModel.java | 143 -
.../features/map/mindmapmode/NewParentNode.java | 112 -
.../features/map/mindmapmode/NewSummaryAction.java | 109 -
.../features/map/mindmapmode/NodeDownAction.java | 43 -
.../features/map/mindmapmode/NodeUpAction.java | 43 -
.../features/mapio/mindmapmode/MMapIO.java | 121 -
.../org/freeplane/features/mode/AController.java | 78 -
.../org/freeplane/features/mode/Controller.java | 280 -
.../freeplane/features/mode/ModeController.java | 429 -
.../freeplane/features/mode/MoveToRootAction.java | 40 -
.../features/mode/PersistentNodeHook.java | 421 -
.../features/mode/SelectionController.java | 70 -
.../mindmapmode/LoadAcceleratorPresetsAction.java | 125 -
.../features/mode/mindmapmode/MModeController.java | 227 -
.../features/mode/mindmapmode/RedoAction.java | 89 -
.../mindmapmode/SaveAcceleratorPresetsAction.java | 101 -
.../features/mode/mindmapmode/UndoAction.java | 122 -
.../features/nodelocation/LocationBuilder.java | 77 -
.../features/nodelocation/LocationController.java | 72 -
.../features/nodelocation/LocationModel.java | 95 -
.../mindmapmode/ChangeShiftXActor.java | 60 -
.../mindmapmode/ChangeShiftYActor.java | 60 -
.../nodelocation/mindmapmode/ChangeVGapActor.java | 63 -
.../mindmapmode/MLocationController.java | 70 -
.../mindmapmode/ResetNodeLocationAction.java | 49 -
.../features/nodestyle/NodeSizeModel.java | 83 -
.../features/nodestyle/NodeStyleBuilder.java | 311 -
.../features/nodestyle/NodeStyleController.java | 408 -
.../features/nodestyle/NodeStyleModel.java | 238 -
.../features/nodestyle/mindmapmode/CopyFormat.java | 91 -
.../mindmapmode/MNodeStyleController.java | 605 -
.../nodestyle/mindmapmode/NodeShapeAction.java | 44 -
.../nodestyle/mindmapmode/NodeSizeDialog.java | 200 -
.../nodestyle/mindmapmode/NodeWidthAction.java | 44 -
.../freeplane/features/note/NoteController.java | 167 -
.../org/freeplane/features/note/NoteWriter.java | 69 -
.../note/mindmapmode/EditNoteInDialogAction.java | 119 -
.../features/note/mindmapmode/MNoteController.java | 387 -
.../features/note/mindmapmode/NoteManager.java | 136 -
.../note/mindmapmode/SetNoteWindowPosition.java | 38 -
.../src/org/freeplane/features/print/FitMap.java | 34 -
.../org/freeplane/features/print/PageAction.java | 188 -
.../src/org/freeplane/features/print/Preview.java | 127 -
.../features/script/IScriptEditorStarter.java | 35 -
.../freeplane/features/styles/AutomaticLayout.java | 7 -
.../features/styles/AutomaticLayoutController.java | 92 -
.../features/styles/ConditionalStyleModel.java | 258 -
.../features/styles/LogicalStyleController.java | 391 -
.../styles/LogicalStyleFilterController.java | 97 -
.../org/freeplane/features/styles/MapStyle.java | 559 -
.../freeplane/features/styles/MapStyleModel.java | 310 -
.../freeplane/features/styles/StyleCondition.java | 51 -
.../features/styles/StyleContainsCondition.java | 55 -
.../freeplane/features/styles/StyleFactory.java | 13 -
.../freeplane/features/styles/StyleMapModel.java | 39 -
.../features/styles/StyleNamedObject.java | 56 -
.../AManageConditionalStylesAction.java | 144 -
.../styles/mindmapmode/AssignStyleAction.java | 83 -
.../mindmapmode/ComboBoxRendererWithTooltip.java | 67 -
.../styles/mindmapmode/ConditionalStyleTable.java | 126 -
.../mindmapmode/MLogicalStyleController.java | 513 -
.../features/styles/mindmapmode/MUIFactory.java | 247 -
.../ManageNodeConditionalStylesAction.java | 85 -
.../mindmapmode/MapBackgroundColorAction.java | 69 -
.../styles/mindmapmode/NewUserStyleAction.java | 117 -
.../mindmapmode/SetBooleanMapPropertyAction.java | 71 -
.../styles/mindmapmode/StyleEditorPanel.java | 1081 -
.../freeplane/features/text/DetailTextModel.java | 67 -
.../features/text/FormatContentTransformer.java | 99 -
.../text/MatchCaseNodeContainsCondition.java | 94 -
.../text/MatchCaseNoteContainsCondition.java | 94 -
.../features/text/NodeContainsCondition.java | 95 -
.../freeplane/features/text/NodeTextBuilder.java | 237 -
.../features/text/NodeTextCompareCondition.java | 120 -
.../features/text/NodeTextConditionController.java | 219 -
.../org/freeplane/features/text/RichTextModel.java | 41 -
.../features/text/SetShortenerStateAction.java | 70 -
.../freeplane/features/text/TextController.java | 376 -
.../features/text/ToggleDetailsAction.java | 78 -
.../text/mindmapmode/DeleteDetailsAction.java | 64 -
.../text/mindmapmode/EditDetailsAction.java | 56 -
.../features/text/mindmapmode/EditNodeBase.java | 331 -
.../features/text/mindmapmode/EditNodeDialog.java | 342 -
.../features/text/mindmapmode/EditNodeWYSIWYG.java | 320 -
.../features/text/mindmapmode/EventBuffer.java | 149 -
.../features/text/mindmapmode/JoinNodesAction.java | 47 -
.../features/text/mindmapmode/MTextController.java | 954 -
.../features/text/mindmapmode/SortNodes.java | 76 -
.../features/text/mindmapmode/SplitNode.java | 160 -
.../org/freeplane/features/time/TimeCondition.java | 69 -
.../features/time/TimeConditionController.java | 143 -
.../freeplane/features/time/TimeController.java | 33 -
.../src/org/freeplane/features/ui/CloseAction.java | 44 -
.../org/freeplane/features/ui/FrameController.java | 676 -
.../org/freeplane/features/ui/IMapViewManager.java | 149 -
.../freeplane/features/ui/ToggleToolbarAction.java | 82 -
.../org/freeplane/features/ui/ViewController.java | 153 -
.../features/url/FreeplaneUriConverter.java | 75 -
.../features/url/MapVersionInterpreter.java | 151 -
.../src/org/freeplane/features/url/UrlManager.java | 480 -
.../features/url/mindmapmode/DoAutomaticSave.java | 122 -
.../url/mindmapmode/ExportBranchAction.java | 184 -
.../features/url/mindmapmode/FileOpener.java | 150 -
.../url/mindmapmode/FileRevisionsDialog.java | 320 -
.../url/mindmapmode/ImportBranchAction.java | 71 -
.../mindmapmode/ImportExplorerFavoritesAction.java | 129 -
.../mindmapmode/ImportFolderStructureAction.java | 99 -
.../url/mindmapmode/ImportLinkedBranchAction.java | 91 -
.../features/url/mindmapmode/MFileManager.java | 876 -
.../features/url/mindmapmode/OpenAction.java | 48 -
.../features/url/mindmapmode/SaveAction.java | 62 -
.../features/url/mindmapmode/SaveAsAction.java | 44 -
.../org/freeplane/main/addons/AddOnProperties.java | 490 -
.../freeplane/main/addons/AddOnsController.java | 225 -
.../main/applet/AppletViewController.java | 241 -
.../org/freeplane/main/applet/FreeplaneApplet.java | 227 -
.../application/ApplicationResourceController.java | 304 -
.../application/ApplicationViewController.java | 479 -
.../main/application/CommandLineParser.java | 172 -
.../main/application/ConnectedToMenuView.java | 72 -
.../main/application/FreeplaneGUIStarter.java | 405 -
.../freeplane/main/application/FreeplaneMain.java | 51 -
.../main/application/FreeplaneSecurityManager.java | 269 -
.../main/application/FreeplaneSplashModern.java | 164 -
.../main/application/FreeplaneStarter.java | 54 -
.../main/application/HttpVersionClient.java | 161 -
.../freeplane/main/application/LastOpenedList.java | 307 -
.../main/application/MapViewDockingWindows.java | 385 -
.../main/application/MapViewSerializer.java | 128 -
.../main/application/NavigationNextMapAction.java | 41 -
.../application/NavigationPreviousMapAction.java | 41 -
.../main/application/OpenLastOpenedAction.java | 46 -
.../main/application/SingleInstanceManager.java | 206 -
.../SplitPaneLayoutManagerDecorator.java | 85 -
.../main/application/UpdateCheckAction.java | 496 -
.../main/application/UserPropertiesUpdater.java | 277 -
.../protocols/freeplaneresource/Handler.java | 40 -
.../main/browsemode/BModeControllerFactory.java | 108 -
.../main/browsemode/BToolbarContributor.java | 93 -
.../main/filemode/FModeControllerFactory.java | 93 -
.../headlessmode/FreeplaneHeadlessStarter.java | 148 -
.../HeadlessMModeControllerFactory.java | 146 -
.../headlessmode/HeadlessMapViewController.java | 268 -
.../main/headlessmode/HeadlessUIController.java | 220 -
.../main/mindmapmode/MModeControllerFactory.java | 315 -
.../main/mindmapmode/MToolbarContributor.java | 63 -
.../mindmapmode/stylemode/AEditStylesAction.java | 83 -
.../stylemode/DeleteLevelStyleAction.java | 86 -
.../stylemode/DeleteUserStyleAction.java | 82 -
.../mindmapmode/stylemode/DialogController.java | 152 -
.../mindmapmode/stylemode/EditStylesAction.java | 75 -
.../mindmapmode/stylemode/NewLevelStyleAction.java | 79 -
.../mindmapmode/stylemode/NewUserStyleAction.java | 98 -
.../mindmapmode/stylemode/SModeController.java | 115 -
.../stylemode/SModeControllerFactory.java | 214 -
.../src/org/freeplane/main/osgi/ActivatorImpl.java | 272 -
.../freeplane/main/osgi/ResourcesUrlHandler.java | 34 -
.../org/freeplane/n3/nanoxml/StdXMLBuilder.java | 280 -
.../src/org/freeplane/n3/nanoxml/XMLUtil.java | 614 -
.../src/org/freeplane/n3/nanoxml/XMLWriter.java | 279 -
.../view/swing/features/BlinkingNodeHook.java | 193 -
.../features/filepreview/BitmapViewerFactory.java | 100 -
.../features/filepreview/ExternalResource.java | 93 -
.../swing/features/filepreview/IViewerFactory.java | 45 -
.../swing/features/filepreview/ImagePreview.java | 54 -
.../features/filepreview/ViewerController.java | 711 -
.../features/filepreview/ViewerLayoutManager.java | 78 -
.../swing/features/nodehistory/NodeHolder.java | 109 -
.../features/time/mindmapmode/PeriodPanel.java | 79 -
.../features/time/mindmapmode/PeriodUnit.java | 39 -
.../mindmapmode/ReminderConditionController.java | 159 -
.../time/mindmapmode/ReminderExtension.java | 172 -
.../features/time/mindmapmode/ReminderHook.java | 353 -
.../features/time/mindmapmode/TimeManagement.java | 539 -
.../features/time/mindmapmode/TimerBlinkTask.java | 73 -
.../nodelist/AllMapsNodeListAction.java | 45 -
.../mindmapmode/nodelist/CoreTextAccessor.java | 47 -
.../time/mindmapmode/nodelist/DateRenderer.java | 48 -
.../mindmapmode/nodelist/DetailTextAccessor.java | 49 -
.../time/mindmapmode/nodelist/IconsHolder.java | 66 -
.../time/mindmapmode/nodelist/IconsRenderer.java | 57 -
.../time/mindmapmode/nodelist/NodeList.java | 858 -
.../time/mindmapmode/nodelist/NodeListAction.java | 45 -
.../mindmapmode/nodelist/NoteTextAccessor.java | 50 -
.../time/mindmapmode/nodelist/TextHolder.java | 73 -
.../time/mindmapmode/nodelist/TextRenderer.java | 42 -
.../org/freeplane/view/swing/map/ArrowIcon.java | 89 -
.../freeplane/view/swing/map/BubbleMainView.java | 104 -
.../view/swing/map/ClickableImageCreator.java | 103 -
.../org/freeplane/view/swing/map/ContentPane.java | 44 -
.../view/swing/map/ContentPaneLayout.java | 86 -
.../org/freeplane/view/swing/map/DetailsView.java | 50 -
.../org/freeplane/view/swing/map/FoldingMark.java | 117 -
.../org/freeplane/view/swing/map/ForkMainView.java | 141 -
.../freeplane/view/swing/map/INodeViewLayout.java | 25 -
.../view/swing/map/LeftNodeViewLayout.java | 42 -
.../src/org/freeplane/view/swing/map/MainView.java | 740 -
.../src/org/freeplane/view/swing/map/MapView.java | 1892 -
.../view/swing/map/MapViewController.java | 871 -
.../view/swing/map/MapViewScrollPane.java | 165 -
.../org/freeplane/view/swing/map/NodeTooltip.java | 173 -
.../view/swing/map/NodeTooltipManager.java | 336 -
.../src/org/freeplane/view/swing/map/NodeView.java | 1512 -
.../freeplane/view/swing/map/NodeViewFactory.java | 297 -
.../view/swing/map/NodeViewLayoutAdapter.java | 508 -
.../freeplane/view/swing/map/OutlineLayout.java | 108 -
.../org/freeplane/view/swing/map/PaintingMode.java | 28 -
.../view/swing/map/RightNodeViewLayout.java | 38 -
.../org/freeplane/view/swing/map/RootMainView.java | 184 -
.../freeplane/view/swing/map/SelectableLayout.java | 79 -
.../view/swing/map/VerticalRootNodeViewLayout.java | 42 -
.../view/swing/map/ViewLayoutTypeAction.java | 84 -
.../freeplane/view/swing/map/ZoomableLabel.java | 213 -
.../freeplane/view/swing/map/ZoomableLabelUI.java | 464 -
.../swing/map/attribute/AttributePanelManager.java | 263 -
.../view/swing/map/attribute/AttributeTable.java | 900 -
.../map/attribute/AttributeTableCellRenderer.java | 159 -
.../AttributeTableModelDecoratorAdapter.java | 156 -
.../map/attribute/AttributeViewScrollPane.java | 62 -
.../view/swing/map/edge/HorizontalEdgeView.java | 102 -
.../view/swing/map/edge/OutlineEdgeView.java | 85 -
.../view/swing/map/edge/SummaryEdgeView.java | 76 -
.../view/swing/map/link/ConnectorView.java | 511 -
.../view/swing/map/link/EdgeLinkView.java | 116 -
.../freeplane/view/swing/map/link/TextPainter.java | 79 -
.../swing/map/mindmapmode/EditNodeTextField.java | 748 -
.../swing/map/mindmapmode/MMapViewController.java | 142 -
.../view/swing/ui/DefaultMapMouseListener.java | 197 -
.../view/swing/ui/DefaultNodeKeyListener.java | 142 -
.../swing/ui/DefaultNodeMouseMotionListener.java | 230 -
.../view/swing/ui/DetailsViewMouseListener.java | 137 -
.../view/swing/ui/MapsMenuActionListener.java | 43 -
.../freeplane/view/swing/ui/MenuXmlCreator.java | 102 -
.../view/swing/ui/ModesMenuActionListener.java | 49 -
.../org/freeplane/view/swing/ui/NodeSelector.java | 196 -
.../view/swing/ui/UserInputListenerFactory.java | 340 -
.../swing/ui/mindmapmode/GlassPaneManager.java | 65 -
.../ui/mindmapmode/GlassPaneNodeSelector.java | 158 -
.../swing/ui/mindmapmode/MNodeDropListener.java | 279 -
.../swing/ui/mindmapmode/MNodeMotionListener.java | 390 -
.../ui/components/html/CssRuleBuilderShould.java | 128 +
.../ui/menubuilders/HeadlessFreeplaneRunner.java | 9 +
.../ui/menubuilders/MenuBuilderAcceptanceTest.java | 57 +
.../menubuilders/MenuBuilderIntegrationTest.java | 102 +
.../menubuilders/XmlEntryStructureBuilderTest.java | 146 +
.../action/AcceleratorBuilderTest.java | 96 +
.../action/AcceleratorDestroyerTest.java | 22 +
.../ui/menubuilders/action/ActionFinderTest.java | 55 +
.../action/ActionSelectListenerTest.java | 54 +
.../menubuilders/action/ComponentBuilderTest.java | 28 +
.../menubuilders/action/EntriesForActionTest.java | 55 +
.../generic/BuilderDestroyerPairTest.java | 14 +
.../ui/menubuilders/generic/EntryAccessorTest.java | 116 +
.../menubuilders/generic/EntryNavigatorTest.java | 36 +
.../generic/EntryPopupListenerCollectionTest.java | 60 +
.../core/ui/menubuilders/generic/EntryTest.java | 296 +
.../menubuilders/generic/PhaseProcessorTest.java | 98 +
.../RecursiveMenuStructureProcessorTest.java | 271 +
.../menubuilders/generic/SubtreeProcessorTest.java | 68 +
.../menubuilders/menu/JComponentRemoverTest.java | 53 +
.../ui/menubuilders/menu/JMenuItemBuilderTest.java | 248 +
.../menu/JMenuRadioGroupBuilderTest.java | 62 +
.../ui/menubuilders/menu/JMenubarBuilderTest.java | 28 +
.../ui/menubuilders/menu/JToolbarBuilderTest.java | 30 +
.../menu/JToolbarComponentBuilderTest.java | 84 +
.../menu/MenuAcceleratorChangeListenerTest.java | 33 +
.../menu/MenuBuildProcessFactoryTest.java | 75 +
.../ui/menubuilders/menu/TestMenuBarFactory.java | 22 +
.../menu/ToolbarComponentProviderTest.java | 22 +
.../freeplane/core/util/ConstantObjectShould.java | 30 +
.../org/freeplane/core/util/QuantityShould.java | 120 +
.../freeplane/core/util/RuleReferenceShould.java | 54 +
.../org/freeplane/features/map/ClonesTest.java | 132 +
.../java/org/freeplane/features/map/MapFake.java | 75 +
.../features/map/NodeRelativePathTest.java | 137 +
.../features/map/SummaryLevelsShould.java | 184 +
.../SummaryGroupEdgeListAdderShould.java | 172 +
.../text/mindmapmode/SplitToWordsActionShould.java | 16 +
freeplane/viewer-resources/freeplane.properties | 1049 +-
freeplane/viewer-resources/html/freeplane.css | 12 +
.../images/SetShortenerStateAction.png | Bin
.../viewer-resources/special_applet.properties | 2 +-
.../translations/Resources_en.properties | 360 +-
freeplane/viewer-resources/version.properties | 2 +-
freeplane/viewer-resources/xml/appletMenu.mm | 632 -
freeplane/viewer-resources/xml/appletmenu.xml | 129 +
freeplane_ant/.classpath | 12 -
freeplane_ant/.project | 17 -
.../.settings/org.eclipse.core.resources.prefs | 2 -
freeplane_ant/README.txt | 5 +-
freeplane_ant/build.gradle | 7 +
freeplane_ant/build.xml | 45 -
.../java/org/freeplane/ant/FormatTranslation.java | 407 +
.../org/freeplane/ant/FormatTranslationCheck.java | 75 +
.../src/main/java/org/freeplane/ant/TaskUtils.java | 229 +
.../src/org/freeplane/ant/CreatePlugin.java | 212 -
.../src/org/freeplane/ant/FormatTranslation.java | 369 -
.../org/freeplane/ant/FormatTranslationCheck.java | 75 -
freeplane_ant/src/org/freeplane/ant/TaskUtils.java | 229 -
.../org/freeplane/ant/FormatTranslationTest.java | 187 +
.../src/test/resources/unsorted/Test_de.properties | 1433 +
.../src/test/resources/unsorted/Test_en.properties | 1255 +
.../src/test/resources/unsorted/Test_ru.properties | 1284 +
freeplane_ant/template/$$$$Action.java | 18 -
freeplane_ant/template/Activator.java | 44 -
freeplane_ant/test/build.xml | 77 -
.../org/freeplane/ant/FormatTranslationTest.java | 180 -
freeplane_ant/test/unsorted/Test_de.properties | 1433 -
freeplane_ant/test/unsorted/Test_en.properties | 1255 -
freeplane_ant/test/unsorted/Test_ru.properties | 1284 -
freeplane_devresources/.project | 11 -
.../.settings/org.eclipse.core.resources.prefs | 3 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
freeplane_devresources/CodeStyle/codetemplates.xml | 52 -
.../eclipse/freeplane core.launch | 16 -
.../eclipse/freeplane knopflerfish mac.launch | 24 -
.../eclipse/freeplane knopflerfish.launch | 22 -
.../eclipse/freeplane-osgi-mac.launch | 26 -
.../eclipse/freeplane-osgi.launch | 28 -
.../eclipse/freeplaneDebugJDK.bat | 8 -
freeplane_devresources/test/map_10000-7-7-0-0-0.mm | 40024 -------------------
freeplane_framework/.classpath | 7 -
freeplane_framework/.project | 17 -
.../.settings/org.eclipse.core.resources.prefs | 4 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
.../.settings/org.eclipse.jdt.core.prefs | 12 -
freeplane_framework/META-INF/LAUNCHER_MANIFEST.MF | 4 -
freeplane_framework/ant/ant.properties | 4 -
freeplane_framework/ant/build.xml | 589 -
freeplane_framework/build.gradle | 73 +
.../eclipse}/CodeStyle/clean-up.xml | 0
.../eclipse/CodeStyle/codetemplates.xml | 52 +
.../eclipse}/CodeStyle/formatter.xml | 0
.../eclipse/launchers/freeplane core.launch | 16 +
.../launchers/freeplane knopflerfish mac.launch | 22 +
.../launchers/freeplane knopflerfish.launch | 16 +
.../eclipse/launchers/freeplane-osgi-mac.launch | 25 +
.../eclipse/launchers/freeplane-osgi.launch | 28 +
.../eclipse/launchers/freeplane.policy | 19 +
.../eclipse/launchers}/freeplaneDebug.bat | 0
.../eclipse/launchers/freeplaneDebugJDK.bat | 8 +
.../org.eclipse.core.resources.prefs | 0
.../org.eclipse.core.runtime.prefs | 0
.../settings-templates}/org.eclipse.pde.core.prefs | 0
.../launch4j/freeplaneConsole.lj4.xml | 4 +-
freeplane_framework/launch4j/freeplaneGui.lj4.xml | 4 +-
freeplane_framework/license.txt | 339 -
.../mac-appbundler/mac_info_plist.xslt | 8 +-
freeplane_framework/script/freeplane.bat | 8 +-
freeplane_framework/script/freeplane.policy | 7 +
freeplane_framework/script/freeplane.sh | 6 +-
.../main/java/org/freeplane/launcher/Launcher.java | 140 +
.../src/org/freeplane/launcher/Launcher.java | 98 -
.../test_data}/ListsTest.mm | 0
.../test_data}/RichtextTests.mm | 0
.../test_data}/StructuredMapTest.mm | 0
.../test_data}/generateTestMap.pl | 0
freeplane_framework/windows-icons/Makefile.win | 33 +
.../windows-icons/build/libfreeplaneIcons.a | Bin 0 -> 1538 bytes
.../windows-icons/build/libfreeplaneIcons.def | 2 +
.../windows-icons/freeplaneIcons.layout | 10 +
.../windows-installer/Freeplane_without_Java.iss | 15 +-
.../windows-portable/App/AppInfo/appinfo.ini | 4 +-
freeplane_mac/.classpath | 7 -
freeplane_mac/.project | 17 -
freeplane_mac/ant/build.xml | 36 -
freeplane_mac/build.gradle | 9 +
freeplane_mac/build.properties | 1 +
.../org/freeplane/plugin/macos/MacChanges.java | 143 +
.../src/org/freeplane/plugin/macos/MacChanges.java | 143 -
freeplane_plugin_bugreport/.classpath | 7 -
freeplane_plugin_bugreport/.project | 28 -
.../.settings/org.eclipse.core.resources.prefs | 3 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
.../.settings/org.eclipse.jdt.core.prefs | 7 -
.../.settings/org.eclipse.pde.core.prefs | 5 -
freeplane_plugin_bugreport/META-INF/MANIFEST.MF | 10 -
freeplane_plugin_bugreport/ant/ant.properties | 1 -
freeplane_plugin_bugreport/ant/build.xml | 61 -
freeplane_plugin_bugreport/build.gradle | 35 +
.../org/freeplane/plugin/bugreport/Activator.java | 0
.../freeplane/plugin/bugreport/BugFormatter.java | 0
.../plugin/bugreport/BugReportDialogManager.java | 39 +
.../plugin/bugreport/IBugReportListener.java | 0
.../plugin/bugreport/ManualBugReporter.java | 0
.../plugin/bugreport/ReportGenerator.java | 442 +
.../freeplane/plugin/bugreport/ReportRegistry.java | 0
.../plugin/bugreport/BugReportDialogManager.java | 39 -
.../plugin/bugreport/ReportGenerator.java | 417 -
freeplane_plugin_formula/.classpath | 7 -
freeplane_plugin_formula/.project | 28 -
.../.settings/org.eclipse.core.resources.prefs | 3 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
.../.settings/org.eclipse.jdt.core.prefs | 7 -
freeplane_plugin_formula/META-INF/MANIFEST.MF | 11 -
freeplane_plugin_formula/ant/ant.properties | 2 -
freeplane_plugin_formula/ant/build.xml | 75 -
freeplane_plugin_formula/build.gradle | 37 +
.../org/freeplane/plugin/formula/Activator.java | 91 +
.../plugin/formula/EvaluateAllAction.java | 0
.../freeplane/plugin/formula/FormulaEditor.java | 61 +
.../plugin/formula/FormulaTextTransformer.java | 0
.../formula/FormulaUpdateChangeListener.java | 76 +
.../org/freeplane/plugin/formula/FormulaUtils.java | 0
.../freeplane/plugin/formula/defaults.properties | 0
.../org/freeplane/plugin/formula/preferences.xml | 17 +
.../org/freeplane/plugin/formula/Activator.java | 85 -
.../freeplane/plugin/formula/FormulaEditor.java | 61 -
.../formula/FormulaUpdateChangeListener.java | 74 -
.../org/freeplane/plugin/formula/preferences.mm | 115 -
freeplane_plugin_help/.classpath | 9 -
freeplane_plugin_help/.project | 28 -
.../.settings/org.eclipse.core.resources.prefs | 3 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
.../.settings/org.eclipse.jdt.core.prefs | 12 -
.../.settings/org.eclipse.pde.core.prefs | 5 -
freeplane_plugin_help/META-INF/MANIFEST.MF | 12 -
freeplane_plugin_help/ant/ant.properties | 2 -
freeplane_plugin_help/ant/build.xml | 64 -
freeplane_plugin_help/infinitest.filters | 1 -
.../org/freeplane/plugin/help/doc/Freeplane.map | 25 -
.../freeplane/plugin/help/doc/FreeplaneIndex.xml | 233 -
.../org/freeplane/plugin/help/doc/FreeplaneTOC.xml | 51 -
.../freeplane/plugin/help/doc/JavaHelpSearch/DOCS | Bin 3265 -> 0 bytes
.../plugin/help/doc/JavaHelpSearch/DOCS.TAB | 17 -
.../plugin/help/doc/JavaHelpSearch/OFFSETS | 1 -
.../plugin/help/doc/JavaHelpSearch/POSITIONS | Bin 7887 -> 0 bytes
.../plugin/help/doc/JavaHelpSearch/SCHEMA | 2 -
.../freeplane/plugin/help/doc/JavaHelpSearch/TMAP | Bin 16384 -> 0 bytes
.../org/freeplane/plugin/help/doc/Map.jhm | 137 -
.../org/freeplane/plugin/help/doc/applet.htm | 59 -
.../org/freeplane/plugin/help/doc/create.htm | 46 -
.../org/freeplane/plugin/help/doc/credits.htm | 105 -
.../org/freeplane/plugin/help/doc/customize.htm | 39 -
.../org/freeplane/plugin/help/doc/customuser.htm | 211 -
.../org/freeplane/plugin/help/doc/editco1.gif | Bin 364 -> 0 bytes
.../org/freeplane/plugin/help/doc/editco2.gif | Bin 1017 -> 0 bytes
.../org/freeplane/plugin/help/doc/editco3.gif | Bin 1022 -> 0 bytes
.../org/freeplane/plugin/help/doc/editco4.gif | Bin 962 -> 0 bytes
.../org/freeplane/plugin/help/doc/editcopy.htm | 181 -
.../org/freeplane/plugin/help/doc/editdrag.htm | 66 -
.../org/freeplane/plugin/help/doc/editho1.gif | Bin 3219 -> 0 bytes
.../org/freeplane/plugin/help/doc/edithome.htm | 102 -
.../org/freeplane/plugin/help/doc/editkeyboard.htm | 76 -
.../org/freeplane/plugin/help/doc/editkeychart.htm | 113 -
.../org/freeplane/plugin/help/doc/editnav.htm | 57 -
.../org/freeplane/plugin/help/doc/editno10.jpg | Bin 19321 -> 0 bytes
.../org/freeplane/plugin/help/doc/editno11.gif | Bin 1841 -> 0 bytes
.../org/freeplane/plugin/help/doc/editno2.gif | Bin 4126 -> 0 bytes
.../org/freeplane/plugin/help/doc/editno3.jpg | Bin 5338 -> 0 bytes
.../org/freeplane/plugin/help/doc/editno4.gif | Bin 2281 -> 0 bytes
.../org/freeplane/plugin/help/doc/editno5.gif | Bin 2569 -> 0 bytes
.../org/freeplane/plugin/help/doc/editno6.gif | Bin 1595 -> 0 bytes
.../org/freeplane/plugin/help/doc/editno7.gif | Bin 1821 -> 0 bytes
.../org/freeplane/plugin/help/doc/editno8.gif | Bin 1375 -> 0 bytes
.../org/freeplane/plugin/help/doc/editno9.gif | Bin 6450 -> 0 bytes
.../org/freeplane/plugin/help/doc/editnode.htm | 135 -
.../org/freeplane/plugin/help/doc/editsearch.htm | 38 -
.../org/freeplane/plugin/help/doc/exim.h1.gif | Bin 1628 -> 0 bytes
.../org/freeplane/plugin/help/doc/exim.htm | 73 -
.../org/freeplane/plugin/help/doc/fmlogosm.JPG | Bin 7597 -> 0 bytes
.../org/freeplane/plugin/help/doc/freeplane.hs | 57 -
.../org/freeplane/plugin/help/doc/homepage.htm | 28 -
.../org/freeplane/plugin/help/doc/install.htm | 37 -
.../org/freeplane/plugin/help/doc/manifest.mf | 4 -
.../org/freeplane/plugin/help/doc/mapsample.jpg | Bin 263634 -> 0 bytes
.../org/freeplane/plugin/help/doc/patterns.htm | 82 -
.../org/freeplane/plugin/help/doc/picture(png).jpg | Bin 60615 -> 0 bytes
.../org/freeplane/plugin/help/doc/pixhtml.htm | 38 -
.../org/freeplane/plugin/help/doc/prefs.htm | 28 -
.../org/freeplane/plugin/help/doc/print.htm | 33 -
.../org/freeplane/plugin/help/doc/screen.html | 45 -
.../org/freeplane/plugin/help/doc/style.css | 17 -
.../org/freeplane/plugin/help/doc/tips.h1.gif | Bin 4973 -> 0 bytes
.../org/freeplane/plugin/help/doc/tips.htm | 82 -
.../org/freeplane/plugin/help/doc/welcome.htm | 74 -
.../src/org/freeplane/plugin/help/Activator.java | 33 -
.../plugin/help/FreeplaneHelpStarter.java | 64 -
freeplane_plugin_jsyntaxpane/build.gradle | 54 +
.../src/main/java}/jsyntaxpane/lexers/latex.flex | 0
.../jsyntaxpane/syntaxkits/LaTeXSyntaxKit.java | 0
.../freeplane/plugin/jsyntaxpane/Activator.java | 54 +
.../plugin/jsyntaxpane/NodeIdHighLighter.java | 179 +
.../services/jsyntaxpane/kitsfortypes.properties | 0
.../groovysyntaxkit/combocompletions.txt | 0
.../syntaxkits/latexsyntaxkit/config.properties | 0
freeplane_plugin_latex/.classpath | 8 -
freeplane_plugin_latex/.project | 28 -
.../.settings/org.eclipse.core.resources.prefs | 3 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
.../.settings/org.eclipse.jdt.core.prefs | 11 -
.../.settings/org.eclipse.pde.core.prefs | 5 -
freeplane_plugin_latex/META-INF/MANIFEST.MF | 13 -
freeplane_plugin_latex/ant/ant.properties | 2 -
freeplane_plugin_latex/ant/build.xml | 74 -
freeplane_plugin_latex/build.gradle | 39 +
.../java/org/freeplane/plugin/latex/Activator.java | 66 +
.../freeplane/plugin/latex/DeleteLatexAction.java | 0
.../freeplane/plugin/latex/EditLatexAction.java | 0
.../freeplane/plugin/latex/InsertLatexAction.java | 88 +
.../org/freeplane/plugin/latex/LatexEditor.java | 39 +
.../org/freeplane/plugin/latex/LatexExtension.java | 0
.../org/freeplane/plugin/latex/LatexFormat.java | 0
.../org/freeplane/plugin/latex/LatexNodeHook.java | 209 +
.../freeplane/plugin/latex/LatexRegistration.java | 50 +
.../org/freeplane/plugin/latex/LatexRenderer.java | 126 +
.../org/freeplane/plugin/latex/LatexViewer.java | 0
.../freeplane/plugin/latex/LegacyLatexEditor.java | 0
.../java}/org/freeplane/plugin/latex/TeXText.java | 0
.../plugin/latex/UnparsedLatexFormat.java | 0
.../org/freeplane/plugin/latex/preferences.xml | 12 +
.../src/org/freeplane/plugin/latex/Activator.java | 65 -
.../freeplane/plugin/latex/InsertLatexAction.java | 88 -
.../org/freeplane/plugin/latex/LatexEditor.java | 39 -
.../org/freeplane/plugin/latex/LatexNodeHook.java | 207 -
.../freeplane/plugin/latex/LatexRegistration.java | 48 -
.../org/freeplane/plugin/latex/LatexRenderer.java | 126 -
.../src/org/freeplane/plugin/latex/preferences.mm | 125 -
freeplane_plugin_openmaps/.classpath | 8 -
freeplane_plugin_openmaps/.project | 28 -
.../.settings/org.eclipse.jdt.core.prefs | 7 -
.../.settings/org.eclipse.pde.core.prefs | 4 -
freeplane_plugin_openmaps/META-INF/MANIFEST.MF | 10 -
freeplane_plugin_openmaps/ant/ant.properties | 2 -
freeplane_plugin_openmaps/ant/build.xml | 61 -
freeplane_plugin_openmaps/build.gradle | 44 +
freeplane_plugin_openmaps/lib/Readme.txt | 26 -
.../org/freeplane/plugin/openmaps/Activator.java | 0
.../plugin/openmaps/LocationChoosenListener.java | 11 +
.../plugin/openmaps/OpenMapsExtension.java | 41 +
.../plugin/openmaps/OpenMapsLocation.java | 0
.../plugin/openmaps/OpenMapsNodeHook.java | 192 +
.../plugin/openmaps/OpenMapsRegistration.java | 35 +
.../openmaps/actions/InsertOpenMapsAction.java | 0
.../openmaps/actions/RemoveOpenMapsAction.java | 0
.../openmaps/actions/ViewOpenMapsAction.java | 29 +
.../openmaps/mapelements/OpenMapsController.java | 86 +
.../openmaps/mapelements/OpenMapsDialog.java | 0
.../openmaps/mapelements/OpenMapsViewer.java | 0
.../plugin/openmaps/LocationChoosenListener.java | 10 -
.../plugin/openmaps/OpenMapsExtension.java | 40 -
.../plugin/openmaps/OpenMapsNodeHook.java | 187 -
.../plugin/openmaps/OpenMapsRegistration.java | 22 -
.../openmaps/actions/ViewOpenMapsAction.java | 25 -
.../openmaps/mapelements/OpenMapsController.java | 89 -
freeplane_plugin_script/.classpath | 13 -
freeplane_plugin_script/.project | 28 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
.../.settings/org.eclipse.jdt.core.prefs | 12 -
.../.settings/org.eclipse.pde.core.prefs | 5 -
freeplane_plugin_script/META-INF/MANIFEST.MF | 20 -
freeplane_plugin_script/ant/ant.properties | 3 -
freeplane_plugin_script/ant/build.xml | 117 -
freeplane_plugin_script/build.gradle | 90 +
freeplane_plugin_script/lib/groovy-all-LICENSE.txt | 15 -
.../scripts/apiGenerator.groovy | 9 +-
.../scripts/installScriptAddOn.groovy | 69 +-
.../metaclass/java/lang/StringMetaClass.java | 0
.../org/freeplane/plugin/script/Activator.java | 33 +
.../plugin/script/CompileTimeStrategy.java | 73 +
.../plugin/script/EvaluationDependencies.java | 0
.../plugin/script/ExecuteScriptAction.java | 147 +
.../plugin/script/ExecuteScriptException.java | 0
.../plugin/script/ExecuteScriptForAllNodes.java | 0
.../script/ExecuteScriptForSelectionAction.java | 0
.../org/freeplane/plugin/script/FormulaUtils.java | 172 +
.../plugin/script/FreeplaneScriptBaseClass.java | 287 +
.../org/freeplane/plugin/script/GenericScript.java | 308 +
.../org/freeplane/plugin/script/GroovyScript.java | 263 +
.../org/freeplane/plugin/script/GroovyShell.java | 317 +
.../script/IFreeplaneScriptErrorHandler.java | 28 +
.../java/org/freeplane/plugin/script/IScript.java | 42 +
.../script/InternationalizedSecurityManager.java | 204 +
.../plugin/script/NodeArithmeticsCategory.java | 0
.../plugin/script/RestrictingClassLoader.java | 20 +
.../freeplane/plugin/script/ScriptClassLoader.java | 107 +
.../plugin/script/ScriptComboBoxEditor.java | 0
.../freeplane/plugin/script/ScriptCompiler.java | 0
.../org/freeplane/plugin/script/ScriptContext.java | 0
.../org/freeplane/plugin/script/ScriptEditor.java | 0
.../freeplane/plugin/script/ScriptEditorPanel.java | 488 +
.../plugin/script/ScriptEditorProperty.java | 94 +
.../ScriptEditorWindowConfigurationStorage.java | 0
.../freeplane/plugin/script/ScriptRenderer.java | 66 +
.../freeplane/plugin/script/ScriptResources.java | 74 +
.../freeplane/plugin/script/ScriptSecurity.java | 74 +
.../plugin/script/ScriptingConfiguration.java | 471 +
.../freeplane/plugin/script/ScriptingEngine.java | 156 +
.../plugin/script/ScriptingMenuEntryVisitor.java | 182 +
.../plugin/script/ScriptingMenuUtils.java | 65 +
.../plugin/script/ScriptingPermissions.java | 185 +
.../freeplane/plugin/script/ScriptingPolicy.java | 115 +
.../plugin/script/ScriptingRegistration.java | 302 +
.../plugin/script/ScriptingSecurityManager.java | 80 +
.../plugin/script/SignedScriptHandler.java | 192 +
.../org/freeplane/plugin/script/UniqueStack.java | 0
.../plugin/script/addons/AddOnDetailsPanel.java | 239 +
.../plugin/script/addons/AddOnInstallerPanel.java | 273 +
.../plugin/script/addons/AddonRenderer.java | 0
.../script/addons/ButtonsInCellRenderer.java | 160 +
.../plugin/script/addons/ManageAddOnsAction.java | 0
.../plugin/script/addons/ManageAddOnsDialog.java | 136 +
.../plugin/script/addons/ManageAddOnsPanel.java | 0
.../script/addons/ScriptAddOnProperties.java | 0
.../freeplane/plugin/script/defaults.properties | 9 +
.../plugin/script/filter/ScriptCondition.java | 0
.../script/filter/ScriptConditionController.java | 134 +
.../org/freeplane/plugin/script/preferences.xml | 20 +
.../plugin/script/proxy/AbstractProxy.java | 0
.../plugin/script/proxy/AttributesProxy.java | 324 +
.../freeplane/plugin/script/proxy/CloudProxy.java | 0
.../plugin/script/proxy/ConnectorInListProxy.java | 43 +
.../plugin/script/proxy/ConnectorIterator.java | 50 +
.../plugin/script/proxy/ConnectorOutListProxy.java | 35 +
.../plugin/script/proxy/ConnectorProxy.java | 0
.../plugin/script/proxy/ControllerProxy.java | 306 +
.../plugin/script/proxy/ConversionException.java | 0
.../freeplane/plugin/script/proxy/Convertible.java | 0
.../plugin/script/proxy/ConvertibleDate.java | 0
.../plugin/script/proxy/ConvertibleHtmlText.java | 0
.../plugin/script/proxy/ConvertibleNodeText.java | 0
.../plugin/script/proxy/ConvertibleNoteText.java | 0
.../plugin/script/proxy/ConvertibleNumber.java | 0
.../plugin/script/proxy/ConvertibleText.java | 0
.../freeplane/plugin/script/proxy/EdgeProxy.java | 0
.../plugin/script/proxy/ExternalObjectProxy.java | 0
.../freeplane/plugin/script/proxy/FontProxy.java | 0
.../plugin/script/proxy/FormulaCache.java | 0
.../freeplane/plugin/script/proxy/IconsProxy.java | 164 +
.../freeplane/plugin/script/proxy/LinkProxy.java | 152 +
.../freeplane/plugin/script/proxy/MapProxy.java | 196 +
.../freeplane/plugin/script/proxy/NodeProxy.java | 926 +
.../plugin/script/proxy/NodeStyleProxy.java | 216 +
.../plugin/script/proxy/PropertiesProxy.java | 0
.../org/freeplane/plugin/script/proxy/Proxy.java | 1758 +
.../plugin/script/proxy/ProxyFactory.java | 0
.../freeplane/plugin/script/proxy/ProxyUtils.java | 252 +
.../plugin/script/proxy/ReminderProxy.java | 0
.../plugin/script/proxy/ScriptApiTest.java | 0
.../freeplane/plugin/script/proxy/ScriptUtils.java | 0
.../src/org/freeplane/plugin/script/Activator.java | 54 -
.../plugin/script/CompileTimeStrategy.java | 74 -
.../plugin/script/ExecuteScriptAction.java | 132 -
.../org/freeplane/plugin/script/FormulaUtils.java | 163 -
.../plugin/script/FreeplaneScriptBaseClass.java | 289 -
.../org/freeplane/plugin/script/GenericScript.java | 269 -
.../org/freeplane/plugin/script/GroovyScript.java | 256 -
.../script/IFreeplaneScriptErrorHandler.java | 28 -
.../src/org/freeplane/plugin/script/IScript.java | 40 -
.../freeplane/plugin/script/NodeIdHighLighter.java | 179 -
.../freeplane/plugin/script/ScriptEditorPanel.java | 488 -
.../plugin/script/ScriptEditorProperty.java | 99 -
.../freeplane/plugin/script/ScriptRenderer.java | 66 -
.../freeplane/plugin/script/ScriptResources.java | 68 -
.../freeplane/plugin/script/ScriptSecurity.java | 78 -
.../plugin/script/ScriptingConfiguration.java | 463 -
.../freeplane/plugin/script/ScriptingEngine.java | 147 -
.../plugin/script/ScriptingPermissions.java | 159 -
.../plugin/script/ScriptingRegistration.java | 349 -
.../plugin/script/ScriptingSecurityManager.java | 290 -
.../plugin/script/SignedScriptHandler.java | 227 -
.../plugin/script/addons/AddOnDetailsPanel.java | 236 -
.../plugin/script/addons/AddOnInstallerPanel.java | 273 -
.../script/addons/ButtonsInCellRenderer.java | 160 -
.../plugin/script/addons/ManageAddOnsDialog.java | 135 -
.../freeplane/plugin/script/defaults.properties | 9 -
.../script/filter/ScriptConditionController.java | 134 -
.../src/org/freeplane/plugin/script/preferences.mm | 155 -
.../plugin/script/proxy/AttributesProxy.java | 305 -
.../plugin/script/proxy/ConnectorInListProxy.java | 43 -
.../plugin/script/proxy/ConnectorIterator.java | 50 -
.../plugin/script/proxy/ConnectorOutListProxy.java | 35 -
.../plugin/script/proxy/ControllerProxy.java | 284 -
.../freeplane/plugin/script/proxy/IconsProxy.java | 148 -
.../freeplane/plugin/script/proxy/LinkProxy.java | 147 -
.../freeplane/plugin/script/proxy/MapProxy.java | 196 -
.../freeplane/plugin/script/proxy/NodeProxy.java | 805 -
.../plugin/script/proxy/NodeStyleProxy.java | 183 -
.../org/freeplane/plugin/script/proxy/Proxy.java | 1569 -
.../freeplane/plugin/script/proxy/ProxyUtils.java | 240 -
freeplane_plugin_script_test/.classpath | 8 -
freeplane_plugin_script_test/.project | 28 -
.../.settings/org.eclipse.core.resources.prefs | 3 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
.../.settings/org.eclipse.jdt.core.prefs | 8 -
.../.settings/org.eclipse.pde.core.prefs | 5 -
freeplane_plugin_script_test/META-INF/MANIFEST.MF | 11 -
freeplane_plugin_script_test/ant/build.xml | 16 -
.../freeplane/plugin/script/ConvertibleTest.java | 5 +-
freeplane_plugin_svg/.classpath | 30 -
freeplane_plugin_svg/.project | 28 -
.../.settings/org.eclipse.core.resources.prefs | 3 -
.../.settings/org.eclipse.core.runtime.prefs | 3 -
.../.settings/org.eclipse.jdt.core.prefs | 12 -
.../.settings/org.eclipse.pde.core.prefs | 5 -
freeplane_plugin_svg/META-INF/MANIFEST.MF | 33 -
freeplane_plugin_svg/ant/ant.properties | 25 -
freeplane_plugin_svg/ant/build.xml | 61 -
freeplane_plugin_svg/build.gradle | 73 +
.../java}/org/freeplane/plugin/svg/Activator.java | 0
.../java}/org/freeplane/plugin/svg/ExportPdf.java | 0
.../java}/org/freeplane/plugin/svg/ExportSvg.java | 0
.../freeplane/plugin/svg/ExportVectorGraphic.java | 0
.../org/freeplane/plugin/svg/SvgViewerFactory.java | 180 +
.../org/freeplane/plugin/svg/SvgViewerFactory.java | 134 -
freeplane_plugin_uispec4j/.classpath | 10 -
freeplane_plugin_uispec4j/.project | 28 -
.../.settings/org.eclipse.jdt.core.prefs | 8 -
.../.settings/org.eclipse.pde.core.prefs | 4 -
freeplane_plugin_uispec4j/META-INF/MANIFEST.MF | 27 -
freeplane_plugin_uispec4j/ant/build.xml | 11 -
freeplane_plugin_uispec4j/infinitest.filters | 1 -
.../uispec4j/framework/AttributeTableMatcher.java | 16 -
.../uispec4j/framework/ErrorCheckHandler.java | 34 -
.../uispec4j/framework/FreeplaneAdapter.java | 90 -
.../uispec4j/framework/FreeplaneTestCase.java | 108 -
.../uispec4j/framework/FreeplaneWindow.java | 47 -
.../src/org/freeplane/uispec4j/framework/Node.java | 169 -
.../src/org/freeplane/uispec4j/osgi/Activator.java | 31 -
freeplane_plugin_workspace/.classpath | 8 -
freeplane_plugin_workspace/.project | 28 -
.../.settings/org.eclipse.core.resources.prefs | 2 -
.../.settings/org.eclipse.jdt.core.prefs | 11 -
.../.settings/org.eclipse.pde.core.prefs | 4 -
freeplane_plugin_workspace/META-INF/MANIFEST.MF | 35 -
freeplane_plugin_workspace/ant/ant.properties | 3 -
freeplane_plugin_workspace/ant/build.xml | 68 -
freeplane_plugin_workspace/infinitest.filters | 1 -
.../resources/conf/fileIcons.properties | 7 -
.../resources/conf/filenodetypes.properties | 2 -
.../resources/conf/workspace_default.xml | 11 -
.../resources/conf/workspace_default_docear.xml | 14 -
.../resources/images/16x16/acrobat.png | Bin 1040 -> 0 bytes
.../resources/images/16x16/box.png | Bin 1024 -> 0 bytes
.../resources/images/16x16/cross.png | Bin 1168 -> 0 bytes
.../resources/images/16x16/dialog-warning-4.png | Bin 1019 -> 0 bytes
.../resources/images/16x16/docear16.png | Bin 3257 -> 0 bytes
.../resources/images/16x16/document-close-2.png | Bin 1404 -> 0 bytes
.../resources/images/16x16/document-delete.png | Bin 1232 -> 0 bytes
.../resources/images/16x16/document-new-6.png | Bin 1016 -> 0 bytes
.../images/16x16/drive-harddisk_mount-2.png | Bin 1219 -> 0 bytes
.../resources/images/16x16/edit-delete-5.png | Bin 1142 -> 0 bytes
.../resources/images/16x16/emblem-documents.png | Bin 1195 -> 0 bytes
.../resources/images/16x16/emblem-package-2.png | Bin 978 -> 0 bytes
.../resources/images/16x16/folder-blue.png | Bin 869 -> 0 bytes
.../resources/images/16x16/folder-blue_open.png | Bin 936 -> 0 bytes
.../images/16x16/folder-orange-missing.png | Bin 770 -> 0 bytes
.../resources/images/16x16/folder-orange.png | Bin 848 -> 0 bytes
.../resources/images/16x16/folder-orange_open.png | Bin 923 -> 0 bytes
.../resources/images/16x16/folder-red.png | Bin 874 -> 0 bytes
.../resources/images/16x16/folder-red_open.png | Bin 966 -> 0 bytes
.../resources/images/16x16/folder-sync.png | Bin 1143 -> 0 bytes
.../resources/images/16x16/image-x-generic.png | Bin 941 -> 0 bytes
.../resources/images/16x16/object-group-2.png | Bin 842 -> 0 bytes
.../resources/images/16x16/package.png | Bin 1321 -> 0 bytes
.../preferences-desktop-filetype-association.png | Bin 1084 -> 0 bytes
.../resources/images/16x16/text-html-2.png | Bin 1175 -> 0 bytes
.../resources/images/16x16/text-x-preview.png | Bin 903 -> 0 bytes
.../resources/images/16x16/view-refresh-4.png | Bin 1421 -> 0 bytes
.../resources/images/16x16/x-office-document.png | Bin 761 -> 0 bytes
.../resources/images/project-open-2.png | Bin 1050 -> 0 bytes
.../resources/translations/Resources_en.properties | 116 -
.../freeplane/core/ui/FreeplaneActionCascade.java | 79 -
.../core/ui/FreeplaneActionMultiCaster.java | 73 -
.../src/org/freeplane/core/user/IUserAccount.java | 9 -
.../src/org/freeplane/core/user/LocalUser.java | 36 -
.../freeplane/core/user/UserAccountController.java | 37 -
.../org/freeplane/core/util/UniqueIDCreator.java | 28 -
.../src/org/freeplane/lang/Destructable.java | 12 -
.../org/freeplane/plugin/workspace/Activator.java | 109 -
.../IWorkspaceDependingControllerExtension.java | 8 -
.../org/freeplane/plugin/workspace/URIUtils.java | 147 -
.../plugin/workspace/WorkspaceController.java | 308 -
.../workspace/WorkspaceDependingService.java | 55 -
.../plugin/workspace/actions/AWorkspaceAction.java | 169 -
.../workspace/actions/FileNodeDeleteAction.java | 76 -
.../workspace/actions/FileNodeNewFileAction.java | 39 -
.../actions/FileNodeNewMindmapAction.java | 82 -
.../plugin/workspace/actions/NodeCopyAction.java | 81 -
.../plugin/workspace/actions/NodeCutAction.java | 89 -
.../workspace/actions/NodeNewFolderAction.java | 108 -
.../workspace/actions/NodeNewLinkAction.java | 86 -
.../workspace/actions/NodeOpenLocationAction.java | 48 -
.../plugin/workspace/actions/NodePasteAction.java | 82 -
.../workspace/actions/NodeRefreshAction.java | 35 -
.../plugin/workspace/actions/NodeRemoveAction.java | 82 -
.../plugin/workspace/actions/NodeRenameAction.java | 86 -
.../actions/PhysicalFolderSortOrderAction.java | 71 -
.../workspace/actions/WorkspaceCollapseAction.java | 47 -
.../workspace/actions/WorkspaceExpandAction.java | 26 -
.../actions/WorkspaceImportProjectAction.java | 83 -
.../workspace/actions/WorkspaceNewMapAction.java | 124 -
.../actions/WorkspaceNewProjectAction.java | 94 -
.../WorkspaceProjectOpenLocationAction.java | 37 -
.../workspace/actions/WorkspaceQuitAction.java | 34 -
.../actions/WorkspaceRemoveProjectAction.java | 70 -
.../workspace/components/ExpandedStateHandler.java | 94 -
.../workspace/components/IWorkspaceView.java | 37 -
.../plugin/workspace/components/TreeView.java | 318 -
.../workspace/components/WorkspaceCellEditor.java | 98 -
.../components/WorkspaceNodeRenderer.java | 102 -
.../components/dialog/FileExistsDialogPanel.java | 49 -
.../dialog/ImportProjectDialogPanel.java | 494 -
.../components/dialog/NewDirectoryDialogPanel.java | 74 -
.../components/dialog/NewProjectDialogPanel.java | 285 -
.../components/dialog/NodeRenameDialogPanel.java | 82 -
.../components/dialog/WorkspaceNewFolderPanel.java | 202 -
.../components/menu/CheckEnableOnPopup.java | 9 -
.../components/menu/WorkspacePopupMenu.java | 28 -
.../components/menu/WorkspacePopupMenuBuilder.java | 223 -
.../components/menu/WorkspaceToolBar.java | 82 -
.../plugin/workspace/creator/ActionCreator.java | 58 -
.../workspace/creator/DefaultFileNodeCreator.java | 42 -
.../plugin/workspace/creator/FolderCreator.java | 58 -
.../workspace/creator/FolderFileNodeCreator.java | 40 -
.../creator/FolderTypePhysicalCreator.java | 57 -
.../creator/FolderTypeVirtualCreator.java | 22 -
.../plugin/workspace/creator/LinkCreator.java | 58 -
.../workspace/creator/LinkTypeFileCreator.java | 31 -
.../workspace/creator/ProjectRootCreator.java | 25 -
.../plugin/workspace/dnd/AClipboardController.java | 43 -
.../plugin/workspace/dnd/DnDController.java | 49 -
.../plugin/workspace/dnd/INodeDropHandler.java | 13 -
.../dnd/IWorkspaceTransferableCreator.java | 14 -
.../workspace/dnd/IWorspaceClipboardOwner.java | 7 -
.../workspace/dnd/NoDropHandlerFoundExeption.java | 26 -
.../workspace/dnd/WorkspaceTransferHandler.java | 289 -
.../workspace/dnd/WorkspaceTransferable.java | 216 -
.../plugin/workspace/event/AWorkspaceEvent.java | 52 -
.../plugin/workspace/event/IWorkspaceListener.java | 5 -
.../event/IWorkspaceNodeActionListener.java | 6 -
.../workspace/event/WorkspaceActionEvent.java | 94 -
.../features/AWorkspaceModeExtension.java | 77 -
.../ModeControlAlreadyRegisteredException.java | 13 -
.../workspace/features/ProjectURLHandler.java | 46 -
.../workspace/features/PropertyUrlHandler.java | 30 -
.../features/WorkspaceMapModelExtension.java | 17 -
.../WorkspaceModelExtensionWriterReader.java | 103 -
.../workspace/features/WorkspaceUrlHandler.java | 51 -
.../handler/DefaultFileNodeIconHandler.java | 109 -
.../handler/DefaultNodeTypeIconManager.java | 56 -
.../handler/DirectoryMergeConflictDialog.java | 36 -
.../handler/FileExistsConflictDialog.java | 35 -
.../workspace/handler/INodeTypeIconHandler.java | 27 -
.../workspace/handler/INodeTypeIconManager.java | 17 -
.../plugin/workspace/handler/IOController.java | 78 -
.../workspace/handler/LinkTypeFileIconHandler.java | 110 -
.../plugin/workspace/io/AFileNodeCreator.java | 97 -
.../workspace/io/CancelExecutionException.java | 14 -
.../plugin/workspace/io/FileReadManager.java | 70 -
.../plugin/workspace/io/FileSystemManager.java | 575 -
.../plugin/workspace/io/IConflictHandler.java | 11 -
.../workspace/io/IFileSystemRepresentation.java | 14 -
.../plugin/workspace/io/IFileTypeHandler.java | 11 -
.../workspace/io/IProjectSettingsIOHandler.java | 39 -
.../org/freeplane/plugin/workspace/io/ITask.java | 9 -
.../plugin/workspace/io/SkipTaskException.java | 8 -
.../plugin/workspace/io/StringOutputStream.java | 34 -
.../workspace/io/annotation/ExportAsAttribute.java | 22 -
.../plugin/workspace/io/xml/ProjectNodeWriter.java | 96 -
.../workspace/io/xml/ProjectSettingsWriter.java | 70 -
.../listener/DefaultTreeExpansionListener.java | 26 -
.../DefaultWorkspaceSelectionListener.java | 15 -
.../mindmapmode/ContextMenuController.java | 5 -
.../mindmapmode/DefaultFileDropHandler.java | 30 -
.../mindmapmode/FileFolderDropHandler.java | 199 -
.../workspace/mindmapmode/InputController.java | 279 -
.../mindmapmode/MModeWorkspaceController.java | 505 -
.../mindmapmode/MModeWorkspaceLinkController.java | 140 -
.../mindmapmode/MModeWorkspaceUrlManager.java | 141 -
.../mindmapmode/VirtualFolderDropHandler.java | 174 -
.../workspace/model/AWorkspaceNodeCreator.java | 51 -
.../plugin/workspace/model/AWorkspaceTreeNode.java | 279 -
.../plugin/workspace/model/IMutableLinkNode.java | 19 -
.../plugin/workspace/model/IResultProcessor.java | 10 -
.../plugin/workspace/model/WorkspaceModel.java | 637 -
.../workspace/model/WorkspaceModelEvent.java | 71 -
.../workspace/model/WorkspaceModelException.java | 11 -
.../workspace/model/WorkspaceModelListener.java | 11 -
.../plugin/workspace/model/WorkspaceTreeModel.java | 67 -
.../workspace/model/WorkspaceTreeNodePath.java | 106 -
.../workspace/model/project/AWorkspaceProject.java | 117 -
.../project/DefaultWorkspaceProjectCreator.java | 85 -
.../model/project/IProjectModelListener.java | 18 -
.../model/project/IProjectSelectionListener.java | 5 -
.../model/project/IWorkspaceProjectCreater.java | 7 -
.../model/project/IWorkspaceProjectExtension.java | 5 -
.../workspace/model/project/ProjectLoader.java | 243 -
.../workspace/model/project/ProjectModel.java | 561 -
.../model/project/ProjectSelectionEvent.java | 29 -
.../workspace/model/project/ProjectVersion.java | 40 -
.../plugin/workspace/nodes/AActionNode.java | 95 -
.../plugin/workspace/nodes/AFolderNode.java | 55 -
.../plugin/workspace/nodes/ALinkNode.java | 53 -
.../plugin/workspace/nodes/DefaultFileNode.java | 363 -
.../plugin/workspace/nodes/FolderFileNode.java | 169 -
.../plugin/workspace/nodes/FolderLinkNode.java | 253 -
.../workspace/nodes/FolderTypeMyFilesNode.java | 135 -
.../plugin/workspace/nodes/FolderVirtualNode.java | 107 -
.../plugin/workspace/nodes/LinkTypeFileNode.java | 252 -
.../plugin/workspace/nodes/ProjectRootNode.java | 177 -
.../plugin/workspace/nodes/WorkspaceRootNode.java | 146 -
.../infinitest.filters | 0
.../org/freeplane/core/util/HtmlUtilsTest.java | 47 +
gitinfo.properties | 1 +
gitinfo.txt | 1 +
jdt-config.gradle | 17 +
license.txt | 678 +-
mac.dist.gradle | 113 +
readme.txt | 2 -
settings.gradle | 13 +
src.dist.gradle | 146 +
win.dist.gradle | 100 +
2323 files changed, 143556 insertions(+), 190021 deletions(-)
diff --git a/JOrtho_0.4_freeplane/.classpath b/JOrtho_0.4_freeplane/.classpath
deleted file mode 100644
index 225904f..0000000
--- a/JOrtho_0.4_freeplane/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/3"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/JOrtho_0.4_freeplane/.project b/JOrtho_0.4_freeplane/.project
deleted file mode 100644
index d87862e..0000000
--- a/JOrtho_0.4_freeplane/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>JOrtho_0.4_freeplane</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/JOrtho_0.4_freeplane/.settings/org.eclipse.core.resources.prefs b/JOrtho_0.4_freeplane/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index b61bbd6..0000000
--- a/JOrtho_0.4_freeplane/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:58:06 CET 2010
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/JOrtho_0.4_freeplane/.settings/org.eclipse.core.runtime.prefs b/JOrtho_0.4_freeplane/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index 2ff1191..0000000
--- a/JOrtho_0.4_freeplane/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:58:06 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/JOrtho_0.4_freeplane/.settings/org.eclipse.jdt.core.prefs b/JOrtho_0.4_freeplane/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 14113a1..0000000
--- a/JOrtho_0.4_freeplane/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-#Mon Apr 13 10:16:19 CEST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/JOrtho_0.4_freeplane/build.gradle b/JOrtho_0.4_freeplane/build.gradle
new file mode 100644
index 0000000..62bd3d5
--- /dev/null
+++ b/JOrtho_0.4_freeplane/build.gradle
@@ -0,0 +1,45 @@
+// the JOrtho tests are currently broken
+test.enabled = false
+
+configurations {
+ ant_tasks
+}
+
+dependencies {
+ ant_tasks project(':freeplane_ant')
+}
+
+jar {
+ dependsOn 'check_translation'
+ baseName "jortho"
+}
+
+task format_translation(dependsOn: configurations.ant_tasks) << {
+ ant.taskdef(
+ name: "format_translation",
+ classname: "org.freeplane.ant.FormatTranslation",
+ classpath: configurations.ant_tasks.asPath
+ )
+
+ //TODO: Refer to resources in a better way. Should be able to get this from
+ //the source sets.
+ ant.format_translation(
+ dir: file("./src/main/resources/com/inet/jortho/i18n"),
+ includes: "*.properties",
+ eolstyle: "unix"
+ )
+}
+
+task check_translation(dependsOn: configurations.ant_tasks) << {
+ ant.taskdef(
+ name: "check_translation",
+ classname: "org.freeplane.ant.FormatTranslationCheck",
+ classpath: configurations.ant_tasks.asPath
+ )
+
+ ant.check_translation(
+ dir: file("./src/main/resources/com/inet/jortho/i18n"),
+ includes: "*.properties",
+ eolstyle: "unix"
+ )
+}
diff --git a/JOrtho_0.4_freeplane/build.xml b/JOrtho_0.4_freeplane/build.xml
deleted file mode 100644
index 1660b30..0000000
--- a/JOrtho_0.4_freeplane/build.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<project name="JOrtho" default="dist" basedir=".">
- <description>
- Ant build file for JOrtho as needed by Freeplane Debian package
- </description>
- <!-- set global properties for this build -->
- <property name="debug" value="true" />
- <property name="target" value="1.5" />
- <property name="source" value="1.5" />
- <property name="src" location="src" />
- <property name="build" location="build" />
- <property name="dist" location="dist" />
- <property name="jarver" value="0.4+fp1.1.1" />
- <property name="workspace" location=".." />
- <property name="freeplaneant.jar" value="${workspace}/freeplane_ant/dist/freeplaneant.jar" />
- <property name="eolstyle" value="unix" />
- <taskdef name="format-translation" classname="org.freeplane.ant.FormatTranslation" classpath="${freeplaneant.jar}" onerror="report" />
- <taskdef name="check-translation" classname="org.freeplane.ant.FormatTranslationCheck" classpath="${freeplaneant.jar}" onerror="report" />
-
- <target name="init">
- <!-- Create the time stamp -->
- <tstamp />
- <!-- Create the build directory structure used by compile -->
- <mkdir dir="${build}" />
- <copy includeemptydirs="false" todir="${build}">
- <fileset dir="src">
- <include name="**/*.properties" />
- </fileset>
- </copy>
- </target>
-
- <target name="compile" depends="init" description="compile the source ">
- <!-- Compile the java code from ${src} into ${build} -->
- <javac sourcepath="" srcdir="${src}" destdir="${build}" debug="${debug}" source="${source}" target="${target}">
- <include name="**/*.java" />
- <exclude name="**/jorthotests/**" />
- </javac>
- </target>
-
- <target name="jar" depends="check-translation, compile" description="generate the distribution">
- <!-- Create the distribution directory -->
- <mkdir dir="${dist}/lib" />
-
- <!-- Put everything in ${build} into the JOrtho-${jarver}.jar file -->
- <jar jarfile="${dist}/lib/jortho-${jarver}.jar">
- <fileset dir="${build}">
- <exclude name="**/*.jar" />
- <exclude name="**/jorthotests/**" />
- <exclude name="/*.*" />
- </fileset>
- </jar>
- </target>
-
- <target name="check-translation">
- <check-translation dir="${src}/com/inet/jortho/i18n" includes="*.properties" eolstyle="${eolstyle}" />
- </target>
- <target name="format-translation">
- <format-translation dir="${src}/com/inet/jortho/i18n" includes="*.properties" eolstyle="${eolstyle}" />
- </target>
- <target name="dist" depends="jar" description="generate the distribution" />
-
- <target name="clean" description="clean up">
- <!-- Delete the ${build} and ${dist} directory trees -->
- <delete dir="${build}" />
- <delete dir="${dist}" />
- </target>
-</project>
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerListener.java b/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerListener.java
deleted file mode 100644
index a7460a4..0000000
--- a/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerListener.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * JOrtho
- *
- * Copyright (C) 2005-2008 by i-net software
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA.
- *
- * Created on 25.02.2008
- */
-package com.inet.jortho;
-
-import java.awt.Component;
-import java.awt.Point;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.List;
-import java.util.Locale;
-
-import javax.swing.JComponent;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Caret;
-import javax.swing.text.Document;
-import javax.swing.text.JTextComponent;
-import javax.swing.text.Utilities;
-
-/**
- * Is used from CheckerMenu and CheckerPopup to handle the user events.
- * @author Volker Berlin
- */
-public class CheckerListener implements PopupMenuListener, LanguageChangeListener {
- private Dictionary dictionary;
- private Locale locale;
- private final JComponent menu;
- private final SpellCheckerOptions options;
-
- CheckerListener(final JComponent menu, final SpellCheckerOptions options) {
- this.menu = menu;
- this.options = options == null ? SpellChecker.getOptions() : options;
- SpellChecker.addLanguageChangeLister(this);
- dictionary = SpellChecker.getCurrentDictionary();
- locale = SpellChecker.getCurrentLocale();
- }
-
- public void languageChanged(final LanguageChangeEvent ev) {
- dictionary = SpellChecker.getCurrentDictionary();
- locale = SpellChecker.getCurrentLocale();
- }
-
- public void popupMenuCanceled(final PopupMenuEvent e) {
- /* empty */
- }
-
- public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
- /* empty */
- }
-
- public void popupMenuWillBecomeVisible(final PopupMenuEvent ev) {
- if (SpellChecker.getCurrentDictionary() == null) {
- menu.setEnabled(false);
- return;
- }
- final JPopupMenu popup = (JPopupMenu) ev.getSource();
- final Component invoker = popup.getInvoker();
- if (invoker instanceof JTextComponent) {
- final JTextComponent jText = (JTextComponent) invoker;
- if (!jText.isEditable()) {
- // Suggestions only for editable text components
- menu.setEnabled(false);
- return;
- }
- final Caret caret = jText.getCaret();
- int offs = Math.min(caret.getDot(), caret.getMark());
- final Point p = jText.getMousePosition();
- if (p != null) {
- // use position from mouse click and not from editor cursor position
- offs = jText.viewToModel(p);
- }
- try {
- final Document doc = jText.getDocument();
- if (offs > 0 && (offs >= doc.getLength() || Character.isWhitespace(doc.getText(offs, 1).charAt(0)))) {
- // if the next character is a white space then use the word on the left site
- offs--;
- }
- if (offs < 0) {
- // occur if there nothing under the mouse pointer
- menu.setEnabled(false);
- return;
- }
- // get the word from current position
- final int begOffs = Utilities.getWordStart(jText, offs);
- final int endOffs = Utilities.getWordEnd(jText, offs);
- final String word = jText.getText(begOffs, endOffs - begOffs);
- //find the first invalid word from current position
- final Tokenizer tokenizer = new Tokenizer(jText, dictionary, locale, offs, options);
- String invalidWord;
- do {
- invalidWord = tokenizer.nextInvalidWord();
- } while (tokenizer.getWordOffset() < begOffs);
- menu.removeAll();
- if (!word.equals(invalidWord)) {
- // the current word is not invalid
- menu.setEnabled(false);
- return;
- }
- if (dictionary == null) {
- // without dictionary it is disabled
- menu.setEnabled(false);
- return;
- }
- final List<Suggestion> list = dictionary.searchSuggestions(word);
- //Disable then menu item if there are no suggestions
- menu.setEnabled(list.size() > 0);
- final boolean needCapitalization = tokenizer.isFirstWordInSentence() && Utils.isFirstCapitalized(word);
- for (int i = 0; i < list.size() && i < options.getSuggestionsLimitMenu(); i++) {
- final Suggestion sugestion = list.get(i);
- String sugestionWord = sugestion.getWord();
- if (needCapitalization) {
- sugestionWord = Utils.getCapitalized(sugestionWord);
- }
- final JMenuItem item = new JMenuItem(sugestionWord);
- menu.add(item);
- final String newWord = sugestionWord;
- item.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- jText.setSelectionStart(begOffs);
- jText.setSelectionEnd(endOffs);
- jText.replaceSelection(newWord);
- }
- });
- }
- final UserDictionaryProvider provider = SpellChecker.getUserDictionaryProvider();
- if (provider == null) {
- return;
- }
- final JMenuItem addToDic = new JMenuItem(Utils.getResource("addToDictionary"));
- addToDic.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- final UserDictionaryProvider provider = SpellChecker.getUserDictionaryProvider();
- if (provider != null) {
- provider.addWord(word);
- }
- dictionary.add(word);
- dictionary.trimToSize();
- AutoSpellChecker.refresh(jText);
- }
- });
- if (list.size() > 0) {
- if (menu instanceof JMenu) {
- ((JMenu) menu).addSeparator();
- }
- else if (menu instanceof JPopupMenu) {
- ((JPopupMenu) menu).addSeparator();
- }
- }
- menu.add(addToDic);
- menu.setEnabled(true);
- }
- catch (final BadLocationException ex) {
- ex.printStackTrace();
- }
- }
- }
-}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_cs.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_cs.properties
deleted file mode 100644
index a16ec3e..0000000
--- a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_cs.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-addDictionaries=P\u0159idat slovn\u00edky...
-addToDictionary=P\u0159idat do slovn\u00edku
-change=Zam\u011bnit
-changeAll=Zam\u011b\u0148ovat
-close=Storno
-delete=Odstranit
-editDictionary=Upravit slovn\u00edk
-ignore=P\u0159esko\u010dit
-ignoreAll=P\u0159eskakovat
-languages=Jazyky
-msgFinish=Kontrola pravopisu je dokon\u010dena.
-notInDictionary=Nen\u00ed ve slovn\u00edku
-spelling=Pravopis
-suggestions=N\u00e1vrhy
-userDictionary=U\u017eivatelsk\u00fd slovn\u00edk
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_de.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_de.properties
deleted file mode 100644
index 9005465..0000000
--- a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_de.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-addDictionaries=W?rterb\u00fccher hinzuf\u00fcgen...
-addToDictionary=Zum W?rterbuch hinzuf\u00fcgen
-change=\u00c4ndern
-changeAll=Alle \u00e4ndern
-close=Schlie\u00dfen
-delete=L\u00f6schen
-disable=Keine Pr\u00fcfung
-editDictionary=W\u00f6rterbuch bearbeiten
-ignore=Einmal ignorieren
-ignoreAll=Alle ignorieren
-languages=Sprachen
-msgFinish=Die Rechtschreibpr\u00fcfung ist abgeschlossen.
-notInDictionary=Nicht im W\u00f6rterbuch
-spelling=Rechtschreibung
-suggestions=Vorschl\u00e4ge
-userDictionary=Benutzerw\u00f6rterbuch
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_es.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_es.properties
deleted file mode 100644
index 8853b28..0000000
--- a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_es.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-addDictionaries=A\u00f1adir diccionarios
-addToDictionary=A\u00f1ada al diccionario
-change=Cambia
-changeAll=Cambia todo
-close=Cerrar
-delete=Borrar
-editDictionary=Editar diccionario
-ignore=Ignora una vez
-ignoreAll=Ignora todo
-languages=Idiomas
-msgFinish=El corrector ortogr\u00e1fico termin\u00f3
-notInDictionary=No est\u00e1 en el diccionario
-spelling=Deletreando
-suggestions=Sugerencias
-userDictionary=Diccionario de usario
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_es_MX.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_es_MX.properties
deleted file mode 100644
index 8853b28..0000000
--- a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_es_MX.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-addDictionaries=A\u00f1adir diccionarios
-addToDictionary=A\u00f1ada al diccionario
-change=Cambia
-changeAll=Cambia todo
-close=Cerrar
-delete=Borrar
-editDictionary=Editar diccionario
-ignore=Ignora una vez
-ignoreAll=Ignora todo
-languages=Idiomas
-msgFinish=El corrector ortogr\u00e1fico termin\u00f3
-notInDictionary=No est\u00e1 en el diccionario
-spelling=Deletreando
-suggestions=Sugerencias
-userDictionary=Diccionario de usario
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_fr.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_fr.properties
deleted file mode 100644
index e133072..0000000
--- a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_fr.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-addDictionaries=Ajouter au dictionnaire
-addToDictionary=Ajouter au dictionnaire
-change=Changer
-changeAll=Changer tout
-close=Fermer
-delete=Effacer
-editDictionary=\u00c9diter le dictionnaire
-ignore=Ignorer une fois
-ignoreAll=Ignorer tous
-languages=Langues
-msgFinish=La v\u00e9rification de l\u2019orthographe est termin\u00e9e.
-notInDictionary=Pas dans le dictionnaire
-spelling=Orthographe
-suggestions=Propositions
-userDictionary=Dictionnaire d\u2019usage
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_hr.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_hr.properties
deleted file mode 100644
index e91ea8b..0000000
--- a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_hr.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-addDictionaries=Dodaj rje\u010dnike...
-addToDictionary=Dodaj u rje\u010dnik
-change=Promijeni
-changeAll=Promijeni sve
-close=Zatvori
-delete=Obri\u0161i
-disable=Onemogu\u0107i provjeru pravopisa
-editDictionary=Uredi rje\u010dnik
-ignore=Zanemari jednom
-ignoreAll=Zanemari sve
-languages=Jezici
-msgFinish=Provjera pravopisa je zavr\u0161ena.
-notInDictionary=Nije u rje\u010dniku
-spelling=Provjera pravopisa
-suggestions=Prijedlozi
-userDictionary=Korisni\u010dki rje\u010dnik
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_pl.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_pl.properties
deleted file mode 100644
index 6de4edd..0000000
--- a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_pl.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-addDictionaries=Dodaj s\u0142owniki...
-addToDictionary=Dodaj do s\u0142ownika
-change=Zmie\u0144
-changeAll=Zmie\u0144 wszystkie
-close=Zamknij
-delete=Usu\u0144
-editDictionary=Edytuj s\u0142ownik
-ignore=Ignoruj raz
-ignoreAll=Ignoruj wszystkie
-languages=J\u0119zyk
-msgFinish=Zako\u0144czono sprawdzanie.
-notInDictionary=Nie ma w s\u0142owniku
-spelling=Pisownia
-suggestions=Propozycje
-userDictionary=S\u0142ownik u\u017cytkownika
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_ru.properties b/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_ru.properties
deleted file mode 100644
index 06790b2..0000000
--- a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_ru.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-addDictionaries=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u0438\u2026
-addToDictionary=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0441\u043b\u043e\u0432\u0430\u0440\u044e
-change=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c
-changeAll=\u0412\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c
-close=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
-delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
-editDictionary=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u044c
-ignore=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-ignoreAll=\u0412\u0441\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-languages=\u042f\u0437\u044b\u043a\u0438
-msgFinish=\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u0430.
-notInDictionary=\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435
-spelling=\u041f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435
-suggestions=\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f
-userDictionary=\u0421\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
diff --git a/JOrtho_0.4_freeplane/src/SampleApplet.java b/JOrtho_0.4_freeplane/src/main/java/SampleApplet.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/SampleApplet.java
rename to JOrtho_0.4_freeplane/src/main/java/SampleApplet.java
diff --git a/JOrtho_0.4_freeplane/src/SampleApplication.java b/JOrtho_0.4_freeplane/src/main/java/SampleApplication.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/SampleApplication.java
rename to JOrtho_0.4_freeplane/src/main/java/SampleApplication.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/AutoSpellChecker.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/AutoSpellChecker.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/AutoSpellChecker.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/AutoSpellChecker.java
diff --git a/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/CheckerListener.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/CheckerListener.java
new file mode 100644
index 0000000..7ffb1d9
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/CheckerListener.java
@@ -0,0 +1,181 @@
+/*
+ * JOrtho
+ *
+ * Copyright (C) 2005-2008 by i-net software
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ * USA.
+ *
+ * Created on 25.02.2008
+ */
+package com.inet.jortho;
+
+import java.awt.Component;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
+import java.util.Locale;
+
+import javax.swing.JComponent;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Caret;
+import javax.swing.text.Document;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Utilities;
+
+/**
+ * Is used from CheckerMenu and CheckerPopup to handle the user events.
+ * @author Volker Berlin
+ */
+public class CheckerListener implements PopupMenuListener, LanguageChangeListener {
+ private Dictionary dictionary;
+ private Locale locale;
+ private final JComponent menu;
+ private final SpellCheckerOptions options;
+
+ CheckerListener(final JComponent menu, final SpellCheckerOptions options) {
+ this.menu = menu;
+ this.options = options == null ? SpellChecker.getOptions() : options;
+ SpellChecker.addLanguageChangeLister(this);
+ dictionary = SpellChecker.getCurrentDictionary();
+ locale = SpellChecker.getCurrentLocale();
+ }
+
+ public void languageChanged(final LanguageChangeEvent ev) {
+ dictionary = SpellChecker.getCurrentDictionary();
+ locale = SpellChecker.getCurrentLocale();
+ }
+
+ public void popupMenuCanceled(final PopupMenuEvent e) {
+ /* empty */
+ }
+
+ public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
+ /* empty */
+ }
+
+ public void popupMenuWillBecomeVisible(final PopupMenuEvent ev) {
+ if (dictionary == null || locale == null) {
+ menu.setEnabled(false);
+ return;
+ }
+ final JPopupMenu popup = (JPopupMenu) ev.getSource();
+ final Component invoker = popup.getInvoker();
+ if (invoker instanceof JTextComponent) {
+ final JTextComponent jText = (JTextComponent) invoker;
+ if (!jText.isEditable()) {
+ // Suggestions only for editable text components
+ menu.setEnabled(false);
+ return;
+ }
+ final Caret caret = jText.getCaret();
+ int offs = Math.min(caret.getDot(), caret.getMark());
+ final Point p = jText.getMousePosition();
+ if (p != null) {
+ // use position from mouse click and not from editor cursor position
+ offs = jText.viewToModel(p);
+ }
+ try {
+ final Document doc = jText.getDocument();
+ if (offs > 0 && (offs >= doc.getLength() || Character.isWhitespace(doc.getText(offs, 1).charAt(0)))) {
+ // if the next character is a white space then use the word on the left site
+ offs--;
+ }
+ if (offs < 0) {
+ // occur if there nothing under the mouse pointer
+ menu.setEnabled(false);
+ return;
+ }
+ // get the word from current position
+ final int begOffs = Utilities.getWordStart(jText, offs);
+ final int endOffs = Utilities.getWordEnd(jText, offs);
+ final String word = jText.getText(begOffs, endOffs - begOffs);
+ //find the first invalid word from current position
+ final Tokenizer tokenizer = new Tokenizer(jText, dictionary, locale, offs, options);
+ String invalidWord;
+ do {
+ invalidWord = tokenizer.nextInvalidWord();
+ } while (tokenizer.getWordOffset() < begOffs);
+ menu.removeAll();
+ if (!word.equals(invalidWord)) {
+ // the current word is not invalid
+ menu.setEnabled(false);
+ return;
+ }
+ if (dictionary == null) {
+ // without dictionary it is disabled
+ menu.setEnabled(false);
+ return;
+ }
+ final List<Suggestion> list = dictionary.searchSuggestions(word);
+ //Disable then menu item if there are no suggestions
+ menu.setEnabled(list.size() > 0);
+ final boolean needCapitalization = tokenizer.isFirstWordInSentence() && Utils.isFirstCapitalized(word);
+ for (int i = 0; i < list.size() && i < options.getSuggestionsLimitMenu(); i++) {
+ final Suggestion sugestion = list.get(i);
+ String sugestionWord = sugestion.getWord();
+ if (needCapitalization) {
+ sugestionWord = Utils.getCapitalized(sugestionWord);
+ }
+ final JMenuItem item = new JMenuItem(sugestionWord);
+ menu.add(item);
+ final String newWord = sugestionWord;
+ item.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ jText.setSelectionStart(begOffs);
+ jText.setSelectionEnd(endOffs);
+ jText.replaceSelection(newWord);
+ }
+ });
+ }
+ final UserDictionaryProvider provider = SpellChecker.getUserDictionaryProvider();
+ if (provider == null) {
+ return;
+ }
+ final JMenuItem addToDic = new JMenuItem(Utils.getResource("addToDictionary"));
+ addToDic.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ final UserDictionaryProvider provider = SpellChecker.getUserDictionaryProvider();
+ if (provider != null) {
+ provider.addWord(word);
+ }
+ dictionary.add(word);
+ dictionary.trimToSize();
+ AutoSpellChecker.refresh(jText);
+ }
+ });
+ if (list.size() > 0) {
+ if (menu instanceof JMenu) {
+ ((JMenu) menu).addSeparator();
+ }
+ else if (menu instanceof JPopupMenu) {
+ ((JPopupMenu) menu).addSeparator();
+ }
+ }
+ menu.add(addToDic);
+ menu.setEnabled(true);
+ }
+ catch (final BadLocationException ex) {
+ ex.printStackTrace();
+ }
+ }
+ }
+}
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerMenu.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/CheckerMenu.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerMenu.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/CheckerMenu.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerPopup.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/CheckerPopup.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/CheckerPopup.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/CheckerPopup.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Dictionary.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Dictionary.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/Dictionary.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Dictionary.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryBase.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/DictionaryBase.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryBase.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/DictionaryBase.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryEditDialog.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/DictionaryEditDialog.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryEditDialog.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/DictionaryEditDialog.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryFactory.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/DictionaryFactory.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/DictionaryFactory.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/DictionaryFactory.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/FileUserDictionary.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/FileUserDictionary.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/FileUserDictionary.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/FileUserDictionary.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeEvent.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/LanguageChangeEvent.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeEvent.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/LanguageChangeEvent.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeListener.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/LanguageChangeListener.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/LanguageChangeListener.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/LanguageChangeListener.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/LetterBasedBreakIterator.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/LetterBasedBreakIterator.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/LetterBasedBreakIterator.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/LetterBasedBreakIterator.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/PopupListener.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/PopupListener.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/PopupListener.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/PopupListener.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/RedZigZagPainter.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/RedZigZagPainter.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/RedZigZagPainter.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/RedZigZagPainter.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellChecker.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/SpellChecker.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/SpellChecker.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/SpellChecker.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerDialog.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/SpellCheckerDialog.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerDialog.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/SpellCheckerDialog.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerOptions.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/SpellCheckerOptions.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/SpellCheckerOptions.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/SpellCheckerOptions.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestion.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Suggestion.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestion.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Suggestion.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestions.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Suggestions.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/Suggestions.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Suggestions.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Tokenizer.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Tokenizer.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/Tokenizer.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Tokenizer.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/UserDictionaryProvider.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/UserDictionaryProvider.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/UserDictionaryProvider.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/UserDictionaryProvider.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/Utils.java b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Utils.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/Utils.java
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/Utils.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/icon.png b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/icon.png
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/icon.png
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/icon.png
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/package.html b/JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/package.html
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/package.html
rename to JOrtho_0.4_freeplane/src/main/java/com/inet/jortho/package.html
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource.properties
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource.properties
rename to JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource.properties
diff --git a/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_cs.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_cs.properties
new file mode 100644
index 0000000..9fec511
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_cs.properties
@@ -0,0 +1,15 @@
+addDictionaries=P\u0159idat slovn\u00EDky...
+addToDictionary=P\u0159idat do slovn\u00EDku
+change=Zam\u011Bnit
+changeAll=Zam\u011B\u0148ovat
+close=Storno
+delete=Odstranit
+editDictionary=Upravit slovn\u00EDk
+ignore=P\u0159esko\u010Dit
+ignoreAll=P\u0159eskakovat
+languages=Jazyky
+msgFinish=Kontrola pravopisu je dokon\u010Dena.
+notInDictionary=Nen\u00ED ve slovn\u00EDku
+spelling=Pravopis
+suggestions=N\u00E1vrhy
+userDictionary=U\u017Eivatelsk\u00FD slovn\u00EDk
diff --git a/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_de.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_de.properties
new file mode 100644
index 0000000..c11164a
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_de.properties
@@ -0,0 +1,16 @@
+addDictionaries=W?rterb\u00FCcher hinzuf\u00FCgen...
+addToDictionary=Zum W?rterbuch hinzuf\u00FCgen
+change=\u00C4ndern
+changeAll=Alle \u00E4ndern
+close=Schlie\u00DFen
+delete=L\u00F6schen
+disable=Keine Pr\u00FCfung
+editDictionary=W\u00F6rterbuch bearbeiten
+ignore=Einmal ignorieren
+ignoreAll=Alle ignorieren
+languages=Sprachen
+msgFinish=Die Rechtschreibpr\u00FCfung ist abgeschlossen.
+notInDictionary=Nicht im W\u00F6rterbuch
+spelling=Rechtschreibung
+suggestions=Vorschl\u00E4ge
+userDictionary=Benutzerw\u00F6rterbuch
diff --git a/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_es.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_es.properties
new file mode 100644
index 0000000..7c15ead
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_es.properties
@@ -0,0 +1,15 @@
+addDictionaries=A\u00F1adir diccionarios
+addToDictionary=A\u00F1ada al diccionario
+change=Cambia
+changeAll=Cambia todo
+close=Cerrar
+delete=Borrar
+editDictionary=Editar diccionario
+ignore=Ignora una vez
+ignoreAll=Ignora todo
+languages=Idiomas
+msgFinish=El corrector ortogr\u00E1fico termin\u00F3
+notInDictionary=No est\u00E1 en el diccionario
+spelling=Deletreando
+suggestions=Sugerencias
+userDictionary=Diccionario de usario
diff --git a/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_es_MX.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_es_MX.properties
new file mode 100644
index 0000000..7c15ead
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_es_MX.properties
@@ -0,0 +1,15 @@
+addDictionaries=A\u00F1adir diccionarios
+addToDictionary=A\u00F1ada al diccionario
+change=Cambia
+changeAll=Cambia todo
+close=Cerrar
+delete=Borrar
+editDictionary=Editar diccionario
+ignore=Ignora una vez
+ignoreAll=Ignora todo
+languages=Idiomas
+msgFinish=El corrector ortogr\u00E1fico termin\u00F3
+notInDictionary=No est\u00E1 en el diccionario
+spelling=Deletreando
+suggestions=Sugerencias
+userDictionary=Diccionario de usario
diff --git a/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_fr.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_fr.properties
new file mode 100644
index 0000000..01a25ea
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_fr.properties
@@ -0,0 +1,15 @@
+addDictionaries=Ajouter au dictionnaire
+addToDictionary=Ajouter au dictionnaire
+change=Changer
+changeAll=Changer tout
+close=Fermer
+delete=Effacer
+editDictionary=\u00C9diter le dictionnaire
+ignore=Ignorer une fois
+ignoreAll=Ignorer tous
+languages=Langues
+msgFinish=La v\u00E9rification de l\u2019orthographe est termin\u00E9e.
+notInDictionary=Pas dans le dictionnaire
+spelling=Orthographe
+suggestions=Propositions
+userDictionary=Dictionnaire d\u2019usage
diff --git a/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_hr.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_hr.properties
new file mode 100644
index 0000000..b677e47
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_hr.properties
@@ -0,0 +1,16 @@
+addDictionaries=Dodaj rje\u010Dnike...
+addToDictionary=Dodaj u rje\u010Dnik
+change=Promijeni
+changeAll=Promijeni sve
+close=Zatvori
+delete=Obri\u0161i
+disable=Onemogu\u0107i provjeru pravopisa
+editDictionary=Uredi rje\u010Dnik
+ignore=Zanemari jednom
+ignoreAll=Zanemari sve
+languages=Jezici
+msgFinish=Provjera pravopisa je zavr\u0161ena.
+notInDictionary=Nije u rje\u010Dniku
+spelling=Provjera pravopisa
+suggestions=Prijedlozi
+userDictionary=Korisni\u010Dki rje\u010Dnik
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_it.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_it.properties
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_it.properties
rename to JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_it.properties
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_nl.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_nl.properties
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_nl.properties
rename to JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_nl.properties
diff --git a/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_pl.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_pl.properties
new file mode 100644
index 0000000..74aa2f2
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_pl.properties
@@ -0,0 +1,15 @@
+addDictionaries=Dodaj s\u0142owniki...
+addToDictionary=Dodaj do s\u0142ownika
+change=Zmie\u0144
+changeAll=Zmie\u0144 wszystkie
+close=Zamknij
+delete=Usu\u0144
+editDictionary=Edytuj s\u0142ownik
+ignore=Ignoruj raz
+ignoreAll=Ignoruj wszystkie
+languages=J\u0119zyk
+msgFinish=Zako\u0144czono sprawdzanie.
+notInDictionary=Nie ma w s\u0142owniku
+spelling=Pisownia
+suggestions=Propozycje
+userDictionary=S\u0142ownik u\u017Cytkownika
diff --git a/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_ru.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_ru.properties
new file mode 100644
index 0000000..5685b1c
--- /dev/null
+++ b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_ru.properties
@@ -0,0 +1,15 @@
+addDictionaries=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u043B\u043E\u0432\u0430\u0440\u0438\u2026
+addToDictionary=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043A \u0441\u043B\u043E\u0432\u0430\u0440\u044E
+change=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C
+changeAll=\u0412\u0441\u0435 \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C
+close=\u0417\u0430\u043A\u0440\u044B\u0442\u044C
+delete=\u0423\u0434\u0430\u043B\u0438\u0442\u044C
+editDictionary=\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0441\u043B\u043E\u0432\u0430\u0440\u044C
+ignore=\u0418\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C
+ignoreAll=\u0412\u0441\u0435 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C
+languages=\u042F\u0437\u044B\u043A\u0438
+msgFinish=\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u0440\u0430\u0432\u043E\u043F\u0438\u0441\u0430\u043D\u0438\u044F \u0437\u0430\u043A\u043E\u043D\u0447\u0435\u043D\u0430.
+notInDictionary=\u041E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u0441\u043B\u043E\u0432\u0430\u0440\u0435
+spelling=\u041F\u0440\u0430\u0432\u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435
+suggestions=\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u044F
+userDictionary=\u0421\u043B\u043E\u0432\u0430\u0440\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_sk.properties b/JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_sk.properties
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jortho/i18n/resource_sk.properties
rename to JOrtho_0.4_freeplane/src/main/resources/com/inet/jortho/i18n/resource_sk.properties
diff --git a/JOrtho_0.4_freeplane/src/dictionaries.cnf b/JOrtho_0.4_freeplane/src/main/resources/dictionaries.cnf
similarity index 100%
rename from JOrtho_0.4_freeplane/src/dictionaries.cnf
rename to JOrtho_0.4_freeplane/src/main/resources/dictionaries.cnf
diff --git a/JOrtho_0.4_freeplane/src/main/resources/dictionary_en.ortho b/JOrtho_0.4_freeplane/src/main/resources/dictionary_en.ortho
new file mode 100644
index 0000000..bb5d8f6
Binary files /dev/null and b/JOrtho_0.4_freeplane/src/main/resources/dictionary_en.ortho differ
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jorthotests/AllTests.java b/JOrtho_0.4_freeplane/src/test/java/com/inet/jorthotests/AllTests.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jorthotests/AllTests.java
rename to JOrtho_0.4_freeplane/src/test/java/com/inet/jorthotests/AllTests.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jorthotests/EventTest.java b/JOrtho_0.4_freeplane/src/test/java/com/inet/jorthotests/EventTest.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jorthotests/EventTest.java
rename to JOrtho_0.4_freeplane/src/test/java/com/inet/jorthotests/EventTest.java
diff --git a/JOrtho_0.4_freeplane/src/com/inet/jorthotests/MemoryTest.java b/JOrtho_0.4_freeplane/src/test/java/com/inet/jorthotests/MemoryTest.java
similarity index 100%
rename from JOrtho_0.4_freeplane/src/com/inet/jorthotests/MemoryTest.java
rename to JOrtho_0.4_freeplane/src/test/java/com/inet/jorthotests/MemoryTest.java
diff --git a/bin.dist.gradle b/bin.dist.gradle
new file mode 100644
index 0000000..820b146
--- /dev/null
+++ b/bin.dist.gradle
@@ -0,0 +1,24 @@
+task binZip(type: Zip) {
+ destinationDir = new File(globalDist)
+ archiveName = 'freeplane_bin-' + distVersion + '.zip'
+
+ from(globalBuild) {
+ include('**')
+ exclude('freeplane.sh')
+ }
+
+ from(globalBuild) {
+ include('freeplane.sh')
+ fileMode = 0755
+ }
+
+ from(rootDir) {
+ include('license.txt')
+ }
+
+ into('freeplane-' + distVersion)
+
+ for (p in subprojects) {
+ dependsOn p.tasks.getByPath("build")
+ }
+}
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..751a1bf
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,251 @@
+allprojects {
+ // in a multi-project setup, all projects must have the same version number!
+ // the real (specific) version number is in freeplane/viewer-resources/version.properties!
+ version = '1.5'
+
+ // WARNING: this is removed with "gradle clean"!!
+ ext.globalBuild = rootDir.path + '/BUILD'
+
+ repositories {
+ maven { url "http://dl.bintray.com/freeplane/freeplane" }
+ // this is necessary to grab both binary and source jars
+ // for local (git) dependencies
+ flatDir name: 'localGitDepsRepository',
+ dirs: [rootDir.path + "/freeplane/lib",
+ rootDir.path + "/freeplane_plugin_jsyntaxpane/lib",
+ rootDir.path + "/freeplane_plugin_svg/lib"]
+ }
+
+}
+
+// this is used for (linux) packages, where the dependencies
+// live on the file system (/usr/share/java/*.jar on Debian):
+def externalizeJar(File jar) {
+ // do not externalize, jars are copied over to /BUILD
+ // in development workflow!
+ return "lib/${jar.name}"
+}
+
+// this is overridden in linux packages where this might be named
+// knopflerfish-framework.jar
+def isKnopflerfishJar(fileName) {
+ return fileName.startsWith('framework-') &&
+ fileName.endsWith('.jar');
+}
+
+def filterAndExternalizePluginDependencies(runtime_files) {
+ return runtime_files.findAll {
+ File file -> !isKnopflerfishJar(file.name)
+ }.findAll {
+ File file ->
+ file.name != "freeplane-${project.version}.jar" &&
+ !(file.name.startsWith('freeplane_plugin_') &&
+ file.name.endsWith('-' + project.version + '.jar'))
+ }.collect {
+ File file -> externalizeJar(file)
+ }
+}
+
+// we need this filter to convert i.e.:
+// lib/foo, li
+// b/bar
+// TO:
+// lib/foo, lib/bar
+// !
+class UnwrapManifestFilter extends FilterReader {
+ UnwrapManifestFilter(Reader input) {
+ super(new StringReader(input.text.replace("\r\n ", "").replace("\n ", "").replace("\r ", "")))
+ }
+}
+
+subprojects {
+ apply plugin: 'java'
+ apply plugin: 'eclipse'
+ apply plugin: 'idea'
+
+ targetCompatibility='1.7'
+ sourceCompatibility='1.7'
+
+
+ tasks.withType(JavaCompile) {
+ options.encoding = "UTF-8"
+ }
+ javadoc {
+ options.encoding = "UTF-8"
+ enabled = false
+ failOnError = false
+ }
+
+ repositories {
+ maven {
+ url "http://repo1.maven.org/maven2"
+ }
+ }
+
+ dependencies {
+ testCompile group: 'junit', name: 'junit', version: '4.11'
+ }
+
+ task copyEclipseSettings(type: Copy) {
+ from(rootDir.path + "/freeplane_framework/eclipse/settings-templates/") {
+ include("*.prefs")
+ }
+ into(project.file(".settings/"))
+ }
+ eclipseJdt.dependsOn copyEclipseSettings
+
+ task cleanEclipseSettings(type: Delete) {
+ delete(project.file(".settings"))
+ }
+ cleanEclipseJdt.dependsOn cleanEclipseSettings
+}
+
+// OSGi projects (/plugin/, freeplane) need this for compilation (e.g. resolve Bundle),
+// and freeplane_framework needs to copy it to BUILD/framework.jar
+configure(subprojects.findAll {it.name =~ /plugin/ || it.name =~ /^freeplane$/ || it.name =~ /^freeplane_framework$/}){
+ repositories {
+ maven {
+ url 'http://www.knopflerfish.org/maven2/'
+ }
+ }
+
+ dependencies {
+ compile group: 'org.knopflerfish', name:'framework', version: '7.1.2'
+ }
+}
+
+// common configuration for all OSGi projects...
+configure(subprojects.findAll {it.name =~ /plugin/ || it.name =~ /^freeplane$/ }) {
+ apply plugin: 'osgi'
+
+ if (project.name.equals("freeplane"))
+ ext.pluginid = 'org.freeplane.core'
+ else
+ ext.pluginid = project.name.replace("freeplane_plugin_", "org.freeplane.plugin.")
+
+ task copyDeps(type: Copy) {
+ from project.configurations.runtime
+ into "$buildDir/libs"
+ }
+ jar.dependsOn copyDeps
+
+ task filterOSGiManifestForEclipse(type: Copy) {
+ from('build/tmp/jar/MANIFEST.MF') {
+ }
+ into('META-INF/')
+ // unwrap each header
+ filter UnwrapManifestFilter
+ // replace path for dependencies
+ filter { line -> line.replace("lib/", "build/libs/") }
+ // re-wrap each header (TODO: use CRLF?)
+ filter { line -> line.replace(",", ",\n ") }
+ }
+ filterOSGiManifestForEclipse.dependsOn jar
+ build.dependsOn filterOSGiManifestForEclipse
+
+ task cleanOSGiManifestForEclipse(type: Delete) {
+ delete "META-INF/MANIFEST.MF"
+ }
+ clean.dependsOn cleanOSGiManifestForEclipse
+
+ // fix eclipse classpath: artifacts to be Export-Package:'d need
+ // to be referenced from build/libs (and not from ~/.gradle/caches)
+ eclipse.classpath.file {
+ whenMerged { classpath ->
+ for (entry in classpath.entries)
+ {
+ if (entry.getKind().equals('lib'))
+ {
+ def jarName = new File(entry.path).name
+ def localDep = project.configurations.runtime.files.any { it.name.equals(jarName) }
+ if (localDep)
+ {
+ entry.path = "build/libs/" + jarName
+ }
+ }
+ }
+ return classpath
+ }
+ }
+
+ //Configure plugins as eclipse-plugins.
+ eclipse.project {
+ buildCommand 'org.eclipse.pde.SchemaBuilder'
+ natures 'org.eclipse.pde.PluginNature'
+ }
+}
+
+// common configuration for all plugins...
+configure(subprojects.findAll {it.name =~ /plugin/ }) {
+
+ task copyOSGiJars(type: Copy) {
+ from ("$buildDir/libs") {
+ include("*.jar")
+ // TODO: this is redundant with regard to 'filterPluginDeps' (see above)!
+ exclude('framework-*.jar')
+ exclude('knopflerfish-framework*.jar')
+ exclude('freeplane-' + project.version + '.jar')
+ exclude('freeplane_plugin_*-' + project.version + '.jar')
+ }
+ from ('lib') {
+ include("*.jar")
+ exclude('*-sources.jar')
+ }
+ into(globalBuild + '/plugins/' + pluginid + '/lib/')
+ }
+
+ task copyOSGiManifest(type: Copy) {
+ from ("$buildDir/tmp/jar/") {
+ include("MANIFEST.MF")
+ }
+ into(globalBuild + '/plugins/' + pluginid + '/META-INF/')
+ }
+
+ build.dependsOn copyOSGiJars
+ build.dependsOn copyOSGiManifest
+
+ // create a separate non-OSGi(!) jar for each plugin!
+ task pluginJar(type: Jar) {
+ baseName = 'plugin'
+ dependsOn classes
+
+ from (sourceSets.main.output) {
+ include("**")
+ }
+ // unfortunately some resource (xml,properties) files (e.g. preferences.xml in latex plugin)
+ // are in src/main/java...
+ from (sourceSets.main.allSource) {
+ include("**/*.xml")
+ include("**/*.properties")
+ }
+ includeEmptyDirs = false
+
+ // use a non-OSGi manifest (this jar is referenced from an OSGi bundle)!
+ project.manifest { }
+ }
+
+ // jar must execute after pluginJar so that the OSGi manifest can still be
+ // picked up from build/tmp/jar (and isn't overwritten by plugin*.jar's non-OSGi
+ // manifest!)
+ jar.dependsOn pluginJar
+}
+
+apply plugin: 'base' // necessary to get the global 'clean' task
+
+// remove globalBuild/**
+task cleanBUILD(type: Delete) {
+ delete globalBuild
+}
+clean.dependsOn(cleanBUILD)
+
+task check_translation {
+ dependsOn ':JOrtho_0.4_freeplane:check_translation'
+ dependsOn ':freeplane:check_translation'
+}
+task format_translation {
+ dependsOn ':JOrtho_0.4_freeplane:format_translation'
+ dependsOn ':freeplane:format_translation'
+}
+
+apply from: './dist.gradle'
+apply from: './jdt-config.gradle'
diff --git a/build.xml b/build.xml
deleted file mode 100644
index 1bbe2f6..0000000
--- a/build.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<project name="GlobalFreeplane" default="dist" basedir=".">
-
- <target name="build">
- <ant antfile="freeplane_framework/ant/build.xml" target="build" inheritAll="false" />
- </target>
-
- <target name="dist">
- <ant antfile="freeplane_framework/ant/build.xml" target="dist" inheritAll="false" />
- </target>
- <target name="format-translation">
- <ant antfile="JOrtho_0.4_freeplane/build.xml" target="format-translation" inheritAll="false" />
- <ant antfile="freeplane_framework/ant/build.xml" target="format-translation" inheritAll="false" />
- </target>
-
- <target name="clean">
- <ant antfile="freeplane_framework/ant/build.xml" target="clean" inheritAll="false" />
-
- <ant antfile="freeplane_ant/build.xml" target="clean" inheritAll="false" />
-
- <ant antfile="JOrtho_0.4_freeplane/build.xml" target="clean" inheritAll="false" />
- </target>
-
- <target name="cleandist" depends="clean, dist">
- </target>
-
- <target name="release" depends="clean, dist, tag-release" />
-
- <target name="tag-release">
- <property file="freeplane/viewer-resources/version.properties" />
-
- <condition property="preview_suffix" value="-pre${minor}" else="">
- <isset property="minor" />
- </condition>
-
- <condition property="tag.release"
- value="release-${freeplane_version}${preview_suffix}"
- else="${freeplane_version_status}-${freeplane_version}${preview_suffix}">
- <equals arg1="${freeplane_version_status}" arg2="" />
- </condition>
-
- <echo>Press enter to tag '${tag.release}'</echo>
- <input />
-
- <echo>Running git tag -m '' ${tag.release}</echo>
-
- <exec executable="git" failonerror="true">
- <arg value="tag" />
- <arg value="-m ''" />
- <arg value="${tag.release}" />
- </exec>
- </target>
-
- <target name="create-plugin">
- <ant antfile="freeplane_framework/ant/build.xml" target="create-plugin" inheritAll="false" />
- </target>
-</project>
diff --git a/dist.gradle b/dist.gradle
new file mode 100644
index 0000000..fbb9324
--- /dev/null
+++ b/dist.gradle
@@ -0,0 +1,69 @@
+ext.globalDist = rootDir.path + '/DIST'
+
+Properties props = new Properties()
+props.load(new FileInputStream(rootDir.path + '/freeplane/viewer-resources/version.properties'))
+
+ext.majorVersion = props['freeplane_version']
+ext.versionStatus = props['freeplane_version_status']
+ext.minorVersion = System.getProperty('minor', '')
+ext.distVersion = "$majorVersion${versionStatus.empty?'':'-'+versionStatus}${minorVersion.empty?'':'-pre' + minorVersion}"
+
+task gitinfoDist(type: Copy) {
+ from(globalBuild) {
+ include('gitinfo.txt')
+ }
+ from(globalBuild + '/resources') {
+ include('gitinfo.properties')
+ }
+ into(globalDist)
+
+ for (p in subprojects) {
+ dependsOn p.tasks.getByPath("build")
+ }
+}
+
+task historyDist(type:Copy) {
+ from(rootDir.path + '/freeplane/doc'){
+ include 'history_en.txt'
+ }
+ into(globalDist)
+}
+
+apply from: './mac.dist.gradle'
+apply from: './win.dist.gradle'
+apply from: './bin.dist.gradle'
+apply from: './src.dist.gradle'
+
+// meta task
+task dist {
+ dependsOn binZip
+ dependsOn srcTarGz
+ dependsOn srcpureTarGz
+ dependsOn windowsInstaller
+ dependsOn windowsPortableInstaller
+ dependsOn macDist
+ dependsOn gitinfoDist
+ dependsOn historyDist
+}
+
+// clean
+task cleanDist(type: Delete) {
+ delete globalDist
+}
+clean.dependsOn cleanDist
+
+task createGitTag(type: Exec) {
+ def tag = "${versionStatus.empty ? 'release':versionStatus}-$majorVersion${minorVersion.empty ? '':'-pre'+minorVersion}"
+ ignoreExitValue = true
+ doFirst {
+ println "> Press enter to create tag $tag"
+ System.in.newReader().readLine()
+ }
+ commandLine 'git', 'tag', tag
+}
+
+task release {
+ dependsOn (clean, dist, createGitTag)
+}
+dist.mustRunAfter clean
+createGitTag.mustRunAfter dist
diff --git a/freeplane/.classpath b/freeplane/.classpath
deleted file mode 100644
index 955d759..0000000
--- a/freeplane/.classpath
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="src" path="resources"/>
- <classpathentry kind="src" path="viewer-resources"/>
- <classpathentry kind="src" path="external-resources"/>
- <classpathentry exported="true" kind="lib" path="lib/commons-lang-2.6.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/forms-1.2.1.jar" sourcepath="lib/forms-1_2_1.zip"/>
- <classpathentry exported="true" kind="lib" path="lib/gnu-regexp-1.1.4.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/SimplyHTML.jar" sourcepath="/simplyHtml/src"/>
- <classpathentry kind="lib" path="lib/freeplanemac.jar" sourcepath="/freeplane_mac/src"/>
- <classpathentry exported="true" kind="lib" path="lib/commons-io-2.4.jar"/>
- <classpathentry kind="lib" path="lib/jortho.jar"/>
- <classpathentry kind="lib" path="lib/idw-gpl.jar" sourcepath="C:/Users/Dimitry/Downloads/idw-gpl-1.6.1-src/idw-gpl-1.6.1/src"/>
- <classpathentry kind="lib" path="lib/commons-codec-1.7.jar"/>
- <classpathentry combineaccessrules="false" kind="src" path="/JOrtho_0.4_freeplane"/>
- <classpathentry kind="output" path="bin/classes"/>
-</classpath>
diff --git a/freeplane/.project b/freeplane/.project
deleted file mode 100644
index 25c59ef..0000000
--- a/freeplane/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.pde.PluginNature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane/.settings/org.eclipse.core.resources.prefs b/freeplane/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index b73111d..0000000
--- a/freeplane/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Feb 15 22:59:59 CET 2010
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
-encoding/doc=ISO-8859-1
diff --git a/freeplane/.settings/org.eclipse.jdt.core.prefs b/freeplane/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 2b0f24e..0000000
--- a/freeplane/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,25 +0,0 @@
-#Mon Feb 20 18:31:46 CET 2012
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/freeplane/.settings/org.eclipse.jdt.ui.prefs b/freeplane/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 8efd713..0000000
--- a/freeplane/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Jan 06 16:49:31 CET 2009
-cleanup_settings_version=2
-eclipse.preferences.version=1
-formatter_settings_version=11
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
diff --git a/freeplane/.settings/org.eclipse.ltk.core.refactoring.prefs b/freeplane/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 60531d7..0000000
--- a/freeplane/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue Oct 14 21:46:22 CEST 2008
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
diff --git a/freeplane/.settings/org.eclipse.pde.core.prefs b/freeplane/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 871fdba..0000000
--- a/freeplane/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jan 05 07:49:19 CET 2009
-eclipse.preferences.version=1
-pluginProject.equinox=false
-pluginProject.extensions=false
diff --git a/freeplane/.settings/org.eclipse.wst.validation.prefs b/freeplane/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index 7cc78d0..0000000
--- a/freeplane/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,9 +0,0 @@
-#Tue Oct 14 21:46:22 CEST 2008
-DELEGATES_PREFERENCE=delegateValidatorList
-USER_BUILD_PREFERENCE=enabledBuildValidatorList
-USER_MANUAL_PREFERENCE=enabledManualValidatorList
-USER_PREFERENCE=overrideGlobalPreferencesfalse
-eclipse.preferences.version=1
-override=false
-suspend=false
-vf.version=3
diff --git a/freeplane/META-INF/MANIFEST.MF b/freeplane/META-INF/MANIFEST.MF
deleted file mode 100644
index ffc5076..0000000
--- a/freeplane/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,123 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.core
-Bundle-SymbolicName: org.freeplane.core
-Bundle-Version: 1.0.1
-Bundle-ClassPath: lib/freeplaneviewer.jar,
- lib/freeplaneeditor.jar,
- lib/freeplanemac.jar,
- lib/freeplaneosgi.jar,
- lib/commons-lang-2.6.jar,
- lib/commons-io-2.4.jar,
- lib/forms-1.2.1.jar,
- lib/gnu-regexp-1.1.4.jar,
- lib/SimplyHTML.jar,
- lib/jortho.jar,
- lib/idw-gpl.jar,
- lib/commons-codec-1.7.jar
-Bundle-Activator: org.freeplane.main.osgi.Activator
-Import-Package: org.osgi.framework,
- org.osgi.service.url;version="1.0.0"
-Export-Package: com.inet.jortho,
- com.jgoodies.forms.builder,
- com.jgoodies.forms.debug,
- com.jgoodies.forms.factories,
- com.jgoodies.forms.layout,
- com.jgoodies.forms.util,
- com.lightdev.app.shtm,
- org.apache.commons.io,
- org.apache.commons.io.comparator,
- org.apache.commons.io.filefilter,
- org.apache.commons.io.input,
- org.apache.commons.io.monitor,
- org.apache.commons.io.output,
- org.apache.commons.lang,
- org.apache.commons.lang.builder,
- org.apache.commons.lang.exception,
- org.apache.commons.lang.math,
- org.apache.commons.lang.time,
- org.freeplane.core.extension,
- org.freeplane.core.io,
- org.freeplane.core.io.xml,
- org.freeplane.core.resources,
- org.freeplane.core.resources.components,
- org.freeplane.core.ui,
- org.freeplane.core.ui.components,
- org.freeplane.core.ui.components.calendar,
- org.freeplane.core.ui.components.html,
- org.freeplane.core.undo,
- org.freeplane.core.util,
- org.freeplane.core.util.collection,
- org.freeplane.features.attribute,
- org.freeplane.features.attribute.mindmapmode,
- org.freeplane.features.clipboard,
- org.freeplane.features.clipboard.mindmapmode,
- org.freeplane.features.cloud,
- org.freeplane.features.cloud.mindmapmode,
- org.freeplane.features.edge,
- org.freeplane.features.edge.mindmapmode,
- org.freeplane.features.encrypt,
- org.freeplane.features.encrypt.mindmapmode,
- org.freeplane.features.export.mindmapmode,
- org.freeplane.features.filter,
- org.freeplane.features.filter.condition,
- org.freeplane.features.format,
- org.freeplane.features.help,
- org.freeplane.features.icon,
- org.freeplane.features.icon.factory,
- org.freeplane.features.icon.mindmapmode,
- org.freeplane.features.link,
- org.freeplane.features.link.mindmapmode,
- org.freeplane.features.map,
- org.freeplane.features.map.filemode,
- org.freeplane.features.map.mindmapmode,
- org.freeplane.features.mapio,
- org.freeplane.features.mapio.mindmapmode,
- org.freeplane.features.mode,
- org.freeplane.features.mode.browsemode,
- org.freeplane.features.mode.filemode,
- org.freeplane.features.mode.mindmapmode,
- org.freeplane.features.nodelocation,
- org.freeplane.features.nodelocation.mindmapmode,
- org.freeplane.features.nodestyle,
- org.freeplane.features.nodestyle.filemode,
- org.freeplane.features.nodestyle.mindmapmode,
- org.freeplane.features.note,
- org.freeplane.features.note.mindmapmode,
- org.freeplane.features.print,
- org.freeplane.features.script,
- org.freeplane.features.spellchecker.mindmapmode,
- org.freeplane.features.styles,
- org.freeplane.features.styles.mindmapmode,
- org.freeplane.features.text,
- org.freeplane.features.text.mindmapmode,
- org.freeplane.features.time,
- org.freeplane.features.ui,
- org.freeplane.features.url,
- org.freeplane.features.url.mindmapmode,
- org.freeplane.main.addons,
- org.freeplane.main.applet,
- org.freeplane.main.application,
- org.freeplane.main.application.protocols.freeplaneresource,
- org.freeplane.main.browsemode,
- org.freeplane.main.filemode,
- org.freeplane.main.headlessmode,
- org.freeplane.main.mindmapmode,
- org.freeplane.main.mindmapmode.stylemode,
- org.freeplane.main.osgi,
- org.freeplane.n3.nanoxml,
- org.freeplane.plugin.macos,
- org.freeplane.view.swing.features,
- org.freeplane.view.swing.features.filepreview,
- org.freeplane.view.swing.features.nodehistory,
- org.freeplane.view.swing.features.progress.mindmapmode,
- org.freeplane.view.swing.features.time.mindmapmode,
- org.freeplane.view.swing.map,
- org.freeplane.view.swing.map.attribute,
- org.freeplane.view.swing.map.cloud,
- org.freeplane.view.swing.map.edge,
- org.freeplane.view.swing.map.link,
- org.freeplane.view.swing.map.mindmapmode,
- org.freeplane.view.swing.ui,
- org.freeplane.view.swing.ui.mindmapmode
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/freeplane/META-INF/OLD_MANIFEST.MF b/freeplane/META-INF/OLD_MANIFEST.MF
deleted file mode 100644
index 545466f..0000000
--- a/freeplane/META-INF/OLD_MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: org.freeplane.main.application.FreeplaneMain
-Class-Path: ../
- freeplaneeditor.jar
- freeplaneviewer.jar
- freeplanemac.jar
- commons-lang-2.6.jar
- forms-1.0.5.jar
- jortho.jar
- gnu-regexp-1.1.4.jar
- SimplyHTML.jar
diff --git a/freeplane/ant/Menu_Prefs_Templates.mm b/freeplane/ant/Menu_Prefs_Templates.mm
deleted file mode 100644
index 2ec9254..0000000
--- a/freeplane/ant/Menu_Prefs_Templates.mm
+++ /dev/null
@@ -1,221 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<attribute_registry SHOW_ATTRIBUTES="hide"/>
-<node TEXT="Templates" LOCALIZED_STYLE_REF="AutomaticLayout.level.root" ID="ID_1723255651"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="combo" LAST="false">
- <attribute_compare_condition VALUE="combo" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="choice" LAST="false">
- <attribute_compare_condition VALUE="choice" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="font" LAST="false">
- <attribute_compare_condition VALUE="font" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="number" LAST="false">
- <attribute_compare_condition VALUE="number" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="path" LAST="false">
- <attribute_compare_condition VALUE="path" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="remind_value" LAST="false">
- <attribute_compare_condition VALUE="remind_value" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="false">
- <attribute_compare_condition VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="group" LAST="false">
- <attribute_compare_condition VALUE="group" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="color" LAST="false">
- <attribute_compare_condition VALUE="color" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="string" LAST="false">
- <attribute_compare_condition VALUE="string" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="tab" LAST="false">
- <attribute_compare_condition VALUE="tab" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="text" LAST="false">
- <attribute_compare_condition VALUE="text" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="category" LAST="true">
- <attribute_compare_condition VALUE="category" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="action" LAST="true">
- <attribute_compare_condition VALUE="action" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="radio_action" LAST="true">
- <attribute_compare_condition VALUE="radio_action" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="submenu" LAST="true">
- <attribute_compare_condition VALUE="submenu" MATCH_CASE="true" MATCH_APPROXIMATELY="false" ATTRIBUTE="type" COMPARATION_RESULT="0" SUCCEED="true"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="10"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode TEXT="boolean">
-<icon BUILTIN="checked"/>
-</stylenode>
-<stylenode TEXT="combo">
-<icon BUILTIN="list"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-<stylenode TEXT="choice"/>
-<stylenode TEXT="font"/>
-<stylenode TEXT="number"/>
-<stylenode TEXT="path"/>
-<stylenode TEXT="remind_value"/>
-<stylenode TEXT="separator">
-<font BOLD="true"/>
-</stylenode>
-<stylenode TEXT="group">
-<icon BUILTIN="folder"/>
-</stylenode>
-<stylenode TEXT="color">
-<icon BUILTIN="licq"/>
-</stylenode>
-<stylenode TEXT="string">
-<icon BUILTIN="edit"/>
-</stylenode>
-<stylenode TEXT="tab">
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="text">
-<icon BUILTIN="info"/>
-</stylenode>
-<stylenode TEXT="action"/>
-<stylenode TEXT="radio_action">
-<icon BUILTIN="unchecked"/>
-</stylenode>
-<stylenode TEXT="category" COLOR="#000000" BACKGROUND_COLOR="#ccffcc">
-<font ITALIC="true"/>
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="submenu">
-<font ITALIC="true"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="Instructions" POSITION="right" ID="ID_16954228" LINK="http://freeplane.sourceforge.net/wiki/index.php/How_to_Edit_Preferences_and_Menus" VSHIFT="-60">
-<attribute NAME="type" VALUE="--ignore--"/>
-<hook NAME="FreeNode"/>
-</node>
-<node TEXT="for Preferences" LOCALIZED_STYLE_REF="AutomaticLayout.level,1" POSITION="right" ID="ID_457483691">
-<attribute NAME="type" VALUE="--ignore--"/>
-<node TEXT="tab" ID="ID_571535954">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="separator" ID="ID_335899498">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="boolean" ID="ID_409443701">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="number" ID="ID_238686102">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE=""/>
-<attribute NAME="min" VALUE="1"/>
-<attribute NAME="max" VALUE="50"/>
-</node>
-<node TEXT="combo" ID="ID_1992869935">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE=""/>
-<node TEXT="1" OBJECT="java.lang.Long|1" ID="ID_572209665">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="1" OBJECT="org.freeplane.features.format.FormattedNumber|1"/>
-</node>
-<node TEXT="2" OBJECT="java.lang.Long|2" ID="ID_1221314968">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="2" OBJECT="org.freeplane.features.format.FormattedNumber|2|#0.####"/>
-</node>
-</node>
-<node TEXT="string" ID="ID_1859949883">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="path" ID="ID_1448860584">
-<attribute NAME="type" VALUE="path"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="language" ID="ID_1723400994">
-<attribute NAME="type" VALUE="languages"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="group" ID="ID_955542498">
-<attribute NAME="type" VALUE="group"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="color" ID="ID_772320075">
-<attribute NAME="type" VALUE="color"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="font" ID="ID_1965612781">
-<attribute NAME="type" VALUE="font"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="text" ID="ID_489893342">
-<attribute NAME="type" VALUE="text"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-</node>
-<node TEXT="for Menus" LOCALIZED_STYLE_REF="AutomaticLayout.level,1" POSITION="left" ID="ID_1718414539">
-<node TEXT="category" ID="ID_636805543">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE=""/>
-</node>
-<node TEXT="submenu" ID="ID_406009783">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE=""/>
-<attribute NAME="name_ref" VALUE=""/>
-</node>
-<node TEXT="separator" ID="ID_1642777177">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="action" ID="ID_1705523326">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE=""/>
-<attribute NAME="accelerator" VALUE=""/>
-<attribute NAME="menu_key" VALUE=""/>
-</node>
-<node TEXT="radio_action" ID="ID_587556905">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE=""/>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane/ant/ant.properties b/freeplane/ant/ant.properties
deleted file mode 100644
index f11ee62..0000000
--- a/freeplane/ant/ant.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-freeplane.ext.lib = ${workspace}/freeplane/lib
-freeplane.dist.lib = ${workspace}/freeplane/dist/lib
-freeplaneviewer.jar = ${freeplane.dist.lib}/freeplaneviewer.jar
-freeplaneeditor.jar = ${freeplane.dist.lib}/freeplaneeditor.jar
-freeplaneosgi.jar = ${freeplane.dist.lib}/freeplaneosgi.jar
-freeplanemac.jar = ${freeplane.ext.lib}/freeplanemac.jar
-freeplane.jars = ${freeplaneviewer.jar}:${freeplaneeditor.jar}:${freeplaneosgi.jar}:${freeplanemac.jar}
-commons-lang.jar = ${freeplane.ext.lib}/commons-lang-2.6.jar
-commons-codec.jar = ${freeplane.ext.lib}/commons-codec-1.7.jar
-commons-io.jar = ${freeplane.ext.lib}/commons-io-2.4.jar
-forms.jar = ${freeplane.ext.lib}/forms-1.2.1.jar
-SimplyHTML.jar = ${freeplane.ext.lib}/SimplyHTML.jar
-jortho.jar = ${freeplane.ext.lib}/jortho.jar
-idwgpl.jar = ${freeplane.ext.lib}/idw-gpl.jar
diff --git a/freeplane/ant/build.xml b/freeplane/ant/build.xml
deleted file mode 100644
index 74b95d3..0000000
--- a/freeplane/ant/build.xml
+++ /dev/null
@@ -1,304 +0,0 @@
-<project name="freeplane" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property file="viewer-resources/version.properties"/>
- <property name="src" value="src" />
- <property name="resources" value="resources" />
- <property name="viewer-resources" value="viewer-resources" />
- <property name="eolstyle" value="unix" />
- <property name="root" value="." />
- <property name="manifest" value="${root}/META-INF/OLD_MANIFEST.MF" />
- <property name="osgimanifest" value="${root}/META-INF/MANIFEST.MF" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/signjar.properties" />
- <property file="ant/ant.properties" />
- <property name="freeplaneant.jar" value="${workspace}/freeplane_ant/dist/freeplaneant.jar" />
- <property name="google.translator.jar" value="${workspace}/freeplane_framework/ant/lib/google-api-translate-java-0.92.jar" />
- <property name="external.jars" value="${commons-lang.jar}:${commons-io.jar}:${commons-codec.jar}:${imgscalr.jar}:${forms.jar}:${SimplyHTML.jar}:${jortho.jar}:${idwgpl.jar}" />
- <property name="build" value="${root}/build" />
- <property name="dist" value="${root}/dist" />
- <property name="dist.resources" value="${dist}/resources" />
- <property name="dist.doc" value="${dist}/doc" />
- <property name="dist.osgi.dir" value="${dist}/org.freeplane.core" />
- <property name="freeplaneplugin.jar" value="${dist.osgi.dir}/org.freeplane.core.jar" />
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${external.jars}:${freeplanemac.jar}:${framework.jar}" />
- <condition property="isMacOs">
- <os family="mac"/>
- </condition>
-
- <taskdef name="format-translation" classname="org.freeplane.ant.FormatTranslation" classpath="${freeplaneant.jar}" onerror="report" />
- <taskdef name="check-translation" classname="org.freeplane.ant.FormatTranslationCheck" classpath="${freeplaneant.jar}" onerror="report" />
-
- <target name="prepare_freeplaneant">
- <ant antfile="${workspace}/freeplane_ant/build.xml" target="jar"
- dir="${workspace}/freeplane_ant" inheritAll="false" />
- </target>
-
- <target name="prepare_jortho" depends="prepare_freeplaneant">
- <ant antfile="${workspace}/JOrtho_0.4_freeplane/build.xml" target="jar"
- dir="${workspace}/JOrtho_0.4_freeplane" inheritAll="false"/>
- <copy
- file="${workspace}/JOrtho_0.4_freeplane/dist/lib/jortho-0.4+fp1.1.1.jar"
- tofile="lib/jortho.jar"
- />
- </target>
-
- <target name="localelist">
- <!-- updates translations/locales.txt -->
- <fileset id="resourcebundles" dir="${root}">
- <include name="resources/translations/*.properties" />
- <include name="viewer-resources/translations/*.properties" />
- </fileset>
- <pathconvert pathsep="${line.separator}" property="locales" refid="resourcebundles">
- <mapper type="regexp" from=".*Resources_(.*)\.properties" to="\1"/>
- </pathconvert>
- <mkdir dir="${build}/translations" />
- <echo file="${build}/translations/locales.txt">${locales}</echo>
- </target>
-
- <target name="build" depends="prepare_jortho,localelist,build-ui-xml">
- <antcall target="check-translation" />
- <mkdir dir="${build}" />
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- <exclude name="org/freeplane/main/application/FreeplaneMain.java" />
- <exclude name="**/osgi/**" />
- </javac>
- <!-- Starter should work with java 1.1, too as it checks the java version.-->
- <delete failonerror="false" file="${build}/org/freeplane/main/application/FreeplaneMain.class"/>
- <javac verbose="no" srcdir="${src}" destdir="${build}" classpath="${classpath}"
- debug="${debug}" source="1.3" target="1.1" encoding="utf8">
- <include name="org/freeplane/main/application/FreeplaneMain.java" />
- </javac>
- </target>
-
- <target name="build-ui-xml">
- <xslt in="${resources}/xml/preferences.mm"
- style="${resources}/xslt/mm2preferences.xsl"
- out="${resources}/xml/preferences.xml"/>
-
- <xslt in="${resources}/xml/filemodemenu.mm"
- style="${resources}/xslt/mm2menu.xsl"
- out="${resources}/xml/filemodemenu.xml"/>
- <xslt in="${resources}/xml/stylemodemenu.mm"
- style="${resources}/xslt/mm2menu.xsl"
- out="${resources}/xml/stylemodemenu.xml"/>
- <xslt in="${resources}/xml/mindmapmodemenu.mm"
- style="${resources}/xslt/mm2menu.xsl"
- out="${resources}/xml/mindmapmodemenu.xml"/>
- <xslt in="${resources}/xml/browsemodemenu.mm"
- style="${resources}/xslt/mm2menu.xsl"
- out="${resources}/xml/browsemodemenu.xml"/>
- <xslt in="${viewer-resources}/xml/appletMenu.mm"
- style="${resources}/xslt/mm2menu.xsl"
- out="${viewer-resources}/xml/appletMenu.xml"/>
- </target>
-
- <target name="osgi_build" depends="build">
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}"
- debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- <include name="**/osgi/**" />
- <exclude name="org/freeplane/main/osgi/Activator.java" />
- </javac>
- <delete failonerror="false" file="${build}/org/freeplane/main/osgi/Activator.class"/>
- <javac verbose="no" srcdir="${src}" destdir="${build}" classpath="${classpath}"
- debug="${debug}" source="1.3" target="1.2" encoding="utf8">
- <include name="org/freeplane/main/osgi/Activator.java" />
- </javac>
- </target>
-
- <target name="jar" depends="build">
- <mkdir dir="${freeplane.dist.lib}" />
- <jar jarfile="${freeplaneviewer.jar}">
- <manifest>
- <attribute name="Permissions" value="all-permissions"/>
- <attribute name="Codebase" value="*"/>
- <attribute name="Application-Library-Allowable-Codebase" value="*"/>
- <attribute name="Application-Name" value="Freeplane Viewer Applet"/>
- </manifest>
- <fileset dir="${build}">
- <exclude name="**/*.jar" />
- <exclude name="**/application/**" />
- <exclude name="**/osgi/**" />
- <exclude name="**/mindmapmode/**" />
- <exclude name="**/filemode/**" />
- <exclude name="**/ortho/**" />
- <exclude name="**/core/resources/ui/**" />
- <exclude name="translations/**" />
- </fileset>
- <fileset dir="${viewer-resources}">
- <exclude name="**/appletMenu.mm" />
- </fileset>
- </jar>
- <jar jarfile="${freeplaneeditor.jar}" manifest="${manifest}">
- <fileset dir="${build}">
- <include name="**/application/**" />
- <include name="**/mindmapmode/**" />
- <include name="**/ortho/**" />
- <include name="**/filemode/**" />
- <include name="**/core/resources/ui/**" />
- <include name="translations/**" />
- <exclude name="**/*.jar" />
- </fileset>
- <fileset dir="${resources}">
- <exclude name="**/preferences.mm" />
- <exclude name="**/browsemodemenu.mm" />
- <exclude name="**/mindmapmodemenu.mm" />
- <exclude name="**/filemodemenu.mm" />
- <exclude name="**/stylemodemenu.mm" />
- </fileset>
- </jar>
- </target>
-
- <target name="signjar" depends ="jar, signjar-tsa, signjar-no-tsa" if = "signjar.alias"/>
-
- <target name="signjar-tsa" depends ="jar" if = "signjar.tsaurl">
- <signjar jar="${freeplaneviewer.jar}"
- keystore="${signjar.keystore}"
- storetype="${signjar.storetype}"
- alias="${signjar.alias}"
- storepass="${signjar.storepass}" keypass="${signjar.keypass}"
- tsaurl="${signjar.tsaurl}"/>
- </target>
-
- <target name="signjar-no-tsa" depends ="jar" if = "signjar.alias" unless="signjar.tsaurl">
- <signjar jar="${freeplaneviewer.jar}"
- keystore="${signjar.keystore}"
- storetype="${signjar.storetype}"
- alias="${signjar.alias}"
- storepass="${signjar.storepass}" keypass="${signjar.keypass}"/>
- </target>
-
- <target name="signjarinfo" depends ="jar" unless = "signjar.alias">
- <echo>No ${workspace}/freeplane/ant/signjar.properties found</echo>
- <echo>Applet not signed</echo>
- <echo>See ${workspace}/freeplane/ant/signjar-example.properties for more info</echo>
- </target>
-
- <target name="buildmac" if="isMacOs">
- <ant antfile="ant/build.xml" target="dist" dir="${workspace}/freeplane_mac" inheritall="false" />
- </target>
-
- <target name="osgi_jar" depends="signjar, osgi_build">
- <jar jarfile="${freeplaneosgi.jar}">
- <fileset dir="${build}">
- <include name="**/osgi/**" />
- </fileset>
- </jar>
- </target>
-
- <target name="dist" depends="jar, signjar, signjarinfo, buildmac">
- <!-- third party libs -->
- <mkdir dir="${freeplane.dist.lib}" />
- <copy todir="${freeplane.dist.lib}">
- <fileset dir="${freeplane.ext.lib}">
- <include name="*.jar" />
- </fileset>
- </copy>
- <mkdir dir="${dist.resources}" />
- <copy todir="${dist.resources}">
- <fileset dir="external-resources"/>
- </copy>
- <mkdir dir="${dist.doc}" />
- <copy todir="${dist.doc}">
- <fileset dir="doc"/>
- </copy>
- </target>
-
- <target name="clean_dist" depends="clean, dist"/>
-
- <!-- for maven integration -->
- <!-- make sure you've installed maven properly - see http://maven.apache.org/ -->
- <target name="maven-deps">
- <exec executable="mvn.bat">
- <arg value="install:install-file"/>
- <arg value="-DgroupId=org.freeplane"/>
- <arg value="-DartifactId=freeplane-simplyHtml"/>
- <arg value="-Dversion=${freeplane_version}"/>
- <arg value="-Dpackaging=jar"/>
- <arg value="-Dfile=lib/SimplyHTML.jar"/>
- </exec>
- <exec executable="mvn.bat">
- <arg value="install:install-file"/>
- <arg value="-DgroupId=org.freeplane"/>
- <arg value="-DartifactId=freeplane-jortho"/>
- <arg value="-Dversion=${freeplane_version}"/>
- <arg value="-Dpackaging=jar"/>
- <arg value="-Dfile=lib/jortho.jar"/>
- </exec>
- <exec executable="mvn.bat">
- <arg value="install:install-file"/>
- <arg value="-DgroupId=com.jgoodies"/>
- <arg value="-DartifactId=forms"/>
- <arg value="-Dversion=1.0.5"/>
- <arg value="-Dpackaging=jar"/>
- <arg value="-Dfile=lib/forms-1.2.1.jar"/>
- </exec>
- </target>
-
-
-
- <target name="osgi_dist" depends="osgi_jar, dist">
- <mkdir dir="${dist.osgi.dir}" />
- <copy todir="${dist.osgi.dir}">
- <fileset dir="${dist}">
- <include name="lib/**" />
- </fileset>
- </copy>
- <mkdir dir="${dist.osgi.dir}/META-INF" />
- <copy tofile="${dist.osgi.dir}/META-INF/MANIFEST.MF" file="${osgimanifest}"/>
- </target>
-
- <target name="osgi_dist_as_jar" depends="osgi_dist">
- <jar jarfile="${freeplaneplugin.jar}">
- <fileset dir="${dist.osgi.dir}">
- <include name="**" />
- </fileset>
- </jar>
- </target>
-
- <target name="check-translation">
- <check-translation dir="${root}/resources/translations" includes="*.properties" eolstyle="${eolstyle}" />
- <check-translation dir="${root}/viewer-resources/translations" includes="*.properties" eolstyle="${eolstyle}" />
- </target>
- <target name="format-translation">
- <format-translation dir="${root}/resources/translations" includes="*.properties" eolstyle="${eolstyle}" />
- <format-translation dir="${root}/viewer-resources/translations" includes="*.properties" eolstyle="${eolstyle}" />
- </target>
- <target name="format-translation-force">
- <format-translation dir="${root}/resources/translations" writeifunchanged="true" includes="*de.properties" eolstyle="${eolstyle}" />
- <format-translation dir="${root}/viewer-resources/translations" writeifunchanged="true" includes="*xx.properties" eolstyle="${eolstyle}" />
- </target>
- <target name="translate">
- <translator translationsdir="${root}/resources/translations"
- sourcefile="${root}/viewer-resources/translations/Resources_en.properties" includes="*.properties" />
- <antcall target="format-translation" />
- </target>
-
- <target name="clean">
- <delete dir="${build}" quiet="true" />
- <delete dir="${dist}" quiet="true" />
- <delete file="lib/jortho.jar" />
- <delete>
- <fileset defaultexcludes="no" dir="${src}" includes="**/*~" />
- <fileset dir="${resources}">
- <include name="**/preferences.xml" />
- <include name="**/browsemodemenu.xml" />
- <include name="**/mindmapmodemenu.xml" />
- <include name="**/filemodemenu.xml" />
- <include name="**/stylemodemenu.xml" />
- <include name="**/appletMenu.xml" />
- </fileset>
- <fileset dir="${viewer-resources}">
- <include name="**/appletMenu.xml" />
- </fileset>
- </delete>
- </target>
-
-</project>
-
diff --git a/freeplane/ant/signjar-example.properties b/freeplane/ant/signjar-example.properties
deleted file mode 100644
index 87c614e..0000000
--- a/freeplane/ant/signjar-example.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-# for signing freeplaneviewer.jar during the build
-# rename this file to signjar.properties and set correct property values
-
-signjar.keystore=YourKeyStore
-signjar.storetype=pkcs12 or jks
-signjar.alias=YourKeyAlias
-signjar.storepass=YourKeyStorePass
-signjar.keypass=YourKeyPass
-; signjar.tsaurl=http://your.timestampingauthority.url , optional
diff --git a/freeplane/build.gradle b/freeplane/build.gradle
new file mode 100644
index 0000000..3751282
--- /dev/null
+++ b/freeplane/build.gradle
@@ -0,0 +1,320 @@
+configurations{
+ mergedViewerDependencies
+ compile.extendsFrom(mergedViewerDependencies)
+}
+
+dependencies {
+
+ mergedViewerDependencies 'org.dpolivaev.mnemonicsetter:mnemonicsetter:0.5'
+
+ compile project(':JOrtho_0.4_freeplane')
+
+ compile 'commons-lang:commons-lang:2.6',
+ 'commons-io:commons-io:2.4',
+ 'commons-codec:commons-codec:1.7',
+ 'com.jgoodies:jgoodies-forms:1.6.0',
+ 'com.jgoodies:jgoodies-common:1.4.0'
+
+ compile ('com.lightdev.app.shtm.simplyhtml:SimplyHTML:0.16.17') {
+ exclude module: 'javahelp'
+ exclude module: 'mnemonicsetter'
+ }
+
+ testCompile 'junit:junit:4.12',
+ 'org.hamcrest:hamcrest-all:1.3',
+ 'org.mockito:mockito-all:1.10.19'
+
+ // from flatDir "localGitDepsRepository":
+ compile ':idw-gpl-1.6.1'
+}
+
+sourceSets {
+ test {
+ resources {
+ srcDir 'resources'
+ srcDir 'viewer-resources'
+ srcDir 'external-resources'
+ }
+ }
+}
+
+
+jar {
+ manifest {
+
+ name = pluginid
+ symbolicName = pluginid
+
+ def deps = configurations.runtime.files.collect {
+ externalizeJar(it)
+ }
+ deps.add(0, "lib/freeplaneosgi-${project.version}.jar")
+ // this is built from :freeplane_mac on a Mac!
+ deps.add(0, "lib/freeplane_mac-${project.version}.jar")
+ deps.add(0, "lib/freeplaneeditor-${project.version}.jar")
+ deps.add(0, "lib/freeplaneviewer.jar")
+
+ attributes 'Class-Path' : deps.join(', ')
+ attributes 'Bundle-ClassPath': '., ' + deps.join(', ')
+ // f*ck bnd! it filters things like "org.apache.commons.*" from
+ // Export-Package:, that's why we bypass bnd for now!
+ def exports = """\
+ com.inet.jortho,
+ org.freeplane.core.extension,
+ org.freeplane.core.io,
+ org.freeplane.core.io.xml,
+ org.freeplane.core.resources,
+ org.freeplane.core.resources.components,
+ org.freeplane.core.ui,
+ org.freeplane.core.ui.components,
+ org.freeplane.core.ui.components.calendar,
+ org.freeplane.core.ui.components.html,
+ org.freeplane.core.ui.menubuilders,
+ org.freeplane.core.ui.menubuilders.action,
+ org.freeplane.core.ui.menubuilders.generic,
+ org.freeplane.core.ui.menubuilders.menu,
+ org.freeplane.core.undo,
+ org.freeplane.core.util,
+ org.freeplane.core.util.collection,
+ org.freeplane.features.attribute,
+ org.freeplane.features.attribute.mindmapmode,
+ org.freeplane.features.clipboard,
+ org.freeplane.features.clipboard.mindmapmode,
+ org.freeplane.features.cloud,
+ org.freeplane.features.cloud.mindmapmode,
+ org.freeplane.features.edge,
+ org.freeplane.features.edge.mindmapmode,
+ org.freeplane.features.encrypt,
+ org.freeplane.features.encrypt.mindmapmode,
+ org.freeplane.features.export.mindmapmode,
+ org.freeplane.features.filter,
+ org.freeplane.features.filter.condition,
+ org.freeplane.features.format,
+ org.freeplane.features.help,
+ org.freeplane.features.icon,
+ org.freeplane.features.icon.factory,
+ org.freeplane.features.icon.mindmapmode,
+ org.freeplane.features.link,
+ org.freeplane.features.link.mindmapmode,
+ org.freeplane.features.map,
+ org.freeplane.features.map.filemode,
+ org.freeplane.features.map.mindmapmode,
+ org.freeplane.features.mapio,
+ org.freeplane.features.mapio.mindmapmode,
+ org.freeplane.features.mode,
+ org.freeplane.features.mode.browsemode,
+ org.freeplane.features.mode.filemode,
+ org.freeplane.features.mode.mindmapmode,
+ org.freeplane.features.nodelocation,
+ org.freeplane.features.nodelocation.mindmapmode,
+ org.freeplane.features.nodestyle,
+ org.freeplane.features.nodestyle.filemode,
+ org.freeplane.features.nodestyle.mindmapmode,
+ org.freeplane.features.note,
+ org.freeplane.features.note.mindmapmode,
+ org.freeplane.features.print,
+ org.freeplane.features.script,
+ org.freeplane.features.spellchecker.mindmapmode,
+ org.freeplane.features.styles,
+ org.freeplane.features.styles.mindmapmode,
+ org.freeplane.features.text,
+ org.freeplane.features.text.mindmapmode,
+ org.freeplane.features.time,
+ org.freeplane.features.ui,
+ org.freeplane.features.url,
+ org.freeplane.features.url.mindmapmode,
+ org.freeplane.main.addons,
+ org.freeplane.main.applet,
+ org.freeplane.main.application,
+ org.freeplane.main.application.protocols.freeplaneresource,
+ org.freeplane.main.browsemode,
+ org.freeplane.main.filemode,
+ org.freeplane.main.headlessmode,
+ org.freeplane.main.mindmapmode,
+ org.freeplane.main.mindmapmode.stylemode,
+ org.freeplane.main.osgi,
+ org.freeplane.n3.nanoxml,
+ org.freeplane.plugin.macos,
+ org.freeplane.view.swing.features,
+ org.freeplane.view.swing.features.filepreview,
+ org.freeplane.view.swing.features.nodehistory,
+ org.freeplane.view.swing.features.progress.mindmapmode,
+ org.freeplane.view.swing.features.time.mindmapmode,
+ org.freeplane.view.swing.map,
+ org.freeplane.view.swing.map.attribute,
+ org.freeplane.view.swing.map.cloud,
+ org.freeplane.view.swing.map.edge,
+ org.freeplane.view.swing.map.link,
+ org.freeplane.view.swing.map.mindmapmode,
+ org.freeplane.view.swing.ui,
+ org.freeplane.view.swing.ui.mindmapmode,
+ com.jgoodies.forms.builder,
+ com.jgoodies.forms.debug,
+ com.jgoodies.forms.factories,
+ com.jgoodies.forms.layout,
+ com.jgoodies.forms.util,
+ com.lightdev.app.shtm,
+ org.apache.commons.io,
+ org.apache.commons.io.comparator,
+ org.apache.commons.io.filefilter,
+ org.apache.commons.io.input,
+ org.apache.commons.io.monitor,
+ org.apache.commons.io.output,
+ org.apache.commons.lang,
+ org.apache.commons.lang.builder,
+ org.apache.commons.lang.exception,
+ org.apache.commons.lang.math,
+ org.apache.commons.lang.time
+ """
+ attributes 'Export-Package': exports.replaceAll("\\s+", "")
+
+ instruction 'Bundle-Vendor', 'Freeplane Project'
+ instruction 'Import-Package', 'org.osgi.framework,org.osgi.service.url;version="1.0.0"'
+ // unfortunately bnd filters "org.apache.commons.*" so we use attributes to bypass bnd (see above)
+ //instruction 'Export-Package', '*;-noimport:=true'
+ //instruction 'Private-Package', '*'
+ instruction 'Bundle-Activator', 'org.freeplane.main.osgi.Activator'
+ instruction 'Bundle-RequiredExecutionEnvironment', 'J2SE-1.6'
+ }
+}
+
+task copyOSGiJars(type: Copy) {
+ from ("$buildDir/libs") {
+ include("*.jar")
+ exclude('framework-*.jar')
+ exclude('freeplane-*.jar')
+ exclude('mnemonicsetter-*.jar')
+
+ }
+ from ('lib') {
+ include("*.jar")
+ exclude('*-sources.jar')
+ }
+ into(globalBuild + '/core/' + pluginid + '/lib/')
+}
+
+task copyOSGiManifest(type: Copy) {
+ from ("$buildDir/tmp/jar/") {
+ include("MANIFEST.MF")
+ }
+ into(globalBuild + '/core/' + pluginid + '/META-INF/')
+}
+
+task viewerJar(type: Jar) {
+ // use '= project.manifest' to avoid that an OSGi manifest is created!
+ manifest = project.manifest {
+ attributes("Manifest-Version": "1.0",
+ "Permissions": "all-permissions",
+ "Codebase": "*",
+ "Application-Library-Allowable-Codebase": "*",
+ "Application-Name": "Freeplane Viewer Applet")
+ }
+
+ // this must be unversioned because the applet export code relies on this
+ archiveName = 'freeplaneviewer.jar'
+ dependsOn classes
+ from (sourceSets.main.output) {
+ exclude('**/application/**')
+ exclude('**/osgi/**')
+ exclude('**/mindmapmode/**')
+ exclude('**/filemode/**')
+ exclude('**/ortho/**')
+ exclude('**/core/resources/ui/**')
+ exclude('translations/**')
+ }
+ from ('./viewer-resources') {
+ exclude('**/appletMenu.mm')
+ }
+
+ configurations.mergedViewerDependencies.files.each {
+ from(zipTree(it.path)) {
+ exclude('META-INF/MANIFEST.MF')
+ }
+ }
+
+ includeEmptyDirs = false
+}
+
+apply from: './signjar.gradle'
+
+task editorJar(type: Jar) {
+ // use '= project.manifest' to avoid that an OSGi manifest is created!
+ manifest = project.manifest {
+ attributes("Manifest-Version": "1.0",
+ "Main-Class": "org.freeplane.main.application.FreeplaneMain")
+ }
+ baseName = 'freeplaneeditor'
+ dependsOn classes
+ from (sourceSets.main.output) {
+ include("**/application/**")
+ include("**/mindmapmode/**")
+ include("**/ortho/**")
+ include("**/filemode/**")
+ include("**/core/resources/ui/**")
+ include("translations/**")
+ exclude("**/*.jar") // probably not necessary
+ }
+ from ('./resources') {
+ exclude("**/preferences.mm")
+ exclude("**/browsemodemenu.mm")
+ exclude("**/mindmapmodemenu.mm")
+ exclude("**/filemodemenu.mm")
+ exclude("**/stylemodemenu.mm")
+ }
+ includeEmptyDirs = false
+}
+
+
+
+eclipseJdt << {
+ File f = file('.settings/org.eclipse.core.resources.prefs')
+ f.append('''encoding//resources/translations=ISO-8859-1
+encoding//viewer-resources/translations=ISO-8859-1
+''')
+}
+
+
+task osgiJar(type: Jar) {
+ // use '= project.manifest' to avoid that an OSGi manifest is created!
+ manifest = project.manifest {
+ attributes("Manifest-Version": "1.0")
+ }
+ baseName = 'freeplaneosgi'
+ dependsOn classes
+ from (sourceSets.main.output) {
+ include("**/osgi/**")
+ }
+ includeEmptyDirs = false
+}
+
+apply from: './git.gradle'
+
+task copyExternalResources(type: Copy) {
+ from('external-resources') {
+ include('**')
+ }
+ into(globalBuild + '/resources')
+
+ // (exactly) one of these two groups (copy vs. create) is always disabled!
+ dependsOn copyGitTxt
+ dependsOn copyGitProperty
+ dependsOn createGitProperty
+}
+
+task copyDoc(type: Copy) {
+ from('doc/') {
+ include('**')
+ }
+ into(globalBuild + '/doc')
+}
+
+jar.dependsOn viewerJar
+jar.dependsOn editorJar
+jar.dependsOn osgiJar
+jar.dependsOn copyDeps
+build.dependsOn copyOSGiJars
+build.dependsOn copyOSGiManifest
+build.dependsOn copyExternalResources
+build.dependsOn copyDoc
+
+apply from: './format_translation.gradle'
diff --git a/freeplane/doc/Freeplane_LaTeX.mm b/freeplane/doc/Freeplane_LaTeX.mm
index 2e195ac..1a6405b 100644
--- a/freeplane/doc/Freeplane_LaTeX.mm
+++ b/freeplane/doc/Freeplane_LaTeX.mm
@@ -1,32 +1,20 @@
-<map version="freeplane 1.3.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node FOLDED="false" ID="ID_1723255651" CREATED="1283093380553" MODIFIED="1356554585594"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p style="text-align: center">
- <b>LaTeX equations<br/>in Freeplane </b>
- </p>
- <p style="text-align: center">
- <b>>= 1.3.x</b>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="MapStyle" zoom="0.75">
- <properties show_note_icons="true"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p style="text-align: center">
 <b>LaTeX equations<br>in Freeplane </b>
 </p>
 <p style="text-align: center">
 <b>>= 1.3.x</b>
 </p>
 </body>
</html>" FOLDED="false" ID="ID_1723255651" CREATED="1283093380553" MODIFIED="1356554585594"><hook NAME="MapSt [...]
+ <properties show_note_icons="true" fit_to_viewport="false;"/>
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt">
+<font SIZE="24"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600.0 px">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<edge STYLE="bezier" COLOR="#808080" WIDTH="1"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes">
+<font SIZE="9"/>
+</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
<stylenode LOCALIZED_TEXT="defaultstyle.floating">
<edge STYLE="hide_edge"/>
@@ -99,7 +87,7 @@
<font NAME="Liberation Sans" SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
<font SIZE="20"/>
</stylenode>
@@ -118,7 +106,7 @@
<font SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right"/>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble"/>
</stylenode>
</map_styles>
</hook>
@@ -169,22 +157,7 @@
</node>
</node>
</node>
-<node POSITION="right" ID="ID_1563783701" CREATED="1356719071901" MODIFIED="1356729579399"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- LaTeX equations in Freeplane >= 1.3.x are
- </p>
- <p>
- created by either using a "\latex " prefix or by using <i>Format=LaTeX</i> (in <i>View->Properties panel</i>)
- </p>
- </body>
-</html>
-</richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 LaTeX equations in Freeplane >= 1.3.x are
 </p>
 <p>
 created by either using a "\latex " prefix or by using <i>Format=LaTeX</i>  (in <i>View->Properties panel</i>)
 </p>
 </body>
</html>" POSITION="right" ID="ID_1563783701" CREATED="1356 [...]
<node TEXT="http://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane" ID="ID_749593148" CREATED="1356719154745" MODIFIED="1356719154745" LINK="http://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane"/>
<node TEXT="\latex example with prefix: $x_2=\frac{1}{3}$" ID="ID_866456539" CREATED="1356719164791" MODIFIED="1357649767422">
<font SIZE="24"/>
@@ -269,8 +242,8 @@
</node>
</node>
<node TEXT="Some symbols" POSITION="right" ID="ID_1528359489" CREATED="1289989312265" MODIFIED="1289990182156">
-<node TEXT="Latin characters and
arabic numbers" FOLDED="true" ID="ID_76669942" CREATED="1289989873015" MODIFIED="1290022789776">
-<node TEXT="Latin letters and arabic numbers 
are supported by just typing them" ID="ID_1729735339" CREATED="1290022684336" MODIFIED="1356719899549">
+<node TEXT="Latin characters and
arabic numbers" FOLDED="true" ID="ID_76669942" CREATED="1289989873015" MODIFIED="1465679121228">
+<node TEXT="Latin letters and arabic numbers 
are supported by just typing them" ID="ID_1729735339" CREATED="1290022684336" MODIFIED="1465679121244">
<node TEXT="a,b,c,d,e,A,B,C,D,E,ö,Ä,ü,1,2,3,4" ID="ID_140439098" CREATED="1356719870987" MODIFIED="1356719904269" FORMAT="latexPatternFormat">
<font SIZE="24"/>
</node>
@@ -378,28 +351,7 @@
<node TEXT="Alignment and multiline" FOLDED="true" POSITION="right" ID="ID_629420174" CREATED="1289990778093" MODIFIED="1290125270000">
<node TEXT="To display multiple lines in an equation you can use so called enviroments." ID="ID_1483653386" CREATED="1290462372968" MODIFIED="1290462410906"/>
<node TEXT="An enviroment starts with \begin{enviromentname} and ends with
\end{enviromentname}" ID="ID_430369769" CREATED="1290462424421" MODIFIED="1290462489171"/>
-<node ID="ID_827402949" CREATED="1290462529312" MODIFIED="1356729217368"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- A powerful yet simple enviroment is the align environment.
- </p>
- <ul>
- <li>
- \\ starts a new line
- </li>
- <li>
- & aligns the character after this sign. The first & aligns left the second aligns right, the fourth again left...
- </li>
- </ul>
- </body>
-</html>
-</richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 A powerful yet simple enviroment is the align environment.
 </p>
 <ul>
 <li>
 \\ starts a new line
 </li>
 <li>
 & aligns the character after this sign. The first & aligns left the second aligns right, the fourth again left...
 </li>
 </u [...]
<node TEXT="Example" FOLDED="true" ID="ID_504548083" CREATED="1290462739718" MODIFIED="1356729227122">
<node TEXT="\begin{align}
&\text{\backslash\,begin\{\,align\} starts the align enviroment}\\
&\text{ a double backslash starts a new line \backslash\,\backslash} \\
&\text{the ampersand aligns} &&\text{\&left}&\text{\&\&right} \backslash\,\backslash \\
&\text{line with the same} &&\text{\&alignment}&\text{\&\&alignment} \backslash\,\backslash \\
&\text{\backslash\,end\{\,align\} ends the align envirom [...]
<font SIZE="24"/>
diff --git a/freeplane/doc/freeplane.mm b/freeplane/doc/freeplane.mm
index 6f69574..a0bac19 100644
--- a/freeplane/doc/freeplane.mm
+++ b/freeplane/doc/freeplane.mm
@@ -1,10 +1,10 @@
-<map version="freeplane 1.3.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
<attribute_registry SHOW_ATTRIBUTES="hide">
<attribute_name VISIBLE="true" NAME="See also"/>
<attribute_name VISIBLE="true" NAME="a2"/>
</attribute_registry>
-<node TEXT="Documentation
Freeplane 1.3" STYLE_REF="MainMenu" FOLDED="false" ID="ID_1723255651" VGAP="0">
+<node TEXT="Documentation
Freeplane 1.3" STYLE_REF="MainMenu" FOLDED="false" ID="ID_1723255651" CREATED="1455910903866" MODIFIED="1465594674017" VGAP_QUANTITY="0.0 px">
<icon BUILTIN="bee"/>
<hook NAME="MapStyle">
<conditional_styles>
@@ -12,11 +12,12 @@
<time_condition_modified_after user_name="1.2.12_03" DATE="1330531663397"/>
</conditional_style>
</conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true" show_notes_in_map="false"/>
+ <properties fit_to_viewport="false;" show_icon_for_attributes="false" show_note_icons="true" show_notes_in_map="false"/>
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt">
+<font SIZE="24"/>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
<stylenode TEXT="Definition">
<font ITALIC="true"/>
<edge STYLE="bezier" COLOR="#808080"/>
@@ -56,7 +57,7 @@
</stylenode>
<stylenode TEXT="MenuGroupLabel" COLOR="#000000" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
<edge COLOR="#33ffcc" WIDTH="2"/>
-<attribute_layout NAME_WIDTH="78" VALUE_WIDTH="116"/>
+<attribute_layout NAME_WIDTH="58.5 pt" VALUE_WIDTH="87.0 pt"/>
</stylenode>
<stylenode TEXT="Title" COLOR="#ffffff" BACKGROUND_COLOR="#2ed2a9" STYLE="bubble">
<font BOLD="true"/>
@@ -92,12 +93,15 @@
<icon BUILTIN="yes"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="default" FORMAT_AS_HYPERLINK="true">
<edge COLOR="#808080" WIDTH="thin"/>
<font SIZE="8"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes">
+<font SIZE="9"/>
+</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.note">
<edge COLOR="#cc0000"/>
</stylenode>
@@ -106,7 +110,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
<font SIZE="20"/>
</stylenode>
@@ -132,11 +136,11 @@
</body>
</html>
</richcontent>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_232622736" HGAP="19" VSHIFT="-108" STYLE="fork" TEXT_SHORTENED="true" LINK="freeplaneFunctions.mm"><richcontent TYPE="NODE">
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_232622736" CREATED="1455910903870" MODIFIED="1465594648999" LINK="freeplaneFunctions.mm" HGAP_QUANTITY="-16.0 px" VSHIFT_QUANTITY="-166.0 px" STYLE="fork" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p style="text-align: center">
@@ -144,6 +148,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -170,11 +175,11 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<node ID="ID_766584529" HGAP="-85" VSHIFT="28" STYLE="fork" TEXT_SHORTENED="true" LINK="freeplaneApplications.mm"><richcontent TYPE="NODE">
+<node ID="ID_766584529" CREATED="1455910903870" MODIFIED="1455910903870" LINK="freeplaneApplications.mm" HGAP_QUANTITY="-85.0 px" VSHIFT_QUANTITY="28.0 px" STYLE="fork" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p style="text-align: center">
@@ -182,6 +187,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -210,7 +216,7 @@
<hook NAME="AlwaysUnfoldedNode"/>
</node>
</node>
-<node TEXT="User guide" STYLE_REF="Title" POSITION="left" ID="ID_1405760079" HGAP="-37" VSHIFT="-60" TEXT_SHORTENED="true">
+<node TEXT="User guide" STYLE_REF="Title" POSITION="left" ID="ID_1405760079" CREATED="1455910903870" MODIFIED="1455910903870" HGAP_QUANTITY="-37.0 px" VSHIFT_QUANTITY="-60.0 px" TEXT_SHORTENED="true">
<icon BUILTIN="gohome"/>
<richcontent TYPE="DETAILS">
@@ -235,7 +241,7 @@
</html>
</richcontent>
<edge STYLE="bezier"/>
-<node TEXT="Goal" STYLE_REF="UserGuide" ID="ID_910734357" TEXT_SHORTENED="true" HGAP="27" VSHIFT="22" MIN_WIDTH="80"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Goal" STYLE_REF="UserGuide" ID="ID_910734357" CREATED="1455910903870" MODIFIED="1455910903870" TEXT_SHORTENED="true" HGAP_QUANTITY="27.0 px" VSHIFT_QUANTITY="22.0 px" MIN_WIDTH="80.0 px"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -276,11 +282,11 @@
</html>
</richcontent>
</node>
-<node STYLE_REF="UserGuide" FOLDED="true" ID="ID_1108028010" HGAP="27" TEXT_SHORTENED="true" LINK="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane" MIN_WIDTH="80"><richcontent TYPE="NODE">
+<node STYLE_REF="UserGuide" FOLDED="true" ID="ID_1108028010" CREATED="1455910903870" MODIFIED="1455910903870" LINK="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane" HGAP_QUANTITY="27.0 px" TEXT_SHORTENED="true" MIN_WIDTH="80.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -288,6 +294,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -326,7 +333,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Recognizing content" STYLE_REF="UserGuide" ID="ID_1836270960" TEXT_SHORTENED="true">
+<node TEXT="Recognizing content" STYLE_REF="UserGuide" ID="ID_1836270960" CREATED="1455910903870" MODIFIED="1455910903870" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
@@ -347,7 +354,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Definition" STYLE_REF="Definition" ID="ID_228937336" TEXT_SHORTENED="true">
+<node TEXT="Definition" STYLE_REF="Definition" ID="ID_228937336" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1,2"/>
<richcontent TYPE="DETAILS">
@@ -374,7 +381,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Method" STYLE_REF="Method" ID="ID_516439573" TEXT_SHORTENED="true">
+<node TEXT="Method" STYLE_REF="Method" ID="ID_516439573" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1,2"/>
<richcontent TYPE="DETAILS">
@@ -390,7 +397,7 @@
</html>
</richcontent>
</node>
-<node TEXT="OptionalValue" STYLE_REF="OptionalValue" FOLDED="true" ID="ID_1926379292" TEXT_SHORTENED="true">
+<node TEXT="OptionalValue" STYLE_REF="OptionalValue" FOLDED="true" ID="ID_1926379292" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS">
@@ -405,14 +412,14 @@
</body>
</html>
</richcontent>
-<node TEXT="IsChecked" ID="ID_833160047">
+<node TEXT="IsChecked" ID="ID_833160047" CREATED="1455910903871" MODIFIED="1455910903871">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="UnChecked" ID="ID_1245047726">
+<node TEXT="UnChecked" ID="ID_1245047726" CREATED="1455910903871" MODIFIED="1455910903871">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
@@ -420,7 +427,7 @@
<attribute NAME="Chapter" VALUE="2"/>
</node>
</node>
-<node TEXT="Procedure" STYLE_REF="Procedure" ID="ID_414428824" TEXT_SHORTENED="true">
+<node TEXT="Procedure" STYLE_REF="Procedure" ID="ID_414428824" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1"/>
<richcontent TYPE="DETAILS">
@@ -436,7 +443,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Exception" STYLE_REF="Exception" ID="ID_609263580" TEXT_SHORTENED="true">
+<node TEXT="Exception" STYLE_REF="Exception" ID="ID_609263580" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS">
@@ -452,7 +459,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ToNote" STYLE_REF="ToNote" ID="ID_1172516925" TEXT_SHORTENED="true">
+<node TEXT="ToNote" STYLE_REF="ToNote" ID="ID_1172516925" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS">
@@ -468,7 +475,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Refine" STYLE_REF="Refine" ID="ID_1719115146" TEXT_SHORTENED="true">
+<node TEXT="Refine" STYLE_REF="Refine" ID="ID_1719115146" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS">
@@ -484,7 +491,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Example" STYLE_REF="Example" ID="ID_1648027177" TEXT_SHORTENED="true">
+<node TEXT="Example" STYLE_REF="Example" ID="ID_1648027177" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS">
@@ -500,7 +507,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Revision" STYLE_REF="Revision" ID="ID_901482560" TEXT_SHORTENED="true">
+<node TEXT="Revision" STYLE_REF="Revision" ID="ID_901482560" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS">
@@ -527,7 +534,7 @@
</html>
</richcontent>
</node>
-<node TEXT="MainMenu" STYLE_REF="MainMenu" ID="ID_1534498435" TEXT_SHORTENED="true">
+<node TEXT="MainMenu" STYLE_REF="MainMenu" ID="ID_1534498435" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1,2"/>
<richcontent TYPE="DETAILS">
@@ -543,7 +550,7 @@
</html>
</richcontent>
</node>
-<node TEXT="MenuGroup" STYLE_REF="MenuGroupLabel" ID="ID_1191898047" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="MenuGroup" STYLE_REF="MenuGroupLabel" ID="ID_1191898047" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -560,7 +567,7 @@
</node>
</node>
</node>
-<node TEXT="Basic terms" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1480936832" TEXT_SHORTENED="true" HGAP="30" MIN_WIDTH="80"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Basic terms" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1480936832" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true" HGAP_QUANTITY="30.0 px" MIN_WIDTH="80.0 px"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -582,7 +589,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Nodes" FOLDED="true" ID="ID_1279930643" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Nodes" FOLDED="true" ID="ID_1279930643" CREATED="1455910903871" MODIFIED="1455910903871" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -608,7 +615,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
-<node TEXT="Root/Root node" ID="ID_1163921092" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="" ID="ID_1106912066" CREATED="1455910904130" MODIFIED="1455910904130">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Root/Root node" ID="ID_1163921092" CREATED="1455910903872" MODIFIED="1455910903872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -621,13 +631,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Parent node" STYLE_REF="Definition" ID="ID_283022327" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Parent node" STYLE_REF="Definition" ID="ID_283022327" CREATED="1455910903872" MODIFIED="1455910903872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -645,7 +654,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="Child node" STYLE_REF="Definition" ID="ID_1209680113" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Child node" STYLE_REF="Definition" ID="ID_1209680113" CREATED="1455910903872" MODIFIED="1455910903872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -663,7 +672,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Sibling node" STYLE_REF="Definition" ID="ID_1669709193" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Sibling node" STYLE_REF="Definition" ID="ID_1669709193" CREATED="1455910903872" MODIFIED="1455910903872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -681,9 +690,9 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Relations are relative" ID="ID_1402619445" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_259022500" CREATED="1455910904132" MODIFIED="1455910904132">
<hook NAME="SummaryNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Relations are relative" ID="ID_1402619445" CREATED="1455910903872" MODIFIED="1455910903872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -702,7 +711,8 @@
<attribute NAME="Chapter" VALUE="1"/>
</node>
</node>
-<node TEXT="Relations" STYLE_REF="Definition" FOLDED="true" ID="ID_1688918449" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="Relations" STYLE_REF="Definition" FOLDED="true" ID="ID_1688918449" CREATED="1455910903872" MODIFIED="1455910903872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -718,7 +728,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
-<node TEXT="Edge" STYLE_REF="Definition" FOLDED="true" ID="ID_682300475" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Edge" STYLE_REF="Definition" FOLDED="true" ID="ID_682300475" CREATED="1455910903872" MODIFIED="1455910903872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -752,7 +762,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
-<node TEXT="Branch" STYLE_REF="Definition" ID="ID_979063484" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Branch" STYLE_REF="Definition" ID="ID_979063484" CREATED="1455910903872" MODIFIED="1455910903872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -776,7 +786,7 @@
</hook>
</node>
</node>
-<node TEXT="Connector" STYLE_REF="Definition" ID="ID_1063899671" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Connector" STYLE_REF="Definition" ID="ID_1063899671" CREATED="1455910903872" MODIFIED="1455910903872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -793,7 +803,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="Cloud" STYLE_REF="Definition" ID="ID_1605059702" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Cloud" STYLE_REF="Definition" ID="ID_1605059702" CREATED="1455910903873" MODIFIED="1455910903873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -811,7 +821,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="Summary Node" STYLE_REF="Definition" ID="ID_1358837812" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Summary Node" STYLE_REF="Definition" ID="ID_1358837812" CREATED="1455910903873" MODIFIED="1455910903873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -829,7 +839,7 @@
</hook>
</node>
</node>
-<node TEXT="Node features" ID="ID_1372334594" TEXT_SHORTENED="true">
+<node TEXT="Node features" ID="ID_1372334594" CREATED="1455910903873" MODIFIED="1455910903873" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -853,7 +863,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Node properties" ID="ID_395697976" TEXT_SHORTENED="true">
+<node TEXT="Node properties" ID="ID_395697976" CREATED="1455910903873" MODIFIED="1455910903873" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -883,7 +893,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Chapter guide" STYLE_REF="UserGuide" FOLDED="true" ID="ID_919267416" TEXT_SHORTENED="true" HGAP="30" VSHIFT="3"><richcontent TYPE="DETAILS">
+<node TEXT="Chapter guide" STYLE_REF="UserGuide" FOLDED="true" ID="ID_919267416" CREATED="1455910903873" MODIFIED="1455910903873" TEXT_SHORTENED="true" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="3.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -957,11 +967,11 @@
</html>
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-<node TEXT="Content" ID="ID_1750213503" HGAP="50" VSHIFT="-10">
+<node TEXT="Content" ID="ID_1750213503" CREATED="1455910903873" MODIFIED="1455910903873" HGAP_QUANTITY="50.0 px" VSHIFT_QUANTITY="-10.0 px">
<font BOLD="true"/>
<edge STYLE="hide_edge"/>
</node>
-<node TEXT="My first mind map" FOLDED="true" ID="ID_829890234" TEXT_SHORTENED="true" NUMBERED="true">
+<node TEXT="My first mind map" FOLDED="true" ID="ID_829890234" CREATED="1455910903873" MODIFIED="1455910903873" TEXT_SHORTENED="true" NUMBERED="true">
<attribute NAME="Chapter" VALUE="0"/>
<richcontent TYPE="DETAILS">
@@ -1040,14 +1050,19 @@
</body>
</html>
</richcontent>
-<node TEXT="Define filter rule" FOLDED="true" ID="ID_1670868929">
+<node TEXT="" ID="ID_489731197" CREATED="1455910904133" MODIFIED="1455910904133">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Define filter rule" FOLDED="true" ID="ID_1670868929" CREATED="1455910903874" MODIFIED="1455910903874">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="0"/>
-<node TEXT="Select: Chapter" STYLE_REF="ProcedureStep" ID="ID_1014969877" TEXT_SHORTENED="true">
-<attribute NAME="Chapter" VALUE="0"/>
+<node TEXT="" ID="ID_1472678958" CREATED="1455910904133" MODIFIED="1455910904133">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Select: Chapter" STYLE_REF="ProcedureStep" ID="ID_1014969877" CREATED="1455910903874" MODIFIED="1455910903874" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="0"/>
<richcontent TYPE="DETAILS">
<html>
@@ -1067,75 +1082,82 @@
</html>
</richcontent>
</node>
-<node TEXT="Select: Contains" STYLE_REF="ProcedureStep" ID="ID_1048644932">
+<node TEXT="Select: Contains" STYLE_REF="ProcedureStep" ID="ID_1048644932" CREATED="1455910903874" MODIFIED="1455910903874">
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Select/Enter: 1" STYLE_REF="ProcedureStep" ID="ID_48466550">
+<node TEXT="Select/Enter: 1" STYLE_REF="ProcedureStep" ID="ID_48466550" CREATED="1455910903874" MODIFIED="1455910903874">
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Three entry fields in Toolbar" ID="ID_545396005">
+<node TEXT="" ID="ID_350690225" CREATED="1455910904133" MODIFIED="1455910904133">
<hook NAME="SummaryNode"/>
+<node TEXT="Three entry fields in Toolbar" ID="ID_545396005" CREATED="1455910903874" MODIFIED="1455910903874">
<attribute NAME="Chapter" VALUE="0"/>
</node>
</node>
-<node TEXT="Do filter" STYLE_REF="Procedure" FOLDED="true" ID="ID_1044635142">
-<node TEXT="Press Quick Filter" STYLE_REF="ProcedureStep" ID="ID_1699746394">
+</node>
+<node TEXT="Do filter" STYLE_REF="Procedure" FOLDED="true" ID="ID_1044635142" CREATED="1455910903874" MODIFIED="1455910903874">
+<node TEXT="Press Quick Filter" STYLE_REF="ProcedureStep" ID="ID_1699746394" CREATED="1455910903874" MODIFIED="1455910903874">
<icon BUILTIN="../apply_quick_filter"/>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Show Ancestors: Off" STYLE_REF="ProcedureStep" ID="ID_1477283067">
+<node TEXT="Show Ancestors: Off" STYLE_REF="ProcedureStep" ID="ID_1477283067" CREATED="1455910903875" MODIFIED="1455910903875">
<icon BUILTIN="../show_ancestors"/>
-<hook NAME="FirstGroupNode"/>
<attribute NAME="Chapter" VALUE="0"/>
</node>
</node>
-<node TEXT="Check default filter conditions" FOLDED="true" ID="ID_1618746225">
+<node TEXT="Check default filter conditions" FOLDED="true" ID="ID_1618746225" CREATED="1455910903875" MODIFIED="1455910903875">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="0"/>
-<node TEXT="Show Descendants: Off" STYLE_REF="ProcedureStep" ID="ID_467302191">
+<node TEXT="Show Descendants: Off" STYLE_REF="ProcedureStep" ID="ID_467302191" CREATED="1455910903875" MODIFIED="1455910903875">
<icon BUILTIN="../show_descendants"/>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Unfold all nodes hidden after filtering: On" STYLE_REF="ProcedureStep" ID="ID_178956245">
+<node TEXT="Unfold all nodes hidden after filtering: On" STYLE_REF="ProcedureStep" ID="ID_178956245" CREATED="1455910903875" MODIFIED="1455910903875">
<icon BUILTIN="../unfold_filtered_ancestors"/>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Applies to filtered nodes: Off" STYLE_REF="ProcedureStep" ID="ID_588285753">
+<node TEXT="Applies to filtered nodes: Off" STYLE_REF="ProcedureStep" ID="ID_588285753" CREATED="1455910903875" MODIFIED="1455910903875">
<icon BUILTIN="../applies_to_filtered_nodes"/>
<attribute NAME="Chapter" VALUE="0"/>
</node>
</node>
-<node TEXT="See icon-buttons in Toolbar" ID="ID_1962045856">
-<attribute NAME="Chapter" VALUE="0"/>
+<node TEXT="" ID="ID_460777695" CREATED="1455910904133" MODIFIED="1455910904133">
<hook NAME="SummaryNode"/>
+<node TEXT="See icon-buttons in Toolbar" ID="ID_1962045856" CREATED="1455910903876" MODIFIED="1455910903876">
+<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="To end filter 1. My first mind map" FOLDED="true" ID="ID_1678666271">
+</node>
+<node TEXT="To end filter 1. My first mind map" FOLDED="true" ID="ID_1678666271" CREATED="1455910903876" MODIFIED="1455910903876">
<attribute NAME="Chapter" VALUE="1"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<edge STYLE="horizontal"/>
-<node TEXT="Press: Undo filter" STYLE_REF="ProcedureStep" ID="ID_1343052095">
+<node TEXT="Press: Undo filter" STYLE_REF="ProcedureStep" ID="ID_1343052095" CREATED="1455910903876" MODIFIED="1455910903876">
<icon BUILTIN="../remove_filtering"/>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Select root node (press Esc)" STYLE_REF="ProcedureStep" ID="ID_1663841014">
+<node TEXT="" ID="ID_1058981461" CREATED="1455910904134" MODIFIED="1455910904134">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Select root node (press Esc)" STYLE_REF="ProcedureStep" ID="ID_1663841014" CREATED="1455910903876" MODIFIED="1455910903876">
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Press: Fold all descendants" STYLE_REF="ProcedureStep" ID="ID_1495450969">
+<node TEXT="Press: Fold all descendants" STYLE_REF="ProcedureStep" ID="ID_1495450969" CREATED="1455910903876" MODIFIED="1455910903876">
<icon BUILTIN="../fold_all"/>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Fold all nodes" ID="ID_1931349122">
+<node TEXT="" ID="ID_956530449" CREATED="1455910904134" MODIFIED="1455910904134">
<hook NAME="SummaryNode"/>
+<node TEXT="Fold all nodes" ID="ID_1931349122" CREATED="1455910903876" MODIFIED="1455910903876">
<attribute NAME="Chapter" VALUE="1"/>
</node>
</node>
</node>
-<node TEXT="Handling nodes" ID="ID_1153833253" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Handling nodes" ID="ID_1153833253" CREATED="1455910903876" MODIFIED="1455910903876" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1170,7 +1192,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Node features" ID="ID_1790476268" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Node features" ID="ID_1790476268" CREATED="1455910903877" MODIFIED="1455910903877" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1196,7 +1218,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Format & Style" ID="ID_1115783310" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Format & Style" ID="ID_1115783310" CREATED="1455910903877" MODIFIED="1455910903877" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1222,7 +1244,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Date, Time & Reminder" ID="ID_13139289" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Date, Time & Reminder" ID="ID_13139289" CREATED="1455910903877" MODIFIED="1455910903877" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1248,7 +1270,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Moving & Publishing maps" ID="ID_70860166" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Moving & Publishing maps" ID="ID_70860166" CREATED="1455910903877" MODIFIED="1455910903877" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1274,7 +1296,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Scripts & Formulas" ID="ID_1425593168" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Scripts & Formulas" ID="ID_1425593168" CREATED="1455910903877" MODIFIED="1455910903877" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1300,7 +1322,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Security & Preferences" ID="ID_1563209179" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Security & Preferences" ID="ID_1563209179" CREATED="1455910903877" MODIFIED="1455910903877" TEXT_SHORTENED="true" NUMBERED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1326,7 +1348,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="9.Finding & Filtering" ID="ID_1111099001" TEXT_SHORTENED="true">
+<node TEXT="9.Finding & Filtering" ID="ID_1111099001" CREATED="1455910903877" MODIFIED="1455910903877" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="9"/>
<richcontent TYPE="DETAILS">
@@ -1353,8 +1375,8 @@
</html>
</richcontent>
</node>
-<node TEXT="Appendix" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1016814885">
-<node TEXT="Show all definitions" FOLDED="true" ID="ID_1066951352" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Appendix" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1016814885" CREATED="1455910903877" MODIFIED="1455910903877">
+<node TEXT="Show all definitions" FOLDED="true" ID="ID_1066951352" CREATED="1455910903877" MODIFIED="1455910903877" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -1389,7 +1411,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="Check conditions" STYLE_REF="UserGuide" FOLDED="true" ID="ID_235662859" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Check conditions" STYLE_REF="UserGuide" FOLDED="true" ID="ID_235662859" CREATED="1455910903877" MODIFIED="1455910903877" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1402,54 +1424,51 @@
</body>
</html>
</richcontent>
-<node TEXT="Show Ancestors: Off" STYLE_REF="ProcedureStep" ID="ID_173119044">
+<node TEXT="Show Ancestors: Off" STYLE_REF="ProcedureStep" ID="ID_173119044" CREATED="1455910903877" MODIFIED="1455910903877">
<icon BUILTIN="../show_ancestors"/>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Show Descendants: Off" STYLE_REF="ProcedureStep" ID="ID_685714769">
+<node TEXT="Show Descendants: Off" STYLE_REF="ProcedureStep" ID="ID_685714769" CREATED="1455910903878" MODIFIED="1455910903878">
<icon BUILTIN="../show_descendants"/>
</node>
-<node TEXT="Unfold all nodes hidden after filtering: Off" STYLE_REF="ProcedureStep" ID="ID_1351621161">
+<node TEXT="Unfold all nodes hidden after filtering: Off" STYLE_REF="ProcedureStep" ID="ID_1351621161" CREATED="1455910903878" MODIFIED="1455910903878">
<icon BUILTIN="../unfold_filtered_ancestors"/>
</node>
-<node TEXT="Applies to filtered nodes: Off" STYLE_REF="ProcedureStep" ID="ID_1625012504">
+<node TEXT="Applies to filtered nodes: Off" STYLE_REF="ProcedureStep" ID="ID_1625012504" CREATED="1455910903878" MODIFIED="1455910903878">
<icon BUILTIN="../applies_to_filtered_nodes"/>
</node>
</node>
-<node TEXT="Unfold all nodes" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1616604166">
-<node TEXT="Select root node (press Esc)" ID="ID_385659674">
-<hook NAME="FirstGroupNode"/>
-</node>
-<node TEXT="Press: Unfold all descendants" ID="ID_1954125202">
+<node TEXT="Unfold all nodes" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1616604166" CREATED="1455910903878" MODIFIED="1455910903878">
+<node TEXT="Select root node (press Esc)" ID="ID_385659674" CREATED="1455910903878" MODIFIED="1455910903878"/>
+<node TEXT="Press: Unfold all descendants" ID="ID_1954125202" CREATED="1455910903878" MODIFIED="1455910903878">
<icon BUILTIN="../unfold_all"/>
</node>
</node>
-<node TEXT="Define filter" STYLE_REF="UserGuide" FOLDED="true" ID="ID_989011629">
-<node TEXT="Select: Class" ID="ID_1042564393">
-<hook NAME="FirstGroupNode"/>
-</node>
-<node TEXT="Select: Contains" ID="ID_1553005293"/>
-<node TEXT="Select: Definition" ID="ID_695746856"/>
-<node TEXT="Press Quick Filter" ID="ID_1377895866">
+<node TEXT="Define filter" STYLE_REF="UserGuide" FOLDED="true" ID="ID_989011629" CREATED="1455910903879" MODIFIED="1455910903879">
+<node TEXT="Select: Class" ID="ID_1042564393" CREATED="1455910903879" MODIFIED="1455910903879"/>
+<node TEXT="Select: Contains" ID="ID_1553005293" CREATED="1455910903879" MODIFIED="1455910903879"/>
+<node TEXT="Select: Definition" ID="ID_695746856" CREATED="1455910903879" MODIFIED="1455910903879"/>
+<node TEXT="Press Quick Filter" ID="ID_1377895866" CREATED="1455910903879" MODIFIED="1455910903879">
<icon BUILTIN="../apply_quick_filter"/>
</node>
</node>
-<node TEXT="To end" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1694191165">
-<node TEXT="Press: Undo filter" ID="ID_738883159">
+<node TEXT="To end" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1694191165" CREATED="1455910903879" MODIFIED="1455910903879">
+<node TEXT="Press: Undo filter" ID="ID_738883159" CREATED="1455910903879" MODIFIED="1455910903879">
<icon BUILTIN="../remove_filtering"/>
</node>
-<node TEXT="Select root node (press Esc)" STYLE_REF="ProcedureStep" ID="ID_352017968">
+<node TEXT="" ID="ID_462976021" CREATED="1455910904134" MODIFIED="1455910904134">
<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Press: Fold all descendants" STYLE_REF="ProcedureStep" ID="ID_548666264">
+<node TEXT="Select root node (press Esc)" STYLE_REF="ProcedureStep" ID="ID_352017968" CREATED="1455910903879" MODIFIED="1455910903879"/>
+<node TEXT="Press: Fold all descendants" STYLE_REF="ProcedureStep" ID="ID_548666264" CREATED="1455910903879" MODIFIED="1455910903879">
<icon BUILTIN="../fold_all"/>
</node>
-<node TEXT="Fold all nodes" ID="ID_214673967">
+<node TEXT="" ID="ID_1905605229" CREATED="1455910904134" MODIFIED="1455910904134">
<hook NAME="SummaryNode"/>
+<node TEXT="Fold all nodes" ID="ID_214673967" CREATED="1455910903903" MODIFIED="1455910903903"/>
</node>
</node>
</node>
-<node TEXT="Show all about filtering" FOLDED="true" ID="ID_1873380309" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Show all about filtering" FOLDED="true" ID="ID_1873380309" CREATED="1455910903903" MODIFIED="1455910903903" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -1508,13 +1527,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="Check conditions" STYLE_REF="UserGuide" FOLDED="true" ID="ID_25461383" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Check conditions" STYLE_REF="UserGuide" FOLDED="true" ID="ID_25461383" CREATED="1455910903903" MODIFIED="1455910903903" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1527,57 +1545,54 @@
</body>
</html>
</richcontent>
-<node TEXT="Show Ancestors: Off" ID="ID_495695197">
+<node TEXT="Show Ancestors: Off" ID="ID_495695197" CREATED="1455910903903" MODIFIED="1455910903903">
<icon BUILTIN="../show_ancestors"/>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Show Descendants: Off" ID="ID_878732630">
+<node TEXT="Show Descendants: Off" ID="ID_878732630" CREATED="1455910903904" MODIFIED="1455910903904">
<icon BUILTIN="../show_descendants"/>
</node>
-<node TEXT="Unfold all nodes hidden after filtering: Off" ID="ID_1394638468">
+<node TEXT="Unfold all nodes hidden after filtering: Off" ID="ID_1394638468" CREATED="1455910903905" MODIFIED="1455910903905">
<icon BUILTIN="../unfold_filtered_ancestors"/>
</node>
-<node TEXT="Applies to filtered nodes: Off" ID="ID_1342621920">
+<node TEXT="Applies to filtered nodes: Off" ID="ID_1342621920" CREATED="1455910903905" MODIFIED="1455910903905">
<icon BUILTIN="../applies_to_filtered_nodes"/>
</node>
</node>
-<node TEXT="Unfold all nodes" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1859325076">
-<node TEXT="Select root node (press Esc)" ID="ID_956693368">
-<hook NAME="FirstGroupNode"/>
-</node>
-<node TEXT="Press: Unfold all descendants" ID="ID_205411813">
+<node TEXT="Unfold all nodes" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1859325076" CREATED="1455910903905" MODIFIED="1455910903905">
+<node TEXT="Select root node (press Esc)" ID="ID_956693368" CREATED="1455910903906" MODIFIED="1455910903906"/>
+<node TEXT="Press: Unfold all descendants" ID="ID_205411813" CREATED="1455910903906" MODIFIED="1455910903906">
<icon BUILTIN="../unfold_all"/>
</node>
</node>
-<node TEXT="Define filter rule" STYLE_REF="UserGuide" FOLDED="true" ID="ID_226284160">
-<node TEXT="Select: Node text" ID="ID_1734926057">
-<hook NAME="FirstGroupNode"/>
-</node>
-<node TEXT="Select: Contains" ID="ID_7376434"/>
-<node TEXT="Type: filter" ID="ID_1345958489"/>
-<node TEXT="Press Quick Filter" ID="ID_338438421">
+<node TEXT="Define filter rule" STYLE_REF="UserGuide" FOLDED="true" ID="ID_226284160" CREATED="1455910903906" MODIFIED="1455910903906">
+<node TEXT="Select: Node text" ID="ID_1734926057" CREATED="1455910903906" MODIFIED="1455910903906"/>
+<node TEXT="Select: Contains" ID="ID_7376434" CREATED="1455910903906" MODIFIED="1455910903906"/>
+<node TEXT="Type: filter" ID="ID_1345958489" CREATED="1455910903906" MODIFIED="1455910903906"/>
+<node TEXT="Press Quick Filter" ID="ID_338438421" CREATED="1455910903906" MODIFIED="1455910903906">
<icon BUILTIN="../apply_quick_filter"/>
</node>
</node>
-<node TEXT="To end" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1679478175">
-<node TEXT="Press: Undo filter" ID="ID_407446498">
+<node TEXT="To end" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1679478175" CREATED="1455910903906" MODIFIED="1455910903906">
+<node TEXT="Press: Undo filter" ID="ID_407446498" CREATED="1455910903906" MODIFIED="1455910903906">
<icon BUILTIN="../remove_filtering"/>
</node>
-<node TEXT="Select root node (press Esc)" ID="ID_647928992">
+<node TEXT="" ID="ID_542515272" CREATED="1455910904134" MODIFIED="1455910904134">
<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Press: Fold all descendants" ID="ID_1201115927">
+<node TEXT="Select root node (press Esc)" ID="ID_647928992" CREATED="1455910903907" MODIFIED="1455910903907"/>
+<node TEXT="Press: Fold all descendants" ID="ID_1201115927" CREATED="1455910903907" MODIFIED="1455910903907">
<icon BUILTIN="../fold_all"/>
</node>
-<node TEXT="Fold all nodes" ID="ID_426393770">
+<node TEXT="" ID="ID_1856872649" CREATED="1455910904134" MODIFIED="1455910904134">
<hook NAME="SummaryNode"/>
+<node TEXT="Fold all nodes" ID="ID_426393770" CREATED="1455910903907" MODIFIED="1455910903907"/>
</node>
</node>
</node>
</node>
</node>
-<node TEXT="Install" STYLE_REF="UserGuide" FOLDED="true" ID="ID_931855473" HGAP="26" VSHIFT="4" MIN_WIDTH="80">
-<node TEXT="Download" FOLDED="true" ID="_Freeplane_Link_904501221" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Install" STYLE_REF="UserGuide" FOLDED="true" ID="ID_931855473" CREATED="1455910903907" MODIFIED="1455910903907" HGAP_QUANTITY="26.0 px" VSHIFT_QUANTITY="4.0 px" MIN_WIDTH="80.0 px">
+<node TEXT="Download" FOLDED="true" ID="_Freeplane_Link_904501221" CREATED="1455910903907" MODIFIED="1455910903907" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1590,10 +1605,13 @@
</body>
</html>
</richcontent>
-<node TEXT="Freeplane's homepage" ID="ID_916980386" LINK="http://freeplane.sourceforge.net">
+<node TEXT="Freeplane's homepage" ID="ID_916980386" CREATED="1455910903907" MODIFIED="1455910903907" LINK="http://freeplane.sourceforge.net">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Windows platform" STYLE_REF="Functiegroep" FOLDED="true" ID="_Freeplane_Link_139664576" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="" ID="ID_802761047" CREATED="1455910904135" MODIFIED="1455910904135">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Windows platform" STYLE_REF="Functiegroep" FOLDED="true" ID="_Freeplane_Link_139664576" CREATED="1455910903907" MODIFIED="1455910903907" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -1606,8 +1624,7 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="Download Java Runtime Environment (at least J2RE1.5)" ID="ID_1620747952" LINK="http://java.sun.com/javase/downloads/index.jsp" TEXT_SHORTENED="true">
+<node TEXT="Download Java Runtime Environment (at least J2RE1.5)" ID="ID_1620747952" CREATED="1455910903907" MODIFIED="1455910903907" LINK="http://java.sun.com/javase/downloads/index.jsp" TEXT_SHORTENED="true">
<icon BUILTIN="full-1"/>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
@@ -1625,7 +1642,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Download Freeplane application" ID="_Freeplane_Link_1612101865" LINK="http://freeplane.sourceforge.net" TEXT_SHORTENED="true">
+<node TEXT="Download Freeplane application" ID="_Freeplane_Link_1612101865" CREATED="1455910903907" MODIFIED="1455910903907" LINK="http://freeplane.sourceforge.net" TEXT_SHORTENED="true">
<icon BUILTIN="full-2"/>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
@@ -1643,11 +1660,11 @@
</html>
</richcontent>
</node>
-<node TEXT="Install dictionaries for spell check" ID="ID_375945761">
+<node TEXT="Install dictionaries for spell check" ID="ID_375945761" CREATED="1455910903907" MODIFIED="1455910903907">
<icon BUILTIN="full-3"/>
</node>
</node>
-<node TEXT="Linux platform" STYLE_REF="Functiegroep" ID="ID_839470339" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Linux platform" STYLE_REF="Functiegroep" ID="ID_839470339" CREATED="1455910903907" MODIFIED="1455910903907" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1661,8 +1678,8 @@
</html>
</richcontent>
</node>
-<node TEXT="Ubuntu" ID="ID_461043347"/>
-<node TEXT=" MAC platform" STYLE_REF="Functiegroep" ID="ID_1956173686" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Ubuntu" ID="ID_461043347" CREATED="1455910903908" MODIFIED="1455910903908"/>
+<node TEXT=" MAC platform" STYLE_REF="Functiegroep" ID="ID_1956173686" CREATED="1455910903908" MODIFIED="1455910903908" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1676,12 +1693,14 @@
</html>
</richcontent>
</node>
-<node TEXT="Portable Freeplane" ID="ID_252894978"/>
-<node ID="ID_797098004"><richcontent TYPE="NODE">
+<node TEXT="Portable Freeplane" ID="ID_252894978" CREATED="1455910903908" MODIFIED="1455910903908"/>
+<node TEXT="" ID="ID_557475794" CREATED="1455910904135" MODIFIED="1455910904135">
+<hook NAME="SummaryNode"/>
+<node ID="ID_797098004" CREATED="1455910903908" MODIFIED="1455910903908"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1689,11 +1708,12 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="SummaryNode"/>
</node>
</node>
-<node TEXT="Install" FOLDED="true" ID="Freeplane_Link_1822195277" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Install" FOLDED="true" ID="Freeplane_Link_1822195277" CREATED="1455910903908" MODIFIED="1455910903908" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1711,7 +1731,7 @@
</body>
</html>
</richcontent>
-<node TEXT="System language" ID="ID_172050805" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="System language" ID="ID_172050805" CREATED="1455910903908" MODIFIED="1455910903908" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1744,7 +1764,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Spell check dictionaries" STYLE_REF="Professional" FOLDED="true" ID="ID_141336344" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Spell check dictionaries" STYLE_REF="Professional" FOLDED="true" ID="ID_141336344" CREATED="1455910903908" MODIFIED="1455910903908" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -1757,7 +1777,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Add-on" ID="ID_622849479" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Add-on" ID="ID_622849479" CREATED="1455910903909" MODIFIED="1455910903909" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1772,7 +1792,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Automatic backup" ID="ID_595250711" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Automatic backup" ID="ID_595250711" CREATED="1455910903909" MODIFIED="1455910903909" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -1804,7 +1824,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Set MM indexing in Windows7" ID="ID_952466464" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Set MM indexing in Windows7" ID="ID_952466464" CREATED="1455910903909" MODIFIED="1455910903909" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1852,7 +1872,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Personalized system icons" ID="ID_1121692870"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Personalized system icons" ID="ID_1121692870" CREATED="1455910903909" MODIFIED="1455910903909"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -1908,7 +1928,7 @@
</node>
</node>
</node>
-<node TEXT="Macintosh" STYLE_REF="UserGuide" ID="ID_480781217" TEXT_SHORTENED="true" HGAP="27" VSHIFT="1" MIN_WIDTH="80"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Macintosh" STYLE_REF="UserGuide" ID="ID_480781217" CREATED="1455910903909" MODIFIED="1455910903909" TEXT_SHORTENED="true" HGAP_QUANTITY="27.0 px" VSHIFT_QUANTITY="1.0 px" MIN_WIDTH="80.0 px"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -1993,12 +2013,12 @@
</html>
</richcontent>
</node>
-<node TEXT="This Documentation" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1263067716" HGAP="28" VSHIFT="4">
-<node FOLDED="true" ID="ID_518502200"><richcontent TYPE="NODE">
+<node TEXT="This Documentation" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1263067716" CREATED="1455910903909" MODIFIED="1455910903909" HGAP_QUANTITY="28.0 px" VSHIFT_QUANTITY="4.0 px">
+<node FOLDED="true" ID="ID_518502200" CREATED="1455910903910" MODIFIED="1455910903910"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p style="text-align: centre">
@@ -2006,11 +2026,12 @@
</p>
</body>
</html>
+
</richcontent>
-<node TEXT="Use Design principles" FOLDED="true" ID="ID_1034693607" TEXT_SHORTENED="true">
-<node TEXT="Easy use" FOLDED="true" ID="ID_971999971" TEXT_SHORTENED="true">
-<node TEXT="Target group: educated laymen" FOLDED="true" ID="ID_650466721" TEXT_SHORTENED="true">
-<node TEXT="The visually limited" ID="ID_1067605334" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Use Design principles" FOLDED="true" ID="ID_1034693607" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true">
+<node TEXT="Easy use" FOLDED="true" ID="ID_971999971" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true">
+<node TEXT="Target group: educated laymen" FOLDED="true" ID="ID_650466721" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true">
+<node TEXT="The visually limited" ID="ID_1067605334" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2030,7 +2051,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Scoped visibility" FOLDED="true" ID="ID_1491781564" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Scoped visibility" FOLDED="true" ID="ID_1491781564" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2043,24 +2064,25 @@
</body>
</html>
</richcontent>
-<node TEXT="Predefined Filters" ID="ID_1063131817" TEXT_SHORTENED="true"/>
+<node TEXT="Predefined Filters" ID="ID_1063131817" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="Standard content types" FOLDED="true" ID="ID_1568417876" TEXT_SHORTENED="true">
-<node TEXT="Reading guidance" ID="ID_754327054" TEXT_SHORTENED="true"/>
-<node TEXT="Definitions" ID="ID_1594805543" TEXT_SHORTENED="true"/>
-<node TEXT="Methods" ID="ID_1690427045" TEXT_SHORTENED="true"/>
-<node TEXT="Refine information" ID="ID_1224425563" TEXT_SHORTENED="true"/>
-<node TEXT="Exceptions" ID="ID_22860584"/>
-<node TEXT="Examples" ID="ID_1077186776" TEXT_SHORTENED="true"/>
+<node TEXT="Standard content types" FOLDED="true" ID="ID_1568417876" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true">
+<node TEXT="Reading guidance" ID="ID_754327054" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"/>
+<node TEXT="Definitions" ID="ID_1594805543" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"/>
+<node TEXT="Methods" ID="ID_1690427045" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"/>
+<node TEXT="Refine information" ID="ID_1224425563" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"/>
+<node TEXT="Exceptions" ID="ID_22860584" CREATED="1455910903910" MODIFIED="1455910903910"/>
+<node TEXT="Examples" ID="ID_1077186776" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="Standard use of node elements" FOLDED="true" ID="ID_1585389386" TEXT_SHORTENED="true">
-<node TEXT="core: title/name" ID="ID_1920924045" TEXT_SHORTENED="true">
+<node TEXT="Standard use of node elements" FOLDED="true" ID="ID_1585389386" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_457013551" CREATED="1455910904135" MODIFIED="1455910904135">
<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="details: what/how to" ID="ID_715096689" TEXT_SHORTENED="true"/>
-<node TEXT="Rationale" ID="ID_798222829">
+<node TEXT="core: title/name" ID="ID_1920924045" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"/>
+<node TEXT="details: what/how to" ID="ID_715096689" CREATED="1455910903910" MODIFIED="1455910903910" TEXT_SHORTENED="true"/>
+<node TEXT="" ID="ID_93481004" CREATED="1455910904135" MODIFIED="1455910904135">
<hook NAME="SummaryNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Rationale" ID="ID_798222829" CREATED="1455910903910" MODIFIED="1455910903910"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2086,21 +2108,22 @@
</richcontent>
</node>
</node>
-<node TEXT="Standard Form" FOLDED="true" ID="ID_762818872" TEXT_SHORTENED="true">
-<node TEXT="Styles" ID="ID_1772043588" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="Easy handling" FOLDED="true" ID="ID_41805908" TEXT_SHORTENED="true">
-<node TEXT="Scripts" ID="ID_53029889" TEXT_SHORTENED="true"/>
+<node TEXT="Standard Form" FOLDED="true" ID="ID_762818872" CREATED="1455910903912" MODIFIED="1455910903912" TEXT_SHORTENED="true">
+<node TEXT="Styles" ID="ID_1772043588" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"/>
</node>
+<node TEXT="Easy handling" FOLDED="true" ID="ID_41805908" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true">
+<node TEXT="Scripts" ID="ID_53029889" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="Easy maintenance" FOLDED="true" ID="ID_684636398" TEXT_SHORTENED="true">
-<node TEXT="Follow structure of Main menu" ID="ID_96415895" TEXT_SHORTENED="true"/>
-<node TEXT="Define content once, use many" ID="ID_599399448" TEXT_SHORTENED="true"/>
-<node TEXT="Use Conditional styles" ID="ID_1144923217" TEXT_SHORTENED="true"/>
</node>
+<node TEXT="Easy maintenance" FOLDED="true" ID="ID_684636398" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true">
+<node TEXT="Follow structure of Main menu" ID="ID_96415895" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"/>
+<node TEXT="Define content once, use many" ID="ID_599399448" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"/>
+<node TEXT="Use Conditional styles" ID="ID_1144923217" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="Prepare empty mind map" FOLDED="true" ID="ID_548574769" TEXT_SHORTENED="true">
-<node TEXT="Automatic edge color off" ID="ID_1831289663" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Prepare empty mind map" FOLDED="true" ID="ID_548574769" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true">
+<node TEXT="Automatic edge color off" ID="ID_1831289663" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2116,7 +2139,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Attributes invisible" ID="ID_1915815091" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Attributes invisible" ID="ID_1915815091" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2132,7 +2155,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Attribute icon off" ID="ID_1498387169" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Attribute icon off" ID="ID_1498387169" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2149,10 +2172,10 @@
</richcontent>
</node>
</node>
-<node TEXT="Define Category" FOLDED="true" ID="ID_507010795">
-<node TEXT="Content" FOLDED="true" ID="ID_862676309">
-<node TEXT="Definition" ID="ID_611433412" TEXT_SHORTENED="true"/>
-<node TEXT="Method" ID="ID_247256524" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Define Category" FOLDED="true" ID="ID_507010795" CREATED="1455910903913" MODIFIED="1455910903913">
+<node TEXT="Content" FOLDED="true" ID="ID_862676309" CREATED="1455910903913" MODIFIED="1455910903913">
+<node TEXT="Definition" ID="ID_611433412" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"/>
+<node TEXT="Method" ID="ID_247256524" CREATED="1455910903913" MODIFIED="1455910903913" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2166,7 +2189,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Procedure" ID="ID_528236762" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Procedure" ID="ID_528236762" CREATED="1455910903914" MODIFIED="1455910903914" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2180,7 +2203,7 @@
</html>
</richcontent>
</node>
-<node TEXT="OptionalValue" ID="ID_1278994490" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="OptionalValue" ID="ID_1278994490" CREATED="1455910903914" MODIFIED="1455910903914" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2194,7 +2217,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Exception" ID="ID_1086387726" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Exception" ID="ID_1086387726" CREATED="1455910903915" MODIFIED="1455910903915" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2208,7 +2231,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Refine" ID="ID_464752434" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Refine" ID="ID_464752434" CREATED="1455910903915" MODIFIED="1455910903915" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2222,19 +2245,19 @@
</html>
</richcontent>
</node>
-<node TEXT="Example" ID="ID_1007698430" TEXT_SHORTENED="true"/>
-<node TEXT="ToNote" ID="ID_961458845" TEXT_SHORTENED="true"/>
+<node TEXT="Example" ID="ID_1007698430" CREATED="1455910903915" MODIFIED="1455910903915" TEXT_SHORTENED="true"/>
+<node TEXT="ToNote" ID="ID_961458845" CREATED="1455910903915" MODIFIED="1455910903915" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="Structure" FOLDED="true" ID="ID_1577905162">
-<node TEXT="Title" ID="ID_405338718"/>
-<node TEXT="MainMenu" ID="ID_65441144"/>
-<node TEXT="SubMenu" ID="ID_1383579659"/>
-<node TEXT="MainMenuGroupLabel" ID="ID_1034739022"/>
+<node TEXT="Structure" FOLDED="true" ID="ID_1577905162" CREATED="1455910903915" MODIFIED="1455910903915">
+<node TEXT="Title" ID="ID_405338718" CREATED="1455910903915" MODIFIED="1455910903915"/>
+<node TEXT="MainMenu" ID="ID_65441144" CREATED="1455910903915" MODIFIED="1455910903915"/>
+<node TEXT="SubMenu" ID="ID_1383579659" CREATED="1455910903915" MODIFIED="1455910903915"/>
+<node TEXT="MainMenuGroupLabel" ID="ID_1034739022" CREATED="1455910903915" MODIFIED="1455910903915"/>
</node>
-<node TEXT="Revision" ID="ID_1107739085"/>
+<node TEXT="Revision" ID="ID_1107739085" CREATED="1455910903915" MODIFIED="1455910903915"/>
</node>
-<node TEXT="Define Chapter" FOLDED="true" ID="ID_362129212" TEXT_SHORTENED="true">
-<node TEXT="Goal" ID="ID_403391885" TEXT_SHORTENED="true">
+<node TEXT="Define Chapter" FOLDED="true" ID="ID_362129212" CREATED="1455910903915" MODIFIED="1455910903915" TEXT_SHORTENED="true">
+<node TEXT="Goal" ID="ID_403391885" CREATED="1455910903915" MODIFIED="1455910903915" TEXT_SHORTENED="true">
<icon BUILTIN="full-0"/>
<richcontent TYPE="DETAILS">
@@ -2251,7 +2274,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="Chapter 1. My first mind map" ID="ID_1104918030" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Chapter 1. My first mind map" ID="ID_1104918030" CREATED="1455910903915" MODIFIED="1455910903915" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2293,7 +2316,7 @@
<attribute NAME="Chapter" VALUE="1"/>
<font BOLD="true"/>
</node>
-<node TEXT="Chapter 2.Handling nodes" ID="ID_955352628" TEXT_SHORTENED="true">
+<node TEXT="Chapter 2.Handling nodes" ID="ID_955352628" CREATED="1455910903915" MODIFIED="1455910903915" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS">
@@ -2330,7 +2353,7 @@
</richcontent>
<font BOLD="true"/>
</node>
-<node TEXT="Chapter 3.Basic Node features" ID="ID_1361306471" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Chapter 3.Basic Node features" ID="ID_1361306471" CREATED="1455910903915" MODIFIED="1455910903915" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2363,83 +2386,83 @@
<attribute NAME="Chapter" VALUE="3"/>
<font BOLD="true"/>
</node>
-<node TEXT="Chapter 4.Format & Style" ID="ID_1181215259">
+<node TEXT="Chapter 4.Format & Style" ID="ID_1181215259" CREATED="1455910903915" MODIFIED="1455910903915">
<attribute NAME="Chapter" VALUE="4"/>
<font BOLD="true"/>
</node>
-<node TEXT="Chapter 5.Date, Time & Reminder" ID="ID_1315985597">
+<node TEXT="Chapter 5.Date, Time & Reminder" ID="ID_1315985597" CREATED="1455910903915" MODIFIED="1455910903915">
<attribute NAME="Chapter" VALUE="5"/>
<font BOLD="true"/>
</node>
-<node TEXT="Chapter 6.Moving & Publishing maps" ID="ID_1822943808">
+<node TEXT="Chapter 6.Moving & Publishing maps" ID="ID_1822943808" CREATED="1455910903915" MODIFIED="1455910903915">
<attribute NAME="Chapter" VALUE="6"/>
<font BOLD="true"/>
</node>
-<node TEXT="Chapter 7.Scripts & Formulas" ID="ID_1540834370">
+<node TEXT="Chapter 7.Scripts & Formulas" ID="ID_1540834370" CREATED="1455910903916" MODIFIED="1455910903916">
<attribute NAME="Chapter" VALUE="7"/>
<font BOLD="true"/>
</node>
-<node TEXT="Chapter 8.Security & Preferences" ID="ID_390065587">
+<node TEXT="Chapter 8.Security & Preferences" ID="ID_390065587" CREATED="1455910903916" MODIFIED="1455910903916">
<attribute NAME="Chapter" VALUE="8"/>
<font BOLD="true"/>
</node>
</node>
-<node TEXT="Define Styles" FOLDED="true" ID="ID_1310961875" TEXT_SHORTENED="true">
-<node TEXT="Default" ID="ID_150604698" TEXT_SHORTENED="true"/>
-<node TEXT="Definition" STYLE_REF="Defenition" ID="ID_24518950" TEXT_SHORTENED="true">
+<node TEXT="Define Styles" FOLDED="true" ID="ID_1310961875" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true">
+<node TEXT="Default" ID="ID_150604698" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true"/>
+<node TEXT="Definition" STYLE_REF="Defenition" ID="ID_24518950" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="Method" ID="ID_255587171" TEXT_SHORTENED="true">
+<node TEXT="Method" ID="ID_255587171" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="OptionalValue" STYLE_REF="OptionalValue" ID="ID_796900128">
+<node TEXT="OptionalValue" STYLE_REF="OptionalValue" ID="ID_796900128" CREATED="1455910903916" MODIFIED="1455910903916">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Procedure" ID="ID_927469794" COLOR="#006666">
+<node TEXT="Procedure" ID="ID_927469794" CREATED="1455910903916" MODIFIED="1455910903916" COLOR="#006666">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
</node>
-<node TEXT="Exception" ID="ID_497865634" TEXT_SHORTENED="true">
+<node TEXT="Exception" ID="ID_497865634" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
</node>
-<node TEXT="ToNote" ID="ID_21237962" TEXT_SHORTENED="true">
+<node TEXT="ToNote" ID="ID_21237962" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
</node>
-<node TEXT="Refine" ID="ID_1208298554" TEXT_SHORTENED="true">
+<node TEXT="Refine" ID="ID_1208298554" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
</node>
-<node TEXT="Example" STYLE_REF="Example" ID="ID_1230627708">
+<node TEXT="Example" STYLE_REF="Example" ID="ID_1230627708" CREATED="1455910903916" MODIFIED="1455910903916">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
</node>
-<node TEXT="MainMenu" ID="ID_349932844" TEXT_SHORTENED="true">
+<node TEXT="MainMenu" ID="ID_349932844" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
</node>
-<node TEXT="SubMenu" ID="ID_843480445" STYLE="bubble" TEXT_SHORTENED="true">
+<node TEXT="SubMenu" ID="ID_843480445" CREATED="1455910903916" MODIFIED="1455910903916" STYLE="bubble" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
</node>
-<node TEXT="Title" STYLE_REF="Title" ID="ID_1964332650"/>
-<node TEXT="Revision" STYLE_REF="Revision" ID="ID_1824312381"/>
+<node TEXT="Title" STYLE_REF="Title" ID="ID_1964332650" CREATED="1455910903916" MODIFIED="1455910903916"/>
+<node TEXT="Revision" STYLE_REF="Revision" ID="ID_1824312381" CREATED="1455910903916" MODIFIED="1455910903916"/>
</node>
-<node TEXT="Define Conditional styles" FOLDED="true" ID="ID_475303000" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Define Conditional styles" FOLDED="true" ID="ID_475303000" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2463,11 +2486,11 @@
</body>
</html>
</richcontent>
-<node TEXT="Attribute Class defines the style(s) to be applied" ID="ID_813678576" TEXT_SHORTENED="true"/>
-<node TEXT="Class value = list of Style names" ID="ID_864906280" TEXT_SHORTENED="true"/>
+<node TEXT="Attribute Class defines the style(s) to be applied" ID="ID_813678576" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true"/>
+<node TEXT="Class value = list of Style names" ID="ID_864906280" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true"/>
</node>
</node>
-<node TEXT="Translating This Documention" LOCALIZED_STYLE_REF="default" ID="ID_1796932858" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Translating This Documention" LOCALIZED_STYLE_REF="default" ID="ID_1796932858" CREATED="1455910903916" MODIFIED="1455910903916" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2542,7 +2565,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Version, revisions" FOLDED="true" ID="_Freeplane_Link_784043927" TEXT_SHORTENED="true">
+<node TEXT="Version, revisions" FOLDED="true" ID="_Freeplane_Link_784043927" CREATED="1455910903917" MODIFIED="1455910903917" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
@@ -2581,10 +2604,10 @@
</body>
</html>
</richcontent>
-<node TEXT="1.2.12_04" ID="ID_605038742"/>
+<node TEXT="1.2.12_04" ID="ID_605038742" CREATED="1455910903917" MODIFIED="1455910903917"/>
</node>
</node>
-<node TEXT="FAQ" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1040911735" TEXT_SHORTENED="true" HGAP="28" VSHIFT="-7" MIN_WIDTH="80">
+<node TEXT="FAQ" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1040911735" CREATED="1455910903917" MODIFIED="1455910903917" TEXT_SHORTENED="true" HGAP_QUANTITY="28.0 px" VSHIFT_QUANTITY="-7.0 px" MIN_WIDTH="80.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -2624,7 +2647,7 @@
</html>
</richcontent>
<edge STYLE="horizontal"/>
-<node TEXT="All new nodes a bubble, a particular font, edge etc." ID="ID_391816540" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="All new nodes a bubble, a particular font, edge etc." ID="ID_391816540" CREATED="1455910903917" MODIFIED="1455910903917" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2649,7 +2672,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Paste without format" ID="ID_547441247"><richcontent TYPE="DETAILS">
+<node TEXT="Paste without format" ID="ID_547441247" CREATED="1455910903917" MODIFIED="1455910903917"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2663,11 +2686,11 @@
</html>
</richcontent>
</node>
-<node TEXT="Limitations and known bugs" FOLDED="true" ID="ID_1348021717">
-<node TEXT="Nodes with overlapping text" ID="ID_1348493491" LINK="https://sourceforge.net/apps/mantisbt/freeplane/view.php?id=1210"/>
-<node TEXT="Flash player" ID="ID_1294313915" LINK="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4668966"/>
+<node TEXT="Limitations and known bugs" FOLDED="true" ID="ID_1348021717" CREATED="1455910903917" MODIFIED="1455910903917">
+<node TEXT="Nodes with overlapping text" ID="ID_1348493491" CREATED="1455910903917" MODIFIED="1455910903917" LINK="https://sourceforge.net/apps/mantisbt/freeplane/view.php?id=1210"/>
+<node TEXT="Flash player" ID="ID_1294313915" CREATED="1455910903917" MODIFIED="1455910903917" LINK="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4668966"/>
</node>
-<node TEXT="Map / node not editable" ID="ID_398310650" TEXT_SHORTENED="true" STYLE="as_parent"><richcontent TYPE="DETAILS">
+<node TEXT="Map / node not editable" ID="ID_398310650" CREATED="1455910903918" MODIFIED="1455910903918" TEXT_SHORTENED="true" STYLE="as_parent"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2681,7 +2704,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Menu's invisible" ID="ID_475459868" TEXT_SHORTENED="true" STYLE="as_parent"><richcontent TYPE="DETAILS">
+<node TEXT="Menu's invisible" ID="ID_475459868" CREATED="1455910903918" MODIFIED="1455910903918" TEXT_SHORTENED="true" STYLE="as_parent"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2695,7 +2718,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Node does not unfold" ID="ID_582886738" TEXT_SHORTENED="true" STYLE="as_parent"><richcontent TYPE="DETAILS">
+<node TEXT="Node does not unfold" ID="ID_582886738" CREATED="1455910903918" MODIFIED="1455910903918" TEXT_SHORTENED="true" STYLE="as_parent"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2717,7 +2740,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Style not applied" ID="ID_834195855" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Style not applied" ID="ID_834195855" CREATED="1455910903918" MODIFIED="1455910903918" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2731,11 +2754,11 @@
</html>
</richcontent>
</node>
-<node ID="ID_1194109651"><richcontent TYPE="NODE">
+<node ID="ID_1194109651" CREATED="1455910903918" MODIFIED="1455910903918"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2743,9 +2766,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT=" image access denied (Java applet)" ID="ID_44291998"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT=" image access denied (Java applet)" ID="ID_44291998" CREATED="1455910903918" MODIFIED="1455910903918"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2762,7 +2786,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Free floating & free positionable node" ID="ID_279153431"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Free floating & free positionable node" ID="ID_279153431" CREATED="1455910903918" MODIFIED="1455910903918"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2776,7 +2800,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Change default style of new node ( font, bubble, etc)" ID="ID_256904484"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Change default style of new node ( font, bubble, etc)" ID="ID_256904484" CREATED="1455910903918" MODIFIED="1455910903918"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2801,7 +2825,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Script on opening of mindmap" ID="ID_470865141"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Script on opening of mindmap" ID="ID_470865141" CREATED="1455910903918" MODIFIED="1455910903918"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2815,7 +2839,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Batch jobs" ID="ID_1030060663"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Batch jobs" ID="ID_1030060663" CREATED="1455910903918" MODIFIED="1455910903918"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2837,7 +2861,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Tool tip not following viewing %" ID="ID_571521721"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Tool tip not following viewing %" ID="ID_571521721" CREATED="1455910903918" MODIFIED="1455910903918"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2851,18 +2875,18 @@
</html>
</richcontent>
</node>
-<node TEXT="Problem installing Java" FOLDED="true" ID="ID_46334346">
-<node TEXT="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207" ID="ID_1177663722" LINK="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207"/>
+<node TEXT="Problem installing Java" FOLDED="true" ID="ID_46334346" CREATED="1455910903918" MODIFIED="1455910903918">
+<node TEXT="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207" ID="ID_1177663722" CREATED="1455910903918" MODIFIED="1455910903918" LINK="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207"/>
</node>
-<node TEXT="Arrow-hyperlink does not work" ID="ID_109939023" LINK="#ID_265935349"/>
-<node TEXT="Setting the default properties" ID="ID_1547921090" LINK="http://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=219"/>
+<node TEXT="Arrow-hyperlink does not work" ID="ID_109939023" CREATED="1455910903918" MODIFIED="1455910903918" LINK="#ID_265935349"/>
+<node TEXT="Setting the default properties" ID="ID_1547921090" CREATED="1455910903918" MODIFIED="1455910903918" LINK="http://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=219"/>
</node>
</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_1658062789" VSHIFT="111" TEXT_SHORTENED="true" LINK="#ID_566454554"><richcontent TYPE="NODE">
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_1658062789" CREATED="1455910903922" MODIFIED="1455910903922" LINK="#ID_566454554" VSHIFT_QUANTITY="111.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p style="text-align: center">
@@ -2870,6 +2894,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<richcontent TYPE="DETAILS">
@@ -2886,9 +2911,9 @@
</html>
</richcontent>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Contributors" ID="ID_1675707038" HGAP="-95" VSHIFT="29" LINK="http://freeplane.sourceforge.net/wiki/index.php/Contributors"/>
+<node TEXT="Contributors" ID="ID_1675707038" CREATED="1455910903922" MODIFIED="1455910903922" LINK="http://freeplane.sourceforge.net/wiki/index.php/Contributors" HGAP_QUANTITY="-95.0 px" VSHIFT_QUANTITY="29.0 px"/>
</node>
-<node TEXT="Reference" STYLE_REF="Title" POSITION="right" ID="ID_332175012" HGAP="-37" VSHIFT="-64" TEXT_SHORTENED="true">
+<node TEXT="Reference" STYLE_REF="Title" POSITION="right" ID="ID_332175012" CREATED="1455910903922" MODIFIED="1465594674016" HGAP_QUANTITY="-36.0 px" VSHIFT_QUANTITY="-53.0 px" TEXT_SHORTENED="true">
<icon BUILTIN="wizard"/>
<richcontent TYPE="DETAILS">
@@ -2930,8 +2955,8 @@
</html>
</richcontent>
<edge STYLE="bezier"/>
-<node TEXT="File" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1242926404" TEXT_SHORTENED="true" MIN_WIDTH="60" HGAP="19" VSHIFT="27">
-<attribute_layout NAME_WIDTH="37" VALUE_WIDTH="77"/>
+<node TEXT="File" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1242926404" CREATED="1455910903923" MODIFIED="1455910903923" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px" HGAP_QUANTITY="19.0 px" VSHIFT_QUANTITY="27.0 px">
+<attribute_layout NAME_WIDTH="27.75 pt" VALUE_WIDTH="57.75 pt"/>
<attribute NAME="Chapter" VALUE="1,2,6,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
@@ -2949,7 +2974,10 @@
</body>
</html>
</richcontent>
-<node TEXT="New map" ID="ID_1310307853" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_337256790" CREATED="1455910904135" MODIFIED="1455910904135">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="New map" ID="ID_1310307853" CREATED="1455910903923" MODIFIED="1455910903923" TEXT_SHORTENED="true">
<icon BUILTIN="../filenew"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -2964,13 +2992,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="New map from template ..." ID="ID_1630948273" TEXT_SHORTENED="true">
+<node TEXT="New map from template ..." ID="ID_1630948273" CREATED="1455910903924" MODIFIED="1455910903924" TEXT_SHORTENED="true">
<icon BUILTIN="../new_map_"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -2990,7 +3017,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="New protected (encrypted) map..." ID="ID_1015806590" TEXT_SHORTENED="true">
+<node TEXT="New protected (encrypted) map..." ID="ID_1015806590" CREATED="1455910903925" MODIFIED="1455910903925" TEXT_SHORTENED="true">
<icon BUILTIN="../lock"/>
<richcontent TYPE="DETAILS">
@@ -3024,7 +3051,7 @@
</hook>
<attribute NAME="Chapter" VALUE="8"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="" ID="ID_43524792" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_43524792" CREATED="1455910903927" MODIFIED="1455910903927" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -3050,14 +3077,19 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="New map" ID="ID_177723183">
+<node TEXT="" ID="ID_541447148" CREATED="1455910904135" MODIFIED="1455910904135">
<hook NAME="SummaryNode"/>
+<node TEXT="New map" ID="ID_177723183" CREATED="1455910903927" MODIFIED="1455910903927">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2,8"/>
</node>
-<node TEXT="Save map" ID="ID_1253878525" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_590977704" CREATED="1455910904135" MODIFIED="1455910904135">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Save map" ID="ID_1253878525" CREATED="1455910903927" MODIFIED="1455910903927" TEXT_SHORTENED="true">
<icon BUILTIN="../filesave"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -3099,7 +3131,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
</node>
-<node TEXT="Save map as.." ID="ID_449363060" TEXT_SHORTENED="true">
+<node TEXT="Save map as.." ID="ID_449363060" CREATED="1455910903928" MODIFIED="1455910903928" TEXT_SHORTENED="true">
<icon BUILTIN="../filesaveas"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -3119,7 +3151,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Save all open maps" ID="ID_1423263542" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Save all open maps" ID="ID_1423263542" CREATED="1455910903928" MODIFIED="1455910903928" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3136,7 +3168,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Restore from local history" ID="ID_1896010117" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Restore from local history" ID="ID_1896010117" CREATED="1455910903928" MODIFIED="1455910903928" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3175,14 +3207,15 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Save map" ID="ID_1689022735">
+<node TEXT="" ID="ID_405922045" CREATED="1455910904135" MODIFIED="1455910904135">
<hook NAME="SummaryNode"/>
+<node TEXT="Save map" ID="ID_1689022735" CREATED="1455910903928" MODIFIED="1455910903928">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Save folding" ID="ID_1155653392" LINK="#ID_619771458" TEXT_SHORTENED="true">
+<node TEXT="Save folding" ID="ID_1155653392" CREATED="1455910903929" MODIFIED="1455910903929" LINK="#ID_619771458" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -3208,7 +3241,11 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Open saved map..." ID="ID_1284635316" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1528721871" CREATED="1455910904136" MODIFIED="1455910904136">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Open saved map..." ID="ID_1284635316" CREATED="1455910903929" MODIFIED="1455910903929" TEXT_SHORTENED="true">
<icon BUILTIN="../fileopen"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -3223,13 +3260,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
</node>
-<node TEXT="Open map from URL..." ID="ID_351944217" TEXT_SHORTENED="true">
+<node TEXT="Open map from URL..." ID="ID_351944217" CREATED="1455910903929" MODIFIED="1455910903929" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -3247,7 +3283,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Most recent maps" ID="ID_655783347" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Most recent maps" ID="ID_655783347" CREATED="1455910903929" MODIFIED="1455910903929" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3265,14 +3301,15 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Open map" ID="ID_565242033" LINK="#ID_950384750">
+<node TEXT="" ID="ID_1020586826" CREATED="1455910904136" MODIFIED="1455910904136">
<hook NAME="SummaryNode"/>
+<node TEXT="Open map" ID="ID_565242033" CREATED="1455910903930" MODIFIED="1455910903930" LINK="#ID_950384750">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Load settings" ID="ID_553299918" LINK="#ID_950384750">
+<node TEXT="Load settings" ID="ID_553299918" CREATED="1455910903930" MODIFIED="1455910903930" LINK="#ID_950384750">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -3280,7 +3317,11 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Export map" FOLDED="true" ID="ID_1294197740" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_200619842" CREATED="1455910904136" MODIFIED="1455910904136">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Export map" FOLDED="true" ID="ID_1294197740" CREATED="1455910903930" MODIFIED="1455910903930" TEXT_SHORTENED="true">
<icon BUILTIN="../export"/>
<richcontent TYPE="DETAILS">
@@ -3295,12 +3336,14 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
-<node TEXT="As HTML" STYLE_REF="OptionalValue" ID="ID_289318260" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="" ID="ID_947626801" CREATED="1455910904136" MODIFIED="1455910904136">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="As HTML" STYLE_REF="OptionalValue" ID="ID_289318260" CREATED="1455910903931" MODIFIED="1455910903931" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3313,10 +3356,9 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Branch as HTML" STYLE_REF="OptionalValue" ID="ID_1222466772" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Branch as HTML" STYLE_REF="OptionalValue" ID="ID_1222466772" CREATED="1455910903931" MODIFIED="1455910903931" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3331,7 +3373,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Open Office Writer Document (ODT)..." STYLE_REF="OptionalValue" ID="ID_413819995" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Open Office Writer Document (ODT)..." STYLE_REF="OptionalValue" ID="ID_413819995" CREATED="1455910903932" MODIFIED="1455910903932" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3346,7 +3388,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Portable Network Graphics (PNG)..." STYLE_REF="OptionalValue" ID="ID_1426694137" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Portable Network Graphics (PNG)..." STYLE_REF="OptionalValue" ID="ID_1426694137" CREATED="1455910903932" MODIFIED="1455910903932" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3361,7 +3403,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Compressed image (JPEG)..." STYLE_REF="OptionalValue" ID="ID_298130830" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Compressed image (JPEG)..." STYLE_REF="OptionalValue" ID="ID_298130830" CREATED="1455910903932" MODIFIED="1455910903932" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3376,7 +3418,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="As XHTML (Javascript version)..." STYLE_REF="OptionalValue" ID="ID_1590599513" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="As XHTML (Javascript version)..." STYLE_REF="OptionalValue" ID="ID_1590599513" CREATED="1455910903932" MODIFIED="1455910903932" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3391,7 +3433,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="As XHTML (click-able map image version HTML)..." STYLE_REF="OptionalValue" ID="ID_519681176" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="As XHTML (click-able map image version HTML)..." STYLE_REF="OptionalValue" ID="ID_519681176" CREATED="1455910903932" MODIFIED="1455910903932" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3406,7 +3448,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="As Java Applet (HTML)..." STYLE_REF="OptionalValue" ID="ID_376134497" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="As Java Applet (HTML)..." STYLE_REF="OptionalValue" ID="ID_376134497" CREATED="1455910903932" MODIFIED="1455910903932" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3421,8 +3463,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Publish on a website or share" ID="ID_126764093" TEXT_SHORTENED="true" LINK="#ID_1111281504">
-<hook NAME="SummaryNode"/>
+<node TEXT="Publish on a website or share" ID="ID_126764093" CREATED="1455910903932" MODIFIED="1455910903932" LINK="#ID_1111281504" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -3470,7 +3511,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="As Flash (HTML)..." STYLE_REF="OptionalValue" ID="ID_1234525000" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="As Flash (HTML)..." STYLE_REF="OptionalValue" ID="ID_1234525000" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3485,7 +3526,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Tasks from TASKS mode to TaskJuggler file (TJI)..." STYLE_REF="OptionalValue" ID="ID_1188629539" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Tasks from TASKS mode to TaskJuggler file (TJI)..." STYLE_REF="OptionalValue" ID="ID_1188629539" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3500,7 +3541,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Resources from RESOURCES mode to TaskJuggler file (TJI)..." STYLE_REF="OptionalValue" ID="ID_1727885349" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Resources from RESOURCES mode to TaskJuggler file (TJI)..." STYLE_REF="OptionalValue" ID="ID_1727885349" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3515,7 +3556,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="As TWiki (TW)..." STYLE_REF="OptionalValue" ID="ID_1482055774" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="As TWiki (TW)..." STYLE_REF="OptionalValue" ID="ID_1482055774" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3530,43 +3571,43 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Freeplane 1.1" STYLE_REF="OptionalValue" ID="ID_449157790" TEXT_SHORTENED="true">
+<node TEXT="Freeplane 1.1" STYLE_REF="OptionalValue" ID="ID_449157790" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="HTML document (HTM) (HTML)" STYLE_REF="OptionalValue" ID="ID_198819817" TEXT_SHORTENED="true">
+<node TEXT="HTML document (HTM) (HTML)" STYLE_REF="OptionalValue" ID="ID_198819817" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="LaTeX document (TEX)" STYLE_REF="OptionalValue" ID="ID_1973701217" TEXT_SHORTENED="true">
+<node TEXT="LaTeX document (TEX)" STYLE_REF="OptionalValue" ID="ID_1973701217" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="LaTeX book (TXT)" STYLE_REF="OptionalValue" ID="ID_308084692" TEXT_SHORTENED="true">
+<node TEXT="LaTeX book (TXT)" STYLE_REF="OptionalValue" ID="ID_308084692" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="MS Project 2003 (XML)" STYLE_REF="OptionalValue" ID="ID_1015672283" TEXT_SHORTENED="true">
+<node TEXT="MS Project 2003 (XML)" STYLE_REF="OptionalValue" ID="ID_1015672283" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Mediawiki (MWIKI)" STYLE_REF="OptionalValue" ID="ID_1345826529" TEXT_SHORTENED="true">
+<node TEXT="Mediawiki (MWIKI)" STYLE_REF="OptionalValue" ID="ID_1345826529" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Oowriter file (OOWRITER)" STYLE_REF="OptionalValue" ID="ID_123526746" TEXT_SHORTENED="true">
+<node TEXT="Oowriter file (OOWRITER)" STYLE_REF="OptionalValue" ID="ID_123526746" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Opml file (OPML)" STYLE_REF="OptionalValue" ID="ID_1024088291" TEXT_SHORTENED="true">
+<node TEXT="Opml file (OPML)" STYLE_REF="OptionalValue" ID="ID_1024088291" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Plain text (TXT)" STYLE_REF="OptionalValue" ID="ID_581818306" TEXT_SHORTENED="true">
+<node TEXT="Plain text (TXT)" STYLE_REF="OptionalValue" ID="ID_581818306" CREATED="1455910903933" MODIFIED="1455910903933" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Word >= 2003 (DOC, XML)" STYLE_REF="OptionalValue" ID="ID_786673808" TEXT_SHORTENED="true">
+<node TEXT="Word >= 2003 (DOC, XML)" STYLE_REF="OptionalValue" ID="ID_786673808" CREATED="1455910903934" MODIFIED="1455910903934" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="XBEL" STYLE_REF="OptionalValue" ID="ID_1844163113" TEXT_SHORTENED="true">
+<node TEXT="XBEL" STYLE_REF="OptionalValue" ID="ID_1844163113" CREATED="1455910903934" MODIFIED="1455910903934" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="(XML, XLS)" STYLE_REF="OptionalValue" ID="ID_1650734011" TEXT_SHORTENED="true">
+<node TEXT="(XML, XLS)" STYLE_REF="OptionalValue" ID="ID_1650734011" CREATED="1455910903934" MODIFIED="1455910903934" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Portable Document Format (PDF)..." STYLE_REF="OptionalValue" ID="ID_603087610" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Portable Document Format (PDF)..." STYLE_REF="OptionalValue" ID="ID_603087610" CREATED="1455910903934" MODIFIED="1455910903934" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3581,7 +3622,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Scalable Vector Graphics (SVG)" STYLE_REF="OptionalValue" ID="ID_1337380062" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Scalable Vector Graphics (SVG)" STYLE_REF="OptionalValue" ID="ID_1337380062" CREATED="1455910903934" MODIFIED="1455910903934" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3596,8 +3637,9 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="" FOLDED="true" ID="ID_783046977" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1893908548" CREATED="1455910904136" MODIFIED="1455910904136">
<hook NAME="SummaryNode"/>
+<node TEXT="" FOLDED="true" ID="ID_783046977" CREATED="1455910903934" MODIFIED="1455910903934" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -3633,7 +3675,7 @@
</html>
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="To other text editor" ID="ID_22164919" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="To other text editor" ID="ID_22164919" CREATED="1455910903934" MODIFIED="1455910903934" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3650,7 +3692,8 @@
</node>
</node>
</node>
-<node TEXT=" Move branch to new map" ID="ID_995694574" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT=" Move branch to new map" ID="ID_995694574" CREATED="1455910903934" MODIFIED="1455910903934" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3668,33 +3711,36 @@
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Import" FOLDED="true" ID="ID_977906606" TEXT_SHORTENED="true">
+<node TEXT="Import" FOLDED="true" ID="ID_977906606" CREATED="1455910903935" MODIFIED="1455910903935" TEXT_SHORTENED="true">
<icon BUILTIN="../import"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
-<node TEXT="Branch" STYLE_REF="OptionalValue" ID="ID_148627051">
+<node TEXT="" ID="ID_1234151667" CREATED="1455910904136" MODIFIED="1455910904136">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Branch" STYLE_REF="OptionalValue" ID="ID_148627051" CREATED="1455910903936" MODIFIED="1455910903936">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Linked Branch" STYLE_REF="OptionalValue" ID="ID_282345042">
+<node TEXT="Linked Branch" STYLE_REF="OptionalValue" ID="ID_282345042" CREATED="1455910903936" MODIFIED="1455910903936">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="(Linked Branch) Without Root" STYLE_REF="OptionalValue" ID="ID_1230060690">
+<node TEXT="(Linked Branch) Without Root" STYLE_REF="OptionalValue" ID="ID_1230060690" CREATED="1455910903936" MODIFIED="1455910903936">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Explorer favourites..." STYLE_REF="OptionalValue" ID="ID_1416306563">
+<node TEXT="Explorer favourites..." STYLE_REF="OptionalValue" ID="ID_1416306563" CREATED="1455910903936" MODIFIED="1455910903936">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Folder Structure..." STYLE_REF="OptionalValue" ID="ID_379387162">
+<node TEXT="Folder Structure..." STYLE_REF="OptionalValue" ID="ID_379387162" CREATED="1455910903936" MODIFIED="1455910903936">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="MindManager X5 Map..." STYLE_REF="OptionalValue" ID="ID_1880120674">
+<node TEXT="MindManager X5 Map..." STYLE_REF="OptionalValue" ID="ID_1880120674" CREATED="1455910903936" MODIFIED="1455910903936">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="See preferences" ID="ID_1138762077" TEXT_SHORTENED="true" LINK="#ID_1711300863">
+<node TEXT="" ID="ID_543481231" CREATED="1455910904136" MODIFIED="1455910904136">
<hook NAME="SummaryNode"/>
+<node TEXT="See preferences" ID="ID_1138762077" CREATED="1455910903936" MODIFIED="1455910903936" LINK="#ID_1711300863" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -3720,14 +3766,20 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Import/Export map" ID="ID_1115722286">
+</node>
+<node TEXT="" ID="ID_919446501" CREATED="1455910904136" MODIFIED="1455910904136">
<hook NAME="SummaryNode"/>
+<node TEXT="Import/Export map" ID="ID_1115722286" CREATED="1455910903936" MODIFIED="1455910903936">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Print set up" ID="ID_1629904320" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="" ID="ID_1359866138" CREATED="1455910904137" MODIFIED="1455910904137">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Print set up" ID="ID_1629904320" CREATED="1455910903937" MODIFIED="1455910903937" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3786,13 +3838,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Print preview" ID="ID_1079934903" TEXT_SHORTENED="true">
+<node TEXT="Print preview" ID="ID_1079934903" CREATED="1455910903937" MODIFIED="1455910903937" TEXT_SHORTENED="true">
<icon BUILTIN="../print_preview"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -3823,7 +3874,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Print map" ID="ID_111478060" TEXT_SHORTENED="true">
+<node TEXT="Print map" ID="ID_111478060" CREATED="1455910903939" MODIFIED="1455910903939" TEXT_SHORTENED="true">
<icon BUILTIN="../fileprint"/>
<richcontent TYPE="DETAILS">
@@ -3843,20 +3894,22 @@
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Print map" ID="ID_682857312">
+<node TEXT="" ID="ID_1353878458" CREATED="1455910904137" MODIFIED="1455910904137">
<hook NAME="SummaryNode"/>
+<node TEXT="Print map" ID="ID_682857312" CREATED="1455910903939" MODIFIED="1455910903939">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2,6"/>
</node>
-<node TEXT="Map statistics" ID="ID_688770977" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Map statistics" ID="ID_688770977" CREATED="1455910903939" MODIFIED="1455910903939" TEXT_SHORTENED="true">
<icon BUILTIN="../BranchStats"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Close current map" ID="ID_1018458898" TEXT_SHORTENED="true">
+<node TEXT="Close current map" ID="ID_1018458898" CREATED="1455910903941" MODIFIED="1455910903941" TEXT_SHORTENED="true">
<icon BUILTIN="../close"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -3876,7 +3929,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Quit Freeplane" ID="ID_1770693982" TEXT_SHORTENED="true">
+<node TEXT="Quit Freeplane" ID="ID_1770693982" CREATED="1455910903948" MODIFIED="1455910903948" TEXT_SHORTENED="true">
<icon BUILTIN="../quit"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -3896,7 +3949,7 @@
</hook>
</node>
</node>
-<node TEXT="Edit" FOLDED="true" ID="ID_1198850460" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<node TEXT="Edit" FOLDED="true" ID="ID_1198850460" CREATED="1455910903950" MODIFIED="1455910903950" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
@@ -3914,11 +3967,14 @@
</body>
</html>
</richcontent>
-<node TEXT="New node" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1557207269" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_359783165" CREATED="1455910904137" MODIFIED="1455910904137">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="New node" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1557207269" CREATED="1455910903950" MODIFIED="1455910903950" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<node TEXT="New child node" ID="ID_1884846033" TEXT_SHORTENED="true">
+<node TEXT="New child node" ID="ID_1884846033" CREATED="1455910903950" MODIFIED="1455910903950" TEXT_SHORTENED="true">
<icon BUILTIN="../idea"/>
<richcontent TYPE="DETAILS">
@@ -3951,7 +4007,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="New sibling node" ID="ID_1215489649" TEXT_SHORTENED="true">
+<node TEXT="New sibling node" ID="ID_1215489649" CREATED="1455910903951" MODIFIED="1455910903951" TEXT_SHORTENED="true">
<icon BUILTIN="../NewSiblingAction"/>
<richcontent TYPE="DETAILS">
@@ -3984,7 +4040,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="New previous sibling node" ID="ID_819846743" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="New previous sibling node" ID="ID_819846743" CREATED="1455910903952" MODIFIED="1455910903952" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4012,7 +4068,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="New parent node" ID="ID_1596972238" TEXT_SHORTENED="true">
+<node TEXT="New parent node" ID="ID_1596972238" CREATED="1455910903952" MODIFIED="1455910903952" TEXT_SHORTENED="true">
<icon BUILTIN="../stock_text_indent"/>
<richcontent TYPE="DETAILS">
@@ -4042,7 +4098,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="New free node" ID="ID_389982270" TEXT_SHORTENED="true">
+<node TEXT="New free node" ID="ID_389982270" CREATED="1455910903953" MODIFIED="1455910903953" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4060,7 +4116,7 @@
</html>
</richcontent>
</node>
-<node TEXT="New Summary node (selected nodes)" FOLDED="true" ID="ID_1126176775" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="New Summary node (selected nodes)" FOLDED="true" ID="ID_1126176775" CREATED="1455910903953" MODIFIED="1455910903953" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4104,8 +4160,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="" ID="ID_805111336" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_805111336" CREATED="1455910903954" MODIFIED="1455910903954" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -4128,7 +4183,7 @@
</html>
</richcontent>
</node>
-<node TEXT="" ID="ID_1070404224" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1070404224" CREATED="1455910903954" MODIFIED="1455910903954" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -4149,7 +4204,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Summary node / accollade" FOLDED="true" ID="ID_1919219984" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Summary node / accollade" FOLDED="true" ID="ID_1919219984" CREATED="1455910903954" MODIFIED="1455910903954" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4181,32 +4236,36 @@
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
-<node TEXT="" FOLDED="true" ID="ID_1195560268">
+<node TEXT="" FOLDED="true" ID="ID_1195560268" CREATED="1455910903954" MODIFIED="1455910903954">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="1" ID="ID_1351236194" TEXT_SHORTENED="true">
+<node TEXT="1" ID="ID_1351236194" CREATED="1455910903954" MODIFIED="1455910903954" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
</node>
-<node TEXT="2" FOLDED="true" ID="ID_1855113133" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1933844014" CREATED="1455910904137" MODIFIED="1455910904137">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="2" FOLDED="true" ID="ID_1855113133" CREATED="1455910903954" MODIFIED="1455910903954" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
-<node TEXT="xx" ID="ID_1443415412" TEXT_SHORTENED="true"/>
+<node TEXT="xx" ID="ID_1443415412" CREATED="1455910903954" MODIFIED="1455910903954" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="3" ID="ID_642318706" TEXT_SHORTENED="true">
+<node TEXT="3" ID="ID_642318706" CREATED="1455910903954" MODIFIED="1455910903954" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
</node>
-<node TEXT="4 = sumary node" ID="ID_1072874332" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1486807892" CREATED="1455910904137" MODIFIED="1455910904137">
<hook NAME="SummaryNode"/>
+<node TEXT="4 = sumary node" ID="ID_1072874332" CREATED="1455910903954" MODIFIED="1455910903954" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
</node>
-<node TEXT="5" ID="ID_24722596" TEXT_SHORTENED="true">
+</node>
+<node TEXT="5" ID="ID_24722596" CREATED="1455910903954" MODIFIED="1455910903954" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
</node>
</node>
</node>
</node>
</node>
-<node TEXT="Node group" STYLE_REF="SubMenu" FOLDED="true" ID="ID_479655918">
-<node TEXT="Summary node (begin of group)" FOLDED="true" ID="ID_428394610" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Node group" STYLE_REF="SubMenu" FOLDED="true" ID="ID_479655918" CREATED="1455910903955" MODIFIED="1455910903955">
+<node TEXT="Summary node (begin of group)" FOLDED="true" ID="ID_428394610" CREATED="1455910903955" MODIFIED="1455910903955" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4251,7 +4310,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="Node group" ID="ID_1499184609" TEXT_SHORTENED="true">
+<node TEXT="Node group" ID="ID_1499184609" CREATED="1455910903955" MODIFIED="1455910903955" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -4287,7 +4346,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Summary node (set/reset)" ID="ID_1343097813" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Summary node (set/reset)" ID="ID_1343097813" CREATED="1455910903955" MODIFIED="1455910903955" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4331,7 +4390,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Always unfolded node (set/reset)" STYLE_REF="Method" ID="ID_1594802269" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Always unfolded node (set/reset)" STYLE_REF="Method" ID="ID_1594802269" CREATED="1455910903955" MODIFIED="1455910903955" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4345,7 +4404,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Add / remove cloud (default)" ID="ID_649516172" TEXT_SHORTENED="true">
+<node TEXT="Add / remove cloud (default)" ID="ID_649516172" CREATED="1455910903955" MODIFIED="1455910903955" TEXT_SHORTENED="true">
<icon BUILTIN="../Cloud24"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4372,7 +4431,7 @@
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="Connect" FOLDED="true" ID="ID_1803275985" TEXT_SHORTENED="true">
+<node TEXT="Connect" FOLDED="true" ID="ID_1803275985" CREATED="1455910903956" MODIFIED="1455910903956" TEXT_SHORTENED="true">
<icon BUILTIN="../designer"/>
<richcontent TYPE="DETAILS">
@@ -4421,27 +4480,26 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="Connector" ID="ID_725880686" HGAP="50" TEXT_SHORTENED="true">
-<hook NAME="SummaryNode"/>
+<node TEXT="Connector" ID="ID_725880686" CREATED="1455910903958" MODIFIED="1455910903958" HGAP_QUANTITY="50.0 px" TEXT_SHORTENED="true">
+<arrowlink SHAPE="LINE" COLOR="#000099" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_725880686" MIDDLE_LABEL="line + label for self-referenced node" STARTINCLINATION="92;-47;" ENDINCLINATION="92;-47;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<arrowlink SHAPE="LINE" COLOR="#000099" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_725880686" MIDDLE_LABEL="line + label for self-referenced node" STARTINCLINATION="92;-47;" ENDINCLINATION="92;-47;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="node a" ID="ID_504660350" TEXT_SHORTENED="true">
-<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="node a" ID="ID_504660350" CREATED="1455910903958" MODIFIED="1455910903958" TEXT_SHORTENED="true">
<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_580762900" SOURCE_LABEL="begin
label" TARGET_LABEL="end
label" MIDDLE_LABEL="middle
label" STARTINCLINATION="23;33;" ENDINCLINATION="-19;52;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-<node TEXT="node b" ID="ID_519354024" TEXT_SHORTENED="true">
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="node b" ID="ID_519354024" CREATED="1455910903958" MODIFIED="1455910903958" TEXT_SHORTENED="true">
<edge STYLE="bezier"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="node c" ID="ID_580762900" TEXT_SHORTENED="true"/>
+<node TEXT="node c" ID="ID_580762900" CREATED="1455910903958" MODIFIED="1455910903958" TEXT_SHORTENED="true"/>
</node>
</node>
</node>
</node>
-<node TEXT="Link" FOLDED="true" ID="ID_1430712985" TEXT_SHORTENED="true">
+<node TEXT="Link" FOLDED="true" ID="ID_1430712985" CREATED="1455910903958" MODIFIED="1455910903958" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -4495,7 +4553,10 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="Add hyperlink (choose)..." ID="ID_178833757" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1886355153" CREATED="1455910904137" MODIFIED="1455910904137">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Add hyperlink (choose)..." ID="ID_178833757" CREATED="1455910903958" MODIFIED="1455910903958" TEXT_SHORTENED="true">
<icon BUILTIN="../SetLinkByFileChooserAction"/>
<richcontent TYPE="DETAILS">
@@ -4527,13 +4588,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Add or modify hyperlink (type)" FOLDED="true" ID="ID_873690575" TEXT_SHORTENED="true">
+<node TEXT="Add or modify hyperlink (type)" FOLDED="true" ID="ID_873690575" CREATED="1455910903960" MODIFIED="1455910903960" TEXT_SHORTENED="true">
<icon BUILTIN="../SetLinkByTextFieldAction"/>
<richcontent TYPE="DETAILS">
@@ -4566,7 +4626,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="Copy and paste" STYLE_REF="ToNote" ID="ID_248385809" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Copy and paste" STYLE_REF="ToNote" ID="ID_248385809" CREATED="1455910903962" MODIFIED="1455910903962" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -4581,7 +4641,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Convert link from within text" ID="ID_1049705529" TEXT_SHORTENED="true">
+<node TEXT="Convert link from within text" ID="ID_1049705529" CREATED="1455910903962" MODIFIED="1455910903962" TEXT_SHORTENED="true">
<icon BUILTIN="../ExtractLinkFromTextAction"/>
<richcontent TYPE="DETAILS">
@@ -4601,7 +4661,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Add local hyperlink" ID="ID_271903009" TEXT_SHORTENED="true">
+<node TEXT="Add local hyperlink" ID="ID_271903009" CREATED="1455910903964" MODIFIED="1455910903964" TEXT_SHORTENED="true">
<icon BUILTIN="../LinkLocal"/>
<richcontent TYPE="DETAILS">
@@ -4624,7 +4684,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Add hyperlink to menu item" FOLDED="true" ID="ID_1477740287" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Add hyperlink to menu item" FOLDED="true" ID="ID_1477740287" CREATED="1455910903965" MODIFIED="1455910903965" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4641,7 +4701,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="Example start script" ID="ID_1605161172" LINK="#ID_840644558" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Example start script" ID="ID_1605161172" CREATED="1455910903965" MODIFIED="1455910903965" LINK="#ID_840644558" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4660,7 +4720,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Set link anchor" STYLE_REF="Method" ID="ID_232225786" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Set link anchor" STYLE_REF="Method" ID="ID_232225786" CREATED="1455910903965" MODIFIED="1455910903965" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4674,7 +4734,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Make link from anchor" STYLE_REF="Method" ID="ID_617064872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Make link from anchor" STYLE_REF="Method" ID="ID_617064872" CREATED="1455910903965" MODIFIED="1455910903965" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4697,7 +4757,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Make link to anchor" STYLE_REF="Method" ID="ID_209345036" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Make link to anchor" STYLE_REF="Method" ID="ID_209345036" CREATED="1455910903965" MODIFIED="1455910903965" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4720,7 +4780,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Delete link anchor" STYLE_REF="Method" ID="ID_115302013" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Delete link anchor" STYLE_REF="Method" ID="ID_115302013" CREATED="1455910903965" MODIFIED="1455910903965" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4734,7 +4794,7 @@
</html>
</richcontent>
</node>
-<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_557988874" TEXT_SHORTENED="true">
+<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_557988874" CREATED="1455910903965" MODIFIED="1455910903965" TEXT_SHORTENED="true">
<hook NAME="SummaryNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -4743,7 +4803,7 @@
<attribute NAME="Chapter" VALUE="3"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Hyperlink" ID="Freeplane_Link_203858515" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Hyperlink" ID="Freeplane_Link_203858515" CREATED="1455910903966" MODIFIED="1455910903966" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4778,7 +4838,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Hyperlink(s) by drag and drop" ID="ID_640110372" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Hyperlink(s) by drag and drop" ID="ID_640110372" CREATED="1455910903966" MODIFIED="1455910903966" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4806,13 +4866,13 @@
</body>
</html>
</richcontent>
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="161"/>
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="120.75 pt"/>
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
</node>
-<node TEXT="Email link" ID="ID_869144882" LINK="mailto:%20jokro at freeplane.nl" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Email link" ID="ID_869144882" CREATED="1455910903966" MODIFIED="1455910903966" LINK="mailto:%20jokro at freeplane.nl" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4841,7 +4901,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Remove hyperlink or e-mail" ID="ID_1464441556" TEXT_SHORTENED="true">
+<node TEXT="Remove hyperlink or e-mail" ID="ID_1464441556" CREATED="1455910903966" MODIFIED="1455910903966" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
@@ -4868,15 +4928,15 @@
</html>
</richcontent>
</node>
-<node TEXT="Hyperlinks relative" ID="ID_1942965129" LINK="#ID_1309284534">
+<node TEXT="Hyperlinks relative" ID="ID_1942965129" CREATED="1455910903966" MODIFIED="1455910903966" LINK="#ID_1309284534">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Hyperlink in attribute" ID="ID_457929879">
-<attribute_layout NAME_WIDTH="48" VALUE_WIDTH="48"/>
+<node TEXT="Hyperlink in attribute" ID="ID_457929879" CREATED="1455910903966" MODIFIED="1455910903966">
+<attribute_layout NAME_WIDTH="36.0 pt" VALUE_WIDTH="36.0 pt"/>
<attribute NAME="See also" VALUE="#ID_278329781"/>
<attribute NAME="See also" VALUE="#ID_1279811672"/>
<attribute NAME="Chapter" VALUE="3"/>
@@ -4884,7 +4944,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
</node>
-<node TEXT="Link to a node in another map" STYLE_REF="Procedure" ID="ID_199586221" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts#Insert_Link_to_a_node_in_another_map" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Link to a node in another map" STYLE_REF="Procedure" ID="ID_199586221" CREATED="1455910903967" MODIFIED="1455910903967" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts#Insert_Link_to_a_node_in_another_map" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -4914,7 +4974,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="In-line hyperlinks" STYLE_REF="ToNote" ID="ID_408844993"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="In-line hyperlinks" STYLE_REF="ToNote" ID="ID_408844993" CREATED="1455910903967" MODIFIED="1455910903967"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -4954,7 +5014,7 @@
</node>
</node>
</node>
-<node TEXT="Remove node" ID="ID_1954594298" TEXT_SHORTENED="true">
+<node TEXT="Remove node" ID="ID_1954594298" CREATED="1455910903967" MODIFIED="1455910903967" TEXT_SHORTENED="true">
<icon BUILTIN="../editdelete"/>
<richcontent TYPE="DETAILS">
@@ -4984,11 +5044,15 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Node" STYLE_REF="MenuGroupLabel" ID="ID_1306487115">
+<node TEXT="" ID="ID_1966690873" CREATED="1455910904137" MODIFIED="1455910904137">
<hook NAME="SummaryNode"/>
+<node TEXT="Node" STYLE_REF="MenuGroupLabel" ID="ID_1306487115" CREATED="1455910903968" MODIFIED="1455910903968"/>
</node>
-<node TEXT="Node core" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1154882439">
-<node TEXT="Edit core in-line" ID="ID_1162372089" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1417975067" CREATED="1455910904139" MODIFIED="1455910904139">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Node core" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1154882439" CREATED="1455910903969" MODIFIED="1455910903969">
+<node TEXT="Edit core in-line" ID="ID_1162372089" CREATED="1455910903969" MODIFIED="1455910903969" TEXT_SHORTENED="true">
<icon BUILTIN="../edit_node"/>
<richcontent TYPE="DETAILS">
@@ -5059,7 +5123,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Edit core in dialog" ID="ID_1542197841" TEXT_SHORTENED="true">
+<node TEXT="Edit core in dialog" ID="ID_1542197841" CREATED="1455910903970" MODIFIED="1455910903970" TEXT_SHORTENED="true">
<icon BUILTIN="../edit_long_node"/>
<richcontent TYPE="DETAILS">
@@ -5121,7 +5185,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Join nodes" ID="ID_1720469761" TEXT_SHORTENED="true">
+<node TEXT="Join nodes" ID="ID_1720469761" CREATED="1455910903971" MODIFIED="1455910903971" TEXT_SHORTENED="true">
<icon BUILTIN="../JoinNodesAction"/>
<richcontent TYPE="DETAILS">
@@ -5140,7 +5204,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Split nodes" ID="ID_1796564424" TEXT_SHORTENED="true">
+<node TEXT="Split nodes" ID="ID_1796564424" CREATED="1455910903983" MODIFIED="1455910903983" TEXT_SHORTENED="true">
<icon BUILTIN="../split_node"/>
<richcontent TYPE="DETAILS">
@@ -5174,7 +5238,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Change revisions background color" FOLDED="true" ID="ID_974319465" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<node TEXT="Change revisions background color" FOLDED="true" ID="ID_974319465" CREATED="1455910903984" MODIFIED="1455910903984" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
<icon BUILTIN="../RevisionPluginAction"/>
<richcontent TYPE="DETAILS">
@@ -5216,7 +5280,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="Set default revision color" ID="ID_1766752356" LINK="#ID_665414546" TEXT_SHORTENED="true">
+<node TEXT="Set default revision color" ID="ID_1766752356" CREATED="1455910903985" MODIFIED="1455910903985" LINK="#ID_665414546" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -5247,7 +5311,7 @@
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="Alternatives for marking revisions" ID="ID_961541761" TEXT_SHORTENED="true">
+<node TEXT="Alternatives for marking revisions" ID="ID_961541761" CREATED="1455910903985" MODIFIED="1455910903985" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1"/>
<richcontent TYPE="DETAILS">
@@ -5325,7 +5389,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Image by choice or link" ID="ID_1277752024" TEXT_SHORTENED="true">
+<node TEXT="Image by choice or link" ID="ID_1277752024" CREATED="1455910903986" MODIFIED="1455910903986" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5374,8 +5438,8 @@
<attribute NAME="Chapter" VALUE="3"/>
</node>
</node>
-<node TEXT="Icons" STYLE_REF="SubMenu" FOLDED="true" ID="ID_754543229">
-<node TEXT="Icon from table" FOLDED="true" ID="ID_1962266219" TEXT_SHORTENED="true">
+<node TEXT="Icons" STYLE_REF="SubMenu" FOLDED="true" ID="ID_754543229" CREATED="1455910903986" MODIFIED="1455910903986">
+<node TEXT="Icon from table" FOLDED="true" ID="ID_1962266219" CREATED="1455910903986" MODIFIED="1455910903986" TEXT_SHORTENED="true">
<icon BUILTIN="../designer"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -5405,7 +5469,7 @@
</body>
</html>
</richcontent>
-<node TEXT="" ID="ID_1761101081" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1761101081" CREATED="1455910903986" MODIFIED="1455910903986" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -5424,7 +5488,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Icon by category" ID="ID_80370661" TEXT_SHORTENED="true">
+<node TEXT="Icon by category" ID="ID_80370661" CREATED="1455910903986" MODIFIED="1455910903986" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -5442,9 +5506,8 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Progress icon %" FOLDED="true" ID="ID_1053622072" TEXT_SHORTENED="true">
+<node TEXT="Progress icon %" FOLDED="true" ID="ID_1053622072" CREATED="1455910903987" MODIFIED="1455910903987" TEXT_SHORTENED="true">
<icon BUILTIN="25%"/>
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -5478,7 +5541,7 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="Progress Up" ID="ID_1352152467" TEXT_SHORTENED="true">
+<node TEXT="Progress Up" ID="ID_1352152467" CREATED="1455910903987" MODIFIED="1455910903987" TEXT_SHORTENED="true">
<icon BUILTIN="50%"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5497,7 +5560,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Progress Down" ID="ID_1503763375" TEXT_SHORTENED="true">
+<node TEXT="Progress Down" ID="ID_1503763375" CREATED="1455910903987" MODIFIED="1455910903987" TEXT_SHORTENED="true">
<icon BUILTIN="25%"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5516,7 +5579,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Extended progress 10%" ID="ID_931502203">
+<node TEXT="" ID="ID_1309463438" CREATED="1455910904137" MODIFIED="1455910904137">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Extended progress 10%" ID="ID_931502203" CREATED="1455910903987" MODIFIED="1455910903987">
<icon BUILTIN="25%"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5539,13 +5605,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook URI="freeplaneresource:/images/svg/Progress_tenth_02.svg" SIZE="1.0" NAME="ExternalObject"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Extended progress 25%" ID="ID_1330662491" TEXT_SHORTENED="true">
+<node TEXT="Extended progress 25%" ID="ID_1330662491" CREATED="1455910903990" MODIFIED="1455910903990" TEXT_SHORTENED="true">
<icon BUILTIN="25%"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5573,8 +5638,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="" ID="ID_1791031466" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="192"/>
+<node TEXT="" ID="ID_524484700" CREATED="1455910904137" MODIFIED="1455910904137">
+<hook NAME="SummaryNode"/>
+<node TEXT="" ID="ID_1791031466" CREATED="1455910903990" MODIFIED="1455910903990" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="67.5 pt" VALUE_WIDTH="144.0 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -5591,16 +5658,19 @@
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="Delete progress" ID="ID_1336453593" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Delete progress" ID="ID_1336453593" CREATED="1455910903990" MODIFIED="1455910903990" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Show icons hierarchically" ID="ID_1929367560" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1050392655" CREATED="1455910904138" MODIFIED="1455910904138">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Show icons hierarchically" ID="ID_1929367560" CREATED="1455910903990" MODIFIED="1455910903990" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -5617,15 +5687,14 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Show intersections of icons" ID="ID_664401378">
+<node TEXT="Show intersections of icons" ID="ID_664401378" CREATED="1455910903990" MODIFIED="1455910903990">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Remove icons" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1880834440">
-<node TEXT="Remove first icon" ID="ID_1452556696" TEXT_SHORTENED="true">
+<node TEXT="Remove icons" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1880834440" CREATED="1455910903990" MODIFIED="1455910903990">
+<node TEXT="Remove first icon" ID="ID_1452556696" CREATED="1455910903990" MODIFIED="1455910903990" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_first_icon"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -5645,7 +5714,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Remove last icon" ID="ID_424983852" TEXT_SHORTENED="true">
+<node TEXT="Remove last icon" ID="ID_424983852" CREATED="1455910903992" MODIFIED="1455910903992" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_last_icon"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -5665,7 +5734,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Remove all icons" ID="ID_1438443252" TEXT_SHORTENED="true">
+<node TEXT="Remove all icons" ID="ID_1438443252" CREATED="1455910903993" MODIFIED="1455910903993" TEXT_SHORTENED="true">
<icon BUILTIN="../icon_trash"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -5686,8 +5755,8 @@
</richcontent>
</node>
</node>
-<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_892520547" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="211"/>
+<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_892520547" CREATED="1455910903994" MODIFIED="1455910903994" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="158.25 pt"/>
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -5696,7 +5765,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
<hook NAME="SummaryNode"/>
-<node TEXT="Icon" ID="ID_845839827" TEXT_SHORTENED="true">
+<node TEXT="Icon" ID="ID_845839827" CREATED="1455910903995" MODIFIED="1455910903995" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -5715,14 +5784,14 @@
</html>
</richcontent>
</node>
-<node TEXT=" Examples of icons" ID="ID_835126969" TEXT_SHORTENED="true">
+<node TEXT=" Examples of icons" ID="ID_835126969" CREATED="1455910903995" MODIFIED="1455910903995" TEXT_SHORTENED="true">
<icon BUILTIN="help"/>
<icon BUILTIN="yes"/>
<icon BUILTIN="messagebox_warning"/>
<icon BUILTIN="button_ok"/>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Add user defined icon" ID="ID_105231801" TEXT_SHORTENED="true">
+<node TEXT="Add user defined icon" ID="ID_105231801" CREATED="1455910903995" MODIFIED="1455910903995" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -5743,8 +5812,11 @@
</node>
</node>
</node>
-<node TEXT="Node extensions" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1400990107">
-<node TEXT="Edit details in-line" ID="ID_1807308711" TEXT_SHORTENED="true">
+<node TEXT="Node extensions" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1400990107" CREATED="1455910903995" MODIFIED="1455910903995">
+<node TEXT="" ID="ID_1705063006" CREATED="1455910904138" MODIFIED="1455910904138">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Edit details in-line" ID="ID_1807308711" CREATED="1455910903995" MODIFIED="1455910903995" TEXT_SHORTENED="true">
<icon BUILTIN="../edit_details"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5781,7 +5853,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT=" Edit details in dialog" ID="ID_742575187" TEXT_SHORTENED="true">
+<node TEXT=" Edit details in dialog" ID="ID_742575187" CREATED="1455910903997" MODIFIED="1455910903997" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -5811,7 +5883,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Copy extensions from style node" STYLE_REF="Method" ID="ID_1403178597" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Copy extensions from style node" STYLE_REF="Method" ID="ID_1403178597" CREATED="1455910903997" MODIFIED="1455910903997" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5847,7 +5919,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Remove node details" ID="ID_949038869" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Remove node details" ID="ID_949038869" CREATED="1455910903997" MODIFIED="1455910903997" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -5865,7 +5937,9 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Details text" STYLE_REF="MenuGroupLabel" ID="ID_1543644666" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1590437139" CREATED="1455910904138" MODIFIED="1455910904138">
+<hook NAME="SummaryNode"/>
+<node TEXT="Details text" STYLE_REF="MenuGroupLabel" ID="ID_1543644666" CREATED="1455910903997" MODIFIED="1455910903997" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -5911,14 +5985,16 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Add image..." FOLDED="true" ID="ID_334408230" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="" ID="ID_521120346" CREATED="1455910904138" MODIFIED="1455910904138">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Add image..." FOLDED="true" ID="ID_334408230" CREATED="1455910903997" MODIFIED="1455910903997" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -5996,11 +6072,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="" ID="ID_1294427474">
+<node TEXT="" ID="ID_1294427474" CREATED="1455910903998" MODIFIED="1455910903998">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="" ID="ID_1592683562" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1592683562" CREATED="1455910903998" MODIFIED="1455910903998" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -6026,7 +6101,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Drag & drop image, copy & paste link" ID="ID_7896368" TEXT_SHORTENED="true">
+<node TEXT="Drag & drop image, copy & paste link" ID="ID_7896368" CREATED="1455910903998" MODIFIED="1455910903998" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -6094,7 +6169,7 @@
</node>
</node>
</node>
-<node TEXT="Change image..." ID="ID_276232981" TEXT_SHORTENED="true">
+<node TEXT="Change image..." ID="ID_276232981" CREATED="1455910903998" MODIFIED="1455910903998" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -6114,7 +6189,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Remove image" ID="ID_1348672374" TEXT_SHORTENED="true">
+<node TEXT="Remove image" ID="ID_1348672374" CREATED="1455910903999" MODIFIED="1455910903999" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -6134,7 +6209,9 @@
</html>
</richcontent>
</node>
-<node TEXT="Image" ID="ID_1620391394" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1095727490" CREATED="1455910904138" MODIFIED="1455910904138">
+<hook NAME="SummaryNode"/>
+<node TEXT="Image" ID="ID_1620391394" CREATED="1455910903999" MODIFIED="1455910903999" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6189,10 +6266,9 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<hook NAME="SummaryNode"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Publish images" ID="ID_1111281504" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="264"/>
+<node TEXT="Publish images" ID="ID_1111281504" CREATED="1455910903999" MODIFIED="1455910903999" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="198.0 pt"/>
<attribute NAME="Chapter" VALUE="3,6"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -6231,7 +6307,11 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Edit attribute in-line" ID="ID_639830064" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1194580578" CREATED="1455910904138" MODIFIED="1455910904138">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Edit attribute in-line" ID="ID_639830064" CREATED="1455910903999" MODIFIED="1455910903999" TEXT_SHORTENED="true">
<icon BUILTIN="../EditAttributesAction"/>
<richcontent TYPE="DETAILS">
@@ -6265,7 +6345,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Attribute in dialog" FOLDED="true" ID="ID_984784283" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Attribute in dialog" FOLDED="true" ID="ID_984784283" CREATED="1455910904001" MODIFIED="1455910904001" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6307,10 +6387,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="" FOLDED="true" ID="ID_560316882">
+<node TEXT="" FOLDED="true" ID="ID_560316882" CREATED="1455910904001" MODIFIED="1455910904001">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="" ID="ID_110645225" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="163"/>
+<node TEXT="" ID="ID_110645225" CREATED="1455910904001" MODIFIED="1455910904001" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="67.5 pt" VALUE_WIDTH="122.25 pt"/>
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -6329,7 +6409,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Copy and paste attributes" ID="ID_1118988780" TEXT_SHORTENED="true">
+<node TEXT="Copy and paste attributes" ID="ID_1118988780" CREATED="1455910904001" MODIFIED="1455910904001" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -6356,14 +6436,14 @@
</html>
</richcontent>
</node>
-<node TEXT="Show/hide attribute-icon" ID="ID_395016262" LINK="#ID_1228898153">
+<node TEXT="Show/hide attribute-icon" ID="ID_395016262" CREATED="1455910904001" MODIFIED="1455910904001" LINK="#ID_1228898153">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node TEXT="Find & replace attributes..." ID="ID_260530468" TEXT_SHORTENED="true">
+<node TEXT="Find & replace attributes..." ID="ID_260530468" CREATED="1455910904002" MODIFIED="1455910904002" TEXT_SHORTENED="true">
<icon BUILTIN="../showAttributes"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -6383,7 +6463,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Copy attributes" ID="ID_1688307508" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Copy attributes" ID="ID_1688307508" CREATED="1455910904003" MODIFIED="1455910904003" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -6412,7 +6492,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Paste attributes" ID="ID_1986438286" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Paste attributes" ID="ID_1986438286" CREATED="1455910904003" MODIFIED="1455910904003" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -6444,7 +6524,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Attributes from style" ID="ID_1359819434" TEXT_SHORTENED="true">
+<node TEXT="Attributes from style" ID="ID_1359819434" CREATED="1455910904003" MODIFIED="1455910904003" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -6483,25 +6563,25 @@
</html>
</richcontent>
</node>
-<node TEXT="Remove attribute" STYLE_REF="SubMenu" FOLDED="true" ID="ID_187455075">
-<node TEXT="Remove first attribute" ID="ID_869406084" TEXT_SHORTENED="true">
+<node TEXT="Remove attribute" STYLE_REF="SubMenu" FOLDED="true" ID="ID_187455075" CREATED="1455910904003" MODIFIED="1455910904003">
+<node TEXT="Remove first attribute" ID="ID_869406084" CREATED="1455910904003" MODIFIED="1455910904003" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Remove last attribute" STYLE_REF="Method" ID="ID_292812840"/>
-<node TEXT="Remove all attributes" FOLDED="true" ID="ID_8268990" TEXT_SHORTENED="true">
+<node TEXT="Remove last attribute" STYLE_REF="Method" ID="ID_292812840" CREATED="1455910904003" MODIFIED="1455910904003"/>
+<node TEXT="Remove all attributes" FOLDED="true" ID="ID_8268990" CREATED="1455910904003" MODIFIED="1455910904003" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="Remove last attribute" ID="ID_412020595" TEXT_SHORTENED="true">
+<node TEXT="Remove last attribute" ID="ID_412020595" CREATED="1455910904004" MODIFIED="1455910904004" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node TEXT="Attribute manager" STYLE_REF="Method" FOLDED="true" ID="ID_900795535" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Attribute manager" STYLE_REF="Method" FOLDED="true" ID="ID_900795535" CREATED="1455910904004" MODIFIED="1455910904004" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6528,9 +6608,9 @@
</body>
</html>
</richcontent>
-<node TEXT="" FOLDED="true" ID="ID_402800324">
+<node TEXT="" FOLDED="true" ID="ID_402800324" CREATED="1455910904004" MODIFIED="1455910904004">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="" ID="ID_796383862" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_796383862" CREATED="1455910904004" MODIFIED="1455910904004" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -6553,7 +6633,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Hide attribute a1, show attribute a2" ID="ID_475109570">
+<node TEXT="Hide attribute a1, show attribute a2" ID="ID_475109570" CREATED="1455910904004" MODIFIED="1455910904004">
<font ITALIC="false"/>
<richcontent TYPE="NOTE">
@@ -6601,11 +6681,11 @@
</html>
</richcontent>
</node>
-<node ID="ID_510422017" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_510422017" CREATED="1455910904004" MODIFIED="1455910904004" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -6613,6 +6693,7 @@
</p>
</body>
</html>
+
</richcontent>
<font ITALIC="false"/>
<richcontent TYPE="NOTE">
@@ -6669,7 +6750,9 @@
</node>
</node>
</node>
-<node TEXT="Attributes" ID="ID_147715298" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_697418018" CREATED="1455910904138" MODIFIED="1455910904138">
+<hook NAME="SummaryNode"/>
+<node TEXT="Attributes" ID="ID_147715298" CREATED="1455910904004" MODIFIED="1455910904004" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6706,9 +6789,12 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<hook NAME="SummaryNode"/>
</node>
-<node ID="ID_816429133" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+</node>
+<node TEXT="" ID="ID_1602823329" CREATED="1455910904138" MODIFIED="1455910904138">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node ID="ID_816429133" CREATED="1455910904005" MODIFIED="1455910904005" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -6720,6 +6806,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -6742,7 +6829,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
</node>
-<node ID="ID_1933244848" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1933244848" CREATED="1455910904005" MODIFIED="1455910904005" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -6754,13 +6841,14 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
</node>
-<node ID="ID_1339380039" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1339380039" CREATED="1455910904005" MODIFIED="1455910904005" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -6772,13 +6860,16 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
</node>
-<node ID="ID_1750517188" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_1805968035" CREATED="1455910904138" MODIFIED="1455910904138">
+<hook NAME="SummaryNode"/>
+<node ID="ID_1750517188" CREATED="1455910904005" MODIFIED="1455910904005" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -6790,6 +6881,7 @@
</p>
</body>
</html>
+
</richcontent>
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -6810,19 +6902,19 @@
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<hook NAME="SummaryNode"/>
-<node TEXT="See Wiki Page" ID="ID_1974921327" LINK="http://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane" TEXT_SHORTENED="true">
+<node TEXT="See Wiki Page" ID="ID_1974921327" CREATED="1455910904005" MODIFIED="1455910904005" LINK="http://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Add OpenMaps Location..." STYLE_REF="Method" ID="ID_1098466286" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_126026234" CREATED="1455910904138" MODIFIED="1455910904138">
<hook NAME="FirstGroupNode"/>
-<richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Add OpenMaps Location..." STYLE_REF="Method" ID="ID_1098466286" CREATED="1455910904005" MODIFIED="1455910904005" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6836,7 +6928,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Remove OpenMaps Location" STYLE_REF="Method" ID="ID_461519289" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Remove OpenMaps Location" STYLE_REF="Method" ID="ID_461519289" CREATED="1455910904006" MODIFIED="1455910904006" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6850,7 +6942,7 @@
</html>
</richcontent>
</node>
-<node TEXT="View OpenMaps Location" STYLE_REF="Method" ID="ID_670084086" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="View OpenMaps Location" STYLE_REF="Method" ID="ID_670084086" CREATED="1455910904006" MODIFIED="1455910904006" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6864,9 +6956,9 @@
</html>
</richcontent>
</node>
-<node TEXT="Open Maps Plugin" STYLE_REF="SubMenu" ID="ID_1731745488" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1972248716" CREATED="1455910904138" MODIFIED="1455910904138">
<hook NAME="SummaryNode"/>
-<richcontent TYPE="DETAILS">
+<node TEXT="Open Maps Plugin" STYLE_REF="SubMenu" ID="ID_1731745488" CREATED="1455910904006" MODIFIED="1455910904006" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6879,12 +6971,13 @@
</body>
</html>
</richcontent>
-<node TEXT="See Wiki Page" STYLE_REF="Refine" ID="ID_484618424" LINK="http://freeplane.sourceforge.net/wiki/index.php/Open_Street_Map_Plugin">
+<node TEXT="See Wiki Page" STYLE_REF="Refine" ID="ID_484618424" CREATED="1455910904006" MODIFIED="1455910904006" LINK="http://freeplane.sourceforge.net/wiki/index.php/Open_Street_Map_Plugin">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
</node>
-<node TEXT="Note" FOLDED="true" ID="ID_1365598976" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Note" FOLDED="true" ID="ID_1365598976" CREATED="1455910904006" MODIFIED="1455910904006" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -6928,7 +7021,10 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="Edit note in dialog" ID="ID_924676619" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1161252449" CREATED="1455910904139" MODIFIED="1455910904139">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Edit note in dialog" ID="ID_924676619" CREATED="1455910904006" MODIFIED="1455910904006" TEXT_SHORTENED="true">
<icon BUILTIN="../EditNoteInDialogAction"/>
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -6949,7 +7045,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Remove note" ID="ID_142539324" TEXT_SHORTENED="true">
+<node TEXT="Remove note" ID="ID_142539324" CREATED="1455910904007" MODIFIED="1455910904007" TEXT_SHORTENED="true">
<icon BUILTIN="../RemoveNoteAction"/>
<richcontent TYPE="DETAILS">
@@ -6969,7 +7065,9 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Edit in note panel" ID="ID_221910481" COLOR="#663300" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1682205736" CREATED="1455910904139" MODIFIED="1455910904139">
+<hook NAME="SummaryNode"/>
+<node TEXT="Edit in note panel" ID="ID_221910481" CREATED="1455910904009" MODIFIED="1455910904009" COLOR="#663300" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6987,15 +7085,14 @@
</body>
</html>
</richcontent>
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="165"/>
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="123.75 pt"/>
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Note" ID="ID_875633710" TEXT_SHORTENED="true">
+<node TEXT="Note" ID="ID_875633710" CREATED="1455910904009" MODIFIED="1455910904009" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -7014,7 +7111,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Hide note-icons" ID="ID_830303915" LINK="#ID_635307234">
+<node TEXT="Hide note-icons" ID="ID_830303915" CREATED="1455910904009" MODIFIED="1455910904009" LINK="#ID_635307234">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -7022,10 +7119,12 @@
</node>
</node>
</node>
-<node TEXT="Main components" STYLE_REF="MenuGroupLabel" ID="ID_1143096620">
+</node>
+<node TEXT="" ID="ID_1523112638" CREATED="1455910904139" MODIFIED="1455910904139">
<hook NAME="SummaryNode"/>
+<node TEXT="Main components" STYLE_REF="MenuGroupLabel" ID="ID_1143096620" CREATED="1455910904009" MODIFIED="1455910904009"/>
</node>
-<node TEXT="Undo" ID="ID_1899055023" TEXT_SHORTENED="true">
+<node TEXT="Undo" ID="ID_1899055023" CREATED="1455910904009" MODIFIED="1455910904009" TEXT_SHORTENED="true">
<icon BUILTIN="../undo"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7063,7 +7162,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Redo" ID="ID_807893197" TEXT_SHORTENED="true">
+<node TEXT="Redo" ID="ID_807893197" CREATED="1455910904011" MODIFIED="1455910904011" TEXT_SHORTENED="true">
<icon BUILTIN="../redo"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7082,7 +7181,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Cut" ID="ID_353410114" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1931212514" CREATED="1455910904139" MODIFIED="1455910904139">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Cut" ID="ID_353410114" CREATED="1455910904012" MODIFIED="1455910904012" TEXT_SHORTENED="true">
<icon BUILTIN="../editcut"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7097,13 +7199,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Copy" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1000565263">
-<node TEXT="Copy" ID="ID_1274800359" TEXT_SHORTENED="true">
+<node TEXT="Copy" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1000565263" CREATED="1455910904012" MODIFIED="1455910904012">
+<node TEXT="Copy" ID="ID_1274800359" CREATED="1455910904013" MODIFIED="1455910904013" TEXT_SHORTENED="true">
<icon BUILTIN="../editcopy"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7122,7 +7223,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Copy node (single)" ID="ID_1302326175" TEXT_SHORTENED="true">
+<node TEXT="Copy node (single)" ID="ID_1302326175" CREATED="1455910904013" MODIFIED="1455910904013" TEXT_SHORTENED="true">
<icon BUILTIN="../copy_single"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7141,7 +7242,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Copy node ID" ID="ID_1433358397" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Copy node ID" ID="ID_1433358397" CREATED="1455910904014" MODIFIED="1455910904014" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7173,7 +7274,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Copy node URI" STYLE_REF="Method" ID="ID_874062942" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Copy node URI" STYLE_REF="Method" ID="ID_874062942" CREATED="1455910904014" MODIFIED="1455910904014" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7197,7 +7298,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Paste" ID="ID_1705754282" TEXT_SHORTENED="true">
+<node TEXT="Paste" ID="ID_1705754282" CREATED="1455910904014" MODIFIED="1455910904014" TEXT_SHORTENED="true">
<icon BUILTIN="../editpaste"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7216,25 +7317,29 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Paste as..." ID="ID_1160623822">
+<node TEXT="Paste as..." ID="ID_1160623822" CREATED="1455910904015" MODIFIED="1455910904015">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Cut, copy and paste" ID="ID_758366226">
+<node TEXT="" ID="ID_1918255340" CREATED="1455910904139" MODIFIED="1455910904139">
<hook NAME="SummaryNode"/>
+<node TEXT="Cut, copy and paste" ID="ID_758366226" CREATED="1455910904015" MODIFIED="1455910904015">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Move and sort" STYLE_REF="Aggregatie als Toelichting" FOLDED="true" ID="ID_999302270" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Move and sort" STYLE_REF="Aggregatie als Toelichting" FOLDED="true" ID="ID_999302270" CREATED="1455910904015" MODIFIED="1455910904015" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="Move node (Sibling down)" ID="ID_694884995" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_77602345" CREATED="1455910904140" MODIFIED="1455910904140">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Move node (Sibling down)" ID="ID_694884995" CREATED="1455910904015" MODIFIED="1455910904015" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7264,7 +7369,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Move node (Sibling up)" ID="ID_33657896" TEXT_SHORTENED="true">
+<node TEXT="Move node (Sibling up)" ID="ID_33657896" CREATED="1455910904015" MODIFIED="1455910904015" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7294,7 +7399,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Sort children" ID="ID_1942706169" TEXT_SHORTENED="true">
+<node TEXT="Sort children" ID="ID_1942706169" CREATED="1455910904015" MODIFIED="1455910904015" TEXT_SHORTENED="true">
<icon BUILTIN="../SortNodes"/>
<richcontent TYPE="DETAILS">
@@ -7314,7 +7419,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Move node (Parents sibling)" ID="ID_1330098607" TEXT_SHORTENED="true">
+<node TEXT="Move node (Parents sibling)" ID="ID_1330098607" CREATED="1455910904017" MODIFIED="1455910904017" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7347,7 +7452,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Move node (Siblings child)" ID="ID_1588077274" TEXT_SHORTENED="true">
+<node TEXT="Move node (Siblings child)" ID="ID_1588077274" CREATED="1455910904017" MODIFIED="1455910904017" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7380,19 +7485,21 @@
</html>
</richcontent>
</node>
-<node TEXT="Vertical space between nodes" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" STYLE="combined">
+<node TEXT="" ID="ID_187479019" CREATED="1455910904140" MODIFIED="1455910904140">
+<hook NAME="SummaryNode"/>
+<node TEXT="Vertical space between nodes" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" CREATED="1455910904017" MODIFIED="1455910904017" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
-<node TEXT="Theminimal vertical spacing between nodes can be set for all nodes. Keep Ctrl pressed, select a nodes handle (oval) and move the cursor up/down to change the vertical space for all nodes." ID="ID_801516363" HGAP="-158" VSHIFT="30">
+<node TEXT="Theminimal vertical spacing between nodes can be set for all nodes. Keep Ctrl pressed, select a nodes handle (oval) and move the cursor up/down to change the vertical space for all nodes." ID="ID_801516363" CREATED="1455910904017" MODIFIED="1455910904017" HGAP_QUANTITY="-158.0 px" VSHIFT_QUANTITY="30.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node TEXT="Free positioned node (set/reset)" STYLE_REF="Method" ID="ID_572207726" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Free positioned node (set/reset)" STYLE_REF="Method" ID="ID_572207726" CREATED="1455910904017" MODIFIED="1455910904017" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7435,7 +7542,7 @@
</html>
</richcontent>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Limitation" STYLE_REF="ToNote" ID="ID_294060265" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Limitation" STYLE_REF="ToNote" ID="ID_294060265" CREATED="1455910904018" MODIFIED="1455910904018" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7456,7 +7563,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Reset node position" ID="ID_1003048503" TEXT_SHORTENED="true">
+<node TEXT="Reset node position" ID="ID_1003048503" CREATED="1455910904018" MODIFIED="1455910904018" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7475,7 +7582,10 @@
</richcontent>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Find..." ID="ID_412879235" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1256868678" CREATED="1455910904140" MODIFIED="1455910904140">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Find..." ID="ID_412879235" CREATED="1455910904018" MODIFIED="1455910904018" TEXT_SHORTENED="true">
<icon BUILTIN="../filefind"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7501,13 +7611,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Find next" ID="ID_409531459" TEXT_SHORTENED="true">
+<node TEXT="Find next" ID="ID_409531459" CREATED="1455910904020" MODIFIED="1455910904020" TEXT_SHORTENED="true">
<icon BUILTIN="../find_next"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7538,7 +7647,7 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Find and Replace..." ID="ID_1230019641" TEXT_SHORTENED="true">
+<node TEXT="Find and Replace..." ID="ID_1230019641" CREATED="1455910904020" MODIFIED="1455910904020" TEXT_SHORTENED="true">
<icon BUILTIN="../NodeListAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -7569,7 +7678,7 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Find last modified nodes" ID="ID_1272430146" TEXT_SHORTENED="true">
+<node TEXT="Find last modified nodes" ID="ID_1272430146" CREATED="1455910904022" MODIFIED="1455910904022" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -7610,7 +7719,7 @@
<attribute NAME="Chapter" VALUE="9"/>
</node>
</node>
-<node TEXT="Find and replace in all maps" ID="ID_4891503" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Find and replace in all maps" ID="ID_4891503" CREATED="1455910904022" MODIFIED="1455910904022" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -7639,16 +7748,18 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Find and replace" ID="ID_1229770899">
+<node TEXT="" ID="ID_195530013" CREATED="1455910904140" MODIFIED="1455910904140">
<hook NAME="SummaryNode"/>
+<node TEXT="Find and replace" ID="ID_1229770899" CREATED="1455910904022" MODIFIED="1455910904022">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
</node>
-<node TEXT="View" STYLE_REF="MainMenu" FOLDED="true" ID="ID_389115947" TEXT_SHORTENED="true" MIN_WIDTH="60">
-<attribute_layout VALUE_WIDTH="216"/>
+</node>
+<node TEXT="View" STYLE_REF="MainMenu" FOLDED="true" ID="ID_389115947" CREATED="1455910904022" MODIFIED="1455910904022" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px">
+<attribute_layout VALUE_WIDTH="162.0 pt"/>
<attribute NAME="Chapter" VALUE="1,2,3,4,5"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
@@ -7666,7 +7777,7 @@
</body>
</html>
</richcontent>
-<node TEXT="New map view" ID="ID_1759737398" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="New map view" ID="ID_1759737398" CREATED="1455910904023" MODIFIED="1455910904023" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7683,7 +7794,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Toolbars" FOLDED="true" ID="ID_1963983857" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Toolbars" FOLDED="true" ID="ID_1963983857" CREATED="1455910904023" MODIFIED="1455910904023" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7712,7 +7823,10 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="Menubar" FOLDED="true" ID="ID_926021846" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="" ID="ID_753922693" CREATED="1455910904141" MODIFIED="1455910904141">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Menubar" FOLDED="true" ID="ID_926021846" CREATED="1455910904023" MODIFIED="1455910904023" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -7743,8 +7857,8 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="Main menu-bar" ID="ID_1325292461" TEXT_SHORTENED="true">
-<attribute_layout VALUE_WIDTH="175"/>
+<node TEXT="Main menu-bar" ID="ID_1325292461" CREATED="1455910904023" MODIFIED="1455910904023" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="131.25 pt"/>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
@@ -7778,7 +7892,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Toolbar" FOLDED="true" ID="ID_1777795790" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Toolbar" FOLDED="true" ID="ID_1777795790" CREATED="1455910904023" MODIFIED="1455910904023" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -7806,7 +7920,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="Main toolbar" ID="ID_1091232727" TEXT_SHORTENED="true">
+<node TEXT="Main toolbar" ID="ID_1091232727" CREATED="1455910904023" MODIFIED="1455910904023" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -7829,7 +7943,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Filter toolbar" FOLDED="true" ID="ID_850553052" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Filter toolbar" FOLDED="true" ID="ID_850553052" CREATED="1455910904024" MODIFIED="1455910904024" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -7857,7 +7971,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="Filter toolbar" ID="ID_793475442" TEXT_SHORTENED="true">
+<node TEXT="Filter toolbar" ID="ID_793475442" CREATED="1455910904024" MODIFIED="1455910904024" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -7877,7 +7991,7 @@
</richcontent>
</node>
</node>
-<node TEXT="F-bar" ID="ID_664958295" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="F-bar" ID="ID_664958295" CREATED="1455910904024" MODIFIED="1455910904024" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -7920,7 +8034,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Icons toolbar" ID="ID_1263742214" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Icons toolbar" ID="ID_1263742214" CREATED="1455910904024" MODIFIED="1455910904024" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -7949,7 +8063,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Display status line" ID="ID_183960920" TEXT_SHORTENED="true">
+<node TEXT="Display status line" ID="ID_183960920" CREATED="1455910904024" MODIFIED="1455910904024" TEXT_SHORTENED="true">
<icon BUILTIN="icon_not_found"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -7968,8 +8082,10 @@
</html>
</richcontent>
</node>
-<node TEXT="Context menu's" FOLDED="true" ID="ID_832730564" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="228"/>
+<node TEXT="" ID="ID_1857769175" CREATED="1455910904141" MODIFIED="1455910904141">
+<hook NAME="SummaryNode"/>
+<node TEXT="Context menu's" FOLDED="true" ID="ID_832730564" CREATED="1455910904026" MODIFIED="1455910904026" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="171.0 pt"/>
<attribute NAME="Chapter" VALUE="1,2,3,4,5"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -7999,8 +8115,7 @@
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
-<node TEXT="Context menu" ID="ID_497182548" TEXT_SHORTENED="true">
+<node TEXT="Context menu" ID="ID_497182548" CREATED="1455910904026" MODIFIED="1455910904026" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8020,7 +8135,8 @@
</node>
</node>
</node>
-<node TEXT="Properties panel" FOLDED="true" ID="ID_1783882978" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Properties panel" FOLDED="true" ID="ID_1783882978" CREATED="1455910904026" MODIFIED="1455910904026" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8037,7 +8153,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3,4,5"/>
-<node TEXT="Properties panel" FOLDED="true" ID="ID_125269399" TEXT_SHORTENED="true">
+<node TEXT="Properties panel" FOLDED="true" ID="ID_125269399" CREATED="1455910904026" MODIFIED="1455910904026" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8056,7 +8172,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Assign Properties Panel to F-key" STYLE_REF="ToNote" ID="ID_1019704667" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Assign Properties Panel to F-key" STYLE_REF="ToNote" ID="ID_1019704667" CREATED="1455910904026" MODIFIED="1455910904026" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8084,7 +8200,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Format properties" FOLDED="true" ID="ID_786320758" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Format properties" FOLDED="true" ID="ID_786320758" CREATED="1455910904026" MODIFIED="1455910904026" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8120,11 +8236,12 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
-<node TEXT="Apply level styles" STYLE_REF="UnChecked" ID="ID_1391835038" LINK="#ID_1362134553">
+<node TEXT="" ID="ID_555093082" CREATED="1455910904141" MODIFIED="1455910904141">
<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Automatic edge color" STYLE_REF="UnChecked" ID="ID_502377582" LINK="#ID_1587417548"/>
-<node TEXT="Style" ID="ID_1437890426" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Apply level styles" STYLE_REF="UnChecked" ID="ID_1391835038" CREATED="1455910904026" MODIFIED="1455910904026" LINK="#ID_1362134553"/>
+<node TEXT="Automatic edge color" STYLE_REF="UnChecked" ID="ID_502377582" CREATED="1455910904026" MODIFIED="1455910904026" LINK="#ID_1587417548"/>
+<node TEXT="Style" ID="ID_1437890426" CREATED="1455910904026" MODIFIED="1455910904026" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8154,7 +8271,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Node conditional styles applied to node" ID="ID_1460333381" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Node conditional styles applied to node" ID="ID_1460333381" CREATED="1455910904026" MODIFIED="1455910904026" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8181,7 +8298,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Map conditional styles applied to node" ID="ID_1573811748" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Map conditional styles applied to node" ID="ID_1573811748" CREATED="1455910904027" MODIFIED="1455910904027" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8208,9 +8325,9 @@
</html>
</richcontent>
</node>
-<node TEXT="Node style" STYLE_REF="MenuGroupLabel" ID="ID_1821920845" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1146725733" CREATED="1455910904141" MODIFIED="1455910904141">
<hook NAME="SummaryNode"/>
-<richcontent TYPE="DETAILS">
+<node TEXT="Node style" STYLE_REF="MenuGroupLabel" ID="ID_1821920845" CREATED="1455910904027" MODIFIED="1455910904027" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8229,17 +8346,22 @@
</html>
</richcontent>
</node>
-<node TEXT="Text" ID="ID_158955063">
+</node>
+<node TEXT="" ID="ID_741799714" CREATED="1455910904141" MODIFIED="1455910904141">
<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Background" ID="ID_631849825"/>
-<node TEXT="Color of whole core" STYLE_REF="MenuGroupLabel" ID="ID_1325673734">
+<node TEXT="Text" ID="ID_158955063" CREATED="1455910904027" MODIFIED="1455910904027"/>
+<node TEXT="Background" ID="ID_631849825" CREATED="1455910904027" MODIFIED="1455910904027"/>
+<node TEXT="" ID="ID_523616527" CREATED="1455910904141" MODIFIED="1455910904141">
<hook NAME="SummaryNode"/>
+<node TEXT="Color of whole core" STYLE_REF="MenuGroupLabel" ID="ID_1325673734" CREATED="1455910904027" MODIFIED="1455910904027"/>
</node>
-<node TEXT="Format" FOLDED="true" ID="ID_835341746" FORMAT="NO_FORMAT">
+<node TEXT="" ID="ID_861647194" CREATED="1455910904141" MODIFIED="1455910904141">
<hook NAME="FirstGroupNode"/>
-<node TEXT="Standard" STYLE_REF="OptionalValue" ID="ID_1741429260"/>
-<node TEXT="Text" STYLE_REF="OptionalValue" ID="ID_1270028285"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Format" FOLDED="true" ID="ID_835341746" CREATED="1455910904027" MODIFIED="1455910904027" FORMAT="NO_FORMAT">
+<node TEXT="Standard" STYLE_REF="OptionalValue" ID="ID_1741429260" CREATED="1455910904027" MODIFIED="1455910904027"/>
+<node TEXT="Text" STYLE_REF="OptionalValue" ID="ID_1270028285" CREATED="1455910904027" MODIFIED="1455910904027"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8253,18 +8375,22 @@
</html>
</richcontent>
</node>
-<node TEXT="#0,####" STYLE_REF="OptionalValue" ID="ID_1336519812" FORMAT="Text#0,####"/>
-<node TEXT="#,00" STYLE_REF="OptionalValue" ID="ID_1407835038" FORMAT="Text#0,####"/>
-<node TEXT="#" STYLE_REF="OptionalValue" ID="ID_963707448" FORMAT="Text#0,####"/>
-<node TEXT="#,##%" STYLE_REF="OptionalValue" ID="ID_1672350213" FORMAT="Text#0,####"/>
-<node TEXT="d-M-yy" STYLE_REF="OptionalValue" ID="ID_65722678" FORMAT="Text#0,####"/>
-<node TEXT="etc." STYLE_REF="OptionalValue" ID="ID_1181579783" FORMAT="Text#0,####"/>
+<node TEXT="#0,####" STYLE_REF="OptionalValue" ID="ID_1336519812" CREATED="1455910904027" MODIFIED="1455910904027" FORMAT="Text#0,####"/>
+<node TEXT="#,00" STYLE_REF="OptionalValue" ID="ID_1407835038" CREATED="1455910904027" MODIFIED="1455910904027" FORMAT="Text#0,####"/>
+<node TEXT="#" STYLE_REF="OptionalValue" ID="ID_963707448" CREATED="1455910904027" MODIFIED="1455910904027" FORMAT="Text#0,####"/>
+<node TEXT="#,##%" STYLE_REF="OptionalValue" ID="ID_1672350213" CREATED="1455910904027" MODIFIED="1455910904027" FORMAT="Text#0,####"/>
+<node TEXT="d-M-yy" STYLE_REF="OptionalValue" ID="ID_65722678" CREATED="1455910904027" MODIFIED="1455910904027" FORMAT="Text#0,####"/>
+<node TEXT="etc." STYLE_REF="OptionalValue" ID="ID_1181579783" CREATED="1455910904027" MODIFIED="1455910904027" FORMAT="Text#0,####"/>
</node>
-<node TEXT="Node numbering" ID="ID_716321598"/>
-<node TEXT="Core text" STYLE_REF="MenuGroupLabel" ID="ID_1056392580">
+<node TEXT="Node numbering" ID="ID_716321598" CREATED="1455910904027" MODIFIED="1455910904027"/>
+<node TEXT="" ID="ID_1752669811" CREATED="1455910904141" MODIFIED="1455910904141">
<hook NAME="SummaryNode"/>
+<node TEXT="Core text" STYLE_REF="MenuGroupLabel" ID="ID_1056392580" CREATED="1455910904027" MODIFIED="1455910904027"/>
+</node>
+<node TEXT="" ID="ID_564728401" CREATED="1455910904141" MODIFIED="1455910904141">
+<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Node style" FOLDED="true" ID="ID_1006574881" TEXT_SHORTENED="true">
+<node TEXT="Node style" FOLDED="true" ID="ID_1006574881" CREATED="1455910904027" MODIFIED="1455910904027" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8282,14 +8408,13 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="Fork" STYLE_REF="OptionalValue" ID="ID_1016917341" STYLE="as_parent">
+<node TEXT="Fork" STYLE_REF="OptionalValue" ID="ID_1016917341" CREATED="1455910904027" MODIFIED="1455910904027" STYLE="as_parent">
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="Bubble" STYLE_REF="OptionalValue" ID="ID_559452645">
+<node TEXT="Bubble" STYLE_REF="OptionalValue" ID="ID_559452645" CREATED="1455910904027" MODIFIED="1455910904027">
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="Combined" STYLE_REF="OptionalValue" ID="ID_347035916" TEXT_SHORTENED="true">
+<node TEXT="Combined" STYLE_REF="OptionalValue" ID="ID_347035916" CREATED="1455910904027" MODIFIED="1455910904027" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<richcontent TYPE="DETAILS">
@@ -8305,11 +8430,11 @@
</html>
</richcontent>
</node>
-<node TEXT="As parent" STYLE_REF="OptionalValue" ID="ID_324797442">
+<node TEXT="As parent" STYLE_REF="OptionalValue" ID="ID_324797442" CREATED="1455910904027" MODIFIED="1455910904027">
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="Min node width" ID="ID_1182377159" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Min node width" ID="ID_1182377159" CREATED="1455910904027" MODIFIED="1455910904027" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -8334,7 +8459,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Max node width" ID="ID_1506239651" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Max node width" ID="ID_1506239651" CREATED="1455910904027" MODIFIED="1455910904027" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -8359,10 +8484,11 @@
</html>
</richcontent>
</node>
-<node TEXT="Node shape" STYLE_REF="MenuGroupLabel" ID="ID_1665588957">
+<node TEXT="" ID="ID_1731075599" CREATED="1455910904141" MODIFIED="1455910904141">
<hook NAME="SummaryNode"/>
+<node TEXT="Node shape" STYLE_REF="MenuGroupLabel" ID="ID_1665588957" CREATED="1455910904027" MODIFIED="1455910904027"/>
</node>
-<node TEXT="Node Font" FOLDED="true" ID="ID_724156158" TEXT_SHORTENED="true">
+<node TEXT="Node Font" FOLDED="true" ID="ID_724156158" CREATED="1455910904027" MODIFIED="1455910904027" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8380,13 +8506,13 @@
</body>
</html>
</richcontent>
-<node TEXT="Set standard font size" ID="ID_627969850" LINK="#ID_728681381">
+<node TEXT="Set standard font size" ID="ID_627969850" CREATED="1455910904027" MODIFIED="1455910904027" LINK="#ID_728681381">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="Hyperlink" ID="ID_265935349" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Hyperlink" ID="ID_265935349" CREATED="1455910904027" MODIFIED="1455910904027" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8401,7 +8527,10 @@
</richcontent>
</node>
</node>
-<node TEXT="Edge width" ID="ID_1392877020" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1379965510" CREATED="1455910904142" MODIFIED="1455910904142">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Edge width" ID="ID_1392877020" CREATED="1455910904027" MODIFIED="1455910904027" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8419,9 +8548,8 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Edge style" ID="ID_1060644831" TEXT_SHORTENED="true">
+<node TEXT="Edge style" ID="ID_1060644831" CREATED="1455910904028" MODIFIED="1455910904028" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8440,7 +8568,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Edge color" ID="ID_211700099" TEXT_SHORTENED="true">
+<node TEXT="Edge color" ID="ID_211700099" CREATED="1455910904028" MODIFIED="1455910904028" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8459,10 +8587,14 @@
</html>
</richcontent>
</node>
-<node TEXT="Edge properties" STYLE_REF="MenuGroupLabel" ID="ID_1536352077">
+<node TEXT="" ID="ID_705433727" CREATED="1455910904142" MODIFIED="1455910904142">
<hook NAME="SummaryNode"/>
+<node TEXT="Edge properties" STYLE_REF="MenuGroupLabel" ID="ID_1536352077" CREATED="1455910904028" MODIFIED="1455910904028"/>
+</node>
+<node TEXT="" ID="ID_119892815" CREATED="1455910904142" MODIFIED="1455910904142">
+<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Cloud color" FOLDED="true" ID="ID_58140909" TEXT_SHORTENED="true">
+<node TEXT="Cloud color" FOLDED="true" ID="ID_58140909" CREATED="1455910904028" MODIFIED="1455910904028" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8489,15 +8621,14 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="Set standard cloud color" ID="ID_1130479055" LINK="#ID_749503390">
+<node TEXT="Set standard cloud color" ID="ID_1130479055" CREATED="1455910904028" MODIFIED="1455910904028" LINK="#ID_749503390">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Cloud Shape" ID="ID_840961117" TEXT_SHORTENED="true">
+<node TEXT="Cloud Shape" ID="ID_840961117" CREATED="1455910904028" MODIFIED="1455910904028" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8516,10 +8647,11 @@
</html>
</richcontent>
</node>
-<node TEXT="Clouds" STYLE_REF="MenuGroupLabel" ID="ID_1623448777">
+<node TEXT="" ID="ID_1172488861" CREATED="1455910904142" MODIFIED="1455910904142">
<hook NAME="SummaryNode"/>
+<node TEXT="Clouds" STYLE_REF="MenuGroupLabel" ID="ID_1623448777" CREATED="1455910904028" MODIFIED="1455910904028"/>
</node>
-<node TEXT="Reset style" ID="ID_25667795" TEXT_SHORTENED="true">
+<node TEXT="Reset style" ID="ID_25667795" CREATED="1455910904028" MODIFIED="1455910904028" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -8538,7 +8670,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Not included" FOLDED="true" ID="ID_1971371205" TEXT_SHORTENED="true">
+<node TEXT="Not included" FOLDED="true" ID="ID_1971371205" CREATED="1455910904028" MODIFIED="1455910904028" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -8567,7 +8699,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Blinking node" ID="ID_1863972932" TEXT_SHORTENED="true">
+<node TEXT="Blinking node" ID="ID_1863972932" CREATED="1455910904029" MODIFIED="1455910904029" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8585,12 +8717,12 @@
</html>
</richcontent>
</node>
-<node TEXT="Blend color" ID="ID_661366038">
+<node TEXT="Blend color" ID="ID_661366038" CREATED="1455910904029" MODIFIED="1455910904029">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="Map background" ID="ID_657472078" TEXT_SHORTENED="true">
+<node TEXT="Map background" ID="ID_657472078" CREATED="1455910904029" MODIFIED="1455910904029" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8608,7 +8740,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Hidden edge" ID="ID_1015777202" TEXT_SHORTENED="true">
+<node TEXT="Hidden edge" ID="ID_1015777202" CREATED="1455910904029" MODIFIED="1455910904029" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -8631,14 +8763,14 @@
</node>
</node>
</node>
-<node TEXT="Calendar and Attributes" ID="ID_1981388225">
+<node TEXT="Calendar and Attributes" ID="ID_1981388225" CREATED="1455910904029" MODIFIED="1455910904029">
<icon BUILTIN="../AttributesView"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Calendar" FOLDED="true" ID="ID_22413267" TEXT_SHORTENED="true" FORMAT="#0.####">
+<node TEXT="Calendar" FOLDED="true" ID="ID_22413267" CREATED="1455910904030" MODIFIED="1455910904030" TEXT_SHORTENED="true" FORMAT="#0.####">
<icon BUILTIN="icon_not_found"/>
<icon BUILTIN="../TimeManagementAction"/>
<hook NAME="NodeConditionalStyles">
@@ -8663,14 +8795,14 @@
</body>
</html>
</richcontent>
-<node TEXT="year-month-day" ID="ID_144760412">
+<node TEXT="year-month-day" ID="ID_144760412" CREATED="1455910904031" MODIFIED="1455910904031">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
</node>
-<node TEXT="hours-minutes" ID="ID_143054900"/>
-<node TEXT="Reset Calendar" ID="ID_435441461" TEXT_SHORTENED="true">
+<node TEXT="hours-minutes" ID="ID_143054900" CREATED="1455910904031" MODIFIED="1455910904031"/>
+<node TEXT="Reset Calendar" ID="ID_435441461" CREATED="1455910904031" MODIFIED="1455910904031" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -8689,7 +8821,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Insert Date in Selection" ID="ID_63295810" TEXT_SHORTENED="true">
+<node TEXT="Insert Date in Selection" ID="ID_63295810" CREATED="1455910904031" MODIFIED="1455910904031" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -8708,7 +8840,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Edit Script..." ID="ID_252404367" TEXT_SHORTENED="true">
+<node TEXT="Edit Script..." ID="ID_252404367" CREATED="1455910904031" MODIFIED="1455910904031" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="5"/>
<richcontent TYPE="DETAILS">
@@ -8735,7 +8867,7 @@
</html>
</richcontent>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Reminder triggers script" ID="ID_121096889" TEXT_SHORTENED="true">
+<node TEXT="Reminder triggers script" ID="ID_121096889" CREATED="1455910904031" MODIFIED="1455910904031" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="5"/>
<richcontent TYPE="DETAILS">
@@ -8784,7 +8916,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Remind me at this date" ID="ID_721277173" TEXT_SHORTENED="true">
+<node TEXT="Remind me at this date" ID="ID_721277173" CREATED="1455910904031" MODIFIED="1455910904031" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -8823,7 +8955,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Remind later" ID="ID_760755432" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Remind later" ID="ID_760755432" CREATED="1455910904031" MODIFIED="1455910904031" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8840,14 +8972,14 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Remove reminder" ID="ID_1320064607">
+<node TEXT="Remove reminder" ID="ID_1320064607" CREATED="1455910904032" MODIFIED="1455910904032">
<icon BUILTIN="../ReminderHookAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="" ID="ID_1442797370" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1442797370" CREATED="1455910904032" MODIFIED="1455910904032" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8880,7 +9012,7 @@
</node>
</node>
</node>
-<node TEXT="Attributes" FOLDED="true" ID="ID_1738195082" TEXT_SHORTENED="true">
+<node TEXT="Attributes" FOLDED="true" ID="ID_1738195082" CREATED="1455910904032" MODIFIED="1455910904032" TEXT_SHORTENED="true">
<icon BUILTIN="../showAttributes"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
@@ -8907,19 +9039,22 @@
</body>
</html>
</richcontent>
-<node TEXT="New attribute" ID="ID_682004984">
+<node TEXT="" ID="ID_236781879" CREATED="1455910904142" MODIFIED="1455910904142">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="New attribute" ID="ID_682004984" CREATED="1455910904033" MODIFIED="1455910904033">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Optimal width" ID="ID_19755775">
+<node TEXT="Optimal width" ID="ID_19755775" CREATED="1455910904033" MODIFIED="1455910904033">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="Value format" STYLE_REF="Method" ID="ID_539941097" TEXT_SHORTENED="true">
+<node TEXT="Value format" STYLE_REF="Method" ID="ID_539941097" CREATED="1455910904033" MODIFIED="1455910904033" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="3,4"/>
<richcontent TYPE="DETAILS">
@@ -8946,7 +9081,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Table of attributes" ID="ID_110950554" TEXT_SHORTENED="true">
+<node TEXT="Table of attributes" ID="ID_110950554" CREATED="1455910904033" MODIFIED="1455910904033" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -9002,7 +9137,9 @@
</html>
</richcontent>
</node>
-<node TEXT="" ID="ID_1128827136" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1355055924" CREATED="1455910904142" MODIFIED="1455910904142">
+<hook NAME="SummaryNode"/>
+<node TEXT="" ID="ID_1128827136" CREATED="1455910904033" MODIFIED="1455910904033" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -9034,13 +9171,13 @@
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
</node>
</node>
-<node TEXT="Zoom in" ID="ID_1817335801" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Zoom in" ID="ID_1817335801" CREATED="1455910904033" MODIFIED="1455910904033" TEXT_SHORTENED="true">
<icon BUILTIN="../ZoomIn24"/>
<richcontent TYPE="DETAILS">
@@ -9059,7 +9196,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Zoom out" ID="ID_1176192683" TEXT_SHORTENED="true">
+<node TEXT="Zoom out" ID="ID_1176192683" CREATED="1455910904034" MODIFIED="1455910904034" TEXT_SHORTENED="true">
<icon BUILTIN="../ZoomOut24"/>
<richcontent TYPE="DETAILS">
@@ -9078,7 +9215,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Zoom to fit page" ID="ID_1360497080" TEXT_SHORTENED="true">
+<node TEXT="Zoom to fit page" ID="ID_1360497080" CREATED="1455910904035" MODIFIED="1455910904035" TEXT_SHORTENED="true">
<icon BUILTIN="../FitToPage"/>
<richcontent TYPE="DETAILS">
@@ -9097,7 +9234,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Center selected node" ID="ID_1435118166" TEXT_SHORTENED="true">
+<node TEXT="Center selected node" ID="ID_1435118166" CREATED="1455910904036" MODIFIED="1455910904036" TEXT_SHORTENED="true">
<icon BUILTIN="../CenterSelectedNodeAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -9131,7 +9268,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Scroll/move map" ID="ID_1548435797" TEXT_SHORTENED="true">
+<node TEXT="Scroll/move map" ID="ID_1548435797" CREATED="1455910904037" MODIFIED="1455910904037" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -9153,11 +9290,11 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Center selected node automatically" ID="ID_1299718023">
+<node TEXT="Center selected node automatically" ID="ID_1299718023" CREATED="1455910904037" MODIFIED="1455910904037">
<icon BUILTIN="help"/>
</node>
-<node TEXT="View settings" FOLDED="true" ID="ID_1492135940">
-<node TEXT="Outline view" ID="ID_519734292" TEXT_SHORTENED="true">
+<node TEXT="View settings" FOLDED="true" ID="ID_1492135940" CREATED="1455910904037" MODIFIED="1455910904037">
+<node TEXT="Outline view" ID="ID_519734292" CREATED="1455910904037" MODIFIED="1455910904037" TEXT_SHORTENED="true">
<icon BUILTIN="../outline_view"/>
<richcontent TYPE="DETAILS">
@@ -9203,7 +9340,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Full screen mode" FOLDED="true" ID="ID_1526004925" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Full screen mode" FOLDED="true" ID="ID_1526004925" CREATED="1455910904038" MODIFIED="1455910904038" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -9222,7 +9359,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_1272735653" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1272735653" CREATED="1455910904038" MODIFIED="1455910904038" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -9241,7 +9378,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Presentation mode" STYLE_REF="Method" ID="ID_1924930800" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Presentation mode" STYLE_REF="Method" ID="ID_1924930800" CREATED="1455910904038" MODIFIED="1455910904038" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9255,7 +9392,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Rectangular selection" ID="ID_1851007191" TEXT_SHORTENED="true">
+<node TEXT="Rectangular selection" ID="ID_1851007191" CREATED="1455910904038" MODIFIED="1455910904038" TEXT_SHORTENED="true">
<icon BUILTIN="../ShowSelectionAsRectangleAction"/>
<richcontent TYPE="DETAILS">
@@ -9285,7 +9422,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Highlight formulas" ID="ID_1847984972" TEXT_SHORTENED="true">
+<node TEXT="Highlight formulas" ID="ID_1847984972" CREATED="1455910904040" MODIFIED="1455910904040" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -9304,7 +9441,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Minimize node" ID="ID_180063018" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Minimize node" ID="ID_180063018" CREATED="1455910904040" MODIFIED="1455910904040" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9333,7 +9470,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Hide details" ID="ID_734978433" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Hide details" ID="ID_734978433" CREATED="1455910904040" MODIFIED="1455910904040" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9361,8 +9498,8 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Tool tips" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1599182564">
-<node TEXT="Display tool tips" FOLDED="true" ID="ID_152459666" TEXT_SHORTENED="true">
+<node TEXT="Tool tips" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1599182564" CREATED="1455910904040" MODIFIED="1455910904040">
+<node TEXT="Display tool tips" FOLDED="true" ID="ID_152459666" CREATED="1455910904040" MODIFIED="1455910904040" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -9393,8 +9530,7 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="Tool Tips" ID="ID_1399586746" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Tool Tips" ID="ID_1399586746" CREATED="1455910904040" MODIFIED="1455910904040" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9423,9 +9559,9 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Set width tool tip" ID="ID_383683750" LINK="#ID_215853027"/>
+<node TEXT="Set width tool tip" ID="ID_383683750" CREATED="1455910904040" MODIFIED="1455910904040" LINK="#ID_215853027"/>
</node>
-<node TEXT="Display Node styles in Tool Tip" ID="ID_499630441" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Display Node styles in Tool Tip" ID="ID_499630441" CREATED="1455910904040" MODIFIED="1455910904040" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9450,7 +9586,7 @@
</html>
</richcontent>
</node>
-<node TEXT=" Display modification times" ID="ID_208481180" TEXT_SHORTENED="true">
+<node TEXT=" Display modification times" ID="ID_208481180" CREATED="1455910904040" MODIFIED="1455910904040" TEXT_SHORTENED="true">
<icon BUILTIN="../kword"/>
<richcontent TYPE="DETAILS">
@@ -9481,7 +9617,10 @@
</hook>
</node>
</node>
-<node TEXT="Node attributes" STYLE_REF="SubMenu" FOLDED="true" ID="ID_353026241" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_880253159" CREATED="1455910904142" MODIFIED="1455910904142">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Node attributes" STYLE_REF="SubMenu" FOLDED="true" ID="ID_353026241" CREATED="1455910904041" MODIFIED="1455910904041" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9524,11 +9663,10 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="Show selected attributes" ID="ID_1402645350"/>
-<node TEXT="Show All attributes" ID="ID_906654506"/>
-<node TEXT="Hide all attributes" ID="ID_1832714818"/>
-<node TEXT="Show icon of attributes" ID="ID_1771820903" TEXT_SHORTENED="true">
+<node TEXT="Show selected attributes" ID="ID_1402645350" CREATED="1455910904041" MODIFIED="1455910904041"/>
+<node TEXT="Show All attributes" ID="ID_906654506" CREATED="1455910904041" MODIFIED="1455910904041"/>
+<node TEXT="Hide all attributes" ID="ID_1832714818" CREATED="1455910904041" MODIFIED="1455910904041"/>
+<node TEXT="Show icon of attributes" ID="ID_1771820903" CREATED="1455910904041" MODIFIED="1455910904041" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -9547,9 +9685,10 @@
</richcontent>
</node>
</node>
-<node TEXT="Show/hide icon-attributes" ID="ID_94712823" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1530706882" CREATED="1455910904142" MODIFIED="1455910904142">
<hook NAME="SummaryNode"/>
-<attribute_layout VALUE_WIDTH="228"/>
+<node TEXT="Show/hide icon-attributes" ID="ID_94712823" CREATED="1455910904041" MODIFIED="1455910904041" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="171.0 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -9573,8 +9712,12 @@
</html>
</richcontent>
</node>
-<node TEXT="Notes" STYLE_REF="SubMenu" FOLDED="true" ID="ID_838550014">
-<node TEXT="Display note pane" FOLDED="true" ID="ID_1073686439" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="" ID="ID_1527737912" CREATED="1455910904142" MODIFIED="1455910904142">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Notes" STYLE_REF="SubMenu" FOLDED="true" ID="ID_838550014" CREATED="1455910904042" MODIFIED="1455910904042">
+<node TEXT="Display note pane" FOLDED="true" ID="ID_1073686439" CREATED="1455910904042" MODIFIED="1455910904042" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -9604,8 +9747,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="Note panel" ID="ID_1985668082" TEXT_SHORTENED="true">
+<node TEXT="Note panel" ID="ID_1985668082" CREATED="1455910904042" MODIFIED="1455910904042" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -9624,7 +9766,7 @@
</richcontent>
</node>
</node>
-<node TEXT=" Note panel position" ID="ID_1996327153" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT=" Note panel position" ID="ID_1996327153" CREATED="1455910904042" MODIFIED="1455910904042" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9641,7 +9783,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Display notes in map" ID="ID_389897702" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Display notes in map" ID="ID_389897702" CREATED="1455910904042" MODIFIED="1455910904042" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9672,7 +9814,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Show note icons" ID="ID_1472695653" TEXT_SHORTENED="true">
+<node TEXT="Show note icons" ID="ID_1472695653" CREATED="1455910904042" MODIFIED="1455910904042" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -9691,9 +9833,10 @@
</richcontent>
</node>
</node>
-<node TEXT="Notes view" FOLDED="true" ID="ID_1709371267" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_416405557" CREATED="1455910904142" MODIFIED="1455910904142">
<hook NAME="SummaryNode"/>
-<attribute_layout VALUE_WIDTH="215"/>
+<node TEXT="Notes view" FOLDED="true" ID="ID_1709371267" CREATED="1455910904042" MODIFIED="1455910904042" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="161.25 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -9716,8 +9859,8 @@
</body>
</html>
</richcontent>
-<node TEXT="Icons view" ID="ID_382172833" TEXT_SHORTENED="true">
-<attribute_layout VALUE_WIDTH="160"/>
+<node TEXT="Icons view" ID="ID_382172833" CREATED="1455910904042" MODIFIED="1455910904042" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="120.0 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -9769,11 +9912,11 @@
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
</node>
</node>
</node>
-<node TEXT="Format" FOLDED="true" ID="ID_258919699" TEXT_SHORTENED="true" MIN_WIDTH="60"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Format" FOLDED="true" ID="ID_258919699" CREATED="1455910904042" MODIFIED="1455910904042" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9856,7 +9999,10 @@
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="Apply style" FOLDED="true" ID="ID_512501370" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1692623718" CREATED="1455910904143" MODIFIED="1455910904143">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Apply style" FOLDED="true" ID="ID_512501370" CREATED="1455910904042" MODIFIED="1455910904042" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9901,8 +10047,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
+<node TEXT="" ID="ID_113755100" CREATED="1455910904143" MODIFIED="1455910904143">
<hook NAME="FirstGroupNode"/>
-<node TEXT="Default" ID="ID_1111398038" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Default" ID="ID_1111398038" CREATED="1455910904043" MODIFIED="1455910904043" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -9922,9 +10070,8 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Details" ID="ID_1577454061" TEXT_SHORTENED="true">
+<node TEXT="Details" ID="ID_1577454061" CREATED="1455910904043" MODIFIED="1455910904043" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -9953,7 +10100,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Note" ID="ID_985652023" TEXT_SHORTENED="true">
+<node TEXT="Note" ID="ID_985652023" CREATED="1455910904043" MODIFIED="1455910904043" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -9982,7 +10129,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Floating node" STYLE_REF="OptionalValue" ID="ID_114978489" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Floating node" STYLE_REF="OptionalValue" ID="ID_114978489" CREATED="1455910904043" MODIFIED="1455910904043" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10007,11 +10154,12 @@
</html>
</richcontent>
</node>
-<node TEXT="Hierarchical Level styles" STYLE_REF="Method" ID="ID_1923695111"/>
-<node TEXT="For default size, bubble, etc." ID="ID_1228191937">
+<node TEXT="Hierarchical Level styles" STYLE_REF="Method" ID="ID_1923695111" CREATED="1455910904043" MODIFIED="1455910904043"/>
+<node TEXT="" ID="ID_285571161" CREATED="1455910904143" MODIFIED="1455910904143">
<hook NAME="SummaryNode"/>
+<node TEXT="For default size, bubble, etc." ID="ID_1228191937" CREATED="1455910904043" MODIFIED="1455910904043"/>
</node>
-<node TEXT="User defined styles" ID="ID_948529232" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="User defined styles" ID="ID_948529232" CREATED="1455910904043" MODIFIED="1455910904043" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10053,7 +10201,7 @@
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="Automatic layout" FOLDED="true" ID="ID_1362134553" TEXT_SHORTENED="true">
+<node TEXT="Automatic layout" FOLDED="true" ID="ID_1362134553" CREATED="1455910904043" MODIFIED="1455910904043" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -10094,41 +10242,46 @@
</body>
</html>
</richcontent>
-<node TEXT="for no leaves" STYLE_REF="OptionalValue" ID="ID_1030603587"/>
-<node TEXT="for all nodes" STYLE_REF="OptionalValue" ID="ID_1569605151"/>
-<node TEXT="disabled" STYLE_REF="OptionalValue" ID="ID_1863350006">
+<node TEXT="" ID="ID_1411312775" CREATED="1455910904143" MODIFIED="1455910904143">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="for no leaves" STYLE_REF="OptionalValue" ID="ID_1030603587" CREATED="1455910904043" MODIFIED="1455910904043"/>
+<node TEXT="for all nodes" STYLE_REF="OptionalValue" ID="ID_1569605151" CREATED="1455910904043" MODIFIED="1455910904043"/>
+<node TEXT="disabled" STYLE_REF="OptionalValue" ID="ID_1863350006" CREATED="1455910904043" MODIFIED="1455910904043">
<icon BUILTIN="checked"/>
</node>
-<node TEXT="default styles" FOLDED="true" ID="ID_188699461">
+<node TEXT="" ID="ID_1306724834" CREATED="1455910904143" MODIFIED="1455910904143">
<hook NAME="SummaryNode"/>
-<node TEXT="Root" ID="ID_912205112" TEXT_SHORTENED="true">
+<node TEXT="default styles" FOLDED="true" ID="ID_188699461" CREATED="1455910904043" MODIFIED="1455910904043">
+<node TEXT="Root" ID="ID_912205112" CREATED="1455910904043" MODIFIED="1455910904043" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Level 1" STYLE_REF="OptionalValue" ID="ID_1521677657" TEXT_SHORTENED="true">
+<node TEXT="Level 1" STYLE_REF="OptionalValue" ID="ID_1521677657" CREATED="1455910904043" MODIFIED="1455910904043" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Level 2" ID="ID_1792037977" TEXT_SHORTENED="true">
+<node TEXT="Level 2" ID="ID_1792037977" CREATED="1455910904043" MODIFIED="1455910904043" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Level 3" ID="ID_33761254" TEXT_SHORTENED="true">
+<node TEXT="Level 3" ID="ID_33761254" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Level 4" ID="ID_730037876" TEXT_SHORTENED="true">
+<node TEXT="Level 4" ID="ID_730037876" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node TEXT="Manage styles" STYLE_REF="SubMenu" FOLDED="true" ID="ID_699990019" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Manage styles" STYLE_REF="SubMenu" FOLDED="true" ID="ID_699990019" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10172,7 +10325,10 @@
</body>
</html>
</richcontent>
-<node TEXT="New style from selection" FOLDED="true" ID="ID_643671716" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_898580309" CREATED="1455910904144" MODIFIED="1455910904144">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="New style from selection" FOLDED="true" ID="ID_643671716" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10220,7 +10376,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="Style Details and Attributes" ID="ID_1105873514" TEXT_SHORTENED="true">
+<node TEXT="Style Details and Attributes" ID="ID_1105873514" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -10257,7 +10413,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Redefine style" STYLE_REF="Functie" ID="ID_1559299046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Redefine style" STYLE_REF="Functie" ID="ID_1559299046" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10275,7 +10431,7 @@
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="Manage conditional styles for map" FOLDED="true" ID="ID_1169167186" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Manage conditional styles for map" FOLDED="true" ID="ID_1169167186" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10332,8 +10488,11 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="Table of style rules." STYLE_REF="Method" FOLDED="true" ID="ID_1058697460">
-<node TEXT="Empty" ID="ID_805739790" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1058828636" CREATED="1455910904143" MODIFIED="1455910904143">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Table of style rules." STYLE_REF="Method" FOLDED="true" ID="ID_1058697460" CREATED="1455910904044" MODIFIED="1455910904044">
+<node TEXT="Empty" ID="ID_805739790" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -10352,7 +10511,7 @@
</richcontent>
</node>
</node>
-<node TEXT="New" STYLE_REF="Method" ID="ID_322783972" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="New" STYLE_REF="Method" ID="ID_322783972" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10366,7 +10525,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Edit" STYLE_REF="Method" ID="ID_338804554" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Edit" STYLE_REF="Method" ID="ID_338804554" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10380,7 +10539,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Delete" STYLE_REF="Method" ID="ID_44463838" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Delete" STYLE_REF="Method" ID="ID_44463838" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10394,7 +10553,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Up" STYLE_REF="Method" ID="ID_1131478979" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Up" STYLE_REF="Method" ID="ID_1131478979" CREATED="1455910904044" MODIFIED="1455910904044" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10408,7 +10567,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Down" STYLE_REF="Method" ID="ID_198508283" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Down" STYLE_REF="Method" ID="ID_198508283" CREATED="1455910904045" MODIFIED="1455910904045" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10425,7 +10584,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Active" ID="ID_1882394254" TEXT_SHORTENED="true">
+<node TEXT="Active" ID="ID_1882394254" CREATED="1455910904045" MODIFIED="1455910904045" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
</hook>
@@ -10443,7 +10602,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Condition" STYLE_REF="Method" FOLDED="true" ID="ID_1073372746" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Condition" STYLE_REF="Method" FOLDED="true" ID="ID_1073372746" CREATED="1455910904045" MODIFIED="1455910904045" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10456,7 +10615,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Always" ID="ID_894528691" TEXT_SHORTENED="true">
+<node TEXT="Always" ID="ID_894528691" CREATED="1455910904045" MODIFIED="1455910904045" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -10475,8 +10634,8 @@
</richcontent>
</node>
</node>
-<node TEXT="Style" STYLE_REF="Method" FOLDED="true" ID="ID_1230882400">
-<node TEXT="Default" ID="ID_1640996661" TEXT_SHORTENED="true">
+<node TEXT="Style" STYLE_REF="Method" FOLDED="true" ID="ID_1230882400" CREATED="1455910904045" MODIFIED="1455910904045">
+<node TEXT="Default" ID="ID_1640996661" CREATED="1455910904045" MODIFIED="1455910904045" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -10495,7 +10654,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Stop" ID="ID_496187218" TEXT_SHORTENED="true">
+<node TEXT="Stop" ID="ID_496187218" CREATED="1455910904045" MODIFIED="1455910904045" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
</hook>
@@ -10513,13 +10672,14 @@
</html>
</richcontent>
</node>
-<node TEXT="" FOLDED="true" ID="ID_1129555835">
+<node TEXT="" ID="ID_1675966741" CREATED="1455910904143" MODIFIED="1455910904143">
<hook NAME="SummaryNode"/>
+<node TEXT="" FOLDED="true" ID="ID_1129555835" CREATED="1455910904045" MODIFIED="1455910904045">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<node TEXT="Revision" ID="ID_1791624318" TEXT_SHORTENED="true" LINK="#_Freeplane_Link_784043927">
+<node TEXT="Revision" ID="ID_1791624318" CREATED="1455910904045" MODIFIED="1455910904045" LINK="#_Freeplane_Link_784043927" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
@@ -10540,7 +10700,7 @@
</html>
</richcontent>
</node>
-<node TEXT="" ID="ID_362867811" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_362867811" CREATED="1455910904045" MODIFIED="1455910904045" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -10559,7 +10719,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Templates" ID="ID_1796388799" TEXT_SHORTENED="true">
+<node TEXT="Templates" ID="ID_1796388799" CREATED="1455910904045" MODIFIED="1455910904045" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -10610,11 +10770,11 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
</node>
</node>
-<node TEXT="Manage conditional styles for node" FOLDED="true" ID="ID_1036704793" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Manage conditional styles for node" FOLDED="true" ID="ID_1036704793" CREATED="1455910904045" MODIFIED="1455910904045" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -10675,9 +10835,11 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="Table of style rules." STYLE_REF="Method" FOLDED="true" ID="ID_278157696">
+<node TEXT="" ID="ID_1342856473" CREATED="1455910904144" MODIFIED="1455910904144">
<hook NAME="FirstGroupNode"/>
-<node TEXT="Empty" ID="ID_1858267405" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Table of style rules." STYLE_REF="Method" FOLDED="true" ID="ID_278157696" CREATED="1455910904046" MODIFIED="1455910904046">
+<node TEXT="Empty" ID="ID_1858267405" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -10696,7 +10858,7 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node TEXT="New" STYLE_REF="Method" ID="ID_1731631753" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="New" STYLE_REF="Method" ID="ID_1731631753" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10710,7 +10872,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Edit" STYLE_REF="Method" ID="ID_1266620968" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Edit" STYLE_REF="Method" ID="ID_1266620968" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10724,7 +10886,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Delete" STYLE_REF="Method" ID="ID_1025560603" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Delete" STYLE_REF="Method" ID="ID_1025560603" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10738,7 +10900,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Up" STYLE_REF="Method" ID="ID_1559495569" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Up" STYLE_REF="Method" ID="ID_1559495569" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10752,7 +10914,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Down" STYLE_REF="Method" ID="ID_128011628" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Down" STYLE_REF="Method" ID="ID_128011628" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10769,7 +10931,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Active" ID="ID_1788623449" TEXT_SHORTENED="true">
+<node TEXT="Active" ID="ID_1788623449" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
</hook>
@@ -10787,7 +10949,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Condition" STYLE_REF="Method" FOLDED="true" ID="ID_1272337891" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Condition" STYLE_REF="Method" FOLDED="true" ID="ID_1272337891" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10800,7 +10962,7 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<node TEXT="Always" ID="ID_386830428" TEXT_SHORTENED="true">
+<node TEXT="Always" ID="ID_386830428" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -10819,8 +10981,8 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node TEXT="Style" STYLE_REF="Method" FOLDED="true" ID="ID_654077801">
-<node TEXT="Default" ID="ID_563202841" TEXT_SHORTENED="true">
+<node TEXT="Style" STYLE_REF="Method" FOLDED="true" ID="ID_654077801" CREATED="1455910904046" MODIFIED="1455910904046">
+<node TEXT="Default" ID="ID_563202841" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -10839,7 +11001,7 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node TEXT="Stop" ID="ID_293594044" TEXT_SHORTENED="true">
+<node TEXT="Stop" ID="ID_293594044" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
</hook>
@@ -10857,10 +11019,11 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="" FOLDED="true" ID="ID_8484574">
+<node TEXT="" ID="ID_197366342" CREATED="1455910904144" MODIFIED="1455910904144">
<hook NAME="SummaryNode"/>
+<node TEXT="" FOLDED="true" ID="ID_8484574" CREATED="1455910904046" MODIFIED="1455910904046">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="Conditional node style" ID="ID_589037277" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Conditional node style" ID="ID_589037277" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10886,7 +11049,8 @@ elements from the styles activated by conditions are copied.</pre>
</node>
</node>
</node>
-<node TEXT="Copy map style from..." ID="ID_13843990" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Copy map style from..." ID="ID_13843990" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10918,7 +11082,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="Edit styles" STYLE_REF="Functie" ID="ID_1277682010" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Edit styles" STYLE_REF="Functie" ID="ID_1277682010" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10962,13 +11126,14 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="More" STYLE_REF="Aggregatie als Toelichting" ID="ID_1132402390" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_68381582" CREATED="1455910904144" MODIFIED="1455910904144">
<hook NAME="SummaryNode"/>
+<node TEXT="More" STYLE_REF="Aggregatie als Toelichting" ID="ID_1132402390" CREATED="1455910904046" MODIFIED="1455910904046" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Style (and Node template)" ID="ID_1305038685" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="156"/>
+<node TEXT="Style (and Node template)" ID="ID_1305038685" CREATED="1455910904047" MODIFIED="1455910904047" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="117.0 pt"/>
<attribute NAME="Chapter" VALUE="4"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
@@ -10987,7 +11152,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Node template" ID="ID_1252291426" TEXT_SHORTENED="true">
+<node TEXT="Node template" ID="ID_1252291426" CREATED="1455910904047" MODIFIED="1455910904047" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -11020,13 +11185,13 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Example style" ID="ID_1379615942" TEXT_SHORTENED="true">
+<node TEXT="Example style" ID="ID_1379615942" CREATED="1455910904047" MODIFIED="1455910904047" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="System location" ID="ID_825090436" TEXT_SHORTENED="true">
+<node TEXT="System location" ID="ID_825090436" CREATED="1455910904047" MODIFIED="1455910904047" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -11046,7 +11211,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Wiki" ID="ID_422433135" LINK="http://freeplane.sourceforge.net/wiki/index.php/Node_styles">
+<node TEXT="Wiki" ID="ID_422433135" CREATED="1455910904047" MODIFIED="1455910904047" LINK="http://freeplane.sourceforge.net/wiki/index.php/Node_styles">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
@@ -11054,7 +11219,8 @@ elements from the styles activated by conditions are copied.</pre>
</node>
</node>
</node>
-<node TEXT="Copy format" ID="ID_165229421" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Copy format" ID="ID_165229421" CREATED="1455910904047" MODIFIED="1455910904047" TEXT_SHORTENED="true">
<icon BUILTIN="../colorpicker"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -11073,7 +11239,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Paste format" ID="ID_85344174" TEXT_SHORTENED="true">
+<node TEXT="Paste format" ID="ID_85344174" CREATED="1455910904048" MODIFIED="1455910904048" TEXT_SHORTENED="true">
<icon BUILTIN="../color_fill"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -11092,10 +11258,11 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Styles" STYLE_REF="MenuGroupLabel" ID="ID_177552803">
+<node TEXT="" ID="ID_1787294574" CREATED="1455910904144" MODIFIED="1455910904144">
<hook NAME="SummaryNode"/>
+<node TEXT="Styles" STYLE_REF="MenuGroupLabel" ID="ID_177552803" CREATED="1455910904049" MODIFIED="1455910904049"/>
</node>
-<node TEXT="Map Background color" FOLDED="true" ID="ID_1564352042" TEXT_SHORTENED="true">
+<node TEXT="Map Background color" FOLDED="true" ID="ID_1564352042" CREATED="1455910904049" MODIFIED="1455910904049" TEXT_SHORTENED="true">
<icon BUILTIN="../MapBackgroundColorAction"/>
<richcontent TYPE="DETAILS">
@@ -11114,7 +11281,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="" ID="ID_307696782" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_307696782" CREATED="1455910904050" MODIFIED="1455910904050" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -11134,8 +11301,11 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node TEXT="Node core" STYLE_REF="SubMenu" FOLDED="true" ID="ID_39827582">
-<node TEXT="Bold" ID="ID_25890496" TEXT_SHORTENED="true">
+<node TEXT="Node core" STYLE_REF="SubMenu" FOLDED="true" ID="ID_39827582" CREATED="1455910904050" MODIFIED="1455910904050">
+<node TEXT="" ID="ID_1588093253" CREATED="1455910904144" MODIFIED="1455910904144">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Bold" ID="ID_25890496" CREATED="1455910904050" MODIFIED="1455910904050" TEXT_SHORTENED="true">
<icon BUILTIN="../Bold16"/>
<font NAME="SansSerif" BOLD="true" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -11165,12 +11335,11 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Italic" ID="ID_408787243" TEXT_SHORTENED="true">
+<node TEXT="Italic" ID="ID_408787243" CREATED="1455910904050" MODIFIED="1455910904050" TEXT_SHORTENED="true">
<icon BUILTIN="../Italic16"/>
<font ITALIC="true"/>
<richcontent TYPE="DETAILS">
@@ -11204,7 +11373,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Larger font" ID="ID_349364472" TEXT_SHORTENED="true">
+<node TEXT="Larger font" ID="ID_349364472" CREATED="1455910904051" MODIFIED="1455910904051" TEXT_SHORTENED="true">
<icon BUILTIN="../IncreaseNodeFontAction"/>
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -11239,7 +11408,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="Smaller font" ID="ID_533544086" TEXT_SHORTENED="true">
+<node TEXT="Smaller font" ID="ID_533544086" CREATED="1455910904051" MODIFIED="1455910904051" TEXT_SHORTENED="true">
<icon BUILTIN="../DecreaseNodeFontAction"/>
<richcontent TYPE="DETAILS">
@@ -11273,11 +11442,13 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node ID="ID_863447007" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_1506754187" CREATED="1455910904145" MODIFIED="1455910904145">
+<hook NAME="SummaryNode"/>
+<node ID="ID_863447007" CREATED="1455910904052" MODIFIED="1455910904052" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -11285,8 +11456,8 @@ elements from the styles activated by conditions are copied.</pre>
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="SummaryNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -11332,7 +11503,11 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Node color" ID="ID_1085935601" COLOR="#ff3366" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_142988242" CREATED="1455910904145" MODIFIED="1455910904145">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Node color" ID="ID_1085935601" CREATED="1455910904053" MODIFIED="1455910904053" COLOR="#ff3366" TEXT_SHORTENED="true">
<icon BUILTIN="../NodeColorAction"/>
<richcontent TYPE="DETAILS">
@@ -11347,12 +11522,11 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Blinking node" FOLDED="true" ID="ID_854971495" COLOR="#663300" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<node TEXT="Blinking node" FOLDED="true" ID="ID_854971495" CREATED="1455910904053" MODIFIED="1455910904053" COLOR="#663300" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
<icon BUILTIN="../xeyes"/>
<edge COLOR="#000000"/>
<richcontent TYPE="DETAILS">
@@ -11373,7 +11547,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="" ID="ID_1509903999" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1509903999" CREATED="1455910904055" MODIFIED="1455910904055" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -11392,7 +11566,7 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node TEXT="Blend color" FOLDED="true" ID="ID_1238551182" COLOR="#663300" TEXT_SHORTENED="true">
+<node TEXT="Blend color" FOLDED="true" ID="ID_1238551182" CREATED="1455910904055" MODIFIED="1455910904055" COLOR="#663300" TEXT_SHORTENED="true">
<icon BUILTIN="../NodeColorBlendAction"/>
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -11411,7 +11585,7 @@ elements from the styles activated by conditions are copied.</pre>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_1316784379" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1316784379" CREATED="1455910904057" MODIFIED="1455910904057" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -11430,11 +11604,13 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node ID="ID_1370207590" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_150044680" CREATED="1455910904145" MODIFIED="1455910904145">
+<hook NAME="SummaryNode"/>
+<node ID="ID_1370207590" CREATED="1455910904057" MODIFIED="1455910904057" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -11442,8 +11618,8 @@ elements from the styles activated by conditions are copied.</pre>
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="SummaryNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -11493,7 +11669,11 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Node Background Color..." ID="ID_1529197837" COLOR="#663300" BACKGROUND_COLOR="#ffcc00" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1588233407" CREATED="1455910904145" MODIFIED="1455910904145">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Node Background Color..." ID="ID_1529197837" CREATED="1455910904057" MODIFIED="1455910904057" COLOR="#663300" BACKGROUND_COLOR="#ffcc00" TEXT_SHORTENED="true">
<icon BUILTIN="../NodeBackgroundColorAction"/>
<richcontent TYPE="DETAILS">
@@ -11525,19 +11705,23 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Background color" ID="ID_608903890" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1701899520" CREATED="1455910904145" MODIFIED="1455910904145">
+<hook NAME="SummaryNode"/>
+<node TEXT="Background color" ID="ID_608903890" CREATED="1455910904059" MODIFIED="1455910904059" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Fork" ID="ID_401265529" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="" ID="ID_1890658891" CREATED="1455910904145" MODIFIED="1455910904145">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Fork" ID="ID_401265529" CREATED="1455910904059" MODIFIED="1455910904059" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -11568,7 +11752,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Bubble" ID="ID_1235732708" STYLE="bubble" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Bubble" ID="ID_1235732708" CREATED="1455910904059" MODIFIED="1455910904059" STYLE="bubble" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -11599,7 +11783,9 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Bubble central node area" ID="ID_5209411" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1849139726" CREATED="1455910904146" MODIFIED="1455910904146">
+<hook NAME="SummaryNode"/>
+<node TEXT="Bubble central node area" ID="ID_5209411" CREATED="1455910904059" MODIFIED="1455910904059" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -11622,9 +11808,9 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Remove Format" ID="ID_640761139" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Remove Format" ID="ID_640761139" CREATED="1455910904059" MODIFIED="1455910904059" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -11653,19 +11839,21 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="Use plain text" STYLE_REF="Method" ID="ID_437526710"/>
+<node TEXT="Use plain text" STYLE_REF="Method" ID="ID_437526710" CREATED="1455910904059" MODIFIED="1455910904059"/>
+</node>
+<node TEXT="" ID="ID_19128216" CREATED="1455910904146" MODIFIED="1455910904146">
+<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Add cloud or change style" FOLDED="true" ID="ID_759607649" TEXT_SHORTENED="true">
+<node TEXT="Add cloud or change style" FOLDED="true" ID="ID_759607649" CREATED="1455910904059" MODIFIED="1455910904059" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="Arc" STYLE_REF="OptionalValue" ID="ID_1461340368"/>
-<node TEXT="Star" STYLE_REF="OptionalValue" ID="ID_158500016"/>
-<node TEXT="Rectangle" STYLE_REF="OptionalValue" ID="ID_217797528"/>
-<node TEXT="Round rectangle" STYLE_REF="OptionalValue" ID="ID_988146678"/>
+<node TEXT="Arc" STYLE_REF="OptionalValue" ID="ID_1461340368" CREATED="1455910904060" MODIFIED="1455910904060"/>
+<node TEXT="Star" STYLE_REF="OptionalValue" ID="ID_158500016" CREATED="1455910904060" MODIFIED="1455910904060"/>
+<node TEXT="Rectangle" STYLE_REF="OptionalValue" ID="ID_217797528" CREATED="1455910904060" MODIFIED="1455910904060"/>
+<node TEXT="Round rectangle" STYLE_REF="OptionalValue" ID="ID_988146678" CREATED="1455910904060" MODIFIED="1455910904060"/>
</node>
-<node TEXT="Cloud color" ID="ID_1092192366" TEXT_SHORTENED="true">
+<node TEXT="Cloud color" ID="ID_1092192366" CREATED="1455910904060" MODIFIED="1455910904060" TEXT_SHORTENED="true">
<icon BUILTIN="../Colors24"/>
<richcontent TYPE="DETAILS">
@@ -11698,16 +11886,19 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Cloud properties" STYLE_REF="Aggregatie als Toelichting" ID="ID_1759348470" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_738484795" CREATED="1455910904146" MODIFIED="1455910904146">
+<hook NAME="SummaryNode"/>
+<node TEXT="Cloud properties" STYLE_REF="Aggregatie als Toelichting" ID="ID_1759348470" CREATED="1455910904062" MODIFIED="1455910904062" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="Edge styles" FOLDED="true" ID="ID_1001249442" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1790998169" CREATED="1455910904146" MODIFIED="1455910904146">
<hook NAME="FirstGroupNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="Edge styles" FOLDED="true" ID="ID_1001249442" CREATED="1455910904062" MODIFIED="1455910904062" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -11754,34 +11945,34 @@ elements from the styles activated by conditions are copied.</pre>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_831160653" STYLE="bubble" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_831160653" CREATED="1455910904062" MODIFIED="1455910904062" STYLE="bubble" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="As parent" ID="ID_196205281" TEXT_SHORTENED="true"/>
-<node TEXT="Linear" ID="ID_479844675" HGAP="30" TEXT_SHORTENED="true">
+<node TEXT="As parent" ID="ID_196205281" CREATED="1455910904062" MODIFIED="1455910904062" TEXT_SHORTENED="true"/>
+<node TEXT="Linear" ID="ID_479844675" CREATED="1455910904062" MODIFIED="1455910904062" HGAP_QUANTITY="30.0 px" TEXT_SHORTENED="true">
<edge STYLE="linear" WIDTH="4"/>
</node>
-<node TEXT="Bezier curve" ID="ID_622749170" HGAP="40" TEXT_SHORTENED="true">
+<node TEXT="Bezier curve" ID="ID_622749170" CREATED="1455910904063" MODIFIED="1455910904063" HGAP_QUANTITY="40.0 px" TEXT_SHORTENED="true">
<edge STYLE="bezier" WIDTH="4"/>
</node>
-<node TEXT="Sharp Linear" ID="ID_1385668433" HGAP="40" TEXT_SHORTENED="true">
+<node TEXT="Sharp Linear" ID="ID_1385668433" CREATED="1455910904063" MODIFIED="1455910904063" HGAP_QUANTITY="40.0 px" TEXT_SHORTENED="true">
<edge STYLE="sharp_linear" WIDTH="4"/>
</node>
-<node TEXT="Sharp Bezier" ID="ID_925061428" HGAP="40" TEXT_SHORTENED="true">
+<node TEXT="Sharp Bezier" ID="ID_925061428" CREATED="1455910904063" MODIFIED="1455910904063" HGAP_QUANTITY="40.0 px" TEXT_SHORTENED="true">
<edge STYLE="sharp_bezier" WIDTH="4"/>
</node>
-<node TEXT="Horizontal" ID="ID_1255718418" TEXT_SHORTENED="true">
+<node TEXT="Horizontal" ID="ID_1255718418" CREATED="1455910904063" MODIFIED="1455910904063" TEXT_SHORTENED="true">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="Hide Edge" ID="ID_846030610" BACKGROUND_COLOR="#00ffff" HGAP="50" TEXT_SHORTENED="true">
+<node TEXT="Hide Edge" ID="ID_846030610" CREATED="1455910904063" MODIFIED="1455910904063" BACKGROUND_COLOR="#00ffff" HGAP_QUANTITY="50.0 px" TEXT_SHORTENED="true">
<edge STYLE="hide_edge" WIDTH="4"/>
</node>
</node>
</node>
-<node TEXT="Edge Width" ID="ID_1718207662" TEXT_SHORTENED="true">
+<node TEXT="Edge Width" ID="ID_1718207662" CREATED="1455910904063" MODIFIED="1455910904063" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -11834,7 +12025,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Edge color" ID="ID_865389195" TEXT_SHORTENED="true">
+<node TEXT="Edge color" ID="ID_865389195" CREATED="1455910904063" MODIFIED="1455910904063" TEXT_SHORTENED="true">
<edge COLOR="#ff0000"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -11853,7 +12044,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Automatic edge color" ID="ID_1587417548" TEXT_SHORTENED="true">
+<node TEXT="Automatic edge color" ID="ID_1587417548" CREATED="1455910904063" MODIFIED="1455910904063" TEXT_SHORTENED="true">
<icon BUILTIN="../AutomaticEdgeColorHookAction"/>
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -11873,9 +12064,9 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Edge properties" STYLE_REF="Aggregatie als Toelichting" ID="ID_881523974" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1555557245" CREATED="1455910904146" MODIFIED="1455910904146">
<hook NAME="SummaryNode"/>
-<richcontent TYPE="DETAILS">
+<node TEXT="Edge properties" STYLE_REF="Aggregatie als Toelichting" ID="ID_881523974" CREATED="1455910904064" MODIFIED="1455910904064" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -11892,7 +12083,8 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
-<node TEXT="Set node width limits" ID="ID_601879583" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="Set node width limits" ID="ID_601879583" CREATED="1455910904064" MODIFIED="1455910904064" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -11932,7 +12124,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
</node>
</node>
-<node TEXT="Navigate" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1224083972" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<node TEXT="Navigate" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1224083972" CREATED="1455910904064" MODIFIED="1455910904064" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px">
<attribute NAME="Chapter" VALUE="1,2,6"/>
<richcontent TYPE="DETAILS">
@@ -11947,7 +12139,10 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<node TEXT="Previous map" ID="ID_1925064048" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1204285381" CREATED="1455910904146" MODIFIED="1455910904146">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Previous map" ID="ID_1925064048" CREATED="1455910904064" MODIFIED="1455910904064" TEXT_SHORTENED="true">
<icon BUILTIN="../MoveTo_PrevMM"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -11962,13 +12157,12 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2.6"/>
</node>
-<node TEXT="Next map" ID="ID_1576684136" TEXT_SHORTENED="true">
+<node TEXT="Next map" ID="ID_1576684136" CREATED="1455910904065" MODIFIED="1455910904065" TEXT_SHORTENED="true">
<icon BUILTIN="../MoveTo_NextMM"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -11988,14 +12182,19 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2.6"/>
</node>
-<node TEXT="Move to map" ID="ID_913517126">
+<node TEXT="" ID="ID_30604168" CREATED="1455910904147" MODIFIED="1455910904147">
<hook NAME="SummaryNode"/>
+<node TEXT="Move to map" ID="ID_913517126" CREATED="1455910904066" MODIFIED="1455910904066">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2.6"/>
</node>
-<node TEXT="(Un)fold" ID="ID_1370299836" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="" ID="ID_497745636" CREATED="1455910904147" MODIFIED="1455910904147">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="(Un)fold" ID="ID_1370299836" CREATED="1455910904066" MODIFIED="1455910904066" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12019,16 +12218,15 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Show next child" ID="ID_436333083">
+<node TEXT="Show next child" ID="ID_436333083" CREATED="1455910904066" MODIFIED="1455910904066">
<icon BUILTIN="help"/>
</node>
-<node TEXT="(Un)fold children" ID="ID_383325209" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="(Un)fold children" ID="ID_383325209" CREATED="1455910904066" MODIFIED="1455910904066" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12066,7 +12264,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Unfold one Level" ID="ID_321295556" TEXT_SHORTENED="true">
+<node TEXT="Unfold one Level" ID="ID_321295556" CREATED="1455910904067" MODIFIED="1455910904067" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_one_level"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12086,7 +12284,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Fold one Level" ID="ID_831251421" TEXT_SHORTENED="true">
+<node TEXT="Fold one Level" ID="ID_831251421" CREATED="1455910904067" MODIFIED="1455910904067" TEXT_SHORTENED="true">
<icon BUILTIN="../fold_one_level"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12106,7 +12304,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Unfold all" ID="ID_933325044" TEXT_SHORTENED="true">
+<node TEXT="Unfold all" ID="ID_933325044" CREATED="1455910904068" MODIFIED="1455910904068" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_all"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12143,7 +12341,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Fold all" ID="ID_657829947" TEXT_SHORTENED="true">
+<node TEXT="Fold all" ID="ID_657829947" CREATED="1455910904068" MODIFIED="1455910904068" TEXT_SHORTENED="true">
<icon BUILTIN="../fold_all"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12180,9 +12378,10 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Folding node(s)" ID="ID_101814873" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1066559216" CREATED="1455910904147" MODIFIED="1455910904147">
<hook NAME="SummaryNode"/>
-<attribute_layout VALUE_WIDTH="202"/>
+<node TEXT="Folding node(s)" ID="ID_101814873" CREATED="1455910904068" MODIFIED="1455910904068" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="151.5 pt"/>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -12202,7 +12401,11 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Select all visible nodes" ID="ID_166465072" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="" ID="ID_553895235" CREATED="1455910904147" MODIFIED="1455910904147">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Select all visible nodes" ID="ID_166465072" CREATED="1455910904069" MODIFIED="1455910904069" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12215,12 +12418,11 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Select visible branch" ID="ID_1140223878" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Select visible branch" ID="ID_1140223878" CREATED="1455910904069" MODIFIED="1455910904069" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12237,13 +12439,18 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Select" ID="ID_222729198">
+<node TEXT="" ID="ID_676974108" CREATED="1455910904147" MODIFIED="1455910904147">
<hook NAME="SummaryNode"/>
+<node TEXT="Select" ID="ID_222729198" CREATED="1455910904069" MODIFIED="1455910904069">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
-<node TEXT="Goto root" ID="ID_1564476202" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="" ID="ID_1907852558" CREATED="1455910904147" MODIFIED="1455910904147">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Goto root" ID="ID_1564476202" CREATED="1455910904069" MODIFIED="1455910904069" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12270,14 +12477,13 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
-<attribute_layout VALUE_WIDTH="156"/>
+<attribute_layout VALUE_WIDTH="117.0 pt"/>
<attribute NAME="Chapter" VALUE="1"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Goto node with ID..." ID="ID_343872144" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Goto node with ID..." ID="ID_343872144" CREATED="1455910904069" MODIFIED="1455910904069" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12295,7 +12501,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Goto previous node" ID="ID_482454762" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Goto previous node" ID="ID_482454762" CREATED="1455910904069" MODIFIED="1455910904069" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12324,7 +12530,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Goto next node" ID="ID_43445328" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Goto next node" ID="ID_43445328" CREATED="1455910904069" MODIFIED="1455910904069" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12356,7 +12562,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Goto previous node (fold)" ID="ID_303327981" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Goto previous node (fold)" ID="ID_303327981" CREATED="1455910904069" MODIFIED="1455910904069" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12374,7 +12580,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Goto next node (fold)" ID="ID_230717042" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Goto next node (fold)" ID="ID_230717042" CREATED="1455910904069" MODIFIED="1455910904069" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12392,10 +12598,10 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Unfold next presentation item" ID="ID_1509753321">
+<node TEXT="Unfold next presentation item" ID="ID_1509753321" CREATED="1455910904069" MODIFIED="1455910904069">
<icon BUILTIN="help"/>
</node>
-<node TEXT="Go backward" ID="ID_449527632" TEXT_SHORTENED="true">
+<node TEXT="Go backward" ID="ID_449527632" CREATED="1455910904069" MODIFIED="1455910904069" TEXT_SHORTENED="true">
<icon BUILTIN="../MoveTo_PrevNode"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12415,7 +12621,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Go forward" ID="ID_602013651" TEXT_SHORTENED="true">
+<node TEXT="Go forward" ID="ID_602013651" CREATED="1455910904070" MODIFIED="1455910904070" TEXT_SHORTENED="true">
<icon BUILTIN="../MoveTo_NextNode"/>
<richcontent TYPE="DETAILS">
@@ -12435,15 +12641,16 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Selecting nodes" ID="ID_1414672331">
+<node TEXT="" ID="ID_1456155384" CREATED="1455910904147" MODIFIED="1455910904147">
+<hook NAME="SummaryNode"/>
+<node TEXT="Selecting nodes" ID="ID_1414672331" CREATED="1455910904071" MODIFIED="1455910904071">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Selecting nodes" FOLDED="true" ID="ID_1403801753" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Selecting nodes" FOLDED="true" ID="ID_1403801753" CREATED="1455910904071" MODIFIED="1455910904071" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12483,13 +12690,13 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="156"/>
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="117.0 pt"/>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_17827125" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_17827125" CREATED="1455910904071" MODIFIED="1455910904071" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -12521,7 +12728,7 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node TEXT="Select First/last sibling" STYLE_REF="Method" ID="ID_1705866199" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Select First/last sibling" STYLE_REF="Method" ID="ID_1705866199" CREATED="1455910904072" MODIFIED="1455910904072" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12550,7 +12757,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Select All Descendants" STYLE_REF="Method" FOLDED="true" ID="ID_228451346" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Select All Descendants" STYLE_REF="Method" FOLDED="true" ID="ID_228451346" CREATED="1455910904072" MODIFIED="1455910904072" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12586,14 +12793,14 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT=" Icon-button to show all descendants" ID="ID_1807802504">
+<node TEXT=" Icon-button to show all descendants" ID="ID_1807802504" CREATED="1455910904072" MODIFIED="1455910904072">
<icon BUILTIN="../unfold_all"/>
</node>
-<node TEXT="Icon-button to hide all descendants" ID="ID_70318547">
+<node TEXT="Icon-button to hide all descendants" ID="ID_70318547" CREATED="1455910904072" MODIFIED="1455910904072">
<icon BUILTIN="../fold_all"/>
</node>
</node>
-<node TEXT="Select All nodes" STYLE_REF="Method" FOLDED="true" ID="ID_1432526079" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Select All nodes" STYLE_REF="Method" FOLDED="true" ID="ID_1432526079" CREATED="1455910904072" MODIFIED="1455910904072" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12632,14 +12839,14 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT=" Icon-button to show all descendants" ID="ID_919487043">
+<node TEXT=" Icon-button to show all descendants" ID="ID_919487043" CREATED="1455910904072" MODIFIED="1455910904072">
<icon BUILTIN="../unfold_all"/>
</node>
-<node TEXT="Icon-button to hide all descendants" ID="ID_389342260">
+<node TEXT="Icon-button to hide all descendants" ID="ID_389342260" CREATED="1455910904073" MODIFIED="1455910904073">
<icon BUILTIN="../fold_all"/>
</node>
</node>
-<node TEXT="Select All filtered nodes" STYLE_REF="Method" ID="ID_1432270723" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Select All filtered nodes" STYLE_REF="Method" ID="ID_1432270723" CREATED="1455910904073" MODIFIED="1455910904073" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12657,7 +12864,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Select Group of siblings" STYLE_REF="Method" ID="ID_1664441735" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Select Group of siblings" STYLE_REF="Method" ID="ID_1664441735" CREATED="1455910904073" MODIFIED="1455910904073" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12675,7 +12882,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Select Arbitrary nodes" STYLE_REF="Method" ID="ID_1374755186" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Select Arbitrary nodes" STYLE_REF="Method" ID="ID_1374755186" CREATED="1455910904073" MODIFIED="1455910904073" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12693,7 +12900,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Select Using arrow keys" STYLE_REF="Method" ID="ID_81219304" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Select Using arrow keys" STYLE_REF="Method" ID="ID_81219304" CREATED="1455910904073" MODIFIED="1455910904073" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -12725,7 +12932,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="With Hidden Text in Tool Tip" ID="ID_390018350" TEXT_SHORTENED="true" COLOR="#407000">
+<node TEXT="With Hidden Text in Tool Tip" ID="ID_390018350" CREATED="1455910904073" MODIFIED="1455910904073" TEXT_SHORTENED="true" COLOR="#407000">
<font NAME="SansSerif"/>
<richcontent TYPE="DETAILS">
@@ -12753,7 +12960,8 @@ elements from the styles activated by conditions are copied.</pre>
<attribute NAME="Chapter" VALUE="2"/>
</node>
</node>
-<node TEXT="Follow Link" ID="ID_1084969591" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Follow Link" ID="ID_1084969591" CREATED="1455910904073" MODIFIED="1455910904073" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -12786,7 +12994,7 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node TEXT="Filter" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1254354349" TEXT_SHORTENED="true" MIN_WIDTH="60"><richcontent TYPE="DETAILS">
+<node TEXT="Filter" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1254354349" CREATED="1455910904073" MODIFIED="1455910904073" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12876,7 +13084,10 @@ elements from the styles activated by conditions are copied.</pre>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
-<node TEXT="Undo filter action" ID="ID_619416419" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1273646599" CREATED="1455910904148" MODIFIED="1455910904148">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Undo filter action" ID="ID_619416419" CREATED="1455910904073" MODIFIED="1455910904073" TEXT_SHORTENED="true">
<icon BUILTIN="../undo_filter"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12891,13 +13102,12 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Redo filter action" ID="ID_1724296233" TEXT_SHORTENED="true">
+<node TEXT="Redo filter action" ID="ID_1724296233" CREATED="1455910904074" MODIFIED="1455910904074" TEXT_SHORTENED="true">
<icon BUILTIN="../redo_filter"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12917,7 +13127,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Reapply filter action" ID="ID_1748016122" TEXT_SHORTENED="true">
+<node TEXT="Reapply filter action" ID="ID_1748016122" CREATED="1455910904074" MODIFIED="1455910904074" TEXT_SHORTENED="true">
<icon BUILTIN="../reapply_filter"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12937,7 +13147,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Quick filter" FOLDED="true" ID="ID_1552136796" TEXT_SHORTENED="true">
+<node TEXT="Quick filter" FOLDED="true" ID="ID_1552136796" CREATED="1455910904074" MODIFIED="1455910904074" TEXT_SHORTENED="true">
<icon BUILTIN="../apply_quick_filter"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12981,7 +13191,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="Find last modified nodes" ID="ID_1539236846" TEXT_SHORTENED="true">
+<node TEXT="Find last modified nodes" ID="ID_1539236846" CREATED="1455910904075" MODIFIED="1455910904075" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -13013,7 +13223,7 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node TEXT="Filter selected nodes" ID="ID_402507556" TEXT_SHORTENED="true">
+<node TEXT="Filter selected nodes" ID="ID_402507556" CREATED="1455910904075" MODIFIED="1455910904075" TEXT_SHORTENED="true">
<icon BUILTIN="../filter_selected_nodes"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13045,10 +13255,10 @@ elements from the styles activated by conditions are copied.</pre>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<attribute_layout NAME_WIDTH="68" VALUE_WIDTH="68"/>
+<attribute_layout NAME_WIDTH="51.0 pt" VALUE_WIDTH="51.0 pt"/>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Select all matching nodes" ID="ID_164487469" TEXT_SHORTENED="true">
+<node TEXT="Select all matching nodes" ID="ID_164487469" CREATED="1455910904075" MODIFIED="1455910904075" TEXT_SHORTENED="true">
<icon BUILTIN="../select_all_found_nodes"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13068,7 +13278,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="No filtering" ID="ID_1978139715" TEXT_SHORTENED="true">
+<node TEXT="No filtering" ID="ID_1978139715" CREATED="1455910904075" MODIFIED="1455910904075" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_filtering"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13088,7 +13298,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Compose filter" FOLDED="true" ID="ID_1142884544" TEXT_SHORTENED="true">
+<node TEXT="Compose filter" FOLDED="true" ID="ID_1142884544" CREATED="1455910904076" MODIFIED="1455910904076" TEXT_SHORTENED="true">
<icon BUILTIN="../edit_filtering_condition"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13155,149 +13365,152 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="First filter entry field" STYLE_REF="Method" FOLDED="true" ID="ID_1625917093">
+<node TEXT="First filter entry field" STYLE_REF="Method" FOLDED="true" ID="ID_1625917093" CREATED="1455910904076" MODIFIED="1455910904076">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="Node Text (default)" ID="ID_440014122">
+<node TEXT="Node Text (default)" ID="ID_440014122" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Parent Text" ID="ID_58128801">
+<node TEXT="Parent Text" ID="ID_58128801" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Details" ID="ID_1976565775">
+<node TEXT="Details" ID="ID_1976565775" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Icon" ID="ID_265220662">
+<node TEXT="Icon" ID="ID_265220662" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Hyperlink" ID="ID_1229040721">
+<node TEXT="Hyperlink" ID="ID_1229040721" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Connector label" ID="ID_725547789">
+<node TEXT="Connector label" ID="ID_725547789" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Connector" ID="ID_1614932096">
+<node TEXT="Connector" ID="ID_1614932096" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Date filter" ID="ID_1276079599">
+<node TEXT="Date filter" ID="ID_1276079599" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Priority" ID="ID_30298697">
+<node TEXT="Priority" ID="ID_30298697" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Node" ID="ID_863184223">
+<node TEXT="Node" ID="ID_863184223" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Style" ID="ID_1110522569">
+<node TEXT="Style" ID="ID_1110522569" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Node level" ID="ID_1102698985">
+<node TEXT="Node level" ID="ID_1102698985" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Reminder" ID="ID_988583509">
+<node TEXT="Reminder" ID="ID_988583509" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Script filter" ID="ID_1339780088">
+<node TEXT="Script filter" ID="ID_1339780088" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="and user defined styles..." ID="ID_1524254052">
+<node TEXT="and user defined styles..." ID="ID_1524254052" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Second filter entry field" STYLE_REF="Method" FOLDED="true" ID="ID_387521533">
+<node TEXT="Second filter entry field" STYLE_REF="Method" FOLDED="true" ID="ID_387521533" CREATED="1455910904076" MODIFIED="1455910904076">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="Contains (default)" ID="ID_1227202337">
+<node TEXT="Contains (default)" ID="ID_1227202337" CREATED="1455910904076" MODIFIED="1455910904076">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Is equal to" ID="ID_39134629">
+<node TEXT="Is equal to" ID="ID_39134629" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Is not equal to" ID="ID_1364103252">
+<node TEXT="Is not equal to" ID="ID_1364103252" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT=">" ID="ID_877198724">
+<node TEXT=">" ID="ID_877198724" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT=">=" ID="ID_1015544739">
+<node TEXT=">=" ID="ID_1015544739" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="<=" ID="ID_1164055784">
+<node TEXT="<=" ID="ID_1164055784" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT=">" ID="ID_1681290681">
+<node TEXT=">" ID="ID_1681290681" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Matches regexpr" ID="ID_91821609">
+<node TEXT="Matches regexpr" ID="ID_91821609" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Third filter entry field" STYLE_REF="Method" FOLDED="true" ID="ID_871096693">
+<node TEXT="Third filter entry field" STYLE_REF="Method" FOLDED="true" ID="ID_871096693" CREATED="1455910904077" MODIFIED="1455910904077">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="empty text field (default)" STYLE_REF="OptionalValue" ID="ID_1473584730"/>
+<node TEXT="empty text field (default)" STYLE_REF="OptionalValue" ID="ID_1473584730" CREATED="1455910904077" MODIFIED="1455910904077"/>
</node>
-<node TEXT="Check box" STYLE_REF="Method" FOLDED="true" ID="ID_191687274">
+<node TEXT="Check box" STYLE_REF="Method" FOLDED="true" ID="ID_191687274" CREATED="1455910904077" MODIFIED="1455910904077">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="Match case" ID="ID_939695594">
+<node TEXT="Match case" ID="ID_939695594" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Table with List of filters" STYLE_REF="Method" ID="ID_1260531487">
+<node TEXT="Table with List of filters" STYLE_REF="Method" ID="ID_1260531487" CREATED="1455910904077" MODIFIED="1455910904077">
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Buttons of Filter composer" STYLE_REF="Method" FOLDED="true" ID="ID_1027349840">
+<node TEXT="Buttons of Filter composer" STYLE_REF="Method" FOLDED="true" ID="ID_1027349840" CREATED="1455910904077" MODIFIED="1455910904077">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="Add" STYLE_REF="Method" ID="ID_1309133157"/>
-<node TEXT="And" STYLE_REF="Method" ID="ID_1757300074"/>
-<node TEXT="Or" STYLE_REF="Method" ID="ID_1457390872"/>
-<node TEXT="Split" STYLE_REF="Method" ID="ID_473058214" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1395008225" CREATED="1455910904148" MODIFIED="1455910904148">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Add" STYLE_REF="Method" ID="ID_1309133157" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="And" STYLE_REF="Method" ID="ID_1757300074" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="Or" STYLE_REF="Method" ID="ID_1457390872" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="Split" STYLE_REF="Method" ID="ID_473058214" CREATED="1455910904077" MODIFIED="1455910904077" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -13311,35 +13524,43 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Delete" STYLE_REF="Method" ID="ID_1607587118"/>
-<node TEXT="Set Name" STYLE_REF="Method" ID="ID_1779620539"/>
-<node TEXT="Right" STYLE_REF="Method" ID="ID_208287444">
+<node TEXT="Delete" STYLE_REF="Method" ID="ID_1607587118" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="Set Name" STYLE_REF="Method" ID="ID_1779620539" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="" ID="ID_1628657472" CREATED="1455910904148" MODIFIED="1455910904148">
+<hook NAME="SummaryNode"/>
+<node TEXT="Right" STYLE_REF="Method" ID="ID_208287444" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="OK" STYLE_REF="Method" ID="ID_1874975203"/>
-<node TEXT="Apply" STYLE_REF="Method" ID="ID_1375530764"/>
-<node TEXT="Cancel" STYLE_REF="Method" ID="ID_23661885"/>
-<node TEXT="Save" STYLE_REF="Method" ID="ID_1878373607"/>
-<node TEXT="Load" STYLE_REF="Method" ID="ID_1746410510"/>
-<node TEXT="Bottom" ID="ID_1789678903">
+</node>
+<node TEXT="" ID="ID_1127420935" CREATED="1455910904148" MODIFIED="1455910904148">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="OK" STYLE_REF="Method" ID="ID_1874975203" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="Apply" STYLE_REF="Method" ID="ID_1375530764" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="Cancel" STYLE_REF="Method" ID="ID_23661885" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="Save" STYLE_REF="Method" ID="ID_1878373607" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="Load" STYLE_REF="Method" ID="ID_1746410510" CREATED="1455910904077" MODIFIED="1455910904077"/>
+<node TEXT="" ID="ID_1717471501" CREATED="1455910904148" MODIFIED="1455910904148">
+<hook NAME="SummaryNode"/>
+<node TEXT="Bottom" ID="ID_1789678903" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
</node>
</node>
-<node TEXT="action" ID="ID_214063901">
+</node>
+<node TEXT="" ID="ID_439388948" CREATED="1455910904149" MODIFIED="1455910904149">
<hook NAME="SummaryNode"/>
+<node TEXT="action" ID="ID_214063901" CREATED="1455910904077" MODIFIED="1455910904077">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Filter Example" ID="ID_662270274" LINK="#_Freeplane_Link_784043927" TEXT_SHORTENED="true">
+<node TEXT="Filter Example" ID="ID_662270274" CREATED="1455910904077" MODIFIED="1455910904077" LINK="#_Freeplane_Link_784043927" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
@@ -13360,7 +13581,11 @@ elements from the styles activated by conditions are copied.</pre>
<attribute NAME="Chapter" VALUE="2"/>
</node>
</node>
-<node TEXT="Applies to filtered nodes (refine)" ID="ID_1768599003" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1267065817" CREATED="1455910904149" MODIFIED="1455910904149">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Applies to filtered nodes (refine)" ID="ID_1768599003" CREATED="1455910904077" MODIFIED="1455910904077" TEXT_SHORTENED="true">
<icon BUILTIN="../applies_to_filtered_nodes"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13375,13 +13600,12 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Show ancestors" ID="ID_1384592614" TEXT_SHORTENED="true">
+<node TEXT="Show ancestors" ID="ID_1384592614" CREATED="1455910904078" MODIFIED="1455910904078" TEXT_SHORTENED="true">
<icon BUILTIN="../show_ancestors"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13412,7 +13636,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Show descendants" ID="ID_347749612" TEXT_SHORTENED="true">
+<node TEXT="Show descendants" ID="ID_347749612" CREATED="1455910904078" MODIFIED="1455910904078" TEXT_SHORTENED="true">
<icon BUILTIN="../show_descendants"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13443,14 +13667,15 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Filter conditions / states" ID="ID_1103140596">
+<node TEXT="" ID="ID_1830550098" CREATED="1455910904149" MODIFIED="1455910904149">
<hook NAME="SummaryNode"/>
+<node TEXT="Filter conditions / states" ID="ID_1103140596" CREATED="1455910904079" MODIFIED="1455910904079">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Unfold hidden nodes" ID="ID_865947666" TEXT_SHORTENED="true">
+<node TEXT="Unfold hidden nodes" ID="ID_865947666" CREATED="1455910904079" MODIFIED="1455910904079" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_filtered_ancestors"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13488,7 +13713,11 @@ elements from the styles activated by conditions are copied.</pre>
<attribute NAME="Chapter" VALUE="9"/>
</node>
</node>
-<node TEXT="Find previous" ID="ID_132872030" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1761410197" CREATED="1455910904149" MODIFIED="1455910904149">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Find previous" ID="ID_132872030" CREATED="1455910904079" MODIFIED="1455910904079" TEXT_SHORTENED="true">
<icon BUILTIN="../find_previous"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13520,13 +13749,12 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Find next" ID="ID_1528431308" TEXT_SHORTENED="true">
+<node TEXT="Find next" ID="ID_1528431308" CREATED="1455910904080" MODIFIED="1455910904080" TEXT_SHORTENED="true">
<icon BUILTIN="../find_next"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13563,16 +13791,18 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="Finding / searching" ID="ID_721920269">
+<node TEXT="" ID="ID_193528763" CREATED="1455910904149" MODIFIED="1455910904149">
<hook NAME="SummaryNode"/>
+<node TEXT="Finding / searching" ID="ID_721920269" CREATED="1455910904080" MODIFIED="1455910904080">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
</node>
-<node TEXT="Tools" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1833899525" TEXT_SHORTENED="true" MIN_WIDTH="60">
-<attribute_layout NAME_WIDTH="37" VALUE_WIDTH="77"/>
+</node>
+<node TEXT="Tools" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1833899525" CREATED="1455910904080" MODIFIED="1455910904080" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px">
+<attribute_layout NAME_WIDTH="27.75 pt" VALUE_WIDTH="57.75 pt"/>
<attribute NAME="Chapter" VALUE="3,6,7,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
@@ -13590,7 +13820,7 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<node TEXT="Time management" FOLDED="true" ID="ID_1959496513" TEXT_SHORTENED="true">
+<node TEXT="Time management" FOLDED="true" ID="ID_1959496513" CREATED="1455910904080" MODIFIED="1455910904080" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -13623,7 +13853,10 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
-<node TEXT="Manage time [Show Calendar...]" ID="ID_1104707017" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_913398352" CREATED="1455910904150" MODIFIED="1455910904150">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Manage time [Show Calendar...]" ID="ID_1104707017" CREATED="1455910904080" MODIFIED="1455910904080" TEXT_SHORTENED="true">
<icon BUILTIN="../TimeManagementAction"/>
<richcontent TYPE="DETAILS">
@@ -13649,37 +13882,37 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Set year, month and day" STYLE_REF="Method" ID="ID_629838545" TEXT_SHORTENED="true">
+<node TEXT="Set year, month and day" STYLE_REF="Method" ID="ID_629838545" CREATED="1455910904081" MODIFIED="1455910904081" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="5"/>
</node>
-<node TEXT="Insert date in selection" STYLE_REF="Method" ID="ID_77223280" TEXT_SHORTENED="true">
+<node TEXT="Insert date in selection" STYLE_REF="Method" ID="ID_77223280" CREATED="1455910904081" MODIFIED="1455910904081" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="5"/>
</node>
-<node TEXT="Remind me at this date" STYLE_REF="Method" ID="ID_1905175036" TEXT_SHORTENED="true">
+<node TEXT="Remind me at this date" STYLE_REF="Method" ID="ID_1905175036" CREATED="1455910904081" MODIFIED="1455910904081" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="5"/>
</node>
-<node TEXT="Remind later" STYLE_REF="Method" FOLDED="true" ID="ID_482088279">
+<node TEXT="Remind later" STYLE_REF="Method" FOLDED="true" ID="ID_482088279" CREATED="1455910904081" MODIFIED="1455910904081">
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="1643041920000" PERIOD="10" UNIT="YEAR"/>
</hook>
-<node TEXT="minutes" ID="ID_488965894"/>
-<node TEXT="hours" ID="ID_12255581"/>
-<node TEXT="days" ID="ID_1083871034"/>
-<node TEXT="weeks" ID="ID_1691377285"/>
-<node TEXT="years" ID="ID_1891442163"/>
+<node TEXT="minutes" ID="ID_488965894" CREATED="1455910904081" MODIFIED="1455910904081"/>
+<node TEXT="hours" ID="ID_12255581" CREATED="1455910904081" MODIFIED="1455910904081"/>
+<node TEXT="days" ID="ID_1083871034" CREATED="1455910904081" MODIFIED="1455910904081"/>
+<node TEXT="weeks" ID="ID_1691377285" CREATED="1455910904081" MODIFIED="1455910904081"/>
+<node TEXT="years" ID="ID_1891442163" CREATED="1455910904081" MODIFIED="1455910904081"/>
</node>
-<node TEXT="Remove reminder (time)" STYLE_REF="Method" ID="ID_1600844387" TEXT_SHORTENED="true">
+<node TEXT="Remove reminder (time)" STYLE_REF="Method" ID="ID_1600844387" CREATED="1455910904081" MODIFIED="1455910904081" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="5"/>
</node>
</node>
-<node TEXT="Manage tasks [Show Time Scheduler List...]" ID="ID_1106133151" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<node TEXT="Manage tasks [Show Time Scheduler List...]" ID="ID_1106133151" CREATED="1455910904082" MODIFIED="1455910904082" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
<icon BUILTIN="../TimeListAction"/>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1106133151" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="DETAILS">
<html>
@@ -13723,9 +13956,8 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
-<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1106133151" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Remove reminder" ID="ID_148977369" TEXT_SHORTENED="true">
+<node TEXT="Remove reminder" ID="ID_148977369" CREATED="1455910904083" MODIFIED="1455910904083" TEXT_SHORTENED="true">
<icon BUILTIN="../ReminderHookAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -13759,19 +13991,21 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="" ID="ID_517678813" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_461990543" CREATED="1455910904150" MODIFIED="1455910904150">
+<hook NAME="SummaryNode"/>
+<node TEXT="" ID="ID_517678813" CREATED="1455910904084" MODIFIED="1455910904084" TEXT_SHORTENED="true">
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
</hook>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="5"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Password protection" FOLDED="true" ID="ID_83654353" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Password protection" FOLDED="true" ID="ID_83654353" CREATED="1455910904085" MODIFIED="1455910904085" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
@@ -13817,7 +14051,10 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="Enter password" ID="ID_1020968664" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1419155643" CREATED="1455910904150" MODIFIED="1455910904150">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Enter password" ID="ID_1020968664" CREATED="1455910904086" MODIFIED="1455910904086" TEXT_SHORTENED="true">
<icon BUILTIN="../lock"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -13866,7 +14103,9 @@ elements from the styles activated by conditions are copied.</pre>
<attribute NAME="Chapter" VALUE="8"/>
<hook NAME="AlwaysUnfoldedNode"/>
</node>
-<node TEXT="" ENCRYPTED_CONTENT="/xWFGOIZ0dg= gT0iwj5Mr9ZIUJGRpaqO8Htqqrsf2WP03ZNL+++X2kTszPq0YnO2ZeUGmygvV6OwMQ0CXGau4qbnLlt5ODSMosrdy5dZ6ZqDB4hELxsH/uvBkCIhukwfQA7ExofI6u2MbKWGXK/WWJ5cB+65yJVcWqjeLTsDYwNc4stftw3OcVG4ui/40qfkmCCuSemvAOV2sNjrxV5qyDnwzJWVCS0VtwHzUeDKlKRPNz08FmIdhXWpX3YtWYhIn7CLC9rzh9OI" ID="ID_866287848" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1407526336" CREATED="1455910904150" MODIFIED="1455910904150">
+<hook NAME="SummaryNode"/>
+<node TEXT="" ENCRYPTED_CONTENT="/xWFGOIZ0dg= gT0iwj5Mr9ZIUJGRpaqO8Htqqrsf2WP03ZNL+++X2kTszPq0YnO2ZeUGmygvV6OwMQ0CXGau4qbnLlt5ODSMosrdy5dZ6ZqDB4hELxsH/uvBkCIhukwfQA7ExofI6u2MbKWGXK/WWJ5cB+65yJVcWqjeLTsDYwNc4stftw3OcVG4ui/40qfkmCCuSemvAOV2sNjrxV5qyDnwzJWVCS0VtwHzUeDKlKRPNz08FmIdhXWpX3YtWYhIn7CLC9rzh9OI" ID="ID_866287848" CREATED="1455910904088" MODIFIED="1455910904088" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -13901,9 +14140,9 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Remove password" ID="ID_136268743" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Remove password" ID="ID_136268743" CREATED="1455910904088" MODIFIED="1455910904088" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -13923,7 +14162,7 @@ elements from the styles activated by conditions are copied.</pre>
<attribute NAME="Chapter" VALUE="8"/>
</node>
</node>
-<node TEXT="Add-ons" STYLE_REF="Method" ID="ID_100406395" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Add-ons" STYLE_REF="Method" ID="ID_100406395" CREATED="1455910904089" MODIFIED="1455910904089" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -13937,7 +14176,10 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Assign hot key" ID="ID_764902206" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1307052456" CREATED="1455910904150" MODIFIED="1455910904150">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Assign hot key" ID="ID_764902206" CREATED="1455910904089" MODIFIED="1455910904089" TEXT_SHORTENED="true">
<icon BUILTIN="../SetAcceleratorOnNextClickAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -13985,19 +14227,18 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Hot Key Presets" FOLDED="true" ID="ID_701336954">
+<node TEXT="Hot Key Presets" FOLDED="true" ID="ID_701336954" CREATED="1455910904093" MODIFIED="1455910904093">
<icon BUILTIN="../acceleratorPresets"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="Select hot key set" ID="ID_418449510" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Select hot key set" ID="ID_418449510" CREATED="1455910904094" MODIFIED="1455910904094" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14028,7 +14269,7 @@ elements from the styles activated by conditions are copied.</pre>
<attribute NAME="Chapter" VALUE="8"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="Save hot key set" ID="ID_918316602" COLOR="#000000" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Save hot key set" ID="ID_918316602" CREATED="1455910904094" MODIFIED="1455910904094" COLOR="#000000" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14065,7 +14306,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Remove hot key set" STYLE_REF="Functiegroep" ID="ID_978833755" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Remove hot key set" STYLE_REF="Functiegroep" ID="ID_978833755" CREATED="1455910904095" MODIFIED="1455910904095" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14086,16 +14327,17 @@ elements from the styles activated by conditions are copied.</pre>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Short cuts" FOLDED="true" ID="ID_1175856403">
+<node TEXT="" ID="ID_1172830214" CREATED="1455910904151" MODIFIED="1455910904151">
<hook NAME="SummaryNode"/>
+<node TEXT="Short cuts" FOLDED="true" ID="ID_1175856403" CREATED="1455910904095" MODIFIED="1455910904095">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="" ID="ID_1466182220">
+<node TEXT="" ID="ID_1466182220" CREATED="1455910904095" MODIFIED="1455910904095">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Short cut or hot key" ID="ID_812201013" TEXT_SHORTENED="true">
+<node TEXT="Short cut or hot key" ID="ID_812201013" CREATED="1455910904095" MODIFIED="1455910904095" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -14117,7 +14359,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="F-keys" ID="ID_435839537" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="F-keys" ID="ID_435839537" CREATED="1455910904095" MODIFIED="1455910904095" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14132,7 +14374,7 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Reference card for special system keys" ID="ID_1818761339" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Reference card for special system keys" ID="ID_1818761339" CREATED="1455910904095" MODIFIED="1455910904095" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14155,7 +14397,7 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Unassigned F-keys" STYLE_REF="ToNote" ID="ID_572257004" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Unassigned F-keys" STYLE_REF="ToNote" ID="ID_572257004" CREATED="1455910904095" MODIFIED="1455910904095" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14167,22 +14409,27 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
<hook NAME="AlwaysUnfoldedNode"/>
-<node ID="ID_1243435937" LINK="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4652076"><richcontent TYPE="NODE">
+<node ID="ID_1243435937" CREATED="1455910904095" MODIFIED="1455910904095" LINK="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4652076"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<pre wrap=""><a href="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4652076" class="moz-txt-link-freetext">https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4652076</a></pre>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
</node>
-<node TEXT="Scripts" ID="ID_1890181858" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="" ID="ID_1539351168" CREATED="1455910904151" MODIFIED="1455910904151">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Scripts" ID="ID_1890181858" CREATED="1455910904096" MODIFIED="1455910904096" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14200,7 +14447,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Execute selected node scripts" ID="ID_894921324" TEXT_SHORTENED="true">
+<node TEXT="Execute selected node scripts" ID="ID_894921324" CREATED="1455910904096" MODIFIED="1455910904096" TEXT_SHORTENED="true">
<icon BUILTIN="../ExecuteScriptForSelectionAction"/>
<richcontent TYPE="DETAILS">
@@ -14220,7 +14467,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Execute all scripts" ID="ID_1362957476" TEXT_SHORTENED="true">
+<node TEXT="Execute all scripts" ID="ID_1362957476" CREATED="1455910904097" MODIFIED="1455910904097" TEXT_SHORTENED="true">
<icon BUILTIN="../ExecuteScriptForAllNodes"/>
<richcontent TYPE="DETAILS">
@@ -14240,7 +14487,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Edit script..." ID="ID_1785517002">
+<node TEXT="Edit script..." ID="ID_1785517002" CREATED="1455910904098" MODIFIED="1455910904098">
<icon BUILTIN="../ScriptEditor"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14260,7 +14507,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Formulas..." STYLE_REF="Functie" FOLDED="true" ID="ID_394104724" BACKGROUND_COLOR="#ffffff"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Formulas..." STYLE_REF="Functie" FOLDED="true" ID="ID_394104724" CREATED="1455910904099" MODIFIED="1455910904099" BACKGROUND_COLOR="#ffffff"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14296,15 +14543,16 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="7"/>
-<node TEXT="Evaluate all" STYLE_REF="Functie" ID="ID_1812283108">
+<node TEXT="Evaluate all" STYLE_REF="Functie" ID="ID_1812283108" CREATED="1455910904100" MODIFIED="1455910904100">
<icon BUILTIN="../formula"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Scripts and formulas" FOLDED="true" ID="ID_1686912429" TEXT_SHORTENED="true" LINK="#ID_1528894906">
+<node TEXT="" ID="ID_128702260" CREATED="1455910904151" MODIFIED="1455910904151">
<hook NAME="SummaryNode"/>
+<node TEXT="Scripts and formulas" FOLDED="true" ID="ID_1686912429" CREATED="1455910904101" MODIFIED="1455910904101" LINK="#ID_1528894906" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -14342,16 +14590,16 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<node TEXT="" FOLDED="true" ID="ID_1643451776">
+<node TEXT="" FOLDED="true" ID="ID_1643451776" CREATED="1455910904101" MODIFIED="1455910904101">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="Wiki Formulas" ID="ID_1130453106" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formulas">
+<node TEXT="Wiki Formulas" ID="ID_1130453106" CREATED="1455910904101" MODIFIED="1455910904101" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formulas">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Wiki Groovy scripts" ID="ID_1846416316" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting">
+<node TEXT="Wiki Groovy scripts" ID="ID_1846416316" CREATED="1455910904102" MODIFIED="1455910904102" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Wiki Example scripts" ID="ID_1734570187" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts"/>
-<node TEXT="Example script to Load image in Details" ID="ID_840644558" LINK="menuitem:_$ExecuteScriptForSelectionAction$0" TEXT_SHORTENED="true">
+<node TEXT="Wiki Example scripts" ID="ID_1734570187" CREATED="1455910904102" MODIFIED="1455910904102" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts"/>
+<node TEXT="Example script to Load image in Details" ID="ID_840644558" CREATED="1455910904102" MODIFIED="1455910904102" LINK="menuitem:_$ExecuteScriptForSelectionAction$0" TEXT_SHORTENED="true">
<icon BUILTIN="../ExecuteScriptForSelectionAction"/>
<attribute NAME="script1" VALUE="// @ExecutionModes({ON_SINGLE_NODE})
import groovy.swing.SwingBuilder
import java.awt.FlowLayout as FL
import javax.swing.BoxLayout as BXL
import javax.swing.ImageIcon
import javax.swing.JFileChooser
import javax.swing.JTextField
import org.freeplane.core.resources.ResourceController

def ImageIcon getIcon(String path) {
 new ImageIcon(ResourceController.getResour [...]
<hook NAME="NodeConditionalStyles">
@@ -14421,7 +14669,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Generic use of same script" ID="ID_776458088" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Generic use of same script" ID="ID_776458088" CREATED="1455910904103" MODIFIED="1455910904103" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14503,7 +14751,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
</node>
-<node TEXT="Execute external command" ID="ID_1044042899" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Execute external command" ID="ID_1044042899" CREATED="1455910904103" MODIFIED="1455910904103" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14537,18 +14785,19 @@ elements from the styles activated by conditions are copied.</pre>
</node>
</node>
</node>
-<node TEXT="Open user directory" FOLDED="true" ID="ID_4259182">
+</node>
+<node TEXT="Open user directory" FOLDED="true" ID="ID_4259182" CREATED="1455910904103" MODIFIED="1455910904103">
<icon BUILTIN="../OpenUserDirAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6,8"/>
-<node TEXT="log files" ID="ID_338415854">
+<node TEXT="log files" ID="ID_338415854" CREATED="1455910904105" MODIFIED="1455910904105">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="directory-.backup" FOLDED="true" ID="ID_692458643" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="directory-.backup" FOLDED="true" ID="ID_692458643" CREATED="1455910904105" MODIFIED="1455910904105" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14564,7 +14813,7 @@ elements from the styles activated by conditions are copied.</pre>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_1708394985">
+<node TEXT="" ID="ID_1708394985" CREATED="1455910904105" MODIFIED="1455910904105">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -14584,7 +14833,10 @@ elements from the styles activated by conditions are copied.</pre>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="directory-templates" ID="ID_366822599" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="" ID="ID_738204400" CREATED="1455910904151" MODIFIED="1455910904151">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="directory-templates" ID="ID_366822599" CREATED="1455910904105" MODIFIED="1455910904105" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14611,13 +14863,12 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="directory-scripts" ID="ID_1775013886" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="directory-scripts" ID="ID_1775013886" CREATED="1455910904105" MODIFIED="1455910904105" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14634,7 +14885,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="directory-icons" ID="ID_7040911" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="directory-icons" ID="ID_7040911" CREATED="1455910904105" MODIFIED="1455910904105" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14663,7 +14914,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="directory-xml" ID="ID_912917878" TEXT_SHORTENED="true">
+<node TEXT="directory-xml" ID="ID_912917878" CREATED="1455910904105" MODIFIED="1455910904105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -14684,7 +14935,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="directory-accelerators" ID="ID_390138300" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="directory-accelerators" ID="ID_390138300" CREATED="1455910904105" MODIFIED="1455910904105" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14705,8 +14956,9 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="6,8"/>
</node>
-<node TEXT="Import/export" ID="ID_877249660" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1478259172" CREATED="1455910904151" MODIFIED="1455910904151">
<hook NAME="SummaryNode"/>
+<node TEXT="Import/export" ID="ID_877249660" CREATED="1455910904105" MODIFIED="1455910904105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -14727,7 +14979,8 @@ elements from the styles activated by conditions are copied.</pre>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Preferences ..." FOLDED="true" ID="ID_827606855" TEXT_SHORTENED="true">
+</node>
+<node TEXT="Preferences ..." FOLDED="true" ID="ID_827606855" CREATED="1455910904106" MODIFIED="1455910904106" TEXT_SHORTENED="true">
<icon BUILTIN="../PropertyAction"/>
<richcontent TYPE="DETAILS">
@@ -14746,174 +14999,197 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,3,4,6,7,8"/>
-<node TEXT="Environment" FOLDED="true" ID="ID_1029291913">
+<node TEXT="Environment" FOLDED="true" ID="ID_1029291913" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="Open files in a running instance" FOLDED="true" ID="ID_637030087">
+<node TEXT="" ID="ID_1110787873" CREATED="1455910904152" MODIFIED="1455910904152">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Open files in a running instance" FOLDED="true" ID="ID_637030087" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_390598009">
-<attribute_layout NAME_WIDTH="33" VALUE_WIDTH="137"/>
+<node TEXT="" ID="ID_390598009" CREATED="1455910904107" MODIFIED="1455910904107">
+<attribute_layout NAME_WIDTH="24.75 pt" VALUE_WIDTH="102.75 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Avoid a second instance in any case" ID="ID_646231690">
+<node TEXT="Avoid a second instance in any case" ID="ID_646231690" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Single Program Instance" ID="ID_1182954985">
+<node TEXT="" ID="ID_1862775101" CREATED="1455910904152" MODIFIED="1455910904152">
+<hook NAME="SummaryNode"/>
+<node TEXT="Single Program Instance" ID="ID_1182954985" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Language" STYLE_REF="Method" FOLDED="true" ID="ID_922308916">
-<node TEXT="Automatic" ID="ID_1563480497">
+</node>
+<node TEXT="" ID="ID_603009510" CREATED="1455910904152" MODIFIED="1455910904152">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Language" STYLE_REF="Method" FOLDED="true" ID="ID_922308916" CREATED="1455910904107" MODIFIED="1455910904107">
+<node TEXT="Automatic" ID="ID_1563480497" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Last Opened List Length" STYLE_REF="Method" FOLDED="true" ID="ID_980964669">
-<node TEXT="25" ID="ID_707557773">
+<node TEXT="Last Opened List Length" STYLE_REF="Method" FOLDED="true" ID="ID_980964669" CREATED="1455910904107" MODIFIED="1455910904107">
+<node TEXT="25" ID="ID_707557773" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Automatically open last map" ID="ID_196332959">
+<node TEXT="Automatically open last map" ID="ID_196332959" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Load all last maps" ID="ID_1374498842">
+<node TEXT="Load all last maps" ID="ID_1374498842" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Load last and new maps" ID="ID_1415496133">
+<node TEXT="Load last and new maps" ID="ID_1415496133" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Experimental File Locking" ID="ID_323193765">
+<node TEXT="Experimental File Locking" ID="ID_323193765" CREATED="1455910904107" MODIFIED="1455910904107">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Standard Template File" STYLE_REF="Method" FOLDED="true" ID="ID_1036795471">
-<node TEXT="standard.mm" ID="ID_706234894">
+<node TEXT="Standard Template File" STYLE_REF="Method" FOLDED="true" ID="ID_1036795471" CREATED="1455910904107" MODIFIED="1455910904107">
+<node TEXT="standard.mm" ID="ID_706234894" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Files" STYLE_REF="Method" ID="ID_1889550390">
+<node TEXT="" ID="ID_1573573695" CREATED="1455910904152" MODIFIED="1455910904152">
+<hook NAME="SummaryNode"/>
+<node TEXT="Files" STYLE_REF="Method" ID="ID_1889550390" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Time For Automatic Save" STYLE_REF="Method" FOLDED="true" ID="ID_1187275639">
-<node TEXT="60,000" ID="ID_1936163905">
+</node>
+<node TEXT="" ID="ID_824810138" CREATED="1455910904152" MODIFIED="1455910904152">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Time For Automatic Save" STYLE_REF="Method" FOLDED="true" ID="ID_1187275639" CREATED="1455910904108" MODIFIED="1455910904108">
+<node TEXT="60,000" ID="ID_1936163905" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Use single directory for backup files" ID="ID_1591228143">
+<node TEXT="Use single directory for backup files" ID="ID_1591228143" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Use single directory for backup files" ID="ID_99034104">
+<node TEXT="Use single directory for backup files" ID="ID_99034104" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Backup directory if above is selected" STYLE_REF="Method" ID="ID_76108740"/>
-<node TEXT="Delete Automatic Saves At Exit" ID="ID_1981866727">
+<node TEXT="Backup directory if above is selected" STYLE_REF="Method" ID="ID_76108740" CREATED="1455910904108" MODIFIED="1455910904108"/>
+<node TEXT="Delete Automatic Saves At Exit" ID="ID_1981866727" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="NumberOf Different Files For Automatic SAve" STYLE_REF="Method" FOLDED="true" ID="ID_1665531613">
-<node TEXT="10" ID="ID_205157037">
+<node TEXT="NumberOf Different Files For Automatic SAve" STYLE_REF="Method" FOLDED="true" ID="ID_1665531613" CREATED="1455910904108" MODIFIED="1455910904108">
+<node TEXT="10" ID="ID_205157037" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Number of kept backup files" STYLE_REF="Method" FOLDED="true" ID="ID_862892627">
-<node TEXT="2" ID="ID_1142741407">
+<node TEXT="Number of kept backup files" STYLE_REF="Method" FOLDED="true" ID="ID_862892627" CREATED="1455910904108" MODIFIED="1455910904108">
+<node TEXT="2" ID="ID_1142741407" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Automatic Save" ID="ID_650602318">
+<node TEXT="" ID="ID_662713783" CREATED="1455910904152" MODIFIED="1455910904152">
+<hook NAME="SummaryNode"/>
+<node TEXT="Automatic Save" ID="ID_650602318" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Save folding" STYLE_REF="Method" FOLDED="true" ID="ID_886253731" TEXT_SHORTENED="true">
-<node TEXT="Never" ID="ID_689273752">
+</node>
+<node TEXT="" ID="ID_1450249895" CREATED="1455910904152" MODIFIED="1455910904152">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Save folding" STYLE_REF="Method" FOLDED="true" ID="ID_886253731" CREATED="1455910904108" MODIFIED="1455910904108" TEXT_SHORTENED="true">
+<node TEXT="Never" ID="ID_689273752" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Always" ID="ID_702281311">
+<node TEXT="Always" ID="ID_702281311" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="If map is changed" ID="ID_1299958092">
+<node TEXT="If map is changed" ID="ID_1299958092" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Save modification times" STYLE_REF="Method" ID="ID_1062887553"/>
-<node TEXT="Save" ID="ID_619771458">
+<node TEXT="Save modification times" STYLE_REF="Method" ID="ID_1062887553" CREATED="1455910904108" MODIFIED="1455910904108"/>
+<node TEXT="" ID="ID_508467919" CREATED="1455910904153" MODIFIED="1455910904153">
<hook NAME="SummaryNode"/>
+<node TEXT="Save" ID="ID_619771458" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
-<node TEXT="On Load" STYLE_REF="Method" FOLDED="true" ID="ID_6779259">
-<node TEXT="Load from map or fold all" ID="ID_1843878856">
+</node>
+<node TEXT="" ID="ID_549863637" CREATED="1455910904153" MODIFIED="1455910904153">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="On Load" STYLE_REF="Method" FOLDED="true" ID="ID_6779259" CREATED="1455910904108" MODIFIED="1455910904108">
+<node TEXT="Load from map or fold all" ID="ID_1843878856" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Load from map or unfold all" ID="ID_204010386">
+<node TEXT="Load from map or unfold all" ID="ID_204010386" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Unfold all" ID="ID_98026410">
+<node TEXT="Unfold all" ID="ID_98026410" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Maximum number of displayed nodes" STYLE_REF="Method" FOLDED="true" ID="ID_1905038356" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Maximum number of displayed nodes" STYLE_REF="Method" FOLDED="true" ID="ID_1905038356" CREATED="1455910904108" MODIFIED="1455910904108" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14924,433 +15200,500 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<node TEXT="20" ID="ID_1759313322">
+<node TEXT="20" ID="ID_1759313322" CREATED="1455910904108" MODIFIED="1455910904108">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Charset" STYLE_REF="Method" FOLDED="true" ID="ID_884107518">
-<node TEXT="Default" ID="ID_198865739">
+<node TEXT="Charset" STYLE_REF="Method" FOLDED="true" ID="ID_884107518" CREATED="1455910904109" MODIFIED="1455910904109">
+<node TEXT="Default" ID="ID_198865739" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="..." ID="ID_1437522671">
+<node TEXT="..." ID="ID_1437522671" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Load" ID="ID_950384750">
+<node TEXT="" ID="ID_838837218" CREATED="1455910904153" MODIFIED="1455910904153">
+<hook NAME="SummaryNode"/>
+<node TEXT="Load" ID="ID_950384750" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Links" STYLE_REF="Method" FOLDED="true" ID="ID_82833119">
-<node TEXT="Relative" ID="ID_1185657954">
+</node>
+<node TEXT="" ID="ID_1935235685" CREATED="1455910904153" MODIFIED="1455910904153">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Links" STYLE_REF="Method" FOLDED="true" ID="ID_82833119" CREATED="1455910904109" MODIFIED="1455910904109">
+<node TEXT="Relative" ID="ID_1185657954" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Absolute" ID="ID_252889669">
+<node TEXT="Absolute" ID="ID_252889669" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Hyperlink Types" ID="ID_1309284534">
+<node TEXT="" ID="ID_1619514132" CREATED="1455910904153" MODIFIED="1455910904153">
+<hook NAME="SummaryNode"/>
+<node TEXT="Hyperlink Types" ID="ID_1309284534" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Check for updates on program start" ID="ID_348083728">
+</node>
+<node TEXT="" ID="ID_966375940" CREATED="1455910904153" MODIFIED="1455910904153">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Check for updates on program start" ID="ID_348083728" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Program Updates" ID="ID_1155437887">
+<node TEXT="" ID="ID_1324281658" CREATED="1455910904153" MODIFIED="1455910904153">
+<hook NAME="SummaryNode"/>
+<node TEXT="Program Updates" ID="ID_1155437887" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Policy" STYLE_REF="Method" FOLDED="true" ID="ID_938224301">
-<node TEXT="Show report dialog" ID="ID_1017882911">
+</node>
+<node TEXT="" ID="ID_1789491795" CREATED="1455910904154" MODIFIED="1455910904154">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Policy" STYLE_REF="Method" FOLDED="true" ID="ID_938224301" CREATED="1455910904109" MODIFIED="1455910904109">
+<node TEXT="Show report dialog" ID="ID_1017882911" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Always send" ID="ID_920549965">
+<node TEXT="Always send" ID="ID_920549965" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Never send" ID="ID_1237652835">
+<node TEXT="Never send" ID="ID_1237652835" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Automatic bug report" ID="ID_849413397">
+<node TEXT="" ID="ID_65485115" CREATED="1455910904154" MODIFIED="1455910904154">
+<hook NAME="SummaryNode"/>
+<node TEXT="Automatic bug report" ID="ID_849413397" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
</node>
-<node TEXT="Appearance" FOLDED="true" ID="ID_186670407" COLOR="#000000">
+</node>
+<node TEXT="Appearance" FOLDED="true" ID="ID_186670407" CREATED="1455910904109" MODIFIED="1455910904109" COLOR="#000000">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="Look and feel" STYLE_REF="Method" FOLDED="true" ID="ID_702879709">
-<node TEXT="Default" ID="ID_1366474327">
+<node TEXT="" ID="ID_1898548490" CREATED="1455910904154" MODIFIED="1455910904154">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Look and feel" STYLE_REF="Method" FOLDED="true" ID="ID_702879709" CREATED="1455910904109" MODIFIED="1455910904109">
+<node TEXT="Default" ID="ID_1366474327" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Nimbus" ID="ID_801561072">
+<node TEXT="Nimbus" ID="ID_801561072" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Metal" ID="ID_1239129408">
+<node TEXT="Metal" ID="ID_1239129408" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="CDE/Motiv" ID="ID_1852646607">
+<node TEXT="CDE/Motiv" ID="ID_1852646607" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Windows" ID="ID_1713648658">
+<node TEXT="Windows" ID="ID_1713648658" CREATED="1455910904109" MODIFIED="1455910904109">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Windows classic" ID="ID_850989941">
+<node TEXT="Windows classic" ID="ID_850989941" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Apply system screen resolution default" STYLE_REF="IsChecked" ID="ID_719531600"/>
-<node TEXT="User defined screen resolution (dpi)" STYLE_REF="Method" FOLDED="true" ID="ID_1436875119">
-<node TEXT="96" STYLE_REF="OptionalValue" ID="ID_1116758038"/>
+<node TEXT="Apply system screen resolution default" STYLE_REF="IsChecked" ID="ID_719531600" CREATED="1455910904110" MODIFIED="1455910904110"/>
+<node TEXT="User defined screen resolution (dpi)" STYLE_REF="Method" FOLDED="true" ID="ID_1436875119" CREATED="1455910904110" MODIFIED="1455910904110">
+<node TEXT="96" STYLE_REF="OptionalValue" ID="ID_1116758038" CREATED="1455910904110" MODIFIED="1455910904110"/>
</node>
-<node TEXT="Use Tabs" ID="ID_678230606">
+<node TEXT="Use Tabs" ID="ID_678230606" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Use default font for notes too" ID="ID_1971832225">
+<node TEXT="Use default font for notes too" ID="ID_1971832225" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Remove top margin for notes" ID="ID_136257105">
+<node TEXT="Remove top margin for notes" ID="ID_136257105" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Look and feel" ID="ID_1413754050">
+<node TEXT="" ID="ID_1938808407" CREATED="1455910904154" MODIFIED="1455910904154">
+<hook NAME="SummaryNode"/>
+<node TEXT="Look and feel" ID="ID_1413754050" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Display node ID" ID="ID_1626584260">
+</node>
+<node TEXT="" ID="ID_357212815" CREATED="1455910904154" MODIFIED="1455910904154">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Display node ID" ID="ID_1626584260" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Status line" ID="ID_781487286">
+<node TEXT="" ID="ID_1545559953" CREATED="1455910904154" MODIFIED="1455910904154">
+<hook NAME="SummaryNode"/>
+<node TEXT="Status line" ID="ID_781487286" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Revision Color" STYLE_REF="Method" FOLDED="true" ID="ID_665414546">
-<node TEXT="Yellow background" ID="ID_17029124">
+</node>
+<node TEXT="" ID="ID_1119777363" CREATED="1455910904154" MODIFIED="1455910904154">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Revision Color" STYLE_REF="Method" FOLDED="true" ID="ID_665414546" CREATED="1455910904110" MODIFIED="1455910904110">
+<node TEXT="Yellow background" ID="ID_17029124" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="White background for printing" ID="ID_1915067515">
+<node TEXT="White background for printing" ID="ID_1915067515" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Standard Cloud Color" STYLE_REF="Method" FOLDED="true" ID="ID_749503390">
-<node TEXT="#f0f0f0" ID="ID_327342349">
+<node TEXT="Standard Cloud Color" STYLE_REF="Method" FOLDED="true" ID="ID_749503390" CREATED="1455910904110" MODIFIED="1455910904110">
+<node TEXT="#f0f0f0" ID="ID_327342349" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Default Colors" ID="ID_415228347">
+<node TEXT="" ID="ID_342180989" CREATED="1455910904154" MODIFIED="1455910904154">
+<hook NAME="SummaryNode"/>
+<node TEXT="Default Colors" ID="ID_415228347" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Display Selected Nodes in Bubbles" ID="ID_1439588791">
+</node>
+<node TEXT="" ID="ID_1790330010" CREATED="1455910904155" MODIFIED="1455910904155">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Display Selected Nodes in Bubbles" ID="ID_1439588791" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Selected Node Bubble Color" STYLE_REF="Method" FOLDED="true" ID="ID_224972929" LINK="#ID_922308916">
-<node TEXT="#002080" ID="ID_1345958852">
+<node TEXT="Selected Node Bubble Color" STYLE_REF="Method" FOLDED="true" ID="ID_224972929" CREATED="1455910904110" MODIFIED="1455910904110" LINK="#ID_922308916">
+<node TEXT="#002080" ID="ID_1345958852" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Standard Selected Node Color" STYLE_REF="Method" FOLDED="true" ID="ID_465580103">
-<node TEXT="#d2d2d2" ID="ID_1819028753">
+<node TEXT="Standard Selected Node Color" STYLE_REF="Method" FOLDED="true" ID="ID_465580103" CREATED="1455910904110" MODIFIED="1455910904110">
+<node TEXT="#d2d2d2" ID="ID_1819028753" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Selection Colors" ID="ID_1053593738">
+<node TEXT="" ID="ID_11949005" CREATED="1455910904155" MODIFIED="1455910904155">
+<hook NAME="SummaryNode"/>
+<node TEXT="Selection Colors" ID="ID_1053593738" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Edges start from one point at root node" STYLE_REF="Method" ID="ID_1368491675"/>
-<node TEXT="Root node appearance" ID="ID_329983622">
+</node>
+<node TEXT="" ID="ID_521331504" CREATED="1455910904155" MODIFIED="1455910904155">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Edges start from one point at root node" STYLE_REF="Method" ID="ID_1368491675" CREATED="1455910904110" MODIFIED="1455910904110"/>
+<node TEXT="" ID="ID_338235825" CREATED="1455910904155" MODIFIED="1455910904155">
+<hook NAME="SummaryNode"/>
+<node TEXT="Root node appearance" ID="ID_329983622" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Antialias" STYLE_REF="Method" FOLDED="true" ID="ID_1542458909">
-<node TEXT="Antialias Edges" ID="ID_1654348959">
+</node>
+<node TEXT="Antialias" STYLE_REF="Method" FOLDED="true" ID="ID_1542458909" CREATED="1455910904110" MODIFIED="1455910904110">
+<node TEXT="" ID="ID_1324958602" CREATED="1455910904155" MODIFIED="1455910904155">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Antialias Edges" ID="ID_1654348959" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Antialias all" ID="ID_627671109">
+<node TEXT="Antialias all" ID="ID_627671109" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="No Antialias" ID="ID_1212369653">
+<node TEXT="No Antialias" ID="ID_1212369653" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Antialias" ID="ID_1408904285">
+<node TEXT="" ID="ID_123431598" CREATED="1455910904155" MODIFIED="1455910904155">
<hook NAME="SummaryNode"/>
+<node TEXT="Antialias" ID="ID_1408904285" CREATED="1455910904110" MODIFIED="1455910904110">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
</node>
</node>
-<node TEXT="Max shortened node length" STYLE_REF="Method" FOLDED="true" ID="ID_1747043647">
+</node>
+<node TEXT="" ID="ID_1291818587" CREATED="1455910904156" MODIFIED="1455910904156">
<hook NAME="FirstGroupNode"/>
-<node TEXT="100" ID="ID_602426240">
+</node>
+<node TEXT="Max shortened node length" STYLE_REF="Method" FOLDED="true" ID="ID_1747043647" CREATED="1455910904110" MODIFIED="1455910904110">
+<node TEXT="100" ID="ID_602426240" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Max Node Width" STYLE_REF="Method" FOLDED="true" ID="ID_1131898915">
-<node TEXT="600" ID="ID_1544215822">
+<node TEXT="Max Node Width" STYLE_REF="Method" FOLDED="true" ID="ID_1131898915" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="600" ID="ID_1544215822" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ToolTip Width" STYLE_REF="Method" FOLDED="true" ID="ID_215853027">
+<node TEXT="ToolTip Width" STYLE_REF="Method" FOLDED="true" ID="ID_215853027" CREATED="1455910904111" MODIFIED="1455910904111">
<attribute NAME="Chapter" VALUE="1"/>
-<node TEXT="600" ID="ID_1670353099">
+<node TEXT="600" ID="ID_1670353099" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Size Limits" ID="ID_1349141635">
+<node TEXT="" ID="ID_1588083734" CREATED="1455910904156" MODIFIED="1455910904156">
+<hook NAME="SummaryNode"/>
+<node TEXT="Size Limits" ID="ID_1349141635" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="1,8"/>
</node>
-<node TEXT="Standard Link Color" STYLE_REF="Method" FOLDED="true" ID="ID_1272643299">
-<node TEXT="#000000" ID="ID_1523516109">
+</node>
+<node TEXT="" ID="ID_1854046446" CREATED="1455910904156" MODIFIED="1455910904156">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Standard Link Color" STYLE_REF="Method" FOLDED="true" ID="ID_1272643299" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="#000000" ID="ID_1523516109" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Opacity" STYLE_REF="Method" FOLDED="true" ID="ID_1391515369">
-<node TEXT="80" ID="ID_1305662372">
+<node TEXT="Opacity" STYLE_REF="Method" FOLDED="true" ID="ID_1391515369" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="80" ID="ID_1305662372" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Connector shapes" STYLE_REF="Method" FOLDED="true" ID="ID_266926804">
-<node TEXT="Curve" ID="ID_53878188">
+<node TEXT="Connector shapes" STYLE_REF="Method" FOLDED="true" ID="ID_266926804" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="Curve" ID="ID_53878188" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Line" ID="ID_210394121">
+<node TEXT="Line" ID="ID_210394121" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Linear path" ID="ID_972235482">
+<node TEXT="Linear path" ID="ID_972235482" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Simulate edge" ID="ID_441814953">
+<node TEXT="Simulate edge" ID="ID_441814953" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Width [Connector width]" STYLE_REF="Method" FOLDED="true" ID="ID_1481643722">
-<node TEXT="2" ID="ID_22643760">
+<node TEXT="Width [Connector width]" STYLE_REF="Method" FOLDED="true" ID="ID_1481643722" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="2" ID="ID_22643760" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Font Family [Connector Font Family]" STYLE_REF="Method" FOLDED="true" ID="ID_1221903920">
-<node TEXT="SansSerif" ID="ID_1484575894">
+<node TEXT="Font Family [Connector Font Family]" STYLE_REF="Method" FOLDED="true" ID="ID_1221903920" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="SansSerif" ID="ID_1484575894" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Font Size [Connector Font Size]" STYLE_REF="Method" FOLDED="true" ID="ID_728681381">
-<node TEXT="12" ID="ID_589330080">
+<node TEXT="Font Size [Connector Font Size]" STYLE_REF="Method" FOLDED="true" ID="ID_728681381" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="12" ID="ID_589330080" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Connectors" ID="ID_1984458992">
+<node TEXT="" ID="ID_534170068" CREATED="1455910904156" MODIFIED="1455910904156">
+<hook NAME="SummaryNode"/>
+<node TEXT="Connectors" ID="ID_1984458992" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Buttons at the top" ID="ID_1376964587">
+</node>
+<node TEXT="" ID="ID_860180168" CREATED="1455910904156" MODIFIED="1455910904156">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Buttons at the top" ID="ID_1376964587" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Position Window Below Node" ID="ID_1576279776">
+<node TEXT="Position Window Below Node" ID="ID_1576279776" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Min Default Window Height" STYLE_REF="Method" FOLDED="true" ID="ID_1734781250">
-<node TEXT="150" ID="ID_1551290999">
+<node TEXT="Min Default Window Height" STYLE_REF="Method" FOLDED="true" ID="ID_1734781250" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="150" ID="ID_1551290999" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Max Default Window Height" STYLE_REF="Method" FOLDED="true" ID="ID_720944351">
-<node TEXT="600" ID="ID_1973666685">
+<node TEXT="Max Default Window Height" STYLE_REF="Method" FOLDED="true" ID="ID_720944351" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="600" ID="ID_1973666685" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Min Default Window Width" STYLE_REF="Method" FOLDED="true" ID="ID_741939779">
-<node TEXT="400" ID="ID_164780892">
+<node TEXT="Min Default Window Width" STYLE_REF="Method" FOLDED="true" ID="ID_741939779" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="400" ID="ID_164780892" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Max Default Window Width" STYLE_REF="Method" FOLDED="true" ID="ID_848971421">
-<node TEXT="900" ID="ID_1286106720">
+<node TEXT="Max Default Window Width" STYLE_REF="Method" FOLDED="true" ID="ID_848971421" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="900" ID="ID_1286106720" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Edit Long Node Window" ID="ID_991611253">
+<node TEXT="" ID="ID_964837637" CREATED="1455910904157" MODIFIED="1455910904157">
+<hook NAME="SummaryNode"/>
+<node TEXT="Edit Long Node Window" ID="ID_991611253" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="vertical distance" STYLE_REF="Method" FOLDED="true" ID="ID_1935836042">
-<node TEXT="5" ID="ID_1567487763">
+</node>
+<node TEXT="" ID="ID_1647595788" CREATED="1455910904157" MODIFIED="1455910904157">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="vertical distance" STYLE_REF="Method" FOLDED="true" ID="ID_1935836042" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="5" ID="ID_1567487763" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="horizontal distance" STYLE_REF="Method" FOLDED="true" ID="ID_1853135324">
-<node TEXT="15" ID="ID_1756020932">
+<node TEXT="horizontal distance" STYLE_REF="Method" FOLDED="true" ID="ID_1853135324" CREATED="1455910904111" MODIFIED="1455910904111">
+<node TEXT="15" ID="ID_1756020932" CREATED="1455910904111" MODIFIED="1455910904111">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Outline view" ID="ID_1466344690">
+<node TEXT="" ID="ID_174985038" CREATED="1455910904157" MODIFIED="1455910904157">
+<hook NAME="SummaryNode"/>
+<node TEXT="Outline view" ID="ID_1466344690" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Structured icon toolbar" ID="ID_23497406">
+</node>
+<node TEXT="" ID="ID_1327902063" CREATED="1455910904157" MODIFIED="1455910904157">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Structured icon toolbar" ID="ID_23497406" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Don't show the note icons" ID="ID_635307234">
+<node TEXT="Don't show the note icons" ID="ID_635307234" CREATED="1455910904112" MODIFIED="1455910904112">
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Show/Hide Icon For Attributes" FOLDED="true" ID="ID_1228898153">
+<node TEXT="Show/Hide Icon For Attributes" FOLDED="true" ID="ID_1228898153" CREATED="1455910904112" MODIFIED="1455910904112">
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_1610400762" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1610400762" CREATED="1455910904112" MODIFIED="1455910904112" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -15377,23 +15720,25 @@ elements from the styles activated by conditions are copied.</pre>
</richcontent>
</node>
</node>
-<node TEXT="Icons" ID="ID_1409698218">
+<node TEXT="" ID="ID_498942117" CREATED="1455910904157" MODIFIED="1455910904157">
+<hook NAME="SummaryNode"/>
+<node TEXT="Icons" ID="ID_1409698218" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<attribute_layout NAME_WIDTH="46" VALUE_WIDTH="46"/>
+<attribute_layout NAME_WIDTH="34.5 pt" VALUE_WIDTH="34.5 pt"/>
<attribute NAME="Chapter" VALUE="3,8"/>
-<hook NAME="SummaryNode"/>
</node>
</node>
-<node TEXT="Keystrokes" FOLDED="true" ID="ID_190794373">
+</node>
+<node TEXT="Keystrokes" FOLDED="true" ID="ID_190794373" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="Controls hotkey short-cuts for various predefined icons." STYLE_REF="Method" ID="ID_699416889"/>
+<node TEXT="Controls hotkey short-cuts for various predefined icons." STYLE_REF="Method" ID="ID_699416889" CREATED="1455910904112" MODIFIED="1455910904112"/>
</node>
-<node TEXT="Behaviour" FOLDED="true" ID="ID_1251832106" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Behaviour" FOLDED="true" ID="ID_1251832106" CREATED="1455910904112" MODIFIED="1455910904112" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15410,132 +15755,142 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="Place new branches" STYLE_REF="Method" FOLDED="true" ID="ID_1206588336">
-<node TEXT="Last" ID="ID_1088081628">
+<node TEXT="" ID="ID_1647875963" CREATED="1455910904157" MODIFIED="1455910904157">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Place new branches" STYLE_REF="Method" FOLDED="true" ID="ID_1206588336" CREATED="1455910904112" MODIFIED="1455910904112">
+<node TEXT="Last" ID="ID_1088081628" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="First" ID="ID_460059219">
+<node TEXT="First" ID="ID_460059219" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Drag and drop" ID="ID_937187121">
+<node TEXT="Drag and drop" ID="ID_937187121" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Unfold node on paste" ID="ID_688415851">
+<node TEXT="Unfold node on paste" ID="ID_688415851" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Disable Cursor Move Paper" STYLE_REF="Method" ID="ID_673199843"/>
-<node TEXT="Folding Symbol Width" STYLE_REF="Method" FOLDED="true" ID="ID_162608451">
-<node TEXT="6" ID="ID_917162640">
+<node TEXT="Disable Cursor Move Paper" STYLE_REF="Method" ID="ID_673199843" CREATED="1455910904112" MODIFIED="1455910904112"/>
+<node TEXT="Folding Symbol Width" STYLE_REF="Method" FOLDED="true" ID="ID_162608451" CREATED="1455910904112" MODIFIED="1455910904112">
+<node TEXT="6" ID="ID_917162640" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Grid gap size" STYLE_REF="Method" FOLDED="true" ID="ID_1904922870">
-<node TEXT="10" ID="ID_230800785">
+<node TEXT="Grid gap size" STYLE_REF="Method" FOLDED="true" ID="ID_1904922870" CREATED="1455910904112" MODIFIED="1455910904112">
+<node TEXT="10" ID="ID_230800785" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Move note cursor to the end" ID="ID_16484668">
+<node TEXT="Move note cursor to the end" ID="ID_16484668" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="On Key Type" STYLE_REF="Method" FOLDED="true" ID="ID_870410939">
-<node TEXT="Overwrite content" ID="ID_906283996">
+<node TEXT="On Key Type" STYLE_REF="Method" FOLDED="true" ID="ID_870410939" CREATED="1455910904112" MODIFIED="1455910904112">
+<node TEXT="Overwrite content" ID="ID_906283996" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Do nothing" ID="ID_238703082">
+<node TEXT="Do nothing" ID="ID_238703082" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Add sibling node" ID="ID_1320405878">
+<node TEXT="Add sibling node" ID="ID_1320405878" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Add child node" ID="ID_1310255165">
+<node TEXT="Add child node" ID="ID_1310255165" CREATED="1455910904112" MODIFIED="1455910904112">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Behaviour" ID="ID_171435040">
-<attribute_layout NAME_WIDTH="73" VALUE_WIDTH="103"/>
+<node TEXT="" ID="ID_1081583553" CREATED="1455910904157" MODIFIED="1455910904157">
+<hook NAME="SummaryNode"/>
+<node TEXT="Behaviour" ID="ID_171435040" CREATED="1455910904112" MODIFIED="1455910904112">
+<attribute_layout NAME_WIDTH="54.75 pt" VALUE_WIDTH="77.25 pt"/>
<attribute NAME="Chapter" VALUE="8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Recognize input of number and date-time" FOLDED="true" ID="ID_1904729163">
+</node>
+<node TEXT="" ID="ID_893590823" CREATED="1455910904158" MODIFIED="1455910904158">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Recognize input of number and date-time" FOLDED="true" ID="ID_1904729163" CREATED="1455910904112" MODIFIED="1455910904112">
<attribute NAME="Chapter" VALUE="4"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
-<node TEXT="Check box" ID="ID_1209834896">
+<node TEXT="Check box" ID="ID_1209834896" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="Standard number format" STYLE_REF="Method" FOLDED="true" ID="ID_1543011178">
+<node TEXT="Standard number format" STYLE_REF="Method" FOLDED="true" ID="ID_1543011178" CREATED="1455910904113" MODIFIED="1455910904113">
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="#0.####" ID="ID_599272734">
+<node TEXT="#0.####" ID="ID_599272734" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="Standard date format" STYLE_REF="Method" FOLDED="true" ID="ID_1356962423">
+<node TEXT="Standard date format" STYLE_REF="Method" FOLDED="true" ID="ID_1356962423" CREATED="1455910904113" MODIFIED="1455910904113">
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="SHORT" ID="ID_1799574764">
+<node TEXT="SHORT" ID="ID_1799574764" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="Standard date-time format" STYLE_REF="Method" FOLDED="true" ID="ID_1291135490">
+<node TEXT="Standard date-time format" STYLE_REF="Method" FOLDED="true" ID="ID_1291135490" CREATED="1455910904113" MODIFIED="1455910904113">
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="SHORT,SHORT" ID="ID_1489062870">
+<node TEXT="SHORT,SHORT" ID="ID_1489062870" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="Locale for formats" STYLE_REF="Method" FOLDED="true" ID="ID_415722182">
+<node TEXT="Locale for formats" STYLE_REF="Method" FOLDED="true" ID="ID_415722182" CREATED="1455910904113" MODIFIED="1455910904113">
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="Automatic (List with languages)" ID="ID_1141766183">
+<node TEXT="Automatic (List with languages)" ID="ID_1141766183" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="Data formatting and parsing" ID="ID_1277533848" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="46" VALUE_WIDTH="149"/>
+<node TEXT="" ID="ID_1968306467" CREATED="1455910904158" MODIFIED="1455910904158">
+<hook NAME="SummaryNode"/>
+<node TEXT="Data formatting and parsing" ID="ID_1277533848" CREATED="1455910904113" MODIFIED="1455910904113" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="34.5 pt" VALUE_WIDTH="111.75 pt"/>
<attribute NAME="Chapter" VALUE="4,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -15558,268 +15913,318 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Display inline editor for all new nodes" ID="ID_1855645772">
+</node>
+<node TEXT="" ID="ID_600365773" CREATED="1455910904158" MODIFIED="1455910904158">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Display inline editor for all new nodes" ID="ID_1855645772" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Double click to edit" ID="ID_983797623">
+<node TEXT="Double click to edit" ID="ID_983797623" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Layout map during editing" ID="ID_1344543432">
+<node TEXT="Layout map during editing" ID="ID_1344543432" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Enter Confirms By Default" ID="ID_410727117">
+<node TEXT="Enter Confirms By Default" ID="ID_410727117" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="In-line node editor" ID="ID_411278174">
+<node TEXT="" ID="ID_676666673" CREATED="1455910904158" MODIFIED="1455910904158">
+<hook NAME="SummaryNode"/>
+<node TEXT="In-line node editor" ID="ID_411278174" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Use rich text for pasted nodes" STYLE_REF="Method" FOLDED="true" ID="ID_95105756">
-<node TEXT="Ask" ID="ID_1722707084">
+</node>
+<node TEXT="" ID="ID_1680923310" CREATED="1455910904158" MODIFIED="1455910904158">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Use rich text for pasted nodes" STYLE_REF="Method" FOLDED="true" ID="ID_95105756" CREATED="1455910904113" MODIFIED="1455910904113">
+<node TEXT="Ask" ID="ID_1722707084" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Yes" ID="ID_1038355271">
+<node TEXT="Yes" ID="ID_1038355271" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="No" ID="ID_1904863532">
+<node TEXT="No" ID="ID_1904863532" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Delete nodes without confirmation" ID="ID_815571706">
+<node TEXT="Delete nodes without confirmation" ID="ID_815571706" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Cut nodes without confirmations" ID="ID_32888474">
+<node TEXT="Cut nodes without confirmations" ID="ID_32888474" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Remove Notes without Question?" ID="ID_420987413">
+<node TEXT="Remove Notes without Question?" ID="ID_420987413" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Confirmations" ID="ID_1796859910">
+<node TEXT="" ID="ID_1202322318" CREATED="1455910904158" MODIFIED="1455910904158">
+<hook NAME="SummaryNode"/>
+<node TEXT="Confirmations" ID="ID_1796859910" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Compare as numbers" ID="ID_1349176298">
+</node>
+<node TEXT="" ID="ID_1935581544" CREATED="1455910904159" MODIFIED="1455910904159">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Compare as numbers" ID="ID_1349176298" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Search" ID="ID_692764704">
+<node TEXT="" ID="ID_1560758383" CREATED="1455910904159" MODIFIED="1455910904159">
<hook NAME="SummaryNode"/>
+<node TEXT="Search" ID="ID_692764704" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Selection Method" STYLE_REF="Method" FOLDED="true" ID="ID_1935087614">
-<node TEXT="Delayed" ID="ID_844433841">
+</node>
+<node TEXT="" ID="ID_1554922181" CREATED="1455910904159" MODIFIED="1455910904159">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Selection Method" STYLE_REF="Method" FOLDED="true" ID="ID_1935087614" CREATED="1455910904113" MODIFIED="1455910904113">
+<node TEXT="Delayed" ID="ID_844433841" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Direct" ID="ID_1150077727">
+<node TEXT="Direct" ID="ID_1150077727" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="By click" ID="ID_942709712">
+<node TEXT="By click" ID="ID_942709712" CREATED="1455910904113" MODIFIED="1455910904113">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Time For Delayed Selection" STYLE_REF="Method" FOLDED="true" ID="ID_326872031">
-<node TEXT="200" ID="ID_1264808816">
+<node TEXT="Time For Delayed Selection" STYLE_REF="Method" FOLDED="true" ID="ID_326872031" CREATED="1455910904113" MODIFIED="1455910904113">
+<node TEXT="200" ID="ID_1264808816" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Center selected nodes" ID="ID_266453260">
+<node TEXT="Center selected nodes" ID="ID_266453260" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Selection Method" ID="ID_459809249">
+<node TEXT="" ID="ID_1863717970" CREATED="1455910904159" MODIFIED="1455910904159">
+<hook NAME="SummaryNode"/>
+<node TEXT="Selection Method" ID="ID_459809249" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Speed [Speed Mouse wheel]" STYLE_REF="Method" FOLDED="true" ID="ID_1877269542">
-<node TEXT="80" ID="ID_324161648">
+</node>
+<node TEXT="" ID="ID_1987283318" CREATED="1455910904159" MODIFIED="1455910904159">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Speed [Speed Mouse wheel]" STYLE_REF="Method" FOLDED="true" ID="ID_1877269542" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="80" ID="ID_324161648" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Mouse wheel" ID="ID_897961065">
+<node TEXT="" ID="ID_831778591" CREATED="1455910904159" MODIFIED="1455910904159">
+<hook NAME="SummaryNode"/>
+<node TEXT="Mouse wheel" ID="ID_897961065" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Speed [Speed Scrollbar]" STYLE_REF="Method" FOLDED="true" ID="ID_337671733">
-<node TEXT="20" ID="ID_1492439142">
+</node>
+<node TEXT="" ID="ID_1025339512" CREATED="1455910904159" MODIFIED="1455910904159">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Speed [Speed Scrollbar]" STYLE_REF="Method" FOLDED="true" ID="ID_337671733" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="20" ID="ID_1492439142" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Scrollbar" ID="ID_1429616466">
+<node TEXT="" ID="ID_1097367888" CREATED="1455910904160" MODIFIED="1455910904160">
+<hook NAME="SummaryNode"/>
+<node TEXT="Scrollbar" ID="ID_1429616466" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Case sensitive" ID="ID_1576000342">
+</node>
+<node TEXT="" ID="ID_1841147378" CREATED="1455910904160" MODIFIED="1455910904160">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Case sensitive" ID="ID_1576000342" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Ignore all upper case words" ID="ID_60040035">
+<node TEXT="Ignore all upper case words" ID="ID_60040035" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Ignore capital letters at word begin" ID="ID_1838570041">
+<node TEXT="Ignore capital letters at word begin" ID="ID_1838570041" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Ignore words with numbers" ID="ID_1573148106">
+<node TEXT="Ignore words with numbers" ID="ID_1573148106" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Maximum count of suggestions in the dialog" STYLE_REF="Method" FOLDED="true" ID="ID_854267681">
-<node TEXT="15" ID="ID_1785386989">
+<node TEXT="Maximum count of suggestions in the dialog" STYLE_REF="Method" FOLDED="true" ID="ID_854267681" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="15" ID="ID_1785386989" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Maximum count of suggestions in the menu" STYLE_REF="Method" FOLDED="true" ID="ID_975657338">
-<node TEXT="15" ID="ID_223576174">
+<node TEXT="Maximum count of suggestions in the menu" STYLE_REF="Method" FOLDED="true" ID="ID_975657338" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="15" ID="ID_223576174" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Spell checker options" ID="ID_1152047272">
+<node TEXT="" ID="ID_1881340005" CREATED="1455910904160" MODIFIED="1455910904160">
+<hook NAME="SummaryNode"/>
+<node TEXT="Spell checker options" ID="ID_1152047272" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Display Tool Tips for Nodes" ID="ID_544704953">
+</node>
+<node TEXT="" ID="ID_1459369339" CREATED="1455910904160" MODIFIED="1455910904160">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Display Tool Tips for Nodes" ID="ID_544704953" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Initial delay,ms" STYLE_REF="Method" FOLDED="true" ID="ID_1443483058">
-<node TEXT="750" ID="ID_970116987">
+<node TEXT="Initial delay,ms" STYLE_REF="Method" FOLDED="true" ID="ID_1443483058" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="750" ID="ID_970116987" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Dismiss delay, ms" STYLE_REF="Method" FOLDED="true" ID="ID_108531934">
-<node TEXT="4,000" ID="ID_578810629">
+<node TEXT="Dismiss delay, ms" STYLE_REF="Method" FOLDED="true" ID="ID_108531934" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="4,000" ID="ID_578810629" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ReshowDelay, ms" STYLE_REF="Method" FOLDED="true" ID="ID_865138030">
-<node TEXT="500" ID="ID_1312285366">
+<node TEXT="ReshowDelay, ms" STYLE_REF="Method" FOLDED="true" ID="ID_865138030" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="500" ID="ID_1312285366" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Tooltip times" ID="ID_1779710506">
+<node TEXT="" ID="ID_1589522326" CREATED="1455910904160" MODIFIED="1455910904160">
+<hook NAME="SummaryNode"/>
+<node TEXT="Tooltip times" ID="ID_1779710506" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Extra width step" STYLE_REF="Method" FOLDED="true" ID="ID_1698327273">
-<node TEXT="80" ID="ID_980366954">
+</node>
+<node TEXT="" ID="ID_1103891171" CREATED="1455910904160" MODIFIED="1455910904160">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Extra width step" STYLE_REF="Method" FOLDED="true" ID="ID_1698327273" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="80" ID="ID_980366954" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Editor settings" ID="ID_433167342">
+<node TEXT="" ID="ID_1957823020" CREATED="1455910904160" MODIFIED="1455910904160">
+<hook NAME="SummaryNode"/>
+<node TEXT="Editor settings" ID="ID_433167342" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Undo levels" STYLE_REF="Method" FOLDED="true" ID="ID_1377721651">
-<node TEXT="100" ID="ID_933957391">
+</node>
+<node TEXT="" ID="ID_833803952" CREATED="1455910904161" MODIFIED="1455910904161">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Undo levels" STYLE_REF="Method" FOLDED="true" ID="ID_1377721651" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="100" ID="ID_933957391" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Undo" ID="ID_1615979770">
+<node TEXT="" ID="ID_750508736" CREATED="1455910904161" MODIFIED="1455910904161">
+<hook NAME="SummaryNode"/>
+<node TEXT="Undo" ID="ID_1615979770" CREATED="1455910904114" MODIFIED="1455910904114">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
</node>
-<node TEXT="HTML" FOLDED="true" ID="ID_857967913" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="HTML" FOLDED="true" ID="ID_857967913" CREATED="1455910904114" MODIFIED="1455910904114" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15836,62 +16241,70 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6,8"/>
-<node TEXT="Default Browser Command Windows NT" STYLE_REF="Method" FOLDED="true" ID="ID_285818766">
-<node TEXT="cmd.exe/c start"" "{0}"" ID="ID_1405736836">
+<node TEXT="" ID="ID_1496298150" CREATED="1455910904161" MODIFIED="1455910904161">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Default Browser Command Windows NT" STYLE_REF="Method" FOLDED="true" ID="ID_285818766" CREATED="1455910904114" MODIFIED="1455910904114">
+<node TEXT="cmd.exe/c start"" "{0}"" ID="ID_1405736836" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Default Browser Command Windows 9x" STYLE_REF="Method" FOLDED="true" ID="ID_1767258052">
-<node TEXT="command.com /c start "{0}"" ID="ID_1915045103">
+<node TEXT="Default Browser Command Windows 9x" STYLE_REF="Method" FOLDED="true" ID="ID_1767258052" CREATED="1455910904115" MODIFIED="1455910904115">
+<node TEXT="command.com /c start "{0}"" ID="ID_1915045103" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Default Browser Command Other OS" STYLE_REF="Method" FOLDED="true" ID="ID_1677430296">
-<node TEXT="xdg-open {0}" ID="ID_155698917">
+<node TEXT="Default Browser Command Other OS" STYLE_REF="Method" FOLDED="true" ID="ID_1677430296" CREATED="1455910904115" MODIFIED="1455910904115">
+<node TEXT="xdg-open {0}" ID="ID_155698917" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Default Browser Command MAC" STYLE_REF="Method" FOLDED="true" ID="ID_487716764">
-<node TEXT="open {0}" ID="ID_1454396895">
+<node TEXT="Default Browser Command MAC" STYLE_REF="Method" FOLDED="true" ID="ID_487716764" CREATED="1455910904115" MODIFIED="1455910904115">
+<node TEXT="open {0}" ID="ID_1454396895" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Browser" ID="ID_592493497">
+<node TEXT="" ID="ID_639615250" CREATED="1455910904161" MODIFIED="1455910904161">
+<hook NAME="SummaryNode"/>
+<node TEXT="Browser" ID="ID_592493497" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="Html Export Folding" STYLE_REF="Method" FOLDED="true" ID="ID_326052798">
+</node>
+<node TEXT="" ID="ID_609240774" CREATED="1455910904161" MODIFIED="1455910904161">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Html Export Folding" STYLE_REF="Method" FOLDED="true" ID="ID_326052798" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="6"/>
-<node TEXT="No Folding" ID="ID_734831498">
+<node TEXT="No Folding" ID="ID_734831498" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Fold Currently Folded" ID="ID_1029122886">
+<node TEXT="Fold Currently Folded" ID="ID_1029122886" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Fold all" ID="ID_1140314813">
+<node TEXT="Fold all" ID="ID_1140314813" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Based on Headings" ID="ID_1492749382">
+<node TEXT="Based on Headings" ID="ID_1492749382" CREATED="1455910904115" MODIFIED="1455910904115">
<icon BUILTIN="pencil"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
@@ -15899,135 +16312,152 @@ elements from the styles activated by conditions are copied.</pre>
<attribute NAME="Chapter" VALUE="6"/>
</node>
</node>
-<node TEXT="Export Icons In Html" ID="ID_700548117">
+<node TEXT="Export Icons In Html" ID="ID_700548117" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="6"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="HTML Export" ID="ID_842620377">
+<node TEXT="" ID="ID_1840744426" CREATED="1455910904161" MODIFIED="1455910904161">
+<hook NAME="SummaryNode"/>
+<node TEXT="HTML Export" ID="ID_842620377" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="6,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Import HTML as node structure" ID="ID_1711300863">
+</node>
+<node TEXT="" ID="ID_1679410787" CREATED="1455910904161" MODIFIED="1455910904161">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Import HTML as node structure" ID="ID_1711300863" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="HTML Import" ID="ID_1620307568">
+<node TEXT="" ID="ID_1472821499" CREATED="1455910904161" MODIFIED="1455910904161">
+<hook NAME="SummaryNode"/>
+<node TEXT="HTML Import" ID="ID_1620307568" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="6,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
</node>
-<node TEXT="Plugins" FOLDED="true" ID="ID_740727461">
+</node>
+<node TEXT="Plugins" FOLDED="true" ID="ID_740727461" CREATED="1455910904115" MODIFIED="1455910904115">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="7,8"/>
-<node TEXT="Disable formula evaluation cache" ID="ID_1486266663">
+<node TEXT="" ID="ID_135558736" CREATED="1455910904162" MODIFIED="1455910904162">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Disable formula evaluation cache" ID="ID_1486266663" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Disable formula evaluation" ID="ID_713879634">
+<node TEXT="Disable formula evaluation" ID="ID_713879634" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Don't mark formulas with a border" ID="ID_1293139407">
+<node TEXT="Don't mark formulas with a border" ID="ID_1293139407" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Formulas" ID="ID_169365773">
+<node TEXT="" ID="ID_849560482" CREATED="1455910904162" MODIFIED="1455910904162">
+<hook NAME="SummaryNode"/>
+<node TEXT="Formulas" ID="ID_169365773" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="7,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="Script execution enabled" FOLDED="true" ID="ID_1977472596">
+</node>
+<node TEXT="" ID="ID_1445551121" CREATED="1455910904162" MODIFIED="1455910904162">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Script execution enabled" FOLDED="true" ID="ID_1977472596" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
-<node TEXT="Enable for Formula" LOCALIZED_STYLE_REF="styles.important" ID="ID_1258843720">
+<node TEXT="Enable for Formula" LOCALIZED_STYLE_REF="styles.important" ID="ID_1258843720" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="7"/>
</node>
</node>
-<node TEXT="Permit File/Read Operations" ID="ID_881249705">
+<node TEXT="Permit File/Read Operations" ID="ID_881249705" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Permit File/Write operations" ID="ID_905270948">
+<node TEXT="Permit File/Write operations" ID="ID_905270948" CREATED="1455910904115" MODIFIED="1455910904115">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Permit Network Operations" ID="ID_1355620121">
+<node TEXT="Permit Network Operations" ID="ID_1355620121" CREATED="1455910904116" MODIFIED="1455910904116">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Permit to Execute other Applications" ID="ID_1365136531">
+<node TEXT="Permit to Execute other Applications" ID="ID_1365136531" CREATED="1455910904116" MODIFIED="1455910904116">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Trust signed scripts" STYLE_REF="IsChecked" ID="ID_1412203400">
+<node TEXT="Trust signed scripts" STYLE_REF="IsChecked" ID="ID_1412203400" CREATED="1455910904116" MODIFIED="1455910904116">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Optional User Key Alias for Signing" STYLE_REF="Method" ID="ID_1319215468">
+<node TEXT="Optional User Key Alias for Signing" STYLE_REF="Method" ID="ID_1319215468" CREATED="1455910904116" MODIFIED="1455910904116">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Script search path" STYLE_REF="Method" FOLDED="true" ID="ID_1885113964">
+<node TEXT="Script search path" STYLE_REF="Method" FOLDED="true" ID="ID_1885113964" CREATED="1455910904116" MODIFIED="1455910904116">
<attribute NAME="Chapter" VALUE="7"/>
-<node TEXT="scripts" ID="ID_1078878417">
+<node TEXT="scripts" ID="ID_1078878417" CREATED="1455910904116" MODIFIED="1455910904116">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="7"/>
</node>
</node>
-<node TEXT="Script classpath" STYLE_REF="Method" ID="ID_1018193900">
+<node TEXT="Script classpath" STYLE_REF="Method" ID="ID_1018193900" CREATED="1455910904116" MODIFIED="1455910904116">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Scripting" ID="ID_1528894906">
+<node TEXT="" ID="ID_926180865" CREATED="1455910904162" MODIFIED="1455910904162">
+<hook NAME="SummaryNode"/>
+<node TEXT="Scripting" ID="ID_1528894906" CREATED="1455910904116" MODIFIED="1455910904116">
<attribute NAME="Chapter" VALUE="7,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
</node>
</node>
</node>
-<node TEXT="Maps" FOLDED="true" ID="ID_1279811672" TEXT_SHORTENED="true" MIN_WIDTH="60">
+</node>
+<node TEXT="Maps" FOLDED="true" ID="ID_1279811672" CREATED="1455910904116" MODIFIED="1455910904116" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
@@ -16045,7 +16475,10 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<node TEXT="Mind map editor" ID="ID_327363055" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1377779589" CREATED="1455910904162" MODIFIED="1455910904162">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Mind map editor" ID="ID_327363055" CREATED="1455910904116" MODIFIED="1455910904116" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16063,7 +16496,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Map browser" ID="ID_524078813" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Map browser" ID="ID_524078813" CREATED="1455910904116" MODIFIED="1455910904116" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16080,18 +16513,20 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="File explorer" ID="ID_1982200889" TEXT_SHORTENED="true">
+<node TEXT="File explorer" ID="ID_1982200889" CREATED="1455910904116" MODIFIED="1455910904116" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="List with open maps" ID="ID_1685127239">
+<node TEXT="List with open maps" ID="ID_1685127239" CREATED="1455910904116" MODIFIED="1455910904116">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Publish mind map on web page" FOLDED="true" ID="ID_1615767068" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1207097590" CREATED="1455910904162" MODIFIED="1455910904162">
+<hook NAME="SummaryNode"/>
+<node TEXT="Publish mind map on web page" FOLDED="true" ID="ID_1615767068" CREATED="1455910904116" MODIFIED="1455910904116" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
@@ -16155,9 +16590,8 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="Embed mind map on wiki" ID="ID_590309579" LINK="http://freeplane.sourceforge.net/wiki/index.php/Embedding_mind_maps" TEXT_SHORTENED="true">
+<node TEXT="Embed mind map on wiki" ID="ID_590309579" CREATED="1455910904116" MODIFIED="1455910904116" LINK="http://freeplane.sourceforge.net/wiki/index.php/Embedding_mind_maps" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
@@ -16177,7 +16611,8 @@ elements from the styles activated by conditions are copied.</pre>
</node>
</node>
</node>
-<node TEXT="Help" FOLDED="true" ID="ID_278329781" TEXT_SHORTENED="true" MIN_WIDTH="60">
+</node>
+<node TEXT="Help" FOLDED="true" ID="ID_278329781" CREATED="1455910904116" MODIFIED="1455910904116" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
@@ -16195,7 +16630,7 @@ elements from the styles activated by conditions are copied.</pre>
</body>
</html>
</richcontent>
-<node TEXT="Check for updates" ID="ID_1783314150" TEXT_SHORTENED="true">
+<node TEXT="Check for updates" ID="ID_1783314150" CREATED="1455910904116" MODIFIED="1455910904116" TEXT_SHORTENED="true">
<icon BUILTIN="../update"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -16214,7 +16649,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Freeplane's home page" ID="ID_797729331" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Freeplane's home page" ID="ID_797729331" CREATED="1455910904117" MODIFIED="1455910904117" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16231,7 +16666,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Ask for help" FOLDED="true" ID="ID_1043826397" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Ask for help" FOLDED="true" ID="ID_1043826397" CREATED="1455910904117" MODIFIED="1455910904117" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16248,9 +16683,9 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
-<node TEXT="Troubleshooting" ID="ID_389902247" LINK="http://freeplane.sourceforge.net/wiki/index.php/Troubleshooting"/>
+<node TEXT="Troubleshooting" ID="ID_389902247" CREATED="1455910904118" MODIFIED="1455910904118" LINK="http://freeplane.sourceforge.net/wiki/index.php/Troubleshooting"/>
</node>
-<node TEXT="Report a bug" ID="ID_1404935411" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Report a bug" ID="ID_1404935411" CREATED="1455910904118" MODIFIED="1455910904118" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16267,7 +16702,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Request a feature" ID="ID_800979042" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Request a feature" ID="ID_800979042" CREATED="1455910904118" MODIFIED="1455910904118" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16284,7 +16719,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Licence" ID="ID_1881309718" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Licence" ID="ID_1881309718" CREATED="1455910904118" MODIFIED="1455910904118" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16301,7 +16736,7 @@ elements from the styles activated by conditions are copied.</pre>
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="About" ID="ID_1959296182" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="About" ID="ID_1959296182" CREATED="1455910904118" MODIFIED="1455910904118" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16319,7 +16754,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Tutorial" ID="ID_1373709444" TEXT_SHORTENED="true">
+<node TEXT="Tutorial" ID="ID_1373709444" CREATED="1455910904118" MODIFIED="1455910904118" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -16337,7 +16772,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Documentation" ID="ID_604224444" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Documentation" ID="ID_604224444" CREATED="1455910904118" MODIFIED="1455910904118" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16355,7 +16790,7 @@ elements from the styles activated by conditions are copied.</pre>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="Documentation Maps Online" ID="ID_566454554" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Documentation Maps Online" ID="ID_566454554" CREATED="1455910904118" MODIFIED="1455910904118" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16387,7 +16822,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Key reference" ID="ID_711310932" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Key reference" ID="ID_711310932" CREATED="1455910904118" MODIFIED="1455910904118" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16401,7 +16836,7 @@ elements from the styles activated by conditions are copied.</pre>
</html>
</richcontent>
</node>
-<node TEXT="Scripting API" ID="ID_1515623567" TEXT_SHORTENED="true">
+<node TEXT="Scripting API" ID="ID_1515623567" CREATED="1455910904118" MODIFIED="1455910904118" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -16421,17 +16856,17 @@ elements from the styles activated by conditions are copied.</pre>
</node>
</node>
</node>
-<node TEXT="Main New Features in 1.3.x" POSITION="right" ID="ID_438899606" STYLE="as_parent">
+<node TEXT="Main New Features in 1.3.x" FOLDED="true" POSITION="right" ID="ID_438899606" CREATED="1455910904128" MODIFIED="1455910904128" STYLE="as_parent">
<font SIZE="8" BOLD="true"/>
<edge STYLE="bezier" WIDTH="thin"/>
-<node TEXT="LaTeX "in core"" FOLDED="true" ID="ID_379700040" STYLE="as_parent">
+<node TEXT="LaTeX "in core"" FOLDED="true" ID="ID_379700040" CREATED="1455910904128" MODIFIED="1455910904128" STYLE="as_parent">
<edge STYLE="bezier"/>
-<node TEXT=""in core" means that LaTeX text/formulae can be in node content, no longer underneath node" ID="ID_732946929"/>
-<node TEXT="There are two ways to treat a node as LaTeX content:" ID="ID_671224372">
-<node TEXT="using a "\latex " prefix:" FOLDED="true" ID="ID_1360996420">
-<node TEXT="\latex my formula: $x_2=\frac{1}{2}$" ID="ID_1388189693"/>
+<node TEXT=""in core" means that LaTeX text/formulae can be in node content, no longer underneath node" ID="ID_732946929" CREATED="1455910904129" MODIFIED="1455910904129"/>
+<node TEXT="There are two ways to treat a node as LaTeX content:" ID="ID_671224372" CREATED="1455910904129" MODIFIED="1455910904129">
+<node TEXT="using a "\latex " prefix:" FOLDED="true" ID="ID_1360996420" CREATED="1455910904129" MODIFIED="1455910904129">
+<node TEXT="\latex my formula: $x_2=\frac{1}{2}$" ID="ID_1388189693" CREATED="1455910904129" MODIFIED="1455910904129"/>
</node>
-<node FOLDED="true" ID="ID_918479072"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_918479072" CREATED="1455910904129" MODIFIED="1455910904129"><richcontent TYPE="NODE">
<html>
<head>
@@ -16443,31 +16878,32 @@ elements from the styles activated by conditions are copied.</pre>
</p>
</body>
</html>
+
</richcontent>
-<node TEXT="my formula: $x_2=\frac{1}{2}$" ID="ID_1836098760" FORMAT="latexPatternFormat"/>
+<node TEXT="my formula: $x_2=\frac{1}{2}$" ID="ID_1836098760" CREATED="1455910904129" MODIFIED="1455910904129" FORMAT="latexPatternFormat"/>
</node>
</node>
-<node TEXT="The default mode is text mode, so you need to enclose formulae in $...$, \[...\] or $$...$$" ID="ID_1312795282"/>
-<node TEXT="Once a node is recognized as LaTeX, the editor offers LaTeX syntax highlighting
(this editor can be disabled in Prefs->Plugings->LaTeX->Disable LaTeX Syntax Highlighting Editor)" ID="ID_1129503143"/>
-<node TEXT="Automatic line breaks are supported" ID="ID_616831674"/>
-<node TEXT="The old way to include LaTeX (underneath nodes,
using Edit->Node extensions) is deprecated" ID="ID_698061781">
-<node TEXT="You can still edit those boxes" ID="ID_1906721955"/>
-<node TEXT="You cannot add new boxes" ID="ID_157775874"/>
+<node TEXT="The default mode is text mode, so you need to enclose formulae in $...$, \[...\] or $$...$$" ID="ID_1312795282" CREATED="1455910904129" MODIFIED="1455910904129"/>
+<node TEXT="Once a node is recognized as LaTeX, the editor offers LaTeX syntax highlighting
(this editor can be disabled in Prefs->Plugings->LaTeX->Disable LaTeX Syntax Highlighting Editor)" ID="ID_1129503143" CREATED="1455910904129" MODIFIED="1455910904129"/>
+<node TEXT="Automatic line breaks are supported" ID="ID_616831674" CREATED="1455910904129" MODIFIED="1455910904129"/>
+<node TEXT="The old way to include LaTeX (underneath nodes,
using Edit->Node extensions) is deprecated" ID="ID_698061781" CREATED="1455910904129" MODIFIED="1455910904129">
+<node TEXT="You can still edit those boxes" ID="ID_1906721955" CREATED="1455910904129" MODIFIED="1455910904129"/>
+<node TEXT="You cannot add new boxes" ID="ID_157775874" CREATED="1455910904129" MODIFIED="1455910904129"/>
</node>
-<node TEXT="See Wiki Page" STYLE_REF="Refine" ID="ID_29057214" LINK="http://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane">
+<node TEXT="See Wiki Page" STYLE_REF="Refine" ID="ID_29057214" CREATED="1455910904129" MODIFIED="1455910904129" LINK="http://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="See example Mind Map" STYLE_REF="Refine" ID="ID_1169480912" LINK="./Freeplane_LaTeX.mm">
+<node TEXT="See example Mind Map" STYLE_REF="Refine" ID="ID_1169480912" CREATED="1455910904129" MODIFIED="1455910904129" LINK="./Freeplane_LaTeX.mm">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT=""Docking Windows"" FOLDED="true" ID="ID_1557247598">
+<node TEXT=""Docking Windows"" FOLDED="true" ID="ID_1557247598" CREATED="1455910904129" MODIFIED="1455910904129">
<edge STYLE="bezier" WIDTH="thin"/>
-<node TEXT="The ability to position mind map windows independent of the parent window." ID="ID_307244103"/>
+<node TEXT="The ability to position mind map windows independent of the parent window." ID="ID_307244103" CREATED="1455910904129" MODIFIED="1455910904129"/>
</node>
-<node TEXT="Open Maps Integration" FOLDED="true" ID="ID_868486925">
+<node TEXT="Open Maps Integration" FOLDED="true" ID="ID_868486925" CREATED="1455910904129" MODIFIED="1455910904129">
<edge STYLE="bezier"/>
-<node ID="ID_1004924037"><richcontent TYPE="NODE">
+<node ID="ID_1004924037" CREATED="1455910904129" MODIFIED="1455910904129"><richcontent TYPE="NODE">
<html>
<head>
@@ -16479,14 +16915,15 @@ elements from the styles activated by conditions are copied.</pre>
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="See Wiki Page" STYLE_REF="Refine" ID="ID_371827729" LINK="http://freeplane.sourceforge.net/wiki/index.php/Open_Street_Map_Plugin">
+<node TEXT="See Wiki Page" STYLE_REF="Refine" ID="ID_371827729" CREATED="1455910904129" MODIFIED="1455910904129" LINK="http://freeplane.sourceforge.net/wiki/index.php/Open_Street_Map_Plugin">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="See here for more Features:" ID="ID_386969184">
-<node TEXT="http://freeplane.sourceforge.net/wiki/index.php/New_features_in_Freeplane_1.3.x" ID="ID_1179790948" LINK="http://freeplane.sourceforge.net/wiki/index.php/New_features_in_Freeplane_1.3.x"/>
+<node TEXT="See here for more Features:" ID="ID_386969184" CREATED="1455910904129" MODIFIED="1455910904129">
+<node TEXT="http://freeplane.sourceforge.net/wiki/index.php/New_features_in_Freeplane_1.3.x" ID="ID_1179790948" CREATED="1455910904129" MODIFIED="1455910904129" LINK="http://freeplane.sourceforge.net/wiki/index.php/New_features_in_Freeplane_1.3.x"/>
</node>
</node>
</node>
diff --git a/freeplane/doc/freeplaneApplications.mm b/freeplane/doc/freeplaneApplications.mm
deleted file mode 100644
index 1191d1a..0000000
--- a/freeplane/doc/freeplaneApplications.mm
+++ /dev/null
@@ -1,534 +0,0 @@
-<map version="freeplane 1.2.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node FOLDED="false" ID="ID_1723255651" CREATED="1283093380553" MODIFIED="1334842513243" VGAP="0" BACKGROUND_COLOR="#ffcc00"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p style="text-align: center">
- <font size="4"><a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Dashboard_for_GTD"><b>G</b></a></font><a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Dashboard_for_GTD">etting<font size="3"> </font><font size="4"><b>T</b></font>hings <font size="4"><b>D</b></font>one</a><br/>With<i> <b>Freeplane</b></i>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="MapStyle">
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600" MIN_WIDTH="1">
-<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important">
-<icon BUILTIN="yes"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="20"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="12"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<hook NAME="AutomaticEdgeColor" COUNTER="11"/>
-<edge STYLE="linear" WIDTH="1"/>
-<node TEXT="With less" POSITION="left" ID="ID_892290459" CREATED="1318451679082" MODIFIED="1334842547204" HGAP="181" VSHIFT="25" COLOR="#0000ff" BACKGROUND_COLOR="#33ff00" STYLE="bubble">
-<icon BUILTIN="idea"/>
-<font SIZE="12" BOLD="true" ITALIC="true"/>
-<hook NAME="FreeNode"/>
-<edge STYLE="hide_edge" COLOR="#007c00" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1129302195" STARTINCLINATION="132;0;" ENDINCLINATION="132;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-</node>
-<node POSITION="right" ID="ID_470539907" CREATED="1317967796222" MODIFIED="1336132515904" HGAP="21" VSHIFT="-195"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <img src="Images/doc/freeplaneApplications.png"/>
- </body>
-</html>
-</richcontent>
-<edge STYLE="hide_edge" COLOR="#ff00ff" WIDTH="3"/>
-<hook NAME="FreeNode"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</node>
-<node TEXT="Brainstorm" LOCALIZED_STYLE_REF="defaultstyle.floating" FOLDED="true" POSITION="right" ID="ID_747441325" CREATED="1317963460911" MODIFIED="1335089608016" HGAP="200" VSHIFT="-159">
-<icon BUILTIN="family"/>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Write <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Floating_nodes">digital post-its</a>
- </p>
- <p>
- and order them in a map.<br/>
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ff0000" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="16" FONT_FAMILY="Script MT Bold" DESTINATION="ID_1380673058" MIDDLE_LABEL="Think it" STARTINCLINATION="247;0;" ENDINCLINATION="204;-61;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-<node TEXT="central topic" ID="ID_1607807952" CREATED="1318450079927" MODIFIED="1318450164274">
-<edge STYLE="linear"/>
-<node TEXT="with" ID="ID_1232722180" CREATED="1318450103144" MODIFIED="1318450108729"/>
-<node TEXT="sub" ID="ID_431013725" CREATED="1318450109593" MODIFIED="1318450114539"/>
-<node TEXT="topics" ID="ID_870254490" CREATED="1318450115378" MODIFIED="1318450125281"/>
-<node TEXT="as" ID="ID_1119376813" CREATED="1318450217732" MODIFIED="1318450225079">
-<node TEXT="the" ID="ID_693432684" CREATED="1318450225084" MODIFIED="1318450230954">
-<node TEXT="flow" ID="ID_924717182" CREATED="1318450230959" MODIFIED="1318450235039">
-<node TEXT="goes" ID="ID_166052506" CREATED="1318450235044" MODIFIED="1318450238916"/>
-</node>
-</node>
-</node>
-</node>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1100351552" CREATED="1317963664772" MODIFIED="1319316372328" HGAP="-99" VSHIFT="-158"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Scripting">Program</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Sofisitaced script
- </p>
- <p>
- language for
- </p>
- <p>
- programing
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#007c00" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_803151767" CREATED="1317963651200" MODIFIED="1318588665665" HGAP="-203" VSHIFT="-110">
-<icon BUILTIN="password"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Vault">Protect</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Vault for private information
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#00007c" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1839755402" CREATED="1317963473454" MODIFIED="1335089373407" HGAP="316" VSHIFT="-106">
-<icon BUILTIN="xmag"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#SWOT_analysis">Analyze</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Show relations
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#0000ff" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1839755402" STARTINCLINATION="37;-27;" ENDINCLINATION="37;-27;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-</node>
-<node TEXT="=3+4" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_70607341" CREATED="1317967038914" MODIFIED="1318527253158" HGAP="-288" VSHIFT="-47">
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Formula">Calculate</a>
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ff0000" WIDTH="3"/>
-</node>
-<node TEXT="Do more" POSITION="right" ID="ID_1129302195" CREATED="1317972413136" MODIFIED="1334842539513" HGAP="-189" VSHIFT="-42" COLOR="#0000ff" BACKGROUND_COLOR="#33ff00" STYLE="bubble">
-<icon BUILTIN="wizard"/>
-<font SIZE="12" BOLD="true" ITALIC="true"/>
-<edge STYLE="hide_edge" COLOR="#7c7c00" WIDTH="3"/>
-<hook NAME="FreeNode"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1300937459" CREATED="1317963516276" MODIFIED="1335089284317" HGAP="396" VSHIFT="-39">
-<icon BUILTIN="attach"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Organize_your_collection">Organize</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#00ff00" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1300937459" STARTINCLINATION="95;0;" ENDINCLINATION="95;0;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1380673058" CREATED="1317963795719" MODIFIED="1318715649655" HGAP="443" VSHIFT="18"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial.mm#ID_887149959">Filter</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#7c007c" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_545955177" CREATED="1317963546352" MODIFIED="1318716312050" HGAP="-314" VSHIFT="40">
-<icon BUILTIN="calendar"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial.mm#ID_1047570728">Remember</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#00ffff" WIDTH="3"/>
-</node>
-<node TEXT="Do it" POSITION="right" ID="ID_692068107" CREATED="1317972888300" MODIFIED="1334842448376" COLOR="#ffffff" BACKGROUND_COLOR="#999900" STYLE="bubble" HGAP="0" VSHIFT="30">
-<icon BUILTIN="wizard"/>
-<font SIZE="12" BOLD="true"/>
-<edge STYLE="sharp_bezier" COLOR="#ff00ff" WIDTH="7"/>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="what" ID="ID_1911860200" CREATED="1318453489510" MODIFIED="1318512293822" HGAP="50" VSHIFT="-10">
-<edge WIDTH="1"/>
-</node>
-<node TEXT="you" ID="ID_885513842" CREATED="1318453440855" MODIFIED="1318512301950" HGAP="50" VSHIFT="-10">
-<edge WIDTH="1"/>
-</node>
-<node TEXT="want" ID="ID_1053481930" CREATED="1318453447023" MODIFIED="1318512304555" HGAP="50">
-<edge WIDTH="1"/>
-</node>
-</node>
-<node TEXT="your
way" POSITION="right" ID="ID_1333704057" CREATED="1317972906157" MODIFIED="1334842455474" HGAP="10" VSHIFT="10" COLOR="#ffffff" BACKGROUND_COLOR="#999900" STYLE="bubble">
-<font SIZE="12" BOLD="true"/>
-<edge STYLE="sharp_bezier" COLOR="#ff0000" WIDTH="5"/>
-<cloud COLOR="#ffff33" SHAPE="ARC"/>
-<node TEXT="the" ID="ID_1525382905" CREATED="1318453097317" MODIFIED="1318512372727">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-<node TEXT="way" ID="ID_1287102772" CREATED="1318453647991" MODIFIED="1318512428934">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-<node TEXT="you" ID="ID_1095910058" CREATED="1318453652398" MODIFIED="1318527651045">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-<node TEXT="want" ID="ID_135701980" CREATED="1318492240091" MODIFIED="1318527751080">
-<edge STYLE="horizontal" WIDTH="1"/>
-<font SIZE="12"/>
-</node>
-<node TEXT="it" ID="ID_1148165886" CREATED="1318527681673" MODIFIED="1318527747429" VSHIFT="-10">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-</node>
-<node TEXT="" POSITION="right" ID="ID_45669475" CREATED="1317972993975" MODIFIED="1318512559178">
-<icon BUILTIN="ksmiletris"/>
-<edge WIDTH="1"/>
-<hook NAME="SummaryNode"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_941087087" CREATED="1317963530737" MODIFIED="1335088176296" HGAP="-237" VSHIFT="98">
-<icon BUILTIN="group"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Meeting_support">Meet</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Simple and advanced meeting support
- </p>
- <p>
- for agenda planning, taking notes and
- </p>
- <p>
- keeping records.
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ff00ff" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0000ff" WIDTH="3" TRANSPARENCY="255" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1100351552" STARTINCLINATION="-217;-41;" ENDINCLINATION="-189;0;" STARTARROW="NONE" ENDARROW="NONE"/>
-<node ID="ID_184991784" CREATED="1317972712983" MODIFIED="1335088675136">
-<icon BUILTIN="smiley-oh"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/mapsOnline/?map=MeetingBeginner.mm">Beginner</a>
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-<node ID="ID_1404449457" CREATED="1317972719278" MODIFIED="1335088750262">
-<icon BUILTIN="ksmiletris"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/mapsOnline/?map=MeetingAdvanced.mm">Advanced</a>
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1510399467" CREATED="1317965217458" MODIFIED="1335089125284" HGAP="356" VSHIFT="111">
-<icon BUILTIN="list"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Writing_with_Freeplane">Write</a>
- </p>
- </body>
-</html>
-</richcontent>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Normal and scientific
- </p>
- <p>
- writing support
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#007c7c" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="4" TRANSPARENCY="255" FONT_SIZE="16" FONT_FAMILY="Britannic Bold" DESTINATION="ID_360719522" MIDDLE_LABEL="Share it" STARTINCLINATION="88;183;" ENDINCLINATION="-3;215;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_360719522" CREATED="1317966438145" MODIFIED="1335089993602" HGAP="-2" VSHIFT="149" LINK="menuitem:_$GettingStartedAction$0"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial.mm">Document</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Versatile support for efficient documenting.
- </p>
- <p>
- The Freeplane <a href="freeplaneTutorial.mm">Tutorial</a> is an example.
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#7c7c00" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1875337895" CREATED="1317967170441" MODIFIED="1320247625439" HGAP="324" VSHIFT="187"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial.mm#ID_1838680824">Style</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#0000ff" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1875337895" STARTINCLINATION="32;38;" ENDINCLINATION="32;38;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1583240168" CREATED="1317963552842" MODIFIED="1335088980275" HGAP="110" VSHIFT="208">
-<icon BUILTIN="male1"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Assignment_.26_Presentation">Learn</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Provide assigments
- </p>
- <p>
- and protected solutions
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ffff00" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1583240168" STARTINCLINATION="-9;57;" ENDINCLINATION="-9;57;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-<node TEXT="Present" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_501841034" CREATED="1317963565525" MODIFIED="1318589800951" HGAP="222" VSHIFT="221">
-<hook NAME="FreeNode"/>
-<edge COLOR="#7c0000" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0033" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_501841034" STARTINCLINATION="-1;65;" ENDINCLINATION="-1;65;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-</node>
-</map>
diff --git a/freeplane/doc/freeplaneApplications_ja.mm b/freeplane/doc/freeplaneApplications_ja.mm
deleted file mode 100644
index 7c40166..0000000
--- a/freeplane/doc/freeplaneApplications_ja.mm
+++ /dev/null
@@ -1,540 +0,0 @@
-<map version="freeplane 1.2.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node FOLDED="false" ID="ID_1723255651" CREATED="1349505091021" MODIFIED="1349505091021" VGAP="0" BACKGROUND_COLOR="#ffcc00"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p style="text-align: center">
- <b><i>Freeplane で </i></b>
- </p>
- <p style="text-align: center">
- <b><font size="4"><a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Dashboard_for_GTD">G</a></font></b><a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Dashboard_for_GTD">etting<font size="3"> </font><b><font size="4">T</font></b>hings <b><font size="4">D</font></b>one</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="MapStyle">
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600" MIN_WIDTH="1">
-<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important">
-<icon BUILTIN="yes"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="20"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="12"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<hook NAME="AutomaticEdgeColor" COUNTER="11"/>
-<edge STYLE="linear" WIDTH="1"/>
-<node TEXT="小さな労力で" POSITION="left" ID="ID_892290459" CREATED="1349505091036" MODIFIED="1349505091036" HGAP="181" VSHIFT="25" COLOR="#0000ff" BACKGROUND_COLOR="#33ff00" STYLE="bubble">
-<icon BUILTIN="idea"/>
-<font SIZE="12" BOLD="true" ITALIC="true"/>
-<hook NAME="FreeNode"/>
-<edge STYLE="hide_edge" COLOR="#007c00" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1129302195" STARTINCLINATION="132;0;" ENDINCLINATION="132;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-</node>
-<node POSITION="right" ID="ID_470539907" CREATED="1349505091036" MODIFIED="1349505091036" HGAP="21" VSHIFT="-195"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <img src="freeplaneApplications.png"/>
- </body>
-</html>
-</richcontent>
-<edge STYLE="hide_edge" COLOR="#ff00ff" WIDTH="3"/>
-<hook NAME="FreeNode"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</node>
-<node TEXT="ブレーンストーミング" LOCALIZED_STYLE_REF="defaultstyle.floating" FOLDED="true" POSITION="right" ID="ID_747441325" CREATED="1349505091052" MODIFIED="1349505091052" HGAP="200" VSHIFT="-159">
-<icon BUILTIN="family"/>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- まっさらの <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Floating_nodes">デジタルポストイット</a> をつくり、
- </p>
- <p>
- それらをマップ内で並べ替えます。<br/>
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ff0000" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="16" FONT_FAMILY="Script MT Bold" DESTINATION="ID_1380673058" MIDDLE_LABEL="考える!" STARTINCLINATION="254;12;" ENDINCLINATION="116;-53;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-<node TEXT="中心トピック" ID="ID_1607807952" CREATED="1349505091052" MODIFIED="1349505091052">
-<edge STYLE="linear"/>
-<node TEXT="付き" ID="ID_1232722180" CREATED="1349505091052" MODIFIED="1349505091052"/>
-<node TEXT="サブ" ID="ID_431013725" CREATED="1349505091052" MODIFIED="1349505091052"/>
-<node TEXT="トピックス" ID="ID_870254490" CREATED="1349505091052" MODIFIED="1349505091052"/>
-<node TEXT="思い" ID="ID_1119376813" CREATED="1349505091052" MODIFIED="1349505091052">
-<node TEXT="つく" ID="ID_693432684" CREATED="1349505091052" MODIFIED="1349505091052">
-<node TEXT="ままに" ID="ID_924717182" CREATED="1349505091052" MODIFIED="1349505091052">
-<node TEXT="進める" ID="ID_166052506" CREATED="1349505091052" MODIFIED="1349505091052"/>
-</node>
-</node>
-</node>
-</node>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1100351552" CREATED="1349505091052" MODIFIED="1349505091052" HGAP="-99" VSHIFT="-158"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Scripting">プログラミング</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- プログラミング用の洗練された
- </p>
- <p>
- スクリプト言語付きです。
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#007c00" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_803151767" CREATED="1349505091052" MODIFIED="1349505091052" HGAP="-203" VSHIFT="-110">
-<icon BUILTIN="password"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Vault">プロジェクト</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- 個人情報管理用の秘密
- </p>
- <p>
- 保管機能付きです。
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#00007c" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1839755402" CREATED="1349505091052" MODIFIED="1349505091052" HGAP="316" VSHIFT="-106">
-<icon BUILTIN="xmag"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#SWOT_analysis">分 析</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- 関係を視覚化します。
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#0000ff" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1839755402" STARTINCLINATION="37;-27;" ENDINCLINATION="37;-27;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-</node>
-<node TEXT="=3+4" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_70607341" CREATED="1349505091052" MODIFIED="1349505091052" HGAP="-288" VSHIFT="-47">
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Formula">計算する</a>
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ff0000" WIDTH="3"/>
-</node>
-<node TEXT="大きな成果を" POSITION="right" ID="ID_1129302195" CREATED="1349505091052" MODIFIED="1349505091052" HGAP="-189" VSHIFT="-42" COLOR="#0000ff" BACKGROUND_COLOR="#33ff00" STYLE="bubble">
-<icon BUILTIN="wizard"/>
-<font SIZE="12" BOLD="true" ITALIC="true"/>
-<edge STYLE="hide_edge" COLOR="#7c7c00" WIDTH="3"/>
-<hook NAME="FreeNode"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1300937459" CREATED="1349505091052" MODIFIED="1349505091052" HGAP="396" VSHIFT="-39">
-<icon BUILTIN="attach"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Organize_your_collection">整 理</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#00ff00" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1300937459" STARTINCLINATION="95;0;" ENDINCLINATION="95;0;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1380673058" CREATED="1349505091067" MODIFIED="1349505091067" HGAP="443" VSHIFT="18"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial_ja.mm#ID_887149959">フィルタ</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#7c007c" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_545955177" CREATED="1349505091067" MODIFIED="1349505091067" HGAP="-314" VSHIFT="40">
-<icon BUILTIN="calendar"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial_ja.mm#ID_1047570728">備 忘</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#00ffff" WIDTH="3"/>
-</node>
-<node TEXT="しましょう" POSITION="right" ID="ID_692068107" CREATED="1349505091067" MODIFIED="1349505091067" COLOR="#ffffff" BACKGROUND_COLOR="#999900" STYLE="bubble" HGAP="0" VSHIFT="30">
-<icon BUILTIN="wizard"/>
-<font SIZE="12" BOLD="true"/>
-<edge STYLE="sharp_bezier" COLOR="#ff00ff" WIDTH="7"/>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="あなたの" ID="ID_1911860200" CREATED="1349505091067" MODIFIED="1349505091067" HGAP="50" VSHIFT="-10">
-<edge WIDTH="1"/>
-</node>
-<node TEXT="したい" ID="ID_885513842" CREATED="1349505091067" MODIFIED="1349505091067" HGAP="50" VSHIFT="-10">
-<edge WIDTH="1"/>
-</node>
-<node TEXT="こと" ID="ID_1053481930" CREATED="1349505091067" MODIFIED="1349505091067" HGAP="50">
-<edge WIDTH="1"/>
-</node>
-</node>
-<node TEXT="あなた流で" POSITION="right" ID="ID_1333704057" CREATED="1349505091067" MODIFIED="1349505091067" HGAP="10" VSHIFT="10" COLOR="#ffffff" BACKGROUND_COLOR="#999900" STYLE="bubble">
-<font SIZE="12" BOLD="true"/>
-<edge STYLE="sharp_bezier" COLOR="#ff0000" WIDTH="5"/>
-<cloud COLOR="#ffff33" SHAPE="ARC"/>
-<node TEXT="あなたの" ID="ID_1525382905" CREATED="1349505091067" MODIFIED="1349505091067">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-<node TEXT="したい" ID="ID_1287102772" CREATED="1349505091067" MODIFIED="1349505091067">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-<node TEXT="ような" ID="ID_1095910058" CREATED="1349505091067" MODIFIED="1349505091067">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-<node TEXT="方法で" ID="ID_135701980" CREATED="1349505091067" MODIFIED="1349505091067">
-<edge STYLE="horizontal" WIDTH="1"/>
-<font SIZE="12"/>
-</node>
-<node TEXT="そのことを" ID="ID_1148165886" CREATED="1349505091067" MODIFIED="1349505091067" VSHIFT="-10">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-</node>
-<node TEXT="" POSITION="right" ID="ID_45669475" CREATED="1349505091067" MODIFIED="1349505091067">
-<icon BUILTIN="ksmiletris"/>
-<edge WIDTH="1"/>
-<hook NAME="SummaryNode"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_941087087" CREATED="1349505091067" MODIFIED="1349505091067" HGAP="-237" VSHIFT="98">
-<icon BUILTIN="group"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Meeting_support">会 議</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- 議事進行プランづくりやメモの作成、
- </p>
- <p>
- 議事録作成など、簡単なものから高度
- </p>
- <p>
- な機能まで会議を支援します。
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ff00ff" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0000ff" WIDTH="3" TRANSPARENCY="255" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1100351552" STARTINCLINATION="-217;-41;" ENDINCLINATION="-189;0;" STARTARROW="NONE" ENDARROW="NONE"/>
-<node ID="ID_184991784" CREATED="1349505091067" MODIFIED="1349505091067">
-<icon BUILTIN="smiley-oh"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/mapsOnline/?map=MeetingBeginner.mm">入 門</a>
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-<node ID="ID_1404449457" CREATED="1349505091067" MODIFIED="1349505091067">
-<icon BUILTIN="ksmiletris"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/mapsOnline/?map=MeetingAdvanced.mm">応 用</a>
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1510399467" CREATED="1349505091067" MODIFIED="1349505091067" HGAP="384" VSHIFT="103">
-<icon BUILTIN="list"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Writing_with_Freeplane">文章作成</a>
- </p>
- </body>
-</html>
-</richcontent>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- 普通の文章作成や科学論文
- </p>
- <p>
- の執筆を支援します。
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#007c7c" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="4" TRANSPARENCY="255" FONT_SIZE="16" FONT_FAMILY="Britannic Bold" DESTINATION="ID_360719522" MIDDLE_LABEL="共有する!" STARTINCLINATION="93;186;" ENDINCLINATION="-3;215;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_360719522" CREATED="1349505091067" MODIFIED="1349505091067" HGAP="-2" VSHIFT="149" LINK="menuitem:_$GettingStartedAction$0"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial_ja.mm">文書作成</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- 効率的な文書作成に向けて
- </p>
- <p>
- 様々な支援を行ないます。
- </p>
- <p>
- Freeplane <a href="freeplaneTutorial_ja.mm">チュートリアル</a><br/> が好い見本です。
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#7c7c00" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1875337895" CREATED="1349505091083" MODIFIED="1349505091083" HGAP="332" VSHIFT="187"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial_ja.mm#ID_1838680824">スタイル調整</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#0000ff" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1875337895" STARTINCLINATION="32;38;" ENDINCLINATION="32;38;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1583240168" CREATED="1349505091083" MODIFIED="1349505091083" HGAP="102" VSHIFT="208">
-<icon BUILTIN="male1"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Freeplane_Tutorial_Extensions#Assignment_.26_Presentation">学 習</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- 課題とあわせて、保護機能
- </p>
- <p>
- 付きの解答を用意します。
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ffff00" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1583240168" STARTINCLINATION="-13;55;" ENDINCLINATION="-13;55;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-<node TEXT="プレゼンテーション" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_501841034" CREATED="1349505091083" MODIFIED="1349505091083" HGAP="194" VSHIFT="217">
-<hook NAME="FreeNode"/>
-<edge COLOR="#7c0000" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0033" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_501841034" STARTINCLINATION="-1;65;" ENDINCLINATION="-1;65;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-</node>
-</map>
diff --git a/freeplane/doc/freeplaneApplications_nl.mm b/freeplane/doc/freeplaneApplications_nl.mm
deleted file mode 100644
index c3c2367..0000000
--- a/freeplane/doc/freeplaneApplications_nl.mm
+++ /dev/null
@@ -1,540 +0,0 @@
-<map version="freeplane 1.2.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node FOLDED="false" ID="ID_1723255651" CREATED="1283093380553" MODIFIED="1320853980757" VGAP="0" BACKGROUND_COLOR="#ffcc00"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p style="text-align: center">
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Dashboard_for_GTD"><font size="5"><b>D</b></font>ingen <font size="5"><b>G</b></font>edaan <font size="5"><b>K</b></font>rijgen</a><br/>Met<i> <b>Freeplane</b></i>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="MapStyle">
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600" MIN_WIDTH="1" FORMAT_AS_HYPERLINK="true">
-<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important">
-<icon BUILTIN="yes"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="20"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="12"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<hook NAME="AutomaticEdgeColor" COUNTER="2"/>
-<edge STYLE="linear" WIDTH="1"/>
-<node TEXT="Met minder" POSITION="left" ID="ID_892290459" CREATED="1318451679082" MODIFIED="1336121957827" HGAP="213" VSHIFT="30" COLOR="#0000ff" BACKGROUND_COLOR="#33ff00" STYLE="bubble">
-<icon BUILTIN="idea"/>
-<font SIZE="12" BOLD="true" ITALIC="true"/>
-<hook NAME="FreeNode"/>
-<edge STYLE="hide_edge" COLOR="#007c00" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1129302195" STARTINCLINATION="132;0;" ENDINCLINATION="132;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-</node>
-<node POSITION="right" ID="ID_470539907" CREATED="1317967796222" MODIFIED="1336132579445" HGAP="21" VSHIFT="-195"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <img src="Images/doc/freeplaneApplications.png"/>
- </body>
-</html>
-</richcontent>
-<edge STYLE="hide_edge" COLOR="#ff00ff" WIDTH="3"/>
-<hook NAME="FreeNode"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1100351552" CREATED="1317963664772" MODIFIED="1320854026933" HGAP="-99" VSHIFT="-168"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Scripting">Programmeren</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Krachtige script
- </p>
- <p>
- taal om in te
- </p>
- <p>
- programmeren
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#007c00" WIDTH="3"/>
-</node>
-<node TEXT="Brainstormen" LOCALIZED_STYLE_REF="defaultstyle.floating" FOLDED="true" POSITION="right" ID="ID_747441325" CREATED="1317963460911" MODIFIED="1336121273942" HGAP="200" VSHIFT="-159">
-<icon BUILTIN="family"/>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Scrijf zoals je denkt..
- </p>
- <p>
- De standaard mind map
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ff0000" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="16" FONT_FAMILY="Script MT Bold" DESTINATION="ID_1380673058" MIDDLE_LABEL="Bedenken" STARTINCLINATION="247;0;" ENDINCLINATION="148;-57;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-<node TEXT="central topic" ID="ID_1607807952" CREATED="1318450079927" MODIFIED="1318450164274">
-<edge STYLE="linear"/>
-<node TEXT="with" ID="ID_1232722180" CREATED="1318450103144" MODIFIED="1318450108729"/>
-<node TEXT="sub" ID="ID_431013725" CREATED="1318450109593" MODIFIED="1318450114539"/>
-<node TEXT="topics" ID="ID_870254490" CREATED="1318450115378" MODIFIED="1318450125281"/>
-<node TEXT="as" ID="ID_1119376813" CREATED="1318450217732" MODIFIED="1318450225079">
-<node TEXT="the" ID="ID_693432684" CREATED="1318450225084" MODIFIED="1318450230954">
-<node TEXT="flow" ID="ID_924717182" CREATED="1318450230959" MODIFIED="1318450235039">
-<node TEXT="goes" ID="ID_166052506" CREATED="1318450235044" MODIFIED="1318450238916"/>
-</node>
-</node>
-</node>
-</node>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_803151767" CREATED="1317963651200" MODIFIED="1320851935569" HGAP="-203" VSHIFT="-110">
-<icon BUILTIN="password"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Vault">Beveiligen</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Informatiekluis
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#00007c" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1839755402" CREATED="1317963473454" MODIFIED="1320854021021" HGAP="316" VSHIFT="-96">
-<icon BUILTIN="xmag"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#SWOT_analysis">Analyseren</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Toon relaties
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#0000ff" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1839755402" STARTINCLINATION="45;-33;" ENDINCLINATION="45;-33;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-</node>
-<node TEXT="=3+4" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_70607341" CREATED="1317967038914" MODIFIED="1320851972013" HGAP="-288" VSHIFT="-47">
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Formula">Berekenen</a>
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ff0000" WIDTH="3"/>
-</node>
-<node TEXT="Doe meer" POSITION="right" ID="ID_1129302195" CREATED="1317972413136" MODIFIED="1336120108668" HGAP="-189" VSHIFT="-42" COLOR="#0000ff" BACKGROUND_COLOR="#33ff00" STYLE="bubble">
-<icon BUILTIN="wizard"/>
-<font SIZE="12" BOLD="true" ITALIC="true"/>
-<edge STYLE="hide_edge" COLOR="#7c7c00" WIDTH="3"/>
-<hook NAME="FreeNode"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1300937459" CREATED="1317963516276" MODIFIED="1336120493295" HGAP="455" VSHIFT="-38">
-<icon BUILTIN="attach"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Organize_your_collection">Organiseren</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#00ff00" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1300937459" STARTINCLINATION="86;0;" ENDINCLINATION="86;0;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1380673058" CREATED="1317963795719" MODIFIED="1336121058473" HGAP="538" VSHIFT="29"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial.mm#ID_887149959">Filteren</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#7c007c" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_545955177" CREATED="1317963546352" MODIFIED="1320852032198" HGAP="-314" VSHIFT="40">
-<icon BUILTIN="calendar"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial.mm#ID_1047570728">Waarschuwen</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#00ffff" WIDTH="3"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Agenda functie
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1510399467" CREATED="1317965217458" MODIFIED="1336121090266" HGAP="484" VSHIFT="94">
-<icon BUILTIN="list"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Scientific_environment">Schrijven</a>
- </p>
- </body>
-</html>
-</richcontent>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Ondersteuning voor
- </p>
- <p>
- schrijven en weten-
- </p>
- <p>
- schappelijke referenties
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#007c7c" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="4" TRANSPARENCY="255" FONT_SIZE="14" FONT_FAMILY="Britannic Bold" DESTINATION="ID_360719522" MIDDLE_LABEL="Delen" STARTINCLINATION="28;230;" ENDINCLINATION="16;224;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-<node TEXT="Doe" POSITION="right" ID="ID_692068107" CREATED="1317972888300" MODIFIED="1336122192113" COLOR="#ffffff" BACKGROUND_COLOR="#999900" STYLE="bubble" HGAP="0" VSHIFT="30">
-<icon BUILTIN="wizard"/>
-<font SIZE="12" BOLD="true"/>
-<edge STYLE="sharp_bezier" COLOR="#ff00ff" WIDTH="7"/>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="wat" ID="ID_1911860200" CREATED="1318453489510" MODIFIED="1320852825774" HGAP="50" VSHIFT="-10">
-<edge WIDTH="1"/>
-</node>
-<node TEXT="je" ID="ID_885513842" CREATED="1318453440855" MODIFIED="1320852833795" HGAP="50" VSHIFT="-10">
-<edge WIDTH="1"/>
-</node>
-<node TEXT="wilt" ID="ID_1053481930" CREATED="1318453447023" MODIFIED="1320852841041" HGAP="50">
-<edge WIDTH="1"/>
-</node>
-</node>
-<node TEXT="Jouw
manier" POSITION="right" ID="ID_1333704057" CREATED="1317972906157" MODIFIED="1336122199991" HGAP="10" VSHIFT="10" COLOR="#ffffff" BACKGROUND_COLOR="#999900" STYLE="bubble">
-<font SIZE="12" BOLD="true"/>
-<edge STYLE="sharp_bezier" COLOR="#ff0000" WIDTH="5"/>
-<cloud COLOR="#ffff33" SHAPE="ARC"/>
-<node TEXT="op" ID="ID_1525382905" CREATED="1318453097317" MODIFIED="1320852886188">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-<node TEXT="de manier" ID="ID_1287102772" CREATED="1318453647991" MODIFIED="1320852922801">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-<node TEXT="die" ID="ID_1095910058" CREATED="1318453652398" MODIFIED="1320852896359">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-<node TEXT="jij" ID="ID_135701980" CREATED="1318492240091" MODIFIED="1320852900602">
-<edge STYLE="horizontal" WIDTH="1"/>
-<font SIZE="12"/>
-</node>
-<node TEXT="wilt" ID="ID_1148165886" CREATED="1318527681673" MODIFIED="1320852906889" VSHIFT="-10">
-<edge STYLE="horizontal" WIDTH="1"/>
-</node>
-</node>
-<node TEXT="" POSITION="right" ID="ID_742181469" CREATED="1336120997196" MODIFIED="1336121075649" HGAP="30">
-<icon BUILTIN="ksmiletris"/>
-<edge COLOR="#0000ff" WIDTH="3"/>
-<hook NAME="SummaryNode"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_941087087" CREATED="1317963530737" MODIFIED="1336120196745" HGAP="-237" VSHIFT="108">
-<icon BUILTIN="group"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#Meeting_support">Vergaderen</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Simple and advanced meeting support
- </p>
- <p>
- for agenda planning, taking notes and
- </p>
- <p>
- keeping records.
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ff00ff" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0000ff" WIDTH="3" TRANSPARENCY="255" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1100351552" STARTINCLINATION="-209;-29;" ENDINCLINATION="-189;0;" STARTARROW="NONE" ENDARROW="NONE"/>
-<node ID="ID_184991784" CREATED="1317972712983" MODIFIED="1319316038308">
-<icon BUILTIN="smiley-oh"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://www.kioo.nl/freeplane/CoreMeeting">Beginner</a>
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-<node TEXT="Gevorderde" ID="ID_1404449457" CREATED="1317972719278" MODIFIED="1320852087687">
-<icon BUILTIN="ksmiletris"/>
-</node>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_360719522" CREATED="1317966438145" MODIFIED="1318589645732" HGAP="-2" VSHIFT="149" LINK="menuitem:_$GettingStartedAction$0"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Examples">Document</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Versatile support for efficient documenting.
- </p>
- <p>
- The Freeplane<a href="http://www.kioo.nl/freeplane/tutorial_en"> quick reference</a> is an example.
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#7c7c00" WIDTH="3"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1875337895" CREATED="1317967170441" MODIFIED="1336121070282" HGAP="425" VSHIFT="185"><richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="freeplaneTutorial.mm#ID_1838680824">Stylen</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<edge COLOR="#0000ff" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1875337895" STARTINCLINATION="32;38;" ENDINCLINATION="32;38;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_1583240168" CREATED="1317963552842" MODIFIED="1320852177980" HGAP="110" VSHIFT="208">
-<icon BUILTIN="male1"/>
-<richcontent TYPE="NODE">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#School_environment">Leren</a>
- </p>
- </body>
-</html>
-</richcontent>
-<hook NAME="FreeNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
-
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Een opdracht en
- </p>
- <p>
- afgeschermde
- </p>
- <p>
- oplossingen
- </p>
- </body>
-</html>
-</richcontent>
-<edge COLOR="#ffff00" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1583240168" STARTINCLINATION="-9;57;" ENDINCLINATION="-9;57;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-<node TEXT="Presenteren" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_501841034" CREATED="1317963565525" MODIFIED="1336121085945" HGAP="227" VSHIFT="250">
-<hook NAME="FreeNode"/>
-<edge COLOR="#7c0000" WIDTH="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0033" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_501841034" STARTINCLINATION="-2;53;" ENDINCLINATION="-2;53;" STARTARROW="NONE" ENDARROW="NONE"/>
-</node>
-</node>
-</map>
diff --git a/freeplane/doc/freeplaneFunctions.mm b/freeplane/doc/freeplaneFunctions.mm
index 1085a17..ccb3dd6 100644
--- a/freeplane/doc/freeplaneFunctions.mm
+++ b/freeplane/doc/freeplaneFunctions.mm
@@ -1,18 +1,22 @@
-<map version="freeplane 1.2.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node TEXT="Freeplane 1.2
Functions" FOLDED="false" ID="ID_45488473" CREATED="1288535648658" MODIFIED="1323787510068" BACKGROUND_COLOR="#00ff99" VGAP="0">
+<node TEXT="Freeplane 1.2
Functions" FOLDED="false" ID="ID_45488473" CREATED="1288535648658" MODIFIED="1323787510068" BACKGROUND_COLOR="#00ff99" VGAP_QUANTITY="0.0 px">
<icon BUILTIN="bee"/>
<font BOLD="true"/>
<hook NAME="MapStyle">
- <properties show_icon_for_attributes="false" show_note_icons="false" show_notes_in_map="false"/>
+ <properties fit_to_viewport="false;" show_icon_for_attributes="false" show_note_icons="false" show_notes_in_map="false"/>
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600" MIN_WIDTH="1">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt">
+<font SIZE="24"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600.0 px" MIN_WIDTH="1.0 px">
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes">
+<font SIZE="9"/>
+</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
<stylenode LOCALIZED_TEXT="defaultstyle.floating">
<edge STYLE="hide_edge"/>
@@ -85,7 +89,7 @@
<font NAME="Liberation Sans" SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
<font SIZE="20"/>
</stylenode>
@@ -104,7 +108,7 @@
<font SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
<stylenode TEXT="Reference">
<icon BUILTIN="help"/>
<edge STYLE="hide_edge"/>
@@ -150,7 +154,7 @@
</body>
</html>
</richcontent>
-<node POSITION="left" ID="ID_1556354626" CREATED="1319792091506" MODIFIED="1329860019627" HGAP="1" VSHIFT="-32" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+<node POSITION="left" ID="ID_1556354626" CREATED="1319792091506" MODIFIED="1329860019627" HGAP_QUANTITY="1.0 px" VSHIFT_QUANTITY="-32.0 px" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -162,9 +166,9 @@
</p>
</body>
</html>
+
</richcontent>
<font BOLD="false"/>
-<hook NAME="FirstGroupNode"/>
<richcontent TYPE="NOTE">
<html>
@@ -199,6 +203,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -223,7 +228,7 @@
</richcontent>
<edge STYLE="horizontal" WIDTH="thin"/>
</node>
-<node ID="ID_300419503" CREATED="1319798221748" MODIFIED="1336132729252" HGAP="316" VSHIFT="-75" STYLE="bubble"><richcontent TYPE="NODE">
+<node ID="ID_300419503" CREATED="1319798221748" MODIFIED="1336132729252" HGAP_QUANTITY="316.0 px" VSHIFT_QUANTITY="-75.0 px" STYLE="bubble"><richcontent TYPE="NODE">
<html>
<head>
@@ -233,6 +238,7 @@
<img src="Images/doc/freeplaneApplications.png"/>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<edge STYLE="hide_edge"/>
@@ -258,7 +264,7 @@
</html>
</richcontent>
</node>
-<node ID="ID_1519332680" CREATED="1288542452827" MODIFIED="1323786286031" LINK="#ID_784697063" HGAP="21" VSHIFT="-2" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1519332680" CREATED="1288542452827" MODIFIED="1323786286031" LINK="#ID_784697063" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-2.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -270,6 +276,7 @@
</p>
</body>
</html>
+
</richcontent>
<edge STYLE="horizontal" WIDTH="thin"/>
<richcontent TYPE="NOTE">
@@ -294,7 +301,7 @@
</html>
</richcontent>
</node>
-<node TEXT="External arrow-link (one), and:" ID="ID_1537075496" CREATED="1288542605210" MODIFIED="1323786343283" LINK="http://kioo.nl/" HGAP="21" VSHIFT="-3" TEXT_SHORTENED="true">
+<node TEXT="External arrow-link (one), and:" ID="ID_1537075496" CREATED="1288542605210" MODIFIED="1323786343283" LINK="http://kioo.nl/" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-3.0 px" TEXT_SHORTENED="true">
<edge STYLE="horizontal" WIDTH="thin"/>
<richcontent TYPE="NOTE">
@@ -318,7 +325,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Icons" ID="ID_233656995" CREATED="1288542843639" MODIFIED="1323786415950" HGAP="21" VSHIFT="-7" TEXT_SHORTENED="true">
+<node TEXT="Icons" ID="ID_233656995" CREATED="1288542843639" MODIFIED="1323786415950" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-7.0 px" TEXT_SHORTENED="true">
<icon BUILTIN="bookmark"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="closed"/>
@@ -412,7 +419,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Free positionable node" POSITION="left" ID="ID_1280208201" CREATED="1319797134021" MODIFIED="1320074445132" HGAP="140" VSHIFT="19" TEXT_SHORTENED="true">
+<node TEXT="Free positionable node" POSITION="left" ID="ID_1280208201" CREATED="1319797134021" MODIFIED="1320074445132" HGAP_QUANTITY="140.0 px" VSHIFT_QUANTITY="19.0 px" TEXT_SHORTENED="true">
<hook NAME="FreeNode"/>
<font BOLD="true"/>
<richcontent TYPE="NOTE">
@@ -449,7 +456,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Floating node" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_231217112" CREATED="1319797190586" MODIFIED="1320076203902" VSHIFT="10" TEXT_SHORTENED="true">
+<node TEXT="Floating node" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_231217112" CREATED="1319797190586" MODIFIED="1320076203902" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true">
<font BOLD="true"/>
<richcontent TYPE="NOTE">
@@ -487,7 +494,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Free + floating node" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_188185624" CREATED="1319788879948" MODIFIED="1329860033948" HGAP="431" VSHIFT="43" TEXT_SHORTENED="true">
+<node TEXT="Free + floating node" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_188185624" CREATED="1319788879948" MODIFIED="1329860033948" HGAP_QUANTITY="431.0 px" VSHIFT_QUANTITY="43.0 px" TEXT_SHORTENED="true">
<hook NAME="FreeNode"/>
<font BOLD="true"/>
<richcontent TYPE="DETAILS">
@@ -525,7 +532,7 @@
</html>
</richcontent>
</node>
-<node POSITION="right" ID="ID_1077719150" CREATED="1319792123071" MODIFIED="1319923775793" VGAP="0" HGAP="-10" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+<node POSITION="right" ID="ID_1077719150" CREATED="1319792123071" MODIFIED="1319923775793" VGAP_QUANTITY="0.0 px" HGAP_QUANTITY="-10.0 px" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -540,6 +547,7 @@
</p>
</body>
</html>
+
</richcontent>
<font BOLD="false"/>
<richcontent TYPE="NOTE">
@@ -564,7 +572,7 @@
</html>
</richcontent>
<edge STYLE="sharp_bezier" COLOR="#cc0000" WIDTH="2"/>
-<node TEXT="Below this node core:" ID="ID_1010722858" CREATED="1288646162992" MODIFIED="1336132743870" STYLE="bubble" VGAP="0" VSHIFT="-9">
+<node TEXT="Below this node core:" ID="ID_1010722858" CREATED="1288646162992" MODIFIED="1336132743870" STYLE="bubble" VGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="-9.0 px">
<font ITALIC="false"/>
<attribute NAME="a1" VALUE="value1"/>
<attribute NAME="a2" VALUE="value2"/>
@@ -584,7 +592,7 @@
<hook EQUATION="\begin{array}{l}
\mbox{I}^\fgcolor{ff0000}{\heartsuit}\mbox{\JLaTeXMath}\\
\end{array}" NAME="plugins/latex/LatexNodeHook.properties"/>
<edge STYLE="bezier" WIDTH="thin"/>
<hook URI="Images/doc/freeplaneApplications.png" SIZE="0.4148148" NAME="ExternalObject"/>
-<node STYLE_REF="Reference" ID="ID_965583686" CREATED="1319872918353" MODIFIED="1320248359904" HGAP="240" VSHIFT="-1"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_965583686" CREATED="1319872918353" MODIFIED="1320248359904" HGAP_QUANTITY="240.0 px" VSHIFT_QUANTITY="-1.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -596,7 +604,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_965583686" STARTINCLINATION="-65;17;" ENDINCLINATION="-65;17;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="NOTE">
<html>
@@ -620,9 +630,8 @@
</richcontent>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_965583686" STARTINCLINATION="-65;17;" ENDINCLINATION="-65;17;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_242844262" CREATED="1319799725287" MODIFIED="1323787594293" HGAP="370" VSHIFT="29" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_242844262" CREATED="1319799725287" MODIFIED="1323787594293" HGAP_QUANTITY="370.0 px" VSHIFT_QUANTITY="29.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -642,6 +651,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<edge STYLE="hide_edge"/>
@@ -670,7 +680,8 @@
</html>
</richcontent>
</node>
-<node TEXT="Attributes" STYLE_REF="Reference" ID="ID_1546010515" CREATED="1319872918353" MODIFIED="1320248348563" HGAP="240" VSHIFT="59">
+<node TEXT="Attributes" STYLE_REF="Reference" ID="ID_1546010515" CREATED="1319872918353" MODIFIED="1320248348563" HGAP_QUANTITY="240.0 px" VSHIFT_QUANTITY="59.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1546010515" STARTINCLINATION="-61;0;" ENDINCLINATION="-61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="FreeNode"/>
<richcontent TYPE="NOTE">
@@ -696,9 +707,8 @@
</body>
</html>
</richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1546010515" STARTINCLINATION="-61;0;" ENDINCLINATION="-61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node STYLE_REF="Reference" ID="ID_1064212525" CREATED="1319872918353" MODIFIED="1320248333790" HGAP="240" VSHIFT="119"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_1064212525" CREATED="1319872918353" MODIFIED="1320248333790" HGAP_QUANTITY="240.0 px" VSHIFT_QUANTITY="119.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -710,7 +720,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1064212525" STARTINCLINATION="-94;-18;" ENDINCLINATION="-94;-18;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="NOTE">
<html>
@@ -734,9 +746,8 @@
</richcontent>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1064212525" STARTINCLINATION="-94;-18;" ENDINCLINATION="-94;-18;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node STYLE_REF="Reference" ID="ID_1639134686" CREATED="1319873881764" MODIFIED="1320248317831" HGAP="40" VSHIFT="90"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_1639134686" CREATED="1319873881764" MODIFIED="1320248317831" HGAP_QUANTITY="40.0 px" VSHIFT_QUANTITY="90.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -748,7 +759,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1639134686" STARTINCLINATION="-134;-30;" ENDINCLINATION="-134;-30;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font BOLD="false"/>
<richcontent TYPE="NOTE">
@@ -771,9 +784,8 @@
</body>
</html>
</richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1639134686" STARTINCLINATION="-134;-30;" ENDINCLINATION="-134;-30;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_1802101455" CREATED="1319799725287" MODIFIED="1329859505294" HGAP="138" VSHIFT="192" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_1802101455" CREATED="1319799725287" MODIFIED="1329859505294" HGAP_QUANTITY="138.0 px" VSHIFT_QUANTITY="192.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -790,13 +802,18 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1802101455" STARTINCLINATION="-22;-15;" ENDINCLINATION="-22;-15;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<edge STYLE="hide_edge"/>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1802101455" STARTINCLINATION="-22;-15;" ENDINCLINATION="-22;-15;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
-<node TEXT="Edges" STYLE_REF="Reference" FOLDED="true" ID="ID_1944496966" CREATED="1319872918353" MODIFIED="1329859454342" HGAP="-60" VSHIFT="-91"><richcontent TYPE="NOTE">
+<node TEXT="Edges" STYLE_REF="Reference" FOLDED="true" ID="ID_1944496966" CREATED="1319872918353" MODIFIED="1329859454342" HGAP_QUANTITY="-60.0 px" VSHIFT_QUANTITY="-91.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-137;25;" ENDINCLINATION="-137;25;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-48;91;" ENDINCLINATION="-48;91;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="120;32;" ENDINCLINATION="120;32;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -818,35 +835,31 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-137;25;" ENDINCLINATION="-137;25;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="120;32;" ENDINCLINATION="120;32;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-48;91;" ENDINCLINATION="-48;91;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="Format edge" ID="ID_1601648824" CREATED="1319796287461" MODIFIED="1319922320701" HGAP="30" VSHIFT="-172">
+<node TEXT="Format edge" ID="ID_1601648824" CREATED="1319796287461" MODIFIED="1319922320701" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="-172.0 px">
<edge STYLE="bezier"/>
-<node TEXT="dikte tak" ID="ID_241458321" CREATED="1288541466835" MODIFIED="1288646970331" VSHIFT="7">
-<node TEXT="dun" ID="ID_1693976270" CREATED="1288541473878" MODIFIED="1288541507504" HGAP="42"/>
-<node TEXT="punt 3" ID="ID_1152182019" CREATED="1288542920337" MODIFIED="1288542944097" HGAP="42" VSHIFT="9">
+<node TEXT="dikte tak" ID="ID_241458321" CREATED="1288541466835" MODIFIED="1288646970331" VSHIFT_QUANTITY="7.0 px">
+<node TEXT="dun" ID="ID_1693976270" CREATED="1288541473878" MODIFIED="1288541507504" HGAP_QUANTITY="42.0 px"/>
+<node TEXT="punt 3" ID="ID_1152182019" CREATED="1288542920337" MODIFIED="1288542944097" HGAP_QUANTITY="42.0 px" VSHIFT_QUANTITY="9.0 px">
<edge WIDTH="2"/>
</node>
-<node TEXT="punt 8" ID="ID_1828139471" CREATED="1288541479345" MODIFIED="1288542967746" HGAP="42" VSHIFT="5">
+<node TEXT="punt 8" ID="ID_1828139471" CREATED="1288541479345" MODIFIED="1288542967746" HGAP_QUANTITY="42.0 px" VSHIFT_QUANTITY="5.0 px">
<edge WIDTH="8"/>
</node>
</node>
-<node TEXT="vorm tak" ID="ID_784697063" CREATED="1288536745875" MODIFIED="1289122245318" HGAP="21" VSHIFT="1">
-<node TEXT="Rechte lijn" ID="ID_884692926" CREATED="1288538234095" MODIFIED="1305276198448" HGAP="53" VSHIFT="-1">
+<node TEXT="vorm tak" ID="ID_784697063" CREATED="1288536745875" MODIFIED="1289122245318" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="1.0 px">
+<node TEXT="Rechte lijn" ID="ID_884692926" CREATED="1288538234095" MODIFIED="1305276198448" HGAP_QUANTITY="53.0 px" VSHIFT_QUANTITY="-1.0 px">
<edge STYLE="linear" WIDTH="4"/>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Bocht" ID="ID_609820168" CREATED="1288538240451" MODIFIED="1288539867421" HGAP="57" VSHIFT="9">
+<node TEXT="Bocht" ID="ID_609820168" CREATED="1288538240451" MODIFIED="1288539867421" HGAP_QUANTITY="57.0 px" VSHIFT_QUANTITY="9.0 px">
<edge STYLE="bezier" WIDTH="4"/>
</node>
-<node TEXT="Taps toelopend recht" ID="ID_1647821228" CREATED="1288538242377" MODIFIED="1288540221963" HGAP="60" VSHIFT="10">
+<node TEXT="Taps toelopend recht" ID="ID_1647821228" CREATED="1288538242377" MODIFIED="1288540221963" HGAP_QUANTITY="60.0 px" VSHIFT_QUANTITY="10.0 px">
<edge STYLE="sharp_linear" WIDTH="4"/>
</node>
-<node TEXT="Taps toelopend bocht" ID="ID_895403951" CREATED="1288538470332" MODIFIED="1288540434497" HGAP="70" VSHIFT="15">
+<node TEXT="Taps toelopend bocht" ID="ID_895403951" CREATED="1288538470332" MODIFIED="1288540434497" HGAP_QUANTITY="70.0 px" VSHIFT_QUANTITY="15.0 px">
<edge STYLE="sharp_bezier" WIDTH="4"/>
</node>
-<node TEXT="Verborgen tak" ID="ID_1675552701" CREATED="1288538507390" MODIFIED="1288548679856" HGAP="77" VSHIFT="18" BACKGROUND_COLOR="#00ffff">
+<node TEXT="Verborgen tak" ID="ID_1675552701" CREATED="1288538507390" MODIFIED="1288548679856" HGAP_QUANTITY="77.0 px" VSHIFT_QUANTITY="18.0 px" BACKGROUND_COLOR="#00ffff">
<edge STYLE="hide_edge" WIDTH="4"/>
</node>
</node>
@@ -871,6 +884,7 @@
</p>
</body>
</html>
+
</richcontent>
<edge STYLE="sharp_bezier" COLOR="#006633" WIDTH="2"/>
<richcontent TYPE="NOTE">
@@ -895,7 +909,9 @@
</html>
</richcontent>
</node>
-<node TEXT="Cloud" STYLE_REF="Reference" FOLDED="true" POSITION="right" ID="ID_1697684606" CREATED="1319873881764" MODIFIED="1329860050094" HGAP="510" VSHIFT="79"><richcontent TYPE="NOTE">
+<node TEXT="Cloud" STYLE_REF="Reference" FOLDED="true" POSITION="right" ID="ID_1697684606" CREATED="1319873881764" MODIFIED="1329860050094" HGAP_QUANTITY="510.0 px" VSHIFT_QUANTITY="79.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1697684606" STARTINCLINATION="-79;67;" ENDINCLINATION="-79;67;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -917,8 +933,7 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1697684606" STARTINCLINATION="-79;67;" ENDINCLINATION="-79;67;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="rectangle" ID="ID_1198357672" CREATED="1305277572322" MODIFIED="1319834257585" HGAP="48" VSHIFT="4">
+<node TEXT="rectangle" ID="ID_1198357672" CREATED="1305277572322" MODIFIED="1319834257585" HGAP_QUANTITY="48.0 px" VSHIFT_QUANTITY="4.0 px">
<cloud COLOR="#f0f0f0" SHAPE="RECT"/>
<richcontent TYPE="NOTE">
@@ -967,7 +982,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Relations" POSITION="right" ID="ID_441663322" CREATED="1288536353356" MODIFIED="1330611653263" STYLE="fork" HGAP="-56" VSHIFT="27"><richcontent TYPE="NOTE">
+<node TEXT="Relations" POSITION="right" ID="ID_441663322" CREATED="1288536353356" MODIFIED="1330611653263" STYLE="fork" HGAP_QUANTITY="-56.0 px" VSHIFT_QUANTITY="27.0 px"><richcontent TYPE="NOTE">
<html>
<head>
@@ -982,12 +997,12 @@
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="above a" ID="ID_1863548649" CREATED="1288536207761" MODIFIED="1319919454936" HGAP="37" VSHIFT="-13" STYLE="bubble"/>
-<node TEXT="node a" ID="ID_1119041406" CREATED="1288535672221" MODIFIED="1334839310685" STYLE="bubble" HGAP="53" VSHIFT="7">
+<node TEXT="above a" ID="ID_1863548649" CREATED="1288536207761" MODIFIED="1319919454936" HGAP_QUANTITY="37.0 px" VSHIFT_QUANTITY="-13.0 px" STYLE="bubble"/>
+<node TEXT="node a" ID="ID_1119041406" CREATED="1288535672221" MODIFIED="1334839310685" STYLE="bubble" HGAP_QUANTITY="53.0 px" VSHIFT_QUANTITY="7.0 px">
<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="5" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_268922755" SOURCE_LABEL="parent" TARGET_LABEL="grand child" MIDDLE_LABEL="hierarchy" STARTINCLINATION="-2;23;" ENDINCLINATION="-21;59;" STARTARROW="NONE" ENDARROW="NONE"/>
-<node TEXT="node b" ID="ID_1908863616" CREATED="1288535688688" MODIFIED="1319920379262" VGAP="0" VSHIFT="10" STYLE="bubble">
+<node TEXT="node b" ID="ID_1908863616" CREATED="1288535688688" MODIFIED="1319920379262" VGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="10.0 px" STYLE="bubble">
<edge STYLE="bezier" WIDTH="thin"/>
-<node ID="ID_1947425814" CREATED="1319799725287" MODIFIED="1323787460834" HGAP="0" VSHIFT="-46" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_1947425814" CREATED="1319799725287" MODIFIED="1323787460834" HGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="-46.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -1001,12 +1016,13 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1947425814" STARTINCLINATION="4;47;" ENDINCLINATION="4;47;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<edge STYLE="hide_edge"/>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1947425814" STARTINCLINATION="4;47;" ENDINCLINATION="4;47;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_1143366438" CREATED="1319799725287" MODIFIED="1323787452551" HGAP="110" VSHIFT="-16" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_1143366438" CREATED="1319799725287" MODIFIED="1323787452551" HGAP_QUANTITY="110.0 px" VSHIFT_QUANTITY="-16.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -1020,13 +1036,14 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1143366438" STARTINCLINATION="-41;22;" ENDINCLINATION="-41;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font BOLD="false"/>
<edge STYLE="hide_edge"/>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1143366438" STARTINCLINATION="-41;22;" ENDINCLINATION="-41;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="node c" FOLDED="true" ID="ID_268922755" CREATED="1288535699522" MODIFIED="1319920388512" VGAP="0" VSHIFT="10" TEXT_SHORTENED="true" STYLE="bubble"><richcontent TYPE="DETAILS">
+<node TEXT="node c" FOLDED="true" ID="ID_268922755" CREATED="1288535699522" MODIFIED="1319920388512" VGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true" STYLE="bubble"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1047,7 +1064,7 @@
</richcontent>
<node TEXT="etc." ID="ID_1829616131" CREATED="1319919735822" MODIFIED="1319919743997"/>
</node>
-<node STYLE_REF="Reference" ID="ID_389809087" CREATED="1319872918353" MODIFIED="1320248200160" HGAP="140" VSHIFT="79"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_389809087" CREATED="1319872918353" MODIFIED="1320248200160" HGAP_QUANTITY="140.0 px" VSHIFT_QUANTITY="79.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1062,7 +1079,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_389809087" STARTINCLINATION="-80;-24;" ENDINCLINATION="-80;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="NOTE">
<html>
@@ -1086,9 +1105,10 @@
</richcontent>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_389809087" STARTINCLINATION="-80;-24;" ENDINCLINATION="-80;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Label" STYLE_REF="Reference" ID="ID_1560136360" CREATED="1319872918353" MODIFIED="1320248277005" HGAP="0" VSHIFT="99"><richcontent TYPE="NOTE">
+<node TEXT="Label" STYLE_REF="Reference" ID="ID_1560136360" CREATED="1319872918353" MODIFIED="1320248277005" HGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="99.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1560136360" STARTINCLINATION="-4;-35;" ENDINCLINATION="-4;-35;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -1110,13 +1130,12 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1560136360" STARTINCLINATION="-4;-35;" ENDINCLINATION="-4;-35;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
-<node TEXT="below a" ID="ID_975219834" CREATED="1288536218798" MODIFIED="1319919509381" HGAP="27" VSHIFT="34" STYLE="bubble"/>
+<node TEXT="below a" ID="ID_975219834" CREATED="1288536218798" MODIFIED="1319919509381" HGAP_QUANTITY="27.0 px" VSHIFT_QUANTITY="34.0 px" STYLE="bubble"/>
</node>
-<node STYLE_REF="Reference" POSITION="right" ID="ID_1828022839" CREATED="1319963720129" MODIFIED="1329859481362" HGAP="541" VSHIFT="183"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" POSITION="right" ID="ID_1828022839" CREATED="1319963720129" MODIFIED="1329859481362" HGAP_QUANTITY="541.0 px" VSHIFT_QUANTITY="183.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1131,7 +1150,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1828022839" STARTINCLINATION="-60;-48;" ENDINCLINATION="-60;-48;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
<richcontent TYPE="NOTE">
@@ -1155,9 +1176,8 @@
</body>
</html>
</richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1828022839" STARTINCLINATION="-60;-48;" ENDINCLINATION="-60;-48;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Format node core" FOLDED="true" POSITION="left" ID="ID_1983670807" CREATED="1319795759589" MODIFIED="1320074527656" HGAP="10" VSHIFT="49" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+<node TEXT="Format node core" FOLDED="true" POSITION="left" ID="ID_1983670807" CREATED="1319795759589" MODIFIED="1320074527656" HGAP_QUANTITY="10.0 px" VSHIFT_QUANTITY="49.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
<html>
<head>
@@ -1178,7 +1198,7 @@
</body>
</html>
</richcontent>
-<node ID="ID_1794331644" CREATED="1288536624648" MODIFIED="1320003893255" STYLE="bubble" VSHIFT="110"><richcontent TYPE="NODE">
+<node ID="ID_1794331644" CREATED="1288536624648" MODIFIED="1320003893255" STYLE="bubble" VSHIFT_QUANTITY="110.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1190,6 +1210,7 @@
</p>
</body>
</html>
+
</richcontent>
</node>
<node TEXT="Color" ID="ID_1602479950" CREATED="1288536644733" MODIFIED="1320005140877">
@@ -1209,13 +1230,15 @@
<font NAME="Dialog" SIZE="21"/>
</node>
</node>
-<node TEXT="Blinking" ID="ID_1280590016" CREATED="1288548004325" MODIFIED="1320005179849" VSHIFT="-13">
+<node TEXT="Blinking" ID="ID_1280590016" CREATED="1288548004325" MODIFIED="1320005179849" VSHIFT_QUANTITY="-13.0 px">
<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
</node>
</node>
-<node TEXT="Special" POSITION="left" ID="ID_206364326" CREATED="1319795251644" MODIFIED="1319991650705" VSHIFT="20">
+<node TEXT="" POSITION="left" ID="ID_1000966299" CREATED="1455910852393" MODIFIED="1455910852393">
<hook NAME="FirstGroupNode"/>
-<node ENCRYPTED_CONTENT="t/NS/HPSppU= VbQIDGWIdFE=" ID="ID_36040841" CREATED="1288542236861" MODIFIED="1320074831732" TEXT_SHORTENED="true" HGAP="30"><richcontent TYPE="NODE">
+</node>
+<node TEXT="Special" POSITION="left" ID="ID_206364326" CREATED="1319795251644" MODIFIED="1319991650705" VSHIFT_QUANTITY="20.0 px">
+<node ENCRYPTED_CONTENT="t/NS/HPSppU= VbQIDGWIdFE=" ID="ID_36040841" CREATED="1288542236861" MODIFIED="1320074831732" TEXT_SHORTENED="true" HGAP_QUANTITY="30.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1227,6 +1250,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1250,7 +1274,7 @@
</html>
</richcontent>
</node>
-<node ID="ID_49859005" CREATED="1319800320485" MODIFIED="1320074545705" HGAP="30" VSHIFT="10" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_49859005" CREATED="1319800320485" MODIFIED="1320074545705" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -1262,6 +1286,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1305,7 +1330,7 @@
</richcontent>
</node>
</node>
-<node ID="ID_1885496887" CREATED="1288542096079" MODIFIED="1320074842745" HGAP="31" VSHIFT="10" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1885496887" CREATED="1288542096079" MODIFIED="1320074842745" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -1317,6 +1342,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
@@ -1344,7 +1370,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Other" POSITION="left" ID="ID_454770946" CREATED="1319875565802" MODIFIED="1320075121393" VSHIFT="30">
+<node TEXT="Other" POSITION="left" ID="ID_454770946" CREATED="1319875565802" MODIFIED="1320075121393" VSHIFT_QUANTITY="30.0 px">
<node ID="ID_1987204825" CREATED="1319925023100" MODIFIED="1320075051224" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
@@ -1357,6 +1383,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1393,6 +1420,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1451,6 +1479,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1487,6 +1516,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1509,7 +1539,9 @@
<edge STYLE="horizontal"/>
</node>
</node>
-<node TEXT="Summary node
(accolade)" POSITION="left" ID="ID_499898058" CREATED="1319795597294" MODIFIED="1323786930205" HGAP="40">
+<node TEXT="" POSITION="left" ID="ID_1520416593" CREATED="1455910852401" MODIFIED="1455910852401">
+<hook NAME="SummaryNode"/>
+<node TEXT="Summary node
(accolade)" ID="ID_499898058" CREATED="1319795597294" MODIFIED="1323786930205" HGAP_QUANTITY="40.0 px">
<font BOLD="true"/>
<richcontent TYPE="NOTE">
@@ -1533,7 +1565,7 @@
</html>
</richcontent>
<edge COLOR="#ff00ff" WIDTH="3"/>
-<hook NAME="SummaryNode"/>
+</node>
</node>
</node>
</map>
diff --git a/freeplane/doc/freeplaneFunctions_ja.mm b/freeplane/doc/freeplaneFunctions_ja.mm
index 920e5aa..0aef5fd 100644
--- a/freeplane/doc/freeplaneFunctions_ja.mm
+++ b/freeplane/doc/freeplaneFunctions_ja.mm
@@ -1,18 +1,22 @@
-<map version="freeplane 1.2.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node TEXT="Freeplane 1.2
の機能" FOLDED="false" ID="ID_45488473" BACKGROUND_COLOR="#00ff99" VGAP="0">
+<node TEXT="Freeplane 1.2
の機能" FOLDED="false" ID="ID_45488473" CREATED="1455910859947" MODIFIED="1455910859947" BACKGROUND_COLOR="#00ff99" VGAP_QUANTITY="0.0 px">
<icon BUILTIN="bee"/>
<font BOLD="true"/>
<hook NAME="MapStyle">
- <properties show_icon_for_attributes="false" show_note_icons="false" show_notes_in_map="false"/>
+ <properties fit_to_viewport="false;" show_icon_for_attributes="false" show_note_icons="false" show_notes_in_map="false"/>
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600" MIN_WIDTH="1">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt">
+<font SIZE="24"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600.0 px" MIN_WIDTH="1.0 px">
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes">
+<font SIZE="9"/>
+</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
<stylenode LOCALIZED_TEXT="defaultstyle.floating">
<edge STYLE="hide_edge"/>
@@ -85,7 +89,7 @@
<font NAME="Liberation Sans" SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
<font SIZE="20"/>
</stylenode>
@@ -104,7 +108,7 @@
<font SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
<stylenode TEXT="Reference">
<icon BUILTIN="help"/>
<edge STYLE="hide_edge"/>
@@ -146,7 +150,7 @@
</body>
</html>
</richcontent>
-<node POSITION="left" ID="ID_1556354626" HGAP="1" VSHIFT="-32" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+<node POSITION="left" ID="ID_1556354626" CREATED="1455910859951" MODIFIED="1455910859951" HGAP_QUANTITY="1.0 px" VSHIFT_QUANTITY="-32.0 px" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -158,9 +162,9 @@
</p>
</body>
</html>
+
</richcontent>
<font BOLD="false"/>
-<hook NAME="FirstGroupNode"/>
<richcontent TYPE="NOTE">
<html>
@@ -183,7 +187,7 @@
</html>
</richcontent>
<edge STYLE="sharp_bezier" COLOR="#000099" WIDTH="2"/>
-<node ID="ID_1266354824" STYLE="fork" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1266354824" CREATED="1455910859951" MODIFIED="1455910859951" STYLE="fork" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -195,6 +199,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -219,7 +224,7 @@
</richcontent>
<edge STYLE="horizontal" WIDTH="thin"/>
</node>
-<node ID="ID_1519332680" LINK="#ID_784697063" HGAP="21" VSHIFT="-2" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1519332680" CREATED="1455910859952" MODIFIED="1455910859952" LINK="#ID_784697063" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-2.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -231,6 +236,7 @@
</p>
</body>
</html>
+
</richcontent>
<edge STYLE="horizontal" WIDTH="thin"/>
<richcontent TYPE="NOTE">
@@ -255,7 +261,7 @@
</html>
</richcontent>
</node>
-<node TEXT="矢印型リンク-外部オブジェクト向け(1つ)、及び" ID="ID_1537075496" LINK="http://kioo.nl/" HGAP="21" VSHIFT="-3" TEXT_SHORTENED="true">
+<node TEXT="矢印型リンク-外部オブジェクト向け(1つ)、及び" ID="ID_1537075496" CREATED="1455910859952" MODIFIED="1455910859952" LINK="http://kioo.nl/" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-3.0 px" TEXT_SHORTENED="true">
<edge STYLE="horizontal" WIDTH="thin"/>
<richcontent TYPE="NOTE">
@@ -279,7 +285,7 @@
</html>
</richcontent>
</node>
-<node TEXT="アイコン(複数可)" ID="ID_233656995" HGAP="21" VSHIFT="-7" TEXT_SHORTENED="true">
+<node TEXT="アイコン(複数可)" ID="ID_233656995" CREATED="1455910859952" MODIFIED="1455910859952" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-7.0 px" TEXT_SHORTENED="true">
<icon BUILTIN="bookmark"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="closed"/>
@@ -306,7 +312,7 @@
</html>
</richcontent>
</node>
-<node ID="ID_300419503" HGAP="296" VSHIFT="-3" STYLE="bubble"><richcontent TYPE="NODE">
+<node ID="ID_300419503" CREATED="1455910859952" MODIFIED="1455910859952" HGAP_QUANTITY="296.0 px" VSHIFT_QUANTITY="-3.0 px" STYLE="bubble"><richcontent TYPE="NODE">
<html>
<head>
@@ -316,6 +322,7 @@
<img src="Images/doc/freeplaneApplications.png"/>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<edge STYLE="hide_edge"/>
@@ -341,7 +348,7 @@
</html>
</richcontent>
</node>
-<node TEXT="進捗度表示 %" ID="ID_1826346574" TEXT_SHORTENED="true">
+<node TEXT="進捗度表示 %" ID="ID_1826346574" CREATED="1455910859953" MODIFIED="1455910859953" TEXT_SHORTENED="true">
<icon BUILTIN="25%"/>
<richcontent TYPE="NOTE">
@@ -366,7 +373,7 @@
</richcontent>
<edge STYLE="horizontal" WIDTH="thin"/>
</node>
-<node TEXT="自動振り付けノード番号" ID="ID_1097461051" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+<node TEXT="自動振り付けノード番号" ID="ID_1097461051" CREATED="1455910859953" MODIFIED="1455910859953" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
<html>
<head>
@@ -386,7 +393,7 @@
</richcontent>
<edge STYLE="horizontal" WIDTH="thin"/>
</node>
-<node TEXT="ノードの表示幅" ID="ID_713840726" TEXT_SHORTENED="true">
+<node TEXT="ノードの表示幅" ID="ID_713840726" CREATED="1455910859953" MODIFIED="1455910859953" TEXT_SHORTENED="true">
<edge STYLE="horizontal" WIDTH="thin"/>
<richcontent TYPE="DETAILS">
@@ -408,7 +415,7 @@
</richcontent>
</node>
</node>
-<node TEXT="フリーポジションノード" FOLDED="true" POSITION="left" ID="ID_1280208201" HGAP="140" VSHIFT="19" TEXT_SHORTENED="true">
+<node TEXT="フリーポジションノード" FOLDED="true" POSITION="left" ID="ID_1280208201" CREATED="1455910859954" MODIFIED="1455910859954" HGAP_QUANTITY="140.0 px" VSHIFT_QUANTITY="19.0 px" TEXT_SHORTENED="true">
<hook NAME="FreeNode"/>
<font BOLD="true"/>
<richcontent TYPE="NOTE">
@@ -445,7 +452,7 @@
</body>
</html>
</richcontent>
-<node TEXT="フローティングノード" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_231217112" VSHIFT="10" TEXT_SHORTENED="true">
+<node TEXT="フローティングノード" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_231217112" CREATED="1455910859954" MODIFIED="1455910859954" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true">
<font BOLD="true"/>
<richcontent TYPE="NOTE">
@@ -483,7 +490,7 @@
</richcontent>
</node>
</node>
-<node TEXT="フリー + フローティング ノード" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_188185624" HGAP="427" VSHIFT="63" TEXT_SHORTENED="true">
+<node TEXT="フリー + フローティング ノード" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_188185624" CREATED="1455910859954" MODIFIED="1455910859954" HGAP_QUANTITY="427.0 px" VSHIFT_QUANTITY="63.0 px" TEXT_SHORTENED="true">
<hook NAME="FreeNode"/>
<font BOLD="true"/>
<richcontent TYPE="DETAILS">
@@ -521,7 +528,7 @@
</html>
</richcontent>
</node>
-<node POSITION="right" ID="ID_1077719150" VGAP="0" HGAP="-10" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+<node POSITION="right" ID="ID_1077719150" CREATED="1455910859955" MODIFIED="1455910859955" VGAP_QUANTITY="0.0 px" HGAP_QUANTITY="-10.0 px" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -539,6 +546,7 @@
</p>
</body>
</html>
+
</richcontent>
<font BOLD="false"/>
<richcontent TYPE="NOTE">
@@ -563,7 +571,11 @@
</html>
</richcontent>
<edge STYLE="sharp_bezier" COLOR="#cc0000" WIDTH="2"/>
-<node TEXT="線(エッジ)" STYLE_REF="Reference" ID="ID_1944496966" HGAP="-60" VSHIFT="-111"><richcontent TYPE="NOTE">
+<node TEXT="線(エッジ)" STYLE_REF="Reference" ID="ID_1944496966" CREATED="1455910859955" MODIFIED="1455910859955" HGAP_QUANTITY="-60.0 px" VSHIFT_QUANTITY="-111.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-75;115;" ENDINCLINATION="-75;115;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="102;73;" ENDINCLINATION="102;73;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-174;45;" ENDINCLINATION="-174;45;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -585,44 +597,40 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-75;115;" ENDINCLINATION="-75;115;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-174;45;" ENDINCLINATION="-174;45;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="102;73;" ENDINCLINATION="102;73;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="線の書式" ID="ID_1601648824" HGAP="26" VSHIFT="-152">
+<node TEXT="線の書式" ID="ID_1601648824" CREATED="1455910859974" MODIFIED="1455910859974" HGAP_QUANTITY="26.0 px" VSHIFT_QUANTITY="-152.0 px">
<edge STYLE="bezier"/>
-<node TEXT="線の太さ" ID="ID_241458321" VSHIFT="7">
-<node TEXT="細い" ID="ID_1693976270" HGAP="42"/>
-<node TEXT="3ポイント" ID="ID_1152182019" HGAP="42" VSHIFT="9">
+<node TEXT="線の太さ" ID="ID_241458321" CREATED="1455910859974" MODIFIED="1455910859974" VSHIFT_QUANTITY="7.0 px">
+<node TEXT="細い" ID="ID_1693976270" CREATED="1455910859978" MODIFIED="1455910859978" HGAP_QUANTITY="42.0 px"/>
+<node TEXT="3ポイント" ID="ID_1152182019" CREATED="1455910859978" MODIFIED="1455910859978" HGAP_QUANTITY="42.0 px" VSHIFT_QUANTITY="9.0 px">
<edge WIDTH="2"/>
</node>
-<node TEXT="8ポイント" ID="ID_1828139471" HGAP="42" VSHIFT="5">
+<node TEXT="8ポイント" ID="ID_1828139471" CREATED="1455910859979" MODIFIED="1455910859979" HGAP_QUANTITY="42.0 px" VSHIFT_QUANTITY="5.0 px">
<edge WIDTH="8"/>
</node>
</node>
-<node TEXT="線の形状" ID="ID_784697063" HGAP="21" VSHIFT="1">
-<node TEXT="直線" ID="ID_884692926" HGAP="53" VSHIFT="-1">
+<node TEXT="線の形状" ID="ID_784697063" CREATED="1455910859979" MODIFIED="1455910859979" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="1.0 px">
+<node TEXT="直線" ID="ID_884692926" CREATED="1455910859979" MODIFIED="1455910859979" HGAP_QUANTITY="53.0 px" VSHIFT_QUANTITY="-1.0 px">
<edge STYLE="linear" WIDTH="4"/>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="曲線" ID="ID_609820168" HGAP="57" VSHIFT="9">
+<node TEXT="曲線" ID="ID_609820168" CREATED="1455910859981" MODIFIED="1455910859981" HGAP_QUANTITY="57.0 px" VSHIFT_QUANTITY="9.0 px">
<edge STYLE="bezier" WIDTH="4"/>
</node>
-<node TEXT="先細直線" ID="ID_1647821228" HGAP="60" VSHIFT="10">
+<node TEXT="先細直線" ID="ID_1647821228" CREATED="1455910859981" MODIFIED="1455910859981" HGAP_QUANTITY="60.0 px" VSHIFT_QUANTITY="10.0 px">
<edge STYLE="sharp_linear" WIDTH="4"/>
</node>
-<node TEXT="先細曲線" ID="ID_895403951" HGAP="70" VSHIFT="15">
+<node TEXT="先細曲線" ID="ID_895403951" CREATED="1455910859981" MODIFIED="1455910859981" HGAP_QUANTITY="70.0 px" VSHIFT_QUANTITY="15.0 px">
<edge STYLE="sharp_bezier" WIDTH="4"/>
</node>
-<node TEXT="線を隠す" ID="ID_1675552701" HGAP="77" VSHIFT="18" BACKGROUND_COLOR="#00ffff">
+<node TEXT="線を隠す" ID="ID_1675552701" CREATED="1455910859981" MODIFIED="1455910859981" HGAP_QUANTITY="77.0 px" VSHIFT_QUANTITY="18.0 px" BACKGROUND_COLOR="#00ffff">
<edge STYLE="hide_edge" WIDTH="4"/>
</node>
</node>
-<node TEXT="線の色" ID="ID_939577724">
+<node TEXT="線の色" ID="ID_939577724" CREATED="1455910859982" MODIFIED="1455910859982">
<edge COLOR="#ff0066"/>
</node>
</node>
</node>
-<node TEXT="このノードコアの下方を参照:" ID="ID_1010722858" STYLE="bubble" VGAP="0" HGAP="16" VSHIFT="-1">
+<node TEXT="このノードコアの下方を参照:" ID="ID_1010722858" CREATED="1455910859983" MODIFIED="1455910859983" STYLE="bubble" VGAP_QUANTITY="0.0 px" HGAP_QUANTITY="16.0 px" VSHIFT_QUANTITY="-1.0 px">
<font ITALIC="false"/>
<attribute NAME="a1" VALUE="value1"/>
<attribute NAME="a2" VALUE="value2"/>
@@ -645,7 +653,7 @@
</body>
</html>
</richcontent>
-<node STYLE_REF="Reference" ID="ID_965583686" HGAP="238" VSHIFT="-1"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_965583686" CREATED="1455910859992" MODIFIED="1455910859992" HGAP_QUANTITY="238.0 px" VSHIFT_QUANTITY="-1.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -657,7 +665,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_965583686" STARTINCLINATION="-105;17;" ENDINCLINATION="-105;17;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="NOTE">
<html>
@@ -681,9 +691,8 @@
</richcontent>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_965583686" STARTINCLINATION="-105;17;" ENDINCLINATION="-105;17;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_242844262" HGAP="350" VSHIFT="49" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_242844262" CREATED="1455910859992" MODIFIED="1455910859992" HGAP_QUANTITY="350.0 px" VSHIFT_QUANTITY="49.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -703,6 +712,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<edge STYLE="hide_edge"/>
@@ -731,7 +741,8 @@
</html>
</richcontent>
</node>
-<node TEXT="属 性" STYLE_REF="Reference" ID="ID_1546010515" HGAP="240" VSHIFT="67">
+<node TEXT="属 性" STYLE_REF="Reference" ID="ID_1546010515" CREATED="1455910859992" MODIFIED="1455910859992" HGAP_QUANTITY="240.0 px" VSHIFT_QUANTITY="67.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1546010515" STARTINCLINATION="-84;-9;" ENDINCLINATION="-84;-9;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="FreeNode"/>
<richcontent TYPE="NOTE">
@@ -757,9 +768,8 @@
</body>
</html>
</richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1546010515" STARTINCLINATION="-84;-9;" ENDINCLINATION="-84;-9;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node STYLE_REF="Reference" ID="ID_1064212525" HGAP="244" VSHIFT="127"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_1064212525" CREATED="1455910859993" MODIFIED="1455910859993" HGAP_QUANTITY="244.0 px" VSHIFT_QUANTITY="127.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -771,7 +781,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1064212525" STARTINCLINATION="-117;-24;" ENDINCLINATION="-117;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="NOTE">
<html>
@@ -795,9 +807,8 @@
</richcontent>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1064212525" STARTINCLINATION="-117;-24;" ENDINCLINATION="-117;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node STYLE_REF="Reference" ID="ID_1639134686" HGAP="40" VSHIFT="90"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_1639134686" CREATED="1455910859993" MODIFIED="1455910859993" HGAP_QUANTITY="40.0 px" VSHIFT_QUANTITY="90.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -809,7 +820,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1639134686" STARTINCLINATION="-134;-34;" ENDINCLINATION="-134;-34;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font BOLD="false"/>
<richcontent TYPE="NOTE">
@@ -832,9 +845,8 @@
</body>
</html>
</richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1639134686" STARTINCLINATION="-134;-34;" ENDINCLINATION="-134;-34;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_1802101455" HGAP="142" VSHIFT="220" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_1802101455" CREATED="1455910859993" MODIFIED="1455910859993" HGAP_QUANTITY="142.0 px" VSHIFT_QUANTITY="220.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -851,14 +863,15 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1802101455" STARTINCLINATION="-68;-42;" ENDINCLINATION="-68;-42;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<edge STYLE="hide_edge"/>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1802101455" STARTINCLINATION="-68;-42;" ENDINCLINATION="-68;-42;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
-<node POSITION="right" ID="ID_1125102706" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+<node POSITION="right" ID="ID_1125102706" CREATED="1455910859993" MODIFIED="1455910859993" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -873,6 +886,7 @@
</p>
</body>
</html>
+
</richcontent>
<edge STYLE="sharp_bezier" COLOR="#006633" WIDTH="2"/>
<richcontent TYPE="NOTE">
@@ -897,7 +911,9 @@
</html>
</richcontent>
</node>
-<node TEXT="雲" STYLE_REF="Reference" FOLDED="true" POSITION="right" ID="ID_1697684606" HGAP="522" VSHIFT="91"><richcontent TYPE="NOTE">
+<node TEXT="雲" STYLE_REF="Reference" FOLDED="true" POSITION="right" ID="ID_1697684606" CREATED="1455910859994" MODIFIED="1455910859994" HGAP_QUANTITY="522.0 px" VSHIFT_QUANTITY="91.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1697684606" STARTINCLINATION="-79;67;" ENDINCLINATION="-79;67;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -919,8 +935,7 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1697684606" STARTINCLINATION="-79;67;" ENDINCLINATION="-79;67;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="矩 形" ID="ID_1198357672" HGAP="48" VSHIFT="4">
+<node TEXT="矩 形" ID="ID_1198357672" CREATED="1455910859994" MODIFIED="1455910859994" HGAP_QUANTITY="48.0 px" VSHIFT_QUANTITY="4.0 px">
<cloud COLOR="#f0f0f0" SHAPE="RECT"/>
<richcontent TYPE="NOTE">
@@ -944,7 +959,7 @@
</html>
</richcontent>
</node>
-<node TEXT="トゲトゲ" ID="ID_1434127019">
+<node TEXT="トゲトゲ" ID="ID_1434127019" CREATED="1455910859994" MODIFIED="1455910859994">
<cloud COLOR="#f0f0f0" SHAPE="STAR"/>
<richcontent TYPE="NOTE">
@@ -969,7 +984,7 @@
</richcontent>
</node>
</node>
-<node TEXT="関係付け" POSITION="right" ID="ID_441663322" STYLE="fork" HGAP="-56" VSHIFT="27"><richcontent TYPE="NOTE">
+<node TEXT="関係付け" POSITION="right" ID="ID_441663322" CREATED="1455910859994" MODIFIED="1455910859994" STYLE="fork" HGAP_QUANTITY="-56.0 px" VSHIFT_QUANTITY="27.0 px"><richcontent TYPE="NOTE">
<html>
<head>
@@ -984,12 +999,12 @@
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="ノード a の上" ID="ID_1863548649" HGAP="37" VSHIFT="-13" STYLE="bubble"/>
-<node TEXT="ノード a" ID="ID_1119041406" STYLE="bubble" HGAP="53" VSHIFT="7">
+<node TEXT="ノード a の上" ID="ID_1863548649" CREATED="1455910859994" MODIFIED="1455910859994" HGAP_QUANTITY="37.0 px" VSHIFT_QUANTITY="-13.0 px" STYLE="bubble"/>
+<node TEXT="ノード a" ID="ID_1119041406" CREATED="1455910859994" MODIFIED="1455910859994" STYLE="bubble" HGAP_QUANTITY="53.0 px" VSHIFT_QUANTITY="7.0 px">
<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="5" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_268922755" SOURCE_LABEL="親ノード" TARGET_LABEL="孫ノード" MIDDLE_LABEL="ノードの階層" STARTINCLINATION="-2;23;" ENDINCLINATION="-21;59;" STARTARROW="NONE" ENDARROW="NONE"/>
-<node TEXT="ノード b" ID="ID_1908863616" VGAP="0" VSHIFT="10" STYLE="bubble">
+<node TEXT="ノード b" ID="ID_1908863616" CREATED="1455910859995" MODIFIED="1455910859995" VGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="10.0 px" STYLE="bubble">
<edge STYLE="bezier" WIDTH="thin"/>
-<node ID="ID_1947425814" HGAP="0" VSHIFT="-46" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_1947425814" CREATED="1455910859995" MODIFIED="1455910859995" HGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="-46.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -1006,12 +1021,13 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1947425814" STARTINCLINATION="13;34;" ENDINCLINATION="13;34;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<edge STYLE="hide_edge"/>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1947425814" STARTINCLINATION="13;34;" ENDINCLINATION="13;34;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_1143366438" HGAP="110" VSHIFT="-16" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_1143366438" CREATED="1455910859995" MODIFIED="1455910859995" HGAP_QUANTITY="110.0 px" VSHIFT_QUANTITY="-16.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -1025,13 +1041,14 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1143366438" STARTINCLINATION="-41;22;" ENDINCLINATION="-41;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font BOLD="false"/>
<edge STYLE="hide_edge"/>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1143366438" STARTINCLINATION="-41;22;" ENDINCLINATION="-41;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="ノード c" ID="ID_268922755" VGAP="0" VSHIFT="10" TEXT_SHORTENED="true" STYLE="bubble"><richcontent TYPE="DETAILS">
+<node TEXT="ノード c" ID="ID_268922755" CREATED="1455910859995" MODIFIED="1455910859995" VGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true" STYLE="bubble"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1050,9 +1067,11 @@
</body>
</html>
</richcontent>
-<node TEXT="etc." ID="ID_1829616131"/>
+<node TEXT="etc." ID="ID_1829616131" CREATED="1455910859995" MODIFIED="1455910859995"/>
</node>
-<node TEXT="コネクタ
(2ノード間)" STYLE_REF="Reference" ID="ID_389809087" HGAP="140" VSHIFT="79"><richcontent TYPE="NOTE">
+<node TEXT="コネクタ
(2ノード間)" STYLE_REF="Reference" ID="ID_389809087" CREATED="1455910859995" MODIFIED="1455910859995" HGAP_QUANTITY="140.0 px" VSHIFT_QUANTITY="79.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_389809087" STARTINCLINATION="-65;-27;" ENDINCLINATION="-65;-27;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -1075,9 +1094,10 @@
</richcontent>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_389809087" STARTINCLINATION="-65;-27;" ENDINCLINATION="-65;-27;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="ラベル" STYLE_REF="Reference" ID="ID_1560136360" HGAP="0" VSHIFT="99"><richcontent TYPE="NOTE">
+<node TEXT="ラベル" STYLE_REF="Reference" ID="ID_1560136360" CREATED="1455910859995" MODIFIED="1455910859995" HGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="99.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1560136360" STARTINCLINATION="-4;-35;" ENDINCLINATION="-4;-35;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -1099,13 +1119,13 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1560136360" STARTINCLINATION="-4;-35;" ENDINCLINATION="-4;-35;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
-<node TEXT="ノード a の下" ID="ID_975219834" HGAP="27" VSHIFT="34" STYLE="bubble"/>
+<node TEXT="ノード a の下" ID="ID_975219834" CREATED="1455910859996" MODIFIED="1455910859996" HGAP_QUANTITY="27.0 px" VSHIFT_QUANTITY="34.0 px" STYLE="bubble"/>
</node>
-<node TEXT="コネクタ
(相方ノード無し)" STYLE_REF="Reference" POSITION="right" ID="ID_1828022839" HGAP="541" VSHIFT="183">
+<node TEXT="コネクタ
(相方ノード無し)" STYLE_REF="Reference" POSITION="right" ID="ID_1828022839" CREATED="1455910859996" MODIFIED="1455910859996" HGAP_QUANTITY="541.0 px" VSHIFT_QUANTITY="183.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1828022839" STARTINCLINATION="-71;-52;" ENDINCLINATION="-71;-52;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
<richcontent TYPE="NOTE">
@@ -1129,9 +1149,8 @@
</body>
</html>
</richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1828022839" STARTINCLINATION="-71;-52;" ENDINCLINATION="-71;-52;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="ノードコアの書式設定" FOLDED="true" POSITION="left" ID="ID_1983670807" HGAP="10" VSHIFT="49" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+<node TEXT="ノードコアの書式設定" FOLDED="true" POSITION="left" ID="ID_1983670807" CREATED="1455910859996" MODIFIED="1455910859996" HGAP_QUANTITY="10.0 px" VSHIFT_QUANTITY="49.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
<html>
<head>
@@ -1152,7 +1171,7 @@
</body>
</html>
</richcontent>
-<node ID="ID_549836127" STYLE="bubble" VSHIFT="110"><richcontent TYPE="NODE">
+<node ID="ID_549836127" CREATED="1455910859996" MODIFIED="1455910859996" STYLE="bubble" VSHIFT_QUANTITY="110.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1164,32 +1183,35 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="色" ID="ID_803864072">
-<node TEXT="ノードの文字色" ID="ID_1110939341" COLOR="#ff0066"/>
-<node TEXT="ノードの背景色" ID="ID_1683102097" BACKGROUND_COLOR="#00ff00"/>
-<node TEXT="マップの背景色" ID="ID_650309977"/>
+<node TEXT="色" ID="ID_803864072" CREATED="1455910859996" MODIFIED="1455910859996">
+<node TEXT="ノードの文字色" ID="ID_1110939341" CREATED="1455910859996" MODIFIED="1455910859996" COLOR="#ff0066"/>
+<node TEXT="ノードの背景色" ID="ID_1683102097" CREATED="1455910859996" MODIFIED="1455910859996" BACKGROUND_COLOR="#00ff00"/>
+<node TEXT="マップの背景色" ID="ID_650309977" CREATED="1455910859996" MODIFIED="1455910859996"/>
</node>
-<node TEXT="フォント" ID="ID_609278590">
+<node TEXT="フォント" ID="ID_609278590" CREATED="1455910859996" MODIFIED="1455910859996">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Times New Roman" ID="ID_634001381">
+<node TEXT="Times New Roman" ID="ID_634001381" CREATED="1455910859996" MODIFIED="1455910859996">
<font NAME="Times New Roman" SIZE="16"/>
</node>
-<node TEXT="Verdana" ID="ID_595317478">
+<node TEXT="Verdana" ID="ID_595317478" CREATED="1455910859996" MODIFIED="1455910859996">
<font NAME="Verdana" SIZE="12"/>
</node>
-<node TEXT="Dialog font" ID="ID_365055995">
+<node TEXT="Dialog font" ID="ID_365055995" CREATED="1455910859996" MODIFIED="1455910859996">
<font NAME="Dialog" SIZE="21"/>
</node>
</node>
-<node TEXT="点滅" ID="ID_381735248" VSHIFT="-13">
+<node TEXT="点滅" ID="ID_381735248" CREATED="1455910859997" MODIFIED="1455910859997" VSHIFT_QUANTITY="-13.0 px">
<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
</node>
</node>
-<node TEXT="特殊機能" POSITION="left" ID="ID_206364326" VSHIFT="20">
+<node TEXT="" POSITION="left" ID="ID_288630513" CREATED="1455910860001" MODIFIED="1455910860001">
<hook NAME="FirstGroupNode"/>
-<node ENCRYPTED_CONTENT="t/NS/HPSppU= VbQIDGWIdFE=" ID="ID_36040841" TEXT_SHORTENED="true" HGAP="30"><richcontent TYPE="NODE">
+</node>
+<node TEXT="特殊機能" POSITION="left" ID="ID_206364326" CREATED="1455910859997" MODIFIED="1455910859997" VSHIFT_QUANTITY="20.0 px">
+<node ENCRYPTED_CONTENT="t/NS/HPSppU= VbQIDGWIdFE=" ID="ID_36040841" CREATED="1455910859997" MODIFIED="1455910859997" TEXT_SHORTENED="true" HGAP_QUANTITY="30.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1201,6 +1223,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1224,7 +1247,7 @@
</html>
</richcontent>
</node>
-<node ID="ID_49859005" HGAP="30" VSHIFT="10" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_49859005" CREATED="1455910859998" MODIFIED="1455910859998" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -1236,6 +1259,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1258,7 +1282,7 @@
</body>
</html>
</richcontent>
-<node TEXT="=3 + 4" ID="ID_38981929" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="=3 + 4" ID="ID_38981929" CREATED="1455910859998" MODIFIED="1455910859998" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1279,7 +1303,7 @@
</richcontent>
</node>
</node>
-<node ID="ID_1885496887" HGAP="31" VSHIFT="10" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1885496887" CREATED="1455910859998" MODIFIED="1455910859998" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -1291,6 +1315,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
@@ -1318,8 +1343,8 @@
</richcontent>
</node>
</node>
-<node TEXT="その他の機能" POSITION="left" ID="ID_454770946" VSHIFT="30">
-<node ID="ID_1987204825" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="その他の機能" POSITION="left" ID="ID_454770946" CREATED="1455910859999" MODIFIED="1455910859999" VSHIFT_QUANTITY="30.0 px">
+<node ID="ID_1987204825" CREATED="1455910859999" MODIFIED="1455910859999" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -1331,6 +1356,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1355,7 +1381,7 @@
</richcontent>
<edge STYLE="horizontal"/>
</node>
-<node ID="ID_1603681371" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1603681371" CREATED="1455910859999" MODIFIED="1455910859999" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -1367,6 +1393,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1391,7 +1418,7 @@
</richcontent>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="マップの公開とシェア" ID="ID_671406309"><richcontent TYPE="NOTE">
+<node TEXT="マップの公開とシェア" ID="ID_671406309" CREATED="1455910859999" MODIFIED="1455910859999"><richcontent TYPE="NOTE">
<html>
<head>
@@ -1413,7 +1440,7 @@
</html>
</richcontent>
</node>
-<node ID="ID_1058310897" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1058310897" CREATED="1455910860000" MODIFIED="1455910860000" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -1425,6 +1452,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1449,7 +1477,7 @@
</richcontent>
<edge STYLE="horizontal"/>
</node>
-<node ID="ID_739070756" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_739070756" CREATED="1455910860000" MODIFIED="1455910860000" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -1464,6 +1492,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1486,7 +1515,9 @@
<edge STYLE="horizontal"/>
</node>
</node>
-<node TEXT="まとめノード
(波括弧)" POSITION="left" ID="ID_499898058" HGAP="40">
+<node TEXT="" POSITION="left" ID="ID_1396107803" CREATED="1455910860005" MODIFIED="1455910860005">
+<hook NAME="SummaryNode"/>
+<node TEXT="まとめノード
(波括弧)" ID="ID_499898058" CREATED="1455910860000" MODIFIED="1455910860000" HGAP_QUANTITY="40.0 px">
<font BOLD="true"/>
<richcontent TYPE="NOTE">
@@ -1510,7 +1541,7 @@
</html>
</richcontent>
<edge COLOR="#ff00ff" WIDTH="3"/>
-<hook NAME="SummaryNode"/>
+</node>
</node>
</node>
</map>
diff --git a/freeplane/doc/freeplaneFunctions_nl.mm b/freeplane/doc/freeplaneFunctions_nl.mm
index 6aa87c9..c127a71 100644
--- a/freeplane/doc/freeplaneFunctions_nl.mm
+++ b/freeplane/doc/freeplaneFunctions_nl.mm
@@ -1,18 +1,22 @@
-<map version="freeplane 1.2.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node TEXT="Freeplane
Functies" FOLDED="false" ID="ID_45488473" CREATED="1288535648658" MODIFIED="1321016216736" BACKGROUND_COLOR="#00ff99" VGAP="0">
+<node TEXT="Freeplane
Functies" FOLDED="false" ID="ID_45488473" CREATED="1288535648658" MODIFIED="1321016216736" BACKGROUND_COLOR="#00ff99" VGAP_QUANTITY="0.0 px">
<icon BUILTIN="bee"/>
<font BOLD="true"/>
<hook NAME="MapStyle">
- <properties show_icon_for_attributes="false" show_note_icons="false" show_notes_in_map="false"/>
+ <properties fit_to_viewport="false;" show_icon_for_attributes="false" show_note_icons="false" show_notes_in_map="false"/>
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork" MAX_WIDTH="600" MIN_WIDTH="1" FORMAT_AS_HYPERLINK="true">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt">
+<font SIZE="24"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<stylenode LOCALIZED_TEXT="default" FORMAT_AS_HYPERLINK="true" COLOR="#000000" STYLE="fork" MAX_WIDTH="600.0 px" MIN_WIDTH="1.0 px">
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes">
+<font SIZE="9"/>
+</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
<stylenode LOCALIZED_TEXT="defaultstyle.floating">
<edge STYLE="hide_edge"/>
@@ -85,7 +89,7 @@
<font NAME="Liberation Sans" SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
<font SIZE="20"/>
</stylenode>
@@ -104,7 +108,7 @@
<font SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
<stylenode TEXT="Reference">
<icon BUILTIN="help"/>
<edge STYLE="hide_edge"/>
@@ -149,9 +153,8 @@
</body>
</html>
</richcontent>
-<node TEXT="In knoopkern" POSITION="left" ID="ID_1556354626" CREATED="1319792091506" MODIFIED="1323790447061" HGAP="5" VSHIFT="-40" BACKGROUND_COLOR="#ffff00" NUMBERED="true">
+<node TEXT="In knoopkern" POSITION="left" ID="ID_1556354626" CREATED="1319792091506" MODIFIED="1323790447061" HGAP_QUANTITY="5.0 px" VSHIFT_QUANTITY="-40.0 px" BACKGROUND_COLOR="#ffff00" NUMBERED="true">
<font BOLD="false"/>
-<hook NAME="FirstGroupNode"/>
<richcontent TYPE="NOTE">
<html>
@@ -186,6 +189,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -210,7 +214,7 @@
</richcontent>
<edge STYLE="horizontal" WIDTH="thin"/>
</node>
-<node ID="ID_300419503" CREATED="1319798221748" MODIFIED="1336132643156" HGAP="363" VSHIFT="-71" STYLE="bubble"><richcontent TYPE="NODE">
+<node ID="ID_300419503" CREATED="1319798221748" MODIFIED="1336132643156" HGAP_QUANTITY="363.0 px" VSHIFT_QUANTITY="-71.0 px" STYLE="bubble"><richcontent TYPE="NODE">
<html>
<head>
@@ -220,6 +224,7 @@
<img src="Images/doc/freeplaneApplications.png"/>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<edge STYLE="hide_edge"/>
@@ -245,7 +250,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Interne pijl-koppeling, of" ID="ID_1519332680" CREATED="1288542452827" MODIFIED="1323788864205" LINK="#ID_784697063" HGAP="21" VSHIFT="-2" TEXT_SHORTENED="true">
+<node TEXT="Interne pijl-koppeling, of" ID="ID_1519332680" CREATED="1288542452827" MODIFIED="1323788864205" LINK="#ID_784697063" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-2.0 px" TEXT_SHORTENED="true">
<edge STYLE="horizontal" WIDTH="thin"/>
<richcontent TYPE="NOTE">
@@ -269,7 +274,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Externe pijl-koppeling, en" ID="ID_1537075496" CREATED="1288542605210" MODIFIED="1323788903922" LINK="http://kioo.nl/" HGAP="21" VSHIFT="-3" TEXT_SHORTENED="true">
+<node TEXT="Externe pijl-koppeling, en" ID="ID_1537075496" CREATED="1288542605210" MODIFIED="1323788903922" LINK="http://kioo.nl/" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-3.0 px" TEXT_SHORTENED="true">
<edge STYLE="horizontal" WIDTH="thin"/>
<richcontent TYPE="NOTE">
@@ -293,7 +298,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Pictogrammen" ID="ID_233656995" CREATED="1288542843639" MODIFIED="1323788954544" HGAP="21" VSHIFT="-7" TEXT_SHORTENED="true">
+<node TEXT="Pictogrammen" ID="ID_233656995" CREATED="1288542843639" MODIFIED="1323788954544" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-7.0 px" TEXT_SHORTENED="true">
<icon BUILTIN="bookmark"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="closed"/>
@@ -366,7 +371,7 @@
<edge STYLE="horizontal" WIDTH="thin"/>
</node>
</node>
-<node TEXT="Vrij positioneerbare knoop" POSITION="left" ID="ID_1280208201" CREATED="1319797134021" MODIFIED="1323789119624" HGAP="140" VSHIFT="19" TEXT_SHORTENED="true">
+<node TEXT="Vrij positioneerbare knoop" POSITION="left" ID="ID_1280208201" CREATED="1319797134021" MODIFIED="1323789119624" HGAP_QUANTITY="140.0 px" VSHIFT_QUANTITY="19.0 px" TEXT_SHORTENED="true">
<hook NAME="FreeNode"/>
<font BOLD="true"/>
<richcontent TYPE="NOTE">
@@ -403,7 +408,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Zwevende knoop" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_231217112" CREATED="1319797190586" MODIFIED="1323789155332" VSHIFT="10" TEXT_SHORTENED="true">
+<node TEXT="Zwevende knoop" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_231217112" CREATED="1319797190586" MODIFIED="1323789155332" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true">
<font BOLD="true"/>
<richcontent TYPE="NOTE">
@@ -441,7 +446,7 @@
</richcontent>
</node>
</node>
-<node POSITION="right" ID="ID_1077719150" CREATED="1319792123071" MODIFIED="1321038005400" VGAP="0" HGAP="-10" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
+<node POSITION="right" ID="ID_1077719150" CREATED="1319792123071" MODIFIED="1321038005400" VGAP_QUANTITY="0.0 px" HGAP_QUANTITY="-10.0 px" BACKGROUND_COLOR="#ffff00" NUMBERED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -456,6 +461,7 @@
</p>
</body>
</html>
+
</richcontent>
<font BOLD="false"/>
<richcontent TYPE="NOTE">
@@ -480,7 +486,7 @@
</html>
</richcontent>
<edge STYLE="sharp_bezier" COLOR="#cc0000" WIDTH="2"/>
-<node TEXT="Onder deze knoopkern:" ID="ID_1010722858" CREATED="1288646162992" MODIFIED="1336132660269" STYLE="bubble" VGAP="0" VSHIFT="-9">
+<node TEXT="Onder deze knoopkern:" ID="ID_1010722858" CREATED="1288646162992" MODIFIED="1336132660269" STYLE="bubble" VGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="-9.0 px">
<font ITALIC="false"/>
<attribute NAME="a1" VALUE="waarde 1"/>
<attribute NAME="a2" VALUE="waarde 2"/>
@@ -500,7 +506,7 @@
<hook EQUATION="\begin{array}{l}
\mbox{I}^\fgcolor{ff0000}{\heartsuit}\mbox{\JLaTeXMath}\\
\end{array}" NAME="plugins/latex/LatexNodeHook.properties"/>
<edge STYLE="bezier" WIDTH="thin"/>
<hook URI="Images/doc/freeplaneApplications.png" SIZE="0.51111114" NAME="ExternalObject"/>
-<node STYLE_REF="Reference" ID="ID_965583686" CREATED="1319872918353" MODIFIED="1321010685262" HGAP="280" VSHIFT="-11"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_965583686" CREATED="1319872918353" MODIFIED="1321010685262" HGAP_QUANTITY="280.0 px" VSHIFT_QUANTITY="-11.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -512,7 +518,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_965583686" STARTINCLINATION="-68;21;" ENDINCLINATION="-68;21;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="NOTE">
<html>
@@ -536,9 +544,8 @@
</richcontent>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_965583686" STARTINCLINATION="-68;21;" ENDINCLINATION="-68;21;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_242844262" CREATED="1319799725287" MODIFIED="1321011337329" HGAP="390" VSHIFT="39" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_242844262" CREATED="1319799725287" MODIFIED="1321011337329" HGAP_QUANTITY="390.0 px" VSHIFT_QUANTITY="39.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -555,6 +562,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<edge STYLE="hide_edge"/>
@@ -583,7 +591,8 @@
</html>
</richcontent>
</node>
-<node TEXT="Attributen" STYLE_REF="Reference" ID="ID_1546010515" CREATED="1319872918353" MODIFIED="1321038090373" HGAP="260" VSHIFT="59">
+<node TEXT="Attributen" STYLE_REF="Reference" ID="ID_1546010515" CREATED="1319872918353" MODIFIED="1321038090373" HGAP_QUANTITY="260.0 px" VSHIFT_QUANTITY="59.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1546010515" STARTINCLINATION="-61;0;" ENDINCLINATION="-61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="FreeNode"/>
<richcontent TYPE="NOTE">
@@ -609,9 +618,8 @@
</body>
</html>
</richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1546010515" STARTINCLINATION="-61;0;" ENDINCLINATION="-61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node STYLE_REF="Reference" ID="ID_1064212525" CREATED="1319872918353" MODIFIED="1321010842194" HGAP="240" VSHIFT="119"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_1064212525" CREATED="1319872918353" MODIFIED="1321010842194" HGAP_QUANTITY="240.0 px" VSHIFT_QUANTITY="119.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -623,7 +631,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1064212525" STARTINCLINATION="-94;-18;" ENDINCLINATION="-94;-18;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="NOTE">
<html>
@@ -647,9 +657,8 @@
</richcontent>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1064212525" STARTINCLINATION="-94;-18;" ENDINCLINATION="-94;-18;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node STYLE_REF="Reference" ID="ID_1639134686" CREATED="1319873881764" MODIFIED="1323790279907" HGAP="-20" VSHIFT="90"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_1639134686" CREATED="1319873881764" MODIFIED="1323790279907" HGAP_QUANTITY="-20.0 px" VSHIFT_QUANTITY="90.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -661,7 +670,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1639134686" STARTINCLINATION="-108;-23;" ENDINCLINATION="-108;-23;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font BOLD="false"/>
<richcontent TYPE="NOTE">
@@ -684,9 +695,8 @@
</body>
</html>
</richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1639134686" STARTINCLINATION="-108;-23;" ENDINCLINATION="-108;-23;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_1802101455" CREATED="1319799725287" MODIFIED="1321016344016" HGAP="200" VSHIFT="209" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_1802101455" CREATED="1319799725287" MODIFIED="1321016344016" HGAP_QUANTITY="200.0 px" VSHIFT_QUANTITY="209.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -703,13 +713,18 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1802101455" STARTINCLINATION="-53;-31;" ENDINCLINATION="-53;-31;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<edge STYLE="hide_edge"/>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1802101455" STARTINCLINATION="-53;-31;" ENDINCLINATION="-53;-31;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
-<node TEXT="Takken" STYLE_REF="Reference" FOLDED="true" ID="ID_1944496966" CREATED="1319872918353" MODIFIED="1321010423422" HGAP="-60" VSHIFT="-91"><richcontent TYPE="NOTE">
+<node TEXT="Takken" STYLE_REF="Reference" FOLDED="true" ID="ID_1944496966" CREATED="1319872918353" MODIFIED="1321010423422" HGAP_QUANTITY="-60.0 px" VSHIFT_QUANTITY="-91.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-28;99;" ENDINCLINATION="-28;99;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="120;32;" ENDINCLINATION="120;32;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-121;31;" ENDINCLINATION="-121;31;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -731,35 +746,31 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="120;32;" ENDINCLINATION="120;32;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-121;31;" ENDINCLINATION="-121;31;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1944496966" STARTINCLINATION="-28;99;" ENDINCLINATION="-28;99;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="Opmaken tak" ID="ID_1601648824" CREATED="1319796287461" MODIFIED="1321037919116" HGAP="30" VSHIFT="-172">
+<node TEXT="Opmaken tak" ID="ID_1601648824" CREATED="1319796287461" MODIFIED="1321037919116" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="-172.0 px">
<edge STYLE="bezier"/>
-<node TEXT="dikte tak" ID="ID_241458321" CREATED="1288541466835" MODIFIED="1288646970331" VSHIFT="7">
-<node TEXT="dun" ID="ID_1693976270" CREATED="1288541473878" MODIFIED="1288541507504" HGAP="42"/>
-<node TEXT="punt 3" ID="ID_1152182019" CREATED="1288542920337" MODIFIED="1288542944097" HGAP="42" VSHIFT="9">
+<node TEXT="dikte tak" ID="ID_241458321" CREATED="1288541466835" MODIFIED="1288646970331" VSHIFT_QUANTITY="7.0 px">
+<node TEXT="dun" ID="ID_1693976270" CREATED="1288541473878" MODIFIED="1288541507504" HGAP_QUANTITY="42.0 px"/>
+<node TEXT="punt 3" ID="ID_1152182019" CREATED="1288542920337" MODIFIED="1288542944097" HGAP_QUANTITY="42.0 px" VSHIFT_QUANTITY="9.0 px">
<edge WIDTH="2"/>
</node>
-<node TEXT="punt 8" ID="ID_1828139471" CREATED="1288541479345" MODIFIED="1288542967746" HGAP="42" VSHIFT="5">
+<node TEXT="punt 8" ID="ID_1828139471" CREATED="1288541479345" MODIFIED="1288542967746" HGAP_QUANTITY="42.0 px" VSHIFT_QUANTITY="5.0 px">
<edge WIDTH="8"/>
</node>
</node>
-<node TEXT="vorm tak" ID="ID_784697063" CREATED="1288536745875" MODIFIED="1289122245318" HGAP="21" VSHIFT="1">
-<node TEXT="Rechte lijn" ID="ID_884692926" CREATED="1288538234095" MODIFIED="1305276198448" HGAP="53" VSHIFT="-1">
+<node TEXT="vorm tak" ID="ID_784697063" CREATED="1288536745875" MODIFIED="1289122245318" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="1.0 px">
+<node TEXT="Rechte lijn" ID="ID_884692926" CREATED="1288538234095" MODIFIED="1305276198448" HGAP_QUANTITY="53.0 px" VSHIFT_QUANTITY="-1.0 px">
<edge STYLE="linear" WIDTH="4"/>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="Bocht" ID="ID_609820168" CREATED="1288538240451" MODIFIED="1288539867421" HGAP="57" VSHIFT="9">
+<node TEXT="Bocht" ID="ID_609820168" CREATED="1288538240451" MODIFIED="1288539867421" HGAP_QUANTITY="57.0 px" VSHIFT_QUANTITY="9.0 px">
<edge STYLE="bezier" WIDTH="4"/>
</node>
-<node TEXT="Taps toelopend recht" ID="ID_1647821228" CREATED="1288538242377" MODIFIED="1288540221963" HGAP="60" VSHIFT="10">
+<node TEXT="Taps toelopend recht" ID="ID_1647821228" CREATED="1288538242377" MODIFIED="1288540221963" HGAP_QUANTITY="60.0 px" VSHIFT_QUANTITY="10.0 px">
<edge STYLE="sharp_linear" WIDTH="4"/>
</node>
-<node TEXT="Taps toelopend bocht" ID="ID_895403951" CREATED="1288538470332" MODIFIED="1288540434497" HGAP="70" VSHIFT="15">
+<node TEXT="Taps toelopend bocht" ID="ID_895403951" CREATED="1288538470332" MODIFIED="1288540434497" HGAP_QUANTITY="70.0 px" VSHIFT_QUANTITY="15.0 px">
<edge STYLE="sharp_bezier" WIDTH="4"/>
</node>
-<node TEXT="Verborgen tak" ID="ID_1675552701" CREATED="1288538507390" MODIFIED="1288548679856" HGAP="77" VSHIFT="18" BACKGROUND_COLOR="#00ffff">
+<node TEXT="Verborgen tak" ID="ID_1675552701" CREATED="1288538507390" MODIFIED="1288548679856" HGAP_QUANTITY="77.0 px" VSHIFT_QUANTITY="18.0 px" BACKGROUND_COLOR="#00ffff">
<edge STYLE="hide_edge" WIDTH="4"/>
</node>
</node>
@@ -784,6 +795,7 @@
</p>
</body>
</html>
+
</richcontent>
<edge STYLE="sharp_bezier" COLOR="#006633" WIDTH="2"/>
<richcontent TYPE="NOTE">
@@ -808,7 +820,9 @@
</html>
</richcontent>
</node>
-<node TEXT="Wolk" STYLE_REF="Reference" FOLDED="true" POSITION="right" ID="ID_1697684606" CREATED="1319873881764" MODIFIED="1323790359358" HGAP="550" VSHIFT="79"><richcontent TYPE="NOTE">
+<node TEXT="Wolk" STYLE_REF="Reference" FOLDED="true" POSITION="right" ID="ID_1697684606" CREATED="1319873881764" MODIFIED="1323790359358" HGAP_QUANTITY="550.0 px" VSHIFT_QUANTITY="79.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1697684606" STARTINCLINATION="-90;73;" ENDINCLINATION="-90;73;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -830,8 +844,7 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1697684606" STARTINCLINATION="-90;73;" ENDINCLINATION="-90;73;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="rechthoek" ID="ID_1198357672" CREATED="1305277572322" MODIFIED="1321038483416" HGAP="48" VSHIFT="4">
+<node TEXT="rechthoek" ID="ID_1198357672" CREATED="1305277572322" MODIFIED="1321038483416" HGAP_QUANTITY="48.0 px" VSHIFT_QUANTITY="4.0 px">
<cloud COLOR="#f0f0f0" SHAPE="RECT"/>
<richcontent TYPE="NOTE">
@@ -880,7 +893,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Relaties" POSITION="right" ID="ID_441663322" CREATED="1288536353356" MODIFIED="1321011073861" STYLE="fork" HGAP="-41" VSHIFT="37"><richcontent TYPE="NOTE">
+<node TEXT="Relaties" POSITION="right" ID="ID_441663322" CREATED="1288536353356" MODIFIED="1321011073861" STYLE="fork" HGAP_QUANTITY="-41.0 px" VSHIFT_QUANTITY="37.0 px"><richcontent TYPE="NOTE">
<html>
<head>
@@ -894,12 +907,12 @@
</html>
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="boven a" ID="ID_1863548649" CREATED="1288536207761" MODIFIED="1321011061055" HGAP="37" VSHIFT="-13" STYLE="bubble"/>
-<node TEXT="knoop a" ID="ID_1119041406" CREATED="1288535672221" MODIFIED="1336118905285" STYLE="bubble" HGAP="53" VSHIFT="7">
+<node TEXT="boven a" ID="ID_1863548649" CREATED="1288536207761" MODIFIED="1321011061055" HGAP_QUANTITY="37.0 px" VSHIFT_QUANTITY="-13.0 px" STYLE="bubble"/>
+<node TEXT="knoop a" ID="ID_1119041406" CREATED="1288535672221" MODIFIED="1336118905285" STYLE="bubble" HGAP_QUANTITY="53.0 px" VSHIFT_QUANTITY="7.0 px">
<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff0000" WIDTH="5" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_268922755" SOURCE_LABEL="ouder" TARGET_LABEL="kleinkind" MIDDLE_LABEL="hierarchie" STARTINCLINATION="-2;23;" ENDINCLINATION="-21;59;" STARTARROW="NONE" ENDARROW="NONE"/>
-<node TEXT="knoop b" ID="ID_1908863616" CREATED="1288535688688" MODIFIED="1321011087862" VGAP="0" VSHIFT="10" STYLE="bubble">
+<node TEXT="knoop b" ID="ID_1908863616" CREATED="1288535688688" MODIFIED="1321011087862" VGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="10.0 px" STYLE="bubble">
<edge STYLE="bezier" WIDTH="thin"/>
-<node ID="ID_1947425814" CREATED="1319799725287" MODIFIED="1323790434784" HGAP="5" VSHIFT="-46" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_1947425814" CREATED="1319799725287" MODIFIED="1323790434784" HGAP_QUANTITY="5.0 px" VSHIFT_QUANTITY="-46.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -913,12 +926,13 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1947425814" STARTINCLINATION="4;47;" ENDINCLINATION="4;47;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<edge STYLE="hide_edge"/>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1947425814" STARTINCLINATION="4;47;" ENDINCLINATION="4;47;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_1143366438" CREATED="1319799725287" MODIFIED="1323790424238" HGAP="105" VSHIFT="-21" BACKGROUND_COLOR="#ffff99">
+<node ID="ID_1143366438" CREATED="1319799725287" MODIFIED="1323790424238" HGAP_QUANTITY="105.0 px" VSHIFT_QUANTITY="-21.0 px" BACKGROUND_COLOR="#ffff99">
<icon BUILTIN="yes"/>
<richcontent TYPE="NODE">
@@ -932,13 +946,14 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1143366438" STARTINCLINATION="-41;22;" ENDINCLINATION="-41;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font BOLD="false"/>
<edge STYLE="hide_edge"/>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1143366438" STARTINCLINATION="-41;22;" ENDINCLINATION="-41;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="knoop c" FOLDED="true" ID="ID_268922755" CREATED="1288535699522" MODIFIED="1321011094420" VGAP="0" VSHIFT="10" TEXT_SHORTENED="true" STYLE="bubble"><richcontent TYPE="DETAILS">
+<node TEXT="knoop c" FOLDED="true" ID="ID_268922755" CREATED="1288535699522" MODIFIED="1321011094420" VGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true" STYLE="bubble"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -959,7 +974,7 @@
</richcontent>
<node TEXT="etc." ID="ID_1829616131" CREATED="1319919735822" MODIFIED="1319919743997"/>
</node>
-<node STYLE_REF="Reference" ID="ID_389809087" CREATED="1319872918353" MODIFIED="1321039088884" HGAP="140" VSHIFT="79"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" ID="ID_389809087" CREATED="1319872918353" MODIFIED="1321039088884" HGAP_QUANTITY="140.0 px" VSHIFT_QUANTITY="79.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -974,7 +989,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_389809087" STARTINCLINATION="-80;-24;" ENDINCLINATION="-80;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="NOTE">
<html>
@@ -998,9 +1015,10 @@
</richcontent>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_389809087" STARTINCLINATION="-80;-24;" ENDINCLINATION="-80;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Label" STYLE_REF="Reference" ID="ID_1560136360" CREATED="1319872918353" MODIFIED="1321039208926" HGAP="0" VSHIFT="99"><richcontent TYPE="NOTE">
+<node TEXT="Label" STYLE_REF="Reference" ID="ID_1560136360" CREATED="1319872918353" MODIFIED="1321039208926" HGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="99.0 px">
+<arrowlink SHAPE="LINE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1560136360" STARTINCLINATION="-4;-35;" ENDINCLINATION="-4;-35;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<richcontent TYPE="NOTE">
<html>
<head>
@@ -1022,13 +1040,12 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0033cc" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1560136360" STARTINCLINATION="-4;-35;" ENDINCLINATION="-4;-35;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
-<node TEXT="onder a" ID="ID_975219834" CREATED="1288536218798" MODIFIED="1321011102143" HGAP="27" VSHIFT="34" STYLE="bubble"/>
+<node TEXT="onder a" ID="ID_975219834" CREATED="1288536218798" MODIFIED="1321011102143" HGAP_QUANTITY="27.0 px" VSHIFT_QUANTITY="34.0 px" STYLE="bubble"/>
</node>
-<node STYLE_REF="Reference" POSITION="right" ID="ID_1828022839" CREATED="1319963720129" MODIFIED="1321010997120" HGAP="524" VSHIFT="189"><richcontent TYPE="NODE">
+<node STYLE_REF="Reference" POSITION="right" ID="ID_1828022839" CREATED="1319963720129" MODIFIED="1321010997120" HGAP_QUANTITY="524.0 px" VSHIFT_QUANTITY="189.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1043,7 +1060,9 @@
</p>
</body>
</html>
+
</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1828022839" STARTINCLINATION="-46;-50;" ENDINCLINATION="-46;-50;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="FreeNode"/>
<font BOLD="false"/>
<richcontent TYPE="NOTE">
@@ -1067,9 +1086,8 @@
</body>
</html>
</richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" DASH="3 3" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1828022839" STARTINCLINATION="-46;-50;" ENDINCLINATION="-46;-50;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Opmaken knoopkern" FOLDED="true" POSITION="left" ID="ID_1983670807" CREATED="1319795759589" MODIFIED="1321035141763" HGAP="10" VSHIFT="49" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+<node TEXT="Opmaken knoopkern" FOLDED="true" POSITION="left" ID="ID_1983670807" CREATED="1319795759589" MODIFIED="1321035141763" HGAP_QUANTITY="10.0 px" VSHIFT_QUANTITY="49.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
<html>
<head>
@@ -1090,7 +1108,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Omlijnde knoopkern" ID="ID_1794331644" CREATED="1288536624648" MODIFIED="1321037674632" STYLE="bubble" VSHIFT="110"/>
+<node TEXT="Omlijnde knoopkern" ID="ID_1794331644" CREATED="1288536624648" MODIFIED="1321037674632" STYLE="bubble" VSHIFT_QUANTITY="110.0 px"/>
<node TEXT="Kleur" ID="ID_1602479950" CREATED="1288536644733" MODIFIED="1321037781539">
<node TEXT="Knoopkleur" ID="ID_1350125844" CREATED="1288536652401" MODIFIED="1321037697705" COLOR="#ff0066"/>
<node TEXT="Knoopachtergrondkleur" ID="ID_113421480" CREATED="1288536658726" MODIFIED="1321037764067" BACKGROUND_COLOR="#00ff00"/>
@@ -1108,11 +1126,11 @@
<font NAME="Dialog" SIZE="21"/>
</node>
</node>
-<node TEXT="Knipperen" ID="ID_1280590016" CREATED="1288548004325" MODIFIED="1321037796874" VSHIFT="-13">
+<node TEXT="Knipperen" ID="ID_1280590016" CREATED="1288548004325" MODIFIED="1321037796874" VSHIFT_QUANTITY="-13.0 px">
<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
</node>
</node>
-<node TEXT="Vrije + zwevende knoop" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_188185624" CREATED="1319788879948" MODIFIED="1323789179419" HGAP="418" VSHIFT="72" TEXT_SHORTENED="true">
+<node TEXT="Vrije + zwevende knoop" LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_188185624" CREATED="1319788879948" MODIFIED="1323789179419" HGAP_QUANTITY="418.0 px" VSHIFT_QUANTITY="72.0 px" TEXT_SHORTENED="true">
<hook NAME="FreeNode"/>
<font BOLD="true"/>
<richcontent TYPE="DETAILS">
@@ -1150,9 +1168,11 @@
</html>
</richcontent>
</node>
-<node TEXT="Speciaal" POSITION="left" ID="ID_206364326" CREATED="1319795251644" MODIFIED="1321009985956" VSHIFT="20">
+<node TEXT="" POSITION="left" ID="ID_445314439" CREATED="1455910866417" MODIFIED="1455910866417">
<hook NAME="FirstGroupNode"/>
-<node TEXT="Beveiligen met wachtwoord" ENCRYPTED_CONTENT="t/NS/HPSppU= VbQIDGWIdFE=" ID="ID_36040841" CREATED="1288542236861" MODIFIED="1321035430738" TEXT_SHORTENED="true" HGAP="30"><richcontent TYPE="NOTE">
+</node>
+<node TEXT="Speciaal" POSITION="left" ID="ID_206364326" CREATED="1319795251644" MODIFIED="1321009985956" VSHIFT_QUANTITY="20.0 px">
+<node TEXT="Beveiligen met wachtwoord" ENCRYPTED_CONTENT="t/NS/HPSppU= VbQIDGWIdFE=" ID="ID_36040841" CREATED="1288542236861" MODIFIED="1321035430738" TEXT_SHORTENED="true" HGAP_QUANTITY="30.0 px"><richcontent TYPE="NOTE">
<html>
<head>
@@ -1174,7 +1194,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Bereken = 4 + 3" ID="ID_49859005" CREATED="1319800320485" MODIFIED="1321035490783" HGAP="30" VSHIFT="10" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
+<node TEXT="Bereken = 4 + 3" ID="ID_49859005" CREATED="1319800320485" MODIFIED="1321035490783" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
<html>
<head>
@@ -1216,7 +1236,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Herinnering (Agenda)" ID="ID_1885496887" CREATED="1288542096079" MODIFIED="1321035618625" HGAP="31" VSHIFT="10" TEXT_SHORTENED="true">
+<node TEXT="Herinnering (Agenda)" ID="ID_1885496887" CREATED="1288542096079" MODIFIED="1321035618625" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="10.0 px" TEXT_SHORTENED="true">
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
</hook>
@@ -1243,7 +1263,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Overig" POSITION="left" ID="ID_454770946" CREATED="1319875565802" MODIFIED="1321011282877" HGAP="10" VSHIFT="30">
+<node TEXT="Overig" POSITION="left" ID="ID_454770946" CREATED="1319875565802" MODIFIED="1321011282877" HGAP_QUANTITY="10.0 px" VSHIFT_QUANTITY="30.0 px">
<node TEXT="Filter en sorteer" ID="ID_1987204825" CREATED="1319925023100" MODIFIED="1321035763908" TEXT_SHORTENED="true"><richcontent TYPE="NOTE">
<html>
@@ -1302,6 +1322,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1338,6 +1359,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="NOTE">
@@ -1360,7 +1382,9 @@
<edge STYLE="horizontal"/>
</node>
</node>
-<node TEXT="Groepsknoop
met accollade" POSITION="left" ID="ID_499898058" CREATED="1319795597294" MODIFIED="1321037578474" HGAP="40">
+<node TEXT="" POSITION="left" ID="ID_1736833399" CREATED="1455910866421" MODIFIED="1455910866421">
+<hook NAME="SummaryNode"/>
+<node TEXT="Groepsknoop
met accollade" ID="ID_499898058" CREATED="1319795597294" MODIFIED="1321037578474" HGAP_QUANTITY="40.0 px">
<font BOLD="true"/>
<richcontent TYPE="NOTE">
@@ -1384,7 +1408,7 @@
</html>
</richcontent>
<edge COLOR="#ff00ff" WIDTH="3"/>
-<hook NAME="SummaryNode"/>
+</node>
</node>
</node>
</map>
diff --git a/freeplane/doc/freeplaneTutorial.mm b/freeplane/doc/freeplaneTutorial.mm
index 9dc2aa7..a64c834 100644
--- a/freeplane/doc/freeplaneTutorial.mm
+++ b/freeplane/doc/freeplaneTutorial.mm
@@ -1,4 +1,4 @@
-<map version="freeplane 1.2.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
<attribute_registry>
<attribute_name VISIBLE="true" NAME="See also"/>
@@ -10,7 +10,7 @@
<html>
<head>
-
+
</head>
<body>
<p>
@@ -21,6 +21,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="MapStyle">
<conditional_styles>
@@ -31,11 +32,12 @@
</conjunct_condition>
</conditional_style>
</conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true" show_notes_in_map="false"/>
+ <properties fit_to_viewport="false;" show_icon_for_attributes="false" show_note_icons="true" show_notes_in_map="false"/>
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt">
+<font SIZE="24"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="defaultstyle.details">
<font SIZE="8"/>
</stylenode>
@@ -43,13 +45,16 @@
<edge COLOR="#808080" WIDTH="thin"/>
<font SIZE="8"/>
</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes">
+<font SIZE="9"/>
+</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.floating">
<edge STYLE="hide_edge"/>
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
<font SIZE="12"/>
</stylenode>
@@ -66,7 +71,7 @@
<font SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
<stylenode TEXT="Beginner" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
<font BOLD="true"/>
<edge STYLE="bezier" COLOR="#33ffcc"/>
@@ -115,8 +120,8 @@
<attribute NAME="birth date" VALUE=""/>
<attribute NAME="e-mail" VALUE=""/>
</stylenode>
-<stylenode TEXT="MainWidth" MIN_WIDTH="600"/>
-<stylenode TEXT="SubWidth" MAX_WIDTH="550" MIN_WIDTH="550"/>
+<stylenode TEXT="MainWidth" MIN_WIDTH="600.0 px"/>
+<stylenode TEXT="SubWidth" MAX_WIDTH="550.0 px" MIN_WIDTH="550.0 px"/>
<stylenode TEXT="Method" STYLE="as_parent">
<edge STYLE="horizontal"/>
</stylenode>
@@ -137,11 +142,11 @@
</map_styles>
</hook>
<hook NAME="FirstGroupNode"/>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_232622736" CREATED="1320005728532" MODIFIED="1334522518454" HGAP="0" VSHIFT="-94" LINK="freeplaneFunctions.mm" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_232622736" CREATED="1320005728532" MODIFIED="1334522518454" LINK="freeplaneFunctions.mm" HGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="-94.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p style="text-align: center">
@@ -149,6 +154,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -176,49 +182,49 @@
</html>
</richcontent>
</node>
-<node TEXT="Introduction" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_86446891" CREATED="1314121556502" MODIFIED="1341130602702" BACKGROUND_COLOR="#00cc33" NUMBERED="true" MIN_WIDTH="200" HGAP="22" VSHIFT="16">
-<hook NAME="FirstGroupNode"/>
+<node TEXT="Introduction" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_86446891" CREATED="1314121556502" MODIFIED="1341130602702" BACKGROUND_COLOR="#00cc33" NUMBERED="true" MIN_WIDTH="200.0 px" HGAP_QUANTITY="22.0 px" VSHIFT_QUANTITY="16.0 px">
<node TEXT="Goal" STYLE_REF="Beginner" FOLDED="true" ID="ID_1074607965" CREATED="1314422854653" MODIFIED="1335300198070">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1704300991" CREATED="1323439375808" MODIFIED="1335090069692" HGAP="-13" VSHIFT="89" STYLE="fork"><richcontent TYPE="NODE">
+<node ID="ID_1704300991" CREATED="1323439375808" MODIFIED="1335090069692" HGAP_QUANTITY="-13.0 px" VSHIFT_QUANTITY="89.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Freeplane is meant to facilitate thinking, sharing information and getting things done at work, in school and at home. The software supports creating, sharing and using <a href="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane#What_is_mind_mapping">mind maps</a>, which are a kind of <a href="http://www.informationtamers.com/WikIT/index.php?title=Information_map_types">information maps</a>. The <a href="http://freeplane.sourceforge.net/wiki/index.php/Tuto [...]
</p>
<p>
-
+
</p>
<p>
The goal of this Tutorial is to describe the most used functions of Freeplane in a simple and systematic way. For more and more detailed information, see the documentation at <a href="freeplane.mm">Help > Documentation</a>.
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Reading guide" STYLE_REF="Beginner" FOLDED="true" ID="ID_195004053" CREATED="1316097186850" MODIFIED="1335300198085" MIN_WIDTH="1">
-<node ID="ID_525900700" CREATED="1323439682466" MODIFIED="1341133410954" STYLE="fork" HGAP="-81" VSHIFT="207"><richcontent TYPE="NODE">
+<node TEXT="Reading guide" STYLE_REF="Beginner" FOLDED="true" ID="ID_195004053" CREATED="1316097186850" MODIFIED="1335300198085" MIN_WIDTH="1.0 px">
+<node ID="ID_525900700" CREATED="1323439682466" MODIFIED="1341133410954" STYLE="fork" HGAP_QUANTITY="-81.0 px" VSHIFT_QUANTITY="207.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
It is a general practice that people don't like reading manuals. Therefore you only need to read the introduction of this<i> Tutorial</i> to be ready to start mind mapping using the Freeplan main menu bar. The main editing functions are to be found in <i>menu Edit</i>. And some very special functions are to be found in <i>menu Tools</i>.
</p>
<p>
-
+
</p>
<p>
The chapters after the Introduction are worth reading for the following reason. In Freeplane the same result can be achieved in a number of ways. Using the Freeplane menu generally is not the fastest and most effcient way. The different chapters cover all of the functionality and show what is the most efficient way of doing using socalled context menus. You do not need to read the chapters in order, but can pick the things you are needing at the moment. To help you pick the section [...]
@@ -253,41 +259,41 @@
</node>
</node>
<node TEXT="Main menu's" STYLE_REF="Beginner" FOLDED="true" ID="ID_767122736" CREATED="1333268936129" MODIFIED="1335300198085">
-<node TEXT="" ID="ID_1720964325" CREATED="1333220288493" MODIFIED="1341130811645" HGAP="64" VSHIFT="30" STYLE="fork">
+<node TEXT="" ID="ID_1720964325" CREATED="1333220288493" MODIFIED="1341130811645" HGAP_QUANTITY="64.0 px" VSHIFT_QUANTITY="30.0 px" STYLE="fork">
<edge STYLE="hide_edge"/>
<hook URI="Images/doc/MenusPropertiesPanel.png" SIZE="0.43956044" NAME="ExternalObject"/>
-<node TEXT="Menu bar" ID="ID_745779360" CREATED="1333220342855" MODIFIED="1333266989761" HGAP="-712" VSHIFT="17">
+<node TEXT="Menu bar" ID="ID_745779360" CREATED="1333220342855" MODIFIED="1333266989761" HGAP_QUANTITY="-712.0 px" VSHIFT_QUANTITY="17.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_745779360" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_745779360" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Tool bar" ID="ID_1924639373" CREATED="1333220356591" MODIFIED="1333266997202" HGAP="-703" VSHIFT="-1">
+<node TEXT="Tool bar" ID="ID_1924639373" CREATED="1333220356591" MODIFIED="1333266997202" HGAP_QUANTITY="-703.0 px" VSHIFT_QUANTITY="-1.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1924639373" STARTINCLINATION="40;-5;" ENDINCLINATION="40;-5;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1924639373" STARTINCLINATION="40;-5;" ENDINCLINATION="40;-5;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Filter bar" ID="ID_1939718780" CREATED="1333220363978" MODIFIED="1333267003426" HGAP="-711">
+<node TEXT="Filter bar" ID="ID_1939718780" CREATED="1333220363978" MODIFIED="1333267003426" HGAP_QUANTITY="-711.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1939718780" STARTINCLINATION="43;-13;" ENDINCLINATION="43;-13;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1939718780" STARTINCLINATION="43;-13;" ENDINCLINATION="43;-13;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="F-bar" ID="ID_1406478692" CREATED="1333220384297" MODIFIED="1333267009853" HGAP="-688">
+<node TEXT="F-bar" ID="ID_1406478692" CREATED="1333220384297" MODIFIED="1333267009853" HGAP_QUANTITY="-688.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1406478692" STARTINCLINATION="46;-24;" ENDINCLINATION="46;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1406478692" STARTINCLINATION="46;-24;" ENDINCLINATION="46;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Icon bar" ID="ID_1865250955" CREATED="1333220561873" MODIFIED="1333267016218" HGAP="-706" VSHIFT="-2">
+<node TEXT="Icon bar" ID="ID_1865250955" CREATED="1333220561873" MODIFIED="1333267016218" HGAP_QUANTITY="-706.0 px" VSHIFT_QUANTITY="-2.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1865250955" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1865250955" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Properties Panel" ID="ID_303482588" CREATED="1333220390249" MODIFIED="1333280327138" HGAP="-146" VSHIFT="30">
+<node TEXT="Properties Panel" ID="ID_303482588" CREATED="1333220390249" MODIFIED="1333280327138" HGAP_QUANTITY="-146.0 px" VSHIFT_QUANTITY="30.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_303482588" STARTINCLINATION="20;-28;" ENDINCLINATION="20;-28;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_303482588" STARTINCLINATION="20;-28;" ENDINCLINATION="20;-28;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
-<node TEXT="Background
context menu" ID="ID_1471702513" CREATED="1333177207314" MODIFIED="1336131961095" HGAP="34" VSHIFT="-6"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Background
context menu" ID="ID_1471702513" CREATED="1333177207314" MODIFIED="1336131961095" HGAP_QUANTITY="34.0 px" VSHIFT_QUANTITY="-6.0 px"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -301,18 +307,18 @@
</html>
</richcontent>
<hook URI="Images/mouse/mouse_RB.png" SIZE="1.0" NAME="ExternalObject"/>
-<node TEXT="Background Context Menu" ID="ID_1485150857" CREATED="1333223496821" MODIFIED="1336131984089" VSHIFT="180" STYLE="fork">
+<node TEXT="Background Context Menu" ID="ID_1485150857" CREATED="1333223496821" MODIFIED="1336131984089" VSHIFT_QUANTITY="180.0 px" STYLE="fork">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1485150857" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
<font BOLD="true" ITALIC="true"/>
<hook URI="Images/doc/BackgroundContextMenu.png" SIZE="1.0" NAME="ExternalObject"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1485150857" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
-<node TEXT="Open/close
Properties panel" ID="ID_724121688" CREATED="1333267051623" MODIFIED="1341130818119" HGAP="56">
+<node TEXT="Open/close
Properties panel" ID="ID_724121688" CREATED="1333267051623" MODIFIED="1341130818119" HGAP_QUANTITY="56.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_724121688" STARTINCLINATION="97;-188;" ENDINCLINATION="97;-188;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
<edge STYLE="hide_edge"/>
<font BOLD="true" ITALIC="true"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_724121688" STARTINCLINATION="97;-188;" ENDINCLINATION="97;-188;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
</node>
</node>
</node>
-<node TEXT="Help > Key reference" ID="ID_291675950" CREATED="1333224017380" MODIFIED="1333278200067" HGAP="39" VSHIFT="-217" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Help > Key reference" ID="ID_291675950" CREATED="1333224017380" MODIFIED="1333278200067" HGAP_QUANTITY="39.0 px" VSHIFT_QUANTITY="-217.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -325,33 +331,34 @@
</body>
</html>
</richcontent>
-<node TEXT="Hot keys table" ID="ID_1337797684" CREATED="1333278113064" MODIFIED="1341130885855" HGAP="-76" VSHIFT="190">
+<node TEXT="Hot keys table" ID="ID_1337797684" CREATED="1333278113064" MODIFIED="1341130885855" HGAP_QUANTITY="-76.0 px" VSHIFT_QUANTITY="190.0 px">
<hook URI="Images/doc/HotKeysTable.png" SIZE="0.8633093" NAME="ExternalObject"/>
</node>
</node>
</node>
-<node TEXT="Nodes" STYLE_REF="Beginner" FOLDED="true" ID="ID_1368882439" CREATED="1316154547031" MODIFIED="1335300198085" MIN_WIDTH="1">
+<node TEXT="Nodes" STYLE_REF="Beginner" FOLDED="true" ID="ID_1368882439" CREATED="1316154547031" MODIFIED="1335300198085" MIN_WIDTH="1.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_859940648" CREATED="1323460494762" MODIFIED="1335091084815" HGAP="-24" VSHIFT="88"><richcontent TYPE="NODE">
+<node ID="ID_859940648" CREATED="1323460494762" MODIFIED="1335091084815" HGAP_QUANTITY="-24.0 px" VSHIFT_QUANTITY="88.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
A mind map is a plane consisting of so called <b>nodes</b> which can display information. In a sense, a node is comparable to a <b>paragraph</b> of a book which can display text, images and other types of information. The difference being that nodes can be moved around and be hidden more easily. This makes maps more versatile in situations where information is being developed or information must be displayed selectively, depending on the users need.
</p>
<p>
-
+
</p>
<p>
The text you are reading right now is in a node. The text above, "<i>Nodes</i>" is a node. Also the text to the left, "<i>Introduction</i>" is a node. The big oval to the left is a special node called <b>root</b>.
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -362,11 +369,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1269567767" CREATED="1323465595335" MODIFIED="1335091096343" HGAP="-86" VSHIFT="97"><richcontent TYPE="NODE">
+<node ID="ID_1269567767" CREATED="1323465595335" MODIFIED="1335091096343" HGAP_QUANTITY="-86.0 px" VSHIFT_QUANTITY="97.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -385,7 +392,7 @@
Nodes which ar at the same level, but not mutually connected, are called <b>siblings</b>.
</p>
<p>
-
+
</p>
<p>
As a rule a node's position is rescricted by its position in the family tree. The exception
@@ -398,11 +405,12 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="(relative) parent" STYLE_REF="ConsumerTopic" ID="ID_687495618" CREATED="1314131160308" MODIFIED="1323465789150" VSHIFT="20">
+<node TEXT="(relative) parent" STYLE_REF="ConsumerTopic" ID="ID_687495618" CREATED="1314131160308" MODIFIED="1323465789150" VSHIFT_QUANTITY="20.0 px">
<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1105307139" MIDDLE_LABEL="descendancy" STARTINCLINATION="25;-45;" ENDINCLINATION="-36;-44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<node TEXT="child" STYLE_REF="ConsumerTopic" ID="ID_1105307139" CREATED="1314131174886" MODIFIED="1323682830658">
<edge STYLE="bezier"/>
@@ -414,24 +422,24 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_434382705" CREATED="1323465258749" MODIFIED="1337203470615" HGAP="-77" VSHIFT="206"><richcontent TYPE="NODE">
+<node ID="ID_434382705" CREATED="1323465258749" MODIFIED="1337203470615" HGAP_QUANTITY="-77.0 px" VSHIFT_QUANTITY="206.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Genrally, you can <b>fold</b> and <b>unfold</b> a node by clicking the node when the circle with plus or minus sign is showing. This circle appears when the cursor is above the node core. Folding will hide possible children. If a node is folded, it shows a small <b>circle</b> at its <b>child side</b>. Unfolding will reveal hidden children.
</p>
<p>
-
+
</p>
<p>
If you have me unfolded, to my right you see 4 icons wich also are displayed in the toolbar at the top of the screen. These are icon-buttons with which you can fold/unfold the descendants of a selected node. Right-clicking the folding circle will reveal a context menu with the same icon-buttons for fast access.<br/><br/>Now click on node <i>Introduction</i> to hide its children and notice the circle! And thereafter, click again to continue reading the fo [...]
</p>
<p>
-
+
</p>
<p>
<b>Exceptions</b>
@@ -451,6 +459,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -496,7 +505,7 @@
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="Unfold all" STYLE_REF="ConsumerTopic" ID="ID_933325044" CREATED="1310134532679" MODIFIED="1323465426246" TEXT_SHORTENED="true" LINK="#ID_86446891" STYLE="as_parent">
+<node TEXT="Unfold all" STYLE_REF="ConsumerTopic" ID="ID_933325044" CREATED="1310134532679" MODIFIED="1323465426246" LINK="#ID_86446891" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../unfold_all"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -574,11 +583,11 @@
</node>
</node>
<node TEXT="Open map on Internet" STYLE_REF="Advanced" FOLDED="true" ID="ID_794559549" CREATED="1329413644062" MODIFIED="1335300198085">
-<node STYLE_REF="TitlesContent" ID="ID_663032265" CREATED="1329413694345" MODIFIED="1335091139945" HGAP="-123" VSHIFT="34"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_663032265" CREATED="1329413694345" MODIFIED="1335091139945" HGAP_QUANTITY="-123.0 px" VSHIFT_QUANTITY="34.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -586,50 +595,52 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node TEXT="Core map" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_1337127972" CREATED="1314109409850" MODIFIED="1335300531741" NUMBERED="true" MIN_WIDTH="200">
-<node TEXT="Node core" STYLE_REF="Beginner" FOLDED="true" ID="ID_1370298116" CREATED="1315860175003" MODIFIED="1335300258084" MIN_WIDTH="115" STYLE="combined">
+<node TEXT="Core map" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_1337127972" CREATED="1314109409850" MODIFIED="1335300531741" NUMBERED="true" MIN_WIDTH="200.0 px">
+<node TEXT="Node core" STYLE_REF="Beginner" FOLDED="true" ID="ID_1370298116" CREATED="1315860175003" MODIFIED="1335300258084" MIN_WIDTH="115.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1314148002" CREATED="1323461584875" MODIFIED="1335094931917" HGAP="-102" VSHIFT="105"><richcontent TYPE="NODE">
+<node ID="ID_1314148002" CREATED="1323461584875" MODIFIED="1335094931917" HGAP_QUANTITY="-102.0 px" VSHIFT_QUANTITY="105.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
The information of a node is displayed in two major area's. One area is called <b>node core</b> because it is situated in the inner area of the node and can have a bubble around it. The text you are reading now is in a node core. The colored area just above the one you are reading now is in the core of another node.
</p>
<p>
-
+
</p>
<p>
The text in the core can be short like a title, or multi line and can contain different basic display components like images and icons. It can also contain hyperlinks, formulas and components for time mangement and password protection.
</p>
<p>
-
+
</p>
<p>
Besides in the node core, text can be entered in <b>node details</b>, in <b>notes</b> and in <b>attributes</b>. These fields are described later.
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node STYLE_REF="Beginner" FOLDED="true" ID="ID_268413071" CREATED="1314125550476" MODIFIED="1335300258084" STYLE="combined" MIN_WIDTH="115"><richcontent TYPE="NODE">
+<node STYLE_REF="Beginner" FOLDED="true" ID="ID_268413071" CREATED="1314125550476" MODIFIED="1335300258084" STYLE="combined" MIN_WIDTH="115.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -637,20 +648,21 @@
</p>
</body>
</html>
+
</richcontent>
<edge STYLE="bezier"/>
-<node ID="ID_265318117" CREATED="1323437723250" MODIFIED="1341131023466" HGAP="-95" VSHIFT="150" STYLE="fork"><richcontent TYPE="NODE">
+<node ID="ID_265318117" CREATED="1323437723250" MODIFIED="1341131023466" HGAP_QUANTITY="-95.0 px" VSHIFT_QUANTITY="150.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
When Freeplane first opens you will be greeted by a blank map. It contains one, elliptical form, the root node. The root node contains a text such as "New map". This text is highligted, meaning you can replace it by typing your own text. Simply type your title and press <i>Enter</i>. The <i>Insert</i> key will add a child node - again just type and press <i>Enter</i>. A second <i>Enter</i> will add a sibling. That's really all there is to it. If you [...]
</p>
<p>
-
+
</p>
<p>
<b>Note</b><br/>
@@ -671,6 +683,7 @@
</ul>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
<hook NAME="NodeConditionalStyles">
@@ -692,7 +705,6 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
</hook>
@@ -713,7 +725,6 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -754,7 +765,6 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -848,11 +858,11 @@
</node>
</node>
</node>
-<node STYLE_REF="Beginner" FOLDED="true" ID="ID_1279324490" CREATED="1314126040831" MODIFIED="1335300258084" STYLE="combined" MIN_WIDTH="115"><richcontent TYPE="NODE">
+<node STYLE_REF="Beginner" FOLDED="true" ID="ID_1279324490" CREATED="1314126040831" MODIFIED="1335300258084" STYLE="combined" MIN_WIDTH="115.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -860,19 +870,20 @@
</p>
</body>
</html>
+
</richcontent>
-<node ID="ID_1433249332" CREATED="1323438495734" MODIFIED="1341131039869" HGAP="-100" VSHIFT="114" STYLE="fork"><richcontent TYPE="NODE">
+<node ID="ID_1433249332" CREATED="1323438495734" MODIFIED="1341131039869" HGAP_QUANTITY="-100.0 px" VSHIFT_QUANTITY="114.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
A second way to edit a node is in a separate dialog. Right-click on the node. This opens the context menu of the node. (This context menu is different from the context menu for editing text !) In this context menu choose <b><i>Edit core in dialog</i>.</b> You can now type the text and use the shown options to format the text. When you close the dialog by pressing OK, the text will appear in the node. This dialog has more extensive options for formatting text than availabl [...]
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -884,6 +895,7 @@
</ul>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
<hook NAME="NodeConditionalStyles">
@@ -904,12 +916,12 @@
</node>
</node>
</node>
-<node TEXT="Saving & closing" STYLE_REF="Beginner" FOLDED="true" ID="ID_48547188" CREATED="1314127927655" MODIFIED="1335300258084" STYLE="combined" MIN_WIDTH="115">
-<node ID="ID_1460485800" CREATED="1323438690647" MODIFIED="1335094962930" HGAP="-99" VSHIFT="40" STYLE="fork"><richcontent TYPE="NODE">
+<node TEXT="Saving & closing" STYLE_REF="Beginner" FOLDED="true" ID="ID_48547188" CREATED="1314127927655" MODIFIED="1335300258084" STYLE="combined" MIN_WIDTH="115.0 px">
+<node ID="ID_1460485800" CREATED="1323438690647" MODIFIED="1335094962930" HGAP_QUANTITY="-99.0 px" VSHIFT_QUANTITY="40.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -917,6 +929,7 @@
</p>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
<hook NAME="NodeConditionalStyles">
@@ -958,7 +971,6 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -986,13 +998,13 @@
</node>
</node>
</node>
-<node TEXT="Free nodes" STYLE_REF="Advanced" FOLDED="true" ID="ID_1401167294" CREATED="1323470356903" MODIFIED="1335300258068" MIN_WIDTH="80">
-<node TEXT="Post-it nodes: free positionable, free floating" STYLE_REF="Advanced" FOLDED="true" ID="ID_630972811" CREATED="1323076049931" MODIFIED="1323806244665" HGAP="18" VSHIFT="227" STYLE="combined">
-<node ID="ID_830664496" CREATED="1323434577171" MODIFIED="1335094977002" HGAP="-268" VSHIFT="77" STYLE="fork"><richcontent TYPE="NODE">
+<node TEXT="Free nodes" STYLE_REF="Advanced" FOLDED="true" ID="ID_1401167294" CREATED="1323470356903" MODIFIED="1335300258068" MIN_WIDTH="80.0 px">
+<node TEXT="Post-it nodes: free positionable, free floating" STYLE_REF="Advanced" FOLDED="true" ID="ID_630972811" CREATED="1323076049931" MODIFIED="1323806244665" HGAP_QUANTITY="18.0 px" VSHIFT_QUANTITY="227.0 px" STYLE="combined">
+<node ID="ID_830664496" CREATED="1323434577171" MODIFIED="1335094977002" HGAP_QUANTITY="-268.0 px" VSHIFT_QUANTITY="77.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1000,15 +1012,16 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node STYLE_REF="SubWidth" ID="ID_1557640435" CREATED="1323470600645" MODIFIED="1335094985020" HGAP="-581" VSHIFT="187"><richcontent TYPE="NODE">
+<node STYLE_REF="SubWidth" ID="ID_1557640435" CREATED="1323470600645" MODIFIED="1335094985020" HGAP_QUANTITY="-581.0 px" VSHIFT_QUANTITY="187.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1019,38 +1032,39 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node TEXT="Making and moving a free floating node" STYLE_REF="Advanced" FOLDED="true" ID="ID_128387683" CREATED="1317135703793" MODIFIED="1323806240625" VGAP="0" HGAP="17" VSHIFT="-230" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Making and moving a free floating node" STYLE_REF="Advanced" FOLDED="true" ID="ID_128387683" CREATED="1317135703793" MODIFIED="1323806240625" VGAP_QUANTITY="0.0 px" HGAP_QUANTITY="17.0 px" VSHIFT_QUANTITY="-230.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1188410566" CREATED="1323685758847" MODIFIED="1335094997999" HGAP="-234" VSHIFT="213"><richcontent TYPE="NODE">
+<node ID="ID_1188410566" CREATED="1323685758847" MODIFIED="1335094997999" HGAP_QUANTITY="-234.0 px" VSHIFT_QUANTITY="213.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
A free node is a node which is freely positionable, independently of the position of the other nodes of the mind map. A free node can be recognized by this behaviour and because the oval handle for moving the node is blue and filled in stead of red and open.
</p>
<p>
-
+
</p>
<p>
A new, free node can be generated by keeping <i>Control</i> pressed and clicking a free place of the mind map. The newly generated free node will have the system style <i>Free floating node</i>, wih proerties <i>rectangular cloud</i> and <i>hidden edge</i>. These properties can be changed in the usual way to e.g. no-cloud and visible edge. It is invisibly connected to the root.
</p>
<p>
-
+
</p>
<p>
An existing node can be turned into a free node by selecting it and choosing <i>Edit->Free positioned node (set/reset).</i> In this case the properties of the node (edge, cloud, folding) stay as they are. You can set the properties for cloud and hidden edge in the usual way . The freed node initially appears near the node it is invisibly connected to and can be moved from there to any desired position by dragging its (blue) oval handle. Moving a free floati [...]
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -1062,13 +1076,14 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
</hook>
</node>
-<node TEXT="Free floating node" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_1757242560" CREATED="1317754595087" MODIFIED="1335095015972" HGAP="608" VSHIFT="23" MAX_WIDTH="150">
+<node TEXT="Free floating node" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_1757242560" CREATED="1317754595087" MODIFIED="1335095015972" HGAP_QUANTITY="608.0 px" VSHIFT_QUANTITY="23.0 px" MAX_WIDTH="150.0 px">
<hook NAME="FreeNode"/>
<richcontent TYPE="DETAILS">
@@ -1086,14 +1101,14 @@
</node>
</node>
</node>
-<node TEXT="Icons" STYLE_REF="Advanced" FOLDED="true" ID="ID_222393549" CREATED="1323433444639" MODIFIED="1335300258068" STYLE="combined" MIN_WIDTH="80">
+<node TEXT="Icons" STYLE_REF="Advanced" FOLDED="true" ID="ID_222393549" CREATED="1323433444639" MODIFIED="1335300258068" STYLE="combined" MIN_WIDTH="80.0 px">
<icon BUILTIN="bookmark"/>
<icon BUILTIN="idea"/>
-<node ID="ID_715025500" CREATED="1323437305973" MODIFIED="1335982080280" HGAP="-56" VSHIFT="153" STYLE="fork"><richcontent TYPE="NODE">
+<node ID="ID_715025500" CREATED="1323437305973" MODIFIED="1335982080280" HGAP_QUANTITY="-56.0 px" VSHIFT_QUANTITY="153.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1114,7 +1129,7 @@
To add an icon to a node, select the node, then select the icon. To delete an icon, select the icon-remove first/last icon. These icons have a red cross
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -1132,24 +1147,25 @@
</ul>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
</node>
</node>
-<node TEXT="Images" STYLE_REF="Advanced" FOLDED="true" ID="ID_1795262306" CREATED="1323469507087" MODIFIED="1335300258068" MIN_WIDTH="80">
-<node TEXT="Image (node core)" STYLE_REF="Advanced" FOLDED="true" ID="ID_806240384" CREATED="1315581148847" MODIFIED="1323806455078" STYLE="combined" HGAP="18" VSHIFT="12">
-<node ID="ID_199889694" CREATED="1323435536299" MODIFIED="1335095042430" HGAP="-104" VSHIFT="89" STYLE="fork"><richcontent TYPE="NODE">
+<node TEXT="Images" STYLE_REF="Advanced" FOLDED="true" ID="ID_1795262306" CREATED="1323469507087" MODIFIED="1335300258068" MIN_WIDTH="80.0 px">
+<node TEXT="Image (node core)" STYLE_REF="Advanced" FOLDED="true" ID="ID_806240384" CREATED="1315581148847" MODIFIED="1323806455078" STYLE="combined" HGAP_QUANTITY="18.0 px" VSHIFT_QUANTITY="12.0 px">
+<node ID="ID_199889694" CREATED="1323435536299" MODIFIED="1335095042430" HGAP_QUANTITY="-104.0 px" VSHIFT_QUANTITY="89.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Each node core can contain one image which has a fixed "real size". (If you need a different size, use a drawing program to resize the original image.) To add an image, select the node and choose menu <i>Edit > Node core > Image by choice </i>or <i>link</i>. This same menu can be used to convert the textual hyperlink address of an image to the image itself.
</p>
<p>
-
+
</p>
<p>
<b>See also</b>
@@ -1161,27 +1177,28 @@
</ul>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
</node>
</node>
-<node TEXT="Link to image (red arrow)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1955041924" CREATED="1314282007169" MODIFIED="1333264692422" HGAP="17" VSHIFT="-1" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Link to image (red arrow)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1955041924" CREATED="1314282007169" MODIFIED="1333264692422" HGAP_QUANTITY="17.0 px" VSHIFT_QUANTITY="-1.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<edge STYLE="bezier"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_728788498" CREATED="1323469662830" MODIFIED="1335095056626" HGAP="-145" VSHIFT="169"><richcontent TYPE="NODE">
+<node ID="ID_728788498" CREATED="1323469662830" MODIFIED="1335095056626" HGAP_QUANTITY="-145.0 px" VSHIFT_QUANTITY="169.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
An image in a node takes visual space which is scarce. A hyperlink does not have this disadvantage, while you can still view the image if you press the hyperlink. To add a hyperlink to an image, copy the image source and paste it into the node (this is unlike drag and drop !). If you paste at the upper part of the node, a hyperlink to the image will be added in the node itself. If you paste at the child side of the node a child node will be created with the hyperlink. Th [...]
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -1192,7 +1209,7 @@
</li>
</ul>
<p>
-
+
</p>
<p>
<b>See also</b>
@@ -1204,22 +1221,23 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="In-line image" STYLE_REF="Professional" FOLDED="true" ID="ID_680497355" CREATED="1314282819174" MODIFIED="1323806473283" HGAP="17" VSHIFT="-10" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="In-line image" STYLE_REF="Professional" FOLDED="true" ID="ID_680497355" CREATED="1314282819174" MODIFIED="1323806473283" HGAP_QUANTITY="17.0 px" VSHIFT_QUANTITY="-10.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<edge STYLE="bezier"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_990348986" CREATED="1323469818677" MODIFIED="1335095066189" HGAP="-72" VSHIFT="33"><richcontent TYPE="NODE">
+<node ID="ID_990348986" CREATED="1323469818677" MODIFIED="1335095066189" HGAP_QUANTITY="-72.0 px" VSHIFT_QUANTITY="33.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1227,6 +1245,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1234,18 +1253,18 @@
</node>
</node>
</node>
-<node TEXT="Progress" STYLE_REF="Professional" FOLDED="true" ID="ID_1644368711" CREATED="1314283858479" MODIFIED="1335300258068" MIN_WIDTH="100">
-<node TEXT="When you need to show the progress of some sort, you can add a small or big progress indicator. The amount of progress can be changed. Note that the procedure to do so differs for small and large indicators." ID="ID_707469329" CREATED="1323436243939" MODIFIED="1329770386560" HGAP="28" VSHIFT="81" STYLE="fork"/>
-<node TEXT="Small progress (icon)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1826965169" CREATED="1314283872699" MODIFIED="1323806550925" HGAP="26" VSHIFT="1" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Progress" STYLE_REF="Professional" FOLDED="true" ID="ID_1644368711" CREATED="1314283858479" MODIFIED="1335300258068" MIN_WIDTH="100.0 px">
+<node TEXT="When you need to show the progress of some sort, you can add a small or big progress indicator. The amount of progress can be changed. Note that the procedure to do so differs for small and large indicators." ID="ID_707469329" CREATED="1323436243939" MODIFIED="1329770386560" HGAP_QUANTITY="28.0 px" VSHIFT_QUANTITY="81.0 px" STYLE="fork"/>
+<node TEXT="Small progress (icon)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1826965169" CREATED="1314283872699" MODIFIED="1323806550925" HGAP_QUANTITY="26.0 px" VSHIFT_QUANTITY="1.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="25%"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1268781768" CREATED="1323470955796" MODIFIED="1335095105705" HGAP="-135" VSHIFT="32"><richcontent TYPE="NODE">
+<node ID="ID_1268781768" CREATED="1323470955796" MODIFIED="1335095105705" HGAP_QUANTITY="-135.0 px" VSHIFT_QUANTITY="32.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1253,30 +1272,31 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Large progress (icon & image)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1080017148" CREATED="1314283905093" MODIFIED="1323806554263" HGAP="24" VSHIFT="-52" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Large progress (icon & image)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1080017148" CREATED="1314283905093" MODIFIED="1323806554263" HGAP_QUANTITY="24.0 px" VSHIFT_QUANTITY="-52.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="0%"/>
<hook URI="freeplaneresource:/images/svg/Progress_tenth_01.svg" SIZE="1.0" NAME="ExternalObject"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node ID="ID_522359814" CREATED="1323470998328" MODIFIED="1335095114534" HGAP="-182" VSHIFT="122"><richcontent TYPE="NODE">
+<node ID="ID_522359814" CREATED="1323470998328" MODIFIED="1335095114534" HGAP_QUANTITY="-182.0 px" VSHIFT_QUANTITY="122.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
To ad a large progress indicator, select <i>Edit > Core >Progress > Extended progress.</i> Then to increase the amount of progress %, double click. To decrease: Ctrl-double click.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -1291,6 +1311,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1298,22 +1319,22 @@
</node>
</node>
</node>
-<node TEXT="Joining nodes" STYLE_REF="Professional" FOLDED="true" ID="ID_998103410" CREATED="1316668137651" MODIFIED="1335300258068" MAX_WIDTH="600" MIN_WIDTH="100" STYLE="combined">
+<node TEXT="Joining nodes" STYLE_REF="Professional" FOLDED="true" ID="ID_998103410" CREATED="1316668137651" MODIFIED="1335300258068" MAX_WIDTH="600.0 px" MIN_WIDTH="100.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_795220191" CREATED="1323468276180" MODIFIED="1335095126221" HGAP="-84" VSHIFT="80"><richcontent TYPE="NODE">
+<node ID="ID_795220191" CREATED="1323468276180" MODIFIED="1335095126221" HGAP_QUANTITY="-84.0 px" VSHIFT_QUANTITY="80.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
The text of different node cores can be combined by selecting the nodes and choosing menu <i>Edit > Node core > Join nodes. </i>Child nodes of the joind nodes become childs of the new joined node.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -1328,29 +1349,30 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Splitting a node" STYLE_REF="Professional" FOLDED="true" ID="ID_247213553" CREATED="1316668117473" MODIFIED="1335300258084" MAX_WIDTH="600" MIN_WIDTH="100" STYLE="combined">
+<node TEXT="Splitting a node" STYLE_REF="Professional" FOLDED="true" ID="ID_247213553" CREATED="1316668117473" MODIFIED="1335300258084" MAX_WIDTH="600.0 px" MIN_WIDTH="100.0 px" STYLE="combined">
<font ITALIC="false"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_497224980" CREATED="1323468073621" MODIFIED="1335095138046" HGAP="-86" VSHIFT="135"><richcontent TYPE="NODE">
+<node ID="ID_497224980" CREATED="1323468073621" MODIFIED="1335095138046" HGAP_QUANTITY="-86.0 px" VSHIFT_QUANTITY="135.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
There are two different actions for splitting nodes. One is called from the main menu, the other from the editor.
</p>
<p>
-
+
</p>
<ol>
<li>
@@ -1361,7 +1383,7 @@
</li>
</ol>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -1376,28 +1398,29 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Calculating" STYLE_REF="Professional" FOLDED="true" ID="ID_448338872" CREATED="1316197624394" MODIFIED="1335300258084" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formula" MIN_WIDTH="100" STYLE="combined">
+<node TEXT="Calculating" STYLE_REF="Professional" FOLDED="true" ID="ID_448338872" CREATED="1316197624394" MODIFIED="1335300258084" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formula" MIN_WIDTH="100.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_60050529" CREATED="1323467815625" MODIFIED="1335095146423" HGAP="-83" VSHIFT="116"><richcontent TYPE="NODE">
+<node ID="ID_60050529" CREATED="1323467815625" MODIFIED="1335095146423" HGAP_QUANTITY="-83.0 px" VSHIFT_QUANTITY="116.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
A core text can, like a spreadsheet cell, contain a formula which starts with "=". If this is the case, the formula is calculated and only the result is displayed.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -1415,6 +1438,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1422,16 +1446,16 @@
</node>
</node>
</node>
-<node TEXT="Selecting and moving nodes" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_272980743" CREATED="1314248580003" MODIFIED="1335300531756" NUMBERED="true" MIN_WIDTH="200">
-<node TEXT="Scrolling and panning the map" STYLE_REF="Beginner" ID="ID_1577961914" CREATED="1314644535914" MODIFIED="1335300393571" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Selecting and moving nodes" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_272980743" CREATED="1314248580003" MODIFIED="1335300531756" NUMBERED="true" MIN_WIDTH="200.0 px">
+<node TEXT="Scrolling and panning the map" STYLE_REF="Beginner" ID="ID_1577961914" CREATED="1314644535914" MODIFIED="1335300393571" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1560196388" CREATED="1323511488363" MODIFIED="1335095167077" HGAP="-187" VSHIFT="52"><richcontent TYPE="NODE">
+<node ID="ID_1560196388" CREATED="1323511488363" MODIFIED="1335095167077" HGAP_QUANTITY="-187.0 px" VSHIFT_QUANTITY="52.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1447,6 +1471,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1454,17 +1479,16 @@
</hook>
</node>
</node>
-<node TEXT="Selecting" STYLE_REF="Beginner" ID="ID_1573267345" CREATED="1323507663956" MODIFIED="1337158256746" MIN_WIDTH="60">
-<hook NAME="FirstGroupNode"/>
-<node TEXT="Automatic selection" STYLE_REF="Beginner" FOLDED="true" ID="ID_1387234491" CREATED="1314249066966" MODIFIED="1335300393587" MAX_WIDTH="600" STYLE="combined">
+<node TEXT="Selecting" STYLE_REF="Beginner" ID="ID_1573267345" CREATED="1323507663956" MODIFIED="1337158256746" MIN_WIDTH="60.0 px">
+<node TEXT="Automatic selection" STYLE_REF="Beginner" FOLDED="true" ID="ID_1387234491" CREATED="1314249066966" MODIFIED="1335300393587" MAX_WIDTH="600.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1185537684" CREATED="1323506992696" MODIFIED="1335095176609" HGAP="-112" VSHIFT="39"><richcontent TYPE="NODE">
+<node ID="ID_1185537684" CREATED="1323506992696" MODIFIED="1335095176609" HGAP_QUANTITY="-112.0 px" VSHIFT_QUANTITY="39.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1472,6 +1496,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1479,16 +1504,16 @@
</hook>
</node>
</node>
-<node TEXT="Keeping the selection" STYLE_REF="Beginner" FOLDED="true" ID="ID_970057223" CREATED="1314248859369" MODIFIED="1335300393587" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Keeping the selection" STYLE_REF="Beginner" FOLDED="true" ID="ID_970057223" CREATED="1314248859369" MODIFIED="1335300393587" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
<edge STYLE="bezier" COLOR="#33ffcc"/>
-<node ID="ID_299898759" CREATED="1323507254371" MODIFIED="1335095184877" HGAP="-125" VSHIFT="39"><richcontent TYPE="NODE">
+<node ID="ID_299898759" CREATED="1323507254371" MODIFIED="1335095184877" HGAP_QUANTITY="-125.0 px" VSHIFT_QUANTITY="39.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1496,6 +1521,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1504,13 +1530,13 @@
<edge STYLE="hide_edge"/>
</node>
</node>
-<node TEXT="Key to the root" STYLE_REF="Beginner" FOLDED="true" ID="ID_1316263866" CREATED="1314249586526" MODIFIED="1335300393587" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Key to the root" STYLE_REF="Beginner" FOLDED="true" ID="ID_1316263866" CREATED="1314249586526" MODIFIED="1335300393587" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<edge STYLE="bezier"/>
-<node ID="ID_279008116" CREATED="1323507943923" MODIFIED="1335095192568" HGAP="-81" VSHIFT="23"><richcontent TYPE="NODE">
+<node ID="ID_279008116" CREATED="1323507943923" MODIFIED="1335095192568" HGAP_QUANTITY="-81.0 px" VSHIFT_QUANTITY="23.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1518,6 +1544,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1526,20 +1553,20 @@
</node>
</node>
<node TEXT="Select all nodes" STYLE_REF="Beginner" FOLDED="true" ID="ID_376722702" CREATED="1329770963443" MODIFIED="1335300393587">
-<node TEXT="To select all nodes, first select the root (press Escape) and next press CTrl + A." STYLE_REF="TitlesContent" ID="ID_1214336373" CREATED="1329770999440" MODIFIED="1335095203971" HGAP="-91" VSHIFT="25"/>
+<node TEXT="To select all nodes, first select the root (press Escape) and next press CTrl + A." STYLE_REF="TitlesContent" ID="ID_1214336373" CREATED="1329770999440" MODIFIED="1335095203971" HGAP_QUANTITY="-91.0 px" VSHIFT_QUANTITY="25.0 px"/>
</node>
</node>
-<node TEXT="Moving" STYLE_REF="Beginner" ID="ID_1560992291" CREATED="1314248654564" MODIFIED="1335300393571" MAX_WIDTH="600" MIN_WIDTH="60">
-<node TEXT="Moving a node in the hierarchy" STYLE_REF="Beginner" FOLDED="true" ID="ID_125921821" CREATED="1314250124540" MODIFIED="1335300393587" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Moving" STYLE_REF="Beginner" ID="ID_1560992291" CREATED="1314248654564" MODIFIED="1335300393571" MAX_WIDTH="600.0 px" MIN_WIDTH="60.0 px">
+<node TEXT="Moving a node in the hierarchy" STYLE_REF="Beginner" FOLDED="true" ID="ID_125921821" CREATED="1314250124540" MODIFIED="1335300393587" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
</hook>
-<node ID="ID_1599927930" CREATED="1323510888467" MODIFIED="1335095213253" HGAP="-186" VSHIFT="39"><richcontent TYPE="NODE">
+<node ID="ID_1599927930" CREATED="1323510888467" MODIFIED="1335095213253" HGAP_QUANTITY="-186.0 px" VSHIFT_QUANTITY="39.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1547,32 +1574,33 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Moving a connected node in space" STYLE_REF="Beginner" FOLDED="true" ID="ID_293115184" CREATED="1314249849956" MODIFIED="1335300393587" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Moving a connected node in space" STYLE_REF="Beginner" FOLDED="true" ID="ID_293115184" CREATED="1314249849956" MODIFIED="1335300393587" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="To displace a node while leaving its connections in tact, find the oval handle which is at the parent side of a node. Move the cursor over the this side of the node until the oval lights up. Then click the oval and drag wherever you want the node to go. All other nodes may move with it. You can restore a moved node to itsoriginal position by double clicking its oval handle." ID="ID_1319283887" CREATED="1323510779368" MODIFIED="1335095222161" HGAP="-208" VSHIFT="49">
+<node TEXT="To displace a node while leaving its connections in tact, find the oval handle which is at the parent side of a node. Move the cursor over the this side of the node until the oval lights up. Then click the oval and drag wherever you want the node to go. All other nodes may move with it. You can restore a moved node to itsoriginal position by double clicking its oval handle." ID="ID_1319283887" CREATED="1323510779368" MODIFIED="1335095222161" HGAP_QUANTITY="-208.0 px" VSHIFT [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Dropping positions" STYLE_REF="Beginner" FOLDED="true" ID="ID_1039655261" CREATED="1314250309213" MODIFIED="1335300393587" MAX_WIDTH="600" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Dropping positions" STYLE_REF="Beginner" FOLDED="true" ID="ID_1039655261" CREATED="1314250309213" MODIFIED="1335300393587" MAX_WIDTH="600.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_786303568" CREATED="1323511320373" MODIFIED="1335095232146" HGAP="-108" VSHIFT="104" MIN_WIDTH="80"><richcontent TYPE="NODE">
+<node ID="ID_786303568" CREATED="1323511320373" MODIFIED="1335095232146" HGAP_QUANTITY="-108.0 px" VSHIFT_QUANTITY="104.0 px" MIN_WIDTH="80.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1594,6 +1622,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1601,15 +1630,15 @@
</hook>
</node>
</node>
-<node TEXT="Moving a group" STYLE_REF="Advanced" FOLDED="true" ID="ID_1040002877" CREATED="1316181690861" MODIFIED="1335300393587" MAX_WIDTH="600" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Moving a group" STYLE_REF="Advanced" FOLDED="true" ID="ID_1040002877" CREATED="1316181690861" MODIFIED="1335300393587" MAX_WIDTH="600.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1239614830" CREATED="1323511365121" MODIFIED="1335095242208" HGAP="-84" VSHIFT="62"><richcontent TYPE="NODE">
+<node ID="ID_1239614830" CREATED="1323511365121" MODIFIED="1335095242208" HGAP_QUANTITY="-84.0 px" VSHIFT_QUANTITY="62.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1625,6 +1654,7 @@
</ol>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1632,11 +1662,11 @@
</node>
</node>
<node TEXT="Reset node position" STYLE_REF="Advanced" FOLDED="true" ID="ID_1352824494" CREATED="1335300691836" MODIFIED="1335300949728">
-<node STYLE_REF="TitlesContent" ID="ID_688846542" CREATED="1335300712264" MODIFIED="1335300958557" HGAP="-121" VSHIFT="31"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_688846542" CREATED="1335300712264" MODIFIED="1335300958557" HGAP_QUANTITY="-121.0 px" VSHIFT_QUANTITY="31.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1644,19 +1674,20 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node TEXT="Sorting nodes" STYLE_REF="Advanced" FOLDED="true" ID="ID_1014457432" CREATED="1314338769195" MODIFIED="1335300393571" MAX_WIDTH="600" STYLE="combined">
+<node TEXT="Sorting nodes" STYLE_REF="Advanced" FOLDED="true" ID="ID_1014457432" CREATED="1314338769195" MODIFIED="1335300393571" MAX_WIDTH="600.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_915226922" CREATED="1323511424855" MODIFIED="1335095252536" HGAP="-80" VSHIFT="44"><richcontent TYPE="NODE">
+<node ID="ID_915226922" CREATED="1323511424855" MODIFIED="1335095252536" HGAP_QUANTITY="-80.0 px" VSHIFT_QUANTITY="44.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1664,6 +1695,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1671,16 +1703,16 @@
</node>
</node>
</node>
-<node TEXT="Relating and grouping nodes" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_215646874" CREATED="1314109445053" MODIFIED="1335300531756" NUMBERED="true" MIN_WIDTH="200">
+<node TEXT="Relating and grouping nodes" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_215646874" CREATED="1314109445053" MODIFIED="1335300531756" NUMBERED="true" MIN_WIDTH="200.0 px">
<node TEXT="Edges" STYLE_REF="Beginner" FOLDED="true" ID="ID_1492225657" CREATED="1314162236991" MODIFIED="1335300437470" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_751107880" CREATED="1323514479284" MODIFIED="1335095266982" HGAP="-28" VSHIFT="43"><richcontent TYPE="NODE">
+<node ID="ID_751107880" CREATED="1323514479284" MODIFIED="1335095266982" HGAP_QUANTITY="-28.0 px" VSHIFT_QUANTITY="43.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1688,6 +1720,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1699,24 +1732,24 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1649729730" CREATED="1323514507513" MODIFIED="1335277476237" HGAP="-55" VSHIFT="150"><richcontent TYPE="NODE">
+<node ID="ID_1649729730" CREATED="1323514507513" MODIFIED="1335277476237" HGAP_QUANTITY="-55.0 px" VSHIFT_QUANTITY="150.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
It is possible to connect any two nodes with a line called (bilateral) <b>connector</b>: right-click a node and drag to the node you want to connect.
</p>
<p>
-
+
</p>
<p>
The <b>curving</b> of the connector can be changed by left-clicking and dragging the connector. Drag the dotten handle-lines to change the arrow orientation. The <b>style</b> of the connector can be changed and <b>labels</b> can be added to the connector: Right-click the connector and select the options in the context menu that opens.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -1738,17 +1771,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
</hook>
-<node TEXT="a" ID="ID_1328399304" CREATED="1314130936565" MODIFIED="1323517469534" HGAP="25" STYLE="as_parent">
-<edge STYLE="hide_edge"/>
+<node TEXT="a" ID="ID_1328399304" CREATED="1314130936565" MODIFIED="1323517469534" HGAP_QUANTITY="25.0 px" STYLE="as_parent">
<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_581303769" MIDDLE_LABEL="label" STARTINCLINATION="9;-23;" ENDINCLINATION="-28;-89;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<edge STYLE="hide_edge"/>
<node TEXT="b" ID="ID_273400211" CREATED="1314130940427" MODIFIED="1323517479815">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_273400211" MIDDLE_LABEL="connector
without
begin" STARTINCLINATION="19;86;" ENDINCLINATION="19;86;" STARTARROW="NONE" ENDARROW="NONE"/>
<edge STYLE="bezier"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_273400211" MIDDLE_LABEL="connector
without
begin" STARTINCLINATION="19;86;" ENDINCLINATION="19;86;" STARTARROW="NONE" ENDARROW="NONE"/>
<node TEXT="c" ID="ID_581303769" CREATED="1314130942275" MODIFIED="1314130945036"/>
</node>
</node>
@@ -1758,18 +1792,18 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_651594550" CREATED="1323514659262" MODIFIED="1335095290460" HGAP="-119" VSHIFT="78"><richcontent TYPE="NODE">
+<node ID="ID_651594550" CREATED="1323514659262" MODIFIED="1335095290460" HGAP_QUANTITY="-119.0 px" VSHIFT_QUANTITY="78.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
A group of siblings can be connected to a so called <b>summary node.</b>. This node connects the siblings with an accolade. Select the group of siblings and right-click one of the selected nodes while keeping <i>Ctrl</i> pressed. Choose <i>New summary node (selected nodes) </i>in the node contextmenu.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -1781,17 +1815,20 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="a" STYLE_REF="AdvancedTopic" ID="ID_902940862" CREATED="1314130883345" MODIFIED="1316165216808">
+<node TEXT="" ID="ID_614882936" CREATED="1455910877279" MODIFIED="1455910877279">
<hook NAME="FirstGroupNode"/>
</node>
+<node TEXT="a" STYLE_REF="AdvancedTopic" ID="ID_902940862" CREATED="1314130883345" MODIFIED="1316165216808"/>
<node TEXT="b" STYLE_REF="AdvancedTopic" ID="ID_303013117" CREATED="1314130889936" MODIFIED="1316165216824"/>
-<node TEXT="c" STYLE_REF="AdvancedTopic" ID="ID_1837144570" CREATED="1314130892393" MODIFIED="1316165216824" VSHIFT="-9"/>
-<node TEXT="Summary node" STYLE_REF="AdvancedTopic" ID="ID_460668684" CREATED="1314130905124" MODIFIED="1316165216824">
+<node TEXT="c" STYLE_REF="AdvancedTopic" ID="ID_1837144570" CREATED="1314130892393" MODIFIED="1316165216824" VSHIFT_QUANTITY="-9.0 px"/>
+<node TEXT="" ID="ID_1718735488" CREATED="1455910877283" MODIFIED="1455910877283">
<hook NAME="SummaryNode"/>
+<node TEXT="Summary node" STYLE_REF="AdvancedTopic" ID="ID_460668684" CREATED="1314130905124" MODIFIED="1316165216824"/>
</node>
</node>
</node>
@@ -1799,11 +1836,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1862713604" CREATED="1323514733122" MODIFIED="1335095305358" HGAP="-101" VSHIFT="52"><richcontent TYPE="NODE">
+<node ID="ID_1862713604" CREATED="1323514733122" MODIFIED="1335095305358" HGAP_QUANTITY="-101.0 px" VSHIFT_QUANTITY="52.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1811,16 +1848,17 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="cloud a" STYLE_REF="AdvancedTopic" ID="ID_1742435994" CREATED="1314130827910" MODIFIED="1323517713897" VSHIFT="15">
+<node TEXT="cloud a" STYLE_REF="AdvancedTopic" ID="ID_1742435994" CREATED="1314130827910" MODIFIED="1323517713897" VSHIFT_QUANTITY="15.0 px">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<node TEXT="b" ID="ID_1270291744" CREATED="1314130833239" MODIFIED="1314130836016"/>
<node TEXT="c" ID="ID_1022872809" CREATED="1314130837348" MODIFIED="1314130840017"/>
</node>
-<node TEXT="cloud b" STYLE_REF="AdvancedTopic" ID="ID_539843005" CREATED="1314208596772" MODIFIED="1316165226464" HGAP="30" VSHIFT="-9">
+<node TEXT="cloud b" STYLE_REF="AdvancedTopic" ID="ID_539843005" CREATED="1314208596772" MODIFIED="1316165226464" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="-9.0 px">
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
<node TEXT="e" ID="ID_249943796" CREATED="1314208605486" MODIFIED="1314208607670"/>
<node TEXT="f" ID="ID_1428582117" CREATED="1314208608472" MODIFIED="1314208611937"/>
@@ -1831,7 +1869,7 @@
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1839,6 +1877,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -1861,24 +1900,24 @@
</node>
</node>
</node>
-<node TEXT="Hyperlinking" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_114835202" CREATED="1314284617264" MODIFIED="1335300531756" NUMBERED="true" MIN_WIDTH="200">
+<node TEXT="Hyperlinking" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_114835202" CREATED="1314284617264" MODIFIED="1335300531756" NUMBERED="true" MIN_WIDTH="200.0 px">
<node TEXT="What is a link ?" FOLDED="true" ID="ID_55001637" CREATED="1323100759475" MODIFIED="1335300461104">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Beginner" LAST="false"/>
</hook>
-<node TEXT="A dynamic link (hyperlink) is an electronic connection from a source node to a destination object. The destination can be a directory, file, web page, application, e-mail etc. The connection is click-able: double-click to open it. The link appears as an underlined text, or as a red or green arrow. The red arrow connects to an external address or an e-mail address. The green arrow connects to an internal address (other node). The underlined text can represent both. There can b [...]
+<node TEXT="A dynamic link (hyperlink) is an electronic connection from a source node to a destination object. The destination can be a directory, file, web page, application, e-mail etc. The connection is click-able: double-click to open it. The link appears as an underlined text, or as a red or green arrow. The red arrow connects to an external address or an e-mail address. The green arrow connects to an internal address (other node). The underlined text can represent both. There can b [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
<node TEXT="Linking nodes with anchor" STYLE_REF="Beginner" FOLDED="true" ID="ID_1524719322" CREATED="1336298056719" MODIFIED="1336299477442">
-<node STYLE_REF="TitlesContent" ID="ID_1594135890" CREATED="1336298585173" MODIFIED="1337500686337" HGAP="-158" VSHIFT="136"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_1594135890" CREATED="1336298585173" MODIFIED="1337500686337" HGAP_QUANTITY="-158.0 px" VSHIFT_QUANTITY="136.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -1911,44 +1950,45 @@
</ul>
</body>
</html>
+
</richcontent>
</node>
</node>
<node TEXT="External link" STYLE_REF="Beginner" FOLDED="true" ID="ID_640110372" CREATED="1286651969385" MODIFIED="1335300461119" LINK="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane" STYLE="combined">
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="161"/>
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="120.75 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1913035829" CREATED="1323512829161" MODIFIED="1335095327448" HGAP="-83" VSHIFT="240"><richcontent TYPE="NODE">
+<node ID="ID_1913035829" CREATED="1323512829161" MODIFIED="1335095327448" HGAP_QUANTITY="-83.0 px" VSHIFT_QUANTITY="240.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
A hyperlink to an address outside the map can be created by right-clicking a node and selecting <i>Link</i>. However, the easiest way to add a hyperlink or group of hyperlinks to external objects, is by drag and drop. Dropping a copy of a directory, file, or web address will generate a child node of the selected node containing a hyperlink. The target address of the hyperlink is contained in the title. This text may be removed or changed without changing the dynamics of the hyperli [...]
</p>
<p>
-
+
</p>
<p>
Dropping a group of hyperlinks will generate a group of child nodes, each containing one of the hyperlinks.
</p>
<p>
-
+
</p>
<p>
To edit the target address of the hyperlink, right-click the node containing the link and choose <i>Links > Add or modify hyperlink (type)...</i> In the dialog that opens you can edit the address. With <i>Ctrl + V</i> a copied address can be pasted in the entry field.
</p>
<p>
-
+
</p>
<p>
To link to a node in a different mind map, see<a href="#ID_1418102707"> Link from outside to a particular node</a>.
</p>
<p>
-
+
</p>
<p>
To remove a hyperlink (arrow-link) or e-mail address, right-click the node and:
@@ -1974,6 +2014,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1985,18 +2026,18 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1830541497" CREATED="1323512880196" MODIFIED="1335095339023" HGAP="-78" VSHIFT="89"><richcontent TYPE="NODE">
+<node ID="ID_1830541497" CREATED="1323512880196" MODIFIED="1335095339023" HGAP_QUANTITY="-78.0 px" VSHIFT_QUANTITY="89.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
A hyperlink from one node to another node (local hyperlink) can be created by selecting two nodes, then right-clicking one of them while keeping <i>Ctrl</i> pressed, and finally choosing menu <i>Links > Local hyperlink. </i>
</p>
<p>
-
+
</p>
<p>
To remove a hyperlink (arrow-link) or e-mail address, right-click the node and:
@@ -2011,6 +2052,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2022,18 +2064,18 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1480409284" CREATED="1323512986970" MODIFIED="1335095349771" HGAP="-64" VSHIFT="145"><richcontent TYPE="NODE">
+<node ID="ID_1480409284" CREATED="1323512986970" MODIFIED="1335095349771" HGAP_QUANTITY="-64.0 px" VSHIFT_QUANTITY="145.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
The simplest way to create an e-mail link which automatically opens your email program is to copy and paste the email address into a node. This will generate a<b> child node</b> of the selected node with the link. The text of the child node will consist of the e-mail address. You may replace this address by e.g. only the name.
</p>
<p>
-
+
</p>
<p>
If you want to add the e-mail link to a particular node (and not to its newly generated child), right-click the node and choose<i> Add or modify hyperlink (type)...</i> Then enter in the text field:
@@ -2056,6 +2098,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2066,7 +2109,7 @@
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2074,22 +2117,23 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1356533861" CREATED="1323512914336" MODIFIED="1335095382173" HGAP="-133" VSHIFT="268"><richcontent TYPE="NODE">
+<node ID="ID_1356533861" CREATED="1323512914336" MODIFIED="1335095382173" HGAP_QUANTITY="-133.0 px" VSHIFT_QUANTITY="268.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
To define an underlined hyperlink (HTML-link), first open the text dialog for Node core, Node details or Note. Then type and select the piece of text to which the link applies. And finally select in the Edit menu of the dialog window <i>Add hyperlink (choose)...</i> or <i>Add or modify hyperlink (type)</i>. In the latter case you can type the address of the hyperlink or you can paste a copied address by pressing Ctr + V. Example link: <font col [...]
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -2134,6 +2178,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2144,18 +2189,18 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1108178356" CREATED="1323513038412" MODIFIED="1335095393033" HGAP="-132" VSHIFT="86"><richcontent TYPE="NODE">
+<node ID="ID_1108178356" CREATED="1323513038412" MODIFIED="1335095393033" HGAP_QUANTITY="-132.0 px" VSHIFT_QUANTITY="86.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
You can also connect the menu item to a node, so that clicking the node will activate the menu item. To connect a node directly to a menu item, right-click the node and choose <i>Link > Add hyperlink to menu item... </i>
</p>
<p>
-
+
</p>
<p>
To remove a hyperlink (arrow-link) or e-mail address, right-click the node and:
@@ -2170,6 +2215,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2180,11 +2226,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_116460964" CREATED="1323513079714" MODIFIED="1335095401972" HGAP="-26" VSHIFT="60"><richcontent TYPE="NODE">
+<node ID="ID_116460964" CREATED="1323513079714" MODIFIED="1335095401972" HGAP_QUANTITY="-26.0 px" VSHIFT_QUANTITY="60.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2192,6 +2238,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2202,18 +2249,18 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_822375535" CREATED="1323513104618" MODIFIED="1335095425450" HGAP="-228" VSHIFT="149"><richcontent TYPE="NODE">
+<node ID="ID_822375535" CREATED="1323513104618" MODIFIED="1335095425450" HGAP_QUANTITY="-228.0 px" VSHIFT_QUANTITY="149.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
To jump from another program or source mind map to a particular node in a target mindmap, the address field of the hyperlink should contain the path to the target mind map and the nodeID, seperated by #. If source and target mind map are in the same directory, the address can be defined as destination.mm#NodeID, e.g. as WhatIsMindmapping.mm#ID_930373151. This has the advantage that if the containing direcory is moved as a whole, the link keeps correct. In the [...]
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -2225,6 +2272,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2232,28 +2280,28 @@
</node>
</node>
</node>
-<node TEXT="Formatting & styling" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1778719162" CREATED="1291143603918" MODIFIED="1335300531756" NUMBERED="true" MIN_WIDTH="200">
+<node TEXT="Formatting & styling" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1778719162" CREATED="1291143603918" MODIFIED="1335300531756" NUMBERED="true" MIN_WIDTH="200.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
-<node TEXT="Properties" STYLE_REF="Advanced" FOLDED="true" ID="ID_873516196" CREATED="1314162578896" MODIFIED="1335300487421" NUMBERED="true" MIN_WIDTH="90">
-<node TEXT="Properties panel" STYLE_REF="Advanced" FOLDED="true" ID="ID_1812601804" CREATED="1314162700896" MODIFIED="1323807343250" HGAP="32" VSHIFT="457" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Properties" STYLE_REF="Advanced" FOLDED="true" ID="ID_873516196" CREATED="1314162578896" MODIFIED="1335300487421" NUMBERED="true" MIN_WIDTH="90.0 px">
+<node TEXT="Properties panel" STYLE_REF="Advanced" FOLDED="true" ID="ID_1812601804" CREATED="1314162700896" MODIFIED="1323807343250" HGAP_QUANTITY="32.0 px" VSHIFT_QUANTITY="457.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="info"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_503272481" CREATED="1323517943396" MODIFIED="1335095486775" HGAP="-105" VSHIFT="105"><richcontent TYPE="NODE">
+<node ID="ID_503272481" CREATED="1323517943396" MODIFIED="1335095486775" HGAP_QUANTITY="-105.0 px" VSHIFT_QUANTITY="105.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Freeplane has many possibilities to to set or change properties which apply to a whole node or all nodes. You can think of the basic color of a node, enclosing a node in a bubble, the size of the text, the width of the node core and much more. The most versatile method to edit properties is in the <b>Properties panel</b>. To open or close the Properties panel, right-click in an empty space of the background and select <i>Properties panel</i>.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -2268,67 +2316,69 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Editing a property" STYLE_REF="Advanced" FOLDED="true" ID="ID_1707940964" CREATED="1314163244315" MODIFIED="1323519043605" HGAP="30" VSHIFT="1" MAX_WIDTH="500" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Editing a property" STYLE_REF="Advanced" FOLDED="true" ID="ID_1707940964" CREATED="1314163244315" MODIFIED="1323519043605" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="1.0 px" MAX_WIDTH="500.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_676577574" CREATED="1323518049125" MODIFIED="1335095498771" HGAP="-101" VSHIFT="159"><richcontent TYPE="NODE">
+<node ID="ID_676577574" CREATED="1323518049125" MODIFIED="1335095498771" HGAP_QUANTITY="-101.0 px" VSHIFT_QUANTITY="159.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
The <i>Properties panel</i> shows the properties of the node which has the focus. Only the properties of the selected node can be changed. (Generally you select one node, but with some properties it is possible to select and change more than one node at a time.) While the panel is showing, you can select a different node to give it the focus. To change a property, change the value of the property. This will also set a check indicating the changed value applies. Uncheck if you [...]
</p>
<p>
-
+
</p>
<p>
As a first example, find the properties group named <i>Node Shape</i> and click on <i>Node style</i>. A menu drops down with options like <i>Bubble</i>, <i>Fork</i> and <i>As parent</i>. Try these options and see what happens. For the node you are reading now option <i>Bubble</i> was chosen. As you may notice, this option only applies to the core.
</p>
<p>
-
+
</p>
<p>
As a second example, find node group <i>Edges </i>and check the box for <i>Edge style</i>. Clicking next to <i>Edge style</i> will drop down a menu with possible styles like <i>Linear</i>, <i>Smoothly curved</i>, <i>Hidden</i>, and others. Try these to know which styles are possible. Or cselect me to see a few examples of changed properties in the <i>Properties panel.</i>
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="linear" STYLE_REF="AdvancedTopic" ID="ID_34702829" CREATED="1314172753397" MODIFIED="1323518514233" HGAP="14" VSHIFT="-26">
+<node TEXT="linear" STYLE_REF="AdvancedTopic" ID="ID_34702829" CREATED="1314172753397" MODIFIED="1323518514233" HGAP_QUANTITY="14.0 px" VSHIFT_QUANTITY="-26.0 px">
<edge STYLE="linear"/>
</node>
-<node TEXT="curved" STYLE_REF="AdvancedTopic" ID="ID_1333040751" CREATED="1314172748460" MODIFIED="1323518517665" HGAP="35" VSHIFT="-27">
+<node TEXT="curved" STYLE_REF="AdvancedTopic" ID="ID_1333040751" CREATED="1314172748460" MODIFIED="1323518517665" HGAP_QUANTITY="35.0 px" VSHIFT_QUANTITY="-27.0 px">
<edge STYLE="bezier"/>
</node>
-<node TEXT="hidden" STYLE_REF="AdvancedTopic" ID="ID_1968961455" CREATED="1314172761269" MODIFIED="1323518014549" HGAP="40" VSHIFT="-5">
+<node TEXT="hidden" STYLE_REF="AdvancedTopic" ID="ID_1968961455" CREATED="1314172761269" MODIFIED="1323518014549" HGAP_QUANTITY="40.0 px" VSHIFT_QUANTITY="-5.0 px">
<edge STYLE="hide_edge"/>
</node>
-<node TEXT="horizontal" STYLE_REF="AdvancedTopic" ID="ID_494591913" CREATED="1314172936705" MODIFIED="1323518524951" HGAP="39" VSHIFT="25">
+<node TEXT="horizontal" STYLE_REF="AdvancedTopic" ID="ID_494591913" CREATED="1314172936705" MODIFIED="1323518524951" HGAP_QUANTITY="39.0 px" VSHIFT_QUANTITY="25.0 px">
<edge STYLE="horizontal"/>
</node>
</node>
</node>
-<node TEXT="Automatic edge color" STYLE_REF="Advanced" FOLDED="true" ID="ID_1005719714" CREATED="1314164029738" MODIFIED="1323519032435" HGAP="30" VSHIFT="-2" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Automatic edge color" STYLE_REF="Advanced" FOLDED="true" ID="ID_1005719714" CREATED="1314164029738" MODIFIED="1323519032435" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="-2.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1565463565" CREATED="1323518106869" MODIFIED="1335095510596" HGAP="-125" VSHIFT="67"><richcontent TYPE="NODE">
+<node ID="ID_1565463565" CREATED="1323518106869" MODIFIED="1335095510596" HGAP_QUANTITY="-125.0 px" VSHIFT_QUANTITY="67.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2336,21 +2386,22 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Automatic node numbering" STYLE_REF="Advanced" FOLDED="true" ID="ID_1861361284" CREATED="1314283445398" MODIFIED="1323518950816" HGAP="30" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Automatic node numbering" STYLE_REF="Advanced" FOLDED="true" ID="ID_1861361284" CREATED="1314283445398" MODIFIED="1323518950816" HGAP_QUANTITY="30.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1531819965" CREATED="1323518137156" MODIFIED="1335095522187" HGAP="-163" VSHIFT="42"><richcontent TYPE="NODE">
+<node ID="ID_1531819965" CREATED="1323518137156" MODIFIED="1335095522187" HGAP_QUANTITY="-163.0 px" VSHIFT_QUANTITY="42.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2358,22 +2409,23 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Other properties" STYLE_REF="Advanced" FOLDED="true" ID="ID_457725429" CREATED="1314167397870" MODIFIED="1323807323251" HGAP="31" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Other properties" STYLE_REF="Advanced" FOLDED="true" ID="ID_457725429" CREATED="1314167397870" MODIFIED="1323807323251" HGAP_QUANTITY="31.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<font ITALIC="false"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node STYLE_REF="TitlesContent" ID="ID_1014522598" CREATED="1323518167241" MODIFIED="1335095532420" HGAP="-92" VSHIFT="42"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_1014522598" CREATED="1323518167241" MODIFIED="1335095532420" HGAP_QUANTITY="-92.0 px" VSHIFT_QUANTITY="42.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2381,18 +2433,19 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="Menu Format" STYLE_REF="Advanced" FOLDED="true" ID="ID_1128382958" CREATED="1314167687616" MODIFIED="1323807329819" HGAP="29" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Menu Format" STYLE_REF="Advanced" FOLDED="true" ID="ID_1128382958" CREATED="1314167687616" MODIFIED="1323807329819" HGAP_QUANTITY="29.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1716769321" CREATED="1323518205453" MODIFIED="1335095546772" HGAP="-67" VSHIFT="41"><richcontent TYPE="NODE">
+<node ID="ID_1716769321" CREATED="1323518205453" MODIFIED="1335095546772" HGAP_QUANTITY="-67.0 px" VSHIFT_QUANTITY="41.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2400,11 +2453,12 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="Bold" STYLE_REF="AdvancedTopic" ID="ID_25890496" CREATED="1266251692562" MODIFIED="1323519139108" TEXT_SHORTENED="true" HGAP="25" STYLE="as_parent">
+<node TEXT="Bold" STYLE_REF="AdvancedTopic" ID="ID_25890496" CREATED="1266251692562" MODIFIED="1323519139108" TEXT_SHORTENED="true" HGAP_QUANTITY="25.0 px" STYLE="as_parent">
<icon BUILTIN="../Bold16"/>
<font NAME="SansSerif" SIZE="12" BOLD="true" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -2420,7 +2474,6 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -2451,22 +2504,22 @@
</node>
</node>
</node>
-<node TEXT="Tool bar" STYLE_REF="Advanced" FOLDED="true" ID="ID_1235607524" CREATED="1314167879005" MODIFIED="1323807334296" HGAP="30" VSHIFT="-456" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Tool bar" STYLE_REF="Advanced" FOLDED="true" ID="ID_1235607524" CREATED="1314167879005" MODIFIED="1323807334296" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="-456.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_158808063" CREATED="1323518244867" MODIFIED="1335095560220" HGAP="-38" VSHIFT="123"><richcontent TYPE="NODE">
+<node ID="ID_158808063" CREATED="1323518244867" MODIFIED="1335095560220" HGAP_QUANTITY="-38.0 px" VSHIFT_QUANTITY="123.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Some of the properties in the<i> Properties panel</i> are also available as <b>icons</b> in the <b>tool bar</b> which is below the main menu bar. Examples are <i>italic</i> and <b>bold</b>.
</p>
<p>
-
+
</p>
<p>
<b>Important</b>
@@ -2484,6 +2537,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2491,17 +2545,17 @@
</node>
</node>
</node>
-<node TEXT="Styles" STYLE_REF="Advanced" FOLDED="true" ID="ID_1838680824" CREATED="1314646406529" MODIFIED="1335300487437" NUMBERED="true" MIN_WIDTH="90">
-<node TEXT="Why styles ?" FOLDED="true" ID="ID_539515158" CREATED="1323521177251" MODIFIED="1323807405276" HGAP="30" VSHIFT="138" STYLE="combined">
+<node TEXT="Styles" STYLE_REF="Advanced" FOLDED="true" ID="ID_1838680824" CREATED="1314646406529" MODIFIED="1335300487437" NUMBERED="true" MIN_WIDTH="90.0 px">
+<node TEXT="Why styles ?" FOLDED="true" ID="ID_539515158" CREATED="1323521177251" MODIFIED="1323807405276" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="138.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Advanced" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_406943626" CREATED="1323767710004" MODIFIED="1341131531190" HGAP="-65" VSHIFT="50"><richcontent TYPE="NODE">
+<node ID="ID_406943626" CREATED="1323767710004" MODIFIED="1341131531190" HGAP_QUANTITY="-65.0 px" VSHIFT_QUANTITY="50.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2509,28 +2563,29 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Find & apply a style" STYLE_REF="Advanced" FOLDED="true" ID="ID_512501370" CREATED="1291199304490" MODIFIED="1323807409160" HGAP="29" VSHIFT="-1" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Find & apply a style" STYLE_REF="Advanced" FOLDED="true" ID="ID_512501370" CREATED="1291199304490" MODIFIED="1323807409160" HGAP_QUANTITY="29.0 px" VSHIFT_QUANTITY="-1.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_602520818" CREATED="1323521250360" MODIFIED="1335095588674" HGAP="-116" VSHIFT="124"><richcontent TYPE="NODE">
+<node ID="ID_602520818" CREATED="1323521250360" MODIFIED="1335095588674" HGAP_QUANTITY="-116.0 px" VSHIFT_QUANTITY="124.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
<font face="SansSerif, sans-serif" color="#000000">Freeplane comes with a number of system styles which you can extend with your own styles. The list of styles is displayed in the workmenu bar at the top of the screen in the field next to the cloud-icon. You can apply a style to the selected node by clicking a style in the list. For the node you are reading now, style <i>TitlesContent</i> was applied. </font>
</p>
<p>
-
+
</p>
<p>
<font color="#000000" face="SansSerif, sans-serif"><b>Note</b> </font>
@@ -2551,18 +2606,19 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Removing an applied style" STYLE_REF="Advanced" FOLDED="true" ID="ID_1937448981" CREATED="1335278263350" MODIFIED="1335278358664" HGAP="28">
-<node STYLE_REF="TitlesContent" ID="ID_1278689402" CREATED="1335278278365" MODIFIED="1335278541211" HGAP="-157" VSHIFT="43"><richcontent TYPE="NODE">
+<node TEXT="Removing an applied style" STYLE_REF="Advanced" FOLDED="true" ID="ID_1937448981" CREATED="1335278263350" MODIFIED="1335278358664" HGAP_QUANTITY="28.0 px">
+<node STYLE_REF="TitlesContent" ID="ID_1278689402" CREATED="1335278278365" MODIFIED="1335278541211" HGAP_QUANTITY="-157.0 px" VSHIFT_QUANTITY="43.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2570,25 +2626,26 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="Edit styles in node dialog" STYLE_REF="Advanced" FOLDED="true" ID="ID_1277682010" CREATED="1291196100290" MODIFIED="1323807416508" HGAP="30" VSHIFT="2" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Edit styles in node dialog" STYLE_REF="Advanced" FOLDED="true" ID="ID_1277682010" CREATED="1291196100290" MODIFIED="1323807416508" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="2.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_443461395" CREATED="1323521242303" MODIFIED="1335095601872" HGAP="-149" VSHIFT="106"><richcontent TYPE="NODE">
+<node ID="ID_443461395" CREATED="1323521242303" MODIFIED="1335095601872" HGAP_QUANTITY="-149.0 px" VSHIFT_QUANTITY="106.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
You can define a new style by selecting a node and choosing menu <i>Format > Manage style > New style from selection. </i>You will be asked for a unique name for the style and the properties of the selected node will be copied to this style. Alternatively you can open a special style dialog with menu <i> Format > Manage styles > Edit style. </i>You can add a style by right-clicking one of the styles en selecting <i>New style from selection</i>. [...]
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -2600,22 +2657,23 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Apply multiple styles" FOLDED="true" ID="ID_270284358" CREATED="1314342119553" MODIFIED="1329821005551" HGAP="31" VSHIFT="1" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Apply multiple styles" FOLDED="true" ID="ID_270284358" CREATED="1314342119553" MODIFIED="1329821005551" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="1.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Advanced" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
-<node ID="ID_1030002880" CREATED="1323521314827" MODIFIED="1335095617660" HGAP="-127" VSHIFT="142"><richcontent TYPE="NODE">
+<node ID="ID_1030002880" CREATED="1323521314827" MODIFIED="1335095617660" HGAP_QUANTITY="-127.0 px" VSHIFT_QUANTITY="142.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2639,7 +2697,7 @@
After this you will see that your node has both styles applied.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -2649,29 +2707,30 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Conditional styles" STYLE_REF="Professional" FOLDED="true" ID="ID_1632551821" CREATED="1314343996581" MODIFIED="1329858287410" HGAP="31" VSHIFT="-1" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Conditional styles" STYLE_REF="Professional" FOLDED="true" ID="ID_1632551821" CREATED="1314343996581" MODIFIED="1329858287410" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="-1.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
-<node ID="ID_1437965047" CREATED="1323521350949" MODIFIED="1335095628549" HGAP="-110" VSHIFT="157"><richcontent TYPE="NODE">
+<node ID="ID_1437965047" CREATED="1323521350949" MODIFIED="1335095628549" HGAP_QUANTITY="-110.0 px" VSHIFT_QUANTITY="157.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
In the node above multiple styles are applied unconditionally. Styles can also be applied conditionally, if a certain condition is true which is specified in a filter rule. In the following example a conditional style is used to signal if a node is modified after a particular revision date.
</p>
<p>
-
+
</p>
<p>
<b>Example: Revisions</b>
@@ -2680,13 +2739,13 @@
First a style <i>Revision </i>was defined with a special revision R-icon (see the styles list). Then in the<i> Properties panel</i> I clicked below<i> Conditional map styles </i>to open its dialog<i>.</i> I pressed <i>New</i> to add a filter. I clicked the new rule and defined a filter (Modified after, date). I selected this filter rule and pressed <i>OK</i>.
</p>
<p>
-
+
</p>
<p>
If you are in the conditional styles dialog, you see the rule I defined to be unchecked. I did so because normally you do not want to see the R-icons. Check one of the rules and you will see some revision R-icons appear. To see all revions you have to unfold the nodes.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -2696,28 +2755,29 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Hierarchical level styles" STYLE_REF="Professional" FOLDED="true" ID="ID_521918713" CREATED="1314344484933" MODIFIED="1323807439362" HGAP="30" MAX_WIDTH="550">
+<node TEXT="Hierarchical level styles" STYLE_REF="Professional" FOLDED="true" ID="ID_521918713" CREATED="1314344484933" MODIFIED="1323807439362" HGAP_QUANTITY="30.0 px" MAX_WIDTH="550.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1011147934" CREATED="1323521380784" MODIFIED="1335095638424" HGAP="-138" VSHIFT="196"><richcontent TYPE="NODE">
+<node ID="ID_1011147934" CREATED="1323521380784" MODIFIED="1335095638424" HGAP_QUANTITY="-138.0 px" VSHIFT_QUANTITY="196.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
One possible application of conditional node styles is to give each node level a different appearance automatically. Say you need five node levels. Then you define 5 styles, one for each level. Next you define 5 conditional style rules. To make it easy Freeplane has predefined this case for you. In <i>Properties panel</i> you can check <b>Apply level styles </b>in the properties group Node Style. If checked each node level will get a different appearance automatical [...]
</p>
<p>
-
+
</p>
<p>
If you do not like the styles used for the levels, you can modify them as follows:
@@ -2737,13 +2797,13 @@
If you want more than 5 different level styles, simply add them in <i>Styles > Edit style</i> behind<i> Apply level styles</i>.
</p>
<p>
-
+
</p>
<p>
If you want to apply less than 5 level styles, remove styles in <i>Styles > Edit style</i> behind<i> Apply level styles</i>.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -2753,21 +2813,22 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Map style" STYLE_REF="Professional" FOLDED="true" ID="ID_13843990" CREATED="1291196992351" MODIFIED="1323807434292" HGAP="31" VSHIFT="-130" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Map style" STYLE_REF="Professional" FOLDED="true" ID="ID_13843990" CREATED="1291196992351" MODIFIED="1323807434292" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="-130.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1896765128" CREATED="1323521437116" MODIFIED="1335095645351" HGAP="-44" VSHIFT="59"><richcontent TYPE="NODE">
+<node ID="ID_1896765128" CREATED="1323521437116" MODIFIED="1335095645351" HGAP_QUANTITY="-44.0 px" VSHIFT_QUANTITY="59.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2775,6 +2836,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2782,12 +2844,12 @@
</node>
</node>
</node>
-<node TEXT="Templates" STYLE_REF="Advanced" FOLDED="true" ID="ID_183210534" CREATED="1323612770999" MODIFIED="1335300487437" NUMBERED="true" MIN_WIDTH="90">
-<node ID="ID_1268042238" CREATED="1323521409870" MODIFIED="1335095671231" HGAP="-59" VSHIFT="44" STYLE="fork"><richcontent TYPE="NODE">
+<node TEXT="Templates" STYLE_REF="Advanced" FOLDED="true" ID="ID_183210534" CREATED="1323612770999" MODIFIED="1335300487437" NUMBERED="true" MIN_WIDTH="90.0 px">
+<node ID="ID_1268042238" CREATED="1323521409870" MODIFIED="1335095671231" HGAP_QUANTITY="-59.0 px" VSHIFT_QUANTITY="44.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2795,12 +2857,13 @@
</p>
</body>
</html>
+
</richcontent>
-<node FOLDED="true" ID="ID_357953420" CREATED="1323613544023" MODIFIED="1335095694181" HGAP="-583" VSHIFT="137"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_357953420" CREATED="1323613544023" MODIFIED="1335095694181" HGAP_QUANTITY="-583.0 px" VSHIFT_QUANTITY="137.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2834,6 +2897,7 @@
</p>
</body>
</html>
+
</richcontent>
<node TEXT="My Example" STYLE_REF="MyTemplate" ID="ID_679492060" CREATED="1323614118804" MODIFIED="1323615655812">
<attribute NAME="birth date" VALUE=""/>
@@ -2865,7 +2929,7 @@
</node>
</node>
</node>
-<node TEXT="Other" STYLE_REF="Advanced" ID="ID_429763637" CREATED="1323251384433" MODIFIED="1335300487437" NUMBERED="true" MIN_WIDTH="90">
+<node TEXT="Other" STYLE_REF="Advanced" ID="ID_429763637" CREATED="1323251384433" MODIFIED="1335300487437" NUMBERED="true" MIN_WIDTH="90.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainWidth" LAST="false"/>
</hook>
@@ -2873,11 +2937,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_885396924" CREATED="1323522491275" MODIFIED="1335095704602" HGAP="-264" VSHIFT="32"><richcontent TYPE="NODE">
+<node ID="ID_885396924" CREATED="1323522491275" MODIFIED="1335095704602" HGAP_QUANTITY="-264.0 px" VSHIFT_QUANTITY="32.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2885,21 +2949,22 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Fixed node width" STYLE_REF="Advanced" FOLDED="true" ID="ID_1709254927" CREATED="1321975856238" MODIFIED="1335300487437" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Fixed node width" STYLE_REF="Advanced" FOLDED="true" ID="ID_1709254927" CREATED="1321975856238" MODIFIED="1335300487437" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_15604512" CREATED="1323522575632" MODIFIED="1335095713853" HGAP="-97" VSHIFT="88" MAX_WIDTH="300" MIN_WIDTH="300"><richcontent TYPE="NODE">
+<node ID="ID_15604512" CREATED="1323522575632" MODIFIED="1335095713853" HGAP_QUANTITY="-97.0 px" VSHIFT_QUANTITY="88.0 px" MAX_WIDTH="300.0 px" MIN_WIDTH="300.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2921,6 +2986,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2931,11 +2997,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_670948093" CREATED="1323522647369" MODIFIED="1335095725319" HGAP="-158" VSHIFT="42"><richcontent TYPE="NODE">
+<node ID="ID_670948093" CREATED="1323522647369" MODIFIED="1335095725319" HGAP_QUANTITY="-158.0 px" VSHIFT_QUANTITY="42.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -2943,28 +3009,29 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Paste options" STYLE_REF="Advanced" FOLDED="true" ID="ID_506336466" CREATED="1322990524257" MODIFIED="1335300487437" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Paste options" STYLE_REF="Advanced" FOLDED="true" ID="ID_506336466" CREATED="1322990524257" MODIFIED="1335300487437" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1072558009" CREATED="1323522694317" MODIFIED="1335095732838" HGAP="-71" VSHIFT="87"><richcontent TYPE="NODE">
+<node ID="ID_1072558009" CREATED="1323522694317" MODIFIED="1335095732838" HGAP_QUANTITY="-71.0 px" VSHIFT_QUANTITY="87.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
If you select menu <i>Edit > Paste</i> different paste options will be shown, like pasting text without format (plain text).
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -2979,6 +3046,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2987,16 +3055,16 @@
</node>
</node>
</node>
-<node TEXT="Publishing & sharing" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1613405030" CREATED="1314258163054" MODIFIED="1337158975198" NUMBERED="true" MIN_WIDTH="200" HGAP="19" VSHIFT="-17">
+<node TEXT="Publishing & sharing" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1613405030" CREATED="1314258163054" MODIFIED="1337158975198" NUMBERED="true" MIN_WIDTH="200.0 px" HGAP_QUANTITY="19.0 px" VSHIFT_QUANTITY="-17.0 px">
<node TEXT="Printing" STYLE_REF="Advanced" FOLDED="true" ID="ID_1344283469" CREATED="1314352873779" MODIFIED="1335300511773" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1759870173" CREATED="1323523347602" MODIFIED="1335095755224" HGAP="-38" VSHIFT="42"><richcontent TYPE="NODE">
+<node ID="ID_1759870173" CREATED="1323523347602" MODIFIED="1335095755224" HGAP_QUANTITY="-38.0 px" VSHIFT_QUANTITY="42.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -3007,6 +3075,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -3014,11 +3083,11 @@
</node>
</node>
<node TEXT="Presenting" STYLE_REF="Advanced" FOLDED="true" ID="ID_1747402695" CREATED="1335276169448" MODIFIED="1335515369728">
-<node STYLE_REF="TitlesContent" ID="ID_1269602804" CREATED="1335276178553" MODIFIED="1337347953181" HGAP="-54" VSHIFT="45"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_1269602804" CREATED="1335276178553" MODIFIED="1337347953181" HGAP_QUANTITY="-54.0 px" VSHIFT_QUANTITY="45.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -3026,6 +3095,7 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
@@ -3033,7 +3103,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="You can share mind maps with other users of Freeplane by interchanging the mindmap.mm file. Note that images are not part of a mindmap and therefore must be interchanged seperately. Make sure that at the new location the images are at the same relative location (subdirectory) they were when you developed your mind map. The best way to do this is to develop your mindmap.mm and the images in one (sub)directory. You can then zip this whole directory and unpack it at the other [...]
+<node TEXT="You can share mind maps with other users of Freeplane by interchanging the mindmap.mm file. Note that images are not part of a mindmap and therefore must be interchanged seperately. Make sure that at the new location the images are at the same relative location (subdirectory) they were when you developed your mind map. The best way to do this is to develop your mindmap.mm and the images in one (sub)directory. You can then zip this whole directory and unpack it at the other [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
@@ -3043,11 +3113,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1669899571" CREATED="1323523398700" MODIFIED="1336073288622" HGAP="-215" VSHIFT="233"><richcontent TYPE="NODE">
+<node ID="ID_1669899571" CREATED="1323523398700" MODIFIED="1336073288622" HGAP_QUANTITY="-215.0 px" VSHIFT_QUANTITY="233.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -3057,7 +3127,7 @@
To publish your mind map on Internet using a Java Applet, export your mindmap with <i>File > Export</i> and choose for the file format <i>Java Applet</i>. After the export you will have a file <i>yourmap.html</i> and a directory <i>yourmap.Html_files</i>. If you use images in your map, make sure when developing yourmap.mm these images are in the same directory where yourmap.mm resides. After the export, copy the images to yourmap.html_files. You can now move [...]
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -3081,6 +3151,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -3092,18 +3163,18 @@
<conditional_style ACTIVE="true" STYLE_REF="Professional" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_685749368" CREATED="1323895981367" MODIFIED="1336072642148" HGAP="-246" VSHIFT="115"><richcontent TYPE="NODE">
+<node ID="ID_685749368" CREATED="1323895981367" MODIFIED="1336072642148" HGAP_QUANTITY="-246.0 px" VSHIFT_QUANTITY="115.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
You can also publish a mind map directly on the Internet or Intranet. In that case Freeplane is needed to view the map. Use <i>File > Open map from URL</i>.to open the map and enter the full URL-address of the map.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -3118,6 +3189,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -3128,18 +3200,18 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="The Freeplane documentation desbribes ways how to interchange with texteditors, keeping some of the formatting code." ID="ID_1023242392" CREATED="1323523390908" MODIFIED="1335095794304" HGAP="-178" VSHIFT="32">
+<node TEXT="The Freeplane documentation desbribes ways how to interchange with texteditors, keeping some of the formatting code." ID="ID_1023242392" CREATED="1323523390908" MODIFIED="1335095794304" HGAP_QUANTITY="-178.0 px" VSHIFT_QUANTITY="32.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_766584529" CREATED="1320005728532" MODIFIED="1334247867982" HGAP="-4" VSHIFT="158" LINK="freeplaneApplications.mm" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_766584529" CREATED="1320005728532" MODIFIED="1334247867982" LINK="freeplaneApplications.mm" HGAP_QUANTITY="-4.0 px" VSHIFT_QUANTITY="158.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p style="text-align: center">
@@ -3147,6 +3219,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -3174,7 +3247,7 @@
</richcontent>
<hook NAME="FreeNode"/>
</node>
-<node TEXT="Node extensions" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_143196514" CREATED="1314206563418" MODIFIED="1335300552660" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Node extensions" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_143196514" CREATED="1314206563418" MODIFIED="1335300552660" NUMBERED="true" MIN_WIDTH="180.0 px">
<node TEXT="Edit text in node details" STYLE_REF="Advanced" ID="ID_898889730" CREATED="1314197390735" MODIFIED="1335301078849"><richcontent TYPE="DETAILS">
<html>
@@ -3213,24 +3286,24 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1704074218" CREATED="1323527323490" MODIFIED="1335095962723" HGAP="-186" VSHIFT="123"><richcontent TYPE="NODE">
+<node ID="ID_1704074218" CREATED="1323527323490" MODIFIED="1335095962723" HGAP_QUANTITY="-186.0 px" VSHIFT_QUANTITY="123.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Node content can be hidden permanently, only showing when you are hovering with the cursor over the node. This has the advantage that the space taken by the node keeps at a minimum.
</p>
<p>
-
+
</p>
<p>
To prepare a node for hovering, right-click the node and choose<i> Minimize node </i>to hide all information except the first part of the node core text. To restore the non-hidden state, click<i> Minimize node </i>again<i>. </i>
</p>
<p>
-
+
</p>
<p>
<b>Note </b>
@@ -3245,11 +3318,12 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="Hidden details" STYLE_REF="Advanced" ID="ID_1710723594" CREATED="1323462581502" MODIFIED="1323525821357" HGAP="24" VSHIFT="-12" STYLE="combined" TEXT_SHORTENED="true">
+<node TEXT="Hidden details" STYLE_REF="Advanced" ID="ID_1710723594" CREATED="1323462581502" MODIFIED="1323525821357" HGAP_QUANTITY="24.0 px" VSHIFT_QUANTITY="-12.0 px" STYLE="combined" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
@@ -3266,7 +3340,7 @@
</body>
</html>
</richcontent>
-<node TEXT="" ID="ID_1347491550" CREATED="1323462604083" MODIFIED="1323525624921" HGAP="-80" VSHIFT="50">
+<node TEXT="" ID="ID_1347491550" CREATED="1323462604083" MODIFIED="1323525624921" HGAP_QUANTITY="-80.0 px" VSHIFT_QUANTITY="50.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
@@ -3274,7 +3348,7 @@
</node>
</node>
</node>
-<node TEXT="Image (node extension)" STYLE_REF="Advanced" FOLDED="true" ID="ID_575269438" CREATED="1314215157545" MODIFIED="1335301078849" MIN_WIDTH="1">
+<node TEXT="Image (node extension)" STYLE_REF="Advanced" FOLDED="true" ID="ID_575269438" CREATED="1314215157545" MODIFIED="1335301078849" MIN_WIDTH="1.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainWidth" LAST="false"/>
</hook>
@@ -3282,7 +3356,7 @@
<html>
<head>
-
+
</head>
<body>
<p>
@@ -3290,24 +3364,25 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="Internal source" STYLE_REF="Advanced" FOLDED="true" ID="ID_1322185425" CREATED="1318936419394" MODIFIED="1336383756945" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="Internal source" STYLE_REF="Advanced" FOLDED="true" ID="ID_1322185425" CREATED="1318936419394" MODIFIED="1336383756945" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1990291656" CREATED="1323527938617" MODIFIED="1335095984797" HGAP="-95" VSHIFT="243"><richcontent TYPE="NODE">
+<node ID="ID_1990291656" CREATED="1323527938617" MODIFIED="1335095984797" HGAP_QUANTITY="-95.0 px" VSHIFT_QUANTITY="243.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
To add an image to a particular node, drag and drop the image on the upper part of the node. If you drop it on the child side of the node, the image is added to an automatically created new child. In both cases the image can be resized by dragging its lower-right corner.
</p>
<p>
-
+
</p>
<p>
Alternatives for adding an image are:
@@ -3321,7 +3396,7 @@
</li>
</ul>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -3348,6 +3423,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -3358,18 +3434,18 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node STYLE_REF="TitlesContent" ID="ID_594983153" CREATED="1318936453549" MODIFIED="1335095997496" HGAP="-99" VSHIFT="171" MAX_WIDTH="550"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_594983153" CREATED="1318936453549" MODIFIED="1335095997496" HGAP_QUANTITY="-99.0 px" VSHIFT_QUANTITY="171.0 px" MAX_WIDTH="550.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
An image from an external source like Internet can be added by copy and paste. Likewise, an image made with PrintScreen, can be added by pasting it. In both cases the image is added to a newly created child node of the node selected when you pressed paste. The pasted image can be resized by dragging its lower-right corner.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -3393,25 +3469,26 @@
</ul>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="In-line image" STYLE_REF="Professional" FOLDED="true" ID="ID_1242295211" CREATED="1314282819174" MODIFIED="1336383756945" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="In-line image" STYLE_REF="Professional" FOLDED="true" ID="ID_1242295211" CREATED="1314282819174" MODIFIED="1336383756945" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="Professional users can add images within text with so-called HTML-code. There is also a script for this. See the Freeplane documentation." ID="ID_796258305" CREATED="1323528211774" MODIFIED="1335096006918" HGAP="-82" VSHIFT="35" STYLE="combined">
+<node TEXT="Professional users can add images within text with so-called HTML-code. There is also a script for this. See the Freeplane documentation." ID="ID_796258305" CREATED="1323528211774" MODIFIED="1335096006918" HGAP_QUANTITY="-82.0 px" VSHIFT_QUANTITY="35.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
<node TEXT="change image" STYLE_REF="Advanced" FOLDED="true" ID="ID_88299847" CREATED="1336383616192" MODIFIED="1336383756930">
-<node STYLE_REF="TitlesContent" ID="ID_656004509" CREATED="1336383628931" MODIFIED="1336383740253" HGAP="-88" VSHIFT="28"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_656004509" CREATED="1336383628931" MODIFIED="1336383740253" HGAP_QUANTITY="-88.0 px" VSHIFT_QUANTITY="28.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -3419,13 +3496,14 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node TEXT="Attributes (node extension)" STYLE_REF="Professional" ID="ID_1324773677" CREATED="1314208168037" MODIFIED="1335301078849" MIN_WIDTH="1">
-<node TEXT="Attributes in node extensions" STYLE_REF="Professional" ID="ID_1657366174" CREATED="1314209542018" MODIFIED="1335096051051" HGAP="-160" VSHIFT="84" MAX_WIDTH="550">
-<attribute_layout NAME_WIDTH="34" VALUE_WIDTH="92"/>
+<node TEXT="Attributes (node extension)" STYLE_REF="Professional" ID="ID_1324773677" CREATED="1314208168037" MODIFIED="1335301078849" MIN_WIDTH="1.0 px">
+<node TEXT="Attributes in node extensions" STYLE_REF="Professional" ID="ID_1657366174" CREATED="1314209542018" MODIFIED="1335096051051" HGAP_QUANTITY="-160.0 px" VSHIFT_QUANTITY="84.0 px" MAX_WIDTH="550.0 px">
+<attribute_layout NAME_WIDTH="25.5 pt" VALUE_WIDTH="69.0 pt"/>
<attribute NAME="Name" VALUE="John"/>
<attribute NAME="email" VALUE="john at gmail.com"/>
<richcontent TYPE="DETAILS">
@@ -3441,7 +3519,7 @@
</body>
</html>
</richcontent>
-<node TEXT="How to add attributes to node details ?" STYLE_REF="Professional" ID="ID_1441506319" CREATED="1314210058883" MODIFIED="1335096024531" HGAP="-549" VSHIFT="219" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="How to add attributes to node details ?" STYLE_REF="Professional" ID="ID_1441506319" CREATED="1314210058883" MODIFIED="1335096024531" HGAP_QUANTITY="-549.0 px" VSHIFT_QUANTITY="219.0 px" MAX_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3477,7 +3555,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Value options" STYLE_REF="Professional" ID="ID_1108500341" CREATED="1314211635490" MODIFIED="1335096040038" HGAP="-547" VSHIFT="202" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="Value options" STYLE_REF="Professional" ID="ID_1108500341" CREATED="1314211635490" MODIFIED="1335096040038" HGAP_QUANTITY="-547.0 px" VSHIFT_QUANTITY="202.0 px" MAX_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3490,7 +3568,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Professional editing of attrtibutes" STYLE_REF="Professional" ID="ID_609269277" CREATED="1314278394970" MODIFIED="1337500610099" HGAP="-551" VSHIFT="123" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="Professional editing of attrtibutes" STYLE_REF="Professional" ID="ID_609269277" CREATED="1314278394970" MODIFIED="1337500610099" HGAP_QUANTITY="-551.0 px" VSHIFT_QUANTITY="123.0 px" MAX_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3503,8 +3581,8 @@
</body>
</html>
</richcontent>
-<node TEXT="Hyperlink (arrow) in attribute" STYLE_REF="Professional" ID="ID_457929879" CREATED="1312540477537" MODIFIED="1323091000613" HGAP="-550" VSHIFT="80" MAX_WIDTH="550">
-<attribute_layout NAME_WIDTH="48" VALUE_WIDTH="101"/>
+<node TEXT="Hyperlink (arrow) in attribute" STYLE_REF="Professional" ID="ID_457929879" CREATED="1312540477537" MODIFIED="1323091000613" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="80.0 px" MAX_WIDTH="550.0 px">
+<attribute_layout NAME_WIDTH="36.0 pt" VALUE_WIDTH="75.75 pt"/>
<richcontent TYPE="DETAILS">
<html>
@@ -3524,22 +3602,22 @@
</node>
</node>
</node>
-<node TEXT="Scientific formula (LaTeX)" STYLE_REF="Professional" FOLDED="true" ID="ID_616494746" CREATED="1314361765668" MODIFIED="1335301078849" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Scientific formula (LaTeX)" STYLE_REF="Professional" FOLDED="true" ID="ID_616494746" CREATED="1314361765668" MODIFIED="1335301078849" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1460441144" CREATED="1323527775837" MODIFIED="1335096059210" HGAP="-170" VSHIFT="61"><richcontent TYPE="NODE">
+<node ID="ID_1460441144" CREATED="1323527775837" MODIFIED="1335096059210" HGAP_QUANTITY="-170.0 px" VSHIFT_QUANTITY="61.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
If you want to display a scientific formula in a node, this is possible. Use <i>Edit > Node core > Edit LaTeX </i>to do so.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -3549,6 +3627,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -3556,12 +3635,12 @@
</node>
</node>
</node>
-<node TEXT="Notes of nodes" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_274601394" CREATED="1314208248182" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Notes of nodes" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_274601394" CREATED="1314208248182" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180.0 px">
<node ID="ID_1960771486" CREATED="1323524664411" MODIFIED="1329839626607"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p style="margin-top: 0">
@@ -3586,14 +3665,15 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="Date & time actions" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1959496513" CREATED="1303932101749" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Date & time actions" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1959496513" CREATED="1303932101749" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
-<node TEXT="Time management" STYLE_REF="Professional" ID="ID_1047570728" CREATED="1314367182383" MODIFIED="1330162826734" MAX_WIDTH="600" VSHIFT="40"><richcontent TYPE="DETAILS">
+<node TEXT="Time management" STYLE_REF="Professional" ID="ID_1047570728" CREATED="1314367182383" MODIFIED="1330162826734" MAX_WIDTH="600.0 px" VSHIFT_QUANTITY="40.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3621,24 +3701,26 @@
</html>
</richcontent>
</node>
-<node TEXT="Manage time..." STYLE_REF="Professional" ID="ID_1104707017" CREATED="1267746559867" MODIFIED="1323808343056" VSHIFT="10" MAX_WIDTH="450" STYLE="combined">
-<icon BUILTIN="../TimeManagementAction"/>
+<node TEXT="" ID="ID_982845598" CREATED="1455910877283" MODIFIED="1455910877283">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Manage time..." STYLE_REF="Professional" ID="ID_1104707017" CREATED="1267746559867" MODIFIED="1323808343056" VSHIFT_QUANTITY="10.0 px" MAX_WIDTH="450.0 px" STYLE="combined">
+<icon BUILTIN="../TimeManagementAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1158360877" CREATED="1323528703218" MODIFIED="1335096076292" HGAP="-114" VSHIFT="98" MAX_WIDTH="400" MIN_WIDTH="400"><richcontent TYPE="NODE">
+<node ID="ID_1158360877" CREATED="1323528703218" MODIFIED="1335096076292" HGAP_QUANTITY="-114.0 px" VSHIFT_QUANTITY="98.0 px" MAX_WIDTH="400.0 px" MIN_WIDTH="400.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Opens a dialog to set or change a date (text) or a reminder which has been attached to the selected node. The node and its predecessors show a clock icon. This icon flashes at the reminder time. Also a red exclamation mark flashes in the root node.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -3650,6 +3732,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
@@ -3670,17 +3753,17 @@
</node>
</node>
</node>
-<node TEXT="Manage tasks" STYLE_REF="Professional" ID="ID_1106133151" CREATED="1266247905093" MODIFIED="1323808350684" MAX_WIDTH="450" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Manage tasks" STYLE_REF="Professional" ID="ID_1106133151" CREATED="1266247905093" MODIFIED="1323808350684" MAX_WIDTH="450.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="../TimeListAction"/>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1106133151" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1106133151" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node ID="ID_1400536343" CREATED="1323528892096" MODIFIED="1335096083234" MAX_WIDTH="400" HGAP="-105" VSHIFT="114"><richcontent TYPE="NODE">
+<node ID="ID_1400536343" CREATED="1323528892096" MODIFIED="1335096083234" MAX_WIDTH="400.0 px" HGAP_QUANTITY="-105.0 px" VSHIFT_QUANTITY="114.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -3707,36 +3790,37 @@
</li>
</ul>
<p>
-
+
</p>
<p>
<font color="#000000" face="SansSerif, sans-serif">The entries can be searched, and changed with search and replace. </font>
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Remove reminder" STYLE_REF="Professional" FOLDED="true" ID="ID_148977369" CREATED="1303932208426" MODIFIED="1323808358937" MAX_WIDTH="450" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Remove reminder" STYLE_REF="Professional" FOLDED="true" ID="ID_148977369" CREATED="1303932208426" MODIFIED="1323808358937" MAX_WIDTH="450.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="../ReminderHookAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_740100275" CREATED="1323528999915" MODIFIED="1323808390464" HGAP="-125" VSHIFT="65"><richcontent TYPE="NODE">
+<node ID="ID_740100275" CREATED="1323528999915" MODIFIED="1323808390464" HGAP_QUANTITY="-125.0 px" VSHIFT_QUANTITY="65.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Remove the reminder of the selected node. For alternatives:
</p>
<p>
-
+
</p>
<p>
<b>See also</b>
@@ -3751,12 +3835,15 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
+<node TEXT="" ID="ID_441125142" CREATED="1455910877283" MODIFIED="1455910877283">
+<hook NAME="SummaryNode"/>
<node TEXT="" ID="ID_517678813" CREATED="1288542096079" MODIFIED="1330162899446" TEXT_SHORTENED="true">
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
@@ -3765,7 +3852,6 @@
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ProfessionalTopic" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<richcontent TYPE="DETAILS">
@@ -3782,12 +3868,13 @@
</richcontent>
</node>
</node>
-<node TEXT="Filtering & finding nodes" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_828862571" CREATED="1314109608813" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180">
+</node>
+<node TEXT="Filtering & finding nodes" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_828862571" CREATED="1314109608813" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180.0 px">
<node TEXT="Why filtering ?" STYLE_REF="Professional" FOLDED="true" ID="ID_887149959" CREATED="1314362530273" MODIFIED="1335301113247" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="Filtering is a means to only display nodes which you want to be visible. The same filter rules can be used to search or find information. The same filter rules are also used in conditional styles." ID="ID_1873557100" CREATED="1323769373332" MODIFIED="1329839797022" HGAP="-85" VSHIFT="30">
+<node TEXT="Filtering is a means to only display nodes which you want to be visible. The same filter rules can be used to search or find information. The same filter rules are also used in conditional styles." ID="ID_1873557100" CREATED="1323769373332" MODIFIED="1329839797022" HGAP_QUANTITY="-85.0 px" VSHIFT_QUANTITY="30.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
@@ -3797,11 +3884,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1650348629" CREATED="1323769479560" MODIFIED="1335096175025" HGAP="-180" VSHIFT="187"><richcontent TYPE="NODE">
+<node ID="ID_1650348629" CREATED="1323769479560" MODIFIED="1335096175025" HGAP_QUANTITY="-180.0 px" VSHIFT_QUANTITY="187.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -3825,19 +3912,19 @@
If you have set/entered these elements, you can click icon <b>Quick filter</b> to do the filtering. (See to the left which is icon Quick filter). Or you can click icon <b>Find</b> to just find one instance at a time.
</p>
<p>
-
+
</p>
<p>
The result of Quick filter may be modified by setting one or more so called filter options, see below. To exit filtering, click icon <b><i>No filtering</i></b>. (When using Find, it is not necessary to stop this action.)
</p>
<p>
-
+
</p>
<p>
The Freeplane documentation contains a full description and examples.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -3847,6 +3934,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -3976,6 +4064,9 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
+<node TEXT="" ID="ID_72206654" CREATED="1455910877284" MODIFIED="1455910877284">
+<hook NAME="FirstGroupNode"/>
+</node>
<node TEXT="Undo filter" STYLE_REF="ProfessionalTopic" ID="ID_619416419" CREATED="1310134532663" MODIFIED="1316165694590" TEXT_SHORTENED="true">
<icon BUILTIN="../undo_filter"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -3991,7 +4082,6 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4137,7 +4227,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<attribute_layout NAME_WIDTH="68" VALUE_WIDTH="68"/>
+<attribute_layout NAME_WIDTH="51.0 pt" VALUE_WIDTH="51.0 pt"/>
</node>
<node TEXT="Select all matching" STYLE_REF="ProfessionalTopic" ID="ID_164487469" CREATED="1310134532663" MODIFIED="1316165694652" TEXT_SHORTENED="true">
<icon BUILTIN="../select_all_found_nodes"/>
@@ -4244,12 +4334,17 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Filter actions" STYLE_REF="ProfessionalTopic" ID="ID_214063901" CREATED="1310496676053" MODIFIED="1329857056035">
+<node TEXT="" ID="ID_194244095" CREATED="1455910877284" MODIFIED="1455910877284">
<hook NAME="SummaryNode"/>
+<node TEXT="Filter actions" STYLE_REF="ProfessionalTopic" ID="ID_214063901" CREATED="1310496676053" MODIFIED="1329857056035">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
+</node>
+<node TEXT="" ID="ID_45242312" CREATED="1455910877284" MODIFIED="1455910877284">
+<hook NAME="FirstGroupNode"/>
+</node>
<node TEXT="Applies to filtered nodes (refine)" STYLE_REF="ProfessionalTopic" ID="ID_1768599003" CREATED="1310134532663" MODIFIED="1316165694668" TEXT_SHORTENED="true">
<icon BUILTIN="../applies_to_filtered_nodes"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4265,7 +4360,6 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4366,12 +4460,17 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Filter conditions / states" STYLE_REF="ProfessionalTopic" ID="ID_1103140596" CREATED="1310496750715" MODIFIED="1316165694699">
+<node TEXT="" ID="ID_727390550" CREATED="1455910877284" MODIFIED="1455910877284">
<hook NAME="SummaryNode"/>
+<node TEXT="Filter conditions / states" STYLE_REF="ProfessionalTopic" ID="ID_1103140596" CREATED="1310496750715" MODIFIED="1316165694699">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
+</node>
+<node TEXT="" ID="ID_1477879672" CREATED="1455910877284" MODIFIED="1455910877284">
+<hook NAME="FirstGroupNode"/>
+</node>
<node TEXT="Find previous" STYLE_REF="ProfessionalTopic" ID="ID_132872030" CREATED="1310134532663" MODIFIED="1316165694699" TEXT_SHORTENED="true">
<icon BUILTIN="../find_previous"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4404,7 +4503,6 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4445,42 +4543,45 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Finding / searching" STYLE_REF="ProfessionalTopic" ID="ID_721920269" CREATED="1310496838340" MODIFIED="1316165694699">
+<node TEXT="" ID="ID_1530166199" CREATED="1455910877284" MODIFIED="1455910877284">
<hook NAME="SummaryNode"/>
+<node TEXT="Finding / searching" STYLE_REF="ProfessionalTopic" ID="ID_721920269" CREATED="1310496838340" MODIFIED="1316165694699">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
</node>
+</node>
<node TEXT="Using filter sets" STYLE_REF="Professional" FOLDED="true" ID="ID_665978371" CREATED="1316203189752" MODIFIED="1335301113247" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_49510380" CREATED="1323529306279" MODIFIED="1335096200281" HGAP="-95" VSHIFT="103"><richcontent TYPE="NODE">
+<node ID="ID_49510380" CREATED="1323529306279" MODIFIED="1335096200281" HGAP_QUANTITY="-95.0 px" VSHIFT_QUANTITY="103.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Filters can be defined and kept for reuse on a later moment. Open <i>menu Filter > Filtercomposer </i>and define the filterrules you need. In doing so, you can also combine simple rules with AND and OR operators into more complex rules. And once you have defined a rule you can give it a label. After you have created all the rules you need, you can save the whole set. The set can than be shared with other people who can load it into the Filter composer.
</p>
<p>
-
+
</p>
<p>
The rules you defined with<i> Filter composer</i> are available in the filter menu bar. To activate a rule, click next to the field showing <i>"No filtering (remove)"</i> which drops down a list of all available rules. Click the rule you want and it will be executed. When you are finished, select <i>"No filtering (remove)"</i> again or click the icon-button <b><i>No filter</i></b>.
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Loading and using filter set for this Quick reference" STYLE_REF="Professional" FOLDED="true" ID="ID_1284293100" CREATED="1316177216317" MODIFIED="1335301113247" LINK="http://www.kioo.nl/freeplane/tutorial_en/filterSet" MIN_WIDTH="1">
+<node TEXT="Loading and using filter set for this Quick reference" STYLE_REF="Professional" FOLDED="true" ID="ID_1284293100" CREATED="1316177216317" MODIFIED="1335301113247" LINK="http://www.kioo.nl/freeplane/tutorial_en/filterSet" MIN_WIDTH="1.0 px">
<node TEXT="Consider using a powerfull feature of Freeplane, filtering, to present to you only the information of
one of these 3 levels (Beginner, Advanced, Professional) at a time.

The procedure for filtering is described below. If you click on the red arrow in my parent node, the instruction is illustrated in an animation." ID="ID_352888342" CREATED="1323529491351" MODIFIED="1329857586148"/>
<node TEXT="Load filter set for this Quick reference" ID="ID_551050917" CREATED="1317234746190" MODIFIED="1323808520350">
<icon BUILTIN="full-0"/>
@@ -4544,7 +4645,7 @@
<conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
</hook>
</node>
-<node TEXT="Unfold to make visible" ID="ID_1451237301" CREATED="1316176206878" MODIFIED="1323808558352" HGAP="15" VSHIFT="-8" LINK="FilterExampleEnd.jpg">
+<node TEXT="Unfold to make visible" ID="ID_1451237301" CREATED="1316176206878" MODIFIED="1323808558352" LINK="FilterExampleEnd.jpg" HGAP_QUANTITY="15.0 px" VSHIFT_QUANTITY="-8.0 px">
<icon BUILTIN="full-2"/>
<richcontent TYPE="DETAILS">
@@ -4571,7 +4672,7 @@
<conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
</hook>
</node>
-<node TEXT="View and finish" ID="ID_1331360426" CREATED="1316177379721" MODIFIED="1323808574857" VSHIFT="6" LINK="FilterExampleUnfold.jpg">
+<node TEXT="View and finish" ID="ID_1331360426" CREATED="1316177379721" MODIFIED="1323808574857" LINK="FilterExampleUnfold.jpg" VSHIFT_QUANTITY="6.0 px">
<icon BUILTIN="full-3"/>
<richcontent TYPE="DETAILS">
@@ -4600,23 +4701,23 @@
</node>
</node>
</node>
-<node TEXT="Protecting map or nodes" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1232153769" CREATED="1314339453691" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Protecting map or nodes" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1232153769" CREATED="1314339453691" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180.0 px">
<node TEXT="Protecting child nodes with a password" STYLE_REF="Professional" FOLDED="true" ID="ID_1433157907" CREATED="1314362016509" MODIFIED="1335301133075" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1784889270" CREATED="1323769644757" MODIFIED="1335096224025" HGAP="-249" VSHIFT="114"><richcontent TYPE="NODE">
+<node ID="ID_1784889270" CREATED="1323769644757" MODIFIED="1335096224025" HGAP_QUANTITY="-249.0 px" VSHIFT_QUANTITY="114.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
It is possible to protect your whole map, or a part of the map, with a password. If you define a password for a node, then all descendants of the node will keep hidden until the right password has been entered. Within the same map you can apply different passwords for different nodes and create layers of protection. To define a password for the children of the selected node, right-click the node and select <i>Password protection</i>.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -4631,6 +4732,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -4641,11 +4743,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_802748820" CREATED="1323769723123" MODIFIED="1335096231715" HGAP="-125" VSHIFT="41"><richcontent TYPE="NODE">
+<node ID="ID_802748820" CREATED="1323769723123" MODIFIED="1335096231715" HGAP_QUANTITY="-125.0 px" VSHIFT_QUANTITY="41.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -4653,6 +4755,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -4660,12 +4763,12 @@
</node>
</node>
</node>
-<node TEXT="Fine tuning Freeplane" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1746471823" CREATED="1314215326284" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Fine tuning Freeplane" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1746471823" CREATED="1314215326284" MODIFIED="1335300552676" NUMBERED="true" MIN_WIDTH="180.0 px">
<node ID="ID_931065203" CREATED="1323095428935" MODIFIED="1335301155181"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -4673,9 +4776,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="All nodes a bubble, particular edge,.." STYLE_REF="Advanced" FOLDED="true" ID="ID_210892586" CREATED="1321645917041" MODIFIED="1335301155197" TEXT_SHORTENED="true" MIN_WIDTH="1" STYLE="combined"><richcontent TYPE="DETAILS">
+<node TEXT="All nodes a bubble, particular edge,.." STYLE_REF="Advanced" FOLDED="true" ID="ID_210892586" CREATED="1321645917041" MODIFIED="1335301155197" TEXT_SHORTENED="true" MIN_WIDTH="1.0 px" STYLE="combined"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4688,11 +4792,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1274034553" CREATED="1323529940039" MODIFIED="1335096248797" HGAP="-234" VSHIFT="33"><richcontent TYPE="NODE">
+<node ID="ID_1274034553" CREATED="1323529940039" MODIFIED="1335096248797" HGAP_QUANTITY="-234.0 px" VSHIFT_QUANTITY="33.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -4700,16 +4804,17 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
-<node STYLE_REF="TitlesContent" ID="ID_423831026" CREATED="1335124455222" MODIFIED="1335125301266" HGAP="-231" VSHIFT="36"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_423831026" CREATED="1335124455222" MODIFIED="1335125301266" HGAP_QUANTITY="-231.0 px" VSHIFT_QUANTITY="36.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -4731,6 +4836,7 @@
</ul>
</body>
</html>
+
</richcontent>
</node>
</node>
@@ -4738,18 +4844,18 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1748316183" CREATED="1323530207075" MODIFIED="1336124389430" HGAP="-166" VSHIFT="114"><richcontent TYPE="NODE">
+<node ID="ID_1748316183" CREATED="1323530207075" MODIFIED="1336124389430" HGAP_QUANTITY="-166.0 px" VSHIFT_QUANTITY="114.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
In menu <i>View</i> you can set characteristics for node core, like width, selection border, border marking for formulas and the background color of revisions. You can set if and how node details should be displayed, with or without tool tip (hover text) and modification times. You can set if and which attributes are displayed. Also you can set if and how notes are displayed and with which type of window. Finally it is possible to set some characteristics of icons. [...]
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -4761,6 +4867,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -4771,11 +4878,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1788895132" CREATED="1323530348451" MODIFIED="1335096265679" HGAP="-167" VSHIFT="120"><richcontent TYPE="NODE">
+<node ID="ID_1788895132" CREATED="1323530348451" MODIFIED="1335096265679" HGAP_QUANTITY="-167.0 px" VSHIFT_QUANTITY="120.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -4800,24 +4907,25 @@
<span lang="EN-US">Docear is the successor of SciPlore MindMapping and funded by the European Union and German Federal Ministry of Economics and Technology.</span>
</p>
<p>
-
+
</p>
<p>
<b>Click the red arrow</b>
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Standard settings in Preferences" STYLE_REF="Professional" FOLDED="true" ID="ID_889570489" CREATED="1314730257257" MODIFIED="1335301155197" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="Standard settings in Preferences" STYLE_REF="Professional" FOLDED="true" ID="ID_889570489" CREATED="1314730257257" MODIFIED="1335301155197" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="Environment preferences" ID="ID_908072469" CREATED="1314708954177" MODIFIED="1335096277784" HGAP="-197" VSHIFT="103" MAX_WIDTH="550" MIN_WIDTH="550" STYLE="fork">
+<node TEXT="Environment preferences" ID="ID_908072469" CREATED="1314708954177" MODIFIED="1335096277784" HGAP_QUANTITY="-197.0 px" VSHIFT_QUANTITY="103.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="550.0 px" STYLE="fork">
<font BOLD="true"/>
<richcontent TYPE="DETAILS">
@@ -4855,7 +4963,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Appearance preferences" STYLE_REF="Introduction" ID="ID_1541392544" CREATED="1314709723082" MODIFIED="1323530642000" HGAP="-550" VSHIFT="145" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="Appearance preferences" STYLE_REF="Introduction" ID="ID_1541392544" CREATED="1314709723082" MODIFIED="1323530642000" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="145.0 px" MIN_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4880,7 +4988,7 @@
</html>
</richcontent>
<font BOLD="true"/>
-<node TEXT="Keystrokes preferences" STYLE_REF="Introduction" ID="ID_748518266" CREATED="1314720398255" MODIFIED="1335096299360" HGAP="-555" VSHIFT="70" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="Keystrokes preferences" STYLE_REF="Introduction" ID="ID_748518266" CREATED="1314720398255" MODIFIED="1335096299360" HGAP_QUANTITY="-555.0 px" VSHIFT_QUANTITY="70.0 px" MIN_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4897,7 +5005,7 @@
</html>
</richcontent>
<font BOLD="true"/>
-<node TEXT="Behaviour preferences" STYLE_REF="Introduction" ID="ID_1578508847" CREATED="1314720581515" MODIFIED="1335096307940" HGAP="-551" VSHIFT="169" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="Behaviour preferences" STYLE_REF="Introduction" ID="ID_1578508847" CREATED="1314720581515" MODIFIED="1335096307940" HGAP_QUANTITY="-551.0 px" VSHIFT_QUANTITY="169.0 px" MIN_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4952,7 +5060,7 @@
</html>
</richcontent>
<font BOLD="true"/>
-<node TEXT="HTML preferences" STYLE_REF="Introduction" ID="ID_1185446743" CREATED="1314729741193" MODIFIED="1323530646384" HGAP="-550" VSHIFT="161" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="HTML preferences" STYLE_REF="Introduction" ID="ID_1185446743" CREATED="1314729741193" MODIFIED="1323530646384" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="161.0 px" MIN_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4969,7 +5077,7 @@
</html>
</richcontent>
<font BOLD="true"/>
-<node TEXT="Plugins" STYLE_REF="Introduction" ID="ID_1546138946" CREATED="1314729857046" MODIFIED="1323531198276" HGAP="-550" VSHIFT="55" MIN_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="Plugins" STYLE_REF="Introduction" ID="ID_1546138946" CREATED="1314729857046" MODIFIED="1323531198276" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="55.0 px" MIN_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4997,18 +5105,18 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_801516363" CREATED="1324029189260" MODIFIED="1336124569174" HGAP="-193" VSHIFT="70"><richcontent TYPE="NODE">
+<node ID="ID_801516363" CREATED="1324029189260" MODIFIED="1336124569174" HGAP_QUANTITY="-193.0 px" VSHIFT_QUANTITY="70.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
The vertical spacing between nodes can be set for all nodes of a branch, existing and new ones. Keep Ctrl pressed, select a nodes handle (oval) and move the cursor up/down to change the vertical space for all nodes.
</p>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -5018,6 +5126,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -5028,24 +5137,25 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1965879157" CREATED="1323530732191" MODIFIED="1335096329702" HGAP="-174" VSHIFT="70"><richcontent TYPE="NODE">
+<node ID="ID_1965879157" CREATED="1323530732191" MODIFIED="1335096329702" HGAP_QUANTITY="-174.0 px" VSHIFT_QUANTITY="70.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
Freeplane has a very powerful scripting possibility based on Groovy. In this way you can provide for specialised functions which might be lacking.
</p>
<p>
-
+
</p>
<p>
There is a base of predefined scrips which are published on the Freeplane wiki. In this way you need not be a programmer to use scripts. Read more in the Freeplane documentation, visit the the wiki on add-ons and the <a href="http://freeplane.sourceforge.net/wiki/index.php/Scripting">wiki add-on scrips</a> .
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -5056,11 +5166,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_844014092" CREATED="1323530829949" MODIFIED="1335096339343" HGAP="-177" VSHIFT="169"><richcontent TYPE="NODE">
+<node ID="ID_844014092" CREATED="1323530829949" MODIFIED="1335096339343" HGAP_QUANTITY="-177.0 px" VSHIFT_QUANTITY="169.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -5090,7 +5200,7 @@
</li>
</ul>
<p>
-
+
</p>
<p>
<b>Note</b>
@@ -5102,6 +5212,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -5112,7 +5223,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="Spell check is pre-installed for English. For other languages, click the hyperlink. Download language_XX.ortho, in which XX is a two lettercode fo the language. Save this file in Tools > Open user directory > recources/ortho" ID="ID_1759599610" CREATED="1323530909501" MODIFIED="1335096347658" HGAP="-176" VSHIFT="39">
+<node TEXT="Spell check is pre-installed for English. For other languages, click the hyperlink. Download language_XX.ortho, in which XX is a two lettercode fo the language. Save this file in Tools > Open user directory > recources/ortho" ID="ID_1759599610" CREATED="1323530909501" MODIFIED="1335096347658" HGAP_QUANTITY="-176.0 px" VSHIFT_QUANTITY="39.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
@@ -5122,11 +5233,11 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_667200365" CREATED="1323530988242" MODIFIED="1335096356675" HGAP="-124" VSHIFT="49"><richcontent TYPE="NODE">
+<node ID="ID_667200365" CREATED="1323530988242" MODIFIED="1335096356675" HGAP_QUANTITY="-124.0 px" VSHIFT_QUANTITY="49.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -5134,18 +5245,19 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Add-ons" STYLE_REF="Professional" FOLDED="true" ID="ID_1156954596" CREATED="1319993853694" MODIFIED="1335301155197" LINK="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28install%29" MIN_WIDTH="1">
-<node STYLE_REF="TitlesContent" ID="ID_1670821464" CREATED="1330288802502" MODIFIED="1335096363601" HGAP="-72" VSHIFT="34"><richcontent TYPE="NODE">
+<node TEXT="Add-ons" STYLE_REF="Professional" FOLDED="true" ID="ID_1156954596" CREATED="1319993853694" MODIFIED="1335301155197" LINK="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28install%29" MIN_WIDTH="1.0 px">
+<node STYLE_REF="TitlesContent" ID="ID_1670821464" CREATED="1330288802502" MODIFIED="1335096363601" HGAP_QUANTITY="-72.0 px" VSHIFT_QUANTITY="34.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -5156,17 +5268,18 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node LOCALIZED_STYLE_REF="default" POSITION="left" ID="ID_871432906" CREATED="1335301290823" MODIFIED="1335301474192" HGAP="39" VSHIFT="105">
+<node LOCALIZED_STYLE_REF="default" POSITION="left" ID="ID_871432906" CREATED="1335301290823" MODIFIED="1335301474192" HGAP_QUANTITY="39.0 px" VSHIFT_QUANTITY="105.0 px">
<icon BUILTIN="idea"/>
<richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -5174,6 +5287,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5190,12 +5304,12 @@
</html>
</richcontent>
</node>
-<node TEXT="Best practices" STYLE_REF="Beginner" FOLDED="true" POSITION="left" ID="ID_722085722" CREATED="1314363768463" MODIFIED="1335300552676" BACKGROUND_COLOR="#00cc33" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="Best practices" STYLE_REF="Beginner" FOLDED="true" POSITION="left" ID="ID_722085722" CREATED="1314363768463" MODIFIED="1335300552676" BACKGROUND_COLOR="#00cc33" NUMBERED="true" MIN_WIDTH="180.0 px">
<node STYLE_REF="Beginner" ID="ID_163805859" CREATED="1314422714136" MODIFIED="1335301176959"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -5203,10 +5317,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
<node TEXT="The making of this mind map" STYLE_REF="Advanced" FOLDED="true" ID="ID_1394424447" CREATED="1329890506053" MODIFIED="1335301176959">
-<node TEXT="Main title with number" FOLDED="true" ID="ID_1866200606" CREATED="1329891158131" MODIFIED="1329923927942" NUMBERED="true" MIN_WIDTH="180"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Main title with number" FOLDED="true" ID="ID_1866200606" CREATED="1329891158131" MODIFIED="1329923927942" NUMBERED="true" MIN_WIDTH="180.0 px"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -5230,7 +5345,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Title" ID="ID_1129463861" CREATED="1329890593164" MODIFIED="1329896626655" VSHIFT="28"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Title" ID="ID_1129463861" CREATED="1329890593164" MODIFIED="1329896626655" VSHIFT_QUANTITY="28.0 px"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -5243,7 +5358,7 @@
</body>
</html>
</richcontent>
-<node TEXT="Content associated with title" ID="ID_1693370436" CREATED="1329890604168" MODIFIED="1329896589667" HGAP="19" VSHIFT="29"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Content associated with title" ID="ID_1693370436" CREATED="1329890604168" MODIFIED="1329896589667" HGAP_QUANTITY="19.0 px" VSHIFT_QUANTITY="29.0 px"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -5465,11 +5580,11 @@
</node>
<node TEXT="Display revisions" STYLE_REF="Advanced" ID="ID_1424120147" CREATED="1323615838293" MODIFIED="1335301176959" LINK="#ID_1437965047"/>
<node TEXT="Multiple views of one map" STYLE_REF="Advanced" FOLDED="true" ID="ID_1926778226" CREATED="1331306719166" MODIFIED="1335301176974">
-<node STYLE_REF="TitlesContent" ID="ID_1319135286" CREATED="1331306733589" MODIFIED="1335096420932" HGAP="-169" VSHIFT="61"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_1319135286" CREATED="1331306733589" MODIFIED="1335096420932" HGAP_QUANTITY="-169.0 px" VSHIFT_QUANTITY="61.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -5477,16 +5592,17 @@
</p>
</body>
</html>
+
</richcontent>
<font ITALIC="false"/>
</node>
</node>
<node TEXT="Restore from local history" STYLE_REF="Professional" FOLDED="true" ID="ID_1448419614" CREATED="1329412616257" MODIFIED="1335301176974">
-<node STYLE_REF="TitlesContent" ID="ID_1628771343" CREATED="1329412632660" MODIFIED="1335096430323" HGAP="-162" VSHIFT="25"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_1628771343" CREATED="1329412632660" MODIFIED="1335096430323" HGAP_QUANTITY="-162.0 px" VSHIFT_QUANTITY="25.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -5494,15 +5610,16 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
<node TEXT="Batch jobs" STYLE_REF="Professional" FOLDED="true" ID="ID_1371818753" CREATED="1330372522196" MODIFIED="1335301176974">
-<node STYLE_REF="TitlesContent" ID="ID_804893281" CREATED="1330372555097" MODIFIED="1335096437531" HGAP="-73" VSHIFT="78"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_804893281" CREATED="1330372555097" MODIFIED="1335096437531" HGAP_QUANTITY="-73.0 px" VSHIFT_QUANTITY="78.0 px"><richcontent TYPE="NODE">
<html>
<head>
-
+
</head>
<body>
<p>
@@ -5518,6 +5635,7 @@
</ul>
</body>
</html>
+
</richcontent>
</node>
</node>
diff --git a/freeplane/doc/freeplaneTutorial_ja.mm b/freeplane/doc/freeplaneTutorial_ja.mm
index 25918e5..ff4a75f 100644
--- a/freeplane/doc/freeplaneTutorial_ja.mm
+++ b/freeplane/doc/freeplaneTutorial_ja.mm
@@ -1,10 +1,10 @@
-<map version="freeplane 1.2.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
<attribute_registry>
<attribute_name VISIBLE="true" NAME="See also"/>
<attribute_name VISIBLE="true" NAME="a2"/>
</attribute_registry>
-<node LOCALIZED_STYLE_REF="default" FOLDED="false" ID="ID_1723255651" BACKGROUND_COLOR="#00ff66" VGAP="0">
+<node LOCALIZED_STYLE_REF="default" FOLDED="false" ID="ID_1723255651" CREATED="1455910883403" MODIFIED="1455910883403" BACKGROUND_COLOR="#00ff66" VGAP_QUANTITY="0.0 px">
<icon BUILTIN="bee"/>
<richcontent TYPE="NODE">
@@ -21,6 +21,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="MapStyle">
<conditional_styles>
@@ -31,11 +32,12 @@
</conjunct_condition>
</conditional_style>
</conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true" show_notes_in_map="false"/>
+ <properties fit_to_viewport="false;" show_icon_for_attributes="false" show_note_icons="true" show_notes_in_map="false"/>
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt">
+<font SIZE="24"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="defaultstyle.details">
<font SIZE="8"/>
</stylenode>
@@ -43,13 +45,16 @@
<edge COLOR="#808080" WIDTH="thin"/>
<font SIZE="8"/>
</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes">
+<font SIZE="9"/>
+</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.floating">
<edge STYLE="hide_edge"/>
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
<font SIZE="12"/>
</stylenode>
@@ -66,7 +71,7 @@
<font SIZE="12"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
<stylenode TEXT="Beginner" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
<font BOLD="true"/>
<edge STYLE="bezier" COLOR="#33ffcc"/>
@@ -115,8 +120,8 @@
<attribute NAME="birth date" VALUE=""/>
<attribute NAME="e-mail" VALUE=""/>
</stylenode>
-<stylenode TEXT="MainWidth" MIN_WIDTH="600"/>
-<stylenode TEXT="SubWidth" MAX_WIDTH="550" MIN_WIDTH="550"/>
+<stylenode TEXT="MainWidth" MIN_WIDTH="600.0 px"/>
+<stylenode TEXT="SubWidth" MAX_WIDTH="550.0 px" MIN_WIDTH="550.0 px"/>
<stylenode TEXT="Method" STYLE="as_parent">
<edge STYLE="horizontal"/>
</stylenode>
@@ -137,7 +142,7 @@
</map_styles>
</hook>
<hook NAME="FirstGroupNode"/>
-<node STYLE_REF="Beginner" POSITION="right" ID="ID_1820104438" HGAP="-121" VSHIFT="-55">
+<node STYLE_REF="Beginner" POSITION="right" ID="ID_1820104438" CREATED="1455910883405" MODIFIED="1455910883405" HGAP_QUANTITY="-121.0 px" VSHIFT_QUANTITY="-55.0 px">
<icon BUILTIN="video"/>
<icon BUILTIN="internet"/>
<richcontent TYPE="NODE">
@@ -152,6 +157,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -168,13 +174,12 @@
</richcontent>
<edge STYLE="hide_edge"/>
</node>
-<node TEXT="はじめに" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_86446891" BACKGROUND_COLOR="#00cc33" NUMBERED="true" MIN_WIDTH="200" HGAP="22" TEXT_SHORTENED="true">
-<hook NAME="FirstGroupNode"/>
-<node TEXT="目的" STYLE_REF="Beginner" FOLDED="true" ID="ID_1074607965">
+<node TEXT="はじめに" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_86446891" CREATED="1455910883406" MODIFIED="1455910883406" BACKGROUND_COLOR="#00cc33" NUMBERED="true" MIN_WIDTH="200.0 px" HGAP_QUANTITY="22.0 px" TEXT_SHORTENED="true">
+<node TEXT="目的" STYLE_REF="Beginner" FOLDED="true" ID="ID_1074607965" CREATED="1455910883406" MODIFIED="1455910883406">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1704300991" HGAP="-13" VSHIFT="65" STYLE="fork"><richcontent TYPE="NODE">
+<node ID="ID_1704300991" CREATED="1455910883406" MODIFIED="1455910883406" HGAP_QUANTITY="-13.0 px" VSHIFT_QUANTITY="65.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
@@ -192,14 +197,15 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="読み方ガイド" STYLE_REF="Beginner" FOLDED="true" ID="ID_195004053" MIN_WIDTH="1">
-<node ID="ID_525900700" STYLE="fork" HGAP="-69" VSHIFT="151"><richcontent TYPE="NODE">
+<node TEXT="読み方ガイド" STYLE_REF="Beginner" FOLDED="true" ID="ID_195004053" CREATED="1455910883407" MODIFIED="1455910883407" MIN_WIDTH="1.0 px">
+<node ID="ID_525900700" CREATED="1455910883407" MODIFIED="1455910883407" STYLE="fork" HGAP_QUANTITY="-69.0 px" VSHIFT_QUANTITY="151.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -246,53 +252,54 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="メインメニュー" STYLE_REF="Beginner" FOLDED="true" ID="ID_767122736">
-<node TEXT="さあ、始めよう" ID="ID_1060111837" HGAP="31" VSHIFT="342">
+<node TEXT="メインメニュー" STYLE_REF="Beginner" FOLDED="true" ID="ID_767122736" CREATED="1455910883407" MODIFIED="1455910883407">
+<node TEXT="さあ、始めよう" ID="ID_1060111837" CREATED="1455910883407" MODIFIED="1455910883407" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="342.0 px">
<icon BUILTIN="video"/>
<icon BUILTIN="internet"/>
</node>
-<node TEXT="" ID="ID_1720964325" HGAP="141" VSHIFT="11" STYLE="fork">
+<node TEXT="" ID="ID_1720964325" CREATED="1455910883407" MODIFIED="1455910883407" HGAP_QUANTITY="141.0 px" VSHIFT_QUANTITY="11.0 px" STYLE="fork">
<edge STYLE="hide_edge"/>
<hook URI="Images/doc/MenusPropertiesPanel.png" SIZE="0.43956044" NAME="ExternalObject"/>
-<node TEXT="メニューバー" ID="ID_745779360" HGAP="-712" VSHIFT="17">
+<node TEXT="メニューバー" ID="ID_745779360" CREATED="1455910883411" MODIFIED="1455910883411" HGAP_QUANTITY="-712.0 px" VSHIFT_QUANTITY="17.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_745779360" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#0000ff" WIDTH="1" TRANSPARENCY="90" FONT_SIZE="10" FONT_FAMILY="SansSerif" DESTINATION="ID_745779360" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0000ff" WIDTH="1" TRANSPARENCY="90" FONT_SIZE="10" FONT_FAMILY="SansSerif" DESTINATION="ID_745779360" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_745779360" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="ツールバー" ID="ID_1924639373" HGAP="-703" VSHIFT="-1">
+<node TEXT="ツールバー" ID="ID_1924639373" CREATED="1455910883411" MODIFIED="1455910883411" HGAP_QUANTITY="-703.0 px" VSHIFT_QUANTITY="-1.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1924639373" STARTINCLINATION="40;-5;" ENDINCLINATION="40;-5;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1924639373" STARTINCLINATION="40;-5;" ENDINCLINATION="40;-5;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="フィルタバー" ID="ID_1939718780" HGAP="-711">
+<node TEXT="フィルタバー" ID="ID_1939718780" CREATED="1455910883411" MODIFIED="1455910883411" HGAP_QUANTITY="-711.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1939718780" STARTINCLINATION="43;-13;" ENDINCLINATION="43;-13;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1939718780" STARTINCLINATION="43;-13;" ENDINCLINATION="43;-13;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Fバー" ID="ID_1406478692" HGAP="-688">
+<node TEXT="Fバー" ID="ID_1406478692" CREATED="1455910883411" MODIFIED="1455910883411" HGAP_QUANTITY="-688.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1406478692" STARTINCLINATION="46;-24;" ENDINCLINATION="46;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1406478692" STARTINCLINATION="46;-24;" ENDINCLINATION="46;-24;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="アイコンバー" ID="ID_1865250955" HGAP="-706" VSHIFT="-2">
+<node TEXT="アイコンバー" ID="ID_1865250955" CREATED="1455910883411" MODIFIED="1455910883411" HGAP_QUANTITY="-706.0 px" VSHIFT_QUANTITY="-2.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1865250955" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1865250955" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="プロパティパネル" ID="ID_303482588" HGAP="-146" VSHIFT="30">
+<node TEXT="プロパティパネル" ID="ID_303482588" CREATED="1455910883412" MODIFIED="1455910883412" HGAP_QUANTITY="-146.0 px" VSHIFT_QUANTITY="30.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_303482588" STARTINCLINATION="20;-28;" ENDINCLINATION="20;-28;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" BOLD="true" ITALIC="true"/>
<edge STYLE="hide_edge"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_303482588" STARTINCLINATION="20;-28;" ENDINCLINATION="20;-28;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
-<node TEXT="背景の
コンテキストメニュー" ID="ID_1471702513" HGAP="34" VSHIFT="-6"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="背景の
コンテキストメニュー" ID="ID_1471702513" CREATED="1455910883412" MODIFIED="1455910883412" HGAP_QUANTITY="34.0 px" VSHIFT_QUANTITY="-6.0 px"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -306,18 +313,18 @@
</html>
</richcontent>
<hook URI="Images/mouse/mouse_RB.png" SIZE="1.0" NAME="ExternalObject"/>
-<node TEXT="背景のコンテキストメニュー" ID="ID_1485150857" VSHIFT="180" STYLE="fork">
+<node TEXT="背景のコンテキストメニュー" ID="ID_1485150857" CREATED="1455910883412" MODIFIED="1455910883412" VSHIFT_QUANTITY="180.0 px" STYLE="fork">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1485150857" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
<font BOLD="true" ITALIC="true"/>
<hook URI="Images/doc/BackgroundContextMenu.png" SIZE="1.0" NAME="ExternalObject"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1485150857" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
-<node TEXT="プロパティパネル
を開く/閉じる" ID="ID_724121688" HGAP="56">
+<node TEXT="プロパティパネル
を開く/閉じる" ID="ID_724121688" CREATED="1455910883413" MODIFIED="1455910883413" HGAP_QUANTITY="56.0 px">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_724121688" STARTINCLINATION="137;-192;" ENDINCLINATION="137;-192;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
<edge STYLE="hide_edge"/>
<font BOLD="true" ITALIC="true"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_724121688" STARTINCLINATION="137;-192;" ENDINCLINATION="137;-192;" STARTARROW="DEFAULT" ENDARROW="NONE"/>
</node>
</node>
</node>
-<node TEXT="ヘルプ > ホットキー一覧" ID="ID_291675950" HGAP="39" VSHIFT="-217" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ヘルプ > ホットキー一覧" ID="ID_291675950" CREATED="1455910883413" MODIFIED="1455910883413" HGAP_QUANTITY="39.0 px" VSHIFT_QUANTITY="-217.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -330,16 +337,16 @@
</body>
</html>
</richcontent>
-<node TEXT="ホットキー一覧" ID="ID_1337797684">
+<node TEXT="ホットキー一覧" ID="ID_1337797684" CREATED="1455910883413" MODIFIED="1455910883413">
<hook URI="Images/doc/HotKeysTable.png" SIZE="0.8633093" NAME="ExternalObject"/>
</node>
</node>
</node>
-<node TEXT="ノード" STYLE_REF="Beginner" FOLDED="true" ID="ID_1368882439" MIN_WIDTH="1">
+<node TEXT="ノード" STYLE_REF="Beginner" FOLDED="true" ID="ID_1368882439" CREATED="1455910883413" MODIFIED="1455910883413" MIN_WIDTH="1.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_859940648" HGAP="-24" VSHIFT="88"><richcontent TYPE="NODE">
+<node ID="ID_859940648" CREATED="1455910883413" MODIFIED="1455910883413" HGAP_QUANTITY="-24.0 px" VSHIFT_QUANTITY="88.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -357,17 +364,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ノードの家族関係表示" STYLE_REF="Beginner" FOLDED="true" ID="ID_1971514033" TEXT_SHORTENED="true">
+<node TEXT="ノードの家族関係表示" STYLE_REF="Beginner" FOLDED="true" ID="ID_1971514033" CREATED="1455910883413" MODIFIED="1455910883413" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_1269567767" HGAP="-86" VSHIFT="97"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_1269567767" CREATED="1455910883414" MODIFIED="1455910883414" HGAP_QUANTITY="-86.0 px" VSHIFT_QUANTITY="97.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -385,23 +393,24 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="(家族) 親" STYLE_REF="ConsumerTopic" FOLDED="true" ID="ID_687495618" VSHIFT="20">
+<node TEXT="(家族) 親" STYLE_REF="ConsumerTopic" FOLDED="true" ID="ID_687495618" CREATED="1455910883414" MODIFIED="1455910883414" VSHIFT_QUANTITY="20.0 px">
<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1105307139" MIDDLE_LABEL="子 孫" STARTINCLINATION="25;-45;" ENDINCLINATION="-36;-44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="子" STYLE_REF="ConsumerTopic" ID="ID_1105307139">
+<node TEXT="子" STYLE_REF="ConsumerTopic" ID="ID_1105307139" CREATED="1455910883414" MODIFIED="1455910883414">
<edge STYLE="bezier"/>
</node>
</node>
</node>
</node>
-<node TEXT="ノードを折り畳む" STYLE_REF="Beginner" FOLDED="true" ID="ID_1338867820">
+<node TEXT="ノードを折り畳む" STYLE_REF="Beginner" FOLDED="true" ID="ID_1338867820" CREATED="1455910883414" MODIFIED="1455910883414">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_434382705" HGAP="-73" VSHIFT="178"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_434382705" CREATED="1455910883414" MODIFIED="1455910883414" HGAP_QUANTITY="-73.0 px" VSHIFT_QUANTITY="178.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -436,11 +445,12 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="1階層分だけ展開する" STYLE_REF="ConsumerTopic" ID="ID_321295556" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="1階層分だけ展開する" STYLE_REF="ConsumerTopic" ID="ID_321295556" CREATED="1455910883415" MODIFIED="1455910883415" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../unfold_one_level"/>
<richcontent TYPE="DETAILS">
@@ -460,7 +470,7 @@
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="1階層分だけ折り畳む" STYLE_REF="ConsumerTopic" ID="ID_831251421" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="1階層分だけ折り畳む" STYLE_REF="ConsumerTopic" ID="ID_831251421" CREATED="1455910883416" MODIFIED="1455910883416" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../fold_one_level"/>
<richcontent TYPE="DETAILS">
@@ -480,7 +490,7 @@
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="すべて展開する" STYLE_REF="ConsumerTopic" ID="ID_933325044" TEXT_SHORTENED="true" LINK="#ID_86446891" STYLE="as_parent">
+<node TEXT="すべて展開する" STYLE_REF="ConsumerTopic" ID="ID_933325044" CREATED="1455910883417" MODIFIED="1455910883417" LINK="#ID_86446891" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../unfold_all"/>
<richcontent TYPE="DETAILS">
@@ -517,7 +527,7 @@
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="すべて折り畳む" STYLE_REF="ConsumerTopic" ID="ID_657829947" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="すべて折り畳む" STYLE_REF="ConsumerTopic" ID="ID_657829947" CREATED="1455910883417" MODIFIED="1455910883417" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../fold_all"/>
<richcontent TYPE="DETAILS">
@@ -556,8 +566,8 @@
</node>
</node>
</node>
-<node TEXT="インターネット上のマップを開く" STYLE_REF="Advanced" FOLDED="true" ID="ID_794559549">
-<node STYLE_REF="TitlesContent" ID="ID_663032265" HGAP="-123" VSHIFT="34"><richcontent TYPE="NODE">
+<node TEXT="インターネット上のマップを開く" STYLE_REF="Advanced" FOLDED="true" ID="ID_794559549" CREATED="1455910883418" MODIFIED="1455910883418">
+<node STYLE_REF="TitlesContent" ID="ID_663032265" CREATED="1455910883418" MODIFIED="1455910883418" HGAP_QUANTITY="-123.0 px" VSHIFT_QUANTITY="34.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -569,16 +579,17 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node TEXT="マップの基本" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_1337127972" NUMBERED="true" MIN_WIDTH="200">
-<node TEXT="ノードコア" STYLE_REF="Beginner" FOLDED="true" ID="ID_1370298116" MIN_WIDTH="115" STYLE="combined">
+<node TEXT="マップの基本" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_1337127972" CREATED="1455910883419" MODIFIED="1455910883419" NUMBERED="true" MIN_WIDTH="200.0 px">
+<node TEXT="ノードコア" STYLE_REF="Beginner" FOLDED="true" ID="ID_1370298116" CREATED="1455910883419" MODIFIED="1455910883419" MIN_WIDTH="115.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1314148002" HGAP="-102" VSHIFT="105"><richcontent TYPE="NODE">
+<node ID="ID_1314148002" CREATED="1455910883419" MODIFIED="1455910883419" HGAP_QUANTITY="-102.0 px" VSHIFT_QUANTITY="105.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -602,13 +613,14 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node STYLE_REF="Beginner" FOLDED="true" ID="ID_268413071" STYLE="combined" MIN_WIDTH="115"><richcontent TYPE="NODE">
+<node STYLE_REF="Beginner" FOLDED="true" ID="ID_268413071" CREATED="1455910883420" MODIFIED="1455910883420" STYLE="combined" MIN_WIDTH="115.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -620,9 +632,10 @@
</p>
</body>
</html>
+
</richcontent>
<edge STYLE="bezier"/>
-<node ID="ID_318435221" HGAP="16" VSHIFT="139">
+<node ID="ID_318435221" CREATED="1455910883420" MODIFIED="1455910883420" HGAP_QUANTITY="16.0 px" VSHIFT_QUANTITY="139.0 px">
<icon BUILTIN="video"/>
<icon BUILTIN="internet"/>
<richcontent TYPE="NODE">
@@ -637,9 +650,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node FOLDED="true" ID="ID_265318117" HGAP="-100" VSHIFT="-2" STYLE="fork"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_265318117" CREATED="1455910883420" MODIFIED="1455910883420" HGAP_QUANTITY="-100.0 px" VSHIFT_QUANTITY="-2.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
@@ -671,13 +685,14 @@
</ul>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="新規マップ" STYLE_REF="BeginnerTopic" ID="ID_1310307853" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="新規マップ" STYLE_REF="BeginnerTopic" ID="ID_1310307853" CREATED="1455910883421" MODIFIED="1455910883421" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../filenew"/>
<richcontent TYPE="DETAILS">
@@ -692,13 +707,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="保存マップを開く..." STYLE_REF="BeginnerTopic" ID="ID_1284635316" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="保存マップを開く..." STYLE_REF="BeginnerTopic" ID="ID_1284635316" CREATED="1455910883422" MODIFIED="1455910883422" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../fileopen"/>
<richcontent TYPE="DETAILS">
@@ -713,13 +727,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="マップを印刷" STYLE_REF="BeginnerTopic" ID="ID_111478060" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="マップを印刷" STYLE_REF="BeginnerTopic" ID="ID_111478060" CREATED="1455910883424" MODIFIED="1455910883424" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../fileprint"/>
<richcontent TYPE="DETAILS">
@@ -743,7 +756,7 @@
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="切り取り" STYLE_REF="BeginnerTopic" ID="ID_353410114" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="切り取り" STYLE_REF="BeginnerTopic" ID="ID_353410114" CREATED="1455910883425" MODIFIED="1455910883425" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../editcut"/>
<richcontent TYPE="DETAILS">
@@ -762,13 +775,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="コピー" STYLE_REF="BeginnerTopic" ID="ID_1274800359" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="コピー" STYLE_REF="BeginnerTopic" ID="ID_1274800359" CREATED="1455910883425" MODIFIED="1455910883425" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../editcopy"/>
<richcontent TYPE="DETAILS">
@@ -792,7 +804,7 @@
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="貼り付け" STYLE_REF="BeginnerTopic" ID="ID_1705754282" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="貼り付け" STYLE_REF="BeginnerTopic" ID="ID_1705754282" CREATED="1455910883426" MODIFIED="1455910883426" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../editpaste"/>
<richcontent TYPE="DETAILS">
@@ -816,7 +828,7 @@
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="新規子ノード" STYLE_REF="BeginnerTopic" ID="ID_942355748" TEXT_SHORTENED="true" STYLE="as_parent">
+<node TEXT="新規子ノード" STYLE_REF="BeginnerTopic" ID="ID_942355748" CREATED="1455910883427" MODIFIED="1455910883427" TEXT_SHORTENED="true" STYLE="as_parent">
<icon BUILTIN="../idea"/>
<richcontent TYPE="DETAILS">
@@ -851,24 +863,24 @@
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="<Ins> 新規子ノード" ID="ID_45308529" STYLE="as_parent">
+<node TEXT="<Ins> 新規子ノード" ID="ID_45308529" CREATED="1455910883427" MODIFIED="1455910883427" STYLE="as_parent">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="<Shift>+<Enter> 新規行" ID="ID_396169297" STYLE="as_parent">
+<node TEXT="<Shift>+<Enter> 新規行" ID="ID_396169297" CREATED="1455910883427" MODIFIED="1455910883427" STYLE="as_parent">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="<Enter> 編集を完了し、ノードを選択" ID="ID_780427702" STYLE="as_parent">
+<node TEXT="<Enter> 編集を完了し、ノードを選択" ID="ID_780427702" CREATED="1455910883427" MODIFIED="1455910883427" STYLE="as_parent">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="2*<Enter> 新規兄弟ノード" ID="ID_420903085" STYLE="as_parent">
+<node TEXT="2*<Enter> 新規兄弟ノード" ID="ID_420903085" CREATED="1455910883427" MODIFIED="1455910883427" STYLE="as_parent">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="右クリック:コンテキストメニュー" ID="ID_435495519" STYLE="as_parent">
+<node TEXT="右クリック:コンテキストメニュー" ID="ID_435495519" CREATED="1455910883427" MODIFIED="1455910883427" STYLE="as_parent">
<edge STYLE="horizontal"/>
</node>
</node>
</node>
-<node STYLE_REF="Beginner" FOLDED="true" ID="ID_1279324490" STYLE="combined" MIN_WIDTH="115"><richcontent TYPE="NODE">
+<node STYLE_REF="Beginner" FOLDED="true" ID="ID_1279324490" CREATED="1455910883428" MODIFIED="1455910883428" STYLE="combined" MIN_WIDTH="115.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -880,8 +892,9 @@
</p>
</body>
</html>
+
</richcontent>
-<node ID="ID_1800844060" HGAP="17" VSHIFT="105">
+<node ID="ID_1800844060" CREATED="1455910883428" MODIFIED="1455910883428" HGAP_QUANTITY="17.0 px" VSHIFT_QUANTITY="105.0 px">
<icon BUILTIN="video"/>
<icon BUILTIN="internet"/>
<richcontent TYPE="NODE">
@@ -896,9 +909,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node FOLDED="true" ID="ID_1433249332" HGAP="-103" VSHIFT="-4" STYLE="fork"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_1433249332" CREATED="1455910883428" MODIFIED="1455910883428" HGAP_QUANTITY="-103.0 px" VSHIFT_QUANTITY="-4.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
@@ -921,6 +935,7 @@
</ul>
</body>
</html>
+
</richcontent>
<font ITALIC="false"/>
<edge STYLE="hide_edge"/>
@@ -928,22 +943,22 @@
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="独自のメニューあり" ID="ID_1425310908">
+<node TEXT="独自のメニューあり" ID="ID_1425310908" CREATED="1455910883428" MODIFIED="1455910883428">
<edge STYLE="horizontal"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
</hook>
</node>
-<node TEXT="<Enter> :新規行" ID="ID_1043315983">
+<node TEXT="<Enter> :新規行" ID="ID_1043315983" CREATED="1455910883428" MODIFIED="1455910883428">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="右クリック:コンテキストメニュー" ID="ID_1846126640">
+<node TEXT="右クリック:コンテキストメニュー" ID="ID_1846126640" CREATED="1455910883428" MODIFIED="1455910883428">
<edge STYLE="horizontal"/>
</node>
</node>
</node>
-<node TEXT="保存&閉じる" STYLE_REF="Beginner" FOLDED="true" ID="ID_48547188" STYLE="combined" MIN_WIDTH="115">
-<node FOLDED="true" ID="ID_1460485800" HGAP="-99" VSHIFT="40" STYLE="fork"><richcontent TYPE="NODE">
+<node TEXT="保存&閉じる" STYLE_REF="Beginner" FOLDED="true" ID="ID_48547188" CREATED="1455910883428" MODIFIED="1455910883428" STYLE="combined" MIN_WIDTH="115.0 px">
+<node FOLDED="true" ID="ID_1460485800" CREATED="1455910883429" MODIFIED="1455910883429" HGAP_QUANTITY="-99.0 px" VSHIFT_QUANTITY="40.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
@@ -955,13 +970,14 @@
</p>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="マップを(上書き)保存" STYLE_REF="BeginnerTopic" ID="ID_1253878525" TEXT_SHORTENED="true">
+<node TEXT="マップを(上書き)保存" STYLE_REF="BeginnerTopic" ID="ID_1253878525" CREATED="1455910883429" MODIFIED="1455910883429" TEXT_SHORTENED="true">
<icon BUILTIN="../filesave"/>
<richcontent TYPE="DETAILS">
@@ -985,7 +1001,7 @@
</hook>
<edge STYLE="horizontal"/>
</node>
-<node STYLE_REF="BeginnerTopic" ID="ID_449363060" TEXT_SHORTENED="true">
+<node STYLE_REF="BeginnerTopic" ID="ID_449363060" CREATED="1455910883429" MODIFIED="1455910883429" TEXT_SHORTENED="true">
<icon BUILTIN="../filesaveas"/>
<richcontent TYPE="NODE">
@@ -1003,6 +1019,7 @@
</div>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -1021,13 +1038,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="表示中のマップを閉じる" STYLE_REF="BeginnerTopic" ID="ID_1018458898" TEXT_SHORTENED="true">
+<node TEXT="表示中のマップを閉じる" STYLE_REF="BeginnerTopic" ID="ID_1018458898" CREATED="1455910883430" MODIFIED="1455910883430" TEXT_SHORTENED="true">
<icon BUILTIN="../close"/>
<richcontent TYPE="DETAILS">
@@ -1053,9 +1069,9 @@
</node>
</node>
</node>
-<node TEXT="フリーノード" STYLE_REF="Advanced" FOLDED="true" ID="ID_1401167294" MIN_WIDTH="80">
-<node TEXT="ポストイットノード:自由に位置指定できる、自由にフローティング" STYLE_REF="Advanced" FOLDED="true" ID="ID_630972811" HGAP="18" VSHIFT="227" STYLE="combined">
-<node FOLDED="true" ID="ID_830664496" HGAP="-268" VSHIFT="77" STYLE="fork"><richcontent TYPE="NODE">
+<node TEXT="フリーノード" STYLE_REF="Advanced" FOLDED="true" ID="ID_1401167294" CREATED="1455910883431" MODIFIED="1455910883431" MIN_WIDTH="80.0 px">
+<node TEXT="ポストイットノード:自由に位置指定できる、自由にフローティング" STYLE_REF="Advanced" FOLDED="true" ID="ID_630972811" CREATED="1455910883431" MODIFIED="1455910883431" HGAP_QUANTITY="18.0 px" VSHIFT_QUANTITY="227.0 px" STYLE="combined">
+<node FOLDED="true" ID="ID_830664496" CREATED="1455910883431" MODIFIED="1455910883431" HGAP_QUANTITY="-268.0 px" VSHIFT_QUANTITY="77.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
@@ -1067,14 +1083,15 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="エッジの線が表示されないフローティングノードは、凡例、見出し、要約、著者などのメタ情報をマップに付加することを想定してい [...]
+<node TEXT="エッジの線が表示されないフローティングノードは、凡例、見出し、要約、著者などのメタ情報をマップに付加することを想定してい [...]
</node>
</node>
-<node TEXT="フリーフローティングノードの作成と移動" STYLE_REF="Advanced" FOLDED="true" ID="ID_1951042775" VGAP="0" HGAP="40" VSHIFT="-20" TEXT_SHORTENED="true" STYLE="fork"><richcontent TYPE="DETAILS">
+<node TEXT="フリーフローティングノードの作成と移動" STYLE_REF="Advanced" FOLDED="true" ID="ID_1951042775" CREATED="1455910883432" MODIFIED="1455910883432" VGAP_QUANTITY="0.0 px" HGAP_QUANTITY="40.0 px" VSHIFT_QUANTITY="-20.0 px" TEXT_SHORTENED="true" STYLE="fork"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1084,7 +1101,7 @@
</body>
</html>
</richcontent>
-<node ID="ID_591131207" HGAP="-192" VSHIFT="157" STYLE="fork"><richcontent TYPE="NODE">
+<node ID="ID_591131207" CREATED="1455910883432" MODIFIED="1455910883432" HGAP_QUANTITY="-192.0 px" VSHIFT_QUANTITY="157.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
@@ -1119,15 +1136,16 @@
</ul>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
</node>
</node>
-<node TEXT="フリーフローティングノードの作成と移動" STYLE_REF="Advanced" FOLDED="true" ID="ID_128387683" VGAP="0" HGAP="17" VSHIFT="-230" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="フリーフローティングノードの作成と移動" STYLE_REF="Advanced" FOLDED="true" ID="ID_128387683" CREATED="1455910883432" MODIFIED="1455910883432" VGAP_QUANTITY="0.0 px" HGAP_QUANTITY="17.0 px" VSHIFT_QUANTITY="-230.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1188410566" HGAP="-234" VSHIFT="213"><richcontent TYPE="NODE">
+<node ID="ID_1188410566" CREATED="1455910883432" MODIFIED="1455910883432" HGAP_QUANTITY="-234.0 px" VSHIFT_QUANTITY="213.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1162,13 +1180,14 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
</hook>
</node>
-<node TEXT="フリーフローティングノード" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_1757242560" HGAP="608" VSHIFT="23" MAX_WIDTH="150">
+<node TEXT="フリーフローティングノード" LOCALIZED_STYLE_REF="defaultstyle.floating" ID="ID_1757242560" CREATED="1455910883433" MODIFIED="1455910883433" HGAP_QUANTITY="608.0 px" VSHIFT_QUANTITY="23.0 px" MAX_WIDTH="150.0 px">
<hook NAME="FreeNode"/>
<richcontent TYPE="DETAILS">
@@ -1186,10 +1205,10 @@
</node>
</node>
</node>
-<node TEXT="アイコン" STYLE_REF="Advanced" FOLDED="true" ID="ID_222393549" STYLE="combined" MIN_WIDTH="80">
+<node TEXT="アイコン" STYLE_REF="Advanced" FOLDED="true" ID="ID_222393549" CREATED="1455910883433" MODIFIED="1455910883433" STYLE="combined" MIN_WIDTH="80.0 px">
<icon BUILTIN="bookmark"/>
<icon BUILTIN="idea"/>
-<node ID="ID_715025500" HGAP="-56" VSHIFT="153" STYLE="fork"><richcontent TYPE="NODE">
+<node ID="ID_715025500" CREATED="1455910883433" MODIFIED="1455910883433" HGAP_QUANTITY="-56.0 px" VSHIFT_QUANTITY="153.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
@@ -1237,13 +1256,14 @@
</ul>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
</node>
</node>
-<node TEXT="画 像" STYLE_REF="Advanced" FOLDED="true" ID="ID_1795262306" MIN_WIDTH="80">
-<node TEXT="画 像 (ノードコア)" STYLE_REF="Advanced" FOLDED="true" ID="ID_806240384" STYLE="combined" HGAP="18" VSHIFT="12">
-<node ID="ID_199889694" HGAP="-104" VSHIFT="89" STYLE="fork"><richcontent TYPE="NODE">
+<node TEXT="画 像" STYLE_REF="Advanced" FOLDED="true" ID="ID_1795262306" CREATED="1455910883434" MODIFIED="1455910883434" MIN_WIDTH="80.0 px">
+<node TEXT="画 像 (ノードコア)" STYLE_REF="Advanced" FOLDED="true" ID="ID_806240384" CREATED="1455910883434" MODIFIED="1455910883434" STYLE="combined" HGAP_QUANTITY="18.0 px" VSHIFT_QUANTITY="12.0 px">
+<node ID="ID_199889694" CREATED="1455910883434" MODIFIED="1455910883434" HGAP_QUANTITY="-104.0 px" VSHIFT_QUANTITY="89.0 px" STYLE="fork"><richcontent TYPE="NODE">
<html>
<head>
@@ -1266,16 +1286,17 @@
</ul>
</body>
</html>
+
</richcontent>
<edge STYLE="hide_edge"/>
</node>
</node>
-<node TEXT="画像ファイルへのリンク(赤い矢印" STYLE_REF="Advanced" FOLDED="true" ID="ID_1955041924" HGAP="17" VSHIFT="-1" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="画像ファイルへのリンク(赤い矢印" STYLE_REF="Advanced" FOLDED="true" ID="ID_1955041924" CREATED="1455910883434" MODIFIED="1455910883434" HGAP_QUANTITY="17.0 px" VSHIFT_QUANTITY="-1.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<edge STYLE="bezier"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_728788498" HGAP="-145" VSHIFT="169"><richcontent TYPE="NODE">
+<node ID="ID_728788498" CREATED="1455910883434" MODIFIED="1455910883434" HGAP_QUANTITY="-145.0 px" VSHIFT_QUANTITY="169.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1306,18 +1327,19 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="インライン画像" STYLE_REF="Professional" FOLDED="true" ID="ID_680497355" HGAP="17" VSHIFT="-10" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="インライン画像" STYLE_REF="Professional" FOLDED="true" ID="ID_680497355" CREATED="1455910883434" MODIFIED="1455910883434" HGAP_QUANTITY="17.0 px" VSHIFT_QUANTITY="-10.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<edge STYLE="bezier"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_990348986" HGAP="-72" VSHIFT="33"><richcontent TYPE="NODE">
+<node ID="ID_990348986" CREATED="1455910883435" MODIFIED="1455910883435" HGAP_QUANTITY="-72.0 px" VSHIFT_QUANTITY="33.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1329,6 +1351,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1336,14 +1359,14 @@
</node>
</node>
</node>
-<node TEXT="進捗度指標" STYLE_REF="Professional" FOLDED="true" ID="ID_1644368711" MIN_WIDTH="100">
-<node TEXT="ある種の進捗度表示が必要な場合、大小の進捗指標図を付すことができます。進捗度は変えることができます。進捗度を変える手順は [...]
-<node TEXT="小さい進捗指標図(アイコン)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1826965169" HGAP="26" VSHIFT="1" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="進捗度指標" STYLE_REF="Professional" FOLDED="true" ID="ID_1644368711" CREATED="1455910883435" MODIFIED="1455910883435" MIN_WIDTH="100.0 px">
+<node TEXT="ある種の進捗度表示が必要な場合、大小の進捗指標図を付すことができます。進捗度は変えることができます。進捗度を変える手順は [...]
+<node TEXT="小さい進捗指標図(アイコン)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1826965169" CREATED="1455910883435" MODIFIED="1455910883435" HGAP_QUANTITY="26.0 px" VSHIFT_QUANTITY="1.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="25%"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1268781768" HGAP="-135" VSHIFT="32"><richcontent TYPE="NODE">
+<node ID="ID_1268781768" CREATED="1455910883435" MODIFIED="1455910883435" HGAP_QUANTITY="-135.0 px" VSHIFT_QUANTITY="32.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1355,19 +1378,20 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="大きい進捗指標図(アイコンと画像)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1080017148" HGAP="24" VSHIFT="-52" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="大きい進捗指標図(アイコンと画像)" STYLE_REF="Advanced" FOLDED="true" ID="ID_1080017148" CREATED="1455910883435" MODIFIED="1455910883435" HGAP_QUANTITY="24.0 px" VSHIFT_QUANTITY="-52.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="0%"/>
<hook URI="freeplaneresource:/images/svg/Progress_tenth_01.svg" SIZE="1.0" NAME="ExternalObject"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node ID="ID_522359814" HGAP="-182" VSHIFT="122"><richcontent TYPE="NODE">
+<node ID="ID_522359814" CREATED="1455910883435" MODIFIED="1455910883435" HGAP_QUANTITY="-182.0 px" VSHIFT_QUANTITY="122.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1393,6 +1417,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1400,11 +1425,11 @@
</node>
</node>
</node>
-<node TEXT="ノードを統合" STYLE_REF="Professional" FOLDED="true" ID="ID_998103410" MAX_WIDTH="600" MIN_WIDTH="100" STYLE="bubble">
+<node TEXT="ノードを統合" STYLE_REF="Professional" FOLDED="true" ID="ID_998103410" CREATED="1455910883436" MODIFIED="1455910883436" MAX_WIDTH="600.0 px" MIN_WIDTH="100.0 px" STYLE="bubble">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_795220191" HGAP="-84" VSHIFT="80"><richcontent TYPE="NODE">
+<node ID="ID_795220191" CREATED="1455910883436" MODIFIED="1455910883436" HGAP_QUANTITY="-84.0 px" VSHIFT_QUANTITY="80.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1430,18 +1455,19 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ノードを分割" STYLE_REF="Professional" FOLDED="true" ID="ID_247213553" MAX_WIDTH="600" MIN_WIDTH="100" STYLE="combined">
+<node TEXT="ノードを分割" STYLE_REF="Professional" FOLDED="true" ID="ID_247213553" CREATED="1455910883436" MODIFIED="1455910883436" MAX_WIDTH="600.0 px" MIN_WIDTH="100.0 px" STYLE="combined">
<font ITALIC="false"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_497224980" HGAP="-86" VSHIFT="135"><richcontent TYPE="NODE">
+<node ID="ID_497224980" CREATED="1455910883436" MODIFIED="1455910883436" HGAP_QUANTITY="-86.0 px" VSHIFT_QUANTITY="135.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1472,17 +1498,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="計 算" STYLE_REF="Professional" FOLDED="true" ID="ID_448338872" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formula" MIN_WIDTH="100" STYLE="combined">
+<node TEXT="計 算" STYLE_REF="Professional" FOLDED="true" ID="ID_448338872" CREATED="1455910883436" MODIFIED="1455910883436" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formula" MIN_WIDTH="100.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_60050529" HGAP="-83" VSHIFT="116"><richcontent TYPE="NODE">
+<node ID="ID_60050529" CREATED="1455910883437" MODIFIED="1455910883437" HGAP_QUANTITY="-83.0 px" VSHIFT_QUANTITY="116.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1511,6 +1538,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1518,12 +1546,12 @@
</node>
</node>
</node>
-<node TEXT="ノードの選択と移動" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_272980743" NUMBERED="true" MIN_WIDTH="200">
-<node TEXT="マップのスクロールとパンニング表示" STYLE_REF="Beginner" FOLDED="true" ID="ID_1577961914" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="ノードの選択と移動" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_272980743" CREATED="1455910883438" MODIFIED="1455910883438" NUMBERED="true" MIN_WIDTH="200.0 px">
+<node TEXT="マップのスクロールとパンニング表示" STYLE_REF="Beginner" FOLDED="true" ID="ID_1577961914" CREATED="1455910883438" MODIFIED="1455910883438" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1560196388" HGAP="-187" VSHIFT="52"><richcontent TYPE="NODE">
+<node ID="ID_1560196388" CREATED="1455910883438" MODIFIED="1455910883438" HGAP_QUANTITY="-187.0 px" VSHIFT_QUANTITY="52.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1543,6 +1571,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1550,13 +1579,15 @@
</hook>
</node>
</node>
-<node TEXT="選 択" STYLE_REF="Beginner" FOLDED="true" ID="ID_1573267345" MIN_WIDTH="60">
+<node TEXT="" ID="ID_119208509" CREATED="1455910883556" MODIFIED="1455910883556">
<hook NAME="FirstGroupNode"/>
-<node TEXT="自動選択" STYLE_REF="Beginner" FOLDED="true" ID="ID_1387234491" MAX_WIDTH="600" STYLE="combined">
+</node>
+<node TEXT="選 択" STYLE_REF="Beginner" FOLDED="true" ID="ID_1573267345" CREATED="1455910883438" MODIFIED="1455910883438" MIN_WIDTH="60.0 px">
+<node TEXT="自動選択" STYLE_REF="Beginner" FOLDED="true" ID="ID_1387234491" CREATED="1455910883438" MODIFIED="1455910883438" MAX_WIDTH="600.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1185537684" HGAP="-52" VSHIFT="43"><richcontent TYPE="NODE">
+<node ID="ID_1185537684" CREATED="1455910883438" MODIFIED="1455910883438" HGAP_QUANTITY="-52.0 px" VSHIFT_QUANTITY="43.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1568,6 +1599,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1575,12 +1607,12 @@
</hook>
</node>
</node>
-<node TEXT="選択フォーカスを保持" STYLE_REF="Beginner" FOLDED="true" ID="ID_970057223" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="選択フォーカスを保持" STYLE_REF="Beginner" FOLDED="true" ID="ID_970057223" CREATED="1455910883438" MODIFIED="1455910883438" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
<edge STYLE="bezier" COLOR="#33ffcc"/>
-<node ID="ID_299898759" HGAP="-125" VSHIFT="39"><richcontent TYPE="NODE">
+<node ID="ID_299898759" CREATED="1455910883438" MODIFIED="1455910883438" HGAP_QUANTITY="-125.0 px" VSHIFT_QUANTITY="39.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1592,6 +1624,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1600,9 +1633,9 @@
<edge STYLE="hide_edge"/>
</node>
</node>
-<node TEXT="ルートへジャンプするキー" STYLE_REF="Beginner" FOLDED="true" ID="ID_1316263866" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="ルートへジャンプするキー" STYLE_REF="Beginner" FOLDED="true" ID="ID_1316263866" CREATED="1455910883439" MODIFIED="1455910883439" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<edge STYLE="bezier"/>
-<node ID="ID_279008116" HGAP="-145" VSHIFT="23"><richcontent TYPE="NODE">
+<node ID="ID_279008116" CREATED="1455910883439" MODIFIED="1455910883439" HGAP_QUANTITY="-145.0 px" VSHIFT_QUANTITY="23.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1614,6 +1647,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1621,8 +1655,8 @@
</hook>
</node>
</node>
-<node TEXT="ノードをすべて選択" STYLE_REF="Beginner" FOLDED="true" ID="ID_376722702">
-<node STYLE_REF="TitlesContent" ID="ID_1214336373" HGAP="-107" VSHIFT="33"><richcontent TYPE="NODE">
+<node TEXT="ノードをすべて選択" STYLE_REF="Beginner" FOLDED="true" ID="ID_376722702" CREATED="1455910883439" MODIFIED="1455910883439">
+<node STYLE_REF="TitlesContent" ID="ID_1214336373" CREATED="1455910883439" MODIFIED="1455910883439" HGAP_QUANTITY="-107.0 px" VSHIFT_QUANTITY="33.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1634,11 +1668,14 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node ID="ID_1801157892" HGAP="16" VSHIFT="8">
+<node TEXT="" ID="ID_489361336" CREATED="1455910883560" MODIFIED="1455910883560">
+<hook NAME="SummaryNode"/>
+<node ID="ID_1801157892" CREATED="1455910883439" MODIFIED="1455910883439" HGAP_QUANTITY="16.0 px" VSHIFT_QUANTITY="8.0 px">
<icon BUILTIN="video"/>
<icon BUILTIN="internet"/>
<richcontent TYPE="NODE">
@@ -1653,42 +1690,46 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="移 動" STYLE_REF="Beginner" FOLDED="true" ID="ID_1560992291" MAX_WIDTH="600" MIN_WIDTH="60">
-<node TEXT="ノードの階層間移動" STYLE_REF="Beginner" FOLDED="true" ID="ID_125921821" MAX_WIDTH="550" STYLE="combined">
+</node>
+<node TEXT="移 動" STYLE_REF="Beginner" FOLDED="true" ID="ID_1560992291" CREATED="1455910883439" MODIFIED="1455910883439" MAX_WIDTH="600.0 px" MIN_WIDTH="60.0 px">
+<node TEXT="" ID="ID_799049956" CREATED="1455910883561" MODIFIED="1455910883561">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノードの階層間移動" STYLE_REF="Beginner" FOLDED="true" ID="ID_125921821" CREATED="1455910883439" MODIFIED="1455910883439" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
</hook>
-<node TEXT="あるノードを現在の親ノードから切り離し、別の親に結びつけるには、当該ノードをクリックして新しい位置にドラッグするだけです [...]
+<node TEXT="あるノードを現在の親ノードから切り離し、別の親に結びつけるには、当該ノードをクリックして新しい位置にドラッグするだけです [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="解説ビデオ" ID="ID_760768670" LINK="https://www.youtube.com/watch?v=0xkUzsd4naA" HGAP="30" VSHIFT="10" MIN_WIDTH="1">
+<node TEXT="解説ビデオ" ID="ID_760768670" CREATED="1455910883502" MODIFIED="1455910883502" LINK="https://www.youtube.com/watch?v=0xkUzsd4naA" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="10.0 px" MIN_WIDTH="1.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node TEXT="連結ノードの空間移動" STYLE_REF="Beginner" FOLDED="true" ID="ID_293115184" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="連結ノードの空間移動" STYLE_REF="Beginner" FOLDED="true" ID="ID_293115184" CREATED="1455910883502" MODIFIED="1455910883502" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="他のノードとの結合関係を損なうことなく、ノードの位置を変更するするには、ノードの親ノード側にある楕円形の操作ハンドルを見 [...]
+<node TEXT="他のノードとの結合関係を損なうことなく、ノードの位置を変更するするには、ノードの親ノード側にある楕円形の操作ハンドルを見 [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ドロップの位置" STYLE_REF="Beginner" FOLDED="true" ID="ID_1039655261" MAX_WIDTH="600" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="ドロップの位置" STYLE_REF="Beginner" FOLDED="true" ID="ID_1039655261" CREATED="1455910883503" MODIFIED="1455910883503" MAX_WIDTH="600.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_786303568" HGAP="-72" VSHIFT="88" MIN_WIDTH="80"><richcontent TYPE="NODE">
+<node ID="ID_786303568" CREATED="1455910883503" MODIFIED="1455910883503" HGAP_QUANTITY="-72.0 px" VSHIFT_QUANTITY="88.0 px" MIN_WIDTH="80.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1716,6 +1757,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1723,7 +1765,9 @@
</hook>
</node>
</node>
-<node ID="ID_1561397135" HGAP="16" VSHIFT="8">
+<node TEXT="" ID="ID_387936617" CREATED="1455910883561" MODIFIED="1455910883561">
+<hook NAME="SummaryNode"/>
+<node ID="ID_1561397135" CREATED="1455910883503" MODIFIED="1455910883503" HGAP_QUANTITY="16.0 px" VSHIFT_QUANTITY="8.0 px">
<icon BUILTIN="video"/>
<icon BUILTIN="internet"/>
<richcontent TYPE="NODE">
@@ -1738,14 +1782,15 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="グループの移動" STYLE_REF="Advanced" FOLDED="true" ID="ID_1040002877" MAX_WIDTH="600" MIN_WIDTH="1" STYLE="combined">
+</node>
+<node TEXT="グループの移動" STYLE_REF="Advanced" FOLDED="true" ID="ID_1040002877" CREATED="1455910883503" MODIFIED="1455910883503" MAX_WIDTH="600.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1239614830" HGAP="-84" VSHIFT="62"><richcontent TYPE="NODE">
+<node ID="ID_1239614830" CREATED="1455910883503" MODIFIED="1455910883503" HGAP_QUANTITY="-84.0 px" VSHIFT_QUANTITY="62.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1765,14 +1810,15 @@
</ol>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ノードの位置をリセット" STYLE_REF="Advanced" FOLDED="true" ID="ID_1352824494">
-<node STYLE_REF="TitlesContent" ID="ID_688846542" HGAP="-121" VSHIFT="31"><richcontent TYPE="NODE">
+<node TEXT="ノードの位置をリセット" STYLE_REF="Advanced" FOLDED="true" ID="ID_1352824494" CREATED="1455910883503" MODIFIED="1455910883503">
+<node STYLE_REF="TitlesContent" ID="ID_688846542" CREATED="1455910883504" MODIFIED="1455910883504" HGAP_QUANTITY="-121.0 px" VSHIFT_QUANTITY="31.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1784,15 +1830,16 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node TEXT="ノードを並べ替え" STYLE_REF="Advanced" FOLDED="true" ID="ID_1014457432" MAX_WIDTH="600" STYLE="combined">
+<node TEXT="ノードを並べ替え" STYLE_REF="Advanced" FOLDED="true" ID="ID_1014457432" CREATED="1455910883504" MODIFIED="1455910883504" MAX_WIDTH="600.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_915226922" HGAP="-80" VSHIFT="44"><richcontent TYPE="NODE">
+<node ID="ID_915226922" CREATED="1455910883504" MODIFIED="1455910883504" HGAP_QUANTITY="-80.0 px" VSHIFT_QUANTITY="44.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1804,6 +1851,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1811,12 +1859,12 @@
</node>
</node>
</node>
-<node TEXT="ノードの関係付けとグループ化" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_215646874" NUMBERED="true" MIN_WIDTH="200">
-<node TEXT="線(エッジ)" STYLE_REF="Beginner" FOLDED="true" ID="ID_1492225657" STYLE="combined">
+<node TEXT="ノードの関係付けとグループ化" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_215646874" CREATED="1455910883504" MODIFIED="1455910883504" NUMBERED="true" MIN_WIDTH="200.0 px">
+<node TEXT="線(エッジ)" STYLE_REF="Beginner" FOLDED="true" ID="ID_1492225657" CREATED="1455910883504" MODIFIED="1455910883504" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_751107880" HGAP="-28" VSHIFT="43"><richcontent TYPE="NODE">
+<node ID="ID_751107880" CREATED="1455910883504" MODIFIED="1455910883504" HGAP_QUANTITY="-28.0 px" VSHIFT_QUANTITY="43.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1828,6 +1876,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -1835,11 +1884,11 @@
</hook>
</node>
</node>
-<node TEXT="コネクタ" STYLE_REF="Beginner" FOLDED="true" ID="ID_1073407528" STYLE="combined">
+<node TEXT="コネクタ" STYLE_REF="Beginner" FOLDED="true" ID="ID_1073407528" CREATED="1455910883505" MODIFIED="1455910883505" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_1649729730" HGAP="-55" VSHIFT="150"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_1649729730" CREATED="1455910883505" MODIFIED="1455910883505" HGAP_QUANTITY="-55.0 px" VSHIFT_QUANTITY="150.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1884,27 +1933,28 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="BeginnerTopic" LAST="false"/>
</hook>
-<node TEXT="a" FOLDED="true" ID="ID_1328399304" HGAP="25" STYLE="as_parent">
-<edge STYLE="hide_edge"/>
+<node TEXT="a" FOLDED="true" ID="ID_1328399304" CREATED="1455910883505" MODIFIED="1455910883505" HGAP_QUANTITY="25.0 px" STYLE="as_parent">
<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_581303769" MIDDLE_LABEL="label" STARTINCLINATION="9;-23;" ENDINCLINATION="-28;-89;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="b" FOLDED="true" ID="ID_273400211">
+<edge STYLE="hide_edge"/>
+<node TEXT="b" FOLDED="true" ID="ID_273400211" CREATED="1455910883505" MODIFIED="1455910883505">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_273400211" MIDDLE_LABEL="connector
without
begin" STARTINCLINATION="19;86;" ENDINCLINATION="19;86;" STARTARROW="NONE" ENDARROW="NONE"/>
<edge STYLE="bezier"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_273400211" MIDDLE_LABEL="connector
without
begin" STARTINCLINATION="19;86;" ENDINCLINATION="19;86;" STARTARROW="NONE" ENDARROW="NONE"/>
-<node TEXT="c" ID="ID_581303769"/>
+<node TEXT="c" ID="ID_581303769" CREATED="1455910883505" MODIFIED="1455910883505"/>
</node>
</node>
</node>
</node>
-<node TEXT="まとめノードグループ" STYLE_REF="Advanced" FOLDED="true" ID="ID_1700918771" STYLE="combined">
+<node TEXT="まとめノードグループ" STYLE_REF="Advanced" FOLDED="true" ID="ID_1700918771" CREATED="1455910883505" MODIFIED="1455910883505" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_651594550" HGAP="-119" VSHIFT="78"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_651594550" CREATED="1455910883505" MODIFIED="1455910883505" HGAP_QUANTITY="-119.0 px" VSHIFT_QUANTITY="78.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1927,25 +1977,28 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="a" STYLE_REF="AdvancedTopic" ID="ID_902940862">
+<node TEXT="" ID="ID_451552808" CREATED="1455910883561" MODIFIED="1455910883561">
<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="b" STYLE_REF="AdvancedTopic" ID="ID_303013117"/>
-<node TEXT="c" STYLE_REF="AdvancedTopic" ID="ID_1837144570" VSHIFT="-9"/>
-<node TEXT="まとめノード" STYLE_REF="AdvancedTopic" ID="ID_460668684">
+<node TEXT="a" STYLE_REF="AdvancedTopic" ID="ID_902940862" CREATED="1455910883506" MODIFIED="1455910883506"/>
+<node TEXT="b" STYLE_REF="AdvancedTopic" ID="ID_303013117" CREATED="1455910883506" MODIFIED="1455910883506"/>
+<node TEXT="c" STYLE_REF="AdvancedTopic" ID="ID_1837144570" CREATED="1455910883506" MODIFIED="1455910883506" VSHIFT_QUANTITY="-9.0 px"/>
+<node TEXT="" ID="ID_1921250554" CREATED="1455910883561" MODIFIED="1455910883561">
<hook NAME="SummaryNode"/>
+<node TEXT="まとめノード" STYLE_REF="AdvancedTopic" ID="ID_460668684" CREATED="1455910883506" MODIFIED="1455910883506"/>
</node>
</node>
</node>
-<node TEXT="雲囲いノードグループ" STYLE_REF="Advanced" FOLDED="true" ID="ID_1150908697" STYLE="combined">
+<node TEXT="雲囲いノードグループ" STYLE_REF="Advanced" FOLDED="true" ID="ID_1150908697" CREATED="1455910883506" MODIFIED="1455910883506" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_1862713604" HGAP="-101" VSHIFT="52"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_1862713604" CREATED="1455910883506" MODIFIED="1455910883506" HGAP_QUANTITY="-101.0 px" VSHIFT_QUANTITY="52.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -1957,21 +2010,22 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="雲 a" STYLE_REF="AdvancedTopic" FOLDED="true" ID="ID_1742435994" VSHIFT="15">
+<node TEXT="雲 a" STYLE_REF="AdvancedTopic" FOLDED="true" ID="ID_1742435994" CREATED="1455910883506" MODIFIED="1455910883506" VSHIFT_QUANTITY="15.0 px">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="b" ID="ID_1270291744"/>
-<node TEXT="c" ID="ID_1022872809"/>
+<node TEXT="b" ID="ID_1270291744" CREATED="1455910883506" MODIFIED="1455910883506"/>
+<node TEXT="c" ID="ID_1022872809" CREATED="1455910883506" MODIFIED="1455910883506"/>
</node>
-<node TEXT="雲 b" STYLE_REF="AdvancedTopic" FOLDED="true" ID="ID_539843005" HGAP="30" VSHIFT="-9">
+<node TEXT="雲 b" STYLE_REF="AdvancedTopic" FOLDED="true" ID="ID_539843005" CREATED="1455910883506" MODIFIED="1455910883506" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="-9.0 px">
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-<node TEXT="e" ID="ID_249943796"/>
-<node TEXT="f" ID="ID_1428582117"/>
+<node TEXT="e" ID="ID_249943796" CREATED="1455910883506" MODIFIED="1455910883506"/>
+<node TEXT="f" ID="ID_1428582117" CREATED="1455910883506" MODIFIED="1455910883506"/>
</node>
-<node STYLE_REF="AdvancedTopic" ID="ID_649516172" TEXT_SHORTENED="true">
+<node STYLE_REF="AdvancedTopic" ID="ID_649516172" CREATED="1455910883506" MODIFIED="1455910883506" TEXT_SHORTENED="true">
<icon BUILTIN="../Cloud24"/>
<richcontent TYPE="NODE">
@@ -1985,6 +2039,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -2007,20 +2062,20 @@
</node>
</node>
</node>
-<node TEXT="ハイパーリンク" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_114835202" NUMBERED="true" MIN_WIDTH="200">
-<node TEXT="リンクとは?" FOLDED="true" ID="ID_55001637">
+<node TEXT="ハイパーリンク" STYLE_REF="Beginner" FOLDED="true" POSITION="right" ID="ID_114835202" CREATED="1455910883507" MODIFIED="1455910883507" NUMBERED="true" MIN_WIDTH="200.0 px">
+<node TEXT="リンクとは?" FOLDED="true" ID="ID_55001637" CREATED="1455910883507" MODIFIED="1455910883507">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Beginner" LAST="false"/>
</hook>
-<node TEXT="ダイナミックリンク(ハイパーリンク)は、リンク元ノードからリンク先オブジェクトに向けた電子的関係付けのことです。リンク先 [...]
+<node TEXT="ダイナミックリンク(ハイパーリンク)は、リンク元ノードからリンク先オブジェクトに向けた電子的関係付けのことです。リンク先 [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="アンカーを使ってノードをリンク" STYLE_REF="Beginner" FOLDED="true" ID="ID_1524719322">
-<node STYLE_REF="TitlesContent" ID="ID_1594135890" HGAP="-66" VSHIFT="117"><richcontent TYPE="NODE">
+<node TEXT="アンカーを使ってノードをリンク" STYLE_REF="Beginner" FOLDED="true" ID="ID_1524719322" CREATED="1455910883507" MODIFIED="1455910883507">
+<node STYLE_REF="TitlesContent" ID="ID_1594135890" CREATED="1455910883508" MODIFIED="1455910883508" HGAP_QUANTITY="-66.0 px" VSHIFT_QUANTITY="117.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2054,15 +2109,16 @@
</ul>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="外部リンク" STYLE_REF="Beginner" FOLDED="true" ID="ID_640110372" LINK="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane" STYLE="combined">
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="161"/>
+<node TEXT="外部リンク" STYLE_REF="Beginner" FOLDED="true" ID="ID_640110372" CREATED="1455910883508" MODIFIED="1455910883508" LINK="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane" STYLE="combined">
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="120.75 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1913035829" HGAP="-75" VSHIFT="192"><richcontent TYPE="NODE">
+<node ID="ID_1913035829" CREATED="1455910883508" MODIFIED="1455910883508" HGAP_QUANTITY="-75.0 px" VSHIFT_QUANTITY="192.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2120,6 +2176,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2127,11 +2184,11 @@
</hook>
</node>
</node>
-<node TEXT="内部リンク" STYLE_REF="Beginner" FOLDED="true" ID="ID_1942100751" LINK="#ID_86446891" STYLE="combined">
+<node TEXT="内部リンク" STYLE_REF="Beginner" FOLDED="true" ID="ID_1942100751" CREATED="1455910883508" MODIFIED="1455910883508" LINK="#ID_86446891" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1830541497" HGAP="-78" VSHIFT="89"><richcontent TYPE="NODE">
+<node ID="ID_1830541497" CREATED="1455910883509" MODIFIED="1455910883509" HGAP_QUANTITY="-78.0 px" VSHIFT_QUANTITY="89.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2157,6 +2214,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2164,11 +2222,11 @@
</hook>
</node>
</node>
-<node TEXT="E-mail リンク" STYLE_REF="Professional" FOLDED="true" ID="ID_869144882" LINK="mailto:%20jokro at freeplane.nl">
+<node TEXT="E-mail リンク" STYLE_REF="Professional" FOLDED="true" ID="ID_869144882" CREATED="1455910883509" MODIFIED="1455910883509" LINK="mailto:%20jokro at freeplane.nl">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1480409284" HGAP="-64" VSHIFT="145"><richcontent TYPE="NODE">
+<node ID="ID_1480409284" CREATED="1455910883509" MODIFIED="1455910883509" HGAP_QUANTITY="-64.0 px" VSHIFT_QUANTITY="145.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2202,13 +2260,14 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node STYLE_REF="Professional" FOLDED="true" ID="ID_241324782" STYLE="combined"><richcontent TYPE="NODE">
+<node STYLE_REF="Professional" FOLDED="true" ID="ID_241324782" CREATED="1455910883509" MODIFIED="1455910883509" STYLE="combined"><richcontent TYPE="NODE">
<html>
<head>
@@ -2220,11 +2279,12 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1356533861" HGAP="-81" VSHIFT="244"><richcontent TYPE="NODE">
+<node ID="ID_1356533861" CREATED="1455910883509" MODIFIED="1455910883509" HGAP_QUANTITY="-81.0 px" VSHIFT_QUANTITY="244.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2290,17 +2350,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="機能(メニュー項目)へのリンク" STYLE_REF="Professional" FOLDED="true" ID="ID_350080162" STYLE="combined">
+<node TEXT="機能(メニュー項目)へのリンク" STYLE_REF="Professional" FOLDED="true" ID="ID_350080162" CREATED="1455910883510" MODIFIED="1455910883510" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1108178356" HGAP="-132" VSHIFT="86"><richcontent TYPE="NODE">
+<node ID="ID_1108178356" CREATED="1455910883510" MODIFIED="1455910883510" HGAP_QUANTITY="-132.0 px" VSHIFT_QUANTITY="86.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2326,17 +2387,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Fキー" STYLE_REF="Professional" FOLDED="true" ID="ID_1819697018" STYLE="combined">
+<node TEXT="Fキー" STYLE_REF="Professional" FOLDED="true" ID="ID_1819697018" CREATED="1455910883511" MODIFIED="1455910883511" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_116460964" HGAP="-26" VSHIFT="60"><richcontent TYPE="NODE">
+<node ID="ID_116460964" CREATED="1455910883511" MODIFIED="1455910883511" HGAP_QUANTITY="-26.0 px" VSHIFT_QUANTITY="60.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2348,17 +2410,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="外部から特定ノードへのリンク" STYLE_REF="Professional" FOLDED="true" ID="ID_1418102707" STYLE="combined">
+<node TEXT="外部から特定ノードへのリンク" STYLE_REF="Professional" FOLDED="true" ID="ID_1418102707" CREATED="1455910883511" MODIFIED="1455910883511" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_822375535" HGAP="-160" VSHIFT="117"><richcontent TYPE="NODE">
+<node ID="ID_822375535" CREATED="1455910883511" MODIFIED="1455910883511" HGAP_QUANTITY="-160.0 px" VSHIFT_QUANTITY="117.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2381,6 +2444,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2388,17 +2452,17 @@
</node>
</node>
</node>
-<node TEXT="書式とスタイル" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1778719162" NUMBERED="true" MIN_WIDTH="200" TEXT_SHORTENED="true">
+<node TEXT="書式とスタイル" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1778719162" CREATED="1455910883512" MODIFIED="1455910883512" NUMBERED="true" MIN_WIDTH="200.0 px" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
-<node TEXT="プロパティ" STYLE_REF="Advanced" FOLDED="true" ID="ID_873516196" NUMBERED="true" MIN_WIDTH="90">
-<node TEXT="プロパティパネル" STYLE_REF="Advanced" FOLDED="true" ID="ID_1812601804" HGAP="32" VSHIFT="457" MAX_WIDTH="550" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="プロパティ" STYLE_REF="Advanced" FOLDED="true" ID="ID_873516196" CREATED="1455910883512" MODIFIED="1455910883512" NUMBERED="true" MIN_WIDTH="90.0 px">
+<node TEXT="プロパティパネル" STYLE_REF="Advanced" FOLDED="true" ID="ID_1812601804" CREATED="1455910883512" MODIFIED="1455910883512" HGAP_QUANTITY="32.0 px" VSHIFT_QUANTITY="457.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="info"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_503272481" HGAP="-105" VSHIFT="97"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_503272481" CREATED="1455910883512" MODIFIED="1455910883512" HGAP_QUANTITY="-105.0 px" VSHIFT_QUANTITY="97.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2424,11 +2488,12 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node ID="ID_757079047"><richcontent TYPE="NODE">
+<node ID="ID_757079047" CREATED="1455910883512" MODIFIED="1455910883512"><richcontent TYPE="NODE">
<html>
<head>
@@ -2440,15 +2505,16 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node TEXT="個別プロパティの編集" STYLE_REF="Advanced" FOLDED="true" ID="ID_1707940964" HGAP="30" VSHIFT="1" MAX_WIDTH="500" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="個別プロパティの編集" STYLE_REF="Advanced" FOLDED="true" ID="ID_1707940964" CREATED="1455910883512" MODIFIED="1455910883512" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="1.0 px" MAX_WIDTH="500.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_676577574" HGAP="-109" VSHIFT="123"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_676577574" CREATED="1455910883512" MODIFIED="1455910883512" HGAP_QUANTITY="-109.0 px" VSHIFT_QUANTITY="123.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2472,30 +2538,31 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
<edge STYLE="hide_edge"/>
-<node TEXT="直線" STYLE_REF="AdvancedTopic" ID="ID_34702829" HGAP="14" VSHIFT="-26">
+<node TEXT="直線" STYLE_REF="AdvancedTopic" ID="ID_34702829" CREATED="1455910883513" MODIFIED="1455910883513" HGAP_QUANTITY="14.0 px" VSHIFT_QUANTITY="-26.0 px">
<edge STYLE="linear"/>
</node>
-<node TEXT="ベジェ曲線" STYLE_REF="AdvancedTopic" ID="ID_1333040751" HGAP="35" VSHIFT="-27">
+<node TEXT="ベジェ曲線" STYLE_REF="AdvancedTopic" ID="ID_1333040751" CREATED="1455910883513" MODIFIED="1455910883513" HGAP_QUANTITY="35.0 px" VSHIFT_QUANTITY="-27.0 px">
<edge STYLE="bezier"/>
</node>
-<node TEXT="線を隠す" STYLE_REF="AdvancedTopic" ID="ID_1968961455" HGAP="40" VSHIFT="-5">
+<node TEXT="線を隠す" STYLE_REF="AdvancedTopic" ID="ID_1968961455" CREATED="1455910883513" MODIFIED="1455910883513" HGAP_QUANTITY="40.0 px" VSHIFT_QUANTITY="-5.0 px">
<edge STYLE="hide_edge"/>
</node>
-<node TEXT="直角曲がり" STYLE_REF="AdvancedTopic" ID="ID_494591913" HGAP="39" VSHIFT="25">
+<node TEXT="直角曲がり" STYLE_REF="AdvancedTopic" ID="ID_494591913" CREATED="1455910883513" MODIFIED="1455910883513" HGAP_QUANTITY="39.0 px" VSHIFT_QUANTITY="25.0 px">
<edge STYLE="horizontal"/>
</node>
</node>
</node>
-<node TEXT="線の色を自動選択" STYLE_REF="Advanced" FOLDED="true" ID="ID_1005719714" HGAP="30" VSHIFT="-2" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="線の色を自動選択" STYLE_REF="Advanced" FOLDED="true" ID="ID_1005719714" CREATED="1455910883513" MODIFIED="1455910883513" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="-2.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1565463565" HGAP="-83" VSHIFT="59"><richcontent TYPE="NODE">
+<node ID="ID_1565463565" CREATED="1455910883513" MODIFIED="1455910883513" HGAP_QUANTITY="-83.0 px" VSHIFT_QUANTITY="59.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2507,17 +2574,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ノードへの自動連番振り" STYLE_REF="Advanced" FOLDED="true" ID="ID_1861361284" HGAP="30" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="ノードへの自動連番振り" STYLE_REF="Advanced" FOLDED="true" ID="ID_1861361284" CREATED="1455910883513" MODIFIED="1455910883513" HGAP_QUANTITY="30.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1531819965" HGAP="-114" VSHIFT="46"><richcontent TYPE="NODE">
+<node ID="ID_1531819965" CREATED="1455910883513" MODIFIED="1455910883513" HGAP_QUANTITY="-114.0 px" VSHIFT_QUANTITY="46.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2529,18 +2597,19 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="その他のプロパティ" STYLE_REF="Advanced" FOLDED="true" ID="ID_457725429" HGAP="31" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="その他のプロパティ" STYLE_REF="Advanced" FOLDED="true" ID="ID_457725429" CREATED="1455910883513" MODIFIED="1455910883513" HGAP_QUANTITY="31.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<font ITALIC="false"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node STYLE_REF="TitlesContent" ID="ID_1014522598" HGAP="-92" VSHIFT="42"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_1014522598" CREATED="1455910883514" MODIFIED="1455910883514" HGAP_QUANTITY="-92.0 px" VSHIFT_QUANTITY="42.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2552,14 +2621,15 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="書式メニュー" STYLE_REF="Advanced" FOLDED="true" ID="ID_1128382958" HGAP="29" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="書式メニュー" STYLE_REF="Advanced" FOLDED="true" ID="ID_1128382958" CREATED="1455910883514" MODIFIED="1455910883514" HGAP_QUANTITY="29.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1716769321" HGAP="-67" VSHIFT="41"><richcontent TYPE="NODE">
+<node ID="ID_1716769321" CREATED="1455910883514" MODIFIED="1455910883514" HGAP_QUANTITY="-67.0 px" VSHIFT_QUANTITY="41.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2571,17 +2641,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ツールバー" STYLE_REF="Advanced" FOLDED="true" ID="ID_1235607524" HGAP="30" VSHIFT="-456" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="ツールバー" STYLE_REF="Advanced" FOLDED="true" ID="ID_1235607524" CREATED="1455910883514" MODIFIED="1455910883514" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="-456.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_158808063" HGAP="-54" VSHIFT="91"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_158808063" CREATED="1455910883514" MODIFIED="1455910883514" HGAP_QUANTITY="-54.0 px" VSHIFT_QUANTITY="91.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2610,11 +2681,12 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="太字" STYLE_REF="AdvancedTopic" ID="ID_25890496" HGAP="25" STYLE="as_parent">
+<node TEXT="太字" STYLE_REF="AdvancedTopic" ID="ID_25890496" CREATED="1455910883514" MODIFIED="1455910883514" HGAP_QUANTITY="25.0 px" STYLE="as_parent">
<icon BUILTIN="../Bold16"/>
<font NAME="SansSerif" SIZE="12" BOLD="true" ITALIC="false"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -2630,13 +2702,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="斜体" STYLE_REF="AdvancedTopic" ID="ID_408787243" TEXT_SHORTENED="true">
+<node TEXT="斜体" STYLE_REF="AdvancedTopic" ID="ID_408787243" CREATED="1455910883515" MODIFIED="1455910883515" TEXT_SHORTENED="true">
<icon BUILTIN="../Italic16"/>
<font ITALIC="true"/>
<richcontent TYPE="DETAILS">
@@ -2660,13 +2731,13 @@
</node>
</node>
</node>
-<node TEXT="スタイル" STYLE_REF="Advanced" FOLDED="true" ID="ID_1838680824" NUMBERED="true" MIN_WIDTH="90">
-<node TEXT="なぜ、スタイルか?" FOLDED="true" ID="ID_539515158" HGAP="30" VSHIFT="138" STYLE="combined">
+<node TEXT="スタイル" STYLE_REF="Advanced" FOLDED="true" ID="ID_1838680824" CREATED="1455910883515" MODIFIED="1455910883515" NUMBERED="true" MIN_WIDTH="90.0 px">
+<node TEXT="なぜ、スタイルか?" FOLDED="true" ID="ID_539515158" CREATED="1455910883515" MODIFIED="1455910883515" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="138.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Advanced" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_406943626" HGAP="-87" VSHIFT="50" LINK="#ID_1394424447"><richcontent TYPE="NODE">
+<node ID="ID_406943626" CREATED="1455910883515" MODIFIED="1455910883515" LINK="#ID_1394424447" HGAP_QUANTITY="-87.0 px" VSHIFT_QUANTITY="50.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2678,17 +2749,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="スタイルの検索と適用" STYLE_REF="Advanced" FOLDED="true" ID="ID_512501370" HGAP="29" VSHIFT="-1" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="スタイルの検索と適用" STYLE_REF="Advanced" FOLDED="true" ID="ID_512501370" CREATED="1455910883515" MODIFIED="1455910883515" HGAP_QUANTITY="29.0 px" VSHIFT_QUANTITY="-1.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_602520818" HGAP="-116" VSHIFT="124"><richcontent TYPE="NODE">
+<node ID="ID_602520818" CREATED="1455910883515" MODIFIED="1455910883515" HGAP_QUANTITY="-116.0 px" VSHIFT_QUANTITY="124.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2720,20 +2792,21 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="適用中のスタイルを削除" STYLE_REF="Advanced" FOLDED="true" ID="ID_1937448981" HGAP="28">
-<node TEXT="通常は、別のスタイル、例えば、「標準スタイル」を選択してください。例えば階層別スタイルを使用中の場合。この自動スタイルに [...]
+<node TEXT="適用中のスタイルを削除" STYLE_REF="Advanced" FOLDED="true" ID="ID_1937448981" CREATED="1455910883515" MODIFIED="1455910883515" HGAP_QUANTITY="28.0 px">
+<node TEXT="通常は、別のスタイル、例えば、「標準スタイル」を選択してください。例えば階層別スタイルを使用中の場合。この自動スタイルに [...]
</node>
-<node TEXT="ノードダイアログでスタイルを編集" STYLE_REF="Advanced" FOLDED="true" ID="ID_1277682010" HGAP="30" VSHIFT="2" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="ノードダイアログでスタイルを編集" STYLE_REF="Advanced" FOLDED="true" ID="ID_1277682010" CREATED="1455910883516" MODIFIED="1455910883516" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="2.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_443461395" HGAP="-197" VSHIFT="94"><richcontent TYPE="NODE">
+<node ID="ID_443461395" CREATED="1455910883516" MODIFIED="1455910883516" HGAP_QUANTITY="-197.0 px" VSHIFT_QUANTITY="94.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2756,18 +2829,19 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="複数スタイルの適用" FOLDED="true" ID="ID_270284358" HGAP="31" VSHIFT="1" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="複数スタイルの適用" FOLDED="true" ID="ID_270284358" CREATED="1455910883516" MODIFIED="1455910883516" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="1.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Advanced" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_1030002880" HGAP="-127" VSHIFT="142"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_1030002880" CREATED="1455910883516" MODIFIED="1455910883516" HGAP_QUANTITY="-127.0 px" VSHIFT_QUANTITY="142.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2810,11 +2884,12 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node ID="ID_1769439600"><richcontent TYPE="NODE">
+<node ID="ID_1769439600" CREATED="1455910883516" MODIFIED="1455910883516"><richcontent TYPE="NODE">
<html>
<head>
@@ -2826,17 +2901,18 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="es" ID="ID_170106264"/>
+<node TEXT="es" ID="ID_170106264" CREATED="1455910883516" MODIFIED="1455910883516"/>
</node>
</node>
-<node TEXT="条件対応スタイル" STYLE_REF="Professional" FOLDED="true" ID="ID_1632551821" HGAP="31" VSHIFT="-1" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="条件対応スタイル" STYLE_REF="Professional" FOLDED="true" ID="ID_1632551821" CREATED="1455910883516" MODIFIED="1455910883516" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="-1.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
-<node ID="ID_1437965047" HGAP="-104" VSHIFT="178"><richcontent TYPE="NODE">
+<node ID="ID_1437965047" CREATED="1455910883516" MODIFIED="1455910883516" HGAP_QUANTITY="-104.0 px" VSHIFT_QUANTITY="178.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2877,22 +2953,20 @@
ノード用条件対応ノードスタイルとマップ用条件対応ノードスタイルについて、詳しくは Freeplane マニュアルをお読みください。
</li>
</ul>
- <p>
-
- </p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="階層別スタイル" STYLE_REF="Professional" FOLDED="true" ID="ID_521918713" HGAP="30" MAX_WIDTH="550">
+<node TEXT="階層別スタイル" STYLE_REF="Professional" FOLDED="true" ID="ID_521918713" CREATED="1455910883516" MODIFIED="1455910883516" HGAP_QUANTITY="30.0 px" MAX_WIDTH="550.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1011147934" HGAP="-92" VSHIFT="200"><richcontent TYPE="NODE">
+<node ID="ID_1011147934" CREATED="1455910883516" MODIFIED="1455910883516" HGAP_QUANTITY="-92.0 px" VSHIFT_QUANTITY="200.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2944,17 +3018,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="マップのスタイル" STYLE_REF="Professional" FOLDED="true" ID="ID_13843990" HGAP="31" VSHIFT="-130" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="マップのスタイル" STYLE_REF="Professional" FOLDED="true" ID="ID_13843990" CREATED="1455910883517" MODIFIED="1455910883517" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="-130.0 px" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1896765128" HGAP="-96" VSHIFT="87"><richcontent TYPE="NODE">
+<node ID="ID_1896765128" CREATED="1455910883517" MODIFIED="1455910883517" HGAP_QUANTITY="-96.0 px" VSHIFT_QUANTITY="87.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -2966,6 +3041,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -2973,9 +3049,9 @@
</node>
</node>
</node>
-<node TEXT="テンプレート" STYLE_REF="Advanced" FOLDED="true" ID="ID_183210534" NUMBERED="true" MIN_WIDTH="90">
-<node TEXT="ノードスタイルには、内容や属性の事前定義テキストの形をとったテンプレート型の情報が含まれることがあります。ユーザは、この [...]
-<node FOLDED="true" ID="ID_357953420" HGAP="-599" VSHIFT="177"><richcontent TYPE="NODE">
+<node TEXT="テンプレート" STYLE_REF="Advanced" FOLDED="true" ID="ID_183210534" CREATED="1455910883517" MODIFIED="1455910883517" NUMBERED="true" MIN_WIDTH="90.0 px">
+<node TEXT="ノードスタイルには、内容や属性の事前定義テキストの形をとったテンプレート型の情報が含まれることがあります。ユーザは、この [...]
+<node FOLDED="true" ID="ID_357953420" CREATED="1455910883517" MODIFIED="1455910883517" HGAP_QUANTITY="-599.0 px" VSHIFT_QUANTITY="177.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3013,8 +3089,9 @@
</p>
</body>
</html>
+
</richcontent>
-<node TEXT="My Example" STYLE_REF="MyTemplate" ID="ID_679492060">
+<node TEXT="My Example" STYLE_REF="MyTemplate" ID="ID_679492060" CREATED="1455910883517" MODIFIED="1455910883517">
<attribute NAME="birth date" VALUE=""/>
<attribute NAME="e-mail" VALUE=""/>
<attribute NAME="birth date" VALUE=""/>
@@ -3044,15 +3121,15 @@
</node>
</node>
</node>
-<node TEXT="その他" STYLE_REF="Advanced" FOLDED="true" ID="ID_429763637" NUMBERED="true" MIN_WIDTH="90">
+<node TEXT="その他" STYLE_REF="Advanced" FOLDED="true" ID="ID_429763637" CREATED="1455910883517" MODIFIED="1455910883517" NUMBERED="true" MIN_WIDTH="90.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainWidth" LAST="false"/>
</hook>
-<node TEXT="ブラウザから書式なしテキストを貼り付け" STYLE_REF="Advanced" FOLDED="true" ID="ID_1745656146" STYLE="combined">
+<node TEXT="ブラウザから書式なしテキストを貼り付け" STYLE_REF="Advanced" FOLDED="true" ID="ID_1745656146" CREATED="1455910883517" MODIFIED="1455910883517" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_885396924" HGAP="-223" VSHIFT="32"><richcontent TYPE="NODE">
+<node ID="ID_885396924" CREATED="1455910883517" MODIFIED="1455910883517" HGAP_QUANTITY="-223.0 px" VSHIFT_QUANTITY="32.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3064,17 +3141,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ノード表示幅の固定" STYLE_REF="Advanced" FOLDED="true" ID="ID_1709254927" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="ノード表示幅の固定" STYLE_REF="Advanced" FOLDED="true" ID="ID_1709254927" CREATED="1455910883517" MODIFIED="1455910883517" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_15604512" HGAP="-97" VSHIFT="88" MAX_WIDTH="300" MIN_WIDTH="300"><richcontent TYPE="NODE">
+<node ID="ID_15604512" CREATED="1455910883517" MODIFIED="1455910883517" HGAP_QUANTITY="-97.0 px" VSHIFT_QUANTITY="88.0 px" MAX_WIDTH="300.0 px" MIN_WIDTH="300.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3102,17 +3180,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="書式(ノードコア)のみコピー" STYLE_REF="Advanced" FOLDED="true" ID="ID_1195279427" STYLE="combined">
+<node TEXT="書式(ノードコア)のみコピー" STYLE_REF="Advanced" FOLDED="true" ID="ID_1195279427" CREATED="1455910883518" MODIFIED="1455910883518" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_670948093" HGAP="-158" VSHIFT="42"><richcontent TYPE="NODE">
+<node ID="ID_670948093" CREATED="1455910883518" MODIFIED="1455910883518" HGAP_QUANTITY="-158.0 px" VSHIFT_QUANTITY="42.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3124,17 +3203,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="貼り付けのオプション" STYLE_REF="Advanced" FOLDED="true" ID="ID_506336466" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="貼り付けのオプション" STYLE_REF="Advanced" FOLDED="true" ID="ID_506336466" CREATED="1455910883518" MODIFIED="1455910883518" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1072558009" HGAP="-71" VSHIFT="87"><richcontent TYPE="NODE">
+<node ID="ID_1072558009" CREATED="1455910883518" MODIFIED="1455910883518" HGAP_QUANTITY="-71.0 px" VSHIFT_QUANTITY="87.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3160,6 +3240,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -3168,12 +3249,12 @@
</node>
</node>
</node>
-<node TEXT="マップの公開とシェア" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1613405030" NUMBERED="true" MIN_WIDTH="200" HGAP="19" VSHIFT="-17">
-<node TEXT="印 刷" STYLE_REF="Advanced" FOLDED="true" ID="ID_1344283469" STYLE="combined">
+<node TEXT="マップの公開とシェア" STYLE_REF="Advanced" FOLDED="true" POSITION="right" ID="ID_1613405030" CREATED="1455910883519" MODIFIED="1455910883519" NUMBERED="true" MIN_WIDTH="200.0 px" HGAP_QUANTITY="19.0 px" VSHIFT_QUANTITY="-17.0 px">
+<node TEXT="印 刷" STYLE_REF="Advanced" FOLDED="true" ID="ID_1344283469" CREATED="1455910883519" MODIFIED="1455910883519" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1759870173" HGAP="-38" VSHIFT="42"><richcontent TYPE="NODE">
+<node ID="ID_1759870173" CREATED="1455910883519" MODIFIED="1455910883519" HGAP_QUANTITY="-38.0 px" VSHIFT_QUANTITY="42.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3188,14 +3269,15 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="プレゼンテーション" STYLE_REF="Advanced" FOLDED="true" ID="ID_1747402695">
-<node STYLE_REF="TitlesContent" ID="ID_1269602804" HGAP="-112" VSHIFT="41"><richcontent TYPE="NODE">
+<node TEXT="プレゼンテーション" STYLE_REF="Advanced" FOLDED="true" ID="ID_1747402695" CREATED="1455910883519" MODIFIED="1455910883519">
+<node STYLE_REF="TitlesContent" ID="ID_1269602804" CREATED="1455910883519" MODIFIED="1455910883519" HGAP_QUANTITY="-112.0 px" VSHIFT_QUANTITY="41.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3207,24 +3289,25 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="シェア(共同利用)" STYLE_REF="Advanced" FOLDED="true" ID="ID_566359973" STYLE="combined">
+<node TEXT="シェア(共同利用)" STYLE_REF="Advanced" FOLDED="true" ID="ID_566359973" CREATED="1455910883519" MODIFIED="1455910883519" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="マインドマップ.mm ファイルを交換することによって、マインドマップを他の人とシェア(共同利用)することができます。画像は、マイン&# [...]
+<node TEXT="マインドマップ.mm ファイルを交換することによって、マインドマップを他の人とシェア(共同利用)することができます。画像は、マイン&# [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="インターネット上での公開(Java アプレット)" STYLE_REF="Professional" FOLDED="true" ID="ID_1417348323" STYLE="combined">
+<node TEXT="インターネット上での公開(Java アプレット)" STYLE_REF="Professional" FOLDED="true" ID="ID_1417348323" CREATED="1455910883520" MODIFIED="1455910883520" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1669899571" HGAP="-239" VSHIFT="173"><richcontent TYPE="NODE">
+<node ID="ID_1669899571" CREATED="1455910883520" MODIFIED="1455910883520" HGAP_QUANTITY="-239.0 px" VSHIFT_QUANTITY="173.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3259,18 +3342,19 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="インターネット上での公開(Freeplane を使用)" FOLDED="true" ID="ID_1269157254" STYLE="combined" VSHIFT="8">
+<node TEXT="インターネット上での公開(Freeplane を使用)" FOLDED="true" ID="ID_1269157254" CREATED="1455910883520" MODIFIED="1455910883520" STYLE="combined" VSHIFT_QUANTITY="8.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Professional" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_685749368" HGAP="-254" VSHIFT="95"><richcontent TYPE="NODE">
+<node ID="ID_685749368" CREATED="1455910883520" MODIFIED="1455910883520" HGAP_QUANTITY="-254.0 px" VSHIFT_QUANTITY="95.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3296,24 +3380,25 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="テキストエディタを用いたデータ交換" STYLE_REF="Professional" FOLDED="true" ID="ID_118482" STYLE="combined">
+<node TEXT="テキストエディタを用いたデータ交換" STYLE_REF="Professional" FOLDED="true" ID="ID_118482" CREATED="1455910883520" MODIFIED="1455910883520" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="テキストエディタを用いて、一定の書式設定コードを保持しながらデータ交換する方法については、Freeplane マニュアルに説明があります̀ [...]
+<node TEXT="テキストエディタを用いて、一定の書式設定コードを保持しながらデータ交換する方法については、Freeplane マニュアルに説明があります̀ [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_766584529" HGAP="-4" VSHIFT="158" LINK="freeplaneApplications_ja.mm" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="right" ID="ID_766584529" CREATED="1455910883521" MODIFIED="1455910883521" LINK="freeplaneApplications_ja.mm" HGAP_QUANTITY="-4.0 px" VSHIFT_QUANTITY="158.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -3325,6 +3410,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -3352,8 +3438,8 @@
</richcontent>
<hook NAME="FreeNode"/>
</node>
-<node TEXT="ノードの拡張情報" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_143196514" NUMBERED="true" MIN_WIDTH="180">
-<node TEXT="ノードの詳細テキストを編集" STYLE_REF="Advanced" ID="ID_898889730"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ノードの拡張情報" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_143196514" CREATED="1455910883521" MODIFIED="1455910883521" NUMBERED="true" MIN_WIDTH="180.0 px">
+<node TEXT="ノードの詳細テキストを編集" STYLE_REF="Advanced" ID="ID_898889730" CREATED="1455910883521" MODIFIED="1455910883521"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3387,11 +3473,11 @@
</html>
</richcontent>
</node>
-<node TEXT="テキストをツールチップ表示(ホバーテキスト)" STYLE_REF="Advanced" FOLDED="true" ID="ID_288274844" STYLE="combined">
+<node TEXT="テキストをツールチップ表示(ホバーテキスト)" STYLE_REF="Advanced" FOLDED="true" ID="ID_288274844" CREATED="1455910883521" MODIFIED="1455910883521" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_1704074218" HGAP="-186" VSHIFT="123"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_1704074218" CREATED="1455910883521" MODIFIED="1455910883521" HGAP_QUANTITY="-186.0 px" VSHIFT_QUANTITY="123.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3423,11 +3509,12 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="隠された詳細" STYLE_REF="Advanced" FOLDED="true" ID="ID_1710723594" HGAP="24" VSHIFT="-12" STYLE="combined" TEXT_SHORTENED="true">
+<node TEXT="隠された詳細" STYLE_REF="Advanced" FOLDED="true" ID="ID_1710723594" CREATED="1455910883521" MODIFIED="1455910883521" HGAP_QUANTITY="24.0 px" VSHIFT_QUANTITY="-12.0 px" STYLE="combined" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
@@ -3448,7 +3535,7 @@
</body>
</html>
</richcontent>
-<node TEXT="" ID="ID_1347491550" HGAP="-80" VSHIFT="50">
+<node TEXT="" ID="ID_1347491550" CREATED="1455910883521" MODIFIED="1455910883521" HGAP_QUANTITY="-80.0 px" VSHIFT_QUANTITY="50.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
@@ -3456,11 +3543,11 @@
</node>
</node>
</node>
-<node TEXT="画像(ノード拡張情報)" STYLE_REF="Advanced" FOLDED="true" ID="ID_575269438" MIN_WIDTH="1">
+<node TEXT="画像(ノード拡張情報)" STYLE_REF="Advanced" FOLDED="true" ID="ID_575269438" CREATED="1455910883522" MODIFIED="1455910883522" MIN_WIDTH="1.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainWidth" LAST="false"/>
</hook>
-<node ID="ID_1931512160"><richcontent TYPE="NODE">
+<node ID="ID_1931512160" CREATED="1455910883522" MODIFIED="1455910883522"><richcontent TYPE="NODE">
<html>
<head>
@@ -3472,13 +3559,14 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="内部ソースの場合" STYLE_REF="Advanced" FOLDED="true" ID="ID_1322185425" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="内部ソースの場合" STYLE_REF="Advanced" FOLDED="true" ID="ID_1322185425" CREATED="1455910883522" MODIFIED="1455910883522" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1990291656" HGAP="-95" VSHIFT="178"><richcontent TYPE="NODE">
+<node ID="ID_1990291656" CREATED="1455910883522" MODIFIED="1455910883522" HGAP_QUANTITY="-95.0 px" VSHIFT_QUANTITY="178.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3530,17 +3618,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="外部ソースの場合" STYLE_REF="Advanced" FOLDED="true" ID="ID_17945363" STYLE="combined">
+<node TEXT="外部ソースの場合" STYLE_REF="Advanced" FOLDED="true" ID="ID_17945363" CREATED="1455910883522" MODIFIED="1455910883522" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node STYLE_REF="TitlesContent" ID="ID_594983153" HGAP="-87" VSHIFT="123" MAX_WIDTH="550"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_594983153" CREATED="1455910883522" MODIFIED="1455910883522" HGAP_QUANTITY="-87.0 px" VSHIFT_QUANTITY="123.0 px" MAX_WIDTH="550.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3575,21 +3664,22 @@
</ul>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="インラインの画像" STYLE_REF="Professional" FOLDED="true" ID="ID_1242295211" MAX_WIDTH="550" STYLE="combined">
+<node TEXT="インラインの画像" STYLE_REF="Professional" FOLDED="true" ID="ID_1242295211" CREATED="1455910883522" MODIFIED="1455910883522" MAX_WIDTH="550.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="上級ユーザなら、いわゆる HTML コードを使ってテキストのなかに画像を格納することができます。また、これを行なうためのスクリプト&# [...]
+<node TEXT="上級ユーザなら、いわゆる HTML コードを使ってテキストのなかに画像を格納することができます。また、これを行なうためのスクリプト&# [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="画像を変更" STYLE_REF="Advanced" FOLDED="true" ID="ID_88299847">
-<node STYLE_REF="TitlesContent" ID="ID_656004509" HGAP="-60" VSHIFT="32"><richcontent TYPE="NODE">
+<node TEXT="画像を変更" STYLE_REF="Advanced" FOLDED="true" ID="ID_88299847" CREATED="1455910883522" MODIFIED="1455910883522">
+<node STYLE_REF="TitlesContent" ID="ID_656004509" CREATED="1455910883522" MODIFIED="1455910883522" HGAP_QUANTITY="-60.0 px" VSHIFT_QUANTITY="32.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3601,13 +3691,14 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node TEXT="属性(ノード拡張情報)" STYLE_REF="Professional" FOLDED="true" ID="ID_1324773677" MIN_WIDTH="1">
-<node TEXT="ノード拡張情報の属性" STYLE_REF="Professional" FOLDED="true" ID="ID_1657366174" HGAP="-128" VSHIFT="80" MAX_WIDTH="550">
-<attribute_layout NAME_WIDTH="33" VALUE_WIDTH="82"/>
+<node TEXT="属性(ノード拡張情報)" STYLE_REF="Professional" FOLDED="true" ID="ID_1324773677" CREATED="1455910883522" MODIFIED="1455910883522" MIN_WIDTH="1.0 px">
+<node TEXT="ノード拡張情報の属性" STYLE_REF="Professional" FOLDED="true" ID="ID_1657366174" CREATED="1455910883523" MODIFIED="1455910883523" HGAP_QUANTITY="-128.0 px" VSHIFT_QUANTITY="80.0 px" MAX_WIDTH="550.0 px">
+<attribute_layout NAME_WIDTH="24.75 pt" VALUE_WIDTH="61.5 pt"/>
<attribute NAME="Name" VALUE="John"/>
<attribute NAME="email" VALUE="john at gmail.com"/>
<richcontent TYPE="DETAILS">
@@ -3623,7 +3714,7 @@
</body>
</html>
</richcontent>
-<node TEXT="ノードの詳細に属性を付加するには?" STYLE_REF="Professional" FOLDED="true" ID="ID_1441506319" HGAP="-552" VSHIFT="183" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="ノードの詳細に属性を付加するには?" STYLE_REF="Professional" FOLDED="true" ID="ID_1441506319" CREATED="1455910883523" MODIFIED="1455910883523" HGAP_QUANTITY="-552.0 px" VSHIFT_QUANTITY="183.0 px" MAX_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3662,7 +3753,7 @@
</body>
</html>
</richcontent>
-<node TEXT="オプション値" STYLE_REF="Professional" FOLDED="true" ID="ID_1108500341" HGAP="-550" VSHIFT="166" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="オプション値" STYLE_REF="Professional" FOLDED="true" ID="ID_1108500341" CREATED="1455910883523" MODIFIED="1455910883523" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="166.0 px" MAX_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3675,7 +3766,7 @@
</body>
</html>
</richcontent>
-<node TEXT="属性編集の上級テクニック" STYLE_REF="Professional" FOLDED="true" ID="ID_609269277" HGAP="-550" VSHIFT="100" MAX_WIDTH="550"><richcontent TYPE="DETAILS">
+<node TEXT="属性編集の上級テクニック" STYLE_REF="Professional" FOLDED="true" ID="ID_609269277" CREATED="1455910883523" MODIFIED="1455910883523" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="100.0 px" MAX_WIDTH="550.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3688,8 +3779,8 @@
</body>
</html>
</richcontent>
-<node TEXT="属性中のハイパーリンク(矢印型)" STYLE_REF="Professional" ID="ID_457929879" HGAP="-550" VSHIFT="80" MAX_WIDTH="550">
-<attribute_layout NAME_WIDTH="48" VALUE_WIDTH="101"/>
+<node TEXT="属性中のハイパーリンク(矢印型)" STYLE_REF="Professional" ID="ID_457929879" CREATED="1455910883523" MODIFIED="1455910883523" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="80.0 px" MAX_WIDTH="550.0 px">
+<attribute_layout NAME_WIDTH="36.0 pt" VALUE_WIDTH="75.75 pt"/>
<richcontent TYPE="DETAILS">
<html>
@@ -3709,11 +3800,11 @@
</node>
</node>
</node>
-<node TEXT="科学数式(LaTeX)" STYLE_REF="Professional" FOLDED="true" ID="ID_616494746" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="科学数式(LaTeX)" STYLE_REF="Professional" FOLDED="true" ID="ID_616494746" CREATED="1455910883523" MODIFIED="1455910883523" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1460441144" HGAP="-110" VSHIFT="53"><richcontent TYPE="NODE">
+<node ID="ID_1460441144" CREATED="1455910883523" MODIFIED="1455910883523" HGAP_QUANTITY="-110.0 px" VSHIFT_QUANTITY="53.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3736,6 +3827,7 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -3743,7 +3835,7 @@
</node>
</node>
</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_232622736" HGAP="0" VSHIFT="-94" LINK="freeplaneFunctions_ja.mm" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_232622736" CREATED="1455910883524" MODIFIED="1455910883524" LINK="freeplaneFunctions_ja.mm" HGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="-94.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -3755,6 +3847,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<richcontent TYPE="DETAILS">
@@ -3782,7 +3875,7 @@
</html>
</richcontent>
</node>
-<node LOCALIZED_STYLE_REF="default" POSITION="left" ID="ID_871432906" HGAP="39" VSHIFT="105">
+<node LOCALIZED_STYLE_REF="default" POSITION="left" ID="ID_871432906" CREATED="1455910883524" MODIFIED="1455910883524" HGAP_QUANTITY="39.0 px" VSHIFT_QUANTITY="105.0 px">
<icon BUILTIN="idea"/>
<richcontent TYPE="NODE">
@@ -3796,6 +3889,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -3812,8 +3906,8 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードのノート" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_274601394" NUMBERED="true" MIN_WIDTH="180">
-<node ID="ID_1960771486"><richcontent TYPE="NODE">
+<node TEXT="ノードのノート" STYLE_REF="Advanced" FOLDED="true" POSITION="left" ID="ID_274601394" CREATED="1455910883524" MODIFIED="1455910883524" NUMBERED="true" MIN_WIDTH="180.0 px">
+<node ID="ID_1960771486" CREATED="1455910883524" MODIFIED="1455910883524"><richcontent TYPE="NODE">
<html>
<head>
@@ -3851,14 +3945,15 @@
</ul>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="日付・時刻関連" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1959496513" NUMBERED="true" MIN_WIDTH="180">
+<node TEXT="日付・時刻関連" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1959496513" CREATED="1455910883524" MODIFIED="1455910883524" NUMBERED="true" MIN_WIDTH="180.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
-<node TEXT="時間管理" STYLE_REF="Professional" ID="ID_1047570728" MAX_WIDTH="600" VSHIFT="40"><richcontent TYPE="DETAILS">
+<node TEXT="時間管理" STYLE_REF="Professional" ID="ID_1047570728" CREATED="1455910883524" MODIFIED="1455910883524" MAX_WIDTH="600.0 px" VSHIFT_QUANTITY="40.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3886,13 +3981,15 @@
</html>
</richcontent>
</node>
-<node TEXT="時間を管理..." STYLE_REF="Professional" FOLDED="true" ID="ID_1104707017" VSHIFT="10" MAX_WIDTH="450" STYLE="combined">
-<icon BUILTIN="../TimeManagementAction"/>
+<node TEXT="" ID="ID_755092950" CREATED="1455910883562" MODIFIED="1455910883562">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="時間を管理..." STYLE_REF="Professional" FOLDED="true" ID="ID_1104707017" CREATED="1455910883524" MODIFIED="1455910883524" VSHIFT_QUANTITY="10.0 px" MAX_WIDTH="450.0 px" STYLE="combined">
+<icon BUILTIN="../TimeManagementAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_1158360877" HGAP="-114" VSHIFT="98" MAX_WIDTH="400" MIN_WIDTH="400"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_1158360877" CREATED="1455910883525" MODIFIED="1455910883525" HGAP_QUANTITY="-114.0 px" VSHIFT_QUANTITY="98.0 px" MAX_WIDTH="400.0 px" MIN_WIDTH="400.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3915,33 +4012,34 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="本日の年月日を指定" STYLE_REF="Method" ID="ID_629838545" STYLE="as_parent">
+<node TEXT="本日の年月日を指定" STYLE_REF="Method" ID="ID_629838545" CREATED="1455910883525" MODIFIED="1455910883525" STYLE="as_parent">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="選択中の日付を挿入" STYLE_REF="Method" ID="ID_77223280" STYLE="as_parent">
+<node TEXT="選択中の日付を挿入" STYLE_REF="Method" ID="ID_77223280" CREATED="1455910883525" MODIFIED="1455910883525" STYLE="as_parent">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="カレンダで選択した日にリマインダを設定" STYLE_REF="Method" ID="ID_1905175036" STYLE="as_parent">
+<node TEXT="カレンダで選択した日にリマインダを設定" STYLE_REF="Method" ID="ID_1905175036" CREATED="1455910883525" MODIFIED="1455910883525" STYLE="as_parent">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="指定日数経過後にリマインド" STYLE_REF="Method" ID="ID_46192835"/>
-<node TEXT="リマインダを削除" STYLE_REF="Method" ID="ID_1600844387" STYLE="as_parent">
+<node TEXT="指定日数経過後にリマインド" STYLE_REF="Method" ID="ID_46192835" CREATED="1455910883525" MODIFIED="1455910883525"/>
+<node TEXT="リマインダを削除" STYLE_REF="Method" ID="ID_1600844387" CREATED="1455910883525" MODIFIED="1455910883525" STYLE="as_parent">
<edge STYLE="horizontal"/>
</node>
</node>
</node>
-<node TEXT="課題を管理..." STYLE_REF="Professional" FOLDED="true" ID="ID_1106133151" MAX_WIDTH="450" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="課題を管理..." STYLE_REF="Professional" FOLDED="true" ID="ID_1106133151" CREATED="1455910883525" MODIFIED="1455910883525" MAX_WIDTH="450.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="../TimeListAction"/>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1106133151" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1106133151" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node ID="ID_1400536343" MAX_WIDTH="400" HGAP="-105" VSHIFT="114"><richcontent TYPE="NODE">
+<node ID="ID_1400536343" CREATED="1455910883525" MODIFIED="1455910883525" MAX_WIDTH="400.0 px" HGAP_QUANTITY="-105.0 px" VSHIFT_QUANTITY="114.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -3973,18 +4071,19 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="リマインダを削除" STYLE_REF="Professional" FOLDED="true" ID="ID_148977369" MAX_WIDTH="450" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="リマインダを削除" STYLE_REF="Professional" FOLDED="true" ID="ID_148977369" CREATED="1455910883525" MODIFIED="1455910883525" MAX_WIDTH="450.0 px" MIN_WIDTH="1.0 px" STYLE="combined">
<icon BUILTIN="../ReminderHookAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_740100275" HGAP="-125" VSHIFT="65"><richcontent TYPE="NODE">
+<node ID="ID_740100275" CREATED="1455910883526" MODIFIED="1455910883526" HGAP_QUANTITY="-125.0 px" VSHIFT_QUANTITY="65.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -4010,13 +4109,16 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="" ID="ID_517678813" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_537141055" CREATED="1455910883562" MODIFIED="1455910883562">
+<hook NAME="SummaryNode"/>
+<node TEXT="" ID="ID_517678813" CREATED="1455910883526" MODIFIED="1455910883526" TEXT_SHORTENED="true">
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
</hook>
@@ -4024,7 +4126,6 @@
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ProfessionalTopic" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<richcontent TYPE="DETAILS">
@@ -4041,22 +4142,23 @@
</richcontent>
</node>
</node>
-<node TEXT="ノードのフィルタと検索" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_828862571" NUMBERED="true" MIN_WIDTH="180">
-<node TEXT="なぜ、フィルタか?" STYLE_REF="Professional" FOLDED="true" ID="ID_887149959" STYLE="combined">
+</node>
+<node TEXT="ノードのフィルタと検索" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_828862571" CREATED="1455910883526" MODIFIED="1455910883526" NUMBERED="true" MIN_WIDTH="180.0 px">
+<node TEXT="なぜ、フィルタか?" STYLE_REF="Professional" FOLDED="true" ID="ID_887149959" CREATED="1455910883526" MODIFIED="1455910883526" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="フィルタは、見たいノードだけを表示させる手段です。同じフィルタルールは、情報検索でも使用できます。また、条件対応スタイル [...]
+<node TEXT="フィルタは、見たいノードだけを表示させる手段です。同じフィルタルールは、情報検索でも使用できます。また、条件対応スタイル [...]
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="検索とフィルタの基礎" STYLE_REF="Professional" FOLDED="true" ID="ID_1598853306" STYLE="combined">
+<node TEXT="検索とフィルタの基礎" STYLE_REF="Professional" FOLDED="true" ID="ID_1598853306" CREATED="1455910883527" MODIFIED="1455910883527" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node FOLDED="true" ID="ID_1650348629" HGAP="-180" VSHIFT="187"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_1650348629" CREATED="1455910883527" MODIFIED="1455910883527" HGAP_QUANTITY="-180.0 px" VSHIFT_QUANTITY="187.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -4108,11 +4210,12 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
-<node TEXT="クィックフィルタ" STYLE_REF="ProfessionalTopic" FOLDED="true" ID="ID_1189166757">
+<node TEXT="クィックフィルタ" STYLE_REF="ProfessionalTopic" FOLDED="true" ID="ID_1189166757" CREATED="1455910883527" MODIFIED="1455910883527">
<icon BUILTIN="../apply_quick_filter"/>
<richcontent TYPE="DETAILS">
@@ -4131,7 +4234,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<edge STYLE="horizontal"/>
-<node TEXT="最近更新したノードを検索" ID="ID_884023176">
+<node TEXT="最近更新したノードを検索" ID="ID_884023176" CREATED="1455910883527" MODIFIED="1455910883527">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -4162,7 +4265,7 @@
</richcontent>
</node>
</node>
-<node TEXT="フィルタ解除" STYLE_REF="ProfessionalTopic" ID="ID_983064948">
+<node TEXT="フィルタ解除" STYLE_REF="ProfessionalTopic" ID="ID_983064948" CREATED="1455910883528" MODIFIED="1455910883528">
<icon BUILTIN="../remove_filtering"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -4182,7 +4285,7 @@
</html>
</richcontent>
</node>
-<node TEXT="次を検索" STYLE_REF="ProfessionalTopic" ID="ID_507981913">
+<node TEXT="次を検索" STYLE_REF="ProfessionalTopic" ID="ID_507981913" CREATED="1455910883528" MODIFIED="1455910883528">
<icon BUILTIN="../find_next"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4221,7 +4324,7 @@
</node>
</node>
</node>
-<node TEXT="フィルタの諸機能" STYLE_REF="Professional" FOLDED="true" ID="ID_1254354349" TEXT_SHORTENED="true" STYLE="combined"><richcontent TYPE="DETAILS">
+<node TEXT="フィルタの諸機能" STYLE_REF="Professional" FOLDED="true" ID="ID_1254354349" CREATED="1455910883529" MODIFIED="1455910883529" TEXT_SHORTENED="true" STYLE="combined"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4237,7 +4340,10 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="フィルタを元に戻す" STYLE_REF="ProfessionalTopic" ID="ID_619416419" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_462564273" CREATED="1455910883562" MODIFIED="1455910883562">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="フィルタを元に戻す" STYLE_REF="ProfessionalTopic" ID="ID_619416419" CREATED="1455910883529" MODIFIED="1455910883529" TEXT_SHORTENED="true">
<icon BUILTIN="../undo_filter"/>
<richcontent TYPE="DETAILS">
@@ -4252,12 +4358,11 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="元のフィルタを再適用" STYLE_REF="ProfessionalTopic" ID="ID_1724296233" TEXT_SHORTENED="true">
+<node TEXT="元のフィルタを再適用" STYLE_REF="ProfessionalTopic" ID="ID_1724296233" CREATED="1455910883531" MODIFIED="1455910883531" TEXT_SHORTENED="true">
<icon BUILTIN="../redo_filter"/>
<richcontent TYPE="DETAILS">
@@ -4276,7 +4381,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="フィルタをかけ直す" STYLE_REF="ProfessionalTopic" ID="ID_1748016122" TEXT_SHORTENED="true">
+<node TEXT="フィルタをかけ直す" STYLE_REF="ProfessionalTopic" ID="ID_1748016122" CREATED="1455910883532" MODIFIED="1455910883532" TEXT_SHORTENED="true">
<icon BUILTIN="../reapply_filter"/>
<richcontent TYPE="DETAILS">
@@ -4295,7 +4400,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="クィックフィルタ" STYLE_REF="ProfessionalTopic" FOLDED="true" ID="ID_1552136796" TEXT_SHORTENED="true">
+<node TEXT="クィックフィルタ" STYLE_REF="ProfessionalTopic" FOLDED="true" ID="ID_1552136796" CREATED="1455910883532" MODIFIED="1455910883532" TEXT_SHORTENED="true">
<icon BUILTIN="../apply_quick_filter"/>
<richcontent TYPE="DETAILS">
@@ -4335,7 +4440,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="最近更新したノードを検索" ID="ID_1539236846">
+<node TEXT="最近更新したノードを検索" ID="ID_1539236846" CREATED="1455910883533" MODIFIED="1455910883533">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -4366,7 +4471,7 @@
</richcontent>
</node>
</node>
-<node TEXT="選択ノードに絞って適用" STYLE_REF="ProfessionalTopic" ID="ID_402507556" TEXT_SHORTENED="true">
+<node TEXT="選択ノードに絞って適用" STYLE_REF="ProfessionalTopic" ID="ID_402507556" CREATED="1455910883533" MODIFIED="1455910883533" TEXT_SHORTENED="true">
<icon BUILTIN="../filter_selected_nodes"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4398,9 +4503,9 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<attribute_layout NAME_WIDTH="68" VALUE_WIDTH="68"/>
+<attribute_layout NAME_WIDTH="51.0 pt" VALUE_WIDTH="51.0 pt"/>
</node>
-<node TEXT="該当ノードを全て選択" STYLE_REF="ProfessionalTopic" ID="ID_164487469" TEXT_SHORTENED="true">
+<node TEXT="該当ノードを全て選択" STYLE_REF="ProfessionalTopic" ID="ID_164487469" CREATED="1455910883534" MODIFIED="1455910883534" TEXT_SHORTENED="true">
<icon BUILTIN="../select_all_found_nodes"/>
<richcontent TYPE="DETAILS">
@@ -4419,7 +4524,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="フィルタ解除" STYLE_REF="ProfessionalTopic" ID="ID_1978139715" TEXT_SHORTENED="true">
+<node TEXT="フィルタ解除" STYLE_REF="ProfessionalTopic" ID="ID_1978139715" CREATED="1455910883534" MODIFIED="1455910883534" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_filtering"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4438,7 +4543,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="フィルタ条件を指定" STYLE_REF="ProfessionalTopic" ID="ID_1142884544" TEXT_SHORTENED="true">
+<node TEXT="フィルタ条件を指定" STYLE_REF="ProfessionalTopic" ID="ID_1142884544" CREATED="1455910883535" MODIFIED="1455910883535" TEXT_SHORTENED="true">
<icon BUILTIN="../edit_filtering_condition"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4505,13 +4610,18 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="フィルタの適用・解除" STYLE_REF="ProfessionalTopic" ID="ID_214063901">
+<node TEXT="" ID="ID_1005468744" CREATED="1455910883562" MODIFIED="1455910883562">
<hook NAME="SummaryNode"/>
+<node TEXT="フィルタの適用・解除" STYLE_REF="ProfessionalTopic" ID="ID_214063901" CREATED="1455910883538" MODIFIED="1455910883538">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
-<node TEXT="フィルタ中のノードに適用(絞り込み)" STYLE_REF="ProfessionalTopic" ID="ID_1768599003" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1719178907" CREATED="1455910883562" MODIFIED="1455910883562">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="フィルタ中のノードに適用(絞り込み)" STYLE_REF="ProfessionalTopic" ID="ID_1768599003" CREATED="1455910883539" MODIFIED="1455910883539" TEXT_SHORTENED="true">
<icon BUILTIN="../applies_to_filtered_nodes"/>
<richcontent TYPE="DETAILS">
@@ -4526,12 +4636,11 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="非表示のノードを展開" STYLE_REF="ProfessionalTopic" ID="ID_865947666" TEXT_SHORTENED="true">
+<node TEXT="非表示のノードを展開" STYLE_REF="ProfessionalTopic" ID="ID_865947666" CREATED="1455910883539" MODIFIED="1455910883539" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_filtered_ancestors"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4567,7 +4676,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="上位ノードも表示" STYLE_REF="ProfessionalTopic" ID="ID_1384592614" TEXT_SHORTENED="true">
+<node TEXT="上位ノードも表示" STYLE_REF="ProfessionalTopic" ID="ID_1384592614" CREATED="1455910883540" MODIFIED="1455910883540" TEXT_SHORTENED="true">
<icon BUILTIN="../show_ancestors"/>
<richcontent TYPE="DETAILS">
@@ -4597,7 +4706,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="下位ノードも表示" STYLE_REF="ProfessionalTopic" ID="ID_347749612" TEXT_SHORTENED="true">
+<node TEXT="下位ノードも表示" STYLE_REF="ProfessionalTopic" ID="ID_347749612" CREATED="1455910883541" MODIFIED="1455910883541" TEXT_SHORTENED="true">
<icon BUILTIN="../show_descendants"/>
<richcontent TYPE="DETAILS">
@@ -4627,13 +4736,18 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="フィルタの条件/状態" STYLE_REF="ProfessionalTopic" ID="ID_1103140596">
+<node TEXT="" ID="ID_435613681" CREATED="1455910883562" MODIFIED="1455910883562">
<hook NAME="SummaryNode"/>
+<node TEXT="フィルタの条件/状態" STYLE_REF="ProfessionalTopic" ID="ID_1103140596" CREATED="1455910883542" MODIFIED="1455910883542">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
-<node TEXT="前方検索" STYLE_REF="ProfessionalTopic" ID="ID_132872030" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1498671338" CREATED="1455910883563" MODIFIED="1455910883563">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="前方検索" STYLE_REF="ProfessionalTopic" ID="ID_132872030" CREATED="1455910883542" MODIFIED="1455910883542" TEXT_SHORTENED="true">
<icon BUILTIN="../find_previous"/>
<richcontent TYPE="DETAILS">
@@ -4665,12 +4779,11 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="後方検索" STYLE_REF="ProfessionalTopic" ID="ID_1528431308" TEXT_SHORTENED="true">
+<node TEXT="後方検索" STYLE_REF="ProfessionalTopic" ID="ID_1528431308" CREATED="1455910883542" MODIFIED="1455910883542" TEXT_SHORTENED="true">
<icon BUILTIN="../find_next"/>
<richcontent TYPE="DETAILS">
@@ -4706,18 +4819,20 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="探査/検索" STYLE_REF="ProfessionalTopic" ID="ID_721920269">
+<node TEXT="" ID="ID_599482793" CREATED="1455910883563" MODIFIED="1455910883563">
<hook NAME="SummaryNode"/>
+<node TEXT="探査/検索" STYLE_REF="ProfessionalTopic" ID="ID_721920269" CREATED="1455910883543" MODIFIED="1455910883543">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="フィルタセットを使う" STYLE_REF="Professional" FOLDED="true" ID="ID_665978371" STYLE="combined">
+</node>
+<node TEXT="フィルタセットを使う" STYLE_REF="Professional" FOLDED="true" ID="ID_665978371" CREATED="1455910883543" MODIFIED="1455910883543" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_49510380" HGAP="-115" VSHIFT="91"><richcontent TYPE="NODE">
+<node ID="ID_49510380" CREATED="1455910883543" MODIFIED="1455910883543" HGAP_QUANTITY="-115.0 px" VSHIFT_QUANTITY="91.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -4735,15 +4850,16 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="この「クィックリファレンス」用のフィルタセットの読み込みと活用" STYLE_REF="Professional" FOLDED="true" ID="ID_1284293100" LINK="http://www.kioo.nl/freeplane/tutorial_en/filterSet" MIN_WIDTH="1">
-<node TEXT="(初級、中級、上級の)3つの熟達度のどれか1つだけを表示させる場合は、フィルタという Freeplane の強力な機能の利用を検討してくだ0 [...]
-<node TEXT="このクィックリファレンス用のフィルタセットを読み込む" ID="ID_551050917">
+<node TEXT="この「クィックリファレンス」用のフィルタセットの読み込みと活用" STYLE_REF="Professional" FOLDED="true" ID="ID_1284293100" CREATED="1455910883544" MODIFIED="1455910883544" LINK="http://www.kioo.nl/freeplane/tutorial_en/filterSet" MIN_WIDTH="1.0 px">
+<node TEXT="(初級、中級、上級の)3つの熟達度のどれか1つだけを表示させる場合は、フィルタという Freeplane の強力な機能の利用を検討してくだ0 [...]
+<node TEXT="このクィックリファレンス用のフィルタセットを読み込む" ID="ID_551050917" CREATED="1455910883544" MODIFIED="1455910883544">
<icon BUILTIN="full-0"/>
<richcontent TYPE="DETAILS">
@@ -4765,7 +4881,7 @@
<conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
</hook>
</node>
-<node TEXT="フィルタを選択し、クィックフィルタを実行" LOCALIZED_STYLE_REF="default" ID="ID_81563733" LINK="FilterExampleBegin.jpg">
+<node TEXT="フィルタを選択し、クィックフィルタを実行" LOCALIZED_STYLE_REF="default" ID="ID_81563733" CREATED="1455910883544" MODIFIED="1455910883544" LINK="FilterExampleBegin.jpg">
<icon BUILTIN="full-1"/>
<richcontent TYPE="DETAILS">
@@ -4798,7 +4914,7 @@
<conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
</hook>
</node>
-<node TEXT="展開して可視状態にする" ID="ID_1451237301" HGAP="19" VSHIFT="-8" LINK="FilterExampleEnd.jpg">
+<node TEXT="展開して可視状態にする" ID="ID_1451237301" CREATED="1455910883544" MODIFIED="1455910883544" LINK="FilterExampleEnd.jpg" HGAP_QUANTITY="19.0 px" VSHIFT_QUANTITY="-8.0 px">
<icon BUILTIN="full-2"/>
<richcontent TYPE="DETAILS">
@@ -4825,7 +4941,7 @@
<conditional_style ACTIVE="true" STYLE_REF="SubWidth" LAST="false"/>
</hook>
</node>
-<node TEXT="表示と表示終了" ID="ID_1331360426" HGAP="16" VSHIFT="6" LINK="FilterExampleUnfold.jpg">
+<node TEXT="表示と表示終了" ID="ID_1331360426" CREATED="1455910883545" MODIFIED="1455910883545" LINK="FilterExampleUnfold.jpg" HGAP_QUANTITY="16.0 px" VSHIFT_QUANTITY="6.0 px">
<icon BUILTIN="full-3"/>
<richcontent TYPE="DETAILS">
@@ -4857,12 +4973,12 @@
</node>
</node>
</node>
-<node TEXT="マップやノードを保護" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1232153769" NUMBERED="true" MIN_WIDTH="180">
-<node TEXT="パスワードで子ノードを保護" STYLE_REF="Professional" FOLDED="true" ID="ID_1433157907" STYLE="combined">
+<node TEXT="マップやノードを保護" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1232153769" CREATED="1455910883545" MODIFIED="1455910883545" NUMBERED="true" MIN_WIDTH="180.0 px">
+<node TEXT="パスワードで子ノードを保護" STYLE_REF="Professional" FOLDED="true" ID="ID_1433157907" CREATED="1455910883545" MODIFIED="1455910883545" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1784889270" HGAP="-153" VSHIFT="94"><richcontent TYPE="NODE">
+<node ID="ID_1784889270" CREATED="1455910883545" MODIFIED="1455910883545" HGAP_QUANTITY="-153.0 px" VSHIFT_QUANTITY="94.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -4888,17 +5004,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="保護(暗証)付き新規マップ" STYLE_REF="Professional" FOLDED="true" ID="ID_1064538299" STYLE="combined">
+<node TEXT="保護(暗証)付き新規マップ" STYLE_REF="Professional" FOLDED="true" ID="ID_1064538299" CREATED="1455910883546" MODIFIED="1455910883546" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_802748820" HGAP="-149" VSHIFT="41"><richcontent TYPE="NODE">
+<node ID="ID_802748820" CREATED="1455910883546" MODIFIED="1455910883546" HGAP_QUANTITY="-149.0 px" VSHIFT_QUANTITY="41.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -4910,6 +5027,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -4917,8 +5035,8 @@
</node>
</node>
</node>
-<node TEXT="Freeplane のチューニング" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1746471823" NUMBERED="true" MIN_WIDTH="180" VGAP="5">
-<node ID="ID_931065203" HGAP="28" VSHIFT="-15"><richcontent TYPE="NODE">
+<node TEXT="Freeplane のチューニング" STYLE_REF="Professional" FOLDED="true" POSITION="left" ID="ID_1746471823" CREATED="1455910883546" MODIFIED="1455910883546" NUMBERED="true" MIN_WIDTH="180.0 px" VGAP_QUANTITY="5.0 px">
+<node ID="ID_931065203" CREATED="1455910883546" MODIFIED="1455910883546" HGAP_QUANTITY="28.0 px" VSHIFT_QUANTITY="-15.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -4930,9 +5048,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="すべてのノードを「囲み」、特定の線(エッジ)等に..." STYLE_REF="Advanced" FOLDED="true" ID="ID_210892586" MIN_WIDTH="1" STYLE="combined"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="すべてのノードを「囲み」、特定の線(エッジ)等に..." STYLE_REF="Advanced" FOLDED="true" ID="ID_210892586" CREATED="1455910883546" MODIFIED="1455910883546" MIN_WIDTH="1.0 px" STYLE="combined"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -4945,7 +5064,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1274034553" HGAP="-291" VSHIFT="37"><richcontent TYPE="NODE">
+<node ID="ID_1274034553" CREATED="1455910883546" MODIFIED="1455910883546" HGAP_QUANTITY="-291.0 px" VSHIFT_QUANTITY="37.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -4957,12 +5076,13 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
-<node STYLE_REF="TitlesContent" ID="ID_423831026" HGAP="-291" VSHIFT="36"><richcontent TYPE="NODE">
+<node STYLE_REF="TitlesContent" ID="ID_423831026" CREATED="1455910883546" MODIFIED="1455910883546" HGAP_QUANTITY="-291.0 px" VSHIFT_QUANTITY="36.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -4988,14 +5108,15 @@
</ul>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="標準的な表示設定" STYLE_REF="Professional" FOLDED="true" ID="ID_1173853188" STYLE="combined">
+<node TEXT="標準的な表示設定" STYLE_REF="Professional" FOLDED="true" ID="ID_1173853188" CREATED="1455910883547" MODIFIED="1455910883547" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1748316183" HGAP="-82" VSHIFT="102"><richcontent TYPE="NODE">
+<node ID="ID_1748316183" CREATED="1455910883547" MODIFIED="1455910883547" HGAP_QUANTITY="-82.0 px" VSHIFT_QUANTITY="102.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5018,17 +5139,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="科学研究用パッケージ(Docear)" STYLE_REF="Professional" FOLDED="true" ID="ID_170927482" LINK="http://docear.org" STYLE="combined">
+<node TEXT="科学研究用パッケージ(Docear)" STYLE_REF="Professional" FOLDED="true" ID="ID_170927482" CREATED="1455910883547" MODIFIED="1455910883547" LINK="http://docear.org" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1788895132" HGAP="-167" VSHIFT="120"><richcontent TYPE="NODE">
+<node ID="ID_1788895132" CREATED="1455910883547" MODIFIED="1455910883547" HGAP_QUANTITY="-167.0 px" VSHIFT_QUANTITY="120.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5064,17 +5186,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="標準的な環境設定" STYLE_REF="Professional" FOLDED="true" ID="ID_889570489" MIN_WIDTH="1" STYLE="combined">
+<node TEXT="標準的な環境設定" STYLE_REF="Professional" FOLDED="true" ID="ID_889570489" CREATED="1455910883547" MODIFIED="1455910883547" MIN_WIDTH="1.0 px" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node TEXT="環境" FOLDED="true" ID="ID_908072469" HGAP="-89" VSHIFT="27" MAX_WIDTH="550" MIN_WIDTH="550" STYLE="fork" TEXT_SHORTENED="true">
+<node TEXT="環境" FOLDED="true" ID="ID_908072469" CREATED="1455910883547" MODIFIED="1455910883547" HGAP_QUANTITY="-89.0 px" VSHIFT_QUANTITY="27.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="550.0 px" STYLE="fork" TEXT_SHORTENED="true">
<font BOLD="true"/>
<richcontent TYPE="DETAILS">
@@ -5112,7 +5235,7 @@
</body>
</html>
</richcontent>
-<node TEXT="画面表示" STYLE_REF="Introduction" FOLDED="true" ID="ID_1541392544" HGAP="-554" VSHIFT="33" MAX_WIDTH="600" MIN_WIDTH="550" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="画面表示" STYLE_REF="Introduction" FOLDED="true" ID="ID_1541392544" CREATED="1455910883548" MODIFIED="1455910883548" HGAP_QUANTITY="-554.0 px" VSHIFT_QUANTITY="33.0 px" MAX_WIDTH="600.0 px" MIN_WIDTH="550.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5137,7 +5260,7 @@
</html>
</richcontent>
<font BOLD="true"/>
-<node STYLE_REF="Introduction" FOLDED="true" ID="ID_748518266" HGAP="-550" VSHIFT="80" MIN_WIDTH="550" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node STYLE_REF="Introduction" FOLDED="true" ID="ID_748518266" CREATED="1455910883548" MODIFIED="1455910883548" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="80.0 px" MIN_WIDTH="550.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -5150,6 +5273,7 @@
</body>
</html>
<!-- ^ Position is not set to relative / absolute here because of Mozilla -->
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -5165,7 +5289,7 @@
</html>
</richcontent>
<font BOLD="true"/>
-<node TEXT="動作設定" STYLE_REF="Introduction" FOLDED="true" ID="ID_1578508847" HGAP="-551" VSHIFT="157" MAX_WIDTH="550" MIN_WIDTH="550" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="動作設定" STYLE_REF="Introduction" FOLDED="true" ID="ID_1578508847" CREATED="1455910883548" MODIFIED="1455910883548" HGAP_QUANTITY="-551.0 px" VSHIFT_QUANTITY="157.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="550.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5220,7 +5344,7 @@
</html>
</richcontent>
<font BOLD="true"/>
-<node TEXT="HTML" STYLE_REF="Introduction" FOLDED="true" ID="ID_1185446743" HGAP="-550" VSHIFT="157" MAX_WIDTH="550" MIN_WIDTH="550" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="HTML" STYLE_REF="Introduction" FOLDED="true" ID="ID_1185446743" CREATED="1455910883549" MODIFIED="1455910883549" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="157.0 px" MAX_WIDTH="550.0 px" MIN_WIDTH="550.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5234,7 +5358,7 @@
</html>
</richcontent>
<font BOLD="true"/>
-<node TEXT="プラグイン" STYLE_REF="Introduction" ID="ID_1546138946" HGAP="-550" VSHIFT="55" MIN_WIDTH="550" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="プラグイン" STYLE_REF="Introduction" ID="ID_1546138946" CREATED="1455910883549" MODIFIED="1455910883549" HGAP_QUANTITY="-550.0 px" VSHIFT_QUANTITY="55.0 px" MIN_WIDTH="550.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5255,11 +5379,11 @@
</node>
</node>
</node>
-<node TEXT="ノードの縦間隔" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" STYLE="combined" VGAP="35">
+<node TEXT="ノードの縦間隔" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" CREATED="1455910883549" MODIFIED="1455910883549" STYLE="combined" VGAP_QUANTITY="35.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_801516363" HGAP="-59" VSHIFT="62"><richcontent TYPE="NODE">
+<node ID="ID_801516363" CREATED="1455910883549" MODIFIED="1455910883549" HGAP_QUANTITY="-59.0 px" VSHIFT_QUANTITY="62.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5280,17 +5404,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="スクリプトの利用と作成" STYLE_REF="Professional" FOLDED="true" ID="ID_519455593" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting" STYLE="combined">
+<node TEXT="スクリプトの利用と作成" STYLE_REF="Professional" FOLDED="true" ID="ID_519455593" CREATED="1455910883549" MODIFIED="1455910883549" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1965879157" HGAP="-150" VSHIFT="62"><richcontent TYPE="NODE">
+<node ID="ID_1965879157" CREATED="1455910883550" MODIFIED="1455910883550" HGAP_QUANTITY="-150.0 px" VSHIFT_QUANTITY="62.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5308,17 +5433,18 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Windows 7 で *.MM インデックスを作成" STYLE_REF="Professional" FOLDED="true" ID="ID_952466464" STYLE="combined">
+<node TEXT="Windows 7 で *.MM インデックスを作成" STYLE_REF="Professional" FOLDED="true" ID="ID_952466464" CREATED="1455910883550" MODIFIED="1455910883550" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_844014092" HGAP="-177" VSHIFT="145"><richcontent TYPE="NODE">
+<node ID="ID_844014092" CREATED="1455910883550" MODIFIED="1455910883550" HGAP_QUANTITY="-177.0 px" VSHIFT_QUANTITY="145.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5361,17 +5487,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="スペルチェック用辞書" STYLE_REF="Professional" FOLDED="true" ID="ID_141336344" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries" STYLE="combined">
+<node TEXT="スペルチェック用辞書" STYLE_REF="Professional" FOLDED="true" ID="ID_141336344" CREATED="1455910883551" MODIFIED="1455910883551" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_1759599610" HGAP="-138" VSHIFT="71"><richcontent TYPE="NODE">
+<node ID="ID_1759599610" CREATED="1455910883551" MODIFIED="1455910883551" HGAP_QUANTITY="-138.0 px" VSHIFT_QUANTITY="71.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5397,17 +5524,18 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="標準のショートカット" STYLE_REF="Professional" FOLDED="true" ID="ID_64846119" STYLE="combined">
+<node TEXT="標準のショートカット" STYLE_REF="Professional" FOLDED="true" ID="ID_64846119" CREATED="1455910883551" MODIFIED="1455910883551" STYLE="combined">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<node ID="ID_667200365" HGAP="-120" VSHIFT="77"><richcontent TYPE="NODE">
+<node ID="ID_667200365" CREATED="1455910883551" MODIFIED="1455910883551" HGAP_QUANTITY="-120.0 px" VSHIFT_QUANTITY="77.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5430,14 +5558,15 @@
</ul>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="アドオン" STYLE_REF="Professional" FOLDED="true" ID="ID_1156954596" LINK="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28install%29" MIN_WIDTH="1" HGAP="24" VSHIFT="-92">
-<node STYLE_REF="TitlesContent" ID="ID_1670821464" HGAP="-72" VSHIFT="34"><richcontent TYPE="NODE">
+<node TEXT="アドオン" STYLE_REF="Professional" FOLDED="true" ID="ID_1156954596" CREATED="1455910883552" MODIFIED="1455910883552" LINK="http://freeplane.sourceforge.net/wiki/index.php/Add-ons_%28install%29" MIN_WIDTH="1.0 px" HGAP_QUANTITY="24.0 px" VSHIFT_QUANTITY="-92.0 px">
+<node STYLE_REF="TitlesContent" ID="ID_1670821464" CREATED="1455910883552" MODIFIED="1455910883552" HGAP_QUANTITY="-72.0 px" VSHIFT_QUANTITY="34.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5452,12 +5581,13 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
-<node TEXT="Freeplane 利用のコツ" STYLE_REF="Beginner" FOLDED="true" POSITION="left" ID="ID_722085722" BACKGROUND_COLOR="#00cc33" NUMBERED="true" MIN_WIDTH="180">
-<node STYLE_REF="Beginner" ID="ID_163805859"><richcontent TYPE="NODE">
+<node TEXT="Freeplane 利用のコツ" STYLE_REF="Beginner" FOLDED="true" POSITION="left" ID="ID_722085722" CREATED="1455910883552" MODIFIED="1455910883552" BACKGROUND_COLOR="#00cc33" NUMBERED="true" MIN_WIDTH="180.0 px">
+<node STYLE_REF="Beginner" ID="ID_163805859" CREATED="1455910883552" MODIFIED="1455910883552"><richcontent TYPE="NODE">
<html>
<head>
@@ -5469,10 +5599,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="このマインドマップの成り立ち" STYLE_REF="Advanced" FOLDED="true" ID="ID_1394424447">
-<node TEXT="番号付きの大見出し" FOLDED="true" ID="ID_1866200606" NUMBERED="true" MIN_WIDTH="180"><richcontent TYPE="DETAILS">
+<node TEXT="このマインドマップの成り立ち" STYLE_REF="Advanced" FOLDED="true" ID="ID_1394424447" CREATED="1455910883553" MODIFIED="1455910883553">
+<node TEXT="番号付きの大見出し" FOLDED="true" ID="ID_1866200606" CREATED="1455910883553" MODIFIED="1455910883553" NUMBERED="true" MIN_WIDTH="180.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5496,7 +5627,7 @@
</body>
</html>
</richcontent>
-<node TEXT="見出し" FOLDED="true" ID="ID_1129463861" VSHIFT="28"><richcontent TYPE="DETAILS">
+<node TEXT="見出し" FOLDED="true" ID="ID_1129463861" CREATED="1455910883553" MODIFIED="1455910883553" VSHIFT_QUANTITY="28.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5509,7 +5640,7 @@
</body>
</html>
</richcontent>
-<node TEXT="見出しに関連した内容説明" ID="ID_1693370436" HGAP="19" VSHIFT="29"><richcontent TYPE="DETAILS">
+<node TEXT="見出しに関連した内容説明" ID="ID_1693370436" CREATED="1455910883553" MODIFIED="1455910883553" HGAP_QUANTITY="19.0 px" VSHIFT_QUANTITY="29.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5533,7 +5664,7 @@
</node>
</node>
</node>
-<node TEXT="用例や更新の目印" ID="ID_1987503747"><richcontent TYPE="DETAILS">
+<node TEXT="用例や更新の目印" ID="ID_1987503747" CREATED="1455910883553" MODIFIED="1455910883553"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5552,8 +5683,8 @@
</html>
</richcontent>
</node>
-<node TEXT="ユーザ定義スタイル" FOLDED="true" ID="ID_1542766589">
-<node TEXT="Beginner" STYLE_REF="Beginner" ID="ID_1530366440"><richcontent TYPE="DETAILS">
+<node TEXT="ユーザ定義スタイル" FOLDED="true" ID="ID_1542766589" CREATED="1455910883553" MODIFIED="1455910883553">
+<node TEXT="Beginner" STYLE_REF="Beginner" ID="ID_1530366440" CREATED="1455910883553" MODIFIED="1455910883553"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5573,7 +5704,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Advanced" STYLE_REF="Advanced" ID="ID_535640598"><richcontent TYPE="DETAILS">
+<node TEXT="Advanced" STYLE_REF="Advanced" ID="ID_535640598" CREATED="1455910883553" MODIFIED="1455910883553"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5593,7 +5724,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Professional" STYLE_REF="Professional" ID="ID_1633698334"><richcontent TYPE="DETAILS">
+<node TEXT="Professional" STYLE_REF="Professional" ID="ID_1633698334" CREATED="1455910883553" MODIFIED="1455910883553"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5613,7 +5744,7 @@
</html>
</richcontent>
</node>
-<node TEXT="TitlesContent" STYLE_REF="TitlesContent" ID="ID_1999102003"><richcontent TYPE="DETAILS">
+<node TEXT="TitlesContent" STYLE_REF="TitlesContent" ID="ID_1999102003" CREATED="1455910883554" MODIFIED="1455910883554"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5630,7 +5761,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Example" STYLE_REF="Example" ID="ID_149652811"><richcontent TYPE="DETAILS">
+<node TEXT="Example" STYLE_REF="Example" ID="ID_149652811" CREATED="1455910883554" MODIFIED="1455910883554"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5644,7 +5775,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Revision" STYLE_REF="Revision" ID="ID_1141559530"><richcontent TYPE="DETAILS">
+<node TEXT="Revision" STYLE_REF="Revision" ID="ID_1141559530" CREATED="1455910883554" MODIFIED="1455910883554"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5658,7 +5789,7 @@
</html>
</richcontent>
</node>
-<node TEXT="MyTemplate" STYLE_REF="MyTemplate" ID="ID_669326751">
+<node TEXT="MyTemplate" STYLE_REF="MyTemplate" ID="ID_669326751" CREATED="1455910883554" MODIFIED="1455910883554">
<attribute NAME="birth date" VALUE=""/>
<attribute NAME="e-mail" VALUE=""/>
<richcontent TYPE="DETAILS">
@@ -5684,7 +5815,7 @@
</richcontent>
</node>
</node>
-<node TEXT="Freeplane の全機能に関する(インデックス)マップへ" ID="ID_1680872369" LINK="#ID_232622736"><richcontent TYPE="DETAILS">
+<node TEXT="Freeplane の全機能に関する(インデックス)マップへ" ID="ID_1680872369" CREATED="1455910883554" MODIFIED="1455910883554" LINK="#ID_232622736"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5706,7 +5837,7 @@
</html>
</richcontent>
</node>
-<node TEXT="適用事例(インデックス)マップへ" ID="ID_311616726" LINK="#ID_766584529"><richcontent TYPE="DETAILS">
+<node TEXT="適用事例(インデックス)マップへ" ID="ID_311616726" CREATED="1455910883554" MODIFIED="1455910883554" LINK="#ID_766584529"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5729,9 +5860,9 @@
</richcontent>
</node>
</node>
-<node TEXT="更新(リビジョン)の表示" STYLE_REF="Advanced" ID="ID_1424120147" LINK="#ID_1437965047"/>
-<node TEXT="同一マップの複数ビュー編集" STYLE_REF="Advanced" FOLDED="true" ID="ID_1926778226">
-<node STYLE_REF="TitlesContent" ID="ID_1319135286" HGAP="-169" VSHIFT="61"><richcontent TYPE="NODE">
+<node TEXT="更新(リビジョン)の表示" STYLE_REF="Advanced" ID="ID_1424120147" CREATED="1455910883554" MODIFIED="1455910883554" LINK="#ID_1437965047"/>
+<node TEXT="同一マップの複数ビュー編集" STYLE_REF="Advanced" FOLDED="true" ID="ID_1926778226" CREATED="1455910883554" MODIFIED="1455910883554">
+<node STYLE_REF="TitlesContent" ID="ID_1319135286" CREATED="1455910883554" MODIFIED="1455910883554" HGAP_QUANTITY="-169.0 px" VSHIFT_QUANTITY="61.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5743,12 +5874,13 @@
</p>
</body>
</html>
+
</richcontent>
<font ITALIC="false"/>
</node>
</node>
-<node TEXT="履歴ファイルから復元" STYLE_REF="Professional" FOLDED="true" ID="ID_1448419614">
-<node STYLE_REF="TitlesContent" ID="ID_1628771343" HGAP="-162" VSHIFT="25"><richcontent TYPE="NODE">
+<node TEXT="履歴ファイルから復元" STYLE_REF="Professional" FOLDED="true" ID="ID_1448419614" CREATED="1455910883555" MODIFIED="1455910883555">
+<node STYLE_REF="TitlesContent" ID="ID_1628771343" CREATED="1455910883555" MODIFIED="1455910883555" HGAP_QUANTITY="-162.0 px" VSHIFT_QUANTITY="25.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5760,11 +5892,12 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="バッチ処理" STYLE_REF="Professional" FOLDED="true" ID="ID_1371818753">
-<node STYLE_REF="TitlesContent" ID="ID_804893281" HGAP="-73" VSHIFT="78"><richcontent TYPE="NODE">
+<node TEXT="バッチ処理" STYLE_REF="Professional" FOLDED="true" ID="ID_1371818753" CREATED="1455910883555" MODIFIED="1455910883555">
+<node STYLE_REF="TitlesContent" ID="ID_804893281" CREATED="1455910883555" MODIFIED="1455910883555" HGAP_QUANTITY="-73.0 px" VSHIFT_QUANTITY="78.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -5793,6 +5926,7 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
diff --git a/freeplane/doc/freeplane_de.mm b/freeplane/doc/freeplane_de.mm
index 8e32723..db4a3b8 100644
--- a/freeplane/doc/freeplane_de.mm
+++ b/freeplane/doc/freeplane_de.mm
@@ -1,7 +1,7 @@
-<map version="0.9.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node ID="ID_911274459" CREATED="1270892460624" MODIFIED="1274305304485" COLOR="#993300">
-<richcontent TYPE="NODE">
+<node FOLDED="false" ID="ID_911274459" CREATED="1270892460624" MODIFIED="1465678798217" COLOR="#993300" MAX_WIDTH="150.0 pt" MIN_WIDTH="150.0 pt"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -11,11 +11,119 @@
Freeplane<br/><small>- Eine freie Mind Mapping Software -</small>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="Dialog" SIZE="18" BOLD="true"/>
-<hook NAME="MapStyle" max_node_width="600"/>
-<node FOLDED="true" POSITION="right" ID="_Freeplane_Link_1596161299" CREATED="1270892460656" MODIFIED="1275342025939" HGAP="-94" VSHIFT="-27">
-<richcontent TYPE="NODE">
+<hook NAME="MapStyle">
+ <properties fit_to_viewport="false;" show_icon_for_attributes="true"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" FORMAT="NO_FORMAT" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="true" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#ffffff">
+<font SIZE="9"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" UNIFORM_SHAPE="true" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font SIZE="24" ITALIC="true"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2">
+<edge COLOR="#ff0033"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3">
+<edge COLOR="#009933"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4">
+<edge COLOR="#3333ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#ff6600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<node FOLDED="true" POSITION="right" ID="_Freeplane_Link_1596161299" CREATED="1270892460656" MODIFIED="1465678798233"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -35,6 +143,7 @@
</p>
</body>
</html>
+
</richcontent>
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Drücke die Taste Cursor nach links, um Knoten, 
die links vom Wurzelknoten sind, aufzuklappen." ID="ID_1776790765" CREATED="1271002221874" MODIFIED="1275342048072"/>
@@ -229,41 +338,41 @@
<icon BUILTIN="back"/>
</node>
<node TEXT="Knoten können mit Wolken 
zusammengefasst werden" FOLDED="true" ID="_Freeplane_Link_318937820" CREATED="1270892460667" MODIFIED="1274905948870" COLOR="#407000">
-<cloud WIDTH="0"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<node TEXT="...und die Wolken können
verschiedene Farben haben" ID="ID_1714895943" CREATED="1270892460668" MODIFIED="1274487435773">
-<cloud COLOR="#c4388d" WIDTH="0"/>
+<cloud COLOR="#c4388d" SHAPE="ARC"/>
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
</node>
</node>
-<node TEXT="Knoten können mit Konnektoren verbunden werden" FOLDED="true" ID="_Freeplane_Link_1750585847" CREATED="1270892460668" MODIFIED="1274487530655" COLOR="#407000" HGAP="22" VSHIFT="-24">
+<node TEXT="Knoten können mit Konnektoren verbunden werden" FOLDED="true" ID="_Freeplane_Link_1750585847" CREATED="1270892460668" MODIFIED="1274487530655" COLOR="#407000" HGAP_QUANTITY="22.0 px" VSHIFT_QUANTITY="-24.0 px">
<node TEXT="Verbinde einen Knoten..." ID="_Freeplane_Link_1212380407" CREATED="1270892460668" MODIFIED="1274487563858">
-<arrowlink DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="mit einem anderen..." ID="_Freeplane_Link_1249400461" CREATED="1270892460669" MODIFIED="1274487631319">
-<arrowlink COLOR="#6600ff" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#6600ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="mit verschiedenen Farben" ID="_Freeplane_Link_880551392" CREATED="1270892460670" MODIFIED="1274487585470">
-<arrowlink DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="und auf verschiedenen Wegen" ID="_Freeplane_Link_1789233193" CREATED="1270892460670" MODIFIED="1274487596684"/>
</node>
-<node TEXT="Konnektoren können beschriftet werden" FOLDED="true" ID="ID_237593792" CREATED="1270893118534" MODIFIED="1275342253867" VGAP="89" HGAP="29" VSHIFT="1" COLOR="#407000">
+<node TEXT="Konnektoren können beschriftet werden" FOLDED="true" ID="ID_237593792" CREATED="1270893118534" MODIFIED="1275342253867" VGAP_QUANTITY="89.0 px" HGAP_QUANTITY="29.0 px" VSHIFT_QUANTITY="1.0 px" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Quellknoten" ID="ID_1709139591" CREATED="1270893130918" MODIFIED="1274487779390">
-<arrowlink COLOR="#352bca" DESTINATION="ID_1741403088" SOURCE_LABEL="Beschriftung am Anfang" TARGET_LABEL="Beschriftung am Ende" MIDDLE_LABEL="Beschriftung in der Mitte" STARTINCLINATION="115;27;" ENDINCLINATION="202;36;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#352bca" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1741403088" SOURCE_LABEL="Beschriftung am Anfang" TARGET_LABEL="Beschriftung am Ende" MIDDLE_LABEL="Beschriftung in der Mitte" STARTINCLINATION="115;27;" ENDINCLINATION="202;36;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Zielknoten" ID="ID_1741403088" CREATED="1270893138577" MODIFIED="1274487689671"/>
</node>
-<node TEXT="Konnektoren können so formatiert werden,
dass sie wie Knotenlinien aussehen" FOLDED="true" ID="ID_589013013" CREATED="1270893418086" MODIFIED="1275342247966" COLOR="#407000" VGAP="20" HGAP="21" VSHIFT="12">
+<node TEXT="Konnektoren können so formatiert werden,
dass sie wie Knotenlinien aussehen" FOLDED="true" ID="ID_589013013" CREATED="1270893418086" MODIFIED="1275342247966" COLOR="#407000" VGAP_QUANTITY="20.0 px" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="12.0 px">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="1" ID="ID_822615789" CREATED="1270893450078" MODIFIED="1270893469956">
-<arrowlink EDGE_LIKE="true" DESTINATION="ID_659652940" STARTINCLINATION="46;0;" ENDINCLINATION="46;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="EDGE_LIKE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_659652940" STARTINCLINATION="46;0;" ENDINCLINATION="46;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="2" FOLDED="true" ID="ID_1931813528" CREATED="1270893453278" MODIFIED="1270991928052">
<node TEXT="22" ID="ID_659652940" CREATED="1270893459959" MODIFIED="1270893460779"/>
</node>
<node TEXT="3" ID="ID_961774571" CREATED="1270893454198" MODIFIED="1270893480379">
-<arrowlink EDGE_LIKE="true" DESTINATION="ID_659652940" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="EDGE_LIKE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_659652940" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
<node TEXT="Knotenlinien können versteckt werden" FOLDED="true" ID="ID_1539062144" CREATED="1270893550070" MODIFIED="1274817607326" COLOR="#407000">
@@ -274,20 +383,20 @@
</node>
<node TEXT="Knoten können Attribute haben" ID="ID_1044646484" CREATED="1270893318566" MODIFIED="1274817881371" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<attribute_layout NAME_WIDTH="40" VALUE_WIDTH="49"/>
+<attribute_layout NAME_WIDTH="30.0 pt" VALUE_WIDTH="36.75 pt"/>
<attribute NAME="x" VALUE="10"/>
<attribute NAME="y" VALUE="20"/>
</node>
-<node TEXT="Knoten können frei positioniert werden" FOLDED="true" ID="_Freeplane_Link_127668276" CREATED="1270892460670" MODIFIED="1274817938052" COLOR="#407000" HGAP="25" VSHIFT="36">
-<node TEXT="Einer" ID="_Freeplane_Link_894936766" CREATED="1270892460670" MODIFIED="1274817963942" HGAP="-1" VSHIFT="-27"/>
-<node TEXT="Ein Anderer" ID="_Freeplane_Link_1942481455" CREATED="1270892460670" MODIFIED="1275331926697" HGAP="123" VSHIFT="43"/>
+<node TEXT="Knoten können frei positioniert werden" FOLDED="true" ID="_Freeplane_Link_127668276" CREATED="1270892460670" MODIFIED="1274817938052" COLOR="#407000" HGAP_QUANTITY="25.0 px" VSHIFT_QUANTITY="36.0 px">
+<node TEXT="Einer" ID="_Freeplane_Link_894936766" CREATED="1270892460670" MODIFIED="1274817963942" HGAP_QUANTITY="-1.0 px" VSHIFT_QUANTITY="-27.0 px"/>
+<node TEXT="Ein Anderer" ID="_Freeplane_Link_1942481455" CREATED="1270892460670" MODIFIED="1275331926697" HGAP_QUANTITY="123.0 px" VSHIFT_QUANTITY="43.0 px"/>
</node>
</node>
<node TEXT="Navigation" FOLDED="true" POSITION="right" ID="ID_1233270983" CREATED="1272091279810" MODIFIED="1272092212344" COLOR="#006666">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Navigation in der MindMap" FOLDED="true" ID="_Freeplane_Link_1540212684" CREATED="1270892460687" MODIFIED="1274818286956" COLOR="#407000">
-<node ID="ID_159922424" CREATED="1270892460687" MODIFIED="1274906075236">
-<richcontent TYPE="NODE">
+<node ID="ID_159922424" CREATED="1270892460687" MODIFIED="1274906075236"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -297,10 +406,12 @@
Um den <b>Cursor</b> nach <b>oben</b>, nach <b>unten</b>, nach <b>links</b><br/>oder nach <b>rechts</b> zu bewegen, verwende die Cursor-Tasten
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1583313144" CREATED="1270892460687" MODIFIED="1274906093709">
-<richcontent TYPE="NODE">
+<node ID="ID_1583313144" CREATED="1270892460687" MODIFIED="1274906093709"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -310,10 +421,12 @@
Um an den <b>Anfang des aktiven Zweiges</b> zu kommen, drücke BildAuf
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_144127434" CREATED="1270892460688" MODIFIED="1274906108315">
-<richcontent TYPE="NODE">
+<node ID="ID_144127434" CREATED="1270892460688" MODIFIED="1274906108315"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -323,10 +436,12 @@
Um ans <b>Ende des aktiven Zweiges</b> zu kommen, drücke BildAb
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_158862259" CREATED="1270892460688" MODIFIED="1274915647666">
-<richcontent TYPE="NODE">
+<node ID="ID_158862259" CREATED="1270892460688" MODIFIED="1274915647666"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -339,10 +454,12 @@
"Navigieren -> Wurzelknoten zentrieren" (Escape)
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1985477320" CREATED="1271026015708" MODIFIED="1274915676581">
-<richcontent TYPE="NODE">
+<node ID="ID_1985477320" CREATED="1271026015708" MODIFIED="1274915676581"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -352,10 +469,12 @@
Navigation in der <b>Historie</b> der <b>zuletzt besuchten Knoten</b>:<br/>- "Navigieren -> Zurück" (Alt + Cursor links) navigiert zurück in der Historie<br/>- "Navigieren -> Vorwärts" (Alt + Cursor rechts) navigiert wieder nach vorne in der Historie
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_902784897" CREATED="1271176654062" MODIFIED="1274915710842">
-<richcontent TYPE="NODE">
+<node ID="ID_902784897" CREATED="1271176654062" MODIFIED="1274915710842"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -378,10 +497,12 @@
Die Reihenfolge der Knoten wird anhand der Hierarchie ermittelt.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1501511305" CREATED="1271177016593" MODIFIED="1274915743605">
-<richcontent TYPE="NODE">
+<node ID="ID_1501511305" CREATED="1271177016593" MODIFIED="1274915743605"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -404,14 +525,16 @@
Die Reihenfolge der Knoten wird anhand der HIerarchie ermittelt.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Standardmäsig werden Knoten ausgewählt, indem man den Cursor für einen kurzen, konfigurierbaren, Zeitraum über ihm platziert.
Dieses Verhalten kann geändert werden unter Extras -> Einstellungen... -> Verhalten in der Sektion "Auswahlmodus".
Verfügbare Modi sind: "Direkt", "Verzögert" (Standard) und "Durch Mausklick"." ID="ID_125952778" CREATED="1271003250866" MODIFIED="1274366224125"/>
</node>
<node TEXT="Auswahl von mehreren Knoten" FOLDED="true" ID="Freeplane_Link_653540280" CREATED="1270892460681" MODIFIED="1274818568721" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_1732023097" CREATED="1270892460681" MODIFIED="1274906329680">
-<richcontent TYPE="NODE">
+<node ID="ID_1732023097" CREATED="1270892460681" MODIFIED="1274906329680"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -424,11 +547,13 @@
während Du auf die Knoten links klickst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1775844952" CREATED="1270892460682" MODIFIED="1274906358844">
-<richcontent TYPE="NODE">
+<node ID="ID_1775844952" CREATED="1270892460682" MODIFIED="1274906358844"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -441,11 +566,13 @@
indem Du die Strg-Taste gedrückt hälst, während Du sie mit der Maus anklickst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1843533091" CREATED="1270892460682" MODIFIED="1274906418413">
-<richcontent TYPE="NODE">
+<node ID="ID_1843533091" CREATED="1270892460682" MODIFIED="1274906418413"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -461,11 +588,13 @@
Dich mit den Cursor-Tasten durch die MindMap bewegst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1178451061" CREATED="1270892460682" MODIFIED="1275332271295">
-<richcontent TYPE="NODE">
+<node ID="ID_1178451061" CREATED="1270892460682" MODIFIED="1275332271295"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -485,10 +614,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1029340509" CREATED="1270892460682" MODIFIED="1274906475113">
-<richcontent TYPE="NODE">
+<node ID="ID_1029340509" CREATED="1270892460682" MODIFIED="1274906475113"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -501,12 +631,14 @@
Hintergrund der MindMap, oder einen unselektierten Knoten klickst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Falten und Entfalten" FOLDED="true" ID="Freeplane_Link_4727471" CREATED="1270892460688" MODIFIED="1274908801991" COLOR="#407000">
-<node ID="ID_1622399561" CREATED="1270892460688" MODIFIED="1274907536381">
-<richcontent TYPE="NODE">
+<node ID="ID_1622399561" CREATED="1270892460688" MODIFIED="1274907536381"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -516,10 +648,12 @@
Ein gefalteter Knoten wird durch einen kleinen Kreis an dem Ende, das am weitesten vom Wurzelknoten entfernt ist, angezeigt.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1439689412" CREATED="1270892460688" MODIFIED="1274914461698">
-<richcontent TYPE="NODE">
+<node ID="ID_1439689412" CREATED="1270892460688" MODIFIED="1274914461698"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -538,10 +672,12 @@
- Verwende das "Knoten-Kontextmenü -> Knoten falten/ entfalten"
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1089564473" CREATED="1270892460688" MODIFIED="1274914441890">
-<richcontent TYPE="NODE">
+<node ID="ID_1089564473" CREATED="1270892460688" MODIFIED="1274914441890"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -563,10 +699,12 @@
- Verwende das "Knoten-Kontextmenü -> Knoten falten/ entfalten"
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_926272054" CREATED="1270892460688" MODIFIED="1275332487191">
-<richcontent TYPE="NODE">
+<node ID="ID_926272054" CREATED="1270892460688" MODIFIED="1275332487191"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -601,10 +739,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1233324949" CREATED="1270892460688" MODIFIED="1275332565442">
-<richcontent TYPE="NODE">
+<node ID="ID_1233324949" CREATED="1270892460688" MODIFIED="1275332565442"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -627,10 +766,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1624228779" CREATED="1270892460688" MODIFIED="1275332591656">
-<richcontent TYPE="NODE">
+<node ID="ID_1624228779" CREATED="1270892460688" MODIFIED="1275332591656"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -653,13 +793,14 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
<node TEXT="Die MindMap verschieben" FOLDED="true" ID="Freeplane_Link_467411537" CREATED="1270892460689" MODIFIED="1274909291302" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_1291243282" CREATED="1270892460689" MODIFIED="1274910044033">
-<richcontent TYPE="NODE">
+<node ID="ID_1291243282" CREATED="1270892460689" MODIFIED="1274910044033"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -684,14 +825,16 @@
allen Betriebssystemen) verschiebt die MindMap horizontal
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
<node TEXT="Die MindMap zoomen" FOLDED="true" ID="Freeplane_Link_913137192" CREATED="1270892460689" MODIFIED="1274909809443" COLOR="#407000">
-<node ID="ID_1270232158" CREATED="1272007214049" MODIFIED="1274910230674">
-<richcontent TYPE="NODE">
+<node ID="ID_1270232158" CREATED="1272007214049" MODIFIED="1274910230674"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -704,10 +847,12 @@
ihn zu verkleinern (Alt + unten) und die MindMap auf die Seite einzupassen.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1692671423" CREATED="1272007458262" MODIFIED="1274910485869">
-<richcontent TYPE="NODE">
+<node ID="ID_1692671423" CREATED="1272007458262" MODIFIED="1274910485869"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -720,10 +865,12 @@
über das man den Zoom-Level direkt auwählen kann.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_961139916" CREATED="1270892460689" MODIFIED="1274910640872">
-<richcontent TYPE="NODE">
+<node ID="ID_961139916" CREATED="1270892460689" MODIFIED="1274910640872"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -736,13 +883,15 @@
Mausrad dreht, während Du die Strg-Taste gedrückt hälst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Suchen und Filtern" FOLDED="true" ID="Freeplane_Link_423038022" CREATED="1270892460681" MODIFIED="1275332779466" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_1565729150" CREATED="1270896350974" MODIFIED="1274912375212">
-<richcontent TYPE="NODE">
+<node ID="ID_1565729150" CREATED="1270896350974" MODIFIED="1274912375212"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -752,10 +901,12 @@
Du kannst nach Knoten <b>suchen</b> und sie <b>filtern</b>. Als <b>Kriterien</b> kannst Du dabei den Knotentext, Icons, Erzeugungs-/Änderungszeit des Knotens, Priorität, Konnektoren, Beschriftung von Konnektoren, Hyperlinks, Notizen und Attribute verwenden.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_966700848" CREATED="1270892460681" MODIFIED="1274914344453">
-<richcontent TYPE="NODE">
+<node ID="ID_966700848" CREATED="1270892460681" MODIFIED="1274914344453"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -765,11 +916,13 @@
Um einen Text, oder andere Kriterien, in einem <b>Knoten und</b> allen seinen <b>Nachfolgern</b> zu <b>suchen</b>, verwende "Bearbeiten -> Suchen..." (Strg + F).
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1646223708" CREATED="1270892460681" MODIFIED="1274914332698">
-<richcontent TYPE="NODE">
+<node ID="ID_1646223708" CREATED="1270892460681" MODIFIED="1274914332698"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -782,11 +935,13 @@
findest Du mit "Bearbeiten -> Weitersuchen" (Strg + G).
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_829330412" CREATED="1270892460681" MODIFIED="1275332872246">
-<richcontent TYPE="NODE">
+<node ID="ID_829330412" CREATED="1270892460681" MODIFIED="1275332872246"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -797,10 +952,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_779591913" CREATED="1270892460681" MODIFIED="1274913238008">
-<richcontent TYPE="NODE">
+<node ID="ID_779591913" CREATED="1270892460681" MODIFIED="1274913238008"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -813,10 +969,12 @@
In zukünftigen Versionen wird es eine Option geben, um die Suche auf die ganze MindMap auszudehnen.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1761633870" CREATED="1271096970387" MODIFIED="1274914012341">
-<richcontent TYPE="NODE">
+<node ID="ID_1761633870" CREATED="1271096970387" MODIFIED="1274914012341"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -826,10 +984,12 @@
Um die <b>gesammte MindMap</b> <b>nach</b> einem <b>Text</b> zu <b>durchsuchen</b> <b>und</b> ihn evtl. zu <b>ändern</b>, verwende "Bearbeiten -> Suchen und ersetzen..." . Mit "Bearbeiten -> Suchen und ersetzen in allen MindMaps" kannst Du alle geöffneten MindMaps durchsuchen.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1773253238" CREATED="1270897010863" MODIFIED="1274914308250">
-<richcontent TYPE="NODE">
+<node ID="ID_1773253238" CREATED="1270897010863" MODIFIED="1274914308250"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -839,13 +999,15 @@
Mit der <b>Filter-Toolbar</b> und dem <b>Filter-Menü</b> kannst Du <b>Filter definieren</b> und damit nur den Teil der Knoten anzeigen lassen, die den Kriterien entsprechen.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Wechseln zu einer
anderen MindMap" FOLDED="true" ID="Freeplane_Link_516331171" CREATED="1270892460688" MODIFIED="1274914587683" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_213892338" CREATED="1270892460689" MODIFIED="1274915092105">
-<richcontent TYPE="NODE">
+<node ID="ID_213892338" CREATED="1270892460689" MODIFIED="1274915092105"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -864,11 +1026,13 @@
- Klicke rechts auf den Hintergrund und wähle die MindMap aus dem erscheinenden Kontext-Menü aus.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_233995891" CREATED="1271000255265" MODIFIED="1275333030090">
-<richcontent TYPE="NODE">
+<node ID="ID_233995891" CREATED="1271000255265" MODIFIED="1275333030090"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -885,10 +1049,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_771867461" CREATED="1272092801195" MODIFIED="1274915572850">
-<richcontent TYPE="NODE">
+<node ID="ID_771867461" CREATED="1272092801195" MODIFIED="1274915572850"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -901,15 +1066,17 @@
kannst Du mit Strg + 1 wechseln.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
</node>
<node TEXT="MindMaps bearbeiten" FOLDED="true" POSITION="right" ID="ID_393070580" CREATED="1272091239258" MODIFIED="1274394610676" COLOR="#006666">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Knoten erzeugen 
und bearbeiten" FOLDED="true" ID="_Freeplane_Link_1709752669" CREATED="1270892460670" MODIFIED="1274917859485" COLOR="#407000">
-<node ID="ID_847485935" CREATED="1270892460670" MODIFIED="1274918872232">
-<richcontent TYPE="NODE">
+<node ID="ID_847485935" CREATED="1270892460670" MODIFIED="1274918872232"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -919,10 +1086,12 @@
Um einen neuen <b>Kind-Knoten</b> zu <b>erzeugen</b> wähle "Einfügen -> Neuer Kind-Knoten", oder drücke die Taste Einfg (bei Mac OS X TAB).
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_719677235" CREATED="1270892460671" MODIFIED="1275333322975">
-<richcontent TYPE="NODE">
+<node ID="ID_719677235" CREATED="1270892460671" MODIFIED="1275333322975"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -933,10 +1102,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1715555696" CREATED="1270892460671" MODIFIED="1274918902756">
-<richcontent TYPE="NODE">
+<node ID="ID_1715555696" CREATED="1270892460671" MODIFIED="1274918902756"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -946,10 +1116,12 @@
Einen <b>neuen Geschwister Knoten unterhalb</b> des aktiven Knotens <b>erzeugt</b> man mit "Einfügen -> Neuer Geschwister-Knoten danach" oder durch drücken der Taste Enter.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1942197982" CREATED="1270892460671" MODIFIED="1274918913635">
-<richcontent TYPE="NODE">
+<node ID="ID_1942197982" CREATED="1270892460671" MODIFIED="1274918913635"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -959,10 +1131,12 @@
Einen <b>neuen Geschwister Knoten oberhalb</b> des aktiven Knotens <b>erzeugt</b> man mit "Einfügen -> Neuer Geschwister-Knoten davor" oder durch drücken der Tasten Shift + Enter.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1638437345" CREATED="1270892460671" MODIFIED="1275333364835">
-<richcontent TYPE="NODE">
+<node ID="ID_1638437345" CREATED="1270892460671" MODIFIED="1275333364835"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -976,10 +1150,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1718916776" CREATED="1270892460671" MODIFIED="1275333428549">
-<richcontent TYPE="NODE">
+<node ID="ID_1718916776" CREATED="1270892460671" MODIFIED="1275333428549"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -990,10 +1165,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_86882063" CREATED="1270892460671" MODIFIED="1274918826327">
-<richcontent TYPE="NODE">
+<node ID="ID_86882063" CREATED="1270892460671" MODIFIED="1274918826327"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1003,12 +1179,14 @@
<b>Alle</b> beschriebenen <b>Befehle</b> kannst Du auch über das <b>Kontextmenü des Knotens</b> erreichen (Rechtsklick auf einen Knoten; bei Mac OS X Strg + Klick).
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Knotentext bearbeiten" FOLDED="true" ID="Freeplane_Link_1700974092" CREATED="1270892460671" MODIFIED="1274990022759" COLOR="#407000">
-<node ID="_Freeplane_Link_519923426" CREATED="1270892460671" MODIFIED="1274990262387">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_519923426" CREATED="1270892460671" MODIFIED="1274990262387"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1018,11 +1196,13 @@
Um einen <b>Knoten</b> zu <b>bearbeiten</b>, drücke F2, POS1 oder ENDE, oder wähle im "Knoten Kontextmenü ->Knoten bearbeiten". Der Bearbeitungsmodus wird durch die Taste ENTER beendet.
</p>
</body>
-</html></richcontent>
-<arrowlink DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</html>
+
+</richcontent>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_673531040" CREATED="1270892460671" MODIFIED="1275333593738">
-<richcontent TYPE="NODE">
+<node ID="ID_673531040" CREATED="1270892460671" MODIFIED="1275333593738"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1039,10 +1219,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1386037184" CREATED="1270892460672" MODIFIED="1275333643385">
-<richcontent TYPE="NODE">
+<node ID="ID_1386037184" CREATED="1270892460672" MODIFIED="1275333643385"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1059,10 +1240,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_328110224" CREATED="1270892460672" MODIFIED="1274994117607">
-<richcontent TYPE="NODE">
+<node ID="ID_328110224" CREATED="1270892460672" MODIFIED="1274994117607"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1072,10 +1254,12 @@
Um einen <b>HTML-Knoten</b> an der Cursor-Position auf <b>zwei Knoten aufzuteilen</b>, gibt es im Editor den Button "Teilen" (Alt + S).
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node FOLDED="true" ID="ID_785582356" CREATED="1270892460672" MODIFIED="1274992054979">
-<richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_785582356" CREATED="1270892460672" MODIFIED="1274992054979"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1088,9 +1272,11 @@
einzufügen verwende Shift + Enter oder Alt + Enter.
</p>
</body>
-</html></richcontent>
-<node ID="_Freeplane_Link_1445647544" CREATED="1270892460672" MODIFIED="1274992184660">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node ID="_Freeplane_Link_1445647544" CREATED="1270892460672" MODIFIED="1274992184660"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1100,11 +1286,13 @@
Standardmäsig beendet Enter den Bearbeitungsmodus eines reinen Text-Knotens und Alt + Enter fügt einen Zeilenumbruch ein. Unter "Extras -> Einstellungen... -> Verhalten -> <Eingabe> beendet die Texteingabe im Knoten" kann man dieses Verhalten ändern.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
-<node ID="ID_471748709" CREATED="1270892460672" MODIFIED="1275333745300">
-<richcontent TYPE="NODE">
+<node ID="ID_471748709" CREATED="1270892460672" MODIFIED="1275333745300"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1115,10 +1303,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_128741512" CREATED="1270892460672" MODIFIED="1275333802048">
-<richcontent TYPE="NODE">
+<node ID="ID_128741512" CREATED="1270892460672" MODIFIED="1275333802048"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1129,10 +1318,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1608665009" CREATED="1270996862392" MODIFIED="1274995379887" LINK="#Freeplane_Link_1318678369">
-<richcontent TYPE="NODE">
+<node ID="ID_1608665009" CREATED="1270996862392" MODIFIED="1274995379887" LINK="#Freeplane_Link_1318678369"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1142,12 +1332,14 @@
Du kannst in Freeplane alle Bearbeitungsschritte <b>Rückgängig</b> machen.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Rechtschreibprüfung" ID="ID_1122067470" CREATED="1271096284570" MODIFIED="1274995403818" COLOR="#996600">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<node ID="ID_784188803" CREATED="1271096294667" MODIFIED="1275333891527">
-<richcontent TYPE="NODE">
+<node ID="ID_784188803" CREATED="1271096294667" MODIFIED="1275333891527"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1158,6 +1350,7 @@
</p>
</body>
</html>
+
</richcontent>
</node>
<node TEXT="Auf der Freeplane Homepage sind Wörterbücher für viele Sprachen verfügbar." ID="ID_1341966636" CREATED="1271096394315" MODIFIED="1275333942453" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries"/>
@@ -1167,8 +1360,8 @@
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
<node TEXT="Drag and Drop bedeutet: Mit gedrückter Maustaste - in der Regel die Linke - etwas aufzunehmen, zum gewünschten Ziel zu ziehen, und es dort durch Loslassen der Maustaste fallen zu lassen." ID="Freeplane_Link_159607929" CREATED="1274995662437" MODIFIED="1275333999719"/>
-<node ID="Freeplane_Link_1497093408" CREATED="1274995662437" MODIFIED="1275334032871">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_1497093408" CREATED="1274995662437" MODIFIED="1275334032871"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1179,11 +1372,12 @@
</p>
</body>
</html>
+
</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1633776428" CREATED="1271027579490" MODIFIED="1274996157015">
-<richcontent TYPE="NODE">
+<node ID="ID_1633776428" CREATED="1271027579490" MODIFIED="1274996157015"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1193,10 +1387,12 @@
Alternativ kannst Du <b>Knoten</b> auch mit der <b>Tastatur verschieben</b>. So lange Du die Strg-Taste gedrückt hälst, kannst kannst Du die Knoten mit den Cursor-Tasten verschieben.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="Freeplane_Link_374323949" CREATED="1274995662437" MODIFIED="1275334201923">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_374323949" CREATED="1274995662437" MODIFIED="1275334201923"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1213,11 +1409,12 @@
</p>
</body>
</html>
+
</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="Freeplane_Link_1069770199" CREATED="1274995662438" MODIFIED="1274996470465">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_1069770199" CREATED="1274995662438" MODIFIED="1274996470465"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1231,11 +1428,13 @@
Hinweis: Achte beim Positionieren auch hier auf die Farbverlaufsänderungen. Zum Einfügen als Geschwisterknoten muß der obere Bereich des angesteuerten Zielknotens durch Farbverlauf unterlegt sein.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="_Freeplane_Link_1994214827" CREATED="1270892460683" MODIFIED="1275334362194">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_1994214827" CREATED="1270892460683" MODIFIED="1275334362194"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1246,11 +1445,12 @@
</p>
</body>
</html>
+
</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_694691711" CREATED="1270892460683" MODIFIED="1274996963304">
-<richcontent TYPE="NODE">
+<node ID="ID_694691711" CREATED="1270892460683" MODIFIED="1274996963304"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1260,10 +1460,12 @@
<b>Vorhandene MindMaps</b> kannst Du <b>bearbeiten</b>, indem Du die entsprechende Datei über dem Hintergrund fallen lässt.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="Freeplane_Link_1940236238" CREATED="1274995662438" MODIFIED="1275334415207">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_1940236238" CREATED="1274995662438" MODIFIED="1275334415207"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1277,10 +1479,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_356858969" CREATED="1270892460683" MODIFIED="1274997299326">
-<richcontent TYPE="NODE">
+<node ID="ID_356858969" CREATED="1270892460683" MODIFIED="1274997299326"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1290,11 +1493,13 @@
Wenn Du <b>mehrere Knoten ausgewählt</b> hast, dann werden alle verschoben bzw. kopiert.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="Freeplane_Link_873938281" CREATED="1274995662438" MODIFIED="1274997408469">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_873938281" CREATED="1274995662438" MODIFIED="1274997408469"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1304,13 +1509,15 @@
Freeplane unterstützt allgemein (je nach genutzter Betriebssystemplattform) die <b>Datenübernahme</b> aus <b>externen Programmen</b> durch den drag-and-drop Mechanismus wie z. B. Dateien unter Microsoft Windows oder markierten Text von einer besuchten Internetseite.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Knoten frei positionieren" FOLDED="true" ID="ID_1293447241" CREATED="1270997738611" MODIFIED="1274997499009" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<node ID="_Freeplane_Link_97763226" CREATED="1270892460688" MODIFIED="1275334976852" HGAP="21" VSHIFT="16">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_97763226" CREATED="1270892460688" MODIFIED="1275334976852" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="16.0 px"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1321,10 +1528,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_505978546" CREATED="1270997770751" MODIFIED="1275335010525">
-<richcontent TYPE="NODE">
+<node ID="ID_505978546" CREATED="1270997770751" MODIFIED="1275335010525"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1335,10 +1543,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1457898208" CREATED="1270997857923" MODIFIED="1275335088294">
-<richcontent TYPE="NODE">
+<node ID="ID_1457898208" CREATED="1270997857923" MODIFIED="1275335088294"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1349,10 +1558,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_846513064" CREATED="1270998153408" MODIFIED="1275335118169">
-<richcontent TYPE="NODE">
+<node ID="ID_846513064" CREATED="1270998153408" MODIFIED="1275335118169"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1363,13 +1573,14 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
<node TEXT="Kopieren und einfügen" FOLDED="true" ID="Freeplane_Link_958781924" CREATED="1270892460683" MODIFIED="1274998189283" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_1088879884" CREATED="1274998221355" MODIFIED="1275335223713">
-<richcontent TYPE="NODE">
+<node ID="ID_1088879884" CREATED="1274998221355" MODIFIED="1275335223713"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1380,10 +1591,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1563176838" CREATED="1274998221355" MODIFIED="1275335286889">
-<richcontent TYPE="NODE">
+<node ID="ID_1563176838" CREATED="1274998221355" MODIFIED="1275335286889"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1394,6 +1606,7 @@
</p>
</body>
</html>
+
</richcontent>
</node>
<node TEXT="Baum
 Laubbaum
 Eiche
 Nadelbaum
 Tanne" ID="ID_794791780" CREATED="1270892460684" MODIFIED="1275335725894" COLOR="#996600">
@@ -1416,8 +1629,8 @@
</node>
</node>
</node>
-<node ID="ID_780592545" CREATED="1270892460685" MODIFIED="1274998705693">
-<richcontent TYPE="NODE">
+<node ID="ID_780592545" CREATED="1270892460685" MODIFIED="1274998705693"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1427,13 +1640,15 @@
Wenn Du <b>HTML einfügst</b> kann es entweder als einzelner Knoten, oder als ganze Knotenhierarchie eingefügt werden. Verwende dafür "Bearbeiten -> Einfügen als...".
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Ein Beispiel für "Einfügen als..."" FOLDED="true" ID="ID_637512189" CREATED="1270892460685" MODIFIED="1274999518092">
<font NAME="SansSerif" SIZE="12"/>
<node TEXT="HTML als einzelnen Knoten" ID="ID_1806025194" CREATED="1270894542238" MODIFIED="1274999064619">
-<node ID="ID_669110345" CREATED="1270894698475" MODIFIED="1270894698475">
-<richcontent TYPE="NODE">
+<node ID="ID_669110345" CREATED="1270894698475" MODIFIED="1270894698475"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1483,12 +1698,14 @@
<br/>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Knotenhierarchie als HTML" ID="ID_541043985" CREATED="1270894548254" MODIFIED="1274999480943">
-<node ID="ID_232672532" CREATED="1270894712253" MODIFIED="1270894712253">
-<richcontent TYPE="NODE">
+<node ID="ID_232672532" CREATED="1270894712253" MODIFIED="1270894712253"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1498,10 +1715,12 @@
<i><b><font size="4">Boost your brain with Freeplane</font></b></i><font size="4"> </font>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_149083422" CREATED="1270894712256" MODIFIED="1270894712257" LINK="http://sourceforge.net/projects/freeplane/">
-<richcontent TYPE="NODE">
+<node ID="ID_149083422" CREATED="1270894712256" MODIFIED="1270894712257" LINK="http://sourceforge.net/projects/freeplane/"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1511,10 +1730,12 @@
<a href="http://sourceforge.net/projects/freeplane/"><b><font size="4">Download Freeplane now!</font></b></a><font size="4"> </font>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node FOLDED="true" ID="ID_1571069768" CREATED="1270894712263" MODIFIED="1270894712263">
-<richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_1571069768" CREATED="1270894712263" MODIFIED="1270894712263"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1524,9 +1745,11 @@
What is Freeplane?
</h1>
</body>
-</html></richcontent>
-<node FOLDED="true" ID="ID_1003296305" CREATED="1270894712271" MODIFIED="1270894712271" LINK="http://freemind.sourceforge.net/">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node FOLDED="true" ID="ID_1003296305" CREATED="1270894712271" MODIFIED="1270894712271" LINK="http://freemind.sourceforge.net/"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1536,9 +1759,11 @@
Freeplane is a powerful and free mind mapping application. It is a redesigned version of the well known <a href="http://freemind.sourceforge.net/">FreeMind</a>, and is created by one of FreeMind's key developers. The software is written in Java, and supports any platform capable of running current versions of Java, including:
</p>
</body>
-</html></richcontent>
-<node ID="ID_1528122430" CREATED="1270894712274" MODIFIED="1270894712274">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node ID="ID_1528122430" CREATED="1270894712274" MODIFIED="1270894712274"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1552,10 +1777,12 @@
</li>
</ul>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_624982390" CREATED="1270894712277" MODIFIED="1270894712277">
-<richcontent TYPE="NODE">
+<node ID="ID_624982390" CREATED="1270894712277" MODIFIED="1270894712277"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1569,10 +1796,12 @@
</li>
</ul>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_767338979" CREATED="1270894712280" MODIFIED="1270894712280">
-<richcontent TYPE="NODE">
+<node ID="ID_767338979" CREATED="1270894712280" MODIFIED="1270894712280"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1586,10 +1815,12 @@
</li>
</ul>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_972361679" CREATED="1270894712283" MODIFIED="1270894712283" LINK="http://freeplane.sourceforge.net/wiki/index.php/Portable_Freeplane">
-<richcontent TYPE="NODE">
+<node ID="ID_972361679" CREATED="1270894712283" MODIFIED="1270894712283" LINK="http://freeplane.sourceforge.net/wiki/index.php/Portable_Freeplane"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1603,14 +1834,16 @@
</li>
</ul>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
</node>
</node>
</node>
-<node ID="ID_734855520" CREATED="1274998221364" MODIFIED="1274999786391">
-<richcontent TYPE="NODE">
+<node ID="ID_734855520" CREATED="1274998221364" MODIFIED="1274999786391"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1620,10 +1853,12 @@
Wenn Du eine im Explorer markierte <b>Dateiliste einfügst</b>, wird für jede Datei ein Knoten mit dem Pfad und dem Namen der Datei und einem Link auf die Datei eingefügt.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1790983208" CREATED="1274998221364" MODIFIED="1275336289379">
-<richcontent TYPE="NODE">
+<node ID="ID_1790983208" CREATED="1274998221364" MODIFIED="1275336289379"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1634,6 +1869,7 @@
</p>
</body>
</html>
+
</richcontent>
</node>
<node TEXT="Baum" ID="ID_1805360637" CREATED="1274998221366" MODIFIED="1274998221366">
@@ -1647,8 +1883,8 @@
</node>
<node TEXT="Google <http://www.google.com/>" ID="ID_423317930" CREATED="1274998221367" MODIFIED="1274998221367" LINK="http://www.google.com/"/>
</node>
-<node ID="ID_1140366916" CREATED="1274998221367" MODIFIED="1275000203494">
-<richcontent TYPE="NODE">
+<node ID="ID_1140366916" CREATED="1274998221367" MODIFIED="1275000203494"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1661,10 +1897,12 @@
Editoren die das Rich-Text-Format (RTF) beherrschen sind zum Beispiel Microsoft Word, OpenOffice.org, Microsoft Outlook, einige Texteditoren unter Linux und TextEdit unter Mac OS X.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1036066408" CREATED="1274998221369" MODIFIED="1275000296467">
-<richcontent TYPE="NODE">
+<node ID="ID_1036066408" CREATED="1274998221369" MODIFIED="1275000296467"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1674,12 +1912,14 @@
Um einen <b>Knoten</b> <b>ohne Kinder</b> und Nachfahren zu <b>kopieren</b>, drücke die Tastenkombination 'Strg' + Umschalt + 'C' oder benutze "Einfach kopieren" im Kontextmenü des Knotens.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Hyperlinks" FOLDED="true" ID="Freeplane_Link_203858515" CREATED="1270892460675" MODIFIED="1275001896255" COLOR="#407000">
-<node ID="ID_959010942" CREATED="1270892460676" MODIFIED="1275057777549">
-<richcontent TYPE="NODE">
+<node ID="ID_959010942" CREATED="1270892460676" MODIFIED="1275057777549"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1701,10 +1941,12 @@
- Andere Knoten in einer MindMap
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_745700749" CREATED="1270892460675" MODIFIED="1275000970889">
-<richcontent TYPE="NODE">
+<node ID="ID_745700749" CREATED="1270892460675" MODIFIED="1275000970889"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1714,10 +1956,12 @@
Um einen <b>Hyperlink hinzuzufügen</b> verwende "Einfügen -> Hyperlink (Textfeld)...", oder drücke die Tasten Strg + K.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1001948679" CREATED="1270892460675" MODIFIED="1275336382806">
-<richcontent TYPE="NODE">
+<node ID="ID_1001948679" CREATED="1270892460675" MODIFIED="1275336382806"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1728,10 +1972,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_9407796" CREATED="1270892460675" MODIFIED="1275336418086">
-<richcontent TYPE="NODE">
+<node ID="ID_9407796" CREATED="1270892460675" MODIFIED="1275336418086"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1745,12 +1990,13 @@
</p>
</body>
</html>
+
</richcontent>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1116507628" CREATED="1270892460676" MODIFIED="1275336454432">
-<richcontent TYPE="NODE">
+<node ID="ID_1116507628" CREATED="1270892460676" MODIFIED="1275336454432"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1761,10 +2007,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1159570525" CREATED="1270894120878" MODIFIED="1275336526220">
-<richcontent TYPE="NODE">
+<node ID="ID_1159570525" CREATED="1270894120878" MODIFIED="1275336526220"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1778,10 +2025,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1153372393" CREATED="1271979133506" MODIFIED="1275336579998">
-<richcontent TYPE="NODE">
+<node ID="ID_1153372393" CREATED="1271979133506" MODIFIED="1275336579998"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1801,6 +2049,7 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
@@ -1808,8 +2057,8 @@
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
<node TEXT="Ein Knoten kann mehrere Icons haben." ID="ID_1983709741" CREATED="1270892460676" MODIFIED="1275001921496"/>
-<node ID="ID_1126175660" CREATED="1270892460676" MODIFIED="1275336633204">
-<richcontent TYPE="NODE">
+<node ID="ID_1126175660" CREATED="1270892460676" MODIFIED="1275336633204"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1823,10 +2072,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1703076068" CREATED="1270892460676" MODIFIED="1275002288608">
-<richcontent TYPE="NODE">
+<node ID="ID_1703076068" CREATED="1270892460676" MODIFIED="1275002288608"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1836,10 +2086,12 @@
Das <b>erste Icon entfernst</b> Du, indem Du auf den Button ganz oben in der Icon-Symbolleiste klickst (mit dem roten Kreuz).
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1240276527" CREATED="1270892460676" MODIFIED="1275002420456">
-<richcontent TYPE="NODE">
+<node ID="ID_1240276527" CREATED="1270892460676" MODIFIED="1275002420456"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1849,10 +2101,12 @@
Um <b>alle Icons</b> eines Knotens zu <b>löschen</b>, klicke auf den dritten Button von oben in der Icon-Symbolleiste (Abfalleimer).
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_911756077" CREATED="1270892460676" MODIFIED="1275002517867">
-<richcontent TYPE="NODE">
+<node ID="ID_911756077" CREATED="1270892460676" MODIFIED="1275002517867"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1862,10 +2116,12 @@
Du kannst <b>neue Icons</b> auch über das Icons-Menü oder mit Strg + F2 <b>einfügen</b>, anstatt die Icon-Symbolleiste zu verwenden.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_537134358" CREATED="1270892460676" MODIFIED="1275002684010">
-<richcontent TYPE="NODE">
+<node ID="ID_537134358" CREATED="1270892460676" MODIFIED="1275002684010"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1875,10 +2131,12 @@
Wenn Du <b>eigene Icons</b> verwenden willst musst Du die Dateien im Freeplane-Verzeichnis im Unterverzeichnis "Icons" ablegen wie z.B. (Linux) ~/.freeplane/icons/myicon.png
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_250751508" CREATED="1270892460677" MODIFIED="1275002761054">
-<richcontent TYPE="NODE">
+<node ID="ID_250751508" CREATED="1270892460677" MODIFIED="1275002761054"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1888,7 +2146,9 @@
Die <b>Icon-Symbolleiste</b> kannst Du über "Ansicht -> Icon-Symbolleiste" <b>ein- und ausblenden</b>.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Dieser Knoten zeigt ein paar Icons, die in Freeplane bereits enthalten sind" ID="ID_1664464562" CREATED="1270892460677" MODIFIED="1275002814023">
<icon BUILTIN="help"/>
@@ -1924,8 +2184,8 @@
<icon BUILTIN="75%"/>
<icon BUILTIN="100%"/>
</node>
-<node ID="ID_26845444" CREATED="1271096826323" MODIFIED="1275336861376">
-<richcontent TYPE="NODE">
+<node ID="ID_26845444" CREATED="1271096826323" MODIFIED="1275336861376"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1936,13 +2196,14 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
<node TEXT="Notizen" FOLDED="true" ID="ID_774913271" CREATED="1271096054547" MODIFIED="1275003022058" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<node ID="ID_1515176011" CREATED="1271096065323" MODIFIED="1275003189553">
-<richcontent TYPE="NODE">
+<node ID="ID_1515176011" CREATED="1271096065323" MODIFIED="1275003189553"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1955,8 +2216,11 @@
die Du wie im externen Editor bearbeiten kannst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<richcontent TYPE="NOTE">
+
<html>
<head>
@@ -1966,10 +2230,11 @@
<b><font color="#fc0b0b"><u>Dieser Knoten hat eine Notiz.</u></font></b>
</p>
</body>
-</html></richcontent>
+</html>
+</richcontent>
</node>
-<node ID="ID_1163876330" CREATED="1271096088819" MODIFIED="1275336894289">
-<richcontent TYPE="NODE">
+<node ID="ID_1163876330" CREATED="1271096088819" MODIFIED="1275336894289"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1980,10 +2245,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_510313925" CREATED="1271096117483" MODIFIED="1275003430688">
-<richcontent TYPE="NODE">
+<node ID="ID_510313925" CREATED="1271096117483" MODIFIED="1275003430688"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -1996,10 +2262,12 @@
Strg + < zwischen dem <b>Notiz-Editor</b> und der <b>MindMap wechseln</b>.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1710319301" CREATED="1271096150723" MODIFIED="1275003679320">
-<richcontent TYPE="NODE">
+<node ID="ID_1710319301" CREATED="1271096150723" MODIFIED="1275003679320"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2012,13 +2280,15 @@
auf jede <b>Seite des Fensters verschoben</b> werden.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Konnektoren" FOLDED="true" ID="_Freeplane_Link_1996597932" CREATED="1270892460679" MODIFIED="1275057825521" COLOR="#407000">
<node TEXT="Als Konnektor bezeichnet man graphische Verweise zwischen Knoten. Man kann sie verwenden, um Zusammenhänge zu visualisieren, die sich nicht durch die Hierarchie darstellen lassen." ID="ID_1288965487" CREATED="1275057915312" MODIFIED="1275336996023"/>
-<node ID="ID_985897417" CREATED="1270892460679" MODIFIED="1275336995821">
-<richcontent TYPE="NODE">
+<node ID="ID_985897417" CREATED="1270892460679" MODIFIED="1275336995821"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2031,11 +2301,13 @@
einen Knoten über den anderen ziehst und beim Loslassen die Tasten Strg + Shift gedrückt hälst.
</p>
</body>
-</html></richcontent>
-<arrowlink DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="255;0;" ENDINCLINATION="255;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</html>
+
+</richcontent>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="255;0;" ENDINCLINATION="255;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_1564001222" CREATED="1270892460679" MODIFIED="1275058502752">
-<richcontent TYPE="NODE">
+<node ID="ID_1564001222" CREATED="1270892460679" MODIFIED="1275058502752"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2051,10 +2323,12 @@
Tastenkombination Strg + L drückst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="_Freeplane_Link_208378337" CREATED="1270892460679" MODIFIED="1275058746447">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_208378337" CREATED="1270892460679" MODIFIED="1275058746447"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2067,10 +2341,12 @@
einen Rechtsklick auf den Konnektor (Mac OS X: Strg + klick) und wähle "Farbe des Konnektors" .
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="_Freeplane_Link_1484370636" CREATED="1270892460679" MODIFIED="1275061916843">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_1484370636" CREATED="1270892460679" MODIFIED="1275061916843"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2083,10 +2359,12 @@
Du auch die <b>Pfeile</b> des <b>Konnektors</b> ändern.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_469749659" CREATED="1270894208830" MODIFIED="1275062032926">
-<richcontent TYPE="NODE">
+<node ID="ID_469749659" CREATED="1270894208830" MODIFIED="1275062032926"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2099,10 +2377,12 @@
Konnektors (Rechtsklick auf Konnektor) ändern.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1970882825" CREATED="1270892460679" MODIFIED="1275062182297">
-<richcontent TYPE="NODE">
+<node ID="ID_1970882825" CREATED="1270892460679" MODIFIED="1275062182297"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2115,10 +2395,12 @@
Kontextmenü (Rechtsklick auf den Konnektor) tun.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="_Freeplane_Link_266716332" CREATED="1270892460679" MODIFIED="1275062350499">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_266716332" CREATED="1270892460679" MODIFIED="1275062350499"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2131,10 +2413,12 @@
kannst Du an den <b>Anfangs-</b> bzw. <b>Endknoten</b> des <b>Konnektors navigieren</b>.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="_Freeplane_Link_1015289745" CREATED="1270892460679" MODIFIED="1275062530830">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_1015289745" CREATED="1270892460679" MODIFIED="1275062530830"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2147,11 +2431,13 @@
klickst und dann bei gedrückter linker Maustaste den Cursor bewegst.
</p>
</body>
-</html></richcontent>
-<arrowlink DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="244;32;" ENDINCLINATION="256;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</html>
+
+</richcontent>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="244;32;" ENDINCLINATION="256;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="ID_1276534365" CREATED="1271981886951" MODIFIED="1275062596475">
-<richcontent TYPE="NODE">
+<node ID="ID_1276534365" CREATED="1271981886951" MODIFIED="1275062596475"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2164,17 +2450,19 @@
Gebrauch von Konnektoren.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Beispiel für den Gebrauch
von Konnektoren" ID="ID_46167995" CREATED="1270892460680" MODIFIED="1275062645702" COLOR="#996600">
<node TEXT="Verbindung zu einem andern Teil" ID="_Freeplane_Link_1170112929" CREATED="1270892460680" MODIFIED="1275063477665" COLOR="#996600">
-<arrowlink COLOR="#1010f1" DESTINATION="_Freeplane_Link_1492563156" MIDDLE_LABEL="Konnektor-Beschriftung" STARTINCLINATION="158;-8;" ENDINCLINATION="857;-165;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#1010f1" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1492563156" MIDDLE_LABEL="Konnektor-Beschriftung" STARTINCLINATION="158;-8;" ENDINCLINATION="857;-165;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Knoten mit eingefaltetem
Kind-Knoten" ID="ID_521887084" CREATED="1270892460680" MODIFIED="1275062819098" COLOR="#996600" HGAP="15" VSHIFT="52">
-<node TEXT="Kind-Knoten" ID="_Freeplane_Link_1492563156" CREATED="1270892460680" MODIFIED="1275062700868" HGAP="25" VSHIFT="7"/>
+<node TEXT="Knoten mit eingefaltetem
Kind-Knoten" ID="ID_521887084" CREATED="1270892460680" MODIFIED="1275062819098" COLOR="#996600" HGAP_QUANTITY="15.0 px" VSHIFT_QUANTITY="52.0 px">
+<node TEXT="Kind-Knoten" ID="_Freeplane_Link_1492563156" CREATED="1270892460680" MODIFIED="1275062700868" HGAP_QUANTITY="25.0 px" VSHIFT_QUANTITY="7.0 px"/>
</node>
<node TEXT="Eine andere Verbindung" ID="_Freeplane_Link_1370577235" CREATED="1270892460680" MODIFIED="1275062797108" COLOR="#996600">
-<arrowlink DESTINATION="_Freeplane_Link_1170112929" SOURCE_LABEL="Beschriftung" STARTINCLINATION="56;22;" ENDINCLINATION="61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1170112929" SOURCE_LABEL="Beschriftung" STARTINCLINATION="56;22;" ENDINCLINATION="61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
@@ -2182,12 +2470,12 @@
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Ein Knoten kann Attribute haben" ID="ID_1293545211" CREATED="1270893318566" MODIFIED="1275062896518">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<attribute_layout NAME_WIDTH="40" VALUE_WIDTH="49"/>
+<attribute_layout NAME_WIDTH="30.0 pt" VALUE_WIDTH="36.75 pt"/>
<attribute NAME="x" VALUE="10"/>
<attribute NAME="y" VALUE="20"/>
</node>
-<node ID="ID_541565942" CREATED="1270896865255" MODIFIED="1275063050254">
-<richcontent TYPE="NODE">
+<node ID="ID_541565942" CREATED="1270896865255" MODIFIED="1275063050254"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2200,10 +2488,12 @@
"Bearbeiten -> Attribute editieren" oder verwende die Tastenkombination Alt + F9.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1213222306" CREATED="1270896956119" MODIFIED="1275063440506">
-<richcontent TYPE="NODE">
+<node ID="ID_1213222306" CREATED="1270896956119" MODIFIED="1275063440506"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2216,13 +2506,15 @@
<b>Attribute</b> zu <b>mehreren Knoten zuweisen</b>, <b>oder</b> sie <b>ändern</b>.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Verwenden von 
HTML in Knoten" FOLDED="true" ID="Freeplane_Link_841140408" CREATED="1270892460698" MODIFIED="1275064177972" COLOR="#407000">
<node TEXT="Du kannst HTML in Knoten verwenden" ID="ID_1253480988" CREATED="1270892460698" MODIFIED="1275063589349"/>
-<node ID="ID_159304805" CREATED="1270892460698" MODIFIED="1275063919930">
-<richcontent TYPE="NODE">
+<node ID="ID_159304805" CREATED="1270892460698" MODIFIED="1275063919930"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2259,26 +2551,26 @@
<p class="msonormal">
Es gibt auch Tabellen:
</p>
- <table cellpadding="0" cellspacing="0" border="1" style="border: none" class="msonormaltable">
+ <table cellpadding="0" cellspacing="0" border="1" class="msonormaltable" style="border-top-color: border-color; border-top-style: none; border-top-width: medium; border-right-color: border-color; border-right-style: none; border-right-width: medium; border-bottom-color: border-color; border-bottom-style: none; border-bottom-width: medium; border-left-color: border-color; border-left-style: none; border-left-width: medium">
<tr>
- <td style="padding-top: .75pt; padding-left: .75pt; border: solid windowtext 1.0pt; padding-bottom: .75pt; padding-right: .75pt">
+ <td style="padding-top: .75pt; padding-left: .75pt; padding-bottom: .75pt; padding-right: .75pt">
<p class="msonormal">
Zelle 1
</p>
</td>
- <td style="border-left: none; padding-top: .75pt; padding-left: .75pt; border: solid windowtext 1.0pt; padding-bottom: .75pt; padding-right: .75pt">
+ <td style="border-left-color: border-color; border-left-style: none; border-left-width: medium; padding-top: .75pt; padding-left: .75pt; padding-bottom: .75pt; padding-right: .75pt">
<p class="msonormal">
Zelle 2
</p>
</td>
</tr>
<tr>
- <td style="padding-top: .75pt; border-top: none; padding-left: .75pt; border: solid windowtext 1.0pt; padding-bottom: .75pt; padding-right: .75pt">
+ <td style="padding-top: .75pt; border-top-color: border-color; border-top-style: none; border-top-width: medium; padding-left: .75pt; padding-bottom: .75pt; padding-right: .75pt">
<p class="msonormal">
Zelle 3
</p>
</td>
- <td style="border-left: none; padding-top: .75pt; border-top: none; padding-left: .75pt; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; padding-bottom: .75pt; padding-right: .75pt">
+ <td style="border-left-color: border-color; border-left-style: none; border-left-width: medium; padding-top: .75pt; border-top-color: border-color; border-top-style: none; border-top-width: medium; padding-left: .75pt; padding-bottom: .75pt; padding-right: .75pt">
<p class="msonormal">
Zelle 4
</p>
@@ -2289,10 +2581,12 @@
Auperdem kann Schrift verschiedene <font color="#999900">Vordergrundfarben</font> <font color="#336600">haben</font>.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_203319288" CREATED="1270895866070" MODIFIED="1275064320380">
-<richcontent TYPE="NODE">
+<node ID="ID_203319288" CREATED="1270895866070" MODIFIED="1275064320380"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2305,10 +2599,12 @@
"Format -> Verwende HTML Formatierung" (Alt + Shift + R) <b>aktivieren</b>.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1308797932" CREATED="1275064183463" MODIFIED="1275064272902">
-<richcontent TYPE="NODE">
+<node ID="ID_1308797932" CREATED="1275064183463" MODIFIED="1275064272902"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2321,7 +2617,9 @@
"Format -> Benutze reinen Text" (Alt + Shift + P) <b>deaktivieren.</b>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Die HTML-Formatierung geht, genauso wie eingebettete Bilder, beim Export als Text oder RTF (Word, Wordpad) verloren. Sie bleibt aber beim Export als Java-Applet erhalten, so dass Du dieses Format zum Veröffentlichen im Web nutzen kannst." ID="ID_248995867" CREATED="1270892460699" MODIFIED="1275337250378">
<font NAME="SansSerif" SIZE="12"/>
@@ -2329,8 +2627,8 @@
</node>
<node TEXT="Verwenden von 
Bildern in Knoten" FOLDED="true" ID="Freeplane_Link_271176250" CREATED="1270892460699" MODIFIED="1275184084223" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_1487662482" CREATED="1275064589975" MODIFIED="1275337589928">
-<richcontent TYPE="NODE">
+<node ID="ID_1487662482" CREATED="1275064589975" MODIFIED="1275337589928"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2356,10 +2654,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_692449557" CREATED="1271527733841" MODIFIED="1275337561235">
-<richcontent TYPE="NODE">
+<node ID="ID_692449557" CREATED="1271527733841" MODIFIED="1275337561235"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2370,10 +2669,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_890405454" CREATED="1270892460700" MODIFIED="1275130951803">
-<richcontent TYPE="NODE">
+<node ID="ID_890405454" CREATED="1270892460700" MODIFIED="1275130951803"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2389,10 +2689,12 @@
Diese Methode funktioniert auch, wenn Du mehrere Knoten ausgewählt hast.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1512479346" CREATED="1270892460700" MODIFIED="1275133214045" COLOR="#000000">
-<richcontent TYPE="NODE">
+<node ID="ID_1512479346" CREATED="1270892460700" MODIFIED="1275133214045" COLOR="#000000"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2405,7 +2707,9 @@
Da es möglich ist in Knoten HTML formatierten Inhalt zu haben, kann man z.B. mit dem IMG-Tag Bilder in Knoten einbetten. Dazu muss der Knotentext mit dem Tag <html> beginnen.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
<node TEXT="Hier einige Beispiele:
 <html><img src="linked/Apple.png">
 <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png">
Der relative Link im ersten Beispiel zeigt auf ein Bild in einem Verzeichnis unter dem Verzeichnis, in dem das MindMap-file liegt." ID="ID_258073366" CREATED="1270892460700" MODIFIED="1275133132438">
@@ -2414,8 +2718,8 @@
<node TEXT="Beispielbilder" ID="Freeplane_Link_1825247742" CREATED="1270892460700" MODIFIED="1275131381309" COLOR="#996600">
<font NAME="SansSerif" SIZE="12" BOLD="true"/>
<node TEXT="Linux" ID="ID_1089845997" CREATED="1275131389011" MODIFIED="1275131395617">
-<node ID="ID_1186180877" CREATED="1275131321555" MODIFIED="1275131330241">
-<richcontent TYPE="NODE">
+<node ID="ID_1186180877" CREATED="1275131321555" MODIFIED="1275131330241"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2423,7 +2727,9 @@
<body>
<img src="file:/usr/share/app-install/icons/treb.png"/>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Ein Knoten mit eingebettem 
externen Objekt" ID="ID_614702580" CREATED="1275133603088" MODIFIED="1275134581194">
<hook URI="file:/../../usr/share/hplip/data/images/other/aio_align.png" SIZE="1.6508051" NAME="ExternalObject"/>
@@ -2431,8 +2737,8 @@
<node TEXT="file:///usr/share/app-install/icons/tsclient.png" ID="ID_965334611" CREATED="1275131506194" MODIFIED="1275131506195" LINK="file:/usr/share/app-install/icons/tsclient.png"/>
</node>
<node TEXT="Windows" ID="ID_51996041" CREATED="1275131401442" MODIFIED="1275131405202">
-<node ID="ID_305515055" CREATED="1124560950732" MODIFIED="1275184124329">
-<richcontent TYPE="NODE">
+<node ID="ID_305515055" CREATED="1124560950732" MODIFIED="1275184124329"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2442,10 +2748,12 @@
<img src="../freeplane.png"/>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_432603647" CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE">
+<node ID="ID_432603647" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2453,10 +2761,12 @@
<body>
<img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1475913288" CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE">
+<node ID="ID_1475913288" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2464,9 +2774,11 @@
<body>
<img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
</body>
-</html></richcontent>
-<node ID="ID_605964107" CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node ID="ID_605964107" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2474,11 +2786,13 @@
<body>
<img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
-<node ID="ID_769058522" CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE">
+<node ID="ID_769058522" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2486,9 +2800,11 @@
<body>
<img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
</body>
-</html></richcontent>
-<node ID="ID_1291538035" CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node ID="ID_1291538035" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2496,9 +2812,11 @@
<body>
<img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
</body>
-</html></richcontent>
-<node ID="ID_51328681" CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node ID="ID_51328681" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2506,7 +2824,9 @@
<body>
<img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
</node>
@@ -2520,8 +2840,8 @@
<node TEXT="Beispiel: mehrzeiliger LaTeX-Text,
der zu einem Knoten zugewiesen ist." ID="ID_651820837" CREATED="1271097206186" MODIFIED="1275134857754">
<hook EQUATION="\begin{array}{l}
\mbox{I}^\fgcolor{ff0000}{\heartsuit}\mbox{\JLaTeXMath}\\
\mbox{I}^\fgcolor{ff0000}{\heartsuit}\mbox{\JLaTeXMath}\\
\end{array}" NAME="plugins/latex/LatexNodeHook.properties"/>
</node>
-<node ID="ID_1042304226" CREATED="1271097123195" MODIFIED="1275135248783">
-<richcontent TYPE="NODE">
+<node ID="ID_1042304226" CREATED="1271097123195" MODIFIED="1275135248783"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2534,10 +2854,12 @@
verwende "Einfügen -> LaTeX".
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_21055085" CREATED="1271097312474" MODIFIED="1275337800751">
-<richcontent TYPE="NODE">
+<node ID="ID_21055085" CREATED="1271097312474" MODIFIED="1275337800751"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2551,10 +2873,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1638605492" CREATED="1271097172667" MODIFIED="1275135388880">
-<richcontent TYPE="NODE">
+<node ID="ID_1638605492" CREATED="1271097172667" MODIFIED="1275135388880"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2567,12 +2890,14 @@
indem Du erneut auf "Einfügen -> LaTeX" klickst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Verwenden der 
Rückgängig- Funktion" FOLDED="true" ID="Freeplane_Link_1318678369" CREATED="1270892460689" MODIFIED="1275135447443" COLOR="#407000">
-<node ID="ID_1877729417" CREATED="1270892460690" MODIFIED="1275135565132">
-<richcontent TYPE="NODE">
+<node ID="ID_1877729417" CREATED="1270892460690" MODIFIED="1275135565132"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2585,10 +2910,12 @@
wähle "Bearbeiten -> Rückgängig", oder verwende die Tastenkombination Strg + Z.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1501637074" CREATED="1270892460690" MODIFIED="1275135724282">
-<richcontent TYPE="NODE">
+<node ID="ID_1501637074" CREATED="1270892460690" MODIFIED="1275135724282"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2601,10 +2928,12 @@
"Bearbeiten -> Wiederherstellen" wählst, oder die Tastenkombination Strg + Y verwendest.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_139456632" CREATED="1270892460690" MODIFIED="1275136034685">
-<richcontent TYPE="NODE">
+<node ID="ID_139456632" CREATED="1270892460690" MODIFIED="1275136034685"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2617,7 +2946,9 @@
sind unter "Extras -> Einstellungen -> Verhalten -> Anzahl wiederrufbarer Aktionen" einstellbar.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
</node>
@@ -2626,8 +2957,8 @@
<node TEXT="Layout der MindMap" FOLDED="true" ID="ID_710714991" CREATED="1271095870732" MODIFIED="1275136508268" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Die MindMap kann in zwei verschiedenen Layouts angezeigt werden:
Als MindMap und in der Gliederungsansicht." ID="ID_1920188221" CREATED="1271095880163" MODIFIED="1275136564936"/>
-<node ID="ID_353099197" CREATED="1271095880163" MODIFIED="1275136667643">
-<richcontent TYPE="NODE">
+<node ID="ID_353099197" CREATED="1271095880163" MODIFIED="1275136667643"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2640,13 +2971,15 @@
indem Du "Ansicht -> Gliederungsansicht" wählst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Die Gliederungsansicht eignet sich beser zum Drucken großer MindMaps." ID="ID_823999289" CREATED="1271095978107" MODIFIED="1275136721495"/>
</node>
<node TEXT="Formatieren von Knoten" FOLDED="true" ID="Freeplane_Link_1660149394" CREATED="1270892460672" MODIFIED="1275136763038" COLOR="#407000">
-<node ID="ID_896067797" CREATED="1270892460672" MODIFIED="1275337941452">
-<richcontent TYPE="NODE">
+<node ID="ID_896067797" CREATED="1270892460672" MODIFIED="1275337941452"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2660,12 +2993,13 @@
</p>
</body>
</html>
+
</richcontent>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12" BOLD="false"/>
</node>
-<node ID="ID_1435353677" CREATED="1270892460673" MODIFIED="1275136965314">
-<richcontent TYPE="NODE">
+<node ID="ID_1435353677" CREATED="1270892460673" MODIFIED="1275136965314"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2678,12 +3012,14 @@
wählst, oder die Tastenkombination Strg + I drückst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_786808182" CREATED="1270892460673" MODIFIED="1275137210440">
-<richcontent TYPE="NODE">
+<node ID="ID_786808182" CREATED="1270892460673" MODIFIED="1275137210440"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2696,12 +3032,14 @@
oder die Tastenkombination Alt + Shift + F <b>ändern</b>.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_256179041" CREATED="1270892460673" MODIFIED="1275142879900">
-<richcontent TYPE="NODE">
+<node ID="ID_256179041" CREATED="1270892460673" MODIFIED="1275142879900"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2714,10 +3052,12 @@
wähle "Format -> Knotenhintergrundfarbe...".
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1900176546" CREATED="1270892460673" MODIFIED="1275147550010">
-<richcontent TYPE="NODE">
+<node ID="ID_1900176546" CREATED="1270892460673" MODIFIED="1275147550010"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2730,12 +3070,14 @@
oder benutze das Tastaturkürzel Strg + Plus (nimm das plus auf dem Keyboard und nicht das im Nummenrfeld).
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1031774745" CREATED="1270892460673" MODIFIED="1275147541076">
-<richcontent TYPE="NODE">
+<node ID="ID_1031774745" CREATED="1270892460673" MODIFIED="1275147541076"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2748,13 +3090,15 @@
oder benutze das Tastaturkürzel Strg + Minus (nimm das minus auf dem Keyboard und nicht das im Nummenrfeld).
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
<node TEXT="Alle oben beschriebenen Funktionen sind auch im Kontextmenü des Knotens unter Format verfügbar." ID="ID_817931500" CREATED="1271977602378" MODIFIED="1275146781865"/>
-<node ID="ID_975697332" CREATED="1270892460674" MODIFIED="1275146918510">
-<richcontent TYPE="NODE">
+<node ID="ID_975697332" CREATED="1270892460674" MODIFIED="1275146918510"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2764,10 +3108,12 @@
Die <b>Schriftart</b> kannst Du im Schriftarten-Auswahlfeld in der Werkzeug-Symbolleiste <b>ändern</b>.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_880893737" CREATED="1270892460674" MODIFIED="1275147029777">
-<richcontent TYPE="NODE">
+<node ID="ID_880893737" CREATED="1270892460674" MODIFIED="1275147029777"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2780,9 +3126,11 @@
"Bearbeiten -> Formatierung kopieren", oder drücke Alt + Shift + C.
</p>
</body>
-</html></richcontent>
-<node ID="ID_52099291" CREATED="1270892460674" MODIFIED="1275147131412">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node ID="ID_52099291" CREATED="1270892460674" MODIFIED="1275147131412"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2795,7 +3143,9 @@
"Bearbeiten -> Formatierung einfügen", oder nutze die Tastenkombination Alt + Shift +C.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
</node>
@@ -2822,8 +3172,8 @@
</node>
<node TEXT="Arbeiten mit Stilen" FOLDED="true" ID="Freeplane_Link_526328879" CREATED="1270892460674" MODIFIED="1275148241685" COLOR="#407000">
<node TEXT="Stile ermöglichen es, eine ganze Reihe von Formatierungen gemeinsam abzuspeichern, und auf Knoten anzuwenden. Ein Stil kann z.B. eine bestimmte Schriftfarbe, Schriftgröße, ein bestimmtes Knotenlinienformat, oder ein Icon enthalten." ID="ID_7935308" CREATED="1275184379901" MODIFIED="1275338406925"/>
-<node ID="ID_284671582" CREATED="1270892460674" MODIFIED="1275184824627">
-<richcontent TYPE="NODE">
+<node ID="ID_284671582" CREATED="1270892460674" MODIFIED="1275184824627"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2833,10 +3183,12 @@
Du kannst einen <b>Stil</b> einem <b>Knoten</b> <b>zuweisen</b>, indem Du den Knoten markierst und unter "Format -> Stile" den Stil auswählst. Diese Option ist auch über das Kontextmenüs des Knotens erreichbar. Außerdem hat jeder Stil eine Tastenkombination, die Du im Menü sehen kannst.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_58326768" CREATED="1270892460674" MODIFIED="1275185027184">
-<richcontent TYPE="NODE">
+<node ID="ID_58326768" CREATED="1270892460674" MODIFIED="1275185027184"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2849,14 +3201,16 @@
wähle "Format -> Stile -> Stile verwalten..."
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Automatisches Layout" FOLDED="true" ID="ID_1561765534" CREATED="1271096555907" MODIFIED="1275185089706" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Knoten können abhängig von ihrer Entfernung zum Wurzelknoten automatisch Formatierungen ähnlich den Stilen zugewiesen werden." ID="ID_287999249" CREATED="1271096587963" MODIFIED="1275185306333"/>
-<node ID="ID_495596648" CREATED="1271096619675" MODIFIED="1275185466097">
-<richcontent TYPE="NODE">
+<node ID="ID_495596648" CREATED="1271096619675" MODIFIED="1275185466097"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2869,10 +3223,12 @@
wähle "Format -> Automatisches Layout".
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1678162067" CREATED="1275185485875" MODIFIED="1275185599244">
-<richcontent TYPE="NODE">
+<node ID="ID_1678162067" CREATED="1275185485875" MODIFIED="1275185599244"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2882,13 +3238,15 @@
Das <b>Automatische Layout</b> kannst du in den Einstellungen unter "Extras -> Einstellungen... -> Automatisches Layout" <b>konfigurieren</b>.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Knoten mit Wolken hervorheben" FOLDED="true" ID="Freeplane_Link_1697687428" CREATED="1270892460674" MODIFIED="1275185625052" COLOR="#407000">
<node TEXT="Wolken sind gut geeignet, um einen ganzen Zweig hervorzuheben. Dieses Formatierungselement bezieht sich nämlich auf den Knoten und alle seine Nachfolger." ID="ID_1689467777" CREATED="1270892460675" MODIFIED="1275338506115"/>
-<node ID="ID_1388258473" CREATED="1270892460675" MODIFIED="1275185837991">
-<richcontent TYPE="NODE">
+<node ID="ID_1388258473" CREATED="1270892460675" MODIFIED="1275185837991"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2901,10 +3259,12 @@
oder verwende die Tastenkombination Strg + Shift +B.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_238365883" CREATED="1270892460675" MODIFIED="1275185900358">
-<richcontent TYPE="NODE">
+<node ID="ID_238365883" CREATED="1270892460675" MODIFIED="1275185900358"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2915,22 +3275,23 @@
</p>
</body>
</html>
+
</richcontent>
</node>
<node TEXT="Wolken können verschiedene Hintergrundfarben haben, wie grün..." ID="ID_703286001" CREATED="1270892460675" MODIFIED="1275186034129">
-<cloud COLOR="#32d632" WIDTH="0"/>
+<cloud COLOR="#32d632" SHAPE="ARC"/>
<node TEXT="... oder rot" ID="ID_1207851558" CREATED="1270892460675" MODIFIED="1275186015216">
-<cloud COLOR="#e81d1f" WIDTH="0"/>
+<cloud COLOR="#e81d1f" SHAPE="ARC"/>
</node>
</node>
</node>
</node>
-<node TEXT="Weitere Funktionen" FOLDED="true" POSITION="right" ID="ID_827349258" CREATED="1271021855439" MODIFIED="1275186150871" COLOR="#006666" HGAP="29" VSHIFT="-63">
+<node TEXT="Weitere Funktionen" FOLDED="true" POSITION="right" ID="ID_827349258" CREATED="1271021855439" MODIFIED="1275186150871" COLOR="#006666" HGAP_QUANTITY="29.0 px" VSHIFT_QUANTITY="-63.0 px">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Einstellungen vornehmen" FOLDED="true" ID="Freeplane_Link_1822195277" CREATED="1270892460697" MODIFIED="1275186199211" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_425668379" CREATED="1270892460697" MODIFIED="1275338776557">
-<richcontent TYPE="NODE">
+<node ID="ID_425668379" CREATED="1270892460697" MODIFIED="1275338776557"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2941,10 +3302,11 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1823288862" CREATED="1270895079510" MODIFIED="1275338836138">
-<richcontent TYPE="NODE">
+<node ID="ID_1823288862" CREATED="1270895079510" MODIFIED="1275338836138"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2955,14 +3317,15 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
<node TEXT="Dateisperrung" FOLDED="true" ID="ID_1594926210" CREATED="1270892460703" MODIFIED="1275232363559" COLOR="#407000">
<node TEXT="Das Sperren der geöffneten MindMap-Datei stellt sicher, dass andere Benutzer nicht zur selben Zeit die von Dir geöffnete Datei bearbeiten, so dass Informationen nicht überschrieben werden können." ID="ID_1859037836" CREATED="1270892460703" MODIFIED="1275232425727"/>
<node TEXT="Die in Freeplane im Augenblick implementierte Dateisperrung hat einen experimentellen Status und ist daher standardmäsig deaktiviert. In seltenen Fällen kann es zu Problemen kommen. Für den alltäglichen Gebrauch ist die Dateisperrung aber geeignet." ID="ID_60090824" CREATED="1270892460703" MODIFIED="1275338918192"/>
-<node ID="ID_1792715924" CREATED="1270892460703" MODIFIED="1275338964089">
-<richcontent TYPE="NODE">
+<node ID="ID_1792715924" CREATED="1270892460703" MODIFIED="1275338964089"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -2976,13 +3339,14 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
<node TEXT="Drucken" FOLDED="true" ID="Freeplane_Link_1528828442" CREATED="1270892460697" MODIFIED="1275232589985" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_1681186639" CREATED="1270892460697" MODIFIED="1275233008481">
-<richcontent TYPE="NODE">
+<node ID="ID_1681186639" CREATED="1270892460697" MODIFIED="1275233008481"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3010,13 +3374,15 @@
- Benutzerdefinierte Größe
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Es ist empfehlenswert die MindMap im Querformat zu drucken, da so der Platz auf dem Papier besser ausgenutz wird." ID="ID_741420393" CREATED="1270892460698" MODIFIED="1275233170897">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_209381010" CREATED="1270892460698" MODIFIED="1275339012245">
-<richcontent TYPE="NODE">
+<node ID="ID_209381010" CREATED="1270892460698" MODIFIED="1275339012245"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3027,6 +3393,7 @@
</p>
</body>
</html>
+
</richcontent>
<font NAME="SansSerif" SIZE="12"/>
</node>
@@ -3049,8 +3416,8 @@
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Als HTML exportieren" FOLDED="true" ID="Freeplane_Link_22510332" CREATED="1270892460690" MODIFIED="1275234526622" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_1502864159" CREATED="1270892460690" MODIFIED="1275236003357">
-<richcontent TYPE="NODE">
+<node ID="ID_1502864159" CREATED="1270892460690" MODIFIED="1275236003357"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3063,12 +3430,14 @@
"Datei -> Export" verschiedene Export-Methoden zur Verfügung. Abhängig von den Einstellungen unter "Extras -> Einstellungen -> HTML -> HTML Export" werden die Faltung und die Icons mit exportiert.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Exportieren als Bitmap, PDF
oder SVG" FOLDED="true" ID="Freeplane_Link_1908686168" CREATED="1270892460690" MODIFIED="1275236061727" COLOR="#407000">
-<node ID="ID_216678851" CREATED="1270892460690" MODIFIED="1275236187096">
-<richcontent TYPE="NODE">
+<node ID="ID_216678851" CREATED="1270892460690" MODIFIED="1275236187096"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3078,12 +3447,14 @@
Im Menü "Datei -> Export" stehen Dir noch <b>weitere Export-Formate</b> wie *.png, *.jpg, *.pdf oder *.svg zur Verfügung.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Konvertieren in andere XML-Formate" FOLDED="true" ID="Freeplane_Link_329770204" CREATED="1270892460691" MODIFIED="1275236262989" COLOR="#407000">
-<node ID="ID_1483460074" CREATED="1270892460691" MODIFIED="1275236483091" COLOR="#996600">
-<richcontent TYPE="NODE">
+<node ID="ID_1483460074" CREATED="1270892460691" MODIFIED="1275236483091" COLOR="#996600"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3096,7 +3467,9 @@
wähle "Datei -> Export -> Verschiedene Formate (z.B. *.doc *.xls) mit XSLT...
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Diese Export-Option wendet eine XSLT Transformation auf die Freeplane MindMap an, um die Exportdatei zu erzeugen." ID="ID_1796935486" CREATED="1270897200986" MODIFIED="1275236578454"/>
<node TEXT="Im Drop-Down Feld Filter des Popup-Fensters von "Datei -> Export -> Verschiedene Formate (z.B. *.doc *.xls) mit XSLT..." kannst Du unter verschiedenen Transformations-Dateien auswählen." ID="ID_1457131583" CREATED="1270897200986" MODIFIED="1275236811147"/>
@@ -3104,8 +3477,8 @@
<node TEXT="XSL-Dateien müssen die Endung .xsl haben." ID="ID_870607100" CREATED="1270897200996" MODIFIED="1275237007940"/>
<node TEXT="XSL-Dateien müssen innerhalb der ersten 5 Zeilen eine Beschreibung Ihrer Funktion in der folgenden Form haben:

MINDMAPEXPORT endung beschreibung" ID="ID_1304075824" CREATED="1270897201015" MODIFIED="1275237107572"/>
</node>
-<node ID="ID_1185345026" CREATED="1270892460691" MODIFIED="1275237243019">
-<richcontent TYPE="NODE">
+<node ID="ID_1185345026" CREATED="1270892460691" MODIFIED="1275237243019"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3118,13 +3491,15 @@
Wähle dazu "Datei -> Export -> Als OpenOffice Writer Dokument"
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Importieren von 
Verzeichnisstrukturen" FOLDED="true" ID="Freeplane_Link_1841136119" CREATED="1270892460691" MODIFIED="1275237276267" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node ID="ID_141591900" CREATED="1270892460691" MODIFIED="1275339301636">
-<richcontent TYPE="NODE">
+<node ID="ID_141591900" CREATED="1270892460691" MODIFIED="1275339301636"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3144,6 +3519,7 @@
</p>
</body>
</html>
+
</richcontent>
</node>
<node TEXT="Beispiel" ID="ID_1229069993" CREATED="1270892460691" MODIFIED="1275238428298" COLOR="#996600">
@@ -3182,8 +3558,8 @@
<node TEXT="Importieren von 
Internet-Explorer Favoriten" FOLDED="true" ID="Freeplane_Link_269203785" CREATED="1270892460695" MODIFIED="1275241757795" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node ID="Freeplane_Link_260446736" CREATED="1270892460695" MODIFIED="1275241990848">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_260446736" CREATED="1270892460695" MODIFIED="1275241990848"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3193,12 +3569,14 @@
Um <b>Internet-Explorer Favoriten</b> zu <b>importieren</b>, wähle "Datei -> Import -> Explorer Favoriten". Du musst danach den Pfad zum Ordner, der die Favoriten enthält eingeben. Bei vielen Windows Versionen ist dies C:\Documents and Settings\<user>\Favorites.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Importieren von MindManager X5 MindMaps" FOLDED="true" ID="Freeplane_Link_1709974530" CREATED="1270892460696" MODIFIED="1275242022246" COLOR="#407000">
-<node ID="ID_75598516" CREATED="1270892460696" MODIFIED="1275242105186">
-<richcontent TYPE="NODE">
+<node ID="ID_75598516" CREATED="1270892460696" MODIFIED="1275242105186"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3211,7 +3589,9 @@
"Datei -> Import -> MinndManager X5 Map..."
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Integration mit Textverarbeitungs- und E-Mail-Programmen" FOLDED="true" ID="Freeplane_Link_913645795" CREATED="1270892460696" MODIFIED="1275242162498" COLOR="#407000">
@@ -3226,8 +3606,8 @@
</node>
</node>
<node TEXT="Browsen der Dateien auf 
Deinem Computer" FOLDED="true" ID="_Freeplane_Link_353522063" CREATED="1270892460641" MODIFIED="1275247084182" COLOR="#407000">
-<node ID="ID_580394018" CREATED="1270892460642" MODIFIED="1275247209778">
-<richcontent TYPE="NODE">
+<node ID="ID_580394018" CREATED="1270892460642" MODIFIED="1275247209778"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3240,11 +3620,13 @@
musst Du über "MindMaps -> Datei Explorer" in den browse-Modus schalten.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Der Datei-Baum wird dabei wie eine MindMap dargestellt." ID="ID_752002115" CREATED="1270892460642" MODIFIED="1275247251598"/>
-<node ID="ID_9876074" CREATED="1270892460642" MODIFIED="1275247590773">
-<richcontent TYPE="NODE">
+<node ID="ID_9876074" CREATED="1270892460642" MODIFIED="1275247590773"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3254,7 +3636,9 @@
Du kannst eine <b>weiteres Explorer-Tab öffnen</b>, indem Du im Kontext-Menü eines Knotens Zentrieren wählst. Dieser Knoten wird dann zum Wurzelknoten einer neuen Dateiansicht.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Um einen Eintrag zu öffnen, ihn auszuführen oder zu betrachten, folge dem Link des Knotens." ID="ID_355560243" CREATED="1270892460643" MODIFIED="1275247667345"/>
<node TEXT="Dieser Datei-Modus ist hauptsächlich als eine Demonstration der Möglichkeit gedacht, Daten aus externen Quellen mit Freeplane zu visualisieren. Software Entwickler können auf diese Art und Weise weitere "Modis" für ihre Daten programmieren." ID="_Freeplane_Link_279880616" CREATED="1270892460643" MODIFIED="1275247816238"/>
@@ -3263,8 +3647,8 @@
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Freeplane erzeugt in jedem Ordner, der eine editierte MindMap einthält, einen Unterordner mit dem Namen ".backup". Hier speichert Freeplane ältere Versionen der aktiven MindMap, sowie automatisch erzeugte backups. Die automatischen Sicherungen haben die Endung ".autosave"." ID="ID_1590067344" CREATED="1271096749626" MODIFIED="1275248093530"/>
<node TEXT="Standardmäsig wird jede Minute eine Sicherung gemacht und es wird eine Historie der letzten 10 Backups als Datensicherung gehalten" ID="ID_1073721425" CREATED="1271177847312" MODIFIED="1275248213218"/>
-<node ID="ID_206842943" CREATED="1271178201859" MODIFIED="1275248553129">
-<richcontent TYPE="NODE">
+<node ID="ID_206842943" CREATED="1271178201859" MODIFIED="1275248553129"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3274,10 +3658,12 @@
Um die <b>Sicherung wieder herzustellen</b>, musst Du sie händisch umbenennen. Das bedeutet Du musst die Endung ".autosave" und die Nummer entfernen. Standardmäsig reichen die Nummern von 1 bis 10, wobei 10 die letzte Sicherung ist. Nehmen wir an, Du willst eine Datei mit dem Namen freeplane.mm wieder herstellen, dann musst Du aus dem Ordner "./.backup" die Datei "freeplane.mm.10.autosave" in "freeplane.mm" umbenennen.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node FOLDED="true" ID="ID_3064437" CREATED="1271178347062" MODIFIED="1275248780969">
-<richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_3064437" CREATED="1271178347062" MODIFIED="1275248780969"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3287,14 +3673,16 @@
Du kannst diese <b>Funktionen</b> unter "Extras -> Einstellungen -> Allgemein -> Automatisches Speichern" <b>konfigurieren.</b>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
</node>
<node TEXT="Homepage von Freeplane" POSITION="left" ID="ID_916980386" CREATED="1270892460631" MODIFIED="1274306454209" LINK="http://freeplane.sourceforge.net">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Tabelle der vordefinierten Tastaturkürzel (separates Dokument)" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1091417446" CREATED="1270892460634" MODIFIED="1275251282200" COLOR="#006699" LINK="FP_Key_Mappings_Quick_Guide_de.pdf"/>
+<node TEXT="Tabelle der vordefinierten Tastaturkürzel (separates Dokument)" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1091417446" CREATED="1270892460634" MODIFIED="1275251282200" LINK="FP_Key_Mappings_Quick_Guide_de.pdf" COLOR="#006699"/>
<node TEXT="Menü-Referenz von Freeplane (separates Dokument)" POSITION="left" ID="ID_640122712" CREATED="1272090985328" MODIFIED="1275251471956" LINK="FP_MenuReference_de.mm" COLOR="#006699">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
</node>
@@ -3309,8 +3697,8 @@
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node ID="_Freeplane_Link_139664576" CREATED="1270892460640" MODIFIED="1274392860879">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_139664576" CREATED="1270892460640" MODIFIED="1274392860879"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3323,10 +3711,12 @@
Freeplane kann dann wie alle anderen Programme über das Start-Menü gestartet werden.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="_Freeplane_Link_1380352758" CREATED="1270892460641" MODIFIED="1274392884173">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_1380352758" CREATED="1270892460641" MODIFIED="1274392884173"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3336,11 +3726,13 @@
<b>Linux:</b> Lade das Java Runtime Enviroment und Freeplane herunter. Installiere zuerst Java und entpacke dann das Freeplane-Archiv. Zum starten von Freeplane mußt Du freeplane.sh ausführen.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font BOLD="false" ITALIC="false"/>
</node>
-<node ID="_Freeplane_Link_1808511462" CREATED="1270892460641" MODIFIED="1274393920819">
-<richcontent TYPE="NODE">
+<node ID="_Freeplane_Link_1808511462" CREATED="1270892460641" MODIFIED="1274393920819"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -3369,7 +3761,9 @@
Im Freeplane-Wiki gibt es eine Mac-Seite mit weiteren Informationen.<br/>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
<node TEXT="Hinweise für Mac-Nutzer" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1530607683" CREATED="1270892460643" MODIFIED="1274393981644" COLOR="#006666">
@@ -3416,7 +3810,7 @@
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
</node>
-<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1270892460647" MODIFIED="1270892460647" COLOR="#996600" LINK="http://danpolansky.blogspot.com/">
+<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1270892460647" MODIFIED="1270892460647" LINK="http://danpolansky.blogspot.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
</node>
@@ -3453,5 +3847,3 @@
</node>
</node>
</map>
-
-
diff --git a/freeplane/doc/freeplane_es.mm b/freeplane/doc/freeplane_es.mm
index 94f9b5a..060b149 100644
--- a/freeplane/doc/freeplane_es.mm
+++ b/freeplane/doc/freeplane_es.mm
@@ -1,508 +1,628 @@
-<map version="0.8.0">
-<!-- To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node COLOR="#993300" CREATED="1124560950701" ID="Freeplane_Link_37609021" MODIFIED="1170661549281" TEXT="<html>
 <head>
 
 </head>
 <body width="">
 <p align="center">
 Freeplane<br><small>- Aplicación libre para la creación de mapas mentales -</small> 
 </p>
 </body>
</html>
">
-<font BOLD="true" NAME="Dialog" SIZE="18"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_367746551" LINK="http://freeplane.sourceforge.net" MODIFIED="1170318639020" POSITION="left" TEXT="Página web de Freeplane">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1091417446" MODIFIED="1170318817613" POSITION="left" TEXT="Tabla de teclas rápidas">
-<node COLOR="#338800" CREATED="1124560950701" ID="Freeplane_Link_1439762647" MODIFIED="1170662308844" TEXT="Comandos de fichero
Nuevo mapa - Ctrl+N
Abrir mapa - Ctrl+O
Guardar mapa - Ctrl+S
Guardar como… - Ctrl+A
Imprimir - Ctrl+P
Cerrar [...]
+<map version="freeplane 1.5.9">
+<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node FOLDED="false" ID="Freeplane_Link_37609021" CREATED="1124560950701" MODIFIED="1170661549281" COLOR="#993300"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body width="">
+ <p align="center">
+ Freeplane<br/><small>- Aplicación libre para la creación de mapas mentales -</small>
+ </p>
+ </body>
+</html>
+
+</richcontent>
+<font NAME="Dialog" SIZE="18" BOLD="true"/>
+<hook NAME="MapStyle">
+ <properties fit_to_viewport="false;"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" FORMAT="NO_FORMAT" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="true" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#ffffff">
+<font SIZE="9"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" UNIFORM_SHAPE="true" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font SIZE="24" ITALIC="true"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2">
+<edge COLOR="#ff0033"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3">
+<edge COLOR="#009933"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4">
+<edge COLOR="#3333ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#ff6600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<node TEXT="Página web de Freeplane" POSITION="left" ID="Freeplane_Link_367746551" CREATED="1124560950701" MODIFIED="1170318639020" LINK="http://freeplane.sourceforge.net">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Tabla de teclas rápidas" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1091417446" CREATED="1124560950701" MODIFIED="1170318817613" COLOR="#006699">
+<node TEXT="Comandos de fichero
Nuevo mapa - Ctrl+N
Abrir mapa - Ctrl+O
Guardar mapa - Ctrl+S
Guardar como… - Ctrl+A
Imprimir - Ctrl+P
Cerrar - Ctrl+Q
Mapa anterior - Ctrl+Izquierda
Mapa siguiente [...]
<font NAME="Courier New" SIZE="12"/>
</node>
</node>
-<node COLOR="#006633" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_904501221" MODIFIED="1170319517218" POSITION="left" TEXT="Instalación">
-<arrowlink DESTINATION="_Freeplane_Link_904501221" ENDARROW="Default" ENDINCLINATION="0;0;" ID="Freeplane_Arrow_Link_823790149" STARTARROW="None" STARTINCLINATION="0;0;"/>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1911559485" MODIFIED="1170319539983" TEXT="Enlaces">
-<node CREATED="1124560950701" ID="Freeplane_Link_355384845" LINK="http://java.sun.com/j2se" MODIFIED="1170319548608" TEXT="Descargar el entorno de ejecución de Java (J2RE 1.4 ó superior)">
+<node TEXT="Instalación" FOLDED="true" POSITION="left" ID="_Freeplane_Link_904501221" CREATED="1124560950701" MODIFIED="1170319517218" COLOR="#006633">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_904501221" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="Enlaces" FOLDED="true" ID="_Freeplane_Link_1911559485" CREATED="1124560950701" MODIFIED="1170319539983" COLOR="#006699">
+<node TEXT="Descargar el entorno de ejecución de Java (J2RE 1.4 ó superior)" ID="Freeplane_Link_355384845" CREATED="1124560950701" MODIFIED="1170319548608" LINK="http://java.sun.com/j2se">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1612101865" LINK="http://sourceforge.net/project/showfiles.php?project_id=211069" MODIFIED="1170319561858" TEXT="Descargar la aplicación">
+<node TEXT="Descargar la aplicación" ID="_Freeplane_Link_1612101865" CREATED="1124560950701" MODIFIED="1170319561858" LINK="http://sourceforge.net/project/showfiles.php?project_id=211069">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1170319584827" ID="Freeplane_Link_1046224624" MODIFIED="1170319584827" TEXT="Para instalar Freeplane en Microsoft Windows, instalar Java de Sun e instalar Freeplane usando el instalador de éste."/>
-<node CREATED="1170319584827" MODIFIED="1170319584827" TEXT="Para instalar Freeplane en Linux, descargar el entorno de ejecución de Java y la propia aplicación de Freeplane. Primero instale Java, y después descomprima Freeplane. Para usar Freeplane, ejecutar freeplane.sh."/>
-<node CREATED="1170319584827" MODIFIED="1170319584827" TEXT="En Microsoft Windows y MAC OS X, también puede hacer doble click en el fichero freeplane.jar alojado en carpeta lib para ejecutar Freeplane."/>
+<node TEXT="Para instalar Freeplane en Microsoft Windows, instalar Java de Sun e instalar Freeplane usando el instalador de éste." ID="Freeplane_Link_1046224624" CREATED="1170319584827" MODIFIED="1170319584827"/>
+<node TEXT="Para instalar Freeplane en Linux, descargar el entorno de ejecución de Java y la propia aplicación de Freeplane. Primero instale Java, y después descomprima Freeplane. Para usar Freeplane, ejecutar freeplane.sh." ID="ID_1422958662" CREATED="1170319584827" MODIFIED="1170319584827"/>
+<node TEXT="En Microsoft Windows y MAC OS X, también puede hacer doble click en el fichero freeplane.jar alojado en carpeta lib para ejecutar Freeplane." ID="ID_1849276090" CREATED="1170319584827" MODIFIED="1170319584827"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_353522063" MODIFIED="1170319618577" POSITION="left" TEXT="Explorando los ficheros de su ordenador">
-<node CREATED="1170320065246" HGAP="25" ID="Freeplane_Link_1640650757" MODIFIED="1170661644279" TEXT="Para explorar los ficheros en su ordenador, seleccione el modo fichero en el menú desplegable Modos  File. [Alt+3]" VSHIFT="-13"/>
-<node CREATED="1170320065246" ID="Freeplane_Link_555797793" MODIFIED="1170661634201" TEXT="Navegará por su árbol de ficheros/directorios como si fuese un mapa mental. "/>
-<node CREATED="1170320065246" ID="Freeplane_Link_1148324994" MODIFIED="1170320065246" TEXT="Para hacer que una carpeta sea el nodo central, en el menú contextual de nodos (Botón izquierdo del ratón en el nodo) seleccione “Centrar”."/>
-<node CREATED="1170320065246" ID="Freeplane_Link_1098215924" MODIFIED="1170326984528" TEXT="Para ver, editar ó ejecutar fichero, siga el enlace de su nodo."/>
-<node CREATED="1170320065246" ID="Freeplane_Link_223431013" MODIFIED="1170662169175" TEXT="El modo fichero actualmente no es muy útil. Es una demostración de que no es mucho más difícil generar árboles de información desde otras fuentes que de mapas mentales. No hay evidencia de que actualmente la gente utilice este modo."/>
+<node TEXT="Explorando los ficheros de su ordenador" FOLDED="true" POSITION="left" ID="_Freeplane_Link_353522063" CREATED="1124560950701" MODIFIED="1170319618577" COLOR="#407000">
+<node TEXT="Para explorar los ficheros en su ordenador, seleccione el modo fichero en el menú desplegable Modos  File. [Alt+3]" ID="Freeplane_Link_1640650757" CREATED="1170320065246" MODIFIED="1170661644279" HGAP_QUANTITY="25.0 px" VSHIFT_QUANTITY="-13.0 px"/>
+<node TEXT="Navegará por su árbol de ficheros/directorios como si fuese un mapa mental. " ID="Freeplane_Link_555797793" CREATED="1170320065246" MODIFIED="1170661634201"/>
+<node TEXT="Para hacer que una carpeta sea el nodo central, en el menú contextual de nodos (Botón izquierdo del ratón en el nodo) seleccione “Centrar”." ID="Freeplane_Link_1148324994" CREATED="1170320065246" MODIFIED="1170320065246"/>
+<node TEXT="Para ver, editar ó ejecutar fichero, siga el enlace de su nodo." ID="Freeplane_Link_1098215924" CREATED="1170320065246" MODIFIED="1170326984528"/>
+<node TEXT="El modo fichero actualmente no es muy útil. Es una demostración de que no es mucho más difícil generar árboles de información desde otras fuentes que de mapas mentales. No hay evidencia de que actualmente la gente utilice este modo." ID="Freeplane_Link_223431013" CREATED="1170320065246" MODIFIED="1170662169175"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1530607683" MODIFIED="1170661606154" POSITION="left" TEXT="Explorando mapas mentales">
-<node CREATED="1170327125916" ID="Freeplane_Link_1803255787" MODIFIED="1170661616154" TEXT="Tanto para explorar como para editar mapas mentales, seleccione el modo navegación (Browse) en el menú desplegable ModosBrowse. [Alt+2]"/>
-<node CREATED="1170327125916" MODIFIED="1170327125916" TEXT="Las razones para separar el modo de exploración son técnicas. Navegar ó explorar es lo único que se puede hacer con el applet que se puede colocar en su sitio web. Normalmente, usted no usará el modo exploración en Freeplane."/>
+<node TEXT="Explorando mapas mentales" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1530607683" CREATED="1124560950701" MODIFIED="1170661606154" COLOR="#407000">
+<node TEXT="Tanto para explorar como para editar mapas mentales, seleccione el modo navegación (Browse) en el menú desplegable ModosBrowse. [Alt+2]" ID="Freeplane_Link_1803255787" CREATED="1170327125916" MODIFIED="1170661616154"/>
+<node TEXT="Las razones para separar el modo de exploración son técnicas. Navegar ó explorar es lo único que se puede hacer con el applet que se puede colocar en su sitio web. Normalmente, usted no usará el modo exploración en Freeplane." ID="ID_422041960" CREATED="1170327125916" MODIFIED="1170327125916"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1136088046" MODIFIED="1170327167056" POSITION="left" TEXT="Sobre los modos">
-<edge WIDTH="thin"/>
+<node TEXT="Sobre los modos" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1136088046" CREATED="1124560950701" MODIFIED="1170327167056" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170327180322" HGAP="30" ID="Freeplane_Link_1279853809" MODIFIED="1170661662794" TEXT="Aunque Freeplane es principalmente una herramienta para editar mapas mentales, está diseñado para ser capaz de visualizar información de diversas fuentes de datos. Para hacer una fuente de datos específica visible en Freeplane, un programador tiene que escribirla con un modo a tal fin. El modo fichero es un ejemplo. No sabemos si se han implementado otros modos. No es [...]
-<node CREATED="1170327180322" ID="Freeplane_Link_501151798" MODIFIED="1170661865274" TEXT="Hay código casi preparado para el modo “esquema” (Scheme) que deja editar programas de esquematización. De nuevo, la utilidad no está clara. A diferencia del modo de mapa mental, otros modos son más bien demostraciones de las posibilidades de la aplicación diferentes a las actuales."/>
+<edge WIDTH="thin"/>
+<node TEXT="Aunque Freeplane es principalmente una herramienta para editar mapas mentales, está diseñado para ser capaz de visualizar información de diversas fuentes de datos. Para hacer una fuente de datos específica visible en Freeplane, un programador tiene que escribirla con un modo a tal fin. El modo fichero es un ejemplo. No sabemos si se han implementado otros modos. No está claro si alguien realmente querría hacer uso de esta arquitectura; es un recu [...]
+<node TEXT="Hay código casi preparado para el modo “esquema” (Scheme) que deja editar programas de esquematización. De nuevo, la utilidad no está clara. A diferencia del modo de mapa mental, otros modos son más bien demostraciones de las posibilidades de la aplicación diferentes a las actuales." ID="Freeplane_Link_501151798" CREATED="1170327180322" MODIFIED="1170661865274"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1525986009" MODIFIED="1170327302117" POSITION="left" TEXT="Instalar el applet de Freeplane en su sitio web">
-<node CREATED="1170327314148" ID="Freeplane_Link_728262703" MODIFIED="1170662179237" TEXT="Usted puede instalar el applet en su sitio web para que otros usuarios puedan ver su mapas mentales."/>
-<node CREATED="1124560950701" ID="Freeplane_Link_1253169862" LINK="http://sourceforge.net/project/showfiles.php?group_id=211069" MODIFIED="1170327467943" TEXT="Descargue el applet, que se llama freeplane-browser." VSHIFT="-6"/>
-<node CREATED="1170327314148" ID="Freeplane_Link_748768856" MODIFIED="1170662189253" TEXT="El fichero descargado contiene los ficheros freeplanebrowser.jar y freeplanebrowser.html. Cree un enlace desde su página al freeplanebrowser.html. En el fichero freeplanebrowser.html cambie la ruta para que apunte a su mapa mental."/>
-<node CREATED="1170327314164" ID="Freeplane_Link_1041757100" MODIFIED="1170662204284" TEXT="El fichero de extensión .jar del applet debe estar alojado en el mismo servidor que el mapa, por razones de seguridad de Java. Tiene que subir por tanto, el fichero .jar del applet de Freeplane y su mapa mental a su sitio web."/>
+<node TEXT="Instalar el applet de Freeplane en su sitio web" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1525986009" CREATED="1124560950701" MODIFIED="1170327302117" COLOR="#407000">
+<node TEXT="Usted puede instalar el applet en su sitio web para que otros usuarios puedan ver su mapas mentales." ID="Freeplane_Link_728262703" CREATED="1170327314148" MODIFIED="1170662179237"/>
+<node TEXT="Descargue el applet, que se llama freeplane-browser." ID="Freeplane_Link_1253169862" CREATED="1124560950701" MODIFIED="1170327467943" LINK="http://sourceforge.net/project/showfiles.php?group_id=211069" VSHIFT_QUANTITY="-6.0 px"/>
+<node TEXT="El fichero descargado contiene los ficheros freeplanebrowser.jar y freeplanebrowser.html. Cree un enlace desde su página al freeplanebrowser.html. En el fichero freeplanebrowser.html cambie la ruta para que apunte a su mapa mental." ID="Freeplane_Link_748768856" CREATED="1170327314148" MODIFIED="1170662189253"/>
+<node TEXT="El fichero de extensión .jar del applet debe estar alojado en el mismo servidor que el mapa, por razones de seguridad de Java. Tiene que subir por tanto, el fichero .jar del applet de Freeplane y su mapa mental a su sitio web." ID="Freeplane_Link_1041757100" CREATED="1170327314164" MODIFIED="1170662204284"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1083756111" MODIFIED="1170327531427" POSITION="left" TEXT="Usando el applet de Freeplane">
+<node TEXT="Usando el applet de Freeplane" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1083756111" CREATED="1124560950701" MODIFIED="1170327531427" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170327537224" ID="Freeplane_Link_1893434848" MODIFIED="1170327537224" TEXT="En el applet de Freeplane, sólo puede usar el modo exploración/navegación; no podrá editar los mapas. Haga click en el nodo para desplegar/replegarlo, o para seguir un enlace. Arrastre el fondo para mover el mapa. Para buscar dentro del mapa, utilice el modo contextual de los nodos. (Botón izquierdo del ratón)."/>
+<node TEXT="En el applet de Freeplane, sólo puede usar el modo exploración/navegación; no podrá editar los mapas. Haga click en el nodo para desplegar/replegarlo, o para seguir un enlace. Arrastre el fondo para mover el mapa. Para buscar dentro del mapa, utilice el modo contextual de los nodos. (Botón izquierdo del ratón)." ID="Freeplane_Link_1893434848" CREATED="1170327537224" MODIFIED="1170327537224"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1976458022" MODIFIED="1170327564379" POSITION="left" TEXT="Cambios en la interfaz de usuario en la versión 0.6.5">
-<edge WIDTH="thin"/>
+<node TEXT="Cambios en la interfaz de usuario en la versión 0.6.5" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1976458022" CREATED="1124560950701" MODIFIED="1170327564379" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170327577817" ID="Freeplane_Link_361392781" MODIFIED="1170327577817" TEXT="Algunas configuraciones de teclado han tenido que ser redefinidas para darles un uso más intuititvo y considerado estándar. Algunas de las nuevas configuraciones de teclado son usadas en herramientas de Microsoft. La nueva configuración de teclas incluyen el “Enter” para editar nuevos nodos sobre el seleccionado, insertar nuevos nodos hijos, F2 para editar los nodos &#x [...]
-<node CREATED="1170327577817" MODIFIED="1170327577817" TEXT="La configuración del teclado puede cambiarse en el menú desplegable Herramientas  Preferencias (Preferences)."/>
-</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_784043927" MODIFIED="1170327604301" POSITION="left" TEXT="Créditos">
<edge WIDTH="thin"/>
+<node TEXT="Algunas configuraciones de teclado han tenido que ser redefinidas para darles un uso más intuititvo y considerado estándar. Algunas de las nuevas configuraciones de teclado son usadas en herramientas de Microsoft. La nueva configuración de teclas incluyen el “Enter” para editar nuevos nodos sobre el seleccionado, insertar nuevos nodos hijos, F2 para editar los nodos – Aquí la influencia de Microsoft es aparente aunque puede que no hay [...]
+<node TEXT="La configuración del teclado puede cambiarse en el menú desplegable Herramientas  Preferencias (Preferences)." ID="ID_1876397405" CREATED="1170327577817" MODIFIED="1170327577817"/>
+</node>
+<node TEXT="Créditos" FOLDED="true" POSITION="left" ID="_Freeplane_Link_784043927" CREATED="1124560950701" MODIFIED="1170327604301" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_415458128" MODIFIED="1170327624629" TEXT="Autores">
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1896457660" MODIFIED="1124560950701" TEXT="Joerg Mueller">
<edge WIDTH="thin"/>
+<node TEXT="Autores" FOLDED="true" ID="Freeplane_Link_415458128" CREATED="1124560950701" MODIFIED="1170327624629" COLOR="#006699">
+<node TEXT="Joerg Mueller" FOLDED="true" ID="_Freeplane_Link_1896457660" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#558000" CREATED="1124560950701" LINK="mailto:ponders at t-online.de" MODIFIED="1124560950701" TEXT="ponders at t-online.de">
+<edge WIDTH="thin"/>
+<node TEXT="ponders at t-online.de" ID="ID_1053467941" CREATED="1124560950701" MODIFIED="1124560950701" LINK="mailto:ponders at t-online.de" COLOR="#558000">
<font NAME="Dialog" SIZE="10"/>
</node>
-<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_268552515" MODIFIED="1170327672284" TEXT="Universidad de Freiburg, Alemania">
+<node TEXT="Universidad de Freiburg, Alemania" ID="Freeplane_Link_268552515" CREATED="1124560950701" MODIFIED="1170327672284" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_984984595" LINK="http://mujweb.cz/www/danielpolansky" MODIFIED="1124560950701" TEXT="Daniel Polansky">
-<edge WIDTH="thin"/>
+<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://mujweb.cz/www/danielpolansky" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_459203293" MODIFIED="1124560950701" TEXT="Petr Novak">
<edge WIDTH="thin"/>
-<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_875814410" MODIFIED="1124560950701" TEXT="Christian Foltin">
-<edge WIDTH="thin"/>
+<node TEXT="Petr Novak" ID="_Freeplane_Link_459203293" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_1415293905" MODIFIED="1124560950701" TEXT="Dimitri Polivaev">
+<node TEXT="Christian Foltin" ID="_Freeplane_Link_875814410" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
+</node>
+<node TEXT="Dimitri Polivaev" ID="_Freeplane_Link_1415293905" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_816166020" MODIFIED="1170327637519" TEXT="Pequeñas contribuciones">
-<edge WIDTH="thin"/>
+<node TEXT="Pequeñas contribuciones" FOLDED="true" ID="Freeplane_Link_816166020" CREATED="1124560950701" MODIFIED="1170327637519" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_189984007" MODIFIED="1124560950701" TEXT="Andrew Iggleden">
<edge WIDTH="thin"/>
+<node TEXT="Andrew Iggleden" FOLDED="true" ID="Freeplane_Link_189984007" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_117526613" MODIFIED="1170327651956" TEXT="Instalador de Windows">
<edge WIDTH="thin"/>
+<node TEXT="Instalador de Windows" ID="Freeplane_Link_117526613" CREATED="1124560950701" MODIFIED="1170327651956" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1096673251" MODIFIED="1124560950701" TEXT="Bob Alexander">
-<edge WIDTH="thin"/>
+<node TEXT="Bob Alexander" FOLDED="true" ID="Freeplane_Link_1096673251" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Eclipse howto">
<edge WIDTH="thin"/>
+<node TEXT="Eclipse howto" ID="ID_585592040" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1024053399" MODIFIED="1124560950701" TEXT="David Butt">
-<edge WIDTH="thin"/>
+<node TEXT="David Butt" FOLDED="true" ID="Freeplane_Link_1024053399" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Tutorial flash">
<edge WIDTH="thin"/>
+<node TEXT="Tutorial flash" ID="ID_133522658" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1534904708" MODIFIED="1124560950701" TEXT="David Low">
-<edge WIDTH="thin"/>
+<node TEXT="David Low" FOLDED="true" ID="Freeplane_Link_1534904708" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Helpful">
<edge WIDTH="thin"/>
+<node TEXT="Helpful" ID="ID_743506244" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_360501151" MODIFIED="1170327642550" TEXT="Traducciones">
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_807977431" MODIFIED="1124560950701" TEXT="Bob Alexander">
-<edge WIDTH="thin"/>
+<node TEXT="Traducciones" FOLDED="true" ID="Freeplane_Link_360501151" CREATED="1124560950701" MODIFIED="1170327642550" COLOR="#006699">
+<node TEXT="Bob Alexander" FOLDED="true" ID="Freeplane_Link_807977431" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Italian translation">
<edge WIDTH="thin"/>
+<node TEXT="Italian translation" ID="ID_1524052044" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1853214917" MODIFIED="1124560950701" TEXT="Knud Riishøjgård">
-<edge WIDTH="thin"/>
+<node TEXT="Knud Riishøjgård" FOLDED="true" ID="Freeplane_Link_1853214917" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Danish translation">
<edge WIDTH="thin"/>
+<node TEXT="Danish translation" ID="ID_1376899494" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1676529317" MODIFIED="1124560950701" TEXT="Takeshi Kakeda">
-<edge WIDTH="thin"/>
+<node TEXT="Takeshi Kakeda" FOLDED="true" ID="Freeplane_Link_1676529317" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Japanese translation">
<edge WIDTH="thin"/>
+<node TEXT="Japanese translation" ID="ID_1398373821" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562983644" FOLDED="true" ID="Freeplane_Link_1172193026" MODIFIED="1124562984816" TEXT="Kohichi Aoki">
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Japanese translation">
-<edge WIDTH="thin"/>
+<node TEXT="Kohichi Aoki" FOLDED="true" ID="Freeplane_Link_1172193026" CREATED="1124562983644" MODIFIED="1124562984816" COLOR="#996600">
+<node TEXT="Japanese translation" ID="ID_1500966066" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1928961904" MODIFIED="1124560950701" TEXT="Alex Dukal">
-<edge WIDTH="thin"/>
+<node TEXT="Alex Dukal" FOLDED="true" ID="Freeplane_Link_1928961904" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Spanish translation">
<edge WIDTH="thin"/>
+<node TEXT="Spanish translation" ID="ID_1410733080" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562998159" FOLDED="true" ID="Freeplane_Link_757563697" MODIFIED="1124563008034" TEXT="Hugo Gayosso">
-<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_1783275246" MODIFIED="1124560950701" TEXT="Spanish translation">
-<edge WIDTH="thin"/>
+<node TEXT="Hugo Gayosso" FOLDED="true" ID="Freeplane_Link_757563697" CREATED="1124562998159" MODIFIED="1124563008034" COLOR="#996600">
+<node TEXT="Spanish translation" ID="Freeplane_Link_1783275246" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_929540960" MODIFIED="1124560950701" TEXT="Sylvain Gamel">
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="French translation">
+<node TEXT="Sylvain Gamel" FOLDED="true" ID="Freeplane_Link_929540960" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
+<node TEXT="French translation" ID="ID_1545871352" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561242082" FOLDED="true" ID="Freeplane_Link_946171164" MODIFIED="1124561245019" TEXT="Koen Roggemans">
-<node COLOR="#999999" CREATED="1124561245957" ID="Freeplane_Link_1819881845" MODIFIED="1124561251675" TEXT="Dutch translation">
+<node TEXT="Koen Roggemans" FOLDED="true" ID="Freeplane_Link_946171164" CREATED="1124561242082" MODIFIED="1124561245019" COLOR="#996600">
+<node TEXT="Dutch translation" ID="Freeplane_Link_1819881845" CREATED="1124561245957" MODIFIED="1124561251675" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561374999" FOLDED="true" ID="Freeplane_Link_235962981" MODIFIED="1124561376718" TEXT="Rafal Kraik">
-<node COLOR="#999999" CREATED="1124561377702" ID="Freeplane_Link_459079511" MODIFIED="1124561382155" TEXT="Polish translation">
+<node TEXT="Rafal Kraik" FOLDED="true" ID="Freeplane_Link_235962981" CREATED="1124561374999" MODIFIED="1124561376718" COLOR="#996600">
+<node TEXT="Polish translation" ID="Freeplane_Link_459079511" CREATED="1124561377702" MODIFIED="1124561382155" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561969717" FOLDED="true" ID="Freeplane_Link_653284985" MODIFIED="1124561972920" TEXT="Goliath">
-<node COLOR="#999999" CREATED="1124561438294" ID="Freeplane_Link_1387213811" MODIFIED="1124561445950" TEXT="Korean translation">
+<node TEXT="Goliath" FOLDED="true" ID="Freeplane_Link_653284985" CREATED="1124561969717" MODIFIED="1124561972920" COLOR="#996600">
+<node TEXT="Korean translation" ID="Freeplane_Link_1387213811" CREATED="1124561438294" MODIFIED="1124561445950" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561753254" FOLDED="true" ID="Freeplane_Link_35211963" MODIFIED="1124563712385" TEXT="Miles a.k.a. filmsi">
-<node COLOR="#999999" CREATED="1124561491886" ID="Freeplane_Link_835144271" MODIFIED="1124561506386" TEXT="Slovenian translation">
+<node TEXT="Miles a.k.a. filmsi" FOLDED="true" ID="Freeplane_Link_35211963" CREATED="1124561753254" MODIFIED="1124563712385" COLOR="#996600">
+<node TEXT="Slovenian translation" ID="Freeplane_Link_835144271" CREATED="1124561491886" MODIFIED="1124561506386" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561814721" FOLDED="true" ID="Freeplane_Link_1008886206" MODIFIED="1124561818580" TEXT="William Chen">
-<node COLOR="#999999" CREATED="1124561497308" ID="Freeplane_Link_1960552629" MODIFIED="1124561506011" TEXT="Chinese translation">
+<node TEXT="William Chen" FOLDED="true" ID="Freeplane_Link_1008886206" CREATED="1124561814721" MODIFIED="1124561818580" COLOR="#996600">
+<node TEXT="Chinese translation" ID="Freeplane_Link_1960552629" CREATED="1124561497308" MODIFIED="1124561506011" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561823877" FOLDED="true" ID="Freeplane_Link_1650138043" MODIFIED="1124561876907" TEXT="Radek Švarc">
-<node COLOR="#999999" CREATED="1124561515761" ID="Freeplane_Link_768227373" MODIFIED="1124561519885" TEXT="Czech translation">
+<node TEXT="Radek Švarc" FOLDED="true" ID="Freeplane_Link_1650138043" CREATED="1124561823877" MODIFIED="1124561876907" COLOR="#996600">
+<node TEXT="Czech translation" ID="Freeplane_Link_768227373" CREATED="1124561515761" MODIFIED="1124561519885" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562250475" FOLDED="true" ID="Freeplane_Link_901975324" MODIFIED="1124562252007" TEXT="Balázs Márton">
-<node COLOR="#999999" CREATED="1124562252585" ID="Freeplane_Link_557911120" MODIFIED="1124562258428" TEXT="Hungarian translation">
+<node TEXT="Balázs Márton" FOLDED="true" ID="Freeplane_Link_901975324" CREATED="1124562250475" MODIFIED="1124562252007" COLOR="#996600">
+<node TEXT="Hungarian translation" ID="Freeplane_Link_557911120" CREATED="1124562252585" MODIFIED="1124562258428" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562948942" FOLDED="true" ID="Freeplane_Link_290351026" MODIFIED="1124562950270" TEXT="Luis Ferreira ">
-<node COLOR="#999999" CREATED="1124562956332" ID="Freeplane_Link_6081004" MODIFIED="1124562961879" TEXT="Portuguese translation">
+<node TEXT="Luis Ferreira " FOLDED="true" ID="Freeplane_Link_290351026" CREATED="1124562948942" MODIFIED="1124562950270" COLOR="#996600">
+<node TEXT="Portuguese translation" ID="Freeplane_Link_6081004" CREATED="1124562956332" MODIFIED="1124562961879" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124563066204" ID="Freeplane_Link_23652566" MODIFIED="1124563189197" TEXT="The credits for translations are probably incomplete. If we have forggoten you, let us know. All people who we know to contribute a least an incomplete translation are listed.">
+<node TEXT="The credits for translations are probably incomplete. If we have forggoten you, let us know. All people who we know to contribute a least an incomplete translation are listed." ID="Freeplane_Link_23652566" CREATED="1124563066204" MODIFIED="1124563189197" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
</node>
-<node COLOR="#0033ff" CREATED="1124560950701" ID="Freeplane_Link_1273736577" MODIFIED="1170327716253" POSITION="right" TEXT="Pulse Ctrl+F para buscar. Pulse Ctrl+G para buscar el siguiente. Para hacer un búsqueda global, pulse ESCAPE antes de la búsqueda."/>
-<node COLOR="#0033ff" CREATED="1124560950701" ID="Freeplane_Link_1043530021" MODIFIED="1170338370893" POSITION="right" TEXT="Pulse DERECHA para desplegar una caja de texto."/>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1596161299" MODIFIED="1170338378534" POSITION="right" TEXT="Introducción">
-<node CREATED="1170338389205" ID="Freeplane_Link_792489824" MODIFIED="1170661902868" TEXT="Freeplane hace posible la creación los llamados mapas mentales. Es más, la gente la utiliza como alternativa de un bloc de notas tabulado ó de un gestor personal de información." VSHIFT="-1"/>
-<node CREATED="1170338389205" MODIFIED="1170338389205" TEXT="La información se almacena en cajas de texto, llamados nodos. Los nodos se conectan entre sí usando líneas curvas llamadas bordes (ramas)."/>
-<node CREATED="1170338389205" MODIFIED="1170338389205" TEXT="Esta es una documentación para Freeplane 0.8.0, por lo que el mapeo de teclas rápidas ó las funciones de los menús pueden cambiar de una versión a otra."/>
+<node TEXT="Pulse Ctrl+F para buscar. Pulse Ctrl+G para buscar el siguiente. Para hacer un búsqueda global, pulse ESCAPE antes de la búsqueda." POSITION="right" ID="Freeplane_Link_1273736577" CREATED="1124560950701" MODIFIED="1170327716253" COLOR="#0033ff"/>
+<node TEXT="Pulse DERECHA para desplegar una caja de texto." POSITION="right" ID="Freeplane_Link_1043530021" CREATED="1124560950701" MODIFIED="1170338370893" COLOR="#0033ff"/>
+<node TEXT="Introducción" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1596161299" CREATED="1124560950701" MODIFIED="1170338378534" COLOR="#407000">
+<node TEXT="Freeplane hace posible la creación los llamados mapas mentales. Es más, la gente la utiliza como alternativa de un bloc de notas tabulado ó de un gestor personal de información." ID="Freeplane_Link_792489824" CREATED="1170338389205" MODIFIED="1170661902868" VSHIFT_QUANTITY="-1.0 px"/>
+<node TEXT="La información se almacena en cajas de texto, llamados nodos. Los nodos se conectan entre sí usando líneas curvas llamadas bordes (ramas)." ID="ID_1465373711" CREATED="1170338389205" MODIFIED="1170338389205"/>
+<node TEXT="Esta es una documentación para Freeplane 0.8.0, por lo que el mapeo de teclas rápidas ó las funciones de los menús pueden cambiar de una versión a otra." ID="ID_1313498008" CREATED="1170338389205" MODIFIED="1170338389205"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_706084071" MODIFIED="1170401730966" POSITION="right" TEXT="Demostración de algunas características">
+<node TEXT="Demostración de algunas características" FOLDED="true" POSITION="right" ID="_Freeplane_Link_706084071" CREATED="1124560950701" MODIFIED="1170401730966" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_735193624" MODIFIED="1170401751153" TEXT="Apariencia">
+<node TEXT="Apariencia" FOLDED="true" ID="_Freeplane_Link_735193624" CREATED="1124560950701" MODIFIED="1170401751153" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_801391449" MODIFIED="1170401759200" TEXT="Los nodos pueden tener diferentes colores">
+<node TEXT="Los nodos pueden tener diferentes colores" FOLDED="true" ID="Freeplane_Link_801391449" CREATED="1124560950701" MODIFIED="1170401759200">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#ff0000" CREATED="1124560950701" ID="Freeplane_Link_1935642015" MODIFIED="1170401763778" TEXT="Rojo">
+<node TEXT="Rojo" ID="Freeplane_Link_1935642015" CREATED="1124560950701" MODIFIED="1170401763778" COLOR="#ff0000">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#009900" CREATED="1124560950701" ID="Freeplane_Link_358662946" MODIFIED="1170401767216" TEXT="Verde">
+<node TEXT="Verde" ID="Freeplane_Link_358662946" CREATED="1124560950701" MODIFIED="1170401767216" COLOR="#009900">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#0000cc" CREATED="1124560950701" ID="Freeplane_Link_569149865" MODIFIED="1170401772466" TEXT="Azul">
+<node TEXT="Azul" ID="Freeplane_Link_569149865" CREATED="1124560950701" MODIFIED="1170401772466" COLOR="#0000cc">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_" MODIFIED="1170401783950" TEXT="Los nodos pueden tener varios colores de fondo">
-<node BACKGROUND_COLOR="#ff66cc" CREATED="1124560950701" ID="_Freeplane_Link_1358611533" MODIFIED="1170401812419" TEXT="Éste"/>
-<node BACKGROUND_COLOR="#66ff66" CREATED="1124560950701" ID="_Freeplane_Link_1317973766" MODIFIED="1170401826248" TEXT="ó éste"/>
+<node TEXT="Los nodos pueden tener varios colores de fondo" FOLDED="true" ID="_" CREATED="1124560950701" MODIFIED="1170401783950">
+<node TEXT="Éste" ID="_Freeplane_Link_1358611533" CREATED="1124560950701" MODIFIED="1170401812419" BACKGROUND_COLOR="#ff66cc"/>
+<node TEXT="ó éste" ID="_Freeplane_Link_1317973766" CREATED="1124560950701" MODIFIED="1170401826248" BACKGROUND_COLOR="#66ff66"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_542663260" MODIFIED="1170401836498" TEXT="Los nodos pueden tener diferentes estilos de fuentes">
+<node TEXT="Los nodos pueden tener diferentes estilos de fuentes" FOLDED="true" ID="Freeplane_Link_542663260" CREATED="1124560950701" MODIFIED="1170401836498">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_807716236" MODIFIED="1170401842685" TEXT="Negrita">
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Negrita" ID="Freeplane_Link_807716236" CREATED="1124560950701" MODIFIED="1170401842685">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_1517956725" MODIFIED="1170401848310" TEXT="Cursiva">
-<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Cursiva" ID="Freeplane_Link_1517956725" CREATED="1124560950701" MODIFIED="1170401848310">
+<font NAME="Dialog" SIZE="12" ITALIC="true"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_1716797514" MODIFIED="1170401855592" TEXT="Negrita y cursiva">
-<font BOLD="true" ITALIC="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Negrita y cursiva" ID="Freeplane_Link_1716797514" CREATED="1124560950701" MODIFIED="1170401855592">
+<font NAME="Dialog" SIZE="12" BOLD="true" ITALIC="true"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1651709962" MODIFIED="1170401864248" TEXT="Los tamaños de fuente puedes ser diferentes">
+<node TEXT="Los tamaños de fuente puedes ser diferentes" FOLDED="true" ID="Freeplane_Link_1651709962" CREATED="1124560950701" MODIFIED="1170401864248">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_94543529" MODIFIED="1170401870482" TEXT="Pequeño">
+<node TEXT="Pequeño" ID="Freeplane_Link_94543529" CREATED="1124560950701" MODIFIED="1170401870482">
<font NAME="SansSerif" SIZE="11"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_1637486722" MODIFIED="1170401875560" TEXT="Normal">
+<node TEXT="Normal" ID="Freeplane_Link_1637486722" CREATED="1124560950701" MODIFIED="1170401875560">
<font NAME="SansSerif" SIZE="13"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_660570324" MODIFIED="1170401882482" TEXT="Grande">
+<node TEXT="Grande" ID="Freeplane_Link_660570324" CREATED="1124560950701" MODIFIED="1170401882482">
<font NAME="SansSerif" SIZE="15"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_232732639" MODIFIED="1170401889154" TEXT="Gigante">
+<node TEXT="Gigante" FOLDED="true" ID="Freeplane_Link_232732639" CREATED="1124560950701" MODIFIED="1170401889154">
<font NAME="SansSerif" SIZE="20"/>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="OOh">
+<node TEXT="OOh" ID="ID_61348334" CREATED="1124560950701" MODIFIED="1124560950701">
<font NAME="SansSerif" SIZE="123"/>
</node>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_277624866" MODIFIED="1170401897076" TEXT="Se pueden utilizar diferente fuentes de letra">
+<node TEXT="Se pueden utilizar diferente fuentes de letra" FOLDED="true" ID="Freeplane_Link_277624866" CREATED="1124560950701" MODIFIED="1170401897076">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_1872197155" MODIFIED="1170401905951" TEXT="Ésta">
+<node TEXT="Ésta" ID="Freeplane_Link_1872197155" CREATED="1124560950701" MODIFIED="1170401905951">
<font NAME="Times New Roman" SIZE="16"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1568731425" MODIFIED="1170401911608" TEXT="Ésta otra">
+<node TEXT="Ésta otra" ID="_Freeplane_Link_1568731425" CREATED="1124560950701" MODIFIED="1170401911608">
<font NAME="Verdana" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_704399864" MODIFIED="1170401921873" TEXT="Ó ésta otra">
+<node TEXT="Ó ésta otra" ID="Freeplane_Link_704399864" CREATED="1124560950701" MODIFIED="1170401921873">
<font NAME="Dialog" SIZE="21"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1193071041" MODIFIED="1170401933139" TEXT="Se puede utilizar diferentes tipos de nodos">
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1979277285" MODIFIED="1170402078187" TEXT="Con bifurcaciones">
-<node CREATED="1124560950701" ID="_Freeplane_Link_89124429" MODIFIED="1170402083218" TEXT="Con bifurcaciones"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_173850525" MODIFIED="1170402086124" TEXT="Con bifurcaciones"/>
+<node TEXT="Se puede utilizar diferentes tipos de nodos" FOLDED="true" ID="_Freeplane_Link_1193071041" CREATED="1124560950701" MODIFIED="1170401933139">
+<node TEXT="Con bifurcaciones" FOLDED="true" ID="_Freeplane_Link_1979277285" CREATED="1124560950701" MODIFIED="1170402078187">
+<node TEXT="Con bifurcaciones" ID="_Freeplane_Link_89124429" CREATED="1124560950701" MODIFIED="1170402083218"/>
+<node TEXT="Con bifurcaciones" ID="_Freeplane_Link_173850525" CREATED="1124560950701" MODIFIED="1170402086124"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1001811541" MODIFIED="1170402091952" STYLE="bubble" TEXT="Con burbujas">
-<node CREATED="1124560950701" ID="_Freeplane_Link_1677737286" MODIFIED="1170402095281" STYLE="bubble" TEXT="Con burbujas"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_978246353" MODIFIED="1170402098093" STYLE="bubble" TEXT="Con burbujas"/>
+<node TEXT="Con burbujas" FOLDED="true" ID="_Freeplane_Link_1001811541" CREATED="1124560950701" MODIFIED="1170402091952" STYLE="bubble">
+<node TEXT="Con burbujas" ID="_Freeplane_Link_1677737286" CREATED="1124560950701" MODIFIED="1170402095281" STYLE="bubble"/>
+<node TEXT="Con burbujas" ID="_Freeplane_Link_978246353" CREATED="1124560950701" MODIFIED="1170402098093" STYLE="bubble"/>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1271086229" MODIFIED="1170402128468" TEXT="Los nodos se pueden desplegar">
+<node TEXT="Los nodos se pueden desplegar" FOLDED="true" ID="Freeplane_Link_1271086229" CREATED="1124560950701" MODIFIED="1170402128468" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_307016912" MODIFIED="1170402134671" TEXT="Doblez">
+<node TEXT="Doblez" FOLDED="true" ID="_Freeplane_Link_307016912" CREATED="1124560950701" MODIFIED="1170402134671">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_339068638" MODIFIED="1170402138140" TEXT="Oculta">
+<node TEXT="Oculta" ID="Freeplane_Link_339068638" CREATED="1124560950701" MODIFIED="1170402138140">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1488567837" MODIFIED="1170402144875" TEXT="Árbol">
+<node TEXT="Árbol" FOLDED="true" ID="_Freeplane_Link_1488567837" CREATED="1124560950701" MODIFIED="1170402144875">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_1450639329" MODIFIED="1170402149750" TEXT="Roble">
+<node TEXT="Roble" ID="Freeplane_Link_1450639329" CREATED="1124560950701" MODIFIED="1170402149750">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_1463816938" MODIFIED="1170402159531" TEXT="Haya">
+<node TEXT="Haya" ID="Freeplane_Link_1463816938" CREATED="1124560950701" MODIFIED="1170402159531">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_1006242670" MODIFIED="1170402153547" TEXT="Olmo">
+<node TEXT="Olmo" ID="Freeplane_Link_1006242670" CREATED="1124560950701" MODIFIED="1170402153547">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_271846593" MODIFIED="1170402170062" TEXT="Los pueden contener enlaces a…">
+<node TEXT="Los pueden contener enlaces a…" FOLDED="true" ID="Freeplane_Link_271846593" CREATED="1124560950701" MODIFIED="1170402170062" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1178924051" MODIFIED="1170402176937" TEXT="Páginas web">
+<node TEXT="Páginas web" FOLDED="true" ID="Freeplane_Link_1178924051" CREATED="1124560950701" MODIFIED="1170402176937" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" LINK="http://www.google.com/" MODIFIED="1124560950701" TEXT="http://www.google.com/">
+<node TEXT="http://www.google.com/" ID="ID_506767272" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://www.google.com/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1626963395" LINK="www.google.com" MODIFIED="1124560950701" TEXT="www.google.com">
+<node TEXT="www.google.com" FOLDED="true" ID="Freeplane_Link_1626963395" CREATED="1124560950701" MODIFIED="1124560950701" LINK="www.google.com">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_1646455138" MODIFIED="1170402230875" TEXT="Freeplane thinks this is executable :)">
+<node TEXT="Freeplane thinks this is executable :)" ID="Freeplane_Link_1646455138" CREATED="1124560950701" MODIFIED="1170402230875" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1571818298" MODIFIED="1170402185078" TEXT="Carpetas locales">
+<node TEXT="Carpetas locales" FOLDED="true" ID="Freeplane_Link_1571818298" CREATED="1124560950701" MODIFIED="1170402185078" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_134747683" LINK="file:/C:/Program%20Files/" MODIFIED="1170402246313" TEXT="C:/Program files/">
+<node TEXT="C:/Program files/" ID="Freeplane_Link_134747683" CREATED="1124560950701" MODIFIED="1170402246313" LINK="file:/C:/Program%20Files/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" LINK="/home/" MODIFIED="1124560950701" TEXT="/home/">
+<node TEXT="/home/" ID="ID_243521134" CREATED="1124560950701" MODIFIED="1124560950701" LINK="/home/">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_179286322" MODIFIED="1170402191875" TEXT="Ejecutables">
+<node TEXT="Ejecutables" FOLDED="true" ID="Freeplane_Link_179286322" CREATED="1124560950701" MODIFIED="1170402191875" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_801065485" LINK="file:/C:/WINNT/regedit.exe" MODIFIED="1124560950701" TEXT="C:\WINNT\regedit.exe">
+<node TEXT="C:\WINNT\regedit.exe" FOLDED="true" ID="Freeplane_Link_801065485" CREATED="1124560950701" MODIFIED="1124560950701" LINK="file:/C:/WINNT/regedit.exe">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006600" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="You see that the node is executable by icon.">
+<node TEXT="You see that the node is executable by icon." ID="ID_1367578508" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#006600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_597537942" MODIFIED="1170402198969" TEXT="Cualquier otro documento en su ordenador o en la red de su empresa.">
+<node TEXT="Cualquier otro documento en su ordenador o en la red de su empresa." ID="Freeplane_Link_597537942" CREATED="1124560950717" MODIFIED="1170402198969">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_839677176" MODIFIED="1170402256219" TEXT="Nodos multilínea">
+<node TEXT="Nodos multilínea" FOLDED="true" ID="_Freeplane_Link_839677176" CREATED="1124560950717" MODIFIED="1170402256219" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1423568963" MODIFIED="1170402268204" TEXT="Los nodos multilínea se puede ver como un párrafo o varios párrafos. Si va a construir una base de conocimiento usando Freeplane, es la mejor manera de hacerlo usando este tipo de nodos. En vez de tener un fichero de texto plano para almacenar sus notas, puede tener un nodo raíz con múltiples nodos como hijos."/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1686184172" MODIFIED="1170402277094" TEXT="“La Ciencia son hechos; al igual que las casa se hacen de piedra, la Ciencia está hecha de hechos; pero un montón de piedras no es una casa y una colección de hechos no tiene por que ser necesariamente ciencia” -- Henri Poincaré."/>
+<node TEXT="Los nodos multilínea se puede ver como un párrafo o varios párrafos. Si va a construir una base de conocimiento usando Freeplane, es la mejor manera de hacerlo usando este tipo de nodos. En vez de tener un fichero de texto plano para almacenar sus notas, puede tener un nodo raíz con múltiples nodos como hijos." ID="_Freeplane_Link_1423568963" CREATED="1124560950717" MODIFIED="1170402268204"/>
+<node TEXT="“La Ciencia son hechos; al igual que las casa se hacen de piedra, la Ciencia está hecha de hechos; pero un montón de piedras no es una casa y una colección de hechos no tiene por que ser necesariamente ciencia” -- Henri Poincaré." ID="_Freeplane_Link_1686184172" CREATED="1124560950717" MODIFIED="1170402277094"/>
</node>
-<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1045645831" MODIFIED="1170402296782" TEXT="Nodos multilínea cortos con nuevas líneas (newlines).">
-<node CREATED="1124560950717" ID="_Freeplane_Link_1957797574" MODIFIED="1170402322173" TEXT="Línea,
y una segunda

Y todavía se puede hacer otra,
así que... Qué le parece ésto?"/>
+<node TEXT="Nodos multilínea cortos con nuevas líneas (newlines)." FOLDED="true" ID="Freeplane_Link_1045645831" CREATED="1124560950717" MODIFIED="1170402296782" COLOR="#669900">
+<node TEXT="Línea,
y una segunda

Y todavía se puede hacer otra,
así que... Qué le parece ésto?" ID="_Freeplane_Link_1957797574" CREATED="1124560950717" MODIFIED="1170402322173"/>
</node>
-<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_871345962" MODIFIED="1170402339813" TEXT="Puede emular ramas etiquetadas">
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1576627386" MODIFIED="1170402348642" TEXT="Árbol">
+<node TEXT="Puede emular ramas etiquetadas" FOLDED="true" ID="Freeplane_Link_871345962" CREATED="1124560950717" MODIFIED="1170402339813" COLOR="#669900">
+<node TEXT="Árbol" FOLDED="true" ID="Freeplane_Link_1576627386" CREATED="1124560950717" MODIFIED="1170402348642">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_707227593" MODIFIED="1170402363954" TEXT="es un">
+<node TEXT="es un" FOLDED="true" ID="Freeplane_Link_707227593" CREATED="1124560950717" MODIFIED="1170402363954" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1405291988" MODIFIED="1170402377767" TEXT="Roble">
+<node TEXT="Roble" ID="Freeplane_Link_1405291988" CREATED="1124560950717" MODIFIED="1170402377767">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_867032809" MODIFIED="1170402368939" TEXT="es un">
+<node TEXT="es un" FOLDED="true" ID="Freeplane_Link_867032809" CREATED="1124560950717" MODIFIED="1170402368939" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_779687380" MODIFIED="1170402382657" TEXT="Haya">
+<node TEXT="Haya" ID="Freeplane_Link_779687380" CREATED="1124560950717" MODIFIED="1170402382657">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_802687707" MODIFIED="1170402372720" TEXT="es un">
+<node TEXT="es un" FOLDED="true" ID="Freeplane_Link_802687707" CREATED="1124560950717" MODIFIED="1170402372720" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_544688485" MODIFIED="1170402386376" TEXT="Olmo">
+<node TEXT="Olmo" ID="Freeplane_Link_544688485" CREATED="1124560950717" MODIFIED="1170402386376">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1421027901" MODIFIED="1170402355314" TEXT="Árbol">
+<node TEXT="Árbol" FOLDED="true" ID="Freeplane_Link_1421027901" CREATED="1124560950717" MODIFIED="1170402355314">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_921860045" MODIFIED="1124560950717" TEXT="<>">
+<node TEXT="<>" FOLDED="true" ID="Freeplane_Link_921860045" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1635761458" MODIFIED="1170402395236" TEXT="Hoja">
+<node TEXT="Hoja" ID="Freeplane_Link_1635761458" CREATED="1124560950717" MODIFIED="1170402395236">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1017438621" MODIFIED="1124560950717" TEXT="<>">
+<node TEXT="<>" FOLDED="true" ID="Freeplane_Link_1017438621" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1545141692" MODIFIED="1170402400142" TEXT="Tronco">
+<node TEXT="Tronco" ID="Freeplane_Link_1545141692" CREATED="1124560950717" MODIFIED="1170402400142">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" ID="Freeplane_Link_686526928" MODIFIED="1170402409689" TEXT="Se pueden poner iconos en los nodos">
+<node TEXT="Se pueden poner iconos en los nodos" ID="Freeplane_Link_686526928" CREATED="1124560950717" MODIFIED="1170402409689" COLOR="#669900">
<icon BUILTIN="knotify"/>
<icon BUILTIN="flag"/>
<icon BUILTIN="button_cancel"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="back"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_318937820" MODIFIED="1170402416736" TEXT="Puede tener nubes">
-<cloud/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1908793564" MODIFIED="1170402436205" TEXT="Con colores personalizados">
-<cloud COLOR="#3333ff"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1750585847" MODIFIED="1170402448392" TEXT="Puede tener enlaces enlaces gráficos">
-<node CREATED="1124560950717" ID="_Freeplane_Link_1212380407" MODIFIED="1170402453642" TEXT="Conectando nodos">
-<arrowlink DESTINATION="_Freeplane_Link_1249400461" ENDARROW="Default" ENDINCLINATION="41;0;" STARTARROW="None" STARTINCLINATION="41;0;"/>
-</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1249400461" MODIFIED="1170402460470" TEXT="Con otros">
-<arrowlink COLOR="#6600ff" DESTINATION="_Freeplane_Link_880551392" ENDARROW="Default" ENDINCLINATION="47;0;" ID="Freeplane_Arrow_Link_85185909" STARTARROW="None" STARTINCLINATION="47;0;"/>
-</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_880551392" MODIFIED="1170402465439" TEXT="Con diferentes colores">
-<arrowlink DESTINATION="_Freeplane_Link_1789233193" ENDARROW="Default" ENDINCLINATION="82;44;" ID="Freeplane_Arrow_Link_1672464612" STARTARROW="None" STARTINCLINATION="82;44;"/>
-</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1789233193" MODIFIED="1170402473017" TEXT="Y diferentes encaminamientos"/>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_127668276" MODIFIED="1170402480955" TEXT="El nodo se puede mover y colocar libremente">
-<node CREATED="1124560950717" ID="_Freeplane_Link_894936766" MODIFIED="1170402486221" TEXT="Uno"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1942481455" MODIFIED="1170402490908" TEXT="Otro"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1709752669" MODIFIED="1170402508049" POSITION="right" TEXT="Crear y borrar nodos">
-<node CREATED="1170402517861" ID="Freeplane_Link_151246132" MODIFIED="1170402517861" TEXT="Para crear un nodo, pulse INSERT"/>
-<node CREATED="1170402517861" MODIFIED="1170402517861" TEXT="Para crear un nodo hijo mientra edita otro nodo, pulse INSERT mientras edita"/>
-<node CREATED="1170402517877" MODIFIED="1170402517877" TEXT="Para crear un nodo hermano anterior, pulse ENTER"/>
-<node CREATED="1170402517877" MODIFIED="1170402517877" TEXT="Para crear un nodo hermano después, pulse SHIFT (MAYÚSCULAS)+ENTER"/>
-<node CREATED="1170402517877" MODIFIED="1170402517877" TEXT="Para borrar un nodo, pulse DELETE ó SUPR"/>
-<node CREATED="1170402517877" MODIFIED="1170402517877" TEXT="Para borrar un nodo y poder pegarlo después, pulse CTRL+X."/>
-<node CREATED="1170402517877" MODIFIED="1170402517877" TEXT="Como alternativa, puede usar el menú contextual, haciendo click izquierdo con el ratón en un nodo."/>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1700974092" MODIFIED="1170402540752" POSITION="right" TEXT="Editar un nodo de texto">
-<node CREATED="1170402567565" ID="Freeplane_Link_611372497" MODIFIED="1170402567565" TEXT="Para editar un nodo, pulse F2, HOME (INICIO) ó END (FIN), ó en el menú contextual usando Edit. Para terminar la edición de un nodo, pulse ENTER."/>
-<node CREATED="1170402567565" MODIFIED="1170402567565" TEXT="Para reemplazar un nodo de texto con otro nuevo, comience a escribir directamente."/>
-<node CREATED="1170402567565" MODIFIED="1170402567565" TEXT="Para forzar el cambio de edición de un nodo largo desde uno corto, pulse ALT+ENTER."/>
-<node CREATED="1170402567565" MODIFIED="1170402567565" TEXT="Para dividir un nodo largo, use el botón SEPARAR (Split) en la parte superior del editor de nodos, o pulse ALT+S en el editor de nodos largos."/>
-<node CREATED="1170402567565" MODIFIED="1170402567565" TEXT="Para introducir una nueva línea en el editor de nodos largos, pulse CTRL+ENTER. No puede insertar una nueva línea en el editor corto o básico de nodos."/>
-<node CREATED="1170402567565" MODIFIED="1170402567565" TEXT="Para copiar una selección al portapapeles, haga click con el botón derecho del ratón y seleccione COPIAR."/>
-<node CREATED="1170402567565" MODIFIED="1170402567565" TEXT="Por defecto, al pulsar ENTER se termina la edición de un nodo largo, y con CTRL+ENTER se inserta una nueva línea. Deseleccionando la opción “Confirmar ENTER” puede invertir la función de la citada combinación de teclas, p.e. ENTER inserta una nueva línea y CTRL+ENTER finaliza la edición. Puede establecer por defecto este valor en el menú preferencias, y se almacenará cu [...]
-<node CREATED="1170402567565" MODIFIED="1170402567565" TEXT="Freeplane soporta Unicode. Además, puede usar el script que usted elija."/>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1660149394" MODIFIED="1170402594612" POSITION="right" TEXT="Dar formato a un nodo">
-<node CREATED="1170402604643" ID="Freeplane_Link_183644252" MODIFIED="1170402604643" TEXT="Para poner en negrita un nodo, pulse CTRL+B."/>
-<node CREATED="1170402604643" MODIFIED="1170402604643" TEXT="Para poner en cursiva un nodo, pulse CTRL+I."/>
-<node CREATED="1170402604643" MODIFIED="1170402604643" TEXT="Para cambiar el color del texto del nodo, pulse ALT+C."/>
-<node CREATED="1170402604643" MODIFIED="1170402604643" TEXT="Para cambiar el color del fondo de un nodo, en el menú contextual utilice Formato --> Color de fondo del nodo."/>
-<node CREATED="1170402604643" MODIFIED="1170402604643" TEXT="Para aumentar el tamaño del texto del nodo, pulse CTRL++ (Tecla +, NO del teclado numérico, sino del de texto)."/>
-<node CREATED="1170402604659" MODIFIED="1170402604659" TEXT="Para disminuir el tamaño del texto del nodo, pulse CTRL+- (Tecla -, NO del teclado numérico, sino del de texto)."/>
-<node CREATED="1170402604659" MODIFIED="1170402604659" TEXT="Para cambiar el tipo de fuente de texto, use el campo a tal fin en la barra principal."/>
-<node CREATED="1170402604659" MODIFIED="1170402604659" TEXT="Para copiar formatos a un nodo, pulse ALT+V."/>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_526328879" MODIFIED="1170402629050" POSITION="right" TEXT="Usar estilos físicos">
-<node CREATED="1170402640284" ID="Freeplane_Link_1076084298" MODIFIED="1170402640284" TEXT="Para aplicar un estudio físico, en el menú contextual use “Estilo físico” y seleccione el estilo deseado. Para aplicar estilos más rápidamente, utilice las teclas rápidas que se muestran en el citado menú contextual."/>
-<node CREATED="1170402640284" MODIFIED="1170402640284" TEXT="Para añadir su propio estilo físico, en el supuesto de que usted sea un usuario con perfil técnico, puede hacerlo editando el fichero “patterns.xml” ubicado en la carpeta “freeplane” de su equipo."/>
-<node CREATED="1170402640284" MODIFIED="1170402640284" TEXT="Una observación sobre el fichero de estilos. Los estilos físicos se aplican al nodo, si existe la etiqueta de de nodo (<node>). Se aplicará al borde, si tiene la etiqueta borde (<edge>). La etiqueta nodo (<node>) puede tener una etiqueta fuente (<font>) como un hijo. Estudie atentamente el fichero “patterns.xml” facilitado por Freeplane."/>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1697687428" MODIFIED="1170402655706" POSITION="right" TEXT="Resaltar los nodos mediante nubes">
-<node CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Clouds are well suited for highlighting a region. Highlighted are the node and all its descendants."/>
-<node CREATED="1170402669175" MODIFIED="1170402669175" TEXT="Las nubes se pueden utilizar para resaltar una región. Lo que se resalta es el nodo y sus descendientes."/>
-<node CREATED="1170402669191" ID="Freeplane_Link_307492688" MODIFIED="1170402669191" TEXT="Para añadir una nube, pulse CTRL+SHIFT (MAYÚSCULAS)+B ó en el menú contextual del nodo, utilice Insertar-->Nube."/>
-<node CREATED="1170402669191" ID="Freeplane_Link_1144511960" MODIFIED="1170402669191" TEXT="Para cambiar el color de la nube, en menú contextual de nodo seleccione Formato-->Color de Nube."/>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1884870247" MODIFIED="1170402707785" TEXT="Las nubes pueden tener varios colores de fondo como verde...">
-<cloud COLOR="#e1f2e1"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_335862648" MODIFIED="1170402714863" TEXT="... ó marrón">
-<cloud COLOR="#ede5d5"/>
-</node>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_203858515" MODIFIED="1170402734160" POSITION="right" TEXT="Añadir enlaces ó hipervínculos">
-<node CREATED="1170402743613" ID="Freeplane_Link_1312466416" MODIFIED="1170402743613" TEXT="Para añadir un enlace ó hipervínculo a un nodo, presione CTRL+K ó en el menú contextual utilice Insertar-->Enlace."/>
-<node CREATED="1170402743613" MODIFIED="1170402743613" TEXT="Para borrar un enlace, Deje el enlace en blanco después de pulsar CTRL+K."/>
-<node CREATED="1170402743613" LINK="mailto:“mailto:dircorreo at correo.com”" MODIFIED="1170402743613" TEXT="Para enlazar con una cuenta de correo electrónico, establezca el enlace como en este ejemplo: “mailto:dircorreo at correo.com”"/>
-<node CREATED="1170402743613" LINK="mailto:“mailto:dircorreo at correo.com?subject=Asunto”" MODIFIED="1170402743613" TEXT="Para enlazar con una dirección de correo electrónico e incluir a su vez un asunto, escriba lo siguiente en el enlace: “mailto:dircorreo at correo.com?subject=Asunto”"/>
-<node CREATED="1170402743613" MODIFIED="1170402743613" TEXT="Se puede enlazar a páginas web, ficheros locales ó direcciones de correo electrónico."/>
-<node CREATED="1170402743707" FOLDED="true" ID="Freeplane_Link_1974937042" MODIFIED="1170402743707" TEXT="Links">
-<font BOLD="true" NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170402743707" LINK="mailto:dircorreo at correo.com" MODIFIED="1170402743707" TEXT="mailto:dircorreo at correo.com"/>
-<node CREATED="1170402743707" LINK="mailto:dircorreo at correo.com?subject=Asunto" MODIFIED="1170402743707" TEXT="mailto:dircorreo at correo.com?subject=Asunto"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1044397139" MODIFIED="1170402783082" POSITION="right" TEXT="Añadir iconos">
-<edge WIDTH="thin"/>
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170402797691" ID="Freeplane_Link_1687645098" MODIFIED="1170402797691" TEXT="Un nodo puede tener varios iconos."/>
-<node CREATED="1170402797691" MODIFIED="1170402797691" TEXT="Para añadir iconos a un nodo, seleccione un nodo y haga click en los iconos de la barra de menú vertical de la izquierda de su pantalla. Mientras mueve el ratón hacia la citada barra de iconos, mantenga pulsado el botón ALT ó CTRL de modo que no pierda el foco ó selección del nodo."/>
-<node CREATED="1170402797691" MODIFIED="1170402797691" TEXT="Para borrar un icono, pulse la cruz roja en la parte de arriba de la barra de iconos."/>
-<node CREATED="1170402797691" MODIFIED="1170402797691" TEXT="Para borrar todos los iconos, pulse el icono de la papelera en la parte de arriba de la barra de iconos."/>
-<node CREATED="1170402797691" MODIFIED="1170402797691" TEXT="Para añadir un icono a un nodo sin utilizar la barra de menú, presione ALT+I."/>
-<node CREATED="1170402797691" MODIFIED="1170402797691" TEXT="No existe opción para utilizar sus propios iconos, por lo que deberá elegir los que le ofrece Freeplane únicamente."/>
-<node CREATED="1170402797691" ID="Freeplane_Link_1437377566" MODIFIED="1170402797691" TEXT="Para mostrar u ocultar la barra de iconos, utilice el menú de la barra superior. Ver-->Des(activar) Barra de herramientas de la izquierda. La barra de herramientas de la izquierda es la forma de llamar a la barra de iconos en la aplicación."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1609274" MODIFIED="1170402870301" TEXT="Los iconos adjuntados a este nodo son todos los que existen, no hay más.">
+<node TEXT="Puede tener nubes" FOLDED="true" ID="_Freeplane_Link_318937820" CREATED="1124560950717" MODIFIED="1170402416736" COLOR="#407000">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="Con colores personalizados" ID="Freeplane_Link_1908793564" CREATED="1124560950717" MODIFIED="1170402436205">
+<cloud COLOR="#3333ff" SHAPE="ARC"/>
+</node>
+</node>
+<node TEXT="Puede tener enlaces enlaces gráficos" FOLDED="true" ID="_Freeplane_Link_1750585847" CREATED="1124560950717" MODIFIED="1170402448392" COLOR="#407000">
+<node TEXT="Conectando nodos" ID="_Freeplane_Link_1212380407" CREATED="1124560950717" MODIFIED="1170402453642">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Con otros" ID="_Freeplane_Link_1249400461" CREATED="1124560950717" MODIFIED="1170402460470">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#6600ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Con diferentes colores" ID="_Freeplane_Link_880551392" CREATED="1124560950717" MODIFIED="1170402465439">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="Y diferentes encaminamientos" ID="_Freeplane_Link_1789233193" CREATED="1124560950717" MODIFIED="1170402473017"/>
+</node>
+<node TEXT="El nodo se puede mover y colocar libremente" FOLDED="true" ID="_Freeplane_Link_127668276" CREATED="1124560950717" MODIFIED="1170402480955" COLOR="#407000">
+<node TEXT="Uno" ID="_Freeplane_Link_894936766" CREATED="1124560950717" MODIFIED="1170402486221"/>
+<node TEXT="Otro" ID="_Freeplane_Link_1942481455" CREATED="1124560950717" MODIFIED="1170402490908"/>
+</node>
+</node>
+<node TEXT="Crear y borrar nodos" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1709752669" CREATED="1124560950717" MODIFIED="1170402508049" COLOR="#407000">
+<node TEXT="Para crear un nodo, pulse INSERT" ID="Freeplane_Link_151246132" CREATED="1170402517861" MODIFIED="1170402517861"/>
+<node TEXT="Para crear un nodo hijo mientra edita otro nodo, pulse INSERT mientras edita" ID="ID_1850215735" CREATED="1170402517861" MODIFIED="1170402517861"/>
+<node TEXT="Para crear un nodo hermano anterior, pulse ENTER" ID="ID_1728997864" CREATED="1170402517877" MODIFIED="1170402517877"/>
+<node TEXT="Para crear un nodo hermano después, pulse SHIFT (MAYÚSCULAS)+ENTER" ID="ID_1650945332" CREATED="1170402517877" MODIFIED="1170402517877"/>
+<node TEXT="Para borrar un nodo, pulse DELETE ó SUPR" ID="ID_1309919099" CREATED="1170402517877" MODIFIED="1170402517877"/>
+<node TEXT="Para borrar un nodo y poder pegarlo después, pulse CTRL+X." ID="ID_314072670" CREATED="1170402517877" MODIFIED="1170402517877"/>
+<node TEXT="Como alternativa, puede usar el menú contextual, haciendo click izquierdo con el ratón en un nodo." ID="ID_312072195" CREATED="1170402517877" MODIFIED="1170402517877"/>
+</node>
+<node TEXT="Editar un nodo de texto" FOLDED="true" POSITION="right" ID="Freeplane_Link_1700974092" CREATED="1124560950717" MODIFIED="1170402540752" COLOR="#407000">
+<node TEXT="Para editar un nodo, pulse F2, HOME (INICIO) ó END (FIN), ó en el menú contextual usando Edit. Para terminar la edición de un nodo, pulse ENTER." ID="Freeplane_Link_611372497" CREATED="1170402567565" MODIFIED="1170402567565"/>
+<node TEXT="Para reemplazar un nodo de texto con otro nuevo, comience a escribir directamente." ID="ID_959968929" CREATED="1170402567565" MODIFIED="1170402567565"/>
+<node TEXT="Para forzar el cambio de edición de un nodo largo desde uno corto, pulse ALT+ENTER." ID="ID_509912383" CREATED="1170402567565" MODIFIED="1170402567565"/>
+<node TEXT="Para dividir un nodo largo, use el botón SEPARAR (Split) en la parte superior del editor de nodos, o pulse ALT+S en el editor de nodos largos." ID="ID_182192331" CREATED="1170402567565" MODIFIED="1170402567565"/>
+<node TEXT="Para introducir una nueva línea en el editor de nodos largos, pulse CTRL+ENTER. No puede insertar una nueva línea en el editor corto o básico de nodos." ID="ID_1260605262" CREATED="1170402567565" MODIFIED="1170402567565"/>
+<node TEXT="Para copiar una selección al portapapeles, haga click con el botón derecho del ratón y seleccione COPIAR." ID="ID_1580644595" CREATED="1170402567565" MODIFIED="1170402567565"/>
+<node TEXT="Por defecto, al pulsar ENTER se termina la edición de un nodo largo, y con CTRL+ENTER se inserta una nueva línea. Deseleccionando la opción “Confirmar ENTER” puede invertir la función de la citada combinación de teclas, p.e. ENTER inserta una nueva línea y CTRL+ENTER finaliza la edición. Puede establecer por defecto este valor en el menú preferencias, y se almacenará cuando finalice la sesión de Freeplane." ID="I [...]
+<node TEXT="Freeplane soporta Unicode. Además, puede usar el script que usted elija." ID="ID_1344420212" CREATED="1170402567565" MODIFIED="1170402567565"/>
+</node>
+<node TEXT="Dar formato a un nodo" FOLDED="true" POSITION="right" ID="Freeplane_Link_1660149394" CREATED="1124560950717" MODIFIED="1170402594612" COLOR="#407000">
+<node TEXT="Para poner en negrita un nodo, pulse CTRL+B." ID="Freeplane_Link_183644252" CREATED="1170402604643" MODIFIED="1170402604643"/>
+<node TEXT="Para poner en cursiva un nodo, pulse CTRL+I." ID="ID_1269833146" CREATED="1170402604643" MODIFIED="1170402604643"/>
+<node TEXT="Para cambiar el color del texto del nodo, pulse ALT+C." ID="ID_1007318855" CREATED="1170402604643" MODIFIED="1170402604643"/>
+<node TEXT="Para cambiar el color del fondo de un nodo, en el menú contextual utilice Formato --> Color de fondo del nodo." ID="ID_1997800468" CREATED="1170402604643" MODIFIED="1170402604643"/>
+<node TEXT="Para aumentar el tamaño del texto del nodo, pulse CTRL++ (Tecla +, NO del teclado numérico, sino del de texto)." ID="ID_1835911990" CREATED="1170402604643" MODIFIED="1170402604643"/>
+<node TEXT="Para disminuir el tamaño del texto del nodo, pulse CTRL+- (Tecla -, NO del teclado numérico, sino del de texto)." ID="ID_377073048" CREATED="1170402604659" MODIFIED="1170402604659"/>
+<node TEXT="Para cambiar el tipo de fuente de texto, use el campo a tal fin en la barra principal." ID="ID_422561863" CREATED="1170402604659" MODIFIED="1170402604659"/>
+<node TEXT="Para copiar formatos a un nodo, pulse ALT+V." ID="ID_1796169607" CREATED="1170402604659" MODIFIED="1170402604659"/>
+</node>
+<node TEXT="Usar estilos físicos" FOLDED="true" POSITION="right" ID="Freeplane_Link_526328879" CREATED="1124560950717" MODIFIED="1170402629050" COLOR="#407000">
+<node TEXT="Para aplicar un estudio físico, en el menú contextual use “Estilo físico” y seleccione el estilo deseado. Para aplicar estilos más rápidamente, utilice las teclas rápidas que se muestran en el citado menú contextual." ID="Freeplane_Link_1076084298" CREATED="1170402640284" MODIFIED="1170402640284"/>
+<node TEXT="Para añadir su propio estilo físico, en el supuesto de que usted sea un usuario con perfil técnico, puede hacerlo editando el fichero “patterns.xml” ubicado en la carpeta “freeplane” de su equipo." ID="ID_225306628" CREATED="1170402640284" MODIFIED="1170402640284"/>
+<node TEXT="Una observación sobre el fichero de estilos. Los estilos físicos se aplican al nodo, si existe la etiqueta de de nodo (<node>). Se aplicará al borde, si tiene la etiqueta borde (<edge>). La etiqueta nodo (<node>) puede tener una etiqueta fuente (<font>) como un hijo. Estudie atentamente el fichero “patterns.xml” facilitado por Freeplane." ID="ID_280540155" CREATED="1170402640284" MODIFIED="1170402640284"/>
+</node>
+<node TEXT="Resaltar los nodos mediante nubes" FOLDED="true" POSITION="right" ID="Freeplane_Link_1697687428" CREATED="1124560950717" MODIFIED="1170402655706" COLOR="#407000">
+<node TEXT="Clouds are well suited for highlighting a region. Highlighted are the node and all its descendants." ID="ID_787687042" CREATED="1124560950717" MODIFIED="1124560950717"/>
+<node TEXT="Las nubes se pueden utilizar para resaltar una región. Lo que se resalta es el nodo y sus descendientes." ID="ID_560539148" CREATED="1170402669175" MODIFIED="1170402669175"/>
+<node TEXT="Para añadir una nube, pulse CTRL+SHIFT (MAYÚSCULAS)+B ó en el menú contextual del nodo, utilice Insertar-->Nube." ID="Freeplane_Link_307492688" CREATED="1170402669191" MODIFIED="1170402669191"/>
+<node TEXT="Para cambiar el color de la nube, en menú contextual de nodo seleccione Formato-->Color de Nube." ID="Freeplane_Link_1144511960" CREATED="1170402669191" MODIFIED="1170402669191"/>
+<node TEXT="Las nubes pueden tener varios colores de fondo como verde..." FOLDED="true" ID="Freeplane_Link_1884870247" CREATED="1124560950717" MODIFIED="1170402707785">
+<cloud COLOR="#e1f2e1" SHAPE="ARC"/>
+<node TEXT="... ó marrón" ID="Freeplane_Link_335862648" CREATED="1124560950717" MODIFIED="1170402714863">
+<cloud COLOR="#ede5d5" SHAPE="ARC"/>
+</node>
+</node>
+</node>
+<node TEXT="Añadir enlaces ó hipervínculos" FOLDED="true" POSITION="right" ID="Freeplane_Link_203858515" CREATED="1124560950717" MODIFIED="1170402734160" COLOR="#407000">
+<node TEXT="Para añadir un enlace ó hipervínculo a un nodo, presione CTRL+K ó en el menú contextual utilice Insertar-->Enlace." ID="Freeplane_Link_1312466416" CREATED="1170402743613" MODIFIED="1170402743613"/>
+<node TEXT="Para borrar un enlace, Deje el enlace en blanco después de pulsar CTRL+K." ID="ID_112243579" CREATED="1170402743613" MODIFIED="1170402743613"/>
+<node TEXT="Para enlazar con una cuenta de correo electrónico, establezca el enlace como en este ejemplo: “mailto:dircorreo at correo.com”" ID="ID_155366812" CREATED="1170402743613" MODIFIED="1170402743613" LINK="mailto:“mailto:dircorreo at correo.com”"/>
+<node TEXT="Para enlazar con una dirección de correo electrónico e incluir a su vez un asunto, escriba lo siguiente en el enlace: “mailto:dircorreo at correo.com?subject=Asunto”" ID="ID_779331110" CREATED="1170402743613" MODIFIED="1170402743613" LINK="mailto:“mailto:dircorreo at correo.com?subject=Asunto”"/>
+<node TEXT="Se puede enlazar a páginas web, ficheros locales ó direcciones de correo electrónico." ID="ID_602845316" CREATED="1170402743613" MODIFIED="1170402743613"/>
+<node TEXT="Links" FOLDED="true" ID="Freeplane_Link_1974937042" CREATED="1170402743707" MODIFIED="1170402743707">
+<font NAME="SansSerif" SIZE="12" BOLD="true"/>
+<node TEXT="mailto:dircorreo at correo.com" ID="ID_1583474854" CREATED="1170402743707" MODIFIED="1170402743707" LINK="mailto:dircorreo at correo.com"/>
+<node TEXT="mailto:dircorreo at correo.com?subject=Asunto" ID="ID_1195481799" CREATED="1170402743707" MODIFIED="1170402743707" LINK="mailto:dircorreo at correo.com?subject=Asunto"/>
+</node>
+</node>
+<node TEXT="Añadir iconos" FOLDED="true" POSITION="right" ID="Freeplane_Link_1044397139" CREATED="1124560950717" MODIFIED="1170402783082" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Un nodo puede tener varios iconos." ID="Freeplane_Link_1687645098" CREATED="1170402797691" MODIFIED="1170402797691"/>
+<node TEXT="Para añadir iconos a un nodo, seleccione un nodo y haga click en los iconos de la barra de menú vertical de la izquierda de su pantalla. Mientras mueve el ratón hacia la citada barra de iconos, mantenga pulsado el botón ALT ó CTRL de modo que no pierda el foco ó selección del nodo." ID="ID_1321472721" CREATED="1170402797691" MODIFIED="1170402797691"/>
+<node TEXT="Para borrar un icono, pulse la cruz roja en la parte de arriba de la barra de iconos." ID="ID_165187931" CREATED="1170402797691" MODIFIED="1170402797691"/>
+<node TEXT="Para borrar todos los iconos, pulse el icono de la papelera en la parte de arriba de la barra de iconos." ID="ID_1084750728" CREATED="1170402797691" MODIFIED="1170402797691"/>
+<node TEXT="Para añadir un icono a un nodo sin utilizar la barra de menú, presione ALT+I." ID="ID_1195433040" CREATED="1170402797691" MODIFIED="1170402797691"/>
+<node TEXT="No existe opción para utilizar sus propios iconos, por lo que deberá elegir los que le ofrece Freeplane únicamente." ID="ID_1099218237" CREATED="1170402797691" MODIFIED="1170402797691"/>
+<node TEXT="Para mostrar u ocultar la barra de iconos, utilice el menú de la barra superior. Ver-->Des(activar) Barra de herramientas de la izquierda. La barra de herramientas de la izquierda es la forma de llamar a la barra de iconos en la aplicación." ID="Freeplane_Link_1437377566" CREATED="1170402797691" MODIFIED="1170402797691"/>
+<node TEXT="Los iconos adjuntados a este nodo son todos los que existen, no hay más." ID="Freeplane_Link_1609274" CREATED="1124560950717" MODIFIED="1170402870301">
<icon BUILTIN="help"/>
<icon BUILTIN="messagebox_warning"/>
<icon BUILTIN="idea"/>
@@ -531,291 +651,372 @@
<icon BUILTIN="licq"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1996597932" MODIFIED="1170402930317" POSITION="right" TEXT="Añadir enlaces gráficos (Flechas de enlace)">
-<node CREATED="1170402940036" ID="Freeplane_Link_1942968106" MODIFIED="1170403283663" TEXT="Para crear un enlace gráfico entre dos nodos, arrastre un nodo y suéltelo en otro nodo teniendo pulsadas las teclas SHIFT (MAYÚSCULAS) y CTRL; suelte el botón del ratón antes de soltar las teclas antes mencionadas.">
-<arrowlink DESTINATION="Freeplane_Link_967984859" ENDARROW="Default" ENDINCLINATION="99;-7;" ID="Freeplane_Arrow_Link_1548449519" STARTARROW="None" STARTINCLINATION="227;0;"/>
+<node TEXT="Añadir enlaces gráficos (Flechas de enlace)" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1996597932" CREATED="1124560950717" MODIFIED="1170402930317" COLOR="#407000">
+<node TEXT="Para crear un enlace gráfico entre dos nodos, arrastre un nodo y suéltelo en otro nodo teniendo pulsadas las teclas SHIFT (MAYÚSCULAS) y CTRL; suelte el botón del ratón antes de soltar las teclas antes mencionadas." ID="Freeplane_Link_1942968106" CREATED="1170402940036" MODIFIED="1170403283663">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="Freeplane_Link_967984859" STARTINCLINATION="227;0;" ENDINCLINATION="99;-7;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1170402940036" ID="Freeplane_Link_1842889348" MODIFIED="1170402940036" TEXT="Otro modo sería arrastrando y soltando usando el botón derecho del ratón."/>
-<node CREATED="1170402940036" MODIFIED="1170402940036" TEXT="Para cambiar el color del enlace, utilice el menú contextual, haciendo click con el botón derecho del ratón en el enlace gráfico."/>
-<node CREATED="1170402940036" MODIFIED="1170402940036" TEXT="Para cambiar las fechas del enlace, use el menú contextual del enlace."/>
-<node CREATED="1170402940036" MODIFIED="1170402940036" TEXT="Para borrar un enlace, use el menú contextual del enlace."/>
-<node CREATED="1170402940036" ID="Freeplane_Link_967984859" MODIFIED="1170403283663" TEXT="Para navegar al final de uno de los nodos del enlace, utilice el menú contextual."/>
-<node CREATED="1170402940036" ID="Freeplane_Link_1478196416" MODIFIED="1170403278835" TEXT="Para cambiar la ruta de una flecha de enlace, arrástrela y muévela.">
-<arrowlink DESTINATION="Freeplane_Link_967984859" ENDARROW="Default" ENDINCLINATION="73;0;" ID="Freeplane_Arrow_Link_631292318" STARTARROW="None" STARTINCLINATION="73;0;"/>
+<node TEXT="Otro modo sería arrastrando y soltando usando el botón derecho del ratón." ID="Freeplane_Link_1842889348" CREATED="1170402940036" MODIFIED="1170402940036"/>
+<node TEXT="Para cambiar el color del enlace, utilice el menú contextual, haciendo click con el botón derecho del ratón en el enlace gráfico." ID="ID_952648623" CREATED="1170402940036" MODIFIED="1170402940036"/>
+<node TEXT="Para cambiar las fechas del enlace, use el menú contextual del enlace." ID="ID_183404799" CREATED="1170402940036" MODIFIED="1170402940036"/>
+<node TEXT="Para borrar un enlace, use el menú contextual del enlace." ID="ID_681591273" CREATED="1170402940036" MODIFIED="1170402940036"/>
+<node TEXT="Para navegar al final de uno de los nodos del enlace, utilice el menú contextual." ID="Freeplane_Link_967984859" CREATED="1170402940036" MODIFIED="1170403283663"/>
+<node TEXT="Para cambiar la ruta de una flecha de enlace, arrástrela y muévela." ID="Freeplane_Link_1478196416" CREATED="1170402940036" MODIFIED="1170403278835">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="Freeplane_Link_967984859" STARTINCLINATION="73;0;" ENDINCLINATION="73;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1170402940036" MODIFIED="1170402940036" TEXT="A continuación, un ejemplo de enlace de flecha:"/>
-<node COLOR="#cc9900" CREATED="1170402940036" FOLDED="true" ID="Freeplane_Link_1315155160" MODIFIED="1170403388133" TEXT="Ejemplo">
-<node COLOR="#cc9900" CREATED="1170402940036" ID="Freeplane_Link_72153142" MODIFIED="1170403462102" TEXT="Enlace a otra parte">
-<arrowlink DESTINATION="Freeplane_Link_872294215" ENDARROW="Default" ENDINCLINATION="14;-29;" ID="Freeplane_Arrow_Link_514982703" STARTARROW="None" STARTINCLINATION="135;-8;"/>
+<node TEXT="A continuación, un ejemplo de enlace de flecha:" ID="ID_709190104" CREATED="1170402940036" MODIFIED="1170402940036"/>
+<node TEXT="Ejemplo" FOLDED="true" ID="Freeplane_Link_1315155160" CREATED="1170402940036" MODIFIED="1170403388133" COLOR="#cc9900">
+<node TEXT="Enlace a otra parte" ID="Freeplane_Link_72153142" CREATED="1170402940036" MODIFIED="1170403462102" COLOR="#cc9900">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="Freeplane_Link_872294215" STARTINCLINATION="135;-8;" ENDINCLINATION="14;-29;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node COLOR="#cc9900" CREATED="1170402940036" FOLDED="true" ID="Freeplane_Link_40913042" MODIFIED="1170403419680" TEXT="Nodo con un subnodo replegado">
-<node CREATED="1170402940036" ID="Freeplane_Link_872294215" MODIFIED="1170403462102" TEXT="Subnodo"/>
+<node TEXT="Nodo con un subnodo replegado" FOLDED="true" ID="Freeplane_Link_40913042" CREATED="1170402940036" MODIFIED="1170403419680" COLOR="#cc9900">
+<node TEXT="Subnodo" ID="Freeplane_Link_872294215" CREATED="1170402940036" MODIFIED="1170403462102"/>
</node>
-<node COLOR="#cc9900" CREATED="1170402940036" ID="Freeplane_Link_1982955440" MODIFIED="1170403474336" TEXT="Otro enlace">
-<arrowlink COLOR="#9999ff" DESTINATION="Freeplane_Link_72153142" ENDARROW="Default" ENDINCLINATION="169;0;" ID="Freeplane_Arrow_Link_1798453197" STARTARROW="None" STARTINCLINATION="174;0;"/>
+<node TEXT="Otro enlace" ID="Freeplane_Link_1982955440" CREATED="1170402940036" MODIFIED="1170403474336" COLOR="#cc9900">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#9999ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="Freeplane_Link_72153142" STARTINCLINATION="174;0;" ENDINCLINATION="169;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_423038022" MODIFIED="1170403490211" POSITION="right" TEXT="Hacer búsquedas">
+<node TEXT="Hacer búsquedas" FOLDED="true" POSITION="right" ID="Freeplane_Link_423038022" CREATED="1124560950717" MODIFIED="1170403490211" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170403492446" ID="Freeplane_Link_1193426532" MODIFIED="1170403492446" TEXT="Para encontrar un texto en un nodo y todos los nodos descendientes, presione CTRL+F ó en el menú contextual, opción Nodo-->Buscar...."/>
-<node CREATED="1170403492446" MODIFIED="1170403492446" TEXT="Para seguir buscando más resultados con un criterio de búsqueda, pulse CTRL+G ó en el menú contextual, utilice Nodo->Buscar Siguiente."/>
-<node CREATED="1170403492446" MODIFIED="1170403492446" TEXT="Para buscar en todo el mapa, colóquese en el nodo central, pulsando ESCAPE antes de realizar la búsqueda."/>
-<node CREATED="1170403492446" MODIFIED="1170403492446" TEXT="La búsqueda es una búsqueda de la primera concurrencia. Esto responde a la idea de que, cuanto más profundo sea un nodo, más detalle tendrá."/>
-<node CREATED="1170403492446" MODIFIED="1170403492446" TEXT="Recuerde que no se busca un árbol entero, sino que sólo en el nodo y todos sus descendientes."/>
+<node TEXT="Para encontrar un texto en un nodo y todos los nodos descendientes, presione CTRL+F ó en el menú contextual, opción Nodo-->Buscar...." ID="Freeplane_Link_1193426532" CREATED="1170403492446" MODIFIED="1170403492446"/>
+<node TEXT="Para seguir buscando más resultados con un criterio de búsqueda, pulse CTRL+G ó en el menú contextual, utilice Nodo->Buscar Siguiente." ID="ID_409660243" CREATED="1170403492446" MODIFIED="1170403492446"/>
+<node TEXT="Para buscar en todo el mapa, colóquese en el nodo central, pulsando ESCAPE antes de realizar la búsqueda." ID="ID_111025171" CREATED="1170403492446" MODIFIED="1170403492446"/>
+<node TEXT="La búsqueda es una búsqueda de la primera concurrencia. Esto responde a la idea de que, cuanto más profundo sea un nodo, más detalle tendrá." ID="ID_1327608238" CREATED="1170403492446" MODIFIED="1170403492446"/>
+<node TEXT="Recuerde que no se busca un árbol entero, sino que sólo en el nodo y todos sus descendientes." ID="ID_1123566873" CREATED="1170403492446" MODIFIED="1170403492446"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_653540280" MODIFIED="1170403527134" POSITION="right" TEXT="Seleccionar múltiples nodos">
+<node TEXT="Seleccionar múltiples nodos" FOLDED="true" POSITION="right" ID="Freeplane_Link_653540280" CREATED="1124560950717" MODIFIED="1170403527134" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170403517883" ID="Freeplane_Link_507160373" MODIFIED="1170403517883" TEXT="Para seleccionar múltiples nodos, mantenga pulsado CTRL ó SHIFT (MAYÚSCULAS) mientras los elige con el ratón."/>
-<node CREATED="1170403517883" MODIFIED="1170403517883" TEXT="Para añadir más nodos a una selección múltiple de nodos, mantenga pulsado CTRL mientras hace click en ellos."/>
-<node CREATED="1170403517883" MODIFIED="1170403517883" TEXT="Para seleccionar un rango de nodos consecutivos o seguidos, mantenga pulsado SHIFT (MAYÚSCULAS) mientras los selecciona con el ratón, ó mantenga pulsado SHIFT (MAYÚSCULAS) mientras se mueve con las flechas de desplazamiento del teclado."/>
-<node CREATED="1170403517883" MODIFIED="1170403517883" TEXT="Para seleccionar un sub-árbol completo, mantenga pulsado ALT mientras hace click, ó mantenga pulsado SHIFT (MAYÚSCULAS) mientras se mueve con las teclas de desplazamiento de un nodo a su nodo padre."/>
-<node CREATED="1170403517883" MODIFIED="1170403517883" TEXT="Para cancelar la selección de múltiples nodos, haga click en el fondo del mapa ó en un nodo no seleccionado."/>
-<node CREATED="1170403517883" MODIFIED="1170403517883" TEXT="Para seleccionar todos los nodos visibles, seleccione la opción en el menú principal: Editar-->Select All Visible (Sin traducir)."/>
-<node CREATED="1170403517883" MODIFIED="1170403517883" TEXT="Para seleccionar todos los nodos visibles de una rama, seleccione la opción en el menú principal: Editar-->Select Visible Branch (Sin traducir)."/>
-<node CREATED="1170405270836" FOLDED="true" ID="Freeplane_Link_1196067011" LINK="file:/C:/Archivos de programa/IrfanView/Html/" MODIFIED="1170405270852" TEXT="Html">
-<node CREATED="1170405270852" ID="Freeplane_Link_566784677" LINK="file:/C:/Archivos de programa/IrfanView/Html/frame.html" MODIFIED="1170405270852" TEXT="frame.html"/>
-<node CREATED="1170405270868" ID="Freeplane_Link_1122494705" LINK="file:/C:/Archivos de programa/IrfanView/Html/slideshow.html" MODIFIED="1170405270868" TEXT="slideshow.html"/>
-<node CREATED="1170405270868" ID="Freeplane_Link_364368875" LINK="file:/C:/Archivos de programa/IrfanView/Html/thumbnails.html" MODIFIED="1170405270868" TEXT="thumbnails.html"/>
+<node TEXT="Para seleccionar múltiples nodos, mantenga pulsado CTRL ó SHIFT (MAYÚSCULAS) mientras los elige con el ratón." ID="Freeplane_Link_507160373" CREATED="1170403517883" MODIFIED="1170403517883"/>
+<node TEXT="Para añadir más nodos a una selección múltiple de nodos, mantenga pulsado CTRL mientras hace click en ellos." ID="ID_1994258742" CREATED="1170403517883" MODIFIED="1170403517883"/>
+<node TEXT="Para seleccionar un rango de nodos consecutivos o seguidos, mantenga pulsado SHIFT (MAYÚSCULAS) mientras los selecciona con el ratón, ó mantenga pulsado SHIFT (MAYÚSCULAS) mientras se mueve con las flechas de desplazamiento del teclado." ID="ID_1174557916" CREATED="1170403517883" MODIFIED="1170403517883"/>
+<node TEXT="Para seleccionar un sub-árbol completo, mantenga pulsado ALT mientras hace click, ó mantenga pulsado SHIFT (MAYÚSCULAS) mientras se mueve con las teclas de desplazamiento de un nodo a su nodo padre." ID="ID_635991816" CREATED="1170403517883" MODIFIED="1170403517883"/>
+<node TEXT="Para cancelar la selección de múltiples nodos, haga click en el fondo del mapa ó en un nodo no seleccionado." ID="ID_332861751" CREATED="1170403517883" MODIFIED="1170403517883"/>
+<node TEXT="Para seleccionar todos los nodos visibles, seleccione la opción en el menú principal: Editar-->Select All Visible (Sin traducir)." ID="ID_588842119" CREATED="1170403517883" MODIFIED="1170403517883"/>
+<node TEXT="Para seleccionar todos los nodos visibles de una rama, seleccione la opción en el menú principal: Editar-->Select Visible Branch (Sin traducir)." ID="ID_1766685622" CREATED="1170403517883" MODIFIED="1170403517883"/>
+<node TEXT="Html" FOLDED="true" ID="Freeplane_Link_1196067011" CREATED="1170405270836" MODIFIED="1170405270852" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Html/">
+<node TEXT="frame.html" ID="Freeplane_Link_566784677" CREATED="1170405270852" MODIFIED="1170405270852" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Html/frame.html"/>
+<node TEXT="slideshow.html" ID="Freeplane_Link_1122494705" CREATED="1170405270868" MODIFIED="1170405270868" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Html/slideshow.html"/>
+<node TEXT="thumbnails.html" ID="Freeplane_Link_364368875" CREATED="1170405270868" MODIFIED="1170405270868" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Html/thumbnails.html"/>
</node>
-<node CREATED="1170405270883" FOLDED="true" ID="Freeplane_Link_1203928403" LINK="file:/C:/Archivos de programa/IrfanView/Languages/" MODIFIED="1170405270899" TEXT="Languages">
-<node CREATED="1170405270899" ID="Freeplane_Link_855733485" LINK="file:/C:/Archivos de programa/IrfanView/Languages/Deutsch.dll" MODIFIED="1170405270899" TEXT="Deutsch.dll"/>
+<node TEXT="Languages" FOLDED="true" ID="Freeplane_Link_1203928403" CREATED="1170405270883" MODIFIED="1170405270899" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Languages/">
+<node TEXT="Deutsch.dll" ID="Freeplane_Link_855733485" CREATED="1170405270899" MODIFIED="1170405270899" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Languages/Deutsch.dll"/>
</node>
-<node CREATED="1170405270899" FOLDED="true" ID="Freeplane_Link_743205228" LINK="file:/C:/Archivos de programa/IrfanView/Plugins/" MODIFIED="1170405270914" TEXT="Plugins">
-<node CREATED="1170405270914" ID="Freeplane_Link_639338292" LINK="file:/C:/Archivos de programa/IrfanView/Plugins/Effects.dll" MODIFIED="1170405270914" TEXT="Effects.dll"/>
-<node CREATED="1170405270914" ID="Freeplane_Link_965606582" LINK="file:/C:/Archivos de programa/IrfanView/Plugins/Icons.dll" MODIFIED="1170405270930" TEXT="Icons.dll"/>
-<node CREATED="1170405270930" ID="Freeplane_Link_1618897390" LINK="file:/C:/Archivos de programa/IrfanView/Plugins/Mpg.dll" MODIFIED="1170405270930" TEXT="Mpg.dll"/>
-<node CREATED="1170405270930" ID="Freeplane_Link_946430678" LINK="file:/C:/Archivos de programa/IrfanView/Plugins/Plugins.txt" MODIFIED="1170405270946" TEXT="Plugins.txt"/>
-<node CREATED="1170405270946" ID="Freeplane_Link_756921843" LINK="file:/C:/Archivos de programa/IrfanView/Plugins/Slideshow.exe" MODIFIED="1170405270946" TEXT="Slideshow.exe"/>
-<node CREATED="1170405270946" ID="Freeplane_Link_913413127" LINK="file:/C:/Archivos de programa/IrfanView/Plugins/Video.dll" MODIFIED="1170405270946" TEXT="Video.dll"/>
+<node TEXT="Plugins" FOLDED="true" ID="Freeplane_Link_743205228" CREATED="1170405270899" MODIFIED="1170405270914" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Plugins/">
+<node TEXT="Effects.dll" ID="Freeplane_Link_639338292" CREATED="1170405270914" MODIFIED="1170405270914" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Plugins/Effects.dll"/>
+<node TEXT="Icons.dll" ID="Freeplane_Link_965606582" CREATED="1170405270914" MODIFIED="1170405270930" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Plugins/Icons.dll"/>
+<node TEXT="Mpg.dll" ID="Freeplane_Link_1618897390" CREATED="1170405270930" MODIFIED="1170405270930" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Plugins/Mpg.dll"/>
+<node TEXT="Plugins.txt" ID="Freeplane_Link_946430678" CREATED="1170405270930" MODIFIED="1170405270946" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Plugins/Plugins.txt"/>
+<node TEXT="Slideshow.exe" ID="Freeplane_Link_756921843" CREATED="1170405270946" MODIFIED="1170405270946" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Plugins/Slideshow.exe"/>
+<node TEXT="Video.dll" ID="Freeplane_Link_913413127" CREATED="1170405270946" MODIFIED="1170405270946" LINK="file:/C:/Archivos%20de%20programa/IrfanView/Plugins/Video.dll"/>
</node>
-<node CREATED="1170405270961" ID="Freeplane_Link_344292187" LINK="file:/C:/Archivos de programa/IrfanView/iv_uninstall.exe" MODIFIED="1170405270961" TEXT="iv_uninstall.exe"/>
-<node CREATED="1170405270961" ID="Freeplane_Link_331640781" LINK="file:/C:/Archivos de programa/IrfanView/i_about.txt" MODIFIED="1170405270961" TEXT="i_about.txt"/>
-<node CREATED="1170405270961" ID="Freeplane_Link_823931338" LINK="file:/C:/Archivos de programa/IrfanView/i_changes.txt" MODIFIED="1170405270977" TEXT="i_changes.txt"/>
-<node CREATED="1170405270977" ID="Freeplane_Link_1434544883" LINK="file:/C:/Archivos de programa/IrfanView/i_languages.txt" MODIFIED="1170405270977" TEXT="i_languages.txt"/>
-<node CREATED="1170405270977" ID="Freeplane_Link_1464671418" LINK="file:/C:/Archivos de programa/IrfanView/i_options.txt" MODIFIED="1170405270977" TEXT="i_options.txt"/>
-<node CREATED="1170405270992" ID="Freeplane_Link_1621670439" LINK="file:/C:/Archivos de programa/IrfanView/i_plugins.txt" MODIFIED="1170405270992" TEXT="i_plugins.txt"/>
-<node CREATED="1170405270992" ID="Freeplane_Link_1732519486" LINK="file:/C:/Archivos de programa/IrfanView/i_view32.chm" MODIFIED="1170405270992" TEXT="i_view32.chm"/>
-<node CREATED="1170405270992" ID="Freeplane_Link_1243859600" LINK="file:/C:/Archivos de programa/IrfanView/i_view32.exe" MODIFIED="1170405271008" TEXT="i_view32.exe"/>
-<node CREATED="1170405271008" ID="Freeplane_Link_1386491854" LINK="file:/C:/Archivos de programa/IrfanView/i_view32.exe.manifest" MODIFIED="1170405271008" TEXT="i_view32.exe.manifest"/>
-<node CREATED="1170405271008" ID="Freeplane_Link_1958400630" LINK="file:/C:/Archivos de programa/IrfanView/i_view32.ini" MODIFIED="1170405271024" TEXT="i_view32.ini"/>
+<node TEXT="iv_uninstall.exe" ID="Freeplane_Link_344292187" CREATED="1170405270961" MODIFIED="1170405270961" LINK="file:/C:/Archivos%20de%20programa/IrfanView/iv_uninstall.exe"/>
+<node TEXT="i_about.txt" ID="Freeplane_Link_331640781" CREATED="1170405270961" MODIFIED="1170405270961" LINK="file:/C:/Archivos%20de%20programa/IrfanView/i_about.txt"/>
+<node TEXT="i_changes.txt" ID="Freeplane_Link_823931338" CREATED="1170405270961" MODIFIED="1170405270977" LINK="file:/C:/Archivos%20de%20programa/IrfanView/i_changes.txt"/>
+<node TEXT="i_languages.txt" ID="Freeplane_Link_1434544883" CREATED="1170405270977" MODIFIED="1170405270977" LINK="file:/C:/Archivos%20de%20programa/IrfanView/i_languages.txt"/>
+<node TEXT="i_options.txt" ID="Freeplane_Link_1464671418" CREATED="1170405270977" MODIFIED="1170405270977" LINK="file:/C:/Archivos%20de%20programa/IrfanView/i_options.txt"/>
+<node TEXT="i_plugins.txt" ID="Freeplane_Link_1621670439" CREATED="1170405270992" MODIFIED="1170405270992" LINK="file:/C:/Archivos%20de%20programa/IrfanView/i_plugins.txt"/>
+<node TEXT="i_view32.chm" ID="Freeplane_Link_1732519486" CREATED="1170405270992" MODIFIED="1170405270992" LINK="file:/C:/Archivos%20de%20programa/IrfanView/i_view32.chm"/>
+<node TEXT="i_view32.exe" ID="Freeplane_Link_1243859600" CREATED="1170405270992" MODIFIED="1170405271008" LINK="file:/C:/Archivos%20de%20programa/IrfanView/i_view32.exe"/>
+<node TEXT="i_view32.exe.manifest" ID="Freeplane_Link_1386491854" CREATED="1170405271008" MODIFIED="1170405271008" LINK="file:/C:/Archivos%20de%20programa/IrfanView/i_view32.exe.manifest"/>
+<node TEXT="i_view32.ini" ID="Freeplane_Link_1958400630" CREATED="1170405271008" MODIFIED="1170405271024" LINK="file:/C:/Archivos%20de%20programa/IrfanView/i_view32.ini"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1024903226" MODIFIED="1170403565009" POSITION="right" TEXT="Arrastrar y soltar">
-<edge WIDTH="thin"/>
+<node TEXT="Arrastrar y soltar" FOLDED="true" POSITION="right" ID="Freeplane_Link_1024903226" CREATED="1124560950717" MODIFIED="1170403565009" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170403567946" ID="Freeplane_Link_803053837" MODIFIED="1170403567946" TEXT="Puede mover nodos usando arrastrar y soltar."/>
-<node CREATED="1170403567946" MODIFIED="1170403567946" TEXT="Para soltar un nodo como hijo, coloque el cursor en el extremo de un nodo al soltarlo."/>
-<node CREATED="1170403567946" MODIFIED="1170403567946" TEXT="Para soltar un nodo como hermano, coloque el cursor en la parte superior del nodo destino cuando al soltarlo."/>
-<node CREATED="1170403567946" MODIFIED="1170403567946" TEXT="Para copiar nodos a la vez que se mueven, presione CTRL mientras lo arrastra, ó arrastrelo con el botón central del ratón."/>
-<node CREATED="1170403567946" MODIFIED="1170403567946" TEXT="Para editar un mapa existente, arrastre su fichero y suéltelo en el fondo de pantalla de Freeplane; Esto funciona al menos en ordenadores con Microsoft Windows."/>
-<node CREATED="1170403567946" MODIFIED="1170403567946" TEXT="Para crear un enlace gráfico o de flechas, arrastre y suelte mientras tiene pulsado el botón derecho del ratón."/>
-<node CREATED="1170403567946" MODIFIED="1170403567946" TEXT="Si ha seleccionado múltiples nodos, todos se moveran o copiaran.."/>
-<node CREATED="1170403567946" MODIFIED="1170403567946" TEXT="Puede arrastrar información de aplicaciones externas, como ficheros en un S.O. Microsoft Windows, ó piezas de texto seleccionado en Microsoft Internet Explorer."/>
+<edge WIDTH="thin"/>
+<node TEXT="Puede mover nodos usando arrastrar y soltar." ID="Freeplane_Link_803053837" CREATED="1170403567946" MODIFIED="1170403567946"/>
+<node TEXT="Para soltar un nodo como hijo, coloque el cursor en el extremo de un nodo al soltarlo." ID="ID_1792422864" CREATED="1170403567946" MODIFIED="1170403567946"/>
+<node TEXT="Para soltar un nodo como hermano, coloque el cursor en la parte superior del nodo destino cuando al soltarlo." ID="ID_1163222765" CREATED="1170403567946" MODIFIED="1170403567946"/>
+<node TEXT="Para copiar nodos a la vez que se mueven, presione CTRL mientras lo arrastra, ó arrastrelo con el botón central del ratón." ID="ID_158691652" CREATED="1170403567946" MODIFIED="1170403567946"/>
+<node TEXT="Para editar un mapa existente, arrastre su fichero y suéltelo en el fondo de pantalla de Freeplane; Esto funciona al menos en ordenadores con Microsoft Windows." ID="ID_165552277" CREATED="1170403567946" MODIFIED="1170403567946"/>
+<node TEXT="Para crear un enlace gráfico o de flechas, arrastre y suelte mientras tiene pulsado el botón derecho del ratón." ID="ID_1376653248" CREATED="1170403567946" MODIFIED="1170403567946"/>
+<node TEXT="Si ha seleccionado múltiples nodos, todos se moveran o copiaran.." ID="ID_1612046496" CREATED="1170403567946" MODIFIED="1170403567946"/>
+<node TEXT="Puede arrastrar información de aplicaciones externas, como ficheros en un S.O. Microsoft Windows, ó piezas de texto seleccionado en Microsoft Internet Explorer." ID="ID_42570001" CREATED="1170403567946" MODIFIED="1170403567946"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_958781924" MODIFIED="1170403884683" POSITION="right" TEXT="Copiar y pegar (Edición)">
+<node TEXT="Copiar y pegar (Edición)" FOLDED="true" POSITION="right" ID="Freeplane_Link_958781924" CREATED="1124560950717" MODIFIED="1170403884683" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1070489177" MODIFIED="1170662211252" TEXT="Puede copiar y pegar (múltiples) nodos entre mapas mentales. Además, puede pegar texto normal ó HTML desde otras aplicaciones.">
+<node TEXT="Puede copiar y pegar (múltiples) nodos entre mapas mentales. Además, puede pegar texto normal ó HTML desde otras aplicaciones." ID="Freeplane_Link_1070489177" CREATED="1124560950717" MODIFIED="1170662211252">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1215134438" MODIFIED="1170403616493" TEXT="Si pega texto plano, cada línea se pegará como un nodo, con la profundidad determinada por el número de caracteres de cada línea. Éste es un ejemplo:"/>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1656023763" MODIFIED="1170403649275" TEXT="Árbol 
 Roble 
 Haya">
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_326960749" MODIFIED="1170403674025" TEXT="es pegado como">
+<node TEXT="Si pega texto plano, cada línea se pegará como un nodo, con la profundidad determinada por el número de caracteres de cada línea. Éste es un ejemplo:" ID="Freeplane_Link_1215134438" CREATED="1124560950717" MODIFIED="1170403616493"/>
+<node TEXT="Árbol 
 Roble 
 Haya" FOLDED="true" ID="Freeplane_Link_1656023763" CREATED="1124560950717" MODIFIED="1170403649275" COLOR="#996600">
+<node TEXT="es pegado como" FOLDED="true" ID="Freeplane_Link_326960749" CREATED="1124560950717" MODIFIED="1170403674025">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_639753662" MODIFIED="1170403690306" TEXT="Árbol">
+<node TEXT="Árbol" FOLDED="true" ID="Freeplane_Link_639753662" CREATED="1124560950717" MODIFIED="1170403690306" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" ID="Freeplane_Link_142445650" MODIFIED="1170403694135" TEXT="Roble">
+<node TEXT="Roble" ID="Freeplane_Link_142445650" CREATED="1124560950717" MODIFIED="1170403694135" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" ID="Freeplane_Link_68949954" MODIFIED="1170403697775" TEXT="Haya">
+<node TEXT="Haya" ID="Freeplane_Link_68949954" CREATED="1124560950717" MODIFIED="1170403697775" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1804728980" MODIFIED="1170403710088" TEXT="Si pega HTML, éste se pega como texto plano. Además, los enlaces que contenga en HTML serán copiados como hijos de un nodo adicional llamado “Links” (Enlaces). Ejemplo:"/>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_374077364" MODIFIED="1170403718853" TEXT="Ejemplo resultante tras pegar:">
+<node TEXT="Si pega HTML, éste se pega como texto plano. Además, los enlaces que contenga en HTML serán copiados como hijos de un nodo adicional llamado “Links” (Enlaces). Ejemplo:" ID="Freeplane_Link_1804728980" CREATED="1124560950717" MODIFIED="1170403710088"/>
+<node TEXT="Ejemplo resultante tras pegar:" FOLDED="true" ID="Freeplane_Link_374077364" CREATED="1124560950717" MODIFIED="1170403718853">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Shopping (120236)">
+<node TEXT="Shopping (120236)" ID="ID_1762800268" CREATED="1124560950717" MODIFIED="1124560950717">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Urban Living (19)">
+<node TEXT="Urban Living (19)" ID="ID_10207675" CREATED="1124560950717" MODIFIED="1124560950717">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1381653791" MODIFIED="1170403726979" TEXT="Enlaces">
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" LINK="http://directory.google.com/Top/Shopping/" MODIFIED="1124560950717" TEXT="Shopping">
+<node TEXT="Enlaces" FOLDED="true" ID="Freeplane_Link_1381653791" CREATED="1124560950717" MODIFIED="1170403726979">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+<node TEXT="Shopping" ID="ID_595534642" CREATED="1124560950717" MODIFIED="1124560950717" LINK="http://directory.google.com/Top/Shopping/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" LINK="http://directory.google.com/Top/Home/Urban_Living/" MODIFIED="1124560950717" TEXT="Urban Living">
+<node TEXT="Urban Living" ID="ID_1073876455" CREATED="1124560950717" MODIFIED="1124560950717" LINK="http://directory.google.com/Top/Home/Urban_Living/">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1772185342" MODIFIED="1170403735744" TEXT="Si pega una lista de ficheros de Explorer en Microsoft Windows, se pegará como un conjunto de enlaces a los ficheros."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_619498024" MODIFIED="1170403756166" TEXT="Si en Freeplane copia una rama y la pega en un editor de texto plano (p.e.: Bloc de notas), la estructura de árbol se muestra como texto tabulado. Los enlaces se copian entre los simbolos “<>”. Por ejemplo:"/>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1419018130" MODIFIED="1170403770010" TEXT="Árbol">
+<node TEXT="Si pega una lista de ficheros de Explorer en Microsoft Windows, se pegará como un conjunto de enlaces a los ficheros." ID="Freeplane_Link_1772185342" CREATED="1124560950717" MODIFIED="1170403735744"/>
+<node TEXT="Si en Freeplane copia una rama y la pega en un editor de texto plano (p.e.: Bloc de notas), la estructura de árbol se muestra como texto tabulado. Los enlaces se copian entre los simbolos “<>”. Por ejemplo:" ID="Freeplane_Link_619498024" CREATED="1124560950717" MODIFIED="1170403756166"/>
+<node TEXT="Árbol" FOLDED="true" ID="Freeplane_Link_1419018130" CREATED="1124560950717" MODIFIED="1170403770010" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" ID="Freeplane_Link_1688306576" MODIFIED="1170403774791" TEXT="Roble">
+<node TEXT="Roble" ID="Freeplane_Link_1688306576" CREATED="1124560950717" MODIFIED="1170403774791" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_838087851" MODIFIED="1170403779760" TEXT="Haya">
+<node TEXT="Haya" FOLDED="true" ID="Freeplane_Link_838087851" CREATED="1124560950717" MODIFIED="1170403779760" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_926901432" MODIFIED="1170403787354" TEXT="se pega como">
+<node TEXT="se pega como" FOLDED="true" ID="Freeplane_Link_926901432" CREATED="1124560950717" MODIFIED="1170403787354">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950732" ID="Freeplane_Link_160461667" MODIFIED="1170403810901" TEXT="Árbol
 Roble 
 Haya
 Google <http://www.google.com/>">
+<node TEXT="Árbol
 Roble 
 Haya
 Google <http://www.google.com/>" ID="Freeplane_Link_160461667" CREATED="1124560950732" MODIFIED="1170403810901" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950732" LINK="http://www.google.com/" MODIFIED="1124560950732" TEXT="Google">
+<node TEXT="Google" ID="ID_1017410762" CREATED="1124560950732" MODIFIED="1124560950732" LINK="http://www.google.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950732" ID="Freeplane_Link_847954963" MODIFIED="1170403842589" TEXT="Si en Freeplane usted copia una rama y la pega en un editor de texto que comprenda el formato de texto enriquecido, se mantienes los formatos de color y fuente se incluyen también. Los enlaces también se copian entre “<>”, igual que en los editores de texto plano. Los editores que soportan texto enriquecido son Microsoft Word, Wordpad ó Microsoft Outlook, y en Lin [...]
-<node CREATED="1124560950732" ID="Freeplane_Link_314527267" MODIFIED="1170403851432" TEXT="Para copiar un nodo sin sus descendientes, pulse CTRL+Y ó en el menú contextual use “Copia Sencilla”."/>
+<node TEXT="Si en Freeplane usted copia una rama y la pega en un editor de texto que comprenda el formato de texto enriquecido, se mantienes los formatos de color y fuente se incluyen también. Los enlaces también se copian entre “<>”, igual que en los editores de texto plano. Los editores que soportan texto enriquecido son Microsoft Word, Wordpad ó Microsoft Outlook, y en Linux, existe algunos (No se mencionan concretos)." ID="Freeplane_Link_847954963" [...]
+<node TEXT="Para copiar un nodo sin sus descendientes, pulse CTRL+Y ó en el menú contextual use “Copia Sencilla”." ID="Freeplane_Link_314527267" CREATED="1124560950732" MODIFIED="1170403851432"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="_Freeplane_Link_1540212684" MODIFIED="1170403896261" POSITION="right" TEXT="Moverse en la aplicación">
-<node CREATED="1170403902527" ID="Freeplane_Link_1237405295" MODIFIED="1170403902527" TEXT="Para mover el cursor hacia arriba, abajo, izquierda ó derecha, utilice las teclas de desplazamiento."/>
-<node CREATED="1170403902527" MODIFIED="1170403902527" TEXT="Para moverse a la parte superior del sub-árbol actual, pulse AV. PÁG."/>
-<node CREATED="1170403902527" MODIFIED="1170403902527" TEXT="Para moverse a la parte inferior del sub-árbol actual, pulse RE. PÁG."/>
-<node CREATED="1170403902527" MODIFIED="1170403902527" TEXT="Para moverse al nodo central, pulse ESCAPE."/>
-<node CREATED="1170403902527" MODIFIED="1170403902527" TEXT="Para mover un nodo libremente, arrástrelo por la parte anterior a la caja del texto del nodo (aparecerá una especie de elipse), y en ese momento podrá ponerlo donde quiera."/>
+<node TEXT="Moverse en la aplicación" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1540212684" CREATED="1124560950732" MODIFIED="1170403896261" COLOR="#407000">
+<node TEXT="Para mover el cursor hacia arriba, abajo, izquierda ó derecha, utilice las teclas de desplazamiento." ID="Freeplane_Link_1237405295" CREATED="1170403902527" MODIFIED="1170403902527"/>
+<node TEXT="Para moverse a la parte superior del sub-árbol actual, pulse AV. PÁG." ID="ID_1522378861" CREATED="1170403902527" MODIFIED="1170403902527"/>
+<node TEXT="Para moverse a la parte inferior del sub-árbol actual, pulse RE. PÁG." ID="ID_526489756" CREATED="1170403902527" MODIFIED="1170403902527"/>
+<node TEXT="Para moverse al nodo central, pulse ESCAPE." ID="ID_1987074426" CREATED="1170403902527" MODIFIED="1170403902527"/>
+<node TEXT="Para mover un nodo libremente, arrástrelo por la parte anterior a la caja del texto del nodo (aparecerá una especie de elipse), y en ese momento podrá ponerlo donde quiera." ID="ID_1452720817" CREATED="1170403902527" MODIFIED="1170403902527"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_4727471" MODIFIED="1170403918527" POSITION="right" TEXT="Desplegar y Replegar (Doblar y desdoblar)">
-<node CREATED="1170403923714" ID="Freeplane_Link_308302871" MODIFIED="1170403923714" TEXT="Para replegar ó doblar un nodo, pulse ESPACIO, ó en el menú contextual de nodo utilice (Des)Activar Doblez."/>
-<node CREATED="1170403923714" MODIFIED="1170403923714" TEXT="Para desplegar ó desdoblar un nodo, pulse ESPACIO, ó en el menú contextual de nodo utilice (Des)Activar Doblez. Incluso, se puede desdoblar o desplegar con la tecla de desplazamiento en la dirección de despliegue. (P.e.: Para desplegar un nodo replegado que está a la derecha, con la tecla derecha se despliega."/>
-<node CREATED="1170403923714" MODIFIED="1170403923714" TEXT="Para replegar ó desplegar los nodos por niveles, mantenga pulsado ALT mientras utiliza la rueda del ratón, ó presione ALT+AV. PÁG ó ALT+RE. PÁG. Con mapas grandes, use esta función con cuidado, ya que pueden surgir problemas de memoria."/>
-<node CREATED="1170403923714" MODIFIED="1170403923714" TEXT="Para desplegar todo, pulse el botón gris “+” en la barra de principal, ó en el menú principal: Navegar-->Desdoblar Todos."/>
-<node CREATED="1170403923714" MODIFIED="1170403923714" TEXT="Para replegar ó doblar todo, pulse el botón gris “-” en la barra principal, ó en el menú principal: Navegar-->Doblar Todos."/>
-<node CREATED="1170403923714" MODIFIED="1170403923714" TEXT="Los nodos replegados ó doblados se señalan con un pequeño círculo en la dirección de la doblez."/>
+<node TEXT="Desplegar y Replegar (Doblar y desdoblar)" FOLDED="true" POSITION="right" ID="Freeplane_Link_4727471" CREATED="1124560950732" MODIFIED="1170403918527" COLOR="#407000">
+<node TEXT="Para replegar ó doblar un nodo, pulse ESPACIO, ó en el menú contextual de nodo utilice (Des)Activar Doblez." ID="Freeplane_Link_308302871" CREATED="1170403923714" MODIFIED="1170403923714"/>
+<node TEXT="Para desplegar ó desdoblar un nodo, pulse ESPACIO, ó en el menú contextual de nodo utilice (Des)Activar Doblez. Incluso, se puede desdoblar o desplegar con la tecla de desplazamiento en la dirección de despliegue. (P.e.: Para desplegar un nodo replegado que está a la derecha, con la tecla derecha se despliega." ID="ID_1397749400" CREATED="1170403923714" MODIFIED="1170403923714"/>
+<node TEXT="Para replegar ó desplegar los nodos por niveles, mantenga pulsado ALT mientras utiliza la rueda del ratón, ó presione ALT+AV. PÁG ó ALT+RE. PÁG. Con mapas grandes, use esta función con cuidado, ya que pueden surgir problemas de memoria." ID="ID_1882764810" CREATED="1170403923714" MODIFIED="1170403923714"/>
+<node TEXT="Para desplegar todo, pulse el botón gris “+” en la barra de principal, ó en el menú principal: Navegar-->Desdoblar Todos." ID="ID_1459813476" CREATED="1170403923714" MODIFIED="1170403923714"/>
+<node TEXT="Para replegar ó doblar todo, pulse el botón gris “-” en la barra principal, ó en el menú principal: Navegar-->Doblar Todos." ID="ID_466714158" CREATED="1170403923714" MODIFIED="1170403923714"/>
+<node TEXT="Los nodos replegados ó doblados se señalan con un pequeño círculo en la dirección de la doblez." ID="ID_1093848876" CREATED="1170403923714" MODIFIED="1170403923714"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_516331171" MODIFIED="1170403959449" POSITION="right" TEXT="Cambiar de mapas">
+<node TEXT="Cambiar de mapas" FOLDED="true" POSITION="right" ID="Freeplane_Link_516331171" CREATED="1124560950732" MODIFIED="1170403959449" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1490034065" MODIFIED="1170662218299" TEXT="Para cambiar a otro mapa mental ya abierto, haga click con el botón derecho en el fondo del mapa y seleccione un mapa diferente en el menú contextual.">
+<node TEXT="Para cambiar a otro mapa mental ya abierto, haga click con el botón derecho en el fondo del mapa y seleccione un mapa diferente en el menú contextual." ID="Freeplane_Link_1490034065" CREATED="1124560950732" MODIFIED="1170662218299">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_467411537" MODIFIED="1170403980402" POSITION="right" TEXT="Mover un mapa">
+<node TEXT="Mover un mapa" FOLDED="true" POSITION="right" ID="Freeplane_Link_467411537" CREATED="1124560950732" MODIFIED="1170403980402" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170403987433" ID="Freeplane_Link_822614761" MODIFIED="1170403987433" TEXT="Para mover el mapa, arrastre el fondo y muévalo, ó use la rueda del ratón. Para desplazarlo horizontalmente con la rueda, mantega pulsado SHIFT (MAYÚSCULAS) ó uno de los botones del ratón."/>
+<node TEXT="Para mover el mapa, arrastre el fondo y muévalo, ó use la rueda del ratón. Para desplazarlo horizontalmente con la rueda, mantega pulsado SHIFT (MAYÚSCULAS) ó uno de los botones del ratón." ID="Freeplane_Link_822614761" CREATED="1170403987433" MODIFIED="1170403987433"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913137192" MODIFIED="1170403999887" POSITION="right" TEXT="Hacer Zoom (Ampliar y reducir)">
-<node CREATED="1170404005637" ID="Freeplane_Link_1547290575" MODIFIED="1170404005637" TEXT="Para hacer zoom, utilice la rueda del ratón mientras presiona la tecla CTRL, ó presione ALT+ARRIBA ó ABAJO. Además, puede usar el campo de zoom en la lista desplegable de la barra principal (Al lado del icono de la impresora)."/>
+<node TEXT="Hacer Zoom (Ampliar y reducir)" FOLDED="true" POSITION="right" ID="Freeplane_Link_913137192" CREATED="1124560950732" MODIFIED="1170403999887" COLOR="#407000">
+<node TEXT="Para hacer zoom, utilice la rueda del ratón mientras presiona la tecla CTRL, ó presione ALT+ARRIBA ó ABAJO. Además, puede usar el campo de zoom en la lista desplegable de la barra principal (Al lado del icono de la impresora)." ID="Freeplane_Link_1547290575" CREATED="1170404005637" MODIFIED="1170404005637"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1318678369" MODIFIED="1170404020480" POSITION="right" TEXT="Deshacer cambios">
-<node CREATED="1170404027137" ID="Freeplane_Link_613644644" MODIFIED="1170404027137" TEXT="Para deshacer cambios, pulse CTRL+Z, ó en el menú principal, Editar-->Deshacer."/>
-<node CREATED="1170404027137" MODIFIED="1170404027137" TEXT="Para rehacer cambios, pulse CTRL+Y, ó en el menú principal, Editar-->Rehacer."/>
-<node CREATED="1170404027137" MODIFIED="1170404027137" TEXT="Para establecer el número de pasos para poder deshacer, utilice la opción Herramientas-->Preferencias (Preferences) del menú principal."/>
+<node TEXT="Deshacer cambios" FOLDED="true" POSITION="right" ID="Freeplane_Link_1318678369" CREATED="1124560950732" MODIFIED="1170404020480" COLOR="#407000">
+<node TEXT="Para deshacer cambios, pulse CTRL+Z, ó en el menú principal, Editar-->Deshacer." ID="Freeplane_Link_613644644" CREATED="1170404027137" MODIFIED="1170404027137"/>
+<node TEXT="Para rehacer cambios, pulse CTRL+Y, ó en el menú principal, Editar-->Rehacer." ID="ID_473232607" CREATED="1170404027137" MODIFIED="1170404027137"/>
+<node TEXT="Para establecer el número de pasos para poder deshacer, utilice la opción Herramientas-->Preferencias (Preferences) del menú principal." ID="ID_1826464309" CREATED="1170404027137" MODIFIED="1170404027137"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_22510332" MODIFIED="1170404045621" POSITION="right" TEXT="Exportar a HTML">
+<node TEXT="Exportar a HTML" FOLDED="true" POSITION="right" ID="Freeplane_Link_22510332" CREATED="1124560950732" MODIFIED="1170404045621" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170404051465" ID="Freeplane_Link_842904736" MODIFIED="1170404051465" TEXT="Para exportar una rama a HTML, pulse CTRL+H. La página HTML exportada puede contener soporte de ramificaciones o despliegues, dependiendo de la configuración de las preferencias."/>
-<node CREATED="1170404051465" MODIFIED="1170404051465" TEXT="Para usar otra función de exportación, utilice en el menú principal la opción Archivo-->Exportar-->Como XHTML (versión Javascript)."/>
-<node CREATED="1170404051465" MODIFIED="1170404051465" TEXT="Para exportar un mapa como una vista de imagen en HTML, utilice la opción Archivo-->Exportar-->Como XHTML (versión mapa seleccionable)."/>
+<node TEXT="Para exportar una rama a HTML, pulse CTRL+H. La página HTML exportada puede contener soporte de ramificaciones o despliegues, dependiendo de la configuración de las preferencias." ID="Freeplane_Link_842904736" CREATED="1170404051465" MODIFIED="1170404051465"/>
+<node TEXT="Para usar otra función de exportación, utilice en el menú principal la opción Archivo-->Exportar-->Como XHTML (versión Javascript)." ID="ID_280667853" CREATED="1170404051465" MODIFIED="1170404051465"/>
+<node TEXT="Para exportar un mapa como una vista de imagen en HTML, utilice la opción Archivo-->Exportar-->Como XHTML (versión mapa seleccionable)." ID="ID_1924456097" CREATED="1170404051465" MODIFIED="1170404051465"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1908686168" MODIFIED="1170404068871" POSITION="right" TEXT="Exportar a Imagen ó imagen vectorizada">
-<node CREATED="1170404074075" ID="Freeplane_Link_696364467" MODIFIED="1170404074075" TEXT="Para exportar el mapa como imagen PNG, utilice la opción Archivo-->Exportar-->Como PNG."/>
-<node CREATED="1170404074075" MODIFIED="1170404074075" TEXT="Para exportar el mapa como imagen JPEG, utilice la opción Archivo-->Exportar-->Como JPEG."/>
-<node CREATED="1170404074075" MODIFIED="1170404074075" TEXT="Para exportar el mapa como SVG, utilice la opción Archivo-->Exportar-->Como SVG. Esta opción sólo estará disponible si tiene instalado en su equipo el plugin de SVG."/>
+<node TEXT="Exportar a Imagen ó imagen vectorizada" FOLDED="true" POSITION="right" ID="Freeplane_Link_1908686168" CREATED="1124560950732" MODIFIED="1170404068871" COLOR="#407000">
+<node TEXT="Para exportar el mapa como imagen PNG, utilice la opción Archivo-->Exportar-->Como PNG." ID="Freeplane_Link_696364467" CREATED="1170404074075" MODIFIED="1170404074075"/>
+<node TEXT="Para exportar el mapa como imagen JPEG, utilice la opción Archivo-->Exportar-->Como JPEG." ID="ID_433157633" CREATED="1170404074075" MODIFIED="1170404074075"/>
+<node TEXT="Para exportar el mapa como SVG, utilice la opción Archivo-->Exportar-->Como SVG. Esta opción sólo estará disponible si tiene instalado en su equipo el plugin de SVG." ID="ID_1875409785" CREATED="1170404074075" MODIFIED="1170404074075"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_329770204" MODIFIED="1170404092059" POSITION="right" TEXT="Exportar a otros formatos XML">
-<node CREATED="1170404101012" ID="Freeplane_Link_1686469512" MODIFIED="1170404101012" TEXT="Para exportar el mapa a otros XML, de modo que obtenga una hoja de cálculo XSLT, utilice la opción Archivo-->Exportar-->Como XSLT."/>
-<node CREATED="1170404101012" MODIFIED="1170404101012" TEXT="Para exportar el mapa a un documento de OpenOffice Writer 1.4, utilice la opción Archivo-->Exportar-->As OpenOffice Writer Document (Como un documento de OpenOffice Writer)."/>
+<node TEXT="Exportar a otros formatos XML" FOLDED="true" POSITION="right" ID="Freeplane_Link_329770204" CREATED="1124560950732" MODIFIED="1170404092059" COLOR="#407000">
+<node TEXT="Para exportar el mapa a otros XML, de modo que obtenga una hoja de cálculo XSLT, utilice la opción Archivo-->Exportar-->Como XSLT." ID="Freeplane_Link_1686469512" CREATED="1170404101012" MODIFIED="1170404101012"/>
+<node TEXT="Para exportar el mapa a un documento de OpenOffice Writer 1.4, utilice la opción Archivo-->Exportar-->As OpenOffice Writer Document (Como un documento de OpenOffice Writer)." ID="ID_272334955" CREATED="1170404101012" MODIFIED="1170404101012"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1841136119" MODIFIED="1170404233263" POSITION="right" TEXT="Importar una estructura de carpetas">
+<node TEXT="Importar una estructura de carpetas" FOLDED="true" POSITION="right" ID="Freeplane_Link_1841136119" CREATED="1124560950732" MODIFIED="1170404233263" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1764451882" MODIFIED="1170404202950" TEXT="Para importar una estructura de carpetas, en el menú principal utilice Fichero-->Importar-->Estructura de carpetas. Se le preguntará sobre qué carpeta cuya estructura desea importar. Por estructura se entiende el árbol de todas los subcarpetas, con los enlaces a los ficheros de esas subcarpetas. Este sería un ejemplo."/>
-<node COLOR="#cc9900" CREATED="1170405208842" FOLDED="true" ID="Freeplane_Link_1904792824" MODIFIED="1170405350619" TEXT="Ejemplo">
-<node CREATED="1170405356830" ID="Freeplane_Link_973626144" MODIFIED="1170405536101" TEXT="Carpeta seleccionada --> file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS">
-<arrowlink DESTINATION="Freeplane_Link_973626144" ENDARROW="Default" ENDINCLINATION="0;0;" ID="Freeplane_Arrow_Link_237820159" STARTARROW="None" STARTINCLINATION="0;0;"/>
-</node>
-<node CREATED="1170405329320" FOLDED="true" ID="Freeplane_Link_482637031" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/" MODIFIED="1170405329320" TEXT="DBWIZ">
-<node CREATED="1170405329320" ID="Freeplane_Link_917890101" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/ASSETS.GIF" MODIFIED="1170405329335" TEXT="ASSETS.GIF"/>
-<node CREATED="1170405329335" ID="Freeplane_Link_1920637750" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/CONTACTS.GIF" MODIFIED="1170405329335" TEXT="CONTACTS.GIF"/>
-<node CREATED="1170405329335" ID="Freeplane_Link_52335184" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/EVTMGMT.GIF" MODIFIED="1170405329351" TEXT="EVTMGMT.GIF"/>
-<node CREATED="1170405329351" ID="Freeplane_Link_1267132541" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/EXPENSES.GIF" MODIFIED="1170405329351" TEXT="EXPENSES.GIF"/>
-<node CREATED="1170405329367" ID="Freeplane_Link_1821713435" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/INVENTRY.GIF" MODIFIED="1170405329367" TEXT="INVENTRY.GIF"/>
-<node CREATED="1170405329367" ID="Freeplane_Link_576748688" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/LEDGER.GIF" MODIFIED="1170405329367" TEXT="LEDGER.GIF"/>
-<node CREATED="1170405329367" ID="Freeplane_Link_1213533940" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/ORDPROC.GIF" MODIFIED="1170405329382" TEXT="ORDPROC.GIF"/>
-<node CREATED="1170405329382" ID="Freeplane_Link_806628245" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/RESOURCE.GIF" MODIFIED="1170405329382" TEXT="RESOURCE.GIF"/>
-<node CREATED="1170405329382" ID="Freeplane_Link_460118543" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/SERVICE.GIF" MODIFIED="1170405329398" TEXT="SERVICE.GIF"/>
-<node CREATED="1170405329398" ID="Freeplane_Link_12438217" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/DBWIZ/TIMEBILL.GIF" MODIFIED="1170405329398" TEXT="TIMEBILL.GIF"/>
-</node>
-<node CREATED="1170405329398" FOLDED="true" ID="Freeplane_Link_1899130473" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/" MODIFIED="1170405329413" TEXT="STYLES">
-<node CREATED="1170405329413" ID="Freeplane_Link_592922687" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/ACBLENDS.GIF" MODIFIED="1170405329413" TEXT="ACBLENDS.GIF"/>
-<node CREATED="1170405329413" ID="Freeplane_Link_146113010" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/ACBLUPRT.GIF" MODIFIED="1170405329429" TEXT="ACBLUPRT.GIF"/>
-<node CREATED="1170405329429" ID="Freeplane_Link_1339877706" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/ACEXPDTN.GIF" MODIFIED="1170405329429" TEXT="ACEXPDTN.GIF"/>
-<node CREATED="1170405329429" ID="Freeplane_Link_1772818073" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/ACINDSTR.GIF" MODIFIED="1170405329445" TEXT="ACINDSTR.GIF"/>
-<node CREATED="1170405329445" ID="Freeplane_Link_1143314187" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/ACRICEPR.GIF" MODIFIED="1170405329445" TEXT="ACRICEPR.GIF"/>
-<node CREATED="1170405329445" ID="Freeplane_Link_1692161100" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/ACSNDSTN.GIF" MODIFIED="1170405329445" TEXT="ACSNDSTN.GIF"/>
-<node CREATED="1170405329460" ID="Freeplane_Link_1569128746" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/ACSUMIPT.GIF" MODIFIED="1170405329460" TEXT="ACSUMIPT.GIF"/>
-<node CREATED="1170405329460" ID="Freeplane_Link_569631745" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/GLOBE.WMF" MODIFIED="1170405329460" TEXT="GLOBE.WMF"/>
-<node CREATED="1170405329476" ID="Freeplane_Link_345608504" LINK="file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS/STYLES/STONE.BMP" MODIFIED="1170405329476" TEXT="STONE.BMP"/>
-</node>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_269203785" MODIFIED="1170658741756" POSITION="right" TEXT="Importar los Favoritos de Internet Explorer">
-<edge WIDTH="thin"/>
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170658759990" ID="Freeplane_Link_1571419416" MODIFIED="1170658759990" TEXT="Para importar la carpeta favoritos de Microsoft Internet Explorer, utilice la siguiente opción del menú principal: Archivo-->Importar-->Favoritos del Explorer. Se le pedirá que indique la carpeta dónde están ubicados en su equipo. La ubicación suele ser: “c:\documents and settings\<usuario>\Favoritos\”"/>
-<node COLOR="#999999" CREATED="1170658759990" ID="Freeplane_Link_184137676" MODIFIED="1170658849395" TEXT="Palabras clave: Microsoft Internet Explorer, MSIE, MS IE.">
-<arrowlink DESTINATION="Freeplane_Link_184137676" ENDARROW="Default" ENDINCLINATION="0;0;" ID="Freeplane_Arrow_Link_218710848" STARTARROW="None" STARTINCLINATION="0;0;"/>
+<node TEXT="Para importar una estructura de carpetas, en el menú principal utilice Fichero-->Importar-->Estructura de carpetas. Se le preguntará sobre qué carpeta cuya estructura desea importar. Por estructura se entiende el árbol de todas los subcarpetas, con los enlaces a los ficheros de esas subcarpetas. Este sería un ejemplo." ID="Freeplane_Link_1764451882" CREATED="1124560950732" MODIFIED="1170404202950"/>
+<node TEXT="Ejemplo" FOLDED="true" ID="Freeplane_Link_1904792824" CREATED="1170405208842" MODIFIED="1170405350619" COLOR="#cc9900">
+<node TEXT="Carpeta seleccionada --> file:/C:/Archivos de programa/Microsoft Office 2003/OFFICE11/BITMAPS" ID="Freeplane_Link_973626144" CREATED="1170405356830" MODIFIED="1170405536101">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="Freeplane_Link_973626144" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+<node TEXT="DBWIZ" FOLDED="true" ID="Freeplane_Link_482637031" CREATED="1170405329320" MODIFIED="1170405329320" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/">
+<node TEXT="ASSETS.GIF" ID="Freeplane_Link_917890101" CREATED="1170405329320" MODIFIED="1170405329335" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/ASSETS.GIF"/>
+<node TEXT="CONTACTS.GIF" ID="Freeplane_Link_1920637750" CREATED="1170405329335" MODIFIED="1170405329335" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/CONTACTS.GIF"/>
+<node TEXT="EVTMGMT.GIF" ID="Freeplane_Link_52335184" CREATED="1170405329335" MODIFIED="1170405329351" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/EVTMGMT.GIF"/>
+<node TEXT="EXPENSES.GIF" ID="Freeplane_Link_1267132541" CREATED="1170405329351" MODIFIED="1170405329351" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/EXPENSES.GIF"/>
+<node TEXT="INVENTRY.GIF" ID="Freeplane_Link_1821713435" CREATED="1170405329367" MODIFIED="1170405329367" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/INVENTRY.GIF"/>
+<node TEXT="LEDGER.GIF" ID="Freeplane_Link_576748688" CREATED="1170405329367" MODIFIED="1170405329367" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/LEDGER.GIF"/>
+<node TEXT="ORDPROC.GIF" ID="Freeplane_Link_1213533940" CREATED="1170405329367" MODIFIED="1170405329382" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/ORDPROC.GIF"/>
+<node TEXT="RESOURCE.GIF" ID="Freeplane_Link_806628245" CREATED="1170405329382" MODIFIED="1170405329382" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/RESOURCE.GIF"/>
+<node TEXT="SERVICE.GIF" ID="Freeplane_Link_460118543" CREATED="1170405329382" MODIFIED="1170405329398" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/SERVICE.GIF"/>
+<node TEXT="TIMEBILL.GIF" ID="Freeplane_Link_12438217" CREATED="1170405329398" MODIFIED="1170405329398" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/DBWIZ/TIMEBILL.GIF"/>
+</node>
+<node TEXT="STYLES" FOLDED="true" ID="Freeplane_Link_1899130473" CREATED="1170405329398" MODIFIED="1170405329413" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/">
+<node TEXT="ACBLENDS.GIF" ID="Freeplane_Link_592922687" CREATED="1170405329413" MODIFIED="1170405329413" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/ACBLENDS.GIF"/>
+<node TEXT="ACBLUPRT.GIF" ID="Freeplane_Link_146113010" CREATED="1170405329413" MODIFIED="1170405329429" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/ACBLUPRT.GIF"/>
+<node TEXT="ACEXPDTN.GIF" ID="Freeplane_Link_1339877706" CREATED="1170405329429" MODIFIED="1170405329429" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/ACEXPDTN.GIF"/>
+<node TEXT="ACINDSTR.GIF" ID="Freeplane_Link_1772818073" CREATED="1170405329429" MODIFIED="1170405329445" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/ACINDSTR.GIF"/>
+<node TEXT="ACRICEPR.GIF" ID="Freeplane_Link_1143314187" CREATED="1170405329445" MODIFIED="1170405329445" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/ACRICEPR.GIF"/>
+<node TEXT="ACSNDSTN.GIF" ID="Freeplane_Link_1692161100" CREATED="1170405329445" MODIFIED="1170405329445" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/ACSNDSTN.GIF"/>
+<node TEXT="ACSUMIPT.GIF" ID="Freeplane_Link_1569128746" CREATED="1170405329460" MODIFIED="1170405329460" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/ACSUMIPT.GIF"/>
+<node TEXT="GLOBE.WMF" ID="Freeplane_Link_569631745" CREATED="1170405329460" MODIFIED="1170405329460" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="Freeplane_Link_345608504" CREATED="1170405329476" MODIFIED="1170405329476" LINK="file:/C:/Archivos%20de%20programa/Microsoft%20Office%202003/OFFICE11/BITMAPS/STYLES/STONE.BMP"/>
+</node>
+</node>
+</node>
+<node TEXT="Importar los Favoritos de Internet Explorer" FOLDED="true" POSITION="right" ID="Freeplane_Link_269203785" CREATED="1124560950732" MODIFIED="1170658741756" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Para importar la carpeta favoritos de Microsoft Internet Explorer, utilice la siguiente opción del menú principal: Archivo-->Importar-->Favoritos del Explorer. Se le pedirá que indique la carpeta dónde están ubicados en su equipo. La ubicación suele ser: “c:\documents and settings\<usuario>\Favoritos\”" ID="Freeplane_Link_1571419416" CREATED="1170658759990" MODIFIED="1170658759990"/>
+<node TEXT="Palabras clave: Microsoft Internet Explorer, MSIE, MS IE." ID="Freeplane_Link_184137676" CREATED="1170658759990" MODIFIED="1170658849395" COLOR="#999999">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="Freeplane_Link_184137676" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1709974530" MODIFIED="1170661959523" POSITION="right" TEXT="Importar mapas mentales de MindManager X5">
-<node CREATED="1170658887175" ID="Freeplane_Link_281596646" MODIFIED="1170658887175" TEXT="Para importar un mapa de MindManager X5, utilice la opción del menú principal: Archivo-->Importar-->MindManager X5 map."/>
+<node TEXT="Importar mapas mentales de MindManager X5" FOLDED="true" POSITION="right" ID="Freeplane_Link_1709974530" CREATED="1124560950732" MODIFIED="1170661959523" COLOR="#407000">
+<node TEXT="Para importar un mapa de MindManager X5, utilice la opción del menú principal: Archivo-->Importar-->MindManager X5 map." ID="Freeplane_Link_281596646" CREATED="1170658887175" MODIFIED="1170658887175"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913645795" MODIFIED="1170658902269" POSITION="right" TEXT="Integración con Microsoft Word ó Outlook">
+<node TEXT="Integración con Microsoft Word ó Outlook" FOLDED="true" POSITION="right" ID="Freeplane_Link_913645795" CREATED="1124560950732" MODIFIED="1170658902269" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170658910394" ID="Freeplane_Link_1195798098" MODIFIED="1170658910394" TEXT="Puede pegar mapas ó ramas en Microsoft Word, Wordmap ó mensajes de Outlook. En general, puede pegarlo en cualquier aplicación que soporte el formato de texto enriquecido. De ese modo, los enlaces y el formato del texto se mantendrá."/>
-<node CREATED="1170658910394" LINK="mailto:(mailto:usuario at correo.com)" MODIFIED="1170658910394" TEXT="Haciendo click en un enlace de correo electrónico (mailto:usuario at correo.com) se abrirá Microsoft Outlook para crear un nuevo mensaje, ó el programa de correo electrónico establecido por defecto."/>
-<node CREATED="1170658910394" ID="Freeplane_Link_1391168579" MODIFIED="1170658942034" TEXT="Puede poner el asunto en el enlace de correo.">
+<node TEXT="Puede pegar mapas ó ramas en Microsoft Word, Wordmap ó mensajes de Outlook. En general, puede pegarlo en cualquier aplicación que soporte el formato de texto enriquecido. De ese modo, los enlaces y el formato del texto se mantendrá." ID="Freeplane_Link_1195798098" CREATED="1170658910394" MODIFIED="1170658910394"/>
+<node TEXT="Haciendo click en un enlace de correo electrónico (mailto:usuario at correo.com) se abrirá Microsoft Outlook para crear un nuevo mensaje, ó el programa de correo electrónico establecido por defecto." ID="ID_635197281" CREATED="1170658910394" MODIFIED="1170658910394" LINK="mailto:(mailto:usuario at correo.com)"/>
+<node TEXT="Puede poner el asunto en el enlace de correo." ID="Freeplane_Link_1391168579" CREATED="1170658910394" MODIFIED="1170658942034">
<icon BUILTIN="Mail"/>
</node>
-<node CREATED="1170658910394" ID="Freeplane_Link_1826214858" MODIFIED="1170662230814" TEXT="Otra manera de copiar un mapa mental a Microsoft Word es exportándolo a HTML y después copiar y pegarlo en Word."/>
+<node TEXT="Otra manera de copiar un mapa mental a Microsoft Word es exportándolo a HTML y después copiar y pegarlo en Word." ID="Freeplane_Link_1826214858" CREATED="1170658910394" MODIFIED="1170662230814"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1822195277" MODIFIED="1170658962190" POSITION="right" TEXT="Configurar las preferencias">
+<node TEXT="Configurar las preferencias" FOLDED="true" POSITION="right" ID="Freeplane_Link_1822195277" CREATED="1124560950732" MODIFIED="1170658962190" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170658981392" ID="Freeplane_Link_1506877434" MODIFIED="1170658981392" TEXT="Para editar las preferencias, utilice el menú principal: Herramientas-->Preferencias. La mayoría de los cambios surtirán efecto cuando reinicie Freeplane."/>
-<node CREATED="1170658981392" MODIFIED="1170658981392" TEXT="Las preferencias incluyen mapeo de teclas, comportamientos al exportar a HTML, el modo de selección de nodos mediante ratón, elegir antialising (mejorar pixelado de los mapas), etc."/>
-<node COLOR="#999999" CREATED="1170658981392" ID="Freeplane_Link_1861005230" MODIFIED="1170659009079" TEXT="Palabra clave: Customizing.">
+<node TEXT="Para editar las preferencias, utilice el menú principal: Herramientas-->Preferencias. La mayoría de los cambios surtirán efecto cuando reinicie Freeplane." ID="Freeplane_Link_1506877434" CREATED="1170658981392" MODIFIED="1170658981392"/>
+<node TEXT="Las preferencias incluyen mapeo de teclas, comportamientos al exportar a HTML, el modo de selección de nodos mediante ratón, elegir antialising (mejorar pixelado de los mapas), etc." ID="ID_1156010395" CREATED="1170658981392" MODIFIED="1170658981392"/>
+<node TEXT="Palabra clave: Customizing." ID="Freeplane_Link_1861005230" CREATED="1170658981392" MODIFIED="1170659009079" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1528828442" MODIFIED="1170659031313" POSITION="right" TEXT="Imprimir">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170659046235" ID="Freeplane_Link_648343751" MODIFIED="1170659046235" TEXT="Puede imprimir un mapa ajustándolo a una página, como imprimiéndolo en varios trozos de papel. Esta opción se puede establecer en el menú: Archivo-->Configurar Página."/>
-<node CREATED="1170659046235" MODIFIED="1170659046235" TEXT="Para hacer mejor uso del espacio, utilice el formato horizontal de página ó apaisado."/>
-<node CREATED="1170659046235" MODIFIED="1170659046235" TEXT="La previsualización del mapa impreso no se puede hacer directamente. Si tiene una impresora postscript ó driver genérico postscript, puede imprimir el mapa a un fichero y después verlo con Ghostview ó aplicaciones similares (Adobe PDF). Si lo imprime con una empresa no entienda Postscript (PS), posiblemente el formato sea PCL, que no le servirá para la previsualización."/>
-<node CREATED="1170659046235" MODIFIED="1170659046235" TEXT="También puede imprimirlo desde su navegador, exportando el mapa a HTML, a Word ó WordPad después de copiarlo y pegarlo allí. También lo puede exportar a HTML, copiarlo y pegarlo a Microsoft Word e imprimirlo desde allí. De ese modo podrá hacer también modificaciones de estilos."/>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_841140408" MODIFIED="1170659084531" POSITION="right" TEXT="Usar texto enriquecido por medio de HTML en los nodos">
-<node CREATED="1124560950732" ID="Freeplane_Link_229410555" MODIFIED="1170659119233" TEXT="Los nodos que comienzan con <html> son renderizados ó construidos usando HTML en ellos. Esta característica le será de gran ayuda para personas de perfil técnico. Ejemplo:"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_926533297" MODIFIED="1170659293886" TEXT="<html>
 <head>
 
 </head>
 <body>
 <h3>
 Ejemplo HTML
 </h3>
 <p class="msonormal">
 Hay varios elementos:
 </p>
 <ul type="disc">
 <li class="msonormal">
 Elemento 1
 </li>
 <li class=&quo [...]
-<node BACKGROUND_COLOR="#66ff66" CREATED="1170659095078" ID="Freeplane_Link_697302079" MODIFIED="1170659349682" TEXT="Podemos tener varios colores de fondo."/>
-<node CREATED="1170659095078" ID="Freeplane_Link_1287825225" MODIFIED="1170662241845" TEXT="No hay soporte para para nodos HTML e imágenes exportando a texto ó a RTF (Word, Wordpad). Por ello, es conveniente hacer uso del applet para mostrar vía web HTML un mapa mental."/>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1325373651" MODIFIED="1170659376494" POSITION="right" TEXT="Usar imágenes en nodos">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170659386072" ID="Freeplane_Link_833228264" MODIFIED="1170659386072" TEXT="Para insertar una imagen en Freeplane, pulse ALT+K, ó en el menú contextual de nodo, use Insertar-->Imagen. Si inserta una imagen en un nodo, perderá todo el texto del mismo. Las imágenes insertadas de este modo, no podrán fácilmente pegadas fuera de Freeplane y no necesariamente se exportarán correctamente a HTML. Las imágenes son una característica [...]
-<node CREATED="1170659386072" MODIFIED="1170659386072" TEXT="Los formatos de imágenes soportados son PNG, JPEG y GIF."/>
-<node CREATED="1170659386072" MODIFIED="1170659386072" TEXT="Para convertir enlaces de imágenes, a imágenes visibles, pulse ALT+K. Podrá arrastrar y soltar varios ficheros de imágenes a Freeplane, seleccionándolas como nodos múltiples, y convirtiéndolas en imágenes presionando ALT+K."/>
-<node CREATED="1170659386072" MODIFIED="1170659386072" TEXT="Existe otro modo de insertar imágenes más técnico y menos sencillo de hacer. Es posible incluir HTML en nodos, de modo que si se incluyen imágenes allí, comenzando el nodo con la palabra <html>, lo lograríamos."/>
-<node CREATED="1170659386072" ID="Freeplane_Link_1490826264" MODIFIED="1170659481852" TEXT="Por ejemplo
<html><img src="linked/Apple.png">
<html><img src="file://C://Users/My Documents/Mind Maps/Linked/Apple.png">"/>
-<node CREATED="1170659386072" MODIFIED="1170659386072" TEXT="Puede enlace a imágenes con path relativos (Como en el ejemplo 1)."/>
-<node COLOR="#996600" CREATED="1170659386072" FOLDED="true" ID="Freeplane_Link_760617188" MODIFIED="1170660121542" TEXT="Ejemplo de imágenes, funcionando sobre varias distribuciones de Windows">
-<font BOLD="true" NAME="SansSerif" SIZE="12"/>
-<node CREATED="1170659886641" ID="Freeplane_Link_1832742863" MODIFIED="1170659933843" TEXT="<html><img src="file:/C:/Archivos de programa/Freeplane/doc/freeplane_dragdrop_small.gif">"/>
-<node CREATED="1170659993045" ID="Freeplane_Link_1808501808" MODIFIED="1170660033263" TEXT="<html><img src="file:/C:/Archivos de programa/Freeplane/doc/MindmapExample.png">"/>
-<node CREATED="1170660129605" ID="Freeplane_Link_308307832" LINK="freeplane_dragdrop_small.gif" MODIFIED="1170660732421" TEXT="freeplane_dragdrop_small.gif"/>
-<node CREATED="1170660745374" ID="Freeplane_Link_341958438" LINK="MindmapExample.png" MODIFIED="1170660769546" TEXT="MindmapExample.png"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_538720495" MODIFIED="1170660804545" POSITION="right" TEXT="Usar el bloque de ficheros (Experimental)">
-<node CREATED="1170660815888" ID="Freeplane_Link_765143806" MODIFIED="1170660815888" TEXT="La versión actual de Freeplane tiene una característica experimental, deshabilitada por defecto. Debería funcionar bien, pero no está totalmente depurada."/>
-<node CREATED="1170660815888" MODIFIED="1170660815888" TEXT="El bloqueo de ficheros sirve para prevenir problemas de sobreescritura, cuando dos usuarios editan el mismo mapa al mismo tiempo."/>
-<node CREATED="1170660815888" MODIFIED="1170660815888" TEXT="Para habilitar el bloque de ficheros experimental, utilice el menú principal Herramientas-->Preferences (Preferencias)."/>
+<node TEXT="Imprimir" FOLDED="true" POSITION="right" ID="Freeplane_Link_1528828442" CREATED="1124560950732" MODIFIED="1170659031313" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Puede imprimir un mapa ajustándolo a una página, como imprimiéndolo en varios trozos de papel. Esta opción se puede establecer en el menú: Archivo-->Configurar Página." ID="Freeplane_Link_648343751" CREATED="1170659046235" MODIFIED="1170659046235"/>
+<node TEXT="Para hacer mejor uso del espacio, utilice el formato horizontal de página ó apaisado." ID="ID_1119430838" CREATED="1170659046235" MODIFIED="1170659046235"/>
+<node TEXT="La previsualización del mapa impreso no se puede hacer directamente. Si tiene una impresora postscript ó driver genérico postscript, puede imprimir el mapa a un fichero y después verlo con Ghostview ó aplicaciones similares (Adobe PDF). Si lo imprime con una empresa no entienda Postscript (PS), posiblemente el formato sea PCL, que no le servirá para la previsualización." ID="ID_783050821" CREATED="1170659046235" MODIFIED="1170659046235"/>
+<node TEXT="También puede imprimirlo desde su navegador, exportando el mapa a HTML, a Word ó WordPad después de copiarlo y pegarlo allí. También lo puede exportar a HTML, copiarlo y pegarlo a Microsoft Word e imprimirlo desde allí. De ese modo podrá hacer también modificaciones de estilos." ID="ID_138283486" CREATED="1170659046235" MODIFIED="1170659046235"/>
+</node>
+<node TEXT="Usar texto enriquecido por medio de HTML en los nodos" FOLDED="true" POSITION="right" ID="Freeplane_Link_841140408" CREATED="1124560950732" MODIFIED="1170659084531" COLOR="#407000">
+<node TEXT="Los nodos que comienzan con <html> son renderizados ó construidos usando HTML en ellos. Esta característica le será de gran ayuda para personas de perfil técnico. Ejemplo:" ID="Freeplane_Link_229410555" CREATED="1124560950732" MODIFIED="1170659119233"/>
+<node ID="Freeplane_Link_926533297" CREATED="1124560950732" MODIFIED="1170659293886"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <h3>
+ Ejemplo HTML
+ </h3>
+ <p class="msonormal">
+ Hay varios elementos:
+ </p>
+ <ul type="disc">
+ <li class="msonormal">
+ Elemento 1
+ </li>
+ <li class="msonormal">
+ Elemento 2
+ </li>
+ </ul>
+ <p class="msonormal">
+ Y puede tener <b>negrita</b> ó <i>cursiva</i>. <u>Subrayado</u> ó <strike>tachado</strike> también. Puede tener una tabla:
+ </p>
+ <table cellpadding="0" class="msonormaltable" border="1" cellspacing="0" style="border-top-color: border-color; border-top-style: none; border-top-width: medium; border-right-color: border-color; border-right-style: none; border-right-width: medium; border-bottom-color: border-color; border-bottom-style: none; border-bottom-width: medium; border-left-color: border-color; border-left-style: none; border-left-width: medium">
+ <tr>
+ <td style="padding-left: .75pt; padding-right: .75pt; padding-bottom: .75pt; padding-top: .75pt">
+ <p class="msonormal">
+ Celda1
+ </p>
+ </td>
+ <td style="border-left-color: border-color; border-left-style: none; border-left-width: medium; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
+ <p class="msonormal">
+ Celda2
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td style="border-top-color: border-color; border-top-style: none; border-top-width: medium; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
+ <p class="msonormal">
+ Celda3
+ </p>
+ </td>
+ <td style="border-top-color: border-color; border-top-style: none; border-top-width: medium; border-left-color: border-color; border-left-style: none; border-left-width: medium; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
+ <p class="msonormal">
+ Celda4.
+ </p>
+ </td>
+ </tr>
+ </table>
+ <p class="msonormal">
+ Puede tener varios colores de <font color="#999900">letra</font> .
+ </p>
+ </body>
+</html>
+
+</richcontent>
+</node>
+<node TEXT="Podemos tener varios colores de fondo." ID="Freeplane_Link_697302079" CREATED="1170659095078" MODIFIED="1170659349682" BACKGROUND_COLOR="#66ff66"/>
+<node TEXT="No hay soporte para para nodos HTML e imágenes exportando a texto ó a RTF (Word, Wordpad). Por ello, es conveniente hacer uso del applet para mostrar vía web HTML un mapa mental." ID="Freeplane_Link_1287825225" CREATED="1170659095078" MODIFIED="1170662241845"/>
+</node>
+<node TEXT="Usar imágenes en nodos" FOLDED="true" POSITION="right" ID="Freeplane_Link_1325373651" CREATED="1124560950732" MODIFIED="1170659376494" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Para insertar una imagen en Freeplane, pulse ALT+K, ó en el menú contextual de nodo, use Insertar-->Imagen. Si inserta una imagen en un nodo, perderá todo el texto del mismo. Las imágenes insertadas de este modo, no podrán fácilmente pegadas fuera de Freeplane y no necesariamente se exportarán correctamente a HTML. Las imágenes son una característica en versión beta dentro de esta versión de Freeplane." ID="Freeplane_L [...]
+<node TEXT="Los formatos de imágenes soportados son PNG, JPEG y GIF." ID="ID_1501233865" CREATED="1170659386072" MODIFIED="1170659386072"/>
+<node TEXT="Para convertir enlaces de imágenes, a imágenes visibles, pulse ALT+K. Podrá arrastrar y soltar varios ficheros de imágenes a Freeplane, seleccionándolas como nodos múltiples, y convirtiéndolas en imágenes presionando ALT+K." ID="ID_101360059" CREATED="1170659386072" MODIFIED="1170659386072"/>
+<node TEXT="Existe otro modo de insertar imágenes más técnico y menos sencillo de hacer. Es posible incluir HTML en nodos, de modo que si se incluyen imágenes allí, comenzando el nodo con la palabra <html>, lo lograríamos." ID="ID_122465215" CREATED="1170659386072" MODIFIED="1170659386072"/>
+<node TEXT="Por ejemplo
<html><img src="linked/Apple.png">
<html><img src="file://C://Users/My Documents/Mind Maps/Linked/Apple.png">" ID="Freeplane_Link_1490826264" CREATED="1170659386072" MODIFIED="1170659481852"/>
+<node TEXT="Puede enlace a imágenes con path relativos (Como en el ejemplo 1)." ID="ID_1569498076" CREATED="1170659386072" MODIFIED="1170659386072"/>
+<node TEXT="Ejemplo de imágenes, funcionando sobre varias distribuciones de Windows" FOLDED="true" ID="Freeplane_Link_760617188" CREATED="1170659386072" MODIFIED="1170660121542" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="true"/>
+<node ID="Freeplane_Link_1832742863" CREATED="1170659886641" MODIFIED="1170659933843"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/C:/Archivos de programa/Freeplane/doc/freeplane_dragdrop_small.gif"/>
+ </body>
+</html>
+
+</richcontent>
+</node>
+<node ID="Freeplane_Link_1808501808" CREATED="1170659993045" MODIFIED="1170660033263"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/C:/Archivos de programa/Freeplane/doc/MindmapExample.png"/>
+ </body>
+</html>
+
+</richcontent>
+</node>
+<node TEXT="freeplane_dragdrop_small.gif" ID="Freeplane_Link_308307832" CREATED="1170660129605" MODIFIED="1170660732421" LINK="freeplane_dragdrop_small.gif"/>
+<node TEXT="MindmapExample.png" ID="Freeplane_Link_341958438" CREATED="1170660745374" MODIFIED="1170660769546" LINK="MindmapExample.png"/>
+</node>
+</node>
+<node TEXT="Usar el bloque de ficheros (Experimental)" FOLDED="true" POSITION="right" ID="Freeplane_Link_538720495" CREATED="1124560950732" MODIFIED="1170660804545" COLOR="#407000">
+<node TEXT="La versión actual de Freeplane tiene una característica experimental, deshabilitada por defecto. Debería funcionar bien, pero no está totalmente depurada." ID="Freeplane_Link_765143806" CREATED="1170660815888" MODIFIED="1170660815888"/>
+<node TEXT="El bloqueo de ficheros sirve para prevenir problemas de sobreescritura, cuando dos usuarios editan el mismo mapa al mismo tiempo." ID="ID_956414327" CREATED="1170660815888" MODIFIED="1170660815888"/>
+<node TEXT="Para habilitar el bloque de ficheros experimental, utilice el menú principal Herramientas-->Preferences (Preferencias)." ID="ID_1652290727" CREATED="1170660815888" MODIFIED="1170660815888"/>
</node>
</node>
</map>
diff --git a/freeplane/doc/freeplane_et.mm b/freeplane/doc/freeplane_et.mm
index 1614620..841a191 100644
--- a/freeplane/doc/freeplane_et.mm
+++ b/freeplane/doc/freeplane_et.mm
@@ -1,1546 +1,809 @@
-<map version="0.9.0">
-<!-- To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node COLOR="#993300" CREATED="1124560950701" ID="ID_251547339" MODIFIED="1216187545281">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body width="">
- <p align="center">
- Freeplane<br /><small>- vabade mõtete kaardistamise tarkvara -</small>
- </p>
- </body>
-</html></richcontent>
-<font BOLD="true" NAME="Dialog" SIZE="18"/>
-<node CREATED="1124560950701" ID="ID_228039332" LINK="http://freeplane.sourceforge.net/" MODIFIED="1216250158741" POSITION="left" TEXT="Freeplane-i koduleht">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1091417446" MODIFIED="1216258652672" POSITION="left" TEXT="Kiirklahvikombinatsioonid">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_908986002" MODIFIED="1216258628092">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Failikäsud:
- </p>
- <p>
- ***********
- </p>
- <p>
- Uus kaart CTRL+N
- </p>
- <p>
- Ava kaart CTRL+O
- </p>
- <p>
- Salvesta kaart CTRL+S
- </p>
- <p>
- Salvesta kaart kui CTRL+SHIFT+S
- </p>
- <p>
- Trüki CTRL+P
- </p>
- <p>
- Sulge CTRL+W
- </p>
- <p>
- Välju CTRL+Q
- </p>
- <p>
- Eelmine kaart ALT+SHIFT+nool vasakule
- </p>
- <p>
- Järgmine kaart ALT+SHIFT+nool paremale
- </p>
- <p>
- Ekspordi HTML-ina CTRL+E
- </p>
- <p>
- Ekspordi haru HTML-ina CTRL+H
- </p>
- <p>
- Ekspordi haru uude MM-faili ALT+SHIFT+A
- </p>
- <p>
- Ava esimene fail ajaloost CTRL+SHIFT+W
- </p>
- <p>
-
- </p>
- <p>
-
- </p>
- <p>
- Muutmise käsud:
- </p>
- <p>
- ***************
- </p>
- <p>
- Otsi CTRL+F
- </p>
- <p>
- Otsi järgmine CTRL+G
- </p>
- <p>
- Lõika CTRL+X
- </p>
- <p>
- Vali kõik CTRL+A
- </p>
- <p>
- Vali haru CTRL+SHIFT+A
- </p>
- <p>
- Kopeeri CTRL+C
- </p>
- <p>
- Kopeeri üksik CTRL+Y
- </p>
- <p>
- Aseta CTRL+V
- </p>
- <p>
- Võta tagasi CTRL+Z
- </p>
- <p>
- Tee uuesti CTRL+Y
- </p>
- <p>
- Suurenda ALT+nool alla
- </p>
- <p>
- Vähenda ALT + nool üles
- </p>
- <p>
-
- </p>
- <p>
- Sõlmede vormindamise käsud:
- </p>
- <p>
- ***************************
- </p>
- <p>
- Kaldkiri CTRL+I
- </p>
- <p>
- Rasvane kiri CTRL+B
- </p>
- <p>
- Allajoonitud kiri CTRL+U
- </p>
- <p>
- Pilv ümber sõlme CTRL+SHIFT+B
- </p>
- <p>
- Sõlme värvi muutmine ALT+C
- </p>
- <p>
- Sõlme värvi segamine ALT+B
- </p>
- <p>
- Sõlme serva värvi muutmine ALT+E
- </p>
- <p>
- Suurenda sõlme kirjakuju suurust CTRL+L
- </p>
- <p>
- Vähenda sõlme kirjakuju suurust CTRL+M
- </p>
- <p>
- Suurenda sõlmede haru kirjakuju suurust CTRL+SHIFT+L
- </p>
- <p>
- Vähenda sõlmede haru kirjakuju suurust CTRL+SHIFT+M
- </p>
- <p>
-
- </p>
- <p>
- Sõlmede navigeerimise käsud:
- </p>
- <p>
- ****************************
- </p>
- <p>
- Mine juursõlme juurde ESCAPE
- </p>
- <p>
- Liigu üles nooleklahv üles
- </p>
- <p>
- Liigu alla nooleklahv alla
- </p>
- <p>
- Liigu vasakule nooleklahv vasakule
- </p>
- <p>
- Liigu paremale nooleklahv paremale
- </p>
- <p>
- Ava internetiviide CTRL+ENTER
- </p>
- <p>
- Vähenda ALT+NOOL ÜLES
- </p>
- <p>
- Suurenda ALT+NOOL ALLA
- </p>
- <p>
-
- </p>
- <p>
- Uue sõlme käsud:
- </p>
- <p>
- ****************
- </p>
- <p>
- Uus sõlm peasõlme külge ENTER
- </p>
- <p>
- Uus sõlm olemasoleva alla INSERT
- </p>
- <p>
- Uus sõlm olemasoleva ette SHIFT+ENTER
- </p>
- <p>
-
- </p>
- <p>
- Sõlme muutmise käsud:
- </p>
- <p>
- *********************
- </p>
- <p>
- Muuda valitud sõlme F2
- </p>
- <p>
- Muuda hüpikaknas koos lisavõimalustega ALT+ENTER
- </p>
- <p>
- Ühenda sõlmed CTRL+J
- </p>
- <p>
- Lülita sõlmede voltimist TÜHIK
- </p>
- <p>
- Lülita alamsõlmede voltimist CTRL+TÜHIK
- </p>
- <p>
- Lisa viide lehitsemisakna kaudu CTRL+SHIFT+K
- </p>
- <p>
- Lisa viide käsitsi aadressi sisestades CTRL+K
- </p>
- <p>
- Lisa pilt lehitsemisakna kaudu ALT+K
- </p>
- <p>
- Liiguta sõlme ülespoole CTRL+nooleklahv üles
- </p>
- <p>
- Liiguta sõlme allapoole CTRL+nooleklahv alla
- </p>
- <p>
- Liiguta sõlme vasakule CTRL+nooleklahv vasakule
- </p>
- <p>
- Liiguta sõlme paremale CTRL+nooleklahv paremale
- </p>
- <p>
- Kustuta sõlm DELETE
- </p>
- </body>
-</html></richcontent>
+<map version="freeplane 1.5.9">
+<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node TEXT="<html>
 <head>
 
 </head>
 <body width="">
 <p align="center">
 Freeplane<br ><small>- vabade mõtete kaardistamise tarkvara -</small> 
 </p>
 </body>
</html>" FOLDED="false" ID="ID_251547339" CREATED="1124560950701" MODIFIED="1216187545281" COLOR="#993300">
+<font NAME="Dialog" SIZE="18" BOLD="true"/>
+<hook NAME="MapStyle">
+ <properties fit_to_viewport="false;"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" FORMAT="NO_FORMAT" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="true" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#ffffff">
+<font SIZE="9"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" UNIFORM_SHAPE="true" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font SIZE="24" ITALIC="true"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2">
+<edge COLOR="#ff0033"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3">
+<edge COLOR="#009933"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4">
+<edge COLOR="#3333ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#ff6600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<node TEXT="Freeplane-i koduleht" POSITION="left" ID="ID_228039332" CREATED="1124560950701" MODIFIED="1216250158741" LINK="http://freeplane.sourceforge.net/">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Kiirklahvikombinatsioonid" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1091417446" CREATED="1124560950701" MODIFIED="1216258652672" COLOR="#006699">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Failikäsud:
 </p>
 <p>
 ***********
 </p>
 <p>
 Uus kaart CTRL+N
 </p>
 <p>
 Ava kaart CTRL+O
 </p>
 <p>
 Salvesta kaart CTRL+S
 </p>
 <p>
 Salvesta kaart kui CTRL+SHIFT+S
 </p&g [...]
<font NAME="Courier New" SIZE="12"/>
</node>
</node>
-<node COLOR="#006633" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_904501221" MODIFIED="1216201160402" POSITION="left" TEXT="Paigaldamine">
+<node TEXT="Paigaldamine" FOLDED="true" POSITION="left" ID="_Freeplane_Link_904501221" CREATED="1124560950701" MODIFIED="1216201160402" COLOR="#006633">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1911559485" MODIFIED="1216200835990" TEXT="Viited">
+<node TEXT="Viited" FOLDED="true" ID="_Freeplane_Link_1911559485" CREATED="1124560950701" MODIFIED="1216200835990" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_568439776" LINK="http://java.sun.com/javase/downloads/index.jsp" MODIFIED="1216187545266" TEXT="Laadi alla Java Runtime Environment (vähemalt JRE1.4 või uuem)">
+<node TEXT="Laadi alla Java Runtime Environment (vähemalt JRE1.4 või uuem)" ID="ID_568439776" CREATED="1124560950701" MODIFIED="1216187545266" LINK="http://java.sun.com/javase/downloads/index.jsp">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1612101865" LINK="http://freeplane.sourceforge.net/wiki/index.php/Download#Download" MODIFIED="1216187545266" TEXT="Laadi alla programm Freeplane">
+<node TEXT="Laadi alla programm Freeplane" ID="_Freeplane_Link_1612101865" CREATED="1124560950701" MODIFIED="1216187545266" LINK="http://freeplane.sourceforge.net/wiki/index.php/Download#Download">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_139664576" MODIFIED="1216187545266">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Freeplane-i paigaldamiseks MS Windows-is paigalda esmalt Sun-i Java Runtime Environment (JRE) ning seejärel Freeplane kasutades "installer" versiooni.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Freeplane-i paigaldamiseks MS Windows-is paigalda esmalt Sun-i Java Runtime Environment (JRE) ning seejärel Freeplane kasutades "installer" versiooni.
 </p>
 </body>
</html>" ID="_Freeplane_Link_139664576" CREATED="1124560950701" MODIFIED="1216187545266">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1380352758" MODIFIED="1216187545266">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Freeplane-i paigaldamiseks Linuxis, paigalda esmalt Sun-i Java Runtime Environment (JRE) ning siis peale lahtipakkimist käivita Freeplane failist freeplane.sh
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Freeplane-i paigaldamiseks Linuxis, paigalda esmalt Sun-i Java Runtime Environment (JRE) ning siis peale lahtipakkimist käivita Freeplane failist freeplane.sh
 </p>
 </body>
</html>" ID="_Freeplane_Link_1380352758" CREATED="1124560950701" MODIFIED="1216187545266">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1808511462" MODIFIED="1216187545266">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- MS Windows-is ning Mac OS X-s võib Freeplane-i käivitamiseks teha ka topeltklõps failil freeplane.jar, mis asub kataloogis lib.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 MS Windows-is ning Mac OS X-s võib Freeplane-i käivitamiseks teha ka topeltklõps failil freeplane.jar, mis asub kataloogis lib.
 </p>
 </body>
</html>" ID="_Freeplane_Link_1808511462" CREATED="1124560950701" MODIFIED="1216187545266">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_353522063" MODIFIED="1216201160403" POSITION="left" TEXT="Failide lehitsemine arvutist">
+<node TEXT="Failide lehitsemine arvutist" FOLDED="true" POSITION="left" ID="_Freeplane_Link_353522063" CREATED="1124560950701" MODIFIED="1216201160403" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_649040499" MODIFIED="1216187545265" TEXT="Failide lehitsemiseks oma arvutist lülitu ümber failirežiimile, valides rippmenüüst Kaardid > Fail.">
+<node TEXT="Failide lehitsemiseks oma arvutist lülitu ümber failirežiimile, valides rippmenüüst Kaardid > Fail." ID="ID_649040499" CREATED="1124560950701" MODIFIED="1216187545265">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1036346569" MODIFIED="1216187545265" TEXT="Sa lehitsed failipuud nagu see oleks mõttekaart.">
+<node TEXT="Sa lehitsed failipuud nagu see oleks mõttekaart." ID="ID_1036346569" CREATED="1124560950701" MODIFIED="1216187545265">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1489978112" MODIFIED="1216187545265" TEXT="Kataloogi määramiseks keskele kõige suuremaks sõlmeks, vali sõlme hüpikmenüüst Keskele.">
+<node TEXT="Kataloogi määramiseks keskele kõige suuremaks sõlmeks, vali sõlme hüpikmenüüst Keskele." ID="ID_1489978112" CREATED="1124560950701" MODIFIED="1216187545265">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1505912742" MODIFIED="1216187545265" TEXT="Faili vaatamiseks, muutmiseks või käivitamiseks järgi sõlmes olevat viidet.">
+<node TEXT="Faili vaatamiseks, muutmiseks või käivitamiseks järgi sõlmes olevat viidet." ID="ID_1505912742" CREATED="1124560950701" MODIFIED="1216187545265">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_279880616" MODIFIED="1216187545265">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Faili režiim ei ole hetkel eriti kasutusel. See on demonstratsioon, et andmete importimine puukujuliseks struktuuriks mujalt allikast kui mõttekaart, on lihtne. Ei ole ühtki tõendit, et inimesed reaalselt ka seda režiimi kasutaksid.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Faili režiim ei ole hetkel eriti kasutusel. See on demonstratsioon, et andmete importimine puukujuliseks struktuuriks mujalt allikast kui mõttekaart, on lihtne. Ei ole ühtki tõendit, et inimesed reaalselt ka seda režiimi kasutaksid.
 </p>
 </body>
</html>" ID="_Freeplane_Link_279880616" CREAT [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1530607683" MODIFIED="1216250753465" POSITION="left" TEXT="Mõttekaartide lehitsemine">
+<node TEXT="Mõttekaartide lehitsemine" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1530607683" CREATED="1124560950701" MODIFIED="1216250753465" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_904930134" MODIFIED="1216187545264">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Mõttekaartide lehitsemiseks (mitte muutmiseks) lülitu lehitsemise režiimi, valides rippmenüüst Kaardid > Lehitse. Kuniks ei kasutata Freeplane-i appletit, on see funktsioon kasutu.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Mõttekaartide lehitsemiseks (mitte muutmiseks) lülitu lehitsemise režiimi, valides rippmenüüst Kaardid > Lehitse. Kuniks ei kasutata Freeplane-i appletit, on see funktsioon kasutu.
 </p>
 </body>
</html>" ID="ID_904930134" CREATED="1124560950701" MODIFIED="1216187545264">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_747061558" MODIFIED="1216187545264">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Eraldi lehitsemiste režiimide omamine on tehniline küsimus. Lehitsemine on ainus asi, mida Freeplane-i appletis kodulehel teha saab. Üldiselt ei kasutata lehitsemise režiimi Freeplane-is.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Eraldi lehitsemiste režiimide omamine on tehniline küsimus. Lehitsemine on ainus asi, mida Freeplane-i appletis kodulehel teha saab. Üldiselt ei kasutata lehitsemise režiimi Freeplane-is.
 </p>
 </body>
</html>" ID="ID_747061558" CREATED="1124560950701" MODIFIED="1216187545264">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1136088046" MODIFIED="1216201160404" POSITION="left" TEXT="Erinevad režiimid">
-<edge WIDTH="thin"/>
+<node TEXT="Erinevad režiimid" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1136088046" CREATED="1124560950701" MODIFIED="1216201160404" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1713057526" MODIFIED="1216187545264">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kuigi Freeplane on algselt mõeldud mõttekaartide redigeerimiseks, on see siiski loodud ka arvestades teisi võimalikke andmeallikaid. Spetsiifilise andmeallika kättesaadavaks tegemisel peab programmeerija tekitama niinimetatud režiimi selle konkreetse andmeallika jaoks. Faili režiim on üheks selliseks näiteks. Me ei tea, et ühtki teist režiimi oleks välja arendatud. Ei ole päris selge, kas keegi seda üldse kasutab kuid [...]
- </p>
- </body>
-</html></richcontent>
+<edge WIDTH="thin"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kuigi Freeplane on algselt mõeldud mõttekaartide redigeerimiseks, on see siiski loodud ka arvestades teisi võimalikke andmeallikaid. Spetsiifilise andmeallika kättesaadavaks tegemisel peab programmeerija tekitama niinimetatud režiimi selle konkreetse andmeallika jaoks. Faili režiim on üheks selliseks n&# [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_700085988" MODIFIED="1216187545264">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- On veel olemas skeemide kood, mis on peaaegu valmis ja võimaldab muuta programmide skeeme. Jällegi - kasutuse vajalikkus on selgusetu. Vastupidiselt mõttekaardi režiimile on teised režiimid rohkem demonstratsiooniks, mida kõike on võimalik Freeplane-i abil teha.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 On veel olemas skeemide kood, mis on peaaegu valmis ja võimaldab muuta programmide skeeme. Jällegi - kasutuse vajalikkus on selgusetu. Vastupidiselt mõttekaardi režiimile on teised režiimid rohkem demonstratsiooniks, mida kõike on võimalik Freeplane-i abil teha.
 </p>
 </body>
< [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1525986009" MODIFIED="1216201160404" POSITION="left" TEXT="Freeplane-i appleti paigaldamine kodulehele">
+<node TEXT="Freeplane-i appleti paigaldamine kodulehele" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1525986009" CREATED="1124560950701" MODIFIED="1216201160404" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#000000" CREATED="1124560950701" ID="ID_833832653" MODIFIED="1216187545263" TEXT="Sa võid paigaldada appleti oma veebilehele nii, et teised kasutajad saavad lehitseda Sinu mõttekaarte.">
+<node TEXT="Sa võid paigaldada appleti oma veebilehele nii, et teised kasutajad saavad lehitseda Sinu mõttekaarte." ID="ID_833832653" CREATED="1124560950701" MODIFIED="1216187545263" COLOR="#000000">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node COLOR="#338800" CREATED="1124560950701" ID="ID_506676757" LINK="http://sourceforge.net/project/showfiles.php?group_id=211069" MODIFIED="1216187545263" TEXT="Laadi applet alla - selle nimi on freeplane-browser.">
+<node TEXT="Laadi applet alla - selle nimi on freeplane-browser." ID="ID_506676757" CREATED="1124560950701" MODIFIED="1216187545263" LINK="http://sourceforge.net/project/showfiles.php?group_id=211069" COLOR="#338800">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_19242684" MODIFIED="1216187545263">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Allalaaditud arhiiv sisaldab faile freeplanebrowser.jar ja freeplanebrowser.html. Oma kodulehel loo viide failile freeplanebrowser.html ja selle faili sees muuda vastav viide selliselt, et see viitaks Sinu mõttekaardi failile.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Allalaaditud arhiiv sisaldab faile freeplanebrowser.jar ja freeplanebrowser.html. Oma kodulehel loo viide failile freeplanebrowser.html ja selle faili sees muuda vastav viide selliselt, et see viitaks Sinu mõttekaardi failile.
 </p>
 </body>
</html>" ID="ID_19242684" CREATED="1124560950701" MODIFIED="1216187545263">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1604975759" MODIFIED="1216187545263">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Appleti *.jar fail peab asuma samas serveris kus ka mõttekaart ise ja seda java turvalisuse pärast. Sa pead laadima nii Freeplane-i appleti *.jar faili kui ka oma mõttekaardi oma kodulehele.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Appleti *.jar fail peab asuma samas serveris kus ka mõttekaart ise ja seda java turvalisuse pärast. Sa pead laadima nii Freeplane-i appleti *.jar faili kui ka oma mõttekaardi oma kodulehele.
 </p>
 </body>
</html>" ID="ID_1604975759" CREATED="1124560950701" MODIFIED="1216187545263">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1083756111" MODIFIED="1216201160404" POSITION="left" TEXT="Freeplane appleti kasutamine">
+<node TEXT="Freeplane appleti kasutamine" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1083756111" CREATED="1124560950701" MODIFIED="1216201160404" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_514864900" MODIFIED="1216187545262">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Freeplane-i appletis saad Sa kasutada vaid lehitsemise režiimi; Sa ei saa muuta serveris asuvaid mõttekaarte. Klõpsa sõlmel, et lülitada ümber voltimisrežiimi või järgneda veebiviitele. Haara ja lohista tausta, et liigutada mõttekaarti. Otsimiseks kasuta mõttekaardi kiirmenüüd.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Freeplane-i appletis saad Sa kasutada vaid lehitsemise režiimi; Sa ei saa muuta serveris asuvaid mõttekaarte. Klõpsa sõlmel, et lülitada ümber voltimisrežiimi või järgneda veebiviitele. Haara ja lohista tausta, et liigutada mõttekaarti. Otsimiseks kasuta mõttekaardi kiirme [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1976458022" MODIFIED="1216201160405" POSITION="left" TEXT="Kasutajaliidese muudatused alates versioonist 0.6.5">
-<edge WIDTH="thin"/>
+<node TEXT="Kasutajaliidese muudatused alates versioonist 0.6.5" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1976458022" CREATED="1124560950701" MODIFIED="1216201160405" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_717349033" MODIFIED="1216187545262">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Mõned klaviatuuriseaded on uuesti määratud, et oleks kasutusel ka mujal programmides levinud intuitiivsed klahvikombinatsioonid. Mõned uued kiirklahvid pärinevad Microsofti toodetest. Uued kiirklahvid sisaldavad ka näiteks ENTER-i abil uue mõtte lisamine peasõlmele, INSERT-klahvi abil mõtte lisamine olemasoleva mõtte alla, F2 sõlme sisu muutmiseks - siin ongi Microsofti mõju kuna tegelikult ei ole mingit põhjust omada [...]
- </p>
- </body>
-</html></richcontent>
+<edge WIDTH="thin"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Mõned klaviatuuriseaded on uuesti määratud, et oleks kasutusel ka mujal programmides levinud intuitiivsed klahvikombinatsioonid. Mõned uued kiirklahvid pärinevad Microsofti toodetest. Uued kiirklahvid sisaldavad ka näiteks ENTER-i abil uue mõtte lisamine peasõlmele, INSERT-klahvi abil mõtte [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1179893656" MODIFIED="1216187545262" TEXT="Klaviatuuri seadeid saab muuta rippmenüüst Tööriistad > Eelistused.">
+<node TEXT="Klaviatuuri seadeid saab muuta rippmenüüst Tööriistad > Eelistused." ID="_Freeplane_Link_1179893656" CREATED="1124560950701" MODIFIED="1216187545262">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_784043927" MODIFIED="1216272432955" POSITION="left" TEXT="Tänud">
+<node TEXT="Tänud" FOLDED="true" POSITION="left" ID="_Freeplane_Link_784043927" CREATED="1124560950701" MODIFIED="1216272432955" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006699" CREATED="1124560950701" ID="Freeplane_Link_415458128" MODIFIED="1216272329963" TEXT="Autorid">
+<node TEXT="Autorid" ID="Freeplane_Link_415458128" CREATED="1124560950701" MODIFIED="1216272329963" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1896457660" MODIFIED="1216187545261" TEXT="Joerg Mueller">
-<edge WIDTH="thin"/>
+<node TEXT="Joerg Mueller" FOLDED="true" ID="_Freeplane_Link_1896457660" CREATED="1124560950701" MODIFIED="1216187545261" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#558000" CREATED="1124560950701" ID="ID_1354886892" LINK="mailto:ponders at t-online.de" MODIFIED="1216187545261" TEXT="ponders at t-online.de">
+<edge WIDTH="thin"/>
+<node TEXT="ponders at t-online.de" ID="ID_1354886892" CREATED="1124560950701" MODIFIED="1216187545261" LINK="mailto:ponders at t-online.de" COLOR="#558000">
<font NAME="Dialog" SIZE="10"/>
</node>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_1757468410" MODIFIED="1216187545261" TEXT="Freiburgi Ülikool, Saksamaa">
+<node TEXT="Freiburgi Ülikool, Saksamaa" ID="ID_1757468410" CREATED="1124560950701" MODIFIED="1216187545261" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_984984595" LINK="http://danpolansky.blogspot.com/" MODIFIED="1216272339951" TEXT="Daniel Polansky">
-<edge WIDTH="thin"/>
+<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1124560950701" MODIFIED="1216272339951" LINK="http://danpolansky.blogspot.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_459203293" MODIFIED="1216187545261" TEXT="Petr Novak">
<edge WIDTH="thin"/>
-<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_875814410" MODIFIED="1216272344134" TEXT="Christian Foltin">
-<edge WIDTH="thin"/>
+<node TEXT="Petr Novak" ID="_Freeplane_Link_459203293" CREATED="1124560950701" MODIFIED="1216187545261" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_1415293905" MODIFIED="1216187545261" TEXT="Dimitri Polivaev">
+<node TEXT="Christian Foltin" ID="_Freeplane_Link_875814410" CREATED="1124560950701" MODIFIED="1216272344134" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
+</node>
+<node TEXT="Dimitri Polivaev" ID="_Freeplane_Link_1415293905" CREATED="1124560950701" MODIFIED="1216187545261" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_816166020" MODIFIED="1216272427853" TEXT="Väiksemad panustajad">
-<edge WIDTH="thin"/>
+<node TEXT="Väiksemad panustajad" FOLDED="true" ID="Freeplane_Link_816166020" CREATED="1124560950701" MODIFIED="1216272427853" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950701" ID="ID_1613097663" MODIFIED="1216272349630" TEXT="Andrew Iggleden">
<edge WIDTH="thin"/>
+<node TEXT="Andrew Iggleden" ID="ID_1613097663" CREATED="1124560950701" MODIFIED="1216272349630" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_1149301468" MODIFIED="1216187545261" TEXT="Windows-i paigaldaja">
<edge WIDTH="thin"/>
+<node TEXT="Windows-i paigaldaja" ID="ID_1149301468" CREATED="1124560950701" MODIFIED="1216187545261" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_1096673251" MODIFIED="1216272351336" TEXT="Bob Alexander">
-<edge WIDTH="thin"/>
+<node TEXT="Bob Alexander" ID="Freeplane_Link_1096673251" CREATED="1124560950701" MODIFIED="1216272351336" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_617977736" MODIFIED="1216187545261" TEXT="Eclipse õpetus">
<edge WIDTH="thin"/>
+<node TEXT="Eclipse õpetus" ID="ID_617977736" CREATED="1124560950701" MODIFIED="1216187545261" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_1024053399" MODIFIED="1216272352345" TEXT="David Butt">
-<edge WIDTH="thin"/>
+<node TEXT="David Butt" ID="Freeplane_Link_1024053399" CREATED="1124560950701" MODIFIED="1216272352345" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_49661074" MODIFIED="1216187545261" TEXT="Flash-i õpetus">
<edge WIDTH="thin"/>
+<node TEXT="Flash-i õpetus" ID="ID_49661074" CREATED="1124560950701" MODIFIED="1216187545261" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="ID_1167712813" MODIFIED="1216272353298" TEXT="David Low">
-<edge WIDTH="thin"/>
+<node TEXT="David Low" ID="ID_1167712813" CREATED="1124560950701" MODIFIED="1216272353298" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_356164606" MODIFIED="1216187545261" TEXT="Abitekstid">
<edge WIDTH="thin"/>
+<node TEXT="Abitekstid" ID="ID_356164606" CREATED="1124560950701" MODIFIED="1216187545261" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_360501151" LINK="http://freeplane.sourceforge.net/wiki/index.php/Translation" MODIFIED="1216272426323" TEXT="Tõlkijad">
+<node TEXT="Tõlkijad" FOLDED="true" ID="Freeplane_Link_360501151" CREATED="1124560950701" MODIFIED="1216272426323" LINK="http://freeplane.sourceforge.net/wiki/index.php/Translation" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124561374999" ID="ID_180090574" MODIFIED="1216272357942" TEXT="Edmund Laugasson">
+<node TEXT="Edmund Laugasson" ID="ID_180090574" CREATED="1124561374999" MODIFIED="1216272357942" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124561377702" ID="ID_537083851" MODIFIED="1216187545260" TEXT="Eesti keele tõlge">
+<node TEXT="Eesti keele tõlge" ID="ID_537083851" CREATED="1124561377702" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_807977431" MODIFIED="1216272359692" TEXT="Bob Alexander">
-<edge WIDTH="thin"/>
+<node TEXT="Bob Alexander" ID="Freeplane_Link_807977431" CREATED="1124560950701" MODIFIED="1216272359692" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_1392047072" MODIFIED="1216187545260" TEXT="Itaalia keele tõlge">
<edge WIDTH="thin"/>
+<node TEXT="Itaalia keele tõlge" ID="ID_1392047072" CREATED="1124560950701" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_1853214917" MODIFIED="1216272361218" TEXT="Knud Riishøjgård">
-<edge WIDTH="thin"/>
+<node TEXT="Knud Riishøjgård" ID="Freeplane_Link_1853214917" CREATED="1124560950701" MODIFIED="1216272361218" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_572926838" MODIFIED="1216187545260" TEXT="Taani keele tõlge">
<edge WIDTH="thin"/>
+<node TEXT="Taani keele tõlge" ID="ID_572926838" CREATED="1124560950701" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_1676529317" MODIFIED="1216272362282" TEXT="Takeshi Kakeda">
-<edge WIDTH="thin"/>
+<node TEXT="Takeshi Kakeda" ID="Freeplane_Link_1676529317" CREATED="1124560950701" MODIFIED="1216272362282" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_763739856" MODIFIED="1216187545260" TEXT="Jaapani keele tõlge">
<edge WIDTH="thin"/>
+<node TEXT="Jaapani keele tõlge" ID="ID_763739856" CREATED="1124560950701" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562983644" ID="Freeplane_Link_1172193026" MODIFIED="1216272363189" TEXT="Kohichi Aoki">
+<node TEXT="Kohichi Aoki" ID="Freeplane_Link_1172193026" CREATED="1124562983644" MODIFIED="1216272363189" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_919845662" MODIFIED="1216187545260" TEXT="Jaapani keele tõlge">
-<edge WIDTH="thin"/>
+<node TEXT="Jaapani keele tõlge" ID="ID_919845662" CREATED="1124560950701" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="ID_1810700717" MODIFIED="1216272364055" TEXT="Alex Dukal">
-<edge WIDTH="thin"/>
+<node TEXT="Alex Dukal" ID="ID_1810700717" CREATED="1124560950701" MODIFIED="1216272364055" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_1990388249" MODIFIED="1216187545260" TEXT="Hispaania keele tõlge">
<edge WIDTH="thin"/>
+<node TEXT="Hispaania keele tõlge" ID="ID_1990388249" CREATED="1124560950701" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562998159" ID="Freeplane_Link_757563697" MODIFIED="1216272364816" TEXT="Hugo Gayosso">
+<node TEXT="Hugo Gayosso" ID="Freeplane_Link_757563697" CREATED="1124562998159" MODIFIED="1216272364816" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_1783275246" MODIFIED="1216187545260" TEXT="Hispaania keele tõlge">
-<edge WIDTH="thin"/>
+<node TEXT="Hispaania keele tõlge" ID="Freeplane_Link_1783275246" CREATED="1124560950701" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="Freeplane_Link_929540960" MODIFIED="1216272365516" TEXT="Sylvain Gamel">
+<node TEXT="Sylvain Gamel" ID="Freeplane_Link_929540960" CREATED="1124560950701" MODIFIED="1216272365516" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_665552197" MODIFIED="1216187545260" TEXT="Prantsuse keele tõlge">
+<node TEXT="Prantsuse keele tõlge" ID="ID_665552197" CREATED="1124560950701" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561242082" ID="Freeplane_Link_946171164" MODIFIED="1216272366270" TEXT="Koen Roggemans">
+<node TEXT="Koen Roggemans" ID="Freeplane_Link_946171164" CREATED="1124561242082" MODIFIED="1216272366270" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124561245957" ID="Freeplane_Link_1819881845" MODIFIED="1216187545260" TEXT="Hollandi keele tõlge">
+<node TEXT="Hollandi keele tõlge" ID="Freeplane_Link_1819881845" CREATED="1124561245957" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561374999" ID="Freeplane_Link_235962981" MODIFIED="1216272366953" TEXT="Rafal Kraik">
+<node TEXT="Rafal Kraik" ID="Freeplane_Link_235962981" CREATED="1124561374999" MODIFIED="1216272366953" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124561377702" ID="Freeplane_Link_459079511" MODIFIED="1216187545260" TEXT="Poola keele tõlge">
+<node TEXT="Poola keele tõlge" ID="Freeplane_Link_459079511" CREATED="1124561377702" MODIFIED="1216187545260" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561969717" ID="Freeplane_Link_653284985" MODIFIED="1216272367703" TEXT="Goliath">
+<node TEXT="Goliath" ID="Freeplane_Link_653284985" CREATED="1124561969717" MODIFIED="1216272367703" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124561438294" ID="Freeplane_Link_1387213811" MODIFIED="1216187545259" TEXT="Korea keele tõlge">
+<node TEXT="Korea keele tõlge" ID="Freeplane_Link_1387213811" CREATED="1124561438294" MODIFIED="1216187545259" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561753254" ID="Freeplane_Link_35211963" MODIFIED="1216272369174" TEXT="Martin Srebotnjak (hüüdnimi: Miles a.k.a. filmsi)">
+<node TEXT="Martin Srebotnjak (hüüdnimi: Miles a.k.a. filmsi)" ID="Freeplane_Link_35211963" CREATED="1124561753254" MODIFIED="1216272369174" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124561491886" ID="Freeplane_Link_835144271" MODIFIED="1216187545258" TEXT="Sloveenia keele tõlge">
+<node TEXT="Sloveenia keele tõlge" ID="Freeplane_Link_835144271" CREATED="1124561491886" MODIFIED="1216187545258" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561814721" ID="Freeplane_Link_1008886206" MODIFIED="1216272380101" TEXT="William Chen">
+<node TEXT="William Chen" ID="Freeplane_Link_1008886206" CREATED="1124561814721" MODIFIED="1216272380101" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124561497308" ID="Freeplane_Link_1960552629" MODIFIED="1216187545258" TEXT="Hiina keele tõlge">
+<node TEXT="Hiina keele tõlge" ID="Freeplane_Link_1960552629" CREATED="1124561497308" MODIFIED="1216187545258" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561823877" ID="Freeplane_Link_1650138043" MODIFIED="1216272379451" TEXT="Radek Švarc">
+<node TEXT="Radek Švarc" ID="Freeplane_Link_1650138043" CREATED="1124561823877" MODIFIED="1216272379451" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124561515761" ID="Freeplane_Link_768227373" MODIFIED="1216187545257" TEXT="Tšehhi keele tõlge">
+<node TEXT="Tšehhi keele tõlge" ID="Freeplane_Link_768227373" CREATED="1124561515761" MODIFIED="1216187545257" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562250475" ID="Freeplane_Link_901975324" MODIFIED="1216272380882" TEXT="Balázs Márton">
+<node TEXT="Balázs Márton" ID="Freeplane_Link_901975324" CREATED="1124562250475" MODIFIED="1216272380882" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124562252585" ID="Freeplane_Link_557911120" MODIFIED="1216187545257" TEXT="Ungari keele tõlge">
+<node TEXT="Ungari keele tõlge" ID="Freeplane_Link_557911120" CREATED="1124562252585" MODIFIED="1216187545257" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562948942" ID="Freeplane_Link_290351026" MODIFIED="1216272381633" TEXT="Luis Ferreira ">
+<node TEXT="Luis Ferreira " ID="Freeplane_Link_290351026" CREATED="1124562948942" MODIFIED="1216272381633" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124562956332" ID="Freeplane_Link_6081004" MODIFIED="1216187545257" TEXT="Portugali keele tõlge">
+<node TEXT="Portugali keele tõlge" ID="Freeplane_Link_6081004" CREATED="1124562956332" MODIFIED="1216187545257" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124563066204" ID="Freeplane_Link_23652566" MODIFIED="1216187545257">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Tõlkijate nimekiri ei pruugi olla lõplik. Kui me oleme Sind unustanud - palun anna sellest meile teada! Kõik inimesed, kes on isegi poolikuid tõlkeid edastanud, on siin nimekirjas toodud.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Tõlkijate nimekiri ei pruugi olla lõplik. Kui me oleme Sind unustanud - palun anna sellest meile teada! Kõik inimesed, kes on isegi poolikuid tõlkeid edastanud, on siin nimekirjas toodud.
 </p>
 </body>
</html>" ID="Freeplane_Link_23652566" CREATED="1124563066204" MODIFIED="1216187545257" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
</node>
-<node COLOR="#0033ff" CREATED="1124560950701" ID="ID_296319773" MODIFIED="1216187545251" POSITION="right">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Otsimiseks vajuta CTRL + F. Järgmise otsimiseks vajuta CTRL + G. Et muuta otsing globaalseks, vajuta ESC enne otsimise alustamist.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Otsimiseks vajuta CTRL + F. Järgmise otsimiseks vajuta CTRL + G. Et muuta otsing globaalseks, vajuta ESC enne otsimise alustamist.
 </p>
 </body>
</html>" POSITION="right" ID="ID_296319773" CREATED="1124560950701" MODIFIED="1216187545251" COLOR="#0033ff">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#0033ff" CREATED="1124560950701" ID="ID_1243305843" MODIFIED="1216187545242" POSITION="right" TEXT="Vajuta parempoolset nooleklahvi, et avada (lahti voltida) tekstikast.">
+<node TEXT="Vajuta parempoolset nooleklahvi, et avada (lahti voltida) tekstikast." POSITION="right" ID="ID_1243305843" CREATED="1124560950701" MODIFIED="1216187545242" COLOR="#0033ff">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1596161299" MODIFIED="1216201160406" POSITION="right" TEXT="Tutvustus">
+<node TEXT="Tutvustus" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1596161299" CREATED="1124560950701" MODIFIED="1216201160406" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_1477669657" MODIFIED="1216187545242">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Freeplane võimaldab luua niinimetatud mõttekaarte. Samas kasutavad paljud inimesed seda kui märkmikku või lihtsalt isikliku info haldamiseks.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Freeplane võimaldab luua niinimetatud mõttekaarte. Samas kasutavad paljud inimesed seda kui märkmikku või lihtsalt isikliku info haldamiseks.
 </p>
 </body>
</html>" ID="ID_1477669657" CREATED="1124560950701" MODIFIED="1216187545242">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1859704500" MODIFIED="1216187545242">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Infot hoitakse tekstikastides, mida nimetatakse sõlmedeks. Sõlmed on omavahel ühenduses, kasutades jooni.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Infot hoitakse tekstikastides, mida nimetatakse sõlmedeks. Sõlmed on omavahel ühenduses, kasutades jooni.
 </p>
 </body>
</html>" ID="ID_1859704500" CREATED="1124560950701" MODIFIED="1216187545242">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_163671273" MODIFIED="1216187545242">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- See on Freeplane 0.9.0 dokumentatsioon. Kiirklahvid ja funktsioonide asukohad menüüdes võivad tulevikus muutuda.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 See on Freeplane 0.9.0 dokumentatsioon. Kiirklahvid ja funktsioonide asukohad menüüdes võivad tulevikus muutuda.
 </p>
 </body>
</html>" ID="ID_163671273" CREATED="1124560950701" MODIFIED="1216187545242">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_706084071" MODIFIED="1216201160408" POSITION="right" TEXT="Mõnede võimaluste demonstratsioon">
+<node TEXT="Mõnede võimaluste demonstratsioon" FOLDED="true" POSITION="right" ID="_Freeplane_Link_706084071" CREATED="1124560950701" MODIFIED="1216201160408" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_735193624" MODIFIED="1216200835993" TEXT="Välimus">
+<node TEXT="Välimus" FOLDED="true" ID="_Freeplane_Link_735193624" CREATED="1124560950701" MODIFIED="1216200835993" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="ID_887863172" MODIFIED="1216187545241" TEXT="Sõlmed võivad olla erinevat värvi.">
+<node TEXT="Sõlmed võivad olla erinevat värvi." FOLDED="true" ID="ID_887863172" CREATED="1124560950701" MODIFIED="1216187545241">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#ff0000" CREATED="1124560950701" ID="ID_1474945370" MODIFIED="1216187545241" TEXT="Punane">
+<node TEXT="Punane" ID="ID_1474945370" CREATED="1124560950701" MODIFIED="1216187545241" COLOR="#ff0000">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#009900" CREATED="1124560950701" ID="ID_1005177880" MODIFIED="1216187545241" TEXT="Roheline">
+<node TEXT="Roheline" ID="ID_1005177880" CREATED="1124560950701" MODIFIED="1216187545241" COLOR="#009900">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#0000cc" CREATED="1124560950701" ID="ID_304992602" MODIFIED="1216187545241" TEXT="Sinine">
+<node TEXT="Sinine" ID="ID_304992602" CREATED="1124560950701" MODIFIED="1216187545241" COLOR="#0000cc">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_" MODIFIED="1216187545241" TEXT="Sõlmedel võivad olla erinevad taustavärvid">
+<node TEXT="Sõlmedel võivad olla erinevad taustavärvid" FOLDED="true" ID="_" CREATED="1124560950701" MODIFIED="1216187545241">
<font NAME="SansSerif" SIZE="12"/>
-<node BACKGROUND_COLOR="#77a86f" CREATED="1124560950701" ID="_Freeplane_Link_1358611533" MODIFIED="1216187545241" TEXT="Näiteks selline"/>
-<node BACKGROUND_COLOR="#d3d9f4" CREATED="1124560950701" ID="_Freeplane_Link_1317973766" MODIFIED="1216187545241" TEXT="Ja veel ka selline"/>
+<node TEXT="Näiteks selline" ID="_Freeplane_Link_1358611533" CREATED="1124560950701" MODIFIED="1216187545241" BACKGROUND_COLOR="#77a86f"/>
+<node TEXT="Ja veel ka selline" ID="_Freeplane_Link_1317973766" CREATED="1124560950701" MODIFIED="1216187545241" BACKGROUND_COLOR="#d3d9f4"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="ID_754589044" MODIFIED="1216187545241" TEXT="Sõlmedel võivad olla erinevad fontide stiilid">
+<node TEXT="Sõlmedel võivad olla erinevad fontide stiilid" FOLDED="true" ID="ID_754589044" CREATED="1124560950701" MODIFIED="1216187545241">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_1966890106" MODIFIED="1216187545241" TEXT="Rasvane kiri">
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Rasvane kiri" ID="ID_1966890106" CREATED="1124560950701" MODIFIED="1216187545241">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
</node>
-<node CREATED="1124560950701" ID="ID_1134315926" MODIFIED="1216187545241" TEXT="Kaldkiri">
-<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Kaldkiri" ID="ID_1134315926" CREATED="1124560950701" MODIFIED="1216187545241">
+<font NAME="Dialog" SIZE="12" ITALIC="true"/>
</node>
-<node CREATED="1124560950701" ID="ID_1038960675" MODIFIED="1216187545241" TEXT="Rasvane ja kaldkiri">
-<font BOLD="true" ITALIC="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Rasvane ja kaldkiri" ID="ID_1038960675" CREATED="1124560950701" MODIFIED="1216187545241">
+<font NAME="Dialog" SIZE="12" BOLD="true" ITALIC="true"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="ID_357603252" MODIFIED="1216187545241" TEXT="Sõlmede fondid võivad olla erinevate suurustega">
+<node TEXT="Sõlmede fondid võivad olla erinevate suurustega" FOLDED="true" ID="ID_357603252" CREATED="1124560950701" MODIFIED="1216187545241">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_1612985143" MODIFIED="1216187545241" TEXT="Väike">
+<node TEXT="Väike" ID="ID_1612985143" CREATED="1124560950701" MODIFIED="1216187545241">
<font NAME="SansSerif" SIZE="11"/>
</node>
-<node CREATED="1124560950701" ID="ID_99178057" MODIFIED="1216187545241" TEXT="Normaalne">
+<node TEXT="Normaalne" ID="ID_99178057" CREATED="1124560950701" MODIFIED="1216187545241">
<font NAME="SansSerif" SIZE="13"/>
</node>
-<node CREATED="1124560950701" ID="ID_421241675" MODIFIED="1216187545241" TEXT="Suurem">
+<node TEXT="Suurem" ID="ID_421241675" CREATED="1124560950701" MODIFIED="1216187545241">
<font NAME="SansSerif" SIZE="15"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="ID_590940671" MODIFIED="1216187545240" TEXT="Suur">
+<node TEXT="Suur" FOLDED="true" ID="ID_590940671" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="20"/>
-<node CREATED="1124560950701" ID="ID_223617365" MODIFIED="1216187545240" TEXT="OOh">
+<node TEXT="OOh" ID="ID_223617365" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="123"/>
</node>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="ID_1960916074" MODIFIED="1216187545240" TEXT="Erinevaid fonte saab kasutada">
+<node TEXT="Erinevaid fonte saab kasutada" FOLDED="true" ID="ID_1960916074" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_1360641359" MODIFIED="1216187545240" TEXT="Selline">
+<node TEXT="Selline" ID="ID_1360641359" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="Times New Roman" SIZE="16"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1568731425" MODIFIED="1216187545240" TEXT="Või see">
+<node TEXT="Või see" ID="_Freeplane_Link_1568731425" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="Verdana" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_539001457" MODIFIED="1216187545240" TEXT="Või hoopis see">
+<node TEXT="Või hoopis see" ID="ID_539001457" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="Dialog" SIZE="21"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1193071041" MODIFIED="1216187545240" TEXT="Erinevaid sõlmede stiile saab kasutada">
+<node TEXT="Erinevaid sõlmede stiile saab kasutada" FOLDED="true" ID="_Freeplane_Link_1193071041" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1979277285" MODIFIED="1216187545240" TEXT="Kahvel">
-<node CREATED="1124560950701" ID="_Freeplane_Link_89124429" MODIFIED="1216187545240" TEXT="Kahvel"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_173850525" MODIFIED="1216187545240" TEXT="Kahvel"/>
+<node TEXT="Kahvel" FOLDED="true" ID="_Freeplane_Link_1979277285" CREATED="1124560950701" MODIFIED="1216187545240">
+<node TEXT="Kahvel" ID="_Freeplane_Link_89124429" CREATED="1124560950701" MODIFIED="1216187545240"/>
+<node TEXT="Kahvel" ID="_Freeplane_Link_173850525" CREATED="1124560950701" MODIFIED="1216187545240"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1001811541" MODIFIED="1216187545240" STYLE="bubble" TEXT="Mullitatud">
-<node CREATED="1124560950701" ID="_Freeplane_Link_1677737286" MODIFIED="1216187545240" STYLE="bubble" TEXT="Mullitatud"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_978246353" MODIFIED="1216187545240" STYLE="bubble" TEXT="Mullitatud"/>
+<node TEXT="Mullitatud" FOLDED="true" ID="_Freeplane_Link_1001811541" CREATED="1124560950701" MODIFIED="1216187545240" STYLE="bubble">
+<node TEXT="Mullitatud" ID="_Freeplane_Link_1677737286" CREATED="1124560950701" MODIFIED="1216187545240" STYLE="bubble"/>
+<node TEXT="Mullitatud" ID="_Freeplane_Link_978246353" CREATED="1124560950701" MODIFIED="1216187545240" STYLE="bubble"/>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="ID_738265772" MODIFIED="1216200835993" TEXT="Sõlmi saab kokku/lahti voltida">
+<node TEXT="Sõlmi saab kokku/lahti voltida" FOLDED="true" ID="ID_738265772" CREATED="1124560950701" MODIFIED="1216200835993" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_307016912" MODIFIED="1216187545240" TEXT="Sõlm">
+<node TEXT="Sõlm" FOLDED="true" ID="_Freeplane_Link_307016912" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_295225504" MODIFIED="1216187545240" TEXT="Peidetud">
+<node TEXT="Peidetud" ID="ID_295225504" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1488567837" MODIFIED="1216187545240" TEXT="Puu">
+<node TEXT="Puu" FOLDED="true" ID="_Freeplane_Link_1488567837" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_734334377" MODIFIED="1216187545240" TEXT="Tamm">
+<node TEXT="Tamm" ID="ID_734334377" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1388126257" MODIFIED="1216187545240" TEXT="Pöök">
+<node TEXT="Pöök" ID="ID_1388126257" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_292365900" MODIFIED="1216187545240" TEXT="Jalakas">
+<node TEXT="Jalakas" ID="ID_292365900" CREATED="1124560950701" MODIFIED="1216187545240">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="ID_1596510922" MODIFIED="1216200835994" TEXT="Sõlmed võivad sisaldada järgitavaid viiteid ... ">
+<node TEXT="Sõlmed võivad sisaldada järgitavaid viiteid ... " FOLDED="true" ID="ID_1596510922" CREATED="1124560950701" MODIFIED="1216200835994" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="ID_1913017247" MODIFIED="1216187545239" TEXT="Veebilehtedele">
+<node TEXT="Veebilehtedele" FOLDED="true" ID="ID_1913017247" CREATED="1124560950701" MODIFIED="1216187545239" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_350611440" LINK="http://www.google.ee/" MODIFIED="1216187545239" TEXT="http://www.google.ee/">
+<node TEXT="http://www.google.ee/" ID="ID_350611440" CREATED="1124560950701" MODIFIED="1216187545239" LINK="http://www.google.ee/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="ID_646857774" LINK="www.google.ee" MODIFIED="1216187545239" TEXT="www.google.ee">
+<node TEXT="www.google.ee" FOLDED="true" ID="ID_646857774" CREATED="1124560950701" MODIFIED="1216187545239" LINK="www.google.ee">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_1117649418" MODIFIED="1216187545239" TEXT="Freeplane arvab, et see on käivitatav fail :)">
+<node TEXT="Freeplane arvab, et see on käivitatav fail :)" ID="ID_1117649418" CREATED="1124560950701" MODIFIED="1216187545239" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="ID_715165450" MODIFIED="1216187545239" TEXT="Kohalikele kaustadele">
+<node TEXT="Kohalikele kaustadele" FOLDED="true" ID="ID_715165450" CREATED="1124560950701" MODIFIED="1216187545239" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_469314055" LINK="file:/C:/Program%20Files/" MODIFIED="1216187545239" TEXT="C:/Program Files/">
+<node TEXT="C:/Program Files/" ID="ID_469314055" CREATED="1124560950701" MODIFIED="1216187545239" LINK="file:/C:/Program%20Files/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_534319083" LINK="/home/" MODIFIED="1216187545239" TEXT="/home/">
+<node TEXT="/home/" ID="ID_534319083" CREATED="1124560950701" MODIFIED="1216187545239" LINK="/home/">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="ID_1939211284" MODIFIED="1216187545239" TEXT="Käivitatavatele failidele">
+<node TEXT="Käivitatavatele failidele" FOLDED="true" ID="ID_1939211284" CREATED="1124560950701" MODIFIED="1216187545239" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="ID_1645120569" LINK="file:/C:/WINNT/regedit.exe" MODIFIED="1216187545239" TEXT="C:\WINNT\regedit.exe">
+<node TEXT="C:\WINNT\regedit.exe" FOLDED="true" ID="ID_1645120569" CREATED="1124560950701" MODIFIED="1216187545239" LINK="file:/C:/WINNT/regedit.exe">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006600" CREATED="1124560950701" ID="ID_1388267403" MODIFIED="1216187545239" TEXT="Siit on näha, et sõlmel on käivitatava faili ikoon ees.">
+<node TEXT="Siit on näha, et sõlmel on käivitatava faili ikoon ees." ID="ID_1388267403" CREATED="1124560950701" MODIFIED="1216187545239" COLOR="#006600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="ID_1573618660" MODIFIED="1216187545239" TEXT="Suvaline dokument Sinu arvutis või Sinu ettevõtte võrgus">
+<node TEXT="Suvaline dokument Sinu arvutis või Sinu ettevõtte võrgus" ID="ID_1573618660" CREATED="1124560950717" MODIFIED="1216187545239">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_839677176" MODIFIED="1216200835994" TEXT="Mitmerealised sõlmed">
+<node TEXT="Mitmerealised sõlmed" FOLDED="true" ID="_Freeplane_Link_839677176" CREATED="1124560950717" MODIFIED="1216200835994" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1423568963" MODIFIED="1216187545239">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sa võid näha mitmerealisi sõlmi eraldi tekstilõiguna või mitme tekstilõiguna. Kui oled ehitamas teadmista baasi Freeplane-i abil, siis ilmselt ei saa lõikude kasutamist vältida. Selle asemel, et omada lihtsalt tavalist tekstifaili märkmetega, võid Sa hoopis omada sõlmedest koosnevat jada, mis on omavahel ühendatud ja saab järk-järgult lahti harutada.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sa võid näha mitmerealisi sõlmi eraldi tekstilõiguna või mitme tekstilõiguna. Kui oled ehitamas teadmista baasi Freeplane-i abil, siis ilmselt ei saa lõikude kasutamist vältida. Selle asemel, et omada lihtsalt tavalist tekstifaili märkmetega, võid Sa hoopis omada sõlmedest [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1686184172" MODIFIED="1216187545239">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- "Teadus on fakt; just nagu majad tehakse kividest, nii ka teadus koosneb faktidest; kuid kivihunnik ei ole veel maja ja faktikogum ei pruugi veel teadus olla." --Henri Poincaré
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 "Teadus on fakt; just nagu majad tehakse kividest, nii ka teadus koosneb faktidest; kuid kivihunnik ei ole veel maja ja faktikogum ei pruugi veel teadus olla." --Henri Poincaré
 </p>
 </body>
</html>" ID="_Freeplane_Link_1686184172" CREATED="1124560950717" MODIFIED="1216187545239">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="ID_1384103247" MODIFIED="1216200835994" TEXT="Lühikeserealised sõlmed koos uute ridadega">
+<node TEXT="Lühikeserealised sõlmed koos uute ridadega" FOLDED="true" ID="ID_1384103247" CREATED="1124560950717" MODIFIED="1216200835994" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1957797574" MODIFIED="1216187545239">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Rida,
- </p>
- <p>
- ja teinegi,
- </p>
- <p>
-
- </p>
- <p>
- ja veel üks rida,
- </p>
- <p>
- mida arvad sellest?
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Rida,
 </p>
 <p>
 ja teinegi,
 </p>
 <p>
 
 </p>
 <p>
 ja veel üks rida,
 </p>
 <p>
 mida arvad sellest?
 </p>
 </body>
</html>" ID="_Freeplane_Link_1957797574" CREATED="1124560950717" MODI [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="ID_1747782018" MODIFIED="1216200835994" TEXT="Sa võid emuleerida sildistatud jooni">
+<node TEXT="Sa võid emuleerida sildistatud jooni" FOLDED="true" ID="ID_1747782018" CREATED="1124560950717" MODIFIED="1216200835994" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" FOLDED="true" ID="ID_1812254377" MODIFIED="1216187545239" TEXT="Puu">
+<node TEXT="Puu" FOLDED="true" ID="ID_1812254377" CREATED="1124560950717" MODIFIED="1216187545239">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_1357589453" MODIFIED="1216200828922" TEXT="on">
+<node TEXT="on" FOLDED="true" ID="ID_1357589453" CREATED="1124560950717" MODIFIED="1216200828922" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_1843885197" MODIFIED="1216187545239" TEXT="Tamm">
+<node TEXT="Tamm" ID="ID_1843885197" CREATED="1124560950717" MODIFIED="1216187545239">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_1175801663" MODIFIED="1216200828922" TEXT="on">
+<node TEXT="on" FOLDED="true" ID="ID_1175801663" CREATED="1124560950717" MODIFIED="1216200828922" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_956172504" MODIFIED="1216187545239" TEXT="Pöök">
+<node TEXT="Pöök" ID="ID_956172504" CREATED="1124560950717" MODIFIED="1216187545239">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_647529529" MODIFIED="1216200828922" TEXT="on">
+<node TEXT="on" FOLDED="true" ID="ID_647529529" CREATED="1124560950717" MODIFIED="1216200828922" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_1045593899" MODIFIED="1216187545239" TEXT="Jalakas">
+<node TEXT="Jalakas" ID="ID_1045593899" CREATED="1124560950717" MODIFIED="1216187545239">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" FOLDED="true" ID="ID_1721974835" MODIFIED="1216187545238" TEXT="Puu">
+<node TEXT="Puu" FOLDED="true" ID="ID_1721974835" CREATED="1124560950717" MODIFIED="1216187545238">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_300230898" MODIFIED="1216187545238" TEXT="<>">
+<node TEXT="<>" FOLDED="true" ID="ID_300230898" CREATED="1124560950717" MODIFIED="1216187545238" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_1149978961" MODIFIED="1216187545238" TEXT="Leht">
+<node TEXT="Leht" ID="ID_1149978961" CREATED="1124560950717" MODIFIED="1216187545238">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="ID_329904317" MODIFIED="1216187545238" TEXT="<>">
+<node TEXT="<>" FOLDED="true" ID="ID_329904317" CREATED="1124560950717" MODIFIED="1216187545238" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_1518758203" MODIFIED="1216187545238" TEXT="Tüvi">
+<node TEXT="Tüvi" ID="ID_1518758203" CREATED="1124560950717" MODIFIED="1216187545238">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" ID="ID_46511860" MODIFIED="1216187545238" TEXT="Sa võid ikoone lisada sõlmedesse">
-<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Sa võid ikoone lisada sõlmedesse" ID="ID_46511860" CREATED="1124560950717" MODIFIED="1216187545238" COLOR="#669900">
<icon BUILTIN="knotify"/>
<icon BUILTIN="flag"/>
<icon BUILTIN="button_cancel"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="back"/>
+<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_318937820" MODIFIED="1216200835996" TEXT="Sa võid teha pilvi">
-<cloud/>
+<node TEXT="Sa võid teha pilvi" FOLDED="true" ID="_Freeplane_Link_318937820" CREATED="1124560950717" MODIFIED="1216200835996" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1236643816" MODIFIED="1216187545238" TEXT="Endavalitud värvidega">
-<cloud COLOR="#f1ede6"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="Endavalitud värvidega" ID="ID_1236643816" CREATED="1124560950717" MODIFIED="1216187545238">
+<cloud COLOR="#f1ede6" SHAPE="ARC"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1750585847" MODIFIED="1216200835996" TEXT="Sa võid teha graafilisi viiteid">
+<node TEXT="Sa võid teha graafilisi viiteid" FOLDED="true" ID="_Freeplane_Link_1750585847" CREATED="1124560950717" MODIFIED="1216200835996" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1212380407" MODIFIED="1216187545238" TEXT="Ühendada sõlme">
-<arrowlink DESTINATION="_Freeplane_Link_1249400461" ENDARROW="Default" ENDINCLINATION="41;0;" ID="Arrow_ID_790768865" STARTARROW="None" STARTINCLINATION="41;0;"/>
+<node TEXT="Ühendada sõlme" ID="_Freeplane_Link_1212380407" CREATED="1124560950717" MODIFIED="1216187545238">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1249400461" MODIFIED="1216187545238" TEXT="Teisega">
-<arrowlink COLOR="#6600ff" DESTINATION="_Freeplane_Link_880551392" ENDARROW="Default" ENDINCLINATION="47;0;" ID="Freeplane_Arrow_Link_85185909" STARTARROW="None" STARTINCLINATION="47;0;"/>
+<node TEXT="Teisega" ID="_Freeplane_Link_1249400461" CREATED="1124560950717" MODIFIED="1216187545238">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#6600ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_880551392" MODIFIED="1216187545238" TEXT="Erinevates värvides">
-<arrowlink DESTINATION="_Freeplane_Link_1789233193" ENDARROW="Default" ENDINCLINATION="82;44;" ID="Freeplane_Arrow_Link_1672464612" STARTARROW="None" STARTINCLINATION="82;44;"/>
+<node TEXT="Erinevates värvides" ID="_Freeplane_Link_880551392" CREATED="1124560950717" MODIFIED="1216187545238">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1789233193" MODIFIED="1216187545238" TEXT="Ja erineva kujuga">
+<node TEXT="Ja erineva kujuga" ID="_Freeplane_Link_1789233193" CREATED="1124560950717" MODIFIED="1216187545238">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_127668276" MODIFIED="1216200835996" TEXT="Sõlmi saab vabalt ümber paigutada">
+<node TEXT="Sõlmi saab vabalt ümber paigutada" FOLDED="true" ID="_Freeplane_Link_127668276" CREATED="1124560950717" MODIFIED="1216200835996" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_894936766" MODIFIED="1216187545238" TEXT="Üks">
+<node TEXT="Üks" ID="_Freeplane_Link_894936766" CREATED="1124560950717" MODIFIED="1216187545238">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1942481455" MODIFIED="1216187545237" TEXT="Teine">
+<node TEXT="Teine" ID="_Freeplane_Link_1942481455" CREATED="1124560950717" MODIFIED="1216187545237">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1709752669" MODIFIED="1216201160409" POSITION="right" TEXT="Sõlmede loomine ja kustutamine">
+<node TEXT="Sõlmede loomine ja kustutamine" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1709752669" CREATED="1124560950717" MODIFIED="1216201160409" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Alamsõlme tekitamiseks aktiivse sõlme alla vajuta INSERT." ID="ID_1080456719" CREATED="1124560950717" MODIFIED="1216187545237">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1080456719" MODIFIED="1216187545237" TEXT="Alamsõlme tekitamiseks aktiivse sõlme alla vajuta INSERT.">
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Et luua uut alamsõlme samal ajal kui muudetakse teist sõlme, vajuta muutmise ajal INSERT.
 </p>
 </body>
</html>" ID="ID_745599378" CREATED="1124560950717" MODIFIED="1216187545237">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_745599378" MODIFIED="1216187545237">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Et luua uut alamsõlme samal ajal kui muudetakse teist sõlme, vajuta muutmise ajal INSERT.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 1. taseme alamsõlme loomiseks peasõlme alla vajuta ENTER.
 </p>
 </body>
</html>" ID="ID_1624846736" CREATED="1124560950717" MODIFIED="1216187545236">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1624846736" MODIFIED="1216187545236">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- 1. taseme alamsõlme loomiseks peasõlme alla vajuta ENTER.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 1. taseme alamsõlme loomiseks peasõlme alla aktiivse sõlme kohale, vajuta SHIFT + ENTER.
 </p>
 </body>
</html>" ID="ID_987299998" CREATED="1124560950717" MODIFIED="1216187545234">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_987299998" MODIFIED="1216187545234">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- 1. taseme alamsõlme loomiseks peasõlme alla aktiivse sõlme kohale, vajuta SHIFT + ENTER.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="Sõlme kustutamiseks vajuta DELETE" ID="ID_461300770" CREATED="1124560950717" MODIFIED="1216187545234">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_461300770" MODIFIED="1216187545234" TEXT="Sõlme kustutamiseks vajuta DELETE">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Aktiivse sõlme lõikamiseks vajuta CTRL + X
 </p>
 </body>
</html>" ID="ID_1332647159" CREATED="1124560950717" MODIFIED="1216187545234">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1332647159" MODIFIED="1216187545234">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Aktiivse sõlme lõikamiseks vajuta CTRL + X
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kõiki tegevusi saab teha ka hiire paremklahvi alt avanevat menüüd kasutades.
 </p>
 </body>
</html>" ID="ID_308911082" CREATED="1124560950717" MODIFIED="1216187545234">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_308911082" MODIFIED="1216187545234">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kõiki tegevusi saab teha ka hiire paremklahvi alt avanevat menüüd kasutades.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1700974092" MODIFIED="1216201160410" POSITION="right" TEXT="Sõlme teksti muutmine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_519923426" MODIFIED="1216187545234">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme muutmiseks vajuta F2, HOME või END klahvi, või sõlme kiirmenüüs vali Redigeeri sõlme. Sõlme redigeerimise lõpetamiseks, vajuta ENTER nupule.
- </p>
- </body>
-</html></richcontent>
-<arrowlink DESTINATION="_Freeplane_Link_519923426" ENDARROW="Default" ENDINCLINATION="0;0;" ID="Freeplane_Arrow_Link_1179992477" STARTARROW="None" STARTINCLINATION="0;0;"/>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_522935321" MODIFIED="1216187545233">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlmes oleva teksti asendamiseks uuega lihtsalt alusta tippimist.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_645044942" MODIFIED="1216187545233">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Et sundida lühikese sisuga sõlme muutmist avanema eraldi hüpikaknas, vajuta ALT + ENTER.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_683234865" MODIFIED="1216187545233">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Pika sisuga sõlme poolitamiseks kasuta nuppu Poolita sõlme redaktori akna allosas või vajuta ALT + S.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1426930299" MODIFIED="1216187545233">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Uue rea lisamiseks sõlme redigeerimise aknas, vajuta CTRL + ENTER. Kui sõlme redigeeritakse kohapeal ilma redaktori aknata siis uue rea lisamine ei ole võimalik.
- </p>
- </body>
-</html></richcontent>
-<arrowlink DESTINATION="_Freeplane_Link_1445647544" ENDARROW="Default" ENDINCLINATION="118;0;" ID="Freeplane_Arrow_Link_1628309717" STARTARROW="None" STARTINCLINATION="118;0;"/>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_496995972" MODIFIED="1216187545233">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Et kopeerida valikut lõikepuhvrisse samal ajal kui toimub sõlme teksti muutmine eraldi aknas, vajuta hiire paremklahvi ning vali sealt Kopeeri.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_372247337" MODIFIED="1216187545233">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Et lisada erisümboleid nagu näiteks ©, lisa see kõigepealt oma lemmiktekstiredaktoris nagu näiteks OpenOffice.org Writer või MS Word, ja siis kopeeri see Freeplane-i.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1445647544" MODIFIED="1216187545233">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Vaikimisi ENTER lõpetab sõlme redigeerimise ja CTRL+ENTER lisab uue rea. Märkeruudu "Enter kinnitab" märkimise eemaldamisega saad Sa muuta eeltoodud klahvikombinatsioonide mõju vastupidiseks, näiteks ENTER lisab uue rea ja CTRL+ENTER lõpetab redigeerimise. Sa võid muuta vaikimisi väärtust sellel märkeruudul eelistustest. Veelgi enam - selle märkeruudu väärtus salvestatakse ja hakkab kehtima ka siis kui [...]
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1377326758" MODIFIED="1216187545233">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Freeplane toetab täielikult unicode-i. Seetõttu võid kasutada skripte oma suva järgi.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1660149394" MODIFIED="1216201160410" POSITION="right" TEXT="Sõlme kujundamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1886238915" MODIFIED="1216187545232" TEXT="Sõlme teksti rasvaseks muutmiseks vajuta CTRL + B.">
+</node>
+<node TEXT="Sõlme teksti muutmine" FOLDED="true" POSITION="right" ID="Freeplane_Link_1700974092" CREATED="1124560950717" MODIFIED="1216201160410" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme muutmiseks vajuta F2, HOME või END klahvi, või sõlme kiirmenüüs vali Redigeeri sõlme. Sõlme redigeerimise lõpetamiseks, vajuta ENTER nupule.
 </p>
 </body>
</html>" ID="_Freeplane_Link_519923426" CREATED="1124560950717" MODIFIED="1216187545234">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlmes oleva teksti asendamiseks uuega lihtsalt alusta tippimist.
 </p>
 </body>
</html>" ID="ID_522935321" CREATED="1124560950717" MODIFIED="1216187545233">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Et sundida lühikese sisuga sõlme muutmist avanema eraldi hüpikaknas, vajuta ALT + ENTER.
 </p>
 </body>
</html>" ID="ID_645044942" CREATED="1124560950717" MODIFIED="1216187545233">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Pika sisuga sõlme poolitamiseks kasuta nuppu Poolita sõlme redaktori akna allosas või vajuta ALT + S.
 </p>
 </body>
</html>" ID="ID_683234865" CREATED="1124560950717" MODIFIED="1216187545233">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Uue rea lisamiseks sõlme redigeerimise aknas, vajuta CTRL + ENTER. Kui sõlme redigeeritakse kohapeal ilma redaktori aknata siis uue rea lisamine ei ole võimalik.
 </p>
 </body>
</html>" ID="ID_1426930299" CREATED="1124560950717" MODIFIED="1216187545233">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1445647544" STARTINCLINATION="118;0;" ENDINCLINATION="118;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Et kopeerida valikut lõikepuhvrisse samal ajal kui toimub sõlme teksti muutmine eraldi aknas, vajuta hiire paremklahvi ning vali sealt Kopeeri.
 </p>
 </body>
</html>" ID="ID_496995972" CREATED="1124560950717" MODIFIED="1216187545233">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Et lisada erisümboleid nagu näiteks ©, lisa see kõigepealt oma lemmiktekstiredaktoris nagu näiteks OpenOffice.org Writer või MS Word, ja siis kopeeri see Freeplane-i.
 </p>
 </body>
</html>" ID="ID_372247337" CREATED="1124560950717" MODIFIED="1216187545233">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Vaikimisi ENTER lõpetab sõlme redigeerimise ja CTRL+ENTER lisab uue rea. Märkeruudu "Enter kinnitab" märkimise eemaldamisega saad Sa muuta eeltoodud klahvikombinatsioonide mõju vastupidiseks, näiteks ENTER lisab uue rea ja CTRL+ENTER lõpetab redigeerimise. Sa võid muuta vaikimisi v [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Freeplane toetab täielikult unicode-i. Seetõttu võid kasutada skripte oma suva järgi.
 </p>
 </body>
</html>" ID="ID_1377326758" CREATED="1124560950717" MODIFIED="1216187545233">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Sõlme kujundamine" FOLDED="true" POSITION="right" ID="Freeplane_Link_1660149394" CREATED="1124560950717" MODIFIED="1216201160410" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Sõlme teksti rasvaseks muutmiseks vajuta CTRL + B." ID="ID_1886238915" CREATED="1124560950717" MODIFIED="1216187545232">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_999781422" MODIFIED="1216187545232" TEXT="Sõlme teksti kaldu muutmiseks vajuta CTRL + I.">
+<node TEXT="Sõlme teksti kaldu muutmiseks vajuta CTRL + I." ID="ID_999781422" CREATED="1124560950717" MODIFIED="1216187545232">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_939014888" MODIFIED="1216187545232" TEXT="Sõlme teksti värvi muutmiseks vajuta Alt + C.">
+<node TEXT="Sõlme teksti värvi muutmiseks vajuta Alt + C." ID="ID_939014888" CREATED="1124560950717" MODIFIED="1216187545232">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1116928608" MODIFIED="1216187545232">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme taustavärvi muutmiseks vali sõlme kiirmenüüst Vormindus -> Sõlme taustavärv
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1517052690" MODIFIED="1216187545232">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme kirja suuruse suurendamiseks vajuta CTRL + <font size="4">+ </font><font size="3">(mitte see + numbriklahvide juurest)</font>.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme taustavärvi muutmiseks vali sõlme kiirmenüüst Vormindus -> Sõlme taustavärv
 </p>
 </body>
</html>" ID="ID_1116928608" CREATED="1124560950717" MODIFIED="1216187545232">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme kirja suuruse suurendamiseks vajuta CTRL + <font size="4">+ </font><font size="3">(mitte see + numbriklahvide juurest)</font>.
 </p>
 </body>
</html>" ID="ID_1517052690" CREATED="1124560950717" MODIFIED="1216187545232">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1300105414" MODIFIED="1216187545232">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme kirja vähendamiseks vajuta CTRL + <font size="4">-</font> (mitte see - numbriklahvide juurest).
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme kirja vähendamiseks vajuta CTRL + <font size="4">-</font> (mitte see - numbriklahvide juurest).
 </p>
 </body>
</html>" ID="ID_1300105414" CREATED="1124560950717" MODIFIED="1216187545232">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1712083026" MODIFIED="1216187545232">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kirjakuju muutmiseks vali vastav väli peamisel tööriistaribal.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_488438696" MODIFIED="1216187545232">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme vorminduse kopeerimiseks vajuta Alt + C
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1757575811" MODIFIED="1216187545232" TEXT="Kujunduse asetamiseks To paste formats onto a node, press Alt + V.">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_526328879" MODIFIED="1216201160411" POSITION="right" TEXT="Füüsiliste stiilide kasutamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_529939824" MODIFIED="1216187545231">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Füüsilise stiili lisamiseks vali sõlme kiirmenüüst Füüsiline stiil ->Stiil Sinu valikul. Füüsiliste stiilide lisamise kiirendamiseks kasuta klaviatuuri kiirklahve nagu on sealsamas kiirmenüüs hiire parema klahvi all näidatud.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_472935372" MODIFIED="1216187545231">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Oma füüsilise stiili lisamine eeldab, et oled tehnilise pädevusega kasutaja. Muuda neid faile "patterns.xml" failis, mis asub kataloogis ".freeplane" Sinu kodukataloogis.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1514218661" MODIFIED="1216187545231">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- [See tekst on aegunud.] Märkused failist patterns.xml järgnevad. Füüsiline stiil kehtestub sõlmedele kui seal on <edge> märgend. <node> märgend võib omada alammärgeneid. Uuri faili "patterns.xml", mis on Freeplane-iga kaasa pandud.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1697687428" MODIFIED="1216201160411" POSITION="right" TEXT="Sõlmede esiletõstmine pilvedega">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1187980137" MODIFIED="1216187545231">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Pilvi kasutatakse mingi ala esiletõstmiseks. Esile tõstetakse nii sõlm kui ka kõik selle all olevad sõlmed.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1656028711" MODIFIED="1216187545231">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Pilve lisamiseks vajuta CTRL + SHIFT + B või vali sõlme kiirmenüüst Lisamine -> Pilv.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1229313572" MODIFIED="1216187545230">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme värvi muutmiseks vali sõlme kiirmenüüst Vormindus -> Pilve värv.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" FOLDED="true" ID="ID_1967714751" MODIFIED="1216200835997">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Pilvedel võib olla erinevaid taustavärve, nt roheline ...
- </p>
- </body>
-</html></richcontent>
-<cloud COLOR="#e1f2e1"/>
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_480742681" MODIFIED="1216187545230" TEXT="... või pruun.">
-<cloud COLOR="#ede5d5"/>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_203858515" MODIFIED="1216201160412" POSITION="right" TEXT="Hüperviidete lisamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1905021887" MODIFIED="1216187545230">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Hüperviite lisamiseks sõlmele vajuta CTRL + K või vali sõlme kiirmenüüst Lisamine -> Hüperviide.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1725364546" MODIFIED="1216187545230">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Hüperviite eemaldamiseks kustuta hüperviide pärast CTRL + K vajutamist avanevast hüpikaknast.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1115329778" MODIFIED="1216187545230">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Viite tegemiseks e-postiaadressile määra hüperviite tekstiks näiteks <i>mailto:eesnimi.perenimi at mail</i>.ee
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kirjakuju muutmiseks vali vastav väli peamisel tööriistaribal.
 </p>
 </body>
</html>" ID="ID_1712083026" CREATED="1124560950717" MODIFIED="1216187545232">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme vorminduse kopeerimiseks vajuta Alt + C
 </p>
 </body>
</html>" ID="ID_488438696" CREATED="1124560950717" MODIFIED="1216187545232">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Kujunduse asetamiseks To paste formats onto a node, press Alt + V." ID="ID_1757575811" CREATED="1124560950717" MODIFIED="1216187545232">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Füüsiliste stiilide kasutamine" FOLDED="true" POSITION="right" ID="Freeplane_Link_526328879" CREATED="1124560950717" MODIFIED="1216201160411" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Füüsilise stiili lisamiseks vali sõlme kiirmenüüst Füüsiline stiil ->Stiil Sinu valikul. Füüsiliste stiilide lisamise kiirendamiseks kasuta klaviatuuri kiirklahve nagu on sealsamas kiirmenüüs hiire parema klahvi all näidatud.
 </p>
 </b [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Oma füüsilise stiili lisamine eeldab, et oled tehnilise pädevusega kasutaja. Muuda neid faile "patterns.xml" failis, mis asub kataloogis ".freeplane" Sinu kodukataloogis.
 </p>
 </body>
</html>" ID="ID_472935372" CREATED="1124560950717" MODIFIED="1216187545231">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 [See tekst on aegunud.] Märkused failist patterns.xml järgnevad. Füüsiline stiil kehtestub sõlmedele kui seal on <edge> märgend. <node> märgend võib omada alammärgeneid. Uuri faili "patterns.xml", mis on Freeplane-iga kaasa pandud.
 </ [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Sõlmede esiletõstmine pilvedega" FOLDED="true" POSITION="right" ID="Freeplane_Link_1697687428" CREATED="1124560950717" MODIFIED="1216201160411" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Pilvi kasutatakse mingi ala esiletõstmiseks. Esile tõstetakse nii sõlm kui ka kõik selle all olevad sõlmed.
 </p>
 </body>
</html>" ID="ID_1187980137" CREATED="1124560950717" MODIFIED="1216187545231">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Pilve lisamiseks vajuta CTRL + SHIFT + B või vali sõlme kiirmenüüst Lisamine -> Pilv.
 </p>
 </body>
</html>" ID="ID_1656028711" CREATED="1124560950717" MODIFIED="1216187545231">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme värvi muutmiseks vali sõlme kiirmenüüst Vormindus -> Pilve värv.
 </p>
 </body>
</html>" ID="ID_1229313572" CREATED="1124560950717" MODIFIED="1216187545230">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Pilvedel võib olla erinevaid taustavärve, nt roheline ...
 </p>
 </body>
</html>" FOLDED="true" ID="ID_1967714751" CREATED="1124560950717" MODIFIED="1216200835997">
+<cloud COLOR="#e1f2e1" SHAPE="ARC"/>
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="... või pruun." ID="ID_480742681" CREATED="1124560950717" MODIFIED="1216187545230">
+<cloud COLOR="#ede5d5" SHAPE="ARC"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Hüperviidete lisamine" FOLDED="true" POSITION="right" ID="Freeplane_Link_203858515" CREATED="1124560950717" MODIFIED="1216201160412" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Hüperviite lisamiseks sõlmele vajuta CTRL + K või vali sõlme kiirmenüüst Lisamine -> Hüperviide.
 </p>
 </body>
</html>" ID="ID_1905021887" CREATED="1124560950717" MODIFIED="1216187545230">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Hüperviite eemaldamiseks kustuta hüperviide pärast CTRL + K vajutamist avanevast hüpikaknast.
 </p>
 </body>
</html>" ID="ID_1725364546" CREATED="1124560950717" MODIFIED="1216187545230">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Viite tegemiseks e-postiaadressile määra hüperviite tekstiks näiteks <i>mailto:eesnimi.perenimi at mail</i>.ee
 </p>
 </body>
</html>" ID="ID_1115329778" CREATED="1124560950717" MODIFIED="1216187545230">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1492211565" MODIFIED="1216187545230">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Koos kirjateemaga e-postiaadressile viite tegemiseks määra hüperviite sisuks <i>mailto:eesnimi.perenimi at mail</i>.<i>ee?subject=Viimane telefonikõne</i>
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Koos kirjateemaga e-postiaadressile viite tegemiseks määra hüperviite sisuks <i>mailto:eesnimi.perenimi at mail</i>.<i>ee?subject=Viimane telefonikõne</i>
 </p>
 </body>
</html>" ID="ID_1492211565" CREATED="1124560950717" MODIFIED="1216187545230">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_75591401" MODIFIED="1216187545229">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Hüperviiteid saab panna viitama veebilehtedele, kohalikele failidele või e-postiaadressidele.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Hüperviiteid saab panna viitama veebilehtedele, kohalikele failidele või e-postiaadressidele.
 </p>
 </body>
</html>" ID="ID_75591401" CREATED="1124560950717" MODIFIED="1216187545229">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1044397139" MODIFIED="1216201160413" POSITION="right" TEXT="Ikoonide lisamine">
+<node TEXT="Ikoonide lisamine" FOLDED="true" POSITION="right" ID="Freeplane_Link_1044397139" CREATED="1124560950717" MODIFIED="1216201160413" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
+<node TEXT=" Sõlmes võib olla mitu ikooni. " ID="ID_530415806" CREATED="1124560950717" MODIFIED="1216187545227">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Ikooni lisamiseks sõlme, vali sõlm ja klõpsa ühel ikoonidest vasakul tööriistaribal. Hiirekursori liigutamisel vasakul asuvale tööriistaribale, hoia all ALT- või CTRL-klahvi, et Sa ei kaotaks fookust.
 </p>
 </body>
</html>" ID="ID_552368878" CREATED="11245 [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Ühe ikooni eemaldamiseks vajuta punast risti vasakpoolse tööriistariba ülaosas. 
 </p>
 </body>
</html>" ID="ID_1584241525" CREATED="1124560950717" MODIFIED="1216187545227">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_530415806" MODIFIED="1216187545227" TEXT=" Sõlmes võib olla mitu ikooni. ">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_552368878" MODIFIED="1216187545227">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Ikooni lisamiseks sõlme, vali sõlm ja klõpsa ühel ikoonidest vasakul tööriistaribal. Hiirekursori liigutamisel vasakul asuvale tööriistaribale, hoia all ALT- või CTRL-klahvi, et Sa ei kaotaks fookust.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1584241525" MODIFIED="1216187545227">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Ühe ikooni eemaldamiseks vajuta punast risti vasakpoolse tööriistariba ülaosas.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_741996931" MODIFIED="1216187545226">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kõikide ikoonide korraga eemaldamiseks vajuta prügikasti kujutavat ikooni vasakpoolse tööriistariba ülaosas.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1106300423" MODIFIED="1216187545226">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Uue ikooni sõlme lisamiseks klaviatuuri abil vajuta ALT + I.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_5062099" MODIFIED="1216187545226">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Oma ikoonide kasutamise võimalus puudub; Sa saad valida ikoone üksnes Freeplane-iga kaasatulevate ikoonide hulgast.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_492956634" MODIFIED="1216187545226">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Ikoonide tööriistariba peitmiseks või näitamiseks vasakul tööriistaribal, vali taustal hiire kiirmenüüst Lülita vasakut tööriistariba. Ikoonide tööriistariba kutsutakse seal: Teine tööriistariba.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_228388619" MODIFIED="1216187545226">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kui ikoonid on lisatud nagu siin sõlmel siis need pannakse kaasa ja enamgi veel.
- </p>
- </body>
-</html></richcontent>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kõikide ikoonide korraga eemaldamiseks vajuta prügikasti kujutavat ikooni vasakpoolse tööriistariba ülaosas.
 </p>
 </body>
</html>" ID="ID_741996931" CREATED="1124560950717" MODIFIED="1216187545226">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Uue ikooni sõlme lisamiseks klaviatuuri abil vajuta ALT + I.
 </p>
 </body>
</html>" ID="ID_1106300423" CREATED="1124560950717" MODIFIED="1216187545226">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Oma ikoonide kasutamise võimalus puudub; Sa saad valida ikoone üksnes Freeplane-iga kaasatulevate ikoonide hulgast.
 </p>
 </body>
</html>" ID="ID_5062099" CREATED="1124560950717" MODIFIED="1216187545226">
<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Ikoonide tööriistariba peitmiseks või näitamiseks vasakul tööriistaribal, vali taustal hiire kiirmenüüst Lülita vasakut tööriistariba. Ikoonide tööriistariba kutsutakse seal: Teine tööriistariba.
 </p>
 </body>&#x [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kui ikoonid on lisatud nagu siin sõlmel siis need pannakse kaasa ja enamgi veel.
 </p>
 </body>
</html>" ID="ID_228388619" CREATED="1124560950717" MODIFIED="1216187545226">
<icon BUILTIN="help"/>
<icon BUILTIN="messagebox_warning"/>
<icon BUILTIN="idea"/>
@@ -1567,1490 +830,462 @@
<icon BUILTIN="bookmark"/>
<icon BUILTIN="penguin"/>
<icon BUILTIN="licq"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
</node>
+<node TEXT="Graafiliste viidete lisamine" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1996597932" CREATED="1124560950717" MODIFIED="1216201160413" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Graafiliste viidete tegemiseks kahe sõlme vahel haara ühest sõlmest ja kukuta see teisele sõlmele, samal ajal SHIFT + CTRL klahve korraga all hoides. Vabasta hiireklahv ennem klaviatuuri klahve.
 </p>
 </body>
</html>" ID="ID_706501552" CREATED="1124560950717" MODIFIED="1216187545225">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#b0b0b0" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="250;-7;" ENDINCLINATION="289;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Teine võimalus - märgi CTRL-klahvi all hoides kaks sõlme ja vajuta CTRL + L
 </p>
 </body>
</html>" ID="ID_1666507871" CREATED="1124560950717" MODIFIED="1216187545225">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Graafilise viite värvi muutmiseks kasuta hiire kiirmenüüd, mis avaneb hiire paremklahvi alt kui sellel graafilisel viitel klõpsata.
 </p>
 </body>
</html>" ID="_Freeplane_Link_208378337" CREATED="1124560950717" MODIFIED="1216187545225">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Joone nooleotse muutmiseks kasuta taas kiirmenüüd (hiire paremklahviga klõps graafilisel viitel).
 </p>
 </body>
</html>" ID="_Freeplane_Link_1484370636" CREATED="1124560950717" MODIFIED="1216187545225">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Graafilise viite kustutamiseks kasuta graafilise viite kiirmenüüd (hiire paremklahvi alt vali: Kustuta graafiline viide).
 </p>
 </body>
</html>" ID="ID_1015136152" CREATED="1124560950717" MODIFIED="1216187545225">
+<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1996597932" MODIFIED="1216201160413" POSITION="right" TEXT="Graafiliste viidete lisamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_706501552" MODIFIED="1216187545225">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Graafiliste viidete tegemiseks kahe sõlme vahel haara ühest sõlmest ja kukuta see teisele sõlmele, samal ajal SHIFT + CTRL klahve korraga all hoides. Vabasta hiireklahv ennem klaviatuuri klahve.
- </p>
- </body>
-</html></richcontent>
-<arrowlink COLOR="#b0b0b0" DESTINATION="_Freeplane_Link_266716332" ENDARROW="Default" ENDINCLINATION="289;0;" ID="Freeplane_Arrow_Link_1428344028" STARTARROW="None" STARTINCLINATION="250;-7;"/>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1666507871" MODIFIED="1216187545225">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Teine võimalus - märgi CTRL-klahvi all hoides kaks sõlme ja vajuta CTRL + L
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_208378337" MODIFIED="1216187545225">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Graafilise viite värvi muutmiseks kasuta hiire kiirmenüüd, mis avaneb hiire paremklahvi alt kui sellel graafilisel viitel klõpsata.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1484370636" MODIFIED="1216187545225">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Joone nooleotse muutmiseks kasuta taas kiirmenüüd (hiire paremklahviga klõps graafilisel viitel).
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1015136152" MODIFIED="1216187545225">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Graafilise viite kustutamiseks kasuta graafilise viite kiirmenüüd (hiire paremklahvi alt vali: Kustuta graafiline viide).
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_266716332" MODIFIED="1216187545225">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Et kiiresti liikuda (fokusseerida vaade) graafilise viite algus- või lõpp-punkti, kasuta selle viite kiirmenüüd.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1015289745" MODIFIED="1216187545225">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Graafilise viite liigutamiseks ja asendi muutmiseks, haara hiire vasaku klahviga sellest kinni ja muuda noole asendit.
- </p>
- </body>
-</html></richcontent>
-<arrowlink DESTINATION="_Freeplane_Link_266716332" ENDARROW="Default" ENDINCLINATION="256;22;" ID="Freeplane_Arrow_Link_1273596772" STARTARROW="None" STARTINCLINATION="244;32;"/>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_315327090" MODIFIED="1216187545225" TEXT="Alljärgnevalt graafiliste viidete näited.">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_444873207" MODIFIED="1216200835997" TEXT="Näidis">
-<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" ID="_Freeplane_Link_1170112929" MODIFIED="1216187545225" TEXT="Viide teisele osale">
-<arrowlink COLOR="#9999ff" DESTINATION="_Freeplane_Link_1492563156" ENDARROW="Default" ENDINCLINATION="154;-5;" ID="Freeplane_Arrow_Link_33407992" STARTARROW="Default" STARTINCLINATION="154;-6;"/>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_210427206" MODIFIED="1216187545225">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlm koos kokkuvolditud alamsõlmega
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1492563156" MODIFIED="1216187545224" TEXT="Alamsõlm"/>
-</node>
-<node COLOR="#996600" CREATED="1124560950717" ID="_Freeplane_Link_1370577235" MODIFIED="1216187545224" TEXT="Teine viide">
-<arrowlink COLOR="#b0b0b0" DESTINATION="_Freeplane_Link_1170112929" ENDARROW="Default" ENDINCLINATION="126;16;" ID="Freeplane_Arrow_Link_1872050149" STARTARROW="None" STARTINCLINATION="28;1;"/>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_423038022" MODIFIED="1216201160414" POSITION="right" TEXT="Otsimine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_729626319" MODIFIED="1216187545224">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Teksti otsimiseks sõlmest ja selle all olevatest sõlmedest, vajuta CTRL + F või rippmenüüst vali Redigeerimine -> Otsi.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1108790262" MODIFIED="1216187545224">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Järgmise vastavuse otsimiseks sama otsingusõnaga, vajuta CTRL + G või rippmenüüst vali Redigeerimine -> Otsi järgmine.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1842831668" MODIFIED="1216187545223">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kogu kaardi ulatuses globaalse otsingu sooritamiseks tuleb eelnevalt ESC-klahvi abil peasõlm aktiveerida ehk siis kaart algasendisse viia..
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1918000612" MODIFIED="1216187545223">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Otsingu laius sõltub sisestatud otsingusõnast(-dest). See vastab ideele, et mida sügavam on sõlm, seda parem on detail, mis on sõlmes kirjeldatud.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1054705788" MODIFIED="1216187545223">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Pea meeles, et mitte kogu kaarti ei otsita läbi vaid ainult konkreetne sõlm ja selle all olevad sõlmed.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_653540280" MODIFIED="1216201160415" POSITION="right" TEXT="Mitme sõlme valimine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1989692981" MODIFIED="1216187545217">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Mitme sõlme korraga valimiseks hoia hiire vasaku klahviga klõpsamise ajal all kas CTRL- või SHIFT-klahvi.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_139767984" MODIFIED="1216187545197">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Juba valitud sõlmele alamsõlme lisamiseks, hoia hiire vasaku klahviga klõpsamise ajal all CTRL-klahvi.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_108535754" MODIFIED="1216187545173">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Järjestikku mitme sõlme valimiseks hoia hiire vasaku klahviga klõpsimise ajal või siis nooleklahvide abil liikudes all SHIFT klahvi.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1610175580" MODIFIED="1216187545146">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kogu sõlmepuu valimiseks vajuta CTRL + SHIFT + A või hoia all SHIFT-klahvi kui nooleklahviga sõlmepuus allapoole liigud.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1616941396" MODIFIED="1216187545118">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Mitme sõlme märkimise eemaldamiseks klõpsa kaardi taustal või valimata sõlmel.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_227748526" MODIFIED="1216187545096">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kõikide nähtavate (ehk siis kogu kaardil olevate) sõlmede märkimiseks vali CTRL + A või rippmenüüst Redigeerimine -> Vali kõik nähtav.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1024903226" MODIFIED="1216201160415" POSITION="right" TEXT="Haaramine ja lohistamine">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Et kiiresti liikuda (fokusseerida vaade) graafilise viite algus- või lõpp-punkti, kasuta selle viite kiirmenüüd.
 </p>
 </body>
</html>" ID="_Freeplane_Link_266716332" CREATED="1124560950717" MODIFIED="1216187545225">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Graafilise viite liigutamiseks ja asendi muutmiseks, haara hiire vasaku klahviga sellest kinni ja muuda noole asendit.
 </p>
 </body>
</html>" ID="_Freeplane_Link_1015289745" CREATED="1124560950717" MODIFIED="1216187545225">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="244;32;" ENDINCLINATION="256;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Alljärgnevalt graafiliste viidete näited." ID="ID_315327090" CREATED="1124560950717" MODIFIED="1216187545225">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Näidis" FOLDED="true" ID="ID_444873207" CREATED="1124560950717" MODIFIED="1216200835997" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Viide teisele osale" ID="_Freeplane_Link_1170112929" CREATED="1124560950717" MODIFIED="1216187545225" COLOR="#996600">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#9999ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1492563156" STARTINCLINATION="154;-6;" ENDINCLINATION="154;-5;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlm koos kokkuvolditud alamsõlmega
 </p>
 </body>
</html>" FOLDED="true" ID="ID_210427206" CREATED="1124560950717" MODIFIED="1216187545225" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Alamsõlm" ID="_Freeplane_Link_1492563156" CREATED="1124560950717" MODIFIED="1216187545224"/>
+</node>
+<node TEXT="Teine viide" ID="_Freeplane_Link_1370577235" CREATED="1124560950717" MODIFIED="1216187545224" COLOR="#996600">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#b0b0b0" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1170112929" STARTINCLINATION="28;1;" ENDINCLINATION="126;16;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Otsimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_423038022" CREATED="1124560950717" MODIFIED="1216201160414" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Teksti otsimiseks sõlmest ja selle all olevatest sõlmedest, vajuta CTRL + F või rippmenüüst vali Redigeerimine -> Otsi.
 </p>
 </body>
</html>" ID="ID_729626319" CREATED="1124560950717" MODIFIED="1216187545224">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Järgmise vastavuse otsimiseks sama otsingusõnaga, vajuta CTRL + G või rippmenüüst vali Redigeerimine -> Otsi järgmine.
 </p>
 </body>
</html>" ID="ID_1108790262" CREATED="1124560950717" MODIFIED="1216187545224">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kogu kaardi ulatuses globaalse otsingu sooritamiseks tuleb eelnevalt ESC-klahvi abil peasõlm aktiveerida ehk siis kaart algasendisse viia..
 </p>
 </body>
</html>" ID="ID_1842831668" CREATED="1124560950717" MODIFIED="1216187545223">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Otsingu laius sõltub sisestatud otsingusõnast(-dest). See vastab ideele, et mida sügavam on sõlm, seda parem on detail, mis on sõlmes kirjeldatud.
 </p>
 </body>
</html>" ID="ID_1918000612" CREATED="1124560950717" MODIFIED="1216187545223">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Pea meeles, et mitte kogu kaarti ei otsita läbi vaid ainult konkreetne sõlm ja selle all olevad sõlmed.
 </p>
 </body>
</html>" ID="ID_1054705788" CREATED="1124560950717" MODIFIED="1216187545223">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Mitme sõlme valimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_653540280" CREATED="1124560950717" MODIFIED="1216201160415" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Mitme sõlme korraga valimiseks hoia hiire vasaku klahviga klõpsamise ajal all kas CTRL- või SHIFT-klahvi.
 </p>
 </body>
</html>" ID="ID_1989692981" CREATED="1124560950717" MODIFIED="1216187545217">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Juba valitud sõlmele alamsõlme lisamiseks, hoia hiire vasaku klahviga klõpsamise ajal all CTRL-klahvi.
 </p>
 </body>
</html>" ID="ID_139767984" CREATED="1124560950717" MODIFIED="1216187545197">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Järjestikku mitme sõlme valimiseks hoia hiire vasaku klahviga klõpsimise ajal või siis nooleklahvide abil liikudes all SHIFT klahvi.
 </p>
 </body>
</html>" ID="ID_108535754" CREATED="1124560950717" MODIFIED="1216187545173">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kogu sõlmepuu valimiseks vajuta CTRL + SHIFT + A või hoia all SHIFT-klahvi kui nooleklahviga sõlmepuus allapoole liigud.
 </p>
 </body>
</html>" ID="ID_1610175580" CREATED="1124560950717" MODIFIED="1216187545146">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Mitme sõlme märkimise eemaldamiseks klõpsa kaardi taustal või valimata sõlmel.
 </p>
 </body>
</html>" ID="ID_1616941396" CREATED="1124560950717" MODIFIED="1216187545118">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kõikide nähtavate (ehk siis kogu kaardil olevate) sõlmede märkimiseks vali CTRL + A või rippmenüüst Redigeerimine -> Vali kõik nähtav.
 </p>
 </body>
</html>" ID="ID_227748526" CREATED="1124560950717" MODIFIED="1216187545096">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Haaramine ja lohistamine" FOLDED="true" POSITION="right" ID="Freeplane_Link_1024903226" CREATED="1124560950717" MODIFIED="1216201160415" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sa saad sõlmi liigutada kui hiire vasaku klahviga neist kinni haarad ja uues kohas lahti lased.
 </p>
 </body>
</html>" ID="ID_250792124" CREATED="1124560950717" MODIFIED="1216189240840">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme liigutamiseks tuleb hiire vasaku klahviga haarata kinni selle ees olevast sõõrist, mis ilmub sinna hiirekursori liigutamisel.
 </p>
 </body>
</html>" ID="ID_1720133090" CREATED="1124560950717" MODIFIED="1216189839238">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme viimiseks otse peasõlme alla, haara lihtsalt hiire vasaku klahviga sõlmest kinni ja lohista peasõlme kohale.
 </p>
 </body>
</html>" ID="ID_1326060747" CREATED="1124560950717" MODIFIED="1216189990967">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme kopeerimiseks (mitte liigutamiseks), hoia all CTRL-klahvi kui lohistad või lohista hiire keskmist klahvi all hoides.
 </p>
 </body>
</html>" ID="_Freeplane_Link_1994214827" CREATED="1124560950717" MODIFIED="1216190054560">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Olemasoleva kaardi muutmiseks, lohista ja kukuta see Freeplane-i taustale. See töötab vähemalt MS Windowsi operatsioonisüsteemis.
 </p>
 </body>
</html>" ID="ID_489432369" CREATED="1124560950717" MODIFIED="1216190811579">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Graafilise viite loomiseks hoia all CTRL + SHIFT klahve ja siis haara ja kukuta üks sõlm teise peale.
 </p>
 </body>
</html>" ID="ID_503769565" CREATED="1124560950717" MODIFIED="1216190863653">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kui mitu sõlme on valitud siis neid kõiki liigutatakse või kopeeritakse.
 </p>
 </body>
</html>" ID="ID_1640826119" CREATED="1124560950717" MODIFIED="1216190918888">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sa võid kukutada infot välistest rakendustest, näiteks faile MS Windowsi operatsioonisüsteemis, või märgitud tekstijuppe MS Internet Explorerist.
 </p>
 </body>
</html>" ID="ID_1894344956" CREATED="1124560950717" MODIFIED="1216190990203">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Kopeerimine ja asetamine" FOLDED="true" POSITION="right" ID="Freeplane_Link_958781924" CREATED="1124560950717" MODIFIED="1216201212458" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sa saad kopeerida ja asetada (mitut) sõlme erinevate mõttekaartide vahel. Lisaks saad asetada tavalist teksti või HTML-i teistest programmidest.
 </p>
 </body>
</html>" ID="ID_577944755" CREATED="1124560950717" MODIFIED="1216191126681">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_250792124" MODIFIED="1216189240840">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sa saad sõlmi liigutada kui hiire vasaku klahviga neist kinni haarad ja uues kohas lahti lased.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1720133090" MODIFIED="1216189839238">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme liigutamiseks tuleb hiire vasaku klahviga haarata kinni selle ees olevast sõõrist, mis ilmub sinna hiirekursori liigutamisel.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1326060747" MODIFIED="1216189990967">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme viimiseks otse peasõlme alla, haara lihtsalt hiire vasaku klahviga sõlmest kinni ja lohista peasõlme kohale.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1994214827" MODIFIED="1216190054560">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme kopeerimiseks (mitte liigutamiseks), hoia all CTRL-klahvi kui lohistad või lohista hiire keskmist klahvi all hoides.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_489432369" MODIFIED="1216190811579">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Olemasoleva kaardi muutmiseks, lohista ja kukuta see Freeplane-i taustale. See töötab vähemalt MS Windowsi operatsioonisüsteemis.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_503769565" MODIFIED="1216190863653">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Graafilise viite loomiseks hoia all CTRL + SHIFT klahve ja siis haara ja kukuta üks sõlm teise peale.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1640826119" MODIFIED="1216190918888">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kui mitu sõlme on valitud siis neid kõiki liigutatakse või kopeeritakse.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950717" ID="ID_1894344956" MODIFIED="1216190990203">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sa võid kukutada infot välistest rakendustest, näiteks faile MS Windowsi operatsioonisüsteemis, või märgitud tekstijuppe MS Internet Explorerist.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_958781924" MODIFIED="1216201212458" POSITION="right" TEXT="Kopeerimine ja asetamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_577944755" MODIFIED="1216191126681">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sa saad kopeerida ja asetada (mitut) sõlme erinevate mõttekaartide vahel. Lisaks saad asetada tavalist teksti või HTML-i teistest programmidest.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_257303524" MODIFIED="1216191297451">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kui asetad tavalist teksti siis eraldi ridadel olev tekst asetatakse eraldi sõlmedena koos nende sügavustega, mis määratakse kindlaks teksti märkide arvuga. Allpool ka mõned näited.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kui asetad tavalist teksti siis eraldi ridadel olev tekst asetatakse eraldi sõlmedena koos nende sügavustega, mis määratakse kindlaks teksti märkide arvuga. Allpool ka mõned näited.
 </p>
 </body>
</html>" ID="ID_257303524" CREATED="1124560950717" MODIFIED="1216191297451">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_931741001" MODIFIED="1216200835998">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Puu<br /> Tamm<br /> Pöök<br />
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Puu<br >     Tamm<br >     Pöök<br >     
 </p>
 </body>
</html>" FOLDED="true" ID="ID_931741001" CREATED="1124560950717" MODIFIED="1216200835998" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" FOLDED="true" ID="ID_1174875076" MODIFIED="1216191388934" TEXT="asetatakse kui">
+<node TEXT="asetatakse kui" FOLDED="true" ID="ID_1174875076" CREATED="1124560950717" MODIFIED="1216191388934">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_630727847" MODIFIED="1216191387928" TEXT="Puu">
+<node TEXT="Puu" FOLDED="true" ID="ID_630727847" CREATED="1124560950717" MODIFIED="1216191387928" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_10517981" MODIFIED="1216191366645" TEXT="Tamm">
+<node TEXT="Tamm" ID="ID_10517981" CREATED="1124560950717" MODIFIED="1216191366645" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_1473809424" MODIFIED="1216191371256" TEXT="Pöök">
+<node TEXT="Pöök" ID="ID_1473809424" CREATED="1124560950717" MODIFIED="1216191371256" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="ID_1117632907" MODIFIED="1216191656046">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kui asetad HTML-i siis asetatakse see kui paljas tekst. Lisaks asetatakse HTML-is olnud viited alamsõlmedena. Allpool ka mõned näited.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kui asetad HTML-i siis asetatakse see kui paljas tekst. Lisaks asetatakse HTML-is olnud viited alamsõlmedena. Allpool ka mõned näited.
 </p>
 </body>
</html>" ID="ID_1117632907" CREATED="1124560950717" MODIFIED="1216191656046">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" FOLDED="true" ID="ID_1182968610" MODIFIED="1216200835998" TEXT="Näidistulemus pärast asetamist:">
+<node TEXT="Näidistulemus pärast asetamist:" FOLDED="true" ID="ID_1182968610" CREATED="1124560950717" MODIFIED="1216200835998">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1854872512" MODIFIED="1216195174178" TEXT="Ostmine (120236)">
+<node TEXT="Ostmine (120236)" ID="ID_1854872512" CREATED="1124560950717" MODIFIED="1216195174178">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1197617245" MODIFIED="1216195181063" TEXT="Linnaelu (19)">
+<node TEXT="Linnaelu (19)" ID="ID_1197617245" CREATED="1124560950717" MODIFIED="1216195181063">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" FOLDED="true" ID="ID_1425509419" MODIFIED="1216197300613" TEXT="Viited">
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1869102188" LINK="http://directory.google.com/Top/Shopping/" MODIFIED="1216195187114" TEXT="Ostmine">
+<node TEXT="Viited" FOLDED="true" ID="ID_1425509419" CREATED="1124560950717" MODIFIED="1216197300613">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+<node TEXT="Ostmine" ID="ID_1869102188" CREATED="1124560950717" MODIFIED="1216195187114" LINK="http://directory.google.com/Top/Shopping/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1972970821" LINK="http://directory.google.com/Top/Home/Urban_Living/" MODIFIED="1216195192339" TEXT="Linnaelu">
+<node TEXT="Linnaelu" ID="ID_1972970821" CREATED="1124560950717" MODIFIED="1216195192339" LINK="http://directory.google.com/Top/Home/Urban_Living/">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="ID_479429594" MODIFIED="1216195518969">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kui asetad failide nimekirja MS Explorerist MS Windowsis siis see asetatakse viidetena neile failidele.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kui asetad failide nimekirja MS Explorerist MS Windowsis siis see asetatakse viidetena neile failidele.
 </p>
 </body>
</html>" ID="ID_479429594" CREATED="1124560950717" MODIFIED="1216195518969">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1680490246" MODIFIED="1216195773963">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kui Sa kopeerid Freeplane-is sõlmede haru ja asetad selle lihtsasse tekstiredaktorisse siis sõlmede puu struktuuri näidatakse taanetega. Hüperviited paigutatakse <> sulgude vahele vahele. Allpool ka mõned näited.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kui Sa kopeerid Freeplane-is sõlmede haru ja asetad selle lihtsasse tekstiredaktorisse siis sõlmede puu struktuuri näidatakse taanetega. Hüperviited paigutatakse <> sulgude vahele vahele. Allpool ka mõned näited.
 </p>
 </body>
</html>" ID="ID_1680490246" CREATED="11245 [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_1454908790" MODIFIED="1216200835998" TEXT="Puu">
+<node TEXT="Puu" FOLDED="true" ID="ID_1454908790" CREATED="1124560950717" MODIFIED="1216200835998" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_633110419" MODIFIED="1216195798447" TEXT="Tamm">
+<node TEXT="Tamm" ID="ID_633110419" CREATED="1124560950717" MODIFIED="1216195798447" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_838560951" MODIFIED="1216200829358" TEXT="Pöök">
+<node TEXT="Pöök" FOLDED="true" ID="ID_838560951" CREATED="1124560950717" MODIFIED="1216200829358" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" FOLDED="true" ID="ID_1676658451" MODIFIED="1216197295548" TEXT="asetatakse kui">
+<node TEXT="asetatakse kui" FOLDED="true" ID="ID_1676658451" CREATED="1124560950717" MODIFIED="1216197295548">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950732" ID="ID_1486548715" MODIFIED="1216195827676">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Puu<br /> Tamm<br /> Pöök<br /> Google <http://www.google.ee/><br />
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Puu<br >     Tamm<br >     Pöök<br >     Google <http://www.google.ee/><br >
 </p>
 </body>
</html>" ID="ID_1486548715" CREATED="1124560950732" MOD [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950732" ID="ID_1324389903" LINK="http://www.google.ee/" MODIFIED="1216195837675" TEXT="Google">
+<node TEXT="Google" ID="ID_1324389903" CREATED="1124560950732" MODIFIED="1216195837675" LINK="http://www.google.ee/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950732" ID="ID_1898109526" MODIFIED="1216196259445">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kui Freeplane-is kopeerida sõlmede haru ja asetada see redaktorisse, mis mõistab rikkalikku teksti vormindust siis see vormindus koos teksti värvi ja kirjakujuga asetatakse samuti. Hüperviited asetatakse <> sulgudesse kui tavaline tekst. Redaktorid, mis mõistavad rikkalikku teksti vormindamist: MS Word, MS Wordpad or MS Outlook, või mõned kaartidega tekstiredaktorid Linuxis.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kui Freeplane-is kopeerida sõlmede haru ja asetada see redaktorisse, mis mõistab rikkalikku teksti vormindust siis see vormindus koos teksti värvi ja kirjakujuga asetatakse samuti. Hüperviited asetatakse <> sulgudesse kui tavaline tekst. Redaktorid, mis mõistavad rikkalikku teksti vormindamist: MS Word, MS Wordp [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950732" ID="ID_1853517240" MODIFIED="1216197263566">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme kopeerimiseks ilma alamsõlmedeta, vajuta CTRL + Y või sõlme kiirmenüüst kasuta valikut Kopeeri üksik.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme kopeerimiseks ilma alamsõlmedeta, vajuta CTRL + Y või sõlme kiirmenüüst kasuta valikut Kopeeri üksik.
 </p>
 </body>
</html>" ID="ID_1853517240" CREATED="1124560950732" MODIFIED="1216197263566">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="_Freeplane_Link_1540212684" MODIFIED="1216201160416" POSITION="right" TEXT="Liigutamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1635291337" MODIFIED="1216200459000">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Tekstikursori liigutamiseks üles, alla, vasakule või paremale; kasuta nooleklahve.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1763373897" MODIFIED="1216200543444">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Hetkel eesoleva sõlmede haru algusesse liikumiseks vajuta PageUp klahvile.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1810026836" MODIFIED="1216200571377">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Hetkel eesoleva sõlmede haru lõppu liikumiseks vajuta PageDown klahvile.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1423109092" MODIFIED="1216200609283">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Keskele peasõlme juurde liikumiseks vajuta ESC-klahvile.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="_Freeplane_Link_97763226" MODIFIED="1216200695317">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme vabaks paigutamiseks kaardil lohista seda tema nähtamatust sõõrist (asub sõlme ees ja ilmub nähtavale kui hiir selle kohale viia) kinni haarates.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_4727471" MODIFIED="1216201537122" POSITION="right" TEXT="Sõlmede kokku- ja lahtivoltimine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_993136713" MODIFIED="1216200802609">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme kokkuvoltimiseks vajuta tühikuklahvi või sõlme kiirmenüüst vali: Lülita voltimist ümber.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_635085497" MODIFIED="1216200820736">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlme lahtivoltimiseks vajuta tühikuklahvi või sõlme kiirmenüüst vali: Lülita voltimist ümber.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1966037322" MODIFIED="1216201147632">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Tasemete kokku/lahti voltimiseks hoia alla ALT-klahvi ja samal ajal keri hiireratast, või vajuta ALT+PageUp või ka ALT + PageDown. Suurte ja mahukate kaartide puhul on soovitav seda omadust ettevaatlikult kasutada kuna siin võib tekkida probleeme (nt mälu jääb väheks).
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_780574400" MODIFIED="1216201322323">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kõikide sõlmede korraga lahtivoltimiseks vajuta halli plussmärgiga nuppu tööriistaribal või kasuta rippmenüüd Liikumine -> Voldi kõik lahti.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_150591996" MODIFIED="1216201375516">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kõikide sõlmede korraga kokkuvoltimiseks vajuta halli miinusmärgiga nuppu tööriistaribal või kasuta rippmenüüd Liikumine -> Voldi kõik kokku.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1059424946" MODIFIED="1216201528954">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kokkuvolditud sõlm on tähistatud väikese ringiga selle alumise parema nurga juures.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_467411537" MODIFIED="1216201656349" POSITION="right" TEXT="Mõttekaartide kerimine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_109928081" MODIFIED="1216201653254">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kaardi kerimiseks lohista seda hiire vasaku klahviga taustast kinni võttes või lihtsalt hiire ratast kerides. Horisontaalselt hiire rattaga kerimiseks hoia samaegselt all SHIFT-klahvi või mõnda hiire klahvi.
- </p>
- </body>
-</html></richcontent>
-<edge WIDTH="thin"/>
+<node TEXT="Liigutamine" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1540212684" CREATED="1124560950732" MODIFIED="1216201160416" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Tekstikursori liigutamiseks üles, alla, vasakule või paremale; kasuta nooleklahve.
 </p>
 </body>
</html>" ID="ID_1635291337" CREATED="1124560950732" MODIFIED="1216200459000">
<font NAME="SansSerif" SIZE="12"/>
</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Hetkel eesoleva sõlmede haru algusesse liikumiseks vajuta PageUp klahvile.
 </p>
 </body>
</html>" ID="ID_1763373897" CREATED="1124560950732" MODIFIED="1216200543444">
+<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913137192" MODIFIED="1216201877888" POSITION="right" TEXT="Suurendamine/vähendamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_385482752" MODIFIED="1216201869456">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Suurenduse muutmiseks hoia samaaegselt all CTRL-klahvi ning keri hiireratast, või hoia samaaegselt all ALT-klahvi ning kasuta üles (vähendab) / alla (suurendab) nooleklahve. Ühe võimalusena võib kasutada ka suurenduse tööriista peamisel tööriistaribal.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1318678369" MODIFIED="1216202018927" POSITION="right" TEXT="Tegevuste tagasivõtmine ja taastamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_45554617" MODIFIED="1216201918241">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Tegevuse tagasivõtmiseks vajuta CTRL + Z või kasuta rippmenüüd Redigeerimine -> Võta tagasi.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_725481570" MODIFIED="1216201956499">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Tegevuse uuestitegemiseks vajuta CTRL + Y või vali rippmenüüst Redigeerimine -> Tee uuesti.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1106402597" MODIFIED="1216202013857">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Tagasivõtmise sammude arvu seadistamiseks kasuta rippmenüüd Tööriistad -> Eelistused.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_22510332" MODIFIED="1216202445145" POSITION="right" TEXT="Eksportimine HTML-i">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1878904964" MODIFIED="1216202111782">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlmede haru HTML-i eksportimiseks vajuta CTRL + H. Eksporditud HTML-leht võib toetada ka voltimise funktsionaalsust sõltuvalt sellest, mis oli määratud programmi eelistustes.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_62201964" MODIFIED="1216202205806">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Et kasutada teist eksportimise funktsiooni, kasuta rippmenüü valikut Ekspordi -> Kui XHTML (Javascript-i versioon).
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_83386080" MODIFIED="1216202417810">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Et eksportida koos ülevaatliku pildiga HTML-i, kasuta rippmenüüst valikut Ekspordi -> Kui HTML (klõpsatav kaart, pildiversioon).
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1908686168" MODIFIED="1216202912603" POSITION="right" TEXT="Eksportimine raster- või vektorgraafiliseks pildiks">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1072927157" MODIFIED="1216202492752">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kaardi eksportimiseks PNG-pildiks, kasuta rippmenüü valikut Fail -> Ekspordi -> Kui PNG
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_491092630" MODIFIED="1216202523501" TEXT="Kaardi eksportimiseks JPG-pildiks, kasuta rippmenüü valikut Fail -> Ekspordi -> Kui JPEG">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_161038476" MODIFIED="1216202721190">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kaardi eksportimiseks SVG-pildiks, kasuta rippmenüü valikut Fail -> Ekspordi -> Kui SVG
- </p>
- <p>
- See funktsioon on saadaval vaid siis kui oled paigaldanud SVG-pistikprogrammi.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_329770204" MODIFIED="1216203705284" POSITION="right" TEXT="Teistesse XML-vormingutesse eksportimine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1487291576" MODIFIED="1216203273703">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kaardi eksportimiseks teise XML-põhisesse vormingusse, mille jaoks on eraldi XSLT vorm olemas, kasuta rippmenüü valikut Fail -> Ekspordi -> Kasutades XSLT-d
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_306816886" MODIFIED="1216203610047">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kaardi eksportimiseks OpenOffice.org Writer-i dokumendiks kasuta rippmenüüst valikut Fail -> Ekspordi -> OpenOffice.org Writer-i dokument.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1841136119" MODIFIED="1216217093567" POSITION="right" TEXT="Kataloogi struktuuri importimine">
-<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1216211946553" ID="ID_1167782124" MODIFIED="1216217050308">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Kataloogide struktuuri importimiseks vali rippmenüüst Fail -> Impordi -> Kataloogide struktuur
- </p>
- <p>
- Siis küsitakse kataloogi, mille struktuuri soovitakse importida. Kataloogistruktuuri all mõeldakse kataloogidest ja nende sees olevatest alamkataloogidest ning failidest koosnevat puud. Allpool on toodud ka näidis.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Hetkel eesoleva sõlmede haru lõppu liikumiseks vajuta PageDown klahvile.
 </p>
 </body>
</html>" ID="ID_1810026836" CREATED="1124560950732" MODIFIED="1216200571377">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Keskele peasõlme juurde liikumiseks vajuta ESC-klahvile.
 </p>
 </body>
</html>" ID="ID_1423109092" CREATED="1124560950732" MODIFIED="1216200609283">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme vabaks paigutamiseks kaardil lohista seda tema nähtamatust sõõrist (asub sõlme ees ja ilmub nähtavale kui hiir selle kohale viia) kinni haarates.
 </p>
 </body>
</html>" ID="_Freeplane_Link_97763226" CREATED="1124560950732" MODIFIED="1216200695317">
+<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="ID_1586593732" MODIFIED="1216217084661" TEXT="Näidis">
+</node>
+<node TEXT="Sõlmede kokku- ja lahtivoltimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_4727471" CREATED="1124560950732" MODIFIED="1216201537122" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="ID_946625728" MODIFIED="1216217082479" TEXT="Valitud kataloog">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme kokkuvoltimiseks vajuta tühikuklahvi või sõlme kiirmenüüst vali: Lülita voltimist ümber.
 </p>
 </body>
</html>" ID="ID_993136713" CREATED="1124560950732" MODIFIED="1216200802609">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_474941936" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps" MODIFIED="1216187545041" TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps">
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlme lahtivoltimiseks vajuta tühikuklahvi või sõlme kiirmenüüst vali: Lülita voltimist ümber.
 </p>
 </body>
</html>" ID="ID_635085497" CREATED="1124560950732" MODIFIED="1216200820736">
<font NAME="SansSerif" SIZE="12"/>
</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Tasemete kokku/lahti voltimiseks hoia alla ALT-klahvi ja samal ajal keri hiireratast, või vajuta ALT+PageUp või ka ALT + PageDown. Suurte ja mahukate kaartide puhul on soovitav seda omadust ettevaatlikult kasutada kuna siin võib tekkida probleeme (nt mälu jääb väheks).
 </p>
 </body>& [...]
+<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950732" FOLDED="true" ID="ID_1954366926" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/" MODIFIED="1216217073101" TEXT="Dbwiz">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kõikide sõlmede korraga lahtivoltimiseks vajuta halli plussmärgiga nuppu tööriistaribal või kasuta rippmenüüd Liikumine -> Voldi kõik lahti.
 </p>
 </body>
</html>" ID="ID_780574400" CREATED="1124560950732" MODIFIED="1216201322323">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_950167286" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ASSETS.GIF" MODIFIED="1216187545041" TEXT="ASSETS.GIF"/>
-<node CREATED="1124560950732" ID="ID_800426055" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF" MODIFIED="1216187545041" TEXT="CONTACTS.GIF"/>
-<node CREATED="1124560950732" ID="ID_1258787730" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF" MODIFIED="1216187545041" TEXT="EVTMGMT.GIF"/>
-<node CREATED="1124560950732" ID="ID_1788007193" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF" MODIFIED="1216187545041" TEXT="EXPENSES.GIF"/>
-<node CREATED="1124560950732" ID="ID_721190495" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF" MODIFIED="1216187545041" TEXT="INVENTRY.GIF"/>
-<node CREATED="1124560950732" ID="ID_38242249" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/LEDGER.GIF" MODIFIED="1216187545041" TEXT="LEDGER.GIF"/>
-<node CREATED="1124560950732" ID="ID_1108543275" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF" MODIFIED="1216187545040" TEXT="ORDPROC.GIF"/>
-<node CREATED="1124560950732" ID="ID_1051785223" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF" MODIFIED="1216187545040" TEXT="RESOURCE.GIF"/>
-<node CREATED="1124560950732" ID="ID_413667716" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/SERVICE.GIF" MODIFIED="1216187545040" TEXT="SERVICE.GIF"/>
-<node CREATED="1124560950732" ID="ID_294983675" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF" MODIFIED="1216187545040" TEXT="TIMEBILL.GIF"/>
</node>
-<node CREATED="1124560950732" FOLDED="true" ID="ID_706370356" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/" MODIFIED="1216217072054" TEXT="Stiilid">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kõikide sõlmede korraga kokkuvoltimiseks vajuta halli miinusmärgiga nuppu tööriistaribal või kasuta rippmenüüd Liikumine -> Voldi kõik kokku.
 </p>
 </body>
</html>" ID="ID_150591996" CREATED="1124560950732" MODIFIED="1216201375516">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1010772548" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLENDS.GIF" MODIFIED="1216187545040" TEXT="ACBLENDS.GIF"/>
-<node CREATED="1124560950732" ID="ID_1767567712" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLUPRT.GIF" MODIFIED="1216187545040" TEXT="ACBLUPRT.GIF"/>
-<node CREATED="1124560950732" ID="ID_62852524" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACEXPDTN.GIF" MODIFIED="1216187545040" TEXT="ACEXPDTN.GIF"/>
-<node CREATED="1124560950732" ID="ID_1590095220" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACINDSTR.GIF" MODIFIED="1216187545040" TEXT="ACINDSTR.GIF"/>
-<node CREATED="1124560950732" ID="ID_476038182" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACRICEPR.GIF" MODIFIED="1216187545040" TEXT="ACRICEPR.GIF"/>
-<node CREATED="1124560950732" ID="ID_1855878202" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSNDSTN.GIF" MODIFIED="1216187545040" TEXT="ACSNDSTN.GIF"/>
-<node CREATED="1124560950732" ID="ID_763481040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSUMIPT.GIF" MODIFIED="1216187545040" TEXT="ACSUMIPT.GIF"/>
-<node CREATED="1124560950732" ID="ID_1894968636" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF" MODIFIED="1216187545040" TEXT="GLOBE.WMF"/>
-<node CREATED="1124560950732" ID="ID_910938684" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP" MODIFIED="1216187545040" TEXT="STONE.BMP"/>
</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kokkuvolditud sõlm on tähistatud väikese ringiga selle alumise parema nurga juures.
 </p>
 </body>
</html>" ID="ID_1059424946" CREATED="1124560950732" MODIFIED="1216201528954">
+<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_269203785" MODIFIED="1216217579976" POSITION="right" TEXT="MS Internet Explorer-i järjehoidjate importimine">
+<node TEXT="Mõttekaartide kerimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_467411537" CREATED="1124560950732" MODIFIED="1216201656349" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kaardi kerimiseks lohista seda hiire vasaku klahviga taustast kinni võttes või lihtsalt hiire ratast kerides. Horisontaalselt hiire rattaga kerimiseks hoia samaegselt all SHIFT-klahvi või mõnda hiire klahvi.
 </p>
 </body>
</html>" ID="ID_109928081" CREATED="1124560950732" MODIFIED="1216201653254">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_260446736" MODIFIED="1216217403619">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- MS Internet Explorer-i järjehoidjate importimiseks Freeplane-i valida rippmenüüst Fail -> Impordi -> MS Internet Explorer-i järjehoidjad. Siis küsitakse otsiteekonda, kuhu järjehoidjad on salvestatud. Kataloog nimega "Järjehoidjad" (ingl.k. 'Favorites') asub inglisekeelse MS Windows 2000/XP puhul C:\Documents and Settings\<kasutajanimi>\Favorites
- </p>
- </body>
-</html></richcontent>
+</node>
+</node>
+<node TEXT="Suurendamine/vähendamine" FOLDED="true" POSITION="right" ID="Freeplane_Link_913137192" CREATED="1124560950732" MODIFIED="1216201877888" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Suurenduse muutmiseks hoia samaaegselt all CTRL-klahvi ning keri hiireratast, või hoia samaaegselt all ALT-klahvi ning kasuta üles (vähendab) / alla (suurendab) nooleklahve. Ühe võimalusena võib kasutada ka suurenduse tööriista peamisel tööriistaribal.
 </p>
 < [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Tegevuste tagasivõtmine ja taastamine" FOLDED="true" POSITION="right" ID="Freeplane_Link_1318678369" CREATED="1124560950732" MODIFIED="1216202018927" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Tegevuse tagasivõtmiseks vajuta CTRL + Z või kasuta rippmenüüd Redigeerimine -> Võta tagasi.
 </p>
 </body>
</html>" ID="ID_45554617" CREATED="1124560950732" MODIFIED="1216201918241">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Tegevuse uuestitegemiseks vajuta CTRL + Y või vali rippmenüüst Redigeerimine -> Tee uuesti.
 </p>
 </body>
</html>" ID="ID_725481570" CREATED="1124560950732" MODIFIED="1216201956499">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Tagasivõtmise sammude arvu seadistamiseks kasuta rippmenüüd Tööriistad -> Eelistused.
 </p>
 </body>
</html>" ID="ID_1106402597" CREATED="1124560950732" MODIFIED="1216202013857">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Eksportimine HTML-i" FOLDED="true" POSITION="right" ID="Freeplane_Link_22510332" CREATED="1124560950732" MODIFIED="1216202445145" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlmede haru HTML-i eksportimiseks vajuta CTRL + H. Eksporditud HTML-leht võib toetada ka voltimise funktsionaalsust sõltuvalt sellest, mis oli määratud programmi eelistustes.
 </p>
 </body>
</html>" ID="ID_1878904964" CREATED="1124560950732" MODIFIED="1216202111782">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Et kasutada teist eksportimise funktsiooni, kasuta rippmenüü valikut Ekspordi -> Kui XHTML (Javascript-i versioon).
 </p>
 </body>
</html>" ID="ID_62201964" CREATED="1124560950732" MODIFIED="1216202205806">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Et eksportida koos ülevaatliku pildiga HTML-i, kasuta rippmenüüst valikut Ekspordi -> Kui HTML (klõpsatav kaart, pildiversioon).
 </p>
 </body>
</html>" ID="ID_83386080" CREATED="1124560950732" MODIFIED="1216202417810">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Eksportimine raster- või vektorgraafiliseks pildiks" FOLDED="true" POSITION="right" ID="Freeplane_Link_1908686168" CREATED="1124560950732" MODIFIED="1216202912603" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kaardi eksportimiseks PNG-pildiks, kasuta rippmenüü valikut Fail -> Ekspordi -> Kui PNG
 </p>
 </body>
</html>" ID="ID_1072927157" CREATED="1124560950732" MODIFIED="1216202492752">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Kaardi eksportimiseks JPG-pildiks, kasuta rippmenüü valikut Fail -> Ekspordi -> Kui JPEG" ID="ID_491092630" CREATED="1124560950732" MODIFIED="1216202523501">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kaardi eksportimiseks SVG-pildiks, kasuta rippmenüü valikut Fail -> Ekspordi -> Kui SVG
 </p>
 <p>
 See funktsioon on saadaval vaid siis kui oled paigaldanud SVG-pistikprogrammi.
 </p>
 </body>
</html>" ID="ID_161038476" CREATED="1124560950732" MODIFIED="1216202721190">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Teistesse XML-vormingutesse eksportimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_329770204" CREATED="1124560950732" MODIFIED="1216203705284" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kaardi eksportimiseks teise XML-põhisesse vormingusse, mille jaoks on eraldi XSLT vorm olemas, kasuta rippmenüü valikut Fail -> Ekspordi -> Kasutades XSLT-d
 </p>
 </body>
</html>" ID="ID_1487291576" CREATED="1124560950732" MODIFIED="1216203273703">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kaardi eksportimiseks OpenOffice.org Writer-i dokumendiks kasuta rippmenüüst valikut Fail -> Ekspordi -> OpenOffice.org Writer-i dokument.
 </p>
 </body>
</html>" ID="ID_306816886" CREATED="1124560950732" MODIFIED="1216203610047">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Kataloogi struktuuri importimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_1841136119" CREATED="1124560950732" MODIFIED="1216217093567" COLOR="#407000">
+<font NAME="Dialog" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Kataloogide struktuuri importimiseks vali rippmenüüst Fail -> Impordi -> Kataloogide struktuur
 </p>
 <p>
 Siis küsitakse kataloogi, mille struktuuri soovitakse importida. Kataloogistruktuuri all mõeldakse kataloogidest ja nende sees olevatest alamkataloogidest ning failidest koosnevat [...]
+<node TEXT="Näidis" FOLDED="true" ID="ID_1586593732" CREATED="1124560950732" MODIFIED="1216217084661" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Valitud kataloog" FOLDED="true" ID="ID_946625728" CREATED="1124560950732" MODIFIED="1216217082479" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps" ID="ID_474941936" CREATED="1124560950732" MODIFIED="1216187545041" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Dbwiz" FOLDED="true" ID="ID_1954366926" CREATED="1124560950732" MODIFIED="1216217073101" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="ASSETS.GIF" ID="ID_950167286" CREATED="1124560950732" MODIFIED="1216187545041" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ASSETS.GIF"/>
+<node TEXT="CONTACTS.GIF" ID="ID_800426055" CREATED="1124560950732" MODIFIED="1216187545041" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF"/>
+<node TEXT="EVTMGMT.GIF" ID="ID_1258787730" CREATED="1124560950732" MODIFIED="1216187545041" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF"/>
+<node TEXT="EXPENSES.GIF" ID="ID_1788007193" CREATED="1124560950732" MODIFIED="1216187545041" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF"/>
+<node TEXT="INVENTRY.GIF" ID="ID_721190495" CREATED="1124560950732" MODIFIED="1216187545041" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF"/>
+<node TEXT="LEDGER.GIF" ID="ID_38242249" CREATED="1124560950732" MODIFIED="1216187545041" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/LEDGER.GIF"/>
+<node TEXT="ORDPROC.GIF" ID="ID_1108543275" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF"/>
+<node TEXT="RESOURCE.GIF" ID="ID_1051785223" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF"/>
+<node TEXT="SERVICE.GIF" ID="ID_413667716" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/SERVICE.GIF"/>
+<node TEXT="TIMEBILL.GIF" ID="ID_294983675" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF"/>
+</node>
+<node TEXT="Stiilid" FOLDED="true" ID="ID_706370356" CREATED="1124560950732" MODIFIED="1216217072054" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/">
<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="ACBLENDS.GIF" ID="ID_1010772548" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
+<node TEXT="ACBLUPRT.GIF" ID="ID_1767567712" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
+<node TEXT="ACEXPDTN.GIF" ID="ID_62852524" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
+<node TEXT="ACINDSTR.GIF" ID="ID_1590095220" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
+<node TEXT="ACRICEPR.GIF" ID="ID_476038182" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
+<node TEXT="ACSNDSTN.GIF" ID="ID_1855878202" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
+<node TEXT="ACSUMIPT.GIF" ID="ID_763481040" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
+<node TEXT="GLOBE.WMF" ID="ID_1894968636" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_910938684" CREATED="1124560950732" MODIFIED="1216187545040" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
</node>
-<node COLOR="#999999" CREATED="1124560950732" ID="ID_332563589" MODIFIED="1216217570092" TEXT="Märksõnad: Microsoft Internet Explorer, MS Internet Explorer MSIE, MS IE.">
+</node>
+</node>
+<node TEXT="MS Internet Explorer-i järjehoidjate importimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_269203785" CREATED="1124560950732" MODIFIED="1216217579976" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 MS Internet Explorer-i järjehoidjate importimiseks Freeplane-i valida rippmenüüst Fail -> Impordi -> MS Internet Explorer-i järjehoidjad. Siis küsitakse otsiteekonda, kuhu järjehoidjad on salvestatud. Kataloog nimega "Järjehoidjad" (ingl.k. 'Favorites') asub inglisek [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Märksõnad: Microsoft Internet Explorer, MS Internet Explorer MSIE, MS IE." ID="ID_332563589" CREATED="1124560950732" MODIFIED="1216217570092" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1709974530" MODIFIED="1216217672715" POSITION="right" TEXT="MindManager X5 mõttekaardi importimine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1753949120" MODIFIED="1216217660535">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- MindManager X5 mõttekaardi importimiseks valida rippmenüüst Fail -> Impordi -> MindManager X5 kaart
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913645795" MODIFIED="1216218225233" POSITION="right" TEXT="MS Word-i või MS Outlook-iga integreerimine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1037098567" MODIFIED="1216217849442">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sa saad asetada kaarte või selle osi MS Word-i, MS Wordpad-i või MS Outlook-i kirjadesse. Üldiselt saab neid asetada suvalisse programmi, mis saab aru rikkast teksti vormindamisest. Teksti vormindus ja viited võetakse samuti asetamisel kaasa.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_599307523" LINK="mailto:don.bonton at supermail.com" MODIFIED="1216218092775">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Klõpsates e-posti viitel (näiteks <i>mailto:eesnimi.perenimi at mail.ee</i>) avatakse vaikimisi e-postiprogramm uue kirjaga MS Windows-is.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_912458776" LINK="mailto:don.bonton at supermail.com?subject=Last%20phone%20call" MODIFIED="1216217984233" TEXT="E-posti viites saab kasutada teema etteandmist.">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1653504142" MODIFIED="1216218218990">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Teine võimalus on mõttekaart asetada MS Word-i, seda eelnevalt HTML-i välja eksportides ja siis omakorda HTML-versiooni kopeerides-asetades MS Word-i.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1822195277" MODIFIED="1216220330553" POSITION="right" TEXT="Eelistuste seadistamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1947073053" MODIFIED="1216218284690">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Eelistuste redigeerimiseks ava Tööriistad -> Eelistused. Enamus eelistuste muudatused jõustuvad Freeplane-i uuestikäivitamisel.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1428285526" MODIFIED="1216220284584">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Eelistuste abil saab seadistada: kiirklahvid, HTML-i eksportimise seaded, viis kuidas sõlmede valimine hiirega käitub, kirjakujude ja servade ning joonte pehmendamine (ingl.k. 'antialiasing'), jne.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#999999" CREATED="1124560950732" ID="ID_1747353627" MODIFIED="1216220324300" TEXT="Võtmesõnad: muutmine, eelistused, seadistused">
+<node TEXT="MindManager X5 mõttekaardi importimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_1709974530" CREATED="1124560950732" MODIFIED="1216217672715" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 MindManager X5 mõttekaardi importimiseks valida rippmenüüst Fail -> Impordi -> MindManager X5 kaart
 </p>
 </body>
</html>" ID="ID_1753949120" CREATED="1124560950732" MODIFIED="1216217660535">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="MS Word-i või MS Outlook-iga integreerimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_913645795" CREATED="1124560950732" MODIFIED="1216218225233" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sa saad asetada kaarte või selle osi MS Word-i, MS Wordpad-i või MS Outlook-i kirjadesse. Üldiselt saab neid asetada suvalisse programmi, mis saab aru rikkast teksti vormindamisest. Teksti vormindus ja viited võetakse samuti asetamisel kaasa.
 </p>
 </body>
</html>" ID="ID_1037098567" CREATED="1124560 [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Klõpsates e-posti viitel (näiteks <i>mailto:eesnimi.perenimi at mail.ee</i>) avatakse vaikimisi e-postiprogramm uue kirjaga MS Windows-is.
 </p>
 </body>
</html>" ID="ID_599307523" CREATED="1124560950732" MODIFIED="1216218092775" LINK="mailto:don.bonton at supermail.com">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="E-posti viites saab kasutada teema etteandmist." ID="ID_912458776" CREATED="1124560950732" MODIFIED="1216217984233" LINK="mailto:don.bonton at supermail.com?subject=Last%20phone%20call">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Teine võimalus on mõttekaart asetada MS Word-i, seda eelnevalt HTML-i välja eksportides ja siis omakorda HTML-versiooni kopeerides-asetades MS Word-i.
 </p>
 </body>
</html>" ID="ID_1653504142" CREATED="1124560950732" MODIFIED="1216218218990">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Eelistuste seadistamine" FOLDED="true" POSITION="right" ID="Freeplane_Link_1822195277" CREATED="1124560950732" MODIFIED="1216220330553" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Eelistuste redigeerimiseks ava Tööriistad -> Eelistused. Enamus eelistuste muudatused jõustuvad Freeplane-i uuestikäivitamisel.
 </p>
 </body>
</html>" ID="ID_1947073053" CREATED="1124560950732" MODIFIED="1216218284690">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Eelistuste abil saab seadistada: kiirklahvid, HTML-i eksportimise seaded, viis kuidas sõlmede valimine hiirega käitub, kirjakujude ja servade ning joonte pehmendamine (ingl.k. 'antialiasing'), jne.
 </p>
 </body>
</html>" ID="ID_1428285526" CREATED="1124560950732" MODIFIED="1216220284584">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Võtmesõnad: muutmine, eelistused, seadistused" ID="ID_1747353627" CREATED="1124560950732" MODIFIED="1216220324300" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1528828442" MODIFIED="1216228616420" POSITION="right" TEXT="Printimine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1240927179" MODIFIED="1216220425067">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Printida saab nii, et kogu kaart mahutatakse ühele lehele või ka mitmele lehele. Seda saab seadistada Fail -> Lehekülje seaded
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_176846213" MODIFIED="1216221180496">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Ruumi paremaks ärakasutamiseks valida Rõhtasetus (ingl.k. 'landscape') lehekülje seadistustes.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_281927805" MODIFIED="1216227265273">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Eelvaade enne printimist ei ole tingimata vajalik. Kui Sul on PostScript printer siis saab kaardi printida *.ps faili ja vaadata seda sealt. Kui prindid printeriga, mis ei saa PostScript-ist aru siis printerile saab saata ehk faili, mis on PCL-is, mida aga ei saa ise arvutis kasutada.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_758130759" MODIFIED="1216228605559">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Samuti saab printida veebilehitsejast peale kaardi HTML-i eksportimist või ka pärast MS Word-i, MS Wordpad-i kopeerimist-asetamist. Nii saab ka stiile muuta vastavalt vajadusele.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_841140408" MODIFIED="1216229413099" POSITION="right" TEXT="HTML-i kasutamine sõlmede kujundamisel">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_166500306" MODIFIED="1216228737174">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sõlmed, mis algavad märgendiga <html>, visualiseeritakse kasutades HTML-koodi. See omadus on abiks tehniliselt pädevatele inimestele. Allpool mõned näited.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_900496350" MODIFIED="1216228939238">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <h3>
- HTML-i näidis
- </h3>
- <p class="msonormal">
- Loetelu:
- </p>
- <ul type="disc">
- <li class="msonormal">
- esimene
- </li>
- <li class="msonormal">
- teine
- </li>
- </ul>
- <p class="msonormal">
- Veel võib teha <b>rasvast</b> või <i>kaldkirja</i>. Samuti <u>allajoonitud</u> või <strike>läbikriipsutatud</strike> kirja. Ka tabelit saame teha:
- </p>
- <table cellpadding="0" class="msonormaltable" cellspacing="0" border="1" style="border: none">
- <tr>
- <td style="padding-left: .75pt; padding-top: .75pt; padding-bottom: .75pt; border: solid windowtext 1.0pt; padding-right: .75pt">
- <p class="msonormal">
- lahter1
- </p>
- </td>
- <td style="border-left: none; padding-left: .75pt; padding-top: .75pt; padding-bottom: .75pt; border: solid windowtext 1.0pt; padding-right: .75pt">
- <p class="msonormal">
- lahter2
- </p>
- </td>
- </tr>
- <tr>
- <td style="border-top: none; padding-left: .75pt; padding-top: .75pt; padding-bottom: .75pt; border: solid windowtext 1.0pt; padding-right: .75pt">
- <p class="msonormal">
- lahter3
- </p>
- </td>
- <td style="border-left: none; border-top: none; padding-left: .75pt; padding-top: .75pt; padding-bottom: .75pt; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; padding-right: .75pt">
- <p class="msonormal">
- lahter4
- </p>
- </td>
- </tr>
- </table>
- <p class="msonormal">
- Ka erinevaid <font color="#999900">teksti</font> <font color="#336600">värve</font> saab kasutada.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_661706379" MODIFIED="1216229407096">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- HTML-i eksport tekstiks või rikkalikuks tekstiks (MS Word, MS Wordpad, jne) ei toeta vorminduse või piltide kaasapanemist. Samas on HTML-i eksport mugav veebis kasutamiseks kui on olemas Freeplane-i rakend veebilehitsejale.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_271176250" MODIFIED="1216246952682" POSITION="right" TEXT="Piltide kasutamine sõlmede illustreerimiseks">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1646926562" MODIFIED="1216230555707">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Pildi lisamiseks Freeplane-i vajuta ALT + K või vali sõlme kiirmenüüst Lisamine -> Pilt
- </p>
- <p>
- Pildi lisamisel kaob kogu sõlmes olnud tekst. Selliselt lisatud pildid on viited kuna Freeplane-i *.mm fail on XML-ile sarnase struktuuriga ja peavad asuma ka hiljem samas kohas kus nad olid Freeplane-i lisamise hetkel. Mõeldud on siin suhtelist aadressi *.mm või *.html faili suhtes, sõltuvalt sellest, milleks kaarti salvestatakse või eksporditakse. Piltide suuruse muutmiseks on võimalik kasutada HTML-i. Piltide lisamine Freeplane-i on arendusjärg [...]
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_234082439" MODIFIED="1216230706364">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Toetatud pildifailide vormingud on PNG, JPEG ja GIF.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_249180132" MODIFIED="1216243961428">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Viidatud piltide nähtavaks muutmiseks vajuta ALT + K. Sa võid haarata ja kukutada mitmeid pilte Freeplane-i, märkida neid kui mitut erinevat sõlme. See omadus peaks vähemalt MS Windowsis töötama.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#000000" CREATED="1124560950732" ID="ID_632640717" MODIFIED="1216244094033">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Rohkem tehniline ja mitte nii algaja kasutaja sõbralik on pilte võimalik lisada HTML-i abil. Sa pead alustama sõlme teksti märgendiga <html> - nii saad lisada pilte sõlme.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1152828233" MODIFIED="1216244204676">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Näiteks<br /> <html><img src="pildid/oun.png"> - see on suhteline aadress<br /> <html><img src="file://C:/Users/Dokumendid/m6ttekaardid/pildid/oun.png"> - see on absoluutne aadress (ei ole soovitav kasutada)<br />
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1156720512" MODIFIED="1216244235915">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Sa võid kasutada suhtelisi viiteid piltidele (väga soovitatav).
- </p>
- </body>
-</html></richcontent>
+<node TEXT="Printimine" FOLDED="true" POSITION="right" ID="Freeplane_Link_1528828442" CREATED="1124560950732" MODIFIED="1216228616420" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Printida saab nii, et kogu kaart mahutatakse ühele lehele või ka mitmele lehele. Seda saab seadistada Fail -> Lehekülje seaded
 </p>
 </body>
</html>" ID="ID_1240927179" CREATED="1124560950732" MODIFIED="1216220425067">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Ruumi paremaks ärakasutamiseks valida Rõhtasetus (ingl.k. 'landscape') lehekülje seadistustes.
 </p>
 </body>
</html>" ID="ID_176846213" CREATED="1124560950732" MODIFIED="1216221180496">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Eelvaade enne printimist ei ole tingimata vajalik. Kui Sul on PostScript printer siis saab kaardi printida *.ps faili ja vaadata seda sealt. Kui prindid printeriga, mis ei saa PostScript-ist aru siis printerile saab saata ehk faili, mis on PCL-is, mida aga ei saa ise arvutis kasutada.
 </p>
 </body>
</html>" ID="ID_281927805" CREATED="1 [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Samuti saab printida veebilehitsejast peale kaardi HTML-i eksportimist või ka pärast MS Word-i, MS Wordpad-i kopeerimist-asetamist. Nii saab ka stiile muuta vastavalt vajadusele.
 </p>
 </body>
</html>" ID="ID_758130759" CREATED="1124560950732" MODIFIED="1216228605559">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="HTML-i kasutamine sõlmede kujundamisel" FOLDED="true" POSITION="right" ID="Freeplane_Link_841140408" CREATED="1124560950732" MODIFIED="1216229413099" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sõlmed, mis algavad märgendiga <html>, visualiseeritakse kasutades HTML-koodi. See omadus on abiks tehniliselt pädevatele inimestele. Allpool mõned näited.
 </p>
 </body>
</html>" ID="ID_166500306" CREATED="1124560950732" MODIFIED="1216228737174">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <h3>
 HTML-i näidis
 </h3>
 <p class="msonormal">
 Loetelu:
 </p>
 <ul type="disc">
 <li class="msonormal">
 esimene
 </li>
 <li class="msonormal">
 teine
 </li>
 </ul>
 [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 HTML-i eksport tekstiks või rikkalikuks tekstiks (MS Word, MS Wordpad, jne) ei toeta vorminduse või piltide kaasapanemist. Samas on HTML-i eksport mugav veebis kasutamiseks kui on olemas Freeplane-i rakend veebilehitsejale.
 </p>
 </body>
</html>" ID="ID_661706379" CREATED="1124560950732" MODIFIED="1216229407096">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Piltide kasutamine sõlmede illustreerimiseks" FOLDED="true" POSITION="right" ID="Freeplane_Link_271176250" CREATED="1124560950732" MODIFIED="1216246952682" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Pildi lisamiseks Freeplane-i vajuta ALT + K või vali sõlme kiirmenüüst Lisamine -> Pilt
 </p>
 <p>
 Pildi lisamisel kaob kogu sõlmes olnud tekst. Selliselt lisatud pildid on viited kuna Freeplane-i *.mm fail on XML-ile sarnase struktuuriga ja peavad asuma ka hiljem samas kohas kus nad [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Toetatud pildifailide vormingud on PNG, JPEG ja GIF.
 </p>
 </body>
</html>" ID="ID_234082439" CREATED="1124560950732" MODIFIED="1216230706364">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Viidatud piltide nähtavaks muutmiseks vajuta ALT + K. Sa võid haarata ja kukutada mitmeid pilte Freeplane-i, märkida neid kui mitut erinevat sõlme. See omadus peaks vähemalt MS Windowsis töötama.
 </p>
 </body>
</html>" ID="ID_249180132" CREATED="1124560950732" MODIFIED="121 [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Rohkem tehniline ja mitte nii algaja kasutaja sõbralik on pilte võimalik lisada HTML-i abil. Sa pead alustama sõlme teksti märgendiga <html> - nii saad lisada pilte sõlme.
 </p>
 </body>
</html>" ID="ID_632640717" CREATED="1124560950732" MODIFIED="1216244094033" COLOR="#000000">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Näiteks<br >  <html><img src="pildid/oun.png"> - see on suhteline aadress<br >  <html><img src="file://C:/Users/Dokumendid/m6ttekaardid/pildid/oun.png"> - see on absoluutne aadress (ei ole soovitav kasutada)<br >
 [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Sa võid kasutada suhtelisi viiteid piltidele (väga soovitatav).
 </p>
 </body>
</html>" ID="ID_1156720512" CREATED="1124560950732" MODIFIED="1216244235915">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1825247742" MODIFIED="1216246934166">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Mõned piltide lisamise näited, mis töötavad vastavates operatsioonisüsteemides
- </p>
- </body>
-</html></richcontent>
-<font BOLD="true" NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_384038147" MODIFIED="1216245022354">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- <img src="/usr/share/pixmaps/abiword.png" />
-
- </p>
- <p>
- Linuxis Abiword
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_520083225" MODIFIED="1216245000432">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLUPRT.GIF" />
-
- </p>
- <p>
- MS Windowsis MS Office
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_894022254" MODIFIED="1216245014860">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- <img src="../../../../usr/share/pixmaps/vlc.png" />
-
- </p>
- <p>
- Linuxis VLC
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1825871160" MODIFIED="1216244986912">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- <img src="../../../../usr/share/pixmaps/thunderbird.png" />
-
- </p>
- <p>
- Linuxis Thunderbird
- </p>
- </body>
-</html></richcontent>
-</node>
-</node>
-<node CREATED="1124560950732" ID="ID_1605523460" MODIFIED="1216245006660">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACRICEPR.GIF" />
-
- </p>
- <p>
- MS Windowsis MS Office
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1830235047" MODIFIED="1216244979507">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- <img src="../../../../usr/share/icons/skype.png" />
-
- </p>
- <p>
- Linuxis Skype
- </p>
- </body>
-</html></richcontent>
-<node CREATED="1124560950732" ID="ID_306854150" MODIFIED="1216245065511">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- <img src="../../../../usr/share/icons/amsn.png" />
-
- </p>
- <p>
- Linuxis aMSN
- </p>
- </body>
-</html></richcontent>
-</node>
-</node>
-</node>
-<node CREATED="1124560950732" ID="ID_860800567" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF" MODIFIED="1216245119049">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- GLOBE.WMF
- </p>
- <p>
- MS Windowsis MS Office
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_620168247" LINK="/usr/share/icons/autopackage-installer.png" MODIFIED="1216245224115">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- autopackage-installer.png
- </p>
- <p>
- Linuxis Synaptic
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="ID_1101644015" MODIFIED="1216247474477" POSITION="right" TEXT="Eksperimentaalse faililukustuse kasutamine">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_155679724" MODIFIED="1216247047622">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Käesolev Freeplane-i versioon sisaldab katselist faililukustamise tuge, mis on vaikimisi välja lülitatud. Hetke seisuga ei ole kõik asjad täiuslikult veel lahendatud ent see peaks juba enamus olukordades töötama.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1334618640" MODIFIED="1216247111082">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Faili lukustamine tagab selle, et sama faili ei muuda samal ajal rohkem kui üks inimene vältimaks üksteise poolt info ülekirjutamist.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1452514837" MODIFIED="1216247269320">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Faililukustamise lubamiseks vali rippmenüüst Tööriistad -> Eelistused ja seal on esimese peatüki "Keskkond" all jaotis "Failid" kus saab siis panna linnukese "Katseline faili lukustamine" ette.
- </p>
- </body>
-</html></richcontent>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_516331171" MODIFIED="1216247849400" POSITION="right" TEXT="Liikumine avatud mõttekaartide vahel">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1694364871" MODIFIED="1216247470550">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Teise, juba avatud mõttekaardi peale liikumiseks saab teha eesoleval mõttekaardi taustal hiire parema klahviga klõpsu ja sealt valida teine lahtiolev mõttekaart. Samuti saab hiire vasaku klahviga klõpsata ülaservas olevatel sakkidel. Klahvikombinatsioon on ALT + SHIFT + nooleklahv vasakule/paremale
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Mõned piltide lisamise näited, mis töötavad vastavates operatsioonisüsteemides
 </p>
 </body>
</html>" FOLDED="true" ID="Freeplane_Link_1825247742" CREATED="1124560950732" MODIFIED="1216246934166" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="true"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <img src="/usr/share/pixmaps/abiword.png" >
 
 </p>
 <p>
 Linuxis Abiword
 </p>
 </body>
</html>" ID="ID_384038147" CREATED="1124560950732" MODIFIED="1216245022354">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLUPRT.GIF" >
 
 </p>
 <p>
 MS Windowsis MS Office
 </p>
 </body>
</html>" ID="ID_520083225" CREATED="1124560950732" MODIFIED="1216245000432">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <img src="../../../../usr/share/pixmaps/vlc.png" >
 
 </p>
 <p>
 Linuxis VLC
 </p>
 </body>
</html>" ID="ID_894022254" CREATED="1124560950732" MODIFIED="1216245014860">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <img src="../../../../usr/share/pixmaps/thunderbird.png" >
 
 </p>
 <p>
 Linuxis Thunderbird
 </p>
 </body>
</html>" ID="ID_1825871160" CREATED="1124560950732" MODIFIED="1216244986912"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACRICEPR.GIF" >
 
 </p>
 <p>
 MS Windowsis MS Office
 </p>
 </body>
</html>" ID="ID_1605523460" CREATED="1124560950732" MODIFIED="1216245006660">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <img src="../../../../usr/share/icons/skype.png" >
 
 </p>
 <p>
 Linuxis Skype
 </p>
 </body>
</html>" ID="ID_1830235047" CREATED="1124560950732" MODIFIED="1216244979507">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <img src="../../../../usr/share/icons/amsn.png" >
 
 </p>
 <p>
 Linuxis aMSN
 </p>
 </body>
</html>" ID="ID_306854150" CREATED="1124560950732" MODIFIED="1216245065511"/>
+</node>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 GLOBE.WMF
 </p>
 <p>
 MS Windowsis MS Office
 </p>
 </body>
</html>" ID="ID_860800567" CREATED="1124560950732" MODIFIED="1216245119049" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 autopackage-installer.png
 </p>
 <p>
 Linuxis Synaptic
 </p>
 </body>
</html>" ID="ID_620168247" CREATED="1124560950732" MODIFIED="1216245224115" LINK="/usr/share/icons/autopackage-installer.png">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+</node>
+<node TEXT="Eksperimentaalse faililukustuse kasutamine" FOLDED="true" POSITION="right" ID="ID_1101644015" CREATED="1124560950732" MODIFIED="1216247474477" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Käesolev Freeplane-i versioon sisaldab katselist faililukustamise tuge, mis on vaikimisi välja lülitatud. Hetke seisuga ei ole kõik asjad täiuslikult veel lahendatud ent see peaks juba enamus olukordades töötama.
 </p>
 </body>
</html>" ID="ID_155679724" CREATED="11245609507 [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Faili lukustamine tagab selle, et sama faili ei muuda samal ajal rohkem kui üks inimene vältimaks üksteise poolt info ülekirjutamist.
 </p>
 </body>
</html>" ID="ID_1334618640" CREATED="1124560950732" MODIFIED="1216247111082">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Faililukustamise lubamiseks vali rippmenüüst Tööriistad -> Eelistused ja seal on esimese peatüki "Keskkond" all jaotis "Failid" kus saab siis panna linnukese "Katseline faili lukustamine" ette.
 </p>
 </body>
</html>" ID="ID_1452514 [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Liikumine avatud mõttekaartide vahel" FOLDED="true" POSITION="right" ID="Freeplane_Link_516331171" CREATED="1124560950732" MODIFIED="1216247849400" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Teise, juba avatud mõttekaardi peale liikumiseks saab teha eesoleval mõttekaardi taustal hiire parema klahviga klõpsu ja sealt valida teine lahtiolev mõttekaart. Samuti saab hiire vasaku klahviga klõpsata ülaservas olevatel sakkidel. Klahvikombinatsioon on ALT + SHIFT + nooleklahv vasakule/paremale
 </p> [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
diff --git a/freeplane/doc/freeplane_fr.mm b/freeplane/doc/freeplane_fr.mm
index d5924f3..f89e999 100644
--- a/freeplane/doc/freeplane_fr.mm
+++ b/freeplane/doc/freeplane_fr.mm
@@ -1,7 +1,7 @@
-<map version="0.9.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node ID="ID_911274459" CREATED="1270892460624" MODIFIED="1275774576843" COLOR="#993300">
-<richcontent TYPE="NODE">
+<node FOLDED="false" ID="ID_911274459" CREATED="1270892460624" MODIFIED="1465678889090" COLOR="#993300"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -11,11 +11,119 @@
Freeplane<br/><small>- Logiciel Libre de Mind-Mapping -</small>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="Dialog" SIZE="18" BOLD="true"/>
-<hook NAME="MapStyle" max_node_width="600"/>
-<node FOLDED="true" POSITION="right" ID="_Freeplane_Link_1596161299" CREATED="1270892460656" MODIFIED="1277183184328" HGAP="24" VSHIFT="-45">
-<richcontent TYPE="NODE">
+<hook NAME="MapStyle">
+ <properties fit_to_viewport="false;"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" FORMAT="NO_FORMAT" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="true" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#ffffff">
+<font SIZE="9"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" UNIFORM_SHAPE="true" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font SIZE="24" ITALIC="true"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2">
+<edge COLOR="#ff0033"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3">
+<edge COLOR="#009933"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4">
+<edge COLOR="#3333ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#ff6600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<node FOLDED="true" POSITION="right" ID="_Freeplane_Link_1596161299" CREATED="1270892460656" MODIFIED="1465678889106"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -30,11 +138,13 @@
<p>
</p>
- <p style="padding-right: 0cm; padding-bottom: 0cm; margin-bottom: 0cm; border: none; padding-left: 0cm; padding-top: 0cm">
+ <p style="padding-right: 0cm; padding-bottom: 0cm; margin-bottom: 0cm; border-top-color: border-color; border-top-style: none; border-top-width: medium; border-right-color: border-color; border-right-style: none; border-right-width: medium; border-bottom-color: border-color; border-bottom-style: none; border-bottom-width: medium; border-left-color: border-color; border-left-style: none; border-left-width: medium; padding-left: 0cm; padding-top: 0cm">
<b><font face="SansSerif, sans-serif" color="#0033ff">Appuyez sur la touche flèche droite, ou cliquez sur le bouton gauche de la souris pour déplier ce noeud</font></b>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Appuyez sur la flèche gauche pour déployer les nœuds situés à la gauche du noeud central" ID="ID_1776790765" CREATED="1271002221874" MODIFIED="1277183252312"/>
</node>
@@ -235,43 +345,43 @@
<icon BUILTIN="back"/>
</node>
<node TEXT="Des nuages peuvent entourer les noeuds" FOLDED="true" ID="_Freeplane_Link_318937820" CREATED="1270892460667" MODIFIED="1275421333734" COLOR="#407000">
-<cloud WIDTH="0"/>
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<node TEXT="avec des couleurs personnalisées" ID="ID_1714895943" CREATED="1270892460668" MODIFIED="1275421343281">
-<cloud COLOR="#ccccff" WIDTH="0"/>
+<cloud COLOR="#ccccff" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Vous pouvez ajouter des connecteurs entre noeuds de la même carte" FOLDED="true" ID="_Freeplane_Link_1750585847" CREATED="1270892460668" MODIFIED="1277184731656" COLOR="#407000" HGAP="22" VSHIFT="-24">
+<node TEXT="Vous pouvez ajouter des connecteurs entre noeuds de la même carte" FOLDED="true" ID="_Freeplane_Link_1750585847" CREATED="1270892460668" MODIFIED="1277184731656" COLOR="#407000" HGAP_QUANTITY="22.0 px" VSHIFT_QUANTITY="-24.0 px">
<node TEXT="connecter un noeud" ID="_Freeplane_Link_1212380407" CREATED="1270892460668" MODIFIED="1277185157250">
-<arrowlink DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="52;0;" ENDINCLINATION="52;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<arrowlink COLOR="#99ff66" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="64;0;" ENDINCLINATION="64;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#99ff66" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="64;0;" ENDINCLINATION="64;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="52;0;" ENDINCLINATION="52;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="à un autre" ID="_Freeplane_Link_1249400461" CREATED="1270892460669" MODIFIED="1277185157250"/>
<node TEXT="avec des couleurs différentes" ID="_Freeplane_Link_880551392" CREATED="1270892460670" MODIFIED="1277185217937">
-<arrowlink COLOR="#ff9999" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="176;11;" ENDINCLINATION="176;11;" STARTARROW="NONE" ENDARROW="NONE"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#ff9999" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="176;11;" ENDINCLINATION="176;11;" STARTARROW="NONE" ENDARROW="NONE"/>
</node>
<node TEXT="différentes flèches" ID="ID_835595637" CREATED="1277184818093" MODIFIED="1277185244625">
-<arrowlink COLOR="#0000cc" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="61;-2;" ENDINCLINATION="61;-2;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0000cc" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="61;-2;" ENDINCLINATION="61;-2;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
</node>
<node TEXT="et différents tracés" ID="_Freeplane_Link_1789233193" CREATED="1270892460670" MODIFIED="1277185191421"/>
</node>
-<node TEXT="Les connecteurs peuvent posséder des libellés" FOLDED="true" ID="ID_237593792" CREATED="1270893118534" MODIFIED="1277185368250" VGAP="89" COLOR="#407000">
+<node TEXT="Les connecteurs peuvent posséder des libellés" FOLDED="true" ID="ID_237593792" CREATED="1270893118534" MODIFIED="1277185368250" VGAP_QUANTITY="89.0 px" COLOR="#407000">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_237593792" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<arrowlink DESTINATION="ID_237593792" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<node TEXT="noeud source" ID="ID_1709139591" CREATED="1270893130918" MODIFIED="1277185406578" COLOR="#666666">
-<arrowlink COLOR="#000000" DESTINATION="ID_1741403088" SOURCE_LABEL="libellé au départ" TARGET_LABEL="libellé à l'arrivée" MIDDLE_LABEL="libellé central" STARTINCLINATION="103;13;" ENDINCLINATION="174;25;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1741403088" SOURCE_LABEL="libellé au départ" TARGET_LABEL="libellé à l'arrivée" MIDDLE_LABEL="libellé central" STARTINCLINATION="103;13;" ENDINCLINATION="174;25;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="noeud cible" ID="ID_1741403088" CREATED="1270893138577" MODIFIED="1277185417671" COLOR="#666666"/>
</node>
-<node TEXT="Les connecteurs peuvent être mis en forme comme des lignes" FOLDED="true" ID="ID_589013013" CREATED="1270893418086" MODIFIED="1277185488421" COLOR="#407000" VGAP="20" HGAP="19" VSHIFT="66">
+<node TEXT="Les connecteurs peuvent être mis en forme comme des lignes" FOLDED="true" ID="ID_589013013" CREATED="1270893418086" MODIFIED="1277185488421" COLOR="#407000" VGAP_QUANTITY="20.0 px" HGAP_QUANTITY="19.0 px" VSHIFT_QUANTITY="66.0 px">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="1" ID="ID_822615789" CREATED="1270893450078" MODIFIED="1270893469956">
-<arrowlink EDGE_LIKE="true" DESTINATION="ID_659652940" STARTINCLINATION="46;0;" ENDINCLINATION="46;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="EDGE_LIKE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_659652940" STARTINCLINATION="46;0;" ENDINCLINATION="46;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="2" FOLDED="true" ID="ID_1931813528" CREATED="1270893453278" MODIFIED="1270991928052">
<node TEXT="22 (tracé automatique)" ID="ID_659652940" CREATED="1270893459959" MODIFIED="1277185540281"/>
</node>
<node TEXT="3" ID="ID_961774571" CREATED="1270893454198" MODIFIED="1270893480379">
-<arrowlink EDGE_LIKE="true" DESTINATION="ID_659652940" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="EDGE_LIKE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_659652940" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
<node TEXT="Les lignes peuvent être cachées" FOLDED="true" ID="ID_1539062144" CREATED="1270893550070" MODIFIED="1275421889171" COLOR="#407000">
@@ -282,13 +392,13 @@
</node>
<node TEXT="Les noeuds peuvent avoir des attributs" ID="ID_1044646484" CREATED="1270893318566" MODIFIED="1275421927062" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<attribute_layout NAME_WIDTH="40" VALUE_WIDTH="49"/>
+<attribute_layout NAME_WIDTH="30.0 pt" VALUE_WIDTH="36.75 pt"/>
<attribute NAME="x" VALUE="10"/>
<attribute NAME="y" VALUE="20"/>
</node>
-<node TEXT="Les noeuds peuvent être positionnés librement" FOLDED="true" ID="_Freeplane_Link_127668276" CREATED="1270892460670" MODIFIED="1275421947500" COLOR="#407000" HGAP="25" VSHIFT="36">
-<node TEXT="ici" ID="_Freeplane_Link_894936766" CREATED="1270892460670" MODIFIED="1275421958031" HGAP="-1" VSHIFT="-27"/>
-<node TEXT="là" ID="_Freeplane_Link_1942481455" CREATED="1270892460670" MODIFIED="1275421960531" HGAP="123" VSHIFT="43"/>
+<node TEXT="Les noeuds peuvent être positionnés librement" FOLDED="true" ID="_Freeplane_Link_127668276" CREATED="1270892460670" MODIFIED="1275421947500" COLOR="#407000" HGAP_QUANTITY="25.0 px" VSHIFT_QUANTITY="36.0 px">
+<node TEXT="ici" ID="_Freeplane_Link_894936766" CREATED="1270892460670" MODIFIED="1275421958031" HGAP_QUANTITY="-1.0 px" VSHIFT_QUANTITY="-27.0 px"/>
+<node TEXT="là" ID="_Freeplane_Link_1942481455" CREATED="1270892460670" MODIFIED="1275421960531" HGAP_QUANTITY="123.0 px" VSHIFT_QUANTITY="43.0 px"/>
</node>
</node>
<node TEXT="Navigation" FOLDED="true" POSITION="right" ID="ID_1233270983" CREATED="1272091279810" MODIFIED="1277230218296" COLOR="#006666">
@@ -367,8 +477,8 @@
<font NAME="SansSerif" SIZE="12"/>
</node>
<node TEXT="Pour basculer entre les deux dernières cartes éditées : Ctrl + 1" ID="ID_771867461" CREATED="1272092801195" MODIFIED="1277187462843" COLOR="#ff0000">
-<font BOLD="true"/>
<icon BUILTIN="stop"/>
+<font BOLD="true"/>
</node>
</node>
</node>
@@ -385,12 +495,12 @@
</node>
<node TEXT="Modifier le texte d'un noeud" FOLDED="true" ID="Freeplane_Link_1700974092" CREATED="1270892460671" MODIFIED="1275502747437" COLOR="#407000">
<node TEXT="Pour éditer un noeud, pressez les touches F2, HOME ou FIN . Vous pouvez aussi utiliser le menu contextuel, Pour valider votre saisie pressez la touche "Entrée"." ID="_Freeplane_Link_519923426" CREATED="1270892460671" MODIFIED="1277225482453">
-<arrowlink DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Pour remplacer le texte d'un noeud sélectionné, commencer simplement à taper le texte." ID="ID_673531040" CREATED="1270892460671" MODIFIED="1275503155562"/>
<node TEXT="Pour forcer l'utilisation de l'éditeur de nœud texte riche, utilisez la commande Edition > Modifier comme texte riche (noeud long) ..., ou appuyer sur "Alt + Entrée"." ID="ID_1386037184" CREATED="1270892460672" MODIFIED="1277225595406"/>
<node TEXT="Pour diviser le contenu d'un noeud en deux noeuds : ouvrez l'éditeur de texte riche, positionnez le curseur à l'emplacement souhaité pour le séparation et cliquez sur le bouton "Diviser". Vous pouvez répéter l'opération plusieurs fois pour diviser le texte en autant de noeuds que souhaités." ID="ID_328110224" CREATED="1270892460672" MODIFIED="1277225911640">
-<arrowlink DESTINATION="ID_328110224" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_328110224" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Pour ajouter un saut de ligne : pressez Maj+Entrée ou Alt+Entrée." ID="ID_785582356" CREATED="1270892460672" MODIFIED="1277226063000"/>
<node TEXT="Pour copier une partie du texte pendant l'édition d'un noeud en texte riche (noeud long) : sélectionnez le texte puis faites un clic droit pour obtenir le menu contextuel et choisissez Copier." ID="ID_471748709" CREATED="1270892460672" MODIFIED="1277226129093"/>
@@ -479,7 +589,7 @@
<node TEXT="Hêtre" ID="Freeplane_Link_446449973" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Google" ID="Freeplane_Link_845756696" CREATED="1275508661656" MODIFIED="1275508661656" COLOR="#996600" LINK="http://www.google.com/">
+<node TEXT="Google" ID="Freeplane_Link_845756696" CREATED="1275508661656" MODIFIED="1275508661656" LINK="http://www.google.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
@@ -494,8 +604,8 @@
<node TEXT="Pour copier un nœud sans ses fils, utillisez la commande "Copier le noeud seul (sans fils)" ou les touches Ctrl + Maj + C." ID="Freeplane_Link_887004814" CREATED="1275508661656" MODIFIED="1277227488281"/>
</node>
<node TEXT="Ajouter un hyperlien" FOLDED="true" ID="ID_435612220" CREATED="1275508661625" MODIFIED="1275508661625" COLOR="#407000">
-<node ID="Freeplane_Link_224008087" CREATED="1275508661625" MODIFIED="1277227988984">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_224008087" CREATED="1275508661625" MODIFIED="1277227988984"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -505,10 +615,12 @@
Pour <b>ajouter</b> un lien hypertexte à un nœud : utilisez la commande "Insérer" > "Lien libre ... / Modifier lien existant" ou touches Ctrl + K et saisissez la valeur voulue pour le lien.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="Freeplane_Link_789925322" CREATED="1275508661625" MODIFIED="1277228025703">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_789925322" CREATED="1275508661625" MODIFIED="1277228025703"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -518,10 +630,12 @@
Pour <b>modifier</b> le lien hypertexte d'un noeud : utilisez la commande "Insérer" > "Lien libre ... / Modifier lien existant" ou touches Ctrl + K.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="ID_1008928081" CREATED="1275508661625" MODIFIED="1277228039843">
-<richcontent TYPE="NODE">
+<node ID="ID_1008928081" CREATED="1275508661625" MODIFIED="1277228039843"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -531,7 +645,9 @@
Pour <b>supprimer</b> le le lien hypertexte d'un noeud : utilisez la commande "Insérer" > "Lien libre ... / Modifier lien existant" ou touches Ctrl + K et effacer la valeur du lien.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="Des liens hypertextes peuvent être créés vers des pages Web, des fichiers locaux ou des adresses emails car plusieurs protocoles sont supportés : http, https, mailto, ftp, UNC ..." FOLDED="true" ID="Freeplane_Link_1046747190" CREATED="1275508661625" MODIFIED="1277228057296">
<node TEXT="Lien mailto" ID="Freeplane_Link_325647039" CREATED="1275508661625" MODIFIED="1277228267859" LINK="mailto:paul.toto at supermail.com?subject=Notre%20rendez-vous%20de%20demain"/>
@@ -589,8 +705,8 @@
</node>
<node TEXT="Ajouter des notes" FOLDED="true" ID="ID_774913271" CREATED="1271096054547" MODIFIED="1275765971359" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<node TEXT="A un noeud, il est possible d'associer une note de texte formaté" ID="ID_1515176011" CREATED="1271096065323" MODIFIED="1275766082625">
-<richcontent TYPE="NOTE">
+<node TEXT="A un noeud, il est possible d'associer une note de texte formaté" ID="ID_1515176011" CREATED="1271096065323" MODIFIED="1275766082625"><richcontent TYPE="NOTE">
+
<html>
<head>
@@ -600,7 +716,8 @@
<u>à ce noeud est associée <b>une note.</b></u>
</p>
</body>
-</html></richcontent>
+</html>
+</richcontent>
</node>
<node TEXT="Le texte du noeud peut être affiché et modifié dans l'éditeur de notes" ID="ID_1163876330" CREATED="1271096088819" MODIFIED="1275766110031"/>
<node TEXT="Edition > Aller à l'éditeur de Notes ou Ctrl + < pour passer du noeud à l'éditeur à sa note" ID="ID_510313925" CREATED="1271096117483" MODIFIED="1277228966109"/>
@@ -608,7 +725,7 @@
</node>
<node TEXT="Ajouter des connecteurs" FOLDED="true" ID="ID_67417015" CREATED="1275400917613" MODIFIED="1277229044234" COLOR="#407000">
<node TEXT="Pour créer un connecteur entre deux nœuds, glissez déposez un nœud sur un autre en maintenant pressées les touches Ctrl + Maj; relachez le bouton de la souris avant de relacher les touches du clavier." ID="Freeplane_Link_1758636421" CREATED="1275400917613" MODIFIED="1277229415312">
-<arrowlink DESTINATION="ID_865762760" STARTINCLINATION="48;-6;" ENDINCLINATION="180;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_865762760" STARTINCLINATION="48;-6;" ENDINCLINATION="180;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Vous pouvez aussi glisser déposer avec le bouton droit de la souris." ID="Freeplane_Link_976877624" CREATED="1275400917613" MODIFIED="1275400917613"/>
<node TEXT="Pour changer la couleur du connecteur, utilisez le menu contextuel (clic droit sur le connecteur)" ID="ID_1483173272" CREATED="1275400917613" MODIFIED="1277229320046"/>
@@ -618,13 +735,13 @@
<node TEXT="Pour changer le parcours d'un lien, cliquez sur le lien puis glissez le à la souris" ID="ID_860622424" CREATED="1275400917613" MODIFIED="1277229428328"/>
<node TEXT="Exemples de connecteurs" FOLDED="true" ID="Freeplane_Link_977688660" CREATED="1275400917613" MODIFIED="1277229376562" COLOR="#996600">
<node TEXT="Lien vers une autre partie" ID="ID_706510928" CREATED="1275400917613" MODIFIED="1275400917613" COLOR="#996600">
-<arrowlink COLOR="#9999ff" DESTINATION="ID_1814055808" STARTINCLINATION="30;0;" ENDINCLINATION="88;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#9999ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1814055808" STARTINCLINATION="30;0;" ENDINCLINATION="88;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Nœud avec un sous-nœud plié" FOLDED="true" ID="Freeplane_Link_490180926" CREATED="1275400917613" MODIFIED="1277229385125" COLOR="#996600">
<node TEXT="sous-nœud" ID="ID_1814055808" CREATED="1275400917613" MODIFIED="1275400917613"/>
</node>
<node TEXT="Un autre lien" ID="ID_1463132732" CREATED="1275400917613" MODIFIED="1277229395500" COLOR="#996600">
-<arrowlink DESTINATION="ID_706510928" STARTINCLINATION="68;40;" ENDINCLINATION="135;77;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_706510928" STARTINCLINATION="68;40;" ENDINCLINATION="135;77;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
@@ -632,7 +749,7 @@
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Les noeuds peuvent posséder des attributs" ID="ID_1293545211" CREATED="1270893318566" MODIFIED="1277229590453">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<attribute_layout NAME_WIDTH="40" VALUE_WIDTH="49"/>
+<attribute_layout NAME_WIDTH="30.0 pt" VALUE_WIDTH="36.75 pt"/>
<attribute NAME="x" VALUE="10"/>
<attribute NAME="y" VALUE="20"/>
</node>
@@ -641,8 +758,8 @@
</node>
<node TEXT="Utiliser du texte riche dans les nœuds grâce à l'HTML" FOLDED="true" ID="ID_472410185" CREATED="1275400917643" MODIFIED="1275400917643" COLOR="#407000">
<node TEXT="Les nœuds commençant par <html> sont mis en forme en utilisant le HTML qu'ils contiennent. Cette fonctionnalité est utile aux personnes ayant de connaissances techniques. Par exemple:" ID="Freeplane_Link_585709190" CREATED="1275400917643" MODIFIED="1277229678687"/>
-<node ID="Freeplane_Link_1151602814" CREATED="1275400917643" MODIFIED="1277229695031">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_1151602814" CREATED="1275400917643" MODIFIED="1277229695031"><richcontent TYPE="NODE">
+
<html>
<head>
@@ -665,26 +782,26 @@
<p class="msonormal">
Nous avons des caractères <b>gras</b> ou <i>italiques</i>. <u>Soulignés</u> et <strike>barrés</strike> également. Un petit tableau:
</p>
- <table border="1" cellspacing="0" style="border: none" cellpadding="0" class="msonormaltable">
+ <table border="1" cellspacing="0" cellpadding="0" class="msonormaltable" style="border-top-color: border-color; border-top-style: none; border-top-width: medium; border-right-color: border-color; border-right-style: none; border-right-width: medium; border-bottom-color: border-color; border-bottom-style: none; border-bottom-width: medium; border-left-color: border-color; border-left-style: none; border-left-width: medium">
<tr>
- <td style="padding-top: .75pt; padding-right: .75pt; padding-left: .75pt; padding-bottom: .75pt; border: solid windowtext 1.0pt">
+ <td style="padding-top: .75pt; padding-right: .75pt; padding-left: .75pt; padding-bottom: .75pt">
<p class="msonormal">
Cellule1
</p>
</td>
- <td style="padding-top: .75pt; padding-right: .75pt; padding-left: .75pt; padding-bottom: .75pt; border-left: none; border: solid windowtext 1.0pt">
+ <td style="padding-top: .75pt; padding-right: .75pt; padding-left: .75pt; padding-bottom: .75pt; border-left-color: border-color; border-left-style: none; border-left-width: medium">
<p class="msonormal">
Cellule2
</p>
</td>
</tr>
<tr>
- <td style="padding-top: .75pt; padding-right: .75pt; padding-left: .75pt; border-top: none; padding-bottom: .75pt; border: solid windowtext 1.0pt">
+ <td style="padding-top: .75pt; padding-right: .75pt; padding-left: .75pt; border-top-color: border-color; border-top-style: none; border-top-width: medium; padding-bottom: .75pt">
<p class="msonormal">
Cellule3
</p>
</td>
- <td style="padding-top: .75pt; padding-right: .75pt; padding-left: .75pt; border-top: none; padding-bottom: .75pt; border-right: solid windowtext 1.0pt; border-left: none; border-bottom: solid windowtext 1.0pt">
+ <td style="padding-top: .75pt; padding-right: .75pt; padding-left: .75pt; border-top-color: border-color; border-top-style: none; border-top-width: medium; padding-bottom: .75pt; border-left-color: border-color; border-left-style: none; border-left-width: medium">
<p class="msonormal">
Cellulle4
</p>
@@ -695,7 +812,9 @@
Et plusieurs <font color="#999900">couleurs</font> de <font color="#336600">caractères</font> sont possibles.
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
<node TEXT="L'export des nœuds et des images HTML n'est pas supporté en texte ou RTF (Word, Wordpad). L'HTML est surtout pratique dans le cadre d'une publication sur le Web utilisée conjointement avec l'Applet Freeplane." ID="Freeplane_Link_1349362347" CREATED="1275400917643" MODIFIED="1277229717203">
<font NAME="SansSerif" SIZE="12"/>
@@ -718,13 +837,13 @@
</node>
<node TEXT="Exemple d'images, fonctionne sur certaines versions de Windows" FOLDED="true" ID="ID_1911903659" CREATED="1124560950732" MODIFIED="1194968391453" COLOR="#996600">
<font NAME="SansSerif" SIZE="12" BOLD="true"/>
-<node ID="Freeplane_Link_1688770779" CREATED="1124560950732" MODIFIED="1194968725078">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_1688770779" CREATED="1124560950732" MODIFIED="1194968725078"><richcontent TYPE="NODE">
+
<html>
<head>
<style type="text/css">
- <!--<!<!<!<!<!<!<!<!<!<!<!<!
- body { background-color: #ffffff; font-size: 12pt; font-family: SansSerif }
+ <!--
+ <!<!<!<!<!<!<!<!<!<!<!<! body { background-color: #ffffff; font-size: 12pt; font-family: SansSerif }
p { margin-top: 0 }
-->
</style>
@@ -732,116 +851,130 @@
</head>
<body>
<p>
- <img src="file:/C:/Windows/Help/Tours/htmltour/Connected_networks.jpg" />
+ <img src="file:/C:/Windows/Help/Tours/htmltour/Connected_networks.jpg"/>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node ID="Freeplane_Link_163698799" CREATED="1124560950732" MODIFIED="1194968767171">
-<richcontent TYPE="NODE">
+<node ID="Freeplane_Link_163698799" CREATED="1124560950732" MODIFIED="1194968767171"><richcontent TYPE="NODE">
+
<html>
<head>
<style type="text/css">
- <!--<!<!<!<!<!<!<!<!<!<!<!<!
- p { margin-top: 0 }
+ <!--
+ <!<!<!<!<!<!<!<!<!<!<!<! p { margin-top: 0 }
-->
</style>
</head>
<body>
<p>
- <img src="file:/C:/Windows/Help/Tours/htmltour/Connected_wizard.jpg" />
+ <img src="file:/C:/Windows/Help/Tours/htmltour/Connected_wizard.jpg"/>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
-<node FOLDED="true" ID="Freeplane_Link_1915243487" CREATED="1124560950732" MODIFIED="1194968806046">
-<richcontent TYPE="NODE">
+<node FOLDED="true" ID="Freeplane_Link_1915243487" CREATED="1124560950732" MODIFIED="1194968806046"><richcontent TYPE="NODE">
+
<html>
<head>
<style type="text/css">
- <!--<!<!<!<!<!<!<!<!<!<!<!<!
- p { margin-top: 0 }
+ <!--
+ <!<!<!<!<!<!<!<!<!<!<!<! p { margin-top: 0 }
-->
</style>
</head>
<body>
<p>
- <img src="file:/C:/Windows/Help/Tours/htmltour/Connected_multiple.jpg" />
+ <img src="file:/C:/Windows/Help/Tours/htmltour/Connected_multiple.jpg"/>
</p>
</body>
-</html></richcontent>
-<node ID="Freeplane_Link_453092767" CREATED="1124560950732" MODIFIED="1194968853953">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node ID="Freeplane_Link_453092767" CREATED="1124560950732" MODIFIED="1194968853953"><richcontent TYPE="NODE">
+
<html>
<head>
<style type="text/css">
- <!--<!<!<!<!<!<!<!<!<!<!<!<!
- p { margin-top: 0 }
+ <!--
+ <!<!<!<!<!<!<!<!<!<!<!<! p { margin-top: 0 }
-->
</style>
</head>
<body>
<p>
- <img src="file:/C:/Windows/Help/Tours/htmltour/end_up.jpg" />
+ <img src="file:/C:/Windows/Help/Tours/htmltour/end_up.jpg"/>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
-<node FOLDED="true" ID="Freeplane_Link_1332419976" CREATED="1124560950732" MODIFIED="1193212505265">
-<richcontent TYPE="NODE">
+<node FOLDED="true" ID="Freeplane_Link_1332419976" CREATED="1124560950732" MODIFIED="1193212505265"><richcontent TYPE="NODE">
+
<html>
<head>
<style type="text/css">
- <!--<!<!<!<!<!<!<!<!<!<!<!<!
- p { margin-top: 0 }
+ <!--
+ <!<!<!<!<!<!<!<!<!<!<!<! p { margin-top: 0 }
-->
</style>
</head>
<body>
<p>
- <img src="file:/C:/Program Files/Microsoft Office/Office11/Bitmaps/Styles/ACRICEPR.GIF" />
+ <img src="file:/C:/Program Files/Microsoft Office/Office11/Bitmaps/Styles/ACRICEPR.GIF"/>
</p>
</body>
-</html></richcontent>
-<node FOLDED="true" ID="Freeplane_Link_1799711958" CREATED="1124560950732" MODIFIED="1193212511062">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node FOLDED="true" ID="Freeplane_Link_1799711958" CREATED="1124560950732" MODIFIED="1193212511062"><richcontent TYPE="NODE">
+
<html>
<head>
<style type="text/css">
- <!--<!<!<!<!<!<!<!<!<!<!<!<!
- p { margin-top: 0 }
+ <!--
+ <!<!<!<!<!<!<!<!<!<!<!<! p { margin-top: 0 }
-->
</style>
</head>
<body>
<p>
- <img src="file:/C:/Program Files/Microsoft Office/Office11/Bitmaps/Styles/ACSNDSTN.GIF" />
+ <img src="file:/C:/Program Files/Microsoft Office/Office11/Bitmaps/Styles/ACSNDSTN.GIF"/>
</p>
</body>
-</html></richcontent>
-<node ID="Freeplane_Link_1719958498" CREATED="1124560950732" MODIFIED="1193212516703">
-<richcontent TYPE="NODE">
+</html>
+
+</richcontent>
+<node ID="Freeplane_Link_1719958498" CREATED="1124560950732" MODIFIED="1193212516703"><richcontent TYPE="NODE">
+
<html>
<head>
<style type="text/css">
- <!--<!<!<!<!<!<!<!<!<!<!<!<!
- p { margin-top: 0 }
+ <!--
+ <!<!<!<!<!<!<!<!<!<!<!<! p { margin-top: 0 }
-->
</style>
</head>
<body>
<p>
- <img src="file:/C:/Program Files/Microsoft Office/Office11/Bitmaps/Styles/ACSUMIPT.GIF" />
+ <img src="file:/C:/Program Files/Microsoft Office/Office11/Bitmaps/Styles/ACSUMIPT.GIF"/>
</p>
</body>
-</html></richcontent>
+</html>
+
+</richcontent>
</node>
</node>
</node>
@@ -915,10 +1048,10 @@
<node TEXT="Il existe différents styles de lignes" ID="ID_1621067344" CREATED="1270896067862" MODIFIED="1277389496234">
<edge STYLE="linear" WIDTH="1"/>
</node>
-<node TEXT=" Il est aussi possible de modifier leurs couleurs et leur épaisseur" ID="ID_22717831" CREATED="1270896096758" MODIFIED="1277389563093" HGAP="51" VSHIFT="-17">
+<node TEXT=" Il est aussi possible de modifier leurs couleurs et leur épaisseur" ID="ID_22717831" CREATED="1270896096758" MODIFIED="1277389563093" HGAP_QUANTITY="51.0 px" VSHIFT_QUANTITY="-17.0 px">
<edge COLOR="#0033cc" WIDTH="8"/>
</node>
-<node TEXT="ou les rendre invisible." ID="ID_1737604780" CREATED="1270896109110" MODIFIED="1277389558593" HGAP="23" VSHIFT="17">
+<node TEXT="ou les rendre invisible." ID="ID_1737604780" CREATED="1270896109110" MODIFIED="1277389558593" HGAP_QUANTITY="23.0 px" VSHIFT_QUANTITY="17.0 px">
<edge STYLE="hide_edge" COLOR="#ffffff" WIDTH="thin"/>
</node>
</node>
@@ -938,9 +1071,9 @@
<node TEXT="Pour ajouter un nuage : Mise en forme > Nuage, touches Ctrl + Maj + B ou Insérer > Nuage dans le menu contextuel du nœud." ID="Freeplane_Link_454267551" CREATED="1275400917613" MODIFIED="1277389993062"/>
<node TEXT="Pour changer la couleur d'un nuage, Mise en forme > Couleur de nuage ou via le menu contextuel du nœud." ID="Freeplane_Link_24021567" CREATED="1275400917613" MODIFIED="1277390069187"/>
<node TEXT="Les nuages peuvent avoir différentes couleurs de fond, comme le vert..." FOLDED="true" ID="Freeplane_Link_1607216642" CREATED="1275400917613" MODIFIED="1277390157984">
-<cloud COLOR="#66ff66" WIDTH="0"/>
+<cloud COLOR="#66ff66" SHAPE="ARC"/>
<node TEXT="... ou le marron." ID="Freeplane_Link_1420920637" CREATED="1275400917613" MODIFIED="1277390145671" COLOR="#ffffff">
-<cloud COLOR="#993300" WIDTH="0"/>
+<cloud COLOR="#993300" SHAPE="ARC"/>
</node>
</node>
</node>
@@ -1066,7 +1199,7 @@
<node TEXT="Page d'accueil du site Web Freeplane" POSITION="left" ID="ID_916980386" CREATED="1270892460631" MODIFIED="1277230241468" LINK="http://freeplane.sourceforge.net">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Tableau des raccourcis clavier" POSITION="left" ID="_Freeplane_Link_1091417446" CREATED="1270892460634" MODIFIED="1277230247296" COLOR="#006699" LINK="FP_Key_Mappings_Quick_Guide.pdf"/>
+<node TEXT="Tableau des raccourcis clavier" POSITION="left" ID="_Freeplane_Link_1091417446" CREATED="1270892460634" MODIFIED="1277230247296" LINK="FP_Key_Mappings_Quick_Guide.pdf" COLOR="#006699"/>
<node TEXT="Référentiel des Menus" POSITION="left" ID="ID_640122712" CREATED="1272090985328" MODIFIED="1277230253875" LINK="FP_MenuReference.mm" COLOR="#006699">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
</node>
@@ -1126,7 +1259,7 @@
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
</node>
-<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1270892460647" MODIFIED="1270892460647" COLOR="#996600" LINK="http://danpolansky.blogspot.com/">
+<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1270892460647" MODIFIED="1270892460647" LINK="http://danpolansky.blogspot.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
</node>
diff --git a/freeplane/doc/freeplane_functionality_nl.jpg b/freeplane/doc/freeplane_functionality_nl.jpg
deleted file mode 100644
index dc3b126..0000000
Binary files a/freeplane/doc/freeplane_functionality_nl.jpg and /dev/null differ
diff --git a/freeplane/doc/freeplane_functionality_nl.mm b/freeplane/doc/freeplane_functionality_nl.mm
deleted file mode 100644
index 05fc658..0000000
--- a/freeplane/doc/freeplane_functionality_nl.mm
+++ /dev/null
@@ -1,440 +0,0 @@
-<map version="0.9.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node TEXT="Basisknoop" FOLDED="false" ID="ID_45488473" CREATED="1288535648658" MODIFIED="1291736329835">
-<hook NAME="MapStyle" zoom="0.74711066" max_node_width="600">
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork">
-<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.ok">
-<icon BUILTIN="button_ok"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.needs_action">
-<icon BUILTIN="messagebox_warning"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.floating_node">
-<cloud COLOR="#ffffff" SHAPE="ARC"/>
-<edge STYLE="hide_edge"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-<edge STYLE="bezier" COLOR="#808080" WIDTH="thin"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-<edge STYLE="bezier" COLOR="#808080" WIDTH="thin"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.connection" COLOR="#606060" STYLE="fork">
-<font NAME="Arial" SIZE="10" BOLD="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important" COLOR="#ff0000">
-<icon BUILTIN="yes"/>
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.question">
-<icon BUILTIN="help"/>
-<font NAME="Aharoni" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.key" COLOR="#996600">
-<icon BUILTIN="password"/>
-<font NAME="Liberation Sans" SIZE="12" BOLD="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.idea">
-<icon BUILTIN="idea"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.note" COLOR="#990000">
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.date" COLOR="#0033ff">
-<icon BUILTIN="calendar"/>
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.website" COLOR="#006633">
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.list" COLOR="#cc6600">
-<icon BUILTIN="list"/>
-<font NAME="Liberation Sans" SIZE="12" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.quotation" COLOR="#338800" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="12" BOLD="false" ITALIC="false"/>
-<edge STYLE="bezier" COLOR="#808080" WIDTH="thin"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.definition" COLOR="#666600">
-<font NAME="Liberation Sans" SIZE="12" BOLD="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.description" COLOR="#996600">
-<font NAME="Liberation Sans" SIZE="12" BOLD="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.pending" COLOR="#b3b95c">
-<font NAME="Liberation Sans" SIZE="12"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="20"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="18"/>
-<edge WIDTH="8"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="16"/>
-<edge STYLE="bezier" WIDTH="thin"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="12"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right"/>
-</stylenode>
-</map_styles>
-</hook>
-<font BOLD="true"/>
-<node TEXT="links van basisknoop" POSITION="left" ID="ID_1772025129" CREATED="1288536311727" MODIFIED="1291736349616" STYLE="bubble" HGAP="21" VSHIFT="21">
-<node TEXT="knopen in wolk" ID="ID_1292633494" CREATED="1305277530881" MODIFIED="1305277939742" HGAP="94" VSHIFT="17">
-<cloud COLOR="#f0f0f0" SHAPE="STAR"/>
-<node TEXT="rechthoek" ID="ID_1198357672" CREATED="1305277572322" MODIFIED="1305277769141" HGAP="48" VSHIFT="-46">
-<cloud COLOR="#f0f0f0" SHAPE="RECT"/>
-</node>
-<node TEXT="in wolk" ID="ID_1422611344" CREATED="1305277851508" MODIFIED="1305277859106"/>
-<node TEXT="ster" ID="ID_1434127019" CREATED="1305277804466" MODIFIED="1305277819739">
-<cloud COLOR="#f0f0f0" SHAPE="STAR"/>
-</node>
-</node>
-</node>
-<node TEXT="NAAR HANDLEDING" POSITION="right" ID="ID_1722675325" CREATED="1289120504367" MODIFIED="1289120698955" HGAP="52" VSHIFT="-80" LINK="freeplane_nl.mm">
-<font BOLD="true"/>
-<edge STYLE="hide_edge"/>
-<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
-</node>
-<node TEXT="rechts van basisknoop" POSITION="right" ID="ID_441663322" CREATED="1288536353356" MODIFIED="1291736358976" STYLE="bubble" HGAP="19" VSHIFT="-13">
-<node ID="ID_1863548649" CREATED="1288536207761" MODIFIED="1288541701053" HGAP="37" VSHIFT="-13" STYLE="bubble">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- boven a
- </p>
- </body>
-</html></richcontent>
-</node>
-<node TEXT="knoop a" ID="ID_1119041406" CREATED="1288535672221" MODIFIED="1291736448161" STYLE="bubble" HGAP="53" VSHIFT="7">
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_268922755" SOURCE_LABEL="ouder (=label)" TARGET_LABEL="kleinkind" MIDDLE_LABEL="verbindingslijn" STARTINCLINATION="-11;64;" ENDINCLINATION="11;87;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1863548649" STARTINCLINATION="48;0;" ENDINCLINATION="48;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="knoop b" ID="ID_1908863616" CREATED="1288535688688" MODIFIED="1288536436333">
-<edge STYLE="bezier"/>
-<node TEXT="knoop c" ID="ID_268922755" CREATED="1288535699522" MODIFIED="1291736448161">
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1863548649" STARTINCLINATION="161;0;" ENDINCLINATION="161;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-</node>
-</node>
-</node>
-<node TEXT="onder a" ID="ID_975219834" CREATED="1288536218798" MODIFIED="1288541704704" HGAP="27" VSHIFT="34" STYLE="bubble"/>
-</node>
-<node TEXT="omlijning knoop" POSITION="right" ID="ID_1926775464" CREATED="1288536586615" MODIFIED="1288548791271" HGAP="19" VSHIFT="-2">
-<node TEXT="zonder omlijning" ID="ID_433807760" CREATED="1288536619429" MODIFIED="1288646950940"/>
-<node TEXT="met omlijning" ID="ID_1794331644" CREATED="1288536624648" MODIFIED="1288646942532" STYLE="bubble"/>
-</node>
-<node TEXT="kleur" POSITION="right" ID="ID_1602479950" CREATED="1288536644733" MODIFIED="1288536652400">
-<node TEXT="tekstkleur" ID="ID_1350125844" CREATED="1288536652401" MODIFIED="1288542052673" COLOR="#ff0066"/>
-<node TEXT="knoopkleur" ID="ID_113421480" CREATED="1288536658726" MODIFIED="1288542058944" BACKGROUND_COLOR="#00ff00"/>
-<node TEXT="takkleur" ID="ID_939577724" CREATED="1288536788635" MODIFIED="1288542068616">
-<edge COLOR="#ff0066"/>
-</node>
-<node TEXT="achtergrondkleur mindmap" ID="ID_1843027739" CREATED="1288536750875" MODIFIED="1288542075698"/>
-</node>
-<node TEXT="Lettertype" POSITION="right" ID="ID_8536216" CREATED="1270892460659" MODIFIED="1286307362606">
-<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Times New Roman" ID="ID_1308363481" CREATED="1270892460659" MODIFIED="1271973714732">
-<font NAME="Times New Roman" SIZE="16"/>
-</node>
-<node TEXT="Verdana" ID="ID_256616219" CREATED="1270892460659" MODIFIED="1271973720643">
-<font NAME="Verdana" SIZE="12"/>
-</node>
-<node TEXT="Dialog font" ID="ID_825914156" CREATED="1270892460659" MODIFIED="1271973770585">
-<font NAME="Dialog" SIZE="21"/>
-</node>
-</node>
-<node TEXT="dikte tak" POSITION="right" ID="ID_241458321" CREATED="1288541466835" MODIFIED="1288646970331" VSHIFT="7">
-<node TEXT="dun" ID="ID_1693976270" CREATED="1288541473878" MODIFIED="1288541507504" HGAP="42"/>
-<node TEXT="punt 3" ID="ID_1152182019" CREATED="1288542920337" MODIFIED="1288542944097" HGAP="42" VSHIFT="9">
-<edge WIDTH="2"/>
-</node>
-<node TEXT="punt 8" ID="ID_1828139471" CREATED="1288541479345" MODIFIED="1288542967746" HGAP="42" VSHIFT="5">
-<edge WIDTH="8"/>
-</node>
-</node>
-<node TEXT="vorm tak" POSITION="right" ID="ID_784697063" CREATED="1288536745875" MODIFIED="1289122245318" HGAP="21" VSHIFT="1">
-<node TEXT="Rechte lijn" ID="ID_884692926" CREATED="1288538234095" MODIFIED="1305276198448" HGAP="53" VSHIFT="-1">
-<edge STYLE="linear" WIDTH="4"/>
-<hook NAME="FirstGroupNode"/>
-</node>
-<node TEXT="Bocht" ID="ID_609820168" CREATED="1288538240451" MODIFIED="1288539867421" HGAP="57" VSHIFT="9">
-<edge STYLE="bezier" WIDTH="4"/>
-</node>
-<node TEXT="Taps toelopend recht" ID="ID_1647821228" CREATED="1288538242377" MODIFIED="1288540221963" HGAP="60" VSHIFT="10">
-<edge STYLE="sharp_linear" WIDTH="4"/>
-</node>
-<node TEXT="Taps toelopend bocht" ID="ID_895403951" CREATED="1288538470332" MODIFIED="1288540434497" HGAP="70" VSHIFT="15">
-<edge STYLE="sharp_bezier" WIDTH="4"/>
-</node>
-<node TEXT="Aggregatieknoop (accolade)" ID="ID_1818113947" CREATED="1305276198386" MODIFIED="1305278105742" STYLE="bubble">
-<hook NAME="SummaryNode"/>
-</node>
-<node TEXT="Verborgen tak" ID="ID_1675552701" CREATED="1288538507390" MODIFIED="1288548679856" HGAP="77" VSHIFT="18" BACKGROUND_COLOR="#00ffff">
-<edge STYLE="hide_edge" WIDTH="4"/>
-</node>
-</node>
-<node TEXT="knooptekst" POSITION="left" ID="ID_1649509090" CREATED="1288646145389" MODIFIED="1305277944344" VSHIFT="23" STYLE="bubble">
-<node ID="ID_1520586986" CREATED="1288646162992" MODIFIED="1291735798155">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <font color="#ff0000">Knoop</font><b>tekst</b>
- </p>
- </body>
-</html></richcontent>
-<font ITALIC="true"/>
-<node ID="ID_1286225916" CREATED="1288646162992" MODIFIED="1291821762551">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <font color="#ff0000">Knoop</font><b>tekst</b>
- </p>
- </body>
-</html></richcontent>
-<font ITALIC="true"/>
-<richcontent TYPE="DETAILS">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Bijlagetekst
- </p>
- </body>
-</html></richcontent>
-<edge COLOR="#cc0000"/>
-<node ID="ID_477486683" CREATED="1288646162992" MODIFIED="1305276483242">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <font color="#ff0000">Knoop</font><b>tekst</b>
- </p>
- </body>
-</html></richcontent>
-<font ITALIC="true"/>
-<richcontent TYPE="NOTE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Notitietekst
- </p>
- </body>
-</html></richcontent>
-<richcontent TYPE="DETAILS">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Bijlagetekst<br/>Met verborgen notitietekst
- </p>
- </body>
-</html>
-</richcontent>
-<node ID="ID_1010722858" CREATED="1288646162992" MODIFIED="1305276528482">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <font color="#ff0000">Knoop</font><b>tekst</b>
- </p>
- </body>
-</html></richcontent>
-<font ITALIC="false"/>
-<richcontent TYPE="NOTE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Notitietekst
- </p>
- </body>
-</html></richcontent>
-<attribute NAME="a1" VALUE="waarde1"/>
-<attribute NAME="a2" VALUE="waarde2"/>
-<richcontent TYPE="DETAILS">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Bijlage en<b><i> attributen</i></b><br/>en verborgen notitietekst<br/>
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-</node>
-</node>
-</node>
-<node ID="ID_970392949" CREATED="1286737367993" MODIFIED="1289121393025" COLOR="#000000">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Uitgebreide tekstopmaak
- </p>
- <p>
- met HTML: klik...
- </p>
- </body>
-</html></richcontent>
-<node ID="ID_344410157" CREATED="1270892460698" MODIFIED="1305276663983">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p class="msonormal">
- %Schijf groot
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-</node>
-<node TEXT="Knipperen" ID="ID_1280590016" CREATED="1288548004325" MODIFIED="1288646884531" VSHIFT="-3">
-<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
-</node>
-<node TEXT="Formules tonen (LaTex)" ID="ID_1643428065" CREATED="1271097206186" MODIFIED="1305277378486" STYLE="bubble">
-<hook EQUATION="\begin{array}{l}
\mbox{I}^\fgcolor{ff0000}{\heartsuit}\mbox{\JLaTeXMath}\\
\end{array}" NAME="plugins/latex/LatexNodeHook.properties"/>
-</node>
-</node>
-<node TEXT="knoop met Agenda" POSITION="left" ID="ID_1885496887" CREATED="1288542096079" MODIFIED="1288647017131" HGAP="31">
-<hook NAME="plugins/TimeManagementReminder.xml">
- <Parameters REMINDUSERAT="2077460580480"/>
-</hook>
-</node>
-<node TEXT="knoop met Beveiliging" ENCRYPTED_CONTENT="t/NS/HPSppU= VbQIDGWIdFE=" POSITION="left" ID="ID_36040841" CREATED="1288542236861" MODIFIED="1288647028691" VSHIFT="20"/>
-<node TEXT="knoop met Snelkoppeling" POSITION="left" ID="ID_1519332680" CREATED="1288542452827" MODIFIED="1288647049142" LINK="#ID_784697063" HGAP="21" VSHIFT="8"/>
-<node TEXT="knoop met Hyperlink" POSITION="left" ID="ID_1537075496" CREATED="1288542605210" MODIFIED="1288647056287" LINK="http://kioo.nl/" HGAP="21" VSHIFT="17"/>
-<node TEXT="knoop met Pictogrammen" POSITION="left" ID="ID_233656995" CREATED="1288542843639" MODIFIED="1288647069126" HGAP="21" VSHIFT="13">
-<icon BUILTIN="bookmark"/>
-<icon BUILTIN="button_ok"/>
-<icon BUILTIN="closed"/>
-</node>
-<node TEXT="Afbeelding in binnengebied
(niet schaalbaar, basistekst niet zichtbaar)" POSITION="left" ID="ID_1695130884" CREATED="1289120271958" MODIFIED="1305276153130">
-<node ID="ID_1091969981" CREATED="1289120375598" MODIFIED="1289120393257">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <img src="examplepicture_nl.JPG"/>
- </body>
-</html></richcontent>
-</node>
-</node>
-<node TEXT="Afbeelding in buitengebied
(schaalbaar, basistekst blijft zichtbaar)" POSITION="left" ID="ID_1465950648" CREATED="1289120295849" MODIFIED="1305276119606" HGAP="26" VSHIFT="-50">
-<hook URI="examplepicture_nl.JPG" SIZE="0.39583334" NAME="ExternalObject"/>
-</node>
-<node TEXT="%Schijf" POSITION="left" ID="ID_1551071163" CREATED="1305276585054" MODIFIED="1305276613837">
-<icon BUILTIN="25%"/>
-<node TEXT="%Schijf groot" ID="ID_816574996" CREATED="1305276676845" MODIFIED="1305276787199">
-<icon BUILTIN="25%"/>
-<hook URI="../../../../../Desktop/freeplane-1.2.5_06/resources/templates/Progress_quarter_01.svg" SIZE="1.0" NAME="ExternalObject"/>
-</node>
-</node>
-<node TEXT="Automatische knoopnummering" POSITION="left" ID="ID_1097461051" CREATED="1305277030363" MODIFIED="1305277042859" NUMBERED="true">
-<node TEXT="xxx" ID="ID_1240489027" CREATED="1305277061071" MODIFIED="1305277067422" NUMBERED="true"/>
-<node TEXT="yyy" ID="ID_948681138" CREATED="1305277093293" MODIFIED="1305277100813" NUMBERED="true"/>
-</node>
-<node POSITION="right" ID="ID_1109258357" CREATED="1270892460668" MODIFIED="1289122267641" COLOR="#000000" HGAP="23" VSHIFT="6">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- tak versus verbinding
- </p>
- </body>
-</html></richcontent>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1109258357" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="Tak" ID="ID_888638974" CREATED="1286638234353" MODIFIED="1288798709827">
-<node TEXT="van" ID="ID_1442469647" CREATED="1286638265773" MODIFIED="1286638354428">
-<node TEXT="knoop" ID="ID_1008503185" CREATED="1286638271506" MODIFIED="1286638362353">
-<node TEXT="naar" ID="ID_1283715475" CREATED="1286638275117" MODIFIED="1286638369622">
-<node TEXT="kindknoop1" ID="ID_1191328323" CREATED="1286638317916" MODIFIED="1286638381260"/>
-<node TEXT="kindknoop2" ID="ID_1221833055" CREATED="1286638322275" MODIFIED="1286638387687"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Verbinding van de ene knoop" ID="ID_1772815867" CREATED="1270892460668" MODIFIED="1286309489824">
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_799512227" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-</node>
-<node TEXT="Naar een andere knoop" ID="ID_799512227" CREATED="1270892460669" MODIFIED="1286309508638">
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#6600ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1193921681" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-</node>
-<node TEXT="Met een andere kleur" ID="ID_1193921681" CREATED="1270892460670" MODIFIED="1286309525486">
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_1311780381" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-</node>
-<node TEXT="En een andere route" ID="ID_1311780381" CREATED="1270892460670" MODIFIED="1286309561428"/>
-<node TEXT="Een verbinding kan de vorm van een lijn hebben" ID="ID_407052458" CREATED="1270893418086" MODIFIED="1288798375285" COLOR="#000000" VGAP="20" HGAP="19" VSHIFT="6">
-<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<node TEXT="1" ID="ID_1159726231" CREATED="1270893450078" MODIFIED="1270893469956">
-<arrowlink SHAPE="EDGE_LIKE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_192239530" STARTINCLINATION="46;0;" ENDINCLINATION="46;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-</node>
-<node TEXT="2" ID="ID_63372862" CREATED="1270893453278" MODIFIED="1270991928052">
-<node TEXT="22" ID="ID_192239530" CREATED="1270893459959" MODIFIED="1270893460779"/>
-</node>
-<node TEXT="3" ID="ID_237103252" CREATED="1270893454198" MODIFIED="1270893480379">
-<arrowlink SHAPE="EDGE_LIKE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_192239530" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-</node>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane/doc/freeplane_id.mm b/freeplane/doc/freeplane_id.mm
index 531b4cd..945acbe 100644
--- a/freeplane/doc/freeplane_id.mm
+++ b/freeplane/doc/freeplane_id.mm
@@ -1,586 +1,651 @@
-<map version="0.9.0_Beta_8">
-<!-- To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node COLOR="#993300" CREATED="1124560950701" ID="ID_1694064349" MODIFIED="1207926619789">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body width="">
- <p align="center">
- Freeplane<br /><small>- perangkat lunak bebas untuk</small><br /><small>pembuatan MindMap -</small>
- </p>
- </body>
-</html></richcontent>
-<font BOLD="true" NAME="Dialog" SIZE="18"/>
-<node CREATED="1124560950701" ID="ID_278812263" LINK="http://freeplane.sourceforge.net" MODIFIED="1207927061884" POSITION="left" TEXT="Situs web Freeplane">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1091417446" MODIFIED="1207927121089" POSITION="left" TEXT="Tabel kunci pintasan">
-<node CREATED="1124560950701" ID="ID_163135330" MODIFIED="1208312544662" TEXT="Perintah berkas:
Peta baru - Ctrl+N
Buka peta - Ctrl+O
Simpan peta - Ctrl+S
Simpan sebagai - Ctrl+A
Cetak - Ctrl+P
Tutup - Ctrl+W
Keluar - Ctrl+Q
Peta sblmnya - Ctrl+LEFT
Peta berikutnya - Ctrl+RIGHT
Ekspor berkas ke HTML - Ctrl+E
Ekspor cabang ke HTML - Ctrl+H
Ekspor cabang ke berkas MM baru [...]
+<map version="freeplane 1.5.9">
+<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node TEXT="<html>
 <head>
 
 </head>
 <body width="">
 <p align="center">
 Freeplane<br ><small>- perangkat lunak bebas untuk</small><br ><small>pembuatan MindMap -</small> 
 </p>
 </body>
</html>" FOLDED="false" ID="ID_1694064349" CREATED="1124560950701" MODIFIED="1207926619789" COLOR="#993300">
+<font NAME="Dialog" SIZE="18" BOLD="true"/>
+<hook NAME="MapStyle">
+ <properties fit_to_viewport="false;"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" FORMAT="NO_FORMAT" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="true" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#ffffff">
+<font SIZE="9"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" UNIFORM_SHAPE="true" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font SIZE="24" ITALIC="true"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2">
+<edge COLOR="#ff0033"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3">
+<edge COLOR="#009933"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4">
+<edge COLOR="#3333ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#ff6600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<node TEXT="Situs web Freeplane" POSITION="left" ID="ID_278812263" CREATED="1124560950701" MODIFIED="1207927061884" LINK="http://freeplane.sourceforge.net">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Tabel kunci pintasan" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1091417446" CREATED="1124560950701" MODIFIED="1207927121089" COLOR="#006699">
+<node TEXT="Perintah berkas:
Peta baru - Ctrl+N
Buka peta - Ctrl+O
Simpan peta - Ctrl+S
Simpan sebagai - Ctrl+A
Cetak - Ctrl+P
Tutup - Ctrl+W
Keluar - Ctrl+Q
Peta sblmnya - Ctrl+LEFT
Peta berikutnya - Ctrl+RIGHT
Ekspor berkas ke HTML - Ctrl+E
Ekspor cabang ke HTML - Ctrl+H
Ekspor cabang ke berkas MM baru - Alt+A
Buka berkas pertama dari riwayat - Ctrl+Shift+W
&# [...]
<font NAME="Courier New" SIZE="12"/>
</node>
</node>
-<node COLOR="#006633" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_904501221" MODIFIED="1208312560404" POSITION="left" TEXT="Instalasi">
-<node COLOR="#006699" CREATED="1124560950701" ID="_Freeplane_Link_1911559485" MODIFIED="1208312973308" TEXT="Taut">
-<node CREATED="1124560950701" ID="ID_1972294106" LINK="http://java.sun.com/j2se" MODIFIED="1208312579943" TEXT="Unduh Java Runtime Environment (minimal J2RE1.4)">
+<node TEXT="Instalasi" FOLDED="true" POSITION="left" ID="_Freeplane_Link_904501221" CREATED="1124560950701" MODIFIED="1208312560404" COLOR="#006633">
+<node TEXT="Taut" ID="_Freeplane_Link_1911559485" CREATED="1124560950701" MODIFIED="1208312973308" COLOR="#006699">
+<node TEXT="Unduh Java Runtime Environment (minimal J2RE1.4)" ID="ID_1972294106" CREATED="1124560950701" MODIFIED="1208312579943" LINK="http://java.sun.com/j2se">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1612101865" LINK="http://sourceforge.net/project/showfiles.php?project_id=211069" MODIFIED="1208312597618" TEXT="Unduh Aplikasi Freeplane">
+<node TEXT="Unduh Aplikasi Freeplane" ID="_Freeplane_Link_1612101865" CREATED="1124560950701" MODIFIED="1208312597618" LINK="http://sourceforge.net/project/showfiles.php?project_id=211069">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_139664576" MODIFIED="1208312738440" TEXT="Untuk instalasi Freeplane di Microsoft Windows, pasang Java dari Sun lalu pasang Freeplane menggunakan program pemasang (installer) yang tersedia."/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1380352758" MODIFIED="1208312876759" TEXT="Untuk instalasi Freeplane di Linux, unduh Java Runtime Environment dan aplikasi Freeplane itu sendiri. Pasang Java terlebih dahulu, lalu bongkar (unpack) paket Freeplane. Untuk menjalankan Freeplane, jalankan freeplane.sh."/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1808511462" MODIFIED="1208312948773" TEXT="Di Microsoft Windows dan Mac OS X, Anda juga dapat langsung mendobel-klik berkas freeplane.jar yang berlokasi di map bernama lib untuk memulai Freeplane."/>
+<node TEXT="Untuk instalasi Freeplane di Microsoft Windows, pasang Java dari Sun lalu pasang Freeplane menggunakan program pemasang (installer) yang tersedia." ID="_Freeplane_Link_139664576" CREATED="1124560950701" MODIFIED="1208312738440"/>
+<node TEXT="Untuk instalasi Freeplane di Linux, unduh Java Runtime Environment dan aplikasi Freeplane itu sendiri. Pasang Java terlebih dahulu, lalu bongkar (unpack) paket Freeplane. Untuk menjalankan Freeplane, jalankan freeplane.sh." ID="_Freeplane_Link_1380352758" CREATED="1124560950701" MODIFIED="1208312876759"/>
+<node TEXT="Di Microsoft Windows dan Mac OS X, Anda juga dapat langsung mendobel-klik berkas freeplane.jar yang berlokasi di map bernama lib untuk memulai Freeplane." ID="_Freeplane_Link_1808511462" CREATED="1124560950701" MODIFIED="1208312948773"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_353522063" MODIFIED="1208313002620" POSITION="left" TEXT="Menjelajahi berkas dalam komputer">
-<node CREATED="1124560950701" ID="ID_350447496" MODIFIED="1208313244338" TEXT="Untuk menjelajahi sistem berkas komputer, beralihlah ke modus File lewat perintah Peta > File dari menu."/>
-<node CREATED="1124560950701" ID="ID_1896842303" MODIFIED="1208313283114" TEXT="Anda dapat menjelajahi struktur berkas seolah membaca MindMap."/>
-<node CREATED="1124560950701" ID="ID_1343540447" MODIFIED="1208773411572" TEXT="Agar suatu map menjadi node yang mengambil posisi tengah, klik kanan pada node tersebut lalu pilih Tengah."/>
-<node CREATED="1124560950701" ID="ID_305820556" MODIFIED="1208773450654" TEXT="Untuk melihat, mengedit, atau menjalankan berkas, ikuti tautan node tersebut."/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_279880616" MODIFIED="1208773660294" TEXT="Modus File saat ini tidak begitu bermanfaat, melainkan hanya untuk menunjukkan bahwa tidak sulit untuk mengumpankan data ke dalam peta dari sumber data lain selain MindMap. Sejauh ini tampaknya orang tidak akan benar-benar menggunakan modus ini."/>
+<node TEXT="Menjelajahi berkas dalam komputer" FOLDED="true" POSITION="left" ID="_Freeplane_Link_353522063" CREATED="1124560950701" MODIFIED="1208313002620" COLOR="#407000">
+<node TEXT="Untuk menjelajahi sistem berkas komputer, beralihlah ke modus File lewat perintah Peta > File dari menu." ID="ID_350447496" CREATED="1124560950701" MODIFIED="1208313244338"/>
+<node TEXT="Anda dapat menjelajahi struktur berkas seolah membaca MindMap." ID="ID_1896842303" CREATED="1124560950701" MODIFIED="1208313283114"/>
+<node TEXT="Agar suatu map menjadi node yang mengambil posisi tengah, klik kanan pada node tersebut lalu pilih Tengah." ID="ID_1343540447" CREATED="1124560950701" MODIFIED="1208773411572"/>
+<node TEXT="Untuk melihat, mengedit, atau menjalankan berkas, ikuti tautan node tersebut." ID="ID_305820556" CREATED="1124560950701" MODIFIED="1208773450654"/>
+<node TEXT="Modus File saat ini tidak begitu bermanfaat, melainkan hanya untuk menunjukkan bahwa tidak sulit untuk mengumpankan data ke dalam peta dari sumber data lain selain MindMap. Sejauh ini tampaknya orang tidak akan benar-benar menggunakan modus ini." ID="_Freeplane_Link_279880616" CREATED="1124560950701" MODIFIED="1208773660294"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1530607683" MODIFIED="1208773697151" POSITION="left" TEXT="Menjelajahi MindMap">
-<node CREATED="1124560950701" ID="ID_245563788" MODIFIED="1208773837850" TEXT="Untuk menjelajahi MindMap namun tanpa mengeditnya, beralihlah ke modus Browse melalui menu Peta > Browse. Fungsi ini tidak digunakan selain daripada di dalam Freeplane applet.
"/>
-<node CREATED="1124560950701" ID="ID_729697699" MODIFIED="1208773954416" TEXT="Ada alasan teknis mengapa modus Browse terpisah dibutuhkan. Menjelajah (browse) adalah satu-satunya operasi yang dapat dilakukan melalui Freeplane applet, yang dapat ditempelkan dalam laman web Anda. Umumnya, Anda tidak akan menggunakan modus Browse dalam Freeplane.
"/>
+<node TEXT="Menjelajahi MindMap" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1530607683" CREATED="1124560950701" MODIFIED="1208773697151" COLOR="#407000">
+<node TEXT="Untuk menjelajahi MindMap namun tanpa mengeditnya, beralihlah ke modus Browse melalui menu Peta > Browse. Fungsi ini tidak digunakan selain daripada di dalam Freeplane applet.
" ID="ID_245563788" CREATED="1124560950701" MODIFIED="1208773837850"/>
+<node TEXT="Ada alasan teknis mengapa modus Browse terpisah dibutuhkan. Menjelajah (browse) adalah satu-satunya operasi yang dapat dilakukan melalui Freeplane applet, yang dapat ditempelkan dalam laman web Anda. Umumnya, Anda tidak akan menggunakan modus Browse dalam Freeplane.
" ID="ID_729697699" CREATED="1124560950701" MODIFIED="1208773954416"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1136088046" MODIFIED="1208961883966" POSITION="left" TEXT="Tentang modus">
-<edge WIDTH="thin"/>
+<node TEXT="Tentang modus" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1136088046" CREATED="1124560950701" MODIFIED="1208961883966" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1713057526" MODIFIED="1208962776570" TEXT="Walaupun Freeplane utamanya adalah alat penyunting MindMap, desainnya memungkinkan pemakaian untuk membaca data dari berbagai sumber. Untuk membuat suatu sumber data tertentu tersedia untuk dilihat di Freeplane, pemrogram harus membuat apa yang disebut modus untuk sumber data tersebut. Salah satu contohnya adalah modus File. Setahu kami belum ada modus lain yang telah diimplementasi. Belum pasti [...]
+<edge WIDTH="thin"/>
+<node TEXT="Walaupun Freeplane utamanya adalah alat penyunting MindMap, desainnya memungkinkan pemakaian untuk membaca data dari berbagai sumber. Untuk membuat suatu sumber data tertentu tersedia untuk dilihat di Freeplane, pemrogram harus membuat apa yang disebut modus untuk sumber data tersebut. Salah satu contohnya adalah modus File. Setahu kami belum ada modus lain yang telah diimplementasi. Belum pasti apakah akan ada yang memanfaatkan arsitektur ini, namun hal ini bisa dilakukan bi [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_700085988" MODIFIED="1208963696673" TEXT="Contoh lain yang sudah hampir jadi dibuat adalah ada modus Scheme, untuk menyunting program dalam bahasa Scheme. Sekali lagi, manfaatnnya masih belum jelas. Kecuali modus MindMap, modus-modus lain lebih merupakan demonstrasi tentang apa yang mungkin dilakukan dengan program ini, bukan untuk benar-benar digunakan.">
+<node TEXT="Contoh lain yang sudah hampir jadi dibuat adalah ada modus Scheme, untuk menyunting program dalam bahasa Scheme. Sekali lagi, manfaatnnya masih belum jelas. Kecuali modus MindMap, modus-modus lain lebih merupakan demonstrasi tentang apa yang mungkin dilakukan dengan program ini, bukan untuk benar-benar digunakan." ID="_Freeplane_Link_700085988" CREATED="1124560950701" MODIFIED="1208963696673">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1525986009" MODIFIED="1208963727668" POSITION="left" TEXT="Instalasi applet Freeplane di situs web Anda">
-<node COLOR="#000000" CREATED="1124560950701" ID="ID_686268443" MODIFIED="1208963801474" TEXT="Anda dapat memasang applet Freeplane di situs web Anda agar orang dapat membaca MindMap Anda.">
+<node TEXT="Instalasi applet Freeplane di situs web Anda" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1525986009" CREATED="1124560950701" MODIFIED="1208963727668" COLOR="#407000">
+<node TEXT="Anda dapat memasang applet Freeplane di situs web Anda agar orang dapat membaca MindMap Anda." ID="ID_686268443" CREATED="1124560950701" MODIFIED="1208963801474" COLOR="#000000">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1433718684" LINK="http://sourceforge.net/project/showfiles.php?group_id=211069" MODIFIED="1208963819980" TEXT="Unduh applet, yaitu freeplane-browser."/>
-<node CREATED="1124560950701" ID="ID_316824945" MODIFIED="1208964470245" TEXT="Paket unduhan berisi freeplanebrowser.jar dan freeplanebrowser.html. Buat tautan dari laman web Anda ke freeplanebrowser.html. Di dalam freeplanebrowser.html, ganti jalur (path) dalam berkas tersebut agar menunjuk ke MindMap yang Anda buat."/>
-<node CREATED="1124560950701" ID="ID_1135453004" MODIFIED="1208964565172" TEXT="Berkas jar dari applet tersebut harus diletakkan di peladen yang sama dengan MindMap yang dibuka, sebagai syarat keamanan dari Java. Anda harus mengunggah berka jar applet Freeplane dan MindMap Anda ke laman web tersebut."/>
+<node TEXT="Unduh applet, yaitu freeplane-browser." ID="ID_1433718684" CREATED="1124560950701" MODIFIED="1208963819980" LINK="http://sourceforge.net/project/showfiles.php?group_id=211069"/>
+<node TEXT="Paket unduhan berisi freeplanebrowser.jar dan freeplanebrowser.html. Buat tautan dari laman web Anda ke freeplanebrowser.html. Di dalam freeplanebrowser.html, ganti jalur (path) dalam berkas tersebut agar menunjuk ke MindMap yang Anda buat." ID="ID_316824945" CREATED="1124560950701" MODIFIED="1208964470245"/>
+<node TEXT="Berkas jar dari applet tersebut harus diletakkan di peladen yang sama dengan MindMap yang dibuka, sebagai syarat keamanan dari Java. Anda harus mengunggah berka jar applet Freeplane dan MindMap Anda ke laman web tersebut." ID="ID_1135453004" CREATED="1124560950701" MODIFIED="1208964565172"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1083756111" MODIFIED="1208964602766" POSITION="left" TEXT="Menggunakan Freeplane applet">
+<node TEXT="Menggunakan Freeplane applet" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1083756111" CREATED="1124560950701" MODIFIED="1208964602766" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_514864900" MODIFIED="1208965257287" TEXT="Dalam applet Freeplane, Anda hanya dapat menggunakan modus Browse (jelajah), Anda tidak dapat menyunting peta dari jarak jauh. Klik node untuk membuka-tutup lipatan atau membuka tautan. Seret latar belakang untuk memindahkan peta. Untuk mencari dalam peta, gunakan menu konteks node.">
+<node TEXT="Dalam applet Freeplane, Anda hanya dapat menggunakan modus Browse (jelajah), Anda tidak dapat menyunting peta dari jarak jauh. Klik node untuk membuka-tutup lipatan atau membuka tautan. Seret latar belakang untuk memindahkan peta. Untuk mencari dalam peta, gunakan menu konteks node." ID="_Freeplane_Link_514864900" CREATED="1124560950701" MODIFIED="1208965257287">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1976458022" MODIFIED="1208965297475" POSITION="left" TEXT="Perubahan antarmuka di versi 0.6.5">
-<edge WIDTH="thin"/>
+<node TEXT="Perubahan antarmuka di versi 0.6.5" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1976458022" CREATED="1124560950701" MODIFIED="1208965297475" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_717349033" MODIFIED="1208965557349" STYLE="fork" TEXT="Beberapa setelan papan ketik didefinisikan ulang untuk menyamakan dengan apa yang dianggap setelan bersama atau yang intuitif. Beberapa dari setelan tersebut dimodelkan atas program-program Windows. Beberapa setelan baru misalnya Enter untuk membuat saudara baru di bawah node sekarang, Insert untuk membuat anak baru, F2 untuk mengedit Node - di sini pengaruh Microsoft sangat jelas wal [...]
+<edge WIDTH="thin"/>
+<node TEXT="Beberapa setelan papan ketik didefinisikan ulang untuk menyamakan dengan apa yang dianggap setelan bersama atau yang intuitif. Beberapa dari setelan tersebut dimodelkan atas program-program Windows. Beberapa setelan baru misalnya Enter untuk membuat saudara baru di bawah node sekarang, Insert untuk membuat anak baru, F2 untuk mengedit Node - di sini pengaruh Microsoft sangat jelas walaupun tidak ada alasan intuitif mengapa F2 dipakai untuk mengedit node. Namun begitu Anda ter [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1179893656" MODIFIED="1208965331784" TEXT="Setelan papan ketik dapat diganti melalui menu Alat > Preferensi.">
+<node TEXT="Setelan papan ketik dapat diganti melalui menu Alat > Preferensi." ID="_Freeplane_Link_1179893656" CREATED="1124560950701" MODIFIED="1208965331784">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_784043927" MODIFIED="1208773990119" POSITION="left" TEXT="Penghargaan">
-<edge WIDTH="thin"/>
+<node TEXT="Penghargaan" FOLDED="true" POSITION="left" ID="_Freeplane_Link_784043927" CREATED="1124560950701" MODIFIED="1208773990119" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_415458128" MODIFIED="1208774001268" TEXT="Penulis">
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_1896457660" MODIFIED="1124560950701" TEXT="Joerg Mueller">
<edge WIDTH="thin"/>
+<node TEXT="Penulis" FOLDED="true" ID="Freeplane_Link_415458128" CREATED="1124560950701" MODIFIED="1208774001268" COLOR="#006699">
+<node TEXT="Joerg Mueller" ID="_Freeplane_Link_1896457660" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#558000" CREATED="1124560950701" LINK="mailto:ponders at t-online.de" MODIFIED="1124560950701" TEXT="ponders at t-online.de">
+<edge WIDTH="thin"/>
+<node TEXT="ponders at t-online.de" ID="ID_1636928501" CREATED="1124560950701" MODIFIED="1124560950701" LINK="mailto:ponders at t-online.de" COLOR="#558000">
<font NAME="Dialog" SIZE="10"/>
</node>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="University of Freiburg, Germany">
+<node TEXT="University of Freiburg, Germany" ID="ID_960789639" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_984984595" LINK="http://mujweb.cz/www/danielpolansky" MODIFIED="1124560950701" TEXT="Daniel Polansky">
-<edge WIDTH="thin"/>
+<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://mujweb.cz/www/danielpolansky" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_459203293" MODIFIED="1124560950701" TEXT="Petr Novak">
<edge WIDTH="thin"/>
-<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_875814410" MODIFIED="1124560950701" TEXT="Christian Foltin">
-<edge WIDTH="thin"/>
+<node TEXT="Petr Novak" ID="_Freeplane_Link_459203293" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_1415293905" MODIFIED="1124560950701" TEXT="Dimitri Polivaev">
+<node TEXT="Christian Foltin" ID="_Freeplane_Link_875814410" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
+</node>
+<node TEXT="Dimitri Polivaev" ID="_Freeplane_Link_1415293905" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_816166020" MODIFIED="1208774033132" TEXT="Sumbangan lain">
-<edge WIDTH="thin"/>
+<node TEXT="Sumbangan lain" FOLDED="true" ID="Freeplane_Link_816166020" CREATED="1124560950701" MODIFIED="1208774033132" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="ID_1164774797" MODIFIED="1124560950701" TEXT="Andrew Iggleden">
<edge WIDTH="thin"/>
+<node TEXT="Andrew Iggleden" FOLDED="true" ID="ID_1164774797" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_615905950" MODIFIED="1208966039732" TEXT="Instalasi Windows">
<edge WIDTH="thin"/>
+<node TEXT="Instalasi Windows" ID="ID_615905950" CREATED="1124560950701" MODIFIED="1208966039732" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1096673251" MODIFIED="1124560950701" TEXT="Bob Alexander">
-<edge WIDTH="thin"/>
+<node TEXT="Bob Alexander" FOLDED="true" ID="Freeplane_Link_1096673251" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_1498630478" MODIFIED="1208966051800" TEXT="Panduan Eclipse">
<edge WIDTH="thin"/>
+<node TEXT="Panduan Eclipse" ID="ID_1498630478" CREATED="1124560950701" MODIFIED="1208966051800" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1024053399" MODIFIED="1124560950701" TEXT="David Butt">
-<edge WIDTH="thin"/>
+<node TEXT="David Butt" FOLDED="true" ID="Freeplane_Link_1024053399" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_158863537" MODIFIED="1208966057187" TEXT="Tutorial Flash">
<edge WIDTH="thin"/>
+<node TEXT="Tutorial Flash" ID="ID_158863537" CREATED="1124560950701" MODIFIED="1208966057187" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="ID_1572312597" MODIFIED="1124560950701" TEXT="David Low">
-<edge WIDTH="thin"/>
+<node TEXT="David Low" FOLDED="true" ID="ID_1572312597" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_760522438" MODIFIED="1208966069585" TEXT="Membantu">
<edge WIDTH="thin"/>
+<node TEXT="Membantu" ID="ID_760522438" CREATED="1124560950701" MODIFIED="1208966069585" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_360501151" MODIFIED="1208774040521" TEXT="Penerjemahan">
-<node COLOR="#996600" CREATED="1208774087264" FOLDED="true" ID="ID_962580873" MODIFIED="1208774118696" STYLE="fork" TEXT="Permata Harahap">
-<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
-<node COLOR="#999999" CREATED="1208774125193" ID="ID_1424643889" MODIFIED="1208966146215" STYLE="fork" TEXT="terjemahan bahasa Indonesia">
-<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
+<node TEXT="Penerjemahan" FOLDED="true" ID="Freeplane_Link_360501151" CREATED="1124560950701" MODIFIED="1208774040521" COLOR="#006699">
+<node TEXT="Permata Harahap" FOLDED="true" ID="ID_962580873" CREATED="1208774087264" MODIFIED="1208774118696" COLOR="#996600" STYLE="fork">
+<edge STYLE="bezier" COLOR="#808080" WIDTH="thin"/>
+<node TEXT="terjemahan bahasa Indonesia" ID="ID_1424643889" CREATED="1208774125193" MODIFIED="1208966146215" COLOR="#999999" STYLE="fork">
<font NAME="SansSerif" SIZE="10"/>
+<edge STYLE="bezier" COLOR="#808080" WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_807977431" MODIFIED="1124560950701" TEXT="Bob Alexander">
-<edge WIDTH="thin"/>
+<node TEXT="Bob Alexander" FOLDED="true" ID="Freeplane_Link_807977431" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_1125551331" MODIFIED="1124560950701" TEXT="Italian translation">
<edge WIDTH="thin"/>
+<node TEXT="Italian translation" ID="ID_1125551331" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1853214917" MODIFIED="1124560950701" TEXT="Knud Riishøjgård">
-<edge WIDTH="thin"/>
+<node TEXT="Knud Riishøjgård" FOLDED="true" ID="Freeplane_Link_1853214917" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_846744145" MODIFIED="1124560950701" TEXT="Danish translation">
<edge WIDTH="thin"/>
+<node TEXT="Danish translation" ID="ID_846744145" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1676529317" MODIFIED="1124560950701" TEXT="Takeshi Kakeda">
-<edge WIDTH="thin"/>
+<node TEXT="Takeshi Kakeda" FOLDED="true" ID="Freeplane_Link_1676529317" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Japanese translation">
<edge WIDTH="thin"/>
+<node TEXT="Japanese translation" ID="ID_1368567351" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562983644" FOLDED="true" ID="Freeplane_Link_1172193026" MODIFIED="1124562984816" TEXT="Kohichi Aoki">
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_934842072" MODIFIED="1124560950701" TEXT="Japanese translation">
-<edge WIDTH="thin"/>
+<node TEXT="Kohichi Aoki" FOLDED="true" ID="Freeplane_Link_1172193026" CREATED="1124562983644" MODIFIED="1124562984816" COLOR="#996600">
+<node TEXT="Japanese translation" ID="ID_934842072" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="ID_761116196" MODIFIED="1124560950701" TEXT="Alex Dukal">
-<edge WIDTH="thin"/>
+<node TEXT="Alex Dukal" FOLDED="true" ID="ID_761116196" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Spanish translation">
<edge WIDTH="thin"/>
+<node TEXT="Spanish translation" ID="ID_1434343377" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562998159" FOLDED="true" ID="Freeplane_Link_757563697" MODIFIED="1124563008034" TEXT="Hugo Gayosso">
-<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_1783275246" MODIFIED="1124560950701" TEXT="Spanish translation">
-<edge WIDTH="thin"/>
+<node TEXT="Hugo Gayosso" FOLDED="true" ID="Freeplane_Link_757563697" CREATED="1124562998159" MODIFIED="1124563008034" COLOR="#996600">
+<node TEXT="Spanish translation" ID="Freeplane_Link_1783275246" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_929540960" MODIFIED="1124560950701" TEXT="Sylvain Gamel">
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="French translation">
+<node TEXT="Sylvain Gamel" FOLDED="true" ID="Freeplane_Link_929540960" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
+<node TEXT="French translation" ID="ID_387483489" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561242082" FOLDED="true" ID="Freeplane_Link_946171164" MODIFIED="1124561245019" TEXT="Koen Roggemans">
-<node COLOR="#999999" CREATED="1124561245957" ID="Freeplane_Link_1819881845" MODIFIED="1124561251675" TEXT="Dutch translation">
+<node TEXT="Koen Roggemans" FOLDED="true" ID="Freeplane_Link_946171164" CREATED="1124561242082" MODIFIED="1124561245019" COLOR="#996600">
+<node TEXT="Dutch translation" ID="Freeplane_Link_1819881845" CREATED="1124561245957" MODIFIED="1124561251675" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561374999" FOLDED="true" ID="Freeplane_Link_235962981" MODIFIED="1124561376718" TEXT="Rafal Kraik">
-<node COLOR="#999999" CREATED="1124561377702" ID="Freeplane_Link_459079511" MODIFIED="1124561382155" TEXT="Polish translation">
+<node TEXT="Rafal Kraik" FOLDED="true" ID="Freeplane_Link_235962981" CREATED="1124561374999" MODIFIED="1124561376718" COLOR="#996600">
+<node TEXT="Polish translation" ID="Freeplane_Link_459079511" CREATED="1124561377702" MODIFIED="1124561382155" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561969717" FOLDED="true" ID="Freeplane_Link_653284985" MODIFIED="1124561972920" TEXT="Goliath">
-<node COLOR="#999999" CREATED="1124561438294" ID="Freeplane_Link_1387213811" MODIFIED="1124561445950" TEXT="Korean translation">
+<node TEXT="Goliath" FOLDED="true" ID="Freeplane_Link_653284985" CREATED="1124561969717" MODIFIED="1124561972920" COLOR="#996600">
+<node TEXT="Korean translation" ID="Freeplane_Link_1387213811" CREATED="1124561438294" MODIFIED="1124561445950" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561753254" FOLDED="true" ID="Freeplane_Link_35211963" MODIFIED="1124563712385" TEXT="Martin Srebotnjak (nick: Miles a.k.a. filmsi)">
-<node COLOR="#999999" CREATED="1124561491886" ID="Freeplane_Link_835144271" MODIFIED="1124561506386" TEXT="Slovenian translation">
+<node TEXT="Martin Srebotnjak (nick: Miles a.k.a. filmsi)" FOLDED="true" ID="Freeplane_Link_35211963" CREATED="1124561753254" MODIFIED="1124563712385" COLOR="#996600">
+<node TEXT="Slovenian translation" ID="Freeplane_Link_835144271" CREATED="1124561491886" MODIFIED="1124561506386" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561814721" FOLDED="true" ID="Freeplane_Link_1008886206" MODIFIED="1124561818580" TEXT="William Chen">
-<node COLOR="#999999" CREATED="1124561497308" ID="Freeplane_Link_1960552629" MODIFIED="1124561506011" TEXT="Chinese translation">
+<node TEXT="William Chen" FOLDED="true" ID="Freeplane_Link_1008886206" CREATED="1124561814721" MODIFIED="1124561818580" COLOR="#996600">
+<node TEXT="Chinese translation" ID="Freeplane_Link_1960552629" CREATED="1124561497308" MODIFIED="1124561506011" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561823877" FOLDED="true" ID="Freeplane_Link_1650138043" MODIFIED="1124561876907" TEXT="Radek Švarc">
-<node COLOR="#999999" CREATED="1124561515761" ID="Freeplane_Link_768227373" MODIFIED="1124561519885" TEXT="Czech translation">
+<node TEXT="Radek Švarc" FOLDED="true" ID="Freeplane_Link_1650138043" CREATED="1124561823877" MODIFIED="1124561876907" COLOR="#996600">
+<node TEXT="Czech translation" ID="Freeplane_Link_768227373" CREATED="1124561515761" MODIFIED="1124561519885" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562250475" FOLDED="true" ID="Freeplane_Link_901975324" MODIFIED="1124562252007" TEXT="Balázs Márton">
-<node COLOR="#999999" CREATED="1124562252585" ID="Freeplane_Link_557911120" MODIFIED="1124562258428" TEXT="Hungarian translation">
+<node TEXT="Balázs Márton" FOLDED="true" ID="Freeplane_Link_901975324" CREATED="1124562250475" MODIFIED="1124562252007" COLOR="#996600">
+<node TEXT="Hungarian translation" ID="Freeplane_Link_557911120" CREATED="1124562252585" MODIFIED="1124562258428" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562948942" FOLDED="true" ID="Freeplane_Link_290351026" MODIFIED="1124562950270" TEXT="Luis Ferreira ">
-<node COLOR="#999999" CREATED="1124562956332" ID="Freeplane_Link_6081004" MODIFIED="1124562961879" TEXT="Portuguese translation">
+<node TEXT="Luis Ferreira " FOLDED="true" ID="Freeplane_Link_290351026" CREATED="1124562948942" MODIFIED="1124562950270" COLOR="#996600">
+<node TEXT="Portuguese translation" ID="Freeplane_Link_6081004" CREATED="1124562956332" MODIFIED="1124562961879" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124563066204" ID="Freeplane_Link_23652566" MODIFIED="1208966247321" TEXT="Daftar penerjemahan ini mungkin belum lengkap. Bila ada yang terlupakan, beritahu kami. Semua orang yang kami ketahui telah menyumbangkan paling sedikit penerjemahan sebagian sudah ada dalam daftar.">
+<node TEXT="Daftar penerjemahan ini mungkin belum lengkap. Bila ada yang terlupakan, beritahu kami. Semua orang yang kami ketahui telah menyumbangkan paling sedikit penerjemahan sebagian sudah ada dalam daftar." ID="Freeplane_Link_23652566" CREATED="1124563066204" MODIFIED="1208966247321" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
</node>
-<node COLOR="#0033ff" CREATED="1124560950701" ID="ID_487339822" MODIFIED="1208967115239" POSITION="right" TEXT="Tekan Ctrl + F untuk mencari. Tekan Ctrl + G untuk mengulang pencarian terakhir. Agar pencarian dilakukan global, tekan Esc sebelum mencari."/>
-<node COLOR="#0033ff" CREATED="1124560950701" ID="ID_1540220959" MODIFIED="1208967142848" POSITION="right" TEXT="Tekan panah kanan untuk membuka lipatan node."/>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1596161299" MODIFIED="1209144350344" POSITION="right" TEXT="Pengantar">
-<node CREATED="1124560950701" ID="ID_234585361" MODIFIED="1209144426964" TEXT="Freeplane memungkinkan kita membuat apa yang disebut sebagai MindMap. Meski begitu, banyak orang menggunakannya sebagai alternatif dari buku catatan atau alat pengelola informasi pribadi."/>
-<node CREATED="1124560950701" ID="ID_660297789" MODIFIED="1209144496845" TEXT="Informasi disimpan dalam kotak teks, disebut node. Node dihubungkan satu sama lain dengan garis melengkung yang kita sebut tangkai."/>
-<node CREATED="1124560950701" ID="ID_1286515401" MODIFIED="1209144542891" TEXT="Dokumentasi ini dibuat untuk Freeplane 0.8.0. Pemetaan kunci pintasan dan lokasi fungsi menu bisa berubah dari satu versi ke versi lainnya."/>
+<node TEXT="Tekan Ctrl + F untuk mencari. Tekan Ctrl + G untuk mengulang pencarian terakhir. Agar pencarian dilakukan global, tekan Esc sebelum mencari." POSITION="right" ID="ID_487339822" CREATED="1124560950701" MODIFIED="1208967115239" COLOR="#0033ff"/>
+<node TEXT="Tekan panah kanan untuk membuka lipatan node." POSITION="right" ID="ID_1540220959" CREATED="1124560950701" MODIFIED="1208967142848" COLOR="#0033ff"/>
+<node TEXT="Pengantar" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1596161299" CREATED="1124560950701" MODIFIED="1465678903958" COLOR="#407000">
+<node TEXT="Freeplane memungkinkan kita membuat apa yang disebut sebagai MindMap. Meski begitu, banyak orang menggunakannya sebagai alternatif dari buku catatan atau alat pengelola informasi pribadi." ID="ID_234585361" CREATED="1124560950701" MODIFIED="1209144426964"/>
+<node TEXT="Informasi disimpan dalam kotak teks, disebut node. Node dihubungkan satu sama lain dengan garis melengkung yang kita sebut tangkai." ID="ID_660297789" CREATED="1124560950701" MODIFIED="1465678903990"/>
+<node TEXT="Dokumentasi ini dibuat untuk Freeplane 0.8.0. Pemetaan kunci pintasan dan lokasi fungsi menu bisa berubah dari satu versi ke versi lainnya." ID="ID_1286515401" CREATED="1124560950701" MODIFIED="1209144542891"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_706084071" MODIFIED="1209144562459" POSITION="right" TEXT="Demonstrasi beberapa fitur">
+<node TEXT="Demonstrasi beberapa fitur" FOLDED="true" POSITION="right" ID="_Freeplane_Link_706084071" CREATED="1124560950701" MODIFIED="1209144562459" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#669900" CREATED="1124560950701" ID="_Freeplane_Link_735193624" MODIFIED="1209144584160" TEXT="Tampilan">
+<node TEXT="Tampilan" ID="_Freeplane_Link_735193624" CREATED="1124560950701" MODIFIED="1209144584160" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_690312221" MODIFIED="1209144600864" TEXT="Node bisa dibuat berbagai warna">
+<node TEXT="Node bisa dibuat berbagai warna" ID="ID_690312221" CREATED="1124560950701" MODIFIED="1209144600864">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#ff0000" CREATED="1124560950701" ID="ID_1678736213" MODIFIED="1209144605871" TEXT="Merah">
+<node TEXT="Merah" ID="ID_1678736213" CREATED="1124560950701" MODIFIED="1209144605871" COLOR="#ff0000">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#009900" CREATED="1124560950701" ID="ID_767661247" MODIFIED="1209144610358" TEXT="Hijau">
+<node TEXT="Hijau" ID="ID_767661247" CREATED="1124560950701" MODIFIED="1209144610358" COLOR="#009900">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#0000cc" CREATED="1124560950701" ID="ID_1716843014" MODIFIED="1209144614043" TEXT="Biru">
+<node TEXT="Biru" ID="ID_1716843014" CREATED="1124560950701" MODIFIED="1209144614043" COLOR="#0000cc">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" ID="_" MODIFIED="1209144652959" TEXT="Node bisa punya berbagai warna latar belakang">
-<node CREATED="1124560950701" ID="_Freeplane_Link_1358611533" MODIFIED="1209144658287" TEXT="Ini"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1317973766" MODIFIED="1209144661972" TEXT="Itu"/>
+<node TEXT="Node bisa punya berbagai warna latar belakang" ID="_" CREATED="1124560950701" MODIFIED="1209144652959">
+<node TEXT="Ini" ID="_Freeplane_Link_1358611533" CREATED="1124560950701" MODIFIED="1209144658287"/>
+<node TEXT="Itu" ID="_Freeplane_Link_1317973766" CREATED="1124560950701" MODIFIED="1209144661972"/>
</node>
-<node CREATED="1124560950701" ID="ID_1132374703" MODIFIED="1209144683773" TEXT="Node bisa dibuat dalam berbagai gaya huruf">
+<node TEXT="Node bisa dibuat dalam berbagai gaya huruf" ID="ID_1132374703" CREATED="1124560950701" MODIFIED="1209144683773">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_1639593324" MODIFIED="1209144688971" TEXT="Tebal">
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Tebal" ID="ID_1639593324" CREATED="1124560950701" MODIFIED="1209144688971">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
</node>
-<node CREATED="1124560950701" ID="ID_1376999225" MODIFIED="1209144693157" TEXT="Miring">
-<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Miring" ID="ID_1376999225" CREATED="1124560950701" MODIFIED="1209144693157">
+<font NAME="Dialog" SIZE="12" ITALIC="true"/>
</node>
-<node CREATED="1124560950701" ID="ID_1864392974" MODIFIED="1209144699045" TEXT="Tebal dan miring">
-<font BOLD="true" ITALIC="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Tebal dan miring" ID="ID_1864392974" CREATED="1124560950701" MODIFIED="1209144699045">
+<font NAME="Dialog" SIZE="12" BOLD="true" ITALIC="true"/>
</node>
</node>
-<node CREATED="1124560950701" ID="ID_834524132" MODIFIED="1209144718984" TEXT="Huruf node bisa dibuat dalam berbagai ukuran">
+<node TEXT="Huruf node bisa dibuat dalam berbagai ukuran" ID="ID_834524132" CREATED="1124560950701" MODIFIED="1209144718984">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_1791375192" MODIFIED="1209144724832" TEXT="kecil">
+<node TEXT="kecil" ID="ID_1791375192" CREATED="1124560950701" MODIFIED="1209144724832">
<font NAME="SansSerif" SIZE="11"/>
</node>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="normal">
+<node TEXT="normal" ID="ID_1751565530" CREATED="1124560950701" MODIFIED="1124560950701">
<font NAME="SansSerif" SIZE="13"/>
</node>
-<node CREATED="1124560950701" ID="ID_816405856" MODIFIED="1209144731953" TEXT="besar">
+<node TEXT="besar" ID="ID_816405856" CREATED="1124560950701" MODIFIED="1209144731953">
<font NAME="SansSerif" SIZE="15"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="ID_544909735" MODIFIED="1209144737731" TEXT="besar sekali">
+<node TEXT="besar sekali" FOLDED="true" ID="ID_544909735" CREATED="1124560950701" MODIFIED="1209144737731">
<font NAME="SansSerif" SIZE="20"/>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="OOh">
+<node TEXT="OOh" ID="ID_1478631569" CREATED="1124560950701" MODIFIED="1124560950701">
<font NAME="SansSerif" SIZE="123"/>
</node>
</node>
</node>
-<node CREATED="1124560950701" ID="ID_53656715" MODIFIED="1209144772251" TEXT="Jenis font yang digunakan bisa bermacam-macam">
+<node TEXT="Jenis font yang digunakan bisa bermacam-macam" ID="ID_53656715" CREATED="1124560950701" MODIFIED="1209144772251">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_1199607468" MODIFIED="1209144776997" TEXT="Ini">
+<node TEXT="Ini" ID="ID_1199607468" CREATED="1124560950701" MODIFIED="1209144776997">
<font NAME="Times New Roman" SIZE="16"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1568731425" MODIFIED="1209144782796" TEXT="Atau itu">
+<node TEXT="Atau itu" ID="_Freeplane_Link_1568731425" CREATED="1124560950701" MODIFIED="1209144782796">
<font NAME="Verdana" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1961541891" MODIFIED="1209144791218" TEXT="Atau yang itu">
+<node TEXT="Atau yang itu" ID="ID_1961541891" CREATED="1124560950701" MODIFIED="1209144791218">
<font NAME="Dialog" SIZE="21"/>
</node>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1193071041" MODIFIED="1209144850133" TEXT="Gaya node bisa dibuat berbeda-beda">
-<node CREATED="1124560950701" ID="_Freeplane_Link_1979277285" MODIFIED="1209144855040" TEXT="Ranting">
-<node CREATED="1124560950701" ID="_Freeplane_Link_89124429" MODIFIED="1209144859226" TEXT="Ranting"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_173850525" MODIFIED="1209144863081" TEXT="Ranting"/>
+<node TEXT="Gaya node bisa dibuat berbeda-beda" ID="_Freeplane_Link_1193071041" CREATED="1124560950701" MODIFIED="1209144850133">
+<node TEXT="Ranting" ID="_Freeplane_Link_1979277285" CREATED="1124560950701" MODIFIED="1209144855040">
+<node TEXT="Ranting" ID="_Freeplane_Link_89124429" CREATED="1124560950701" MODIFIED="1209144859226"/>
+<node TEXT="Ranting" ID="_Freeplane_Link_173850525" CREATED="1124560950701" MODIFIED="1209144863081"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1001811541" MODIFIED="1209144867427" STYLE="bubble" TEXT="Balon">
-<node CREATED="1124560950701" ID="_Freeplane_Link_1677737286" MODIFIED="1209144870382" STYLE="bubble" TEXT="Balon"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_978246353" MODIFIED="1209144875880" STYLE="bubble" TEXT="Balon"/>
+<node TEXT="Balon" ID="_Freeplane_Link_1001811541" CREATED="1124560950701" MODIFIED="1209144867427" STYLE="bubble">
+<node TEXT="Balon" ID="_Freeplane_Link_1677737286" CREATED="1124560950701" MODIFIED="1209144870382" STYLE="bubble"/>
+<node TEXT="Balon" ID="_Freeplane_Link_978246353" CREATED="1124560950701" MODIFIED="1209144875880" STYLE="bubble"/>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950701" ID="ID_483073690" MODIFIED="1209144893635" TEXT="Node bisa dilipat">
+<node TEXT="Node bisa dilipat" ID="ID_483073690" CREATED="1124560950701" MODIFIED="1209144893635" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_307016912" MODIFIED="1209144900164" TEXT="Lipat">
+<node TEXT="Lipat" FOLDED="true" ID="_Freeplane_Link_307016912" CREATED="1124560950701" MODIFIED="1209144900164">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_953890024" MODIFIED="1209144904120" TEXT="Tersembunyi">
+<node TEXT="Tersembunyi" ID="ID_953890024" CREATED="1124560950701" MODIFIED="1209144904120">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1488567837" MODIFIED="1209144910239" TEXT="Pohon">
+<node TEXT="Pohon" FOLDED="true" ID="_Freeplane_Link_1488567837" CREATED="1124560950701" MODIFIED="1209144910239">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_346141495" MODIFIED="1209144968032" TEXT="Ek">
+<node TEXT="Ek" ID="ID_346141495" CREATED="1124560950701" MODIFIED="1209144968032">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1441151502" MODIFIED="1209144978707" TEXT="Waru">
+<node TEXT="Waru" ID="ID_1441151502" CREATED="1124560950701" MODIFIED="1209144978707">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_534141496" MODIFIED="1209144975323" TEXT="Cemara">
+<node TEXT="Cemara" ID="ID_534141496" CREATED="1124560950701" MODIFIED="1209144975323">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950701" ID="ID_641469382" MODIFIED="1209145007859" TEXT="Node bisa mengandung taut yang mengacu ke ...">
+<node TEXT="Node bisa mengandung taut yang mengacu ke ..." ID="ID_641469382" CREATED="1124560950701" MODIFIED="1209145007859" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006699" CREATED="1124560950701" ID="ID_339939684" MODIFIED="1209145013397" TEXT="Laman web">
+<node TEXT="Laman web" ID="ID_339939684" CREATED="1124560950701" MODIFIED="1209145013397" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" LINK="http://www.google.com/" MODIFIED="1124560950701" TEXT="http://www.google.com/">
+<node TEXT="http://www.google.com/" ID="ID_336090118" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://www.google.com/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_1493827529" LINK="www.google.com" MODIFIED="1124560950701" TEXT="www.google.com">
+<node TEXT="www.google.com" ID="ID_1493827529" CREATED="1124560950701" MODIFIED="1124560950701" LINK="www.google.com">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" ID="ID_1854484178" MODIFIED="1209145055708" TEXT="Menurut Freeplane, ini bisa dieksekusi :)">
+<node TEXT="Menurut Freeplane, ini bisa dieksekusi :)" ID="ID_1854484178" CREATED="1124560950701" MODIFIED="1209145055708" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" ID="ID_278779728" MODIFIED="1209145035199" TEXT="Map lokal">
+<node TEXT="Map lokal" ID="ID_278779728" CREATED="1124560950701" MODIFIED="1209145035199" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_1541289178" LINK="file:/C:/Program%20Files/" MODIFIED="1124560950701" TEXT="C:/Program Files/">
+<node TEXT="C:/Program Files/" ID="ID_1541289178" CREATED="1124560950701" MODIFIED="1124560950701" LINK="file:/C:/Program%20Files/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="ID_2370204" LINK="/home/" MODIFIED="1124560950701" TEXT="/home/">
+<node TEXT="/home/" ID="ID_2370204" CREATED="1124560950701" MODIFIED="1124560950701" LINK="/home/">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" ID="ID_738829620" MODIFIED="1209145122154" TEXT="Bisa dieksekusi">
+<node TEXT="Bisa dieksekusi" ID="ID_738829620" CREATED="1124560950701" MODIFIED="1209145122154" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950701" ID="ID_372784718" LINK="file:/C:/WINNT/regedit.exe" MODIFIED="1124560950701" TEXT="C:\WINNT\regedit.exe">
+<node TEXT="C:\WINNT\regedit.exe" ID="ID_372784718" CREATED="1124560950701" MODIFIED="1124560950701" LINK="file:/C:/WINNT/regedit.exe">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#006600" CREATED="1124560950701" ID="ID_785322201" MODIFIED="1209145112239" TEXT="Yang bisa dieksekusi terlihat dari ikonnya.">
+<node TEXT="Yang bisa dieksekusi terlihat dari ikonnya." ID="ID_785322201" CREATED="1124560950701" MODIFIED="1209145112239" COLOR="#006600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="ID_1493178463" MODIFIED="1209145084870" TEXT="Dokumen apapun di komputer atau jaringan lokal Anda">
+<node TEXT="Dokumen apapun di komputer atau jaringan lokal Anda" ID="ID_1493178463" CREATED="1124560950717" MODIFIED="1209145084870">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" ID="_Freeplane_Link_839677176" MODIFIED="1209145146829" TEXT="Node baris banyak">
+<node TEXT="Node baris banyak" ID="_Freeplane_Link_839677176" CREATED="1124560950717" MODIFIED="1209145146829" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1423568963" MODIFIED="1209145323754" TEXT="Node baris banyak dapat dilihat sebagai satu atau beberapa paragraf. Bila Anda hendak membangun basis pengetahuan menggunakan Freeplane, penggunaan hal ini tidak dapat dihindari. Alih-alih menggunakan berkas teks polos untuk menampung isi catatan Anda, Anda dapat menggunakan satu node pendek dengan beberapa node baris banyak sebagai anak-anaknya."/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1686184172" MODIFIED="1124560950717" TEXT=""Science is facts; just as houses are made of stones, so is science made of facts; but a pile of stones is not a house and a collection of facts is not necessarily science." --Henri Poincaré"/>
+<node TEXT="Node baris banyak dapat dilihat sebagai satu atau beberapa paragraf. Bila Anda hendak membangun basis pengetahuan menggunakan Freeplane, penggunaan hal ini tidak dapat dihindari. Alih-alih menggunakan berkas teks polos untuk menampung isi catatan Anda, Anda dapat menggunakan satu node pendek dengan beberapa node baris banyak sebagai anak-anaknya." ID="_Freeplane_Link_1423568963" CREATED="1124560950717" MODIFIED="1209145323754"/>
+<node TEXT=""Science is facts; just as houses are made of stones, so is science made of facts; but a pile of stones is not a house and a collection of facts is not necessarily science." --Henri Poincaré" ID="_Freeplane_Link_1686184172" CREATED="1124560950717" MODIFIED="1124560950717"/>
</node>
-<node COLOR="#669900" CREATED="1124560950717" ID="ID_1903544860" MODIFIED="1209145372504" TEXT="Node baris banyak pendek dengan baris baru">
-<node CREATED="1124560950717" ID="_Freeplane_Link_1957797574" MODIFIED="1209145401345" TEXT="Baris,
yang kedua,

lalu masih satu lagi,
jadi bagaimana menurut Anda?"/>
+<node TEXT="Node baris banyak pendek dengan baris baru" ID="ID_1903544860" CREATED="1124560950717" MODIFIED="1209145372504" COLOR="#669900">
+<node TEXT="Baris,
yang kedua,

lalu masih satu lagi,
jadi bagaimana menurut Anda?" ID="_Freeplane_Link_1957797574" CREATED="1124560950717" MODIFIED="1209145401345"/>
</node>
-<node COLOR="#669900" CREATED="1124560950717" ID="ID_1745174972" MODIFIED="1209145414544" TEXT="Tangkai berlabel dapat diemulasi">
-<node CREATED="1124560950717" ID="ID_605733199" MODIFIED="1209145421254" TEXT="Pohon">
+<node TEXT="Tangkai berlabel dapat diemulasi" ID="ID_1745174972" CREATED="1124560950717" MODIFIED="1209145414544" COLOR="#669900">
+<node TEXT="Pohon" ID="ID_605733199" CREATED="1124560950717" MODIFIED="1209145421254">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950717" ID="ID_731706632" MODIFIED="1209145426111" TEXT="adalah">
+<node TEXT="adalah" ID="ID_731706632" CREATED="1124560950717" MODIFIED="1209145426111" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_181561435" MODIFIED="1209145428945" TEXT="Ek">
+<node TEXT="Ek" ID="ID_181561435" CREATED="1124560950717" MODIFIED="1209145428945">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" ID="ID_897111444" MODIFIED="1209145431819" TEXT="adalah">
+<node TEXT="adalah" ID="ID_897111444" CREATED="1124560950717" MODIFIED="1209145431819" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_454264987" MODIFIED="1209145434683" TEXT="Waru">
+<node TEXT="Waru" ID="ID_454264987" CREATED="1124560950717" MODIFIED="1209145434683">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" ID="ID_1002513327" MODIFIED="1209145437397" TEXT="adalah">
+<node TEXT="adalah" ID="ID_1002513327" CREATED="1124560950717" MODIFIED="1209145437397" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_22757936" MODIFIED="1209145439951" TEXT="Cemara">
+<node TEXT="Cemara" ID="ID_22757936" CREATED="1124560950717" MODIFIED="1209145439951">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="ID_701778556" MODIFIED="1209145445198" TEXT="Pohon">
+<node TEXT="Pohon" ID="ID_701778556" CREATED="1124560950717" MODIFIED="1209145445198">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950717" ID="ID_1248255979" MODIFIED="1124560950717" TEXT="<>">
+<node TEXT="<>" ID="ID_1248255979" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_1769190795" MODIFIED="1209145448172" TEXT="Daun">
+<node TEXT="Daun" ID="ID_1769190795" CREATED="1124560950717" MODIFIED="1209145448172">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" ID="ID_1881802723" MODIFIED="1124560950717" TEXT="<>">
+<node TEXT="<>" ID="ID_1881802723" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="ID_335664905" MODIFIED="1209145450916" TEXT="Batang">
+<node TEXT="Batang" ID="ID_335664905" CREATED="1124560950717" MODIFIED="1209145450916">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" ID="ID_1556015660" MODIFIED="1209145462263" TEXT="Node bisa diberi ikon">
+<node TEXT="Node bisa diberi ikon" ID="ID_1556015660" CREATED="1124560950717" MODIFIED="1209145462263" COLOR="#669900">
<icon BUILTIN="knotify"/>
<icon BUILTIN="flag"/>
<icon BUILTIN="button_cancel"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="back"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" ID="_Freeplane_Link_318937820" MODIFIED="1209145473319" TEXT="Anda bisa pakai Awan">
-<cloud/>
-<node CREATED="1124560950717" ID="ID_963712048" MODIFIED="1209145483894" TEXT="Dengan warna pilihan">
-<cloud COLOR="#f1ede6"/>
+<node TEXT="Anda bisa pakai Awan" ID="_Freeplane_Link_318937820" CREATED="1124560950717" MODIFIED="1209145473319" COLOR="#407000">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="Dengan warna pilihan" ID="ID_963712048" CREATED="1124560950717" MODIFIED="1209145483894">
+<cloud COLOR="#f1ede6" SHAPE="ARC"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" ID="_Freeplane_Link_1750585847" MODIFIED="1209145498705" TEXT="Anda bisa pakai taut grafis">
-<node CREATED="1124560950717" ID="_Freeplane_Link_1212380407" MODIFIED="1209145504193" TEXT="Menghubungkan node">
-<arrowlink DESTINATION="_Freeplane_Link_1249400461" ENDARROW="Default" ENDINCLINATION="41;0;" ID="Arrow_ID_372445471" STARTARROW="None" STARTINCLINATION="41;0;"/>
+<node TEXT="Anda bisa pakai taut grafis" ID="_Freeplane_Link_1750585847" CREATED="1124560950717" MODIFIED="1209145498705" COLOR="#407000">
+<node TEXT="Menghubungkan node" ID="_Freeplane_Link_1212380407" CREATED="1124560950717" MODIFIED="1209145504193">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1249400461" MODIFIED="1209145509501" TEXT="Ke node lain">
-<arrowlink COLOR="#6600ff" DESTINATION="_Freeplane_Link_880551392" ENDARROW="Default" ENDINCLINATION="47;0;" ID="Freeplane_Arrow_Link_85185909" STARTARROW="None" STARTINCLINATION="47;0;"/>
+<node TEXT="Ke node lain" ID="_Freeplane_Link_1249400461" CREATED="1124560950717" MODIFIED="1209145509501">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#6600ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_880551392" MODIFIED="1209145515299" TEXT="Dengan warna berbeda">
-<arrowlink DESTINATION="_Freeplane_Link_1789233193" ENDARROW="Default" ENDINCLINATION="82;44;" ID="Freeplane_Arrow_Link_1672464612" STARTARROW="None" STARTINCLINATION="82;44;"/>
+<node TEXT="Dengan warna berbeda" ID="_Freeplane_Link_880551392" CREATED="1124560950717" MODIFIED="1209145515299">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1789233193" MODIFIED="1209145526135" TEXT="Dan rute berbeda"/>
+<node TEXT="Dan rute berbeda" ID="_Freeplane_Link_1789233193" CREATED="1124560950717" MODIFIED="1209145526135"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" ID="_Freeplane_Link_127668276" MODIFIED="1209145535778" TEXT="Node bisa diposisikan secara bebas">
-<node CREATED="1124560950717" ID="_Freeplane_Link_894936766" MODIFIED="1209145538052" TEXT="Satu"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1942481455" MODIFIED="1209145541467" TEXT="Lainnya"/>
+<node TEXT="Node bisa diposisikan secara bebas" ID="_Freeplane_Link_127668276" CREATED="1124560950717" MODIFIED="1209145535778" COLOR="#407000">
+<node TEXT="Satu" ID="_Freeplane_Link_894936766" CREATED="1124560950717" MODIFIED="1209145538052"/>
+<node TEXT="Lainnya" ID="_Freeplane_Link_1942481455" CREATED="1124560950717" MODIFIED="1209145541467"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1709752669" MODIFIED="1209145567184" POSITION="right" TEXT="Membuat dan menghapus node">
-<node CREATED="1124560950717" ID="ID_13596821" MODIFIED="1209145582576" TEXT="Untuk membuat node anak, tekan Insert."/>
-<node CREATED="1124560950717" ID="ID_311857085" MODIFIED="1209145615733" TEXT="Untuk membuat node anak selagi mengedit node lainnya, tekan Insert sambil mengedit."/>
-<node CREATED="1124560950717" ID="ID_278636018" MODIFIED="1209145637074" TEXT="Untuk membuat node adik, tekan Enter."/>
-<node CREATED="1124560950717" ID="ID_1905108426" MODIFIED="1209145650914" TEXT="Untuk membuat node kakak, tekan Shift + Enter."/>
-<node CREATED="1124560950717" ID="ID_244320564" MODIFIED="1209145667187" TEXT="Untuk menghapus node, tekan Delete"/>
-<node CREATED="1124560950717" ID="ID_1712732486" MODIFIED="1209145684793" TEXT="Untuk menghapus node dan menyimpannya untuk ditempel, tekan Control + X."/>
-<node CREATED="1124560950717" ID="ID_669932662" MODIFIED="1209145717900" TEXT="Cara lain, gunakan menu konteks node dengan mengklik-kanan node."/>
+<node TEXT="Membuat dan menghapus node" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1709752669" CREATED="1124560950717" MODIFIED="1209145567184" COLOR="#407000">
+<node TEXT="Untuk membuat node anak, tekan Insert." ID="ID_13596821" CREATED="1124560950717" MODIFIED="1209145582576"/>
+<node TEXT="Untuk membuat node anak selagi mengedit node lainnya, tekan Insert sambil mengedit." ID="ID_311857085" CREATED="1124560950717" MODIFIED="1209145615733"/>
+<node TEXT="Untuk membuat node adik, tekan Enter." ID="ID_278636018" CREATED="1124560950717" MODIFIED="1209145637074"/>
+<node TEXT="Untuk membuat node kakak, tekan Shift + Enter." ID="ID_1905108426" CREATED="1124560950717" MODIFIED="1209145650914"/>
+<node TEXT="Untuk menghapus node, tekan Delete" ID="ID_244320564" CREATED="1124560950717" MODIFIED="1209145667187"/>
+<node TEXT="Untuk menghapus node dan menyimpannya untuk ditempel, tekan Control + X." ID="ID_1712732486" CREATED="1124560950717" MODIFIED="1209145684793"/>
+<node TEXT="Cara lain, gunakan menu konteks node dengan mengklik-kanan node." ID="ID_669932662" CREATED="1124560950717" MODIFIED="1209145717900"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1700974092" MODIFIED="1209146178042" POSITION="right" TEXT="Mengedit teks node">
-<node CREATED="1124560950717" ID="_Freeplane_Link_519923426" MODIFIED="1209146228715" TEXT="Untuk mengedit node, tekan F2, Home, atau End, atau dari menu konteks node pilih Edit. Untuk menyelesaikan penyuntingan, tekan Enter.">
-<arrowlink DESTINATION="_Freeplane_Link_519923426" ENDARROW="Default" ENDINCLINATION="0;0;" ID="Freeplane_Arrow_Link_1179992477" STARTARROW="None" STARTINCLINATION="0;0;"/>
+<node TEXT="Mengedit teks node" FOLDED="true" POSITION="right" ID="Freeplane_Link_1700974092" CREATED="1124560950717" MODIFIED="1209146178042" COLOR="#407000">
+<node TEXT="Untuk mengedit node, tekan F2, Home, atau End, atau dari menu konteks node pilih Edit. Untuk menyelesaikan penyuntingan, tekan Enter." ID="_Freeplane_Link_519923426" CREATED="1124560950717" MODIFIED="1209146228715">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="ID_193947887" MODIFIED="1209146247882" TEXT="Untuk mengganti teks dalam node dengan yang baru, mulailah mengetik."/>
-<node CREATED="1124560950717" ID="ID_735369454" MODIFIED="1209146277185" TEXT="Untuk memaksakan editor node panjang saat mengedit node pendek, tekan Alt + Enter."/>
-<node CREATED="1124560950717" ID="ID_1959309673" MODIFIED="1209146378340" TEXT="Untuk memisahkan sebuah node panjang, gunakan tombol Pisahkan di atas editor node panjang, atau tekan Alt + S di editor node panjang."/>
-<node CREATED="1124560950717" ID="ID_1980075999" MODIFIED="1209146432428" TEXT="Untuk memasukkan baris baru dalam editor node panjang, tekan Control + Enter. Anda tidak dapat memasukkan baris baru di dalam editor node pendek.">
-<arrowlink DESTINATION="_Freeplane_Link_1445647544" ENDARROW="Default" ENDINCLINATION="118;0;" ID="Freeplane_Arrow_Link_1628309717" STARTARROW="None" STARTINCLINATION="118;0;"/>
+<node TEXT="Untuk mengganti teks dalam node dengan yang baru, mulailah mengetik." ID="ID_193947887" CREATED="1124560950717" MODIFIED="1209146247882"/>
+<node TEXT="Untuk memaksakan editor node panjang saat mengedit node pendek, tekan Alt + Enter." ID="ID_735369454" CREATED="1124560950717" MODIFIED="1209146277185"/>
+<node TEXT="Untuk memisahkan sebuah node panjang, gunakan tombol Pisahkan di atas editor node panjang, atau tekan Alt + S di editor node panjang." ID="ID_1959309673" CREATED="1124560950717" MODIFIED="1209146378340"/>
+<node TEXT="Untuk memasukkan baris baru dalam editor node panjang, tekan Control + Enter. Anda tidak dapat memasukkan baris baru di dalam editor node pendek." ID="ID_1980075999" CREATED="1124560950717" MODIFIED="1209146432428">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1445647544" STARTINCLINATION="118;0;" ENDINCLINATION="118;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="ID_280042855" MODIFIED="1209146502509" TEXT="Untuk menyalin pilihan ke papan klip saat mengedit node panjang, tekan tombol tetikus kanan dan pilih Salin."/>
-<node CREATED="1124560950717" ID="ID_816706434" MODIFIED="1209146564448" TEXT="Untuk memasukkan simbol khusus seperti ©, sisipkan simbol lewat editor teks favorit Anda seperti Microsoft Word, lalu tempelkan ke dalam Freeplane."/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1445647544" MODIFIED="1209146708815" TEXT="Bawaannya, Enter mengakhiri penyuntingan node panjang, dan Control + Enter menyisipkan baris baru. Dengan menghapus kotak pilihan "Enter untuk Menerapkan", Anda dapat membalik fungsi dari kunci-kunci tersebut, sehingga menjadi Enter untuk baris baru dan Control + Enter mengakhiri penyuntingan. Selanjutnya, pilihan yang Anda buat disimpan dalam setiap sesi Freeplane."/>
-<node CREATED="1124560950717" ID="ID_403957298" MODIFIED="1209146748833" STYLE="fork" TEXT="Freeplane sepenuhnya mendukung Unicode. Jadi, Anda dapat menggunakan aksara apapun pilihan Anda."/>
+<node TEXT="Untuk menyalin pilihan ke papan klip saat mengedit node panjang, tekan tombol tetikus kanan dan pilih Salin." ID="ID_280042855" CREATED="1124560950717" MODIFIED="1209146502509"/>
+<node TEXT="Untuk memasukkan simbol khusus seperti ©, sisipkan simbol lewat editor teks favorit Anda seperti Microsoft Word, lalu tempelkan ke dalam Freeplane." ID="ID_816706434" CREATED="1124560950717" MODIFIED="1209146564448"/>
+<node TEXT="Bawaannya, Enter mengakhiri penyuntingan node panjang, dan Control + Enter menyisipkan baris baru. Dengan menghapus kotak pilihan "Enter untuk Menerapkan", Anda dapat membalik fungsi dari kunci-kunci tersebut, sehingga menjadi Enter untuk baris baru dan Control + Enter mengakhiri penyuntingan. Selanjutnya, pilihan yang Anda buat disimpan dalam setiap sesi Freeplane." ID="_Freeplane_Link_1445647544" CREATED="1124560950717" MODIFIED="1209146708815"/>
+<node TEXT="Freeplane sepenuhnya mendukung Unicode. Jadi, Anda dapat menggunakan aksara apapun pilihan Anda." ID="ID_403957298" CREATED="1124560950717" MODIFIED="1209146748833" STYLE="fork"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1660149394" MODIFIED="1209146760409" POSITION="right" TEXT="Memformat node">
-<node CREATED="1124560950717" ID="ID_16709297" MODIFIED="1209146794338" TEXT="Untuk menebalkan huruf node, tekan Ctrl + B.">
+<node TEXT="Memformat node" FOLDED="true" POSITION="right" ID="Freeplane_Link_1660149394" CREATED="1124560950717" MODIFIED="1209146760409" COLOR="#407000">
+<node TEXT="Untuk menebalkan huruf node, tekan Ctrl + B." ID="ID_16709297" CREATED="1124560950717" MODIFIED="1209146794338">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_436634279" MODIFIED="1209146788710" TEXT="Untuk memiringkan huruf node, tekan Ctrl + I.">
+<node TEXT="Untuk memiringkan huruf node, tekan Ctrl + I." ID="ID_436634279" CREATED="1124560950717" MODIFIED="1209146788710">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_605709251" MODIFIED="1209146806115" TEXT="Untuk mengganti warna teks node, tekan Alt + C.">
+<node TEXT="Untuk mengganti warna teks node, tekan Alt + C." ID="ID_605709251" CREATED="1124560950717" MODIFIED="1209146806115">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1004006951" MODIFIED="1209146860563" TEXT="Untuk menggantui warna latar belakang node, dari menu konteks node pilih Format > Warna Latar Belakang."/>
-<node CREATED="1124560950717" ID="ID_1279126013" MODIFIED="1209146902223" TEXT="Untuk memperbesar huruf, tekan Control + plus (bukan plus di kunci numerik).">
+<node TEXT="Untuk menggantui warna latar belakang node, dari menu konteks node pilih Format > Warna Latar Belakang." ID="ID_1004006951" CREATED="1124560950717" MODIFIED="1209146860563"/>
+<node TEXT="Untuk memperbesar huruf, tekan Control + plus (bukan plus di kunci numerik)." ID="ID_1279126013" CREATED="1124560950717" MODIFIED="1209146902223">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_689591166" MODIFIED="1209146930163" TEXT="Untuk memperkecil huruf, tekan Control + minus (bukan minus di kunci numerik).">
+<node TEXT="Untuk memperkecil huruf, tekan Control + minus (bukan minus di kunci numerik)." ID="ID_689591166" CREATED="1124560950717" MODIFIED="1209146930163">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1883860478" MODIFIED="1209146952315" TEXT="Untuk mengganti jenis font, gunakan kotak di luntang utama."/>
-<node CREATED="1124560950717" ID="ID_934867667" MODIFIED="1209146968589" TEXT="Untuk menyalin format node, tekan Alt + C"/>
-<node CREATED="1124560950717" ID="ID_1327202234" MODIFIED="1209146982909" TEXT="Untuk menempelkan format ke node, tekan Alt + V."/>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_526328879" MODIFIED="1209174502297" POSITION="right" TEXT="Menggunakan gaya fisik">
-<node CREATED="1124560950717" ID="ID_163328245" MODIFIED="1209174573249" TEXT="Untuk menerapkan gaya fisik, dari menu konteks node pilih Gaya Fisik > Gaya Pilihan Anda. Untuk mempercepat penerapan gaya fisik, gunakan kunci pintasan seperti terlihat di menu konteks tersebut."/>
-<node CREATED="1124560950717" ID="ID_1479089058" MODIFIED="1209174917774" TEXT="Untuk menambahkan gaya fisik Anda sendiri, dengan asumsi Anda punya kemampuan teknis, edit berkas "patterns.xml" berlokasi di map ".freeplane" di home directory Anda."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1514218661" MODIFIED="1209175093417">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- [Paragraf ini sudah usang.] Berikut catatan tentang berkas patterns.xml. Gaya fisik diterapkan ke node, bila ada tanda <node>. Diterapkan ke tangkai, bila ada tanda <edge>. Tanda <node> bisa berisi tanda lain sebagai anaknya. Pelajari berkas "patterns.xml" yang disediakan dari Freeplane.
- </p>
- </body>
-</html></richcontent>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1697687428" MODIFIED="1209175158320" POSITION="right" TEXT="Menandai node dengan awan">
-<node CREATED="1124560950717" ID="ID_819249895" MODIFIED="1209175199559" TEXT="Awan sangat cocok untuk menandai area tertentu. Yang ditandai adalah node dan semua keturunannya."/>
-<node CREATED="1124560950717" ID="ID_1363990537" MODIFIED="1209175237524" TEXT="Untuk menambahkan awan, tekan Ctrl + Shift + B atau dari menu konteks node, pilih Sisip > Awan."/>
-<node CREATED="1124560950717" ID="ID_1293762493" MODIFIED="1209175322426" STYLE="fork" TEXT="Untuk mengganti warna awan, dari menu konteks node, pilih Format > Warna Awan."/>
-<node CREATED="1124560950717" ID="ID_1298148690" MODIFIED="1209175360781" TEXT="Awan bisa menggunakan berbagai warna latar seperti hijau ...">
-<cloud COLOR="#e1f2e1"/>
-<node CREATED="1124560950717" ID="ID_251339755" MODIFIED="1209175372228" TEXT="... atau coklat.">
-<cloud COLOR="#ede5d5"/>
-</node>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_203858515" MODIFIED="1209175396833" POSITION="right" TEXT="Menambahkan hipertaut">
-<node CREATED="1124560950717" ID="ID_951732434" MODIFIED="1209175545367" TEXT="Untuk menambahkan hipertaut ke node, tekan Ctrl + K atau dari menu konteks node, pilih Sisip > Hipertaut."/>
-<node CREATED="1124560950717" ID="ID_800098735" MODIFIED="1209175628276" TEXT="Untuk mencopot hipertaut, kosongkan setelan hipertaut setelah menekan Ctrl + K."/>
-<node CREATED="1124560950717" ID="ID_292357559" MODIFIED="1209175738865">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Untuk membuat taut ke alamat pos-el, gunakan format <i>mailto:don.bonton at supermail.com</i>.
- </p>
- </body>
-</html></richcontent>
-<edge WIDTH="thin"/>
-<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Untuk mengganti jenis font, gunakan kotak di luntang utama." ID="ID_1883860478" CREATED="1124560950717" MODIFIED="1209146952315"/>
+<node TEXT="Untuk menyalin format node, tekan Alt + C" ID="ID_934867667" CREATED="1124560950717" MODIFIED="1209146968589"/>
+<node TEXT="Untuk menempelkan format ke node, tekan Alt + V." ID="ID_1327202234" CREATED="1124560950717" MODIFIED="1209146982909"/>
+</node>
+<node TEXT="Menggunakan gaya fisik" FOLDED="true" POSITION="right" ID="Freeplane_Link_526328879" CREATED="1124560950717" MODIFIED="1209174502297" COLOR="#407000">
+<node TEXT="Untuk menerapkan gaya fisik, dari menu konteks node pilih Gaya Fisik > Gaya Pilihan Anda. Untuk mempercepat penerapan gaya fisik, gunakan kunci pintasan seperti terlihat di menu konteks tersebut." ID="ID_163328245" CREATED="1124560950717" MODIFIED="1209174573249"/>
+<node TEXT="Untuk menambahkan gaya fisik Anda sendiri, dengan asumsi Anda punya kemampuan teknis, edit berkas "patterns.xml" berlokasi di map ".freeplane" di home directory Anda." ID="ID_1479089058" CREATED="1124560950717" MODIFIED="1209174917774"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 [Paragraf ini sudah usang.] Berikut catatan tentang berkas patterns.xml. Gaya fisik diterapkan ke node, bila ada tanda <node>. Diterapkan ke tangkai, bila ada tanda <edge>. Tanda <node> bisa berisi tanda lain sebagai anaknya. Pelajari berkas "patterns.xml" yang disediakan dari Freeplane.
 </p>
 [...]
</node>
-<node CREATED="1124560950717" ID="ID_299108667" MODIFIED="1209175726237">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Untuk membuat taut ke alamat pos-el dengan subjek, gunakan format <i>mailto:don.bonton at supermail.com?subject=Ini judul suratnya</i>.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="Menandai node dengan awan" FOLDED="true" POSITION="right" ID="Freeplane_Link_1697687428" CREATED="1124560950717" MODIFIED="1209175158320" COLOR="#407000">
+<node TEXT="Awan sangat cocok untuk menandai area tertentu. Yang ditandai adalah node dan semua keturunannya." ID="ID_819249895" CREATED="1124560950717" MODIFIED="1209175199559"/>
+<node TEXT="Untuk menambahkan awan, tekan Ctrl + Shift + B atau dari menu konteks node, pilih Sisip > Awan." ID="ID_1363990537" CREATED="1124560950717" MODIFIED="1209175237524"/>
+<node TEXT="Untuk mengganti warna awan, dari menu konteks node, pilih Format > Warna Awan." ID="ID_1293762493" CREATED="1124560950717" MODIFIED="1209175322426" STYLE="fork"/>
+<node TEXT="Awan bisa menggunakan berbagai warna latar seperti hijau ..." ID="ID_1298148690" CREATED="1124560950717" MODIFIED="1209175360781">
+<cloud COLOR="#e1f2e1" SHAPE="ARC"/>
+<node TEXT="... atau coklat." ID="ID_251339755" CREATED="1124560950717" MODIFIED="1209175372228">
+<cloud COLOR="#ede5d5" SHAPE="ARC"/>
</node>
-<node CREATED="1124560950717" ID="ID_1536348129" MODIFIED="1209175768918" TEXT="Hipertaut dapat mengacu ke laman web, berkas lokal, local files, atau alamat pos-el."/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1044397139" MODIFIED="1209175957209" POSITION="right" TEXT="Menambahkan ikon">
+</node>
+<node TEXT="Menambahkan hipertaut" FOLDED="true" POSITION="right" ID="Freeplane_Link_203858515" CREATED="1124560950717" MODIFIED="1209175396833" COLOR="#407000">
+<node TEXT="Untuk menambahkan hipertaut ke node, tekan Ctrl + K atau dari menu konteks node, pilih Sisip > Hipertaut." ID="ID_951732434" CREATED="1124560950717" MODIFIED="1209175545367"/>
+<node TEXT="Untuk mencopot hipertaut, kosongkan setelan hipertaut setelah menekan Ctrl + K." ID="ID_800098735" CREATED="1124560950717" MODIFIED="1209175628276"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Untuk membuat taut ke alamat pos-el, gunakan format <i>mailto:don.bonton at supermail.com</i>.
 </p>
 </body>
</html>" ID="ID_292357559" CREATED="1124560950717" MODIFIED="1209175738865">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_943341306" MODIFIED="1209175971259" TEXT="Node bisa memiliki beberapa ikon."/>
-<node CREATED="1124560950717" ID="ID_412021555" MODIFIED="1209176046407" TEXT="Untuk menambahkan ikon ke node, pilih node dan klik satu dari beberapa ikon yang ditampilkan di luntang kedua. Ketika menggerakkan penunjuk tetikus ke luntang kedua, tahan Alt atau Control supaya fokus tidak lepas dari node tersebut."/>
-<node CREATED="1124560950717" ID="ID_1191551492" MODIFIED="1209176262718" TEXT="Untuk mencopot satu ikon, tekan tanda silang merah yang terletak paling atas di luntang ikon."/>
-<node CREATED="1124560950717" ID="ID_1685973688" MODIFIED="1209176295746" TEXT="Untuk mencopot semua ikon, tekan tanda tempat sampah di bagian atas luntang ikon."/>
-<node CREATED="1124560950717" ID="ID_116898291" MODIFIED="1209176327421" TEXT="Untuk menambahkan ikon baru ke node tanpa menggunakan luntang kedua, tekan Alt + I."/>
-<node CREATED="1124560950717" ID="ID_998319853" MODIFIED="1209176368470" TEXT="Tidak ada pilihan untuk menggunakan ikon Anda sendiri; Anda dapat memilih dari ikon yang disediakan oleh Freeplane saja."/>
-<node CREATED="1124560950717" ID="ID_1861765800" MODIFIED="1209225434093" TEXT="Untuk menampilkan atau menyembunyikan luntang ikon, dari menu konteks di latar belakang pilih Luntang Kedua. Luntang ikon disebut sebagai luntang kedua di sini."/>
-<node CREATED="1124560950717" ID="ID_1851690875" MODIFIED="1209225471036" STYLE="fork" TEXT="Ikon yang tersedia adalah seperti yang ditempelkan di node ini..">
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Untuk membuat taut ke alamat pos-el dengan subjek, gunakan format <i>mailto:don.bonton at supermail.com?subject=Ini judul suratnya</i>.
 </p>
 </body>
</html>" ID="ID_299108667" CREATED="1124560950717" MODIFIED="1209175726237"/>
+<node TEXT="Hipertaut dapat mengacu ke laman web, berkas lokal, local files, atau alamat pos-el." ID="ID_1536348129" CREATED="1124560950717" MODIFIED="1209175768918"/>
+</node>
+<node TEXT="Menambahkan ikon" FOLDED="true" POSITION="right" ID="Freeplane_Link_1044397139" CREATED="1124560950717" MODIFIED="1209175957209" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<edge WIDTH="thin"/>
+<node TEXT="Node bisa memiliki beberapa ikon." ID="ID_943341306" CREATED="1124560950717" MODIFIED="1209175971259"/>
+<node TEXT="Untuk menambahkan ikon ke node, pilih node dan klik satu dari beberapa ikon yang ditampilkan di luntang kedua. Ketika menggerakkan penunjuk tetikus ke luntang kedua, tahan Alt atau Control supaya fokus tidak lepas dari node tersebut." ID="ID_412021555" CREATED="1124560950717" MODIFIED="1209176046407"/>
+<node TEXT="Untuk mencopot satu ikon, tekan tanda silang merah yang terletak paling atas di luntang ikon." ID="ID_1191551492" CREATED="1124560950717" MODIFIED="1209176262718"/>
+<node TEXT="Untuk mencopot semua ikon, tekan tanda tempat sampah di bagian atas luntang ikon." ID="ID_1685973688" CREATED="1124560950717" MODIFIED="1209176295746"/>
+<node TEXT="Untuk menambahkan ikon baru ke node tanpa menggunakan luntang kedua, tekan Alt + I." ID="ID_116898291" CREATED="1124560950717" MODIFIED="1209176327421"/>
+<node TEXT="Tidak ada pilihan untuk menggunakan ikon Anda sendiri; Anda dapat memilih dari ikon yang disediakan oleh Freeplane saja." ID="ID_998319853" CREATED="1124560950717" MODIFIED="1209176368470"/>
+<node TEXT="Untuk menampilkan atau menyembunyikan luntang ikon, dari menu konteks di latar belakang pilih Luntang Kedua. Luntang ikon disebut sebagai luntang kedua di sini." ID="ID_1861765800" CREATED="1124560950717" MODIFIED="1209225434093"/>
+<node TEXT="Ikon yang tersedia adalah seperti yang ditempelkan di node ini.." ID="ID_1851690875" CREATED="1124560950717" MODIFIED="1209225471036" STYLE="fork">
<icon BUILTIN="help"/>
<icon BUILTIN="messagebox_warning"/>
<icon BUILTIN="idea"/>
@@ -609,449 +674,313 @@
<icon BUILTIN="licq"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1996597932" MODIFIED="1209225505646" POSITION="right" TEXT="Menambah taut grafis">
-<node CREATED="1124560950717" ID="ID_1153966308" MODIFIED="1209225584530" TEXT="Untuk membuat taut grafis antara dua node, seret node dan jatuhkan di atas node lainnya sambil menahan sekaligus tombol Shift dan Control; lepaskan tombol tetikus sebelum melepaskan tombol Shift dan Control.">
-<arrowlink DESTINATION="_Freeplane_Link_266716332" ENDARROW="Default" ENDINCLINATION="255;0;" ID="Freeplane_Arrow_Link_1428344028" STARTARROW="None" STARTINCLINATION="255;0;"/>
+<node TEXT="Menambah taut grafis" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1996597932" CREATED="1124560950717" MODIFIED="1209225505646" COLOR="#407000">
+<node TEXT="Untuk membuat taut grafis antara dua node, seret node dan jatuhkan di atas node lainnya sambil menahan sekaligus tombol Shift dan Control; lepaskan tombol tetikus sebelum melepaskan tombol Shift dan Control." ID="ID_1153966308" CREATED="1124560950717" MODIFIED="1209225584530">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="255;0;" ENDINCLINATION="255;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="ID_1650090059" MODIFIED="1209225611809" TEXT="Cara lain, seret dan jatuhkan menggunakan tombol tetikus kanan."/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_208378337" MODIFIED="1209225642733" TEXT="Untuk mengganti warna taut, gunakan menu konteks taut, dengan mengklik-kanan taut grafis."/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1484370636" MODIFIED="1209225695830" TEXT="Untuk mengganti panah taut, gunakan menu konteks taut."/>
-<node CREATED="1124560950717" ID="ID_1700277646" MODIFIED="1209225707637" TEXT="Untuk menghapus taut, gunakan menu konteks taut,"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_266716332" MODIFIED="1209225733974" TEXT="Untuk bernavigasi ke salah satu node ujung suatu taut, gunakan menu konteks taut."/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1015289745" MODIFIED="1209225763717" TEXT="Untuk mengganti rute sebuah taut berpanah, seret dan pindahkan taut tersebut.">
-<arrowlink DESTINATION="_Freeplane_Link_266716332" ENDARROW="Default" ENDINCLINATION="256;22;" ID="Freeplane_Arrow_Link_1273596772" STARTARROW="None" STARTINCLINATION="244;32;"/>
+<node TEXT="Cara lain, seret dan jatuhkan menggunakan tombol tetikus kanan." ID="ID_1650090059" CREATED="1124560950717" MODIFIED="1209225611809"/>
+<node TEXT="Untuk mengganti warna taut, gunakan menu konteks taut, dengan mengklik-kanan taut grafis." ID="_Freeplane_Link_208378337" CREATED="1124560950717" MODIFIED="1209225642733"/>
+<node TEXT="Untuk mengganti panah taut, gunakan menu konteks taut." ID="_Freeplane_Link_1484370636" CREATED="1124560950717" MODIFIED="1209225695830"/>
+<node TEXT="Untuk menghapus taut, gunakan menu konteks taut," ID="ID_1700277646" CREATED="1124560950717" MODIFIED="1209225707637"/>
+<node TEXT="Untuk bernavigasi ke salah satu node ujung suatu taut, gunakan menu konteks taut." ID="_Freeplane_Link_266716332" CREATED="1124560950717" MODIFIED="1209225733974"/>
+<node TEXT="Untuk mengganti rute sebuah taut berpanah, seret dan pindahkan taut tersebut." ID="_Freeplane_Link_1015289745" CREATED="1124560950717" MODIFIED="1209225763717">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="244;32;" ENDINCLINATION="256;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="ID_1921255250" MODIFIED="1209225773561" TEXT="Berikut contoh tautan grafis."/>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_1451667289" MODIFIED="1209225777237" TEXT="Contoh">
-<node COLOR="#996600" CREATED="1124560950717" ID="_Freeplane_Link_1170112929" MODIFIED="1209225782684" TEXT="Taut ke bagian lain">
-<arrowlink COLOR="#9999ff" DESTINATION="_Freeplane_Link_1492563156" ENDARROW="Default" ENDINCLINATION="117;0;" ID="Freeplane_Arrow_Link_33407992" STARTARROW="Default" STARTINCLINATION="30;0;"/>
+<node TEXT="Berikut contoh tautan grafis." ID="ID_1921255250" CREATED="1124560950717" MODIFIED="1209225773561"/>
+<node TEXT="Contoh" FOLDED="true" ID="ID_1451667289" CREATED="1124560950717" MODIFIED="1209225777237" COLOR="#996600">
+<node TEXT="Taut ke bagian lain" ID="_Freeplane_Link_1170112929" CREATED="1124560950717" MODIFIED="1209225782684" COLOR="#996600">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#9999ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1492563156" STARTINCLINATION="30;0;" ENDINCLINATION="117;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="ID_466382348" MODIFIED="1209225792469" TEXT="Node dengan anak terlipat">
-<node CREATED="1124560950717" ID="_Freeplane_Link_1492563156" MODIFIED="1209225807130" TEXT="Node anak"/>
+<node TEXT="Node dengan anak terlipat" FOLDED="true" ID="ID_466382348" CREATED="1124560950717" MODIFIED="1209225792469" COLOR="#996600">
+<node TEXT="Node anak" ID="_Freeplane_Link_1492563156" CREATED="1124560950717" MODIFIED="1209225807130"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" ID="_Freeplane_Link_1370577235" MODIFIED="1209225796815" TEXT="Taut lainnya">
-<arrowlink DESTINATION="_Freeplane_Link_1170112929" ENDARROW="Default" ENDINCLINATION="61;0;" ID="Freeplane_Arrow_Link_1872050149" STARTARROW="None" STARTINCLINATION="61;0;"/>
+<node TEXT="Taut lainnya" ID="_Freeplane_Link_1370577235" CREATED="1124560950717" MODIFIED="1209225796815" COLOR="#996600">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1170112929" STARTINCLINATION="61;0;" ENDINCLINATION="61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_423038022" MODIFIED="1209225822962" POSITION="right" TEXT="Mencari">
+<node TEXT="Mencari" FOLDED="true" POSITION="right" ID="Freeplane_Link_423038022" CREATED="1124560950717" MODIFIED="1209225822962" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1853186827" MODIFIED="1209226056919" STYLE="fork" TEXT="Untuk mencari teks dalam suatu node dan semua node keturunannya, tekan Ctrl + F atau dari menu, pilih Edit > Temukan.">
+<node TEXT="Untuk mencari teks dalam suatu node dan semua node keturunannya, tekan Ctrl + F atau dari menu, pilih Edit > Temukan." ID="ID_1853186827" CREATED="1124560950717" MODIFIED="1209226056919" STYLE="fork">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1654127314" MODIFIED="1209226038713" TEXT="Untuk menemukan kecocokan berikutnya dari pencarian sebelumnya, tekan Ctrl + G atau dari menu, pilih Edit > Temukan Berikutnya.">
+<node TEXT="Untuk menemukan kecocokan berikutnya dari pencarian sebelumnya, tekan Ctrl + G atau dari menu, pilih Edit > Temukan Berikutnya." ID="ID_1654127314" CREATED="1124560950717" MODIFIED="1209226038713">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1278869580" MODIFIED="1209226104828" TEXT="Untuk mencari di seluruh peta, posisikan ke node tengah dengan menekan Escape sebelum mencari."/>
-<node CREATED="1124560950717" ID="ID_642414422" MODIFIED="1209226593901" TEXT="Pencarian dilakukan melebar lebih dahulu, baru ke dalam. Ini sesuai dengan pemikiran bahwa makin dalam sebuah node, makin banyak detail yang disampaikan dalam node."/>
-<node CREATED="1124560950717" ID="ID_876514246" MODIFIED="1209226615812" TEXT="Ingat bahwa tidak seluruh peta dicari, hanya node dan keturunannya saja."/>
+<node TEXT="Untuk mencari di seluruh peta, posisikan ke node tengah dengan menekan Escape sebelum mencari." ID="ID_1278869580" CREATED="1124560950717" MODIFIED="1209226104828"/>
+<node TEXT="Pencarian dilakukan melebar lebih dahulu, baru ke dalam. Ini sesuai dengan pemikiran bahwa makin dalam sebuah node, makin banyak detail yang disampaikan dalam node." ID="ID_642414422" CREATED="1124560950717" MODIFIED="1209226593901"/>
+<node TEXT="Ingat bahwa tidak seluruh peta dicari, hanya node dan keturunannya saja." ID="ID_876514246" CREATED="1124560950717" MODIFIED="1209226615812"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_653540280" MODIFIED="1209226631074" POSITION="right" TEXT="Memilih banyak node">
+<node TEXT="Memilih banyak node" FOLDED="true" POSITION="right" ID="Freeplane_Link_653540280" CREATED="1124560950717" MODIFIED="1209226631074" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_296855940" MODIFIED="1209226650853" TEXT="Untuk memilih banyak node, tahan Shift atau Control sambil mengklik. ">
+<node TEXT="Untuk memilih banyak node, tahan Shift atau Control sambil mengklik. " ID="ID_296855940" CREATED="1124560950717" MODIFIED="1209226650853">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_35755182" MODIFIED="1209226704931" TEXT="Untuk menambah satu node ke dalam pilihan banyak node, tahan Control ketika mengklik.">
+<node TEXT="Untuk menambah satu node ke dalam pilihan banyak node, tahan Control ketika mengklik." ID="ID_35755182" CREATED="1124560950717" MODIFIED="1209226704931">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1770763567" MODIFIED="1209227478723" STYLE="fork" TEXT="Untuk memilih serentetan node berturutan, tahan Shift ketika mengklik, atau tahan Shift sambil berpindah-pindah menggunakan tombol panah.">
+<node TEXT="Untuk memilih serentetan node berturutan, tahan Shift ketika mengklik, atau tahan Shift sambil berpindah-pindah menggunakan tombol panah." ID="ID_1770763567" CREATED="1124560950717" MODIFIED="1209227478723" STYLE="fork">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_88845581" MODIFIED="1209273334978" TEXT="Untuk memilih satu anak dan semua keturunannya, tahan Alt sambil mengklik, atau tahan Shift sambil berpindah dari suatu node ke induknya."/>
-<node CREATED="1124560950717" ID="ID_922127420" MODIFIED="1209273362337" TEXT="Untuk membatalkan pilihan banyak node, klik pada latar belakang peta atau pada node yang tidak terpilih."/>
-<node CREATED="1124560950717" ID="ID_1592480083" MODIFIED="1209273421031" TEXT="Untuk memilih semua node yang terlihat, dari menu gunakan Edit > Pilih Semua yang Terlihat."/>
-<node CREATED="1124560950717" ID="ID_1593012221" MODIFIED="1209273506554" TEXT="Untuk memilih semua node yang terlihat dari suatu cabang, dari menu gunakan Edit > Pilih Cabang yang Terlihat."/>
+<node TEXT="Untuk memilih satu anak dan semua keturunannya, tahan Alt sambil mengklik, atau tahan Shift sambil berpindah dari suatu node ke induknya." ID="ID_88845581" CREATED="1124560950717" MODIFIED="1209273334978"/>
+<node TEXT="Untuk membatalkan pilihan banyak node, klik pada latar belakang peta atau pada node yang tidak terpilih." ID="ID_922127420" CREATED="1124560950717" MODIFIED="1209273362337"/>
+<node TEXT="Untuk memilih semua node yang terlihat, dari menu gunakan Edit > Pilih Semua yang Terlihat." ID="ID_1592480083" CREATED="1124560950717" MODIFIED="1209273421031"/>
+<node TEXT="Untuk memilih semua node yang terlihat dari suatu cabang, dari menu gunakan Edit > Pilih Cabang yang Terlihat." ID="ID_1593012221" CREATED="1124560950717" MODIFIED="1209273506554"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1024903226" MODIFIED="1209273548565" POSITION="right" TEXT="Seret dan jatuhkan">
-<edge WIDTH="thin"/>
+<node TEXT="Seret dan jatuhkan" FOLDED="true" POSITION="right" ID="Freeplane_Link_1024903226" CREATED="1124560950717" MODIFIED="1209273548565" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1178943684" MODIFIED="1209273566891" TEXT="Anda dapat memindah-mindahkan node dengan menyeret dan menjatuhkannya.">
+<edge WIDTH="thin"/>
+<node TEXT="Anda dapat memindah-mindahkan node dengan menyeret dan menjatuhkannya." ID="ID_1178943684" CREATED="1124560950717" MODIFIED="1209273566891">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_215653657" MODIFIED="1209273607279" TEXT="Untuk menjatuhkan node sebagai anak, posisikan penunjuk di bagian luar node tujuan ketika menjatuhkan.">
+<node TEXT="Untuk menjatuhkan node sebagai anak, posisikan penunjuk di bagian luar node tujuan ketika menjatuhkan." ID="ID_215653657" CREATED="1124560950717" MODIFIED="1209273607279">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_343240384" MODIFIED="1209273638865" TEXT="Untuk menjatuhkan node sebagai saudara, posisikan penunjuk di bagian atas node tujuan ketika menjatuhkan.">
+<node TEXT="Untuk menjatuhkan node sebagai saudara, posisikan penunjuk di bagian atas node tujuan ketika menjatuhkan." ID="ID_343240384" CREATED="1124560950717" MODIFIED="1209273638865">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1994214827" MODIFIED="1209273677360" TEXT="Untuk menyalin node alih-alih memindahkan, tahan Control saat menyeret, atau seret memakai tombol tetikus tengah.">
+<node TEXT="Untuk menyalin node alih-alih memindahkan, tahan Control saat menyeret, atau seret memakai tombol tetikus tengah." ID="_Freeplane_Link_1994214827" CREATED="1124560950717" MODIFIED="1209273677360">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_942351938" MODIFIED="1209273829298" TEXT="Untuk mengedit peta yang sudah ada, seret berkasnya dan jatuhkan di latar belakang Freeplane. Hal ini bekerja minimal di sistem operasi Microsoft Windows."/>
-<node CREATED="1124560950717" ID="ID_1876033674" MODIFIED="1209273855256" TEXT="Untuk membuat taut grafis, seret dan jatuhkan node menggunakan tombol tetikus kanan."/>
-<node CREATED="1124560950717" ID="ID_1278420396" MODIFIED="1209273877077" TEXT="Bila Anda memilih banyak node, maka semuanya akan dipindahkan atau disalin.">
+<node TEXT="Untuk mengedit peta yang sudah ada, seret berkasnya dan jatuhkan di latar belakang Freeplane. Hal ini bekerja minimal di sistem operasi Microsoft Windows." ID="ID_942351938" CREATED="1124560950717" MODIFIED="1209273829298"/>
+<node TEXT="Untuk membuat taut grafis, seret dan jatuhkan node menggunakan tombol tetikus kanan." ID="ID_1876033674" CREATED="1124560950717" MODIFIED="1209273855256"/>
+<node TEXT="Bila Anda memilih banyak node, maka semuanya akan dipindahkan atau disalin." ID="ID_1278420396" CREATED="1124560950717" MODIFIED="1209273877077">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_965930833" MODIFIED="1209273918076" TEXT="Anda dapat menjatuhkan data dari aplikasi eksternal, seperti berkas dalam sistem operasi Microsoft Windows, atau teks terpilih dari Microsoft Internet Explorer."/>
+<node TEXT="Anda dapat menjatuhkan data dari aplikasi eksternal, seperti berkas dalam sistem operasi Microsoft Windows, atau teks terpilih dari Microsoft Internet Explorer." ID="ID_965930833" CREATED="1124560950717" MODIFIED="1209273918076"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_958781924" MODIFIED="1209274000895" POSITION="right" TEXT="Menyalin dan menempel">
+<node TEXT="Menyalin dan menempel" FOLDED="true" POSITION="right" ID="Freeplane_Link_958781924" CREATED="1124560950717" MODIFIED="1209274000895" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_1561854528" MODIFIED="1209274053671" TEXT="Anda dapat menyalin dan menempel (banyak) node antar MindMap seperti biasa. Selain itu, Anda dapat menempelkan teks biasa atau HTML dari aplikasi lain.">
+<node TEXT="Anda dapat menyalin dan menempel (banyak) node antar MindMap seperti biasa. Selain itu, Anda dapat menempelkan teks biasa atau HTML dari aplikasi lain." ID="ID_1561854528" CREATED="1124560950717" MODIFIED="1209274053671">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_65809205" MODIFIED="1209274132074" TEXT="Bila menempelkan teks polos, banyak baris akan ditempelkan sebagai banyak node, dan posisi kedalamannya ditentukan oleh banyaknya spasi di awal teks. Berikut contohnya."/>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_1627092027" MODIFIED="1209274187534" TEXT="Pohon
 Ek
 Cemara">
-<node CREATED="1124560950717" ID="ID_55526373" MODIFIED="1209274156138" TEXT="ditempelkan sebagai">
+<node TEXT="Bila menempelkan teks polos, banyak baris akan ditempelkan sebagai banyak node, dan posisi kedalamannya ditentukan oleh banyaknya spasi di awal teks. Berikut contohnya." ID="ID_65809205" CREATED="1124560950717" MODIFIED="1209274132074"/>
+<node TEXT="Pohon
 Ek
 Cemara" ID="ID_1627092027" CREATED="1124560950717" MODIFIED="1209274187534" COLOR="#996600">
+<node TEXT="ditempelkan sebagai" ID="ID_55526373" CREATED="1124560950717" MODIFIED="1209274156138">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_787112439" MODIFIED="1209274159944" TEXT="Pohon">
+<node TEXT="Pohon" ID="ID_787112439" CREATED="1124560950717" MODIFIED="1209274159944" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_1397202134" MODIFIED="1209274162718" TEXT="Ek">
+<node TEXT="Ek" ID="ID_1397202134" CREATED="1124560950717" MODIFIED="1209274162718" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_475104996" MODIFIED="1209274165892" TEXT="Cemara">
+<node TEXT="Cemara" ID="ID_475104996" CREATED="1124560950717" MODIFIED="1209274165892" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="ID_838592934" MODIFIED="1209274297221" TEXT="Teks HTML akan ditempelkan sebagai teks polos. Di samping itu, tautan yang tercantum dalam HTML akan ditempelkan sebagai anak dari sebuat node tambahan dengan nama "Links". Berikut contohnya."/>
-<node CREATED="1124560950717" ID="ID_498865809" MODIFIED="1209274303911" TEXT="Contoh hasil penempelan">
+<node TEXT="Teks HTML akan ditempelkan sebagai teks polos. Di samping itu, tautan yang tercantum dalam HTML akan ditempelkan sebagai anak dari sebuat node tambahan dengan nama "Links". Berikut contohnya." ID="ID_838592934" CREATED="1124560950717" MODIFIED="1209274297221"/>
+<node TEXT="Contoh hasil penempelan" ID="ID_498865809" CREATED="1124560950717" MODIFIED="1209274303911">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_785656568" MODIFIED="1209274321686" STYLE="fork" TEXT="Belanja (120236)">
+<node TEXT="Belanja (120236)" ID="ID_785656568" CREATED="1124560950717" MODIFIED="1209274321686" STYLE="fork">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_785399167" MODIFIED="1209274335066" TEXT="Gaya Hidup (19)">
+<node TEXT="Gaya Hidup (19)" ID="ID_785399167" CREATED="1124560950717" MODIFIED="1209274335066">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1914167530" MODIFIED="1124560950717" TEXT="Links">
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_647961468" LINK="http://directory.google.com/Top/Shopping/" MODIFIED="1209274342707" TEXT="Belanja">
+<node TEXT="Links" ID="ID_1914167530" CREATED="1124560950717" MODIFIED="1124560950717">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+<node TEXT="Belanja" ID="ID_647961468" CREATED="1124560950717" MODIFIED="1209274342707" LINK="http://directory.google.com/Top/Shopping/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="ID_1021552074" LINK="http://directory.google.com/Top/Home/Urban_Living/" MODIFIED="1209274348295" TEXT="Gaya Hidup">
+<node TEXT="Gaya Hidup" ID="ID_1021552074" CREATED="1124560950717" MODIFIED="1209274348295" LINK="http://directory.google.com/Top/Home/Urban_Living/">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="ID_1204515717" MODIFIED="1209274426878" TEXT="Bila Anda menempelkan senarai berkas dari Explorer di Microsoft Windows, taut ke berkas-berkas tersebut akan ditempelkan."/>
-<node CREATED="1124560950717" ID="ID_673825377" MODIFIED="1209275981453" STYLE="fork" TEXT="Bila Anda menyalin suatu cabang dan menempelkannya ke dalam editor teks polos, struktur pohon akan ditunjukkan dengan indentasi. Hipertaut ditempelkan dalam tanda kurung < >. Berikut contohnya."/>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_1447539819" MODIFIED="1209275989294" TEXT="Pohon">
+<node TEXT="Bila Anda menempelkan senarai berkas dari Explorer di Microsoft Windows, taut ke berkas-berkas tersebut akan ditempelkan." ID="ID_1204515717" CREATED="1124560950717" MODIFIED="1209274426878"/>
+<node TEXT="Bila Anda menyalin suatu cabang dan menempelkannya ke dalam editor teks polos, struktur pohon akan ditunjukkan dengan indentasi. Hipertaut ditempelkan dalam tanda kurung < >. Berikut contohnya." ID="ID_673825377" CREATED="1124560950717" MODIFIED="1209275981453" STYLE="fork"/>
+<node TEXT="Pohon" ID="ID_1447539819" CREATED="1124560950717" MODIFIED="1209275989294" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_1516542995" MODIFIED="1209275992168" TEXT="Ek">
+<node TEXT="Ek" ID="ID_1516542995" CREATED="1124560950717" MODIFIED="1209275992168" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" ID="ID_133833504" MODIFIED="1209275995003" TEXT="Cemara">
+<node TEXT="Cemara" ID="ID_133833504" CREATED="1124560950717" MODIFIED="1209275995003" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950717" ID="ID_268647755" MODIFIED="1209276004807" TEXT="ditempelkan sebagai">
+<node TEXT="ditempelkan sebagai" ID="ID_268647755" CREATED="1124560950717" MODIFIED="1209276004807">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950732" ID="ID_1462977187" MODIFIED="1209276023614" STYLE="fork" TEXT="Pohon
 Ek
 Cemara
 Google <http://www.google.com/>
">
+<node TEXT="Pohon
 Ek
 Cemara
 Google <http://www.google.com/>
" ID="ID_1462977187" CREATED="1124560950732" MODIFIED="1209276023614" COLOR="#996600" STYLE="fork">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950732" ID="ID_1281956134" LINK="http://www.google.com/" MODIFIED="1124560950732" TEXT="Google">
+<node TEXT="Google" ID="ID_1281956134" CREATED="1124560950732" MODIFIED="1124560950732" LINK="http://www.google.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950732" ID="ID_1354652421" MODIFIED="1209276139520" STYLE="fork" TEXT="Bila dari Freeplane Anda menyalin suatu cabang dan menempelkannya ke dalam editor yang mendukung format teks kaya (rich text format - RTF), pemformatan seperti warna dan font ikut ditempelkan juga. Hipertaut ditempelkan dalam tanda kurung < >, seperti pada teks polos. Editor yang mendukung teks kaya termasuk Microsoft Word, Wordpad atau Microsoft Outlook, atau beberapa editor catatan di Linux."/>
-<node CREATED="1124560950732" ID="ID_866129685" MODIFIED="1209276823784" TEXT="Untuk menyalin node tanpa keturunannya, tekan Ctrl + Shift + C atau dari menu konteks node, pilih Salin Tunggal."/>
+<node TEXT="Bila dari Freeplane Anda menyalin suatu cabang dan menempelkannya ke dalam editor yang mendukung format teks kaya (rich text format - RTF), pemformatan seperti warna dan font ikut ditempelkan juga. Hipertaut ditempelkan dalam tanda kurung < >, seperti pada teks polos. Editor yang mendukung teks kaya termasuk Microsoft Word, Wordpad atau Microsoft Outlook, atau beberapa editor catatan di Linux." ID="ID_1354652421" CREATED="1124560950732" MODIFIED="1209276139520" STYLE="fork"/>
+<node TEXT="Untuk menyalin node tanpa keturunannya, tekan Ctrl + Shift + C atau dari menu konteks node, pilih Salin Tunggal." ID="ID_866129685" CREATED="1124560950732" MODIFIED="1209276823784"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="_Freeplane_Link_1540212684" MODIFIED="1209276831606" POSITION="right" TEXT="Berpindah-pindah">
-<node CREATED="1124560950732" ID="ID_553732792" MODIFIED="1209276874027" TEXT="Untuk menggerakan penunjuk ke atas, bawah, kri atau kanan, gunakan tombol panah."/>
-<node CREATED="1124560950732" ID="ID_1130754383" MODIFIED="1209277294121" TEXT="Untuk berpindah ke puncak cabang suatu pohon, tekan PageUp."/>
-<node CREATED="1124560950732" ID="ID_1966957004" MODIFIED="1209277312187" TEXT="Untuk berpindah ke ujung bawah suatu pohon, tekan PageDown."/>
-<node CREATED="1124560950732" ID="ID_1257350203" MODIFIED="1209277327238" TEXT="Untuk berpindah ke node akar, tekan Escape."/>
-<node CREATED="1124560950732" ID="_Freeplane_Link_97763226" MODIFIED="1209277557089" TEXT="Untuk memposisikan node secara bebas, seret pegangan yang tidak terlihat di sisi node ke arah node akar, dan pindahkan."/>
+<node TEXT="Berpindah-pindah" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1540212684" CREATED="1124560950732" MODIFIED="1209276831606" COLOR="#407000">
+<node TEXT="Untuk menggerakan penunjuk ke atas, bawah, kri atau kanan, gunakan tombol panah." ID="ID_553732792" CREATED="1124560950732" MODIFIED="1209276874027"/>
+<node TEXT="Untuk berpindah ke puncak cabang suatu pohon, tekan PageUp." ID="ID_1130754383" CREATED="1124560950732" MODIFIED="1209277294121"/>
+<node TEXT="Untuk berpindah ke ujung bawah suatu pohon, tekan PageDown." ID="ID_1966957004" CREATED="1124560950732" MODIFIED="1209277312187"/>
+<node TEXT="Untuk berpindah ke node akar, tekan Escape." ID="ID_1257350203" CREATED="1124560950732" MODIFIED="1209277327238"/>
+<node TEXT="Untuk memposisikan node secara bebas, seret pegangan yang tidak terlihat di sisi node ke arah node akar, dan pindahkan." ID="_Freeplane_Link_97763226" CREATED="1124560950732" MODIFIED="1209277557089"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_4727471" MODIFIED="1209277604066" POSITION="right" TEXT="Membuka-tutup lipatan">
-<node CREATED="1124560950732" ID="ID_1044015528" MODIFIED="1209277633639" TEXT="Untuk melipat node, tekan Space, atau dari menu konteks node, pilih Buka/Tutup Lipatan."/>
-<node CREATED="1124560950732" ID="ID_1520325492" MODIFIED="1209277684542" TEXT="Untuk membuka lipatan, tekan Space, atau dari menu konteks node, pilih Buka/Tutup Lipatan, atau tekan tombol panah ke arah pembukaan lipatan."/>
-<node CREATED="1124560950732" ID="ID_871275537" MODIFIED="1209277858893" TEXT="Untuk membuka-tutup lipatan secara bertingkat, tahan Alt sambil menggunakan roda tetikus, atau tekan Alt + PageUp atau Alt + PageDown. Pada peta ukuran besar, gunakan fungsi ini dengan hati-hati, karena dapat menyebabkan masalah memori."/>
-<node CREATED="1124560950732" ID="ID_245769138" MODIFIED="1209277930345" TEXT="Untuk membuka semua lipatan, gunakan tombol tanda plus abu-abu di luntang utama, atau dari menu pilih Navigasi > Buka Semua."/>
-<node CREATED="1124560950732" ID="ID_91039853" MODIFIED="1209277985695" TEXT="Untuk melipat semua, tekan tombol tanda minus abu-abu di luntang utama, atau dari menu pilih Navigasi > Lipat Semua."/>
-<node CREATED="1124560950732" ID="ID_162455080" MODIFIED="1209278021336" TEXT="Node terlipat ditandai dengan lingkaran kecil yang menempel ke arah luar."/>
+<node TEXT="Membuka-tutup lipatan" FOLDED="true" POSITION="right" ID="Freeplane_Link_4727471" CREATED="1124560950732" MODIFIED="1209277604066" COLOR="#407000">
+<node TEXT="Untuk melipat node, tekan Space, atau dari menu konteks node, pilih Buka/Tutup Lipatan." ID="ID_1044015528" CREATED="1124560950732" MODIFIED="1209277633639"/>
+<node TEXT="Untuk membuka lipatan, tekan Space, atau dari menu konteks node, pilih Buka/Tutup Lipatan, atau tekan tombol panah ke arah pembukaan lipatan." ID="ID_1520325492" CREATED="1124560950732" MODIFIED="1209277684542"/>
+<node TEXT="Untuk membuka-tutup lipatan secara bertingkat, tahan Alt sambil menggunakan roda tetikus, atau tekan Alt + PageUp atau Alt + PageDown. Pada peta ukuran besar, gunakan fungsi ini dengan hati-hati, karena dapat menyebabkan masalah memori." ID="ID_871275537" CREATED="1124560950732" MODIFIED="1209277858893"/>
+<node TEXT="Untuk membuka semua lipatan, gunakan tombol tanda plus abu-abu di luntang utama, atau dari menu pilih Navigasi > Buka Semua." ID="ID_245769138" CREATED="1124560950732" MODIFIED="1209277930345"/>
+<node TEXT="Untuk melipat semua, tekan tombol tanda minus abu-abu di luntang utama, atau dari menu pilih Navigasi > Lipat Semua." ID="ID_91039853" CREATED="1124560950732" MODIFIED="1209277985695"/>
+<node TEXT="Node terlipat ditandai dengan lingkaran kecil yang menempel ke arah luar." ID="ID_162455080" CREATED="1124560950732" MODIFIED="1209278021336"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_516331171" MODIFIED="1209278047444" POSITION="right" TEXT="Berpindah ke peta lain">
+<node TEXT="Berpindah ke peta lain" FOLDED="true" POSITION="right" ID="Freeplane_Link_516331171" CREATED="1124560950732" MODIFIED="1209278047444" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_396490844" MODIFIED="1209278081583" TEXT="Untuk berpindah ke peta lain yang sudah dibuka, klik kanan di latar belakang dan pilih peta lain tersebut dari menu konteks.">
+<node TEXT="Untuk berpindah ke peta lain yang sudah dibuka, klik kanan di latar belakang dan pilih peta lain tersebut dari menu konteks." ID="ID_396490844" CREATED="1124560950732" MODIFIED="1209278081583">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_467411537" MODIFIED="1209278088763" POSITION="right" TEXT="Menggulung peta">
+<node TEXT="Menggulung peta" FOLDED="true" POSITION="right" ID="Freeplane_Link_467411537" CREATED="1124560950732" MODIFIED="1209278088763" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_517576721" MODIFIED="1209278135130" TEXT="Untuk menggulung peta, seret latar belakang dan pindah-pindahkan, atau gunakan roda tetikus. Untuk menggulung secara mendatar dengan roda tetikus, tahan Shift atau salah satu tombol tetikus.">
+<node TEXT="Untuk menggulung peta, seret latar belakang dan pindah-pindahkan, atau gunakan roda tetikus. Untuk menggulung secara mendatar dengan roda tetikus, tahan Shift atau salah satu tombol tetikus." ID="ID_517576721" CREATED="1124560950732" MODIFIED="1209278135130">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913137192" MODIFIED="1209278154197" POSITION="right" TEXT="Melakukan zum">
-<node CREATED="1124560950732" ID="ID_1845799508" MODIFIED="1209278210508" TEXT="Untuk zum, gunakan roda tetikus sambil menahan tombol Control, atau tekan tombol Alt + Up atau Down. Cara lain, gunakan kolom zum di luntang utama."/>
+<node TEXT="Melakukan zum" FOLDED="true" POSITION="right" ID="Freeplane_Link_913137192" CREATED="1124560950732" MODIFIED="1209278154197" COLOR="#407000">
+<node TEXT="Untuk zum, gunakan roda tetikus sambil menahan tombol Control, atau tekan tombol Alt + Up atau Down. Cara lain, gunakan kolom zum di luntang utama." ID="ID_1845799508" CREATED="1124560950732" MODIFIED="1209278210508"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1318678369" MODIFIED="1209278220012" POSITION="right" TEXT="Urungkan">
-<node CREATED="1124560950732" ID="ID_447059498" MODIFIED="1209278246220" TEXT="Untuk mengurungkan, tekan Control + Z, atau dari menu, pilih Edit > Urungkan."/>
-<node CREATED="1124560950732" ID="ID_496703552" MODIFIED="1209278269393" TEXT="Untuk mengulang, tekan Control + Y, atau dari menu, pilih Edit > Ulangi."/>
-<node CREATED="1124560950732" ID="ID_983204383" MODIFIED="1209278313516" TEXT="Untuk menyetel jumlah langkah yang dicatat untuk bisa diurungkan, dari menu pilih Alat > Preferensi."/>
+<node TEXT="Urungkan" FOLDED="true" POSITION="right" ID="Freeplane_Link_1318678369" CREATED="1124560950732" MODIFIED="1209278220012" COLOR="#407000">
+<node TEXT="Untuk mengurungkan, tekan Control + Z, atau dari menu, pilih Edit > Urungkan." ID="ID_447059498" CREATED="1124560950732" MODIFIED="1209278246220"/>
+<node TEXT="Untuk mengulang, tekan Control + Y, atau dari menu, pilih Edit > Ulangi." ID="ID_496703552" CREATED="1124560950732" MODIFIED="1209278269393"/>
+<node TEXT="Untuk menyetel jumlah langkah yang dicatat untuk bisa diurungkan, dari menu pilih Alat > Preferensi." ID="ID_983204383" CREATED="1124560950732" MODIFIED="1209278313516"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_22510332" MODIFIED="1209278324883" POSITION="right" TEXT="Ekspor ke HTML">
+<node TEXT="Ekspor ke HTML" FOLDED="true" POSITION="right" ID="Freeplane_Link_22510332" CREATED="1124560950732" MODIFIED="1209278324883" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_979412403" MODIFIED="1209283147141" TEXT="Untuk mengekspor cabang ke HTML, tekan Control + H. Halaman hasil ekspor HTML dapat mendukung pelipatan, tergantung dari setelan preferensi."/>
-<node CREATED="1124560950732" ID="ID_655995359" MODIFIED="1209283183713" TEXT="Fungsi ekspor yang lain bisa diaktifkan dari menu, pilih Ekspor > Sebagai XHTML (versi Javascript)."/>
-<node CREATED="1124560950732" ID="ID_1772530062" MODIFIED="1209283265471" TEXT="Untuk mengekspor peta dengan gambar pratinjau dalam format HTML, dari menu pilih Ekspor > Sebagai XHTML (versi gambar peta yang dapat diklik)."/>
+<node TEXT="Untuk mengekspor cabang ke HTML, tekan Control + H. Halaman hasil ekspor HTML dapat mendukung pelipatan, tergantung dari setelan preferensi." ID="ID_979412403" CREATED="1124560950732" MODIFIED="1209283147141"/>
+<node TEXT="Fungsi ekspor yang lain bisa diaktifkan dari menu, pilih Ekspor > Sebagai XHTML (versi Javascript)." ID="ID_655995359" CREATED="1124560950732" MODIFIED="1209283183713"/>
+<node TEXT="Untuk mengekspor peta dengan gambar pratinjau dalam format HTML, dari menu pilih Ekspor > Sebagai XHTML (versi gambar peta yang dapat diklik)." ID="ID_1772530062" CREATED="1124560950732" MODIFIED="1209283265471"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1908686168" MODIFIED="1209283287583" POSITION="right" TEXT="Ekspor ke gambar bitmap atau vektor">
-<node CREATED="1124560950732" ID="ID_1425718492" MODIFIED="1209283319959" TEXT="Untuk mengekspor peta sebaga citra PNG, dari menu pilih Berkas > Ekspor > Sebagai PNG."/>
-<node CREATED="1124560950732" ID="ID_1060323115" MODIFIED="1209283347339" TEXT="Untuk mengekspor peta sebagai citra JPEG, dari menu pilih Berkas > Ekspor > Sebagai JPEG."/>
-<node CREATED="1124560950732" ID="ID_443611240" MODIFIED="1209283422497" TEXT="Untuk mengekspor peta sebagai SVG, dari menu piih Berkas > Ekspor > Sebagai SVG. Fungsi ini hanya tersedia bila tancapan (plug-in) SVG telah terpasang."/>
+<node TEXT="Ekspor ke gambar bitmap atau vektor" FOLDED="true" POSITION="right" ID="Freeplane_Link_1908686168" CREATED="1124560950732" MODIFIED="1209283287583" COLOR="#407000">
+<node TEXT="Untuk mengekspor peta sebaga citra PNG, dari menu pilih Berkas > Ekspor > Sebagai PNG." ID="ID_1425718492" CREATED="1124560950732" MODIFIED="1209283319959"/>
+<node TEXT="Untuk mengekspor peta sebagai citra JPEG, dari menu pilih Berkas > Ekspor > Sebagai JPEG." ID="ID_1060323115" CREATED="1124560950732" MODIFIED="1209283347339"/>
+<node TEXT="Untuk mengekspor peta sebagai SVG, dari menu piih Berkas > Ekspor > Sebagai SVG. Fungsi ini hanya tersedia bila tancapan (plug-in) SVG telah terpasang." ID="ID_443611240" CREATED="1124560950732" MODIFIED="1209283422497"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_329770204" MODIFIED="1209283434003" POSITION="right" TEXT="Ekspor ke format XML lainnya">
-<node CREATED="1124560950732" ID="ID_209299544" MODIFIED="1209283534357" TEXT="Untuk mengekspor peta ke format XML lainnya menggunakan lembar transformasi XSLT (XSLT transformation sheet), dari menu pilih Berkas > Ekspor > Dengan XSLT."/>
-<node CREATED="1124560950732" ID="ID_897570861" MODIFIED="1209283591640" TEXT="Untuk mengekspor peta ke dokumen OpenOffice.org 1.4 Writer, dari menu pilih Berkas > Ekspor > Sebagai dokumen OpenOffice.org Writer."/>
+<node TEXT="Ekspor ke format XML lainnya" FOLDED="true" POSITION="right" ID="Freeplane_Link_329770204" CREATED="1124560950732" MODIFIED="1209283434003" COLOR="#407000">
+<node TEXT="Untuk mengekspor peta ke format XML lainnya menggunakan lembar transformasi XSLT (XSLT transformation sheet), dari menu pilih Berkas > Ekspor > Dengan XSLT." ID="ID_209299544" CREATED="1124560950732" MODIFIED="1209283534357"/>
+<node TEXT="Untuk mengekspor peta ke dokumen OpenOffice.org 1.4 Writer, dari menu pilih Berkas > Ekspor > Sebagai dokumen OpenOffice.org Writer." ID="ID_897570861" CREATED="1124560950732" MODIFIED="1209283591640"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1841136119" MODIFIED="1209283607262" POSITION="right" TEXT="Mengimpor struktur map">
+<node TEXT="Mengimpor struktur map" FOLDED="true" POSITION="right" ID="Freeplane_Link_1841136119" CREATED="1124560950732" MODIFIED="1209283607262" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_1862161571" MODIFIED="1209283832536" TEXT="Untuk mengimpor struktur berkas, dari menu pilih Berkas > Impor > Struktur Map. Anda akan ditanya tentang map yang strukturnya hendak diimpor. Yang dimaksud struktur adalah pohon dari semua submap (baik langsung maupun tidak) dengan tautan ke berkas-berkas dalam submap tersebut. Contoh dari struktur yang diimpor sebagai berikut."/>
-<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="ID_1276543096" MODIFIED="1209283619300" TEXT="Contoh">
+<node TEXT="Untuk mengimpor struktur berkas, dari menu pilih Berkas > Impor > Struktur Map. Anda akan ditanya tentang map yang strukturnya hendak diimpor. Yang dimaksud struktur adalah pohon dari semua submap (baik langsung maupun tidak) dengan tautan ke berkas-berkas dalam submap tersebut. Contoh dari struktur yang diimpor sebagai berikut." ID="ID_1862161571" CREATED="1124560950732" MODIFIED="1209283832536"/>
+<node TEXT="Contoh" FOLDED="true" ID="ID_1276543096" CREATED="1124560950732" MODIFIED="1209283619300" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950732" ID="ID_1028597241" MODIFIED="1209283613201" TEXT="Map terpilih">
+<node TEXT="Map terpilih" ID="ID_1028597241" CREATED="1124560950732" MODIFIED="1209283613201" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps" MODIFIED="1124560950732" TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps">
+<node TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps" ID="ID_1506382314" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950732" ID="ID_697101222" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/" MODIFIED="1124560950732" TEXT="Dbwiz">
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/ASSETS.GIF" MODIFIED="1124560950732" TEXT="ASSETS.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF" MODIFIED="1124560950732" TEXT="CONTACTS.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF" MODIFIED="1124560950732" TEXT="EVTMGMT.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF" MODIFIED="1124560950732" TEXT="EXPENSES.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF" MODIFIED="1124560950732" TEXT="INVENTRY.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/LEDGER.GIF" MODIFIED="1124560950732" TEXT="LEDGER.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF" MODIFIED="1124560950732" TEXT="ORDPROC.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF" MODIFIED="1124560950732" TEXT="RESOURCE.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/SERVICE.GIF" MODIFIED="1124560950732" TEXT="SERVICE.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF" MODIFIED="1124560950732" TEXT="TIMEBILL.GIF"/>
+<node TEXT="Dbwiz" ID="ID_697101222" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/">
+<node TEXT="ASSETS.GIF" ID="ID_64562177" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ASSETS.GIF"/>
+<node TEXT="CONTACTS.GIF" ID="ID_1059574094" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF"/>
+<node TEXT="EVTMGMT.GIF" ID="ID_1354607487" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF"/>
+<node TEXT="EXPENSES.GIF" ID="ID_1726967143" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF"/>
+<node TEXT="INVENTRY.GIF" ID="ID_985249474" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF"/>
+<node TEXT="LEDGER.GIF" ID="ID_29733514" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/LEDGER.GIF"/>
+<node TEXT="ORDPROC.GIF" ID="ID_232554023" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF"/>
+<node TEXT="RESOURCE.GIF" ID="ID_629100023" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF"/>
+<node TEXT="SERVICE.GIF" ID="ID_166552432" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/SERVICE.GIF"/>
+<node TEXT="TIMEBILL.GIF" ID="ID_287145336" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF"/>
</node>
-<node CREATED="1124560950732" ID="ID_923094028" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/" MODIFIED="1124560950732" TEXT="Styles">
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLENDS.GIF" MODIFIED="1124560950732" TEXT="ACBLENDS.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLUPRT.GIF" MODIFIED="1124560950732" TEXT="ACBLUPRT.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACEXPDTN.GIF" MODIFIED="1124560950732" TEXT="ACEXPDTN.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACINDSTR.GIF" MODIFIED="1124560950732" TEXT="ACINDSTR.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACRICEPR.GIF" MODIFIED="1124560950732" TEXT="ACRICEPR.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSNDSTN.GIF" MODIFIED="1124560950732" TEXT="ACSNDSTN.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSUMIPT.GIF" MODIFIED="1124560950732" TEXT="ACSUMIPT.GIF"/>
-<node CREATED="1124560950732" ID="ID_691308381" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/GLOBE.WMF" MODIFIED="1124560950732" TEXT="GLOBE.WMF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/STONE.BMP" MODIFIED="1124560950732" TEXT="STONE.BMP"/>
+<node TEXT="Styles" ID="ID_923094028" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/">
+<node TEXT="ACBLENDS.GIF" ID="ID_428890757" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
+<node TEXT="ACBLUPRT.GIF" ID="ID_376498909" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
+<node TEXT="ACEXPDTN.GIF" ID="ID_262314525" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
+<node TEXT="ACINDSTR.GIF" ID="ID_1779868142" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
+<node TEXT="ACRICEPR.GIF" ID="ID_1533780306" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
+<node TEXT="ACSNDSTN.GIF" ID="ID_765857968" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
+<node TEXT="ACSUMIPT.GIF" ID="ID_1214888313" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
+<node TEXT="GLOBE.WMF" ID="ID_691308381" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_172077095" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
</node>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_269203785" MODIFIED="1209284117917" POSITION="right" TEXT="Mengimpor Favorit Internet Explorer">
-<edge WIDTH="thin"/>
+<node TEXT="Mengimpor Favorit Internet Explorer" FOLDED="true" POSITION="right" ID="Freeplane_Link_269203785" CREATED="1124560950732" MODIFIED="1209284117917" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_260446736" MODIFIED="1209284330122">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <p>
- Untuk mengimpor favorit dari Internet Explorer ke dalam Freeplane,dari menu pilih Berkas > Impor > Favorit dari Explorer. Anda akan diminta memasukkan jalur ke map tempat favorit disimpan. Nama map tersebut adalah Favorit (atau Favorites) dan Anda dapat mencarinya di sistem Anda. Di Windows XP dengan antarmuka bahasa Indonesia, jalurnya adalah C:\Documents and Settings\<nama pemakai>\Favorit.
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-<node COLOR="#999999" CREATED="1124560950732" ID="ID_1939528579" MODIFIED="1209284341398" TEXT="Kata kunci: Microsoft Internet Explorer, MSIE, MS IE.">
+<edge WIDTH="thin"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Untuk mengimpor favorit dari Internet Explorer ke dalam Freeplane,dari menu pilih Berkas > Impor > Favorit dari Explorer. Anda akan diminta memasukkan jalur ke map tempat favorit disimpan. Nama map tersebut adalah Favorit (atau Favorites) dan Anda dapat mencarinya di sistem Anda. Di Windows XP dengan antarmuka bahasa Indonesia, jalurnya adalah C:\Documents [...]
+<node TEXT="Kata kunci: Microsoft Internet Explorer, MSIE, MS IE." ID="ID_1939528579" CREATED="1124560950732" MODIFIED="1209284341398" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1709974530" MODIFIED="1209284361837" POSITION="right" TEXT="Mengimpor MindMap dari MindManager X5">
-<node CREATED="1124560950732" ID="ID_1824289094" MODIFIED="1209284400102" TEXT="Untuk mengimpor MindMap dari MindManager X5, dari menu, pilih Berkas > Impor > Peta MindManager X5."/>
+<node TEXT="Mengimpor MindMap dari MindManager X5" FOLDED="true" POSITION="right" ID="Freeplane_Link_1709974530" CREATED="1124560950732" MODIFIED="1209284361837" COLOR="#407000">
+<node TEXT="Untuk mengimpor MindMap dari MindManager X5, dari menu, pilih Berkas > Impor > Peta MindManager X5." ID="ID_1824289094" CREATED="1124560950732" MODIFIED="1209284400102"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913645795" MODIFIED="1209284422485" POSITION="right" TEXT="Integrasi dengan Word atau Outlook">
+<node TEXT="Integrasi dengan Word atau Outlook" FOLDED="true" POSITION="right" ID="Freeplane_Link_913645795" CREATED="1124560950732" MODIFIED="1209284422485" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_239999971" MODIFIED="1209284474209" TEXT="Anda dapat menempelkan peta atau cabang ke dalam Microsoft Word, Wordpad, atau pesan Outlook. Pada umumnya, Anda dapat menempel ke aplikasi apapun yang mendukung teks kaya. Pemformatan teks dan tautan akan ikut ditempelkan.">
+<node TEXT="Anda dapat menempelkan peta atau cabang ke dalam Microsoft Word, Wordpad, atau pesan Outlook. Pada umumnya, Anda dapat menempel ke aplikasi apapun yang mendukung teks kaya. Pemformatan teks dan tautan akan ikut ditempelkan." ID="ID_239999971" CREATED="1124560950732" MODIFIED="1209284474209">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950732" ID="ID_1941398988" LINK="mailto:don.bonton at supermail.com" MODIFIED="1209284522989" TEXT="Klik pada taut surat (mailto:don.bonton at supermail.com) akan membuka Outlook untuk membuat pesan baru, bila tidak disetel lain di Windows.">
+<node TEXT="Klik pada taut surat (mailto:don.bonton at supermail.com) akan membuka Outlook untuk membuat pesan baru, bila tidak disetel lain di Windows." ID="ID_1941398988" CREATED="1124560950732" MODIFIED="1209284522989" LINK="mailto:don.bonton at supermail.com">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node CREATED="1124560950732" ID="ID_273515249" LINK="mailto:don.bonton at supermail.com?subject=Ini subjeknya" MODIFIED="1209284611046" TEXT="Anda dapat menggunakan Subjek di tautan surat."/>
-<node CREATED="1124560950732" ID="ID_546445267" MODIFIED="1209284658063" TEXT="Cara lain untuk menempelkan MindMap ke Microsoft Word adalah dengan mengekspornya ke HTML berdasarkan tajuk, menyalin HTML-nya dan menempelkannya ke Word."/>
+<node TEXT="Anda dapat menggunakan Subjek di tautan surat." ID="ID_273515249" CREATED="1124560950732" MODIFIED="1209284611046" LINK="mailto:don.bonton at supermail.com?subject=Ini%20subjeknya"/>
+<node TEXT="Cara lain untuk menempelkan MindMap ke Microsoft Word adalah dengan mengekspornya ke HTML berdasarkan tajuk, menyalin HTML-nya dan menempelkannya ke Word." ID="ID_546445267" CREATED="1124560950732" MODIFIED="1209284658063"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1822195277" MODIFIED="1209284665834" POSITION="right" TEXT="Menyetel preferensi">
+<node TEXT="Menyetel preferensi" FOLDED="true" POSITION="right" ID="Freeplane_Link_1822195277" CREATED="1124560950732" MODIFIED="1209284665834" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_748595231" MODIFIED="1209284705802" TEXT="Untuk mengedit preferensi, dari menu, pilih Alat > Preferensi. Kebanyakan perubahan akan diterapkan hanya setelah Freeplane dimulai ulang."/>
-<node CREATED="1124560950732" ID="ID_571002233" MODIFIED="1209284752729" TEXT="Preferensi mencakup pemetaan papan ketik, tingkah laku ekspor HTML, cara memilih node dengan tetikus, pilihan antialias, dan lain-lain."/>
-<node COLOR="#999999" CREATED="1124560950732" ID="ID_598925427" MODIFIED="1209284763535" TEXT="Kata kunci: penyesuaian.">
+<node TEXT="Untuk mengedit preferensi, dari menu, pilih Alat > Preferensi. Kebanyakan perubahan akan diterapkan hanya setelah Freeplane dimulai ulang." ID="ID_748595231" CREATED="1124560950732" MODIFIED="1209284705802"/>
+<node TEXT="Preferensi mencakup pemetaan papan ketik, tingkah laku ekspor HTML, cara memilih node dengan tetikus, pilihan antialias, dan lain-lain." ID="ID_571002233" CREATED="1124560950732" MODIFIED="1209284752729"/>
+<node TEXT="Kata kunci: penyesuaian." ID="ID_598925427" CREATED="1124560950732" MODIFIED="1209284763535" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1528828442" MODIFIED="1209284775042" POSITION="right" TEXT="Pencetakan">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_70287433" MODIFIED="1209285126817" TEXT="Anda dapat mencetak baik dengan menyesuaikan seluruh peta ke satu halaman, atau dengan mencetak peta ke beberapa lembar kertas. Pilihan ini dapat disetel dari menu Berkas > Penataan Halaman."/>
-<node CREATED="1124560950732" ID="ID_756004595" MODIFIED="1209284879542" TEXT="Untuk pemakaian ruang yang lebih baik, gunakan Lanskap dari Penataan Halaman.">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_122221947" MODIFIED="1209285103974" TEXT="Belum ada cara mudah untuk membuat pratinjau dari peta Anda sebelum mencetak. Bila Anda memiliki pencetak PostScript atau pengandar (driver) PostScript generik, Anda dapat mencetak peta ke dalam sebuah berkas dan menampilkan berkasnya menggunakan Ghostview atau program serupa. Bila Anda mencoba mencetak peta dengan pencetak yang tidak mengerti PostScript, berkas yang dihasilkan tidak akan menjadi PostScript ta [...]
-<node CREATED="1124560950732" ID="ID_1665441334" MODIFIED="1209285283413" TEXT="Anda juga dapat mencetak dari perambah (browser) Anda setelah mengekspor peta ke HTML, atau dari Word atau Wordpad setelah menyalin dan menempelkan peta ke dalamnya. Anda juga dapat mengekspor peta ke dalam HTML dengan tajuk, salin dan tempel ke Microsoft Word dan cetak dari situ. Dengan begitu, Anda dapat mengubah-ubah gayanya sesuai keinginan.">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_841140408" MODIFIED="1209286969016" POSITION="right" TEXT="Menggunakan teks kaya melalui HTML dalam node">
-<node CREATED="1124560950732" ID="ID_1000519218" MODIFIED="1209285355456" TEXT="Node yang dimulai dengan <html> dilukis menggunakan HTML yang terkandung di dalamnya. Fitur ini bermanfaat bagi pemakai dengan pengetahuan teknis. Contohnya sebagai berikut."/>
-<node CREATED="1124560950732" ID="ID_854898297" MODIFIED="1209285514234">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <h3>
- Contoh HTML
- </h3>
- <p class="msonormal">
- Ada beberapa lema:
- </p>
- <ul type="disc">
- <li class="msonormal">
- Lema satu
- </li>
- <li class="msonormal">
- Lema dua
- </li>
- </ul>
- <p class="msonormal">
- Anda bisa menggunakan <b>cetak tebal</b> or <i>miring</i>. <u>Garis bawah</u> dan juga <strike>coret</strike>.
- </p>
- <p class="msonormal">
-
- </p>
- <p class="msonormal">
- Anda bisa buat tabel:
- </p>
- <table class="msonormaltable" cellpadding="0" border="1" style="border: none" cellspacing="0">
- <tr>
- <td style="border: solid windowtext 1.0pt; padding-top: .75pt; padding-right: .75pt; padding-bottom: .75pt; padding-left: .75pt">
- <p class="msonormal">
- Sel1
- </p>
- </td>
- <td style="border-left: none; border: solid windowtext 1.0pt; padding-top: .75pt; padding-right: .75pt; padding-bottom: .75pt; padding-left: .75pt">
- <p class="msonormal">
- Sel2
- </p>
- </td>
- </tr>
- <tr>
- <td style="border: solid windowtext 1.0pt; border-top: none; padding-top: .75pt; padding-right: .75pt; padding-bottom: .75pt; padding-left: .75pt">
- <p class="msonormal">
- Sel3
- </p>
- </td>
- <td style="border-left: none; border-top: none; padding-top: .75pt; padding-right: .75pt; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; padding-bottom: .75pt; padding-left: .75pt">
- <p class="msonormal">
- Sel4.
- </p>
- </td>
- </tr>
- </table>
- <p class="msonormal">
-
- </p>
- <p class="msonormal">
- Anda bisa menggunakan berbagai <font color="#999900">warna latar depan.</font>
- </p>
- </body>
-</html>
-</richcontent>
-</node>
-<node CREATED="1124560950732" ID="ID_919917120" MODIFIED="1209285575412" TEXT="Node HTML dan gambar tidak didukung ketika mengekspor teks atau RTP (Word, Wordpad). Minimal, penggunaan HTML adalah cara yang mudah untuk publikasi di Web menggunakan applet Freeplane.">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_271176250" MODIFIED="1209286979321" POSITION="right" TEXT="Menggunakan gambar dalam node">
-<font NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_187126341" MODIFIED="1209287077452" TEXT="Untuk menyisipkan gambar ke dalam Freeplane, tekan ALT + SHIFT + K, atau dari menu konteks node, pilih Sisip > Gambar. Dengan menyisipkan gambar, Anda akan kehiangan semua teks yang sebelumnya ada dalam node tersebut. Gambar yang dimasukkan dengan cara ini tidak akan ditempelkan secara benar di luar Freeplane dan mungkin tidak akan terekspor secara benar ke HTML. Gambar dalam Freeplane masih merupakan fitur [...]
-<node CREATED="1124560950732" ID="ID_1340853323" MODIFIED="1209287107225" STYLE="fork" TEXT="Format gambar yang didukung adalah PNG, JPEG dan GIF."/>
-<node CREATED="1124560950732" ID="ID_987713301" MODIFIED="1209287766393" TEXT="Untuk mengubah tautan ke gambar menjadi gambar yang tertampilkan, tekan ALT + SHIFT + K. Anda dapat menyeret dan menjatuhkan beberapa berkas gambar ke dalam Freeplane, memilih beberapa node sekaligus, lalu mengubah semuanya menjadi gambar dengan menekan ALT + SHIFT + K."/>
-<node COLOR="#000000" CREATED="1124560950732" ID="ID_238102754" MODIFIED="1209287838507" TEXT="Cara yang lebih teknis dan sedikit lebih sukar untuk menyisipkan gambar adalah sebagai berikut. Anda dapat memasukkan HTML dalam node. Anda perlu memulai isi node dengan tanda <html>. Dengan cara ini, Anda bisa memasukkan gambar ke dalam node.">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_412481192" MODIFIED="1209287848180" TEXT="Sebagai contoh
 <html><img src="linked/Apple.png">
 <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png">
">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node CREATED="1124560950732" ID="ID_1072263410" MODIFIED="1209287867909" TEXT="Anda dapat menggunakan taut relatif untuk gambar.">
+<node TEXT="Pencetakan" FOLDED="true" POSITION="right" ID="Freeplane_Link_1528828442" CREATED="1124560950732" MODIFIED="1209284775042" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Anda dapat mencetak baik dengan menyesuaikan seluruh peta ke satu halaman, atau dengan mencetak peta ke beberapa lembar kertas. Pilihan ini dapat disetel dari menu Berkas > Penataan Halaman." ID="ID_70287433" CREATED="1124560950732" MODIFIED="1209285126817"/>
+<node TEXT="Untuk pemakaian ruang yang lebih baik, gunakan Lanskap dari Penataan Halaman." ID="ID_756004595" CREATED="1124560950732" MODIFIED="1209284879542">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Belum ada cara mudah untuk membuat pratinjau dari peta Anda sebelum mencetak. Bila Anda memiliki pencetak PostScript atau pengandar (driver) PostScript generik, Anda dapat mencetak peta ke dalam sebuah berkas dan menampilkan berkasnya menggunakan Ghostview atau program serupa. Bila Anda mencoba mencetak peta dengan pencetak yang tidak mengerti PostScript, berkas yang dihasilkan tidak akan menjadi PostScript tapi mungkin PCL, yang tidak bermanfaat bagi Anda." ID="ID_122221947" [...]
+<node TEXT="Anda juga dapat mencetak dari perambah (browser) Anda setelah mengekspor peta ke HTML, atau dari Word atau Wordpad setelah menyalin dan menempelkan peta ke dalamnya. Anda juga dapat mengekspor peta ke dalam HTML dengan tajuk, salin dan tempel ke Microsoft Word dan cetak dari situ. Dengan begitu, Anda dapat mengubah-ubah gayanya sesuai keinginan." ID="ID_1665441334" CREATED="1124560950732" MODIFIED="1209285283413">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Menggunakan teks kaya melalui HTML dalam node" FOLDED="true" POSITION="right" ID="Freeplane_Link_841140408" CREATED="1124560950732" MODIFIED="1209286969016" COLOR="#407000">
+<node TEXT="Node yang dimulai dengan <html> dilukis menggunakan HTML yang terkandung di dalamnya. Fitur ini bermanfaat bagi pemakai dengan pengetahuan teknis. Contohnya sebagai berikut." ID="ID_1000519218" CREATED="1124560950732" MODIFIED="1209285355456"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <h3>
 Contoh HTML
 </h3>
 <p class="msonormal">
 Ada beberapa lema:
 </p>
 <ul type="disc">
 <li class="msonormal">
 Lema satu
 </li>
 <li class="msonormal">
 Lema dua
 </li>
 </ul> [...]
+<node TEXT="Node HTML dan gambar tidak didukung ketika mengekspor teks atau RTP (Word, Wordpad). Minimal, penggunaan HTML adalah cara yang mudah untuk publikasi di Web menggunakan applet Freeplane." ID="ID_919917120" CREATED="1124560950732" MODIFIED="1209285575412">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Menggunakan gambar dalam node" FOLDED="true" POSITION="right" ID="Freeplane_Link_271176250" CREATED="1124560950732" MODIFIED="1209286979321" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Untuk menyisipkan gambar ke dalam Freeplane, tekan ALT + SHIFT + K, atau dari menu konteks node, pilih Sisip > Gambar. Dengan menyisipkan gambar, Anda akan kehiangan semua teks yang sebelumnya ada dalam node tersebut. Gambar yang dimasukkan dengan cara ini tidak akan ditempelkan secara benar di luar Freeplane dan mungkin tidak akan terekspor secara benar ke HTML. Gambar dalam Freeplane masih merupakan fitur tahap awal." ID="ID_187126341" CREATED="1124560950732" MODIFIED="1 [...]
+<node TEXT="Format gambar yang didukung adalah PNG, JPEG dan GIF." ID="ID_1340853323" CREATED="1124560950732" MODIFIED="1209287107225" STYLE="fork"/>
+<node TEXT="Untuk mengubah tautan ke gambar menjadi gambar yang tertampilkan, tekan ALT + SHIFT + K. Anda dapat menyeret dan menjatuhkan beberapa berkas gambar ke dalam Freeplane, memilih beberapa node sekaligus, lalu mengubah semuanya menjadi gambar dengan menekan ALT + SHIFT + K." ID="ID_987713301" CREATED="1124560950732" MODIFIED="1209287766393"/>
+<node TEXT="Cara yang lebih teknis dan sedikit lebih sukar untuk menyisipkan gambar adalah sebagai berikut. Anda dapat memasukkan HTML dalam node. Anda perlu memulai isi node dengan tanda <html>. Dengan cara ini, Anda bisa memasukkan gambar ke dalam node." ID="ID_238102754" CREATED="1124560950732" MODIFIED="1209287838507" COLOR="#000000">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Sebagai contoh
 <html><img src="linked/Apple.png">
 <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png">
" ID="ID_412481192" CREATED="1124560950732" MODIFIED="1209287848180">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Anda dapat menggunakan taut relatif untuk gambar." ID="ID_1072263410" CREATED="1124560950732" MODIFIED="1209287867909">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950732" ID="Freeplane_Link_1825247742" MODIFIED="1209287950708" TEXT="Contoh gambar, berhasil dengan baik di beberapa distribusi Windows">
-<font BOLD="true" NAME="SansSerif" SIZE="12"/>
-<node CREATED="1124560950732" ID="ID_325280427" MODIFIED="1124560950732">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
- </body>
-</html></richcontent>
-</node>
-<node CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
- </body>
-</html></richcontent>
-</node>
-<node CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
- </body>
-</html></richcontent>
-<node CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
- </body>
-</html></richcontent>
-</node>
-</node>
-<node CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
- </body>
-</html></richcontent>
-<node CREATED="1124560950732" ID="ID_1587596019" MODIFIED="1124560950732">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
- </body>
-</html></richcontent>
-<node CREATED="1124560950732" MODIFIED="1124560950732">
-<richcontent TYPE="NODE"><html>
- <head>
-
- </head>
- <body>
- <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
- </body>
-</html></richcontent>
-</node>
-</node>
-</node>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/GLOBE.WMF" MODIFIED="1124560950732" TEXT="GLOBE.WMF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/STONE.BMP" MODIFIED="1124560950732" TEXT="STONE.BMP"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="ID_389666008" MODIFIED="1209287968654" POSITION="right" TEXT="Menggunakan penguncian berkas eksperimental">
-<node CREATED="1124560950732" ID="ID_783273897" MODIFIED="1209289277205" TEXT="Versi Freeplane saa ini memiliki penguncian berkas eksperimental, yang secara bawaan dinonaktifkan. Implementasi saat ini tidak mencegah konflik penyuntingan (race condition) secara sempurna, tapi mestinya cukup untuk kebanyakan kegunaan praktis. "/>
-<node CREATED="1124560950732" ID="ID_540318221" MODIFIED="1209288452680" TEXT="Penguncian berkas memastikan tidak ada lebih dari satu pemakai yang mengedit suatu peta pada saat yang sama, sehingga mencegah agar mereka tidak saling menimpa informasi tanpa sengaja."/>
-<node CREATED="1124560950732" ID="ID_1073463144" MODIFIED="1209288477115" TEXT="Untuk mengaktifkan penguncian berkas eksperimental, dari menu, pilih Alat > Preferensi."/>
+<node TEXT="Contoh gambar, berhasil dengan baik di beberapa distribusi Windows" ID="Freeplane_Link_1825247742" CREATED="1124560950732" MODIFIED="1209287950708" COLOR="#996600">
+<font NAME="SansSerif" SIZE="12" BOLD="true"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLENDS.GIF">
 </body>
</html>" ID="ID_325280427" CREATED="1124560950732" MODIFIED="1124560950732"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLUPRT.GIF">
 </body>
</html>" ID="ID_1959298514" CREATED="1124560950732" MODIFIED="1124560950732"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACEXPDTN.GIF">
 </body>
</html>" ID="ID_759752350" CREATED="1124560950732" MODIFIED="1124560950732">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACINDSTR.GIF">
 </body>
</html>" ID="ID_1865341323" CREATED="1124560950732" MODIFIED="1124560950732"/>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACRICEPR.GIF">
 </body>
</html>" ID="ID_280022215" CREATED="1124560950732" MODIFIED="1124560950732">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSNDSTN.GIF">
 </body>
</html>" ID="ID_1587596019" CREATED="1124560950732" MODIFIED="1124560950732">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSUMIPT.GIF">
 </body>
</html>" ID="ID_1942337749" CREATED="1124560950732" MODIFIED="1124560950732"/>
+</node>
+</node>
+<node TEXT="GLOBE.WMF" ID="ID_585304648" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_694785743" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
+</node>
+</node>
+<node TEXT="Menggunakan penguncian berkas eksperimental" FOLDED="true" POSITION="right" ID="ID_389666008" CREATED="1124560950732" MODIFIED="1209287968654" COLOR="#407000">
+<node TEXT="Versi Freeplane saa ini memiliki penguncian berkas eksperimental, yang secara bawaan dinonaktifkan. Implementasi saat ini tidak mencegah konflik penyuntingan (race condition) secara sempurna, tapi mestinya cukup untuk kebanyakan kegunaan praktis. " ID="ID_783273897" CREATED="1124560950732" MODIFIED="1209289277205"/>
+<node TEXT="Penguncian berkas memastikan tidak ada lebih dari satu pemakai yang mengedit suatu peta pada saat yang sama, sehingga mencegah agar mereka tidak saling menimpa informasi tanpa sengaja." ID="ID_540318221" CREATED="1124560950732" MODIFIED="1209288452680"/>
+<node TEXT="Untuk mengaktifkan penguncian berkas eksperimental, dari menu, pilih Alat > Preferensi." ID="ID_1073463144" CREATED="1124560950732" MODIFIED="1209288477115"/>
</node>
</node>
</map>
diff --git a/freeplane/doc/freeplane_it.mm b/freeplane/doc/freeplane_it.mm
index 4fb1283..1cce5af 100644
--- a/freeplane/doc/freeplane_it.mm
+++ b/freeplane/doc/freeplane_it.mm
@@ -1,23 +1,122 @@
-<map version="0.9.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
<attribute_registry>
- <attribute_name MANUAL="true" NAME="X"/>
- <attribute_name MANUAL="true" NAME="Y"/>
+ <attribute_name MANUAL="true" NAME="X">
+ <attribute_value VALUE="10"/>
+ </attribute_name>
+ <attribute_name MANUAL="true" NAME="Y">
+ <attribute_value VALUE="20"/>
+ </attribute_name>
</attribute_registry>
-<node ID="ID_911274459" CREATED="1124560950701" MODIFIED="1216753542772" COLOR="#993300">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body width="">
- <p align="center">
- Freeplane<br/><small>- free mind mapping software -</small> 
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body width="">
 <p align="center">
 Freeplane<br><small>- free mind mapping software -</small> 
 </p>
 </body>
</html>" FOLDED="false" ID="ID_911274459" CREATED="1124560950701" MODIFIED="1465678925346" COLOR="#993300">
<font NAME="Dialog" SIZE="18" BOLD="true"/>
-<hook NAME="MapStyle" max_node_width="600"/>
+<hook NAME="MapStyle">
+ <properties fit_to_viewport="false;"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" FORMAT="NO_FORMAT" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="true" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#ffffff">
+<font SIZE="9"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" UNIFORM_SHAPE="true" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font SIZE="24" ITALIC="true"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2">
+<edge COLOR="#ff0033"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3">
+<edge COLOR="#009933"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4">
+<edge COLOR="#3333ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#ff6600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
<node TEXT="Pagina internet di Freeplane" POSITION="left" ID="ID_913646046" CREATED="1124560950701" MODIFIED="1280835607586" LINK="http://freeplane.sourceforge.net">
<font NAME="SansSerif" SIZE="12"/>
</node>
@@ -38,45 +137,9 @@
</node>
<node TEXT="Scaricare Freeplane" ID="ID_125757182" CREATED="1265292892913" MODIFIED="1266589975310" LINK="https://sourceforge.net/projects/freeplane/files/"/>
</node>
-<node ID="_Freeplane_Link_139664576" CREATED="1124560950701" MODIFIED="1280836749882">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per installare Freeplane in <b>Microsoft Windows</b>, installare Java Sun quindi installare Freeplane usando il file di installazione.
- </p>
- </body>
-</html></richcontent>
-</node>
-<node ID="_Freeplane_Link_1380352758" CREATED="1124560950701" MODIFIED="1280836726741">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per installare Freeplane in <b>Linux</b>, scaricare Java Runtime Environment e Freeplane. Installare prima Java, poi scompattare Freeplane. Per eseguire Freeplane, lanciare freeplane.sh.
- </p>
- </body>
-</html></richcontent>
-</node>
-<node ID="ID_1068063073" CREATED="1280836356174" MODIFIED="1280836713944">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per installare Freeplane con il sistema operativo <b>Mac OS X</b>, la prima cosa è assicurarsi di avere tutti gli ultimi aggiornamenti disponibili, in particolare Java. L'aggiornamento Software si trova sotto il menu logo Apple in alto a sinistra dello schermo.<br/><br/>Quindi scaricare una versione per Mac specifica di Freeplane. La versione Dmg è più facile da installare, attraverso un file .zip disponibile. Quando il download è completato, il file può es [...]
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per installare Freeplane in <b>Microsoft Windows</b>, installare Java Sun quindi installare Freeplane usando il file di installazione.
 </p>
 </body>
</html>" ID="_Freeplane_Link_139664576" CREATED="1124560950701" MODIFIED="1280836749882"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per installare Freeplane in <b>Linux</b>, scaricare Java Runtime Environment e Freeplane. Installare prima Java, poi scompattare Freeplane. Per eseguire Freeplane, lanciare freeplane.sh.
 </p>
 </body>
</html>" ID="_Freeplane_Link_1380352758" CREATED="1124560950701" MODIFIED="1280836726741"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per installare Freeplane con il sistema operativo <b>Mac OS X</b>, la prima cosa è assicurarsi di avere tutti gli ultimi aggiornamenti disponibili, in particolare Java. L'aggiornamento Software si trova sotto il menu logo Apple in alto a sinistra dello schermo.<br><br>Quindi scaricare una versione per Mac specifica di Freeplane. La [...]
</node>
<node TEXT="Note sull'utilizzo per Macintosh" FOLDED="true" POSITION="left" ID="ID_482183510" CREATED="1270892460643" MODIFIED="1281346026398" COLOR="#006666">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
@@ -129,14 +192,14 @@
<node TEXT="Joerg Mueller" FOLDED="true" ID="_Freeplane_Link_1896457660" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="ponders at t-online.de" ID="ID_1031957688" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#558000" LINK="mailto:ponders at t-online.de">
+<node TEXT="ponders at t-online.de" ID="ID_1031957688" CREATED="1124560950701" MODIFIED="1124560950701" LINK="mailto:ponders at t-online.de" COLOR="#558000">
<font NAME="Dialog" SIZE="10"/>
</node>
<node TEXT="University of Freiburg, Germany" ID="ID_1110910078" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1124560950701" MODIFIED="1216753531920" COLOR="#996600" LINK="http://danpolansky.blogspot.com/">
+<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1124560950701" MODIFIED="1216753531920" LINK="http://danpolansky.blogspot.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
</node>
@@ -171,36 +234,7 @@
</node>
</node>
</node>
-<node FOLDED="true" POSITION="right" ID="_Freeplane_Link_1596161299" CREATED="1124560950701" MODIFIED="1281346788961" COLOR="#407000" HGAP="-139" VSHIFT="-33">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <b><font size="5" color="#000000">Introduzione</font></b>
- </p>
- <p>
-
- </p>
- <p>
- <font color="#000000">Freeplane rende possibile la creazione delle cosi dette mappe mentali. Molte persone le usano già in alternativa alle note di testo o per la gestione personale. Le informazioni sono immagazzinate in celle di testo chiamate nodi. I nodi sono connessi assieme usando linee curve chiamate collegamenti Questa è una documentazione per Freeplane 1.1.2. I tasti rapidi e le funzioni potranno cambiare con le versioni future. </font>
- </p>
- <p>
-
- </p>
- <p>
- <b><font color="#000000">Si consiglia di utilizzare i tasti rapidi per velocizzare l'uso di questo programma.</font></b><font color="#000000"> Chi usa molto il computer, sa che il mouse rende l'accesso alle funzioni dei programmi più facile, ma più lento. Imparare o personalizzare una combinazione di tasti per le funzioni più ricorrenti, accelera notevolmente il flusso di lavoro.</font>
- </p>
- <p>
-
- </p>
- <p>
- <b><font color="#0000ff">Premere il tasto freccia destra, o il tasto sinistro del mouse su questo nodo per espanderlo</font></b>
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <b><font size="5" color="#000000">Introduzione</font></b>
 </p>
 <p>
 
 </p>
 <p>
 <font color="#000000">Freeplane rende possibile la creazione delle cosi dette mappe mentali. Molte persone le usano già in alternativa alle note di te [...]
<node TEXT="Premere il tasto freccia sinistro per espandere i nodi posizionati alla sinistra del nodo centrale" ID="ID_710242785" CREATED="1264149127531" MODIFIED="1280837601943"/>
</node>
<node TEXT="Dimostrazione di alcune caratteristiche" FOLDED="true" POSITION="right" ID="_Freeplane_Link_706084071" CREATED="1124560950701" MODIFIED="1281346161367" COLOR="#006666">
@@ -348,32 +382,8 @@
</node>
<node TEXT="Per seguire un collegamento, cliccare sull'icona" FOLDED="true" ID="ID_1673793348" CREATED="1280837890593" MODIFIED="1280837937860" COLOR="#669900">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<node ID="ID_236721766" CREATED="1280837947454" MODIFIED="1280838060268">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Una <font color="#00ff00">freccia verde</font> indica un collegamento locale, all'interno della stessa mappa
- </p>
- </body>
-</html></richcontent>
-</node>
-<node ID="ID_429828118" CREATED="1280837991892" MODIFIED="1280838046549">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Una <font color="#ff0000">freccia rossa</font> indica un collegamento esterno alla mappa corrente
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Una <font color="#00ff00">freccia verde</font> indica un collegamento locale, all'interno della stessa mappa
 </p>
 </body>
</html>" ID="ID_236721766" CREATED="1280837947454" MODIFIED="1280838060268"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Una <font color="#ff0000">freccia rossa</font> indica un collegamento esterno alla mappa corrente
 </p>
 </body>
</html>" ID="ID_429828118" CREATED="1280837991892" MODIFIED="1280838046549"/>
</node>
<node TEXT="Nodi con più righe" FOLDED="true" ID="_Freeplane_Link_839677176" CREATED="1124560950717" MODIFIED="1264172978859" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
@@ -428,43 +438,43 @@
<icon BUILTIN="button_ok"/>
<icon BUILTIN="back"/>
</node>
-<node TEXT="Si possono racchiudere i nodi con delle nuvole" FOLDED="true" ID="_Freeplane_Link_318937820" CREATED="1124560950717" MODIFIED="1281346190664" COLOR="#407000" LINK="#Freeplane_Link_1697687428">
-<cloud WIDTH="0"/>
+<node TEXT="Si possono racchiudere i nodi con delle nuvole" FOLDED="true" ID="_Freeplane_Link_318937820" CREATED="1124560950717" MODIFIED="1281346190664" LINK="#Freeplane_Link_1697687428" COLOR="#407000">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<node TEXT="Con colori personalizzati" ID="ID_1525540268" CREATED="1124560950717" MODIFIED="1264175862628">
-<cloud COLOR="#cccc00" WIDTH="0"/>
+<cloud COLOR="#cccc00" SHAPE="ARC"/>
</node>
<node TEXT="Non è necessario disegnarle, basta attivarle e si adatteranno automaticamente ai nodi" ID="ID_1254003650" CREATED="1264175641794" MODIFIED="1264175712999"/>
</node>
-<node TEXT="E' possibile avere collegamenti grafici" FOLDED="true" ID="_Freeplane_Link_1750585847" CREATED="1124560950717" MODIFIED="1281346218085" COLOR="#407000" LINK="#_Freeplane_Link_1996597932">
+<node TEXT="E' possibile avere collegamenti grafici" FOLDED="true" ID="_Freeplane_Link_1750585847" CREATED="1124560950717" MODIFIED="1281346218085" LINK="#_Freeplane_Link_1996597932" COLOR="#407000">
<node TEXT="Connettere un nodo" ID="_Freeplane_Link_1212380407" CREATED="1124560950717" MODIFIED="1264177830717">
-<arrowlink DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="A un'altro" ID="_Freeplane_Link_1249400461" CREATED="1124560950717" MODIFIED="1264177836468">
-<arrowlink COLOR="#6600ff" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#6600ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Con colore diverso" ID="_Freeplane_Link_880551392" CREATED="1124560950717" MODIFIED="1264177843250">
-<arrowlink DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Ed un percorso diverso" ID="_Freeplane_Link_1789233193" CREATED="1124560950717" MODIFIED="1264177858844"/>
</node>
-<node TEXT="I collegamenti grafici possono avere etichette" FOLDED="true" ID="ID_1234443629" CREATED="1280838831482" MODIFIED="1281272569387" HGAP="18" VSHIFT="20" COLOR="#407000" LINK="#_Freeplane_Link_1996597932">
+<node TEXT="I collegamenti grafici possono avere etichette" FOLDED="true" ID="ID_1234443629" CREATED="1280838831482" MODIFIED="1281272569387" LINK="#_Freeplane_Link_1996597932" HGAP_QUANTITY="18.0 px" VSHIFT_QUANTITY="20.0 px" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<node TEXT="Nodo sorgente" ID="ID_265365223" CREATED="1280838852419" MODIFIED="1280840660130" VSHIFT="-51">
+<node TEXT="Nodo sorgente" ID="ID_265365223" CREATED="1280838852419" MODIFIED="1280840660130" VSHIFT_QUANTITY="-51.0 px">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_450078201" SOURCE_LABEL="ETICHETTA SORGENTE" TARGET_LABEL="ETICHETTA DESTINATARIO" MIDDLE_LABEL="ETICHETTA CENTRALE" STARTINCLINATION="125;21;" ENDINCLINATION="125;21;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<arrowlink DESTINATION="ID_450078201" SOURCE_LABEL="ETICHETTA SORGENTE" TARGET_LABEL="ETICHETTA DESTINATARIO" MIDDLE_LABEL="ETICHETTA CENTRALE" STARTINCLINATION="125;21;" ENDINCLINATION="125;21;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Nodo destinatario" ID="ID_450078201" CREATED="1280838860685" MODIFIED="1280838872763" VSHIFT="56"/>
+<node TEXT="Nodo destinatario" ID="ID_450078201" CREATED="1280838860685" MODIFIED="1280838872763" VSHIFT_QUANTITY="56.0 px"/>
</node>
-<node TEXT="I collegamenti grafici possono essere formattati per sembrare dei collegamenti" FOLDED="true" ID="ID_819889601" CREATED="1280840738725" MODIFIED="1281346239210" HGAP="24" VSHIFT="19" COLOR="#407000">
+<node TEXT="I collegamenti grafici possono essere formattati per sembrare dei collegamenti" FOLDED="true" ID="ID_819889601" CREATED="1280840738725" MODIFIED="1281346239210" HGAP_QUANTITY="24.0 px" VSHIFT_QUANTITY="19.0 px" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
-<node TEXT="1" ID="ID_1293027527" CREATED="1280841406108" MODIFIED="1280841503532" HGAP="21" VSHIFT="-23">
-<arrowlink EDGE_LIKE="true" DESTINATION="ID_1744531235" STARTINCLINATION="45;0;" ENDINCLINATION="45;0;" STARTARROW="NONE" ENDARROW="NONE"/>
+<node TEXT="1" ID="ID_1293027527" CREATED="1280841406108" MODIFIED="1280841503532" HGAP_QUANTITY="21.0 px" VSHIFT_QUANTITY="-23.0 px">
+<arrowlink SHAPE="EDGE_LIKE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1744531235" STARTINCLINATION="45;0;" ENDINCLINATION="45;0;" STARTARROW="NONE" ENDARROW="NONE"/>
</node>
<node TEXT="2" FOLDED="true" ID="ID_1898562702" CREATED="1280841409312" MODIFIED="1280841410171">
-<node TEXT="22" ID="ID_1744531235" CREATED="1280841426327" MODIFIED="1280841510688" HGAP="44"/>
+<node TEXT="22" ID="ID_1744531235" CREATED="1280841426327" MODIFIED="1280841510688" HGAP_QUANTITY="44.0 px"/>
</node>
-<node TEXT="3" ID="ID_1673487352" CREATED="1280841410827" MODIFIED="1280841497953" HGAP="27" VSHIFT="22">
-<arrowlink EDGE_LIKE="true" DESTINATION="ID_1744531235" STARTINCLINATION="46;0;" ENDINCLINATION="46;0;" STARTARROW="NONE" ENDARROW="NONE"/>
+<node TEXT="3" ID="ID_1673487352" CREATED="1280841410827" MODIFIED="1280841497953" HGAP_QUANTITY="27.0 px" VSHIFT_QUANTITY="22.0 px">
+<arrowlink SHAPE="EDGE_LIKE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1744531235" STARTINCLINATION="46;0;" ENDINCLINATION="46;0;" STARTARROW="NONE" ENDARROW="NONE"/>
</node>
</node>
<node TEXT="I collegamenti possono essere nascosti" FOLDED="true" ID="ID_294841155" CREATED="1280841586704" MODIFIED="1280841652987" COLOR="#407000">
@@ -473,14 +483,14 @@
<edge STYLE="hide_edge"/>
</node>
</node>
-<node TEXT="I nodi possono avere attributi" ID="ID_879501139" CREATED="1280841656393" MODIFIED="1281346270289" COLOR="#407000" LINK="#ID_1041784802">
+<node TEXT="I nodi possono avere attributi" ID="ID_879501139" CREATED="1280841656393" MODIFIED="1281346270289" LINK="#ID_1041784802" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<attribute NAME="X" VALUE="10"/>
<attribute NAME="Y" VALUE="20"/>
</node>
-<node TEXT="I nodi possono essere posizionati liberamente" FOLDED="true" ID="_Freeplane_Link_127668276" CREATED="1124560950717" MODIFIED="1280840679177" COLOR="#407000" HGAP="19" VSHIFT="26">
-<node TEXT="Uno" ID="_Freeplane_Link_894936766" CREATED="1124560950717" MODIFIED="1264177913864" HGAP="-2" VSHIFT="-21"/>
-<node TEXT="Un'altro" ID="_Freeplane_Link_1942481455" CREATED="1124560950717" MODIFIED="1264177920708" HGAP="215" VSHIFT="14"/>
+<node TEXT="I nodi possono essere posizionati liberamente" FOLDED="true" ID="_Freeplane_Link_127668276" CREATED="1124560950717" MODIFIED="1280840679177" COLOR="#407000" HGAP_QUANTITY="19.0 px" VSHIFT_QUANTITY="26.0 px">
+<node TEXT="Uno" ID="_Freeplane_Link_894936766" CREATED="1124560950717" MODIFIED="1264177913864" HGAP_QUANTITY="-2.0 px" VSHIFT_QUANTITY="-21.0 px"/>
+<node TEXT="Un'altro" ID="_Freeplane_Link_1942481455" CREATED="1124560950717" MODIFIED="1264177920708" HGAP_QUANTITY="215.0 px" VSHIFT_QUANTITY="14.0 px"/>
</node>
</node>
<node TEXT="Navigazione ed esplorazione della mappa" FOLDED="true" POSITION="right" ID="ID_418018884" CREATED="1280845405945" MODIFIED="1281280123406" COLOR="#006666">
@@ -491,19 +501,7 @@
<node TEXT="Per spostarsi al nodo più alto del ramo corrente, Pag. Su" ID="ID_716871966" CREATED="1280846619990" MODIFIED="1280846737211"/>
<node TEXT="Per spostarsi al nodo più basso del ramo corrente, Pag. Giu" ID="ID_1800037789" CREATED="1280846670929" MODIFIED="1280846722617"/>
<node TEXT="Per spostarsi al nodo centrale premere Esc" ID="ID_827891383" CREATED="1280846751118" MODIFIED="1280846763634"/>
-<node ID="ID_1406866713" CREATED="1280848768285" MODIFIED="1281007712263">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per spostarsi avanti e indietro nella cronologia dei nodi visitati, usare Naviga -> Avanti <b>(Alt+Destra)</b> o Indietro <b>(Alt+Sinistra)</b>
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per spostarsi avanti e indietro nella cronologia dei nodi visitati, usare Naviga -> Avanti <b>(Alt+Destra)</b> o Indietro <b>(Alt+Sinistra)</b>
 </p>
 </body>
</html>" ID="ID_1406866713" CREATED="1280848768285" MODIFIED="1281007712263"/>
<node TEXT="Per visitare tutti i nodi di una mappa, usare Naviga > Nodo Successivo (Ctrl + Alt + Destra) e Nodo Precedente (Ctrl + Alt + Sinistra)" ID="ID_501983345" CREATED="1280999285981" MODIFIED="1281006773230"/>
<node TEXT="Per collassare i nodi dopo averli visualizzati, usare Naviga > Nodo Successivo (collassa) (Ctrl + Alt + Shift + Destra) e Nodo Precedente (collassa) (Ctrl + Alt + Shift + Sinistra)" ID="ID_1282565645" CREATED="1281006794011" MODIFIED="1281007151639"/>
<node TEXT="Premere Ctrl+F per cercare. Premere Ctrl + G per cercare ancora. La ricerca sarà effettuata nel nodo selezionato ed in tutti i suoi figli. Per cercare in tutta la mappa, premere Esc per tornare al nodo centrale, prima della ricerca." ID="ID_1238769160" CREATED="1124560950701" MODIFIED="1281007770156">
@@ -548,62 +546,17 @@
<node TEXT="Ricerca e Filtri" FOLDED="true" ID="Freeplane_Link_423038022" CREATED="1124560950717" MODIFIED="1281084461314" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
<node TEXT="E' possibile cercare e filtrare nodi in base al testo contenuto, icone, tempo di creazione/modifica, posizione, priorità, collegamenti grafici, collegamenti ipertestuali, note e attributi." ID="ID_1567618889" CREATED="1281083881609" MODIFIED="1281083966500"/>
-<node ID="ID_966700848" CREATED="1124560950717" MODIFIED="1281084446422">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per cercare un testo in un nodo ed in tutti i suoi nodi discendenti, premere <b>Ctrl+F</b> o scegliere "Trova..." dal menu Modifica.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per cercare un testo in un nodo ed in tutti i suoi nodi discendenti, premere <b>Ctrl+F</b> o scegliere "Trova..." dal menu Modifica.
 </p>
 </body>
</html>" ID="ID_966700848" CREATED="1124560950717" MODIFIED="1281084446422">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1646223708" CREATED="1124560950717" MODIFIED="1281084454610">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per ripetere la ricerca e cercare il testo successivo, premere <b>Ctrl+G</b> o dal menu "Modifica" scegliere Trova successivo.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per ripetere la ricerca e cercare il testo successivo, premere <b>Ctrl+G</b>  o dal menu "Modifica" scegliere Trova successivo.
 </p>
 </body>
</html>" ID="ID_1646223708" CREATED="1124560950717" MODIFIED="1281084454610">
<font NAME="SansSerif" SIZE="12"/>
</node>
<node TEXT="La ricerca è in base alla profondità. Cioè la ricerca parte dai nodi più vicini al nodo centrale, in modo da riportare prima le idee principali, quindi i dettagli." ID="ID_829330412" CREATED="1124560950717" MODIFIED="1264682452232"/>
<node TEXT="Per cercare nell'intera mappa, selezionare il nodo centrale ad esempio premendo Esc, prima della ricerca." ID="ID_488311689" CREATED="1124560950717" MODIFIED="1264608058234"/>
<node TEXT="Ricordare che la ricerca non viene effettuata su tutta la mappa, ma solo sul nodo selezionato e su tutti i suoi discendenti." ID="ID_779591913" CREATED="1124560950717" MODIFIED="1264682514702"/>
-<node ID="ID_790814993" CREATED="1281084100064" MODIFIED="1281084405512">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Il comando <b>Trova e sostituisci</b>, è una ricerca avanzata con la possibilità di sostituire un testo. Viene visualizzato anche un elenco di tutti i nodi.
- </p>
- </body>
-</html></richcontent>
-</node>
-<node ID="ID_113607096" CREATED="1281084223533" MODIFIED="1281084431921">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Il comando <b>Trova e sostituisci in tutte le mappe</b>, effettua l'azione su tutte le mappe aperte.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Il comando <b>Trova e sostituisci</b>, è una ricerca avanzata con la possibilità di sostituire un testo. Viene visualizzato anche un elenco di tutti i nodi.
 </p>
 </body>
</html>" ID="ID_790814993" CREATED="1281084100064" MODIFIED="1281084405512"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Il comando <b>Trova e sostituisci in tutte le mappe</b>, effettua l'azione su tutte le mappe aperte.
 </p>
 </body>
</html>" ID="ID_113607096" CREATED="1281084223533" MODIFIED="1281084431921">
<font BOLD="false"/>
</node>
<node TEXT="E' possibile costruire anche dei filtri per vedere solo i nodi di interesse. Usare la barra dei filtri o il menu Filtra." ID="ID_1646245084" CREATED="1281084329501" MODIFIED="1281084390478"/>
@@ -614,19 +567,7 @@
<font NAME="SansSerif" SIZE="12"/>
</node>
<node TEXT="Per scorrere le mappe aperte, usare il menu Naviga > Mappa precedente (Shift + Alt + Sinistra) e Mappa Successiva (Shift + Alt + Destra)" ID="ID_844364399" CREATED="1281084584305" MODIFIED="1281084653496"/>
-<node ID="ID_620055192" CREATED="1281084674076" MODIFIED="1281084716875">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per commutare tra le ultime due mappe modificare, usare <b>Ctrl + 1</b>
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per commutare tra le ultime due mappe modificare, usare <b>Ctrl + 1</b>
 </p>
 </body>
</html>" ID="ID_620055192" CREATED="1281084674076" MODIFIED="1281084716875"/>
</node>
</node>
<node TEXT="Modificare il contenuto della mappa" FOLDED="true" POSITION="right" ID="ID_1395035101" CREATED="1280845450820" MODIFIED="1281279920359" COLOR="#006666">
@@ -642,25 +583,13 @@
</node>
<node TEXT="Editare il testo di un nodo" FOLDED="true" ID="Freeplane_Link_1700974092" CREATED="1124560950717" MODIFIED="1281087973970" COLOR="#407000">
<node TEXT="Per editare un nodo, premere il tasto F2, Home o Fine o nel menù contestuale scegliere "Modifica Nodo". Per terminare, premere Invio oppure Ins per terminare ed inserire un nuovo nodo figlio." ID="_Freeplane_Link_519923426" CREATED="1124560950717" MODIFIED="1281087571139">
-<arrowlink DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Per sostituire il testo del nodo selezionato, semplicemente iniziare a scrivere." ID="ID_309576072" CREATED="1124560950717" MODIFIED="1264179361749"/>
-<node ID="ID_1312466817" CREATED="1124560950717" MODIFIED="1281087638389">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <font color="#006666">Per</font> <b>scrivere</b> <font size="5">testi</font> <font face="Arial Black">più</font> <u><i>elaborati</i></u>, premere Alt + Invio o scegliere il comando Formato > Usa formattazione testo avanzata.
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <font color="#006666">Per</font> <b>scrivere</b> <font size="5">testi</font> <font face="Arial Black">più</font> <u><i>elaborati</i></u>, premere Alt + Invio o scegliere il comando Formato > Usa formattazione testo ava [...]
<node TEXT="Per dividere un nodo con testo avanzato, usare il tasto "Dividi" sotto alla finestra dell'editor, o premere Alt + D." ID="ID_1313747130" CREATED="1124560950717" MODIFIED="1264349097704"/>
<node TEXT="Per inserire una linea vuota nel testo avanzato, premere Ctrl + Invio." ID="ID_274195390" CREATED="1124560950717" MODIFIED="1266589639335">
-<arrowlink DESTINATION="_Freeplane_Link_1445647544" STARTINCLINATION="118;0;" ENDINCLINATION="118;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1445647544" STARTINCLINATION="118;0;" ENDINCLINATION="118;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Per copiare la selezione corrente durante la modfica avanzata, premere il tasto destro del mouse e scegliere copia." ID="ID_1426436726" CREATED="1124560950717" MODIFIED="1264350033282"/>
<node TEXT="Per inserire un simbolo speciale come ©, inserirlo nel vostro editor di testo favorito, ad esempio open office, ed incollarlo in freeplane." ID="ID_1461873887" CREATED="1124560950717" MODIFIED="1264350729219"/>
@@ -757,7 +686,7 @@
</node>
</node>
</node>
-<node TEXT="Google" ID="ID_1246514257" CREATED="1124560950732" MODIFIED="1124560950732" COLOR="#996600" LINK="http://www.google.com/">
+<node TEXT="Google" ID="ID_1246514257" CREATED="1124560950732" MODIFIED="1124560950732" LINK="http://www.google.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
@@ -768,38 +697,11 @@
<node TEXT="I collegamenti ipertestuali possono fare riferimento a file locali, pagine internet o indirizzi email." ID="ID_1984331453" CREATED="1124560950717" MODIFIED="1264424998728"/>
<node TEXT="Per aggiungere un collegamento ipertestuale, premere Ctrl + K o nel menu contestuale usare Inserisci - Collegamento ipertestuale web." ID="ID_43116335" CREATED="1124560950717" MODIFIED="1264424932666"/>
<node TEXT="Per rimuoverlo, cancellare il contenuto del campo, dopo aver premuto Ctrl + K." ID="ID_118433387" CREATED="1124560950717" MODIFIED="1264424649416"/>
-<node ID="ID_1544807906" CREATED="1124560950717" MODIFIED="1264424769150">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- Per creare un collegamento ad un indirizzo email, usare il formato:
-
- <p>
- <i>mailto:don.bonton at supermail.com</i>.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 Per creare un collegamento ad un indirizzo email, usare il formato:

 <p>
 <i>mailto:don.bonton at supermail.com</i>.
 </p>
 </body>
</html>" ID="ID_1544807906" CREATED="1124560950717" MODIFIED="1264424769150">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1339265232" CREATED="1124560950717" MODIFIED="1265113593467">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- Per creare un collegamento ad un indirizzo email inserendo già il soggetto, usare il formato:
-
- <p>
- <i>mailto:don.bonton at supermail.com?subject=Ultima telefonata</i>.
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 Per creare un collegamento ad un indirizzo email inserendo già il soggetto, usare il formato:

 <p>
 <i>mailto:don.bonton at supermail.com?subject=Ultima telefonata</i>.
 </p>
 </body>
</html>" ID="ID_1339265232" CREATED="1124560950717" MODIFIED="1265113593467"/>
<node TEXT="Per creare un collegamento ad uno o più file, selezionarlo in esplora file e copiarlo. In freeplane, selezionare semplicemente un nodo e dare il comando incolla." ID="ID_1742297791" CREATED="1264425072041" MODIFIED="1266590084562"/>
<node TEXT="Per creare un collegamento ad una pagina web, copiare l'indirizzo nel browser ed incollarlo in freeplane, non si deve essere in modifica, il nodo deve essere solo selezionato." ID="ID_1748638430" CREATED="1264440352008" MODIFIED="1266590086265"/>
</node>
@@ -847,8 +749,8 @@
<node TEXT="Aggiungere note" FOLDED="true" ID="ID_491043541" CREATED="1281103662038" MODIFIED="1281272231340" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<edge WIDTH="thin"/>
-<node TEXT="Un nodo può avere un testo avanzato allegato come nota. L'icona all'inizio di questo ramo indica che c'è una nota allegata. Posizionarsi sopra col mouse per visualizzarla" ID="ID_762650615" CREATED="1271096065323" MODIFIED="1281110928814">
-<richcontent TYPE="NOTE">
+<node TEXT="Un nodo può avere un testo avanzato allegato come nota. L'icona all'inizio di questo ramo indica che c'è una nota allegata. Posizionarsi sopra col mouse per visualizzarla" ID="ID_762650615" CREATED="1271096065323" MODIFIED="1281110928814"><richcontent TYPE="NOTE">
+
<html>
<head>
@@ -858,7 +760,8 @@
Questo nodo ha una<u> nota </u><b>allegata</b>.
</p>
</body>
-</html></richcontent>
+</html>
+</richcontent>
</node>
<node TEXT="Questo testo può essere modificato nella finestra delle note" ID="ID_414462622" CREATED="1271096088819" MODIFIED="1281109993286"/>
<node TEXT="Usare Modifica > Modifica note per commutare tra la finestra principale e quella delle note o Ctrl + < ." ID="ID_1743035107" CREATED="1271096117483" MODIFIED="1281110863220">
@@ -866,9 +769,9 @@
</node>
<node TEXT="La finestra di modifica delle note, può essere posizionata liberamente, usando Visualizza > Posizione finestra delle note." ID="ID_1394490930" CREATED="1271096150723" MODIFIED="1281272201309"/>
</node>
-<node TEXT="Collegamenti grafici" FOLDED="true" ID="_Freeplane_Link_1996597932" CREATED="1124560950717" MODIFIED="1281272592903" COLOR="#407000" LINK="#ID_1234443629">
+<node TEXT="Collegamenti grafici" FOLDED="true" ID="_Freeplane_Link_1996597932" CREATED="1124560950717" MODIFIED="1281272592903" LINK="#ID_1234443629" COLOR="#407000">
<node TEXT="Per creare un collegamento grafico tra due nodi, selezionare un nodo e tenendo premuto i tasti Shift e Ctrl trascinarlo sul secondo nodo; Rilasciare il pulsante del mouse prima di aver rilasciato i tasti Shift e Ctrl." ID="ID_985897417" CREATED="1124560950717" MODIFIED="1266487915471">
-<arrowlink DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="255;0;" ENDINCLINATION="255;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="255;0;" ENDINCLINATION="255;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="E' anche possibile trascinare un nodo e rilasciarlo usando il tasto destro del mouse." ID="ID_201784782" CREATED="1124560950717" MODIFIED="1264753262546"/>
<node TEXT="Alternativamente è possibile selezionare due nodi usando il tasto Ctrl e scegliere "Aggiungi Collegamento grafico" dal menu inserisci o usando i tasti rapidi Ctrl + L" ID="ID_1564001222" CREATED="1216753755454" MODIFIED="1266487938112"/>
@@ -878,18 +781,18 @@
<node TEXT="Per cancellarlo usare il menu contestuale, tasto destro mouse sul collegamento grafico" ID="ID_1970882825" CREATED="1124560950717" MODIFIED="1266487973862"/>
<node TEXT="Per spostarsi da una estremità all'altra, usare il menu contestuale "vai a"." ID="_Freeplane_Link_266716332" CREATED="1124560950717" MODIFIED="1264596736155"/>
<node TEXT="Per cambiare il percorso, selezionarlo e muoverlo." ID="_Freeplane_Link_1015289745" CREATED="1124560950717" MODIFIED="1281272413919">
-<arrowlink DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="243;35;" ENDINCLINATION="255;31;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="243;35;" ENDINCLINATION="255;31;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Di seguito un esempio di Collegamenti grafici" ID="ID_1872914317" CREATED="1124560950717" MODIFIED="1266487996659"/>
<node TEXT="Esempio" FOLDED="true" ID="ID_46167995" CREATED="1124560950717" MODIFIED="1264596783453" COLOR="#996600">
<node TEXT="Collegamento ad un'altra parte" ID="_Freeplane_Link_1170112929" CREATED="1124560950717" MODIFIED="1264596803562" COLOR="#996600">
-<arrowlink COLOR="#9999ff" DESTINATION="_Freeplane_Link_1492563156" STARTINCLINATION="30;0;" ENDINCLINATION="116;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#9999ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1492563156" STARTINCLINATION="30;0;" ENDINCLINATION="116;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Nodo con discendente collassato" ID="ID_1991835511" CREATED="1124560950717" MODIFIED="1264682544671" COLOR="#996600">
<node TEXT="Subnodo" ID="_Freeplane_Link_1492563156" CREATED="1124560950717" MODIFIED="1266488016268"/>
</node>
<node TEXT="Un'altro collegamento" ID="_Freeplane_Link_1370577235" CREATED="1124560950717" MODIFIED="1281272538872" COLOR="#996600">
-<arrowlink DESTINATION="_Freeplane_Link_1170112929" SOURCE_LABEL="Etichetta" STARTINCLINATION="63;7;" ENDINCLINATION="63;7;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1170112929" SOURCE_LABEL="Etichetta" STARTINCLINATION="63;7;" ENDINCLINATION="63;7;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
@@ -906,65 +809,7 @@
</node>
<node TEXT="Usando testo avanzato (rich text) tramite l'HTML nei nodi" FOLDED="true" ID="Freeplane_Link_841140408" CREATED="1124560950732" MODIFIED="1281273089997" COLOR="#407000">
<node TEXT="E' possibile usare HTML nei nodi" ID="ID_1312572391" CREATED="1281273203090" MODIFIED="1281273218700"/>
-<node ID="ID_500316127" CREATED="1124560950732" MODIFIED="1265116137663">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <h3>
- Esempio HTML
- </h3>
- <p class="msonormal">
- Ci sono diversi elementi:
- </p>
- <ul type="disc">
- <li class="msonormal">
- Elemento uno
- </li>
- <li class="msonormal">
- Elemento due
- </li>
- </ul>
- <p class="msonormal">
- E' possibile rendere <b>grassetto</b> or <i>corsivo</i>. <u>Sottolineato</u> o <strike>barrato</strike> a piacere.
- </p>
- <p class="msonormal">
- E' possibile avere anche tabelle:
- </p>
- <table style="border: none" border="1" cellpadding="0" class="msonormaltable" cellspacing="0">
- <tr>
- <td style="border: solid windowtext 1.0pt; padding-bottom: .75pt; padding-top: .75pt; padding-left: .75pt; padding-right: .75pt">
- <p class="msonormal">
- Cell1
- </p>
- </td>
- <td style="padding-bottom: .75pt; border: solid windowtext 1.0pt; border-left: none; padding-top: .75pt; padding-left: .75pt; padding-right: .75pt">
- <p class="msonormal">
- Cell2
- </p>
- </td>
- </tr>
- <tr>
- <td style="padding-bottom: .75pt; border: solid windowtext 1.0pt; padding-top: .75pt; border-top: none; padding-left: .75pt; padding-right: .75pt">
- <p class="msonormal">
- Cell3
- </p>
- </td>
- <td style="border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; padding-bottom: .75pt; border-left: none; padding-top: .75pt; padding-left: .75pt; border-top: none; padding-right: .75pt">
- <p class="msonormal">
- Cell4.
- </p>
- </td>
- </tr>
- </table>
- <p class="msonormal">
- E avere diversi <font color="#990000">colori.</font>
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <h3>
 Esempio HTML
 </h3>
 <p class="msonormal">
 Ci sono diversi elementi:
 </p>
 <ul type="disc">
 <li class="msonormal">
 Elemento uno
 </li>
 <li class="msonormal">
 Elemento due
 </li>
 [...]
<node TEXT="Formato > Usa formattazione testo avanzata (Alt + Shift + R)
e Formato >Usa formattazione testo semplice (Alt + Shift + P) abilita e disabilita la formattazione testo avanzato." ID="ID_1651143780" CREATED="1281273225747" MODIFIED="1281273375419"/>
<node TEXT="I nodi che iniziano con <html> sono rappresentati usando il codice HTML in essi contenuto. Questa caratteristica è utile solo per chi conosce il codice HTML. Ecco un esempio." ID="ID_728074598" CREATED="1124560950732" MODIFIED="1265115170921"/>
<node TEXT="Non c'è però alcun supporto ai nodi HTML ed alle immagini per l'esportazione in formato testo. Usare HTML è utile per la pubblicazione web usando l'Applet di Freeplane." ID="ID_363130921" CREATED="1124560950732" MODIFIED="1265116277757">
@@ -990,49 +835,25 @@
</node>
<node TEXT="Esempio di immagini, funzionano solo su alcune versioni di Windows" FOLDED="true" ID="Freeplane_Link_1825247742" CREATED="1124560950732" MODIFIED="1266590214346" COLOR="#996600">
<font NAME="SansSerif" SIZE="12" BOLD="true"/>
-<node ID="ID_1796884514" CREATED="1124560950732" MODIFIED="1265285905216">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <img src="file:/C:/Windows/web/wallpaper/pesci.jpg"/>
- </p>
- </body>
-</html></richcontent>
-</node>
-<node ID="ID_929740034" CREATED="1124560950732" MODIFIED="1265286485564">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <img src="file:/C:/WINDOWS/Help/Tours/htmlTour/connected_data_big.jpg"/>
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <img src="file:/C:/Windows/web/wallpaper/pesci.jpg">
 </p>
 </body>
</html>" ID="ID_1796884514" CREATED="1124560950732" MODIFIED="1265285905216"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <img src="file:/C:/WINDOWS/Help/Tours/htmlTour/connected_data_big.jpg">
 </p>
 </body>
</html>" ID="ID_929740034" CREATED="1124560950732" MODIFIED="1265286485564"/>
<node TEXT="Stonehenge.jpg" FOLDED="true" ID="ID_1565800396" CREATED="1265285803981" MODIFIED="1265285803981" LINK="file:/C:/WINDOWS/Web/Wallpaper/Stonehenge.jpg">
<node TEXT="Tropici.jpg" ID="ID_1655134105" CREATED="1265285823091" MODIFIED="1265285823091" LINK="file:/C:/WINDOWS/Web/Wallpaper/Tropici.jpg"/>
</node>
<node TEXT="connected_wizard_big.jpg" ID="ID_1056169848" CREATED="1265286340078" MODIFIED="1281276597390" LINK="file:/C:/WINDOWS/Help/Tours/htmlTour/connected_wizard_big.jpg">
-<arrowlink DESTINATION="ID_1565800396" STARTINCLINATION="59;0;" ENDINCLINATION="59;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1565800396" STARTINCLINATION="59;0;" ENDINCLINATION="59;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="best_secure.jpg" ID="ID_1924901103" CREATED="1265286340078" MODIFIED="1281276597390" LINK="file:/C:/WINDOWS/Help/Tours/htmlTour/best_secure.jpg">
-<arrowlink DESTINATION="ID_1565800396" STARTINCLINATION="42;0;" ENDINCLINATION="42;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1565800396" STARTINCLINATION="42;0;" ENDINCLINATION="42;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="connected_data_big.jpg" ID="ID_666612005" CREATED="1265286340078" MODIFIED="1281276597390" LINK="file:/C:/WINDOWS/Help/Tours/htmlTour/connected_data_big.jpg">
-<arrowlink DESTINATION="ID_1565800396" STARTINCLINATION="77;0;" ENDINCLINATION="77;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1565800396" STARTINCLINATION="77;0;" ENDINCLINATION="77;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="connected_multiple.jpg" ID="ID_713772237" CREATED="1265286340078" MODIFIED="1281276597390" LINK="file:/C:/WINDOWS/Help/Tours/htmlTour/connected_multiple.jpg">
-<arrowlink DESTINATION="ID_1565800396" STARTINCLINATION="93;0;" ENDINCLINATION="93;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1565800396" STARTINCLINATION="93;0;" ENDINCLINATION="93;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
<node TEXT="Selezionando uno o più nodi precedenti e dare il comando Inserisci > Immagini (Alt + Shift + K) per trasformare i collegamenti in immagini" ID="ID_824926014" CREATED="1281276301468" MODIFIED="1281276632421">
-<arrowlink DESTINATION="ID_1565800396" STARTINCLINATION="509;0;" ENDINCLINATION="509;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1565800396" STARTINCLINATION="509;0;" ENDINCLINATION="509;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
@@ -1063,64 +884,19 @@
<node TEXT="La visualizzazione lineare è migliore per stampare mappe grandi" ID="ID_1468424700" CREATED="1281278029656" MODIFIED="1281278067562"/>
</node>
<node TEXT="Formattare un nodo" FOLDED="true" ID="Freeplane_Link_1660149394" CREATED="1124560950717" MODIFIED="1281278695187" COLOR="#407000">
-<node ID="ID_1173167518" CREATED="1124560950717" MODIFIED="1281278198500">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per trasformare tutto il testo del nodo selezionato in <b>Grassetto</b>, premere Ctrl + B.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per trasformare tutto il testo del nodo selezionato in <b>Grassetto</b>, premere Ctrl + B.
 </p>
 </body>
</html>" ID="ID_1173167518" CREATED="1124560950717" MODIFIED="1281278198500">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1510179977" CREATED="1124560950717" MODIFIED="1281278207046">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per trasformare tutto il testo del nodo selezionato in <i>Corsivo</i>, premere Ctrl + I.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per trasformare tutto il testo del nodo selezionato in <i>Corsivo</i>, premere Ctrl + I.
 </p>
 </body>
</html>" ID="ID_1510179977" CREATED="1124560950717" MODIFIED="1281278207046">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1156308247" CREATED="1124560950717" MODIFIED="1281278290296">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per trasformare tutto il <font color="#009933">colore</font> testo del nodo selezionato, usare Formato > Colore testo nodo o premere Alt+Shift+F
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per trasformare tutto il <font color="#009933">colore</font> testo del nodo selezionato, usare Formato > Colore testo nodo o premere Alt+Shift+F
 </p>
 </body>
</html>" ID="ID_1156308247" CREATED="1124560950717" MODIFIED="1281278290296">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node ID="ID_1322155516" CREATED="1124560950717" MODIFIED="1281278312750" BACKGROUND_COLOR="#ffffff">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p bgcolor="#999900" style="background-color: #999900; font-style: normal; font-weight: normal">
- Per cambiare il <font color="#ff0033">colore di sfondo</font> del nodo selezionato, usare Formato > Colore sfondo nodo.
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p bgcolor="#999900" style="background-color: #999900; font-style: normal; font-weight: normal">
 Per cambiare il <font color="#ff0033">colore di sfondo</font> del nodo selezionato, usare Formato > Colore sfondo nodo.
 </p>
 </body>
</html>" ID="ID_1322155516" CREATED="1124560950717" [...]
<node TEXT="Per incrementare la dimensione del testo, usare Formato > Aumenta carattere o premere i tasti Ctrl e + (non sul tastierino numerico)." ID="ID_1133062099" CREATED="1124560950717" MODIFIED="1281278456531">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="14"/>
@@ -1160,19 +936,7 @@
<node TEXT="Usare Stile Fisico" FOLDED="true" ID="Freeplane_Link_526328879" CREATED="1124560950717" MODIFIED="1266590062999" COLOR="#407000">
<node TEXT="Per applicare uno stile fisico, nel menu contestuale o principale usare Stile fisco > Stile a vostra scelta. Per velocizzarne l'utilizzo, usare le scorciatoie da tastiera come mostrato nel menu." ID="ID_1536109240" CREATED="1124560950717" MODIFIED="1281279359156"/>
<node TEXT="Per aggiungere uno stile personalizzato, andare nel menu Formato - Stile Fisico - Gestisci schemi." ID="ID_1043170096" CREATED="1124560950717" MODIFIED="1266590065983"/>
-<node ID="Freeplane_Link_1514218661" CREATED="1124560950717" MODIFIED="1281280843296" LINK="#ID_1478588436">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per <b>impostare i tasti rapidi</b> degli stili, andare nel menu Formato - Stile Fisico e tenendo premuto il stato Ctrl premere sullo stile a cui si vuole assegnare un tasto (come se si volesse usare il comando, ma premere Ctrl). Apparirà una finestra che chiederà quale tasto o combinazione di tasti assegnare.
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per <b>impostare i tasti rapidi</b> degli stili, andare nel menu Formato - Stile Fisico e tenendo premuto il stato Ctrl premere sullo stile a cui si vuole assegnare un tasto (come se si volesse usare il comando, ma premere Ctrl). Apparirà una finestra che chiederà quale tasto o combinazione di tasti assegnare.
 </p>&#x [...]
</node>
<node TEXT="Formattazione automatica" FOLDED="true" ID="ID_1643494769" CREATED="1281279223015" MODIFIED="1281279233812" COLOR="#407000">
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
@@ -1185,9 +949,9 @@
<node TEXT="Per aggiungere una nuvola, premere Ctrl + Shift + B o usare il menu contestuale (Inserisci > Nuvola) o l'icona nella barra principale." ID="ID_1892877253" CREATED="1124560950717" MODIFIED="1281279953812"/>
<node TEXT="Per cambiarne il colore, nel menu contestuale usare Formato > Colore Nuvola o l'icona nella barra principale." ID="ID_663408158" CREATED="1124560950717" MODIFIED="1281279967390"/>
<node TEXT="Le nuvole possono avere vari colori di sfondo, come verde ..." FOLDED="true" ID="ID_1958126929" CREATED="1124560950717" MODIFIED="1264423224914">
-<cloud COLOR="#e1f2e1" WIDTH="0"/>
+<cloud COLOR="#e1f2e1" SHAPE="ARC"/>
<node TEXT="... o marrone." ID="ID_1302420936" CREATED="1124560950717" MODIFIED="1264423235820">
-<cloud COLOR="#ede5d5" WIDTH="0"/>
+<cloud COLOR="#ede5d5" SHAPE="ARC"/>
</node>
</node>
</node>
@@ -1196,18 +960,7 @@
<font NAME="SansSerif" SIZE="12" BOLD="false" ITALIC="false"/>
<node TEXT="Impostare le preferenze" ID="Freeplane_Link_1822195277" CREATED="1124560950732" MODIFIED="1266590185470" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node FOLDED="true" ID="ID_1568044052" CREATED="1124560950732" MODIFIED="1281346142289">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per modificare le preferenze, dal menu <b>Strumenti</b> selezionare <b>Preferenze</b>. Oppure premere <b><font size="4">Ctrl ,</font></b> . Su Mac, si trovano in "Freeplane application menu". Molte delle modifiche avranno effetto solo dopo aver riavviato Freeplane.
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per modificare le preferenze, dal menu <b>Strumenti</b> selezionare <b>Preferenze</b>. Oppure premere <b><font size="4">Ctrl ,</font></b> . Su Mac, si trovano in "Freeplane application menu".  Molte delle modifiche avranno effetto solo dopo aver riavviato Free [...]
<node TEXT="E' possibile impostare i tasti rapidi, la modalità di esportazione HTML, il modo di selezionare i nodi, la grafica antialiasing e moltissime altre opzioni." ID="ID_546886704" CREATED="1124560950732" MODIFIED="1265114032533"/>
</node>
<node TEXT="Per assegnare un tasto rapido ad una voce del menu, usare Strumenti > Assegna scorciatoia. Poi cliccare sul menu desiderato e inserire la nuova combinazione di tasti. Se l'assegnamento è già in uso, ci sarà un avviso con richiesta di conferma." ID="ID_1440276670" CREATED="1281280331750" MODIFIED="1281280505812"/>
@@ -1217,36 +970,12 @@
</node>
<node TEXT="Usando il blocco file aperti da altri utenti" FOLDED="true" ID="ID_888201444" CREATED="1124560950732" MODIFIED="1266590220642" COLOR="#407000">
<node TEXT="La versione attuale di Freeplane, ha il blocco file inizialmente disabilitato." ID="ID_558116372" CREATED="1124560950732" MODIFIED="1281277241234"/>
-<node ID="ID_162718243" CREATED="1124560950732" MODIFIED="1265287301866">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per abilitare la funzione, dal menu <b>Strumenti</b> scegliere <b>Ambiente</b>, quindi selezionare il flag <b>Blocco file aperti da altri utenti</b>.
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per abilitare la funzione, dal menu <b>Strumenti</b> scegliere <b>Ambiente</b>, quindi selezionare il flag <b>Blocco file aperti da altri utenti</b>.
 </p>
 </body>
</html>" ID="ID_162718243" CREATED="1124560950732" MODIFIED="1265287301866"/>
<node TEXT="Il blocco file si assicura che più di un utente non editi la stessa mappa contemporaneamente. Viene così impedita la sovrascrittura accidentale con possibili perdite di dati." ID="ID_894551902" CREATED="1124560950732" MODIFIED="1265287213240"/>
</node>
<node TEXT="Stampa" FOLDED="true" ID="Freeplane_Link_1528828442" CREATED="1124560950732" MODIFIED="1281336068789" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node ID="ID_395608743" CREATED="1124560950732" MODIFIED="1265114438525">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- E' possibile stampare in modo da adattare la mappa alla pagina o stamparla su più pagine. La scelta si trova nel menu <b>File</b> - <b>Impostazione Pagina</b>.
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 E' possibile stampare in modo da adattare la mappa alla pagina o stamparla su più pagine. La scelta si trova nel menu <b>File</b> - <b>Impostazione Pagina</b>.
 </p>
 </body>
</html>" ID="ID_395608743" CREATED="1124560950732" MODIFIED="1265114438525"/>
<node TEXT="Per migliorare l'uso dello spazio, impostare la pagina in orizzontale." ID="ID_653074622" CREATED="1124560950732" MODIFIED="1265114499545">
<font NAME="SansSerif" SIZE="12"/>
</node>
@@ -1262,45 +991,9 @@
<node TEXT="Gli scripts possono usare alcune funzionalità che si trovano nelle librerie incluse in Freeplane" ID="ID_699827491" CREATED="1281337267343" MODIFIED="1281337323688"/>
</node>
<node TEXT="Gli script possono essere definiti in tre modi" FOLDED="true" ID="ID_702371652" CREATED="1281337348031" MODIFIED="1281338657210">
-<node ID="ID_1673352790" CREATED="1271022419501" MODIFIED="1281338617397">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <b>I Groovy scripts esterni</b> possono essere integrati semplicemente dicendo a Freeplane dove sono. Questi script possono usati esattamente come le altre funzioni di Freeplane.
- </p>
- </body>
-</html></richcontent>
-</node>
-<node ID="ID_1600595382" CREATED="1281338281777" MODIFIED="1281338649757">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <b>Gli stili fisici</b> possono contenere <b>scripts</b> con lo scopo di formattare la mappa. Esse sono automaticamente applicati a qualsiasi nodo, quando vengono eseguiti.
- </p>
- </body>
-</html></richcontent>
-</node>
-<node ID="ID_209164216" CREATED="1281338386094" MODIFIED="1281338589474">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- <b>Gli script della mappa locale</b>, possono essere definiti all'interno della mappa come attributi dei nodi. Questi script sono incorporati nella mappa, così diventa facile trasportarli su altri computer. Un editor speciale incorporato viene usato per editare gli script locali.
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <b>I Groovy scripts esterni</b> possono essere integrati semplicemente dicendo a Freeplane dove sono. Questi script possono usati esattamente come le altre funzioni di Freeplane.
 </p>
 </body>
</html>" ID="ID_1673352790" CREATED="1271022419501" MODIFIED="1281338617397"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <b>Gli stili fisici</b> possono contenere <b>scripts</b> con lo scopo di formattare la mappa. Esse sono automaticamente applicati a qualsiasi nodo, quando vengono eseguiti.
 </p>
 </body>
</html>" ID="ID_1600595382" CREATED="1281338281777" MODIFIED="1281338649757"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 <b>Gli script della mappa locale</b>, possono essere definiti all'interno della mappa come attributi dei nodi. Questi script sono incorporati nella mappa, così diventa facile trasportarli su altri computer. Un editor speciale incorporato viene usato per editare gli script locali.
 </p>
 </body>
</html>" ID="ID_ [...]
</node>
<node TEXT="La pagina Wiki di Freeplane ha informazioni estese in merito." ID="ID_807882630" CREATED="1271022540079" MODIFIED="1281337409610" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting"/>
</node>
@@ -1360,17 +1053,7 @@
<node TEXT="Importare i preferiti di Internet Explorer" FOLDED="true" ID="Freeplane_Link_269203785" CREATED="1124560950732" MODIFIED="1266590169126" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node ID="Freeplane_Link_260446736" CREATED="1124560950732" MODIFIED="1265106114643">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- Per importare e preferiti di Internet Explorer, dal menu File - Importa - Importa favoriti di Explorer... Verrà richiesto di inserire il percorso della cartella dove sono salvati. Il nome della cartella è favoriti ed il percorso in Windows XP è C:\Documents and Settings\<utente>\Preferiti.
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 Per importare e preferiti di Internet Explorer, dal menu File - Importa - Importa favoriti di Explorer... Verrà richiesto di inserire il percorso della cartella dove sono salvati. Il nome della cartella è favoriti ed il percorso in Windows XP è  C:\Documents and Settings\<utente>\Preferiti.
 </body>
</html>" ID [...]
</node>
<node TEXT="Importare mappe di MindManager X5" FOLDED="true" ID="Freeplane_Link_1709974530" CREATED="1124560950732" MODIFIED="1266590176861" COLOR="#407000">
<node TEXT="Per importarle, dal menu File - Importa scegliere MindManager X5 map." ID="ID_529264217" CREATED="1124560950732" MODIFIED="1265107128079"/>
@@ -1395,33 +1078,9 @@
<node TEXT="Il salvataggio automatico ed il backup, possono essere configurati dal menu Strumenti > Preferenze > Ambiente > Salvataggio automatico." ID="ID_1200101311" CREATED="1281339709071" MODIFIED="1281339777743"/>
</node>
<node TEXT="Esplorare i file del proprio computer" FOLDED="true" ID="_Freeplane_Link_353522063" CREATED="1124560950701" MODIFIED="1281339039401" COLOR="#407000">
-<node ID="ID_791380611" CREATED="1124560950701" MODIFIED="1265296613313">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per esplorare i file del PC, commutare in <b>Esplora</b> <b>File</b> dal menu <b>Mappe</b>.
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per esplorare i file del PC, commutare in <b>Esplora</b> <b>File</b>  dal menu <b>Mappe</b>.
 </p>
 </body>
</html>" ID="ID_791380611" CREATED="1124560950701" MODIFIED="1265296613313"/>
<node TEXT="Verrà visualizzata la struttura dei file, come se fosse una mappa" ID="ID_180885850" CREATED="1124560950701" MODIFIED="1265296675110"/>
-<node ID="ID_700476761" CREATED="1124560950701" MODIFIED="1265296795251">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <p>
- Per fare diventare una cartella il nodo centrale, dal menu contestuale scegliere <b>Centra</b>.
- </p>
- </body>
-</html></richcontent>
-</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Per fare diventare una cartella il nodo centrale, dal menu contestuale scegliere <b>Centra</b>.
 </p>
 </body>
</html>" ID="ID_700476761" CREATED="1124560950701" MODIFIED="1265296795251"/>
<node TEXT="Per vedere, modificare o eseguire un file, seguire il collegamento sul nodo stesso." ID="ID_362239329" CREATED="1124560950701" MODIFIED="1265302454799"/>
<node TEXT="La modalità esplora file, attualmente non è veramente comoda. E' una dimostrazione che è semplice seguire i dati dell'albero visualizzato come mappa. Non molti usano attualmente questa modalità." ID="_Freeplane_Link_279880616" CREATED="1124560950701" MODIFIED="1265302595972"/>
</node>
@@ -1432,5 +1091,3 @@
</node>
</node>
</map>
-
-
diff --git a/freeplane/doc/freeplane_ja.mm b/freeplane/doc/freeplane_ja.mm
index 06d29bd..fb8a79f 100644
--- a/freeplane/doc/freeplane_ja.mm
+++ b/freeplane/doc/freeplane_ja.mm
@@ -1,10 +1,10 @@
-<map version="freeplane 1.2.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
<attribute_registry>
<attribute_name VISIBLE="true" NAME="See also"/>
<attribute_name VISIBLE="true" NAME="a2"/>
</attribute_registry>
-<node TEXT="マニュアル
Freeplane 1.2" STYLE_REF="MainMenu" FOLDED="false" ID="ID_1723255651" VGAP="0">
+<node TEXT="マニュアル
Freeplane 1.2" STYLE_REF="MainMenu" FOLDED="false" ID="ID_1723255651" CREATED="1455910948844" MODIFIED="1465678951781" VGAP_QUANTITY="0.0 px">
<icon BUILTIN="bee"/>
<hook NAME="MapStyle">
<conditional_styles>
@@ -12,11 +12,12 @@
<time_condition_modified_after user_name="1.2.12_03" DATE="1330531663397"/>
</conditional_style>
</conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true" show_notes_in_map="false"/>
+ <properties fit_to_viewport="false;" show_icon_for_attributes="false" show_note_icons="true" show_notes_in_map="false"/>
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt">
+<font SIZE="24"/>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
<stylenode TEXT="Definition">
<font ITALIC="true"/>
<edge STYLE="bezier" COLOR="#808080"/>
@@ -56,7 +57,7 @@
</stylenode>
<stylenode TEXT="MenuGroupLabel" COLOR="#000000" BACKGROUND_COLOR="#33ffcc" STYLE="bubble">
<edge COLOR="#33ffcc" WIDTH="2"/>
-<attribute_layout NAME_WIDTH="78" VALUE_WIDTH="116"/>
+<attribute_layout NAME_WIDTH="58.5 pt" VALUE_WIDTH="87.0 pt"/>
</stylenode>
<stylenode TEXT="Title" COLOR="#ffffff" BACKGROUND_COLOR="#2ed2a9" STYLE="bubble">
<font BOLD="true"/>
@@ -92,12 +93,15 @@
<icon BUILTIN="yes"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="default" FORMAT_AS_HYPERLINK="true">
<edge COLOR="#808080" WIDTH="thin"/>
<font SIZE="8"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes">
+<font SIZE="9"/>
+</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.note">
<edge COLOR="#cc0000"/>
</stylenode>
@@ -106,7 +110,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
</stylenode>
</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
<font SIZE="20"/>
</stylenode>
@@ -150,7 +154,7 @@
</body>
</html>
</richcontent>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" FOLDED="true" POSITION="right" ID="ID_232622736" HGAP="-5" VSHIFT="-104" STYLE="fork" TEXT_SHORTENED="true" LINK="freeplaneFunctions_ja.mm"><richcontent TYPE="NODE">
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" FOLDED="true" POSITION="right" ID="ID_232622736" CREATED="1455910948847" MODIFIED="1465678948421" LINK="freeplaneFunctions_ja.mm" HGAP_QUANTITY="-35.0 px" VSHIFT_QUANTITY="-119.0 px" STYLE="fork" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -162,6 +166,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -188,7 +193,7 @@
</html>
</richcontent>
<hook NAME="FreeNode"/>
-<node ID="ID_766584529" HGAP="-85" VSHIFT="28" STYLE="fork" TEXT_SHORTENED="true" LINK="freeplaneApplications_ja.mm"><richcontent TYPE="NODE">
+<node ID="ID_766584529" CREATED="1455910948847" MODIFIED="1455910948847" LINK="freeplaneApplications_ja.mm" HGAP_QUANTITY="-85.0 px" VSHIFT_QUANTITY="28.0 px" STYLE="fork" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -200,6 +205,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -228,7 +234,7 @@
<hook NAME="AlwaysUnfoldedNode"/>
</node>
</node>
-<node TEXT="リファレンス" STYLE_REF="Title" FOLDED="true" POSITION="right" ID="ID_332175012" HGAP="-37" VSHIFT="-64" TEXT_SHORTENED="true">
+<node TEXT="リファレンス" STYLE_REF="Title" FOLDED="true" POSITION="right" ID="ID_332175012" CREATED="1455910948847" MODIFIED="1465678951781" HGAP_QUANTITY="-30.0 px" VSHIFT_QUANTITY="-59.0 px" TEXT_SHORTENED="true">
<icon BUILTIN="wizard"/>
<richcontent TYPE="DETAILS">
@@ -270,8 +276,8 @@
</html>
</richcontent>
<edge STYLE="bezier"/>
-<node TEXT="ファイル" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1242926404" TEXT_SHORTENED="true" MIN_WIDTH="60" HGAP="19" VSHIFT="27">
-<attribute_layout NAME_WIDTH="37" VALUE_WIDTH="77"/>
+<node TEXT="ファイル" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1242926404" CREATED="1455910948847" MODIFIED="1455910948847" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px" HGAP_QUANTITY="19.0 px" VSHIFT_QUANTITY="27.0 px">
+<attribute_layout NAME_WIDTH="27.75 pt" VALUE_WIDTH="57.75 pt"/>
<attribute NAME="Chapter" VALUE="1,2,6,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
@@ -289,7 +295,10 @@
</body>
</html>
</richcontent>
-<node TEXT="新規マップ" ID="ID_1310307853">
+<node TEXT="" ID="ID_496807645" CREATED="1455910949155" MODIFIED="1455910949155">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="新規マップ" ID="ID_1310307853" CREATED="1455910948848" MODIFIED="1455910948848">
<icon BUILTIN="../filenew"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -304,13 +313,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="テンプレートから新規マップ ..." ID="ID_1630948273" TEXT_SHORTENED="true">
+<node TEXT="テンプレートから新規マップ ..." ID="ID_1630948273" CREATED="1455910948849" MODIFIED="1455910948849" TEXT_SHORTENED="true">
<icon BUILTIN="../new_map_"/>
<richcontent TYPE="DETAILS">
@@ -330,7 +338,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="保護(暗証)付き新規マップ..." ID="ID_1015806590" TEXT_SHORTENED="true">
+<node TEXT="保護(暗証)付き新規マップ..." ID="ID_1015806590" CREATED="1455910948849" MODIFIED="1455910948849" TEXT_SHORTENED="true">
<icon BUILTIN="../lock"/>
<richcontent TYPE="DETAILS">
@@ -364,7 +372,7 @@
</hook>
<attribute NAME="Chapter" VALUE="8"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="" ID="ID_43524792" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_43524792" CREATED="1455910948850" MODIFIED="1455910948850" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -390,14 +398,19 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="新規マップを作成" ID="ID_177723183">
+<node TEXT="" ID="ID_794508543" CREATED="1455910949158" MODIFIED="1455910949158">
<hook NAME="SummaryNode"/>
+<node TEXT="新規マップを作成" ID="ID_177723183" CREATED="1455910948850" MODIFIED="1455910948850">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2,8"/>
</node>
-<node TEXT="マップを(上書き)保存" ID="ID_1253878525" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1268351308" CREATED="1455910949158" MODIFIED="1455910949158">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="マップを(上書き)保存" ID="ID_1253878525" CREATED="1455910948850" MODIFIED="1455910948850" TEXT_SHORTENED="true">
<icon BUILTIN="../filesave"/>
<richcontent TYPE="DETAILS">
@@ -436,7 +449,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
</node>
-<node TEXT="名前をつけてマップを保存..." ID="ID_449363060" TEXT_SHORTENED="true">
+<node TEXT="名前をつけてマップを保存..." ID="ID_449363060" CREATED="1455910948851" MODIFIED="1455910948851" TEXT_SHORTENED="true">
<icon BUILTIN="../filesaveas"/>
<richcontent TYPE="DETAILS">
@@ -456,7 +469,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="すべてのマップを保存" ID="ID_1423263542" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="すべてのマップを保存" ID="ID_1423263542" CREATED="1455910948852" MODIFIED="1455910948852" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -473,7 +486,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="履歴ファイルから復元" ID="ID_1896010117" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="履歴ファイルから復元" ID="ID_1896010117" CREATED="1455910948852" MODIFIED="1455910948852" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -512,14 +525,15 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="マップを保存" ID="ID_1689022735">
+<node TEXT="" ID="ID_1984304087" CREATED="1455910949158" MODIFIED="1455910949158">
<hook NAME="SummaryNode"/>
+<node TEXT="マップを保存" ID="ID_1689022735" CREATED="1455910948852" MODIFIED="1455910948852">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="折り畳み状態を保存" ID="ID_1155653392" TEXT_SHORTENED="true">
+<node TEXT="折り畳み状態を保存" ID="ID_1155653392" CREATED="1455910948852" MODIFIED="1455910948852" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -545,7 +559,11 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="保存マップを開く..." ID="ID_1284635316" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1083461221" CREATED="1455910949158" MODIFIED="1455910949158">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="保存マップを開く..." ID="ID_1284635316" CREATED="1455910948852" MODIFIED="1455910948852" TEXT_SHORTENED="true">
<icon BUILTIN="../fileopen"/>
<richcontent TYPE="DETAILS">
@@ -560,13 +578,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
</node>
-<node TEXT="URLからマップを開く..." ID="ID_351944217" TEXT_SHORTENED="true">
+<node TEXT="URLからマップを開く..." ID="ID_351944217" CREATED="1455910948853" MODIFIED="1455910948853" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -584,7 +601,7 @@
</html>
</richcontent>
</node>
-<node TEXT="最近使ったマップ" ID="ID_655783347" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="最近使ったマップ" ID="ID_655783347" CREATED="1455910948853" MODIFIED="1455910948853" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -606,14 +623,15 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="マップを開く" ID="ID_565242033">
+<node TEXT="" ID="ID_1628070574" CREATED="1455910949158" MODIFIED="1455910949158">
<hook NAME="SummaryNode"/>
+<node TEXT="マップを開く" ID="ID_565242033" CREATED="1455910948853" MODIFIED="1455910948853">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="読み込み関連設定" ID="ID_553299918">
+<node TEXT="読み込み関連設定" ID="ID_553299918" CREATED="1455910948853" MODIFIED="1455910948853">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -621,7 +639,11 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="マップをエクスポート" FOLDED="true" ID="ID_1294197740" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1266682647" CREATED="1455910949159" MODIFIED="1455910949159">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="マップをエクスポート" FOLDED="true" ID="ID_1294197740" CREATED="1455910948853" MODIFIED="1455910948853" TEXT_SHORTENED="true">
<icon BUILTIN="../export"/>
<richcontent TYPE="DETAILS">
@@ -640,12 +662,14 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
-<node TEXT="HTML ファイルに" STYLE_REF="OptionalValue" ID="ID_289318260" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_564550030" CREATED="1455910949159" MODIFIED="1455910949159">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="HTML ファイルに" STYLE_REF="OptionalValue" ID="ID_289318260" CREATED="1455910948854" MODIFIED="1455910948854" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -658,10 +682,9 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node STYLE_REF="OptionalValue" ID="ID_1222466772" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node STYLE_REF="OptionalValue" ID="ID_1222466772" CREATED="1455910948854" MODIFIED="1455910948854" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -677,6 +700,7 @@
</div>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -700,7 +724,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node STYLE_REF="OptionalValue" ID="ID_413819995" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node STYLE_REF="OptionalValue" ID="ID_413819995" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -716,6 +740,7 @@
</div>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -732,7 +757,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="PNG 画像に" STYLE_REF="OptionalValue" ID="ID_1720625924" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="PNG 画像に" STYLE_REF="OptionalValue" ID="ID_1720625924" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -747,7 +772,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="JPEG 画像に" STYLE_REF="OptionalValue" ID="ID_760837856" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="JPEG 画像に" STYLE_REF="OptionalValue" ID="ID_760837856" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -762,7 +787,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="XHTML(Javascript 版)に" STYLE_REF="OptionalValue" ID="ID_1701842398" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="XHTML(Javascript 版)に" STYLE_REF="OptionalValue" ID="ID_1701842398" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -777,7 +802,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node STYLE_REF="OptionalValue" ID="ID_519681176" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node STYLE_REF="OptionalValue" ID="ID_519681176" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -802,6 +827,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -822,7 +848,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Java アプレットに(HTML)" STYLE_REF="OptionalValue" ID="ID_376134497" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Java アプレットに(HTML)" STYLE_REF="OptionalValue" ID="ID_376134497" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -837,8 +863,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="ウェブサイトでの公開とシェア" ID="ID_126764093" TEXT_SHORTENED="true">
-<hook NAME="SummaryNode"/>
+<node TEXT="ウェブサイトでの公開とシェア" ID="ID_126764093" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -890,7 +915,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Flash に(HTML)" STYLE_REF="OptionalValue" ID="ID_1614795199" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Flash に(HTML)" STYLE_REF="OptionalValue" ID="ID_1614795199" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -905,7 +930,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="タスクを TASKS ノードから TaskJuggler ファイルに(TJI)" STYLE_REF="OptionalValue" ID="ID_1149086587" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="タスクを TASKS ノードから TaskJuggler ファイルに(TJI)" STYLE_REF="OptionalValue" ID="ID_1149086587" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -920,7 +945,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="リソースを RESOURCES ノードから TaskJuggler ファイルに(TJI)" STYLE_REF="OptionalValue" ID="ID_148675074" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="リソースを RESOURCES ノードから TaskJuggler ファイルに(TJI)" STYLE_REF="OptionalValue" ID="ID_148675074" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -935,7 +960,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="TWiki に(TW)" STYLE_REF="OptionalValue" ID="ID_107208189" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="TWiki に(TW)" STYLE_REF="OptionalValue" ID="ID_107208189" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -950,43 +975,43 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Freeplane 1.1 ファイルに" STYLE_REF="OptionalValue" ID="ID_1737656870" TEXT_SHORTENED="true">
+<node TEXT="Freeplane 1.1 ファイルに" STYLE_REF="OptionalValue" ID="ID_1737656870" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="HTML ファイルに(HTM、HTML)" STYLE_REF="OptionalValue" ID="ID_1085699848" TEXT_SHORTENED="true">
+<node TEXT="HTML ファイルに(HTM、HTML)" STYLE_REF="OptionalValue" ID="ID_1085699848" CREATED="1455910948855" MODIFIED="1455910948855" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="LaTeX ファイルに(TEX)" STYLE_REF="OptionalValue" ID="ID_105191845" TEXT_SHORTENED="true">
+<node TEXT="LaTeX ファイルに(TEX)" STYLE_REF="OptionalValue" ID="ID_105191845" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="LaTeX ブックに(TXT)" STYLE_REF="OptionalValue" ID="ID_1955179559" TEXT_SHORTENED="true">
+<node TEXT="LaTeX ブックに(TXT)" STYLE_REF="OptionalValue" ID="ID_1955179559" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="MS Project 2003 に(XML)" STYLE_REF="OptionalValue" ID="ID_1056023013" TEXT_SHORTENED="true">
+<node TEXT="MS Project 2003 に(XML)" STYLE_REF="OptionalValue" ID="ID_1056023013" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Mediawiki に(MWIKI)" STYLE_REF="OptionalValue" ID="ID_80736991" TEXT_SHORTENED="true">
+<node TEXT="Mediawiki に(MWIKI)" STYLE_REF="OptionalValue" ID="ID_80736991" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Oowriter ファイルに(OOWRITER)" STYLE_REF="OptionalValue" ID="ID_878113260" TEXT_SHORTENED="true">
+<node TEXT="Oowriter ファイルに(OOWRITER)" STYLE_REF="OptionalValue" ID="ID_878113260" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="OPML ファイルに(OPML)" STYLE_REF="OptionalValue" ID="ID_1694858774" TEXT_SHORTENED="true">
+<node TEXT="OPML ファイルに(OPML)" STYLE_REF="OptionalValue" ID="ID_1694858774" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="プレーンテキストに(TXT)" STYLE_REF="OptionalValue" ID="ID_449065508" TEXT_SHORTENED="true">
+<node TEXT="プレーンテキストに(TXT)" STYLE_REF="OptionalValue" ID="ID_449065508" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Word 2003 以降版に(DOC, XML)" STYLE_REF="OptionalValue" ID="ID_1705171054" TEXT_SHORTENED="true">
+<node TEXT="Word 2003 以降版に(DOC, XML)" STYLE_REF="OptionalValue" ID="ID_1705171054" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="XBEL ファイルに" STYLE_REF="OptionalValue" ID="ID_366462703" TEXT_SHORTENED="true">
+<node TEXT="XBEL ファイルに" STYLE_REF="OptionalValue" ID="ID_366462703" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="(XML, XLS)" STYLE_REF="OptionalValue" ID="ID_944473030" TEXT_SHORTENED="true">
+<node TEXT="(XML, XLS)" STYLE_REF="OptionalValue" ID="ID_944473030" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="PDF ファイルに" STYLE_REF="OptionalValue" ID="ID_1473392398" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="PDF ファイルに" STYLE_REF="OptionalValue" ID="ID_1473392398" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -1001,7 +1026,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="SVG 画像に" STYLE_REF="OptionalValue" ID="ID_1270778319" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="SVG 画像に" STYLE_REF="OptionalValue" ID="ID_1270778319" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -1016,8 +1041,9 @@
</richcontent>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="" FOLDED="true" ID="ID_783046977" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_312569689" CREATED="1455910949159" MODIFIED="1455910949159">
<hook NAME="SummaryNode"/>
+<node TEXT="" FOLDED="true" ID="ID_783046977" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -1057,7 +1083,7 @@
</html>
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="他のエディタへ" ID="ID_916000315"><richcontent TYPE="DETAILS">
+<node TEXT="他のエディタへ" ID="ID_916000315" CREATED="1455910948856" MODIFIED="1455910948856"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1074,7 +1100,8 @@
</node>
</node>
</node>
-<node TEXT="枝を新しいマップに..." ID="ID_995694574" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="枝を新しいマップに..." ID="ID_995694574" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1096,33 +1123,36 @@
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="マップにインポート" FOLDED="true" ID="ID_977906606" TEXT_SHORTENED="true">
+<node TEXT="マップにインポート" FOLDED="true" ID="ID_977906606" CREATED="1455910948856" MODIFIED="1455910948856" TEXT_SHORTENED="true">
<icon BUILTIN="../import"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
-<node TEXT="別マップを枝として..." STYLE_REF="OptionalValue" ID="ID_1943364050" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_298057892" CREATED="1455910949159" MODIFIED="1455910949159">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="別マップを枝として..." STYLE_REF="OptionalValue" ID="ID_1943364050" CREATED="1455910948857" MODIFIED="1455910948857" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="リンク先マップを、枝として" STYLE_REF="OptionalValue" ID="ID_437986291" TEXT_SHORTENED="true">
+<node TEXT="リンク先マップを、枝として" STYLE_REF="OptionalValue" ID="ID_437986291" CREATED="1455910948857" MODIFIED="1455910948857" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="リンク先マップのルート以外を、枝として" STYLE_REF="OptionalValue" ID="ID_676975317" TEXT_SHORTENED="true">
+<node TEXT="リンク先マップのルート以外を、枝として" STYLE_REF="OptionalValue" ID="ID_676975317" CREATED="1455910948857" MODIFIED="1455910948857" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="Explorer のお気に入りを..." STYLE_REF="OptionalValue" ID="ID_1111015619" TEXT_SHORTENED="true">
+<node TEXT="Explorer のお気に入りを..." STYLE_REF="OptionalValue" ID="ID_1111015619" CREATED="1455910948857" MODIFIED="1455910948857" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="フォルダ構造を..." STYLE_REF="OptionalValue" ID="ID_1133473891" TEXT_SHORTENED="true">
+<node TEXT="フォルダ構造を..." STYLE_REF="OptionalValue" ID="ID_1133473891" CREATED="1455910948857" MODIFIED="1455910948857" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="MindManager X5 マップを..." STYLE_REF="OptionalValue" ID="ID_1936806780" TEXT_SHORTENED="true">
+<node TEXT="MindManager X5 マップを..." STYLE_REF="OptionalValue" ID="ID_1936806780" CREATED="1455910948857" MODIFIED="1455910948857" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="環境設定を参照" ID="ID_1138762077" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_470559001" CREATED="1455910949159" MODIFIED="1455910949159">
<hook NAME="SummaryNode"/>
+<node TEXT="環境設定を参照" ID="ID_1138762077" CREATED="1455910948857" MODIFIED="1455910948857" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -1152,14 +1182,20 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="マップのインポート/エクスポート" ID="ID_1827918008" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_501693769" CREATED="1455910949159" MODIFIED="1455910949159">
<hook NAME="SummaryNode"/>
+<node TEXT="マップのインポート/エクスポート" ID="ID_1827918008" CREATED="1455910948857" MODIFIED="1455910948857" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="印刷設定..." ID="ID_1629904320" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="" ID="ID_1184902075" CREATED="1455910949159" MODIFIED="1455910949159">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="印刷設定..." ID="ID_1629904320" CREATED="1455910948858" MODIFIED="1455910948858" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1216,13 +1252,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="印刷プレビュー..." ID="ID_741687932" TEXT_SHORTENED="true">
+<node TEXT="印刷プレビュー..." ID="ID_741687932" CREATED="1455910948858" MODIFIED="1455910948858" TEXT_SHORTENED="true">
<icon BUILTIN="../print_preview"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -1253,7 +1288,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="マップを印刷..." ID="ID_1054511597" TEXT_SHORTENED="true">
+<node TEXT="マップを印刷..." ID="ID_1054511597" CREATED="1455910948859" MODIFIED="1455910948859" TEXT_SHORTENED="true">
<icon BUILTIN="../fileprint"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -1273,20 +1308,22 @@
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="マップを印刷" ID="ID_1010250538" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_388892334" CREATED="1455910949160" MODIFIED="1455910949160">
<hook NAME="SummaryNode"/>
+<node TEXT="マップを印刷" ID="ID_1010250538" CREATED="1455910948860" MODIFIED="1455910948860" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2,6"/>
</node>
-<node TEXT="マップデータ" ID="ID_1988842350" TEXT_SHORTENED="true">
+</node>
+<node TEXT="マップデータ" ID="ID_1988842350" CREATED="1455910948860" MODIFIED="1455910948860" TEXT_SHORTENED="true">
<icon BUILTIN="../BranchStats"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="表示中のマップを閉じる" ID="ID_32998508" TEXT_SHORTENED="true">
+<node TEXT="表示中のマップを閉じる" ID="ID_32998508" CREATED="1455910948860" MODIFIED="1455910948860" TEXT_SHORTENED="true">
<icon BUILTIN="../close"/>
<richcontent TYPE="DETAILS">
@@ -1306,7 +1343,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="Freeplane を終了" ID="ID_623268381" TEXT_SHORTENED="true">
+<node TEXT="Freeplane を終了" ID="ID_623268381" CREATED="1455910948861" MODIFIED="1455910948861" TEXT_SHORTENED="true">
<icon BUILTIN="../quit"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -1325,7 +1362,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="編  集" FOLDED="true" ID="ID_1198850460" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<node TEXT="編  集" FOLDED="true" ID="ID_1198850460" CREATED="1455910948862" MODIFIED="1455910948862" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
@@ -1347,11 +1384,14 @@
</body>
</html>
</richcontent>
-<node TEXT="新規ノード作成" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1557207269" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1344292618" CREATED="1455910949160" MODIFIED="1455910949160">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="新規ノード作成" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1557207269" CREATED="1455910948862" MODIFIED="1455910948862" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<node TEXT="新規子ノード" ID="ID_942355748" TEXT_SHORTENED="true">
+<node TEXT="新規子ノード" ID="ID_942355748" CREATED="1455910948862" MODIFIED="1455910948862" TEXT_SHORTENED="true">
<icon BUILTIN="../idea"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -1384,7 +1424,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="新規弟ノード" ID="ID_1544212529" TEXT_SHORTENED="true">
+<node TEXT="新規弟ノード" ID="ID_1544212529" CREATED="1455910948863" MODIFIED="1455910948863" TEXT_SHORTENED="true">
<icon BUILTIN="../NewSiblingAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -1417,7 +1457,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="新規兄ノード" ID="ID_852536639" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="新規兄ノード" ID="ID_852536639" CREATED="1455910948864" MODIFIED="1455910948864" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1445,7 +1485,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="新規親ノード" ID="ID_1509185966" TEXT_SHORTENED="true">
+<node TEXT="新規親ノード" ID="ID_1509185966" CREATED="1455910948864" MODIFIED="1455910948864" TEXT_SHORTENED="true">
<icon BUILTIN="../stock_text_indent"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -1475,7 +1515,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="新規フリーノード" ID="ID_389982270" TEXT_SHORTENED="true">
+<node TEXT="新規フリーノード" ID="ID_389982270" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -1493,7 +1533,7 @@
</html>
</richcontent>
</node>
-<node TEXT="新規まとめノード(選択ノード群)" FOLDED="true" ID="ID_1126176775" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="新規まとめノード(選択ノード群)" FOLDED="true" ID="ID_1126176775" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1534,8 +1574,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="" ID="ID_805111336" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_805111336" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -1562,7 +1601,7 @@
</html>
</richcontent>
</node>
-<node TEXT="" ID="ID_1070404224" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1070404224" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -1587,7 +1626,7 @@
</html>
</richcontent>
</node>
-<node TEXT="まとめノード/波括弧" FOLDED="true" ID="ID_1919219984" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="まとめノード/波括弧" FOLDED="true" ID="ID_1919219984" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1623,33 +1662,37 @@
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
-<node TEXT="" FOLDED="true" ID="ID_1195560268">
+<node TEXT="" FOLDED="true" ID="ID_1195560268" CREATED="1455910948865" MODIFIED="1455910948865">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="1" ID="ID_1351236194" TEXT_SHORTENED="true">
+<node TEXT="1" ID="ID_1351236194" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
</node>
-<node TEXT="2" FOLDED="true" ID="ID_1855113133" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_73499939" CREATED="1455910949160" MODIFIED="1455910949160">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="2" FOLDED="true" ID="ID_1855113133" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
-<node TEXT="xx" ID="ID_1443415412" TEXT_SHORTENED="true"/>
+<node TEXT="xx" ID="ID_1443415412" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="3" ID="ID_642318706" TEXT_SHORTENED="true">
+<node TEXT="3" ID="ID_642318706" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
</node>
-<node TEXT="4 = まとめノード" ID="ID_248628187" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_381395029" CREATED="1455910949160" MODIFIED="1455910949160">
<hook NAME="SummaryNode"/>
+<node TEXT="4 = まとめノード" ID="ID_248628187" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
</node>
-<node TEXT="5" ID="ID_24722596" TEXT_SHORTENED="true">
+</node>
+<node TEXT="5" ID="ID_24722596" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
</node>
</node>
</node>
</node>
</node>
-<node TEXT="ノードグループ" STYLE_REF="SubMenu" ID="ID_1984748861" TEXT_SHORTENED="true"/>
-<node TEXT="ノードグループ" STYLE_REF="SubMenu" FOLDED="true" ID="ID_479655918">
-<node TEXT="まとめノード群の始点" FOLDED="true" ID="ID_428394610" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ノードグループ" STYLE_REF="SubMenu" ID="ID_1984748861" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true"/>
+<node TEXT="ノードグループ" STYLE_REF="SubMenu" FOLDED="true" ID="ID_479655918" CREATED="1455910948865" MODIFIED="1455910948865">
+<node TEXT="まとめノード群の始点" FOLDED="true" ID="ID_428394610" CREATED="1455910948865" MODIFIED="1455910948865" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1698,7 +1741,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="ノード群" ID="ID_1499184609" TEXT_SHORTENED="true">
+<node TEXT="ノード群" ID="ID_1499184609" CREATED="1455910948866" MODIFIED="1455910948866" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -1734,7 +1777,7 @@
</richcontent>
</node>
</node>
-<node TEXT="まとめノードに指定/解除" ID="ID_34031772" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="まとめノードに指定/解除" ID="ID_34031772" CREATED="1455910948866" MODIFIED="1455910948866" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1779,7 +1822,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="常にノードを展開(オン/オフ)" STYLE_REF="Method" ID="ID_1594802269" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="常にノードを展開(オン/オフ)" STYLE_REF="Method" ID="ID_1594802269" CREATED="1455910948866" MODIFIED="1455910948866" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -1793,7 +1836,7 @@
</html>
</richcontent>
</node>
-<node TEXT="雲(標準)を付加/削除" ID="ID_1169707898" TEXT_SHORTENED="true">
+<node TEXT="雲(標準)を付加/削除" ID="ID_1169707898" CREATED="1455910948866" MODIFIED="1455910948866" TEXT_SHORTENED="true">
<icon BUILTIN="../Cloud24"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -1820,7 +1863,7 @@
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="コネクタを付加" FOLDED="true" ID="ID_1803275985" TEXT_SHORTENED="true">
+<node TEXT="コネクタを付加" FOLDED="true" ID="ID_1803275985" CREATED="1455910948867" MODIFIED="1455910948867" TEXT_SHORTENED="true">
<icon BUILTIN="../designer"/>
<richcontent TYPE="DETAILS">
@@ -1866,27 +1909,26 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="コネクタ" ID="ID_725880686" HGAP="50" TEXT_SHORTENED="true">
-<hook NAME="SummaryNode"/>
+<node TEXT="コネクタ" ID="ID_725880686" CREATED="1455910948868" MODIFIED="1455910948868" HGAP_QUANTITY="50.0 px" TEXT_SHORTENED="true">
+<arrowlink SHAPE="LINE" COLOR="#000099" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_725880686" MIDDLE_LABEL="自己参照用の「線 + ラベル」" STARTINCLINATION="92;-47;" ENDINCLINATION="92;-47;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000099" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_725880686" MIDDLE_LABEL="自己参照用の「線 + ラベル」" STARTINCLINATION="92;-47;" ENDINCLINATION="92;-47;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
-<node TEXT="ノード a" ID="ID_504660350" TEXT_SHORTENED="true">
-<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="ノード a" ID="ID_504660350" CREATED="1455910948868" MODIFIED="1455910948868" TEXT_SHORTENED="true">
<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="8" FONT_FAMILY="SansSerif" DESTINATION="ID_580762900" SOURCE_LABEL="始点
ラベル" TARGET_LABEL="終点
ラベル" MIDDLE_LABEL="中間点
ラベル" STARTINCLINATION="23;33;" ENDINCLINATION="-19;52;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
-<node TEXT="ノード b" ID="ID_519354024" TEXT_SHORTENED="true">
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="ノード b" ID="ID_519354024" CREATED="1455910948868" MODIFIED="1455910948868" TEXT_SHORTENED="true">
<edge STYLE="bezier"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="ノード c" ID="ID_580762900" TEXT_SHORTENED="true"/>
+<node TEXT="ノード c" ID="ID_580762900" CREATED="1455910948868" MODIFIED="1455910948868" TEXT_SHORTENED="true"/>
</node>
</node>
</node>
</node>
-<node TEXT="リンク" FOLDED="true" ID="ID_1430712985" TEXT_SHORTENED="true">
+<node TEXT="リンク" FOLDED="true" ID="ID_1430712985" CREATED="1455910948868" MODIFIED="1455910948868" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -1937,7 +1979,10 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="リンク先を指定(ファイル選択)..." ID="ID_1150948098" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_769246327" CREATED="1455910949160" MODIFIED="1455910949160">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="リンク先を指定(ファイル選択)..." ID="ID_1150948098" CREATED="1455910948868" MODIFIED="1455910948868" TEXT_SHORTENED="true">
<icon BUILTIN="../SetLinkByFileChooserAction"/>
<richcontent TYPE="DETAILS">
@@ -1969,13 +2014,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="リンク先を指定(テキスト入力)..." FOLDED="true" ID="ID_571093832" TEXT_SHORTENED="true">
+<node TEXT="リンク先を指定(テキスト入力)..." FOLDED="true" ID="ID_571093832" CREATED="1455910948870" MODIFIED="1455910948870" TEXT_SHORTENED="true">
<icon BUILTIN="../SetLinkByTextFieldAction"/>
<richcontent TYPE="DETAILS">
@@ -2008,7 +2052,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="コピー&貼り付け" STYLE_REF="ToNote" ID="ID_146192801" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="コピー&貼り付け" STYLE_REF="ToNote" ID="ID_146192801" CREATED="1455910948871" MODIFIED="1455910948871" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2023,7 +2067,7 @@
</richcontent>
</node>
</node>
-<node TEXT="ノード文字列からリンク設定" ID="ID_1754195513" TEXT_SHORTENED="true">
+<node TEXT="ノード文字列からリンク設定" ID="ID_1754195513" CREATED="1455910948871" MODIFIED="1455910948871" TEXT_SHORTENED="true">
<icon BUILTIN="../ExtractLinkFromTextAction"/>
<richcontent TYPE="DETAILS">
@@ -2043,7 +2087,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="ローカルリンクを付加" ID="ID_271903009" TEXT_SHORTENED="true">
+<node TEXT="ローカルリンクを付加" ID="ID_271903009" CREATED="1455910948872" MODIFIED="1455910948872" TEXT_SHORTENED="true">
<icon BUILTIN="../LinkLocal"/>
<richcontent TYPE="DETAILS">
@@ -2063,7 +2107,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="機能(メニュー項目)にリンク..." FOLDED="true" ID="ID_1607683947" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="機能(メニュー項目)にリンク..." FOLDED="true" ID="ID_1607683947" CREATED="1455910948873" MODIFIED="1455910948873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2080,7 +2124,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="スクリプト起動へのリンク用例" ID="ID_393979439" LINK="#ID_840644558" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="スクリプト起動へのリンク用例" ID="ID_393979439" CREATED="1455910948873" MODIFIED="1455910948873" LINK="#ID_840644558" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -2099,7 +2143,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="リンクアンカーをセット" STYLE_REF="Method" ID="ID_232225786" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="リンクアンカーをセット" STYLE_REF="Method" ID="ID_232225786" CREATED="1455910948873" MODIFIED="1455910948873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2113,7 +2157,7 @@
</html>
</richcontent>
</node>
-<node TEXT="アンカーからのリンクを作成" STYLE_REF="Method" ID="ID_617064872" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="アンカーからのリンクを作成" STYLE_REF="Method" ID="ID_617064872" CREATED="1455910948873" MODIFIED="1455910948873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2138,7 +2182,7 @@
</html>
</richcontent>
</node>
-<node TEXT="アンカーへのリンクを作成" STYLE_REF="Method" ID="ID_209345036" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="アンカーへのリンクを作成" STYLE_REF="Method" ID="ID_209345036" CREATED="1455910948873" MODIFIED="1455910948873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2163,7 +2207,7 @@
</html>
</richcontent>
</node>
-<node TEXT="リンクアンカーを解除" STYLE_REF="Method" ID="ID_115302013" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="リンクアンカーを解除" STYLE_REF="Method" ID="ID_115302013" CREATED="1455910948873" MODIFIED="1455910948873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2177,7 +2221,7 @@
</html>
</richcontent>
</node>
-<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_557988874" TEXT_SHORTENED="true">
+<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_557988874" CREATED="1455910948873" MODIFIED="1455910948873" TEXT_SHORTENED="true">
<hook NAME="SummaryNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -2186,7 +2230,7 @@
<attribute NAME="Chapter" VALUE="3"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="ハイパーリンク" ID="ID_444313366" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ハイパーリンク" ID="ID_444313366" CREATED="1455910948873" MODIFIED="1455910948873" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2221,7 +2265,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="ドラッグ&ドロップでハイパーリンク(複数可)設定" ID="ID_754337116" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ドラッグ&ドロップでハイパーリンク(複数可)設定" ID="ID_754337116" CREATED="1455910948874" MODIFIED="1455910948874" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2246,13 +2290,13 @@
</body>
</html>
</richcontent>
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="161"/>
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="120.75 pt"/>
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
</node>
-<node TEXT="E-mail リンク" ID="ID_869144882" LINK="mailto:%20jokro at freeplane.nl" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="E-mail リンク" ID="ID_869144882" CREATED="1455910948894" MODIFIED="1455910948894" LINK="mailto:%20jokro at freeplane.nl" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2281,7 +2325,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="ハイパーリンクや E-mail を削除" ID="ID_1436764680" TEXT_SHORTENED="true">
+<node TEXT="ハイパーリンクや E-mail を削除" ID="ID_1436764680" CREATED="1455910948894" MODIFIED="1455910948894" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
@@ -2308,15 +2352,15 @@
</html>
</richcontent>
</node>
-<node TEXT="相対的ハイパーリンク" ID="ID_1942965129" TEXT_SHORTENED="true">
+<node TEXT="相対的ハイパーリンク" ID="ID_1942965129" CREATED="1455910948894" MODIFIED="1455910948894" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="属性でのハイパーリンク" ID="ID_284791629" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="48" VALUE_WIDTH="48"/>
+<node TEXT="属性でのハイパーリンク" ID="ID_284791629" CREATED="1455910948894" MODIFIED="1455910948894" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="36.0 pt" VALUE_WIDTH="36.0 pt"/>
<attribute NAME="See also" VALUE="#ID_278329781"/>
<attribute NAME="See also" VALUE="#ID_1279811672"/>
<attribute NAME="Chapter" VALUE="3"/>
@@ -2324,7 +2368,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
</node>
-<node TEXT="別のマップのノード向けのリンク" STYLE_REF="Procedure" ID="ID_199586221" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts#Insert_Link_to_a_node_in_another_map" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="別のマップのノード向けのリンク" STYLE_REF="Procedure" ID="ID_199586221" CREATED="1455910948894" MODIFIED="1455910948894" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts#Insert_Link_to_a_node_in_another_map" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2355,7 +2399,7 @@
<attribute NAME="Chapter" VALUE="3"/>
<font ITALIC="true"/>
</node>
-<node TEXT="インラインハイパーリンク" STYLE_REF="ToNote" ID="ID_247329364" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="インラインハイパーリンク" STYLE_REF="ToNote" ID="ID_247329364" CREATED="1455910948895" MODIFIED="1455910948895" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -2406,7 +2450,7 @@
</node>
</node>
</node>
-<node TEXT="ノードを削除" ID="ID_673358354" TEXT_SHORTENED="true">
+<node TEXT="ノードを削除" ID="ID_673358354" CREATED="1455910948896" MODIFIED="1455910948896" TEXT_SHORTENED="true">
<icon BUILTIN="../editdelete"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -2436,11 +2480,15 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ノード" STYLE_REF="MenuGroupLabel" ID="ID_1306487115">
+<node TEXT="" ID="ID_667046220" CREATED="1455910949160" MODIFIED="1455910949160">
<hook NAME="SummaryNode"/>
+<node TEXT="ノード" STYLE_REF="MenuGroupLabel" ID="ID_1306487115" CREATED="1455910948897" MODIFIED="1455910948897"/>
+</node>
+<node TEXT="" ID="ID_981926316" CREATED="1455910949162" MODIFIED="1455910949162">
+<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="ノードコア関連" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1154882439">
-<node TEXT="ノードコアをインライン編集" ID="ID_1162372089" TEXT_SHORTENED="true">
+<node TEXT="ノードコア関連" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1154882439" CREATED="1455910948897" MODIFIED="1455910948897">
+<node TEXT="ノードコアをインライン編集" ID="ID_1162372089" CREATED="1455910948897" MODIFIED="1455910948897" TEXT_SHORTENED="true">
<icon BUILTIN="../edit_node"/>
<richcontent TYPE="DETAILS">
@@ -2520,7 +2568,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="ノードコアをダイアログ編集" ID="ID_1542197841" TEXT_SHORTENED="true">
+<node TEXT="ノードコアをダイアログ編集" ID="ID_1542197841" CREATED="1455910948898" MODIFIED="1455910948898" TEXT_SHORTENED="true">
<icon BUILTIN="../edit_long_node"/>
<richcontent TYPE="DETAILS">
@@ -2588,7 +2636,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="ノードを統合" ID="ID_1036692274">
+<node TEXT="ノードを統合" ID="ID_1036692274" CREATED="1455910948898" MODIFIED="1455910948898">
<icon BUILTIN="../JoinNodesAction"/>
<richcontent TYPE="DETAILS">
@@ -2607,7 +2655,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ノードを分割" ID="ID_1796564424" TEXT_SHORTENED="true">
+<node TEXT="ノードを分割" ID="ID_1796564424" CREATED="1455910948899" MODIFIED="1455910948899" TEXT_SHORTENED="true">
<icon BUILTIN="../split_node"/>
<richcontent TYPE="DETAILS">
@@ -2649,7 +2697,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="更新ノードの背景色を変更" FOLDED="true" ID="ID_974319465" BACKGROUND_COLOR="#ffffff" HGAP="24" VSHIFT="-4">
+<node TEXT="更新ノードの背景色を変更" FOLDED="true" ID="ID_974319465" CREATED="1455910948900" MODIFIED="1455910948900" BACKGROUND_COLOR="#ffffff" HGAP_QUANTITY="24.0 px" VSHIFT_QUANTITY="-4.0 px">
<icon BUILTIN="../RevisionPluginAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -2691,7 +2739,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="更新ノードの標準色を設定" ID="ID_1766752356" TEXT_SHORTENED="true">
+<node TEXT="更新ノードの標準色を設定" ID="ID_1766752356" CREATED="1455910948900" MODIFIED="1455910948900" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -2722,7 +2770,7 @@
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="その他の更新マーク作成法" ID="ID_597667415" TEXT_SHORTENED="true">
+<node TEXT="その他の更新マーク作成法" ID="ID_597667415" CREATED="1455910948901" MODIFIED="1455910948901" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -2800,7 +2848,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="画像(ファイル選択 or リンクから)" ID="ID_743208762" TEXT_SHORTENED="true">
+<node TEXT="画像(ファイル選択 or リンクから)" ID="ID_743208762" CREATED="1455910948901" MODIFIED="1455910948901" TEXT_SHORTENED="true">
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -2849,8 +2897,8 @@
<attribute NAME="Chapter" VALUE="3"/>
</node>
</node>
-<node TEXT="アイコン" STYLE_REF="SubMenu" FOLDED="true" ID="ID_754543229">
-<node TEXT="アイコン一覧から選択" FOLDED="true" ID="ID_967133442" TEXT_SHORTENED="true">
+<node TEXT="アイコン" STYLE_REF="SubMenu" FOLDED="true" ID="ID_754543229" CREATED="1455910948901" MODIFIED="1455910948901">
+<node TEXT="アイコン一覧から選択" FOLDED="true" ID="ID_967133442" CREATED="1455910948901" MODIFIED="1455910948901" TEXT_SHORTENED="true">
<icon BUILTIN="../designer"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -2880,7 +2928,7 @@
</body>
</html>
</richcontent>
-<node TEXT="" ID="ID_1213506322">
+<node TEXT="" ID="ID_1213506322" CREATED="1455910948901" MODIFIED="1455910948901">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -2899,7 +2947,7 @@
</richcontent>
</node>
</node>
-<node TEXT="類別アイコン" ID="ID_1325051261" TEXT_SHORTENED="true">
+<node TEXT="類別アイコン" ID="ID_1325051261" CREATED="1455910948901" MODIFIED="1455910948901" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -2917,9 +2965,8 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="進捗度" FOLDED="true" ID="ID_1605173421" TEXT_SHORTENED="true">
+<node TEXT="進捗度" FOLDED="true" ID="ID_1605173421" CREATED="1455910948901" MODIFIED="1455910948901" TEXT_SHORTENED="true">
<icon BUILTIN="25%"/>
<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -2953,7 +3000,7 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="進捗度を上げる" ID="ID_1880351220">
+<node TEXT="進捗度を上げる" ID="ID_1880351220" CREATED="1455910948901" MODIFIED="1455910948901">
<icon BUILTIN="25%"/>
<richcontent TYPE="DETAILS">
@@ -2972,7 +3019,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="進捗度を下げる" ID="ID_371511132">
+<node TEXT="進捗度を下げる" ID="ID_371511132" CREATED="1455910948902" MODIFIED="1455910948902">
<icon BUILTIN="25%"/>
<richcontent TYPE="DETAILS">
@@ -2991,7 +3038,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="大きい図を付加(10%刻み)" ID="ID_1447409349">
+<node TEXT="" ID="ID_1122058371" CREATED="1455910949160" MODIFIED="1455910949160">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="大きい図を付加(10%刻み)" ID="ID_1447409349" CREATED="1455910948902" MODIFIED="1455910948902">
<icon BUILTIN="25%"/>
<richcontent TYPE="DETAILS">
@@ -3014,13 +3064,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook URI="freeplaneresource:/images/svg/Progress_tenth_02.svg" SIZE="1.0" NAME="ExternalObject"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="大きい図を付加(25%刻み)" ID="ID_1944307938">
+<node TEXT="大きい図を付加(25%刻み)" ID="ID_1944307938" CREATED="1455910948904" MODIFIED="1455910948904">
<icon BUILTIN="25%"/>
<richcontent TYPE="DETAILS">
@@ -3048,8 +3097,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="" ID="ID_1351859449">
-<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="192"/>
+<node TEXT="" ID="ID_897938627" CREATED="1455910949160" MODIFIED="1455910949160">
+<hook NAME="SummaryNode"/>
+<node TEXT="" ID="ID_1351859449" CREATED="1455910948904" MODIFIED="1455910948904">
+<attribute_layout NAME_WIDTH="67.5 pt" VALUE_WIDTH="144.0 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -3066,16 +3117,19 @@
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="進捗度指標を削除" ID="ID_612434998">
+</node>
+<node TEXT="進捗度指標を削除" ID="ID_612434998" CREATED="1455910948904" MODIFIED="1455910948904">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="上位ノードにもアイコンを表示" ID="ID_1929367560" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1267395967" CREATED="1455910949161" MODIFIED="1455910949161">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="上位ノードにもアイコンを表示" ID="ID_1929367560" CREATED="1455910948904" MODIFIED="1455910948904" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -3092,15 +3146,14 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="子ノードの共通アイコンを表示" ID="ID_664401378">
+<node TEXT="子ノードの共通アイコンを表示" ID="ID_664401378" CREATED="1455910948904" MODIFIED="1455910948904">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="アイコンを削除" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1880834440">
-<node TEXT="先頭のアイコンを削除" ID="ID_1452556696" TEXT_SHORTENED="true">
+<node TEXT="アイコンを削除" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1880834440" CREATED="1455910948904" MODIFIED="1455910948904">
+<node TEXT="先頭のアイコンを削除" ID="ID_1452556696" CREATED="1455910948905" MODIFIED="1455910948905" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_first_icon"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -3120,7 +3173,7 @@
</html>
</richcontent>
</node>
-<node TEXT="最後のアイコンを削除" ID="ID_424983852" TEXT_SHORTENED="true">
+<node TEXT="最後のアイコンを削除" ID="ID_424983852" CREATED="1455910948906" MODIFIED="1455910948906" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_last_icon"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -3140,7 +3193,7 @@
</html>
</richcontent>
</node>
-<node TEXT="すべてのアイコンを削除" ID="ID_1438443252" TEXT_SHORTENED="true">
+<node TEXT="すべてのアイコンを削除" ID="ID_1438443252" CREATED="1455910948906" MODIFIED="1455910948906" TEXT_SHORTENED="true">
<icon BUILTIN="../icon_trash"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -3161,8 +3214,8 @@
</richcontent>
</node>
</node>
-<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_892520547" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="211"/>
+<node TEXT="" STYLE_REF="Aggregatie als Toelichting" ID="ID_892520547" CREATED="1455910948907" MODIFIED="1455910948907" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="158.25 pt"/>
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -3171,7 +3224,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="AlwaysUnfoldedNode"/>
<hook NAME="SummaryNode"/>
-<node TEXT="アイコン" ID="ID_845839827" TEXT_SHORTENED="true">
+<node TEXT="アイコン" ID="ID_845839827" CREATED="1455910948907" MODIFIED="1455910948907" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -3190,15 +3243,15 @@
</html>
</richcontent>
</node>
-<node TEXT="アイコンの用例" ID="ID_835126969">
+<node TEXT="アイコンの用例" ID="ID_835126969" CREATED="1455910948907" MODIFIED="1455910948907">
<icon BUILTIN="help"/>
<icon BUILTIN="yes"/>
<icon BUILTIN="messagebox_warning"/>
<icon BUILTIN="button_ok"/>
+<arrowlink SHAPE="LINE" COLOR="#0000ff" WIDTH="1" TRANSPARENCY="90" FONT_SIZE="10" FONT_FAMILY="SansSerif" DESTINATION="ID_835126969" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<attribute NAME="Chapter" VALUE="3"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#0000ff" WIDTH="1" TRANSPARENCY="90" FONT_SIZE="10" FONT_FAMILY="SansSerif" DESTINATION="ID_835126969" STARTINCLINATION="40;0;" ENDINCLINATION="40;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="ユーザ定義アイコンを追加" ID="ID_105231801" TEXT_SHORTENED="true">
+<node TEXT="ユーザ定義アイコンを追加" ID="ID_105231801" CREATED="1455910948907" MODIFIED="1455910948907" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -3219,8 +3272,11 @@
</node>
</node>
</node>
-<node TEXT="ノード拡張情報" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1400990107">
-<node TEXT="ノード内容をツールチップ表示" ID="ID_1299973423" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ノード拡張情報" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1400990107" CREATED="1455910948908" MODIFIED="1455910948908">
+<node TEXT="" ID="ID_162694464" CREATED="1455910949161" MODIFIED="1455910949161">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノード内容をツールチップ表示" ID="ID_1299973423" CREATED="1455910948908" MODIFIED="1455910948908" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3262,7 +3318,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ノードの詳細をインライン編集" ID="ID_891642524" TEXT_SHORTENED="true">
+<node TEXT="ノードの詳細をインライン編集" ID="ID_891642524" CREATED="1455910948908" MODIFIED="1455910948908" TEXT_SHORTENED="true">
<icon BUILTIN="../edit_details"/>
<richcontent TYPE="DETAILS">
@@ -3299,7 +3355,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="ノードの詳細をダイアログ編集" ID="ID_766589763" TEXT_SHORTENED="true">
+<node TEXT="ノードの詳細をダイアログ編集" ID="ID_766589763" CREATED="1455910948908" MODIFIED="1455910948908" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -3329,7 +3385,7 @@
</html>
</richcontent>
</node>
-<node TEXT="スタイルノードから拡張情報をコピー" ID="ID_1200772173" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="スタイルノードから拡張情報をコピー" ID="ID_1200772173" CREATED="1455910948909" MODIFIED="1455910948909" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3365,7 +3421,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードの詳細を削除" ID="ID_1066845988"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ノードの詳細を削除" ID="ID_1066845988" CREATED="1455910948909" MODIFIED="1455910948909"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3383,7 +3439,9 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="詳細テキスト" STYLE_REF="MenuGroupLabel" ID="ID_252237122" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_139584702" CREATED="1455910949161" MODIFIED="1455910949161">
+<hook NAME="SummaryNode"/>
+<node TEXT="詳細テキスト" STYLE_REF="MenuGroupLabel" ID="ID_252237122" CREATED="1455910948909" MODIFIED="1455910948909" TEXT_SHORTENED="true">
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -3426,19 +3484,20 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="画像を付加..." FOLDED="true" ID="ID_1900758302" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_788803784" CREATED="1455910949161" MODIFIED="1455910949161">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="画像を付加..." FOLDED="true" ID="ID_1900758302" CREATED="1455910948909" MODIFIED="1455910948909" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<hook NAME="FirstGroupNode"/>
<richcontent TYPE="DETAILS">
<html>
@@ -3504,9 +3563,9 @@
</body>
</html>
</richcontent>
-<node TEXT="" FOLDED="true" ID="ID_1144212077" TEXT_SHORTENED="true">
+<node TEXT="" FOLDED="true" ID="ID_1144212077" CREATED="1455910948909" MODIFIED="1455910948909" TEXT_SHORTENED="true">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="" ID="ID_124027424">
+<node TEXT="" ID="ID_124027424" CREATED="1455910948909" MODIFIED="1455910948909">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -3532,7 +3591,7 @@
</html>
</richcontent>
</node>
-<node TEXT="画像のドラッグ&ドロップ、及びリンクのコピー&貼り付け" ID="ID_225689401">
+<node TEXT="画像のドラッグ&ドロップ、及びリンクのコピー&貼り付け" ID="ID_225689401" CREATED="1455910948909" MODIFIED="1455910948909">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -3597,7 +3656,7 @@
</node>
</node>
</node>
-<node TEXT="画像を変更..." ID="ID_1875250551" TEXT_SHORTENED="true">
+<node TEXT="画像を変更..." ID="ID_1875250551" CREATED="1455910948909" MODIFIED="1455910948909" TEXT_SHORTENED="true">
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -3617,7 +3676,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="画像を削除" ID="ID_421583940" TEXT_SHORTENED="true">
+<node TEXT="画像を削除" ID="ID_421583940" CREATED="1455910948909" MODIFIED="1455910948909" TEXT_SHORTENED="true">
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -3637,7 +3696,9 @@
</html>
</richcontent>
</node>
-<node TEXT="イメージ" FOLDED="true" ID="ID_1123523360" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="" ID="ID_89582330" CREATED="1455910949161" MODIFIED="1455910949161">
+<hook NAME="SummaryNode"/>
+<node TEXT="イメージ" FOLDED="true" ID="ID_1123523360" CREATED="1455910948910" MODIFIED="1455910948910" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3695,10 +3756,8 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<hook NAME="SummaryNode"/>
-<node TEXT="画像を公開" ID="ID_452599330" TEXT_SHORTENED="true">
-<hook NAME="SummaryNode"/>
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="264"/>
+<node TEXT="画像を公開" ID="ID_452599330" CREATED="1455910948910" MODIFIED="1455910948910" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="198.0 pt"/>
<attribute NAME="Chapter" VALUE="3,6"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -3737,7 +3796,11 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="属性を付加" FOLDED="true" ID="ID_760786399" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="" ID="ID_406541717" CREATED="1455910949161" MODIFIED="1455910949161">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="属性を付加" FOLDED="true" ID="ID_760786399" CREATED="1455910948910" MODIFIED="1455910948910" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -3779,10 +3842,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3" OBJECT="org.freeplane.features.format.FormattedNumber|3"/>
-<node TEXT="" FOLDED="true" ID="ID_1214682222" TEXT_SHORTENED="true">
+<node TEXT="" FOLDED="true" ID="ID_1214682222" CREATED="1455910948941" MODIFIED="1455910948941" TEXT_SHORTENED="true">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="" ID="ID_1094419120" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="163"/>
+<node TEXT="" ID="ID_1094419120" CREATED="1455910948941" MODIFIED="1455910948941" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="67.5 pt" VALUE_WIDTH="122.25 pt"/>
<attribute NAME="Chapter" VALUE="3" OBJECT="org.freeplane.features.format.FormattedNumber|3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -3801,7 +3864,7 @@
</html>
</richcontent>
</node>
-<node TEXT="属性のコピーと貼り付け" ID="ID_1449305302" TEXT_SHORTENED="true">
+<node TEXT="属性のコピーと貼り付け" ID="ID_1449305302" CREATED="1455910948941" MODIFIED="1455910948941" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -3828,14 +3891,14 @@
</html>
</richcontent>
</node>
-<node TEXT="属性ありアイコンを表示" ID="ID_1074952186" LINK="#ID_1228898153" TEXT_SHORTENED="true">
+<node TEXT="属性ありアイコンを表示" ID="ID_1074952186" CREATED="1455910948941" MODIFIED="1455910948941" LINK="#ID_1228898153" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node TEXT="属性をインライン編集" ID="ID_588022191">
+<node TEXT="属性をインライン編集" ID="ID_588022191" CREATED="1455910948941" MODIFIED="1455910948941">
<icon BUILTIN="../EditAttributesAction"/>
<richcontent TYPE="DETAILS">
@@ -3869,7 +3932,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3" OBJECT="org.freeplane.features.format.FormattedNumber|3"/>
</node>
-<node TEXT="属性をダイアログ編集" FOLDED="true" ID="ID_984784283" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="属性をダイアログ編集" FOLDED="true" ID="ID_984784283" CREATED="1455910948942" MODIFIED="1455910948942" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -3911,10 +3974,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="" FOLDED="true" ID="ID_560316882">
+<node TEXT="" FOLDED="true" ID="ID_560316882" CREATED="1455910948942" MODIFIED="1455910948942">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="" ID="ID_110645225" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="90" VALUE_WIDTH="163"/>
+<node TEXT="" ID="ID_110645225" CREATED="1455910948942" MODIFIED="1455910948942" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="67.5 pt" VALUE_WIDTH="122.25 pt"/>
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -3933,7 +3996,7 @@
</html>
</richcontent>
</node>
-<node TEXT="属性をコピー&貼り付け" ID="ID_1118988780" TEXT_SHORTENED="true">
+<node TEXT="属性をコピー&貼り付け" ID="ID_1118988780" CREATED="1455910948942" MODIFIED="1455910948942" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -3960,14 +4023,14 @@
</html>
</richcontent>
</node>
-<node TEXT="属性付きアイコンを表示/非表示" ID="ID_395016262" LINK="#ID_1228898153">
+<node TEXT="属性付きアイコンを表示/非表示" ID="ID_395016262" CREATED="1455910948943" MODIFIED="1455910948943" LINK="#ID_1228898153">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node TEXT="属性を検索&置換..." ID="ID_853467392" TEXT_SHORTENED="true">
+<node TEXT="属性を検索&置換..." ID="ID_853467392" CREATED="1455910948943" MODIFIED="1455910948943" TEXT_SHORTENED="true">
<icon BUILTIN="../showAttributes"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -3987,7 +4050,7 @@
</html>
</richcontent>
</node>
-<node TEXT="属性をコピー" ID="ID_338594349"><richcontent TYPE="DETAILS">
+<node TEXT="属性をコピー" ID="ID_338594349" CREATED="1455910948944" MODIFIED="1455910948944"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4016,7 +4079,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="属性を貼り付け" ID="ID_1033981021" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="属性を貼り付け" ID="ID_1033981021" CREATED="1455910948944" MODIFIED="1455910948944" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4048,7 +4111,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="スタイルから属性をコピー" ID="ID_327255471" TEXT_SHORTENED="true">
+<node TEXT="スタイルから属性をコピー" ID="ID_327255471" CREATED="1455910948944" MODIFIED="1455910948944" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4087,25 +4150,24 @@
</html>
</richcontent>
</node>
-<node TEXT="属性を削除" STYLE_REF="SubMenu" FOLDED="true" ID="ID_111620622" TEXT_SHORTENED="true">
-<node TEXT="最初の属性を削除" ID="ID_416728298">
+<node TEXT="属性を削除" STYLE_REF="SubMenu" FOLDED="true" ID="ID_111620622" CREATED="1455910948944" MODIFIED="1455910948944" TEXT_SHORTENED="true">
+<node TEXT="最初の属性を削除" ID="ID_416728298" CREATED="1455910948944" MODIFIED="1455910948944">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="最後の属性を削除" ID="ID_1820177031">
+<node TEXT="最後の属性を削除" ID="ID_1820177031" CREATED="1455910948944" MODIFIED="1455910948944">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="すべての属性を削除" ID="ID_970466467">
+<node TEXT="すべての属性を削除" ID="ID_970466467" CREATED="1455910948944" MODIFIED="1455910948944">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="属性マネージャ" FOLDED="true" ID="ID_1310153809" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="属性マネージャ" FOLDED="true" ID="ID_1310153809" CREATED="1455910948944" MODIFIED="1455910948944" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4152,9 +4214,9 @@
</body>
</html>
</richcontent>
-<node TEXT="" FOLDED="true" ID="ID_196085861" TEXT_SHORTENED="true">
+<node TEXT="" FOLDED="true" ID="ID_196085861" CREATED="1455910948944" MODIFIED="1455910948944" TEXT_SHORTENED="true">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="" ID="ID_1794495670">
+<node TEXT="" ID="ID_1794495670" CREATED="1455910948944" MODIFIED="1455910948944">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -4177,7 +4239,7 @@
</html>
</richcontent>
</node>
-<node TEXT="属性 a1 を隠し、属性 a2 を表示。" ID="ID_150790746">
+<node TEXT="属性 a1 を隠し、属性 a2 を表示。" ID="ID_150790746" CREATED="1455910948944" MODIFIED="1455910948944">
<font ITALIC="false"/>
<richcontent TYPE="NOTE">
@@ -4222,7 +4284,7 @@
</html>
</richcontent>
</node>
-<node ID="ID_1420562009"><richcontent TYPE="NODE">
+<node ID="ID_1420562009" CREATED="1455910948945" MODIFIED="1455910948945"><richcontent TYPE="NODE">
<html>
<head>
@@ -4234,6 +4296,7 @@
</p>
</body>
</html>
+
</richcontent>
<font ITALIC="false"/>
<richcontent TYPE="NOTE">
@@ -4290,7 +4353,9 @@
</node>
</node>
</node>
-<node TEXT="属性" ID="ID_1336806888" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1852973023" CREATED="1455910949161" MODIFIED="1455910949161">
+<hook NAME="SummaryNode"/>
+<node TEXT="属性" ID="ID_1336806888" CREATED="1455910948945" MODIFIED="1455910948945" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4327,9 +4392,12 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="LaTeX 数式を付加..." ID="ID_1120511367" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="" ID="ID_1669624660" CREATED="1455910949162" MODIFIED="1455910949162">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="LaTeX 数式を付加..." ID="ID_1120511367" CREATED="1455910948945" MODIFIED="1455910948945" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4347,19 +4415,21 @@
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
</node>
-<node TEXT="LaTeX 数式を編集..." ID="ID_653019528">
+<node TEXT="LaTeX 数式を編集..." ID="ID_653019528" CREATED="1455910948945" MODIFIED="1455910948945">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
</node>
-<node TEXT="LaTeX 数式を削除" ID="ID_1890695579">
+<node TEXT="LaTeX 数式を削除" ID="ID_1890695579" CREATED="1455910948945" MODIFIED="1455910948945">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
</node>
-<node TEXT="LaTeX 数式" ID="ID_1750517188" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1056643964" CREATED="1455910949162" MODIFIED="1455910949162">
+<hook NAME="SummaryNode"/>
+<node TEXT="LaTeX 数式" ID="ID_1750517188" CREATED="1455910948945" MODIFIED="1455910948945" TEXT_SHORTENED="true">
<font NAME="SansSerif" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -4378,19 +4448,18 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
-<hook NAME="SummaryNode"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="インターネットを参照" ID="ID_1974921327" LINK="http://freeplane.sourceforge.net/wiki/index.php/File:Freeplane_LaTex.mm" TEXT_SHORTENED="true">
+<node TEXT="インターネットを参照" ID="ID_1974921327" CREATED="1455910948945" MODIFIED="1455910948945" LINK="http://freeplane.sourceforge.net/wiki/index.php/File:Freeplane_LaTex.mm" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3,7"/>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
</node>
-<node TEXT="ノート" FOLDED="true" ID="ID_1127803116" TEXT_SHORTENED="true">
+</node>
+<node TEXT="ノート" FOLDED="true" ID="ID_1127803116" CREATED="1455910948945" MODIFIED="1455910948945" TEXT_SHORTENED="true">
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -4434,7 +4503,10 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
-<node TEXT="ノートをダイアログ編集" ID="ID_753192689" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1448721297" CREATED="1455910949162" MODIFIED="1455910949162">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノートをダイアログ編集" ID="ID_753192689" CREATED="1455910948946" MODIFIED="1455910948946" TEXT_SHORTENED="true">
<icon BUILTIN="../EditNoteInDialogAction"/>
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -4455,7 +4527,7 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="ノートを削除" ID="ID_647231999" TEXT_SHORTENED="true">
+<node TEXT="ノートを削除" ID="ID_647231999" CREATED="1455910948947" MODIFIED="1455910948947" TEXT_SHORTENED="true">
<icon BUILTIN="../RemoveNoteAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4475,7 +4547,9 @@
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="ノートパネルで編集" ID="ID_221910481" COLOR="#663300" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_43339553" CREATED="1455910949162" MODIFIED="1455910949162">
+<hook NAME="SummaryNode"/>
+<node TEXT="ノートパネルで編集" ID="ID_221910481" CREATED="1455910948948" MODIFIED="1455910948948" COLOR="#663300" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4493,15 +4567,14 @@
</body>
</html>
</richcontent>
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="165"/>
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="123.75 pt"/>
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="ノート" ID="ID_1985815731" TEXT_SHORTENED="true">
+<node TEXT="ノート" ID="ID_1985815731" CREATED="1455910948948" MODIFIED="1455910948948" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -4520,7 +4593,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノート付きアイコンを表示" ID="ID_830303915">
+<node TEXT="ノート付きアイコンを表示" ID="ID_830303915" CREATED="1455910948948" MODIFIED="1455910948948">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -4528,10 +4601,12 @@
</node>
</node>
</node>
-<node TEXT="ノードの主要コンポーネント" STYLE_REF="MenuGroupLabel" ID="ID_1143096620">
+</node>
+<node TEXT="" ID="ID_410692726" CREATED="1455910949162" MODIFIED="1455910949162">
<hook NAME="SummaryNode"/>
+<node TEXT="ノードの主要コンポーネント" STYLE_REF="MenuGroupLabel" ID="ID_1143096620" CREATED="1455910948948" MODIFIED="1455910948948"/>
</node>
-<node TEXT="元に戻す" ID="ID_1252928137" TEXT_SHORTENED="true">
+<node TEXT="元に戻す" ID="ID_1252928137" CREATED="1455910948948" MODIFIED="1455910948948" TEXT_SHORTENED="true">
<icon BUILTIN="../undo"/>
<richcontent TYPE="DETAILS">
@@ -4569,7 +4644,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="やり直す" ID="ID_767297940" TEXT_SHORTENED="true">
+<node TEXT="やり直す" ID="ID_767297940" CREATED="1455910948949" MODIFIED="1455910948949" TEXT_SHORTENED="true">
<icon BUILTIN="../redo"/>
<richcontent TYPE="DETAILS">
@@ -4588,7 +4663,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="切り取り" ID="ID_593223718" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_850578127" CREATED="1455910949162" MODIFIED="1455910949162">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="切り取り" ID="ID_593223718" CREATED="1455910948950" MODIFIED="1455910948950" TEXT_SHORTENED="true">
<icon BUILTIN="../editcut"/>
<richcontent TYPE="DETAILS">
@@ -4603,13 +4681,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="コピー" STYLE_REF="SubMenu" FOLDED="true" ID="ID_872613202" TEXT_SHORTENED="true">
-<node TEXT="コピー" ID="ID_1144110421">
+<node TEXT="コピー" STYLE_REF="SubMenu" FOLDED="true" ID="ID_872613202" CREATED="1455910948952" MODIFIED="1455910948952" TEXT_SHORTENED="true">
+<node TEXT="コピー" ID="ID_1144110421" CREATED="1455910948952" MODIFIED="1455910948952">
<icon BUILTIN="../editcopy"/>
<richcontent TYPE="DETAILS">
@@ -4628,7 +4705,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="選択ノードのみコピー" ID="ID_1521191048">
+<node TEXT="選択ノードのみコピー" ID="ID_1521191048" CREATED="1455910948953" MODIFIED="1455910948953">
<icon BUILTIN="../copy_single"/>
<richcontent TYPE="DETAILS">
@@ -4647,7 +4724,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ノードのIDをコピー" ID="ID_71485983"><richcontent TYPE="DETAILS">
+<node TEXT="ノードのIDをコピー" ID="ID_71485983" CREATED="1455910948955" MODIFIED="1455910948955"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4681,7 +4758,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ノードの URI をコピー" STYLE_REF="Method" ID="ID_874062942"><richcontent TYPE="DETAILS">
+<node TEXT="ノードの URI をコピー" STYLE_REF="Method" ID="ID_874062942" CREATED="1455910948955" MODIFIED="1455910948955"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4707,7 +4784,7 @@
</richcontent>
</node>
</node>
-<node TEXT="貼り付け" ID="ID_1036972266" TEXT_SHORTENED="true">
+<node TEXT="貼り付け" ID="ID_1036972266" CREATED="1455910948955" MODIFIED="1455910948955" TEXT_SHORTENED="true">
<icon BUILTIN="../editpaste"/>
<richcontent TYPE="DETAILS">
@@ -4726,25 +4803,29 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="形式を選択して貼り付け..." ID="ID_1608096317" TEXT_SHORTENED="true">
+<node TEXT="形式を選択して貼り付け..." ID="ID_1608096317" CREATED="1455910948957" MODIFIED="1455910948957" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="切り取り、コピー、及び貼り付け" ID="ID_630269063" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1584667753" CREATED="1455910949162" MODIFIED="1455910949162">
<hook NAME="SummaryNode"/>
+<node TEXT="切り取り、コピー、及び貼り付け" ID="ID_630269063" CREATED="1455910948957" MODIFIED="1455910948957" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="ノードの移動と並べ替え" STYLE_REF="Aggregatie als Toelichting" FOLDED="true" ID="ID_564919804">
+</node>
+<node TEXT="ノードの移動と並べ替え" STYLE_REF="Aggregatie als Toelichting" FOLDED="true" ID="ID_564919804" CREATED="1455910948957" MODIFIED="1455910948957">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="ノードを移動(兄弟間で下へ)" ID="ID_813645563" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_474164088" CREATED="1455910949163" MODIFIED="1455910949163">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノードを移動(兄弟間で下へ)" ID="ID_813645563" CREATED="1455910948957" MODIFIED="1455910948957" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4774,7 +4855,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードを移動(兄弟間で上へ)" ID="ID_1779409764" TEXT_SHORTENED="true">
+<node TEXT="ノードを移動(兄弟間で上へ)" ID="ID_1779409764" CREATED="1455910948957" MODIFIED="1455910948957" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4804,7 +4885,7 @@
</html>
</richcontent>
</node>
-<node TEXT="子ノードを並べ替え" ID="ID_8515098" TEXT_SHORTENED="true">
+<node TEXT="子ノードを並べ替え" ID="ID_8515098" CREATED="1455910948957" MODIFIED="1455910948957" TEXT_SHORTENED="true">
<icon BUILTIN="../SortNodes"/>
<richcontent TYPE="DETAILS">
@@ -4824,7 +4905,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="ノードを移動(親の弟へ)" ID="ID_1906884446" TEXT_SHORTENED="true">
+<node TEXT="ノードを移動(親の弟へ)" ID="ID_1906884446" CREATED="1455910948958" MODIFIED="1455910948958" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4854,7 +4935,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードを移動(兄の末子へ)" ID="ID_1201405914" TEXT_SHORTENED="true">
+<node TEXT="ノードを移動(兄の末子へ)" ID="ID_1201405914" CREATED="1455910948958" MODIFIED="1455910948958" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4884,12 +4965,13 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードの縦間隔" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" STYLE="combined" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1467952411" CREATED="1455910949163" MODIFIED="1455910949163">
+<hook NAME="SummaryNode"/>
+<node TEXT="ノードの縦間隔" STYLE_REF="Professional" FOLDED="true" ID="ID_1934584954" CREATED="1455910948959" MODIFIED="1455910948959" STYLE="combined" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuTitle" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
-<node ID="ID_801516363" HGAP="-68" VSHIFT="36" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_801516363" CREATED="1455910948959" MODIFIED="1455910948959" HGAP_QUANTITY="-68.0 px" VSHIFT_QUANTITY="36.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -4901,6 +4983,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="TitlesContent" LAST="false"/>
@@ -4908,7 +4991,8 @@
</node>
</node>
</node>
-<node TEXT="フリーポジションノードに指定/解除" STYLE_REF="Method" FOLDED="true" ID="ID_1997357786" TEXT_SHORTENED="true">
+</node>
+<node TEXT="フリーポジションノードに指定/解除" STYLE_REF="Method" FOLDED="true" ID="ID_1997357786" CREATED="1455910948959" MODIFIED="1455910948959" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -4943,7 +5027,7 @@
</body>
</html>
</richcontent>
-<node TEXT="制限事項" STYLE_REF="ToNote" ID="ID_1792486278"><richcontent TYPE="DETAILS">
+<node TEXT="制限事項" STYLE_REF="ToNote" ID="ID_1792486278" CREATED="1455910948959" MODIFIED="1455910948959"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -4963,7 +5047,7 @@
</richcontent>
</node>
</node>
-<node TEXT="ノードの位置をリセット" ID="ID_1456464643" VSHIFT="2" TEXT_SHORTENED="true">
+<node TEXT="ノードの位置をリセット" ID="ID_1456464643" CREATED="1455910948959" MODIFIED="1455910948959" VSHIFT_QUANTITY="2.0 px" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -4981,7 +5065,10 @@
</html>
</richcontent>
</node>
-<node TEXT="検索..." ID="ID_1949830526" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1879582515" CREATED="1455910949163" MODIFIED="1455910949163">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="検索..." ID="ID_1949830526" CREATED="1455910948959" MODIFIED="1455910948959" TEXT_SHORTENED="true">
<icon BUILTIN="../filefind"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5007,13 +5094,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="次を検索" ID="ID_778893977" TEXT_SHORTENED="true">
+<node TEXT="次を検索" ID="ID_778893977" CREATED="1455910948960" MODIFIED="1455910948960" TEXT_SHORTENED="true">
<icon BUILTIN="../find_next"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5044,7 +5130,7 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="検索&置換..." FOLDED="true" ID="ID_364564294" TEXT_SHORTENED="true">
+<node TEXT="検索&置換..." FOLDED="true" ID="ID_364564294" CREATED="1455910948961" MODIFIED="1455910948961" TEXT_SHORTENED="true">
<icon BUILTIN="../NodeListAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5074,7 +5160,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="最後に修正したノード(複数可)を検索" ID="ID_16619030" TEXT_SHORTENED="true">
+<node TEXT="最後に修正したノード(複数可)を検索" ID="ID_16619030" CREATED="1455910948996" MODIFIED="1455910948996" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -5118,7 +5204,7 @@
<attribute NAME="Chapter" VALUE="9"/>
</node>
</node>
-<node TEXT="すべてのマップで検索&置換..." ID="ID_832534218" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="すべてのマップで検索&置換..." ID="ID_832534218" CREATED="1455910948996" MODIFIED="1455910948996" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -5147,8 +5233,9 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="検索と置換" ID="ID_1337187124" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_54497466" CREATED="1455910949163" MODIFIED="1455910949163">
<hook NAME="SummaryNode"/>
+<node TEXT="検索と置換" ID="ID_1337187124" CREATED="1455910948996" MODIFIED="1455910948996" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
@@ -5156,8 +5243,9 @@
</node>
</node>
</node>
-<node TEXT="表  示" STYLE_REF="MainMenu" FOLDED="true" ID="ID_389115947" MIN_WIDTH="60" TEXT_SHORTENED="true">
-<attribute_layout VALUE_WIDTH="216"/>
+</node>
+<node TEXT="表  示" STYLE_REF="MainMenu" FOLDED="true" ID="ID_389115947" CREATED="1455910948996" MODIFIED="1455910948996" MIN_WIDTH="60.0 px" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="162.0 pt"/>
<attribute NAME="Chapter" VALUE="1,2,3,4,5"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
@@ -5179,7 +5267,7 @@
</body>
</html>
</richcontent>
-<node TEXT="ステータスバーを表示" ID="ID_72695966" TEXT_SHORTENED="true">
+<node TEXT="ステータスバーを表示" ID="ID_72695966" CREATED="1455910948997" MODIFIED="1455910948997" TEXT_SHORTENED="true">
<icon BUILTIN="icon_not_found"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5196,8 +5284,8 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="ノードコア関連" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1969683729" TEXT_SHORTENED="true">
-<node TEXT="選択ノードを枠囲い表示" ID="ID_1251724615" TEXT_SHORTENED="true">
+<node TEXT="ノードコア関連" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1969683729" CREATED="1455910948997" MODIFIED="1455910948997" TEXT_SHORTENED="true">
+<node TEXT="選択ノードを枠囲い表示" ID="ID_1251724615" CREATED="1455910948997" MODIFIED="1455910948997" TEXT_SHORTENED="true">
<icon BUILTIN="../ShowSelectionAsRectangleAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5224,7 +5312,7 @@
</html>
</richcontent>
</node>
-<node TEXT="計算式ノードを縁取り表示しない" ID="ID_1232411275" TEXT_SHORTENED="true">
+<node TEXT="計算式ノードを縁取り表示しない" ID="ID_1232411275" CREATED="1455910948998" MODIFIED="1455910948998" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -5242,7 +5330,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードの最大表示幅を設定" ID="ID_189812997" TEXT_SHORTENED="true">
+<node TEXT="ノードの最大表示幅を設定" ID="ID_189812997" CREATED="1455910948998" MODIFIED="1455910948998" TEXT_SHORTENED="true">
<icon BUILTIN="icon_not_found"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5269,7 +5357,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードの最小表示幅を設定" ID="ID_1836236046" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ノードの最小表示幅を設定" ID="ID_1836236046" CREATED="1455910948999" MODIFIED="1455910948999" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -5283,7 +5371,7 @@
</html>
</richcontent>
</node>
-<node TEXT="更新ノードの背景色を変更" FOLDED="true" ID="ID_180302341" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<node TEXT="更新ノードの背景色を変更" FOLDED="true" ID="ID_180302341" CREATED="1455910948999" MODIFIED="1455910948999" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
<icon BUILTIN="../RevisionPluginAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5328,7 +5416,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="更新ノードの標準色を設定" ID="ID_1879353702" TEXT_SHORTENED="true">
+<node TEXT="更新ノードの標準色を設定" ID="ID_1879353702" CREATED="1455910949000" MODIFIED="1455910949000" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -5357,7 +5445,7 @@
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="その他の更新マーク作成法" ID="ID_961541761" TEXT_SHORTENED="true">
+<node TEXT="その他の更新マーク作成法" ID="ID_961541761" CREATED="1455910949000" MODIFIED="1455910949000" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -5435,10 +5523,12 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="アイコン" STYLE_REF="SubMenu" FOLDED="true" ID="ID_655678719" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_292740591" CREATED="1455910949163" MODIFIED="1455910949163">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="アイコン" STYLE_REF="SubMenu" FOLDED="true" ID="ID_655678719" CREATED="1455910949000" MODIFIED="1455910949000" TEXT_SHORTENED="true">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="上位ノードにもアイコン表示" ID="ID_1215606144" TEXT_SHORTENED="true">
+<node TEXT="上位ノードにもアイコン表示" ID="ID_1215606144" CREATED="1455910949001" MODIFIED="1455910949001" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -5456,15 +5546,16 @@
</html>
</richcontent>
</node>
-<node TEXT="子ノードの共通アイコンを表示" ID="ID_1523948647" TEXT_SHORTENED="true">
+<node TEXT="子ノードの共通アイコンを表示" ID="ID_1523948647" CREATED="1455910949001" MODIFIED="1455910949001" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="アイコンの表示" ID="ID_1955285769" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1392504097" CREATED="1455910949163" MODIFIED="1455910949163">
<hook NAME="SummaryNode"/>
-<attribute_layout VALUE_WIDTH="160"/>
+<node TEXT="アイコンの表示" ID="ID_1955285769" CREATED="1455910949001" MODIFIED="1455910949001" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="120.0 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -5515,7 +5606,8 @@
</richcontent>
</node>
</node>
-<node TEXT="新規のマップビューを作成" ID="ID_1759737398" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="新規のマップビューを作成" ID="ID_1759737398" CREATED="1455910949001" MODIFIED="1455910949001" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5532,7 +5624,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ツールバー" FOLDED="true" ID="ID_464156542" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ツールバー" FOLDED="true" ID="ID_464156542" CREATED="1455910949001" MODIFIED="1455910949001" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5555,7 +5647,10 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="メニューバー" FOLDED="true" ID="ID_364770497" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_637812459" CREATED="1455910949163" MODIFIED="1455910949163">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="メニューバー" FOLDED="true" ID="ID_364770497" CREATED="1455910949002" MODIFIED="1455910949002" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5586,8 +5681,8 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="メインメニューバー" ID="ID_1031552494">
-<attribute_layout VALUE_WIDTH="175"/>
+<node TEXT="メインメニューバー" ID="ID_1031552494" CREATED="1455910949002" MODIFIED="1455910949002">
+<attribute_layout VALUE_WIDTH="131.25 pt"/>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
@@ -5621,7 +5716,7 @@
</richcontent>
</node>
</node>
-<node TEXT="ツールバー" FOLDED="true" ID="ID_1306099455" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ツールバー" FOLDED="true" ID="ID_1306099455" CREATED="1455910949002" MODIFIED="1455910949002" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5652,7 +5747,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="メインツールバー" ID="ID_587845768">
+<node TEXT="メインツールバー" ID="ID_587845768" CREATED="1455910949003" MODIFIED="1455910949003">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -5672,7 +5767,7 @@
</richcontent>
</node>
</node>
-<node TEXT="フィルタバー" FOLDED="true" ID="ID_664463091" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="フィルタバー" FOLDED="true" ID="ID_664463091" CREATED="1455910949003" MODIFIED="1455910949003" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5700,7 +5795,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="フィルタバー" ID="ID_1438024968">
+<node TEXT="フィルタバー" ID="ID_1438024968" CREATED="1455910949003" MODIFIED="1455910949003">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -5720,7 +5815,7 @@
</richcontent>
</node>
</node>
-<node TEXT="F バー" ID="ID_1945242906" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="F バー" ID="ID_1945242906" CREATED="1455910949003" MODIFIED="1455910949003" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5763,7 +5858,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="左ツールバー" ID="ID_148946538" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="左ツールバー" ID="ID_148946538" CREATED="1455910949003" MODIFIED="1455910949003" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5792,7 +5887,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="ステータスバーを表示" ID="ID_183960920" TEXT_SHORTENED="true">
+<node TEXT="ステータスバーを表示" ID="ID_183960920" CREATED="1455910949003" MODIFIED="1455910949003" TEXT_SHORTENED="true">
<icon BUILTIN="icon_not_found"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -5811,8 +5906,10 @@
</html>
</richcontent>
</node>
-<node TEXT="コンテキストメニュー" FOLDED="true" ID="ID_1460700080" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="228"/>
+<node TEXT="" ID="ID_691111776" CREATED="1455910949163" MODIFIED="1455910949163">
+<hook NAME="SummaryNode"/>
+<node TEXT="コンテキストメニュー" FOLDED="true" ID="ID_1460700080" CREATED="1455910949004" MODIFIED="1455910949004" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="171.0 pt"/>
<attribute NAME="Chapter" VALUE="1,2,3,4,5"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -5842,8 +5939,7 @@
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
-<node TEXT="コンテキストメニュー" ID="ID_726221219">
+<node TEXT="コンテキストメニュー" ID="ID_726221219" CREATED="1455910949004" MODIFIED="1455910949004">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -5863,7 +5959,8 @@
</node>
</node>
</node>
-<node TEXT="プロパティパネル" FOLDED="true" ID="ID_1077996948" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="プロパティパネル" FOLDED="true" ID="ID_1077996948" CREATED="1455910949004" MODIFIED="1455910949004" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5880,7 +5977,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3,4,5"/>
-<node TEXT="プロパティパネル" FOLDED="true" ID="ID_396068406" TEXT_SHORTENED="true">
+<node TEXT="プロパティパネル" FOLDED="true" ID="ID_396068406" CREATED="1455910949004" MODIFIED="1455910949004" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -5899,7 +5996,7 @@
</body>
</html>
</richcontent>
-<node TEXT="F キーにプロパティパネルを割り当て" STYLE_REF="ToNote" ID="ID_1264703855"><richcontent TYPE="DETAILS">
+<node TEXT="F キーにプロパティパネルを割り当て" STYLE_REF="ToNote" ID="ID_1264703855" CREATED="1455910949005" MODIFIED="1455910949005"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5927,7 +6024,7 @@
</richcontent>
</node>
</node>
-<node TEXT="書式" FOLDED="true" ID="ID_352838225" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="書式" FOLDED="true" ID="ID_352838225" CREATED="1455910949005" MODIFIED="1455910949005" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -5966,11 +6063,12 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
-<node TEXT="階層別スタイルを適用" STYLE_REF="UnChecked" ID="ID_1391835038">
+<node TEXT="" ID="ID_1083273615" CREATED="1455910949164" MODIFIED="1455910949164">
<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="線の色を自動選択" STYLE_REF="UnChecked" ID="ID_502377582"/>
-<node TEXT="スタイル" ID="ID_1431348942" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="階層別スタイルを適用" STYLE_REF="UnChecked" ID="ID_1391835038" CREATED="1455910949005" MODIFIED="1455910949005"/>
+<node TEXT="線の色を自動選択" STYLE_REF="UnChecked" ID="ID_502377582" CREATED="1455910949005" MODIFIED="1455910949005"/>
+<node TEXT="スタイル" ID="ID_1431348942" CREATED="1455910949005" MODIFIED="1455910949005" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6000,7 +6098,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノード用条件対応ノードスタイル" ID="ID_1586903922" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ノード用条件対応ノードスタイル" ID="ID_1586903922" CREATED="1455910949005" MODIFIED="1455910949005" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6027,7 +6125,7 @@
</html>
</richcontent>
</node>
-<node TEXT="マップ用条件対応ノードスタイル" ID="ID_30023461" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="マップ用条件対応ノードスタイル" ID="ID_30023461" CREATED="1455910949006" MODIFIED="1455910949006" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6054,9 +6152,9 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードスタイル" STYLE_REF="MenuGroupLabel" ID="ID_1821920845" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1703524782" CREATED="1455910949164" MODIFIED="1455910949164">
<hook NAME="SummaryNode"/>
-<richcontent TYPE="DETAILS">
+<node TEXT="ノードスタイル" STYLE_REF="MenuGroupLabel" ID="ID_1821920845" CREATED="1455910949006" MODIFIED="1455910949006" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6075,17 +6173,22 @@
</html>
</richcontent>
</node>
-<node TEXT="文字色" ID="ID_1017818154">
+</node>
+<node TEXT="" ID="ID_1325877711" CREATED="1455910949164" MODIFIED="1455910949164">
<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="背景色" ID="ID_1715234182"/>
-<node TEXT="ノードコア全体の色" STYLE_REF="MenuGroupLabel" ID="ID_729013895" TEXT_SHORTENED="true">
+<node TEXT="文字色" ID="ID_1017818154" CREATED="1455910949006" MODIFIED="1455910949006"/>
+<node TEXT="背景色" ID="ID_1715234182" CREATED="1455910949006" MODIFIED="1455910949006"/>
+<node TEXT="" ID="ID_743613414" CREATED="1455910949164" MODIFIED="1455910949164">
<hook NAME="SummaryNode"/>
+<node TEXT="ノードコア全体の色" STYLE_REF="MenuGroupLabel" ID="ID_729013895" CREATED="1455910949006" MODIFIED="1455910949006" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="テンプレート/書式" FOLDED="true" ID="ID_1589962574">
+<node TEXT="" ID="ID_283140181" CREATED="1455910949164" MODIFIED="1455910949164">
<hook NAME="FirstGroupNode"/>
-<node TEXT="標準" STYLE_REF="OptionalValue" ID="ID_1741429260" FORMAT="STANDARD_FORMAT"/>
-<node TEXT="テキストのみ" STYLE_REF="OptionalValue" ID="ID_1270028285" FORMAT="STANDARD_FORMAT" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="テンプレート/書式" FOLDED="true" ID="ID_1589962574" CREATED="1455910949006" MODIFIED="1455910949006">
+<node TEXT="標準" STYLE_REF="OptionalValue" ID="ID_1741429260" CREATED="1455910949006" MODIFIED="1455910949006" FORMAT="STANDARD_FORMAT"/>
+<node TEXT="テキストのみ" STYLE_REF="OptionalValue" ID="ID_1270028285" CREATED="1455910949006" MODIFIED="1455910949006" FORMAT="STANDARD_FORMAT" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6099,18 +6202,22 @@
</html>
</richcontent>
</node>
-<node TEXT="#0,####" STYLE_REF="OptionalValue" ID="ID_1336519812" FORMAT="Text#0,####"/>
-<node TEXT="#,00" STYLE_REF="OptionalValue" ID="ID_1407835038" FORMAT="Text#0,####"/>
-<node TEXT="#" STYLE_REF="OptionalValue" ID="ID_963707448" FORMAT="Text#0,####"/>
-<node TEXT="#,##%" STYLE_REF="OptionalValue" ID="ID_1672350213" FORMAT="Text#0,####"/>
-<node TEXT="d-M-yy" STYLE_REF="OptionalValue" ID="ID_65722678" FORMAT="Text#0,####"/>
-<node TEXT="etc." STYLE_REF="OptionalValue" ID="ID_1181579783" FORMAT="Text#0,####"/>
+<node TEXT="#0,####" STYLE_REF="OptionalValue" ID="ID_1336519812" CREATED="1455910949006" MODIFIED="1455910949006" FORMAT="Text#0,####"/>
+<node TEXT="#,00" STYLE_REF="OptionalValue" ID="ID_1407835038" CREATED="1455910949006" MODIFIED="1455910949006" FORMAT="Text#0,####"/>
+<node TEXT="#" STYLE_REF="OptionalValue" ID="ID_963707448" CREATED="1455910949006" MODIFIED="1455910949006" FORMAT="Text#0,####"/>
+<node TEXT="#,##%" STYLE_REF="OptionalValue" ID="ID_1672350213" CREATED="1455910949006" MODIFIED="1455910949006" FORMAT="Text#0,####"/>
+<node TEXT="d-M-yy" STYLE_REF="OptionalValue" ID="ID_65722678" CREATED="1455910949006" MODIFIED="1455910949006" FORMAT="Text#0,####"/>
+<node TEXT="etc." STYLE_REF="OptionalValue" ID="ID_1181579783" CREATED="1455910949006" MODIFIED="1455910949006" FORMAT="Text#0,####"/>
</node>
-<node TEXT="ノードに番号を振る" ID="ID_1670355105"/>
-<node TEXT="ノードコアのテキスト" STYLE_REF="MenuGroupLabel" ID="ID_1832969838" TEXT_SHORTENED="true">
+<node TEXT="ノードに番号を振る" ID="ID_1670355105" CREATED="1455910949006" MODIFIED="1455910949006"/>
+<node TEXT="" ID="ID_523469989" CREATED="1455910949164" MODIFIED="1455910949164">
<hook NAME="SummaryNode"/>
+<node TEXT="ノードコアのテキスト" STYLE_REF="MenuGroupLabel" ID="ID_1832969838" CREATED="1455910949006" MODIFIED="1455910949006" TEXT_SHORTENED="true"/>
+</node>
+<node TEXT="" ID="ID_1822248291" CREATED="1455910949164" MODIFIED="1455910949164">
+<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="ノードの形" FOLDED="true" ID="ID_1110821777" TEXT_SHORTENED="true">
+<node TEXT="ノードの形" FOLDED="true" ID="ID_1110821777" CREATED="1455910949006" MODIFIED="1455910949006" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6128,14 +6235,13 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="フォーク" STYLE_REF="OptionalValue" ID="ID_1438908832" STYLE="as_parent" TEXT_SHORTENED="true">
+<node TEXT="フォーク" STYLE_REF="OptionalValue" ID="ID_1438908832" CREATED="1455910949007" MODIFIED="1455910949007" STYLE="as_parent" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="囲み" STYLE_REF="OptionalValue" ID="ID_774828193" TEXT_SHORTENED="true">
+<node TEXT="囲み" STYLE_REF="OptionalValue" ID="ID_774828193" CREATED="1455910949007" MODIFIED="1455910949007" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="複合" STYLE_REF="OptionalValue" ID="ID_137832332" TEXT_SHORTENED="true">
+<node TEXT="複合" STYLE_REF="OptionalValue" ID="ID_137832332" CREATED="1455910949007" MODIFIED="1455910949007" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -6151,11 +6257,11 @@
</html>
</richcontent>
</node>
-<node TEXT="親と同じ" STYLE_REF="OptionalValue" ID="ID_670977408" TEXT_SHORTENED="true">
+<node TEXT="親と同じ" STYLE_REF="OptionalValue" ID="ID_670977408" CREATED="1455910949007" MODIFIED="1455910949007" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="ノードの最小表示幅" ID="ID_1696334412" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ノードの最小表示幅" ID="ID_1696334412" CREATED="1455910949007" MODIFIED="1455910949007" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6180,7 +6286,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードの最大表示幅" ID="ID_443108256" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ノードの最大表示幅" ID="ID_443108256" CREATED="1455910949007" MODIFIED="1455910949007" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6205,10 +6311,11 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードの形" STYLE_REF="MenuGroupLabel" ID="ID_575182472" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_797805711" CREATED="1455910949165" MODIFIED="1455910949165">
<hook NAME="SummaryNode"/>
+<node TEXT="ノードの形" STYLE_REF="MenuGroupLabel" ID="ID_575182472" CREATED="1455910949007" MODIFIED="1455910949007" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="ノード全体のフォント" FOLDED="true" ID="ID_852543166" TEXT_SHORTENED="true">
+<node TEXT="ノード全体のフォント" FOLDED="true" ID="ID_852543166" CREATED="1455910949007" MODIFIED="1455910949007" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6226,13 +6333,13 @@
</body>
</html>
</richcontent>
-<node TEXT="標準的な文字サイズを設定" ID="ID_627969850">
+<node TEXT="標準的な文字サイズを設定" ID="ID_627969850" CREATED="1455910949007" MODIFIED="1455910949007">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="ハイパーリンク" ID="ID_265935349" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ハイパーリンク" ID="ID_265935349" CREATED="1455910949007" MODIFIED="1455910949007" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6247,7 +6354,7 @@
</richcontent>
</node>
</node>
-<node TEXT="ノードの色" ID="ID_618617648" TEXT_SHORTENED="true">
+<node TEXT="ノードの色" ID="ID_618617648" CREATED="1455910949007" MODIFIED="1455910949007" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6277,7 +6384,10 @@
</html>
</richcontent>
</node>
-<node TEXT="線の太さ" ID="ID_1686802072" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1153901796" CREATED="1455910949165" MODIFIED="1455910949165">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="線の太さ" ID="ID_1686802072" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6295,9 +6405,8 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="線の形状" ID="ID_1046684670" TEXT_SHORTENED="true">
+<node TEXT="線の形状" ID="ID_1046684670" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6316,7 +6425,7 @@
</html>
</richcontent>
</node>
-<node TEXT="線の色" ID="ID_1289674666" TEXT_SHORTENED="true">
+<node TEXT="線の色" ID="ID_1289674666" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6335,10 +6444,14 @@
</html>
</richcontent>
</node>
-<node TEXT="線(エッジ)のプロパティ" STYLE_REF="MenuGroupLabel" ID="ID_701937546" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_821428513" CREATED="1455910949165" MODIFIED="1455910949165">
<hook NAME="SummaryNode"/>
+<node TEXT="線(エッジ)のプロパティ" STYLE_REF="MenuGroupLabel" ID="ID_701937546" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="雲の色" FOLDED="true" ID="ID_1647687904" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_177527553" CREATED="1455910949165" MODIFIED="1455910949165">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="雲の色" FOLDED="true" ID="ID_1647687904" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6356,14 +6469,14 @@
</body>
</html>
</richcontent>
-<node TEXT="雲の標準色を設定" ID="ID_1130479055">
+<node TEXT="雲の標準色を設定" ID="ID_1130479055" CREATED="1455910949008" MODIFIED="1455910949008">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="雲の形" ID="ID_744366298" TEXT_SHORTENED="true">
+<node TEXT="雲の形" ID="ID_744366298" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6382,10 +6495,11 @@
</html>
</richcontent>
</node>
-<node TEXT="雲" STYLE_REF="MenuGroupLabel" ID="ID_1623448777" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1076626035" CREATED="1455910949165" MODIFIED="1455910949165">
<hook NAME="SummaryNode"/>
+<node TEXT="雲" STYLE_REF="MenuGroupLabel" ID="ID_1623448777" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="スタイルをリセット" ID="ID_632536338" TEXT_SHORTENED="true">
+<node TEXT="スタイルをリセット" ID="ID_632536338" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -6404,7 +6518,7 @@
</html>
</richcontent>
</node>
-<node TEXT="プロパティパネルに表示されないもの" FOLDED="true" ID="ID_1183497454" TEXT_SHORTENED="true">
+<node TEXT="プロパティパネルに表示されないもの" FOLDED="true" ID="ID_1183497454" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -6433,7 +6547,7 @@
</body>
</html>
</richcontent>
-<node TEXT="ノードを点滅" ID="ID_448837997" TEXT_SHORTENED="true">
+<node TEXT="ノードを点滅" ID="ID_448837997" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6451,12 +6565,12 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードの文字色を薄く" ID="ID_1262317918" TEXT_SHORTENED="true">
+<node TEXT="ノードの文字色を薄く" ID="ID_1262317918" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="マップの背景色" ID="ID_1405359076" TEXT_SHORTENED="true">
+<node TEXT="マップの背景色" ID="ID_1405359076" CREATED="1455910949008" MODIFIED="1455910949008" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6474,7 +6588,7 @@
</html>
</richcontent>
</node>
-<node TEXT="線を隠す" ID="ID_898973967" TEXT_SHORTENED="true">
+<node TEXT="線を隠す" ID="ID_898973967" CREATED="1455910949009" MODIFIED="1455910949009" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -6494,13 +6608,13 @@
</node>
</node>
</node>
-<node TEXT="カレンダー/属性" FOLDED="true" ID="ID_1378770530">
+<node TEXT="カレンダー/属性" FOLDED="true" ID="ID_1378770530" CREATED="1455910949009" MODIFIED="1455910949009">
<icon BUILTIN="../AttributesView"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
-<node TEXT="カレンダー" FOLDED="true" ID="ID_290207655" FORMAT="#0.####" TEXT_SHORTENED="true">
+<node TEXT="カレンダー" FOLDED="true" ID="ID_290207655" CREATED="1455910949009" MODIFIED="1455910949009" FORMAT="#0.####" TEXT_SHORTENED="true">
<icon BUILTIN="icon_not_found"/>
<icon BUILTIN="../TimeManagementAction"/>
<hook NAME="NodeConditionalStyles">
@@ -6525,14 +6639,14 @@
</body>
</html>
</richcontent>
-<node TEXT="日付形式(年月日)" ID="ID_1787036916">
+<node TEXT="日付形式(年月日)" ID="ID_1787036916" CREATED="1455910949010" MODIFIED="1455910949010">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
</node>
-<node TEXT="時刻形式(時分)" ID="ID_84292188"/>
-<node TEXT="カレンダーをリセット" ID="ID_433312299">
+<node TEXT="時刻形式(時分)" ID="ID_84292188" CREATED="1455910949010" MODIFIED="1455910949010"/>
+<node TEXT="カレンダーをリセット" ID="ID_433312299" CREATED="1455910949010" MODIFIED="1455910949010">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -6551,7 +6665,7 @@
</html>
</richcontent>
</node>
-<node TEXT="選択中の日付を挿入" ID="ID_1841166395">
+<node TEXT="選択中の日付を挿入" ID="ID_1841166395" CREATED="1455910949010" MODIFIED="1455910949010">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -6570,7 +6684,7 @@
</html>
</richcontent>
</node>
-<node TEXT="スクリプトを編集..." FOLDED="true" ID="ID_1867868792">
+<node TEXT="スクリプトを編集..." FOLDED="true" ID="ID_1867868792" CREATED="1455910949010" MODIFIED="1455910949010">
<attribute NAME="Chapter" VALUE="5"/>
<richcontent TYPE="DETAILS">
@@ -6596,7 +6710,7 @@
</body>
</html>
</richcontent>
-<node TEXT="リマインダでスクリプトを起動" ID="ID_891575752" TEXT_SHORTENED="true">
+<node TEXT="リマインダでスクリプトを起動" ID="ID_891575752" CREATED="1455910949010" MODIFIED="1455910949010" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="5"/>
<richcontent TYPE="DETAILS">
@@ -6645,7 +6759,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="カレンダーで選択した日にリマインダを設定" ID="ID_749923119">
+<node TEXT="カレンダーで選択した日にリマインダを設定" ID="ID_749923119" CREATED="1455910949011" MODIFIED="1455910949011">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -6686,7 +6800,7 @@
</html>
</richcontent>
</node>
-<node TEXT="指定期間経過後にリマインド" ID="ID_760755432"><richcontent TYPE="DETAILS">
+<node TEXT="指定期間経過後にリマインド" ID="ID_760755432" CREATED="1455910949011" MODIFIED="1455910949011"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6703,13 +6817,13 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="リマインダを削除" FOLDED="true" ID="ID_896190385">
+<node TEXT="リマインダを削除" FOLDED="true" ID="ID_896190385" CREATED="1455910949011" MODIFIED="1455910949011">
<icon BUILTIN="../ReminderHookAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
-<node TEXT="" ID="ID_1662954268" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1662954268" CREATED="1455910949011" MODIFIED="1455910949011" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -6742,7 +6856,7 @@
</node>
</node>
</node>
-<node TEXT="属性" FOLDED="true" ID="ID_453776568" TEXT_SHORTENED="true">
+<node TEXT="属性" FOLDED="true" ID="ID_453776568" CREATED="1455910949012" MODIFIED="1455910949012" TEXT_SHORTENED="true">
<icon BUILTIN="../showAttributes"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
@@ -6769,19 +6883,22 @@
</body>
</html>
</richcontent>
-<node TEXT="新規属性" ID="ID_769541389">
+<node TEXT="" ID="ID_393120686" CREATED="1455910949165" MODIFIED="1455910949165">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="新規属性" ID="ID_769541389" CREATED="1455910949012" MODIFIED="1455910949012">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="表示幅を適正化" ID="ID_1893272407">
+<node TEXT="表示幅を適正化" ID="ID_1893272407" CREATED="1455910949012" MODIFIED="1455910949012">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="3"/>
</node>
-<node TEXT="属性データの書式設定" ID="ID_758656022" TEXT_SHORTENED="true">
+<node TEXT="属性データの書式設定" ID="ID_758656022" CREATED="1455910949012" MODIFIED="1455910949012" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="3,4"/>
<richcontent TYPE="DETAILS">
@@ -6810,7 +6927,7 @@
<font BOLD="false"/>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="属性一覧表" ID="ID_1780631612" HGAP="16" VSHIFT="-4" TEXT_SHORTENED="true">
+<node TEXT="属性一覧表" ID="ID_1780631612" CREATED="1455910949012" MODIFIED="1455910949012" HGAP_QUANTITY="16.0 px" VSHIFT_QUANTITY="-4.0 px" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -6866,7 +6983,9 @@
</html>
</richcontent>
</node>
-<node TEXT="" ID="ID_1442016230" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_500049157" CREATED="1455910949165" MODIFIED="1455910949165">
+<hook NAME="SummaryNode"/>
+<node TEXT="" ID="ID_1442016230" CREATED="1455910949012" MODIFIED="1455910949012" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -6896,12 +7015,12 @@
</html>
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<hook NAME="SummaryNode"/>
</node>
</node>
</node>
</node>
-<node TEXT="拡大表示" ID="ID_280352342" TEXT_SHORTENED="true">
+</node>
+<node TEXT="拡大表示" ID="ID_280352342" CREATED="1455910949012" MODIFIED="1455910949012" TEXT_SHORTENED="true">
<icon BUILTIN="../ZoomIn24"/>
<richcontent TYPE="DETAILS">
@@ -6918,7 +7037,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="縮小表示" ID="ID_1102837452" TEXT_SHORTENED="true">
+<node TEXT="縮小表示" ID="ID_1102837452" CREATED="1455910949013" MODIFIED="1455910949013" TEXT_SHORTENED="true">
<icon BUILTIN="../ZoomOut24"/>
<richcontent TYPE="DETAILS">
@@ -6935,7 +7054,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="ページに合わせて全体表示" ID="ID_1827952663" TEXT_SHORTENED="true">
+<node TEXT="ページに合わせて全体表示" ID="ID_1827952663" CREATED="1455910949014" MODIFIED="1455910949014" TEXT_SHORTENED="true">
<icon BUILTIN="../FitToPage"/>
<richcontent TYPE="DETAILS">
@@ -6952,7 +7071,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="選択ノードを中央へ" FOLDED="true" ID="ID_1924496837" TEXT_SHORTENED="true">
+<node TEXT="選択ノードを中央へ" FOLDED="true" ID="ID_1924496837" CREATED="1455910949015" MODIFIED="1455910949015" TEXT_SHORTENED="true">
<icon BUILTIN="../CenterSelectedNodeAction"/>
<richcontent TYPE="DETAILS">
@@ -6985,7 +7104,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="マップをスクロール/移動" ID="ID_586656393">
+<node TEXT="マップをスクロール/移動" ID="ID_586656393" CREATED="1455910949016" MODIFIED="1455910949016">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -7007,11 +7126,11 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="選択ノードを自動的に中央へ" ID="ID_1299718023">
+<node TEXT="選択ノードを自動的に中央へ" ID="ID_1299718023" CREATED="1455910949016" MODIFIED="1455910949016">
<icon BUILTIN="help"/>
</node>
-<node TEXT="ビューモード" FOLDED="true" ID="ID_1492135940">
-<node TEXT="アウトラインビュー" ID="ID_386430636" TEXT_SHORTENED="true">
+<node TEXT="ビューモード" FOLDED="true" ID="ID_1492135940" CREATED="1455910949016" MODIFIED="1455910949016">
+<node TEXT="アウトラインビュー" ID="ID_386430636" CREATED="1455910949016" MODIFIED="1455910949016" TEXT_SHORTENED="true">
<icon BUILTIN="../outline_view"/>
<richcontent TYPE="DETAILS">
@@ -7046,7 +7165,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="全画面表示" FOLDED="true" ID="ID_1521008407"><richcontent TYPE="DETAILS">
+<node TEXT="全画面表示" FOLDED="true" ID="ID_1521008407" CREATED="1455910949017" MODIFIED="1455910949017"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7063,7 +7182,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<edge COLOR="#00ffff"/>
-<node TEXT="" ID="ID_358916035">
+<node TEXT="" ID="ID_358916035" CREATED="1455910949017" MODIFIED="1455910949017">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -7082,7 +7201,7 @@
</richcontent>
</node>
</node>
-<node TEXT="プレゼンテーションモード" STYLE_REF="Method" ID="ID_1924930800"><richcontent TYPE="DETAILS">
+<node TEXT="プレゼンテーションモード" STYLE_REF="Method" ID="ID_1924930800" CREATED="1455910949017" MODIFIED="1455910949017"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7096,7 +7215,7 @@
</html>
</richcontent>
</node>
-<node TEXT="選択ノードを枠囲い表示" ID="ID_1861944976">
+<node TEXT="選択ノードを枠囲い表示" ID="ID_1861944976" CREATED="1455910949017" MODIFIED="1455910949017">
<icon BUILTIN="../ShowSelectionAsRectangleAction"/>
<richcontent TYPE="DETAILS">
@@ -7123,7 +7242,7 @@
</html>
</richcontent>
</node>
-<node TEXT="計算式ノードを枠囲い表示" ID="ID_1847984972">
+<node TEXT="計算式ノードを枠囲い表示" ID="ID_1847984972" CREATED="1455910949017" MODIFIED="1455910949017">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7142,7 +7261,7 @@
</richcontent>
</node>
</node>
-<node TEXT="ノードを短縮表示" ID="ID_180063018"><richcontent TYPE="DETAILS">
+<node TEXT="ノードを短縮表示" ID="ID_180063018" CREATED="1455910949017" MODIFIED="1455910949017"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7173,7 +7292,7 @@
</html>
</richcontent>
</node>
-<node TEXT="詳細を隠す" ID="ID_505492779"><richcontent TYPE="DETAILS">
+<node TEXT="詳細を隠す" ID="ID_505492779" CREATED="1455910949017" MODIFIED="1455910949017"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7201,8 +7320,8 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ツールチップ" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1175712776">
-<node TEXT="ノード情報をツールチップ表示" FOLDED="true" ID="ID_145445877">
+<node TEXT="ツールチップ" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1175712776" CREATED="1455910949017" MODIFIED="1455910949017">
+<node TEXT="ノード情報をツールチップ表示" FOLDED="true" ID="ID_145445877" CREATED="1455910949017" MODIFIED="1455910949017">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7233,8 +7352,7 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="ツールチップ" ID="ID_1150336926"><richcontent TYPE="DETAILS">
+<node TEXT="ツールチップ" ID="ID_1150336926" CREATED="1455910949017" MODIFIED="1455910949017"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7272,11 +7390,11 @@
<attribute NAME="Chapter" VALUE="1"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ツールチップの幅を設定" ID="ID_97393030">
+<node TEXT="ツールチップの幅を設定" ID="ID_97393030" CREATED="1455910949018" MODIFIED="1455910949018">
<edge COLOR="#00ffcc"/>
</node>
</node>
-<node TEXT="ノードスタイルをツールチップ表示" ID="ID_1094721175"><richcontent TYPE="DETAILS">
+<node TEXT="ノードスタイルをツールチップ表示" ID="ID_1094721175" CREATED="1455910949018" MODIFIED="1455910949018"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7302,7 +7420,7 @@
</richcontent>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT=" 更新時刻を表示" ID="ID_469328587">
+<node TEXT=" 更新時刻を表示" ID="ID_469328587" CREATED="1455910949018" MODIFIED="1455910949018">
<icon BUILTIN="../kword"/>
<richcontent TYPE="DETAILS">
@@ -7333,7 +7451,7 @@
</hook>
</node>
</node>
-<node TEXT="属性" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1722579390" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="属性" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1722579390" CREATED="1455910949018" MODIFIED="1455910949018" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7379,17 +7497,19 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
+<node TEXT="" ID="ID_1337360810" CREATED="1455910949166" MODIFIED="1455910949166">
<hook NAME="FirstGroupNode"/>
-<node TEXT="表示する属性を限定" ID="ID_1659163007" COLOR="#000000">
+</node>
+<node TEXT="表示する属性を限定" ID="ID_1659163007" CREATED="1455910949019" MODIFIED="1455910949019" COLOR="#000000">
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="すべての属性を表示" ID="ID_1547638958" COLOR="#000000">
+<node TEXT="すべての属性を表示" ID="ID_1547638958" CREATED="1455910949019" MODIFIED="1455910949019" COLOR="#000000">
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="すべての属性を隠す" ID="ID_1232036138" COLOR="#000000">
+<node TEXT="すべての属性を隠す" ID="ID_1232036138" CREATED="1455910949019" MODIFIED="1455910949019" COLOR="#000000">
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="属性付きアイコンを表示" ID="ID_1771820903" TEXT_SHORTENED="true">
+<node TEXT="属性付きアイコンを表示" ID="ID_1771820903" CREATED="1455910949019" MODIFIED="1455910949019" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7407,9 +7527,10 @@
</html>
</richcontent>
</node>
-<node TEXT="属性付きアイコンを表示/非表示" ID="ID_194201519" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1667923401" CREATED="1455910949166" MODIFIED="1455910949166">
<hook NAME="SummaryNode"/>
-<attribute_layout VALUE_WIDTH="228"/>
+<node TEXT="属性付きアイコンを表示/非表示" ID="ID_194201519" CREATED="1455910949019" MODIFIED="1455910949019" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="171.0 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -7435,8 +7556,12 @@
<edge COLOR="#00ffcc"/>
</node>
</node>
-<node TEXT="ノート" STYLE_REF="SubMenu" FOLDED="true" ID="ID_76001248">
-<node TEXT="ノートパネルを表示" FOLDED="true" ID="ID_1712383563" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="ノート" STYLE_REF="SubMenu" FOLDED="true" ID="ID_76001248" CREATED="1455910949019" MODIFIED="1455910949019">
+<node TEXT="" ID="ID_682099361" CREATED="1455910949167" MODIFIED="1455910949167">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノートパネルを表示" FOLDED="true" ID="ID_1712383563" CREATED="1455910949019" MODIFIED="1455910949019" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7466,8 +7591,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="ノートパネル" ID="ID_1416159748">
+<node TEXT="ノートパネル" ID="ID_1416159748" CREATED="1455910949019" MODIFIED="1455910949019">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -7486,7 +7610,7 @@
</richcontent>
</node>
</node>
-<node TEXT="ノートパネルの位置" ID="ID_1945121061" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ノートパネルの位置" ID="ID_1945121061" CREATED="1455910949019" MODIFIED="1455910949019" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -7503,7 +7627,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="マップ内にノートを表示" ID="ID_414331404" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="マップ内にノートを表示" ID="ID_414331404" CREATED="1455910949019" MODIFIED="1455910949019" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -7534,7 +7658,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ノート付きアイコンを表示" ID="ID_1472695653" TEXT_SHORTENED="true">
+<node TEXT="ノート付きアイコンを表示" ID="ID_1472695653" CREATED="1455910949019" MODIFIED="1455910949019" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7552,9 +7676,10 @@
</html>
</richcontent>
</node>
-<node TEXT="ノートの表示" FOLDED="true" ID="ID_1709371267" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_277117771" CREATED="1455910949167" MODIFIED="1455910949167">
<hook NAME="SummaryNode"/>
-<attribute_layout VALUE_WIDTH="215"/>
+<node TEXT="ノートの表示" FOLDED="true" ID="ID_1709371267" CREATED="1455910949019" MODIFIED="1455910949019" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="161.25 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -7577,8 +7702,8 @@
</body>
</html>
</richcontent>
-<node TEXT="アイコンの表示" ID="ID_987755339" TEXT_SHORTENED="true">
-<attribute_layout VALUE_WIDTH="160"/>
+<node TEXT="アイコンの表示" ID="ID_987755339" CREATED="1455910949019" MODIFIED="1455910949019" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="120.0 pt"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -7627,7 +7752,8 @@
</node>
</node>
</node>
-<node TEXT="書  式" FOLDED="true" ID="ID_258919699" TEXT_SHORTENED="true" MIN_WIDTH="60"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="書  式" FOLDED="true" ID="ID_258919699" CREATED="1455910949019" MODIFIED="1455910949019" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7708,7 +7834,10 @@
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="スタイルを適用" FOLDED="true" ID="ID_12581765" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1701128035" CREATED="1455910949169" MODIFIED="1455910949169">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="スタイルを適用" FOLDED="true" ID="ID_12581765" CREATED="1455910949020" MODIFIED="1455910949020" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7753,7 +7882,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="標準スタイル" ID="ID_987807688" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1423581595" CREATED="1455910949167" MODIFIED="1455910949167">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="標準スタイル" ID="ID_987807688" CREATED="1455910949020" MODIFIED="1455910949020" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -7774,7 +7906,7 @@
</html>
</richcontent>
</node>
-<node TEXT="詳細" ID="ID_1577454061" TEXT_SHORTENED="true">
+<node TEXT="詳細" ID="ID_1577454061" CREATED="1455910949020" MODIFIED="1455910949020" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -7803,7 +7935,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノート" ID="ID_985652023" TEXT_SHORTENED="true">
+<node TEXT="ノート" ID="ID_985652023" CREATED="1455910949020" MODIFIED="1455910949020" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -7832,7 +7964,7 @@
</html>
</richcontent>
</node>
-<node TEXT="フローティングノード" STYLE_REF="OptionalValue" ID="ID_114978489" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="フローティングノード" STYLE_REF="OptionalValue" ID="ID_114978489" CREATED="1455910949020" MODIFIED="1455910949020" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7857,11 +7989,12 @@
</html>
</richcontent>
</node>
-<node TEXT="階層別スタイル" STYLE_REF="Method" ID="ID_1364581880" TEXT_SHORTENED="true"/>
-<node TEXT="標準の「文字サイズ」、「囲み」等." ID="ID_1228191937" TEXT_SHORTENED="true">
+<node TEXT="階層別スタイル" STYLE_REF="Method" ID="ID_1364581880" CREATED="1455910949020" MODIFIED="1455910949020" TEXT_SHORTENED="true"/>
+<node TEXT="" ID="ID_805165132" CREATED="1455910949167" MODIFIED="1455910949167">
<hook NAME="SummaryNode"/>
+<node TEXT="標準の「文字サイズ」、「囲み」等." ID="ID_1228191937" CREATED="1455910949020" MODIFIED="1455910949020" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="ユーザ定義スタイル" ID="ID_1409741910" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ユーザ定義スタイル" ID="ID_1409741910" CREATED="1455910949020" MODIFIED="1455910949020" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -7903,7 +8036,7 @@
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="階層別スタイルを適用" FOLDED="true" ID="ID_1450514499" TEXT_SHORTENED="true">
+<node TEXT="階層別スタイルを適用" FOLDED="true" ID="ID_1450514499" CREATED="1455910949020" MODIFIED="1455910949020" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -7943,41 +8076,46 @@
</body>
</html>
</richcontent>
-<node TEXT="末端ノードを除いて" STYLE_REF="OptionalValue" ID="ID_1030603587"/>
-<node TEXT="すべてのノードに" STYLE_REF="OptionalValue" ID="ID_1569605151"/>
-<node TEXT="しない" STYLE_REF="OptionalValue" ID="ID_1863350006">
+<node TEXT="" ID="ID_1370001506" CREATED="1455910949168" MODIFIED="1455910949168">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="末端ノードを除いて" STYLE_REF="OptionalValue" ID="ID_1030603587" CREATED="1455910949020" MODIFIED="1455910949020"/>
+<node TEXT="すべてのノードに" STYLE_REF="OptionalValue" ID="ID_1569605151" CREATED="1455910949020" MODIFIED="1455910949020"/>
+<node TEXT="しない" STYLE_REF="OptionalValue" ID="ID_1863350006" CREATED="1455910949020" MODIFIED="1455910949020">
<icon BUILTIN="checked"/>
</node>
-<node TEXT="標準的なスタイル" FOLDED="true" ID="ID_188699461">
+<node TEXT="" ID="ID_1478158240" CREATED="1455910949168" MODIFIED="1455910949168">
<hook NAME="SummaryNode"/>
-<node TEXT="ルートノード書式" ID="ID_1910558168">
+<node TEXT="標準的なスタイル" FOLDED="true" ID="ID_188699461" CREATED="1455910949020" MODIFIED="1455910949020">
+<node TEXT="ルートノード書式" ID="ID_1910558168" CREATED="1455910949020" MODIFIED="1455910949020">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="第1階層ノード書式" ID="ID_1061646156">
+<node TEXT="第1階層ノード書式" ID="ID_1061646156" CREATED="1455910949020" MODIFIED="1455910949020">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="第2階層ノード書式" ID="ID_295345617">
+<node TEXT="第2階層ノード書式" ID="ID_295345617" CREATED="1455910949021" MODIFIED="1455910949021">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="第3階層ノード書式" ID="ID_1858463079">
+<node TEXT="第3階層ノード書式" ID="ID_1858463079" CREATED="1455910949021" MODIFIED="1455910949021">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="第4階層ノード書式" ID="ID_653069130">
+<node TEXT="第4階層ノード書式" ID="ID_653069130" CREATED="1455910949021" MODIFIED="1455910949021">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node TEXT="スタイルを管理" STYLE_REF="MainMenuAccent" FOLDED="true" ID="ID_1090849795" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="スタイルを管理" STYLE_REF="MainMenuAccent" FOLDED="true" ID="ID_1090849795" CREATED="1455910949021" MODIFIED="1455910949021" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8034,7 +8172,10 @@
</hook>
<attribute NAME="Chapter" VALUE="4"/>
<edge STYLE="horizontal"/>
-<node TEXT="選択ノードから新スタイルを作成" FOLDED="true" ID="ID_36146276" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1266569375" CREATED="1455910949169" MODIFIED="1455910949169">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="選択ノードから新スタイルを作成" FOLDED="true" ID="ID_36146276" CREATED="1455910949021" MODIFIED="1455910949021" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8079,7 +8220,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="詳細と属性のスタイル" ID="ID_543594355">
+<node TEXT="詳細と属性のスタイル" ID="ID_543594355" CREATED="1455910949021" MODIFIED="1455910949021">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -8113,7 +8254,7 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="スタイルを再定義" STYLE_REF="Functie" ID="ID_1707980722"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="スタイルを再定義" STYLE_REF="Functie" ID="ID_1707980722" CREATED="1455910949021" MODIFIED="1455910949021"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -8131,7 +8272,7 @@
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="マップ用条件対応スタイルを管理" FOLDED="true" ID="ID_862335179" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="マップ用条件対応スタイルを管理" FOLDED="true" ID="ID_862335179" CREATED="1455910949021" MODIFIED="1455910949021" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8188,8 +8329,11 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="スタイルルール一覧表" STYLE_REF="Method" FOLDED="true" ID="ID_1892790832" TEXT_SHORTENED="true">
-<node TEXT="無指定" ID="ID_1530876191" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_691919845" CREATED="1455910949168" MODIFIED="1455910949168">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="スタイルルール一覧表" STYLE_REF="Method" FOLDED="true" ID="ID_1892790832" CREATED="1455910949021" MODIFIED="1455910949021" TEXT_SHORTENED="true">
+<node TEXT="無指定" ID="ID_1530876191" CREATED="1455910949021" MODIFIED="1455910949021" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -8208,7 +8352,7 @@
</richcontent>
</node>
</node>
-<node TEXT="新規" ID="ID_480666891"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="新規" ID="ID_480666891" CREATED="1455910949022" MODIFIED="1455910949022"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -8223,7 +8367,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="編集" LOCALIZED_STYLE_REF="defaultstyle.details" ID="ID_1156234230"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="編集" LOCALIZED_STYLE_REF="defaultstyle.details" ID="ID_1156234230" CREATED="1455910949022" MODIFIED="1455910949022"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -8238,7 +8382,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="削除" ID="ID_856150360"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="削除" ID="ID_856150360" CREATED="1455910949022" MODIFIED="1455910949022"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -8253,7 +8397,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="上へ" ID="ID_669310386"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="上へ" ID="ID_669310386" CREATED="1455910949022" MODIFIED="1455910949022"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -8268,7 +8412,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="下へ" ID="ID_599078930"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="下へ" ID="ID_599078930" CREATED="1455910949022" MODIFIED="1455910949022"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -8285,7 +8429,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="有効/無効" ID="ID_1024757647" TEXT_SHORTENED="true">
+<node TEXT="有効/無効" ID="ID_1024757647" CREATED="1455910949022" MODIFIED="1455910949022" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
</hook>
@@ -8303,7 +8447,7 @@
</html>
</richcontent>
</node>
-<node TEXT="条件" STYLE_REF="Method" FOLDED="true" ID="ID_1978595059" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="条件" STYLE_REF="Method" FOLDED="true" ID="ID_1978595059" CREATED="1455910949022" MODIFIED="1455910949022" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8316,7 +8460,7 @@
</body>
</html>
</richcontent>
-<node TEXT="常時適用" ID="ID_674682159" TEXT_SHORTENED="true">
+<node TEXT="常時適用" ID="ID_674682159" CREATED="1455910949022" MODIFIED="1455910949022" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -8335,8 +8479,8 @@
</richcontent>
</node>
</node>
-<node TEXT="スタイル" STYLE_REF="Method" FOLDED="true" ID="ID_763369934" TEXT_SHORTENED="true">
-<node TEXT="標準スタイル" ID="ID_1063009738" TEXT_SHORTENED="true">
+<node TEXT="スタイル" STYLE_REF="Method" FOLDED="true" ID="ID_763369934" CREATED="1455910949022" MODIFIED="1455910949022" TEXT_SHORTENED="true">
+<node TEXT="標準スタイル" ID="ID_1063009738" CREATED="1455910949022" MODIFIED="1455910949022" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -8355,7 +8499,7 @@
</richcontent>
</node>
</node>
-<node TEXT="適用を中止" ID="ID_1428874055">
+<node TEXT="適用を中止" ID="ID_1428874055" CREATED="1455910949022" MODIFIED="1455910949022">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
</hook>
@@ -8373,13 +8517,14 @@
</html>
</richcontent>
</node>
-<node TEXT="" FOLDED="true" ID="ID_1576410916" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1662536191" CREATED="1455910949168" MODIFIED="1455910949168">
<hook NAME="SummaryNode"/>
+<node TEXT="" FOLDED="true" ID="ID_1576410916" CREATED="1455910949022" MODIFIED="1455910949022" TEXT_SHORTENED="true">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_375587204" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_375587204" CREATED="1455910949023" MODIFIED="1455910949023" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -8398,7 +8543,7 @@
</html>
</richcontent>
</node>
-<node TEXT="テンプレート" ID="ID_40236894" TEXT_SHORTENED="true">
+<node TEXT="テンプレート" ID="ID_40236894" CREATED="1455910949023" MODIFIED="1455910949023" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -8446,9 +8591,8 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="更新" ID="ID_1791624318" TEXT_SHORTENED="true">
+<node TEXT="更新" ID="ID_1791624318" CREATED="1455910949023" MODIFIED="1455910949023" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
@@ -8471,7 +8615,8 @@
</node>
</node>
</node>
-<node TEXT="ノード用条件対応スタイルを管理" FOLDED="true" ID="ID_1036704793" TEXT_SHORTENED="true">
+</node>
+<node TEXT="ノード用条件対応スタイルを管理" FOLDED="true" ID="ID_1036704793" CREATED="1455910949023" MODIFIED="1455910949023" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -8529,8 +8674,11 @@
</html>
</richcontent>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="スタイルルール一覧表" STYLE_REF="Method" FOLDED="true" ID="ID_1052864132" TEXT_SHORTENED="true">
-<node TEXT="無指定" ID="ID_493498986" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_216166769" CREATED="1455910949169" MODIFIED="1455910949169">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="スタイルルール一覧表" STYLE_REF="Method" FOLDED="true" ID="ID_1052864132" CREATED="1455910949023" MODIFIED="1455910949023" TEXT_SHORTENED="true">
+<node TEXT="無指定" ID="ID_493498986" CREATED="1455910949023" MODIFIED="1455910949023" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -8549,7 +8697,7 @@
</richcontent>
</node>
</node>
-<node TEXT="新規" ID="ID_1298449597"><richcontent TYPE="DETAILS">
+<node TEXT="新規" ID="ID_1298449597" CREATED="1455910949023" MODIFIED="1455910949023"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8564,7 +8712,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="編集" LOCALIZED_STYLE_REF="defaultstyle.details" ID="ID_406358269"><richcontent TYPE="DETAILS">
+<node TEXT="編集" LOCALIZED_STYLE_REF="defaultstyle.details" ID="ID_406358269" CREATED="1455910949023" MODIFIED="1455910949023"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8579,7 +8727,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="削除" ID="ID_1903263169"><richcontent TYPE="DETAILS">
+<node TEXT="削除" ID="ID_1903263169" CREATED="1455910949023" MODIFIED="1455910949023"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8594,7 +8742,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="上へ" ID="ID_765242491"><richcontent TYPE="DETAILS">
+<node TEXT="上へ" ID="ID_765242491" CREATED="1455910949023" MODIFIED="1455910949023"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8609,7 +8757,7 @@
</richcontent>
<edge COLOR="#00ffff"/>
</node>
-<node TEXT="下へ" ID="ID_1887002293"><richcontent TYPE="DETAILS">
+<node TEXT="下へ" ID="ID_1887002293" CREATED="1455910949024" MODIFIED="1455910949024"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8626,7 +8774,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="有効/無効" ID="ID_1525930437" TEXT_SHORTENED="true">
+<node TEXT="有効/無効" ID="ID_1525930437" CREATED="1455910949024" MODIFIED="1455910949024" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
</hook>
@@ -8644,7 +8792,7 @@
</html>
</richcontent>
</node>
-<node TEXT="条件" STYLE_REF="Method" FOLDED="true" ID="ID_904940681"><richcontent TYPE="DETAILS">
+<node TEXT="条件" STYLE_REF="Method" FOLDED="true" ID="ID_904940681" CREATED="1455910949024" MODIFIED="1455910949024"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8657,7 +8805,7 @@
</body>
</html>
</richcontent>
-<node TEXT="常時適用" ID="ID_1758183773">
+<node TEXT="常時適用" ID="ID_1758183773" CREATED="1455910949024" MODIFIED="1455910949024">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -8676,8 +8824,8 @@
</richcontent>
</node>
</node>
-<node TEXT="スタイル" STYLE_REF="Method" ID="ID_1608086112" TEXT_SHORTENED="true"/>
-<node TEXT="適用を中止" ID="ID_1550870112" TEXT_SHORTENED="true">
+<node TEXT="スタイル" STYLE_REF="Method" ID="ID_1608086112" CREATED="1455910949024" MODIFIED="1455910949024" TEXT_SHORTENED="true"/>
+<node TEXT="適用を中止" ID="ID_1550870112" CREATED="1455910949024" MODIFIED="1455910949024" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
</hook>
@@ -8695,10 +8843,11 @@
</html>
</richcontent>
</node>
-<node TEXT="" FOLDED="true" ID="ID_8484574">
+<node TEXT="" ID="ID_1617058285" CREATED="1455910949169" MODIFIED="1455910949169">
<hook NAME="SummaryNode"/>
+<node TEXT="" FOLDED="true" ID="ID_8484574" CREATED="1455910949024" MODIFIED="1455910949024">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="条件対応ノードスタイル" ID="ID_1620188987" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="条件対応ノードスタイル" ID="ID_1620188987" CREATED="1455910949024" MODIFIED="1455910949024" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8734,7 +8883,8 @@
</node>
</node>
</node>
-<node TEXT="マップのスタイルをコピー..." ID="ID_750856626"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="マップのスタイルをコピー..." ID="ID_750856626" CREATED="1455910949024" MODIFIED="1455910949024"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8766,7 +8916,7 @@
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="スタイルを編集" STYLE_REF="Functie" ID="ID_802116782"><richcontent TYPE="DETAILS">
+<node TEXT="スタイルを編集" STYLE_REF="Functie" ID="ID_802116782" CREATED="1455910949024" MODIFIED="1455910949024"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -8810,12 +8960,13 @@
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="詳細情報" STYLE_REF="Aggregatie als Toelichting" FOLDED="true" ID="ID_222498027" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1491066187" CREATED="1455910949169" MODIFIED="1455910949169">
<hook NAME="SummaryNode"/>
+<node TEXT="詳細情報" STYLE_REF="Aggregatie als Toelichting" FOLDED="true" ID="ID_222498027" CREATED="1455910949024" MODIFIED="1455910949024" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="スタイル(及びノードテンプレート)" ID="ID_402718478" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="156"/>
+<node TEXT="スタイル(及びノードテンプレート)" ID="ID_402718478" CREATED="1455910949024" MODIFIED="1455910949024" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="117.0 pt"/>
<attribute NAME="Chapter" VALUE="4"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
@@ -8834,7 +8985,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードテンプレート" ID="ID_613710379" TEXT_SHORTENED="true">
+<node TEXT="ノードテンプレート" ID="ID_613710379" CREATED="1455910949024" MODIFIED="1455910949024" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -8867,13 +9018,13 @@
</html>
</richcontent>
</node>
-<node TEXT="スタイルの事例" ID="ID_1082773930" TEXT_SHORTENED="true">
+<node TEXT="スタイルの事例" ID="ID_1082773930" CREATED="1455910949024" MODIFIED="1455910949024" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="スタイル設定ファイルの所在" ID="ID_1808303966" TEXT_SHORTENED="true">
+<node TEXT="スタイル設定ファイルの所在" ID="ID_1808303966" CREATED="1455910949024" MODIFIED="1455910949024" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
@@ -8904,7 +9055,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Wiki" ID="ID_1760412130" LINK="http://freeplane.sourceforge.net/wiki/index.php/Node_styles" TEXT_SHORTENED="true">
+<node TEXT="Wiki" ID="ID_1760412130" CREATED="1455910949025" MODIFIED="1455910949025" LINK="http://freeplane.sourceforge.net/wiki/index.php/Node_styles" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
@@ -8912,7 +9063,8 @@
</node>
</node>
</node>
-<node TEXT="書式のみコピー" ID="ID_693387904" TEXT_SHORTENED="true">
+</node>
+<node TEXT="書式のみコピー" ID="ID_693387904" CREATED="1455910949025" MODIFIED="1455910949025" TEXT_SHORTENED="true">
<icon BUILTIN="../colorpicker"/>
<richcontent TYPE="DETAILS">
@@ -8942,7 +9094,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="書式のみ貼り付け" ID="ID_1734557080" TEXT_SHORTENED="true">
+<node TEXT="書式のみ貼り付け" ID="ID_1734557080" CREATED="1455910949026" MODIFIED="1455910949026" TEXT_SHORTENED="true">
<icon BUILTIN="../color_fill"/>
<richcontent TYPE="DETAILS">
@@ -8972,10 +9124,11 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="スタイル関連" STYLE_REF="MenuGroupLabel" ID="ID_1980044435">
+<node TEXT="" ID="ID_226749214" CREATED="1455910949169" MODIFIED="1455910949169">
<hook NAME="SummaryNode"/>
+<node TEXT="スタイル関連" STYLE_REF="MenuGroupLabel" ID="ID_1980044435" CREATED="1455910949026" MODIFIED="1455910949026"/>
</node>
-<node TEXT="マップの背景色" FOLDED="true" ID="ID_1557216828" TEXT_SHORTENED="true">
+<node TEXT="マップの背景色" FOLDED="true" ID="ID_1557216828" CREATED="1455910949026" MODIFIED="1455910949026" TEXT_SHORTENED="true">
<icon BUILTIN="../MapBackgroundColorAction"/>
<richcontent TYPE="DETAILS">
@@ -8994,7 +9147,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<node TEXT="" ID="ID_1977210206">
+<node TEXT="" ID="ID_1977210206" CREATED="1455910949027" MODIFIED="1455910949027">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -9014,8 +9167,11 @@
</richcontent>
</node>
</node>
-<node TEXT="ノードコア関連" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1843588390" TEXT_SHORTENED="true">
-<node TEXT="太字" ID="ID_1005762082" TEXT_SHORTENED="true">
+<node TEXT="ノードコア関連" STYLE_REF="SubMenu" FOLDED="true" ID="ID_1843588390" CREATED="1455910949027" MODIFIED="1455910949027" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1262589276" CREATED="1455910949169" MODIFIED="1455910949169">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="太字" ID="ID_1005762082" CREATED="1455910949027" MODIFIED="1455910949027" TEXT_SHORTENED="true">
<icon BUILTIN="../Bold16"/>
<font NAME="SansSerif" SIZE="10" BOLD="true" ITALIC="false"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -9045,12 +9201,11 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="斜体" ID="ID_1681586335" TEXT_SHORTENED="true">
+<node TEXT="斜体" ID="ID_1681586335" CREATED="1455910949028" MODIFIED="1455910949028" TEXT_SHORTENED="true">
<icon BUILTIN="../Italic16"/>
<font ITALIC="true"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -9084,7 +9239,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="文字を大きく" ID="ID_1187292367" TEXT_SHORTENED="true">
+<node TEXT="文字を大きく" ID="ID_1187292367" CREATED="1455910949029" MODIFIED="1455910949029" TEXT_SHORTENED="true">
<icon BUILTIN="../IncreaseNodeFontAction"/>
<font NAME="SansSerif" SIZE="14" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -9119,7 +9274,7 @@
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="文字を小さく" ID="ID_853991944" TEXT_SHORTENED="true">
+<node TEXT="文字を小さく" ID="ID_853991944" CREATED="1455910949030" MODIFIED="1455910949030" TEXT_SHORTENED="true">
<icon BUILTIN="../DecreaseNodeFontAction"/>
<font SIZE="10"/>
<richcontent TYPE="DETAILS">
@@ -9154,7 +9309,9 @@
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node ID="ID_1704677561" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_291292022" CREATED="1455910949169" MODIFIED="1455910949169">
+<hook NAME="SummaryNode"/>
+<node ID="ID_1704677561" CREATED="1455910949031" MODIFIED="1455910949031" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -9166,8 +9323,8 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="SummaryNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -9214,7 +9371,11 @@
</richcontent>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノードの文字色" ID="ID_335924504" COLOR="#ff3366" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1177295809" CREATED="1455910949170" MODIFIED="1455910949170">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノードの文字色" ID="ID_335924504" CREATED="1455910949031" MODIFIED="1455910949031" COLOR="#ff3366" TEXT_SHORTENED="true">
<icon BUILTIN="../NodeColorAction"/>
<richcontent TYPE="DETAILS">
@@ -9229,13 +9390,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノードを点滅" FOLDED="true" ID="ID_1142682661" COLOR="#663300" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<node TEXT="ノードを点滅" FOLDED="true" ID="ID_1142682661" CREATED="1455910949032" MODIFIED="1455910949032" COLOR="#663300" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
<icon BUILTIN="../xeyes"/>
<edge COLOR="#00ffcc"/>
<richcontent TYPE="DETAILS">
@@ -9256,7 +9416,7 @@
</hook>
<attribute NAME="Chapter" VALUE="4"/>
<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
-<node TEXT="" ID="ID_1082064875">
+<node TEXT="" ID="ID_1082064875" CREATED="1455910949033" MODIFIED="1455910949033">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -9275,7 +9435,7 @@
</richcontent>
</node>
</node>
-<node TEXT="ノードの文字色を薄く" FOLDED="true" ID="ID_497736570" COLOR="#663300" TEXT_SHORTENED="true">
+<node TEXT="ノードの文字色を薄く" FOLDED="true" ID="ID_497736570" CREATED="1455910949033" MODIFIED="1455910949033" COLOR="#663300" TEXT_SHORTENED="true">
<icon BUILTIN="../NodeColorBlendAction"/>
<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -9295,7 +9455,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
-<node TEXT="" ID="ID_1351465676" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1351465676" CREATED="1455910949034" MODIFIED="1455910949034" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -9314,7 +9474,9 @@
</richcontent>
</node>
</node>
-<node ID="ID_1852080174" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_816283087" CREATED="1455910949170" MODIFIED="1455910949170">
+<hook NAME="SummaryNode"/>
+<node ID="ID_1852080174" CREATED="1455910949034" MODIFIED="1455910949034" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -9326,8 +9488,8 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="SummaryNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -9375,7 +9537,11 @@
</richcontent>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノードの背景色..." ID="ID_408257432" COLOR="#663300" BACKGROUND_COLOR="#ffcc00" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_235655582" CREATED="1455910949170" MODIFIED="1455910949170">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノードの背景色..." ID="ID_408257432" CREATED="1455910949035" MODIFIED="1455910949035" COLOR="#663300" BACKGROUND_COLOR="#ffcc00" TEXT_SHORTENED="true">
<icon BUILTIN="../NodeBackgroundColorAction"/>
<richcontent TYPE="DETAILS">
@@ -9404,19 +9570,23 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="背景色" ID="ID_1500784824" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_133772780" CREATED="1455910949170" MODIFIED="1455910949170">
+<hook NAME="SummaryNode"/>
+<node TEXT="背景色" ID="ID_1500784824" CREATED="1455910949036" MODIFIED="1455910949036" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="フォーク" ID="ID_219217071" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="" ID="ID_1571475734" CREATED="1455910949170" MODIFIED="1455910949170">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="フォーク" ID="ID_219217071" CREATED="1455910949036" MODIFIED="1455910949036" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9447,7 +9617,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="囲み" ID="ID_720694634" STYLE="bubble" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="囲み" ID="ID_720694634" CREATED="1455910949036" MODIFIED="1455910949036" STYLE="bubble" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9478,8 +9648,9 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ノードの中心領域を囲む" ID="ID_1543767381" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_314432899" CREATED="1455910949170" MODIFIED="1455910949170">
<hook NAME="SummaryNode"/>
+<node TEXT="ノードの中心領域を囲む" ID="ID_1543767381" CREATED="1455910949036" MODIFIED="1455910949036" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -9503,7 +9674,8 @@
</html>
</richcontent>
</node>
-<node TEXT="書式のみ削除" ID="ID_574252881" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="書式のみ削除" ID="ID_574252881" CREATED="1455910949036" MODIFIED="1455910949036" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9532,24 +9704,26 @@
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="プレーンテキストを使用" ID="ID_1756064919">
+<node TEXT="プレーンテキストを使用" ID="ID_1756064919" CREATED="1455910949036" MODIFIED="1455910949036">
<font NAME="SansSerif" SIZE="8" BOLD="false" ITALIC="false"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="雲(付加 or 形を変更)" FOLDED="true" ID="ID_581461366" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_221736486" CREATED="1455910949170" MODIFIED="1455910949170">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="雲(付加 or 形を変更)" FOLDED="true" ID="ID_581461366" CREATED="1455910949036" MODIFIED="1455910949036" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
-<node TEXT="モクモク" STYLE_REF="OptionalValue" ID="ID_1461340368"/>
-<node TEXT="トンガリ" STYLE_REF="OptionalValue" ID="ID_158500016"/>
-<node TEXT="矩形" STYLE_REF="OptionalValue" ID="ID_217797528"/>
-<node TEXT="円角矩形" STYLE_REF="OptionalValue" ID="ID_988146678"/>
+<node TEXT="モクモク" STYLE_REF="OptionalValue" ID="ID_1461340368" CREATED="1455910949037" MODIFIED="1455910949037"/>
+<node TEXT="トンガリ" STYLE_REF="OptionalValue" ID="ID_158500016" CREATED="1455910949037" MODIFIED="1455910949037"/>
+<node TEXT="矩形" STYLE_REF="OptionalValue" ID="ID_217797528" CREATED="1455910949037" MODIFIED="1455910949037"/>
+<node TEXT="円角矩形" STYLE_REF="OptionalValue" ID="ID_988146678" CREATED="1455910949037" MODIFIED="1455910949037"/>
</node>
-<node TEXT="雲の色" ID="ID_1382807141" TEXT_SHORTENED="true">
+<node TEXT="雲の色" ID="ID_1382807141" CREATED="1455910949037" MODIFIED="1455910949037" TEXT_SHORTENED="true">
<icon BUILTIN="../Colors24"/>
<richcontent TYPE="DETAILS">
@@ -9582,16 +9756,19 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="雲のプロパティ" STYLE_REF="Aggregatie als Toelichting" ID="ID_132719467" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1282285411" CREATED="1455910949170" MODIFIED="1455910949170">
+<hook NAME="SummaryNode"/>
+<node TEXT="雲のプロパティ" STYLE_REF="Aggregatie als Toelichting" ID="ID_132719467" CREATED="1455910949038" MODIFIED="1455910949038" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="4"/>
</node>
-<node TEXT="線(エッジ)の形状" FOLDED="true" ID="ID_1000239088" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1397387126" CREATED="1455910949171" MODIFIED="1455910949171">
<hook NAME="FirstGroupNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="線(エッジ)の形状" FOLDED="true" ID="ID_1000239088" CREATED="1455910949038" MODIFIED="1455910949038" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -9638,33 +9815,33 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<node TEXT="" FOLDED="true" ID="ID_258701321" STYLE="bubble" TEXT_SHORTENED="true">
+<node TEXT="" FOLDED="true" ID="ID_258701321" CREATED="1455910949038" MODIFIED="1455910949038" STYLE="bubble" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
-<node TEXT="親と同じ" ID="ID_1753794271" TEXT_SHORTENED="true"/>
-<node TEXT="直線" ID="ID_364465531" HGAP="30" TEXT_SHORTENED="true">
+<node TEXT="親と同じ" ID="ID_1753794271" CREATED="1455910949038" MODIFIED="1455910949038" TEXT_SHORTENED="true"/>
+<node TEXT="直線" ID="ID_364465531" CREATED="1455910949038" MODIFIED="1455910949038" HGAP_QUANTITY="30.0 px" TEXT_SHORTENED="true">
<edge STYLE="linear" WIDTH="4"/>
</node>
-<node TEXT="ベジェ曲線" ID="ID_417523311" HGAP="40" TEXT_SHORTENED="true">
+<node TEXT="ベジェ曲線" ID="ID_417523311" CREATED="1455910949038" MODIFIED="1455910949038" HGAP_QUANTITY="40.0 px" TEXT_SHORTENED="true">
<edge STYLE="bezier" WIDTH="4"/>
</node>
-<node TEXT="先細直線" ID="ID_883676052" HGAP="40" TEXT_SHORTENED="true">
+<node TEXT="先細直線" ID="ID_883676052" CREATED="1455910949038" MODIFIED="1455910949038" HGAP_QUANTITY="40.0 px" TEXT_SHORTENED="true">
<edge STYLE="sharp_linear" WIDTH="4"/>
</node>
-<node TEXT="先細ベジェ曲線" FOLDED="true" ID="ID_1907794464" HGAP="40" TEXT_SHORTENED="true">
+<node TEXT="先細ベジェ曲線" FOLDED="true" ID="ID_1907794464" CREATED="1455910949038" MODIFIED="1455910949038" HGAP_QUANTITY="40.0 px" TEXT_SHORTENED="true">
<edge STYLE="sharp_bezier" WIDTH="4"/>
-<node TEXT="" ID="ID_1775469652"/>
+<node TEXT="" ID="ID_1775469652" CREATED="1455910949038" MODIFIED="1455910949038"/>
</node>
-<node TEXT="直角曲がり" ID="ID_1985550574" TEXT_SHORTENED="true">
+<node TEXT="直角曲がり" ID="ID_1985550574" CREATED="1455910949038" MODIFIED="1455910949038" TEXT_SHORTENED="true">
<edge STYLE="horizontal"/>
</node>
-<node TEXT="線を隠す" ID="ID_454401259" BACKGROUND_COLOR="#00ffff" HGAP="50" TEXT_SHORTENED="true">
+<node TEXT="線を隠す" ID="ID_454401259" CREATED="1455910949038" MODIFIED="1455910949038" BACKGROUND_COLOR="#00ffff" HGAP_QUANTITY="50.0 px" TEXT_SHORTENED="true">
<edge STYLE="hide_edge" WIDTH="4"/>
</node>
</node>
</node>
-<node TEXT="線(エッジ)の太さ" ID="ID_525079287" TEXT_SHORTENED="true">
+<node TEXT="線(エッジ)の太さ" ID="ID_525079287" CREATED="1455910949038" MODIFIED="1455910949038" TEXT_SHORTENED="true">
<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -9717,7 +9894,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="線(エッジ)の色" ID="ID_865389195">
+<node TEXT="線(エッジ)の色" ID="ID_865389195" CREATED="1455910949039" MODIFIED="1455910949039">
<edge COLOR="#ff0000"/>
<richcontent TYPE="DETAILS">
@@ -9736,7 +9913,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="線(エッジ)の色を自動選択" ID="ID_17143142">
+<node TEXT="線(エッジ)の色を自動選択" ID="ID_17143142" CREATED="1455910949039" MODIFIED="1455910949039">
<icon BUILTIN="../AutomaticEdgeColorHookAction"/>
<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -9756,9 +9933,9 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="線(エッジ)のプロパティ" STYLE_REF="Aggregatie als Toelichting" ID="ID_881523974" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_581704142" CREATED="1455910949171" MODIFIED="1455910949171">
<hook NAME="SummaryNode"/>
-<richcontent TYPE="DETAILS">
+<node TEXT="線(エッジ)のプロパティ" STYLE_REF="Aggregatie als Toelichting" ID="ID_881523974" CREATED="1455910949041" MODIFIED="1455910949041" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9775,7 +9952,8 @@
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
-<node TEXT="ノードの表示幅を設定" ID="ID_41094966" MAX_WIDTH="600" MIN_WIDTH="1"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="ノードの表示幅を設定" ID="ID_41094966" CREATED="1455910949041" MODIFIED="1455910949041" MAX_WIDTH="600.0 px" MIN_WIDTH="1.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9815,7 +9993,7 @@
</hook>
</node>
</node>
-<node TEXT="ナビゲーション" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1224083972" TEXT_SHORTENED="true" MIN_WIDTH="60">
+<node TEXT="ナビゲーション" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1224083972" CREATED="1455910949041" MODIFIED="1455910949041" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px">
<attribute NAME="Chapter" VALUE="1,2,6"/>
<richcontent TYPE="DETAILS">
@@ -9830,7 +10008,10 @@
</body>
</html>
</richcontent>
-<node TEXT="前のマップ" ID="ID_772717665" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1534922172" CREATED="1455910949171" MODIFIED="1455910949171">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="前のマップ" ID="ID_772717665" CREATED="1455910949041" MODIFIED="1455910949041" TEXT_SHORTENED="true">
<icon BUILTIN="../MoveTo_PrevMM"/>
<richcontent TYPE="DETAILS">
@@ -9845,13 +10026,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2.6"/>
</node>
-<node TEXT="次のマップ" ID="ID_1349480446" TEXT_SHORTENED="true">
+<node TEXT="次のマップ" ID="ID_1349480446" CREATED="1455910949043" MODIFIED="1455910949043" TEXT_SHORTENED="true">
<icon BUILTIN="../MoveTo_NextMM"/>
<richcontent TYPE="DETAILS">
@@ -9871,14 +10051,19 @@
</hook>
<attribute NAME="Chapter" VALUE="2.6"/>
</node>
-<node TEXT="[他の]マップに移動" ID="ID_1280267907">
+<node TEXT="" ID="ID_747940193" CREATED="1455910949171" MODIFIED="1455910949171">
<hook NAME="SummaryNode"/>
+<node TEXT="[他の]マップに移動" ID="ID_1280267907" CREATED="1455910949044" MODIFIED="1455910949044">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2.6"/>
</node>
-<node TEXT="折り畳む/展開する" ID="ID_1444974765" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="" ID="ID_981937419" CREATED="1455910949171" MODIFIED="1455910949171">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="折り畳む/展開する" ID="ID_1444974765" CREATED="1455910949044" MODIFIED="1455910949044" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -9902,16 +10087,15 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="次の子ノードを表示" ID="ID_436333083">
+<node TEXT="次の子ノードを表示" ID="ID_436333083" CREATED="1455910949044" MODIFIED="1455910949044">
<icon BUILTIN="help"/>
</node>
-<node TEXT="子ノードを折り畳む/展開する" ID="ID_1186846640" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="子ノードを折り畳む/展開する" ID="ID_1186846640" CREATED="1455910949045" MODIFIED="1455910949045" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -9949,7 +10133,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="1階層分だけ展開する" ID="ID_376192264" TEXT_SHORTENED="true">
+<node TEXT="1階層分だけ展開する" ID="ID_376192264" CREATED="1455910949045" MODIFIED="1455910949045" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_one_level"/>
<richcontent TYPE="DETAILS">
@@ -9969,7 +10153,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="1階層分だけ折り畳む" ID="ID_721830946" TEXT_SHORTENED="true">
+<node TEXT="1階層分だけ折り畳む" ID="ID_721830946" CREATED="1455910949046" MODIFIED="1455910949046" TEXT_SHORTENED="true">
<icon BUILTIN="../fold_one_level"/>
<richcontent TYPE="DETAILS">
@@ -9989,7 +10173,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="すべて展開する" ID="ID_530681399" TEXT_SHORTENED="true">
+<node TEXT="すべて展開する" ID="ID_530681399" CREATED="1455910949047" MODIFIED="1455910949047" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_all"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -10026,7 +10210,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="すべて折り畳む" ID="ID_1834329963" TEXT_SHORTENED="true">
+<node TEXT="すべて折り畳む" ID="ID_1834329963" CREATED="1455910949048" MODIFIED="1455910949048" TEXT_SHORTENED="true">
<icon BUILTIN="../fold_all"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -10063,9 +10247,10 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="ノードを折り畳む" ID="ID_101814873" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1978131032" CREATED="1455910949171" MODIFIED="1455910949171">
<hook NAME="SummaryNode"/>
-<attribute_layout VALUE_WIDTH="202"/>
+<node TEXT="ノードを折り畳む" ID="ID_101814873" CREATED="1455910949049" MODIFIED="1455910949049" TEXT_SHORTENED="true">
+<attribute_layout VALUE_WIDTH="151.5 pt"/>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -10085,7 +10270,11 @@
</html>
</richcontent>
</node>
-<node TEXT="表示中のすべてのノードを選択" ID="ID_1410954936" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="" ID="ID_533247956" CREATED="1455910949173" MODIFIED="1455910949173">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="表示中のすべてのノードを選択" ID="ID_1410954936" CREATED="1455910949049" MODIFIED="1455910949049" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -10098,12 +10287,11 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="枝の表示ノードをすべて選択" ID="ID_1872670234" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="枝の表示ノードをすべて選択" ID="ID_1872670234" CREATED="1455910949049" MODIFIED="1455910949049" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -10120,13 +10308,18 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="選択" ID="ID_719444432" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_652004838" CREATED="1455910949173" MODIFIED="1455910949173">
<hook NAME="SummaryNode"/>
+<node TEXT="選択" ID="ID_719444432" CREATED="1455910949049" MODIFIED="1455910949049" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
-<node TEXT="ルートノードへジャンプ" ID="ID_552590784" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="" ID="ID_1249668708" CREATED="1455910949174" MODIFIED="1455910949174">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ルートノードへジャンプ" ID="ID_552590784" CREATED="1455910949049" MODIFIED="1455910949049" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10153,14 +10346,13 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
-<attribute_layout VALUE_WIDTH="156"/>
+<attribute_layout VALUE_WIDTH="117.0 pt"/>
<attribute NAME="Chapter" VALUE="1"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="指定IDのノードへジャンプ..." ID="ID_1300709095" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="指定IDのノードへジャンプ..." ID="ID_1300709095" CREATED="1455910949050" MODIFIED="1455910949050" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10178,7 +10370,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="前のノード" ID="ID_1148907029" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="前のノード" ID="ID_1148907029" CREATED="1455910949050" MODIFIED="1455910949050" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10207,7 +10399,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="次のノード" ID="ID_696016397" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="次のノード" ID="ID_696016397" CREATED="1455910949050" MODIFIED="1455910949050" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10236,7 +10428,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="前のノード(折り畳む)" ID="ID_824359474" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="前のノード(折り畳む)" ID="ID_824359474" CREATED="1455910949050" MODIFIED="1455910949050" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10254,7 +10446,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="次のノード(折り畳む)" ID="ID_1071961971" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="次のノード(折り畳む)" ID="ID_1071961971" CREATED="1455910949050" MODIFIED="1455910949050" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10272,10 +10464,10 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="次のプレゼンテーションアイテムを展開" ID="ID_1509753321" TEXT_SHORTENED="true">
+<node TEXT="次のプレゼンテーションアイテムを展開" ID="ID_1509753321" CREATED="1455910949050" MODIFIED="1455910949050" TEXT_SHORTENED="true">
<icon BUILTIN="help"/>
</node>
-<node TEXT="選択履歴を遡る" ID="ID_1202592565" TEXT_SHORTENED="true">
+<node TEXT="選択履歴を遡る" ID="ID_1202592565" CREATED="1455910949050" MODIFIED="1455910949050" TEXT_SHORTENED="true">
<icon BUILTIN="../MoveTo_PrevNode"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -10295,7 +10487,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="選択履歴を進む" ID="ID_958193774" TEXT_SHORTENED="true">
+<node TEXT="選択履歴を進む" ID="ID_958193774" CREATED="1455910949051" MODIFIED="1455910949051" TEXT_SHORTENED="true">
<icon BUILTIN="../MoveTo_NextNode"/>
<richcontent TYPE="DETAILS">
@@ -10315,14 +10507,15 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="ノードを選択" FOLDED="true" ID="ID_950516167" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1962705317" CREATED="1455910949174" MODIFIED="1455910949174">
+<hook NAME="SummaryNode"/>
+<node TEXT="ノードを選択" FOLDED="true" ID="ID_950516167" CREATED="1455910949052" MODIFIED="1455910949052" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,2"/>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="ノードを選択" FOLDED="true" ID="ID_1706331467" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ノードを選択" FOLDED="true" ID="ID_1706331467" CREATED="1455910949053" MODIFIED="1455910949053" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10359,13 +10552,13 @@
</body>
</html>
</richcontent>
-<attribute_layout NAME_WIDTH="82" VALUE_WIDTH="156"/>
+<attribute_layout NAME_WIDTH="61.5 pt" VALUE_WIDTH="117.0 pt"/>
<attribute NAME="Chapter" VALUE="1,2"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_1417441548">
+<node TEXT="" ID="ID_1417441548" CREATED="1455910949053" MODIFIED="1455910949053">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -10397,7 +10590,7 @@
</richcontent>
</node>
</node>
-<node TEXT="一番上/一番下の兄弟ノードを選択" STYLE_REF="Method" ID="ID_1447931824" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="一番上/一番下の兄弟ノードを選択" STYLE_REF="Method" ID="ID_1447931824" CREATED="1455910949053" MODIFIED="1455910949053" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10426,7 +10619,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="すべての下位ノードを選択" STYLE_REF="Method" FOLDED="true" ID="ID_42041187" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="すべての下位ノードを選択" STYLE_REF="Method" FOLDED="true" ID="ID_42041187" CREATED="1455910949053" MODIFIED="1455910949053" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10462,14 +10655,14 @@
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="下位ノードをすべて展開するためのアイコンボタン" ID="ID_982181678">
+<node TEXT="下位ノードをすべて展開するためのアイコンボタン" ID="ID_982181678" CREATED="1455910949053" MODIFIED="1455910949053">
<icon BUILTIN="../unfold_all"/>
</node>
-<node TEXT="下位ノードをすべて折り畳むためのアイコンボタン" ID="ID_1629039399">
+<node TEXT="下位ノードをすべて折り畳むためのアイコンボタン" ID="ID_1629039399" CREATED="1455910949054" MODIFIED="1455910949054">
<icon BUILTIN="../fold_all"/>
</node>
</node>
-<node TEXT="すべてのノードを選択" STYLE_REF="Method" FOLDED="true" ID="ID_543283456" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="すべてのノードを選択" STYLE_REF="Method" FOLDED="true" ID="ID_543283456" CREATED="1455910949054" MODIFIED="1455910949054" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10508,14 +10701,14 @@
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="下位ノードをすべて展開するためのアイコンボタン" ID="ID_602297686" TEXT_SHORTENED="true">
+<node TEXT="下位ノードをすべて展開するためのアイコンボタン" ID="ID_602297686" CREATED="1455910949054" MODIFIED="1455910949054" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_all"/>
</node>
-<node TEXT="下位ノードをすべて折り畳むためのアイコンボタン" ID="ID_587692878" TEXT_SHORTENED="true">
+<node TEXT="下位ノードをすべて折り畳むためのアイコンボタン" ID="ID_587692878" CREATED="1455910949055" MODIFIED="1455910949055" TEXT_SHORTENED="true">
<icon BUILTIN="../fold_all"/>
</node>
</node>
-<node TEXT="フィルタ表示中のすべてのノードを選択" STYLE_REF="Method" ID="ID_17033027" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="フィルタ表示中のすべてのノードを選択" STYLE_REF="Method" ID="ID_17033027" CREATED="1455910949055" MODIFIED="1455910949055" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -10533,7 +10726,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="兄弟ノード群を選択" STYLE_REF="Method" ID="ID_1407618372" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="兄弟ノード群を選択" STYLE_REF="Method" ID="ID_1407618372" CREATED="1455910949055" MODIFIED="1455910949055" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10551,7 +10744,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="任意の複数ノードを選択" STYLE_REF="Method" ID="ID_1462390794" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="任意の複数ノードを選択" STYLE_REF="Method" ID="ID_1462390794" CREATED="1455910949056" MODIFIED="1455910949056" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10569,7 +10762,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="矢印キーを使って選択" STYLE_REF="Method" ID="ID_1895256806" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="矢印キーを使って選択" STYLE_REF="Method" ID="ID_1895256806" CREATED="1455910949056" MODIFIED="1455910949056" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -10601,7 +10794,7 @@
</hook>
<attribute NAME="Chapter" VALUE="2"/>
</node>
-<node TEXT="非表示テキストのツールチップ表示" ID="ID_79959436" COLOR="#407000" TEXT_SHORTENED="true">
+<node TEXT="非表示テキストのツールチップ表示" ID="ID_79959436" CREATED="1455910949056" MODIFIED="1455910949056" COLOR="#407000" TEXT_SHORTENED="true">
<font NAME="SansSerif" SIZE="8"/>
<richcontent TYPE="DETAILS">
@@ -10632,7 +10825,8 @@
<attribute NAME="Chapter" VALUE="2"/>
</node>
</node>
-<node TEXT="リンク先へジャンプ" ID="ID_1139653335" TEXT_SHORTENED="true">
+</node>
+<node TEXT="リンク先へジャンプ" ID="ID_1139653335" CREATED="1455910949056" MODIFIED="1455910949056" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -10662,7 +10856,7 @@
</richcontent>
</node>
</node>
-<node TEXT="フィルタ" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1254354349" TEXT_SHORTENED="true" MIN_WIDTH="60"><richcontent TYPE="DETAILS">
+<node TEXT="フィルタ" STYLE_REF="MainMenu" FOLDED="true" ID="ID_1254354349" CREATED="1455910949056" MODIFIED="1455910949056" TEXT_SHORTENED="true" MIN_WIDTH="60.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -10755,7 +10949,10 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
-<node TEXT="フィルタを元に戻す" ID="ID_783522514" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1959529365" CREATED="1455910949176" MODIFIED="1455910949176">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="フィルタを元に戻す" ID="ID_783522514" CREATED="1455910949057" MODIFIED="1455910949057" TEXT_SHORTENED="true">
<icon BUILTIN="../undo_filter"/>
<richcontent TYPE="DETAILS">
@@ -10770,13 +10967,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="前のフィルタを再適用" ID="ID_1495219991" TEXT_SHORTENED="true">
+<node TEXT="前のフィルタを再適用" ID="ID_1495219991" CREATED="1455910949058" MODIFIED="1455910949058" TEXT_SHORTENED="true">
<icon BUILTIN="../redo_filter"/>
<richcontent TYPE="DETAILS">
@@ -10796,7 +10992,7 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="フィルタをかけ直す" ID="ID_933478204" TEXT_SHORTENED="true">
+<node TEXT="フィルタをかけ直す" ID="ID_933478204" CREATED="1455910949059" MODIFIED="1455910949059" TEXT_SHORTENED="true">
<icon BUILTIN="../reapply_filter"/>
<richcontent TYPE="DETAILS">
@@ -10816,7 +11012,7 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="クィックフィルタ" FOLDED="true" ID="ID_346354481" TEXT_SHORTENED="true">
+<node TEXT="クィックフィルタ" FOLDED="true" ID="ID_346354481" CREATED="1455910949061" MODIFIED="1455910949061" TEXT_SHORTENED="true">
<icon BUILTIN="../apply_quick_filter"/>
<richcontent TYPE="DETAILS">
@@ -10860,7 +11056,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="最近更新したノードを検索" ID="ID_1331944116" TEXT_SHORTENED="true">
+<node TEXT="最近更新したノードを検索" ID="ID_1331944116" CREATED="1455910949062" MODIFIED="1455910949062" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
@@ -10892,7 +11088,7 @@
</richcontent>
</node>
</node>
-<node TEXT="選択ノードに絞って適用" ID="ID_371510333" TEXT_SHORTENED="true">
+<node TEXT="選択ノードに絞って適用" ID="ID_371510333" CREATED="1455910949062" MODIFIED="1455910949062" TEXT_SHORTENED="true">
<icon BUILTIN="../filter_selected_nodes"/>
<richcontent TYPE="DETAILS">
@@ -10924,10 +11120,10 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
-<attribute_layout NAME_WIDTH="68" VALUE_WIDTH="68"/>
+<attribute_layout NAME_WIDTH="51.0 pt" VALUE_WIDTH="51.0 pt"/>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="該当ノードを全て選択" ID="ID_738746195" TEXT_SHORTENED="true">
+<node TEXT="該当ノードを全て選択" ID="ID_738746195" CREATED="1455910949064" MODIFIED="1455910949064" TEXT_SHORTENED="true">
<icon BUILTIN="../select_all_found_nodes"/>
<richcontent TYPE="DETAILS">
@@ -10947,7 +11143,7 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="フィルタ解除" ID="ID_1725256961" TEXT_SHORTENED="true">
+<node TEXT="フィルタ解除" ID="ID_1725256961" CREATED="1455910949065" MODIFIED="1455910949065" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_filtering"/>
<richcontent TYPE="DETAILS">
@@ -10967,7 +11163,7 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="フィルタ条件を指定..." FOLDED="true" ID="ID_1159715573" TEXT_SHORTENED="true">
+<node TEXT="フィルタ条件を指定..." FOLDED="true" ID="ID_1159715573" CREATED="1455910949066" MODIFIED="1455910949066" TEXT_SHORTENED="true">
<icon BUILTIN="../edit_filtering_condition"/>
<richcontent TYPE="DETAILS">
@@ -11034,149 +11230,152 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="最初の入力フィールド" STYLE_REF="Method" FOLDED="true" ID="ID_1798321694" TEXT_SHORTENED="true">
+<node TEXT="最初の入力フィールド" STYLE_REF="Method" FOLDED="true" ID="ID_1798321694" CREATED="1455910949068" MODIFIED="1455910949068" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="テキスト(初期設定)" ID="ID_836877261">
+<node TEXT="テキスト(初期設定)" ID="ID_836877261" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="親ノードのテキスト" ID="ID_1906594792">
+<node TEXT="親ノードのテキスト" ID="ID_1906594792" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="詳細" ID="ID_1225439653">
+<node TEXT="詳細" ID="ID_1225439653" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="アイコン" ID="ID_1215653772">
+<node TEXT="アイコン" ID="ID_1215653772" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="ハイパーリンク" ID="ID_1112769469">
+<node TEXT="ハイパーリンク" ID="ID_1112769469" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="コネクタのラベル" ID="ID_1034887668">
+<node TEXT="コネクタのラベル" ID="ID_1034887668" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="コネクタ" ID="ID_1016868966">
+<node TEXT="コネクタ" ID="ID_1016868966" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="日付フィルタ" ID="ID_438043110">
+<node TEXT="日付フィルタ" ID="ID_438043110" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="優先順位" ID="ID_721879468">
+<node TEXT="優先順位" ID="ID_721879468" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Node" ID="ID_863184223">
+<node TEXT="Node" ID="ID_863184223" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="スタイル" ID="ID_209651598">
+<node TEXT="スタイル" ID="ID_209651598" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="ノード階層" ID="ID_1065140798">
+<node TEXT="ノード階層" ID="ID_1065140798" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="リマインダ" ID="ID_590160509">
+<node TEXT="リマインダ" ID="ID_590160509" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="スクリプトフィルタ" ID="ID_1101909561">
+<node TEXT="スクリプトフィルタ" ID="ID_1101909561" CREATED="1455910949068" MODIFIED="1455910949068">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="ユーザ定義スタイル(複数可)..." ID="ID_1897298627">
+<node TEXT="ユーザ定義スタイル(複数可)..." ID="ID_1897298627" CREATED="1455910949069" MODIFIED="1455910949069">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="2番目の入力フィールド" STYLE_REF="Method" FOLDED="true" ID="ID_811481692" TEXT_SHORTENED="true">
+<node TEXT="2番目の入力フィールド" STYLE_REF="Method" FOLDED="true" ID="ID_811481692" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="⊃(含む)(初期設定)" ID="ID_240865267" TEXT_SHORTENED="true">
+<node TEXT="⊃(含む)(初期設定)" ID="ID_240865267" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="=" ID="ID_267980169" TEXT_SHORTENED="true">
+<node TEXT="=" ID="ID_267980169" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="≒" ID="ID_240370852" TEXT_SHORTENED="true">
+<node TEXT="≒" ID="ID_240370852" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT=">" ID="ID_1696699846" TEXT_SHORTENED="true">
+<node TEXT=">" ID="ID_1696699846" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT=">=" ID="ID_718771812" TEXT_SHORTENED="true">
+<node TEXT=">=" ID="ID_718771812" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="<=" ID="ID_299504018" TEXT_SHORTENED="true">
+<node TEXT="<=" ID="ID_299504018" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT=">" ID="ID_303668262" TEXT_SHORTENED="true">
+<node TEXT=">" ID="ID_303668262" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="正規表現にマッチする" ID="ID_1390468850" TEXT_SHORTENED="true">
+<node TEXT="正規表現にマッチする" ID="ID_1390468850" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="3番目の入力フィールド" STYLE_REF="Method" FOLDED="true" ID="ID_1585437091" TEXT_SHORTENED="true">
+<node TEXT="3番目の入力フィールド" STYLE_REF="Method" FOLDED="true" ID="ID_1585437091" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="空白のテキストフィールド(初期設定)" STYLE_REF="OptionalValue" ID="ID_1708735229"/>
+<node TEXT="空白のテキストフィールド(初期設定)" STYLE_REF="OptionalValue" ID="ID_1708735229" CREATED="1455910949069" MODIFIED="1455910949069"/>
</node>
-<node TEXT="チェックボックス" STYLE_REF="Method" FOLDED="true" ID="ID_1500860624" TEXT_SHORTENED="true">
+<node TEXT="チェックボックス" STYLE_REF="Method" FOLDED="true" ID="ID_1500860624" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="大文字/小文字を区別" ID="ID_745100871" TEXT_SHORTENED="true">
+<node TEXT="大文字/小文字を区別" ID="ID_745100871" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="フィルタ一覧表" STYLE_REF="Method" ID="ID_619518366" TEXT_SHORTENED="true">
+<node TEXT="フィルタ一覧表" STYLE_REF="Method" ID="ID_619518366" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="フィルタ作成ダイアログのボタン" STYLE_REF="Method" FOLDED="true" ID="ID_1629780291" TEXT_SHORTENED="true">
+<node TEXT="フィルタ作成ダイアログのボタン" STYLE_REF="Method" FOLDED="true" ID="ID_1629780291" CREATED="1455910949069" MODIFIED="1455910949069" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="追加" ID="ID_642788524"/>
-<node TEXT="And" ID="ID_792834466"/>
-<node TEXT="Or" ID="ID_626068831"/>
-<node TEXT="分割" ID="ID_1450156585" COLOR="#000000"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_1968714295" CREATED="1455910949176" MODIFIED="1455910949176">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="追加" ID="ID_642788524" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="And" ID="ID_792834466" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="Or" ID="ID_626068831" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="分割" ID="ID_1450156585" CREATED="1455910949069" MODIFIED="1455910949069" COLOR="#000000"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -11190,34 +11389,42 @@
</html>
</richcontent>
</node>
-<node TEXT="削除" ID="ID_1967282606"/>
-<node TEXT="名称を指定" ID="ID_835941218"/>
-<node TEXT="右側" ID="ID_957976689">
+<node TEXT="削除" ID="ID_1967282606" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="名称を指定" ID="ID_835941218" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="" ID="ID_987887887" CREATED="1455910949176" MODIFIED="1455910949176">
+<hook NAME="SummaryNode"/>
+<node TEXT="右側" ID="ID_957976689" CREATED="1455910949069" MODIFIED="1455910949069">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="OK" ID="ID_1790986429"/>
-<node TEXT="適用" ID="ID_678728629"/>
-<node TEXT="キャンセル" ID="ID_1904185070"/>
-<node TEXT="上書き保存" ID="ID_1211473002"/>
-<node TEXT="読み込み" ID="ID_308548304"/>
-<node TEXT="最下部" ID="ID_562384053">
+</node>
+<node TEXT="" ID="ID_901083751" CREATED="1455910949176" MODIFIED="1455910949176">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="OK" ID="ID_1790986429" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="適用" ID="ID_678728629" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="キャンセル" ID="ID_1904185070" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="上書き保存" ID="ID_1211473002" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="読み込み" ID="ID_308548304" CREATED="1455910949069" MODIFIED="1455910949069"/>
+<node TEXT="" ID="ID_1214940730" CREATED="1455910949176" MODIFIED="1455910949176">
+<hook NAME="SummaryNode"/>
+<node TEXT="最下部" ID="ID_562384053" CREATED="1455910949069" MODIFIED="1455910949069">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
</node>
</node>
-<node TEXT="フィルタ表示関係" FOLDED="true" ID="ID_1368479067" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1966927639" CREATED="1455910949176" MODIFIED="1455910949176">
<hook NAME="SummaryNode"/>
+<node TEXT="フィルタ表示関係" FOLDED="true" ID="ID_1368479067" CREATED="1455910949070" MODIFIED="1455910949070" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="フィルタの用例" ID="ID_662270274" TEXT_SHORTENED="true">
+<node TEXT="フィルタの用例" ID="ID_662270274" CREATED="1455910949070" MODIFIED="1455910949070" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
@@ -11238,7 +11445,11 @@
<attribute NAME="Chapter" VALUE="2"/>
</node>
</node>
-<node TEXT="フィルタ中のノードに適用(絞り込み)" ID="ID_459453471" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_928408068" CREATED="1455910949177" MODIFIED="1455910949177">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="フィルタ中のノードに適用(絞り込み)" ID="ID_459453471" CREATED="1455910949070" MODIFIED="1455910949070" TEXT_SHORTENED="true">
<icon BUILTIN="../applies_to_filtered_nodes"/>
<richcontent TYPE="DETAILS">
@@ -11253,13 +11464,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="上位ノードも表示" ID="ID_107605808" TEXT_SHORTENED="true">
+<node TEXT="上位ノードも表示" ID="ID_107605808" CREATED="1455910949071" MODIFIED="1455910949071" TEXT_SHORTENED="true">
<icon BUILTIN="../show_ancestors"/>
<richcontent TYPE="DETAILS">
@@ -11290,7 +11500,7 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="下位ノードも表示" ID="ID_675488656" TEXT_SHORTENED="true">
+<node TEXT="下位ノードも表示" ID="ID_675488656" CREATED="1455910949072" MODIFIED="1455910949072" TEXT_SHORTENED="true">
<icon BUILTIN="../show_descendants"/>
<richcontent TYPE="DETAILS">
@@ -11321,13 +11531,14 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="フィルタの条件/状態" FOLDED="true" ID="ID_583186956" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_114988197" CREATED="1455910949177" MODIFIED="1455910949177">
<hook NAME="SummaryNode"/>
+<node TEXT="フィルタの条件/状態" FOLDED="true" ID="ID_583186956" CREATED="1455910949073" MODIFIED="1455910949073" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
-<node TEXT="非表示のノードを展開" ID="ID_415158618" TEXT_SHORTENED="true">
+<node TEXT="非表示のノードを展開" ID="ID_415158618" CREATED="1455910949074" MODIFIED="1455910949074" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_filtered_ancestors"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -11365,7 +11576,11 @@
<attribute NAME="Chapter" VALUE="9"/>
</node>
</node>
-<node TEXT="前方検索" ID="ID_973810586" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1164342115" CREATED="1455910949177" MODIFIED="1455910949177">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="前方検索" ID="ID_973810586" CREATED="1455910949075" MODIFIED="1455910949075" TEXT_SHORTENED="true">
<icon BUILTIN="../find_previous"/>
<richcontent TYPE="DETAILS">
@@ -11397,13 +11612,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="後方検索" ID="ID_424433506" TEXT_SHORTENED="true">
+<node TEXT="後方検索" ID="ID_424433506" CREATED="1455910949076" MODIFIED="1455910949076" TEXT_SHORTENED="true">
<icon BUILTIN="../find_next"/>
<richcontent TYPE="DETAILS">
@@ -11440,16 +11654,18 @@
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
-<node TEXT="探査/検索" ID="ID_1132074571" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_632356618" CREATED="1455910949177" MODIFIED="1455910949177">
<hook NAME="SummaryNode"/>
+<node TEXT="探査/検索" ID="ID_1132074571" CREATED="1455910949076" MODIFIED="1455910949076" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="9"/>
</node>
</node>
-<node TEXT="ツ ー ル" STYLE_REF="MainMenu" FOLDED="true" ID="ID_210475551" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="37" VALUE_WIDTH="77"/>
+</node>
+<node TEXT="ツ ー ル" STYLE_REF="MainMenu" FOLDED="true" ID="ID_210475551" CREATED="1455910949077" MODIFIED="1455910949077" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="27.75 pt" VALUE_WIDTH="57.75 pt"/>
<attribute NAME="Chapter" VALUE="3,6,7,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
@@ -11468,7 +11684,7 @@
</html>
</richcontent>
<edge STYLE="horizontal"/>
-<node TEXT="時間管理" FOLDED="true" ID="ID_1350875145" TEXT_SHORTENED="true">
+<node TEXT="時間管理" FOLDED="true" ID="ID_1350875145" CREATED="1455910949077" MODIFIED="1455910949077" TEXT_SHORTENED="true">
<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
<richcontent TYPE="DETAILS">
@@ -11501,7 +11717,10 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
-<node TEXT="時間を管理" FOLDED="true" ID="ID_782427686" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1450355633" CREATED="1455910949177" MODIFIED="1455910949177">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="時間を管理" FOLDED="true" ID="ID_782427686" CREATED="1455910949077" MODIFIED="1455910949077" TEXT_SHORTENED="true">
<icon BUILTIN="../TimeManagementAction"/>
<richcontent TYPE="DETAILS">
@@ -11527,39 +11746,39 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
-<node TEXT="年月日をセット" STYLE_REF="Method" ID="ID_1648159997">
+<node TEXT="年月日をセット" STYLE_REF="Method" ID="ID_1648159997" CREATED="1455910949077" MODIFIED="1455910949077">
<attribute NAME="Chapter" VALUE="5"/>
</node>
-<node TEXT="選択中の日付を挿入" STYLE_REF="Method" ID="ID_406208065">
+<node TEXT="選択中の日付を挿入" STYLE_REF="Method" ID="ID_406208065" CREATED="1455910949077" MODIFIED="1455910949077">
<attribute NAME="Chapter" VALUE="5"/>
</node>
-<node TEXT="カレンダで選択した日にリマインダを設定" STYLE_REF="Method" ID="ID_1873112522">
+<node TEXT="カレンダで選択した日にリマインダを設定" STYLE_REF="Method" ID="ID_1873112522" CREATED="1455910949077" MODIFIED="1455910949077">
<attribute NAME="Chapter" VALUE="5"/>
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="1958574720000" PERIOD="10" UNIT="YEAR"/>
</hook>
</node>
-<node TEXT="指定日数経過後にリマインド" STYLE_REF="Method" FOLDED="true" ID="ID_482088279">
+<node TEXT="指定日数経過後にリマインド" STYLE_REF="Method" FOLDED="true" ID="ID_482088279" CREATED="1455910949078" MODIFIED="1455910949078">
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="1643041920000" PERIOD="10" UNIT="YEAR"/>
</hook>
-<node TEXT="分" ID="ID_488965894"/>
-<node TEXT="時間" ID="ID_12255581"/>
-<node TEXT="日" ID="ID_1083871034"/>
-<node TEXT="週" ID="ID_1691377285"/>
-<node TEXT="年" ID="ID_1891442163"/>
+<node TEXT="分" ID="ID_488965894" CREATED="1455910949078" MODIFIED="1455910949078"/>
+<node TEXT="時間" ID="ID_12255581" CREATED="1455910949078" MODIFIED="1455910949078"/>
+<node TEXT="日" ID="ID_1083871034" CREATED="1455910949078" MODIFIED="1455910949078"/>
+<node TEXT="週" ID="ID_1691377285" CREATED="1455910949078" MODIFIED="1455910949078"/>
+<node TEXT="年" ID="ID_1891442163" CREATED="1455910949078" MODIFIED="1455910949078"/>
</node>
-<node TEXT="リマインダ(時刻)を削除" STYLE_REF="Method" ID="ID_225994845">
+<node TEXT="リマインダ(時刻)を削除" STYLE_REF="Method" ID="ID_225994845" CREATED="1455910949078" MODIFIED="1455910949078">
<attribute NAME="Chapter" VALUE="5"/>
</node>
</node>
-<node TEXT="タスクを管理" ID="ID_745272228" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
+<node TEXT="タスクを管理" ID="ID_745272228" CREATED="1455910949078" MODIFIED="1455910949078" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true">
<icon BUILTIN="../TimeListAction"/>
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_745272228" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<richcontent TYPE="DETAILS">
<html>
@@ -11603,9 +11822,8 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="5"/>
-<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="80" FONT_SIZE="12" FONT_FAMILY="SansSerif" DESTINATION="ID_745272228" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="リマインダを削除" ID="ID_295122624" TEXT_SHORTENED="true">
+<node TEXT="リマインダを削除" ID="ID_295122624" CREATED="1455910949081" MODIFIED="1455910949081" TEXT_SHORTENED="true">
<icon BUILTIN="../ReminderHookAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -11639,19 +11857,21 @@
</html>
</richcontent>
</node>
-<node TEXT="" ID="ID_790614129" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1108450049" CREATED="1455910949178" MODIFIED="1455910949178">
+<hook NAME="SummaryNode"/>
+<node TEXT="" ID="ID_790614129" CREATED="1455910949082" MODIFIED="1455910949082" TEXT_SHORTENED="true">
<hook NAME="plugins/TimeManagementReminder.xml">
<Parameters REMINDUSERAT="2077460580480" PERIOD="1" UNIT="DAY"/>
</hook>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="5"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="パスワードで保護" FOLDED="true" ID="ID_592262504" TEXT_SHORTENED="true" HGAP="16" VSHIFT="12">
+</node>
+<node TEXT="パスワードで保護" FOLDED="true" ID="ID_592262504" CREATED="1455910949082" MODIFIED="1455910949082" TEXT_SHORTENED="true" HGAP_QUANTITY="16.0 px" VSHIFT_QUANTITY="12.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
@@ -11699,7 +11919,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="8"/>
<edge STYLE="horizontal" COLOR="#00ffcc"/>
-<node TEXT="パスワードで保護" FOLDED="true" ID="ID_1516836083">
+<node TEXT="パスワードで保護" FOLDED="true" ID="ID_1516836083" CREATED="1455910949082" MODIFIED="1455910949082">
<icon BUILTIN="../lock"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -11746,9 +11966,9 @@
</html>
</richcontent>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="" FOLDED="true" ID="ID_12483937">
+<node TEXT="" FOLDED="true" ID="ID_12483937" CREATED="1455910949083" MODIFIED="1455910949083">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="" ENCRYPTED_CONTENT="/xrv1GAm4ws= SDHE3qFf6C4Vl0egFXFLKlm4c4bM8BiLqYrq662A73HSKPgXuTcuIcpo8zL4HQbjyRUQ59DROyTXLG9/wVqsTLCCA2+sYKCQ7rGDZ1rcB2Mu42TNmau53L0uELTKzBZI" ID="ID_1295571293" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ENCRYPTED_CONTENT="/xrv1GAm4ws= SDHE3qFf6C4Vl0egFXFLKlm4c4bM8BiLqYrq662A73HSKPgXuTcuIcpo8zL4HQbjyRUQ59DROyTXLG9/wVqsTLCCA2+sYKCQ7rGDZ1rcB2Mu42TNmau53L0uELTKzBZI" ID="ID_1295571293" CREATED="1455910949083" MODIFIED="1455910949083" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -11785,7 +12005,7 @@
</node>
</node>
</node>
-<node TEXT="パスワードを廃止" ID="ID_1501945017">
+<node TEXT="パスワードを廃止" ID="ID_1501945017" CREATED="1455910949084" MODIFIED="1455910949084">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -11805,7 +12025,7 @@
<attribute NAME="Chapter" VALUE="8"/>
</node>
</node>
-<node TEXT="アドオン" STYLE_REF="Method" ID="ID_100406395" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="アドオン" STYLE_REF="Method" ID="ID_100406395" CREATED="1455910949084" MODIFIED="1455910949084" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -11819,7 +12039,10 @@
</html>
</richcontent>
</node>
-<node TEXT="ショートカットキーを割り当て" ID="ID_855338219" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_286514340" CREATED="1455910949178" MODIFIED="1455910949178">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ショートカットキーを割り当て" ID="ID_855338219" CREATED="1455910949084" MODIFIED="1455910949084" TEXT_SHORTENED="true">
<icon BUILTIN="../SetAcceleratorOnNextClickAction"/>
<richcontent TYPE="DETAILS">
@@ -11871,15 +12094,14 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="ホットキーのプリセット" FOLDED="true" ID="ID_1119294587">
+<node TEXT="ホットキーのプリセット" FOLDED="true" ID="ID_1119294587" CREATED="1455910949086" MODIFIED="1455910949086">
<icon BUILTIN="../acceleratorPresets"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="ホットキーセットを選択" ID="ID_1525716871" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ホットキーセットを選択" ID="ID_1525716871" CREATED="1455910949088" MODIFIED="1455910949088" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -11910,7 +12132,7 @@
<attribute NAME="Chapter" VALUE="8" OBJECT="org.freeplane.features.format.FormattedNumber|8"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
-<node TEXT="ホットキーセットを保存" ID="ID_267090925" COLOR="#000000" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ホットキーセットを保存" ID="ID_267090925" CREATED="1455910949088" MODIFIED="1455910949088" COLOR="#000000" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -11947,7 +12169,7 @@
</hook>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="ホットキーセットを削除" STYLE_REF="Functiegroep" ID="ID_349086275" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ホットキーセットを削除" STYLE_REF="Functiegroep" ID="ID_349086275" CREATED="1455910949088" MODIFIED="1455910949088" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -11968,15 +12190,16 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="ショートカット" FOLDED="true" ID="ID_1521559282">
+<node TEXT="" ID="ID_1224456356" CREATED="1455910949178" MODIFIED="1455910949178">
<hook NAME="SummaryNode"/>
+<node TEXT="ショートカット" FOLDED="true" ID="ID_1521559282" CREATED="1455910949089" MODIFIED="1455910949089">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="" FOLDED="true" ID="ID_1764704026" TEXT_SHORTENED="true">
+<node TEXT="" FOLDED="true" ID="ID_1764704026" CREATED="1455910949089" MODIFIED="1455910949089" TEXT_SHORTENED="true">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="ショートカット、又はホットキー" ID="ID_927299127">
+<node TEXT="ショートカット、又はホットキー" ID="ID_927299127" CREATED="1455910949089" MODIFIED="1455910949089">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -11995,7 +12218,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Fキー" ID="ID_1454255501"><richcontent TYPE="DETAILS">
+<node TEXT="Fキー" ID="ID_1454255501" CREATED="1455910949089" MODIFIED="1455910949089"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12010,7 +12233,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="システム指定特殊キーの参考文書" ID="ID_471805988"><richcontent TYPE="DETAILS">
+<node TEXT="システム指定特殊キーの参考文書" ID="ID_471805988" CREATED="1455910949089" MODIFIED="1455910949089"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12030,7 +12253,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="未定義の F キー" STYLE_REF="ToNote" FOLDED="true" ID="ID_1373554472"><richcontent TYPE="DETAILS">
+<node TEXT="未定義の F キー" STYLE_REF="ToNote" FOLDED="true" ID="ID_1373554472" CREATED="1455910949089" MODIFIED="1455910949089"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12041,7 +12264,7 @@
</body>
</html>
</richcontent>
-<node ID="ID_1243435937" LINK="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4652076"><richcontent TYPE="NODE">
+<node ID="ID_1243435937" CREATED="1455910949089" MODIFIED="1455910949089" LINK="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4652076"><richcontent TYPE="NODE">
<html>
<head>
@@ -12051,12 +12274,17 @@
<pre wrap=""><a href="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4652076" class="moz-txt-link-freetext">https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4652076</a></pre>
</body>
</html>
+
</richcontent>
</node>
</node>
</node>
</node>
-<node TEXT="スクリプトを選んで実行..." ID="ID_1890181858" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+</node>
+<node TEXT="" ID="ID_185829160" CREATED="1455910949178" MODIFIED="1455910949178">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="スクリプトを選んで実行..." ID="ID_1890181858" CREATED="1455910949089" MODIFIED="1455910949089" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12081,7 +12309,7 @@
</hook>
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="選択ノードのスクリプトを実行" ID="ID_963866825" COLOR="#000000" TEXT_SHORTENED="true">
+<node TEXT="選択ノードのスクリプトを実行" ID="ID_963866825" CREATED="1455910949089" MODIFIED="1455910949089" COLOR="#000000" TEXT_SHORTENED="true">
<icon BUILTIN="../ExecuteScriptForSelectionAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12101,7 +12329,7 @@
</hook>
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="すべてのスクリプトを実行" ID="ID_266266767" COLOR="#000000" TEXT_SHORTENED="true">
+<node TEXT="すべてのスクリプトを実行" ID="ID_266266767" CREATED="1455910949090" MODIFIED="1455910949090" COLOR="#000000" TEXT_SHORTENED="true">
<icon BUILTIN="../ExecuteScriptForAllNodes"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12121,7 +12349,7 @@
</hook>
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="スクリプトを編集..." ID="ID_1738795858" TEXT_SHORTENED="true">
+<node TEXT="スクリプトを編集..." ID="ID_1738795858" CREATED="1455910949092" MODIFIED="1455910949092" TEXT_SHORTENED="true">
<icon BUILTIN="../ScriptEditor"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12141,7 +12369,7 @@
</hook>
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="計算式..." STYLE_REF="Functie" FOLDED="true" ID="ID_1216946912" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="計算式..." STYLE_REF="Functie" FOLDED="true" ID="ID_1216946912" CREATED="1455910949093" MODIFIED="1455910949093" BACKGROUND_COLOR="#ffffff" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12177,15 +12405,16 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="7"/>
-<node TEXT="すべての計算式を実行" STYLE_REF="Functie" ID="ID_627469815">
+<node TEXT="すべての計算式を実行" STYLE_REF="Functie" ID="ID_627469815" CREATED="1455910949093" MODIFIED="1455910949093">
<icon BUILTIN="../formula"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="スクリプトと計算式" FOLDED="true" ID="ID_1686912429" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1476719114" CREATED="1455910949178" MODIFIED="1455910949178">
<hook NAME="SummaryNode"/>
+<node TEXT="スクリプトと計算式" FOLDED="true" ID="ID_1686912429" CREATED="1455910949094" MODIFIED="1455910949094" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
@@ -12220,16 +12449,16 @@
</body>
</html>
</richcontent>
-<node TEXT="" FOLDED="true" ID="ID_1643451776">
+<node TEXT="" FOLDED="true" ID="ID_1643451776" CREATED="1455910949094" MODIFIED="1455910949094">
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="計算式の Wiki" ID="ID_1130453106" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formulas">
+<node TEXT="計算式の Wiki" ID="ID_1130453106" CREATED="1455910949094" MODIFIED="1455910949094" LINK="http://freeplane.sourceforge.net/wiki/index.php/Formulas">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="Groovy スクリプトの Wiki" ID="ID_1846416316" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting">
+<node TEXT="Groovy スクリプトの Wiki" ID="ID_1846416316" CREATED="1455910949094" MODIFIED="1455910949094" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="模範スクリプトの Wiki" ID="ID_1734570187" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts"/>
-<node TEXT="詳細部分にイメージを取り込む模範スクリプト" ID="ID_840644558" LINK="menuitem:_$ExecuteScriptForSelectionAction$0" TEXT_SHORTENED="true">
+<node TEXT="模範スクリプトの Wiki" ID="ID_1734570187" CREATED="1455910949094" MODIFIED="1455910949094" LINK="http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts"/>
+<node TEXT="詳細部分にイメージを取り込む模範スクリプト" ID="ID_840644558" CREATED="1455910949094" MODIFIED="1455910949094" LINK="menuitem:_$ExecuteScriptForSelectionAction$0" TEXT_SHORTENED="true">
<icon BUILTIN="../ExecuteScriptForSelectionAction"/>
<attribute NAME="script1" VALUE="// @ExecutionModes({ON_SINGLE_NODE})
import groovy.swing.SwingBuilder
import java.awt.FlowLayout as FL
import javax.swing.BoxLayout as BXL
import javax.swing.ImageIcon
import javax.swing.JFileChooser
import javax.swing.JTextField
import org.freeplane.core.resources.ResourceController

def ImageIcon getIcon(String path) {
 new ImageIcon(ResourceController.getResour [...]
<hook NAME="NodeConditionalStyles">
@@ -12299,7 +12528,7 @@
</html>
</richcontent>
</node>
-<node TEXT="同一スクリプトを汎用的に使用" ID="ID_776458088" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="同一スクリプトを汎用的に使用" ID="ID_776458088" CREATED="1455910949095" MODIFIED="1455910949095" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12384,7 +12613,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
</node>
-<node TEXT="外部コマンドを実行" ID="ID_606027222" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="外部コマンドを実行" ID="ID_606027222" CREATED="1455910949095" MODIFIED="1455910949095" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12420,18 +12649,19 @@
</node>
</node>
</node>
-<node TEXT="ユーザディレクトリを開く" FOLDED="true" ID="ID_1899966210" TEXT_SHORTENED="true">
+</node>
+<node TEXT="ユーザディレクトリを開く" FOLDED="true" ID="ID_1899966210" CREATED="1455910949095" MODIFIED="1455910949095" TEXT_SHORTENED="true">
<icon BUILTIN="../OpenUserDirAction"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6,8"/>
-<node TEXT="log ファイル" ID="ID_1385146967" TEXT_SHORTENED="true">
+<node TEXT="log ファイル" ID="ID_1385146967" CREATED="1455910949096" MODIFIED="1455910949096" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT=".backup ディレクトリ" FOLDED="true" ID="ID_1731937735" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT=".backup ディレクトリ" FOLDED="true" ID="ID_1731937735" CREATED="1455910949096" MODIFIED="1455910949096" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12447,7 +12677,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
-<node TEXT="" ID="ID_1056610579" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1056610579" CREATED="1455910949096" MODIFIED="1455910949096" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -12467,7 +12697,10 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="templates ディレクトリ" ID="ID_1073364264" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="" ID="ID_991055177" CREATED="1455910949179" MODIFIED="1455910949179">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="templates ディレクトリ" ID="ID_1073364264" CREATED="1455910949096" MODIFIED="1455910949096" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12494,13 +12727,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="scripts ディレクトリ" ID="ID_291190955" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="scripts ディレクトリ" ID="ID_291190955" CREATED="1455910949097" MODIFIED="1455910949097" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12517,7 +12749,7 @@
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="icons ディレクトリ" ID="ID_140542266" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="icons ディレクトリ" ID="ID_140542266" CREATED="1455910949097" MODIFIED="1455910949097" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12546,7 +12778,7 @@
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="xml ディレクトリ" ID="ID_471706192" TEXT_SHORTENED="true">
+<node TEXT="xml ディレクトリ" ID="ID_471706192" CREATED="1455910949097" MODIFIED="1455910949097" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
@@ -12567,7 +12799,7 @@
</html>
</richcontent>
</node>
-<node TEXT="accelerators ディレクトリ" ID="ID_482120942" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="accelerators ディレクトリ" ID="ID_482120942" CREATED="1455910949097" MODIFIED="1455910949097" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -12588,8 +12820,9 @@
</hook>
<attribute NAME="Chapter" VALUE="6,8"/>
</node>
-<node TEXT="インポート/エクスポート" ID="ID_1576399110" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1996168537" CREATED="1455910949179" MODIFIED="1455910949179">
<hook NAME="SummaryNode"/>
+<node TEXT="インポート/エクスポート" ID="ID_1576399110" CREATED="1455910949097" MODIFIED="1455910949097" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
@@ -12610,7 +12843,8 @@
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="環境設定..." FOLDED="true" ID="ID_45903753">
+</node>
+<node TEXT="環境設定..." FOLDED="true" ID="ID_45903753" CREATED="1455910949097" MODIFIED="1455910949097">
<icon BUILTIN="../PropertyAction"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -12629,24 +12863,29 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1,3,4,6,7,8"/>
-<node TEXT="環  境" FOLDED="true" ID="ID_147091522" TEXT_SHORTENED="true">
+<node TEXT="環  境" FOLDED="true" ID="ID_147091522" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="ファイルオープンは実行中のインスタンスで" ID="ID_1093729907" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1023425380" CREATED="1455910949179" MODIFIED="1455910949179">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ファイルオープンは実行中のインスタンスで" ID="ID_1093729907" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="第2インスタンスの作成を禁止" ID="ID_1271112540" TEXT_SHORTENED="true">
+<node TEXT="第2インスタンスの作成を禁止" ID="ID_1271112540" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node ID="ID_1081383384" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_1040200012" CREATED="1455910949179" MODIFIED="1455910949179">
+<hook NAME="SummaryNode"/>
+<node ID="ID_1081383384" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -12658,604 +12897,689 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="言語" FOLDED="true" ID="ID_49330590" TEXT_SHORTENED="true">
-<node TEXT="自動選択" ID="ID_1080394898" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1263415821" CREATED="1455910949179" MODIFIED="1455910949179">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="言語" FOLDED="true" ID="ID_49330590" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
+<node TEXT="自動選択" ID="ID_1080394898" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="最近使ったファイルの表示数" FOLDED="true" ID="ID_1236062092" TEXT_SHORTENED="true">
-<node TEXT="25" ID="ID_300736701" TEXT_SHORTENED="true">
+<node TEXT="最近使ったファイルの表示数" FOLDED="true" ID="ID_1236062092" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
+<node TEXT="25" ID="ID_300736701" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="前回終了時のマップを自動的に開く" ID="ID_208333831" TEXT_SHORTENED="true">
+<node TEXT="前回終了時のマップを自動的に開く" ID="ID_208333831" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="前回終了時のマップをすべて開く" ID="ID_1565754245" TEXT_SHORTENED="true">
+<node TEXT="前回終了時のマップをすべて開く" ID="ID_1565754245" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="起動時に、常に上記オプションを尊重" ID="ID_1540208655" TEXT_SHORTENED="true">
+<node TEXT="起動時に、常に上記オプションを尊重" ID="ID_1540208655" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="他者と同時編集時はファイルを読み込み専用に" ID="ID_420035021" TEXT_SHORTENED="true">
+<node TEXT="他者と同時編集時はファイルを読み込み専用に" ID="ID_420035021" CREATED="1455910949098" MODIFIED="1455910949098" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="標準テンプレートファイル" FOLDED="true" ID="ID_1199778737" TEXT_SHORTENED="true">
-<node TEXT="standard.mm" ID="ID_95697114" TEXT_SHORTENED="true">
+<node TEXT="標準テンプレートファイル" FOLDED="true" ID="ID_1199778737" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
+<node TEXT="standard.mm" ID="ID_95697114" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ファイル" ID="ID_13501482" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1541650954" CREATED="1455910949179" MODIFIED="1455910949179">
+<hook NAME="SummaryNode"/>
+<node TEXT="ファイル" ID="ID_13501482" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="自動保存間隔" FOLDED="true" ID="ID_1577267706" TEXT_SHORTENED="true">
-<node TEXT="60,000" ID="ID_1742895687" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_319312718" CREATED="1455910949179" MODIFIED="1455910949179">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="自動保存間隔" FOLDED="true" ID="ID_1577267706" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
+<node TEXT="60,000" ID="ID_1742895687" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="バックアップファイル格納ディレクトリを一つに" ID="ID_479909948" TEXT_SHORTENED="true">
+<node TEXT="バックアップファイル格納ディレクトリを一つに" ID="ID_479909948" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="上記オプション有効時に用いるバックアップディレクトリ" ID="ID_1337942001" COLOR="#000000" TEXT_SHORTENED="true"/>
-<node TEXT="終了時に自動保存ファイルを削除" ID="ID_312558399" TEXT_SHORTENED="true">
+<node TEXT="上記オプション有効時に用いるバックアップディレクトリ" ID="ID_1337942001" CREATED="1455910949099" MODIFIED="1455910949099" COLOR="#000000" TEXT_SHORTENED="true"/>
+<node TEXT="終了時に自動保存ファイルを削除" ID="ID_312558399" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="ファイルごとの自動保存件数" FOLDED="true" ID="ID_1775911976" COLOR="#000000" TEXT_SHORTENED="true">
-<node TEXT="10" ID="ID_165779299" TEXT_SHORTENED="true">
+<node TEXT="ファイルごとの自動保存件数" FOLDED="true" ID="ID_1775911976" CREATED="1455910949099" MODIFIED="1455910949099" COLOR="#000000" TEXT_SHORTENED="true">
+<node TEXT="10" ID="ID_165779299" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="バックアップファイルの保持数" FOLDED="true" ID="ID_1508973383" TEXT_SHORTENED="true">
-<node TEXT="2" ID="ID_69165536" TEXT_SHORTENED="true">
+<node TEXT="バックアップファイルの保持数" FOLDED="true" ID="ID_1508973383" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
+<node TEXT="2" ID="ID_69165536" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="自動保存" ID="ID_1726602559" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1729729936" CREATED="1455910949179" MODIFIED="1455910949179">
+<hook NAME="SummaryNode"/>
+<node TEXT="自動保存" ID="ID_1726602559" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="[自動保存時の]折り畳みの扱い" FOLDED="true" ID="ID_458719759" TEXT_SHORTENED="true">
-<node TEXT="保存しない" ID="ID_1459995870" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_379409138" CREATED="1455910949180" MODIFIED="1455910949180">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="[自動保存時の]折り畳みの扱い" FOLDED="true" ID="ID_458719759" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
+<node TEXT="保存しない" ID="ID_1459995870" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="常に保存する" ID="ID_505402157" TEXT_SHORTENED="true">
+<node TEXT="常に保存する" ID="ID_505402157" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="マップが更新された場合は保存する" ID="ID_789975502" TEXT_SHORTENED="true">
+<node TEXT="マップが更新された場合は保存する" ID="ID_789975502" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="更新時刻を保存" ID="ID_1045346329" TEXT_SHORTENED="true"/>
-<node TEXT="保存" ID="ID_39365632" TEXT_SHORTENED="true">
+<node TEXT="更新時刻を保存" ID="ID_1045346329" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true"/>
+<node TEXT="" ID="ID_1605801377" CREATED="1455910949180" MODIFIED="1455910949180">
<hook NAME="SummaryNode"/>
+<node TEXT="保存" ID="ID_39365632" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
</node>
-<node TEXT="読み込み時の折り畳みの扱い" FOLDED="true" ID="ID_1416445789" TEXT_SHORTENED="true">
-<node TEXT="すべてのノードが展開状態なら、折り畳む" ID="ID_472258935" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_131250646" CREATED="1455910949180" MODIFIED="1455910949180">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="読み込み時の折り畳みの扱い" FOLDED="true" ID="ID_1416445789" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
+<node TEXT="すべてのノードが展開状態なら、折り畳む" ID="ID_472258935" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="保存時の状態で読み込む" ID="ID_579954633" TEXT_SHORTENED="true">
+<node TEXT="保存時の状態で読み込む" ID="ID_579954633" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="すべて展開する" ID="ID_463678201" TEXT_SHORTENED="true">
+<node TEXT="すべて展開する" ID="ID_463678201" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ノードの最大表示数" FOLDED="true" ID="ID_913844487" TEXT_SHORTENED="true">
-<node TEXT="20" ID="ID_156091170" TEXT_SHORTENED="true">
+<node TEXT="ノードの最大表示数" FOLDED="true" ID="ID_913844487" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
+<node TEXT="20" ID="ID_156091170" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="文字コード" FOLDED="true" ID="ID_199151762" TEXT_SHORTENED="true">
-<node TEXT="標準" ID="ID_1662978651" TEXT_SHORTENED="true">
+<node TEXT="文字コード" FOLDED="true" ID="ID_199151762" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
+<node TEXT="標準" ID="ID_1662978651" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="..." ID="ID_1762776087" TEXT_SHORTENED="true">
+<node TEXT="..." ID="ID_1762776087" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="読み込み" ID="ID_375961220" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1296506607" CREATED="1455910949180" MODIFIED="1455910949180">
+<hook NAME="SummaryNode"/>
+<node TEXT="読み込み" ID="ID_375961220" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="リンク" FOLDED="true" ID="ID_1248775133" TEXT_SHORTENED="true">
-<node TEXT="相対的" ID="ID_1373752843" TEXT_SHORTENED="true">
+</node>
+<node TEXT="リンク" FOLDED="true" ID="ID_1248775133" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1161708694" CREATED="1455910949180" MODIFIED="1455910949180">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="相対的" ID="ID_1373752843" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="絶対的" ID="ID_1428308602" TEXT_SHORTENED="true">
+<node TEXT="絶対的" ID="ID_1428308602" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="ハイパーリンクの種類" ID="ID_710508360" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_673542443" CREATED="1455910949180" MODIFIED="1455910949180">
+<hook NAME="SummaryNode"/>
+<node TEXT="ハイパーリンクの種類" ID="ID_710508360" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
</node>
-<node TEXT="起動時にアップデートをチェック" ID="ID_1697629304" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_339376133" CREATED="1455910949180" MODIFIED="1455910949180">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="起動時にアップデートをチェック" ID="ID_1697629304" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="プログラムの更新" ID="ID_1194660545" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_781707621" CREATED="1455910949180" MODIFIED="1455910949180">
+<hook NAME="SummaryNode"/>
+<node TEXT="プログラムの更新" ID="ID_1194660545" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="基本的な対応方針" FOLDED="true" ID="ID_1453228405" TEXT_SHORTENED="true">
-<node TEXT="レポートダイアログを表示" ID="ID_1035538786" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1903994240" CREATED="1455910949180" MODIFIED="1455910949180">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="基本的な対応方針" FOLDED="true" ID="ID_1453228405" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
+<node TEXT="レポートダイアログを表示" ID="ID_1035538786" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="常に送信" ID="ID_1366268809" TEXT_SHORTENED="true">
+<node TEXT="常に送信" ID="ID_1366268809" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="常に送信しない" ID="ID_1026614626" TEXT_SHORTENED="true">
+<node TEXT="常に送信しない" ID="ID_1026614626" CREATED="1455910949099" MODIFIED="1455910949099" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="自動バグレポート" ID="ID_534959328" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1132599005" CREATED="1455910949181" MODIFIED="1455910949181">
+<hook NAME="SummaryNode"/>
+<node TEXT="自動バグレポート" ID="ID_534959328" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
</node>
-<node TEXT="画面表示" FOLDED="true" ID="ID_1745002806" COLOR="#000000" TEXT_SHORTENED="true">
+</node>
+<node TEXT="画面表示" FOLDED="true" ID="ID_1745002806" CREATED="1455910949100" MODIFIED="1455910949100" COLOR="#000000" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="ルック&フィール" FOLDED="true" ID="ID_1845428876" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_415444624" CREATED="1455910949181" MODIFIED="1455910949181">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ルック&フィール" FOLDED="true" ID="ID_1845428876" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="標準" ID="ID_810126819" TEXT_SHORTENED="true">
+<node TEXT="標準" ID="ID_810126819" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Nimbus" ID="ID_1612676571" TEXT_SHORTENED="true">
+<node TEXT="Nimbus" ID="ID_1612676571" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Metal" ID="ID_1586991642" TEXT_SHORTENED="true">
+<node TEXT="Metal" ID="ID_1586991642" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="CDE/Motiv" ID="ID_313711466" TEXT_SHORTENED="true">
+<node TEXT="CDE/Motiv" ID="ID_313711466" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Windows" ID="ID_1602607369" TEXT_SHORTENED="true">
+<node TEXT="Windows" ID="ID_1602607369" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="Windows classic" ID="ID_1991458582" TEXT_SHORTENED="true">
+<node TEXT="Windows classic" ID="ID_1991458582" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="システムの画像解像度をデフォルトとして使用" STYLE_REF="IsChecked" ID="ID_719531600">
+<node TEXT="システムの画像解像度をデフォルトとして使用" STYLE_REF="IsChecked" ID="ID_719531600" CREATED="1455910949100" MODIFIED="1455910949100">
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ユーザ定義画面解像度(dpi)" STYLE_REF="Method" FOLDED="true" ID="ID_1436875119">
+<node TEXT="ユーザ定義画面解像度(dpi)" STYLE_REF="Method" FOLDED="true" ID="ID_1436875119" CREATED="1455910949100" MODIFIED="1455910949100">
<edge COLOR="#00ffcc"/>
-<node TEXT="96" STYLE_REF="OptionalValue" ID="ID_1116758038"/>
+<node TEXT="96" STYLE_REF="OptionalValue" ID="ID_1116758038" CREATED="1455910949100" MODIFIED="1455910949100"/>
</node>
-<node TEXT="タブ表示機能を使用" ID="ID_1089748589" TEXT_SHORTENED="true">
+<node TEXT="タブ表示機能を使用" ID="ID_1089748589" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノートにも標準フォントを使用" ID="ID_1406962127" TEXT_SHORTENED="true">
+<node TEXT="ノートにも標準フォントを使用" ID="ID_1406962127" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノートの上部余白を削除" ID="ID_297697765" TEXT_SHORTENED="true">
+<node TEXT="ノートの上部余白を削除" ID="ID_297697765" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="全体イメージ" ID="ID_1413754050">
+<node TEXT="" ID="ID_1246863693" CREATED="1455910949181" MODIFIED="1455910949181">
+<hook NAME="SummaryNode"/>
+<node TEXT="全体イメージ" ID="ID_1413754050" CREATED="1455910949100" MODIFIED="1455910949100">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノード ID を表示" ID="ID_1626584260">
+</node>
+<node TEXT="" ID="ID_118062329" CREATED="1455910949181" MODIFIED="1455910949181">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノード ID を表示" ID="ID_1626584260" CREATED="1455910949100" MODIFIED="1455910949100">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ステータスバー" ID="ID_781487286">
+<node TEXT="" ID="ID_1921377025" CREATED="1455910949181" MODIFIED="1455910949181">
+<hook NAME="SummaryNode"/>
+<node TEXT="ステータスバー" ID="ID_781487286" CREATED="1455910949100" MODIFIED="1455910949100">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="更新ノードの背景" FOLDED="true" ID="ID_316779279" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_596604613" CREATED="1455910949181" MODIFIED="1455910949181">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="更新ノードの背景" FOLDED="true" ID="ID_316779279" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="黄色" ID="ID_1123750493" TEXT_SHORTENED="true">
+<node TEXT="黄色" ID="ID_1123750493" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="背景を白地で印刷" ID="ID_48671069" TEXT_SHORTENED="true">
+<node TEXT="背景を白地で印刷" ID="ID_48671069" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="雲" FOLDED="true" ID="ID_1373142919" TEXT_SHORTENED="true">
+<node TEXT="雲" FOLDED="true" ID="ID_1373142919" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="#f0f0f0" ID="ID_1285798737" TEXT_SHORTENED="true">
+<node TEXT="#f0f0f0" ID="ID_1285798737" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="標準色" ID="ID_423342378" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_383828437" CREATED="1455910949181" MODIFIED="1455910949181">
+<hook NAME="SummaryNode"/>
+<node TEXT="標準色" ID="ID_423342378" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="選択ノードを枠囲い表示" ID="ID_779194753" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1726376804" CREATED="1455910949181" MODIFIED="1455910949181">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="選択ノードを枠囲い表示" ID="ID_779194753" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="枠囲いの色" FOLDED="true" ID="ID_1942826102" TEXT_SHORTENED="true">
+<node TEXT="枠囲いの色" FOLDED="true" ID="ID_1942826102" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="#002080" ID="ID_1261428639" TEXT_SHORTENED="true">
+<node TEXT="#002080" ID="ID_1261428639" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="背景色" FOLDED="true" ID="ID_308905221" TEXT_SHORTENED="true">
+<node TEXT="背景色" FOLDED="true" ID="ID_308905221" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="#d2d2d2" ID="ID_1209757699" TEXT_SHORTENED="true">
+<node TEXT="#d2d2d2" ID="ID_1209757699" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="選択ノードの色等" ID="ID_1654542839" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1328015242" CREATED="1455910949182" MODIFIED="1455910949182">
+<hook NAME="SummaryNode"/>
+<node TEXT="選択ノードの色等" ID="ID_1654542839" CREATED="1455910949100" MODIFIED="1455910949100" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="線の始点を一点に集約" ID="ID_861619192" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1961342386" CREATED="1455910949182" MODIFIED="1455910949182">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="線の始点を一点に集約" ID="ID_861619192" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ルートノードの体裁" ID="ID_801804133" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_403039178" CREATED="1455910949182" MODIFIED="1455910949182">
+<hook NAME="SummaryNode"/>
+<node TEXT="ルートノードの体裁" ID="ID_801804133" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="アンチエイリアス" STYLE_REF="Method" FOLDED="true" ID="ID_1632529978" TEXT_SHORTENED="true">
+</node>
+<node TEXT="アンチエイリアス" STYLE_REF="Method" FOLDED="true" ID="ID_1632529978" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="線だけアンチエイリアス" ID="ID_1613465166" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1057439287" CREATED="1455910949182" MODIFIED="1455910949182">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="線だけアンチエイリアス" ID="ID_1613465166" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="すべてアンチエイリアス" ID="ID_1455704888" TEXT_SHORTENED="true">
+<node TEXT="すべてアンチエイリアス" ID="ID_1455704888" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="アンチエイリアスなし" ID="ID_316108629" TEXT_SHORTENED="true">
+<node TEXT="アンチエイリアスなし" ID="ID_316108629" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="アンチエイリアス" ID="ID_1038706856" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_101159348" CREATED="1455910949182" MODIFIED="1455910949182">
<hook NAME="SummaryNode"/>
+<node TEXT="アンチエイリアス" ID="ID_1038706856" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
</node>
</node>
-<node TEXT="短縮表示時の表示" FOLDED="true" ID="ID_1728918725" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1663223128" CREATED="1455910949182" MODIFIED="1455910949182">
<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="短縮表示時の表示" FOLDED="true" ID="ID_1728918725" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="100" ID="ID_217904325" TEXT_SHORTENED="true">
+<node TEXT="100" ID="ID_217904325" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ノード[の最大表示幅]" FOLDED="true" ID="ID_1991300607" TEXT_SHORTENED="true">
+<node TEXT="ノード[の最大表示幅]" FOLDED="true" ID="ID_1991300607" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="600" ID="ID_1244152079" TEXT_SHORTENED="true">
+<node TEXT="600" ID="ID_1244152079" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ツールチップ[の最大表示幅]" FOLDED="true" ID="ID_1815852224" TEXT_SHORTENED="true">
+<node TEXT="ツールチップ[の最大表示幅]" FOLDED="true" ID="ID_1815852224" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1"/>
<edge COLOR="#00ffcc"/>
-<node TEXT="600" ID="ID_962962965" TEXT_SHORTENED="true">
+<node TEXT="600" ID="ID_962962965" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="最大表示幅" ID="ID_596417517" COLOR="#000000" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1995344278" CREATED="1455910949182" MODIFIED="1455910949182">
+<hook NAME="SummaryNode"/>
+<node TEXT="最大表示幅" ID="ID_596417517" CREATED="1455910949101" MODIFIED="1455910949101" COLOR="#000000" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="1,8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="[コネクタの]標準色" FOLDED="true" ID="ID_243032518" COLOR="#000000" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1141785522" CREATED="1455910949182" MODIFIED="1455910949182">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="[コネクタの]標準色" FOLDED="true" ID="ID_243032518" CREATED="1455910949101" MODIFIED="1455910949101" COLOR="#000000" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="#000000" ID="ID_1227669539" TEXT_SHORTENED="true">
+<node TEXT="#000000" ID="ID_1227669539" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="[コネクタの]透過性" FOLDED="true" ID="ID_681997401" TEXT_SHORTENED="true">
+<node TEXT="[コネクタの]透過性" FOLDED="true" ID="ID_681997401" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="80" ID="ID_1920834286" TEXT_SHORTENED="true">
+<node TEXT="80" ID="ID_1920834286" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="[コネクタの]形状" FOLDED="true" ID="ID_129395940" TEXT_SHORTENED="true">
+<node TEXT="[コネクタの]形状" FOLDED="true" ID="ID_129395940" CREATED="1455910949101" MODIFIED="1455910949101" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="曲線" ID="ID_1329911663" TEXT_SHORTENED="true">
+<node TEXT="曲線" ID="ID_1329911663" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="直線(直結)" ID="ID_376010423" TEXT_SHORTENED="true">
+<node TEXT="直線(直結)" ID="ID_376010423" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="直線(角付き)" ID="ID_571973506" TEXT_SHORTENED="true">
+<node TEXT="直線(角付き)" ID="ID_571973506" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="エッジの線に擬す" ID="ID_771982554" TEXT_SHORTENED="true">
+<node TEXT="エッジの線に擬す" ID="ID_771982554" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="[コネクタの]太さ" FOLDED="true" ID="ID_1068302193" TEXT_SHORTENED="true">
+<node TEXT="[コネクタの]太さ" FOLDED="true" ID="ID_1068302193" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="2" ID="ID_1211597440" TEXT_SHORTENED="true">
+<node TEXT="2" ID="ID_1211597440" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="[コネクタラベルの]フォント名" FOLDED="true" ID="ID_53529993" TEXT_SHORTENED="true">
+<node TEXT="[コネクタラベルの]フォント名" FOLDED="true" ID="ID_53529993" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="SansSerif" ID="ID_121466153" TEXT_SHORTENED="true">
+<node TEXT="SansSerif" ID="ID_121466153" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="[コネクタラベルの]文字サイズ" STYLE_REF="Method" FOLDED="true" ID="ID_1729013018" TEXT_SHORTENED="true">
+<node TEXT="[コネクタラベルの]文字サイズ" STYLE_REF="Method" FOLDED="true" ID="ID_1729013018" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="12" ID="ID_701404488" TEXT_SHORTENED="true">
+<node TEXT="12" ID="ID_701404488" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="コネクタ" ID="ID_529578864" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_353957533" CREATED="1455910949182" MODIFIED="1455910949182">
+<hook NAME="SummaryNode"/>
+<node TEXT="コネクタ" ID="ID_529578864" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ボタンを上方に表示" ID="ID_82766941" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_26266604" CREATED="1455910949183" MODIFIED="1455910949183">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ボタンを上方に表示" ID="ID_82766941" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ウィンドウをノードの下に表示" ID="ID_527997389" TEXT_SHORTENED="true">
+<node TEXT="ウィンドウをノードの下に表示" ID="ID_527997389" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="標準の最小縦幅(ピクセル)" FOLDED="true" ID="ID_448783251" TEXT_SHORTENED="true">
+<node TEXT="標準の最小縦幅(ピクセル)" FOLDED="true" ID="ID_448783251" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="150" ID="ID_386494789" TEXT_SHORTENED="true">
+<node TEXT="150" ID="ID_386494789" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="標準の最大縦幅(ピクセル)" FOLDED="true" ID="ID_1624020825" TEXT_SHORTENED="true">
+<node TEXT="標準の最大縦幅(ピクセル)" FOLDED="true" ID="ID_1624020825" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="600" ID="ID_143285276" TEXT_SHORTENED="true">
+<node TEXT="600" ID="ID_143285276" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="標準の最小横幅(ピクセル)" FOLDED="true" ID="ID_359894920" TEXT_SHORTENED="true">
+<node TEXT="標準の最小横幅(ピクセル)" FOLDED="true" ID="ID_359894920" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="400" ID="ID_1832059342" TEXT_SHORTENED="true">
+<node TEXT="400" ID="ID_1832059342" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="標準の最大横幅(ピクセル)" FOLDED="true" ID="ID_1086102192" TEXT_SHORTENED="true">
+<node TEXT="標準の最大横幅(ピクセル)" FOLDED="true" ID="ID_1086102192" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="900" ID="ID_216216236" TEXT_SHORTENED="true">
+<node TEXT="900" ID="ID_216216236" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="長文編集ウィンドウ" ID="ID_1357376972" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1539686437" CREATED="1455910949183" MODIFIED="1455910949183">
+<hook NAME="SummaryNode"/>
+<node TEXT="長文編集ウィンドウ" ID="ID_1357376972" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="上下の間隔(ピクセル)" FOLDED="true" ID="ID_308863029" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1419965057" CREATED="1455910949183" MODIFIED="1455910949183">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="上下の間隔(ピクセル)" FOLDED="true" ID="ID_308863029" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="5" ID="ID_391477845" TEXT_SHORTENED="true">
+<node TEXT="5" ID="ID_391477845" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="左右の間隔(ピクセル)" FOLDED="true" ID="ID_997659229" TEXT_SHORTENED="true">
+<node TEXT="左右の間隔(ピクセル)" FOLDED="true" ID="ID_997659229" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="15" ID="ID_275848914" TEXT_SHORTENED="true">
+<node TEXT="15" ID="ID_275848914" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="アウトラインビュー" ID="ID_1355729487" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1936359994" CREATED="1455910949183" MODIFIED="1455910949183">
+<hook NAME="SummaryNode"/>
+<node TEXT="アウトラインビュー" ID="ID_1355729487" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="左ツールバーのアイコン表示を階層化" ID="ID_1521902457" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1880419562" CREATED="1455910949183" MODIFIED="1455910949183">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="左ツールバーのアイコン表示を階層化" ID="ID_1521902457" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノートアイコンを非表示" ID="ID_1884330658" TEXT_SHORTENED="true">
+<node TEXT="ノートアイコンを非表示" ID="ID_1884330658" CREATED="1455910949102" MODIFIED="1455910949102" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
@@ -13263,14 +13587,14 @@
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="属性付きアイコンを表示" FOLDED="true" ID="ID_1228898153">
+<node TEXT="属性付きアイコンを表示" FOLDED="true" ID="ID_1228898153" CREATED="1455910949102" MODIFIED="1455910949102">
<attribute NAME="Chapter" VALUE="3"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
-<node TEXT="" ID="ID_768370018" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_768370018" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
@@ -13297,23 +13621,25 @@
</richcontent>
</node>
</node>
-<node TEXT="アイコン" ID="ID_693765266" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_530619180" CREATED="1455910949183" MODIFIED="1455910949183">
+<hook NAME="SummaryNode"/>
+<node TEXT="アイコン" ID="ID_693765266" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<attribute_layout NAME_WIDTH="46" VALUE_WIDTH="46"/>
+<attribute_layout NAME_WIDTH="34.5 pt" VALUE_WIDTH="34.5 pt"/>
<attribute NAME="Chapter" VALUE="3,8"/>
-<hook NAME="SummaryNode"/>
</node>
</node>
-<node TEXT="キー設定" FOLDED="true" ID="ID_1511501068" TEXT_SHORTENED="true">
+</node>
+<node TEXT="キー設定" FOLDED="true" ID="ID_1511501068" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="各種アイコン用の事前設定ホットキーショートカットを制御します。" ID="ID_881564335" TEXT_SHORTENED="true"/>
+<node TEXT="各種アイコン用の事前設定ホットキーショートカットを制御します。" ID="ID_881564335" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="動作設定" FOLDED="true" ID="ID_1341988022" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="動作設定" FOLDED="true" ID="ID_1341988022" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -13330,147 +13656,157 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
-<node TEXT="新規ノードの配置" FOLDED="true" ID="ID_861632555" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_244143390" CREATED="1455910949183" MODIFIED="1455910949183">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="新規ノードの配置" FOLDED="true" ID="ID_861632555" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="冒頭" ID="ID_530563396" TEXT_SHORTENED="true">
+<node TEXT="冒頭" ID="ID_530563396" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="末尾" ID="ID_1194068358" TEXT_SHORTENED="true">
+<node TEXT="末尾" ID="ID_1194068358" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ドラッグ&ドロップ" ID="ID_101107635" TEXT_SHORTENED="true">
+<node TEXT="ドラッグ&ドロップ" ID="ID_101107635" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="貼り付け時にノードを展開" ID="ID_675886253" TEXT_SHORTENED="true">
+<node TEXT="貼り付け時にノードを展開" ID="ID_675886253" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="マップスクロール時にマウスカーソルを隠す" ID="ID_1181108130" TEXT_SHORTENED="true">
+<node TEXT="マップスクロール時にマウスカーソルを隠す" ID="ID_1181108130" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="折り畳み中シンボルの幅" FOLDED="true" ID="ID_71858248" TEXT_SHORTENED="true">
+<node TEXT="折り畳み中シンボルの幅" FOLDED="true" ID="ID_71858248" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="6" ID="ID_794404287" TEXT_SHORTENED="true">
+<node TEXT="6" ID="ID_794404287" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="(ノード位置移動時の)グリッドの間隔" FOLDED="true" ID="ID_112925672" TEXT_SHORTENED="true">
+<node TEXT="(ノード位置移動時の)グリッドの間隔" FOLDED="true" ID="ID_112925672" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="10" ID="ID_519267964" TEXT_SHORTENED="true">
+<node TEXT="10" ID="ID_519267964" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ノートウィンドウのカーソルを末尾に移動" ID="ID_1444123465" TEXT_SHORTENED="true">
+<node TEXT="ノートウィンドウのカーソルを末尾に移動" ID="ID_1444123465" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="キータイプの動作" FOLDED="true" ID="ID_1439391450" TEXT_SHORTENED="true">
+<node TEXT="キータイプの動作" FOLDED="true" ID="ID_1439391450" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="内容を上書き" ID="ID_1849292111" TEXT_SHORTENED="true">
+<node TEXT="内容を上書き" ID="ID_1849292111" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="何もしない" ID="ID_788453989" TEXT_SHORTENED="true">
+<node TEXT="何もしない" ID="ID_788453989" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="兄弟ノードを付加" ID="ID_988048217" TEXT_SHORTENED="true">
+<node TEXT="兄弟ノードを付加" ID="ID_988048217" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="子ノードを付加" ID="ID_863096557" TEXT_SHORTENED="true">
+<node TEXT="子ノードを付加" ID="ID_863096557" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="基本動作" ID="ID_155279064" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="73" VALUE_WIDTH="103"/>
+<node TEXT="" ID="ID_990360666" CREATED="1455910949183" MODIFIED="1455910949183">
+<hook NAME="SummaryNode"/>
+<node TEXT="基本動作" ID="ID_155279064" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="54.75 pt" VALUE_WIDTH="77.25 pt"/>
<attribute NAME="Chapter" VALUE="8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="数値や日時の入力を認識" FOLDED="true" ID="ID_1354002139" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1450879926" CREATED="1455910949184" MODIFIED="1455910949184">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="数値や日時の入力を認識" FOLDED="true" ID="ID_1354002139" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
-<node TEXT="ボックスをチェック中です。" ID="ID_859349343" TEXT_SHORTENED="true">
+<node TEXT="ボックスをチェック中です。" ID="ID_859349343" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="数値の標準書式" FOLDED="true" ID="ID_72012062" TEXT_SHORTENED="true">
+<node TEXT="数値の標準書式" FOLDED="true" ID="ID_72012062" CREATED="1455910949103" MODIFIED="1455910949103" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<edge COLOR="#00ffcc"/>
-<node TEXT="#0.####" ID="ID_314571391" TEXT_SHORTENED="true">
+<node TEXT="#0.####" ID="ID_314571391" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="日付の標準書式" FOLDED="true" ID="ID_1244294205" TEXT_SHORTENED="true">
+<node TEXT="日付の標準書式" FOLDED="true" ID="ID_1244294205" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<edge COLOR="#00ffcc"/>
-<node TEXT="SHORT" ID="ID_980983589" TEXT_SHORTENED="true">
+<node TEXT="SHORT" ID="ID_980983589" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="時刻付き日付の標準書式" FOLDED="true" ID="ID_1479197853" TEXT_SHORTENED="true">
+<node TEXT="時刻付き日付の標準書式" FOLDED="true" ID="ID_1479197853" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<edge COLOR="#00ffcc"/>
-<node TEXT="SHORT,SHORT" ID="ID_1966822672" TEXT_SHORTENED="true">
+<node TEXT="SHORT,SHORT" ID="ID_1966822672" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="書式のロケール" FOLDED="true" ID="ID_1611192107" TEXT_SHORTENED="true">
+<node TEXT="書式のロケール" FOLDED="true" ID="ID_1611192107" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<edge COLOR="#00ffcc"/>
-<node TEXT="自動選択(言語リスト)" ID="ID_1150811157" TEXT_SHORTENED="true">
+<node TEXT="自動選択(言語リスト)" ID="ID_1150811157" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="4"/>
</node>
</node>
-<node TEXT="データ書式の設定と解析" ID="ID_713876240" TEXT_SHORTENED="true">
-<attribute_layout NAME_WIDTH="46" VALUE_WIDTH="149"/>
+<node TEXT="" ID="ID_247415093" CREATED="1455910949184" MODIFIED="1455910949184">
+<hook NAME="SummaryNode"/>
+<node TEXT="データ書式の設定と解析" ID="ID_713876240" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
+<attribute_layout NAME_WIDTH="34.5 pt" VALUE_WIDTH="111.75 pt"/>
<attribute NAME="Chapter" VALUE="4,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
@@ -13493,305 +13829,355 @@
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="すべての新規ノードにインラインエディタを表示" ID="ID_172497623" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1384377358" CREATED="1455910949184" MODIFIED="1455910949184">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="すべての新規ノードにインラインエディタを表示" ID="ID_172497623" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ダブルクリックで編集" ID="ID_1478021910" TEXT_SHORTENED="true">
+<node TEXT="ダブルクリックで編集" ID="ID_1478021910" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="編集中にマップを自動レイアウト" ID="ID_883483356" TEXT_SHORTENED="true">
+<node TEXT="編集中にマップを自動レイアウト" ID="ID_883483356" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="Enter で確定" ID="ID_256985273" TEXT_SHORTENED="true">
+<node TEXT="Enter で確定" ID="ID_256985273" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="インラインノードエディタ" ID="ID_1066845543" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1579739982" CREATED="1455910949184" MODIFIED="1455910949184">
+<hook NAME="SummaryNode"/>
+<node TEXT="インラインノードエディタ" ID="ID_1066845543" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="貼り付けノードでリッチテキストを使用" FOLDED="true" ID="ID_651926416" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1115650532" CREATED="1455910949184" MODIFIED="1455910949184">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="貼り付けノードでリッチテキストを使用" FOLDED="true" ID="ID_651926416" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="確認する" ID="ID_1498341777" TEXT_SHORTENED="true">
+<node TEXT="確認する" ID="ID_1498341777" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="はい" ID="ID_1113773198" TEXT_SHORTENED="true">
+<node TEXT="はい" ID="ID_1113773198" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="いいえ" ID="ID_537595889" TEXT_SHORTENED="true">
+<node TEXT="いいえ" ID="ID_537595889" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ノード削除時に確認を省略" ID="ID_1205664043" TEXT_SHORTENED="true">
+<node TEXT="ノード削除時に確認を省略" ID="ID_1205664043" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノード切り取り時に確認を省略" ID="ID_391349060" TEXT_SHORTENED="true">
+<node TEXT="ノード切り取り時に確認を省略" ID="ID_391349060" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノートの削除時に確認を省略" ID="ID_1002512830" TEXT_SHORTENED="true">
+<node TEXT="ノートの削除時に確認を省略" ID="ID_1002512830" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="確認" ID="ID_1971310043" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1743279273" CREATED="1455910949184" MODIFIED="1455910949184">
+<hook NAME="SummaryNode"/>
+<node TEXT="確認" ID="ID_1971310043" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="数値として比較" ID="ID_1522607281" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1797336863" CREATED="1455910949184" MODIFIED="1455910949184">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="数値として比較" ID="ID_1522607281" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="検索" ID="ID_1414916712" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_41206305" CREATED="1455910949184" MODIFIED="1455910949184">
<hook NAME="SummaryNode"/>
+<node TEXT="検索" ID="ID_1414916712" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="選択方法" FOLDED="true" ID="ID_226182068" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_372003395" CREATED="1455910949185" MODIFIED="1455910949185">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="選択方法" FOLDED="true" ID="ID_226182068" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="マウスオーバー後、間をおいて自動選択" ID="ID_1215619214" TEXT_SHORTENED="true">
+<node TEXT="マウスオーバー後、間をおいて自動選択" ID="ID_1215619214" CREATED="1455910949104" MODIFIED="1455910949104" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="マウスオーバーで直ちに選択" ID="ID_821788845" TEXT_SHORTENED="true">
+<node TEXT="マウスオーバーで直ちに選択" ID="ID_821788845" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="クリックで選択" ID="ID_1101176816" TEXT_SHORTENED="true">
+<node TEXT="クリックで選択" ID="ID_1101176816" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="自動選択までの時間" FOLDED="true" ID="ID_624949069" TEXT_SHORTENED="true">
+<node TEXT="自動選択までの時間" FOLDED="true" ID="ID_624949069" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="200" ID="ID_1394408576" TEXT_SHORTENED="true">
+<node TEXT="200" ID="ID_1394408576" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="選択ノードを中央へ" ID="ID_1765904320" TEXT_SHORTENED="true">
+<node TEXT="選択ノードを中央へ" ID="ID_1765904320" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノードの選択" ID="ID_1336375513" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1710145763" CREATED="1455910949185" MODIFIED="1455910949185">
+<hook NAME="SummaryNode"/>
+<node TEXT="ノードの選択" ID="ID_1336375513" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="加速度" FOLDED="true" ID="ID_797872597" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_240452068" CREATED="1455910949185" MODIFIED="1455910949185">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="加速度" FOLDED="true" ID="ID_797872597" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="80" ID="ID_1685853892" TEXT_SHORTENED="true">
+<node TEXT="80" ID="ID_1685853892" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="マウスホイール" ID="ID_94236562" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1564445960" CREATED="1455910949185" MODIFIED="1455910949185">
+<hook NAME="SummaryNode"/>
+<node TEXT="マウスホイール" ID="ID_94236562" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="速度" FOLDED="true" ID="ID_1024335792" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_271398935" CREATED="1455910949185" MODIFIED="1455910949185">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="速度" FOLDED="true" ID="ID_1024335792" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="20" ID="ID_388198497" TEXT_SHORTENED="true">
+<node TEXT="20" ID="ID_388198497" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="スクロールバー" ID="ID_781129853" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_924525471" CREATED="1455910949185" MODIFIED="1455910949185">
+<hook NAME="SummaryNode"/>
+<node TEXT="スクロールバー" ID="ID_781129853" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="大文字/小文字を区別" ID="ID_1839963640" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_828639293" CREATED="1455910949185" MODIFIED="1455910949185">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="大文字/小文字を区別" ID="ID_1839963640" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="大文字のみの語を無視" ID="ID_778661580" TEXT_SHORTENED="true">
+<node TEXT="大文字のみの語を無視" ID="ID_778661580" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="語の冒頭にある大文字を無視" ID="ID_1299695370" TEXT_SHORTENED="true">
+<node TEXT="語の冒頭にある大文字を無視" ID="ID_1299695370" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="数字を含む語を無視" ID="ID_1819700736" TEXT_SHORTENED="true">
+<node TEXT="数字を含む語を無視" ID="ID_1819700736" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ダイアログに表示する候補の最大値" FOLDED="true" ID="ID_1193947820" TEXT_SHORTENED="true">
+<node TEXT="ダイアログに表示する候補の最大値" FOLDED="true" ID="ID_1193947820" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="15" ID="ID_282567967" TEXT_SHORTENED="true">
+<node TEXT="15" ID="ID_282567967" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="メニューに表示する候補の最大値" FOLDED="true" ID="ID_477574985" TEXT_SHORTENED="true">
+<node TEXT="メニューに表示する候補の最大値" FOLDED="true" ID="ID_477574985" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="15" ID="ID_425362264" TEXT_SHORTENED="true">
+<node TEXT="15" ID="ID_425362264" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="スペルチェックオプション" ID="ID_102337092" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_694302798" CREATED="1455910949185" MODIFIED="1455910949185">
+<hook NAME="SummaryNode"/>
+<node TEXT="スペルチェックオプション" ID="ID_102337092" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="ノードの情報をツールチップ表示" ID="ID_1086108576" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_806288531" CREATED="1455910949186" MODIFIED="1455910949186">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノードの情報をツールチップ表示" ID="ID_1086108576" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="最初に表示するまでの時間(ミリ秒)" STYLE_REF="Method" FOLDED="true" ID="ID_1343633498" TEXT_SHORTENED="true">
+<node TEXT="最初に表示するまでの時間(ミリ秒)" STYLE_REF="Method" FOLDED="true" ID="ID_1343633498" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="750" ID="ID_1782324302" TEXT_SHORTENED="true">
+<node TEXT="750" ID="ID_1782324302" CREATED="1455910949105" MODIFIED="1455910949105" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="表示を中断するまでの時間(ミリ秒)" STYLE_REF="Method" FOLDED="true" ID="ID_118778413" TEXT_SHORTENED="true">
+<node TEXT="表示を中断するまでの時間(ミリ秒)" STYLE_REF="Method" FOLDED="true" ID="ID_118778413" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="4,000" ID="ID_1660267918" TEXT_SHORTENED="true">
+<node TEXT="4,000" ID="ID_1660267918" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="表示を再開するまでの時間(ミリ秒)" STYLE_REF="Method" FOLDED="true" ID="ID_1017873473" TEXT_SHORTENED="true">
+<node TEXT="表示を再開するまでの時間(ミリ秒)" STYLE_REF="Method" FOLDED="true" ID="ID_1017873473" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="500" ID="ID_1275414273" TEXT_SHORTENED="true">
+<node TEXT="500" ID="ID_1275414273" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="ツールチップ表示の時間" ID="ID_183208491" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_422690297" CREATED="1455910949186" MODIFIED="1455910949186">
+<hook NAME="SummaryNode"/>
+<node TEXT="ツールチップ表示の時間" ID="ID_183208491" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="入力欄の追加幅" STYLE_REF="Method" FOLDED="true" ID="ID_74989020" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1376997002" CREATED="1455910949186" MODIFIED="1455910949186">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="入力欄の追加幅" STYLE_REF="Method" FOLDED="true" ID="ID_74989020" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="80" ID="ID_1049715479" TEXT_SHORTENED="true">
+<node TEXT="80" ID="ID_1049715479" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="エディタの設定" ID="ID_1657053141" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_490470969" CREATED="1455910949186" MODIFIED="1455910949186">
+<hook NAME="SummaryNode"/>
+<node TEXT="エディタの設定" ID="ID_1657053141" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
-<node TEXT="元に戻す回数の上限" STYLE_REF="Method" FOLDED="true" ID="ID_1342787777" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_52593838" CREATED="1455910949186" MODIFIED="1455910949186">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="元に戻す回数の上限" STYLE_REF="Method" FOLDED="true" ID="ID_1342787777" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<edge COLOR="#00ffcc"/>
-<node TEXT="100" ID="ID_1108790923" TEXT_SHORTENED="true">
+<node TEXT="100" ID="ID_1108790923" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="元に戻す" ID="ID_293995550" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_618722308" CREATED="1455910949186" MODIFIED="1455910949186">
+<hook NAME="SummaryNode"/>
+<node TEXT="元に戻す" ID="ID_293995550" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
<edge COLOR="#00ffcc"/>
</node>
</node>
-<node TEXT="HTML" FOLDED="true" ID="ID_1770350324" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="HTML" FOLDED="true" ID="ID_1770350324" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -13808,62 +14194,70 @@
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6,8"/>
-<node TEXT="Windows NT" FOLDED="true" ID="ID_591543188" TEXT_SHORTENED="true">
-<node TEXT="cmd.exe/c start"" "{0}"" ID="ID_1743967739" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1023270569" CREATED="1455910949186" MODIFIED="1455910949186">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Windows NT" FOLDED="true" ID="ID_591543188" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
+<node TEXT="cmd.exe/c start"" "{0}"" ID="ID_1743967739" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="Windows 9x" FOLDED="true" ID="ID_1494382332" TEXT_SHORTENED="true">
-<node TEXT="command.com /c start "{0}"" ID="ID_1418963785" TEXT_SHORTENED="true">
+<node TEXT="Windows 9x" FOLDED="true" ID="ID_1494382332" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
+<node TEXT="command.com /c start "{0}"" ID="ID_1418963785" CREATED="1455910949106" MODIFIED="1455910949106" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="その他のOS" FOLDED="true" ID="ID_1249889831" TEXT_SHORTENED="true">
-<node TEXT="xdg-open {0}" ID="ID_1009592476" TEXT_SHORTENED="true">
+<node TEXT="その他のOS" FOLDED="true" ID="ID_1249889831" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
+<node TEXT="xdg-open {0}" ID="ID_1009592476" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="MAC OS X" FOLDED="true" ID="ID_209254161" TEXT_SHORTENED="true">
-<node TEXT="open {0}" ID="ID_1462579599" TEXT_SHORTENED="true">
+<node TEXT="MAC OS X" FOLDED="true" ID="ID_209254161" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
+<node TEXT="open {0}" ID="ID_1462579599" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="OS別の標準ブラウザ起動コマンド" ID="ID_538776406" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_897516784" CREATED="1455910949186" MODIFIED="1455910949186">
+<hook NAME="SummaryNode"/>
+<node TEXT="OS別の標準ブラウザ起動コマンド" ID="ID_538776406" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
<attribute NAME="Chapter" VALUE="8"/>
</node>
-<node TEXT="折り畳みの扱い" FOLDED="true" ID="ID_1951064052" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1501907707" CREATED="1455910949186" MODIFIED="1455910949186">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="折り畳みの扱い" FOLDED="true" ID="ID_1951064052" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
-<node TEXT="すべて展開して書き出す" ID="ID_495590352" TEXT_SHORTENED="true">
+<node TEXT="すべて展開して書き出す" ID="ID_495590352" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="現状のまま書き出す" ID="ID_1561548214" TEXT_SHORTENED="true">
+<node TEXT="現状のまま書き出す" ID="ID_1561548214" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="すべて折り畳んで書き出す" ID="ID_1965323780" TEXT_SHORTENED="true">
+<node TEXT="すべて折り畳んで書き出す" ID="ID_1965323780" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="階層を見出しにする" ID="ID_1964577276" TEXT_SHORTENED="true">
+<node TEXT="階層を見出しにする" ID="ID_1964577276" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<icon BUILTIN="pencil"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
@@ -13871,133 +14265,150 @@
<attribute NAME="Chapter" VALUE="6"/>
</node>
</node>
-<node TEXT="アイコンも書き出す" ID="ID_1815431673" TEXT_SHORTENED="true">
+<node TEXT="アイコンも書き出す" ID="ID_1815431673" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="HTML へのエクスポート" ID="ID_642245314" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1054120798" CREATED="1455910949187" MODIFIED="1455910949187">
+<hook NAME="SummaryNode"/>
+<node TEXT="HTML へのエクスポート" ID="ID_642245314" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="ノード階層に変換してインポート" ID="ID_631927223" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_833212364" CREATED="1455910949187" MODIFIED="1455910949187">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ノード階層に変換してインポート" ID="ID_631927223" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="HTML からのインポート" ID="ID_338348480" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1051061910" CREATED="1455910949187" MODIFIED="1455910949187">
+<hook NAME="SummaryNode"/>
+<node TEXT="HTML からのインポート" ID="ID_338348480" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
</node>
-<node TEXT="プラグイン" FOLDED="true" ID="ID_121069743" TEXT_SHORTENED="true">
+</node>
+<node TEXT="プラグイン" FOLDED="true" ID="ID_121069743" CREATED="1455910949107" MODIFIED="1455910949107" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="7,8"/>
-<node TEXT="計算式実行キャッシュを無効に" ID="ID_1044038034" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1761101321" CREATED="1455910949187" MODIFIED="1455910949187">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="計算式実行キャッシュを無効に" ID="ID_1044038034" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="計算式の実行を無効に" ID="ID_205283933" TEXT_SHORTENED="true">
+<node TEXT="計算式の実行を無効に" ID="ID_205283933" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="計算式ノードを枠囲い表示" ID="ID_159965221" TEXT_SHORTENED="true">
+<node TEXT="計算式ノードを枠囲い表示" ID="ID_159965221" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="IsChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="計算式プラグイン" ID="ID_371015407" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1165455401" CREATED="1455910949187" MODIFIED="1455910949187">
+<hook NAME="SummaryNode"/>
+<node TEXT="計算式プラグイン" ID="ID_371015407" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7,8"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
-<node TEXT="スクリプトの実行を許可" FOLDED="true" ID="ID_567366747" TEXT_SHORTENED="true">
+</node>
+<node TEXT="" ID="ID_1827107349" CREATED="1455910949187" MODIFIED="1455910949187">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="スクリプトの実行を許可" FOLDED="true" ID="ID_567366747" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
-<node TEXT="計算式は実行可能に" LOCALIZED_STYLE_REF="styles.important" ID="ID_1258843720">
+<node TEXT="計算式は実行可能に" LOCALIZED_STYLE_REF="styles.important" ID="ID_1258843720" CREATED="1455910949108" MODIFIED="1455910949108">
<attribute NAME="Chapter" VALUE="7"/>
</node>
</node>
-<node TEXT="ファイルの読み込み操作を許可" ID="ID_1145756334" TEXT_SHORTENED="true">
+<node TEXT="ファイルの読み込み操作を許可" ID="ID_1145756334" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="ファイルの書き込み操作を許可" ID="ID_246562234" TEXT_SHORTENED="true">
+<node TEXT="ファイルの書き込み操作を許可" ID="ID_246562234" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="ネットワーク操作を許可" ID="ID_1975317104" TEXT_SHORTENED="true">
+<node TEXT="ネットワーク操作を許可" ID="ID_1975317104" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="他のアプリケーションの実行を許可" ID="ID_509441880" TEXT_SHORTENED="true">
+<node TEXT="他のアプリケーションの実行を許可" ID="ID_509441880" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="UnChecked" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="署名付きスクリプトを信頼" STYLE_REF="IsChecked" ID="ID_1412203400">
+<node TEXT="署名付きスクリプトを信頼" STYLE_REF="IsChecked" ID="ID_1412203400" CREATED="1455910949108" MODIFIED="1455910949108">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="署名用ユーザキーエイリアス" ID="ID_995760581" TEXT_SHORTENED="true">
+<node TEXT="署名用ユーザキーエイリアス" ID="ID_995760581" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="スクリプトディレクトリ" FOLDED="true" ID="ID_1580438962" TEXT_SHORTENED="true">
+<node TEXT="スクリプトディレクトリ" FOLDED="true" ID="ID_1580438962" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
-<node TEXT="スクリプト" ID="ID_1834563527" TEXT_SHORTENED="true">
+<node TEXT="スクリプト" ID="ID_1834563527" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
</node>
-<node TEXT="スクリプトクラスパス" ID="ID_30757577" TEXT_SHORTENED="true">
+<node TEXT="スクリプトクラスパス" ID="ID_30757577" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
</node>
-<node TEXT="スクリプト" ID="ID_1511750976" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1490316939" CREATED="1455910949187" MODIFIED="1455910949187">
+<hook NAME="SummaryNode"/>
+<node TEXT="スクリプト" ID="ID_1511750976" CREATED="1455910949108" MODIFIED="1455910949108" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MenuGroupLabel" LAST="false"/>
</hook>
-<hook NAME="SummaryNode"/>
</node>
</node>
</node>
</node>
-<node TEXT="マ ッ プ" FOLDED="true" ID="ID_572760232" TEXT_SHORTENED="true">
+</node>
+<node TEXT="マ ッ プ" FOLDED="true" ID="ID_572760232" CREATED="1455910949109" MODIFIED="1455910949109" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
@@ -14016,7 +14427,10 @@
</html>
</richcontent>
<edge STYLE="horizontal"/>
-<node TEXT="マップ編集モード" ID="ID_674391109" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="" ID="ID_1052143617" CREATED="1455910949188" MODIFIED="1455910949188">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="マップ編集モード" ID="ID_674391109" CREATED="1455910949109" MODIFIED="1455910949109" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14034,7 +14448,7 @@
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="マップ閲覧モード" ID="ID_607287696" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="マップ閲覧モード" ID="ID_607287696" CREATED="1455910949109" MODIFIED="1455910949109" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14051,18 +14465,20 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ファイラーモード" ID="ID_1061396194" TEXT_SHORTENED="true">
+<node TEXT="ファイラーモード" ID="ID_1061396194" CREATED="1455910949109" MODIFIED="1455910949109" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="6"/>
</node>
-<node TEXT="オープン中のマップ一覧" ID="ID_470589040" TEXT_SHORTENED="true">
+<node TEXT="オープン中のマップ一覧" ID="ID_470589040" CREATED="1455910949109" MODIFIED="1455910949109" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ウェブページにマインドマップを公開" FOLDED="true" ID="ID_344627022" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_641404088" CREATED="1455910949188" MODIFIED="1455910949188">
+<hook NAME="SummaryNode"/>
+<node TEXT="ウェブページにマインドマップを公開" FOLDED="true" ID="ID_344627022" CREATED="1455910949109" MODIFIED="1455910949109" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
@@ -14129,9 +14545,8 @@
</body>
</html>
</richcontent>
-<hook NAME="SummaryNode"/>
<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
-<node TEXT="wiki にマインドマップを埋め込む" ID="ID_816448545" LINK="http://freeplane.sourceforge.net/wiki/index.php/Embedding_mind_maps" TEXT_SHORTENED="true">
+<node TEXT="wiki にマインドマップを埋め込む" ID="ID_816448545" CREATED="1455910949110" MODIFIED="1455910949110" LINK="http://freeplane.sourceforge.net/wiki/index.php/Embedding_mind_maps" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
@@ -14151,7 +14566,8 @@
</node>
</node>
</node>
-<node TEXT="ヘ ル プ" FOLDED="true" ID="ID_832864139" TEXT_SHORTENED="true">
+</node>
+<node TEXT="ヘ ル プ" FOLDED="true" ID="ID_832864139" CREATED="1455910949110" MODIFIED="1455910949110" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
@@ -14170,7 +14586,7 @@
</html>
</richcontent>
<edge STYLE="horizontal"/>
-<node TEXT="プログラムの更新確認" ID="ID_373235221" TEXT_SHORTENED="true">
+<node TEXT="プログラムの更新確認" ID="ID_373235221" CREATED="1455910949110" MODIFIED="1455910949110" TEXT_SHORTENED="true">
<icon BUILTIN="../update"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
@@ -14189,7 +14605,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Freeplane ホームページ" ID="ID_423013051" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Freeplane ホームページ" ID="ID_423013051" CREATED="1455910949111" MODIFIED="1455910949111" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14206,7 +14622,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ネットで助言を要請" FOLDED="true" ID="ID_313789006" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ネットで助言を要請" FOLDED="true" ID="ID_313789006" CREATED="1455910949111" MODIFIED="1455910949111" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14223,9 +14639,9 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
-<node TEXT="トラブルシューティング" ID="ID_956270867" LINK="http://freeplane.sourceforge.net/wiki/index.php/Troubleshooting" TEXT_SHORTENED="true"/>
+<node TEXT="トラブルシューティング" ID="ID_956270867" CREATED="1455910949112" MODIFIED="1455910949112" LINK="http://freeplane.sourceforge.net/wiki/index.php/Troubleshooting" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="バグ報告" ID="ID_962008923" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="バグ報告" ID="ID_962008923" CREATED="1455910949112" MODIFIED="1455910949112" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14242,7 +14658,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="機能の追加を要望" ID="ID_98014582" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="機能の追加を要望" ID="ID_98014582" CREATED="1455910949112" MODIFIED="1455910949112" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14259,7 +14675,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="ライセンス" ID="ID_27246134" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ライセンス" ID="ID_27246134" CREATED="1455910949112" MODIFIED="1455910949112" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14276,7 +14692,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="Freeplane について" ID="ID_1437487194" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Freeplane について" ID="ID_1437487194" CREATED="1455910949112" MODIFIED="1455910949112" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14294,7 +14710,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="チュートリアル" ID="ID_1373709444" TEXT_SHORTENED="true">
+<node TEXT="チュートリアル" ID="ID_1373709444" CREATED="1455910949112" MODIFIED="1455910949112" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
@@ -14312,7 +14728,7 @@
</html>
</richcontent>
</node>
-<node TEXT="マニュアル" ID="ID_934246709" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="マニュアル" ID="ID_934246709" CREATED="1455910949112" MODIFIED="1455910949112" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14330,7 +14746,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="マニュアルマップ(オンライン)" ID="ID_566454554" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="マニュアルマップ(オンライン)" ID="ID_566454554" CREATED="1455910949112" MODIFIED="1455910949112" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14374,7 +14790,7 @@
</html>
</richcontent>
</node>
-<node TEXT="キーレファレンス" ID="ID_711310932" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="キーレファレンス" ID="ID_711310932" CREATED="1455910949112" MODIFIED="1455910949112" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14388,14 +14804,14 @@
</html>
</richcontent>
</node>
-<node TEXT="スクリプト API" ID="ID_1717103039" TEXT_SHORTENED="true">
+<node TEXT="スクリプト API" ID="ID_1717103039" CREATED="1455910949112" MODIFIED="1455910949112" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
</node>
</node>
-<node STYLE_REF="Title" FOLDED="true" POSITION="left" ID="ID_1405760079" HGAP="-37" VSHIFT="-60" TEXT_SHORTENED="true">
+<node STYLE_REF="Title" FOLDED="true" POSITION="left" ID="ID_1405760079" CREATED="1455910949123" MODIFIED="1455910949123" HGAP_QUANTITY="-37.0 px" VSHIFT_QUANTITY="-60.0 px" TEXT_SHORTENED="true">
<icon BUILTIN="gohome"/>
<richcontent TYPE="NODE">
@@ -14407,11 +14823,9 @@
<p>
<span style="color: #ffffff; font-weight: bold"><font color="#ffffff"><b>ユーザガイド </b></font></span>
</p>
- <p>
-
- </p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -14442,7 +14856,7 @@
</html>
</richcontent>
<edge STYLE="bezier"/>
-<node TEXT="目  標" STYLE_REF="UserGuide" ID="ID_1273003205" HGAP="30" VSHIFT="-10" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="目  標" STYLE_REF="UserGuide" ID="ID_1273003205" CREATED="1455910949123" MODIFIED="1455910949123" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="-10.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14484,7 +14898,7 @@
</richcontent>
<edge STYLE="horizontal"/>
</node>
-<node STYLE_REF="UserGuide" FOLDED="true" ID="ID_1108028010" HGAP="27" TEXT_SHORTENED="true" LINK="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane" MIN_WIDTH="80"><richcontent TYPE="NODE">
+<node STYLE_REF="UserGuide" FOLDED="true" ID="ID_1108028010" CREATED="1455910949123" MODIFIED="1455910949123" LINK="http://freeplane.sourceforge.net/wiki/index.php/Tutorial_Freeplane" HGAP_QUANTITY="27.0 px" TEXT_SHORTENED="true" MIN_WIDTH="80.0 px"><richcontent TYPE="NODE">
<html>
<head>
@@ -14496,6 +14910,7 @@
</p>
</body>
</html>
+
</richcontent>
<richcontent TYPE="DETAILS">
@@ -14534,7 +14949,7 @@
</body>
</html>
</richcontent>
-<node TEXT="内容の識別法" STYLE_REF="UserGuide" FOLDED="true" ID="ID_740355128" TEXT_SHORTENED="true">
+<node TEXT="内容の識別法" STYLE_REF="UserGuide" FOLDED="true" ID="ID_740355128" CREATED="1455910949124" MODIFIED="1455910949124" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
@@ -14561,7 +14976,7 @@
</body>
</html>
</richcontent>
-<node TEXT="定義(Definition)" STYLE_REF="Definition" ID="ID_956317163" TEXT_SHORTENED="true">
+<node TEXT="定義(Definition)" STYLE_REF="Definition" ID="ID_956317163" CREATED="1455910949124" MODIFIED="1455910949124" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1,2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14588,7 +15003,7 @@
</html>
</richcontent>
</node>
-<node TEXT="機能(Method)" STYLE_REF="Method" ID="ID_1120480647" TEXT_SHORTENED="true">
+<node TEXT="機能(Method)" STYLE_REF="Method" ID="ID_1120480647" CREATED="1455910949124" MODIFIED="1455910949124" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1,2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14604,7 +15019,7 @@
</html>
</richcontent>
</node>
-<node TEXT="手順(Procedure)" STYLE_REF="Procedure" ID="ID_1538273710" TEXT_SHORTENED="true">
+<node TEXT="手順(Procedure)" STYLE_REF="Procedure" ID="ID_1538273710" CREATED="1455910949124" MODIFIED="1455910949124" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14620,7 +15035,7 @@
</html>
</richcontent>
</node>
-<node TEXT="例外(Exception)" STYLE_REF="Exception" ID="ID_873140029" TEXT_SHORTENED="true">
+<node TEXT="例外(Exception)" STYLE_REF="Exception" ID="ID_873140029" CREATED="1455910949124" MODIFIED="1455910949124" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14636,7 +15051,7 @@
</html>
</richcontent>
</node>
-<node TEXT="留意事項(ToNote)" STYLE_REF="ToNote" ID="ID_1101759572" TEXT_SHORTENED="true">
+<node TEXT="留意事項(ToNote)" STYLE_REF="ToNote" ID="ID_1101759572" CREATED="1455910949124" MODIFIED="1455910949124" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14652,7 +15067,7 @@
</html>
</richcontent>
</node>
-<node TEXT="詳しい説明(Refine)" STYLE_REF="Refine" ID="ID_369686575" TEXT_SHORTENED="true">
+<node TEXT="詳しい説明(Refine)" STYLE_REF="Refine" ID="ID_369686575" CREATED="1455910949124" MODIFIED="1455910949124" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14668,7 +15083,7 @@
</html>
</richcontent>
</node>
-<node TEXT="用例(Example)" STYLE_REF="Example" ID="ID_584103658" TEXT_SHORTENED="true">
+<node TEXT="用例(Example)" STYLE_REF="Example" ID="ID_584103658" CREATED="1455910949125" MODIFIED="1455910949125" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14684,7 +15099,7 @@
</html>
</richcontent>
</node>
-<node TEXT="更新(Revision)" STYLE_REF="Revision" ID="ID_599389034" TEXT_SHORTENED="true">
+<node TEXT="更新(Revision)" STYLE_REF="Revision" ID="ID_599389034" CREATED="1455910949125" MODIFIED="1455910949125" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14711,7 +15126,7 @@
</html>
</richcontent>
</node>
-<node TEXT="メインメニュー(MainMenu)" STYLE_REF="MainMenu" ID="ID_1469688782" TEXT_SHORTENED="true">
+<node TEXT="メインメニュー(MainMenu)" STYLE_REF="MainMenu" ID="ID_1469688782" CREATED="1455910949125" MODIFIED="1455910949125" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1,2"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -14727,7 +15142,7 @@
</html>
</richcontent>
</node>
-<node TEXT="メニューグループ(MenuGroup)" STYLE_REF="MenuGroupLabel" ID="ID_1698050814" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="メニューグループ(MenuGroup)" STYLE_REF="MenuGroupLabel" ID="ID_1698050814" CREATED="1455910949125" MODIFIED="1455910949125" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14744,7 +15159,7 @@
</node>
</node>
</node>
-<node TEXT="基本用語" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1133619038" HGAP="30" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="基本用語" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1133619038" CREATED="1455910949125" MODIFIED="1455910949125" HGAP_QUANTITY="30.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14770,7 +15185,7 @@
</html>
</richcontent>
<edge STYLE="horizontal"/>
-<node TEXT="ノード" FOLDED="true" ID="ID_1676021072" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ノード" FOLDED="true" ID="ID_1676021072" CREATED="1455910949125" MODIFIED="1455910949125" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14793,7 +15208,10 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
-<node TEXT="ルート/ルートノード" ID="ID_1340270723" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="" ID="ID_555215535" CREATED="1455910949188" MODIFIED="1455910949188">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="ルート/ルートノード" ID="ID_1340270723" CREATED="1455910949125" MODIFIED="1455910949125" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14806,13 +15224,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="親ノード" STYLE_REF="Definition" ID="ID_50690196" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="親ノード" STYLE_REF="Definition" ID="ID_50690196" CREATED="1455910949125" MODIFIED="1455910949125" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14830,7 +15247,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="子ノード" STYLE_REF="Definition" ID="ID_427496140" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="子ノード" STYLE_REF="Definition" ID="ID_427496140" CREATED="1455910949125" MODIFIED="1455910949125" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14848,7 +15265,7 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="兄弟ノード" STYLE_REF="Definition" ID="ID_1766953193" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="兄弟ノード" STYLE_REF="Definition" ID="ID_1766953193" CREATED="1455910949125" MODIFIED="1455910949125" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14866,9 +15283,9 @@
</hook>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="関係表記は親戚用語で" ID="ID_1939948284" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_800293583" CREATED="1455910949188" MODIFIED="1455910949188">
<hook NAME="SummaryNode"/>
-<richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="関係表記は親戚用語で" ID="ID_1939948284" CREATED="1455910949126" MODIFIED="1455910949126" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14887,7 +15304,8 @@
<attribute NAME="Chapter" VALUE="1"/>
</node>
</node>
-<node TEXT="関係" STYLE_REF="Definition" FOLDED="true" ID="ID_1963924039" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="関係" STYLE_REF="Definition" FOLDED="true" ID="ID_1963924039" CREATED="1455910949126" MODIFIED="1455910949126" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -14912,7 +15330,7 @@
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
-<node TEXT="線(エッジ)" STYLE_REF="Definition" FOLDED="true" ID="ID_1789556284"><richcontent TYPE="DETAILS">
+<node TEXT="線(エッジ)" STYLE_REF="Definition" FOLDED="true" ID="ID_1789556284" CREATED="1455910949126" MODIFIED="1455910949126"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14946,7 +15364,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="1"/>
-<node TEXT="枝" STYLE_REF="Definition" ID="ID_659870454"><richcontent TYPE="DETAILS">
+<node TEXT="枝" STYLE_REF="Definition" ID="ID_659870454" CREATED="1455910949126" MODIFIED="1455910949126"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14970,7 +15388,7 @@
</hook>
</node>
</node>
-<node TEXT="コネクタ" STYLE_REF="Definition" ID="ID_1337501519"><richcontent TYPE="DETAILS">
+<node TEXT="コネクタ" STYLE_REF="Definition" ID="ID_1337501519" CREATED="1455910949126" MODIFIED="1455910949126"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -14987,7 +15405,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="雲" STYLE_REF="Definition" ID="ID_1109822175"><richcontent TYPE="DETAILS">
+<node TEXT="雲" STYLE_REF="Definition" ID="ID_1109822175" CREATED="1455910949126" MODIFIED="1455910949126"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -15005,7 +15423,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="まとめノード" STYLE_REF="Definition" ID="ID_1831303797"><richcontent TYPE="DETAILS">
+<node TEXT="まとめノード" STYLE_REF="Definition" ID="ID_1831303797" CREATED="1455910949126" MODIFIED="1455910949126"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -15023,7 +15441,7 @@
</hook>
</node>
</node>
-<node TEXT="ノードの機能" ID="ID_1808675557">
+<node TEXT="ノードの機能" ID="ID_1808675557" CREATED="1455910949127" MODIFIED="1455910949127">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -15047,7 +15465,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードのプロパティ" ID="ID_502368623">
+<node TEXT="ノードのプロパティ" ID="ID_502368623" CREATED="1455910949127" MODIFIED="1455910949127">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
@@ -15080,7 +15498,7 @@
</richcontent>
</node>
</node>
-<node TEXT="章別学習ガイド" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1933523009" HGAP="30" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="章別学習ガイド" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1933523009" CREATED="1455910949127" MODIFIED="1455910949127" HGAP_QUANTITY="30.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15155,11 +15573,11 @@
</richcontent>
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
<edge STYLE="horizontal"/>
-<node TEXT="目次" ID="ID_381308225" HGAP="50" VSHIFT="-10" TEXT_SHORTENED="true">
+<node TEXT="目次" ID="ID_381308225" CREATED="1455910949127" MODIFIED="1455910949127" HGAP_QUANTITY="50.0 px" VSHIFT_QUANTITY="-10.0 px" TEXT_SHORTENED="true">
<font BOLD="true"/>
<edge STYLE="hide_edge"/>
</node>
-<node TEXT="初めてのマインドマップ" FOLDED="true" ID="ID_420753301" NUMBERED="true" TEXT_SHORTENED="true">
+<node TEXT="初めてのマインドマップ" FOLDED="true" ID="ID_420753301" CREATED="1455910949127" MODIFIED="1455910949127" NUMBERED="true" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="0"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -15237,12 +15655,18 @@
</body>
</html>
</richcontent>
-<node TEXT="フィルタルールを定義" FOLDED="true" ID="ID_1560702956" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1743846192" CREATED="1455910949189" MODIFIED="1455910949189">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="フィルタルールを定義" FOLDED="true" ID="ID_1560702956" CREATED="1455910949128" MODIFIED="1455910949128" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="0"/>
-<node STYLE_REF="ProcedureStep" ID="ID_1442970232" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_778433842" CREATED="1455910949188" MODIFIED="1455910949188">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_1442970232" CREATED="1455910949128" MODIFIED="1455910949128" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -15254,9 +15678,9 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
-<hook NAME="FirstGroupNode"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
<html>
@@ -15276,7 +15700,7 @@
</html>
</richcontent>
</node>
-<node STYLE_REF="ProcedureStep" ID="ID_1715867501" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node STYLE_REF="ProcedureStep" ID="ID_1715867501" CREATED="1455910949128" MODIFIED="1455910949128" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -15288,19 +15712,25 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="「1」を選択/入力" STYLE_REF="ProcedureStep" ID="ID_1895233466" TEXT_SHORTENED="true">
+<node TEXT="「1」を選択/入力" STYLE_REF="ProcedureStep" ID="ID_1895233466" CREATED="1455910949128" MODIFIED="1455910949128" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="フィルタバー上の3つの入力フィールド" ID="ID_838435676" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1257022256" CREATED="1455910949189" MODIFIED="1455910949189">
<hook NAME="SummaryNode"/>
+<node TEXT="フィルタバー上の3つの入力フィールド" ID="ID_838435676" CREATED="1455910949128" MODIFIED="1455910949128" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="0"/>
</node>
</node>
-<node TEXT="フィルタ表示" STYLE_REF="Procedure" FOLDED="true" ID="ID_1904217940">
-<node STYLE_REF="ProcedureStep" ID="ID_1155342856" TEXT_SHORTENED="true">
+</node>
+<node TEXT="フィルタ表示" STYLE_REF="Procedure" FOLDED="true" ID="ID_1904217940" CREATED="1455910949128" MODIFIED="1455910949128">
+<node TEXT="" ID="ID_1096215978" CREATED="1455910949189" MODIFIED="1455910949189">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_1155342856" CREATED="1455910949128" MODIFIED="1455910949128" TEXT_SHORTENED="true">
<icon BUILTIN="../apply_quick_filter"/>
<richcontent TYPE="NODE">
@@ -15314,10 +15744,11 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node STYLE_REF="ProcedureStep" ID="ID_1969361758" TEXT_SHORTENED="true">
+<node STYLE_REF="ProcedureStep" ID="ID_1969361758" CREATED="1455910949128" MODIFIED="1455910949128" TEXT_SHORTENED="true">
<icon BUILTIN="../show_ancestors"/>
<richcontent TYPE="NODE">
@@ -15331,20 +15762,23 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="ツールバーのアイコンを参照。" ID="ID_1657145431" TEXT_SHORTENED="true">
-<attribute NAME="Chapter" VALUE="0"/>
+<node TEXT="" ID="ID_1463946528" CREATED="1455910949189" MODIFIED="1455910949189">
<hook NAME="SummaryNode"/>
+<node TEXT="ツールバーのアイコンを参照。" ID="ID_1657145431" CREATED="1455910949129" MODIFIED="1455910949129" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="0"/>
+</node>
</node>
</node>
-<node TEXT="フィルタ条件の初期設定をチェック" FOLDED="true" ID="ID_1208609141" TEXT_SHORTENED="true">
+<node TEXT="フィルタ条件の初期設定をチェック" FOLDED="true" ID="ID_1208609141" CREATED="1455910949129" MODIFIED="1455910949129" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="0"/>
-<node STYLE_REF="ProcedureStep" ID="ID_1666861042" TEXT_SHORTENED="true">
+<node STYLE_REF="ProcedureStep" ID="ID_1666861042" CREATED="1455910949129" MODIFIED="1455910949129" TEXT_SHORTENED="true">
<icon BUILTIN="../show_descendants"/>
<richcontent TYPE="NODE">
@@ -15358,10 +15792,11 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node STYLE_REF="ProcedureStep" ID="ID_479968616" TEXT_SHORTENED="true">
+<node STYLE_REF="ProcedureStep" ID="ID_479968616" CREATED="1455910949129" MODIFIED="1455910949129" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_filtered_ancestors"/>
<richcontent TYPE="NODE">
@@ -15375,10 +15810,11 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node STYLE_REF="ProcedureStep" ID="ID_994463798" TEXT_SHORTENED="true">
+<node STYLE_REF="ProcedureStep" ID="ID_994463798" CREATED="1455910949130" MODIFIED="1455910949130" TEXT_SHORTENED="true">
<icon BUILTIN="../applies_to_filtered_nodes"/>
<richcontent TYPE="NODE">
@@ -15392,15 +15828,18 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
</node>
-<node TEXT="ツールバーのアイコンボタンを参照" ID="ID_1864246990" TEXT_SHORTENED="true">
-<attribute NAME="Chapter" VALUE="0"/>
+<node TEXT="" ID="ID_1694204095" CREATED="1455910949189" MODIFIED="1455910949189">
<hook NAME="SummaryNode"/>
+<node TEXT="ツールバーのアイコンボタンを参照" ID="ID_1864246990" CREATED="1455910949130" MODIFIED="1455910949130" TEXT_SHORTENED="true">
+<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node FOLDED="true" ID="ID_1748243017" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+</node>
+<node FOLDED="true" ID="ID_1748243017" CREATED="1455910949130" MODIFIED="1455910949130" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -15412,13 +15851,14 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="1"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<edge STYLE="horizontal"/>
-<node STYLE_REF="ProcedureStep" ID="ID_1282843229" TEXT_SHORTENED="true">
+<node STYLE_REF="ProcedureStep" ID="ID_1282843229" CREATED="1455910949130" MODIFIED="1455910949130" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_filtering"/>
<richcontent TYPE="NODE">
@@ -15432,10 +15872,14 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node STYLE_REF="ProcedureStep" ID="ID_1072388476" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_1678485240" CREATED="1455910949189" MODIFIED="1455910949189">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_1072388476" CREATED="1455910949130" MODIFIED="1455910949130" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -15447,11 +15891,11 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="FirstGroupNode"/>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node STYLE_REF="ProcedureStep" ID="ID_903301760" TEXT_SHORTENED="true">
+<node STYLE_REF="ProcedureStep" ID="ID_903301760" CREATED="1455910949131" MODIFIED="1455910949131" TEXT_SHORTENED="true">
<icon BUILTIN="../fold_all"/>
<richcontent TYPE="NODE">
@@ -15465,16 +15909,19 @@
</p>
</body>
</html>
+
</richcontent>
<attribute NAME="Chapter" VALUE="1"/>
</node>
-<node TEXT="すべてのノードを折り畳む" ID="ID_1661316242" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_170912735" CREATED="1455910949189" MODIFIED="1455910949189">
<hook NAME="SummaryNode"/>
+<node TEXT="すべてのノードを折り畳む" ID="ID_1661316242" CREATED="1455910949131" MODIFIED="1455910949131" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="1"/>
</node>
</node>
</node>
-<node TEXT="ノードを操作" ID="ID_1864348201" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="ノードを操作" ID="ID_1864348201" CREATED="1455910949131" MODIFIED="1455910949131" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15509,7 +15956,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="ノードの機能" ID="ID_1896982231" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ノードの機能" ID="ID_1896982231" CREATED="1455910949131" MODIFIED="1455910949131" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15535,7 +15982,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="書式とスタイル" ID="ID_247370880" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="書式とスタイル" ID="ID_247370880" CREATED="1455910949131" MODIFIED="1455910949131" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15561,7 +16008,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="日付、時刻、リマインダ" ID="ID_1279850712" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="日付、時刻、リマインダ" ID="ID_1279850712" CREATED="1455910949131" MODIFIED="1455910949131" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15587,7 +16034,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="ノードの移動とマップの公開" ID="ID_691709596" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ノードの移動とマップの公開" ID="ID_691709596" CREATED="1455910949131" MODIFIED="1455910949131" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15613,7 +16060,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="スクリプトと計算式" ID="ID_444100909" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="スクリプトと計算式" ID="ID_444100909" CREATED="1455910949131" MODIFIED="1455910949131" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15639,7 +16086,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="セキュリティと環境設定" ID="ID_1261425134" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="セキュリティと環境設定" ID="ID_1261425134" CREATED="1455910949131" MODIFIED="1455910949131" NUMBERED="true" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15665,7 +16112,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0"/>
</node>
-<node TEXT="9 検索とフィルタ表示" ID="ID_1941664006" TEXT_SHORTENED="true">
+<node TEXT="9 検索とフィルタ表示" ID="ID_1941664006" CREATED="1455910949132" MODIFIED="1455910949132" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="9"/>
<richcontent TYPE="DETAILS" HIDDEN="true">
@@ -15692,8 +16139,8 @@
</html>
</richcontent>
</node>
-<node TEXT="付録" STYLE_REF="UserGuide" FOLDED="true" ID="ID_773333938" TEXT_SHORTENED="true">
-<node TEXT="すべての定義(definition)を表示" FOLDED="true" ID="ID_137485117" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="付録" STYLE_REF="UserGuide" FOLDED="true" ID="ID_773333938" CREATED="1455910949132" MODIFIED="1455910949132" TEXT_SHORTENED="true">
+<node TEXT="すべての定義(definition)を表示" FOLDED="true" ID="ID_137485117" CREATED="1455910949132" MODIFIED="1455910949132" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -15728,7 +16175,7 @@
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="条件をチェック" STYLE_REF="UserGuide" FOLDED="true" ID="ID_925717472" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="条件をチェック" STYLE_REF="UserGuide" FOLDED="true" ID="ID_925717472" CREATED="1455910949132" MODIFIED="1455910949132" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -15741,22 +16188,21 @@
</body>
</html>
</richcontent>
-<node TEXT="「上位ノードも表示」を無効に" STYLE_REF="ProcedureStep" ID="ID_558856858" TEXT_SHORTENED="true">
+<node TEXT="「上位ノードも表示」を無効に" STYLE_REF="ProcedureStep" ID="ID_558856858" CREATED="1455910949132" MODIFIED="1455910949132" TEXT_SHORTENED="true">
<icon BUILTIN="../show_ancestors"/>
-<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="「下位ノードも表示」を無効に" STYLE_REF="ProcedureStep" ID="ID_1230042883" TEXT_SHORTENED="true">
+<node TEXT="「下位ノードも表示」を無効に" STYLE_REF="ProcedureStep" ID="ID_1230042883" CREATED="1455910949132" MODIFIED="1455910949132" TEXT_SHORTENED="true">
<icon BUILTIN="../show_descendants"/>
</node>
-<node TEXT="「非表示のノードを展開」を無効に" STYLE_REF="ProcedureStep" ID="ID_1360058790" TEXT_SHORTENED="true">
+<node TEXT="「非表示のノードを展開」を無効に" STYLE_REF="ProcedureStep" ID="ID_1360058790" CREATED="1455910949133" MODIFIED="1455910949133" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_filtered_ancestors"/>
</node>
-<node TEXT="「フィルタ中のノードに適用」を無効に" STYLE_REF="ProcedureStep" ID="ID_135928948" TEXT_SHORTENED="true">
+<node TEXT="「フィルタ中のノードに適用」を無効に" STYLE_REF="ProcedureStep" ID="ID_135928948" CREATED="1455910949133" MODIFIED="1455910949133" TEXT_SHORTENED="true">
<icon BUILTIN="../applies_to_filtered_nodes"/>
</node>
</node>
-<node TEXT="すべて(のノードを)展開" STYLE_REF="UserGuide" FOLDED="true" ID="ID_135686189" TEXT_SHORTENED="true">
-<node ID="ID_1652334229" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="すべて(のノードを)展開" STYLE_REF="UserGuide" FOLDED="true" ID="ID_135686189" CREATED="1455910949133" MODIFIED="1455910949133" TEXT_SHORTENED="true">
+<node ID="ID_1652334229" CREATED="1455910949133" MODIFIED="1455910949133" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -15768,10 +16214,10 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node ID="ID_1437799222" TEXT_SHORTENED="true">
+<node ID="ID_1437799222" CREATED="1455910949133" MODIFIED="1455910949133" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_all"/>
<richcontent TYPE="NODE">
@@ -15785,11 +16231,12 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="フィルタを定義" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1157448205" TEXT_SHORTENED="true">
-<node ID="ID_296337141" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="フィルタを定義" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1157448205" CREATED="1455910949134" MODIFIED="1455910949134" TEXT_SHORTENED="true">
+<node ID="ID_296337141" CREATED="1455910949134" MODIFIED="1455910949134" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -15801,10 +16248,10 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node ID="ID_1232714581" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1232714581" CREATED="1455910949134" MODIFIED="1455910949134" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -15816,9 +16263,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1783341782" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1783341782" CREATED="1455910949134" MODIFIED="1455910949134" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -15830,9 +16278,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1492821244" TEXT_SHORTENED="true">
+<node ID="ID_1492821244" CREATED="1455910949134" MODIFIED="1455910949134" TEXT_SHORTENED="true">
<icon BUILTIN="../apply_quick_filter"/>
<richcontent TYPE="NODE">
@@ -15846,11 +16295,12 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="終えるには" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1869718411" TEXT_SHORTENED="true">
-<node ID="ID_1896767397" TEXT_SHORTENED="true">
+<node TEXT="終えるには" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1869718411" CREATED="1455910949134" MODIFIED="1455910949134" TEXT_SHORTENED="true">
+<node ID="ID_1896767397" CREATED="1455910949134" MODIFIED="1455910949134" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_filtering"/>
<richcontent TYPE="NODE">
@@ -15864,9 +16314,13 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node STYLE_REF="ProcedureStep" ID="ID_1535041398" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_1702071190" CREATED="1455910949189" MODIFIED="1455910949189">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node STYLE_REF="ProcedureStep" ID="ID_1535041398" CREATED="1455910949134" MODIFIED="1455910949134" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -15878,10 +16332,10 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node STYLE_REF="ProcedureStep" ID="ID_253518936" TEXT_SHORTENED="true">
+<node STYLE_REF="ProcedureStep" ID="ID_253518936" CREATED="1455910949135" MODIFIED="1455910949135" TEXT_SHORTENED="true">
<icon BUILTIN="../fold_all"/>
<richcontent TYPE="NODE">
@@ -15895,14 +16349,16 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="すべてのノードを折り畳む" ID="ID_1018925528" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1504036237" CREATED="1455910949189" MODIFIED="1455910949189">
<hook NAME="SummaryNode"/>
+<node TEXT="すべてのノードを折り畳む" ID="ID_1018925528" CREATED="1455910949135" MODIFIED="1455910949135" TEXT_SHORTENED="true"/>
</node>
</node>
</node>
-<node TEXT="フィルタ表示に関する完全説明" FOLDED="true" ID="ID_172327975" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="フィルタ表示に関する完全説明" FOLDED="true" ID="ID_172327975" CREATED="1455910949135" MODIFIED="1455910949135" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -15961,13 +16417,12 @@
</body>
</html>
</richcontent>
-<hook NAME="FirstGroupNode"/>
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
<attribute NAME="Chapter" VALUE="2"/>
-<node TEXT="条件をチェック" STYLE_REF="UserGuide" FOLDED="true" ID="ID_169467877" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="条件をチェック" STYLE_REF="UserGuide" FOLDED="true" ID="ID_169467877" CREATED="1455910949135" MODIFIED="1455910949135" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -15980,7 +16435,7 @@
</body>
</html>
</richcontent>
-<node ID="ID_597594722" TEXT_SHORTENED="true">
+<node ID="ID_597594722" CREATED="1455910949135" MODIFIED="1455910949135" TEXT_SHORTENED="true">
<icon BUILTIN="../show_ancestors"/>
<richcontent TYPE="NODE">
@@ -15994,10 +16449,10 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node ID="ID_186774997" TEXT_SHORTENED="true">
+<node ID="ID_186774997" CREATED="1455910949136" MODIFIED="1455910949136" TEXT_SHORTENED="true">
<icon BUILTIN="../show_descendants"/>
<richcontent TYPE="NODE">
@@ -16011,9 +16466,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1079412775" TEXT_SHORTENED="true">
+<node ID="ID_1079412775" CREATED="1455910949136" MODIFIED="1455910949136" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_filtered_ancestors"/>
<richcontent TYPE="NODE">
@@ -16027,9 +16483,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_1827735442" TEXT_SHORTENED="true">
+<node ID="ID_1827735442" CREATED="1455910949136" MODIFIED="1455910949136" TEXT_SHORTENED="true">
<icon BUILTIN="../applies_to_filtered_nodes"/>
<richcontent TYPE="NODE">
@@ -16043,11 +16500,12 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="すべて(のノードを)展開" STYLE_REF="UserGuide" FOLDED="true" ID="ID_377020575" TEXT_SHORTENED="true">
-<node ID="ID_1460295626" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="すべて(のノードを)展開" STYLE_REF="UserGuide" FOLDED="true" ID="ID_377020575" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true">
+<node ID="ID_1460295626" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -16059,10 +16517,10 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node ID="ID_1445171717" TEXT_SHORTENED="true">
+<node ID="ID_1445171717" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true">
<icon BUILTIN="../unfold_all"/>
<richcontent TYPE="NODE">
@@ -16076,11 +16534,12 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="フィルタルールを定義" STYLE_REF="UserGuide" FOLDED="true" ID="ID_6260706" TEXT_SHORTENED="true">
-<node ID="ID_167264124" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="フィルタルールを定義" STYLE_REF="UserGuide" FOLDED="true" ID="ID_6260706" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true">
+<node ID="ID_167264124" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -16092,10 +16551,10 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node ID="ID_1867972368" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_1867972368" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -16107,9 +16566,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_909882711" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node ID="ID_909882711" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -16121,9 +16581,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_676302966" TEXT_SHORTENED="true">
+<node ID="ID_676302966" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true">
<icon BUILTIN="../apply_quick_filter"/>
<richcontent TYPE="NODE">
@@ -16137,11 +16598,12 @@
</p>
</body>
</html>
+
</richcontent>
</node>
</node>
-<node TEXT="終えるには" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1473535137" TEXT_SHORTENED="true">
-<node ID="ID_413785084" TEXT_SHORTENED="true">
+<node TEXT="終えるには" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1473535137" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true">
+<node ID="ID_413785084" CREATED="1455910949137" MODIFIED="1455910949137" TEXT_SHORTENED="true">
<icon BUILTIN="../remove_filtering"/>
<richcontent TYPE="NODE">
@@ -16155,9 +16617,13 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node ID="ID_378729960" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node TEXT="" ID="ID_1733149256" CREATED="1455910949190" MODIFIED="1455910949190">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node ID="ID_378729960" CREATED="1455910949138" MODIFIED="1455910949138" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -16169,10 +16635,10 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="FirstGroupNode"/>
</node>
-<node ID="ID_1457654479" TEXT_SHORTENED="true">
+<node ID="ID_1457654479" CREATED="1455910949138" MODIFIED="1455910949138" TEXT_SHORTENED="true">
<icon BUILTIN="../fold_all"/>
<richcontent TYPE="NODE">
@@ -16186,18 +16652,20 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="すべてのノードを折り畳む" ID="ID_309050985" TEXT_SHORTENED="true">
+<node TEXT="" ID="ID_1405414422" CREATED="1455910949190" MODIFIED="1455910949190">
<hook NAME="SummaryNode"/>
+<node TEXT="すべてのノードを折り畳む" ID="ID_309050985" CREATED="1455910949138" MODIFIED="1455910949138" TEXT_SHORTENED="true"/>
</node>
</node>
</node>
</node>
</node>
-<node TEXT="インストール" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1367092560" HGAP="31" VSHIFT="2" TEXT_SHORTENED="true">
+<node TEXT="インストール" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1367092560" CREATED="1455910949138" MODIFIED="1455910949138" HGAP_QUANTITY="31.0 px" VSHIFT_QUANTITY="2.0 px" TEXT_SHORTENED="true">
<edge STYLE="horizontal"/>
-<node TEXT="ダウンロード" ID="ID_1964917961" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="ダウンロード" ID="ID_1964917961" CREATED="1455910949138" MODIFIED="1455910949138" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -16210,10 +16678,13 @@
</body>
</html>
</richcontent>
-<node TEXT="Freeplane のホームページ" ID="ID_916980386" LINK="http://freeplane.sourceforge.net">
+<node TEXT="" ID="ID_71930303" CREATED="1455910949190" MODIFIED="1455910949190">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Freeplane のホームページ" ID="ID_916980386" CREATED="1455910949138" MODIFIED="1455910949138" LINK="http://freeplane.sourceforge.net">
<font NAME="SansSerif" SIZE="8"/>
</node>
-<node TEXT="Windows プラットホーム" STYLE_REF="Functiegroep" FOLDED="true" ID="ID_1136283844" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Windows プラットホーム" STYLE_REF="Functiegroep" FOLDED="true" ID="ID_1136283844" CREATED="1455910949138" MODIFIED="1455910949138" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16226,7 +16697,7 @@
</body>
</html>
</richcontent>
-<node TEXT=" Java Runtime Environment ( J2RE1.5以降)をダウンロード" FOLDED="true" ID="ID_1977713840" TEXT_SHORTENED="true">
+<node TEXT=" Java Runtime Environment ( J2RE1.5以降)をダウンロード" FOLDED="true" ID="ID_1977713840" CREATED="1455910949138" MODIFIED="1455910949138" TEXT_SHORTENED="true">
<icon BUILTIN="full-1"/>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="10"/>
@@ -16243,10 +16714,10 @@
</body>
</html>
</richcontent>
-<node TEXT="サン・マイクロシステムズ株式会社のJREダウンロードサイト(日本語)から" ID="ID_522870849" LINK="http://www.java.com/ja/download/" TEXT_SHORTENED="true"/>
-<node TEXT="Java SE Downloads - Sun Developer Network (英語)から" ID="ID_972525405" LINK="http://java.sun.com/javase/downloads/index.jsp" TEXT_SHORTENED="true"/>
+<node TEXT="サン・マイクロシステムズ株式会社のJREダウンロードサイト(日本語)から" ID="ID_522870849" CREATED="1455910949139" MODIFIED="1455910949139" LINK="http://www.java.com/ja/download/" TEXT_SHORTENED="true"/>
+<node TEXT="Java SE Downloads - Sun Developer Network (英語)から" ID="ID_972525405" CREATED="1455910949139" MODIFIED="1455910949139" LINK="http://java.sun.com/javase/downloads/index.jsp" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="Freeplane のアプリケーションをダウンロード" FOLDED="true" ID="ID_1388419354" TEXT_SHORTENED="true">
+<node TEXT="Freeplane のアプリケーションをダウンロード" FOLDED="true" ID="ID_1388419354" CREATED="1455910949139" MODIFIED="1455910949139" TEXT_SHORTENED="true">
<icon BUILTIN="full-2"/>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="10"/>
@@ -16263,17 +16734,17 @@
</body>
</html>
</richcontent>
-<node TEXT="Freeplane のホームページ(英語)から" ID="ID_1482343480" LINK="http://freeplane.sourceforge.net" TEXT_SHORTENED="true">
+<node TEXT="Freeplane のホームページ(英語)から" ID="ID_1482343480" CREATED="1455910949139" MODIFIED="1455910949139" LINK="http://freeplane.sourceforge.net" TEXT_SHORTENED="true">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="10"/>
</node>
-<node TEXT="SourceForge.JPの DL ページ(日本語)から" ID="ID_1895098904" LINK="http://sourceforge.jp/projects/sfnet_freeplane/" TEXT_SHORTENED="true"/>
+<node TEXT="SourceForge.JPの DL ページ(日本語)から" ID="ID_1895098904" CREATED="1455910949139" MODIFIED="1455910949139" LINK="http://sourceforge.jp/projects/sfnet_freeplane/" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="スペルチェック用の辞書をインストール" ID="ID_1368535250" TEXT_SHORTENED="true">
+<node TEXT="スペルチェック用の辞書をインストール" ID="ID_1368535250" CREATED="1455910949139" MODIFIED="1455910949139" TEXT_SHORTENED="true">
<icon BUILTIN="full-3"/>
</node>
</node>
-<node TEXT="Linux プラットホーム" STYLE_REF="Functiegroep" ID="ID_223844455" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Linux プラットホーム" STYLE_REF="Functiegroep" ID="ID_223844455" CREATED="1455910949139" MODIFIED="1455910949139" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16287,8 +16758,8 @@
</html>
</richcontent>
</node>
-<node TEXT="Ubuntu" ID="ID_461043347"/>
-<node TEXT=" MAC プラットホーム" STYLE_REF="Functiegroep" ID="ID_824405171" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Ubuntu" ID="ID_461043347" CREATED="1455910949139" MODIFIED="1455910949139"/>
+<node TEXT=" MAC プラットホーム" STYLE_REF="Functiegroep" ID="ID_824405171" CREATED="1455910949139" MODIFIED="1455910949139" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16302,8 +16773,10 @@
</html>
</richcontent>
</node>
-<node TEXT="ポータブル Freeplane" ID="ID_672630297" TEXT_SHORTENED="true"/>
-<node ID="ID_797098004"><richcontent TYPE="NODE">
+<node TEXT="ポータブル Freeplane" ID="ID_672630297" CREATED="1455910949139" MODIFIED="1455910949139" TEXT_SHORTENED="true"/>
+<node TEXT="" ID="ID_1816445103" CREATED="1455910949190" MODIFIED="1455910949190">
+<hook NAME="SummaryNode"/>
+<node ID="ID_797098004" CREATED="1455910949139" MODIFIED="1455910949139"><richcontent TYPE="NODE">
<html>
<head>
@@ -16315,11 +16788,12 @@
</p>
</body>
</html>
+
</richcontent>
-<hook NAME="SummaryNode"/>
</node>
</node>
-<node TEXT="インストール" FOLDED="true" ID="ID_653448739" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+</node>
+<node TEXT="インストール" FOLDED="true" ID="ID_653448739" CREATED="1455910949139" MODIFIED="1455910949139" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -16337,7 +16811,7 @@
</body>
</html>
</richcontent>
-<node TEXT="システム表示言語" FOLDED="true" ID="ID_1505415448" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="システム表示言語" FOLDED="true" ID="ID_1505415448" CREATED="1455910949139" MODIFIED="1455910949139" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16369,7 +16843,7 @@
</body>
</html>
</richcontent>
-<node TEXT="日本語使用時の注意事項" ID="ID_1720635001">
+<node TEXT="日本語使用時の注意事項" ID="ID_1720635001" CREATED="1455910949139" MODIFIED="1455910949139">
<icon BUILTIN="info"/>
<richcontent TYPE="DETAILS">
@@ -16390,7 +16864,7 @@
<hook NAME="accessories/plugins/BlinkingNodeHook.properties"/>
</node>
</node>
-<node TEXT="スペルチェック用の辞書" STYLE_REF="Professional" FOLDED="true" ID="ID_336105958" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="スペルチェック用の辞書" STYLE_REF="Professional" FOLDED="true" ID="ID_336105958" CREATED="1455910949140" MODIFIED="1455910949140" LINK="http://sourceforge.net/projects/freeplane/files/spell_check_dictionaries" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16406,7 +16880,7 @@
</body>
</html>
</richcontent>
-<node TEXT="アドオン" ID="ID_1531090414" HGAP="16" VSHIFT="-4"><richcontent TYPE="DETAILS">
+<node TEXT="アドオン" ID="ID_1531090414" CREATED="1455910949140" MODIFIED="1455910949140" HGAP_QUANTITY="16.0 px" VSHIFT_QUANTITY="-4.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16421,7 +16895,7 @@
</richcontent>
</node>
</node>
-<node TEXT="自動バックアップ" ID="ID_53546807" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="自動バックアップ" ID="ID_53546807" CREATED="1455910949140" MODIFIED="1455910949140" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16453,7 +16927,7 @@
</html>
</richcontent>
</node>
-<node TEXT="Windows 7 で *.MM インデックスを設定" ID="ID_1978530827" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="Windows 7 で *.MM インデックスを設定" ID="ID_1978530827" CREATED="1455910949141" MODIFIED="1455910949141" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16501,7 +16975,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ユーザ指定システムアイコン" ID="ID_5170948" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ユーザ指定システムアイコン" ID="ID_5170948" CREATED="1455910949141" MODIFIED="1455910949141" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16557,7 +17031,7 @@
</node>
</node>
</node>
-<node TEXT="Macintosh" STYLE_REF="UserGuide" ID="ID_426952510" HGAP="30" VSHIFT="9" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="Macintosh" STYLE_REF="UserGuide" ID="ID_426952510" CREATED="1455910949141" MODIFIED="1455910949141" HGAP_QUANTITY="30.0 px" VSHIFT_QUANTITY="9.0 px" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -16646,9 +17120,9 @@
</richcontent>
<edge STYLE="horizontal"/>
</node>
-<node TEXT="この文書について" STYLE_REF="UserGuide" FOLDED="true" ID="ID_112557731" HGAP="32" VSHIFT="4" TEXT_SHORTENED="true">
+<node TEXT="この文書について" STYLE_REF="UserGuide" FOLDED="true" ID="ID_112557731" CREATED="1455910949142" MODIFIED="1455910949142" HGAP_QUANTITY="32.0 px" VSHIFT_QUANTITY="4.0 px" TEXT_SHORTENED="true">
<edge STYLE="horizontal"/>
-<node FOLDED="true" ID="ID_7136454" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
+<node FOLDED="true" ID="ID_7136454" CREATED="1455910949142" MODIFIED="1455910949142" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -16660,11 +17134,12 @@
</p>
</body>
</html>
+
</richcontent>
-<node TEXT="デザイン原則を活用" FOLDED="true" ID="ID_1451437324" TEXT_SHORTENED="true">
-<node TEXT="使いやすく" FOLDED="true" ID="ID_292534096" TEXT_SHORTENED="true">
-<node TEXT="教養はあるが非専門家を対象に" FOLDED="true" ID="ID_923262609" TEXT_SHORTENED="true">
-<node TEXT="視覚効果を限定使用" ID="ID_279740634" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="デザイン原則を活用" FOLDED="true" ID="ID_1451437324" CREATED="1455910949142" MODIFIED="1455910949142" TEXT_SHORTENED="true">
+<node TEXT="使いやすく" FOLDED="true" ID="ID_292534096" CREATED="1455910949142" MODIFIED="1455910949142" TEXT_SHORTENED="true">
+<node TEXT="教養はあるが非専門家を対象に" FOLDED="true" ID="ID_923262609" CREATED="1455910949142" MODIFIED="1455910949142" TEXT_SHORTENED="true">
+<node TEXT="視覚効果を限定使用" ID="ID_279740634" CREATED="1455910949142" MODIFIED="1455910949142" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -16684,7 +17159,7 @@
</richcontent>
</node>
</node>
-<node TEXT="目的に即した範囲を表示" FOLDED="true" ID="ID_514607477" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="目的に即した範囲を表示" FOLDED="true" ID="ID_514607477" CREATED="1455910949142" MODIFIED="1455910949142" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -16697,28 +17172,29 @@
</body>
</html>
</richcontent>
-<node TEXT="所定の条件によるフィルタ表示" ID="ID_1046642159" TEXT_SHORTENED="true"/>
+<node TEXT="所定の条件によるフィルタ表示" ID="ID_1046642159" CREATED="1455910949142" MODIFIED="1455910949142" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="内容の基本分類" FOLDED="true" ID="ID_1725581120" TEXT_SHORTENED="true">
-<node TEXT="読み方ガイド" ID="ID_145610934" TEXT_SHORTENED="true"/>
-<node TEXT="定義" ID="ID_1502862380" TEXT_SHORTENED="true"/>
-<node TEXT="機能" ID="ID_1725711443" TEXT_SHORTENED="true"/>
-<node TEXT="詳しい説明" ID="ID_262006618" TEXT_SHORTENED="true"/>
-<node TEXT="例外" ID="ID_1347820096" TEXT_SHORTENED="true"/>
-<node TEXT="用例" ID="ID_1439427592" TEXT_SHORTENED="true"/>
+<node TEXT="内容の基本分類" FOLDED="true" ID="ID_1725581120" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true">
+<node TEXT="読み方ガイド" ID="ID_145610934" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true"/>
+<node TEXT="定義" ID="ID_1502862380" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true"/>
+<node TEXT="機能" ID="ID_1725711443" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true"/>
+<node TEXT="詳しい説明" ID="ID_262006618" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true"/>
+<node TEXT="例外" ID="ID_1347820096" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true"/>
+<node TEXT="用例" ID="ID_1439427592" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="Standard use of node elements" FOLDED="true" ID="ID_1585389386">
-<node TEXT="core: title/name" ID="ID_1920924045" TEXT_SHORTENED="true">
-<hook NAME="FirstGroupNode"/>
+<node TEXT="Standard use of node elements" FOLDED="true" ID="ID_1585389386" CREATED="1455910949143" MODIFIED="1455910949143">
+<node TEXT="core: title/name" ID="ID_1920924045" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true"/>
+<node TEXT="details: what/how to" ID="ID_715096689" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="details: what/how to" ID="ID_715096689" TEXT_SHORTENED="true"/>
+<node TEXT="ノード要素の標準的な使用法" FOLDED="true" ID="ID_663045918" CREATED="1455910949143" MODIFIED="1455910949143">
+<node TEXT="" ID="ID_239846012" CREATED="1455910949190" MODIFIED="1455910949190">
+<hook NAME="FirstGroupNode"/>
</node>
-<node TEXT="ノード要素の標準的な使用法" FOLDED="true" ID="ID_663045918">
-<node TEXT="ノードコア:見出し/名称" ID="ID_1819352209"/>
-<node TEXT="詳細:意味/使用法の説明" ID="ID_1589052099"/>
-<node TEXT="理論的説明" ID="ID_798222829" TEXT_SHORTENED="true">
+<node TEXT="ノードコア:見出し/名称" ID="ID_1819352209" CREATED="1455910949143" MODIFIED="1455910949143"/>
+<node TEXT="詳細:意味/使用法の説明" ID="ID_1589052099" CREATED="1455910949143" MODIFIED="1455910949143"/>
+<node TEXT="" ID="ID_143470144" CREATED="1455910949190" MODIFIED="1455910949190">
<hook NAME="SummaryNode"/>
-<richcontent TYPE="DETAILS">
+<node TEXT="理論的説明" ID="ID_798222829" CREATED="1455910949143" MODIFIED="1455910949143" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16744,21 +17220,22 @@
</richcontent>
</node>
</node>
-<node TEXT="標準的な形" FOLDED="true" ID="ID_173847860" TEXT_SHORTENED="true">
-<node TEXT="スタイル" ID="ID_636140553" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="操作の簡便化" FOLDED="true" ID="ID_1975789949" TEXT_SHORTENED="true">
-<node TEXT="スクリプト" ID="ID_1538209739" TEXT_SHORTENED="true"/>
+<node TEXT="標準的な形" FOLDED="true" ID="ID_173847860" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true">
+<node TEXT="スタイル" ID="ID_636140553" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true"/>
+</node>
+<node TEXT="操作の簡便化" FOLDED="true" ID="ID_1975789949" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true">
+<node TEXT="スクリプト" ID="ID_1538209739" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true"/>
</node>
</node>
-<node TEXT="簡単にメンテナンス" FOLDED="true" ID="ID_252044006" TEXT_SHORTENED="true">
-<node TEXT="メインメニューの階層構造に沿って" ID="ID_1374985285" TEXT_SHORTENED="true"/>
-<node TEXT="内容の定義は一度で、繰り返し使用" ID="ID_1307240893" TEXT_SHORTENED="true"/>
-<node TEXT="条件対応スタイルを使用" ID="ID_1001809150" TEXT_SHORTENED="true"/>
+<node TEXT="簡単にメンテナンス" FOLDED="true" ID="ID_252044006" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true">
+<node TEXT="メインメニューの階層構造に沿って" ID="ID_1374985285" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true"/>
+<node TEXT="内容の定義は一度で、繰り返し使用" ID="ID_1307240893" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true"/>
+<node TEXT="条件対応スタイルを使用" ID="ID_1001809150" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true"/>
</node>
</node>
-<node TEXT="真っさらなマインドマップを用意" FOLDED="true" ID="ID_1571541949" TEXT_SHORTENED="true">
-<node TEXT="「線の色を自動選択」機能を無効に" ID="ID_1087840240" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="真っさらなマインドマップを用意" FOLDED="true" ID="ID_1571541949" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true">
+<node TEXT="「線の色を自動選択」機能を無効に" ID="ID_1087840240" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -16774,7 +17251,7 @@
</html>
</richcontent>
</node>
-<node TEXT="属性を非表示に" ID="ID_1495523505" TEXT_SHORTENED="true" HGAP="12" VSHIFT="8"><richcontent TYPE="DETAILS">
+<node TEXT="属性を非表示に" ID="ID_1495523505" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true" HGAP_QUANTITY="12.0 px" VSHIFT_QUANTITY="8.0 px"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16790,7 +17267,7 @@
</html>
</richcontent>
</node>
-<node TEXT="属性付きアイコンを非表示に" ID="ID_1937953602" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="属性付きアイコンを非表示に" ID="ID_1937953602" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16807,10 +17284,10 @@
</richcontent>
</node>
</node>
-<node TEXT="カテゴリーを定義" FOLDED="true" ID="ID_1469202418" TEXT_SHORTENED="true">
-<node TEXT="内容" FOLDED="true" ID="ID_1858268976" TEXT_SHORTENED="true">
-<node TEXT="定義" ID="ID_1431706200"/>
-<node TEXT="機能" ID="ID_998609287"><richcontent TYPE="DETAILS">
+<node TEXT="カテゴリーを定義" FOLDED="true" ID="ID_1469202418" CREATED="1455910949145" MODIFIED="1455910949145" TEXT_SHORTENED="true">
+<node TEXT="内容" FOLDED="true" ID="ID_1858268976" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true">
+<node TEXT="定義" ID="ID_1431706200" CREATED="1455910949146" MODIFIED="1455910949146"/>
+<node TEXT="機能" ID="ID_998609287" CREATED="1455910949146" MODIFIED="1455910949146"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16824,7 +17301,7 @@
</html>
</richcontent>
</node>
-<node TEXT="手順" ID="ID_153521049"><richcontent TYPE="DETAILS">
+<node TEXT="手順" ID="ID_153521049" CREATED="1455910949146" MODIFIED="1455910949146"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16838,7 +17315,7 @@
</html>
</richcontent>
</node>
-<node TEXT="オプション値" ID="ID_1289169912"><richcontent TYPE="DETAILS">
+<node TEXT="オプション値" ID="ID_1289169912" CREATED="1455910949146" MODIFIED="1455910949146"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16852,7 +17329,7 @@
</html>
</richcontent>
</node>
-<node TEXT="例外" ID="ID_251764436"><richcontent TYPE="DETAILS">
+<node TEXT="例外" ID="ID_251764436" CREATED="1455910949146" MODIFIED="1455910949146"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16866,7 +17343,7 @@
</html>
</richcontent>
</node>
-<node TEXT="詳しい説明" ID="ID_736889881"><richcontent TYPE="DETAILS">
+<node TEXT="詳しい説明" ID="ID_736889881" CREATED="1455910949146" MODIFIED="1455910949146"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16880,19 +17357,19 @@
</html>
</richcontent>
</node>
-<node TEXT="用例" ID="ID_735271488"/>
-<node TEXT="留意事項" ID="ID_579539049"/>
+<node TEXT="用例" ID="ID_735271488" CREATED="1455910949146" MODIFIED="1455910949146"/>
+<node TEXT="留意事項" ID="ID_579539049" CREATED="1455910949146" MODIFIED="1455910949146"/>
</node>
-<node TEXT="構造" FOLDED="true" ID="ID_1009362787" TEXT_SHORTENED="true">
-<node TEXT="見出し" ID="ID_1941537914" TEXT_SHORTENED="true"/>
-<node TEXT="メインメニュー" ID="ID_887218713" TEXT_SHORTENED="true"/>
-<node TEXT="サブメニュー" ID="ID_1273252152" TEXT_SHORTENED="true"/>
-<node TEXT="メインメニューグループのラベル" ID="ID_1032729870" TEXT_SHORTENED="true"/>
+<node TEXT="構造" FOLDED="true" ID="ID_1009362787" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true">
+<node TEXT="見出し" ID="ID_1941537914" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true"/>
+<node TEXT="メインメニュー" ID="ID_887218713" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true"/>
+<node TEXT="サブメニュー" ID="ID_1273252152" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true"/>
+<node TEXT="メインメニューグループのラベル" ID="ID_1032729870" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="更新" ID="ID_1381557619"/>
+<node TEXT="更新" ID="ID_1381557619" CREATED="1455910949146" MODIFIED="1455910949146"/>
</node>
-<node TEXT="章を定義" FOLDED="true" ID="ID_651974088" TEXT_SHORTENED="true">
-<node TEXT="目標" ID="ID_239426432" TEXT_SHORTENED="true">
+<node TEXT="章を定義" FOLDED="true" ID="ID_651974088" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true">
+<node TEXT="目標" ID="ID_239426432" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true">
<icon BUILTIN="full-0"/>
<richcontent TYPE="DETAILS">
@@ -16909,7 +17386,7 @@
</richcontent>
<attribute NAME="Chapter" VALUE="0" OBJECT="org.freeplane.features.format.FormattedNumber|0"/>
</node>
-<node TEXT="第1章 初めてのマインドマップ" ID="ID_52333658" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="第1章 初めてのマインドマップ" ID="ID_52333658" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -16951,7 +17428,7 @@
<attribute NAME="Chapter" VALUE="1"/>
<font BOLD="true"/>
</node>
-<node TEXT="第2章 ノードを操作" ID="ID_782482897" TEXT_SHORTENED="true">
+<node TEXT="第2章 ノードを操作" ID="ID_782482897" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="2"/>
<richcontent TYPE="DETAILS">
@@ -16988,7 +17465,7 @@
</richcontent>
<font BOLD="true"/>
</node>
-<node TEXT="第3章 ノードの基本機能" ID="ID_1058695096" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="第3章 ノードの基本機能" ID="ID_1058695096" CREATED="1455910949146" MODIFIED="1455910949146" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17021,83 +17498,83 @@
<attribute NAME="Chapter" VALUE="3"/>
<font BOLD="true"/>
</node>
-<node TEXT="第4章 書式とスタイル" ID="ID_1235799492" TEXT_SHORTENED="true">
+<node TEXT="第4章 書式とスタイル" ID="ID_1235799492" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="4"/>
<font BOLD="true"/>
</node>
-<node TEXT="第5章 日付、時刻、リマインダ" ID="ID_1278646882" TEXT_SHORTENED="true">
+<node TEXT="第5章 日付、時刻、リマインダ" ID="ID_1278646882" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="5"/>
<font BOLD="true"/>
</node>
-<node TEXT="第6章 ノードの移動とマップの公表" ID="ID_253479537" TEXT_SHORTENED="true">
+<node TEXT="第6章 ノードの移動とマップの公表" ID="ID_253479537" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="6"/>
<font BOLD="true"/>
</node>
-<node TEXT="第7章 スクリプトと計算式" ID="ID_902036427" TEXT_SHORTENED="true">
+<node TEXT="第7章 スクリプトと計算式" ID="ID_902036427" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="7"/>
<font BOLD="true"/>
</node>
-<node TEXT="第8章 セキュリティと環境設定" ID="ID_1715639791" TEXT_SHORTENED="true">
+<node TEXT="第8章 セキュリティと環境設定" ID="ID_1715639791" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<attribute NAME="Chapter" VALUE="8"/>
<font BOLD="true"/>
</node>
</node>
-<node TEXT="スタイルを定義" FOLDED="true" ID="ID_1139262997" TEXT_SHORTENED="true">
-<node TEXT="標準スタイル(Default)" ID="ID_1424311678" TEXT_SHORTENED="true"/>
-<node TEXT="定義(Definition)" STYLE_REF="Defenition" ID="ID_147976858" TEXT_SHORTENED="true">
+<node TEXT="スタイルを定義" FOLDED="true" ID="ID_1139262997" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
+<node TEXT="標準スタイル(Default)" ID="ID_1424311678" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true"/>
+<node TEXT="定義(Definition)" STYLE_REF="Defenition" ID="ID_147976858" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Definition" LAST="false"/>
</hook>
</node>
-<node TEXT="機能(Method)" ID="ID_474774837" TEXT_SHORTENED="true">
+<node TEXT="機能(Method)" ID="ID_474774837" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Method" LAST="false"/>
</hook>
</node>
-<node TEXT="オプション値(OptionalValue)" STYLE_REF="OptionalValue" ID="ID_1002046431" TEXT_SHORTENED="true">
+<node TEXT="オプション値(OptionalValue)" STYLE_REF="OptionalValue" ID="ID_1002046431" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="OptionalValue" LAST="false"/>
</hook>
</node>
-<node TEXT="手順(Procedure)" ID="ID_1001381479" COLOR="#006666" TEXT_SHORTENED="true">
+<node TEXT="手順(Procedure)" ID="ID_1001381479" CREATED="1455910949147" MODIFIED="1455910949147" COLOR="#006666" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Procedure" LAST="false"/>
</hook>
</node>
-<node TEXT="例外(Exception)" ID="ID_823869965" TEXT_SHORTENED="true">
+<node TEXT="例外(Exception)" ID="ID_823869965" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
</hook>
</node>
-<node TEXT="留意事項(ToNote)" ID="ID_1974223934" TEXT_SHORTENED="true">
+<node TEXT="留意事項(ToNote)" ID="ID_1974223934" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
</hook>
</node>
-<node TEXT="詳しい説明(Refine)" ID="ID_1051644329" TEXT_SHORTENED="true">
+<node TEXT="詳しい説明(Refine)" ID="ID_1051644329" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Refine" LAST="false"/>
</hook>
</node>
-<node TEXT="用例(Example)" STYLE_REF="Example" ID="ID_721343821" TEXT_SHORTENED="true">
+<node TEXT="用例(Example)" STYLE_REF="Example" ID="ID_721343821" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
</hook>
</node>
-<node TEXT="メインメニュー(MainMenu)" ID="ID_1613603317" TEXT_SHORTENED="true">
+<node TEXT="メインメニュー(MainMenu)" ID="ID_1613603317" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="MainMenu" LAST="false"/>
</hook>
</node>
-<node TEXT="サブメニュー(SubMenu)" ID="ID_1713080933" STYLE="bubble" TEXT_SHORTENED="true">
+<node TEXT="サブメニュー(SubMenu)" ID="ID_1713080933" CREATED="1455910949147" MODIFIED="1455910949147" STYLE="bubble" TEXT_SHORTENED="true">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="SubMenu" LAST="false"/>
</hook>
</node>
-<node TEXT="見出し(Title)" STYLE_REF="Title" ID="ID_932764551" TEXT_SHORTENED="true"/>
-<node TEXT="更新(Revision)" STYLE_REF="Revision" ID="ID_1694804519" TEXT_SHORTENED="true"/>
+<node TEXT="見出し(Title)" STYLE_REF="Title" ID="ID_932764551" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true"/>
+<node TEXT="更新(Revision)" STYLE_REF="Revision" ID="ID_1694804519" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="条件対応スタイルを定義" FOLDED="true" ID="ID_4604251" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="条件対応スタイルを定義" FOLDED="true" ID="ID_4604251" CREATED="1455910949147" MODIFIED="1455910949147" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17121,7 +17598,7 @@
</body>
</html>
</richcontent>
-<node ID="ID_336620757"><richcontent TYPE="NODE">
+<node ID="ID_336620757" CREATED="1455910949148" MODIFIED="1455910949148"><richcontent TYPE="NODE">
<html>
<head>
@@ -17133,12 +17610,13 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="「Class」の値 = スタイル名一覧" ID="ID_303101789"/>
+<node TEXT="「Class」の値 = スタイル名一覧" ID="ID_303101789" CREATED="1455910949148" MODIFIED="1455910949148"/>
</node>
</node>
-<node TEXT="このマニュアルの翻訳" LOCALIZED_STYLE_REF="default" ID="ID_1859568483" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="このマニュアルの翻訳" LOCALIZED_STYLE_REF="default" ID="ID_1859568483" CREATED="1455910949148" MODIFIED="1455910949148" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17213,7 +17691,7 @@
</html>
</richcontent>
</node>
-<node TEXT="バージョン、更新、及びクレジット" FOLDED="true" ID="ID_1678241727">
+<node TEXT="バージョン、更新、及びクレジット" FOLDED="true" ID="ID_1678241727" CREATED="1455910949148" MODIFIED="1455910949148">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="Example" LAST="false"/>
@@ -17252,37 +17730,37 @@
</body>
</html>
</richcontent>
-<node TEXT="1.2.12_04 準拠" ID="ID_605038742"/>
-<node TEXT="文書作成" FOLDED="true" ID="ID_136822724" TEXT_SHORTENED="true">
-<node TEXT="Jokro" FOLDED="true" ID="ID_1128010246" LINK="mailto:jokro at users.sourceforge.net?subject%20=%20handleiding" TEXT_SHORTENED="true">
-<node TEXT="基本的に、Freeplane 1.1.3 の内容を Freeplane 1.2 にあわせて書き直し" ID="ID_52670674" TEXT_SHORTENED="true"/>
-<node TEXT="Freeplane 1.2 の Wiki 及び Tutorial" ID="ID_1524499902" VSHIFT="-10" TEXT_SHORTENED="true"/>
+<node TEXT="1.2.12_04 準拠" ID="ID_605038742" CREATED="1455910949148" MODIFIED="1455910949148"/>
+<node TEXT="文書作成" FOLDED="true" ID="ID_136822724" CREATED="1455910949148" MODIFIED="1455910949148" TEXT_SHORTENED="true">
+<node TEXT="Jokro" FOLDED="true" ID="ID_1128010246" CREATED="1455910949148" MODIFIED="1455910949148" LINK="mailto:jokro at users.sourceforge.net?subject%20=%20handleiding" TEXT_SHORTENED="true">
+<node TEXT="基本的に、Freeplane 1.1.3 の内容を Freeplane 1.2 にあわせて書き直し" ID="ID_52670674" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="Freeplane 1.2 の Wiki 及び Tutorial" ID="ID_1524499902" CREATED="1455910949149" MODIFIED="1455910949149" VSHIFT_QUANTITY="-10.0 px" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="最終更新日:" ID="ID_21798827" TEXT_SHORTENED="true"/>
+<node TEXT="最終更新日:" ID="ID_21798827" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="ソフトウェア" FOLDED="true" ID="ID_298252563" TEXT_SHORTENED="true">
-<node TEXT="オリジナルの著作権者" FOLDED="true" ID="Freeplane_Link_415458128" TEXT_SHORTENED="true">
-<node TEXT="Joerg Mueller" ID="_Freeplane_Link_1896457660" TEXT_SHORTENED="true"/>
-<node TEXT="Daniel Polansky" ID="ID_790827459" LINK="http://danpolansky.blogspot.com/" TEXT_SHORTENED="true"/>
-<node TEXT="Petr Novak" ID="_Freeplane_Link_459203293" TEXT_SHORTENED="true"/>
-<node TEXT="Christian Foltin" ID="_Freeplane_Link_875814410" TEXT_SHORTENED="true"/>
-<node TEXT="Dimitry Polivaev" ID="_Freeplane_Link_1415293905" TEXT_SHORTENED="true"/>
-<node TEXT="Graphical Design by Predrag Cuklin" ID="ID_1094825033" TEXT_SHORTENED="true"/>
+<node TEXT="ソフトウェア" FOLDED="true" ID="ID_298252563" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true">
+<node TEXT="オリジナルの著作権者" FOLDED="true" ID="Freeplane_Link_415458128" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true">
+<node TEXT="Joerg Mueller" ID="_Freeplane_Link_1896457660" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="Daniel Polansky" ID="ID_790827459" CREATED="1455910949149" MODIFIED="1455910949149" LINK="http://danpolansky.blogspot.com/" TEXT_SHORTENED="true"/>
+<node TEXT="Petr Novak" ID="_Freeplane_Link_459203293" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="Christian Foltin" ID="_Freeplane_Link_875814410" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="Dimitry Polivaev" ID="_Freeplane_Link_1415293905" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="Graphical Design by Predrag Cuklin" ID="ID_1094825033" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="現在の開発チーム" FOLDED="true" ID="ID_1090487344" TEXT_SHORTENED="true">
-<node TEXT="Release 1.1.x" FOLDED="true" ID="ID_1795869028" TEXT_SHORTENED="true">
-<node TEXT="Dimitry Polivaev" ID="ID_809494025" TEXT_SHORTENED="true"/>
-<node TEXT="Volker Boerchers" ID="ID_548414191" TEXT_SHORTENED="true"/>
-<node TEXT="Eric L." ID="ID_306583030" TEXT_SHORTENED="true"/>
-<node TEXT="jayseye" ID="ID_502187025" TEXT_SHORTENED="true"/>
-<node TEXT="Predrag" ID="ID_320430724" TEXT_SHORTENED="true"/>
-<node TEXT="Ryan Wesley" ID="ID_288819242" TEXT_SHORTENED="true"/>
+<node TEXT="現在の開発チーム" FOLDED="true" ID="ID_1090487344" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true">
+<node TEXT="Release 1.1.x" FOLDED="true" ID="ID_1795869028" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true">
+<node TEXT="Dimitry Polivaev" ID="ID_809494025" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="Volker Boerchers" ID="ID_548414191" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="Eric L." ID="ID_306583030" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="jayseye" ID="ID_502187025" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="Predrag" ID="ID_320430724" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
+<node TEXT="Ryan Wesley" ID="ID_288819242" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"/>
</node>
</node>
</node>
</node>
</node>
-<node TEXT="FAQ" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1040911735" TEXT_SHORTENED="true" HGAP="28" VSHIFT="-7" MIN_WIDTH="80">
+<node TEXT="FAQ" STYLE_REF="UserGuide" FOLDED="true" ID="ID_1040911735" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true" HGAP_QUANTITY="28.0 px" VSHIFT_QUANTITY="-7.0 px" MIN_WIDTH="80.0 px">
<hook NAME="NodeConditionalStyles">
<conditional_style ACTIVE="true" STYLE_REF="Exception" LAST="false"/>
<conditional_style ACTIVE="true" STYLE_REF="ToNote" LAST="false"/>
@@ -17322,7 +17800,7 @@
</html>
</richcontent>
<edge STYLE="horizontal"/>
-<node TEXT="新規ノードがすべて囲みになる、特殊フォントになる、特殊なエッジの線が出る、等" ID="ID_391816540" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
+<node TEXT="新規ノードがすべて囲みになる、特殊フォントになる、特殊なエッジの線が出る、等" ID="ID_391816540" CREATED="1455910949149" MODIFIED="1455910949149" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS" HIDDEN="true">
<html>
<head>
@@ -17353,7 +17831,7 @@
</html>
</richcontent>
</node>
-<node TEXT="書式なしで貼り付け" ID="ID_547441247" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="書式なしで貼り付け" ID="ID_547441247" CREATED="1455910949150" MODIFIED="1455910949150" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17367,12 +17845,12 @@
</html>
</richcontent>
</node>
-<node TEXT="制限事項と既知のバグ" FOLDED="true" ID="ID_1288924719">
+<node TEXT="制限事項と既知のバグ" FOLDED="true" ID="ID_1288924719" CREATED="1455910949150" MODIFIED="1455910949150">
<edge STYLE="horizontal"/>
-<node TEXT="ノードが他のノードのテキストに重複表示" ID="ID_416103426" LINK="https://sourceforge.net/apps/mantisbt/freeplane/view.php?id=1210" TEXT_SHORTENED="true"/>
-<node TEXT="Flash player について" ID="ID_470970220" LINK="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4668966" TEXT_SHORTENED="true"/>
+<node TEXT="ノードが他のノードのテキストに重複表示" ID="ID_416103426" CREATED="1455910949150" MODIFIED="1455910949150" LINK="https://sourceforge.net/apps/mantisbt/freeplane/view.php?id=1210" TEXT_SHORTENED="true"/>
+<node TEXT="Flash player について" ID="ID_470970220" CREATED="1455910949150" MODIFIED="1455910949150" LINK="https://sourceforge.net/projects/freeplane/forums/forum/758437/topic/4668966" TEXT_SHORTENED="true"/>
</node>
-<node TEXT="マップ/ノードが編集できない" ID="ID_138844829" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="マップ/ノードが編集できない" ID="ID_138844829" CREATED="1455910949150" MODIFIED="1455910949150" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17386,7 +17864,7 @@
</html>
</richcontent>
</node>
-<node TEXT="メニューが表示されない" ID="ID_376454406" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="メニューが表示されない" ID="ID_376454406" CREATED="1455910949150" MODIFIED="1455910949150" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17400,7 +17878,7 @@
</html>
</richcontent>
</node>
-<node TEXT="ノードを展開できない" ID="ID_1598827129" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="ノードを展開できない" ID="ID_1598827129" CREATED="1455910949150" MODIFIED="1455910949150" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17422,7 +17900,7 @@
</html>
</richcontent>
</node>
-<node TEXT="スタイルが適用されない" ID="ID_1903605589" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="スタイルが適用されない" ID="ID_1903605589" CREATED="1455910949150" MODIFIED="1455910949150" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17436,7 +17914,7 @@
</html>
</richcontent>
</node>
-<node ID="ID_1194109651"><richcontent TYPE="NODE">
+<node ID="ID_1194109651" CREATED="1455910949150" MODIFIED="1455910949150"><richcontent TYPE="NODE">
<html>
<head>
@@ -17448,9 +17926,10 @@
</p>
</body>
</html>
+
</richcontent>
</node>
-<node TEXT="画像へのアクセスが拒否される(Java アプレット)" ID="ID_688930881" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="画像へのアクセスが拒否される(Java アプレット)" ID="ID_688930881" CREATED="1455910949150" MODIFIED="1455910949150" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17475,7 +17954,7 @@
</html>
</richcontent>
</node>
-<node TEXT="フリーフローティング&フリーポジションノード" ID="ID_413418407"><richcontent TYPE="DETAILS">
+<node TEXT="フリーフローティング&フリーポジションノード" ID="ID_413418407" CREATED="1455910949150" MODIFIED="1455910949150"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17489,7 +17968,7 @@
</html>
</richcontent>
</node>
-<node TEXT="新規ノードの標準スタイル(フォント、囲み等)を変える" ID="ID_256904484" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="新規ノードの標準スタイル(フォント、囲み等)を変える" ID="ID_256904484" CREATED="1455910949150" MODIFIED="1455910949150" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17514,7 +17993,7 @@
</html>
</richcontent>
</node>
-<node TEXT="マップオープン時に実行するスクリプト" ID="ID_470865141" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="マップオープン時に実行するスクリプト" ID="ID_470865141" CREATED="1455910949150" MODIFIED="1455910949150" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17528,7 +18007,7 @@
</html>
</richcontent>
</node>
-<node TEXT="バッチ処理" ID="ID_1030060663" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
+<node TEXT="バッチ処理" ID="ID_1030060663" CREATED="1455910949151" MODIFIED="1455910949151" TEXT_SHORTENED="true"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17559,7 +18038,7 @@
</html>
</richcontent>
</node>
-<node TEXT="画面表示を拡大・縮小しても、ツールチップの文字サイズが変わらない。" ID="ID_571521721"><richcontent TYPE="DETAILS">
+<node TEXT="画面表示を拡大・縮小しても、ツールチップの文字サイズが変わらない。" ID="ID_571521721" CREATED="1455910949151" MODIFIED="1455910949151"><richcontent TYPE="DETAILS">
<html>
<head>
@@ -17573,14 +18052,14 @@
</html>
</richcontent>
</node>
-<node TEXT="JAVA のインストールに関する問題点" FOLDED="true" ID="ID_46334346">
-<node TEXT="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207" ID="ID_1177663722" LINK="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207"/>
+<node TEXT="JAVA のインストールに関する問題点" FOLDED="true" ID="ID_46334346" CREATED="1455910949151" MODIFIED="1455910949151">
+<node TEXT="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207" ID="ID_1177663722" CREATED="1455910949151" MODIFIED="1455910949151" LINK="https://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=207"/>
</node>
-<node TEXT="矢印型リンクが機能しない" ID="ID_109939023" LINK="#ID_265935349"/>
-<node TEXT="標準的なプロパティの設定" ID="ID_1547921090" LINK="http://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=219"/>
+<node TEXT="矢印型リンクが機能しない" ID="ID_109939023" CREATED="1455910949151" MODIFIED="1455910949151" LINK="#ID_265935349"/>
+<node TEXT="標準的なプロパティの設定" ID="ID_1547921090" CREATED="1455910949151" MODIFIED="1455910949151" LINK="http://sourceforge.net/apps/phpbb/freeplane/viewtopic.php?f=1&t=219"/>
</node>
</node>
-<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_1658062789" HGAP="0" VSHIFT="111" TEXT_SHORTENED="true" LINK="#ID_566454554"><richcontent TYPE="NODE">
+<node LOCALIZED_STYLE_REF="defaultstyle.floating" POSITION="left" ID="ID_1658062789" CREATED="1455910949154" MODIFIED="1455910949154" LINK="#ID_566454554" HGAP_QUANTITY="0.0 px" VSHIFT_QUANTITY="111.0 px" TEXT_SHORTENED="true"><richcontent TYPE="NODE">
<html>
<head>
@@ -17592,6 +18071,7 @@
</p>
</body>
</html>
+
</richcontent>
<hook NAME="FreeNode"/>
<richcontent TYPE="DETAILS">
@@ -17608,7 +18088,7 @@
</html>
</richcontent>
<hook NAME="AlwaysUnfoldedNode"/>
-<node TEXT="Freeplane 開発チームと協力者" ID="ID_1675707038" HGAP="-163" VSHIFT="37" LINK="http://freeplane.sourceforge.net/wiki/index.php/Contributors"/>
+<node TEXT="Freeplane 開発チームと協力者" ID="ID_1675707038" CREATED="1455910949154" MODIFIED="1455910949154" LINK="http://freeplane.sourceforge.net/wiki/index.php/Contributors" HGAP_QUANTITY="-163.0 px" VSHIFT_QUANTITY="37.0 px"/>
</node>
</node>
</map>
diff --git a/freeplane/doc/freeplane_ru.mm b/freeplane/doc/freeplane_ru.mm
index 721d3b2..550ae51 100644
--- a/freeplane/doc/freeplane_ru.mm
+++ b/freeplane/doc/freeplane_ru.mm
@@ -1,567 +1,659 @@
-<map version="0.9.0">
+<map version="freeplane 1.5.9">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node COLOR="#993300">
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body width="">
- <p align="center">
- Freeplane<br/><small>- открытая программа - </small>
- </p>
- <p align="center">
- <small>- для работы со схемами мышления -</small>
- </p>
- </body>
-</html></richcontent>
+<node TEXT="<html>
 <head>
 
 </head>
 <body width="">
 <p align="center">
 Freeplane<br><small>- открытая программа - </small>
 </p>
 <p align="center">
 <small>- & [...]
<font NAME="Dialog" SIZE="18" BOLD="true"/>
-<hook NAME="MapStyle" max_node_width="600"/>
-<node TEXT="Домашняя страница Freeplane" POSITION="left" LINK="http://freeplane.sourceforge.net">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node TEXT="Список действий клавиш" FOLDED="true" POSITION="left" COLOR="#006699">
-<node TEXT="Файловые команды:
Новая схема      - Ctrl+N
Открыть схему     - Ctrl+O
Сохранить схему   &#x [...]
+<hook NAME="MapStyle">
+ <properties fit_to_viewport="false;"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" FORMAT="NO_FORMAT" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="true" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#ffffff">
+<font SIZE="9"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" UNIFORM_SHAPE="true" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font SIZE="24" ITALIC="true"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2">
+<edge COLOR="#ff0033"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3">
+<edge COLOR="#009933"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4">
+<edge COLOR="#3333ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#ff6600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<node TEXT="Домашняя страница Freeplane" POSITION="left" ID="ID_527692916" CREATED="1465678964133" MODIFIED="1465678964133" LINK="http://freeplane.sourceforge.net">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Список действий клавиш" FOLDED="true" POSITION="left" ID="ID_17107809" CREATED="1465678964133" MODIFIED="1465678964133" COLOR="#006699">
+<node TEXT="Файловые команды:
Новая схема      - Ctrl+N
Открыть схему     - Ctrl+O
Сохранить схему   &#x [...]
<font NAME="Courier New" SIZE="12"/>
</node>
</node>
-<node TEXT="Установка" FOLDED="true" POSITION="left" COLOR="#006633">
-<node TEXT="Ссылки" FOLDED="true" COLOR="#006699">
-<node TEXT="Скачать Java Runtime Environment (как минимум J2RE1.4)" LINK="http://java.sun.com/javase/downloads/index.jsp">
+<node TEXT="Установка" FOLDED="true" POSITION="left" ID="ID_864870804" CREATED="1465678964133" MODIFIED="1465678964133" COLOR="#006633">
+<node TEXT="Ссылки" FOLDED="true" ID="ID_1406827422" CREATED="1465678964133" MODIFIED="1465678964133" COLOR="#006699">
+<node TEXT="Скачать Java Runtime Environment (как минимум J2RE1.4)" ID="ID_298726508" CREATED="1465678964133" MODIFIED="1465678964133" LINK="http://java.sun.com/javase/downloads/index.jsp">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Скачать приложение" LINK="http://freeplane.sourceforge.net/wiki/index.php/Download#Download">
+<node TEXT="Скачать приложение" ID="ID_1257373551" CREATED="1465678964133" MODIFIED="1465678964133" LINK="http://freeplane.sourceforge.net/wiki/index.php/Download#Download">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Для установки Freeplane в Microsoft Windows, установите Java от фирмы Sun и установите Freeplane используя установщик Fr [...]
-<node TEXT="Для установки Freeplane в Linux, скачайте Java Runtime Environment и Freeplane самостоятельно. Сначала установите Java, затем р [...]
-<node TEXT="В Microsoft Windows и Mac OS X, вы так же можете просто дважды кликать на freeplane.jar расположенный в папке lib для за [...]
+<node TEXT="Для установки Freeplane в Microsoft Windows, установите Java от фирмы Sun и установите Freeplane используя установщик Fr [...]
+<node TEXT="Для установки Freeplane в Linux, скачайте Java Runtime Environment и Freeplane самостоятельно. Сначала установите Java, затем р [...]
+<node TEXT="В Microsoft Windows и Mac OS X, вы так же можете просто дважды кликать на freeplane.jar расположенный в папке lib для за [...]
</node>
-<node TEXT="Обзор файлов на вашем компьютере" FOLDED="true" POSITION="left" COLOR="#407000">
-<node TEXT="Для обзора файлов, переключитесь в режим Обозревателя файлов в меню Карты > Обоз& [...]
-<node TEXT="Вы видите дерево файлов как если бы оно было схемой сознания."/>
-<node TEXT="Для центрирования обзора на узле, в контекстном меню выберите Center."/>
-<node TEXT="Для просмотра, редактирования или запуска файла, перейдите по ссылке его узла."/>
-<node TEXT="Обзов файлов вобщем не очень полезен. Это демонстрация того, что довольно простC [...]
+<node TEXT="Обзор файлов на вашем компьютере" FOLDED="true" POSITION="left" ID="ID_834359529" CREATED="1465678964133" MODIFIED="1465678964133" COLOR="#407000">
+<node TEXT="Для обзора файлов, переключитесь в режим Обозревателя файлов в меню Карты > Обоз& [...]
+<node TEXT="Вы видите дерево файлов как если бы оно было схемой сознания." ID="ID_196481749" CREATED="1465678964133" MODIFIED="1465678964133"/>
+<node TEXT="Для центрирования обзора на узле, в контекстном меню выберите Center." ID="ID_1933217534" CREATED="1465678964133" MODIFIED="1465678964133"/>
+<node TEXT="Для просмотра, редактирования или запуска файла, перейдите по ссылке его узла." ID="ID_604 [...]
+<node TEXT="Обзов файлов вобщем не очень полезен. Это демонстрация того, что довольно простC [...]
</node>
-<node TEXT="Обзор схем" FOLDED="true" POSITION="left" COLOR="#407000">
-<node TEXT="Для обзора схем и последущего редактирования, переключитесь в режим Обозреват& [...]
-<node TEXT="Причины наличия раздельных режимов обзора - технические. Обзор - единственное чD [...]
+<node TEXT="Обзор схем" FOLDED="true" POSITION="left" ID="ID_693879703" CREATED="1465678964133" MODIFIED="1465678964133" COLOR="#407000">
+<node TEXT="Для обзора схем и последущего редактирования, переключитесь в режим Обозреват& [...]
+<node TEXT="Причины наличия раздельных режимов обзора - технические. Обзор - единственное чD [...]
</node>
-<node TEXT="О режимах" FOLDED="true" POSITION="left" COLOR="#407000">
+<node TEXT="О режимах" FOLDED="true" POSITION="left" ID="ID_885707013" CREATED="1465678964133" MODIFIED="1465678964133" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Хотя Freeplane в основном используется для редактирования схем мышления, проект разраC [...]
+<node TEXT="Хотя Freeplane в основном используется для редактирования схем мышления, проект разраC [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Есть код, почти готовый, для режима scheme, который дает возможность редактирования пD [...]
+<node TEXT="Есть код, почти готовый, для режима scheme, который дает возможность редактирования пD [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Установка Freeplane applet на ваш веб-сайт" FOLDED="true" POSITION="left" COLOR="#407000">
-<node TEXT="Вы можете установить applet на ваш веб-сайт так, что другие пользователи могли видеть  [...]
+<node TEXT="Установка Freeplane applet на ваш веб-сайт" FOLDED="true" POSITION="left" ID="ID_1179574394" CREATED="1465678964133" MODIFIED="1465678964133" COLOR="#407000">
+<node TEXT="Вы можете установить applet на ваш веб-сайт так, что другие пользователи могли видеть  [...]
<font NAME="Dialog" SIZE="12"/>
</node>
-<node TEXT="Скачать applet, т.е. freeplane-обозреватель." LINK="http://sourceforge.net/project/showfiles.php?group_id=211069"/>
-<node TEXT="Скачанный архив содержит freeplanebrowser.jar и freeplanebrowser.html. Сделайте сслыку со своей страницы на freeplanebrowser.html. Вну [...]
-<node TEXT="Jar файл апплета должен находится на том же сервере что и схема, из-за особенностей б [...]
+<node TEXT="Скачать applet, т.е. freeplane-обозреватель." ID="ID_1773958248" CREATED="1465678964133" MODIFIED="1465678964133" LINK="http://sourceforge.net/project/showfiles.php?group_id=211069"/>
+<node TEXT="Скачанный архив содержит freeplanebrowser.jar и freeplanebrowser.html. Сделайте сслыку со своей страницы на freeplanebrowser.html. Вну [...]
+<node TEXT="Jar файл апплета должен находится на том же сервере что и схема, из-за особенностей б [...]
</node>
-<node TEXT="Использование апплета Freeplane" FOLDED="true" POSITION="left" COLOR="#407000">
+<node TEXT="Использование апплета Freeplane" FOLDED="true" POSITION="left" ID="ID_1160552792" CREATED="1465678964133" MODIFIED="1465678964133" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="В апплете Freeplane, вы можете только просматривать схемы; вы не можете редактировать уд&# [...]
+<node TEXT="В апплете Freeplane, вы можете только просматривать схемы; вы не можете редактировать уд&# [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Изменения в интерфейсе с версии 0.6.5" FOLDED="true" POSITION="left" COLOR="#407000">
+<node TEXT="Изменения в интерфейсе с версии 0.6.5" FOLDED="true" POSITION="left" ID="ID_1196444740" CREATED="1465678964133" MODIFIED="1465678964133" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Некоторые настройки клавиатуры были изменены так, что сейчас мы полагаем они бо [...]
+<node TEXT="Некоторые настройки клавиатуры были изменены так, что сейчас мы полагаем они бо [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Настройки клавиатуры можно изменить в меню Дополнительни > Установки.">
+<node TEXT="Настройки клавиатуры можно изменить в меню Дополнительни > Установки." ID="ID_1159347906" CREATED="1465678964133" MODIFIED= [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Создатели" FOLDED="true" POSITION="left" COLOR="#006699">
+<node TEXT="Создатели" FOLDED="true" POSITION="left" ID="ID_186779030" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Авторы" FOLDED="true" COLOR="#006699">
-<node TEXT="Joerg Mueller" FOLDED="true" COLOR="#996600">
+<node TEXT="Авторы" FOLDED="true" ID="ID_592138982" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#006699">
+<node TEXT="Joerg Mueller" FOLDED="true" ID="ID_191734295" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="ponders at t-online.de" COLOR="#558000" LINK="mailto:ponders at t-online.de">
+<node TEXT="ponders at t-online.de" ID="ID_682697460" CREATED="1465678964149" MODIFIED="1465678964149" LINK="mailto:ponders at t-online.de" COLOR="#558000">
<font NAME="Dialog" SIZE="10"/>
</node>
-<node TEXT="Университет Фрейбурга, Германия" COLOR="#999999">
+<node TEXT="Университет Фрейбурга, Германия" ID="ID_1445633760" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node TEXT="Daniel Polansky" COLOR="#996600" LINK="http://danpolansky.blogspot.com/">
+<node TEXT="Daniel Polansky" ID="ID_931246815" CREATED="1465678964149" MODIFIED="1465678964149" LINK="http://danpolansky.blogspot.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
</node>
-<node TEXT="Petr Novak" COLOR="#996600">
+<node TEXT="Petr Novak" ID="ID_574118867" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
</node>
-<node TEXT="Christian Foltin" COLOR="#996600">
+<node TEXT="Christian Foltin" ID="ID_64550512" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
</node>
-<node TEXT="Dimitri Polivaev" COLOR="#996600">
+<node TEXT="Dimitri Polivaev" ID="ID_1329333641" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="Помощь оказали" FOLDED="true" COLOR="#006699">
+<node TEXT="Помощь оказали" FOLDED="true" ID="ID_1076385974" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Andrew Iggleden" FOLDED="true" COLOR="#996600">
+<node TEXT="Andrew Iggleden" FOLDED="true" ID="ID_1021809876" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Установщик для Windows" COLOR="#999999">
+<node TEXT="Установщик для Windows" ID="ID_1556201968" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="Bob Alexander" FOLDED="true" COLOR="#996600">
+<node TEXT="Bob Alexander" FOLDED="true" ID="ID_1377648" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Руководство по Eclipse" COLOR="#999999">
+<node TEXT="Руководство по Eclipse" ID="ID_1996924529" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="David Butt" FOLDED="true" COLOR="#996600">
+<node TEXT="David Butt" FOLDED="true" ID="ID_583760673" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Руководство по flash" COLOR="#999999">
+<node TEXT="Руководство по flash" ID="ID_1034653997" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="David Low" FOLDED="true" COLOR="#996600">
+<node TEXT="David Low" FOLDED="true" ID="ID_318141163" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Полезен" COLOR="#999999">
+<node TEXT="Полезен" ID="ID_1903551591" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
</node>
-<node TEXT="Переводчики" FOLDED="true" COLOR="#006699" LINK="http://freeplane.sourceforge.net/wiki/index.php/Translation">
-<node TEXT="Bob Alexander" FOLDED="true" COLOR="#996600">
+<node TEXT="Переводчики" FOLDED="true" ID="ID_1263598761" CREATED="1465678964149" MODIFIED="1465678964149" LINK="http://freeplane.sourceforge.net/wiki/index.php/Translation" COLOR="#006699">
+<node TEXT="Bob Alexander" FOLDED="true" ID="ID_74973369" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Перевод на итальянский" COLOR="#999999">
+<node TEXT="Перевод на итальянский" ID="ID_1308894171" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="Knud Riishøjgård" FOLDED="true" COLOR="#996600">
+<node TEXT="Knud Riishøjgård" FOLDED="true" ID="ID_1426820247" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Перевод на датский" COLOR="#999999">
+<node TEXT="Перевод на датский" ID="ID_1082253869" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="Takeshi Kakeda" FOLDED="true" COLOR="#996600">
+<node TEXT="Takeshi Kakeda" FOLDED="true" ID="ID_1590753630" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Перевод на японский" COLOR="#999999">
+<node TEXT="Перевод на японский" ID="ID_1281357366" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="Kohichi Aoki" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на японский" COLOR="#999999">
+<node TEXT="Kohichi Aoki" FOLDED="true" ID="ID_1817608731" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на японский" ID="ID_225573155" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="Alex Dukal" FOLDED="true" COLOR="#996600">
+<node TEXT="Alex Dukal" FOLDED="true" ID="ID_1229146173" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Перевод на испанский" COLOR="#999999">
+<node TEXT="Перевод на испанский" ID="ID_57964093" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="Hugo Gayosso" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на испанский" COLOR="#999999">
+<node TEXT="Hugo Gayosso" FOLDED="true" ID="ID_598224995" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на испанский" ID="ID_975856953" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
<edge WIDTH="thin"/>
</node>
</node>
-<node TEXT="Sylvain Gamel" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на французский" COLOR="#999999">
+<node TEXT="Sylvain Gamel" FOLDED="true" ID="ID_1894172609" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на французский" ID="ID_1554657147" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node TEXT="Koen Roggemans" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на голландский" COLOR="#999999">
+<node TEXT="Koen Roggemans" FOLDED="true" ID="ID_1396793865" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на голландский" ID="ID_1628924468" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node TEXT="Rafal Kraik" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на польский" COLOR="#999999">
+<node TEXT="Rafal Kraik" FOLDED="true" ID="ID_41440304" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на польский" ID="ID_1421040621" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node TEXT="Goliath" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на корейский" COLOR="#999999">
+<node TEXT="Goliath" FOLDED="true" ID="ID_249094428" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на корейский" ID="ID_866736192" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node TEXT="Martin Srebotnjak (nick: Miles a.k.a. filmsi)" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на словенский" COLOR="#999999">
+<node TEXT="Martin Srebotnjak (nick: Miles a.k.a. filmsi)" FOLDED="true" ID="ID_1985027811" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на словенский" ID="ID_1593007489" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node TEXT="William Chen" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на китайский" COLOR="#999999">
+<node TEXT="William Chen" FOLDED="true" ID="ID_624113098" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на китайский" ID="ID_1408595541" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node TEXT="Radek Švarc" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на чешский" COLOR="#999999">
+<node TEXT="Radek Švarc" FOLDED="true" ID="ID_1524008453" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на чешский" ID="ID_1046918222" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node TEXT="Balázs Márton" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на венгерский" COLOR="#999999">
+<node TEXT="Balázs Márton" FOLDED="true" ID="ID_875521447" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на венгерский" ID="ID_1446506678" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node TEXT="Luis Ferreira " FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на португальский" COLOR="#999999">
+<node TEXT="Luis Ferreira " FOLDED="true" ID="ID_1357737450" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на португальский" ID="ID_268363237" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node TEXT="Velesyuk Maxim" FOLDED="true" COLOR="#996600">
-<node TEXT="Перевод на русский" COLOR="#999999">
+<node TEXT="Velesyuk Maxim" FOLDED="true" ID="ID_1329829385" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
+<node TEXT="Перевод на русский" ID="ID_1974224831" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
-<node TEXT="Список переводчиков может быть не полным. Если мы вас забыли, дайте нам знать. Все & [...]
+<node TEXT="Список переводчиков может быть не полным. Если мы вас забыли, дайте нам знать. Все & [...]
<font NAME="SansSerif" SIZE="10"/>
</node>
</node>
</node>
-<node TEXT="Нажмите Ctrl + F для поиска. Нажмите Ctrl + G для переходя к следущему результату. Чтобы поиск & [...]
-<node TEXT="Нажмите стрелку "вправо" чтобы развернуть содержимое узла." POSITION="right" COLOR="#0033ff"/>
-<node TEXT="Введение" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Freeplane предназначена для создания так называемых "схем мышления". Уже многие люди ис [...]
-<node TEXT="Информация хранится в текстовых полях, называемых узлами. Узлы соединены вмест [...]
-<node TEXT="Это справочник по Freeplane 0.8.0. Назначения клавиш и расположение пунктов меню могут измеC [...]
+<node TEXT="Нажмите Ctrl + F для поиска. Нажмите Ctrl + G для переходя к следущему результату. Чтобы поиск & [...]
+<node TEXT="Нажмите стрелку "вправо" чтобы развернуть содержимое узла." POSITION="right" ID="ID_822633213" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#0033ff"/>
+<node TEXT="Введение" FOLDED="true" POSITION="right" ID="ID_565117848" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#407000">
+<node TEXT="Freeplane предназначена для создания так называемых "схем мышления". Уже многие люди ис [...]
+<node TEXT="Информация хранится в текстовых полях, называемых узлами. Узлы соединены вмест [...]
+<node TEXT="Это справочник по Freeplane 0.8.0. Назначения клавиш и расположение пунктов меню могут измеC [...]
</node>
-<node TEXT="Демонстрация некоторых возможностей" FOLDED="true" POSITION="right" COLOR="#996600">
+<node TEXT="Демонстрация некоторых возможностей" FOLDED="true" POSITION="right" ID="ID_797653954" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Внешний вид" FOLDED="true" COLOR="#669900">
+<node TEXT="Внешний вид" FOLDED="true" ID="ID_878028367" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Узлы могут иметь разные цвета." FOLDED="true">
+<node TEXT="Узлы могут иметь разные цвета." FOLDED="true" ID="ID_142747307" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Красный" COLOR="#ff0000">
+<node TEXT="Красный" ID="ID_947758984" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#ff0000">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Зеленый" COLOR="#009900">
+<node TEXT="Зеленый" ID="ID_1304440660" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#009900">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Синий" COLOR="#0000cc">
+<node TEXT="Синий" ID="ID_458532999" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#0000cc">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="У узлов могут быть разные цвета фона" FOLDED="true">
-<node TEXT="Такой"/>
-<node TEXT="Вот такой"/>
+<node TEXT="У узлов могут быть разные цвета фона" FOLDED="true" ID="ID_51885885" CREATED="1465678964149" MODIFIED="1465678964149">
+<node TEXT="Такой" ID="ID_1040587569" CREATED="1465678964149" MODIFIED="1465678964149"/>
+<node TEXT="Вот такой" ID="ID_1663216640" CREATED="1465678964149" MODIFIED="1465678964149"/>
</node>
-<node TEXT="Узлы могут отличаться стилями шрифтов" FOLDED="true">
+<node TEXT="Узлы могут отличаться стилями шрифтов" FOLDED="true" ID="ID_251080604" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Жирный">
+<node TEXT="Жирный" ID="ID_512111878" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="Dialog" SIZE="12" BOLD="true"/>
</node>
-<node TEXT="Курсив">
+<node TEXT="Курсив" ID="ID_659954543" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="Dialog" SIZE="12" ITALIC="true"/>
</node>
-<node TEXT="Жирный курсив">
+<node TEXT="Жирный курсив" ID="ID_537510898" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="Dialog" SIZE="12" BOLD="true" ITALIC="true"/>
</node>
</node>
-<node TEXT="Шрифт может быть разного размера" FOLDED="true">
+<node TEXT="Шрифт может быть разного размера" FOLDED="true" ID="ID_1887705642" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="маленький">
+<node TEXT="маленький" ID="ID_1085295878" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="11"/>
</node>
-<node TEXT="средний">
+<node TEXT="средний" ID="ID_1634593741" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="13"/>
</node>
-<node TEXT="по-больше">
+<node TEXT="по-больше" ID="ID_1148570263" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="15"/>
</node>
-<node TEXT="Огромный" FOLDED="true">
+<node TEXT="Огромный" FOLDED="true" ID="ID_1476494429" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="20"/>
-<node TEXT="УУХ">
+<node TEXT="УУХ" ID="ID_797802649" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="123"/>
</node>
</node>
</node>
-<node TEXT="Могут быть использованы разрые шрифты" FOLDED="true">
+<node TEXT="Могут быть использованы разрые шрифты" FOLDED="true" ID="ID_1381044882" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Такой">
+<node TEXT="Такой" ID="ID_345560502" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="Times New Roman" SIZE="16"/>
</node>
-<node TEXT="Или такой">
+<node TEXT="Или такой" ID="ID_9575699" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="Verdana" SIZE="12"/>
</node>
-<node TEXT="Или вот такой">
+<node TEXT="Или вот такой" ID="ID_658912339" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="Dialog" SIZE="21"/>
</node>
</node>
-<node TEXT="Узлы могу быть разного стиля" FOLDED="true">
-<node TEXT=""Ветка"" FOLDED="true">
-<node TEXT=""Ветка""/>
-<node TEXT=""Ветка""/>
+<node TEXT="Узлы могу быть разного стиля" FOLDED="true" ID="ID_155712561" CREATED="1465678964149" MODIFIED="1465678964149">
+<node TEXT=""Ветка"" FOLDED="true" ID="ID_962116603" CREATED="1465678964149" MODIFIED="1465678964149">
+<node TEXT=""Ветка"" ID="ID_1981691324" CREATED="1465678964149" MODIFIED="1465678964149"/>
+<node TEXT=""Ветка"" ID="ID_1297774585" CREATED="1465678964149" MODIFIED="1465678964149"/>
</node>
-<node TEXT=""Пузырь"" FOLDED="true" STYLE="bubble">
-<node TEXT=""Пузырь"" STYLE="bubble"/>
-<node TEXT=""Пузырь"" STYLE="bubble"/>
+<node TEXT=""Пузырь"" FOLDED="true" ID="ID_1442484182" CREATED="1465678964149" MODIFIED="1465678964149" STYLE="bubble">
+<node TEXT=""Пузырь"" ID="ID_788999464" CREATED="1465678964149" MODIFIED="1465678964149" STYLE="bubble"/>
+<node TEXT=""Пузырь"" ID="ID_58813534" CREATED="1465678964149" MODIFIED="1465678964149" STYLE="bubble"/>
</node>
</node>
</node>
-<node TEXT="Узлы могут быть вложенными" FOLDED="true" COLOR="#669900">
+<node TEXT="Узлы могут быть вложенными" FOLDED="true" ID="ID_1222705677" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Что-то содержит" FOLDED="true">
+<node TEXT="Что-то содержит" FOLDED="true" ID="ID_866561939" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Спрятанный узел">
+<node TEXT="Спрятанный узел" ID="ID_1655212493" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Дерево" FOLDED="true">
+<node TEXT="Дерево" FOLDED="true" ID="ID_340206501" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Дуб">
+<node TEXT="Дуб" ID="ID_1156377123" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Бук">
+<node TEXT="Бук" ID="ID_870580641" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Вяз">
+<node TEXT="Вяз" ID="ID_1442645176" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node TEXT="Узлы могут содержать действующие ссылки на ... " FOLDED="true" COLOR="#669900">
+<node TEXT="Узлы могут содержать действующие ссылки на ... " FOLDED="true" ID="ID_1250257488" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Веб-страницы" FOLDED="true" COLOR="#006699">
+<node TEXT="Веб-страницы" FOLDED="true" ID="ID_1354030307" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="http://www.google.com/" LINK="http://www.google.com/">
+<node TEXT="http://www.google.com/" ID="ID_1965338046" CREATED="1465678964149" MODIFIED="1465678964149" LINK="http://www.google.com/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="www.google.com" FOLDED="true" LINK="www.google.com">
+<node TEXT="www.google.com" FOLDED="true" ID="ID_1768670319" CREATED="1465678964149" MODIFIED="1465678964149" LINK="www.google.com">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Freeplane думает что это выполняемая программа :)" COLOR="#999999">
+<node TEXT="Freeplane думает что это выполняемая программа :)" ID="ID_1619837232" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
</node>
-<node TEXT="Локальные директории" FOLDED="true" COLOR="#006699">
+<node TEXT="Локальные директории" FOLDED="true" ID="ID_1812632757" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="C:/Program Files/" LINK="file:/C:/Program%20Files/">
+<node TEXT="C:/Program Files/" ID="ID_1890875794" CREATED="1465678964149" MODIFIED="1465678964149" LINK="file:/C:/Program%20Files/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="/home/" LINK="/home/">
+<node TEXT="/home/" ID="ID_1803158758" CREATED="1465678964149" MODIFIED="1465678964149" LINK="/home/">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Исполняемые файлы" FOLDED="true" COLOR="#006699">
+<node TEXT="Исполняемые файлы" FOLDED="true" ID="ID_711365469" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#006699">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="C:\WINNT\regedit.exe" FOLDED="true" LINK="file:/C:/WINNT/regedit.exe">
+<node TEXT="C:\WINNT\regedit.exe" FOLDED="true" ID="ID_1950937865" CREATED="1465678964149" MODIFIED="1465678964149" LINK="file:/C:/WINNT/regedit.exe">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Вы видите, что узел запускается по иконке." COLOR="#006600">
+<node TEXT="Вы видите, что узел запускается по иконке." ID="ID_1124731187" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#006600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node TEXT="Любой документ на вашем компьютере или в вашей сети">
+<node TEXT="Любой документ на вашем компьютере или в вашей сети" ID="ID_389044953" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Многострочные узлы" FOLDED="true" COLOR="#669900">
+<node TEXT="Многострочные узлы" FOLDED="true" ID="ID_74301321" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#669900">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Многострочные узлы могут состоять как из одного параграфа, так из нескольких. ЕD [...]
-<node TEXT=""Наука - это факты; как дома сделаны из камня, так и наука состоит из фактов; но куча C [...]
+<node TEXT="Многострочные узлы могут состоять как из одного параграфа, так из нескольких. ЕD [...]
+<node TEXT=""Наука - это факты; как дома сделаны из камня, так и наука состоит из фактов; но куча C [...]
</node>
-<node TEXT="Разделение многострочных узлов пустыми линиями" FOLDED="true" COLOR="#669900">
-<node TEXT="Линия,
и вторая,

и еще одна,
как вам это?"/>
+<node TEXT="Разделение многострочных узлов пустыми линиями" FOLDED="true" ID="ID_1279514682" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#669900">
+<node TEXT="Линия,
и вторая,

и еще одна,
как вам это?" ID="ID_1131351096" CREATED="1465678964149" MODIFIED="1465678964149"/>
</node>
-<node TEXT="Вы можете эмулировать подписанные дуги" FOLDED="true" COLOR="#669900">
-<node TEXT="Дерево" FOLDED="true">
+<node TEXT="Вы можете эмулировать подписанные дуги" FOLDED="true" ID="ID_857490845" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#669900">
+<node TEXT="Дерево" FOLDED="true" ID="ID_566051439" CREATED="1465678964149" MODIFIED="1465678964149">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="это" FOLDED="true" COLOR="#999999">
+<node TEXT="это" FOLDED="true" ID="ID_755557940" CREATED="1465678964149" MODIFIED="1465678964149" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node TEXT="Дуб">
+<node TEXT="Дуб" ID="ID_89728045" CREATED="1465678964164" MODIFIED="1465678964164">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="это" FOLDED="true" COLOR="#999999">
+<node TEXT="это" FOLDED="true" ID="ID_458943742" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node TEXT="Бук">
+<node TEXT="Бук" ID="ID_1190047507" CREATED="1465678964164" MODIFIED="1465678964164">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="это" FOLDED="true" COLOR="#999999">
+<node TEXT="это" FOLDED="true" ID="ID_740778021" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node TEXT="Вяз">
+<node TEXT="Вяз" ID="ID_225697908" CREATED="1465678964164" MODIFIED="1465678964164">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node TEXT="Дерево" FOLDED="true">
+<node TEXT="Дерево" FOLDED="true" ID="ID_1639187600" CREATED="1465678964164" MODIFIED="1465678964164">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="<>" FOLDED="true" COLOR="#999999">
+<node TEXT="<>" FOLDED="true" ID="ID_267347715" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node TEXT="Лист">
+<node TEXT="Лист" ID="ID_1597114265" CREATED="1465678964164" MODIFIED="1465678964164">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="<>" FOLDED="true" COLOR="#999999">
+<node TEXT="<>" FOLDED="true" ID="ID_582690594" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node TEXT="Труба">
+<node TEXT="Труба" ID="ID_1351577062" CREATED="1465678964164" MODIFIED="1465678964164">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node TEXT="В узлах можно использовать множество иконок" COLOR="#669900">
+<node TEXT="В узлах можно использовать множество иконок" ID="ID_660182604" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#669900">
<icon BUILTIN="knotify"/>
<icon BUILTIN="flag"/>
<icon BUILTIN="button_cancel"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="back"/>
</node>
-<node TEXT="А так же облака" FOLDED="true" COLOR="#407000">
-<cloud WIDTH="0"/>
-<node TEXT="Любых цветов">
-<cloud COLOR="#f1ede6" WIDTH="0"/>
+<node TEXT="А так же облака" FOLDED="true" ID="ID_515844599" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="Любых цветов" ID="ID_668076102" CREATED="1465678964164" MODIFIED="1465678964164">
+<cloud COLOR="#f1ede6" SHAPE="ARC"/>
</node>
</node>
-<node TEXT="Можете показывать связи графически" FOLDED="true" COLOR="#407000">
-<node TEXT="Соеденить узел">
-<arrowlink DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="Можете показывать связи графически" FOLDED="true" ID="ID_595215025" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
+<node TEXT="Соеденить узел" ID="ID_244990711" CREATED="1465678964164" MODIFIED="1465678964164">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="_Freeplane_Link_1249400461" TEXT="С другим">
-<arrowlink COLOR="#6600ff" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="С другим" ID="_Freeplane_Link_1249400461" CREATED="1465678964164" MODIFIED="1465678964164">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#6600ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="_Freeplane_Link_880551392" TEXT="Другого цвета">
-<arrowlink DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="Другого цвета" ID="_Freeplane_Link_880551392" CREATED="1465678964164" MODIFIED="1465678964164">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="82;44;" ENDINCLINATION="82;44;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node ID="_Freeplane_Link_1789233193" TEXT="Другим положением"/>
+<node TEXT="Другим положением" ID="_Freeplane_Link_1789233193" CREATED="1465678964164" MODIFIED="1465678964164"/>
</node>
-<node TEXT="Узлы можно располагать свободно" FOLDED="true" COLOR="#407000">
-<node TEXT="Один"/>
-<node TEXT="Другой"/>
+<node TEXT="Узлы можно располагать свободно" FOLDED="true" ID="ID_835070669" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
+<node TEXT="Один" ID="ID_670210287" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Другой" ID="ID_1915318259" CREATED="1465678964164" MODIFIED="1465678964164"/>
</node>
</node>
-<node TEXT="Создание и удалений узлов" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Чтобы создать узел-потомок, нажмите Insert."/>
-<node TEXT="Чтобы создать потомка, редактируя узел, нажмите Insert в процессе редактирования."/>
-<node TEXT="Чтобы создать узел-брат ниже, нажмите Enter."/>
-<node TEXT="Чтобы создать узел-брат выше, нажмите Shift + Enter."/>
-<node TEXT="Чтобы удалить узел, нажмите delete."/>
-<node TEXT="Чтобы "вырезать" узел с возможностью вставки, нажмите Control + X."/>
-<node TEXT="Или же используйте контекстное меню, кликая правой кнопкой мыши на узле."/>
+<node TEXT="Создание и удалений узлов" FOLDED="true" POSITION="right" ID="ID_880902071" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
+<node TEXT="Чтобы создать узел-потомок, нажмите Insert." ID="ID_1015547225" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Чтобы создать потомка, редактируя узел, нажмите Insert в процессе редактирования." ID="ID_1000828002" [...]
+<node TEXT="Чтобы создать узел-брат ниже, нажмите Enter." ID="ID_700571709" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Чтобы создать узел-брат выше, нажмите Shift + Enter." ID="ID_1348920854" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Чтобы удалить узел, нажмите delete." ID="ID_467521223" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Чтобы "вырезать" узел с возможностью вставки, нажмите Control + X." ID="ID_530242960" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Или же используйте контекстное меню, кликая правой кнопкой мыши на узле." ID="ID_550117916" CREATED="1465678964164" MODI [...]
</node>
-<node TEXT="Редактирование текста узла" FOLDED="true" POSITION="right" COLOR="#407000">
-<node ID="_Freeplane_Link_519923426" TEXT="Для редактирования, нажмите F2, HOME или кнопку END, или контекстное меню Редактиров [...]
-<arrowlink DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="Редактирование текста узла" FOLDED="true" POSITION="right" ID="ID_1398326501" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
+<node TEXT="Для редактирования, нажмите F2, HOME или кнопку END, или контекстное меню Редактировать. Д [...]
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Чтобы заменить текст в узле новым, просто начните печатать."/>
-<node TEXT="Для вызова полноценного редактора, нажмите Alt + Enter."/>
-<node TEXT="Чтобы разделить большой узел, используйте кнопку Разделить в редакторе, или наж [...]
-<node TEXT="Для перевода строки нажмите Control + Enter в редакторе. Строку нельзя перевести в обычном р [...]
-<arrowlink DESTINATION="_Freeplane_Link_1445647544" STARTINCLINATION="118;0;" ENDINCLINATION="118;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="Чтобы заменить текст в узле новым, просто начните печатать." ID="ID_915102592" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Для вызова полноценного редактора, нажмите Alt + Enter." ID="ID_307256306" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Чтобы разделить большой узел, используйте кнопку Разделить в редакторе, или наж [...]
+<node TEXT="Для перевода строки нажмите Control + Enter в редакторе. Строку нельзя перевести в обычном р [...]
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1445647544" STARTINCLINATION="118;0;" ENDINCLINATION="118;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Для копирования, как всегда, используйте правую кнопку мыши и выберите Копирова [...]
-<node TEXT="Для вставки спец-символов типа ©, введите их в своем любимом текстовом редакторе [...]
-<node ID="_Freeplane_Link_1445647544" TEXT="По-умолчанию, Enter заканчивает редактирование в редакторе, и Control + Enter вставляет нов&#x [...]
-<node TEXT="Freeplane полностью поддерживает юникод. Так что вы можете использовать любые скрипты, &#x [...]
+<node TEXT="Для копирования, как всегда, используйте правую кнопку мыши и выберите Копирова [...]
+<node TEXT="Для вставки спец-символов типа ©, введите их в своем любимом текстовом редакторе [...]
+<node TEXT="По-умолчанию, Enter заканчивает редактирование в редакторе, и Control + Enter вставляет новые стр [...]
+<node TEXT="Freeplane полностью поддерживает юникод. Так что вы можете использовать любые скрипты, &#x [...]
</node>
-<node TEXT="Форматирование узла" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Для выделения узла жирными, нажмите Ctrl + B.">
+<node TEXT="Форматирование узла" FOLDED="true" POSITION="right" ID="ID_1147184903" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
+<node TEXT="Для выделения узла жирными, нажмите Ctrl + B." ID="ID_1182930087" CREATED="1465678964164" MODIFIED="1465678964164">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для выделения куривом, нажмите Ctrl + I.">
+<node TEXT="Для выделения куривом, нажмите Ctrl + I." ID="ID_564454585" CREATED="1465678964164" MODIFIED="1465678964164">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12" ITALIC="false"/>
</node>
-<node TEXT="Для изменения цвета текста, нажмите Alt + C.">
+<node TEXT="Для изменения цвета текста, нажмите Alt + C." ID="ID_906883481" CREATED="1465678964164" MODIFIED="1465678964164">
+<icon BUILTIN="help"/>
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
-<icon BUILTIN="help"/>
</node>
-<node TEXT="Для изменения цвета фона, используйте контекстное меню Формат > Фоновй цвет узл&# [...]
-<node TEXT="Для увеличения размера узла, нажмите Control + плюс (не тот плюс что на цифровой клавиату& [...]
+<node TEXT="Для изменения цвета фона, используйте контекстное меню Формат > Фоновй цвет узл&# [...]
+<node TEXT="Для увеличения размера узла, нажмите Control + плюс (не тот плюс что на цифровой клавиату& [...]
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для уменьшения размера узла, нажмите Control + минус (не минус цифровой клавиатуры).">
+<node TEXT="Для уменьшения размера узла, нажмите Control + минус (не минус цифровой клавиатуры)." ID="ID_1713485846" CREATED=" [...]
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для изменения типа шрифта, используйте список в главном меню."/>
-<node TEXT="Для копирования формата узла, нажмите Alt + C">
-<font NAME="Aharoni" SIZE="12"/>
+<node TEXT="Для изменения типа шрифта, используйте список в главном меню." ID="ID_265595097" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Для копирования формата узла, нажмите Alt + C" ID="ID_1551502912" CREATED="1465678964164" MODIFIED="1465678964164">
<icon BUILTIN="help"/>
-</node>
-<node TEXT="Для применения формата, нажмите Alt + V.">
<font NAME="Aharoni" SIZE="12"/>
+</node>
+<node TEXT="Для применения формата, нажмите Alt + V." ID="ID_51785204" CREATED="1465678964164" MODIFIED="1465678964164">
<icon BUILTIN="help"/>
+<font NAME="Aharoni" SIZE="12"/>
</node>
</node>
-<node TEXT="Использование уведомительных стилей" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Для применения такого стиля, выберите в контекстном меню Стиль > Стиль на ваш выб [...]
-<node TEXT="Для добавления собственного стиля, для опытных пользователей, отредактируйте & [...]
-<node TEXT="[This paragraph is outdated.] A remark on the file patterns.xml follows. Physical style applies to node, if there is a <node> tag. It applies to edge, if there is an <edge> tag. <node> tag can have tag as a child. Study the file "patterns.xml" supplied with Freeplane."/>
+<node TEXT="Использование уведомительных стилей" FOLDED="true" POSITION="right" ID="ID_1239157901" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
+<node TEXT="Для применения такого стиля, выберите в контекстном меню Стиль > Стиль на ваш выб [...]
+<node TEXT="Для добавления собственного стиля, для опытных пользователей, отредактируйте & [...]
+<node TEXT="[This paragraph is outdated.] A remark on the file patterns.xml follows. Physical style applies to node, if there is a <node> tag. It applies to edge, if there is an <edge> tag. <node> tag can have tag as a child. Study the file "patterns.xml" supplied with Freeplane." ID="ID_1083273256" CREATED="1465678964164" MODIFIED="1465678964164"/>
</node>
-<node TEXT="Обрамление узлов облаками" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Облака хороши для выделения областей. Выделяется узел и все его потомки."/>
-<node TEXT="Чтобы появилось облаго, нажмите Ctrl + Shift + B или в контекстном меню Вставка > Облако."/>
-<node TEXT="Для изменения цвета облака, используйте контекстное меню Формат > Цвет облака."/>
-<node TEXT="У облаков могут быть различные фоновые цвета, например зеленый ..." FOLDED="true">
-<cloud COLOR="#e1f2e1" WIDTH="0"/>
-<node TEXT="... или коричневый.">
-<cloud COLOR="#ede5d5" WIDTH="0"/>
+<node TEXT="Обрамление узлов облаками" FOLDED="true" POSITION="right" ID="ID_193909392" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
+<node TEXT="Облака хороши для выделения областей. Выделяется узел и все его потомки." ID="ID_1960303157" CREATED="1465678964164" MOD [...]
+<node TEXT="Чтобы появилось облаго, нажмите Ctrl + Shift + B или в контекстном меню Вставка > Облако." ID="ID_288691101" CREATED="14656 [...]
+<node TEXT="Для изменения цвета облака, используйте контекстное меню Формат > Цвет облака." ID="ID_ [...]
+<node TEXT="У облаков могут быть различные фоновые цвета, например зеленый ..." FOLDED="true" ID="ID_296227292" CREATED="1465678964164" MODIFIED="1465678964164">
+<cloud COLOR="#e1f2e1" SHAPE="ARC"/>
+<node TEXT="... или коричневый." ID="ID_68557507" CREATED="1465678964164" MODIFIED="1465678964164">
+<cloud COLOR="#ede5d5" SHAPE="ARC"/>
</node>
</node>
</node>
-<node TEXT="Добавление гиперссылок" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Чтобы добавить гиперссылку, нажмите Ctrl + K или в контекстном меню узла Вставка > Сслы [...]
-<node TEXT="Для удаления ссылки, после нажатия Ctrl + K оставьте поле пустым."/>
-<node TEXT="Для ссылки на e-мэйл адресс, сделайте ссылку вида: 

 mailto:reciever at somemail.com.">
+<node TEXT="Добавление гиперссылок" FOLDED="true" POSITION="right" ID="ID_1281219306" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
+<node TEXT="Чтобы добавить гиперссылку, нажмите Ctrl + K или в контекстном меню узла Вставка > Сслы [...]
+<node TEXT="Для удаления ссылки, после нажатия Ctrl + K оставьте поле пустым." ID="ID_915305392" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Для ссылки на e-мэйл адресс, сделайте ссылку вида: 

 mailto:reciever at somemail.com." ID="ID_1422664881" CREATED="1465678964164" MODIFIED="1465678964164">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для e-мэйл ссылки с заданной темой письма, сделайте ссылку вида: 

 mailto:reciever at somemail.com?subject=Тема ваше [...]
-<node TEXT="Ссылки могут быть на веб-страницы, локальные файлы, или е-мэйл адреса."/>
+<node TEXT="Для e-мэйл ссылки с заданной темой письма, сделайте ссылку вида: 

 mailto:reciever at somemail.com?subject=Тема ваше [...]
+<node TEXT="Ссылки могут быть на веб-страницы, локальные файлы, или е-мэйл адреса." ID="ID_1955910171" CREATED="1465678964164" MODIFIED="1465678964164"/>
</node>
-<node TEXT="Добавление иконок" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Добавление иконок" FOLDED="true" POSITION="right" ID="ID_1135868803" CREATED="1465678964164" MODIFIED="1465678964164" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Узел может иметь несколько иконок. "/>
-<node TEXT="Для добавлени иконки к узле, выберите узел и нажмите на одну из иконок, изображен&#x [...]
-<node TEXT="Для удаления одной иконки, нажмите на красный крест на верху панели иконок. "/>
-<node TEXT="Для удаления всех иконок, нажмите на "корзину" на верху панели иконок."/>
-<node TEXT="Для добавления новой иконки без использования панели, нажмите Alt + I.">
-<font NAME="Aharoni" SIZE="12"/>
+<node TEXT="Узел может иметь несколько иконок. " ID="ID_1356402012" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Для добавлени иконки к узле, выберите узел и нажмите на одну из иконок, изображен&#x [...]
+<node TEXT="Для удаления одной иконки, нажмите на красный крест на верху панели иконок. " ID="ID_128151902" CREATED [...]
+<node TEXT="Для удаления всех иконок, нажмите на "корзину" на верху панели иконок." ID="ID_1099603351" CREATED="1465678964164" MODIFIED="1465678964164"/>
+<node TEXT="Для добавления новой иконки без использования панели, нажмите Alt + I." ID="ID_464243884" CREATED="1465678964164" MODIFIED="1465678964164">
<icon BUILTIN="help"/>
+<font NAME="Aharoni" SIZE="12"/>
</node>
-<node TEXT="Пока невозможно использовать собственные иконки; вы можете выбирать только из [...]
-<node TEXT="Чтобы показать или убрать панель иконок, в контекстном меню фона (не узла или дуг&#x [...]
-<node TEXT="Доступны иконки находящиеся в этом узле, и многие другие.">
+<node TEXT="Пока невозможно использовать собственные иконки; вы можете выбирать только из [...]
+<node TEXT="Чтобы показать или убрать панель иконок, в контекстном меню фона (не узла или дуг&#x [...]
+<node TEXT="Доступны иконки находящиеся в этом узле, и многие другие." ID="ID_1120278361" CREATED="1465678964180" MODIFIED="1465678964180">
<icon BUILTIN="help"/>
<icon BUILTIN="messagebox_warning"/>
<icon BUILTIN="idea"/>
@@ -590,376 +682,321 @@
<icon BUILTIN="licq"/>
</node>
</node>
-<node TEXT="Добавление графических связей" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Для создания связи между двумя узлами, перетащите и отпустите один узел на другC [...]
-<arrowlink DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="255;0;" ENDINCLINATION="255;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="Добавление графических связей" FOLDED="true" POSITION="right" ID="ID_1498284271" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
+<node TEXT="Для создания связи между двумя узлами, перетащите и отпустите один узел на другC [...]
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="255;0;" ENDINCLINATION="255;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Или, можно выбрать 2 узла используя Ctrl и нажав "Добавить связь" из пункти "Вставка" &# [...]
-<node TEXT="Для изменения цвета связи, используйте контекстное меню связи, нажав правой кно [...]
+<node TEXT="Или, можно выбрать 2 узла используя Ctrl и нажав "Добавить связь" из пункти "Вставка" &# [...]
+<node TEXT="Для изменения цвета связи, используйте контекстное меню связи, нажав правой кно [...]
<font ITALIC="false"/>
</node>
-<node TEXT="Для изменения направления связи, используйте ее контекстное меню."/>
-<node TEXT="Для удаления связи, используйте ее контекстное меню,"/>
-<node ID="_Freeplane_Link_266716332" TEXT="Для перемещения к одному из связанных узлов, используйте контекстное менD [...]
-<node TEXT="Для изменения положения связи, захватите ее мышкой и двигайте.">
-<arrowlink DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="244;32;" ENDINCLINATION="256;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="Для изменения направления связи, используйте ее контекстное меню." ID="ID_800860835" CREATED="1465678964180" MODIFIED="1465678964180"/>
+<node TEXT="Для удаления связи, используйте ее контекстное меню," ID="ID_487273636" CREATED="1465678964180" MODIFIED="1465678964180"/>
+<node TEXT="Для перемещения к одному из связанных узлов, используйте контекстное меню связ [...]
+<node TEXT="Для изменения положения связи, захватите ее мышкой и двигайте." ID="ID_1591797016" CREATED="1465678964180" MODIFIED="1465678964180">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="244;32;" ENDINCLINATION="256;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Здесь вы видите примеры использования графических связей."/>
-<node TEXT="Например" FOLDED="true" COLOR="#996600">
-<node ID="_Freeplane_Link_1170112929" TEXT="Связь с другой частью" COLOR="#996600">
-<arrowlink COLOR="#9999ff" DESTINATION="_Freeplane_Link_1492563156" STARTINCLINATION="30;0;" ENDINCLINATION="127;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
+<node TEXT="Здесь вы видите примеры использования графических связей." ID="ID_663803245" CREATED="1465678964180" MODIFIED="1465678964180"/>
+<node TEXT="Например" FOLDED="true" ID="ID_1330201021" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
+<node TEXT="Связь с другой частью" ID="_Freeplane_Link_1170112929" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#9999ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1492563156" STARTINCLINATION="30;0;" ENDINCLINATION="127;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
</node>
-<node TEXT="Узел с под-узлом" FOLDED="true" COLOR="#996600">
-<node ID="_Freeplane_Link_1492563156" TEXT="Под-узел"/>
+<node TEXT="Узел с под-узлом" FOLDED="true" ID="ID_564059070" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
+<node TEXT="Под-узел" ID="_Freeplane_Link_1492563156" CREATED="1465678964180" MODIFIED="1465678964180"/>
</node>
-<node TEXT="Другая связь" COLOR="#996600">
-<arrowlink DESTINATION="_Freeplane_Link_1170112929" STARTINCLINATION="61;0;" ENDINCLINATION="61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<node TEXT="Другая связь" ID="ID_1365322687" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1170112929" STARTINCLINATION="61;0;" ENDINCLINATION="61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
-<node TEXT="Поиск" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Поиск" FOLDED="true" POSITION="right" ID="ID_1844143957" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Для нахождения текста среди всех потомков узла, нажмите Ctrl + F или в меню "Правка" - Ис&#x [...]
+<node TEXT="Для нахождения текста среди всех потомков узла, нажмите Ctrl + F или в меню "Правка" - Ис&#x [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для перехода к следущейй найденной строке, нажмите Ctrl + G или в меню "Правка" Искать C [...]
+<node TEXT="Для перехода к следущейй найденной строке, нажмите Ctrl + G или в меню "Правка" Искать C [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для поиска по всей карте, выберите центральный узел, нажав Escape перед поиском."/>
-<node TEXT="Поиск работает по алгоритму поиск в ширину. Это соответствует идее - чем глубже у&#x [...]
-<node TEXT="Помните, что по-умолчанию поиск идет не по всей карте, только в узле и его потомках."/>
+<node TEXT="Для поиска по всей карте, выберите центральный узел, нажав Escape перед поиском." ID="ID_648221339" CREATED="14656789641 [...]
+<node TEXT="Поиск работает по алгоритму поиск в ширину. Это соответствует идее - чем глубже у&#x [...]
+<node TEXT="Помните, что по-умолчанию поиск идет не по всей карте, только в узле и его потомках. [...]
</node>
-<node TEXT="Выбор нескольких узлов" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Выбор нескольких узлов" FOLDED="true" POSITION="right" ID="ID_1924365070" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Для выделения нескольких узлов, зажмите control или shift, и кликайте на узлы.">
+<node TEXT="Для выделения нескольких узлов, зажмите control или shift, и кликайте на узлы." ID="ID_744687888" CREATED="1465678964180" MODIFIED="1465678964180">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для добавления отдельных узлов, удерживайте control пока кликаете по ним.">
+<node TEXT="Для добавления отдельных узлов, удерживайте control пока кликаете по ним." ID="ID_1810607805" CREATED="1465678964180" MODIFIED="1465678964180">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для выделения радом расположенных узлов, удерживайте shift и кликайте по ним, или уде [...]
+<node TEXT="Для выделения радом расположенных узлов, удерживайте shift и кликайте по ним, или уде [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для выбора всего поддерева, зажмите AltGr перед выбором узла, или shift и пройдите стрелка [...]
+<node TEXT="Для выбора всего поддерева, зажмите AltGr перед выбором узла, или shift и пройдите стрелка [...]
<icon BUILTIN="help"/>
</node>
-<node TEXT="Для отмены выделения нескольких узлов, кликните на фоне карты или на невыделенн [...]
+<node TEXT="Для отмены выделения нескольких узлов, кликните на фоне карты или на невыделенн [...]
</node>
-<node TEXT="Перетаскивание" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Перетаскивание" FOLDED="true" POSITION="right" ID="ID_993839636" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Вы можете перемещать узлы перетаскивая их мышью.">
+<node TEXT="Вы можете перемещать узлы перетаскивая их мышью." ID="ID_1254193603" CREATED="1465678964180" MODIFIED="1465678964180">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для вставки узла как потомка, держите курсор на "выходящей" части узла, когда отп [...]
+<node TEXT="Для вставки узла как потомка, держите курсор на "выходящей" части узла, когда отп [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для вставки узла как брата, держите курсор со стороны его связи с предыдущим узл [...]
+<node TEXT="Для вставки узла как брата, держите курсор со стороны его связи с предыдущим узл [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для копирования а не перемещения узла, удерживайте control при перетаскивании , или пе [...]
+<node TEXT="Для копирования а не перемещения узла, удерживайте control при перетаскивании , или пе [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Для редактирования существующей схемы, перетащите ее файл на фон Freeplane; пока это раб&# [...]
-<node TEXT="Для создания графической связи, перетаскивайте удерживая правую кнопку мыши.">
-<font NAME="Aharoni" SIZE="12"/>
+<node TEXT="Для редактирования существующей схемы, перетащите ее файл на фон Freeplane; пока это раб&# [...]
+<node TEXT="Для создания графической связи, перетаскивайте удерживая правую кнопку мыши." ID="ID [...]
<icon BUILTIN="help"/>
+<font NAME="Aharoni" SIZE="12"/>
</node>
-<node TEXT="Если вы выделили несколько узлов, то они все будут скопированы/перемещены.">
+<node TEXT="Если вы выделили несколько узлов, то они все будут скопированы/перемещены." ID="ID_434626436" CREATED="14656 [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Вы можете перетаскивать данные из внешних приложений, например из файлов в Microsoft Windows, и& [...]
+<node TEXT="Вы можете перетаскивать данные из внешних приложений, например из файлов в Microsoft Windows, и& [...]
</node>
-<node TEXT="Копирование и вставка" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Копирование и вставка" FOLDED="true" POSITION="right" ID="ID_1399170375" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Вы можете копировать и вставлять узлы в разные схемы. А так же вы можете вставлят&#x [...]
+<node TEXT="Вы можете копировать и вставлять узлы в разные схемы. А так же вы можете вставлят&#x [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Если вы вставляете простой текст, несколько строк интерпретируются как нескол& [...]
-<node TEXT="Дерево
     Дуб
     Вяз
     " FOLDED="true" COLOR="#996600">
-<node TEXT="вставляется как" FOLDED="true">
+<node TEXT="Если вы вставляете простой текст, несколько строк интерпретируются как нескол& [...]
+<node TEXT="Дерево
     Дуб
     Вяз
     " FOLDED="true" ID="ID_704146567" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
+<node TEXT="вставляется как" FOLDED="true" ID="ID_105147350" CREATED="1465678964180" MODIFIED="1465678964180">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Дерево" FOLDED="true" COLOR="#996600">
+<node TEXT="Дерево" FOLDED="true" ID="ID_981410752" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Дуб" COLOR="#996600">
+<node TEXT="Дуб" ID="ID_234833076" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Вяз" COLOR="#996600">
+<node TEXT="Вяз" ID="ID_1734246965" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node TEXT="Если вы вставляете HTML-текст, он вставится как обычный текст. Так же, ссылки содержаD [...]
-<node TEXT="Например после вставки:" FOLDED="true">
+<node TEXT="Если вы вставляете HTML-текст, он вставится как обычный текст. Так же, ссылки содержаD [...]
+<node TEXT="Например после вставки:" FOLDED="true" ID="ID_1042647240" CREATED="1465678964180" MODIFIED="1465678964180">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Покупки (120236)">
+<node TEXT="Покупки (120236)" ID="ID_1236393652" CREATED="1465678964180" MODIFIED="1465678964180">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Городская жизнь (4)">
+<node TEXT="Городская жизнь (4)" ID="ID_1437644770" CREATED="1465678964180" MODIFIED="1465678964180">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Ссылки" FOLDED="true">
+<node TEXT="Ссылки" FOLDED="true" ID="ID_1426020357" CREATED="1465678964180" MODIFIED="1465678964180">
<font NAME="Dialog" SIZE="12" BOLD="true"/>
-<node TEXT="Покупки" LINK="http://www.google.ru/Top/World/Russian/%D0%9F%D0%BE%D0%BA%D1%83%D0%BF%D0%BA%D0%B8/">
+<node TEXT="Покупки" ID="ID_593587995" CREATED="1465678964180" MODIFIED="1465678964180" LINK="http://www.google.ru/Top/World/Russian/%D0%9F%D0%BE%D0%BA%D1%83%D0%BF%D0%BA%D0%B8/">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Городская жизнь" LINK="http://www.google.ru/Top/World/Russian/%D0%94%D0%BE%D0%BC/%D0%93%D0%BE%D1%80%D0%BE%D0%B4%D1%81%D0%BA%D0%B0%D1%8F_%D0%B6%D0%B8%D0%B7%D0%BD%D1%8C/">
+<node TEXT="Городская жизнь" ID="ID_639002268" CREATED="1465678964180" MODIFIED="1465678964180" LINK="http://www.google.ru/Top/World/Russian/%D0%94%D0%BE%D0%BC/%D0%93%D0%BE%D1%80%D0%BE%D0%B4%D1%81%D0%BA%D0%B0%D1%8F_%D0%B6%D0%B8%D0%B7%D0%BD%D1%8C/">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node TEXT="Если вы вставите список файлов, выбранный в Проводнике в Microsoft Windows, он вставится как гру [...]
-<node TEXT="Если вы скопируете ветвь из Freeplane и вставите в обычный текстовый редактор, структур&#x [...]
-<node TEXT="Дерево" FOLDED="true" COLOR="#996600">
+<node TEXT="Если вы вставите список файлов, выбранный в Проводнике в Microsoft Windows, он вставится как гру [...]
+<node TEXT="Если вы скопируете ветвь из Freeplane и вставите в обычный текстовый редактор, структур&#x [...]
+<node TEXT="Дерево" FOLDED="true" ID="ID_1818027039" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Дуб" COLOR="#996600">
+<node TEXT="Дуб" ID="ID_1255463808" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Вяз" FOLDED="true" COLOR="#996600">
+<node TEXT="Вяз" FOLDED="true" ID="ID_1848001572" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="is pasted as" FOLDED="true">
+<node TEXT="is pasted as" FOLDED="true" ID="ID_1433136242" CREATED="1465678964180" MODIFIED="1465678964180">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Дерево
     Дуб
     Вяз
     Гугл <http://www.google.com/>" COLOR="#996600">
+<node TEXT="Дерево
     Дуб
     Вяз
     Гугл <http://www.google.com/>" ID="ID_1696955848" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
</node>
-<node TEXT="Гугл" COLOR="#996600" LINK="http://www.google.com/">
+<node TEXT="Гугл" ID="ID_1403876923" CREATED="1465678964180" MODIFIED="1465678964180" LINK="http://www.google.com/" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Если в Freeplane вы скопируете ветвь и вставите ее в редактор, понимающий формат Rich Text, сохраC [...]
-<node TEXT="Для копирования узла без его зависимостей, нажмите Ctrl + Y или в контекстном меню Коп [...]
+<node TEXT="Если в Freeplane вы скопируете ветвь и вставите ее в редактор, понимающий формат Rich Text, сохраC [...]
+<node TEXT="Для копирования узла без его зависимостей, нажмите Ctrl + Y или в контекстном меню Коп [...]
</node>
-<node TEXT="Перемещение" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Для перемещения выделения вверх, вниз, влево или вправо, используйте стрелки клC [...]
-<node TEXT="Для перемещения к верхнему узлу текущего поддерева, нажмите PageUp."/>
-<node TEXT="Для перемещения к нижнему узлу текущего дерева, нажмите PageDown."/>
-<node TEXT="Для перемещения к Центральному узлу, нажмите Escape."/>
-<node TEXT="Для свободного перемещения узлов, хватайте их за невидимую ручку расположенну& [...]
+<node TEXT="Перемещение" FOLDED="true" POSITION="right" ID="ID_157446099" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
+<node TEXT="Для перемещения выделения вверх, вниз, влево или вправо, используйте стрелки клC [...]
+<node TEXT="Для перемещения к верхнему узлу текущего поддерева, нажмите PageUp." ID="ID_121058942" CREATED="1465678964180" MODIFIED="1465678964180"/>
+<node TEXT="Для перемещения к нижнему узлу текущего дерева, нажмите PageDown." ID="ID_1536065862" CREATED="1465678964180" MODIFIED="1465678964180"/>
+<node TEXT="Для перемещения к Центральному узлу, нажмите Escape." ID="ID_731285289" CREATED="1465678964180" MODIFIED="1465678964180"/>
+<node TEXT="Для свободного перемещения узлов, хватайте их за невидимую ручку расположенну& [...]
</node>
-<node TEXT="Сворачивание и разворачивание" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Для сворачивания узла, нажмите пробел, или в контекстном меню Свернуть/Разверну [...]
-<node TEXT="Для разворачивания узла, нажмите пробел, или в контекстном меню Развернуть, или  [...]
-<font NAME="Aharoni" SIZE="12"/>
+<node TEXT="Сворачивание и разворачивание" FOLDED="true" POSITION="right" ID="ID_1949236452" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
+<node TEXT="Для сворачивания узла, нажмите пробел, или в контекстном меню Свернуть/Разверну [...]
+<node TEXT="Для разворачивания узла, нажмите пробел, или в контекстном меню Развернуть, или  [...]
<icon BUILTIN="help"/>
+<font NAME="Aharoni" SIZE="12"/>
</node>
-<node TEXT="Для сворачивания/разворачивания всех узлов, зажмите Alt и поворачивайте колесо м [...]
-<node TEXT="Для разворачивания всего, нажмите кнопку "Разворачивает все узлы" на главной п&# [...]
-<node TEXT="Для сворачивания всех узлов, нажмите "Сворачивает выбранные узлы" на главной п&# [...]
-<node TEXT="Разворачиваемые узлы помечены маленьким кружком со стороны разворачивания."/>
+<node TEXT="Для сворачивания/разворачивания всех узлов, зажмите Alt и поворачивайте колесо м [...]
+<node TEXT="Для разворачивания всего, нажмите кнопку "Разворачивает все узлы" на главной п&# [...]
+<node TEXT="Для сворачивания всех узлов, нажмите "Сворачивает выбранные узлы" на главной п&# [...]
+<node TEXT="Разворачиваемые узлы помечены маленьким кружком со стороны разворачивания." ID="ID_1 [...]
</node>
-<node TEXT="Переключение схем" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Переключение схем" FOLDED="true" POSITION="right" ID="ID_1688158787" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Для переключения к другой открытой схеме, кликните правой кнопкой мыши на фоне C [...]
+<node TEXT="Для переключения к другой открытой схеме, кликните правой кнопкой мыши на фоне C [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Прокрутка схемы" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Прокрутка схемы" FOLDED="true" POSITION="right" ID="ID_93513736" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Для прокрутки схем перетаскивайте фон, или используйте колесо мыши. Для горирон [...]
+<node TEXT="Для прокрутки схем перетаскивайте фон, или используйте колесо мыши. Для горирон [...]
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Масштабирование" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Для масштабирования, используйте колесо мыши с зажатой клавишей control, или нажмите Alt + [...]
+<node TEXT="Масштабирование" FOLDED="true" POSITION="right" ID="ID_274077691" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
+<node TEXT="Для масштабирования, используйте колесо мыши с зажатой клавишей control, или нажмите Alt + [...]
</node>
-<node TEXT="Использование отмены" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Для отмены предыдущего действия нажмите Control + Z, или в выпадающем меню Правка > Отмен [...]
-<node TEXT="Для восстановления (отмена отмены), нажмите Control + Y, или в выпадающем меню Правка > Верн& [...]
-<node TEXT="Для установки количества возможных отмен, используйте меню Дополнительно > Ус [...]
+<node TEXT="Использование отмены" FOLDED="true" POSITION="right" ID="ID_1044185006" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
+<node TEXT="Для отмены предыдущего действия нажмите Control + Z, или в выпадающем меню Правка > Отмен [...]
+<node TEXT="Для восстановления (отмена отмены), нажмите Control + Y, или в выпадающем меню Правка > Верн& [...]
+<node TEXT="Для установки количества возможных отмен, используйте меню Дополнительно > Ус [...]
</node>
-<node TEXT="Экспорт в HTML" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Экспорт в HTML" FOLDED="true" POSITION="right" ID="ID_1014046754" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Для экспорта ветви в HTML, нажмите Control + H. Експортированная HTML страница может сворачивать [...]
-<node TEXT="Так же можно экспортировать через меню Файл > Экспортировать > Как XHTML (использова& [...]
-<node TEXT="Для экспортирования схемы с просмотром картинок в HTML, используйте Файл > ЭкспортC [...]
+<node TEXT="Для экспорта ветви в HTML, нажмите Control + H. Експортированная HTML страница может сворачивать [...]
+<node TEXT="Так же можно экспортировать через меню Файл > Экспортировать > Как XHTML (использова& [...]
+<node TEXT="Для экспортирования схемы с просмотром картинок в HTML, используйте Файл > ЭкспортC [...]
</node>
-<node TEXT="Экспорт в растровое или векторное изображение" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Для экспорта в PNG картинку, используйте Файл > Экспортировать > Как PNG."/>
-<node TEXT="Для экспорта в JPEG картинку, используйте Файл > Экспортировать > Как JPEG."/>
-<node TEXT="Для экспорта в SVG, используйте Файл > Экспортировать > Как SVG. Эта функция доступна то&# [...]
+<node TEXT="Экспорт в растровое или векторное изображение" FOLDED="true" POSITION="right" ID="ID_922982228" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
+<node TEXT="Для экспорта в PNG картинку, используйте Файл > Экспортировать > Как PNG." ID="ID_1866865992" CREATED="1465678964180" MODIFIED="1465678964180"/>
+<node TEXT="Для экспорта в JPEG картинку, используйте Файл > Экспортировать > Как JPEG." ID="ID_1359116012" CREATED="1465678964180" MODIFIED="1465678964180"/>
+<node TEXT="Для экспорта в SVG, используйте Файл > Экспортировать > Как SVG. Эта функция доступна то&# [...]
</node>
-<node TEXT="Экспортирование в другие XML форматы" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Для экспорта в другой XML формат у вас есть преобразующая XSLT таблица, в меню Файл > Экс [...]
-<node TEXT="Для экспорта в OpenOffice 1.4 Writer документ, используйте Файл > Экспортировать > Как OpenOffice Writer Document."/>
+<node TEXT="Экспортирование в другие XML форматы" FOLDED="true" POSITION="right" ID="ID_765689910" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
+<node TEXT="Для экспорта в другой XML формат у вас есть преобразующая XSLT таблица, в меню Файл > Экс [...]
+<node TEXT="Для экспорта в OpenOffice 1.4 Writer документ, используйте Файл > Экспортировать > Как OpenOffice Writer Document." ID="ID_528451724" CREATED="1465678964180" MODI [...]
</node>
-<node TEXT="Импорт структуры каталогов" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Импорт структуры каталогов" FOLDED="true" POSITION="right" ID="ID_1647202362" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node TEXT="Для импорта структуры каталогов, в контекстном меню узла Файл > Импортировать >  [...]
-<node TEXT="Например" FOLDED="true" COLOR="#996600">
+<node TEXT="Для импорта структуры каталогов, в контекстном меню узла Файл > Импортировать >  [...]
+<node TEXT="Например" FOLDED="true" ID="ID_424846874" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Выбранная директория" FOLDED="true" COLOR="#996600">
+<node TEXT="Выбранная директория" FOLDED="true" ID="ID_438469712" CREATED="1465678964180" MODIFIED="1465678964180" COLOR="#996600">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps" LINK="file:/C:/Program%2520Files/Microsoft%2520Office/Office/Bitmaps">
+<node TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps" ID="ID_1400550099" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%2520Files/Microsoft%2520Office/Office/Bitmaps">
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
-<node TEXT="Dbwiz" FOLDED="true" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/">
-<node TEXT="ASSETS.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ASSETS.GIF"/>
-<node TEXT="CONTACTS.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF"/>
-<node TEXT="EVTMGMT.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF"/>
-<node TEXT="EXPENSES.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF"/>
-<node TEXT="INVENTRY.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF"/>
-<node TEXT="LEDGER.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/LEDGER.GIF"/>
-<node TEXT="ORDPROC.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF"/>
-<node TEXT="RESOURCE.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF"/>
-<node TEXT="SERVICE.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/SERVICE.GIF"/>
-<node TEXT="TIMEBILL.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF"/>
+<node TEXT="Dbwiz" FOLDED="true" ID="ID_334987346" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/">
+<node TEXT="ASSETS.GIF" ID="ID_1574236167" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ASSETS.GIF"/>
+<node TEXT="CONTACTS.GIF" ID="ID_170882892" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF"/>
+<node TEXT="EVTMGMT.GIF" ID="ID_83688689" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF"/>
+<node TEXT="EXPENSES.GIF" ID="ID_363195105" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF"/>
+<node TEXT="INVENTRY.GIF" ID="ID_438545983" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF"/>
+<node TEXT="LEDGER.GIF" ID="ID_841962110" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/LEDGER.GIF"/>
+<node TEXT="ORDPROC.GIF" ID="ID_78251551" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF"/>
+<node TEXT="RESOURCE.GIF" ID="ID_1075211998" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF"/>
+<node TEXT="SERVICE.GIF" ID="ID_1772058328" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/SERVICE.GIF"/>
+<node TEXT="TIMEBILL.GIF" ID="ID_556596407" CREATED="1465678964180" MODIFIED="1465678964180" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF"/>
</node>
-<node TEXT="Styles" FOLDED="true" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/">
-<node TEXT="ACBLENDS.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
-<node TEXT="ACBLUPRT.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
-<node TEXT="ACEXPDTN.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
-<node TEXT="ACINDSTR.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
-<node TEXT="ACRICEPR.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
-<node TEXT="ACSNDSTN.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
-<node TEXT="ACSUMIPT.GIF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
-<node TEXT="GLOBE.WMF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
-<node TEXT="STONE.BMP" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
+<node TEXT="Styles" FOLDED="true" ID="ID_462621782" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/">
+<node TEXT="ACBLENDS.GIF" ID="ID_74816487" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
+<node TEXT="ACBLUPRT.GIF" ID="ID_437989461" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
+<node TEXT="ACEXPDTN.GIF" ID="ID_1033984292" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
+<node TEXT="ACINDSTR.GIF" ID="ID_897349824" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
+<node TEXT="ACRICEPR.GIF" ID="ID_1059332571" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
+<node TEXT="ACSNDSTN.GIF" ID="ID_1025661239" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
+<node TEXT="ACSUMIPT.GIF" ID="ID_1531243641" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
+<node TEXT="GLOBE.WMF" ID="ID_876408471" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_1390883597" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
</node>
</node>
</node>
-<node TEXT="Импортирование закладок из Internet Explorer" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Импортирование закладок из Internet Explorer" FOLDED="true" POSITION="right" ID="ID_223016620" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
<edge WIDTH="thin"/>
-<node TEXT="Для импортирования закладок Internet Explorer в Freeplane, используйте Файл > Импортировать > Закладки [...]
-<node TEXT="Ключевые слова: Microsoft Internet Explorer, MSIE, MS IE." COLOR="#999999">
+<node TEXT="Для импортирования закладок Internet Explorer в Freeplane, используйте Файл > Импортировать > Закладки [...]
+<node TEXT="Ключевые слова: Microsoft Internet Explorer, MSIE, MS IE." ID="ID_1550525996" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node TEXT="Импортирование схем MindManager X5" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Чтобы импортировать схему из MindManager X5 используйте Файл > Импортировать > Карта для MindManager X5."/>
+<node TEXT="Импортирование схем MindManager X5" FOLDED="true" POSITION="right" ID="ID_1133154339" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#407000">
+<node TEXT="Чтобы импортировать схему из MindManager X5 используйте Файл > Импортировать > Карта для MindManager X5." ID [...]
</node>
-<node TEXT="Интеграция с Word или Outlook" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Интеграция с Word или Outlook" FOLDED="true" POSITION="right" ID="ID_1343231908" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Вы можете вставлять схемы или ветви в Microsoft Word, Wordpad или Outlook. Вобще, вы можете вставлять их в люC [...]
+<node TEXT="Вы можете вставлять схемы или ветви в Microsoft Word, Wordpad или Outlook. Вобще, вы можете вставлять их в люC [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Нажатие на ссылке (mailto:don.bonton at supermail.com) откроет Outlook для написания нового письма, если в Windows не устаноC [...]
+<node TEXT="Нажатие на ссылке (mailto:don.bonton at supermail.com) откроет Outlook для написания нового письма, если в Windows не устаноC [...]
<font NAME="SansSerif" SIZE="12"/>
</node>
-<node TEXT="Вы можете указывать Тему письма в ссылке." LINK="mailto:don.bonton at supermail.com?subject=Last%20phone%20call"/>
-<node TEXT="Так же можно экспортировать схемы в Microsoft Word, экспортируя вначале в HTML, а затем копируя HTML и [...]
+<node TEXT="Вы можете указывать Тему письма в ссылке." ID="ID_313789469" CREATED="1465678964195" MODIFIED="1465678964195" LINK="mailto:don.bonton at supermail.com?subject=Last%20phone%20call"/>
+<node TEXT="Так же можно экспортировать схемы в Microsoft Word, экспортируя вначале в HTML, а затем копируя HTML и [...]
</node>
-<node TEXT="Настройки" FOLDED="true" POSITION="right" COLOR="#407000">
+<node TEXT="Настройки" FOLDED="true" POSITION="right" ID="ID_1635526328" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#407000">
<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Для изменения настроек, используйте Дополнительно > Установки. Большинство из [...]
-<node TEXT="Настройки включают в себя назначение комбинаций клавишь, кроме того для экспор [...]
-<node TEXT="Ключевые слова: настройка." COLOR="#999999">
+<node TEXT="Для изменения настроек, используйте Дополнительно > Установки. Большинство из [...]
+<node TEXT="Настройки включают в себя назначение комбинаций клавишь, кроме того для экспор [...]
+<node TEXT="Ключевые слова: настройка." ID="ID_300630522" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node TEXT="Печать" FOLDED="true" POSITION="right" COLOR="#407000">
-<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Вы можете как распечатать всю схему на одном листе, так и на нескольких листах бу&#x [...]
-<node TEXT="Для лучшего использования пространства, установите масштаб в Параметрах Стра&# [...]
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node TEXT="Не обязательно использовать предпросмотр схемы перед печатью. Если у вас postscript-при&#x [...]
-<node TEXT="Так же вы можете распечатать через ваш браузер после экспорта схемы в HTML, или через [...]
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node TEXT="Использование формата Rich Text как HTML" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Узлы, начинающиеся с <html> обрабатываются как содержащие HTML-код. Это очень полезно дл&# [...]
-<node>
-<richcontent TYPE="NODE">
-<html>
- <head>
-
- </head>
- <body>
- <h3>
- Пример HTML
- </h3>
- <p class="msonormal">
- Вот список объектов:
- </p>
- <ul type="disc">
- <li class="msonormal">
- Объект один
- </li>
- <li class="msonormal">
- Объект два
- </li>
- </ul>
- <p class="msonormal">
- А тут у нас <b>жирный шрифт</b> или <i>наклонный</i>. <u>Подчеркнутый</u> а так же <strike>зачеркнутый</strike>. &# [...]
- </p>
- <table border="1" style="border: none" class="msonormaltable" cellspacing="0" cellpadding="0">
- <tr>
- <td style="padding-top: .75pt; padding-left: .75pt; padding-right: .75pt; padding-bottom: .75pt; border: solid windowtext 1.0pt">
- <p class="msonormal">
- Ячейка1
- </p>
- </td>
- <td style="border-left: none; padding-top: .75pt; padding-left: .75pt; padding-right: .75pt; padding-bottom: .75pt; border: solid windowtext 1.0pt">
- <p class="msonormal">
- Ячейка2
- </p>
- </td>
- </tr>
- <tr>
- <td style="padding-top: .75pt; border-top: none; padding-left: .75pt; padding-right: .75pt; padding-bottom: .75pt; border: solid windowtext 1.0pt">
- <p class="msonormal">
- Ячейка3
- </p>
- </td>
- <td style="border-bottom: solid windowtext 1.0pt; border-left: none; padding-top: .75pt; border-top: none; padding-left: .75pt; border-right: solid windowtext 1.0pt; padding-right: .75pt; padding-bottom: .75pt">
- <p class="msonormal">
- Ячейка4.
- </p>
- </td>
- </tr>
- </table>
- <p class="msonormal">
- Так же можно использовать <font color="#ff0099">различные</font> <font color="#999900">цвета</font> <font color="#336600">текста</font>.
- </p>
- </body>
-</html></richcontent>
-</node>
-<node TEXT="При экспортировании узлов и изображений в текст или RTF формат, нельзя сохранить HTML- [...]
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-</node>
-<node TEXT="Использование изображений в узлах" FOLDED="true" POSITION="right" COLOR="#407000">
-<font NAME="SansSerif" SIZE="12"/>
-<node TEXT="Для вставки изображения в Freeplane, нажмите ALT + SHIFT + K, или в контекстном меню узла Вставка > Изо&# [...]
-<node TEXT="Поддерживаемые форматы изображений: PNG, JPEG и GIF."/>
-<node TEXT="Для того, чтобы на месте ссылки на файл изображения появилось это изображение, н [...]
-<node TEXT="Есть так же более сложный и не очень дружелюбный способ вставки изображений. МоC [...]
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node TEXT="Например:
  <html><img src="linked/Apple.png">
  <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png">">
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node TEXT="Вы можете использовать относительные ссылки на изображения.">
-<edge WIDTH="thin"/>
-<font NAME="SansSerif" SIZE="12"/>
-</node>
-<node TEXT="Пример изображений, работающий в некоторых Windows системах" FOLDED="true" COLOR="#996600">
+<node TEXT="Печать" FOLDED="true" POSITION="right" ID="ID_1728532684" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Вы можете как распечатать всю схему на одном листе, так и на нескольких листах бу&#x [...]
+<node TEXT="Для лучшего использования пространства, установите масштаб в Параметрах Стра&# [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Не обязательно использовать предпросмотр схемы перед печатью. Если у вас postscript-при&#x [...]
+<node TEXT="Так же вы можете распечатать через ваш браузер после экспорта схемы в HTML, или через [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Использование формата Rich Text как HTML" FOLDED="true" POSITION="right" ID="ID_998601629" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#407000">
+<node TEXT="Узлы, начинающиеся с <html> обрабатываются как содержащие HTML-код. Это очень полезно дл&# [...]
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <h3>
 Пример HTML
 </h3>
 <p class="msonormal">
 Вот список объектов:
 </p>
 <u [...]
+<node TEXT="При экспортировании узлов и изображений в текст или RTF формат, нельзя сохранить HTML- [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Использование изображений в узлах" FOLDED="true" POSITION="right" ID="ID_767738462" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#407000">
+<font NAME="SansSerif" SIZE="12"/>
+<node TEXT="Для вставки изображения в Freeplane, нажмите ALT + SHIFT + K, или в контекстном меню узла Вставка > Изо&# [...]
+<node TEXT="Поддерживаемые форматы изображений: PNG, JPEG и GIF." ID="ID_228253145" CREATED="1465678964195" MODIFIED="1465678964195"/>
+<node TEXT="Для того, чтобы на месте ссылки на файл изображения появилось это изображение, н [...]
+<node TEXT="Есть так же более сложный и не очень дружелюбный способ вставки изображений. МоC [...]
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Например:
  <html><img src="linked/Apple.png">
  <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png">" ID="ID_1280228397" CREATED="1465678964195" MODIFIED="1465678964195">
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Вы можете использовать относительные ссылки на изображения." ID="ID_589868865" CREATED="1465678964195" MODIFIED="1465678964195">
+<edge WIDTH="thin"/>
+<font NAME="SansSerif" SIZE="12"/>
+</node>
+<node TEXT="Пример изображений, работающий в некоторых Windows системах" FOLDED="true" ID="ID_74102619" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#996600">
<font NAME="SansSerif" SIZE="12" BOLD="true"/>
-<node TEXT=""/>
-<node TEXT=""/>
-<node TEXT="" FOLDED="true">
-<node TEXT=""/>
+<node TEXT="" ID="ID_884410160" CREATED="1465678964195" MODIFIED="1465678964195"/>
+<node TEXT="" ID="ID_1944046862" CREATED="1465678964195" MODIFIED="1465678964195"/>
+<node TEXT="" FOLDED="true" ID="ID_215361400" CREATED="1465678964195" MODIFIED="1465678964195">
+<node TEXT="" ID="ID_677559880" CREATED="1465678964195" MODIFIED="1465678964195"/>
</node>
-<node TEXT="" FOLDED="true">
-<node TEXT="" FOLDED="true">
-<node TEXT=""/>
+<node TEXT="" FOLDED="true" ID="ID_1388835604" CREATED="1465678964195" MODIFIED="1465678964195">
+<node TEXT="" FOLDED="true" ID="ID_1229848914" CREATED="1465678964195" MODIFIED="1465678964195">
+<node TEXT="" ID="ID_1434526097" CREATED="1465678964195" MODIFIED="1465678964195"/>
</node>
</node>
-<node TEXT="GLOBE.WMF" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
-<node TEXT="STONE.BMP" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
+<node TEXT="GLOBE.WMF" ID="ID_1184290937" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_669329949" CREATED="1465678964195" MODIFIED="1465678964195" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
</node>
</node>
-<node TEXT="Использование тестового блокирования файлов" FOLDED="true" POSITION="right" COLOR="#407000">
-<node TEXT="Текущая версия Freeplane имеет эксперементальную опцию блокировки файлов, по-умолчани [...]
-<node TEXT="Блокировка файлов гарантирует что несколько пользователей не смогут одновре&#x [...]
-<node TEXT="Чтобы включить эксперементальную опция блокирования файлов, используйте мен&#x [...]
+<node TEXT="Использование тестового блокирования файлов" FOLDED="true" POSITION="right" ID="ID_196430163" CREATED="1465678964195" MODIFIED="1465678964195" COLOR="#407000">
+<node TEXT="Текущая версия Freeplane имеет эксперементальную опцию блокировки файлов, по-умолчани [...]
+<node TEXT="Блокировка файлов гарантирует что несколько пользователей не смогут одновре&#x [...]
+<node TEXT="Чтобы включить эксперементальную опция блокирования файлов, используйте мен&#x [...]
</node>
</node>
</map>
diff --git a/freeplane/doc/freeplane_vi.mm b/freeplane/doc/freeplane_vi.mm
index f3fed65..935a938 100644
--- a/freeplane/doc/freeplane_vi.mm
+++ b/freeplane/doc/freeplane_vi.mm
@@ -1,538 +1,681 @@
-<map version="0.8.1">
-<!-- To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node COLOR="#993300" CREATED="1124560950701" ID="Freeplane_Link_1869696144" MODIFIED="1213113771788" TEXT="<html>
 <head>
 
 </head>
 <body width="">
 <p align="center">
 Freeplane<br><small>- hãy giải phóng tư duy của bạn -</small>
 </p>
 </body>
</html>
">
-<font BOLD="true" NAME="Dialog" SIZE="18"/>
-<node CREATED="1124560950701" LINK="http://freeplane.sourceforge.net" MODIFIED="1124560950701" POSITION="left" TEXT="Trang chủ của Freeplane">
-<font NAME="Dialog" SIZE="12"/>
-</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1091417446" MODIFIED="1125175911388" POSITION="left" TEXT="Các phím tắt">
-<node CREATED="1124560950701" ID="Freeplane_Link_307658988" MODIFIED="1213147465274" TEXT="Lệnh về tập tin:
Sơ đồ mới - Ctrl+N
Mở - Ctrl+O
Lưu - Ctrl+S
Lưu dạng - Ctrl+A
In - Ctrl+P
Đóng - Ctrl+W
Thoát - Ctrl+Q
Sơ đồ trước - Ctrl+LEFT
Sơ đồ kế - Ctrl+RIGHT
Xuất ra HTML - Ctrl+E
Xuất nh& [...]
-<font NAME="Dialog" SIZE="12"/>
-</node>
-</node>
-<node COLOR="#006633" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_904501221" MODIFIED="1124560950701" POSITION="left" TEXT="Cài đặt">
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1911559485" MODIFIED="1124560950701" TEXT="Liên kết">
-<node CREATED="1124560950701" LINK="http://java.sun.com/j2se" MODIFIED="1124560950701" TEXT="Tải về Java Runtime Environment (ít nhất là J2RE1.4)">
+<map version="freeplane 1.5.9">
+<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node FOLDED="false" ID="Freeplane_Link_1869696144" CREATED="1124560950701" MODIFIED="1213113771788" COLOR="#993300"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body width="">
+ <p align="center">
+ Freeplane<br/><small>- hãy giải phóng tư duy của bạn -</small>
+ </p>
+ </body>
+</html>
+
+</richcontent>
+<font NAME="Dialog" SIZE="18" BOLD="true"/>
+<hook NAME="MapStyle">
+ <properties fit_to_viewport="false;"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" FORMAT="NO_FORMAT" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="true" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#ffffff">
+<font SIZE="9"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" UNIFORM_SHAPE="true" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font SIZE="24" ITALIC="true"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2">
+<edge COLOR="#ff0033"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3">
+<edge COLOR="#009933"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4">
+<edge COLOR="#3333ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#ff6600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<node TEXT="Trang chủ của Freeplane" POSITION="left" ID="ID_1471359295" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://freeplane.sourceforge.net">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node TEXT="Các phím tắt" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1091417446" CREATED="1124560950701" MODIFIED="1125175911388" COLOR="#006699">
+<node TEXT="Lệnh về tập tin:
Sơ đồ mới - Ctrl+N
Mở - Ctrl+O
Lưu - Ctrl+S
Lưu dạng - Ctrl+A
In - Ctrl+P
Đóng - Ctrl+W
Thoát - Ctrl+Q
Sơ đồ trước - Ctrl+LEFT
Sơ đồ kế - Ctrl+RIGHT
Xuất ra HTML - Ctrl+E
Xuất nhánh ra HTML - Ctrl+H
Xuất nhánh ra sơ đồ [...]
+<font NAME="Dialog" SIZE="12"/>
+</node>
+</node>
+<node TEXT="Cài đặt" FOLDED="true" POSITION="left" ID="_Freeplane_Link_904501221" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#006633">
+<node TEXT="Liên kết" FOLDED="true" ID="_Freeplane_Link_1911559485" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#006699">
+<node TEXT="Tải về Java Runtime Environment (ít nhất là J2RE1.4)" ID="ID_872478746" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://java.sun.com/j2se">
<edge WIDTH="thin"/>
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1612101865" LINK="http://sourceforge.net/project/showfiles.php?project_id=211069" MODIFIED="1124560950701" TEXT="Tải chương trình về">
+<node TEXT="Tải chương trình về" ID="_Freeplane_Link_1612101865" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://sourceforge.net/project/showfiles.php?project_id=211069">
<edge WIDTH="thin"/>
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_139664576" MODIFIED="1124560950701" TEXT="Để cài đặt Freeplane trên Microsoft Windows, hãy cài Java trên trang chủ của Sun và cài Freeplane bằng bộ cài có trên trang chủ Freeplane."/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1380352758" MODIFIED="1124560950701" TEXT="Để cài Freeplane trên Linux, tải bộ Java Runtime Environment và cả ứng dụng Freeplane về. Cài Java trước, rồi giải nén Freeplane. Để chạy Freeplane, hãy chạy tập tin freeplane.sh."/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1808511462" MODIFIED="1124560950701" TEXT="Trên Microsoft Windows và Mac OS X, bạn cũng có thể chỉ cần bấm đúp vào tập tin freeplane.jar nằm trong thư mục lib để khởi động Freeplane."/>
+<node TEXT="Để cài đặt Freeplane trên Microsoft Windows, hãy cài Java trên trang chủ của Sun và cài Freeplane bằng bộ cài có trên trang chủ Freeplane." ID="_Freeplane_Link_139664576" CREATED="1124560950701" MODIFIED="1124560950701"/>
+<node TEXT="Để cài Freeplane trên Linux, tải bộ Java Runtime Environment và cả ứng dụng Freeplane về. Cài Java trước, rồi giải nén Freeplane. Để chạy Freeplane, hãy chạy tập tin freeplane.sh." ID="_Freeplane_Link_1380352758" CREATED="1124560950701" MODIFIED="1124560950701"/>
+<node TEXT="Trên Microsoft Windows và Mac OS X, bạn cũng có thể chỉ cần bấm đúp vào tập tin freeplane.jar nằm trong thư mục lib để khởi động Freeplane." ID="_Freeplane_Link_1808511462" CREATED="1124560950701" MODIFIED="1124560950701"/>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_353522063" MODIFIED="1124560950701" POSITION="left" TEXT="Duyệt các tập tin có trên máy">
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Để duyệt các tập tin có trên máy, hãy chuyển sang chế độ tập tin bằng cách chọn Chế độ > Tập tin."/>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Ta có thể duyệt cây tập tin dưới dạng sơ đồ tư duy."/>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Để chuyển một thư mục vào thành nút chính giữa sơ đồ, trong trình đơn ngữ cảnh của nút, chọn Vào giữa."/>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Để xem, sửa hoặc thực thi một tập tin, hãy mở liên kết trên nút ứng với nó."/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_279880616" MODIFIED="1124560950701" TEXT="Hiện thời, chế độ tập tin chưa thực sự có ích. Nó chỉ cho ta hình dung được rằng ta có thể đưa dữ liệu vào trong cây từ những nguồn bên ngoài sơ đồ tư duy. Tôi không ch [...]
+<node TEXT="Duyệt các tập tin có trên máy" FOLDED="true" POSITION="left" ID="_Freeplane_Link_353522063" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#407000">
+<node TEXT="Để duyệt các tập tin có trên máy, hãy chuyển sang chế độ tập tin bằng cách chọn Chế độ > Tập tin." ID="ID_176566353" CREATED="1124560950701" MODIFIED="1124560950701"/>
+<node TEXT="Ta có thể duyệt cây tập tin dưới dạng sơ đồ tư duy." ID="ID_1653140664" CREATED="1124560950701" MODIFIED="1124560950701"/>
+<node TEXT="Để chuyển một thư mục vào thành nút chính giữa sơ đồ, trong trình đơn ngữ cảnh của nút, chọn Vào giữa." ID="ID_1347460062" CREATED="1124560950701" MODIFIED="1124560950701"/>
+<node TEXT="Để xem, sửa hoặc thực thi một tập tin, hãy mở liên kết trên nút ứng với nó." ID="ID_1376207309" CREATED="1124560950701" MODIFIED="1124560950701"/>
+<node TEXT="Hiện thời, chế độ tập tin chưa thực sự có ích. Nó chỉ cho ta hình dung được rằng ta có thể đưa dữ liệu vào trong cây từ những nguồn bên ngoài sơ đồ tư duy. Tôi không chắc rằng bạn sẽ có lúc dùng chế &#x [...]
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1530607683" MODIFIED="1124560950701" POSITION="left" TEXT="Duyệt sơ đồ tư duy">
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Để duyệt sơ đồ tư duy, nhưng không hiệu chỉnh nó, hãy chuyển sang chế độ duyệt bằng cách chọn Chế độ > Duyệt. Chức năng này chỉ hữu ích khi được dùng trong tiểu dụng Freeplane."/>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Lý do phải có một chế độ duyệt tách riêng khỏi chế độ Sơ đồ tư duy là để phục vụ tiểu dụng Freeplane khi đăng lên trang web nào đó. Thông thường, ta chẳng bao giờ dùng chế độ nà [...]
+<node TEXT="Duyệt sơ đồ tư duy" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1530607683" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#407000">
+<node TEXT="Để duyệt sơ đồ tư duy, nhưng không hiệu chỉnh nó, hãy chuyển sang chế độ duyệt bằng cách chọn Chế độ > Duyệt. Chức năng này chỉ hữu ích khi được dùng trong tiểu dụng Freeplane." ID="ID_429212662" CREATED="1124560950701" MODIFIED="1124560950701"/>
+<node TEXT="Lý do phải có một chế độ duyệt tách riêng khỏi chế độ Sơ đồ tư duy là để phục vụ tiểu dụng Freeplane khi đăng lên trang web nào đó. Thông thường, ta chẳng bao giờ dùng chế độ này bên trong chương trình c& [...]
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1136088046" MODIFIED="1124560950701" POSITION="left" TEXT="Về các chế độ">
-<edge WIDTH="thin"/>
+<node TEXT="Về các chế độ" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1136088046" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1713057526" MODIFIED="1212776176900" TEXT="Dù Freeplane chỉ thường được dùng trong việc vẽ các sơ đồ tư duy, chương trình còn cho phép biểu diễn dữ liệu từ những nguồn khác nhau. Để chương trình biểu diễn đư [...]
+<edge WIDTH="thin"/>
+<node TEXT="Dù Freeplane chỉ thường được dùng trong việc vẽ các sơ đồ tư duy, chương trình còn cho phép biểu diễn dữ liệu từ những nguồn khác nhau. Để chương trình biểu diễn được một nguồn dữ liệu nào đó, nh [...]
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_700085988" MODIFIED="1212776316199" TEXT="Hiện đã có mã nguồn cho chế độ xử lý sơ đồ. Không giống như chế độ Sơ đồ tư duy, các chế độ khác thường chỉ để biểu diễn cấu trúc và tính năng c&# [...]
+<node TEXT="Hiện đã có mã nguồn cho chế độ xử lý sơ đồ. Không giống như chế độ Sơ đồ tư duy, các chế độ khác thường chỉ để biểu diễn cấu trúc và tính năng của chương trình, hơn là có tác d [...]
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1525986009" MODIFIED="1212775956312" POSITION="left" TEXT="Cài đặt tiểu dụng Freeplane vào 1 trang web">
-<node COLOR="#000000" CREATED="1124560950701" ID="Freeplane_Link_1795495302" MODIFIED="1213147541802" TEXT="Có thể cài đặt tiểu dụng Freeplane lên trang web để người dùng xem các sơ đồ trên đó.">
+<node TEXT="Cài đặt tiểu dụng Freeplane vào 1 trang web" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1525986009" CREATED="1124560950701" MODIFIED="1212775956312" COLOR="#407000">
+<node TEXT="Có thể cài đặt tiểu dụng Freeplane lên trang web để người dùng xem các sơ đồ trên đó." ID="Freeplane_Link_1795495302" CREATED="1124560950701" MODIFIED="1213147541802" COLOR="#000000">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_1776430598" LINK="http://sourceforge.net/project/showfiles.php?group_id=211069" MODIFIED="1213147559788" TEXT="Tải tiểu dụng Freeplane-browser về."/>
-<node CREATED="1124560950701" ID="Freeplane_Link_758844596" MODIFIED="1213147633070" TEXT="Kho nén được tải về sẽ bao gồm các tập tin freeplanebrowser.jar và freeplanebrowser.html. Tạo liên kết từ trang web tới trang freeplanebrowser.html. Trong tập tin freeplanebrowser.html, hãy đổi lại đường dẫn để nó chỉ [...]
-<node CREATED="1124560950701" ID="Freeplane_Link_939698300" MODIFIED="1213147706542" TEXT="Tập tin jar phải được đặt trên máy chủ chứa các sơ đồ, vì yêu cầu bảo mật của java. Bạn sẽ phải đưa các sơ đồ lên cùng với tập tin jar của Freeplane lên trang web của m& [...]
+<node TEXT="Tải tiểu dụng Freeplane-browser về." ID="Freeplane_Link_1776430598" CREATED="1124560950701" MODIFIED="1213147559788" LINK="http://sourceforge.net/project/showfiles.php?group_id=211069"/>
+<node TEXT="Kho nén được tải về sẽ bao gồm các tập tin freeplanebrowser.jar và freeplanebrowser.html. Tạo liên kết từ trang web tới trang freeplanebrowser.html. Trong tập tin freeplanebrowser.html, hãy đổi lại đường dẫn để nó chỉ tới sơ đồ cần cho người khá [...]
+<node TEXT="Tập tin jar phải được đặt trên máy chủ chứa các sơ đồ, vì yêu cầu bảo mật của java. Bạn sẽ phải đưa các sơ đồ lên cùng với tập tin jar của Freeplane lên trang web của mình." ID="Freeplane_Link_939698300" CREATED="1124560950701" MODIFIED="12131 [...]
</node>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1083756111" MODIFIED="1212775897175" POSITION="left" TEXT="Sử dụng tiểu dụng Freeplane">
+<node TEXT="Sử dụng tiểu dụng Freeplane" FOLDED="true" POSITION="left" ID="_Freeplane_Link_1083756111" CREATED="1124560950701" MODIFIED="1212775897175" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_514864900" MODIFIED="1212776444244" TEXT="Trong tiểu dụng Freeplane, bạn chỉ có thể dùng chế độ duyệt; bạn không thể hiệu chỉnh sơ đồ từ xa. Bấm vào một nút để mở rộng hoặc thu gọn, hoặc mở liên kết tại nút & [...]
+<node TEXT="Trong tiểu dụng Freeplane, bạn chỉ có thể dùng chế độ duyệt; bạn không thể hiệu chỉnh sơ đồ từ xa. Bấm vào một nút để mở rộng hoặc thu gọn, hoặc mở liên kết tại nút đó. Muốn di chuyển bên trong sơ đǭ [...]
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_784043927" MODIFIED="1212775921719" POSITION="left" TEXT="Công trạng">
-<edge WIDTH="thin"/>
+<node TEXT="Công trạng" FOLDED="true" POSITION="left" ID="_Freeplane_Link_784043927" CREATED="1124560950701" MODIFIED="1212775921719" COLOR="#006699">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_415458128" MODIFIED="1213147137068" TEXT="Các tác giả">
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1896457660" MODIFIED="1124560950701" TEXT="Joerg Mueller">
<edge WIDTH="thin"/>
+<node TEXT="Các tác giả" FOLDED="true" ID="Freeplane_Link_415458128" CREATED="1124560950701" MODIFIED="1213147137068" COLOR="#006699">
+<node TEXT="Joerg Mueller" FOLDED="true" ID="_Freeplane_Link_1896457660" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#558000" CREATED="1124560950701" LINK="mailto:ponders at t-online.de" MODIFIED="1124560950701" TEXT="ponders at t-online.de">
+<edge WIDTH="thin"/>
+<node TEXT="ponders at t-online.de" ID="ID_1377173129" CREATED="1124560950701" MODIFIED="1124560950701" LINK="mailto:ponders at t-online.de" COLOR="#558000">
<font NAME="Dialog" SIZE="10"/>
</node>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="University of Freiburg, Germany">
+<node TEXT="University of Freiburg, Germany" ID="ID_1622788266" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_984984595" LINK="http://mujweb.cz/www/danielpolansky" MODIFIED="1124560950701" TEXT="Daniel Polansky">
-<edge WIDTH="thin"/>
+<node TEXT="Daniel Polansky" ID="_Freeplane_Link_984984595" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://mujweb.cz/www/danielpolansky" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_459203293" MODIFIED="1124560950701" TEXT="Petr Novak">
<edge WIDTH="thin"/>
-<font NAME="Dialog" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_875814410" MODIFIED="1124560950701" TEXT="Christian Foltin">
-<edge WIDTH="thin"/>
+<node TEXT="Petr Novak" ID="_Freeplane_Link_459203293" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
+<edge WIDTH="thin"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" ID="_Freeplane_Link_1415293905" MODIFIED="1124560950701" TEXT="Dimitri Polivaev">
+<node TEXT="Christian Foltin" ID="_Freeplane_Link_875814410" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
+<font NAME="Dialog" SIZE="12"/>
<edge WIDTH="thin"/>
+</node>
+<node TEXT="Dimitri Polivaev" ID="_Freeplane_Link_1415293905" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_816166020" MODIFIED="1213147145506" TEXT="Những người đóng góp">
-<edge WIDTH="thin"/>
+<node TEXT="Những người đóng góp" FOLDED="true" ID="Freeplane_Link_816166020" CREATED="1124560950701" MODIFIED="1213147145506" COLOR="#006699">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1797108956" MODIFIED="1124560950701" TEXT="Andrew Iggleden">
<edge WIDTH="thin"/>
+<node TEXT="Andrew Iggleden" FOLDED="true" ID="Freeplane_Link_1797108956" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Installer Windows">
<edge WIDTH="thin"/>
+<node TEXT="Installer Windows" ID="ID_687431017" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1096673251" MODIFIED="1124560950701" TEXT="Bob Alexander">
-<edge WIDTH="thin"/>
+<node TEXT="Bob Alexander" FOLDED="true" ID="Freeplane_Link_1096673251" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Eclipse howto">
<edge WIDTH="thin"/>
+<node TEXT="Eclipse howto" ID="ID_1863339163" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1024053399" MODIFIED="1124560950701" TEXT="David Butt">
-<edge WIDTH="thin"/>
+<node TEXT="David Butt" FOLDED="true" ID="Freeplane_Link_1024053399" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Tutorial flash">
<edge WIDTH="thin"/>
+<node TEXT="Tutorial flash" ID="ID_1916228448" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_226818637" MODIFIED="1124560950701" TEXT="David Low">
-<edge WIDTH="thin"/>
+<node TEXT="David Low" FOLDED="true" ID="Freeplane_Link_226818637" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Helpful">
<edge WIDTH="thin"/>
+<node TEXT="Helpful" ID="ID_556105278" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_360501151" MODIFIED="1213147151585" TEXT="Dịch giả">
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_807977431" MODIFIED="1124560950701" TEXT="Bob Alexander">
-<edge WIDTH="thin"/>
+<node TEXT="Dịch giả" FOLDED="true" ID="Freeplane_Link_360501151" CREATED="1124560950701" MODIFIED="1213147151585" COLOR="#006699">
+<node TEXT="Bob Alexander" FOLDED="true" ID="Freeplane_Link_807977431" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Italian translation">
<edge WIDTH="thin"/>
+<node TEXT="Italian translation" ID="ID_55595923" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1853214917" MODIFIED="1124560950701" TEXT="Knud Riishøjgård">
-<edge WIDTH="thin"/>
+<node TEXT="Knud Riishøjgård" FOLDED="true" ID="Freeplane_Link_1853214917" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Danish translation">
<edge WIDTH="thin"/>
+<node TEXT="Danish translation" ID="ID_1601201492" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1676529317" MODIFIED="1124560950701" TEXT="Takeshi Kakeda">
-<edge WIDTH="thin"/>
+<node TEXT="Takeshi Kakeda" FOLDED="true" ID="Freeplane_Link_1676529317" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Japanese translation">
<edge WIDTH="thin"/>
+<node TEXT="Japanese translation" ID="ID_177518129" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562983644" FOLDED="true" ID="Freeplane_Link_1172193026" MODIFIED="1124562984816" TEXT="Kohichi Aoki">
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Japanese translation">
-<edge WIDTH="thin"/>
+<node TEXT="Kohichi Aoki" FOLDED="true" ID="Freeplane_Link_1172193026" CREATED="1124562983644" MODIFIED="1124562984816" COLOR="#996600">
+<node TEXT="Japanese translation" ID="ID_606345327" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_74531183" MODIFIED="1124560950701" TEXT="Alex Dukal">
-<edge WIDTH="thin"/>
+<node TEXT="Alex Dukal" FOLDED="true" ID="Freeplane_Link_74531183" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Spanish translation">
<edge WIDTH="thin"/>
+<node TEXT="Spanish translation" ID="ID_493532464" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562998159" FOLDED="true" ID="Freeplane_Link_757563697" MODIFIED="1124563008034" TEXT="Hugo Gayosso">
-<node COLOR="#999999" CREATED="1124560950701" ID="Freeplane_Link_1783275246" MODIFIED="1124560950701" TEXT="Spanish translation">
-<edge WIDTH="thin"/>
+<node TEXT="Hugo Gayosso" FOLDED="true" ID="Freeplane_Link_757563697" CREATED="1124562998159" MODIFIED="1124563008034" COLOR="#996600">
+<node TEXT="Spanish translation" ID="Freeplane_Link_1783275246" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge WIDTH="thin"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_929540960" MODIFIED="1124560950701" TEXT="Sylvain Gamel">
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="French translation">
+<node TEXT="Sylvain Gamel" FOLDED="true" ID="Freeplane_Link_929540960" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#996600">
+<node TEXT="French translation" ID="ID_663045330" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561242082" FOLDED="true" ID="Freeplane_Link_946171164" MODIFIED="1124561245019" TEXT="Koen Roggemans">
-<node COLOR="#999999" CREATED="1124561245957" ID="Freeplane_Link_1819881845" MODIFIED="1124561251675" TEXT="Dutch translation">
+<node TEXT="Koen Roggemans" FOLDED="true" ID="Freeplane_Link_946171164" CREATED="1124561242082" MODIFIED="1124561245019" COLOR="#996600">
+<node TEXT="Dutch translation" ID="Freeplane_Link_1819881845" CREATED="1124561245957" MODIFIED="1124561251675" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561374999" FOLDED="true" ID="Freeplane_Link_235962981" MODIFIED="1124561376718" TEXT="Rafal Kraik">
-<node COLOR="#999999" CREATED="1124561377702" ID="Freeplane_Link_459079511" MODIFIED="1124561382155" TEXT="Polish translation">
+<node TEXT="Rafal Kraik" FOLDED="true" ID="Freeplane_Link_235962981" CREATED="1124561374999" MODIFIED="1124561376718" COLOR="#996600">
+<node TEXT="Polish translation" ID="Freeplane_Link_459079511" CREATED="1124561377702" MODIFIED="1124561382155" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561969717" FOLDED="true" ID="Freeplane_Link_653284985" MODIFIED="1124561972920" TEXT="Goliath">
-<node COLOR="#999999" CREATED="1124561438294" ID="Freeplane_Link_1387213811" MODIFIED="1124561445950" TEXT="Korean translation">
+<node TEXT="Goliath" FOLDED="true" ID="Freeplane_Link_653284985" CREATED="1124561969717" MODIFIED="1124561972920" COLOR="#996600">
+<node TEXT="Korean translation" ID="Freeplane_Link_1387213811" CREATED="1124561438294" MODIFIED="1124561445950" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561753254" FOLDED="true" ID="Freeplane_Link_35211963" MODIFIED="1124563712385" TEXT="Miles a.k.a. filmsi">
-<node COLOR="#999999" CREATED="1124561491886" ID="Freeplane_Link_835144271" MODIFIED="1124561506386" TEXT="Slovenian translation">
+<node TEXT="Miles a.k.a. filmsi" FOLDED="true" ID="Freeplane_Link_35211963" CREATED="1124561753254" MODIFIED="1124563712385" COLOR="#996600">
+<node TEXT="Slovenian translation" ID="Freeplane_Link_835144271" CREATED="1124561491886" MODIFIED="1124561506386" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561814721" FOLDED="true" ID="Freeplane_Link_1008886206" MODIFIED="1124561818580" TEXT="William Chen">
-<node COLOR="#999999" CREATED="1124561497308" ID="Freeplane_Link_1960552629" MODIFIED="1124561506011" TEXT="Chinese translation">
+<node TEXT="William Chen" FOLDED="true" ID="Freeplane_Link_1008886206" CREATED="1124561814721" MODIFIED="1124561818580" COLOR="#996600">
+<node TEXT="Chinese translation" ID="Freeplane_Link_1960552629" CREATED="1124561497308" MODIFIED="1124561506011" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124561823877" FOLDED="true" ID="Freeplane_Link_1650138043" MODIFIED="1124561876907" TEXT="Radek Švarc">
-<node COLOR="#999999" CREATED="1124561515761" ID="Freeplane_Link_768227373" MODIFIED="1124561519885" TEXT="Czech translation">
+<node TEXT="Radek Švarc" FOLDED="true" ID="Freeplane_Link_1650138043" CREATED="1124561823877" MODIFIED="1124561876907" COLOR="#996600">
+<node TEXT="Czech translation" ID="Freeplane_Link_768227373" CREATED="1124561515761" MODIFIED="1124561519885" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562250475" FOLDED="true" ID="Freeplane_Link_901975324" MODIFIED="1124562252007" TEXT="Balázs Márton">
-<node COLOR="#999999" CREATED="1124562252585" ID="Freeplane_Link_557911120" MODIFIED="1124562258428" TEXT="Hungarian translation">
+<node TEXT="Balázs Márton" FOLDED="true" ID="Freeplane_Link_901975324" CREATED="1124562250475" MODIFIED="1124562252007" COLOR="#996600">
+<node TEXT="Hungarian translation" ID="Freeplane_Link_557911120" CREATED="1124562252585" MODIFIED="1124562258428" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1124562948942" FOLDED="true" ID="Freeplane_Link_290351026" MODIFIED="1124562950270" TEXT="Luis Ferreira ">
-<node COLOR="#999999" CREATED="1124562956332" ID="Freeplane_Link_6081004" MODIFIED="1124562961879" TEXT="Portuguese translation">
+<node TEXT="Luis Ferreira " FOLDED="true" ID="Freeplane_Link_290351026" CREATED="1124562948942" MODIFIED="1124562950270" COLOR="#996600">
+<node TEXT="Portuguese translation" ID="Freeplane_Link_6081004" CREATED="1124562956332" MODIFIED="1124562961879" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#996600" CREATED="1213147159232" FOLDED="true" ID="Freeplane_Link_1061045577" MODIFIED="1213147225461" TEXT="Nguyễn Đình Trung">
-<edge COLOR="#808080" WIDTH="thin"/>
-<node COLOR="#999999" CREATED="1213147189082" ID="Freeplane_Link_1638585257" MODIFIED="1213147216201" TEXT="Vietnamese translation">
+<node TEXT="Nguyễn Đình Trung" FOLDED="true" ID="Freeplane_Link_1061045577" CREATED="1213147159232" MODIFIED="1213147225461" COLOR="#996600">
<edge COLOR="#808080" WIDTH="thin"/>
+<node TEXT="Vietnamese translation" ID="Freeplane_Link_1638585257" CREATED="1213147189082" MODIFIED="1213147216201" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
+<edge COLOR="#808080" WIDTH="thin"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124563066204" ID="Freeplane_Link_23652566" MODIFIED="1124563189197" TEXT="The credits for translations are probably incomplete. If we have forggoten you, let us know. All people who we know to contribute a least an incomplete translation are listed.">
+<node TEXT="The credits for translations are probably incomplete. If we have forggoten you, let us know. All people who we know to contribute a least an incomplete translation are listed." ID="Freeplane_Link_23652566" CREATED="1124563066204" MODIFIED="1124563189197" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
</node>
-<node COLOR="#0033ff" CREATED="1124560950701" ID="Freeplane_Link_1601947891" MODIFIED="1212776538748" POSITION="right" TEXT="Ctrl + F để tìm. Ctrl + G để tìm tiếp. Để tìm toàn bộ sơ đồ, nhấn Esc trước khi tìm"/>
-<node COLOR="#0033ff" CREATED="1124560950701" ID="Freeplane_Link_1925380454" MODIFIED="1212776582485" POSITION="right" TEXT="Nhấn mũi tên phải để mở rộng 1 ô văn bản."/>
-<node COLOR="#407000" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1596161299" MODIFIED="1212776590278" POSITION="right" TEXT="Giới thiệu">
-<node CREATED="1124560950701" ID="Freeplane_Link_491870889" MODIFIED="1212776709356" TEXT="Freeplane giúp ta tạo ra các sơ đồ tư duy. Hiện nay, rất nhiều người dùng sơ đồ tư duy thay cho sổ ghi nhớ hoặc giấy nhắc việc, để quản lý thông tin cá nhân."/>
-<node CREATED="1124560950701" ID="Freeplane_Link_1952418424" MODIFIED="1212776749187" TEXT="Thông tin được lưu trong các ô văn bản, gọi là nút. Các nút được nối với nhau thông qua các đường nối."/>
-<node CREATED="1124560950701" ID="Freeplane_Link_626602938" MODIFIED="1212777070820" TEXT="Tài liệu này áp dụng cho Freeplane 0.8.0. Các phím tắt và vị trí các lệnh trên thanh trình đơn có thể thay đổi trong các phiên bản tới."/>
+<node TEXT="Ctrl + F để tìm. Ctrl + G để tìm tiếp. Để tìm toàn bộ sơ đồ, nhấn Esc trước khi tìm" POSITION="right" ID="Freeplane_Link_1601947891" CREATED="1124560950701" MODIFIED="1212776538748" COLOR="#0033ff"/>
+<node TEXT="Nhấn mũi tên phải để mở rộng 1 ô văn bản." POSITION="right" ID="Freeplane_Link_1925380454" CREATED="1124560950701" MODIFIED="1212776582485" COLOR="#0033ff"/>
+<node TEXT="Giới thiệu" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1596161299" CREATED="1124560950701" MODIFIED="1212776590278" COLOR="#407000">
+<node TEXT="Freeplane giúp ta tạo ra các sơ đồ tư duy. Hiện nay, rất nhiều người dùng sơ đồ tư duy thay cho sổ ghi nhớ hoặc giấy nhắc việc, để quản lý thông tin cá nhân." ID="Freeplane_Link_491870889" CREATED="1124560950701" MODIFIED="1212776709356"/>
+<node TEXT="Thông tin được lưu trong các ô văn bản, gọi là nút. Các nút được nối với nhau thông qua các đường nối." ID="Freeplane_Link_1952418424" CREATED="1124560950701" MODIFIED="1212776749187"/>
+<node TEXT="Tài liệu này áp dụng cho Freeplane 0.8.0. Các phím tắt và vị trí các lệnh trên thanh trình đơn có thể thay đổi trong các phiên bản tới." ID="Freeplane_Link_626602938" CREATED="1124560950701" MODIFIED="1212777070820"/>
</node>
-<node COLOR="#996600" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_706084071" MODIFIED="1212777082295" POSITION="right" TEXT="Trình diễn một số tính năng">
+<node TEXT="Trình diễn một số tính năng" FOLDED="true" POSITION="right" ID="_Freeplane_Link_706084071" CREATED="1124560950701" MODIFIED="1212777082295" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_735193624" MODIFIED="1212777551435" TEXT="Diện mạo">
+<node TEXT="Diện mạo" FOLDED="true" ID="_Freeplane_Link_735193624" CREATED="1124560950701" MODIFIED="1212777551435" COLOR="#669900">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_990796211" MODIFIED="1212777213835" TEXT="Mỗi nút có thể có một màu riêng">
+<node TEXT="Mỗi nút có thể có một màu riêng" FOLDED="true" ID="Freeplane_Link_990796211" CREATED="1124560950701" MODIFIED="1212777213835">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#ff0000" CREATED="1124560950701" ID="Freeplane_Link_1928775947" MODIFIED="1212777159263" TEXT="Đỏ">
+<node TEXT="Đỏ" ID="Freeplane_Link_1928775947" CREATED="1124560950701" MODIFIED="1212777159263" COLOR="#ff0000">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node COLOR="#009900" CREATED="1124560950701" ID="Freeplane_Link_1270985808" MODIFIED="1212777153600" TEXT="Xanh lá cây">
+<node TEXT="Xanh lá cây" ID="Freeplane_Link_1270985808" CREATED="1124560950701" MODIFIED="1212777153600" COLOR="#009900">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node COLOR="#0000cc" CREATED="1124560950701" ID="Freeplane_Link_1751102424" MODIFIED="1212777147831" TEXT="Xanh nước biển">
+<node TEXT="Xanh nước biển" ID="Freeplane_Link_1751102424" CREATED="1124560950701" MODIFIED="1212777147831" COLOR="#0000cc">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_" MODIFIED="1212777209261" TEXT="Mỗi nút có thể có một màu nền riêng">
-<node BACKGROUND_COLOR="#17a4f4" CREATED="1124560950701" ID="_Freeplane_Link_1358611533" MODIFIED="1212777276140" TEXT="Thế này"/>
-<node BACKGROUND_COLOR="#f4c317" CREATED="1124560950701" ID="_Freeplane_Link_1317973766" MODIFIED="1212777257400" TEXT="Hoặc thế này"/>
+<node TEXT="Mỗi nút có thể có một màu nền riêng" FOLDED="true" ID="_" CREATED="1124560950701" MODIFIED="1212777209261">
+<node TEXT="Thế này" ID="_Freeplane_Link_1358611533" CREATED="1124560950701" MODIFIED="1212777276140" BACKGROUND_COLOR="#17a4f4"/>
+<node TEXT="Hoặc thế này" ID="_Freeplane_Link_1317973766" CREATED="1124560950701" MODIFIED="1212777257400" BACKGROUND_COLOR="#f4c317"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1213254128" MODIFIED="1212777308799" TEXT="Mỗi nút có kiểu chữ riêng">
+<node TEXT="Mỗi nút có kiểu chữ riêng" FOLDED="true" ID="Freeplane_Link_1213254128" CREATED="1124560950701" MODIFIED="1212777308799">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_578683610" MODIFIED="1212777358885" TEXT="Chữ đậm">
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Chữ đậm" ID="Freeplane_Link_578683610" CREATED="1124560950701" MODIFIED="1212777358885">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_706890134" MODIFIED="1212777370515" TEXT="Chữ nghiêng">
-<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Chữ nghiêng" ID="Freeplane_Link_706890134" CREATED="1124560950701" MODIFIED="1212777370515">
+<font NAME="Dialog" SIZE="12" ITALIC="true"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_1978135326" MODIFIED="1212777390992" TEXT="Chữ vừa đậm vừa nghiêng">
-<font BOLD="true" ITALIC="true" NAME="Dialog" SIZE="12"/>
+<node TEXT="Chữ vừa đậm vừa nghiêng" ID="Freeplane_Link_1978135326" CREATED="1124560950701" MODIFIED="1212777390992">
+<font NAME="Dialog" SIZE="12" BOLD="true" ITALIC="true"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1131981254" MODIFIED="1124560950701" TEXT="Kích cỡ phông trên các nút có thể khác nhau">
+<node TEXT="Kích cỡ phông trên các nút có thể khác nhau" FOLDED="true" ID="Freeplane_Link_1131981254" CREATED="1124560950701" MODIFIED="1124560950701">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="nhỏ">
+<node TEXT="nhỏ" ID="ID_439499995" CREATED="1124560950701" MODIFIED="1124560950701">
<font NAME="Dialog" SIZE="11"/>
</node>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="bình thường">
+<node TEXT="bình thường" ID="ID_1314990447" CREATED="1124560950701" MODIFIED="1124560950701">
<font NAME="Dialog" SIZE="13"/>
</node>
-<node CREATED="1124560950701" MODIFIED="1124560950701" TEXT="lớn">
+<node TEXT="lớn" ID="ID_1856340685" CREATED="1124560950701" MODIFIED="1124560950701">
<font NAME="Dialog" SIZE="15"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_547633802" MODIFIED="1124560950701" TEXT="LỚN">
+<node TEXT="LỚN" FOLDED="true" ID="Freeplane_Link_547633802" CREATED="1124560950701" MODIFIED="1124560950701">
<font NAME="Dialog" SIZE="20"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_1471232064" MODIFIED="1212777407803" TEXT="CỰC LỚN">
+<node TEXT="CỰC LỚN" ID="Freeplane_Link_1471232064" CREATED="1124560950701" MODIFIED="1212777407803">
<font NAME="Dialog" SIZE="123"/>
</node>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1920779160" MODIFIED="1212777432244" TEXT="Dùng họ phông khác nhau cho mỗi nút">
+<node TEXT="Dùng họ phông khác nhau cho mỗi nút" FOLDED="true" ID="Freeplane_Link_1920779160" CREATED="1124560950701" MODIFIED="1212777432244">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_363896058" MODIFIED="1212777444214" TEXT="Times">
+<node TEXT="Times" ID="Freeplane_Link_363896058" CREATED="1124560950701" MODIFIED="1212777444214">
<font NAME="Dialog" SIZE="16"/>
</node>
-<node CREATED="1124560950701" ID="_Freeplane_Link_1568731425" MODIFIED="1212777454684" TEXT="Hoặc Verdana">
+<node TEXT="Hoặc Verdana" ID="_Freeplane_Link_1568731425" CREATED="1124560950701" MODIFIED="1212777454684">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_655292275" MODIFIED="1212777478602" TEXT="Hoặc Arial">
+<node TEXT="Hoặc Arial" ID="Freeplane_Link_655292275" CREATED="1124560950701" MODIFIED="1212777478602">
<font NAME="Dialog" SIZE="21"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1193071041" MODIFIED="1212777501990" TEXT="Nút cũng có kiểu dáng riêng">
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1979277285" MODIFIED="1212777517406" TEXT="Vạch">
-<node CREATED="1124560950701" ID="_Freeplane_Link_89124429" MODIFIED="1212777524177" TEXT="Vạch"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_173850525" MODIFIED="1212777528283" TEXT="Vạch"/>
+<node TEXT="Nút cũng có kiểu dáng riêng" FOLDED="true" ID="_Freeplane_Link_1193071041" CREATED="1124560950701" MODIFIED="1212777501990">
+<node TEXT="Vạch" FOLDED="true" ID="_Freeplane_Link_1979277285" CREATED="1124560950701" MODIFIED="1212777517406">
+<node TEXT="Vạch" ID="_Freeplane_Link_89124429" CREATED="1124560950701" MODIFIED="1212777524177"/>
+<node TEXT="Vạch" ID="_Freeplane_Link_173850525" CREATED="1124560950701" MODIFIED="1212777528283"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1001811541" MODIFIED="1212777512462" STYLE="bubble" TEXT="Bao">
-<node CREATED="1124560950701" ID="_Freeplane_Link_1677737286" MODIFIED="1212777533715" STYLE="bubble" TEXT="Bao"/>
-<node CREATED="1124560950701" ID="_Freeplane_Link_978246353" MODIFIED="1212777537373" STYLE="bubble" TEXT="Bao"/>
+<node TEXT="Bao" FOLDED="true" ID="_Freeplane_Link_1001811541" CREATED="1124560950701" MODIFIED="1212777512462" STYLE="bubble">
+<node TEXT="Bao" ID="_Freeplane_Link_1677737286" CREATED="1124560950701" MODIFIED="1212777533715" STYLE="bubble"/>
+<node TEXT="Bao" ID="_Freeplane_Link_978246353" CREATED="1124560950701" MODIFIED="1212777537373" STYLE="bubble"/>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_529813828" MODIFIED="1212777568093" TEXT="Thu gọn các nút">
+<node TEXT="Thu gọn các nút" FOLDED="true" ID="Freeplane_Link_529813828" CREATED="1124560950701" MODIFIED="1212777568093" COLOR="#669900">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_307016912" MODIFIED="1212777574812" TEXT="Thu gọn">
+<node TEXT="Thu gọn" FOLDED="true" ID="_Freeplane_Link_307016912" CREATED="1124560950701" MODIFIED="1212777574812">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_445954768" MODIFIED="1212777586138" TEXT="Ẩn">
+<node TEXT="Ẩn" ID="Freeplane_Link_445954768" CREATED="1124560950701" MODIFIED="1212777586138">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="_Freeplane_Link_1488567837" MODIFIED="1212777578738" TEXT="Cây">
+<node TEXT="Cây" FOLDED="true" ID="_Freeplane_Link_1488567837" CREATED="1124560950701" MODIFIED="1212777578738">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" ID="Freeplane_Link_1469000164" MODIFIED="1212777599197" TEXT="Sồi">
+<node TEXT="Sồi" ID="Freeplane_Link_1469000164" CREATED="1124560950701" MODIFIED="1212777599197">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_1452025216" MODIFIED="1212777636660" TEXT="Bạch Đàn">
+<node TEXT="Bạch Đàn" ID="Freeplane_Link_1452025216" CREATED="1124560950701" MODIFIED="1212777636660">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950701" ID="Freeplane_Link_1692720585" MODIFIED="1212777644092" TEXT="Dừa">
+<node TEXT="Dừa" ID="Freeplane_Link_1692720585" CREATED="1124560950701" MODIFIED="1212777644092">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_926405317" MODIFIED="1124560950701" TEXT="Các nút có thể chứa các liên kết mở được tới ... ">
+<node TEXT="Các nút có thể chứa các liên kết mở được tới ... " FOLDED="true" ID="Freeplane_Link_926405317" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#669900">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_1096564272" MODIFIED="1124560950701" TEXT="các trang Web">
+<node TEXT="các trang Web" FOLDED="true" ID="Freeplane_Link_1096564272" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#006699">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" LINK="http://www.google.com/" MODIFIED="1124560950701" TEXT="http://www.google.com/">
+<node TEXT="http://www.google.com/" ID="ID_505817229" CREATED="1124560950701" MODIFIED="1124560950701" LINK="http://www.google.com/">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_840079380" LINK="www.google.com" MODIFIED="1124560950701" TEXT="www.google.com">
+<node TEXT="www.google.com" FOLDED="true" ID="Freeplane_Link_840079380" CREATED="1124560950701" MODIFIED="1124560950701" LINK="www.google.com">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950701" MODIFIED="1124560950701" TEXT="Freeplane coi đó là thực thi được :)">
+<node TEXT="Freeplane coi đó là thực thi được :)" ID="ID_435844108" CREATED="1124560950701" MODIFIED="1124560950701" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_137912631" MODIFIED="1212777679733" TEXT="Các thư mục trên máy">
+<node TEXT="Các thư mục trên máy" FOLDED="true" ID="Freeplane_Link_137912631" CREATED="1124560950701" MODIFIED="1212777679733" COLOR="#006699">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" LINK="file:/C:/Program%20Files/" MODIFIED="1124560950701" TEXT="C:/Program Files/">
+<node TEXT="C:/Program Files/" ID="ID_887677138" CREATED="1124560950701" MODIFIED="1124560950701" LINK="file:/C:/Program%20Files/">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950701" LINK="/home/" MODIFIED="1124560950701" TEXT="/home/">
+<node TEXT="/home/" ID="ID_332286171" CREATED="1124560950701" MODIFIED="1124560950701" LINK="/home/">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#006699" CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_774013517" MODIFIED="1212777689162" TEXT="Các chương trình">
+<node TEXT="Các chương trình" FOLDED="true" ID="Freeplane_Link_774013517" CREATED="1124560950701" MODIFIED="1212777689162" COLOR="#006699">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950701" FOLDED="true" ID="Freeplane_Link_26552136" LINK="file:/C:/WINNT/regedit.exe" MODIFIED="1124560950701" TEXT="C:\WINNT\regedit.exe">
+<node TEXT="C:\WINNT\regedit.exe" FOLDED="true" ID="Freeplane_Link_26552136" CREATED="1124560950701" MODIFIED="1124560950701" LINK="file:/C:/WINNT/regedit.exe">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#006600" CREATED="1124560950701" ID="Freeplane_Link_741962292" MODIFIED="1212777731703" TEXT="Những nút nào ta có thể khởi chạy được thì sẽ có biểu tượng bên cạnh">
+<node TEXT="Những nút nào ta có thể khởi chạy được thì sẽ có biểu tượng bên cạnh" ID="Freeplane_Link_741962292" CREATED="1124560950701" MODIFIED="1212777731703" COLOR="#006600">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1730775912" MODIFIED="1212777751830" TEXT="Bất kỳ tài liệu nào có trên máy hoặc trên mạng nội bộ của công ty bạn">
+<node TEXT="Bất kỳ tài liệu nào có trên máy hoặc trên mạng nội bộ của công ty bạn" ID="Freeplane_Link_1730775912" CREATED="1124560950717" MODIFIED="1212777751830">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_839677176" MODIFIED="1212777781964" TEXT="Nút có nhiều dòng">
+<node TEXT="Nút có nhiều dòng" FOLDED="true" ID="_Freeplane_Link_839677176" CREATED="1124560950717" MODIFIED="1212777781964" COLOR="#669900">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1423568963" MODIFIED="1212778004892" TEXT="Bạn có thể xem các nút nhiều dòng giống như một đoạn văn hoặc thậm chí vài đoạn văn. Nếu bạn dùng Freeplane để tổng hợp kiến thức cho mình, điều này cực kỳ khó tránh. Th [...]
-<node CREATED="1124560950717" ID="_Freeplane_Link_1686184172" MODIFIED="1212777863429" TEXT=""Khoa học là sự thật; giống như nhà được làm bằng đá vậy, tức là khoa học được xây dựng từ sự thật; nhưng một đống đá chưa chắc đã là nhà, và một m [...]
+<node TEXT="Bạn có thể xem các nút nhiều dòng giống như một đoạn văn hoặc thậm chí vài đoạn văn. Nếu bạn dùng Freeplane để tổng hợp kiến thức cho mình, điều này cực kỳ khó tránh. Thay vì phải tạo ra một tập tin khác đ& [...]
+<node TEXT=""Khoa học là sự thật; giống như nhà được làm bằng đá vậy, tức là khoa học được xây dựng từ sự thật; nhưng một đống đá chưa chắc đã là nhà, và một mớ sự thật thì không nhất thiết ph&#x [...]
</node>
-<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_5710499" MODIFIED="1212778042305" TEXT="Nút nhiều dòng ngắn có xuống dòng">
-<node CREATED="1124560950717" ID="_Freeplane_Link_1957797574" MODIFIED="1212778070270" TEXT="Dòng,
thứ hai,

thêm một dòng nữa,
Rồi, bạn nghĩ sao?"/>
+<node TEXT="Nút nhiều dòng ngắn có xuống dòng" FOLDED="true" ID="Freeplane_Link_5710499" CREATED="1124560950717" MODIFIED="1212778042305" COLOR="#669900">
+<node TEXT="Dòng,
thứ hai,

thêm một dòng nữa,
Rồi, bạn nghĩ sao?" ID="_Freeplane_Link_1957797574" CREATED="1124560950717" MODIFIED="1212778070270"/>
</node>
-<node COLOR="#669900" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_331692355" MODIFIED="1212778199926" TEXT="Dùng nút để giả lập các đường nối">
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_810259854" MODIFIED="1212778205938" TEXT="Cây">
+<node TEXT="Dùng nút để giả lập các đường nối" FOLDED="true" ID="Freeplane_Link_331692355" CREATED="1124560950717" MODIFIED="1212778199926" COLOR="#669900">
+<node TEXT="Cây" FOLDED="true" ID="Freeplane_Link_810259854" CREATED="1124560950717" MODIFIED="1212778205938">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1736834382" MODIFIED="1212778216365" TEXT="là">
+<node TEXT="là" FOLDED="true" ID="Freeplane_Link_1736834382" CREATED="1124560950717" MODIFIED="1212778216365" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1045607374" MODIFIED="1212778233261" TEXT="Sồi">
+<node TEXT="Sồi" ID="Freeplane_Link_1045607374" CREATED="1124560950717" MODIFIED="1212778233261">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_238870301" MODIFIED="1212778222678" TEXT="là">
+<node TEXT="là" FOLDED="true" ID="Freeplane_Link_238870301" CREATED="1124560950717" MODIFIED="1212778222678" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_822090058" MODIFIED="1212778260217" TEXT="Dừa">
+<node TEXT="Dừa" ID="Freeplane_Link_822090058" CREATED="1124560950717" MODIFIED="1212778260217">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1142791359" MODIFIED="1212778226462" TEXT="là">
+<node TEXT="là" FOLDED="true" ID="Freeplane_Link_1142791359" CREATED="1124560950717" MODIFIED="1212778226462" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_687154358" MODIFIED="1212778269821" TEXT="Bạch đàn">
+<node TEXT="Bạch đàn" ID="Freeplane_Link_687154358" CREATED="1124560950717" MODIFIED="1212778269821">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_600637247" MODIFIED="1212778211448" TEXT="Cây">
+<node TEXT="Cây" FOLDED="true" ID="Freeplane_Link_600637247" CREATED="1124560950717" MODIFIED="1212778211448">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1566093997" MODIFIED="1124560950717" TEXT="<>">
+<node TEXT="<>" FOLDED="true" ID="Freeplane_Link_1566093997" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1360724162" MODIFIED="1212778284996" TEXT="Lá">
+<node TEXT="Lá" ID="Freeplane_Link_1360724162" CREATED="1124560950717" MODIFIED="1212778284996">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#999999" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_874353698" MODIFIED="1124560950717" TEXT="<>">
+<node TEXT="<>" FOLDED="true" ID="Freeplane_Link_874353698" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_442156920" MODIFIED="1212778280357" TEXT="Thân">
+<node TEXT="Thân" ID="Freeplane_Link_442156920" CREATED="1124560950717" MODIFIED="1212778280357">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node COLOR="#669900" CREATED="1124560950717" ID="Freeplane_Link_1642046031" MODIFIED="1212778124489" TEXT="Có thể thêm các biểu tượng vào trong nút">
+<node TEXT="Có thể thêm các biểu tượng vào trong nút" ID="Freeplane_Link_1642046031" CREATED="1124560950717" MODIFIED="1212778124489" COLOR="#669900">
<icon BUILTIN="knotify"/>
<icon BUILTIN="flag"/>
<icon BUILTIN="button_cancel"/>
<icon BUILTIN="button_ok"/>
<icon BUILTIN="back"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_318937820" MODIFIED="1212778136336" TEXT="Nút nằm trong mây">
-<cloud/>
-<node CREATED="1124560950717" ID="Freeplane_Link_127508145" MODIFIED="1212778144198" TEXT="Với màu bất kỳ">
-<cloud COLOR="#f1ede6"/>
+<node TEXT="Nút nằm trong mây" FOLDED="true" ID="_Freeplane_Link_318937820" CREATED="1124560950717" MODIFIED="1212778136336" COLOR="#407000">
+<cloud COLOR="#f0f0f0" SHAPE="ARC"/>
+<node TEXT="Với màu bất kỳ" ID="Freeplane_Link_127508145" CREATED="1124560950717" MODIFIED="1212778144198">
+<cloud COLOR="#f1ede6" SHAPE="ARC"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1750585847" MODIFIED="1212778302612" TEXT="Tạo các liên kết đồ hoạ">
-<node CREATED="1124560950717" ID="_Freeplane_Link_1212380407" MODIFIED="1212778315000" TEXT="Nối nút này">
-<arrowlink DESTINATION="_Freeplane_Link_1249400461" ENDARROW="Default" ENDINCLINATION="41;0;" STARTARROW="None" STARTINCLINATION="41;0;"/>
+<node TEXT="Tạo các liên kết đồ hoạ" FOLDED="true" ID="_Freeplane_Link_1750585847" CREATED="1124560950717" MODIFIED="1212778302612" COLOR="#407000">
+<node TEXT="Nối nút này" ID="_Freeplane_Link_1212380407" CREATED="1124560950717" MODIFIED="1212778315000">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1249400461" STARTINCLINATION="41;0;" ENDINCLINATION="41;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1249400461" MODIFIED="1212778320025" TEXT="Sang nút khác">
-<arrowlink COLOR="#6600ff" DESTINATION="_Freeplane_Link_880551392" ENDARROW="Default" ENDINCLINATION="47;0;" ID="Freeplane_Arrow_Link_85185909" STARTARROW="None" STARTINCLINATION="47;0;"/>
+<node TEXT="Sang nút khác" ID="_Freeplane_Link_1249400461" CREATED="1124560950717" MODIFIED="1212778320025">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#6600ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_880551392" STARTINCLINATION="47;0;" ENDINCLINATION="47;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_880551392" MODIFIED="1212778358043" TEXT="Màu sắc khác nhau">
-<arrowlink DESTINATION="_Freeplane_Link_1789233193" ENDARROW="Default" ENDINCLINATION="87;57;" ID="Freeplane_Arrow_Link_1672464612" STARTARROW="None" STARTINCLINATION="87;57;"/>
+<node TEXT="Màu sắc khác nhau" ID="_Freeplane_Link_880551392" CREATED="1124560950717" MODIFIED="1212778358043">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1789233193" STARTINCLINATION="87;57;" ENDINCLINATION="87;57;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1789233193" MODIFIED="1212778358052" TEXT="Và đường đi khác nhau"/>
+<node TEXT="Và đường đi khác nhau" ID="_Freeplane_Link_1789233193" CREATED="1124560950717" MODIFIED="1212778358052"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_127668276" MODIFIED="1212778379246" TEXT="Có thể đặt nút ở bất cứ đâu">
-<node CREATED="1124560950717" ID="_Freeplane_Link_894936766" MODIFIED="1212778384220" TEXT="Một"/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1942481455" MODIFIED="1212778388659" TEXT="Nữa"/>
+<node TEXT="Có thể đặt nút ở bất cứ đâu" FOLDED="true" ID="_Freeplane_Link_127668276" CREATED="1124560950717" MODIFIED="1212778379246" COLOR="#407000">
+<node TEXT="Một" ID="_Freeplane_Link_894936766" CREATED="1124560950717" MODIFIED="1212778384220"/>
+<node TEXT="Nữa" ID="_Freeplane_Link_1942481455" CREATED="1124560950717" MODIFIED="1212778388659"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1709752669" MODIFIED="1212938378923" POSITION="right" TEXT="Tạo và xoá nút">
-<node CREATED="1124560950717" ID="Freeplane_Link_466494929" MODIFIED="1212938410031" TEXT="Nhấn INSERT để tạo nút con."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1420629436" MODIFIED="1212938456267" TEXT="Nhấn INSERT trong lúc soạn thảo nút để tạo nút con trong khi đang soạn thảo nút."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1862216916" MODIFIED="1212938490736" TEXT="Nhấn ENTER để tạo một nút anh bên dưới nút đang làm việc."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_41397605" MODIFIED="1212938512183" TEXT="Nhấn SHIFT+ENTER để tạo nút anh bên trên nút đang làm việc.."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1979720125" MODIFIED="1212938527676" TEXT="Nhấn DELETE để xoá nút đang chọn."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_635381308" MODIFIED="1212938567744" TEXT="Nhấn CTRL+X để xoá nút nhưng vẫn lưu vào bảng nháp để dán lại khi cần."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_782501155" MODIFIED="1212938614028" TEXT="Cũng có thể bấm chuột phải lên nút để mở trình đơn ngữ cảnh của nút."/>
+<node TEXT="Tạo và xoá nút" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1709752669" CREATED="1124560950717" MODIFIED="1212938378923" COLOR="#407000">
+<node TEXT="Nhấn INSERT để tạo nút con." ID="Freeplane_Link_466494929" CREATED="1124560950717" MODIFIED="1212938410031"/>
+<node TEXT="Nhấn INSERT trong lúc soạn thảo nút để tạo nút con trong khi đang soạn thảo nút." ID="Freeplane_Link_1420629436" CREATED="1124560950717" MODIFIED="1212938456267"/>
+<node TEXT="Nhấn ENTER để tạo một nút anh bên dưới nút đang làm việc." ID="Freeplane_Link_1862216916" CREATED="1124560950717" MODIFIED="1212938490736"/>
+<node TEXT="Nhấn SHIFT+ENTER để tạo nút anh bên trên nút đang làm việc.." ID="Freeplane_Link_41397605" CREATED="1124560950717" MODIFIED="1212938512183"/>
+<node TEXT="Nhấn DELETE để xoá nút đang chọn." ID="Freeplane_Link_1979720125" CREATED="1124560950717" MODIFIED="1212938527676"/>
+<node TEXT="Nhấn CTRL+X để xoá nút nhưng vẫn lưu vào bảng nháp để dán lại khi cần." ID="Freeplane_Link_635381308" CREATED="1124560950717" MODIFIED="1212938567744"/>
+<node TEXT="Cũng có thể bấm chuột phải lên nút để mở trình đơn ngữ cảnh của nút." ID="Freeplane_Link_782501155" CREATED="1124560950717" MODIFIED="1212938614028"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1700974092" MODIFIED="1212938627475" POSITION="right" TEXT="Soạn thảo nội dung nút">
-<node CREATED="1124560950717" ID="_Freeplane_Link_519923426" MODIFIED="1212938697164" TEXT="Để soạn thảo nút, nhấn F2, HOME hoặc END, hoặc chọn Sửa trong trình đơn ngữ cảnh của nút. Để hoàn tất việc soạn thảo, nhấn ENTER.">
-<arrowlink DESTINATION="_Freeplane_Link_519923426" ENDARROW="Default" ENDINCLINATION="0;0;" ID="Freeplane_Arrow_Link_1179992477" STARTARROW="None" STARTINCLINATION="0;0;"/>
+<node TEXT="Soạn thảo nội dung nút" FOLDED="true" POSITION="right" ID="Freeplane_Link_1700974092" CREATED="1124560950717" MODIFIED="1212938627475" COLOR="#407000">
+<node TEXT="Để soạn thảo nút, nhấn F2, HOME hoặc END, hoặc chọn Sửa trong trình đơn ngữ cảnh của nút. Để hoàn tất việc soạn thảo, nhấn ENTER." ID="_Freeplane_Link_519923426" CREATED="1124560950717" MODIFIED="1212938697164">
+<arrowlink SHAPE="LINE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_519923426" STARTINCLINATION="0;0;" ENDINCLINATION="0;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_371020476" MODIFIED="1212938726075" TEXT="Để thay thế văn bản trong một nút, hãy đánh văn bản mới."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_49122571" MODIFIED="1212938763739" TEXT="Nhấn ALT+ENTER để soạn thảo ở chế độ nút dài, ngay cả khi nút được chọn là nút ngắn."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1849848547" MODIFIED="1212938890183" TEXT="Để tách 1 nút dài, dùng nút Tách nút hoặc nhấn ALT+T trong ô soạn thảo nút dài."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_445809524" MODIFIED="1212939146247" TEXT="Để xuống dòng mới khi soạn thảo nút trong ô soạn thảo nút dài, nhấn CTRL+ENTER. Không thể xuống dòng khi soạn thảo nút ngắn.">
-<arrowlink DESTINATION="_Freeplane_Link_1445647544" ENDARROW="Default" ENDINCLINATION="118;0;" ID="Freeplane_Arrow_Link_1628309717" STARTARROW="None" STARTINCLINATION="118;0;"/>
+<node TEXT="Để thay thế văn bản trong một nút, hãy đánh văn bản mới." ID="Freeplane_Link_371020476" CREATED="1124560950717" MODIFIED="1212938726075"/>
+<node TEXT="Nhấn ALT+ENTER để soạn thảo ở chế độ nút dài, ngay cả khi nút được chọn là nút ngắn." ID="Freeplane_Link_49122571" CREATED="1124560950717" MODIFIED="1212938763739"/>
+<node TEXT="Để tách 1 nút dài, dùng nút Tách nút hoặc nhấn ALT+T trong ô soạn thảo nút dài." ID="Freeplane_Link_1849848547" CREATED="1124560950717" MODIFIED="1212938890183"/>
+<node TEXT="Để xuống dòng mới khi soạn thảo nút trong ô soạn thảo nút dài, nhấn CTRL+ENTER. Không thể xuống dòng khi soạn thảo nút ngắn." ID="Freeplane_Link_445809524" CREATED="1124560950717" MODIFIED="1212939146247">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1445647544" STARTINCLINATION="118;0;" ENDINCLINATION="118;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1135920821" MODIFIED="1212939198507" TEXT="Để chép một chuỗi vào trong bảng nháp trong khi sửa nút dài, nhấn phải chuột và chọn Chép."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1742302905" MODIFIED="1212939252214" TEXT="Để chèn các ký tự đặc biệt như ©, chèn chúng trong trình xử lý văn bản bạn thích, như OpenOffice Writer hoặc Microsoft Word, rồi chép và dán lại vào trong Freeplane."/>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1445647544" MODIFIED="1212939458991" TEXT="Theo thiết lập mặc định, gõ ENTER để kết thúc việc soạn thảo nút dài, CTRL+ENTER để xuống dòng. Nhưng nếu không chọn ô "ENTER để kết thúc việc soạn thảo" thì ngược lại, [...]
-<node CREATED="1124560950717" ID="Freeplane_Link_911192475" MODIFIED="1212938950572" TEXT="Freeplane hoàn toàn hỗ trợ Unicode nên bạn có thể thoải mái sử dụng các ký tự đặc biệt trong ngôn ngữ của mình."/>
+<node TEXT="Để chép một chuỗi vào trong bảng nháp trong khi sửa nút dài, nhấn phải chuột và chọn Chép." ID="Freeplane_Link_1135920821" CREATED="1124560950717" MODIFIED="1212939198507"/>
+<node TEXT="Để chèn các ký tự đặc biệt như ©, chèn chúng trong trình xử lý văn bản bạn thích, như OpenOffice Writer hoặc Microsoft Word, rồi chép và dán lại vào trong Freeplane." ID="Freeplane_Link_1742302905" CREATED="1124560950717" MODIFIED="1212939252214"/>
+<node TEXT="Theo thiết lập mặc định, gõ ENTER để kết thúc việc soạn thảo nút dài, CTRL+ENTER để xuống dòng. Nhưng nếu không chọn ô "ENTER để kết thúc việc soạn thảo" thì ngược lại, ENTER sẽ xuống dòng và CTRL+ENTER sẽ kết t [...]
+<node TEXT="Freeplane hoàn toàn hỗ trợ Unicode nên bạn có thể thoải mái sử dụng các ký tự đặc biệt trong ngôn ngữ của mình." ID="Freeplane_Link_911192475" CREATED="1124560950717" MODIFIED="1212938950572"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1660149394" MODIFIED="1212939494464" POSITION="right" TEXT="Định dạng nút">
-<node CREATED="1124560950717" ID="Freeplane_Link_901808509" MODIFIED="1212939507793" TEXT="Để tô đậm nút, nhấn CTRL+B">
+<node TEXT="Định dạng nút" FOLDED="true" POSITION="right" ID="Freeplane_Link_1660149394" CREATED="1124560950717" MODIFIED="1212939494464" COLOR="#407000">
+<node TEXT="Để tô đậm nút, nhấn CTRL+B" ID="Freeplane_Link_901808509" CREATED="1124560950717" MODIFIED="1212939507793">
<edge WIDTH="thin"/>
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_887688331" MODIFIED="1212939523169" TEXT="Để làm nghiêng nút, nhấn CTRL+I">
+<node TEXT="Để làm nghiêng nút, nhấn CTRL+I" ID="Freeplane_Link_887688331" CREATED="1124560950717" MODIFIED="1212939523169">
<edge WIDTH="thin"/>
-<font ITALIC="true" NAME="Dialog" SIZE="12"/>
+<font NAME="Dialog" SIZE="12" ITALIC="true"/>
</node>
-<node COLOR="#6699ff" CREATED="1124560950717" ID="Freeplane_Link_449007281" MODIFIED="1212939597449" TEXT="Để đổi màu chữ trong nút, nhấn ALT+F.">
-<edge WIDTH="thin"/>
+<node TEXT="Để đổi màu chữ trong nút, nhấn ALT+F." ID="Freeplane_Link_449007281" CREATED="1124560950717" MODIFIED="1212939597449" COLOR="#6699ff">
<font NAME="Dialog" SIZE="12"/>
+<edge WIDTH="thin"/>
</node>
-<node BACKGROUND_COLOR="#ffff00" CREATED="1124560950717" ID="Freeplane_Link_951654340" MODIFIED="1212939683537" TEXT="Để đổi màu nền của nút, bấm chuột phải để mở trình đơn ngữ cảnh và chọn Định dạng > Màu nền."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_466308270" MODIFIED="1212939765548" TEXT="Để tăng cỡ phông cho nút, nhấn CTRL++(không phải dấu + trong ô số).">
+<node TEXT="Để đổi màu nền của nút, bấm chuột phải để mở trình đơn ngữ cảnh và chọn Định dạng > Màu nền." ID="Freeplane_Link_951654340" CREATED="1124560950717" MODIFIED="1212939683537" BACKGROUND_COLOR="#ffff00"/>
+<node TEXT="Để tăng cỡ phông cho nút, nhấn CTRL++(không phải dấu + trong ô số)." ID="Freeplane_Link_466308270" CREATED="1124560950717" MODIFIED="1212939765548">
<edge WIDTH="thin"/>
<font NAME="Dialog" SIZE="13"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_440360564" MODIFIED="1212939823815" TEXT="Để giảm cỡ phông cho nút, nhấn CTRL+- (không phải dấu - trong ô số).">
+<node TEXT="Để giảm cỡ phông cho nút, nhấn CTRL+- (không phải dấu - trong ô số)." ID="Freeplane_Link_440360564" CREATED="1124560950717" MODIFIED="1212939823815">
<edge WIDTH="thin"/>
<font NAME="Dialog" SIZE="11"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_652089543" MODIFIED="1212939860165" TEXT="Để đổi họ phông, dùng ô nằm trên thanh công cụ chính.">
+<node TEXT="Để đổi họ phông, dùng ô nằm trên thanh công cụ chính." ID="Freeplane_Link_652089543" CREATED="1124560950717" MODIFIED="1212939860165">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_148953194" MODIFIED="1212939883261" TEXT="Để chép định dạng của nút, nhấn ALT+C"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1790383058" MODIFIED="1213113746548" TEXT="Để dán định dạng vào nút khác, nhấn ALT+V.">
+<node TEXT="Để chép định dạng của nút, nhấn ALT+C" ID="Freeplane_Link_148953194" CREATED="1124560950717" MODIFIED="1212939883261"/>
+<node TEXT="Để dán định dạng vào nút khác, nhấn ALT+V." ID="Freeplane_Link_1790383058" CREATED="1124560950717" MODIFIED="1213113746548">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_526328879" MODIFIED="1124560950717" POSITION="right" TEXT="Dùng kiểu dáng hiện trạng">
-<node CREATED="1124560950717" ID="Freeplane_Link_1931253902" MODIFIED="1213115031324" TEXT="Để dùng một kiểu dáng hiện trạng, trong trình đơn ngữ cảnh cho nút, chọn Kiểu dáng hienẹ trạng > Kiểu dáng bạn cần. Để thực hiện việc này một cách nhanh chóng, hãy dùng các phí [...]
-<node CREATED="1124560950717" ID="Freeplane_Link_607716845" MODIFIED="1213115115676" TEXT="Để thêm các kiểu dáng hiện trạng cần dùng, xin bạn hãy sửa lại tập tin "patterns.xml" nằm trong thư mục ".freeplane" ở thư mục chính của bạn."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_214851566" MODIFIED="1213115231404" TEXT="Lưu ý là trên tập tin patterns.xml, các kiểu dáng hiện trạng dùng cho nút được đánh dấu bằng thẻ <node>. Với các đường nối, thẻ tương ứng là thẻ <edge>. Thẻ <node> có thǬ [...]
+<node TEXT="Dùng kiểu dáng hiện trạng" FOLDED="true" POSITION="right" ID="Freeplane_Link_526328879" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#407000">
+<node TEXT="Để dùng một kiểu dáng hiện trạng, trong trình đơn ngữ cảnh cho nút, chọn Kiểu dáng hienẹ trạng > Kiểu dáng bạn cần. Để thực hiện việc này một cách nhanh chóng, hãy dùng các phím tắt như trình đơn ngữ cảnh đ [...]
+<node TEXT="Để thêm các kiểu dáng hiện trạng cần dùng, xin bạn hãy sửa lại tập tin "patterns.xml" nằm trong thư mục ".freeplane" ở thư mục chính của bạn." ID="Freeplane_Link_607716845" CREATED="1124560950717" MODIFIED="1213115115676"/>
+<node TEXT="Lưu ý là trên tập tin patterns.xml, các kiểu dáng hiện trạng dùng cho nút được đánh dấu bằng thẻ <node>. Với các đường nối, thẻ tương ứng là thẻ <edge>. Thẻ <node> có thể chứa thẻ <font> chỉnh phông chữ. Xin [...]
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1697687428" MODIFIED="1213115890776" POSITION="right" TEXT="Dùng mây để tô đậm các nút">
-<node CREATED="1124560950717" ID="Freeplane_Link_544523668" MODIFIED="1213115744169" TEXT="Ta vẽ các đám mây để tô đậm một vùng nào đó. Vùng được tô đậm bao gồm nút và các nút con của nó."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1648784490" MODIFIED="1213115790803" TEXT="Để thêm một đám mây, nhấn CTRL + SHIFT + B hoặc mở trình đơn ngữ cảnh của nút và Chèn > Mây."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1284312875" MODIFIED="1213115825640" TEXT="Để đổi màu cho đám mây, mở trình đơn ngữ cảnh của nút và chọn Định dạng > Màu mây."/>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1236353835" MODIFIED="1213115861772" TEXT="Ta có thể tô mây màu xanh...">
-<cloud COLOR="#e1f2e1"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_566702024" MODIFIED="1213115868739" TEXT="... hoặc màu nâu, nếu thích.">
-<cloud COLOR="#ede5d5"/>
+<node TEXT="Dùng mây để tô đậm các nút" FOLDED="true" POSITION="right" ID="Freeplane_Link_1697687428" CREATED="1124560950717" MODIFIED="1213115890776" COLOR="#407000">
+<node TEXT="Ta vẽ các đám mây để tô đậm một vùng nào đó. Vùng được tô đậm bao gồm nút và các nút con của nó." ID="Freeplane_Link_544523668" CREATED="1124560950717" MODIFIED="1213115744169"/>
+<node TEXT="Để thêm một đám mây, nhấn CTRL + SHIFT + B hoặc mở trình đơn ngữ cảnh của nút và Chèn > Mây." ID="Freeplane_Link_1648784490" CREATED="1124560950717" MODIFIED="1213115790803"/>
+<node TEXT="Để đổi màu cho đám mây, mở trình đơn ngữ cảnh của nút và chọn Định dạng > Màu mây." ID="Freeplane_Link_1284312875" CREATED="1124560950717" MODIFIED="1213115825640"/>
+<node TEXT="Ta có thể tô mây màu xanh..." FOLDED="true" ID="Freeplane_Link_1236353835" CREATED="1124560950717" MODIFIED="1213115861772">
+<cloud COLOR="#e1f2e1" SHAPE="ARC"/>
+<node TEXT="... hoặc màu nâu, nếu thích." ID="Freeplane_Link_566702024" CREATED="1124560950717" MODIFIED="1213115868739">
+<cloud COLOR="#ede5d5" SHAPE="ARC"/>
</node>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_203858515" MODIFIED="1212778458695" POSITION="right" TEXT="Thêm siêu liên kết">
-<node CREATED="1124560950717" ID="Freeplane_Link_758407944" MODIFIED="1213116016725" TEXT="Để chèn siêu liên kết vào nút, nhấn Ctrl + K hoặc mở trình đơn ngữ cảnh của nút và chọn Chèn > Siêu liên kết"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_843180508" MODIFIED="1213116059133" TEXT="Để xoá siêu liên kết, xoá ô chứa siêu liên kết thành chuỗi rỗng sau khi nhấn Ctrl + K."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_460506507" MODIFIED="1213116116691" TEXT="<html>
 <head>
 
 </head>
 <body>
 Để liên kết tới một địa chỉ thư điện tử, hãy để siêu liên kết dạng <i>mailto:don.bonton at supermail.com</i>.
 </body>
</html>
">
+<node TEXT="Thêm siêu liên kết" FOLDED="true" POSITION="right" ID="Freeplane_Link_203858515" CREATED="1124560950717" MODIFIED="1212778458695" COLOR="#407000">
+<node TEXT="Để chèn siêu liên kết vào nút, nhấn Ctrl + K hoặc mở trình đơn ngữ cảnh của nút và chọn Chèn > Siêu liên kết" ID="Freeplane_Link_758407944" CREATED="1124560950717" MODIFIED="1213116016725"/>
+<node TEXT="Để xoá siêu liên kết, xoá ô chứa siêu liên kết thành chuỗi rỗng sau khi nhấn Ctrl + K." ID="Freeplane_Link_843180508" CREATED="1124560950717" MODIFIED="1213116059133"/>
+<node ID="Freeplane_Link_460506507" CREATED="1124560950717" MODIFIED="1213116116691"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ Để liên kết tới một địa chỉ thư điện tử, hãy để siêu liên kết dạng <i>mailto:don.bonton at supermail.com</i>.
+ </body>
+</html>
+
+</richcontent>
<edge WIDTH="thin"/>
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1893502301" MODIFIED="1213116243122" TEXT="<html>
 <head>
 
 </head>
 <body>
 Để tạo liên kết tới địa chỉ thư điện tử, có thêm đầu đề thư, hãy đặt siêu liên kết theo dạng <i>mailto:don.bonton at supermail.com?subject=L [...]
-<node CREATED="1124560950717" ID="Freeplane_Link_654534923" MODIFIED="1213116285868" TEXT="Siêu liên kết có thể trỏ tới trang web, các tập tin trên máy, hoặc hòm thư điện tử."/>
+<node ID="Freeplane_Link_1893502301" CREATED="1124560950717" MODIFIED="1213116243122"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ Để tạo liên kết tới địa chỉ thư điện tử, có thêm đầu đề thư, hãy đặt siêu liên kết theo dạng <i>mailto:don.bonton at supermail.com?subject=Last phone call</i>.
+ </body>
+</html>
+
+</richcontent>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1044397139" MODIFIED="1212778452263" POSITION="right" TEXT="Thêm biểu tượng">
-<edge WIDTH="thin"/>
+<node TEXT="Siêu liên kết có thể trỏ tới trang web, các tập tin trên máy, hoặc hòm thư điện tử." ID="Freeplane_Link_654534923" CREATED="1124560950717" MODIFIED="1213116285868"/>
+</node>
+<node TEXT="Thêm biểu tượng" FOLDED="true" POSITION="right" ID="Freeplane_Link_1044397139" CREATED="1124560950717" MODIFIED="1212778452263" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1829828780" MODIFIED="1213116335125" TEXT="Có thể thêm nhiều biểu tượng cho nút."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_749910938" MODIFIED="1213116457034" TEXT="Để chèn biểu tượng vào nút, chọn mộ nút và nhấn một trong các biểu tượng nằm ở thanh lề trái. Khi di chuyển con trỏ sang thanh lề trái, giữ ALT hoặc CONTROL để khi chuột qua một nút khác, [...]
-<node CREATED="1124560950717" ID="Freeplane_Link_1459983426" MODIFIED="1213116553045" TEXT="Để xoá một biểu tượng, nhấn vào hình chữ X đỏ trên thanh lề trái."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_27863108" MODIFIED="1213116559061" TEXT="Để xoá tất cả các biểu tượng, nhấn vào hình thùng rác trên thanh lề trái."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_866741606" MODIFIED="1213116587601" TEXT="Ngoài cách chọn biểu tượng trên thanh lề trái ra, ta có thể nhấn Alt + I."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1888291966" MODIFIED="1213116630917" TEXT="Ngoài các biểu tượng được Freeplane cung cấp, bạn không thể dùng các biểu tượng nào khác."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1922517135" MODIFIED="1213116749546" TEXT="Để ẩn hoặc hiện thanh lề trái, trên trình đơn ngữ cảnh của nền vùng vẽ, chọn Ẩn/hiện thanh lề trái. Thanh công cụ biểu tượng nằm bên trái sẽ được ẩn đi hoặc hi [...]
-<node CREATED="1124560950717" ID="Freeplane_Link_1660196267" MODIFIED="1213116794303" TEXT="Các biểu tượng có trong Freeplane...">
+<edge WIDTH="thin"/>
+<node TEXT="Có thể thêm nhiều biểu tượng cho nút." ID="Freeplane_Link_1829828780" CREATED="1124560950717" MODIFIED="1213116335125"/>
+<node TEXT="Để chèn biểu tượng vào nút, chọn mộ nút và nhấn một trong các biểu tượng nằm ở thanh lề trái. Khi di chuyển con trỏ sang thanh lề trái, giữ ALT hoặc CONTROL để khi chuột qua một nút khác, nút cũ vẫn được chọn." ID="Freepla [...]
+<node TEXT="Để xoá một biểu tượng, nhấn vào hình chữ X đỏ trên thanh lề trái." ID="Freeplane_Link_1459983426" CREATED="1124560950717" MODIFIED="1213116553045"/>
+<node TEXT="Để xoá tất cả các biểu tượng, nhấn vào hình thùng rác trên thanh lề trái." ID="Freeplane_Link_27863108" CREATED="1124560950717" MODIFIED="1213116559061"/>
+<node TEXT="Ngoài cách chọn biểu tượng trên thanh lề trái ra, ta có thể nhấn Alt + I." ID="Freeplane_Link_866741606" CREATED="1124560950717" MODIFIED="1213116587601"/>
+<node TEXT="Ngoài các biểu tượng được Freeplane cung cấp, bạn không thể dùng các biểu tượng nào khác." ID="Freeplane_Link_1888291966" CREATED="1124560950717" MODIFIED="1213116630917"/>
+<node TEXT="Để ẩn hoặc hiện thanh lề trái, trên trình đơn ngữ cảnh của nền vùng vẽ, chọn Ẩn/hiện thanh lề trái. Thanh công cụ biểu tượng nằm bên trái sẽ được ẩn đi hoặc hiện ra." ID="Freeplane_Link_1922517135" CREATED="1124560950717" MODIFIED="12131 [...]
+<node TEXT="Các biểu tượng có trong Freeplane..." ID="Freeplane_Link_1660196267" CREATED="1124560950717" MODIFIED="1213116794303">
<icon BUILTIN="help"/>
<icon BUILTIN="messagebox_warning"/>
<icon BUILTIN="idea"/>
@@ -561,325 +704,463 @@
<icon BUILTIN="licq"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="_Freeplane_Link_1996597932" MODIFIED="1213142775692" POSITION="right" TEXT="Thêm liên kết đồ hoạ">
+<node TEXT="Thêm liên kết đồ hoạ" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1996597932" CREATED="1124560950717" MODIFIED="1213142775692" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1935222880" MODIFIED="1213142775699" TEXT="Để tạo liên kết đồ hoạ giữa 2 nút, kéo một nút và thả nó vào một nút khác trong khi giữ Shift + Control; nhả chuột ra trước khi nhả Shift + Control.">
-<arrowlink DESTINATION="_Freeplane_Link_266716332" ENDARROW="Default" ENDINCLINATION="255;0;" ID="Freeplane_Arrow_Link_1428344028" STARTARROW="None" STARTINCLINATION="255;0;"/>
+<node TEXT="Để tạo liên kết đồ hoạ giữa 2 nút, kéo một nút và thả nó vào một nút khác trong khi giữ Shift + Control; nhả chuột ra trước khi nhả Shift + Control." ID="Freeplane_Link_1935222880" CREATED="1124560950717" MODIFIED="1213142775699">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="255;0;" ENDINCLINATION="255;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_215630885" MODIFIED="1213142775723" TEXT="Cách khác: kéo và thả bằng chuột phải.">
+<node TEXT="Cách khác: kéo và thả bằng chuột phải." ID="Freeplane_Link_215630885" CREATED="1124560950717" MODIFIED="1213142775723">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_208378337" MODIFIED="1213142775728" TEXT="Để thay đổi màu sắc cho liên kết, mở trình đơn ngữ cảnh của liên kết, bằng cách nhắp chuột phải vào liên kết.">
+<node TEXT="Để thay đổi màu sắc cho liên kết, mở trình đơn ngữ cảnh của liên kết, bằng cách nhắp chuột phải vào liên kết." ID="_Freeplane_Link_208378337" CREATED="1124560950717" MODIFIED="1213142775728">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1484370636" MODIFIED="1213142775750" TEXT="Ta cũng có thể thay đổi hình mũi tên cho liên kết qua trình đơn ngữ cảnh.">
+<node TEXT="Ta cũng có thể thay đổi hình mũi tên cho liên kết qua trình đơn ngữ cảnh." ID="_Freeplane_Link_1484370636" CREATED="1124560950717" MODIFIED="1213142775750">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_220023730" MODIFIED="1213142775754" TEXT="Để xoá liên kết, cũng mở trình đơn ngữ cảnh của nó và chọn Xoá bỏ mũi tên.">
+<node TEXT="Để xoá liên kết, cũng mở trình đơn ngữ cảnh của nó và chọn Xoá bỏ mũi tên." ID="Freeplane_Link_220023730" CREATED="1124560950717" MODIFIED="1213142775754">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_266716332" MODIFIED="1213142775760" TEXT="Để di chuyển tới một trong hai đầu liên kết, mở trình đơn ngữ cảnh và chọn nút cần chuyển tới.">
+<node TEXT="Để di chuyển tới một trong hai đầu liên kết, mở trình đơn ngữ cảnh và chọn nút cần chuyển tới." ID="_Freeplane_Link_266716332" CREATED="1124560950717" MODIFIED="1213142775760">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1015289745" MODIFIED="1213142775765" TEXT="Để thay đổi đường đi của liên kết mũi tên, bấm chuột vào và di chuyển nó đi.">
-<arrowlink COLOR="#b0b0b0" DESTINATION="_Freeplane_Link_266716332" ENDARROW="Default" ENDINCLINATION="256;22;" ID="Freeplane_Arrow_Link_1273596772" STARTARROW="None" STARTINCLINATION="244;32;"/>
+<node TEXT="Để thay đổi đường đi của liên kết mũi tên, bấm chuột vào và di chuyển nó đi." ID="_Freeplane_Link_1015289745" CREATED="1124560950717" MODIFIED="1213142775765">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#b0b0b0" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_266716332" STARTINCLINATION="244;32;" ENDINCLINATION="256;22;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_178300422" MODIFIED="1213142775769" TEXT="Một ví dụ về liên kết đồ hoạ được cho bên dưới.">
+<node TEXT="Một ví dụ về liên kết đồ hoạ được cho bên dưới." ID="Freeplane_Link_178300422" CREATED="1124560950717" MODIFIED="1213142775769">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_8762214" MODIFIED="1213142775774" TEXT="Ví dụ">
+<node TEXT="Ví dụ" FOLDED="true" ID="Freeplane_Link_8762214" CREATED="1124560950717" MODIFIED="1213142775774" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" ID="_Freeplane_Link_1170112929" MODIFIED="1213116827285" TEXT="Liên kết tới một phần khác">
-<arrowlink COLOR="#9999ff" DESTINATION="_Freeplane_Link_1492563156" ENDARROW="Default" ENDINCLINATION="91;0;" ID="Freeplane_Arrow_Link_33407992" STARTARROW="Default" STARTINCLINATION="30;0;"/>
+<node TEXT="Liên kết tới một phần khác" ID="_Freeplane_Link_1170112929" CREATED="1124560950717" MODIFIED="1213116827285" COLOR="#996600">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#9999ff" WIDTH="2" TRANSPARENCY="255" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1492563156" STARTINCLINATION="30;0;" ENDINCLINATION="91;0;" STARTARROW="DEFAULT" ENDARROW="DEFAULT"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_974447884" MODIFIED="1213116849324" TEXT="Nút có các nút con được thu gọn">
-<node CREATED="1124560950717" ID="_Freeplane_Link_1492563156" MODIFIED="1213116855618" TEXT="Nút con"/>
+<node TEXT="Nút có các nút con được thu gọn" FOLDED="true" ID="Freeplane_Link_974447884" CREATED="1124560950717" MODIFIED="1213116849324" COLOR="#996600">
+<node TEXT="Nút con" ID="_Freeplane_Link_1492563156" CREATED="1124560950717" MODIFIED="1213116855618"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" ID="_Freeplane_Link_1370577235" MODIFIED="1213116839655" TEXT="Một liên kết nữa">
-<arrowlink DESTINATION="_Freeplane_Link_1170112929" ENDARROW="Default" ENDINCLINATION="61;0;" ID="Freeplane_Arrow_Link_1872050149" STARTARROW="None" STARTINCLINATION="61;0;"/>
+<node TEXT="Một liên kết nữa" ID="_Freeplane_Link_1370577235" CREATED="1124560950717" MODIFIED="1213116839655" COLOR="#996600">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="_Freeplane_Link_1170112929" STARTINCLINATION="61;0;" ENDINCLINATION="61;0;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
</node>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_423038022" MODIFIED="1212778439962" POSITION="right" TEXT="Tìm kiếm">
+<node TEXT="Tìm kiếm" FOLDED="true" POSITION="right" ID="Freeplane_Link_423038022" CREATED="1124560950717" MODIFIED="1212778439962" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_84535966" MODIFIED="1213141954974" TEXT="Để tìm văn bản trên một nút và các nút cấp thấp hơn ứng với nó, nhấn Ctrl + F hoặc chọn Nút > Tìm trong trình đơn ngữ cảnh của nút.">
+<node TEXT="Để tìm văn bản trên một nút và các nút cấp thấp hơn ứng với nó, nhấn Ctrl + F hoặc chọn Nút > Tìm trong trình đơn ngữ cảnh của nút." ID="Freeplane_Link_84535966" CREATED="1124560950717" MODIFIED="1213141954974">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1130258952" MODIFIED="1213142001656" TEXT="Để tìm chuỗi kế tiếp khớp với mẫu cần tìm, nhấn Ctrl + G hoặc chọn Nút > Tìm tiếp trong trình đơn ngữ cảnh..">
+<node TEXT="Để tìm chuỗi kế tiếp khớp với mẫu cần tìm, nhấn Ctrl + G hoặc chọn Nút > Tìm tiếp trong trình đơn ngữ cảnh.." ID="Freeplane_Link_1130258952" CREATED="1124560950717" MODIFIED="1213142001656">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1114059074" MODIFIED="1213142043703" TEXT="Để tìm một chuỗi trong toàn bộ sơ đồ, chuyển về nút gốc bằng cách nhấn Escape rồi thực hiện tìm kiếm."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_794462371" MODIFIED="1213142155849" TEXT="Quá trình tìm kiếm diễn ra theo chiều rộng, tức là tìm từ cấp cao xuống các cấp thấp hơn, để phù hợp với nguyên tắc của sơ đồ tư duy: cấp thấp tương ứng với các khái ni& [...]
-<node CREATED="1124560950717" ID="Freeplane_Link_878322173" MODIFIED="1213142204880" TEXT="Lưu ý rằng quá trình tìm kiếm chỉ bắt đầu từ nút được chọn và bao gồm các nút cấp thấp hơn."/>
+<node TEXT="Để tìm một chuỗi trong toàn bộ sơ đồ, chuyển về nút gốc bằng cách nhấn Escape rồi thực hiện tìm kiếm." ID="Freeplane_Link_1114059074" CREATED="1124560950717" MODIFIED="1213142043703"/>
+<node TEXT="Quá trình tìm kiếm diễn ra theo chiều rộng, tức là tìm từ cấp cao xuống các cấp thấp hơn, để phù hợp với nguyên tắc của sơ đồ tư duy: cấp thấp tương ứng với các khái niệm, vấn đề chi tiết hơn cấp cao." [...]
+<node TEXT="Lưu ý rằng quá trình tìm kiếm chỉ bắt đầu từ nút được chọn và bao gồm các nút cấp thấp hơn." ID="Freeplane_Link_878322173" CREATED="1124560950717" MODIFIED="1213142204880"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_653540280" MODIFIED="1212778434777" POSITION="right" TEXT="Chọn nhiều nút">
+<node TEXT="Chọn nhiều nút" FOLDED="true" POSITION="right" ID="Freeplane_Link_653540280" CREATED="1124560950717" MODIFIED="1212778434777" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1882743579" MODIFIED="1213142239676" TEXT="Để chọn nhiều nút, bấm chuột trái lên chúng trong lúc giữ CTRL hoặc SHIFT.">
+<node TEXT="Để chọn nhiều nút, bấm chuột trái lên chúng trong lúc giữ CTRL hoặc SHIFT." ID="Freeplane_Link_1882743579" CREATED="1124560950717" MODIFIED="1213142239676">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1587507778" MODIFIED="1213142284583" TEXT="Để chọn thêm một nút khi đã chọn các nút khác rồi, giữ CTRL khi bấm chuột lên nút mới.">
+<node TEXT="Để chọn thêm một nút khi đã chọn các nút khác rồi, giữ CTRL khi bấm chuột lên nút mới." ID="Freeplane_Link_1587507778" CREATED="1124560950717" MODIFIED="1213142284583">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_397848217" MODIFIED="1213142354321" TEXT="Để chọn nhiều nút liên tiếp nhau, giữ SHIFT khi bấm chuột, hoặc giữ SHIFT và nhấn các phím mũi tên để di chuyển qua các nút cần chọn.">
+<node TEXT="Để chọn nhiều nút liên tiếp nhau, giữ SHIFT khi bấm chuột, hoặc giữ SHIFT và nhấn các phím mũi tên để di chuyển qua các nút cần chọn." ID="Freeplane_Link_397848217" CREATED="1124560950717" MODIFIED="1213142354321">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_45178554" MODIFIED="1213142456318" TEXT="Để chọn toàn bộ một nút và các nút cấp thấp hơn nút đó, giữ ALT và chuột trái vào nút cần chọn, hoặc giữ SHIFT rồi dùng các mũi tên để di chuyển tới nút cha của nút hiǬ [...]
-<node CREATED="1124560950717" ID="Freeplane_Link_1368745556" MODIFIED="1213142486704" TEXT="Để bỏ chọn, bấm chuột trái lên nền hoặc chọn một nút khác."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_253575646" MODIFIED="1213142658924" TEXT="Để chọn tất cả các nút nhìn thấy, chọn Chỉnh sửa > Chọn mọi thứ đang được hiện."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1045127422" MODIFIED="1213142682545" TEXT="Để chọn tất cả các nút đang nhìn thấy trên 1 nhánh, chọn Chỉnh sửa > Chọn nhánh đang được hiện."/>
+<node TEXT="Để chọn toàn bộ một nút và các nút cấp thấp hơn nút đó, giữ ALT và chuột trái vào nút cần chọn, hoặc giữ SHIFT rồi dùng các mũi tên để di chuyển tới nút cha của nút hiện thời." ID="Freeplane_Link_45178554" CREATED="1124560950717" MODIFIE [...]
+<node TEXT="Để bỏ chọn, bấm chuột trái lên nền hoặc chọn một nút khác." ID="Freeplane_Link_1368745556" CREATED="1124560950717" MODIFIED="1213142486704"/>
+<node TEXT="Để chọn tất cả các nút nhìn thấy, chọn Chỉnh sửa > Chọn mọi thứ đang được hiện." ID="Freeplane_Link_253575646" CREATED="1124560950717" MODIFIED="1213142658924"/>
+<node TEXT="Để chọn tất cả các nút đang nhìn thấy trên 1 nhánh, chọn Chỉnh sửa > Chọn nhánh đang được hiện." ID="Freeplane_Link_1045127422" CREATED="1124560950717" MODIFIED="1213142682545"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1024903226" MODIFIED="1212778428135" POSITION="right" TEXT="Kéo và thả">
-<edge WIDTH="thin"/>
+<node TEXT="Kéo và thả" FOLDED="true" POSITION="right" ID="Freeplane_Link_1024903226" CREATED="1124560950717" MODIFIED="1212778428135" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1929297435" MODIFIED="1213142829417" TEXT="Di chuyển nút bằng cách kéo và thả nó ra vị trí mới.">
+<edge WIDTH="thin"/>
+<node TEXT="Di chuyển nút bằng cách kéo và thả nó ra vị trí mới." ID="Freeplane_Link_1929297435" CREATED="1124560950717" MODIFIED="1213142829417">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_642775932" MODIFIED="1213142985511" TEXT="Để đưa 1 nút thành nút con của 1 nút khác, đặt con trỏ ở rìa ngoài của nút đích khi thả chuột.">
+<node TEXT="Để đưa 1 nút thành nút con của 1 nút khác, đặt con trỏ ở rìa ngoài của nút đích khi thả chuột." ID="Freeplane_Link_642775932" CREATED="1124560950717" MODIFIED="1213142985511">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_64428371" MODIFIED="1213142990694" TEXT="Để đưa 1 nút thành nút anh của 1 nút khác, ta thả chuột ở rìa trên của nút đích.">
+<node TEXT="Để đưa 1 nút thành nút anh của 1 nút khác, ta thả chuột ở rìa trên của nút đích." ID="Freeplane_Link_64428371" CREATED="1124560950717" MODIFIED="1213142990694">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="_Freeplane_Link_1994214827" MODIFIED="1213143025301" TEXT="Để sao chép nút thay vì di chuyển, giữ thêm CTRL lúc kéo chuột, hoặc kéo chuột giữa thay vì chuột trái.">
+<node TEXT="Để sao chép nút thay vì di chuyển, giữ thêm CTRL lúc kéo chuột, hoặc kéo chuột giữa thay vì chuột trái." ID="_Freeplane_Link_1994214827" CREATED="1124560950717" MODIFIED="1213143025301">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_1473452780" MODIFIED="1213143083293" TEXT="Để sửa lại một sơ đồ đã có, kéo tập tin tương ứng và thả vào trên nền cửa sổ Freeplane; thao tác này hoạt động tốt trên nền Microsoft Windows."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1807305640" MODIFIED="1213143106012" TEXT="Để tạo liên kết đồ hoạ, kéo và thả bằng chuột phải."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1852229635" MODIFIED="1213143134718" TEXT="Nếu đã chọn nhiều nút, tất cả chúng sẽ được di chuyển hoặc sao chép.">
+<node TEXT="Để sửa lại một sơ đồ đã có, kéo tập tin tương ứng và thả vào trên nền cửa sổ Freeplane; thao tác này hoạt động tốt trên nền Microsoft Windows." ID="Freeplane_Link_1473452780" CREATED="1124560950717" MODIFIED="1213143083293"/>
+<node TEXT="Để tạo liên kết đồ hoạ, kéo và thả bằng chuột phải." ID="Freeplane_Link_1807305640" CREATED="1124560950717" MODIFIED="1213143106012"/>
+<node TEXT="Nếu đã chọn nhiều nút, tất cả chúng sẽ được di chuyển hoặc sao chép." ID="Freeplane_Link_1852229635" CREATED="1124560950717" MODIFIED="1213143134718">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_367758036" MODIFIED="1213143194162" TEXT="Có thể kéo dữ liệu từ các ứng dụng bên ngoài như các tập tin trên Microsoft Windows, hoặc văn bản được chọn trên Mozilla Firefox."/>
+<node TEXT="Có thể kéo dữ liệu từ các ứng dụng bên ngoài như các tập tin trên Microsoft Windows, hoặc văn bản được chọn trên Mozilla Firefox." ID="Freeplane_Link_367758036" CREATED="1124560950717" MODIFIED="1213143194162"/>
</node>
-<node COLOR="#407000" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_958781924" MODIFIED="1212778423691" POSITION="right" TEXT="Chép và dán">
+<node TEXT="Chép và dán" FOLDED="true" POSITION="right" ID="Freeplane_Link_958781924" CREATED="1124560950717" MODIFIED="1212778423691" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1119887646" MODIFIED="1213143293638" TEXT="Có thể sao chép và dán nhiều nút giữa 2 sơ đồ trong Freeplane. Ngoài ra, còn có thể dán văn bản hoặc HTML từ các ứng dụng khác vào trong Freeplane.">
+<node TEXT="Có thể sao chép và dán nhiều nút giữa 2 sơ đồ trong Freeplane. Ngoài ra, còn có thể dán văn bản hoặc HTML từ các ứng dụng khác vào trong Freeplane." ID="Freeplane_Link_1119887646" CREATED="1124560950717" MODIFIED="1213143293638">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_601715130" MODIFIED="1213143371309" TEXT="Nếu dán văn bản thô, các văn bản có nhiều dòng sẽ được chuyển thành nhiều nút, mỗi nút ứng với một dòng, và cấp của các nút đó được đặt theo số ký tự tr [...]
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1360620372" MODIFIED="1124560950717" TEXT="Tree
 Oak
 Beech
 ">
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_235754153" MODIFIED="1213143389208" TEXT="Sẽ thành">
+<node TEXT="Nếu dán văn bản thô, các văn bản có nhiều dòng sẽ được chuyển thành nhiều nút, mỗi nút ứng với một dòng, và cấp của các nút đó được đặt theo số ký tự trống nằm ở đầu dòng. Xem ví dụ sau [...]
+<node TEXT="Tree
 Oak
 Beech
 " FOLDED="true" ID="Freeplane_Link_1360620372" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#996600">
+<node TEXT="Sẽ thành" FOLDED="true" ID="Freeplane_Link_235754153" CREATED="1124560950717" MODIFIED="1213143389208">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1241327831" MODIFIED="1124560950717" TEXT="Tree">
+<node TEXT="Tree" FOLDED="true" ID="Freeplane_Link_1241327831" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Oak">
+<node TEXT="Oak" ID="ID_937645697" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Beech">
+<node TEXT="Beech" ID="ID_1171031195" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_469573315" MODIFIED="1213143486411" TEXT="Khi ta dán HTML, nội dung HTML sẽ được chuyển về dạng văn bản thô. Ngoài ra, các liên kết có trong đó sẽ được chuyển thành nút con của một nút tên là "Links". Xem ví dụ sau."/>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1169179618" MODIFIED="1213143507547" TEXT="Ví dụ sau khi dán:">
+<node TEXT="Khi ta dán HTML, nội dung HTML sẽ được chuyển về dạng văn bản thô. Ngoài ra, các liên kết có trong đó sẽ được chuyển thành nút con của một nút tên là "Links". Xem ví dụ sau." ID="Freeplane_Link_469573315" CREATED="1124560950717" MODIFIED="1213143486411"/>
+<node TEXT="Ví dụ sau khi dán:" FOLDED="true" ID="Freeplane_Link_1169179618" CREATED="1124560950717" MODIFIED="1213143507547">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Shopping (120236)">
+<node TEXT="Shopping (120236)" ID="ID_1246579490" CREATED="1124560950717" MODIFIED="1124560950717">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Urban Living (19)">
+<node TEXT="Urban Living (19)" ID="ID_816657830" CREATED="1124560950717" MODIFIED="1124560950717">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1859471211" MODIFIED="1124560950717" TEXT="Links">
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" LINK="http://directory.google.com/Top/Shopping/" MODIFIED="1124560950717" TEXT="Shopping">
+<node TEXT="Links" FOLDED="true" ID="Freeplane_Link_1859471211" CREATED="1124560950717" MODIFIED="1124560950717">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+<node TEXT="Shopping" ID="ID_1006838482" CREATED="1124560950717" MODIFIED="1124560950717" LINK="http://directory.google.com/Top/Shopping/">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950717" LINK="http://directory.google.com/Top/Home/Urban_Living/" MODIFIED="1124560950717" TEXT="Urban Living">
+<node TEXT="Urban Living" ID="ID_389279640" CREATED="1124560950717" MODIFIED="1124560950717" LINK="http://directory.google.com/Top/Home/Urban_Living/">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
</node>
-<node CREATED="1124560950717" ID="Freeplane_Link_88012936" MODIFIED="1213143568897" TEXT="Nếu dán tập tin từ cửa sổ Explorer trên Microsoft Windows, một danh sách các liên kết tới tập tin sẽ được tạo ra."/>
-<node CREATED="1124560950717" ID="Freeplane_Link_1257690332" MODIFIED="1213143656088" TEXT="Nếu trong Freeplane bạn chép một nhánh và dán nó vào một trình soạn thảo văn bản, cấu trúc cây sẽ được biểu diễn bằng việc thụt lề các dòng, ứng với các nút. Các liên kết s&# [...]
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_903550993" MODIFIED="1124560950717" TEXT="Tree">
+<node TEXT="Nếu dán tập tin từ cửa sổ Explorer trên Microsoft Windows, một danh sách các liên kết tới tập tin sẽ được tạo ra." ID="Freeplane_Link_88012936" CREATED="1124560950717" MODIFIED="1213143568897"/>
+<node TEXT="Nếu trong Freeplane bạn chép một nhánh và dán nó vào một trình soạn thảo văn bản, cấu trúc cây sẽ được biểu diễn bằng việc thụt lề các dòng, ứng với các nút. Các liên kết sẽ được đặt trong dấu ngoặc nh [...]
+<node TEXT="Tree" FOLDED="true" ID="Freeplane_Link_903550993" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950717" MODIFIED="1124560950717" TEXT="Oak">
+<node TEXT="Oak" ID="ID_956154080" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_1997185283" MODIFIED="1124560950717" TEXT="Beech">
+<node TEXT="Beech" FOLDED="true" ID="Freeplane_Link_1997185283" CREATED="1124560950717" MODIFIED="1124560950717" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950717" FOLDED="true" ID="Freeplane_Link_511199508" MODIFIED="1213143669976" TEXT="khi dán vào trình soạn thảo sẽ thành">
+<node TEXT="khi dán vào trình soạn thảo sẽ thành" FOLDED="true" ID="Freeplane_Link_511199508" CREATED="1124560950717" MODIFIED="1213143669976">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950732" MODIFIED="1124560950732" TEXT="Tree
 Oak
 Beech
 Google <http://www.google.com/>
">
+<node TEXT="Tree
 Oak
 Beech
 Google <http://www.google.com/>
" ID="ID_1089911884" CREATED="1124560950732" MODIFIED="1124560950732" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
</node>
-<node COLOR="#996600" CREATED="1124560950732" LINK="http://www.google.com/" MODIFIED="1124560950732" TEXT="Google">
+<node TEXT="Google" ID="ID_1889438579" CREATED="1124560950732" MODIFIED="1124560950732" LINK="http://www.google.com/" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950732" ID="Freeplane_Link_1371120807" MODIFIED="1213143824267" TEXT="Khi chép một nhánh và dán vào một trình soạn thảo văn bản hỗ trợ văn bản phức hợp, các định dạng về màu sắc và phông chữ cũng sẽ được giữ nguyên. Các liên kết sǫ [...]
-<node CREATED="1124560950732" ID="Freeplane_Link_900654975" MODIFIED="1213143965049" TEXT="Để chỉ chép riêng 1 nút, bỏ qua các cấp con của nút đó, ta nhấn Ctrl+Shift+C hoặc chọn Chép riêng trong trình đơn ngữ cảnh của nút."/>
+<node TEXT="Khi chép một nhánh và dán vào một trình soạn thảo văn bản hỗ trợ văn bản phức hợp, các định dạng về màu sắc và phông chữ cũng sẽ được giữ nguyên. Các liên kết sẽ được đặt trong dấu ngoặc <&g [...]
+<node TEXT="Để chỉ chép riêng 1 nút, bỏ qua các cấp con của nút đó, ta nhấn Ctrl+Shift+C hoặc chọn Chép riêng trong trình đơn ngữ cảnh của nút." ID="Freeplane_Link_900654975" CREATED="1124560950732" MODIFIED="1213143965049"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="_Freeplane_Link_1540212684" MODIFIED="1212778419527" POSITION="right" TEXT="Di chuyển">
-<node CREATED="1124560950732" ID="Freeplane_Link_1664676263" MODIFIED="1213144031999" TEXT="Dùng các phím mũi tên để di chuyển con trỏ."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_202325925" MODIFIED="1213144090124" TEXT="Để về nút anh đầu tiên, nhấn phím PageUp."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_733460390" MODIFIED="1213144113022" TEXT="Để về nút anh cuối cùng, nhấn PageDown."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1566432871" MODIFIED="1213144137170" TEXT="Để về nút gốc, nhấn Escape."/>
-<node CREATED="1124560950732" ID="_Freeplane_Link_97763226" MODIFIED="1213144311905" TEXT="Để đưa nút ra vị trí bất kỳ, ta bấm giữ chuột lên chốt vô hình (nằm ở mép gần nút gốc hơn), rồi sau đó di chuyển chuột ra vị trí khác."/>
+<node TEXT="Di chuyển" FOLDED="true" POSITION="right" ID="_Freeplane_Link_1540212684" CREATED="1124560950732" MODIFIED="1212778419527" COLOR="#407000">
+<node TEXT="Dùng các phím mũi tên để di chuyển con trỏ." ID="Freeplane_Link_1664676263" CREATED="1124560950732" MODIFIED="1213144031999"/>
+<node TEXT="Để về nút anh đầu tiên, nhấn phím PageUp." ID="Freeplane_Link_202325925" CREATED="1124560950732" MODIFIED="1213144090124"/>
+<node TEXT="Để về nút anh cuối cùng, nhấn PageDown." ID="Freeplane_Link_733460390" CREATED="1124560950732" MODIFIED="1213144113022"/>
+<node TEXT="Để về nút gốc, nhấn Escape." ID="Freeplane_Link_1566432871" CREATED="1124560950732" MODIFIED="1213144137170"/>
+<node TEXT="Để đưa nút ra vị trí bất kỳ, ta bấm giữ chuột lên chốt vô hình (nằm ở mép gần nút gốc hơn), rồi sau đó di chuyển chuột ra vị trí khác." ID="_Freeplane_Link_97763226" CREATED="1124560950732" MODIFIED="1213144311905"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_4727471" MODIFIED="1213144332539" POSITION="right" TEXT="Thu gọn và mở rộng">
-<node CREATED="1124560950732" ID="Freeplane_Link_743738104" MODIFIED="1213144387654" TEXT="Để thu gọn một nút, nhấn phím cách, hoặc chọn Mở rộng/Thu gọn từ trình đơn ngữ cảnh."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_991022370" MODIFIED="1213144430836" TEXT="Để mở rộng một nút, nhấn phím cách, hoặc chọn Mở rộng/Thu gọn từ trình đơn ngữ cảnh, hoặc nhấn phím mũi tên để di chuyển theo hướng sẽ mở rộng."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_769693110" MODIFIED="1213144529528" TEXT="Để mở rộng hoặc thu gọn các nút theo cấp, giữ ALT khi xoay chuột, hoặc nhấn Alt + PageUp và Alt + PageDown. Xin lưu ý là đối với các sơ đồ lớn, thao tác này có thể dẫn đến tình trạng treo m [...]
-<node CREATED="1124560950732" ID="Freeplane_Link_1851044946" MODIFIED="1213144624887" TEXT="Để mở rộng tất cả các nút, nhấn dấu cộng màu xám ở trên thanh công cụ chính, hoặc chọn Di chuyển > Mở rộng tất."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1144518569" MODIFIED="1213144671055" TEXT="Để thu gọn tất cả các nút, nhấn dấu trừ màu xám ở trên thanh công cụ chính, hoặc chọn Di chuyển > Thu gọn tất."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1949931044" MODIFIED="1213144696139" TEXT="Các nút được thu gọn sẽ có dấu tròn nằm ở mép ngoài."/>
+<node TEXT="Thu gọn và mở rộng" FOLDED="true" POSITION="right" ID="Freeplane_Link_4727471" CREATED="1124560950732" MODIFIED="1213144332539" COLOR="#407000">
+<node TEXT="Để thu gọn một nút, nhấn phím cách, hoặc chọn Mở rộng/Thu gọn từ trình đơn ngữ cảnh." ID="Freeplane_Link_743738104" CREATED="1124560950732" MODIFIED="1213144387654"/>
+<node TEXT="Để mở rộng một nút, nhấn phím cách, hoặc chọn Mở rộng/Thu gọn từ trình đơn ngữ cảnh, hoặc nhấn phím mũi tên để di chuyển theo hướng sẽ mở rộng." ID="Freeplane_Link_991022370" CREATED="1124560950732" MODIFIED="1213144430836"/>
+<node TEXT="Để mở rộng hoặc thu gọn các nút theo cấp, giữ ALT khi xoay chuột, hoặc nhấn Alt + PageUp và Alt + PageDown. Xin lưu ý là đối với các sơ đồ lớn, thao tác này có thể dẫn đến tình trạng treo máy do thiếu bộ nhớ." ID="Freeplane_Link_769693110" CR [...]
+<node TEXT="Để mở rộng tất cả các nút, nhấn dấu cộng màu xám ở trên thanh công cụ chính, hoặc chọn Di chuyển > Mở rộng tất." ID="Freeplane_Link_1851044946" CREATED="1124560950732" MODIFIED="1213144624887"/>
+<node TEXT="Để thu gọn tất cả các nút, nhấn dấu trừ màu xám ở trên thanh công cụ chính, hoặc chọn Di chuyển > Thu gọn tất." ID="Freeplane_Link_1144518569" CREATED="1124560950732" MODIFIED="1213144671055"/>
+<node TEXT="Các nút được thu gọn sẽ có dấu tròn nằm ở mép ngoài." ID="Freeplane_Link_1949931044" CREATED="1124560950732" MODIFIED="1213144696139"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_516331171" MODIFIED="1213144715606" POSITION="right" TEXT="Chuyển sang sơ đồ khác">
+<node TEXT="Chuyển sang sơ đồ khác" FOLDED="true" POSITION="right" ID="Freeplane_Link_516331171" CREATED="1124560950732" MODIFIED="1213144715606" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_888544630" MODIFIED="1213144763417" TEXT="Để chuyển sang một sơ đồ khác đã mở, bấm chuột phải lên nền và chọn tên sơ đồ mình cần từ trình đơn ngữ cảnh hiện ra.">
+<node TEXT="Để chuyển sang một sơ đồ khác đã mở, bấm chuột phải lên nền và chọn tên sơ đồ mình cần từ trình đơn ngữ cảnh hiện ra." ID="Freeplane_Link_888544630" CREATED="1124560950732" MODIFIED="1213144763417">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_467411537" MODIFIED="1213144773265" POSITION="right" TEXT="Cuộn sơ đồ">
+<node TEXT="Cuộn sơ đồ" FOLDED="true" POSITION="right" ID="Freeplane_Link_467411537" CREATED="1124560950732" MODIFIED="1213144773265" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1417375329" MODIFIED="1213144844934" TEXT="Để cuộn sơ đồ, hãy bấm chuột lên nền và di chuột, hoặc xoay chuột. Để cuộn ngang, giữ SHIFT hoặc một nút trái chuột, rồi xoay bánh lăn.">
+<node TEXT="Để cuộn sơ đồ, hãy bấm chuột lên nền và di chuột, hoặc xoay chuột. Để cuộn ngang, giữ SHIFT hoặc một nút trái chuột, rồi xoay bánh lăn." ID="Freeplane_Link_1417375329" CREATED="1124560950732" MODIFIED="1213144844934">
<edge WIDTH="thin"/>
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913137192" MODIFIED="1213144874260" POSITION="right" TEXT="Thu phóng">
-<node CREATED="1124560950732" ID="Freeplane_Link_937668100" MODIFIED="1213144923043" TEXT="Để phóng to hoặc thu nhỏ, hãy xoay chuột khi giữ CTRL, hoặc nhấn Alt + mũi tên lên/xuống. Hoặc, ta có thể đặt lại giá trị thu phóng ở trên thanh công cụ."/>
+<node TEXT="Thu phóng" FOLDED="true" POSITION="right" ID="Freeplane_Link_913137192" CREATED="1124560950732" MODIFIED="1213144874260" COLOR="#407000">
+<node TEXT="Để phóng to hoặc thu nhỏ, hãy xoay chuột khi giữ CTRL, hoặc nhấn Alt + mũi tên lên/xuống. Hoặc, ta có thể đặt lại giá trị thu phóng ở trên thanh công cụ." ID="Freeplane_Link_937668100" CREATED="1124560950732" MODIFIED="1213144923043"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1318678369" MODIFIED="1213144941248" POSITION="right" TEXT="Huỷ bước và làm lại">
-<node CREATED="1124560950732" ID="Freeplane_Link_1059130241" MODIFIED="1213144971907" TEXT="Để huỷ các thao tác làm nhầm, sai, hãy nhấn CTRL + Z, hoặc chọn Chỉnh sửa > Huỷ bước."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_844042911" MODIFIED="1213145001824" TEXT="Để làm lại một thao tác vừa huỷ, nhấn CTRL + Y, hoặc chọn Chỉnh sửa > Làm lại."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_988819426" MODIFIED="1213145037790" TEXT="Mở Công cụ > Tuỳ thích... để đặt số bước lưu trong bộ nhớ, cho phép huỷ hoặc làm lại."/>
+<node TEXT="Huỷ bước và làm lại" FOLDED="true" POSITION="right" ID="Freeplane_Link_1318678369" CREATED="1124560950732" MODIFIED="1213144941248" COLOR="#407000">
+<node TEXT="Để huỷ các thao tác làm nhầm, sai, hãy nhấn CTRL + Z, hoặc chọn Chỉnh sửa > Huỷ bước." ID="Freeplane_Link_1059130241" CREATED="1124560950732" MODIFIED="1213144971907"/>
+<node TEXT="Để làm lại một thao tác vừa huỷ, nhấn CTRL + Y, hoặc chọn Chỉnh sửa > Làm lại." ID="Freeplane_Link_844042911" CREATED="1124560950732" MODIFIED="1213145001824"/>
+<node TEXT="Mở Công cụ > Tuỳ thích... để đặt số bước lưu trong bộ nhớ, cho phép huỷ hoặc làm lại." ID="Freeplane_Link_988819426" CREATED="1124560950732" MODIFIED="1213145037790"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_22510332" MODIFIED="1212779034059" POSITION="right" TEXT="Xuất ra HTML">
+<node TEXT="Xuất ra HTML" FOLDED="true" POSITION="right" ID="Freeplane_Link_22510332" CREATED="1124560950732" MODIFIED="1212779034059" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1318019585" MODIFIED="1212779122174" TEXT="Để xuất một nhánh ra HTML, nhấn Control + H. Trang HTML được xuất ra có thể hỗ trợ thu gọn tuỳ theo thiết lập trong phần tuỳ thích."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_330882549" MODIFIED="1212779172290" TEXT="Để xuất ra định dạng khác, chọn Xuất > Dạng XHTML (có Javascript)."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_113578015" MODIFIED="1213145075384" TEXT="Để xuất sơ đồ ra một ảnh tổng hợp dạng HTML, chọn Xuất > Dạng XHTML (sơ đồ ảnh có thể tương tác)."/>
+<node TEXT="Để xuất một nhánh ra HTML, nhấn Control + H. Trang HTML được xuất ra có thể hỗ trợ thu gọn tuỳ theo thiết lập trong phần tuỳ thích." ID="Freeplane_Link_1318019585" CREATED="1124560950732" MODIFIED="1212779122174"/>
+<node TEXT="Để xuất ra định dạng khác, chọn Xuất > Dạng XHTML (có Javascript)." ID="Freeplane_Link_330882549" CREATED="1124560950732" MODIFIED="1212779172290"/>
+<node TEXT="Để xuất sơ đồ ra một ảnh tổng hợp dạng HTML, chọn Xuất > Dạng XHTML (sơ đồ ảnh có thể tương tác)." ID="Freeplane_Link_113578015" CREATED="1124560950732" MODIFIED="1213145075384"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1908686168" MODIFIED="1213145110531" POSITION="right" TEXT="Xuất thành ảnh bitmap hoặc vector">
-<node CREATED="1124560950732" ID="Freeplane_Link_1262228561" MODIFIED="1213145144072" TEXT="Để xuất ra dạng ảnh PNG, chọn Tập tin > Xuất > Dạng PNG..."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_168834767" MODIFIED="1213145167124" TEXT="Để xuất ra dạng ảnh JPEG, chọn Tập tin > Xuất > Dạng JPEG..."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1754131207" MODIFIED="1213145208051" TEXT="Để xuất ra dạng ảnh SVG, chọn Tập tin > Xuất > Dạng SVG... Lưu ý là phải cài trình bổ sung SVG thì chức năng này mới hoạt động."/>
+<node TEXT="Xuất thành ảnh bitmap hoặc vector" FOLDED="true" POSITION="right" ID="Freeplane_Link_1908686168" CREATED="1124560950732" MODIFIED="1213145110531" COLOR="#407000">
+<node TEXT="Để xuất ra dạng ảnh PNG, chọn Tập tin > Xuất > Dạng PNG..." ID="Freeplane_Link_1262228561" CREATED="1124560950732" MODIFIED="1213145144072"/>
+<node TEXT="Để xuất ra dạng ảnh JPEG, chọn Tập tin > Xuất > Dạng JPEG..." ID="Freeplane_Link_168834767" CREATED="1124560950732" MODIFIED="1213145167124"/>
+<node TEXT="Để xuất ra dạng ảnh SVG, chọn Tập tin > Xuất > Dạng SVG... Lưu ý là phải cài trình bổ sung SVG thì chức năng này mới hoạt động." ID="Freeplane_Link_1754131207" CREATED="1124560950732" MODIFIED="1213145208051"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_329770204" MODIFIED="1213145242092" POSITION="right" TEXT="Xuất ra các định dạng XML khác">
-<node CREATED="1124560950732" ID="Freeplane_Link_109825007" MODIFIED="1213145325307" TEXT="Để xuất sơ đồ thành một định dạng XML khác, bạn phải có một bộ lọc XSLT, rồi chọn Tập tin > Xuất > Dùng XSLT."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1007437950" MODIFIED="1213145380613" TEXT="Để xuất sơ đồ thành tài liệu OpenOffice Writer, ta chọn Tập tin > Xuất > Dạng tài liệu của OpenOffice Writer."/>
+<node TEXT="Xuất ra các định dạng XML khác" FOLDED="true" POSITION="right" ID="Freeplane_Link_329770204" CREATED="1124560950732" MODIFIED="1213145242092" COLOR="#407000">
+<node TEXT="Để xuất sơ đồ thành một định dạng XML khác, bạn phải có một bộ lọc XSLT, rồi chọn Tập tin > Xuất > Dùng XSLT." ID="Freeplane_Link_109825007" CREATED="1124560950732" MODIFIED="1213145325307"/>
+<node TEXT="Để xuất sơ đồ thành tài liệu OpenOffice Writer, ta chọn Tập tin > Xuất > Dạng tài liệu của OpenOffice Writer." ID="Freeplane_Link_1007437950" CREATED="1124560950732" MODIFIED="1213145380613"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1841136119" MODIFIED="1213145416657" POSITION="right" TEXT="Nhập cấu trúc cây thư mục">
+<node TEXT="Nhập cấu trúc cây thư mục" FOLDED="true" POSITION="right" ID="Freeplane_Link_1841136119" CREATED="1124560950732" MODIFIED="1213145416657" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1609103531" MODIFIED="1213145506249" TEXT="Để nhập cấu trúc thư mục, trong trình đơn ngữ cảnh của nút, ta chọn Nhánh > Nhập cấu trúc thư mục. Chọn thư mục cần nhập. Mọi tập tin và thư mục con trong đó sẽ đưǮ [...]
-<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_122139198" MODIFIED="1213145516875" TEXT="Ví dụ">
+<node TEXT="Để nhập cấu trúc thư mục, trong trình đơn ngữ cảnh của nút, ta chọn Nhánh > Nhập cấu trúc thư mục. Chọn thư mục cần nhập. Mọi tập tin và thư mục con trong đó sẽ được đưa vào sơ đồ. Xem ví dụ b&# [...]
+<node TEXT="Ví dụ" FOLDED="true" ID="Freeplane_Link_122139198" CREATED="1124560950732" MODIFIED="1213145516875" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_802327256" MODIFIED="1213145527709" TEXT="Thư mục được chọn">
+<node TEXT="Thư mục được chọn" FOLDED="true" ID="Freeplane_Link_802327256" CREATED="1124560950732" MODIFIED="1213145527709" COLOR="#996600">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps" MODIFIED="1124560950732" TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps">
+<node TEXT="C:\Program Files\Microsoft Office\Office\Bitmaps" ID="ID_1318086197" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps">
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_945130228" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/" MODIFIED="1124560950732" TEXT="Dbwiz">
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/ASSETS.GIF" MODIFIED="1124560950732" TEXT="ASSETS.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF" MODIFIED="1124560950732" TEXT="CONTACTS.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF" MODIFIED="1124560950732" TEXT="EVTMGMT.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF" MODIFIED="1124560950732" TEXT="EXPENSES.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF" MODIFIED="1124560950732" TEXT="INVENTRY.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/LEDGER.GIF" MODIFIED="1124560950732" TEXT="LEDGER.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF" MODIFIED="1124560950732" TEXT="ORDPROC.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF" MODIFIED="1124560950732" TEXT="RESOURCE.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/SERVICE.GIF" MODIFIED="1124560950732" TEXT="SERVICE.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF" MODIFIED="1124560950732" TEXT="TIMEBILL.GIF"/>
+<node TEXT="Dbwiz" FOLDED="true" ID="Freeplane_Link_945130228" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/">
+<node TEXT="ASSETS.GIF" ID="ID_1800654448" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ASSETS.GIF"/>
+<node TEXT="CONTACTS.GIF" ID="ID_749224" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/CONTACTS.GIF"/>
+<node TEXT="EVTMGMT.GIF" ID="ID_1314862738" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EVTMGMT.GIF"/>
+<node TEXT="EXPENSES.GIF" ID="ID_740159247" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/EXPENSES.GIF"/>
+<node TEXT="INVENTRY.GIF" ID="ID_1223898236" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/INVENTRY.GIF"/>
+<node TEXT="LEDGER.GIF" ID="ID_1282766900" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/LEDGER.GIF"/>
+<node TEXT="ORDPROC.GIF" ID="ID_1148548102" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/ORDPROC.GIF"/>
+<node TEXT="RESOURCE.GIF" ID="ID_1893484032" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/RESOURCE.GIF"/>
+<node TEXT="SERVICE.GIF" ID="ID_1465555764" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/SERVICE.GIF"/>
+<node TEXT="TIMEBILL.GIF" ID="ID_352122704" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Dbwiz/TIMEBILL.GIF"/>
</node>
-<node CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1154399846" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/" MODIFIED="1124560950732" TEXT="Styles">
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLENDS.GIF" MODIFIED="1124560950732" TEXT="ACBLENDS.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLUPRT.GIF" MODIFIED="1124560950732" TEXT="ACBLUPRT.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACEXPDTN.GIF" MODIFIED="1124560950732" TEXT="ACEXPDTN.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACINDSTR.GIF" MODIFIED="1124560950732" TEXT="ACINDSTR.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACRICEPR.GIF" MODIFIED="1124560950732" TEXT="ACRICEPR.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSNDSTN.GIF" MODIFIED="1124560950732" TEXT="ACSNDSTN.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSUMIPT.GIF" MODIFIED="1124560950732" TEXT="ACSUMIPT.GIF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/GLOBE.WMF" MODIFIED="1124560950732" TEXT="GLOBE.WMF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/STONE.BMP" MODIFIED="1124560950732" TEXT="STONE.BMP"/>
+<node TEXT="Styles" FOLDED="true" ID="Freeplane_Link_1154399846" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/">
+<node TEXT="ACBLENDS.GIF" ID="ID_1645895504" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
+<node TEXT="ACBLUPRT.GIF" ID="ID_1718482166" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
+<node TEXT="ACEXPDTN.GIF" ID="ID_277737108" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
+<node TEXT="ACINDSTR.GIF" ID="ID_1460831119" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
+<node TEXT="ACRICEPR.GIF" ID="ID_1782822826" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
+<node TEXT="ACSNDSTN.GIF" ID="ID_74694564" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
+<node TEXT="ACSUMIPT.GIF" ID="ID_1087161580" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
+<node TEXT="GLOBE.WMF" ID="ID_110054563" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_1178963368" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
</node>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_269203785" MODIFIED="1213324088093" POSITION="right" TEXT="Nhập các liên kết ưa thích trong Internet Explorer">
-<edge WIDTH="thin"/>
+<node TEXT="Nhập các liên kết ưa thích trong Internet Explorer" FOLDED="true" POSITION="right" ID="Freeplane_Link_269203785" CREATED="1124560950732" MODIFIED="1213324088093" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_960597950" MODIFIED="1213324188687" TEXT="Để nhập các liên kết hay dùng từ thư mục Favorites của Internet Explorer vào Freeplane, chọn Tập tin > Nhập > Explorer Favorites. Chương trình sẽ yêu cầu bạn nhập vào thư mục chứa các liên kết hay dùng. [...]
-<node COLOR="#999999" CREATED="1124560950732" MODIFIED="1124560950732" TEXT="Key words: Microsoft Internet Explorer, MSIE, MS IE.">
+<edge WIDTH="thin"/>
+<node TEXT="Để nhập các liên kết hay dùng từ thư mục Favorites của Internet Explorer vào Freeplane, chọn Tập tin > Nhập > Explorer Favorites. Chương trình sẽ yêu cầu bạn nhập vào thư mục chứa các liên kết hay dùng. Thông thường, thư mục này tên là [...]
+<node TEXT="Key words: Microsoft Internet Explorer, MSIE, MS IE." ID="ID_873367012" CREATED="1124560950732" MODIFIED="1124560950732" COLOR="#999999">
<font NAME="Dialog" SIZE="10"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1709974530" MODIFIED="1213323992859" POSITION="right" TEXT="Nhập các sơ đồ tạo bởi MindManager X5">
-<node CREATED="1124560950732" ID="Freeplane_Link_1792019047" MODIFIED="1213324055812" TEXT="Để nhập các sơ đồ được tạo bởi chương trình MindManager X5, hãy chọn Tập tin > Nhập > Sơ đồ MindManager X5."/>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_913645795" MODIFIED="1213324219031" POSITION="right" TEXT="Liên kết với Word hoặc Outlook">
+<node TEXT="Nhập các sơ đồ tạo bởi MindManager X5" FOLDED="true" POSITION="right" ID="Freeplane_Link_1709974530" CREATED="1124560950732" MODIFIED="1213323992859" COLOR="#407000">
+<node TEXT="Để nhập các sơ đồ được tạo bởi chương trình MindManager X5, hãy chọn Tập tin > Nhập > Sơ đồ MindManager X5." ID="Freeplane_Link_1792019047" CREATED="1124560950732" MODIFIED="1213324055812"/>
+</node>
+<node TEXT="Liên kết với Word hoặc Outlook" FOLDED="true" POSITION="right" ID="Freeplane_Link_913645795" CREATED="1124560950732" MODIFIED="1213324219031" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_387394810" MODIFIED="1213324313156" TEXT="Ta có thể dán sơ đồ hoặc nhánh mình cần vào Microsoft Word, Wordpad hay Outlook. Nói chung, mọi ứng dụng xử lý được văn bản phức hợp đều hỗ trợ việc dán dữ liệu từ Freeplane. Định [...]
+<node TEXT="Ta có thể dán sơ đồ hoặc nhánh mình cần vào Microsoft Word, Wordpad hay Outlook. Nói chung, mọi ứng dụng xử lý được văn bản phức hợp đều hỗ trợ việc dán dữ liệu từ Freeplane. Định dạng văn bản cũng như liên kết s&# [...]
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950732" ID="Freeplane_Link_1374270907" LINK="mailto:don.bonton at supermail.com" MODIFIED="1213324547937" TEXT="Bấm chuột lên một liên kết thư điện tử (như mailto:don.bonton at supermail.com), Freeplane sẽ mở chương trình soạn thư mặc định trên máy bạn (trên Windows có thể là Outlook) để s [...]
+<node TEXT="Bấm chuột lên một liên kết thư điện tử (như mailto:don.bonton at supermail.com), Freeplane sẽ mở chương trình soạn thư mặc định trên máy bạn (trên Windows có thể là Outlook) để soạn thư tới địa chỉ đó." ID="Freeplane_Link_1374270907" CREATED="112 [...]
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950732" ID="Freeplane_Link_1769132615" LINK="mailto:don.bonton at supermail.com?subject=Last phone call" MODIFIED="1213324576125" TEXT="Ta có thể viết tiêu đề cho thư nếu muốn"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_608770378" MODIFIED="1213324621296" TEXT="Một cách khác để dán sơ đồ vào Microsoft Word là xuất sơ đồ ra HTML dựa vào tiêu đề, sau đó dán nội dung HTML vào Word."/>
+<node TEXT="Ta có thể viết tiêu đề cho thư nếu muốn" ID="Freeplane_Link_1769132615" CREATED="1124560950732" MODIFIED="1213324576125" LINK="mailto:don.bonton at supermail.com?subject=Last%20phone%20call"/>
+<node TEXT="Một cách khác để dán sơ đồ vào Microsoft Word là xuất sơ đồ ra HTML dựa vào tiêu đề, sau đó dán nội dung HTML vào Word." ID="Freeplane_Link_608770378" CREATED="1124560950732" MODIFIED="1213324621296"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1822195277" MODIFIED="1213145687123" POSITION="right" TEXT="Thiết lập các tuỳ chỉnh">
+<node TEXT="Thiết lập các tuỳ chỉnh" FOLDED="true" POSITION="right" ID="Freeplane_Link_1822195277" CREATED="1124560950732" MODIFIED="1213145687123" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1709388931" MODIFIED="1213145817507" TEXT="Để sửa các tuỳ chỉnh, ta mở Công cụ > Tuỳ thích... Thông thường, các thiết lập sẽ có tác dụng ở lần chạy sau."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_516597155" MODIFIED="1213145826421" TEXT="Tuỳ thích bao gồm phím tắt bàn phím, phương thức xuất HTML, thời gian chờ trước khi tự động chọn nút bên dưới chuột, phương pháp làm trơn cạnh..."/>
+<node TEXT="Để sửa các tuỳ chỉnh, ta mở Công cụ > Tuỳ thích... Thông thường, các thiết lập sẽ có tác dụng ở lần chạy sau." ID="Freeplane_Link_1709388931" CREATED="1124560950732" MODIFIED="1213145817507"/>
+<node TEXT="Tuỳ thích bao gồm phím tắt bàn phím, phương thức xuất HTML, thời gian chờ trước khi tự động chọn nút bên dưới chuột, phương pháp làm trơn cạnh..." ID="Freeplane_Link_516597155" CREATED="1124560950732" MODIFIED="1213145826421"/>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1528828442" MODIFIED="1213145851893" POSITION="right" TEXT="In ấn">
+<node TEXT="In ấn" FOLDED="true" POSITION="right" ID="Freeplane_Link_1528828442" CREATED="1124560950732" MODIFIED="1213145851893" COLOR="#407000">
<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_562577939" MODIFIED="1213145923515" TEXT="Ta có thể in toàn bộ sơ đồ ra 1 trang giấy, hoặc in ra nhiều trang khác nhau. Để sửa thiết lập in, ta chọn Tập tin > Thiết lập trang..."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1781825973" MODIFIED="1213146012396" TEXT="Để tiết kiệm không gian, nên chọn in ngang (landscape) trong phần Thiết lập trang.">
+<node TEXT="Ta có thể in toàn bộ sơ đồ ra 1 trang giấy, hoặc in ra nhiều trang khác nhau. Để sửa thiết lập in, ta chọn Tập tin > Thiết lập trang..." ID="Freeplane_Link_562577939" CREATED="1124560950732" MODIFIED="1213145923515"/>
+<node TEXT="Để tiết kiệm không gian, nên chọn in ngang (landscape) trong phần Thiết lập trang." ID="Freeplane_Link_1781825973" CREATED="1124560950732" MODIFIED="1213146012396">
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950732" ID="Freeplane_Link_1966612586" MODIFIED="1213146160197" TEXT="Ta cũng có thể xuất sơ đồ ra HTML rồi mở bằng trình duyệt và in từ trình duyệt của mình, hoặc chép sơ đồ vào Writer và in ra. Ta có thể chọn xuất HTML có tiêu đề, chép và dán và [...]
+<node TEXT="Ta cũng có thể xuất sơ đồ ra HTML rồi mở bằng trình duyệt và in từ trình duyệt của mình, hoặc chép sơ đồ vào Writer và in ra. Ta có thể chọn xuất HTML có tiêu đề, chép và dán vào Writer rồi in từ đó. Bằng cách này, [...]
<font NAME="Dialog" SIZE="12"/>
</node>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_841140408" MODIFIED="1213146186256" POSITION="right" TEXT="Dùng văn bản phức hợp dạng HTML trong nút">
-<node CREATED="1124560950732" ID="Freeplane_Link_1923265571" MODIFIED="1213146241846" TEXT="Nút được mở đầu bằng thẻ <html> sẽ được lọc bằng ngôn ngữ HTML. Tính năng này chỉ thực sự hữu dụng với những người dùng biết HTML. Xem ví dụ."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_1221553642" MODIFIED="1213146447870" TEXT="<html>
 <head>
 
 </head>
 <body>
 <h3>
 Ví dụ về việc dùng HTML
 </h3>
 <p class="msonormal">
 Tạo danh sách:
 </p>
 <ul type="disc">
 <li class="msonormal">
Mục 1
 [...]
-<node CREATED="1124560950732" ID="Freeplane_Link_1411363315" MODIFIED="1213146533998" TEXT="Khi xuất sơ đồ ra văn bản phức hợp, các thuộc tính HTML sẽ bị bỏ qua. Tuy nhiên, việc dùng HTML trong nút được hỗ trợ rất tốt khi đưa sơ đồ lên mạng bằng cách nhúng tiểu d&# [...]
-<font NAME="Dialog" SIZE="12"/>
-</node>
+<node TEXT="Dùng văn bản phức hợp dạng HTML trong nút" FOLDED="true" POSITION="right" ID="Freeplane_Link_841140408" CREATED="1124560950732" MODIFIED="1213146186256" COLOR="#407000">
+<node TEXT="Nút được mở đầu bằng thẻ <html> sẽ được lọc bằng ngôn ngữ HTML. Tính năng này chỉ thực sự hữu dụng với những người dùng biết HTML. Xem ví dụ." ID="Freeplane_Link_1923265571" CREATED="1124560950732" MODIFIED="1213146241846"/>
+<node ID="Freeplane_Link_1221553642" CREATED="1124560950732" MODIFIED="1213146447870"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <h3>
+ Ví dụ về việc dùng HTML
+ </h3>
+ <p class="msonormal">
+ Tạo danh sách:
+ </p>
+ <ul type="disc">
+ <li class="msonormal">
+ Mục 1
+ </li>
+ <li class="msonormal">
+ Mục 2
+ </li>
+ </ul>
+ <p class="msonormal">
+ Ta còn có thể định dạng <b>chữ đậm</b> hoặc <i>chữ nghiêng</i>. Tiếp, <u>gạch chân</u>, <strike>gạch ngang</strike> nữa! Thậm chí, kẻ bảng:
+ </p>
+ <table cellpadding="0" class="msonormaltable" border="1" cellspacing="0" style="border-top-color: border-color; border-top-style: none; border-top-width: medium; border-right-color: border-color; border-right-style: none; border-right-width: medium; border-bottom-color: border-color; border-bottom-style: none; border-bottom-width: medium; border-left-color: border-color; border-left-style: none; border-left-width: medium">
+ <tr>
+ <td style="padding-left: .75pt; padding-right: .75pt; padding-bottom: .75pt; padding-top: .75pt">
+ <p class="msonormal">
+ Ô thứ nhất
+ </p>
+ </td>
+ <td style="border-left-color: border-color; border-left-style: none; border-left-width: medium; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
+ <p class="msonormal">
+ Ô thứ hai
+ </p>
+ </td>
+ </tr>
+ <tr>
+ <td style="border-top-color: border-color; border-top-style: none; border-top-width: medium; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
+ <p class="msonormal">
+ Ô thứ ba
+ </p>
+ </td>
+ <td style="border-top-color: border-color; border-top-style: none; border-top-width: medium; border-left-color: border-color; border-left-style: none; border-left-width: medium; padding-left: .75pt; padding-right: .75pt; padding-top: .75pt; padding-bottom: .75pt">
+ <p class="msonormal">
+ Ô thứ tư
+ </p>
+ </td>
+ </tr>
+ </table>
+ <p class="msonormal">
+ Về màu sắc chữ: đặt <font color="#999900">màu</font> <font color="#336600">cho chữ</font>.
+ </p>
+ </body>
+</html>
+
+</richcontent>
</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_384678455" MODIFIED="1213146556028" POSITION="right" TEXT="Thêm ảnh vào nút">
-<font NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" ID="Freeplane_Link_105057297" MODIFIED="1213146685402" TEXT="Để chèn ảnh vào trong Freeplane, nhấn ALT + SHIFT + K, hoặc chọn Chèn > Ảnh từ trình đơn ngữ cảnh. Khi chèn ảnh, mọi văn bản có trong nút sẽ bị xoá bỏ. Tuy nhiên, ta không thể chép ảnh và dá [...]
-<node CREATED="1124560950732" ID="Freeplane_Link_831132288" MODIFIED="1213146701653" TEXT="Các định dạng ảnh được hỗ trợ là PNG, JPEG và GIF."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_657212533" MODIFIED="1213146790423" TEXT="Để chuyên liên kết tới ảnh thành ảnh, ta nhấn ALT + SHIFT + K. Hoặc, kéo và thả một vài tấm ảnh vào trong Freeplane để tạo các liên kết tới chúng, sau đó chọn liên kết và chuyển thành &#x [...]
-<node COLOR="#000000" CREATED="1124560950732" ID="Freeplane_Link_812648089" MODIFIED="1213146838256" TEXT="Một cách khác là dùng thẻ <html> để định dạng nội dung nút dưới dạng HTML, rồi chèn ảnh bằng thẻ <img>.">
+<node TEXT="Khi xuất sơ đồ ra văn bản phức hợp, các thuộc tính HTML sẽ bị bỏ qua. Tuy nhiên, việc dùng HTML trong nút được hỗ trợ rất tốt khi đưa sơ đồ lên mạng bằng cách nhúng tiểu dụng Freeplane vào trình duyệt." ID="Freeplane_Link_1411363 [...]
<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950732" ID="Freeplane_Link_854977241" MODIFIED="1213146881574" TEXT="Ví dụ:
 <html><img src="linked/Apple.png">
 <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png">
">
-<font NAME="Dialog" SIZE="12"/>
</node>
-<node CREATED="1124560950732" ID="Freeplane_Link_1503495647" MODIFIED="1213146897671" TEXT="Có thể đặt liên kết tương đối tới ảnh.">
+<node TEXT="Thêm ảnh vào nút" FOLDED="true" POSITION="right" ID="Freeplane_Link_384678455" CREATED="1124560950732" MODIFIED="1213146556028" COLOR="#407000">
+<font NAME="Dialog" SIZE="12"/>
+<node TEXT="Để chèn ảnh vào trong Freeplane, nhấn ALT + SHIFT + K, hoặc chọn Chèn > Ảnh từ trình đơn ngữ cảnh. Khi chèn ảnh, mọi văn bản có trong nút sẽ bị xoá bỏ. Tuy nhiên, ta không thể chép ảnh và dán vào các ứng dụng khác, cũng như xu&# [...]
+<node TEXT="Các định dạng ảnh được hỗ trợ là PNG, JPEG và GIF." ID="Freeplane_Link_831132288" CREATED="1124560950732" MODIFIED="1213146701653"/>
+<node TEXT="Để chuyên liên kết tới ảnh thành ảnh, ta nhấn ALT + SHIFT + K. Hoặc, kéo và thả một vài tấm ảnh vào trong Freeplane để tạo các liên kết tới chúng, sau đó chọn liên kết và chuyển thành ảnh (ALT + SHIFT + K)." ID="Freeplane_Link_657212533" CREATED="112456095073 [...]
+<node TEXT="Một cách khác là dùng thẻ <html> để định dạng nội dung nút dưới dạng HTML, rồi chèn ảnh bằng thẻ <img>." ID="Freeplane_Link_812648089" CREATED="1124560950732" MODIFIED="1213146838256" COLOR="#000000">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node TEXT="Ví dụ:
 <html><img src="linked/Apple.png">
 <html><img src="file://C:/Users/My Documents/Mind Maps/Linked/Apple.png">
" ID="Freeplane_Link_854977241" CREATED="1124560950732" MODIFIED="1213146881574">
+<font NAME="Dialog" SIZE="12"/>
+</node>
+<node TEXT="Có thể đặt liên kết tương đối tới ảnh." ID="Freeplane_Link_1503495647" CREATED="1124560950732" MODIFIED="1213146897671">
<edge WIDTH="thin"/>
<font NAME="Dialog" SIZE="12"/>
</node>
-<node COLOR="#996600" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_842741213" MODIFIED="1213146941114" TEXT="Ví dụ về ảnh, chạy trên Windows">
-<font BOLD="true" NAME="Dialog" SIZE="12"/>
-<node CREATED="1124560950732" MODIFIED="1124560950732" TEXT="<html><img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLENDS.GIF">"/>
-<node CREATED="1124560950732" MODIFIED="1124560950732" TEXT="<html><img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLUPRT.GIF">"/>
-<node CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_138986292" MODIFIED="1124560950732" TEXT="<html><img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACEXPDTN.GIF">">
-<node CREATED="1124560950732" MODIFIED="1124560950732" TEXT="<html><img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACINDSTR.GIF">"/>
-</node>
-<node CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_675267710" MODIFIED="1124560950732" TEXT="<html><img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACRICEPR.GIF">">
-<node CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_801785253" MODIFIED="1124560950732" TEXT="<html><img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSNDSTN.GIF">">
-<node CREATED="1124560950732" MODIFIED="1124560950732" TEXT="<html><img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSUMIPT.GIF">"/>
-</node>
-</node>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/GLOBE.WMF" MODIFIED="1124560950732" TEXT="GLOBE.WMF"/>
-<node CREATED="1124560950732" LINK="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/STONE.BMP" MODIFIED="1124560950732" TEXT="STONE.BMP"/>
-</node>
-</node>
-<node COLOR="#407000" CREATED="1124560950732" FOLDED="true" ID="Freeplane_Link_1382863138" MODIFIED="1213324652078" POSITION="right" TEXT="Dùng chức năng khóa tập tin (thử nghiệm)">
-<node CREATED="1124560950732" ID="Freeplane_Link_417147004" MODIFIED="1213324731875" TEXT="Phiên bản hiện thời của Freeplane có chức năng khóa tập tin, nhưng nó đang trong giai đoạn thử nghiệm, nên theo mặc định, tính năng này bị tắt đi. Mặc dù chưa hoàn hảo, nhưng tính năng n [...]
-<node CREATED="1124560950732" ID="Freeplane_Link_1172860856" MODIFIED="1213324789812" TEXT="Việc khóa tập tin giúp đảm bảo rằng nhiều người dùng không thể đồng thời sửa đổi cùng 1 sơ đồ, ngăn không cho người này sửa đổi thông tin người kia vừa tạo ra."/>
-<node CREATED="1124560950732" ID="Freeplane_Link_772992782" MODIFIED="1213324807812" TEXT="Để mở chức năng này, bạn chọn Công cụ > Tùy thích."/>
+<node TEXT="Ví dụ về ảnh, chạy trên Windows" FOLDED="true" ID="Freeplane_Link_842741213" CREATED="1124560950732" MODIFIED="1213146941114" COLOR="#996600">
+<font NAME="Dialog" SIZE="12" BOLD="true"/>
+<node ID="ID_1786377537" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLENDS.GIF"/>
+ </body>
+</html>
+
+</richcontent>
+</node>
+<node ID="ID_1799007278" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACBLUPRT.GIF"/>
+ </body>
+</html>
+
+</richcontent>
+</node>
+<node FOLDED="true" ID="Freeplane_Link_138986292" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACEXPDTN.GIF"/>
+ </body>
+</html>
+
+</richcontent>
+<node ID="ID_193397432" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACINDSTR.GIF"/>
+ </body>
+</html>
+
+</richcontent>
+</node>
+</node>
+<node FOLDED="true" ID="Freeplane_Link_675267710" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACRICEPR.GIF"/>
+ </body>
+</html>
+
+</richcontent>
+<node FOLDED="true" ID="Freeplane_Link_801785253" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSNDSTN.GIF"/>
+ </body>
+</html>
+
+</richcontent>
+<node ID="ID_25926588" CREATED="1124560950732" MODIFIED="1124560950732"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <img src="file:/C:/Program Files/Microsoft Office/Office/Bitmaps/Styles/ACSUMIPT.GIF"/>
+ </body>
+</html>
+
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="GLOBE.WMF" ID="ID_643538423" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/GLOBE.WMF"/>
+<node TEXT="STONE.BMP" ID="ID_1751915396" CREATED="1124560950732" MODIFIED="1124560950732" LINK="file:/C:/Program%20Files/Microsoft%20Office/Office/Bitmaps/Styles/STONE.BMP"/>
+</node>
+</node>
+<node TEXT="Dùng chức năng khóa tập tin (thử nghiệm)" FOLDED="true" POSITION="right" ID="Freeplane_Link_1382863138" CREATED="1124560950732" MODIFIED="1213324652078" COLOR="#407000">
+<node TEXT="Phiên bản hiện thời của Freeplane có chức năng khóa tập tin, nhưng nó đang trong giai đoạn thử nghiệm, nên theo mặc định, tính năng này bị tắt đi. Mặc dù chưa hoàn hảo, nhưng tính năng này đã hỗ trợ hầu hết các nhu c [...]
+<node TEXT="Việc khóa tập tin giúp đảm bảo rằng nhiều người dùng không thể đồng thời sửa đổi cùng 1 sơ đồ, ngăn không cho người này sửa đổi thông tin người kia vừa tạo ra." ID="Freeplane_Link_1172860856" CREATED="1124560950732" MODIFIED="1213324789812"/>
+<node TEXT="Để mở chức năng này, bạn chọn Công cụ > Tùy thích." ID="Freeplane_Link_772992782" CREATED="1124560950732" MODIFIED="1213324807812"/>
</node>
</node>
</map>
diff --git a/freeplane/doc/history_en.txt b/freeplane/doc/history_en.txt
index c62a94d..d940c3f 100644
--- a/freeplane/doc/history_en.txt
+++ b/freeplane/doc/history_en.txt
@@ -1,4 +1,122 @@
===============================
+1.5.11
+===============================
+Restore old default map template
+
+===============================
+1.5.10
+===============================
+Stable release
+===============================
+1.5.9
+===============================
+User preferences can be saved and loaded from preferences dialog
+Drag and drop of *.freeplaneoptions file into the preferences dialog
+Look and feel jar can be put into user lib directory and class name entered into the preferences
+
+===============================
+1.5.8
+===============================
+Init scripts
+Rework scripting permissions
+
+===============================
+1.5.7
+===============================
+Keep summarized nodes together
+Option "Center small maps" for map position when root is selected
+Option to copy structure indentation as tabs
+Allow joining non sibling nodes
+Configurable join node action separators
+Allow to redefine actions for keys LEFT, RIGHT, UP, DOWN, PAGE_UP and PAGE_DOWN
+
+===============================
+1.5.6
+===============================
+Format changes (save length/width attributes as quantities)
+Scripting: textUtils.setClipboardContentsToHtml()
+Attribute table background and border color taken from attribute style or from current node
+Set standard content as default for BigMap.mm
+User defined characters to be accepted in words by SplitToWordsAction
+Automatic edge colors for node levels (format change)
+
+===============================
+1.5.5
+===============================
+Save autosave period in time period units
+Reminder notification popups
+Change shortcut for blue color in inline editor to control + L
+Use dark green in inline editor
+Import arbitrary xml as mind maps
+Export mind maps to xml (no syntax validation)
+Move menu and preference configuration to external resources
+Save attribute column widths in points
+Open new maps near selected maps
+
+===============================
+1.5.4
+===============================
+Single node clones
+Copy format to new siblings (option)
+Scroll map after unfolding a node (option)
+Change node size on mouse wheel scrolling
+Optionally copy icons with node format
+Extend scripting API for clones
+Only connectors inside cloned subtrees are replicated
+Local hyperlink targets are not changed for clones
+
+===============================
+1.5.3
+===============================
+Background images
+Clones
+Scripting API extensions
+Save and restore last edit location
+New handling for summary nodes
+Actions for splitting node text to words
+
+===============================
+1.5.2
+===============================
+Save node location options in length units
+Use new style "attributes" for attribute formatting
+
+===============================
+1.5.1
+===============================
+New node shapes small_bubble, oval, rectangle, hexagons
+Node shape margin and uniform options
+Improve map positioning on start and on window size changes
+Make Javascript scripts available with Java 1.8
+
+===============================
+1.5.0
+===============================
+Node and detail text alignment
+Distance between child nodes can be set in node style
+Support length measurement units pt, cm, mm and in in addition to px
+Formatted tool tips
+Remove tabs and borders in full screen
+Column based edge colors
+Summary node improvements
+Do not clear "map modified" flag unless save was successful
+Configurable default Map Save Directory
+Changed behavior of read-only maps
+Make data formatting, formula processing and LaTeX rendering independently configurable
+Keep icon name of user icon if it's not found in the current installation
+
+===============================
+1.3.16
+===============================
+Fix zooming for external images
+Automatic edge coloring: no yellow edges
+Fix date filtering on nodes and attributes
+Use oracle appbundler and universalJavaApplicationStub.sh for MacOS
+===============================
+1.3.15
+===============================
+Work around for JRE 1.8 bug for editing of attributes
+===============================
1.3.14
===============================
Use oracle launcher for MacOS
@@ -35,12 +153,13 @@ Bug fixes
===============================
1.3.8
===============================
-Bug fixes
+
===============================
1.3.7
===============================
compress tabs and remove ".mm" from tab titles
Add Format=Unparsed LaTeX and \unparsedlatex node prefix to allow LaTeX content that is solely used for export
+
===============================
1.3.6
===============================
diff --git a/freeplane/doc/whatsNew-1.5.x.mm b/freeplane/doc/whatsNew-1.5.x.mm
new file mode 100644
index 0000000..b182fdb
--- /dev/null
+++ b/freeplane/doc/whatsNew-1.5.x.mm
@@ -0,0 +1,706 @@
+<map version="freeplane 1.5.9">
+<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node TEXT=" 1.5.x Whats New!" LOCALIZED_STYLE_REF="AutomaticLayout.level.root" FOLDED="false" ID="ID_1573594237" CREATED="1462710693327" MODIFIED="1464551501085" TEXT_ALIGN="CENTER" MAX_WIDTH="260.0 pt" MIN_WIDTH="182.0 pt">
+<font SIZE="16"/>
+<hook NAME="MapStyle" background="#f7f7f7">
+ <properties show_icon_for_attributes="true" show_note_icons="true"/>
+
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="false" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="1"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#cccccc" MAX_WIDTH="260.0 pt" MIN_WIDTH="260.0 pt" VGAP_QUANTITY="5.0 pt">
+<font SIZE="9"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note" COLOR="#000000" BACKGROUND_COLOR="#ffffff" TEXT_ALIGN="LEFT"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right" STYLE="bubble">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" STYLE="fork" UNIFORM_SHAPE="true" TEXT_ALIGN="CENTER" MAX_WIDTH="120.0 pt" MIN_WIDTH="100.0 pt" VGAP_QUANTITY="10.0 pt">
+<font SIZE="16"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" NUMBERED="true" MIN_WIDTH="100.0 pt" VGAP_QUANTITY="5.0 pt">
+<font SIZE="11" BOLD="true"/>
+<edge COLOR="#a3a3ff" WIDTH="1"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" MAX_WIDTH="200.0 pt" MIN_WIDTH="20.0 pt" VGAP_QUANTITY="5.0 pt" TEXT_ALIGN="LEFT">
+<edge COLOR="#ff77b3" WIDTH="1"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" MAX_WIDTH="260.0 pt" MIN_WIDTH="20.0 pt" TEXT_ALIGN="LEFT" VGAP_QUANTITY="5.0 pt">
+<edge COLOR="#ff9933" WIDTH="1"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" MAX_WIDTH="260.0 pt" MIN_WIDTH="20.0 pt" TEXT_ALIGN="LEFT" VGAP_QUANTITY="5.0 pt">
+<edge COLOR="#9999ff" WIDTH="1"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#968900"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<hook NAME="AutomaticEdgeColor" COUNTER="0" RULE="FOR_BRANCHES"/>
+<edge COLOR="#000000"/>
+<node TEXT="Nodes" LOCALIZED_STYLE_REF="AutomaticLayout.level,1" POSITION="left" ID="ID_1622075986" CREATED="1462726803381" MODIFIED="1464551497306" BACKGROUND_COLOR="#c1c1ff">
+<node TEXT="Clones" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1106317150" CREATED="1462726964299" MODIFIED="1463415672587">
+<node LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_1121615672" CREATED="1462718982999" MODIFIED="1464029916393"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Its now possible to reuse existing nodes without doing them twice! Just clone them!
+ </p>
+ <p>
+ Cloned will be the complete subtree and all changes of it will be replicated in Clones, too.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Just try it:
+ </p>
+ <p>
+ Select the node "Nodes" with CTRL+C
+ </p>
+ <p>
+ and paste it somewhere else with CTRL+D
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Hint:
+ </p>
+ <p>
+ you can recognize clones by a small rectangle on the edge connector.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ If you want to unclone a cloned node:
+ </p>
+ <p>
+ execute <i>Edit→Unclone</i> it will then change to an individual node
+ </p>
+ </body>
+</html>
+
+</richcontent>
+</node>
+<node TEXT="Single node Clones" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" FOLDED="true" ID="ID_443536015" CREATED="1462715784615" MODIFIED="1463415659709">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Single node clones are node clones, but without a cloned node's subtree. Just the selected node will be cloned.
 </p>
 <p>
 
 </p>
 <p>
 Just try it:
 </p>
 <p>
 Select the node "Nodes" and press CTRL+SHIFT+C
 </p>
 <p> [...]
+</node>
+<node TEXT="Local hyperlink targets are not changed for clones" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_718210780" CREATED="1462715784650" MODIFIED="1463415654638"/>
+<node TEXT="Only connectors inside cloned subtrees are replicated" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_103996454" CREATED="1462715784644" MODIFIED="1463415651026"/>
+</node>
+<node TEXT="Summary node improvements" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_143916615" CREATED="1462715799753" MODIFIED="1463415681723">
+<node TEXT="" ID="ID_99164438" CREATED="1462820069785" MODIFIED="1462820069791">
+<hook NAME="FirstGroupNode"/>
+</node>
+<node TEXT="Keep summarized nodes together
(visual distance)" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_1309011799" CREATED="1462715687274" MODIFIED="1464625301178"/>
+<node TEXT="New handling for summary nodes" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_1503504156" CREATED="1462715833414" MODIFIED="1463417806728"/>
+<node TEXT="" ID="ID_1936616544" CREATED="1462820069774" MODIFIED="1464625825315">
+<hook NAME="SummaryNode"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Summary nodes can now have sibling nodes inserted just using ENTER (inserts below selected node) or using SHIFT+ENTER  (inserts above selected node)
 </p>
 <p>
 
 </p>
 <p>
 Try it out:
 </p>
 <p>
 Select the node <i>New handling for summary n [...]
+<edge WIDTH="5"/>
+</node>
+</node>
+</node>
+<node TEXT="Option to copy structure indentation as tabs" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1609673206" CREATED="1462715687282" MODIFIED="1463415688617"/>
+</node>
+<node TEXT="Format and styles" LOCALIZED_STYLE_REF="AutomaticLayout.level,1" POSITION="right" ID="ID_1118780235" CREATED="1462729792536" MODIFIED="1464029330176" BACKGROUND_COLOR="#ffb2d4">
+<node TEXT="Node and detail text alignment" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1446716767" CREATED="1462715833364" MODIFIED="1463415769656">
+<node ID="ID_952863116" CREATED="1462733898957" MODIFIED="1464625784480" MAX_WIDTH="200.0 pt" MIN_WIDTH="200.0 pt" TEXT_ALIGN="LEFT"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Node detail and text alignment
+ </p>
+ <p>
+ can now be aligned <i>left</i>
+ </p>
+ </body>
+</html>
+
+</richcontent>
+</node>
+<node ID="ID_1234066951" CREATED="1462805691022" MODIFIED="1464625631031" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" TEXT_ALIGN="RIGHT" MAX_WIDTH="200.0 pt"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ or, if you want,
+ </p>
+ <p>
+ you can choose the details and text to be <i>right</i> aligned
+ </p>
+ </body>
+</html>
+
+</richcontent>
+</node>
+<node LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_1967389286" CREATED="1462805853734" MODIFIED="1464625628646" MAX_WIDTH="200.0 pt" TEXT_ALIGN="CENTER"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ even <i>centered</i> can be set at
+ </p>
+ <p>
+ <i>Properties panel→"Format"-Tab→ </i>
+ </p>
+ <p>
+ <i>Font of whole core→Text Alignment</i>
+ </p>
+ </body>
+</html>
+
+</richcontent>
+<richcontent TYPE="DETAILS">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p style="text-align: center">
+ <b><font color="#ff0033" size="1">OR</font><font size="1"> </font></b><font size="1"> </font>
+ </p>
+ <p style="text-align: center">
+ <font size="1">in Freeplane's toolbar, to the right of Font-size and <b>"Bold"</b> &<b> "</b><i>Italic<b>"</b></i><b> </b>setters </font>
+ </p>
+ <p style="text-align: center">
+ <font size="1">(this a center-aligned node-detail to show </font>
+ </p>
+ <p style="text-align: center">
+ <font size="1">it also works in details) </font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+</node>
+<node TEXT="Make data formatting, formula processing and
LaTeX rendering independently configurable" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_856820716" CREATED="1462715833432" MODIFIED="1463415982669"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Distance between child nodes can be set in
 </p>
 <p>
 <i>Properties panel</i>
 </p>
 </body>
</html>" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1931822867" CREATED="1462715833364" MODIFIED="1464625570007" VGAP_QUANTITY="1.0 pt">
+<edge WIDTH="1"/>
+<node TEXT="child 1" ID="ID_701167941" CREATED="1462806840153" MODIFIED="1464625618545"/>
+<node LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_1372995988" CREATED="1462806854891" MODIFIED="1463594171391" VGAP_QUANTITY="20.0 pt"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ the gap between childs can be set at
+ </p>
+ <p>
+ <i>Properties panel→Node shape→Child gap</i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ This shape's child gap is set to 20 pt
+ </p>
+ <p>
+ It's parent's is set to 1 pt
+ </p>
+ </body>
+</html>
+
+</richcontent>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="child 3" ID="ID_927806003" CREATED="1462807073479" MODIFIED="1464625612687"/>
+<node TEXT="child 4" ID="ID_883836460" CREATED="1462807120463" MODIFIED="1464625609504"/>
+</node>
+<node TEXT="child 2" ID="ID_1635586910" CREATED="1462807018481" MODIFIED="1464625616027"/>
+</node>
+<node TEXT="Formatted tool tips
(hold the mouse over this node)" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_479649627" CREATED="1462715833401" MODIFIED="1463415786418"><richcontent TYPE="NOTE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ This is bad formated Note
+ </p>
+ <ul>
+ <li>
+ <i>you</i>
+ </li>
+ <li>
+ <font color="#ff0033">like</font>
+ </li>
+ <li>
+ <font color="#ffffff"> </font><font color="#009900"> <u>it?</u></font>
+ </li>
+ </ul>
+ <p>
+ <font face="Arabic Typesetting"> </font>
+ </p>
+ <table border="0" style="width: 80%; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 0; border-right-width: 0; border-bottom-width: 0; border-left-width: 0">
+ <tr>
+ <td valign="top" style="width: 33%; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1; border-right-width: 1; border-bottom-width: 1; border-left-width: 1">
+ <p style="margin-top: 1; margin-right: 1; margin-bottom: 1; margin-left: 1; text-align: center">
+ even
+ </p>
+ </td>
+ <td valign="top" style="width: 33%; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1; border-right-width: 1; border-bottom-width: 1; border-left-width: 1">
+ <p style="margin-top: 1; margin-right: 1; margin-bottom: 1; margin-left: 1; text-align: center">
+ tables
+ </p>
+ </td>
+ <td valign="top" style="width: 33%; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1; border-right-width: 1; border-bottom-width: 1; border-left-width: 1">
+ <p style="margin-top: 1; margin-right: 1; margin-bottom: 1; margin-left: 1; text-align: center">
+ are possible
+ </p>
+ </td>
+ </tr>
+ </table>
+ </body>
+</html>
+</richcontent>
+<richcontent TYPE="DETAILS" HIDDEN="true">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ this is a <font color="#cccccc">hidden</font> node detail
+ </p>
+ <p>
+ <font face="Arial Narrow">to demonstrate the<u> </u></font><u><font face="Arial Narrow" color="#ff0000">formatted tooltip</font></u><font face="Arial Narrow"> feature</font>
+ </p>
+ </body>
+</html>
+</richcontent>
+</node>
+<node TEXT="Automatic edge colors for node levels
(automatic format changing)" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" FOLDED="true" ID="ID_1246910088" CREATED="1462715723968" MODIFIED="1463417442379">
+<node ID="ID_991253032" CREATED="1462808818968" MODIFIED="1463417488016" MAX_WIDTH="200.0 pt" TEXT_ALIGN="LEFT"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Freeplane now offers several options to automate the edge coloring! See the <i>Properties panel</i> for more!
+ </p>
+ </body>
+</html>
+
+</richcontent>
+</node>
+</node>
+<node TEXT="Column based edge colors" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1357352160" CREATED="1462715833408" MODIFIED="1463415941407">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 ...can be set in the <i>Properties panel</i>
 </p>
 </body>
</html>" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_520840991" CREATED="1462807191385" MODIFIED="1463594294193">
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Every column (count of shapes and distance from root) can have its own colors.
 
Try it out:
Play with the different options offered. You also can manually change it, like it did happen for this node." LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_1808930284" CREATED="1462807205113" MODIFIED="1463413022153" TEXT_ALIGN="LEFT" MAX_WIDTH="216.0 pt" MIN_WIDTH="216.0 pt">
+<edge WIDTH="13"/>
+</node>
+</node>
+</node>
+<node LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_712397053" CREATED="1462715821219" MODIFIED="1463415958197"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ New Node shapes can be set in the
+ </p>
+ <p>
+ <i>Properties panel</i>
+ </p>
+ </body>
+</html>
+
+</richcontent>
+<node TEXT="small bubble" ID="ID_292442320" CREATED="1462734797720" MODIFIED="1463413022156" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt"/>
+<node TEXT="oval" ID="ID_1215456908" CREATED="1462734804051" MODIFIED="1463413022156" STYLE="oval" SHAPE_VERTICAL_MARGIN="0.0 pt"/>
+<node TEXT="rectangle" ID="ID_237428154" CREATED="1462734807037" MODIFIED="1463413022156" STYLE="rectangle" SHAPE_VERTICAL_MARGIN="0.0 pt"/>
+<node TEXT="wide hexagon" ID="ID_1903601118" CREATED="1462734813733" MODIFIED="1463594312253" STYLE="wide_hexagon" SHAPE_VERTICAL_MARGIN="0.0 pt">
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="narrow hexagon" ID="ID_190246001" CREATED="1462734891440" MODIFIED="1463413022157" STYLE="narrow_hexagon" SHAPE_VERTICAL_MARGIN="0.0 pt"/>
+</node>
+<node TEXT="Node's shape margins and uniform shape
options" ID="ID_766587863" CREATED="1462805061443" MODIFIED="1463594307619" STYLE="wide_hexagon" SHAPE_VERTICAL_MARGIN="0.0 pt" UNIFORM_SHAPE="true">
+<hook NAME="AlwaysUnfoldedNode"/>
+<node ID="ID_1520861877" CREATED="1462806074059" MODIFIED="1463417411096" STYLE="bubble" SHAPE_HORIZONTAL_MARGIN="10.0 pt" SHAPE_VERTICAL_MARGIN="50.0 pt" UNIFORM_SHAPE="true" TEXT_ALIGN="RIGHT" MAX_WIDTH="200.0 pt" MIN_WIDTH="120.0 pt"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ To get in size uniformly shaped nodes, switch ON "<i>Uniform</i>" option on the
+ </p>
+ <p>
+ <i>Properties panel→Node shape</i> section
+ </p>
+ <p>
+
+ </p>
+ <p>
+ (Don't forget to check the "<i>Change</i>"-Checkbox and allow the Node shape to be altered.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Make sure you try the new options for setting <i>horizontal</i> and <i>vertical</i> margins!)
+ </p>
+ </body>
+</html>
+
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Use new style "<i>attributes</i>" for
 </p>
 <p>
 attribute formatting
 </p>
 </body>
</html>" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_698058179" CREATED="1462715806875" MODIFIED="1463594352254">
+<attribute_layout NAME_WIDTH="58.8 pt" VALUE_WIDTH="58.8 pt"/>
+<node LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_574796375" CREATED="1462715723949" MODIFIED="1464026364006" TEXT_ALIGN="LEFT"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ Attribute table background and border color can be taken from the new "<i>attributes</i>" style or from current node.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ To edit the "<i>attribute</i>"-style, press CTRL+F11 or head to the <i>Format→Manage styles</i> menu and click on <i>Edit styles</i>.
+ </p>
+ <p>
+ There, choose the node "<i>attributes</i>" and adjust this style as you like in the <i>Properties panel</i>
+ </p>
+ </body>
+</html>
+
+</richcontent>
+<attribute_layout NAME_WIDTH="108.6 pt" VALUE_WIDTH="151.79999999999998 pt"/>
+<attribute NAME="Edge Color is set to" VALUE="808080" OBJECT="org.freeplane.features.format.FormattedNumber|808080"/>
+<attribute NAME="Text Color is set to" VALUE="CCCCCC"/>
+</node>
+</node>
+<node LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_756841883" CREATED="1462715745823" MODIFIED="1463416030666"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ <font color="#000000">Change shortcut for blue color in inline </font>
+ </p>
+ <p>
+ <font color="#000000">editor to CTRL+L</font>
+ </p>
+ </body>
+</html>
+
+</richcontent>
+</node>
+<node TEXT="Copy format to new siblings (option)" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_811663012" CREATED="1462715784615" MODIFIED="1463416039734">
+<node ID="ID_739245455" CREATED="1462727872948" MODIFIED="1463413022158" MAX_WIDTH="250.0 pt" MIN_WIDTH="248.39999999999998 pt" BACKGROUND_COLOR="#f7f7f7" TEXT_ALIGN="LEFT"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ When you define a custom Node style for a single node and then create a sibling, the new sibling will have the Node style which is defined at <i>Properties panel</i> and not your freshly defined one.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Dont want to redefine the format for all new siblings? Enable the option "<i>Copy formats to new siblings</i>" that can be found at <i>Format menu. </i>
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Try it out:
+ </p>
+ <p>
+ Enable the option to copy formats to new siblings and select this node again. When you press ENTER a sibling with the same format as this node will be created. Just press a few times ENTER - all of them have the same format.
+ </p>
+ <p>
+
+ </p>
+ <p>
+ Now, disable the option again and create a sibling - it has the standard format again.
+ </p>
+ </body>
+</html>
+
+</richcontent>
+<edge STYLE="bezier" COLOR="#cc0033" WIDTH="3"/>
+</node>
+</node>
+<node TEXT="Optionally copy icons with node format" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_410178404" CREATED="1462715784631" MODIFIED="1463416044273">
+<node LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_1924674326" CREATED="1463168797129" MODIFIED="1464029540859"><richcontent TYPE="NODE">
+
+<html>
+ <head>
+
+ </head>
+ <body>
+ <p>
+ If you made up a node's style, for example <font color="#ff0000">RED</font> font size 18
+ </p>
+ <p>
+ for your <u><b><font color="#ff0000">IMPORTANT!!!</font></b></u> nodes and want to assign
+ </p>
+ <p>
+ it icon(s) - no problem you can do that!<br/><br/>Now, you want to copy the formatting to another node. It will get the style - no problem - but it wont get the icon(s)!
+ </p>
+ <p>
+ <br/>
+ To get the icons copied along the formatting, check the option<br/><i>Tools→Preferences→Behaviour→copy format with icons</i>
+ </p>
+ </body>
+</html>
+
+</richcontent>
+</node>
+</node>
+</node>
+<node TEXT="Maps & Mapviews" LOCALIZED_STYLE_REF="AutomaticLayout.level,1" POSITION="left" ID="ID_1332007370" CREATED="1462729844988" MODIFIED="1464551501072" BACKGROUND_COLOR="#ffd5ad">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Added "<i>BigMap.mm</i>" as Template
 </p>
 </body>
</html>" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_28841704" CREATED="1462715723956" MODIFIED="1463416066596">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Jona's scientific approach to hack and pimp your brain with Freeplane!
 </p>
 <p>
 
 </p>
 <p>
 Be more productive, learn and memorize faster based on mindmaps which are optimized to the wonders of the human brain!
 </p>
 <p>
 
 </p>
 <p&g [...]
+</node>
+<node TEXT="Remove tabs and borders in full screen" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_732354546" CREATED="1462715833407" MODIFIED="1463416070501"/>
+<node TEXT="Background images" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1429532368" CREATED="1462715799747" MODIFIED="1463416074480">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Its now possible to use a custom image as the background of a map. This Whats New Map uses one!
 </p>
 <p>
 
 </p>
 <p>
 To set one, just choose one at
 </p>
 <p>
 <i>Format→Map background→Background Image... </i>
 </p>&#x [...]
+</node>
+<node TEXT="Option "Center small maps" for map
position when root is selected" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1317327473" CREATED="1462715687274" MODIFIED="1464629667997"/>
+<node TEXT="Use dark green in inline editor" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_481081383" CREATED="1462715745830" MODIFIED="1463416093013"/>
+<node TEXT="Scroll map after unfolding a node (option)" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1536706425" CREATED="1462715784618" MODIFIED="1463416096631"/>
+<node TEXT="Change node size on mouse wheel scrolling" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_598226711" CREATED="1462715784625" MODIFIED="1463416101203">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 A new feature for quickly resizing (multiple selected) nodes' width by ALT+<i>Mouse wheel</i>.
 </p>
 <p>
 
 </p>
 <p>
 Just try it:
 </p>
 <p>
 Hover your mouse over a node (or multiple selected nodes). press ALT and scroll your <i>Mouse wheel [...]
+</node>
+<node TEXT="Nodes folding behaviour (option)" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_62855853" CREATED="1462982954864" MODIFIED="1463416105969">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Under <i>Navigate→Fold</i> you'll find three new actions:
 </p>
 <ul>
 <li>
 "<i>Keep unfolded nodes</i>" prevents all currently unfolded nodes from being folded. It makes it possible to fold/unfold not just single nodes but bigger map parts.
 & [...]
+</node>
+</node>
+<node TEXT="Node CORE" LOCALIZED_STYLE_REF="AutomaticLayout.level,1" POSITION="right" ID="ID_1983956508" CREATED="1462728817058" MODIFIED="1464025902797" BACKGROUND_COLOR="#cccee9">
+<node TEXT="User defined characters are accepted in words by SplitToWordsAction" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_792044458" CREATED="1462715723963" MODIFIED="1463416112636">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 There are different actions for splitting the content available.
 </p>
 <p>
 
 </p>
 <p>
 The original action which has shortcut ALT+S ignores the separators specified in the preferences. It is oriented on line breaks and on HTML formatting elements when they are available (like table rows or cells).& [...]
+</node>
+<node TEXT="Configurable join node action separators" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1245499515" CREATED="1462715687294" MODIFIED="1463416116340">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 There are customizable actions for joining content in Freeplane now. Joining with line breaks {{\n}} is the original action accessable with ALT+J.
 </p>
 <p>
 
 </p>
 <p>
 This two separators are added by default:
 </p>
 <p>
 {{ }} {{, }}    [...]
+</node>
+<node TEXT="Allow joining non sibling nodes" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1210779357" CREATED="1462715687288" MODIFIED="1463416122083">
+<node TEXT="What" ID="ID_1451262145" CREATED="1462813509068" MODIFIED="1464630375332" VGAP_QUANTITY="10.0 pt" TEXT_ALIGN="CENTER">
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="has" ID="ID_1537448104" CREATED="1462813637980" MODIFIED="1464630401692" TEXT_ALIGN="CENTER">
+<node TEXT="been" ID="ID_1072202818" CREATED="1462813637983" MODIFIED="1463413052729" TEXT_ALIGN="CENTER">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_869116818" STARTINCLINATION="-1;16;" ENDINCLINATION="50;-32;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+</node>
+<node TEXT="splitted" ID="ID_869116818" CREATED="1462813637985" MODIFIED="1463413052731" TEXT_ALIGN="CENTER">
+<edge STYLE="hide_edge"/>
+<node TEXT="can" ID="ID_576528499" CREATED="1462813637987" MODIFIED="1463413052729" TEXT_ALIGN="CENTER">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_149676500" STARTINCLINATION="-10;7;" ENDINCLINATION="23;-20;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+</node>
+<node TEXT="also" ID="ID_149676500" CREATED="1462813637990" MODIFIED="1463413052732" TEXT_ALIGN="CENTER">
+<edge STYLE="hide_edge"/>
+<node TEXT="be" ID="ID_405687640" CREATED="1462813637992" MODIFIED="1463413052728" TEXT_ALIGN="CENTER">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1493748682" STARTINCLINATION="-2;23;" ENDINCLINATION="34;-21;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+</node>
+<node TEXT="joined." ID="ID_1493748682" CREATED="1462813637994" MODIFIED="1463413052734" TEXT_ALIGN="CENTER">
+<edge STYLE="hide_edge"/>
+<node TEXT="Even" ID="ID_1182239066" CREATED="1462813637996" MODIFIED="1463594552631" TEXT_ALIGN="CENTER">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_592058136" STARTINCLINATION="-23;24;" ENDINCLINATION="45;-34;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="Beware of the CHAOS that will
happen when joining linked nodes" ID="ID_1264154941" CREATED="1462814400038" MODIFIED="1464630454237" MAX_WIDTH="200.0 pt" MIN_WIDTH="150.0 pt" COLOR="#ff0000" TEXT_ALIGN="CENTER">
+<font BOLD="true"/>
+<edge STYLE="hide_edge" COLOR="#ffffff" ALPHA="0"/>
+</node>
+</node>
+</node>
+<node TEXT="if" ID="ID_592058136" CREATED="1462813637998" MODIFIED="1463413052735" TEXT_ALIGN="CENTER">
+<edge STYLE="hide_edge"/>
+<node TEXT="the" ID="ID_1207630482" CREATED="1462813638000" MODIFIED="1464629882146" TEXT_ALIGN="CENTER">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_170616711" STARTINCLINATION="-30;17;" ENDINCLINATION="39;-25;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="you always can undo what has
been done with CTRL+Z" ID="ID_558730677" CREATED="1462814709421" MODIFIED="1464629829111" COLOR="#ff0000" TEXT_ALIGN="CENTER" MAX_WIDTH="200.0 pt" MIN_WIDTH="150.0 pt">
+<edge STYLE="hide_edge" COLOR="#ffffff" ALPHA="0"/>
+</node>
+</node>
+</node>
+<node TEXT="nodes" ID="ID_170616711" CREATED="1462813638003" MODIFIED="1463413052735" TEXT_ALIGN="CENTER">
+<edge STYLE="hide_edge"/>
+<node TEXT="to be" ID="ID_229734552" CREATED="1462813638005" MODIFIED="1464630419090" TEXT_ALIGN="CENTER">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1594005021" STARTINCLINATION="-1;25;" ENDINCLINATION="30;-31;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="select the nodes to be joined with
left-click while holding CTRL pressed" ID="ID_493925395" CREATED="1462815200170" MODIFIED="1464629836021" COLOR="#ff0000" TEXT_ALIGN="CENTER" MAX_WIDTH="200.0 pt" MIN_WIDTH="150.0 pt">
+<edge STYLE="hide_edge" COLOR="#ffffff" ALPHA="0"/>
+</node>
+</node>
+</node>
+<node TEXT="joined" ID="ID_1594005021" CREATED="1462813638007" MODIFIED="1463413052736" TEXT_ALIGN="CENTER">
+<edge STYLE="hide_edge"/>
+<node TEXT="are" ID="ID_1321750994" CREATED="1462813638009" MODIFIED="1464630426023" TEXT_ALIGN="CENTER">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1252623007" STARTINCLINATION="-17;21;" ENDINCLINATION="29;-21;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+<hook NAME="AlwaysUnfoldedNode"/>
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 the different JOIN-Actions can be
 </p>
 <p>
 found at <i>Edit→Node Core </i>
 </p>
 </body>
</html>" ID="ID_918257776" CREATED="1462814851647" MODIFIED="1464629858143" COLOR="#ff0000" TEXT_ALIGN="CENTER" MAX_WIDTH="200.0 pt" MIN_WIDTH="150.0 pt">
+<edge STYLE="hide_edge" COLOR="#ffffff" ALPHA="0"/>
+</node>
+</node>
+</node>
+<node TEXT="no" ID="ID_1252623007" CREATED="1462813638011" MODIFIED="1463413052736" TEXT_ALIGN="CENTER">
+<edge STYLE="hide_edge"/>
+<node TEXT="siblings" ID="ID_204105455" CREATED="1462813638013" MODIFIED="1463594678543" TEXT_ALIGN="CENTER">
+<arrowlink SHAPE="CUBIC_CURVE" COLOR="#000000" WIDTH="2" TRANSPARENCY="200" FONT_SIZE="9" FONT_FAMILY="SansSerif" DESTINATION="ID_1264154941" STARTINCLINATION="211;94;" ENDINCLINATION="-220;-96;" STARTARROW="NONE" ENDARROW="DEFAULT"/>
+</node>
+</node>
+</node>
+</node>
+</node>
+<node TEXT="General" LOCALIZED_STYLE_REF="AutomaticLayout.level,1" POSITION="left" ID="ID_1222821095" CREATED="1462729713743" MODIFIED="1464551497261" BACKGROUND_COLOR="#b8b597">
+<node TEXT="Save and restore last edit location" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1034233150" CREATED="1462715799751" MODIFIED="1464630299453" VGAP_QUANTITY="5.0 pt">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 The last edited node will be saved and displayed when opening a map. This option can be switched ON / OFF at <i>Tools→Preferences→Environment→Save</i>
 </p>
 </body>
</html>" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_748438159" CREATED="1462731818854" MODIFIED="1464630299453"/>
+</node>
+<node TEXT="Reminder notification popups" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_860303715" CREATED="1462715745815" MODIFIED="1463427338715"/>
+<node TEXT="Configurable default Map Save Directory" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1185441112" CREATED="1462715833421" MODIFIED="1463427215249" VSHIFT_QUANTITY="0.6 pt">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Want to save Maps to a special directory by default?
 </p>
 <p>
 See the <i>Tools→Preferences→Environment→Save. </i>
 </p>
 <p>
 There a default directory can be set.
 </p>
 </body>
</html>" LOCALIZED_STYLE_REF="AutomaticLayou [...]
+</node>
+<node TEXT="Moved menu and preference configuration
to external resources" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_944226735" CREATED="1462715745844" MODIFIED="1464629647152" VGAP_QUANTITY="5.0 pt">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Accelerator keys can now be found and manually edited in the file "<i>accelerator.properties</i>" which is located in the user directory, as other configuration files for Freeplane, too..
 </p>
 <p>
 
 </p>
 <p>
 Want to reorganize your menu structure? Want to change the [...]
+</node>
+<node TEXT="Save and restore preferences" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_141170450" CREATED="1464546306966" MODIFIED="1464548254551" VGAP_QUANTITY="5.0 pt">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p style="text-align: left">
 Customized your Freeplane and need to move to another computer? Don't trouble your head about it!
 </p>
 <p style="text-align: left">
 
 </p>
 <p style="text-align: left">
 Your preferences and settings at <i>Tools</i>→& [...]
+</node>
+<node TEXT="Supporting length measurement units pt,
cm, mm and in(ch) in addition to px" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1668524215" CREATED="1462715833395" MODIFIED="1464027410699"/>
+<node TEXT="Keep icon name of user icon if it's not
found in the current installation" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1471950019" CREATED="1462715833437" MODIFIED="1464546634951"/>
+<node TEXT="Allow to redefine actions for keys LEFT, RIGHT,
UP, DOWN, PAGE_UP and PAGE_DOWN" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_150662906" CREATED="1462715687299" MODIFIED="1464551539107"/>
+<node TEXT="Other minor changes" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_834947347" CREATED="1464026212065" MODIFIED="1464027557818">
+<node TEXT="Save node location options in length units" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1426750894" CREATED="1462715806875" MODIFIED="1464025757898" STYLE="bubble" SHAPE_HORIZONTAL_MARGIN="4.0 pt" SHAPE_VERTICAL_MARGIN="0.0 pt"/>
+<node TEXT="Save attribute column widths in points" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1682727870" CREATED="1462715745848" MODIFIED="1463427215374"/>
+<node TEXT="Changed behavior of read-only maps" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1617994100" CREATED="1462715833426" MODIFIED="1463427215287"/>
+<node TEXT="Format changes (save length/width attributes
as quantities)" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_65764135" CREATED="1462715723941" MODIFIED="1464027589906" TEXT_ALIGN="LEFT"/>
+<node TEXT="Save autosave period in time period units" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1242830267" CREATED="1462715745815" MODIFIED="1463427215362"/>
+<node TEXT="Open new maps near selected maps" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_343231945" CREATED="1462715745852" MODIFIED="1463427215308"/>
+<node TEXT="Improved map positioning on start and
on window size changes" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" ID="ID_1399954511" CREATED="1462715821226" MODIFIED="1464027609914"/>
+</node>
+<node TEXT="Export / Import" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_834305759" CREATED="1462728678109" MODIFIED="1463427215382">
+<node TEXT="Import arbitrary xml as mind maps" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_37225340" CREATED="1462715745836" MODIFIED="1463427282358"/>
+<node TEXT="Export mind maps to xml (no syntax validation)" LOCALIZED_STYLE_REF="AutomaticLayout.level,3" ID="ID_1478488265" CREATED="1462715745840" MODIFIED="1463427282357">
+<node TEXT="Exporting mind maps to arbitrary xml makes only sense for maps created by importing arbitrary xml" ID="ID_833233446" CREATED="1462809962439" MODIFIED="1463416846480" TEXT_ALIGN="LEFT" MAX_WIDTH="200.0 pt"/>
+</node>
+</node>
+</node>
+<node TEXT="Scripting" LOCALIZED_STYLE_REF="AutomaticLayout.level,1" POSITION="right" ID="ID_1375264560" CREATED="1462728879440" MODIFIED="1464029320672" BACKGROUND_COLOR="#d89bd8">
+<node TEXT="Reworked scripting permissions" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_1262185543" CREATED="1462715666539" MODIFIED="1463427215382">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Don't give malicious scripts a chance!
 </p>
 <p>
 
 </p>
 <p>
 Scripting permissions have been reworked.
 </p>
 <p>
 If your scripts stopped working, look in Freeplane's discussion forum or the Wiki (<a href="http://www.freeplane.org">www.f [...]
+</node>
+<node TEXT="Init scripts" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_462188596" CREATED="1462715666539" MODIFIED="1464630263898" VGAP_QUANTITY="5.0 pt">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Freeplane now supports scripts that are executed on startup.
 </p>
 <p>
 This is especially useful for scripts that change the behavior of Freeplane (f.e. Event listeners).<br><br>For more, see <a href="http://www.freeplane.org/wiki/index.php/Init_scripts">http://www.freeplane.org/wiki/index.php/Init_scripts [...]
+</node>
+<node TEXT="General Scripting API extensions" LOCALIZED_STYLE_REF="AutomaticLayout.level,2" FOLDED="true" ID="ID_947569159" CREATED="1462715799749" MODIFIED="1463427215387">
+<node TEXT="<html>
 <head>
 
 </head>
 <body>
 <p>
 Freeplane's scripting API capabilities are extended with almost each new version.
 </p>
 <p>
 For changes please look here:<br><a href="http://www.freeplane.org/wiki/index.php/Scripting:_API_Changes">http://www.freeplane.org/wiki/index.php/Scripting:_API_Changes</a>
 </p>
 </body> [...]
+</node>
+</node>
+</node>
+</map>
diff --git a/freeplane/external-resources/templates/BigMap.mm b/freeplane/external-resources/templates/BigMap.mm
new file mode 100644
index 0000000..b118ef9
--- /dev/null
+++ b/freeplane/external-resources/templates/BigMap.mm
@@ -0,0 +1,115 @@
+<map version="freeplane 1.5.3">
+<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
+<node LOCALIZED_TEXT="new_mindmap">
+<hook NAME="MapStyle">
+<map_styles>
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" UNIFORM_SHAPE="true" VGAP_QUANTITY="24 pt" TEXT_SHORTENED="true">
+<font SIZE="24"/>
+<richcontent TYPE="DETAILS" LOCALIZED_HTML="styles_background_html"/>
+<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="bubble" SHAPE_VERTICAL_MARGIN="0.0 pt" TEXT_ALIGN="CENTER" MAX_WIDTH_QUANTITY="120.0 pt" MIN_WIDTH_QUANTITY="120.0 pt">
+<font NAME="Arial" SIZE="9" BOLD="true" ITALIC="false"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.details">
+<font SIZE="11" BOLD="false"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.attributes" COLOR="#000000" BACKGROUND_COLOR="#ffffff">
+<font SIZE="9" BOLD="false"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.note" COLOR="#000000" BACKGROUND_COLOR="#ffffff" TEXT_ALIGN="LEFT">
+<font BOLD="false"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="defaultstyle.floating">
+<edge STYLE="hide_edge"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="styles.important">
+<icon BUILTIN="yes"/>
+<edge COLOR="#0000cc"/>
+</stylenode>
+</stylenode>
+<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
+<font SIZE="9"/>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" UNIFORM_SHAPE="true" MAX_WIDTH_QUANTITY="120.0 pt" MIN_WIDTH_QUANTITY="120.0 pt">
+<font SIZE="24" ITALIC="true"/>
+<edge STYLE="bezier" WIDTH="3"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2">
+<edge COLOR="#ff0033"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3">
+<edge COLOR="#009933"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4">
+<edge COLOR="#3333ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#ff6600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#cc00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#ffbf00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#00ff99"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#0099ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#996600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#000000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,12">
+<edge COLOR="#cc0066"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,13">
+<edge COLOR="#33ff00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,14">
+<edge COLOR="#ff9999"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,15">
+<edge COLOR="#0000cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,16">
+<edge COLOR="#cccc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,17">
+<edge COLOR="#0099cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,18">
+<edge COLOR="#006600"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,19">
+<edge COLOR="#ff00cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,20">
+<edge COLOR="#00cc00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,21">
+<edge COLOR="#0066cc"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,22">
+<edge COLOR="#00ffff"/>
+</stylenode>
+</stylenode>
+</stylenode>
+</map_styles>
+</hook>
+<hook NAME="accessories/plugins/AutomaticLayout.properties" VALUE="ALL"/>
+<font SIZE="24"/>
+<hook NAME="AutomaticEdgeColor" COUNTER="0" RULE="FOR_COLUMNS"/>
+</node>
+</map>
diff --git a/freeplane/external-resources/templates/conceptMap.mm b/freeplane/external-resources/templates/conceptMap.mm
index 7807a89..4f36b90 100644
--- a/freeplane/external-resources/templates/conceptMap.mm
+++ b/freeplane/external-resources/templates/conceptMap.mm
@@ -1,6 +1,6 @@
-<map version="0.9.0">
+<map version="freeplane 1.5.3">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node TEXT="New Concept Map">
+<node TEXT="New Concept Map" STYLE="oval">
<hook NAME="MapStyle" max_node_width="600">
<conditional_styles>
<conditional_style ACTIVE="true" LOCALIZED_STYLE_REF="styles.connection">
@@ -17,13 +17,13 @@
</conditional_style>
</conditional_styles>
<map_styles>
- <stylenode LOCALIZED_TEXT="styles.root_node">
+ <stylenode LOCALIZED_TEXT="styles.root_node" STYLE="circle" >
<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork">
<font NAME="Arial" SIZE="10" BOLD="false" ITALIC="false"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
- <stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+ <stylenode LOCALIZED_TEXT="defaultstyle.note" COLOR="#000000" BACKGROUND_COLOR="#ffffff" TEXT_ALIGN="LEFT" />
<stylenode LOCALIZED_TEXT="defaultstyle.floating">
<edge STYLE="hide_edge"/>
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
@@ -44,7 +44,7 @@
</stylenode>
</stylenode>
<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
- <stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
+ <stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval">
<font SIZE="18"/>
</stylenode>
<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
diff --git a/freeplane/external-resources/templates/essay.mm b/freeplane/external-resources/templates/essay.mm
index febbd8f..a8e73aa 100644
--- a/freeplane/external-resources/templates/essay.mm
+++ b/freeplane/external-resources/templates/essay.mm
@@ -1,15 +1,15 @@
-<map version="0.9.0">
+<map version="freeplane 1.5.3">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node LOCALIZED_TEXT="new_mindmap" ID="ID_1723255651" CREATED="1283093380553" MODIFIED="1283093380553">
+<node LOCALIZED_TEXT="new_mindmap" STYLE="oval" ID="ID_1723255651" CREATED="1283093380553" MODIFIED="1283093380553">
<hook NAME="MapStyle" max_node_width="600">
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="circle" >
<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork">
<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.note" COLOR="#000000" BACKGROUND_COLOR="#ffffff" TEXT_ALIGN="LEFT" />
<stylenode LOCALIZED_TEXT="defaultstyle.floating">
<edge STYLE="hide_edge"/>
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
@@ -81,7 +81,7 @@
</stylenode>
</stylenode>
<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" >
<font SIZE="18"/>
</stylenode>
<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
diff --git a/freeplane/external-resources/templates/standard.mm b/freeplane/external-resources/templates/standard.mm
index 0e7a717..64a1ffc 100644
--- a/freeplane/external-resources/templates/standard.mm
+++ b/freeplane/external-resources/templates/standard.mm
@@ -1,15 +1,16 @@
-<map version="0.9.0">
+<map version="freeplane 1.5.3">
<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node LOCALIZED_TEXT="new_mindmap" ID="ID_1723255651" CREATED="1283093380553" MODIFIED="1283093380553">
-<hook NAME="MapStyle" max_node_width="600">
+<node LOCALIZED_TEXT="new_mindmap" STYLE="oval">
+<font SIZE="18"/>
+<hook NAME="MapStyle">
<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
+<stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval" SHAPE_VERTICAL_MARGIN="12.0 pt" SHAPE_HORIZONTAL_MARGIN="6.0 pt" >
<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
<stylenode LOCALIZED_TEXT="default" COLOR="#000000" STYLE="fork">
<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
</stylenode>
<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
+<stylenode LOCALIZED_TEXT="defaultstyle.note" COLOR="#000000" BACKGROUND_COLOR="#ffffff" TEXT_ALIGN="LEFT" />
<stylenode LOCALIZED_TEXT="defaultstyle.floating">
<edge STYLE="hide_edge"/>
<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
@@ -30,25 +31,50 @@
</stylenode>
</stylenode>
<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000" STYLE="oval" SHAPE_VERTICAL_MARGIN="10.0 pt" SHAPE_HORIZONTAL_MARGIN="10.0 pt" >
<font SIZE="18"/>
</stylenode>
<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
<font SIZE="16"/>
+<edge COLOR="#ff0000"/>
</stylenode>
<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
<font SIZE="14"/>
+<edge COLOR="#0000ff"/>
</stylenode>
<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
<font SIZE="12"/>
+<edge COLOR="#00ff00"/>
</stylenode>
<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
<font SIZE="10"/>
+<edge COLOR="#ff00ff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,5">
+<edge COLOR="#00ffff"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,6">
+<edge COLOR="#7c0000"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,7">
+<edge COLOR="#00007c"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,8">
+<edge COLOR="#007c00"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,9">
+<edge COLOR="#7c007c"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,10">
+<edge COLOR="#007c7c"/>
+</stylenode>
+<stylenode LOCALIZED_TEXT="AutomaticLayout.level,11">
+<edge COLOR="#7c7c00"/>
</stylenode>
</stylenode>
</stylenode>
</map_styles>
</hook>
-<hook NAME="AutomaticEdgeColor"/>
+<hook NAME="AutomaticEdgeColor" COUNTER="0" RULE="ON_BRANCH_CREATION"/>
</node>
</map>
diff --git a/freeplane/external-resources/xml/browsemodemenu.xml b/freeplane/external-resources/xml/browsemodemenu.xml
new file mode 100644
index 0000000..5ff3207
--- /dev/null
+++ b/freeplane/external-resources/xml/browsemodemenu.xml
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<FreeplaneUIEntries>
+ <Entry builder="main_menu">
+ <Entry name="file">
+ <Entry name="lastOpenedMaps">
+ <Entry builder="lastOpenedMaps" />
+ </Entry>
+ <Entry name="PageAction" />
+ <Entry name="PrintPreviewAction" />
+ <Entry accelerator="control P" name="PrintAction" />
+ <Entry name="FilePropertiesAction" />
+ <Entry accelerator="control W" name="CloseAction" />
+ <Entry accelerator="control Q" name="QuitAction" builder="MB_QuitAction" />
+ </Entry>
+ <Entry name="edit">
+ <Entry name="menu_extensions">
+ <Entry name="SetShortenerStateAction" />
+ </Entry>
+ <Entry name="menu_copy">
+ <Entry accelerator="control C" name="CopyAction" />
+ <Entry accelerator="control shift C" name="CopySingleAction" />
+ </Entry>
+ <Entry name="find">
+ <Entry accelerator="control G" name="FindAction" />
+ <Entry name="FindNextAction" accelerator="control shift G" />
+ <Entry name="FindPreviousAction" />
+ </Entry>
+ </Entry>
+ <Entry name="view">
+ <Entry name="toolbars">
+ <Entry name="ToggleMenubarAction" builder="MB_ToggleMenubarAction" />
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ShowFilterToolbarAction" accelerator="control F" />
+ <Entry name="ToggleScrollbarsAction" />
+ </Entry>
+ <Entry name="zoom">
+ <Entry accelerator="alt UP" name="ZoomInAction" />
+ <Entry accelerator="alt DOWN" name="ZoomOutAction" />
+ <Entry accelerator="alt C" name="CenterSelectedNodeAction" />
+ </Entry>
+ <Entry name="menu_viewmode">
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="ShowSelectionAsRectangleAction" />
+ </Entry>
+ <Entry name="menu_hoverView">
+ <Entry accelerator="alt F2" name="ToggleDetailsAction" />
+ <Entry name="SetBooleanPropertyAction.show_node_tooltips" />
+ </Entry>
+ <Entry builder="radio_button_group" name="menu_displayAttributes">
+ <Entry name="ShowSelectedAttributesAction" />
+ <Entry name="ShowAllAttributesAction" />
+ <Entry name="HideAllAttributesAction" />
+ <Entry name="SetBooleanMapPropertyAction.show_icon_for_attributes" />
+ </Entry>
+ </Entry>
+ <Entry name="navigate">
+ <Entry name="navigate">
+ <Entry accelerator="control shift TAB" name="NavigationPreviousMapAction" />
+ <Entry accelerator="control TAB" name="NavigationNextMapAction" />
+ <Entry name="fold">
+ <Entry accelerator="SPACE" name="ToggleFoldedAction" />
+ <Entry name="ShowNextChildAction" accelerator="shift SPACE" />
+ <Entry accelerator="control SPACE" name="ToggleChildrenFoldedAction" />
+ <Entry accelerator="alt PAGE_DOWN" name="UnfoldOneLevelAction" />
+ <Entry accelerator="alt PAGE_UP" name="FoldOneLevelAction" />
+ <Entry accelerator="alt END" name="UnfoldAllAction" />
+ <Entry accelerator="alt HOME" name="FoldAllAction" />
+ </Entry>
+ </Entry>
+ <Entry accelerator="ESCAPE" name="MoveToRootAction" />
+ <Entry name="GotoNodeAction" />
+ <Entry accelerator="control alt LEFT" name="NextNodeAction.BACK" />
+ <Entry accelerator="control alt RIGHT" name="NextNodeAction.FORWARD" />
+ <Entry accelerator="control alt shift LEFT" name="NextNodeAction.BACK_N_FOLD" />
+ <Entry accelerator="control alt shift RIGHT" name="NextNodeAction.FORWARD_N_FOLD" />
+ <Entry name="NextPresentationItemAction" />
+ <Entry name="links">
+ <Entry accelerator="control ENTER" name="FollowLinkAction" />
+ </Entry>
+ </Entry>
+ <Entry name="filter">
+ <Entry name="UndoFilterAction" />
+ <Entry name="RedoFilterAction" />
+ <Entry name="ReapplyFilterAction" />
+ <Entry name="QuickFilterAction" />
+ <Entry name="ApplySelectedViewConditionAction" />
+ <Entry name="QuickFindAllAction" />
+ <Entry name="ApplyNoFilteringAction" />
+ <Entry name="EditFilterAction" />
+ <Entry builder="separator" />
+ <Entry name="ShowAncestorsAction" />
+ <Entry name="ShowDescendantsAction" />
+ <Entry name="ApplyToVisibleAction" />
+ <Entry builder="separator" />
+ <Entry name="QuickHighlightAction" />
+ <Entry name="QuickFindAction.BACK" />
+ <Entry name="QuickFindAction.FORWARD" />
+ </Entry>
+ <Entry name="extras">
+ <Entry name="EnterPassword" />
+ </Entry>
+ <Entry name="mindmaps">
+ <Entry name="modes" builder="navigate_modes,radio_button_group" />
+ <Entry builder="separator" />
+ <Entry name="maps" processOnPopup="true">
+ <Entry builder="navigate_maps,radio_button_group" />
+ </Entry>
+ <Entry builder="separator" />
+ </Entry>
+ <Entry name="help">
+ <Entry name="web_resources">
+ <Entry name="OpenFreeplaneSiteAction" />
+ <Entry name="AskForHelp" />
+ <Entry name="ReportBugAction" />
+ <Entry name="RequestFeatureAction" />
+ </Entry>
+ <Entry name="AboutAction"/>
+ <Entry name="GettingStartedAction" />
+ <Entry accelerator="F1" name="DocumentationAction" />
+ </Entry>
+ </Entry>
+ <Entry name="map_popup" builder="map_popup" processOnPopup="true">
+ <Entry builder="navigate_maps,radio_button_group" />
+ <Entry builder="separator" />
+ <Entry name="ToggleMenubarAction" />
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ShowFilterToolbarAction" />
+ <Entry name="ToggleScrollbarsAction" />
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="SetBooleanPropertyAction.presentation_mode" />
+ <Entry name="CenterSelectedNodeAction" />
+ <Entry name="MoveToRootAction" accelerator="ESCAPE" />
+ <Entry name="GotoNodeAction" />
+ </Entry>
+ <Entry name="node_popup" builder="node_popup">
+ <Entry name="SetShortenerStateAction" />
+ <Entry name="EnterPassword" />
+ <Entry name="CopyAction" accelerator="control C" />
+ <Entry name="CopySingleAction" accelerator="control shift C" />
+ </Entry>
+ <Entry name="main_toolbar" builder="toolbar,ignore">
+ <Entry name="main">
+ <Entry name="NavigationPreviousMapAction" />
+ <Entry name="NavigationNextMapAction" />
+ </Entry>
+ <Entry builder="main_toolbar_zoom" name="zoom" />
+ <Entry name="open">
+ <Entry name="PrintAction" />
+ <Entry name="CloseAction" />
+ </Entry>
+ <Entry name="paste">
+ <Entry name="CopyAction" />
+ </Entry>
+ <Entry name="folding">
+ <Entry name="UnfoldOneLevelAction" />
+ <Entry name="FoldOneLevelAction" />
+ <Entry name="UnfoldAllAction" />
+ <Entry name="FoldAllAction" />
+ </Entry>
+ <Entry name="url" builder="main_toolbar_url" />
+ </Entry>
+</FreeplaneUIEntries>
diff --git a/freeplane/external-resources/xml/filemodemenu.xml b/freeplane/external-resources/xml/filemodemenu.xml
new file mode 100644
index 0000000..e4f33a9
--- /dev/null
+++ b/freeplane/external-resources/xml/filemodemenu.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<FreeplaneUIEntries>
+ <Entry builder="main_menu">
+ <Entry name="file">
+ <Entry name="lastOpenedMaps">
+ <Entry builder="lastOpenedMaps" />
+ </Entry>
+ <Entry name="PageAction" />
+ <Entry name="PrintPreviewAction" />
+ <Entry accelerator="control P" name="PrintAction" />
+ <Entry accelerator="control W" name="CloseAction" />
+ <Entry accelerator="control Q" name="QuitAction" builder="MB_QuitAction" />
+ </Entry>
+ <Entry name="edit">
+ <Entry name="find">
+ <Entry accelerator="control G" name="FindAction" />
+ <Entry name="FindNextAction" accelerator="control shift G" />
+ <Entry name="FindPreviousAction" />
+ <Entry name="OpenPathAction" />
+ </Entry>
+ </Entry>
+ <Entry name="view">
+ <Entry name="toolbars">
+ <Entry name="ToggleMenubarAction" builder="MB_ToggleMenubarAction" />
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ShowFilterToolbarAction" accelerator="control F" />
+ <Entry name="ToggleScrollbarsAction" />
+ <Entry name="SetBooleanPropertyAction.presentation_mode" />
+ </Entry>
+ <Entry name="zoom">
+ <Entry accelerator="alt UP" name="ZoomInAction" />
+ <Entry accelerator="alt DOWN" name="ZoomOutAction" />
+ <Entry accelerator="alt C" name="CenterSelectedNodeAction" />
+ </Entry>
+ <Entry name="menu_viewmode">
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="ShowSelectionAsRectangleAction" />
+ </Entry>
+ </Entry>
+ <Entry name="navigate">
+ <Entry name="navigate">
+ <Entry accelerator="control shift TAB" name="NavigationPreviousMapAction" />
+ <Entry accelerator="control TAB" name="NavigationNextMapAction" />
+ <Entry name="fold">
+ <Entry accelerator="SPACE" name="ToggleFoldedAction" />
+ <Entry name="ShowNextChildAction" accelerator="shift SPACE" />
+ <Entry accelerator="control SPACE" name="ToggleChildrenFoldedAction" />
+ </Entry>
+ </Entry>
+ <Entry accelerator="ESCAPE" name="MoveToRootAction" />
+ <Entry accelerator="control alt LEFT" name="NextNodeAction.BACK" />
+ <Entry accelerator="control alt RIGHT" name="NextNodeAction.FORWARD" />
+ </Entry>
+ <Entry name="filter">
+ <Entry name="UndoFilterAction" />
+ <Entry name="RedoFilterAction" />
+ <Entry name="ReapplyFilterAction" />
+ <Entry name="QuickFilterAction" />
+ <Entry name="ApplySelectedViewConditionAction" />
+ <Entry name="QuickFindAllAction" />
+ <Entry name="ApplyNoFilteringAction" />
+ <Entry name="EditFilterAction" />
+ <Entry builder="separator" />
+ <Entry name="ShowAncestorsAction" />
+ <Entry name="ShowDescendantsAction" />
+ <Entry name="ApplyToVisibleAction" />
+ <Entry builder="separator" />
+ <Entry name="QuickHighlightAction" />
+ <Entry name="QuickFindAction.BACK" />
+ <Entry name="QuickFindAction.FORWARD" />
+ </Entry>
+ <Entry name="mindmaps">
+ <Entry name="modes" builder="navigate_modes,radio_button_group" />
+ <Entry builder="separator" />
+ <Entry name="maps" processOnPopup="true">
+ <Entry builder="navigate_maps,radio_button_group" />
+ </Entry>
+ <Entry builder="separator" />
+ </Entry>
+ <Entry name="help">
+ <Entry name="web_resources">
+ <Entry name="OpenFreeplaneSiteAction" />
+ <Entry name="AskForHelp" />
+ <Entry name="ReportBugAction" />
+ <Entry name="RequestFeatureAction" />
+ </Entry>
+ <Entry name="AboutAction" />
+ <Entry name="GettingStartedAction" />
+ <Entry accelerator="F1" name="DocumentationAction" />
+ </Entry>
+ </Entry>
+ <Entry name="map_popup" builder="map_popup" processOnPopup="true">
+ <Entry builder="navigate_maps,radio_button_group" />
+ <Entry builder="separator" />
+ <Entry name="ToggleMenubarAction" />
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ShowFilterToolbarAction" />
+ <Entry name="ToggleScrollbarsAction" />
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="CenterSelectedNodeAction" />
+ <Entry accelerator="ESCAPE" name="MoveToRootAction" />
+ </Entry>
+ <Entry name="node_popup" builder="node_popup">
+ <Entry name="CenterAction" />
+ </Entry>
+ <Entry name="main_toolbar">
+ <Entry builder="main_toolbar_update" />
+ <Entry name="NavigationPreviousMapAction" />
+ <Entry name="NavigationNextMapAction" />
+ <Entry builder="main_toolbar_zoom" name="zoom">
+ <Entry name="CenterAction" />
+ </Entry>
+ <Entry name="open">
+ <Entry name="PrintAction" />
+ <Entry name="CloseAction" />
+ </Entry>
+ </Entry>
+</FreeplaneUIEntries>
diff --git a/freeplane/external-resources/xml/mindmapmodemenu.xml b/freeplane/external-resources/xml/mindmapmodemenu.xml
new file mode 100644
index 0000000..1080c97
--- /dev/null
+++ b/freeplane/external-resources/xml/mindmapmodemenu.xml
@@ -0,0 +1,560 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<FreeplaneUIEntries>
+ <Entry name="main_toolbar" builder="toolbar,ignore">
+ <Entry builder="separator" />
+ <Entry name="history">
+ <Entry name="BackAction" />
+ <Entry name="ForwardAction" />
+ </Entry>
+ <Entry name="update" builder="main_toolbar_update" />
+ <Entry name="main">
+ <Entry name="NavigationPreviousMapAction" />
+ <Entry name="NavigationNextMapAction" />
+ </Entry>
+ <Entry name="zoom" builder="main_toolbar_zoom" />
+ <Entry name="open">
+ <Entry name="OpenAction" />
+ <Entry name="NewMapAction" />
+ <Entry name="SaveAction" />
+ <Entry name="SaveAsAction" />
+ <Entry name="PrintAction" />
+ <Entry name="PrintDirectAction" />
+ <Entry name="CloseAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="undo">
+ <Entry name="UndoAction" />
+ <Entry name="RedoAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="font">
+ <Entry name="toolbar_styles" builder="main_toolbar_style" />
+ <Entry name="toolbar_fonts" builder="main_toolbar_font_name" />
+ <Entry name="toolbar_fonts" builder="main_toolbar_font_size" />
+ <Entry name="BoldAction" />
+ <Entry name="ItalicAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry>
+ <Entry name="TextAlignAction.LEFT" />
+ <Entry name="TextAlignAction.CENTER" />
+ <Entry name="TextAlignAction.RIGHT" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="CloudAction" />
+ <Entry name="CloudColorAction" />
+ <Entry builder="separator" />
+ <Entry name="folding">
+ <Entry name="UnfoldOneLevelAction" />
+ <Entry name="FoldOneLevelAction" />
+ <Entry name="UnfoldAllAction" />
+ <Entry name="FoldAllAction" />
+ </Entry>
+ <Entry name="find">
+ <Entry name="FindAction" />
+ <Entry name="FindNextAction" />
+ <Entry name="FindPreviousAction" />
+ <Entry name="NodeListAction" />
+ </Entry>
+ <Entry name="EnterPassword" />
+ </Entry>
+ <Entry name="main_menu" builder="main_menu">
+ <Entry name="file">
+ <Entry name="NewMapAction" accelerator="control N" />
+ <Entry name="new_map_from_user_templates" />
+ <Entry name="EncryptedMap" />
+ <Entry builder="separator" />
+ <Entry name="SaveAction" accelerator="control S" />
+ <Entry name="SaveAsAction" accelerator="control shift S" />
+ <Entry name="SaveAll" />
+ <Entry name="RevertAction" />
+ <Entry builder="separator" />
+ <Entry name="OpenAction" accelerator="control O" />
+ <Entry name="OpenURLMapAction" />
+ <Entry name="lastOpenedMaps">
+ <Entry builder="lastOpenedMaps" />
+ <Entry builder="noActions" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="ExportAction" />
+ <Entry name="ExportBranchAction" accelerator="alt shift A" />
+ <Entry name="import">
+ <Entry name="ImportBranchAction" />
+ <Entry name="ImportLinkedBranchAction" />
+ <Entry name="ImportLinkedBranchWithoutRootAction" />
+ <Entry builder="separator" />
+ <Entry name="ImportExplorerFavoritesAction" />
+ <Entry name="ImportFolderStructureAction" />
+ <Entry name="ImportXmlFile" />
+ <Entry name="ImportMindmanagerFiles" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="PageAction" />
+ <Entry name="PrintPreviewAction" />
+ <Entry name="PrintAction" accelerator="control P" />
+ <Entry builder="separator" />
+ <Entry name="FilePropertiesAction" />
+ <Entry builder="separator" />
+ <Entry name="CloseAction" accelerator="control W" />
+ <Entry builder="separator" />
+ <Entry name="QuitAction" accelerator="control Q" builder="removeOnMac" />
+ </Entry>
+ <Entry name="edit">
+ <Entry name="menu_newNode">
+ <Entry name="NewChildAction" accelerator="INSERT" />
+ <Entry name="NewSiblingAction" accelerator="ENTER" />
+ <Entry name="NewPreviousSiblingAction" accelerator="shift ENTER" />
+ <Entry name="NewParentNode" accelerator="shift INSERT" />
+ <Entry name="NewFreeNodeAction" />
+ <Entry name="NewSummaryAction" accelerator="alt shift INSERT" />
+ </Entry>
+ <Entry name="CloudAction" accelerator="control shift B" />
+ <Entry name="AddConnectorAction" accelerator="control L" />
+ <Entry name="links">
+ <Entry name="SetLinkByFileChooserAction" accelerator="control shift K" />
+ <Entry name="SetLinkByTextFieldAction" accelerator="control K" />
+ <Entry name="ExtractLinkFromTextAction" />
+ <Entry builder="separator" />
+ <Entry name="AddLocalLinkAction" accelerator="alt shift L" />
+ <Entry name="AddMenuItemLinkAction" />
+ <Entry name="AddExecutionLinkAction" />
+ <Entry builder="separator" />
+ <Entry name="SetLinkAnchorAction" />
+ <Entry name="MakeLinkFromAnchorAction" />
+ <Entry name="MakeLinkToAnchorAction" />
+ <Entry name="ClearLinkAnchorAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="DeleteAction" accelerator="DELETE" />
+ <Entry builder="separator" />
+ <Entry name="menu_title">
+ <Entry name="EditAction" accelerator="F2" />
+ <Entry name="SetBooleanPropertyAction.edit_on_double_click" />
+ <Entry name="EditLongAction" accelerator="alt ENTER" />
+ <Entry name="SplitNode" accelerator="alt S" />
+ <Entry builder="splitToWordsActions" />
+ <Entry builder="joinNodesActions" accelerator="control J" />
+ <Entry name="RevisionPluginAction" />
+ <Entry builder="separator" />
+ <Entry name="SetImageByFileChooserAction" accelerator="alt shift K" />
+ </Entry>
+ <Entry name="icons">
+ <Entry name="IconSelectionPlugin" accelerator="control F2" />
+ <Entry name="icons">
+ <Entry builder="icon_actions" />
+ </Entry>
+ <Entry name="progress">
+ <Entry name="IconProgressIconUpAction" accelerator="alt LESS" />
+ <Entry name="IconProgressIconDownAction" accelerator="alt shift LESS" />
+ <Entry builder="separator" />
+ <Entry name="IconProgressExtended10Action" />
+ <Entry name="IconProgressExtended25Action" />
+ <Entry builder="separator" />
+ <Entry name="IconProgressRemoveAction" />
+ </Entry>
+ <Entry name="HierarchicalIconsAction" />
+ <Entry name="HierarchicalIcons2Action" />
+ <Entry name="menu_remove_icons">
+ <Entry name="RemoveIcon_0_Action" />
+ <Entry name="RemoveIconAction" />
+ <Entry name="RemoveAllIconsAction" />
+ </Entry>
+ </Entry>
+ <Entry name="menu_extensions">
+ <Entry name="EditDetailsAction" accelerator="F3" />
+ <Entry name="EditDetailsInDialogAction" accelerator="control F3" />
+ <Entry name="CopyStyleExtensionsAction" />
+ <Entry name="DeleteDetailsAction" />
+ <Entry builder="separator" />
+ <Entry name="ExternalImageAddAction" />
+ <Entry name="ExternalImageChangeAction" />
+ <Entry name="ExternalImageRemoveAction" />
+ <Entry builder="separator" />
+ <Entry name="EditAttributesAction" accelerator="alt F9" />
+ <Entry name="attributes_AddAttributeAction" />
+ <Entry name="AssignAttributesAction" />
+ <Entry name="CopyAttributes" />
+ <Entry name="PasteAttributes" />
+ <Entry name="AddStyleAttributes" />
+ <Entry name="menu_removeAttribute">
+ <Entry name="attributes_RemoveFirstAttributeAction" />
+ <Entry name="attributes_RemoveLastAttributeAction" />
+ <Entry name="attributes_RemoveAllAttributesAction" />
+ </Entry>
+ <Entry name="ShowAttributeDialogAction" />
+ <Entry builder="separator" />
+ <Entry name="LatexInsertLatexAction" plugin="org.freeplane.plugin.latex" />
+ <Entry name="LatexEditLatexAction" plugin="org.freeplane.plugin.latex" />
+ <Entry name="LatexDeleteLatexAction" plugin="org.freeplane.plugin.latex" />
+ <Entry builder="separator" />
+ <Entry name="OpenMapsAddLocation" plugin="org.freeplane.plugin.openmaps" />
+ <Entry name="OpenMapsRemoveLocation" plugin="org.freeplane.plugin.openmaps" />
+ <Entry name="OpenMapsViewLocation" plugin="org.freeplane.plugin.openmaps" />
+ </Entry>
+ <Entry name="notes">
+ <Entry name="SelectNoteAction" accelerator="control LESS" />
+ <Entry name="EditNoteInDialogAction" />
+ <Entry name="RemoveNoteAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="UndoAction" accelerator="control Z" />
+ <Entry name="RedoAction" accelerator="control Y" />
+ <Entry name="CutAction" accelerator="control X" />
+ <Entry name="menu_copy">
+ <Entry name="CopyAction" accelerator="control C" />
+ <Entry name="CopySingleAction" accelerator="control shift C" />
+ <Entry name="CopyIDAction" />
+ <Entry name="CopyNodeURIAction" />
+ </Entry>
+ <Entry name="PasteAction" accelerator="control V" />
+ <Entry name="SelectedPasteAction" accelerator="control shift V"/>
+ <Entry name="MoveAction" />
+ <Entry name="CloneAction" accelerator="control D"/>
+ <Entry name="ConvertCloneToIndependentNodeAction"/>
+ <Entry builder="separator" />
+ <Entry name="menu_moveNode">
+ <Entry name="NodeUpAction" accelerator="control UP" />
+ <Entry name="NodeDownAction" accelerator="control DOWN" />
+ <Entry name="SortNodes" />
+ <Entry name="ChangeNodeLevelLeftsAction" accelerator="control LEFT" />
+ <Entry name="ChangeNodeLevelRightsAction" accelerator="control RIGHT" />
+ </Entry>
+ <Entry name="FreeNodeAction" />
+ <Entry name="ResetNodeLocationAction" accelerator="control R" />
+ <Entry builder="separator" />
+ <Entry name="find">
+ <Entry name="FindAction" accelerator="control G" />
+ <Entry name="FindNextAction" accelerator="control shift G" />
+ <Entry name="FindPreviousAction" />
+ <Entry name="NodeListAction" accelerator="control shift F" />
+ <Entry name="AllMapsNodeListAction" />
+ </Entry>
+ </Entry>
+ <Entry name="view">
+ <Entry name="NewMapViewAction" />
+ <Entry name="toolbars">
+ <Entry name="ToggleMenubarAction" builder="removeOnMac" />
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ShowFilterToolbarAction" accelerator="control F" />
+ <Entry name="ToggleFBarAction" />
+ <Entry name="ToggleLeftToolbarAction" />
+ <Entry name="ToggleStatusAction" />
+ <Entry name="ToggleScrollbarsAction" />
+ <Entry name="ShowFormatPanel" accelerator="alt P" />
+ </Entry>
+ <Entry name="zoom">
+ <Entry name="ZoomInAction" accelerator="alt UP" />
+ <Entry name="ZoomOutAction" accelerator="alt DOWN" />
+ <Entry name="FitToPage" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="menu_viewmode">
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="ToggleFullScreenAction" accelerator="F11" />
+ <Entry name="SetBooleanPropertyAction.presentation_mode" />
+ <Entry name="ShowSelectionAsRectangleAction" />
+ <Entry name="SetBooleanPropertyAction.highlight_formulas" />
+ <Entry name="CenterSelectedNodeAction" accelerator="alt C" />
+ <Entry name="SetBooleanPropertyAction.center_selected_node" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="SetShortenerStateAction" accelerator="alt F3" />
+ <Entry name="ToggleDetailsAction" accelerator="alt F2" />
+ <Entry name="menu_hoverView">
+ <Entry name="SetBooleanPropertyAction.show_node_tooltips" />
+ <Entry name="SetBooleanPropertyAction.show_styles_in_tooltip" />
+ <Entry name="CreationModificationPluginAction" />
+ </Entry>
+ <Entry name="menu_displayAttributes">
+ <Entry builder="radio_button_group">
+ <Entry name="ShowSelectedAttributesAction" />
+ <Entry name="ShowAllAttributesAction" />
+ <Entry name="HideAllAttributesAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="SetBooleanMapPropertyAction.show_icon_for_attributes" />
+ </Entry>
+ <Entry name="menu_noteView">
+ <Entry name="ShowHideNoteAction" accelerator="control GREATER" />
+ <Entry builder="radio_button_group" name="note_window_location">
+ <Entry name="SetNoteWindowPosition.top" />
+ <Entry name="SetNoteWindowPosition.left" />
+ <Entry name="SetNoteWindowPosition.right" />
+ <Entry name="SetNoteWindowPosition.bottom" />
+ </Entry>
+ <Entry name="SetBooleanMapPropertyAction.show_note_icons" />
+ <Entry name="ShowNotesInMapAction" />
+ </Entry>
+ </Entry>
+ <Entry name="format">
+ <Entry name="styleActions" textKey="menu_applyStyle">
+ <Entry builder="style_actions" />
+ </Entry>
+ <Entry name="automatic_layout">
+ <Entry name="AutomaticLayoutControllerAction.HEADINGS" />
+ <Entry name="AutomaticLayoutControllerAction.ALL" />
+ <Entry name="AutomaticLayoutControllerAction.null" />
+ </Entry>
+ <Entry name="menu_manageStyles">
+ <Entry name="NewUserStyleAction" />
+ <Entry name="RedefineStyleAction" accelerator="alt R" />
+ <Entry name="RemoveFormatAction" />
+ <Entry name="ManageConditionalStylesAction" />
+ <Entry name="ManageNodeConditionalStylesAction" />
+ <Entry builder="separator" />
+ <Entry name="CopyMapStylesAction" accelerator="control shift O" />
+ <Entry name="EditStylesAction" accelerator="control F11" />
+ </Entry>
+ <Entry name="FormatCopy" accelerator="alt shift C" />
+ <Entry name="FormatPaste" accelerator="alt shift V" />
+ <Entry name="SetBooleanPropertyAction.copyFormatToNewSibling" />
+ <Entry builder="separator" />
+ <Entry name="map_background">
+ <Entry name="MapBackgroundImageAction" />
+ <Entry name="SetBooleanMapPropertyAction.fit_to_viewport" />
+ <Entry name="MapBackgroundColorAction" />
+ <Entry name="MapBackgroundClearAction" />
+ </Entry>
+ <Entry name="menu_coreFormat">
+ <Entry name="BoldAction" accelerator="control B" />
+ <Entry name="ItalicAction" accelerator="control I" />
+ <Entry name="IncreaseNodeFontAction" accelerator="control PLUS" />
+ <Entry name="DecreaseNodeFontAction" accelerator="control MINUS" />
+ <Entry builder="separator" />
+ <Entry name="TextAlignAction.LEFT" />
+ <Entry name="TextAlignAction.CENTER" />
+ <Entry name="TextAlignAction.RIGHT" />
+ <Entry builder="separator" />
+ <Entry name="NodeColorAction" accelerator="alt shift F" />
+ <Entry name="BlinkingNodeHookAction" />
+ <Entry name="NodeColorBlendAction" />
+ <Entry builder="separator" />
+ <Entry name="NodeBackgroundColorAction" accelerator="alt B" />
+ <Entry builder="separator" />
+ <Entry name="NodeShapeAction.fork" />
+ <Entry name="NodeShapeAction.bubble" />
+ <Entry builder="separator" />
+ <Entry name="UsePlainTextAction" accelerator="alt shift P" />
+ </Entry>
+ <Entry name="cloud_shapes">
+ <Entry builder="radio_button_group">
+ <Entry name="CloudShapeAction.ARC" />
+ <Entry name="CloudShapeAction.STAR" />
+ <Entry name="CloudShapeAction.RECT" />
+ <Entry name="CloudShapeAction.ROUND_RECT" />
+ </Entry>
+ <Entry name="CloudColorAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="EdgeProperties">
+ <Entry builder="radio_button_group" name="edgeStyles" textKey="styles">
+ <Entry name="EdgeStyleAsParentAction" />
+ <Entry name="EdgeStyleAction.linear" />
+ <Entry name="EdgeStyleAction.bezier" />
+ <Entry name="EdgeStyleAction.sharp_linear" />
+ <Entry name="EdgeStyleAction.sharp_bezier" />
+ <Entry name="EdgeStyleAction.horizontal" />
+ <Entry name="EdgeStyleAction.hide_edge" />
+ </Entry>
+ <Entry builder="radio_button_group" name="edge_widths">
+ <Entry name="EdgeWidthAction_width_parent" />
+ <Entry name="EdgeWidthAction_width_thin" />
+ <Entry name="EdgeWidthAction_1" />
+ <Entry name="EdgeWidthAction_2" />
+ <Entry name="EdgeWidthAction_4" />
+ <Entry name="EdgeWidthAction_8" />
+ </Entry>
+ <Entry name="EdgeColorAction" accelerator="alt shift E" />
+ </Entry>
+ <Entry builder="separator" />
+ </Entry>
+ <Entry name="navigate" builder="menu_navigate">
+ <Entry name="NavigationPreviousMapAction" accelerator="control shift TAB" />
+ <Entry name="NavigationNextMapAction" accelerator="control TAB" />
+ <Entry name="fold">
+ <Entry name="ToggleFoldedAction" accelerator="SPACE" />
+ <Entry name="ShowNextChildAction" accelerator="shift SPACE" />
+ <Entry name="ToggleChildrenFoldedAction" accelerator="control SPACE" />
+ <Entry name="UnfoldOneLevelAction" accelerator="alt PAGE_DOWN" />
+ <Entry name="FoldOneLevelAction" accelerator="alt PAGE_UP" />
+ <Entry name="UnfoldAllAction" accelerator="alt END" />
+ <Entry name="FoldAllAction" accelerator="alt HOME" />
+ <Entry builder="separator" />
+ <Entry name="SetAlwaysUnfoldedNodeFlagsAction" />
+ <Entry name="RemoveAllAlwaysUnfoldedNodeFlagsAction" />
+ <Entry name="AlwaysUnfoldedNodeAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="SelectAllAction" accelerator="control A" />
+ <Entry name="SelectBranchAction" accelerator="control shift A" />
+ <Entry builder="separator" />
+ <Entry name="MoveToRootAction" accelerator="ESCAPE" />
+ <Entry name="GotoNodeAction" />
+ <Entry name="NextNodeAction.BACK" accelerator="control alt LEFT" />
+ <Entry name="NextNodeAction.FORWARD" accelerator="control alt RIGHT" />
+ <Entry name="NextNodeAction.BACK_N_FOLD" accelerator="control shift LEFT" />
+ <Entry name="NextNodeAction.FORWARD_N_FOLD" accelerator="control shift RIGHT" />
+ <Entry name="NextPresentationItemAction" accelerator="control shift SPACE" />
+ <Entry name="BackAction" accelerator="alt LEFT" />
+ <Entry name="ForwardAction" accelerator="alt RIGHT" />
+ <Entry name="links">
+ <Entry builder="separator" />
+ <Entry name="FollowLinkAction" accelerator="control ENTER" />
+ <Entry builder="menu_goto_links" />
+ </Entry>
+ </Entry>
+ <Entry name="filter">
+ <Entry name="filterConditions">
+ <Entry builder="filterConditions" />
+ <Entry builder="noActions" />
+ </Entry>
+ <Entry name="UndoFilterAction" />
+ <Entry name="RedoFilterAction" />
+ <Entry name="ReapplyFilterAction" />
+ <Entry builder="separator" />
+ <Entry name="QuickFilterAction" />
+ <Entry name="ApplySelectedViewConditionAction" />
+ <Entry name="QuickFindAllAction" />
+ <Entry name="ApplyNoFilteringAction" />
+ <Entry name="EditFilterAction" />
+ <Entry builder="separator" />
+ <Entry name="ApplyToVisibleAction" />
+ <Entry name="ShowAncestorsAction" />
+ <Entry name="ShowDescendantsAction" />
+ <Entry builder="separator" />
+ <Entry name="QuickHighlightAction" />
+ <Entry name="QuickFindAction.BACK" />
+ <Entry name="QuickFindAction.FORWARD" />
+ </Entry>
+ <Entry name="extras">
+ <Entry name="TimeManagementAction" accelerator="control T" />
+ <Entry name="TimeListAction" />
+ <Entry name="ReminderHookAction" />
+ <Entry builder="separator" />
+ <Entry name="EnterPassword" />
+ <Entry name="RemoveEncryption" />
+ <Entry builder="separator" />
+ <Entry name="ManageAddOnsAction" plugin="org.freeplane.plugin.script" />
+ <Entry name="scripting" plugin="org.freeplane.plugin.script" builder="userScripts" />
+ <Entry name="ExecuteScriptForSelectionAction" />
+ <Entry name="ExecuteScriptForAllNodes" />
+ <Entry name="ScriptEditor" />
+ <Entry name="formula.EvaluateAllAction" plugin="org.freeplane.plugin.formula" />
+ <Entry builder="separator" />
+ <Entry name="SetAcceleratorOnNextClickAction" />
+ <Entry name="acceleratorPresets">
+ <Entry name="load_accelerator_presets">
+ <Entry builder="acceleratorPresets" />
+ <Entry builder="noActions" />
+ </Entry>
+ <Entry name="SaveAcceleratorPresetsAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="OpenUserDirAction" />
+ <Entry builder="separator" />
+ <Entry name="PropertyAction" accelerator="control COMMA" builder="removeOnMac"/>
+ </Entry>
+ <Entry name="mindmaps">
+ <Entry name="modes" builder="navigate_modes,radio_button_group" />
+ <Entry builder="separator" />
+ <Entry name="maps" processOnPopup="true">
+ <Entry builder="navigate_maps,radio_button_group" />
+ </Entry>
+ <Entry builder="separator" />
+ </Entry>
+ <Entry name="help">
+ <Entry name="UpdateCheckAction" />
+ <Entry builder="separator" />
+ <Entry name="web_resources">
+ <Entry name="OpenFreeplaneSiteAction" />
+ <Entry name="WebDocuAction" />
+ <Entry name="AskForHelp" />
+ <Entry name="ReportBugAction" />
+ <Entry name="RequestFeatureAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="AboutAction" builder="removeOnMac"/>
+ <Entry builder="separator" />
+ <Entry name="GettingStartedAction" accelerator="F1" />
+ <Entry name="WhatsNewAction" />
+ <Entry name="DocumentationAction" />
+ <Entry name="OnlineReference" />
+ <Entry name="HotKeyInfoAction" />
+ <Entry builder="separator" />
+ </Entry>
+ </Entry>
+ <Entry name="map_popup" builder="map_popup" processOnPopup="true">
+ <Entry builder="navigate_maps,radio_button_group"/>
+ <Entry builder="separator" />
+ <Entry name="ToggleFullScreenAction" />
+ <Entry name="ToggleMenubarAction" builder="removeOnMac"/>
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ShowFilterToolbarAction" />
+ <Entry name="ToggleFBarAction" />
+ <Entry name="ToggleLeftToolbarAction" />
+ <Entry name="ToggleStatusAction" />
+ <Entry name="ToggleScrollbarsAction" />
+ <Entry builder="separator" />
+ <Entry name="ShowFormatPanel" />
+ <Entry name="ShowHideNoteAction" accelerator="control GREATER" />
+ <Entry builder="separator" />
+ <Entry name="MapBackgroundColorAction" />
+ <Entry builder="separator" />
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="FitToPage" />
+ <Entry name="CenterSelectedNodeAction" />
+ <Entry name="MoveToRootAction" accelerator="ESCAPE" />
+ <Entry name="GotoNodeAction" />
+ </Entry>
+ <Entry name="node_popup" builder="node_popup">
+ <Entry name="EditLongAction" accelerator="alt ENTER" />
+ <Entry name="EditDetailsInDialogAction" accelerator="control F3" />
+ <Entry name="EditDetailsAction" accelerator="F3" />
+ <Entry name="DeleteDetailsAction" />
+ <Entry name="SetShortenerStateAction" />
+ <Entry name="EditNoteInDialogAction" />
+ <Entry name="ExternalImageAddAction" />
+ <Entry name="EditAttributesAction" accelerator="alt F9" />
+ <Entry builder="separator" />
+ <Entry name="NewSummaryAction" accelerator="alt shift INSERT" />
+ <Entry name="AlwaysUnfoldedNodeAction" />
+ <Entry name="FreeNodeAction" />
+ <Entry name="CloudAction" accelerator="control shift B" />
+ <Entry name="styleActions" textKey="menu_applyStyle">
+ <Entry builder="style_actions" />
+ </Entry>
+ <Entry name="AddConnectorAction" accelerator="control L" />
+ <Entry name="links" builder="popup_navigate">
+ <Entry name="SetLinkByFileChooserAction" accelerator="control shift K" />
+ <Entry name="SetLinkByTextFieldAction" accelerator="control K" />
+ <Entry name="ExtractLinkFromTextAction" />
+ <Entry builder="separator" />
+ <Entry name="AddLocalLinkAction" accelerator="alt shift L" />
+ <Entry name="AddMenuItemLinkAction" />
+ <Entry builder="separator" />
+ <Entry name="SetLinkAnchorAction" />
+ <Entry name="MakeLinkFromAnchorAction" />
+ <Entry name="MakeLinkToAnchorAction" />
+ <Entry name="ClearLinkAnchorAction" />
+ </Entry>
+ <Entry name="goto" processOnPopup="true">
+ <Entry builder="link_actions" />
+ <Entry builder="clone_actions" />
+ <Entry builder="noActions" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="EnterPassword" />
+ <Entry name="node_popup_scripting" plugin="org.freeplane.plugin.script"
+ builder="userScripts" />
+ <Entry builder="separator" />
+ <Entry name="CutAction" accelerator="control X" />
+ <Entry name="CopyAction" accelerator="control C" />
+ <Entry name="CopySingleAction" accelerator="control shift C" />
+ <Entry name="CopyIDAction" />
+ <Entry name="CopyNodeURIAction" />
+ <Entry name="PasteAction" accelerator="control V" />
+ <Entry name="SortNodes" />
+ <Entry name="UndoAction" />
+ <Entry name="RedoAction" />
+ </Entry>
+</FreeplaneUIEntries>
diff --git a/freeplane/external-resources/xml/preferences.xml b/freeplane/external-resources/xml/preferences.xml
new file mode 100644
index 0000000..df0d95a
--- /dev/null
+++ b/freeplane/external-resources/xml/preferences.xml
@@ -0,0 +1,286 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<preferences_structure xmlns="http://freeplane.sf.net/ui/preferences/1.0">
+ <tabbed_pane>
+ <tab name="Environment">
+ <separator name="single_instance_mode">
+ <boolean name="single_instance" />
+ <boolean name="single_instance_force" />
+ </separator>
+ <separator name="language">
+ <languages name="language" />
+ </separator>
+ <separator name="files">
+ <number name="last_opened_list_length" min="1" max="50" />
+ <boolean name="load_last_map" />
+ <boolean name="load_last_maps" />
+ <boolean name="always_load_last_maps" />
+ <boolean name="experimental_file_locking_on" />
+ </separator>
+ <separator name="load">
+ <combo name="load_folding">
+ <choice value="always_fold_all_after_load" />
+ <choice value="load_folding_from_map_default_fold_all" />
+ <choice value="always_show_less_than_N_nodes_after_load" />
+ <choice value="show_less_than_N_nodes_by_default_after_load" />
+ <choice value="load_folding_from_map_default_unfold_all" />
+ <choice value="always_unfold_all_after_load" />
+ </combo>
+ <number name="max_displayed_node_count" min="1" />
+ </separator>
+ <separator name="save">
+ <combo name="save_folding">
+ <choice value="never_save_folding" />
+ <choice value="save_folding_if_map_is_changed" />
+ <choice value="always_save_folding" />
+ </combo>
+ <boolean name="save_modification_times" />
+ <boolean name="save_last_visited_node" />
+ <path name="default_save_dir" dir="true"/>
+ </separator>
+ <separator name="automatic_save">
+ <time_period name="time_for_automatic_save" />
+ <boolean name="single_backup_directory" />
+ <path name="single_backup_directory_path" dir="true" />
+ <boolean name="delete_automatic_saves_at_exit" />
+ <number name="number_of_different_files_for_automatic_save"
+ min="0" max="25" />
+ <number name="backup_file_number" min="0" max="25" />
+ </separator>
+ <separator name="export">
+ <number name="exported_image_resolution_dpi" min="72" max="2400" />
+ <boolean name="indentationUsesTabsInTextOutput" />
+ </separator>
+ <separator name="hyperlink_types">
+ <combo name="links">
+ <choice value="relative" />
+ <choice value="absolute" />
+ </combo>
+ </separator>
+ <separator name="cache">
+ <combo name="image_cache">
+ <choice value="ic_disable" />
+ <choice value="ic_file" />
+ <choice value="ic_ram" />
+ </combo>
+ </separator>
+ <separator name="updates">
+ <boolean name="check_updates_automatically" />
+ </separator>
+ <separator name="org.freeplane.plugin.bugreport">
+ <combo name="org.freeplane.plugin.bugreport">
+ <choice value="org.freeplane.plugin.bugreport.allowed" />
+ <choice value="org.freeplane.plugin.bugreport.denied" />
+ <choice value="org.freeplane.plugin.bugreport.ask" />
+ </combo>
+ <string name="org.freeplane.plugin.bugreport.userid" />
+ </separator>
+ </tab>
+ <tab name="Appearance">
+ <separator name="look_and_feel">
+ <group name="lookandfeel" />
+ <boolean name="apply_system_screen_resolution" />
+ <number name="user_defined_screen_resolution" min="72" max="1200" />
+ <boolean name="resources_use_default_font_for_notes_too" />
+ <boolean name="resources_use_margin_top_zero_for_notes" />
+ <number name="max_menu_item_count" min="10" />
+ </separator>
+ <separator name="status">
+ <boolean name="display_node_id" />
+ </separator>
+ <separator name="default_colors">
+ <color name="revision_color" />
+ <boolean name="printonwhitebackground" />
+ <color name="standardcloudcolor" />
+ <number name="presentation_dimmer_transparency" min="0" max="255" />
+ </separator>
+ <separator name="selection_colors">
+ <boolean name="standarddrawrectangleforselection" />
+ <color name="standardselectednoderectanglecolor" />
+ <color name="standardselectednodecolor" />
+ </separator>
+ <separator name="root_node_appearance">
+ <boolean name="use_common_out_point_for_root_node" />
+ </separator>
+ <separator name="anti_alias">
+ <combo name="antialias">
+ <choice value="antialias_edges" />
+ <choice value="antialias_all" />
+ <choice value="antialias_none" />
+ </combo>
+ </separator>
+ <separator name="size_limits">
+ <number name="max_shortened_text_length" />
+ <number name="max_image_width" />
+ <number name="foldingsymbolwidth" />
+ <number name="statesymbolwidth" />
+ <number name="toolTipManager.max_tooltip_width" />
+ <number name="toolTipManager.max_tooltip_height" />
+ <length name="default_attribute_key_column_width" defaultUnit = "px" min="0" max = "1000" step = "0.1" />
+ <length name="default_attribute_value_column_width" defaultUnit = "px" min="0" max = "1000" step = "0.1" />
+
+ </separator>
+ <separator name="connectors">
+ <color name="standardlinkcolor" />
+ <number name="connector_alpha" text="edit_transparency_label"
+ min="20" max="255" />
+ <combo name="connector_shape" text="connector_shapes">
+ <choice value="LINE" text="ChangeConnectorShapeAction.LINE.text" />
+ <choice value="LINEAR_PATH" text="ChangeConnectorShapeAction.LINEAR_PATH.text" />
+ <choice value="CUBIC_CURVE" text="ChangeConnectorShapeAction.CUBIC_CURVE.text" />
+ <choice value="EDGE_LIKE" text="ChangeConnectorShapeAction.EDGE_LIKE.text" />
+ </combo>
+ <number name="connector_width" text="edit_width_label" min="1"
+ max="32" />
+ <font name="label_font_family" />
+ <number name="label_font_size" min="4" max="216" />
+ <boolean name="paint_connectors_behind" />
+ </separator>
+ <separator name="edit_long_node_window">
+ <boolean name="el__buttons_above" />
+ <boolean name="el__position_window_below_node" />
+ <number name="el__min_default_window_height" />
+ <number name="el__max_default_window_height" />
+ <number name="el__min_default_window_width" />
+ <number name="el__max_default_window_width" />
+ </separator>
+ <separator name="outline_view">
+ <length defaultUnit = "px" name="outline_vgap" min="0" max = "1000" step = "0.1"/>
+ <length defaultUnit = "px" name="outline_hgap" min="0" max = "1000" step = "0.1" />
+ </separator>
+ <separator name="icon_properties">
+ <boolean name="structured_icon_toolbar" />
+ </separator>
+ </tab>
+ <tab name="Keystrokes"
+ layout="right:max(40dlu;p), 4dlu, 80dlu, 7dlu,right:max(40dlu;p), 4dlu, 80dlu, 7dlu">
+ <separator name="commands_for_the_program" />
+ <text name="use_ctrl_key" />
+ <separator name="icons" />
+ </tab>
+ <tab name="Behaviour">
+ <separator name="behaviour">
+ <combo name="placenewbranches">
+ <choice value="first" />
+ <choice value="last" />
+ </combo>
+ <boolean name="unfold_on_paste" />
+ <boolean name="fold_on_click_inside" />
+ <boolean name="disable_cursor_move_paper" />
+ <boolean name="edit_on_double_click" />
+ <length name="grid_size" defaultUnit = "px" min="0" max = "1000" step = "0.01"/>
+ <number name="scrolling_speed" min="1" max="30" />
+ <boolean name="goto_note_end_on_edit" />
+ <combo name="key_type_action">
+ <choice value="EDIT_CURRENT" />
+ <choice value="IGNORE" />
+ <choice value="ADD_SIBLING" />
+ <choice value="ADD_CHILD" />
+ </combo>
+ <boolean name="copyFormatToNewSibling"/>
+ <boolean name="copyFormatToNewSiblingIncludesIcons"/>
+ <boolean name="scrollOnUnfold"/>
+ <boolean name="shouldCenterSmallMaps"/>
+ </separator>
+ <separator name="reminderOptions">
+ <boolean name="remindersBlink" />
+ <boolean name="remindersShowNotifications" />
+ <time_period name="remindersStandardDelay" />
+ </separator>
+ <separator name="SplitToWordsAction">
+ <string name="SplitToWordsAction.auxiliaryWordList"/>
+ <string name="SplitToWordsAction.charactersAcceptedInWord"/>
+ <string name="SplitToWordsAction.nodeNumbersInLine"/>
+ <boolean name="SplitToWordsAction.leaveOriginalNodeEmpty"/>
+ <boolean name="SplitToWordsAction.saveOriginalTextAsDetails"/>
+ </separator>
+ <separator name="JoinNodesAction">
+ <string name="JoinNodesAction.textSeparators"/>
+ </separator>
+ <separator name="data_formats">
+ <boolean name="parse_data" />
+ <string name="number_format" />
+ <string name="date_format" />
+ <string name="datetime_format" />
+ <languages name="format_locale" />
+ <boolean name="parse_formulas"/>
+ <boolean name="parse_latex"/>
+ </separator>
+ <separator name="search">
+ <boolean name="compare_as_number" />
+ <number name="approximate_search_threshold" min="0.1" max="1.0"
+ step="0.05" />
+ </separator>
+ <separator name="inline_editor">
+ <boolean name="display_inline_editor_for_all_new_nodes" />
+ <boolean name="layout_map_on_text_change" />
+ <boolean name="el__enter_confirms_by_default" />
+ <number name="editor_extra_width" min="0" max="1000" step="40" />
+ </separator>
+ <separator name="spelling">
+ <boolean name="spelling_opt_case_sensitive" />
+ <boolean name="spelling_opt_ignore_all_caps_words" />
+ <boolean name="spelling_opt_ignore_capitalization" />
+ <boolean name="spelling_opt_ignore_words_with_numbers" />
+ <number name="spelling_opt_suggestions_limit_dialog" min="0" />
+ <number name="spelling_opt_suggestions_limit_menu" min="0" />
+ </separator>
+ <separator name="notifications">
+ <remind_value name="remind_use_rich_text_in_new_nodes" />
+ <boolean name="delete_nodes_without_question" />
+ <boolean name="cut_nodes_without_question" />
+ <boolean name="remove_notes_without_question" />
+ </separator>
+ <separator name="selection_method">
+ <combo name="selection_method">
+ <choice value="selection_method_direct" />
+ <choice value="selection_method_delayed" />
+ <choice value="selection_method_by_click" />
+ </combo>
+ <number name="time_for_delayed_selection" />
+ <boolean name="center_selected_node" />
+ <boolean name="slow_scroll_selected_node" />
+ </separator>
+ <separator name="mouse_wheel">
+ <number name="wheel_velocity" />
+ </separator>
+ <separator name="scrollbar">
+ <number name="scrollbar_increment" />
+ </separator>
+ <separator name="tooltip">
+ <boolean name="show_node_tooltips" />
+ <number name="toolTipManager.initialDelay" min="0" />
+ <boolean name="show_styles_in_tooltip" />
+ </separator>
+ <separator name="undo">
+ <number name="undo_levels" />
+ </separator>
+ <separator name="RichTextEditor">
+ <combo name="simplyhtml.default_paste_mode">
+ <choice value="PASTE_HTML" />
+ <choice value="PASTE_PLAIN_TEXT" />
+ </combo>
+ </separator>
+ </tab>
+ <tab name="HTML">
+ <separator name="browser">
+ <string name="default_browser_command_windows_nt" />
+ <string name="default_browser_command_windows_9x" />
+ <string name="default_browser_command_other_os" />
+ <string name="default_browser_command_mac" />
+ </separator>
+ <separator name="html_export">
+ <combo name="html_export_folding">
+ <choice value="html_export_no_folding" />
+ <choice value="html_export_fold_currently_folded" />
+ <choice value="html_export_fold_all" />
+ <choice value="html_export_based_on_headings" />
+ </combo>
+ <boolean name="export_icons_in_html" />
+ </separator>
+ <separator name="html_import">
+ <boolean name="structured_html_import" />
+ </separator>
+ </tab>
+ <tab name="plugins" />
+ </tabbed_pane>
+</preferences_structure>
diff --git a/freeplane/external-resources/xml/stylemodemenu.xml b/freeplane/external-resources/xml/stylemodemenu.xml
new file mode 100644
index 0000000..1bc7d2f
--- /dev/null
+++ b/freeplane/external-resources/xml/stylemodemenu.xml
@@ -0,0 +1,174 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<FreeplaneUIEntries>
+ <Entry builder="main_menu">
+ <Entry name="file">
+ <Entry name="styledialog.ok" accelerator="control ENTER" />
+ <Entry name="styledialog.cancel" accelerator="ESCAPE" />
+ </Entry>
+ <Entry name="edit">
+ <Entry name="menu_group">
+ <Entry accelerator="control shift B" name="CloudAction" />
+ </Entry>
+ <Entry name="icons">
+ <Entry name="icons">
+ <Entry builder="icon_actions" />
+ </Entry>
+ <Entry name="menu_remove_icons">
+ <Entry name="RemoveIcon_0_Action" />
+ <Entry name="RemoveIconAction" />
+ <Entry name="RemoveAllIconsAction" />
+ </Entry>
+ </Entry>
+ <Entry name="menu_extensions">
+ <Entry name="EditDetailsAction" />
+ <Entry name="EditDetailsInDialogAction" />
+ <Entry name="DeleteDetailsAction" />
+ <Entry accelerator="alt F9" name="EditAttributesAction" />
+ <Entry name="CopyAttributes" />
+ <Entry name="PasteAttributes" />
+ </Entry>
+ <Entry name="notes">
+ <Entry name="EditNoteInDialogAction" />
+ <Entry name="RemoveNoteAction" />
+ </Entry>
+ <Entry accelerator="control Z" name="UndoAction" />
+ <Entry accelerator="control Y" name="RedoAction" />
+ <Entry name="menu_moveNode">
+ <Entry accelerator="control UP" name="NodeUpAction" />
+ <Entry accelerator="control DOWN" name="NodeDownAction" />
+ </Entry>
+ <Entry name="find">
+ <Entry accelerator="control G" name="FindAction" />
+ <Entry name="FindNextAction" accelerator="control shift G" />
+ <Entry name="FindPreviousAction" />
+ </Entry>
+ </Entry>
+ <Entry name="view">
+ <Entry name="toolbars">
+ <Entry name="ToggleMenubarAction" builder="MB_ToggleMenubarAction" />
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ToggleLeftToolbarAction" />
+ </Entry>
+ <Entry name="zoom">
+ <Entry accelerator="alt UP" name="ZoomInAction" />
+ <Entry accelerator="alt DOWN" name="ZoomOutAction" />
+ </Entry>
+ <Entry name="menu_viewmode">
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="ShowSelectionAsRectangleAction" />
+ </Entry>
+ <Entry name="menu_hoverView">
+ <Entry accelerator="alt F2" name="ToggleDetailsAction" />
+ </Entry>
+ <Entry builder="radio_button_group" name="menu_displayAttributes">
+ <Entry name="ShowSelectedAttributesAction" />
+ <Entry name="ShowAllAttributesAction" />
+ <Entry name="HideAllAttributesAction" />
+ </Entry>
+ </Entry>
+ <Entry name="format">
+ <Entry name="menu_manageStyles">
+ <Entry accelerator="" name="DeleteUserStyleAction" />
+ <Entry name="NewLevelStyleAction" accelerator="control shift N" />
+ <Entry name="DeleteLevelStyleAction" />
+ <Entry name="NewUserStyleAction" />
+ <Entry name="ManageNodeConditionalStylesAction" />
+ </Entry>
+ <Entry accelerator="alt shift C" name="FormatCopy" />
+ <Entry accelerator="alt shift V" name="FormatPaste" />
+ <Entry name="menu_coreFormat">
+ <Entry accelerator="control B" name="BoldAction" />
+ <Entry accelerator="control I" name="ItalicAction" />
+ <Entry accelerator="control PLUS" name="IncreaseNodeFontAction" />
+ <Entry accelerator="control MINUS" name="DecreaseNodeFontAction" />
+ <Entry builder="separator" />
+ <Entry name="TextAlignAction.LEFT" />
+ <Entry name="TextAlignAction.CENTER" />
+ <Entry name="TextAlignAction.RIGHT" />
+ <Entry builder="separator" />
+ <Entry accelerator="alt shift F" name="NodeColorAction" />
+ <Entry name="NodeColorBlendAction" />
+ <Entry name="NodeBackgroundColorAction" />
+ <Entry builder="separator" />
+ <Entry name="NodeShapeAction.fork" />
+ <Entry name="NodeShapeAction.bubble" />
+ <Entry builder="separator" />
+ <Entry name="RemoveFormatAction" />
+ </Entry>
+ <Entry name="CloudColorAction" />
+ <Entry name="EdgeProperties">
+ <Entry builder="radio_button_group" name="styleActions" textKey="styles">
+ <Entry name="EdgeStyleAsParentAction" />
+ <Entry name="EdgeStyleAction.linear" />
+ <Entry name="EdgeStyleAction.bezier" />
+ <Entry name="EdgeStyleAction.sharp_linear" />
+ <Entry name="EdgeStyleAction.sharp_bezier" />
+ <Entry name="EdgeStyleAction.horizontal" />
+ <Entry name="EdgeStyleAction.hide_edge" />
+ </Entry>
+ <Entry builder="radio_button_group" name="format_menu_edge_widths">
+ <Entry name="EdgeWidthAction_width_parent" />
+ <Entry name="EdgeWidthAction_width_thin" />
+ <Entry name="EdgeWidthAction_1" />
+ <Entry name="EdgeWidthAction_2" />
+ <Entry name="EdgeWidthAction_4" />
+ <Entry name="EdgeWidthAction_8" />
+ </Entry>
+ <Entry accelerator="alt shift E" name="EdgeColorAction" />
+ </Entry>
+ </Entry>
+ <Entry name="navigate">
+ <Entry name="navigate">
+ <Entry accelerator="SPACE" name="ToggleFoldedAction" />
+ <Entry name="ShowNextChildAction" accelerator="shift SPACE" />
+ <Entry accelerator="control SPACE" name="ToggleChildrenFoldedAction" />
+ </Entry>
+ <Entry accelerator="control A" name="SelectAllAction" />
+ <Entry accelerator="control shift A" name="SelectBranchAction" />
+ </Entry>
+ <Entry name="extras">
+ <Entry name="SetAcceleratorOnNextClickAction" />
+ </Entry>
+ </Entry>
+ <Entry name="map_popup">
+ <Entry name="ToggleMenubarAction" builder="MP_ToggleMenubarAction" />
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ToggleLeftToolbarAction" />
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="CenterSelectedNodeAction" />
+ </Entry>
+ <Entry name="node_popup" builder="node_popup">
+ <Entry accelerator="alt shift C" name="FormatCopy" />
+ <Entry accelerator="alt shift V" name="FormatPaste" />
+ <Entry name="NewUserStyleAction" />
+ <Entry name="DeleteUserStyleAction" />
+ <Entry name="NewLevelStyleAction" />
+ <Entry name="DeleteLevelStyleAction" />
+ </Entry>
+ <Entry name="main_toolbar" builder="toolbar,ignore">
+ <Entry name="styledialog.ok" />
+ <Entry name="styledialog.cancel" />
+ <Entry name="undo">
+ <Entry name="UndoAction" />
+ <Entry name="RedoAction" />
+ </Entry>
+ <Entry name="toolbar_styles" builder="main_toolbar_style" />
+ <Entry builder="main_toolbar_font" name="font">
+ <Entry name="toolbar_fonts" builder="main_toolbar_font_name" />
+ <Entry name="toolbar_fonts" builder="main_toolbar_font_size" />
+ <Entry name="BoldAction" />
+ <Entry name="ItalicAction" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry>
+ <Entry name="TextAlignAction.LEFT" />
+ <Entry name="TextAlignAction.CENTER" />
+ <Entry name="TextAlignAction.RIGHT" />
+ </Entry>
+ <Entry builder="separator" />
+ <Entry name="clouds">
+ <Entry name="CloudAction" />
+ <Entry name="CloudColorAction" />
+ </Entry>
+ </Entry>
+</FreeplaneUIEntries>
diff --git a/freeplane/external-resources/xslt/mm2adoc.xsl b/freeplane/external-resources/xslt/mm2adoc.xsl
new file mode 100644
index 0000000..f5646b7
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2adoc.xsl
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ MINDMAPEXPORTFILTER adoc Asciidoc
+
+ : This code released under the GPL. : (http://www.gnu.org/copyleft/gpl.html)
+ Document : mm2adoc.xsl
+ Created on : 24 Nov 2013
+ Author : Jean-Marc Meessen (jean-marc at meessen-web.org)
+ Description:
+ transforms freeplane mm format to Asciidoc form.
+ based on the mm2html converter by Joerg Feuerhake
+ (joerg.feuerhake at free-penguin.org).
+ Feel free to customize it while leaving the ancient authors mentioned.
+ Thank you
+ ChangeLog: See: http://freeplane.sourceforge.net/
+-->
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="text" indent="no"/>
+ <xsl:strip-space elements="map node" />
+ <xsl:key name="refid" match="node" use="@ID" />
+
+ <xsl:template match="/">
+ <xsl:apply-templates />
+ </xsl:template>
+
+ <xsl:template match="/map">
+ <xsl:apply-templates select="node"/>
+ </xsl:template>
+
+ <xsl:template match="richcontent">
+ <xsl:if test="@TYPE='NOTE'">
+ <xsl:text>NOTE: </xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ <xsl:text>
</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="child::text()">
+ <xsl:value-of select="normalize-space(.)" />
+ </xsl:template>
+
+ <xsl:template match="p|br|tr|div|li|pre">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>
</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="li">
+ <xsl:text>
* </xsl:text>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+
+ <xsl:template match="node">
+ <xsl:variable name="thisid" select="@ID" />
+
+ <xsl:variable name="depth">
+ <xsl:apply-templates select=".." mode="depthMesurement" />
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$depth = 0">
+ <xsl:text>= </xsl:text>
+ </xsl:when>
+ <xsl:when test="$depth = 1">
+ <xsl:text>
== </xsl:text>
+ </xsl:when>
+ <xsl:when test="$depth = 2">
+ <xsl:text>
=== </xsl:text>
+ </xsl:when>
+ <xsl:when test="$depth = 3">
+ <xsl:text>
==== </xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text>? </xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+
+
+ <xsl:if test="@TEXT">
+ <xsl:value-of select="normalize-space(@TEXT)" />
+ <xsl:text>

</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="richcontent[@TYPE='NODE']"/>
+ <xsl:apply-templates select="richcontent[@TYPE='DETAILS']"/>
+ <xsl:apply-templates select="richcontent[@TYPE='NOTE']"/>
+ <xsl:apply-templates select="node"/>
+ </xsl:template>
+
+ <xsl:template match="node" mode="depthMesurement">
+ <xsl:param name="depth" select=" '0' " />
+ <xsl:apply-templates select=".." mode="depthMesurement">
+ <xsl:with-param name="depth" select="$depth + 1" />
+ </xsl:apply-templates>
+ </xsl:template>
+ <xsl:template match="map" mode="depthMesurement">
+ <xsl:param name="depth" select=" '0' " />
+ <xsl:value-of select="$depth" />
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2html.xsl b/freeplane/external-resources/xslt/mm2html.xsl
index 234de1c..ac853a4 100644
--- a/freeplane/external-resources/xslt/mm2html.xsl
+++ b/freeplane/external-resources/xslt/mm2html.xsl
@@ -1,139 +1,149 @@
<?xml version="1.0" encoding="UTF-8" ?>
- <!--
- MINDMAPEXPORTFILTER html;htm %xslt_export.html
-
- : This code released under the GPL.
- : (http://www.gnu.org/copyleft/gpl.html) Document : mindmap2html.xsl
- Created on : 01 February 2004, 17:17 Author : joerg feuerhake
- joerg.feuerhake at free-penguin.org Description: transforms freeplane mm
- format to html, handles crossrefs font declarations and colors. feel
- free to customize it while leaving the ancient authors mentioned.
- thank you ChangeLog: See: http://freeplane.sourceforge.net/
- -->
+<!--
+ MINDMAPEXPORTFILTER html;htm %xslt_export.html
+
+ : This code released under the GPL.
+ : (http://www.gnu.org/copyleft/gpl.html) Document : mindmap2html.xsl
+ Created on : 01 February 2004, 17:17 Author : joerg feuerhake
+ joerg.feuerhake at free-penguin.org Description: transforms freeplane mm
+ format to html, handles crossrefs font declarations and colors. feel
+ free to customize it while leaving the ancient authors mentioned.
+ thank you ChangeLog: See: http://freeplane.sourceforge.net/
+ -->
<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="html" indent="no" encoding="ISO-8859-1" />
-
- <xsl:template match="/">
- <xsl:variable name="mapversion" select="map/@version" />
-
- <html>

- <head>

- <title><xsl:value-of select="map/node/@TEXT"/>//mm2html.xsl FreeplaneVersion:<xsl:value-of select="$mapversion"/></title>

- <style>
- body{
- font-size:10pt;
- color:rgb(0,0,0);
- backgound-color:rgb(255,255,255);
- font-family:sans-serif;
- }
- p.info{
- font-size:8pt;
- text-align:right;
- color:rgb(127,127,127);
- }
- </style>
- </head>
- 

- <body>
- 

-
- <p>
- <xsl:apply-templates/>
- </p>
- <p class="info">
- <xsl:value-of select="map/node/@TEXT"/>//mm2html.xsl FreeplaneVersion:<xsl:value-of select="$mapversion"/>
- 

- </p>
- </body>

- </html>

- </xsl:template>
-
-<xsl:template match="node">
-
-<xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable>
-<xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
-<xsl:variable name="nodetext" select="@TEXT"/>
-<xsl:variable name="thisid" select="@ID"/>
-<xsl:variable name="thiscolor" select="@COLOR"/>
-<xsl:variable name="fontface" select="font/@NAME"/>
-<xsl:variable name="fontbold" select="font/@BOLD"/>
-<xsl:variable name="fontitalic" select="font/@ITALIC"/>
-<xsl:variable name="fontsize" select="font/@SIZE"/>
-<xsl:variable name="target" select="arrowlink/@DESTINATION"/>
-
-
-
- <ul>

- <li>

+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" indent="no" encoding="ISO-8859-1" />
+
+ <xsl:template match="/">
+ <xsl:variable name="mapversion" select="map/@version" />
+
+ <html>
+ <head>
+ <title><xsl:value-of select="map/node/@TEXT"/>//mm2html.xsl FreeplaneVersion:<xsl:value-of select="$mapversion"/></title>
+ <style>
+ body{
+ font-size:10pt;
+ color:rgb(0,0,0);
+ backgound-color:rgb(255,255,255);
+ font-family:sans-serif;
+ }
+ p.info{
+ font-size:8pt;
+ text-align:right;
+ color:rgb(127,127,127);
+ }
+ </style>
+ </head>
+ <body>
+
+ <xsl:apply-templates/>
+
+ <p class="info">
+ <xsl:value-of select="map/node/@TEXT"/>//mm2html.xsl FreeplaneVersion:<xsl:value-of select="$mapversion"/>
+ </p>
+ </body>
+ </html>
+ </xsl:template>
+
+ <xsl:template match="map_styles">
+ </xsl:template>
+
+ <xsl:template match="node">
+
+ <xsl:variable name="lcletters">abcdefghijklmnopqrstuvwxyz</xsl:variable>
+ <xsl:variable name="ucletters">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
+ <xsl:variable name="nodetext" select="@TEXT"/>
+ <xsl:variable name="thisid" select="@ID"/>
+ <xsl:variable name="thiscolor" select="@COLOR"/>
+ <xsl:variable name="fontface" select="font/@NAME"/>
+ <xsl:variable name="fontbold" select="font/@BOLD"/>
+ <xsl:variable name="fontitalic" select="font/@ITALIC"/>
+ <xsl:variable name="fontsize" select="font/@SIZE"/>
+ <xsl:variable name="target" select="arrowlink/@DESTINATION"/>
+
+ <ul>
+ <li>
<xsl:if test="@ID != ''">
- <a>
+ <a>
<xsl:attribute name="name">
- <xsl:value-of select="$thisid"/>
+ <xsl:value-of select="$thisid"/>
</xsl:attribute>
- </a>

+ </a>
</xsl:if>
<xsl:if test="arrowlink/@DESTINATION != ''">
- <a >
+ <a >
<xsl:attribute name="style">
- <xsl:if test="$thiscolor != ''">
- <xsl:text>color:</xsl:text><xsl:value-of select="$thiscolor"/><xsl:text>;</xsl:text>
- </xsl:if>
- <xsl:if test="$fontface != ''">
- <xsl:text>font-family:</xsl:text><xsl:value-of select="translate($fontface,$ucletters,$lcletters)"/><xsl:text>;</xsl:text>
- </xsl:if>
- <xsl:if test="$fontsize != ''">
+ <xsl:if test="$thiscolor != ''">
+ <xsl:text>color:</xsl:text><xsl:value-of select="$thiscolor"/><xsl:text>;</xsl:text>
+ </xsl:if>
+ <xsl:if test="$fontface != ''">
+ <xsl:text>font-family:</xsl:text><xsl:value-of select="translate($fontface,$ucletters,$lcletters)"/><xsl:text>;</xsl:text>
+ </xsl:if>
+ <xsl:if test="$fontsize != ''">
<xsl:text>font-size:</xsl:text><xsl:value-of select="$fontsize"/><xsl:text>;</xsl:text>
- </xsl:if>
- <xsl:if test="$fontbold = 'true'">
- <xsl:text>font-weight:bold;</xsl:text>
- </xsl:if>
- <xsl:if test="$fontitalic = 'true'">
- <xsl:text>font-style:italic;</xsl:text>
- </xsl:if>
- </xsl:attribute>
+ </xsl:if>
+ <xsl:if test="$fontbold = 'true'">
+ <xsl:text>font-weight:bold;</xsl:text>
+ </xsl:if>
+ <xsl:if test="$fontitalic = 'true'">
+ <xsl:text>font-style:italic;</xsl:text>
+ </xsl:if>
+ </xsl:attribute>
<xsl:attribute name="href">
- <xsl:text>#</xsl:text><xsl:value-of select="$target"/>
+ <xsl:text>#</xsl:text><xsl:value-of select="$target"/>
</xsl:attribute>
-
+
<xsl:value-of select="$nodetext"/>
- </a>

+ </a>
</xsl:if>
<xsl:if test="not(arrowlink/@DESTINATION)">
-
- <span>
-
- <xsl:attribute name="style">
- <xsl:if test="$thiscolor != ''">
- <xsl:text>color:</xsl:text><xsl:value-of select="$thiscolor"/><xsl:text>;</xsl:text>
- </xsl:if>
- <xsl:if test="$fontface != ''">
- <xsl:text>font-family:</xsl:text><xsl:value-of select="translate($fontface,$ucletters,$lcletters)"/><xsl:text>;</xsl:text>
- </xsl:if>
- <xsl:if test="$fontsize != ''">
- <xsl:text>font-size:</xsl:text><xsl:value-of select="$fontsize"/><xsl:text>;</xsl:text>
- </xsl:if>
- <xsl:if test="$fontbold = 'true'">
- <xsl:text>font-weight:bold;</xsl:text>
- </xsl:if>
- <xsl:if test="$fontitalic = 'true'">
- <xsl:text>font-style:italic;</xsl:text>
- </xsl:if>
- </xsl:attribute>
- <xsl:value-of select="$nodetext"/>

- </span>

+
+ <pre>
+
+ <xsl:attribute name="style">
+ <xsl:if test="$thiscolor != ''">
+ <xsl:text>color:</xsl:text><xsl:value-of select="$thiscolor"/><xsl:text>;</xsl:text>
+ </xsl:if>
+ <xsl:if test="$fontface != ''">
+ <xsl:text>font-family:</xsl:text><xsl:value-of select="translate($fontface,$ucletters,$lcletters)"/><xsl:text>;</xsl:text>
+ </xsl:if>
+ <xsl:if test="$fontsize != ''">
+ <xsl:text>font-size:</xsl:text><xsl:value-of select="$fontsize"/><xsl:text>;</xsl:text>
+ </xsl:if>
+ <xsl:if test="$fontbold = 'true'">
+ <xsl:text>font-weight:bold;</xsl:text>
+ </xsl:if>
+ <xsl:if test="$fontitalic = 'true'">
+ <xsl:text>font-style:italic;</xsl:text>
+ </xsl:if>
+ </xsl:attribute>
+ <xsl:value-of select="$nodetext"/>
+ </pre>
</xsl:if>
<xsl:apply-templates/>
- </li>

- </ul>

-</xsl:template>
+ <xsl:if test="current()/node/hook/@NAME='ExternalObject'">
+ <xsl:call-template name="ExternalObject"></xsl:call-template>
+ </xsl:if>
+
+ </li>
+ </ul>
+ </xsl:template>
+
+ <xsl:template name="ExternalObject">
+ <img>
+ <xsl:attribute name="src">
+ <xsl:value-of select="current()/node/hook/@URI" disable-output-escaping="yes"/>
+ </xsl:attribute>
+ </img>
+ </xsl:template>
+
-</xsl:stylesheet>
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2latexartcl.xsl b/freeplane/external-resources/xslt/mm2latexartcl.xsl
index 8917201..51de47e 100644
--- a/freeplane/external-resources/xslt/mm2latexartcl.xsl
+++ b/freeplane/external-resources/xslt/mm2latexartcl.xsl
@@ -59,4 +59,4 @@
</xsl:text>
</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2markdown.xsl b/freeplane/external-resources/xslt/mm2markdown.xsl
new file mode 100644
index 0000000..d115211
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2markdown.xsl
@@ -0,0 +1,195 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+
+MINDMAPEXPORTFILTER md;markdown Markdown
+
+v. 0.3
+
+This code released under the GPL. : (http://www.gnu.org/copyleft/gpl.html)
+Document : mm2markdown.xsl
+Created on : 20 November, 2013
+Authors : Lee Hachadoorian Lee.Hachadoorian at gmail.com and Peter Yates pyates at gmail.com
+Description: Transforms freeplane mm to markdown md.
+* Nodes become headings and subheadings, Notes become paragraphs.
+* Attributes of root node become document metadata.
+* Details are not handled.
+* HTML tables are converted to Pandoc pipe table format.
+* Tested with Pandoc-flavored markdown.
+
+May not work:
+* Pandoc markdown style links/references
+
+Please test and suggest improvements to author, or feel free to customize
+while crediting previous authors.
+
+******************************************************************************
+Based on mm2text.xsl, original notice appears below
+******************************************************************************
+Document : mm2text.xsl
+Created on : 01 February 2004, 17:17
+Author : joerg feuerhake joerg.feuerhake at free-penguin.org
+Description: transforms freeplane mm
+format to html, handles crossrefs and adds numbering. feel free to
+customize it while leaving the ancient authors mentioned. thank you
+ChangeLog: See: http://freeplane.sourceforge.net/
+-->
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="text" indent="no"/>
+ <xsl:strip-space elements="map node" />
+ <xsl:key name="refid" match="node" use="@ID" />
+
+ <!-- Template to print header #signs -->
+ <xsl:template name="numberSign">
+ <xsl:param name="howMany">1</xsl:param>
+ <xsl:if test="$howMany > 0">
+ <!-- Add 1 number signs (#) to result tree. -->
+ <xsl:text>#</xsl:text>
+ <!-- Print remaining ($howMany - 1) number signs. -->
+ <xsl:call-template name="numberSign">
+ <xsl:with-param name="howMany" select="$howMany - 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- Template to print table header separator row -->
+ <xsl:template name="tableHeaderDashes">
+ <xsl:param name="howManyCols">1</xsl:param>
+ <xsl:if test="$howManyCols > 0">
+ <!-- Add left pipe and dashes to result tree. -->
+ <xsl:text>| ------ </xsl:text>
+ <!-- Print remaining ($howManyCols - 1) pipe dashes. -->
+ <xsl:call-template name="tableHeaderDashes">
+ <xsl:with-param name="howManyCols" select="$howManyCols - 1"/>
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:if test="$howManyCols = 0">
+ <xsl:text>|</xsl:text>
+ <xsl:text>
</xsl:text>
+ </xsl:if>
+ </xsl:template>
+
+ <xsl:template match="/">
+ <xsl:apply-templates />
+ </xsl:template>
+
+ <xsl:template match="/map">
+ <xsl:apply-templates select="node"/>
+ </xsl:template>
+
+ <xsl:template match="richcontent">
+ <xsl:text>
</xsl:text>
+ <xsl:apply-templates />
+ <xsl:text>
</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="child::text()">
+ <xsl:value-of select="translate(normalize-space(.),' ',' ')" />
+ </xsl:template>
+
+ <!-- Insert newline for html breaks, paras, etc. -->
+ <xsl:template match="p|br|div|li|pre">
+ <xsl:if test="preceding-sibling::*">
+ <xsl:text>
</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <!-- Convert Italics to markdown syntax -->
+ <xsl:template match="i|em">
+ <xsl:text> *</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>* </xsl:text>
+ </xsl:template>
+
+ <!-- Convert Bold to markdown syntax -->
+ <xsl:template match="b|strong">
+ <xsl:text> **</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>** </xsl:text>
+ </xsl:template>
+
+ <!-- Strikethrough formatting -->
+ <xsl:template match="strike">
+ <xsl:text> ~~</xsl:text>
+ <xsl:apply-templates/>
+ <xsl:text>~~ </xsl:text>
+ </xsl:template>
+
+ <!-- Convert <hr> to markdown horizontal rule -->
+ <xsl:template match="hr">
+ <xsl:text>* * * * *</xsl:text>
+ </xsl:template>
+
+ <!-- Convert html table to pandoc pipe table -->
+ <xsl:template match="table">
+ <xsl:text>
</xsl:text>
+ <xsl:apply-templates />
+ </xsl:template>
+
+ <xsl:template match="tr">
+ <xsl:if test="count(preceding-sibling::tr)=1">
+ <xsl:call-template name="tableHeaderDashes">
+ <xsl:with-param name="howManyCols" select="count(td)" />
+ </xsl:call-template>
+ </xsl:if>
+ <xsl:apply-templates />
+ <xsl:text>
</xsl:text>
+ </xsl:template>
+
+ <xsl:template match="td|th">
+ <xsl:text>| </xsl:text>
+ <xsl:apply-templates />
+ </xsl:template>
+
+ <xsl:template match="node">
+ <xsl:variable name="thisid" select="@ID" />
+ <xsl:variable name="target" select="arrowlink/@DESTINATION" />
+ <xsl:choose>
+ <!-- Root node attributes create yaml block -->
+ <xsl:when test="count(ancestor::*) = 1">
+ <!-- Only create yaml block if there are attributes -->
+ <xsl:if test="count(attribute) > 0">
+ <xsl:text>
</xsl:text>
+ <xsl:text>---
</xsl:text>
+ <xsl:apply-templates select="attribute" />
+ <xsl:text>---</xsl:text>
+ </xsl:if>
+ </xsl:when>
+ <!-- Create the headers from non-root node text using number signs -->
+ <xsl:otherwise>
+ <xsl:text>
</xsl:text>
+ <xsl:call-template name="numberSign">
+ <xsl:with-param name="howMany" select="count(ancestor::*) - 1"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:text> </xsl:text>
+ <!-- Node text -->
+ <xsl:if test="@TEXT">
+ <xsl:value-of select="normalize-space(@TEXT)" />
+ <xsl:text>
</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="richcontent[@TYPE='NODE']"/>
+ <xsl:apply-templates select="richcontent[@TYPE='DETAILS']"/>
+ <xsl:apply-templates select="richcontent[@TYPE='NOTE']"/>
+ <xsl:if test="arrowlink/@DESTINATION != ''">
+ <xsl:text> (see:</xsl:text>
+ <xsl:for-each select="key('refid', $target)">
+ <xsl:value-of select="@TEXT" />
+ </xsl:for-each>
+ <xsl:text>)</xsl:text>
+ </xsl:if>
+ <xsl:apply-templates select="node"/>
+ </xsl:template>
+
+ <!-- Attribute template -->
+ <xsl:template match="attribute">
+ <!-- yaml wants lowercase field names -->
+ <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
+ <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
+ <xsl:value-of select="translate(@NAME, $uppercase, $lowercase)" />: '<xsl:value-of select="@VALUE" />'
+ <xsl:text>
</xsl:text>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2opml.xsl b/freeplane/external-resources/xslt/mm2opml.xsl
index b738c67..4088ef0 100644
--- a/freeplane/external-resources/xslt/mm2opml.xsl
+++ b/freeplane/external-resources/xslt/mm2opml.xsl
@@ -44,4 +44,4 @@
</xsl:otherwise>
</xsl:choose>
</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
+</xsl:stylesheet>
diff --git a/freeplane/external-resources/xslt/mm2wordml_utf8.xsl b/freeplane/external-resources/xslt/mm2wordml_utf8.xsl
index 21f80eb..d9ca966 100644
--- a/freeplane/external-resources/xslt/mm2wordml_utf8.xsl
+++ b/freeplane/external-resources/xslt/mm2wordml_utf8.xsl
@@ -156,7 +156,7 @@
</xsl:template>
<xsl:template name="output-note-text-as-bodytext">
- <xsl:param name="contentType"></xsl:param>
+ <xsl:param name="contentType" select="'DETAILS'"></xsl:param>
<xsl:if test="richcontent[@TYPE=$contentType]">
<w:p>
<w:pPr>
@@ -164,7 +164,7 @@
</w:pPr>
<w:r>
<w:t>
- <xsl:value-of select="string(richcontent[@TYPE='DETAILS']/html/body)" />
+ <xsl:value-of select="string(richcontent[@TYPE=$contentType]/html/body)" />
</w:t>
</w:r>
</w:p>
diff --git a/freeplane/external-resources/xslt/mm2xml.xsl b/freeplane/external-resources/xslt/mm2xml.xsl
new file mode 100644
index 0000000..2642777
--- /dev/null
+++ b/freeplane/external-resources/xslt/mm2xml.xsl
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ : mm2xml.xsl : XSL stylesheet to convert from mind map to xml:
+
+ MINDMAPEXPORTFILTER xml XML
+
+ This code released under the GPL. :
+-->
+
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:output method="xml" version="1.0" indent="yes"
+ encoding="UTF-8" omit-xml-declaration="no" />
+ <xsl:strip-space elements="*" />
+
+ <xsl:template match="map">
+ <xsl:apply-templates select="node"/>
+ </xsl:template>
+
+ <xsl:template match="node[starts-with(@TEXT, '"')]" priority="2">
+ <xsl:variable name="length" select="string-length(@TEXT)"/>
+ <xsl:value-of select="substring(@TEXT,2,($length - 2))"/>
+ </xsl:template>
+
+ <xsl:template match="node[@TEXT]" priority="1">
+ <xsl:variable name="position" select="position()"/>
+ <xsl:if test="not(../node[$position - 1 and starts-with(@TEXT, '"')])">
+ <xsl:text>
</xsl:text>
+ </xsl:if>
+ <xsl:text disable-output-escaping="yes"><</xsl:text>
+ <xsl:value-of select="@TEXT"/>
+ <xsl:apply-templates select="attribute"/>
+ <xsl:choose>
+ <xsl:when test="node[@TEXT]">
+ <xsl:text disable-output-escaping="yes">></xsl:text>
+ <xsl:apply-templates select="node"/>
+ <xsl:if test="not(node[position() = last() and starts-with(@TEXT, '"')])">
+ <xsl:text>
</xsl:text>
+ </xsl:if>
+ <xsl:text disable-output-escaping="yes"></</xsl:text>
+ <xsl:value-of select="@TEXT"/>
+ <xsl:text disable-output-escaping="yes">></xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:text disable-output-escaping="yes"> /></xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <xsl:template match="attribute[@NAME and @VALUE]">
+ <xsl:text> </xsl:text>
+ <xsl:value-of select="@NAME"/>
+ <xsl:text>="</xsl:text>
+ <xsl:value-of select="@VALUE"/>
+ <xsl:text>" </xsl:text>
+ </xsl:template>
+ <xsl:template match="*">
+ </xsl:template>
+
+</xsl:stylesheet>
diff --git a/freeplane/format_translation.gradle b/freeplane/format_translation.gradle
new file mode 100644
index 0000000..a847da4
--- /dev/null
+++ b/freeplane/format_translation.gradle
@@ -0,0 +1,70 @@
+configurations {
+ ant_tasks
+}
+
+dependencies {
+ ant_tasks project(':freeplane_ant')
+}
+
+task format_translation(dependsOn: configurations.ant_tasks) << {
+ ant.taskdef(
+ name: "format_translation",
+ classname: "org.freeplane.ant.FormatTranslation",
+ classpath: configurations.ant_tasks.asPath,
+ onerror: "report"
+ )
+
+ ant.format_translation(
+ dir: file("./resources/translations"),
+ includes: "*.properties",
+ eolstyle: "unix"
+ )
+ ant.format_translation(
+ dir: file("./viewer-resources/translations"),
+ includes: "*.properties",
+ eolstyle: "unix"
+ )
+}
+
+task check_translation(dependsOn: configurations.ant_tasks) << {
+ ant.taskdef(
+ name: "check_translation",
+ classname: "org.freeplane.ant.FormatTranslationCheck",
+ classpath: configurations.ant_tasks.asPath,
+ onerror: "report"
+ )
+
+ ant.check_translation(
+ dir: file('./resources/translations'),
+ includes: '*.properties',
+ eolstyle: 'unix'
+ )
+ ant.check_translation(
+ dir: file('./viewer-resources/translations'),
+ includes: '*.properties',
+ eolstyle: 'unix'
+ )
+}
+
+task update_translation << {
+ fileTree(dir: './resources/translations', include: 'Resources_*.properties').each{ File resourceFile ->
+ def userFile = file('../User' + resourceFile.name)
+ if (userFile.exists()) {
+ Properties properties = new Properties()
+ resourceFile.withInputStream {
+ properties.load(it)
+ }
+
+ userFile.withInputStream {
+ properties.load(it)
+ }
+
+
+ properties.store(resourceFile.newWriter(), null)
+ }
+ }
+}
+
+update_translation.finalizedBy format_translation
+
+build.dependsOn(check_translation)
diff --git a/freeplane/git.gradle b/freeplane/git.gradle
new file mode 100644
index 0000000..9dc59d6
--- /dev/null
+++ b/freeplane/git.gradle
@@ -0,0 +1,46 @@
+// copy gitinfo.txt from root (necessary when building from
+// src/srcpure because git is not available!)
+task copyGitTxt(type: Copy) {
+ onlyIf { new File(rootDir, 'gitinfo.txt').exists() }
+
+ from(rootDir) {
+ include('gitinfo.txt')
+ }
+ into(globalBuild)
+}
+
+// copy gitinfo.properties from root (necessary when building from
+// src/srcpure because git is not available!)
+task copyGitProperty(type: Copy) {
+ onlyIf { new File(rootDir, 'gitinfo.properties').exists() }
+
+ from(rootDir) {
+ include('gitinfo.properties')
+ }
+ into(globalBuild + '/resources')
+}
+
+task createGitProperty(type: Exec) {
+ // for src/srcpure tarballs, /gitinfo.txt exists, so we don't call git
+ // (which is not available)
+ onlyIf { !new File(rootDir, 'gitinfo.txt').exists() }
+
+ ignoreExitValue = true
+
+ commandLine 'git', 'log', '--pretty=format:git-revision=%H %cn %ci', '-n1'
+
+ doFirst {
+ standardOutput = new FileOutputStream(new File(globalBuild, 'gitinfo.txt'))
+ }
+ doLast {
+ // create gitinfo.properties!
+ copy {
+ from(globalBuild) {
+ include('gitinfo.txt')
+ rename('gitinfo.txt', 'gitinfo.properties')
+ filter(org.apache.tools.ant.filters.EscapeUnicode)
+ }
+ into(globalBuild + '/resources')
+ }
+ }
+}
diff --git a/freeplane/svg-src/Negative.svg b/freeplane/images-src/Negative.svg
similarity index 100%
rename from freeplane/svg-src/Negative.svg
rename to freeplane/images-src/Negative.svg
diff --git a/freeplane/svg-src/Neutral.svg b/freeplane/images-src/Neutral.svg
similarity index 100%
rename from freeplane/svg-src/Neutral.svg
rename to freeplane/images-src/Neutral.svg
diff --git a/freeplane/svg-src/Positive.svg b/freeplane/images-src/Positive.svg
similarity index 100%
rename from freeplane/svg-src/Positive.svg
rename to freeplane/images-src/Positive.svg
diff --git a/freeplane/svg-src/Very_Positive.svg b/freeplane/images-src/Very_Positive.svg
similarity index 100%
rename from freeplane/svg-src/Very_Positive.svg
rename to freeplane/images-src/Very_Positive.svg
diff --git a/freeplane/images-src/clone.xcf b/freeplane/images-src/clone.xcf
new file mode 100644
index 0000000..801fdb7
Binary files /dev/null and b/freeplane/images-src/clone.xcf differ
diff --git a/freeplane/svg-src/very_negative.svg b/freeplane/images-src/very_negative.svg
similarity index 100%
rename from freeplane/svg-src/very_negative.svg
rename to freeplane/images-src/very_negative.svg
diff --git a/freeplane/pom.xml b/freeplane/pom.xml
deleted file mode 100644
index 7fdc905..0000000
--- a/freeplane/pom.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>org.freeplane</groupId>
- <version>1.0.30</version>
- <artifactId>freeplane-main</artifactId>
- <packaging>jar</packaging>
- <name>freeplane-main</name>
- <url>http://www.freeplane.org/</url>
- <inceptionYear>2009</inceptionYear>
-
- <dependencies>
- <dependency>
- <groupId>com.jgoodies</groupId>
- <artifactId>forms</artifactId>
- <version>1.0.5</version>
- </dependency>
- <dependency>
- <groupId>org.freeplane</groupId>
- <artifactId>freeplane-jortho</artifactId>
- <version>${pom.version}</version>
- </dependency>
- <dependency>
- <groupId>org.freeplane</groupId>
- <artifactId>freeplane-simplyHTML</artifactId>
- <version>${pom.version}</version>
- </dependency>
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.osgi.core</artifactId>
- <version>1.0.0</version>
- </dependency>
- </dependencies>
-
- <build>
- <sourceDirectory>src/</sourceDirectory>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <configuration>
- <source>1.5</source>
- <target>1.5</target>
- </configuration>
- </plugin>
- </plugins>
-
- </build>
-</project>
diff --git a/freeplane/resources/html/deployJava.js b/freeplane/resources/html/deployJava.js
deleted file mode 100644
index 8aa7a65..0000000
--- a/freeplane/resources/html/deployJava.js
+++ /dev/null
@@ -1 +0,0 @@
-var deployJava=function(){var l={core:["id","class","title","style"],i18n:["lang","dir"],events:["onclick","ondblclick","onmousedown","onmouseup","onmouseover","onmousemove","onmouseout","onkeypress","onkeydown","onkeyup"],applet:["codebase","code","name","archive","object","width","height","alt","align","hspace","vspace"],object:["classid","codebase","codetype","data","type","archive","declare","standby","height","width","usemap","name","tabindex","align","border","hspace","vspace"]};va [...]
\ No newline at end of file
diff --git a/freeplane/resources/html/deployJava.txt b/freeplane/resources/html/deployJava.txt
deleted file mode 100644
index 49c3fb4..0000000
--- a/freeplane/resources/html/deployJava.txt
+++ /dev/null
@@ -1,1306 +0,0 @@
-/*
- * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved.
- * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * - Neither the name of Oracle nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * deployJava.js
- *
- * This file is part of the Deployment Toolkit. It provides functions for web
- * pages to detect the presence of a JRE, install the latest JRE, and easily run
- * applets or Web Start programs. More Information on usage of the
- * Deployment Toolkit can be found in the Deployment Guide at:
- * http://docs.oracle.com/javase/6/docs/technotes/guides/jweb/index.html
- *
- * The "live" copy of this file may be found at :
- * http://java.com/js/deployJava.js.
- * For web pages provisioned using https, you may want to access the copy at:
- * https://java.com/js/deployJava.js.
- *
- * You are encouraged to link directly to the live copies.
- * The above files are stripped of comments and whitespace for performance,
- * You can access this file w/o the whitespace and comments removed at:
- * http://java.com/js/deployJava.txt.
- *
- */
-
-var deployJava = function() {
- /** HTML attribute filter implementation */
- var hattrs = {
- core: [ 'id', 'class', 'title', 'style' ],
- i18n: [ 'lang', 'dir' ],
- events: [ 'onclick', 'ondblclick', 'onmousedown', 'onmouseup',
- 'onmouseover', 'onmousemove', 'onmouseout', 'onkeypress',
- 'onkeydown', 'onkeyup' ],
- applet: [ 'codebase', 'code', 'name', 'archive', 'object',
- 'width', 'height', 'alt', 'align', 'hspace', 'vspace' ],
- object: [ 'classid', 'codebase', 'codetype', 'data', 'type',
- 'archive', 'declare', 'standby', 'height', 'width', 'usemap',
- 'name', 'tabindex', 'align', 'border', 'hspace', 'vspace' ]
- };
-
- var object_valid_attrs = hattrs.object.concat(hattrs.core, hattrs.i18n,
- hattrs.events);
- var applet_valid_attrs = hattrs.applet.concat(hattrs.core);
-
- // generic log function, use console.log unless it isn't available
- // then revert to alert()
- function log(message) {
- if ( ! rv.debug ) {return};
-
- if (console.log) {
- console.log(message);
- } else {
- alert(message);
- }
- }
-
- //checks where given version string matches query
- //
- //NB: assume format is correct. Can add format check later if needed
- // from dtjava.js
- function versionCheckEx(query, version) {
- if (query == null || query.length == 0) return true;
-
- var c = query.charAt(query.length - 1);
-
- //if it is not explicit pattern but does not have update version then need to append *
- if (c != '+' && c != '*' && (query.indexOf('_') != -1 && c != '_')) {
- query = query + "*";
- c = '*';
- }
-
- query = query.substring(0, query.length - 1);
- //if query ends with ".", "_" then we want to strip it to allow match of "1.6.*" to shorter form such as "1.6"
- //TODO: add support for match of "1.7.0*" to "1.7"?
- if (query.length > 0) {
- var z = query.charAt(query.length - 1);
- if (z == '.' || z == '_') {
- query = query.substring(0, query.length - 1);
- }
- }
- if (c == '*') {
- //it is match if version starts from it
- return (version.indexOf(query) == 0);
- } else if (c == '+') {
- //match if query string is lexicographically smaller
- return query <= version;
- }
- return false;
- }
-
- function getWebStartLaunchIconURL() {
- var imageUrl = '//java.com/js/webstart.png';
- try {
- // for http/https; use protocol less url; use http for all other protocol
- return document.location.protocol.indexOf('http') != -1 ?
- imageUrl : 'http:' + imageUrl;
- } catch (err) {
- return 'http:' + imageUrl;
- }
- }
-
- // GetJava page
- function constructGetJavaURL(query) {
-
- var getJavaURL = 'http://java.com/dt-redirect';
-
- if (query == null || query.length == 0) return getJavaURL;
- if(query.charAt(0) == '&')
- {
- query = query.substring(1, query.length);
- }
- return getJavaURL + '?'+ query;
- }
-
- function arHas(ar, attr) {
- var len = ar.length;
- for (var i = 0; i < len; i++) {
- if (ar[i] === attr) return true;
- }
- return false;
- }
-
- function isValidAppletAttr(attr) {
- return arHas(applet_valid_attrs, attr.toLowerCase());
- }
-
- function isValidObjectAttr(attr) {
- return arHas(object_valid_attrs, attr.toLowerCase());
- }
-
- /**
- * returns true if we can enable DT plugin auto-install without chance of
- * deadlock on cert mismatch dialog
- *
- * requestedJREVersion param is optional - if null, it will be
- * treated as installing any JRE version
- *
- * DT plugin for 6uX only knows about JRE installer signed by SUN cert.
- * If it encounter Oracle signed JRE installer, it will have chance of
- * deadlock when running with IE. This function is to guard against this.
- */
- function enableWithoutCertMisMatchWorkaround(requestedJREVersion) {
-
- // Non-IE browser are okay
- if ('MSIE' != deployJava.browserName) return true;
-
- // if DT plugin is 10.0.0 or above, return true
- // This is because they are aware of both SUN and Oracle signature and
- // will not show cert mismatch dialog that might cause deadlock
- if (deployJava.compareVersionToPattern(deployJava.getPlugin().version,
- ["10", "0", "0"], false, true)) {
- return true;
- }
-
- // If we got there, DT plugin is 6uX
-
- if (requestedJREVersion == null) {
- // if requestedJREVersion is not defined - it means ANY.
- // can not guarantee it is safe to install ANY version because 6uX
- // DT does not know about Oracle certificates and may deadlock
- return false;
- }
-
- // 6u32 or earlier JRE installer used Sun certificate
- // 6u33+ uses Oracle's certificate
- // DT in JRE6 does not know about Oracle certificate => can only
- // install 6u32 or earlier without risk of deadlock
- return !versionCheckEx("1.6.0_33+", requestedJREVersion);
- }
-
- /* HTML attribute filters */
-
- var rv = {
-
- debug: null,
-
- /* version of deployJava.js */
- version: "20120801",
-
- firefoxJavaVersion: null,
-
- myInterval: null,
- preInstallJREList: null,
- returnPage: null,
- brand: null,
- locale: null,
- installType: null,
-
- EAInstallEnabled: false,
- EarlyAccessURL: null,
-
-
- // mime-type of the DeployToolkit plugin object
- oldMimeType: 'application/npruntime-scriptable-plugin;DeploymentToolkit',
- mimeType: 'application/java-deployment-toolkit',
-
- /* location of the Java Web Start launch button graphic is right next to
- * deployJava.js at:
- * http://java.com/js/webstart.png
- *
- * Use protocol less url here for http/https support
- */
- launchButtonPNG: getWebStartLaunchIconURL(),
-
- browserName: null,
- browserName2: null,
-
- /**
- * Returns an array of currently-installed JRE version strings.
- * Version strings are of the form #.#[.#[_#]], with the function returning
- * as much version information as it can determine, from just family
- * versions ("1.4.2", "1.5") through the full version ("1.5.0_06").
- *
- * Detection is done on a best-effort basis. Under some circumstances
- * only the highest installed JRE version will be detected, and
- * JREs older than 1.4.2 will not always be detected.
- */
- getJREs: function() {
- var list = new Array();
- if (this.isPluginInstalled()) {
- var plugin = this.getPlugin();
- var VMs = plugin.jvms;
- for (var i = 0; i < VMs.getLength(); i++) {
- list[i] = VMs.get(i).version;
- }
- } else {
- var browser = this.getBrowser();
-
- if (browser == 'MSIE') {
- if (this.testUsingActiveX('1.7.0')) {
- list[0] = '1.7.0';
- } else if (this.testUsingActiveX('1.6.0')) {
- list[0] = '1.6.0';
- } else if (this.testUsingActiveX('1.5.0')) {
- list[0] = '1.5.0';
- } else if (this.testUsingActiveX('1.4.2')) {
- list[0] = '1.4.2';
- } else if (this.testForMSVM()) {
- list[0] = '1.1';
- }
- } else if (browser == 'Netscape Family') {
- this.getJPIVersionUsingMimeType();
- if (this.firefoxJavaVersion != null) {
- list[0] = this.firefoxJavaVersion;
- } else if (this.testUsingMimeTypes('1.7')) {
- list[0] = '1.7.0';
- } else if (this.testUsingMimeTypes('1.6')) {
- list[0] = '1.6.0';
- } else if (this.testUsingMimeTypes('1.5')) {
- list[0] = '1.5.0';
- } else if (this.testUsingMimeTypes('1.4.2')) {
- list[0] = '1.4.2';
- } else if (this.browserName2 == 'Safari') {
- if (this.testUsingPluginsArray('1.7.0')) {
- list[0] = '1.7.0';
- } else if (this.testUsingPluginsArray('1.6')) {
- list[0] = '1.6.0';
- } else if (this.testUsingPluginsArray('1.5')) {
- list[0] = '1.5.0';
- } else if (this.testUsingPluginsArray('1.4.2')) {
- list[0] = '1.4.2';
- }
- }
- }
- }
-
- if (this.debug) {
- for (var i = 0; i < list.length; ++i) {
- log('[getJREs()] We claim to have detected Java SE ' + list[i]);
- }
- }
-
- return list;
- },
-
- /**
- * Triggers a JRE installation. The exact effect of triggering an
- * installation varies based on platform, browser, and if the
- * Deployment Toolkit plugin is installed.
- *
- * The requestVersion string is of the form #[.#[.#[_#]]][+|*],
- * which includes strings such as "1.4", "1.5.0*", and "1.6.0_02+".
- * A star (*) means "any version starting within this family" and
- * a plus (+) means "any version greater or equal to this".
- * "1.5.0*" * matches 1.5.0_06 but not 1.6.0_01, whereas
- * "1.5.0+" matches both.
- *
- * installCallback is an optional argument which holds a reference
- * to a javascript callback function for reporting install status.
- *
- * If the Deployment Toolkit plugin is not present, this will just call
- * this.installLatestJRE().
- */
- installJRE: function(requestVersion, installCallback) {
- var ret = false;
- if (this.isPluginInstalled() &&
- this.isAutoInstallEnabled(requestVersion)) {
- var installSucceeded = false;
- if (this.isCallbackSupported()) {
- installSucceeded =
- this.getPlugin().installJRE(requestVersion, installCallback);
- } else {
- installSucceeded = this.getPlugin().installJRE(requestVersion);
- }
-
- if (installSucceeded) {
- this.refresh();
- if (this.returnPage != null) {
- document.location = this.returnPage;
- }
- }
- return installSucceeded;
- } else {
- return this.installLatestJRE();
- }
- },
-
- /**
- * returns true if jre auto install for the requestedJREVersion is enabled
- * for the local system; false otherwise
- *
- * requestedJREVersion param is optional - if not specified, it will be
- * treated as installing any JRE version
- *
- * DT plugin for 6uX only knows about JRE installer signed by SUN cert.
- * If it encounter Oracle signed JRE installer, it will have chance of
- * deadlock when running with IE. This function is to guard against this.
- */
- isAutoInstallEnabled: function(requestedJREVersion) {
- // if no DT plugin, return false
- if (!this.isPluginInstalled()) return false;
-
- if (typeof requestedJREVersion == 'undefined') {
- requestedJREVersion = null;
- }
-
- return enableWithoutCertMisMatchWorkaround(requestedJREVersion);
-
- },
-
- /**
- * returns true if jre install callback is supported
- * callback support is added since dt plugin version 10.2.0 or above
- */
- isCallbackSupported: function() {
- return this.isPluginInstalled() &&
- this.compareVersionToPattern(this.getPlugin().version,
- ["10", "2", "0"], false, true);
- },
-
- /**
- * Triggers a JRE installation. The exact effect of triggering an
- * installation varies based on platform, browser, and if the
- * Deployment Toolkit plugin is installed.
- *
- * In the simplest case, the browser window will be redirected to the
- * java.com JRE installation page, and (if possible) a redirect back to
- * the current URL upon successful installation. The return redirect is
- * not always possible, as the JRE installation may require the browser to
- * be restarted.
- *
- * installCallback is an optional argument which holds a reference
- * to a javascript callback function for reporting install status.
- *
- * In the best case (when the Deployment Toolkit plugin is present), this
- * function will immediately cause a progress dialog to be displayed
- * as the JRE is downloaded and installed.
- */
- installLatestJRE: function(installCallback) {
- if (this.isPluginInstalled() && this.isAutoInstallEnabled()) {
- var installSucceeded = false;
- if (this.isCallbackSupported()) {
- installSucceeded = this.getPlugin().installLatestJRE(installCallback);
- } else {
- installSucceeded = this.getPlugin().installLatestJRE();
- }
- if (installSucceeded) {
- this.refresh();
- if (this.returnPage != null) {
- document.location = this.returnPage;
- }
- }
- return installSucceeded;
- } else {
- var browser = this.getBrowser();
- var platform = navigator.platform.toLowerCase();
- if ((this.EAInstallEnabled == 'true') &&
- (platform.indexOf('win') != -1) &&
- (this.EarlyAccessURL != null)) {
-
- this.preInstallJREList = this.getJREs();
- if (this.returnPage != null) {
- this.myInterval =
- setInterval("deployJava.poll()", 3000);
- }
-
- location.href = this.EarlyAccessURL;
-
- // we have to return false although there may be an install
- // in progress now, when complete it may go to return page
- return false;
- } else {
- if (browser == 'MSIE') {
- return this.IEInstall();
- } else if ((browser == 'Netscape Family') &&
- (platform.indexOf('win32') != -1)) {
- return this.FFInstall();
- } else {
- location.href = constructGetJavaURL(
- ((this.returnPage != null) ?
- ('&returnPage=' + this.returnPage) : '') +
- ((this.locale != null) ?
- ('&locale=' + this.locale) : '') +
- ((this.brand != null) ?
- ('&brand=' + this.brand) : ''));
- }
- // we have to return false although there may be an install
- // in progress now, when complete it may go to return page
- return false;
- }
- }
- },
-
-
- /**
- * Ensures that an appropriate JRE is installed and then runs an applet.
- * minimumVersion is of the form #[.#[.#[_#]]], and is the minimum
- * JRE version necessary to run this applet. minimumVersion is optional,
- * defaulting to the value "1.1" (which matches any JRE).
- * If an equal or greater JRE is detected, runApplet() will call
- * writeAppletTag(attributes, parameters) to output the applet tag,
- * otherwise it will call installJRE(minimumVersion + '+').
- *
- * After installJRE() is called, the script will attempt to detect that the
- * JRE installation has completed and begin running the applet, but there
- * are circumstances (such as when the JRE installation requires a browser
- * restart) when this cannot be fulfilled.
- *
- * As with writeAppletTag(), this function should only be called prior to
- * the web page being completely rendered. Note that version wildcards
- * (star (*) and plus (+)) are not supported, and including them in the
- * minimumVersion will result in an error message.
- */
- runApplet: function(attributes, parameters, minimumVersion) {
- if (minimumVersion == 'undefined' || minimumVersion == null) {
- minimumVersion = '1.1';
- }
-
- var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
-
- var matchData = minimumVersion.match(regex);
-
- if (this.returnPage == null) {
- // if there is an install, come back here and run the applet
- this.returnPage = document.location;
- }
-
- if (matchData != null) {
- var browser = this.getBrowser();
- if (browser != '?') {
- if (this.versionCheck(minimumVersion + '+')) {
- this.writeAppletTag(attributes, parameters);
- } else if (this.installJRE(minimumVersion + '+')) {
- // after successful install we need to refresh page to pick
- // pick up new plugin
- this.refresh();
- location.href = document.location;
- this.writeAppletTag(attributes, parameters);
- }
- } else {
- // for unknown or Safari - just try to show applet
- this.writeAppletTag(attributes, parameters);
- }
- } else {
- log('[runApplet()] Invalid minimumVersion argument to runApplet():' +
- minimumVersion);
- }
- },
-
-
- /**
- * Outputs an applet tag with the specified attributes and parameters, where
- * both attributes and parameters are associative arrays. Each key/value
- * pair in attributes becomes an attribute of the applet tag itself, while
- * key/value pairs in parameters become <PARAM> tags. No version checking
- * or other special behaviors are performed; the tag is simply written to
- * the page using document.writeln().
- *
- * As document.writeln() is generally only safe to use while the page is
- * being rendered, you should never call this function after the page
- * has been completed.
- */
- writeAppletTag: function(attributes, parameters) {
- var startApplet = '<' + 'applet ';
- var params = '';
- var endApplet = '<' + '/' + 'applet' + '>';
- var addCodeAttribute = true;
-
- if (null == parameters || typeof parameters != 'object') {
- parameters = new Object();
- }
-
- for (var attribute in attributes) {
- if (! isValidAppletAttr(attribute)) {
- parameters[attribute] = attributes[attribute];
- } else {
- startApplet += (' ' +attribute+ '="' +attributes[attribute] + '"');
- if (attribute == 'code') {
- addCodeAttribute = false;
- }
- }
- }
-
- var codebaseParam = false;
- for (var parameter in parameters) {
- if (parameter == 'codebase_lookup') {
- codebaseParam = true;
- }
- // Originally, parameter 'object' was used for serialized
- // applets, later, to avoid confusion with object tag in IE
- // the 'java_object' was added. Plugin supports both.
- if (parameter == 'object' || parameter == 'java_object' ||
- parameter == 'java_code' ) {
- addCodeAttribute = false;
- }
- params += '<param name="' + parameter + '" value="' +
- parameters[parameter] + '"/>';
- }
- if (!codebaseParam) {
- params += '<param name="codebase_lookup" value="false"/>';
- }
-
- if (addCodeAttribute) {
- startApplet += (' code="dummy"');
- }
- startApplet += '>';
-
- document.write(startApplet + '\n' + params + '\n' + endApplet);
- },
-
-
- /**
- * Returns true if there is a matching JRE version currently installed
- * (among those detected by getJREs()). The versionPattern string is
- * of the form #[.#[.#[_#]]][+|*], which includes strings such as "1.4",
- * "1.5.0*", and "1.6.0_02+".
- * A star (*) means "any version within this family" and a plus (+) means
- * "any version greater or equal to the specified version". "1.5.0*"
- * matches 1.5.0_06 but not 1.6.0_01, whereas "1.5.0+" matches both.
- *
- * If the versionPattern does not include all four version components
- * but does not end with a star or plus, it will be treated as if it
- * ended with a star. "1.5" is exactly equivalent to "1.5*", and will
- * match any version number beginning with "1.5".
- *
- * If getJREs() is unable to detect the precise version number, a match
- * could be ambiguous. For example if getJREs() detects "1.5", there is
- * no way to know whether the JRE matches "1.5.0_06+". versionCheck()
- * compares only as much of the version information as could be detected,
- * so versionCheck("1.5.0_06+") would return true in in this case.
- *
- * Invalid versionPattern will result in a JavaScript error alert.
- * versionPatterns which are valid but do not match any existing JRE
- * release (e.g. "32.65+") will always return false.
- */
- versionCheck: function(versionPattern)
- {
- var index = 0;
- var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?(\\*|\\+)?$";
-
- var matchData = versionPattern.match(regex);
-
- if (matchData != null) {
- // default is exact version match
- // examples:
- // local machine has 1.7.0_04 only installed
- // exact match request is "1.7.0_05": return false
- // family match request is "1.7.0*": return true
- // minimum match request is "1.6+": return true
- var familyMatch = false;
- var minMatch = false;
-
- var patternArray = new Array();
-
- for (var i = 1; i < matchData.length; ++i) {
- // browser dependency here.
- // Fx sets 'undefined', IE sets '' string for unmatched groups
- if ((typeof matchData[i] == 'string') && (matchData[i] != '')) {
- patternArray[index] = matchData[i];
- index++;
- }
- }
-
- if (patternArray[patternArray.length-1] == '+') {
- // + specified in request - doing a minimum match
- minMatch = true;
- familyMatch = false;
- patternArray.length--;
- } else if (patternArray[patternArray.length-1] == '*') {
- // * specified in request - doing a family match
- minMatch = false;
- familyMatch = true;
- patternArray.length--;
- } else if (patternArray.length < 4) {
- // versionPattern does not include all four version components
- // and does not end with a star or plus, it will be treated as
- // if it ended with a star. (family match)
- minMatch = false;
- familyMatch = true;
- }
-
- var list = this.getJREs();
- for (var i = 0; i < list.length; ++i) {
- if (this.compareVersionToPattern(list[i], patternArray,
- familyMatch, minMatch)) {
- return true;
- }
- }
-
- return false;
- } else {
- var msg = 'Invalid versionPattern passed to versionCheck: ' +
- versionPattern;
- log('[versionCheck()] ' + msg);
- alert(msg);
- return false;
- }
- },
-
-
- /**
- * Returns true if an installation of Java Web Start of the specified
- * minimumVersion can be detected. minimumVersion is optional, and
- * if not specified, '1.4.2' will be used.
- * (Versions earlier than 1.4.2 may not be detected.)
- */
- isWebStartInstalled: function(minimumVersion) {
-
- var browser = this.getBrowser();
- if (browser == '?') {
- // we really don't know - better to try to use it than reinstall
- return true;
- }
-
- if (minimumVersion == 'undefined' || minimumVersion == null) {
- minimumVersion = '1.4.2';
- }
-
- var retval = false;
- var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
- var matchData = minimumVersion.match(regex);
-
- if (matchData != null) {
- retval = this.versionCheck(minimumVersion + '+');
- } else {
- log('[isWebStartInstaller()] Invalid minimumVersion argument to isWebStartInstalled(): ' + minimumVersion);
- retval = this.versionCheck('1.4.2+');
- }
- return retval;
- },
-
- // obtain JPI version using navigator.mimeTypes array
- // if found, set the version to this.firefoxJavaVersion
- getJPIVersionUsingMimeType: function() {
- // Walk through the full list of mime types.
- for (var i = 0; i < navigator.mimeTypes.length; ++i) {
- var s = navigator.mimeTypes[i].type;
- // The jpi-version is the plug-in version. This is the best
- // version to use.
- var m = s.match(/^application\/x-java-applet;jpi-version=(.*)$/);
- if (m != null) {
- this.firefoxJavaVersion = m[1];
- // Opera puts the latest sun JRE last not first
- if ('Opera' != this.browserName2) {
- break;
- }
- }
- }
- },
-
- // launch the specified JNLP application using the passed in jnlp file
- // the jnlp file does not need to have a codebase
- // this requires JRE 7 or above to work
- // if machine has no JRE 7 or above, we will try to auto-install and then launch
- // (function will return false if JRE auto-install failed)
- launchWebStartApplication: function(jnlp) {
- var uaString = navigator.userAgent.toLowerCase();
-
- this.getJPIVersionUsingMimeType();
-
- // make sure we are JRE 7 or above
- if (this.isWebStartInstalled('1.7.0') == false) {
-
- // perform latest JRE auto-install
- if ((this.installJRE('1.7.0+') == false) ||
- ((this.isWebStartInstalled('1.7.0') == false))) {
- return false;
- }
- }
-
- var jnlpDocbase = null;
-
- // use document.documentURI for docbase
- if (document.documentURI) {
- jnlpDocbase = document.documentURI;
- }
-
- // fallback to document.URL if documentURI not available
- if (jnlpDocbase == null) {
- jnlpDocbase = document.URL;
- }
-
- var browser = this.getBrowser();
-
- var launchTag;
-
- if (browser == 'MSIE') {
-
- launchTag = '<' +
- 'object classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" ' +
- 'width="0" height="0">' +
- '<' + 'PARAM name="launchjnlp" value="' + jnlp + '"' + '>' +
- '<' + 'PARAM name="docbase" value="' + jnlpDocbase + '"' + '>' +
- '<' + '/' + 'object' + '>';
- } else if (browser == 'Netscape Family') {
-
- launchTag = '<' +
- 'embed type="application/x-java-applet;jpi-version=' +
- this.firefoxJavaVersion + '" ' +
- 'width="0" height="0" ' +
- 'launchjnlp="' + jnlp + '"' +
- 'docbase="' + jnlpDocbase + '"' +
- ' />';
- }
-
- if (document.body == 'undefined' || document.body == null) {
- document.write(launchTag);
- // go back to original page, otherwise current page becomes blank
- document.location = jnlpDocbase;
- } else {
- var divTag = document.createElement("div");
- divTag.id = "div1";
- divTag.style.position = "relative";
- divTag.style.left = "-10000px";
- divTag.style.margin = "0px auto";
- divTag.className ="dynamicDiv";
- divTag.innerHTML = launchTag;
- document.body.appendChild(divTag);
- }
- },
-
- createWebStartLaunchButtonEx: function(jnlp, minimumVersion) {
-
- if (this.returnPage == null) {
- // if there is an install, come back and run the jnlp file
- this.returnPage = jnlp;
- }
-
- var url = 'javascript:deployJava.launchWebStartApplication(\'' + jnlp +
- '\');';
-
- document.write('<' + 'a href="' + url +
- '" onMouseOver="window.status=\'\'; ' +
- 'return true;"><' + 'img ' +
- 'src="' + this.launchButtonPNG + '" ' +
- 'border="0" /><' + '/' + 'a' + '>');
- },
-
-
- /**
- * Outputs a launch button for the specified JNLP URL. When clicked, the
- * button will ensure that an appropriate JRE is installed and then launch
- * the JNLP application. minimumVersion is of the form #[.#[.#[_#]]], and
- * is the minimum JRE version necessary to run this JNLP application.
- * minimumVersion is optional, and if it is not specified, '1.4.2'
- * will be used.
- * If an appropriate JRE or Web Start installation is detected,
- * the JNLP application will be launched, otherwise installLatestJRE()
- * will be called.
- *
- * After installLatestJRE() is called, the script will attempt to detect
- * that the JRE installation has completed and launch the JNLP application,
- * but there are circumstances (such as when the JRE installation
- * requires a browser restart) when this cannot be fulfilled.
- */
- createWebStartLaunchButton: function(jnlp, minimumVersion) {
-
- if (this.returnPage == null) {
- // if there is an install, come back and run the jnlp file
- this.returnPage = jnlp;
- }
-
- var url = 'javascript:' +
- 'if (!deployJava.isWebStartInstalled("' +
- minimumVersion + '")) {' +
- 'if (deployJava.installLatestJRE()) {' +
- 'if (deployJava.launch("' + jnlp + '")) {}' +
- '}' +
- '} else {' +
- 'if (deployJava.launch("' + jnlp + '")) {}' +
- '}';
-
- document.write('<' + 'a href="' + url +
- '" onMouseOver="window.status=\'\'; ' +
- 'return true;"><' + 'img ' +
- 'src="' + this.launchButtonPNG + '" ' +
- 'border="0" /><' + '/' + 'a' + '>');
- },
-
-
- /**
- * Launch a JNLP application, (using the plugin if available)
- */
- launch: function(jnlp) {
- /*
- * Using the plugin to launch Java Web Start is disabled for the time being
- */
- document.location=jnlp;
- return true;
- },
-
-
- /*
- * returns true if the ActiveX or XPI plugin is installed
- */
- isPluginInstalled: function() {
- var plugin = this.getPlugin();
- if (plugin && plugin.jvms) {
- return true;
- } else {
- return false;
- }
- },
-
- /*
- * returns true if the plugin is installed and AutoUpdate is enabled
- */
- isAutoUpdateEnabled: function() {
- if (this.isPluginInstalled()) {
- return this.getPlugin().isAutoUpdateEnabled();
- }
- return false;
- },
-
- /*
- * sets AutoUpdate on if plugin is installed
- */
- setAutoUpdateEnabled: function() {
- if (this.isPluginInstalled()) {
- return this.getPlugin().setAutoUpdateEnabled();
- }
- return false;
- },
-
- /*
- * sets the preferred install type : null, online, kernel
- */
- setInstallerType: function(type) {
- this.installType = type;
- if (this.isPluginInstalled()) {
- return this.getPlugin().setInstallerType(type);
- }
- return false;
- },
-
- /*
- * sets additional package list - to be used by kernel installer
- */
- setAdditionalPackages: function(packageList) {
- if (this.isPluginInstalled()) {
- return this.getPlugin().setAdditionalPackages(
- packageList);
- }
- return false;
- },
-
- /*
- * sets preference to install Early Access versions if available
- */
- setEarlyAccess: function(enabled) {
- this.EAInstallEnabled = enabled;
- },
-
- /*
- * Determines if the next generation plugin (Plugin II) is default
- */
- isPlugin2: function() {
- if (this.isPluginInstalled()) {
- if (this.versionCheck('1.6.0_10+')) {
- try {
- return this.getPlugin().isPlugin2();
- } catch (err) {
- // older plugin w/o isPlugin2() function -
- }
- }
- }
- return false;
- },
-
- //support native DT plugin?
- allowPlugin: function() {
- this.getBrowser();
-
- // Safari and Opera browsers find the plugin but it
- // doesn't work, so until we can get it to work - don't use it.
- var ret = ('Safari' != this.browserName2 &&
- 'Opera' != this.browserName2);
-
- return ret;
- },
-
- getPlugin: function() {
- this.refresh();
-
- var ret = null;
- if (this.allowPlugin()) {
- ret = document.getElementById('deployJavaPlugin');
- }
- return ret;
- },
-
- compareVersionToPattern: function(version, patternArray,
- familyMatch, minMatch) {
- if (version == undefined || patternArray == undefined) {
- return false;
- }
- var regex = "^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:_(\\d+))?)?)?$";
- var matchData = version.match(regex);
-
- if (matchData != null) {
- var index = 0;
- var result = new Array();
-
- for (var i = 1; i < matchData.length; ++i) {
- if ((typeof matchData[i] == 'string') && (matchData[i] != ''))
- {
- result[index] = matchData[i];
- index++;
- }
- }
-
- var l = Math.min(result.length, patternArray.length);
-
- // result contains what is installed in local machine
- // patternArray is what is being requested by application
- if (minMatch) {
- // minimum version match, return true if what we have (installed)
- // is greater or equal to what is requested. false otherwise.
- for (var i = 0; i < l; ++i) {
- if (result[i] < patternArray[i]) {
- return false;
- } else if (result[i] > patternArray[i]) {
- return true;
- }
- }
- return true;
- } else {
- for (var i = 0; i < l; ++i) {
- if (result[i] != patternArray[i]) return false;
- }
- if (familyMatch) {
- // family match - return true as long as what we have
- // (installed) matches up to the request pattern
- return true;
- } else {
- // exact match
- // result and patternArray needs to have exact same content
- return (result.length == patternArray.length);
- }
- }
- } else {
- return false;
- }
- },
-
- getBrowser: function() {
-
- if (this.browserName == null) {
- var browser = navigator.userAgent.toLowerCase();
-
- log('[getBrowser()] navigator.userAgent.toLowerCase() -> ' + browser);
-
-
- // order is important here. Safari userAgent contains mozilla,
- // IE 11 userAgent contains mozilla and netscape,
- // and Chrome userAgent contains both mozilla and safari.
- if ((browser.indexOf('msie') != -1) && (browser.indexOf('opera') == -1)) {
- this.browserName = 'MSIE';
- this.browserName2 = 'MSIE';
- } else if (browser.indexOf('trident') != -1 || browser.indexOf('Trident') != -1) {
- this.browserName = 'MSIE';
- this.browserName2 = 'MSIE';
- } else if (browser.indexOf('iphone') != -1) {
- // this included both iPhone and iPad
- this.browserName = 'Netscape Family';
- this.browserName2 = 'iPhone';
- } else if ((browser.indexOf('firefox') != -1) && (browser.indexOf('opera') == -1)) {
- this.browserName = 'Netscape Family';
- this.browserName2 = 'Firefox';
- } else if (browser.indexOf('chrome') != -1) {
- this.browserName = 'Netscape Family';
- this.browserName2 = 'Chrome';
- } else if (browser.indexOf('safari') != -1) {
- this.browserName = 'Netscape Family';
- this.browserName2 = 'Safari';
- } else if ((browser.indexOf('mozilla') != -1) && (browser.indexOf('opera') == -1)) {
- this.browserName = 'Netscape Family';
- this.browserName2 = 'Other';
- } else if (browser.indexOf('opera') != -1) {
- this.browserName = 'Netscape Family';
- this.browserName2 = 'Opera';
- } else {
- this.browserName = '?';
- this.browserName2 = 'unknown';
- }
-
- log('[getBrowser()] Detected browser name:'+ this.browserName +
- ', ' + this.browserName2);
- }
- return this.browserName;
- },
-
-
- testUsingActiveX: function(version) {
- var objectName = 'JavaWebStart.isInstalled.' + version + '.0';
-
- // we need the typeof check here for this to run on FF/Chrome
- // the check needs to be in place here - cannot even pass ActiveXObject
- // as arg to another function
- if (typeof ActiveXObject == 'undefined' || !ActiveXObject) {
- log('[testUsingActiveX()] Browser claims to be IE, but no ActiveXObject object?');
- return false;
- }
-
- try {
- return (new ActiveXObject(objectName) != null);
- } catch (exception) {
- return false;
- }
- },
-
-
- testForMSVM: function() {
- var clsid = '{08B0E5C0-4FCB-11CF-AAA5-00401C608500}';
-
- if (typeof oClientCaps != 'undefined') {
- var v = oClientCaps.getComponentVersion(clsid, "ComponentID");
- if ((v == '') || (v == '5,0,5000,0')) {
- return false;
- } else {
- return true;
- }
- } else {
- return false;
- }
- },
-
-
- testUsingMimeTypes: function(version) {
- if (!navigator.mimeTypes) {
- log ('[testUsingMimeTypes()] Browser claims to be Netscape family, but no mimeTypes[] array?');
- return false;
- }
-
- for (var i = 0; i < navigator.mimeTypes.length; ++i) {
- s = navigator.mimeTypes[i].type;
- var m = s.match(/^application\/x-java-applet\x3Bversion=(1\.8|1\.7|1\.6|1\.5|1\.4\.2)$/);
- if (m != null) {
- if (this.compareVersions(m[1], version)) {
- return true;
- }
- }
- }
- return false;
- },
-
- testUsingPluginsArray: function(version) {
- if ((!navigator.plugins) || (!navigator.plugins.length)) {
- return false;
- }
- var platform = navigator.platform.toLowerCase();
-
- for (var i = 0; i < navigator.plugins.length; ++i) {
- s = navigator.plugins[i].description;
- if (s.search(/^Java Switchable Plug-in (Cocoa)/) != -1) {
- // Safari on MAC
- if (this.compareVersions("1.5.0", version)) {
- return true;
- }
- } else if (s.search(/^Java/) != -1) {
- if (platform.indexOf('win') != -1) {
- // still can't tell - opera, safari on windows
- // return true for 1.5.0 and 1.6.0
- if (this.compareVersions("1.5.0", version) ||
- this.compareVersions("1.6.0", version)) {
- return true;
- }
- }
- }
- }
- // if above dosn't work on Apple or Windows, just allow 1.5.0
- if (this.compareVersions("1.5.0", version)) {
- return true;
- }
- return false;
-
-
-
- },
-
- IEInstall: function() {
-
- location.href = constructGetJavaURL(
- ((this.returnPage != null) ?
- ('&returnPage=' + this.returnPage) : '') +
- ((this.locale != null) ?
- ('&locale=' + this.locale) : '') +
- ((this.brand != null) ? ('&brand=' + this.brand) : ''));
-
- // should not actually get here
- return false;
- },
-
- done: function (name, result) {
- },
-
- FFInstall: function() {
-
- location.href = constructGetJavaURL(
- ((this.returnPage != null) ?
- ('&returnPage=' + this.returnPage) : '') +
- ((this.locale != null) ?
- ('&locale=' + this.locale) : '') +
- ((this.brand != null) ? ('&brand=' + this.brand) : '') +
- ((this.installType != null) ?
- ('&type=' + this.installType) : ''));
-
- // should not actually get here
- return false;
- },
-
- // return true if 'installed' (considered as a JRE version string) is
- // greater than or equal to 'required' (again, a JRE version string).
- compareVersions: function(installed, required) {
-
- var a = installed.split('.');
- var b = required.split('.');
-
- for (var i = 0; i < a.length; ++i) {
- a[i] = Number(a[i]);
- }
- for (var i = 0; i < b.length; ++i) {
- b[i] = Number(b[i]);
- }
- if (a.length == 2) {
- a[2] = 0;
- }
-
- if (a[0] > b[0]) return true;
- if (a[0] < b[0]) return false;
-
- if (a[1] > b[1]) return true;
- if (a[1] < b[1]) return false;
-
- if (a[2] > b[2]) return true;
- if (a[2] < b[2]) return false;
-
- return true;
- },
-
- enableAlerts: function() {
- // reset this so we can show the browser detection
- this.browserName = null;
- this.debug = true;
- },
-
- poll: function() {
-
- this.refresh();
- var postInstallJREList = this.getJREs();
-
- if ((this.preInstallJREList.length == 0) &&
- (postInstallJREList.length != 0)) {
- clearInterval(this.myInterval);
- if (this.returnPage != null) {
- location.href = this.returnPage;
- };
- }
-
- if ((this.preInstallJREList.length != 0) &&
- (postInstallJREList.length != 0) &&
- (this.preInstallJREList[0] != postInstallJREList[0])) {
- clearInterval(this.myInterval);
- if (this.returnPage != null) {
- location.href = this.returnPage;
- }
- }
-
- },
-
- writePluginTag: function() {
- var browser = this.getBrowser();
-
- if (browser == 'MSIE') {
- document.write('<' +
- 'object classid="clsid:CAFEEFAC-DEC7-0000-0001-ABCDEFFEDCBA" ' +
- 'id="deployJavaPlugin" width="0" height="0">' +
- '<' + '/' + 'object' + '>');
- } else if (browser == 'Netscape Family' && this.allowPlugin()) {
- this.writeEmbedTag();
- }
- },
-
- refresh: function() {
- navigator.plugins.refresh(false);
-
- var browser = this.getBrowser();
- if (browser == 'Netscape Family' && this.allowPlugin()) {
- var plugin = document.getElementById('deployJavaPlugin');
- // only do this again if no plugin
- if (plugin == null) {
- this.writeEmbedTag();
- }
- }
- },
-
- writeEmbedTag: function() {
- var written = false;
- if (navigator.mimeTypes != null) {
- for (var i=0; i < navigator.mimeTypes.length; i++) {
- if (navigator.mimeTypes[i].type == this.mimeType) {
- if (navigator.mimeTypes[i].enabledPlugin) {
- document.write('<' +
- 'embed id="deployJavaPlugin" type="' +
- this.mimeType + '" hidden="true" />');
- written = true;
- }
- }
- }
- // if we ddn't find new mimeType, look for old mimeType
- if (!written) for (var i=0; i < navigator.mimeTypes.length; i++) {
- if (navigator.mimeTypes[i].type == this.oldMimeType) {
- if (navigator.mimeTypes[i].enabledPlugin) {
- document.write('<' +
- 'embed id="deployJavaPlugin" type="' +
- this.oldMimeType + '" hidden="true" />');
- }
- }
- }
- }
- }
- }; // deployJava object
-
- rv.writePluginTag();
- if (rv.locale == null) {
- var loc = null;
-
- if (loc == null) try {
- loc = navigator.userLanguage;
- } catch (err) { }
-
- if (loc == null) try {
- loc = navigator.systemLanguage;
- } catch (err) { }
-
- if (loc == null) try {
- loc = navigator.language;
- } catch (err) { }
-
- if (loc != null) {
- loc.replace("-","_")
- rv.locale = loc;
- }
- }
-
- return rv;
-}();
-
diff --git a/freeplane/resources/html/folding.css b/freeplane/resources/html/folding.css
index 78de820..8240149 100644
--- a/freeplane/resources/html/folding.css
+++ b/freeplane/resources/html/folding.css
@@ -1,6 +1,3 @@
-li { list-style: none; margin: 0; }
-p { margin: 0; }
-
span.foldopened, span.foldclosed {
font-size: xx-small;
border-width: 1;
@@ -28,12 +25,3 @@ span.foldspecial {
background: #e0e0e0;
cursor:pointer;
}
-span.l { color: red; font-weight: bold; }
-
-a.mapnode:link,
-a.mapnode:visited,
-a.mapnode:active,
-a.mapnode:hover {
- text-decoration: none; color: black;
-}
-a.mapnode:hover { background: #eeeee0; }
diff --git a/freeplane/resources/images/Freeplane_app_menu_128.png b/freeplane/resources/images/Freeplane_app_menu_128.png
new file mode 100644
index 0000000..cc9cd2c
Binary files /dev/null and b/freeplane/resources/images/Freeplane_app_menu_128.png differ
diff --git a/freeplane/resources/images/JonasBatista.jpg b/freeplane/resources/images/JonasBatista.jpg
new file mode 100644
index 0000000..4737984
Binary files /dev/null and b/freeplane/resources/images/JonasBatista.jpg differ
diff --git a/freeplane/resources/images/MapBackgroundClearAction.png b/freeplane/resources/images/MapBackgroundClearAction.png
new file mode 100644
index 0000000..0711270
Binary files /dev/null and b/freeplane/resources/images/MapBackgroundClearAction.png differ
diff --git a/freeplane/resources/images/MapBackgroundImageAction.png b/freeplane/resources/images/MapBackgroundImageAction.png
new file mode 100644
index 0000000..bc38937
Binary files /dev/null and b/freeplane/resources/images/MapBackgroundImageAction.png differ
diff --git a/freeplane/resources/images/algnCtr16.gif b/freeplane/resources/images/algnCtr16.gif
new file mode 100644
index 0000000..8d24740
Binary files /dev/null and b/freeplane/resources/images/algnCtr16.gif differ
diff --git a/freeplane/resources/images/algnCtr16_on.gif b/freeplane/resources/images/algnCtr16_on.gif
new file mode 100644
index 0000000..5b20e78
Binary files /dev/null and b/freeplane/resources/images/algnCtr16_on.gif differ
diff --git a/freeplane/resources/images/algnLft16.gif b/freeplane/resources/images/algnLft16.gif
new file mode 100644
index 0000000..3da838d
Binary files /dev/null and b/freeplane/resources/images/algnLft16.gif differ
diff --git a/freeplane/resources/images/algnLft16_on.gif b/freeplane/resources/images/algnLft16_on.gif
new file mode 100644
index 0000000..0ae3829
Binary files /dev/null and b/freeplane/resources/images/algnLft16_on.gif differ
diff --git a/freeplane/resources/images/algnRt16.gif b/freeplane/resources/images/algnRt16.gif
new file mode 100644
index 0000000..0440b66
Binary files /dev/null and b/freeplane/resources/images/algnRt16.gif differ
diff --git a/freeplane/resources/images/algnRt16_on.gif b/freeplane/resources/images/algnRt16_on.gif
new file mode 100644
index 0000000..3f90304
Binary files /dev/null and b/freeplane/resources/images/algnRt16_on.gif differ
diff --git a/freeplane/resources/images/on_selected_node.png b/freeplane/resources/images/on_selected_node.png
new file mode 100644
index 0000000..64df718
Binary files /dev/null and b/freeplane/resources/images/on_selected_node.png differ
diff --git a/freeplane/resources/images/on_selected_node_recursively.png b/freeplane/resources/images/on_selected_node_recursively.png
new file mode 100644
index 0000000..66c1c17
Binary files /dev/null and b/freeplane/resources/images/on_selected_node_recursively.png differ
diff --git a/freeplane/resources/images/on_selected_node_recursively_small.png b/freeplane/resources/images/on_selected_node_recursively_small.png
new file mode 100644
index 0000000..a012736
Binary files /dev/null and b/freeplane/resources/images/on_selected_node_recursively_small.png differ
diff --git a/freeplane/resources/images/on_selected_node_small.png b/freeplane/resources/images/on_selected_node_small.png
new file mode 100644
index 0000000..7a0c3a4
Binary files /dev/null and b/freeplane/resources/images/on_selected_node_small.png differ
diff --git a/freeplane/resources/images/on_single_node.png b/freeplane/resources/images/on_single_node.png
new file mode 100644
index 0000000..f674367
Binary files /dev/null and b/freeplane/resources/images/on_single_node.png differ
diff --git a/freeplane/resources/images/on_single_node_small.png b/freeplane/resources/images/on_single_node_small.png
new file mode 100644
index 0000000..28a8782
Binary files /dev/null and b/freeplane/resources/images/on_single_node_small.png differ
diff --git a/freeplane/resources/images/svg/on_selected_node.svg b/freeplane/resources/images/svg/on_selected_node.svg
new file mode 100644
index 0000000..8811a02
--- /dev/null
+++ b/freeplane/resources/images/svg/on_selected_node.svg
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="on_selected_node.svg"
+ inkscape:export-filename="/home/vboerchers/workspace/freeplane/freeplane/freeplane/resources/images/on_selected_node.png"
+ inkscape:export-xdpi="109.13363"
+ inkscape:export-ydpi="109.13363">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient5241"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="0"
+ id="stop5243" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5235"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5237" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5229"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5231" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3779"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3781" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5241"
+ id="linearGradient5245"
+ x1="216.67772"
+ y1="101.30356"
+ x2="258.09398"
+ y2="101.30356"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5241-8"
+ id="linearGradient5245-3"
+ x1="216.67772"
+ y1="101.30356"
+ x2="258.09399"
+ y2="101.30356"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient5241-8"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5243-1" />
+ </linearGradient>
+ <linearGradient
+ y2="101.30356"
+ x2="258.09399"
+ y1="101.30356"
+ x1="216.67772"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5308"
+ xlink:href="#linearGradient5241-8"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="179.86866"
+ inkscape:cy="938.97443"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-global="true"
+ inkscape:snap-bbox="true"
+ inkscape:snap-grids="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1025"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient5245);fill-opacity:1;stroke:#000000;stroke-opacity:1"
+ id="path3007"
+ sodipodi:cx="237.38585"
+ sodipodi:cy="101.30356"
+ sodipodi:rx="20.708128"
+ sodipodi:ry="20.708128"
+ d="m 258.09398,101.30356 a 20.708128,20.708128 0 1 1 -41.41626,0 20.708128,20.708128 0 1 1 41.41626,0 z"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ transform="matrix(0.70230973,0,0,0.70230973,72.354004,40.470537)" />
+ <path
+ transform="translate(-19.366768,29.567269)"
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient5308);fill-opacity:1"
+ id="path3007-5"
+ sodipodi:cx="237.38585"
+ sodipodi:cy="101.30356"
+ sodipodi:rx="20.708128"
+ sodipodi:ry="20.708128"
+ d="m 258.09398,101.30356 a 20.708128,20.708128 0 1 1 -41.41626,0 20.708128,20.708128 0 1 1 41.41626,0 z" />
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/on_selected_node_recursively.svg b/freeplane/resources/images/svg/on_selected_node_recursively.svg
new file mode 100644
index 0000000..29230a5
--- /dev/null
+++ b/freeplane/resources/images/svg/on_selected_node_recursively.svg
@@ -0,0 +1,262 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="on_selected_nodes_recursive.svg"
+ inkscape:export-filename="/home/vboerchers/workspace/freeplane/freeplane/on_selected_nodes_recursive.png"
+ inkscape:export-xdpi="84.649902"
+ inkscape:export-ydpi="84.649902">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient5241"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="0"
+ id="stop5243" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5235"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5237" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5229"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5231" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3779"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3781" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5241"
+ id="linearGradient5245"
+ x1="216.67772"
+ y1="101.30356"
+ x2="258.09398"
+ y2="101.30356"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5241-8"
+ id="linearGradient5245-3"
+ x1="216.67772"
+ y1="101.30356"
+ x2="258.09399"
+ y2="101.30356"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient5241-8"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5243-1" />
+ </linearGradient>
+ <linearGradient
+ y2="101.30356"
+ x2="258.09399"
+ y1="101.30356"
+ x1="216.67772"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5308"
+ xlink:href="#linearGradient5241-8"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="101.30356"
+ x2="258.09399"
+ y1="101.30356"
+ x1="216.67772"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5308-6"
+ xlink:href="#linearGradient5241-8-0"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5241-8-0"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5243-1-1" />
+ </linearGradient>
+ <linearGradient
+ y2="101.30356"
+ x2="258.09399"
+ y1="101.30356"
+ x1="216.67772"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5377"
+ xlink:href="#linearGradient5241-8-0"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="101.30356"
+ x2="258.09399"
+ y1="101.30356"
+ x1="216.67772"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5377-2"
+ xlink:href="#linearGradient5241-8-0-6"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5241-8-0-6"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5243-1-1-8" />
+ </linearGradient>
+ <linearGradient
+ y2="101.30356"
+ x2="258.09399"
+ y1="101.30356"
+ x1="216.67772"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5408"
+ xlink:href="#linearGradient5241-8-0-6"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="101.30356"
+ x2="258.09399"
+ y1="101.30356"
+ x1="216.67772"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5408-9"
+ xlink:href="#linearGradient5241-8-0-6-1"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient5241-8-0-6-1"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5243-1-1-8-7" />
+ </linearGradient>
+ <linearGradient
+ y2="101.30356"
+ x2="258.09399"
+ y1="101.30356"
+ x1="216.67772"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5439"
+ xlink:href="#linearGradient5241-8-0-6-1"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="179.86866"
+ inkscape:cy="938.97443"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-global="true"
+ inkscape:snap-bbox="true"
+ inkscape:snap-grids="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1025"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:snap-bbox-midpoints="false"
+ inkscape:snap-bbox-edge-midpoints="true"
+ inkscape:snap-object-midpoints="true" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ transform="translate(-19.366768,31.567269)"
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient5308);fill-opacity:1"
+ id="path3007-5"
+ sodipodi:cx="237.38585"
+ sodipodi:cy="101.30356"
+ sodipodi:rx="20.708128"
+ sodipodi:ry="20.708128"
+ d="m 258.09398,101.30356 a 20.708128,20.708128 0 1 1 -41.41626,0 20.708128,20.708128 0 1 1 41.41626,0 z" />
+ <path
+ transform="matrix(0.46341465,0,0,0.46341465,142.56179,64.055982)"
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient5377);fill-opacity:1"
+ id="path3007-5-0"
+ sodipodi:cx="237.38585"
+ sodipodi:cy="101.30356"
+ sodipodi:rx="20.708128"
+ sodipodi:ry="20.708128"
+ d="m 258.09398,101.30356 a 20.708128,20.708128 0 1 1 -41.41626,0 20.708128,20.708128 0 1 1 41.41626,0 z" />
+ <path
+ transform="matrix(0.46341465,0,0,0.46341465,141.84479,85.318673)"
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient5408);fill-opacity:1"
+ id="path3007-5-0-6"
+ sodipodi:cx="237.38585"
+ sodipodi:cy="101.30356"
+ sodipodi:rx="20.708128"
+ sodipodi:ry="20.708128"
+ d="m 258.09398,101.30356 a 20.708128,20.708128 0 1 1 -41.41626,0 20.708128,20.708128 0 1 1 41.41626,0 z" />
+ <path
+ transform="matrix(0.46341465,0,0,0.46341465,141.5199,106.47096)"
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient5439);fill-opacity:1"
+ id="path3007-5-0-6-1"
+ sodipodi:cx="237.38585"
+ sodipodi:cy="101.30356"
+ sodipodi:rx="20.708128"
+ sodipodi:ry="20.708128"
+ d="m 258.09398,101.30356 a 20.708128,20.708128 0 1 1 -41.41626,0 20.708128,20.708128 0 1 1 41.41626,0 z" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 218.01908,132.87083 34.55079,-21.86929"
+ id="path5462"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:4.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 251.85287,132.26423 -33.83379,0.6066 33.5089,20.54568"
+ id="path5464"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/freeplane/resources/images/svg/on_single_node.svg b/freeplane/resources/images/svg/on_single_node.svg
new file mode 100644
index 0000000..155760c
--- /dev/null
+++ b/freeplane/resources/images/svg/on_single_node.svg
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="on_single_node.svg"
+ inkscape:export-filename="/home/vboerchers/workspace/freeplane/freeplane/on_single_node.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient5241"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="0"
+ id="stop5243" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5235"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5237" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient5229"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5231" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3779"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3781" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5241"
+ id="linearGradient5245"
+ x1="216.67772"
+ y1="101.30356"
+ x2="258.09398"
+ y2="101.30356"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5241-8"
+ id="linearGradient5245-3"
+ x1="216.67772"
+ y1="101.30356"
+ x2="258.09399"
+ y2="101.30356"
+ gradientUnits="userSpaceOnUse" />
+ <linearGradient
+ id="linearGradient5241-8"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop5243-1" />
+ </linearGradient>
+ <linearGradient
+ y2="101.30356"
+ x2="258.09399"
+ y1="101.30356"
+ x1="216.67772"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5308"
+ xlink:href="#linearGradient5241-8"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.959798"
+ inkscape:cx="179.86866"
+ inkscape:cy="938.97443"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:snap-global="true"
+ inkscape:snap-bbox="true"
+ inkscape:snap-grids="false"
+ inkscape:window-width="1920"
+ inkscape:window-height="1025"
+ inkscape:window-x="-2"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Ebene 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <path
+ sodipodi:type="arc"
+ style="opacity:1;fill:url(#linearGradient5245);fill-opacity:1;"
+ id="path3007"
+ sodipodi:cx="237.38585"
+ sodipodi:cy="101.30356"
+ sodipodi:rx="20.708128"
+ sodipodi:ry="20.708128"
+ d="m 258.09398,101.30356 a 20.708128,20.708128 0 1 1 -41.41626,0 20.708128,20.708128 0 1 1 41.41626,0 z"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90" />
+ <path
+ transform="translate(-19.366768,29.567269)"
+ sodipodi:type="arc"
+ style="fill:url(#linearGradient5308);fill-opacity:1"
+ id="path3007-5"
+ sodipodi:cx="237.38585"
+ sodipodi:cy="101.30356"
+ sodipodi:rx="20.708128"
+ sodipodi:ry="20.708128"
+ d="m 258.09398,101.30356 a 20.708128,20.708128 0 1 1 -41.41626,0 20.708128,20.708128 0 1 1 41.41626,0 z" />
+ </g>
+</svg>
diff --git a/freeplane/resources/menu_aliases.properties b/freeplane/resources/menu_aliases.properties
new file mode 100644
index 0000000..0c34a42
--- /dev/null
+++ b/freeplane/resources/menu_aliases.properties
@@ -0,0 +1,14 @@
+# These are aliases for menu entries which are needed if the menu
+# structure changes. Aliases translate old script or add-on menu
+# locations to the newer scheme
+#
+# Right hand side are the actual menu keys / paths.
+# Left hand side are aliases for them
+#
+# Note: The sequence of the aliases is important! The aliases are
+# tried one after the other in the sequence as listed in this
+# file.
+main_menu_scripting/scripts=//main_menu/extras/scripting
+main_menu_scripting=//main_menu/extras
+/menu_bar=main_menu
+node_popup_scripting=node_popup/node_popup_scripting
diff --git a/freeplane/resources/translations/Resources_ar.properties b/freeplane/resources/translations/Resources_ar.properties
index fdc0b65..92b76e6 100644
--- a/freeplane/resources/translations/Resources_ar.properties
+++ b/freeplane/resources/translations/Resources_ar.properties
@@ -119,7 +119,6 @@ icon_wizard=\u0633\u062D\u0631\u064A
icon_xmag=\u0646\u0642\u0627\u0634
icon_yes=\u0645\u0647\u0645
IconSelectionPlugin.tooltip=<html>Here you can select an icon using a subwindow.</html>
-import=\u0627\u0633\u062A\u064A\u0631\u0627\u062F
ImportBranchAction.text=\u0641\u0631\u0639...
ImportExplorerFavoritesAction.text=\u062E\u0635\u0627\u0626\u0635 \u0627\u0644\u0645\u0633\u062A\u0643\u0634\u0641
ImportFolderStructureAction.text=\u0628\u0646\u064A\u0629 \u0627\u0644\u0645\u062C\u0644\u062F...
@@ -129,7 +128,6 @@ increase_branch_font_size=\u062E\u0637 \u0643\u0628\u064A\u0631
IncreaseNodeFontAction.text=\u062E\u0637 \u0643\u0628\u064A\u0631
ItalicAction.text=\u0645\u0627\u0626\u0644
italicise_branch=\u0645\u0627\u0626\u0644
-JoinNodesAction.text=\u0631\u0628\u0637 \u0627\u0644\u0639\u0646\u0627\u0635\u0631
locking_failed_by_open=Locking of the map {0} failed. Opening as read-only.
locking_failed_by_save_as=Locking of the map {0} failed. Action Save As aborted.
locking_old_lock_removed=The map {0} was locked by the user {1}. The lock has been removed because it is old.
@@ -385,7 +383,7 @@ simplyhtml.replaceYes=\u0646\u0639\u0645
simplyhtml.styleLabel=\u0646\u0645\u0637
simplyhtml.uLineLabel=\u062A\u062D\u062A\u0647 \u062E\u0637
simplyhtml.undoLabel=\u062A\u0631\u0627\u062C\u0639
-split=\u0641\u0635\u0644
+split=&\u0641\u0635\u0644
style=\u0646\u0645\u0637
svg=SVG[translate me]
TimeListAction.text=\u0639\u0631\u0636 \u0642\u0627\u0626\u0645\u0629 \u062C\u062F\u0648\u0644\u0629 \u0627\u0644\u0648\u0642\u062A
diff --git a/freeplane/resources/translations/Resources_ca.properties b/freeplane/resources/translations/Resources_ca.properties
index 068c147..410fd7f 100644
--- a/freeplane/resources/translations/Resources_ca.properties
+++ b/freeplane/resources/translations/Resources_ca.properties
@@ -124,7 +124,7 @@ error_creating_directory=No es pot crear el directori per a exportar.
ExecuteScripts.text=Scripts[translate me]
export_pdf_text=Format de Document Portable(PDF)
export_svg_text=Gr\u00E0fic Vectorial Escalable (SVG)
-ExportAction.text=&Exporta mapa\u2026
+ExportAction.text=Exporta mapa\u2026
ExportBranchToHTMLAction.text=Branca com HTML
ExportPdf.text=Com a PDF...
ExportSvg.text=Com a SVG...
@@ -134,6 +134,7 @@ ExportToImage.png.text=Com a PNG...
ExportToOoWriter.text=Com a un document de l'Open Office...
ExportToOoWriter.tooltip=Unfolded nodes form the structure, folded nodes the content of the document.
extension_menu=Estil F\u00EDsic
+extras=Eines
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=PMF
file=Fitxer
@@ -152,6 +153,7 @@ FoldOneLevelAction.tooltip=<html>Contreu un nivell els nodes seleccionats.</html
font=Lletra
FontFamilyAction.text=fam\u00EDlia de la lletra
FontSizeAction.text=mida de la lletra
+format=Formata
format_menu_edge_styles=Estils dels cantells
format_menu_edge_widths=Gruix dels cantells
FormatCopy.text=Copia el format
@@ -245,7 +247,6 @@ increase_branch_font_size=Lletra m\u00E9s gran
IncreaseNodeFontAction.text=Lletra m\u00E9s gran
ItalicAction.text=It\u00E0liques
italicise_branch=Posa-ho en it\u00E0liques
-JoinNodesAction.text=Uneix els nodes
less_than_two_selected_nodes=Cal que seleccioneu al menys dos nodes per obtenir enlla\u00E7os.
link_not_available_any_more=L'enlla\u00E7 ja no \u00E9s v\u00E0lid. El node que hi havia fou esborrat.
link_not_found=Enlla\u00E7 {0} no trobat.
@@ -258,12 +259,7 @@ map_already_exists=Aquest mapa ja existeix. Voleu substituir-lo?
map_corrupted=El mapa \u00E9s corrupte. Voleu veure'n els detalls?
map_locked_by_open=El mapa {0} est\u00E0 sent editat per l''usuari {1}. Obrint-lo com a nom\u00E9s lectura.
map_locked_by_save_as=El mapa {0} est\u00E0 sent editat per l''usuari {1}. No s''ha pogut Desar com.
-menu_extras=Eines
-menu_file_import=Importa
-menu_format=Formata
menu_insert=Insereix
-menu_navigate=Navega
-menu_view=Veure
mindmap=Mapa
mindmaps=Mapes
mindmaps_desc=Mapes (*.mm)
@@ -274,6 +270,7 @@ modes=Modalitats
ModesMenuAction.MindMap.text=Mind Map Editor[translate me]
most_recent_files=Fitxers m\u00E9s recents
MoveToRootAction.text=Mou-re a l'Arrel
+navigate=Navega
NavigationNextMapAction.text=Mapa Seg\u00FCent
NavigationPreviousMapAction.text=Mapa anterior
new_mindmap=Crea un Mindmap
@@ -545,7 +542,7 @@ simplyhtml.replaceYes=S\u00ED
simplyhtml.styleLabel=Estil
simplyhtml.uLineLabel=Subratllat
simplyhtml.undoLabel=Desf\u00E9s
-split=Divideix
+split=&Divideix
SplitNode.text=Split Node[translate me]
style=Estil
svg=SVG[translate me]
@@ -574,6 +571,7 @@ url_load_error=No s'ha pogut corregat el mapa des de l'adre\u00E7a:
user_defined_zoom=Definit per l'usuari.
user_defined_zoom_status_bar=Canviant la visi\u00F3 al valor d''ampliaci\u00F3 definit de l''usuari: {0}%.
user_zoom=Factor d'ampliaci\u00F3 d'impressi\u00F3 (0.0 - 2.0):
+view=Veure
width=Amplada
yes=S\u00ED
ZoomInAction.text=Apropa't
diff --git a/freeplane/resources/translations/Resources_cs.properties b/freeplane/resources/translations/Resources_cs.properties
index 1fd2248..f1c6086 100644
--- a/freeplane/resources/translations/Resources_cs.properties
+++ b/freeplane/resources/translations/Resources_cs.properties
@@ -35,6 +35,7 @@ actual_node_styles=Podm\u00EDn\u011Bn\u00E9 styly uzlu byly aplikov\u00E1ny na u
add=&P\u0159idat
AddConnectorAction.text=P\u0159ipojit
AddElementaryConditionAction.text=P\u0159idat
+AddExecutionLinkAction.text=P\u0159idat odkaz pro sp\u0161t\u011Bn\u00ED p\u0159\u00EDkazu OS...
AddLocalLinkAction.text=P\u0159idat lok\u00E1ln\u00ED hyperlink
AddMenuItemLinkAction.text=P\u0159idat hyperlink na polo\u017Eku menu...
AddOnDetailsPanel.authored.by=Podle {0}
@@ -96,6 +97,7 @@ attribute_delete_value=Smazat tuto hodnotu
attribute_font_size_tooltip=Velikost p\u00EDsma atributu
attribute_list_box_label_text=Existuj\u00EDc\u00ED hodnoty
attribute_name=N\u00E1zev atributu
+attribute_name_or_value=Jm\u00E9no nebo hodnota atributu
attribute_replace=Nahradit s
attribute_top=V\u0161echny zn\u00E1m\u00E9 atributy pro nahran\u00E9 mapy
attribute_value=Hodnota atributu
@@ -137,14 +139,17 @@ attributes_visible_tooltip=Vybrat viditeln\u00E9
automatic_layout=Automatick\u00E9 rozlo\u017Een\u00ED
automatic_layout_disabled=zak\u00E1z\u00E1no
automatically_save_message=Mapa byla automaticky ulo\u017Eena (se jm\u00E9nem souboru {0}) ...
+AutomaticEdgeColor.FOR_COLUMNS=pro sloupce
+AutomaticEdgeColor.FOR_LEVELS=pro \u00FArovn\u011B
AutomaticEdgeColorHookAction.text=Automatick\u00E9 barva hrany
AutomaticLayout.ALL=pro v\u0161echny uzly
AutomaticLayout.HEADINGS=pro jin\u00E9 ne\u017E koncov\u00E9 uzly
AutomaticLayout.level=\u00DArove\u0148 {0}
AutomaticLayout.level.root=Ko\u0159en
-AutomaticLayoutAction.text=Automatick\u00E9 rozlo\u017Een\u00ED
+AutomaticLayoutAction.text=Prov\u00E9st automatick\u00E9 rozlo\u017Een\u00ED
AutomaticLayoutAction.tooltip=<html>Oprav\u00ED rozlo\u017Een\u00ED mapy. <br>Prvn\u00ED \u00FArove\u0148 je \u010Dern\u00E1, druh\u00E1 modr\u00E1, atd.</html>
AutomaticLayoutControllerAction.ALL.text=pro v\u0161echny uzly
+AutomaticLayoutControllerAction.COLUMNS.text=pro sloupce
AutomaticLayoutControllerAction.HEADINGS.text=pro jin\u00E9 ne\u017E koncov\u00E9 uzly
AutomaticLayoutControllerAction.null.text=zak\u00E1z\u00E1no
BackAction.text=Zp\u011Bt
@@ -161,10 +166,12 @@ branch=V\u011Btev
browse=Proch\u00E1zet...
calendar_attributes_panel=Kalend\u00E1\u0159 a atributy
calendar_panel=Kalend\u00E1\u0159
+can_not_clone_encrypted_node=Za\u0161ifrovan\u00E9 uzly nelze klonovat
can_not_connect_to_info_server=Nelze se p\u0159ipojit k informa\u010Dn\u00EDmu serveru
can_not_delete_predefined_style=Nelze odstranit p\u0159eddefinovan\u00FD styl
can_not_delete_root_style=Nelze odstranit ko\u0159enov\u00FD styl
can_not_delete_style_group=Nelze odstranit skupinu styl\u016F
+can_not_encrypt_cloned_node=Za\u0161ifrovan\u00E9 uzly nelze klonovat
can_not_save_key_set=Nelze ulo\u017Eit sadu kl\u00E1vesov\u00FDch zkratek
cancel=Storno
CancelAction.text=Storno
@@ -172,6 +179,7 @@ cannot_add_parent_diff_parents=V\u0161echny uzly mus\u00ED m\u00EDt stejn\u00FD
cannot_add_parent_to_root=Ko\u0159enov\u00FD uzel nem\u016F\u017Ee b\u00FDt p\u0159id\u00E1n pod nov\u00E9ho rodi\u010De.
cannot_delete_root=Ko\u0159enov\u00FD uzel nelze odstranit.
cannot_join_nodes_with_children=Nelze spojit uzly, kter\u00E9 maj\u00ED poduzly
+cannot_move_into_child_node=Nelze p\u0159esunout do dce\u0159inn\u00E9ho uzlu
cannot_move_to_child=Nelze p\u0159esunout uzel do jednoho ze sv\u00FDch pod\u0159\u00EDzen\u00FDch uzl\u016F.
CenterAction.text=St\u0159ed
CenterSelectedNodeAction.text=Centrovat vybran\u00FD uzel
@@ -196,6 +204,7 @@ choose_node_background_color=Vyberte barvu pozad\u00ED uzlu:
choose_node_color=Vyberte barvu uzlu:
ClearLinkAnchorAction.text=Vymazat kotva
ClearLinkAnchorAction.tooltip=<html>Vymazat d\u0159\u00EDve nastaven\u00E9 ukotven\u00ED</html>
+CloneAction.text=Vlo\u017Eit klonovan\u00FD uzel
close_btn=&Zav\u0159\u00EDt
CloseAction.text=Zav\u0159\u00EDt
CloudAction.text=Oblak
@@ -216,8 +225,8 @@ connector_shapes=Tvar konektoru
ConnectorColorAction.text=Barva konektoru...
CopyAction.text=Kop\u00EDrovat
CopyAction.tooltip=Kop\u00EDrovat vybranou v\u011Btev
-CopyAttributes.text=Kop\u00EDrovat &atributy
-CopyIDAction.text=Kop\u00EDrovat I&D uzlu
+CopyAttributes.text=Kop\u00EDrovat atributy
+CopyIDAction.text=Kop\u00EDrovat ID uzlu
CopyMapStylesAction.text=Kop\u00EDrovat styl mapy z...
CopyNodeURIAction.text=Kop\u00EDrovat URI uzlu
copyright=Copyright \u00A9 2000-2014 Freeplane t\u00FDm a dal\u0161\u00ED
@@ -333,7 +342,7 @@ export_failed=Export selhal
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
export_using_xslt=Export z Freeplane
-ExportAction.text=&Exportovat...
+ExportAction.text=Exportovat...
ExportBranchAction.text=P\u0159esunete v\u011Btve do nov\u00E9 mapy...
ExportBranchToHTMLAction.text=Exportovat v\u011Btev do HTML
exported_file={0} soubor
@@ -354,6 +363,7 @@ ExternalImageChangeAction.text=Zm\u011Bnit obr\u00E1zek...
ExternalImageRemoveAction.text=Odstranit obr\u00E1zek
ExtractLinkFromTextAction.text=P\u0159ev\u00E9st odkaz v r\u00E1mci textu
ExtractLinkFromTextAction.tooltip=Nastavit odkaz z adresy n textu uzlu
+extras=N\u00E1stroje
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=FAQ
file=Soubor
@@ -373,7 +383,7 @@ FileProperties_NodeSelectionCount=Po\u010Det vybran\u00FDch uzl\u016F:
FileProperties_TotalFilteredCount=Po\u010Det uzl\u016F, kter\u00E9 vyhovuj\u00ED filtru:
FileProperties_TotalLeafCount=Celkov\u00FD po\u010Det koncov\u00FDch uzl\u016F:
FileProperties_TotalNodeCount=Celkov\u00FD po\u010Det uzl\u016F:
-FilePropertiesAction.text=Stat&istika mapy...
+FilePropertiesAction.text=Statistika mapy...
FileRevisionsDialog.cancel=&Storno
FileRevisionsDialog.file_last_modified=\u010Casov\u00E9 raz\u00EDtko
FileRevisionsDialog.file_name=Soubor
@@ -384,7 +394,7 @@ FileRevisionsDialog.question=Nalezeny revize {0}
FileRevisionsDialog.restore=Obn&oven\u00ED
FileRevisionsDialog.restore.tooltip=Nahradit {0} za {1}
FileRevisionsDialog.title=Revize souboru
-filter=Filtr
+filter=F&iltr
filter_add=P\u0159idat
filter_and=A
filter_any_text=J\u00E1dro, detaily nebo pozn\u00E1mku
@@ -434,11 +444,9 @@ filter_selected_node_view=Aktu\u00E1ln\u011B vybran\u00E9 uzly
filter_selected_node_view_snapshot=Ulo\u017Een\u00FD v\u00FDb\u011Br
filter_style=Styl
filter_time=Datum
-FilterComposerDialog.save=&Ulo\u017Eit
filters_not_loaded=Nelze na\u010D\u00EDst filtr, soubor po\u0161kozen
find_what=Naj\u00EDt co
FindAction.text=Naj\u00EDt...
-FirstGroupNodeAction.text=Souhrnn\u00FD uzel (za\u010D\u00E1tek skupiny)
fit_map_to_page=Na jednu str\u00E1nku
fit_map_to_page_height=P\u0159izp\u016Fsobit &v\u00FD\u0161ku na jednu str\u00E1nku
fit_map_to_page_width=P\u0159izp\u016Fsobit & \u0161\u00ED\u0159ku na jednu str\u00E1nku
@@ -454,6 +462,7 @@ FollowLinkAction.text=N\u00E1sledovat odkaz
font=p\u00EDsmo
FontFamilyAction.text=P\u00EDsmo
FontSizeAction.text=Velikost p\u00EDsma
+format=Form\u00E1t
format_invalid_pattern=Neolatn\u00FD vzor
format_menu_cloud_shapes=P\u0159idejte mrak nebo zm\u011Bnte styl
format_menu_edge_styles=Styly hran
@@ -647,7 +656,7 @@ IconSelectionPlugin.text=V\u00FDb\u011Br ikony...
IconSelectionPlugin.tooltip=<html>Pomoc\u00ED n\u00E1sleduj\u00EDc\u00EDho okna m\u016F\u017Eete vybrat ikonu.</html>
image_covertLink=P\u0159ev\u00E9st odkaz na obr\u00E1zek
ImageFlavorHandler=Obr\u00E1zek (samostatn\u00FD soubor)
-import=Import
+import=Importovat
import_linked_branch_no_link=Vybran\u00FD uzel nem\u00E1 \u017E\u00E1dn\u00FD odkaz, ze kter\u00E9ho se d\u00E1 importovat.
ImportAction.text=Import
ImportBranchAction.text=Importovat v\u011Btev...
@@ -667,18 +676,18 @@ invalid_url_msg=Nelze vytvo\u0159it platnou URL pro {0}
ItalicAction.text=Kurz\u00EDva
italicise_branch=Nastavit kurz\u00EDvu
java_version=Java verze: {0}
-JoinNodesAction.text=Spojit uzly
latex_editor=Editace LaTeX vzorce
-LatexDeleteLatexAction.text=Odstran\u011Bn\u00ED LaTe&X vzorce
-LatexEditLatexAction.text=Editace &LaTeX vzorce...
+LatexDeleteLatexAction.text=Odstran\u011Bn\u00ED LaTeX vzorce
+LatexEditLatexAction.text=Editace LaTeX vzorce...
LatexInsertLatexAction.msg1=<html>Pokou\u0161\u00EDte se vlo\u017Eit <i>zastaral\u00E9</i> LaTeX vzorce. <br/>Nov\u00FD zp\u016Fsob, jak vytvo\u0159it text LaTeXu, je pops\u00E1n na t\u00E9to str\u00E1nce:</html>
-LatexInsertLatexAction.text=P\u0159id\u00E1n\u00ED &LaTeX vzorce...
+LatexInsertLatexAction.text=P\u0159id\u00E1n\u00ED LaTeX vzorce...
latexPatternFormat=LaTeX
less_than_two_selected_nodes=Mus\u00EDte vybrat alespo\u0148 dva uzly, aby se mohly vytvo\u0159it odkazy.
license=Licence: GPL 2 nebo nov\u011Bj\u0161\u00ED
link_error=Nespr\u00E1vn\u00E9 odkaz "{0}" nebyl na\u010Dten
link_not_available_any_more=Odkaz ji\u017E nen\u00ED platn\u00FD. Uzel byl pravd\u011Bpodobn\u011B smaz\u00E1n.
link_not_found=Link {0} nenalezen.
+links=Odkaz
load=&Nahr\u00E1t
load_accelerator_presets=Nahr\u00E1t
LoadAcceleratorPresetsAction.textPatterns.text=Text Patterns[translate me]
@@ -726,8 +735,8 @@ ManageAddOnsDialog.tab.manage.themes=T\u00E9mata
ManageAddOnsDialog.tab.manage.themes.tooltip=Spr\u00E1va nainstalovan\u00FDch motiv\u016F
ManageAddOnsDialog.tab.manage.tooltip=Spr\u00E1va nainstalovan\u00FDch dopl\u0148k\u016F
ManageAddOnsDialog.visit.addon.page=Nav\u0161tivte str\u00E1nku dopl\u0148k\u016F...
-ManageConditionalStylesAction.text=&Spr\u00E1va podm\u00EDn\u011Bn\u00FDch styl\u016F mapy
-ManageNodeConditionalStylesAction.text=Spr\u00E1v&a podm\u00EDn\u011Bn\u00FDch styl\u016F uzlu
+ManageConditionalStylesAction.text=Spr\u00E1va podm\u00EDn\u011Bn\u00FDch styl\u016F mapy
+ManageNodeConditionalStylesAction.text=Spr\u00E1va podm\u00EDn\u011Bn\u00FDch styl\u016F uzlu
map_already_exists=Soubor mapy u\u017E existuje. Chcete ho p\u0159epsat?
map_corrupted=Mapa je poni\u010Den\u00E1. Chcete zobrazit detaily?
map_load_error=Nelze na\u010D\u00EDst mapu {0}
@@ -746,10 +755,6 @@ menu_displayAttributes=Atributy uzlu
menu_encryption=Ochrana heslem
menu_error=Chyba v u\u017Eivatelsky definovan\u00E9 struktu\u0159e menu {0}:\n{1}\nRu\u0161\u00EDm
menu_extensions=Roz\u0161\u00ED\u0159en\u00ED uzlu
-menu_extras=N\u00E1stroje
-menu_file_import=Importovat
-menu_filter=F&iltr
-menu_format=Form\u00E1t
menu_group=Skupina uzl\u016F
menu_hoverView=N\u00E1strojov\u00E9 tipy
menu_iconByCategory=Ikona podle kategorie...
@@ -757,26 +762,20 @@ menu_iconView=Ikony
menu_image=Obr\u00E1zek
menu_insert=Vlo\u017Eit
menu_latex_formula=LaTeX vzorce
-menu_links=Odkaz
menu_manageStyles=&Spravovat styly
menu_moveNode=P\u0159esun a t\u0159\u00EDdit
-menu_navigate=Navigovat
menu_newNode=Nov\u00FD uzel
menu_node=Uzel
menu_node_features=Vlastnosti &uzlu
menu_nodes=&Uzly
menu_nodeView=J\u00E1dro uzlu
-menu_notes=Pozn\u00E1mka
menu_noteView=Pozn\u00E1mky
menu_openmaps=Mapy
-menu_progress=Ikona pr\u016Fb\u011Bhu (%)
menu_remove_icons=Odstranit ikony
menu_removeAttribute=Odstranit atribut
menu_select=Vyberte
menu_time=Organizace \u010Dasu
menu_title=J\u00E1dro uzlu
-menu_toolbars=N\u00E1strojov\u00E9 li\u0161ty
-menu_view=Zobrazit
menu_viewmode=Nastaven\u00ED zobrazen\u00ED
MenuUtils.invalid_menuitem={0} nen\u00ED platn\u00E1 polo\u017Eka kl\u00ED\u010De.
mindmap=Mapa
@@ -798,6 +797,7 @@ ModesMenuAction.MindMap.text=Mind Map Editor[translate me]
most_recent_files=Posledn\u00ED soubory
MoveToRootAction.text=P\u0159esunout do ko\u0159ene
NameConditionAction.text=Nastavit n\u00E1zev
+navigate=Navigovat
NavigationNextMapAction.text=Dal\u0161\u00ED mapa
NavigationPreviousMapAction.text=P\u0159ede\u0161l\u00E1 mapa
new=&Nov\u00FD
@@ -818,11 +818,10 @@ NewerFileRevisionsFoundDialog.question=Nalezeny nov\u011Bj\u0161\u00ED revize {0
NewerFileRevisionsFoundDialog.restore=Obn&ovit
NewerFileRevisionsFoundDialog.restore.tooltip=Nahradit {0} za {1}
NewerFileRevisionsFoundDialog.title=Nalezeny nov\u011Bj\u0161\u00ED revize soubor\u016F!
-NewFreeNodeAction.text=Nov\u00FD voln\u00FD uzel
NewLevelStyleAction.text=P\u0159idat \u00FArove\u0148 stylu
newmap.install.addon.question={0} se zd\u00E1 b\u00FDt bal\u00ED\u010Dek s dopl\u0148kem\nChcete jej nainstalovat?\n(Zvolte "Ne" pro norm\u00E1ln\u00ED spu\u0161t\u011Bn\u00ED.)
newmap.install.addon.title=Nainstalovat dopln\u011Bk?
-NewMapAction.text=&Nov\u00E1 mapa
+NewMapAction.text=Nov\u00E1 mapa
NewMapViewAction.text=Nov\u00FD pohled na mapu
NewParentNode.text=Nov\u00FD nad\u0159azen\u00FD uzel
NewParentNode.tooltip=<html>V\u0161echny vybran\u00E9 uzly budou p\u0159i\u0159azen\u00E9 nov\u00E9mu nad\u0159azen\u00E9mu uzlu.</html>
@@ -861,13 +860,13 @@ NodeListAction.tooltip=Uk\u00E1\u017Ee v\u0161echny uzly jako prohledateln\u00FD
NodeShapeAction.bubble.text=Bublina
NodeShapeAction.fork.text=Rozdvojen\u00ED
NodeUpAction.text=Uzel nahoru
-NodeWidthAction.text=Nastav hranice \u0161\u00ED\u0159ky bu\u0148ky
nonboldify_branch=Zru\u0161it tu\u010Dn\u00E9
nonitalicise_branch=Zru\u0161it kurz\u00EDvu
normal=Norm\u00E1ln\u00ED
not_saved_for_image_error=Mapa mus\u00ED b\u00FDt ulo\u017Eena p\u0159ed t\u00EDm, ne\u017E budete moci vybrat obr\u00E1zek spr\u00E1vcem soubor\u016F
not_saved_for_link_error=Mapa mus\u00ED b\u00FDt ulo\u017Eena p\u0159ed nastaven\u00EDm odkazu pomoc\u00ED v\u00FDb\u011Bru souboru
note_window_location=Um\u00EDst\u011Bn\u00ED pozn\u00E1mkov\u00E9ho panelu
+notes=Pozn\u00E1mka
ok=OK
OKAction.text=OK
OnlineReference.text=Online mapy dokumentace
@@ -1021,8 +1020,6 @@ OptionPanel.nodefontname=P\u00EDsmo uzlu
OptionPanel.nodefontsize=Velikost p\u00EDsma uzlu
OptionPanel.nodeformat=Form\u00E1t
OptionPanel.nodenumbering=\u010C\u00EDslov\u00E1n\u00ED uzl\u016F
-OptionPanel.nodeshape=Style uzlu
-OptionPanel.nodeshape.tooltip=Style uzlu
OptionPanel.nodetext=Text uzlu
OptionPanel.nodetext.tooltip=Zde m\u016F\u017Eete definovat test uzlu. Dosavadn\u00ED text se odstran\u00ED, kdy\u017E je takov\u00FD vzor aplikov\u00E1n.
OptionPanel.nothing=Nic
@@ -1195,6 +1192,7 @@ preferences=Nastaven\u00ED
PrintDirectAction.text=Tisk
printing_settings=Nastaven\u00ED tisku
PrintPreviewAction.text=N\u00E1hled tisku...
+progress=Ikona pr\u016Fb\u011Bhu (%)
PropertyAction.text=Mo\u017Enosti ...
QuitAction.text=Konec
read_only=Pouze ke \u010Dten\u00ED
@@ -1208,6 +1206,7 @@ repair_link=Opravit odkaz
repair_link_question=Nem\u016F\u017Eu na\u010D\u00EDst odkazovanou mapu. Chcete opravit odkaz manu\u00E1ln\u011B?
replace=Nahradit
ResetNodeLocationAction.text=Resetovat pozici
+save=&Ulo\u017Eit
save_failed=Pokus ulo\u017Eit soubor mapy {0} selhal.
save_unsaved=Ulo\u017Eit n\u00E1sleduj\u00EDc\u00ED mapu?
SaveAction.text=Ulo\u017Eit
@@ -1407,7 +1406,7 @@ simplyhtml.valignTop=nahoru
simplyhtml.wholeWordsOnly=Hledat pouze cel\u00E1 slova
SortNodes.text=Set\u0159\u00EDdit potomky
SortNodes.tooltip=Abecedn\u011B set\u0159\u00EDd\u00ED v\u0161echny potomky uzlu.
-split=Rozd\u011Blit
+split=&Rozd\u011Blit
SplitNode.text=Rozd\u011Blen\u00ED uzlu
SplitNode.tooltip=<html>Uzel je rozd\u011Blen</html>
style=Styl
@@ -1422,6 +1421,7 @@ ToggleFoldedAction.text=(Roz)slo\u017Eit
ToggleLeftToolbarAction.text=P\u0159epnout lev\u00FD panel
ToggleMenubarAction.text=P\u0159epnout Menu
ToggleToolbarAction.text=P\u0159epnout Panel n\u00E1stroj\u016F
+toolbars=N\u00E1strojov\u00E9 li\u0161ty
undefined_error=Nastala neo\u010Dek\u00E1van\u00E1 chyba. Pros\u00EDme, pokuste se zaslat report o chyb\u011B.
underline=Podtr\u017Een\u00ED
underlined=Podtrhnut\u00E9
@@ -1441,6 +1441,7 @@ user_defined_zoom_status_bar=M\u011Bn\u00EDm p\u0159ibl\u00ED\u017Een\u00ED lupo
user_template_dir=U\u017Eivatelsk\u00E9 \u0161ablony
user_zoom=Faktor lupy p\u0159i tisku (0.0 - 2.0):
version_up_to_date=Pou\u017E\u00EDv\u00E1te nejnov\u011Bj\u0161\u00ED verzi programu
+view=Zobrazit
ViewLayoutTypeAction.OUTLINE.text=Zobrazit jako osnovu
WebDocuAction.text=Webov\u00E1 dokumentace
width=\u0160\u00ED\u0159ka
diff --git a/freeplane/resources/translations/Resources_da.properties b/freeplane/resources/translations/Resources_da.properties
index 3f075cf..828c661 100644
--- a/freeplane/resources/translations/Resources_da.properties
+++ b/freeplane/resources/translations/Resources_da.properties
@@ -35,6 +35,7 @@ actual_node_styles=Knudepunkt betingede formater anvendes p\u00E5 knudepunkt
add=Tilf\u00F8j
AddConnectorAction.text=Tilsluttet
AddElementaryConditionAction.text=Tilf\u00F8j
+AddExecutionLinkAction.text=Tilf\u00F8j hyperlink til udf\u00F8relse af en OS kommando...
AddLocalLinkAction.text=Tilf\u00F8j lokalt Hyperlink
AddMenuItemLinkAction.text=Tilf\u00F8j link til menupunkt\u2026
AddOnDetailsPanel.authored.by=Af {0}
@@ -96,6 +97,7 @@ attribute_delete_value=Slet denne v\u00E6rdi
attribute_font_size_tooltip=Attribut skriftst\u00F8rrelse
attribute_list_box_label_text=Eksisterende v\u00E6rdier
attribute_name=Attributnavn
+attribute_name_or_value=Attributnavn eller v\u00E6rdi
attribute_replace=Erstat med
attribute_top=Alle kendte attributter for de indl\u00E6ste MindMaps
attribute_value=Attributv\u00E6rdi
@@ -137,14 +139,21 @@ attributes_visible_tooltip=Valgte synlige
automatic_layout=Automatisk layout
automatic_layout_disabled=deaktiveret
automatically_save_message=Mindmap blev automatisk gemt (med filnavnet {0}) \u2026
+AutomaticEdgeColor.FOR_BRANCHES=for grene
+AutomaticEdgeColor.FOR_COLUMN=for kolonne
+AutomaticEdgeColor.FOR_COLUMNS=for kolonner
+AutomaticEdgeColor.FOR_LEVELS=for niveauer
+AutomaticEdgeColor.ON_BRANCH_CREATION=Ved skabelse af gren
AutomaticEdgeColorHookAction.text=Automatisk kantfarve
AutomaticLayout.ALL=for alle knudepunkter
+AutomaticLayout.COLUMNS=for kolonner
AutomaticLayout.HEADINGS=for ikke blade knudepunkter
AutomaticLayout.level=Niveau {0}
AutomaticLayout.level.root=Roden
AutomaticLayoutAction.text=Anvend niveau typografier
AutomaticLayoutAction.tooltip=<html>Fasts\u00E6tter layoutet af MindMap.<br>Det f\u00F8rste niveau er sort, det andet bl\u00E5, osv.</html>
AutomaticLayoutControllerAction.ALL.text=for alle knudepunkter
+AutomaticLayoutControllerAction.COLUMNS.text=for kolonner
AutomaticLayoutControllerAction.HEADINGS.text=for ikke blad knudepunkter
AutomaticLayoutControllerAction.null.text=deaktiveret
BackAction.text=G\u00E5 bagl\u00E6ns
@@ -161,17 +170,20 @@ branch=Forgrening
browse=Gennemse\u2026
calendar_attributes_panel=Kalender og attributter
calendar_panel=Kalender
+can_not_clone_encrypted_node=Kan ikke klone krypterede noder
can_not_connect_to_info_server=Kan ikke forbinde til information server
can_not_delete_predefined_style=Kan ikke slette foruddefineret stil
can_not_delete_root_style=Kan ikke slette rod typografi
can_not_delete_style_group=Kan ikke slette stilgruppe
+can_not_encrypt_cloned_node=Kan ikke kryptere klonede noder
can_not_save_key_set=Kan ikke gemme genvejstaster
cancel=&Annuller
-CancelAction.text=&Annuller
+CancelAction.text=Annuller
cannot_add_parent_diff_parents=Alle knudepunkter skal have samme overknudepunkt for at bruge denne funktion.
cannot_add_parent_to_root=Rod knudepunkt kan ikke tilf\u00F8jes til en ny overknudepunkt.
cannot_delete_root=Rodknudepunkt kan ikke slettes eller klippes.
cannot_join_nodes_with_children=Kan ikke forbinde knudepunkter med underknudepunkter
+cannot_move_into_child_node=Kan ikke flytte til underordnet node
cannot_move_to_child=Kan ikke flytte et knudepunkt til en af dens underknudepunkter.
CenterAction.text=Centrer
CenterSelectedNodeAction.text=Centrer valgte knudepunkt
@@ -196,8 +208,10 @@ choose_node_background_color=V\u00E6lg knudepunktsbaggrundsfarve:
choose_node_color=V\u00E6lg knudepunktsfarve:
ClearLinkAnchorAction.text=Ryd link anker
ClearLinkAnchorAction.tooltip=<html>slet tidligere angivet knudepunktsanker</html>
+CloneAction.text=Inds\u00E6t som klon
close_btn=Luk
CloseAction.text=Luk aktuelle MindMap
+cloud_shapes=Skyfigurer
CloudAction.text=Tilf\u00F8j/fjern sky(standard)
CloudColorAction.text=Skyfarve\u2026
CloudShapeAction.ARC.text=Bue
@@ -220,7 +234,7 @@ CopyAttributes.text=Kopier attributter
CopyIDAction.text=Kopiere knudepunkt ID
CopyMapStylesAction.text=Kopier MindMap typografi fra\u2026
CopyNodeURIAction.text=Kopiere knudepunkt URL
-copyright=Copyright \u00A9 2000-2014 Freeplane holdet og andre
+copyright=Copyright \u00A9 2000-2016 Freeplane holdet og andre
CopySingleAction.text=Kopiere knudepunkt (enkelt)
CopySingleAction.tooltip=Kopier kun det valgte knudepunkt
CopyStyleExtensionsAction.text=Kopiere udvidelser fra stil knudepunkt
@@ -236,12 +250,13 @@ decrease_branch_font_size=Mindre skrifttype
DecreaseNodeFontAction.text=Mindre skrifttype
default=Standard
DefaultColorAction.text=Standardfarve
+defaultstyle.attributes=Attributter
defaultstyle.details=Detaljer
defaultstyle.floating=Flydende knudepunkt
defaultstyle.note=Note
delete=Slet
delete_child=Slet barn
-DeleteAction.text=Fjern n&ode
+DeleteAction.text=Fjern node
DeleteConditionAction.text=Slet
DeleteDetailsAction.text=Fjern knudepunkt detaljer
DeleteLevelStyleAction.text=Fjern niveau typografi
@@ -263,7 +278,9 @@ edge=Kant
edge_is_formatted_by_style=Kantformat styres af stil. Rediger relaterede typografier hvis det er n\u00F8dvendigt.
edge_style=Kant stil
edge_width=Kantbredde
+edge_widths=Kantbredder
EdgeColorAction.text=Kant farve\u2026
+EdgeProperties=Kantegenskaber
EdgeStyleAction.bezier.text=J\u00E6vnt bue (bezier)
EdgeStyleAction.bezier.tooltip=<html>Vis kanten som en j\u00E6vn kurve.</html>
EdgeStyleAction.hide_edge.text=Skjul kant
@@ -306,7 +323,9 @@ EditScript=Rediger skript\u2026
EditStylesAction.text=Rediger typografier
EncryptedMap.text=Nyt beskyttet (krypteret) MindMap\u2026
EncryptedMap.tooltip=Nyt beskyttet MindMap
+encryption=Kryptering
enter_base_url=Freeplane vil inds\u00E6tte relative links. Indtast basis URL.
+enter_command=Indtast kommando
enter_condition_name=Indtast nyt betingelsesnavn
enter_confirms=Enter bekr\u00E6fter
enter_keyset_name=Indtaste navn for genvejstaster
@@ -320,6 +339,8 @@ error_applying_template=Fejl ved anvendelse af XSL template.
error_creating_directory=Kan ikke oprette skuffen til eksport.
error_in_template=Fejl i standard MapMind skabelon {0}. Pr\u00F8v at fjerne filen.
errornumber={0} fejl
+ExecuteScript.available_modes_tooltip={0} er tilg\u00E6ngelig for
+ExecuteScript.script=Script
ExecuteScriptError.text=Fejl ved k\u00F8rsel af skript\n{0}
ExecuteScriptForAllNodes.text=Udf\u00F8r alle skripts
ExecuteScriptForSelectionAction.text=Udf\u00F8r valgte knudepunkts skripts
@@ -333,7 +354,7 @@ export_failed=Eksport mislykkedes
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
export_using_xslt=Freeplane eksport
-ExportAction.text=&Eksporter kort\u2026
+ExportAction.text=Eksporter kort\u2026
ExportBranchAction.text=Flyt forgrening til ny MindMap\u2026
ExportBranchToHTMLAction.text=Forgrening som HTML
exported_file={0} fil
@@ -354,8 +375,9 @@ ExternalImageChangeAction.text=Skift billede\u2026
ExternalImageRemoveAction.text=Fjern billede
ExtractLinkFromTextAction.text=Konverter link indefra tekst
ExtractLinkFromTextAction.tooltip=Angiv hyperlink fra adressen i knudepunktsteksten
+extras=V\u00E6rkt\u00F8jer
f_button_unassigned=<ingen handling >
-FaqOpenURLAction.text=Ofte Stillede Sp\u00F8rgsm\u00E5l
+FaqOpenURLAction.text=FAQ (ofte stillede sp\u00F8rgsm\u00E5l)
file=&Filer
file_already_exists=Filen {0} eksisterer allerede. \u00D8nsker du at overskrive den?
file_not_found=Filen {0} findes ikke
@@ -434,11 +456,16 @@ filter_selected_node_view=For nuv\u00E6rende valgte knudepunkter
filter_selected_node_view_snapshot=Gemt markering
filter_style=Typografi
filter_time=Datofilter
-FilterComposerDialog.save=&Gem
+FilterCondition=Filterbetingelser
+filterConditions=Brugerdefineret filtre
+filterConditions.noActions=Ingen navngivne filtre
filters_not_loaded=Filteret kunne ikke indl\u00E6ses, fil beskadiget
+find=S\u00F8g
find_what=Find hvad
FindAction.text=S\u00F8g\u2026
-FirstGroupNodeAction.text=Sammenfattende knudepunkt (begynder gruppen)
+FindNextAction.text=Find n\u00E6ste
+FindPreviousAction.text=Find forrige
+fit_background_to_page=Tilpas baggrundsbillede til \u00E9n side
fit_map_to_page=Tilpas til \u00E9n side
fit_map_to_page_height=Tilpas h\u00F8jde til \u00E9n side
fit_map_to_page_width=Tilpas bredde til \u00E9n side
@@ -454,6 +481,7 @@ FollowLinkAction.text=F\u00F8lg link
font=Skrifttype
FontFamilyAction.text=Skrifttype familie
FontSizeAction.text=Skriftst\u00F8rrelse
+format=Formater
format_invalid_pattern=Ikke et gyldig m\u00F8nster
format_menu_cloud_shapes=Tilf\u00F8j Sky eller \u00E6ndre stil
format_menu_edge_styles=Kant stil
@@ -488,6 +516,7 @@ freeplane_reverted=Freeplane_Gendannet_
FreeplaneHelpStarter.text=Hj\u00E6lp...
FreeplaneHelpStarter.tooltip=Freeplane udviddet hj\u00E6lp
GettingStartedAction.text=Tutorial
+goto=G\u00E5 til
GotoLinkNodeAction.text=G\u00E5 til Link
GotoNodeAction.text=G\u00E5 til knudepunkt med ID\u2026
GrabKeyDialog.common.cancel=Annuller
@@ -643,19 +672,21 @@ IconProgressIconUpAction.text=\u00D8g fremskridt
IconProgressIconUpAction.tooltip=Reducerer/inds\u00E6t udviklingsikon (0%-> 25%-> 50%-> 75%-> 100% + OK).
IconProgressRemoveAction.text=Fjern udviklingsikon
IconProgressRemoveAction.tooltip=Fjerner udvikllingsikoner og udvidede udvikllingsikon.
+icons=Ikoner
IconSelectionPlugin.text=V\u00E6lg icon...
IconSelectionPlugin.tooltip=<html>Her kan du v\u00E6lge en icon via et undervindue.</html>
image_covertLink=Konvertere link til billede
ImageFlavorHandler=Billede (brug separat fil)
-import=Importer
+import=Import
import_linked_branch_no_link=Det valgte knudepunkthar ingen link at importere fra.
ImportAction.text=Import
ImportBranchAction.text=Forgrening\u2026
ImportExplorerFavoritesAction.text=Explorer favoritter\u2026
ImportFolderStructureAction.text=Mappestruktur\u2026
ImportLinkedBranchAction.text=Linked forgrening
-ImportLinkedBranchWithoutRootAction.text=Sammenk\u00E6det gren &uden rod\u2026
+ImportLinkedBranchWithoutRootAction.text=Sammenk\u00E6det gren uden rod\u2026
ImportMindmanagerFiles.text=MindManager X5 MindMap\u2026
+ImportXmlFile.text=Importer XML-fil
increase_branch_font_size=St\u00F8rre skrifttype
IncreaseNodeFontAction.text=St\u00F8rre skrifttype
internal_error_tooltip=Der opstod interne fejl. Klik for at \u00E5bne den seneste logfil log.0 for flere detaljer.
@@ -667,20 +698,27 @@ invalid_url_msg=Kunne ikke oprette gyldig URL for {0}
ItalicAction.text=Kursiv
italicise_branch=Kursiv\u00E9r
java_version=Java-version: {0}
-JoinNodesAction.text=Forbind knudepunkter
+lastOpenedMaps=Seneste MindMap
+lastOpenedMaps.noActions=Ingen kort i historik
latex_editor=Rediger LaTeX formel
-LatexDeleteLatexAction.text=Fjern LaTe&X-formular
-LatexEditLatexAction.text=Redig\u00E9r &LaTeX-formular...
+LatexDeleteLatexAction.text=Fjern LaTeX-formular
+LatexEditLatexAction.text=Redig\u00E9r LaTeX-formular...
LatexInsertLatexAction.msg1=<html>Du fors\u00F8ger at inds\u00E6tte en <i>\u00E6ldre</i> LaTeX formel.<br/>Den nye m\u00E5de at skabe LaTeX tekst/formler er beskrevet p\u00E5 denne side:</html>
LatexInsertLatexAction.msg2=<html>Kort sagt: <ul><li>brug "\\latex" pr\u00E6fiks i knudepunktsteksten eller </li><li><i> panel Vis-> Egenskaber</i>, derefter<i>Core tekst ->Format->Latex</i></li></ul></html>
-LatexInsertLatexAction.text=Tilf\u00F8j &LaTeX-formular...
+LatexInsertLatexAction.text=Tilf\u00F8j LaTeX-formular...
latexPatternFormat=LaTeX
+LengthUnits.cm=cm
+LengthUnits.in=tommer
+LengthUnits.mm=mm
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=V\u00E6lg mindst to knudepunkt for at f\u00E5 links.
license=Licens: GPL 2 eller senere
license_text=<html>Dette program er fri software. Du kan redistribuere og/eller<br>modificere det under de betingelser der er angivet i GNU General Public License,<br>som udgivet af Free Software Foundation; enten version 2<br>af licensen eller (efter eget valg) enhver senere version.<br><br>Dette program distribueres i h\u00E5b om at det vil vise sig nyttigt,<br>men UDEN NOGEN FORM FOR GARANTI; selv uden de underforst\u00E5ede garantier<br>omkring SALGBARHED eller EGNETHED TIL ET BESTEM [...]
link_error=Linket "{0}" er ukorrekt og blev ikke indl\u00E6st
link_not_available_any_more=Linket er ikke l\u00E6ngere gyldigt, da knudepunktet er blevet slettet.
link_not_found=Linket {0} blev ikke fundet.
+links=Link
load=Indl\u00E6s
load_accelerator_presets=Indl\u00E6s
LoadAcceleratorPresetsAction.textPatterns.text=Tekstm\u00F8nstre
@@ -690,6 +728,7 @@ locking_old_lock_removed=MindMap {0} blev l\u00E5st af brugeren {1}. L\u00E5sen
long_node_changed_cancel=Du har \u00E6ndret knudepunktet. Slet \u00E6ndringer?
long_node_changed_submit=Du har \u00E6ndret knudepunktet. Slet \u00E6ndringer?
lots_of_links_warning=Du er ved at oprette en masse links til samme knudepunkt. Vil du oprette disse links?
+main_menu=Menu
main_resource_directory=Installation ressourcer: {0}
MainView.errorUpdateText=Fejl ved indstilling af teksten for f\u00F8lgende input: {0}.
MakeLinkFromAnchorAction.text=Lav link fra anker
@@ -728,15 +767,20 @@ ManageAddOnsDialog.tab.manage.themes=Temaer
ManageAddOnsDialog.tab.manage.themes.tooltip=Administrer installerede temaer
ManageAddOnsDialog.tab.manage.tooltip=Administrer installerede tilf\u00F8jelsesprogrammer
ManageAddOnsDialog.visit.addon.page=Bes\u00F8g tilf\u00F8jelse side\u2026
-ManageConditionalStylesAction.text=Ad&ministrer betingede typografier for MindMap
-ManageNodeConditionalStylesAction.text=&Administrer betingede typografier for knudepunkter
+ManageConditionalStylesAction.text=Administrer betingede typografier for MindMap
+ManageNodeConditionalStylesAction.text=Administrer betingede typografier for knudepunkter
map_already_exists=MindMap findes allerede. Vil du overskrive?
+map_background=Kort baggrund
+map_background_image=Baggrundsbillede
map_corrupted=MindMap beskadiget. Se detaljer?
map_load_error=Kunne ikke indl\u00E6se MindMap {0}
map_locked_by_open=MindMap {0} er allerede ved at blive redigeret af brugeren {1}. \u00C5ben som skrivebeskyttet.
map_locked_by_save_as=MindMap {0} redigeres af brugeren {1}. Gem som handling afbrudt.
map_not_saved=MindMap er ikke gemt endnu.
+MapBackgroundClearAction.text=Ryd
MapBackgroundColorAction.text=MindMap baggrundsfarve
+MapBackgroundImageAction.text=Baggrundsbillede\u2026
+maps=Mindmaps
MaxNodeWidth.text=Angiv maksimal knudepunktsbredde
menu_applyStyle=Anvend typografi
menu_attributes=Atributter
@@ -748,10 +792,6 @@ menu_displayAttributes=Knudepunktsattributter
menu_encryption=Kodeords-beskyttelse
menu_error=Fejl i brugerdefineret menustruktur {0}:\n{1}\nafbryder
menu_extensions=Knudepunkt udvidelser
-menu_extras=V\u00E6rkt\u00F8jer
-menu_file_import=Import
-menu_filter=Filter
-menu_format=Formater
menu_group=Knudepunkt gruppe
menu_hoverView=V\u00E6rkt\u00F8jstip
menu_iconByCategory=Ikon efter kategori\u2026
@@ -759,26 +799,20 @@ menu_iconView=Ikoner
menu_image=Billede
menu_insert=Inds\u00E6t
menu_latex_formula=LaTeX formel
-menu_links=Link
menu_manageStyles=&Administrer typografier
menu_moveNode=Flyt og sorter
-menu_navigate=Naviger
menu_newNode=Nyt knudepunkt
menu_node=Knudepunkt
menu_node_features=Kn&udepunktsgenskaber
menu_nodes=&Knudepunkter
menu_nodeView=Knudepunkt kerne
-menu_notes=Note
menu_noteView=Noter
menu_openmaps=MindMaps
-menu_progress=Udviklingsikon (%)
menu_remove_icons=Fjern ikoner
menu_removeAttribute=Fjern attributten
menu_select=V\u00E6lg
menu_time=Tidsstyring
menu_title=Knudepunkt kerne
-menu_toolbars=V\u00E6rkt\u00F8jslinjer
-menu_view=Vis
menu_viewmode=Se indstillinger
MenuUtils.invalid_menuitem={0} er ikke en gyldig menu element n\u00F8gle.
mindmap=MindMap
@@ -792,14 +826,17 @@ mode_File=Filtilstand
mode_MindMap=MindMap tilstand
mode_na=Tilstand ikke tilg\u00E6ngelig
mode_status=Visning skiftet {0} Visning
+mode_StyleMap=Stil redigering
mode_title=Freeplane - {0} Visning
modes=Tilstand
ModesMenuAction.Browse.text=MindMap browser
ModesMenuAction.File.text=Filh\u00E5ndtering
ModesMenuAction.MindMap.text=MindMap editor
most_recent_files=Seneste MindMap
+MoveAction.text=Flyt
MoveToRootAction.text=G\u00E5 til roden
NameConditionAction.text=Angiv navn
+navigate=Naviger
NavigationNextMapAction.text=N\u00E6ste MindMap
NavigationPreviousMapAction.text=Forrige MindMap
new=&Ny
@@ -820,11 +857,11 @@ NewerFileRevisionsFoundDialog.question=Fundet nyere udgaver af {0}!
NewerFileRevisionsFoundDialog.restore=Gendan
NewerFileRevisionsFoundDialog.restore.tooltip=Erstat {0} med {1}
NewerFileRevisionsFoundDialog.title=Fundet nyere udgaver af {0}!
-NewFreeNodeAction.text=Ny frit knudepunkt
+NewFreeNodeAction.text=Nye flydende node
NewLevelStyleAction.text=Tilf\u00F8j niveau typografi
newmap.install.addon.question={0} er tilsyneladende en add-on pakke.\nVil du installere den?\n(V\u00E6lg "Nej" for normal \u00E5ben.)
newmap.install.addon.title=Installer tilf\u00F8jelse?
-NewMapAction.text=&Ny MindMap
+NewMapAction.text=Ny MindMap
NewMapViewAction.text=Ny MindMap visning
NewParentNode.text=Nyt overknudepunkt
NewParentNode.tooltip=<html>Alt valgt bliver sendt til en ny for\u00E6ldre.</html>
@@ -852,7 +889,7 @@ node_location_help=Tr\u00E6k \u00E6ndrer knudepunkt placering, ctrl+tr\u00E6kke
node_selector=Knudepunktsudvalg
node_selector_message=Dobbeltklik for at v\u00E6lge knudepunkt
node_styles=Knudepunkt typografi
-NodeBackgroundColorAction.text=&Knudepunkt baggrundsfarve\u2026
+NodeBackgroundColorAction.text=Knudepunkt baggrundsfarve\u2026
NodeColorAction.text=Knudepunktsfarve\u2026
NodeColorBlendAction.text=Blandingsfarven
NodeDownAction.text=Flyt knudepunkt
@@ -861,17 +898,30 @@ NodeExtensions.RemoveNodeExtensions=Fjern knudepunkt udvidelser
NodeListAction.text=S\u00F8g og erstat\u2026
NodeListAction.tooltip=Viser alle knudepunkter som en s\u00F8gbar liste med filteregenskaber.
NodeShapeAction.bubble.text=Boble
-NodeShapeAction.fork.text=&Forgrening
+NodeShapeAction.circle.text=Cirkel
+NodeShapeAction.fork.text=Forgrening
+NodeShapeAction.hexagon.text=Sekskant
+NodeShapeAction.hexagon2.text=Sekskant2
+NodeShapeAction.narrow_hexagon.text=Lille sekskant
+NodeShapeAction.oval.text=Oval
+NodeShapeAction.rectangle.text=Rektangel
+NodeShapeAction.small_bubble.text=Lille boble
+NodeShapeAction.small_wide_hexagon.text=Smal sekskant
+NodeShapeAction.wide_hexagon.text=Bred sekskant
NodeUpAction.text=Flyt knudepunkt (s\u00F8skende op)
-NodeWidthAction.text=S\u00E6t gr\u00E6nse for knudepunkt bredde
nonboldify_branch=Fjern fremh\u00E6v
nonitalicise_branch=Fjern kursiv
normal=Normal
not_saved_for_image_error=MindMap skal gemmes, f\u00F8r du kan angive et billede med filh\u00E5ndtering
not_saved_for_link_error=MindMap skal gemmes, f\u00F8r du kan angive et link med filh\u00E5ndtering
note_window_location=Notepanel placering
+notes=Note
+NotificationOptions.CLOSE=Luk
+NotificationOptions.REMIND_ME_LATER=P\u00E5mind senere
+NotificationOptions.REMOVE_REMINDER=Fjern p\u00E5mindelse
+NotificationOptions.SELECT_NODE=G\u00E5 til p\u00E5mindelse
ok=&OK
-OKAction.text=&OK
+OKAction.text=OK
OnlineReference.text=Online MindMap dokumentation
open_asMindMap=MindMap
OpenAction.text=\u00C5ben gemt MindMap\u2026
@@ -898,6 +948,7 @@ OptionPanel.always_load_last_maps.tooltip=\u00C5ben seneste filer fastsat af ove
OptionPanel.always_save_folding=Altid
OptionPanel.always_save_folding_state=Gem altid folde ind/ud status
OptionPanel.always_save_folding_state.tooltip=Hvis markeret, t\u00E6ller hver status\u00E6ndring som en \u00E6ndring og minder dig om at gemme.
+OptionPanel.always_show_less_than_N_nodes_after_load=Udfold nogle noder
OptionPanel.always_unfold_all_after_load=Fold alle ud
OptionPanel.antialias=Antialias
OptionPanel.antialias.tooltip=<html>Bestemmer kvaliteten p\u00E5 MindMap. Mere antialias kr\u00E6ver mere tid.</html>
@@ -926,6 +977,7 @@ OptionPanel.center_selected_node=Centrer valgt knudepunkt automatisk
OptionPanel.check_updates_automatically=Tjek for opdateringer ved programstart
OptionPanel.childpattern=Underknudepunkt m\u00F8nster
OptionPanel.childpattern.tooltip=Det valgte m\u00F8nster bliver anvendt p\u00E5 alle underknudepunktet.
+OptionPanel.circle=Cirkel
OptionPanel.clear_all_setters=Skift alt
OptionPanel.clear_all_setters.tooltip=enabler eller disabler alle \u00E6ndrings indikationer.
OptionPanel.cloud=Sky
@@ -935,6 +987,8 @@ OptionPanel.combined=Kombineret
OptionPanel.compare_as_number=Sammenlign som tal
OptionPanel.convert_to_current_version=<html>Konverter automatisk MindMaps fra \u00E6ldre Freeplane versioner<br>til den aktuelle version?</html>
OptionPanel.convert_to_current_version.tooltip=<html>Kun for meget store MindMaps, der ikke beh\u00F8ver at blive konverteret <br>(dette er ekspertviden) kan de \u00E5bnes uden konvertering.</html>
+OptionPanel.copyFormatToNewSibling=Kopier format til nye s\u00F8skende
+OptionPanel.copyFormatToNewSiblingIncludesIcons=Kopier format med ikoner
OptionPanel.cs=Tjekkisk/\u010Desky
OptionPanel.cut_nodes_without_question=Klip knudepunkter uden bekr\u00E6ftelse?
OptionPanel.cut_nodes_without_question.tooltip=Hvis afkrydsningsfeltet er sat klippes knudepunnkter uden bekr\u00E6ftelse. Kan medf\u00F8re tab af information, hvis der trykkes ved en fejl.
@@ -956,6 +1010,7 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>For Windows ( "" te
OptionPanel.default_browser_command_windows_nt=Standard Browser kommando Windows NT
OptionPanel.default_browser_command_windows_nt.tooltip=<html>For Windows ( "" tegnene er n\u00F8dvendige p\u00E5 grund af links der har "=" i deres URL).</html>
OptionPanel.default_charset=Tegnset
+OptionPanel.default_save_dir=Standard gemmemappe
OptionPanel.Defaults=Standarder
OptionPanel.delete_automatic_saves_at_exit=Slet automatiske gem n\u00E5 der lukkes
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Hvis filerne skal slettes automaisk ved en normal nedlukning af Freeplane, s\u00E5 s\u00E6t f\u00F8lgende variabel til sand</html>
@@ -1004,6 +1059,7 @@ OptionPanel.export_icons_in_html.tooltip=<html> Fort\u00E6l om HTML eksporteret
OptionPanel.exported_image_resolution_dpi=Eksporterede billedopl\u00F8sning (i DPI)
OptionPanel.Files=Filer
OptionPanel.first=F\u00F8rst
+OptionPanel.fit_to_viewport=Tilpad baggrundsbillede til vindue
OptionPanel.fold_on_click_inside=Fold ved klik
OptionPanel.foldingsymbolwidth=Foldesymbolets bredde
OptionPanel.foldingsymbolwidth.tooltip=<html>Bredde p\u00E5 foldings markerings cirklen</html>
@@ -1020,6 +1076,8 @@ OptionPanel.groovy_editor_font=Skrifttype for Groovy Highlighting Editor
OptionPanel.groovy_editor_font.tooltip=Brug 'Dialog' eller 'Monospaced' Hvis du har brug for unicode tegn!
OptionPanel.groovy_editor_font_size=Skriftst\u00F8rrelsen for Groovy Syntax Highlighting Editor
OptionPanel.gtk=Gtk
+OptionPanel.hexagon=Sekskant
+OptionPanel.hexagon2=Sekskant2
OptionPanel.hide_edge=Skjul kant
OptionPanel.highlight_formulas=Fremh\u00E6v formler
OptionPanel.horizontal=Vandret
@@ -1042,8 +1100,10 @@ OptionPanel.id=Indonesisk/Bahasa Indonesia
OptionPanel.IGNORE=G\u00F8r intet
OptionPanel.il__enter_confirms_by_default=Enter bekr\u00E6fter som standard
OptionPanel.image_cache=for billeder
+OptionPanel.indentationUsesTabsInTextOutput=Brug fanerne i tekstoutput
OptionPanel.it=Italiensk/Italiano
OptionPanel.ja=Japansk/\u65E5\u672C\u8BED
+OptionPanel.JoinNodesAction.textSeparators=Tekstseparator
OptionPanel.key_type_action=Ved tastetryk
OptionPanel.Keystrokes=Tastetryk
OptionPanel.ko=Koreansk/\uD55C\uAD6D\uC5B4 (\u97D3\u570B\u8A9E), \uC870\uC120\uB9D0 (\u671D\u9BAE\u8A9E)
@@ -1084,6 +1144,7 @@ OptionPanel.max_shortened_text_length=Maksimalt forkortet tekstbredde
OptionPanel.metal=Metal
OptionPanel.min_node_width=Min knudepunktsbredde
OptionPanel.motif=Motif
+OptionPanel.narrow_hexagon=Smal sekskant
OptionPanel.nb=Norsk Bokm\u00E5l/Norsk bokm\u00E5l
OptionPanel.never_save_folding=Aldrig
OptionPanel.nl=Hollandsk, flamsk/Nederlands, Vlaams
@@ -1101,8 +1162,7 @@ OptionPanel.nodeformat=Format
OptionPanel.nodeformat.tooltip=<html>Tekstudskiftning og/eller formatering: <ul><li><em>skabelon udvidelse</em> (<tt>%s</tt> er den oprindelige tekst), fx <tt>Pasp\u00E5: %s</tt> <li><em>formatering af datoer og tal</em> - Se eksemplerne i udv\u00E6lgelsesboksen</ul></html>
OptionPanel.nodenumbering=Knudepunkt nummerering
OptionPanel.nodenumbering.tooltip=Tilf\u00F8jer l\u00F8benummer (f.eks. 1.3.1) til knudepunktsteksten.
-OptionPanel.nodeshape=Knudepunkt typografi
-OptionPanel.nodeshape.tooltip=<html>Typografi beskriver den ydre form af et knudepunkt. <br>Mulige v\u00E6rdier: <br><table border="1"> <tr><td>forgrening:</td> <td>uden omgivende boks,</td></tr> <tr><td>boble:</td> <td>knudepunkt med en omkringliggende rektangel,</td></tr> <tr><td>som for\u00E6lder:</td> <td>tager stil fra det overordnede knudepunkt<br>eller rod knudepunktstandard typografi for rodknudepunkt,</td></tr> <tr><td>kombineret:</td> <td>boble sammenfoldet knudepunkt, ellers f [...]
+OptionPanel.nodeshape=Knudepunkt figur
OptionPanel.nodetext=Core tekst
OptionPanel.nodetext.tooltip=Her kan du definere den knudepunktsteksten. Den tidligere tekst slettes n\u00E5r s\u00E5dan et m\u00F8nster er anvendt.
OptionPanel.nothing=Ingenting
@@ -1118,9 +1178,14 @@ OptionPanel.org.freeplane.plugin.bugreport.denied=Send aldrig
OptionPanel.org.freeplane.plugin.bugreport.userid=Valgfri id skal sendes
OptionPanel.outline_hgap=Vandret afstand
OptionPanel.outline_vgap=Lodret afstand
+OptionPanel.oval=Oval
OptionPanel.paint_connectors_behind=Mal forbindelser bag knudepunkter
OptionPanel.parse_data=Genkend input af tal og dato og klokkesl\u00E6t
OptionPanel.parse_data.tooltip=Fors\u00F8ger at fortolke dato, dato og klokkesl\u00E6t og nummer indtastning og anvende et standard formater. Eksempler: 100,000.00, 12/31, 12/31/99, 1999-12-31 og 1999-12-31 23:59
+OptionPanel.parse_formulas=Genkender formlerne
+OptionPanel.parse_formulas.tooltip=Parse formler p\u00E5 noder, der starter med '=': Se http://www.freeplane.org/wiki/index.php/Formulas.
+OptionPanel.parse_latex=Genkend LaTeX
+OptionPanel.parse_latex.tooltip=Genkend LaTeX formler efter format eller pr\u00E6fiks: Se http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane.
OptionPanel.PASTE_HTML=Inds\u00E6t som HTML
OptionPanel.PASTE_PLAIN_TEXT=Inds\u00E6t som almindelig tekst
OptionPanel.path_property_may_not_be_empty=Sti egenskab kan ikke v\u00E6re tom! \u00C6ndring er gendannet.
@@ -1138,9 +1203,13 @@ OptionPanel.printonwhitebackground.tooltip=<html>Brug altid hvid baggrund for ud
OptionPanel.pt_BR=Portugisisk (Brasilien)/Portugu\u00EAs (Brasil)
OptionPanel.pt_PT=Portugisisk (Portugal)Portugu\u00EAs (Portugal)
OptionPanel.RECT=Rektangel
+OptionPanel.rectangle=Rektangel
OptionPanel.relative=Relativ
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"Sp\u00F8rg" vil sp\u00F8rge dig (brug i tvivl).<br>"Ja" viser rich text-editoren.<br>"Nej" vises teksteditor.</html>
OptionPanel.remind_use_rich_text_in_new_nodes=Bruge RTF for indsatte knudepunktet
+OptionPanel.remindersBlink=P\u00E5mindelser blink
+OptionPanel.remindersShowNotifications=P\u00E5mindelser viser meddelelsespopups
+OptionPanel.remindersStandardDelay=P\u00E5mindelse forsinkelse
OptionPanel.remove_notes_without_question=Fjern noter uden at sp\u00F8rge?
OptionPanel.remove_notes_without_question.tooltip=Hvis dette afkrydsningsfelt er fjernet noter tilh\u00F8rer de markerede knudepunktet\n uden bekr\u00E6ftelse. Dette kan medf\u00F8re tab af oplysninger, hvis der trykkes p\u00E5 uden hensigt.
OptionPanel.resources_use_default_font_for_notes_too=Brug standardskrifttype for noter
@@ -1151,6 +1220,7 @@ OptionPanel.ROUND_RECT=Rund rektangel
OptionPanel.ru=Russisk/\u0420\u0443\u0441\u0441\u043A\u0438\u0439
OptionPanel.save_folding=Gemme foldning
OptionPanel.save_folding_if_map_is_changed=Hvis MindMap er \u00E6ndret
+OptionPanel.save_last_visited_node=Gemme sidste position p\u00E5 kortet
OptionPanel.save_modification_times=Gem redigeringstidspunkter
OptionPanel.script_classpath=Skript classpath: yderligere mapper, der indeholder klasser og/eller JARs (Se v\u00E6rkt\u00F8jstip)
OptionPanel.script_classpath.tooltip=<html>A liste af JARs og/eller mapper skal tilf\u00F8jes classpath skripts og formler.<br>Brug ; (Windows) eller : (Linux, Mac) til at adskille poster.<br>Mapper der skal scannes for JARs og .class filer.<br>Stier, som ikke er absolutte betragtes i forhold til Freeplane brugerbibliotek.<br>Hvis du indstiller classpath skal du ogs\u00E5 tillade l\u00E6seadgang!</html>
@@ -1215,6 +1285,7 @@ OptionPanel.separator.other_defaults=Andre standarter
OptionPanel.separator.others=Andre tastebindinger
OptionPanel.separator.outline_view=Dispositionsvisning
OptionPanel.separator.patterns=M\u00F8nstre
+OptionPanel.separator.reminderOptions=P\u00E5mindelsesindstillinger
OptionPanel.separator.RichTextEditor=Rich-Text editor
OptionPanel.separator.root_node_appearance=Rod knudepunkt format
OptionPanel.separator.save=Gem
@@ -1226,6 +1297,7 @@ OptionPanel.separator.selection_method=Metode for valg
OptionPanel.separator.single_instance_mode=Enkelt program forekomst
OptionPanel.separator.size_limits=St\u00F8rrelsesgr\u00E6nse
OptionPanel.separator.spelling=Stavekontrol
+OptionPanel.separator.SplitToWordsAction=Opdel node til ord
OptionPanel.separator.status=Statuslinje
OptionPanel.separator.tooltip=V\u00E6rkt\u00F8jstip tidsintetval
OptionPanel.separator.undo=Fortryd
@@ -1234,9 +1306,13 @@ OptionPanel.set_property_text=\u00C6ndre
OptionPanel.set_property_text.tooltip=Check for at \u00E6ndre denne stil egenskab
OptionPanel.setscript=\u00C6ndre?
OptionPanel.setscript.tooltip=Et skript kan v\u00E6re forbundet til typografien.
+OptionPanel.shape_horizontal_margin=Vandret margin
+OptionPanel.shape_vertical_margin=Lodret margin
OptionPanel.sharp_bezier=Skarp bezier
OptionPanel.sharp_linear=Skarp line\u00E6r
+OptionPanel.shouldCenterSmallMaps=Centrer sm\u00E5 kort
OptionPanel.show_icon_for_attributes=Vis ikon for atributter
+OptionPanel.show_less_than_N_nodes_by_default_after_load=Indl\u00E6s fra kort eller udfold nogle noder
OptionPanel.show_node_tooltips=Vis v\u00E6rkt\u00F8jstip
OptionPanel.show_note_icons=Vis note ikoner
OptionPanel.show_styles_in_tooltip=F\u00E5 vist knudepunkt typografi i v\u00E6rkt\u00F8jstip
@@ -1253,12 +1329,19 @@ OptionPanel.single_instance_force.tooltip=Undg\u00E5 en anden forekomst, selv om
OptionPanel.sk=Slovakisk/sloven\u010Dina
OptionPanel.sl=Slovensk/sloven\u0161\u010Dina
OptionPanel.slow_scroll_selected_node=Langsom rulning til valgte knudepunkt
+OptionPanel.small_bubble=Lille boble
+OptionPanel.small_wide_hexagon=Lille sekskant
OptionPanel.spelling_opt_case_sensitive=Versalf\u00F8lsom
OptionPanel.spelling_opt_ignore_all_caps_words=Ignorere alle ord med store bogstaver.
OptionPanel.spelling_opt_ignore_capitalization=Ignorer ord der begynder med versal
OptionPanel.spelling_opt_ignore_words_with_numbers=Ignorer ord med tal
OptionPanel.spelling_opt_suggestions_limit_dialog=Maksimale antal forslag i dialogen
OptionPanel.spelling_opt_suggestions_limit_menu=Maksimale antal forslag i menuen
+OptionPanel.SplitToWordsAction.auxiliaryWordList=ekstra ordliste
+OptionPanel.SplitToWordsAction.charactersAcceptedInWord=tegn i ord
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=lad oprindelige node v\u00E6re tom
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=nodenummer i r\u00E6kken
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=gem oprindelig tekst som detaljer
OptionPanel.sr=Serbisk/\u0441\u0440\u043F\u0441\u043A\u0438
OptionPanel.standard_template=Standard skabelonfil
OptionPanel.standardbackgroundcolor=Standard baggrundsfarve
@@ -1283,21 +1366,25 @@ OptionPanel.structured_icon_toolbar=Struktureret ikon v\u00E6rkt\u00F8jslinie
OptionPanel.summary=Resum\u00E9
OptionPanel.sv=Svensk/svenska
OptionPanel.text.use_ctrl_key=Brug 'Tildel genvej' fra v\u00E6rkt\u00F8js-menuen
+OptionPanel.textalignment=Tekstjustering
OptionPanel.time_for_automatic_save=Tid for automatisk gem
OptionPanel.time_for_automatic_save.tooltip=<html> tiden imellem to p\u00E5 hinanden f\u00F8lgende automatiske gemninger (i msek): For at afstille automatisk gem s\u00E6t dette tal til 2000000000.</html>
OptionPanel.time_for_delayed_selection=Tid for forsinket valg
OptionPanel.time_for_delayed_selection.tooltip=<html>Valg af tidsforsinkelse p\u00E5 knudepunktet n\u00E5r musen er over (i msek). \u00C6ndre denne v\u00E6rdi til 1, hvis du \u00F8nsker direkte selektion ved mus over.</html>
OptionPanel.toolTipManager.dismissDelay=Afvis forsinkelse, ms
OptionPanel.toolTipManager.initialDelay=Indledende forsinkelse, ms
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=Maksimal h\u00F8jde p\u00E5 v\u00E6rkt\u00F8jstip i pixels.
OptionPanel.toolTipManager.max_tooltip_width=V\u00E6rkt\u00F8jstip bredde
OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>Standard v\u00E6rkt\u00F8jstip bredde i pixels.</html>
OptionPanel.toolTipManager.reshowDelay=Genvisning forsinkelse, ms
+OptionPanel.tr=Tyrkisk / T\u00FCrk\u00E7e
OptionPanel.uk_UA=Ukrainsk/\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430
OptionPanel.undefined_font=Udefineret skrifttype
OptionPanel.undo_levels=Fortryd niveauer
OptionPanel.undo_levels.tooltip=<html>Bestemmer hvor mange trin der gemmes der kan fortrydes via "Fortryd".</html>
OptionPanel.unfold_on_paste=Udfold knudepunkt ved inds\u00E6tning
OptionPanel.unfold_on_paste.tooltip=Udfold knudepunkt ved inds\u00E6t eller tr\u00E6k og slip
+OptionPanel.uniform_shape=Uniform
OptionPanel.use_common_out_point_for_root_node=Kanter starter fra et punkt p\u00E5 root knudepunkt
OptionPanel.use_common_out_point_for_root_node.tooltip=Kanter starter fra et punkt p\u00E5 root knudepunkt
OptionPanel.use_tabbed_pane=Brug faner
@@ -1310,9 +1397,12 @@ OptionPanel.validate_invalid_number_format=Ugyldig standard talformat
OptionPanel.validate_write_without_read=Skripting: overvej for at tilf\u00F8je L\u00E6s/fil til at Skriv/fil.
OptionPanel.validation_error=<html><body>Validering fejl: <p><em>{0}</em> <p>skal du \u00E6ndre indstillinger til at ordne fejl.</body></html>
OptionPanel.validation_warning=<html><body>Validering advarsler: <p><em>{0}</em></body></html>
+OptionPanel.vertical_child_gap=Barn margin
+OptionPanel.vertical_child_gap.tooltip=Lodret afstand mellem underordnede noder
OptionPanel.vi=Vietnamesisk/Ti\u1EBFng Vi\u1EC7t
OptionPanel.wheel_velocity=Hastighed
OptionPanel.wheel_velocity.tooltip=En st\u00F8rre v\u00E6rdi resulterer i hurtigere bev\u00E6gelser af MindMap ved bev\u00E6gelse af musehjulet.
+OptionPanel.wide_hexagon=Bred sekskant
OptionPanel.windows=Windows
OptionPanel.zh_CN=Kinesisk, forenklet/\u7B80\u4F53\u5B57
OptionPanel.zh_TW=Kinesisk, traditionelt/\u7E41\u9AD4\u5B57
@@ -1405,6 +1495,7 @@ PrintAction.text=Udskriv MindMap\u2026
PrintDirectAction.text=Udskriv
printing_settings=Udskriftskalering
PrintPreviewAction.text=Vis udskrift...
+progress=Udviklingsikon (%)
PropertyAction.dialog=Indstillinger
PropertyAction.text=Indstillinger...
QuickFilterAction.text=Hurtig filter
@@ -1412,7 +1503,7 @@ QuickFindAction.BACK.text=Find forrige
QuickFindAction.FORWARD.text=Find n\u00E6ste
QuickFindAllAction.text=V\u00E6lg alle matchende knudepunkter
QuickHighlightAction.text=Fremh\u00E6v alle matchende knudepunkter
-QuitAction.text=&Afslut Freeplane
+QuitAction.text=Afslut Freeplane
read_only=L\u00E6s kun
ReadScriptError.text=Fejl ved l\u00E6sning af skript
really_convert_to_current_version=<html>MindMap blev oprettet med en \u00E6ldre version af Freeplane.<br>Skal det konverteres (anbefales)?<br>(Ellers benyttes det, som det er uden garanti.)</html>
@@ -1428,8 +1519,11 @@ RedoFilterAction.text=Gendan
regular_expressions=Regul\u00E6r udtryk
ReminderHookAction.text=Fjern p\u00E5mindelse
ReminderHookAction.tooltip=Fjerner en p\u00E5mindelse fra et knudepunkt.
+reminderNotification=P\u00E5mindelse meddelse
remove_file_from_list_on_error=Filen {0} blev ikke \u00E5bnet. Fjern den fra fillisten seneste \u00E5bnede?
remove_shortcut_question=Erstatte genvej?
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=Nulstil udfoldede noder
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=Tillader foldning for hver node
RemoveAllIconsAction.text=Fjern alle ikoner
RemoveConnectorAction.text=Fjern forbindelse
RemoveEncryption.text=Fjern adgangskode
@@ -1451,13 +1545,18 @@ ResetNodeLocationAction.text=Reset position
ResetStyleAction.text=Nulstil knudepunkt typografi
RevertAction.text=Gendan fra lokal historik
RevisionPluginAction.text=\u00C6ndre baggrundsfarve for revisioner
+save=&Gem
save_failed=Kunne ikke gemme MindMap {0}.
save_unsaved=Gem MindMap?
save_unsaved_styles=Gem typografier?
SaveAcceleratorPresetsAction.text=Gem genvejstaster\u2026
SaveAction.text=Gem
+SaveAction_readonlyMsg=Mindmap er skrivebeskyttet. Brug 'Fil-> Gem mindap som...' for at gemme.
+SaveAction_readonlyTitle=Fors\u00F8g p\u00E5 at gemme skrivebeskyttet mindmap
SaveAll.text=Gem alle \u00E5bne MindMap
SaveAll.tooltip=Gemmer alle \u00E5bne MindMaps
+SaveAs_toReadonlyMsg={0} er skrivebeskyttet. Gem til en anden fil.
+SaveAs_toReadonlyTitle=Fors\u00F8g p\u00E5 at gemme til skrivebeskyttet fil
SaveAsAction.text=Gem som\u2026
saved=Gemt
saving_canceled=Gem afbrudt
@@ -1467,11 +1566,12 @@ script_execution_disabled=Skriptudf\u00F8relse er deaktiveret, se v\u00E6rkt\u00
ScriptEditor.text=Script Editor...
ScriptEditor.tooltip=Tillader at skrive st\u00F8rre scripts inden i Freeplane.
ScriptEditorPanel.changed_cancel=Scriptene er blevet \u00E6ndret. \u00D8nsker du virkelig at forlade disse \u00E6ndringer?
-scripting_api_generator_legend=Legend
+scripting_api_generator_legend=Tegnforklaring
scripting_api_generator_proxy=Proxy
scripting_api_generator_title=Skripting API
scripting_api_generator_utilities=Hj\u00E6lpeprogrammer
scripting_api_generator_web=Webressourcer
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=Udf\u00F8r skripts p\u00E5 markerede noder, rekursivt
select_favorites_folder=V\u00E6lg mappen, med dine favoritter
select_file_export_to=V\u00E6lg fil at eksporterer til
select_folder_for_importing=V\u00E6lg mappen som skal importeres
@@ -1732,17 +1832,28 @@ styles.subtopic=Delemne
styles.topic=Emne
styles.user-defined=Brugerdefinerede typografier
styles.website=Hjemmeside
+styles_background_html=\n <html>\n<head>\n</head> \n<body>\n<table width="800" style="text-align: left; vertical-align: top"> \n<tr valign="top"> \n<th><div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold"> \nom denne stil s\u00E6t\n</div> \n<div style="text-align: left; font-weight: normal"> \n<div style="margin: 3pt"> \ndenne standard blev udviklet efter 11 \u00E5r p\u00E6dagogik forskning om, hvordan at g\u00F8re p [...]
styles_menu=Tilg\u00E6ngelige typografier
submenu_keystroke_in_use_error=Tastetryk {0} kan ikke bruges til undermenuen {1}. Tastetryk fjernet.
summary_nodes=Sammenfattende knudepunkter
summary_not_possible=Kan ikke oprette oversigts knudepunkt for aktuel markering
-SummaryNodeAction.text=Sammenfattende knudepunkt(indstil/nulstil)
svg=SVG
template_dir=Standard skabeloner
+TextAlignAction.CENTER.text=Centreret tekst
+TextAlignAction.DEFAULT.text=Standard
+TextAlignAction.LEFT.text=Venstrejusteret tekst
+TextAlignAction.RIGHT.text=H\u00F8jrejusteret tekst
+textalignment=Tekstjustering
TimeListAction.text=Vis tidsskema listen...
TimeListAction.tooltip=Vis alle skemalagte tider og de tilh\u00F8rende knudepunkter.
TimeManagementAction.text=Vis kalender...
TimeManagementAction.tooltip=<html>Viser kalendermodulet af Kai Toedter.</html>
+TimePeriodUnits.days=dage
+TimePeriodUnits.hours=timer
+TimePeriodUnits.minutes=minutter
+TimePeriodUnits.ms=ms
+TimePeriodUnits.seconds=sekunder
+TimePeriodUnits.weeks=uger
ToggleChildrenFoldedAction.text=Fold underknudepunkter ind/ud
ToggleDetailsAction.text=Skjule detaljer
ToggleFBarAction.text=F-tasten
@@ -1753,6 +1864,7 @@ ToggleMenubarAction.text=Menulinien
ToggleScrollbarsAction.text=Rullepaneler
ToggleStatusAction.text=Vis statuslinje
ToggleToolbarAction.text=V\u00E6rkt\u00F8jslinie
+toolbars=V\u00E6rkt\u00F8jslinjer
undefined_error=En uventet fejl opstod. Pr\u00F8v venligt at lave en fejlrapport.
underline=Understregning
UnderlineAction.text=Understregning
@@ -1790,11 +1902,14 @@ user_defined_zoom_status_bar=\u00C6ndre zoom til brugerdefinerede zoomv\u00E6rdi
user_icon=Brugerikonet "{0}"
user_template_dir=Brugerskabeloner
user_zoom=Udskriv zoomfaktor (0.0 - 2.0):
+userScripts=Skripts
value_format=V\u00E6rdiformat
version_up_to_date=Du bruger allerede den nyeste programversion
-ViewerControllerAction.text=Eksternt objekt\u2026
+view=Vis
ViewLayoutTypeAction.OUTLINE.text=Dispositionsvisning
+web_resources=Webressourcer
WebDocuAction.text=Web Dokumentation
+WhatsNewAction.text=Hvad er nyt i Freeplane 1.5.x
width=Bredde
wrong_regexp=Forkert regul\u00E6rt udtryk "{0}", fejl {1}
xslt_export.html=HTML-dokument
@@ -1807,5 +1922,6 @@ xslt_export.ms_word=Microsoft Word 2003 XML
xslt_export.text=Br\u00F8dtekst
xslt_export_not_possible=Freeplane XSLT eksportering er ikke mulig
yes=Ja
+zoom=Zoom
ZoomInAction.text=Zoom ind
ZoomOutAction.text=Zoom ud
diff --git a/freeplane/resources/translations/Resources_de.properties b/freeplane/resources/translations/Resources_de.properties
index e0d5147..8ce54b1 100644
--- a/freeplane/resources/translations/Resources_de.properties
+++ b/freeplane/resources/translations/Resources_de.properties
@@ -1,5 +1,6 @@
+about=\u00DCber
about_text=Freeplane - freie Software f\u00FCr Mindmaps und Wissensaufbau
-AboutAction.text=\u00DCber Freeplane\u2026
+AboutAction.text=\u00DCber Freeplane
acceleratorPresets=&Tastaturk\u00FCrzel-Einstellungen
accelerators_loading_error=Fehler beim Laden der Tastaturk\u00FCrzel in {0}
accessories/plugins/ApplyFormatPlugin.dialog.title=Format der Knoten \u00E4ndern
@@ -9,10 +10,10 @@ accessories/plugins/EncryptNode.properties_1=Die Passw\u00F6rter stimmen nicht \
accessories/plugins/EncryptNode.properties_2=Passwort eingeben:
accessories/plugins/EncryptNode.properties_3=Passwort wiederholen:
accessories/plugins/EncryptNode.properties_4=Bitte geben Sie das Passwort ein.
-accessories/plugins/EncryptNode.properties_5=<html>Bitte beachten Sie, dass die St\u00E4rke der Verschl\u00FCsselung<br> fast vollst\u00E4ndig von der Qualit\u00E4t Ihres Passwortes abh\u00E4ngt.</html>
+accessories/plugins/EncryptNode.properties_5=<html>Bitte beachten Sie, dass die St\u00E4rke der Verschl\u00FCsselung<br> fast vollst\u00E4ndig von der Qualit\u00E4t Ihres Passwortes abh\u00E4ngt.
accessories/plugins/EncryptNode.properties_6=OK
accessories/plugins/EncryptNode.properties_7=Abbrechen
-accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=<html>Sie k\u00F6nnen diese Funktion nur auf bereits eingef\u00FCgte verschl\u00FCsselte Knoten anwenden.<br> Bitte f\u00FCgen Sie solch einen Knoten mittels des Extra-Men\u00FCs ein.</html>
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=Sie k\u00F6nnen den zustand des Kennwortschutzes (Verschl\u00FCsselung) nur bei bereits verschl\u00FCsselten Knoten \u00E4ndern. Bitte f\u00FCgen Sie einen solchen Knoten \u00FCber das Werkzeug-Men\u00FC ein.
accessories/plugins/EncryptNode.properties_select_me=Zum Weitermachen hier klicken!
accessories/plugins/EncryptNode.properties_wrong_password=Das Passwort ist falsch.
accessories/plugins/ExportWithTWiki.text=TWi...
@@ -23,7 +24,7 @@ accessories/plugins/ExportWithXSLT_Applet.tooltip=Exportiert die ganze Mindmap a
accessories/plugins/ExportWithXSLT_Flash.text=Flash...
accessories/plugins/ExportWithXSLT_Flash.tooltip=Exportiert die ganze Mindmap als Flash Anwendung.
accessories/plugins/ExportWithXSLT_HTML.text=XHTML (JavaScript Version)...
-accessories/plugins/ExportWithXSLT_HTML3.text=XHTML (Mit verlinktem &Bild der Mindmap)...
+accessories/plugins/ExportWithXSLT_HTML3.text=XHTML (Mit verlinktem Bild der Mindmap)...
accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=Ressourcen nach Taskjuggler...
accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>Exportiert Ressourcen vom RESOURCES Knoten zu Taskjuggler. </html>
accessories/plugins/ExportWithXSLT_TASKSTJI.text=Aufgaben nach Taskjuggler...
@@ -33,8 +34,11 @@ active=Aktiv
actual_map_styles=aktuell auf Knoten angewandte mindmapbezogene Stile
actual_node_styles=aktuell auf Knoten angewandte knotenbezogene Stile
add=&Hinzuf\u00FCgen
-AddConnectorAction.text=Knoten ve&rbinden
-AddElementaryConditionAction.text=&Hinzuf\u00FCgen
+add_node=Knoten hinzuf\u00FCgen
+add_ons=Add-ons
+AddConnectorAction.text=Knoten verbinden
+AddElementaryConditionAction.text=Hinzuf\u00FCgen
+AddExecutionLinkAction.text=Hyperlink zu einem Systembefehl hinzuf\u00FCgen...
AddLocalLinkAction.text=Link von Knoten zu Knoten
AddMenuItemLinkAction.text=Link auf Men\u00FCeintrag...
AddOnDetailsPanel.authored.by=Von {0}
@@ -58,7 +62,7 @@ addons.installer.missing.translation=\u00DCbersetzung von {0} fehlt f\u00FCr {1}
addons.installer.no.scripts=Keine Skripte definiert
addons.installer.no.zipdata=es wurden keine ZIP-Daten gefunden
addons.installer.nonstandard.permissions=Das Skript ben\u00F6tigt die folgenden Berechtigungen, die zz. nicht gesetzt sind: {0}.\nSollen diese zu den Standardberechtigungen hinzugef\u00FCgt werden?
-addons.installer.one.child.expected=erwartet wurde nur EIN Unterknoten {0}, allerdings existiert {1}
+addons.installer.one.child.expected=Erwartet wurde nur genau ein Unterknoten von {0}, bekam jedoch {1}.
addons.installer.script.name.suffix=Der Skript-Name {0} hat keine Dateiendung wie z.B. ".groovy"
addons.installer.script.no.execution_mode=f\u00FCr {0} ist das Attribut "execution_mode" nicht definiert
addons.installer.script.no.menulocation=f\u00FCr {0} ist das Attribut "menuLocation" nicht definiert
@@ -66,7 +70,7 @@ addons.installer.script.no.menutitle=f\u00FCr {0} ist das Attribut "menuTitleKey
addons.installer.script.no.permissions=Keine Berechtigungen definiert f\u00FCr {0}
addons.installer.success=Installation erfolgreich.\nDas neue Add-on wird nach einem Neustart zur Verf\u00FCgung stehen.
addons.installer.success.update=Aktualisierung von {0} auf {1} war erfolgreich.\nEinige Funktionen k\u00F6nnten erst im Anschluss an einen Neustart verf\u00FCgbar sein.
-addons.installer.title=Installiere Add-on...
+addons.installer.title=Einrichtung der Erweiterungen
addons.installer.too.new=Die aktuelle Freeplane-Version {0} ist zu neu. Dieses Add-on wird nur bis {1} unterst\u00FCtzt.
addons.installer.too.old=Die aktuelle Freeplane-Version {0} ist zu alt. Dieses Add-on braucht mindestens {1}.
addons.installer.unknown.deinstallation.rules=Unbekannte Deinstallations-Regel(n): {0}
@@ -75,31 +79,35 @@ addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">
addons.site=http://freeplane.sourceforge.net/addons/
AddStyleAttributes.text=Attribute von Stil
AddStyleAttributes.tooltip=F\u00FCgt die Attribute der Stildefinition ein
-AllMapsNodeListAction.text=Suchen und ersetzen (global)...
+AllMapsNodeListAction.text=Suchen und Ersetzen in allen Karten
always=Immer
-AlwaysUnfoldedNodeAction.text=Knoten st\u00E4ndig &ausklappen
+AlwaysUnfoldedNodeAction.text=Knoten st\u00E4ndig ausklappen
antialias_all=Kantengl\u00E4ttung f\u00FCr Alles verwenden
antialias_edges=Kantengl\u00E4ttung f\u00FCr Konten-Linien verwenden
antialias_none=Kantengl\u00E4ttung deaktivieren
apply=\u00DC&bernehmen
-ApplyAction.text=\u00DC&bernehmen
-ApplyFormatPlugin.text=&Format \u00E4ndern...
+ApplyAction.text=\u00DCbernehmen
+ApplyFormatPlugin.text=Format \u00E4ndern...
ApplyFormatPlugin.tooltip=Dialog, in dem Knoten- und Kantenformate ge\u00E4ndert werden k\u00F6nnen.
-ApplyNoFilteringAction.text=Filter &deaktivieren
-ApplySelectedViewConditionAction.text=&Ausgew\u00E4hlte Knoten filtern
-ApplyToVisibleAction.text=Auf gefilterte Knoten an&wenden
+ApplyNoFilteringAction.text=Filter deaktivieren
+ApplySelectedViewConditionAction.text=Ausgew\u00E4hlte Knoten filtern
+ApplyToVisibleAction.text=Auf gefilterte Knoten anwenden
as_parent=Wie Oberknoten
-AskForHelp.text=&Hilfe im Forum anfordern...
-AssignAttributesAction.text=Attribute &zuweisen...
+AskForHelp.text=Hilfe im Forum anfordern
+AssignAttributesAction.text=Attribute zuweisen...
+attachments=Anh\u00E4nge
attribute_delete=&Alle Werte l\u00F6schen
attribute_delete_value=&Diesen Wert l\u00F6schen
attribute_font_size_tooltip=Schriftgr\u00F6\u00DFe f\u00FCr Attribute
attribute_list_box_label_text=Vorhandene Werte
attribute_name=Name des Attributes
+attribute_name_or_value=Name oder Wert des Attributs
+attribute_options=Attributsoptionen
attribute_replace=&Ersetzen durch
attribute_top=Alle bekannten Attribute der geladenen Mindmaps
attribute_value=Wert des Attributes
-attributes_AddAttributeAction.text=Attribute \u00FCber &Dialog einf\u00FCgen...
+attributes=Eigenschaften
+attributes_AddAttributeAction.text=Attribute \u00FCber Dialog einf\u00FCgen...
attributes_adding_empty_attribute_error=Der Attributname darf nicht leer sein
attributes_all=Alle Attribute
attributes_assign_dialog=Attribute zuweisen
@@ -122,9 +130,9 @@ attributes_popup_new=Neues Attribut
attributes_popup_optimal_width=Optimale Breite
attributes_popup_up=Nach Oben
attributes_refresh=Aktualisieren
-attributes_RemoveAllAttributesAction.text=&alle
-attributes_RemoveFirstAttributeAction.text=&erstes
-attributes_RemoveLastAttributeAction.text=&letztes
+attributes_RemoveAllAttributesAction.text=alle
+attributes_RemoveFirstAttributeAction.text=erstes
+attributes_RemoveLastAttributeAction.text=letztes
attributes_restricted_attributes_tooltip=Auswahl auf eine vordefinierte Liste von Attributen begrenzen
attributes_restricted_values_tooltip=M\u00F6gliche Werte f\u00FCr dieses Attribut beschr\u00E4nken
attributes_restriction=Beschr\u00E4nkte Menge
@@ -142,64 +150,69 @@ AutomaticLayout.ALL=f\u00FCr alle Knoten
AutomaticLayout.HEADINGS=f\u00FCr Knoten, die keine Bl\u00E4tter sind
AutomaticLayout.level=Level {0}
AutomaticLayout.level.root=Wurzel-Knoten
-AutomaticLayoutAction.text=&Automatisches Layout
+AutomaticLayoutAction.text=Automatisches Layout
AutomaticLayoutAction.tooltip=<html>Formatiert die Knoten entsprechend Extras->Einstellungen...->Automatisches Layout</html>
AutomaticLayoutControllerAction.ALL.text=f\u00FCr alle Knoten
+AutomaticLayoutControllerAction.COLUMNS.text=f\u00FCr Spalten
AutomaticLayoutControllerAction.HEADINGS.text=f\u00FCr alle Knoten, die keine Bl\u00E4tter sind
AutomaticLayoutControllerAction.null.text=(deaktiviert)
BackAction.text=Sprung zum Vorg\u00E4nger-Knoten
BackAction.tooltip=<html>Springt zum vorhergehenden Knoten aus der<br/>Selektions-Historie der aktuellen Mindmap</html>
background=Hintergrund
+basics=Grundlagen
bitmaps=Bitmaps
black=Schwarz
-BlinkingNodeHookAction.text=&Blinkend
+BlinkingNodeHookAction.text=Blinkend
BlinkingNodeHookAction.tooltip=<html>Die Knotenschrift \u00E4ndert laufend die Farbe. Diese Funktion sollte nicht bei vielen Knoten angewendet werden und<br><b>nicht zusammen mit anderen Formatierungseigenschaften bei einem Knoten.</b></html>
blue=Blau
-BoldAction.text=&Fett
+BoldAction.text=Fett
boldify_branch=Zweig Fett
branch=Zweig
-browse=Browse...
+browse=Durchsuchen...
calendar_attributes_panel=Kalender und Attribute
calendar_panel=Kalender
-can_not_connect_to_info_server=Verbindung zu Informations-Server nicht m\u00E4glich.
-can_not_delete_predefined_style=Standard Knotenstile k\u00F6nnen nicht gel\u00F6scht werden.
-can_not_delete_root_style=Der Knotenstil des Wurzelknotens kann nicht gel\u00F6scht werden.
-can_not_delete_style_group=Diese Gruppe von Knotenstilen kann nicht gel\u00F6scht werden.
+can_not_connect_to_info_server=Verbindung zum Informations-Server nicht m\u00F6glich
+can_not_delete_predefined_style=Standard-Knotenstile k\u00F6nnen nicht gel\u00F6scht werden
+can_not_delete_root_style=Der Stil des Wurzelknotens kann nicht gel\u00F6scht werden
+can_not_delete_style_group=Knotenstil-Gruppe kann nicht gel\u00F6scht werden
can_not_save_key_set=Kann Tastaturk\u00FCrzel nicht speichern
cancel=&Abbrechen
-CancelAction.text=&Abbrechen
+CancelAction.text=Abbrechen
cannot_add_parent_diff_parents=Alle Knoten m\u00FCssen zum selben Oberknoten geh\u00F6ren, um diese Funktion auszuf\u00FChren.
cannot_add_parent_to_root=Der Wurzelknoten kann nicht ver\u00E4ndert werden.
cannot_delete_root=Der Wurzelknoten kann nicht gel\u00F6scht oder ausgeschnitten werden.
-cannot_join_nodes_with_children=Knoten, die Unterknoten haben, k\u00F6nnen nicht verbunden werden.
+cannot_join_nodes_with_children=Knoten k\u00F6nnen nicht mit ihren Unterknoten verbunden werden
cannot_move_to_child=Ein Knoten kann nicht auf seine Unterknoten verschoben werden.
CenterAction.text=Zentrieren
-CenterSelectedNodeAction.text=Auf &Knoten zentrieren
+CenterSelectedNodeAction.text=Auf Knoten zentrieren
ChangeConnectorArrowsAction.backward.text=Zur\u00FCck
ChangeConnectorArrowsAction.both.text=Beide
ChangeConnectorArrowsAction.forward.text=Vorw\u00E4rts
ChangeConnectorArrowsAction.none.text=Keinen
ChangeConnectorArrowsAction.text=\u00C4ndern der Pfeile der Verbindung
-ChangeConnectorShapeAction.CUBIC_CURVE.text=&Kurve
-ChangeConnectorShapeAction.EDGE_LIKE.text=&Wie Knotenlinie
-ChangeConnectorShapeAction.LINE.text=&Gerade
-ChangeConnectorShapeAction.LINEAR_PATH.text=&Linearer Pfad
-ChangeNodeLevelLeftsAction.text=Nach &links schieben
-ChangeNodeLevelLeftsAction.tooltip=<html><ul><li>Links vom Wurzelknoten werden die Knoten zu Unterknoten ihrer ehemals benachbarten Knoten.</li><li>Rechts vom Wurzelknoten rutschen sie eine Hierarchieebene h\u00F6her.</li><li>Direkt rechts vom Wurzeknoten tauschen sie die Seite nach links.</li></ul></html>
-ChangeNodeLevelRightsAction.text=Nach &rechts schieben
-ChangeNodeLevelRightsAction.tooltip=<html><ul><li>Rechts vom Wurzelknote werden die Knoten zu Unterknoten ihrer ehemals benachbarten Knoten.</li><li>Links vom Wurzelknoten rutschen sie eine Hierarchieebene h\u00F6her.</li><li>Direkt links vom Wurzelknoten tauschen sie die Seite nach rechts.</li></ul></html>
-choose_background_color=Hintergrundfarbe ausw\u00E4hlen.
-choose_cloud_color=Farbe der Wolke ausw\u00E4hlen.
-choose_edge_color=Farbe der Linien ausw\u00E4hlen.
-choose_map_background_color=Hintergrundfarbe der Mindmap ausw\u00E4hlen.
-choose_node_background_color=Hintergrundfarbe des Knotens ausw\u00E4hlen.
-choose_node_color=Knotenfarbe ausw\u00E4hlen.
-ClearLinkAnchorAction.text=L\u00F6s&che Anker
+ChangeConnectorShapeAction.CUBIC_CURVE.text=Kurve
+ChangeConnectorShapeAction.EDGE_LIKE.text=Wie Knotenlinie
+ChangeConnectorShapeAction.LINE.text=Gerade
+ChangeConnectorShapeAction.LINEAR_PATH.text=Linearer Pfad
+ChangeNodeLevelLeftsAction.text=Nach links schieben
+ChangeNodeLevelLeftsAction.tooltip=Links des Wurzelknotens werden die Knoten zu Unterknoten ihrer ehemals benachbarten Knoten. Rechts des Wurzelknotens rutschen sie eine Hierarchieebene h\u00F6her. Direkt rechts vom Wurzelknoten tauschen sie die Seite nach links.
+ChangeNodeLevelRightsAction.text=Nach rechts schieben
+ChangeNodeLevelRightsAction.tooltip=Rechts des Wurzelknotens werden die Knoten zu Unterknoten ihrer ehemals benachbarten Knoten. Links vom Wurzelknoten rutschen sie eine Hierarchieebene h\u00F6her. Direkt links vom Wurzelknoten tauschen sie die Seite nach rechts.
+choose_background_color=Hintergrundfarbe ausw\u00E4hlen:
+choose_cloud_color=Farbe der Wolke ausw\u00E4hlen:
+choose_edge_color=Randfarbe w\u00E4hlen
+choose_map_background_color=Hintergrundfarbe der Mindmap ausw\u00E4hlen
+choose_node_background_color=Hintergrundfarbe des Knotens ausw\u00E4hlen:
+choose_node_color=Knotenfarbe ausw\u00E4hlen:
+ClearLinkAnchorAction.text=L\u00F6sche Anker
ClearLinkAnchorAction.tooltip=<html>l\u00F6schen des Hyperlink-Bezugspunktes</html>
+CloneAction.text=Als Klon einf\u00FCgen
close_btn=S&chlie\u00DFen
-CloseAction.text=Mindmap s&chlie\u00DFen
-CloudAction.text=&Wolke um Knotenauswahl
-CloudColorAction.text=&Wolkenfarbe...
+CloseAction.text=Mindmap schlie\u00DFen
+cloud=Wolke
+cloud_shapes=Wolkenformen
+CloudAction.text=Wolke um Knotenauswahl
+CloudColorAction.text=Wolkenfarbe...
CloudShapeAction.ARC.text=Bogen
CloudShapeAction.RECT.text=Rechteck
CloudShapeAction.ROUND_RECT.text=Abgerundetes Rechteck
@@ -213,36 +226,38 @@ connector_arrows=Verbindung &Pfeile
connector_label=Beschriftung der Verbindung
connector_lines=Verbindung &Linien
connector_shapes=Verbindung &Formen
-ConnectorColorAction.text=Farbe der Verbindung
-CopyAction.text=&Kopieren
+ConnectorColorAction.text=Farbe der Verbindung...
+contact=Kontakt
+CopyAction.text=Kopieren
CopyAction.tooltip=Kopiert den markierten Knoten und seine Nachfolger
CopyAttributes.text=Attribute kopieren
-CopyIDAction.text=Knoten-I&D kopieren
+CopyIDAction.text=Knoten-ID kopieren
CopyMapStylesAction.text=Knotenstile importieren...
-CopyNodeURIAction.text=Knoten-&URI kopieren
-copyright=Copyright \u00A9 2000-2014 Freeplane Entwicklungsteam und andere
-CopySingleAction.text=Kop&ieren (einzeln)
+CopyNodeURIAction.text=Knoten-URI kopieren
+copyright=Copyright \u00A9 2000-2016 Freeplane Entwicklungsteam und andere
+CopySingleAction.text=Kopieren (einzeln)
CopySingleAction.tooltip=Kopiert nur den markierten Knoten
CopyStyleExtensionsAction.text=Erweiterungen des Stilknotens einf\u00FCgen
-corrupt_map=Die Datei ist besch\u00E4digt.
-CreateConjunctConditionAction.text=&Und
-CreateDisjunctConditionAction.text=&Oder
-CreateNotSatisfiedConditionAction.text=&Nicht
-CreationModificationPluginAction.text=\u00C4nderungs&zeiten anzeigen
+corrupt_map=Die Datei ist besch\u00E4digt
+CreateConjunctConditionAction.text=Und
+CreateDisjunctConditionAction.text=Oder
+CreateNotSatisfiedConditionAction.text=Nicht
+CreationModificationPluginAction.text=\u00C4nderungszeiten anzeigen
CreationModificationPluginAction.tooltip=<html>Diese Funktion speichert Erzeugungs- und \u00C4nderungsdatum jedes Knotens.</html>
current_dir=Mindmaps
-CutAction.text=&Ausschneiden
+CutAction.text=Ausschneiden
decrease_branch_font_size=S&chrift des Zweiges verkleinern
-DecreaseNodeFontAction.text=&Kleinere Schrift
+DecreaseNodeFontAction.text=Kleinere Schrift
default=Standard
DefaultColorAction.text=Standardfarbe
+defaultstyle.attributes=Attribute
defaultstyle.details=Details
defaultstyle.floating=Schwebender Knoten
defaultstyle.note=Notiz
delete=&Entfernen
delete_child=Knoten l\u00F6schen
DeleteAction.text=Knoten l&\u00F6schen
-DeleteConditionAction.text=&Entfernen
+DeleteConditionAction.text=Entfernen
DeleteDetailsAction.text=Knotendetails l\u00F6schen
DeleteLevelStyleAction.text=Entferne Ebene vom automatischen Knotenstil
DeleteStyleAction.text=Entferne Knotenstil
@@ -250,11 +265,11 @@ DeleteUserStyleAction.text=Entferne benutzerdefinierten Knotenstil
dialect_info.app=die Mindmap-Datei {0} wurde mit dem Programm {1} erzeugt.
dialect_info.later_version=die Mindmap-Datei {0} wurde mit einer sp?teren Version dieses Programms erzeugt.
dialect_info.unknownApp=die eingelesene Mindmap wurde mit einem unbekannten Programm erzeugt.
-dialect_info.unknownURL=die Webseite ist unbekannt
-dialect_info.url=Bitte die Programm-Webseite {0} f\u00FCr weiterf\u00FChrende Informationen konsultieren
-dialect_info.warning=es kann sein, dass Freeplane dies inkorrekt \u00F6ffnet, anzeigt oder abspeichert
+dialect_info.unknownURL=Diese Webseite ist unbekannt.
+dialect_info.url=F\u00FCr weitere Informationen die Programm-Webseite {0} aufrufen.
+dialect_info.warning=Freeplane kann m\u00F6glicherweise nicht korrekt \u00F6ffnen, speichern oder anzeigen.
DirectHtmlFlavorHandler=HTML als einzelnen Knoten
-DocumentationAction.text=&Dokumentation (Erste Schritte)...
+DocumentationAction.text=Dokumentation
down=Ab
DownConditionAction.text=Ab
download=Download
@@ -263,7 +278,9 @@ edge=Linie
edge_is_formatted_by_style=Die Eigenschaften der Knotenlinie werden durch den Knotenstil festgelegt. Zum \u00C4ndern bearbeiten Sie den entsprechenden Knotenstil.
edge_style=Linienform
edge_width=Linienbreite
-EdgeColorAction.text=Linienf&arbe...
+edge_widths=Kantenbreiten
+EdgeColorAction.text=Linienfarbe...
+EdgeProperties=Linieneigenschaften
EdgeStyleAction.bezier.text=geschwungen
EdgeStyleAction.bezier.tooltip=<html>Stellt die Verbindung zwischen den Knoten<br>als geschwungene Linie dar.</html>
EdgeStyleAction.hide_edge.text=(deaktiviert)
@@ -283,58 +300,65 @@ EdgeWidthAction_width_thin.text=d\u00FCnn
edit=&Bearbeiten
edit.decision=HTML-Editor
edit.edit_rich_text=Wollen Sie Formatierungen (fett, kursiv, etc.) benutzen?
-edit_details=Knotendetails bearbeiten...
+edit_details=Knoten-Details bearbeiten
edit_end_label=<html>Verbindung<br/>Beschriftung</html>
edit_label_font_family=Schriftart
edit_label_font_size=Schriftgr\u00F6\u00DFe
edit_link_manually=Link Manuell bearbeiten...
edit_long_node=Knoten mit Fliesstext bearbeiten
edit_middle_label=Text in der Mitte
+edit_node=Knoten bearbeiten
edit_note=Notiz bearbeiten
edit_source_label=Text am Anfang
edit_target_label=Text am Ende
edit_transparency_label=Transparenz
edit_width_label=Breite
-EditAction.text=Text &bearbeiten...
-EditAttributesAction.text=&Attribute bearbeiten...
-EditDetailsAction.text=Details &bearbeiten...
-EditDetailsInDialogAction.text=Details im Editor bearbeiten...
-EditFilterAction.text=&Filter bearbeiten...
-EditLongAction.text=Text im &Editor bearbeiten...
-EditNoteInDialogAction.text=Notiz &bearbeiten...
+EditAction.text=Knoten-Text in-line bearbeiten
+EditAttributesAction.text=Attribute in-line bearbeiten
+EditDetailsAction.text=Knoten-Details in-line bearbeiten
+EditDetailsInDialogAction.text=Details im Editor bearbeiten
+EditFilterAction.text=Filter erstellen
+EditLongAction.text=Konten-Text im Editor bearbeiten
+EditNoteInDialogAction.text=Notiz im Editor bearbeiten
EditScript=Skript bearbeiten...
-EditStylesAction.text=Knotenstile bearbeiten...
-EncryptedMap.text=Neue ve&rschl\u00FCsselte Mindmap...
-EncryptedMap.tooltip=Erzeugt eine neue Mindmap die als ganzes verschl\u00FCsselt gespeichert wird.
+EditStylesAction.text=Knoten-Stile bearbeiten
+elements=Elemente
+EncryptedMap.text=Neue verschl\u00FCsselte Mindmap...
+EncryptedMap.tooltip=Neue verschl\u00FCsselte Mindmap
+encryption=Verschl\u00FCsselung
enter_base_url=Freeplane wird realtive Links einf\u00FCgen. Bitte geben sie die Basis-URL an.
+enter_command=Befehl eingeben
enter_condition_name=Name f\u00FCr neue Bedingung zuweisen
-enter_confirms=&Eingabetaste Schlie\u00DFt das Fenster.
+enter_confirms=&Eingabetaste best\u00E4tigt
enter_keyset_name=Bitte geben sie einen Namen f\u00FCr die Tastaturk\u00FCrzel-Sammlung an
enter_map_url=Bitte die URL der Mindmap eingeben
enter_new_style_name=Name f\u00FCr neuen Knotenstil
enter_node_id=Konten ID eingeben
enter_zoom=Vergr\u00F6\u00DFerung bearbeiten
-EnterPassword.text=Knoten ver-/ent&schl\u00FCsseln...
+EnterPassword.text=Passwort eingeben
error=Fehler
-error_applying_template=Beim Anwenden des XSL-Template ist ein Fehler aufgetreten
+error_applying_template=Fehler beim Anwenden des XSL-Templates.
error_creating_directory=Beim Erstellen des Verzeichnisses f\u00FCr den Export ist ein Fehler aufgetreten.
error_in_template=Fehler in der Default-Mindmap-Datei {0} gefunden. Bitte diese Datei l\u00F6schen.
errornumber={0} Fehler
-ExecuteScriptError.text=Beim Ausf\u00FChren des Skripts ist ein Fehler aufgetreten.\nF\u00FCr Details siehe Logfile.
+ExecuteScript.available_modes_tooltip={0} ist verf\u00FCgbar f\u00FCr
+ExecuteScript.script=Skript
+ExecuteScriptError.text=Fehler beim Ausf\u00FChren des Skripts:\n{0}
ExecuteScriptForAllNodes.text=Alle Skripte dieser Mindmap ausf\u00FChren
ExecuteScriptForSelectionAction.text=Alle Skripte dieses Knotens ausf\u00FChren
ExecuteScriptOnSelectedNode.text={0} f\u00FCr alle ausgew\u00E4hlten Knoten ausf\u00FChren
ExecuteScriptOnSelectedNodeRecursively.text={0} rekursiv f\u00FCr ausgew\u00E4hlte Knoten ausf\u00FChren
ExecuteScriptOnSingleNode.text={0} f\u00FCr einen ausgew\u00E4hlten Knoten ausf\u00FChren
ExecuteScripts.noScriptsAvailable=Kein Script vorhanden
-ExecuteScripts.text=S&kripte
+ExecuteScripts.text=Skripte
ExecuteScriptSecurityError.text=Beim Ausf\u00FChren des Skripts ist ein Fehler aufgetreten:\n{0}
-export_failed=Export ist fehlgeschlagen.
+export=Exportieren
+export_failed=Export fehlgeschlagen
export_pdf_text=Portables Dokumentenformat (PDF)
export_svg_text=Skalierbare Vektorgrafik (SVG)
export_using_xslt=Freeplane Export mittels XSLT
-ExportAction.text=E&xport...
-ExportBranchAction.text=Z&weig als neue Mindmap speichern...
+ExportAction.text=Export...
+ExportBranchAction.text=Zweig als neue Mindmap speichern...
ExportBranchToHTMLAction.text=Zweig als HTML
exported_file={0} Datei
ExportPdf.text=Als PDF
@@ -342,7 +366,7 @@ ExportSvg.text=Als SVG
ExportToHTMLAction.text=Als HTML
ExportToImage.jpg.text=Als JPEG
ExportToImage.png.text=Als PNG - Portable Network Graphic
-ExportToOoWriter.text=Als Open Office Writer Dokument
+ExportToOoWriter.text=LibreOffice Writer Dokument...
extension_menu=&Stile
ExternalImage_popupMenu_Change=Tauschen...
ExternalImage_popupMenu_Open=In Bildbetrachter \u00F6ffnen
@@ -350,14 +374,16 @@ ExternalImage_popupMenu_Remove=Entfernen
ExternalImage_popupMenu_ResetZoom=Zoom zur\u00FCcksetzen
ExternalImageAddAction.text=Bild hinzuf\u00FCgen...
ExternalImageChangeAction.text=Bild tauschen...
-ExternalImageRemoveAction.text=Bild entfernen...
-ExtractLinkFromTextAction.text=Link aus Knoten&text erzeugen
+ExternalImageRemoveAction.text=Bild entfernen
+ExtractLinkFromTextAction.text=Link aus Knotentext erzeugen
ExtractLinkFromTextAction.tooltip=<html>Erzeugt aus einem Knotentext, der eine g\u00FCltige URL einth\u00E4lt <br> (z.B. http://www.google.de) einen Hyperlink </html>
+extras=&Werkzeuge
f_button_unassigned=<nicht zugewiesen>
FaqOpenURLAction.text=FAQ (H\u00E4ufig gestellte Fragen)
file=&Datei
file_already_exists=Die Datei {0} existiert bereits. Soll sie \u00FCberschrieben werden?
-file_not_found=Fehler: Datei {0} nicht gefunden.
+file_management=Dateiverwaltung
+file_not_found=Datei {0} nicht gefunden
FileListFlavorHandler=Links zu Dateien
FileProperties_BranchLeafCount=Anzahl der Blatt-Knoten in selektieren Zweig(en):
FileProperties_BranchNodeCount=Anzahl der Knoten in selektierten Zweig(en):
@@ -372,7 +398,7 @@ FileProperties_NodeSelectionCount=Anzahl der selektierten Knoten:
FileProperties_TotalFilteredCount=Anzahl der Knoten, die Filterkriterien erf\u00FCllen:
FileProperties_TotalLeafCount=Gesamtzahl der Blatt-Knoten:
FileProperties_TotalNodeCount=Gesamtzahl der Knoten:
-FilePropertiesAction.text=Mindmap S&tatistik...
+FilePropertiesAction.text=Mindmap Statistik...
FileRevisionsDialog.cancel=Abbru&ch
FileRevisionsDialog.file_last_modified=Zeitstempel
FileRevisionsDialog.file_name=Dateiname
@@ -383,10 +409,12 @@ FileRevisionsDialog.question=Revisionen von {0} gefunden
FileRevisionsDialog.restore=Wiederherstellen
FileRevisionsDialog.restore.tooltip={0} durch {1} ersetzen
FileRevisionsDialog.title=Dateirevisionen
-filter=Filter aktivieren
+filter=F&ilter
filter_add=&Hinzuf\u00FCgen
filter_and=&Und
filter_any_text=Text, Details oder Notiz
+filter_clone_snapshot=Speichere angew\u00E4hlte Nachbildungen
+filter_clones=Angew\u00E4hlte Nachbildungen
filter_conditions=Filter
filter_contains=beinhaltet
filter_created_after=Erzeugt nach dem
@@ -407,7 +435,7 @@ filter_link=Hyperlink
filter_match_approximately=\u00C4hnlichkeit
filter_match_approximately_tooltip=<html>Legt fest, ob bei der Auswertung des Filterkriteriums<br/>auch das Auffinden \u00E4hnlicher Ausdr\u00FCcke zul\u00E4ssig ist<br/>z.B. w\u00FCrde das Suchen nach 'files' auch 'flies' finden</html>
filter_match_case=&Gro\u00DF-/Kleinschreibung
-filter_match_case_tooltip=<html>Legt fest, ob bei der Auswertung des Filterkriteriums auf<br/>identische Gro\u00DF- und Kleinschreibung geachtet wird</html>
+filter_match_case_tooltip=Ob bei der Auswertung Gro\u00DF- und Kleinschreibung beachtet werden soll.
filter_modified_after=ver\u00E4ndert nach dem
filter_modified_before=ver\u00E4ndert vor dem
filter_no_filtering=Kein Filter
@@ -428,31 +456,37 @@ filter_reminder_executed=bereits ausgef\u00FChrt
filter_reminder_later=noch nicht f\u00E4llig
filter_root=Wurzelknoten
filter_script=Script-Filter
-filter_select=&Selektieren
+filter_select=&Ausw\u00E4hlen
filter_selected_node_view=Selektierte Knoten
filter_selected_node_view_snapshot=Gespeicherte Auswahl
filter_style=Knotenstil
filter_time=\u00C4nderungstag
-FilterComposerDialog.save=&Speichern
-filters_not_loaded=Filter kann nicht geladen werden, die Datei ist besch\u00E4digt.
+FilterCondition=Filterbedingungen
+filterConditions=Benutzerdefinierte Filter
+filters_not_loaded=Filter konnte nicht geladen werden, die Datei ist besch\u00E4digt
+find=Finden
find_what=Suchbegriff
-FindAction.text=&Suchen...
-FirstGroupNodeAction.text=Knoten als Gruppierungs&beginn setzen
+FindAction.text=Suchen...
+FindNextAction.text=Suche vorw\u00E4rts
+FindPreviousAction.text=Suche r\u00FCckw\u00E4rts
+fit_background_to_page=Hintergrundbild auf Seite einpassen
fit_map_to_page=Mindmap auf &Seite einpassen
fit_map_to_page_height=Mindmap auf Seiten&h\u00F6he einpassen
fit_map_to_page_width=Mindmap auf Seiten&breite einpassen
-FitToPage.text=Auf &Seite einpassen
+FitToPage.text=Auf Seite einpassen
FitToPage.tooltip=Stellt die Vergr\u00F6\u00DFerung so ein, dass die gesamte Mindmap in das aktuellen Fenster passt.
fold=Falten
-FoldAllAction.text=Zweig &zuklappen
+FoldAllAction.text=Zweig zuklappen
FoldAllAction.tooltip=<html>Klappt alle Unterknoten des selektierten Zweigs zu</html>
FoldOneLevelAction.text=Letzte Ebene zuklappen
FoldOneLevelAction.tooltip=<html>Klappt letzten Unterknoten des selektierten Zweigs um eine Ebene zu</html>
-follow_graphical_link=Zu:
-FollowLinkAction.text=&Hyperlink folgen
+follow_clone=In "{0}"
+follow_graphical_link=Gehe zu ''{0}''
+FollowLinkAction.text=Hyperlink folgen
font=Schriftart
FontFamilyAction.text=Schriftart
FontSizeAction.text=Schriftgr\u00F6\u00DFe
+format=&Format
format_invalid_pattern=kein g\u00FCltiges Format
format_menu_cloud_shapes=Wolken
format_menu_edge_styles=Linienf&ormen
@@ -462,16 +496,18 @@ FormatCopy.text=Knotenstil kopieren
FormatCopy.tooltip=<html>Kopiert die Formatierung des Knotens in den Zwischenspeicher</html>
FormatPaste.text=Knotenstil einf\u00FCgen
FormatPaste.tooltip=<html>F\u00FCgt die zwischengespeicherte Formatierung in den Knoten ein</html>
-formats_not_loaded=Die Formate konnten nicht geladen werden, da die Datei besch\u00E4digt ist.
+formats_not_loaded=Die Formate konnten nicht geladen werden, da die Datei besch\u00E4digt ist
+formatting=Formatierung
formula.error.attributeValueIsNull=Das Attribut "{0}" hat den Wert NULL (ist nicht definiert).
formula.error.circularReference=Zirkelbezug: Die Formel im Knoten "{0}" nimmt Bezug auf sich selbst.
-formula.EvaluateAllAction.text=&Alle auswerten
+formula.EvaluateAllAction.text=Alle auswerten
formula.EvaluateAllAction.tooltip=Wertet alle Formeln der aktuellen Mindmap aus
formula.menuname=&Formeln
formula_editor=Formel bearbeiten
+formula_latex=Formel (LaTeX)
ForwardAction.text=Sprung zum Nachfolger-Knoten
ForwardAction.tooltip=<html>Springt zum n\u00E4chstfolgenden Knoten der<br/>Selektions-Historie der aktuellen Mindmap</html>
-FreeNodeAction.text=&Frei positionierter Knoten
+FreeNodeAction.text=Frei positionierter Knoten
Freeplane.progress.buildScreen=Bildschirm aufbauen...
Freeplane.progress.createController=Controller erzeugen...
Freeplane.progress.createInitialMode=Initialen Modus erzeugen...
@@ -479,16 +515,18 @@ Freeplane.progress.endStartup=Start beendet.
Freeplane.progress.gettingPreferenceDirectories=Ermittle Verzeichnisse...
Freeplane.progress.gettingPreferences=Lese Voreinstellungen...
Freeplane.progress.loadMaps=Mindmaps laden...
-Freeplane.progress.propagateLookAndFeel=Look And Feel \u00FCbernehmen...
+Freeplane.progress.propagateLookAndFeel=Look-and-feel \u00FCbernehmen...
Freeplane.progress.settingPreferences=Voreinstellungen setzen...
Freeplane.progress.startCreateController=Controller starten...
-Freeplane.progress.updateLookAndFeel=Look And Feel aktualisieren...
-freeplane_reverted=Freeplane_Reverted_
+Freeplane.progress.updateLookAndFeel=Look-and-feel aktualisieren...
+freeplane_reverted=Freeplane_Wiederhergestellt_
FreeplaneHelpStarter.text=Hilfeseiten...
FreeplaneHelpStarter.tooltip=Freeplane Hilfe
-GettingStartedAction.text=Funktions&referenz...
+general_settings=Allgemeine Einstellungen
+GettingStartedAction.text=Tutorial
+goto=Gehe zu
GotoLinkNodeAction.text=Folge Link
-GotoNodeAction.text=Gehe zu Knoten mit &ID...
+GotoNodeAction.text=Gehe zu Knoten mit ID...
GrabKeyDialog.common.cancel=Abbrechen
GrabKeyDialog.common.ok=OK
GrabKeyDialog.grab-key.assigned-to=Zugewiesen zu
@@ -498,15 +536,18 @@ GrabKeyDialog.grab-key.remove=Entfernen
GrabKeyDialog.grab-key.remove-ask=Sind Sie sicher, dass Sie diese Tastenzuweisung entfernen m\u00F6chten?
GrabKeyDialog.grab-key.title=Neues Tastaturk\u00FCrzel zuweisen
green=Gr\u00FCn
+grouping=Gruppierung
help=&Hilfe
+help_misc=Verschiedenes
HideableAction.tooltip=<html>Markiert jeden ge\u00E4nderten Knoten mit einer definierbaren Hintergrundfarbe.</html>
-HideAllAttributesAction.text=Alle &verbergen
-HierarchicalIcons2Action.text=&Schnittmenge der Icons aller Unterknoten bilden
-HierarchicalIconsAction.text=&Vereinigung der Icons aller Unterknoten bilden
-HierarchicalIconsAction.tooltip=<html>Oberknoten zeigt jeweils alle Icons, die von den Unterknoten<br>verwendet werden, als verkleinterte eigene Icons an</html>
+HideAllAttributesAction.text=Alle verbergen
+HierarchicalIcons2Action.text=Schnittmenge der Icons aller Unterknoten bilden
+HierarchicalIconsAction.text=Vereinigung der Icons aller Unterknoten bilden
+HierarchicalIconsAction.tooltip=Oberknoten zeigt Icons der Unterknoten verkleinert an.
+home=Home
hot_keys=Tastaturk\u00FCrzel
hot_keys_table=Tabelle der Tastaturk\u00FCrzel
-HotKeyInfoAction.text=&Tastaturk\u00FCrzel-\u00DCbersicht...
+HotKeyInfoAction.text=Tastenk\u00FCrzel-\u00DCbersicht
html_export_based_on_headings=HTML-Export - \u00DCberschriftenbasiert
html_export_fold_all=HTML-Export - alles eingeklappt
html_export_fold_currently_folded=HTML-Export - mit aktueller Faltung
@@ -518,7 +559,7 @@ icon_25%=&25%
icon_50%=&50%
icon_75%=&75%
icon_addition=Addition
-icon_attach=&Hier hin sehen
+icon_attach=&Hierhin sehen
icon_audio=Audio
icon_back=&Zur\u00FCck
icon_bee=&Freeplane
@@ -642,44 +683,54 @@ IconProgressIconUpAction.text=Fortschritt erh\u00F6hen
IconProgressIconUpAction.tooltip=Erh\u00F6ht/ F\u00FCgt Fortschritts-Icon ein (0% -> 25% -> 50% -> 75% -> 100% + OK).
IconProgressRemoveAction.text=Entferne Fortschritts-Icon
IconProgressRemoveAction.tooltip=Entfernt Fortschritts-Icon und Erweitertes Fortschritts-Icon.
-IconSelectionPlugin.text=&Icon w\u00E4hlen...
+icons=Icons
+IconSelectionPlugin.text=Icon w\u00E4hlen...
IconSelectionPlugin.tooltip=<html>Ein Fenster erscheint, in dem ein Icon ausgew\u00E4hlt werden kann.</html>
image_covertLink=Link in Bild umwandeln
ImageFlavorHandler=Bild (als separate Datei)
-import=Importieren
+images=Bilder
+import=Zweig i&mportieren
+import_export=Konvertieren
import_linked_branch_no_link=Der ausgew\u00E4hlte Knoten ist mit keiner anderen Freeplane Datei verkn\u00FCpft, die importiert werden k\u00F6nnte.
-ImportAction.text=&Importieren
-ImportBranchAction.text=aus &Datei...
-ImportExplorerFavoritesAction.text=aus &Explorer-Favoriten...
-ImportFolderStructureAction.text=aus &Ordnerstruktur...
-ImportLinkedBranchAction.text=aus &Link
-ImportLinkedBranchWithoutRootAction.text=aus Link ohne &Wurzel
-ImportMindmanagerFiles.text=aus MindManager &X5 Mindmap...
+ImportAction.text=Importieren
+ImportBranchAction.text=aus Datei...
+ImportExplorerFavoritesAction.text=aus Explorer-Favoriten...
+ImportFolderStructureAction.text=aus Ordnerstruktur...
+ImportLinkedBranchAction.text=aus Link
+ImportLinkedBranchWithoutRootAction.text=Verlinkter Zweig ohne Wurzel...
+ImportMindmanagerFiles.text=aus MindManager X5 Mindmap...
increase_branch_font_size=Schrift des Zweigs vergr\u00F6ssern
-IncreaseNodeFontAction.text=&Gr\u00F6\u00DFere Schrift
-internal_error_tooltip=Es ist ein interner Fehler aufgetreten. Details im Logfile {0}
+IncreaseNodeFontAction.text=Gr\u00F6\u00DFere Schrift
+internal_error_tooltip=Interne Fehler sind aufgetreten. Details im Logfile {0}.
invalid_export_file=ung\u00FCltiger Dateiname f\u00FCr Export
invalid_file_msg=Konnte Datei {0} nicht finden
-invalid_uri={0} ist keine g\u00FCltige URI.
-invalid_url=Die URL ist ung\u00FCltig.
-invalid_url_msg={0} ist keine g\u00FCltige URL.
-ItalicAction.text=&Kursiv
+invalid_uri={0} ist keine g\u00FCltige URI
+invalid_url=Konnte keine g\u00FCltige URL erstellen
+invalid_url_msg=Konnte keine g\u00FCltige URL erstellen f\u00FCr {0}
+ItalicAction.text=Kursiv
italicise_branch=Zweig kursiv
java_version=Java-Version: {0}
-JoinNodesAction.text=Text &verbinden
+lastOpenedMaps=Zuvor ge\u00F6ffnete Karten
latex_editor=LaTeX-Formel bearbeiten
-LatexDeleteLatexAction.text=LaTe&X Formel entfernen
-LatexEditLatexAction.text=LaTeX-&Formel bearbeiten...
+LatexDeleteLatexAction.text=LaTeX Formel entfernen
+LatexEditLatexAction.text=LaTeX-Formel bearbeiten...
LatexInsertLatexAction.msg1=<html>Sie versuchen gerade, eine <i>veraltete</i> LaTeX-Formel einzuf\u00FCgen.<br/>Die neue Art, um LaTeX Text/Formeln einzuf\u00FCgen, ist hier beschrieben:</html>
LatexInsertLatexAction.msg2=<html>Kurzfassung: <ul><li>benutzen Sie ein "\\latex "-Pr\u00E4fix im Knotentext oder</li><li><i>Ansicht->Format \u00E4ndern...</i>, dann <i>Knotentext->Format->LaTeX</i></li></ul></html>
-LatexInsertLatexAction.text=&LaTeX-Formel einf\u00FCgen...
+LatexInsertLatexAction.text=LaTeX-Formel einf\u00FCgen...
latexPatternFormat=LaTeX
+LengthUnits.cm=cm
+LengthUnits.in=inch
+LengthUnits.mm=mm
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=Bitte mindestens zwei Knoten ausw\u00E4hlen, zwischen denen Verbindungen gezeichnet werden sollen.
+licences=Lizenzen
license=Lizenz
license_text=<html>Dieses Programm ist freie Software; es kann unter den Bedingungen<br>der von der Free Software Foundation ver\u00F6ffentlichten GNU General<br>Public License weiterverteilt und/oder modifiziert werden; bezugnehmend<br>auf Version 2 der Lizenz oder einer sp\u00E4teren Version (die Wahl steht<br>dem Nutzer frei).<br><br>Dieses Programm wird in der Hoffnung verbreitet, dass es f\u00FCr den Anwender<br>hilfreich ist, allerdings OHNE JEGLICHE GARANTIE; nicht einmal<br>die i [...]
link_error=Falscher Link "{0}" kann nicht geladen werden
link_not_available_any_more=Die Verkn\u00FCpfung ist nicht mehr g\u00FCltig, da der Zielknoten in der Zwischenzeit gel\u00F6scht wurde.
link_not_found=Link {0} nicht gefunden.
+links=Hyper&link
load=&Laden
load_accelerator_presets=Sammlung laden
LoadAcceleratorPresetsAction.textPatterns.text=Text Muster
@@ -689,12 +740,15 @@ locking_old_lock_removed=Die Mindmap {0} war in Benutzung durch den Benutzer {1}
long_node_changed_cancel=Knoten wurde ver\u00E4ndert. Wollen Sie diese \u00C4nderungen verwerfen?
long_node_changed_submit=Knoten wurde ver\u00E4ndert. Wollen Sie diese \u00C4nderungen speichern?
lots_of_links_warning=Durch diesen Befehl w\u00FCrden sehr viele graphische Links erzeugt. Sollen diese Links wirklich erzeugt werden?
+main=Start
+main_menu=Men\u00FC
main_resource_directory=Installationsverzeichnis: {0}
-MainView.errorUpdateText=Fehler beim Zuweisen des Textes f\u00FCr folgende Eingabe:{0}.\nFehlerdetail: {1}
-MakeLinkFromAnchorAction.text=Link &von Anker hierher
+MainView.errorUpdateText=Fehler beim Zuweisen des Textes der Eingabe: {0}.
+MakeLinkFromAnchorAction.text=Link von Anker hierher
MakeLinkFromAnchorAction.tooltip=<html>erstellt einen lokalen bzw. globalen Hyperlink<br/>vom Bezugsknoten zum selektierten Knoten</html>
-MakeLinkToAnchorAction.text=Link von hier &zum Anker
+MakeLinkToAnchorAction.text=Link von hier zum Anker
MakeLinkToAnchorAction.tooltip=<html>erstellt einen lokalen bzw. globalen Hyperlink<br/>vom selektierten Knoten zum Bezugsknoten</html>
+manage_styles=Knotenstile verwalten
ManageAddOnsAction.text=Add-ons...
ManageAddOnsDialog.activate=Aktivieren
ManageAddOnsDialog.activation.success={0} wird bei einem Neustart aktiviert.
@@ -702,41 +756,46 @@ ManageAddOnsDialog.authored.by=von {0}
ManageAddOnsDialog.cannot.activate=Kann {0} nicht aktivieren, da es bereits aktiv ist.
ManageAddOnsDialog.cannot.configure=Kann {0} nicht konfigurieren.
ManageAddOnsDialog.cannot.deactivate=Kann {0} nicht deaktivieren, da es nicht aktiv ist.
-ManageAddOnsDialog.cannot.deinstall=Kann {0} nicht deinstallieren
+ManageAddOnsDialog.cannot.deinstall=Kann {0} nicht deinstallieren.
ManageAddOnsDialog.configure=Konfigurieren
ManageAddOnsDialog.deactivate=Deaktivieren
ManageAddOnsDialog.deactivation.success={0} wird bei einem Neustart deaktiviert.
ManageAddOnsDialog.deinstall=Deinstallieren
ManageAddOnsDialog.deinstallation.success={0} wird bei einem Neustart deinstalliert.
-ManageAddOnsDialog.error=Fehler bei der Installation: {0}
+ManageAddOnsDialog.error=Fehler bei der Installation: {0}.
ManageAddOnsDialog.install=&Installieren
ManageAddOnsDialog.install.from.known.location=Add-on von einem bekannten Ort installieren
-ManageAddOnsDialog.install.tooltip=Hier URL einer Add-on-Datei eintragen.
+ManageAddOnsDialog.install.tooltip=Hier die URL einer Add-on-Datei eintragen
ManageAddOnsDialog.map.not.opened=Mindmap {0} scheint nicht ge\u00F6ffnet zu sein.
ManageAddOnsDialog.really.deinstall={0} wirklich deinstalliern?
-ManageAddOnsDialog.search=Add-ons suchen...
+ManageAddOnsDialog.search=Add-ons suchen
ManageAddOnsDialog.search.file=Durchsuchen
ManageAddOnsDialog.select.tooltip=Datei ausw\u00E4hlen
ManageAddOnsDialog.status.downloading=Datei wird heruntergeladen...
ManageAddOnsDialog.status.installing=Add-on wird installiert...
ManageAddOnsDialog.status.success={0} erfolgreich installiert.
-ManageAddOnsDialog.tab.install=Suchen und installieren.
+ManageAddOnsDialog.tab.install=Suchen und installieren
ManageAddOnsDialog.tab.install.tooltip=Suchen und installieren von neuen Add-ons
ManageAddOnsDialog.tab.manage=Add-ons
ManageAddOnsDialog.tab.manage.themes=Themen
ManageAddOnsDialog.tab.manage.themes.tooltip=Verwaltung installierter Themen
-ManageAddOnsDialog.tab.manage.tooltip=Installierte Add-ons verwalten...
+ManageAddOnsDialog.tab.manage.tooltip=Installierte Add-ons verwalten
ManageAddOnsDialog.visit.addon.page=Add-on Seite besuchen...
-ManageConditionalStylesAction.text=&Bedingte Formatierung f\u00FCr die Map...
-ManageNodeConditionalStylesAction.text=Bedingte Formatierung f\u00FCr den Knoten...
+ManageConditionalStylesAction.text=Bedingte Formatierung f\u00FCr die Map
+ManageNodeConditionalStylesAction.text=Bedingte Formatierung f\u00FCr den Knoten
map_already_exists=Die Mindmap existiert bereits. Soll sie \u00FCberschrieben werden?
+map_background=Hintergrund der Mindmap
+map_background_image=Hintergrungbild
map_corrupted=Die Mindmap ist nicht lesbar. M\u00F6chten Sie die Details sehen?
map_load_error=Mindmap {0} konnte nicht geladen werden
map_locked_by_open=Die Mindmap {0} ist in Benutzung durch den Benutzer {1}. Daher wird sie schreibgesch\u00FCtzt ge\u00F6ffnet.
map_locked_by_save_as=Die Mindmap {0} ist in Benutzung durch den Benutzer {1}. Daher wurde die Aktion "Speichern unter..." abgebrochen.
map_not_saved=Die Mindmap wurde noch nicht gespeichert.
-MapBackgroundColorAction.text=&Mindmap Hintergrundfarbe...
-MaxNodeWidth.text=Festlegung der maximalen Breite eines Knoten
+MapBackgroundClearAction.text=Leeren
+MapBackgroundColorAction.text=Hintergrundfarbe
+MapBackgroundImageAction.text=Hintergrundbild\u2026
+maps=Mindmaps
+MaxNodeWidth.text=Maximalen Breite eines Knoten festlegen
menu_applyStyle=Knotenstil anwenden
menu_attributes=&Attribute
menu_clouds=Wolken
@@ -747,45 +806,39 @@ menu_displayAttributes=Knoten-&Attribute
menu_encryption=&Passwort
menu_error=Fehler in nutzerdefinierter Men\u00FC-Struktur {0}:\n{1}\nAbbruch
menu_extensions=Knoten-&Erweiterungen
-menu_extras=E&xtras
-menu_file_import=Zweig i&mportieren
-menu_filter=F&ilter
-menu_format=&Format
menu_group=&Gruppierung
menu_hoverView=Tooltips
-menu_iconByCategory=Icons nach Kategorie
+menu_iconByCategory=Icons nach Kategorie...
menu_iconView=Icons
menu_image=Bild
menu_insert=&Einf\u00FCgen
menu_latex_formula=LaTeX Formel
-menu_links=Hyper&link
menu_manageStyles=Knotenstile &verwalten
menu_moveNode=Knoten an&ordnen
-menu_navigate=&Navigieren
menu_newNode=&Neuer Knoten
menu_node=Knoten
menu_node_features=Knoten&eigenschaften
menu_nodes=&Knoten
menu_nodeView=Knoten-Umgebung
-menu_notes=Noti&z
-menu_noteView=&Notizen
+menu_noteView=Notizen
menu_openmaps=Maps
-menu_progress=Fortschrittsicon (%)
menu_remove_icons=Icons entfernen
menu_removeAttribute=Attribute entfernen
menu_select=Ausw\u00E4hlen
menu_time=&Zeitmanagement
menu_title=Knoten-&Inhalt
-menu_toolbars=Symbol&leisten
-menu_view=&Ansicht
-menu_viewmode=Ansichts-Einstellungen
-MenuUtils.invalid_menuitem={0} ist kein g\u00FCltiger Schl\u00FCssel f\u00FCr Men\u00FC-Elemente
+menu_viewmode=Ansichtseinstellungen
+menuname=Formel
+MenuUtils.invalid_menuitem={0} ist kein g\u00FCltiger Schl\u00FCssel f\u00FCr Men\u00FC-Elemente.
+mind_map=Mindmap
mindmap=Mindmap
MindMapNodesFlavorHandler=Knoten-Hierarchie
mindmaps=&Mindmaps
mindmaps_desc=Mindmaps (*.mm)
mindmaps_filter_desc=Filter (*.mmfilter)
MinNodeWidth.text=Festlegung der minimalen Breite eines Knotens
+misc=Verschiedenes
+miscellaneous=Verschiedenes
mode_Browse=Ansichtsmodus
mode_File=Dateimodus
mode_MindMap=Mindmapmodus
@@ -793,44 +846,49 @@ mode_na=Modus nicht vorhanden
mode_status=Modus ge\u00E4ndert zu {0}
mode_title=Freeplane - {0}
modes=Modi
-ModesMenuAction.Browse.text=&Browser-Ansicht
-ModesMenuAction.File.text=Datei-E&xplorer-Ansicht
-ModesMenuAction.MindMap.text=&Editor-Ansicht
+ModesMenuAction.Browse.text=Browser-Ansicht
+ModesMenuAction.File.text=Datei-Explorer-Ansicht
+ModesMenuAction.MindMap.text=Editor-Ansicht
most_recent_files=&Zuletzt ge\u00F6ffnete Dateien
-MoveToRootAction.text=&Wurzelknoten zentrieren
-NameConditionAction.text=Name &zuweisen
-NavigationNextMapAction.text=&N\u00E4chste Mindmap
-NavigationPreviousMapAction.text=&Vorherige Mindmap
+MoveAction.text=Verschieben
+MoveToRootAction.text=Wurzelknoten zentrieren
+NameConditionAction.text=Name zuweisen
+navigate=&Navigieren
+navigate_main=Start
+navigate_nodes=Knoten
+navigate_select=Ausw\u00E4hlen
+NavigationNextMapAction.text=N\u00E4chste Mindmap
+NavigationPreviousMapAction.text=Vorherige Mindmap
new=&Neu
-new_map_from_user_templates.text=Neue Mindmap aus &Vorlage...
+new_map_from_user_templates.text=Neue Mindmap aus Vorlage...
new_mindmap=Neue Mindmap
new_node=Neuer Knoten
-new_node_as_sibling_not_possible_for_the_root=Der Wurzelknoten kann keine Geschwister haben.
-new_version_available=Eine neue Programmversion (''{0}'') ist verf\u00FCgbar.
-NewChildAction.text=Unterknoten (&nach)
+new_node_as_sibling_not_possible_for_the_root=Der Wurzelknoten kann keine Geschwister haben
+new_version_available=Die neue Programmversion ''{0}'' ist verf\u00FCgbar
+NewChildAction.text=Unterknoten (nach)
NewerFileRevisionsFoundDialog.cancel=&\u00DCberspringen
NewerFileRevisionsFoundDialog.cancel.tooltip=Datei nicht \u00F6ffnen
NewerFileRevisionsFoundDialog.file_last_modified=Zeitstempel
NewerFileRevisionsFoundDialog.file_name=Datei
NewerFileRevisionsFoundDialog.file_size=Bytes
NewerFileRevisionsFoundDialog.open=\u00D6ffnen
-NewerFileRevisionsFoundDialog.open.tooltip=Datei \u00F6ffnen, auch wenn sie veraltet sein sollte.
+NewerFileRevisionsFoundDialog.open.tooltip=Datei \u00F6ffnen, auch falls sie veraltet sein k\u00F6nnte
NewerFileRevisionsFoundDialog.question=Neuere Versionen von {0} gefunden!
NewerFileRevisionsFoundDialog.restore=&Wiederherstellen
NewerFileRevisionsFoundDialog.restore.tooltip={0} mit {1} ersetzen
NewerFileRevisionsFoundDialog.title=Neuere Dateiversionen gefunden!
-NewFreeNodeAction.text=&Freier Knoten
+NewFreeNodeAction.text=Neuer schwebender Knoten
NewLevelStyleAction.text=Neue Automatisches Layout Ebene
-newmap.install.addon.question={0} scheint ein Add-on zu sein.\nM\u00F6chten sie es installieren?\n(W\u00E4hlen Sie "Nein" zum normalem \u00D6ffnen).
+newmap.install.addon.question={0} scheint ein Add-on Paket zu sein.\nM\u00F6chten Sie es installieren?\n(W\u00E4hlen Sie "Nein" zum normalem \u00D6ffnen.)
newmap.install.addon.title=Add-on installieren?
-NewMapAction.text=&Neue Mindmap
-NewMapViewAction.text=Neue &Mindmap Ansicht
-NewParentNode.text=Oberknoten (&vor)
+NewMapAction.text=Neue Mindmap
+NewMapViewAction.text=Neue Mindmap Ansicht
+NewParentNode.text=Oberknoten (vor)
NewParentNode.tooltip=<html>Knoten um eine Position vom Wurzelknoten abr\u00FCcken</html>
-NewPreviousSiblingAction.text=Knoten &oberhalb
-NewSiblingAction.text=Knoten &unterhalb
-NewSummaryAction.text=&Neuer Knoten gruppiert Auswahl
-NewUserStyleAction.text=&Neuen Knotenstil erstellen...
+NewPreviousSiblingAction.text=Knoten oberhalb
+NewSiblingAction.text=Knoten unterhalb
+NewSummaryAction.text=Neuer Knoten gruppiert Auswahl
+NewUserStyleAction.text=Neuer Knoten-Stil aus Auswahl
NextNodeAction.BACK.text=Zum vorherigen Knoten
NextNodeAction.BACK_N_FOLD.text=Zum vorherigen Knoten (Unterknoten falten)
NextNodeAction.FORWARD.text=Zum n\u00E4chsten Knoten
@@ -840,47 +898,53 @@ no=Nein
no_copy_attributes_before_paste_attributes=Sie k\u00F6nnen ein Attribut erst dann einf\u00FCgen, wenn Sie ein anderes kopiert haben.
NO_FORMAT=Text
no_format_copy_before_format_paste=Sie k\u00F6nnen ein Format erst dann einf\u00FCgen, wenn Sie ein anderes kopiert haben.
-no_found_from="{0}" wurde von "{1}" aus nicht gefunden.
-no_more_found_from=Keine weiteren Fundstellen von "{0}" beginnend von "{1}" aus.
+no_found_from=<html><u>{0}</u> wurde von "{1}" aus nicht gefunden.</html>
+no_more_found_from=<html> Keine weiteren Fundstellen von<u>{0}</u> beginnend von "{1}" aus.</html>
no_previous_find=Keine vorherigen Fundstellen.
no_styles_found_in_map=es wurden in der Mindmap keine Stile gefunden
node=Knoten
node_changed_discard_changes=Knoten wurde ver\u00E4ndert. Wollen Sie diese \u00C4nderungen verwerfen?
+node_details=Knotendetails
node_is_write_protected=Zielknoten ist schreibgesch\u00FCtzt.
node_location_help=Ziehen \u00E4ndert die Knotenlage, Strg+Ziehen \u00E4ndert die Knotenabst\u00E4nde, Doppelklick und Strg+Doppelklick setzt sie zur\u00FCck.
node_selector=Knotenauswahl
node_selector_message=Doppelklick w\u00E4hlt Knoten aus
+node_settings=Knoteneinstellungen
node_styles=Knotenstile
-NodeBackgroundColorAction.text=&Hintergrundfarbe...
+NodeBackgroundColorAction.text=Hintergrundfarbe...
NodeColorAction.text=Schriftfarbe...
-NodeColorBlendAction.text=Schriftfarbe &aufhellen
-NodeDownAction.text=Nach &unten tauschen
+NodeColorBlendAction.text=Schriftfarbe aufhellen
+NodeDownAction.text=Nach unten tauschen
NodeExtensions.EditNodeExtensions=Bearbeite Knotenerweiterungen
NodeExtensions.RemoveNodeExtensions=Entferne Knotenerweiterungen
-NodeListAction.text=Suchen und erse&tzen...
+NodeListAction.text=Suchen und ersetzen...
NodeListAction.tooltip=Zeigt alle Knoten in einer filterbaren Liste an.
-NodeShapeAction.bubble.text=Knotentyp &Blase
-NodeShapeAction.fork.text=Knotentyp &Linie
-NodeUpAction.text=Nach &oben tauschen
-NodeWidthAction.text=Knotenbreite be&grenzen...
+nodes=Knoten
+NodeShapeAction.bubble.text=Knotentyp Blase
+NodeShapeAction.fork.text=Knotentyp Linie
+NodeShapeAction.oval.text=Oval
+NodeShapeAction.rectangle.text=Rechteck
+NodeUpAction.text=Nach oben tauschen
nonboldify_branch=Zweig normal
nonitalicise_branch=Zweig nicht kursiv
normal=Normal
-not_saved_for_image_error=Die Mindmap muss gespeichert werden, bevor man ein Bild mit der Dateiauswahl setzen kann.
-not_saved_for_link_error=Die Mindmap muss gespeichert werden, bevor ein Link per Dateiauswahl gesetzt werden kann.
+not_saved_for_image_error=Die Mindmap muss gespeichert werden, bevor man ein Bild mit der Dateiauswahl setzen kann
+not_saved_for_link_error=Die Mindmap muss gespeichert werden, bevor ein Link per Dateiauswahl gesetzt werden kann
note_window_location=Editor-&Position
+notes=Noti&z
ok=&OK
-OKAction.text=&OK
-OnlineReference.text=Online-Dokumentation...
+OKAction.text=OK
+OnlineReference.text=Online-Mindmap-Dokumentation
+open=\u00D6ffnen
open_asMindMap=Mindmap
-OpenAction.text=\u00D6&ffnen...
-OpenFreeplaneSiteAction.text=Freeplane-&Webseite \u00F6ffnen...
+OpenAction.text=\u00D6ffnen...
+OpenFreeplaneSiteAction.text=Freeplanes Webseite \u00F6ffnen
OpenMapsAddLocation.text=Ort aus Landkarte hinzuf\u00FCgen...
OpenMapsRemoveLocation.text=Landkarteeintrag entfernen
OpenMapsViewLocation.text=Ort auf Landkarte anzeigen...
OpenPathAction.text=Datei \u00F6ffnen
OpenURLMapAction.text=\u00D6ffnen aus URL...
-OpenUserDirAction.text=Benutzereinstellungsverzeichnis \u00F6ffnen...
+OpenUserDirAction.text=Benutzer-Verzeichnis \u00F6ffnen
option_changes_may_require_restart=Die meisten Eigenschafts\u00E4nderungen werden erst bei einem Neustart von Freeplane aktiv.
OptionalDontShowMeAgainDialog.cancel=&Nein
OptionalDontShowMeAgainDialog.dontShowAgain=Nicht wieder &fragen.
@@ -893,10 +957,11 @@ OptionPanel.ADD_SIBLING=Knoten auf gleicher Ebene hinzuf\u00FCgen
OptionPanel.addons=Add-ons
OptionPanel.always_fold_all_after_load=Alle Knoten falten
OptionPanel.always_load_last_maps=Mit neuer Mindmap auch alle zuvor ge\u00F6ffneten laden
-OptionPanel.always_load_last_maps.tooltip=<html>L\u00E4d die zuletzt ge\u00F6ffneten Mindmaps auch wenn Freeplane durch<br>Doppelklick auf eine Mindmap ge\u00F6ffnet wird.</html>
+OptionPanel.always_load_last_maps.tooltip=Mindmaps nach obigen Einstellungen \u00F6ffenen, auch wenn gew\u00E4hlte Mindmap Freeplane startet.
OptionPanel.always_save_folding=immer
OptionPanel.always_save_folding_state=Aktuelle Faltung immer speichern
-OptionPanel.always_save_folding_state.tooltip=<html>Wenn diese Option ausgew\u00E4hlt wird, f\u00FChrt jedes<br>Auf- bzw. Zuklappen einer Ebene dazu, dass die Mindmap als ver\u00E4ndert betrachtet wird.<br>Beim Schlie\u00DFen von Freeplane wird dann nach dem Speicherwunsch gefragt.</html>
+OptionPanel.always_save_folding_state.tooltip=Wenn diese Option ausgew\u00E4hlt wird, f\u00FChrt jedes Auf- bzw. Zuklappen einer Ebene dazu, dass die Mindmap als ver\u00E4ndert betrachtet wird. Beim Schlie\u00DFen von Freeplane wird dann nach dem Speicherwunsch gefragt.
+OptionPanel.always_show_less_than_N_nodes_after_load=Manche Knoten aufklappen
OptionPanel.always_unfold_all_after_load=Keine Knoten falten
OptionPanel.antialias=Darstellung
OptionPanel.antialias.tooltip=<html>Bestimmt das Aussehen der Mindmap. Bitte beachten:<br>Je h\u00F6her die Kantengl\u00E4ttung ist, desto mehr Rechenzeit wird f\u00FCr die Darstellung ben\u00F6tigt.</html>
@@ -911,6 +976,7 @@ OptionPanel.ar=Arabisch / \u0627\u0644\u0639\u0631\u0628\u064A\u0629
OptionPanel.ARC=Bogen
OptionPanel.as_parent=wie der Oberknoten
OptionPanel.ask=Nachfragen
+OptionPanel.auto_edge_color=Farbe {0}
OptionPanel.automatic=Automatisch
OptionPanel.automaticFormat_level=Automatisches Layout
OptionPanel.automaticFormat_level1=Format des Wurzelknotens
@@ -924,9 +990,9 @@ OptionPanel.Cancel=Abbrechen
OptionPanel.center_selected_node=Selektierten Knoten automatisch zentrieren
OptionPanel.check_updates_automatically=Automatisch nach Updates suchen
OptionPanel.childpattern=Stil der Unterknoten
-OptionPanel.childpattern.tooltip=<html>Dieser Stil wird auf alle Unterknoten des Knotens angewendet.<br>Es werden mehrere Ebenen gleichzeitig ver\u00E4ndert!</html>
+OptionPanel.childpattern.tooltip=Das gew\u00E4hlte Muster wird auf alle Unterknoten angewendet.
OptionPanel.clear_all_setters=Alle ver\u00E4ndern
-OptionPanel.clear_all_setters.tooltip=<html>Ver\u00E4ndert alle Eigenschaften auf einmal.</html>
+OptionPanel.clear_all_setters.tooltip=Schaltet alle \u00C4nderungshinweise ein oder aus.
OptionPanel.cloud=Wolke
OptionPanel.cloudcolor=Wolke und Farbe
OptionPanel.cloudshape=Wolkenformen
@@ -934,9 +1000,10 @@ OptionPanel.combined=Kombiniert
OptionPanel.compare_as_number=Als Zahl vergleichen
OptionPanel.convert_to_current_version=<html>Sollen Mindmaps von \u00E4lteren Freeplane Versionen<br>automatisch zur aktuellen Version konvertiert werden?</html>
OptionPanel.convert_to_current_version.tooltip=<html>Nur sehr gro\u00DFe Mindmaps, die nicht konvertiert werden sollen<br>(hierzu braucht man Expertenwissen), kann man ohne Umwandlung \u00F6ffnen.</html>
+OptionPanel.copyFormatToNewSiblingIncludesIcons=Kopiere Format mit Symbolen
OptionPanel.cs=Tschechisch / \u010Desky
OptionPanel.cut_nodes_without_question=Knoten ohne Best\u00E4tigung ausschneiden?
-OptionPanel.cut_nodes_without_question.tooltip=<html>Wenn diese Option ausgew\u00E4hlt wird, werden die Knoten<br>ohne vorherige Best\u00E4tigung ausgeschnitten, was zu Datenverlust f\u00FChren kann,<br>wenn die Aktion aus Versehen ausgel\u00F6st wurde.</html>
+OptionPanel.cut_nodes_without_question.tooltip=Wenn diese Option ausgew\u00E4hlt wird, werden die Knoten ohne Best\u00E4tigung ausgeschnitten. Ein versehentliches Dr\u00FCcken kann zu Datenverlust f\u00FChren.
OptionPanel.da=D\u00E4nisch / dansk
OptionPanel.date_format=Standard Datumsformat
OptionPanel.date_format.tooltip=M\u00F6gliche Werte sind: Entweder "SHORT" (kurzes Format), "MEDIUM" (mittellanges Format), "FULL" (alles) oder ein Muster wie "dd.MM.yyyy".
@@ -955,13 +1022,14 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>F\u00FCr Windows (d
OptionPanel.default_browser_command_windows_nt=Standard Browser Befehl Windows NT
OptionPanel.default_browser_command_windows_nt.tooltip=<html>F\u00FCr Windows (die Anf\u00FChrungszeichen sind notwendig, da Links Gleichheitszeichen enthalten k\u00F6nnen).</html>
OptionPanel.default_charset=Zeichensatz
+OptionPanel.default_save_dir=Standardverzeichnis f\u00FCr neue Maps
OptionPanel.Defaults=Standards
OptionPanel.delete_automatic_saves_at_exit=L\u00F6schen der automatisch gespeicherten Mindmaps beim Verlassen
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Wenn diese Option ausgew\u00E4hlt ist, werden beim<br>Schlie\u00DFen von Freeplane alle automatisch erstellten Sicherungen gel\u00F6scht.</html>
OptionPanel.delete_nodes_without_question=Knoten ohne Best\u00E4tigung l\u00F6schen?
-OptionPanel.delete_nodes_without_question.tooltip=<html>Wenn diese Option ausgew\u00E4hlt ist, werden Knoten ohne Nachfrage gel\u00F6scht. <br><b>Dies kann bei unbeabsichtigtem L\u00F6schen zu Datenverlust f\u00FChren.</b></html>
+OptionPanel.delete_nodes_without_question.tooltip=Wenn diese Option ausgew\u00E4hlt ist, werden Knoten ohne Nachfrage gel\u00F6scht. Dies kann bei unbeabsichtigtem L\u00F6schen zu Datenverlust f\u00FChren.
OptionPanel.disable_cursor_move_paper=Normaler Maus-Cursor beim Verschieben
-OptionPanel.disable_cursor_move_paper.tooltip=<html>Wenn diese Option ausgew\u00E4hlt ist, wird kein spezieller<br>Cursor w\u00E4hrend des Verschiebevorgangs angezeigt.</html>
+OptionPanel.disable_cursor_move_paper.tooltip=<html>Kein speziellen Cursor w\u00E4hrend des Verschiebe-Vorgangs angezeigen.</html>
OptionPanel.display_inline_editor_for_all_new_nodes=Eingebetteter Editor f\u00FCr neue Knoten
OptionPanel.display_node_id=Knoten ID anzeigen
OptionPanel.edgecolor=Linienfarbe
@@ -1003,6 +1071,7 @@ OptionPanel.export_icons_in_html.tooltip=<html>Gibt an, ob die Icons auch nach H
OptionPanel.exported_image_resolution_dpi=Exportierte Bildaufl\u00F6sung (in DPI)
OptionPanel.Files=Dateien
OptionPanel.first=Am Anfang
+OptionPanel.fit_to_viewport=Hintegrundbild auf Fenstergr\u00F6e anpassen
OptionPanel.fold_on_click_inside=Knoten beim Hineinklicken falten/entfalten
OptionPanel.foldingsymbolwidth=Gr\u00F6\u00DFe des Symbols, das die Faltung anzeigt
OptionPanel.foldingsymbolwidth.tooltip=<html>Gr\u00F6\u00DFe des Kreises, der die Faltung symbolisiert</html>
@@ -1034,9 +1103,9 @@ OptionPanel.ic_disable=(deaktiviert)
OptionPanel.ic_file=Verwende Festplatte
OptionPanel.ic_ram=Verwende Arbeitsspeicher
OptionPanel.icon=Icon
-OptionPanel.icon.tooltip=<html>Wenn ein Icon ausw\u00E4hlt wird, werden alle anderen Icons des Knotens entfernt und das ausgew\u00E4hlte Icon zugewiesen.</html>
+OptionPanel.icon.tooltip=Falls angewendet, hat der Knoten nur genau dieses Icon.
OptionPanel.icons.list=Liste der angezeigten Standard-Icons
-OptionPanel.icons.list.tooltip=<html>Hier k\u00F6nnen die Standard-Icons sortieren oder deaktivieren werden.<br>Die Eintr\u00E4ge m\u00FCssen dabei mit einem ";" getrennt sein.</html>
+OptionPanel.icons.list.tooltip=Hier k\u00F6nnen die Standard-Icons sortieren oder deaktivieren werden. Die Eintr\u00E4ge m\u00FCssen dabei mit einem ";" getrennt sein.
OptionPanel.id=Indonesisch / Bahasa Indonesia
OptionPanel.IGNORE=Nichts tun
OptionPanel.il__enter_confirms_by_default=<ENTER> beendet die Texteingabe im Knoten
@@ -1053,7 +1122,7 @@ OptionPanel.language.tooltip=<html>Dies ist die Sprache, die im Programm verwend
OptionPanel.last=Am Ende
OptionPanel.last_opened_list_length=Anzahl der zuletzt ge\u00F6ffneten Dateien unter Datei -> Zuletzt ge\u00F6ffnete Dateien
OptionPanel.latex_disable_editor=Deaktiviere den LaTeX Syntax-Highlighting Editor
-OptionPanel.latex_disable_editor.tooltip=Aktiviere diese Option, wenn du Probleme mit dem Syntax-Highlighting-Editor hast.
+OptionPanel.latex_disable_editor.tooltip=Aktivieren, falls du Probleme mit dem LaTeX Editor hast
OptionPanel.latex_editor_font=Schrift f\u00FCr den LaTeX Syntax-Highlighting Editor
OptionPanel.latex_editor_font.tooltip=Benutze z.B. 'Dialog' or 'Monospaced' wenn du Unicode-Zeichen benutzt!
OptionPanel.latex_editor_font_size=Schriftgr\u00F6\u00DFe f\u00FCr den LaTeX Syntax-Highlighting Editor
@@ -1064,12 +1133,12 @@ OptionPanel.linear=Linear
OptionPanel.links=Links
OptionPanel.links.tooltip=<html>Links k\u00F6nnen etweder relativ, oder absolut sein.</html>
OptionPanel.load_folding=Faltungszustand der Mindmap laden
-OptionPanel.load_folding_from_map_default_fold_all=Wenn m\u00F6glich Faltung laden, ansonsten alles einklappen.
-OptionPanel.load_folding_from_map_default_unfold_all=Wenn m\u00F6glich Faltung laden, ansonsten alles aufklappen.
+OptionPanel.load_folding_from_map_default_fold_all=Von Mindmap laden oder alles einklappen
+OptionPanel.load_folding_from_map_default_unfold_all=Von Mindmap laden oder alles ausklappen
OptionPanel.load_last_map=Automatisch letzte Mindmap laden
OptionPanel.load_last_map.tooltip=<html>Wenn selektiert, l\u00E4d Freeplane beim Start, automatisch die zuletzt ge\u00F6ffnete Mindmap.</html>
OptionPanel.load_last_maps=Alle zuletzt ge\u00F6ffneten Mindmaps laden
-OptionPanel.lookandfeel=Look and Feel
+OptionPanel.lookandfeel=Look-and-feel
OptionPanel.lookandfeel.tooltip=<html>Bei Problemen bitte einfach 'Standard' w\u00E4hlen.</html>
OptionPanel.lt=Litauisch / kalba
OptionPanel.max_displayed_node_count=Maximale Anzahl angezeigter Knoten
@@ -1099,10 +1168,8 @@ OptionPanel.nodeformat=Format
OptionPanel.nodeformat.tooltip=<html>Textersetzung und/oder Formatierung:<ul><li><em>Textersetzung</em> (<tt>%s</tt> ist der Originaltext), z.B.. <tt>VORSICHT: %s</tt><li><em>Formatierung von Datumswerten und Zahlen</em> - siehe Beispiele in der Auswahlbox</ul></html>
OptionPanel.nodenumbering=Nummerierung
OptionPanel.nodenumbering.tooltip=F\u00FCgt hierarchische Nummerierung (z.B. 1.3.1) dem Knotentext hinzu.
-OptionPanel.nodeshape=Knotenstil
-OptionPanel.nodeshape.tooltip=<html>Legt den Stil des Knotens fest.</html>
OptionPanel.nodetext=Knotentext
-OptionPanel.nodetext.tooltip=<html>Legt den Text eines Knotens fest. Der vorherige Text wird gel\u00F6scht, wenn ein solcher Stil angewendet wird.</html>
+OptionPanel.nodetext.tooltip=Legt den Text eines Knotens fest. Der vorherige Text wird gel\u00F6scht, wenn ein solcher Stil angewendet wird.
OptionPanel.nothing=Nichts
OptionPanel.number_format=Standard Zahlenformat
OptionPanel.number_format.tooltip=Ein Muster das "#" f\u00FCr optionale, oder eine "0" f\u00FCr obligatorische Stellen enth\u00E4lt. Beispiel: "0.00" "0.0%", "$#.00", "#0"
@@ -1119,6 +1186,10 @@ OptionPanel.outline_vgap=Vertikaler Abstand
OptionPanel.paint_connectors_behind=Verbindungen hinter den Knoten zeichnen
OptionPanel.parse_data=Erkenne Datum-, Datum/Zeit- und Zahleneingaben
OptionPanel.parse_data.tooltip=Erkenne Datum-, Datum/Zeit- und Zahleneingaben und wende Standardformate an; z.B. 100.000,00, 31.12, 31.12.99, 1999-12-31 und 1999-12-31 23:59
+OptionPanel.parse_formulas=Erkenne Formeln
+OptionPanel.parse_formulas.tooltip=Interpretiere Formeln in Knoten, die mit '=' anfangen: Siehe http://www.freeplane.org/wiki/index.php/Formulas.
+OptionPanel.parse_latex=Erkenne LaTeX
+OptionPanel.parse_latex.tooltip=Interpretiere LaTeX-Formeln per Format oder Pr\u00E4fix: Siehe http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane.
OptionPanel.PASTE_HTML=Einf\u00FCgen als HTML
OptionPanel.PASTE_PLAIN_TEXT=Einf\u00FCgen als Text
OptionPanel.path_property_may_not_be_empty=Der Pfad darf nicht leer sein! Die \u00C4nderungen wurden r\u00FCckg\u00E4ngig gemacht.
@@ -1127,7 +1198,7 @@ OptionPanel.patternname.tooltip=Eindeutiger Name des Stils
OptionPanel.pl=Polnisch / polski
OptionPanel.placenewbranches=Neue Knoten einf\u00FCgen
OptionPanel.placenewbranches.tooltip=<html>Legt fest, wo neue Knoten eingef\u00FCgt werden.</html>
-OptionPanel.plugin.tooltip=Plugins, die das Programm erweitern
+OptionPanel.plugin.tooltip=Nicht mitgelieferte Plugins.
OptionPanel.plugins=Plugins
OptionPanel.presentation_dimmer_transparency=Transparenz f\u00FCr Presentation
OptionPanel.presentation_mode=Pr\u00E4sentations-Modus
@@ -1139,8 +1210,8 @@ OptionPanel.RECT=Rechteck
OptionPanel.relative=Relativ
OptionPanel.remind_type_of_new_nodes.tooltip=<html><ul><li>"Nachfragen" fr\u00E4gt nach</li><li></html>"Ja" zeigt den Richt-Text-Editor an</li><li>"Nein" verwendet den einfachen Text-Editor</li></ul></html>
OptionPanel.remind_use_rich_text_in_new_nodes=F\u00FCr eingef\u00FCgte Knoten erweiterte Formatierung verwenden
-OptionPanel.remove_notes_without_question=Notizen ohne Nachfrage l\u00F6schen
-OptionPanel.remove_notes_without_question.tooltip=<html>Wenn diese Option gew\u00E4hlt ist, werden die Notizen des Knotens ohne Warnung gel\u00F6scht.<br><b> Dies kann bei unbeabsichtigtem L\u00F6schen zu Datenverlust f\u00FChren!</b></html>
+OptionPanel.remove_notes_without_question=Notizen ohne Nachfrage l\u00F6schen?
+OptionPanel.remove_notes_without_question.tooltip=Wenn diese Option gew\u00E4hlt ist, werden die Notizen des Knotens ohne Warnung gel\u00F6scht. Dies kann bei unbeabsichtigtem L\u00F6schen zu Datenverlust f\u00FChren.
OptionPanel.resources_use_default_font_for_notes_too=Standard Zeichensatz f\u00FCr Notizen verwenden
OptionPanel.resources_use_margin_top_zero_for_notes=Oberen Rand f\u00FCr Notizen entfernen
OptionPanel.revision_color=Revisionfarbe
@@ -1149,10 +1220,11 @@ OptionPanel.ROUND_RECT=Abgerundetes Rechteck
OptionPanel.ru=Russisch / \u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043A
OptionPanel.save_folding=Faltung speichern
OptionPanel.save_folding_if_map_is_changed=Wenn Mindmap ver\u00E4ndert wurde
+OptionPanel.save_last_position_in_map=Letzte Position in Mindmap speichern
OptionPanel.save_modification_times=\u00C4nderungszeiten speichern
OptionPanel.script_classpath=Skripte Klassenpfad: Verzeichnisse, die Klassen und/oder JARs enthalten
OptionPanel.script_classpath.tooltip=<html>Eine Liste von JARs und/oder Verzeichnissen, die zum Klassenpfad der Skripte/Formeln hinzugef\u00FCgt wird. <br> Verwenden Sie ";" (Windows) oder ":" (Linux, Mac), um die Eintr\u00E4ge der Liste voneinander zu trennen.<br>Verzeichnisse werden nach JAR- und .class-Dateien durchsucht.<br>Relative Pfade werden als relativ zum Freeplane Benutzerverzeichnis angesehen.<br> Wenn Sie den Klassenpfad angeben, muss er lesbar sein.</html>
-OptionPanel.script_compilation_disabled_extensions=Dateiendungen, f\u00FCr die nicht kompiliert werden soll.
+OptionPanel.script_compilation_disabled_extensions=Dateiendungen, f\u00FCr die nicht kompiliert werden soll (Siehe Tooltip)
OptionPanel.script_compilation_disabled_extensions.tooltip=<html>Wenn alle Skripte einer zus\u00E4tzlich installierten Sprache<br>(au\u00DFer Groovy und JavaScript) grunds\u00E4tzliche Kompilationsfehler<br>haben, kann das Hinzuf\u00FCgen der Dateiendung hier helfen<br>(kommaseparierte Liste).</html>
OptionPanel.script_directories=Suchpfad f\u00FCr Skripte
OptionPanel.script_directories.tooltip=<html>Eine Liste von Skript-Verzeichnissen (zus\u00E4tzlich zu "scripts").<br>Verwende ";"(Windows) oder ":" (Linux, Mac) um die Eintr\u00E4ge voneinander zu trennen.<br>Relative Pfadangaben beziehen sich auf das Freeplane Benutzerverzeichnis.</html>
@@ -1179,6 +1251,7 @@ OptionPanel.separator.data_formats=Formatieren und parsen von Datum
OptionPanel.separator.default_colors=Standard-Farben
OptionPanel.separator.default_fonts=Standard-Schriftarten
OptionPanel.separator.default_styles=Standard-Stile
+OptionPanel.separator.edge_colors=Automatische Randfarbe
OptionPanel.separator.EdgeControls=Linieneigenschaften
OptionPanel.separator.edit_long_node_window=Externer Editor f\u00FCr gro\u00DFe Knoten
OptionPanel.separator.editing=Editor-Einstellungen
@@ -1197,7 +1270,7 @@ OptionPanel.separator.key_typing=Tastatureingabe
OptionPanel.separator.language=Sprache
OptionPanel.separator.latex=LaTeX
OptionPanel.separator.load=Laden
-OptionPanel.separator.look_and_feel=Look And Feel
+OptionPanel.separator.look_and_feel=Look-and-feel
OptionPanel.separator.mouse_wheel=Mausrad
OptionPanel.separator.new_node_commands=Knotenerzeugung
OptionPanel.separator.node_editing_commands=Knotenver\u00E4nderung
@@ -1217,7 +1290,7 @@ OptionPanel.separator.RichTextEditor=Rich-Text-Editor
OptionPanel.separator.root_node_appearance=Stil des Wurzel-Knotens
OptionPanel.separator.save=Speichern
OptionPanel.separator.scripting=Skripte
-OptionPanel.separator.scrollbar=Scrollbar
+OptionPanel.separator.scrollbar=Bildlaufleiste
OptionPanel.separator.search=Suchen
OptionPanel.separator.selection_colors=Selektion Farben
OptionPanel.separator.selection_method=Auswahlmodus
@@ -1235,11 +1308,12 @@ OptionPanel.setscript.tooltip=Schaltet die M\u00F6glichkeit zu, ein Skript zu de
OptionPanel.sharp_bezier=Geschwungen und spitz
OptionPanel.sharp_linear=Spitze gerade Linie
OptionPanel.show_icon_for_attributes=Icon f\u00FCr Attribut anzeigen
+OptionPanel.show_less_than_N_nodes_by_default_after_load=Von Karte laden oder manche Knoten aufklappen
OptionPanel.show_node_tooltips=Notiz anzeigen
OptionPanel.show_note_icons=Icon f\u00FCr Notiz anzeigen
OptionPanel.show_styles_in_tooltip=Stil-Name anzeigen
-OptionPanel.signed_script_are_trusted=Signierten Skripts vertrauen (empfohlen)
-OptionPanel.signed_script_are_trusted.tooltip=<html>Wenn Skripte von einer vertrauensw\u00FCrdigen Stelle (z.B. von den Freeplane Entwicklern, oder von Ihnen selbst)<br> signiert sind werden sie ohne Restriktionen ausgef\u00FChrt.</html>
+OptionPanel.signed_script_are_trusted=Signierten Skripts vertrauen (empfohlen).
+OptionPanel.signed_script_are_trusted.tooltip=Wenn Skripte von einer vertrauensw\u00FCrdigen Stelle (z.B. von den Freeplane Entwicklern, oder von Ihnen selbst) signiert sind werden sie ohne Restriktionen ausgef\u00FChrt.
OptionPanel.simplyhtml.default_paste_mode=Standard-Einf\u00FCgemodus
OptionPanel.single_backup_directory=Nur ein Verzeichnis f\u00FCr Backup-Dateien verwenden
OptionPanel.single_backup_directory.tooltip=<html>Backup Dateien und Automatisch gespeicherte Dateien werden gemeinsam in ein Verzeichnis gespeichert.</html>
@@ -1252,7 +1326,7 @@ OptionPanel.sk=Slovakisch / sloven\u010Dina
OptionPanel.sl=Slovenisch / sloven\u0161\u010Dina
OptionPanel.slow_scroll_selected_node=Langsames Scrollen zum selektierten Knoten
OptionPanel.spelling_opt_case_sensitive=Gro\u00DF-/Kleinschreibung
-OptionPanel.spelling_opt_ignore_all_caps_words=Alle W\u00F6rter aus GROSSBUCHSTABEN ignorieren
+OptionPanel.spelling_opt_ignore_all_caps_words=W\u00F6rter aus GROSSBUCHSTABEN ignorieren.
OptionPanel.spelling_opt_ignore_capitalization=Gro\u00DFbuchstaben am Wortbeginn ignorieren
OptionPanel.spelling_opt_ignore_words_with_numbers=W\u00F6rter mit Ziffern ignorieren
OptionPanel.spelling_opt_suggestions_limit_dialog=Maximale Anzahl der Vorschl\u00E4ge im Dialog
@@ -1297,16 +1371,17 @@ OptionPanel.undo_levels=Anzahl widerrufbarer Aktionen
OptionPanel.undo_levels.tooltip=<html>Legt fest, wie viele Aktionen r\u00FCckg\u00E4ngig gemacht werden k\u00F6nnen.</html>
OptionPanel.unfold_on_paste=Knoten beim Einf\u00FCgen entfalten
OptionPanel.unfold_on_paste.tooltip=Knoten beim Einf\u00FCgen und beim Drag-And-Drop entfalten
+OptionPanel.use_auto_edge_color=Farbe {0} verwenden
OptionPanel.use_common_out_point_for_root_node=Alle Linien am Wurzelknoten starten aus einem Punkt
OptionPanel.use_common_out_point_for_root_node.tooltip=<html>Wenn selektiert starten alle Linien am Wurzelknoten aus einem Punkt.</html>
OptionPanel.use_tabbed_pane=Karteireiter verwenden
-OptionPanel.use_tabbed_pane.tooltip=<html>Wenn selektiert, werden die ge\u00F6ffneten Mindmaps als einzelne Karteireiter angezeigt.</html>
+OptionPanel.use_tabbed_pane.tooltip=Wenn selektiert, werden Mindmaps in Tabs angezeigt (wie in Firefox :-) ).
OptionPanel.user_defined_screen_resolution=Bildschirm-Aufl\u00F6sung (dpi)
OptionPanel.validate_classpath_needs_readaccess=Skripte: Wenn Sie den Classpath definieren, m\u00FCssen sie den lesenden Zugriff auf Dateien erlauben!
-OptionPanel.validate_invalid_date_format=Standard-Format f\u00FCr Datum ist ung\u00FCltig.
-OptionPanel.validate_invalid_datetime_format=Standard-Format f\u00FCr Datum-Zeit ist ung\u00FCltig.
-OptionPanel.validate_invalid_number_format=Standard-Format f\u00FCr Zahlen ist ung\u00FCltig.
-OptionPanel.validate_write_without_read=Scripting: Evtl. ben\u00F6tigen Sie zus\u00E4tzlich zum schreibenden Zugriff auch den lesenden Zugriff auf Dateien.
+OptionPanel.validate_invalid_date_format=Standard-Format f\u00FCr Datum ist ung\u00FCltig
+OptionPanel.validate_invalid_datetime_format=Standard-Format f\u00FCr Datum-Zeit ist ung\u00FCltig
+OptionPanel.validate_invalid_number_format=Standard-Format f\u00FCr Zahlen ist ung\u00FCltig
+OptionPanel.validate_write_without_read=Skripte: Evtl. ben\u00F6tigen Sie zus\u00E4tzlich zum schreibenden Zugriff auch den lesenden Zugriff auf Dateien.
OptionPanel.validation_error=<html><body>Fehler bei der Auswertung:<p><em>{0}</em><p>Bitte \u00E4ndern Sie die Voreinstellungen, um die Fehler zu beheben.</body></html>
OptionPanel.validation_warning=<html><body>Warnung(en) bei der Auswertung:<p><em>{0}</em></body></html>
OptionPanel.vi=Vietnamesisch / Ti\u1EBFng Vi\u1EC7t
@@ -1316,21 +1391,21 @@ OptionPanel.windows=Windows
OptionPanel.zh_CN=Einfaches Chinesisch / \u7B80\u4F53\u5B57
OptionPanel.zh_TW=Traditionelles Chinesisch / \u7E41\u9AD4\u5B57
org.freeplane.plugin.bugreport.agree=Senden
-org.freeplane.plugin.bugreport.always_agree=Immer senden.
-org.freeplane.plugin.bugreport.always_deny=Niemals senden.
-org.freeplane.plugin.bugreport.deny=Nicht senden.
+org.freeplane.plugin.bugreport.always_agree=Immer senden
+org.freeplane.plugin.bugreport.always_deny=Niemals senden
+org.freeplane.plugin.bugreport.deny=Nicht senden
org.freeplane.plugin.bugreport.dialog.title=Automatischer Fehlerreport
org.freeplane.plugin.bugreport.freeplane_team=Nachricht vom Freeplane Team
org.freeplane.plugin.bugreport.lastreport=Letzer Empfangener Report
org.freeplane.plugin.bugreport.never=Niemals nach Hilfe fragen
-org.freeplane.plugin.bugreport.question=<html>Freeplane hat eine automatische Fehlerr\u00FCckverfolgungs- Funktion.<br>Dabei werden niemals pers\u00F6nliche Daten \u00FCbermittelt.<br>Ihre Fehlerberichte k\u00F6nnen uns aber helfen die Software zu verbessern.</html>
+org.freeplane.plugin.bugreport.question=Freeplane hat eine automatische Fehlerr\u00FCckverfolgungs-Funktion.
org.freeplane.plugin.bugreport.report=Derzeitiger Report
org.freeplane.plugin.bugreport.wanted_bug=Ein Fehler ist aufgetreten und wurde automatisch weitergemeldet.\nWir brauchen aber noch mehr Informationen, um dieses unerwartete Verhalten reproduzieren zu k\u00F6nnen.\n\nBitte helfen Sie uns dabei, indem Sie einen Fehlerbericht in userem Mantis-Fehlerverfolgungstool eingeben.\nErkl\u00E4ren Sie auch, was Sie getan haben, als der Fehler auftrat, so dass wir Ihn reproduzieren k\u00F6nnen.\n\nWenn Sie OK dr\u00FCcken, wird automatisch das Fehler [...]
org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined=Der Knoten {0} ist nicht definiert
out_of_memory=Zu wenig Speicher.
-overwrite_keyset_question=<html>Es existiert bereits eine Tastaturk\u00FCrzel-Sammlung mit diesem Namen.<br/>Soll sie \u00FCberschrieben werden?</html>
-PageAction.text=Seite einr&ichten...
-password_is_not_ascii=Passwort enth\u00E4lt Zeichen ausserhalb des ASCII-Zeichensatzes.
+overwrite_keyset_question=Bestehende Tastaturk\u00FCrzel-Sammlung \u00FCberschrieben?
+PageAction.text=Seite einrichten...
+password_is_not_ascii=Passwort enth\u00E4lt Zeichen ausserhalb des ASCII-Zeichensatzes
PasteAction.text=Einf&\u00FCgen
PasteAttributes.text=Attribute einf\u00FCgen
PatternNewNameProperty=Neuer Stil
@@ -1365,7 +1440,7 @@ plugins/ScriptEditor.run=&Starten
plugins/ScriptEditor.sign=Skript s&ignieren...
plugins/ScriptEditor/window.Result=Ergebnis:
plugins/ScriptEditor/window.title=Skripteditor
-plugins/ScriptingEngine.illegalAccessToInternalAPI=Unerlaubter Zugriff auf das interne API (Paket {0}). Bitte kontaktieren Sie das Freeplane-Team, falls Sie den Zugriff ben\u00F6tigen.
+plugins/ScriptingEngine.illegalAccessToInternalAPI=Unerlaubter Zugriff auf die interne API (Paket {0}). - Bitte kontaktieren Sie das Freeplane-Team, falls die Skript-API nicht ausreicht.
plugins/TimeList.xml_Created=Erzeugt
plugins/TimeList.xml_Date=Termin
plugins/TimeList.xml_Details=Details
@@ -1394,127 +1469,148 @@ plugins/TimeManagement.xml_removeReminderButton_tooltip=Entfernt alle Wiedervorl
plugins/TimeManagement.xml_Replace=Ersetzen
plugins/TimeManagement.xml_Replace_All=Alle Ersetzen
plugins/TimeManagement.xml_Replace_Selected=Markierte Ersetzen
-plugins/TimeManagement.xml_Select=Selektieren
+plugins/TimeManagement.xml_Select=Ausw\u00E4hlen
plugins/TimeManagement.xml_todayButton=Heute
plugins/TimeManagement.xml_WindowTitle=Zeit Management
plugins/TimeManagement.xml_WindowTitle_All_Nodes=Suchen & Ersetzen
preferences=Einstellungen
+print=Drucken
print_preview_title=Vorschau
-PrintAction.text=&Drucken...
+PrintAction.text=Drucken...
PrintDirectAction.text=Drucken
printing_settings=Druckskalierung
-PrintPreviewAction.text=&Vorschau...
+PrintPreviewAction.text=Vorschau...
+progress=Fortschrittsicon (%)
PropertyAction.dialog=Einstellungen
-PropertyAction.text=Ein&stellungen...
-QuickFilterAction.text=&Schneller Filter
-QuickFindAction.BACK.text=Suche &r\u00FCckw\u00E4rts
-QuickFindAction.FORWARD.text=Suche &vorw\u00E4rts
+PropertyAction.text=Einstellungen...
+QuickFilterAction.text=Schneller Filter
+QuickFindAction.BACK.text=Suche r\u00FCckw\u00E4rts
+QuickFindAction.FORWARD.text=Suche vorw\u00E4rts
QuickFindAllAction.text=Alle passenden Knoten ausw\u00E4hlen
QuickHighlightAction.text=alle passenden Knoten hervorheben
-QuitAction.text=&Beenden
+QuitAction.text=Beenden
read_only=Schreibgesch\u00FCtzt
-ReadScriptError.text=Fehler beim Lesen des Skripts.\nSiehe Logfile zu Details.
+ReadScriptError.text=Fehler beim Lesen des Skripts
really_convert_to_current_version=<html>Diese Mindmap wurde mit einer \u00E4lteren Version von Freeplane erzeugt.<br>Soll sie konvertiert werden (empfohlen)?<br>Nicht konvertierte Mindmaps k\u00F6nnen evtl. nicht richtig angezeigt werden.</html>
really_cut_node=Knoten wirklich ausschneiden?
really_execute_script=Wollen Sie wirklich die Skripte in dieser Mindmap ausf\u00FChren? Es ist m\u00F6glich, dass diese Skripte Ihren Rechner besch\u00E4digen.
really_remove_node=Knoten wirklich l\u00F6schen?
really_remove_notes=Wollen Sie wirklich die Notizen l\u00F6schen?
-ReapplyFilterAction.text=E&rneut anwenden
+ReapplyFilterAction.text=Erneut anwenden
red=Rot
RedefineStyleAction.text=Stil neu festlegen
-RedoAction.text=&Wiederherstellen
-RedoFilterAction.text=&Wiederherstellen
+RedoAction.text=Wiederherstellen
+RedoFilterAction.text=Wiederherstellen
regular_expressions=Regul\u00E4re Ausdr\u00FCcke
ReminderHookAction.text=Wiedervorlage entfernen
ReminderHookAction.tooltip=Entfernt eine Wiedervorlage.
remove_file_from_list_on_error=Konnte Datei {0} nicht \u00F6ffnen. Soll sie aus der Liste der zuletzt ge\u00F6ffneten Dateien entfernt werden?
remove_shortcut_question=Tastaturk\u00FCrzel ersetzen?
-RemoveAllIconsAction.text=L\u00F6sche &alle
+RemoveAllIconsAction.text=L\u00F6sche alle
RemoveConnectorAction.text=Verbindung entfernen
-RemoveEncryption.text=Knotenpasswort &entfernen
+RemoveEncryption.text=Knotenpasswort entfernen
RemoveFormatAction.text=Format entfernen
-RemoveIcon_0_Action.text=L\u00F6sche &erstes
-RemoveIconAction.text=L\u00F6sche &letztes
+RemoveIcon_0_Action.text=L\u00F6sche erstes
+RemoveIconAction.text=L\u00F6sche letztes
RemoveNoteAction.text=l&\u00F6schen
RemoveNoteAction.tooltip=<html>Entfernt Notizen von evtl. mehreren Knoten.</html>
rename=&Umbenennen
-repair_link=Link reparieren?
+repair_link=Link reparieren
repair_link_question=Die Mindmap konnte nicht gefunden werden. Link von Hand reparieren?
replace=Ersetzen
replace_shortcut_question=Dieses Tastaturk\u00FCrzel ist bereits zugewiesen an:\n{0}\nSoll die Zuweisung ge\u00E4ndert werden?
replace_shortcut_title=Tastaturk\u00FCrzel ersetzen?
-ReportBugAction.text=&Fehler melden...
-RequestFeatureAction.text=&Verbesserungsvorschlag machen...
+ReportBugAction.text=Programm-Fehler melden
+RequestFeatureAction.text=Verbesserungs-Vorschlag machen
reset_to_default=Default benutzen
-ResetNodeLocationAction.text=&Position zur\u00FCcksetzen
+ResetNodeLocationAction.text=Position zur\u00FCcksetzen
ResetStyleAction.text=Knotenstil zur\u00FCcksetzen
-RevertAction.text=Wieder&herstellen aus lokaler Historie...
+resources=Ressourcen
+RevertAction.text=Wiederherstellen aus lokalem Verlauf
RevisionPluginAction.text=&\u00C4nderungen markieren
+ribbon.extras=Extras
+ribbon.filter=Filter
+ribbon.formatting=Formatierung
+ribbon.help=Hilfe
+ribbon.home=Startseite
+ribbon.navigate=Navigieren
+ribbon.nodes=Knoten
+ribbon.resources=Ressourcen
+ribbon.search_and_filter=Such- und Filterfunktion
+ribbon.tools_and_settings=Werkzeuge und Einstellungen
+ribbon.view=Ansicht
+save=&Speichern
save_failed=Der Versuch, {0} zu speichern, ist fehlgeschlagen.
save_unsaved=Soll die folgende Mindmap gespeichert werden?
save_unsaved_styles=Knotenstile speichern?
SaveAcceleratorPresetsAction.text=Sammlung speichern...
-SaveAction.text=&Speichern
-SaveAll.text=&Alle speichern...
+SaveAction.text=Speichern
+SaveAction_readonlyMsg=Diese Karte ist schreibgesch\u00FCtzt. Bitte benutzen Sie 'Datei->Karte speichern unter...'.
+SaveAction_readonlyTitle=Versuche eine read-only Mindmap zu speichern
+SaveAll.text=Alle ge\u00F6ffneten Mindmaps speichern
SaveAll.tooltip=Speichert alle ge\u00F6ffneten Mindmaps
-SaveAsAction.text=Speichern &unter...
-saved=Mindmap wurde gespeichert.
+SaveAs_toReadonlyMsg={0} ist schreibgesch\u00FCtzt. Bitte eine andere Datei zum Speichern ausw\u00E4hlen.
+SaveAs_toReadonlyTitle=Versuch in eine schreibgesch\u00FCtzte Datei zu speichern
+SaveAsAction.text=Speichern unter...
+saved=Gespeichert
saving_canceled=Speicher Vorgang abgebrochen
-scanners_not_loaded=Scanner konnten nicht geladen werden. Datei korrupt.
-scheme_evaluate=Evaluate!
+scanners_not_loaded=Scanner konnten nicht geladen werden, Datei korrupt
+scheme_evaluate=Auswerten!
script_execution_disabled=Ausf\u00FChrung von Skripten ist deaktiviert, s. Extras/Einstellungen/Plugins
-ScriptEditor.text=Skript&editor...
+ScriptEditor.text=Skripteditor...
ScriptEditor.tooltip=Erm\u00F6glicht es Freeplane \u00FCber Skripte zu steuern.
ScriptEditorPanel.changed_cancel=Die Skripte wurden ver\u00E4ndert. Wollen Sie wirklich abbrechen?
+scripting=Skripte
scripting_api_generator_legend=Legende
scripting_api_generator_proxy=Proxy
-scripting_api_generator_title=Scripting API
-scripting_api_generator_utilities=Utilities
-scripting_api_generator_web=Web Ressourcen
-select_favorites_folder=Suchen Sie den Ordner aus, in dem Ihre Favoriten sich befinden.
+scripting_api_generator_title=Skript-API
+scripting_api_generator_utilities=Dienstprogramme
+scripting_api_generator_web=Web-Ressourcen
+search_and_filter=Suchen und filtern
+select_favorites_folder=Ordner w\u00E4hlen der Favoriten enth\u00E4lt
select_file_export_to=Die Datei, zu der exportiert werden soll, selektieren
select_folder_for_importing=W\u00E4hlen Sie den Ordner aus, der importiert werden soll
select_icon=Iconauswahl
select_menu_item_dialog=Men\u00FCeintrag ausw\u00E4hlen
select_menu_item_root_node=Men\u00FC
SelectAllAction.text=Alles markieren
-SelectBranchAction.text=Zweig &markieren
-SelectedPasteAction.text=Ei&nf\u00FCgen als...
+SelectBranchAction.text=Zweig markieren
+SelectedPasteAction.text=Einf\u00FCgen als...
selection_method_by_click=Einfacher Mausklick selektiert
selection_method_delayed=Verz\u00F6gerte automatische Selektion
selection_method_direct=Mausber\u00FChrung selektiert
-SelectNoteAction.text=&Wechsel Notiz<->Knoten
+SelectNoteAction.text=Wechsel Notiz<->Knoten
SelectNoteAction.tooltip=Wechselt vom bzw. zum Notiz-Editor
-set_accelerator_on_next_click_action=Klicken sie auf den Men\u00FCeintrag, der dem Tastaturk\u00FCrzel zugewiesen werden soll.
+set_accelerator_on_next_click_action=Um ein neues Tastaturk\u00FCrzel zu erstellen, klicken sie auf den gew\u00FCnschten Men\u00FCeintrag.
SetAccelerator.dialogTitle=Tastaturk\u00FCrzel zuweisen
SetAccelerator.keystrokeDetected=Tastaturk\u00FCrzel {0} ist keinem Men\u00FCeintrag zugeordnet.
-SetAcceleratorOnNextClickAction.text=Tastaturk\u00FCrzel &zuweisen...
-SetImageByFileChooserAction.text=Bildver&kn\u00FCpfung erstellen...
-SetLinkAnchorAction.text=Setze &Anker
-SetLinkAnchorAction.tooltip=<html>setzt aktuellen Knoten als Bezugspunkt von dem aus<br/>bzw. zu dem ein lokaler bzw. datei\u00FCbergreifender<br/>Hyperlink erstellt werden kann.</html>
+SetAcceleratorOnNextClickAction.text=Tastaturk\u00FCrzel zuweisen...
+SetImageByFileChooserAction.text=Bildverkn\u00FCpfung erstellen...
+SetLinkAnchorAction.text=Setze Anker
+SetLinkAnchorAction.tooltip=<html>gew\u00E4hlten Knoten als k\u00FCnftigen Bezugspunkt<br/>zu lokalen oder globalen Verkn\u00FCpfungen machen.
SetLinkAnchorAction.tooltip_anchored=<html>setzt aktuellen Knoten als Bezugspunkt von dem aus<br/>bzw. zu dem ein lokaler bzw. datei\u00FCbergreifender<br/>Hyperlink erstellt werden kann.<br/>Aktuell: {0}</html>
-SetLinkByFileChooserAction.text=Link auf &Datei...
-SetLinkByTextFieldAction.text=Link per Te&xtfeldeingabe...
+SetLinkByFileChooserAction.text=Link auf Datei...
+SetLinkByTextFieldAction.text=Link per Textfeldeingabe...
SetNodeLink.text=Link auf Knoten...
-SetNoteWindowPosition.bottom.text=&Unten
-SetNoteWindowPosition.left.text=&Links
-SetNoteWindowPosition.right.text=&Rechts
-SetNoteWindowPosition.top.text=&Oben
-SetShortenerStateAction.text=Verk\u00FCrzte &Knotenansicht
+SetNoteWindowPosition.bottom.text=Unten
+SetNoteWindowPosition.left.text=Links
+SetNoteWindowPosition.right.text=Rechts
+SetNoteWindowPosition.top.text=Oben
+SetShortenerStateAction.text=Verk\u00FCrzte Knotenansicht
sf_login_required=Source Forge login ben\u00F6tigt. Weitermachen?
-ShowAllAttributesAction.text=Alle &anzeigen
-ShowAncestorsAction.text=Zeige &Vorg\u00E4nger
-ShowAttributeDialogAction.text=&Attribute verwalten...
-ShowDescendantsAction.text=Zeige &Nachfolger
-ShowFilterToolbarAction.text=&Filter
-ShowFormatPanel.text=&Format und Eigenschaften
+ShowAllAttributesAction.text=Alle anzeigen
+ShowAncestorsAction.text=Zeige Vorg\u00E4nger
+ShowAttributeDialogAction.text=Attribute verwalten...
+ShowDescendantsAction.text=Zeige Nachfolger
+ShowFilterToolbarAction.text=Filter
+ShowFormatPanel.text=Format und Eigenschaften
ShowFormatPanel.tooltip=Dialog, in dem Knoten- und Kantenformate auf einmal ge\u00E4ndert werden k\u00F6nnen.
-ShowHideNoteAction.text=&Editor einblenden
+ShowHideNoteAction.text=Editor einblenden
ShowHideNoteAction.tooltip=Damit kann man das Notizfenster verbergen bzw. wieder anzeigen.
ShowNextChildAction.text=N\u00E4chsten Unterknoten anzeigen
-ShowNotesInMapAction.text=Notiz immer &einblenden
-ShowSelectedAttributesAction.text=Nur ausge&w\u00E4hlte anzeigen
-ShowSelectionAsRectangleAction.text=&Rechteck als Auswahlmarkierung
+ShowNotesInMapAction.text=Notiz immer einblenden
+ShowSelectedAttributesAction.text=Nur ausgew\u00E4hlte anzeigen
+ShowSelectionAsRectangleAction.text=Rechteck als Auswahlmarkierung
simplyhtml.aboutFrameTitle=\u00DCber dieses Programm
simplyhtml.aboutLabel=\u00DCber SimplyHTML...
simplyhtml.alignCenter=Zentriert
@@ -1537,8 +1633,8 @@ simplyhtml.cellBorderTabLabel=Rahmen
simplyhtml.cellGenTabLabel=Allgemein
simplyhtml.cellMarginTabLabel=Abstand
simplyhtml.cellPanelTitle=Zellenformat
-simplyhtml.clearFormatLabel=Formattierung l\u00F6schen
-simplyhtml.clearFormatTip=Formattierung l\u00F6schen
+simplyhtml.clearFormatLabel=Formatierung l\u00F6schen
+simplyhtml.clearFormatTip=Formatierung l\u00F6schen
simplyhtml.close=Schlie\u00DFen
simplyhtml.closeBtnName=Schlie\u00DFen
simplyhtml.colorLabel=Farbe
@@ -1587,9 +1683,9 @@ simplyhtml.formatListTip=Listenformat \u00E4ndern
simplyhtml.formatParaLabel=Absatz...
simplyhtml.formatParaTip=Absatzformat \u00E4ndern
simplyhtml.formatTableLabel=Tabelle...
-simplyhtml.formatTableTip=Tabelle formatieren...
+simplyhtml.formatTableTip=Tabelle formatieren
simplyhtml.helpLabel=Hilfe
-simplyhtml.htmlTabTitle=HTML Code Ansicht
+simplyhtml.htmlTabTitle=HTML-Code-Ansicht
simplyhtml.imageFileDesc=Bilddateien
simplyhtml.insertTableColLabel=Spalte einf\u00FCgen
simplyhtml.insertTableLabel=Tabelle...
@@ -1597,7 +1693,7 @@ simplyhtml.insertTableMsg=Wieviele Spalten?
simplyhtml.insertTableRowLabel=Zeile einf\u00FCgen
simplyhtml.insertTableTitle=Tabelle einf\u00FCgen
simplyhtml.italicName=Kursiv
-simplyhtml.layoutTabTitle=Layout Ansicht
+simplyhtml.layoutTabTitle=Layout-Ansicht
simplyhtml.leftLabel=Links:
simplyhtml.listDialogTitle=Liste formatieren
simplyhtml.listIndentTitle=Einr\u00FCckung:
@@ -1638,7 +1734,7 @@ simplyhtml.pasteLabel=Einf\u00FCgen
simplyhtml.pastePlainTextLabel=Einf\u00FCgen als Text
simplyhtml.pasteTip=Einf\u00FCgen
simplyhtml.plainName=Standard
-simplyhtml.previewLabel=&Vorschau
+simplyhtml.previewLabel=Vorschau
simplyhtml.previewText=Dies ist ein Test
simplyhtml.prevTableCellLabel=Vorige Zelle
simplyhtml.printLabel=Drucken...
@@ -1693,11 +1789,12 @@ simplyhtml.valignMiddle=Mittig
simplyhtml.valignTop=Oben
simplyhtml.wholeWordsOnly=Nur ganze Worte
simplyhtml.wholeWordsOnly.tooltip=Treffer auf ganze W?rter beschr?nken.
-SortNodes.text=Unterknoten alphabetisch &sortieren
-SortNodes.tooltip=Alle Unterknoten eines Knotens alphabetisch sortieren
+sort=Sortieren
+SortNodes.text=Unterknoten alphabetisch sortieren
+SortNodes.tooltip=Unterknoten eines Knotens alphabetisch sortieren.
split=&Teilen
SplitConditionAction.text=Aufteilen
-SplitNode.text=Text &aufteilen
+SplitNode.text=Text aufteilen
SplitNode.tooltip=<html>Knoteninhalt wird auf mehrere Knoten verteilt.</html>
STANDARD_FORMAT=Standard
stop_processing=Stop
@@ -1734,40 +1831,52 @@ styles.website=Website
styles_menu=Knotenstile
submenu_keystroke_in_use_error=Tastaturk\u00FCrzel {0} kann nicht f\u00FCr ein Untermen\u00FC ({1}) verwendet werden und wurde deshalb entfernt.
summary_nodes=Gruppierungsknoten
-summary_not_possible=Gruppierungsknoten kann von der Auswahl nicht erzeugt werden.
-SummaryNodeAction.text=Knoten als Gruppierungs&knoten verwenden
+summary_not_possible=Knoten-Zusammenfassung aus aktueller Selektion kann nicht erstellt werden
svg=SVG
+task.filter=Filtern
+task.formatting=Formatieren
+task.help=Hilfe
+task.navigate=Navigieren
+task.nodes=Knoten
+task.resources=Ressourcen
+task.tools_and_settings=Werkzeuge und Einstellungen
+task.view=Ansicht
template_dir=Standard Vorlagen
-TimeListAction.text=Zeit&plan...
+TimeListAction.text=Zeitplan...
TimeListAction.tooltip=Zeigt alle Wiedervorlagezeiten und die dazugeh\u00F6rigen Knoten.
-TimeManagementAction.text=&Kalender anzeigen...
+TimeManagementAction.text=Kalender anzeigen...
TimeManagementAction.tooltip=<html>Zeigt das Kalender Modul von Kai Toedter.</html>
-ToggleChildrenFoldedAction.text=&Unterknoten falten/entfalten
+ToggleChildrenFoldedAction.text=Unterknoten falten/entfalten
ToggleDetailsAction.text=Knotendetails ein-/ausblenden
-ToggleFBarAction.text=F-&Tasten
-ToggleFoldedAction.text=Knoten &falten/entfalten
-ToggleFullScreenAction.text=&Vollbildmodus
-ToggleLeftToolbarAction.text=&Icons
-ToggleMenubarAction.text=&Men\u00FC
+ToggleFBarAction.text=F-Tasten
+ToggleFoldedAction.text=Knoten falten/entfalten
+ToggleFullScreenAction.text=Vollbildmodus
+ToggleLeftToolbarAction.text=Icons
+ToggleMenubarAction.text=Men\u00FC
+ToggleRibbonAction.text=Multifunktionsleiste minimieren
ToggleScrollbarsAction.text=Rollbalken
ToggleStatusAction.text=Statuszeile
-ToggleToolbarAction.text=&Werkzeuge
+ToggleToolbarAction.text=Werkzeuge
+toolbars=Symbol&leisten
+tools_and_settings=Werkzeuge und Einstellungen
+tools_misc=Verschiedenes
+tooltips=Schnellinfos
undefined_error=Ein unerwarteter Fehler ist aufgetreten. Eine Fehlernachricht im Forum w\u00E4re sch\u00F6n.
underline=Unterstrich
UnderlineAction.text=Unterstreichen
underlined=Unterstrichen
-UndoAction.text=&R\u00FCckg\u00E4ngig
-UndoFilterAction.text=&R\u00FCckg\u00E4ngig
+UndoAction.text=R\u00FCckg\u00E4ngig
+UndoFilterAction.text=R\u00FCckg\u00E4ngig
unfold=Entfalten
-UnfoldAllAction.text=Zweig &aufklappen
+UnfoldAllAction.text=Zweig aufklappen
UnfoldAllAction.tooltip=<html>Klappt die Unterknoten des selektierten Zweigs auf</html>
UnfoldOneLevelAction.text=Weitere Ebene aufklappen
-UnfoldOneLevelAction.tooltip=<html>Klappt in selektiertem Zweig eine weitere Ebene auf</html>
+UnfoldOneLevelAction.tooltip=Klappt die selektierten Knoten eine weitere Ebene auf.
unparsedLatexPatternFormat=LaTeX f\u00FCr Export
up=Auf
UpConditionAction.text=Auf
update_failed=Update ist fehlgeschlagen mit der Meldung {0}
-UpdateCheckAction.text=Auf &Updates pr\u00FCfen...
+UpdateCheckAction.text=Auf Updates pr\u00FCfen
updatecheckdialog=Updatepr\u00FCfung
updater.component=Komponente
updater.goToDownload=Gehe zu Download
@@ -1780,19 +1889,23 @@ updater.viewChangelog=Zeige Changelog
url_error=Diese URL ist fehlerhaft!
url_open_error=Die URL {0} konnte nicht geladen werden.
used_in_menu=Dieses Tastaturk\u00FCrzel kann nicht gesetzt werden, da es bereits im Men\u00FC verwendet wird.
-UsePlainTextAction.text=Nur reiner &Text
+UsePlainTextAction.text=Nur reiner Text
user_config_folder=Benutzerkonfiguration: {0}
user_defined_filters=Benutzerdefinierte Filter
user_defined_scale=Benutzerdefinierte &Gr\u00F6\u00DFe
-user_defined_zoom=Benutzerdefiniert.
+user_defined_zoom=Benutzerdefiniert
user_defined_zoom_status_bar=Der Zoom wurde ge\u00E4ndert und steht nun auf dem benutzerdefinierten Wert von {0}%.
user_icon={0}
user_template_dir=Benutzerdefinierte Vorlagen
user_zoom=Druckvergr\u00F6\u00DFerung (0.0 - 2.0):
value_format=Zahlenformat
-version_up_to_date=Sie benutzen bereits die aktuellste Version.
-ViewerControllerAction.text=E&xternes Objekt...
-ViewLayoutTypeAction.OUTLINE.text=&Gliederungsansicht
+version_up_to_date=Sie benutzen bereits die aktuellste Version
+view=&Ansicht
+view_misc=Verschiedenes
+view_mode=Ansichtsmodus
+ViewLayoutTypeAction.OUTLINE.text=Gliederungsansicht
+viewsettings=Ansichtseinstellungen
+web_resources=Web-Ressourcen
WebDocuAction.text=Web Dokumentation
width=Breite
wrong_regexp=Der Regul\u00E4re Ausdruck "{0}" ist fehlerhaft (Fehler {1})
@@ -1806,5 +1919,6 @@ xslt_export.ms_word=Microsoft Word 2003 XML
xslt_export.text=Klartext
xslt_export_not_possible=Freeplane XSLT-Export nicht m\u00F6glich
yes=Ja
+zoom=Zoom
ZoomInAction.text=Zoom &+
ZoomOutAction.text=Zoom &-
diff --git a/freeplane/resources/translations/Resources_el.properties b/freeplane/resources/translations/Resources_el.properties
index 04810b1..f8c200f 100644
--- a/freeplane/resources/translations/Resources_el.properties
+++ b/freeplane/resources/translations/Resources_el.properties
@@ -351,6 +351,7 @@ ExternalImageChangeAction.text=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03B5\u03B9
ExternalImageRemoveAction.text=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1\u03C2
ExtractLinkFromTextAction.text=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03BC\u03BF\u03C5 \u03BC\u03AD\u03C3\u03B1 \u03B1\u03C0\u03CC \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF
ExtractLinkFromTextAction.tooltip=\u039F\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03C3\u03C5\u03BD\u03B4\u03AD\u03C3\u03BC\u03BF\u03C5 \u03B1\u03C0\u03CC \u03C4\u03B7 \u03B4\u03B9\u03B5\u03CD\u03B8\u03C5\u03BD\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03C4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C4\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
+extras=\u0395\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03B1
f_button_unassigned=\u03BA\u03B5\u03BD\u03CC
FaqOpenURLAction.text=\u03A3\u03C5\u03BD\u03AE\u03B8\u03B5\u03B9\u03C2 \u0395\u03C1\u03C9\u03C4\u03AE\u03C3\u03B5\u03B9\u03C2
file=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF
@@ -431,11 +432,11 @@ filter_selected_node_view=\u0395\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD
filter_selected_node_view_snapshot=\u0391\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03C5\u03BC\u03AD\u03BD\u03B7 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE
filter_style=\u03A3\u03C4\u03C5\u03BB
filter_time=\u03A6\u03AF\u03BB\u03C4\u03C1\u03BF \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1\u03C2
-FilterComposerDialog.save=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7
filters_not_loaded=\u03A4\u03BF \u03C6\u03AF\u03BB\u03C4\u03C1\u03BF \u03B4\u03B5 \u03C6\u03BF\u03C1\u03C4\u03CE\u03B8\u03B7\u03BA\u03B5, \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03C1\u03AC\u03C6\u03B7\u03BA\u03B5
find_what=\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03C4\u03B9
FindAction.text=\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 ...
-FirstGroupNodeAction.text=\u03A0\u03B5\u03C1\u03AF\u03BB\u03B7\u03C8\u03B7 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5 (\u03B1\u03C1\u03C7\u03AE \u03BF\u03BC\u03AC\u03B4\u03B1\u03C2)
+FindNextAction.text=\u0395\u03CD\u03C1\u03B5\u03C3\u03B7 \u03B5\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF\u03C5
+FindPreviousAction.text=\u0395\u03CD\u03C1\u03B5\u03C3\u03B7 \u03C0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF\u03C5
fit_map_to_page=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE \u03C3\u03C4\u03B1 \u03CC\u03C1\u03B9\u03B1 \u03BC\u03B9\u03B1\u03C2 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1\u03C2
fit_map_to_page_height=\u03A4\u03B1\u03AF\u03C1\u03B9\u03B1\u03C3\u03BC\u03B1 \u03CD\u03C8\u03BF\u03C5\u03C2 \u03C3\u03B5 \u03BC\u03AF\u03B1 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1
fit_map_to_page_width=\u03A4\u03B1\u03AF\u03C1\u03B9\u03B1\u03C3\u03BC\u03B1 \u03C0\u03BB\u03AC\u03C4\u03BF\u03C5\u03C2 \u03C3\u03B5 \u03BC\u03AF\u03B1 \u03C3\u03B5\u03BB\u03AF\u03B4\u03B1
@@ -451,6 +452,7 @@ FollowLinkAction.text=\u0391\u03BD\u03BF\u03B9\u03B3\u03BC\u03B1 \u03C3\u03C5\u0
font=\u0393\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC
FontFamilyAction.text=\u039F\u03B9\u03BA\u03BF\u03B3\u03AD\u03BD\u03B5\u03B9\u03B1 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2
FontSizeAction.text=\u039C\u03AD\u03B3\u03B5\u03B8\u03BF\u03C2 \u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03BF\u03C3\u03B5\u03B9\u03C1\u03AC\u03C2
+format=\u039C\u03BF\u03C1\u03C6\u03AE
format_invalid_pattern=\u03BC\u03B7 \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF \u03C0\u03C1\u03CC\u03C4\u03C5\u03C0\u03BF
format_menu_cloud_shapes=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03CD\u03BD\u03BD\u03B5\u03C6\u03BF\u03C5 \u03AE \u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03C3\u03C4\u03C5\u03BB
format_menu_edge_styles=\u039C\u03BF\u03C1\u03C6\u03AE \u03C0\u03B5\u03C1\u03B9\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03BF\u03C2
@@ -653,10 +655,10 @@ IncreaseNodeFontAction.text=\u039C\u03B5\u03B3\u03B1\u03BB\u03CD\u03C4\u03B5\u03
ItalicAction.text=\u03A0\u03BB\u03AC\u03B3\u03B9\u03B1
italicise_branch=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE \u03C3\u03B5 \u03C0\u03BB\u03AC\u03B3\u03B9\u03B1
java_version=\u0388\u03BA\u03B4\u03BF\u03C3\u03B7 Java {0}
-JoinNodesAction.text=\u03A3\u03C5\u03BD\u03AD\u03BD\u03BD\u03C9\u03C3\u03B7 \u03BA\u03CC\u03BC\u03B2\u03C9\u03BD
less_than_two_selected_nodes=\u0393\u03B9\u03B1 \u03BD\u03B1 \u03AD\u03C7\u03BF\u03C5\u03BC\u03B5 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03B5\u03C4\u03B5 \u03C4\u03BF\u03C5\u03BB\u03AC\u03C7\u03B9\u03C3\u03C4\u03BF\u03BD \u03B4\u03CD\u03BF \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5\u03C2.
link_not_available_any_more=\u0397 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03B4\u03B5\u03BD \u03B9\u03C3\u03C7\u03CD\u03B5\u03B9. \u039F \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2 \u03B4\u03B9\u03B1\u03B3\u03C1\u03AC\u03C6\u03B7\u03BA\u03B5 \u03C3\u03C4\u03BF \u03BC\u03B5\u03C3\u03BF\u03B4\u03B9\u03AC\u03C3\u03C4\u03B7\u03BC\u03B1.
link_not_found=\u039F \u03B4\u03B5\u03C3\u03BC\u03CC\u03C2 {0} \u03B4\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B5.
+links=\u03A3\u03CD\u03BD\u03B4\u03B5\u03C3\u03BC\u03BF\u03C2
load=\u03A6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7
load_accelerator_presets=\u03A6\u03CC\u03C1\u03C4\u03C9\u03C3\u03B7
LoadAcceleratorPresetsAction.textPatterns.text=\u03C3\u03C5\u03BD\u03B4\u03C5\u03B1\u03C3\u03BC\u03BF\u03AF \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5
@@ -724,10 +726,6 @@ menu_displayAttributes=\u03A7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u0
menu_encryption=\u03A0\u03C1\u03BF\u03C3\u03C4\u03B1\u03C3\u03AF\u03B1 \u03BC\u03B5 \u03BA\u03C9\u03B4\u03B9\u03BA\u03CC
menu_error=\u03A3\u03C6\u03AC\u03BB\u03BC\u03B1 \u03C3\u03C4\u03B7 \u03B4\u03BF\u03BC\u03AE \u03BC\u03B5\u03BD\u03BF\u03CD \u03C0\u03BF\u03C5 \u03BF\u03C1\u03AF\u03C3\u03C4\u03B7\u03BA\u03B5 \u03B1\u03C0\u03CC \u03C4\u03BF \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 {0}:\n{1}\n\u0391\u03BA\u03CD\u03C1\u03C9\u03C3\u03B7
menu_extensions=\u0395\u03C0\u03B5\u03BA\u03C4\u03AC\u03C3\u03B5\u03B9\u03C2 \u039A\u03CC\u03BC\u03B2\u03BF\u03C5
-menu_extras=\u0395\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03B1
-menu_file_import=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE
-menu_filter=\u03A6\u03AF\u03BB\u03C4\u03C1\u03BF
-menu_format=\u039C\u03BF\u03C1\u03C6\u03AE
menu_group=\u039F\u03BC\u03AC\u03B4\u03B1 \u039A\u03CC\u03BC\u03B2\u03C9\u03BD
menu_hoverView=\u03A0\u03B5\u03B4\u03AF\u03B1 \u03B2\u03BF\u03AE\u03B8\u03B5\u03B9\u03B1\u03C2
menu_iconByCategory=\u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF \u03B1\u03BD\u03AC \u03BA\u03B1\u03C4\u03B7\u03B3\u03BF\u03C1\u03AF\u03B1...
@@ -735,25 +733,19 @@ menu_iconView=\u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03B1
menu_image=\u0395\u03B9\u03BA\u03CC\u03BD\u03B1
menu_insert=\u0395\u03B9\u03C3\u03B1\u03B3\u03C9\u03B3\u03AE
menu_latex_formula=\u03B5\u03BD\u03C4\u03BF\u03BB\u03AE LaTeX
-menu_links=\u03A3\u03CD\u03BD\u03B4\u03B5\u03C3\u03BC\u03BF\u03C2
menu_manageStyles=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7 \u03A3\u03C4\u03C5\u03BB
menu_moveNode=\u039C\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03BA\u03B1\u03B9 \u03C4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7
-menu_navigate=\u03A0\u03BB\u03BF\u03AE\u03B3\u03B7\u03C3\u03B7
menu_newNode=\u039D\u03AD\u03BF\u03C2 \u039A\u03CC\u03BC\u03B2\u03BF\u03C2
menu_node=\u039A\u03CC\u03BC\u03B2\u03BF\u03C2
menu_node_features=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AD\u03C2 \u039A\u03CC\u03BC\u03B2\u03BF\u03C5
menu_nodes=\u039A\u03CC\u03BC\u03B2\u03BF\u03B9
menu_nodeView=\u039A\u03AD\u03BD\u03C4\u03C1\u03BF \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
-menu_notes=\u03A3\u03B7\u03BC\u03B5\u03AF\u03C9\u03C3\u03B7
menu_noteView=\u03A3\u03B7\u03BC\u03B5\u03B9\u03CE\u03C3\u03B5\u03B9\u03C2
-menu_progress=\u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF \u03C0\u03C1\u03BF\u03CC\u03B4\u03BF\u03C5 (%)
menu_remove_icons=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03B5\u03B9\u03BA\u03BF\u03BD\u03B9\u03B4\u03AF\u03C9\u03BD
menu_removeAttribute=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE \u03C7\u03B1\u03C1\u03B1\u03BA\u03C4\u03B7\u03C1\u03B9\u03C3\u03C4\u03B9\u03BA\u03BF\u03CD
menu_select=\u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE
menu_time=\u0394\u03B9\u03B1\u03C7\u03B5\u03AF\u03C1\u03B9\u03C3\u03B7 \u03C7\u03C1\u03CC\u03BD\u03BF\u03C5
menu_title=\u039A\u03AD\u03BD\u03C4\u03C1\u03BF \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
-menu_toolbars=\u039C\u03C0\u03AC\u03C1\u03B5\u03C2 \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD
-menu_view=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE
menu_viewmode=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03CE\u03BD
MenuUtils.invalid_menuitem=\u03C4\u03BF {0} \u03B4\u03B5\u03BD \u03B5\u03AF\u03BD\u03B1\u03B9 \u03AD\u03B3\u03BA\u03C5\u03C1\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF \u03BC\u03B5\u03BD\u03BF\u03CD
mindmap=\u0394\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
@@ -775,6 +767,7 @@ ModesMenuAction.MindMap.text=\u0395\u03C0\u03B5\u03BE\u03B5\u03C1\u03B3\u03B1\u0
most_recent_files=\u03A0\u03C1\u03CC\u03C3\u03C6\u03B1\u03C4\u03B1 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1
MoveToRootAction.text=\u039C\u03B5\u03C4\u03B1\u03BA\u03AF\u03BD\u03B7\u03C3\u03B7 \u03C3\u03C4\u03B7\u03BD \u0391\u03C1\u03C7\u03AE
NameConditionAction.text=\u039F\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03BF\u03BD\u03CC\u03BC\u03B1\u03C4\u03BF\u03C2
+navigate=\u03A0\u03BB\u03BF\u03AE\u03B3\u03B7\u03C3\u03B7
NavigationNextMapAction.text=\u0395\u03C0\u03CC\u03BC\u03B5\u03BD\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
NavigationPreviousMapAction.text=\u03A0\u03C1\u03BF\u03B7\u03B3\u03BF\u03CD\u03BC\u03B5\u03BD\u03BF \u0394\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1
new=\u039D\u03AD\u03BF
@@ -795,7 +788,6 @@ NewerFileRevisionsFoundDialog.question=\u0392\u03C1\u03AD\u03B8\u03B7\u03BA\u03B
NewerFileRevisionsFoundDialog.restore=\u0391\u03BD\u03AC\u03BA\u03C4\u03B7\u03C3\u03B7
NewerFileRevisionsFoundDialog.restore.tooltip=\u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03C4\u03BF\u03C5 {0} \u03BC\u03B5 \u03C4\u03BF {1}
NewerFileRevisionsFoundDialog.title=\u039D\u03AD\u03B5\u03C2 \u03B5\u03BA\u03B4\u03CC\u03C3\u03B5\u03B9\u03C2 \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B1\u03BD
-NewFreeNodeAction.text=\u039D\u03AD\u03BF\u03C2 \u03B5\u03BB\u03B5\u03CD\u03B8\u03B5\u03C1\u03BF\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2
NewLevelStyleAction.text=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AE\u03BA\u03B7 \u03C3\u03C4\u03C5\u03BB \u03B5\u03C0\u03B9\u03C0\u03AD\u03B4\u03BF\u03C5
newmap.install.addon.question=\u03C4\u03BF {0} \u03C6\u03B1\u03AF\u03BD\u03B5\u03C4\u03B1\u03B9 \u03C3\u03B1\u03C2 \u03C0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C4\u03BF.\n\u039D\u03B1 \u03C4\u03BF \u03B5\u03B3\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AE\u03C3\u03C9; (\u03BC\u03B5 \u039F\u03A7\u0399 \u03B1\u03C0\u03BB\u03CE\u03C2 \u03B1\u03BD\u03BF\u03AF\u03B3\u03B5\u03B9 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF)
newmap.install.addon.title=\u0395\u03B3\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03C0\u03C1\u03BF\u03C3\u03B8\u03AD\u03C4\u03BF\u03C5;
@@ -838,13 +830,13 @@ NodeListAction.tooltip=\u0394\u03AF\u03C7\u03BD\u03B5\u03B9 \u03C4\u03BF\u03C5\u
NodeShapeAction.bubble.text=\u03A6\u03BF\u03CD\u03C3\u03BA\u03B1
NodeShapeAction.fork.text=\u0394\u03B9\u03C7\u03AC\u03BB\u03B1- Fork
NodeUpAction.text=\u039A\u03CC\u03BC\u03B2\u03BF\u03C2 \u03C0\u03AC\u03BD\u03C9
-NodeWidthAction.text=\u039F\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03BF\u03C1\u03AF\u03C9\u03BD \u03C0\u03BB\u03AC\u03C4\u03BF\u03C5\u03C2 \u03BA\u03CC\u03BC\u03B2\u03C9\u03BD
nonboldify_branch=\u03B1\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03AD\u03BD\u03C4\u03BF\u03BD\u03BF\u03C5
nonitalicise_branch=\u03B1\u03C6\u03B1\u03AF\u03C1\u03B5\u03C3\u03B7 \u03C0\u03BB\u03B1\u03B3\u03AF\u03C9\u03BD
normal=\u03A3\u03C5\u03BD\u03AE\u03B8\u03B7\u03C2
not_saved_for_image_error=\u039F \u03C7\u03AC\u03C1\u03C4\u03B7\u03C2 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03C5\u03C4\u03B5\u03AF \u03C0\u03C1\u03CE\u03C4\u03B1 \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03BF\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5 \u03B5\u03B9\u03BA\u03CC\u03BD\u03B1
not_saved_for_link_error=\u03A4\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03C1\u03AD\u03C0\u03B5\u03B9 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03C5\u03B8\u03B5\u03AF, \u03C0\u03C1\u03B9\u03BD \u03BD\u03B1 \u03BC\u03C0\u03BF\u03C1\u03AD\u03C3\u03B5\u03C4\u03B5 \u03BD\u03B1 \u03BF\u03C1\u03AF\u03C3\u03B5\u03C4\u03B5 \u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7 \u03B3\u03C1\u03B1\u03C6\u03B9\u03BA\u03AC
note_window_location=\u0398\u03AD\u03C3\u03B7 \u03C0\u03B5\u03B4\u03AF\u03BF\u03C5 \u03C3\u03C7\u03BF\u03BB\u03AF\u03C9\u03BD
+notes=\u03A3\u03B7\u03BC\u03B5\u03AF\u03C9\u03C3\u03B7
ok=\u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9
OKAction.text=\u0395\u03BD\u03C4\u03AC\u03BE\u03B5\u03B9
OnlineReference.text=\u039F\u03B4\u03B7\u03B3\u03AF\u03B5\u03C2 \u03C7\u03C1\u03AE\u03C3\u03B7\u03C2 \u03C3\u03C4\u03BF \u03B4\u03B9\u03B1\u03B4\u03AF\u03BA\u03C4\u03C5\u03BF
@@ -1062,8 +1054,6 @@ OptionPanel.nodeformat=\u039C\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u0
OptionPanel.nodeformat.tooltip=<html>\u0391\u03BD\u03C4\u03B9\u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7 \u03BA\u03B5\u03B9\u03BC\u03AD\u03BD\u03BF\u03C5 \u03BA\u03B1\u03B9/\u03AE \u03BC\u03BF\u03C1\u03C6\u03BF\u03C0\u03BF\u03AF\u03B7\u03C3\u03B7:<ul><li><em>\u0395\u03C0\u03AD\u03BA\u03C4\u03B1\u03C3\u03B7 \u03C0\u03C1\u03BF\u03C4\u03CD\u03C0\u03BF\u03C5</em> (<tt>%s</tt> \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C4\u03BF \u03B1\u03C1\u03C7\u03B9\u03BA\u03CC \u03BA\u03B5\u03AF\u03BC\ [...]
OptionPanel.nodenumbering=\u0391\u03C1\u03AF\u03B8\u03BC\u03B7\u03C3\u03B7 \u03C4\u03C9\u03BD \u03BA\u03CC\u03BC\u03B2\u03C9\u03BD
OptionPanel.nodenumbering.tooltip=\u03A0\u03C1\u03BF\u03C3\u03B8\u03AD\u03C4\u03B5\u03B9 \u03AD\u03BD\u03B1 \u03C3\u03B5\u03B9\u03C1\u03B9\u03B1\u03BA\u03CC \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC (\u03C0\u03C7 1.3.1) \u03C4\u03BF \u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03C4\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5.
-OptionPanel.nodeshape=\u03A4\u03CD\u03C0\u03BF\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
-OptionPanel.nodeshape.tooltip=nodeshape.tooltip
OptionPanel.nodetext=\u039A\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
OptionPanel.nodetext.tooltip=nodetext.tooltip
OptionPanel.nothing=\u03A4\u03AF\u03C0\u03BF\u03C4\u03B5
@@ -1360,6 +1350,7 @@ PrintAction.text=\u0395\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7 \u03C7\u03AC\u
PrintDirectAction.text=\u0395\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7...
printing_settings=\u039A\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1 \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2
PrintPreviewAction.text=\u03A0\u03C1\u03BF\u03B5\u03C0\u03B9\u03C3\u03BA\u03CC\u03C0\u03B9\u03C3\u03B7 \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2...
+progress=\u0395\u03B9\u03BA\u03BF\u03BD\u03AF\u03B4\u03B9\u03BF \u03C0\u03C1\u03BF\u03CC\u03B4\u03BF\u03C5 (%)
PropertyAction.dialog=\u03A0\u03C1\u03BF\u03C4\u03B9\u03BC\u03AE\u03C3\u03B5\u03B9\u03C2
PropertyAction.text=\u03A0\u03C1\u03BF\u03C4\u03B9\u03BC\u03AE\u03C3\u03B5\u03B9\u03C2 ...
QuickFilterAction.text=\u0393\u03C1\u03AE\u03B3\u03BF\u03C1\u03BF \u03C6\u03AF\u03BB\u03C4\u03C1\u03BF
@@ -1407,6 +1398,7 @@ ResetNodeLocationAction.text=\u0395\u03C0\u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u0
ResetStyleAction.text=\u039A\u03B1\u03B8\u03B1\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03A3\u03C4\u03C5\u03BB \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
RevertAction.text=\u0391\u03BD\u03AC\u03BA\u03C4\u03B7\u03C3\u03B7 \u03B1\u03C0\u03CC \u03C4\u03BF\u03C0\u03B9\u03BA\u03CC \u03B9\u03C3\u03C4\u03BF\u03C1\u03B9\u03BA\u03CC
RevisionPluginAction.text=\u0391\u03BB\u03BB\u03B1\u03B3\u03AE \u03C4\u03BF\u03C5 \u03C7\u03C1\u03CE\u03BC\u03B1\u03C4\u03BF\u03C2 \u03C6\u03CC\u03BD\u03C4\u03BF\u03C5 \u03C4\u03C9\u03BD \u03B1\u03BD\u03B1\u03B8\u03B5\u03C9\u03C1\u03AE\u03C3\u03B5\u03C9\u03BD
+save=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7
save_failed=\u0397 \u03C0\u03C1\u03BF\u03C3\u03C0\u03AC\u03B8\u03B5\u03B9\u03B1 \u03B3\u03B9\u03B1 \u03B1\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C4\u03BF\u03C5 {0} \u03B4\u03B5\u03BD \u03AE\u03C4\u03B1\u03BD \u03B5\u03C0\u03B9\u03C4\u03C5\u03C7\u03AE\u03C2.
save_unsaved=\u039D\u03B1 \u03B1\u03C0\u03BF\u03B8\u03B7\u03BA\u03B5\u03C5\u03C4\u03B5\u03AF \u03C4\u03BF \u03B1\u03BA\u03CC\u03BB\u03BF\u03C5\u03B8\u03BF \u03B4\u03B9\u03AC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 ; :
save_unsaved_styles=\u0391\u03C0\u03BF\u03B8\u03AE\u03BA\u03B5\u03C5\u03C3\u03B7 \u03C4\u03C9\u03BD \u03A3\u03C4\u03C5\u03BB ?
@@ -1650,7 +1642,7 @@ simplyhtml.wholeWordsOnly=\u039C\u03CC\u03BD\u03BF \u03BF\u03BB\u03CC\u03BA\u03B
simplyhtml.wholeWordsOnly.tooltip=\u03A0\u03B5\u03C1\u03B9\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03CE\u03BD \u03C3\u03B5 \u03BF\u03BB\u03CC\u03BA\u03BB\u03B7\u03C1\u03B5\u03C2 \u03BB\u03AD\u03BE\u03B5\u03B9\u03C2
SortNodes.text=\u03A4\u03B1\u03BE\u03B9\u03BD\u03CC\u03BC\u03B7\u03C3\u03B7 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03C9\u03BD
SortNodes.tooltip=\u03A4\u03B1\u03BE\u03B9\u03BD\u03BF\u03BC\u03B5\u03AF \u03B1\u03BB\u03C6\u03B1\u03B2\u03B7\u03C4\u03B9\u03BA\u03AC \u03CC\u03BB\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5\u03C2 \u03B1\u03C0\u03BF\u03B3\u03CC\u03BD\u03BF\u03C5\u03C2 \u03C4\u03BF\u03C5 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5.
-split=\u03A7\u03CE\u03C1\u03B9\u03C3\u03B5
+split=&\u03A7\u03CE\u03C1\u03B9\u03C3\u03B5
SplitConditionAction.text=\u03A7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2
SplitNode.text=\u03A7\u03C9\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03BA\u03CC\u03BC\u03B2\u03BF\u03C5
SplitNode.tooltip=<html>\u039F \u03BA\u03CC\u03BC\u03B2\u03BF\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C7\u03C9\u03C1\u03B9\u03C3\u03BC\u03AD\u03BD\u03BF\u03C2</html>
@@ -1690,7 +1682,6 @@ styles_menu=\u0394\u03B9\u03B1\u03B8\u03AD\u03C3\u03B9\u03BC\u03B1 \u03A3\u03C4\
submenu_keystroke_in_use_error=\u03A4\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF {0} \u03B4\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03B5\u03AF \u03BD\u03B1 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF \u03B3\u03B9\u03B1 \u03C4\u03BF \u03C5\u03C0\u03BF\u03BC\u03B5\u03BD\u03BF\u03CD {1}. \u03A4\u03BF \u03C0\u03BB\u03AE\u03BA\u03C4\u03C1\u03BF \u03BA\u03B1\u03C4\u03B1\u03C1\u03B3\u03AE\u03B8\u03B7\u03BA\u03B5.
summary_nodes=\u039A\u03CC\u03BC\u03B2\u03BF\u03B9 \u03A0\u03B5\u03C1\u03AF\u03BB\u03B7\u03C8\u03B7\u03C2
summary_not_possible=\u0394\u03B5\u03BD \u03BC\u03C0\u03BF\u03C1\u03CE \u03BD\u03B1 \u03B4\u03B7\u03BC\u03B9\u03BF\u03C5\u03C1\u03B3\u03AE\u03C3\u03C9 \u039A\u03CC\u03BC\u03B2\u03BF \u03A0\u03B5\u03C1\u03AF\u03BB\u03B7\u03C8\u03B7\u03C2 \u03B3\u03B9\u03B1 \u03C4\u03B7\u03BD \u03C4\u03C1\u03AD\u03C7\u03BF\u03C5\u03C3\u03B1 \u03B5\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE
-SummaryNodeAction.text=\u039A\u03CC\u03BC\u03B2\u03BF\u03C2 \u03A0\u03B5\u03C1\u03AF\u03BB\u03B7\u03C8\u03B7\u03C2 (\u03BF\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2/\u03BA\u03B1\u03C4\u03AC\u03C1\u03B3\u03B7\u03C3\u03B7)
svg=SVG
template_dir=\u0393\u03B5\u03BD\u03B9\u03BA\u03AC \u03A0\u03C1\u03CC\u03C4\u03C5\u03C0\u03B1
TimeListAction.text=\u0394\u03B5\u03AF\u03BE\u03B5 \u03C4\u03B7\u03BD \u03BB\u03AF\u03C3\u03C4\u03B1 \u03C7\u03C1\u03BF\u03BD\u03BF\u03C0\u03C1\u03BF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03B9\u03C3\u03BC\u03BF\u03CD ...
@@ -1706,6 +1697,7 @@ ToggleLeftToolbarAction.text=\u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u
ToggleMenubarAction.text=\u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2 \u03BC\u03B5\u03BD\u03BF\u03CD
ToggleStatusAction.text=\u0395\u03BC\u03C6\u03AC\u03BD\u03B9\u03C3\u03B7 \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2 \u03BA\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7\u03C2
ToggleToolbarAction.text=\u0395\u03BD\u03B1\u03BB\u03BB\u03B1\u03B3\u03AE \u03B3\u03C1\u03B1\u03BC\u03BC\u03AE\u03C2 \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD
+toolbars=\u039C\u03C0\u03AC\u03C1\u03B5\u03C2 \u03B5\u03C1\u03B3\u03B1\u03BB\u03B5\u03AF\u03C9\u03BD
undefined_error=\u03A3\u03C5\u03BD\u03AD\u03B2\u03B7 \u03AD\u03BD\u03B1 \u03B1\u03BD\u03B1\u03C0\u03AC\u03BD\u03C4\u03B5\u03C7\u03BF \u03BB\u03AC\u03B8\u03BF\u03C2! \u03A0\u03B1\u03C1\u03B1\u03BA\u03B1\u03BB\u03BF\u03CD\u03BC\u03B5 \u03C0\u03C1\u03BF\u03C3\u03C0\u03B1\u03B8\u03AE\u03C3\u03C4\u03B5 \u03BD\u03B1 \u03BA\u03AC\u03BD\u03B5\u03C4\u03B5 \u03BC\u03AF\u03B1 \u03B1\u03BD\u03B1\u03C6\u03BF\u03C1\u03AC \u03C3\u03C6\u03AC\u03BB\u03BC\u03B1\u03C4\u03BF\u03C2.
underline=\u03A5\u03C0\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B9\u03C3\u03B7
UnderlineAction.text=\u03A5\u03C0\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B9\u03C3\u03B7
@@ -1734,7 +1726,7 @@ user_template_dir=\u03A0\u03C1\u03CC\u03C4\u03C5\u03C0\u03B1 \u03A7\u03C1\u03B7\
user_zoom=\u039A\u03BB\u03AF\u03BC\u03B1\u03BA\u03B1 \u03B5\u03BA\u03C4\u03CD\u03C0\u03C9\u03C3\u03B7\u03C2 (0.0 - 2.0):
value_format=\u039C\u03BF\u03C1\u03C6\u03AE \u03A4\u03B9\u03BC\u03CE\u03BD
version_up_to_date=\u0389\u03B4\u03B7 \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF\u03C4\u03B5 \u03C4\u03B7\u03BD \u03C4\u03B5\u03BB\u03B5\u03C5\u03C4\u03B1\u03AF\u03B1 \u03AD\u03BA\u03B4\u03BF\u03C3\u03B7
-ViewerControllerAction.text=\u0395\u03BE\u03C9\u03C4\u03B5\u03C1\u03B9\u03BA\u03CC \u03B1\u03BD\u03C4\u03B9\u03BA\u03B5\u03AF\u03BC\u03B5\u03BD\u03BF...
+view=\u03A0\u03C1\u03BF\u03B2\u03BF\u03BB\u03AE
ViewLayoutTypeAction.OUTLINE.text=\u03A0\u03B5\u03C1\u03B9\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03B9\u03BA\u03AE \u038C\u03C8\u03B7
WebDocuAction.text=\u03A4\u03B5\u03BA\u03BC\u03B7\u03C1\u03AF\u03C9\u03C3\u03B7 \u03C3\u03B5 \u0399\u03C3\u03C4\u03CC
width=\u03A0\u03BB\u03AC\u03C4\u03BF\u03C2
diff --git a/freeplane/resources/translations/Resources_es.properties b/freeplane/resources/translations/Resources_es.properties
index eb46f2f..7e9f8e1 100644
--- a/freeplane/resources/translations/Resources_es.properties
+++ b/freeplane/resources/translations/Resources_es.properties
@@ -301,7 +301,7 @@ EditDetailsAction.text=Editar los detalles del nodo
EditDetailsInDialogAction.text=Editar el contenido del nodo (detalles) en el di\u00E1logo
EditFilterAction.text=Editar
EditLongAction.text=Edici\u00F3n Avanzada del Nodo...
-EditNoteInDialogAction.text=Editar ¬a...
+EditNoteInDialogAction.text=Editar nota...
EditScript=Editar Script...
EditStylesAction.text=Editar estilos
EncryptedMap.text=Crear Mapa Cifrado...
@@ -333,7 +333,7 @@ export_failed=Ha fallado la exportaci\u00F3n
export_pdf_text=Formato de Documentos Portables (PDF)
export_svg_text=Gr\u00E1fica de Vectores Escalables (SVG)
export_using_xslt=Exportaci\u00F3n a Freeplane usando XSLT
-ExportAction.text=&Exportar mapa\u2026
+ExportAction.text=Exportar mapa\u2026
ExportBranchAction.text=Mover Rama a nuevo Mapa...
ExportBranchToHTMLAction.text=Rama como HTML
exported_file=archivo {0}
@@ -353,6 +353,7 @@ ExternalImageChangeAction.text=Cambiar imagene externa...
ExternalImageRemoveAction.text=Quitar imagen externa
ExtractLinkFromTextAction.text=Hiperenlace desde el texto
ExtractLinkFromTextAction.tooltip=Fijar el hiperenlace que se ha encontrado en el texto del nodo
+extras=Herramientas
f_button_unassigned=No hay nada que hacer
FaqOpenURLAction.text=FAQ
file=Archivo
@@ -372,7 +373,7 @@ FileProperties_NodeSelectionCount=N\u00FAmero de nodos seleccionados:
FileProperties_TotalFilteredCount=N\u00FAmero de nodos que satisfacen el filtro:
FileProperties_TotalLeafCount=N\u00FAmero total de nodos hoja:
FileProperties_TotalNodeCount=N\u00FAmero total de nodos:
-FilePropertiesAction.text=Propieda&des...
+FilePropertiesAction.text=Propiedades...
FileRevisionsDialog.cancel=&Cancelar
FileRevisionsDialog.file_last_modified=Fecha y hora
FileRevisionsDialog.file_name=Archivo
@@ -433,11 +434,11 @@ filter_selected_node_view=Nodos Seleccionados Actualmente
filter_selected_node_view_snapshot=Selecci\u00F3n guardada
filter_style=Estilo
filter_time=Filtro de fecha
-FilterComposerDialog.save=&Guardar
filters_not_loaded=El filtro no se pudo cargar, el archivo est\u00E1 corrupto
find_what=Buscar Qu\u00E9
FindAction.text=Buscar...
-FirstGroupNodeAction.text=Nodo resumen (inicio de grupo)
+FindNextAction.text=Encontrar el siguiente
+FindPreviousAction.text=Encontrar el previo
fit_map_to_page=Ajustar a una p\u00E1gina
fit_map_to_page_height=Fijar la altura a una p\u00E1gina
fit_map_to_page_width=Fijar el ancho a una p\u00E1gina
@@ -453,6 +454,7 @@ FollowLinkAction.text=Ir a:
font=Fuente
FontFamilyAction.text=Familia de la Fuente
FontSizeAction.text=Tama\u00F1o de Fuente
+format=Formato
format_invalid_pattern=No es un patr\u00F3n v\u00E1lido
format_menu_cloud_shapes=Nube
format_menu_edge_styles=Estilos de Bordes
@@ -666,13 +668,12 @@ invalid_url_msg=No se pudo crear una URL v\u00E1lida para {0}
ItalicAction.text=Cursiva
italicise_branch=Poner en Cursiva
java_version=Versi\u00F3n de Java: {0}
-JoinNodesAction.text=Unir Nodos
latex_editor=Editar f\u00F3rmula LaTeX
-LatexDeleteLatexAction.text=Quitar f\u00F3rmula LaTe&X
-LatexEditLatexAction.text=Editar f\u00F3rmula &LaTeX\u2026
+LatexDeleteLatexAction.text=Quitar f\u00F3rmula LaTeX
+LatexEditLatexAction.text=Editar f\u00F3rmula LaTeX\u2026
LatexInsertLatexAction.msg1=<html>Est\u00E1 intentando insertar una f\u00F3rmula LaTex <i>antigua</i>.<br/>La nueva forma para crear texto/f\u00F3rmulas LaTeX se describe en la siguiente p\u00E1gina:</html>
LatexInsertLatexAction.msg2=<html>En breve: <ul><li>use un prefijo "\\latex " en el texto del nodo o</li><li><i>Ver->Panel de formato</i>, y ah\u00ED:<i>Texto del nodo->Formato->Latex</i></li></ul></html>
-LatexInsertLatexAction.text=A\u00F1adir f\u00F3rmula &LaTeX\u2026
+LatexInsertLatexAction.text=A\u00F1adir f\u00F3rmula LaTeX\u2026
latexPatternFormat=LaTeX
less_than_two_selected_nodes=Tiene que seleccionar al menos dos nodos para poder crear enlaces.
license=Licencia
@@ -680,6 +681,7 @@ license_text=<html>Este programa es software libre; puede redistribuirlo y/o<br>
link_error=Enlace incorrecto, "{0}" no se carg\u00F3
link_not_available_any_more=El enlace ya no es correcto. El nodo fue borrado.
link_not_found=Enlace {0} no encontrado.
+links=Enlaces
load=&Cargar
load_accelerator_presets=Cargar
LoadAcceleratorPresetsAction.textPatterns.text=Patrones para el texto
@@ -747,10 +749,6 @@ menu_displayAttributes=Atributos del nodo
menu_encryption=Protecci\u00F3n con contrase\u00F1as
menu_error=Error en la estructura del men\u00FA definido por el usuario {0}:\n{1}\nAbortando
menu_extensions=Extensiones del nodo
-menu_extras=Herramientas
-menu_file_import=Importar
-menu_filter=Filtro
-menu_format=Formato
menu_group=Grupo del nodo
menu_hoverView=Ayuda sobre herramientas
menu_iconByCategory=Icono por categor\u00EDa...
@@ -758,26 +756,20 @@ menu_iconView=Iconos
menu_image=Imagen
menu_insert=Insertar
menu_latex_formula=F\u00F3rmula LaTeX
-menu_links=Enlaces
menu_manageStyles=&Gestionar estilos
menu_moveNode=Mover y organizar
-menu_navigate=&Navegar
menu_newNode=Nuevo nodo
menu_node=Nodo
menu_node_features=Caracter\u00EDsticas del nodo
menu_nodes=&Nodos
menu_nodeView=Nodo central
-menu_notes=Notas
menu_noteView=Notas
menu_openmaps=Mapas
-menu_progress=Progreso
menu_remove_icons=Quitar iconos
menu_removeAttribute=Quitar atributo
menu_select=Seleccionar
menu_time=Gesti\u00F3n del tiempo
menu_title=Nodo central
-menu_toolbars=Barras de herramientas
-menu_view=Ver
menu_viewmode=Ver configuraci\u00F3n
MenuUtils.invalid_menuitem={0} no es un elemento del men\u00FA v\u00E1lido.
mindmap=Mapa
@@ -799,6 +791,7 @@ ModesMenuAction.MindMap.text=Editor de Mapa Conceptual
most_recent_files=Archivos M\u00E1s Recientes
MoveToRootAction.text=Mover a Ra\u00EDz
NameConditionAction.text=Nombrar
+navigate=&Navegar
NavigationNextMapAction.text=Siguiente Mapa
NavigationPreviousMapAction.text=Mapa Previo
new=Nuevo
@@ -819,11 +812,10 @@ NewerFileRevisionsFoundDialog.question=\u00A1Encontrada versi\u00F3n m\u00E1s re
NewerFileRevisionsFoundDialog.restore=Restaurar
NewerFileRevisionsFoundDialog.restore.tooltip=Cambiar {0} por {1}
NewerFileRevisionsFoundDialog.title=\u00A1Se han encontrado versiones m\u00E1s recientes!
-NewFreeNodeAction.text=Nuevo nodo libre
NewLevelStyleAction.text=A\u00F1adir automaticamente el dise\u00F1o del estilo de nivel
newmap.install.addon.question={0} parece que es un complemento\n\u00BFDesea instalarlo?\n(Seleccione "No" para abrirlo normalmente.)
newmap.install.addon.title=\u00BFInstalar el complemento?
-NewMapAction.text=&Nuevo mapa
+NewMapAction.text=Nuevo mapa
NewMapViewAction.text=Nueva Vista de Mapa
NewParentNode.text=Nuevo Nodo Principal
NewParentNode.tooltip=<html>Todos los seleccionados son enviados a un nuevo nodo Principal.</html>
@@ -862,13 +854,13 @@ NodeListAction.tooltip=Muestra todos los nodos como una lista de b\u00FAsqueda c
NodeShapeAction.bubble.text=Burbuja
NodeShapeAction.fork.text=Bifurcaci\u00F3n
NodeUpAction.text=Subir Nodo
-NodeWidthAction.text=Fijar el ancho del nodo
nonboldify_branch=Sin negrita
nonitalicise_branch=Sin cursiva
normal=Normal
not_saved_for_image_error=El mapa se debe guardar antes de que pueda escoger una imagen con el selector de archivos
not_saved_for_link_error=El Mapa debe ser guardado antes de establecer un enlace con el selector de archivos
note_window_location=Posici\u00F3n de la Nota
+notes=Notas
ok=De Acuerdo
OKAction.text=De Acuerdo
OnlineReference.text=Documentaci\u00F3n de Mapas conceptuales en l\u00EDnea
@@ -1094,8 +1086,6 @@ OptionPanel.nodeformat=Formato
OptionPanel.nodeformat.tooltip=<html>Reemplazo y/o formateo del texto:<ul><li><em>Expansi\u00F3n de plantilla</em> (<tt>%s</tt> es el texto original), e.g. <tt>PRECAUCI\u00D3N: %s</tt><li><em>Formato de fechas y n\u00FAmeros</em> - ver los ejemplos en la caja de selecci\u00F3n</ul></html>
OptionPanel.nodenumbering=Numeraci\u00F3n del nodo
OptionPanel.nodenumbering.tooltip=A\u00F1adir n\u00FAmero de serie (p.e. 1.3.1) al texto del nodo.
-OptionPanel.nodeshape=Estilo del Nodo
-OptionPanel.nodeshape.tooltip=<html>El estilo indica la forma exterior del nodo. <br>Posibles valores:<br><table border="1"><tr><td>elecci\u00F3n: </td><td> sin caja alrededor,</td></tr><tr><td>burbuja: </td><td> nodo con un rect\u00E1ngulo alrededor,</td></tr><tr><td>Como el de orden superior: </td><td> tendr\u00E1 el mismo estilo que el nodo superior a \u00E9l <br>o el estilo predefinido para el nodo ra\u00EDz,</td></tr><tr><td>Combinado: </td><td> Burbuja cuando el nodo est\u00E1 pleg [...]
OptionPanel.nodetext=Texto del Nodo
OptionPanel.nodetext.tooltip=Aqu\u00ED puede definir c\u00F3mo ser\u00E1 el texto del nodo. El texto que tenga se borrar\u00E1 una vez que se aplique este patr\u00F3n.
OptionPanel.nothing=Nada
@@ -1399,6 +1389,7 @@ PrintAction.text=Imprimir...
PrintDirectAction.text=Imprimir
printing_settings=Escalado de impresi\u00F3n
PrintPreviewAction.text=Vista Previa...
+progress=Progreso
PropertyAction.dialog=Preferencias
PropertyAction.text=Preferencias ...
QuickFilterAction.text=Filtro r\u00E1pido
@@ -1444,14 +1435,15 @@ RequestFeatureAction.text=Pedir una Caracter\u00EDstica nueva
reset_to_default=Usar el predefinido
ResetNodeLocationAction.text=Reinicia Posici\u00F3n
ResetStyleAction.text=Quitar el estilo del nodo
-RevertAction.text=&Restaurar del archivo hist\u00F3rico local
+RevertAction.text=Restaurar del archivo hist\u00F3rico local
RevisionPluginAction.text=Cambiar las modificaciones del color de fondo
+save=&Guardar
save_failed=Fall\u00F3 el intento de guardar el mapa {0}.
save_unsaved=\u00BFDesea guardar el Mapa?
save_unsaved_styles=\u00BFGuardar estilos?
SaveAcceleratorPresetsAction.text=Guardar configuraci\u00F3n de teclas\u2026
SaveAction.text=Guardar
-SaveAll.text=Guardar &Todo
+SaveAll.text=Guardar Todo
SaveAll.tooltip=Guardar todos los mapas abiertos
SaveAsAction.text=Guardar Como...
saved=Guardado
@@ -1691,7 +1683,7 @@ simplyhtml.wholeWordsOnly=Palabras completas s\u00F3lo
simplyhtml.wholeWordsOnly.tooltip=Restringir los resultados a palabras enteras.
SortNodes.text=Ordenar Hijos
SortNodes.tooltip=Ordena alfab\u00E9ticamente los hijos de un nodo.
-split=Dividir
+split=&Dividir
SplitConditionAction.text=Dividir
SplitNode.text=Dividir el Nodo
SplitNode.tooltip=<html>El Nodo se divide</html>
@@ -1731,7 +1723,6 @@ styles_menu=Estilos
submenu_keystroke_in_use_error=La tecla {0} no se puede utilizar para el submenu {1}. Se ha quitado.
summary_nodes=Nodos resumen
summary_not_possible=No se puede crear nodo resumen para la selecci\u00F3n actual
-SummaryNodeAction.text=Nodo resumen (crear/ajustar)
svg=SVG
template_dir=Plantillas comunes
TimeListAction.text=Mostrar la Lista del Planificador de Tiempo...
@@ -1748,6 +1739,7 @@ ToggleMenubarAction.text=(Des)activar Barra de men\u00FA
ToggleScrollbarsAction.text=Barras de desplazamiento
ToggleStatusAction.text=Mostrar estado de l\u00EDnea
ToggleToolbarAction.text=(Des)activar Barra de herramientas
+toolbars=Barras de herramientas
undefined_error=Ocurri\u00F3 un error inesperado. Por favor reportelo a los desarrolladores de Freeplane.
underline=Subrayar
UnderlineAction.text=Subrayar
@@ -1784,7 +1776,7 @@ user_template_dir=Plantillas del usuario
user_zoom=Factor de acercamiento de impresi\u00F3n (0.0 - 2.0):
value_format=Valor del formato
version_up_to_date=Est\u00E1 usando la \u00FAltima versi\u00F3n del programa
-ViewerControllerAction.text=Objeto Externo...
+view=Ver
ViewLayoutTypeAction.OUTLINE.text=Vista en esquema
WebDocuAction.text=Documentaci\u00F3n Web
width=Anchura
diff --git a/freeplane/resources/translations/Resources_et.properties b/freeplane/resources/translations/Resources_et.properties
index 7ca4479..a6c04a1 100644
--- a/freeplane/resources/translations/Resources_et.properties
+++ b/freeplane/resources/translations/Resources_et.properties
@@ -7,7 +7,7 @@ accessories/plugins/EncryptNode.properties_1=Salas\u00F5nad ei ole samad v\u00F5
accessories/plugins/EncryptNode.properties_2=Sisesta salas\u00F5na:
accessories/plugins/EncryptNode.properties_3=Sisesta kontrolliks veelkord sama salas\u00F5na:
accessories/plugins/EncryptNode.properties_4=Sisestage oma salas\u00F5na.
-accessories/plugins/EncryptNode.properties_5=<html>Pea meeles, et kr\u00FCpteeringu tugevus <br>s\u00F5ltub paaegu t\u00E4ielikult salas\u00F5na tugevusest.</html>
+accessories/plugins/EncryptNode.properties_5=<html>Pea meeles, et kr\u00FCpteeringu tugevus <br>s\u00F5ltub peaaegu t\u00E4ielikult salas\u00F5na tugevusest.
accessories/plugins/EncryptNode.properties_6=Sobib
accessories/plugins/EncryptNode.properties_7=Loobu
accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=Sa v\u00F5id kr\u00FCpteerituse olekut kr\u00FCpteeritud s\u00F5lmel \u00FCmber l\u00FClitada. Palun lisa selline s\u00F5lm, kasutades t\u00F6\u00F6riistade men\u00FC\u00FCd.
@@ -32,12 +32,12 @@ antialias_all=Pehmenda: fonte k\u00F5ikjal
antialias_edges=Pehmenda: servad
antialias_none=Eemalda pehmendamine
apply=&Rakenda
-ApplyAction.text=&Rakenda
-ApplyFormatPlugin.text=&Muuda vormingut ...
+ApplyAction.text=Rakenda
+ApplyFormatPlugin.text=Muuda vormingut ...
ApplyFormatPlugin.tooltip=N\u00E4itab dialoogi kus s\u00F5lme ja \u00FChendusjoone omadusi saab korraga muuta.
ApplyNoFilteringAction.text=Ei filtreerita
as_parent=Kui eelmine
-AssignAttributesAction.text=&M\u00E4\u00E4ra omadused...
+AssignAttributesAction.text=M\u00E4\u00E4ra omadused...
attribute_delete=Kustuta k\u00F5ik v\u00E4\u00E4rtused
attribute_delete_value=Kustuta see v\u00E4\u00E4rtus
attribute_font_size_tooltip=Omaduste kirjasuurus
@@ -74,7 +74,7 @@ attributes_skip_root=J\u00E4ta peas\u00F5lm vahele
attributes_visible=Valitud n\u00E4htav
attributes_visible_tooltip=Valitud n\u00E4htav
automatically_save_message=Kaart salvestati automaatselt (kasutades failinime {0}) ...
-AutomaticLayoutAction.text=&Automaatne formaat
+AutomaticLayoutAction.text=Automaatne formaat
AutomaticLayoutAction.tooltip=<html>Parandab kaardi formaati. <br>Esimene tase on must, teine sinine, jne.</html>
BackAction.text=Tagasi
BackAction.tooltip=H\u00FCppab valitud ahelas tagasi
@@ -85,11 +85,11 @@ BoldAction.text=Rasvane
boldify_branch=Tee rasvaseks
branch=Haru
cancel=&Loobu
-CancelAction.text=&Loobu
+CancelAction.text=Loobu
cannot_add_parent_diff_parents=K\u00F5ik alams\u00F5lmed peavad olema sama s\u00F5lme k\u00FCljes, et seda funktsiooni kasutada.
cannot_add_parent_to_root=Peas\u00F5lme ei saa uue naabers\u00F5lme k\u00FClge lisada.
cannot_delete_root=Peas\u00F5lme ei saa kustutada ega l\u00F5igata.
-cannot_join_nodes_with_children=Ei suuda liituda s\u00F5lmega, mille all on omakorda s\u00F5lmed.
+cannot_join_nodes_with_children=S\u00F5lmi, millede all on omakorda s\u00F5lmed, ei saa liita
cannot_move_to_child=Ei suuda s\u00F5lme alams\u00F5lme k\u00FClge liigutada .
CenterAction.text=Keskele
ChangeConnectorArrowsAction.backward.text=Tagasi
@@ -103,7 +103,7 @@ choose_cloud_color=Vali pilve v\u00E4rv:
choose_edge_color=Vali \u00FChendusjoone v\u00E4rv
choose_node_background_color=Vali s\u00F5lme taustav\u00E4rv:
choose_node_color=Vali s\u00F5lme v\u00E4rv:
-CloseAction.text=&Sulge
+CloseAction.text=Sulge
CloudAction.text=Pilv
CloudColorAction.text=Pilve v\u00E4rv...
ColorProperty.ResetColor=Taasta v\u00E4rvi algv\u00E4\u00E4rtus
@@ -113,7 +113,7 @@ connector=Connector[translate me]
connector_label=Connector Label[translate me]
CopyAction.text=Kopeeri
CopySingleAction.text=Kopeeri \u00FCksik
-CreationModificationPluginAction.text=N\u00E4ita &Muutmise aegu
+CreationModificationPluginAction.text=N\u00E4ita Muutmise aegu
CreationModificationPluginAction.tooltip=<html>See funktsioon j\u00E4litab s\u00F5lme loomise ja muutmise aegu.</html>
CutAction.text=L\u00F5ika
decrease_branch_font_size=V\u00E4henda haru kirja
@@ -141,18 +141,18 @@ edit_link_manually=Redigeeri k\u00E4sitsi h\u00FCperviidet...
EditAction.text=Redigeeri s\u00F5lme
EditAttributesAction.text=Redigeeri omadusi
EditFilterAction.text=Redigeeri
-EditLongAction.text=Redigeeri s\u00F5lme aknas...
-EncryptedMap.text=Loo kr\u00FCpteeritud kaart ...
+EditLongAction.text=Redigeeri s\u00F5lme tuuma aknas
+EncryptedMap.text=Loo kaitstud (kr\u00FCpteeritud) kaart ...
EncryptedMap.tooltip=Loo uus kr\u00FCpteeritud kaart
enter_base_url=Ma lisan viited suhteliste aadressidena. Palun sisesta p\u00F5hiaadress.
enter_confirms=&Enter kinnitab
-EnterPassword.text=&L\u00FClita kr\u00FCpteeritud/kr\u00FCpteerimata
+EnterPassword.text=L\u00FClita kr\u00FCpteeritud/kr\u00FCpteerimata
error=Viga
error_applying_template=XSL-mallide kehtestamisel tekkis viga.
error_creating_directory=Ei suuda kataloogi luua, et sinna eksportida.
export_pdf_text=Kaasaskantav DokumendiVorming (PDF)
export_svg_text=Skaleeritav Vektorgraafika (SVG)
-ExportAction.text=&Ekspordi
+ExportAction.text=Kaardi eksport...
ExportBranchAction.text=S\u00F5lmede haru kui uus kaart ...
ExportBranchToHTMLAction.text=Haru HTML-ina
ExportPdf.text=Kui PDF...
@@ -163,12 +163,13 @@ ExportToImage.png.text=Kui PNG...
ExportToOoWriter.text=Kui OpenOffice.org Writer-i dokument...
ExportToOoWriter.tooltip=Lahtivolditud s\u00F5lmed muudavad struktuuri, kokkuvolditud s\u00F5lmed dokumendi sisu.
extension_menu=F\u00FC\u00FCsiline &Stiil
+extras=&T\u00F6\u00F6riistad
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=KKK
file=&Fail
file_already_exists=Fail nimega {0} on juba olemas. Kas soovid seda \u00FCle kirjutada?
file_not_found=Faili {0} ei leitud
-filter=Filter
+filter=Filter[translate me]
filter_add=&Lisa
filter_and=&ja
filter_conditions=Filtrid
@@ -192,18 +193,19 @@ filter_selected_node_view=Hetkel valitud s\u00F5lmed
find_what=Mida otsida
FindAction.text=Otsi...
fit_map_to_page=Mahuta \u00FChele lehek\u00FCljele
-FitToPage.text=Suurenda, et &Mahutada lehele
+FitToPage.text=Suurenda, et Mahutada lehele
FitToPage.tooltip=Muuda suurendust selliselt, et kogu kaart mahub k\u00E4esolevasse aknasse.
fold=Voldi
FoldAllAction.text=Voldi k\u00F5ik kokku
FoldAllAction.tooltip=<html>Voldib valitud s\u00F5lmed ja nende all olevad s\u00F5lmed kokku.</html>
FoldOneLevelAction.text=Voldi \u00FChe taseme v\u00F5rra kokku
FoldOneLevelAction.tooltip=<html>Voldib valitud s\u00F5lmed \u00FChe taseme v\u00F5rra kokku.</html>
-follow_graphical_link=Mine:
+follow_graphical_link=Mine "{0}"
FollowLinkAction.text=Ava h\u00FCperviide
font=Kirjat\u00FC\u00FCp
FontFamilyAction.text=kirja perekond
FontSizeAction.text=kirja suurus
+format=&Vormindus
format_menu_edge_styles=&\u00DChendusjoone stiilid
format_menu_edge_widths=\u00DChendusjoone &Laiused
FormatCopy.text=Kopeeri kujundus
@@ -237,7 +239,7 @@ GrabKeyDialog.grab-key.remove-ask=Oled Sa kindel, et soovid seda kiirklahvi eema
GrabKeyDialog.grab-key.title=Sisesta uus klahv
help=Abi
HideAllAttributesAction.text=Peida k\u00F5ik omadused
-HierarchicalIconsAction.text=N\u00E4ita ikoone &hierarhiliselt
+HierarchicalIconsAction.text=N\u00E4ita ikoone hierarhiliselt
HierarchicalIconsAction.tooltip=Kui \u00FCks (suur)s\u00F5lmedest omab ikooni siis n\u00E4idatakse seda ka v\u00E4ikeses formaadis.
HotKeyInfoAction.text=Key Reference[translate me]
html_export_based_on_headings=HTML-i eksportimine - p\u00F5hineb p\u00E4istel
@@ -322,20 +324,19 @@ IconGroupPopupAction.miscellaneous.text=Miscellaneous[translate me]
IconGroupPopupAction.office.text=Office[translate me]
IconSelectionPlugin.text=Vali ikoon...
IconSelectionPlugin.tooltip=<html>Siin saab valida ikooni, kasutades selleks alamakent.</html>
-import=Import
+import=&Impordi
import_linked_branch_no_link=Valitud s\u00F5lmel ei ole \u00FChtki viidet importida.
-ImportAction.text=&Impordi
+ImportAction.text=Impordi
ImportBranchAction.text=Haru...
ImportExplorerFavoritesAction.text=MS Internet Explorer-i viited...
-ImportFolderStructureAction.text=Kataloogide struktuur...
+ImportFolderStructureAction.text=Kaustade struktuur...
ImportLinkedBranchAction.text=Viidatud haru
-ImportLinkedBranchWithoutRootAction.text=(Viidatud haru) ilma juurkataloogita...
+ImportLinkedBranchWithoutRootAction.text=Viidatud haru juureta...
ImportMindmanagerFiles.text=MindManager X5 kaart...
increase_branch_font_size=Suurem haru kirja
IncreaseNodeFontAction.text=Suurem haru kirja
ItalicAction.text=Kaldkiri
italicise_branch=Kaldkirjaks
-JoinNodesAction.text=\u00DChenda s\u00F5lmed
less_than_two_selected_nodes=Sa pead valima v\u00E4hemalt kaks s\u00F5lme, et viidet teha.
link_not_available_any_more=See viide ei t\u00F6\u00F6ta enam. Nendevaheline s\u00F5lm on kustutatud.
link_not_found=Viidet {0} ei leitud.
@@ -352,13 +353,7 @@ map_locked_by_open={0} kaarti redigeerib juba {1} kasutaja. Avan vaid lugemisre\
map_locked_by_save_as={0} kaart on parasjagu {1} kasutaja poolt redigeerimisel. Tegevus Salvesta kui katkestati.
map_not_saved=Kaarti ei ole enne salvestatud.
menu_attributes=&Omadused
-menu_extras=&T\u00F6\u00F6riistad
-menu_file_import=&Impordi
-menu_filter=Filter[translate me]
-menu_format=&Vormindus
menu_insert=&Lisamine
-menu_navigate=&Liikumine
-menu_view=&Vaade
mindmap=M\u00F5ttekaart
mindmaps=M\u00F5ttekaardid
mindmaps_desc=M\u00F5ttekaardid (*.mm)
@@ -373,13 +368,14 @@ ModesMenuAction.File.text=File Explorer[translate me]
ModesMenuAction.MindMap.text=Mind Map Editor[translate me]
most_recent_files=&Enimkasutatavad failid
MoveToRootAction.text=Liigu algusesse
+navigate=&Liikumine
NavigationNextMapAction.text=J\u00E4rgmine kaart
NavigationPreviousMapAction.text=Eelmine kaart
new_mindmap=Uus m\u00F5ttekaart
new_node=Uus s\u00F5lm
-new_node_as_sibling_not_possible_for_the_root=Uut peas\u00F5lme ei saa lisada.
+new_node_as_sibling_not_possible_for_the_root=Uus sama taseme s\u00F5lm ei ole peas\u00F5lmega v\u00F5imalik
NewChildAction.text=Uus s\u00F5lm olemasoleva s\u00F5lme alla
-NewMapAction.text=Uus
+NewMapAction.text=Uus kaart
NewParentNode.text=Uus peas\u00F5lm
NewParentNode.tooltip=<html>K\u00F5ik valitud saadeti uueks peas\u00F5lmeks.</html>
NewPreviousSiblingAction.text=Uus s\u00F5lm vasakule poole peas\u00F5lme alla
@@ -387,32 +383,32 @@ NewSiblingAction.text=Uus s\u00F5lm peas\u00F5lme alla
no=Ei
no_format_copy_before_format_paste=Sa ei saa vormindust asetada kuni ei ole \u00FChtegi kopeeritud.
no_found_from=<html>Ei <b>{0}</b> leitud <b>{1}</b>.</html>
-no_more_found_from=<html>Rohkem <b>{0}</b> ei leitud <b>{1}</b>.
+no_more_found_from=<html>Rohkem <u>{0}</u> ei leitud "{1}".</html>
no_previous_find=Eelmist ei leitud.
node=S\u00F5lm
node_changed_discard_changes=Sa oled muutnud s\u00F5lme. Kas soovid muudatused unustada?
node_is_write_protected=Sihtm\u00E4rk (s\u00F5lm) on kirjutuskaitstud.
node_location_help=Lohistamine muudab s\u00F5lme asukohta, CTRL+lohistamine muudab kauguseid, topeltkl\u00F5ps ja CTRL+topeltkl\u00F5ps taastavad algseaded.
-NodeBackgroundColorAction.text=&S\u00F5lme taustav\u00E4rv...
+NodeBackgroundColorAction.text=S\u00F5lme taustav\u00E4rv...
NodeColorAction.text=S\u00F5lme v\u00E4rv...
NodeColorBlendAction.text=Sega v\u00E4rv
NodeDownAction.text=Liiguta s\u00F5lm alla
NodeListAction.text=Otsi ja asenda...
NodeListAction.tooltip=N\u00E4itab k\u00F5iki s\u00F5lmi otsitava nimekirjana koos filtreerimisv\u00F5imalusega.
-NodeShapeAction.bubble.text=&Mull
-NodeShapeAction.fork.text=&Haru
+NodeShapeAction.bubble.text=Mull
+NodeShapeAction.fork.text=Haru
NodeUpAction.text=Liiguta s\u00F5lm \u00FCles
nonboldify_branch=Eemalda rasvane kiri
nonitalicise_branch=Eemalda kaldkiri
normal=Tavaline
-not_saved_for_link_error=Kaart tuleb salvestada enne kui saab viidet failile lisada.
+not_saved_for_link_error=Kaart tuleb enne failivalijale lingi m\u00E4\u00E4ramist salvestada
ok=&Sobib
-OKAction.text=&Sobib
-OpenAction.text=Ava...
+OKAction.text=Sobib
+OpenAction.text=Ava salvestatud kaart...
OpenFreeplaneSiteAction.text=Freeplane-i koduleht
option_changes_may_require_restart=Muudetud seadistuste j\u00F5ustumiseks tuleb Freeplane taask\u00E4ivitada.
OptionalDontShowMeAgainDialog.cancel=&Ei
-OptionalDontShowMeAgainDialog.dontShowAgain=&\u00C4ra uuesti k\u00FCsi enam
+OptionalDontShowMeAgainDialog.dontShowAgain=&\u00C4ra enam uuesti k\u00FCsi.
OptionalDontShowMeAgainDialog.ok=&Jah
OptionalDontShowMeAgainDialog.rememberMyDescision=&J\u00E4ta minu otsus meelde.
OptionPanel.absolute=Absoluutne
@@ -457,7 +453,7 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>Windowsi jaoks (jut
OptionPanel.default_browser_command_windows_nt=Vaikimisi veebilehitseja k\u00E4ivitamise k\u00E4sk MS Windows NT-s
OptionPanel.default_browser_command_windows_nt.tooltip=<html>Windowsi jaoks (jutum\u00E4rgid on vajalikud t\u00E4nu h\u00FCperviitele, millel on "=" m\u00E4rk viites).</html>
OptionPanel.Defaults=Vaikimisi seaded
-OptionPanel.delete_automatic_saves_at_exit=Kustuta programmist v\u00E4ljumisel automaatselt salvestatud t\u00F6\u00F6d.
+OptionPanel.delete_automatic_saves_at_exit=Programmist v\u00E4ljumisel kustuta automaatsalvestused
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Kui soovid, et Freeplane kustutaks automaatselt sulgemisel failid siis m\u00E4\u00E4ra see muutuja t\u00F5eseks</html>
OptionPanel.delete_nodes_without_question=Kustutada s\u00F5lmed kinnitust k\u00FCsimata?
OptionPanel.delete_nodes_without_question.tooltip=Kui siin on m\u00E4rgitud siis s\u00F5lmed kustutatakse kinnitust k\u00FCsimata. See v\u00F5ib p\u00F5hjustada informatsiooni kaotuse t\u00E4helepanuta kustutamisel.
@@ -480,7 +476,7 @@ OptionPanel.en=EN (inglise keel)
OptionPanel.Environment=Keskkond
OptionPanel.es=ES (hispaania keel)
OptionPanel.et=Et (eesti keel)
-OptionPanel.execute_scripts_without_asking=Kas skriptid tuleb k\u00E4ivitada kinnitust k\u00FCsimata?
+OptionPanel.execute_scripts_without_asking=Skriptide k\u00E4ivitamine on lubatud
OptionPanel.execute_scripts_without_asking.tooltip=<html>Freeplane-i skriptid on p\u00F5him\u00F5tteliselt suutelised mistahes tegevust Sinu arvutis tegema. <br>Seet\u00F5ttu ei peaks Sa skripte k\u00E4ivitama, mille ohutuses Sa kindel ei ole.</html>
OptionPanel.execute_scripts_without_exec_restriction=Luba k\u00E4ivitada teisi rakendusi (EI ole soovitatav)
OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>Kui Sinu Lahe Skript vajab k\u00E4ivitumiseks teisi rakendusi (nt veebilehitseja) luba k\u00FCsimata(!),<br>siis pead Sa selle v\u00F5imaluse lubama. <br>Kuid ole ettevaatlik kuna t\u00E4nap\u00E4eval v\u00F5ivad kahtlased skriptid kahjustada Sinu arvutit!</body></html>
@@ -537,15 +533,13 @@ OptionPanel.nb=NB (bokm\u00E5l, norra keel)
OptionPanel.nl=NL (hollandi keel)
OptionPanel.nn=NN (nynorsk, norra keel)
OptionPanel.nodebackgroundcolor=S\u00F5lme tausta v\u00E4rv
-OptionPanel.nodebackgroundcolor.tooltip=S\u00F5lmede taust kui ei ole valitud
+OptionPanel.nodebackgroundcolor.tooltip=S\u00F5lme taust kui s\u00F5lm ei ole valitud.
OptionPanel.nodecolor=S\u00F5lme v\u00E4rv
OptionPanel.nodecolor.tooltip=S\u00F5lmede esiplaani v\u00E4rv kui ei ole valitud.
OptionPanel.nodefontbold=Rasvane kiri
OptionPanel.nodefontitalic=Kaldkiri
OptionPanel.nodefontname=S\u00F5lme kirjakuju nimi
OptionPanel.nodefontsize=S\u00F5lme kirjakuju suurus
-OptionPanel.nodeshape=S\u00F5lme stiil
-OptionPanel.nodeshape.tooltip=<html>Stiil kirjeldab s\u00F5lme v\u00E4list kujundust. <br>V\u00F5imalikud v\u00E4\u00E4rtused:<br><table border="1"><tr><td>fork: </td><td> ilma \u00FCmbritseva kastita,</td></tr><tr><td>mull: </td><td> s\u00F5lm \u00FCmbritseva ristk\u00FClikuga,</td></tr><tr><td>Kui naabers\u00F5lm: </td><td> kopeerib stiili naabers\u00F5lmelt <br>v\u00F5i vaikimisi peas\u00F5lme stiili peas\u00F5lmele,</td></tr><tr><td>Kombineeritud: </td><td> Mull kui s\u00F5lm on kokk [...]
OptionPanel.nodetext=S\u00F5lme tekst
OptionPanel.nodetext.tooltip=Siin saab sisestada s\u00F5lme teksti. Eelmine tekst unustatakse kui selline muster lisatakse.
OptionPanel.nothing=Mitte midagi
@@ -644,14 +638,14 @@ OptionPanel.time_for_automatic_save=Automaatsalvestuse aeg
OptionPanel.time_for_automatic_save.tooltip=<html> aeg kahe j\u00E4rjestiku salvestamise vahel (millisekundites, ms) : Et automaatsalvestamist keelata, m\u00E4\u00E4ra selleks numbriks 2000000000.</html>
OptionPanel.time_for_delayed_selection=Aeg viivitusega valikuks
OptionPanel.time_for_delayed_selection.tooltip=<html> S\u00F5lmede valiku viivitus hiire \u00FCleliikumisel (millisekundites). Muuda selle v\u00E4\u00E4rtus 1 peale kui soovid kohest (viivituseta) valikut hiire \u00FCle s\u00F5lme liikumisel.</html>
-OptionPanel.toolTipManager.max_tooltip_width=Kohtspikri laius
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>Vaikimisi kohtsprikri laius pikselites.</html>
+OptionPanel.toolTipManager.max_tooltip_width=Kohtspikri maksimaalne laius
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=Maksimaalne kohtsprikri laius pikselites.
OptionPanel.tr=TR (t\u00FCrgi keel)
OptionPanel.uk_UA=Uk UA[translate me]
OptionPanel.undefined_font=M\u00E4\u00E4ramata kirjakuju
OptionPanel.undo_levels=V\u00F5ta tasemed tagasi
OptionPanel.undo_levels.tooltip=<html>M\u00E4\u00E4rab selle, kui mitu sammu tagasiv\u00F5tmiseks salvestatakse.</html>
-OptionPanel.unfold_on_paste=Voldi s\u00F5lm asetamisel lahti.
+OptionPanel.unfold_on_paste=Asetamisel voldi s\u00F5lm lahti
OptionPanel.unfold_on_paste.tooltip=Voldi s\u00F5lm asetamisel lahti v\u00F5i lohista-ning-kukuta
OptionPanel.use_common_out_point_for_root_node=\u00DChendusjooned peas\u00F5lmega algavad \u00FChest punktist
OptionPanel.use_common_out_point_for_root_node.tooltip=\u00DChendusjooned peas\u00F5lmega algavad \u00FChest punktist
@@ -663,8 +657,8 @@ OptionPanel.wheel_velocity.tooltip=Kaarti saab hiire rattaga kiiremini liigutada
OptionPanel.windows=Windows
OptionPanel.zh_CN=ZH CN (hiina keel)
OptionPanel.zh_TW=ZH (hiina keel)
-out_of_memory=Out of memory.[translate me]
-PageAction.text=Lehek\u00FClje &Seaded
+out_of_memory=Kogu m\u00E4lu on kasutusel.
+PageAction.text=Lehek\u00FClje seaded...
PasteAction.text=Aseta
PatternNewNameProperty=Uus muster
PatternToString.backgroundColor=Taustav\u00E4rv
@@ -721,9 +715,9 @@ print_preview_title=Tr\u00FCkkimise eelvaatlus
PrintAction.text=Tr\u00FCki...
PrintDirectAction.text=Tr\u00FCki
printing_settings=Tr\u00FCkkimise skaleerimine
-PrintPreviewAction.text=&Tr\u00FCkkimise eelvaatlus...
+PrintPreviewAction.text=Tr\u00FCkkimise eelvaatlus...
PropertyAction.text=Eelistused ...
-QuitAction.text=Sulge programm
+QuitAction.text=Sulge Freeplane
read_only=Ainult lugemiseks
really_convert_to_current_version=<html>See kaart on vanema Freeplane-i abil loodud. <br>Kas teisendame uuemasse vormingusse (soovitatav)? <br>(Muidu v\u00F5etakse seda nagu see on ja ilma garantiita.) </html>
really_cut_node=Kas t\u00F5esti l\u00F5igata s\u00F5lm(ed)?
@@ -742,21 +736,21 @@ rename=&Nimeta \u00FCmber
repair_link=Paranda viide
repair_link_question=Ei suutnud viidatud kaarti laadida. Kas soovid k\u00E4sitsi viidet parandada?
replace=Asenda
-ResetNodeLocationAction.text=Taasta esialgne &Paigutus
+ResetNodeLocationAction.text=Taasta esialgne Paigutus
save_failed={0} katse kaarti salvestada eba\u00F5nnestus.
-save_unsaved=Kas salvestada see m\u00F5ttekaart? :
+save_unsaved=Kas salvestada see m\u00F5ttekaart?
SaveAction.text=&Salvesta
-SaveAll.text=Salvesta &K\u00F5ik
-SaveAll.tooltip=Salvestab k\u00F5ik avatud kaardid.
-SaveAsAction.text=Salvesta kui...
+SaveAll.text=Salvesta &k\u00F5ik avatud kaardid
+SaveAll.tooltip=Salvestab k\u00F5ik avatud kaardid
+SaveAsAction.text=Salvesta kaart k&ui...
saved=Salvestatud
scheme_evaluate=Hinda!
-ScriptEditor.text=&Skripti redaktor...
+ScriptEditor.text=Skripti redaktor...
ScriptEditor.tooltip=V\u00F5imaldab suuri skripte Freeplane-i sees kirjutada.
ScriptEditorPanel.changed_cancel=Skripte on muudetud. Kas t\u00F5esti soovid loobuda neist muudatustest?
select_favorites_folder=Vali kataloog kus asuvad Sinu j\u00E4rjehoidjad
-select_folder_for_importing=Vali kataloog, mida importida.
-SelectAllAction.text=Vali k\u00F5ik n\u00E4htav
+select_folder_for_importing=Vali kataloog, mida importida
+SelectAllAction.text=Vali k\u00F5ik n\u00E4htavad s\u00F5lmed
SelectBranchAction.text=Vali n\u00E4htav haru
selection_method_by_click=\u00DCks kl\u00F5ps m\u00E4rkimiseks
selection_method_delayed=Viivitusega automaatvalik
@@ -768,7 +762,7 @@ SetLinkByFileChooserAction.text=H\u00FCperviide (faililehitseja)...
SetLinkByTextFieldAction.text=H\u00FCperviide (tekstiv\u00E4li)...
ShowAllAttributesAction.text=N\u00E4ita k\u00F5iki omadusi
ShowAncestorsAction.text=N\u00E4ita eellasi
-ShowAttributeDialogAction.text=&Omaduste haldur...
+ShowAttributeDialogAction.text=Omaduste haldur...
ShowDescendantsAction.text=N\u00E4ita j\u00E4rglasi
ShowHideNoteAction.text=M\u00E4rkuste aken
ShowHideNoteAction.tooltip=Lubab viisakalt m\u00E4rkuste aknal ilmuda v\u00F5i kaduda.
@@ -777,7 +771,7 @@ ShowSelectionAsRectangleAction.text=Ristk\u00FClikukujuline valik
simplyhtml.aboutFrameTitle=Sellest programmist l\u00E4hemalt
simplyhtml.aboutLabel=SimplyHTML-ist l\u00E4hemalt...
simplyhtml.alignCenter=keskele
-simplyhtml.alignLabel=Alignment:[translate me]
+simplyhtml.alignLabel=Joondus:
simplyhtml.alignLeft=vasakule
simplyhtml.alignRight=paremale
simplyhtml.allCellsRangeLabel=k\u00F5ik lahtrid
@@ -940,10 +934,10 @@ simplyhtml.valignLabel=P\u00FCstine joondus:
simplyhtml.valignMiddle=keskele
simplyhtml.valignTop=\u00FCles
simplyhtml.wholeWordsOnly=Ainult terved s\u00F5nad
-SortNodes.text=&Sorteeri alams\u00F5lmed
+SortNodes.text=Sorteeri alams\u00F5lmed
SortNodes.tooltip=Sorteerib k\u00F5ik alams\u00F5lmed t\u00E4hestiku j\u00E4rjekorras.
split=&Poolita
-SplitNode.text=&Poolita s\u00F5lm
+SplitNode.text=Poolita s\u00F5lm
SplitNode.tooltip=<html>S\u00F5lm on poolitatud</html>
style=Stiil
svg=SVG[translate me]
@@ -954,9 +948,9 @@ TimeManagementAction.tooltip=<html>N\u00E4itab kalendrimoodulit (autor: Kai Toed
ToggleChildrenFoldedAction.text=Voldi s\u00F5lmed kokku/lahti
ToggleFBarAction.text=F-Bar[translate me]
ToggleFoldedAction.text=L\u00FClita voltimist \u00FCmber
-ToggleLeftToolbarAction.text=&Teine t\u00F6\u00F6riistariba
+ToggleLeftToolbarAction.text=Teine t\u00F6\u00F6riistariba
ToggleMenubarAction.text=Men\u00FC\u00FCriba
-ToggleToolbarAction.text=&T\u00F6\u00F6riistariba
+ToggleToolbarAction.text=T\u00F6\u00F6riistariba
undefined_error=Ootamatu viga tekkis. Palun proovi raporteerida sellest.
underline=Jooni alla
underlined=Allajoonitud
@@ -966,15 +960,16 @@ unfold=Voldi lahti
UnfoldAllAction.text=Voldi k\u00F5ik lahti
UnfoldAllAction.tooltip=<html>Voldib k\u00E4esoleva s\u00F5lme koos selle all olevate s\u00F5lmedega lahti.</html>
UnfoldOneLevelAction.text=Voldi \u00FChe taseme v\u00F5rra lahti
-UnfoldOneLevelAction.tooltip=<html>Voldib k\u00E4esoleva s\u00F5lme \u00FChe taseme v\u00F5rra lahti.</html>
+UnfoldOneLevelAction.tooltip=Voldib valitud s\u00F5lme \u00FChe taseme v\u00F5rra lahti.
UpdateCheckAction.text=Check for Updates[translate me]
updatecheckdialog=Update Check Dialog[translate me]
url_error=See internetiviide on valesti kirjutatud!
url_load_error=Ei suutnud siit aadressilt kaarti laadida:
UsePlainTextAction.text=Kasuta paljast teksti
-user_defined_zoom=Kasutaja m\u00E4\u00E4ratud.
+user_defined_zoom=Kasutaja m\u00E4\u00E4ratud
user_defined_zoom_status_bar=Suurenduse muutmine kasutaja poolt m\u00E4\u00E4ratud v\u00E4\u00E4rtusele {0}%.
user_zoom=Tr\u00FCkkimise suurendus (0.0 - 2.0):
+view=&Vaade
WebDocuAction.text=Dokumentatsioon internetis
width=Laius
yes=Jah
diff --git a/freeplane/resources/translations/Resources_eu.properties b/freeplane/resources/translations/Resources_eu.properties
new file mode 100644
index 0000000..853e3e5
--- /dev/null
+++ b/freeplane/resources/translations/Resources_eu.properties
@@ -0,0 +1,500 @@
+about_text=Freeplane - adimen mapak sortu eta jakintza eraikitzeko doako softwarea
+AboutAction.text=Honi buruz
+acceleratorPresets=Laburbideak
+accelerators_loading_error=Ezin {0}-tik azeleratzaileak kargatu
+accessories/plugins/ApplyFormatPlugin.dialog.title=Adabegien formatua aldatu
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=Txantiloia aldatu
+accessories/plugins/EncryptNode.properties_0=Babestutako (zifratutako) adabegiarentzat pasahitza aukeratu
+accessories/plugins/EncryptNode.properties_1=Pasahitz ezberdinak edo motzegia.
+accessories/plugins/EncryptNode.properties_2=Pasahitza sartu:
+accessories/plugins/EncryptNode.properties_3=Sartu pasahitza berriz:
+accessories/plugins/EncryptNode.properties_4=Sartu zure pasahitza.
+accessories/plugins/EncryptNode.properties_5=<html>Gogoratu zifratuaren sendotasuna<br>ia osorik pasahitzaren kalitatearen araberakoa dela.
+accessories/plugins/EncryptNode.properties_6=OK
+accessories/plugins/EncryptNode.properties_7=Bertan behera utzi
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=Pasahitzez babestutako (zifratutako) egoera aurretik zifratutako adabegi batetan bakarrik alda zenezake. Lanabesen menua erabilz sar zenezake era hontako adabegi bat.
+accessories/plugins/EncryptNode.properties_select_me=Aukera nazazu jarraitzeko!
+accessories/plugins/EncryptNode.properties_wrong_password=Pasahitza ez da zuzena.
+accessories/plugins/ExportWithTWiki.text=Twiki...
+accessories/plugins/ExportWithTWiki.tooltip=Mapa TWiki documentu eran esportatzen du.
+accessories/plugins/ExportWithXSLT.tooltip=Hau era bereko esportazio metodo bat da.
+accessories/plugins/ExportWithXSLT_Applet.text=Java Applet-a...
+accessories/plugins/ExportWithXSLT_Applet.tooltip=Mapa Java Applet baten moduan esportatzen du.
+accessories/plugins/ExportWithXSLT_Flash.text=Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip=Mapa Flash aplikazio baten moduan esportatzen du.
+accessories/plugins/ExportWithXSLT_HTML.text=XHTML (JavaScript bertsioa)...
+accessories/plugins/ExportWithXSLT_HTML3.text=XHTML (mapa irudi bertsio klikagarria)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=RESOURCES adabegitik baliabideak TaskJuggler fitxategira...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>RESOURCES adabegitik baliabideak Taskjuggler modulura esportatzen ditu.</html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text=Atazak TASKS (ATAZAK) nodotik TaskJuggler fitxategira...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>Atazak TASKS(Atazak) adabegitik TaskJuggler modulura esportatzen ditu.</html>
+action_keystroke_in_use_error={1} ekintzarako eskatutako {0} tekla dagoeneko {2} ekintzari esleiturik dago
+active=Aktibo
+actual_map_styles=Maparen estilo baldintzatuak adabegiari ezarrita
+actual_node_styles=Adabegiaren estilo baldintzatuak adabegiari ezarrita
+add=&Gehitu
+AddConnectorAction.text=Lotu
+AddElementaryConditionAction.text=Gehitu
+AddExecutionLinkAction.text=Sistema Eragileko komando bat abiarazteko esteka bat gehitu...
+AddLocalLinkAction.text=Esteka lokal bat gehitu
+AddMenuItemLinkAction.text=Menuko elementu bateruntz esteka gehitu...
+AddOnDetailsPanel.authored.by={0}-k
+AddOnDetailsPanel.header.function=Funtzioa
+AddOnDetailsPanel.header.menu=Kokapena menuan
+AddOnDetailsPanel.header.shortcut=Lasterbidea
+AddOnDetailsPanel.homepage=Hasiera orria:
+addons.installer.canceled=Instalazioa bertan behera geratu da
+addons.installer.confirm.licence=<html><body><h1>Lizenzia</h1>{0}<p><p><em>Lizentzia hau onartzen al duzu?</em></p></body></html>\n Copy \u2192\u21B5\u2026""""
+addons.installer.failed=Akatsa instalazioan: {0}
+addons.installer.freeplaneversion.format.error=Formatu akatsa {0}-n (balioa:{1})
+addons.installer.html.script=Baliteke script-aren edukiak HTML erako formaturik ez izatea
+addons.installer.install=Instalatu
+addons.installer.invalid.keyboard.shortcut={0} Lasterbide baliogabea.
+addons.installer.licence.unchanged=Lizentzia ez da aldatu
+addons.installer.map.structure=Maparen egituran akatsa: {0}
+addons.installer.missing.child.nodes=Adabegikumeak faltan: {0}
+addons.installer.missing.permission.attribute={0} script-a: {1} baimen ezaugarririk ez
+addons.installer.missing.properties=Falta diren propietateak: {0}
+addons.installer.missing.translation=locale {1}-entzat {0}-ren propietateak falta dira
+addons.installer.no.scripts=Ez da scriptik aurkitu
+addons.installer.no.zipdata=Ez da zip daturik aurkitu
+addons.installer.nonstandard.permissions=Scriptak oraingoz baliogabetuta dauden ondorengo baimenak eskatzen ditu: {0}.\nOhiko baimenei gehitu?
+addons.installer.one.child.expected=Zehazki {0}-ren kume baten esperoan baina {1} jaso.
+addons.installer.script.name.suffix={0} izeneko scriptak ez du ".groovy" moduko luzapenik
+addons.installer.script.no.execution_mode=Ez dago "execution_mode" edo exekuzio erako ezaugarririk {0}rentzat
+addons.installer.script.no.menulocation={0}-rentzat ez da "menuLocation" ezaugarririk zehaztu
+addons.installer.script.no.menutitle={0}-rentzat ez da "menuTitleKey" ezaugarririk zehaztu
+addons.installer.script.no.permissions={0}-rentzat ez da baimenik zehaztu
+addons.installer.success=Instalazioa ongi burutu da.\nAdd-on berria Freeplane berrabiarazi ondoren izango da eskuragarri.
+addons.installer.success.update={0}-tik {1}-rako eguneraketa arrakastaz burutu da.\nFuntzio batzuk programa berrabiaraztean soilik izango dira erabilgarri.
+addons.installer.title=Add-on instalatzailea
+addons.installer.too.new=Oraingo Freeplane {0} bertsioa berriegia da. Add-on honek gehienez {1} bertsioa onartzen du
+addons.installer.too.old=Oraingo Freeplane {0} bertsioa zaharregia da. Add-on honek gutxienez {1} bertsioa behar du
+addons.installer.unknown.deinstallation.rules=Desinstalatzeko {0} araua(k) ez da/dira ezagutzen
+addons.installer.update={0} bertsiotik eguneratu
+addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">Soilik jatorri ezaguneko add-onak instalatu beharko zenituzke. Software gaizto edo kaltegarriak zure informazioa kaltetu edota zure pribatutasuna bortxa dezake.</strong></body></html>
+addons.site=http://freeplane.sourceforge.net/addons/
+AddStyleAttributes.text=Estilotik ezaugarriak
+AddStyleAttributes.tooltip=Ezaugarriak estilo adabegitik gehitu
+AllMapsNodeListAction.text=Aurkitu eta mapa guztietan ordezkatu
+always=Beti
+AlwaysUnfoldedNodeAction.text=Beti adabegi zabaldua (set/reset)
+antialias_all=Antialliasa aplikatu guztiei
+antialias_edges=Antialiasdun loturak
+antialias_none=Inor ez antialiasarekin
+apply=&Aplikatu
+ApplyAction.text=Aplikatu
+ApplyFormatPlugin.text=Formatua aldatu...
+ApplyFormatPlugin.tooltip=Bertan adabegi eta loturen ezaugarriak batera alda litezken orri bat aurkezten du.
+ApplyNoFilteringAction.text=Ez iragazi
+ApplySelectedViewConditionAction.text=Aukeratutako adabegiak iragazi
+ApplyToVisibleAction.text=Iragazitako adabegiei ezarri
+as_parent=Guraso gisa
+AskForHelp.text=Foroan laguntza eskatu
+AssignAttributesAction.text=Ezaugarriak aurkitu eta ordezaktu...
+attribute_delete=Balio guztiak ezabatu
+attribute_delete_value=Balio hau ezabatu
+attribute_font_size_tooltip=Ezaugarriaren hizki neurria
+attribute_list_box_label_text=Existitzen diren balioak
+attribute_name=Ezaugarri izena
+attribute_name_or_value=Ezaugarri izen edo balioa
+attribute_replace=-rekin ordezkatu
+attribute_top=Kargatutako mapen ezaugarri ezagun guztiak
+attribute_value=Ezaugarri balioa
+attributes_AddAttributeAction.text=Elkarrizketan ezaugarria gehitu...
+attributes_adding_empty_attribute_error=Ezin string huts bat ezaugarri izen bezela erabili
+attributes_all=Ezaugarri guztiak
+attributes_assign_dialog=Ezaugarri editore hedatua
+attributes_attribute=Ezaugarriak
+attributes_close=Itxi
+attributes_deselect_all=Ezer ez
+attributes_dialog_title=Ezaugarri kudeatzailea
+attributes_edit=Editatu
+attributes_edit_tooltip=Mulzoa editatu
+attributes_for_selected=Aukeratutako adabegiak
+attributes_for_visible=Ikusgarri dauden adabegi guztiak
+attributes_import=&Inportatu
+attributes_import_tooltip=Iturburua/Jatorria
+attributes_no_import_candidates_found=Ez da ezaugarri berririk aurkitu
+attributes_popup_delete=Ezabatu
+attributes_popup_down=Behera
+attributes_popup_edit=Editatu
+attributes_popup_hide=Ezkutatu
+attributes_popup_new=Ezaugarri berria
+attributes_popup_optimal_width=Zabalera egokiena
+attributes_popup_up=Gora
+attributes_refresh=Berritu
+attributes_RemoveAllAttributesAction.text=Ezaugarri guztiak ezabatu
+attributes_RemoveFirstAttributeAction.text=Lehendabiziko ezaugarria ezabatu
+attributes_RemoveLastAttributeAction.text=Azken ezaugarria ezabatu
+attributes_restricted_attributes_tooltip=Ezaugarri multzoa mugatu
+attributes_restricted_values_tooltip=Balio multzoa ezaugarri hontara mugatu
+attributes_restriction=Mugatutako multzoa
+attributes_select_all=Dena
+attributes_select_all_tooltip=Dena aukeratu/aukeratzea utzi
+attributes_show=Azaldu
+attributes_skip_root=Edabegi erroa ez
+attributes_visible=Ikusgarri daudenak aukeratu
+attributes_visible_tooltip=Ikusgarri daudenak aukeratuta
+automatic_layout=Layout automatikoa
+automatic_layout_disabled=ezeztatuta
+automatically_save_message=Mapa automatikoki gorde da ({0} fitxategi izena erabiliaz)...
+AutomaticEdgeColor.FOR_BRANCHES=adarrentzat
+AutomaticEdgeColor.FOR_COLUMNS=zutabeentzat
+AutomaticEdgeColor.FOR_LEVELS=mailentzat
+AutomaticEdgeColor.ON_BRANCH_CREATION=adarra sortzean
+AutomaticEdgeColorHookAction.text=Lotura kolore automatikoa
+AutomaticLayout.ALL=adabegi guztientzat
+AutomaticLayout.HEADINGS=hostoak ez diren adabegientzat
+AutomaticLayout.level={0} maila
+AutomaticLayout.level.root=Erroa
+AutomaticLayoutAction.text=Maila estiloak ezarri
+AutomaticLayoutAction.tooltip=<html>Maparen layout edo itxura ezartzen du <br>Lehen maila beltzez, bigarrena urdinez, etab.</html>\n Kopiatu \u2192\u21B5\u2026""""
+AutomaticLayoutControllerAction.ALL.text=adabegi guztientzat
+AutomaticLayoutControllerAction.COLUMNS.text=zutabeentzat
+AutomaticLayoutControllerAction.HEADINGS.text=hostoak ez diren zutabeentzat
+AutomaticLayoutControllerAction.null.text=ez aktibatuta
+BackAction.text=atzeruntz jo
+BackAction.tooltip=Aukeratutako katean atzera jauzi egin
+background=Atzekaldea
+bitmaps=Bitmapak
+black=Beltza
+BlinkingNodeHookAction.text=Adabegi dardartia
+BlinkingNodeHookAction.tooltip=<html>Honek adabegia dizdiraka jartzen du. Baina argi ibili. Ez ezarri adabegi gehiegiri, eta <strong> inolaz ez ezarri formatu automatikorik adabegi berdinean </strong></html>
+blue=Urdina
+BoldAction.text=Hizki Lodiz
+boldify_branch=Hizki lodira pasa
+branch=Adarra
+browse=Nabigatu...
+calendar_attributes_panel=Egutegia eta berezitasunak
+calendar_panel=Egutegia
+can_not_clone_encrypted_node=Ezin dira zifratutako adabegiak klonatu
+can_not_connect_to_info_server=Ezin da informazio zerbitzarira konektatu
+can_not_delete_predefined_style=Aurretik definitutako estiloa ezin da ezabatu
+can_not_delete_root_style=Ezin da erro estiloa ezabatu
+can_not_delete_style_group=Ezin da estilo taldea ezabatu
+can_not_encrypt_cloned_node=Ezin dira klonatutako adabegiak zifratu
+can_not_save_key_set=Ezin da tekla azkar multzoa gorde
+cancel=&Ezabatu
+CancelAction.text=Ezabatu
+cannot_add_parent_diff_parents=Funtzio hau erabiltzeko, adabegi guztiek guraso bera izan behar dute.
+cannot_add_parent_to_root=Erro adabegia ezin da guraso berri bezala gehitu.
+cannot_delete_root=Erro adabegia ezin da ezabatu edota ebaki.
+cannot_join_nodes_with_children=Haurrak dituzten adabegiak ezin dira bateratu
+cannot_move_into_child_node=Ezin da adabegi haurrera higitu
+cannot_move_to_child=Ezin da adabegia bere haur batetara eraman.
+CenterAction.text=Erdiratu
+CenterSelectedNodeAction.text=Aukeratutako adabegia erdiratu
+ChangeConnectorArrowsAction.backward.text=Marraztu gezia atzerantz
+ChangeConnectorArrowsAction.both.text=Marraztu gezia aurrerantz eta atzerantz
+ChangeConnectorArrowsAction.forward.text=Marraztu gezia aurrerantz
+ChangeConnectorArrowsAction.none.text=Ezer ez
+ChangeConnectorArrowsAction.text=Loturaren gezia aldatzen du
+ChangeConnectorShapeAction.CUBIC_CURVE.text=Kurba
+ChangeConnectorShapeAction.EDGE_LIKE.text=Ertza simulatu
+ChangeConnectorShapeAction.LINE.text=Lerroa
+ChangeConnectorShapeAction.LINEAR_PATH.text=Bide lineala
+ChangeNodeLevelLeftsAction.text=Adabegia mugitu (Gurasoak senide)
+ChangeNodeLevelLeftsAction.tooltip=Erroaren ezker aldean adabegia(k) beheruntz bultzatzen da/dira. Beren gaineko senidearen haur bihurtzen da/dira. Erroaren eskuin aldean adabegia(k) goruntz bultzatzen dira. Erroan bertan, adabegia(k) aldez aldatzen da/dira.
+ChangeNodeLevelRightsAction.text=Adabegia Mugitu (senideak haur)
+ChangeNodeLevelRightsAction.tooltip=Erroaren ezker aldean adabegia(k) beheruntz bultzatzen da/dira. Beren gaineko senidearen haur bihurtzen da/dira. Erroaren eskuin aldean adabegia(k) goruntz bultzatzen dira. Erroan bertan, adabegia(k) aldez aldatzen da/dira.
+choose_background_color=Atzealde kolorea aukeratu:
+choose_cloud_color=Hodeiaren kolorea aukeratu:
+choose_edge_color=Ertzaren kolorea aukeratu
+choose_map_background_color=Maparen atzealde kolorea aukeratu
+choose_node_background_color=Adabegiaren atzealde kolorea aukeratu:
+choose_node_color=Adabegi kolorea aukeratu:
+ClearLinkAnchorAction.text=Loturaren aingura ezabatu
+ClearLinkAnchorAction.tooltip=<html>Aurrentik ezarritako adabegi aingura ezabatu</html>
+CloneAction.text=Klona itsatsi
+close_btn=&Itxi
+CloseAction.text=Oraingo mapa itxi
+cloud_shapes=Hodei itxurak
+CloudAction.text=Hodeia gehitu/ezabatu (defektuz)
+CloudColorAction.text=Hodei kolorea...
+CloudShapeAction.ARC.text=Uztaia
+CloudShapeAction.RECT.text=Laukizuzena
+CloudShapeAction.ROUND_RECT.text=Laukizuzen borobildua
+CloudShapeAction.STAR.text=Izarra
+ColorProperty.ResetColor=Kolorea jatorrizko aukerara eraman
+combined=Konbinatua
+condition=Baldintza
+confirmation=Baieztapena
+connector=Lotura
+connector_arrows=Lotura geziak
+connector_label=Lotura etiketa
+connector_lines=Lotura lerroak
+connector_shapes=Lotura itxurak
+ConnectorColorAction.text=Lotura kolorea...
+ConvertCloneToIndependentNodeAction.text=Desklonatu
+CopyAction.text=Kopiatu
+CopyAction.tooltip=Aukeratutako adarra kopiatu
+CopyAttributes.text=Berezitasunak kopiatu
+CopyIDAction.text=Adabegiaren IDa kopiatu
+CopyMapStylesAction.text=Mapa estiloa ondorengo aukeratik kopiatu...
+CopyNodeURIAction.text=Adabegiaren URIa kopiatu
+copyright=Copyright \u00A9 2000-2016 Freeplane taldea eta besteak
+CopySingleAction.text=Adabegia (soila) kopiatu
+CopySingleAction.tooltip=Aukeratutako adabegia soilik kopiatu
+CopyStyleExtensionsAction.text=Aukeratutako adabegi estilotik hedapenak kopiatu
+corrupt_map=Maparen edukia hondatuta dago
+CreateConjunctConditionAction.text=Eta
+CreateDisjunctConditionAction.text=Edo
+CreateNotSatisfiedConditionAction.text=Ez
+CreationModificationPluginAction.text=Aldaketa orduak azaldu
+CreationModificationPluginAction.tooltip=<html>Funtzio honek adabegi sorrera eta aldaketa orduen jarraipena gordetzen du</html>
+current_dir=Mapak
+CutAction.text=Ebaki
+decrease_branch_font_size=Hizki txikiagoa
+DecreaseNodeFontAction.text=Hizki neurri txikiagoa
+default=Defektuz, berezko
+defaultAuxiliaryWordList=,,.-ren
+DefaultColorAction.text=Berezko kolorea
+defaultstyle.attributes=Ezaugarriak
+defaultstyle.details=Xehetasunak
+defaultstyle.floating=Adabegi higikorra
+defaultstyle.note=Oharra
+delete=&Exabatu
+delete_child=Adabegia ezabatu
+DeleteAction.text=Adabegia ezabatu
+DeleteConditionAction.text=Ezabatu
+DeleteDetailsAction.text=Adabegiaren xehetasunak ezabatu
+DeleteLevelStyleAction.text=Maila estiloa ezabatu
+DeleteStyleAction.text=Estiloa ezabatu
+DeleteUserStyleAction.text=Erabiltzaileak zehaztutako estiloa ezabatu
+dialect_info.app={0} Mindmap fitxategia {1} programarekin sortu da.
+dialect_info.later_version={0} adimen mapa fitxategia programa honen bertsio berriago batekin sortua izan da.
+dialect_info.unknownApp={0} adimen mapa programa ezezagun batek sortua izan da.
+dialect_info.unknownURL=Ez da bere web lekua ezagutzen.
+dialect_info.url=Informazio gehiago lortzeko programaren {0} web orrira joan.
+dialect_info.warning=Freeplanek oker ireki, erakutsi edo gorde lezake.
+DirectHtmlFlavorHandler=HTML adabegi soil moduan
+DocumentationAction.text=Dokumentazioa
+down=&Behera
+DownConditionAction.text=Behera
+download=Jeitsi
+dropped_file_error=Ezin da/dira botatako fitxategia(k) ireki. Arrazoia {0}
+edge=Ertza
+edge_is_formatted_by_style=Ertzaren formatua estiloak kontrolatzen du. Dagokion estiloa editatu behar izanez gero.
+edge_style=Estiloa editatu
+edge_width=Ertzaren zabalera
+edge_widths=Ertzen zabalerak
+EdgeColorAction.text=Ertzaren kolorea...
+EdgeProperties=Ertzaren ezaugarriak
+EdgeStyleAction.bezier.text=Leunki kurbatuta (bezier)
+EdgeStyleAction.bezier.tooltip=<html>Ertza kurba leun moduan azaldu.</html>
+EdgeStyleAction.hide_edge.text=Ertza ezkutatu
+EdgeStyleAction.hide_edge.tooltip=<html>Aukeratutako adabegien gurasoekiko ertzak <br>ttanttotutako lerro moduan adierazi. Bestela ertza ezkutatu.</html>
+EdgeStyleAction.horizontal.text=Horizontala
+EdgeStyleAction.horizontal.tooltip=<html>Lerro zuzen elkartzutak erabili ertzentzat.</html>
+EdgeStyleAction.linear.text=Lineala
+EdgeStyleAction.linear.tooltip=<html>Ertza lerro zuzen moduan adierazi.</html>
+EdgeStyleAction.sharp_bezier.text=Zorrozki kurbatuta (bezier)
+EdgeStyleAction.sharp_bezier.tooltip=<html>Ertza zorroztutako muturrak dituen kurba leun moduan adierazi.</html>
+EdgeStyleAction.sharp_linear.text=Lerro zorrotza
+EdgeStyleAction.sharp_linear.tooltip=<html>Ertza mutur zorrotzeko lerro zuzen moduan adierazi.</html>
+EdgeStyleAsParentAction.text=Guraso moduan
+EdgeStyleAsParentAction.tooltip=<html>Guraso adabegiaren ertz estiloa erabili.</html>[zaharkitua]
+EdgeWidthAction_width_parent.text=Gurasoa
+EdgeWidthAction_width_thin.text=Mehea
+edit=&Editatu
+edit.decision=HTML Editorea
+edit.edit_rich_text=Hizki lodi eta italika moduko formatuak erabili nahi al dituzu?
+edit_details=Adabegiaren xehetasunak editatu
+edit_end_label=<html>Loturaren<br>etiketa
+edit_label_font_family=Hizki mota
+edit_label_font_size=Hizki neurria
+edit_link_manually=Hyperlinka eskuz editatu...
+edit_long_node=Adabegiaren barrua formularioan editatu
+edit_middle_label=<html>Erdiko<br>etiketa
+edit_note=Oharra editatu
+edit_source_label=<html>Iturburuaren<br>etiketa
+edit_target_label=<html>Helburuaren<br>etiketa
+edit_transparency_label=Ez-gardentasuna
+edit_width_label=Zabalera
+EditAction.text=Adabegiaren barrua bertan editatu
+EditAttributesAction.text=Berezitasunak bertan editatu
+EditDetailsAction.text=Adabegiaren xehetasunak bertan editatu
+EditDetailsInDialogAction.text=Adabegiaren xehetasunak formularioan editatu
+EditFilterAction.text=Filtroa sortu
+EditLongAction.text=Adabegiaren barrua formularioan editatu
+EditNoteInDialogAction.text=Oharra formularioan editatu
+EditScript=Skript-a editatu...
+EditStylesAction.text=Estiloak editatu
+EncryptedMap.text=Babestutako (zifratutako) mapa berria...
+EncryptedMap.tooltip=Babestutako mapa berria
+encryption=Zifratua
+enter_base_url=Lotura relatiboak itsastera noa. Mesede oinarrizko URL sartu.
+enter_command=Komandoa sartu
+enter_condition_name=Sartu baldintza berriaren izena
+enter_confirms=&Enter-ek baieztatu egiten du
+enter_keyset_name=Tekla azkar taldearen izena sartu
+enter_map_url=Maparen URLa sartu
+enter_new_style_name=Estilo berriaren izena sartu
+enter_node_id=Adabegiaren IDa sartu
+enter_zoom=Zooma sartu
+EnterPassword.text=Pasahitza sartu
+error=Akatsa
+error_applying_template=Akatsa XSL txantilloia aplikatzean.
+error_creating_directory=Ezin da esportatzeko direktorioa sortu.
+error_in_template=Defektuzko {0} mapa txantiloian akatsak. Fitxategi hau ezabatzen saiatu.
+errornumber={0} akats
+ExecuteScript.available_modes_tooltip={0} eskura dago
+ExecuteScript.script=Skript-a
+ExecuteScriptError.text=Skripta abiarazten arazoak:\n{0}
+ExecuteScriptForAllNodes.text=Skript guztiak abiarazi
+ExecuteScriptForSelectionAction.text=Aukeratutako adabegien skript-ak abiarazi
+ExecuteScriptOnSelectedNode.text={0} aukeratutako adabegi guztietan abiarazi
+ExecuteScriptOnSelectedNodeRecursively.text={0} errekurtsiboki abiarazi aukeratutako adabegietan
+ExecuteScriptOnSingleNode.text={0} aukeratutako adabegi batetan abiarazi
+ExecuteScripts.noScriptsAvailable=Bat ere ez eskuragarri
+ExecuteScripts.text=Skriptak
+ExecuteScriptSecurityError.text=Script-aren exekuzioan akats bat bertatu da: {0}
+export_failed=Akatsa esportatzean
+export_pdf_text=Portable Document Format (PDF), Dokumentu Formatu Eramangarria
+export_svg_text=Scalable Vector Graphic (SVG), Bektore grafiko eskalagarria
+export_using_xslt=Esportatu (Freeplane)
+ExportAction.text=Mapa esportatu...
+ExportBranchAction.text=Adarra mapa berri batetara mugitu...
+ExportBranchToHTMLAction.text=Adarra HTML eran
+exported_file={0} fitxategia
+ExportPdf.text=PDF
+ExportSvg.text=SVG
+ExportToHTMLAction.text=HTML
+ExportToImage.jpg.text=JPEG
+ExportToImage.png.text=PNG
+ExportToOoWriter.text=Open Office Writer dokumentua...
+extension_menu=Estilo fisikoa
+ExternalImage_popupMenu_Change=Aldatu...
+ExternalImage_popupMenu_Open=Ikusgailuan ireki
+ExternalImage_popupMenu_Remove=Ezabatu
+ExternalImage_popupMenu_ResetZoom=Zooma berera eraman
+ExternalImageAddAction.text=Irudia gehitu...
+ExternalImageChangeAction.text=Irudia aldatu...
+ExternalImageRemoveAction.text=Irudia ezabatu
+ExtractLinkFromTextAction.text=Testu barrutik link-a eraldatu
+ExtractLinkFromTextAction.tooltip=Hyperlinka n helbidearen adabegi testutik ezarri
+extras=&Lanabesak
+f_button_unassigned=<ekintzarik ez>
+FaqOpenURLAction.text=FAQ
+file=&Fitxategia
+file_already_exists={0} fitxategia existitzen da dagoeneko. Gainean berridatzi nahi?
+file_not_found={0} fitxategia ez da aurkitu
+FileListFlavorHandler=Fitxategietara loturak
+FileProperties_BranchLeafCount=Hosto adabegi kopurua aukeratutako adarre(t)an:
+FileProperties_BranchNodeCount=Adarre(t)an aukeratutako adabegi kopurua:
+FileProperties_ChangesSinceLastSave=Azkena gorde zenetik aldaketak:
+FileProperties_FileName=Fitxategi izena:
+FileProperties_FileSaved=Fitxategia gordeta:
+FileProperties_FileSize=Fitxategi neurria:
+FileProperties_MainBranchCount=Adar nagusi kopurua:
+FileProperties_NeverSaved=Orain artean gorde gabe
+FileProperties_NodeChildCount=Aukeratutako adabegi(ar)en hau kopurua:
+FileProperties_NodeSelectionCount=Aukeratutako adabegi kopurua:
+FileProperties_TotalFilteredCount=Filtroaren araua betetzen duten adabegien kopurua:
+FileProperties_TotalLeafCount=Hosto adabegien kopuru osoa:
+FileProperties_TotalNodeCount=Adabegi kopurua:
+FilePropertiesAction.text=Maparen estatistikak...
+FileRevisionsDialog.cancel=&Ezeztatu
+FileRevisionsDialog.file_last_modified=Denbora zigilua
+FileRevisionsDialog.file_name=Fitxategia
+FileRevisionsDialog.file_size=Byte-ak
+FileRevisionsDialog.open=&Ireki
+FileRevisionsDialog.open.tooltip=Ireki zaharktiua egon liteken arren
+FileRevisionsDialog.question={0} berrikuspenak aurkitu ditut
+FileRevisionsDialog.restore=Berre&skuratu
+FileRevisionsDialog.restore.tooltip={0} {1}-z ordezkatu
+FileRevisionsDialog.title=Fitxategi berrikuspenak
+filter=F&iltratu
+filter_add=&Gehitu
+filter_and=E&ta
+filter_any_text=Nukleoa, adabegiaren xehetasunak
+filter_clone_snapshot=Aukeraren klonak gorde
+filter_clones=Aukeraren klonak
+filter_conditions=Filtroak
+filter_contains=Beregan dauka
+filter_created_after=Ondoren sortua
+filter_created_before=Aurretik sortua
+filter_delete=&Ezabatu
+filter_details=Xehetasunak
+filter_dialog=Fitxategi konposatzailea
+filter_does_not_exist=Ez da existitzen
+filter_edit_description=Filtro zerrenda editatu
+filter_enter_value=Balioa sartu
+filter_even_level=Adabegi maila bakoitia
+filter_exist=Existitzen da
+filter_icon=Ikonoa
+filter_is_equal_to=-ren berdina da
+filter_is_not_equal_to=-ren ezberdina da
+filter_leaf=Hosto adabegia
+filter_link=Hyperlink-a
+filter_match_approximately=&Hurbildu
+filter_match_approximately_tooltip=<html>Baldin eta antzekotasunez parekatzeko, <br/>adib: "fitxategi" hitza billazean "flitxategi" ere aurkituko luke.</html>
+filter_match_case=Hizki txikiz ala larriz den &kontutan izan
+filter_match_case_tooltip=Hizki txikiz ala larriz den kontutan izan konparaketa egiterakoan.
+filter_modified_after=Ondoren aldatua
+filter_modified_before=Aurretik aldatua
+filter_no_filtering=Filtrorik ez (ezabatu)
+filter_node=Testu nukleoa
+filter_node_level=Adabegi maila
+filter_not=&Ez
+filter_note=Oharra
+filter_odd_level=Adabegi maila bikoitia
+filter_or=Ed&o
+filter_parent=Guraso testua
+filter_periodic_level=Maiztasunekoa
+filter_priority=Lehentasun
+filter_regexp_matches=Regexp edo espresio erregularrak alderatu
+filter_reminder=Gogoratzeko
+filter_reminder_after=ondoren planifikatua
+filter_reminder_before=aurretik planifikatua
+filter_reminder_executed=dagoeneko abiatua
+filter_reminder_later=geroagorako planifikatua
+filter_root=Erro adabegia
+filter_script=Script filtroa
+filter_select=&Aukeratu
+filter_selected_node_view=Oraingoz aukeratutako adabegiak
+filter_selected_node_view_snapshot=Gordetako aukeraketa
+filter_style=Estiloa
+filter_time=Data filtroa
+FilterCondition=Baldintzak filtratu
+filterConditions=Erabiltzaileak definitutako filtroak
+filterConditions.noActions=Izenik gabeko filtroak
+filters_not_loaded=Ezin izan da filtroa kargatu, fitzategia izorratuta
+find=Bilatu
+find_what=Zer bilatu
+FindAction.text=&Bilatu...
+FindNextAction.text=Hurrengoa bilatu
+FindPreviousAction.text=Aurrekoa bilatu
+fit_background_to_page=Atzealdeko irudia orri batera egokitu
+fit_map_to_page=&Orri batera egokitu
+fit_map_to_page_height=&Garaiera orri batera egokitu
+fit_map_to_page_width=&Zabalera orri batera egokitu
+FitToPage.text=Zoom-a orrira egokitu
+FitToPage.tooltip=Mapa osoa oraingo leihora egokitzeko doitzen du zoom-a.
+fold=Tolestura
+FoldAllAction.text=Guztiak tolestu
+FoldAllAction.tooltip=<html>Aukeratutako adabegiak eta beren haurrak tolestu</html>
+FoldOneLevelAction.text=Maila bat tolestu
+FoldOneLevelAction.tooltip=<html>Aukeratutako adabegiak maila batean tolesten ditu.</html>
+follow_clone="{0}" barruan
+follow_graphical_link="{0}"-ra joan
+FollowLinkAction.text=Lotura jarraitu
+font=Hizki mota
+FontFamilyAction.text=Hizki mota familia
+FontSizeAction.text=Hizki neurria
+format=F&ormatua
+format_invalid_pattern=Patroiak ez du balio
+format_menu_cloud_shapes=Hodeia gehitu edota estiloa aldatu
+format_menu_edge_styles=&Ertz estiloak
+format_menu_edge_widths=Ertz &Zabalerak
+format_panel=Formatua
+FormatCopy.text=Formatua kopiatu
+FormatCopy.tooltip=<html>Adabegiaren formatua kopiatzen du.</html>
+FormatPaste.text=Formatua itsatsi
+FormatPaste.tooltip=<html>Adabegiaren formatua itsasten du.</html>
+formats_not_loaded=Formatuak ezin izan dira kargatu, fitxategia izorratuta
+formula.error.attributeValueIsNull="{0}" berezitasunaren balioa ebaluaketa ondoren NULL da.
+formula.error.circularReference=Erreferentzi zirkularra. "{0}" adabegiaren formulak bere burua erreferentziatzen du.
+formula.EvaluateAllAction.text=Guztiak ebaluatu
+formula.EvaluateAllAction.tooltip=Mapa hontako formula guztiak ebaluatu
diff --git a/freeplane/resources/translations/Resources_fr.properties b/freeplane/resources/translations/Resources_fr.properties
index 2693a33..6a47652 100644
--- a/freeplane/resources/translations/Resources_fr.properties
+++ b/freeplane/resources/translations/Resources_fr.properties
@@ -35,6 +35,7 @@ actual_node_styles=Styles conditionnels appliqu\u00E9s au n\u0153ud
add=Ajouter
AddConnectorAction.text=Connecteur
AddElementaryConditionAction.text=Ajouter
+AddExecutionLinkAction.text=Ajouter un lien ex\u00E9cutant une commande de l'OS...
AddLocalLinkAction.text=Lien vers un n\u0153ud
AddMenuItemLinkAction.text=Lien vers une commande...
AddOnDetailsPanel.authored.by=Par {0}
@@ -96,6 +97,7 @@ attribute_delete_value=Supprimer cette valeur
attribute_font_size_tooltip=Taille de police d'attribut
attribute_list_box_label_text=Valeurs existantes
attribute_name=Nom
+attribute_name_or_value=Nom ou valeur de l'attribut
attribute_replace=Remplacer par
attribute_top=Tous les attributs connus de la carte courante
attribute_value=Valeur
@@ -137,14 +139,21 @@ attributes_visible_tooltip=S\u00E9lectionner ce qui est visible
automatic_layout=Style automatique
automatic_layout_disabled=D\u00E9sactiv\u00E9
automatically_save_message=Carte sauvegard\u00E9e automatiquement sous : {0}
+AutomaticEdgeColor.FOR_BRANCHES=pour les branches
+AutomaticEdgeColor.FOR_COLUMN=pour colonne
+AutomaticEdgeColor.FOR_COLUMNS=pour les colonnes
+AutomaticEdgeColor.FOR_LEVELS=pour les niveaux
+AutomaticEdgeColor.ON_BRANCH_CREATION=lors de la cr\u00E9ation d'une branche
AutomaticEdgeColorHookAction.text=Couleur de ligne automatique
AutomaticLayout.ALL=Pour tous les niveaux
+AutomaticLayout.COLUMNS=pour les colonnes
AutomaticLayout.HEADINGS=Sauf pour les derniers niveaux
AutomaticLayout.level=Niveau {0}
AutomaticLayout.level.root=Racine
AutomaticLayoutAction.text=Styles automatiques par niveau
AutomaticLayoutAction.tooltip=Applique \u00E0 toute la carte une mise en forme des n\u0153uds en fonction de leur niveau
AutomaticLayoutControllerAction.ALL.text=Pour tous les niveaux
+AutomaticLayoutControllerAction.COLUMNS.text=pour les colonnes
AutomaticLayoutControllerAction.HEADINGS.text=Sauf pour les derniers niveaux
AutomaticLayoutControllerAction.null.text=D\u00E9sactiv\u00E9
BackAction.text=N\u0153ud pr\u00E9c\u00E9dent dans l'historique
@@ -161,10 +170,12 @@ branch=Branche
browse=Ouvrir...
calendar_attributes_panel=Calendrier et attributs
calendar_panel=Calendrier
+can_not_clone_encrypted_node=Impossible de cloner des noeuds s\u00E9curis\u00E9s
can_not_connect_to_info_server=Impossible de se connecter au serveur
can_not_delete_predefined_style=Impossible de supprimer un style syst\u00E8me.
can_not_delete_root_style=Impossible de supprimer le style du n\u0153ud racine
can_not_delete_style_group=Impossible de supprimer ce type de style
+can_not_encrypt_cloned_node=Impossible de cloner des noeuds prot\u00E9g\u00E9s
can_not_save_key_set=Impossible d'enregistrer les touches de fonction
cancel=Annuler
CancelAction.text=Annuler
@@ -172,6 +183,7 @@ cannot_add_parent_diff_parents=Pour utiliser cette fonction, tous les n\u0153uds
cannot_add_parent_to_root=Le n\u0153ud racine ne peut \u00EAtre ajout\u00E9 comme n\u0153ud fils.
cannot_delete_root=Le n\u0153ud racine ne peut \u00EAtre ni coup\u00E9, ni supprim\u00E9.
cannot_join_nodes_with_children=Impossible de fusionner des n\u0153uds ayant des fils.
+cannot_move_into_child_node=Impossible de d\u00E9placer dans le fils
cannot_move_to_child=Impossible de d\u00E9placer un n\u0153ud dans l'un de ses fils.
CenterAction.text=Centrer
CenterSelectedNodeAction.text=Centrer le n\u0153ud s\u00E9lectionn\u00E9
@@ -196,8 +208,10 @@ choose_node_background_color=Couleur de fond du n\u0153ud
choose_node_color=Couleur du texte pour le n\u0153ud
ClearLinkAnchorAction.text=Ne plus m\u00E9moriser le n\u0153ud
ClearLinkAnchorAction.tooltip=Efface la m\u00E9morisation du n\u0153ud
+CloneAction.text=Coller comme Clone
close_btn=Fermer
CloseAction.text=Fermer la carte
+cloud_shapes=Formes de nuage
CloudAction.text=Ajouter un nuage
CloudColorAction.text=Ajouter un nuage ou modifier sa couleur...
CloudShapeAction.ARC.text=Arc
@@ -214,13 +228,14 @@ connector_label=Libell\u00E9 du connecteur
connector_lines=Trait du connecteur
connector_shapes=Forme du connecteur
ConnectorColorAction.text=Couleur du connecteur...
+ConvertCloneToIndependentNodeAction.text=Ne plus cloner
CopyAction.text=Copier
CopyAction.tooltip=Copie la branche s\u00E9lectionn\u00E9e
CopyAttributes.text=Copier les attributs
CopyIDAction.text=Copier l'identifiant du n\u0153ud
CopyMapStylesAction.text=Importer des styles...
CopyNodeURIAction.text=Copier l'identifiant du n\u0153ud et chemin de la carte
-copyright=Copyright \u00A9 2000-2014 \u00E9quipe Freeplane et autres contributeurs
+copyright=Copyright \u00A9 2000-2016 \u00E9quipe Freeplane et autres contributeurs
CopySingleAction.text=Copier le n\u0153ud seul (sans fils)
CopySingleAction.tooltip=Copie uniquement le n\u0153ud s\u00E9lectionn\u00E9
CopyStyleExtensionsAction.text=Appliquer les d\u00E9tails et attributs du style
@@ -235,7 +250,9 @@ CutAction.text=Couper
decrease_branch_font_size=R\u00E9duire la taille du texte de la branche
DecreaseNodeFontAction.text=R\u00E9duire la taille du texte
default=Par d\u00E9faut
+defaultAuxiliaryWordList=un, une, des, le, la, les ...
DefaultColorAction.text=Couleur par d\u00E9faut
+defaultstyle.attributes=Attributs
defaultstyle.details=D\u00E9tails
defaultstyle.floating=N\u0153ud libre
defaultstyle.note=Note
@@ -263,7 +280,9 @@ edge=Ligne
edge_is_formatted_by_style=Le format des lignes des n\u0153uds est d\u00E9finit gr\u00E2ce aux styles. Si besoin, modifiez les styles.
edge_style=Style de ligne
edge_width=\u00C9paisseur de ligne
+edge_widths=Largeur de ligne
EdgeColorAction.text=Couleur de ligne...
+EdgeProperties=Propri\u00E9t\u00E9s de la ligne
EdgeStyleAction.bezier.text=Courbe
EdgeStyleAction.bezier.tooltip=Le style de ligne est une courbe
EdgeStyleAction.hide_edge.text=Invisible
@@ -306,7 +325,9 @@ EditScript=Modifier le script...
EditStylesAction.text=G\u00E9rer les styles...
EncryptedMap.text=Nouvelle carte prot\u00E9g\u00E9e...
EncryptedMap.tooltip=Cr\u00E9er une nouvelle carte prot\u00E9g\u00E9e par mot de passe
+encryption=Encryptage
enter_base_url=Je vais coller les liens associ\u00E9s. Merci de saisir l'URL de base.
+enter_command=Entrez la commande
enter_condition_name=Nom du filtre :
enter_confirms=La touche "Entr\u00E9e" valide la saisie
enter_keyset_name=Nom de l'enregistrement pour les touches de fonction :
@@ -320,6 +341,8 @@ error_applying_template=Erreur d'application du mod\u00E8le XSL.
error_creating_directory=Impossible de cr\u00E9er un dossier pour l'exportation.
error_in_template=Erreurs dans le mod\u00E8le par d\u00E9faut {0}. Essayez de supprimer ce fichier.
errornumber={0} erreur(s)
+ExecuteScript.available_modes_tooltip={0} \u00EAtre disponible pour
+ExecuteScript.script=Script
ExecuteScriptError.text=Erreur \u00E0 l''ex\u00E9cution du script :\n{0}
ExecuteScriptForAllNodes.text=Ex\u00E9cuter tous les scripts
ExecuteScriptForSelectionAction.text=Ex\u00E9cuter les scripts des n\u0153uds s\u00E9lectionn\u00E9s
@@ -353,6 +376,7 @@ ExternalImageChangeAction.text=Modifier l'image...
ExternalImageRemoveAction.text=Supprimer l'image
ExtractLinkFromTextAction.text=Cr\u00E9er un lien hypertexte \u00E0 partir du n\u0153ud
ExtractLinkFromTextAction.tooltip=Cr\u00E9er un lien hypertexte \u00E0 partir du texte pr\u00E9sent dans le n\u0153ud
+extras=&Outils
f_button_unassigned=<aucune action>
FaqOpenURLAction.text=Foire aux questions (FAQ)
file=&Fichier
@@ -383,10 +407,12 @@ FileRevisionsDialog.question=Modifications trouv\u00E9es pour {0}
FileRevisionsDialog.restore=R\u00E9tablir
FileRevisionsDialog.restore.tooltip=Remplacer {0} par {1}
FileRevisionsDialog.title=R\u00E9visions du fichier
-filter=Filtre
+filter=F&iltres
filter_add=Ajouter
filter_and=Et
filter_any_text=Toutes les zones de texte
+filter_clone_snapshot=S\u00E9lection clon\u00E9e
+filter_clones=Clones de la s\u00E9lection
filter_conditions=Filtres
filter_contains=contient
filter_created_after=cr\u00E9\u00E9 apr\u00E8s
@@ -433,26 +459,33 @@ filter_selected_node_view=N\u0153uds s\u00E9lectionn\u00E9s
filter_selected_node_view_snapshot=N\u0153uds de la s\u00E9lection
filter_style=Style
filter_time=Date
-FilterComposerDialog.save=Enregistrer sous...
+FilterCondition=Conditions de filtrage
+filterConditions=Filtres personnalis\u00E9s
+filterConditions.noActions=Aucun filtre nomm\u00E9
filters_not_loaded=Les filtres n'ont pas pu \u00EAtre charg\u00E9s, le fichier est corrompu
+find=Rechercher
find_what=Que rechercher ?
FindAction.text=Rechercher des n\u0153uds...
-FirstGroupNodeAction.text=D\u00E9but de synth\u00E8se
+FindNextAction.text=R\u00E9sultat suivant
+FindPreviousAction.text=R\u00E9sultat pr\u00E9c\u00E9dent
+fit_background_to_page=Ajuster l'image d'arri\u00E8re-plan
fit_map_to_page=Ajuster \u00E0 une seule page
fit_map_to_page_height=Ajuster la hauteur \u00E0 une page
fit_map_to_page_width=Ajuster la largeur \u00E0 une page
-FitToPage.text=Faire tenir dans la page
+FitToPage.text=Ajuster \u00E0 la page
FitToPage.tooltip=Ajuste le zoom pour que la carte tienne sur la page
fold=Plier
FoldAllAction.text=Tout plier
FoldAllAction.tooltip=Plie les n\u0153uds s\u00E9lectionn\u00E9s ainsi que leurs fils
FoldOneLevelAction.text=Plier un niveau
FoldOneLevelAction.tooltip=Plie un niveau des n\u0153uds s\u00E9lectionn\u00E9s
-follow_graphical_link=Aller \u00E0 :
+follow_clone=dans ''{0}''
+follow_graphical_link=Aller \u00E0 ''{0}''
FollowLinkAction.text=Suivre le lien
font=Police
FontFamilyAction.text=Famille de police
FontSizeAction.text=Taille de police
+format=&Mise en forme
format_invalid_pattern=Le format d\u00E9finit n'est pas valide.
format_menu_cloud_shapes=Type de nuage
format_menu_edge_styles=Style de ligne
@@ -487,6 +520,8 @@ freeplane_reverted=Freeplane_r\u00E9cup\u00E9r\u00E9_
FreeplaneHelpStarter.text=Aide...
FreeplaneHelpStarter.tooltip=Aide \u00E9tendue de Freeplane
GettingStartedAction.text=Guide de d\u00E9marrage rapide
+goto=Aller \u00E0
+goto.noActions=Aucun n\u0153ud cible
GotoLinkNodeAction.text=Aller au lien
GotoNodeAction.text=Aller au n\u0153ud portant l'ID...
GrabKeyDialog.common.cancel=Annuler
@@ -618,7 +653,7 @@ icon_wizard=Magique
icon_xmag=\u00C0 discuter
icon_yes=Important
IconGroupPopupAction.arrows.text=Fl\u00E8ches
-IconGroupPopupAction.docs_folders.text=Documents
+IconGroupPopupAction.docs_folders.text=Documents et Fichiers
IconGroupPopupAction.flags.text=Drapeaux
IconGroupPopupAction.math.text=Calcul
IconGroupPopupAction.media.text=M\u00E9dia
@@ -642,19 +677,21 @@ IconProgressIconUpAction.text=Ajouter l'ic\u00F4ne / Augmenter l'avancement
IconProgressIconUpAction.tooltip=Cr\u00E9e ou modifie l'ic\u00F4ne d'avancement en croissant : 0% -> 25% -> 50% -> 75% -> 100% + ic\u00F4ne OK
IconProgressRemoveAction.text=Retirer les indicateurs d'avancement
IconProgressRemoveAction.tooltip=Retire l'ic\u00F4ne d'avancement et l'image cliquable d'avancement
+icons=Ic\u00F4nes
IconSelectionPlugin.text=Ajouter une ic\u00F4ne...
IconSelectionPlugin.tooltip=Ajoute une ic\u00F4ne gr\u00E2ce \u00E0 la biblioth\u00E8que d'ic\u00F4nes
image_covertLink=Convertir le lien en image
ImageFlavorHandler=Image (utilise un fichier s\u00E9par\u00E9)
-import=Importer
+import=I&mporter
import_linked_branch_no_link=Le n\u0153ud s\u00E9lectionn\u00E9 n'a pas de lien exploitable comme source d'import.
-ImportAction.text=Importer
-ImportBranchAction.text=Une carte...
+ImportAction.text=Importer une carte
+ImportBranchAction.text=Branche...
ImportExplorerFavoritesAction.text=Les favoris d'Internet Explorer...
ImportFolderStructureAction.text=Une arborescence de dossiers...
ImportLinkedBranchAction.text=La carte li\u00E9e
-ImportLinkedBranchWithoutRootAction.text=La carte li\u00E9e sans la racine
+ImportLinkedBranchWithoutRootAction.text=La branche li\u00E9e sans la racine...
ImportMindmanagerFiles.text=Carte MindManager X5...
+ImportXmlFile.text=Importer un fichier XML
increase_branch_font_size=Augmenter la taille du texte de la branche
IncreaseNodeFontAction.text=Augmenter la taille du texte
internal_error_tooltip=Freeplane a rencontr\u00E9 des erreurs. Pour consulter le dernier fichier log stock\u00E9 dans {0}, cliquez.
@@ -666,20 +703,31 @@ invalid_url_msg=Impossible de cr\u00E9er une URL valide pour {0}
ItalicAction.text=Italique
italicise_branch=Branche en italique
java_version=Version Java : {0}
-JoinNodesAction.text=Fusionner les n\u0153uds
+JoinNodesAction.separator.format=Fusionner les noeuds avec "{0}"
+lastOpenedMaps=Fichiers r\u00E9cents
+lastOpenedMaps.noActions=Aucune carte dans l'historique
latex_editor=Modifier la formule LaTeX
LatexDeleteLatexAction.text=Supprimer la formule LaTeX
LatexEditLatexAction.text=Modifier la formule LaTeX...
+LatexInsertLatexAction.msg1=<html>Vous tentez d'ins\u00E9rer une formule LaTeX <i>native</i>.<br/>La nouvelle mani\u00E8re d'ins\u00E9rer une chaine ou une formule LaTeX est d\u00E9crite sur cette page :</html>
+LatexInsertLatexAction.msg2=<html>En r\u00E9sum\u00E9 :<ul><li>saisissez le pr\u00E9fixe "\\latex" devant le texte du n\u0153ud</li><li>ou affichez le Panneau de propri\u00E9t\u00E9s depuis le menu <i>Affichage -> Barres d'outils -> Panneau de propri\u00E9t\u00E9s</i>, enfin s\u00E9lectionnez <i>Texte calcul\u00E9 -> Format -> LaTeX.</i></li></ul></html>
LatexInsertLatexAction.text=Ajouter une formule LaTeX...
latexPatternFormat=LaTeX
+LengthUnits.cm=cm
+LengthUnits.in=in
+LengthUnits.mm=mm
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=Vous devez s\u00E9lectionner au moins deux n\u0153uds pour les lier.
license=Licence
license_text=<html>Le pr\u00E9sent programme est un logiciel libre\u00A0; vous pouvez le redistribuer et/ou <br>le modifier conform\u00E9ment aux conditions de la Licence G\u00E9n\u00E9rale Publique GNU (GNU General Public License) <br>telle qu'elle est publi\u00E9e par la Free Software Foundation\u00A0; que ce soit la<br> version\u00A02 de la licence, ou (\u00E0 votre choix) toute version ult\u00E9rieure.<br><br>Le pr\u00E9sent programme est distribu\u00E9 aux fins d'\u00EAtre utile, <b [...]
link_error=Le lien "{0}" est incorrect, il n''a pas \u00E9t\u00E9 charg\u00E9
link_not_available_any_more=Ce lien n'est plus valide. Le n\u0153ud a \u00E9t\u00E9 supprim\u00E9 dans l'intervalle.
link_not_found=Lien {0} non trouv\u00E9.
+links=Lien
load=Ouvrir...
load_accelerator_presets=Ouvrir
+load_accelerator_presets.noActions=Aucun raccourci
LoadAcceleratorPresetsAction.textPatterns.text=Touches de fonction par d\u00E9faut
locking_failed_by_open=Impossible de verrouiller la carte {0}. Ouverture en lecture-seule.
locking_failed_by_save_as=La carte {0} est verrouill\u00E9e. Enregistrement impossible.
@@ -687,6 +735,7 @@ locking_old_lock_removed=La carte {0} est verrouill\u00E9e par l''utilisateur {1
long_node_changed_cancel=Vous avez chang\u00E9 le n\u0153ud. Voulez-vous annuler les changements ?
long_node_changed_submit=Vous avez changez le n\u0153ud. Voulez-vous enregistrer les changements ?
lots_of_links_warning=Vous allez cr\u00E9er un nombre important de liens vers le m\u00EAme n\u0153ud. Voulez-vous vraiment cr\u00E9er ces liens ?
+main_menu=Menu
main_resource_directory=Dossier d''installation du programme : {0}
MainView.errorUpdateText=Impossible de calculer {0}.\nD\u00E9tails de l''erreur : {1}.
MakeLinkFromAnchorAction.text=Cr\u00E9er un lien dans le n\u0153ud m\u00E9moris\u00E9
@@ -728,12 +777,17 @@ ManageAddOnsDialog.visit.addon.page=Ouvrir le site web des add-ons...
ManageConditionalStylesAction.text=Styles conditionnels de carte...
ManageNodeConditionalStylesAction.text=Styles conditionnels de n\u0153ud...
map_already_exists=Le fichier existe d\u00E9j\u00E0. Souhaitez-vous le remplacer ?
+map_background=Arri\u00E8re-plan de la carte
+map_background_image=Image d'arri\u00E8re-plan
map_corrupted=Carte corrompue. Afficher d'avantage ?
map_load_error=Impossible d''ouvrir le fichier {0}
map_locked_by_open=La carte {0} est en cours d''utilisation par l''utilisateur {1}. Ouverture en lecture-seule.
map_locked_by_save_as=La carte {0} est en cours d''utilisation par l''utilisateur {1}. L''op\u00E9ration d''enregistrement a \u00E9chou\u00E9e.
map_not_saved=Vous devez enregistrer la carte pour r\u00E9aliser cette op\u00E9ration.
-MapBackgroundColorAction.text=Arri\u00E8re-plan de la carte...
+MapBackgroundClearAction.text=Effacer
+MapBackgroundColorAction.text=Couleur d'arri\u00E8re-plan
+MapBackgroundImageAction.text=Image d'arri\u00E8re-plan...
+maps=Cartes
MaxNodeWidth.text=Largeur maximale du n\u0153ud
menu_applyStyle=Appliquer un style
menu_attributes=Attributs
@@ -745,10 +799,6 @@ menu_displayAttributes=Attributs
menu_encryption=Protection
menu_error=Erreur dans la structure de menu personnalis\u00E9e {0} :\n{1}\nAnnulation
menu_extensions=N\u0153ud avanc\u00E9
-menu_extras=&Outils
-menu_file_import=Importer
-menu_filter=F&iltres
-menu_format=&Mise en forme
menu_group=Regroupement de n\u0153uds
menu_hoverView=Info bulles sur les n\u0153uds
menu_iconByCategory=Ic\u00F4nes par cat\u00E9gories
@@ -756,26 +806,20 @@ menu_iconView=Ic\u00F4nes
menu_image=Image
menu_insert=Ins\u00E9rer
menu_latex_formula=Formule LaTex
-menu_links=Lien
menu_manageStyles=Styles
menu_moveNode=D\u00E9placement
-menu_navigate=&Navigation
menu_newNode=Nouveau n\u0153ud
menu_node=N\u0153ud
menu_node_features=N\u0153ud avanc\u00E9
menu_nodes=N\u0153ud
menu_nodeView=N\u0153ud
-menu_notes=Notes
menu_noteView=Notes
menu_openmaps=Cartes
-menu_progress=Avancement
menu_remove_icons=Supprimer les ic\u00F4nes
menu_removeAttribute=Supprimer les attributs
menu_select=S\u00E9lection
menu_time=Calendrier
menu_title=N\u0153ud
-menu_toolbars=Barres d'outils
-menu_view=&Affichage
menu_viewmode=Param\u00E8tres d'affichage
MenuUtils.invalid_menuitem={0} n''est pas valide.
mindmap=Carte
@@ -789,14 +833,17 @@ mode_File=Explorateur de fichiers
mode_MindMap=Concepteur
mode_na=Mode indisponible
mode_status=Bascul\u00E9 en mode {0}
+mode_StyleMap=Modification du style
mode_title=Freeplane - {0}
modes=Modes
ModesMenuAction.Browse.text=Visionneuse de cartes
ModesMenuAction.File.text=Explorateur de fichiers
ModesMenuAction.MindMap.text=Concepteur de cartes
most_recent_files=Fichiers r\u00E9cents
+MoveAction.text=D\u00E9placer
MoveToRootAction.text=Aller \u00E0 la racine
NameConditionAction.text=Nommer le filtre...
+navigate=&Navigation
NavigationNextMapAction.text=Carte suivante
NavigationPreviousMapAction.text=Carte pr\u00E9c\u00E9dente
new=Nouveau...
@@ -817,7 +864,7 @@ NewerFileRevisionsFoundDialog.question=Il existe des versions plus r\u00E9centes
NewerFileRevisionsFoundDialog.restore=Restaurer
NewerFileRevisionsFoundDialog.restore.tooltip=Remplacer {0} par {1}
NewerFileRevisionsFoundDialog.title=Une version plus r\u00E9cente du fichier a \u00E9t\u00E9 trouv\u00E9e !
-NewFreeNodeAction.text=N\u0153ud libre
+NewFreeNodeAction.text=Nouveau n\u0153ud flottant
NewLevelStyleAction.text=Cr\u00E9er un style automatique de niveau
newmap.install.addon.question={0} semble \u00EAtre un add-on.\nSouhaitez-vous l''installer ?\n(R\u00E9pondez "Non" pour ouvrir le fichier normalement)
newmap.install.addon.title=Installer l'add-on ?
@@ -846,6 +893,7 @@ node=n\u0153ud
node_changed_discard_changes=Vous avez modifi\u00E9 le n\u0153ud. Voulez-vous ignorer ces changements ?
node_is_write_protected=Le n\u0153ud cible est prot\u00E9g\u00E9 contre l'\u00E9criture.
node_location_help=Le glisser/d\u00E9poser change l'emplacement des n\u0153uds, ctrl+glisser/d\u00E9poser change les distances, les doubles clics et ctrl+doubles clics les remettent \u00E0 z\u00E9ro.
+node_popup_scripting=Scripts
node_selector=S\u00E9lection du n\u0153ud
node_selector_message=<html>Veuillez choisir le n\u0153ud par double clic.<br>Cette fen\u00EAtre se fermera automatiquement apr\u00E8s s\u00E9lection.
node_styles=Style
@@ -859,14 +907,24 @@ NodeListAction.text=Rechercher et remplacer...
NodeListAction.tooltip=Rechercher et remplacer le texte des n\u0153uds (les n\u0153uds sont affich\u00E9s dans un tableau)
NodeShapeAction.bubble.text=Bulle
NodeShapeAction.fork.text=Fourche
+NodeShapeAction.narrow_hexagon.text=Hexagone ajust\u00E9
+NodeShapeAction.oval.text=Ovale
+NodeShapeAction.rectangle.text=Rectangle
+NodeShapeAction.small_bubble.text=Petite bulle
+NodeShapeAction.small_wide_hexagon.text=Petit hexagone
+NodeShapeAction.wide_hexagon.text=Grand hexagone
NodeUpAction.text=D\u00E9placer le n\u0153ud vers le haut
-NodeWidthAction.text=D\u00E9finir la largeur du n\u0153ud...
nonboldify_branch=Supprimer le gras pour la branche
nonitalicise_branch=Supprimer l'italique pour la branche
normal=Normal
not_saved_for_image_error=Vous devez enregistrer la carte avant d'ajouter une image
not_saved_for_link_error=La carte doit avoir \u00E9t\u00E9 enregistr\u00E9e avant de pouvoir d\u00E9finir un lien vers un fichier.
note_window_location=Position de l'\u00E9diteur de notes
+notes=Note
+NotificationOptions.CLOSE=Fermer
+NotificationOptions.REMIND_ME_LATER=Me le demander plus tard
+NotificationOptions.REMOVE_REMINDER=Supprimer le rappel
+NotificationOptions.SELECT_NODE=Aller au rappel
ok=Valider
OKAction.text=Valider
OnlineReference.text=Documentation en ligne
@@ -895,6 +953,7 @@ OptionPanel.always_load_last_maps.tooltip=Tenir compte des 2 options pr\u00E9c\u
OptionPanel.always_save_folding=Toujours
OptionPanel.always_save_folding_state=Toujours enregistrer les changements d'\u00E9tat du pliage
OptionPanel.always_save_folding_state.tooltip=Toute action de pliage est consid\u00E9r\u00E9e comme une modification de la carte. Lors de la fermeture de la carte vous vous verrez proposer d'enregistrer vos modifications alors que vous n'avez fait que des actions de pliage
+OptionPanel.always_show_less_than_N_nodes_after_load=D\u00E9plier quelques n\u0153uds
OptionPanel.always_unfold_all_after_load=Tout d\u00E9plier
OptionPanel.antialias=Lissage
OptionPanel.antialias.tooltip=D\u00E9finit la qualit\u00E9 graphique de la carte. Les op\u00E9rations de lissage peuvent prendre du temps.
@@ -932,6 +991,8 @@ OptionPanel.combined=Mixte
OptionPanel.compare_as_number=Comparer comme nombres
OptionPanel.convert_to_current_version=<html>Convertir automatiquement les cartes des versions ant\u00E9rieures <br> de Freeplane \u00E0 la version courante ?</html>
OptionPanel.convert_to_current_version.tooltip=<html>Seulement pour les tr\u00E8s grandes cartes qui n'ont pas besoin d'\u00EAtre converties<br>(seulement si vous savez ce que vous faites) vous pouvez ouvrir les cartes sans conversion.</html>
+OptionPanel.copyFormatToNewSibling=Appliquer la mise en forme aux n\u0153uds fr\u00E8res
+OptionPanel.copyFormatToNewSiblingIncludesIcons=Copier la mise en forme avec les ic\u00F4nes
OptionPanel.cs=Tch\u00E8que
OptionPanel.cut_nodes_without_question=Couper les n\u0153uds sans confirmation
OptionPanel.cut_nodes_without_question.tooltip=Coupe imm\u00E9diatement les n\u0153uds, sans confirmation
@@ -953,6 +1014,7 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>Pour Windows (les s
OptionPanel.default_browser_command_windows_nt=Commande pour le navigateur par d\u00E9faut pour Windows NT
OptionPanel.default_browser_command_windows_nt.tooltip=<html>Pour Windows (les signes "" sont n\u00E9cessaires \u00E0 cause des liens qui contiennent un caract\u00E8re "=" dans leur URL).</html>
OptionPanel.default_charset=Jeu de caract\u00E8res
+OptionPanel.default_save_dir=Dossier par d\u00E9faut des enregistrements
OptionPanel.Defaults=R\u00E9glages par d\u00E9faut
OptionPanel.delete_automatic_saves_at_exit=Supprimer les sauvegardes automatiques en quittant
OptionPanel.delete_automatic_saves_at_exit.tooltip=Si vous souhaitez supprimer les fichiers cr\u00E9\u00E9s automatiquement lorsque Freeplane se termine normalement, cochez cette option.
@@ -984,6 +1046,7 @@ OptionPanel.en=Anglais
OptionPanel.Environment=Environnement
OptionPanel.es=Espagnol
OptionPanel.et=\u00C9thipien
+OptionPanel.eu=Basque
OptionPanel.execute_scripts_without_asking=Activer l'ex\u00E9cution des scripts
OptionPanel.execute_scripts_without_asking.tooltip=ATTENTION : l'ex\u00E9cution de scripts inconnus peut endommager votre ordinateur.
OptionPanel.execute_scripts_without_exec_restriction=Autoriser l'ex\u00E9cution des commandes externes
@@ -1001,6 +1064,7 @@ OptionPanel.export_icons_in_html.tooltip=Indique que l'HTML export\u00E9 doit in
OptionPanel.exported_image_resolution_dpi=R\u00E9solution de l'image export\u00E9e (en DPI)
OptionPanel.Files=Fichiers
OptionPanel.first=En haut
+OptionPanel.fit_to_viewport=Ajuster l'image de fond \u00E0 la taille de la fen\u00EAtre
OptionPanel.fold_on_click_inside=Cliquer sur un n\u0153ud plie ou d\u00E9plie la branche
OptionPanel.foldingsymbolwidth=Taille du symbole de pliage
OptionPanel.foldingsymbolwidth.tooltip=Taille du cercle indiquant une branche pli\u00E9e
@@ -1013,6 +1077,9 @@ OptionPanel.fr=Fran\u00E7ais
OptionPanel.gl=Gl
OptionPanel.goto_note_end_on_edit=Placer le curseur en fin de note
OptionPanel.grid_size=Pas pour la grille d'alignement des n\u0153uds (1 = aucune grille)
+OptionPanel.groovy_editor_font=Police identifiant la syntaxe Groovy
+OptionPanel.groovy_editor_font.tooltip=S\u00E9lectionnez les polices 'Dialog' ou 'Monospace' si vous souhaitez utiliser des caract\u00E8res unicode !
+OptionPanel.groovy_editor_font_size=Taille de police pour la syntaxe Groovy
OptionPanel.gtk=Gtk
OptionPanel.hide_edge=Invisible
OptionPanel.highlight_formulas=Entourer les formules
@@ -1036,8 +1103,10 @@ OptionPanel.id=Indon\u00E9sien
OptionPanel.IGNORE=Ne rien faire
OptionPanel.il__enter_confirms_by_default=La touche "Entr\u00E9e" valide le n\u0153ud
OptionPanel.image_cache=Pour les images
+OptionPanel.indentationUsesTabsInTextOutput=Utiliser les tabulations dans les zones de saisie
OptionPanel.it=Italien
OptionPanel.ja=Japonais
+OptionPanel.JoinNodesAction.textSeparators=S\u00E9parateur de texte
OptionPanel.key_type_action=Saisie clavier hors d'un n\u0153ud
OptionPanel.Keystrokes=Raccourcis clavier
OptionPanel.ko=Cor\u00E9en
@@ -1047,7 +1116,12 @@ OptionPanel.language=Langue de l'utilisateur
OptionPanel.language.tooltip=<html>Langue de l'application.<br>La valeur 'automatique' d\u00E9tecte et utilise la langue du syst\u00E8me.
OptionPanel.last=En bas
OptionPanel.last_opened_list_length=Nombre de fichiers dans la liste des fichiers r\u00E9cents
+OptionPanel.latex_disable_editor=D\u00E9sactiver la mise en valeur de la syntaxe LaTeX
OptionPanel.latex_disable_editor.tooltip=Cochez cette case si vous avez des difficult\u00E9s avec l'\u00E9diteur LaTeX
+OptionPanel.latex_editor_font=Police identifiant la syntaxe LaTeX
+OptionPanel.latex_editor_font.tooltip=S\u00E9lectionnez les polices 'Dialog' ou 'Monospace' si vous souhaitez utiliser des caract\u00E8res unicode !
+OptionPanel.latex_editor_font_size=Taille de police pour la syntaxe LaTeX
+OptionPanel.latex_macros=Macros LaTeX communes
OptionPanel.layout_map_on_text_change=Rafra\u00EEchir la position des n\u0153uds pendant la saisie
OptionPanel.layout_map_on_text_change.tooltip=Sur un ordinaiteur peu performant, il est recommand\u00E9 de d\u00E9sactiver cette option
OptionPanel.linear=Droit
@@ -1072,6 +1146,7 @@ OptionPanel.max_shortened_text_length=Largeur utilis\u00E9e pour r\u00E9sumer le
OptionPanel.metal=M\u00E9tal
OptionPanel.min_node_width=Largeur minimale des n\u0153uds
OptionPanel.motif=Motif
+OptionPanel.narrow_hexagon=Hexagone ajust\u00E9
OptionPanel.nb=Norv\u00E9gien
OptionPanel.never_save_folding=Jamais
OptionPanel.nl=N\u00E9erlandais
@@ -1089,8 +1164,7 @@ OptionPanel.nodeformat=Format
OptionPanel.nodeformat.tooltip=<html>Formule de conversion du texte du n\u0153ud.<tt>%s</tt> repr\u00E9sente le texte initial. <ul><li>Exemple de formule : <tt>Urgence %s</tt> <li>Pour les nombres et les dates, voir les exemples dans la liste.<ul>La liste propos\u00E9e provient du fichier <b>formats.xml</b> du dossier utilisateur.
OptionPanel.nodenumbering=Num\u00E9rotation
OptionPanel.nodenumbering.tooltip=Ajoute un num\u00E9ro d'ordre en d\u00E9but de n\u0153ud
-OptionPanel.nodeshape=Forme du n\u0153ud
-OptionPanel.nodeshape.tooltip=<html>D\u00E9finit la forme ext\u00E9rieure du n\u0153ud.<br><table border="1"><tr><td>Fourche</td><td>sans contour</td></tr><tr><td>Bulle</td><td>entour\u00E9 d'un rectangle</td></tr><tr><td>Comme le p\u00E8re</td><td>style du n\u0153ud p\u00E8re</td></tr><tr><td>Mixte</td><td>fourche si le n\u0153ud est d\u00E9pli\u00E9,<br>bulle si le n\u0153ud est pli\u00E9</td></tr></table></html>
+OptionPanel.nodeshape=Forme de n\u0153ud
OptionPanel.nodetext=Texte du n\u0153ud
OptionPanel.nodetext.tooltip=Vous pouvez ici d\u00E9finir le texte du n\u0153ud. Le texte pr\u00E9c\u00E9dent est supprim\u00E9 lorsqu'un tel mod\u00E8le est appliqu\u00E9.
OptionPanel.nothing=Rien
@@ -1106,9 +1180,14 @@ OptionPanel.org.freeplane.plugin.bugreport.denied=Ne jamais envoyer
OptionPanel.org.freeplane.plugin.bugreport.userid=Identifiant \u00E0 ajouter au rapport (optionnel)
OptionPanel.outline_hgap=Distance horizontale
OptionPanel.outline_vgap=Distance verticale
+OptionPanel.oval=Ovale
OptionPanel.paint_connectors_behind=Passer les connecteurs sous les noeuds
OptionPanel.parse_data=D\u00E9tecter la saisie de nombres et de dates
OptionPanel.parse_data.tooltip=<html>D\u00E9tecter les nombres et dates et les formater automatiquement.<br>Exemples : 1 002,33 ou 31/12 ou 31/12/99 ou 31-12-1999 ou 31-12-1999 23:59
+OptionPanel.parse_formulas=Identifier les formules
+OptionPanel.parse_formulas.tooltip=Les formules d\u00E9butent par le caract\u00E8re '='. Voir http://www.freeplane.org/wiki/index.php/Formulas.
+OptionPanel.parse_latex=Reconna\u00EEtre LaTeX
+OptionPanel.parse_latex.tooltip=Reconna\u00EEtre les formules LaTeX gr\u00E2ce \u00E0 un pr\u00E9fixe ou un format, voir http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane.
OptionPanel.PASTE_HTML=Coller avec mise en forme
OptionPanel.PASTE_PLAIN_TEXT=Coller comme texte brut
OptionPanel.path_property_may_not_be_empty=Le dossier ne peut \u00EAtre vide ! R\u00E9tablissement des anciennes valeurs.
@@ -1126,9 +1205,13 @@ OptionPanel.printonwhitebackground.tooltip=Toujours utiliser un fond blanc \u00E
OptionPanel.pt_BR=Portugais (du Br\u00E9sil)
OptionPanel.pt_PT=Portugais (du Portugal)
OptionPanel.RECT=Rectangle
+OptionPanel.rectangle=Rectangle
OptionPanel.relative=Relatif
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"Demander" vous permettra de choisir.<br>"Oui" affiche l'\u00E9diteur de texte riche.<br>"Non" affiche l'\u00E9diteur de texte brut.</html>
OptionPanel.remind_use_rich_text_in_new_nodes=Coller les n\u0153uds en texte riche
+OptionPanel.remindersBlink=Clignotement des rappels
+OptionPanel.remindersShowNotifications=Fen\u00EAtre de notification lors des rappels
+OptionPanel.remindersStandardDelay=D\u00E9lai d'alerte
OptionPanel.remove_notes_without_question=Supprimer les notes sans confirmation
OptionPanel.remove_notes_without_question.tooltip=Supprime imm\u00E9diatement les notes, sans confirmation
OptionPanel.resources_use_default_font_for_notes_too=Utiliser cette police dans les notes
@@ -1139,16 +1222,19 @@ OptionPanel.ROUND_RECT=Rectangle arrondi
OptionPanel.ru=Russe
OptionPanel.save_folding=Enregistrer l'\u00E9tat du pliage
OptionPanel.save_folding_if_map_is_changed=Si la carte est modifi\u00E9e
+OptionPanel.save_last_visited_node=M\u00E9moriser la derni\u00E8re position dans la carte
OptionPanel.save_modification_times=Enregistrer les heures de modification
OptionPanel.script_classpath=Classpath pour les Scripts : Dossiers contenant les classes ou les fichiers JAR (sous Windows s\u00E9parateur ;)
OptionPanel.script_classpath.tooltip=<html>S\u00E9parateur ; (pour Windows) ou : (pour Linux et Mac).<br>Les chemins sont soit absolus, soit relatifs au dossier utilisateur Freeplane.<br>V\u00E9rifiez l'acc\u00E8s en lecture \u00E0 ces dossiers.
OptionPanel.script_compilation_disabled_extensions=Extensions des fichiers ne devant pas \u00EAtre compil\u00E9s (cf l'infobulle)
+OptionPanel.script_compilation_disabled_extensions.tooltip=<html>Si les scripts d'un langage install\u00E9 (\u00E0 l'exception de Groovy et de Javascript) causent un probl\u00E8me de compilation, <br>essayez d'ajouter l'extension de fichier ici (s\u00E9parez les valeurs par des virgules).</html>
OptionPanel.script_directories=Dossiers contenant les scripts (sous Windows s\u00E9parateur ;)
OptionPanel.script_directories.tooltip=<html>Liste de dossiers (s'ajoutant aux "scripts").<br>S\u00E9parez les dossiers par ; (sous Windows) ou : (sous Linux et Mac).<br>Les chemins qui ne sont pas absolus seront consid\u00E9r\u00E9s comme relatifs au dossier utilisateur de Freeplane.<br></html>
OptionPanel.script_user_key_name_for_signing=Alias de la clef utilisateur pour signer
OptionPanel.script_user_key_name_for_signing.tooltip=<html>Si vous d\u00E9sirez signer vos scripts, entrez l'alias de la cl\u00E9 ici. <br>La cl\u00E9 doit se trouver dans le trousseau par d\u00E9faut. <br>Le mot de passe de la cl\u00E9 priv\u00E9e doit correspondre au mot de passe du trousseau.</html>
OptionPanel.scrollbar_increment=Vitesse
OptionPanel.scrolling_speed=Vitesse de centrage automatique (de 1 \u00E0 30)
+OptionPanel.scrollOnUnfold=Centrer la carte lors du d\u00E9pliage
OptionPanel.selection_method=S\u00E9lection de noeud
OptionPanel.selection_method.tooltip=D\u00E9finit la mani\u00E8re de s\u00E9lectionner les n\u0153uds.
OptionPanel.selection_method_by_click=Au clic
@@ -1182,6 +1268,7 @@ OptionPanel.separator.icon_properties=Ic\u00F4nes
OptionPanel.separator.icons=Ic\u00F4nes dans le menu "Ic\u00F4nes"
OptionPanel.separator.initial_map_size=Taille initiale de la carte
OptionPanel.separator.inline_editor=\u00C9dition de n\u0153ud dans la carte
+OptionPanel.separator.JoinNodesAction=Fusionner les noeuds
OptionPanel.separator.key_typing=Saisie clavier
OptionPanel.separator.language=Langue
OptionPanel.separator.latex=LaTeX
@@ -1202,6 +1289,7 @@ OptionPanel.separator.other_defaults=Autres r\u00E9glages par d\u00E9faut
OptionPanel.separator.others=Autres raccourcis clavier
OptionPanel.separator.outline_view=Vue plan
OptionPanel.separator.patterns=Mod\u00E8les
+OptionPanel.separator.reminderOptions=Options pour les rappels
OptionPanel.separator.RichTextEditor=\u00C9diteur de texte riche
OptionPanel.separator.root_node_appearance=Apparence du n\u0153ud racine
OptionPanel.separator.save=Enregistrement
@@ -1213,6 +1301,7 @@ OptionPanel.separator.selection_method=M\u00E9thode de s\u00E9lection
OptionPanel.separator.single_instance_mode=Gestion des instances d'ex\u00E9cution du programme
OptionPanel.separator.size_limits=Tailles maximales
OptionPanel.separator.spelling=Correcteur orthographique
+OptionPanel.separator.SplitToWordsAction=Diviser le n\u0153ud par mot
OptionPanel.separator.status=Barre d'\u00E9tat
OptionPanel.separator.tooltip=Info-bulles
OptionPanel.separator.undo=Annulation
@@ -1221,9 +1310,13 @@ OptionPanel.set_property_text=Personnalis\u00E9
OptionPanel.set_property_text.tooltip=D\u00E9cochez : supprime la mise en forme personnalis\u00E9e et r\u00E9tablit le style appliqu\u00E9 au n\u0153ud
OptionPanel.setscript=Ex\u00E9cuter
OptionPanel.setscript.tooltip=Un script peut \u00EAtre associ\u00E9 au mod\u00E8le.
+OptionPanel.shape_horizontal_margin=Marge horizontale
+OptionPanel.shape_vertical_margin=Marge verticale
OptionPanel.sharp_bezier=Courbe effil\u00E9
OptionPanel.sharp_linear=Droit effil\u00E9
+OptionPanel.shouldCenterSmallMaps=Centrer les cartes de petite taille
OptionPanel.show_icon_for_attributes=Afficher les ic\u00F4nes des attributs
+OptionPanel.show_less_than_N_nodes_by_default_after_load=Charger depuis la carte ou d\u00E9plier quelques n\u0153uds
OptionPanel.show_node_tooltips=Afficher les info-bulles sur les n\u0153uds
OptionPanel.show_note_icons=Afficher les ic\u00F4nes de Notes
OptionPanel.show_styles_in_tooltip=Afficher le style en info-bulle
@@ -1240,14 +1333,21 @@ OptionPanel.single_instance_force.tooltip=Toujours utiliser une seule instance d
OptionPanel.sk=Slovaque
OptionPanel.sl=Slov\u00E8ne
OptionPanel.slow_scroll_selected_node=D\u00E9filement doux jusqu'au n\u0153ud s\u00E9lectionn\u00E9
+OptionPanel.small_bubble=Petite bulle
+OptionPanel.small_wide_hexagon=Petit hexagone
OptionPanel.spelling_opt_case_sensitive=Sensible \u00E0 la casse
OptionPanel.spelling_opt_ignore_all_caps_words=Ignorer les mots en majuscule
OptionPanel.spelling_opt_ignore_capitalization=Ignorer les mots d\u00E9butant par une majuscule
OptionPanel.spelling_opt_ignore_words_with_numbers=Ignorer les mots contenant des nombres
OptionPanel.spelling_opt_suggestions_limit_dialog=Nombre de suggestions dans la fen\u00EAtre
OptionPanel.spelling_opt_suggestions_limit_menu=Nombre de suggestions dans le menu
+OptionPanel.SplitToWordsAction.auxiliaryWordList=Liste de mots auxiliaires
+OptionPanel.SplitToWordsAction.charactersAcceptedInWord=caract\u00E8res int\u00E9gr\u00E9s aux mots
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=Laisser le n\u0153ud d'origine vide
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=num\u00E9ro du n\u0153ud dans l'enregistrement
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=Enregistrer le n\u0153ud d'origine comme d\u00E9tail
OptionPanel.sr=Serbe / \u0441\u0440\u043F\u0441\u043A\u0438
-OptionPanel.standard_template=Mod\u00E8le de carte par d\u00E9faut
+OptionPanel.standard_template=Mod\u00E8le de carte par d\u00E9faut (choisissez une valeur ou entrez le chemin)
OptionPanel.standardbackgroundcolor=Couleur de fond
OptionPanel.standardbackgroundcolor.tooltip=Couleur par d\u00E9faut du fond
OptionPanel.standardcloudcolor=Couleur de nuage
@@ -1265,19 +1365,23 @@ OptionPanel.standardselectednodecolor.tooltip=Couleur des n\u0153uds s\u00E9lect
OptionPanel.standardselectednoderectanglecolor=Couleur du rectangle de s\u00E9lection
OptionPanel.standardselectednoderectanglecolor.tooltip=Couleur du rectangle entourant les n\u0153uds s\u00E9lectionn\u00E9s
OptionPanel.STAR=Etoile
+OptionPanel.statesymbolwidth=Taille du symbole d'\u00E9tat
OptionPanel.structured_html_import=Import HTML comme structure de n\u0153uds
OptionPanel.structured_icon_toolbar=Organiser la barre d'ic\u00F4nes
OptionPanel.summary=Synth\u00E8se
OptionPanel.sv=Su\u00E9dois
OptionPanel.text.use_ctrl_key=Pour d\u00E9finir un raccourci clavier, utilisez la commande "Cr\u00E9er un nouveau raccourci..." disponible dans le menu "Outils".
+OptionPanel.textalignment=Alignement du texte
OptionPanel.time_for_automatic_save=Fr\u00E9quence de sauvegarde automatique (en millisecondes)
OptionPanel.time_for_automatic_save.tooltip=Intervalle entre deux sauvegardes automatiques (en millisecondes). Pour d\u00E9sactiver la sauvegarde automatique, saisir 2 000 000 000.
OptionPanel.time_for_delayed_selection=D\u00E9lai pour la s\u00E9lection
OptionPanel.time_for_delayed_selection.tooltip=<html>D\u00E9lai de s\u00E9lection des n\u0153uds lorsque la souris survole le n\u0153ud (en millisecondes).<br>Saisissez 1 si vous souhaitez une s\u00E9lection rapide.
OptionPanel.toolTipManager.dismissDelay=Dur\u00E9e d'affichage (en millisecondes)
OptionPanel.toolTipManager.initialDelay=D\u00E9lai avant affichage (en millisecondes)
-OptionPanel.toolTipManager.max_tooltip_width=Largeur des infos-bulles
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=Largeur par d\u00E9faut des infos-bulles (en pixels)
+OptionPanel.toolTipManager.max_tooltip_height=Hauteur maximale des infobulles
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=Hauteur maximale des infobulles en pixels.
+OptionPanel.toolTipManager.max_tooltip_width=Largeur maximale des infos-bulles
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=Largeur maximale des infos-bulles en pixels.
OptionPanel.toolTipManager.reshowDelay=D\u00E9lai de r\u00E9affichage (en millisecondes)
OptionPanel.tr=Turque
OptionPanel.uk_UA=Ukrainien
@@ -1286,6 +1390,7 @@ OptionPanel.undo_levels=Nombre d'actions m\u00E9moris\u00E9es
OptionPanel.undo_levels.tooltip=D\u00E9fini combien d'actions utilisateur sont m\u00E9moris\u00E9es et peuvent \u00EAtre annul\u00E9es
OptionPanel.unfold_on_paste=D\u00E9plier le n\u0153ud sur copier/coller
OptionPanel.unfold_on_paste.tooltip=D\u00E9plier le n\u0153ud sur copier/coller et glisser/d\u00E9poser
+OptionPanel.uniform_shape=Uniforme
OptionPanel.use_common_out_point_for_root_node=Les lignes partent d'un point du n\u0153ud racine
OptionPanel.use_common_out_point_for_root_node.tooltip=Les lignes partent d'un point du n\u0153ud racine
OptionPanel.use_tabbed_pane=Utiliser les onglets
@@ -1298,9 +1403,12 @@ OptionPanel.validate_invalid_number_format=Le format de nombre n'est pas valide
OptionPanel.validate_write_without_read=Script : pensez \u00E0 ajouter le droit de lecture / \u00E9criture sur les fichiers
OptionPanel.validation_error=<html>Erreur : <p><em>{0}</em>.<p>Merci de modifier les pr\u00E9f\u00E9rences.
OptionPanel.validation_warning=<html>Avertissement : <p><em>{0}
+OptionPanel.vertical_child_gap=Espacement avec le fils
+OptionPanel.vertical_child_gap.tooltip=Espacement vertical entre fils
OptionPanel.vi=Vietnamien
OptionPanel.wheel_velocity=Vitesse
OptionPanel.wheel_velocity.tooltip=Une valeur plus grande donne des effets de mouvements plus rapides sur la carte.
+OptionPanel.wide_hexagon=Grand hexagone
OptionPanel.windows=Fen\u00EAtre
OptionPanel.zh_CN=Chinois (simplifi\u00E9)
OptionPanel.zh_TW=Chinois (Mandarin)
@@ -1393,6 +1501,7 @@ PrintAction.text=Imprimer...
PrintDirectAction.text=Imprimer
printing_settings=Mise en page de l'impression
PrintPreviewAction.text=Aper\u00E7u avant impression...
+progress=Avancement
PropertyAction.dialog=Pr\u00E9f\u00E9rences utilisateur
PropertyAction.text=Pr\u00E9f\u00E9rences...
QuickFilterAction.text=Afficher uniquement les r\u00E9sultats
@@ -1416,8 +1525,11 @@ RedoFilterAction.text=Filtre suivant
regular_expressions=Expressions r\u00E9guli\u00E8res
ReminderHookAction.text=Supprimer l'alerte
ReminderHookAction.tooltip=Supprime l'alerte d'un n\u0153ud
+reminderNotification=Notification pour les rappels
remove_file_from_list_on_error=Le fichier {0} est introuvable ! Souhaitez-vous le retirer de la liste des fichiers r\u00E9cents ?
remove_shortcut_question=Remplacer le raccourci ?
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=R\u00E9-initialiser les n\u0153uds d\u00E9pli\u00E9s
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=Permettre le pliage pour tous les n\u0153uds
RemoveAllIconsAction.text=Supprimer toutes les ic\u00F4nes
RemoveConnectorAction.text=Supprimer le connecteur
RemoveEncryption.text=Supprimer la protection
@@ -1438,14 +1550,19 @@ reset_to_default=Par d\u00E9faut
ResetNodeLocationAction.text=Restaurer la position du n\u0153ud
ResetStyleAction.text=Effacer le style du n\u0153ud
RevertAction.text=Restaurer le dernier enregistrement
-RevisionPluginAction.text=Indiquer les n\u0153uds r\u00E9vis\u00E9s
+RevisionPluginAction.text=Modifier la couleur d'arri\u00E8re-plan des n\u0153uds r\u00E9vis\u00E9s
+save=Enregistrer sous...
save_failed=L''enregistrement de la carte {0} a \u00E9chou\u00E9.
-save_unsaved=Souhaitez-vous enregistrer la carte ?
+save_unsaved=Souhaitez-vous enregistrer la carte suivante ?
save_unsaved_styles=Enregistrer les styles ?
SaveAcceleratorPresetsAction.text=Enregistrer les touches de fonction...
SaveAction.text=Enregistrer
+SaveAction_readonlyMsg=Cette carte est en lecture seule. Pour la modifier, enregistrez la depuis 'Fichier -> Enregistrer sous ...'.
+SaveAction_readonlyTitle=Enregistrement de carte en lecture seule
SaveAll.text=Enregistrer tout
SaveAll.tooltip=Enregistre toutes les cartes ouvertes
+SaveAs_toReadonlyMsg={0} est en lecture seule. Merci de l''enregistrer sous un autre nom de fichier.
+SaveAs_toReadonlyTitle=Enregistrement de fichier en lecture seule
SaveAsAction.text=Enregistrer sous...
saved=Carte enregistr\u00E9e
saving_canceled=Enregistrement annul\u00E9
@@ -1455,11 +1572,15 @@ script_execution_disabled=L'ex\u00E9cution des scripts est d\u00E9sactiv\u00E9e
ScriptEditor.text=\u00C9diteur de scripts...
ScriptEditor.tooltip=Permet d'\u00E9crire de longs scripts dans Freeplane
ScriptEditorPanel.changed_cancel=Les scripts ont \u00E9t\u00E9 modif\u00E9s. Voulez-vous ignorer ces modifications ?
+scripting=Scripts
scripting_api_generator_legend=L\u00E9gende
scripting_api_generator_proxy=Proxy
scripting_api_generator_title=Aide pour les d\u00E9veloppeurs
scripting_api_generator_utilities=Outils
scripting_api_generator_web=Ressources Internet
+ScriptsRunToggleAction.ON_SELECTED_NODE.text=Ex\u00E9cuter les scripts sur tous les n\u0153uds s\u00E9lectionn\u00E9s
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=Ex\u00E9cuter les scripts sur tous les n\u0153uds s\u00E9lectionn\u00E9s et leurs fils
+ScriptsRunToggleAction.ON_SINGLE_NODE.text=Ex\u00E9cuter les scripts sur le n\u0153ud s\u00E9lectionn\u00E9
select_favorites_folder=S\u00E9lectionnez le dossier de stockage de vos favoris
select_file_export_to=Choisir le fichier vers lequel exporter
select_folder_for_importing=S\u00E9lectionnez le dossier d'importation
@@ -1478,6 +1599,8 @@ set_accelerator_on_next_click_action=Pour cr\u00E9er un nouveau raccourci :\ns\u
SetAccelerator.dialogTitle=Raccourcis clavier
SetAccelerator.keystrokeDetected=La s\u00E9quence de raccourci "{0}" n''est associ\u00E9e \u00E0 aucune commande.
SetAcceleratorOnNextClickAction.text=Cr\u00E9er un nouveau raccourci...
+SetAlwaysUnfoldedNodeFlagsAction.text=Conserver les n\u0153uds d\u00E9pli\u00E9s
+SetAlwaysUnfoldedNodeFlagsAction.tooltip=Ne pas plier les n\u0153uds actuellement d\u00E9pli\u00E9s
SetImageByFileChooserAction.text=N\u0153ud image (choisir un fichier ou saisir un lien)...
SetLinkAnchorAction.text=M\u00E9moriser le n\u0153ud
SetLinkAnchorAction.tooltip=M\u00E9morise le n\u0153ud courant pour la cr\u00E9ation de lien
@@ -1493,7 +1616,7 @@ SetShortenerStateAction.text=R\u00E9sumer le n\u0153ud
sf_login_required=Voulez-vous continuer ? (compte SourceForge requis)
ShowAllAttributesAction.text=Afficher tous les attributs
ShowAncestorsAction.text=Afficher les p\u00E8res des n\u0153uds filtr\u00E9s
-ShowAttributeDialogAction.text=Gestionnaire d'&attributs...
+ShowAttributeDialogAction.text=Gestionnaire d'attributs...
ShowDescendantsAction.text=Afficher les fils des n\u0153uds filtr\u00E9s
ShowFilterToolbarAction.text=Barre de filtres
ShowFormatPanel.text=Panneau de propri\u00E9t\u00E9s
@@ -1684,10 +1807,11 @@ simplyhtml.wholeWordsOnly=Mots entiers
simplyhtml.wholeWordsOnly.tooltip=Rechercher uniquement les mots entiers
SortNodes.text=Trier les fils
SortNodes.tooltip=Trie par ordre alphab\u00E9tique tous les fils d'un n\u0153ud
-split=Diviser
+split=&Diviser
SplitConditionAction.text=Dupliquer sans n\u00E9gation
SplitNode.text=Diviser le n\u0153ud
SplitNode.tooltip=Divise le n\u0153ud en plusieurs n\u0153uds de m\u00EAme niveau, chaque ligne devient un n\u0153ud
+SplitToWordsAction.text=Diviser en {0} mots par ligne
STANDARD_FORMAT=Standard
stop_processing=Ne pas \u00E9valuer les styles suivants
StringFlavorHandler=Coller en texte brut en conservant la hi\u00E9rarchie
@@ -1720,27 +1844,39 @@ styles.subtopic=Sous-titre
styles.topic=Titre
styles.user-defined=Styles utilisateur
styles.website=Site web
+styles_background_html=\n <html>\n <head>\n </head>\n <body>\n <table width="800" style="text-align: left; vertical-align: top">\n <tr valign="top">\n <th>\n <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold">\n A propos de ces styles\n </div>\n <div style="text-align: left; font-weight: normal">\n <div style="margin: 3pt">\n Ces styles sont le fruit de plus d'une dizaine d'ann\u00E9es de recherche en p\u00E9dagogi [...]
styles_menu=Styles
submenu_keystroke_in_use_error=Le raccourci {0} ne peut pas \u00EAtre utilis\u00E9 pour le sous-menu {1}. Le raccourci a \u00E9t\u00E9 supprim\u00E9.
summary_nodes=N\u0153ud de synth\u00E8se
summary_not_possible=Impossible de cr\u00E9er une synth\u00E8se pour le(s) n\u0153ud(s) s\u00E9lectionn\u00E9s
-SummaryNodeAction.text=Fin de synth\u00E8se
svg=*.svg
template_dir=Mod\u00E8les
+TextAlignAction.CENTER.text=Centrer le texte
+TextAlignAction.DEFAULT.text=Par d\u00E9faut
+TextAlignAction.LEFT.text=Texte align\u00E9 \u00E0 gauche
+TextAlignAction.RIGHT.text=Texte align\u00E9 \u00E0 droite
+textalignment=Alignement du texte
TimeListAction.text=Afficher la liste des alertes...
TimeListAction.tooltip=Montre toutes les alertes horaire ainsi que les n\u0153uds associ\u00E9s.
TimeManagementAction.text=Afficher le calendrier...
TimeManagementAction.tooltip=Affiche le calendrier
+TimePeriodUnits.days=jours
+TimePeriodUnits.hours=heures
+TimePeriodUnits.minutes=minutes
+TimePeriodUnits.ms=ms
+TimePeriodUnits.seconds=secondes
+TimePeriodUnits.weeks=semaines
ToggleChildrenFoldedAction.text=Plier/D\u00E9plier la branche
ToggleDetailsAction.text=Afficher les d\u00E9tails
ToggleFBarAction.text=Barre des touches de fonction
ToggleFoldedAction.text=Plier/D\u00E9plier le n\u0153ud
ToggleFullScreenAction.text=Plein \u00E9cran
-ToggleLeftToolbarAction.text=Barre d'&ic\u00F4nes
+ToggleLeftToolbarAction.text=Barre d'ic\u00F4nes
ToggleMenubarAction.text=Barre de menus
ToggleScrollbarsAction.text=Barres de d\u00E9filement
ToggleStatusAction.text=Barre d'\u00E9tat
ToggleToolbarAction.text=Barre d'outils principale
+toolbars=Barres d'outils
undefined_error=Une erreur impr\u00E9vue vient de se produire. Merci de bien vouloir signaler le bogue.
underline=Soulign\u00E9
UnderlineAction.text=Soulign\u00E9
@@ -1752,6 +1888,7 @@ UnfoldAllAction.text=Tout d\u00E9plier
UnfoldAllAction.tooltip=D\u00E9plie les n\u0153uds s\u00E9lectionn\u00E9s ainsi que leurs fils
UnfoldOneLevelAction.text=D\u00E9plier un niveau
UnfoldOneLevelAction.tooltip=D\u00E9plie un niveau des n\u0153uds s\u00E9lectionn\u00E9s
+unparsedLatexPatternFormat=LaTeX non pars\u00E9
up=Monter
UpConditionAction.text=Monter
update_failed=La mise \u00E0 jour a \u00E9chou\u00E9. D\u00E9tail de l''erreur : {0}
@@ -1777,11 +1914,14 @@ user_defined_zoom_status_bar=Niveau de zoom : {0}%
user_icon=Icone utilisateur "{0}"
user_template_dir=Mod\u00E8les utilisateur
user_zoom=Zoom pour l'impression (0.0 - 2.0) :
+userScripts=Scripts
value_format=Format de la valeur
version_up_to_date=Vous utilisez la derni\u00E8re version de Freeplane.
-ViewerControllerAction.text=Objet...
+view=&Affichage
ViewLayoutTypeAction.OUTLINE.text=Vue plan
+web_resources=Ressources web
WebDocuAction.text=Documentation Web
+WhatsNewAction.text=Nouveaut\u00E9s Freeplane 1.5.x
width=Largeur
wrong_regexp=L''expression "{0}" est incorrecte, erreur : "{1}"
xslt_export.html=HTML
@@ -1794,5 +1934,6 @@ xslt_export.ms_word=Microsoft Excel 2003 et au-del\u00E0 (format XML)
xslt_export.text=Texte brut
xslt_export_not_possible=Export XSLT impossible
yes=Oui
+zoom=Zoom
ZoomInAction.text=Augmenter le zoom
ZoomOutAction.text=R\u00E9duire le zoom
diff --git a/freeplane/resources/translations/Resources_gl.properties b/freeplane/resources/translations/Resources_gl.properties
index cf74d7a..13644e0 100644
--- a/freeplane/resources/translations/Resources_gl.properties
+++ b/freeplane/resources/translations/Resources_gl.properties
@@ -152,12 +152,12 @@ ExportToImage.jpg.text=Como JPEG...
ExportToImage.png.text=Como PNG...
ExportToOoWriter.tooltip=Os nodos despregados forman a estrutura e os pregados o contido do documento.
extension_menu=Estilo f\u00EDsico
+extras=Ferramentas
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=FAQ
file=Ficheiro
file_already_exists=O ficheiro {0} xa existe. Desexa sobrescribilo?
file_not_found=Non se atopou o Ficheiro {0}
-filter=Filtro
filter_and=E
filter_conditions=Filtros
filter_contains=Cont\u00E9n
@@ -191,6 +191,7 @@ FollowLinkAction.text=Abrir a hiperligaz\u00F3n:
font=Tipo de letra
FontFamilyAction.text=Familia de tipo de letra
FontSizeAction.text=Tama\u00F1o do tipo de letra
+format=Formato
format_menu_edge_styles=Estilo dos arcos
format_menu_edge_widths=Largura dos arcos
FormatCopy.text=Copiar o fomato
@@ -306,7 +307,6 @@ increase_branch_font_size=Tipo de letra maior
IncreaseNodeFontAction.text=Tipo de letra maior
ItalicAction.text=Cursiva
italicise_branch=Por en cursiva
-JoinNodesAction.text=Unir nodos
less_than_two_selected_nodes=Debe seleccionar polo menos dous nodos para obter ligaz\u00F3ns.
link_not_available_any_more=Esta ligaz\u00F3n xa non \u00E9 v\u00E1lida. Borrouse o nodo.
link_not_found=Non se atopou a ligaz\u00F3n {0}.
@@ -322,12 +322,7 @@ map_locked_by_open=O mapa {0} est\u00E1 a ser editado polo usuario {1}. Abrir co
map_locked_by_save_as=O mapa {0} est\u00E1 a ser editado polo usuario {1}. Interrompeuse a acci\u00F3n Gardar como.
MapBackgroundColorAction.text=Map Background[translate me]
menu_attributes=Atributos
-menu_extras=Ferramentas
-menu_file_import=Importar
-menu_format=Formato
menu_insert=Inserir
-menu_navigate=Navegar
-menu_view=Ver
mindmap=Mapa
mindmaps=Mapas
mindmaps_desc=Mapas (*.mm)
@@ -342,6 +337,7 @@ ModesMenuAction.File.text=File Explorer[translate me]
ModesMenuAction.MindMap.text=Mind Map Editor[translate me]
most_recent_files=Ficheiros m\u00E1is recentes
MoveToRootAction.text=Ir \u00E1 ra\u00EDz
+navigate=Navegar
NavigationNextMapAction.text=Seguinte mapa
NavigationPreviousMapAction.text=Mapa anterior
new_mindmap=Novo mapa mental
@@ -481,8 +477,6 @@ OptionPanel.nodefontbold=Fonte en negra
OptionPanel.nodefontitalic=Fonte en cursiva
OptionPanel.nodefontname=Fonte do nodo
OptionPanel.nodefontsize=Fonte do nodo
-OptionPanel.nodeshape=Estilo do nodo
-OptionPanel.nodeshape.tooltip=nodeshape.tooltip
OptionPanel.nodetext=Texto do nodo
OptionPanel.nodetext.tooltip=nodetext.tooltip
OptionPanel.nothing=Nada
@@ -821,7 +815,7 @@ simplyhtml.valignMiddle=medio
simplyhtml.wholeWordsOnly=S\u00F3 palabras enteiras
SortNodes.text=Ordenar fillos
SortNodes.tooltip=Ordena todos os fillos dun nodo alfabeticamente.
-split=Dividir
+split=&Dividir
SplitNode.text=Dividir nodo
SplitNode.tooltip=<html>O nodo div\u00EDdese</html>
style=Estilo
@@ -851,6 +845,7 @@ UsePlainTextAction.text=Usar texto plano
user_defined_zoom=Definido polo usuario.
user_defined_zoom_status_bar=Modificar o zoom ao valor de zoom de {0}% definido polo usuario.
user_zoom=Factor de zoom da copia impresa (0.0 - 2.0):
+view=Ver
WebDocuAction.text=Documentaci\u00F3n web
width=Largura
yes=Si
diff --git a/freeplane/resources/translations/Resources_hr.properties b/freeplane/resources/translations/Resources_hr.properties
index 09cad69..cd24818 100644
--- a/freeplane/resources/translations/Resources_hr.properties
+++ b/freeplane/resources/translations/Resources_hr.properties
@@ -35,6 +35,7 @@ actual_node_styles=Uvjetovani stilovi \u010Dvora primjenjeni na \u010Dvoru
add=&Dodaj
AddConnectorAction.text=Dodaj poveznik
AddElementaryConditionAction.text=Dodaj
+AddExecutionLinkAction.text=Dodaj hipervezu na izvr\u0161enje OS naredbe ...
AddLocalLinkAction.text=Dodaj internu vezu izme\u0111u \u010Dvorova
AddMenuItemLinkAction.text=Dodaj hiperlink stavci izbornika...
AddOnDetailsPanel.authored.by=Autor {0}
@@ -82,20 +83,21 @@ antialias_all=Zagla\u0111ivanje svega
antialias_edges=Zagla\u0111ivanje rubova
antialias_none=Bez zagla\u0111ivanja
apply=&Primijeni
-ApplyAction.text=&Primijeni
-ApplyFormatPlugin.text=Promijeni &oblik \u010Dvora...
+ApplyAction.text=Primijeni
+ApplyFormatPlugin.text=Promijeni oblik \u010Dvora...
ApplyFormatPlugin.tooltip=Prikazuje dijalog u kojem osobine \u010Dvora i ruba mogu bit promijenjene odmah.
ApplyNoFilteringAction.text=Bez filtriranja
ApplySelectedViewConditionAction.text=Filtriraj odabrane \u010Dvorove
ApplyToVisibleAction.text=Primijeni na filtriranim \u010Dvorovima
as_parent=kao Roditelj
AskForHelp.text=Upit za pomo\u0107 na forumu
-AssignAttributesAction.text=Do&djeljivanje obilje\u017Eja...
+AssignAttributesAction.text=Dodjeljivanje obilje\u017Eja...
attribute_delete=Obri\u0161i sve vrijednosti
attribute_delete_value=Obri\u0161i ovu vrijednost
attribute_font_size_tooltip=Veli\u010Dina slova obilje\u017Eja
attribute_list_box_label_text=Postoje\u0107e vrijednosti
attribute_name=Naziv obilje\u017Eja
+attribute_name_or_value=Naziv ili iznos obilje\u017Eja
attribute_replace=Zamijeni sa
attribute_top=Sva poznata obilje\u017Eja za u\u010Ditane mape
attribute_value=Vrijednost obilje\u017Eja
@@ -137,14 +139,20 @@ attributes_visible_tooltip=Potvrdi ako \u017Eeli\u0161 da obilje\u017Eje bude vi
automatic_layout=Automatski oblikovani izgled
automatic_layout_disabled=Onemogu\u0107en
automatically_save_message=Mapa je automatski spremljena (koriste\u0107i ime datoteke {0}) ...
+AutomaticEdgeColor.FOR_BRANCHES=za grane
+AutomaticEdgeColor.FOR_COLUMNS=za stupce
+AutomaticEdgeColor.FOR_LEVELS=za razine
+AutomaticEdgeColor.ON_BRANCH_CREATION=kreirano na grani
AutomaticEdgeColorHookAction.text=Automatska boja ruba
AutomaticLayout.ALL=Za sve
+AutomaticLayout.COLUMNS=za stupce
AutomaticLayout.HEADINGS=Za razine
AutomaticLayout.level=Oblik \u010Dvorova {0}. razine
AutomaticLayout.level.root=Oblik korijenskog \u010Dvora
-AutomaticLayoutAction.text=&Automatski oblikuj izgled
+AutomaticLayoutAction.text=Automatski oblikuj izgled
AutomaticLayoutAction.tooltip=<html>Izmijeni oblik mentalne mape. <br>Prvi stupanj je crni, drugi plavi, itd.</html>
AutomaticLayoutControllerAction.ALL.text=za sve \u010Dvorove
+AutomaticLayoutControllerAction.COLUMNS.text=za stupce
AutomaticLayoutControllerAction.HEADINGS.text=za sve osim krajnje
AutomaticLayoutControllerAction.null.text=onemogu\u0107eno
BackAction.text=Nazad
@@ -161,17 +169,20 @@ branch=Grana
browse=Pregled...
calendar_attributes_panel=Kalendar i Obilje\u017Eja
calendar_panel=Kalendar
+can_not_clone_encrypted_node=Ne mogu klonirati \u0161ifrirane \u010Dvorove
can_not_connect_to_info_server=Ne mogu se spojiti na poslu\u017Eitelj
can_not_delete_predefined_style=Ne mogu obrisati unaprijed postavljeni stil
can_not_delete_root_style=Ne mogu obrisati korijenski stil
can_not_delete_style_group=Ne mogu obrisati grupu stila
+can_not_encrypt_cloned_node=Ne mogu \u0161ifrirati klonirane \u010Dvorove
can_not_save_key_set=Nije mogu\u0107e pohraniti grupu tipkovni\u010Dkih kratica
cancel=&Odustani
-CancelAction.text=&Odustani
+CancelAction.text=Odustani
cannot_add_parent_diff_parents=Svi \u010Dvorovi moraju imati istog Roditelja za kori\u0161tenje ove funkcije.
cannot_add_parent_to_root=Korijenski \u010Dvor nije mogu\u0107e dodati novom Roditelju.
cannot_delete_root=Korijenski \u010Dvor nije mogu\u0107e obrisati ili izrezati.
-cannot_join_nodes_with_children=\u010Cvorove nije mogu\u0107e povezati s Djecom
+cannot_join_nodes_with_children=\u010Cvorove nije mogu\u0107e pridru\u017Eiti s Djecom
+cannot_move_into_child_node=\u010Cvor nije mogu\u0107e pomaknuti u \u010Dvor Dijete
cannot_move_to_child=\u010Cvor nije mogu\u0107e pomaknuti prema \u010Dvoru njegove Djece.
CenterAction.text=Sredina
CenterSelectedNodeAction.text=Odabrani \u010Dvor u centru prikaza
@@ -196,8 +207,10 @@ choose_node_background_color=Izaberite boju pozadine \u010Dvora:
choose_node_color=Izaberite boju teksta \u010Dvora:
ClearLinkAnchorAction.text=Obri\u0161i sidro veze (linka)
ClearLinkAnchorAction.tooltip=<html>obri\u0161i prothodno postavljeno sidro \u010Dvora</html>
+CloneAction.text=Zaljepi klon
close_btn=&Zatvori
-CloseAction.text=&Zatvori
+CloseAction.text=Zatvori
+cloud_shapes=Oblik obla\u010Di\u0107a
CloudAction.text=Obla\u010Di\u0107
CloudColorAction.text=Boja obla\u010Di\u0107a...
CloudShapeAction.ARC.text=Krivulja
@@ -214,13 +227,14 @@ connector_label=Oznaka poveznika
connector_lines=Vrsta crte poveznika
connector_shapes=Oblik poveznika
ConnectorColorAction.text=Boja poveznika...
+ConvertCloneToIndependentNodeAction.text=Ukloni klon
CopyAction.text=Kopiraj
CopyAction.tooltip=Kopiraj odabranu granu
CopyAttributes.text=Kopiraj obilje\u017Eje
CopyIDAction.text=Kopiraj ID \u010Dvora
CopyMapStylesAction.text=Kopiraj stil mape...
CopyNodeURIAction.text=Kopiraj URL (vezu) \u010Dvora
-copyright=Copyright \u00A9 2000-2014 Freeplane tim i ostali
+copyright=Copyright \u00A9 2000-2016 Freeplane tim i ostali
CopySingleAction.text=Kopiraj pojedina\u010Dno
CopySingleAction.tooltip=Kopiraj samo odabrani \u010Dvor
CopyStyleExtensionsAction.text=Umetni stil povezanog sadr\u017Eaja
@@ -228,14 +242,16 @@ corrupt_map=Sadr\u017Eaj mape je korumpiran
CreateConjunctConditionAction.text=I
CreateDisjunctConditionAction.text=Ili
CreateNotSatisfiedConditionAction.text=Ne
-CreationModificationPluginAction.text=Prika\u017Ei &vrijeme promjene
+CreationModificationPluginAction.text=Prika\u017Ei vrijeme promjene
CreationModificationPluginAction.tooltip=<html>Ova funkcija bilje\u017Ei vrijeme stvaranja \u010Dvora i vrijeme promjena \u010Dvora.</html>
current_dir=Mape
CutAction.text=Izre\u017Ei
decrease_branch_font_size=Manja slova
DecreaseNodeFontAction.text=Manja slova
default=Zadano
+defaultAuxiliaryWordList=neki, odre\u0111eni, od
DefaultColorAction.text=Zadana boja
+defaultstyle.attributes=Obilje\u017Eja
defaultstyle.details=Detalji
defaultstyle.floating=Slobodni \u010Dvor
defaultstyle.note=Bilje\u0161ke
@@ -263,7 +279,9 @@ edge=Rub
edge_is_formatted_by_style=Oblik ruba odre\u0111en je u stilu. Uredite svoj oblik ruba ako \u017Eelite.
edge_style=Stil ruba
edge_width=\u0160irina ruba
+edge_widths=\u0160irina ruba
EdgeColorAction.text=Boja ruba...
+EdgeProperties=Svojstva ruba
EdgeStyleAction.bezier.text=Bezier
EdgeStyleAction.bezier.tooltip=<html>Prikazuje rub kao krivulju .</html>
EdgeStyleAction.hide_edge.text=Skriveni rub
@@ -306,7 +324,9 @@ EditScript=Uredi skriptu...
EditStylesAction.text=Uredi stil
EncryptedMap.text=Nova \u0161ifrirana mapa ...
EncryptedMap.tooltip=Kreiraj novu \u0161ifriranu mentalnu mapu
+encryption=\u0160ifriranje
enter_base_url=Bit \u0107e zalijepljene relativne adrese. Molim unesite osnovni URL.
+enter_command=Unesi naredbu
enter_condition_name=Upi\u0161i novo ime filtriranog stila
enter_confirms=Tipka &Enter kao potvrda (izlaz iz prostora)
enter_keyset_name=Upi\u0161i naziv grupe tipkovni\u010Dkih kratica
@@ -320,6 +340,8 @@ error_applying_template=Gre\u0161ka prilikom primjene XSL predlo\u0161ka.
error_creating_directory=Nije mogu\u0107e kreirati Mapu za izvoz.
error_in_template=Gre\u0161ka u zadanom predlo\u0161ku {0}. Poku\u0161ajte ukloniti ovu datoteku.
errornumber={0} gre\u0161ka/e
+ExecuteScript.available_modes_tooltip={0} dostupno je za
+ExecuteScript.script=Skripta
ExecuteScriptError.text=Gre\u0161ka kod izvo\u0111enju skripte:\n{0}
ExecuteScriptForAllNodes.text=Izvo\u0111enje svih skripta
ExecuteScriptForSelectionAction.text=Izvo\u0111enje skripta odabranih \u010Dvorova
@@ -333,7 +355,7 @@ export_failed=Izvoz nije uspio
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
export_using_xslt=Izvoz Freeplane mape pomo\u0107u XLST skripte
-ExportAction.text=&Izvoz mape\u2026
+ExportAction.text=Izvoz mape\u2026
ExportBranchAction.text=Razvijanje grane kao nove Mape-\u2026
ExportBranchToHTMLAction.text=Izvoz grane kao HTML
exported_file={0} datoteka
@@ -353,6 +375,7 @@ ExternalImageChangeAction.text=Promijeni vanjsku sliku...
ExternalImageRemoveAction.text=Obri\u0161i sliku
ExtractLinkFromTextAction.text=Hiperlink iz teksta
ExtractLinkFromTextAction.tooltip=Postavi hiperlink na\u0111en u tekstu \u010Dvora
+extras=&Alati
f_button_unassigned=nema akcije
FaqOpenURLAction.text=\u010Cesto postavljena pitanja
file=&Datoteka
@@ -372,7 +395,7 @@ FileProperties_NodeSelectionCount=Broj odabranih \u010Dvorova:
FileProperties_TotalFilteredCount=Broj \u010Dvorova koji su filtrirani:
FileProperties_TotalLeafCount=Ukupan broj krajnih \u010Dvorova:
FileProperties_TotalNodeCount=Ukupan broj \u010Dvorova:
-FilePropertiesAction.text=Svojst&va...
+FilePropertiesAction.text=Svojstva...
FileRevisionsDialog.cancel=O&tka\u017Ei
FileRevisionsDialog.file_last_modified=Oznaka vremena
FileRevisionsDialog.file_name=Datoteka
@@ -383,10 +406,12 @@ FileRevisionsDialog.question=Prona\u0111ene su obnovljene dataoteke od {0}
FileRevisionsDialog.restore=Obn&ovi
FileRevisionsDialog.restore.tooltip=Zamijeni {0} sa {1}
FileRevisionsDialog.title=Obnovljena datoteka
-filter=Filtar
+filter=F&iltar
filter_add=&Dodaj
filter_and=&I
filter_any_text=Jezgra \u010Dvora, detalji ili bilje\u0161ke
+filter_clone_snapshot=Spremljen odabir klonova
+filter_clones=Odabir klonova
filter_conditions=Filtri
filter_contains=Sadr\u017Ei
filter_created_after=Kreirano poslije
@@ -433,26 +458,33 @@ filter_selected_node_view=Filtriraj odabrane \u010Dvorove
filter_selected_node_view_snapshot=Spremljen odabir
filter_style=Stil
filter_time=Datumski filtar
-FilterComposerDialog.save=&Spremi
+FilterCondition=Uvjeti filtera
+filterConditions=Korisni\u010Dki definirani filtri
+filterConditions.noActions=Nema imenovanih filtera
filters_not_loaded=Filtar ne mo\u017Ee biti u\u010Ditan, datoteka je zauzeta
+find=Na\u0111i
find_what=Tra\u017Ei \u0161to?
-FindAction.text=Tra\u017Ei...
-FirstGroupNodeAction.text=Po\u010Detni \u010Dvor grupe
+FindAction.text=&Tra\u017Ei...
+FindNextAction.text=Tra\u017Ei sljede\u0107e
+FindPreviousAction.text=Tra\u017Ei prethodni
+fit_background_to_page=Pozadinska slika na cijelu stranu
fit_map_to_page=Prilagodi veli\u010Dini jedne stranice
fit_map_to_page_height=Prilagodi visinu na jednu stranicu
fit_map_to_page_width=Prilagodi \u0161irinu na jednu stranicu
-FitToPage.text=Prilagodi pove\u0107anje na &veli\u010Dinu zaslona
+FitToPage.text=Prilagodi pove\u0107anje na veli\u010Dinu zaslona
FitToPage.tooltip=Prilagodi pove\u0107anje tako da se cijela Mentalna mapa smjesti u trenutni prozor.
fold=Zatvori
FoldAllAction.text=Sklopi sve
FoldAllAction.tooltip=<html> Sklopi sve odabrane \u010Dvorove i njihovu Djecu.</html>
FoldOneLevelAction.text=Sklopi jednu razinu
FoldOneLevelAction.tooltip=<html>Sklopi odabrane \u010Dvorove za jednu razinu.</html>
-follow_graphical_link=Idi na:
+follow_clone=Unutar ''{0}''
+follow_graphical_link=Idi na ''{0}''
FollowLinkAction.text=Otvori hipervezu (link)
font=Slova
FontFamilyAction.text=Oblik slova
FontSizeAction.text=Veli\u010Dina slova
+format=O&blikovanje
format_invalid_pattern=Uzorak nije valjan
format_menu_cloud_shapes=Oblik obla\u010Di\u0107a
format_menu_edge_styles=Stil &ruba
@@ -487,6 +519,8 @@ freeplane_reverted=Freeplane_Preokrenuto_
FreeplaneHelpStarter.text=Pomo\u0107...
FreeplaneHelpStarter.tooltip=Pro\u0161irena pomo\u0107 Freeplanea
GettingStartedAction.text=Vodi\u010D za podu\u010Davanje
+goto=Idi na
+goto.noActions=Nema ciljanih \u010Dvorova
GotoLinkNodeAction.text=Idi na vezu
GotoNodeAction.text=Idi na \u010Dvor sa ID brojem...
GrabKeyDialog.common.cancel=Odustani
@@ -502,7 +536,7 @@ help=Pomo\u0107
HideableAction.tooltip=<html> Mijenja pozadinu svakog promijenjenog \u010Dvora u zadanu boju.</html>
HideAllAttributesAction.text=Sakrij sva obilje\u017Eja
HierarchicalIcons2Action.text=Prika\u017Ei raskri\u017Eje ikona \u010Dvorova Djece
-HierarchicalIconsAction.text=Prika\u017Ei &hijerarhiju ikona
+HierarchicalIconsAction.text=Prika\u017Ei hijerarhiju ikona
HierarchicalIconsAction.tooltip=Ako jedan od \u010Dvora (Dijete/Unuk) ima ikonu, ikona \u0107e biti prikazana tako\u0111er u malom obliku u roditeljskom \u010Dvoru.
hot_keys=Tipkovni\u010Dke kratice
hot_keys_table=Tablica tipkovni\u010Dkih kratica
@@ -642,19 +676,21 @@ IconProgressIconUpAction.text=Pove\u0107anje napretka 25% (ikona)
IconProgressIconUpAction.tooltip=Umetanje ikona napretka od manjeg prema ve\u0107em (0% -> 25% -> 50% -> 75% -> 100% + OK).
IconProgressRemoveAction.text=Obri\u0161i ikone napretka
IconProgressRemoveAction.tooltip=Bri\u0161e ikone napretka i dodatne ikone napretka projekta.
+icons=Ikone
IconSelectionPlugin.text=Odaberi ikonu...
IconSelectionPlugin.tooltip=<html>Ovdje mo\u017Eete odabrati ikonu s upotrebom dijaloga.</html>
image_covertLink=Pretvori vezu u sliku
ImageFlavorHandler=Slika (koristi zasebnu datoteku)
-import=Uvoz
+import=U&voz
import_linked_branch_no_link=Odabrani \u010Dvor nema nikakvu vezu za uvoz.
-ImportAction.text=U&voz
+ImportAction.text=Uvoz
ImportBranchAction.text=Grane...
ImportExplorerFavoritesAction.text=Explorer favorita...
ImportFolderStructureAction.text=Strukture mape (Folder)...
ImportLinkedBranchAction.text=Povezana grana
-ImportLinkedBranchWithoutRootAction.text=(Povezana grana) bez korijena...
+ImportLinkedBranchWithoutRootAction.text=Povezana grana bez korijena...
ImportMindmanagerFiles.text=MindManager X5 mape...
+ImportXmlFile.text=Uvoz xml datoteke
increase_branch_font_size=Ve\u0107a slova
IncreaseNodeFontAction.text=Ve\u0107a slova
internal_error_tooltip=Prona\u0111ene su interne gre\u0161ke. Pogledajte posljednju log datoteku log.0 za vi\u0161e informacija.
@@ -666,22 +702,31 @@ invalid_url_msg=Ne mogu stvoriti valjanu URL adresu za {0}
ItalicAction.text=Uko\u0161eno
italicise_branch=Ukositi
java_version=Verzija Java: {0}
-JoinNodesAction.text=Pove\u017Ei \u010Dvorove
+JoinNodesAction.separator.format=Pridru\u017Ei \u010Dvorove s "{0}"
+lastOpenedMaps=Nedavno kori\u0161tene mape
+lastOpenedMaps.noActions=Nema mapa u popisu povijesti
latex_editor=Uredi LaTeX formulu
-LatexDeleteLatexAction.text=Obri\u0161i LaTe&X formulu
-LatexEditLatexAction.text=Uredi LaTe&X formulu...
+LatexDeleteLatexAction.text=Obri\u0161i LaTeX formulu
+LatexEditLatexAction.text=Uredi LaTeX formulu...
LatexInsertLatexAction.msg1=<html>Poku\u0161avate umetnuti <i>staru</i> LaTeX formulu.<br/>Novi na\u010Din stvaranja LaTex teksta/formula opisan je na ovoj stranici:</html>
LatexInsertLatexAction.msg2=<html>Ukratko: <ul><li>koristite "\\latex " prefiks u tekstu \u010Dvora ili</li><li><i>Pogled->Plo\u010Da oblikovanja</i>, i <i>Tekst \u010Dvora->Predlo\u017Eak/Oblik->Latex</i></li></ul></html>
-LatexInsertLatexAction.text=Dodaj LaTe&X formulu...
+LatexInsertLatexAction.text=Dodaj LaTeX formulu...
latexPatternFormat=LaTeX
+LengthUnits.cm=cm
+LengthUnits.in=u
+LengthUnits.mm=mm
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=Morate odabrati barem dva \u010Dvora kako bi dodali poveznicu.
license=Licenca: GPL 2 ili kasnije
license_text=<html>Ovaj program je besplatan; mo\u017Eete ga dijeliti i/ili<br>mijenjati pod uvjetima kako stoji u GNU General Public License<br>koju je objavio Free Software Foundation; ili verziji 2<br>Licence ili (kao va\u0161a opcija) bilo koja kasnija verzija.<br><br>Ovaj program je napravljen u nadi da \u0107e biti koristan ,<br>ali BEZ IKAKVOG JAMSTVA; \u010Dak i bez impliciranog jamstva <br>TRGOVA\u010CKE ili POGODNOSTI ZA ODRE\u0110ENE NAMJENE. Vidi<br>GNU General Public Licens [...]
link_error=Neispravna veza "{0}" nije u\u010Ditana
link_not_available_any_more=Veza nije valjana. U me\u0111uvremenu je \u010Dvor obrisan.
link_not_found=Veza {0} nije na\u0111ena.
+links=Veze
load=&U\u010Ditaj
load_accelerator_presets=U\u010Ditaj
+load_accelerator_presets.noActions=Nema memoriranih postavki
LoadAcceleratorPresetsAction.textPatterns.text=Tekst
locking_failed_by_open=Zaklju\u010Davanje mape{0} nije uspjelo. Otvaranje samo za \u010Ditanje.
locking_failed_by_save_as=Zaklju\u010Davanje mape {0} nije uspjelo. Radnja Spremi kao je prekinuta.
@@ -689,6 +734,7 @@ locking_old_lock_removed=Mapa {0} je zaklju\u010Dana kod korisnika {1}. Zaklju\u
long_node_changed_cancel=Promijenili ste \u010Dvor. \u017Delite li odbaciti promjene?
long_node_changed_submit=Promijenili ste \u010Dvor. \u017Delite li spremiti promjene?
lots_of_links_warning=Napravit \u0107ete previ\u0161e veza na istom \u010Dvor. Zaista \u017Eelite kreirati toliko veza?
+main_menu=Izbornik
main_resource_directory=Mjesto instalacije programa: {0}
MainView.errorUpdateText=Pogre\u0161ka u postavljanu teksta za slijede\u0107i unos: {0}.
MakeLinkFromAnchorAction.text=Izradi vezu od sidra
@@ -727,15 +773,20 @@ ManageAddOnsDialog.tab.manage.themes=Teme
ManageAddOnsDialog.tab.manage.themes.tooltip=Upravljanje temama
ManageAddOnsDialog.tab.manage.tooltip=Upravljanje pro\u0161irenjima
ManageAddOnsDialog.visit.addon.page=Posjeti web-stranicu sa pro\u0161irenjima...
-ManageConditionalStylesAction.text=&Upravljanje uvjetovanim stilovima mapa
-ManageNodeConditionalStylesAction.text=U&pravljanje uvjetovanim stilovima \u010Dvora
+ManageConditionalStylesAction.text=Upravljanje uvjetovanim stilovima mapa
+ManageNodeConditionalStylesAction.text=Upravljanje uvjetovanim stilovima \u010Dvora
map_already_exists=Mapa ve\u0107 postoji. \u017Delite li prepisati preko postoje\u0107e mape?
+map_background=Pozadina mape
+map_background_image=Pozadinska slika
map_corrupted=Mapa je o\u0161te\u0107ena. \u017Delite li pogledati pojedinosti?
map_load_error=Nije mogu\u0107e u\u010Ditati mapu: {0}
map_locked_by_open=Mapa {0} se ure\u0111uje kod korisnika {1}. Otvaranje samo za \u010Ditanje.
map_locked_by_save_as=Mapa {0} se ure\u0111uje kod korisnika {1}. Radnja Spremi kao je prekinuta.
map_not_saved=Mapa nije prije spremljena.
-MapBackgroundColorAction.text=Pozadinska boja mape
+MapBackgroundClearAction.text=O\u010Disti
+MapBackgroundColorAction.text=Pozadinska boja
+MapBackgroundImageAction.text=Pozadinska slika...
+maps=Mape
MaxNodeWidth.text=Maksimalna \u0161irina teksta
menu_applyStyle=Primjena stila
menu_attributes=Obilje&\u017Eja
@@ -747,10 +798,6 @@ menu_displayAttributes=Obilje\u017Eja \u010Dvora
menu_encryption=Za\u0161tita
menu_error=Gre\u0161ka u korisni\u010Dko definiranoj strukturi izbornika {0}:\n{1}\nZaustavljn proces
menu_extensions=Pro\u0161irenja \u010Dvora
-menu_extras=&Alati
-menu_file_import=U&voz
-menu_filter=F&iltar
-menu_format=O&blikovanje
menu_group=\u010Cvor sa\u017Eetak
menu_hoverView=Prikaz opisa
menu_iconByCategory=Kategorije ikona...
@@ -758,26 +805,20 @@ menu_iconView=Ikone
menu_image=Slike
menu_insert=Um&etanje
menu_latex_formula=LaTeX formula
-menu_links=Veze
menu_manageStyles=Upravljanje stilovima
menu_moveNode=Pomak i sortiranje
-menu_navigate=&Navigacija
menu_newNode=Novi \u010Dvor
menu_node=\u010Cvor
menu_node_features=Dodaci \u010Dvora
menu_nodes=&\u010Cvor
menu_nodeView=\u010Cvor
-menu_notes=Bilje\u0161ka
menu_noteView=Bilje\u0161ke
menu_openmaps=Mape
-menu_progress=Napredak
menu_remove_icons=Ukloni ikone
menu_removeAttribute=Ukloni obilje\u017Eje
menu_select=Odaberi
menu_time=Upravljanje vremenom
menu_title=\u010Cvor
-menu_toolbars=Alatne trake
-menu_view=P&ogled
menu_viewmode=Postavke pogleda
MenuUtils.invalid_menuitem={0} nije ispravna tipkovni\u010Dka kratica naredbe izbornika.
mindmap=Mapa
@@ -791,18 +832,21 @@ mode_File=Preglednik datoteka
mode_MindMap=Mentalne mape
mode_na=Oblik nije dostupan
mode_status=Oblik promijenjen u {0}
+mode_StyleMap=Ure\u0111ivanje stila
mode_title=Freeplane - {0}
modes=Oblici
ModesMenuAction.Browse.text=Preglednik mentalnih mapa
ModesMenuAction.File.text=Preglednik datoteka
ModesMenuAction.MindMap.text=Ure\u0111iva\u010D mentalnih mapa
most_recent_files=Ne&davno otvarane datoteke
+MoveAction.text=Pomakni
MoveToRootAction.text=Povratak na korijenski \u010Dvor
NameConditionAction.text=Postavi naziv
+navigate=&Navigacija
NavigationNextMapAction.text=Sljede\u0107a mapa
NavigationPreviousMapAction.text=Prethodna mapa
new=&Novi
-new_map_from_user_templates.text=Nova mapa...
+new_map_from_user_templates.text=Nova mapa iz predlo\u0161ka...
new_mindmap=Nova Mentalna mapa
new_node=Novi \u010Dvor
new_node_as_sibling_not_possible_for_the_root=Novi bratski \u010Dvor, nije mogu\u0107e kreirati kao korijenski \u010Dvor
@@ -819,11 +863,11 @@ NewerFileRevisionsFoundDialog.question=Prona\u0111ene su nadografnje za {0}!
NewerFileRevisionsFoundDialog.restore=Obno&vi
NewerFileRevisionsFoundDialog.restore.tooltip=Zamijeni {0} sa {1}
NewerFileRevisionsFoundDialog.title=Prona\u0111ene su nadogradnje!
-NewFreeNodeAction.text=Novi slobodan \u010Dvor
+NewFreeNodeAction.text=Novi slobodni \u010Dvor
NewLevelStyleAction.text=Dodaj stil automatski oblikovane razine
newmap.install.addon.question={0} izgleda kao paket pro\u0161irenja\n\u017Delite li instalirati pro\u0161irenje?\n(Odaberite "No" za normalno otvaranje.)
newmap.install.addon.title=\u017Delite li instalirati pro\u0161irenje?
-NewMapAction.text=Nova
+NewMapAction.text=Nova mapa
NewMapViewAction.text=Nova mapa pregleda
NewParentNode.text=Novi \u010Dvor - Roditelj
NewParentNode.tooltip=<html>Svi odabrani \u010Dvorovi dodijeljeni su novom \u010Dvoru Roditelju.</html>
@@ -848,10 +892,11 @@ node=\u010Cvor
node_changed_discard_changes=Promijenili ste \u010Dvor. \u017Delite li odbaciti promjene?
node_is_write_protected=Ciljni \u010Dvor je za\u0161ti\u0107en od pisanja.
node_location_help=Povla\u010Denje mijenja poziciju \u010Dvora, ctrl+povla\u010Denje mijenja razmak, dvostruki klik i ctrl+dvostruki klik vra\u0107a \u010Dvor u prvobitnu poziciju.
+node_popup_scripting=Skripte
node_selector=Odabir \u010Dvora
node_selector_message=Dvostruki klik za odabir \u010Dvora
node_styles=Stil \u010Dvora
-NodeBackgroundColorAction.text=&Pozadinska boja \u010Dvora...
+NodeBackgroundColorAction.text=Pozadinska boja \u010Dvora...
NodeColorAction.text=Boja teksta \u010Dvora...
NodeColorBlendAction.text=Pomije\u0161aj boje
NodeDownAction.text=\u010Cvor dolje
@@ -859,21 +904,31 @@ NodeExtensions.EditNodeExtensions=Uredi pro\u0161irenja \u010Dvora
NodeExtensions.RemoveNodeExtensions=Obri\u0161i pro\u0161irenja \u010Dvora
NodeListAction.text=Tra\u017Ei i zamijeni...
NodeListAction.tooltip=Poka\u017Ei sve \u010Dvorove kao pretra\u017Eiv popis sa svojstvima filtra.
-NodeShapeAction.bubble.text=&Mjehuri\u0107
+NodeShapeAction.bubble.text=Mjehuri\u0107
NodeShapeAction.fork.text=Ra&\u010Dva
+NodeShapeAction.narrow_hexagon.text=Uski \u0161esterokut
+NodeShapeAction.oval.text=Elipsa
+NodeShapeAction.rectangle.text=Pravokutnik
+NodeShapeAction.small_bubble.text=Mali mjehuri\u0107
+NodeShapeAction.small_wide_hexagon.text=Mali \u0161esterokut
+NodeShapeAction.wide_hexagon.text=\u0160iroki \u0161esterokut
NodeUpAction.text=\u010Cvor gore
-NodeWidthAction.text=Postavke \u0161irine \u010Dvora
nonboldify_branch=Poni\u0161ti podebljanje
nonitalicise_branch=Poni\u0161ti uko\u0161enost
normal=Uobi\u010Dajen
not_saved_for_image_error=Mapa mora biti pohranjena prije postavljanja slike
not_saved_for_link_error=Mapa mora biti spremljena prije povezivanja datoteke preko pretra\u017Eiva\u010Da datoteka
note_window_location=Pozicija prozora bilje\u0161ki
+notes=Bilje\u0161ka
+NotificationOptions.CLOSE=Zatvori
+NotificationOptions.REMIND_ME_LATER=Podsjeti me kasnije
+NotificationOptions.REMOVE_REMINDER=Ukloni podsjetnik
+NotificationOptions.SELECT_NODE=Idi na podsjetnik
ok=&U redu
-OKAction.text=&Uredu
+OKAction.text=Uredu
OnlineReference.text=Dokumentacija - WEB
open_asMindMap=Mentalna mapa
-OpenAction.text=Otvori...
+OpenAction.text=Otvori spremljenu mapu...
OpenFreeplaneSiteAction.text=Web stranica Freeplane
OpenMapsAddLocation.text=Dodaj OpenMaps lokaciju...
OpenMapsRemoveLocation.text=Ukloni OpenMaps lokaciju
@@ -897,6 +952,7 @@ OptionPanel.always_load_last_maps.tooltip=Otvara posljednje datoteke prema gore
OptionPanel.always_save_folding=Uvijek spremi
OptionPanel.always_save_folding_state=Uvijek spremi promjene polo\u017Eaja sklopljenih i rasklopljenih \u010Dvorova
OptionPanel.always_save_folding_state.tooltip=Ova opcija \u0107e prilikom zatvaranja programa upozoriti na promijene izgleda stabla mape.
+OptionPanel.always_show_less_than_N_nodes_after_load=Rasklopi neke \u010Dvorove
OptionPanel.always_unfold_all_after_load=Rasklopi sve
OptionPanel.antialias=Zagla\u0111ivanje
OptionPanel.antialias.tooltip=<html>Odre\u0111ivanje grafi\u010Dke kvalitete mentalne mape. Vi\u0161e zagla\u0111ivanja zahtijeva vi\u0161e vremena.</html>
@@ -907,7 +963,7 @@ OptionPanel.Appearance=Izgled
OptionPanel.apply_system_screen_resolution=Primijeni zadanu razlu\u010Divost zaslona
OptionPanel.approximate_search_threshold=Granica pribli\u017Enog uspore\u0111ivanja
OptionPanel.approximate_search_threshold.tooltip=<html>Granica pribli\u017Enog uspore\u0111ivanja<br/><font size="2">pogledajte http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(ako koristite ve\u0107i broj slova<br/>broj prona\u0111enih rezultata tra\u017Eenog pojma biti \u0107e manji)</html>
-OptionPanel.ar=Arapski
+OptionPanel.ar=arapski
OptionPanel.ARC=Krivulja
OptionPanel.as_parent=Kao Roditelj
OptionPanel.ask=Pitanje
@@ -919,7 +975,7 @@ OptionPanel.backup_file_number=Broj sigurnosnih kopija
OptionPanel.Behaviour=Karakteristike
OptionPanel.bezier=Bezier
OptionPanel.bubble=Obla\u010Di\u0107
-OptionPanel.ca=Katalonski
+OptionPanel.ca=katalonski
OptionPanel.Cancel=Odustani
OptionPanel.center_selected_node=Automatsko klizanje prikaza mape
OptionPanel.check_updates_automatically=Provjeri za nadogradnju prilikom pokretanja programa
@@ -934,6 +990,8 @@ OptionPanel.combined=Kombinirano
OptionPanel.compare_as_number=Usporedi kao brojeve
OptionPanel.convert_to_current_version=<html>\u017Delite li automatsko pretvaranje mapa starih verzija Freeplanea <br>u trenutnu verziju?</html>
OptionPanel.convert_to_current_version.tooltip=<html>Samo za vrlo velike mape za koje nije potrebno pretvaranje <br>(a za to je potrebno stru\u010Dno znanje), mo\u017Eete otvarati bez pretvaranja.</html>
+OptionPanel.copyFormatToNewSibling=Kopiranje oblika za nove \u010Dvorove (bra\u0107u)
+OptionPanel.copyFormatToNewSiblingIncludesIcons=Kopiraj oblik sa ikonama
OptionPanel.cs=\u010Ce\u0161ki
OptionPanel.cut_nodes_without_question=Izrati \u010Dvor(ove) bez potvrde?
OptionPanel.cut_nodes_without_question.tooltip=Ako je polje odabrano \u010Dvorovi \u0107e biti izrezani bez potvrde. Ovo mo\u017Ee prouzro\u010Diti gubitak informacija ukoliko nismo pa\u017Eljivi kod brisanja.
@@ -942,7 +1000,7 @@ OptionPanel.date_format=Standardni oblik datuma
OptionPanel.date_format.tooltip=Upi\u0161i SHORT, MEDIUM, LONG ILI FULL ili oblik datuma poput "MM/dd/yyyy"
OptionPanel.datetime_format=Standarsni oblik vremena i datuma
OptionPanel.datetime_format.tooltip=Upi\u0161i <oblik datuma>,<oblik vremena> ( SHORT, MEDIUM, LONG ILI FULL kao predlo\u017Eeni oblik) ili koristi potpuni oblik poput "M/d/yyyy hh:mm"
-OptionPanel.de=Njema\u010Dki
+OptionPanel.de=njema\u010Dki
OptionPanel.default=Zadano
OptionPanel.default_attribute_key_column_width=\u0160irina 1.stupca obilje\u017Eja
OptionPanel.default_attribute_value_column_width=\u0160irina 2.stupca obilje\u017Eja
@@ -955,6 +1013,7 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>Za Windows 98 (znac
OptionPanel.default_browser_command_windows_nt=Zadani naredbeni preglednik Windows Nt
OptionPanel.default_browser_command_windows_nt.tooltip=<html>Za Windows NT (znaci "" su obavezni zbog veza,koji imaju "=" u svojem URL-u).</html>
OptionPanel.default_charset=Skup znakova
+OptionPanel.default_save_dir=Zadana mapa spremanja
OptionPanel.Defaults=Zadano
OptionPanel.delete_automatic_saves_at_exit=Kod izlaza obri\u0161i automatski spremljene datoteke
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Ako \u017Eelite obrisati automatski spremljene datoteke kod normalnog zatvaranja programa Freeplane, stavite kva\u010Dicu u potvrdnom okviru</html>
@@ -974,7 +1033,7 @@ OptionPanel.EDIT_CURRENT=Prepi\u0161i sadr\u017Eaj
OptionPanel.edit_on_double_click=Dvostruki klik za ure\u0111ivanje
OptionPanel.editor_extra_width=\u0160irina dodatnog prostora ure\u0111iva\u010Da (broj znakova)
OptionPanel.editor_extra_width.tooltip=<html>Odre\u0111uje broj piksela za pove\u0107anje \u0161irine \u010Dvor prilikom ure\u0111ivanja \u010Dvora</html>
-OptionPanel.el=Estonski
+OptionPanel.el=estonski
OptionPanel.el__buttons_above=Gumbi na vrh prozora
OptionPanel.el__enter_confirms_by_default=Tipka Enter kao potvrda (izlaz iz prozora)
OptionPanel.el__max_default_window_height=Zadana maksimalna visina prozora
@@ -982,10 +1041,11 @@ OptionPanel.el__max_default_window_width=Zadana maksimalna \u0161irina prozora
OptionPanel.el__min_default_window_height=Zadana minimalna visina prozora
OptionPanel.el__min_default_window_width=Zadana minimalna \u0161irina prozora
OptionPanel.el__position_window_below_node=Pozicioniraj prozor ispod \u010Dvora
-OptionPanel.en=Engleski
+OptionPanel.en=engleski
OptionPanel.Environment=Okru\u017Eenje
OptionPanel.es=\u0160panjolski
-OptionPanel.et=Etiopski
+OptionPanel.et=etiopski
+OptionPanel.eu=baskijski
OptionPanel.execute_scripts_without_asking=Izvr\u0161i skripte bez potvrde
OptionPanel.execute_scripts_without_asking.tooltip=<html>U principu Freeplane skripte mogu izvesti bilo kakvu akciju na va\u0161emu ra\u010Dunalu. <br>Zato ne biste trebali pokretati skripte za koje ne znate jesu li sigurne.</html>
OptionPanel.execute_scripts_without_exec_restriction=Omogu\u0107i izvr\u0161enje ostalih Aplikacija (NIJE preporu\u010Deno)
@@ -1003,6 +1063,7 @@ OptionPanel.export_icons_in_html.tooltip=<html> Potvrdite ukoliko \u017Eelite da
OptionPanel.exported_image_resolution_dpi=Izvezena rezolucija slike (u DPI)
OptionPanel.Files=Datoteke
OptionPanel.first=Kao prvu
+OptionPanel.fit_to_viewport=Prilagodi pozadinsku sliku veli\u010Dini prozoru
OptionPanel.fold_on_click_inside=Rasklopi na klik unutar \u010Dvora
OptionPanel.foldingsymbolwidth=Veli\u010Dina kru\u017Ei\u0107a sklopljenog \u010Dvora
OptionPanel.foldingsymbolwidth.tooltip=<html>Veli\u010Dina kruga koji ozna\u010Dava sklapanje stabla</html>
@@ -1011,8 +1072,8 @@ OptionPanel.format_locale=Regija
OptionPanel.format_locale.tooltip=Lokalne postavke za oblikovanje i analiziranje podataka
OptionPanel.formula_disable_caching=Onemogu\u0107i memorijski prostor za izra\u010Dunavanje formule
OptionPanel.formula_disable_plugin=Onemogu\u0107i dodatak za izradu formula
-OptionPanel.fr=Francuski
-OptionPanel.gl=Grendlanski
+OptionPanel.fr=francuski
+OptionPanel.gl=grendlanski
OptionPanel.goto_note_end_on_edit=Pokaziva\u010D znaka (kursor) na kraju teksta bilje\u0161ke
OptionPanel.grid_size=Veli\u010Dina mre\u017Ee pomaka \u010Dvora
OptionPanel.groovy_editor_font=Oblik slova ure\u0111iva\u010Da Groovy sintakse
@@ -1022,7 +1083,7 @@ OptionPanel.gtk=Gtk
OptionPanel.hide_edge=Skriveni rubovi
OptionPanel.highlight_formulas=Osvijetli formulu
OptionPanel.horizontal=Vodoravno
-OptionPanel.hr=Hrvatski
+OptionPanel.hr=hrvatski
OptionPanel.HTML=HTML
OptionPanel.html_export_based_on_headings=Prema naslovima
OptionPanel.html_export_fold_all=Sklopi sve
@@ -1037,15 +1098,17 @@ OptionPanel.icon=Ikona
OptionPanel.icon.tooltip=Nakon primjene \u010Dvor \u0107e imati ovu ikonu.
OptionPanel.icons.list=Popis prikazanih standardnih ikona
OptionPanel.icons.list.tooltip=Ovdje mo\u017Eete napraviti vlastiti raspored ikona ili onemogu\u0107iti prikaz ikona. Ikone trebaju biti odvojene znakom ";".
-OptionPanel.id=Indonezijski
+OptionPanel.id=indonezijski
OptionPanel.IGNORE=Ne \u010Dini ni\u0161ta
OptionPanel.il__enter_confirms_by_default="Enter" kao standardna potvrda unosa
OptionPanel.image_cache=Za slike
-OptionPanel.it=Talijanski
-OptionPanel.ja=Japanski
+OptionPanel.indentationUsesTabsInTextOutput=Koristi tabulator u izlaznom tekst
+OptionPanel.it=talijanski
+OptionPanel.ja=japanski
+OptionPanel.JoinNodesAction.textSeparators=Razdjelnik teksta
OptionPanel.key_type_action=Unos tipkovnicom
OptionPanel.Keystrokes=Tipkovni\u010Dke kratice
-OptionPanel.ko=Korejski
+OptionPanel.ko=korejski
OptionPanel.label_font_family=Oblik slova
OptionPanel.label_font_size=Veli\u010Dina slova
OptionPanel.language=Jezik
@@ -1071,7 +1134,7 @@ OptionPanel.load_last_map.tooltip=<html>Ako je ova opcija odabran, Freeplane \u0
OptionPanel.load_last_maps=U\u010Ditaj sve posljednje mape
OptionPanel.lookandfeel=Izgled i ugo\u0111aj
OptionPanel.lookandfeel.tooltip=<html>'Izgled i ugo\u0111aj' koji \u0107e biti upotrebljen. Podr\u017Eani su 'metal','windows','motiv', 'gtk' , 'mac' je dostupan samo za MacOS. zadano zna\u010Di, da je upotrebljen zadani Izgled i ugo\u0111aj. \u017Delite li umetnuti svoj vlastiti Izgled i ugo\u0111aj, molimo upi\u0161ite ime razreda ovdje i osigurajte da odgovaraju\u0107a datoteka /datoteke .jar bude u\u010Ditana. Ako postoje problemi s postavkama Izgled i ugo\u0111aj odaberite ovdje 'n [...]
-OptionPanel.lt=Litvanski
+OptionPanel.lt=litvanski
OptionPanel.max_displayed_node_count=Maksimalni broj prikazanih \u010Dvorova
OptionPanel.max_image_width=Po\u010Detna \u0161irina slike
OptionPanel.max_image_width.tooltip=Umetnute slike umanjene su na tu \u0161irinu
@@ -1082,10 +1145,11 @@ OptionPanel.max_shortened_text_length=Maksimalna duljina smanjenog \u010Dvora
OptionPanel.metal=Metal
OptionPanel.min_node_width=Minimalna \u0161irina \u010Dvora
OptionPanel.motif=Motif
+OptionPanel.narrow_hexagon=Uski \u0161esterokut
OptionPanel.nb=Norve\u0161ki (Bokm\u00E5l)
OptionPanel.never_save_folding=Nikad ne spremaj
-OptionPanel.nl=Nizozemski
-OptionPanel.nn=Norve\u0161ki (Nynorsk)
+OptionPanel.nl=nizozemski
+OptionPanel.nn=norve\u0161ki (Nynorsk)
OptionPanel.nodebackgroundcolor=Boja pozadine \u010Dvora
OptionPanel.nodebackgroundcolor.tooltip=Pozadinska boja \u010Dvora kad nije odabran.
OptionPanel.nodecolor=Boja teksta \u010Dvora
@@ -1099,8 +1163,7 @@ OptionPanel.nodeformat=Predlo\u017Eak / Oblik
OptionPanel.nodeformat.tooltip=<html>Zamjena i/ili oblikovanje teksta:<ul><li><em>Predlo\u017Eak pro\u0161irenja:</em> <tt>%s</tt> je orginalni tekst, e.g. <tt>OPREZ: %s</tt><li><em>Oblikovanje brojeva i datuma:</em> Na primjer <tt>%.0</tt> format daje cijeli broj. Pogledaj <a href="http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html#syntax">Formatter string syntax</a>.<li><em>Formule:</em> Pogledaj <a href="http://freeplane.sourceforge.net/wiki/index.php/Formulas"> [...]
OptionPanel.nodenumbering=Dodavanje broja \u010Dvoru
OptionPanel.nodenumbering.tooltip=Dodavanje serijskog broja u tekst \u010Dvora (primjer - 1.3.1).
-OptionPanel.nodeshape=Stil \u010Dvora
-OptionPanel.nodeshape.tooltip=<html>Stil opisuje vanjski oblik \u010Dvora. <br>Mogu\u0107e vrijednosti:<br><table border="1"><tr><td>Ra\u010Dva: </td><td> \u010Dvor bez ruba,</td></tr><tr><td>Mjehuri\u0107: </td><td> \u010Dvor sa zaobljenim rubom,</td></tr><tr><td>Kao Roditelj: </td><td> stil se prenosi s roditeljskog \u010Dvora <br>ili zadani stil korijenskog \u010Dvora za korijenski \u010Dvor,</td></tr><tr><td>Kombinirano: </td><td> Mjehuri\u0107 kad je \u010Dvor rasklopljen, ra\u010Dv [...]
+OptionPanel.nodeshape=Oblik \u010Dvora
OptionPanel.nodetext=Tekst \u010Dvora
OptionPanel.nodetext.tooltip=Ovdje mo\u017Eete definirati tekst \u010Dvorova. Kori\u0161tenjem uzorka prethodni tekst je odba\u010Den.
OptionPanel.nothing=Ni\u0161ta
@@ -1116,15 +1179,20 @@ OptionPanel.org.freeplane.plugin.bugreport.denied=Nikad ne \u0161alji
OptionPanel.org.freeplane.plugin.bugreport.userid=Proizvoljnja identifikacija po\u0161iljatelja
OptionPanel.outline_hgap=Vodoravni razmak
OptionPanel.outline_vgap=Okomiti razmak
+OptionPanel.oval=Ovali
OptionPanel.paint_connectors_behind=Crtaj poveznik iza \u010Dvorova
OptionPanel.parse_data=Prepoznaj unos brojeva, datuma i vremena
OptionPanel.parse_data.tooltip=Program analizira unos datuma, datuma-vremena i brojeva i primjenjuje standarde formate. Prijmeri: 100,000.00, 12/31, 12/31/99, 1999-12-31 and 1999-12-31 23:59
+OptionPanel.parse_formulas=Prepoznaj formule
+OptionPanel.parse_formulas.tooltip=\u010Cvorove koji po\u010Dinju sa "=" prepoznaje kao formulu: Pogledaj http://www.freeplane.org/wiki/index.php/Formulas.
+OptionPanel.parse_latex=Prepoznaj LaTeX
+OptionPanel.parse_latex.tooltip=Prepoznaje LaTeX zapise prema obliku ili prefiksu: Pogledaj http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane.
OptionPanel.PASTE_HTML=Zalijepi kao HTML
OptionPanel.PASTE_PLAIN_TEXT=Zalijepi kao obi\u010Dan tekst
OptionPanel.path_property_may_not_be_empty=Polje unosa nemo\u017Ee biti prazno, unesite putanju mapesigurnosnih kopija.
OptionPanel.patternname=Ime
OptionPanel.patternname.tooltip=Jedinstveno ime uzorka
-OptionPanel.pl=Poljski
+OptionPanel.pl=poljski
OptionPanel.placenewbranches=Postavi novu granu
OptionPanel.placenewbranches.tooltip=<html>Odre\u0111uje polo\u017Eaj nove grane. Valjane vrijednosti su 'prva' i 'posljednja' </html>
OptionPanel.plugin.tooltip=Vanjski dodaci.
@@ -1133,12 +1201,16 @@ OptionPanel.presentation_dimmer_transparency=Prozirnost zatamnjenja prezentacije
OptionPanel.presentation_mode=Prezentacija
OptionPanel.printonwhitebackground=<html>Bijela pozadina kod ispisa</html>
OptionPanel.printonwhitebackground.tooltip=<html>Uvijek koristi bijelu pozadinu kod ispisa</html>
-OptionPanel.pt_BR=Portugalski BR
-OptionPanel.pt_PT=Portugalski PT
+OptionPanel.pt_BR=portugalski BR
+OptionPanel.pt_PT=portugalski PT
OptionPanel.RECT=Pravokutnik
+OptionPanel.rectangle=Pravokutnik
OptionPanel.relative=Relativne
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"Pitaj" (use in doubt).<br>"Da" prika\u017Ei ure\u0111iva\u010D za bolje oblikovanje teksta .<br>"Ne" prika\u017Ei jednostavni tekstualni ure\u0111iva\u010D.</html>
OptionPanel.remind_use_rich_text_in_new_nodes=Koristi bolje oblikovani tekst za zaljepljene \u010Dvorove
+OptionPanel.remindersBlink=Treptaju\u0107i podsjetnik
+OptionPanel.remindersShowNotifications=Podsjetnici prikazuju sko\u010Dne prozore s obavijestima
+OptionPanel.remindersStandardDelay=Ka\u0161njenje podsjetnika
OptionPanel.remove_notes_without_question=Obrisati bilje\u0161ke bez upita?
OptionPanel.remove_notes_without_question.tooltip=Ako je polje odabrano pripadaju\u0107e bilje\u0161ke odabranog \u010Dvora bit \u0107e obrisane bez potvrde.Ovo mo\u017Ee prouzro\u010Diti gubitak informacija ukoliko nismo pa\u017Eljivi kod brisanja.
OptionPanel.resources_use_default_font_for_notes_too=Koristi zadani font za bilje\u0161ke
@@ -1146,9 +1218,10 @@ OptionPanel.resources_use_margin_top_zero_for_notes=Makni gornju marginu kod bil
OptionPanel.revision_color=Pozadinska boja izmjenjenih \u010Dvorova
OptionPanel.revision_color.tooltip=Pozadinska boja izmijenjenih \u010Dvorova.
OptionPanel.ROUND_RECT=Zaobljeni pravokutnik
-OptionPanel.ru=Ruski
+OptionPanel.ru=ruski
OptionPanel.save_folding=Spremi strukturu stabla
OptionPanel.save_folding_if_map_is_changed=Samo ako je mapa promijenjena
+OptionPanel.save_last_visited_node=Spremi posljednju poziciju na mapi
OptionPanel.save_modification_times=Spremi vrijeme promijene
OptionPanel.script_classpath=Dodatni direktoriji sa classes skriptama ili JARs ( vidi opis alata)
OptionPanel.script_classpath.tooltip=<html>Lista mapa (Folder) koje sadr\u017Ee skripte classpath, formula ili JARs.<br>Koristi ; (Windows) ili : (Linux, Mac) za odvajanje unosa.<br>Frepplane \u0107e provjeravati postojanje JAR ili .class datoteka.<br>Putanje koje nisu apsolutne, biti \u0107e usmjerene na korisni\u010Dku mapu Freeplane (.freeplane)y.<br>Ako postavite classpath morate omogu\u0107iti izvr\u0161avanje skripti!</html>
@@ -1160,6 +1233,7 @@ OptionPanel.script_user_key_name_for_signing=Neobavezni korisni\u010Dki klju\u01
OptionPanel.script_user_key_name_for_signing.tooltip=<html>\u017Delite li potpisati svoju skriptu, unesite pseudonim (izmi\u0161ljeni klju\u010D) ovdje. <br>Lozinka je pohranjena u bazu klju\u010Deva. <br>Lozinaka klju\u010Dnog tajnog klju\u010Da mora se podudarati s lozinkom u bazi klju\u010Deva (to je zadano).</html>
OptionPanel.scrollbar_increment=Brzina
OptionPanel.scrolling_speed=Brzina automatskog klizanja prikaza mape
+OptionPanel.scrollOnUnfold=Pomak mape nakon rasklapanja \u010Dvorova
OptionPanel.selection_method=Na\u010Din odabira
OptionPanel.selection_method.tooltip=<html> pomo\u0107u ove opcije mo\u017Eete omogu\u0107iti/onemogu\u0107iti na\u010Din odabira \u010Dvora sa zaka\u0161njenjem.</html>
OptionPanel.selection_method_by_click=Sa klikom
@@ -1193,6 +1267,7 @@ OptionPanel.separator.icon_properties=Ikone
OptionPanel.separator.icons=Ikone u "Odaberi Ikonu..."
OptionPanel.separator.initial_map_size=Po\u010Detna veli\u010Dina Mentalne mape
OptionPanel.separator.inline_editor=Jednostavni ure\u0111iva\u010D \u010Dvora
+OptionPanel.separator.JoinNodesAction=Pridru\u017Eivanje \u010Dvorova
OptionPanel.separator.key_typing=Tipkanje
OptionPanel.separator.language=Jezik
OptionPanel.separator.latex=LaTex
@@ -1213,6 +1288,7 @@ OptionPanel.separator.other_defaults=Ostale zadane vrijednosti
OptionPanel.separator.others=Ostale tipkovni\u010Dke kratice
OptionPanel.separator.outline_view=Op\u0107i pregled
OptionPanel.separator.patterns=Uzorci
+OptionPanel.separator.reminderOptions=Mogu\u0107nosti podsjetnika
OptionPanel.separator.RichTextEditor=Ure\u0111iva\u010D teksta
OptionPanel.separator.root_node_appearance=Izgled korijenskog \u010Dvora
OptionPanel.separator.save=Spremi
@@ -1224,6 +1300,7 @@ OptionPanel.separator.selection_method=Na\u010Din odabira
OptionPanel.separator.single_instance_mode=Otvaranje programa
OptionPanel.separator.size_limits=Ograni\u010Denja veli\u010Dina
OptionPanel.separator.spelling=Opcije provjere pravopisa
+OptionPanel.separator.SplitToWordsAction=Razdvajanje \u010Dvora prema rije\u010Dima
OptionPanel.separator.status=Statusna traka
OptionPanel.separator.tooltip=Vrijeme prikaza opisa alata
OptionPanel.separator.undo=Poni\u0161ti
@@ -1232,9 +1309,13 @@ OptionPanel.set_property_text=Promijeni
OptionPanel.set_property_text.tooltip=Prazno: Ne diraj; Minus=Makni svojstvo (postavi zadanu vrijednost); Plus=Promijeni svojstvo
OptionPanel.setscript=Promijeniti?
OptionPanel.setscript.tooltip=Skripta mo\u017Ee biti pridru\u017Eena stilu.
+OptionPanel.shape_horizontal_margin=Vodoravna margina
+OptionPanel.shape_vertical_margin=Okomita margina
OptionPanel.sharp_bezier=Grubo bezier
OptionPanel.sharp_linear=Grubo linearno
+OptionPanel.shouldCenterSmallMaps=Centriranje male mape
OptionPanel.show_icon_for_attributes=Prika\u017Ei ikone obilje\u017Eja
+OptionPanel.show_less_than_N_nodes_by_default_after_load=U\u010Ditaj iz mape ili rasklopi neke \u010Dvorove
OptionPanel.show_node_tooltips=Prika\u017Ei opis alata za \u010Dvorove
OptionPanel.show_note_icons=Prika\u017Ei ikone bilje\u0161aka
OptionPanel.show_styles_in_tooltip=Prika\u017Ei opis stila \u010Dvora
@@ -1248,16 +1329,23 @@ OptionPanel.single_backup_directory_path.tooltip=<html>Promijenite zadanu putanj
OptionPanel.single_instance=Otvori datoteku u aktivnom prozoru programa
OptionPanel.single_instance_force=Izbjegni otvaranje datoteke u novom prozoru programa
OptionPanel.single_instance_force.tooltip=Izbjegni otvaranje programa u novom prozoru \u010Dak iako ne postoji datoteka za u\u010Ditavanje
-OptionPanel.sk=Slova\u010Dki
-OptionPanel.sl=Slovenski
+OptionPanel.sk=slova\u010Dki
+OptionPanel.sl=slovenski
OptionPanel.slow_scroll_selected_node=Sporo pomicanje do odabranog \u010Dvora
+OptionPanel.small_bubble=Mali mjehuri\u0107
+OptionPanel.small_wide_hexagon=Mali \u0161esterokut
OptionPanel.spelling_opt_case_sensitive=Osjetljiv na veli\u010Dinu (slova)
OptionPanel.spelling_opt_ignore_all_caps_words=Zanemari rije\u010Di pisane VELIKIM SLOVIMA.
OptionPanel.spelling_opt_ignore_capitalization=Zanemari VELIKA SLOVA na po\u010Detku rije\u010Di
OptionPanel.spelling_opt_ignore_words_with_numbers=Zanemari rije\u010Di koje sadr\u017Ee brojeve
OptionPanel.spelling_opt_suggestions_limit_dialog=Maksimalan broj predlo\u017Eenih rje\u010Di u dijalogu
OptionPanel.spelling_opt_suggestions_limit_menu=Maksimalan broj predlo\u017Eenih rje\u010Di u izborniku
-OptionPanel.sr=Srpski / \u0441\u0440\u043F\u0441\u043A\u0438
+OptionPanel.SplitToWordsAction.auxiliaryWordList=pomo\u0107ni popis rije\u010Di
+OptionPanel.SplitToWordsAction.charactersAcceptedInWord=broj znakova u rije\u010Dima
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=ostavi izvorni \u010Dvor prazan
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=broj \u010Dvora u redu
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=spremi orginalni tekst kao detalje
+OptionPanel.sr=srpski / \u0441\u0440\u043F\u0441\u043A\u0438
OptionPanel.standard_template=Datoteka predlo\u0161ka
OptionPanel.standardbackgroundcolor=Boja pozadine mape
OptionPanel.standardbackgroundcolor.tooltip=<html>Standardna boja pozadine mape u HTML zapisu </html>
@@ -1276,26 +1364,32 @@ OptionPanel.standardselectednodecolor.tooltip=<html>Standardna boja odabranog \u
OptionPanel.standardselectednoderectanglecolor=Boja okvira odabranog \u010Dvora
OptionPanel.standardselectednoderectanglecolor.tooltip=<html>Standardna boja okvira odabranog \u010Dvora. U HTML zapisu (#RRGGBB u heksadecimalnoj vrijednosti) </html>
OptionPanel.STAR=Zvijezda
+OptionPanel.statesymbolwidth=\u0160irina simbola stanja
OptionPanel.structured_html_import=Uvoz HTML-a kao strukture \u010Dvorova
OptionPanel.structured_icon_toolbar=Strukturirana traka ikona
OptionPanel.summary=Sa\u017Eetak
OptionPanel.sv=\u0160vedski
OptionPanel.text.use_ctrl_key=Kliknite na stavku izbornika dr\u017Ee\u0107i tipku CTRL za dodjeljivanje tipkovni\u010Dke kratice
+OptionPanel.textalignment=Poravnavanje teksta
OptionPanel.time_for_automatic_save=Vrijeme automatskog spremanja (msec.)
OptionPanel.time_for_automatic_save.tooltip=<html> vrijeme izme\u0111u dva uzastopna automatska spremanja (u msec): za onemogu\u0107avanje automatskog spremanja potrebno je ovu vrijednost staviti na 2000000000.</html>
OptionPanel.time_for_delayed_selection=Vrijeme ka\u0161njenja odabira
OptionPanel.time_for_delayed_selection.tooltip=<html> Vremensko zaka\u0161njenje odabira \u010Dvora kada je pokaziva\u010D mi\u0161a iznad \u010Dvora (u milisekundama).Promijenite ovaj iznos na 1 ako \u017Eelite direktno odabrati \u010Dvor kad je pokaziva\u010D mi\u0161a iznad.</html>
OptionPanel.toolTipManager.dismissDelay=Vrijeme prestanka prikaza, ms
OptionPanel.toolTipManager.initialDelay=Vrijeme po\u010Detka prikaza, ms
-OptionPanel.toolTipManager.max_tooltip_width=\u0160irina opisa alata
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>Zadana \u0161irina opisa alata u pikselima</html>
+OptionPanel.toolTipManager.max_tooltip_height=Maksimalna visina opisa alata
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=Maksimalna visina opisa alata u pikselima.
+OptionPanel.toolTipManager.max_tooltip_width=Maksimalna \u0161irina opisa alata
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=Maksimalna \u0161irina opisa alata u pikselima.
OptionPanel.toolTipManager.reshowDelay=Vrijeme ponovnog prikaza, ms
-OptionPanel.uk_UA=Ukrajinski
+OptionPanel.tr=turski
+OptionPanel.uk_UA=ukrajinski
OptionPanel.undefined_font=Nedefiniran oblik slova
OptionPanel.undo_levels=Broj poni\u0161tenja
OptionPanel.undo_levels.tooltip=<html>Odre\u0111ivanje broja spremljenih koraka koji \u0107e se mo\u0107i vratiti funkcijom "Poni\u0161ti".</html>
OptionPanel.unfold_on_paste=Rasklopi \u010Dvor kad ga zalijepi\u0161
OptionPanel.unfold_on_paste.tooltip=Rasklopi \u010Dvor kad ga zalijepi\u0161 ili kad povu\u010De\u0161 i ispusti\u0161 \u010Dvor
+OptionPanel.uniform_shape=Ujedna\u010Deno
OptionPanel.use_common_out_point_for_root_node=Rubovi zapo\u010Dinju iz jedne to\u010Dke na korijenskom \u010Dvoru
OptionPanel.use_common_out_point_for_root_node.tooltip=Rubovi zapo\u010Dinju iz jedne to\u010Dke na korijenskom \u010Dvoru
OptionPanel.use_tabbed_pane=Koristi tabove
@@ -1308,12 +1402,15 @@ OptionPanel.validate_invalid_number_format=Une\u0161en je neva\u017Ee\u0107i obl
OptionPanel.validate_write_without_read=Izvo\u0111enje skripti: omogu\u0107ite \u010Ditanje i pisanje datoteka.
OptionPanel.validation_error=<html><body>Potvrda gre\u0161ke/a:<p><em>{0}</em><p>Promijenite postavke kako bi uklonili gre\u0161ku/e.</body></html>
OptionPanel.validation_warning=<html><body>Potvrda upozorenja:<p><em>{0}</em></body></html>
-OptionPanel.vi=Vijetnamski
+OptionPanel.vertical_child_gap=Razmak \u010Dvorova Djece
+OptionPanel.vertical_child_gap.tooltip=Okomiti razmak izme\u0111u \u010Dvorova Djece
+OptionPanel.vi=vijetnamski
OptionPanel.wheel_velocity=Brzina
OptionPanel.wheel_velocity.tooltip=Ve\u0107a vrijednost rezultira kod pomaka kota\u010Di\u0107a mi\u0161a br\u017Ee u\u010Dinke na mapi.
+OptionPanel.wide_hexagon=\u0160iroki \u0161esterokut
OptionPanel.windows=Windows
-OptionPanel.zh_CN=Kineski, pojednostavljeno
-OptionPanel.zh_TW=Kineski, tradicionalno
+OptionPanel.zh_CN=kineski, pojednostavljeno
+OptionPanel.zh_TW=kineski, tradicionalno
org.freeplane.plugin.bugreport.agree=Po\u0161alji
org.freeplane.plugin.bugreport.always_agree=Uvijek po\u0161alji
org.freeplane.plugin.bugreport.always_deny=Nikad ne \u0161alji
@@ -1328,10 +1425,10 @@ org.freeplane.plugin.bugreport.wanted_bug=Pojavila se interna pogre\u0161ka i a
org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined=\u010Cvor {0} nije definiran
out_of_memory=Premalo slobodne memorije.
overwrite_keyset_question=Prepisati postoje\u0107u grupu tipkovni\u010Dkih kratica ?
-PageAction.text=Pode\u0161avanje &stranice...
+PageAction.text=Pode\u0161avanje stranice...
password_is_not_ascii=Lozinka nije ASCII kod
PasteAction.text=Zalijepi
-PasteAttributes.text=Zalijepi obilje\u017Eje
+PasteAttributes.text=Zalijepi obilje\u017Eja
PatternNewNameProperty=Novi uzorak
PatternToString.backgroundColor=Boja pozadine
PatternToString.Child=Stil \u010Dvora Dijete
@@ -1402,7 +1499,8 @@ print_preview_title=Pregled ispisa
PrintAction.text=Ispis...
PrintDirectAction.text=Ispis
printing_settings=Skaliranje ispisa
-PrintPreviewAction.text=&Pregled ispisa...
+PrintPreviewAction.text=Pregled ispisa...
+progress=Ikona napredka (%)
PropertyAction.dialog=Postavke
PropertyAction.text=Postavke ...
QuickFilterAction.text=Brzi filtar
@@ -1426,9 +1524,12 @@ RedoFilterAction.text=Ponovi
regular_expressions=Regularni izraz
ReminderHookAction.text=Ukloni podsjetnik
ReminderHookAction.tooltip=Ukloni podsjetnik s \u010Dvora.
+reminderNotification=Obavijest podsjetnika
remove_file_from_list_on_error=Datoteka {0} nije otvorena. \u017Delite li je maknuti s liste nedavno otvaranih datoteka?
remove_shortcut_question={0} trenutno je dodijeljeno {1}.\n\u017Delite li dodijeliti ovu tipkovni\u010Dku kraticu {2}?
remove_shortcut_title=\u017Delite li obrisati tipkovni\u010Dku kraticu?
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=Ponovno postavi rasklopljene \u010Dvorove
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=Omogu\u0107i sklapanje/rasklapanje svakog \u010Dvora
RemoveAllIconsAction.text=Ukloni sve ikone
RemoveConnectorAction.text=Obri\u0161i poveznik
RemoveEncryption.text=Ukloni \u0161ifriranje
@@ -1446,49 +1547,60 @@ replace_shortcut_title=\u017Delite li zamijeniti tipkovni\u010Dku kraticu?
ReportBugAction.text=Prijavi gre\u0161ku
RequestFeatureAction.text=Zamolba za razvoj
reset_to_default=Vrati na zadano
-ResetNodeLocationAction.text=Vrati &izvorni polo\u017Eaj
+ResetNodeLocationAction.text=Vrati izvorni polo\u017Eaj
ResetStyleAction.text=Vrati izvorni stil \u010Dvora
-RevertAction.text=O&tvori ponovno
+RevertAction.text=Otvori ponovno
RevisionPluginAction.text=Prika\u017Ei promijenjen \u010Dvor u &boji
+save=&Spremi
save_failed=Poku\u0161aj spremanja mape {0} nije uspjelo.
save_unsaved=\u017Delite li spremiti slijede\u0107u Mentalnu mapu?
save_unsaved_styles=\u017Delite li spremiti stilove?
SaveAcceleratorPresetsAction.text=Pohrana grupe tipkovni\u010Dkih kratica F-trake\u2026
SaveAction.text=&Spremi
-SaveAll.text=Spremi &sve otvoerne datoteke
+SaveAction_readonlyMsg=Mapa je samo za \u010Ditanje. Koristi 'Datoteka->Spremi mapu kao..' za spremanje ove mape.
+SaveAction_readonlyTitle=Poku\u0161aj spremanje "samo za \u010Ditanje" mape (datoteke)
+SaveAll.text=Spremi sve otvorene d&atoteke
SaveAll.tooltip=Spremi sve otvorene mape
+SaveAs_toReadonlyMsg={0} je samo za \u010Ditanje. Molim, spremite datoteku pod drugim imenom..
+SaveAs_toReadonlyTitle=Poku\u0161aj spremanja u datoteku "samo za \u010Ditanje"
SaveAsAction.text=Spremi kao...
saved=Spremljeno
saving_canceled=Spremanje otkazano
scanners_not_loaded=Skenirane datoteke su o\u0161te\u0107ene i nemogu biti u\u010Ditane
scheme_evaluate=Izra\u010Dunati?!
script_execution_disabled=Onemogu\u0107i izvo\u0111enje skripti
-ScriptEditor.text=U&re\u0111iva\u010D skripta...
+ScriptEditor.text=Ure\u0111iva\u010D skripta...
ScriptEditor.tooltip=Omogu\u0107ava pisanje velikih skripta unutar Freeplanea.
ScriptEditorPanel.changed_cancel=Skripta je promijenjena. Stvarno \u017Eelite otkazati promjene?
+scripting=Skripte
scripting_api_generator_legend=Natpis
scripting_api_generator_proxy=Proxy
scripting_api_generator_title=Pisanje API skripta
scripting_api_generator_utilities=Sredstva
scripting_api_generator_web=WEB izvor
+ScriptsRunToggleAction.ON_SELECTED_NODE.text=Pokreni skripte na svim odabranim \u010Dvorovima
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=Pokreni skripte na odabranim \u010Dvorovima, redovito
+ScriptsRunToggleAction.ON_SINGLE_NODE.text=Pokreni skripte na selektiranom \u010Dvoru
select_favorites_folder=Odaberite mapu sa va\u0161im favoritima
select_file_export_to=Odaberi datoteku za izvoz u
select_folder_for_importing=Odaberite mapu uvoza
select_icon=Odabir ikone
select_menu_item_dialog=Odaberite stavku izbornika
select_menu_item_root_node=Izbornik
-SelectAllAction.text=Odaberi sve
-SelectBranchAction.text=Odaberi granu
+SelectAllAction.text=Odaberi sve vidljive \u010Dvorove
+SelectBranchAction.text=Odaberi vidljive grane
SelectedPasteAction.text=Zalijepi kao...
selection_method_by_click=Jednostruki klik za odabir
selection_method_delayed=Zaka\u0161njela automatska metoda odabira
selection_method_direct=Prika\u017Ei odabrano
SelectNoteAction.text=Prelazak iz bilje\u0161ke u \u010Dvor
SelectNoteAction.tooltip=Prebaci iz bilje\u0161ke u \u010Dvor
-set_accelerator_on_next_click_action=Za kreiranje nove tipkovni\u010Dke kratice: dr\u017Eite pritisnutu 'Ctrl' tipku za vrijeme odabira stavke izbornika.
+set_accelerator_on_next_click_action=Za kreiranje nove tipkovni\u010Dke kratice: dr\u017Eite pritisnutu 'Ctrl' tipku za vrijeme odabira naredbe izbornika.
SetAccelerator.dialogTitle=Dodjeljivanje tipkovni\u010Dkih kratica
SetAccelerator.keystrokeDetected=Tipkovni\u010Dka kratica ''{0}''nije dodana niti jednoj stavci izbornika.
SetAcceleratorOnNextClickAction.text=Pridru\u017Ei tipkovni\u010Dku kraticu\u2026
+SetAlwaysUnfoldedNodeFlagsAction.text=Zadr\u017Ei rasklopljene \u010Dvorove
+SetAlwaysUnfoldedNodeFlagsAction.tooltip=Sprije\u010Di rasklapnje za trenutno rasklopljene \u010Dvorove
SetImageByFileChooserAction.text=Slike (Pretra\u017Eiva\u010D datoteka ili veza)...
SetLinkAnchorAction.text=Postavi sidro veze (linka)
SetLinkAnchorAction.tooltip=<html>postavi ozna\u010Deni \u010Dvor kao sidro za budu\u0107e <br/>stvaranje lokalnih ili globalnih veza (linkova).
@@ -1693,12 +1805,13 @@ simplyhtml.valignMiddle=Sredina
simplyhtml.valignTop=Gore
simplyhtml.wholeWordsOnly=Samo cijele rije\u010Di
simplyhtml.wholeWordsOnly.tooltip=Ograni\u010Di uspore\u0111ivanje na cijelu rije\u010D.
-SortNodes.text=Ra&zvrstavanje Djece abecednim redom
+SortNodes.text=Razvrstavanje Djece abecednim redom
SortNodes.tooltip=Razvrstavanje svih \u010Dvora Djece abecednim redom.
split=&Razdijeli
SplitConditionAction.text=Razdijeli
-SplitNode.text=&Podijeli \u010Dvor
+SplitNode.text=Podijeli \u010Dvor
SplitNode.tooltip=<html>Dijeli trenutni \u010Dvor na poziciji pokaziva\u010Da mi\u0161a</html>
+SplitToWordsAction.text=Razdvoji sa {0} rije\u010Di u retku
STANDARD_FORMAT=Standard
stop_processing=Stop
StringFlavorHandler=Obi\u010Dan tekst kao hijerarhija \u010Dvorova
@@ -1731,27 +1844,39 @@ styles.subtopic=Podtema
styles.topic=Glavna tema
styles.user-defined=Korisni\u010Dki definirani stilovi
styles.website=WEB stranica
+styles_background_html=\n <html>\n <head>\n </head>\n <body>\n <table width="800" style="text-align: left; vertical-align: top">\n <tr valign="top">\n <th>\n <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold">\n About this style set\n </div>\n <div style="text-align: left; font-weight: normal">\n <div style="margin: 3pt">\n Ovaj standard je razvijen nakon 11 godina pedago\u0161kog istra\u017Eivanja kako proces usva [...]
styles_menu=Stilovi
submenu_keystroke_in_use_error=Tipkovni\u010Da kratica {0} nemo\u017Ee biti kori\u0161tena za podizbornik {1}. Tipkovni\u010Dka kratica je maknuta.
summary_nodes=\u010Cvorovi sa\u017Eetak
summary_not_possible=Ne mogu stvoriti \u010Dvor sa\u017Eetak za trenutni odabir
-SummaryNodeAction.text=\u010Cvor sa\u017Eetak
svg=SVG
template_dir=Predlo\u0161ci
+TextAlignAction.CENTER.text=Centrirani tekst
+TextAlignAction.DEFAULT.text=Zadano
+TextAlignAction.LEFT.text=Poravnaj tekst ulijevo
+TextAlignAction.RIGHT.text=Poravnaj tekst desno
+textalignment=Poravnavanje teksta
TimeListAction.text=Prika\u017Ei popis vremenskih podsjetnika ...
TimeListAction.tooltip=Prikazuje sve vremenske podsjetnike i pripadaju\u0107e \u010Dvorove.
TimeManagementAction.text=Prika\u017Ei kalendar...
TimeManagementAction.tooltip=<html> Prika\u017Ei kalendarski modul (autora je Kai Toedter).</html>
+TimePeriodUnits.days=dani
+TimePeriodUnits.hours=sati
+TimePeriodUnits.minutes=minute
+TimePeriodUnits.ms=ms
+TimePeriodUnits.seconds=sekunde
+TimePeriodUnits.weeks=tjedni
ToggleChildrenFoldedAction.text=Rasklopi/Sklopi \u010Dvor (Djeca)
ToggleDetailsAction.text=Prika\u017Ei/Sakrij detalje \u010Dvora
ToggleFBarAction.text=F- traka
ToggleFoldedAction.text=Rasklopi/Sklopi odabrane \u010Dvorove
ToggleFullScreenAction.text=Cijeli zaslon
-ToggleLeftToolbarAction.text=&Traka s ikonama
-ToggleMenubarAction.text=&Izborna traka
+ToggleLeftToolbarAction.text=Traka s ikonama
+ToggleMenubarAction.text=Izborna traka
ToggleScrollbarsAction.text=Kliza\u010Di
ToggleStatusAction.text=Prika\u017Ei statusnu traku
-ToggleToolbarAction.text=&Alatna traka
+ToggleToolbarAction.text=Alatna traka
+toolbars=Alatne trake
undefined_error=Do\u0161lo je do neo\u010Dekivane gre\u0161ke. Molim poku\u0161ajte poslati poruku o gre\u0161ci.
underline=Podcrtano
UnderlineAction.text=Podcrtano
@@ -1789,11 +1914,14 @@ user_defined_zoom_status_bar=Izmjena pove\u0107anja na korisni\u010Dki definiran
user_icon=Korisni\u010Dka ikona "{0}"
user_template_dir=Korisni\u010Dki predlo\u0161ci
user_zoom=Faktor pove\u0107anja ispisa (0.0 - 2.0):
+userScripts=Skripte
value_format=Oblik vrijednost
version_up_to_date=Trenutno koristite najnoviju verziju programa
-ViewerControllerAction.text=Vanjski objekt...
+view=P&ogled
ViewLayoutTypeAction.OUTLINE.text=Op\u0107i pregled
+web_resources=WEB izvori
WebDocuAction.text=Web dokumentacija
+WhatsNewAction.text=\u0160to je novo u u verziji 1.5.x
width=\u0160irina
wrong_regexp=Pogre\u0161an RegEx "{0}", gre\u0161ka {1}
xslt_export.html=HTML dokument
@@ -1806,5 +1934,6 @@ xslt_export.ms_word=Word 2003 XML format
xslt_export.text=Jednostavan tekst
xslt_export_not_possible=Freeplane XSLT izvoz nije mogu\u0107
yes=&Da
+zoom=Pove\u0107anje
ZoomInAction.text=Pove\u0107aj
ZoomOutAction.text=Smanji
diff --git a/freeplane/resources/translations/Resources_hu.properties b/freeplane/resources/translations/Resources_hu.properties
index 20cd30e..68d2598 100644
--- a/freeplane/resources/translations/Resources_hu.properties
+++ b/freeplane/resources/translations/Resources_hu.properties
@@ -35,6 +35,7 @@ actual_node_styles=A pontra \u00E9rv\u00E9nyes felt\u00E9teles pont st\u00EDluso
add=&Hozz\u00E1ad\u00E1s
AddConnectorAction.text=\u00D6sszek\u00F6t\u00E9s
AddElementaryConditionAction.text=Hozz\u00E1ad\u00E1s
+AddExecutionLinkAction.text=Op.rendszer utas\u00EDt\u00E1st futtat\u00F3 hivatkoz\u00E1s hozz\u00E1ad\u00E1sa...
AddLocalLinkAction.text=Helyi hivatkoz\u00E1s hozz\u00E1ad\u00E1sa
AddMenuItemLinkAction.text=Men\u00FCpont hivatkoz\u00E1s hozz\u00E1ad\u00E1sa...
AddOnDetailsPanel.authored.by=K\u00E9sz\u00EDtette: {0}
@@ -83,8 +84,8 @@ antialias_all=Minden elem \u00E9lsim\u00EDt\u00E1sa
antialias_edges=\u00C9lek \u00E9lsim\u00EDt\u00E1sa
antialias_none=Ne sim\u00EDtson
apply=&Alkalmaz
-ApplyAction.text=&Alkalmaz
-ApplyFormatPlugin.text=Form\u00E1tum &m\u00F3dos\u00EDt\u00E1sa...
+ApplyAction.text=Alkalmaz
+ApplyFormatPlugin.text=Form\u00E1tum m\u00F3dos\u00EDt\u00E1sa...
ApplyFormatPlugin.tooltip=Megjelen\u00EDt egy p\u00E1rbesz\u00E9dablakot, melyben a pont \u00E9s \u00E9l attrib\u00FAtumok egy l\u00E9p\u00E9sben m\u00F3dos\u00EDthat\u00F3k.
ApplyNoFilteringAction.text=Nincs sz\u0171r\u00E9s
ApplySelectedViewConditionAction.text=Sz\u0171r\u00E9s a kiv\u00E1lasztott pontokra
@@ -97,6 +98,7 @@ attribute_delete_value=Aktu\u00E1lis \u00E9rt\u00E9k t\u00F6rl\u00E9se
attribute_font_size_tooltip=Bet\u0171m\u00E9ret attrib\u00FAtum
attribute_list_box_label_text=L\u00E9tez\u0151 \u00E9rt\u00E9kek
attribute_name=Attrib\u00FAtum n\u00E9v
+attribute_name_or_value=Attrib\u00FAtum n\u00E9v vagy \u00E9rt\u00E9k
attribute_replace=Csere erre
attribute_top=Minden ismert attrib\u00FAtum a bet\u00F6lt\u00F6tt t\u00E9rk\u00E9pekre
attribute_value=Attrib\u00FAtum \u00E9rt\u00E9ke
@@ -138,14 +140,19 @@ attributes_visible_tooltip=A N\u00E9zet men\u00FCben \u00E1ll\u00EDthat\u00F3, h
automatic_layout=Automatikus form\u00E1z\u00E1s
automatic_layout_disabled=letiltva
automatically_save_message=A t\u00E9rk\u00E9p automatikusan ment\u00E9sre ker\u00FClt {0} n\u00E9ven...
+AutomaticEdgeColor.FOR_BRANCHES=\u00E1gakhoz
+AutomaticEdgeColor.FOR_COLUMNS=oszlopokhoz
+AutomaticEdgeColor.FOR_LEVELS=szintekhez
+AutomaticEdgeColor.ON_BRANCH_CREATION=\u00E1g l\u00E9trehoz\u00E1sakor
AutomaticEdgeColorHookAction.text=Automatikus \u00E9l sz\u00EDn
AutomaticLayout.ALL=minden pontra
AutomaticLayout.HEADINGS=a nem-lev\u00E9l pontokra
AutomaticLayout.level={0}. szint
AutomaticLayout.level.root=Gy\u00F6k\u00E9r
-AutomaticLayoutAction.text=Szintst\u00EDlusok &alkalmaz\u00E1sa
+AutomaticLayoutAction.text=Szintst\u00EDlusok alkalmaz\u00E1sa
AutomaticLayoutAction.tooltip=<html>A t\u00E9rk\u00E9p megjelen\u00E9s\u00E9t egys\u00E9ges\u00EDti. <br>Az els\u0151 szint fekete lesz, a m\u00E1sodik k\u00E9k, stb.</html>
AutomaticLayoutControllerAction.ALL.text=minden pontra
+AutomaticLayoutControllerAction.COLUMNS.text=oszlopokhoz
AutomaticLayoutControllerAction.HEADINGS.text=a nem-lev\u00E9l pontokra
AutomaticLayoutControllerAction.null.text=letiltva
BackAction.text=Vissza
@@ -162,10 +169,12 @@ branch=\u00C1g
browse=Tall\u00F3z\u00E1s...
calendar_attributes_panel=Napt\u00E1r \u00E9s attrib\u00FAtumok
calendar_panel=Napt\u00E1r
+can_not_clone_encrypted_node=Nem siker\u00FClt lem\u00E1solni a titkos\u00EDtott pontokat
can_not_connect_to_info_server=Nem siker\u00FClt csatlakozni az inform\u00E1ci\u00F3s szerverhez
can_not_delete_predefined_style=Be\u00E9p\u00EDtett st\u00EDlust nem lehet t\u00F6r\u00F6lni
can_not_delete_root_style=A gy\u00F6k\u00E9r st\u00EDlus nem t\u00F6r\u00F6lhet\u0151
can_not_delete_style_group=St\u00EDluscsoport nem t\u00F6r\u00F6lhet\u0151
+can_not_encrypt_cloned_node=Nem siker\u00FClt titkos\u00EDtani a lem\u00E1solt pontokat
can_not_save_key_set=A gyorsbillenty\u0171 profil nem menthet\u0151
cancel=M\u00E9gsem
CancelAction.text=M\u00E9gsem
@@ -173,6 +182,7 @@ cannot_add_parent_diff_parents=Ehhez a funkci\u00F3hoz a pontoknak k\u00F6z\u00F
cannot_add_parent_to_root=A gy\u00F6k\u00E9rpont nem adhat\u00F3 hozz\u00E1 \u00FAj sz\u00FCl\u0151h\u00F6z.
cannot_delete_root=A gy\u00F6k\u00E9r pontot nem lehet t\u00F6r\u00F6lni vagy kiv\u00E1gni.
cannot_join_nodes_with_children=A pontok nem egyes\u00EDthet\u0151k a gyermekeikkel
+cannot_move_into_child_node=Nem siker\u00FClt \u00E1thelyezni a gyermek pontba
cannot_move_to_child=Egy pontot nem lehet a gyermekei k\u00F6z\u00E9 \u00E1thelyezni.
CenterAction.text=K\u00F6z\u00E9pre
CenterSelectedNodeAction.text=Kiv\u00E1lasztott pont k\u00F6z\u00E9pre helyez\u00E9se
@@ -197,8 +207,10 @@ choose_node_background_color=V\u00E1lassza ki a pont h\u00E1tt\u00E9rsz\u00EDn\u
choose_node_color=V\u00E1lassza ki a pont sz\u00EDn\u00E9t:
ClearLinkAnchorAction.text=Horgony t\u00F6rl\u00E9se
ClearLinkAnchorAction.tooltip=<html>kor\u00E1bban be\u00E1ll\u00EDtott horgony t\u00F6rl\u00E9se</html>
+CloneAction.text=M\u00E1solat beilleszt\u00E9se
close_btn=&Bez\u00E1r
CloseAction.text=Bez\u00E1r\u00E1s
+cloud_shapes=Felh\u0151 form\u00E1k
CloudAction.text=Felh\u0151 besz\u00FAr\u00E1sa/t\u00F6rl\u00E9se
CloudColorAction.text=Felh\u0151 sz\u00EDne...
CloudShapeAction.ARC.text=\u00CDves
@@ -215,14 +227,15 @@ connector_label=\u00D6sszek\u00F6t\u0151 felirat
connector_lines=\u00D6sszek\u00F6t\u0151 vonal
connector_shapes=\u00D6sszek\u00F6t\u0151 form\u00E1ja
ConnectorColorAction.text=\u00D6sszek\u00F6t\u0151 sz\u00EDne...
+ConvertCloneToIndependentNodeAction.text=M\u00E1solat f\u00FCggetlenn\u00E9 t\u00E9tele
CopyAction.text=M\u00E1sol\u00E1s
CopyAction.tooltip=Az kijel\u00F6lt pont \u00E9s alatta a teljes \u00E1g m\u00E1sol\u00E1sa v\u00E1g\u00F3lapra
-CopyAttributes.text=&Attrib\u00FAtumok m\u00E1sol\u00E1sa
+CopyAttributes.text=Attrib\u00FAtumok m\u00E1sol\u00E1sa
CopyIDAction.text=Pont azonos\u00EDt\u00F3 m\u00E1sol\u00E1sa
CopyMapStylesAction.text=T\u00E9rk\u00E9pst\u00EDlus m\u00E1sol\u00E1sa...
CopyNodeURIAction.text=Pont URI m\u00E1sol\u00E1sa
-copyright=Copyright \u00A9 2000-2014 A Freeplane csapata \u00E9s m\u00E1sok
-CopySingleAction.text=Pont m\u00E1&sol\u00E1sa
+copyright=Copyright \u00A9 2000-2016 A Freeplane csapata \u00E9s m\u00E1sok
+CopySingleAction.text=Pont m\u00E1sol\u00E1sa
CopySingleAction.tooltip=Csak a kiv\u00E1lasztott pont m\u00E1sol\u00E1sa
CopyStyleExtensionsAction.text=St\u00EDluspont kiterjeszt\u00E9seinek m\u00E1sol\u00E1sa
corrupt_map=A t\u00E9rk\u00E9p tartalma s\u00E9r\u00FClt
@@ -236,13 +249,15 @@ CutAction.text=Kiv\u00E1g\u00E1s
decrease_branch_font_size=Kisebb bet\u0171
DecreaseNodeFontAction.text=Kisebb bet\u0171
default=Alap\u00E9rtelmezett
+defaultAuxiliaryWordList=a, the, of
DefaultColorAction.text=Alap\u00E9rtelmezett sz\u00EDn
+defaultstyle.attributes=Attrib\u00FAtumok
defaultstyle.details=R\u00E9szletek
defaultstyle.floating=Lebeg\u0151 pont
defaultstyle.note=Megjegyz\u00E9s
delete=&T\u00F6rl\u00E9s
delete_child=Pont t\u00F6rl\u00E9se
-DeleteAction.text=Pon&t elt\u00E1vol\u00EDt\u00E1sa
+DeleteAction.text=Pont elt\u00E1vol\u00EDt\u00E1sa
DeleteConditionAction.text=T\u00F6rl\u00E9s
DeleteDetailsAction.text=Pont r\u00E9szletek elt\u00E1vol\u00EDt\u00E1sa
DeleteLevelStyleAction.text=Szintst\u00EDlus elt\u00E1vol\u00EDt\u00E1sa
@@ -264,7 +279,9 @@ edge=\u00C9l
edge_is_formatted_by_style=Az \u00E9lek form\u00E1tum\u00E1t st\u00EDlus szab\u00E1lyozza. Szerkessze a vonatkoz\u00F3 st\u00EDlust, ha sz\u00FCks\u00E9ges.
edge_style=\u00C9l st\u00EDlusa
edge_width=\u00C9l vastags\u00E1ga
+edge_widths=\u00C9lvastags\u00E1gok
EdgeColorAction.text=\u00C9l sz\u00EDne...
+EdgeProperties=\u00C9l jellemz\u0151i
EdgeStyleAction.bezier.text=\u00CDves (b\u00E9zier)
EdgeStyleAction.bezier.tooltip=<html>\u00C9l megjelen\u00EDt\u00E9se \u00EDvesen.</html>
EdgeStyleAction.hide_edge.text=\u00C9l elrejt\u00E9se
@@ -290,6 +307,7 @@ edit_label_font_family=Bet\u0171k\u00E9szlet
edit_label_font_size=Bet\u0171m\u00E9ret
edit_link_manually=Hivatkoz\u00E1s k\u00E9zi szerkeszt\u00E9se...
edit_long_node=Pont szerkeszt\u00E9se p\u00E1rbesz\u00E9dablakban
+edit_middle_label=<html>K\u00F6z\u00E9ps\u0151<br>c\u00EDmke
edit_note=Megjegyz\u00E9s szerkeszt\u00E9se
edit_source_label=<html>Forr\u00E1s<br>c\u00EDmke
edit_target_label=<html>C\u00E9l<br>c\u00EDmke
@@ -304,9 +322,11 @@ EditLongAction.text=Pont szerkeszt\u00E9se p\u00E1rbesz\u00E9dablakban
EditNoteInDialogAction.text=Megjegyz\u00E9s szerkeszt\u00E9se p\u00E1rbesz\u00E9dablakban
EditScript=Szkript szerkeszt\u00E9se...
EditStylesAction.text=St\u00EDlusok szerkeszt\u00E9se
-EncryptedMap.text=\u00DAj &v\u00E9dett (titkos\u00EDtott) t\u00E9rk\u00E9p...
+EncryptedMap.text=\u00DAj v\u00E9dett (titkos\u00EDtott) t\u00E9rk\u00E9p...
EncryptedMap.tooltip=\u00DAj v\u00E9dett t\u00E9rk\u00E9p
+encryption=Titkos\u00EDt\u00E1s
enter_base_url=Most relat\u00EDv linkeket fogok beilleszteni. K\u00E9rem, adja meg a t\u00F6rzs URL-t.
+enter_command=Adjon meg egy parancsot
enter_condition_name=Adja meg a felt\u00E9tel nev\u00E9t
enter_confirms=Az Enterrel meger\u00F5s\u00EDted
enter_keyset_name=Adja meg a gyorsbillenty\u0171 profil nev\u00E9t
@@ -320,6 +340,8 @@ error_applying_template=Hiba az XSL sablon alkalmaz\u00E1sakor.
error_creating_directory=Nem lehetett l\u00E9trehozni a k\u00F6nyvt\u00E1rat az export\u00E1l\u00E1shoz.
error_in_template=Hib\u00E1k a(z) {0} alap\u00E9rtelmezett t\u00E9rk\u00E9psablonban. Pr\u00F3b\u00E1lja meg elt\u00E1vol\u00EDtani ezt a f\u00E1jlt.
errornumber={0} darab hiba
+ExecuteScript.available_modes_tooltip={0} el\u00E9rhet\u0151 erre
+ExecuteScript.script=Szkript
ExecuteScriptError.text=Hiba a szkript futtat\u00E1sakor:\n{0}
ExecuteScriptForAllNodes.text=Minden szkript futtat\u00E1sa
ExecuteScriptForSelectionAction.text=Kijel\u00F6lt pontok szkriptjeinek futtat\u00E1sa
@@ -333,7 +355,7 @@ export_failed=Hib\u00E1s export\u00E1l\u00E1s
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable vector graphic (SVG)
export_using_xslt=Freeplane Export
-ExportAction.text=&Export\u00E1l\u00E1s...
+ExportAction.text=Export\u00E1l\u00E1s...
ExportBranchAction.text=\u00C1g \u00E1thelyez\u00E9se \u00FAj t\u00E9rk\u00E9pbe...
ExportBranchToHTMLAction.text=\u00C1g export HTML-k\u00E9nt
exported_file={0} f\u00E1jl
@@ -353,10 +375,11 @@ ExternalImageChangeAction.text=K\u00E9p cser\u00E9je...
ExternalImageRemoveAction.text=K\u00E9p elt\u00E1vol\u00EDt\u00E1sa
ExtractLinkFromTextAction.text=Sz\u00F6veg konvert\u00E1l\u00E1sa linkk\u00E9
ExtractLinkFromTextAction.tooltip=Hivatkoz\u00E1s be\u00E1ll\u00EDt\u00E1sa a pont sz\u00F6vegben tal\u00E1lhat\u00F3 linkb\u0151l
+extras=&Eszk\u00F6z\u00F6k
f_button_unassigned=<nincs m\u0171velet>
FaqOpenURLAction.text=GYIK
file=&F\u00E1jl
-file_already_exists=A(z) {0} f\u00E1jl m\u00E1r l\u00E9tezik. Szeretn\u00E9d fel\u00FCl\u00EDrni azt?
+file_already_exists=A(z) {0} f\u00E1jl m\u00E1r l\u00E9tezik. Szeretn\u00E9 fel\u00FCl\u00EDrni azt?
file_not_found=A(z) {0} f\u00E1jl nem tal\u00E1lhat\u00F3
FileListFlavorHandler=F\u00E1jlokra mutat\u00F3 linkek
FileProperties_BranchLeafCount=Lev\u00E9lpontok sz\u00E1ma a kijel\u00F6lt \u00E1g(ak)ban:
@@ -372,7 +395,7 @@ FileProperties_NodeSelectionCount=Kijel\u00F6lt pontok sz\u00E1ma:
FileProperties_TotalFilteredCount=Ennyi pont teljes\u00EDti a sz\u0171r\u0151t:
FileProperties_TotalLeafCount=Lev\u00E9lpontok sz\u00E1ma \u00F6sszesen:
FileProperties_TotalNodeCount=Pontok sz\u00E1ma \u00F6sszesen:
-FilePropertiesAction.text=&T\u00E9rk\u00E9p statisztik\u00E1k...
+FilePropertiesAction.text=T\u00E9rk\u00E9p statisztik\u00E1k...
FileRevisionsDialog.cancel=&M\u00E9gsem
FileRevisionsDialog.file_last_modified=Id\u0151pont
FileRevisionsDialog.file_name=F\u00E1jln\u00E9v
@@ -383,10 +406,12 @@ FileRevisionsDialog.question={0} f\u00E1jl m\u00F3dos\u00EDt\u00E1sai
FileRevisionsDialog.restore=&Vissza\u00E1ll\u00EDt\u00E1s
FileRevisionsDialog.restore.tooltip={0} cser\u00E9je {1}-re
FileRevisionsDialog.title=F\u00E1jlm\u00F3dos\u00EDt\u00E1sok
-filter=Sz\u0171r\u0151
+filter=Sz\u0171&r\u0151
filter_add=&Hozz\u00E1ad\u00E1s
filter_and=&\u00C9s
filter_any_text=T\u00F6rzs, r\u00E9szletek vagy megjegyz\u00E9s
+filter_clone_snapshot=A kijel\u00F6l\u00E9s elmentett m\u00E1solatai
+filter_clones=A kijel\u00F6l\u00E9s m\u00E1solatai
filter_conditions=Sz\u0171r\u0151k
filter_contains=Tartalmazza
filter_created_after=K\u00E9s\u0151bb keletkezett, mint
@@ -433,26 +458,33 @@ filter_selected_node_view=Kiv\u00E1lasztott pontok
filter_selected_node_view_snapshot=Mentett kijel\u00F6l\u00E9s
filter_style=St\u00EDlus
filter_time=D\u00E1tumsz\u0171r\u0151
-FilterComposerDialog.save=&Ment\u00E9s
+FilterCondition=Sz\u0171r\u0151felt\u00E9telek
+filterConditions=Felhaszn\u00E1l\u00F3i sz\u0171r\u0151k
+filterConditions.noActions=N\u00E9vtelen sz\u0171r\u0151k
filters_not_loaded=A sz\u0171r\u0151 nem t\u00F6lthet\u0151 be, s\u00E9r\u00FClt f\u00E1jl
+find=Keres\u00E9s
find_what=Keresend\u0151
FindAction.text=Keres\u00E9s...
-FirstGroupNodeAction.text=\u00D6sszegz\u0151 pont (csoport kezdete)
+FindNextAction.text=K\u00F6vetkez\u0151 keres\u00E9se
+FindPreviousAction.text=El\u0151z\u0151 keres\u00E9se
+fit_background_to_page=H\u00E1tt\u00E9rk\u00E9p igaz\u00EDt\u00E1sa egy oldalra
fit_map_to_page=F\u00E9rjen el egy oldalon
fit_map_to_page_height=&Magass\u00E1g igaz\u00EDt\u00E1sa egy oldalra
fit_map_to_page_width=&Sz\u00E9less\u00E9g igaz\u00EDt\u00E1sa egy oldalra
-FitToPage.text=&Igaz\u00EDt\u00E1s az ablak m\u00E9ret\u00E9hez
+FitToPage.text=Igaz\u00EDt\u00E1s az ablak m\u00E9ret\u00E9hez
FitToPage.tooltip=\u00DAgy \u00E1ll\u00EDtja be a nagy\u00EDt\u00E1st, hogy a t\u00E9rk\u00E9p \u00E9ppen elf\u00E9rjen az ablakban.
fold=Behajt\u00E1s
FoldAllAction.text=Minden behajt\u00E1sa
FoldAllAction.tooltip=<html>Behajtja a kijel\u00F6lt pontokat minden gyermek\u00FCkkel egy\u00FCtt.</html>
FoldOneLevelAction.text=Egy szint behajt\u00E1sa
FoldOneLevelAction.tooltip=<html>A kijel\u00F6lt pontokon behajt egy szintet.</html>
-follow_graphical_link=Ugr\u00E1s ide:
+follow_clone=Ezen bel\u00FCl: ''{0}''
+follow_graphical_link=Ugr\u00E1s ide: ''{0}''
FollowLinkAction.text=Hivatkoz\u00E1s k\u00F6vet\u00E9se
font=Bet\u0171
FontFamilyAction.text=bet\u0171csal\u00E1d
FontSizeAction.text=bet\u0171m\u00E9ret
+format=F&orm\u00E1tum
format_invalid_pattern=Nem megfelel\u0151 minta
format_menu_cloud_shapes=Felh\u0151 hozz\u00E1ad\u00E1sa vagy m\u00F3dos\u00EDt\u00E1sa
format_menu_edge_styles=&\u00C9l st\u00EDlusa
@@ -470,11 +502,13 @@ formula.EvaluateAllAction.tooltip=Minden k\u00E9plet \u00FAjrasz\u00E1mol\u00E1s
formula.menuname=K\u00E9pletek
formula_editor=K\u00E9plet szerkeszt\u00E9se
ForwardAction.text=El\u0151re
+ForwardAction.tooltip=El\u0151reugrik a kijel\u00F6l\u00E9si l\u00E1ncban
FreeNodeAction.text=Szabadon elhelyezhet\u0151 pont (ki/be)
Freeplane.progress.buildScreen=K\u00E9perny\u0151 fel\u00E9p\u00EDt\u00E9se...
Freeplane.progress.createController=Vez\u00E9rl\u0151 l\u00E9trehoz\u00E1sa...
Freeplane.progress.createInitialMode=Kezdeti \u00FCzemm\u00F3d l\u00E9trehoz\u00E1sa...
Freeplane.progress.endStartup=Ind\u00EDt\u00E1s v\u00E9ge.
+Freeplane.progress.gettingPreferenceDirectories=Be\u00E1ll\u00EDt\u00E1sok k\u00F6nyvt\u00E1rainak beolvas\u00E1sa...
Freeplane.progress.gettingPreferences=Be\u00E1ll\u00EDt\u00E1sok bet\u00F6lt\u00E9se...
Freeplane.progress.loadMaps=T\u00E9rk\u00E9pek bet\u00F6lt\u00E9se...
Freeplane.progress.propagateLookAndFeel=Megjelen\u00E9s...
@@ -485,6 +519,8 @@ freeplane_reverted=Freeplane_Visszaford\u00EDtva_
FreeplaneHelpStarter.text=Online s\u00FAg\u00F3...
FreeplaneHelpStarter.tooltip=Freeplane s\u00FAg\u00F3
GettingStartedAction.text=Oktat\u00F3anyag
+goto=Ugr\u00E1s
+goto.noActions=Nincs c\u00E9l pont
GotoLinkNodeAction.text=Ugr\u00E1s hivatkoz\u00E1sra
GotoNodeAction.text=Ugr\u00E1s adott azonos\u00EDt\u00F3j\u00FA pontra...
GrabKeyDialog.common.cancel=M\u00E9gsem
@@ -500,7 +536,7 @@ help=&S\u00FAg\u00F3
HideableAction.tooltip=<html>Minden megv\u00E1ltozott pont h\u00E1ttere megjel\u00F6l\u00E9sre ker\u00FCl.</html>
HideAllAttributesAction.text=Minden attrib\u00FAtum elrejt\u00E9se
HierarchicalIcons2Action.text=Mutassa a gyerek ikonok \u00E1tfed\u00E9s\u00E9t
-HierarchicalIconsAction.text=Ikonok &hierarchikus mutat\u00E1sa
+HierarchicalIconsAction.text=Ikonok hierarchikus mutat\u00E1sa
HierarchicalIconsAction.tooltip=Ha valamelyik (ak\u00E1r k\u00F6zvetett) gyermeken van ikon, kicsiny\u00EDtve megjelenik itt is.
hot_keys=Gyorsbillenty\u0171k
hot_keys_table=Gyorsbillenty\u0171k t\u00E1bl\u00E1zata
@@ -640,19 +676,21 @@ IconProgressIconUpAction.text=K\u00E9sz\u00FClts\u00E9g emel\u00E9se
IconProgressIconUpAction.tooltip=Felvesz egy k\u00E9sz\u00FClts\u00E9gjelz\u0151t vagy emeli a k\u00E9sz\u00FClts\u00E9get (0% -> 25% -> 50% -> 75% -> 100% + OK).
IconProgressRemoveAction.text=K\u00E9sz\u00FClts\u00E9gjelz\u0151 t\u00F6rl\u00E9se
IconProgressRemoveAction.tooltip=K\u00E9sz\u00FClts\u00E9gjelz\u0151 \u00E9s kiterjesztett k\u00E9sz\u00FClts\u00E9gjelz\u0151 t\u00F6rl\u00E9se.
+icons=Ikonok
IconSelectionPlugin.text=Ikon kiv\u00E1laszt\u00E1sa t\u00E1bl\u00E1zatb\u00F3l...
IconSelectionPlugin.tooltip=<html>Itt egy alablak seg\u00EDts\u00E9g\u00E9vel v\u00E1laszthat\u00F3 ki egy ikon.</html>
image_covertLink=Hivatkoz\u00E1s konvert\u00E1l\u00E1sa k\u00E9pp\u00E9
ImageFlavorHandler=K\u00E9p (haszn\u00E1ljon k\u00FCl\u00F6n f\u00E1jlt)
-import=Import\u00E1l\u00E1s
+import=I&mport\u00E1l\u00E1s
import_linked_branch_no_link=A kijel\u00F6lt pont nem tartalmaz olyan import\u00E1lhat\u00F3 linket.
-ImportAction.text=&Import\u00E1l\u00E1s
+ImportAction.text=Import\u00E1l\u00E1s
ImportBranchAction.text=&\u00C1g...
-ImportExplorerFavoritesAction.text=&B\u00F6ng\u00E9sz\u00F5 kedvencek...
-ImportFolderStructureAction.text=&Mappastrukt\u00FAra...
-ImportLinkedBranchAction.text=&Hivatkozott \u00E1g import\u00E1l\u00E1sa
-ImportLinkedBranchWithoutRootAction.text=Hivatkozott \u00E1g &gy\u00F6k\u00E9rpont n\u00E9lk\u00FCl...
-ImportMindmanagerFiles.text=&MindManager X5 t\u00E9rk\u00E9p...
+ImportExplorerFavoritesAction.text=B\u00F6ng\u00E9sz\u00F5 kedvencek...
+ImportFolderStructureAction.text=Mappastrukt\u00FAra...
+ImportLinkedBranchAction.text=Hivatkozott \u00E1g import\u00E1l\u00E1sa
+ImportLinkedBranchWithoutRootAction.text=Hivatkozott \u00E1g gy\u00F6k\u00E9rpont n\u00E9lk\u00FCl...
+ImportMindmanagerFiles.text=MindManager X5 t\u00E9rk\u00E9p...
+ImportXmlFile.text=xml f\u00E1jl import\u00E1l\u00E1sa
increase_branch_font_size=Nagyobb bet\u0171
IncreaseNodeFontAction.text=Nagyobb bet\u0171
internal_error_tooltip=Bels\u0151 hiba t\u00F6rt\u00E9nt. Tov\u00E1bbi inform\u00E1ci\u00F3\u00E9rt kattintson a legut\u00F3bbi log.0 napl\u00F3f\u00E1jl megnyit\u00E1s\u00E1hoz.
@@ -664,18 +702,28 @@ invalid_url_msg=Nem hozhat\u00F3 l\u00E9tre \u00E9rv\u00E9nyes URL ebb\u0151l {0
ItalicAction.text=D\u0151lt
italicise_branch=D\u0151ltt\u00E9
java_version=Java verzi\u00F3: {0}
-JoinNodesAction.text=Pontok egyes\u00EDt\u00E9se
+JoinNodesAction.separator.format="{0}" \u00F6sszekapcsol\u00E1sa pontokkal
+lastOpenedMaps=Legut\u00F3bbi t\u00E9rk\u00E9pek
+lastOpenedMaps.noActions=Nem tal\u00E1lhat\u00F3k t\u00E9rk\u00E9pek az el\u0151zm\u00E9nyekben
latex_editor=LaTeX Formula szerkeszt\u00E9se
-LatexDeleteLatexAction.text=LaTe&X formula elt\u00E1vol\u00EDt\u00E1sa
-LatexEditLatexAction.text=&LaTeX formula szerkeszt\u00E9se...
-LatexInsertLatexAction.text=&LaTeX formula hozz\u00E1ad\u00E1sa...
+LatexDeleteLatexAction.text=LaTeX formula elt\u00E1vol\u00EDt\u00E1sa
+LatexEditLatexAction.text=LaTeX formula szerkeszt\u00E9se...
+LatexInsertLatexAction.msg1=<html>Egy <i>elavult</i> LaTeX formul\u00E1t pr\u00F3b\u00E1l besz\u00FArni.<br/>A LaTeX sz\u00F6veg/formula l\u00E9trehoz\u00E1s\u00E1nak \u00FAj m\u00F3dszere itt olvashat\u00F3:</html>
+LatexInsertLatexAction.msg2=<html>R\u00F6viden: <ul><li>haszn\u00E1ljon "\\latex " prefixet a pont sz\u00F6veg\u00E9ben vagy</li><li><i>N\u00E9zet->Jellemz\u0151k panel</i>, majd <i>T\u00F6rzssz\u00F6veg->Form\u00E1tum->LaTeX</i></li></ul></html>
+LatexInsertLatexAction.text=LaTeX formula hozz\u00E1ad\u00E1sa...
latexPatternFormat=LaTeX
+LengthUnits.cm=cm
+LengthUnits.in="
+LengthUnits.mm=mm
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=Linkek l\u00E9trehoz\u00E1s\u00E1hoz legal\u00E1bb k\u00E9t pontot kell kijel\u00F6lnie.
license=Licenc: GPL 2 vagy \u00FAjabb
license_text=<html>Ez a program szabad szoftver; terjeszthet\u0151 illetve m\u00F3dos\u00EDthat\u00F3 a<br>Free Software Foundation \u00E1ltal kiadott GNU General Public License<br>dokumentum\u00E1ban le\u00EDrtak; ak\u00E1r a licenc 2-es,<br> ak\u00E1r (tetsz\u0151leges) k\u00E9s\u0151bbi v\u00E1ltozata szerint.<br><br>Ez a program abban a rem\u00E9nyben ker\u00FCl k\u00F6zread\u00E1sra, hogy hasznos lesz,<br>de minden egy\u00E9b GARANCIA N\u00C9LK\u00DCL, az<br>ELADHAT\u00D3S\u00C1GRA [...]
link_error=Hib\u00E1s hivatkoz\u00E1s, "{0}" nem lett bet\u00F6ltve
link_not_available_any_more=A hivatkoz\u00E1s t\u00F6bb\u00E9 nem \u00E9rv\u00E9nyes. A k\u00F6zbens\u0151 pont t\u00F6r\u00F6lve lett.
link_not_found={0} hivatkoz\u00E1s nem tal\u00E1lhat\u00F3.
+links=Hivatkoz\u00E1s
load=Bet\u00F6<\u00E9s
load_accelerator_presets=Bet\u00F6lt\u00E9s
LoadAcceleratorPresetsAction.textPatterns.text=Sz\u00F6vegmint\u00E1k
@@ -685,6 +733,7 @@ locking_old_lock_removed=A(z) {0} t\u00E9rk\u00E9pet {1} m\u00E1r lez\u00E1rta.
long_node_changed_cancel=Megv\u00E1ltoztatta a pontot. Szeretn\u00E9 elvetni a v\u00E1ltoztat\u00E1sokat?
long_node_changed_submit=Megv\u00E1ltoztatta a pontot. Menteni szeretn\u00E9 a v\u00E1ltoztat\u00E1sokat?
lots_of_links_warning=Egyszerre sok linket k\u00EDv\u00E1n l\u00E9trehozni ugyanazon ponthoz. Biztosan l\u00E9tre szeretn\u00E9 hozni ezeket a linkeket?
+main_menu=Men\u00FC
main_resource_directory=Nyelvi f\u00E1jlok: {0}
MainView.errorUpdateText=Hiba t\u00F6rt\u00E9nt a k\u00F6vetkez\u0151 sor ki\u00E9rt\u00E9kel\u00E9sekor: "{0}".
MakeLinkFromAnchorAction.text=Hivatkoz\u00E1s l\u00E9trehoz\u00E1sa a horgonyt\u00F3l
@@ -723,15 +772,20 @@ ManageAddOnsDialog.tab.manage.themes=T\u00E9m\u00E1k
ManageAddOnsDialog.tab.manage.themes.tooltip=Telep\u00EDtett t\u00E9m\u00E1k kezel\u00E9se
ManageAddOnsDialog.tab.manage.tooltip=Telep\u00EDtett kiterjeszt\u00E9sek kezel\u00E9se
ManageAddOnsDialog.visit.addon.page=Kiterjeszt\u00E9sek oldal\u00E1nak felkeres\u00E9se...
-ManageConditionalStylesAction.text=&T\u00E9rk\u00E9p felt\u00E9teles st\u00EDlusainak kezel\u00E9se
-ManageNodeConditionalStylesAction.text=&Pont felt\u00E9teles st\u00EDlusainak kezel\u00E9se
+ManageConditionalStylesAction.text=T\u00E9rk\u00E9p felt\u00E9teles st\u00EDlusainak kezel\u00E9se
+ManageNodeConditionalStylesAction.text=Pont felt\u00E9teles st\u00EDlusainak kezel\u00E9se
map_already_exists=A t\u00E9rk\u00E9p m\u00E1r l\u00E9tezik. Szeretn\u00E9d fel\u00FCl\u00EDrni?
+map_background=T\u00E9rk\u00E9p h\u00E1ttere
+map_background_image=H\u00E1tt\u00E9rk\u00E9p
map_corrupted=A t\u00E9rk\u00E9p hib\u00E1s. \u00C9rdekelnek a r\u00E9szletek?
map_load_error=Nem siker\u00FClt bet\u00F6lteni a(z) {0} t\u00E9rk\u00E9pet
map_locked_by_open=A(z) {0} t\u00E9rk\u00E9pet m\u00E1r {1} is szerkeszti. Megnyitom csak olvashat\u00F3k\u00E9nt.
map_locked_by_save_as=A(z) {0} t\u00E9rk\u00E9pet m\u00E1r {1} is szerkeszti. A Ment\u00E9s ez\u00E9rt le lett \u00E1ll\u00EDtva.
map_not_saved=A t\u00E9rk\u00E9p m\u00E9g nem volt lementve.
-MapBackgroundColorAction.text=T\u00E9rk\u00E9p h\u00E1tt\u00E9rsz\u00EDne
+MapBackgroundClearAction.text=T\u00F6rl\u00E9s
+MapBackgroundColorAction.text=H\u00E1tt\u00E9rsz\u00EDn
+MapBackgroundImageAction.text=H\u00E1tt\u00E9rk\u00E9p...
+maps=T\u00E9rk\u00E9pek
MaxNodeWidth.text=Pont maxim\u00E1lis sz\u00E9less\u00E9g\u00E9nek megad\u00E1sa
menu_applyStyle=St\u00EDlus alkalmaz\u00E1sa
menu_attributes=&Attrib\u00FAtum
@@ -743,10 +797,6 @@ menu_displayAttributes=Pont attrib\u00FAtumok
menu_encryption=Jelsz\u00F3v\u00E9delem
menu_error=Hiba a felhaszn\u00E1l\u00F3i men\u00FC strukt\u00FAr\u00E1ban {0}:\n{1}\nA folyamat meg lesz szak\u00EDtva
menu_extensions=Pont kiterjeszt\u00E9sek
-menu_extras=&Eszk\u00F6z\u00F6k
-menu_file_import=Import\u00E1l\u00E1s
-menu_filter=Sz\u0171&r\u0151
-menu_format=F&orm\u00E1tum
menu_group=Pont csoport
menu_hoverView=Inform\u00E1ci\u00F3s bubor\u00E9kok (tool tip)
menu_iconByCategory=Ikon kiv\u00E1laszt\u00E1sa kateg\u00F3ri\u00E1kb\u00F3l...
@@ -754,26 +804,20 @@ menu_iconView=Ikonok
menu_image=K\u00E9p
menu_insert=Beilleszt\u00E9s
menu_latex_formula=LaTeX formula
-menu_links=Hivatkoz\u00E1s
menu_manageStyles=&St\u00EDlusok kezel\u00E9se
menu_moveNode=Mozgat\u00E1s \u00E9s rendez\u00E9s
-menu_navigate=Na&vig\u00E1l\u00E1s
menu_newNode=\u00DAj pont
menu_node=Pont
menu_node_features=Pont t&ulajdons\u00E1gok
menu_nodes=Po&ntok
menu_nodeView=Pont t\u00F6rzs
-menu_notes=Megjegyz\u00E9s
menu_noteView=Megjegyz\u00E9sek
menu_openmaps=T\u00E9rk\u00E9pek
-menu_progress=K\u00E9sz\u00FClts\u00E9gjelz\u0151 ikon (%)
menu_remove_icons=Ikonok elt\u00E1vol\u00EDt\u00E1sa
menu_removeAttribute=Attrib\u00FAtum elt\u00E1vol\u00EDt\u00E1sa
menu_select=Kijel\u00F6l\u00E9s
menu_time=Id\u0151gazd\u00E1lkod\u00E1s
menu_title=Pont t\u00F6rzs
-menu_toolbars=Eszk\u00F6zt\u00E1rak
-menu_view=&N\u00E9zet
menu_viewmode=Megjelen\u00EDt\u00E9si m\u00F3dok
MenuUtils.invalid_menuitem=A(z) "{0}" nem \u00E9rv\u00E9nyes men\u00FC elem kulcs.
mindmap=T\u00E9rk\u00E9p
@@ -787,18 +831,21 @@ mode_File=F\u00E1jlm\u00F3d
mode_MindMap=Elmet\u00E9rk\u00E9p m\u00F3d
mode_na=Az \u00FCzemm\u00F3d nem el\u00E9rhet\u00F5
mode_status=Az \u00FCzemm\u00F3d megv\u00E1ltozott erre: {0}
+mode_StyleMap=St\u00EDlus szerkeszt\u00E9se
mode_title=Freeplane - {0} \u00FCzemm\u00F3d
modes=M\u00F3dok
ModesMenuAction.Browse.text=T\u00E9rk\u00E9pb\u00F6ng\u00E9sz\u0151
ModesMenuAction.File.text=F\u00E1jlkezel\u0151
ModesMenuAction.MindMap.text=Elmet\u00E9rk\u00E9p szerkeszt\u0151
most_recent_files=Legut\u00F3bbi f\u00E1jlok
+MoveAction.text=\u00C1thelyez\u00E9s
MoveToRootAction.text=Ugr\u00E1s a gy\u00F6k\u00E9rhez
NameConditionAction.text=N\u00E9v megad\u00E1sa
+navigate=Na&vig\u00E1l\u00E1s
NavigationNextMapAction.text=K\u00F6vetkez\u0151 t\u00E9rk\u00E9p
NavigationPreviousMapAction.text=El\u00F5z\u00F5 T\u00E9rk\u00E9p
new=&\u00DAj
-new_map_from_user_templates.text=\u00DAj &t\u00E9rk\u00E9p sablonb\u00F3l...
+new_map_from_user_templates.text=\u00DAj t\u00E9rk\u00E9p sablonb\u00F3l...
new_mindmap=\u00DAj elmet\u00E9rk\u00E9p
new_node=\u00DAj pont
new_node_as_sibling_not_possible_for_the_root=A gy\u00F6k\u00E9rponthoz nem hozhat\u00F3 l\u00E9tre \u00FAj testv\u00E9rpont
@@ -815,11 +862,11 @@ NewerFileRevisionsFoundDialog.question=\u00DAjabb v\u00E1ltozat tal\u00E1lhat\u0
NewerFileRevisionsFoundDialog.restore=&Vissza\u00E1ll\u00EDt\u00E1s
NewerFileRevisionsFoundDialog.restore.tooltip={0} cser\u00E9je {1}-re
NewerFileRevisionsFoundDialog.title=\u00DAjabb f\u00E1jlv\u00E1ltozatok tal\u00E1lhat\u00F3k!
-NewFreeNodeAction.text=\u00DAj szabad pont
+NewFreeNodeAction.text=\u00DAj lebeg\u0151 pont
NewLevelStyleAction.text=Szint t\u00EDpus hozz\u00E1ad\u00E1sa
newmap.install.addon.question={0} kiterjeszt\u00E9snek t\u0171nik\nSzeretn\u00E9 telep\u00EDteni?\n(V\u00E1lassza a "Nem"-et norm\u00E1l megnyit\u00E1shoz.)
newmap.install.addon.title=Telep\u00EDti a kiterjeszt\u00E9st?
-NewMapAction.text=\u00DA&j t\u00E9rk\u00E9p
+NewMapAction.text=\u00DAj t\u00E9rk\u00E9p
NewMapViewAction.text=\u00DAj t\u00E9rk\u00E9pn\u00E9zet
NewParentNode.text=\u00DAj sz\u00FCl\u0151pont
NewParentNode.tooltip=<html>A teljes kijel\u00F6l\u00E9s \u00FAj sz\u00FCl\u0151 al\u00E1 ker\u00FCl.</html>
@@ -844,10 +891,11 @@ node=Pont
node_changed_discard_changes=Megv\u00E1ltoztatta a pontot. Szeretn\u00E9 elvetni a v\u00E1ltoztat\u00E1sokat?
node_is_write_protected=A c\u00E9l-pont \u00EDr\u00E1sv\u00E9dett.
node_location_help=H\u00FAz\u00E1ssal m\u00F3dos\u00EDthat\u00F3 a pont helye, Ctrl+h\u00FAz\u00E1ssal a t\u00E1vols\u00E1gok, dupla kattint\u00E1ssal \u00E9s Ctrl+dupla kattint\u00E1ssal vissza\u00E1ll\u00EDthat\u00F3 az eredeti \u00E1llapotuk.
+node_popup_scripting=Szkriptek
node_selector=Pont kiv\u00E1laszt\u00E1sa
node_selector_message=Duplakattint\u00E1s a pont kiv\u00E1laszt\u00E1s\u00E1hoz
node_styles=Pont st\u00EDlusok
-NodeBackgroundColorAction.text=Pont &h\u00E1tt\u00E9rsz\u00EDne...
+NodeBackgroundColorAction.text=Pont h\u00E1tt\u00E9rsz\u00EDne...
NodeColorAction.text=Pont sz\u00EDne...
NodeColorBlendAction.text=Kit\u00F6lt\u00E9s sz\u00EDne
NodeDownAction.text=Pont mozgat\u00E1sa lefel\u00E9
@@ -855,21 +903,31 @@ NodeExtensions.EditNodeExtensions=Pont kiterjeszt\u00E9sek szerkeszt\u00E9se
NodeExtensions.RemoveNodeExtensions=Pont kiterjeszt\u00E9sek elt\u00E1vol\u00EDt\u00E1sa
NodeListAction.text=Keres \u00E9s cser\u00E9l...
NodeListAction.tooltip=Minden pont megjelen\u00EDt\u00E9se kereshet\u0151 listak\u00E9nt sz\u0171r\u00E9si jellemz\u0151kkel.
-NodeShapeAction.bubble.text=&Bubor\u00E9k
+NodeShapeAction.bubble.text=Bubor\u00E9k
NodeShapeAction.fork.text=El\u00E1gaz\u00E1s
+NodeShapeAction.narrow_hexagon.text=Keskeny hexagon
+NodeShapeAction.oval.text=Ov\u00E1lis
+NodeShapeAction.rectangle.text=T\u00E9glalap
+NodeShapeAction.small_bubble.text=Kis bubor\u00E9k
+NodeShapeAction.small_wide_hexagon.text=Kis hexagon
+NodeShapeAction.wide_hexagon.text=Sz\u00E9les hexagon
NodeUpAction.text=Pont mozgat\u00E1sa felfel\u00E9
-NodeWidthAction.text=Pont sz\u00E9less\u00E9gi tartom\u00E1ny megad\u00E1sa
nonboldify_branch=F\u00E9lk\u00F6v\u00E9r ki
nonitalicise_branch=D\u00F5lt ki
normal=Norm\u00E1l
not_saved_for_image_error=A t\u00E9rk\u00E9pet le kell menteni ahhoz, hogy egy k\u00E9pet ki lehessen v\u00E1lasztani
not_saved_for_link_error=A t\u00E9rk\u00E9pet el kell menteni ahhoz, hogy linket lehessen v\u00E1lasztani a f\u00E1jlv\u00E1laszt\u00F3b\u00F3l
note_window_location=Megjegyz\u00E9spanel poz\u00EDci\u00F3ja
+notes=Megjegyz\u00E9s
+NotificationOptions.CLOSE=Bez\u00E1r\u00E1s
+NotificationOptions.REMIND_ME_LATER=Eml\u00E9keztet\u00E9s k\u00E9s\u0151bb
+NotificationOptions.REMOVE_REMINDER=Eml\u00E9keztet\u0151 t\u00F6rl\u00E9se
+NotificationOptions.SELECT_NODE=Eml\u00E9keztet\u0151re ugr\u00E1s
ok=Rendben
OKAction.text=Rendben
OnlineReference.text=Online document\u00E1ci\u00F3s t\u00E9rk\u00E9pek
open_asMindMap=Elmet\u00E9rk\u00E9p
-OpenAction.text=&Megnyit\u00E1s...
+OpenAction.text=Megnyit\u00E1s...
OpenFreeplaneSiteAction.text=Freeplane honlap
OpenMapsAddLocation.text=OpenMaps hely hozz\u00E1ad\u00E1sa...
OpenMapsRemoveLocation.text=OpenMaps hely t\u00F6rl\u00E9se
@@ -883,6 +941,7 @@ OptionalDontShowMeAgainDialog.dontShowAgain=&Ez az ablak ne jelenjen meg legk\u0
OptionalDontShowMeAgainDialog.ok=&Igen
OptionalDontShowMeAgainDialog.rememberMyDescision=&Eml\u00E9kezzen erre a be\u00E1ll\u00EDt\u00E1sra.
OptionPanel.absolute=Abszol\u00FAt
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=Szintst\u00EDlus mint\u00E1k
OptionPanel.ADD_CHILD=Gyermekpont hozz\u00E1ad\u00E1sa
OptionPanel.ADD_SIBLING=Testv\u00E9rpont hozz\u00E1ad\u00E1sa
OptionPanel.addons=Kiterjeszt\u00E9sek
@@ -892,6 +951,7 @@ OptionPanel.always_load_last_maps.tooltip=Legut\u00F3bbi f\u00E1jlok megnyit\u00
OptionPanel.always_save_folding=Mindig
OptionPanel.always_save_folding_state=Mindig mentse el a kihajt\u00E1si \u00E1llapotv\u00E1ltoz\u00E1sokat
OptionPanel.always_save_folding_state.tooltip=Ha be van \u00E1ll\u00EDtva, akkor minden kihajt\u00E1s \u00E9s behajt\u00E1s v\u00E1ltoz\u00E1snak sz\u00E1m\u00EDt, \u00E9s figyelmeztetni fogja a t\u00E9rk\u00E9p ment\u00E9s\u00E9re.
+OptionPanel.always_show_less_than_N_nodes_after_load=Egyes pontokat kihajt
OptionPanel.always_unfold_all_after_load=Mindent kihajt
OptionPanel.antialias=\u00C9lsim\u00EDt\u00E1s
OptionPanel.antialias.tooltip=<html>Hat\u00E1ssal van a t\u00E9rk\u00E9p min\u0151s\u00E9g\u00E9re. T\u00F6bb \u00E9lsim\u00EDt\u00E1s t\u00F6bb id\u0151t vesz ig\u00E9nybe.</html>
@@ -903,7 +963,7 @@ OptionPanel.apply_system_screen_resolution=Rendszer-felbont\u00E1s haszn\u00E1la
OptionPanel.approximate_search_threshold=T\u0171r\u00E9s a k\u00F6r\u00FCl-bel\u00FCli egyez\u00E9shez
OptionPanel.approximate_search_threshold.tooltip=<html>T\u0171r\u00E9s a k\u00F6r\u00FCl-bel\u00FCli egyez\u00E9shez<br/><font size="2">l\u00E1sd a http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>oldalt (magasabb \u00E9rt\u00E9kre kevesebb<br/>tal\u00E1latot eredm\u00E9nyez)</html>
OptionPanel.ar=Arab / \u0627\u0644\u0639\u0631\u0628\u064A\u0629
-OptionPanel.ARC=Arc
+OptionPanel.ARC=\u00CDv
OptionPanel.as_parent=Mint a sz\u00FCl\u0151
OptionPanel.ask=K\u00E9rdezze meg
OptionPanel.automatic=Automatikus
@@ -921,6 +981,7 @@ OptionPanel.check_updates_automatically=Friss\u00EDt\u00E9sek keres\u00E9se ind\
OptionPanel.childpattern=Gyerek minta
OptionPanel.childpattern.tooltip=A kiv\u00E1lasztott minta minden gyerek objektumra alkalmaz\u00E1sra ker\u00FCl.
OptionPanel.clear_all_setters=Minden v\u00E1ltoztat\u00E1sa
+OptionPanel.clear_all_setters.tooltip=Enged\u00E9lyezi vagy tiltja az \u00F6sszes v\u00E1ltoz\u00E1sjelz\u00E9st.
OptionPanel.cloud=Felh\u0151
OptionPanel.cloudcolor=Felh\u0151 sz\u00EDne
OptionPanel.cloudshape=Felh\u0151 alakja
@@ -928,6 +989,8 @@ OptionPanel.combined=Kombin\u00E1lt
OptionPanel.compare_as_number=Hasonl\u00EDt\u00E1s sz\u00E1mk\u00E9nt
OptionPanel.convert_to_current_version=<html>Automatikusan konvert\u00E1lja a r\u00E9gebbi Freeplane verzi\u00F3j\u00FA t\u00E9rk\u00E9peket <br>az aktu\u00E1lis verzi\u00F3ra?</html>
OptionPanel.convert_to_current_version.tooltip=html>Csak nagyon nagy t\u00E9rk\u00E9pekhez, amik nem ig\u00E9nyelnek konverzi\u00F3t <br>(ehhez szak\u00E9rt\u0151i tud\u00E1s kell) a t\u00E9rk\u00E9pek megnyithat\u00F3k konverzi\u00F3 n\u00E9lk\u00FCl.</html>
+OptionPanel.copyFormatToNewSibling=Form\u00E1tum m\u00E1sol\u00E1sa az \u00FAj testv\u00E9robjektumokra
+OptionPanel.copyFormatToNewSiblingIncludesIcons=Form\u00E1tum m\u00E1sol\u00E1sa ikonokkal
OptionPanel.cs=Cseh / \u010Desky
OptionPanel.cut_nodes_without_question=Kiv\u00E1ghat\u00F3ak a pontok meger\u0151s\u00EDt\u00E9s k\u00E9r\u00E9se n\u00E9lk\u00FCl?
OptionPanel.cut_nodes_without_question.tooltip=Ezt a jel\u00F6l\u0151n\u00E9gyzetet be\u00E1ll\u00EDtva r\u00E1k\u00E9rdez\u00E9s n\u00E9lk\u00FCl kiv\u00E1ghat\u00F3k a pontok. Ez v\u00E9letlen t\u00F6rl\u00E9shez is vezethet.
@@ -949,6 +1012,7 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>Windows alatt (a ""
OptionPanel.default_browser_command_windows_nt=Alap\u00E9rtelmezett b\u00F6ng\u00E9sz\u0151parancs (Windows NT)
OptionPanel.default_browser_command_windows_nt.tooltip=<html>Windows alatt (a "" jelek az "=" karaktert tartalmaz\u00F3 URL hivatkoz\u00E1sok miatt kellenek).</html>
OptionPanel.default_charset=Karakterk\u00E9szlet
+OptionPanel.default_save_dir=Alap\u00E9rtelmezett ment\u00E9si k\u00F6nyvt\u00E1r
OptionPanel.Defaults=Alap\u00E9rtelmez\u00E9sek
OptionPanel.delete_automatic_saves_at_exit=Automatikus ment\u00E9sek t\u00F6rl\u00E9se kil\u00E9p\u00E9skor
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html>\u00C1ll\u00EDtsa igaz \u00E9rt\u00E9kre, ha szeretn\u00E9, hogy a Freeplane norm\u00E1l bez\u00E1r\u00E1sakor t\u00F6rl\u0151djenek a f\u00E1jlok</html>
@@ -980,6 +1044,7 @@ OptionPanel.en=Angol / English
OptionPanel.Environment=K\u00F6rnyezet
OptionPanel.es=Spanyol, kaszt\u00EDliai / espa\u00F1ol, castellano
OptionPanel.et=\u00C9szt / eesti, eesti keel
+OptionPanel.eu=Baszk
OptionPanel.execute_scripts_without_asking=Szkript futtat\u00E1s enged\u00E9lyez\u00E9se
OptionPanel.execute_scripts_without_asking.tooltip=<html>A Freeplane szkriptek alapvet\u0151en b\u00E1rmilyen m\u0171veletet v\u00E9gre tudnak hajtani a sz\u00E1m\u00EDt\u00F3g\u00E9pen. <br>\u00C9ppen ez\u00E9rt ne futtasson olyan szkriptet, amir\u0151l nem gy\u0151z\u0151d\u00F6tt meg, hogy biztons\u00E1gos.</html>
OptionPanel.execute_scripts_without_exec_restriction=Enged\u00E9lyezi egy\u00E9b alkalmaz\u00E1sok futtat\u00E1s\u00E1t (NEM AJ\u00C1NLOTT)
@@ -997,6 +1062,7 @@ OptionPanel.export_icons_in_html.tooltip=<html> Megadja, hogy a HTML exportban l
OptionPanel.exported_image_resolution_dpi=Export\u00E1lt k\u00E9p felbont\u00E1sa (DPI-ben)
OptionPanel.Files=F\u00E1jlok
OptionPanel.first=Els\u0151k\u00E9nt
+OptionPanel.fit_to_viewport=H\u00E1tt\u00E9rk\u00E9p igaz\u00EDt\u00E1sa az ablakhoz
OptionPanel.fold_on_click_inside=Behajt\u00E1s pontba kattint\u00E1ssal
OptionPanel.foldingsymbolwidth=Behajt\u00E1si jel sz\u00E9less\u00E9ge
OptionPanel.foldingsymbolwidth.tooltip=<html>Behajt\u00E1st jelz\u0151 k\u00F6r sz\u00E9less\u00E9ge</html>
@@ -1029,6 +1095,7 @@ OptionPanel.ic_file=Lemezre ker\u00FClj\u00F6n
OptionPanel.ic_ram=Tartsa mem\u00F3ri\u00E1ban (RAM)
OptionPanel.icon=Ikon
OptionPanel.icon.tooltip=Ha alkalmaz\u00E1sra ker\u00FCl, a pontnak pont ez lesz az ikonja.
+OptionPanel.icons.list=Megjelen\u00EDtett alap ikonok list\u00E1ja
OptionPanel.icons.list.tooltip=Itt rendezheti vagy tilthatja az alap ikonokat. Az ikonokat ';'-vel kell elv\u00E1lasztani.
OptionPanel.id=Indon\u00E9z / Bahasa Indonesia
OptionPanel.IGNORE=Ne t\u00F6rt\u00E9njen semmi
@@ -1036,6 +1103,7 @@ OptionPanel.il__enter_confirms_by_default=Az Enter alap\u00E9rtelmezetten meger\
OptionPanel.image_cache=k\u00E9pek sz\u00E1m\u00E1ra
OptionPanel.it=Olasz / Italiano
OptionPanel.ja=Jap\u00E1n / \u65E5\u672C\u8A9E
+OptionPanel.JoinNodesAction.textSeparators=Sz\u00F6veg elv\u00E1laszt\u00F3
OptionPanel.key_type_action=G\u00E9pel\u00E9skor
OptionPanel.Keystrokes=Gyorsbillenty\u0171k
OptionPanel.ko=Koreai / \uD55C\uAD6D\uC5B4 (\u97D3\u570B\u8A9E), \uC870\uC120\uB9D0 (\u671D\u9BAE\u8A9E)
@@ -1074,6 +1142,7 @@ OptionPanel.max_shortened_text_length=Maxim\u00E1lis r\u00F6vid sz\u00F6veg sz\u
OptionPanel.metal=F\u00E9mes
OptionPanel.min_node_width=Minim\u00E1lis pont sz\u00E9less\u00E9g
OptionPanel.motif=Motif
+OptionPanel.narrow_hexagon=Keskeny hexagon
OptionPanel.nb=Norv\u00E9g Bokm\u00E5l / Norsk bokm\u00E5l
OptionPanel.never_save_folding=Soha
OptionPanel.nl=Holland, flamand / Nederlands, Vlaams
@@ -1088,11 +1157,12 @@ OptionPanel.nodefontitalic=D\u0151lt
OptionPanel.nodefontname=Bet\u0171csal\u00E1d
OptionPanel.nodefontsize=Bet\u0171m\u00E9ret
OptionPanel.nodeformat=Form\u00E1tum
+OptionPanel.nodeformat.tooltip=<html>Sz\u00F6veg cser\u00E9je \u00E9s/vagy form\u00E1z\u00E1sa:<ul><li><em> Sablon kiterjeszt\u00E9s</em> (<tt>%s</tt> az eredeti sz\u00F6veg), pl. <tt>KER\u00DCLJE: %s</tt><li><em>D\u00E1tumok \u00E9s sz\u00E1mok form\u00E1z\u00E1s\u00E1t</em> - p\u00E9ld\u00E1k a kiv\u00E1laszt\u00E1si dobozban</ul></html>
OptionPanel.nodenumbering=Pont sz\u00E1moz\u00E1s
OptionPanel.nodenumbering.tooltip=Hozz\u00E1adja a sorsz\u00E1mot (pl.: 1.3.1) a pont sz\u00F6veg\u00E9hez.
-OptionPanel.nodeshape=Pont st\u00EDlus
-OptionPanel.nodeshape.tooltip=<html>A st\u00EDlus adja meg egy pont k\u00FCls\u0151 form\u00E1j\u00E1t. <br>Lehets\u00E9ges \u00E9rt\u00E9kek:<br><table border="1"><tr><td>El\u00E1gaz\u00E1s: </td><td> keret n\u00E9lk\u00FCl,</td></tr><tr><td>Bubor\u00E9k: </td><td> t\u00E9glalap alak\u00FA keret a pont k\u00F6r\u00FCl,</td></tr><tr><td>\u00D6r\u00F6kl\u00E9s: </td><td> st\u00EDlus \u00F6r\u00F6kl\u00E9se a sz\u00FCl\u0151 pontt\u00F3l <br>vagy az alap\u00E9rtelmezett gy\u00F6k\u00E9r st [...]
+OptionPanel.nodeshape=Pont alakja
OptionPanel.nodetext=T\u00F6rzssz\u00F6veg
+OptionPanel.nodetext.tooltip=Pont sz\u00F6veg\u00E9nek megad\u00E1sa. Alkalmaz\u00E1s ut\u00E1n az el\u0151z\u0151 sz\u00F6veg t\u00F6r\u00F6lve lesz.
OptionPanel.nothing=Semmi
OptionPanel.number_format=Alap\u00E9rtelmezett sz\u00E1mform\u00E1tum
OptionPanel.number_format.tooltip=Minta melyben a '#' opcion\u00E1lis a '0' k\u00F6telez\u0151 sz\u00E1mjegyeket jel\u00F6l. Pl: "0.00", "0.0%", "$#.00", "#0"
@@ -1106,9 +1176,14 @@ OptionPanel.org.freeplane.plugin.bugreport.denied=Soha ne jelentse
OptionPanel.org.freeplane.plugin.bugreport.userid=Opcion\u00E1lis azonos\u00EDt\u00F3, ami bek\u00FCld\u00E9sre ker\u00FCl
OptionPanel.outline_hgap=V\u00EDzszintes t\u00E1vols\u00E1g
OptionPanel.outline_vgap=F\u00FCgg\u0151leges t\u00E1vols\u00E1g
+OptionPanel.oval=Ov\u00E1lis
OptionPanel.paint_connectors_behind=\u00D6sszek\u00F6t\u0151k kirajzol\u00E1sa a pontok m\u00F6g\u00E9
OptionPanel.parse_data=Sz\u00E1mok \u00E9s d\u00E1tum-id\u0151 \u00E9rt\u00E9kek felismer\u00E9se a bevitt adatokban
OptionPanel.parse_data.tooltip=Megpr\u00F3b\u00E1lja \u00E9rtelmezni a d\u00E1tum, d\u00E1tum-id\u0151 \u00E9s sz\u00E1m bemeneteket \u00E9s alkalmazni a megfelel\u0151 form\u00E1z\u00E1st. Pl: 100,000.00, 12/31, 12/31/99, 1999-12-31 \u00E9s 1999-12-31 23:59
+OptionPanel.parse_formulas=Formul\u00E1k felismer\u00E9se
+OptionPanel.parse_formulas.tooltip=Formul\u00E1k feldolgoz\u00E1sa a '=' karakterrel kezd\u0151d\u0151 pontok eset\u00E9n: L\u00E1sd a http://www.freeplane.org/wiki/index.php/Formulas oldalt.
+OptionPanel.parse_latex=LaTeX felismer\u00E9s
+OptionPanel.parse_latex.tooltip=LaTeX formul\u00E1k felismer\u00E9se form\u00E1tum vagy prefix alapj\u00E1n: L\u00E1sd a http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane oldalt.
OptionPanel.PASTE_HTML=Beilleszt\u00E9s HTML-k\u00E9nt
OptionPanel.PASTE_PLAIN_TEXT=Beilleszt\u00E9s egyszer\u0171 sz\u00F6vegk\u00E9nt
OptionPanel.path_property_may_not_be_empty=Az \u00FAtvonal tulajdons\u00E1g nem lehet \u00FCres! A v\u00E1ltoztat\u00E1s nem ker\u00FClt ment\u00E9sre.
@@ -1126,8 +1201,13 @@ OptionPanel.printonwhitebackground.tooltip=<html>Nyomtat\u00E1shoz mindig feh\u0
OptionPanel.pt_BR=Portug\u00E1l (Braz\u00EDlia) / Portugu\u00EAs (Brasil)
OptionPanel.pt_PT=Portug\u00E1l (Portug\u00E1lia) / Portugu\u00EAs (Portugal)
OptionPanel.RECT=n\u00E9gysz\u00F6g
+OptionPanel.rectangle=T\u00E9glalap
OptionPanel.relative=Relat\u00EDv
+OptionPanel.remind_type_of_new_nodes.tooltip=<html>"Ask" will ask you (use in doubt).<br>"Igen" megjelen\u00EDti a sz\u00F6vegszerkeszt\u0151t.<br>"Nem" megjelen\u00EDti az egyszer\u0171 sz\u00F6vegszerkeszt\u0151t.</html>
OptionPanel.remind_use_rich_text_in_new_nodes=Form\u00E1zott sz\u00F6veg haszn\u00E1lata a beillesztett pontokhoz
+OptionPanel.remindersBlink=Villog\u00F3 eml\u00E9keztet\u0151k
+OptionPanel.remindersShowNotifications=Felugr\u00F3 ablakok eml\u00E9keztet\u0151h\u00F6z
+OptionPanel.remindersStandardDelay=Eml\u00E9keztet\u0151 k\u00E9sleltet\u00E9se
OptionPanel.remove_notes_without_question=K\u00E9rd\u00E9s n\u00E9lk\u00FCl t\u00E1vol\u00EDtsa el a megjegyz\u00E9seket?
OptionPanel.remove_notes_without_question.tooltip=Ezt a jel\u00F6l\u0151n\u00E9gyzetet be\u00E1ll\u00EDtva r\u00E1k\u00E9rdez\u00E9s n\u00E9lk\u00FCl t\u00F6r\u00F6lhet\u0151k a kiv\u00E1lasztott pontokhoz tartoz\u00F3 megjegyz\u00E9sek. Ez v\u00E9letlen t\u00F6rl\u00E9shez is vezethet.
OptionPanel.resources_use_default_font_for_notes_too=Alap\u00E9rtelmezett bet\u0171k\u00E9szlet haszn\u00E1lata a megjegyz\u00E9sekre is
@@ -1138,6 +1218,7 @@ OptionPanel.ROUND_RECT=Lekerek\u00EDtett n\u00E9gysz\u00F6g
OptionPanel.ru=Orosz / \u0420\u0443\u0441\u0441\u043A\u0438\u0439
OptionPanel.save_folding=Behajt\u00E1s ment\u00E9se
OptionPanel.save_folding_if_map_is_changed=Ha a t\u00E9rk\u00E9p m\u00F3dosult
+OptionPanel.save_last_visited_node=Utols\u00F3 poz\u00EDci\u00F3 ment\u00E9se a t\u00E9rk\u00E9pen
OptionPanel.save_modification_times=M\u00F3dos\u00EDt\u00E1si id\u0151k ment\u00E9se
OptionPanel.script_classpath=Szkript oszt\u00E1lyok mapp\u00E1i (l\u00E1sd az inform\u00E1ci\u00F3s bubor\u00E9kot)
OptionPanel.script_classpath.tooltip=<html>JAR f\u00E1jlok \u00E9s mapp\u00E1k list\u00E1ja amik hozz\u00E1ad\u00E1sra ker\u00FClnek a szkiptek oszt\u00E1ly \u00FAtvonal\u00E1hoz.<br>Haszn\u00E1ljon ; (Windows) vagy : (Linux, Mac) \u00E9rt\u00E9keket a bejegyz\u00E9sek elv\u00E1laszt\u00E1s\u00E1ra.<br>A mapp\u00E1kban JAR \u00E9s .class f\u00E1jlokat keres a program.<br>Azok az \u00FAtvonalak amik nem abszol\u00FAtak, a Freeplane felhaszn\u00E1l\u00F3i mapp\u00E1j\u00E1hoz lesznek relat [...]
@@ -1149,8 +1230,9 @@ OptionPanel.script_user_key_name_for_signing=Az al\u00E1\u00EDr\u00E1sra haszn\u
OptionPanel.script_user_key_name_for_signing.tooltip=<html>Ha al\u00E1 szeretn\u00E9 \u00EDrni a szkriptjeit, itt adhatja meg a kulcs alias\u00E1t. <br>A kulcsnak az alap\u00E9rtelmezett kulcst\u00E1rban kell lennie. <br>A titkos kulcs jelszav\u00E1nak meg kell egyeznie a kulcst\u00E1r jelszav\u00E1val (ez az alap\u00E9rtelmez\u00E9s).</html>
OptionPanel.scrollbar_increment=Sebess\u00E9g
OptionPanel.scrolling_speed=Automatikus t\u00E9rk\u00E9p mozgat\u00E1si sebess\u00E9g
+OptionPanel.scrollOnUnfold=T\u00E9rk\u00E9p g\u00F6rget\u00E9se pont behajt\u00E1sa ut\u00E1n
OptionPanel.selection_method=Kijel\u00F6l\u00E9si m\u00F3d
-OptionPanel.selection_method.tooltip=<html> Ezzel a v\u00E1laszt\u00E1ssal enged\u00E9lyezheti/tilthatja a k\u00E9sleltetett kiv\u00E1laszt\u00E1s s\u00E9m\u00E1t. Auto options. Do not modify these as they will be saved to auto.properties anyway.</html>
+OptionPanel.selection_method.tooltip=<html> Ezzel a v\u00E1laszt\u00E1ssal enged\u00E9lyezheti/tilthatja a k\u00E9sleltetett kiv\u00E1laszt\u00E1s s\u00E9m\u00E1t. Automatikus lehet\u0151s\u00E9gek. Do not modify these as they will be saved to auto.properties anyway.</html>
OptionPanel.selection_method_by_click=Kattint\u00E1sra
OptionPanel.selection_method_delayed=K\u00E9sleltetett
OptionPanel.selection_method_direct=Azonnali
@@ -1182,6 +1264,8 @@ OptionPanel.separator.icon_properties=Ikonok
OptionPanel.separator.icons=Ikonok az "Ikon kiv\u00E1laszt\u00E1sa t\u00E1bl\u00E1zatb\u00F3l..." men\u00FCben
OptionPanel.separator.initial_map_size=Kezdeti t\u00E9rk\u00E9p m\u00E9ret
OptionPanel.separator.inline_editor=Pont helyben t\u00F6rt\u00E9n\u0151 szerkeszt\u00E9se
+OptionPanel.separator.JoinNodesAction=\u00D6sszek\u00F6t\u0151 pont
+OptionPanel.separator.key_typing=Billenty\u0171 le\u00FCt\u00E9s
OptionPanel.separator.language=Nyelv
OptionPanel.separator.latex=LaTeX
OptionPanel.separator.load=Bet\u00F6lt\u00E9s
@@ -1192,7 +1276,7 @@ OptionPanel.separator.node_editing_commands=Pont szerkeszt\u0151 parancsok
OptionPanel.separator.node_navigation_commands=Pont navig\u00E1l\u00E1si parancsok
OptionPanel.separator.NodeColors=Az eg\u00E9sz t\u00F6rzs sz\u00EDne
OptionPanel.separator.NodeFont=Az eg\u00E9sz t\u00F6rzs bet\u0171t\u00EDpusa
-OptionPanel.separator.NodeShape=Pont forma
+OptionPanel.separator.NodeShape=Pont alakja
OptionPanel.separator.NodeStyle=Pont st\u00EDlus
OptionPanel.separator.NodeText=T\u00F6rzssz\u00F6veg
OptionPanel.separator.notifications=Meger\u0151s\u00EDt\u00E9sek
@@ -1201,6 +1285,7 @@ OptionPanel.separator.other_defaults=Egy\u00E9b alap\u00E9rtelmez\u00E9sek
OptionPanel.separator.others=Egy\u00E9b gyorsbillenty\u0171k
OptionPanel.separator.outline_view=\u00C1ttekint\u0151 n\u00E9zet
OptionPanel.separator.patterns=Mint\u00E1k
+OptionPanel.separator.reminderOptions=Eml\u00E9keztet\u0151 be\u00E1ll\u00EDt\u00E1sai
OptionPanel.separator.RichTextEditor=Form\u00E1zott sz\u00F6veg szerkeszt\u0151
OptionPanel.separator.root_node_appearance=Gy\u00F6k\u00E9r pont megjelen\u00E9se
OptionPanel.separator.save=Ment\u00E9s
@@ -1212,6 +1297,7 @@ OptionPanel.separator.selection_method=Kijel\u00F6l\u00E9si m\u00F3d
OptionPanel.separator.single_instance_mode=Program fut\u00E1s m\u00F3d
OptionPanel.separator.size_limits=M\u00E9rethat\u00E1rok
OptionPanel.separator.spelling=Helyes\u00EDr\u00E1s-ellen\u0151rz\u0151 be\u00E1ll\u00EDt\u00E1sok
+OptionPanel.separator.SplitToWordsAction=Pont feloszt\u00E1sa szavakra
OptionPanel.separator.status=St\u00E1tuszsor
OptionPanel.separator.tooltip=Inform\u00E1ci\u00F3s bubor\u00E9k id\u0151k
OptionPanel.separator.undo=Visszavon\u00E1s
@@ -1219,9 +1305,14 @@ OptionPanel.separator.updates=Programfriss\u00EDt\u00E9sek
OptionPanel.set_property_text=M\u00F3dos\u00EDt
OptionPanel.set_property_text.tooltip=Jel\u00F6lje be, ha ezt a st\u00EDlusjellemz\u0151t a megadott \u00E9rt\u00E9kre szeretn\u00E9 m\u00F3dos\u00EDtani
OptionPanel.setscript=Megv\u00E1ltoztassuk?
+OptionPanel.setscript.tooltip=Szkriptet lehet t\u00E1rs\u00EDtani a st\u00EDlushoz.
+OptionPanel.shape_horizontal_margin=V\u00EDzszintes marg\u00F3
+OptionPanel.shape_vertical_margin=F\u00FCgg\u0151leges marg\u00F3
OptionPanel.sharp_bezier=\u00C9lesen lekerek\u00EDtett (bezier)
OptionPanel.sharp_linear=Hegyes egyenes
+OptionPanel.shouldCenterSmallMaps=Kis t\u00E9rk\u00E9pek k\u00F6z\u00E9pre igaz\u00EDt\u00E1sa
OptionPanel.show_icon_for_attributes=Attrib\u00FAtum jelz\u0151 ikon megjelen\u00EDt\u00E9se
+OptionPanel.show_less_than_N_nodes_by_default_after_load=Bet\u00F6lt\u00E9s t\u00E9rk\u00E9pb\u0151l vagy n\u00E9h\u00E1ny pont kibont\u00E1sa
OptionPanel.show_node_tooltips=Inform\u00E1ci\u00F3s bubor\u00E9kok (tool tip) mutat\u00E1sa
OptionPanel.show_note_icons=Megjegyz\u00E9s ikonok mutat\u00E1sa
OptionPanel.show_styles_in_tooltip=Pont st\u00EDlus mutat\u00E1sa az inform\u00E1ci\u00F3s bubor\u00E9kban (tool tip)
@@ -1237,12 +1328,19 @@ OptionPanel.single_instance_force.tooltip=Mindenk\u00E9pp ker\u00FClje el a t\u0
OptionPanel.sk=Szlov\u00E1k / sloven\u010Dina
OptionPanel.sl=Szlov\u00E9n / sloven\u0161\u010Dina
OptionPanel.slow_scroll_selected_node=Lass\u00FA g\u00F6rget\u00E9s a kijel\u00F6lt pontra
+OptionPanel.small_bubble=Kis bubor\u00E9k
+OptionPanel.small_wide_hexagon=Kis hexagon
OptionPanel.spelling_opt_case_sensitive=Kis- \u00E9s nagybet\u0171 k\u00FCl\u00F6nb\u00F6z\u0151
OptionPanel.spelling_opt_ignore_all_caps_words=Csupa nagybet\u0171s szavak kihagy\u00E1sa
OptionPanel.spelling_opt_ignore_capitalization=Nagy kezd\u0151bet\u0171s szavak kihagy\u00E1sa
OptionPanel.spelling_opt_ignore_words_with_numbers=Sz\u00E1mot tartalmaz\u00F3 szavak kihagy\u00E1sa
OptionPanel.spelling_opt_suggestions_limit_dialog=Javaslatok maxim\u00E1lis sz\u00E1ma a p\u00E1rbesz\u00E9dablakban
OptionPanel.spelling_opt_suggestions_limit_menu=Javaslatok maxim\u00E1lis sz\u00E1ma a men\u00FCben
+OptionPanel.SplitToWordsAction.auxiliaryWordList=k\u00F6t\u0151szavak list\u00E1ja
+OptionPanel.SplitToWordsAction.charactersAcceptedInWord=karakterek sz\u00E1ma a szavakban
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=az eredeti pont \u00FCresen hagy\u00E1sa
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=pont sz\u00E1ma a sorban
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=eredeti sz\u00F6veg ment\u00E9se r\u00E9szletk\u00E9nt
OptionPanel.sr=Szerb / \u0441\u0440\u043F\u0441\u043A\u0438
OptionPanel.standard_template=\u00C1ltal\u00E1nos sablon f\u00E1jl
OptionPanel.standardbackgroundcolor=\u00C1ltal\u00E1nos h\u00E1tt\u00E9rsz\u00EDn
@@ -1267,21 +1365,26 @@ OptionPanel.structured_icon_toolbar=Strukt\u00FAr\u00E1lt eszk\u00F6zt\u00E1r ik
OptionPanel.summary=\u00D6sszegz\u00E9s
OptionPanel.sv=Sv\u00E9d / svenska
OptionPanel.text.use_ctrl_key=Haszn\u00E1lja az Eszk\u00F6z\u00F6k men\u00FC 'Gyorsbillenty\u0171 be\u00E1ll\u00EDt\u00E1sa...' almen\u00FCt
+OptionPanel.textalignment=Sz\u00F6veg igaz\u00EDt\u00E1sa
OptionPanel.time_for_automatic_save=Automatikus ment\u00E9s gyakoris\u00E1ga
OptionPanel.time_for_automatic_save.tooltip=<html> k\u00E9t egym\u00E1st k\u00F6vet\u0151 ment\u00E9s k\u00F6z\u00F6tti id\u0151 (ezredm\u00E1sodpercben): Az automatikus ment\u00E9s kikapcsol\u00E1s\u00E1hoz \u00E1ll\u00EDtsa ezt az \u00E9rt\u00E9ket 2000000000-ra.</html>
OptionPanel.time_for_delayed_selection=K\u00E9sleltetett kijel\u00F6l\u00E9s ideje
OptionPanel.time_for_delayed_selection.tooltip=<html> Kijel\u00F6l\u00E9s k\u00E9sleltet\u00E9se az eg\u00E9r mutat\u00F3 pont f\u00F6l\u00E9 \u00E9r\u00E9se ut\u00E1n (milim\u00E1sodpercben). \u00C1ll\u00EDtsa 1-re ha azt szeretn\u00E9, hogy a kijel\u00F6l\u00E9s azonnal megt\u00F6rt\u00E9njen.</html>
OptionPanel.toolTipManager.dismissDelay=Elt\u0171n\u00E9s k\u00E9sleltet\u00E9se, ms
OptionPanel.toolTipManager.initialDelay=Megmutat\u00E1s k\u00E9sleltet\u00E9se, ms
-OptionPanel.toolTipManager.max_tooltip_width=Inform\u00E1ci\u00F3s bubor\u00E9k sz\u00E9less\u00E9ge
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>Gyorstipp ablakok alap\u00E9rtelmezett sz\u00E9less\u00E9ge pixelben.</html>
+OptionPanel.toolTipManager.max_tooltip_height=Inform\u00E1ci\u00F3s bubor\u00E9k maxim\u00E1lis magass\u00E1ga
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=Inform\u00E1ci\u00F3s bubor\u00E9k maxim\u00E1lis magass\u00E1ga pixelben.
+OptionPanel.toolTipManager.max_tooltip_width=Inform\u00E1ci\u00F3s bubor\u00E9k maxim\u00E1lis sz\u00E9less\u00E9ge
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=Inform\u00E1ci\u00F3s bubor\u00E9k maxim\u00E1lis sz\u00E9less\u00E9ge pixelben.
OptionPanel.toolTipManager.reshowDelay=\u00DAjra mutat\u00E1s k\u00E9sleltet\u00E9se, ms
+OptionPanel.tr=T\u00F6r\u00F6k / T\u00FCrk\u00E7e
OptionPanel.uk_UA=Ukr\u00E1n / \u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430
OptionPanel.undefined_font=Nem defini\u00E1lt bet\u0171t\u00EDpus
OptionPanel.undo_levels=Visszavon\u00E1si szintek
OptionPanel.undo_levels.tooltip=<html>Meghat\u00E1rozza, hogy h\u00E1ny l\u00E9p\u00E9st lehet visszavonni a "Visszavon\u00E1s" funkci\u00F3val.</html>
OptionPanel.unfold_on_paste=Pont kihajt\u00E1sa beilleszt\u00E9s ut\u00E1n
OptionPanel.unfold_on_paste.tooltip=Pont kihajt\u00E1sa beilleszt\u00E9s vagy Fogd-\u00C9s-Vidd ut\u00E1n
+OptionPanel.uniform_shape=Egyenletes
OptionPanel.use_common_out_point_for_root_node=Az \u00E9lek egy pontb\u00F3l indulnak a gy\u00F6k\u00E9rpontn\u00E1l
OptionPanel.use_common_out_point_for_root_node.tooltip=Az \u00E9lek egy k\u00F6z\u00F6s pontb\u00F3l indulnak a gy\u00F6k\u00E9rpont eset\u00E9ben
OptionPanel.use_tabbed_pane=F\u00FClek haszn\u00E1lata
@@ -1292,10 +1395,14 @@ OptionPanel.validate_invalid_date_format=Hib\u00E1s d\u00E1tumform\u00E1tum
OptionPanel.validate_invalid_datetime_format=Hib\u00E1s d\u00E1tum-id\u0151 form\u00E1tum
OptionPanel.validate_invalid_number_format=Hib\u00E1s sz\u00E1mform\u00E1tum
OptionPanel.validate_write_without_read=Szkriptek: fontolja meg, hogy olvas\u00E1si jogot is ad az \u00EDr\u00E1si jog mell\u00E9.
+OptionPanel.validation_error=<html><body>\u00C9rv\u00E9nyess\u00E9gi hib\u00E1k:<p><em>{0}</em><p>A hib\u00E1k jav\u00EDt\u00E1s\u00E1hoz v\u00E1ltoztasson a be\u00E1ll\u00EDt\u00E1sokon.</body></html>
OptionPanel.validation_warning=<html><body>Ellen\u0151rz\u00E9si figyelmeztet\u00E9s(ek):<p><em>{0}</em></body></html>
+OptionPanel.vertical_child_gap=Gyermek t\u00E9rk\u00F6z
+OptionPanel.vertical_child_gap.tooltip=F\u00FCgg\u0151leges t\u00E1vols\u00E1g a gyermekpontok k\u00F6z\u00F6tt
OptionPanel.vi=Vietn\u00E1mi / Ti\u1EBFng Vi\u1EC7t
OptionPanel.wheel_velocity=Sebess\u00E9g
OptionPanel.wheel_velocity.tooltip=Magasabb \u00E9rt\u00E9k gyorsabb mozg\u00E1st eredm\u00E9nyez a t\u00E9rk\u00E9pen.
+OptionPanel.wide_hexagon=Sz\u00E9les hexagon
OptionPanel.windows=Windows
OptionPanel.zh_CN=K\u00EDnai, egyszer\u0171s\u00EDtett / \u7B80\u4F53\u5B57
OptionPanel.zh_TW=K\u00EDnai, hagyom\u00E1nyos / \u7E41\u9AD4\u5B57
@@ -1305,14 +1412,18 @@ org.freeplane.plugin.bugreport.always_deny=Soha ne k\u00FCldje el
org.freeplane.plugin.bugreport.deny=Ne k\u00FCldje el
org.freeplane.plugin.bugreport.dialog.title=Automatikus hibabejelent\u00E9s
org.freeplane.plugin.bugreport.freeplane_team=\u00DCzenet a Freeplane csapat\u00E1nak
+org.freeplane.plugin.bugreport.lastreport=A kapott jelent\u00E9s
org.freeplane.plugin.bugreport.never=Soha ne k\u00E9rjen seg\u00EDts\u00E9get
org.freeplane.plugin.bugreport.question=A Freeplane automatikus hibakezel\u0151 motorral rendelkezik.
+org.freeplane.plugin.bugreport.report=Aktu\u00E1lis jelent\u00E9s
+org.freeplane.plugin.bugreport.wanted_bug=Bels\u0151 hiba t\u00F6rt\u00E9nt, ami automatikus bejelent\u00E9sre ker\u00FClt.
org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined={0} pont nincs defini\u00E1lva
out_of_memory=Megtelt a mem\u00F3ria.
+overwrite_keyset_question=Fel\u00FCl\u00EDrja a megl\u00E9v\u0151 billenty\u0171 profilt?
PageAction.text=Oldalbe\u00E1ll\u00EDt\u00E1s...
password_is_not_ascii=A jelsz\u00F3 nem ASCII
-PasteAction.text=&Beilleszt\u00E9s
-PasteAttributes.text=&Attrib\u00FAtumok beilleszt\u00E9se
+PasteAction.text=Beilleszt\u00E9s
+PasteAttributes.text=Attrib\u00FAtumok beilleszt\u00E9se
PatternNewNameProperty=\u00DAj minta
PatternToString.backgroundColor=H\u00E1tt\u00E9rsz\u00EDn
PatternToString.Child=Gyermek pont st\u00EDlus
@@ -1334,6 +1445,7 @@ PeriodUnit.WEEK=h\u00E9t
PeriodUnit.YEAR=\u00E9v
plugins/latex/LatexNodeHook.editorTitle=LaTeX formula szerkeszt\u00E9se
plugins/script_filter={0} szkripsz\u0171r\u0151
+plugins/script_filter_error={0} visszat\u00E9r\u00E9si \u00E9rt\u00E9ke {1} kell legyen, de {2} lett
plugins/script_filter_execute_error=Hiba {0} fut\u00E1sa k\u00F6zben\n{1} pontra:\n{2}
plugins/ScriptEditor.cancel=&M\u00F3dos\u00EDt\u00E1sok elvet\u00E9se \u00E9s kil\u00E9p\u00E9s
plugins/ScriptEditor.exit=Ment\u00E9&s \u00E9s kil\u00E9p\u00E9s
@@ -1352,6 +1464,7 @@ plugins/TimeList.xml_Icons=Ikonok
plugins/TimeList.xml_Modified=M\u00F3dos\u00EDtva
plugins/TimeList.xml_Notes=Megjegyz\u00E9sek
plugins/TimeList.xml_Text=Sz\u00F6veg
+plugins/TimeManagement.xml_appendButton=D\u00E1tum besz\u00FAr\u00E1sa a kijel\u00F6l\u00E9sbe
plugins/TimeManagement.xml_Cancel=M\u00E9gsem
plugins/TimeManagement.xml_cancelButton=M\u00E9gsem
plugins/TimeManagement.xml_closeButton=Bez\u00E1r
@@ -1363,6 +1476,7 @@ plugins/TimeManagement.xml_menu_actions=Akci\u00F3k
plugins/TimeManagement.xml_minute=Perc:
plugins/TimeManagement.xml_reminderButton=Eml\u00E9keztessen ekkor
plugins/TimeManagement.xml_reminderButton_tooltip=<html>Megnyom\u00E1skor egy id\u0151z\u00EDt\u0151 aktiv\u00E1l\u00F3dik a megadott d\u00E1tumra. A megfelel\u0151 id\u0151 el\u00E9rkezt\u00E9t egy villog\u00F3 ikon fogja jelezni.<br> A t\u00E9rk\u00E9p bez\u00E1r\u00E1sa eset\u00E9n az id\u0151z\u00EDt\u0151k akkor ker\u00FClnek \u00FAjra aktiv\u00E1l\u00E1sra, amikor a t\u00E9rk\u00E9pet \u00FAjra megnyitj\u00E1k.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>Jelenleg pontonk\u00E9nt egy eml\u00E9keztet\u0151 enged\u00E9lyezett. <br>Jelenleg ekkorra van be\u00E1ll\u00EDtva az eml\u00E9keztet\u0151: {0,date} {0,time}, erre k\u00EDv\u00E1nja m\u00F3dos\u00EDtani: {1,date} {1,time}. <br><br>Be\u00E1ll\u00EDtja az \u00FAj eml\u00E9keztet\u0151t (IGEN) <br>vagy megtartja a r\u00E9git (NEM)?</html>
plugins/TimeManagement.xml_reminderNode_tooltip=Eml\u00E9keztet\u0151 \u00FCtemezve ekkorra: {0,date} {0,time}.
plugins/TimeManagement.xml_remindLaterButton=Eml\u00E9keztessen k\u00E9s\u0151bb
plugins/TimeManagement.xml_remindLaterButton_tooltip=Eml\u00E9keztessen k\u00E9s\u0151bb
@@ -1380,7 +1494,8 @@ print_preview_title=Ny&omtat\u00E1si k\u00E9p
PrintAction.text=Nyomtat\u00E1s...
PrintDirectAction.text=Nyomtat\u00E1s
printing_settings=Nyomtat\u00E1s m\u00E9retez\u00E9se
-PrintPreviewAction.text=Ny&omtat\u00E1si k\u00E9p...
+PrintPreviewAction.text=Nyomtat\u00E1si k\u00E9p...
+progress=K\u00E9sz\u00FClts\u00E9gjelz\u0151 ikon (%)
PropertyAction.dialog=Be\u00E1ll\u00EDt\u00E1sok
PropertyAction.text=Be\u00E1ll\u00EDt\u00E1sok...
QuickFilterAction.text=Gyorssz\u0171r\u0151
@@ -1388,7 +1503,7 @@ QuickFindAction.BACK.text=El\u0151z\u0151 keres\u00E9se
QuickFindAction.FORWARD.text=K\u00F6vetkez\u0151 keres\u00E9se
QuickFindAllAction.text=Minden tal\u00E1lt pont kijel\u00F6l\u00E9se
QuickHighlightAction.text=Minden tal\u00E1lt pont kiemel\u00E9se
-QuitAction.text=&Kil\u00E9p\u00E9s
+QuitAction.text=Kil\u00E9p\u00E9s
read_only=Csak olvashat\u00F3
ReadScriptError.text=Szkript olvas\u00E1si hiba
really_convert_to_current_version=<html>Ez a t\u00E9rk\u00E9p egy kor\u00E1bbi Freeplane verzi\u00F3val k\u00E9sz\u00FClt. <br>Szeretn\u00E9 konvert\u00E1lni (javasolt)? <br>(M\u00E1sk\u00FCl\u00F6nben jelenlegi form\u00E1j\u00E1ban ker\u00FCl bet\u00F6lt\u00E9sre, mely esetben b\u00E1rmi t\u00F6rt\u00E9nhet.) </html>
@@ -1404,8 +1519,11 @@ RedoFilterAction.text=Sz\u0171r\u00E9s \u00FAjra
regular_expressions=Regul\u00E1ris kifejez\u00E9sek
ReminderHookAction.text=Eml\u00E9keztet\u0151 elt\u00E1vol\u00EDt\u00E1sa
ReminderHookAction.tooltip=Elt\u00E1vol\u00EDt egy eml\u00E9keztet\u0151t egy pontr\u00F3l.
+reminderNotification=Eml\u00E9keztet\u0151 \u00E9rtes\u00EDt\u00E9s
remove_file_from_list_on_error=Ezt a f\u00E1jlt nem siker\u00FClt megnyitni: "{0}". Leker\u00FClj\u00F6n a legut\u00F3bbi f\u00E1jlok list\u00E1j\u00E1b\u00F3l?
remove_shortcut_question=Lecser\u00E9li a gyorsbillenty\u0171t?
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=Kibontott pontok alaphelyzetbe \u00E1ll\u00EDt\u00E1sa
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=Minden pont \u00F6sszecsuk\u00E1s\u00E1nak enged\u00E9lyez\u00E9se
RemoveAllIconsAction.text=\u00D6sszes ikon elt\u00E1vol\u00EDt\u00E1sa
RemoveConnectorAction.text=\u00D6sszek\u00F6t\u0151 elt\u00E1vol\u00EDt\u00E1sa
RemoveEncryption.text=Jelsz\u00F3 elt\u00E1vol\u00EDt\u00E1sa
@@ -1413,6 +1531,7 @@ RemoveFormatAction.text=Form\u00E1z\u00E1s elt\u00E1vol\u00EDt\u00E1sa
RemoveIcon_0_Action.text=Els\u0151 ikon elt\u00E1vol\u00EDt\u00E1sa
RemoveIconAction.text=Utols\u00F3 ikon elt\u00E1vol\u00EDt\u00E1sa
RemoveNoteAction.text=Megjegyz\u00E9s t\u00F6rl\u00E9se
+RemoveNoteAction.tooltip=<html> 1Esetlegesen t\u00F6bb jegyzet tartalm\u00E1t is t\u00F6rli.</html> 2
rename=\u00C1t&nevez\u00E9s
repair_link=Link jav\u00EDt\u00E1sa
repair_link_question=Nem lehet bet\u00F6lteni a hivatkozott t\u00E9rk\u00E9pet. Kijav\u00EDtod a hivatkoz\u00E1st k\u00E9zzel?
@@ -1422,40 +1541,49 @@ replace_shortcut_title=Billenty\u0171kombin\u00E1ci\u00F3 cser\u00E9je
ReportBugAction.text=Szoftverhiba bejelent\u00E9se
RequestFeatureAction.text=\u00DAj funkci\u00F3 k\u00E9r\u00E9se
reset_to_default=Alap\u00E9rtelmezett haszn\u00E1lata
-ResetNodeLocationAction.text=Pont poz\u00EDci\u00F3 &alaphelyzetbe \u00E1ll\u00EDt\u00E1sa
+ResetNodeLocationAction.text=Pont poz\u00EDci\u00F3 alaphelyzetbe \u00E1ll\u00EDt\u00E1sa
ResetStyleAction.text=Pont st\u00EDlus alaphelyzetbe \u00E1ll\u00EDt\u00E1sa
-RevertAction.text=&Vissza\u00E1ll\u00EDt\u00E1s helyi el\u0151zm\u00E9nyekb\u0151l
-RevisionPluginAction.text=M\u00F3&dos\u00EDt\u00E1sok h\u00E1tt\u00E9rsz\u00EDn\u00E9nek cser\u00E9je
+RevertAction.text=Vissza\u00E1ll\u00EDt\u00E1s helyi el\u0151zm\u00E9nyekb\u0151l
+RevisionPluginAction.text=M\u00F3dos\u00EDt\u00E1sok h\u00E1tt\u00E9rsz\u00EDn\u00E9nek cser\u00E9je
+save=&Ment\u00E9s
save_failed=A(z) {0} t\u00E9rk\u00E9p ment\u00E9se sikertelen volt.
save_unsaved=Menti az al\u00E1bbi elmet\u00E9rk\u00E9pet?
save_unsaved_styles=Menti a st\u00EDlusokat?
SaveAcceleratorPresetsAction.text=Gyorsbillenty\u0171 profil ment\u00E9se...
SaveAction.text=Ment\u00E9s
-SaveAll.text=Az \u00F6sszes megny&itott t\u00E9rk\u00E9p ment\u00E9se
+SaveAction_readonlyMsg=A t\u00E9rk\u00E9p csak \u00EDr\u00E1sv\u00E9dett. K\u00E9rem haszn\u00E1lja a "F\u00E1jl->T\u00E9rk\u00E9p ment\u00E9se mint..." men\u00FCpontot a t\u00E9rk\u00E9p lement\u00E9s\u00E9hez.
+SaveAction_readonlyTitle=K\u00EDs\u00E9rlet \u00EDr\u00E1sv\u00E9dett t\u00E9rk\u00E9p ment\u00E9s\u00E9re
+SaveAll.text=Az \u00F6sszes megnyitott t\u00E9rk\u00E9p ment\u00E9se
SaveAll.tooltip=Lementi az \u00F6sszes megnyitott t\u00E9rk\u00E9pet
-SaveAsAction.text=Me&nt\u00E9s m\u00E1sk\u00E9nt...
+SaveAs_toReadonlyMsg={0} \u00EDr\u00E1sv\u00E9dett. K\u00E9rem mentse egy m\u00E1sik f\u00E1jlba.
+SaveAs_toReadonlyTitle=\u00CDr\u00E1sv\u00E9dett f\u00E1jlra pr\u00F3b\u00E1lt menteni
+SaveAsAction.text=Ment\u00E9s m\u00E1sk\u00E9nt...
saved=Mentve
saving_canceled=Ment\u00E9s megszak\u00EDtva
scanners_not_loaded=A szkennereket nem lehetett bet\u00F6lteni, a f\u00E1jl s\u00E9r\u00FClt
scheme_evaluate=Hozz\u00E1rendel!
script_execution_disabled=A szkript futtat\u00E1s le van tiltva. (Eszk\u00F6z\u00F6k/Be\u00E1ll\u00EDt\u00E1sok/Kieg\u00E9sz\u00EDt\u0151k)
-ScriptEditor.text=S&zkript szerkeszt\u00E9se...
+ScriptEditor.text=Szkript szerkeszt\u00E9se...
ScriptEditor.tooltip=Nagyobb szkriptek \u00EDr\u00E1s\u00E1t teszi lehet\u0151v\u00E9 a Freeplane-ben.
ScriptEditorPanel.changed_cancel=A szkriptek m\u00F3dosultak. Szeretn\u00E9 elvetni a v\u00E1ltoz\u00E1sokat?
+scripting=Szkriptek
scripting_api_generator_legend=Jelmagyar\u00E1zat
scripting_api_generator_proxy=Proxy
scripting_api_generator_title=Szkriptel\u00E9si API
scripting_api_generator_utilities=Seg\u00E9deszk\u00F6z\u00F6k
scripting_api_generator_web=Webes forr\u00E1sanyagok
+ScriptsRunToggleAction.ON_SELECTED_NODE.text=Szkriptek futtat\u00E1sa a kiv\u00E1lasztott pontokon
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=Szkriptek futtat\u00E1sa rekurz\u00EDvan a kiv\u00E1lasztott pontokon
+ScriptsRunToggleAction.ON_SINGLE_NODE.text=Szkriptek futtat\u00E1sa egy kiv\u00E1lasztott ponton
select_favorites_folder=V\u00E1laszd ki a mapp\u00E1t, ahol a kedvencek tal\u00E1lhat\u00F3ak
select_file_export_to=V\u00E1lassza ki az export c\u00E9lf\u00E1jlj\u00E1t
select_folder_for_importing=V\u00E1laszd ki az import\u00E1land\u00F3 mapp\u00E1t
select_icon=V\u00E1lasszon ikont
select_menu_item_dialog=V\u00E1lasszon egy men\u00FCelemet
select_menu_item_root_node=Men\u00FC
-SelectAllAction.text=&Minden megjelen\u00EDtett pont kijel\u00F6l\u00E9se
-SelectBranchAction.text=&L\u00E1that\u00F3 \u00E1g kijel\u00F6l\u00E9se
-SelectedPasteAction.text=B&eilleszt\u00E9s mint...
+SelectAllAction.text=Minden megjelen\u00EDtett pont kijel\u00F6l\u00E9se
+SelectBranchAction.text=L\u00E1that\u00F3 \u00E1g kijel\u00F6l\u00E9se
+SelectedPasteAction.text=Beilleszt\u00E9s mint...
selection_method_by_click=Klikk a kijel\u00F6l\u00E9shez
selection_method_delayed=K\u00E9sleltetett automatikus kiv\u00E1laszt\u00E1s
selection_method_direct=R\u00E1mutat\u00E1s a kijel\u00F6l\u00E9shez
@@ -1465,12 +1593,15 @@ set_accelerator_on_next_click_action=\u00DAj billenty\u0171kombin\u00E1ci\u00F3h
SetAccelerator.dialogTitle=Gyorsbillenty\u0171 hozz\u00E1rendel\u00E9se
SetAccelerator.keystrokeDetected=A ''{0}'' billenty\u0171 nincs hozz\u00E1rendelve egy men\u00FCelemhez sem.
SetAcceleratorOnNextClickAction.text=Gyorsbillenty\u0171 be\u00E1ll\u00EDt\u00E1sa...
-SetImageByFileChooserAction.text=K\u00E9&p f\u00E1jlb\u00F3l vagy linkr\u0151l...
+SetAlwaysUnfoldedNodeFlagsAction.text=Kibontott pontok megtart\u00E1sa
+SetAlwaysUnfoldedNodeFlagsAction.tooltip=Megakad\u00E1lyozza a jelenleg kibontott pontok becsuk\u00E1s\u00E1t
+SetImageByFileChooserAction.text=K\u00E9p f\u00E1jlb\u00F3l vagy linkr\u0151l...
SetLinkAnchorAction.text=Be\u00E1ll\u00EDt\u00E1s horgonynak
SetLinkAnchorAction.tooltip=<html>a kiv\u00E1lasztott pont be\u00E1ll\u00EDt\u00E1sa horkonynak k\u00E9s\u0151bbi<br/>helyi vagy glob\u00E1lis hivatkoz\u00E1s l\u00E9trehoz\u00E1s\u00E1hoz.
SetLinkAnchorAction.tooltip_anchored=<html>a kiv\u00E1lasztott pont be\u00E1ll\u00EDt\u00E1sa horgonynak k\u00E9s\u0151bbi<br/>helyi vagy glob\u00E1lis hivatkoz\u00E1s l\u00E9trehoz\u00E1s\u00E1hoz. Jelenlegi horgony:<br/>{0}
SetLinkByFileChooserAction.text=Link be\u00E1ll\u00EDt\u00E1sa (F\u00E1jlv\u00E1laszt\u00F3)...
SetLinkByTextFieldAction.text=Hivatkoz\u00E1s sz\u00F6veges megad\u00E1sa...
+SetNodeLink.text=Pont hivatkoz\u00E1s\u00E1nak megad\u00E1sa...
SetNoteWindowPosition.bottom.text=Alul
SetNoteWindowPosition.left.text=Balra
SetNoteWindowPosition.right.text=Jobbra
@@ -1667,12 +1798,13 @@ simplyhtml.valignMiddle=k\u00F6z\u00E9pre
simplyhtml.valignTop=fel\u00FClre
simplyhtml.wholeWordsOnly=Csak teljes szavak
simplyhtml.wholeWordsOnly.tooltip=A tal\u00E1latok korl\u00E1toz\u00E1sa eg\u00E9sz szavakra.
-SortNodes.text=&Gyermekek rendez\u00E9se
+SortNodes.text=Gyermekek rendez\u00E9se
SortNodes.tooltip=\u00C1b\u00E9c\u00E9 sorrendbe rendezi a pont minden gyermek\u00E9t.
-split=Sz\u00E9tv\u00E1g\u00E1s
+split=&Sz\u00E9tv\u00E1g\u00E1s
SplitConditionAction.text=Megbont\u00E1s
-SplitNode.text=Pont &sz\u00E9tbont\u00E1sa
+SplitNode.text=Pont sz\u00E9tbont\u00E1sa
SplitNode.tooltip=<html>Pont sz\u00E9tv\u00E1lasztva</html>
+SplitToWordsAction.text=A sor {0} sz\u00F3ra oszt\u00E1sa
STANDARD_FORMAT=Standard
stop_processing=\u00C1llj
StringFlavorHandler=Egyszer\u0171 sz\u00F6vegk\u00E9nt mint pont hierarchia
@@ -1705,38 +1837,51 @@ styles.subtopic=Alt\u00E9mak\u00F6r
styles.topic=T\u00E9mak\u00F6r
styles.user-defined=Egy\u00E9ni st\u00EDlusok
styles.website=Webhely
+styles_background_html=\n <html> 1\u21B5\n <head> 2\u21B5\n </head> 3\u21B5\n <body> 4\u21B5\n <table width="800" style="text-align: left; vertical-align: top"> 5\u21B5\n <tr valign="top"> 6\u21B5\n <th> 7\u21B5\n <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold"> 8\u21B5\n A st\u00EDlusk\u00E9szletr\u0151l\u21B5\n </div> 9\u21B5\n <div style="text-align: left; font-weight: normal"> 0\u21B5\n <div style="margin: 3 [...]
styles_menu=El\u00E9rhet\u0151 st\u00EDlusok
submenu_keystroke_in_use_error=A(z) {0} Billenty\u0171 nem haszn\u00E1lhat\u00F3 a(z) {1} men\u00FCh\u00F6z mivel m\u00E1r haszn\u00E1latben van.
summary_nodes=\u00D6sszegz\u0151pontok
summary_not_possible=Az aktu\u00E1lis kijel\u00F6l\u00E9sre nem hozhat\u00F3 l\u00E9tre \u00F6sszegz\u0151pont
-SummaryNodeAction.text=\u00D6sszegz\u0151pont (ki/be)
svg=SVG
template_dir=Be\u00E9p\u00EDtett sablonok
+TextAlignAction.CENTER.text=K\u00F6z\u00E9pre igaz\u00EDtott sz\u00F6veg
+TextAlignAction.DEFAULT.text=Alap\u00E9rtelmezett
+TextAlignAction.LEFT.text=Balra igaz\u00EDtott sz\u00F6veg
+TextAlignAction.RIGHT.text=Jobbra igaz\u00EDtott sz\u00F6veg
+textalignment=Sz\u00F6veg igaz\u00EDt\u00E1sa
TimeListAction.text=Feladatok kezel\u00E9se...
TimeListAction.tooltip=Minden \u00FCtemezett id\u0151 \u00E9s a hozz\u00E1juk tartoz\u00F3 pontok megjelen\u00EDt\u00E9se.
TimeManagementAction.text=Id\u0151 kezel\u00E9se...
TimeManagementAction.tooltip=<html>Kai Toedter napt\u00E1rmodulj\u00E1nak megjelen\u00EDt\u00E9se.</html>
+TimePeriodUnits.days=nap
+TimePeriodUnits.hours=\u00F3ra
+TimePeriodUnits.minutes=perc
+TimePeriodUnits.ms=ezredm\u00E1sodperc
+TimePeriodUnits.seconds=m\u00E1sodperc
+TimePeriodUnits.weeks=h\u00E9t
ToggleChildrenFoldedAction.text=Gyermekpontok (Ki/be)hajt\u00E1sa
ToggleDetailsAction.text=R\u00E9szletek elrejt\u00E9se
ToggleFBarAction.text=Funkci\u00F3gomb eszk\u00F6zt\u00E1r
ToggleFoldedAction.text=Ki/behajt\u00E1s
ToggleFullScreenAction.text=Teljes k\u00E9perny\u0151s m\u00F3d
-ToggleLeftToolbarAction.text=&Ikon eszk\u00F6zt\u00E1r
+ToggleLeftToolbarAction.text=Ikon eszk\u00F6zt\u00E1r
ToggleMenubarAction.text=Men\u00FCsor
ToggleScrollbarsAction.text=G\u00F6rd\u00EDt\u0151s\u00E1vok
ToggleStatusAction.text=St\u00E1tuszsor megjelen\u00EDt\u00E9se
-ToggleToolbarAction.text=Eszk\u00F6z&t\u00E1r
+ToggleToolbarAction.text=Eszk\u00F6zt\u00E1r
+toolbars=Eszk\u00F6zt\u00E1rak
undefined_error=V\u00E1ratlan hiba l\u00E9pett fel. K\u00E9rem, pr\u00F3b\u00E1lja meg bejelenteni a hib\u00E1t.
underline=Al\u00E1h\u00FAz\u00E1s
UnderlineAction.text=Al\u00E1h\u00FAz\u00E1s
underlined=Al\u00E1h\u00FAzott
-UndoAction.text=&Visszavon\u00E1s
+UndoAction.text=Visszavon\u00E1s
UndoFilterAction.text=Sz\u0171r\u00E9s visszavon\u00E1sa
unfold=Kihajt\u00E1s
UnfoldAllAction.text=Minden kihajt\u00E1sa
UnfoldAllAction.tooltip=<html>Kihajtja a kijel\u00F6lt pontokat a gyermekeikkel egy\u00FCtt.</html>
UnfoldOneLevelAction.text=Egy szint kihajt\u00E1sa
UnfoldOneLevelAction.tooltip=A kijel\u00F6lt pontokat egy szinttel kihajtja.
+unparsedLatexPatternFormat=Feldolgozatlan LaTeX
up=&Fel
UpConditionAction.text=Fel
update_failed=A friss\u00EDt\u00E9s meghi\u00FAsult a k\u00F6vetkez\u0151 \u00FCzenettel: {0}
@@ -1763,10 +1908,14 @@ user_defined_zoom_status_bar=A nagy\u00EDt\u00E1si \u00E9rt\u00E9k az \u00E1ltal
user_icon=Felhaszn\u00E1l\u00F3i ikon "{0}"
user_template_dir=Felhaszn\u00E1l\u00F3i sablonok
user_zoom=Nyomtatand\u00F3 nagy\u00EDt\u00E1si \u00E9rt\u00E9k (0.0 - 2.0):
+userScripts=Szkriptek
+value_format=\u00C9rt\u00E9k form\u00E1tuma
version_up_to_date=Az el\u00E9rhet\u0151 leg\u00FAjabb verzi\u00F3t haszn\u00E1lja
-ViewerControllerAction.text=K\u00FCls\u0151 objektum...
+view=&N\u00E9zet
ViewLayoutTypeAction.OUTLINE.text=\u00C1ttekint\u0151 n\u00E9zet
+web_resources=Webes forr\u00E1sok
WebDocuAction.text=Web dokument\u00E1ci\u00F3
+WhatsNewAction.text=Freeplane 1.5.x \u00FAjdons\u00E1gai
width=Sz\u00E9less\u00E9g
wrong_regexp=Hib\u00E1s regul\u00E1ris kifejez\u00E9s "{0}", hiba: {1}
xslt_export.html=HTML dokumentum
@@ -1779,5 +1928,6 @@ xslt_export.ms_word=Microsoft Word 2003 XML
xslt_export.text=Egyszer\u0171 sz\u00F6veg
xslt_export_not_possible=A Freeplane XSLT export\u00E1l\u00E1s nem lehets\u00E9ges
yes=Igen
-ZoomInAction.text=Nagy\u00EDt\u00E9s
+zoom=Nagy\u00EDt\u00E1s
+ZoomInAction.text=Nagy\u00EDt\u00E1s
ZoomOutAction.text=Kicsiny\u00EDt\u00E9s
diff --git a/freeplane/resources/translations/Resources_id.properties b/freeplane/resources/translations/Resources_id.properties
index e62c997..348e8fe 100644
--- a/freeplane/resources/translations/Resources_id.properties
+++ b/freeplane/resources/translations/Resources_id.properties
@@ -1,4 +1,5 @@
AboutAction.text=Tentang
+accelerators_loading_error=TIdak bisa memuat akselerator
accessories/plugins/ApplyFormatPlugin.dialog.title=Ubah format node
accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=Ubah pola
accessories/plugins/EncryptNode.properties_0=Pilih kata sandi untuk node terenkripsi.
@@ -32,11 +33,11 @@ antialias_edges=Antialias Tangkai
antialias_none=Tanpa Antialias
apply=Terapkan
ApplyAction.text=Terapkan
-ApplyFormatPlugin.text=&Ubah format...
+ApplyFormatPlugin.text=Ubah format...
ApplyFormatPlugin.tooltip=Membuka kotak dialog untuk mengubah atribut node dan tangkai sekaligus.
ApplyNoFilteringAction.text=Tanpa Filter
as_parent=Seperti Induknya
-AssignAttributesAction.text=Pasan&g Atribut...
+AssignAttributesAction.text=Pasang Atribut...
attribute_delete=Hapus Semua Nilai
attribute_delete_value=Hapus Nilai Ini
attribute_font_size_tooltip=Atribut Ukuran Font
@@ -74,7 +75,7 @@ attributes_skip_root=Abaikan Node Akar
attributes_visible=Yang Tampak dan Dipilih
attributes_visible_tooltip=Yang Tampak dan Dipilih
automatically_save_message=Peta disimpan secara otomatis (menggunakan nama berkas {0}) ...
-AutomaticLayoutAction.text=&Atak Otomatis
+AutomaticLayoutAction.text=Atak Otomatis
AutomaticLayoutAction.tooltip=<html>Menetapkan atak peta. <br>Level pertama hitam, kedua biru, dst.</html>
BackAction.text=Mundur
BackAction.tooltip=Lompat ke belakang dalam rantai terpilih
@@ -114,7 +115,7 @@ connector=Connector[translate me]
connector_label=Connector Label[translate me]
CopyAction.text=Salin
CopySingleAction.text=Salin Tunggal
-CreationModificationPluginAction.text=Tunjukkan &Waktu Diubah
+CreationModificationPluginAction.text=Tunjukkan Waktu Diubah
CreationModificationPluginAction.tooltip=<html>Fungsi ini mencatat waktu pembuatan dan pengubahan node-node.</html>
CutAction.text=Potong
decrease_branch_font_size=Perkecil Font
@@ -151,14 +152,14 @@ EncryptedMap.text=Buat Peta Terenkripsi...
EncryptedMap.tooltip=Buat peta terenkripsi baru.
enter_base_url=Masukkan URL acuan. Hipertaut akan dibuat relatif mengacu terhadap URL ini.
enter_confirms=Enter untuk Menerapkan
-EnterPassword.text=&Mati-hidupkan Enkripsi
+EnterPassword.text=Mati-hidupkan Enkripsi
error=Galat
error_applying_template=Galat menerapkan pola acu XSL.
error_creating_directory=Tidak dapat membuat direktori untuk ekspor.
ExecuteScripts.text=Scripts[translate me]
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
-ExportAction.text=&Ekspor
+ExportAction.text=Ekspor
ExportBranchToHTMLAction.text=Cabang sebagai HTML
ExportPdf.text=Sebagai PDF...
ExportSvg.text=Sebagai SVG...
@@ -168,12 +169,13 @@ ExportToImage.png.text=Sebagai PNG...
ExportToOoWriter.text=Sebagai dokumen OpenOffice.org Writer...
ExportToOoWriter.tooltip=Node terbuka berdasarkan strukturnya, node terlipat berdasarkan isi dokumen.
extension_menu=Gaya &Fisik
+extras=A&lat
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=FAQ
file=Be&rkas
file_already_exists=Berkas {0} sudah ada. Apakah Anda hendak menimpanya?
file_not_found=Berkas {0} tidak ditemukan
-filter=Filter
+filter=Filter[translate me]
filter_add=Tambah
filter_and=And (Dan)
filter_conditions=Filter
@@ -197,7 +199,7 @@ filter_selected_node_view=Node Terpilih Saat Ini
find_what=Temukan apa
FindAction.text=Temukan...
fit_map_to_page=Sesuaikan ke Satu Halaman
-FitToPage.text=Zum untuk Menyesuaikan ke &Halaman
+FitToPage.text=Zum untuk Menyesuaikan ke Halaman
FitToPage.tooltip=Sesuaikan zum hingga seluruh peta tertampilkan dalam jendela ini.
fold=Lipat
FoldAllAction.text=Lipat Semua
@@ -209,6 +211,7 @@ FollowLinkAction.text=Buka Hipertaut
font=Font
FontFamilyAction.text=font
FontSizeAction.text=ukuran font
+format=F&ormat
format_menu_edge_styles=Gaya &Tangkai
format_menu_edge_widths=&Lebar Tangkai
FormatCopy.text=Salin Format
@@ -242,7 +245,7 @@ GrabKeyDialog.grab-key.remove-ask=Anda yakin hendak mencopot kunci ini?
GrabKeyDialog.grab-key.title=Masukkan kunci baru
help=Bantuan
HideAllAttributesAction.text=Sembunyikan Atribut Terpilih
-HierarchicalIconsAction.text=Tampilkan Ikon secara &Hirarkis
+HierarchicalIconsAction.text=Tampilkan Ikon secara Hirarkis
HierarchicalIconsAction.tooltip=Bila salah satu dari anak(-cucu) node ini memiliki ikon, ikon tersebut akan ditampilkan juga di sini dalam format kecil.
HotKeyInfoAction.text=Key Reference[translate me]
html_export_based_on_headings=Ekspor HTML - Berdasarkan Tajuk
@@ -316,7 +319,7 @@ IconGroupPopupAction.miscellaneous.text=Miscellaneous[translate me]
IconGroupPopupAction.smiley.text=Smiley[translate me]
IconSelectionPlugin.text=Pilih Ikon...
IconSelectionPlugin.tooltip=<html>Dengan ini, ikon dapat dipilih lewat suatu jendela.</html>
-import=Impor
+import=I&mpor
import_linked_branch_no_link=Node terpilih tidak bertaut pada sesuatu yang dapat diimpor.
ImportAction.text=Impor
ImportBranchAction.text=Cabang...
@@ -329,7 +332,6 @@ increase_branch_font_size=Perbesar Font
IncreaseNodeFontAction.text=Perbesar Font
ItalicAction.text=Miring
italicise_branch=Miringkan
-JoinNodesAction.text=Gabung Node
less_than_two_selected_nodes=Anda harus memilih minimal dua node untuk membuat tautan.
link_not_available_any_more=Tautan ini tidak sahih lagi. Node di antaranya telah dicopot.
link_not_found=Link {0} tidak ditemukan
@@ -346,13 +348,7 @@ map_locked_by_open=Peta {0} sedang diedit oleh pemakai {1}. Dibuka untuk baca-sa
map_locked_by_save_as=Peta {0} sedang diedit oleh pemakai {1}. Perintah Simpan Sebagai dibatalkan.
map_not_saved=Peta belum disimpan sebelumnya.
menu_attributes=&Atribut
-menu_extras=A&lat
-menu_file_import=I&mpor
-menu_filter=Filter[translate me]
-menu_format=F&ormat
menu_insert=&Sisip
-menu_navigate=&Navigasi
-menu_view=&Tampakan
mindmap=Peta
mindmaps=Peta
mindmaps_desc=Peta (*.mm)
@@ -367,6 +363,7 @@ modes=Modus
ModesMenuAction.File.text=File Explorer[translate me]
most_recent_files=Be&rkas Terkini
MoveToRootAction.text=Pergi ke Akar
+navigate=&Navigasi
NavigationNextMapAction.text=Peta Berikutnya
NavigationPreviousMapAction.text=Peta Sebelumnya
new_mindmap=Peta Baru
@@ -387,14 +384,14 @@ no_previous_find=Tidak ada pencarian sebelumnya.
node=Node
node_changed_discard_changes=Node telah diubah. Anda ingin membatalkan perintah ini?
node_location_help=Menyeret memindahkan lokasi node, ctrl+seret mengganti jarak, klik ganda dan ctrl+klik ganda menatanya ulang.
-NodeBackgroundColorAction.text=Warna Latar Belakang &Node...
+NodeBackgroundColorAction.text=Warna Latar Belakang Node...
NodeColorAction.text=Warna Node...
NodeColorBlendAction.text=Campur Warna
NodeDownAction.text=Node ke Bawah
NodeListAction.text=Temukan dan Ganti...
NodeListAction.tooltip=Tampilkan semua node sebagai senarai yang dapat dicari melalui penyaring properti.
-NodeShapeAction.bubble.text=&Balon
-NodeShapeAction.fork.text=&Ranting
+NodeShapeAction.bubble.text=Balon
+NodeShapeAction.fork.text=Ranting
NodeUpAction.text=Node ke Atas
nonboldify_branch=Tak-tebalkan
nonitalicise_branch=Tak-miringkan
@@ -539,8 +536,6 @@ OptionPanel.nodefontbold=Font Tebal
OptionPanel.nodefontitalic=Font Miring
OptionPanel.nodefontname=Nama Font Node
OptionPanel.nodefontsize=Ukuran Font Node
-OptionPanel.nodeshape=Gaya Node
-OptionPanel.nodeshape.tooltip=Gaya Node
OptionPanel.nodetext=Teks Node
OptionPanel.nodetext.tooltip=Teks Node
OptionPanel.nothing=Nihil
@@ -656,7 +651,7 @@ OptionPanel.windows=Windows
OptionPanel.zh_CN=Zh CN
OptionPanel.zh_TW=Zh
out_of_memory=Out of memory.[translate me]
-PageAction.text=&Penataan Halaman...
+PageAction.text=Penataan Halaman...
PasteAction.text=Tempel
PatternNewNameProperty=Pola Baru
PatternToString.backgroundColor=Warna Latar Belakang
@@ -712,7 +707,7 @@ print_preview_title=Tampakan Awal
PrintAction.text=Cetak...
PrintDirectAction.text=Cetak
printing_settings=Skala Cetak
-PrintPreviewAction.text=Cetak Tampakan A&wal...
+PrintPreviewAction.text=Cetak Tampakan Awal...
PropertyAction.text=Preferensi...
QuitAction.text=Keluar
read_only=Baca Saja
@@ -733,11 +728,11 @@ repair_link=Perbaiki Taut
repair_link_question=Peta tertaut tidak dapat dimuat. Perbaiki taut secara manual?
replace=Ganti
ReportBugAction.text=Report a Bug[translate me]
-ResetNodeLocationAction.text=Tata-ulang &Posisi
+ResetNodeLocationAction.text=Tata-ulang Posisi
save_failed=Usaha menyimpan peta {0} gagal
save_unsaved=Simpan peta berikut?
SaveAction.text=Simpan
-SaveAll.text=Simpan Semu&a
+SaveAll.text=Simpan Semua
SaveAll.tooltip=Simpan semua peta terbuka
SaveAsAction.text=Simpan Sebagai
saved=Tersimpan
@@ -759,7 +754,7 @@ SetLinkByFileChooserAction.text=Hipertaut (Pemilih Berkas)
SetLinkByTextFieldAction.text=Hipertaut (Kolom Teks)
ShowAllAttributesAction.text=Tampilkan Semua Atribut
ShowAncestorsAction.text=Tampilkan Moyangnya
-ShowAttributeDialogAction.text=Kelola &Atribut...
+ShowAttributeDialogAction.text=Kelola Atribut...
ShowDescendantsAction.text=Tunjukkan Keturunannya
ShowFilterToolbarAction.text=Filter Toolbar[translate me]
ShowHideNoteAction.text=Jendela Catatan
@@ -932,10 +927,10 @@ simplyhtml.valignLabel=Perataan Vertikal
simplyhtml.valignMiddle=tengah
simplyhtml.valignTop=atas
simplyhtml.wholeWordsOnly=Hanya kata seutuhnya
-SortNodes.text=&Urutkan Anak-anak
+SortNodes.text=Urutkan Anak-anak
SortNodes.tooltip=Urutkan semua anak dari node menurut abjad.
-split=Pisahkan
-SplitNode.text=&Pisahkan Node
+split=&Pisahkan
+SplitNode.text=Pisahkan Node
SplitNode.tooltip=<html>Node dipisahkan</html>
style=Gaya
svg=SVG[translate me]
@@ -946,9 +941,9 @@ TimeManagementAction.tooltip=<html>Tunjukkan modul Kalender buatan Kai Toedter.<
ToggleChildrenFoldedAction.text=Buka/Tutup Lipatan Anak
ToggleFBarAction.text=F-Bar[translate me]
ToggleFoldedAction.text=Buka/Tutup Lipatan
-ToggleLeftToolbarAction.text=Luntang &Kedua
+ToggleLeftToolbarAction.text=Luntang Kedua
ToggleMenubarAction.text=Bilah Menu
-ToggleToolbarAction.text=&Luntang
+ToggleToolbarAction.text=Luntang
undefined_error=Galat yang tidak diharapkan terjadi. Tolong coba aporkan sebagai bug.
underline=Garis Bawah
underlined=Garis Bawah
@@ -966,6 +961,7 @@ UsePlainTextAction.text=Gunakan Teks Polos
user_defined_zoom=Setelan pemakai.
user_defined_zoom_status_bar=Mengubah zum sesuai setelan pemakai di {0}%.
user_zoom=Faktor Zum Pencetakan (0.0 - 2.0):
+view=&Tampakan
WebDocuAction.text=Dokumentasi Web
width=Lebar
yes=Ya
diff --git a/freeplane/resources/translations/Resources_it.properties b/freeplane/resources/translations/Resources_it.properties
index f7c2c54..b05b665 100644
--- a/freeplane/resources/translations/Resources_it.properties
+++ b/freeplane/resources/translations/Resources_it.properties
@@ -81,8 +81,8 @@ antialias_all=Antialias tutto
antialias_edges=Antialias Collegamenti
antialias_none=Antialias niente
apply=&Applica
-ApplyAction.text=&Applica
-ApplyFormatPlugin.text=&Cambia formato...
+ApplyAction.text=Applica
+ApplyFormatPlugin.text=Cambia formato...
ApplyFormatPlugin.tooltip=Visualizza una finestra tramite cui si possono cambiare gli Attributi del nodo e del collegamento.
ApplyNoFilteringAction.text=Nessun filtro
ApplySelectedViewConditionAction.text=Filtra i nodi selezionati
@@ -98,7 +98,7 @@ attribute_name=Nome Attributi
attribute_replace=Sostituisci con
attribute_top=Tutti gli Attributi conosciuti per la mappa aperta
attribute_value=Valore Attributi
-attributes_AddAttributeAction.text=A&ggiungi Attributi...
+attributes_AddAttributeAction.text=Aggiungi Attributi...
attributes_adding_empty_attribute_error=Non si pu\u00F2 usare una stringa vuota come nome attributo
attributes_all=Tutti gli Attributi
attributes_assign_dialog=Assegna Attributi
@@ -141,7 +141,7 @@ AutomaticLayout.ALL=Per tutti
AutomaticLayout.HEADINGS=Per le intestazioni
AutomaticLayout.level=Livello {0}
AutomaticLayout.level.root=Nodo Principale
-AutomaticLayoutAction.text=&Applica Stili Livelli
+AutomaticLayoutAction.text=Applica Stili Livelli
AutomaticLayoutAction.tooltip=<html>Regola la formattazione della mappa. <br> Il primo livello nero, il secondo blu, etc.</html>
AutomaticLayoutControllerAction.ALL.text=per tutti i nodi
AutomaticLayoutControllerAction.HEADINGS.text=per i nodi terminali
@@ -166,7 +166,7 @@ can_not_delete_root_style=Non si pu\u00F2 cancellare lo stile del nodo Principal
can_not_delete_style_group=Non si pu\u00F2 cancellare lo stile del gruppo
can_not_save_key_set=Salvataggio configurazione Tasti Rapidi, non riuscita
cancel=&Annulla
-CancelAction.text=&Annulla
+CancelAction.text=Annulla
cannot_add_parent_diff_parents=Tutti i nodi devono avere lo stesso genitore per usare questa funzione.
cannot_add_parent_to_root=Il nodo radice non pu\u00F2 essere aggiunto ad un nuovo genitore.
cannot_delete_root=Il nodo radice non pu\u00F2 essere cancellato o tagliato.
@@ -215,12 +215,12 @@ connector_shapes=Forma del Collegamento grafico
ConnectorColorAction.text=Colore del Collegamento grafico...
CopyAction.text=Copia
CopyAction.tooltip=Copia l'intero ramo
-CopyAttributes.text=Copia &Attributi
+CopyAttributes.text=Copia Attributi
CopyIDAction.text=Copia l'ID del nodo
CopyMapStylesAction.text=Copia lo stile della mappa...
CopyNodeURIAction.text=Copiare URI del Nodo
copyright=Copyright \u00A9 2000-2014 Freeplane team and others
-CopySingleAction.text=Copia Nodo (&singolo)
+CopySingleAction.text=Copia Nodo (singolo)
CopySingleAction.tooltip=Copia solo il nodo selezionato
CopyStyleExtensionsAction.text=Copiare le estensioni dallo stile del nodo
corrupt_map=Il contenuto della mappa \u00E8 corrotto
@@ -299,7 +299,7 @@ EditDetailsAction.text=Modifica Dettagli del nodo
EditDetailsInDialogAction.text=Modifica i dettagli del nodo, in una finestra separata
EditFilterAction.text=Modifica...
EditLongAction.text=Modifica avanzata nodo...
-EditNoteInDialogAction.text=Modifica ¬e...
+EditNoteInDialogAction.text=Modifica note...
EditScript=Modifica Script...
EditStylesAction.text=Modifica Stili
EncryptedMap.text=Crea mappa criptata ...
@@ -312,7 +312,7 @@ enter_map_url=Inserire l'indirizzo web della mappa
enter_new_style_name=Inserire il nome del nuovo stile
enter_node_id=Inserire l'ID del nodo
enter_zoom=Inserire Zoom
-EnterPassword.text=&Commuta Criptato / Non Criptato
+EnterPassword.text=Commuta Criptato / Non Criptato
error=Errore
error_applying_template=Errore nell'applicazione del modello XSL
error_creating_directory=Impossibile creare directory per esportare.
@@ -331,7 +331,7 @@ export_failed=Esportazione fallita
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
export_using_xslt=Esporta a Freeplane usando XSLT
-ExportAction.text=&Esporta
+ExportAction.text=Esporta
ExportBranchAction.text=Ramifica come nuova mappa...
ExportBranchToHTMLAction.text=Esporta ramo in HTML
exported_file={0} file
@@ -351,6 +351,7 @@ ExternalImageChangeAction.text=Modifica Immagine Esterna...
ExternalImageRemoveAction.text=Rimuovi Immagine Esterna
ExtractLinkFromTextAction.text=Collegamenti ipertestuali dal testo
ExtractLinkFromTextAction.tooltip=Setta i collegamenti ipertestuali trovati nei nodi di testo
+extras=&Strumenti
f_button_unassigned=<nessuna azione>
FaqOpenURLAction.text=FAQ
file=&File
@@ -370,7 +371,7 @@ FileProperties_NodeSelectionCount=Numero di nodi selezionati:
FileProperties_TotalFilteredCount=Numero di nodi che soddisfano il filtro:
FileProperties_TotalLeafCount=Numero totale di nodi finali:
FileProperties_TotalNodeCount=Numero tatale di nodi:
-FilePropertiesAction.text=Propr&iet\u00E0...
+FilePropertiesAction.text=Propriet\u00E0...
FileRevisionsDialog.cancel=&Annulla
FileRevisionsDialog.file_last_modified=Marca Temporale "Timestamp"
FileRevisionsDialog.file_name=File
@@ -381,7 +382,7 @@ FileRevisionsDialog.question=Trovate revisioni di {0}
FileRevisionsDialog.restore=Riprist&ina
FileRevisionsDialog.restore.tooltip=Rimpiazzare {0} con {1}
FileRevisionsDialog.title=Revisioni File
-filter=Filtro
+filter=Fi<ra
filter_add=&Aggiungi
filter_and=E
filter_any_text=Cuore, dettagli o note
@@ -431,11 +432,11 @@ filter_selected_node_view=Nodo selezionato correntemente
filter_selected_node_view_snapshot=Selezione salvata
filter_style=Stile
filter_time=Filtra per data
-FilterComposerDialog.save=&Salva
filters_not_loaded=Il filtro non pu\u00F2 essere caricato, file corrotto.
find_what=Trova cosa
FindAction.text=Trova...
-FirstGroupNodeAction.text=Gruppo Nodi - Inizia
+FindNextAction.text=Trova successivo
+FindPreviousAction.text=Trova precedente
fit_map_to_page=Adatta a una pagina
fit_map_to_page_height=Adatta alla pagina in altezza
fit_map_to_page_width=Adatta alla pagina in larghezza
@@ -451,6 +452,7 @@ FollowLinkAction.text=Segui collegamento
font=Carattere
FontFamilyAction.text=Tipo Carattere
FontSizeAction.text=Dimensione carattere
+format=F&ormato
format_invalid_pattern=Schema non valido
format_menu_cloud_shapes=Nuvola
format_menu_edge_styles=&Stile dei collegamenti
@@ -644,9 +646,9 @@ IconSelectionPlugin.text=Seleziona icona...
IconSelectionPlugin.tooltip=<html>Qui \u00E8possibile selezionare un'icona usando una sottofinestra.</html>
image_covertLink=Convertire Link in Immagine
ImageFlavorHandler=Immagine (In File separato)
-import=Importa
+import=I&mporta
import_linked_branch_no_link=Il seguente nodo non ha link da cui importare.
-ImportAction.text=&Importa
+ImportAction.text=Importa
ImportBranchAction.text=Importa ramo...
ImportExplorerFavoritesAction.text=Importa preferiti di Internet Explorer...
ImportFolderStructureAction.text=Importa struttura cartella...
@@ -664,16 +666,16 @@ invalid_url_msg=Impossibile creare URL valido per {0}
ItalicAction.text=Corsivo
italicise_branch=Corsivo sul ramo
java_version=Versione Java: {0}
-JoinNodesAction.text=Unisci nodi
-LatexDeleteLatexAction.text=Rimuovi formula LaTe&X
-LatexEditLatexAction.text=Modifica formula &LaTeX...
-LatexInsertLatexAction.text=Aggiungere formula &LaTeX...
+LatexDeleteLatexAction.text=Rimuovi formula LaTeX
+LatexEditLatexAction.text=Modifica formula LaTeX...
+LatexInsertLatexAction.text=Aggiungere formula LaTeX...
less_than_two_selected_nodes=Seleziona almeno due nodi per collegarli
license=Licenza
license_text=<html>This program is free software; you can redistribute it and/or<br>modify it under the terms of the GNU General Public License<br>as published by the Free Software Foundation; either version 2<br>of the License, or (at your option) any later version.<br><br>This program is distributed in the hope that it will be useful,<br>but WITHOUT ANY WARRANTY; without even the implied warranty of<br>MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>GNU General Public [...]
link_error=Errato collegamento "{0}" non caricato
link_not_available_any_more=Il collegamento non \u00E8 pi\u00F9 valido. Il nodo \u00E8 stato cancellato nel frattempo.
link_not_found=Collegamento {0} non trovato.
+links=Collegamenti
load=&Carica
load_accelerator_presets=Carica
LoadAcceleratorPresetsAction.textPatterns.text=Schemi di testo
@@ -741,10 +743,6 @@ menu_displayAttributes=Attributi Nodo
menu_encryption=Criptatura
menu_error=Errore nella struttura menu definita dall''utente {0}:\n{1}\nAnnullato
menu_extensions=Estensioni Nodo
-menu_extras=&Strumenti
-menu_file_import=I&mporta
-menu_filter=Fi<ra
-menu_format=F&ormato
menu_group=Gruppo Nodo
menu_hoverView=Suggerimenti Tool Tip
menu_iconByCategory=Icone per categoria...
@@ -752,25 +750,19 @@ menu_iconView=Icone
menu_image=Immagine
menu_insert=In&serisci
menu_latex_formula=Formula LaTeX
-menu_links=Collegamenti
menu_manageStyles=Gestione Stili
menu_moveNode=Sposta e Ordina
-menu_navigate=&Naviga
menu_newNode=Nuovo Nodo
menu_node=Nodo
menu_node_features=Caratteristiche nodi
menu_nodes=&Nodi
menu_nodeView=Cuore del Nodo
-menu_notes=Note
menu_noteView=Note
-menu_progress=Avanzamento
menu_remove_icons=Rimuovere le icone
menu_removeAttribute=Rimuovere Attributi
menu_select=Seleziona
menu_time=Gestione Tempi
menu_title=Cuore del Nodo
-menu_toolbars=Barre Strumenti
-menu_view=&Visualizza
menu_viewmode=Visualizza Impostazioni
MenuUtils.invalid_menuitem={0} non \u00E8 una voce del menu valida.
mindmap=Mappa
@@ -792,6 +784,7 @@ ModesMenuAction.MindMap.text=Editor mappe mentali
most_recent_files=&File recenti
MoveToRootAction.text=Vai al nodo centrale
NameConditionAction.text=Imposta nome
+navigate=&Naviga
NavigationNextMapAction.text=Mappa successiva
NavigationPreviousMapAction.text=Mappa precedente
new=&Nuovo
@@ -812,7 +805,6 @@ NewerFileRevisionsFoundDialog.question=Trovata nuova versione di {0}!\nSi vuole
NewerFileRevisionsFoundDialog.restore=Ripris&tina
NewerFileRevisionsFoundDialog.restore.tooltip=Rimpiazzare {0} con {1}
NewerFileRevisionsFoundDialog.title=Nuova revisione del file trovata!
-NewFreeNodeAction.text=Inserire Nodo Libero
NewLevelStyleAction.text=Aggiungere Stile di formattazione automatica
newmap.install.addon.question={0} sembra esserci un pacchetto add-on\nSi vuole installare?\n(Selezionare "No" per aprirlo senza installarlo.)
newmap.install.addon.title=Installare add-on ?
@@ -844,7 +836,7 @@ node_location_help=Trascinare per cambiare la posizione del nodo, ctrl+trascina
node_selector=Selezione Nodo
node_selector_message=Doppio Click seleziona Nodo
node_styles=Stili Nodo
-NodeBackgroundColorAction.text=&Colore sfondo nodo...
+NodeBackgroundColorAction.text=Colore sfondo nodo...
NodeColorAction.text=Colore testo nodo...
NodeColorBlendAction.text=Miscela colore con sfondo mappa
NodeDownAction.text=Sposta Nodo sotto
@@ -852,21 +844,21 @@ NodeExtensions.EditNodeExtensions=Modifica le estensioni dei nodi
NodeExtensions.RemoveNodeExtensions=Rimuovi le estensioni dei nodi
NodeListAction.text=Trova e sostituisci...
NodeListAction.tooltip=Visualizza tutti i nodi come lista ricerche con le propriet\u00E0 del filtro.
-NodeShapeAction.bubble.text=&Bolla
-NodeShapeAction.fork.text=Bi&forcazione
+NodeShapeAction.bubble.text=Bolla
+NodeShapeAction.fork.text=Biforcazione
NodeUpAction.text=Sposta Nodo sopra
-NodeWidthAction.text=Imposta limiti larghezza nodi
nonboldify_branch=Togli grassetto
nonitalicise_branch=Togli corsivo
normal=Normale
not_saved_for_image_error=La mappa deve essere salvata, prima di impostare una immagine da file
not_saved_for_link_error=La mappa deve essere salvata, prima di scegliere un collegamento col selettore file.
note_window_location=Posizione finestra delle note
+notes=Note
ok=&OK
-OKAction.text=&OK
+OKAction.text=OK
OnlineReference.text=Mappa documentazione Online
open_asMindMap=Mappa Mentale
-OpenAction.text=&Apri mappa salvata...
+OpenAction.text=Apri mappa salvata...
OpenFreeplaneSiteAction.text=Homepage di Freeplane
OpenPathAction.text=Apri File
OpenURLMapAction.text=Apri mappa dall'indirizzo...
@@ -1079,8 +1071,6 @@ OptionPanel.nodeformat=Formato
OptionPanel.nodeformat.tooltip=<html>Rimpiazzamento testo e/o Formattazione:<ul><li><em>Espressione del Modello</em> (<tt>%s</tt> \u00E8 il testo originale), es. <tt>DIFFIDARE: %s</tt><li><em>Formattazione di date e numeri</em> - vedere gli esempi nella casella di selezione</ul></html>
OptionPanel.nodenumbering=Num.Nodi
OptionPanel.nodenumbering.tooltip=Aggiungi numeri progressivi (as.1.3.1) al testo dei nodi
-OptionPanel.nodeshape=Stile nodo
-OptionPanel.nodeshape.tooltip=<html>Lo stile descrive la forma esteriore del nodo. <br>Valori possibili:<br><table border="1"><tr><td>fork: </td><td> senza riquadri circostanti,</td></tr><tr><td>bolla: </td><td> nodi con un rettangolo circostante,</td></tr><tr><td>Come genitore: </td><td> acquisisce lo stile dal nodo genitore <br>o lo stile standard per il nodo centrale,</td></tr><tr><td>Combinato: </td><td> Bolla quando il nodo \u00E8 espanso, altrimenti biforcazione.</td></tr></table></html>
OptionPanel.nodetext=Testo del Nodo
OptionPanel.nodetext.tooltip=Qui \u00E8 possibile definire il testo del nodo. Quando viene applicato questo modello, il testo precedente viene scartato.
OptionPanel.nothing=Nulla
@@ -1306,7 +1296,7 @@ overwrite_keyset_question=Sovrascrivere le impostazioni dei tasti esistenti ?
PageAction.text=Impostazione pagina
password_is_not_ascii=La password non \u00E8 un carattere valido ASCII
PasteAction.text=Incolla
-PasteAttributes.text=Incolla att&ributi
+PasteAttributes.text=Incolla attributi
PatternNewNameProperty=Nuovo schema
PatternToString.backgroundColor=Colore di sfondo
PatternToString.Child=Stile nodo figlio
@@ -1376,6 +1366,7 @@ PrintAction.text=Stampa...
PrintDirectAction.text=Stampa
printing_settings=Scalatura stampa
PrintPreviewAction.text=Anteprima di stampa...
+progress=Avanzamento
PropertyAction.dialog=Preferenze
PropertyAction.text=Preferenze...
QuickFilterAction.text=Filtro Veloce
@@ -1418,16 +1409,17 @@ replace_shortcut_title=Rimpiazzare scorciatoia ?
ReportBugAction.text=Segnalare un errore
RequestFeatureAction.text=Richiedere una funzione
reset_to_default=Usa predefinito
-ResetNodeLocationAction.text=Azzera &Posizione
+ResetNodeLocationAction.text=Azzera Posizione
ResetStyleAction.text=Azzera stile nodo
RevertAction.text=Ricarica la mappa dal file
RevisionPluginAction.text=Colore di sfondo per Modifica e Revisione
+save=&Salva
save_failed=Salvataggio della mappa {0} fallito.
save_unsaved=Salvare la seguente mappa ?
save_unsaved_styles=Salvare Stili ?
SaveAcceleratorPresetsAction.text=Salva il set di Tasti Rapidi
-SaveAction.text=&Salva
-SaveAll.text=S&alva tutto
+SaveAction.text=Salva
+SaveAll.text=Salva tutto
SaveAll.tooltip=Salva tutte le mappe aperte.
SaveAsAction.text=Salva con nome
saved=Salvata
@@ -1474,7 +1466,7 @@ SetShortenerStateAction.text=Contenuto accorciato del nodo
sf_login_required=Autenticazione a Source Forge richiesta, Continuare ?
ShowAllAttributesAction.text=Visualizza tutti gli attributi
ShowAncestorsAction.text=Visualizza ascendenti
-ShowAttributeDialogAction.text=&Gestione attributi
+ShowAttributeDialogAction.text=Gestione attributi
ShowDescendantsAction.text=Visualizza discendenti
ShowFilterToolbarAction.text=Barra del Filtro
ShowFormatPanel.text=Pannello di Formattazione
@@ -1705,22 +1697,29 @@ styles_menu=Stili
submenu_keystroke_in_use_error=Il tasto rapido {0} non pu\u00F2 essere utilizzato per il sottomenu {1}. Tasto rapido rimosso.
summary_nodes=Nodi Sommario
summary_not_possible=Impossibile creare un Nodo Sommario per la selezione corrente
-SummaryNodeAction.text=Gruppo Nodi - Riepilogo
svg=SVG
template_dir=Modelli Standard
+TextAlignAction.CENTER.text=Testo centrato
+textalignment=Allineamento testo
TimeListAction.text=Visualizza lista avvisi ...
TimeListAction.tooltip=Visualizza tutti gli avvisi ed i corrispondenti nodi.
TimeManagementAction.text=Gestione Calendario...
TimeManagementAction.tooltip=<html>Gestione Calendario.</html>
+TimePeriodUnits.days=giorni
+TimePeriodUnits.hours=ore
+TimePeriodUnits.minutes=minuti
+TimePeriodUnits.seconds=secondi
+TimePeriodUnits.weeks=settimane
ToggleChildrenFoldedAction.text=Collassa/Espandi figli
ToggleDetailsAction.text=Commuta Dettagli
ToggleFBarAction.text=F-Barra
ToggleFoldedAction.text=Collassa/Espandi
ToggleFullScreenAction.text=Modalit\u00E0 a schermo intero
-ToggleLeftToolbarAction.text=&Barra delle icone
+ToggleLeftToolbarAction.text=Barra delle icone
ToggleMenubarAction.text=Barra dei menu
ToggleStatusAction.text=Visualizza la Linea di Stato
-ToggleToolbarAction.text=&Barra degli strumenti
+ToggleToolbarAction.text=Barra degli strumenti
+toolbars=Barre Strumenti
undefined_error=Si \u00E8 verificato un errore imprevisto. Inviare un rapporto errori, grazie.
underline=Sottolinea
UnderlineAction.text=Sottolinea
@@ -1733,9 +1732,13 @@ UnfoldAllAction.tooltip=<html>Espandi i nodi selezionati e tutti i loro figli.</
UnfoldOneLevelAction.text=Espandi di un livello
UnfoldOneLevelAction.tooltip=<html>Espandi il nodo selezionato di un livello.</html>
up=&Su
+UpConditionAction.text=Su
update_failed=Aggiornamento fallito con messaggio {0}
UpdateCheckAction.text=Controllo Aggiornamenti
updatecheckdialog=Aggiorna finestra controllo
+updater.version.installed=Versione installata
+updater.version.latest=Ultima versione
+updater.viewChangelog=Vedi Changelog
url_error=URL non corretto !
url_open_error=Impossibile aprire l''URL {0}.
used_in_menu=Questo tasto rapido non pu\u00F2 essere impostato, \u00E8 usato per il menu.
@@ -1747,10 +1750,12 @@ user_defined_zoom_status_bar=Impostato il livello di zoom definito dall''utente
user_icon=Icona utente "{0}"
user_template_dir=Modelli Utente
user_zoom=Fattore ingradimento stampa (0.0 - 2.0):
+userScripts=Script
value_format=Formato valore
version_up_to_date=E' gi\u00E0 in uso la versione pi\u00F9 aggiornata
-ViewerControllerAction.text=Immagini Ridimensionabili
+view=&Visualizza
ViewLayoutTypeAction.OUTLINE.text=Visualizzazione lineare ad albero
+web_resources=Risorse Web
WebDocuAction.text=Documentazione web
width=Spessore
wrong_regexp=Errata espressione regolare "{0}", errore {1}
@@ -1764,5 +1769,6 @@ xslt_export.ms_word=Word (2003 e successivi) formato XML
xslt_export.text=Testo semplice
xslt_export_not_possible=Esportazione Freeplane XSLT non possibile
yes=S\u00EC
+zoom=Zoom
ZoomInAction.text=Zoom avanti
ZoomOutAction.text=Zoom indietro
diff --git a/freeplane/resources/translations/Resources_ja.properties b/freeplane/resources/translations/Resources_ja.properties
index e5fd0d2..f734f5f 100644
--- a/freeplane/resources/translations/Resources_ja.properties
+++ b/freeplane/resources/translations/Resources_ja.properties
@@ -35,6 +35,7 @@ actual_node_styles=\u30CE\u30FC\u30C9\u7528\u6761\u4EF6\u5BFE\u5FDC\u30CE\u30FC\
add=\u8FFD\u52A0(&A)
AddConnectorAction.text=\u30B3\u30CD\u30AF\u30BF\u3092\u4ED8\u52A0
AddElementaryConditionAction.text=\u8FFD\u52A0
+AddExecutionLinkAction.text=OS\u30B3\u30DE\u30F3\u30C9\u3092\u5B9F\u884C\u3059\u308B\u30EA\u30F3\u30AF\u3092\u8FFD\u52A0...
AddLocalLinkAction.text=\u30ED\u30FC\u30AB\u30EB\u30EA\u30F3\u30AF\u3092\u4ED8\u52A0
AddMenuItemLinkAction.text=\u6A5F\u80FD\uFF08\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\uFF09\u306B\u30EA\u30F3\u30AF...
AddOnDetailsPanel.authored.by={0} \u4F5C
@@ -45,7 +46,7 @@ AddOnDetailsPanel.homepage=\u30DB\u30FC\u30E0\u30DA\u30FC\u30B8\uFF1A
addons.installer.canceled=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\u3002
addons.installer.confirm.licence=<html><body><h1>\u30E9\u30A4\u30BB\u30F3\u30B9</h1>{0}<p><p><em>\u3053\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u3092\u627F\u8A8D\u3057\u307E\u3059\u304B\uFF1F</em></p></body></html>
addons.installer.failed=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\uFF1A{0}
-addons.installer.freeplaneversion.format.error={0} (\u5024{1})\u306B\u66F8\u5F0F\u30A8\u30E9\u30FC\u304C\u3042\u308A\u307E\u3059\u3002
+addons.installer.freeplaneversion.format.error={0} (\u5024: {1})\u306B\u66F8\u5F0F\u30A8\u30E9\u30FC\u304C\u3042\u308A\u307E\u3059\u3002
addons.installer.html.script=\u30B9\u30AF\u30EA\u30D7\u30C8\u672C\u4F53\u304C HTML \u66F8\u5F0F\u3068\u306A\u3063\u3066\u3044\u306A\u3044\u3088\u3046\u3067\u3059\u3002
addons.installer.install=\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB
addons.installer.invalid.keyboard.shortcut=\u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8 {0} \u306F\u7121\u52B9\u3067\u3059\u3002
@@ -82,8 +83,8 @@ antialias_all=\u3059\u3079\u3066\u306B\u30A2\u30F3\u30C1\u30A8\u30A4\u30EA\u30A2
antialias_edges=\u7DDA\u3060\u3051\u30A2\u30F3\u30C1\u30A8\u30A4\u30EA\u30A2\u30B9
antialias_none=\u30A2\u30F3\u30C1\u30A8\u30A4\u30EA\u30A2\u30B9\u306A\u3057
apply=\u9069\u7528(&A)
-ApplyAction.text=\u9069\u7528(&A)
-ApplyFormatPlugin.text=\u9078\u629E\u30CE\u30FC\u30C9\u306E\u66F8\u5F0F\u5909\u66F4(&C) ...
+ApplyAction.text=\u9069\u7528(A)
+ApplyFormatPlugin.text=\u9078\u629E\u30CE\u30FC\u30C9\u306E\u66F8\u5F0F\u5909\u66F4 ...
ApplyFormatPlugin.tooltip=\u30CE\u30FC\u30C9\u3068\u7DDA\u306E\u5C5E\u6027\u3092\u4E00\u5EA6\u306B\u5909\u66F4\u3067\u304D\u308B\u30C0\u30A4\u30A2\u30ED\u30B0\u3067\u3059\u3002
ApplyNoFilteringAction.text=\u30D5\u30A3\u30EB\u30BF\u89E3\u9664
ApplySelectedViewConditionAction.text=\u9078\u629E\u30CE\u30FC\u30C9\u306B\u7D5E\u3063\u3066\u9069\u7528
@@ -96,6 +97,7 @@ attribute_delete_value=\u5024\u304C\u4E00\u81F4\u3059\u308B\u5C5E\u6027\u3092\u5
attribute_font_size_tooltip=\u5C5E\u6027\u306E\u6587\u5B57\u30B5\u30A4\u30BA\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002
attribute_list_box_label_text=\u5019\u88DC\u5024
attribute_name=\u5C5E\u6027\u540D
+attribute_name_or_value=\u5C5E\u6027\u306E\u540D\u524D\u307E\u305F\u306F\u5024
attribute_replace=\u3000 \u5C5E\u6027\u540D\u30FB\u5024\u3092\u7F6E\u63DB \u3000
attribute_top=\u8AAD\u307F\u8FBC\u307F\u6E08\u307F\u30DE\u30C3\u30D7\u306B\u95A2\u3059\u308B\u65E2\u5B58\u5C5E\u6027
attribute_value=\u5C5E\u6027\u5024
@@ -137,12 +139,16 @@ attributes_visible_tooltip=\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u3068\u3001\u300
automatic_layout=\u81EA\u52D5\u30EC\u30A4\u30A2\u30A6\u30C8
automatic_layout_disabled=\u3057\u306A\u3044
automatically_save_message=\u30DE\u30C3\u30D7\u306F\u81EA\u52D5\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F\u3002 (\u30D5\u30A1\u30A4\u30EB\u540D\uFF1A {0}) ...
+AutomaticEdgeColor.FOR_BRANCHES=\u679D\u3054\u3068
+AutomaticEdgeColor.FOR_COLUMNS=\u5217\u3054\u3068
+AutomaticEdgeColor.FOR_LEVELS=\u968E\u5C64\u3054\u3068
+AutomaticEdgeColor.ON_BRANCH_CREATION=\u679D\u306E\u4F5C\u6210\u6642
AutomaticEdgeColorHookAction.text=\u7DDA\u306E\u8272\u3092\u81EA\u52D5\u9078\u629E
AutomaticLayout.ALL=\u3059\u3079\u3066\u306E\u30CE\u30FC\u30C9\u306B
AutomaticLayout.HEADINGS=\u672B\u7AEF\u30CE\u30FC\u30C9\u3092\u9664\u3044\u3066
AutomaticLayout.level=\u8868\u984C {0}
AutomaticLayout.level.root=\u30BF\u30A4\u30C8\u30EB
-AutomaticLayoutAction.text=\u968E\u5C64\u5225\u30B9\u30BF\u30A4\u30EB\u3092\u9069\u7528(&A)
+AutomaticLayoutAction.text=\u968E\u5C64\u5225\u30B9\u30BF\u30A4\u30EB\u3092\u9069\u7528
AutomaticLayoutAction.tooltip=\u30DE\u30C3\u30D7\u30EC\u30A4\u30A2\u30A6\u30C8\u3092\u81EA\u52D5\u7684\u306B\u8A2D\u5B9A\u3057\u307E\u3059\u3002\u3000\u7B2C\uFF11\u968E\u5C64\u306F\u9ED2\u3001\u7B2C\uFF12\u968E\u5C64\u306F\u9752\u3001\u7B49\u3002
AutomaticLayoutControllerAction.ALL.text=\u3059\u3079\u3066\u306E\u30CE\u30FC\u30C9\u306B\u9069\u7528
AutomaticLayoutControllerAction.HEADINGS.text=\u672B\u7AEF\u30CE\u30FC\u30C9\u3092\u9664\u3044\u3066\u9069\u7528
@@ -153,7 +159,7 @@ background=\u80CC\u666F
bitmaps=\u30D3\u30C3\u30C8\u30DE\u30C3\u30D7
black=\u9ED2
BlinkingNodeHookAction.text=\u30CE\u30FC\u30C9\u3092\u70B9\u6EC5
-BlinkingNodeHookAction.tooltip=<html>\u30CE\u30FC\u30C9\u3092\u70B9\u6EC5\u3055\u305B\u307E\u3059\u3002\u3053\u306E\u30CE\u30FC\u30C9\u3092\u591A\u6570\u306E\u30CE\u30FC\u30C9\u3092\u95A2\u9023\u3065\u3051\u305F\u308A\u3001<br><strong>\u4ED6\u306E\u81EA\u52D5\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u9069\u7528\u3057\u305F\u308A\u3057\u306A\u3044\u3088\u3046\u3001</strong>\u6CE8\u610F\u3057\u3066\u4E0B\u3055\u3044</html>
+BlinkingNodeHookAction.tooltip=<html>\u30CE\u30FC\u30C9\u3092\u70B9\u6EC5\u3055\u305B\u307E\u3059\u3002\u3053\u306E\u30CE\u30FC\u30C9\u3092\u591A\u6570\u306E\u30CE\u30FC\u30C9\u3068\u95A2\u9023\u3065\u3051\u305F\u308A\u3001<br><strong>\u4ED6\u306E\u81EA\u52D5\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u9069\u7528\u3057\u305F\u308A\u3057\u306A\u3044\u3088\u3046\u306B</strong>\u6CE8\u610F\u3057\u3066\u4E0B\u3055\u3044</html>
blue=\u9752
BoldAction.text=\u592A\u5B57
boldify_branch=\u592A\u5B57\u5316
@@ -161,17 +167,20 @@ branch=\u679D
browse=\u53C2\u7167...
calendar_attributes_panel=\u30AB\u30EC\u30F3\u30C0\u30FC\uFF0F\u5C5E\u6027
calendar_panel=\u30AB\u30EC\u30F3\u30C0\u30FC
+can_not_clone_encrypted_node=\u79D8\u533F\u30CE\u30FC\u30C9\u306F\u30AF\u30ED\u30FC\u30F3\u3067\u304D\u307E\u305B\u3093
can_not_connect_to_info_server=\u30B5\u30FC\u30D0\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3002
can_not_delete_predefined_style=\u65E2\u5B9A\u306E\u30B9\u30BF\u30A4\u30EB\u306F\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3002
can_not_delete_root_style=\u30EB\u30FC\u30C8\u30CE\u30FC\u30C9\u306E\u30B9\u30BF\u30A4\u30EB\u306F\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3002
can_not_delete_style_group=\u30B9\u30BF\u30A4\u30EB\u30B0\u30EB\u30FC\u30D7\u306F\u524A\u9664\u3067\u304D\u307E\u305B\u3093\u3002
+can_not_encrypt_cloned_node=\u30AF\u30ED\u30FC\u30F3\u30CE\u30FC\u30C9\u306F\u6697\u53F7\u5316\u3067\u304D\u307E\u305B\u3093
can_not_save_key_set=\u30DB\u30C3\u30C8\u30AD\u30FC\u306E\u8A2D\u5B9A\u3092\u4FDD\u5B58\u3067\u304D\u307E\u305B\u3093\u3002
cancel=\u30AD\u30E3\u30F3\u30BB\u30EB(&C)
-CancelAction.text=\u30AD\u30E3\u30F3\u30BB\u30EB(&C)
+CancelAction.text=\u30AD\u30E3\u30F3\u30BB\u30EB
cannot_add_parent_diff_parents=\u3059\u3079\u3066\u306E\u30CE\u30FC\u30C9\u304C\u540C\u3058\u89AA\u30CE\u30FC\u30C9\u306B\u3064\u306A\u304C\u3063\u3066\u3044\u306A\u3051\u308C\u3070\u3001\u3053\u306E\u6A5F\u80FD\u306F\u4F7F\u3048\u307E\u305B\u3093\u3002
cannot_add_parent_to_root=\u30EB\u30FC\u30C8\u30CE\u30FC\u30C9\u306B\u65B0\u898F\u89AA\u30CE\u30FC\u30C9\u3092\u4ED8\u52A0\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002
cannot_delete_root=\u30EB\u30FC\u30C8\u30CE\u30FC\u30C9\u306E\u524A\u9664\u3084\u5207\u308A\u53D6\u308A\u306F\u3067\u304D\u307E\u305B\u3093\u3002
cannot_join_nodes_with_children=\u5B50\u30CE\u30FC\u30C9\u4ED8\u304D\u306E\u30CE\u30FC\u30C9\u306F\u7D71\u5408\u3067\u304D\u307E\u305B\u3093\u3002
+cannot_move_into_child_node=\u5B50\u30CE\u30FC\u30C9\u3078\u306E\u79FB\u52D5\u306F\u3067\u304D\u307E\u305B\u3093
cannot_move_to_child=\u30CE\u30FC\u30C9\u306F\u81EA\u5206\u306E\u5B50\u30CE\u30FC\u30C9\u306B\u79FB\u52D5\u3067\u304D\u307E\u305B\u3093\u3002
CenterAction.text=\u9078\u629E\u4E2D\u306E\u30D5\u30A9\u30EB\u30C0\u3092\u4E2D\u5FC3\u306B\u8868\u793A
CenterSelectedNodeAction.text=\u9078\u629E\u30CE\u30FC\u30C9\u3092\u4E2D\u592E\u3078
@@ -196,8 +205,10 @@ choose_node_background_color=\u30CE\u30FC\u30C9\u306E\u80CC\u666F\u8272\u3092\u9
choose_node_color=\u30CE\u30FC\u30C9\u306E\u6587\u5B57\u8272\u3092\u9078\u3076...
ClearLinkAnchorAction.text=\u30EA\u30F3\u30AF\u30A2\u30F3\u30AB\u30FC\u3092\u89E3\u9664
ClearLinkAnchorAction.tooltip=<html>\u30CE\u30FC\u30C9\u306B\u30BB\u30C3\u30C8\u6E08\u307F\u306E\u30A2\u30F3\u30AB\u30FC\u3092\u89E3\u9664\u3057\u307E\u3059\u3002</html>
+CloneAction.text=\u30AF\u30ED\u30FC\u30F3\u3068\u3057\u3066\u8CBC\u308A\u4ED8\u3051
close_btn=\u9589\u3058\u308B(&C)
-CloseAction.text=\u8868\u793A\u4E2D\u306E\u30DE\u30C3\u30D7\u3092\u9589\u3058\u308B(&C)
+CloseAction.text=\u8868\u793A\u4E2D\u306E\u30DE\u30C3\u30D7\u3092\u9589\u3058\u308B
+cloud_shapes=\u96F2\u306E\u5F62
CloudAction.text=\u96F2\uFF08\u6A19\u6E96\uFF09\u3092\u4ED8\u52A0\uFF0F\u524A\u9664
CloudColorAction.text=\u96F2\u306E\u8272...
CloudShapeAction.ARC.text=\u30E2\u30AF\u30E2\u30AF
@@ -214,34 +225,37 @@ connector_label=\u30B3\u30CD\u30AF\u30BF\u306E\u30E9\u30D9\u30EB
connector_lines=\u7DDA\u3000 \u7A2E
connector_shapes=\u5F62\u3000 \u72B6
ConnectorColorAction.text=\u30B3\u30CD\u30AF\u30BF\u306E\u8272...
-CopyAction.text=\u30B3\u30D4\u30FC(&C)
+ConvertCloneToIndependentNodeAction.text=\u30AF\u30ED\u30FC\u30F3\u89E3\u9664
+CopyAction.text=\u30B3\u30D4\u30FC(C)
CopyAction.tooltip=\u9078\u629E\u4E2D\u306E\u679D\u3092\u30B3\u30D4\u30FC\u3057\u307E\u3059\u3002
-CopyAttributes.text=\u5C5E\u6027\u3092\u30B3\u30D4\u30FC(&A)
-CopyIDAction.text=\u30CE\u30FC\u30C9 ID \u3092\u30B3\u30D4\u30FC(&D)
+CopyAttributes.text=\u5C5E\u6027\u3092\u30B3\u30D4\u30FC
+CopyIDAction.text=\u30CE\u30FC\u30C9 ID \u3092\u30B3\u30D4\u30FC
CopyMapStylesAction.text=\u30DE\u30C3\u30D7\u306E\u30B9\u30BF\u30A4\u30EB\u3092\u30B3\u30D4\u30FC...
CopyNodeURIAction.text=\u30CE\u30FC\u30C9\u306E URI \u3092\u30B3\u30D4\u30FC
-copyright=Copyright \u00A9 2000-2014 Freeplane team and others
-CopySingleAction.text=\u9078\u629E\u30CE\u30FC\u30C9\u306E\u307F\u30B3\u30D4\u30FC(&S)
+copyright=Copyright \u00A9 2000-2016 Freeplane team and others
+CopySingleAction.text=\u9078\u629E\u30CE\u30FC\u30C9\u306E\u307F\u30B3\u30D4\u30FC
CopySingleAction.tooltip=\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9\u3060\u3051\u30B3\u30D4\u30FC\u3057\u307E\u3059\u3002
CopyStyleExtensionsAction.text=\u30B9\u30BF\u30A4\u30EB\u30CE\u30FC\u30C9\u304B\u3089\u62E1\u5F35\u60C5\u5831\u3092\u30B3\u30D4\u30FC
corrupt_map=\u30DE\u30C3\u30D7\u306E\u5185\u5BB9\u304C\u58CA\u308C\u3066\u3044\u307E\u3059\u3002
CreateConjunctConditionAction.text=And
CreateDisjunctConditionAction.text=Or
CreateNotSatisfiedConditionAction.text=Not
-CreationModificationPluginAction.text=\u66F4\u65B0\u6642\u523B\u3092\u8868\u793A(&M)
-CreationModificationPluginAction.tooltip=\u30CE\u30FC\u30C9\u306E\u4F5C\u6210\u30FB\u5909\u66F4\u6642\u523B\u3092\u8A18\u9332\u3057\u307E\u3059\u3002
+CreationModificationPluginAction.text=\u66F4\u65B0\u6642\u523B\u3092\u8868\u793A
+CreationModificationPluginAction.tooltip=<html>\u30CE\u30FC\u30C9\u306E\u4F5C\u6210\u30FB\u5909\u66F4\u6642\u523B\u3092\u8A18\u9332\u3057\u307E\u3059\u3002</html>
current_dir=\u30DE\u30C3\u30D7
-CutAction.text=\u5207\u308A\u53D6\u308A(&T)
+CutAction.text=\u5207\u308A\u53D6\u308A(T)
decrease_branch_font_size=\u6587\u5B57\u3092\u5C0F\u3055\u304F
DecreaseNodeFontAction.text=\u6587\u5B57\u3092\u5C0F\u3055\u304F
default=\u6A19\u6E96\u30B9\u30BF\u30A4\u30EB
+defaultAuxiliaryWordList=a, the, of
DefaultColorAction.text=\u6A19\u6E96\u8272
+defaultstyle.attributes=\u5C5E\u6027
defaultstyle.details=\u8A73\u7D30
defaultstyle.floating=\u30D5\u30ED\u30FC\u30C6\u30A3\u30F3\u30B0\u30CE\u30FC\u30C9
defaultstyle.note=\u30CE\u30FC\u30C8
delete=\u524A\u9664(&D)
delete_child=\u30CE\u30FC\u30C9\u3092\u524A\u9664
-DeleteAction.text=\u30CE\u30FC\u30C9\u3092\u524A\u9664(&O)
+DeleteAction.text=\u30CE\u30FC\u30C9\u3092\u524A\u9664
DeleteConditionAction.text=\u524A\u9664
DeleteDetailsAction.text=\u30CE\u30FC\u30C9\u306E\u8A73\u7D30\u3092\u524A\u9664
DeleteLevelStyleAction.text=\u968E\u5C64\u5225\u30B9\u30BF\u30A4\u30EB\u3092\u524A\u9664
@@ -263,13 +277,15 @@ edge=\u7DDA
edge_is_formatted_by_style=<html>\u7DDA\u306E\u66F8\u5F0F\u306F\u3001\u30B9\u30BF\u30A4\u30EB\u306B\u3088\u3063\u3066\u5236\u5FA1\u3055\u308C\u3066\u3044\u307E\u3059\u3002<br>\u5FC5\u8981\u306A\u5834\u5408\u306F\u3001\u95A2\u9023\u30B9\u30BF\u30A4\u30EB\u3092\u7DE8\u96C6\u3057\u3066\u304F\u3060\u3055\u3044\u3002</html>
edge_style=\u7DDA\u306E\u5F62\u72B6
edge_width=\u7DDA\u306E\u592A\u3055
+edge_widths=\u7DDA\u306E\u592A\u3055
EdgeColorAction.text=\u7DDA\u306E\u8272...
+EdgeProperties=\u7DDA\u306E\u30D7\u30ED\u30D1\u30C6\u30A3
EdgeStyleAction.bezier.text=\u30D9\u30B8\u30A7\u66F2\u7DDA
-EdgeStyleAction.bezier.tooltip=\u7DDA\u3092\u306A\u3060\u3089\u304B\u306A\u66F2\u7DDA\u3067\u8868\u793A\u3057\u307E\u3059\u3002
+EdgeStyleAction.bezier.tooltip=<html>\u7DDA\u3092\u306A\u3060\u3089\u304B\u306A\u66F2\u7DDA\u3067\u8868\u793A\u3057\u307E\u3059\u3002</html>
EdgeStyleAction.hide_edge.text=\u7DDA\u3092\u96A0\u3059
EdgeStyleAction.hide_edge.tooltip=<html>\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9\u304B\u3089\u89AA\u30CE\u30FC\u30C9\u3078\u306E\u7DDA\u306F\u3001\u70B9\u7DDA\u3067\u8868\u793A\u3057\u307E\u3059\u3002<br>\u305D\u306E\u4ED6\u306E\u5834\u5408\u306F\u3001\u7DDA\u3092\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002</html>
EdgeStyleAction.horizontal.text=\u76F4\u89D2\u66F2\u304C\u308A
-EdgeStyleAction.horizontal.tooltip=\u76F4\u89D2\u306B\u66F2\u304C\u308B\u76F4\u7DDA\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002
+EdgeStyleAction.horizontal.tooltip=<html>\u76F4\u89D2\u306B\u66F2\u304C\u308B\u76F4\u7DDA\u3092\u4F7F\u7528\u3057\u307E\u3059\u3002</html>
EdgeStyleAction.linear.text=\u76F4\u7DDA
EdgeStyleAction.linear.tooltip=\u7DDA\u3092\u89D2\u306E\u7121\u3044\u76F4\u7DDA\u3067\u8868\u793A\u3057\u307E\u3059\u3002
EdgeStyleAction.sharp_bezier.text=\u5148\u7D30\u30D9\u30B8\u30A7\u66F2\u7DDA
@@ -304,9 +320,11 @@ EditLongAction.text=\u30CE\u30FC\u30C9\u30B3\u30A2\u3092\u30C0\u30A4\u30A2\u30ED
EditNoteInDialogAction.text=\u30CE\u30FC\u30C8\u3092\u30C0\u30A4\u30A2\u30ED\u30B0\u7DE8\u96C6...
EditScript=\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u7DE8\u96C6...
EditStylesAction.text=\u30B9\u30BF\u30A4\u30EB\u3092\u7DE8\u96C6
-EncryptedMap.text=\u4FDD\u8B77\uFF08\u6697\u8A3C\uFF09\u4ED8\u304D\u65B0\u898F\u30DE\u30C3\u30D7(&Y)...
+EncryptedMap.text=\u4FDD\u8B77\uFF08\u6697\u8A3C\uFF09\u4ED8\u304D\u65B0\u898F\u30DE\u30C3\u30D7...
EncryptedMap.tooltip=\u65B0\u3057\u3044\u6697\u8A3C\u4ED8\u304D\u79D8\u533F\u30DE\u30C3\u30D7\u3092\u4F5C\u6210\u3057\u307E\u3059\u3002
+encryption=\u6697\u53F7\u5316
enter_base_url=\u76F8\u5BFE\u30EA\u30F3\u30AF\u3092\u8CBC\u308A\u4ED8\u3051\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059\u3002\u30D9\u30FC\u30B9URL\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
+enter_command=\u30B3\u30DE\u30F3\u30C9\u5165\u529B
enter_condition_name=\u65B0\u898F\u6761\u4EF6\u306E\u540D\u79F0\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
enter_confirms=Enter \u3067\u78BA\u5B9A(&E)
enter_keyset_name=\u30DB\u30C3\u30C8\u30AD\u30FC\u306E\u30D7\u30EA\u30BB\u30C3\u30C8\u540D\uFF1A
@@ -320,6 +338,7 @@ error_applying_template=XSL \u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u306E\u9069\u75
error_creating_directory=\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u5148\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3002
error_in_template=\u6A19\u6E96\u30DE\u30C3\u30D7\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8 {0} \u306B\u30A8\u30E9\u30FC\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u3066\u304F\u3060\u3055\u3044\u3002
errornumber={0} \u500B\u306E\u30A8\u30E9\u30FC\u304C\u3042\u308A\u307E\u3059\u3002
+ExecuteScript.script=\u30B9\u30AF\u30EA\u30D7\u30C8
ExecuteScriptError.text=\u30B9\u30AF\u30EA\u30D7\u30C8\u304C\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3002
ExecuteScriptForAllNodes.text=\u3059\u3079\u3066\u306E\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u5B9F\u884C
ExecuteScriptForSelectionAction.text=\u9078\u629E\u30CE\u30FC\u30C9\u306E\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u5B9F\u884C
@@ -333,7 +352,7 @@ export_failed=\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u306B\u5931\u6557\u3057\u307E
export_pdf_text=PDF \u30D5\u30A1\u30A4\u30EB\u306B
export_svg_text=SVG \u753B\u50CF\u306B
export_using_xslt=Freeplane \u30A8\u30AF\u30B9\u30DD\u30FC\u30C8
-ExportAction.text=\u30DE\u30C3\u30D7\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8(&E)...
+ExportAction.text=\u30DE\u30C3\u30D7\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8...
ExportBranchAction.text=\u679D\u3092\u65B0\u3057\u3044\u30DE\u30C3\u30D7\u306B...
ExportBranchToHTMLAction.text=\u679D\u3092 HTML \u30D5\u30A1\u30A4\u30EB\u306B
exported_file={0} \u30D5\u30A1\u30A4\u30EB
@@ -353,6 +372,7 @@ ExternalImageChangeAction.text=\u753B\u50CF\u3092\u5909\u66F4
ExternalImageRemoveAction.text=\u753B\u50CF\u3092\u524A\u9664
ExtractLinkFromTextAction.text=\u30CE\u30FC\u30C9\u6587\u5B57\u5217\u304B\u3089\u30EA\u30F3\u30AF\u8A2D\u5B9A
ExtractLinkFromTextAction.tooltip=\u30CE\u30FC\u30C9\u306B\u542B\u307E\u308C\u308B\u6587\u5B57\u5217\u3092\u57FA\u306B\u30CF\u30A4\u30D1\u30FC\u30EA\u30F3\u30AF\u3092\u8A2D\u5B9A\u3057\u307E\u3059\u3002
+extras=\u30C4\u30FC\u30EB(&T)
f_button_unassigned=\uFF1C\u672A\u5B9A\u7FA9\uFF1E
FaqOpenURLAction.text=\u3088\u304F\u3042\u308B\u8CEA\u554F
file=\u30D5\u30A1\u30A4\u30EB(&F)
@@ -372,7 +392,7 @@ FileProperties_NodeSelectionCount=\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9\u65
FileProperties_TotalFilteredCount=\u30D5\u30A3\u30EB\u30BF\u6761\u4EF6\u9069\u5408\u30CE\u30FC\u30C9\u6570\uFF1A
FileProperties_TotalLeafCount=\u672B\u7AEF\u30CE\u30FC\u30C9\u7DCF\u6570\uFF1A
FileProperties_TotalNodeCount=\u30CE\u30FC\u30C9\u7DCF\u6570\uFF1A
-FilePropertiesAction.text=\u30DE\u30C3\u30D7\u30C7\u30FC\u30BF(&I)
+FilePropertiesAction.text=\u30DE\u30C3\u30D7\u30C7\u30FC\u30BF
FileRevisionsDialog.cancel=\u30AD\u30E3\u30F3\u30BB\u30EB(&C)
FileRevisionsDialog.file_last_modified=\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7
FileRevisionsDialog.file_name=\u30D5\u30A1\u30A4\u30EB\u540D
@@ -383,10 +403,12 @@ FileRevisionsDialog.question={0} \u306E\u66F4\u65B0\u30D5\u30A1\u30A4\u30EB\u304
FileRevisionsDialog.restore=\u5FA9\u5143(&O)
FileRevisionsDialog.restore.tooltip={0} \u3092 {1} \u306B\u7F6E\u63DB\u3057\u307E\u3059\u3002
FileRevisionsDialog.title=\u30D5\u30A1\u30A4\u30EB\u306E\u66F4\u65B0
-filter=\u30D5\u30A3\u30EB\u30BF
+filter=\u30D5\u30A3\u30EB\u30BF(&I)
filter_add=\u5C5E\u6027\u540D\u30FB\u5024\u3092\u4ED8\u52A0(&A)
filter_and=And(&N)
filter_any_text=\u30B3\u30A2\u30C6\u30AD\u30B9\u30C8\u3001\u8A73\u7D30\u3001\u53C8\u306F\u30CE\u30FC\u30C8\u3000
+filter_clone_snapshot=\u9078\u629E\u4E2D\u306E\u30AF\u30ED\u30FC\u30F3\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F
+filter_clones=\u9078\u629E\u4E2D\u306E\u30AF\u30ED\u30FC\u30F3
filter_conditions=\u30D5\u30A3\u30EB\u30BF
filter_contains=\u2283(\u542B\u3080)
filter_created_after=\u4EE5\u964D\u306B\u4F5C\u6210\u3055\u308C\u305F
@@ -429,30 +451,37 @@ filter_reminder_later=\u671F\u9650\u304C\u4ECA\u5F8C\u306E\u3082\u306E
filter_root=\u30EB\u30FC\u30C8\u30CE\u30FC\u30C9
filter_script=\u30B9\u30AF\u30EA\u30D7\u30C8\u30D5\u30A3\u30EB\u30BF
filter_select=\u9078\u629E(&S)
-filter_selected_node_view=\u30D5\u30A3\u30EB\u30BF\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9
+filter_selected_node_view=\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9
filter_selected_node_view_snapshot=\u9078\u629E\u7BC4\u56F2\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F
filter_style=\u30B9\u30BF\u30A4\u30EB
filter_time=\u65E5\u4ED8\u30D5\u30A3\u30EB\u30BF
-FilterComposerDialog.save=\u4FDD\u5B58(&S)
+FilterCondition=\u30D5\u30A3\u30EB\u30BF\u306E\u72B6\u614B
+filterConditions=\u30E6\u30FC\u30B6\u5B9A\u7FA9\u30D5\u30A3\u30EB\u30BF
+filterConditions.noActions=\u5B9A\u7FA9\u30D5\u30A3\u30EB\u30BF\u306A\u3057
filters_not_loaded=\u30D5\u30A3\u30EB\u30BF\u30D5\u30A1\u30A4\u30EB\u304C\u58CA\u308C\u3066\u3044\u3066\u3001\u8AAD\u307F\u8FBC\u307F\u3067\u304D\u307E\u305B\u3093\u3002
+find=\u691C\u7D22
find_what=\u4F55\u3092\u691C\u7D22\u3057\u307E\u3059\u304B\uFF1F
-FindAction.text=\u691C\u7D22...
-FirstGroupNodeAction.text=\u307E\u3068\u3081\u30CE\u30FC\u30C9\u7FA4\u306E\u59CB\u70B9
+FindAction.text=\u691C\u7D22\uFF08&F\uFF09...
+FindNextAction.text=\u5F8C\u65B9\u691C\u7D22
+FindPreviousAction.text=\u524D\u65B9\u691C\u7D22
+fit_background_to_page=\u80CC\u666F\u753B\u50CF\u30921\u30DA\u30FC\u30B8\u306B\u5408\u308F\u305B\u308B
fit_map_to_page=\u5168\u4F53\u3092\uFF11\u30DA\u30FC\u30B8\u306B\u53CE\u3081\u308B(&F)
fit_map_to_page_height=\u7E26\u5E45\u3092\u30DA\u30FC\u30B8\u306B\u5408\u308F\u305B\u308B(&H)
fit_map_to_page_width=\u6A2A\u5E45\u3092\u30DA\u30FC\u30B8\u306B\u5408\u308F\u305B\u308B(&W)
-FitToPage.text=\u30DA\u30FC\u30B8\u306B\u5408\u308F\u305B\u3066\u5168\u4F53\u8868\u793A(&F)
+FitToPage.text=\u30DA\u30FC\u30B8\u306B\u5408\u308F\u305B\u3066\u5168\u4F53\u8868\u793A
FitToPage.tooltip=\u30DE\u30C3\u30D7\u5168\u4F53\u304C\u73FE\u884C\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u53CE\u307E\u308B\u3088\u3046\u306B\u8868\u793A\u500D\u7387\u3092\u8ABF\u6574\u3057\u307E\u3059\u3002
fold=\u6298\u308A\u7573\u3080
FoldAllAction.text=\u3059\u3079\u3066\u6298\u308A\u7573\u3080
FoldAllAction.tooltip=\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9\u306E\u3059\u3079\u3066\u306E\u5B50\u30CE\u30FC\u30C9\u3092\u6298\u308A\u7573\u307F\u3001\u975E\u8868\u793A\u306B\u3057\u307E\u3059\u3002
FoldOneLevelAction.text=\uFF11\u968E\u5C64\u5206\u3060\u3051\u6298\u308A\u7573\u3080
FoldOneLevelAction.tooltip=\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9\u306E\u4E0B\u4F4D\u30CE\u30FC\u30C9\u3092\uFF11\u968E\u5C64\u5206\u3060\u3051\u6298\u308A\u7573\u307F\u307E\u3059\u3002
-follow_graphical_link=\u30EA\u30F3\u30AF\u5148\uFF1A
+follow_clone=''{0}'' \u306E\u914D\u4E0B
+follow_graphical_link=\u30EA\u30F3\u30AF\u5148\uFF1A''{0}''
FollowLinkAction.text=\u30EA\u30F3\u30AF\u5148\u3078\u30B8\u30E3\u30F3\u30D7
font=\u30D5\u30A9\u30F3\u30C8
FontFamilyAction.text=\u30D5\u30A9\u30F3\u30C8\u540D
FontSizeAction.text=\u6587\u5B57\u30B5\u30A4\u30BA
+format=\u66F8\u5F0F(&O)
format_invalid_pattern=\u30D1\u30BF\u30FC\u30F3\u5024\u304C\u4E0D\u9069\u5207
format_menu_cloud_shapes=\u96F2\uFF08\u4ED8\u52A0 or \u5F62\u3092\u5909\u66F4\uFF09
format_menu_edge_styles=\u7DDA\u306E\u5F62\u72B6(&E)
@@ -470,7 +499,7 @@ formula.EvaluateAllAction.tooltip=\u7DE8\u96C6\u4E2D\u306E\u30DE\u30C3\u30D7\u30
formula.menuname=\u8A08\u7B97\u5F0F
formula_editor=\u8A08\u7B97\u5F0F\u3092\u7DE8\u96C6
ForwardAction.text=\u9078\u629E\u5C65\u6B74\u3092\u9032\u3080
-ForwardAction.tooltip=\u9078\u629E\u6B74\u306E\u65B0\u3057\u3044\u3082\u306E\u306B\u5411\u304B\u3063\u3066\u3001\u30B8\u30E3\u30F3\u30D7\u3057\u307E\u3059\u3002
+ForwardAction.tooltip=\u9078\u629E\u5C65\u6B74\u306E\u65B0\u3057\u3044\u3082\u306E\u306B\u5411\u304B\u3063\u3066\u3001\u30B8\u30E3\u30F3\u30D7\u3057\u307E\u3059\u3002
FreeNodeAction.text=\u30D5\u30EA\u30FC\u30DD\u30B8\u30B7\u30E7\u30F3\u30CE\u30FC\u30C9\u306B\u6307\u5B9A\uFF0F\u89E3\u9664
Freeplane.progress.buildScreen=\u753B\u9762\u3092\u69CB\u6210\u4E2D...
Freeplane.progress.createController=\u30B3\u30F3\u30C8\u30ED\u30FC\u30E9\u3092\u4F5C\u6210\u4E2D...
@@ -487,6 +516,8 @@ freeplane_reverted=Freeplane \u306F\u6700\u5F8C\u306B\u624B\u52D5\u4FDD\u5B58\u3
FreeplaneHelpStarter.text=\u30AA\u30F3\u30E9\u30A4\u30F3\u30D8\u30EB\u30D7...
FreeplaneHelpStarter.tooltip=Freeplane \u62E1\u5F35\u30D8\u30EB\u30D7
GettingStartedAction.text=\u30C1\u30E5\u30FC\u30C8\u30EA\u30A2\u30EB
+goto=\u79FB\u52D5
+goto.noActions=\u79FB\u52D5\u5148\u30CE\u30FC\u30C9\u306A\u3057
GotoLinkNodeAction.text=\u30EA\u30F3\u30AF\u5148\u3078\u30B8\u30E3\u30F3\u30D7
GotoNodeAction.text=\u6307\u5B9A ID \u306E\u30CE\u30FC\u30C9\u3078\u30B8\u30E3\u30F3\u30D7...
GrabKeyDialog.common.cancel=\u30AD\u30E3\u30F3\u30BB\u30EB
@@ -502,7 +533,7 @@ help=\u30D8\u30EB\u30D7(&H)
HideableAction.tooltip=\u66F4\u65B0\u3057\u305F\u30CE\u30FC\u30C9\u306E\u80CC\u666F\u8272\u3092\u5909\u66F4\u3057\u307E\u3059\u3002
HideAllAttributesAction.text=\u3059\u3079\u3066\u306E\u5C5E\u6027\u3092\u96A0\u3059
HierarchicalIcons2Action.text=\u5B50\u30CE\u30FC\u30C9\u306E\u5171\u901A\u30A2\u30A4\u30B3\u30F3\u3092\u8868\u793A
-HierarchicalIconsAction.text=\u4E0A\u4F4D\u30CE\u30FC\u30C9\u306B\u3082\u30A2\u30A4\u30B3\u30F3\u8868\u793A(&H)
+HierarchicalIconsAction.text=\u4E0A\u4F4D\u30CE\u30FC\u30C9\u306B\u3082\u30A2\u30A4\u30B3\u30F3\u8868\u793A
HierarchicalIconsAction.tooltip=\u4E0B\u4F4D\u30CE\u30FC\u30C9\u304C\u30A2\u30A4\u30B3\u30F3\u4ED8\u304D\u306E\u5834\u5408\u306B\u3001\u4E0A\u4F4D\u30CE\u30FC\u30C9\u306B\u5C0F\u3055\u3081\u306E\u30A2\u30A4\u30B3\u30F3\u3092\u8868\u793A\u3057\u307E\u3059\u3002
hot_keys=\u30DB\u30C3\u30C8\u30AD\u30FC
hot_keys_table=\u30DB\u30C3\u30C8\u30AD\u30FC\u4E00\u89A7
@@ -642,19 +673,21 @@ IconProgressIconUpAction.text=\u9032\u6357\u5EA6\u3092\u4E0A\u3052\u308B
IconProgressIconUpAction.tooltip=\u8868\u793A\u3059\u308B\u9032\u6357\u5EA6\u30A2\u30A4\u30B3\u30F3\u306E\u5024\u3092\u5F15\u304D\u4E0A\u3052\u307E\u3059\u3002(0% -> 25% -> 50% -> 75% -> 100% + OK).
IconProgressRemoveAction.text=\u9032\u6357\u5EA6\u6307\u6A19\u3092\u524A\u9664
IconProgressRemoveAction.tooltip=\u9032\u6357\u5EA6\u30A2\u30A4\u30B3\u30F3\u3068\u62E1\u5F35\u9032\u6357\u5EA6\u30A2\u30A4\u30B3\u30F3\u3092\u524A\u9664\u3057\u307E\u3059\u3002
+icons=\u30A2\u30A4\u30B3\u30F3
IconSelectionPlugin.text=\u30A2\u30A4\u30B3\u30F3\u4E00\u89A7\u304B\u3089\u9078\u629E...
IconSelectionPlugin.tooltip=\u30B5\u30D6\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u30A2\u30A4\u30B3\u30F3\u7FA4\u3092\u8868\u793A\u3057\u3001\u9078\u629E\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002
image_covertLink=\u30EA\u30F3\u30AF\u3092\u753B\u50CF\u306B\u5909\u63DB
ImageFlavorHandler=\u753B\u50CF(\u72EC\u7ACB\u30D5\u30A1\u30A4\u30EB\u3092\u4F7F\u7528)
-import=\u30A4\u30F3\u30DD\u30FC\u30C8
+import=\u30DE\u30C3\u30D7\u306B\u30A4\u30F3\u30DD\u30FC\u30C8(&M)
import_linked_branch_no_link=\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9\u306B\u8AAD\u307F\u8FBC\u3081\u308B\u30EA\u30F3\u30AF\u304C\u3042\u308A\u307E\u305B\u3093\u3002
-ImportAction.text=\u30DE\u30C3\u30D7\u306B\u30A4\u30F3\u30DD\u30FC\u30C8(&I)
-ImportBranchAction.text=\u5225\u30DE\u30C3\u30D7\u3092\u679D\u3068\u3057\u3066(&B)...
-ImportExplorerFavoritesAction.text=Explorer \u306E\u304A\u6C17\u306B\u5165\u308A\u3092(&E)...
-ImportFolderStructureAction.text=\u30D5\u30A9\u30EB\u30C0\u69CB\u9020\u3092(&F)...
-ImportLinkedBranchAction.text=\u30EA\u30F3\u30AF\u5148\u30DE\u30C3\u30D7\u5168\u4F53\u3092\u3001\u679D\u3068\u3057\u3066(&L)
-ImportLinkedBranchWithoutRootAction.text=\u30EA\u30F3\u30AF\u5148\u30DE\u30C3\u30D7\u306E\u30EB\u30FC\u30C8\u4EE5\u5916\u3092\u3001\u679D\u3068\u3057\u3066(&W)
-ImportMindmanagerFiles.text=MindManager X5 \u30DE\u30C3\u30D7\u3092(&M)...
+ImportAction.text=\u30DE\u30C3\u30D7\u306B\u30A4\u30F3\u30DD\u30FC\u30C8
+ImportBranchAction.text=\u5225\u30DE\u30C3\u30D7\u3092\u679D\u3068\u3057\u3066...
+ImportExplorerFavoritesAction.text=Explorer \u306E\u304A\u6C17\u306B\u5165\u308A\u3092...
+ImportFolderStructureAction.text=\u30D5\u30A9\u30EB\u30C0\u69CB\u9020\u3092...
+ImportLinkedBranchAction.text=\u30EA\u30F3\u30AF\u5148\u30DE\u30C3\u30D7\u5168\u4F53\u3092\u3001\u679D\u3068\u3057\u3066
+ImportLinkedBranchWithoutRootAction.text=\u30EA\u30F3\u30AF\u5148\u30DE\u30C3\u30D7\u306E\u30EB\u30FC\u30C8\u4EE5\u5916\u3092\u3001\u679D\u3068\u3057\u3066
+ImportMindmanagerFiles.text=MindManager X5 \u30DE\u30C3\u30D7\u3092...
+ImportXmlFile.text=XML \u30A4\u30F3\u30DD\u30FC\u30C8
increase_branch_font_size=\u6587\u5B57\u3092\u5927\u304D\u304F
IncreaseNodeFontAction.text=\u6587\u5B57\u3092\u5927\u304D\u304F
internal_error_tooltip=\u5185\u90E8\u51E6\u7406\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u8A73\u7D30\u306F\u3001\u3053\u3053\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u3001\u6700\u65B0\u306E\u30ED\u30B0\u30D5\u30A1\u30A4\u30EB\uFF08log.0\uFF09\u3092\u3054\u89A7\u304F\u3060\u3055\u3044\u3002
@@ -666,22 +699,31 @@ invalid_url_msg={0} \u306B\u95A2\u3057\u3066\u6709\u52B9\u306A URL \u3092\u4F5C\
ItalicAction.text=\u659C\u4F53
italicise_branch=\u659C\u4F53\u5316
java_version=Java version: {0}
-JoinNodesAction.text=\u30CE\u30FC\u30C9\u3092\u7D71\u5408
+JoinNodesAction.separator.format=\u30CE\u30FC\u30C9\u3092 "{0}" \u3067\u7D50\u5408
+lastOpenedMaps=\u6700\u8FD1\u4F7F\u3063\u305F\u30DE\u30C3\u30D7
+lastOpenedMaps.noActions=\u5C65\u6B74\u306A\u3057
latex_editor=LaTeX \u6570\u5F0F\u3092\u7DE8\u96C6
-LatexDeleteLatexAction.text=LaTeX \u6570\u5F0F\u3092\u524A\u9664(&X)
-LatexEditLatexAction.text=LaTeX \u6570\u5F0F\u3092\u7DE8\u96C6(&L)...
+LatexDeleteLatexAction.text=LaTeX \u6570\u5F0F\u3092\u524A\u9664
+LatexEditLatexAction.text=LaTeX \u6570\u5F0F\u3092\u7DE8\u96C6...
LatexInsertLatexAction.msg1=<html>LaTeX \u6570\u5F0F\u3092<i>\u53E4\u3044</i>\u65B9\u6CD5\u3067\u5165\u529B\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059\u3002<br/>LaTeX \u6570\u5F0F\u306E\u65B0\u3057\u3044\u4F5C\u6210\u65B9\u6CD5\u306F\u3001\u3053\u306E\u30DA\u30FC\u30B8\u306B\u8A18\u8F09\u3055\u308C\u3066\u3044\u307E\u3059\uFF1A</html>
LatexInsertLatexAction.msg2=<html>\u8981\u7D04\uFF1A<ul><li>\u30CE\u30FC\u30C9\u30C6\u30AD\u30B9\u30C8\u306E\u5148\u982D\u306B "\\latex " \u3092\u5165\u529B\u3059\u308B\u3002\u307E\u305F\u306F\u3001</li><li><i>\u8868\u793A\u2192\u30D7\u30ED\u30D1\u30C6\u30A3\u30D1\u30CD\u30EB</i> \u305D\u306E\u5F8C <i>\u30CE\u30FC\u30C9\u30B3\u30A2\u306E\u30C6\u30AD\u30B9\u30C8\u2192\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\uFF0F\u66F8\u5F0F\u2192LaTeX</i></li></ul></html>
-LatexInsertLatexAction.text=LaTeX \u6570\u5F0F\u3092\u4ED8\u52A0(&L)...
+LatexInsertLatexAction.text=LaTeX \u6570\u5F0F\u3092\u4ED8\u52A0...
latexPatternFormat=LaTeX
+LengthUnits.cm=cm
+LengthUnits.in=in
+LengthUnits.mm=mm
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=\u30B3\u30CD\u30AF\u30BF\u3092\u633F\u5165\u3059\u308B\u306B\u306F\u3001\u4E8C\u3064\u4EE5\u4E0A\u306E\u30CE\u30FC\u30C9\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002
license=\u30E9\u30A4\u30BB\u30F3\u30B9\uFF1AGPL 2 \u307E\u305F\u306F\u305D\u308C\u4EE5\u964D
license_text=<html>This program is free software; you can redistribute it and/or<br>modify it under the terms of the GNU General Public License<br>as published by the Free Software Foundation; either version 2<br>of the License, or (at your option) any later version.<br><br>This program is distributed in the hope that it will be useful,<br>but WITHOUT ANY WARRANTY; without even the implied warranty of<br>MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>GNU General Public [...]
link_error=\u30EA\u30F3\u30AF\u304C\u4E0D\u9069\u5207\u3067\u3059\u3002\u30EA\u30F3\u30AF "{0}" \u3092\u8AAD\u307F\u8FBC\u3080\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3002
link_not_available_any_more=\u30CE\u30FC\u30C9\u304C\u9014\u4E2D\u3067\u524A\u9664\u3055\u308C\u305F\u305F\u3081\u3001\u30EA\u30F3\u30AF\u306F\u7121\u52B9\u3067\u3059\u3002
link_not_found=\u30EA\u30F3\u30AF\u5148 {0} \u306F\u5B58\u5728\u3057\u307E\u305B\u3093\u3002
+links=\u30EA\u30F3\u30AF
load=\u8AAD\u307F\u8FBC\u307F(&L)
load_accelerator_presets=\u8AAD\u307F\u8FBC\u307F
+load_accelerator_presets.noActions=\u30D7\u30EA\u30BB\u30C3\u30C8\u306A\u3057
LoadAcceleratorPresetsAction.textPatterns.text=\u30C6\u30AD\u30B9\u30C8\u30D1\u30BF\u30FC\u30F3
locking_failed_by_open=\u30DE\u30C3\u30D7 {0} \u306E\u30ED\u30C3\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u8AAD\u307F\u8FBC\u307F\u5C02\u7528\u3067\u958B\u304D\u307E\u3059\u3002
locking_failed_by_save_as=\u30DE\u30C3\u30D7 {0} \u306E\u30ED\u30C3\u30AF\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u300C\u540D\u524D\u3092\u4ED8\u3051\u3066\u4FDD\u5B58...\u300D\u306F\u4E2D\u6B62\u3057\u307E\u3057\u305F\u3002
@@ -689,6 +731,7 @@ locking_old_lock_removed=<html>\u30DE\u30C3\u30D7 {0} \u306F<br>\u30E6\u30FC\u30
long_node_changed_cancel=\u30CE\u30FC\u30C9\u306F\u5909\u66F4\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u5909\u66F4\u3092\u7834\u68C4\u3057\u307E\u3059\u304B\uFF1F
long_node_changed_submit=\u30CE\u30FC\u30C9\u306F\u5909\u66F4\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u5909\u66F4\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F
lots_of_links_warning=\u540C\u4E00\u30CE\u30FC\u30C9\u306B\u591A\u304F\u306E\u30EA\u30F3\u30AF\u3092\u4F5C\u6210\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059\u3002\u672C\u5F53\u306B\u3053\u308C\u3089\u306E\u30EA\u30F3\u30AF\u3092\u4F5C\u6210\u3057\u305F\u3044\u3067\u3059\u304B?
+main_menu=\u30E1\u30CB\u30E5\u30FC
main_resource_directory=Installation resources: {0}
MainView.errorUpdateText=\u30A8\u30E9\u30FC\uFF1A "{0}" \u306B\u7D9A\u3051\u3066\u6587\u5B57\u5217\u304C\u5165\u529B\u3055\u308C\u3066\u3044\u307E\u3059\u3002
MakeLinkFromAnchorAction.text=\u30A2\u30F3\u30AB\u30FC\u304B\u3089\u306E\u30EA\u30F3\u30AF\u3092\u4F5C\u6210
@@ -727,15 +770,20 @@ ManageAddOnsDialog.tab.manage.themes=\u30C6\u30FC\u30DE\u7BA1\u7406
ManageAddOnsDialog.tab.manage.themes.tooltip=\u30C6\u30FC\u30DE\u7BA1\u7406\u7528\u306E\u30C0\u30A4\u30A2\u30ED\u30B0\u3067\u3059\u3002
ManageAddOnsDialog.tab.manage.tooltip=\u30A2\u30C9\u30AA\u30F3\u7BA1\u7406\u7528\u306E\u30C0\u30A4\u30A2\u30ED\u30B0\u3067\u3059\u3002
ManageAddOnsDialog.visit.addon.page=\u30A2\u30C9\u30AA\u30F3\u306E\u30DA\u30FC\u30B8\u3078...
-ManageConditionalStylesAction.text=\u30DE\u30C3\u30D7\u7528\u6761\u4EF6\u5BFE\u5FDC\u30B9\u30BF\u30A4\u30EB\u3092\u7BA1\u7406(&M)
-ManageNodeConditionalStylesAction.text=\u30CE\u30FC\u30C9\u7528\u6761\u4EF6\u5BFE\u5FDC\u30B9\u30BF\u30A4\u30EB\u3092\u7BA1\u7406(&A)
+ManageConditionalStylesAction.text=\u30DE\u30C3\u30D7\u7528\u6761\u4EF6\u5BFE\u5FDC\u30B9\u30BF\u30A4\u30EB\u3092\u7BA1\u7406
+ManageNodeConditionalStylesAction.text=\u30CE\u30FC\u30C9\u7528\u6761\u4EF6\u5BFE\u5FDC\u30B9\u30BF\u30A4\u30EB\u3092\u7BA1\u7406
map_already_exists=\u540C\u540D\u306E\u30DE\u30C3\u30D7\u304C\u3042\u308A\u307E\u3059\u3002\u4E0A\u66F8\u304D\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F
+map_background=\u30DE\u30C3\u30D7\u306E\u80CC\u666F
+map_background_image=\u80CC\u666F\u753B\u50CF
map_corrupted=\u30DE\u30C3\u30D7\u304C\u58CA\u308C\u3066\u3044\u307E\u3059\u3002\u8A73\u7D30\u3092\u8868\u793A\u3057\u307E\u3059\u304B\uFF1F
map_load_error=\u30DE\u30C3\u30D7 {0} \u3092\u8AAD\u307F\u3053\u3080\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3002
map_locked_by_open=<html>\u30DE\u30C3\u30D7 {0} \u306F\u5225\u306E\u30E6\u30FC\u30B6 {1} \u304C\u7DE8\u96C6\u4E2D\u3067\u3059\u3002<br>\u8AAD\u307F\u8FBC\u307F\u5C02\u7528\u3067\u958B\u304D\u307E\u3059\u3002</html>
map_locked_by_save_as=<html>\u30DE\u30C3\u30D7 {0} \u306F\u5225\u306E\u30E6\u30FC\u30B6 {1} \u304C\u7DE8\u96C6\u4E2D\u3067\u3059\u3002<br>\u300C\u540D\u524D\u3092\u4ED8\u3051\u3066\u4FDD\u5B58...\u300D\u3092\u4E2D\u6B62\u3057\u307E\u3057\u305F\u3002</html>
map_not_saved=\u30DE\u30C3\u30D7\u306F\u307E\u3060\u4FDD\u5B58\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
-MapBackgroundColorAction.text=\u30DE\u30C3\u30D7\u306E\u80CC\u666F\u8272...
+MapBackgroundClearAction.text=\u30AF\u30EA\u30A2
+MapBackgroundColorAction.text=\u80CC\u666F\u8272...
+MapBackgroundImageAction.text=\u80CC\u666F\u753B\u50CF...
+maps=\u30DE\u30C3\u30D7
MaxNodeWidth.text=\u6700\u5927\u8868\u793A\u5E45
menu_applyStyle=\u30B9\u30BF\u30A4\u30EB\u3092\u9069\u7528
menu_attributes=\u5C5E\u6027(&A)
@@ -747,10 +795,6 @@ menu_displayAttributes=\u5C5E\u6027
menu_encryption=\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u4FDD\u8B77
menu_error=\u30E6\u30FC\u30B6\u306E\u5B9A\u7FA9\u3057\u305F\u30E1\u30CB\u30E5\u30FC\u69CB\u9020 {0} \u306B\u30A8\u30E9\u30FC\u304C\u3042\u308A\u307E\u3059\u3002\uFF1A\n{1}\n\u4E2D\u6B62\u3057\u307E\u3057\u305F\u3002
menu_extensions=\u30CE\u30FC\u30C9\u62E1\u5F35\u60C5\u5831
-menu_extras=\u30C4\u30FC\u30EB(&T)
-menu_file_import=\u30DE\u30C3\u30D7\u306B\u30A4\u30F3\u30DD\u30FC\u30C8(&M)
-menu_filter=\u30D5\u30A3\u30EB\u30BF(&I)
-menu_format=\u66F8\u5F0F(&O)
menu_group=\u30CE\u30FC\u30C9\u30B0\u30EB\u30FC\u30D7
menu_hoverView=\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7
menu_iconByCategory=\u985E\u5225\u30A2\u30A4\u30B3\u30F3
@@ -758,26 +802,20 @@ menu_iconView=\u30A2\u30A4\u30B3\u30F3
menu_image=\u753B\u50CF
menu_insert=\u633F\u5165(&S)
menu_latex_formula=LaTex \u6570\u5F0F
-menu_links=\u30EA\u30F3\u30AF
menu_manageStyles=\u30B9\u30BF\u30A4\u30EB\u3092\u7BA1\u7406(&M)
menu_moveNode=\u30CE\u30FC\u30C9\u306E\u79FB\u52D5\u3068\u4E26\u3079\u66FF\u3048
-menu_navigate=\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3(&N)
menu_newNode=\u65B0\u898F\u30CE\u30FC\u30C9\u4F5C\u6210
menu_node=\u30CE\u30FC\u30C9
menu_node_features=\u30CE\u30FC\u30C9\u306E\u6A5F\u80FD(&U)
menu_nodes=\u30CE\u30FC\u30C9(&N)
menu_nodeView=\u30CE\u30FC\u30C9\u30B3\u30A2\u95A2\u9023
-menu_notes=\u30CE\u30FC\u30C8
menu_noteView=\u30CE\u30FC\u30C8
menu_openmaps=\u30DE\u30C3\u30D7
-menu_progress=\u9032\u6357\u5EA6
menu_remove_icons=\u30A2\u30A4\u30B3\u30F3\u3092\u524A\u9664
menu_removeAttribute=\u5C5E\u6027\u3092\u524A\u9664
menu_select=\u9078\u629E
menu_time=\u6642\u9593\u7BA1\u7406
menu_title=\u30CE\u30FC\u30C9\u30B3\u30A2\u95A2\u9023
-menu_toolbars=\u30C4\u30FC\u30EB\u30D0\u30FC
-menu_view=\u8868\u793A(&V)
menu_viewmode=\u30D3\u30E5\u30FC\u30E2\u30FC\u30C9
MenuUtils.invalid_menuitem=\u30E1\u30CB\u30E5\u30FC\u9805\u76EE\u30AD\u30FC {0} \u306F\u7121\u52B9\u3067\u3059\u3002
mindmap=\u30DE\u30C3\u30D7
@@ -791,18 +829,21 @@ mode_File=\u30D5\u30A1\u30A4\u30E9\u30FC
mode_MindMap=\u30DE\u30C3\u30D7\u7DE8\u96C6
mode_na=\u3053\u306E\u30E2\u30FC\u30C9\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002
mode_status=\u30E2\u30FC\u30C9\u3092 {0} \u3078\u5909\u66F4\u3057\u307E\u3057\u305F\u3002
+mode_StyleMap=\u30B9\u30BF\u30A4\u30EB\u7DE8\u96C6
mode_title=Freeplane - {0} \u30E2\u30FC\u30C9
modes=\u30E2\u30FC\u30C9
ModesMenuAction.Browse.text=\u30DE\u30C3\u30D7\u95B2\u89A7\u30E2\u30FC\u30C9
ModesMenuAction.File.text=\u30D5\u30A1\u30A4\u30E9\u30FC\u30E2\u30FC\u30C9
ModesMenuAction.MindMap.text=\u30DE\u30C3\u30D7\u7DE8\u96C6\u30E2\u30FC\u30C9
most_recent_files=\u6700\u8FD1\u4F7F\u3063\u305F\u30DE\u30C3\u30D7
+MoveAction.text=\u79FB\u52D5
MoveToRootAction.text=\u30EB\u30FC\u30C8\u30CE\u30FC\u30C9\u3078\u30B8\u30E3\u30F3\u30D7
NameConditionAction.text=\u540D\u79F0\u3092\u6307\u5B9A
+navigate=\u30CA\u30D3\u30B2\u30FC\u30B7\u30E7\u30F3(&N)
NavigationNextMapAction.text=\u6B21\u306E\u30DE\u30C3\u30D7
NavigationPreviousMapAction.text=\u524D\u306E\u30DE\u30C3\u30D7
new=\u65B0\u898F(&N)
-new_map_from_user_templates.text=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u304B\u3089\u65B0\u898F\u30DE\u30C3\u30D7(&T)...
+new_map_from_user_templates.text=\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u304B\u3089\u65B0\u898F\u30DE\u30C3\u30D7...
new_mindmap=\u65B0\u898F\u30DE\u30A4\u30F3\u30C9\u30DE\u30C3\u30D7
new_node=\u65B0\u898F\u30CE\u30FC\u30C9
new_node_as_sibling_not_possible_for_the_root=\u30EB\u30FC\u30C8\u30CE\u30FC\u30C9\u306B\u5144\u5F1F\u30CE\u30FC\u30C9\u3092\u4ED8\u52A0\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093\u3002
@@ -819,11 +860,11 @@ NewerFileRevisionsFoundDialog.question={0} \u306E\u65B0\u3057\u3044\u4FEE\u6B63\
NewerFileRevisionsFoundDialog.restore=\u5FA9\u5143(&O)
NewerFileRevisionsFoundDialog.restore.tooltip={0} \u3092 {1} \u306B\u7F6E\u63DB\u3057\u307E\u3059\u3002
NewerFileRevisionsFoundDialog.title=\u65B0\u3057\u3044\u6539\u8A02\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F\u3002
-NewFreeNodeAction.text=\u65B0\u898F\u30D5\u30EA\u30FC\u30CE\u30FC\u30C9
+NewFreeNodeAction.text=\u65B0\u898F\u30D5\u30ED\u30FC\u30C6\u30A3\u30F3\u30B0\u30CE\u30FC\u30C9
NewLevelStyleAction.text=\u81EA\u52D5\u30EC\u30A4\u30A2\u30A6\u30C8\u30B9\u30BF\u30A4\u30EB\u306B\u65B0\u968E\u5C64\u3092\u8FFD\u52A0
newmap.install.addon.question={0} \u306F\u30A2\u30C9\u30AA\u30F3\u30D1\u30C3\u30B1\u30FC\u30B8\u306E\u3088\u3046\u3067\u3059\u3002\n\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u307E\u3059\u304B\uFF1F\n\uFF08"\u3044\u3044\u3048"\u3092\u9078\u629E\u3059\u308B\u3068\u3001\u901A\u5E38\u901A\u308A\u958B\u304D\u307E\u3059\u3002\uFF09
newmap.install.addon.title=\u30A2\u30C9\u30AA\u30F3\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u307E\u3059\u304B\uFF1F
-NewMapAction.text=\u65B0\u898F\u30DE\u30C3\u30D7(&N)
+NewMapAction.text=\u65B0\u898F\u30DE\u30C3\u30D7
NewMapViewAction.text=\u65B0\u898F\u306E\u30DE\u30C3\u30D7\u30D3\u30E5\u30FC\u3092\u4F5C\u6210
NewParentNode.text=\u65B0\u898F\u89AA\u30CE\u30FC\u30C9
NewParentNode.tooltip=\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9\u306E\u524D\u306B\u65B0\u3057\u3044\u89AA\u30CE\u30FC\u30C9\u3092\u633F\u5165\u3057\u307E\u3059\u3002
@@ -848,10 +889,11 @@ node=\u30CE\u30FC\u30C9
node_changed_discard_changes=\u3059\u3067\u306B\u30CE\u30FC\u30C9\u3092\u5909\u66F4\u3057\u3066\u3044\u307E\u3059\u3002\u5909\u66F4\u70B9\u3092\u7834\u68C4\u3057\u307E\u3059\u304B\uFF1F
node_is_write_protected=\u3053\u306E\u30CE\u30FC\u30C9\u306F\u66F8\u304D\u8FBC\u307F\u7981\u6B62\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002
node_location_help=\u30C9\u30E9\u30C3\u30B0\u3067\u30CE\u30FC\u30C9\u306E\u4F4D\u7F6E\u304C\u5909\u308F\u308A\u307E\u3059\u3002Ctrl\uFF0B\u30C9\u30E9\u30C3\u30B0\u3067\u30CE\u30FC\u30C9\u9593\u306E\u9593\u9694\u304C\u5909\u308F\u308A\u307E\u3059\u3002\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u304A\u3088\u3073 Ctrl \uFF0B\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u3067\u5143\u306B\u623B\u308A\u307E\u3059\u3002
+node_popup_scripting=\u30B9\u30AF\u30EA\u30D7\u30C8
node_selector=\u30CE\u30FC\u30C9\u3092\u9078\u629E
node_selector_message=\u30C0\u30D6\u30EB\u30AF\u30EA\u30C3\u30AF\u3067\u30CE\u30FC\u30C9\u3092\u9078\u629E
node_styles=\u30CE\u30FC\u30C9\u306E\u30B9\u30BF\u30A4\u30EB\uFF1A
-NodeBackgroundColorAction.text=\u30CE\u30FC\u30C9\u306E\u80CC\u666F\u8272(&N)...
+NodeBackgroundColorAction.text=\u30CE\u30FC\u30C9\u306E\u80CC\u666F\u8272...
NodeColorAction.text=\u30CE\u30FC\u30C9\u306E\u6587\u5B57\u8272...
NodeColorBlendAction.text=\u30CE\u30FC\u30C9\u306E\u6587\u5B57\u8272\u3092\u8584\u304F
NodeDownAction.text=\u30CE\u30FC\u30C9\u3092\u79FB\u52D5\uFF08\u5144\u5F1F\u9593\u3067\u4E0B\u3078\uFF09
@@ -859,21 +901,30 @@ NodeExtensions.EditNodeExtensions=\u62E1\u5F35\u30CE\u30FC\u30C9\u30C7\u30FC\u30
NodeExtensions.RemoveNodeExtensions=\u62E1\u5F35\u30CE\u30FC\u30C9\u30C7\u30FC\u30BF\u3092\u524A\u9664
NodeListAction.text=\u691C\u7D22\uFF06\u7F6E\u63DB...
NodeListAction.tooltip=\u30A4\u30F3\u30AF\u30EA\u30E1\u30F3\u30BF\u30EB\u30B5\u30FC\u30C1\u306B\u3088\u308A\u3001\u7F6E\u63DB\u5BFE\u8C61\u30CE\u30FC\u30C9\u304C\u30EA\u30B9\u30C8\u30A2\u30C3\u30D7\u3055\u308C\u307E\u3059\u3002
-NodeShapeAction.bubble.text=\u56F2\u307F(&B)
-NodeShapeAction.fork.text=\u30D5\u30A9\u30FC\u30AF(&F)
+NodeShapeAction.bubble.text=\u56F2\u307F(B)
+NodeShapeAction.fork.text=\u30D5\u30A9\u30FC\u30AF(F)
+NodeShapeAction.narrow_hexagon.text=\u7D30\u3044\u516D\u89D2\u5F62
+NodeShapeAction.oval.text=\u6955\u5186
+NodeShapeAction.rectangle.text=\u77E9\u5F62
+NodeShapeAction.small_bubble.text=\u5C0F\u3055\u306A\u56F2\u307F
+NodeShapeAction.wide_hexagon.text=\u592A\u3044\u516D\u89D2\u5F62
NodeUpAction.text=\u30CE\u30FC\u30C9\u3092\u79FB\u52D5\uFF08\u5144\u5F1F\u9593\u3067\u4E0A\u3078\uFF09
-NodeWidthAction.text=\u30CE\u30FC\u30C9\u306E\u8868\u793A\u5E45\u3092\u8A2D\u5B9A...
nonboldify_branch=\u592A\u5B57\u89E3\u9664
nonitalicise_branch=\u659C\u4F53\u89E3\u9664
normal=\u901A\u5E38
not_saved_for_image_error=\u753B\u50CF\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u5B9A\u3059\u308B\u524D\u306B\u3001\u30DE\u30C3\u30D7\u3092\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044\u3002
not_saved_for_link_error=\u30EA\u30F3\u30AF\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u5B9A\u3059\u308B\u524D\u306B\u3001\u30DE\u30C3\u30D7\u3092\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044\u3002
note_window_location=\u30CE\u30FC\u30C8\u30D1\u30CD\u30EB\u306E\u4F4D\u7F6E
+notes=\u30CE\u30FC\u30C8
+NotificationOptions.CLOSE=\u9589\u3058\u308B
+NotificationOptions.REMIND_ME_LATER=\u30EA\u30DE\u30A4\u30F3\u30C9\u306E\u5EF6\u671F
+NotificationOptions.REMOVE_REMINDER=\u30EA\u30DE\u30A4\u30F3\u30C0\u306E\u524A\u9664
+NotificationOptions.SELECT_NODE=\u30EA\u30DE\u30A4\u30F3\u30C0\u3078\u79FB\u52D5
ok=OK(&O)
-OKAction.text=OK(&O)
+OKAction.text=OK(O)
OnlineReference.text=\u30DE\u30CB\u30E5\u30A2\u30EB\u30DE\u30C3\u30D7\uFF08\u30AA\u30F3\u30E9\u30A4\u30F3\uFF09
open_asMindMap=\u30DE\u30A4\u30F3\u30C9\u30DE\u30C3\u30D7
-OpenAction.text=\u4FDD\u5B58\u30DE\u30C3\u30D7\u3092\u958B\u304F(&O)...
+OpenAction.text=\u4FDD\u5B58\u30DE\u30C3\u30D7\u3092\u958B\u304F...
OpenFreeplaneSiteAction.text=Freeplane \u30DB\u30FC\u30E0\u30DA\u30FC\u30B8
OpenMapsAddLocation.text=OpenMaps \u306E\u4F4D\u7F6E\u3092\u8FFD\u52A0...
OpenMapsRemoveLocation.text=OpenMaps \u306E\u4F4D\u7F6E\u3092\u524A\u9664
@@ -934,6 +985,8 @@ OptionPanel.combined=\u8907\u5408
OptionPanel.compare_as_number=\u6570\u5024\u3068\u3057\u3066\u6BD4\u8F03
OptionPanel.convert_to_current_version=\u65E7\u30D0\u30FC\u30B8\u30E7\u30F3\u306E Freeplane \u306E\u30DE\u30A4\u30F3\u30C9\u30DE\u30C3\u30D7\u3092\u73FE\u884C\u30D0\u30FC\u30B8\u30E7\u30F3\u306E\u3082\u306E\u306B\u81EA\u52D5\u5909\u63DB\u3057\u307E\u3059\u304B\uFF1F
OptionPanel.convert_to_current_version.tooltip=<html>\u5DE8\u5927\u30DE\u30C3\u30D7\u306B\u9650\u3063\u3066\u306F\u3001\u30D5\u30A1\u30A4\u30EB\u5909\u63DB\u3059\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093\u3002\uFF08\u3053\u308C\u306F\u3001\u5C02\u9580\u77E5\u8B58\u306B\u95A2\u308F<br>\u308B\u4E8B\u9805\u3067\u3059\uFF09\u3002\u305D\u3046\u3057\u305F\u30DE\u30C3\u30D7\u306F\u5909\u63DB\u3057\u306A\u304F\u3066\u3082\u958B\u304F\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002</html>
+OptionPanel.copyFormatToNewSibling=\u65B0\u898F\u5144\u5F1F\u30CE\u30FC\u30C9\u3078\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u30B3\u30D4\u30FC
+OptionPanel.copyFormatToNewSiblingIncludesIcons=\u30A2\u30A4\u30B3\u30F3\u4ED8\u304D\u3067\u30D5\u30A9\u30FC\u30DE\u30C3\u30C8\u3092\u30B3\u30D4\u30FC
OptionPanel.cs=\u30C1\u30A7\u30B3\u8A9E\uFF0F\u010Desky
OptionPanel.cut_nodes_without_question=\u30CE\u30FC\u30C9\u5207\u308A\u53D6\u308A\u6642\u306B\u78BA\u8A8D\u3092\u7701\u7565
OptionPanel.cut_nodes_without_question.tooltip=<html>\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u3068\u3001\u30CE\u30FC\u30C9\u5207\u308A\u53D6\u308A\u6642\u306B\u78BA\u8A8D\u30C0\u30A4\u30A2\u30ED\u30B0\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002\u4E0D\u6CE8\u610F\u306B\u3088\u308A\u60C5\u5831<br>\u304C\u5931\u308F\u308C\u308B\u6050\u308C\u304C\u3042\u308A\u307E\u3059\u3002</html>
@@ -947,14 +1000,15 @@ OptionPanel.default=\u6A19\u6E96
OptionPanel.default_attribute_key_column_width=\u5C5E\u6027\u30AD\u30FC\u306E\u6A19\u6E96\u8868\u793A\u5E45
OptionPanel.default_attribute_value_column_width=\u5C5E\u6027\u5024\u306E\u6A19\u6E96\u8868\u793A\u5E45
OptionPanel.default_browser_command_mac=Mac OS X
-OptionPanel.default_browser_command_mac.tooltip=MAC\u306E\u5834\u5408 (thanks to Nick!)
+OptionPanel.default_browser_command_mac.tooltip=<html>MAC\u306E\u5834\u5408 (thanks to Nick!)</html>
OptionPanel.default_browser_command_other_os=\u305D\u306E\u4ED6\u306EOS
-OptionPanel.default_browser_command_other_os.tooltip=\u4E3B\u306B Linux \u306E\u5834\u5408
+OptionPanel.default_browser_command_other_os.tooltip=<html>\u4E3B\u306B Linux \u306E\u5834\u5408</html>
OptionPanel.default_browser_command_windows_9x=Windows 9X
-OptionPanel.default_browser_command_windows_9x.tooltip=Windows \u306E\u5834\u5408\uFF1A\u30EA\u30F3\u30AF\u306E URL \u306B "=" \u304C\u542B\u307E\u308C\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u3001 "" \u306E\u7B26\u53F7\u304C\u5FC5\u8981\u3067\u3059\u3002
+OptionPanel.default_browser_command_windows_9x.tooltip=<html>Windows \u306E\u5834\u5408\uFF1A\u30EA\u30F3\u30AF\u306E URL \u306B "=" \u304C\u542B\u307E\u308C\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u3001 "" \u306E\u7B26\u53F7\u304C\u5FC5\u8981\u3067\u3059\u3002</html>
OptionPanel.default_browser_command_windows_nt=Windows NT
-OptionPanel.default_browser_command_windows_nt.tooltip=Windows \u306E\u5834\u5408\uFF1A\u30EA\u30F3\u30AF\u306E URL \u306B "=" \u304C\u542B\u307E\u308C\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u3001 "" \u306E\u7B26\u53F7\u304C\u5FC5\u8981\u3067\u3059\u3002
+OptionPanel.default_browser_command_windows_nt.tooltip=<html>Windows \u306E\u5834\u5408\uFF1A\u30EA\u30F3\u30AF\u306E URL \u306B "=" \u304C\u542B\u307E\u308C\u308B\u3053\u3068\u304C\u3042\u308B\u306E\u3067\u3001 "" \u306E\u7B26\u53F7\u304C\u5FC5\u8981\u3067\u3059\u3002</html>
OptionPanel.default_charset=\u6587\u5B57\u30B3\u30FC\u30C9
+OptionPanel.default_save_dir=\u65E2\u5B9A\u306E\u4FDD\u5B58\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA
OptionPanel.Defaults=\u57FA\u672C\u8A2D\u5B9A
OptionPanel.delete_automatic_saves_at_exit=\u7D42\u4E86\u6642\u306B\u81EA\u52D5\u4FDD\u5B58\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html>\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u3068\u3001Freeplane \u306E\u901A\u5E38\u7D42\u4E86\u6642\u306B\u81EA\u52D5\u4FDD\u5B58\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u307E\u3059\u3002<br>\u8A33\u8005\u6CE8\uFF1A\u3053\u306E\u6A5F\u80FD\u306B\u3088\u308A\u524A\u9664\u3055\u308C\u308B\u306E\u306F\u300C\u81EA\u52D5\u4FDD\u5B58\u30D5\u30A1\u30A4\u30EB\u300D\u3060\u3051\u3067\u3059\u3002\u300C\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7< [...]
@@ -986,6 +1040,7 @@ OptionPanel.en=\u82F1\u8A9E\uFF0FEnglish
OptionPanel.Environment=\u74B0\u5883
OptionPanel.es=\u30B9\u30DA\u30A4\u30F3\u8A9E\uFF0Fespa\u00F1ol, castellano
OptionPanel.et=\u30A8\u30B9\u30C8\u30CB\u30A2\u8A9E\uFF0Feesti, eesti keel
+OptionPanel.eu=\u30D0\u30B9\u30AF\u8A9E
OptionPanel.execute_scripts_without_asking=\u30B9\u30AF\u30EA\u30D7\u30C8\u306E\u5B9F\u884C\u3092\u8A31\u53EF
OptionPanel.execute_scripts_without_asking.tooltip=<html>Freeplane \u306E\u30B9\u30AF\u30EA\u30D7\u30C8 \u306F\u3001\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u4E0A\u3067\u5927\u62B5\u306E\u52D5\u4F5C\u3092\u53EF\u80FD\u306B\u3057\u307E\u3059\u3002 \u3057\u305F\u304C\u3063\u3066\u3001<br>\u5B89\u5168\u304C\u78BA\u8A8D\u3055\u308C\u3066\u3044\u306A\u3044\u30B9\u30AF\u30EA\u30D7\u30C8\u306F\u5B9F\u884C\u3057\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002</html>
OptionPanel.execute_scripts_without_exec_restriction=<html>\u4ED6\u306E\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u306E\u5B9F\u884C\u3092\u8A31\u53EF<br>\uFF08\u63A8\u5968\u3057\u307E\u305B\u3093\uFF09</html>
@@ -1003,6 +1058,7 @@ OptionPanel.export_icons_in_html.tooltip=<html>Freeplane \u304B\u3089\u66F8\u304
OptionPanel.exported_image_resolution_dpi=\u51FA\u529B\u753B\u50CF\u306E\u89E3\u50CF\u5EA6 (DPI)
OptionPanel.Files=\u30D5\u30A1\u30A4\u30EB
OptionPanel.first=\u5192\u982D
+OptionPanel.fit_to_viewport=\u80CC\u666F\u753B\u50CF\u3092\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u5408\u308F\u305B\u308B
OptionPanel.fold_on_click_inside=\u30CE\u30FC\u30C9\u30B3\u30A2\u306E\u30AF\u30EA\u30C3\u30AF\u3067\u6298\u308A\u7573\u3080
OptionPanel.foldingsymbolwidth=\u6298\u308A\u7573\u307F\u4E2D\u30B7\u30F3\u30DC\u30EB\u306E\u5E45(\u30D4\u30AF\u30BB\u30EB)
OptionPanel.foldingsymbolwidth.tooltip=\u6298\u308A\u7573\u307F\u4E2D\u30B7\u30F3\u30DC\u30EB\u306E\u300C\u25CB\u300D\u306E\u5E45\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002
@@ -1041,8 +1097,10 @@ OptionPanel.id=\u30A4\u30F3\u30C9\u30CD\u30B7\u30A2\u8A9E\uFF0FBahasa Indonesia
OptionPanel.IGNORE=\u4F55\u3082\u3057\u306A\u3044
OptionPanel.il__enter_confirms_by_default=Enter \u3067\u78BA\u5B9A
OptionPanel.image_cache=\u753B\u50CF
+OptionPanel.indentationUsesTabsInTextOutput=\u30C6\u30AD\u30B9\u30C8\u51FA\u529B\u306B\u30BF\u30D6\u3092\u4F7F\u7528\u3059\u308B
OptionPanel.it=\u30A4\u30BF\u30EA\u30A2\u8A9E\uFF0FItaliano
OptionPanel.ja=\u65E5\u672C\u8A9E\uFF0F\u65E5\u672C\u8A9E
+OptionPanel.JoinNodesAction.textSeparators=\u30C6\u30AD\u30B9\u30C8\u5206\u96E2\u8A18\u53F7
OptionPanel.key_type_action=\u30AD\u30FC\u30BF\u30A4\u30D7\u306E\u52D5\u4F5C
OptionPanel.Keystrokes=\u30AD\u30FC\u8A2D\u5B9A
OptionPanel.ko=\u97D3\u56FD\u8A9E\uFF0F \uD55C\uAD6D\uC5B4 (\u97D3\u570B\u8A9E), \uC870\uC120\uB9D0 (\u671D\u9BAE\u8A9E)
@@ -1057,7 +1115,7 @@ OptionPanel.latex_disable_editor.tooltip=LaTex\u30A8\u30C7\u30A3\u30BF\u306B\u55
OptionPanel.latex_editor_font=LaTeX\u30B7\u30F3\u30BF\u30C3\u30AF\u30B9\u30CF\u30A4\u30E9\u30A4\u30C8\u30A8\u30C7\u30A3\u30BF\u306E\u30D5\u30A9\u30F3\u30C8
OptionPanel.latex_editor_font.tooltip=Unicode\u6587\u5B57\u304C\u5FC5\u8981\u306A\u3089 'Dialog' \u304B 'Monospaced' \u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF01
OptionPanel.latex_editor_font_size=LaTeX\u30B7\u30F3\u30BF\u30C3\u30AF\u30B9\u30CF\u30A4\u30E9\u30A4\u30C8\u30A8\u30C7\u30A3\u30BF\u306E\u30D5\u30A9\u30F3\u30C8\u30B5\u30A4\u30BA
-OptionPanel.latex_macros=\u4E00\u822C\u7684\u306A LaTeX \u30DE\u30AF\u30ED
+OptionPanel.latex_macros=\u5171\u901A LaTeX \u30DE\u30AF\u30ED
OptionPanel.layout_map_on_text_change=\u7DE8\u96C6\u4E2D\u306B\u30DE\u30C3\u30D7\u3092\u81EA\u52D5\u30EC\u30A4\u30A2\u30A6\u30C8
OptionPanel.layout_map_on_text_change.tooltip=\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u3092\u512A\u5148\u3059\u308B\u5834\u5408\u306F\u7121\u52B9\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
OptionPanel.linear=\u76F4\u7DDA
@@ -1082,6 +1140,7 @@ OptionPanel.max_shortened_text_length=\u30C6\u30AD\u30B9\u30C8\u306E\u6700\u5927
OptionPanel.metal=Metal
OptionPanel.min_node_width=\u30CE\u30FC\u30C9\u306E\u6700\u5C0F\u8868\u793A\u5E45
OptionPanel.motif=Motif
+OptionPanel.narrow_hexagon=\u7D30\u3044\u516D\u89D2\u5F62
OptionPanel.nb=\u30CE\u30EB\u30A6\u30A7\u30FC\u8A9E\uFF08\u30D6\u30FC\u30AF\u30E2\u30FC\u30EB\uFF09\uFF0FNorsk bokm\u00E5l
OptionPanel.never_save_folding=\u4FDD\u5B58\u3057\u306A\u3044
OptionPanel.nl=\u30AA\u30E9\u30F3\u30C0\u8A9E\uFF0FNederlands, Vlaams
@@ -1100,7 +1159,6 @@ OptionPanel.nodeformat.tooltip=<html>\u30C6\u30AD\u30B9\u30C8\u306E\u7F6E\u63DB\
OptionPanel.nodenumbering=\u30CE\u30FC\u30C9\u306B\u756A\u53F7\u3092\u632F\u308B
OptionPanel.nodenumbering.tooltip=\u30CE\u30FC\u30C9\u30C6\u30AD\u30B9\u30C8\u306B\u9023\u756A\uFF08\u4F8B\uFF1A1.3.1\uFF09\u3092\u632F\u308A\u307E\u3059\u3002
OptionPanel.nodeshape=\u30CE\u30FC\u30C9\u306E\u5F62
-OptionPanel.nodeshape.tooltip=<html>\u30CE\u30FC\u30C9\u306E\u5916\u5F62\u306E\u3053\u3068\u3067\u3059\u3002<br>\u4F7F\u7528\u3067\u304D\u308B\u9078\u629E\u80A2\u306F\u6B21\u306E\u3068\u304A\u308A\u3067\u3059\u3002<br><table border="1"><tr><td> \u30D5\u30A9\u30FC\u30AF </td><td> \u67A0\u56F2\u3044\u306F\u7121\u304F\u3066\u3001\u7DDA\u306E\u4E0A\u306B\u6587\u5B57\u5217\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002</td></tr><tr><td> \u56F2\u307F </td><td> \u56DB\u89D2\u3044\u67A0\u56F2\ [...]
OptionPanel.nodetext=\u30B3\u30A2\u30C6\u30AD\u30B9\u30C8
OptionPanel.nodetext.tooltip=\u30CE\u30FC\u30C9\u306E\u30C6\u30AD\u30B9\u30C8\u3092\u5B9A\u7FA9\u3067\u304D\u307E\u3059\u3002\u30D1\u30BF\u30FC\u30F3\u3092\u9069\u7528\u3059\u308B\u3068\u4EE5\u524D\u306E\u30C6\u30AD\u30B9\u30C8\u304C\u306A\u304F\u306A\u308A\u307E\u3059\u3002
OptionPanel.nothing=\u306A\u3057
@@ -1114,11 +1172,16 @@ OptionPanel.org.freeplane.plugin.bugreport.allowed=\u5E38\u306B\u9001\u4FE1
OptionPanel.org.freeplane.plugin.bugreport.ask=\u30EC\u30DD\u30FC\u30C8\u30C0\u30A4\u30A2\u30ED\u30B0\u3092\u8868\u793A
OptionPanel.org.freeplane.plugin.bugreport.denied=\u5E38\u306B\u9001\u4FE1\u3057\u306A\u3044
OptionPanel.org.freeplane.plugin.bugreport.userid=\u30D0\u30B0\u5831\u544A\u306B\u7528\u3044\u308B ID
-OptionPanel.outline_hgap=\u5DE6\u53F3\u306E\u9593\u9694(\u30D4\u30AF\u30BB\u30EB)
-OptionPanel.outline_vgap=\u4E0A\u4E0B\u306E\u9593\u9694(\u30D4\u30AF\u30BB\u30EB)
+OptionPanel.outline_hgap=\u5DE6\u53F3\u306E\u9593\u9694
+OptionPanel.outline_vgap=\u4E0A\u4E0B\u306E\u9593\u9694
+OptionPanel.oval=\u6955\u5186
OptionPanel.paint_connectors_behind=\u30B3\u30CD\u30AF\u30BF\u306E\u8868\u793A\u3092\u30CE\u30FC\u30C9\u306E\u80CC\u5F8C\u306B
OptionPanel.parse_data=\u6570\u5024\u3084\u65E5\u6642\u306E\u5165\u529B\u3092\u8A8D\u8B58
OptionPanel.parse_data.tooltip=\u65E5\u4ED8\u3001\u6642\u523B\u4ED8\u304D\u65E5\u4ED8\u3001\u53CA\u3073\u6570\u5024\u306E\u5165\u529B\u3092\u89E3\u6790\u3057\u3001\u6A19\u6E96\u66F8\u5F0F\u306E\u9069\u7528\u3092\u8A66\u307F\u307E\u3059\u3002\u8868\u793A\u4F8B\uFF1A 100,000.00\u300112/31\u3001 12/31/99\u3001 1999-12-31\u30011999-12-31 23:59
+OptionPanel.parse_formulas=\u6570\u5F0F\u3092\u8A8D\u8B58\u3059\u308B
+OptionPanel.parse_formulas.tooltip=\u30CE\u30FC\u30C9\u304C '=' \u3067\u59CB\u307E\u3063\u3066\u3044\u305F\u5834\u5408\u3001\u6570\u5F0F\u3068\u3057\u3066\u8A8D\u8B58\u3059\u308B: \u53C2\u7167 http://www.freeplane.org/wiki/index.php/Formulas
+OptionPanel.parse_latex=LaTeX \u3092\u8A8D\u8B58\u3059\u308B
+OptionPanel.parse_latex.tooltip=LaTeX \u6570\u5F0F\u3068\u8A8D\u8B58\u3059\u308B\u66F8\u5F0F\u307E\u305F\u306F\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u3002 http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane \u3092\u53C2\u7167\u3002
OptionPanel.PASTE_HTML=HTML \u5F62\u5F0F
OptionPanel.PASTE_PLAIN_TEXT=\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8\u5F62\u5F0F
OptionPanel.path_property_may_not_be_empty=\u30D1\u30B9\u30D7\u30ED\u30D1\u30C6\u30A3\u304C\u672A\u6D88\u53BB\u306E\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u66F4\u65B0\u524D\u306E\u72B6\u614B\u306B\u623B\u308A\u307E\u3057\u305F\u3002
@@ -1136,9 +1199,13 @@ OptionPanel.printonwhitebackground.tooltip=\u80CC\u666F\u3092\u5E38\u306B\u767D\
OptionPanel.pt_BR=\u30DD\u30EB\u30C8\u30AC\u30EB\u8A9E\uFF08\u30D6\u30E9\u30B8\u30EB\uFF09\uFF0FPortugu\u00EAs (Brasil)
OptionPanel.pt_PT=\u30DD\u30EB\u30C8\u30AC\u30EB\u8A9E\uFF08\u30DD\u30EB\u30C8\u30AC\u30EB\uFF09\uFF0FPortugu\u00EAs (Portugal)
OptionPanel.RECT=\u77E9\u5F62
+OptionPanel.rectangle=\u77E9\u5F62
OptionPanel.relative=\u76F8\u5BFE\u7684
OptionPanel.remind_type_of_new_nodes.tooltip=<html>\u300C\u78BA\u8A8D\u300D\u3092\u6307\u5B9A\u3059\u308B\u3068\u3001\u78BA\u8A8D\u30C0\u30A4\u30A2\u30ED\u30B0\u3092\u8868\u793A\u3057\u307E\u3059\u3002<br>\u300C\u306F\u3044\u300D\uFF1A\u30EA\u30C3\u30C1\u30C6\u30AD\u30B9\u30C8\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u8868\u793A\u3057\u307E\u3059\u3002<br>\u300C\u3044\u3044\u3048\u300D\uFF1A\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8\u30A8\u30C7\u30A3\u30BF\u30FC\u3092\u8868\u793A\u3057\ [...]
OptionPanel.remind_use_rich_text_in_new_nodes=\u8CBC\u308A\u4ED8\u3051\u30CE\u30FC\u30C9\u3067\u30EA\u30C3\u30C1\u30C6\u30AD\u30B9\u30C8\u3092\u4F7F\u7528
+OptionPanel.remindersBlink=\u30EA\u30DE\u30A4\u30F3\u30C0\u3092\u70B9\u6EC5
+OptionPanel.remindersShowNotifications=\u30EA\u30DE\u30A4\u30F3\u30C0\u306E\u901A\u77E5\u30DD\u30C3\u30D7\u30A2\u30C3\u30D7\u3092\u8868\u793A
+OptionPanel.remindersStandardDelay=\u30EA\u30DE\u30A4\u30F3\u30C0\u306E\u5EF6\u671F\u6642\u9593
OptionPanel.remove_notes_without_question=\u30CE\u30FC\u30C8\u306E\u524A\u9664\u6642\u306B\u78BA\u8A8D\u3092\u7701\u7565
OptionPanel.remove_notes_without_question.tooltip=<html>\u30C1\u30A7\u30C3\u30AF\u3059\u308B\u3068\u3001\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9\u306E\u30CE\u30FC\u30C8\u306E\u524A\u9664\u6642\u306B\u78BA\u8A8D\u30C0\u30A4\u30A2\u30ED\u30B0\u3092\u8868\u793A\u3057\u307E\u305B\u3093\u3002\u8AA4<br>\u64CD\u4F5C\u306B\u3088\u308A\u60C5\u5831\u304C\u5931\u308F\u308C\u308B\u6050\u308C\u304C\u3042\u308A\u307E\u3059\u3002</html>
OptionPanel.resources_use_default_font_for_notes_too=\u30CE\u30FC\u30C8\u30D5\u30A9\u30F3\u30C8\u306B\u3082\u9069\u7528
@@ -1149,6 +1216,7 @@ OptionPanel.ROUND_RECT=\u89D2\u4E38\u77E9\u5F62
OptionPanel.ru=\u30ED\u30B7\u30A2\u8A9E\uFF0F\u0420\u0443\u0441\u0441\u043A\u0438\u0439 \u044F\u0437\u044B\u043A
OptionPanel.save_folding=\u6298\u308A\u7573\u307F\u306E\u6271\u3044
OptionPanel.save_folding_if_map_is_changed=\u30DE\u30C3\u30D7\u304C\u66F4\u65B0\u3055\u308C\u305F\u5834\u5408\u306F\u4FDD\u5B58\u3059\u308B
+OptionPanel.save_last_visited_node=\u6700\u5F8C\u306E\u4F4D\u7F6E\u3092\u4FDD\u5B58\u3059\u308B
OptionPanel.save_modification_times=\u66F4\u65B0\u6642\u523B\u3092\u4FDD\u5B58
OptionPanel.script_classpath=<html>\u30B9\u30AF\u30EA\u30D7\u30C8\u30AF\u30E9\u30B9\u30D1\u30B9\uFF1A<br>\u3000\u30AF\u30E9\u30B9\u53CA\u3073 JARs \u306E\u3042\u308B\u8FFD\u52A0\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA<br>\u3000\u3000\uFF08\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u3092\u53C2\u7167\uFF09</html>
OptionPanel.script_classpath.tooltip=<html>JARs \u53CA\u3073\u30B9\u30AF\u30EA\u30D7\u30C8\u3084\u8A08\u7B97\u5F0F\u306E\u30AF\u30E9\u30B9\u30D1\u30B9\u306B\u4ED8\u52A0\u3059\u308B\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306E\u4E00\u89A7\u3067\u3059\u3002<br>\u9805\u76EE\u306E\u533A\u5207\u308A\u306B\u306F\u3001Windows \u306E\u5834\u5408\u306F ";"\u3001Linux \u3068Mac \u306E\u5834\u5408\u306F ":" \u3092\u7528\u3044\u3066\u304F\u3060\u3055\u3044\u3002<br>\u3053\u308C\u3089\u306E\u30C7\u30A3\ [...]
@@ -1160,6 +1228,7 @@ OptionPanel.script_user_key_name_for_signing=\u7F72\u540D\u7528\u30E6\u30FC\u30B
OptionPanel.script_user_key_name_for_signing.tooltip=<html>\u4F5C\u6210\u3057\u305F\u30B9\u30AF\u30EA\u30D7\u30C8\u306B\u7F72\u540D\u3092\u4ED8\u3051\u305F\u3044\u5834\u5408\u306F\u3001\u3053\u3053\u306B\u305D\u306E\u30AD\u30FC\u306E\u30A8\u30A4\u30EA\u30A2\u30B9\u3092\u5165\u529B\u3057\u3066\u304F<br>\u3060\u3055\u3044\u3002\u305D\u306E\u30AD\u30FC\u306F\u3001\u30C7\u30D5\u30A9\u30EB\u30C8\u30FB\u30AD\u30FC\u96C6\u306B\u542B\u307E\u308C\u308B\u3082\u306E\u3068\u60F3\u5B9A\u3055\u308C\u3 [...]
OptionPanel.scrollbar_increment=\u901F\u5EA6
OptionPanel.scrolling_speed=\u81EA\u52D5\u30DE\u30C3\u30D7\u30B9\u30AF\u30ED\u30FC\u30EB\u901F\u5EA6
+OptionPanel.scrollOnUnfold=\u30CE\u30FC\u30C9\u3092\u5C55\u958B\u3057\u305F\u5F8C\u306B\u30DE\u30C3\u30D7\u3092\u30B9\u30AF\u30ED\u30FC\u30EB
OptionPanel.selection_method=\u9078\u629E\u65B9\u6CD5
OptionPanel.selection_method.tooltip=<html>\u30DE\u30A6\u30B9\u30AB\u30FC\u30BD\u30EB\u3092\u30CE\u30FC\u30C9\u306B\u79FB\u52D5\u3057\u3066\u304B\u3089\u5C11\u3057\u9593\u3092\u7F6E\u304F\u3068\u81EA\u52D5\u9078\u629E\u3059\u308B\u7B49\u3001\u9078\u629E\u65B9\u6CD5\u3092\u6307\u5B9A<br>\u3057\u307E\u3059\u3002\u81EA\u52D5\u30AA\u30D7\u30B7\u30E7\u30F3\u3002\u3053\u308C\u3089\u306F\u5FC5\u305A auto.properties \u306B\u4FDD\u5B58\u3055\u308C\u3001\u5909\u66F4\u3059\u308B\u3053\u3068\u306F<b [...]
OptionPanel.selection_method_by_click=\u30AF\u30EA\u30C3\u30AF\u3067\u9078\u629E
@@ -1193,6 +1262,7 @@ OptionPanel.separator.icon_properties=\u30A2\u30A4\u30B3\u30F3
OptionPanel.separator.icons=\u300C\u30A2\u30A4\u30B3\u30F3\u3092\u9078\u629E...\u300D\u306E\u30A2\u30A4\u30B3\u30F3
OptionPanel.separator.initial_map_size=\u521D\u671F\u30DE\u30C3\u30D7\u30B5\u30A4\u30BA
OptionPanel.separator.inline_editor=\u30A4\u30F3\u30E9\u30A4\u30F3\u30CE\u30FC\u30C9\u30A8\u30C7\u30A3\u30BF
+OptionPanel.separator.JoinNodesAction=\u30CE\u30FC\u30C9\u306E\u7D50\u5408
OptionPanel.separator.key_typing=\u9078\u629E\u30CE\u30FC\u30C9\u3067\u306E\u30AD\u30FC\u5165\u529B
OptionPanel.separator.language=\u8A00\u8A9E
OptionPanel.separator.latex=LaTeX
@@ -1213,6 +1283,7 @@ OptionPanel.separator.other_defaults=\u305D\u306E\u4ED6
OptionPanel.separator.others=\u305D\u306E\u4ED6\u306E\u30AD\u30FC\u5272\u308A\u5F53\u3066
OptionPanel.separator.outline_view=\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u30D3\u30E5\u30FC
OptionPanel.separator.patterns=\u30D1\u30BF\u30FC\u30F3
+OptionPanel.separator.reminderOptions=\u30EA\u30DE\u30A4\u30F3\u30C0\u30AA\u30D7\u30B7\u30E7\u30F3
OptionPanel.separator.RichTextEditor=\u30EA\u30C3\u30C1\u30C6\u30AD\u30B9\u30C8\u30A8\u30C7\u30A3\u30BF
OptionPanel.separator.root_node_appearance=\u30EB\u30FC\u30C8\u30CE\u30FC\u30C9\u306E\u4F53\u88C1
OptionPanel.separator.save=\u4FDD\u5B58
@@ -1224,6 +1295,7 @@ OptionPanel.separator.selection_method=\u30CE\u30FC\u30C9\u306E\u9078\u629E
OptionPanel.separator.single_instance_mode=\u5358\u4E00\u30D7\u30ED\u30B0\u30E9\u30E0\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9
OptionPanel.separator.size_limits=\u8868\u793A\u5E45
OptionPanel.separator.spelling=\u30B9\u30DA\u30EB\u30C1\u30A7\u30C3\u30AF\u30AA\u30D7\u30B7\u30E7\u30F3
+OptionPanel.separator.SplitToWordsAction=\u30CE\u30FC\u30C9\u3092\u5358\u8A9E\u306B\u5206\u5272
OptionPanel.separator.status=\u30B9\u30C6\u30FC\u30BF\u30B9\u30D0\u30FC
OptionPanel.separator.tooltip=\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u8868\u793A\u306E\u6642\u9593
OptionPanel.separator.undo=\u5143\u306B\u623B\u3059
@@ -1232,8 +1304,11 @@ OptionPanel.set_property_text=\u5909\u66F4
OptionPanel.set_property_text.tooltip=\u7A7A\u767D\uFF1A\u4F55\u3082\u3057\u306A\u3044\u3002\u3000\u3000\u300C\uFF0D\u300D\uFF1A\u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u524A\u9664 (\u30C7\u30D5\u30A9\u30EB\u30C8\u5024\u306B\u8A2D\u5B9A)\u3000\u3000\u300C\uFF0B\u300D\uFF1A\u30D7\u30ED\u30D1\u30C6\u30A3\u306E\u5909\u66F4
OptionPanel.setscript=<html>\u30B9\u30AF\u30EA\u30D7\u30C8\u3092<br>\u5909\u66F4\u3057\u307E\u3059\u304B\uFF1F</html>
OptionPanel.setscript.tooltip=\u30B9\u30BF\u30A4\u30EB\u306B\u95A2\u9023\u3065\u3051\u3066\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u8A18\u8FF0\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002
+OptionPanel.shape_horizontal_margin=\u6A2A\u306E\u4F59\u767D
+OptionPanel.shape_vertical_margin=\u7E26\u306E\u4F59\u767D
OptionPanel.sharp_bezier=\u5148\u7D30\u30D9\u30B8\u30A7\u66F2\u7DDA
OptionPanel.sharp_linear=\u5148\u7D30\u76F4\u7DDA
+OptionPanel.shouldCenterSmallMaps=\u5C0F\u3055\u306A\u30DE\u30C3\u30D7\u3092\u4E2D\u592E\u3078\u8868\u793A
OptionPanel.show_icon_for_attributes=\u5C5E\u6027\u4ED8\u304D\u30A2\u30A4\u30B3\u30F3\u3092\u8868\u793A
OptionPanel.show_node_tooltips=\u30CE\u30FC\u30C9\u60C5\u5831\u3092\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u8868\u793A
OptionPanel.show_note_icons=\u30CE\u30FC\u30C8\u4ED8\u304D\u30A2\u30A4\u30B3\u30F3\u3092\u8868\u793A
@@ -1245,18 +1320,24 @@ OptionPanel.single_backup_directory=<html>\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u
OptionPanel.single_backup_directory.tooltip=<html>\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u30D5\u30A1\u30A4\u30EB\u3068\u81EA\u52D5\u4FDD\u5B58\u30D5\u30A1\u30A4\u30EB\u3092\u3001\u5F53\u8A72\u30DE\u30C3\u30D7\u306E\u30B5\u30D6\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3067\u306A\u304F\u3001<br>\u5358\u4E00\u683C\u7D0D\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u4FDD\u5B58\u3057\u307E\u3059\u3002</html>
OptionPanel.single_backup_directory_path=<html>\u4E0A\u8A18\u30AA\u30D7\u30B7\u30E7\u30F3\u6709\u52B9\u6642\u306B\u7528\u3044\u308B<br>\u30D0\u30C3\u30AF\u30A2\u30C3\u30D7\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA</html>
OptionPanel.single_backup_directory_path.tooltip=<html>\u521D\u671F\u8A2D\u5B9A\u306E <freeplaneuserdir>/.backup \u3088\u308A\u3082\u512A\u5148\u7684\u306B\u7528\u3044\u3089\u308C\u308B\u30D5\u30A9\u30EB\u30C0\u3067\u3059\u3002</html>
-OptionPanel.single_instance=\u30D5\u30A1\u30A4\u30EB\u30AA\u30FC\u30D7\u30F3\u306F\u5B9F\u884C\u4E2D\u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3067
+OptionPanel.single_instance=\u5B9F\u884C\u4E2D\u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3067\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u304F
OptionPanel.single_instance_force=\u7B2C\uFF12\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u306E\u4F5C\u6210\u3092\u7981\u6B62
OptionPanel.single_instance_force.tooltip=\u8AAD\u307F\u8FBC\u307F\u30D5\u30A1\u30A4\u30EB\u304C\u306A\u3044\u5834\u5408\u3067\u3082\u3001\u7B2C\uFF12\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u4F5C\u6210\u3057\u306A\u3044\u3088\u3046\u306B\u3057\u307E\u3059\u3002
OptionPanel.sk=\u30B9\u30ED\u30D0\u30AD\u30A2\u8A9E\uFF0Fsloven\u010Dina
OptionPanel.sl=\u30B9\u30ED\u30D9\u30CB\u30A2\u8A9E\uFF0Fsloven\u0161\u010Dina
OptionPanel.slow_scroll_selected_node=\u9078\u629E\u30CE\u30FC\u30C9\u3092\u4E2D\u592E\u306B\u3059\u308B\u5834\u5408\u3001\u3086\u3063\u304F\u308A\u30B9\u30AF\u30ED\u30FC\u30EB
+OptionPanel.small_bubble=\u5C0F\u3055\u306A\u56F2\u307F
OptionPanel.spelling_opt_case_sensitive=\u5927\u6587\u5B57\uFF0F\u5C0F\u6587\u5B57\u3092\u533A\u5225
OptionPanel.spelling_opt_ignore_all_caps_words=\u5927\u6587\u5B57\u306E\u307F\u306E\u8A9E\u3092\u7121\u8996
OptionPanel.spelling_opt_ignore_capitalization=\u8A9E\u306E\u5192\u982D\u306B\u3042\u308B\u5927\u6587\u5B57\u3092\u7121\u8996
OptionPanel.spelling_opt_ignore_words_with_numbers=\u6570\u5B57\u3092\u542B\u3080\u8A9E\u3092\u7121\u8996
OptionPanel.spelling_opt_suggestions_limit_dialog=\u30C0\u30A4\u30A2\u30ED\u30B0\u306B\u8868\u793A\u3059\u308B\u5019\u88DC\u306E\u6700\u5927\u5024
OptionPanel.spelling_opt_suggestions_limit_menu=\u30E1\u30CB\u30E5\u30FC\u306B\u8868\u793A\u3059\u308B\u5019\u88DC\u306E\u6700\u5927\u5024
+OptionPanel.SplitToWordsAction.auxiliaryWordList=\u88DC\u52A9\u5358\u8A9E\u30EA\u30B9\u30C8
+OptionPanel.SplitToWordsAction.charactersAcceptedInWord=\u5358\u8A9E\u306B\u542B\u3081\u308B\u6587\u5B57
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=\u5206\u5272\u5143\u30CE\u30FC\u30C9\u3092\u7A7A\u767D\u306B\u3059\u308B
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=\u4E00\u5217\u306E\u30CE\u30FC\u30C9\u6570
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=\u5143\u6587\u7AE0\u3092\u30CE\u30FC\u30C9\u306E\u8A73\u7D30\u3068\u3057\u3066\u4FDD\u5B58
OptionPanel.sr=\u30BB\u30EB\u30D3\u30A2\u8A9E\uFF0F\u0441\u0440\u043F\u0441\u043A\u0438
OptionPanel.standard_template=\u6A19\u6E96\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u30D5\u30A1\u30A4\u30EB
OptionPanel.standardbackgroundcolor=\u30CE\u30FC\u30C9\u306E\u80CC\u666F
@@ -1276,26 +1357,32 @@ OptionPanel.standardselectednodecolor.tooltip=\u9078\u629E\u30CE\u30FC\u30C9\u30
OptionPanel.standardselectednoderectanglecolor=\u67A0\u56F2\u3044\u306E\u8272
OptionPanel.standardselectednoderectanglecolor.tooltip=\u9078\u629E\u30CE\u30FC\u30C9\u3092\u56F2\u3080\u67A0\u306E\u6A19\u6E96\u7684\u306A\u8272\u3002HTML\u8868\u8A18\u6CD5(16\u9032\u6570\u306E #RRGGBB )\u3067\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002
OptionPanel.STAR=\u30C8\u30F3\u30AC\u30EA
+OptionPanel.statesymbolwidth=\u30B9\u30C6\u30FC\u30C8\u30B7\u30F3\u30DC\u30EB\u306E\u5E45
OptionPanel.structured_html_import=\u30CE\u30FC\u30C9\u968E\u5C64\u306B\u5909\u63DB\u3057\u3066\u30A4\u30F3\u30DD\u30FC\u30C8
OptionPanel.structured_icon_toolbar=\u5DE6\u30C4\u30FC\u30EB\u30D0\u30FC\u306E\u30A2\u30A4\u30B3\u30F3\u8868\u793A\u3092\u968E\u5C64\u5316
OptionPanel.summary=\u307E\u3068\u3081
OptionPanel.sv=\u30B9\u30A6\u30A7\u30FC\u30C7\u30F3\u8A9E\uFF0Fsvenska
OptionPanel.text.use_ctrl_key=\u300C\u30C4\u30FC\u30EB\u300D\u30E1\u30CB\u30E5\u30FC\u306E\u300C\u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u30AD\u30FC\u306E\u5272\u308A\u5F53\u3066\u300D\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002
+OptionPanel.textalignment=\u6587\u5B57\u63C3\u3048
OptionPanel.time_for_automatic_save=\u81EA\u52D5\u4FDD\u5B58\u9593\u9694(\u30DF\u30EA\u79D2)
OptionPanel.time_for_automatic_save.tooltip=<html> \u81EA\u52D5\u4FDD\u5B58\u306E\u9593\u9694(\u30DF\u30EA\u79D2)\u3002<br>\u81EA\u52D5\u4FDD\u5B58\u3092\u7121\u52B9\u306B\u3059\u308B\u306B\u306F\u3001\u3053\u306E\u6570\u5024\u30922000000000\u306B\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002</html>
OptionPanel.time_for_delayed_selection=\u81EA\u52D5\u9078\u629E\u307E\u3067\u306E\u6642\u9593(\u30DF\u30EA\u79D2)
OptionPanel.time_for_delayed_selection.tooltip=<html>\u30DE\u30A6\u30B9\u30AB\u30FC\u30BD\u30EB\u304C\u30CE\u30FC\u30C9\u4E0A\u306B\u79FB\u3063\u3066\u304B\u3089\u81EA\u52D5\u9078\u629E\u3059\u308B\u307E\u3067\u306E\u6642\u9593(\u30DF\u30EA\u79D2)\u3002\u30DE\u30A6\u30B9\u30AB\u30FC\u30BD<br>\u30EB\u3092\u30CE\u30FC\u30C9\u4E0A\u306B\u79FB\u3059\u3068\u540C\u6642\u306B\u9078\u629E\u3057\u305F\u3044\u5834\u5408\u306F\u3001\u3053\u306E\u5024\u3092\uFF11\u306B\u5909\u66F4\u3057\u3066\u304F\ [...]
OptionPanel.toolTipManager.dismissDelay=\u8868\u793A\u3092\u4E2D\u65AD\u3059\u308B\u307E\u3067\u306E\u6642\u9593(\u30DF\u30EA\u79D2)
OptionPanel.toolTipManager.initialDelay=\u6700\u521D\u306B\u8868\u793A\u3059\u308B\u307E\u3067\u306E\u6642\u9593(\u30DF\u30EA\u79D2)
+OptionPanel.toolTipManager.max_tooltip_height=\u30CE\u30FC\u30C9\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u306E\u6700\u5927\u8868\u793A\u9AD8\u3055
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=\u30CE\u30FC\u30C9\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u306E\u6700\u5927\u8868\u793A\u9AD8\u3055\uFF08\u30D4\u30AF\u30BB\u30EB\uFF09
OptionPanel.toolTipManager.max_tooltip_width=\u30CE\u30FC\u30C9\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u306E\u6700\u5927\u8868\u793A\u5E45
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u5E45\u306E\u521D\u671F\u8A2D\u5B9A(\u30D4\u30AF\u30BB\u30EB)
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=\u30CE\u30FC\u30C9\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u306E\u6700\u5927\u8868\u793A\u5E45(\u30D4\u30AF\u30BB\u30EB)
OptionPanel.toolTipManager.reshowDelay=\u8868\u793A\u3092\u518D\u958B\u3059\u308B\u307E\u3067\u306E\u6642\u9593(\u30DF\u30EA\u79D2)
+OptionPanel.tr=\u30C8\u30EB\u30B3\u8A9E / T\u00FCrk\u00E7e
OptionPanel.uk_UA=\u30A6\u30AF\u30E9\u30A4\u30CA\u8A9E\uFF0F\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430
OptionPanel.undefined_font=\u672A\u5B9A\u7FA9\u30D5\u30A9\u30F3\u30C8
OptionPanel.undo_levels=\u5143\u306B\u623B\u3059\u56DE\u6570\u306E\u4E0A\u9650
OptionPanel.undo_levels.tooltip=\u5143\u306B\u623B\u3059\u64CD\u4F5C\u306E\u4E0A\u9650\u56DE\u6570\u3092\u6307\u5B9A\u3057\u307E\u3059\u3002
OptionPanel.unfold_on_paste=\u8CBC\u308A\u4ED8\u3051\u6642\u306B\u30CE\u30FC\u30C9\u3092\u5C55\u958B
OptionPanel.unfold_on_paste.tooltip=\u30C9\u30E9\u30C3\u30B0\uFF06\u30C9\u30ED\u30C3\u30D7\u6642\u306B\u30CE\u30FC\u30C9\u3092\u5C55\u958B\u3057\u307E\u3059\u3002
+OptionPanel.uniform_shape=\u5747\u4E00\u5316
OptionPanel.use_common_out_point_for_root_node=\u7DDA\u306E\u59CB\u70B9\u3092\u4E00\u70B9\u306B\u96C6\u7D04
OptionPanel.use_common_out_point_for_root_node.tooltip=\u7DDA\u304C\u30EB\u30FC\u30C8\u30CE\u30FC\u30C9\u306E\u5DE6\u53F3\u305D\u308C\u305E\u308C\u4E00\u70B9\u304B\u3089\u767A\u3059\u308B\u3088\u3046\u306B\u306A\u308A\u307E\u3059\u3002
OptionPanel.use_tabbed_pane=\u30BF\u30D6\u8868\u793A\u6A5F\u80FD\u3092\u4F7F\u7528
@@ -1308,9 +1395,12 @@ OptionPanel.validate_invalid_number_format=\u6570\u5024\u306E\u6A19\u6E96\u66F8\
OptionPanel.validate_write_without_read=\u30B9\u30AF\u30EA\u30D7\u30C8\uFF1A\u30D5\u30A1\u30A4\u30EB\u66F8\u304D\u8FBC\u307F\u306E\u4ED6\u306B\u3001\u30D5\u30A1\u30A4\u30EB\u8AAD\u307F\u8FBC\u307F\u3092\u4ED8\u52A0\u3059\u308B\u304B\u3069\u3046\u304B\u691C\u8A0E\u3057\u3066\u304F\u3060\u3055\u3044\u3002
OptionPanel.validation_error=<html><body>\u691C\u8A3C\u30A8\u30E9\u30FC\uFF1A<p><em>{0}</em><p>\u74B0\u5883\u8A2D\u5B9A\u3092\u5909\u66F4\u3057\u3066\u30A8\u30E9\u30FC\u3092\u662F\u6B63\u3057\u3066\u304F\u3060\u3055\u3044\u3002</body></html>
OptionPanel.validation_warning=<html><body>\u691C\u8A3C\u8B66\u544A\uFF1A<p><em>{0}</em></body></html>
+OptionPanel.vertical_child_gap=\u5B50\u30CE\u30FC\u30C9\u306E\u9593\u9694
+OptionPanel.vertical_child_gap.tooltip=\u5B50\u30CE\u30FC\u30C9\u9593\u306E\u4E0A\u4E0B\u306E\u9593\u9694
OptionPanel.vi=\u30D9\u30C8\u30CA\u30E0\u8A9E\uFF0FTi\u1EBFng Vi\u1EC7t
OptionPanel.wheel_velocity=\u52A0\u901F\u5EA6
OptionPanel.wheel_velocity.tooltip=\u5024\u3092\u5927\u304D\u304F\u3059\u308B\u3068\u3001\u30DE\u30C3\u30D7\u4E0A\u306E\u30DE\u30A6\u30B9\u30DB\u30A4\u30FC\u30EB\u3067\u306E\u79FB\u52D5\u901F\u5EA6\u304C\u901F\u304F\u306A\u308A\u307E\u3059\u3002
+OptionPanel.wide_hexagon=\u592A\u3044\u516D\u89D2\u5F62
OptionPanel.windows=Windows
OptionPanel.zh_CN=\u4E2D\u56FD\u8A9E\uFF08\u7C21\u4F53\u5B57\uFF09\uFF0F\u7B80\u4F53\u5B57
OptionPanel.zh_TW=\u4E2D\u56FD\u8A9E\uFF08\u7E41\u4F53\u5B57\uFF09\uFF0F\u7E41\u9AD4\u5B57
@@ -1330,8 +1420,8 @@ out_of_memory=\u30E1\u30E2\u30EA\u4E0D\u8DB3\u3067\u3059\u3002
overwrite_keyset_question=\u65E2\u5B58\u306E\u30AD\u30FC\u8A2D\u5B9A\u306B\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\uFF1F
PageAction.text=\u5370\u5237\u8A2D\u5B9A...
password_is_not_ascii=\u30D1\u30B9\u30EF\u30FC\u30C9\u306F ASCII \u30B3\u30FC\u30C9\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002
-PasteAction.text=\u8CBC\u308A\u4ED8\u3051(&P)
-PasteAttributes.text=\u5C5E\u6027\u3092\u8CBC\u308A\u4ED8\u3051(&R)
+PasteAction.text=\u8CBC\u308A\u4ED8\u3051(P)
+PasteAttributes.text=\u5C5E\u6027\u3092\u8CBC\u308A\u4ED8\u3051
PatternNewNameProperty=\u65B0\u898F\u30D1\u30BF\u30FC\u30F3
PatternToString.backgroundColor=\u80CC\u666F\u8272
PatternToString.Child=\u5B50\u30CE\u30FC\u30C9\u306E\u30B9\u30BF\u30A4\u30EB
@@ -1399,10 +1489,11 @@ plugins/TimeManagement.xml_WindowTitle=\u6642\u9593\u7BA1\u7406
plugins/TimeManagement.xml_WindowTitle_All_Nodes=\u691C\u7D22\uFF06\u7F6E\u63DB
preferences=\u8A2D\u5B9A
print_preview_title=\u5370\u5237\u30D7\u30EC\u30D3\u30E5\u30FC
-PrintAction.text=\u30DE\u30C3\u30D7\u3092\u5370\u5237(&P)...
+PrintAction.text=\u30DE\u30C3\u30D7\u3092\u5370\u5237...
PrintDirectAction.text=\u5370\u5237
printing_settings=\u5370\u5237\u30B5\u30A4\u30BA\u3092\u6307\u5B9A
-PrintPreviewAction.text=\u5370\u5237\u30D7\u30EC\u30D3\u30E5\u30FC(&V)...
+PrintPreviewAction.text=\u5370\u5237\u30D7\u30EC\u30D3\u30E5\u30FC...
+progress=\u9032\u6357\u5EA6
PropertyAction.dialog=\u74B0\u5883\u8A2D\u5B9A
PropertyAction.text=\u74B0\u5883\u8A2D\u5B9A...
QuickFilterAction.text=\u30AF\u30A3\u30C3\u30AF\u30D5\u30A3\u30EB\u30BF
@@ -1410,7 +1501,7 @@ QuickFindAction.BACK.text=\u524D\u65B9\u691C\u7D22
QuickFindAction.FORWARD.text=\u5F8C\u65B9\u691C\u7D22
QuickFindAllAction.text=\u8A72\u5F53\u30CE\u30FC\u30C9\u3092\u3059\u3079\u3066\u9078\u629E
QuickHighlightAction.text=\u6761\u4EF6\u9069\u5408\u30CE\u30FC\u30C9\u3092\u3059\u3079\u3066\u9078\u629E
-QuitAction.text=\u7D42\u4E86(&Q)
+QuitAction.text=\u7D42\u4E86(Q)
read_only=\u8AAD\u307F\u8FBC\u307F\u5C02\u7528
ReadScriptError.text=\u30B9\u30AF\u30EA\u30D7\u30C8\u306E\u8AAD\u307F\u8FBC\u307F\u4E2D\u306B\u3001\u30A8\u30E9\u30FC\u304C\u751F\u3058\u307E\u3057\u305F\u3002
really_convert_to_current_version=<html>\u3053\u306E\u30DE\u30C3\u30D7\u306F\u65E7\u30D0\u30FC\u30B8\u30E7\u30F3\u306E Freeplane \u3067\u4F5C\u6210\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u5909\u63DB\u3057\u307E\u3059\u304B\uFF1F\uFF08\u63A8\u5968\uFF09<br>\u5909\u63DB\u3057\u306A\u3044\u5834\u5408\u306F\u305D\u306E\u307E\u307E\u8AAD\u307F\u8FBC\u307F\u307E\u3059\u304C\u3001\u52D5\u4F5C\u3092\u4FDD\u8A3C\u3067\u304D\u307E\u305B\u3093</html>
@@ -1421,13 +1512,16 @@ really_remove_notes=\u672C\u5F53\u306B\u30CE\u30FC\u30C8\u3092\u524A\u9664\u3057
ReapplyFilterAction.text=\u30D5\u30A3\u30EB\u30BF\u3092\u304B\u3051\u76F4\u3059
red=\u8D64
RedefineStyleAction.text=\u30B9\u30BF\u30A4\u30EB\u3092\u518D\u5B9A\u7FA9
-RedoAction.text=\u3084\u308A\u76F4\u3059(&R)
+RedoAction.text=\u3084\u308A\u76F4\u3059(R)
RedoFilterAction.text=\u5143\u306E\u30D5\u30A3\u30EB\u30BF\u3092\u518D\u9069\u7528
regular_expressions=\u6B63\u898F\u8868\u73FE
ReminderHookAction.text=\u30EA\u30DE\u30A4\u30F3\u30C0\u3092\u524A\u9664
ReminderHookAction.tooltip=\u30CE\u30FC\u30C9\u304B\u3089\u30EA\u30DE\u30A4\u30F3\u30C0\u3092\u524A\u9664\u3057\u307E\u3059\u3002
+reminderNotification=\u30EA\u30DE\u30A4\u30F3\u30C0\u901A\u77E5
remove_file_from_list_on_error=<html>\u30D5\u30A1\u30A4\u30EB {0} \u3092\u8AAD\u307F\u8FBC\u3080\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3002<br>\u3053\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u300C\u6700\u8FD1\u4F7F\u3063\u305F\u30D5\u30A1\u30A4\u30EB\u300D\u304B\u3089\u524A\u9664\u3057\u307E\u3059\u304B\u3002</html>
remove_shortcut_question=\u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u3092\u7F6E\u63DB\u3057\u307E\u3059\u304B\uFF1F
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=\u5E38\u6642\u5C55\u958B\u30CE\u30FC\u30C9\u306E\u89E3\u9664
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=\u3059\u3079\u3066\u306E\u30CE\u30FC\u30C9\u306E\u6298\u308A\u305F\u305F\u307F\u3092\u53EF\u80FD\u306B\u3057\u307E\u3059
RemoveAllIconsAction.text=\u3059\u3079\u3066\u306E\u30A2\u30A4\u30B3\u30F3\u3092\u524A\u9664
RemoveConnectorAction.text=\u30B3\u30CD\u30AF\u30BF\u3092\u524A\u9664
RemoveEncryption.text=\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5EC3\u6B62
@@ -1445,40 +1539,49 @@ replace_shortcut_title=\u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u306E\u7F6E\u6
ReportBugAction.text=\u30D0\u30B0\u3092\u5831\u544A
RequestFeatureAction.text=\u6A5F\u80FD\u306E\u8FFD\u52A0\u3092\u8981\u671B
reset_to_default=\u65E2\u5B9A\u5024\u3092\u4F7F\u7528
-ResetNodeLocationAction.text=\u30CE\u30FC\u30C9\u306E\u4F4D\u7F6E\u3092\u30EA\u30BB\u30C3\u30C8(&P)
+ResetNodeLocationAction.text=\u30CE\u30FC\u30C9\u306E\u4F4D\u7F6E\u3092\u30EA\u30BB\u30C3\u30C8
ResetStyleAction.text=\u30CE\u30FC\u30C9\u30B9\u30BF\u30A4\u30EB\u3092\u30EA\u30BB\u30C3\u30C8
-RevertAction.text=\u5C65\u6B74\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u5FA9\u5143(&R)
-RevisionPluginAction.text=\u66F4\u65B0\u30CE\u30FC\u30C9\u306E\u80CC\u666F\u8272\u3092\u5909\u66F4(&R)
+RevertAction.text=\u5C65\u6B74\u30D5\u30A1\u30A4\u30EB\u304B\u3089\u5FA9\u5143
+RevisionPluginAction.text=\u66F4\u65B0\u30CE\u30FC\u30C9\u306E\u80CC\u666F\u8272\u3092\u5909\u66F4
+save=\u4FDD\u5B58(&S)
save_failed=\u30DE\u30C3\u30D7 {0} \u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002
save_unsaved=\u4E0B\u8A18\u306E\u30DE\u30C3\u30D7\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F
save_unsaved_styles=\u30B9\u30BF\u30A4\u30EB\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\uFF1F
SaveAcceleratorPresetsAction.text=\u30DB\u30C3\u30C8\u30AD\u30FC\u30BB\u30C3\u30C8\u3092\u4FDD\u5B58...
SaveAction.text=\u30DE\u30C3\u30D7\u3092\uFF08\u4E0A\u66F8\u304D\uFF09\u4FDD\u5B58(&S)
-SaveAll.text=\u3059\u3079\u3066\u306E\u30DE\u30C3\u30D7\u3092\u4FDD\u5B58(&L)
+SaveAction_readonlyMsg=\u3053\u306E\u30DE\u30C3\u30D7\u306F\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u3067\u3059\u3002\u3053\u306E\u30DE\u30C3\u30D7\u3092\u4FDD\u5B58\u3059\u308B\u306B\u306F\u300C\u30D5\u30A1\u30A4\u30EB\u2192\u540D\u524D\u3092\u4ED8\u3051\u3066\u4FDD\u5B58...\u300D\u3092\u4F7F\u3063\u3066\u304F\u3060\u3055\u3044\u3002
+SaveAction_readonlyTitle=\u8AAD\u307F\u8FBC\u307F\u5C02\u7528\u306E\u30DE\u30C3\u30D7\u3092\u4FDD\u5B58\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059
+SaveAll.text=\u3059\u3079\u3066\u306E\u30DE\u30C3\u30D7\u3092\u4FDD\u5B58(&A)
SaveAll.tooltip=\u958B\u3044\u3066\u3044\u308B\u30DE\u30C3\u30D7\u3092\u3059\u3079\u3066\u4FDD\u5B58\u3057\u307E\u3059\u3002
-SaveAsAction.text=\u540D\u524D\u3092\u4ED8\u3051\u3066\u30DE\u30C3\u30D7\u3092\u4FDD\u5B58(&A)...
+SaveAs_toReadonlyMsg={0} \u306F\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u3067\u3059\u3002\u7570\u306A\u308B\u30D5\u30A1\u30A4\u30EB\u306B\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044\u3002
+SaveAs_toReadonlyTitle=\u8AAD\u307F\u8FBC\u307F\u5C02\u7528\u306E\u30DE\u30C3\u30D7\u3078\u4FDD\u5B58\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059
+SaveAsAction.text=\u540D\u524D\u3092\u4ED8\u3051\u3066\u30DE\u30C3\u30D7\u3092\u4FDD\u5B58...
saved=\u4FDD\u5B58\u3057\u307E\u3057\u305F
saving_canceled=\u4FDD\u5B58\u3092\u4E2D\u6B62
scanners_not_loaded=\u30B9\u30AD\u30E3\u30CA\u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30D5\u30A1\u30A4\u30EB\u304C\u58CA\u308C\u3066\u3044\u307E\u3059\u3002
scheme_evaluate=\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u5B9F\u884C
script_execution_disabled=\u30B9\u30AF\u30EA\u30D7\u30C8\u5B9F\u884C\u7981\u6B62\u4E2D
-ScriptEditor.text=\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u7DE8\u96C6(&C)...
+ScriptEditor.text=\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u7DE8\u96C6...
ScriptEditor.tooltip=Freeplane \u3067\u30E9\u30FC\u30B8\u30B9\u30AF\u30EA\u30D7\u30C8\u306E\u66F8\u304D\u8FBC\u307F\u3092\u6709\u52B9\u306B\u3057\u307E\u3059\u3002
ScriptEditorPanel.changed_cancel=\u30B9\u30AF\u30EA\u30D7\u30C8\u306F\u5909\u66F4\u3055\u308C\u3066\u3044\u307E\u3059\u3002\u672C\u5F53\u306B\u5909\u66F4\u3092\u653E\u68C4\u3057\u307E\u3059\u304B\uFF1F
+scripting=\u30B9\u30AF\u30EA\u30D7\u30C8
scripting_api_generator_legend=\u30EC\u30B8\u30A7\u30F3\u30C9
scripting_api_generator_proxy=\u30D7\u30ED\u30AD\u30B7
scripting_api_generator_title=\u30B9\u30AF\u30EA\u30D7\u30C8 API
scripting_api_generator_utilities=\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3
scripting_api_generator_web=Web \u30EA\u30BD\u30FC\u30B9
+ScriptsRunToggleAction.ON_SELECTED_NODE.text=\u5168\u9078\u629E\u30CE\u30FC\u30C9\u3067\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u5B9F\u884C
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=\u518D\u5E30\u7684\u306B\u9078\u629E\u30CE\u30FC\u30C9\u3067\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u5B9F\u884C
+ScriptsRunToggleAction.ON_SINGLE_NODE.text=\u4E00\u3064\u306E\u30CE\u30FC\u30C9\u3067\u30B9\u30AF\u30EA\u30D7\u30C8\u3092\u5B9F\u884C
select_favorites_folder=\u304A\u6C17\u306B\u5165\u308A\u306E\u683C\u7D0D\u30D5\u30A9\u30EB\u30C0\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002
select_file_export_to=\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u3092\u9078\u629E
select_folder_for_importing=\u30A4\u30F3\u30DD\u30FC\u30C8\u3059\u308B\u30D5\u30A9\u30EB\u30C0\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002
select_icon=\u30A2\u30A4\u30B3\u30F3\u3092\u9078\u629E...
select_menu_item_dialog=\u30E1\u30CB\u30E5\u30FC\u304B\u3089\u8A72\u5F53\u9805\u76EE\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044\u3002
select_menu_item_root_node=\u30E1\u30CB\u30E5\u30FC
-SelectAllAction.text=\u8868\u793A\u4E2D\u306E\u30CE\u30FC\u30C9\u3092\u3059\u3079\u3066\u9078\u629E(&V)
-SelectBranchAction.text=\u679D\u306E\u8868\u793A\u30CE\u30FC\u30C9\u3092\u3059\u3079\u3066\u9078\u629E(&B)
-SelectedPasteAction.text=\u5F62\u5F0F\u3092\u9078\u629E\u3057\u3066\u8CBC\u308A\u4ED8\u3051(&A)...
+SelectAllAction.text=\u8868\u793A\u4E2D\u306E\u30CE\u30FC\u30C9\u3092\u3059\u3079\u3066\u9078\u629E
+SelectBranchAction.text=\u679D\u306E\u8868\u793A\u30CE\u30FC\u30C9\u3092\u3059\u3079\u3066\u9078\u629E
+SelectedPasteAction.text=\u5F62\u5F0F\u3092\u9078\u629E\u3057\u3066\u8CBC\u308A\u4ED8\u3051...
selection_method_by_click=\u30AF\u30EA\u30C3\u30AF\u3067\u9078\u629E
selection_method_delayed=\u9593\u3092\u7F6E\u3044\u3066\u81EA\u52D5\u9078\u629E
selection_method_direct=\u76F4\u3061\u306B\u9078\u629E
@@ -1488,6 +1591,8 @@ set_accelerator_on_next_click_action=<html>\u65B0\u898F\u30B7\u30E7\u30FC\u30C8\
SetAccelerator.dialogTitle=\u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u30AD\u30FC\u306E\u5272\u308A\u5F53\u3066
SetAccelerator.keystrokeDetected=\u5165\u529B\u30AD\u30FC ''{0}'' \u306F\u3001\u3069\u306E\u30E1\u30CB\u30E5\u30FC\u30A2\u30A4\u30C6\u30E0\u306B\u3082\u5272\u308A\u5F53\u3066\u3089\u308C\u3066\u3044\u307E\u305B\u3093\u3002
SetAcceleratorOnNextClickAction.text=\u30B7\u30E7\u30FC\u30C8\u30AB\u30C3\u30C8\u30AD\u30FC\u3092\u5272\u308A\u5F53\u3066...
+SetAlwaysUnfoldedNodeFlagsAction.text=\u5E38\u6642\u5C55\u958B\u30CE\u30FC\u30C9\u3068\u3057\u3066\u6307\u5B9A
+SetAlwaysUnfoldedNodeFlagsAction.tooltip=\u73FE\u5728\u5C55\u958B\u3055\u308C\u3066\u3044\u308B\u30CE\u30FC\u30C9\u306E\u6298\u308A\u305F\u305F\u307F\u3092\u6291\u5236\u3057\u307E\u3059
SetImageByFileChooserAction.text=\u753B\u50CF\uFF08\u30D5\u30A1\u30A4\u30EB\u9078\u629E or \u30EA\u30F3\u30AF\u304B\u3089\uFF09...
SetLinkAnchorAction.text=\u30EA\u30F3\u30AF\u30A2\u30F3\u30AB\u30FC\u3092\u30BB\u30C3\u30C8
SetLinkAnchorAction.tooltip=<html>\u30ED\u30FC\u30AB\u30EB\u30EA\u30F3\u30AF\u306A\u3044\u3057\u30B0\u30ED\u30FC\u30D0\u30EB\u30EA\u30F3\u30AF\u306E\u4F5C\u6210\u306B\u5099\u3048\u3066\u3001<br/>\u9078\u629E\u4E2D\u306E\u30CE\u30FC\u30C9\u306B\u30A2\u30F3\u30AB\u30FC\u3092\u30BB\u30C3\u30C8\u3057\u307E\u3059\u3002
@@ -1692,12 +1797,13 @@ simplyhtml.valignMiddle=\u4E2D\u592E\u63C3\u3048
simplyhtml.valignTop=\u4E0A\u8A70\u3081
simplyhtml.wholeWordsOnly=\u5B8C\u5168\u306B\u4E00\u81F4\u3059\u308B\u5358\u8A9E\u306E\u307F
simplyhtml.wholeWordsOnly.tooltip=\u8907\u6570\u8A9E\u306E\u691C\u7D22\u6642\u306B\u3001\u8A9E\u7FA4\u5168\u4F53\u304C\u30DE\u30C3\u30C1\u3059\u308B\u3082\u306E\u3060\u3051\u30DE\u30C3\u30C1\u3059\u308B\u3082\u306E\u3068\u307F\u306A\u3057\u307E\u3059\u3002
-SortNodes.text=\u5B50\u30CE\u30FC\u30C9\u3092\u4E26\u3079\u66FF\u3048(&S)
+SortNodes.text=\u5B50\u30CE\u30FC\u30C9\u3092\u4E26\u3079\u66FF\u3048
SortNodes.tooltip=\u3059\u3079\u3066\u306E\u5B50\u30CE\u30FC\u30C9\u3092\u6570\u5024\u9806\u3001\u30A2\u30EB\u30D5\u30A1\u30D9\u30C3\u30C8\u9806\u3001\u4E94\u5341\u97F3\u9806\u7B49\u306B\u4E26\u3079\u66FF\u3048\u307E\u3059\u3002
split=\u30CE\u30FC\u30C9\u3092\u5206\u5272(&S)
SplitConditionAction.text=Not \u3092\u9664\u53BB
-SplitNode.text=\u30CE\u30FC\u30C9\u3092\u5206\u5272(&S)
+SplitNode.text=\u30CE\u30FC\u30C9\u3092\u5206\u5272
SplitNode.tooltip=\u30CE\u30FC\u30C9\u3092\u5206\u5272\u3057\u307E\u3059\u3002
+SplitToWordsAction.text=\u4E00\u884C {0} \u5358\u8A9E\u306B\u5206\u5272
STANDARD_FORMAT=\u6A19\u6E96
stop_processing=\u9069\u7528\u3092\u4E2D\u6B62
StringFlavorHandler=\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8\uFF1A\u30CE\u30FC\u30C9\u968E\u5C64\u4ED8\u304D\uFF08\u6298\u308A\u7573\u3080\uFF09
@@ -1730,32 +1836,44 @@ styles.subtopic=\u4E2D\u898B\u51FA\u3057
styles.topic=\u5927\u898B\u51FA\u3057
styles.user-defined=\u30E6\u30FC\u30B6\u5B9A\u7FA9\u30B9\u30BF\u30A4\u30EB
styles.website=WEB \u30B5\u30A4\u30C8
+styles_background_html=\n <html>\n <head>\n </head>\n <body>\n <table width="800" style="text-align: left; vertical-align: top">\n <tr valign="top">\n <th>\n <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold">\n About this style set\n </div>\n <div style="text-align: left; font-weight: normal">\n <div style="margin: 3pt">\n This standard was developed after 11 years pedagogy research about how to make the process o [...]
styles_menu=\u5229\u7528\u53EF\u80FD\u306A\u30B9\u30BF\u30A4\u30EB
submenu_keystroke_in_use_error=\u30AD\u30FC\u5165\u529B {0} \u306F\u30B5\u30D6\u30E1\u30CB\u30E5\u30FC {1} \u3067\u306F\u4F7F\u3048\u307E\u305B\u3093\u3002\u30AD\u30FC\u5165\u529B\u306F\u524A\u9664\u3055\u308C\u307E\u3057\u305F\u3002
summary_nodes=\u307E\u3068\u3081\u30CE\u30FC\u30C9
summary_not_possible=\u73FE\u5728\u306E\u9078\u629E\u72B6\u6CC1\u3067\u306F\u3001\u307E\u3068\u3081\u30CE\u30FC\u30C9\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3002
-SummaryNodeAction.text=\u307E\u3068\u3081\u30CE\u30FC\u30C9\u306B\u6307\u5B9A\uFF0F\u89E3\u9664
svg=SVG
template_dir=\u6A19\u6E96\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8
+TextAlignAction.CENTER.text=\u4E2D\u592E\u63C3\u3048
+TextAlignAction.DEFAULT.text=\u898F\u5B9A\u5024
+TextAlignAction.LEFT.text=\u5DE6\u63C3\u3048
+TextAlignAction.RIGHT.text=\u53F3\u63C3\u3048
+textalignment=\u6587\u5B57\u63C3\u3048
TimeListAction.text=\u30BF\u30B9\u30AF\u3092\u7BA1\u7406...
TimeListAction.tooltip=\u3059\u3079\u3066\u306E\u30B9\u30B1\u30B8\u30E5\u30FC\u30EB\u3068\u95A2\u9023\u30CE\u30FC\u30C9\u3092\u8868\u793A
TimeManagementAction.text=\u6642\u9593\u3092\u7BA1\u7406...
TimeManagementAction.tooltip=\u30AB\u30EC\u30F3\u30C0\u30FC\u8868\u793A\u30E2\u30B8\u30E5\u30FC\u30EB\uFF08by Kai Toedter\uFF09\u3092\u8D77\u52D5\u3057\u307E\u3059\u3002
+TimePeriodUnits.days=\u65E5
+TimePeriodUnits.hours=\u6642\u9593
+TimePeriodUnits.minutes=\u5206
+TimePeriodUnits.ms=\u30DF\u30EA\u79D2
+TimePeriodUnits.seconds=\u79D2
+TimePeriodUnits.weeks=\u9031
ToggleChildrenFoldedAction.text=\u5B50\u30CE\u30FC\u30C9\u3092\u6298\u308A\u7573\u3080\uFF0F\u5C55\u958B\u3059\u308B
ToggleDetailsAction.text=\u8A73\u7D30\u3092\u96A0\u3059
ToggleFBarAction.text=\uFF26\u30D0\u30FC
ToggleFoldedAction.text=\u6298\u308A\u7573\u3080\uFF0F\u5C55\u958B\u3059\u308B
ToggleFullScreenAction.text=\u5168\u753B\u9762\u8868\u793A
-ToggleLeftToolbarAction.text=\u30A2\u30A4\u30B3\u30F3\u30C4\u30FC\u30EB\u30D0\u30FC(&I)
+ToggleLeftToolbarAction.text=\u30A2\u30A4\u30B3\u30F3\u30C4\u30FC\u30EB\u30D0\u30FC
ToggleMenubarAction.text=\u30E1\u30CB\u30E5\u30FC\u30D0\u30FC
ToggleScrollbarsAction.text=\u30B9\u30AF\u30ED\u30FC\u30EB\u30D0\u30FC
ToggleStatusAction.text=\u30B9\u30C6\u30FC\u30BF\u30B9\u30D0\u30FC\u3092\u8868\u793A
-ToggleToolbarAction.text=\u30C4\u30FC\u30EB\u30D0\u30FC(&T)
+ToggleToolbarAction.text=\u30C4\u30FC\u30EB\u30D0\u30FC
+toolbars=\u30C4\u30FC\u30EB\u30D0\u30FC
undefined_error=\u4E88\u671F\u3057\u306A\u3044\u30A8\u30E9\u30FC\u304C\u304A\u304D\u307E\u3057\u305F\u3002\u30D0\u30B0\u3092\u5831\u544A\u3057\u3066\u304F\u3060\u3055\u3044\u3002
underline=\u4E0B\u7DDA
UnderlineAction.text=\u4E0B\u7DDA
underlined=\u4E0B\u7DDA
-UndoAction.text=\u5143\u306B\u623B\u3059(&U)
+UndoAction.text=\u5143\u306B\u623B\u3059(U)
UndoFilterAction.text=\u30D5\u30A3\u30EB\u30BF\u3092\u5143\u306B\u623B\u3059
unfold=\u5C55\u958B
UnfoldAllAction.text=\u3059\u3079\u3066\u5C55\u958B\u3059\u308B
@@ -1788,11 +1906,14 @@ user_defined_zoom_status_bar=\u30E6\u30FC\u30B6\u306E\u6307\u5B9A\u306B\u3088\u3
user_icon=\u30E6\u30FC\u30B6\u30A2\u30A4\u30B3\u30F3 "{0}"
user_template_dir=\u30E6\u30FC\u30B6\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8
user_zoom=\u3000\u3000\u3000\u5370\u5237\u500D\u7387[0.0 - 2.0]\uFF1A
+userScripts=\u30B9\u30AF\u30EA\u30D7\u30C8
value_format=\u5C5E\u6027\u5024\u306E\u66F8\u5F0F
version_up_to_date=\u3054\u4F7F\u7528\u4E2D\u306E\u3082\u306E\u304C\u6700\u65B0\u30D0\u30FC\u30B8\u30E7\u30F3\u3067\u3059\u3002
-ViewerControllerAction.text=\u5916\u90E8\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8...
+view=\u8868\u793A(&V)
ViewLayoutTypeAction.OUTLINE.text=\u30A2\u30A6\u30C8\u30E9\u30A4\u30F3\u30D3\u30E5\u30FC
+web_resources=Web \u30EA\u30BD\u30FC\u30B9
WebDocuAction.text=Web\u30C9\u30AD\u30E5\u30E1\u30F3\u30C8
+WhatsNewAction.text=Freeplane 1.5.x \u306E\u66F4\u65B0\u5185\u5BB9
width=\u6A2A\u5E45
wrong_regexp=<html>\u6B63\u898F\u8868\u73FE "{0}" \u306B\u8AA4\u308A\u304C\u3042\u308A\u307E\u3059\u3002<br>\u4F8B\u5916\u30E1\u30C3\u30BB\u30FC\u30B8\uFF1A {1}</html>
xslt_export.html=XSLT\u3092\u4F7F\u3063\u3066 Html \u30C9\u30AD\u30E5\u30E1\u30F3\u30C8\u306B
@@ -1805,5 +1926,6 @@ xslt_export.ms_word=XSLT\u3092\u4F7F\u3063\u3066 Microsoft Word 2003 XML \u306B
xslt_export.text=XSLT\u3092\u4F7F\u3063\u3066\u30D7\u30EC\u30FC\u30F3\u30C6\u30AD\u30B9\u30C8\u306B
xslt_export_not_possible=Freeplane XSLT \u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3092\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093\u3002
yes=\u306F\u3044
+zoom=\u30BA\u30FC\u30E0
ZoomInAction.text=\u62E1\u5927\u8868\u793A
ZoomOutAction.text=\u7E2E\u5C0F\u8868\u793A
diff --git a/freeplane/resources/translations/Resources_ko.properties b/freeplane/resources/translations/Resources_ko.properties
index 9bf87fd..fe60d85 100644
--- a/freeplane/resources/translations/Resources_ko.properties
+++ b/freeplane/resources/translations/Resources_ko.properties
@@ -1,4 +1,4 @@
-about_text=\uD504\uB9AC\uD50C\uB808\uC778 - \uB9C8\uC778\uB4DC\uB9F5 \uBC0F \uC9C0\uC2DD \uC815\uB9AC\uB97C \uC704\uD55C \uC790\uC720 \uC18C\uD504\uD2B8\uC6E8\uC5B4
+about_text=\uD504\uB9AC\uD50C\uB808\uC778 - \uD504\uB9AC \uB9C8\uC778\uB4DC \uC9C0\uB3C4\uD654 \uBC0F \uC9C0\uC2DD \uAD6C\uCD95 \uC790\uC720 \uC18C\uD504\uD2B8\uC6E8\uC5B4
AboutAction.text=\uD504\uB85C\uADF8\uB7A8 \uC815\uBCF4
acceleratorPresets=\uB2E8\uCD95\uD0A4 \uAE30\uBCF8 \uC124\uC815
accelerators_loading_error={0}\uC5D0\uC11C \uAC00\uC18D\uAE30\uB97C \uBD88\uB7EC\uC62C \uC218 \uC5C6\uC74C
@@ -16,25 +16,26 @@ accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=\uC554\uD
accessories/plugins/EncryptNode.properties_select_me=\uACC4\uC18D\uD558\uC2DC\uB824\uBA74 \uC120\uD0DD\uD558\uC138\uC694!
accessories/plugins/EncryptNode.properties_wrong_password=\uC554\uD638\uAC00 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
accessories/plugins/ExportWithTWiki.text=TWiki \uBB38\uC11C\uB85C...
-accessories/plugins/ExportWithTWiki.tooltip=\uB9F5\uC744 TWiki \uBB38\uC11C\uB85C \uB0B4\uBCF4\uB0C5\uB2C8\uB2E4.
+accessories/plugins/ExportWithTWiki.tooltip=\uC9C0\uB3C4\uB97C TWiki \uBB38\uC11C\uB85C \uB0B4\uBCF4\uB0C5\uB2C8\uB2E4.
accessories/plugins/ExportWithXSLT.tooltip=XSLT \uC2A4\uD06C\uB9BD\uD2B8\uB97C \uC0AC\uC6A9\uC2DC \uADE0\uC77C\uD55C \uBC29\uBC95\uC744 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.
accessories/plugins/ExportWithXSLT_Applet.text=\uC790\uBC14 \uC560\uD50C\uB9BF\uC73C\uB85C...
-accessories/plugins/ExportWithXSLT_Applet.tooltip=\uC790\uBC14 \uC560\uD50C\uB9BF\uC73C\uB85C \uB9F5\uC744 \uB0B4\uBCF4\uB0C5\uB2C8\uB2E4.
+accessories/plugins/ExportWithXSLT_Applet.tooltip=\uC790\uBC14 \uC560\uD50C\uB9BF\uC73C\uB85C \uC9C0\uB3C4\uB97C \uB0B4\uBCF4\uB0C5\uB2C8\uB2E4.
accessories/plugins/ExportWithXSLT_Flash.text=\uD50C\uB798\uC2DC\uB85C...
-accessories/plugins/ExportWithXSLT_Flash.tooltip=\uD50C\uB798\uC2DC \uC751\uC6A9 \uD504\uB85C\uADF8\uB7A8\uC73C\uB85C \uB9F5\uC744 \uB0B4\uBCF4\uB0C5\uB2C8\uB2E4.
+accessories/plugins/ExportWithXSLT_Flash.tooltip=\uD50C\uB798\uC2DC \uC751\uC6A9 \uD504\uB85C\uADF8\uB7A8\uC73C\uB85C \uC9C0\uB3C4\uB97C \uB0B4\uBCF4\uB0C5\uB2C8\uB2E4.
accessories/plugins/ExportWithXSLT_HTML.text=XHTML\uB85C \uC800\uC7A5 (JavaScript \uD615\uD0DC)...
-accessories/plugins/ExportWithXSLT_HTML3.text=XHTML(\uD074\uB9AD \uAC00\uB2A5\uD55C \uB9F5 \uC774\uBBF8\uC9C0 \uD615\uD0DC)\uB85C \uC800\uC7A5...
+accessories/plugins/ExportWithXSLT_HTML3.text=XHTML(\uD074\uB9AD \uAC00\uB2A5\uD55C \uC9C0\uB3C4 \uADF8\uB9BC \uD615\uD0DC)\uB85C \uC800\uC7A5...
accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=RESOURCES \uB178\uB4DC\uC5D0\uC11C TaskJuggler \uD30C\uC77C\uB85C \uC790\uC6D0\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4.???...
accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>RESOURCES \uB178\uB4DC\uC5D0\uC11C Taskjuggler\uBAA8\uB4C8\uB85C \uC790\uC6D0\uC744 \uB0B4\uBCF4\uB0B4\uAE30. </html>
accessories/plugins/ExportWithXSLT_TASKSTJI.text=TASKS \uB178\uB4DC\uC5D0\uC11C TaskJuggler \uD30C\uC77C\uB85C \uC791\uC5C5\uC744 \uB9DE\uAE41\uB2C8\uB2E4???...
accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>TASKS \uB178\uB4DC\uB97C Taskjuggler \uBAA8\uB4C8\uB85C \uC791\uC5C5\uC744 \uB0B4\uBCF4\uB0B4\uAE30</html>
action_keystroke_in_use_error={1} \uB3D9\uC791\uC5D0 \uB300\uD574 \uC694\uCCAD\uB41C {0} \uD0A4 \uC785\uB825\uC740 {2} \uB3D9\uC791\uC5D0\uC11C \uC774\uBBF8 \uC0AC\uC6A9 \uC911\uC785\uB2C8\uB2E4
active=\uD65C\uC131\uD654
-actual_map_styles=\uB178\uB4DC\uC5D0 \uC801\uC6A9\uB41C \uB9F5 \uC790\uCCB4 \uAD00\uB828 \uC870\uAC74 \uC2A4\uD0C0\uC77C
-actual_node_styles=\uB178\uB4DC \uC870\uAC74\uBD80 \uC2A4\uD0C0\uC77C \uB178\uB4DC\uC5D0 \uC801\uC6A9
+actual_map_styles=\uB178\uB4DC\uC5D0 \uC801\uC6A9\uB41C \uC9C0\uB3C4 \uC790\uCCB4 \uAD00\uB828 \uC870\uAC74 \uAF34
+actual_node_styles=\uC870\uAC74\uBD80 \uAF34 \uB178\uB4DC\uC5D0 \uC801\uC6A9
add=\uCD94\uAC00(&A)
AddConnectorAction.text=\uC5F0\uACB0
AddElementaryConditionAction.text=\uCD94\uAC00
+AddExecutionLinkAction.text=\uC6B4\uC601\uCCB4\uC81C \uBA85\uB839\uC744 \uC2E4\uD589\uD560 \uC678\uBD80\uACE0\uB9AC\uB97C \uCD94\uAC00...
AddLocalLinkAction.text=\uB85C\uCEEC \uB9C1\uD06C \uCD94\uAC00
AddMenuItemLinkAction.text=\uBA54\uB274 \uD56D\uBAA9 \uB9C1\uD06C \uCD94\uAC00...
AddOnDetailsPanel.authored.by=?? By {0}
@@ -50,7 +51,7 @@ addons.installer.html.script=\uC2A4\uD06C\uB9BD\uD2B8 \uBCF8\uBB38\uC740 HTML \u
addons.installer.install=\uC124\uCE58
addons.installer.invalid.keyboard.shortcut=\uC798\uBABB\uB41C \uB2E8\uCD95 \uD0A4 {0}.
addons.installer.licence.unchanged=\uC0AC\uC6A9 \uD5C8\uAC00\uC11C\uAC00 \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC74C
-addons.installer.map.structure=\uB9F5 \uAD6C\uC870 \uC624\uB958: {0}
+addons.installer.map.structure=\uC9C0\uB3C4 \uAD6C\uC870 \uC624\uB958: {0}
addons.installer.missing.child.nodes=\uB204\uB77D\uB41C \uD558\uC704 \uB178\uB4DC: {0}
addons.installer.missing.permission.attribute=\uC2A4\uD06C\uB9BD\uD2B8 {0} : \uB204\uB77D \uB41C \uAD8C\uD55C \uC18D\uC131 {1}
addons.installer.missing.properties=\uB204\uB77D\uB41C \uC18D\uC131: {0}
@@ -73,19 +74,19 @@ addons.installer.unknown.deinstallation.rules=\uC54C\uC218 \uC5C6\uB294 \uC124\u
addons.installer.update=\uBC84\uC804 {0} \uC5D0\uC11C \uAC31\uC2E0
addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">\uC2E0\uB8B0\uD558\uB294 \uC6D0\uBCF8\uC73C\uB85C \uBD80\uAC00 \uAE30\uB2A5\uC744 \uC124\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4. \uC545\uC131 \uC18C\uD504\uD2B8\uC6E8\uC5B4\uB294 \uB370\uC774\uD130\uC5D0 \uB300\uD55C \uC190\uC0C1\uC774\uB098 \uAC1C\uC778\uC815\uBCF4\uB97C \uCE68\uD574\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.</strong></body></html>
addons.site=http://freeplane.sourceforge.net/addons/
-AddStyleAttributes.text=\uC18D\uC131\uC744 \uC2A4\uD0C0\uC77C\uB85C\uBD80\uD130 \uBCA0\uAEF4\uC624\uAE30
-AddStyleAttributes.tooltip=\uC2A4\uD0C0\uC77C \uB178\uB4DC\uC5D0\uC11C \uC18D\uC131\uC744 \uCD94\uAC00
-AllMapsNodeListAction.text=\uBAA8\uB4E0 \uB9F5\uC5D0\uC11C \uCC3E\uACE0 \uBC14\uAFB8\uAE30
+AddStyleAttributes.text=\uC18D\uC131\uC744 \uAF34\uB85C\uBD80\uD130 \uBCA0\uAEF4\uC624\uAE30
+AddStyleAttributes.tooltip=\uAF34 \uB178\uB4DC\uC5D0\uC11C \uC18D\uC131\uC744 \uCD94\uAC00
+AllMapsNodeListAction.text=\uBAA8\uB4E0 \uC9C0\uB3C4\uC5D0\uC11C \uCC3E\uC544 \uBC14\uAFB8\uAE30
always=\uD56D\uC0C1
AlwaysUnfoldedNodeAction.text=\uD56D\uC0C1 \uB178\uB4DC\uB97C \uD3B4\uAE30(\uC124\uC815/\uC7AC\uC124\uC815)
-antialias_all=\uBAA8\uB450 \uC564\uD2F0\uC5D0\uC77C\uB9AC\uC5B4\uC2A4 \uC801\uC6A9
-antialias_edges=\uC904\uAE30\uB9CC \uC564\uD2F0\uC5D0\uC77C\uB9AC\uC5B4\uC2A4 \uC801\uC6A9
-antialias_none=\uC564\uD2F0\uC5D0\uC77C\uB9AC\uC5B4\uC2A4 \uC0AC\uC6A9 \uC548\uD568
+antialias_all=\uBAA8\uB450 \uC548\uD2F0\uC54C\uB9AC\uC5B4\uC2A4 \uC801\uC6A9
+antialias_edges=\uC904\uAE30\uB9CC \uC548\uD2F0\uC54C\uB9AC\uC5B4\uC2A4 \uC801\uC6A9
+antialias_none=\uC548\uD2F0\uC54C\uB9AC\uC5B4\uC2A4 \uC0AC\uC6A9 \uC548\uD568
apply=\uC801\uC6A9(&A)
-ApplyAction.text=\uC801\uC6A9(&A)
+ApplyAction.text=\uC801\uC6A9(A)
ApplyFormatPlugin.text=\uC11C\uC2DD \uBC14\uAFB8\uAE30(&C) ...
ApplyFormatPlugin.tooltip=\uB178\uB4DC\uC640 \uC904\uAE30 \uD2B9\uC131\uC744 \uD55C \uBC88\uC5D0 \uBCC0\uACBD\uD560 \uC218 \uC788\uB294 \uB300\uD654\uC0C1\uC790\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.
-ApplyNoFilteringAction.text=\uD544\uD130\uC5C6\uC74C
+ApplyNoFilteringAction.text=\uAC70\uB984\uAE30 \uC5C6\uC74C
ApplySelectedViewConditionAction.text=\uC120\uD0DD\uD55C \uB178\uB4DC \uAC78\uB7EC\uB0B4\uAE30
ApplyToVisibleAction.text=\uAC78\uB7EC\uC9C4 \uB178\uB4DC\uC5D0 \uC801\uC6A9\uB428
as_parent=\uC0C1\uC704 \uB2E8\uACC4\uB85C
@@ -96,8 +97,9 @@ attribute_delete_value=\uC774 \uAC12 \uC0AD\uC81C
attribute_font_size_tooltip=\uAE00\uAF34 \uD06C\uAE30 \uC18D\uC131
attribute_list_box_label_text=\uC874\uC7AC\uD55C \uAC12
attribute_name=\uC18D\uC131 \uC774\uB984
+attribute_name_or_value=\uC18D\uC131 \uC774\uB984\uACFC \uAC12
attribute_replace=\uB300\uCE58\uD560 \uC18D\uC131\uAC12
-attribute_top=\uC5F4\uB824 \uC788\uB294 \uB9F5\uC5D0 \uC54C\uB824\uC9C4 \uBAA8\uB4E0 \uC18D\uC131
+attribute_top=\uC5F4\uB824 \uC788\uB294 \uC9C0\uB3C4\uC5D0 \uC54C\uB824\uC9C4 \uBAA8\uB4E0 \uC18D\uC131
attribute_value=\uC18D\uC131 \uAC12
attributes_AddAttributeAction.text=\uB300\uD654\uC0C1\uC790\uC5D0 \uC18D\uC131 \uCD94\uAC00...
attributes_adding_empty_attribute_error=\uC18D\uC131\uBA85\uC73C\uB85C \uBE48 \uBB38\uC790\uC5F4\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC74C
@@ -112,7 +114,7 @@ attributes_edit_tooltip=\uC124\uC815 \uD3B8\uC9D1
attributes_for_selected=\uC120\uD0DD\uD55C \uB178\uB4DC
attributes_for_visible=\uD45C\uC2DC\uB41C \uBAA8\uB4E0 \uB178\uB4DC
attributes_import=\uAC00\uC838\uC624\uAE30(&I)
-attributes_import_tooltip=\uC5F4\uB824 \uC788\uB294 \uB2E4\uB978 \uB9F5\uC73C\uB85C\uBD80\uD130 \uC18D\uC131 \uAC00\uC838\uC624\uAE30
+attributes_import_tooltip=\uC5F4\uB824 \uC788\uB294 \uB2E4\uB978 \uC9C0\uB3C4\uB85C\uBD80\uD130 \uC18D\uC131 \uAC00\uC838\uC624\uAE30
attributes_no_import_candidates_found=\uC0C8\uB85C\uC6B4 \uC18D\uC131\uC774 \uBC1C\uACAC\uB418\uC9C0 \uC54A\uC74C
attributes_popup_delete=\uC0AD\uC81C
attributes_popup_down=\uC544\uB798
@@ -136,15 +138,19 @@ attributes_visible=\uC120\uD0DD \uD45C\uC2DC
attributes_visible_tooltip=\uC120\uD0DD \uD45C\uC2DC
automatic_layout=\uC790\uB3D9 \uB808\uC774\uC544\uC6C3
automatic_layout_disabled=\uBE44\uD65C\uC131\uD654\uB428
-automatically_save_message=\uB9F5\uC774 \uC790\uB3D9\uC73C\uB85C \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4 (\uD30C\uC77C\uBA85 {0})...
+automatically_save_message=\uC9C0\uB3C4\uAC00 \uC790\uB3D9 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4 (\uD30C\uC77C\uBA85 {0})...
+AutomaticEdgeColor.FOR_BRANCHES=\uAC00\uC9C0\uB85C
+AutomaticEdgeColor.FOR_COLUMNS=\uC5F4\uB85C
+AutomaticEdgeColor.ON_BRANCH_CREATION=\uC9C0\uC810 \uC0DD\uC131
AutomaticEdgeColorHookAction.text=\uC790\uB3D9 \uC904\uAE30 \uC0C9\uC0C1
AutomaticLayout.ALL=\uBAA8\uB4E0 \uB178\uB4DC\uC5D0
AutomaticLayout.HEADINGS=\uBE44? \uB5A0\uB098\uC9C0 \uC54A\uB294 \uB178\uB4DC\uC5D0\uB300\uD574
AutomaticLayout.level=\uB2E8\uACC4 {0}
AutomaticLayout.level.root=\uCD5C\uC0C1\uC704 \uB178\uB4DC
-AutomaticLayoutAction.text=\uB2E8\uACC4\uBCC4 \uC2A4\uD0C0\uC77C \uC801\uC6A9(&A)
-AutomaticLayoutAction.tooltip=<html>\uB9F5\uC758 \uBC30\uCE58 \uD615\uD0DC\uB97C \uACE0\uC815\uD569\uB2C8\uB2E4.<br>\uCD5C\uC0C1\uC704 \uB2E8\uACC4\uB294 \uAC80\uC740\uC0C9, \uB450\uBC88\uC9F8\uB294 \uD30C\uB780\uC0C9 \uB4F1\uC73C\uB85C \uBCC0\uACBD\uB429\uB2C8\uB2E4.</html>
+AutomaticLayoutAction.text=\uB2E8\uACC4\uBCC4 \uAF34 \uC801\uC6A9(&A)
+AutomaticLayoutAction.tooltip=<html>\uC9C0\uB3C4\uC758 \uBC30\uCE58 \uD615\uD0DC\uB97C \uACE0\uC815\uD569\uB2C8\uB2E4.<br>\uCD5C\uC0C1\uC704 \uB2E8\uACC4\uB294 \uAC80\uC740\uC0C9, \uB450\uBC88\uC9F8\uB294 \uD30C\uB780\uC0C9 \uB4F1\uC73C\uB85C \uBCC0\uACBD\uB429\uB2C8\uB2E4.</html>
AutomaticLayoutControllerAction.ALL.text=\uBAA8\uB4E0 \uB178\uB4DC\uC5D0
+AutomaticLayoutControllerAction.COLUMNS.text=\uC5F4\uB85C
AutomaticLayoutControllerAction.HEADINGS.text=\uCD5C\uD558\uC704\uAC00 \uC544\uB2CC \uB178\uB4DC\uC5D0
AutomaticLayoutControllerAction.null.text=\uBE44\uD65C\uC131\uD654\uB428
BackAction.text=\uB4A4\uB85C
@@ -162,12 +168,12 @@ browse=\uCC3E\uC544\uBCF4\uAE30...
calendar_attributes_panel=\uB2EC\uB825 \uBC0F \uD2B9\uC131
calendar_panel=\uB2EC\uB825
can_not_connect_to_info_server=\uC815\uBCF4 \uC11C\uBC84\uB85C \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC74C
-can_not_delete_predefined_style=\uBBF8\uB9AC \uC815\uC758\uB41C \uC2A4\uD0C0\uC77C\uC744 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC74C
-can_not_delete_root_style=\uCD5C\uC0C1\uC704 \uB178\uB4DC \uC2A4\uD0C0\uC77C\uC744 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC74C
-can_not_delete_style_group=\uC2A4\uD0C0\uC77C \uADF8\uB8F9\uC744 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC74C
+can_not_delete_predefined_style=\uBBF8\uB9AC \uC815\uC758\uB41C \uAF34\uC744 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC74C
+can_not_delete_root_style=\uCD5C\uC0C1\uC704 \uB178\uB4DC \uAF34\uC744 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC74C
+can_not_delete_style_group=\uAF34 \uADF8\uB8F9\uC744 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC74C
can_not_save_key_set=\uB2E8\uCD95\uD0A4 \uC124\uC815\uC744 \uC800\uC7A5\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4
cancel=\uCDE8\uC18C(&C)
-CancelAction.text=\uCDE8\uC18C(&C)
+CancelAction.text=\uCDE8\uC18C(C)
cannot_add_parent_diff_parents=\uC774 \uAE30\uB2A5\uC744 \uC774\uC6A9\uD558\uB824\uBA74 \uBAA8\uB4E0 \uB178\uB4DC\uAC00 \uAC19\uC740 \uC0C1\uC704 \uB178\uB4DC\uB97C \uAC00\uC838\uC57C \uD569\uB2C8\uB2E4.
cannot_add_parent_to_root=\uCD5C\uC0C1\uC704 \uB178\uB4DC\uB97C \uC0C8\uB85C\uC6B4 \uC0C1\uC704 \uB178\uB4DC\uC5D0 \uCD94\uAC00\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
cannot_delete_root=\uCD5C\uC0C1\uC704 \uB178\uB4DC\uB294 \uC0AD\uC81C\uB418\uAC70\uB098 \uC624\uB824\uB458 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
@@ -191,13 +197,15 @@ ChangeNodeLevelRightsAction.tooltip=\uCD5C\uC0C1\uC704 \uB178\uB4DC\uC758 \uC67C
choose_background_color=\uBC30\uACBD\uC0C9 \uC120\uD0DD:
choose_cloud_color=\uAD6C\uB984 \uC0C9\uC0C1 \uC120\uD0DD:
choose_edge_color=\uC904\uAE30 \uC0C9 \uC120\uD0DD
-choose_map_background_color=\uB9F5 \uBC30\uACBD\uC0C9 \uACE0\uB974\uAE30
+choose_map_background_color=\uC9C0\uB3C4 \uBC30\uACBD\uC0C9 \uACE0\uB974\uAE30
choose_node_background_color=\uB178\uB4DC \uBC30\uACBD\uC0C9 \uC120\uD0DD:
choose_node_color=\uAE00\uC790\uC0C9 \uC120\uD0DD:
ClearLinkAnchorAction.text=\uC5F0\uACB0 \uC575\uCEE4?? \uC9C0\uC6B0\uAE30
ClearLinkAnchorAction.tooltip=<html>\uC774\uC804\uC5D0 \uC124\uC815\uD55C \uB178\uB4DC \uC575\uCEE4 \uC9C0\uC6B0\uAE30</html>
+CloneAction.text=\uC0AC\uBCF8 \uBD99\uC5EC\uB123\uAE30
close_btn=\uB2EB\uAE30(&C)
-CloseAction.text=\uD604\uC7AC \uB9F5 \uB2EB\uAE30(&C)
+CloseAction.text=\uD604\uC7AC \uC9C0\uB3C4 \uB2EB\uAE30(&C)
+cloud_shapes=\uAD6C\uB984 \uBAA8\uC591
CloudAction.text=\uAD6C\uB984 \uCD94\uAC00 / \uC81C\uAC70 (\uAE30\uBCF8 \uC124\uC815)
CloudColorAction.text=\uAD6C\uB984 \uC0C9\uC0C1...
CloudShapeAction.ARC.text=\uC6D0\uD638
@@ -214,42 +222,44 @@ connector_label=\uC5F0\uACB0\uC120 \uB77C\uBCA8
connector_lines=\uC5F0\uACB0\uC120 \uC885\uB958
connector_shapes=\uC5F0\uACB0\uC120 \uBAA8\uC591
ConnectorColorAction.text=\uC5F0\uACB0\uC120 \uC0C9\uC0C1...
-CopyAction.text=\uBCA0\uAEF4\uB450\uAE30(&C)
+CopyAction.text=\uBCA0\uAEF4\uB450\uAE30(C)
CopyAction.tooltip=\uC120\uD0DD\uD55C \uAC00\uC9C0 \uBCA0\uAEF4\uB450\uAE30
CopyAttributes.text=\uC18D\uC131 \uBCA0\uAEF4\uB450\uAE30(&A)
-CopyIDAction.text=\uB178\uB4DC I&D \uBCA0\uAEF4\uB450\uAE30
-CopyMapStylesAction.text=\uB9F5 \uC2A4\uD0C0\uC77C \uBCA0\uAEF4\uC624\uAE30...
+CopyIDAction.text=\uB178\uB4DC ID \uBCA0\uAEF4\uB450\uAE30
+CopyMapStylesAction.text=\uC9C0\uB3C4 \uAF34 \uBCF5\uC0AC...
CopyNodeURIAction.text=\uB178\uB4DC URI \uBCA0\uAEF4\uB450\uAE30
-copyright=\uC800\uC791\uAD8C \u00A9 2000-2014 \uD504\uB9AC\uD50C\uB808\uC778 \uD300\uACFC \uB3C4\uC640\uC8FC\uC2E0\uBD84\uB4E4
+copyright=\uC800\uC791\uAD8C \u00A9 2000-2016 \uD504\uB9AC\uD50C\uB808\uC778 \uD300\uACFC \uB3C4\uC640\uC8FC\uC2E0\uBD84\uB4E4
CopySingleAction.text=\uB178\uB4DC \uBCA0\uAEF4\uB450\uAE30(&S)
CopySingleAction.tooltip=\uC120\uD0DD\uD55C \uB178\uB4DC\uB9CC \uBCA0\uAEF4\uB450\uAE30
-CopyStyleExtensionsAction.text=\uC2A4\uD0C0\uC77C \uB178\uB4DC \uD655\uC7A5 \uD56D\uBAA9 \uBCA0\uAEF4\uB450\uAE30
-corrupt_map=\uB9F5 \uB0B4\uC6A9\uC774 \uC190\uC0C1\uB418\uC5C8\uC2B5\uB2C8\uB2E4
+CopyStyleExtensionsAction.text=\uAF34 \uB178\uB4DC \uD655\uC7A5 \uD56D\uBAA9 \uBCA0\uAEF4\uB450\uAE30
+corrupt_map=\uC9C0\uB3C4 \uB0B4\uC6A9\uC774 \uC190\uC0C1\uB418\uC5C8\uC2B5\uB2C8\uB2E4
CreateConjunctConditionAction.text=\uADF8\uB9AC\uACE0
CreateDisjunctConditionAction.text=\uB610\uB294
CreateNotSatisfiedConditionAction.text=\uC544\uB2D8
CreationModificationPluginAction.text=\uC218\uC815\uB41C \uC2DC\uAC04 \uD45C\uC2DC(&M)
CreationModificationPluginAction.tooltip=<html>\uC774 \uAE30\uB2A5\uC740 \uB178\uB4DC\uC758 \uC218\uC815/\uBCC0\uACBD \uC2DC\uAC04\uC744 \uAE30\uB85D\uD569\uB2C8\uB2E4.</html>
-current_dir=\uB9F5
-CutAction.text=\uC798\uB77C\uB0B4\uAE30(&T)
+current_dir=\uC9C0\uB3C4
+CutAction.text=\uC798\uB77C\uB0B4\uAE30(T)
decrease_branch_font_size=\uAC00\uC9C0\uC758 \uD3F0\uD2B8 \uC791\uAC8C
DecreaseNodeFontAction.text=\uAC00\uC9C0\uC758 \uD3F0\uD2B8 \uC791\uAC8C
default=\uAE30\uBCF8 \uC124\uC815
+defaultAuxiliaryWordList=??a, the, of
DefaultColorAction.text=\uAE30\uBCF8 \uC0C9
+defaultstyle.attributes=\uC18D\uC131
defaultstyle.details=\uC0C1\uC138
defaultstyle.floating=\uB5A0\uC788\uB294 \uB178\uB4DC
defaultstyle.note=\uB178\uD2B8
delete=\uC0AD\uC81C(&D)
delete_child=\uB178\uB4DC \uC0AD\uC81C
-DeleteAction.text=\uB178\uB4DC \uC81C\uAC70(&O)
+DeleteAction.text=\uB178\uB4DC \uC81C\uAC70(O)
DeleteConditionAction.text=\uC0AD\uC81C
DeleteDetailsAction.text=\uB178\uB4DC \uC815\uBCF4\uB97C \uC81C\uAC70
-DeleteLevelStyleAction.text=\uB2E8\uACC4\uBCC4 \uC2A4\uD0C0\uC77C \uC81C\uAC70
-DeleteStyleAction.text=\uC2A4\uD0C0\uC77C \uC81C\uAC70
-DeleteUserStyleAction.text=\uC0AC\uC6A9\uC790 \uC9C0\uC815 \uC2A4\uD0C0\uC77C \uC81C\uAC70
-dialect_info.app=\uB9C8\uC778\uB4DC\uB9F5 \uD30C\uC77C {0}\uC740(\uB294) {1} \uD504\uB85C\uADF8\uB7A8\uC73C\uB85C \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4.
-dialect_info.later_version=\uB9C8\uC778\uB4DC\uB9F5 \uD30C\uC77C {0}\uC740(\uB294) \uC0C8\uB85C\uC6B4 \uBC84\uC804\uC758 \uD504\uB85C\uADF8\uB7A8\uC73C\uB85C \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4.
-dialect_info.unknownApp=\uB9C8\uC778\uB4DC\uB9F5 \uD30C\uC77C {0}\uC740(\uB294) \uC54C\uC218 \uC5C6\uB294 \uD504\uB85C\uADF8\uB7A8\uC73C\uB85C \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4.
+DeleteLevelStyleAction.text=\uB2E8\uACC4\uBCC4 \uAF34 \uC81C\uAC70
+DeleteStyleAction.text=\uAF34 \uC81C\uAC70
+DeleteUserStyleAction.text=\uC0AC\uC6A9\uC790 \uC9C0\uC815 \uAF34 \uC81C\uAC70
+dialect_info.app=\uB9C8\uC778\uB4DC \uC9C0\uB3C4 \uD30C\uC77C {0}\uC740(\uB294) {1} \uD504\uB85C\uADF8\uB7A8\uC73C\uB85C \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4.
+dialect_info.later_version=\uB9C8\uC778\uB4DC \uC9C0\uB3C4 \uD30C\uC77C {0}\uC740(\uB294) \uC0C8\uB85C\uC6B4 \uBC84\uC804\uC758 \uD504\uB85C\uADF8\uB7A8\uC73C\uB85C \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4.
+dialect_info.unknownApp=\uB9C8\uC778\uB4DC \uC9C0\uB3C4 \uD30C\uC77C {0}\uC740(\uB294) \uC54C \uC218 \uC5C6\uB294 \uD504\uB85C\uADF8\uB7A8\uC73C\uB85C \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4.
dialect_info.unknownURL=\uADF8 \uC6F9 \uC0AC\uC774\uD2B8\uB294 \uC54C\uB824\uC838 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
dialect_info.url=\uB354\uB9CE\uC740 \uC815\uBCF4\uB97C \uC704\uD574 \uC6F9\uC0AC\uC774\uD2B8 {0} \uC5D0 \uBC29\uBB38 \uD569\uB2C8\uB2E4.
dialect_info.warning=\uD504\uB9AC\uD50C\uB808\uC778\uC740 \uADF8\uAC83\uC744 \uC5F4\uACE0, \uD45C\uC2DC\uD558\uACE0, \uC800\uC7A5\uD558\uAE30\uB97C \uC62C\uBC14\uB974\uAC8C \uD560\uC218 \uC5C6\uC744\uAC83\uC785\uB2C8\uB2E4.
@@ -260,10 +270,12 @@ DownConditionAction.text=\uC544\uB798
download=\uB0B4\uB824\uBC1B\uAE30
dropped_file_error=\uB5A8\uC5B4\uC9C4 \uD30C\uC77C\uC744 \uC5F4\uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC774\uC720: {0}
edge=\uC904\uAE30
-edge_is_formatted_by_style=\uC904\uAE30 \uD615\uC2DD\uC740 \uC2A4\uD0C0\uC77C\uC5D0 \uC758\uD574 \uC81C\uC5B4\uB429\uB2C8\uB2E4. \uD544\uC694\uC5D0 \uB530\uB77C \uAD00\uB828 \uC2A4\uD0C0\uC77C\uC744 \uD3B8\uC9D1\uD558\uC138\uC694.
-edge_style=\uC904\uAE30 \uC2A4\uD0C0\uC77C
+edge_is_formatted_by_style=\uC904\uAE30 \uD615\uC2DD\uC740 \uAF34\uC5D0 \uC758\uD574 \uC81C\uC5B4\uB429\uB2C8\uB2E4. \uD544\uC694\uC5D0 \uB530\uB77C \uAD00\uB828 \uAF34\uC744 \uD3B8\uC9D1\uD558\uC138\uC694.
+edge_style=\uC904\uAE30 \uAF34
edge_width=\uC904\uAE30 \uB108\uBE44
+edge_widths=\uBAA8\uC11C\uB9AC \uB113\uC774
EdgeColorAction.text=\uC904\uAE30 \uC0C9\uC0C1...
+EdgeProperties=\uBAA8\uC11C\uB9AC \uD2B9\uC131
EdgeStyleAction.bezier.text=\uBCA0\uC9C0\uC5B4 \uACE1\uC120
EdgeStyleAction.bezier.tooltip=<html>\uC904\uAE30\uB97C \uBD80\uB4DC\uB7EC\uC6B4 \uACE1\uC120\uC73C\uB85C \uD45C\uC2DC</html>
EdgeStyleAction.hide_edge.text=\uC904\uAE30 \uC228\uAE30\uAE30
@@ -277,7 +289,7 @@ EdgeStyleAction.sharp_bezier.tooltip=<html>\uC904\uAE30\uB97C \uB05D\uC774 \uBFB
EdgeStyleAction.sharp_linear.text=\uB0A0\uCE74\uB85C\uC6B4 \uC9C1\uC120
EdgeStyleAction.sharp_linear.tooltip=<html>\uC904\uAE30\uB97C \uB05D\uC774 \uBFB0\uC871\uD55C \uC9C1\uC120\uC73C\uB85C \uD45C\uC2DC\uD569\uB2C8\uB2E4.</html>
EdgeStyleAsParentAction.text=\uC0C1\uC704 \uB2E8\uACC4\uB85C
-EdgeStyleAsParentAction.tooltip=<html>\uC0C1\uC704 \uB178\uB4DC\uC758 \uC904\uAE30 \uC2A4\uD0C0\uC77C\uC744 \uC774\uC6A9\uD569\uB2C8\uB2E4.</html>[\uD3D0\uAE30\uC608\uC815]
+EdgeStyleAsParentAction.tooltip=<html>\uC0C1\uC704 \uB178\uB4DC\uC758 \uC904\uAE30 \uAF34\uC744 \uC774\uC6A9\uD569\uB2C8\uB2E4.</html>[\uD3D0\uAE30\uC608\uC815]
EdgeWidthAction_width_parent.text=\uC0C1\uC704 \uB178\uB4DC\uCC98\uB7FC
EdgeWidthAction_width_thin.text=\uC587\uAC8C
edit=\uD3B8\uC9D1(&E)
@@ -299,27 +311,31 @@ EditAction.text=\uB178\uB4DC \uD45C\uC81C \uC989\uC11D \uD3B8\uC9D1
EditAttributesAction.text=\uC778\uB77C\uC778 \uC18D\uC131 \uD3B8\uC9D1
EditDetailsAction.text=\uC0C1\uC138 \uC778 \uB77C\uC778 \uB178\uB4DC \uD3B8\uC9D1
EditDetailsInDialogAction.text=\uB300\uD654\uC0C1\uC790\uC758 \uC0C1\uC138 \uB178\uB4DC \uD3B8\uC9D1
-EditFilterAction.text=\uD544\uD130 \uC791\uC131\uD558\uAE30
+EditFilterAction.text=\uAC70\uB984\uAE30 \uC791\uC131
EditLongAction.text=\uB178\uB4DC \uD45C\uC81C\uB97C \uB300\uD654 \uC0C1\uC790\uC5D0\uC11C \uD3B8\uC9D1
EditNoteInDialogAction.text=\uB300\uD654\uC0C1\uC790\uC758 \uBA54\uBAA8 \uD3B8\uC9D1
EditScript=\uC2A4\uD06C\uB9BD\uD2B8 \uD3B8\uC9D1...
-EditStylesAction.text=\uC2A4\uD0C0\uC77C \uD3B8\uC9D1
-EncryptedMap.text=\uC554\uD638\uD654\uB41C \uB9F5\uC73C\uB85C \uC800\uC7A5(&Y) ...
-EncryptedMap.tooltip=\uC554\uD638\uD654\uB41C \uC0C8\uB85C\uC6B4 \uB9F5 \uC791\uC131
+EditStylesAction.text=\uAF34 \uD3B8\uC9D1
+EncryptedMap.text=\uC554\uD638\uD654\uB41C \uC9C0\uB3C4\uB85C \uC800\uC7A5(&Y) ...
+EncryptedMap.tooltip=\uC554\uD638\uD654\uB41C \uC0C8\uB85C\uC6B4 \uC9C0\uB3C4 \uC791\uC131
+encryption=\uC554\uD638\uD654
enter_base_url=\uC5F0\uAD00\uB41C \uB9C1\uD06C\uB97C \uBD99\uC5EC\uB123\uC2B5\uB2C8\uB2E4. \uAE30\uBCF8 URL\uC744 \uC785\uB825\uD558\uC138\uC694.
+enter_command=\uBA85\uB839\uC5B4 \uC785\uB825
enter_condition_name=\uC0C8\uB85C\uC6B4 \uC870\uAC74\uBA85\uC744 \uC785\uB825
enter_confirms=\uC5D4\uD130 \uD0A4\uB85C \uD655\uC778(&E)
enter_keyset_name=\uB2E8\uCD95\uD0A4 \uC124\uC815 \uC774\uB984\uC744 \uC785\uB825\uD558\uC138\uC694
-enter_map_url=\uB9F5 URL\uC744 \uC785\uB825\uD558\uC138\uC694
-enter_new_style_name=\uC0C8\uB85C\uC6B4 \uC2A4\uD0C0\uC77C \uC774\uB984 \uC785\uB825
+enter_map_url=\uC9C0\uB3C4 URL\uC744 \uC785\uB825\uD558\uC138\uC694
+enter_new_style_name=\uC0C8\uB85C\uC6B4 \uAF34 \uC774\uB984 \uC785\uB825
enter_node_id=\uB178\uB4DC ID \uC785\uB825
enter_zoom=\uD655\uB300\uC728 \uC785\uB825
EnterPassword.text=\uC554\uD638 \uC785\uB825
error=\uC624\uB958
error_applying_template=XSL \uC11C\uC2DD \uC801\uC6A9 \uC624\uB958.
error_creating_directory=\uB0B4\uBCF4\uB0B4\uAE30\uB97C \uC704\uD55C \uB514\uB809\uD1A0\uB9AC\uB97C \uC0DD\uC131\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
-error_in_template=\uAE30\uBCF8 \uB9F5 \uC11C\uC2DD\uC5D0\uC11C {0} \uC624\uB958 \uBC1C\uC0DD. \uC774 \uD30C\uC77C\uC744 \uC81C\uAC70\uD558\uC2ED\uC2DC\uC694.
+error_in_template=\uAE30\uBCF8 \uC9C0\uB3C4 \uC11C\uC2DD\uC5D0\uC11C {0} \uC624\uB958 \uBC1C\uC0DD. \uC774 \uD30C\uC77C\uC744 \uC81C\uAC70\uD558\uC2ED\uC2DC\uC694.
errornumber=\uC624\uB958 {0}\uAC1C
+ExecuteScript.available_modes_tooltip={0} \uC740 \uC0AC\uC6A9\uAC00\uB2A5\uD569\uB2C8\uB2E4
+ExecuteScript.script=\uC2A4\uD06C\uB9BD\uD2B8
ExecuteScriptError.text=\uC2A4\uD06C\uB9BD\uD2B8\uB97C \uC2E4\uD589 \uC624\uB958:\n{0}
ExecuteScriptForAllNodes.text=\uBAA8\uB4E0 \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589
ExecuteScriptForSelectionAction.text=\uC120\uD0DD\uD55C \uB178\uB4DC \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589
@@ -333,8 +349,8 @@ export_failed=\uB0B4\uBCF4\uB0B4\uAE30 \uC2E4\uD328
export_pdf_text=PDF(\uD734\uB300\uC6A9 \uBB38\uC11C \uD615\uC2DD) text\uB85C \uB0B4\uBCF4\uB0B4\uAE30
export_svg_text=SVG(Scalable Vector Graphic) \uD14D\uC2A4\uD2B8\uB85C \uB0B4\uBCF4\uB0B4\uAE30
export_using_xslt=\uD504\uB9AC\uD50C\uB808\uC778 \uB0B4\uBCF4\uB0B4\uAE30
-ExportAction.text=\uB9F5 \uB0B4\uBCF4\uB0B4\uAE30... (&E)
-ExportBranchAction.text=\uAC00\uC9C0\uB97C \uC0C8\uB85C\uC6B4 \uB9F5-\uC73C\uB85C \uC774\uB3D9 ...
+ExportAction.text=\uC9C0\uB3C4 \uB0B4\uBCF4\uB0B4\uAE30... (&E)
+ExportBranchAction.text=\uAC00\uC9C0\uB97C \uC0C8\uB85C\uC6B4 \uC9C0\uB3C4\uB85C \uC774\uB3D9...
ExportBranchToHTMLAction.text=\uAC00\uC9C0\uB97C HTML\uB85C \uB0B4\uBCF4\uB0B4\uAE30
exported_file=\uD30C\uC77C {0}
ExportPdf.text=PDF
@@ -343,7 +359,7 @@ ExportToHTMLAction.text=HTML
ExportToImage.jpg.text=JPEG
ExportToImage.png.text=PNG
ExportToOoWriter.text=\uC624\uD508\uC624\uD53C\uC2A4 Writer \uBB38\uC11C\uB85C...
-extension_menu=\uC900\uBE44\uB41C \uC2A4\uD0C0\uC77C \uC801\uC6A9
+extension_menu=\uC900\uBE44\uB41C \uAF34 \uC801\uC6A9
ExternalImage_popupMenu_Change=\uBCC0\uACBD...
ExternalImage_popupMenu_Open=\uBDF0\uC5B4\uB85C \uC5F4\uAE30
ExternalImage_popupMenu_Remove=\uC81C\uAC70
@@ -353,6 +369,7 @@ ExternalImageChangeAction.text=\uC774\uBBF8\uC9C0 \uBCC0\uACBD...
ExternalImageRemoveAction.text=\uC774\uBBF8\uC9C0 \uC81C\uAC70
ExtractLinkFromTextAction.text=\uD14D\uC2A4\uD2B8 \uB0B4\uBD80\uC5D0\uC11C \uB9C1\uD06C \uBCC0\uD658
ExtractLinkFromTextAction.tooltip=\uC8FC\uC18C n \uB178\uB4DC \uD14D\uC2A4\uD2B8\uC5D0\uC11C \uD558\uC774\uD37C \uB9C1\uD06C\uB97C \uC124\uC815
+extras=\uB3C4\uAD6C(&T)
f_button_unassigned=<\uB3D9\uC791 \uC5C6\uC74C>
FaqOpenURLAction.text=\uC790\uC8FC \uBB3B\uB294 \uC9C8\uBB38
file=\uD30C\uC77C(&F)
@@ -369,10 +386,10 @@ FileProperties_MainBranchCount=\uBA54\uC778 \uAC00\uC9C0\uC758 \uAC2F\uC218:
FileProperties_NeverSaved=\uC800\uC7A5\uB41C \uC801 \uC5C6\uC74C
FileProperties_NodeChildCount=\uC120\uD0DD\uD55C \uD558\uC704 \uB178\uB4DC\uC758 \uC218:
FileProperties_NodeSelectionCount=\uC120\uD0DD\uD55C \uB178\uB4DC \uC218:
-FileProperties_TotalFilteredCount=\uD544\uD130\uB97C \uB9CC\uC871\uD558\uB294 \uB178\uB4DC \uC218:
+FileProperties_TotalFilteredCount=\uAC70\uB984\uAE30\uB97C \uB9CC\uC871\uD558\uB294 \uB178\uB4DC \uC218:
FileProperties_TotalLeafCount=\uCD5C\uD558\uC704 \uB178\uB4DC \uC218 \uD569\uACC4:
FileProperties_TotalNodeCount=\uCD1D \uB178\uB4DC \uC218:
-FilePropertiesAction.text=\uB9F5 \uAD00\uB828 \uD1B5\uACC4(&I)...
+FilePropertiesAction.text=\uC9C0\uB3C4 \uAD00\uB828 \uD1B5\uACC4(&I)...
FileRevisionsDialog.cancel=\uCDE8\uC18C (&C)
FileRevisionsDialog.file_last_modified=\uD0C0\uC784\uC2A4\uD0EC\uD504
FileRevisionsDialog.file_name=\uD30C\uC77C
@@ -383,19 +400,21 @@ FileRevisionsDialog.question={0} \uC758 \uAC1C\uC815\uD310\uC744 \uBC1C\uACAC\uD
FileRevisionsDialog.restore=\uBCF5\uC6D0(&o)
FileRevisionsDialog.restore.tooltip={0}\uC744(\uB97C) {1}(\uC73C)\uB85C \uB300\uCE58
FileRevisionsDialog.title=\uD30C\uC77C \uAC1C\uC815\uD310
-filter=\uD544\uD130
+filter=\uAC70\uB984\uAE30(&I)
filter_add=\uCD94\uAC00(&A)
filter_and=\uADF8\uB9AC\uACE0( &n)
filter_any_text=\uD45C\uC81C, \uC138\uBD80 \uC0AC\uD56D \uB610\uB294 \uB178\uD2B8
-filter_conditions=\uD544\uD130
+filter_clone_snapshot=\uC800\uC7A5\uB41C?? \uC0AC\uBCF8 \uC120\uD0DD
+filter_clones=\uC0AC\uBCF8 \uC120\uD0DD?? \uC120\uD0DD\uC758 \uC0AC\uBCF8
+filter_conditions=\uAC70\uB984\uAE30
filter_contains=\uB2E4\uC74C \uBB38\uC790\uC5F4\uC744 \uD3EC\uD568
filter_created_after=\uB2E4\uC74C \uB0A0\uC9DC \uC774\uD6C4\uC5D0 \uC0DD\uC131
filter_created_before=\uB2E4\uC74C \uB0A0\uC9DC \uC774\uC804\uC5D0 \uC0DD\uC131
filter_delete=\uC0AD\uC81C(&D)
filter_details=\uC0C1\uC138
-filter_dialog=\uD544\uD130 \uC791\uC131\uAE30
+filter_dialog=\uAC70\uB984\uAE30 \uC791\uC131\uAE30
filter_does_not_exist=\uC874\uC7AC\uD558\uC9C0 \uC54A\uC74C
-filter_edit_description=\uD544\uD130 \uBAA9\uB85D \uD3B8\uC9D1
+filter_edit_description=\uD3B8\uC9D1 \uAC70\uB984\uAE30 \uBAA9\uB85D \uB610\uB294 \uAC70\uB984\uAE30 \uBAA9\uB85D \uD3B8\uC9D1
filter_enter_value=\uAC12 \uC785\uB825
filter_even_level=\uD640\uC218 \uB2E8\uACC4 \uB178\uB4DC
filter_exist=\uC874\uC7AC\uD568
@@ -410,7 +429,7 @@ filter_match_case=\uB300\uC18C\uBB38\uC790 \uAD6C\uBD84(&C)
filter_match_case_tooltip=\uC77C\uCE58 \uD560\uACBD\uC6B0 \uC874\uC911\uC5EC\uBD80\uB97C \uC9C0\uC815 \uD569\uB2C8\uB2E4.
filter_modified_after=\uBCC0\uACBD \uD6C4
filter_modified_before=\uBCC0\uACBD \uC804
-filter_no_filtering=\uD544\uD130 \uBBF8\uC801\uC6A9(\uC81C\uAC70)
+filter_no_filtering=\uAC70\uB984\uAE30 \uC5C6\uC74C(\uC81C\uAC70)
filter_node=\uD45C\uC81C \uB0B4\uC6A9
filter_node_level=\uB178\uB4DC\uC758 \uB2E8\uACC4
filter_not=\uC544\uB2D8( &N)
@@ -427,35 +446,41 @@ filter_reminder_before=\uC77C\uC815 \uC804
filter_reminder_executed=\uC774\uBBF8 \uC2E4\uD589\uB428
filter_reminder_later=\uCD94\uD6C4\uC5D0 \uC6B8\uB9AC\uB3C4\uB85D \uC124\uC815
filter_root=\uCD5C\uC0C1\uC704 \uB178\uB4DC
-filter_script=\uC2A4\uD06C\uB9BD\uD2B8 \uD544\uD130
+filter_script=\uC2A4\uD06C\uB9BD\uD2B8 \uAC70\uB984\uAE30
filter_select=\uC120\uD0DD(&S)
filter_selected_node_view=\uD604\uC7AC \uC120\uD0DD\uB41C \uB178\uB4DC
filter_selected_node_view_snapshot=\uC800\uC7A5\uB41C \uC120\uD0DD
-filter_style=\uC2A4\uD0C0\uC77C
-filter_time=\uB0A0\uC9DC \uD544\uD130
-FilterComposerDialog.save=\uC800\uC7A5(&S)
-filters_not_loaded=\uD544\uD130\uB97C \uBD88\uB7EC\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uD30C\uC77C\uC774 \uC190\uC0C1\uB428
+filter_style=\uAF34
+filter_time=\uB0A0\uC9DC \uAC70\uB984\uAE30
+FilterCondition=\uC870\uAC74\uBD80 \uAC70\uB984\uAE30
+filterConditions=\uC0AC\uC6A9\uC790\uC815\uC758 \uAC70\uB984\uAE30
+filters_not_loaded=\uAC70\uB984\uAE30\uB97C \uBD88\uB7EC\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uD30C\uC77C\uC774 \uC190\uC0C1\uB428
+find=\uCC3E\uAE30
find_what=\uCC3E\uC744 \uB0B4\uC6A9
FindAction.text=\uCC3E\uAE30...
-FirstGroupNodeAction.text=\uC694\uC57D \uB178\uB4DC (begin of group)
+FindNextAction.text=\uB2E4\uC74C \uCC3E\uAE30
+FindPreviousAction.text=\uC774\uC804 \uCC3E\uAE30
+fit_background_to_page=\uD55C\uC7A5\uC73C\uB85C \uBC30\uACBD \uADF8\uB9BC\uC744 \uB9DE\uCD94\uAE30
fit_map_to_page=\uD55C \uD398\uC774\uC9C0\uC5D0 \uB9DE\uCD94\uAE30(&F)
fit_map_to_page_height=\uD55C \uD398\uC774\uC9C0\uC5D0 \uB192\uC774\uB97C \uB9DE\uCD94\uAE30(&H)
fit_map_to_page_width=\uD55C \uD398\uC774\uC9C0\uC5D0 \uB108\uBE44\uB97C \uB9DE\uCD94\uAE30(&W)
FitToPage.text=\uD398\uC774\uC9C0\uC5D0 \uB9DE\uAC8C \uD655\uB300/\uCD95\uC18C(&F)
-FitToPage.tooltip=\uD604\uC7AC \uC708\uB3C4\uC6B0\uC5D0 \uB9F5 \uC804\uCCB4\uAC00 \uB4E4\uC5B4\uAC00\uB3C4\uB85D \uD655\uB300\uC728\uC744 \uC870\uC815\uD569\uB2C8\uB2E4.
+FitToPage.tooltip=\uD604\uC7AC \uCC3D\uC5D0 \uC9C0\uB3C4 \uC804\uCCB4\uAC00 \uB4E4\uC5B4\uAC00\uB3C4\uB85D \uD655\uB300\uC728\uC744 \uC870\uC815\uD569\uB2C8\uB2E4.
fold=\uC811\uAE30
FoldAllAction.text=\uBAA8\uB450 \uC811\uAE30
FoldAllAction.tooltip=<html>\uC120\uD0DD\uD55C \uB178\uB4DC\uC640 \uD558\uC704 \uB178\uB4DC\uB97C \uBAA8\uB450 \uC811\uC2B5\uB2C8\uB2E4.</html>
FoldOneLevelAction.text=1\uB2E8\uACC4\uB9CC \uC811\uAE30
FoldOneLevelAction.tooltip=<html>\uC120\uD0DD\uD55C \uB178\uB4DC\uB85C\uBD80\uD130 \uD55C \uB2E8\uACC4\uAE4C\uC9C0\uB9CC \uC811\uC2B5\uB2C8\uB2E4.</html>
-follow_graphical_link=\uAC00\uAE30:
+follow_clone=\uB0B4\uBD80\uB85C "{0}"
+follow_graphical_link=''{0}'' \uB85C \uAC00\uAE30
FollowLinkAction.text=\uB9C1\uD06C \uB530\uB77C\uAC00\uAE30
font=\uAE00\uAF34
FontFamilyAction.text=\uD3F0\uD2B8 \uC885\uB958
FontSizeAction.text=\uD3F0\uD2B8 \uD06C\uAE30
+format=\uBAA8\uC591
format_invalid_pattern=\uC720\uD6A8\uD558\uC9C0 \uC54A\uC740 \uD328\uD134
-format_menu_cloud_shapes=\uAD6C\uB984\uC744 \uCD94\uAC00\uD558\uAC70\uB098 \uC2A4\uD0C0\uC77C \uBCC0\uACBD
-format_menu_edge_styles=\uC904\uAE30 \uC2A4\uD0C0\uC77C(&E)
+format_menu_cloud_shapes=\uAD6C\uB984\uC744 \uCD94\uAC00\uD558\uAC70\uB098 \uAF34 \uBCC0\uACBD
+format_menu_edge_styles=\uC904\uAE30 \uAF34(&E)
format_menu_edge_widths=\uC904\uAE30 \uB450\uAED8(&W)
format_panel=\uC11C\uC2DD
FormatCopy.text=\uC11C\uC2DD \uBCA0\uAEF4\uB450\uAE30
@@ -466,7 +491,7 @@ formats_not_loaded=\uD615\uC2DD\uC744 \uBD88\uB7EC\uC62C \uC218 \uC5C6\uC2B5\uB2
formula.error.attributeValueIsNull=\uD3C9\uAC00 \uD6C4 \uD2B9\uC131 \uAC12 ''{0}'' \uC740 \uB110(null) \uC785\uB2C8\uB2E4.
formula.error.circularReference=\uC21C\uD658 \uCC38\uC870: \uC218\uC2DD \uB178\uB4DC ''{0}'' \uC5D0\uC11C \uC790\uC2E0\uC744 \uCC38\uC870 \uD569\uB2C8\uB2E4.
formula.EvaluateAllAction.text=\uD3C9\uAC00\uD558\uAE30
-formula.EvaluateAllAction.tooltip=\uD604\uC7AC\uC758 \uB9F5\uC5D0 \uC788\uB294 \uBAA8\uB4E0 \uC218\uC2DD \uD3C9\uAC00\uD558\uAE30
+formula.EvaluateAllAction.tooltip=\uD604\uC7AC\uC758 \uC9C0\uB3C4\uC5D0 \uC788\uB294 \uBAA8\uB4E0 \uC218\uC2DD \uD3C9\uAC00\uD558\uAE30
formula.menuname=\uC218\uC2DD
formula_editor=\uC218\uC2DD \uD3B8\uC9D1\uD558\uAE30
ForwardAction.text=\uC55E\uC73C\uB85C
@@ -478,7 +503,7 @@ Freeplane.progress.createInitialMode=\uCD08\uAE30 \uBAA8\uB4DC \uC0DD\uC131...
Freeplane.progress.endStartup=\uC2DC\uC791\uD558\uAE30 \uC885\uB8CC.
Freeplane.progress.gettingPreferenceDirectories=\uC124\uC815 \uB514\uB809\uD1A0\uB9AC \uAC00\uC838\uC624\uAE30...
Freeplane.progress.gettingPreferences=\uC124\uC815\uAC12 \uAC00\uC838\uC624\uAE30...
-Freeplane.progress.loadMaps=\uB9F5 \uBD88\uB7EC\uC624\uAE30...
+Freeplane.progress.loadMaps=\uC9C0\uB3C4 \uBD88\uB7EC\uC624\uAE30...
Freeplane.progress.propagateLookAndFeel=\uC2A4\uD0A8 \uC804\uB2EC...
Freeplane.progress.settingPreferences=\uC124\uC815\uAC12 \uC801\uC6A9\uD558\uAE30...
Freeplane.progress.startCreateController=\uCEE8\uD2B8\uB864\uB7EC \uC0DD\uC131 \uC2DC\uC791...
@@ -487,6 +512,7 @@ freeplane_reverted=Freeplane_Reverted_
FreeplaneHelpStarter.text=\uC628\uB77C\uC778 \uB3C4\uC6C0\uB9D0...
FreeplaneHelpStarter.tooltip=\uD504\uB9AC\uD50C\uB808\uC778 \uD655\uC7A5 \uB3C4\uC6C0\uB9D0
GettingStartedAction.text=\uC790\uC2B5\uC11C
+goto=\uAC00\uAE30
GotoLinkNodeAction.text=\uB9C1\uD06C\uB85C \uAC00\uAE30
GotoNodeAction.text=ID\uB85C \uB178\uB4DC \uC120\uD0DD...
GrabKeyDialog.common.cancel=\uCDE8\uC18C
@@ -590,7 +616,7 @@ icon_male2=\uB0A8\uC7902
icon_males=\uB0A8\uC790\uB4E4
icon_menu=\uC544\uC774\uCF58
icon_messagebox_warning=\uC911\uC694
-icon_mindmap=\uB9C8\uC778\uB4DC\uB9F5
+icon_mindmap=\uB9C8\uC778\uB4DC \uC9C0\uB3C4
icon_multiplication=\uACF1\uC148
icon_narrative=\uC774\uC57C\uAE30
icon_negative=\uBD80\uC815
@@ -642,19 +668,20 @@ IconProgressIconUpAction.text=\uC9C4\uD589\uB960?? \uC704\uB85C
IconProgressIconUpAction.tooltip=\uC9C4\uD589 \uC544\uC774\uCF58\uC744 \uC99D\uAC00/\uCD94\uAC00 \uD569\uB2C8\uB2E4. (0% -> 25% -> 50% -> 75% -> 100% + \uD655\uC778).
IconProgressRemoveAction.text=\uC9C4\uD589\uB960 \uC81C\uAC70
IconProgressRemoveAction.tooltip=\uC9C4\uD589 \uC544\uC774\uCF58 \uBC0F \uD655\uC7A5\uB41C \uC9C4\uD589 \uC544\uC774\uCF58\uC744 \uC81C\uAC70\uD569\uB2C8\uB2E4.
+icons=\uC544\uC774\uCF58
IconSelectionPlugin.text=\uC544\uC774\uCF58 \uC120\uD0DD...
IconSelectionPlugin.tooltip=<html>\uBCC4\uB3C4\uC758 \uCC3D\uC5D0\uC11C \uC544\uC774\uCF58\uC744 \uC120\uD0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.</html>
image_covertLink=\uB9C1\uD06C\uB97C \uC774\uBBF8\uC9C0\uB85C \uBCC0\uD658
ImageFlavorHandler=\uC774\uBBF8\uC9C0 (use separate file)
-import=\uAC00\uC838\uC624\uAE30
+import=\uAC00\uC838\uC624\uAE30(&M)
import_linked_branch_no_link=\uC120\uD0DD\uD55C \uB178\uB4DC\uC5D0\uB294 \uAC00\uC838\uC62C \uB9C1\uD06C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
-ImportAction.text=\uB9F5 \uAC00\uC838\uC624\uAE30(&I)
-ImportBranchAction.text=\uAC00\uC9C0(&B)...
+ImportAction.text=\uC9C0\uB3C4 \uAC00\uC838\uC624\uAE30(&I)
+ImportBranchAction.text=\uAC00\uC9C0(B)...
ImportExplorerFavoritesAction.text=\uC990\uACA8\uCC3E\uAE30 \uD0D0\uC0C9(&E)...
-ImportFolderStructureAction.text=\uD3F4\uB354 \uAD6C\uC870(&F)...
+ImportFolderStructureAction.text=\uD3F4\uB354 \uAD6C\uC870(F)...
ImportLinkedBranchAction.text=\uC5F0\uACB0\uB41C \uAC00\uC9C0(&L)
ImportLinkedBranchWithoutRootAction.text=\uCD5C\uC0C1\uC704 \uB178\uB4DC \uC81C\uC678 \uC5F0\uACB0\uB41C \uAC00\uC9C0(&W)...
-ImportMindmanagerFiles.text=&MindManager X5 \uD615\uD0DC\uC758 \uB9F5...
+ImportMindmanagerFiles.text=MindManager X5 \uD615\uD0DC\uC758 \uC9C0\uB3C4...
increase_branch_font_size=\uB354 \uD070 \uAE00\uAF34
IncreaseNodeFontAction.text=\uB354 \uD070 \uAE00\uAF34
internal_error_tooltip=\uB0B4\uBD80 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uC815\uBCF4\uB97C \uD655\uC778\uD558\uAE30 \uC704\uD574 \uCD5C\uC2E0 \uB85C\uADF8\uD30C\uC77C log.0\uB97C \uC5F4\uB824\uBA74 \uD074\uB9AD\uD558\uC138\uC694.
@@ -666,29 +693,36 @@ invalid_url_msg={0}\uC5D0 \uB300\uD55C \uC720\uD6A8\uD55C URL\uC744 \uC0DD\uC131
ItalicAction.text=\uAE30\uC6B8\uC784
italicise_branch=\uAE30\uC6B8\uC774\uAE30
java_version=\uC790\uBC14 \uBC84\uC804: {0}
-JoinNodesAction.text=\uB178\uB4DC \uD569\uCE58\uAE30
+lastOpenedMaps=\uAC00\uC7A5 \uCD5C\uADFC \uC9C0\uB3C4
latex_editor=LaTeX \uC218\uC2DD \uD3B8\uC9D1
-LatexDeleteLatexAction.text=LaTe&X \uC218\uC2DD \uC81C\uAC70
-LatexEditLatexAction.text=&LaTeX \uC218\uC2DD \uD3B8\uC9D1...
+LatexDeleteLatexAction.text=LaTeX \uC218\uC2DD \uC81C\uAC70
+LatexEditLatexAction.text=LaTeX \uC218\uC2DD \uD3B8\uC9D1...
LatexInsertLatexAction.msg1=<html><i>\uAE30\uC874\uC758</i> LaTeX \uC218\uC2DD\uC744 \uC0BD\uC785\uD558\uB824\uACE0 \uD569\uB2C8\uB2E4.<br/>LaTeX\uC758 \uAE00\uC790/\uC218\uC2DD\uC744 \uB9CC\uB4E4 \uC218 \uC788\uB294 \uC0C8\uB85C\uC6B4 \uBC29\uBC95\uC774 \uC774 \uD398\uC774\uC9C0\uC5D0 \uC124\uBA85\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4:</html>
-LatexInsertLatexAction.msg2=<html>\uD55C\uB9C8\uB514\uB85C: <ul><li>\uB178\uB4DC\uC758 \uAE00\uC790\uC5D0 \uC811\uB450\uC5B4 "\\latex"\uB97C \uC785\uB825\uD558\uAC70\uB098</li><li><i>\uBCF4\uAE30->\uC18D\uC131 \uD328\uB110</i>\uC5D0\uC11C, \uB2E4\uC74C <i>\uD575\uC2EC \uAE00\uC790 -> \uD615\uC2DD -> \uB77C\uD14D\uC2A4</i></li></ul></html>
-LatexInsertLatexAction.text=&LaTeX \uC218\uC2DD \uCD94\uAC00...
-latexPatternFormat=\uB77C\uD14D\uC2A4
+LatexInsertLatexAction.msg2=<html>\uD55C\uB9C8\uB514\uB85C: <ul><li>\uB178\uB4DC\uC758 \uAE00\uC790\uC5D0 \uC811\uB450\uC5B4 "\\latex"\uB97C \uC785\uB825\uD558\uAC70\uB098</li><li><i>\uBCF4\uAE30->\uC18D\uC131 \uD328\uB110</i>\uC5D0\uC11C, \uB2E4\uC74C <i>\uD575\uC2EC \uAE00\uC790 -> \uD615\uC2DD -> Latex</i></li></ul></html>
+LatexInsertLatexAction.text=LaTeX \uC218\uC2DD \uCD94\uAC00...
+latexPatternFormat=LaTeX
+LengthUnits.cm=\uC13C\uD2F0\uBBF8\uD130
+LengthUnits.in=\uC778\uCE58
+LengthUnits.mm=\uBC00\uB9AC\uBBF8\uD130
+LengthUnits.pt=\uD3EC\uC778\uD2B8
+LengthUnits.px=\uD53D\uC140
less_than_two_selected_nodes=\uC5F0\uACB0\uD558\uB824\uBA74 \uB178\uB4DC\uAC00 2\uAC1C \uC774\uC0C1 \uC120\uD0DD\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4.
license=\uB77C\uC774\uC13C\uC2A4: GPL 2 \uB610\uB294 \uC774\uD6C4
license_text=<html> \uC774 \uD504\uB85C\uADF8\uB7A8\uC740 \uC790\uC720 \uC18C\uD504\uD2B8\uC6E8\uC5B4\uC785\uB2C8\uB2E4.<br> \uB2F9\uC2E0\uC740 \uC790\uC720 \uC18C\uD504\uD2B8\uC6E8\uC5B4 \uC7AC\uB2E8\uC774 \uBC1C\uD45C\uD55C GNU \uC77C\uBC18 \uACF5\uC911 \uC0AC\uC6A9 \uD5C8\uAC00\uC11C \uBC84\uC804 2\uB098<br> \uADF8 \uC774\uD6C4 \uBC84\uC804\uC5D0 \uB530\uB77C \uC774 \uD30C\uC77C\uC744 \uC7AC\uBC30\uD3EC\uD558\uAC70\uB098 \uC218\uC815\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.<br><br>\uC77 [...]
link_error=\uC798\uBABB\uB41C \uB9C1\uD06C "{0}"\uC740(\uB294) \uBD88\uB7EC\uC624\uC9C0 \uC54A\uC74C
link_not_available_any_more=\uC5F0\uACB0\uB418\uC5C8\uB358 \uB178\uB4DC\uAC00 \uC0AD\uC81C\uB418\uC5C8\uC73C\uBBC0\uB85C \uC774 \uB9C1\uD06C\uB294 \uB354\uC774\uC0C1 \uC720\uD6A8\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
link_not_found={0} \uB9C1\uD06C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
+links=\uB9C1\uD06C
load=\uBD88\uB7EC\uC624\uAE30(&L)
load_accelerator_presets=\uBD88\uB7EC\uC624\uAE30
LoadAcceleratorPresetsAction.textPatterns.text=\uAE00\uC790 \uD328\uD134
-locking_failed_by_open={0} \uB9F5\uC758 \uC7A0\uAE08 \uC791\uC5C5\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC77D\uAE30 \uC804\uC6A9 \uBAA8\uB4DC\uB85C \uC5F4\uB9BD\uB2C8\uB2E4.
-locking_failed_by_save_as={0} \uB9F5\uC758 \uC7A0\uAE08 \uC791\uC5C5\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uBCC4\uB3C4\uB85C \uC800\uC7A5 \uC791\uC5C5\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
-locking_old_lock_removed={0} \uB9F5\uC740 \uC0AC\uC6A9\uC790 {1}\uC5D0 \uC758\uD574 \uC7A0\uACA8 \uC788\uC5C8\uC2B5\uB2C8\uB2E4. \uC2DC\uAC04\uC774 \uC624\uB798 \uC9C0\uB0AC\uC73C\uBBC0\uB85C \uC7A0\uAE08\uC744 \uD574\uC81C\uD558\uC600\uC2B5\uB2C8\uB2E4.
+locking_failed_by_open={0} \uC9C0\uB3C4 \uC7A0\uAE08\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC77D\uAE30 \uC804\uC6A9\uC73C\uB85C \uC5F4\uB9BD\uB2C8\uB2E4.
+locking_failed_by_save_as={0} \uC9C0\uB3C4 \uC7A0\uAE08\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uB2E4\uB978\uC774\uB984\uC73C\uB85C \uC800\uC7A5 \uB3D9\uC791\uC774 \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+locking_old_lock_removed={0} \uC9C0\uB3C4\uB294 {1} \uC0AC\uC6A9\uC790\uC5D0 \uC758\uD574 \uC7A0\uACA8 \uC788\uC5C8\uC2B5\uB2C8\uB2E4. \uC2DC\uAC04\uC774 \uC624\uB798 \uC9C0\uB0AC\uC73C\uBBC0\uB85C \uC7A0\uAE08\uC744 \uD574\uC81C\uD558\uC600\uC2B5\uB2C8\uB2E4.
long_node_changed_cancel=\uC218\uC815\uB0B4\uC6A9\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uBC14\uB010\uB0B4\uC6A9\uC744 \uC800\uC7A5\uD558\uC9C0 \uC54A\uACA0\uC2B5\uB2C8\uAE4C?
long_node_changed_submit=\uB178\uB4DC\uAC00 \uBC14\uB00C\uC5C8\uC2B5\uB2C8\uB2E4. \uBC14\uB010\uAC83\uC744 \uC800\uC7A5\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
lots_of_links_warning=\uAC19\uC740 \uB2E8\uACC4\uC758 \uB178\uB4DC\uAC04\uC5D0 \uB108\uBB34 \uB9CE\uC740 \uB9C1\uD06C\uB97C \uC0DD\uC131\uD558\uB824\uACE0 \uD569\uB2C8\uB2E4. \uC774 \uB9C1\uD06C\uB97C \uC815\uB9D0 \uC0DD\uC131\uD560\uAE4C\uC694?
+main_menu=\uCC28\uB9BC\uD45C
main_resource_directory=\uC124\uCE58 \uC790\uC6D0:{0}
MainView.errorUpdateText=\uB2E4\uC74C\uACFC \uAC19\uC740 \uC785\uB825\uC744 \uC704\uD55C \uD14D\uC2A4\uD2B8\uB97C \uC124\uC815\uD558\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4: {0}.
MakeLinkFromAnchorAction.text=\uB2FB\uC73C\uB85C\uBD80\uD130 \uB9C1\uD06C \uB9CC\uB4E4\uAE30
@@ -712,7 +746,7 @@ ManageAddOnsDialog.error=\uC124\uCE58 \uC911 \uC624\uB958: {0}.
ManageAddOnsDialog.install=\uC124\uCE58(&I)
ManageAddOnsDialog.install.from.known.location=\uC54C\uB824\uC9C4 \uC704\uCE58\uC5D0\uC11C \uBD80\uAC00 \uAE30\uB2A5 \uC124\uCE58
ManageAddOnsDialog.install.tooltip=\uC5EC\uAE30\uC5D0 \uBD80\uAC00 \uAE30\uB2A5 \uC124\uCE58 \uD30C\uC77C\uC758 URL\uC744 \uC0BD\uC785
-ManageAddOnsDialog.map.not.opened={0} \uB9F5\uC740 \uC5F4\uB824 \uC788\uC9C0 \uC54A\uC740 \uAC83 \uAC19\uC2B5\uB2C8\uB2E4.
+ManageAddOnsDialog.map.not.opened={0} \uC9C0\uB3C4\uAC00 \uC5F4\uB824 \uC788\uC9C0 \uC54A\uC740 \uAC83 \uAC19\uC2B5\uB2C8\uB2E4.
ManageAddOnsDialog.really.deinstall=\uC815\uB9D0\uB85C {0}\uC744(\uB97C) \uC81C\uAC70\uD560\uAE4C\uC694?
ManageAddOnsDialog.search=\uBD80\uAC00 \uAE30\uB2A5 \uAC80\uC0C9
ManageAddOnsDialog.search.file=\uAC80\uC0C9
@@ -727,17 +761,22 @@ ManageAddOnsDialog.tab.manage.themes=\uD14C\uB9C8
ManageAddOnsDialog.tab.manage.themes.tooltip=\uC124\uCE58\uB41C \uD14C\uB9C8 \uAD00\uB9AC
ManageAddOnsDialog.tab.manage.tooltip=\uC124\uCE58\uB41C \uBD80\uAC00 \uAE30\uB2A5 \uAD00\uB9AC
ManageAddOnsDialog.visit.addon.page=\uBD80\uAC00 \uAE30\uB2A5 \uD398\uC774\uC9C0 \uBC29\uBB38...
-ManageConditionalStylesAction.text=\uB9F5\uC758 \uC870\uAC74\uBCC4 \uC2A4\uD0C0\uC77C \uAD00\uB9AC(&M)
-ManageNodeConditionalStylesAction.text=\uB178\uB4DC\uC758 \uC870\uAC74\uBCC4 \uC2A4\uD0C0\uC77C \uAD00\uB9AC(&A)
-map_already_exists=\uC774 \uB9F5\uC740 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4. \uB36E\uC5B4\uC4F8\uAE4C\uC694?
-map_corrupted=\uB9F5\uC774 \uC190\uC0C1\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC744 \uBCF4\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
-map_load_error={0} \uB9F5\uC744 \uBD88\uB7EC\uC62C \uC218 \uC5C6\uC74C
-map_locked_by_open={0} \uB9F5\uC740 \uC774\uBBF8 \uC0AC\uC6A9\uC790 {1}\uC5D0 \uC758\uD574 \uD3B8\uC9D1\uB418\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uC77D\uAE30 \uC804\uC6A9\uC73C\uB85C \uC5F4\uB9BD\uB2C8\uB2E4.
-map_locked_by_save_as={0} \uB9F5\uC740 \uC0AC\uC6A9\uC790 {1}\uC5D0 \uC758\uD574 \uD3B8\uC9D1\uB418\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uBCC4\uB3C4 \uC800\uC7A5 \uC791\uC5C5\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
-map_not_saved=\uC774\uC804\uC5D0 \uC800\uC7A5\uB41C \uC801\uC774 \uC5C6\uB294 \uB9F5\uC785\uB2C8\uB2E4.
-MapBackgroundColorAction.text=\uB9F5 \uBC30\uACBD\uC0C9
+ManageConditionalStylesAction.text=\uC9C0\uB3C4\uC758 \uC870\uAC74\uBCC4 \uAF34 \uAD00\uB9AC(&M)
+ManageNodeConditionalStylesAction.text=\uB178\uB4DC\uC758 \uC870\uAC74\uBCC4 \uAF34 \uAD00\uB9AC(&A)
+map_already_exists=\uC774 \uC9C0\uB3C4\uB294 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4. \uB36E\uC5B4\uC4F0\uACA0\uC2B5\uB2C8\uAE4C?
+map_background=\uC9C0\uB3C4 \uBC30\uACBD
+map_background_image=\uBC30\uACBD \uADF8\uB9BC
+map_corrupted=\uC9C0\uB3C4\uAC00 \uC190\uC0C1\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC744 \uBCF4\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
+map_load_error={0} \uC9C0\uB3C4\uB97C \uBD88\uB7EC\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4
+map_locked_by_open={0} \uC9C0\uB3C4\uB294 \uC774\uBBF8 {1} \uC0AC\uC6A9\uC790\uC5D0 \uC758\uD574 \uD3B8\uC9D1\uB418\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uC77D\uAE30 \uC804\uC6A9\uC73C\uB85C \uC5F4\uB9BD\uB2C8\uB2E4.
+map_locked_by_save_as={0} \uC9C0\uB3C4\uB294 {1} \uC0AC\uC6A9\uC790\uC5D0 \uC758\uD574 \uD3B8\uC9D1\uB418\uACE0 \uC788\uC2B5\uB2C8\uB2E4. \uB2E4\uB978\uC774\uB984\uC73C\uB85C \uC800\uC7A5 \uC791\uC5C5\uC774 \uC911\uB2E8\uB418\uC5C8\uC2B5\uB2C8\uB2E4.
+map_not_saved=\uC774\uC804\uC5D0 \uC800\uC7A5\uB41C \uC801\uC774 \uC5C6\uB294 \uC9C0\uB3C4\uC785\uB2C8\uB2E4.
+MapBackgroundClearAction.text=\uC9C0\uC6B0\uAE30
+MapBackgroundColorAction.text=\uBC30\uACBD\uC0C9
+MapBackgroundImageAction.text=\uBC30\uACBD \uADF8\uB9BC...
+maps=\uC9C0\uB3C4
MaxNodeWidth.text=\uCD5C\uB300 \uB178\uB4DC \uB113\uC774 \uC124\uC815
-menu_applyStyle=\uC2A4\uD0C0\uC77C \uC801\uC6A9
+menu_applyStyle=\uAF34 \uC801\uC6A9
menu_attributes=\uC18D\uC131(&A)
menu_clouds=\uAD6C\uB984
menu_copy=\uBCA0\uAEF4\uB450\uAE30
@@ -747,10 +786,6 @@ menu_displayAttributes=\uB178\uB4DC \uC18D\uC131
menu_encryption=\uC554\uD638 \uBCF4\uD638
menu_error=\uC0AC\uC6A9\uC790 \uC815\uC758\uB41C \uBA54\uB274 \uAD6C\uC870\uC758 \uC624\uB958:{0}\n{1}\n\uC911\uB2E8
menu_extensions=\uB178\uB4DC \uD655\uC7A5 \uAE30\uB2A5
-menu_extras=\uB3C4\uAD6C(&T)
-menu_file_import=\uAC00\uC838\uC624\uAE30(&M)
-menu_filter=\uD544\uD130(&I)
-menu_format=\uBAA8\uC591
menu_group=\uB178\uB4DC \uADF8\uB8F9
menu_hoverView=\uB3C4\uAD6C \uD301
menu_iconByCategory=\uBD84\uB958\uBCC4 \uC544\uC774\uCF58...
@@ -758,52 +793,49 @@ menu_iconView=\uC544\uC774\uCF58
menu_image=\uC774\uBBF8\uC9C0
menu_insert=\uC0BD\uC785(&S)
menu_latex_formula=LaTeX \uC218\uC2DD
-menu_links=\uB9C1\uD06C
-menu_manageStyles=\uC2A4\uD0C0\uC77C \uAD00\uB9AC(&M)
+menu_manageStyles=\uAF34 \uAD00\uB9AC(&M)
menu_moveNode=\uC774\uB3D9 \uBC0F \uC815\uB82C
-menu_navigate=\uD0D0\uC0C9(&N)
menu_newNode=\uC0C8\uB85C\uC6B4 \uB178\uB4DC
menu_node=\uB178\uB4DC
menu_node_features=\uB178\uB4DC \uC678\uD615(&U)
menu_nodes=\uB178\uB4DC(&N)
menu_nodeView=\uB178\uB4DC \uD45C\uC81C
-menu_notes=\uBA54\uBAA8
menu_noteView=\uB178\uD2B8
-menu_openmaps=\uB9F5
-menu_progress=\uC9C4\uD589\uC728 \uC544\uC774\uCF58 (%)
+menu_openmaps=\uC9C0\uB3C4
menu_remove_icons=\uC544\uC774\uCF58 \uC81C\uAC70
menu_removeAttribute=\uC18D\uC131 \uC81C\uAC70
menu_select=\uC120\uD0DD
menu_time=\uC2DC\uAC04 \uAD00\uB9AC
menu_title=\uB178\uB4DC \uD45C\uC81C
-menu_toolbars=\uB3C4\uAD6C \uC0C1\uC790
-menu_view=\uBCF4\uAE30(&V)
menu_viewmode=\uBCF4\uAE30 \uBAA8\uB4DC \uC124\uC815
MenuUtils.invalid_menuitem={0} \uC740 \uC720\uD6A8\uD55C \uBA54\uB274 \uD56D\uBAA9 \uD0A4\uAC00 \uC544\uB2D9\uB2C8\uB2E4.
-mindmap=\uB9F5
+mindmap=\uC9C0\uB3C4
MindMapNodesFlavorHandler=\uB178\uB4DC \uB2E8\uACC4\uBCC4 \uAD6C\uC870
-mindmaps=\uB9F5(&M)
-mindmaps_desc=\uB9F5 (*.mm)
-mindmaps_filter_desc=\uD544\uD130 (*.mmfilter)
+mindmaps=\uC9C0\uB3C4(&M)
+mindmaps_desc=\uC9C0\uB3C4 (*.mm)
+mindmaps_filter_desc=\uAC70\uB984\uAE30 (*.mmfilter)
MinNodeWidth.text=\uCD5C\uC18C \uB178\uB4DC \uB113\uC774 \uC124\uC815
mode_Browse=\uBCF4\uAE30 \uBAA8\uB4DC
mode_File=\uD30C\uC77C \uBAA8\uB4DC
-mode_MindMap=\uB9C8\uC778\uB4DC\uB9F5 \uBAA8\uB4DC
+mode_MindMap=\uB9C8\uC778\uB4DC \uC9C0\uB3C4 \uBAA8\uB4DC
mode_na=\uBAA8\uB4DC \uC0AC\uC6A9 \uBD88\uAC00
mode_status={0} \uBAA8\uB4DC\uB85C \uC804\uD658\uB428
+mode_StyleMap=\uAF34 \uD3B8\uC9D1
mode_title=\uD504\uB9AC\uD50C\uB808\uC778 - {0}
modes=\uBAA8\uB4DC
-ModesMenuAction.Browse.text=\uB9F5 \uCC3E\uC544\uBCF4\uAE30
+ModesMenuAction.Browse.text=\uC9C0\uB3C4 \uCC3E\uC544\uBCF4\uAE30
ModesMenuAction.File.text=\uD30C\uC77C \uD0D0\uC0C9\uAE30
-ModesMenuAction.MindMap.text=\uB9C8\uC778\uB4DC\uB9F5 \uD3B8\uC9D1\uAE30
-most_recent_files=\uCD5C\uADFC \uB9F5
+ModesMenuAction.MindMap.text=\uB9C8\uC778\uB4DC \uC9C0\uB3C4 \uD3B8\uC9D1\uAE30
+most_recent_files=\uAC00\uC7A5 \uCD5C\uADFC \uC9C0\uB3C4
+MoveAction.text=\uC774\uB3D9
MoveToRootAction.text=\uCD5C\uC0C1\uC704 \uB178\uB4DC\uB85C \uAC00\uAE30
NameConditionAction.text=\uC774\uB984 \uC9C0\uC815
-NavigationNextMapAction.text=\uB2E4\uC74C \uB9F5
-NavigationPreviousMapAction.text=\uC774\uC804 \uB9F5
+navigate=\uD0D0\uC0C9(&N)
+NavigationNextMapAction.text=\uB2E4\uC74C \uC9C0\uB3C4
+NavigationPreviousMapAction.text=\uC774\uC804 \uC9C0\uB3C4
new=\uC0C8\uB85C \uB9CC\uB4E4\uAE30(&N)
-new_map_from_user_templates.text=\uC11C\uC2DD\uC5D0\uC11C \uC0C8\uB85C\uC6B4 \uB9F5 \uC791\uC131(&T)...
-new_mindmap=\uC0C8\uB85C\uC6B4 \uB9C8\uC778\uB4DC\uC9C0\uB3C4
+new_map_from_user_templates.text=\uC11C\uC2DD\uC5D0\uC11C \uC0C8\uB85C\uC6B4 \uC9C0\uB3C4 \uC791\uC131(&T)...
+new_mindmap=\uC0C8\uB85C\uC6B4 \uB9C8\uC778\uB4DC \uC9C0\uB3C4
new_node=\uC0C8\uB85C\uC6B4 \uB178\uB4DC
new_node_as_sibling_not_possible_for_the_root=\uCD5C\uC0C1\uC704 \uB178\uB4DC\uC5D0\uC11C\uB294 \uD615\uC81C \uB178\uB4DC\uB97C \uC0C8\uB85C \uB9CC\uB4E4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4
new_version_available=\uC0C8\uB85C\uC6B4 \uBC84\uC804 ''{0}'' \uC774 \uB098\uC654\uC2B5\uB2C8\uB2E4
@@ -819,18 +851,17 @@ NewerFileRevisionsFoundDialog.question={0}\uAC1C\uC758 \uCD5C\uC2E0 \uAC1C\uC815
NewerFileRevisionsFoundDialog.restore=\uB418\uB3CC\uB9AC\uAE30(&o)
NewerFileRevisionsFoundDialog.restore.tooltip={0}\uC744 {1}(\uC73C)\uB85C \uB300\uCCB4
NewerFileRevisionsFoundDialog.title=\uCD5C\uADFC \uD30C\uC77C \uBC84\uC804\uC774 \uBC1C\uACAC\uB418\uC5C8\uC2B5\uB2C8\uB2E4!
-NewFreeNodeAction.text=\uC0C8\uB85C\uC6B4 \uC790\uC720 \uB178\uB4DC
-NewLevelStyleAction.text=\uB2E8\uACC4\uBCC4 \uC2A4\uD0C0\uC77C \uCD94\uAC00
+NewLevelStyleAction.text=\uB2E8\uACC4\uBCC4 \uAF34 \uCD94\uAC00
newmap.install.addon.question={0} \uC740 \uBD80\uAC00 \uAE30\uB2A5 \uAFB8\uB7EC\uBBF8 \uAC19\uC2B5\uB2C8\uB2E4.\n \uC124\uCE58\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?\n("\uC544\uB2C8\uC624" \uC120\uD0DD\uC2DC \uC77C\uBC18 \uC5F4\uAE30.)
newmap.install.addon.title=\uBD80\uAC00 \uAE30\uB2A5\uC744 \uC124\uCE58\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
-NewMapAction.text=\uC0C8\uB85C\uC6B4 \uB9F5(&N)
-NewMapViewAction.text=\uC0C8\uB85C\uC6B4 \uB9F5 \uC8FC\uC2DC\uC810
+NewMapAction.text=\uC0C8\uB85C\uC6B4 \uC9C0\uB3C4(&N)
+NewMapViewAction.text=\uC0C8\uB85C\uC6B4 \uC9C0\uB3C4 \uBCF4\uAE30
NewParentNode.text=\uC0C8\uB85C\uC6B4 \uC0C1\uC704 \uB178\uB4DC
NewParentNode.tooltip=<html>\uC120\uD0DD\uD55C \uBAA8\uB4E0 \uD56D\uBAA9\uC774 \uC0C8\uB85C\uC6B4 \uC0C1\uC704 \uB178\uB4DC\uB85C \uBCF4\uB0B4\uC9D1\uB2C8\uB2E4.</html>
NewPreviousSiblingAction.text=\uC0C8\uB85C\uC6B4 \uC190\uC704 \uD615\uC81C \uB178\uB4DC
NewSiblingAction.text=\uC0C8\uB85C\uC6B4 \uC190\uC544\uB798 \uD615\uC81C \uB178\uB4DC
NewSummaryAction.text=\uC0C8 \uC694\uC57D \uB178\uB4DC(\uC120\uD0DD\uD55C \uB178\uB4DC\uB4E4)
-NewUserStyleAction.text=\uC120\uD0DD\uC5D0\uC11C \uC0C8 \uC2A4\uD0C0\uC77C
+NewUserStyleAction.text=\uC120\uD0DD\uC5D0\uC11C \uC0C8\uB85C\uC6B4 \uAF34
NextNodeAction.BACK.text=\uC774\uC804 \uB178\uB4DC\uB85C \uAC00\uAE30
NextNodeAction.BACK_N_FOLD.text=\uC774\uC804 \uB178\uB4DC \uC774\uB3D9 (\uC811\uD798)
NextNodeAction.FORWARD.text=\uB2E4\uC74C \uB178\uB4DC\uB85C \uAC00\uAE30
@@ -843,14 +874,15 @@ no_format_copy_before_format_paste=\uBAA8\uC591\uC744 \uBCF5\uC0AC\uD558\uAE30 \
no_found_from=<html>"{1}"\uC5D0\uC11C <u>{0}</u>\uC744(\uB97C) \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.</html>
no_more_found_from=<html>"{1}"\uC5D0\uC11C \uB354 \uC774\uC0C1 <u>{0}</u>\uC744 \uBC1C\uACAC\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.</html>
no_previous_find=\uC774\uC804\uC5D0\uC11C \uB354\uC774\uC0C1 \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4.
-no_styles_found_in_map=\uB9F5\uC5D0\uC11C \uC2A4\uD0C0\uC77C\uC774 \uBC1C\uACAC\uB418\uC9C0 \uC54A\uC74C
+no_styles_found_in_map=\uC9C0\uB3C4\uC5D0\uC11C \uAF34\uC774 \uBC1C\uACAC\uB418\uC9C0 \uC54A\uC74C
node=\uB178\uB4DC
node_changed_discard_changes=\uC218\uC815\uB0B4\uC6A9\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uBC14\uB010\uB0B4\uC6A9\uC744 \uC800\uC7A5\uD558\uC9C0 \uC54A\uACA0\uC2B5\uB2C8\uAE4C?
node_is_write_protected=\uB300\uC0C1 \uB178\uB4DC\uB294 \uC4F0\uAE30 \uBC29\uC9C0\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4.
node_location_help=\uB4DC\uB798\uADF8\uB294 \uB178\uB4DC\uC758 \uC704\uCE58\uB97C \uBC14\uAFB8\uACE0, \uCEE8\uD2B8\uB864 + \uB4DC\uB798\uADF8 \uAC70\uB9AC\uB97C \uBC14\uAFB8\uACE0, "\uB354\uBE14 \uD074\uB9AD"\uACFC \uCEE8\uD2B8\uB864+"\uB354\uBE14 \uD074\uB9AD"\uC740 \uADF8\uAC83\uB4E4\uC744 \uB2E4\uC2DC \uC124\uC815\uD569\uB2C8\uB2E4.
+node_popup_scripting=\uC2A4\uD06C\uB9BD\uD2B8
node_selector=\uB178\uB4DC \uC120\uD0DD
node_selector_message=\uB354\uBE14 \uD074\uB9AD\uD558\uC5EC \uB178\uB4DC \uC120\uD0DD
-node_styles=\uB178\uB4DC \uC2A4\uD0C0\uC77C
+node_styles=\uB178\uB4DC \uAF34
NodeBackgroundColorAction.text=\uB178\uB4DC \uBC30\uACBD\uC0C9(&N)...
NodeColorAction.text=\uB178\uB4DC \uC0C9\uC0C1...
NodeColorBlendAction.text=\uC0C9\uC0C1 \uD63C\uD569
@@ -858,28 +890,32 @@ NodeDownAction.text=\uB178\uB4DC \uC774\uB3D9\uD558\uAE30 (\uD615\uC81C \uC544\u
NodeExtensions.EditNodeExtensions=\uB178\uB4DC \uD655\uC7A5 \uAE30\uB2A5 \uD3B8\uC9D1
NodeExtensions.RemoveNodeExtensions=\uB178\uB4DC \uD655\uC7A5 \uAE30\uB2A5 \uC81C\uAC70
NodeListAction.text=\uCC3E\uAE30 \uBC0F \uBC14\uAFB8\uAE30...
-NodeListAction.tooltip=\uBAA8\uB4E0 \uB178\uB4DC\uB97C \uD544\uD130 \uC18D\uC131\uACFC \uD568\uAED8 \uAC80\uC0C9 \uAC00\uB2A5\uD55C \uBAA9\uB85D\uC73C\uB85C \uBCF4\uC5EC\uC90D\uB2C8\uB2E4.
+NodeListAction.tooltip=\uBAA8\uB4E0 \uB178\uB4DC\uB97C \uAC70\uB984\uAE30 \uC18D\uC131\uACFC \uD568\uAED8 \uAC80\uC0C9 \uAC00\uB2A5\uD55C \uBAA9\uB85D\uC73C\uB85C \uBCF4\uC5EC\uC90D\uB2C8\uB2E4.
NodeShapeAction.bubble.text=\uAC70\uD488\uD615\uD0DC\uC758 \uC678\uACFD\uC120(&B)
NodeShapeAction.fork.text=\uC678\uACFD\uC120 \uC5C6\uC560\uAE30(&F)
+NodeShapeAction.narrow_hexagon.text=\uC881\uC740 \uC721\uAC01\uD615
+NodeShapeAction.oval.text=\uD0C0\uC6D0\uD615
+NodeShapeAction.rectangle.text=\uC0AC\uAC01\uD615
+NodeShapeAction.wide_hexagon.text=\uB113\uC740 \uC721\uAC01\uD615
NodeUpAction.text=\uB178\uB4DC \uC774\uB3D9\uD558\uAE30 (\uD615\uC81C \uC704\uB85C)
-NodeWidthAction.text=\uB178\uB4DC \uB113\uC774 \uD55C\uACC4 \uC124\uC815
nonboldify_branch=\uAD75\uC9C0 \uC54A\uAC8C
nonitalicise_branch=\uAE30\uC6B8\uC784 \uD574\uC81C
normal=\uBCF4\uD1B5
-not_saved_for_image_error=\uD30C\uC77C \uC120\uD0DD\uAE30\uB97C \uD1B5\uD574 \uC774\uBBF8\uC9C0\uB97C \uC0BD\uC785\uD558\uAE30 \uC804\uC5D0 \uB9F5\uC774 \uBA3C\uC800 \uC800\uC7A5\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4
-not_saved_for_link_error=\uD30C\uC77C \uC120\uD0DD\uAE30\uB97C \uD1B5\uD574 \uB9C1\uD06C\uB97C \uC124\uC815\uD558\uAE30 \uC804\uC5D0 \uB9F5\uC774 \uBA3C\uC800 \uC800\uC7A5\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4
+not_saved_for_image_error=\uD30C\uC77C \uC120\uD0DD\uAE30\uB97C \uD1B5\uD574 \uADF8\uB9BC\uC744 \uC0BD\uC785\uD558\uAE30 \uC804\uC5D0 \uC9C0\uB3C4\uAC00 \uBA3C\uC800 \uC800\uC7A5\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4
+not_saved_for_link_error=\uD30C\uC77C \uC120\uD0DD\uAE30\uB97C \uD1B5\uD574 \uACE0\uB9AC\uB97C \uC124\uC815\uD558\uAE30 \uC804\uC5D0 \uC9C0\uB3C4\uAC00 \uBA3C\uC800 \uC800\uC7A5\uB418\uC5B4\uC57C \uD569\uB2C8\uB2E4
note_window_location=\uB178\uD2B8 \uD328\uB110 \uC704\uCE58
+notes=\uBA54\uBAA8
ok=\uD655\uC778(&O)
-OKAction.text=\uD655\uC778(&O)
-OnlineReference.text=\uC628\uB77C\uC778 \uCC38\uACE0\uC11C \uB9F5
-open_asMindMap=\uB9C8\uC778\uB4DC\uB9F5
-OpenAction.text=\uC800\uC7A5\uB41C \uB9F5 \uC5F4\uAE30(&O)...
+OKAction.text=\uD655\uC778(O)
+OnlineReference.text=\uC628\uB77C\uC778 \uCC38\uACE0\uC11C \uC9C0\uB3C4
+open_asMindMap=\uB9C8\uC778\uB4DC \uC9C0\uB3C4
+OpenAction.text=\uC800\uC7A5\uB41C \uC9C0\uB3C4 \uC5F4\uAE30(&O)...
OpenFreeplaneSiteAction.text=\uD504\uB9AC\uD50C\uB808\uC778 \uD648\uD398\uC774\uC9C0
-OpenMapsAddLocation.text=\uC5F4\uB9B0\uB9F5 \uC704\uCE58 \uCD94\uAC00...
-OpenMapsRemoveLocation.text=\uC5F4\uB9B0\uB9F5 \uC704\uCE58 \uC81C\uAC70
-OpenMapsViewLocation.text=\uC5F4\uB9B0\uB9F5 \uC704\uCE58 \uBCF4\uAE30...
+OpenMapsAddLocation.text=\uC5F4\uB9B0 \uC9C0\uB3C4 \uC704\uCE58 \uCD94\uAC00...
+OpenMapsRemoveLocation.text=\uC5F4\uB9B0 \uC9C0\uB3C4 \uC704\uCE58 \uC81C\uAC70
+OpenMapsViewLocation.text=\uC5F4\uB9B0 \uC9C0\uB3C4 \uC704\uCE58 \uBCF4\uAE30...
OpenPathAction.text=\uD30C\uC77C \uC5F4\uAE30
-OpenURLMapAction.text=URL\uB85C\uBD80\uD130 \uB9F5 \uC5F4\uAE30...
+OpenURLMapAction.text=URL\uB85C\uBD80\uD130 \uC9C0\uB3C4 \uC5F4\uAE30...
OpenUserDirAction.text=\uC0AC\uC6A9\uC790 \uB514\uB809\uD1A0\uB9AC \uC5F4\uAE30
option_changes_may_require_restart=\uBCC0\uACBD\uB41C \uC124\uC815\uC744 \uC801\uC6A9\uD558\uB824\uBA74 \uD504\uB9AC\uB9C8\uC778\uB4DC\uB97C \uC7AC\uC2DC\uC791\uD574\uC57C \uD569\uB2C8\uB2E4.
OptionalDontShowMeAgainDialog.cancel=\uC544\uB2C8\uC624(&N)
@@ -892,17 +928,18 @@ OptionPanel.ADD_CHILD=\uD558\uC704 \uB178\uB4DC \uCD94\uAC00
OptionPanel.ADD_SIBLING=\uD615\uC81C \uB178\uB4DC \uCD94\uAC00
OptionPanel.addons=\uBD80\uAC00 \uAE30\uB2A5
OptionPanel.always_fold_all_after_load=\uBAA8\uB450 \uC811\uAE30
-OptionPanel.always_load_last_maps=\uCD5C\uADFC, \uCD5C\uC2E0\uC758 \uB9F5 \uBD88\uB7EC\uC624\uAE30
-OptionPanel.always_load_last_maps.tooltip=\uC704\uC5D0\uC11C \uC124\uC815\uD55C \uC635\uC158\uC5D0 \uD574\uB2F9\uD558\uB294 \uB9C8\uC9C0\uB9C9 \uD30C\uC77C\uC744 \uC5FD\uB2C8\uB2E4. \uC120\uD0DD\uB41C \uB9F5 \uD30C\uC77C\uC744 \uC5F4\uAE30 \uC704\uD574 \uD504\uB9AC\uD50C\uB808\uC778\uB3C4 \uC2DC\uC791\uD569\uB2C8\uB2E4.
+OptionPanel.always_load_last_maps=\uCD5C\uADFC \uC0C8\uB85C\uC6B4 \uC9C0\uB3C4 \uBD88\uB7EC\uC624\uAE30
+OptionPanel.always_load_last_maps.tooltip=\uC704\uC5D0\uC11C \uC124\uC815\uD55C \uC635\uC158\uC5D0 \uD574\uB2F9\uD558\uB294 \uB9C8\uC9C0\uB9C9 \uD30C\uC77C\uC744 \uC5FD\uB2C8\uB2E4. \uC120\uD0DD\uB41C \uC9C0\uB3C4 \uD30C\uC77C\uC744 \uC5F4\uAE30 \uC704\uD574 \uD504\uB9AC\uD50C\uB808\uC778\uB3C4 \uC2DC\uC791\uD569\uB2C8\uB2E4.
OptionPanel.always_save_folding=\uD56D\uC0C1 \uC800\uC7A5
OptionPanel.always_save_folding_state=\uC811\uD78C \uC0C1\uD0DC \uBCC0\uD654\uB97C \uD56D\uC0C1 \uC800\uC7A5
-OptionPanel.always_save_folding_state.tooltip=\uC120\uD0DD\uD588\uC744 \uACBD\uC6B0, \uC811\uAE30 \uB3D9\uC791 \uD558\uB098\uD558\uB098\uAC00 \uB9F5 \uD30C\uC77C\uC744 \uBCC0\uD654\uC2DC\uD0A4\uACE0, \uC800\uC7A5\uC744 \uD558\uB3C4\uB85D \uC54C\uB824\uC90D\uB2C8\uB2E4.
+OptionPanel.always_save_folding_state.tooltip=\uC120\uD0DD\uD588\uC744 \uACBD\uC6B0, \uC811\uAE30 \uB3D9\uC791 \uD558\uB098\uD558\uB098\uAC00 \uC9C0\uB3C4 \uD30C\uC77C\uC744 \uBCC0\uD654\uC2DC\uD0A4\uACE0, \uC800\uC7A5\uC744 \uD558\uB3C4\uB85D \uC54C\uB824\uC90D\uB2C8\uB2E4.
+OptionPanel.always_show_less_than_N_nodes_after_load=\uC77C\uBD80 \uB178\uB4DC \uD3BC\uCE58\uAE30
OptionPanel.always_unfold_all_after_load=\uBAA8\uB450 \uD3BC\uCE58\uAE30
-OptionPanel.antialias=\uC564\uD2F0\uC5D0\uC77C\uB9AC\uC5B4\uC2F1
-OptionPanel.antialias.tooltip=<html>\uB9F5 \uD654\uC9C8\uC744 \uACB0\uC815\uD569\uB2C8\uB2E4. \uC564\uD2F0\uC5D0\uC77C\uB9AC\uC5B4\uC2F1\uC744 \uB9CE\uC774 \uC0AC\uC6A9\uD560 \uC218\uB85D \uC2DC\uAC04\uC774 \uB354 \uAC78\uB9BD\uB2C8\uB2E4.</html>
-OptionPanel.antialias_all=\uBAA8\uB450 \uC564\uD2F0\uC5D0\uC77C\uB9AC\uC5B4\uC2F1
-OptionPanel.antialias_edges=\uC904\uAE30 \uC564\uD2F0\uC5D0\uC77C\uB9AC\uC5B4\uC2F1
-OptionPanel.antialias_none=\uC564\uD2F0\uC5D0\uC77C\uB9AC\uC5B4\uC2F1 \uC0AC\uC6A9 \uC548\uD568
+OptionPanel.antialias=\uC548\uD2F0\uC54C\uB9AC\uC5B4\uC2A4
+OptionPanel.antialias.tooltip=<html>\uC9C0\uB3C4 \uD654\uC9C8\uC744 \uACB0\uC815\uD569\uB2C8\uB2E4. \uC548\uD2F0\uC54C\uB9AC\uC5B4\uC2A4\uB97C \uB9CE\uC774 \uC0AC\uC6A9\uD560 \uC218\uB85D \uC2DC\uAC04\uC774 \uB354 \uAC78\uB9BD\uB2C8\uB2E4.</html>
+OptionPanel.antialias_all=\uBAA8\uB450 \uC548\uD2F0\uC54C\uB9AC\uC5B4\uC2A4 \uC801\uC6A9
+OptionPanel.antialias_edges=\uC904\uAE30 \uC548\uD2F0\uC54C\uB9AC\uC5B4\uC2A4
+OptionPanel.antialias_none=\uC548\uD2F0\uC54C\uB9AC\uC5B4\uC2A4 \uC0AC\uC6A9 \uC548\uD568
OptionPanel.Appearance=\uC0DD\uAE40\uC0C8
OptionPanel.apply_system_screen_resolution=\uC2DC\uC2A4\uD15C \uAE30\uBCF8 \uD574\uC0C1\uB3C4\uB97C \uC801\uC6A9\uD558\uAE30
OptionPanel.approximate_search_threshold=\uADFC\uC811\uD55C \uAC80\uC0C9 \uACB0\uACFC \uD45C\uC2DC \uC784\uACC4\uAC12
@@ -912,7 +949,7 @@ OptionPanel.ARC=\uC6D0\uD638
OptionPanel.as_parent=\uC0C1\uC704 \uB178\uB4DC\uCC98\uB7FC
OptionPanel.ask=\uBB3C\uC5B4\uBCF4\uAE30
OptionPanel.automatic=\uC790\uB3D9\uC120\uD0DD
-OptionPanel.automaticFormat_level=\uC790\uB3D9 \uB808\uC774\uC544\uC6C3 \uC2A4\uD0C0\uC77C
+OptionPanel.automaticFormat_level=\uC790\uB3D9 \uB808\uC774\uC544\uC6C3 \uAF34
OptionPanel.automaticFormat_level1=\uCD5C\uC0C1\uC704 \uB178\uB4DC \uD615\uD0DC
OptionPanel.automaticFormat_level2=1\uB2E8\uACC4 \uB178\uB4DC \uBAA8\uC591
OptionPanel.backup_file_number=\uBCF4\uAD00\uB41C \uBC31\uC5C5\uD30C\uC77C \uAC2F\uC218
@@ -932,8 +969,10 @@ OptionPanel.cloudcolor=\uAD6C\uB984 \uC0C9\uC0C1
OptionPanel.cloudshape=\uAD6C\uB984 \uBAA8\uC591
OptionPanel.combined=\uACB0\uD569
OptionPanel.compare_as_number=\uC218\uCE58\uB85C \uBE44\uAD50
-OptionPanel.convert_to_current_version=<html>\uC790\uB3D9\uC73C\uB85C \uC774\uC804 \uBC84\uC804 \uD504\uB9AC\uD50C\uB808\uC778 \uB9F5\uC744<br>\uD604\uC7AC \uBC84\uC804\uC73C\uB85C \uBCC0\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?</html>
-OptionPanel.convert_to_current_version.tooltip=<html>\uB9E4\uC6B0 \uD070 \uB9F5\uC740 \uBCC0\uD658\uD560 \uD544\uC694\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.<br>(\uC774\uAC83\uC740 \uC804\uBB38\uC9C0\uC2DD\uC785\uB2C8\uB2E4.) \uBCC0\uD658 \uC5C6\uC774\uB3C4 \uB9F5\uC744 \uC5F4 \uC218 \uC788\uC2B5\uB2C8\uB2E4.</html>
+OptionPanel.convert_to_current_version=<html>\uC790\uB3D9\uC73C\uB85C \uC774\uC804 \uBC84\uC804 \uD504\uB9AC\uD50C\uB808\uC778 \uC9C0\uB3C4\uB97C<br>\uD604\uC7AC \uBC84\uC804\uC73C\uB85C \uBCC0\uD658\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?</html>
+OptionPanel.convert_to_current_version.tooltip=<html>\uB9E4\uC6B0 \uD070 \uC9C0\uB3C4\uB294 \uBCC0\uD658\uD560 \uD544\uC694\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.<br>(\uC774\uAC83\uC740 \uC804\uBB38\uC9C0\uC2DD\uC785\uB2C8\uB2E4.) \uBCC0\uD658 \uC5C6\uC774\uB3C4 \uC9C0\uB3C4\uB97C \uC5F4 \uC218 \uC788\uC2B5\uB2C8\uB2E4.</html>
+OptionPanel.copyFormatToNewSibling=\uC0C8\uB85C\uC6B4 \uD615\uC81C\uB85C \uD615\uC2DD \uBCF5\uC0AC
+OptionPanel.copyFormatToNewSiblingIncludesIcons=\uC544\uC774\uCF58\uACFC \uD615\uC2DD \uBCF5\uC0AC
OptionPanel.cs=\uCCB4\uCF54\uC5B4 / \u010Desky
OptionPanel.cut_nodes_without_question=\uD655\uC778\uD558\uC9C0 \uC54A\uACE0 \uB178\uB4DC\uB97C \uC790\uB97C\uAE4C\uC694?
OptionPanel.cut_nodes_without_question.tooltip=\uCCB4\uD06C\uBC15\uC2A4\uB97C \uC124\uC815\uD558\uBA74 \uB178\uB4DC\uB294 \uD655\uC778\uD558\uC9C0 \uC54A\uACE0 \uC798\uB77C\uB0C5\uB2C8\uB2E4. \uC758\uB3C4\uD558\uC9C0 \uC798\uB77C\uB0B4\uB294 \uACBD\uC6B0 \uC815\uBCF4\uB97C \uC190\uC2E4\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
@@ -941,7 +980,7 @@ OptionPanel.da=\uB374\uB9C8\uD06C\uC5B4 / dansk
OptionPanel.date_format=\uD45C\uC900 \uB0A0\uC9DC \uD615\uC2DD
OptionPanel.date_format.tooltip=SHORT, MEDIUM, LONG \uB610\uB294 FULL \uB610\uB294 "MM/dd/yyyy"\uC640 \uAC19\uC740 \uD328\uD134 \uB458\uC911 \uD558\uB098
OptionPanel.datetime_format=\uD45C\uC900 \uB0A0\uC9DC-\uC2DC\uAC04 \uD615\uC2DD
-OptionPanel.datetime_format.tooltip=<datestyle>,<timestyle> (SHORT MEDIUM, LONG \uB610\uB294 FULL \uC2A4\uD0C0\uC77C)\uB610\uB294 "M/d/yyyy hh:mm" \uAC19\uC740 \uC804\uCCB4 \uD328\uD134 \uB458\uC911 \uD558\uB098
+OptionPanel.datetime_format.tooltip=<datestyle>,<timestyle> (SHORT MEDIUM, LONG \uB610\uB294 FULL \uAF34)\uB610\uB294 "M/d/yyyy hh:mm" \uAC19\uC740 \uC804\uCCB4 \uD328\uD134 \uB458\uC911 \uD558\uB098
OptionPanel.de=\uB3C5\uC77C\uC5B4 / Deutsch
OptionPanel.default=\uAE30\uBCF8\uAC12
OptionPanel.default_attribute_key_column_width=\uD45C\uC900 \uC18D\uC131 \uD0A4 \uB113\uC774
@@ -955,6 +994,7 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>Windows\uC758 \uACB
OptionPanel.default_browser_command_windows_nt=Windows NT \uAE30\uBCF8 \uBE0C\uB77C\uC6B0\uC800 \uBA85\uB839\uC5B4
OptionPanel.default_browser_command_windows_nt.tooltip=<html>Windows\uC758 \uACBD\uC6B0 (""\uAE30\uD638\uB294 \uB9C1\uD06C\uB54C\uBB38\uC5D0 \uADF8\uB4E4 URL\uC5D0\uC11C "=" \uB97C \uD544\uC694\uB85C \uD569\uB2C8\uB2E4).</html>
OptionPanel.default_charset=\uBB38\uC790\uC9D1\uD569
+OptionPanel.default_save_dir=\uAE30\uBCF8 \uC800\uC7A5 \uB514\uB809\uD1A0\uB9AC
OptionPanel.Defaults=\uAE30\uBCF8 \uC124\uC815
OptionPanel.delete_automatic_saves_at_exit=\uC885\uB8CC\uC2DC \uC784\uC2DC \uC790\uB3D9\uC800\uC7A5 \uD30C\uC77C \uC0AD\uC81C
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> \uD30C\uC77C\uC774 \uD504\uB9AC\uD50C\uB808\uC778\uC758 \uC815\uC0C1\uC801\uC778 \uC885\uB8CC\uB54C \uC790\uB3D9\uC73C\uB85C \uC0AD\uC81C\uD574\uC57C\uD558\uB294 \uACBD\uC6B0, \uB2E4\uC74C\uACFC\uAC19\uC740 \uBCC0\uC218\uB97C true\uB85C \uC124\uC815\uD558\uC2ED\uC2DC\uC694. </html>
@@ -966,7 +1006,7 @@ OptionPanel.display_inline_editor_for_all_new_nodes=\uBAA8\uB4E0 \uC0C8\uB85C\uC
OptionPanel.display_node_id=\uB178\uB4DC\uC758 ID \uD45C\uC2DC
OptionPanel.edgecolor=\uC904\uAE30 \uC0C9\uC0C1
OptionPanel.edgecolor.tooltip=\uC0C1\uC704 \uB178\uB4DC\uB85C \uAC00\uB294 \uC904\uAE30\uC758 \uC18D\uC131 (\uBAA8\uB4E0 \uD558\uC704 \uB178\uB4DC\uC5D0\uB3C4 \uC801\uC6A9\uB428)
-OptionPanel.edgestyle=\uC904\uAE30 \uC2A4\uD0C0\uC77C
+OptionPanel.edgestyle=\uC904\uAE30 \uAF34
OptionPanel.edgestyle.tooltip=\uC0C1\uC704 \uB178\uB4DC\uB85C \uAC00\uB294 \uC904\uAE30\uC758 \uC18D\uC131 (\uBAA8\uB4E0 \uD558\uC704 \uB178\uB4DC\uC5D0\uB3C4 \uC801\uC6A9\uB428)
OptionPanel.edgewidth=\uC904\uAE30 \uB108\uBE44
OptionPanel.edgewidth.tooltip=\uC0C1\uC704 \uB178\uB4DC\uB85C \uAC00\uB294 \uC904\uAE30\uC758 \uC18D\uC131 (\uBAA8\uB4E0 \uD558\uC704 \uB178\uB4DC\uC5D0\uB3C4 \uC801\uC6A9\uB428)
@@ -977,10 +1017,10 @@ OptionPanel.editor_extra_width.tooltip=<html>\uD14D\uC2A4\uD2B8\uAC00 \uD604\uC7
OptionPanel.el=\uADF8\uB9AC\uC2A4\uC5B4 / \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC
OptionPanel.el__buttons_above=\uC0C1\uB2E8\uC5D0\uC788\uB294 \uBC84\uD2BC
OptionPanel.el__enter_confirms_by_default=\uAE30\uBCF8\uC73C\uB85C \uC785\uB825 \uD655\uC778
-OptionPanel.el__max_default_window_height=\uC708\uB3C4\uC6B0\uCC3D \uCD5C\uB300 \uB192\uC774
-OptionPanel.el__max_default_window_width=\uC708\uB3C4\uC6B0\uCC3D \uCD5C\uB300 \uAC00\uB85C\uAE38\uC774
-OptionPanel.el__min_default_window_height=\uC708\uB3C4\uC6B0\uCC3D \uCD5C\uC18C \uB192\uC774
-OptionPanel.el__min_default_window_width=\uC708\uB3C4\uC6B0\uCC3D \uCD5C\uC18C \uAC00\uB85C\uAE38\uC774
+OptionPanel.el__max_default_window_height=\uAE30\uBCF8 \uCC3D \uCD5C\uB300 \uB192\uC774
+OptionPanel.el__max_default_window_width=\uAE30\uBCF8 \uCC3D \uCD5C\uB300 \uB113\uC774
+OptionPanel.el__min_default_window_height=\uAE30\uBCF8\uCC3D \uCD5C\uC18C \uB192\uC774
+OptionPanel.el__min_default_window_width=\uAE30\uBCF8 \uCC3D \uCD5C\uC18C \uB113\uC774
OptionPanel.el__position_window_below_node=\uC704\uCE58 \uCC3D \uC544\uB798 \uB178\uB4DC
OptionPanel.en=\uC601\uC5B4 / English
OptionPanel.Environment=\uD658\uACBD\uC124\uC815
@@ -1003,6 +1043,7 @@ OptionPanel.export_icons_in_html.tooltip=<html> \uD504\uB9AC\uD50C\uB808\uC778\u
OptionPanel.exported_image_resolution_dpi=\uB0B4\uBCF4\uB0B4\uAE30\uB41C \uC774\uBBF8\uC9C0 \uD574\uC0C1\uB3C4 (DPI\uC5D0\uC11C)
OptionPanel.Files=\uD30C\uC77C
OptionPanel.first=\uCC98\uC74C
+OptionPanel.fit_to_viewport=\uCC3D\uC5D0 \uB9DE\uCD94\uAE30
OptionPanel.fold_on_click_inside=\uD074\uB9AD \uC548\uCABD\uC73C\uB85C \uC811\uAE30
OptionPanel.foldingsymbolwidth=\uC811\uD798 \uD45C\uC2DC \uB108\uBE44
OptionPanel.foldingsymbolwidth.tooltip=<html>\uC811\uD798 \uD45C\uC2DC \uB3D9\uADF8\uB77C\uBBF8\uC758 \uB108\uBE44 \uC9C0\uC815</html>
@@ -1052,23 +1093,23 @@ OptionPanel.language=\uC5B8\uC5B4
OptionPanel.language.tooltip=<html>\uC774 \uD504\uB85C\uADF8\uB7A8\uC5D0\uC11C \uC0AC\uC6A9\uB418\uC5B4\uC57C \uD558\uB294 \uC5B8\uC5B4\uC785\uB2C8\uB2E4. '\uC790\uB3D9'\uC740 \uD604\uC7AC \uC0AC\uC6A9\uC790\uC758 \uC5B8\uC5B4\uB97C \uBD88\uB7EC\uC635\uB2C8\uB2E4.</html>
OptionPanel.last=\uB9C8\uC9C0\uB9C9
OptionPanel.last_opened_list_length=\uC5F4\uC5C8\uB358 \uBB38\uC11C \uBCF4\uAD00 \uAC2F\uC218
-OptionPanel.latex_disable_editor=\uB77C\uD14D\uC2A4 \uAD6C\uBB38 \uAC15\uC870 \uD3B8\uC9D1\uAE30 \uBE44\uD65C\uC131\uD654
-OptionPanel.latex_disable_editor.tooltip=\uB77C\uD14D\uC2A4\uC758 \uD3B8\uC9D1\uAE30\uC5D0 \uBB38\uC81C\uAC00 \uC788\uB294 \uACBD\uC6B0, \uC774 \uC635\uC158\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4
-OptionPanel.latex_editor_font=\uB77C\uD14D\uC2A4 \uAD6C\uBB38 \uAC15\uC870 \uD3B8\uC9D1\uAE30\uC758 \uAE00\uAF34
+OptionPanel.latex_disable_editor=LaTeX \uAD6C\uBB38 \uAC15\uC870 \uD3B8\uC9D1\uAE30 \uBE44\uD65C\uC131\uD654
+OptionPanel.latex_disable_editor.tooltip=LaTeX \uC758 \uD3B8\uC9D1\uAE30\uC5D0 \uBB38\uC81C\uAC00 \uC788\uB294 \uACBD\uC6B0, \uC774 \uC635\uC158\uC744 \uC120\uD0DD\uD569\uB2C8\uB2E4
+OptionPanel.latex_editor_font=LaTeX \uAD6C\uBB38 \uAC15\uC870 \uD3B8\uC9D1\uAE30\uC758 \uAE00\uAF34
OptionPanel.latex_editor_font.tooltip=\uC720\uB2C8 \uCF54\uB4DC \uBB38\uC790\uAC00 \uD544\uC694\uD55C \uACBD\uC6B0, '\uB300\uD654\uC0C1\uC790' \uB610\uB294 '\uACE0\uC815 \uD3ED'\uC744 \uC0AC\uC6A9\uD558\uC2ED\uC2DC\uC624!
-OptionPanel.latex_editor_font_size=\uB77C\uD14D\uC2A4 \uAD6C\uBB38 \uAC15\uC870 \uD3B8\uC9D1\uAE30\uC758 \uAE00\uAF34 \uD06C\uAE30
-OptionPanel.latex_macros=\uACF5\uD1B5 \uB77C\uD14D\uC2A4 \uB9E4\uD06C\uB85C
-OptionPanel.layout_map_on_text_change=\uD3B8\uC9D1 \uB3C4\uC911 \uB9F5 \uBC30\uCE58 \uC124\uC815
+OptionPanel.latex_editor_font_size=LaTeX \uAD6C\uBB38 \uAC15\uC870 \uD3B8\uC9D1\uAE30\uC758 \uAE00\uAF34 \uD06C\uAE30
+OptionPanel.latex_macros=\uACF5\uD1B5 LaTeX \uB9E4\uD06C\uB85C
+OptionPanel.layout_map_on_text_change=\uD3B8\uC9D1 \uB3C4\uC911 \uC9C0\uB3C4 \uBC30\uCE58 \uC124\uC815
OptionPanel.layout_map_on_text_change.tooltip=\uC131\uB2A5 \uD5A5\uC0C1\uC744 \uC704\uD574 \uBE44\uD65C\uC131\uD654
OptionPanel.linear=\uC120\uD615
OptionPanel.links=\uB9C1\uD06C
OptionPanel.links.tooltip=<html>\uC0C1\uB300\uC801 \uB610\uB294 \uC808\uB300\uC801 \uB9C1\uD06C\uC911 \uD558\uB098\uB97C \uC124\uC815\uD558\uAE30</html>
OptionPanel.load_folding=\uBD88\uB7EC\uC624\uB294 \uC989\uC2DC
-OptionPanel.load_folding_from_map_default_fold_all=\uB9F5\uC5D0\uC11C \uBD88\uB7EC\uC624\uAC70\uB098 \uBAA8\uB450 \uC811\uAE30
-OptionPanel.load_folding_from_map_default_unfold_all=\uB9F5\uC5D0\uC11C \uBD88\uB7EC\uC624\uAC70\uB098 \uBAA8\uB450 \uD3BC\uCE58\uAE30
-OptionPanel.load_last_map=\uCD5C\uADFC\uC758 \uB9F5 \uC790\uB3D9\uC73C\uB85C \uC5F4\uAE30
-OptionPanel.load_last_map.tooltip=<html>\uC120\uD0DD\uD558\uC2DC\uBA74 \uD504\uB9AC\uD50C\uB808\uC778 \uC2DC\uC791 \uC2DC, \uB9C8\uC9C0\uB9C9\uC5D0 \uC5F4\uC5C8\uB358 \uB9F5\uC744 \uC790\uB3D9\uC73C\uB85C \uBD88\uB7EC\uC635\uB2C8\uB2E4.</html>
-OptionPanel.load_last_maps=\uCD5C\uADFC \uB9F5 \uBAA8\uB450 \uBD88\uB7EC\uC624\uAE30
+OptionPanel.load_folding_from_map_default_fold_all=\uC9C0\uB3C4\uC5D0\uC11C \uBD88\uB7EC\uC624\uAC70\uB098 \uBAA8\uB450 \uC811\uAE30
+OptionPanel.load_folding_from_map_default_unfold_all=\uC9C0\uB3C4\uC5D0\uC11C \uBD88\uB7EC\uC624\uAC70\uB098 \uBAA8\uB450 \uD3BC\uCE58\uAE30
+OptionPanel.load_last_map=\uCD5C\uADFC \uC9C0\uB3C4 \uC790\uB3D9\uC73C\uB85C \uC5F4\uAE30
+OptionPanel.load_last_map.tooltip=<html>\uC120\uD0DD\uD558\uC2DC\uBA74 \uD504\uB9AC\uD50C\uB808\uC778 \uC2DC\uC791 \uC2DC, \uB9C8\uC9C0\uB9C9\uC5D0 \uC5F4\uC5C8\uB358 \uC9C0\uB3C4\uB97C \uC790\uB3D9\uC73C\uB85C \uBD88\uB7EC\uC635\uB2C8\uB2E4.</html>
+OptionPanel.load_last_maps=\uCD5C\uADFC \uC9C0\uB3C4 \uBAA8\uB450 \uBD88\uB7EC\uC624\uAE30
OptionPanel.lookandfeel=\uC2A4\uD0A8\uC120\uD0DD
OptionPanel.lookandfeel.tooltip=<html>\uBAA8\uC591\uACFC \uB290\uB08C. \uC0AC\uC6A9\uD558\uAE30'\uAE08\uC18D','\uCC3D','\uBAA8\uD2F0\uBE0C','GTK'\uB97C \uC9C0\uC6D0\uD558\uACE0, '\uB9E5'\uC740 \uB9E5 OS\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560\uC218\uC788\uC2B5\uB2C8\uB2E4. \uAE30\uBCF8\uAC12\uC740 \uAE30\uBCF8 \uBAA8\uC591\uACFC \uB290\uB08C\uC774 \uC0AC\uC6A9\uB429\uB2C8\uB2E4. \uC790\uC2E0\uC758 \uBAA8\uC591\uACFC \uB290\uB08C\uC744 \uB123\uAE38 \uC6D0\uD560\uACBD\uC6B0, \uC5EC\uAE30\uC5D [...]
OptionPanel.lt=Lt
@@ -1083,6 +1124,7 @@ OptionPanel.max_shortened_text_length=\uB2E8\uCD95\uB41C \uBB38\uC790\uC5F4\uC75
OptionPanel.metal=\uBA54\uD0C8
OptionPanel.min_node_width=\uCD5C\uC18C \uB178\uB4DC \uB108\uBE44
OptionPanel.motif=\uBAA8\uD2F0\uD504(\uD478\uB978\uACC4\uC5F4)
+OptionPanel.narrow_hexagon=\uC881\uC740 \uC721\uAC01\uD615
OptionPanel.nb=\uB178\uB974\uC6E8\uC774\uC5B4 Bokm\u00E5l / Norsk bokm\u00E5l
OptionPanel.never_save_folding=\uC808\uB300 \uC800\uC7A5 \uC548\uD568
OptionPanel.nl=Nl
@@ -1100,15 +1142,14 @@ OptionPanel.nodeformat=\uC11C\uC2DD
OptionPanel.nodeformat.tooltip=<html>\uD14D\uC2A4\uD2B8 \uAD50\uCCB4 \uBC0F/\uB610\uB294 \uD615\uC2DD:<ul><li><em>\uD655\uC7A5 \uC11C\uC2DD</em> (<tt>%s</tt> \uB294 \uC6D0\uBCF8 \uD14D\uC2A4\uD2B8\uC785\uB2C8\uB2E4), \uC608\uB97C \uB4E4\uBA74, <tt>\uC8FC\uC758: %s</tt><li><em>\uB0A0\uC9DC \uBC0F \uC22B\uC790 \uC11C\uC2DD</em> - \uC120\uD0DD \uC0C1\uC790\uC5D0\uC11C \uC608\uC81C\uB97C \uCC38\uC870\uD558\uC2ED\uC2DC\uC624.</ul></html>
OptionPanel.nodenumbering=\uB178\uB4DC \uBC88\uD638\uBD80\uC5EC
OptionPanel.nodenumbering.tooltip=\uB178\uB4DC \uD14D\uC2A4\uD2B8\uC5D0 \uC77C\uB828 \uBC88\uD638(\uC608: 1.3.1)\uB97C \uCD94\uAC00 \uD569\uB2C8\uB2E4.
-OptionPanel.nodeshape=\uB178\uB4DC \uC2A4\uD0C0\uC77C
-OptionPanel.nodeshape.tooltip=<html>\uC774 \uC2A4\uD0C0\uC77C\uC740 \uB178\uB4DC\uC758 \uC678\uC591\uC744 \uACB0\uC815\uD569\uB2C8\uB2E4. <br>\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uAC12:<br><table border="1"><tr><td>\uAC08\uB9BC\uAE38: </td><td> \uB458\uB7EC\uC2F8\uB294 \uC2E4\uC120 \uC5C6\uC74C,</td></tr><tr><td>\uD48D\uC120: </td><td> \uB458\uB7EC\uC2F8\uB294 \uC2E4\uC120 \uC9C1\uC0AC\uAC01\uD615,</td></tr><tr><td>\uC0C1\uC704 \uB178\uB4DC\uCC98\uB7FC: </td><td> \uC0C1\uC704 \uB178\uB4DC\uC [...]
+OptionPanel.nodeshape=\uB178\uB4DC \uBAA8\uC591
OptionPanel.nodetext=\uD45C\uC81C \uB0B4\uC6A9
OptionPanel.nodetext.tooltip=\uB178\uB4DC\uC758 \uAE00\uC790 \uBAA8\uC591\uC744 \uC774\uACF3\uC5D0\uC11C \uC815\uC758\uD569\uB2C8\uB2E4. \uD574\uB2F9 \uD328\uD134\uC774 \uC801\uC6A9\uB418\uBA74 \uC774\uC804 \uB0B4\uC6A9\uC740 \uD3D0\uAE30\uB429\uB2C8\uB2E4.
OptionPanel.nothing=\uC5C6\uC74C
OptionPanel.number_format=\uD45C\uC900 \uBC88\uD638 \uD615\uC2DD
OptionPanel.number_format.tooltip=\uBC18\uB4DC\uC2DC \uB4E4\uC5B4\uAC00\uC57C\uD560 \uC22B\uC790\uB294 '0' \uC744 \uC120\uD0DD\uC801\uC778 \uACBD\uC6B0'#'\uC744 \uD3EC\uD568\uD558\uB294 \uD328\uD134\uC785\uB2C8\uB2E4.\r\n\uC608\uC81C: "0.00", "0.0%", "$#.00", "#0"
OptionPanel.number_of_different_files_for_automatic_save=\uC784\uC2DC \uC790\uB3D9\uC800\uC7A5 \uD30C\uC77C \uC22B\uC790
-OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html>\uB9F5 \uC790\uB3D9 \uC800\uC7A5\uC5D0 \uC0AC\uC6A9\uB420 \uD30C\uC77C \uC218 n. \uCCAB\uBC88\uC9F8 \uC790\uB3D9 \uC800\uC7A5\uC740 \uCCAB\uBC88\uC9F8 \uD30C\uC77C\uC5D0\uC11C \uB429\uB2C8\uB2E4. \uADF8\uB9AC\uACE0 n+1\uBC88\uC9F8 \uC800\uC7A5\uC740 \uCCAB\uBC88\uC9F8 \uD30C\uC77C\uC5D0 \uB2E4\uC2DC \uC800\uC7A5\uB429\uB2C8\uB2E4(\uC21C\uD658\uD615).</html>
+OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html>\uC9C0\uB3C4 \uC790\uB3D9 \uC800\uC7A5\uC5D0 \uC0AC\uC6A9\uB420 \uD30C\uC77C \uC218 n. \uCCAB\uBC88\uC9F8 \uC790\uB3D9 \uC800\uC7A5\uC740 \uCCAB\uBC88\uC9F8 \uD30C\uC77C\uC5D0\uC11C \uB429\uB2C8\uB2E4. \uADF8\uB9AC\uACE0 n+1\uBC88\uC9F8 \uC800\uC7A5\uC740 \uCCAB\uBC88\uC9F8 \uD30C\uC77C\uC5D0 \uB2E4\uC2DC \uC800\uC7A5\uB429\uB2C8\uB2E4(\uC21C\uD658\uD615).</html>
OptionPanel.OK=\uC800\uC7A5
OptionPanel.org.freeplane.plugin.bugreport=\uC815\uCC45
OptionPanel.org.freeplane.plugin.bugreport.allowed=\uD56D\uC0C1 \uBCF4\uB0B4\uAE30
@@ -1117,9 +1158,14 @@ OptionPanel.org.freeplane.plugin.bugreport.denied=\uC808\uB300 \uC548 \uBCF4\uB0
OptionPanel.org.freeplane.plugin.bugreport.userid=\uBCF4\uB0B4\uC5B4\uC9C8 \uC120\uD0DD\uC801 \uC2DD\uBCC4\uC790
OptionPanel.outline_hgap=\uC218\uD3C9 \uAC70\uB9AC
OptionPanel.outline_vgap=\uC218\uC9C1 \uAC70\uB9AC
+OptionPanel.oval=\uD0C0\uC6D0\uD615
OptionPanel.paint_connectors_behind=\uB178\uB4DC \uB4A4\uCABD\uC73C\uB85C \uC5F0\uACB0\uC790 \uADF8\uB9AC\uAE30
OptionPanel.parse_data=\uC22B\uC790\uC640 \uB0A0\uC9DC-\uC2DC\uAC04 \uC785\uB825\uC744 \uC778\uC2DD
OptionPanel.parse_data.tooltip=\uB0A0\uC9DC, \uB0A0\uC9DC-\uC2DC\uAC04 \uADF8\uB9AC\uACE0 \uC22B\uC790 \uC785\uB825\uC5D0\uB300\uD55C \uAD6C\uBB38\uBD84\uC11D\uC744 \uD558\uACE0 \uD45C\uC900\uD615\uC2DD\uC744 \uC801\uC6A9\uD569\uB2C8\uB2E4. \uC608: 100,000.00, 12/31, 12/31/99, 1999-12-31 \uC640 1999-12-31 23:59
+OptionPanel.parse_formulas=\uC218\uC2DD\uC744 \uC778\uC2DD
+OptionPanel.parse_formulas.tooltip='=' \uB85C \uC2DC\uC791 \uB178\uB4DC\uC5D0\uC11C \uC218\uC2DD\uC744 \uAD6C\uBB38 \uBD84\uC11D\uD569\uB2C8\uB2E4: http://www.freeplane.org/wiki/index.php/Formulas\uB97C \uCC38\uC870\uD558\uC2ED\uC2DC\uC624.
+OptionPanel.parse_latex=LaTeX \uB97C \uC778\uC2DD\uD558\uAE30
+OptionPanel.parse_latex.tooltip=\uD615\uC2DD\uC774\uB098 \uC811\uB450\uC0AC\uB85C LaTeX\uC758 \uC218\uC2DD\uC744 \uC778\uC2DD: http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane \uB97C \uCC38\uC870\uD558\uC2ED\uC2DC\uC624.
OptionPanel.PASTE_HTML=HTML\uB85C \uBD99\uC5EC\uB123\uAE30
OptionPanel.PASTE_PLAIN_TEXT=\uC77C\uBC18 \uD14D\uC2A4\uD2B8\uB85C \uBD99\uC5EC\uB123\uAE30
OptionPanel.path_property_may_not_be_empty=\uACBD\uB85C \uC18D\uC131\uC740 \uBE44\uC6CC \uC9C0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4! \uBCC0\uACBD \uB0B4\uC6A9\uC774 \uBCF5\uADC0 \uB418\uC5C8\uC2B5\uB2C8\uB2E4.
@@ -1137,9 +1183,11 @@ OptionPanel.printonwhitebackground.tooltip=<html>\uC778\uC1C4\uD560\uB54C \uD56D
OptionPanel.pt_BR=\uD3EC\uB974\uD22C\uAC08\uC5B4 (\uBE0C\uB77C\uC9C8) / Portugu\u00EAs (Brasil)
OptionPanel.pt_PT=\uD3EC\uB974\uD22C\uAC08\uC5B4 (\uD3EC\uB974\uD22C\uAC08) / Portugu\u00EAs (Portugal)
OptionPanel.RECT=\uC9C1\uC0AC\uAC01\uD615
+OptionPanel.rectangle=\uC0AC\uAC01\uD615
OptionPanel.relative=\uC0C1\uB300 \uACBD\uB85C
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"\uC9C8\uBB38\uD558\uAE30"\uB294 (\uAD81\uAE08\uD55C\uAC83\uC774 \uC788\uC744\uB54C) \uC0AC\uC6A9\uD560\uC218 \uC788\uC2B5\uB2C8\uB2E4. <BR>"\uC608"\uB294 \uC11C\uC2DD\uC788\uB294 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.<BR>"\uC544\uB2C8\uC624"\uB294 \uC77C\uBC18 \uD14D\uC2A4\uD2B8 \uD3B8\uC9D1\uAE30\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.</html>
OptionPanel.remind_use_rich_text_in_new_nodes=\uBD99\uC5EC\uB123\uC744 \uB178\uB4DC\uC758 \uC11C\uC2DD \uAE00\uC790\uB97C \uC0AC\uC6A9
+OptionPanel.remindersBlink=\uAE5C\uBC15\uC774?? \uC54C\uB9AC\uBBF8
OptionPanel.remove_notes_without_question=\uC9C8\uBB38 \uC5C6\uC774 \uBA54\uBAA8\uB97C \uC81C\uAC70\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
OptionPanel.remove_notes_without_question.tooltip=\uC774 \uD655\uC778\uB780\uC744 \uC124\uC815\uD558\uBA74 \uC120\uD0DD\uD55C \uB178\uB4DC\uC5D0 \uC18D\uD558\uB294 \uBA54\uBAA8\uAC00 \uD655\uC778\uC5C6\uC774 \uC0AD\uC81C\uB429\uB2C8\uB2E4. \uC758\uB3C4\uD558\uC9C0 \uC54A\uACE0 \uB204\uB978 \uACBD\uC6B0 \uC815\uBCF4\uC758 \uC190\uC2E4\uC744 \uBC1C\uC0DD\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
OptionPanel.resources_use_default_font_for_notes_too=\uBA54\uBAA8\uC758 \uAE30\uBCF8 \uAE00\uAF34\uB3C4 \uC0AC\uC6A9\uD569\uB2C8\uB2E4
@@ -1149,7 +1197,8 @@ OptionPanel.revision_color.tooltip=\uBC14\uB010 \uB178\uB4DC\uC5D0\uB300\uD55C \
OptionPanel.ROUND_RECT=\uC9C1\uC0AC\uAC01\uD615 (\uB465\uADFC \uBAA8\uC11C\uB9AC)
OptionPanel.ru=\uB7EC\uC2DC\uC544\uC5B4 / \u0420\u0443\u0441\u0441\u043A\u0438\u0439
OptionPanel.save_folding=\uC811\uD798 \uC800\uC7A5
-OptionPanel.save_folding_if_map_is_changed=\uB9F5\uC774 \uBCC0\uACBD\uB420 \uACBD\uC6B0
+OptionPanel.save_folding_if_map_is_changed=\uC9C0\uB3C4\uAC00 \uBCC0\uACBD\uB420 \uACBD\uC6B0
+OptionPanel.save_last_visited_node=\uC9C0\uB3C4\uC5D0\uC11C \uB9C8\uC9C0\uB9C9 \uC704\uCE58 \uC800\uC7A5
OptionPanel.save_modification_times=\uC800\uC7A5 \uC218\uC815 \uC2DC\uAC04
OptionPanel.script_classpath=\uC2A4\uD06C\uB9BD\uD2B8 \uD074\uB798\uC2A4 \uACBD\uB85C: \uD074\uB798\uC2A4\uB97C \uD3EC\uD568\uD558\uB294 \uB514\uB809\uD1A0\uB9AC\uB098 JAR\uD30C\uC77C (\uB3C4\uAD6C \uD301 \uCC38\uACE0)
OptionPanel.script_classpath.tooltip=<html>\uC2A4\uD06C\uB9BD\uD2B8 \uC640 \uACF5\uC2DD\uB4E4\uC758 \uD074\uB798\uC2A4\uACBD\uB85C\uB97C \uCD94\uAC00\uD558\uAE30\uC704\uD55C \uB514\uB809\uD1A0\uB9AC \uC640/\uB610\uB294 JAR \uD30C\uC77C \uBAA9\uB85D.<br> \uD56D\uBAA9\uC744 \uAD6C\uBD84\uD558\uB824\uBA74 \uC708\uB3C4\uC6B0\uC988\uC5D0\uC11C\uB294 ;\uB97C, \uB9AC\uB205\uC2A4\uB098 \uB9E5\uC740 : \uC744 \uC0AC\uC6A9\uD558\uC2ED\uC2DC\uC694.<br>\uB514\uB809\uD1A0\uB9AC\uB294 JAR\uACFC .class [...]
@@ -1160,14 +1209,15 @@ OptionPanel.script_directories.tooltip=<html>("\uC2A4\uD06C\uB9BD\uD2B8" \uC774\
OptionPanel.script_user_key_name_for_signing=\uC11C\uBA85\uC5D0 \uC0AC\uC6A9\uB418\uB294 \uC120\uD0DD\uC801 \uC0AC\uC6A9\uC790 \uD0A4 \uBCC4\uCE6D
OptionPanel.script_user_key_name_for_signing.tooltip=<HTML>\uC2A4\uD06C\uB9BD\uD2B8\uC5D0 \uC11C\uBA85 \uD558\uB824\uBA74 \uD0A4\uC758 \uBCC4\uCE6D\uC744 \uC5EC\uAE30\uC5D0 \uC785\uB825\uD569\uB2C8\uB2E4. <BR> \uD0A4\uB294 \uAE30\uBCF8 \uD0A4 \uC2A4\uD1A0\uC5B4\uC5D0 \uC0C1\uC8FC \uD560 \uAC83\uC73C\uB85C \uC608\uC0C1\uB429\uB2C8\uB2E4. <BR> \uBCF4\uC548\uD0A4\uC758 \uC554\uD638\uB294 \uD0A4 \uC2A4\uD1A0\uC5B4 \uC554\uD638\uC640 \uC77C\uCE58\uD574\uC57C \uD569\uB2C8\uB2E4 (\uAE30\uBCF8\u [...]
OptionPanel.scrollbar_increment=\uC18D\uB3C4
-OptionPanel.scrolling_speed=\uB9F5 \uC790\uB3D9 \uC2A4\uD06C\uB864 \uC18D\uB3C4
+OptionPanel.scrolling_speed=\uC9C0\uB3C4 \uC790\uB3D9 \uC2A4\uD06C\uB864 \uC18D\uB3C4
+OptionPanel.scrollOnUnfold=\uB178\uB4DC\uB97C \uD3BC\uCE5C\uD6C4 \uC9C0\uB3C4 ??\uC811\uAE30
OptionPanel.selection_method=\uB178\uB4DC \uC120\uD0DD \uBC29\uBC95
OptionPanel.selection_method.tooltip=<html>\uB2E4\uC74C \uC2A4\uC704\uCE58\uC640 \uD568\uAED8 \uC9C0\uC5F0\uB420 \uC120\uD0DD \uC2A4\uD0A4\uB9C8.\uC790\uB3D9 \uC635\uC158\uC744 \uD65C\uC131\uD654 / \uBE44\uD65C\uC131\uD654 \uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC5B4\uCA0C\uB4E0 auto.properties\uC5D0 \uC800\uC7A5\uB418\uB294 \uAC83\uB4E4\uC744 \uC218\uC815 \uD558\uC9C0 \uB9C8\uC2ED\uC2DC\uC624.</html>
OptionPanel.selection_method_by_click=\uD074\uB9AD\uC73C\uB85C
OptionPanel.selection_method_delayed=\uB9C8\uC6B0\uC2A4\uB97C \uAC00\uC838\uAC00\uACE0 \uC57D\uAC04\uC758 \uC9C0\uC5F0 \uD6C4
OptionPanel.selection_method_direct=\uB9C8\uC6B0\uC2A4\uB97C \uAC00\uC838\uAC00\uBA74 \uBC14\uB85C \uC120\uD0DD
OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName=\uD328\uD134
-OptionPanel.separator.anti_alias=\uC564\uD2F0\uC5D0\uC77C\uB9AC\uC5B4\uC2F1
+OptionPanel.separator.anti_alias=\uC548\uD2F0\uC54C\uB9AC\uC5B4\uC2A4
OptionPanel.separator.attributes=\uC18D\uC131
OptionPanel.separator.automatic_save=\uC790\uB3D9 \uC800\uC7A5
OptionPanel.separator.behaviour=\uB3D9\uC791 \uC124\uC815
@@ -1179,7 +1229,7 @@ OptionPanel.separator.connectors=\uC5F0\uACB0\uC120
OptionPanel.separator.data_formats=\uB370\uC774\uD130 \uBC30\uCE58 \uBC0F \uC778\uC2DD
OptionPanel.separator.default_colors=\uAE30\uBCF8 \uC0C9\uC0C1
OptionPanel.separator.default_fonts=\uAE30\uBCF8 \uAE00\uAF34
-OptionPanel.separator.default_styles=\uAE30\uBCF8 \uC2A4\uD0C0\uC77C
+OptionPanel.separator.default_styles=\uAE30\uBCF8 \uAF34
OptionPanel.separator.EdgeControls=\uC904\uAE30
OptionPanel.separator.edit_long_node_window=\uC790\uC138\uD788 \uD3B8\uC9D1\uD558\uAE30
OptionPanel.separator.editing=\uD3B8\uC9D1\uAE30 \uC124\uC815
@@ -1192,11 +1242,11 @@ OptionPanel.separator.html_import=Html \uAC00\uC838\uC624\uAE30
OptionPanel.separator.hyperlink_types=\uB9C1\uD06C \uD615\uD0DC
OptionPanel.separator.icon_properties=\uC544\uC774\uCF58
OptionPanel.separator.icons="\uC544\uC774\uCF58 \uC120\uD0DD..."\uC5D0\uC11C\uC758 \uC544\uC774\uCF58
-OptionPanel.separator.initial_map_size=\uB9F5 \uCD08\uAE30 \uD06C\uAE30
+OptionPanel.separator.initial_map_size=\uCD08\uAE30 \uC9C0\uB3C4 \uD06C\uAE30
OptionPanel.separator.inline_editor=\uC778-\uB77C\uC778 \uB178\uB4DC \uD3B8\uC9D1\uAE30
OptionPanel.separator.key_typing=\uD0A4 \uC785\uB825
OptionPanel.separator.language=\uC5B8\uC5B4
-OptionPanel.separator.latex=\uB77C\uD14D\uC2A4
+OptionPanel.separator.latex=LaTeX
OptionPanel.separator.load=\uBD88\uB7EC\uC624\uAE30
OptionPanel.separator.look_and_feel=\uC2A4\uD0A8\uC120\uD0DD
OptionPanel.separator.mouse_wheel=\uB9C8\uC6B0\uC2A4 \uD720
@@ -1206,7 +1256,7 @@ OptionPanel.separator.node_navigation_commands=\uB178\uB4DC \uC0AC\uC774 \uC774\
OptionPanel.separator.NodeColors=\uD45C\uC81C \uBD80\uBD84 \uC804\uCCB4\uC758 \uC0C9\uC0C1
OptionPanel.separator.NodeFont=\uD45C\uC81C \uBD80\uBD84 \uC804\uCCB4\uC758 \uAE00\uAF34
OptionPanel.separator.NodeShape=\uB178\uB4DC \uBAA8\uC591
-OptionPanel.separator.NodeStyle=\uB178\uB4DC \uC2A4\uD0C0\uC77C
+OptionPanel.separator.NodeStyle=\uB178\uB4DC \uAF34
OptionPanel.separator.NodeText=\uD45C\uC81C \uB0B4\uC6A9
OptionPanel.separator.notifications=\uD655\uC778\uC0AC\uD56D
OptionPanel.separator.org.freeplane.plugin.bugreport=\uC790\uB3D9\uC73C\uB85C \uACB0\uD568 \uBCF4\uACE0
@@ -1225,6 +1275,7 @@ OptionPanel.separator.selection_method=\uB178\uB4DC \uC120\uD0DD \uBC29\uBC95
OptionPanel.separator.single_instance_mode=\uB2E8\uC77C \uD504\uB85C\uADF8\uB7A8 \uC2E4\uD589
OptionPanel.separator.size_limits=\uD06C\uAE30 \uC81C\uD55C
OptionPanel.separator.spelling=\uC2A4\uD3A0 \uCCB4\uD06C \uC635\uC158
+OptionPanel.separator.SplitToWordsAction=\uB178\uB4DC\uB97C \uB2E8\uC5B4 \uB2E8\uC704\uB85C \uB098\uB204\uAE30
OptionPanel.separator.status=\uC0C1\uD0DC \uC904
OptionPanel.separator.tooltip=\uB3C4\uAD6C \uD301 \uC2DC\uAC04
OptionPanel.separator.undo=\uC2E4\uD589 \uCDE8\uC18C
@@ -1232,18 +1283,21 @@ OptionPanel.separator.updates=\uD504\uB85C\uADF8\uB7A8 \uAC31\uC2E0
OptionPanel.set_property_text=\uBCC0\uACBD
OptionPanel.set_property_text.tooltip=\uBE48 \uAC12: \uBCC0\uACBD\uC548\uD568; \uC74C\uC218=\uC18D\uC131 \uC81C\uAC70(\uAE30\uBCF8\uAC12\uC73C\uB85C \uC124\uC815); \uC591\uC218=\uC18D\uC131 \uBCC0\uACBD
OptionPanel.setscript=\uBCC0\uACBD\uD560\uAE4C\uC694?
-OptionPanel.setscript.tooltip=\uC2A4\uD06C\uB9BD\uD2B8\uAC00 \uC2A4\uD0C0\uC77C\uACFC \uC5F0\uACB0\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
+OptionPanel.setscript.tooltip=\uC2A4\uD06C\uB9BD\uD2B8\uAC00 \uAF34\uACFC \uC5F0\uACB0\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
+OptionPanel.shape_horizontal_margin=\uC218\uD3C9 \uC5EC\uBC31
+OptionPanel.shape_vertical_margin=\uC218\uC9C1 \uC5EC\uBC31
OptionPanel.sharp_bezier=\uC608\uB9AC\uD55C \uACE1\uC120
OptionPanel.sharp_linear=\uC608\uB9AC\uD55C \uC9C1\uC120
OptionPanel.show_icon_for_attributes=\uC18D\uC131 \uAD00\uB828 \uC544\uC774\uCF58 \uBCF4\uAE30
+OptionPanel.show_less_than_N_nodes_by_default_after_load=\uC9C0\uB3C4\uB97C \uBD88\uB7EC\uC624\uAC70\uB098 \uC77C\uBD80 \uB178\uB4DC\uB97C \uD3BC\uCE68
OptionPanel.show_node_tooltips=\uB3C4\uAD6C \uD301 \uD45C\uC2DC
OptionPanel.show_note_icons=\uBA54\uBAA8 \uC544\uC774\uCF58 \uBCF4\uAE30
-OptionPanel.show_styles_in_tooltip=\uB3C4\uAD6C \uB3C4\uC6C0\uB9D0\uC5D0\uC11C \uB178\uB4DC \uC2A4\uD0C0\uC77C \uBCF4\uAE30
+OptionPanel.show_styles_in_tooltip=\uB3C4\uAD6C \uB3C4\uC6C0\uB9D0\uC5D0\uC11C \uB178\uB4DC \uAF34 \uBCF4\uAE30
OptionPanel.signed_script_are_trusted=\uC2E0\uB8B0 \uC11C\uBA85\uB41C \uC2A4\uD06C\uB9BD\uD2B8 (\uAD8C\uC7A5\uD568).
OptionPanel.signed_script_are_trusted.tooltip=\uC2A4\uD06C\uB9BD\uD2B8\uAC00 \uC2E0\uB8B0\uD560 \uC218 \uC788\uB294 \uC790(\uC608\uB97C \uB4E4\uC5B4 \uD504\uB9AC\uD50C\uB808\uC778\uC758 \uC81C\uC791\uC790\uB098 \uB2F9\uC2E0)\uC5D0 \uC758\uD574 \uC11C\uBA85\uB418\uC5C8\uB2E4\uBA74, \uC81C\uD55C\uC5C6\uC774 \uC2E4\uD589\uB429\uB2C8\uB2E4.
OptionPanel.simplyhtml.default_paste_mode=\uAE30\uBCF8 \uBD99\uC5EC\uB123\uAE30 \uBAA8\uB4DC
OptionPanel.single_backup_directory=\uBC31\uC5C5\uD30C\uC77C\uC744 \uC704\uD55C \uB2E8\uC77C \uB514\uB809\uD1A0\uB9AC \uC0AC\uC6A9
-OptionPanel.single_backup_directory.tooltip=<html>\uBC31\uC5C5 \uBC0F \uC790\uB3D9 \uC800\uC7A5 \uD30C\uC77C\uC744 \uAE30\uC874 \uB9F5 \uD30C\uC77C\uACFC \uAC19\uC740 \uB514\uB809\uD1A0\uB9AC\uC5D0 \uB123\uC744 \uAC83\uC778\uC9C0, \uD558\uC704 \uB514\uB809\uD1A0\uB9AC\uB97C \uC0DD\uC131\uD558\uC5EC \uB123\uC744 \uAC83\uC778\uC9C0 \uACB0\uC815</html>
+OptionPanel.single_backup_directory.tooltip=<html>\uBC31\uC5C5 \uBC0F \uC790\uB3D9 \uC800\uC7A5 \uD30C\uC77C\uC744 \uAE30\uC874 \uC9C0\uB3C4 \uD30C\uC77C\uACFC \uAC19\uC740 \uB514\uB809\uD1A0\uB9AC\uC5D0 \uB123\uC744 \uAC83\uC778\uC9C0, \uD558\uC704 \uB514\uB809\uD1A0\uB9AC\uB97C \uC0DD\uC131\uD558\uC5EC \uB123\uC744 \uAC83\uC778\uC9C0 \uACB0\uC815</html>
OptionPanel.single_backup_directory_path=\uBC31\uC5C5 \uB514\uB809\uD1A0\uB9AC (\uC704\uC758 \uC635\uC158\uC744 \uC120\uD0DD\uD558\uB294 \uACBD\uC6B0)
OptionPanel.single_backup_directory_path.tooltip=<html>\uAE30\uBCF8\uC0AC\uD56D \uC7AC\uC815\uC758???<freeplaneuserdir>/.backup</html>
OptionPanel.single_instance=\uC2E4\uD589\uC911\uC778 \uD504\uB85C\uADF8\uB7A8\uC5D0\uC11C\uC5D0\uC11C \uD30C\uC77C \uC5F4\uAE30
@@ -1258,49 +1312,59 @@ OptionPanel.spelling_opt_ignore_capitalization=\uC2DC\uC791 \uB2E8\uC5B4\uC5D0 \
OptionPanel.spelling_opt_ignore_words_with_numbers=\uB2E8\uC5B4\uAC2F\uC218 \uBB34\uC2DC
OptionPanel.spelling_opt_suggestions_limit_dialog=\uB300\uD654\uC0C1\uC790\uC5D0 \uCD5C\uB300 \uC81C\uC548 \uAC2F\uC218
OptionPanel.spelling_opt_suggestions_limit_menu=\uBA54\uB274\uC5D0 \uCD5C\uB300 \uC81C\uC548\uC758 \uAC2F\uC218
+OptionPanel.SplitToWordsAction.auxiliaryWordList=\uBCF4\uC870 \uB2E8\uC5B4 \uBAA9\uB85D
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=\uC6D0\uB798 \uBE48 \uB178\uB4DC\uB97C \uB0A8\uAE30\uAE30
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=\uD589\uC758 \uB178\uB4DC \uBC88\uD638
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=\uC138\uBD80 \uC0AC\uD56D\uC744 \uC6D0\uBCF8 \uAE00\uB85C \uC800\uC7A5
OptionPanel.sr=\uC138\uB974\uBE44\uC544\uC5B4 / \u0441\u0440\u043F\u0441\u043A\u0438
OptionPanel.standard_template=\uD45C\uC900 \uC11C\uC2DD \uD30C\uC77C
OptionPanel.standardbackgroundcolor=\uB178\uB4DC \uD45C\uC900 \uBC30\uACBD\uC0C9
OptionPanel.standardbackgroundcolor.tooltip=<html>HTML \uD45C\uAE30\uBC95\uC758 \uD45C\uC900 \uBC30\uACBD \uC0C9\uC0C1</html>
OptionPanel.standardcloudcolor=\uAD6C\uB984 \uD45C\uC900 \uC0C9\uC0C1
OptionPanel.standardcloudcolor.tooltip=<html>HTML \uD45C\uAE30\uBC95\uC758 \uD45C\uC900 \uAD6C\uB984 \uC0C9\uC0C1 </html>
-OptionPanel.standardcloudestyle=\uAD6C\uB984 \uD45C\uC900 \uC2A4\uD0C0\uC77C
-OptionPanel.standardcloudestyle.tooltip=<html>\uD45C\uC900 \uAD6C\uB984 \uC2A4\uD0C0\uC77C. \uD604\uC7AC, '\uBCA0\uC9C0\uC5B4??'\uAC00 \uC9C0\uC6D0\uB429\uB2C8\uB2E4</html>
+OptionPanel.standardcloudestyle=\uD45C\uC900 \uAD6C\uB984 \uAF34
+OptionPanel.standardcloudestyle.tooltip=<html>\uD45C\uC900 \uAD6C\uB984 \uAF34. \uD604\uC7AC, '\uBCA0\uC9C0\uC5B4??'\uAC00 \uC9C0\uC6D0\uB429\uB2C8\uB2E4</html>
OptionPanel.standarddrawrectangleforselection=\uAC70\uD488\uC5D0\uC11C \uC120\uD0DD\uD55C \uB178\uB4DC\uB97C \uBCF4\uAE30
OptionPanel.standarddrawrectangleforselection.tooltip=<html>\uCCB4\uD06C\uD45C\uC2DC\uB294 \uAC70\uD488 \uC8FC\uBCC0\uC5D0\uC758\uD574 \uC120\uD0DD\uD55C \uB178\uB4DC\uB4E4 \uC785\uB2C8\uB2E4.</html>
OptionPanel.standardlinkcolor=\uB9C1\uD06C \uD45C\uC900 \uC0C9\uC0C1
OptionPanel.standardlinkcolor.tooltip=<html>HTML \uD45C\uAE30\uBC95\uC758 \uD45C\uC900 \uC5F0\uACB0 \uC0C9\uC0C1</html>
-OptionPanel.standardlinkestyle=\uB9C1\uD06C \uD45C\uC900 \uC2A4\uD0C0\uC77C
-OptionPanel.standardlinkestyle.tooltip=<html>\uD45C\uC900 \uC5F0\uACB0 \uC2A4\uD0C0\uC77C. \uD604\uC7AC, '\uBCA0\uC9C0\uC5B4??'\uAC00 \uC9C0\uC6D0\uB429\uB2C8\uB2E4.</html>
+OptionPanel.standardlinkestyle=\uACE0\uB9AC \uD45C\uC900 \uAF34
+OptionPanel.standardlinkestyle.tooltip=<html>\uD45C\uC900 \uACE0\uB9AC \uAF34. \uD604\uC7AC, '\uBCA0\uC9C0\uC5B4??'\uAC00 \uC9C0\uC6D0\uB429\uB2C8\uB2E4.</html>
OptionPanel.standardselectednodecolor=\uC120\uD0DD\uD55C \uB178\uB4DC\uC758 \uD45C\uC900 \uAE00\uC790\uC0C9
OptionPanel.standardselectednodecolor.tooltip=<html>\uC120\uD0DD\uD55C \uACBD\uC6B0 \uD45C\uC900 \uB178\uB4DC \uC0C9\uC0C1. HTML \uD45C\uAE30\uBC95 (16 \uC9C4\uC218 \uAC12\uC73C\uB85C #RRGGBB)</html>
OptionPanel.standardselectednoderectanglecolor=\uC120\uD0DD\uD55C \uB178\uB4DC \uAC70\uD488 \uC0C9\uC0C1
OptionPanel.standardselectednoderectanglecolor.tooltip=<html>\uC120\uD0DD\uD55C \uB178\uB4DC\uC758 \uD45C\uC2DC\uD558\uB294 \uAC70\uD488\uC0C9\uC0C1. HTML \uD45C\uAE30\uBC95\uC73C\uB85C (16 \uC9C4\uC218 \uAC12\uC73C\uB85C #RRGGBB)</html>
OptionPanel.STAR=\uBCC4 \uBAA8\uC591
+OptionPanel.statesymbolwidth=\uC0C1\uD0DC \uAE00\uC790 \uD3ED
OptionPanel.structured_html_import=\uB178\uB4DC \uAD6C\uC870\uB85C HTML \uAC00\uC838\uC624\uAE30\uAE30
-OptionPanel.structured_icon_toolbar=\uAD6C\uC870\uD654\uB41C \uC544\uC774\uCF58 \uB3C4\uAD6C\uBAA8\uC74C
+OptionPanel.structured_icon_toolbar=\uAD6C\uC870\uD654\uB41C \uC544\uC774\uCF58 \uB3C4\uAD6C \uB9C9\uB300
OptionPanel.summary=\uC694\uC57D
OptionPanel.sv=\uC2A4\uC6E8\uB374\uC5B4 / svenska
OptionPanel.text.use_ctrl_key=\uB3C4\uAD6C \uBA54\uB274\uC5D0\uC11C '\uB2E8\uCD95\uD0A4 \uC9C0\uC815'\uC744 \uC774\uC6A9
+OptionPanel.textalignment=\uAE00 \uC815\uB82C
OptionPanel.time_for_automatic_save=\uC790\uB3D9\uC800\uC7A5\uD560 \uC2DC\uAC04\uC124\uC815
OptionPanel.time_for_automatic_save.tooltip=<html> \uC790\uB3D9\uC800\uC7A5 \uD65C\uC131\uD654\uC2DC \uC2DC\uAC04\uAC04\uACA9\uC785\uB2C8\uB2E4.(1/1000\uCD08): \uC790\uB3D9\uC800\uC7A5\uC744 \uBE44\uD65C\uC131\uD654\uD558\uB824\uBA74 \uC774 \uAC12\uC744 2000000000\uC73C\uB85C \uC124\uC815\uD558\uC138\uC694.</html>
OptionPanel.time_for_delayed_selection=\uC120\uD0DD\uC2DC \uC9C0\uC5F0\uC2DC\uAC04
OptionPanel.time_for_delayed_selection.tooltip=<html>\uC120\uD0DD \uB178\uB4DC (\uBC00\uB9AC\uCD08)\uC5D0\uC11C \uB9C8\uC6B0\uC2A4\uAC00 \uB54C\uC758 \uC9C0\uC5F0 \uC2DC\uAC04\uC785\uB2C8\uB2E4.???? \uB9CC\uC57D \uB9C8\uC6B0\uC2A4\uC624\uBC84\uC5D0\uC11C \uC9C1\uC811 \uC120\uD0DD\uD558\uAE30\uB97C \uC6D0\uD55C\uB2E4\uBA74 \uC774 \uAC12\uC744 1\uB85C \uBCC0\uACBD \uD558\uC138\uC694.</html>
OptionPanel.toolTipManager.dismissDelay=\uC9C0\uC5F0 \uD574\uC81C, ms
OptionPanel.toolTipManager.initialDelay=\uC9C0\uC5F0 \uCD08\uAE30\uD654 [\uBC00\uB9AC\uCD08]
-OptionPanel.toolTipManager.max_tooltip_width=\uD234\uD301 \uB108\uBE44
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>\uAE30\uBCF8 \uC124\uC815 \uB3C4\uAD6C \uD301 \uB108\uBE44\uB97C \uD53D\uC140 \uB2E8\uC704\uB85C \uC785\uB825\uD558\uC138\uC694.</html>
+OptionPanel.toolTipManager.max_tooltip_height=\uCD5C\uB300 \uB178\uB4DC \uD234\uD301?? \uB192\uC774
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=\uD53D\uC140\uB2E8\uC704 \uCD5C\uB300 \uD234\uD301 \uB192\uC774.
+OptionPanel.toolTipManager.max_tooltip_width=\uCD5C\uB300 \uB178\uB4DC \uD234\uD301 \uB108\uBE44
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=\uD53D\uC140\uB85C \uCD5C\uB300 \uD234\uD301 \uB113\uC774.
OptionPanel.toolTipManager.reshowDelay=\uB2E4\uC2DC\uBCF4\uAE30 \uC9C0\uC5F0, ms
+OptionPanel.tr=\uD130\uD0A4\uC5B4 / T\u00FCrk\u00E7e
OptionPanel.uk_UA=\uC6B0\uD06C\uB77C\uC774\uB098\uC5B4 / \u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430
OptionPanel.undefined_font=\uC815\uC758\uB418\uC9C0 \uC54A\uC740 \uAE00\uAF34
OptionPanel.undo_levels=\uC2E4\uD589 \uCDE8\uC18C \uB2E8\uACC4
OptionPanel.undo_levels.tooltip=<html>\uC2E4\uD589\uCDE8\uC18C \uB0B4\uC5ED\uC744 \uC5BC\uB9C8\uB9CC\uD07C\uC758 \uB2E8\uACC4\uAE4C\uC9C0 \uC800\uC7A5\uD560\uAC83\uC778\uC9C0 \uC124\uC815\uD569\uB2C8\uB2E4.</html>
OptionPanel.unfold_on_paste=\uB178\uB4DC\uB97C \uC811\uC740 \uC0C1\uD0DC\uB85C \uBD99\uC5EC\uB123\uAE30
OptionPanel.unfold_on_paste.tooltip=\uBD99\uC5EC\uB123\uAE30\uB098 \uB4DC\uB798\uADF8-\uC564-\uB4DC\uB86D \uC2DC \uB178\uB4DC \uD3BC\uCE58\uAE30
+OptionPanel.uniform_shape=??\uC81C\uBCF5
OptionPanel.use_common_out_point_for_root_node=\uCD5C\uC0C1\uC704 \uB178\uB4DC\uC5D0\uC11C \uBAA8\uB4E0 \uC904\uAE30\uB97C \uC2DC\uC791
OptionPanel.use_common_out_point_for_root_node.tooltip=\uCD5C\uC0C1\uC704 \uB178\uB4DC\uC5D0\uC11C \uBAA8\uB4E0 \uC904\uAE30\uB97C \uC2DC\uC791
OptionPanel.use_tabbed_pane=\uD0ED \uC0AC\uC6A9
-OptionPanel.use_tabbed_pane.tooltip=\uC120\uD0DD\uD558\uC2DC\uBA74 \uB9F5\uC774 \uD0ED\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4 (FireFox \uCC98\uB7FC :-) ).
+OptionPanel.use_tabbed_pane.tooltip=\uC120\uD0DD\uD558\uC2DC\uBA74 \uC9C0\uB3C4\uAC00 \uD0ED\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4 (FireFox \uCC98\uB7FC :-) ).
OptionPanel.user_defined_screen_resolution=\uC0AC\uC6A9\uC790 \uC815\uC758 \uD654\uBA74 \uD574\uC0C1\uB3C4 (dpi)
OptionPanel.validate_classpath_needs_readaccess=\uC2A4\uD06C\uB9BD\uD305 : \uD074\uB798\uC2A4 \uACBD\uB85C\uB97C \uC124\uC815\uD560 \uB54C\uC774 \uD30C\uC77C\uC5D0 \uB300\uD55C \uC77D\uAE30 \uAD8C\uD55C\uC744 \uD5C8\uC6A9\uD574\uC57C\uD569\uB2C8\uB2E4!
OptionPanel.validate_invalid_date_format=\uC798\uBABB\uB41C \uD45C\uC900 \uB0A0\uC9DC \uD615\uC2DD
@@ -1309,10 +1373,13 @@ OptionPanel.validate_invalid_number_format=\uC798\uBABB\uB41C \uD45C\uC900 \uC22
OptionPanel.validate_write_without_read=\uC2A4\uD06C\uB9BD\uD305 : \uC4F0\uAE30/\uD30C\uC77C\uC5D0 \uC77D\uAE30/\uD30C\uC77C\uC744 \uCD94\uAC00\uD558\uB294\uAC83\uC774 \uC88B\uC2B5\uB2C8\uB2E4.
OptionPanel.validation_error=<html><body>\uC720\uD6A8\uC131 \uC624\uB958:<p><em>{0}</em><p> \uC624\uB958\uB97C \uD574\uACB0 \uD558\uB824\uBA74 \uD658\uACBD\uC124\uC815\uC744 \uBCC0\uACBD \uD558\uC138\uC694.</body></html>
OptionPanel.validation_warning=<html><body>\uC720\uD6A8\uC131 \uACBD\uACE0:<p><em>{0}</em></body></html>
+OptionPanel.vertical_child_gap=\uC790\uC2DD \uCC28\uC774
+OptionPanel.vertical_child_gap.tooltip=\uC790\uC2DD \uB178\uB4DC \uC0AC\uC774\uC758 \uC218\uC9C1 \uAC70\uB9AC
OptionPanel.vi=\uBCA0\uD2B8\uB0A8\uC5B4 / Ti\u1EBFng Vi\u1EC7t
OptionPanel.wheel_velocity=\uC18D\uB3C4
-OptionPanel.wheel_velocity.tooltip=\uB192\uC740 \uAC12\uC740 \uB9F5\uC5D0\uC11C \uB9C8\uC6B0\uC2A4 \uD720\uB85C \uC778\uD55C \uC2A4\uD06C\uB864\uC774 \uBE68\uB77C\uC9C0\uAC8C \uD569\uB2C8\uB2E4.
-OptionPanel.windows=\uC708\uB3C4\uC6B0
+OptionPanel.wheel_velocity.tooltip=\uB192\uC740 \uAC12\uC740 \uC9C0\uB3C4\uC5D0\uC11C \uB9C8\uC6B0\uC2A4 \uD720\uB85C \uC778\uD55C \uC2A4\uD06C\uB864\uC774 \uBE68\uB77C\uC9C0\uAC8C \uD569\uB2C8\uB2E4.
+OptionPanel.wide_hexagon=\uB113\uC740 \uC721\uAC01\uD615
+OptionPanel.windows=\uC708\uB3C4\uC6B0\uC988
OptionPanel.zh_CN=\uC911\uAD6D\uC5B4 \uAC04\uCCB4 / \u7B80\u4F53\u5B57
OptionPanel.zh_TW=\uC911\uAD6D\uC5B4 \uBC88\uCCB4 / \u7E41\u9AD4\u5B57
org.freeplane.plugin.bugreport.agree=\uBCF4\uB0C4
@@ -1331,14 +1398,14 @@ out_of_memory=\uBA54\uBAA8\uB9AC\uAC00 \uBD80\uC871\uD569\uB2C8\uB2E4.
overwrite_keyset_question=\uAE30\uC874\uC758 \uD0A4 \uC124\uC815\uC744 \uB36E\uC5B4 \uC4F0\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
PageAction.text=\uD398\uC774\uC9C0 \uC124\uC815...
password_is_not_ascii=ASCII \uD615\uD0DC\uC758 \uC554\uD638\uAC00 \uC544\uB2D9\uB2C8\uB2E4
-PasteAction.text=\uBD99\uC5EC\uB123\uAE30(&P)
+PasteAction.text=\uBD99\uC5EC\uB123\uAE30(P)
PasteAttributes.text=\uC18D\uC131 \uBD99\uC5EC\uB123\uAE30(&r)
PatternNewNameProperty=\uC0C8 \uD328\uD134
PatternToString.backgroundColor=\uBC30\uACBD\uC0C9
-PatternToString.Child=\uD558\uC704 \uB178\uB4DC \uC2A4\uD0C0\uC77C
+PatternToString.Child=\uD558\uC704 \uB178\uB4DC \uAF34
PatternToString.color=\uC0C9
PatternToString.EdgeColor=\uC904\uAE30 \uC0C9\uC0C1
-PatternToString.EdgeStyle=\uC904\uAE30 \uC2A4\uD0C0\uC77C
+PatternToString.EdgeStyle=\uC904\uAE30 \uAF34
PatternToString.EdgeWidth=\uC904\uAE30 \uB108\uBE44
PatternToString.FontBold=\uAC15\uC870
PatternToString.FontItalic=\uAE30\uC6B8\uAC8C
@@ -1353,7 +1420,7 @@ PeriodUnit.MONTH=\uC6D4
PeriodUnit.WEEK=\uC8FC
PeriodUnit.YEAR=\uB144
plugins/latex/LatexNodeHook.editorTitle=LaTeX \uC218\uC2DD \uD3B8\uC9D1
-plugins/script_filter=\uC2A4\uD06C\uB9BD\uD2B8 \uD544\uD130 {0}
+plugins/script_filter=\uC2A4\uD06C\uB9BD\uD2B8 \uAC70\uB984\uAE30 {0}
plugins/script_filter_error={0}\uC774 {1}\uC5D0\uC11C \uB17C\uB9AC\uD615 \uACB0\uACFC\uB97C \uBC18\uD658\uD558\uC600\uC5B4\uC57C \uD558\uB294\uB370 {2}\uC774(\uAC00) \uBC18\uD658\uD558\uC600\uC2B5\uB2C8\uB2E4
plugins/script_filter_execute_error=??\n\uB178\uB4DC {1} \uC5D0\uB300\uD55C:\n\uC2E4\uD589 \uC624\uB958 {0}\n{2}
plugins/ScriptEditor.cancel=\uBCC0\uACBD \uC0AC\uD56D\uC744 \uC800\uC7A5\uD558\uC9C0 \uC54A\uACE0 \uC885\uB8CC(&D)
@@ -1384,7 +1451,7 @@ plugins/TimeManagement.xml_hour=\uC2DC\uAC04:
plugins/TimeManagement.xml_menu_actions=\uC561\uC158
plugins/TimeManagement.xml_minute=\uBD84:
plugins/TimeManagement.xml_reminderButton=\uC9C0\uC815\uB41C \uB0A0\uC9DC\uC5D0 \uC54C\uB9AC\uAE30
-plugins/TimeManagement.xml_reminderButton_tooltip=<html>\uD0C0\uC774\uBA38\uB97C \uB204\uB974\uBA74 \uC9C0\uC815\uB41C \uB0A0\uC9DC\uB85C \uC608\uC815\uB429\uB2C8\uB2E4. \uADF8 \uB2E4\uC74C \uAE5C\uBC15\uC784 \uC544\uC774\uCF58\uC744 \uAD00\uC2EC \uC0AC\uD56D\uC73C\uB85C \uBD80\uB985\uB2C8\uB2E4.<br> \uB9F5\uC744 \uB2EB\uC73C\uBA74, \uD0C0\uC774\uBA38\uB294 \uB9F5\uC774 \uB2E4\uC74C \uBC88\uC5D0 \uC5F4\uB9B4 \uB54C \uB2E4\uC2DC \uD65C\uC131\uD654\uB429\uB2C8\uB2E4.</html>
+plugins/TimeManagement.xml_reminderButton_tooltip=<html>\uD0C0\uC774\uBA38\uB97C \uB204\uB974\uBA74 \uC9C0\uC815\uB41C \uB0A0\uC9DC\uB85C \uC608\uC815\uB429\uB2C8\uB2E4. \uADF8 \uB2E4\uC74C \uAE5C\uBC15\uC784 \uC544\uC774\uCF58\uC744 \uAD00\uC2EC \uC0AC\uD56D\uC73C\uB85C \uBD80\uB985\uB2C8\uB2E4.<br> \uC9C0\uB3C4\uB97C \uB2EB\uC73C\uBA74, \uD0C0\uC774\uBA38\uB294 \uB9F5\uC774 \uB2E4\uC74C \uBC88\uC5D0 \uC5F4\uB9B4 \uB54C \uB2E4\uC2DC \uD65C\uC131\uD654\uB429\uB2C8\uB2E4.</html>
plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>\uB178\uB4DC\uBCC4\uB85C \uD0C0\uC774\uBA38 1\uAC1C\uAC00 \uC791\uB3D9 \uC911\uC785\uB2C8\uB2E4.<br>{0,date} {0,time}\uC5D0 \uD0C0\uC774\uBA38\uAC00 \uC2A4\uCF00\uC974\uD654\uB418\uC5B4 \uC788\uC73C\uBA70, \uB2F9\uC2E0\uC740 {1,date} {1,time}\uB97C \uC120\uD0DD\uD558\uC168\uC2B5\uB2C8\uB2E4.<br><br>\uD604\uC7AC \uB178\uB4DC\uC758 \uD0C0\uC774\uBA38\uB97C \uC7AC\uC870\uC815\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C? (YES) <br>\uC544\uB2C [...]
plugins/TimeManagement.xml_reminderNode_tooltip={0,date} {0,time}\uC5D0 \uC54C\uB824 \uC8FC\uB3C4\uB85D \uC124\uC815\uB428.
plugins/TimeManagement.xml_remindLaterButton=\uB098\uC911\uC5D0 \uC54C\uB9BC
@@ -1400,36 +1467,39 @@ plugins/TimeManagement.xml_WindowTitle=\uC2DC\uAC04 \uAD00\uB9AC
plugins/TimeManagement.xml_WindowTitle_All_Nodes=\uCC3E\uAE30 \uBC0F \uBC14\uAFB8\uAE30
preferences=\uD658\uACBD \uC124\uC815
print_preview_title=\uC778\uC1C4 \uBBF8\uB9AC\uBCF4\uAE30
-PrintAction.text=\uB9F5 \uC778\uC1C4(&P)...
+PrintAction.text=\uC9C0\uB3C4 \uC778\uC1C4(P)...
PrintDirectAction.text=\uC778\uC1C4
printing_settings=\uC778\uC1C4 \uBE44\uC728
PrintPreviewAction.text=\uC778\uC1C4 \uBBF8\uB9AC\uBCF4\uAE30(&V)...
+progress=\uC9C4\uD589\uC728 \uC544\uC774\uCF58 (%)
PropertyAction.dialog=\uD658\uACBD\uC124\uC815
PropertyAction.text=\uD658\uACBD\uC124\uC815...
-QuickFilterAction.text=\uBE60\uB978 \uD544\uD130
+QuickFilterAction.text=\uBE60\uB978 \uAC70\uB984\uAE30
QuickFindAction.BACK.text=\uC774\uC804 \uCC3E\uAE30
QuickFindAction.FORWARD.text=\uB2E4\uC74C \uCC3E\uAE30
QuickFindAllAction.text=\uBAA8\uB4E0 \uC77C\uCE58\uD558\uB294 \uB178\uB4DC \uC120\uD0DD
QuickHighlightAction.text=\uBAA8\uB4E0 \uC77C\uCE58\uD558\uB294 \uB178\uB4DC \uB4DC\uB7EC\uB0B4\uAE30
-QuitAction.text=\uC885\uB8CC(&Q)
+QuitAction.text=\uC885\uB8CC(Q)
read_only=\uC77D\uAE30 \uC804\uC6A9
ReadScriptError.text=\uC2A4\uD06C\uB9BD\uD2B8 \uC77D\uAE30 \uC624\uB958
-really_convert_to_current_version=<html>\uC774 \uB9F5\uC740 \uC774\uC804 \uBC84\uC804\uC758 \uD504\uB9AC\uD50C\uB808\uC778\uC73C\uB85C \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4. <br>\uBCC0\uD658\uD560\uAE4C\uC694(\uAD8C\uC7A5\uD568)? <br>(\uBCC0\uD658\uD558\uC9C0 \uC54A\uC73C\uBA74 \uC9C0\uAE08 \uD615\uD0DC \uADF8\uB300\uB85C \uC778\uC2DD\uB418\uBA70, \uC190\uC0C1\uC758 \uC6B0\uB824\uAC00 \uC788\uC74C) </html>
+really_convert_to_current_version=<html>\uC774 \uC9C0\uB3C4\uB294 \uC774\uC804 \uBC84\uC804\uC758 \uD504\uB9AC\uD50C\uB808\uC778\uC73C\uB85C \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4. <br>\uBCC0\uD658\uD560\uAE4C\uC694(\uAD8C\uC7A5\uD568)? <br>(\uBCC0\uD658\uD558\uC9C0 \uC54A\uC73C\uBA74 \uC9C0\uAE08 \uD615\uD0DC \uADF8\uB300\uB85C \uC778\uC2DD\uB418\uBA70, \uC190\uC0C1\uC758 \uC6B0\uB824\uAC00 \uC788\uC74C) </html>
really_cut_node=\uB178\uB4DC\uB97C \uC798\uB77C\uB0B4\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
-really_execute_script=\uC774 \uB9F5\uC5D0 \uD3EC\uD568\uB41C \uC2A4\uD06C\uB9BD\uD2B8\uB97C \uC815\uB9D0\uB85C \uC2E4\uD589\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C? \uC2A4\uD06C\uB9BD\uD2B8\uAC00 \uB2F9\uC2E0\uC758 \uCEF4\uD4E8\uD130\uB97C \uC190\uC0C1\uC2DC\uD0AC \uC218 \uC788\uC2B5\uB2C8\uB2E4.
+really_execute_script=\uC774 \uC9C0\uB3C4\uC5D0 \uD3EC\uD568\uB41C \uC2A4\uD06C\uB9BD\uD2B8\uB97C \uC815\uB9D0\uB85C \uC2E4\uD589\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C? \uC2A4\uD06C\uB9BD\uD2B8\uAC00 \uB2F9\uC2E0\uC758 \uCEF4\uD4E8\uD130\uB97C \uC190\uC0C1\uC2DC\uD0AC \uC218 \uC788\uC2B5\uB2C8\uB2E4.
really_remove_node=\uB178\uB4DC\uB97C \uC0AD\uC81C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
really_remove_notes=\uBA54\uBAA8\uB97C \uC0AD\uC81C\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
-ReapplyFilterAction.text=\uD544\uD130 \uB3D9\uC791\uC744 \uB2E4\uC2DC \uC801\uC6A9
+ReapplyFilterAction.text=\uAC70\uB984\uAE30 \uB3D9\uC791\uC744 \uB2E4\uC2DC \uC801\uC6A9
red=\uBE68\uAC15
-RedefineStyleAction.text=\uC7AC\uC815\uC758 \uC2A4\uD0C0\uC77C
-RedoAction.text=\uB2E4\uC2DC \uC2E4\uD589(&R)
-RedoFilterAction.text=\uD544\uD130 \uB3D9\uC791\uC744 \uB2E4\uC2DC \uC2E4\uD589
+RedefineStyleAction.text=\uAF34 \uB2E4\uC2DC \uC9C0\uC815
+RedoAction.text=\uB2E4\uC2DC \uC2E4\uD589(R)
+RedoFilterAction.text=\uAC70\uB984\uAE30 \uB3D9\uC791\uC744 \uB2E4\uC2DC \uC2E4\uD589
regular_expressions=\uC815\uADDC\uC2DD
ReminderHookAction.text=\uC54C\uB9BC \uD45C\uC2DC \uC81C\uAC70
ReminderHookAction.tooltip=\uB178\uB4DC\uC5D0\uC11C \uBBF8\uB9AC \uC54C\uB9BC\uC744 \uC81C\uAC70.
remove_file_from_list_on_error=\uD30C\uC77C {0} \uC740 \uC5F4\uB9AC\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB9C8\uC9C0\uB9C9\uC73C\uB85C \uC5F4\uB9B0 \uD30C\uC77C \uBAA9\uB85D\uC5D0\uC11C \uC81C\uAC70 \uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
remove_shortcut_question=\uB2E8\uCD95\uD0A4\uB97C \uBC14\uAFB8\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
remove_shortcut_title=\uB2E8\uCD95\uD0A4\uB97C \uC81C\uAC70 \uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=\uD3BC\uCCD0\uC9C4 \uB178\uB4DC \uB2E4\uC2DC \uC124\uC815
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=\uBAA8\uB4E0 \uB178\uB4DC\uB97C \uC811\uAC8C \uD558\uAE30
RemoveAllIconsAction.text=\uBAA8\uB4E0 \uC544\uC774\uCF58 \uC0AD\uC81C
RemoveConnectorAction.text=\uC5F0\uACB0\uC120 \uC81C\uAC70
RemoveEncryption.text=\uC554\uD638\uC81C\uAC70
@@ -1440,7 +1510,7 @@ RemoveNoteAction.text=\uBA54\uBAA8 \uC0AD\uC81C
RemoveNoteAction.tooltip=<html>\uAC00\uB2A5\uD55C?? \uC77C\uBD80\uC758 \uBA54\uBAA8 \uB0B4\uC6A9\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4.</html>
rename=\uC774\uB984 \uBC14\uAFB8\uAE30(&R)
repair_link=\uB9C1\uD06C \uC218\uC815
-repair_link_question=\uB9C1\uD06C\uB41C \uB9F5\uC744 \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uB9C1\uD06C\uB97C \uC218\uC815\uD558\uACA0\uC2B5\uB2C8\uAE4C?
+repair_link_question=\uC5F0\uACB0\uB41C \uC9C0\uB3C4\uB97C \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC218\uB3D9\uC73C\uB85C \uACE0\uB9AC\uB97C \uC218\uC815\uD558\uACA0\uC2B5\uB2C8\uAE4C?
replace=\uBC14\uAFB8\uAE30
replace_shortcut_question=\uD0A4\uBCF4\uB4DC \uB2E8\uCD95\uD0A4\uB294 \uD604\uC7AC {0} \uC73C\uB85C \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\n \uBC14\uAFB8\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
replace_shortcut_title=\uB2E8\uCD95\uD0A4\uB97C \uBC14\uAFB8\uACA0\uC2B5\uB2C8\uAE4C?
@@ -1448,17 +1518,22 @@ ReportBugAction.text=\uACB0\uD568 \uBCF4\uACE0\uD558\uAE30
RequestFeatureAction.text=\uAE30\uB2A5\uC744 \uC694\uCCAD\uD558\uAE30
reset_to_default=\uAE30\uBCF8 \uC124\uC815 \uC0AC\uC6A9
ResetNodeLocationAction.text=\uB178\uB4DC \uC704\uCE58 \uCD08\uAE30\uD654(&P)
-ResetStyleAction.text=\uB178\uB4DC \uC2A4\uD0C0\uC77C \uC7AC\uC124\uC815
+ResetStyleAction.text=\uB178\uB4DC \uAF34 \uB2E4\uC2DC \uC124\uC815
RevertAction.text=\uC9C0\uC5ED \uD788\uC2A4\uD1A0\uB9AC\uC5D0\uC11C \uBCF5\uC6D0(&R)
RevisionPluginAction.text=\uAC1C\uC815 \uBC30\uACBD \uC0C9\uC0C1 \uBCC0\uACBD(&r)
-save_failed={0} \uB9F5 \uC800\uC7A5 \uC791\uC5C5\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
-save_unsaved=\uB2E4\uC74C\uC758 \uB9C8\uC778\uB4DC\uC9C0\uB3C4\uC744 \uC800\uC7A5\uD560\uAE4C\uC694?
-save_unsaved_styles=\uC2A4\uD0C0\uC77C\uC744 \uC800\uC7A5\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
+save=\uC800\uC7A5(&S)
+save_failed={0} \uC9C0\uB3C4 \uC800\uC7A5 \uC791\uC5C5\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4.
+save_unsaved=\uB2E4\uC74C\uC758 \uB9C8\uC778\uB4DC \uC9C0\uB3C4\uC744 \uC800\uC7A5\uD560\uAE4C\uC694?
+save_unsaved_styles=\uAF34\uC744 \uC800\uC7A5\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
SaveAcceleratorPresetsAction.text=\uB2E8\uCD95\uD0A4 \uC124\uC815 \uC800\uC7A5\uD558\uAE30...
-SaveAction.text=\uB9F5 \uC800\uC7A5(&S)
-SaveAll.text=\uC5F4\uB824 \uC788\uB294 \uB9F5 \uBAA8\uB450 \uC800\uC7A5(&L)
-SaveAll.tooltip=\uC5F4\uB824 \uC788\uB294 \uB9F5 \uBAA8\uB450 \uC800\uC7A5
-SaveAsAction.text=\uB9F5 \uBCC4\uB3C4 \uC800\uC7A5(&A)...
+SaveAction.text=\uC9C0\uB3C4 \uC800\uC7A5(S)
+SaveAction_readonlyMsg=\uC774 \uC9C0\uB3C4\uB294 \uC77D\uAE30 \uC804\uC6A9\uC785\uB2C8\uB2E4. \uC9C0\uB3C4\uB97C \uC800\uC7A5\uD558\uB824\uBA74 ' \uD30C\uC77C-> \uC9C0\uB3C4\uB97C \uB2E4\uB978\uC774\uB984\uC73C\uB85C \uC800\uC7A5..' \uD558\uC2ED\uC2DC\uC624.
+SaveAction_readonlyTitle=\uC77D\uAE30 \uC804\uC6A9 \uC9C0\uB3C4\uB97C \uC800\uC7A5\uD558\uAE30
+SaveAll.text=\uC5F4\uB824 \uC788\uB294 \uC9C0\uB3C4 \uBAA8\uB450 \uC800\uC7A5(&L)
+SaveAll.tooltip=\uC5F4\uB824 \uC788\uB294 \uC9C0\uB3C4 \uBAA8\uB450 \uC800\uC7A5
+SaveAs_toReadonlyMsg={0} \uB294 \uC77D\uAE30 \uC804\uC6A9\uC785\uB2C8\uB2E4. \uB2E4\uB978 \uD30C\uC77C\uB85C \uC800\uC7A5 \uD558\uC2ED\uC2DC\uC624.
+SaveAs_toReadonlyTitle=\uC77D\uAE30 \uC804\uC6A9 \uD30C\uC77C\uC744 \uC800\uC7A5\uD558\uAE30
+SaveAsAction.text=\uB2E4\uB978\uC774\uB984\uC73C\uB85C \uC9C0\uB3C4 \uC800\uC7A5(&A)...
saved=\uC800\uC7A5\uB428
saving_canceled=\uC800\uC7A5 \uCDE8\uC18C\uB428
scanners_not_loaded=\uC2A4\uCE90\uB108\uB97C \uBD88\uB7EC\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uD30C\uC77C\uC774 \uC190\uC0C1\uB418\uC5C8\uC2B5\uB2C8\uB2E4
@@ -1467,11 +1542,15 @@ script_execution_disabled=\uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589\uC774 \uBE44\uD6
ScriptEditor.text=\uC2A4\uD06C\uB9BD\uD2B8 \uD3B8\uC9D1\uAE30(&C)...
ScriptEditor.tooltip=\uD504\uB9AC\uD50C\uB808\uC778\uC5D0\uC11C \uB354 \uD070 \uC2A4\uD06C\uB9BD\uD2B8\uB97C \uC791\uC131\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.
ScriptEditorPanel.changed_cancel=\uC2A4\uD06C\uB9BD\uD2B8\uAC00 \uBCC0\uACBD\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uBCC0\uACBD\uB41C \uB0B4\uC6A9\uC744 \uBB34\uC2DC\uD560\uAE4C\uC694?
+scripting=\uC2A4\uD06C\uB9BD\uD2B8
scripting_api_generator_legend=\uBC94\uB840
scripting_api_generator_proxy=\uD504\uB85D\uC2DC
scripting_api_generator_title=\uC2A4\uD06C\uB9BD\uD305 API
scripting_api_generator_utilities=\uC720\uD2F8\uB9AC\uD2F0
scripting_api_generator_web=\uC6F9 \uC790\uC6D0
+ScriptsRunToggleAction.ON_SELECTED_NODE.text=\uBAA8\uB4E0 \uC120\uD0DD\uB41C \uB178\uB4DC\uC5D0\uC11C \uC2A4\uD06C\uB9BD\uD2B8 \uC2E4\uD589
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=\uBC18\uBCF5\uC801\uC73C\uB85C \uC120\uD0DD\uB41C \uB178\uB4DC\uC5D0\uC11C \uC2A4\uD06C\uB9BD\uD2B8\uB97C \uC2E4\uD589
+ScriptsRunToggleAction.ON_SINGLE_NODE.text=\uC120\uD0DD\uB41C \uD558\uB098\uC758 \uB178\uB4DC\uC5D0\uC11C \uC2A4\uD06C\uB9BD\uD2B8\uB97C \uC2E4\uD589
select_favorites_folder=\uC990\uACA8\uCC3E\uB294 \uD3F4\uB354 \uC120\uD0DD
select_file_export_to=\uB0B4\uBCF4\uB0BC \uD30C\uC77C \uC120\uD0DD
select_folder_for_importing=\uB0B4\uBCF4\uB0BC \uD3F4\uB354 \uC120\uD0DD
@@ -1490,6 +1569,8 @@ set_accelerator_on_next_click_action=\uC0C8\uB85C\uC6B4 \uD0A4\uBCF4\uB4DC \uBC1
SetAccelerator.dialogTitle=\uB2E8\uCD95\uD0A4 \uC9C0\uC815
SetAccelerator.keystrokeDetected=\uD0A4\uC785\uB825 "{0}"\uC740 \uC5B4\uB5A0\uD55C \uBA54\uB274\uD56D\uBAA9\uC5D0\uB3C4 \uC9C0\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
SetAcceleratorOnNextClickAction.text=\uB2E8\uCD95\uD0A4 \uC9C0\uC815...
+SetAlwaysUnfoldedNodeFlagsAction.text=\uD3BC\uCCD0\uC9C4 \uB178\uB4DC \uC720\uC9C0
+SetAlwaysUnfoldedNodeFlagsAction.tooltip=\uD604\uC7AC \uD3BC\uCCD0\uC9C4 \uB178\uB4DC \uC811\uD798 \uBC29\uC9C0
SetImageByFileChooserAction.text=\uC774\uBBF8\uC9C0 (\uD30C\uC77C\uC120\uD0DD \uB610\uB294 \uB9C1\uD06C \uCD94\uAC00)...
SetLinkAnchorAction.text=\uB9C1\uD06C \uC575\uCEE4 \uC124\uC815
SetLinkAnchorAction.tooltip=<html>\uBBF8\uB798\uB97C \uC704\uD574 \uC575\uCEE4\uB85C \uC120\uD0DD\uD55C \uB178\uB4DC\uB97C \uC124\uC815\uD558\uAE30<br/>\uC9C0\uC5ED \uB610\uB294 \uC804\uC5ED \uC5F0\uACB0 \uC0DD\uC131.
@@ -1507,13 +1588,13 @@ ShowAllAttributesAction.text=\uBAA8\uB4E0 \uC18D\uC131 \uBCF4\uAE30
ShowAncestorsAction.text=\uC0C1\uC704 \uB178\uB4DC \uBCF4\uAE30
ShowAttributeDialogAction.text=\uC18D\uC131(\uC560\uD2B8\uB9AC\uBDF0\uD2B8) \uAD00\uB9AC\uC790 ...
ShowDescendantsAction.text=\uD558\uC704 \uB178\uB4DC \uBCF4\uAE30
-ShowFilterToolbarAction.text=\uD544\uD130 \uB3C4\uAD6C \uBAA8\uC6C0
+ShowFilterToolbarAction.text=\uAC70\uB984\uAE30 \uB3C4\uAD6C \uB9C9\uB300
ShowFormatPanel.text=\uC18D\uC131 \uD328\uB110
ShowFormatPanel.tooltip=\uB178\uB4DC\uC640 \uC904\uAE30\uC758 \uC18D\uC131\uC744 \uD55C \uBC88\uC5D0 \uBCC0\uACBD\uD560 \uC218 \uC788\uB294 \uB300\uD654\uC0C1\uC790\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4.
ShowHideNoteAction.text=\uB178\uD2B8 \uCC3D
ShowHideNoteAction.tooltip=\uB178\uD2B8 \uD328\uB110\uC774 \uB098\uD0C0\uB098\uAC70\uB098 \uC0AC\uB77C\uC9C0\uAC8C \uD569\uB2C8\uB2E4.
ShowNextChildAction.text=\uB2E4\uC74C \uD558\uC704 \uB178\uB4DC \uBCF4\uAE30
-ShowNotesInMapAction.text=\uB9F5\uC5D0 \uBA54\uBAA8\uB97C \uD45C\uC2DC
+ShowNotesInMapAction.text=\uC9C0\uB3C4\uC5D0 \uBA54\uBAA8\uB97C \uD45C\uC2DC
ShowSelectedAttributesAction.text=\uC120\uD0DD\uD55C \uC18D\uC131 \uBCF4\uAE30
ShowSelectionAsRectangleAction.text=\uC0AC\uAC01\uD615 \uBAA8\uC591\uC73C\uB85C \uC120\uD0DD \uCF1C\uAE30/\uB044\uAE30
simplyhtml.aboutFrameTitle=\uD504\uB85C\uADF8\uB7A8 \uC815\uBCF4
@@ -1620,7 +1701,7 @@ simplyhtml.matchApproximately=\uB300\uB7B5 \uC77C\uCE58
simplyhtml.matchApproximately.tooltip=<html>\uB300\uB7B5 \uC77C\uCE58 \uC5EC\uBD80\uB97C \uD5C8\uC6A9\uD569\uB2C8\uB2E4.??,<br/>\uC989, '\uD30C\uC77C'\uC744 \uAC80\uC0C9\uD558\uBA74 '\uD30C\uC774'\uB3C4\uCC3E\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4.</html>
simplyhtml.matchCase=\uB300\uC18C\uBB38\uC790 \uAD6C\uBD84
simplyhtml.matchCase.tooltip=\uAC80\uC0C9 \uC2DC \uB300\uC18C\uBB38\uC790 \uAD6C\uBD84 \uC5EC\uBD80.
-simplyhtml.newStyleDefaultName=\uC0C8 \uC2A4\uD0C0\uC77C
+simplyhtml.newStyleDefaultName=\uC0C8\uB85C\uC6B4 \uAF34
simplyhtml.nextTableCellLabel=\uB2E4\uC74C \uC140
simplyhtml.noLineLabel=\uC5C6\uC74C
simplyhtml.noMoreOccurrencesFound=\uB354 \uC774\uC0C1 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4
@@ -1632,7 +1713,7 @@ simplyhtml.paraAlignLeftLabel=\uC67C\uCABD \uC815\uB82C
simplyhtml.paraAlignLeftTip=\uC67C\uCABD\uC73C\uB85C \uBB38\uB2E8 \uC815\uB82C
simplyhtml.paraAlignRightLabel=\uC624\uB978\uCABD \uC815\uB82C
simplyhtml.paraAlignRightTip=\uC624\uB978\uCABD\uC73C\uB85C \uBB38\uB2E8 \uC815\uB82C
-simplyhtml.paraStyleDialogTitle=\uBB38\uB2E8 \uC2A4\uD0C0\uC77C
+simplyhtml.paraStyleDialogTitle=\uBB38\uB2E8 \uAF34
simplyhtml.paraTabLabel=\uBB38\uB2E8
simplyhtml.pasteHTMLLabel=HTML \uBD99\uC5EC\uB123\uAE30
simplyhtml.pasteLabel=\uBD99\uC5EC\uB123\uAE30
@@ -1663,9 +1744,9 @@ simplyhtml.selectAllLabel=\uBAA8\uB450 \uC120\uD0DD
simplyhtml.sizeLabel=\uD06C\uAE30
simplyhtml.standardStyleName=\uD45C\uC900
simplyhtml.strikeLabel=\uCDE8\uC18C\uC120
-simplyhtml.styleLabel=\uC2A4\uD0C0\uC77C
-simplyhtml.styleNameInputText=\uC0C8 \uC2A4\uD0C0\uC77C \uC774\uB984?
-simplyhtml.styleNameInputTitle=\uC2A4\uD0C0\uC77C\uC800\uC7A5
+simplyhtml.styleLabel=\uAF34
+simplyhtml.styleNameInputText=\uC0C8\uB85C\uC6B4 \uAF34 \uC774\uB984?
+simplyhtml.styleNameInputTitle=\uAF34 \uC800\uC7A5
simplyhtml.tableBgColLabel=\uBC30\uACBD\uC0C9:
simplyhtml.tableDialogTitle=\uD14C\uC774\uBE14 \uBAA8\uC591
simplyhtml.tableLabel=\uD45C
@@ -1696,20 +1777,21 @@ simplyhtml.wholeWordsOnly=\uC804\uCCB4 \uB2E8\uC5B4 \uC77C\uCE58
simplyhtml.wholeWordsOnly.tooltip=\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC744 \uC644\uC804\uD55C \uB2E8\uC5B4\uB9CC\uC73C\uB85C \uC81C\uD55C\uD569\uB2C8\uB2E4.
SortNodes.text=\uD558\uC704 \uB178\uB4DC \uC815\uB82C(&S)
SortNodes.tooltip=\uBAA8\uB4E0 \uD558\uC704 \uB178\uB4DC\uB4E4\uC744 \uC54C\uD30C\uBCB3 \uC21C\uC73C\uB85C \uC815\uB82C\uD569\uB2C8\uB2E4.
-split=\uB098\uB204\uAE30(&S)
+split=&\uB098\uB204\uAE30(&S)
SplitConditionAction.text=\uB098\uB204\uAE30
SplitNode.text=\uB178\uB4DC \uB098\uB204\uAE30(&S)
SplitNode.tooltip=<html>\uB178\uB4DC\uB294 \uB098\uB20C\uC218 \uC5C6\uC2B5\uB2C8\uB2E4.</html>
+SplitToWordsAction.text=\uC904\uC5D0\uC11C {0} \uAC1C\uC758 \uB2E8\uC5B4\uB85C \uB098\uB204\uAE30
STANDARD_FORMAT=\uD45C\uC900
stop_processing=\uBA48\uCDA4
StringFlavorHandler=\uB178\uB4DC \uACC4\uCE35 \uAD6C\uC870\uB85C \uC77C\uBC18 \uD14D\uC2A4\uD2B8
StructuredHtmlFlavorHandler=\uB178\uB4DC \uACC4\uCE35 \uAD6C\uC870\uB85C HTML
-style=\uC2A4\uD0C0\uC77C
-style_already_exists=\uC2A4\uD0C0\uC77C\uC774 \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4.
+style=\uAF34
+style_already_exists=\uC774\uBBF8 \uAF34\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4.
styledialog.cancel.text=\uCDE8\uC18C
styledialog.ok.text=\uD655\uC778
-styles=\uC2A4\uD0C0\uC77C(&Y)
-styles.AutomaticLayout=\uB77C\uBCA8 \uC2A4\uD0C0\uC77C\uC744 \uC801\uC6A9
+styles=\uAF34(&Y)
+styles.AutomaticLayout=\uB77C\uBCA8 \uAF34\uC744 \uC801\uC6A9
styles.connection=\uC5F0\uACB0
styles.date=\uB0A0\uC9DC
styles.definition=\uC6A9\uC5B4 \uC815\uC758
@@ -1723,22 +1805,27 @@ styles.needs_action=\uD589\uB3D9 \uD544\uC694
styles.note=\uBA54\uBAA8
styles.ok=\uD655\uC778
styles.pending=\uBCF4\uB958 \uC911
-styles.predefined=\uBBF8\uB9AC \uC815\uC758 \uB41C \uC2A4\uD0C0\uC77C
+styles.predefined=\uBBF8\uB9AC \uC9C0\uC815\uD55C \uAF34
styles.question=\uC9C8\uBB38
styles.quotation=\uC778\uC6A9
-styles.root_node=\uC2A4\uD0C0\uC77C
+styles.root_node=\uAF34
styles.subsubtopic=\uC18C\uC18C\uC8FC\uC81C
styles.subtopic=\uC18C\uC8FC\uC81C
styles.topic=\uC8FC\uC81C
-styles.user-defined=\uC0AC\uC6A9\uC790 \uC9C0\uC815 \uC2A4\uD0C0\uC77C
+styles.user-defined=\uC0AC\uC6A9\uC790 \uC9C0\uC815 \uAF34
styles.website=\uC6F9\uC0AC\uC774\uD2B8
-styles_menu=\uAC00\uB2A5\uD55C \uC2A4\uD0C0\uC77C
+styles_background_html=\n <html>\n <head>\n </head>\n <body>\n <table width="800" style="text-align: left; vertical-align: top">\n <tr valign="top">\n <th>\n <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold">\n\uC774 \uBAA8\uC591 \uC124\uC815\uC5D0 \uB300\uD574\n </div>\n <div style="text-align: left; font-weight: normal">\n <div style="margin: 3pt">\n\uC774 \uD45C\uC900\uC740 \uB354 \uC27D\uACE0 \uBE60\uB974\uAC8 [...]
+styles_menu=\uAC00\uB2A5\uD55C \uAF34
submenu_keystroke_in_use_error=\uD558\uC704 \uBA54\uB274 {1} \uC5D0 \uB300 \uD55C \uD0A4 {0} \uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uD0A4\uB97C \uC81C\uAC70 \uD569\uB2C8\uB2E4.
summary_nodes=\uC694\uC57D \uB178\uB4DC
summary_not_possible=\uD604\uC7AC \uC120\uD0DD \uC601\uC5ED\uC5D0 \uB300\uD574 \uC694\uC57D \uB178\uB4DC\uB97C \uB9CC\uB4E4 \uC218 \uC5C6\uC74C
-SummaryNodeAction.text=\uC694\uC57D \uB178\uB4DC (\uC124\uC815/\uC7AC\uC124\uC815)
svg=SVG
template_dir=\uD45C\uC900 \uC11C\uC2DD
+TextAlignAction.CENTER.text=\uC911\uC2EC \uD14D\uC2A4\uD2B8
+TextAlignAction.DEFAULT.text=\uAE30\uBCF8
+TextAlignAction.LEFT.text=\uAE00\uC744 \uC67C\uCABD \uC815\uB82C
+TextAlignAction.RIGHT.text=\uAE00\uC744 \uC624\uB978\uCABD \uC815\uB82C
+textalignment=\uAE00\uC790 \uC815\uB82C
TimeListAction.text=\uC2DC\uAC04 \uAD00\uB9AC\uBAA9\uB85D\uCC3D \uC5F4\uAE30 ...
TimeListAction.tooltip=\uBAA8\uB4E0 \uC2A4\uCF00\uC904 \uD56D\uBAA9\uACFC \uC774\uC5D0 \uC5F0\uACB0\uB41C \uB178\uB4DC \uBCF4\uC774\uAE30.
TimeManagementAction.text=\uB2EC\uB825 \uBCF4\uC774\uAE30...
@@ -1748,23 +1835,24 @@ ToggleDetailsAction.text=\uC138\uBD80\uC815\uBCF4 \uC228\uAE30\uAE30
ToggleFBarAction.text=F-Bar(\uAE30\uB2A5\uB9C9\uB300)
ToggleFoldedAction.text=\uD558\uC704 \uD56D\uBAA9 \uC811\uAE30
ToggleFullScreenAction.text=\uC804\uCCB4 \uD654\uBA74 \uBAA8\uB4DC
-ToggleLeftToolbarAction.text=\uC544\uC774\uCF58 \uB3C4\uAD6C \uC0C1\uC790 \uBCF4\uC774\uAE30/\uC228\uAE30\uAE30(&I)
+ToggleLeftToolbarAction.text=\uC544\uC774\uCF58 \uB3C4\uAD6C \uB9C9\uB300(&I)
ToggleMenubarAction.text=\uBA54\uB274 \uBCF4\uC774\uAE30/\uC228\uAE30\uAE30
ToggleScrollbarsAction.text=\uC2A4\uD06C\uB864 \uB9C9\uB300
ToggleStatusAction.text=\uC0C1\uD0DC \uD45C\uC2DC\uC904 \uD45C\uC2DC
-ToggleToolbarAction.text=\uB3C4\uAD6C \uC0C1\uC790 \uBCF4\uC774\uAE30/\uC228\uAE30\uAE30(&T)
+ToggleToolbarAction.text=\uB3C4\uAD6C \uB9C9\uB300(T)
+toolbars=\uB3C4\uAD6C \uB9C9\uB300
undefined_error=\uC608\uAE30\uCE58 \uC54A\uC740 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uBC84\uADF8 \uC2E0\uACE0\uB97C \uD574 \uC8FC\uC138\uC694.
underline=\uBC11\uC904
UnderlineAction.text=\uBC11\uC904
underlined=\uBC11\uC904
-UndoAction.text=\uC2E4\uD589 \uCDE8\uC18C(&U)
-UndoFilterAction.text=\uD544\uD130 \uB3D9\uC791 \uB418\uB3CC\uB9AC\uAE30
+UndoAction.text=\uC2E4\uD589 \uCDE8\uC18C(U)
+UndoFilterAction.text=\uAC70\uB984\uAE30 \uB3D9\uC791 \uB418\uB3CC\uB9AC\uAE30
unfold=\uD3BC\uCE58\uAE30
UnfoldAllAction.text=\uBAA8\uB4E0 \uB0B4\uC6A9 \uD3BC\uCE58\uAE30
UnfoldAllAction.tooltip=<html>\uC120\uD0DD\uD55C \uB178\uB4DC\uC640 \uD558\uC704 \uB178\uB4DC\uB97C \uBAA8\uB450 \uD3BC\uCE69\uB2C8\uB2E4.</html>
UnfoldOneLevelAction.text=1\uB2E8\uACC4\uB9CC \uD3BC\uCE58\uAE30
UnfoldOneLevelAction.tooltip=\uC120\uD0DD\uD55C \uB178\uB4DC\uB85C\uBD80\uD130 \uD55C \uB2E8\uACC4\uB9CC \uD3BC\uCE69\uB2C8\uB2E4.
-unparsedLatexPatternFormat=\uAD6C\uBB38 \uBD84\uC11D \uB418\uC9C0\uC54A\uC740 \uB77C\uD14D\uC2A4
+unparsedLatexPatternFormat=\uAD6C\uBB38 \uBD84\uC11D \uB418\uC9C0\uC54A\uC740 LaTeX
up=\uC704(&U)
UpConditionAction.text=\uC704\uB85C
update_failed={0} \uBA54\uC2DC\uC9C0\uC640 \uD568\uAED8 \uC5C5\uB370\uC774\uD2B8\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4
@@ -1784,17 +1872,19 @@ url_open_error=URL {0}\uC744(\uB97C) \uC5F4 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
used_in_menu=\uC774 \uB2E8\uCD95\uD0A4\uB294 \uC124\uC815\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4, \uADF8\uAC83\uC740 \uBA54\uB274 \uB2E8\uCD95\uD0A4\uB85C \uC0AC\uC6A9\uB429\uB2C8\uB2E4.
UsePlainTextAction.text=\uC77C\uBC18 \uD14D\uC2A4\uD2B8
user_config_folder=\uC0AC\uC6A9\uC790 \uAD6C\uC131 \uD3F4\uB354: {0}
-user_defined_filters=\uC0AC\uC6A9\uC790 \uC815\uC758 \uD544\uD130
+user_defined_filters=\uC0AC\uC6A9\uC790 \uC815\uC758 \uAC70\uB984\uAE30
user_defined_scale=\uC0AC\uC6A9\uC790 \uC815\uC758 \uD06C\uAE30(&U)
user_defined_zoom=\uC0AC\uC6A9\uC790 \uC815\uC758
user_defined_zoom_status_bar=\uC0AC\uC6A9\uC790\uAC00 \uC9C0\uC815\uD55C {0}%\uC758 \uD655\uB300\uC728\uB85C \uBCC0\uACBD \uC911.
user_icon=\uC0AC\uC6A9\uC790 \uC544\uC774\uCF58 "{0}"
user_template_dir=\uC0AC\uC6A9\uC790 \uC11C\uC2DD
user_zoom=\uC0AC\uC6A9\uC790 \uC815\uC758 \uD504\uB9B0\uD2B8 \uBE44\uC728 (0.0 - 2.0):
+userScripts=\uC2A4\uD06C\uB9BD\uD2B8
value_format=\uAC12 \uD615\uC2DD
version_up_to_date=\uC774\uBBF8 \uCD5C\uC2E0 \uBC84\uC804\uC744 \uC0AC\uC6A9\uD558\uACE0 \uC788\uC2B5\uB2C8\uB2E4
-ViewerControllerAction.text=\uC678\uBD80 \uAC1D\uCCB4...
+view=\uBCF4\uAE30(&V)
ViewLayoutTypeAction.OUTLINE.text=\uAC1C\uC694 \uBCF4\uAE30
+web_resources=\uC6F9 \uC790\uC6D0
WebDocuAction.text=\uC6F9 \uBB38\uC11C
width=\uB108\uBE44
wrong_regexp="{0}"\uC740 \uC798\uBABB\uB41C \uC815\uADDC\uC2DD\uC785\uB2C8\uB2E4, \uC624\uB958 {1}
@@ -1808,5 +1898,6 @@ xslt_export.ms_word=\uB9C8\uC774\uD06C\uB85C\uC18C\uD504\uD2B8 \uC6CC\uB4DC 2003
xslt_export.text=\uC11C\uC2DD \uC5C6\uB294 \uD14D\uC2A4\uD2B8
xslt_export_not_possible=\uD504\uB9AC\uD50C\uB808\uC778\uC6A9 XSLT \uB0B4\uBCF4\uB0B4\uAE30\uB97C \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4
yes=\uC608
+zoom=\uD655\uB300
ZoomInAction.text=\uD655\uB300
ZoomOutAction.text=\uCD95\uC18C
diff --git a/freeplane/resources/translations/Resources_lt.properties b/freeplane/resources/translations/Resources_lt.properties
index 98577f7..c857580 100644
--- a/freeplane/resources/translations/Resources_lt.properties
+++ b/freeplane/resources/translations/Resources_lt.properties
@@ -100,12 +100,12 @@ ExportToImage.png.text=\u012E PNG...
ExportToOoWriter.text=\u012E Open Office Writer dokument\u0105...
ExportToOoWriter.tooltip=I\u0161skleistos at\u0161akos formuoja strukt\u016Br\u0105, suskleistos - dokumento turin\u012F.
extension_menu=Fizinis stilius
+extras=\u012Erankiai
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=FAQ
file=Byla
file_already_exists=Byla {0} yra sukurta. Ar norite j\u0105 perra\u0161yti?
file_not_found=Byla {0} nerasta
-filter=filtras
filter_add=prid\u0117ti
filter_and=ir
filter_contains=turi
@@ -133,6 +133,7 @@ FoldOneLevelAction.tooltip=<html>Suskleid\u017Eia pasirinktas at\u0161akas vienu
font=\u0160riftas
FontFamilyAction.text=\u0161riftas
FontSizeAction.text=\u0161rifto dydis
+format=Stilius
format_menu_edge_styles=Kra\u0161tini\u0173 stiliai
format_menu_edge_widths=Kra\u0161tini\u0173 plo\u010Diai
FormatCopy.text=Kopijuoti stili\u0173
@@ -231,7 +232,6 @@ increase_branch_font_size=Didinti \u0161rift\u0105
IncreaseNodeFontAction.text=Didinti \u0161rift\u0105
ItalicAction.text=Paversti
italicise_branch=Paversti
-JoinNodesAction.text=Sujungti at\u0161akas
less_than_two_selected_nodes=Norint sujungti reikia pasirinkti bent dvi at\u0161akas.
link_not_available_any_more=Nuoroda nebegalioja. At\u0161aka buvo i\u0161trinta.
locking_failed_by_open=Nepavyko u\u017Erakinti \u017Eem\u0117lapio {0}. Atidarau kaip read-only.
@@ -243,12 +243,7 @@ map_already_exists=Toks \u017Eem\u0117lapis jau sukurtas. Ar norite i\u0161saugo
map_corrupted=\u017Dem\u0117lapis pa\u017Eeistas. Rodyti detales?
map_locked_by_open=\u017Dem\u0117lapis {0} redaguojamas vartotojo {1}. Atidarau kaip read-only.
map_locked_by_save_as=\u017Dem\u0117lapis {0} redaguojamas vartotojo {1}. ''I\u0161saugoti kaip'' sustabdoma.
-menu_extras=\u012Erankiai
-menu_file_import=Importuoti
-menu_format=Stilius
menu_insert=\u012Eterpti
-menu_navigate=Navigacija
-menu_view=\u017Di\u016Bra
mindmap=\u017Dem\u0117lapis
mindmaps=\u017Dem\u0117lapiai
mindmaps_desc=\u017Dem\u0117lapiai (*.mm)
@@ -260,6 +255,7 @@ ModesMenuAction.File.text=File Explorer[translate me]
ModesMenuAction.MindMap.text=Mind Map Editor[translate me]
most_recent_files=Pastarosios bylos
MoveToRootAction.text=Kelti \u012F \u0161akn\u012F
+navigate=Navigacija
NavigationNextMapAction.text=Kitas \u017Eem\u0117lapis
NavigationPreviousMapAction.text=Ankstesnis \u017Eem\u0117lapis
new_mindmap=Naujas \u017Eem\u0117lapis
@@ -543,7 +539,7 @@ simplyhtml.topLabel=top:[translate me]
simplyhtml.uLineLabel=Pabraukti
simplyhtml.undoLabel=At\u0161aukti
simplyhtml.valignLabel=Vert. Alignment:[translate me]
-split=Perskirti
+split=&Perskirti
style=Stilius
svg=SVG[translate me]
TimeListAction.text=Rodyti laiko tvarkara\u0161t\u012F ...
@@ -573,6 +569,7 @@ UsePlainTextAction.text=Use Plain Text[translate me]
user_defined_zoom=Vartotojo nustatytas.
user_defined_zoom_status_bar=Kei\u010Diu artinim\u0105 \u012F vartotojo nustatyt\u0105j\u012F: {0}%.
user_zoom=Spausdinimo m\u0105stelis: (0.0 - 2.0):
+view=\u017Di\u016Bra
width=Plotis
yes=Taip
ZoomInAction.text=Priartinti
diff --git a/freeplane/resources/translations/Resources_nb.properties b/freeplane/resources/translations/Resources_nb.properties
index ddf4ac7..af25a3d 100644
--- a/freeplane/resources/translations/Resources_nb.properties
+++ b/freeplane/resources/translations/Resources_nb.properties
@@ -47,7 +47,7 @@ addons.installer.missing.properties=Manglende egenskaper: {0}
addons.installer.success=Installasjonen gikk bra.\nStart programmet p\u00E5 nytt, s\u00E5 er tillegget tilgjengelig.
addons.installer.success.update=Oppdateringen fra {0} til {1} var vellykket.\nNoen funksjoner vil f\u00F8rst v\u00E6re tilgjengelige etter omstart.
addons.installer.too.new=Denne versjonen av Freeplane {0} er for ny. Dette tillegget st\u00F8tter opp til {1}
-addons.installer.too.old=Denne versjonen av Freeplane er for gammel. Dette tillegget krever minst {1}
+addons.installer.too.old=Denne versjonen av Freeplane {0} er for gammel. Dette tillegget krever minst {1}
addons.installer.update=Oppdater fra versjon {0}
addons.site=http://freeplane.sourceforge.net/addons/
AddStyleAttributes.text=Egenskaper fra mal
@@ -228,7 +228,7 @@ error_applying_template=Feil under bruk av XSL-mal.
error_creating_directory=F\u00E5r ikke opprettet omr\u00E5de for eksport.
export_pdf_text=Flyttbart dokumentformat (PDF)
export_svg_text=Skalerbar vektorgrafikk (SVG)
-ExportAction.text=&Eksporter kart\u2026
+ExportAction.text=Eksporter kart\u2026
ExportBranchToHTMLAction.text=Eksporter gren til HTML
ExportPdf.text=Som PDF...
ExportSvg.text=Som SVG...
@@ -238,12 +238,13 @@ ExportToImage.png.text=Som PNG...
ExportToOoWriter.text=Som Open Office Writer dokument...
ExportToOoWriter.tooltip=Utfoldede noder danner strukturen, foldede danner dokumentets innhold.
extension_menu=Fysisk stil
+extras=Verkt\u00F8y
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=FAQ (Ofte stilte sp\u00F8rsm\u00E5l)
file=Fil
file_already_exists=Filen {0} finnes. Overskrive?
file_not_found=Filen {0} finnes ikke
-filter=Filter
+filter=f&ilter
filter_add=Legg til
filter_and=Og
filter_conditions=Filtere
@@ -276,6 +277,7 @@ FoldOneLevelAction.tooltip=<html>Folder inn de valgte nodene ett niv\u00E5.</htm
font=Font
FontFamilyAction.text=Skriftfamilie
FontSizeAction.text=Skriftst\u00F8rrelse
+format=Format
format_menu_edge_styles=Kantstiler
format_menu_edge_widths=Kantbredder
FormatCopy.text=Kopier format
@@ -379,20 +381,19 @@ IconGroupPopupAction.office.text=Kontor
IconGroupPopupAction.smiley.text=Smil
IconSelectionPlugin.text=Velg ikon...
IconSelectionPlugin.tooltip=<html>Viser en popup med ikoner.</html>
-import=Importer
+import=Import
import_linked_branch_no_link=Den valgte noden har ingen lenke for \u00E5 importere.
ImportAction.text=Import
ImportBranchAction.text=Importer gren\u2026
ImportExplorerFavoritesAction.text=Importer explorer-favoritter\u2026
-ImportFolderStructureAction.text=&Importer filmappestruktur\u2026
+ImportFolderStructureAction.text=Importer filmappestruktur\u2026
ImportLinkedBranchAction.text=Importer lenkede grener
-ImportLinkedBranchWithoutRootAction.text=Importer gren &uten rot\u2026
+ImportLinkedBranchWithoutRootAction.text=Importer gren uten rot\u2026
ImportMindmanagerFiles.text=MindManager X5 Map...
increase_branch_font_size=St\u00F8rre (gren) skrift
IncreaseNodeFontAction.text=St\u00F8rre (gren) skrift
ItalicAction.text=Kursiv
italicise_branch=Kursiver
-JoinNodesAction.text=Knyt sammen noder
less_than_two_selected_nodes=Du m\u00E5 velge minst to noder for \u00E5 lenke dem.
link_not_available_any_more=Linken er ikke lenger tilgjengelig, den er slettet.
link_not_found=Link {0} ble ikke funnet.
@@ -410,13 +411,7 @@ map_locked_by_save_as=Mappen {0} blir rettet av bruker {1}. Kan ikke Lagre som..
map_not_saved=Kartet er ikke lagret fra f\u00F8r.
menu_attributes=Atributter
menu_copy=Kopier
-menu_extras=Verkt\u00F8y
-menu_file_import=Import
-menu_filter=f&ilter
-menu_format=Format
menu_insert=Sett inn
-menu_navigate=Naviger
-menu_view=Vis
mindmap=Tankekart
mindmaps=Tankekart
mindmaps_desc=Hjernekart (*.mm)
@@ -430,6 +425,7 @@ ModesMenuAction.File.text=File Explorer[translate me]
ModesMenuAction.MindMap.text=Mind Map Editor[translate me]
most_recent_files=Sist brukte filer
MoveToRootAction.text=Flytt til rot
+navigate=Naviger
NavigationNextMapAction.text=Neste kart
NavigationPreviousMapAction.text=Forrige kart
new_map_from_user_templates.text=Nytt kart fra mal...
@@ -575,8 +571,6 @@ OptionPanel.nodefontbold=Fet skrift
OptionPanel.nodefontitalic=Kursiv skrift
OptionPanel.nodefontname=Nodens skriftnavn
OptionPanel.nodefontsize=Nodens skriftst\u00F8rrelse
-OptionPanel.nodeshape=Nodens stil
-OptionPanel.nodeshape.tooltip=nodeshape.tooltip
OptionPanel.nodetext=Nodens tekst
OptionPanel.nodetext.tooltip=nodetext.tooltip
OptionPanel.nothing=Ingen
@@ -739,7 +733,7 @@ save_unsaved=Lagre hjernekart? :
SaveAction.text=Lagre
SaveAll.text=Lagre alle
SaveAll.tooltip=Lagrer alle \u00E5pne kart
-SaveAsAction.text=Lagre &som\u2026
+SaveAsAction.text=Lagre som\u2026
saved=Lagret
scheme_evaluate=Evaluer!
ScriptEditor.text=Skriptredigering...
@@ -933,7 +927,7 @@ simplyhtml.valignTop=topp
simplyhtml.wholeWordsOnly=Kun hele ord
SortNodes.text=Sorter barn
SortNodes.tooltip=Sorter alle barn til en node alfabetisk.
-split=Del
+split=&Del
SplitNode.text=Del node
SplitNode.tooltip=<html>Noden er delt</html>
style=Stil
@@ -964,6 +958,7 @@ UsePlainTextAction.text=Bruk normal tekst
user_defined_zoom=Brukerdefinert
user_defined_zoom_status_bar=Endre zoom-verdien til den brukerdefinerte zoom-verdien {0}%.
user_zoom=Utskriftens zoom-faktor (0.0 - 2.0):
+view=Vis
WebDocuAction.text=Web-dokumentasjon
width=Bredde
yes=Ja
diff --git a/freeplane/resources/translations/Resources_nl.properties b/freeplane/resources/translations/Resources_nl.properties
index 703e68c..9760b41 100644
--- a/freeplane/resources/translations/Resources_nl.properties
+++ b/freeplane/resources/translations/Resources_nl.properties
@@ -35,6 +35,7 @@ actual_node_styles=Conditionele stijl op knoopniveau
add=&Toevoegen
AddConnectorAction.text=Toevoegen verbindingslijn
AddElementaryConditionAction.text=Toevoegen
+AddExecutionLinkAction.text=Snelkoppeling naar OS opdracht...
AddLocalLinkAction.text=Snelkoppeling naar andere knoop
AddMenuItemLinkAction.text=Snelkoppeling naar menutoegang...
AddOnDetailsPanel.authored.by=Door {0}
@@ -82,8 +83,8 @@ antialias_all=Alles verzachten
antialias_edges=Takken verzachten
antialias_none=Niets verzachten
apply=&Toepassen
-ApplyAction.text=&Toepassen
-ApplyFormatPlugin.text=&Algemene knoopstijl wijzigen...
+ApplyAction.text=Toepassen
+ApplyFormatPlugin.text=Algemene knoopstijl wijzigen...
ApplyFormatPlugin.tooltip=Toont dialoogvenster waarin alle eigenschappen van knopen en lijnen in \u00E9\u00E9n keer gewijzigd kunnen worden....
ApplyNoFilteringAction.text=Stoppen filteren
ApplySelectedViewConditionAction.text=Niet-geselecteerde knopen verbergen
@@ -96,6 +97,7 @@ attribute_delete_value=Deze waarde wissen
attribute_font_size_tooltip=Tekengrootte van attribuut
attribute_list_box_label_text=Bestaande waarden
attribute_name=Attribuutnaam
+attribute_name_or_value=Attribuutnaam of waarde
attribute_replace=Vervangen door
attribute_top=Alle bekende attributen voor de geladen Mindmaps
attribute_value=Attribuutwaarde
@@ -137,14 +139,19 @@ attributes_visible_tooltip=Geselecteerde attibuten tonen
automatic_layout=Automatische layout
automatic_layout_disabled=Uitgeschakeld
automatically_save_message=De Mindmap werd automatisch opgeslagen met de bestandsnaam {0} ...
+AutomaticEdgeColor.FOR_BRANCHES=t.b.v. vertakkingen
+AutomaticEdgeColor.FOR_COLUMNS=t.b.v. kolommen
+AutomaticEdgeColor.FOR_LEVELS=t.b.v. niveaus
+AutomaticEdgeColor.ON_BRANCH_CREATION=tijdens aanmaak van aftakking
AutomaticEdgeColorHookAction.text=Automatische takkleur
AutomaticLayout.ALL=Voor alles
AutomaticLayout.HEADINGS=Voor kopjes (headings)
AutomaticLayout.level=Kop {0}
AutomaticLayout.level.root=Titel
-AutomaticLayoutAction.text=&Opmaken per knoopniveau
+AutomaticLayoutAction.text=Opmaken per knoopniveau
AutomaticLayoutAction.tooltip=<html> Herstelt de standaardopmaak van de mindmap. <br>Het eerste niveau is zwart, het tweede blauw enz.</html>
AutomaticLayoutControllerAction.ALL.text=voor alle knopen
+AutomaticLayoutControllerAction.COLUMNS.text=kolommen
AutomaticLayoutControllerAction.HEADINGS.text=voor niet-bladeren
AutomaticLayoutControllerAction.null.text=uitgeschakeld
BackAction.text=Achteruit in sequentie
@@ -161,17 +168,20 @@ branch=Tak
browse=Verkennen...
calendar_attributes_panel=Agenda en attributen
calendar_panel=Agenda
+can_not_clone_encrypted_node=versleutelde knooppunten kunnen niet gekopieerd worden
can_not_connect_to_info_server=Kan geen verbinding maken met de server
can_not_delete_predefined_style=Kan voorgedefinieerde opmaakstijl niet wissen
can_not_delete_root_style=Kan opmaakstijl stamknoop niet wissen
can_not_delete_style_group=Kan sijlgroep niet wissen
+can_not_encrypt_cloned_node=gekopieerde knopen kunnen niet versleuteld worden
can_not_save_key_set=Kan de set met sneltoetsen niet bewaren
cancel=&Annuleren
-CancelAction.text=&Annuleren
+CancelAction.text=Annuleren
cannot_add_parent_diff_parents=Alle knopen moeten dezelfde ouder hebben om deze functie te kunnen gebruiken.
cannot_add_parent_to_root=De stamknoop kan niet aan een nieuwe ouderknoop worden gekoppeld.
cannot_delete_root=De stamknoop kan niet worden verwijderd.
cannot_join_nodes_with_children=Knopen met takken (kindknopen) kunnen niet worden samengevoegd
+cannot_move_into_child_node=de onderliggende knoop is niet beschikbaar
cannot_move_to_child=Een ouderknoop kan niet direkt aan zijn kindknoop worden gehangen.
CenterAction.text=Centreren
CenterSelectedNodeAction.text=Geselecteerde knoop centreren
@@ -196,8 +206,10 @@ choose_node_background_color=Kies achtergrondkleur knoop:
choose_node_color=Kies tekstkleur voor de knoop:
ClearLinkAnchorAction.text=Wissen koppelingsanker
ClearLinkAnchorAction.tooltip=<html>wis eerder ingesteld knoopanker</html>
+CloneAction.text=invoegen van kopie
close_btn=Sluiten
-CloseAction.text=&Sluiten mindmap
+CloseAction.text=Sluiten mindmap
+cloud_shapes=cloud vormen
CloudAction.text=Maken/verwijderen wolk
CloudColorAction.text=Kleur wolk...
CloudShapeAction.ARC.text=Boog
@@ -214,6 +226,7 @@ connector_label=Label bij verbindingslijn
connector_lines=Lijnvorm verbindingslijn
connector_shapes=Bochtvorm verbindingslijn
ConnectorColorAction.text=Kleur verbindingslijn...
+ConvertCloneToIndependentNodeAction.text=verwijder kopie
CopyAction.text=Kopi\u00EBren
CopyAction.tooltip=Kopieer geselecteerde tak
CopyAttributes.text=Kopi\u00EBren attributen
@@ -228,7 +241,7 @@ corrupt_map=De inhoud van de mindmap is beschadigd
CreateConjunctConditionAction.text=En
CreateDisjunctConditionAction.text=Of
CreateNotSatisfiedConditionAction.text=Niet
-CreationModificationPluginAction.text=&Tonen wanneer gewijzigd
+CreationModificationPluginAction.text=Tonen wanneer gewijzigd
CreationModificationPluginAction.tooltip=<html> Deze functie houdt bij wanneer knopen gemaakt en gewijzigd zijn.</html>
current_dir=Mindmaps
CutAction.text=Knippen
@@ -333,7 +346,7 @@ export_failed=xporteren is mislukt
export_pdf_text=PDF, Portable Document Format
export_svg_text=SVG, Scalable Vector Graphic
export_using_xslt=Exporteren naar:
-ExportAction.text=&Exporteren...
+ExportAction.text=Exporteren...
ExportBranchAction.text=Exporteren tak als nieuwe mindmap...
ExportBranchToHTMLAction.text=HTML, volledige tak
exported_file={0} bestand
@@ -353,6 +366,7 @@ ExternalImageChangeAction.text=Wijzig afbeelding...
ExternalImageRemoveAction.text=Verwijderen afbeelding
ExtractLinkFromTextAction.text=Koppeling uit tekstadres
ExtractLinkFromTextAction.tooltip=Maak snelkoppeling van adres in kern
+extras=Extra
f_button_unassigned=<geen actie>
FaqOpenURLAction.text=FAQ
file=&Bestand
@@ -383,7 +397,7 @@ FileRevisionsDialog.question=Versies (Revisies) gevonden van {0}
FileRevisionsDialog.restore=Herstellen
FileRevisionsDialog.restore.tooltip=Vervangen {0} door {1}
FileRevisionsDialog.title=Bestandsversies(revisies)
-filter=Filter
+filter=Filteren
filter_add=&Toevoegen
filter_and=&En
filter_any_text=Kern, details of notitie
@@ -433,11 +447,11 @@ filter_selected_node_view=Huidige geselecteerde knopen
filter_selected_node_view_snapshot=Opgeslagen selectie
filter_style=Opmaakstijl
filter_time=Tijdstip
-FilterComposerDialog.save=Bewaren
filters_not_loaded=Filter kon niet worden geladen, bestand is beschadigd
find_what=Zoek welke
FindAction.text=Zoeken...
-FirstGroupNodeAction.text=Eerste knoop van groep
+FindNextAction.text=Volgende zoeken
+FindPreviousAction.text=Vorige zoeken
fit_map_to_page=Op \u00E9\u00E9n pagina laten passen
fit_map_to_page_height=Maak de hoogte passend op de pagina
fit_map_to_page_width=Maak de breedte passend op de pagina
@@ -453,6 +467,7 @@ FollowLinkAction.text=Openen hyperlink
font=Lettertype
FontFamilyAction.text=Lettertypenaam (font)
FontSizeAction.text=Lettertypegrootte
+format=O&pmaken
format_invalid_pattern=Geen geldig patroon
format_menu_cloud_shapes=Toevoegen wolk of veranderen vorm
format_menu_edge_styles=Vorm tak
@@ -648,7 +663,7 @@ image_covertLink=Converteer koppeling naar afbeelding
ImageFlavorHandler=Afbeelding (gebruik apart bestand)
import=Importeren
import_linked_branch_no_link=De geselecteerde knoop heeft geen hyperlink om de afbeelding te importeren.
-ImportAction.text=&Importeren
+ImportAction.text=Importeren
ImportBranchAction.text=Importeren volledige tak...
ImportExplorerFavoritesAction.text=Importeren Explorer-favorieten...
ImportFolderStructureAction.text=Importeren mappenstructuur...
@@ -666,7 +681,6 @@ invalid_url_msg=Kon geen geldige URL maken voor (0)
ItalicAction.text=Schuin
italicise_branch=Schuin
java_version=Java versie: {0}
-JoinNodesAction.text=Samenvoegen knopen
latex_editor=Bewerken LaTeX formule
LatexDeleteLatexAction.text=Verwijderen formule (LaTex)
LatexEditLatexAction.text=Bewerken formule (LaTeX)...
@@ -680,6 +694,7 @@ license_text=<html>Dit programma is gratis software; U kunt het opnieuw distribu
link_error=Onjuiste koppeling "{0}" niet geopend
link_not_available_any_more=De koppeling werkt niet meer. De knoop is ondertussen verwijderd.
link_not_found=Koppeling {0} niet gevonden.
+links=Koppeling
load=Laden
load_accelerator_presets=Laden
LoadAcceleratorPresetsAction.textPatterns.text=Sets met sneltoetsen
@@ -747,10 +762,6 @@ menu_displayAttributes=Knoopattributen
menu_encryption=Knoopbeveiliging
menu_error=Fout in door de gebruiker defefinieerde menustructuur {0}:\n{1}\nAborting
menu_extensions=Knoopuitbreiding
-menu_extras=Extra
-menu_file_import=Importeren
-menu_filter=Filteren
-menu_format=O&pmaken
menu_group=Knoopgroep
menu_hoverView=Tooltips (zweeftekst)
menu_iconByCategory=Pictogram per categorie...
@@ -758,26 +769,20 @@ menu_iconView=Pictogrammen
menu_image=Afbeelding
menu_insert=Invoegen
menu_latex_formula=Formule tonen (LaTeX)
-menu_links=Koppeling
menu_manageStyles=Beheren stijlen
menu_moveNode=Verplaatsen en sorteren
-menu_navigate=Navigeren
menu_newNode=Nieuwe knoop
menu_node=Knoop
menu_node_features=Knoopkenmerken
menu_nodes=Knoop
menu_nodeView=Knoopkern
-menu_notes=Knoopnotitie
menu_noteView=Knoopnotitie
menu_openmaps=Mindmap
-menu_progress=%Schijf
menu_remove_icons=Verwijderen pictogrammen
menu_removeAttribute=Verwijderen attribuut
menu_select=Selecteren
menu_time=Agenda
menu_title=Knoopkern
-menu_toolbars=Werkbalken
-menu_view=Beel&d
menu_viewmode=Beeldinstelling
MenuUtils.invalid_menuitem={0} is geen geldige menu-elementsleutel.
mindmap=Mindmap
@@ -799,6 +804,7 @@ ModesMenuAction.MindMap.text=Mindmapbewerker
most_recent_files=&Onlangs geopend
MoveToRootAction.text=Naar stamknoop
NameConditionAction.text=Naam toekennen
+navigate=Navigeren
NavigationNextMapAction.text=Volgende mindmap
NavigationPreviousMapAction.text=Vorige mindmap
new=&Nieuw
@@ -819,7 +825,6 @@ NewerFileRevisionsFoundDialog.question=Nieuwere versie gevonden van {0}!
NewerFileRevisionsFoundDialog.restore=Herst&ellen
NewerFileRevisionsFoundDialog.restore.tooltip=Vervangen {0} door {1}
NewerFileRevisionsFoundDialog.title=Er zijn nieuwere bestandsversies gevonden!
-NewFreeNodeAction.text=Nieuwe vrije knoop
NewLevelStyleAction.text=Toevoegen automatische opmaakstijlniveau
newmap.install.addon.question={0} lijkt een add-on \nWilje deze installeren?\n(Kies "Nee" om normaal te openen.)
newmap.install.addon.title=Add-on installeren ?
@@ -851,26 +856,26 @@ node_location_help=Slepen verandert de plaats van de knoop, ctrl+slepen verander
node_selector=Knoopselectie
node_selector_message=Klik dubbel om knoop te selekteren
node_styles=Knoop stijlen
-NodeBackgroundColorAction.text=&Knoopachtergrondkleur...
-NodeColorAction.text=&Tekstkleur...
-NodeColorBlendAction.text=K&leiner kleurcontrast
+NodeBackgroundColorAction.text=Knoopachtergrondkleur...
+NodeColorAction.text=Tekstkleur...
+NodeColorBlendAction.text=Kleiner kleurcontrast
NodeDownAction.text=Knoop naar beneden
NodeExtensions.EditNodeExtensions=Bewerken tekstextenties
NodeExtensions.RemoveNodeExtensions=Verwijderen tekstextenties
NodeListAction.text=Zoeken en vervangen...
NodeListAction.tooltip=Tonen alle knopen als doorzoekbare lijst met filterkenmerken.
-NodeShapeAction.bubble.text=Knoop met &omlijning
+NodeShapeAction.bubble.text=Knoop met omlijning
NodeShapeAction.fork.text=Knoop zonder omlijning
NodeUpAction.text=Knoop naar boven
-NodeWidthAction.text=Instellen grenzen knoopbreedte
nonboldify_branch=Vet uitschakelen
nonitalicise_branch=Schuin uitschakelen
normal=Normaal
not_saved_for_image_error=De mindmap moet opgeslagen worden voordat je een afbeelding kunt toevoegen met de bestandskiezer of via een hyperlink
not_saved_for_link_error=De mindmap moet zijn voor je met de bestandskiezer een hyperlink kunt toevoegen
note_window_location=Positie notitiehulpvenster
+notes=Knoopnotitie
ok=OK
-OKAction.text=&OK
+OKAction.text=OK
OnlineReference.text=Online documentatiemindmaps
open_asMindMap=Miindmap
OpenAction.text=Openen mindmap...
@@ -1099,8 +1104,6 @@ OptionPanel.nodeformat=Sjabloon / Formaat
OptionPanel.nodeformat.tooltip=<htm>Text replacement and/or formatting:<ul><li><em>Template expansion</em> (<tt>%s</tt> is the original text), e.g. <tt>BEWARE: %s</tt><li><em>Formatting of dates and numbers</em> - see the examples in the selection box</ul></html>
OptionPanel.nodenumbering=Knoop nummering
OptionPanel.nodenumbering.tooltip=Toevoegen volgnummer (b.v. 1.3.1) aan basis knooptekst.
-OptionPanel.nodeshape=Omlijning
-OptionPanel.nodeshape.tooltip=<html> De knoop kan wel of niet omlijnd zijn en de takken tussen knopen kunnen verschillende vormen hebben. Zie handleiding. </html>
OptionPanel.nodetext=Basistekst
OptionPanel.nodetext.tooltip=Hier kun je de knooptekst intypen. De tekst die al in de knoop stond wordt daarbij gewist.
OptionPanel.nothing=Niets
@@ -1330,7 +1333,7 @@ org.freeplane.plugin.bugreport.wanted_bug=Er deed zich een interne fout voor en
org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined=Knoop {0} is niet gedefinieerd
out_of_memory=Onvoldoende geheugen beschikbaar.
overwrite_keyset_question=Bestaande set met sneltoetsen overschrijven?
-PageAction.text=&Afdrukinstellingen...
+PageAction.text=Afdrukinstellingen...
password_is_not_ascii=Wachtwoord bevat andere tekes dan ASCII
PasteAction.text=Plakken
PasteAttributes.text=Plakken attributen
@@ -1404,7 +1407,8 @@ print_preview_title=Afdrukvoorbeeld
PrintAction.text=Afdrukken mindmap...
PrintDirectAction.text=Afdrukken
printing_settings=Pagina-afdrukinstellingen
-PrintPreviewAction.text=&Afdrukvoorbeeld...
+PrintPreviewAction.text=Afdrukvoorbeeld...
+progress=%Schijf
PropertyAction.dialog=Instellingen
PropertyAction.text=Instellingen...
QuickFilterAction.text=Filteren mindmap
@@ -1447,10 +1451,11 @@ replace_shortcut_title=Sneltoets vervangen ?
ReportBugAction.text=Melden van een fout
RequestFeatureAction.text=Vragen om een nieuwe functie
reset_to_default=Terug naar de standaardinstelling
-ResetNodeLocationAction.text=&Herstellen oorspronkelijke knoopposities
+ResetNodeLocationAction.text=Herstellen oorspronkelijke knoopposities
ResetStyleAction.text=Herstel knoopstijl
-RevertAction.text=&Terug gaan naar opgeslagen versie
+RevertAction.text=Terug gaan naar opgeslagen versie
RevisionPluginAction.text=Tonen revisies door achtergrondkleur
+save=Bewaren
save_failed=Bewaren van mindmap {0} is mislukt.
save_unsaved=De volgende mindmap bewaren?
save_unsaved_styles=Niet-bewaarde stijlen bewaren?
@@ -1505,7 +1510,7 @@ SetShortenerStateAction.text=Minimaliseren knoop
sf_login_required=Loging bij Source Forge vereist. Doorgaan?
ShowAllAttributesAction.text=Tonen alle attibuten
ShowAncestorsAction.text=Ook voorouders tonen
-ShowAttributeDialogAction.text=&Tonen en verbergen attributen....
+ShowAttributeDialogAction.text=Tonen en verbergen attributen....
ShowDescendantsAction.text=Ook afstammelingen tonen
ShowFilterToolbarAction.text=Tonen filtermenu
ShowFormatPanel.text=Tonen opmaakpaneel
@@ -1736,7 +1741,6 @@ styles_menu=Stijlen
submenu_keystroke_in_use_error=Toets {0} kan niet voor submenu {1} worden gebruikt. Toets vewijderd.
summary_nodes=Groepsknopen
summary_not_possible=Kan voor huidige selectie geen groepsknoop maken
-SummaryNodeAction.text=Groepsknoop aan/uitzetten
svg=SVG
template_dir=Standaard mindmapstijlen
TimeListAction.text=Managen taken...
@@ -1753,6 +1757,7 @@ ToggleMenubarAction.text=Tonen hoofdmenu
ToggleScrollbarsAction.text=Schuifbalken
ToggleStatusAction.text=Tonen statuslijn
ToggleToolbarAction.text=Tonen werkmenu
+toolbars=Werkbalken
undefined_error=Er is een onverwachte fout opgetreden. Probeer er een foutmelding van te maken.
underline=Onderstreept
UnderlineAction.text=Onderstrepen
@@ -1791,7 +1796,7 @@ user_template_dir=Door de gebruiker gedefinieerde mindmapstijlen
user_zoom=Zoomfactor (0.0 - 2.0) voor afdrukken:
value_format=Waardeformaat
version_up_to_date=Je gebruikt al de meest recente versie
-ViewerControllerAction.text=Schaalbare afbeelding...
+view=Beel&d
ViewLayoutTypeAction.OUTLINE.text=Tonen overzichtsweergave
WebDocuAction.text=Web Documentatie
width=Breedte
@@ -1806,5 +1811,6 @@ xslt_export.ms_word=Microsoft Word 2003 XML
xslt_export.text=Platte tekst
xslt_export_not_possible=Exporteren Freeplane XLST is niet mogelijk
yes=Ja
+zoom=Zoom
ZoomInAction.text=Inzoomen
ZoomOutAction.text=Uitzoomen
diff --git a/freeplane/resources/translations/Resources_nn.properties b/freeplane/resources/translations/Resources_nn.properties
index 3d69291..29b8796 100644
--- a/freeplane/resources/translations/Resources_nn.properties
+++ b/freeplane/resources/translations/Resources_nn.properties
@@ -105,12 +105,13 @@ ExportToImage.png.text=Som PNG ...
ExportToOoWriter.text=Som Open Office Writer-dokument ...
ExportToOoWriter.tooltip=Samanbretta noder viser strukturen, utbretta noder viser innhaldet i dokumentet.
extension_menu=Fysisk stil
+extras=Verkt\u00F8y
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=SOS - Sp\u00F8rsm\u00E5l og svar (FAQ)
file=Fil
file_already_exists=Fila {0} finst allereie. Vil du skriva over ho?
file_not_found=Fann ikkje fila {0}
-filter=filter
+filter=Filter[translate me]
filter_add=legg til
filter_and=og
filter_contains=inneheld
@@ -138,6 +139,7 @@ FoldOneLevelAction.tooltip=<html>Bretter saman dei valde nodane med eitt niv\u00
font=Skrifttype
FontFamilyAction.text=skrifttypefamilie
FontSizeAction.text=skriftstorleik
+format=Format
format_menu_edge_styles=Linjestilar
format_menu_edge_widths=Linjebreidder
FormatCopy.text=Kopiformat
@@ -224,7 +226,7 @@ IconGroupPopupAction.office.text=Office[translate me]
IconGroupPopupAction.smiley.text=Smiley[translate me]
IconSelectionPlugin.text=Vel ikon ...
IconSelectionPlugin.tooltip=<html>Her kan du bruka eit undervindauge til \u00E5 velja eit ikon.</html>
-import=Importer
+import=Import
import_linked_branch_no_link=Den valde noden har ingen peikar \u00E5 importera fr\u00E5.
ImportAction.text=Import[translate me]
ImportBranchAction.text=Grein ...
@@ -237,7 +239,6 @@ increase_branch_font_size=St\u00F8rre skrift
IncreaseNodeFontAction.text=St\u00F8rre skrift
ItalicAction.text=Kursiv
italicise_branch=Kursiver
-JoinNodesAction.text=Sl\u00E5 saman nodar
less_than_two_selected_nodes=Du m\u00E5 velja minst to nodar for \u00E5 laga peikarar.
link_not_available_any_more=Peikaren er ikkje lenger gyldig. Noden er blitt sletta.
load=Load[translate me]
@@ -250,13 +251,7 @@ map_already_exists=Kartet finst allereie. Vil du skriva over det?
map_corrupted=\u00D8ydelagt kart. Vil du sj\u00E5 detaljar?
map_locked_by_open=Kartet {0} blir brukt av brukaren {1}. Blir opna som skrivebeskytta.
map_locked_by_save_as=Kartet {0} blir brukt av brukaren {1}. Handlinga "Lagra som" avbroten.
-menu_extras=Verkt\u00F8y
-menu_file_import=Import
-menu_filter=Filter[translate me]
-menu_format=Format
menu_insert=Set inn
-menu_navigate=Navigasjon
-menu_view=Vising
mindmap=Kart
mindmaps=Kart
mindmaps_desc=Kart (*.mm)
@@ -270,6 +265,7 @@ ModesMenuAction.File.text=File Explorer[translate me]
ModesMenuAction.MindMap.text=Mind Map Editor[translate me]
most_recent_files=Siste filer
MoveToRootAction.text=Flytt til rot
+navigate=Navigasjon
NavigationNextMapAction.text=Nytt kart
NavigationPreviousMapAction.text=Tidlegare kart
new_mindmap=Nytt tankekart
@@ -555,7 +551,7 @@ simplyhtml.topLabel=top:[translate me]
simplyhtml.uLineLabel=Strek under
simplyhtml.undoLabel=Angra
simplyhtml.valignBaseline=baseline[translate me]
-split=Splitt
+split=&Splitt
SplitNode.text=Split Node[translate me]
style=Stil
svg=SVG[translate me]
@@ -584,6 +580,7 @@ url_load_error=Klarte ikkje \u00E5 lasta kartet fr\u00E5 adressa:
user_defined_zoom=Brukarstyrt.
user_defined_zoom_status_bar=Endrar skaleringa til den brukarstyrte verdien {0}%.
user_zoom=Skaleringsfaktor for utskrift (0.0 - 2.0):
+view=Vising
width=Breidd
yes=Ja
ZoomInAction.text=Gjer st\u00F8rre
diff --git a/freeplane/resources/translations/Resources_pl.properties b/freeplane/resources/translations/Resources_pl.properties
index bb39dea..e5c336c 100644
--- a/freeplane/resources/translations/Resources_pl.properties
+++ b/freeplane/resources/translations/Resources_pl.properties
@@ -1,12 +1,13 @@
+about=O programie
about_text=Freeplane - wolne oprogramowanie do budowania map pami\u0119ci i baz wiedzy
AboutAction.text=O programie
-acceleratorPresets=Ustawienia skr\u00f3t\u00f3w klawiszowych
-accelerators_loading_error=Nie mog\u0119 za\u0142adowa\u0107 skr\u00f3t\u00f3w klawiszowych z {0}
-accessories/plugins/ApplyFormatPlugin.dialog.title=Zmien format w\u0119z\u0142\u00f3w
+acceleratorPresets=Ustawienia skr\u00F3t\u00F3w klawiszowych
+accelerators_loading_error=Nie mog\u0119 za\u0142adowa\u0107 skr\u00F3t\u00F3w klawiszowych z {0}
+accessories/plugins/ApplyFormatPlugin.dialog.title=Zmien format w\u0119z\u0142\u00F3w
accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=Zmie\u0144 szablon
accessories/plugins/EncryptNode.properties_0=Podaj has\u0142o dla zakodowanego w\u0119z\u0142a
accessories/plugins/EncryptNode.properties_1=Has\u0142a nie s\u0105 zgodne lub s\u0105 zbyt kr\u00F3tkie.
-accessories/plugins/EncryptNode.properties_2=Wprowad\u017a has\u0142o:
+accessories/plugins/EncryptNode.properties_2=Wprowad\u017A has\u0142o:
accessories/plugins/EncryptNode.properties_3=Powt\u00F3rz has\u0142o:
accessories/plugins/EncryptNode.properties_4=Podaj has\u0142o dla zaszyfrowanego w\u0119z\u0142a.
accessories/plugins/EncryptNode.properties_5=Pami\u0119taj, \u017Ce si\u0142a szyfrowania zale\u017Cy prawie ca\u0142kowicie od trudno\u015Bci has\u0142a.
@@ -17,7 +18,7 @@ accessories/plugins/EncryptNode.properties_select_me=Nowa mindmapa
accessories/plugins/EncryptNode.properties_wrong_password=Has\u0142o nie jest prawid\u0142owe.
accessories/plugins/ExportWithTWiki.text=Jako TWiki...
accessories/plugins/ExportWithTWiki.tooltip=Eksportuje map\u0119 jako dokument TWiki.
-accessories/plugins/ExportWithXSLT.tooltip=<html> To og\u00F3lna metoda eksportu przy u\u017Cyciu skrypt\u00F3w XSLT</html>
+accessories/plugins/ExportWithXSLT.tooltip=Jest to og\u00F3lna metoda eksportu.
accessories/plugins/ExportWithXSLT_Applet.text=Do apletu Javy ...
accessories/plugins/ExportWithXSLT_Applet.tooltip=Eksportuj map\u0119 do apletu javy.
accessories/plugins/ExportWithXSLT_Flash.text=Do animacji Flash...
@@ -28,53 +29,53 @@ accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=Zasoby z w\u0119z\u0142a RE
accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>Eksportuje zasoby z w\u0119z\u0142a RESOURCES do modu\u0142u Taskjugglera. </html>
accessories/plugins/ExportWithXSLT_TASKSTJI.text=Zadania z w\u0119z\u0142a TASKS do pliku TJI...
accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>Eksportuje zadania z w\u0119z\u0142a TASKS do modu\u0142u Taskjugglera. </html>
-action_keystroke_in_use_error=Klawisz {0} wybrany dla polecenia {1} jest ju\u017c u\u017cywany przez polecenie {2}
+action_keystroke_in_use_error=Klawisz {0} wybrany dla polecenia {1} jest ju\u017C u\u017Cywany przez polecenie {2}
active=Aktywny
actual_map_styles=Warunkowe style mapy zastosowane do w\u0119z\u0142a
actual_node_styles=Warunkowe style w\u0119z\u0142a zastosowane do w\u0119z\u0142a
add=Dodaj
AddConnectorAction.text=Po\u0142\u0105cz
AddElementaryConditionAction.text=Dodaj
-AddLocalLinkAction.text=Dodaj odno\u015bnik do innego w\u0119z\u0142a
-AddMenuItemLinkAction.text=Dodaj odno\u015bnik do polecenia z menu...
+AddLocalLinkAction.text=Dodaj odno\u015Bnik do innego w\u0119z\u0142a
+AddMenuItemLinkAction.text=Dodaj odno\u015Bnik do polecenia z menu...
AddOnDetailsPanel.authored.by=autorstwa {0}
AddOnDetailsPanel.header.function=Funkcja
-AddOnDetailsPanel.header.menu=Po\u0142o\u017cenie menu
-AddOnDetailsPanel.header.shortcut=Skr\u00f3t
+AddOnDetailsPanel.header.menu=Po\u0142o\u017Cenie menu
+AddOnDetailsPanel.header.shortcut=Skr\u00F3t
AddOnDetailsPanel.homepage=Strona domowa:
addons.installer.canceled=Instalacja anulowana
addons.installer.confirm.licence=<html><body><h1>Licencja</h1>{0}<p><p><em>Czy akceptujesz warunki licencji?</em></p></body></html>
addons.installer.failed=Instalacja nie powiod\u0142a si\u0119: {0}
-addons.installer.freeplaneversion.format.error=B\u0142\u0105d formatu w {0} (warto\u015b\u0107: {1})
-addons.installer.html.script=Tre\u015b\u0107 skryptu nie mo\u017ce by\u0107 sformatowana jako HTML
+addons.installer.freeplaneversion.format.error=B\u0142\u0105d formatu w {0} (warto\u015B\u0107: {1})
+addons.installer.html.script=Tre\u015B\u0107 skryptu nie mo\u017Ce by\u0107 sformatowana jako HTML
addons.installer.install=Zainstaluj
-addons.installer.invalid.keyboard.shortcut=Nieprawid\u0142owy skr\u00f3t {0}.
+addons.installer.invalid.keyboard.shortcut=Nieprawid\u0142owy skr\u00F3t {0}.
addons.installer.licence.unchanged=Licencja niezmieniona
addons.installer.map.structure=B\u0142\u0105d w strukturze mapy: {0}
addons.installer.missing.child.nodes=Brakuj\u0105ce w\u0119z\u0142y potomne: {0}
addons.installer.missing.permission.attribute=Skrypt {0}: brakuj\u0105ce atrybuty uprawnie\u0144 {1}
-addons.installer.missing.properties=Brakuj\u0105ce w\u0142a\u015bciwo\u015bci: {0}
+addons.installer.missing.properties=Brakuj\u0105ce w\u0142a\u015Bciwo\u015Bci: {0}
addons.installer.missing.translation=Brakuj\u0105ce t\u0142umaczenie {0} dla lokalizacji {1}
-addons.installer.no.scripts=Nie znaleziono skrypt\u00f3w
+addons.installer.no.scripts=Nie znaleziono skrypt\u00F3w
addons.installer.no.zipdata=Nie znaleziono spakowanych danych (zip)
-addons.installer.nonstandard.permissions=Skrypt wymaga nast\u0119puj\u0105cych uprawnie\u0144, kt\u00f3re nie s\u0105 aktualnie w\u0142\u0105czone: {0}.\nCzy maj\u0105 by\u0107 dodane do standardowych uprawnie\u0144?
+addons.installer.nonstandard.permissions=Skrypt wymaga nast\u0119puj\u0105cych uprawnie\u0144, kt\u00F3re nie s\u0105 aktualnie w\u0142\u0105czone: {0}.\nCzy maj\u0105 by\u0107 dodane do standardowych uprawnie\u0144?
addons.installer.one.child.expected=Oczekiwany dok\u0142adnie jeden potomek {0}, ale otrzymano {1}.
addons.installer.script.no.execution_mode=Atrybut "execution_mode" nie zdefiniowany dla {0}
addons.installer.script.no.menulocation=Atrybut "menuLocation" nie zdefiniowany dla {0}
addons.installer.script.no.menutitle=Atrybut "menuTitleKey" nie zdefiniowany dla {0}
addons.installer.script.no.permissions=Nie zdefiniowane uprawnienia dla {0}
addons.installer.success=Instalacja powiod\u0142a si\u0119.\nNowy dodatek b\u0119dzie dost\u0119pny po ponownym uruchomieniu aplikacji.
-addons.installer.success.update=Aktualizacja z {0} do {1} powiod\u0142a si\u0119.\nNiekt\u00f3re funkcje mog\u0105 by\u0107 dost\u0119pne dopiero po ponownym uruchomieniu aplikacji.
-addons.installer.title=Instalator dodatk\u00f3w
+addons.installer.success.update=Aktualizacja z {0} do {1} powiod\u0142a si\u0119.\nNiekt\u00F3re funkcje mog\u0105 by\u0107 dost\u0119pne dopiero po ponownym uruchomieniu aplikacji.
+addons.installer.title=Instalator dodatk\u00F3w
addons.installer.too.new=Aktualna wersja Freeplane {0} jest zbyt nowa. Ten dodatek dzia\u0142a do wersji {1}
addons.installer.too.old=Aktualna wersja Freeplane {0} jest zbyt stara. Ten dodatek dzia\u0142a dopiero od wersji {1}
addons.installer.unknown.deinstallation.rules=Nieznane regu\u0142y odinstalowania {0}
addons.installer.update=Aktualizacja z wersji {0}
-addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">Instalacja dodatk\u00f3w powinna odbywa\u0107 si\u0119 tylko z zaufanych \u017ar\u00f3de\u0142. Z\u0142o\u015bliwe oprogramowanie mo\u017ce uszkodzi\u0107 twoje dane lub naruszy\u0107 twoj\u0105 prywatno\u015b\u0107.</strong></body></html>
+addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">Instalacja dodatk\u00F3w powinna odbywa\u0107 si\u0119 tylko z zaufanych \u017Ar\u00F3de\u0142. Z\u0142o\u015Bliwe oprogramowanie mo\u017Ce uszkodzi\u0107 twoje dane lub naruszy\u0107 twoj\u0105 prywatno\u015B\u0107.</strong></body></html>
addons.site=http://freeplane.sourceforge.net/addons/
AddStyleAttributes.text=Dodaj atrybuty ze stylu
AddStyleAttributes.tooltip=Dodaj atrybuty z w\u0119z\u0142a stylu
-AllMapsNodeListAction.text=Znajd\u017a i zast\u0105p we wszystkich mapach
+AllMapsNodeListAction.text=Znajd\u017A i zast\u0105p we wszystkich mapach
always=Zawsze
AlwaysUnfoldedNodeAction.text=Zawsze rozwini\u0119ty w\u0119ze\u0142 (w\u0142./wy\u0142.)
antialias_all=Antyaliasing wszystkiego
@@ -83,13 +84,13 @@ antialias_none=Bez antyaliasingu
apply=Zastosuj
ApplyAction.text=Zastosuj
ApplyFormatPlugin.text=Zmie\u0144 format...
-ApplyFormatPlugin.tooltip=Wy\u015bwietla okno, w kt\u00f3rym w\u0142a\u015bciwo\u015bci w\u0119z\u0142a i ga\u0142\u0119zi mog\u0105 zosta\u0107 zmienione jednocze\u015bnie.
+ApplyFormatPlugin.tooltip=Wy\u015Bwietla okno, w kt\u00F3rym w\u0142a\u015Bciwo\u015Bci w\u0119z\u0142a i ga\u0142\u0119zi mog\u0105 zosta\u0107 zmienione jednocze\u015Bnie.
ApplyNoFilteringAction.text=Nie filtruj
ApplySelectedViewConditionAction.text=Filtruj wybrane w\u0119z\u0142y
-ApplyToVisibleAction.text=Stosuj do przefiltrowanych w\u0119z\u0142\u00f3w
+ApplyToVisibleAction.text=Stosuj do przefiltrowanych w\u0119z\u0142\u00F3w
as_parent=Jako rodzic
-AskForHelp.text=Popro\u015b o pomoc
-AssignAttributesAction.text=Znajd\u017a i zamie\u0144 atrybuty...
+AskForHelp.text=Popro\u015B o pomoc na forum
+AssignAttributesAction.text=Znajd\u017A i zamie\u0144 atrybuty...
attribute_delete=Usu\u0144 wszystkie warto\u015Bci
attribute_delete_value=Usu\u0144 warto\u015B\u0107
attribute_font_size_tooltip=Rozmiar czcionki atrybut\u00F3w
@@ -97,13 +98,13 @@ attribute_list_box_label_text=Istniej\u0105ce warto\u015Bci
attribute_replace=Zamie\u0144 na
attribute_top=Wszystkie znane atrybuty wczytanych map
attributes_AddAttributeAction.text=Atrybuty w oknie dialogowym...
-attributes_adding_empty_attribute_error=Nazwa atrybutu musi sk\u0142ada\u0107 si\u0119 przynajmniej z jednego znaku.
+attributes_adding_empty_attribute_error=Nazwa atrybutu musi sk\u0142ada\u0107 si\u0119 przynajmniej z jednego znaku
attributes_all=Wszystkie atrybuty
attributes_assign_dialog=Przypisz atrybuty (edytor)...
attributes_attribute=Atrybuty
attributes_close=Zamknij
attributes_deselect_all=Nic
-attributes_dialog_title=Mened\u017cer atrybut\u00f3w
+attributes_dialog_title=Mened\u017Cer atrybut\u00F3w
attributes_edit=Edytuj
attributes_edit_tooltip=Edytuj zestaw
attributes_for_selected=Zaznaczone w\u0119z\u0142y
@@ -122,7 +123,7 @@ attributes_refresh=Od\u015Bwie\u017C
attributes_RemoveAllAttributesAction.text=Usu\u0144 wszystkie atrybuty
attributes_RemoveFirstAttributeAction.text=Usu\u0144 pierwszy atrybut
attributes_RemoveLastAttributeAction.text=Usu\u0144 ostatni atrybut
-attributes_restricted_attributes_tooltip=Ogranicz zestaw atrybut\u00f3w
+attributes_restricted_attributes_tooltip=Ogranicz zestaw atrybut\u00F3w
attributes_restricted_values_tooltip=Ogranicz zakres warto\u015Bci dla aktywnego atrybutu.
attributes_restriction=Ograniczony zbi\u00F3r warto\u015Bci
attributes_select_all=Wszystkie
@@ -136,13 +137,13 @@ automatic_layout_disabled=Wy\u0142\u0105czony
automatically_save_message=Mapa zosta\u0142a automatycznie zapisana (pod nazw\u0105 {0}) ...
AutomaticEdgeColorHookAction.text=Automatyczny kolor ga\u0142\u0119zi
AutomaticLayout.ALL=Dla wszystkich
-AutomaticLayout.HEADINGS=Dla nag\u0142\u00f3wk\u00f3w
-AutomaticLayout.level=Nag\u0142\u00f3wek {0}
+AutomaticLayout.HEADINGS=Dla nag\u0142\u00F3wk\u00F3w
+AutomaticLayout.level=Nag\u0142\u00F3wek {0}
AutomaticLayout.level.root=Tytu\u0142
AutomaticLayoutAction.text=Zastosuj automatyczne formatowanie
AutomaticLayoutAction.tooltip=<html> Ustala wygl\u0105d mindmapy. Pierwszy poziom jest czarny, drugi niebieski, itd.</html>
-AutomaticLayoutControllerAction.ALL.text=dla wszystkich w\u0119z\u0142\u00f3w
-AutomaticLayoutControllerAction.HEADINGS.text=dla w\u0119z\u0142\u00f3w nie b\u0119d\u0105cych li\u015b\u0107mi
+AutomaticLayoutControllerAction.ALL.text=dla wszystkich w\u0119z\u0142\u00F3w
+AutomaticLayoutControllerAction.HEADINGS.text=dla w\u0119z\u0142\u00F3w nie b\u0119d\u0105cych li\u015B\u0107mi
AutomaticLayoutControllerAction.null.text=wy\u0142\u0105czone
BackAction.text=Wstecz
BackAction.tooltip=Przechodzi do poprzednio zaznaczonego w\u0119z\u0142a
@@ -158,29 +159,29 @@ branch=Ga\u0142\u0105\u017A
browse=Przegl\u0105daj...
calendar_attributes_panel=Kalendarz i atrybuty
calendar_panel=Kalendarz
-can_not_connect_to_info_server=Nie mo\u017cna po\u0142\u0105czy\u0107 si\u0119 z serwerem
-can_not_delete_predefined_style=Nie mo\u017cna usun\u0105\u0107 predefiniowanych styl\u00f3w
-can_not_delete_root_style=Nie mo\u017cna usun\u0105\u0107 stylu korzenia
-can_not_delete_style_group=Nie mo\u017cna usun\u0105\u0107 grupy styl\u00f3w
-can_not_save_key_set=Nie mo\u017cna zapisa\u0107 zestawu skr\u00f3t\u00f3w klawiszowych
+can_not_connect_to_info_server=Nie mo\u017Cna po\u0142\u0105czy\u0107 si\u0119 z serwerem
+can_not_delete_predefined_style=Nie mo\u017Cna usun\u0105\u0107 predefiniowanych styl\u00F3w
+can_not_delete_root_style=Nie mo\u017Cna usun\u0105\u0107 stylu korzenia
+can_not_delete_style_group=Nie mo\u017Cna usun\u0105\u0107 grupy styl\u00F3w
+can_not_save_key_set=Nie mo\u017Cna zapisa\u0107 zestawu skr\u00F3t\u00F3w klawiszowych
cancel=Anuluj
CancelAction.text=Anuluj
cannot_add_parent_diff_parents=Wszystkie w\u0119z\u0142y musz\u0105 mie\u0107 tego samego rodzica, aby u\u017Cy\u0107 tej funkcji.
cannot_add_parent_to_root=Dla w\u0119z\u0142a korzenia (root) nie mo\u017Cna doda\u0107 rodzica.
-cannot_delete_root=W\u0119ze\u0142 korzenia (root) nie mo\u017ce zosta\u0107 skasowany ani wyci\u0119ty.
+cannot_delete_root=W\u0119ze\u0142 korzenia (root) nie mo\u017Ce zosta\u0107 skasowany ani wyci\u0119ty.
cannot_join_nodes_with_children=Nie mo\u017Cna \u0142\u0105czy\u0107 w\u0119z\u0142\u00F3w, kt\u00F3re posiadaj\u0105 potomk\u00F3w.
-cannot_move_to_child=Nie mo\u017cna przenie\u015b\u0107 w\u0119z\u0142a do jego potomka.
+cannot_move_to_child=Nie mo\u017Cna przenie\u015B\u0107 w\u0119z\u0142a do jego potomka.
CenterAction.text=Wy\u015Brodkuj
-CenterSelectedNodeAction.text=Wy\u015brodkuj na zaznaczonym w\u0119\u017ale
+CenterSelectedNodeAction.text=Wy\u015Brodkuj na zaznaczonym w\u0119\u017Ale
ChangeConnectorArrowsAction.backward.text=Wstecz
ChangeConnectorArrowsAction.both.text=Obie strza\u0142ki
ChangeConnectorArrowsAction.forward.text=Dalej
ChangeConnectorArrowsAction.none.text=Brak strza\u0142ek
ChangeConnectorArrowsAction.text=Zmie\u0144 strza\u0142ki po\u0142\u0105czenia
ChangeConnectorShapeAction.CUBIC_CURVE.text=Krzywa
-ChangeConnectorShapeAction.EDGE_LIKE.text=Udawaj ga\u0142\u0105\u017a
+ChangeConnectorShapeAction.EDGE_LIKE.text=Udawaj ga\u0142\u0105\u017A
ChangeConnectorShapeAction.LINE.text=Linia
-ChangeConnectorShapeAction.LINEAR_PATH.text=\u015acie\u017cka liniowa
+ChangeConnectorShapeAction.LINEAR_PATH.text=\u015Acie\u017Cka liniowa
ChangeNodeLevelLeftsAction.text=W\u0119ze\u0142 w lewo
ChangeNodeLevelLeftsAction.tooltip=Je\u017Celi w\u0119z\u0142y s\u0105 z lewej strony to staj\u0105 si\u0119 potomkami swojego, znajduj\u0105cego si\u0119 powy\u017Cej s\u0105siada. Id\u0105c w prawo w\u0119z\u0142y przemieszczaj\u0105 si\u0119 wy\u017Cej, a gdy s\u00B9 najwy\u017Cszego poziomu zmieniaj\u0105 po\u0142o\u017Cenie na praw\u0105 stron\u0119.
ChangeNodeLevelRightsAction.text=W\u0119ze\u0142 w prawo
@@ -210,7 +211,7 @@ connector_lines=Linie po\u0142\u0105czenia
connector_shapes=Kszta\u0142ty po\u0142\u0105czenia
ConnectorColorAction.text=Kolor po\u0142\u0105czenia...
CopyAction.text=Kopiuj
-CopyAction.tooltip=Kopiuj zaznaczon\u0105 ga\u0142\u0105\u017a
+CopyAction.tooltip=Kopiuj zaznaczon\u0105 ga\u0142\u0105\u017A
CopyAttributes.text=Kopiuj atrybuty
CopyIDAction.text=Kopiuj ID w\u0119z\u0142a
CopyMapStylesAction.text=Kopiuj style mapy z...
@@ -218,7 +219,7 @@ CopyNodeURIAction.text=Kopiuj URI w\u0119z\u0142a
CopySingleAction.text=Kopiuj bez potomk\u00F3w
CopySingleAction.tooltip=Kopiuje tylko zaznaczony w\u0119ze\u0142 bez ga\u0142\u0119zi
CopyStyleExtensionsAction.text=Kopiuj rozszerzenia ze stylu
-corrupt_map=Zawarto\u015b\u0107 mapy jest uszkodzona
+corrupt_map=Zawarto\u015B\u0107 mapy jest uszkodzona
CreateConjunctConditionAction.text=I (And)
CreateDisjunctConditionAction.text=Lub (Or)
CreateNotSatisfiedConditionAction.text=Nie (Not)
@@ -228,8 +229,8 @@ current_dir=Mapy
CutAction.text=Wytnij
decrease_branch_font_size=Zmniejsz czcionk\u0119
DecreaseNodeFontAction.text=Zmniejsz czcionk\u0119
-default=Domy\u015blny
-DefaultColorAction.text=Domy\u015blny kolor
+default=Domy\u015Blny
+DefaultColorAction.text=Domy\u015Blny kolor
defaultstyle.details=Detale
defaultstyle.floating=Swobodny w\u0119ze\u0142
defaultstyle.note=Notatka
@@ -240,25 +241,25 @@ DeleteConditionAction.text=Usu\u0144
DeleteDetailsAction.text=Usu\u0144 detale w\u0119z\u0142a
DeleteLevelStyleAction.text=Usu\u0144 styl poziomu
DeleteStyleAction.text=Usu\u0144 styl
-DeleteUserStyleAction.text=Usu\u0144 styl zdefiniowany przez u\u017cytkownika
+DeleteUserStyleAction.text=Usu\u0144 styl zdefiniowany przez u\u017Cytkownika
dialect_info.app=Plik mapy {0} by\u0142 utworzony w programie {1}.
dialect_info.unknownApp=Za\u0142adowana mapa by\u0142a utworzona w nieznanym programie.
dialect_info.unknownURL=Strona internetowa jest nieznana.
-dialect_info.url=Odwied\u017a stron\u0119 internetow\u0105 programu {0} w celu uzyskania dodatkowych informacji.
-dialect_info.warning=Freeplane mo\u017ce w niepoprawny spos\u00f3b otworzy\u0107, wy\u015bwietli\u0107 lub zapisa\u0107 ten plik.
+dialect_info.url=Odwied\u017A stron\u0119 internetow\u0105 programu {0} w celu uzyskania dodatkowych informacji.
+dialect_info.warning=Freeplane mo\u017Ce w niepoprawny spos\u00F3b otworzy\u0107, wy\u015Bwietli\u0107 lub zapisa\u0107 ten plik.
DirectHtmlFlavorHandler=HTML jako pojedynczy w\u0119ze\u0142
DocumentationAction.text=Dokumentacja
-down=D\u00f3\u0142
+down=D\u00F3\u0142
download=Pobierz
-dropped_file_error=Nie mo\u017cna by\u0142o otworzy\u0107 przeci\u0105gni\u0119tych plik\u00f3w. Pow\u00f3d: {0}
+dropped_file_error=Nie mo\u017Cna by\u0142o otworzy\u0107 przeci\u0105gni\u0119tych plik\u00F3w. Pow\u00F3d: {0}
edge=Ga\u0142\u0105\u017A
edge_is_formatted_by_style=Formatowanie ga\u0142\u0119zi jest kontrolowane przez styl. W razie potrzeby edytuj odpowiednie style.
edge_style=Styl ga\u0142\u0119zi
edge_width=Szeroko\u015B\u0107 ga\u0142\u0119zi
EdgeColorAction.text=Kolor ga\u0142\u0119zi...
EdgeStyleAction.bezier.text=Krzywa B\u00E9ziera
-EdgeStyleAction.bezier.tooltip=Wy\u015bwietla ga\u0142\u0105\u017a jako g\u0142adk\u0105 krzyw\u0105.
-EdgeStyleAction.hide_edge.text=Ukryj ga\u0142\u0105\u017a
+EdgeStyleAction.bezier.tooltip=<html>Wy\u015Bwietla ga\u0142\u0105\u017A jako g\u0142adk\u0105 krzyw\u0105.</html>
+EdgeStyleAction.hide_edge.text=Ukryj ga\u0142\u0105\u017A
EdgeStyleAction.horizontal.text=Pionowa
EdgeStyleAction.linear.text=Linia
EdgeStyleAction.sharp_bezier.text=Ostra krzywa B\u00E9ziera
@@ -268,18 +269,18 @@ EdgeWidthAction_width_parent.text=Jak rodzic
EdgeWidthAction_width_thin.text=Cienka
edit=Edycja
edit.decision=Edytor HTML
-edit.edit_rich_text=Czy chcesz u\u017cywa\u0107 formatowania czcionek takiego jak pogrubienie lub kursywa?
+edit.edit_rich_text=Czy chcesz u\u017Cywa\u0107 formatowania czcionek takiego jak pogrubienie lub kursywa?
edit_details=Edytuj detale w\u0119z\u0142a in-line...
edit_end_label=<html>Etykieta<br>po\u0142\u0105czenia
edit_label_font_family=Czcionka
-edit_label_font_size=Wielko\u015b\u0107 czcionki
-edit_link_manually=Edytuj odno\u015bnik...
+edit_label_font_size=Wielko\u015B\u0107 czcionki
+edit_link_manually=Edytuj odno\u015Bnik...
edit_long_node=Edytor tekstu w\u0119z\u0142a...
-edit_middle_label=<html>Etykieta<br>\u015brodkowa
-edit_source_label=<html>Etykieta<br>\u017ar\u00f3d\u0142a
+edit_middle_label=<html>Etykieta<br>\u015Brodkowa
+edit_source_label=<html>Etykieta<br>\u017Ar\u00F3d\u0142a
edit_target_label=<html>Etykieta<br>celu
-edit_transparency_label=Przezroczysto\u015b\u0107
-edit_width_label=Szeroko\u015b\u0107
+edit_transparency_label=Przezroczysto\u015B\u0107
+edit_width_label=Szeroko\u015B\u0107
EditAction.text=Edytuj tekst w\u0119z\u0142a
EditAttributesAction.text=Edytuj atrybuty
EditDetailsAction.text=Edytuj detale w\u0119z\u0142a in-line
@@ -292,32 +293,33 @@ EditStylesAction.text=Edytuj style
EncryptedMap.text=Utw\u00F3rz zaszyfrowan\u0105 mindmap\u0119...
EncryptedMap.tooltip=<html> Tworzy now\u0105 zaszyfrowan\u0105 mindmap\u0119</html>
enter_base_url=Freeplane automatycznie wklei linki wzgl\u0119dne. Podaj bazowy URL.
-enter_condition_name=Wprowad\u017a nazw\u0119 nowego warunku
+enter_condition_name=Wprowad\u017A nazw\u0119 nowego warunku
enter_confirms=[Enter] potwierdza
-enter_keyset_name=Podaj nazw\u0119 zestawu skr\u00f3t\u00f3w klawiszowych
-enter_map_url=Wprowad\u017a adres URL mapy
-enter_new_style_name=Wprowad\u017a nazw\u0119 nowego stylu
-enter_node_id=Wprowad\u017a ID w\u0119z\u0142a
+enter_keyset_name=Podaj nazw\u0119 zestawu skr\u00F3t\u00F3w klawiszowych
+enter_map_url=Wprowad\u017A adres URL mapy
+enter_new_style_name=Wprowad\u017A nazw\u0119 nowego stylu
+enter_node_id=Wprowad\u017A ID w\u0119z\u0142a
EnterPassword.text=W\u0142\u0105cz/wy\u0142\u0105cz szyfrowanie
error=B\u0142\u0105d
error_applying_template=B\u0142\u0105d aplikowania szablonu XSL.
error_creating_directory=Nie mo\u017Cna utworzy\u0107 katalogu.
-errornumber={0} b\u0142\u0119d\u00f3w
+errornumber={0} b\u0142\u0119d\u00F3w
+ExecuteScript.available_modes_tooltip={0} jest dost\u0119pny dla
ExecuteScriptError.text=B\u0142\u0105d podczas wykonywania skryptu:\n{0}
ExecuteScriptForAllNodes.text=Wykonaj wszystkie skrypty
ExecuteScriptForSelectionAction.text=Wykonaj skrypty zaznaczonego w\u0119z\u0142a
ExecuteScriptOnSelectedNode.text=Wykonaj {0} na wszystkich zaznaczonych w\u0119z\u0142ach
ExecuteScriptOnSelectedNodeRecursively.text=Wykonaj rekursywnie {0} na zaznaczonych w\u0119z\u0142ach
-ExecuteScriptOnSingleNode.text=Wykonaj {0} na zaznaczonym w\u0119\u017ale
-ExecuteScripts.noScriptsAvailable=Brak dost\u0119pnych skrypt\u00f3w
+ExecuteScriptOnSingleNode.text=Wykonaj {0} na zaznaczonym w\u0119\u017Ale
+ExecuteScripts.noScriptsAvailable=Brak dost\u0119pnych skrypt\u00F3w
ExecuteScripts.text=Skrypty
ExecuteScriptSecurityError.text=B\u0142\u0105d podczas wykonywania skryptu: {0}
export_failed=Eksportowanie nie powiod\u0142o si\u0119
export_pdf_text=Dokument PDF
export_svg_text=Skalowalna grafika wektorowa (SVG)
-export_using_xslt=Eksportowanie u\u017cywaj\u0105c XSLT
-ExportAction.text=Eksport
-ExportBranchAction.text=Ga\u0142\u0105\u017a jako nowa mapa...
+export_using_xslt=Eksportowanie u\u017Cywaj\u0105c XSLT
+ExportAction.text=Eksport mapy...
+ExportBranchAction.text=Przenie\u015B ga\u0142\u0105\u017A do nowej mapy...
ExportBranchToHTMLAction.text=Ga\u0142\u0105\u017A do dokumentu HTML...
exported_file=Plik {0}
ExportPdf.text=Do dokumentu PDF...
@@ -329,44 +331,45 @@ ExportToOoWriter.text=Do dokumentu OpenOffice Writer...
ExportToOoWriter.tooltip=<html> Rozwini\u0119te ga\u0142\u0119zie tworz\u0105 struktur\u0119 dokumentu, a zwini\u0119te zawarto\u015B\u0107</html>
extension_menu=Styl
ExternalImage_popupMenu_Change=Zmie\u0144...
-ExternalImage_popupMenu_Open=Otw\u00f3rz w przegl\u0105darce
+ExternalImage_popupMenu_Open=Otw\u00F3rz w przegl\u0105darce
ExternalImage_popupMenu_Remove=Usu\u0144
ExternalImage_popupMenu_ResetZoom=Powi\u0119kszenie 1:1
ExternalImageAddAction.text=Dodaj obrazek...
ExternalImageChangeAction.text=Zmie\u0144 obrazek...
ExternalImageRemoveAction.text=Usu\u0144 obrazek
-ExtractLinkFromTextAction.text=Odno\u015bnik z tekstu w\u0119z\u0142a
-ExtractLinkFromTextAction.tooltip=Tworzy odno\u015bnik na podstawie adresu w tek\u015bcie w\u0119z\u0142a
+ExtractLinkFromTextAction.text=Odno\u015Bnik z tekstu w\u0119z\u0142a
+ExtractLinkFromTextAction.tooltip=Tworzy odno\u015Bnik na podstawie adresu w tek\u015Bcie w\u0119z\u0142a
+extras=Narz\u0119dzia
f_button_unassigned=<brak>
FaqOpenURLAction.text=FAQ
file=Plik
file_already_exists=Plik {0} ju\u017C istnieje. Czy chcesz go nadpisa\u0107?
file_not_found=Plik {0} nie zosta\u0142 znaleziony.
-FileListFlavorHandler=Odno\u015bniki do plik\u00f3w
-FileProperties_BranchLeafCount=Liczba li\u015bci w zaznaczonych ga\u0142\u0119ziach:
-FileProperties_BranchNodeCount=Liczba w\u0119z\u0142\u00f3w w zaznaczonych ga\u0142\u0119ziach:
+FileListFlavorHandler=Odno\u015Bniki do plik\u00F3w
+FileProperties_BranchLeafCount=Liczba li\u015Bci w zaznaczonych ga\u0142\u0119ziach:
+FileProperties_BranchNodeCount=Liczba w\u0119z\u0142\u00F3w w zaznaczonych ga\u0142\u0119ziach:
FileProperties_ChangesSinceLastSave=Zmiany od ostatniego zapisania:
FileProperties_FileName=Nazwa pliku:
FileProperties_FileSaved=Zapisany plik:
FileProperties_FileSize=Rozmiar pliku:
-FileProperties_MainBranchCount=Liczba g\u0142\u00f3wnych ga\u0142\u0119zi:
+FileProperties_MainBranchCount=Liczba g\u0142\u00F3wnych ga\u0142\u0119zi:
FileProperties_NeverSaved=Jeszcze nie zapisany
-FileProperties_NodeChildCount=Liczba potomk\u00f3w zaznaczonych w\u0119z\u0142\u00f3w:
-FileProperties_NodeSelectionCount=Liczba zaznaczonych w\u0119z\u0142\u00f3w:
-FileProperties_TotalFilteredCount=Liczba w\u0119z\u0142\u00f3w spe\u0142niaj\u0105cych kryteria filtrowania:
-FileProperties_TotalLeafCount=Og\u00f3lna liczba li\u015bci:
-FileProperties_TotalNodeCount=Og\u00f3lna liczba w\u0119z\u0142\u00f3w:
+FileProperties_NodeChildCount=Liczba potomk\u00F3w zaznaczonych w\u0119z\u0142\u00F3w:
+FileProperties_NodeSelectionCount=Liczba zaznaczonych w\u0119z\u0142\u00F3w:
+FileProperties_TotalFilteredCount=Liczba w\u0119z\u0142\u00F3w spe\u0142niaj\u0105cych kryteria filtrowania:
+FileProperties_TotalLeafCount=Og\u00F3lna liczba li\u015Bci:
+FileProperties_TotalNodeCount=Og\u00F3lna liczba w\u0119z\u0142\u00F3w:
FilePropertiesAction.text=Statystyki mapy...
FileRevisionsDialog.cancel=Anuluj
FileRevisionsDialog.file_last_modified=Znacznik czasowy
FileRevisionsDialog.file_name=Plik
FileRevisionsDialog.file_size=Rozmiar
-FileRevisionsDialog.open=Otw\u00f3rz
-FileRevisionsDialog.open.tooltip=Otwiera plik, nawet je\u017celi jest nieaktualny
+FileRevisionsDialog.open=Otw\u00F3rz
+FileRevisionsDialog.open.tooltip=Otwiera plik, nawet je\u017Celi jest nieaktualny
FileRevisionsDialog.question=Znaleziono wersje {0}
-FileRevisionsDialog.restore=Odtw\u00f3rz
+FileRevisionsDialog.restore=Odtw\u00F3rz
FileRevisionsDialog.restore.tooltip=Zamienia {0} na {1}
-FileRevisionsDialog.title=Wersje plik\u00f3w
+FileRevisionsDialog.title=Wersje plik\u00F3w
filter=Filtr
filter_add=Dodaj
filter_and=I
@@ -379,16 +382,16 @@ filter_delete=Usu\u0144
filter_details=Detale
filter_dialog=Kreator filtr\u00F3w
filter_does_not_exist=Nie istnieje
-filter_edit_description=Edytuj list\u0119 filtr\u00f3w
+filter_edit_description=Edytuj list\u0119 filtr\u00F3w
filter_enter_value=Wprowad\u017A warto\u015B\u0107
filter_even_level=W\u0119ze\u0142 nieparzystego poziomu
filter_exist=Istnieje
filter_icon=Ikona
filter_is_equal_to=Jest r\u00F3wny
filter_is_not_equal_to=Nie jest r\u00F3wny
-filter_leaf=Li\u015b\u0107
-filter_link=Odno\u015bnik
-filter_match_case=Uwzgl\u0119dnij wielko\u015b\u0107 liter
+filter_leaf=Li\u015B\u0107
+filter_link=Odno\u015Bnik
+filter_match_case=Uwzgl\u0119dnij wielko\u015B\u0107 liter
filter_modified_after=Zmodyfikowano po
filter_modified_before=Zmodyfikowano przed
filter_no_filtering=Nie filtruj
@@ -401,26 +404,27 @@ filter_or=Lub
filter_parent=Tekst rodzica
filter_periodic_level=Okresowo
filter_priority=Priorytet
-filter_regexp_matches=Wyra\u017cenie regularne (regexp)
+filter_regexp_matches=Wyra\u017Cenie regularne (regexp)
filter_reminder=Przypomnienie
filter_reminder_after=zaplanowane po
filter_reminder_before=zaplanowane przed
-filter_reminder_executed=ju\u017c uaktywnione
-filter_reminder_later=zaplanowane p\u00f3\u017cniej
+filter_reminder_executed=ju\u017C uaktywnione
+filter_reminder_later=zaplanowane p\u00F3\u017Cniej
filter_root=Korze\u0144
filter_script=Skrypt
-filter_select=Zaznacz
+filter_select=&Zaznacz
filter_selected_node_view=Aktualnie zaznaczone w\u0119z\u0142y
filter_selected_node_view_snapshot=Zachowane zaznaczenie
filter_style=Styl
filter_time=Filtr daty
-filters_not_loaded=Nie mo\u017cna wczyta\u0107 filtru, plik uszkodzony
-find_what=Szukaj:
+filters_not_loaded=Nie mo\u017Cna wczyta\u0107 filtru, plik uszkodzony
+find_what=Szukaj
FindAction.text=Znajd\u017A...
-FirstGroupNodeAction.text=W\u0119ze\u0142 zbiorczy (pocz\u0105tek grupy)
+FindNextAction.text=Znajd\u017A nast\u0119pny
+FindPreviousAction.text=Znajd\u017A poprzedni
fit_map_to_page=Dopasuj do strony
-fit_map_to_page_height=Dopasuj wysoko\u015b\u0107 do strony
-fit_map_to_page_width=Dopasuj szeroko\u015b\u0107 do strony
+fit_map_to_page_height=Dopasuj wysoko\u015B\u0107 do strony
+fit_map_to_page_width=Dopasuj szeroko\u015B\u0107 do strony
FitToPage.text=Dopasuj do strony
FitToPage.tooltip=<html> Ustawia powi\u0119kszenie tak, by ca\u0142a mindmapa zmie\u015Bci\u0142a si\u0119 w aktualnym oknie</html>
fold=Zwi\u0144
@@ -428,11 +432,12 @@ FoldAllAction.text=Zwi\u0144 wszystko
FoldAllAction.tooltip=<html> Zwija zaznaczone w\u0119z\u0142y i ich w\u0119z\u0142y potomne</html>
FoldOneLevelAction.text=Zwi\u0144 jeden poziom
FoldOneLevelAction.tooltip=<html> Zwija zaznaczone w\u0119z\u0142y o jeden poziom</html>
-follow_graphical_link=Id\u017a do:
+follow_graphical_link=Id\u017A do ''{0}''
FollowLinkAction.text=Otw\u00F3rz odno\u015Bnik
font=Czcionka
FontFamilyAction.text=Czcionka
FontSizeAction.text=Rozmiar
+format=Format
format_invalid_pattern=Nieprawid\u0142owy wzorzec
format_menu_cloud_shapes=Dodaj chmurk\u0119 lub zmie\u0144 jej styl
format_menu_edge_styles=Styl ga\u0142\u0119zi
@@ -443,15 +448,15 @@ FormatCopy.tooltip=<html> Kopiuje formatowanie w\u0119z\u0142a</html>
FormatPaste.text=Wklej formatowanie
FormatPaste.tooltip=<html> Wkleja formatowanie w\u0119z\u0142a. Pami\u0119taj o wcze\u015Bniejszym skopiowaniu go z innego w\u0119z\u0142a</html>
formats_not_loaded=Formatowania nie mog\u0105 by\u0107 za\u0142adowane, plik uszkodzony
-formula.error.attributeValueIsNull=Po wykonaniu warto\u015bci\u0105 atrybutu "{0}" jest null
-formula.error.circularReference=Odwo\u0142anie cykliczne: Foru\u0142a w w\u0119\u017ale "{0}" odwo\u0142uje si\u0119 do samej siebie.
+formula.error.attributeValueIsNull=Po wykonaniu warto\u015Bci\u0105 atrybutu "{0}" jest null
+formula.error.circularReference=Odwo\u0142anie cykliczne: Foru\u0142a w w\u0119\u017Ale "{0}" odwo\u0142uje si\u0119 do samej siebie.
formula.EvaluateAllAction.text=Wykonaj wszystko
-formula.EvaluateAllAction.tooltip=Wykonaj wszystkie formu\u0142y w bie\u017c\u0105cej mapie
+formula.EvaluateAllAction.tooltip=Wykonaj wszystkie formu\u0142y w bie\u017C\u0105cej mapie
formula.menuname=Formu\u0142y
formula_editor=Edytuj formu\u0142\u0119
ForwardAction.text=Dalej
ForwardAction.tooltip=Przechodzi do przodu w historii zaznaczenia
-FreeNodeAction.text=Swobodne po\u0142o\u017cenie w\u0119z\u0142a (w\u0142./wy\u0142.)
+FreeNodeAction.text=Swobodne po\u0142o\u017Cenie w\u0119z\u0142a (w\u0142./wy\u0142.)
Freeplane.progress.buildScreen=Budowanie interfejsu...
Freeplane.progress.createController=Tworzenie kontrolera...
Freeplane.progress.createInitialMode=Tryb inicjacji...
@@ -468,7 +473,7 @@ FreeplaneHelpStarter.text=Pomoc...
FreeplaneHelpStarter.tooltip=<html> Rozszerzona pomoc Freeplane</html>
GettingStartedAction.text=Szybkie wprowadzenie do Freeplane'a
GotoLinkNodeAction.text=Id\u017A do odno\u015Bnika
-GotoNodeAction.text=Id\u017a do w\u0119z\u0142a o numrze ID...
+GotoNodeAction.text=Id\u017A do w\u0119z\u0142a o numrze ID...
GrabKeyDialog.common.cancel=Anuluj
GrabKeyDialog.common.ok=OK
GrabKeyDialog.grab-key.assigned-to=Przypisany do
@@ -479,14 +484,14 @@ GrabKeyDialog.grab-key.remove-ask=Czy na pewno chcesz usun\u0105\u0107 ten skr\u
GrabKeyDialog.grab-key.title=Wybierz nowy skr\u00F3t klawiaturowy
green=Zielony
help=Pomoc
-HideableAction.tooltip=<html>Zaznacza t\u0142o ka\u017cdego zmodyfikowanego w\u0119z\u0142a.</html>
+HideableAction.tooltip=<html>Zaznacza t\u0142o ka\u017Cdego zmodyfikowanego w\u0119z\u0142a.</html>
HideAllAttributesAction.text=Ukryj wszystkie atrybuty
-HierarchicalIcons2Action.text=Poka\u017c wsp\u00f3lne ikony potomk\u00f3w
-HierarchicalIconsAction.text=Poka\u017c ikony hierarchicznie
+HierarchicalIcons2Action.text=Poka\u017C wsp\u00F3lne ikony potomk\u00F3w
+HierarchicalIconsAction.text=Poka\u017C ikony hierarchicznie
HierarchicalIconsAction.tooltip=<html> Je\u015Bli jeden z potomk\u00F3w w\u0119z\u0142a ma ikon\u0119, to zostanie ona r\u00F3wnie\u017C wy\u015Bwietlona w w\u0119\u017Ale (rodzicu)</html>
-hot_keys=Skr\u00f3ty klawiszowe
-hot_keys_table=Lista skr\u00f3t\u00f3w klawiszowych
-HotKeyInfoAction.text=Lista skr\u00f3t\u00f3w klawiszowych
+hot_keys=Skr\u00F3ty klawiszowe
+hot_keys_table=Lista skr\u00F3t\u00F3w klawiszowych
+HotKeyInfoAction.text=Lista skr\u00F3t\u00F3w klawiszowych
html_export_based_on_headings=Eksport HTML - jako esej
html_export_fold_all=Eksport HTML - zwijanie wszystkich w\u0119z\u0142\u00F3w
html_export_fold_currently_folded=Eksport HTML - zwijanie aktualnie zwini\u0119tych
@@ -511,7 +516,7 @@ icon_checked=Zaznaczone
icon_clanbomber=Niebezpieczne
icon_clock=Czas
icon_clock2=Przypomnienie
-icon_closed=Zakaz wej\u015bcia
+icon_closed=Zakaz wej\u015Bcia
icon_decrypted=Odbezpieczone
icon_desktop_new=Nie zapomnij
icon_division=Dzielenie
@@ -528,8 +533,8 @@ icon_flag-black=Czarna flaga
icon_flag-blue=Niebieska flaga
icon_flag-green=Zielona flaga
icon_flag-orange=Pomara\u0144czowa flaga
-icon_flag-pink=R\u00f3\u017cowa flaga
-icon_flag-yellow=\u017b\u00f3\u0142ta flaga
+icon_flag-pink=R\u00F3\u017Cowa flaga
+icon_flag-yellow=\u017B\u00F3\u0142ta flaga
icon_folder=Katalog
icon_forward=Dalej
icon_freemind_butterfly=FreeMind
@@ -543,7 +548,7 @@ icon_full-6=Priorytet 6
icon_full-7=Priorytet 7
icon_full-8=Priorytet 8
icon_full-9=Priorytet 9
-icon_go=Zielone \u015bwiat\u0142o
+icon_go=Zielone \u015Bwiat\u0142o
icon_gohome=Dom
icon_group=Grupa
icon_help=Pytanie
@@ -560,30 +565,30 @@ icon_launch=Start
icon_licq=Przyjemne
icon_list=Lista
icon_Mail=Poczta
-icon_male1=M\u0119\u017cczyzna1
-icon_male2=M\u0119\u017cczyzna2
-icon_males=M\u0119\u017cczy\u017ani
+icon_male1=M\u0119\u017Cczyzna1
+icon_male2=M\u0119\u017Cczyzna2
+icon_males=M\u0119\u017Cczy\u017Ani
icon_menu=Ikony
icon_messagebox_warning=Uwaga!
-icon_multiplication=Mno\u017cenie
+icon_multiplication=Mno\u017Cenie
icon_negative=Negatywne
icon_neutral=Neutralne
icon_password=Has\u0142o
icon_pencil=O\u0142\u00F3wek
icon_penguin=Linux
icon_positive=Pozytywne
-icon_prepare=\u017b\u00f3\u0142te \u015bwiat\u0142o
+icon_prepare=\u017B\u00F3\u0142te \u015Bwiat\u0142o
icon_revision=Poprawka
icon_smiley-angry=Z\u0142y
icon_smiley-neutral=Oboj\u0119tny
icon_smiley-oh=Zaskoczony
icon_smily_bad=Nie jestem rozbawiony
-icon_stop=Czerwone \u015bwiat\u0142o
+icon_stop=Czerwone \u015Bwiat\u0142o
icon_stop-sign=Stop
icon_subtraction=Odejmowanie
icon_unchecked=Niezaznaczone
icon_up=G\u00F3ra
-icon_user_icon=Ikony u\u017cytkownika
+icon_user_icon=Ikony u\u017Cytkownika
icon_very_negative=Bardzo negatywne
icon_very_positive=Bardzo pozytywne
icon_wizard=Magiczny
@@ -593,7 +598,7 @@ IconGroupPopupAction.arrows.text=Strza\u0142ki
IconGroupPopupAction.docs_folders.text=Dokumenty i katalogi
IconGroupPopupAction.flags.text=Flagi
IconGroupPopupAction.math.text=Matematyka
-IconGroupPopupAction.miscellaneous.text=R\u00f3\u017cne
+IconGroupPopupAction.miscellaneous.text=R\u00F3\u017Cne
IconGroupPopupAction.nature.text=Natura
IconGroupPopupAction.numbers.text=Priorytety
IconGroupPopupAction.office.text=Biuro
@@ -602,7 +607,7 @@ IconGroupPopupAction.rating.text=Ocena
IconGroupPopupAction.signs.text=Znaki
IconGroupPopupAction.smiley.text=Emotikony
IconGroupPopupAction.time.text=Czas
-IconGroupPopupAction.user.text=Ikony u\u017cytkownika
+IconGroupPopupAction.user.text=Ikony u\u017Cytkownika
IconProgressExtended10Action.text=Znacznik post\u0119pu +10%
IconProgressExtended25Action.text=Znacznik postepu +25%
IconProgressIconDownAction.text=Ikona post\u0119pu: dalej
@@ -610,7 +615,7 @@ IconProgressIconUpAction.text=Ikona post\u0119pu: cofnij
IconProgressRemoveAction.text=Usu\u0144 znacznik/ikon\u0119 post\u0119pu
IconSelectionPlugin.text=Wybierz ikon\u0119...
IconSelectionPlugin.tooltip=<html> Otwiera okienko z dost\u0119pnymi ikonami</html>
-image_covertLink=Zamie\u0144 odno\u015bnik na obrazek
+image_covertLink=Zamie\u0144 odno\u015Bnik na obrazek
ImageFlavorHandler=Obrazek (osobny plik)
import=Import
import_linked_branch_no_link=Wybrany w\u0119ze\u0142 nie zawiera odno\u015Bnika do pliku, kt\u00F3ry mo\u017Cna zaimportowa\u0107.
@@ -625,14 +630,13 @@ increase_branch_font_size=Zwi\u0119ksz czcionk\u0119
IncreaseNodeFontAction.text=Zwi\u0119ksz czcionk\u0119
internal_error_tooltip=B\u0142\u0105d wewn\u0119trzny. Klinij aby otworzy\u0107 ostatni plik logowania log.0
invalid_export_file=Nieprawid\u0142owa nazwa eksportowanego pliku
-invalid_file_msg=Nie mog\u0119 znale\u017a\u0107 pliku dla {0}
+invalid_file_msg=Nie mog\u0119 znale\u017A\u0107 pliku dla {0}
invalid_uri=Nieprawid\u0142owy URI {0}
invalid_url=Nie mog\u0119 utworzy\u0107 prawid\u0142owego URL
invalid_url_msg=Nie mog\u0119 utworzy\u0107 prawid\u0142owego URL dla {0}
ItalicAction.text=Pochylenie
italicise_branch=Pochyl
java_version=Wersja Java-y: {0}
-JoinNodesAction.text=Po\u0142\u0105cz w\u0119z\u0142y
LatexDeleteLatexAction.text=Usu\u0144 formu\u0142\u0119 LaTeX-u
LatexEditLatexAction.text=Edytuj formu\u0142\u0119 LaTeX-u...
LatexInsertLatexAction.text=Wstaw formu\u0142\u0119 LaTeX-u...
@@ -640,9 +644,10 @@ less_than_two_selected_nodes=Wybierz co najmniej dwa w\u0119z\u0142y, aby utworz
license=Licencja
license_text=<html>This program is free software; you can redistribute it and/or<br>modify it under the terms of the GNU General Public License<br>as published by the Free Software Foundation; either version 2<br>of the License, or (at your option) any later version.<br><br>This program is distributed in the hope that it will be useful,<br>but WITHOUT ANY WARRANTY; without even the implied warranty of<br>MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>GNU General Public [...]
LicenseAction.text=Licencja
-link_error=Nieprawid\u0142owy odno\u015bnik "{0}" nie za\u0142adowany
+link_error=Nieprawid\u0142owy odno\u015Bnik "{0}" nie za\u0142adowany
link_not_available_any_more=Po\u0142\u0105czenie jest nieaktualne. Jeden z w\u0119z\u0142\u00F3w zosta\u0142 usuni\u0119ty.
link_not_found=Nie znaleziono odno\u015Bnika {0}.
+links=Odno\u015Bnik
load=Wczytywanie
LoadAcceleratorPresetsAction.textPatterns.text=Wzorce tekstowe
locking_failed_by_open=Zablokowanie mindmapy {0} niemo\u017Cliwe. Otwieram tylko do odczytu.
@@ -652,12 +657,12 @@ long_node_changed_cancel=W\u0119ze\u0142 zosta\u0142 zmieniony. Porzuci\u0107 zm
long_node_changed_submit=W\u0119ze\u0142 zosta\u0142 zmieniony. Zapisa\u0107 zmiany?
lots_of_links_warning=Czy na pewno chcesz utworzy\u0107 wiele odno\u015Bnik\u00F3w do tego samego w\u0119z\u0142a?
main_resource_directory=Zasoby instalacji: {0}
-MainView.errorUpdateText=B\u0142\u0105d ustawienia tekstu dla wej\u015bcia: {0}.
+MainView.errorUpdateText=B\u0142\u0105d ustawienia tekstu dla wej\u015Bcia: {0}.
ManageAddOnsAction.text=Dodatki
ManageAddOnsDialog.activate=W\u0142\u0105czony
ManageAddOnsDialog.activation.success={0} b\u0119dzie w\u0142\u0105czony po ponownym uruchomieniu programu.
ManageAddOnsDialog.authored.by=autorstwa {0}
-ManageAddOnsDialog.cannot.activate=Nie mog\u0119 uruchomi\u0107: {0} ju\u017c jest uruchomony.
+ManageAddOnsDialog.cannot.activate=Nie mog\u0119 uruchomi\u0107: {0} ju\u017C jest uruchomony.
ManageAddOnsDialog.cannot.configure=Nie mog\u0119 skonfigurowa\u0107 {0}.
ManageAddOnsDialog.cannot.deactivate=Nie mog\u0119 wy\u0142\u0105czy\u0107: {0} jest wy\u0142\u0105czony.
ManageAddOnsDialog.cannot.deinstall=Nie mog\u0119 odinstalowa\u0107 {0}.
@@ -669,7 +674,7 @@ ManageAddOnsDialog.deinstallation.success={0} b\u0119dzie odinstalowany po ponow
ManageAddOnsDialog.error=B\u0142\u0105d podczas instalacji: {0}.
ManageAddOnsDialog.install=Instaluj
ManageAddOnsDialog.install.from.known.location=Instaluj dodatek ze znanego miejsca
-ManageAddOnsDialog.install.tooltip=Wprowad\u017a URL pliku instalacyjnego dodatku
+ManageAddOnsDialog.install.tooltip=Wprowad\u017A URL pliku instalacyjnego dodatku
ManageAddOnsDialog.map.not.opened=Mapa {0} nie jest otwarta.
ManageAddOnsDialog.really.deinstall=Czy na pewno odinstalowa\u0107 {0}?
ManageAddOnsDialog.search=Przeszukuj dodatki
@@ -684,7 +689,7 @@ ManageAddOnsDialog.tab.manage=Dodatki
ManageAddOnsDialog.tab.manage.themes=Motywy
ManageAddOnsDialog.tab.manage.themes.tooltip=Zarz\u0105dzaj zainstalowanymi motywami
ManageAddOnsDialog.tab.manage.tooltip=Zarz\u0105dzaj zainstalowanymi dodatkami
-ManageAddOnsDialog.visit.addon.page=Odwied\u017a stron\u0119 dodatku...
+ManageAddOnsDialog.visit.addon.page=Odwied\u017A stron\u0119 dodatku...
ManageConditionalStylesAction.text=Zarz\u0105dzaj stylami warunkowymi mapy
ManageNodeConditionalStylesAction.text=Zarz\u0105dzaj stylami warunkowymi w\u0119z\u0142a
map_already_exists=Mindmapa o podanej nazwie ju\u017C istnieje. Czy chcesz j\u0105 zamieni\u0107?
@@ -692,8 +697,8 @@ map_corrupted=Mindmapa uszkodzona. Wy\u015Bwietli\u0107 szczeg\u00F3\u0142y?
map_locked_by_open=Mindmapa {0} jest ju\u017C otwarta przez u\u017Cytkownika {1}. Otwieram tylko do odczytu.
map_locked_by_save_as=Mindmapa {0} jest ju\u017C otwarta przez u\u017Cytkownika {1}. Polecenie "Zapisz jako..." niedost\u0119pne.
map_not_saved=Mapa nie by\u0142a zapisywana.
-MapBackgroundColorAction.text=T\u0142o mapy
-MaxNodeWidth.text=Ustaw maksymaln\u0105 szeroko\u015b\u0107 w\u0119z\u0142a
+MapBackgroundColorAction.text=Kolor t\u0142a
+MaxNodeWidth.text=Ustaw maksymaln\u0105 szeroko\u015B\u0107 w\u0119z\u0142a
menu_applyStyle=Zastosuj styl
menu_attributes=Atrybuty
menu_clouds=Chmurki
@@ -702,58 +707,49 @@ menu_coreFormat=Tekst w\u0119z\u0142a
menu_details=Detale
menu_displayAttributes=Atrybuty w\u0119z\u0142a
menu_encryption=Ochrona has\u0142em
-menu_error=B\u0142\u0105d w zdefiniowanej przez u\u017cytkownika strukturze menu {0}:\n{1}\nPrzerwane
+menu_error=B\u0142\u0105d w zdefiniowanej przez u\u017Cytkownika strukturze menu {0}:\n{1}\nPrzerwane
menu_extensions=Rozszerzenia w\u0119z\u0142a
-menu_extras=Narz\u0119dzia
-menu_file_import=Import
-menu_filter=Filtr
-menu_format=Format
-menu_group=Grupa w\u0119z\u0142\u00f3w
+menu_group=Grupa w\u0119z\u0142\u00F3w
menu_hoverView=Podpowiedzi
menu_iconByCategory=Wybierz ikon\u0119 (kategorie)
menu_iconView=Ikony
menu_image=Obrazek
menu_insert=Wstaw
menu_latex_formula=Formu\u0142a LaTeX-u
-menu_links=Odno\u015bnik
menu_manageStyles=Zarz\u0105dzaj stylami
menu_moveNode=Przemieszczanie i sortowanie
-menu_navigate=Nawigacja
menu_newNode=Nowy w\u0119ze\u0142
menu_node=W\u0119ze\u0142
-menu_node_features=W\u0142a\u015bciwo\u015bci w\u0119z\u0142a
+menu_node_features=W\u0142a\u015Bciwo\u015Bci w\u0119z\u0142a
menu_nodes=W\u0119z\u0142y
menu_nodeView=Tekst w\u0119z\u0142a
-menu_notes=Notatka
menu_noteView=Notatki
-menu_progress=Ikona post\u0119pu (%)
menu_remove_icons=Usu\u0144 ikony
menu_removeAttribute=Usu\u0144 atrybut
menu_select=Zaznacz
menu_time=Zarz\u0105dzanie czasem
menu_title=Tekst w\u0119z\u0142a
-menu_toolbars=Paski narz\u0119dzi
-menu_view=Widok
MenuUtils.invalid_menuitem={0} nie jest prawid\u0142owym kluczem (key) elementu menu.
mindmap=Mapa
-MindMapNodesFlavorHandler=Hierarchia w\u0119z\u0142\u00f3w
+MindMapNodesFlavorHandler=Hierarchia w\u0119z\u0142\u00F3w
mindmaps=Mapy
mindmaps_desc=Mindmapy (*.mm)
mindmaps_filter_desc=Filtry (*.mmfilter)
-MinNodeWidth.text=Ustaw minimaln\u0105 szeroko\u015b\u0107 w\u0119z\u0142a
+MinNodeWidth.text=Ustaw minimaln\u0105 szeroko\u015B\u0107 w\u0119z\u0142a
mode_Browse=Tryb przegl\u0105dania map
-mode_File=Tryb przegl\u0105dania plik\u00f3w
+mode_File=Tryb przegl\u0105dania plik\u00F3w
mode_MindMap=Tryb mindmapy
mode_na=Tryb jest niedost\u0119pny
mode_status=Tryb zmieniony na {0}
mode_title=Freeplane - Tryb {0}
modes=Tryb
ModesMenuAction.Browse.text=Przegl\u0105darka mapy
-ModesMenuAction.File.text=Drzewo katalog\u00f3w
+ModesMenuAction.File.text=Drzewo katalog\u00F3w
ModesMenuAction.MindMap.text=Edytor mapy
most_recent_files=Ostatnio otwierane
MoveToRootAction.text=Przejd\u017A do korzenia
NameConditionAction.text=Ustaw nazw\u0119
+navigate=Nawigacja
NavigationNextMapAction.text=Nast\u0119pna mapa
NavigationPreviousMapAction.text=Poprzednia mapa
new=Nowa mapa
@@ -767,70 +763,69 @@ NewerFileRevisionsFoundDialog.cancel=Pomi\u0144
NewerFileRevisionsFoundDialog.cancel.tooltip=Nie otwieraj tego pliku
NewerFileRevisionsFoundDialog.file_last_modified=Znacznik czasowy
NewerFileRevisionsFoundDialog.file_name=Plik
-NewerFileRevisionsFoundDialog.file_size=Bajt\u00f3w
-NewerFileRevisionsFoundDialog.open=Otw\u00f3rz
-NewerFileRevisionsFoundDialog.open.tooltip=Otwiera plik, nawet je\u017celi jest starsz\u0105 wersj\u0105
+NewerFileRevisionsFoundDialog.file_size=Bajt\u00F3w
+NewerFileRevisionsFoundDialog.open=Otw\u00F3rz
+NewerFileRevisionsFoundDialog.open.tooltip=Otwiera plik, nawet je\u017Celi jest starsz\u0105 wersj\u0105
NewerFileRevisionsFoundDialog.question=Znaleziono nowsze wersje {0}!
-NewerFileRevisionsFoundDialog.restore=Odtw\u00f3rz
+NewerFileRevisionsFoundDialog.restore=Odtw\u00F3rz
NewerFileRevisionsFoundDialog.restore.tooltip=Zast\u0105p {0} przez {1}
NewerFileRevisionsFoundDialog.title=Znaleziono nowsze wersje pliku!
-NewFreeNodeAction.text=Nowy w\u0119ze\u0142 swobodny
NewLevelStyleAction.text=Dodaj styl poziomu
newmap.install.addon.question={0} prawdopodobnie jest dodatkiem\nCzy chcesz go zainstalowa\u0107?\n(Wybierz "Nie" aby otworzy\u0107 jako map\u0119)
newmap.install.addon.title=Zainstalowa\u0107 dodatek?
NewMapAction.text=Nowa mapa
-NewMapViewAction.text=Otw\u00f3rz map\u0119 w nowym widoku
+NewMapViewAction.text=Otw\u00F3rz map\u0119 w nowym widoku
NewParentNode.text=Utw\u00F3rz nowego rodzica
NewParentNode.tooltip=<html> Wszystkie zaznaczone w\u0119z\u0142y przenosi do nowego rodzica</html>
NewPreviousSiblingAction.text=Nowy w\u0119ze\u0142 (powy\u017Cej)
NewSiblingAction.text=Nowy w\u0119ze\u0142 (poni\u017Cej)
NewSummaryAction.text=Nowy w\u0119ze\u0142 zbiorczy (zaznaczone w\u0119z\u0142y)
NewUserStyleAction.text=Nowy styl z zaznaczenia
-NextNodeAction.BACK.text=Id\u017a do poprzedniego w\u0119z\u0142a
-NextNodeAction.BACK_N_FOLD.text=Id\u017a do poprzedniego w\u0119z\u0142a (zwi\u0144)
-NextNodeAction.FORWARD.text=Id\u017a do nast\u0119pnego w\u0119z\u0142a
-NextNodeAction.FORWARD_N_FOLD.text=Id\u017a do nast\u0119pnego w\u0119z\u0142a (zwi\u0144)
+NextNodeAction.BACK.text=Id\u017A do poprzedniego w\u0119z\u0142a
+NextNodeAction.BACK_N_FOLD.text=Id\u017A do poprzedniego w\u0119z\u0142a (zwi\u0144)
+NextNodeAction.FORWARD.text=Id\u017A do nast\u0119pnego w\u0119z\u0142a
+NextNodeAction.FORWARD_N_FOLD.text=Id\u017A do nast\u0119pnego w\u0119z\u0142a (zwi\u0144)
no=Nie
-no_copy_attributes_before_paste_attributes=Nie mo\u017cesz wklei\u0107 atrybut\u00f3w zanim ich nie skopiowano.
+no_copy_attributes_before_paste_attributes=Nie mo\u017Cesz wklei\u0107 atrybut\u00F3w zanim ich nie skopiowano.
NO_FORMAT=Tekst
no_format_copy_before_format_paste=Nie mo\u017Cna wklei\u0107 formatowania zanim nie skopiowano go z innego w\u0119z\u0142a.
-no_found_from=Nie znaleziono wyra\u017Cenia "{0}" w w\u0119\u017Ale "{1}".
-no_more_found_from=Nie znaleziono wi\u0119cej wyra\u017Ce\u0144 "{0}" w w\u0119\u017Ale "{1}".
-no_previous_find=Nie wprowadzono wyra\u017cenia do wyszukiwania.
-no_styles_found_in_map=Nie znaleziono \u017cadnych styl\u00f3w w mapie.
+no_found_from=<html>Nie znaleziono wyra\u017Cenia "{0}" w w\u0119\u017Ale "{1}".</html>
+no_more_found_from=<html>Nie znaleziono wi\u0119cej wyra\u017Ce\u0144 "{0}" w w\u0119\u017Ale "{1}".</html>
+no_previous_find=Nie wprowadzono wyra\u017Cenia do wyszukiwania.
+no_styles_found_in_map=Nie znaleziono \u017Cadnych styl\u00F3w w mapie.
node=W\u0119ze\u0142
node_changed_discard_changes=W\u0119ze\u0142 zosta\u0142 zmieniony. Porzuci\u0107 zmiany?
node_is_write_protected=Docelowy w\u0119ze\u0142 jest zabezpieczony przed zapisem.
-node_location_help=Przeci\u0105ganie zmienia po\u0142o\u017cenie w\u0119z\u0142a, ctrl+przeci\u0105ganie zmienia odleg\u0142o\u015bci mi\u0119dzy ga\u0142\u0119ziami, dwuklik i ctrl+dwuklik resetuje po\u0142o\u017cenia.
-node_selector=Zaznaczenie w\u0119z\u0142\u00f3w
+node_location_help=Przeci\u0105ganie zmienia po\u0142o\u017Cenie w\u0119z\u0142a, ctrl+przeci\u0105ganie zmienia odleg\u0142o\u015Bci mi\u0119dzy ga\u0142\u0119ziami, dwuklik i ctrl+dwuklik resetuje po\u0142o\u017Cenia.
+node_selector=Zaznaczenie w\u0119z\u0142\u00F3w
node_selector_message=Kliknij dwa razy aby zaznaczy\u0107 w\u0119ze\u0142
-node_styles=Style w\u0119z\u0142\u00f3w
+node_styles=Style w\u0119z\u0142\u00F3w
NodeBackgroundColorAction.text=Kolor t\u0142a w\u0119z\u0142a...
NodeColorAction.text=Kolor w\u0119z\u0142a...
NodeColorBlendAction.text=Rozja\u015Bnij
NodeDownAction.text=Przesu\u0144 w\u0119ze\u0142 w d\u00F3\u0142
NodeExtensions.EditNodeExtensions=Edytur rozszedzenia w\u0119z\u0142a
NodeExtensions.RemoveNodeExtensions=Usu\u0144 rozszerzenia w\u0119z\u0142a
-NodeListAction.text=Znajd\u017a i zast\u0105p...
+NodeListAction.text=Znajd\u017A i zast\u0105p...
NodeListAction.tooltip=<html> Wy\u015Bwietla daty utworzenia i modyfikacji wszystkich w\u0119z\u0142\u00F3w</html>
NodeShapeAction.bubble.text=Ramka
NodeShapeAction.fork.text=Bez ramki
NodeUpAction.text=Przesu\u0144 w\u0119ze\u0142 w g\u00F3r\u0119
-NodeWidthAction.text=Ustaw granice szeroko\u015bci w\u0119z\u0142a
nonboldify_branch=Bez wyt\u0142uszczenia
nonitalicise_branch=Bez kursywy
normal=Zwyk\u0142y
-not_saved_for_image_error=Mapa musi by\u0107 zapisana zanim b\u0119dziesz m\u00f3g\u0142 wstawi\u0107 obrazek z okna wyboru pliku
+not_saved_for_image_error=Mapa musi by\u0107 zapisana zanim b\u0119dziesz m\u00F3g\u0142 wstawi\u0107 obrazek z okna wyboru pliku
not_saved_for_link_error=Mindmapa musi zosta\u0107 zapisana przed wybraniem odno\u015Bnika do pliku.
-note_window_location=Po\u0142o\u017cenie okna notatnika
+note_window_location=Po\u0142o\u017Cenie okna notatnika
+notes=Notatka
ok=OK
OKAction.text=OK
OnlineReference.text=Dokumentacja mapy online
OpenAction.text=Otw\u00F3rz...
OpenFreeplaneSiteAction.text=Strona domowa Freeplane
-OpenPathAction.text=Otw\u00f3rz plik
-OpenURLMapAction.text=Otw\u00f3rz map\u0119 z URL...
-OpenUserDirAction.text=Otw\u00f3rz katalog u\u017cytkownika
+OpenPathAction.text=Otw\u00F3rz plik
+OpenURLMapAction.text=Otw\u00F3rz map\u0119 z URL...
+OpenUserDirAction.text=Otw\u00F3rz katalog u\u017Cytkownika
option_changes_may_require_restart=Zmiany prawdopodobnie pojawi\u0105 si\u0119 dopiero po ponownym uruchomieniu programu Freeplane.
OptionalDontShowMeAgainDialog.cancel=Nie
OptionalDontShowMeAgainDialog.dontShowAgain=Nie pytaj ponownie
@@ -843,10 +838,10 @@ OptionPanel.ADD_SIBLING=Dodaj w\u0119ze\u0142 na tym samym poziomie
OptionPanel.addons=Dodatki
OptionPanel.always_fold_all_after_load=Zwi\u0144 wszystko
OptionPanel.always_load_last_maps=\u0141aduj ostatnie i nowe mapy
-OptionPanel.always_load_last_maps.tooltip=Otwiera ostnie pliki wg powy\u017cszych ustawie\u0144, nawet otwieraj\u0105c FP wybrany plik mapy
+OptionPanel.always_load_last_maps.tooltip=Otwiera ostnie pliki wg powy\u017Cszych ustawie\u0144, nawet otwieraj\u0105c FP wybrany plik mapy
OptionPanel.always_save_folding=zawsze
OptionPanel.always_save_folding_state=Zawsze zapisuj zmiany stanu zwini\u0119\u0107
-OptionPanel.always_save_folding_state.tooltip=Je\u017celi w\u0142\u0105czone, ka\u017cda zmiana zwini\u0119cia zaznacza map\u0119 jako zmodyfikowan\u0105 i przypomina o konieczno\u015bci jej zapisania.
+OptionPanel.always_save_folding_state.tooltip=Je\u017Celi w\u0142\u0105czone, ka\u017Cda zmiana zwini\u0119cia zaznacza map\u0119 jako zmodyfikowan\u0105 i przypomina o konieczno\u015Bci jej zapisania.
OptionPanel.always_unfold_all_after_load=Rozwi\u0144 wszystko
OptionPanel.antialias=Antyaliasing
OptionPanel.antialias.tooltip=<html> Okre\u015Bla jako\u015B\u0107 wy\u015Bwietlania mindmapy. Im wi\u0119cej antyaliasingu, tym wolniej dzia\u0142a Freeplane</html>
@@ -862,37 +857,36 @@ OptionPanel.automatic=automatyczny
OptionPanel.automaticFormat_level=Formatowanie automatyczne
OptionPanel.automaticFormat_level1=Format korzenia
OptionPanel.automaticFormat_level2=Format w\u0119z\u0142a pierwszego poziomu
-OptionPanel.backup_file_number=Ilo\u015b\u0107 przechowywanych kopii zapasowych
+OptionPanel.backup_file_number=Ilo\u015B\u0107 przechowywanych kopii zapasowych
OptionPanel.Behaviour=Spos\u00F3b dzia\u0142ania
OptionPanel.bezier=bezier
OptionPanel.bubble=ramka
OptionPanel.ca=Katalo\u0144ski
OptionPanel.Cancel=Anuluj
-OptionPanel.center_selected_node=Wy\u015brodkuj wybrane w\u0119z\u0142y
-OptionPanel.check_updates_automatically=Sprawdzaj dost\u0119pno\u015b\u0107 aktualizacji przy uruchomieniu
+OptionPanel.center_selected_node=Wy\u015Brodkuj wybrane w\u0119z\u0142y
+OptionPanel.check_updates_automatically=Sprawdzaj dost\u0119pno\u015B\u0107 aktualizacji przy uruchomieniu
OptionPanel.childpattern=Szablon potomka
OptionPanel.childpattern.tooltip=Wybrany szablon zostanie zastosowany dla wszystkich potomk\u00F3w.
OptionPanel.clear_all_setters=Prze\u0142\u0105cz wszystkie
-OptionPanel.clear_all_setters.tooltip=Enables or disables all change indications.
OptionPanel.cloud=Chmurka
OptionPanel.cloudcolor=Chmurka i kolor
OptionPanel.cloudshape=Kszta\u0142t chmurki
OptionPanel.combined=Ramka/bez ramki
-OptionPanel.compare_as_number=Por\u00f3wnaj jako liczby
+OptionPanel.compare_as_number=Por\u00F3wnaj jako liczby
OptionPanel.convert_to_current_version=<html>Konwertowa\u0107 automatycznie mapy w starszej wersji Freeplane <br>do obecnej wersji?</html>
-OptionPanel.convert_to_current_version.tooltip=<html>Tylko dla bardzo du\u017cych map, kt\u00f3re nie musz\u0105 by\u0107 konwertowane <br>(to jest wiedza ekspercka) mo\u017cesz otwiera\u0107 mapy bez konwertowania.</html>
+OptionPanel.convert_to_current_version.tooltip=<html>Tylko dla bardzo du\u017Cych map, kt\u00F3re nie musz\u0105 by\u0107 konwertowane <br>(to jest wiedza ekspercka) mo\u017Cesz otwiera\u0107 mapy bez konwertowania.</html>
OptionPanel.cs=Czeski
OptionPanel.cut_nodes_without_question=Wycina\u0107 w\u0119z\u0142y bez potwierdzania?
-OptionPanel.cut_nodes_without_question.tooltip=Je\u017celi w\u0142\u0105czone, w\u0119z\u0142y b\u0119d\u0105 wycinane bez potwierdzania. Mo\u017ce to spowodowa\u0107 utrat\u0119 danych przy przypadkowym u\u017cyciu.
+OptionPanel.cut_nodes_without_question.tooltip=Je\u017Celi w\u0142\u0105czone, w\u0119z\u0142y b\u0119d\u0105 wycinane bez potwierdzania. Mo\u017Ce to spowodowa\u0107 utrat\u0119 danych przy przypadkowym u\u017Cyciu.
OptionPanel.da=Du\u0144ski
OptionPanel.date_format=Standardowe formatowanie daty
-OptionPanel.date_format.tooltip=Mo\u017cliwe opcje: SHORT, MEDIUM, LONG, FULL lub wz\u00f3r typu "MM/dd/yyyy"
+OptionPanel.date_format.tooltip=Mo\u017Cliwe opcje: SHORT, MEDIUM, LONG, FULL lub wz\u00F3r typu "MM/dd/yyyy"
OptionPanel.datetime_format=Standardowe formatowanie daty i czasu
-OptionPanel.datetime_format.tooltip=Zar\u00f3wno: <styl daty>,<styl czasu> (style: SHORT, MEDIUM, LONG lub FULL) lub pe\u0142ny wz\u00f3r typu "M/d/yyyy hh:mm"
+OptionPanel.datetime_format.tooltip=Zar\u00F3wno: <styl daty>,<styl czasu> (style: SHORT, MEDIUM, LONG lub FULL) lub pe\u0142ny wz\u00F3r typu "M/d/yyyy hh:mm"
OptionPanel.de=Niemiecki
OptionPanel.default=domy\u015Blny
-OptionPanel.default_attribute_key_column_width=Domy\u015blna szeroko\u015b\u0107 klucza atrybutu
-OptionPanel.default_attribute_value_column_width=Domy\u015blna szeroko\u015b\u0107 warto\u015bci atrybutu
+OptionPanel.default_attribute_key_column_width=Domy\u015Blna szeroko\u015B\u0107 klucza atrybutu
+OptionPanel.default_attribute_value_column_width=Domy\u015Blna szeroko\u015B\u0107 warto\u015Bci atrybutu
OptionPanel.default_browser_command_mac=Mac
OptionPanel.default_browser_command_mac.tooltip=<html> Dla Mac'a: (dzi\u0119kujemy Nickowi!)</html>
OptionPanel.default_browser_command_other_os=Inne systemy operacyjne
@@ -901,27 +895,27 @@ OptionPanel.default_browser_command_windows_9x=Windows 9x
OptionPanel.default_browser_command_windows_9x.tooltip=<html> Dla Windows (znaki "" s\u0105 konieczne z powodu odno\u015Bnik\u00F3w, kt\u00F3re zawieraj\u0105 "=" w sobie)</html>
OptionPanel.default_browser_command_windows_nt=Windows NT
OptionPanel.default_browser_command_windows_nt.tooltip=<html> Dla Windows (znaki "" s\u0105 konieczne z powodu odno\u015Bnik\u00F3w, kt\u00F3re zawieraj\u0105 "=" w sobie)</html>
-OptionPanel.default_charset=Zestaw znak\u00f3w
+OptionPanel.default_charset=Zestaw znak\u00F3w
OptionPanel.Defaults=Domy\u015Blne
OptionPanel.delete_automatic_saves_at_exit=Usu\u0144 automatyczne kopie po zako\u0144czeniu programu
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Po normalnym zamkni\u0119ciu Freeplane b\u0119dzie usuwa\u0142 wszystkie automatycznie utworzone pliki</html>
OptionPanel.delete_nodes_without_question=Usuwa\u0107 w\u0119z\u0142y bez potwierdzania?
-OptionPanel.delete_nodes_without_question.tooltip=Je\u017celi w\u0142\u0105czone, w\u0119z\u0142y b\u0119d\u0105 usuwane bez potwierdzania. Mo\u017ce to spowodowa\u0107 utrat\u0119 danych przy przypadkowym u\u017cyciu.
+OptionPanel.delete_nodes_without_question.tooltip=Je\u017Celi w\u0142\u0105czone, w\u0119z\u0142y b\u0119d\u0105 usuwane bez potwierdzania. Mo\u017Ce to spowodowa\u0107 utrat\u0119 danych przy przypadkowym u\u017Cyciu.
OptionPanel.disable_cursor_move_paper=Wy\u0142\u0105cz specjalny kursor podczas przewijania
OptionPanel.disable_cursor_move_paper.tooltip=<html> Nie wy\u015Bwietlaj specjalnego kursora podczas przewijania za pomoc\u0105 przeci\u0105gania t\u0142a</html>
-OptionPanel.display_inline_editor_for_all_new_nodes=Wy\u015bwietlaj edytor w mapie (inline) dla wszystkich nowych w\u0119z\u0142\u00f3w
-OptionPanel.display_node_id=Wy\u015bwietlaj ID w\u0119z\u0142a
+OptionPanel.display_inline_editor_for_all_new_nodes=Wy\u015Bwietlaj edytor w mapie (inline) dla wszystkich nowych w\u0119z\u0142\u00F3w
+OptionPanel.display_node_id=Wy\u015Bwietlaj ID w\u0119z\u0142a
OptionPanel.edgecolor=Kolor ga\u0142\u0119zi
OptionPanel.edgecolor.tooltip=Kopiuj w\u0142a\u015Bciwo\u015B\u0107 ga\u0142\u0119zi do w\u0119z\u0142a rodzica (dzia\u0142a te\u017C na wszytkich potomk\u00F3w)
OptionPanel.edgestyle=Styl ga\u0142\u0119zi
OptionPanel.edgestyle.tooltip=Kopiuj w\u0142a\u015Bciwo\u015B\u0107 ga\u0142\u0119zi do w\u0119z\u0142a rodzica (dzia\u0142a te\u017C na wszytkich potomk\u00F3w)
OptionPanel.edgewidth=Szeroko\u015B\u0107 ga\u0142\u0119zi
OptionPanel.edgewidth.tooltip=Kopiuj w\u0142a\u015Bciwo\u015B\u0107 ga\u0142\u0119zi do w\u0119z\u0142a rodzica (dzia\u0142a te\u017C na wszytkich potomk\u00F3w)
-OptionPanel.EDIT_CURRENT=Nadpisuj zawarto\u015b\u0107
-OptionPanel.editor_extra_width=Krok zwi\u0119kszania szeroko\u015bci w\u0119z\u0142a
-OptionPanel.editor_extra_width.tooltip=<html>Okre\u015bla liczb\u0119 pikseli, o kt\u00f3r\u0105 zwi\u0119ksza si\u0119 szeroko\u015b\u0107 w\u0119z\u0142a je\u017celi tekst wychodzi poza aktualn\u0105 szeroko\u015b\u0107.</html>
+OptionPanel.EDIT_CURRENT=Nadpisuj zawarto\u015B\u0107
+OptionPanel.editor_extra_width=Krok zwi\u0119kszania szeroko\u015Bci w\u0119z\u0142a
+OptionPanel.editor_extra_width.tooltip=<html>Okre\u015Bla liczb\u0119 pikseli, o kt\u00F3r\u0105 zwi\u0119ksza si\u0119 szeroko\u015B\u0107 w\u0119z\u0142a je\u017Celi tekst wychodzi poza aktualn\u0105 szeroko\u015B\u0107.</html>
OptionPanel.el=Grecki
-OptionPanel.el__buttons_above=Przyciski u g\u00f3ry
+OptionPanel.el__buttons_above=Przyciski u g\u00F3ry
OptionPanel.el__enter_confirms_by_default=Enter domy\u015Blnie zamyka edytorek
OptionPanel.el__max_default_window_height=Maksymalna wysoko\u015B\u0107 okna
OptionPanel.el__max_default_window_width=Maksymalna szeroko\u015B\u0107 okna
@@ -932,19 +926,19 @@ OptionPanel.en=Angielski
OptionPanel.Environment=\u015Arodowisko
OptionPanel.es=Hiszpa\u0144ski
OptionPanel.et=Esto\u0144ski
-OptionPanel.execute_scripts_without_asking=Wykonywa\u0107 skrypty bez potwierdzania?
-OptionPanel.execute_scripts_without_asking.tooltip=<html>Skrypty Freeplane s\u0105 w zasadzie w stanie wykona\u0107 ka\u017cd\u0105 czynno\u015b\u0107 na Twoim komputerze. <br>Tak wi\u0119c nie powiniene\u015b uruchamia\u0107 skrypt\u00f3w z niepewnych \u017ar\u00f3de\u0142.</html>
+OptionPanel.execute_scripts_without_asking=W\u0142\u0105czone wykonywanie skrypt\u00F3w bez potwierdzania
+OptionPanel.execute_scripts_without_asking.tooltip=<html>Skrypty Freeplane s\u0105 w zasadzie w stanie wykona\u0107 ka\u017Cd\u0105 czynno\u015B\u0107 na Twoim komputerze. <br>Tak wi\u0119c nie powiniene\u015B uruchamia\u0107 skrypt\u00F3w z niepewnych \u017Ar\u00F3de\u0142.</html>
OptionPanel.execute_scripts_without_exec_restriction=Zezwalaj na uruchamianie zewn\u0119trznych aplikacji (NIE zalecane)
-OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>Je\u017celi Twoje skrypty Groovy musz\u0105 uruchamia\u0107 zewn\u0119trzne aplikacje (takie jak przegl\u0105darka) bez pytania(!),<br>musisz w\u0142\u0105czy\u0107 t\u0105 opcj\u0119. <br>Ale u\u017cywaj jej ostro\u017cnie, poniewa\u017c z\u0142o\u015bliwe skrypty mog\u0105 zagra\u017ca\u0107 Twojemu komputerowi!</body></html>
+OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>Je\u017Celi Twoje skrypty Groovy musz\u0105 uruchamia\u0107 zewn\u0119trzne aplikacje (takie jak przegl\u0105darka) bez pytania(!),<br>musisz w\u0142\u0105czy\u0107 t\u0105 opcj\u0119. <br>Ale u\u017Cywaj jej ostro\u017Cnie, poniewa\u017C z\u0142o\u015Bliwe skrypty mog\u0105 zagra\u017Ca\u0107 Twojemu komputerowi!</body></html>
OptionPanel.execute_scripts_without_file_restriction=Zezwalaj na operacje na plikach (NIE zalecane)
-OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>Je\u017celi Twoje skrypty Groovy musz\u0105 wykonywa\u0107 operacje na plikach (takie jak otwarcie, zamkni\u0119cie, czytanie, zapis, kasowanie(!)),<br>musisz w\u0142\u0105czy\u0107 t\u0105 opcj\u0119. <br>Ale u\u017cywaj jej ostro\u017cnie, poniewa\u017c z\u0142o\u015bliwe skrypty mog\u0105 zagra\u017ca\u0107 Twojemu komputerowi!</body></html>
+OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>Je\u017Celi Twoje skrypty Groovy musz\u0105 wykonywa\u0107 operacje na plikach (takie jak otwarcie, zamkni\u0119cie, czytanie, zapis, kasowanie(!)),<br>musisz w\u0142\u0105czy\u0107 t\u0105 opcj\u0119. <br>Ale u\u017Cywaj jej ostro\u017Cnie, poniewa\u017C z\u0142o\u015Bliwe skrypty mog\u0105 zagra\u017Ca\u0107 Twojemu komputerowi!</body></html>
OptionPanel.execute_scripts_without_network_restriction=Zezwalaj na operacje sieciowe (NIE zalecane)
-OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>Je\u017celi Twoje skrypty Groovy musz\u0105 wykonywa\u0107 operacje sieciowe,<br>musisz w\u0142\u0105czy\u0107 t\u0105 opcj\u0119. <br>Ale u\u017cywaj jej ostro\u017cnie, poniewa\u017c z\u0142o\u015bliwe skrypty mog\u0105 odczyta\u0107 Twoje prywatne informacje!</body></html>
-OptionPanel.execute_scripts_without_write_restriction=Pozw\u00f3l na operacje zapisywania plik\u00f3w (NIE polecane)
+OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>Je\u017Celi Twoje skrypty Groovy musz\u0105 wykonywa\u0107 operacje sieciowe,<br>musisz w\u0142\u0105czy\u0107 t\u0105 opcj\u0119. <br>Ale u\u017Cywaj jej ostro\u017Cnie, poniewa\u017C z\u0142o\u015Bliwe skrypty mog\u0105 odczyta\u0107 Twoje prywatne informacje!</body></html>
+OptionPanel.execute_scripts_without_write_restriction=Pozw\u00F3l na operacje zapisywania plik\u00F3w (NIE polecane)
OptionPanel.experimental_file_locking_on=Eksperymentalne blokowanie plik\u00F3w
OptionPanel.experimental_file_locking_on.tooltip=<html> Funkcja testowa. U\u017Cywasz na w\u0142asne ryzyko</html>
OptionPanel.export_icons_in_html=Eksport ikon razem z HTML
-OptionPanel.export_icons_in_html.tooltip=<html> Okre\u015Bla czy podczas eksportu do HTML maj\u0105 by\u0107 do\u0142\u0105czane ikony. Problem z ikonami polega na tym,<br>\u017Ce cz\u0119sto odno\u015Bniki do nich przestaj\u0105 by\u0107 prawid\u0142owe po przeniesieniu na inny komputer</html>
+OptionPanel.export_icons_in_html.tooltip=<html> Okre\u015Bla czy podczas eksportu do HTML maj\u0105 by\u0107 do\u0142\u0105czane ikony. Problem z ikonami polega na tym, \u017Ce cz\u0119sto odno\u015Bniki do nich przestaj\u0105 by\u0107 prawid\u0142owe po przeniesieniu na inny komputer.</html>
OptionPanel.Files=Pliki
OptionPanel.first=pierwsza
OptionPanel.foldingsymbolwidth=\u015Arednica symbolu zwini\u0119tych w\u0119z\u0142\u00F3w
@@ -956,10 +950,10 @@ OptionPanel.formula_disable_caching=Wy\u0142\u0105cz cache'owanie wykonywania fo
OptionPanel.formula_disable_plugin=Wy\u0142\u0105cz wykonywanie formu\u0142
OptionPanel.fr=Francuski
OptionPanel.gl=Galicyjski
-OptionPanel.goto_note_end_on_edit=Przenie\u015b w notatce kursor na koniec
-OptionPanel.grid_size=Odleg\u0142o\u015bci mi\u0119dzy punktami siatki(przyci\u0105ganie)
+OptionPanel.goto_note_end_on_edit=Przenie\u015B w notatce kursor na koniec
+OptionPanel.grid_size=Odleg\u0142o\u015Bci mi\u0119dzy punktami siatki(przyci\u0105ganie)
OptionPanel.gtk=Gtk
-OptionPanel.hide_edge=ukryj kraw\u0119d\u017a
+OptionPanel.hide_edge=ukryj kraw\u0119d\u017A
OptionPanel.horizontal=poziomo
OptionPanel.hr=Horwacki
OptionPanel.HTML=HTML
@@ -971,14 +965,14 @@ OptionPanel.html_export_no_folding=bez zwijania
OptionPanel.hu=W\u0119gierski
OptionPanel.icon=Ikona
OptionPanel.icon.tooltip=Je\u017Celi zaaplikujesz w\u0119ze\u0142 b\u0119dzie mia\u0142 dok\u0142adnie t\u0105 ikon\u0119.
-OptionPanel.icons.list=Lista wy\u015bwietlanych standardowych ikon
-OptionPanel.icons.list.tooltip=Tutaj mo\u017cesz uporz\u0105dkowa\u0107 lub wy\u0142\u0105czy\u0107 standardowe ikony. Ikony musz\u0105 by\u0107 oddzielane znakiem ";".
+OptionPanel.icons.list=Lista wy\u015Bwietlanych standardowych ikon
+OptionPanel.icons.list.tooltip=Tutaj mo\u017Cesz uporz\u0105dkowa\u0107 lub wy\u0142\u0105czy\u0107 standardowe ikony. Ikony musz\u0105 by\u0107 oddzielane znakiem ";".
OptionPanel.id=Indonezyjski
-OptionPanel.IGNORE=Nic nie r\u00f3b
-OptionPanel.il__enter_confirms_by_default=Domy\u015blnie Enter potwierdza
+OptionPanel.IGNORE=Nic nie r\u00F3b
+OptionPanel.il__enter_confirms_by_default=Domy\u015Blnie Enter potwierdza
OptionPanel.it=W\u0142oski
OptionPanel.ja=Japo\u0144ski
-OptionPanel.key_type_action=Przy naci\u015bni\u0119ciu klawisza
+OptionPanel.key_type_action=Przy naci\u015Bni\u0119ciu klawisza
OptionPanel.Keystrokes=Klawiatura
OptionPanel.ko=Korea\u0144ski
OptionPanel.label_font_family=Rodzina czcionek
@@ -996,21 +990,21 @@ OptionPanel.load_folding=Przy wczytywaniu
OptionPanel.load_folding_from_map_default_fold_all=Za\u0142aduj z mapy, lub zwi\u0144 wszystko
OptionPanel.load_folding_from_map_default_unfold_all=Za\u0142aduj z mapy, lub rozwi\u0144 wszystko
OptionPanel.load_last_map=Automatycznie otw\u00F3rz ostatni\u0105 map\u0119
-OptionPanel.load_last_map.tooltip=<html>Je\u017celi zaznaczone, podczas uruchamiania Freeplanea zostanie za\u0142adowana ostatnio otworzona mapa.</html>
-OptionPanel.load_last_maps=Otw\u00f3rz wszystkie mapy z poprzedzniej sesji
-OptionPanel.lookandfeel=Styl interfejsu u\u017cytkownika (Look&Feel)
+OptionPanel.load_last_map.tooltip=<html>Je\u017Celi zaznaczone, podczas uruchamiania Freeplanea zostanie za\u0142adowana ostatnio otworzona mapa.</html>
+OptionPanel.load_last_maps=Otw\u00F3rz wszystkie mapy z poprzedzniej sesji
+OptionPanel.lookandfeel=Styl interfejsu u\u017Cytkownika (Look&Feel)
OptionPanel.lookandfeel.tooltip=<html> Look&Feel - wygl\u0105d programu. Je\u015Bli chcesz u\u017Cy\u0107 w\u0142asnego, wprowad\u017A nazw\u0119 klasy i upewnij si\u0119, \u017Ce odpowiednie pliki *.jar s\u0105 \u0142adowane.<br>Je\u015Bli masz jaki\u015B problem z Look&Feel wybierz '\u017Baden'. Dzia\u0142a r\u00F3wnie\u017C z appletami</html>
OptionPanel.lt=Litewski
-OptionPanel.max_displayed_node_count=Maksymalna liczba wy\u015bwietlanych w\u0119z\u0142\u00f3w
-OptionPanel.max_menu_item_count=Maksymalna liczba element\u00f3w menu
-OptionPanel.max_menu_item_count.tooltip=Ogranicza liczb\u0119 element\u00f3w w pojedynczym podmenu, najmniej 10
+OptionPanel.max_displayed_node_count=Maksymalna liczba wy\u015Bwietlanych w\u0119z\u0142\u00F3w
+OptionPanel.max_menu_item_count=Maksymalna liczba element\u00F3w menu
+OptionPanel.max_menu_item_count.tooltip=Ogranicza liczb\u0119 element\u00F3w w pojedynczym podmenu, najmniej 10
OptionPanel.max_node_width=Maksymalna szeroko\u015B\u0107 w\u0119z\u0142a
OptionPanel.max_node_width.tooltip=<html> Domy\u015Blna maksymalna szeroko\u015B\u0107 w\u0119z\u0142a w pikselach</html>
-OptionPanel.max_shortened_text_length=Maksymalna szeroko\u015b\u0107 skr\u00f3conego w\u0119z\u0142a
+OptionPanel.max_shortened_text_length=Maksymalna szeroko\u015B\u0107 skr\u00F3conego w\u0119z\u0142a
OptionPanel.metal=Metal
-OptionPanel.min_node_width=Minimalna szeroko\u015b\u0107 w\u0119z\u0142a
+OptionPanel.min_node_width=Minimalna szeroko\u015B\u0107 w\u0119z\u0142a
OptionPanel.motif=Motif
-OptionPanel.nb=Norweski Bokm\u00e5l
+OptionPanel.nb=Norweski Bokm\u00E5l
OptionPanel.never_save_folding=nigdy
OptionPanel.nl=Du\u0144ski, Flamandzki
OptionPanel.nn=Norweski Nynorsk
@@ -1023,28 +1017,26 @@ OptionPanel.nodefontitalic=Kursywa
OptionPanel.nodefontname=Czcionka w\u0119z\u0142a
OptionPanel.nodefontsize=Wielko\u015B\u0107 czcionki w\u0119z\u0142a
OptionPanel.nodeformat=Formatowanie
-OptionPanel.nodenumbering=Numeracja w\u0119z\u0142\u00f3w
+OptionPanel.nodenumbering=Numeracja w\u0119z\u0142\u00F3w
OptionPanel.nodenumbering.tooltip=Dodaje numer (np. 1.3.1) do tekstu w\u0119z\u0142a
-OptionPanel.nodeshape=Styl w\u0119z\u0142a
-OptionPanel.nodeshape.tooltip=nodeshape.tooltip
OptionPanel.nodetext=Edytuj w\u0119ze\u0142
OptionPanel.nodetext.tooltip=nodetext.tooltip
OptionPanel.nothing=Nic
OptionPanel.number_format=Standardowe formatowanie liczb
-OptionPanel.number_format.tooltip=Wzr\u00f3 zawieraj\u0105cy '#' dla opcjonalnych lub '0' dla obowi\u0105zkowych cyfr. Przyk\u0142ady: "0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_format.tooltip=Wzr\u00F3 zawieraj\u0105cy '#' dla opcjonalnych lub '0' dla obowi\u0105zkowych cyfr. Przyk\u0142ady: "0.00", "0.0%", "$#.00", "#0"
OptionPanel.number_of_different_files_for_automatic_save=Ilo\u015B\u0107 przechowywanych automatycznych kopii
-OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> Liczba plik\u00F3w u\u017Cywanych do przechowywania automatycznych zapis\u00F3w (n-plik\u00F3w).<br>Pierwsza kopia jest przechowywana w pliku 1, a\u017C do n+1-kopii, kt\u00F3ra jest zapisywana znowu w pliku 1 (cyklicznie)</html>
+OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> liczba n r\u00F3\u017Cnych plik\u00F3w u\u017Cywanych do przechowywania automatycznych zapis\u00F3w. Pierwsza kopia jest przechowywana w pliku 1, a\u017C do n+1-kopii, kt\u00F3ra jest zapisywana znowu w pliku 1 (cyklicznie)</html>
OptionPanel.OK=Zapisz ustawienia
OptionPanel.org.freeplane.plugin.bugreport=Polityka
OptionPanel.org.freeplane.plugin.bugreport.allowed=Zawsze wysy\u0142aj
-OptionPanel.org.freeplane.plugin.bugreport.ask=Poka\u017c okno dialogowe raportu
+OptionPanel.org.freeplane.plugin.bugreport.ask=Poka\u017C okno dialogowe raportu
OptionPanel.org.freeplane.plugin.bugreport.denied=Nigdy nie wysy\u0142aj
-OptionPanel.outline_hgap=Pozioma odleg\u0142o\u015b\u0107
-OptionPanel.outline_vgap=Pionowa odleg\u0142o\u015b\u0107
-OptionPanel.paint_connectors_behind=Rysuj po\u0142\u0105czenia za (poni\u017cej) w\u0119z\u0142ami
+OptionPanel.outline_hgap=Pozioma odleg\u0142o\u015B\u0107
+OptionPanel.outline_vgap=Pionowa odleg\u0142o\u015B\u0107
+OptionPanel.paint_connectors_behind=Rysuj po\u0142\u0105czenia za (poni\u017Cej) w\u0119z\u0142ami
OptionPanel.parse_data=Rozpoznawaj liczby i dat\u0119-godzin\u0119
-OptionPanel.parse_data.tooltip=Pr\u00f3buje przetworzy\u0107 dat\u0119, dat\u0119-godzin\u0119 i liczby i zastosowa\u0107 stoandardowe formatowania. Przyk\u0142ady: 100,000.00, 12/31, 12/31/99, 1999-12-31 and 1999-12-31 23:59
-OptionPanel.path_property_may_not_be_empty=W\u0142a\u015bciwo\u015bci \u015bcie\u017cki nie mog\u0105 by\u0107 puste. Zmiana zosta\u0142a anulowana.
+OptionPanel.parse_data.tooltip=Pr\u00F3buje przetworzy\u0107 dat\u0119, dat\u0119-godzin\u0119 i liczby i zastosowa\u0107 stoandardowe formatowania. Przyk\u0142ady: 100,000.00, 12/31, 12/31/99, 1999-12-31 and 1999-12-31 23:59
+OptionPanel.path_property_may_not_be_empty=W\u0142a\u015Bciwo\u015Bci \u015Bcie\u017Cki nie mog\u0105 by\u0107 puste. Zmiana zosta\u0142a anulowana.
OptionPanel.patternname=Nazwa
OptionPanel.patternname.tooltip=Unikatowa nazwa szablonu
OptionPanel.pl=*Polski*
@@ -1052,30 +1044,30 @@ OptionPanel.placenewbranches=Po\u0142o\u017Cenie nowych ga\u0142\u0119zi
OptionPanel.placenewbranches.tooltip=<html> Gdzie umieszcza\u0107 nowe ga\u0142\u0119zie</html>
OptionPanel.plugins=Wtyczki
OptionPanel.printonwhitebackground=<html>Bia\u0142e t\u0142o przy wydruku</html>
-OptionPanel.printonwhitebackground.tooltip=<html>Zawsze u\u017cywaj bia\u0142ego t\u0142a przy wydruku</html>
+OptionPanel.printonwhitebackground.tooltip=<html>Zawsze u\u017Cywaj bia\u0142ego t\u0142a przy wydruku</html>
OptionPanel.pt_BR=Portugalski (Brazylia)
OptionPanel.pt_PT=Portugalski (Portugalia)
OptionPanel.RECT=Prostok\u0105t
OptionPanel.relative=wzgl\u0119dny
-OptionPanel.remind_use_rich_text_in_new_nodes=U\u017cywaj tekstu sformatowanego dla wklejanych w\u0119z\u0142\u00f3w
+OptionPanel.remind_use_rich_text_in_new_nodes=U\u017Cywaj tekstu sformatowanego dla wklejanych w\u0119z\u0142\u00F3w
OptionPanel.remove_notes_without_question=Usuwa\u0107 notatki bez potwierdzania?
-OptionPanel.remove_notes_without_question.tooltip=Je\u017celi w\u0142\u0105czone, notatki nale\u017c\u0105ce do wybranych w\u0119z\u0142\u00f3w b\u0119d\u0105 usuwane bez potwierdzania. Mo\u017ce to spowodowa\u0107 utrat\u0119 danych przy przypadkowym u\u017cyciu.
-OptionPanel.resources_use_default_font_for_notes_too=U\u017cywaj domy\u015blnej czcionki tak\u017ce dla notatek.
-OptionPanel.resources_use_margin_top_zero_for_notes=Usu\u0144 g\u00f3rny margines dla notatek
+OptionPanel.remove_notes_without_question.tooltip=Je\u017Celi w\u0142\u0105czone, notatki nale\u017C\u0105ce do wybranych w\u0119z\u0142\u00F3w b\u0119d\u0105 usuwane bez potwierdzania. Mo\u017Ce to spowodowa\u0107 utrat\u0119 danych przy przypadkowym u\u017Cyciu.
+OptionPanel.resources_use_default_font_for_notes_too=U\u017Cywaj domy\u015Blnej czcionki tak\u017Ce dla notatek.
+OptionPanel.resources_use_margin_top_zero_for_notes=Usu\u0144 g\u00F3rny margines dla notatek
OptionPanel.revision_color=Kolor wersji
-OptionPanel.revision_color.tooltip=Kolor t\u0142a dla zmodyfikowanych w\u0119z\u0142\u00f3w.
+OptionPanel.revision_color.tooltip=Kolor t\u0142a dla zmodyfikowanych w\u0119z\u0142\u00F3w.
OptionPanel.ROUND_RECT=Zaokr\u0105glony prostok\u0105t
OptionPanel.ru=Rosyjski
OptionPanel.save_folding=Zapisuj zwini\u0119cia
-OptionPanel.save_folding_if_map_is_changed=je\u017celi mapa zosta\u0142a zmodyfikowana
+OptionPanel.save_folding_if_map_is_changed=je\u017Celi mapa zosta\u0142a zmodyfikowana
OptionPanel.save_modification_times=Zapisuj czas modyfikacji
OptionPanel.script_classpath=classpath skrytpu: Katalogi zawieraj\u0105ce klasy lub/i JARy
-OptionPanel.script_classpath.tooltip=<html>Lista JAR\u00f3w i/lub katalog\u00f3w do dodania do \u015bcie\u017cki klas (classpath) skrypt\u00f3w i formu\u0142. <br>Use ; (Windows) or : (Linux, Mac) to separate entries.<br>Directories will be scanned for JARs and for .class files.<br>Paths that are not absolute are considered relative to the Freeplane user directory.<br>If you set the classpath you have to permit read access too!</html>
-OptionPanel.script_directories=\u015acie\u017cka wyszukiwania skrypt\u00f3w
-OptionPanel.script_directories.tooltip=<html>Lista katalog\u00f3w.<br>U\u017cyj ; (Windows) lub : (Linux, Mac) aby rozdzieli\u0107 wpisy.<br>\u015acie\u017cki nie b\u0119d\u0105ce bezwzgl\u0119dnymi s\u0105 traktowane jako wzgl\u0119de do katalogu u\u017cytkownika Freeplane'a.</html>
-OptionPanel.script_user_key_name_for_signing=Opcjonalny alias klucza u\u017cytkownika dla podpisywania skrypt\u00f3w
-OptionPanel.script_user_key_name_for_signing.tooltip=<html>Je\u017celi chcesz podpisywa\u0107 swoje skrypty, wpisz tutaj alias klucza. <br>Oczekuje si\u0119, \u017ce klucz jest przechowywany w domy\u015blnej bazie kluczy. <br>Has\u0142o tajnego klucza musi si\u0119 zgadza\u0107 z has\u0142em bazy kluczy (domy\u015blnie).</html>
-OptionPanel.scrollbar_increment=Szybko\u015b\u0107 przewijania
+OptionPanel.script_classpath.tooltip=<html>Lista JAR\u00F3w i/lub katalog\u00F3w do dodania do \u015Bcie\u017Cki klas (classpath) skrypt\u00F3w i formu\u0142. <br>Use ; (Windows) or : (Linux, Mac) to separate entries.<br>Directories will be scanned for JARs and for .class files.<br>Paths that are not absolute are considered relative to the Freeplane user directory.<br>If you set the classpath you have to permit read access too!</html>
+OptionPanel.script_directories=\u015Acie\u017Cka wyszukiwania skrypt\u00F3w
+OptionPanel.script_directories.tooltip=<html>Lista katalog\u00F3w.<br>U\u017Cyj ; (Windows) lub : (Linux, Mac) aby rozdzieli\u0107 wpisy.<br>\u015Acie\u017Cki nie b\u0119d\u0105ce bezwzgl\u0119dnymi s\u0105 traktowane jako wzgl\u0119de do katalogu u\u017Cytkownika Freeplane'a.</html>
+OptionPanel.script_user_key_name_for_signing=Opcjonalny alias klucza u\u017Cytkownika dla podpisywania skrypt\u00F3w
+OptionPanel.script_user_key_name_for_signing.tooltip=<html>Je\u017Celi chcesz podpisywa\u0107 swoje skrypty, wpisz tutaj alias klucza. <br>Oczekuje si\u0119, \u017Ce klucz jest przechowywany w domy\u015Blnej bazie kluczy. <br>Has\u0142o tajnego klucza musi si\u0119 zgadza\u0107 z has\u0142em bazy kluczy (domy\u015Blnie).</html>
+OptionPanel.scrollbar_increment=Szybko\u015B\u0107 przewijania
OptionPanel.selection_method=Metoda zaznaczania
OptionPanel.selection_method.tooltip=<html> Bezpo\u015Brednio: w\u0119ze\u0142 jest zaznaczany od razu po wskazaniu myszk\u0105<br>Z op\u00F3\u017Anieniem: w\u0119ze\u0142 jest zaznaczany po up\u0142yni\u0119ciu okre\u015Blonego czasu od wskazania myszk\u0105<br>Przez klikni\u0119cie: w\u0119ze\u0142 jest zaznaczany klikni\u0119ciu na nim myszk\u0105</html>
OptionPanel.selection_method_by_click=przez klikni\u0119cie
@@ -1095,7 +1087,7 @@ OptionPanel.separator.default_colors=Domy\u015Blne kolory
OptionPanel.separator.default_fonts=Domy\u015Blne czcionki
OptionPanel.separator.default_styles=Domy\u015Blne style
OptionPanel.separator.EdgeControls=Ga\u0142\u0119zie
-OptionPanel.separator.edit_long_node_window=Edytor w\u0119z\u0142\u00f3w
+OptionPanel.separator.edit_long_node_window=Edytor w\u0119z\u0142\u00F3w
OptionPanel.separator.editing=Ustawienia edytora
OptionPanel.separator.files=Pliki
OptionPanel.separator.formula=Formu\u0142y
@@ -1121,7 +1113,7 @@ OptionPanel.separator.NodeShape=Kszta\u0142t w\u0119z\u0142a
OptionPanel.separator.NodeStyle=Styl w\u0119z\u0142a
OptionPanel.separator.NodeText=Tekst w\u0119z\u0142a
OptionPanel.separator.notifications=Potwierdzenia
-OptionPanel.separator.org.freeplane.plugin.bugreport=Automatyczne raportowanie b\u0142\u0119d\u00f3w
+OptionPanel.separator.org.freeplane.plugin.bugreport=Automatyczne raportowanie b\u0142\u0119d\u00F3w
OptionPanel.separator.other_defaults=Inne ustawienia domy\u015Blne
OptionPanel.separator.others=Inne skr\u00F3ty klawiszowe
OptionPanel.separator.outline_view=Widok konspektu
@@ -1134,37 +1126,37 @@ OptionPanel.separator.search=Wyszukiwanie
OptionPanel.separator.selection_colors=Kolory zaznaczenia
OptionPanel.separator.selection_method=Metoda zaznaczania
OptionPanel.separator.single_instance_mode=Pojedyncza instancja programu
-OptionPanel.separator.size_limits=Ograniczenie wielko\u015bci
+OptionPanel.separator.size_limits=Ograniczenie wielko\u015Bci
OptionPanel.separator.spelling=Opcje sprawdzania pisowni
OptionPanel.separator.status=Wiersz statusu
-OptionPanel.separator.tooltip=Czas dymk\u00f3w podpowiedzi
+OptionPanel.separator.tooltip=Czas dymk\u00F3w podpowiedzi
OptionPanel.separator.undo=Cofnij
OptionPanel.separator.updates=Aktualizacja programu
OptionPanel.set_property_text=Zmie\u0144
OptionPanel.set_property_text.tooltip=Pusty: nie dotykaj; Minus=Usu\u0144 w\u0142a\u015Bciwo\u015B\u0107 (ustaw warto\u015B\u0107 domy\u015Bln\u0105); Plus=Zmie\u0144 w\u0142a\u015Bciwo\u015B\u0107
OptionPanel.setscript=Zmieni\u0107?
-OptionPanel.setscript.tooltip=Skrypt mo\u017ce zosta\u0107 powi\u0105zany ze stylem.
+OptionPanel.setscript.tooltip=Skrypt mo\u017Ce zosta\u0107 powi\u0105zany ze stylem.
OptionPanel.sharp_bezier=Ostra krzywa B\u00E9ziera
OptionPanel.sharp_linear=Ostra linia
-OptionPanel.show_icon_for_attributes=Poka\u017c ikony atrybut\u00f3w
-OptionPanel.show_node_tooltips=Wy\u015bwietlaj dymki podpowiedzi dla w\u0119z\u0142\u00f3w
-OptionPanel.show_note_icons=Poka\u017c ikony notatek
-OptionPanel.show_styles_in_tooltip=Wy\u015bwietlaj style w\u0119z\u0142a w dymkach podpowiedzi
+OptionPanel.show_icon_for_attributes=Poka\u017C ikony atrybut\u00F3w
+OptionPanel.show_node_tooltips=Wy\u015Bwietlaj dymki podpowiedzi dla w\u0119z\u0142\u00F3w
+OptionPanel.show_note_icons=Poka\u017C ikony notatek
+OptionPanel.show_styles_in_tooltip=Wy\u015Bwietlaj style w\u0119z\u0142a w dymkach podpowiedzi
OptionPanel.signed_script_are_trusted=Ufaj podpisanym skryptom (zalecane).
-OptionPanel.signed_script_are_trusted.tooltip=Je\u017celi skrypty s\u0105 podpisane przez zaufanych dostawc\u00f3w (np. przez autor\u00f3w Freeplane lub przez Ciebie), s\u0105 wykowywane bez ogranicze\u0144.
-OptionPanel.single_backup_directory=U\u017cyj pojedynczego katalogo dla kopii bezpiecze\u0144stwa plik\u00f3w
-OptionPanel.single_backup_directory.tooltip=Okre\u015bla czy pliki kopii bezpiecze\u0144stwa i automatycznego zapisywania maj\u0105 by\u0107 zapisywane w jednym (globalnie) katalogu zamiast w podkatalogu katalogu w kt\u00f3rym znajduje si\u0119 mapa.
-OptionPanel.single_backup_directory_path=Katalog kopii bezpiecze\u0144stwa (je\u017celi powy\u017csze jest zaznaczone)
-OptionPanel.single_backup_directory_path.tooltip=<html>Zast\u0119puje domy\u015blny <freeplaneuserdir>/.backup</html>
+OptionPanel.signed_script_are_trusted.tooltip=Je\u017Celi skrypty s\u0105 podpisane przez zaufanych dostawc\u00F3w (np. przez autor\u00F3w Freeplane lub przez Ciebie), s\u0105 wykowywane bez ogranicze\u0144.
+OptionPanel.single_backup_directory=U\u017Cyj pojedynczego katalogo dla kopii bezpiecze\u0144stwa plik\u00F3w
+OptionPanel.single_backup_directory.tooltip=Okre\u015Bla czy pliki kopii bezpiecze\u0144stwa i automatycznego zapisywania maj\u0105 by\u0107 zapisywane w jednym (globalnie) katalogu zamiast w podkatalogu katalogu w kt\u00F3rym znajduje si\u0119 mapa.
+OptionPanel.single_backup_directory_path=Katalog kopii bezpiecze\u0144stwa (je\u017Celi powy\u017Csze jest zaznaczone)
+OptionPanel.single_backup_directory_path.tooltip=<html>Zast\u0119puje domy\u015Blny <freeplaneuserdir>/.backup</html>
OptionPanel.single_instance=Otwieraj pliki w dzia\u0142aj\u0105cej instancji
OptionPanel.single_instance_force=Tylko jedna instancja programu
OptionPanel.sk=S\u0142owacki
OptionPanel.sl=S\u0142owe\u0144ski
-OptionPanel.spelling_opt_case_sensitive=Uwzgl\u0119dniaj wielko\u015b\u0107 znak\u00f3w
+OptionPanel.spelling_opt_case_sensitive=Uwzgl\u0119dniaj wielko\u015B\u0107 znak\u00F3w
OptionPanel.spelling_opt_ignore_all_caps_words=Ignoruj s\u0142owa pisane wielkimi literami
OptionPanel.spelling_opt_ignore_words_with_numbers=Ignoruj s\u0142owa z cyframi
-OptionPanel.spelling_opt_suggestions_limit_dialog=Maksymalna ilo\u015b\u0107 sugestii w oknie dialogowym
-OptionPanel.spelling_opt_suggestions_limit_menu=Maksymalna ilo\u015b\u0107 sugestii w oknie w menu
+OptionPanel.spelling_opt_suggestions_limit_dialog=Maksymalna ilo\u015B\u0107 sugestii w oknie dialogowym
+OptionPanel.spelling_opt_suggestions_limit_menu=Maksymalna ilo\u015B\u0107 sugestii w oknie w menu
OptionPanel.sr=Serbski
OptionPanel.standard_template=Standardowy szablon
OptionPanel.standardbackgroundcolor=Kolor t\u0142a
@@ -1173,7 +1165,7 @@ OptionPanel.standardcloudcolor=Kolor chmurki
OptionPanel.standardcloudcolor.tooltip=<html> Domy\u015Blny kolor chmurki (zapis HTML - #RRGGBB z warto\u015Bciami szestnastkowymi)</html>
OptionPanel.standardcloudestyle=Styl chmurki
OptionPanel.standardcloudestyle.tooltip=<html> Domy\u015Blny styl chmurki. Obecnie tylko "Krzywa B\u00E9ziera" jest obs\u0142ugiwana</html>
-OptionPanel.standarddrawrectangleforselection=Wy\u015bwietlaj zaznaczone w\u0119z\u0142y w balonach.
+OptionPanel.standarddrawrectangleforselection=Wy\u015Bwietlaj zaznaczone w\u0119z\u0142y w balonach.
OptionPanel.standarddrawrectangleforselection.tooltip=<html>Zaznaczaj wybrane w\u0119z\u0142y poprzez otoczenie balonem.</html>
OptionPanel.standardlinkcolor=Kolor po\u0142\u0105cze\u0144
OptionPanel.standardlinkcolor.tooltip=<html> Domy\u015Blny kolor po\u0142\u0105cze\u0144 (zapis HTML - #RRGGBB z warto\u015Bciami szestnastkowymi)</html>
@@ -1182,23 +1174,23 @@ OptionPanel.standardlinkestyle.tooltip=<html> Domy\u015Blny styl po\u0142\u0105c
OptionPanel.standardselectednodecolor=Kolor zaznaczonego w\u0119z\u0142a
OptionPanel.standardselectednodecolor.tooltip=<html> Domy\u015Blny kolor zaznaczonego w\u0119z\u0142a (zapis HTML - #RRGGBB z warto\u015Bciami szestnastkowymi)</html>
OptionPanel.standardselectednoderectanglecolor=Kolor balonu wybranego w\u0119z\u0142a
-OptionPanel.standardselectednoderectanglecolor.tooltip=<html>Kolor balonu zaznaczaj\u0105cego wybrane w\u0119z\u0142y. W notacji html (#RRGGBB w warto\u015bciach szesnastkowych) </html>
+OptionPanel.standardselectednoderectanglecolor.tooltip=<html>Kolor balonu zaznaczaj\u0105cego wybrane w\u0119z\u0142y. W notacji html (#RRGGBB w warto\u015Bciach szesnastkowych) </html>
OptionPanel.STAR=Gwiazda
-OptionPanel.structured_html_import=Importuj HTML jako struktur\u0119 w\u0119z\u0142\u00f3w.
+OptionPanel.structured_html_import=Importuj HTML jako struktur\u0119 w\u0119z\u0142\u00F3w.
OptionPanel.structured_icon_toolbar=Grupuj ikony w pasku narz\u0119dziowym
OptionPanel.summary=Podsumowanie
OptionPanel.sv=Szwedzki
-OptionPanel.text.use_ctrl_key=U\u017cyj 'Przypisz do skr\u00f3tu klawiszowego' z menu Narz\u0119dzia
+OptionPanel.text.use_ctrl_key=U\u017Cyj 'Przypisz do skr\u00F3tu klawiszowego' z menu Narz\u0119dzia
OptionPanel.time_for_automatic_save=Czas pomi\u0119dzy zapisami (ms)
OptionPanel.time_for_automatic_save.tooltip=<html> Czas pomi\u0119dzy kolejnymi automatycznymi zapisami. Ustaw na 2000000000, aby wy\u0142\u0105czy\u0107</html>
OptionPanel.time_for_delayed_selection=Op\u00F3\u017Anienie (ms)
OptionPanel.time_for_delayed_selection.tooltip=<html> Zmienia op\u00F3\u017Anienie zaznaczania. Ustaw na 1, je\u015Bli chcesz zaznacza\u0107 od razu po najechaniu myszk\u0105</html>
-OptionPanel.toolTipManager.dismissDelay=Czas wy\u015bwietlania, ms
-OptionPanel.toolTipManager.initialDelay=Op\u00f3\u017anienie pocz\u0105tkowe, ms
+OptionPanel.toolTipManager.dismissDelay=Czas wy\u015Bwietlania, ms
+OptionPanel.toolTipManager.initialDelay=Op\u00F3\u017Anienie pocz\u0105tkowe, ms
OptionPanel.toolTipManager.max_tooltip_width=Szeroko\u015B\u0107 dymk\u00F3w podpowiedzi
OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>Domy\u015Blna szeroko\u015B\u0107 dymku podpowiedzi w pikselach</html>
-OptionPanel.toolTipManager.reshowDelay=Op\u00f3\u017anienie ponownego wy\u015bwietlenia, ms
-OptionPanel.tr=Turecki
+OptionPanel.toolTipManager.reshowDelay=Op\u00F3\u017Anienie ponownego wy\u015Bwietlenia, ms
+OptionPanel.tr=Turecki / T\u00FCrk\u00E7e
OptionPanel.uk_UA=Ukrai\u0144ski
OptionPanel.undefined_font=Niezdefiniowana czcionka
OptionPanel.undo_levels=Ilo\u015B\u0107 zapami\u0119tanych operacji
@@ -1207,35 +1199,35 @@ OptionPanel.unfold_on_paste=Rozwi\u0144 w\u0119ze\u0142 przy wklejaniu
OptionPanel.unfold_on_paste.tooltip=Rozwi\u0144 w\u0119ze\u0142 przy wklejaniu lub przeci\u0105ganiu
OptionPanel.use_common_out_point_for_root_node=Ga\u0142\u0119zie wychodz\u0105 z jednego punktu z w\u0119z\u0142a korzenia (Root)
OptionPanel.use_common_out_point_for_root_node.tooltip=Ga\u0142\u0119zie wychodz\u0105 z jednego punktu z w\u0119z\u0142a korzenia (Root)
-OptionPanel.use_tabbed_pane=U\u017cuwaj kart
-OptionPanel.use_tabbed_pane.tooltip=Je\u017celi w\u0142\u0105czone, mapy b\u0119d\u0105 wy\u015bwietlane w kartach (jak w Firefoksie).
-OptionPanel.validate_classpath_needs_readaccess=Skrypty: Kiedy ustawiasz \u015bcie\u017ck\u0119 klas 'classpath' musisz mie\u0107 prawa odczytu w tym katalogu!
+OptionPanel.use_tabbed_pane=U\u017Cuwaj kart
+OptionPanel.use_tabbed_pane.tooltip=Je\u017Celi w\u0142\u0105czone, mapy b\u0119d\u0105 wy\u015Bwietlane w kartach (jak w Firefoksie).
+OptionPanel.validate_classpath_needs_readaccess=Skrypty: Kiedy ustawiasz \u015Bcie\u017Ck\u0119 klas 'classpath' musisz mie\u0107 prawa odczytu w tym katalogu!
OptionPanel.validate_invalid_date_format=Nieprawid\u0142owy standardowy format dnia
OptionPanel.validate_invalid_datetime_format=Nieprawid\u0142owy standardowy format dnia-godziny
OptionPanel.validate_invalid_number_format=Nieprawid\u0142owy standardowy format liczby
-OptionPanel.validate_write_without_read=Skrypty rozwa\u017c dodanie Read/File do Write/File.
-OptionPanel.validation_error=<html><body>B\u0142\u0119dy walidacji:<p><em>{0}</em><p>Zmie\u0144 ustawienia w preferecjach, \u017ceby naprawi\u0107 b\u0142\u0119dy.</body></html>
-OptionPanel.validation_warning=<html><body>Ostrze\u017cenia walidacji:<p><em>{0}</em></body></html>
+OptionPanel.validate_write_without_read=Skrypty rozwa\u017C dodanie Read/File do Write/File.
+OptionPanel.validation_error=<html><body>B\u0142\u0119dy walidacji:<p><em>{0}</em><p>Zmie\u0144 ustawienia w preferecjach, \u017Ceby naprawi\u0107 b\u0142\u0119dy.</body></html>
+OptionPanel.validation_warning=<html><body>Ostrze\u017Cenia walidacji:<p><em>{0}</em></body></html>
OptionPanel.vi=Wietnamski
OptionPanel.wheel_velocity=Pr\u0119dko\u015B\u0107 k\u00F3\u0142ka
OptionPanel.wheel_velocity.tooltip=Wy\u017Csza warto\u015B\u0107 powoduje szybsze poruszanie si\u0119 k\u00F3\u0142kiem myszy po mapie
OptionPanel.windows=Windows
OptionPanel.zh_CN=Chi\u0144ski (uproszczony)
OptionPanel.zh_TW=Chi\u0144ski (tradycyjny)
-org.freeplane.plugin.bugreport.agree=Wy\u015blij
+org.freeplane.plugin.bugreport.agree=Wy\u015Blij
org.freeplane.plugin.bugreport.always_agree=Zawsze wysy\u0142aj
org.freeplane.plugin.bugreport.always_deny=Nigdy nie wysy\u0142aj
org.freeplane.plugin.bugreport.deny=Nie wysy\u0142aj
-org.freeplane.plugin.bugreport.dialog.title=Automatyczne raportowanie b\u0142\u0119d\u00f3w
-org.freeplane.plugin.bugreport.freeplane_team=Wiadomo\u015b\u0107 zespo\u0142u Freeplane
+org.freeplane.plugin.bugreport.dialog.title=Automatyczne raportowanie b\u0142\u0119d\u00F3w
+org.freeplane.plugin.bugreport.freeplane_team=Wiadomo\u015B\u0107 zespo\u0142u Freeplane
org.freeplane.plugin.bugreport.lastreport=Otrzymany raport
org.freeplane.plugin.bugreport.never=Nigdy nie pytaj mnie o pomoc
-org.freeplane.plugin.bugreport.question=<html>Freeplane posiada mechanizm automatycznego raportowania b\u0142\u0119d\u00f3w.<br>Zawarto\u015b\u0107 mapy ani \u017cadne dane osobiste nie b\u0119d\u0105 nigdy wysy\u0142ane.<br>Raporty b\u0142\u0119d\u00f3w pomog\u0105 nam ulepszy\u0107 program.
+org.freeplane.plugin.bugreport.question=<html>Freeplane posiada mechanizm automatycznego raportowania b\u0142\u0119d\u00F3w.<br>Zawarto\u015B\u0107 mapy ani \u017Cadne dane osobiste nie b\u0119d\u0105 nigdy wysy\u0142ane.<br>Raporty b\u0142\u0119d\u00F3w pomog\u0105 nam ulepszy\u0107 program.
org.freeplane.plugin.bugreport.report=Aktualny raport
org.freeplane.plugin.bugreport.wanted_bug=Wyst\u0105pi\u0142 b\u0142\u0105d wewn\u0119trzny i zosta\u0142 automatycznie zg\u0142oszony.
org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined=W\u0119ze\u0142 {0} nie jes zdefiniowany
out_of_memory=Brak pami\u0119ci.
-overwrite_keyset_question=Nadpisa\u0107 istniej\u0105cy zestaw skr\u00f3t\u00f3w klawiszowych?
+overwrite_keyset_question=Nadpisa\u0107 istniej\u0105cy zestaw skr\u00F3t\u00F3w klawiszowych?
PageAction.text=Ustawienia strony...
password_is_not_ascii=Has\u0142o nie jest ASCII
PasteAction.text=Wklej
@@ -1261,17 +1253,17 @@ PeriodUnit.WEEK=tygodni
PeriodUnit.YEAR=lat
plugins/latex/LatexNodeHook.editorTitle=Edytuj formu\u0142\u0119 LaTeX-u
plugins/script_filter=Filtr skryptowy {0}
-plugins/script_filter_error={0} powinien by\u0142 zwr\u00f3ci\u0107 warto\u015b\u0107 logiczn\u0105 dla {1}, ale zwr\u00f3ci\u0142 {2}
-plugins/ScriptEditor.cancel=Anuluj zmiany i wyjd\u017a
+plugins/script_filter_error={0} powinien by\u0142 zwr\u00F3ci\u0107 warto\u015B\u0107 logiczn\u0105 dla {1}, ale zwr\u00F3ci\u0142 {2}
+plugins/ScriptEditor.cancel=Anuluj zmiany i wyjd\u017A
plugins/ScriptEditor.exit=Koniec
-plugins/ScriptEditor.FORBIDDEN_ACTION=Skrypty groovy maj\u0105 ograniczone uprawnienia. Nast\u0119puj\u0105ce {0,choice,0#File|1#Network|2#Exec} operacje s\u0105 zabronione: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. Mo\u017cesz zmieni\u0107 te ustawienia w preferencjach.
+plugins/ScriptEditor.FORBIDDEN_ACTION=Skrypty groovy maj\u0105 ograniczone uprawnienia. Nast\u0119puj\u0105ce {0,choice,0#File|1#Network|2#Exec} operacje s\u0105 zabronione: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. Mo\u017Cesz zmieni\u0107 te ustawienia w preferencjach.
plugins/ScriptEditor.menu_actions=Akcje
plugins/ScriptEditor.new_script=Nowy skrypt
plugins/ScriptEditor.run=Uruchom
plugins/ScriptEditor.sign=Podpisz skrypt...
plugins/ScriptEditor/window.Result=Wynik:
plugins/ScriptEditor/window.title=Edytor skrypt\u00F3w
-plugins/ScriptingEngine.illegalAccessToInternalAPI=Nieprawid\u0142owy dost\u0119p do wewn\u0119trznego API (package {0}). - Prosimy o kontakt z zespo\u0142em Freeplane je\u017celi obecne API nie udost\u0119pnia wystarczaj\u0105cych mo\u017cliwo\u015bci.
+plugins/ScriptingEngine.illegalAccessToInternalAPI=Nieprawid\u0142owy dost\u0119p do wewn\u0119trznego API (package {0}). - Prosimy o kontakt z zespo\u0142em Freeplane je\u017Celi obecne API nie udost\u0119pnia wystarczaj\u0105cych mo\u017Cliwo\u015Bci.
plugins/TimeList.xml_Created=Utworzony
plugins/TimeList.xml_Date=Data
plugins/TimeList.xml_Icons=Ikony
@@ -1292,8 +1284,8 @@ plugins/TimeManagement.xml_reminderButton=Przypomnij mi tego dnia
plugins/TimeManagement.xml_reminderButton_tooltip=<html> Po naci\u015Bni\u0119ciu alarm jest ustawiany na podany czas. Migaj\u0105ca ikona oznacza alarm.<br>Je\u015Bli zamkniesz mindmap\u0119, alarm zostanie odtworzony po jej ponownym otwarciu</html>
plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html> Aktualnie mo\u017Ce by\u0107 tylko jedno przypomnienie dla w\u0119z\u0142a.<br>Aktualne przypomnienie jest zaplanowane na {0,date} {0,time}, tw\u00F3j wyb\u00F3r to {1,date} {1,time}.<br><br>Czy chcesz zmieni\u0107 przypomnienie w\u0119z\u0142a (TAK) <br>lub zachowa\u0107 poprzednie (NIE)?</html>
plugins/TimeManagement.xml_reminderNode_tooltip=<html> Przypomnienie zaplanowane na {0,date} {0,time}</html>
-plugins/TimeManagement.xml_remindLaterButton=Przypomnij p\u00f3\u017aniej
-plugins/TimeManagement.xml_remindLaterButton_tooltip=Przypomnij p\u00f3\u017aniej
+plugins/TimeManagement.xml_remindLaterButton=Przypomnij p\u00F3\u017Aniej
+plugins/TimeManagement.xml_remindLaterButton_tooltip=Przypomnij p\u00F3\u017Aniej
plugins/TimeManagement.xml_removeReminderButton=Usu\u0144 przypomnienie
plugins/TimeManagement.xml_removeReminderButton_tooltip=<html> Usu\u0144 wszystkie przypomnienia dla zaznaczonych w\u0119z\u0142\u00F3w</html>
plugins/TimeManagement.xml_Replace=Zamie\u0144
@@ -1302,20 +1294,21 @@ plugins/TimeManagement.xml_Replace_Selected=Zamie\u0144 zaznaczone
plugins/TimeManagement.xml_Select=Zaznacz
plugins/TimeManagement.xml_todayButton=Dzisiaj
plugins/TimeManagement.xml_WindowTitle=Wybierz dat\u0119 przypomnienia
-plugins/TimeManagement.xml_WindowTitle_All_Nodes=Znajd\u017a i zast\u0105p
+plugins/TimeManagement.xml_WindowTitle_All_Nodes=Znajd\u017A i zast\u0105p
preferences=Preferencje...
print_preview_title=Podgl\u0105d wydruku
PrintAction.text=Drukuj...
PrintDirectAction.text=Drukuj
printing_settings=Ustawienia drukowania
PrintPreviewAction.text=Podgl\u0105d wydruku...
+progress=Ikona post\u0119pu (%)
PropertyAction.dialog=Preferencje
PropertyAction.text=Preferencje...
QuickFilterAction.text=Szybki filtr
-QuickFindAction.BACK.text=Znajd\u017a poprzedni
-QuickFindAction.FORWARD.text=Znajd\u017a nast\u0119pny
+QuickFindAction.BACK.text=Znajd\u017A poprzedni
+QuickFindAction.FORWARD.text=Znajd\u017A nast\u0119pny
QuickFindAllAction.text=Zaznacz wszystkie pasuj\u0105ce w\u0119z\u0142y
-QuickHighlightAction.text=Pod\u015bwietl wszystkie pasuj\u0105ce w\u0119z\u0142y
+QuickHighlightAction.text=Pod\u015Bwietl wszystkie pasuj\u0105ce w\u0119z\u0142y
QuitAction.text=Zako\u0144cz
read_only=Tylko do odczytu
ReadScriptError.text=B\u0142\u0105d podczas czytania skryptu
@@ -1329,11 +1322,11 @@ red=Czerwony
RedefineStyleAction.text=Przedefiniuj styl
RedoAction.text=Powt\u00F3rz
RedoFilterAction.text=Powt\u00F3rz
-regular_expressions=Wyra\u017cenia regularne
+regular_expressions=Wyra\u017Cenia regularne
ReminderHookAction.text=Usu\u0144 przypomnienie
ReminderHookAction.tooltip=<html> Usuwa zaplanowane zadanie z w\u0119z\u0142a</html>
-remove_file_from_list_on_error=Plik {0} nie otwarty. Czy usun\u0105\u0107 go z listy ostatio otwieranych plik\u00f3w?
-remove_shortcut_question=Wymie\u0144 skr\u00f3t klawiszowy?
+remove_file_from_list_on_error=Plik {0} nie otwarty. Czy usun\u0105\u0107 go z listy ostatio otwieranych plik\u00F3w?
+remove_shortcut_question=Wymie\u0144 skr\u00F3t klawiszowy?
RemoveAllIconsAction.text=Usu\u0144 wszystkie ikony
RemoveConnectorAction.text=Usu\u0144 po\u0142\u0105czenie
RemoveEncryption.text=Usu\u0144 has\u0142o
@@ -1341,23 +1334,23 @@ RemoveFormatAction.text=Usu\u0144 formatowanie
RemoveIcon_0_Action.text=Usu\u0144 pierwsz\u0105 ikon\u0119
RemoveIconAction.text=Usu\u0144 ostatni\u0105 ikon\u0119
RemoveNoteAction.text=Usu\u0144 notatk\u0119
-RemoveNoteAction.tooltip=<html>Usuwa zawarto\u015b\u0107 notatek.</html>
+RemoveNoteAction.tooltip=<html>Usuwa zawarto\u015B\u0107 notatek.</html>
rename=Zmie\u0144 nazw\u0119
repair_link=Popraw odno\u015Bnik
-repair_link_question=Nie mo\u017cna za\u0142adowa\u0107 mapy. Naprawi\u0107 odno\u015bnik r\u0119cznie?
+repair_link_question=Nie mo\u017Cna za\u0142adowa\u0107 mapy. Naprawi\u0107 odno\u015Bnik r\u0119cznie?
replace=Zamie\u0144
-replace_shortcut_question=Ten skr\u00f3t klawiaturowy jest obecnie przypisany do\n {0}.\nZmieni\u0107 przypisanie?
-replace_shortcut_title=Zamieni\u0107 skr\u00f3t?
-ReportBugAction.text=Zg\u0142o\u015b problem
+replace_shortcut_question=Ten skr\u00F3t klawiaturowy jest obecnie przypisany do\n {0}.\nZmieni\u0107 przypisanie?
+replace_shortcut_title=Zamieni\u0107 skr\u00F3t?
+ReportBugAction.text=Zg\u0142o\u015B problem
RequestFeatureAction.text=Zaproponuj now\u0105 funkcj\u0119
-reset_to_default=U\u017cyj domy\u015blnych
+reset_to_default=U\u017Cyj domy\u015Blnych
ResetNodeLocationAction.text=Przywr\u00F3\u0107 domy\u015Blne po\u0142o\u017Cenie
-RevertAction.text=Odtw\u00f3rz z lokalnej historii.
-RevisionPluginAction.text=Pod\u015bwietlaj zmienione w\u0119z\u0142y
+RevertAction.text=Odtw\u00F3rz z lokalnej historii.
+RevisionPluginAction.text=Pod\u015Bwietlaj zmienione w\u0119z\u0142y
save_failed=Zapisywanie mapy {0} nie powiod\u0142o si\u0119.
-save_unsaved=Zapisa\u0107 nast\u0119puj\u0105c\u0105 mindmap\u0119? :
+save_unsaved=Zapisa\u0107 nast\u0119puj\u0105c\u0105 map\u0119 my\u015Bli?
save_unsaved_styles=Zapisa\u0107 style?
-SaveAcceleratorPresetsAction.text=Zapisz zestaw skr\u00f3t\u00f3w klawiszowych
+SaveAcceleratorPresetsAction.text=Zapisz zestaw skr\u00F3t\u00F3w klawiszowych
SaveAction.text=Zapisz
SaveAll.text=Zapisz wszystko
SaveAll.tooltip=Zapisz wszystkie otwarte mapy.
@@ -1366,17 +1359,17 @@ saved=Zapisane
saving_canceled=Zapisywanie anulowane
scanners_not_loaded=Skanery nie mog\u0142y by\u0107 za\u0142adowane, plik uszkodzony
scheme_evaluate=Oce\u0144!
-script_execution_disabled=Wykonywanie skrypt\u00f3w wy\u0142\u0105czone (patrz Preferencje -> Wtyczki)
+script_execution_disabled=Wykonywanie skrypt\u00F3w wy\u0142\u0105czone (patrz Preferencje -> Wtyczki)
ScriptEditor.text=Edytor skrypt\u00F3w...
ScriptEditor.tooltip=Pozwala tworzy\u0107 wi\u0119ksze skrypty w programie Freeplane
ScriptEditorPanel.changed_cancel=Skrypty zosta\u0142y zmienione. Czy rzeczywi\u015Bcie chcesz porzuci\u0107 te zmiany?
scripting_api_generator_legend=Legenda
scripting_api_generator_proxy=Proxy
-scripting_api_generator_title=API skrypt\u00f3w
+scripting_api_generator_title=API skrypt\u00F3w
scripting_api_generator_utilities=Narz\u0119dzia
scripting_api_generator_web=Zasoby sieciowe
select_favorites_folder=Wska\u017C katalog, w kt\u00F3rym znajduj\u0105 si\u0119 ulubione
-select_file_export_to=Wybierz plik do kt\u00f3rego wyeksportowa\u0107
+select_file_export_to=Wybierz plik do kt\u00F3rego wyeksportowa\u0107
select_folder_for_importing=Wska\u017C katalog do zaimportowania
select_icon=Wybierz ikon\u0119
select_menu_item_dialog=Wybierz pozycj\u0119 z menu
@@ -1389,30 +1382,30 @@ selection_method_delayed=Z op\u00F3\u017Anieniem
selection_method_direct=Zaznaczanie przez wskazanie mysz\u0105
SelectNoteAction.text=Prze\u0142\u0105czenie edycji notatki
SelectNoteAction.tooltip=Przej\u015Bcie z/do okienka edycji notatki
-set_accelerator_on_next_click_action=Kliknij na dowolnej pozycji menu aby przypisa\u0107 nowy skr\u00f3t
-SetAcceleratorOnNextClickAction.text=Przypisz skr\u00f3t klawiszowy
+set_accelerator_on_next_click_action=Kliknij na dowolnej pozycji menu aby przypisa\u0107 nowy skr\u00F3t
+SetAcceleratorOnNextClickAction.text=Przypisz skr\u00F3t klawiszowy
SetImageByFileChooserAction.text=Obraz (wybierz plik)...
SetLinkByFileChooserAction.text=Odno\u015Bnik (wybierz plik)...
SetLinkByTextFieldAction.text=Odno\u015Bnik (wprowad\u017A r\u0119cznie)...
-SetNodeLink.text=Ustaw odno\u015bnik w\u0119z\u0142a...
-SetNoteWindowPosition.bottom.text=D\u00f3\u0142
+SetNodeLink.text=Ustaw odno\u015Bnik w\u0119z\u0142a...
+SetNoteWindowPosition.bottom.text=D\u00F3\u0142
SetNoteWindowPosition.left.text=Lewo
SetNoteWindowPosition.right.text=Prawo
-SetNoteWindowPosition.top.text=G\u00f3ra
+SetNoteWindowPosition.top.text=G\u00F3ra
SetShortenerStateAction.text=Minimalizuj w\u0119ze\u0142
sf_login_required=Potrzebny login Source Forge. Kontynuowa\u0107?
ShowAllAttributesAction.text=Poka\u017C wszystkie atrybuty
ShowAncestorsAction.text=Poka\u017C przodk\u00F3w
ShowAttributeDialogAction.text=Mened\u017Cer atrybut\u00F3w
ShowDescendantsAction.text=Poka\u017C potomk\u00F3w
-ShowFilterToolbarAction.text=Pasek filtr\u00f3w
+ShowFilterToolbarAction.text=Pasek filtr\u00F3w
ShowFormatPanel.text=Panel formatowania
-ShowFormatPanel.tooltip=Otwiera okno dialowe, w kt\u00f3rym mog\u0105 by\u0107 zmieniane w\u0142a\u015bciow\u015bci w\u0119z\u0142\u00f3w i ga\u0142\u0119zi.
+ShowFormatPanel.tooltip=Otwiera okno dialowe, w kt\u00F3rym mog\u0105 by\u0107 zmieniane w\u0142a\u015Bciow\u015Bci w\u0119z\u0142\u00F3w i ga\u0142\u0119zi.
ShowHideNoteAction.text=Poka\u017C/schowaj okno notatek
ShowHideNoteAction.tooltip=Skr\u00F3t w menu do ma\u0142ych strza\u0142ek na linii oddzielaj\u0105cej
-ShowNotesInMapAction.text=Wy\u015bwietlaj notatki w obszarze mapy
-ShowSelectedAttributesAction.text=Poka\u017c wybrane atrybuty
-ShowSelectionAsRectangleAction.text=Zaznaczaj pod\u015bwietleniem t\u0142a w\u0119z\u0142a
+ShowNotesInMapAction.text=Wy\u015Bwietlaj notatki w obszarze mapy
+ShowSelectedAttributesAction.text=Poka\u017C wybrane atrybuty
+ShowSelectionAsRectangleAction.text=Zaznaczaj pod\u015Bwietleniem t\u0142a w\u0119z\u0142a
simplyhtml.aboutFrameTitle=O programie
simplyhtml.aboutLabel=O SimplyHTML...
simplyhtml.alignCenter=do \u015Brodka
@@ -1428,7 +1421,7 @@ simplyhtml.backgroundLabel=T\u0142o:
simplyhtml.boldItalicName=wyt\u0142uszczony+kursywa
simplyhtml.boldName=wyt\u0142uszczony
simplyhtml.borderColorLabel=Kolor ramki:
-simplyhtml.borderWidthLabel=Szeroko\u015B\u0107 ramki:
+simplyhtml.borderWidthLabel=Szeroko\u015B\u0107
simplyhtml.bottomLabel=na dole:
simplyhtml.cancelBtnName=Anuluj
simplyhtml.cellBorderTabLabel=Obramowanie
@@ -1584,27 +1577,27 @@ simplyhtml.valignTop=do g\u00F3ry
simplyhtml.wholeWordsOnly=Tylko ca\u0142e s\u0142owa
SortNodes.text=Sortuj potomne
SortNodes.tooltip=Sortuje w\u0119z\u0142y potomne automatycznie
-split=Podziel
+split=&Podziel
SplitConditionAction.text=Podziel
SplitNode.text=Podziel w\u0119ze\u0142
SplitNode.tooltip=<html>W\u0119ze\u0142 jest podzielony</html>
STANDARD_FORMAT=Standardowe
stop_processing=Stop
-StringFlavorHandler=Tekst niesformatowany jako hierarchia w\u0119z\u0142\u00f3w
-StructuredHtmlFlavorHandler=HTML jako hierarchia w\u0119z\u0142\u00f3w
+StringFlavorHandler=Tekst niesformatowany jako hierarchia w\u0119z\u0142\u00F3w
+StructuredHtmlFlavorHandler=HTML jako hierarchia w\u0119z\u0142\u00F3w
style=Styl
-style_already_exists=Styl ju\u017c istnieje.
+style_already_exists=Styl ju\u017C istnieje.
styledialog.cancel.text=Anuluj
styledialog.ok.text=OK
styles=Style
-styles.AutomaticLayout=Zastosuj style poziom\u00f3w
+styles.AutomaticLayout=Zastosuj style poziom\u00F3w
styles.connection=Po\u0142\u0105czenie
styles.date=Data
styles.definition=Definicja
styles.description=Opis
styles.floating_node=W\u0119ze\u0142 swobodny
styles.idea=Pomys\u0142
-styles.important=Wa\u017cne
+styles.important=Wa\u017Cne
styles.key=Klucz
styles.list=Lista
styles.needs_action=Wymaga dzia\u0142ania
@@ -1618,13 +1611,12 @@ styles.root_node=Style
styles.subsubtopic=Podpodtytu\u0142
styles.subtopic=Podtytu\u0142
styles.topic=Tytu\u0142
-styles.user-defined=Style zdefiniowane przez u\u017cytkownika
+styles.user-defined=Style zdefiniowane przez u\u017Cytkownika
styles.website=Strona sieciowa
styles_menu=Dost\u0119pne style
-submenu_keystroke_in_use_error=Naci\u015bni\u0119cie klawiszy {0} nie mo\u017ce by\u0107 u\u017cyty dla podmenu {1}. Naci\u015bni\u0119cie klawiszy usuni\u0119te.
+submenu_keystroke_in_use_error=Naci\u015Bni\u0119cie klawiszy {0} nie mo\u017Ce by\u0107 u\u017Cyty dla podmenu {1}. Naci\u015Bni\u0119cie klawiszy usuni\u0119te.
summary_nodes=W\u0119z\u0142y zbiorcze
-summary_not_possible=Nie mo\u017cna utworzy\u0107 w\u0119z\u0142a zbiorczego dla aktualnego zaznaczenia
-SummaryNodeAction.text=W\u0119ze\u0142 zbiorczy (w\u0142./wy\u0142.)
+summary_not_possible=Nie mo\u017Cna utworzy\u0107 w\u0119z\u0142a zbiorczego dla aktualnego zaznaczenia
svg=SVG
template_dir=Szablony standardowe
TimeListAction.text=Poka\u017C zaplanowane zadania...
@@ -1640,9 +1632,10 @@ ToggleLeftToolbarAction.text=Pasek ikon
ToggleMenubarAction.text=W\u0142\u0105cz/wy\u0142\u0105cz menu
ToggleStatusAction.text=Wiersz statusu
ToggleToolbarAction.text=Pasek narz\u0119dzi
+toolbars=Paski narz\u0119dzi
undefined_error=Nieoczekiwany b\u0142\u0105d. Prosz\u0119 prze\u015Blij o nim wiadomo\u015B\u0107.
underline=Podkre\u015Blenie
-UnderlineAction.text=Podkre\u015blenie
+UnderlineAction.text=Podkre\u015Blenie
underlined=Podkre\u015Blony
UndoAction.text=Cofnij
UndoFilterAction.text=Cofnij
@@ -1651,37 +1644,37 @@ UnfoldAllAction.text=Rozwi\u0144 wszystko
UnfoldAllAction.tooltip=<html> Rozwija zaznaczone w\u0119z\u0142y i ich w\u0119z\u0142y potomne</html>
UnfoldOneLevelAction.text=Rozwi\u0144 jeden poziom
UnfoldOneLevelAction.tooltip=<html> Rozwija zaznaczone w\u0119z\u0142y o jeden poziom</html>
-up=Do g\u00f3ry
+up=Do g\u00F3ry
update_failed=Aktualizacja nie powiod\u0142a si\u0119 z komunikatem {0}
-UpdateCheckAction.text=Sprawd\u017a dost\u0119pno\u015b\u0107 aktualizacji
+UpdateCheckAction.text=Sprawd\u017A dost\u0119pno\u015B\u0107 aktualizacji
updatecheckdialog=Sprawdzanie aktualizacji
url_error=B\u0142\u0105d! Niepoprawny URL.
url_load_error=Nie mo\u017Cna za\u0142adowa\u0107 mindmapy z URL:
-url_open_error=Nie mo\u017cna otworzy\u0107 URL {0}
-used_in_menu=Ten skr\u00f3t nie mo\u017ce by\u0107 ustawiony, bo jest u\u017cywany jako skr\u00f3t menu.
+url_open_error=Nie mo\u017Cna otworzy\u0107 URL {0}
+used_in_menu=Ten skr\u00F3t nie mo\u017Ce by\u0107 ustawiony, bo jest u\u017Cywany jako skr\u00F3t menu.
UsePlainTextAction.text=Przekszta\u0142\u0107 na tekst niesformatowany
-user_config_folder=Katalog konfiguracji u\u017cytkownika: {0}
-user_defined_scale=Skala zdefiniowana przez u\u017cytkownika
+user_config_folder=Katalog konfiguracji u\u017Cytkownika: {0}
+user_defined_scale=Skala zdefiniowana przez u\u017Cytkownika
user_defined_zoom=u\u017Cytkownika...
user_defined_zoom_status_bar=Zmiana powi\u0119kszenia do warto\u015Bci {0}%.
-user_icon=Ikona u\u017cytkownika "{0}"
-user_template_dir=Szablony u\u017cytkownika
+user_icon=Ikona u\u017Cytkownika "{0}"
+user_template_dir=Szablony u\u017Cytkownika
user_zoom=Powi\u0119kszenie wydruku (0.0 - 2.0):
-version_up_to_date=Ju\u017c u\u017cywasz najnowszej wersji programu
-ViewerControllerAction.text=Obiekt zewn\u0119trzny...
+version_up_to_date=Ju\u017C u\u017Cywasz najnowszej wersji programu
+view=Widok
ViewLayoutTypeAction.OUTLINE.text=Widok konspektu
WebDocuAction.text=Dokumentacja webowa
-width=Szeroko\u015B\u0107 ramki:
-wrong_regexp=Nieprawid\u0142owe wyra\u017cenie regularne "{0}", b\u0142\u0105d {1}
+width=Szeroko\u015B\u0107
+wrong_regexp=Nieprawid\u0142owe wyra\u017Cenie regularne "{0}", b\u0142\u0105d {1}
xslt_export.html=Dokument HTML
xslt_export.latex=Dokument LaTeX
-xslt_export.latexbook=Ksi\u0105\u017cka LaTeX
+xslt_export.latexbook=Ksi\u0105\u017Cka LaTeX
xslt_export.mediawiki=Mediawiki
xslt_export.ms_excel=Excel XML (od 2003)
xslt_export.ms_project=MS Project XML (od 2003)
xslt_export.ms_word=Word XML (od 2003)
xslt_export.text=Tekst niesformatowany
-xslt_export_not_possible=Eksport Freeplane XSLT niemo\u017cliwy
+xslt_export_not_possible=Eksport Freeplane XSLT niemo\u017Cliwy
yes=Tak
ZoomInAction.text=Powi\u0119ksz
ZoomOutAction.text=Pomniejsz
diff --git a/freeplane/resources/translations/Resources_pt_BR.properties b/freeplane/resources/translations/Resources_pt_BR.properties
index c97b016..9c787c5 100644
--- a/freeplane/resources/translations/Resources_pt_BR.properties
+++ b/freeplane/resources/translations/Resources_pt_BR.properties
@@ -6,14 +6,14 @@ accessories/plugins/ApplyFormatPlugin.dialog.title=Alterar o formato de n\u00F3s
accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=Alterar padr\u00E3o
accessories/plugins/EncryptNode.properties_0=Escolha uma senha para encriptar n\u00F3
accessories/plugins/EncryptNode.properties_1=As senhas n\u00E3o s\u00E3o iguais ou curta.
-accessories/plugins/EncryptNode.properties_2=Digite a senha:
-accessories/plugins/EncryptNode.properties_3=Redigite a senha:
+accessories/plugins/EncryptNode.properties_2=Digite a senha\:
+accessories/plugins/EncryptNode.properties_3=Redigite a senha\:
accessories/plugins/EncryptNode.properties_4=Digite sua senha.
accessories/plugins/EncryptNode.properties_5=<html>Lembre-se que a for\u00E7a de criptografia<br> depende quase completamente da qualidade da sua senha.
accessories/plugins/EncryptNode.properties_6=OK
accessories/plugins/EncryptNode.properties_7=Cancelar
accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=Voc\u00EA s\u00F3 pode ativar ou desativar a criptografia de n\u00F3s criptografados. Por favor insira um n\u00F3 desse tipo usando o menu Ferramentas.
-accessories/plugins/EncryptNode.properties_select_me=Me selecione para continuar!
+accessories/plugins/EncryptNode.properties_select_me=Me selecione para continuar\!
accessories/plugins/EncryptNode.properties_wrong_password=A senha est\u00E1 incorreta.
accessories/plugins/ExportWithTWiki.text=TWiki...
accessories/plugins/ExportWithTWiki.tooltip=Exporta o mapa como um documento TWiki.
@@ -33,31 +33,34 @@ active=Ativo
actual_map_styles=Estilos de mapa condicionais aplicados ao n\u00F3
actual_node_styles=Estilos condicionais de n\u00F3s aplicados ao n\u00F3
add=&Adicionar
-AddConnectorAction.text=Conectar
+AddConnectorAction.text=Concectar n\u00F3s com Seta
+AddConnectorAction.tooltip=Uma seta ir\u00E1 conectar os N\u00F3s Selecionados ao \u00FAltimo n\u00F3 selecionado
AddElementaryConditionAction.text=Adicionar
-AddLocalLinkAction.text=Adiciona hiperlink local
+AddExecutionLinkAction.text=Adicionar um Hyperlink para executar um comando do meu Sistema Operacional...
+AddLocalLinkAction.text=Adiciona hiperlink entre dois n\u00F3s no meu Mapa Mental
+AddLocalLinkAction.tooltip=Com este recurso voc\u00EA pode criar um link em um n\u00F3 que ir\u00E1 te direcionar para outro n\u00F3
AddMenuItemLinkAction.text=Adiciona hiperlink ao item do menu...
AddOnDetailsPanel.authored.by=Por {0}
AddOnDetailsPanel.header.function=Fun\u00E7\u00E3o
AddOnDetailsPanel.header.menu=Localiza\u00E7\u00E3o do Menu
AddOnDetailsPanel.header.shortcut=Atalho
-AddOnDetailsPanel.homepage=P\u00E1gina Inicial:
+AddOnDetailsPanel.homepage=P\u00E1gina Inicial\:
addons.installer.canceled=Instala\u00E7\u00E3o cancelada
addons.installer.confirm.licence=<html><body><h1>Licen\u00E7a</h1>{0}<p><p><em>Voc\u00EA aceita essa licen\u00E7a?</em></p></body></html>
-addons.installer.failed=A instala\u00E7\u00E3o falhou: {0}
-addons.installer.freeplaneversion.format.error=Erro de Formato em {0} (valor: {1})
+addons.installer.failed=A instala\u00E7\u00E3o falhou\: {0}
+addons.installer.freeplaneversion.format.error=Erro de Formato em {0} (valor\: {1})
addons.installer.html.script=Corpo do "Script" pode n\u00E3o pode ser formatado como HTML
addons.installer.install=Instalar
addons.installer.invalid.keyboard.shortcut=Atalho inv\u00E1lido {0}.
addons.installer.licence.unchanged=A licen\u00E7a n\u00E3o foi alterada
-addons.installer.map.structure=Erro na estrutura do mapa: {0}
-addons.installer.missing.child.nodes=Faltando os n\u00F3s filhos:{0}
-addons.installer.missing.permission.attribute=Script {0}: Atributos de permiss\u00E3o faltando {1}
-addons.installer.missing.properties=Propriedades faltando: {0}
+addons.installer.map.structure=Erro na estrutura do mapa\: {0}
+addons.installer.missing.child.nodes=Faltando os n\u00F3s filhos\:{0}
+addons.installer.missing.permission.attribute=Script {0}\: Atributos de permiss\u00E3o faltando {1}
+addons.installer.missing.properties=Propriedades faltando\: {0}
addons.installer.missing.translation=Faltando tradu\u00E7\u00F5es de {0} para o local {1}
addons.installer.no.scripts=Nenhum "script" encontrado
addons.installer.no.zipdata=Nenhum dado compactado encontrado
-addons.installer.nonstandard.permissions=O "script" solicita as seguintes permiss\u00F5es, que no momento n\u00E3o est\u00E3o habilitadas: {0}\ndeseja adiciona-las \u00E0s permiss\u00F5es padr\u00E3o?
+addons.installer.nonstandard.permissions=O "script" solicita as seguintes permiss\u00F5es, que no momento n\u00E3o est\u00E3o habilitadas\: {0}\ndeseja adiciona-las \u00E0s permiss\u00F5es padr\u00E3o?
addons.installer.one.child.expected=Era esperado exatamente um filho de {0} mas foram encontrados {1}.
addons.installer.script.name.suffix=O script {0} n\u00E3o possui sufixo ".groovy"
addons.installer.script.no.execution_mode=Nenhum atributo "execution_mode" definido para {0}
@@ -72,18 +75,18 @@ addons.installer.too.old=A vers\u00E3o atual do Freeplane {0} \u00E9 muito antig
addons.installer.unknown.deinstallation.rules=Regra(s) de desinstala\u00E7\u00E3o desconhecida(s) {0}
addons.installer.update=Atualiza\u00E7\u00E3o da vers\u00E3o {0}
addons.installer.warning=<html><body><em>Voc\u00EA s\u00F3 deve instalar add-ons a partir de fontes confi\u00E1veis. Softwares maliciosos podem danificar seus dados ou violar sua privacidade.</em></body></html>
-addons.site=http://freeplane.sourceforge.net/addons
+addons.site=http\://freeplane.sourceforge.net/addons
AddStyleAttributes.text=Atributos a partir do estilo
AddStyleAttributes.tooltip=Adicionar atributos a partir do estilo do n\u00F3
AllMapsNodeListAction.text=Procura e modifica em todos os mapas
always=Sempre
-AlwaysUnfoldedNodeAction.text=N\u00F3 sempre expandido (ligar/desligar)
+AlwaysUnfoldedNodeAction.text=Engessar Apenas o N\u00F3 Selecionado
antialias_all=Suavizar tudo
antialias_edges=Suavizar bordas
antialias_none=Sem suaviza\u00E7\u00E3o
apply=&Aplicar
-ApplyAction.text=&Aplicar
-ApplyFormatPlugin.text=&Muda a formata\u00E7\u00E3o ...
+ApplyAction.text=Aplicar
+ApplyFormatPlugin.text=Muda a formata\u00E7\u00E3o ...
ApplyFormatPlugin.tooltip=Mostra um quadro de di\u00E1logo onde os atributos dos n\u00F3s e das bordas podem ser alterado ao mesmo tempo.
ApplyNoFilteringAction.text=Sem filtragem
ApplySelectedViewConditionAction.text=Filtra os n\u00F3s selecionados
@@ -96,10 +99,11 @@ attribute_delete_value=Apagar este valor
attribute_font_size_tooltip=Tamanho da fonte do atributo
attribute_list_box_label_text=Valores existentes
attribute_name=Nome do atributo
+attribute_name_or_value=Atribuir nome ou valor
attribute_replace=Substituir por
attribute_top=Todos os atributos conhecidos para os n\u00F3s carregados
attribute_value=Valor do atributo
-attributes_AddAttributeAction.text=Adicionar atributo ao di\u00E1logo...
+attributes_AddAttributeAction.text=Editar Atributo na Caixa de Di\u00E1logo
attributes_adding_empty_attribute_error=N\u00E3o pode ser utilizado um "string" vazio como nome de atributo
attributes_all=Todos os atributos
attributes_assign_dialog=Editor extendido de atributos
@@ -137,14 +141,18 @@ attributes_visible_tooltip=Visualizar selecionados
automatic_layout=Layout autom\u00E1tico
automatic_layout_disabled=Desabilitado
automatically_save_message=O mapa foi salvo automaticamente (com o nome de {0}) ...
+AutomaticEdgeColor.FOR_BRANCHES=para ramos
+AutomaticEdgeColor.FOR_COLUMNS=para colunas
+AutomaticEdgeColor.FOR_LEVELS=para n\u00EDveis
AutomaticEdgeColorHookAction.text=Cor de borda autom\u00E1tica
AutomaticLayout.ALL=para todos os n\u00F3s
AutomaticLayout.HEADINGS=Para n\u00F3s que n\u00E3o sejam do tipo folha
AutomaticLayout.level=N\u00EDvel {0}
AutomaticLayout.level.root=Raiz
-AutomaticLayoutAction.text=&Aplicar estilos de n\u00EDvel
+AutomaticLayoutAction.text=Aplicar estilos de n\u00EDvel
AutomaticLayoutAction.tooltip=<html>Corrige o layout do mapa. <br>O primeiro n\u00EDvel \u00E9 preto, o segundo azul, etc</html>
AutomaticLayoutControllerAction.ALL.text=para todos os n\u00F3s
+AutomaticLayoutControllerAction.COLUMNS.text=para colunas
AutomaticLayoutControllerAction.HEADINGS.text=para n\u00F3s diferentes do tipo folha
AutomaticLayoutControllerAction.null.text=desabilitado
BackAction.text=Voltar
@@ -161,13 +169,15 @@ branch=Ramo
browse=Procure...
calendar_attributes_panel=Calend\u00E1rio e atributos
calendar_panel=Calend\u00E1rio
+can_not_clone_encrypted_node=N\u00E3o \u00E9 poss\u00EDvel clonar n\u00F3s criptografados
can_not_connect_to_info_server=N\u00E3o \u00E9 poss\u00EDvel conectar ao servidor de informa\u00E7\u00F5es
can_not_delete_predefined_style=N\u00E3o \u00E9 poss\u00EDvel apagar estilo pr\u00E9-definido
can_not_delete_root_style=N\u00E3o \u00E9 poss\u00EDvel apagar estilo raiz
can_not_delete_style_group=N\u00E3o \u00E9 poss\u00EDvel apagar de grupo de estilo
+can_not_encrypt_cloned_node=N\u00E3o \u00E9 poss\u00EDvel criptografar n\u00F3s Clones
can_not_save_key_set=N\u00E3o \u00E9 poss\u00EDvel salvar a defini\u00E7\u00E3o da tecla de atalho
cancel=&Cancelar
-CancelAction.text=&Cancelar
+CancelAction.text=Cancelar
cannot_add_parent_diff_parents=Para usar esta fun\u00E7\u00E3o, \u00E9 necess\u00E1rio que todos os n\u00F3s tenham o mesmo pai.
cannot_add_parent_to_root=O n\u00F3 raiz n\u00E3o pode ser adicionado a um novo pai.
cannot_delete_root=O n\u00F3 raiz n\u00E3o pode ser apagado ou cortado.
@@ -184,20 +194,22 @@ ChangeConnectorShapeAction.CUBIC_CURVE.text=Curvar
ChangeConnectorShapeAction.EDGE_LIKE.text=Simular extremidade
ChangeConnectorShapeAction.LINE.text=Linha
ChangeConnectorShapeAction.LINEAR_PATH.text=Caminho linear
-ChangeNodeLevelLeftsAction.text=Mover n\u00F3s (Pais g\u00EAmeos)
+ChangeNodeLevelLeftsAction.text=Mover n\u00F3 para Esquerda
ChangeNodeLevelLeftsAction.tooltip=No lado esquerdo da raiz o(s) n\u00F3(s) \u00E9/s\u00E3o deslocado(s) para baixo. Eles se tornam filhos dos seus n\u00F3s g\u00EAmeos. No lado direito da raiz o(s) n\u00F3(s) \u00E9/s\u00E3o deslocado(s)para cima. Diretamente na raiz, o(s) n\u00F3(s) muda(m) de lado.
-ChangeNodeLevelRightsAction.text=Mover n\u00F3 (filhos e irm\u00E3os)
+ChangeNodeLevelRightsAction.text=Mover n\u00F3 para a Direita
ChangeNodeLevelRightsAction.tooltip=No lado direito da raiz os n\u00F3s s\u00E3o deslocados para baixo. Eles se tornam filhos da crian\u00E7a acima. No lado esquerdo da raiz os n\u00F3s s\u00E3o deslocados para cima. Diretamente na raiz, os n\u00F3s mudam de lado.
-choose_background_color=Escolha a cor de fundo:
-choose_cloud_color=Escolha a cor da nuvem:
+choose_background_color=Escolha a cor de fundo\:
+choose_cloud_color=Escolha a cor da nuvem\:
choose_edge_color=Escolha a cor da borda
choose_map_background_color=Escolha a cor de fundo do mapa
-choose_node_background_color=Escolha a cor de fundo do n\u00F3:
-choose_node_color=Escolha a cor do n\u00F3:
+choose_node_background_color=Escolha a cor de fundo do n\u00F3\:
+choose_node_color=Escolha a cor do n\u00F3\:
ClearLinkAnchorAction.text=Limpar a \u00E2ncora do link
ClearLinkAnchorAction.tooltip=<html>Limpar a \u00E2ncora do conjunto de n\u00F3s anterior</html>
+CloneAction.text=colar como clone
close_btn=&Fechar
-CloseAction.text=&Fechar mapa atual
+CloseAction.text=Fechar mapa atual
+cloud_shapes=Formatos da Nuvem
CloudAction.text=Adicionar / remover nuvem (padr\u00E3o)
CloudColorAction.text=Cor da nuvem...
CloudShapeAction.ARC.text=Arco
@@ -214,14 +226,16 @@ connector_label=R\u00F3tulo de conex\u00E3o
connector_lines=Linhas de conex\u00E3o
connector_shapes=Formas de conex\u00E3o
ConnectorColorAction.text=Cor de conector...
-CopyAction.text=&Copiar
+ConvertCloneToIndependentNodeAction.text=Desclonar
+CopyAction.text=Copiar
CopyAction.tooltip=Copiar galho selecionado
-CopyAttributes.text=Copiar &atributos
-CopyIDAction.text=Copiar I&D do n\u00F3
-CopyMapStylesAction.text=Copiar estilo do mapa de...
+CopyAttributes.text=Copiar atributos
+CopyIDAction.text=Copiar ID do n\u00F3
+CopyMapStylesAction.text=Copiar estilo do um outro mapa mental j\u00E1 existente
+CopyMapStylesAction.tooltip=Com esta fun\u00E7\u00E3o voc\u00EA ir\u00E1 pegar os padr\u00F5es de configura\u00E7\u00F5es de outro mapa j\u00E1 existente e ir\u00E1 aplicar no mapa selecionado
CopyNodeURIAction.text=Copiar URI do n\u00F3
-copyright=Direitos autorais 2000-2014 Time Freeplane e outros
-CopySingleAction.text=Copiar n\u00F3 (Simples)
+copyright=Direitos autorais 2000-2016 Time Freeplane e outros
+CopySingleAction.text=Copiar Apenas o N\u00F3 Selecionado
CopySingleAction.tooltip=Copiar apenas o n\u00F3 selecionado
CopyStyleExtensionsAction.text=Copiar extens\u00F5es do estilo de n\u00F3
corrupt_map=O conte\u00FAdo do mapa est\u00E1 corrompido
@@ -235,7 +249,9 @@ CutAction.text=Recortar
decrease_branch_font_size=Fonte Menor
DecreaseNodeFontAction.text=Fonte Menor
default=Padr\u00E3o
+defaultAuxiliaryWordList=um, o, de
DefaultColorAction.text=Cor padr\u00E3o
+defaultstyle.attributes=Atributos
defaultstyle.details=Detalhes
defaultstyle.floating=N\u00F3 flutuante
defaultstyle.note=Nota
@@ -263,7 +279,9 @@ edge=Borda
edge_is_formatted_by_style=O formato da borda \u00E9 controlado por estilo. Modifique os estilos relacionados se necess\u00E1rio.
edge_style=Estilo da borda
edge_width=Largura da borda
+edge_widths=Espessura do Caule
EdgeColorAction.text=Cor da borda...
+EdgeProperties=Propriedade do Caule
EdgeStyleAction.bezier.text=Curva suavizada (Bezier)
EdgeStyleAction.bezier.tooltip=<html>Mostrar a borda como uma curva suavizada.</html>
EdgeStyleAction.hide_edge.text=Esconder borda
@@ -295,18 +313,22 @@ edit_source_label=<html>Fonte<br>r\u00F3tulo
edit_target_label=<html>Destino<br>r\u00F3tulo
edit_transparency_label=Opacidade
edit_width_label=Largura
-EditAction.text=Editar n\u00F3 principal em sucess\u00E3o
-EditAttributesAction.text=Editar atributo em sucess\u00E3o
-EditDetailsAction.text=Editar detalhes de n\u00F3s em sucess\u00E3o
-EditDetailsInDialogAction.text=Editar detalhes de n\u00F3 no di\u00E1logo
+EditAction.text=Abrir campo de Edi\u00E7\u00E3o de Texto dentro do N\u00F3
+EditAction.tooltip=O Texto do N\u00F3 poder\u00E1 ser editado dentro do pr\u00F3prio n\u00F3 com edi\u00E7\u00E3o de texto Simples (Sem Recursos de Edi\u00E7\u00E3o em Texto Rico)
+EditAttributesAction.text=Editar atributo em linha
+EditDetailsAction.text=Editar Detalhes do N\u00F3 em linha (Informa\u00E7\u00E3o Ocult\u00E1vel)
+EditDetailsInDialogAction.text=Editar detalhes de n\u00F3 na caixa de di\u00E1logo
EditFilterAction.text=Compor filtro
-EditLongAction.text=Editar n\u00F3 principal no di\u00E1logo
+EditLongAction.text=Editar o n\u00F3 selecionado na Caixa de di\u00E1logo (Edi\u00E7\u00E3o em Texto Rico)
+EditLongAction.tooltip=Este recurso ir\u00E1 abrir um caixa de edi\u00E7\u00E3o de texto com mais recursos, voc\u00EA pode inclusive copiar um texto de outros programas com uma formata\u00E7\u00E3o mais complexa e colocar aqui que o Freeplane ir\u00E1 manter a formata\u00E7\u00E3o.
EditNoteInDialogAction.text=Editar n\u00F3 no di\u00E1logo
EditScript=Editar script...
EditStylesAction.text=Editar estilos
EncryptedMap.text=Novo mapa protegido (criptografado)...
EncryptedMap.tooltip=Novo mapa protegido
+encryption=criptografia
enter_base_url=Vou colar os links relativos. Por favor informe a URL de base.
+enter_command=Inserir comando
enter_condition_name=Informe nome da nova condi\u00E7\u00E3o
enter_confirms=&Enter Confirma
enter_keyset_name=Informe o nome da tecla de atalho
@@ -314,12 +336,13 @@ enter_map_url=Informe a URL do mapa
enter_new_style_name=Informe o nome do novo estilo
enter_node_id=Informe o ID do n\u00F3
enter_zoom=Informe o zoom
-EnterPassword.text=Informe a palavra chave
+EnterPassword.text=Proteger n\u00F3 com Senha
error=Erro
error_applying_template=Erro aplicando template XSL.
error_creating_directory=N\u00E3o foi poss\u00EDvel criar o diret\u00F3rio para exportar.
error_in_template=Erros no modelo padr\u00E3o do mapa {0}. Tente remover o arquivo.
errornumber={0} erros
+ExecuteScript.script=Script
ExecuteScriptError.text=Erro executando o "script"\n{0}
ExecuteScriptForAllNodes.text=Executar todos os "scripts"
ExecuteScriptForSelectionAction.text=Executar "scripts" dos n\u00F3s selecionados
@@ -328,12 +351,12 @@ ExecuteScriptOnSelectedNodeRecursively.text=Executar {0} nos n\u00F3s selecionad
ExecuteScriptOnSingleNode.text=Executar {0} em um n\u00F3 selecionado
ExecuteScripts.noScriptsAvailable=Nenhum dispon\u00EDvel
ExecuteScripts.text=Scripts
-ExecuteScriptSecurityError.text=Um erro ocorreu durante a execu\u00E7\u00E3o do "script": {0}
+ExecuteScriptSecurityError.text=Um erro ocorreu durante a execu\u00E7\u00E3o do "script"\: {0}
export_failed=A exporta\u00E7\u00E3o falhou
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
export_using_xslt=Exporta\u00E7\u00E3o de arquivo freeplane
-ExportAction.text=&Exportar mapa...
+ExportAction.text=Exportar mapa...
ExportBranchAction.text=Mover ramos para novo mapa...
ExportBranchToHTMLAction.text=Galho como HTML
exported_file={0} arquivos
@@ -354,25 +377,26 @@ ExternalImageChangeAction.text=Mudar imagem...
ExternalImageRemoveAction.text=Remover imagem
ExtractLinkFromTextAction.text=Converter link de dentro de texto
ExtractLinkFromTextAction.tooltip=Definir hiperlink de um endere\u00E7o dentro do texto do n\u00F3
+extras=&Ferramentas
f_button_unassigned=<Sem a\u00E7\u00E3o>
FaqOpenURLAction.text=Perguntas feitas frequentemente
file=&Arquivo
file_already_exists=O arquivo {0} j\u00E1 existe. Voc\u00EA quer escrever por cima dele?
file_not_found=Arquivo {0} n\u00E3o encontrado
FileListFlavorHandler=Lins para arquivos
-FileProperties_BranchLeafCount=N\u00FAmero de n\u00F3s-folhas num galho selecionado:
-FileProperties_BranchNodeCount=N\u00FAmero de n\u00F3s num galho selecionado:
-FileProperties_ChangesSinceLastSave=Altera\u00E7\u00F5es desde a \u00FAltima vez que foi salvo:
-FileProperties_FileName=Nome do arquivo:
-FileProperties_FileSaved=Arquivo salvo:
-FileProperties_FileSize=Tamanho do arquivo:
-FileProperties_MainBranchCount=N\u00FAmero de galhos principais:
+FileProperties_BranchLeafCount=N\u00FAmero de n\u00F3s-folhas num galho selecionado\:
+FileProperties_BranchNodeCount=N\u00FAmero de n\u00F3s num galho selecionado\:
+FileProperties_ChangesSinceLastSave=Altera\u00E7\u00F5es desde a \u00FAltima vez que foi salvo\:
+FileProperties_FileName=Nome do arquivo\:
+FileProperties_FileSaved=Arquivo salvo\:
+FileProperties_FileSize=Tamanho do arquivo\:
+FileProperties_MainBranchCount=N\u00FAmero de galhos principais\:
FileProperties_NeverSaved=Nunca foi salvo
-FileProperties_NodeChildCount=N\u00FAmero de filhos do(s) n\u00F3(s) selecionado(s):
-FileProperties_NodeSelectionCount=N\u00FAmero de n\u00F3s selecionados:
-FileProperties_TotalFilteredCount=N\u00FAmero de n\u00F3s que satisfazem o filtro:
-FileProperties_TotalLeafCount=N\u00FAmero total de n\u00F3s-folhas:
-FileProperties_TotalNodeCount=N\u00FAmero total de n\u00F3s:
+FileProperties_NodeChildCount=N\u00FAmero de filhos do(s) n\u00F3(s) selecionado(s)\:
+FileProperties_NodeSelectionCount=N\u00FAmero de n\u00F3s selecionados\:
+FileProperties_TotalFilteredCount=N\u00FAmero de n\u00F3s que satisfazem o filtro\:
+FileProperties_TotalLeafCount=N\u00FAmero total de n\u00F3s-folhas\:
+FileProperties_TotalNodeCount=N\u00FAmero total de n\u00F3s\:
FilePropertiesAction.text=Estat\u00EDsticas do mapa...
FileRevisionsDialog.cancel=&Cancelar
FileRevisionsDialog.file_last_modified=Protocolo
@@ -384,10 +408,10 @@ FileRevisionsDialog.question=Revis\u00F5es encontradas de {0}
FileRevisionsDialog.restore=Restaurar
FileRevisionsDialog.restore.tooltip=Trocar {0} por {1}
FileRevisionsDialog.title=Revis\u00F5es do arquivo
-filter=Filtrar
+filter=&Fitrar
filter_add=Adicionar
filter_and=E
-filter_any_text=Principal, detalhes ou nota
+filter_any_text=Conte\u00FAdo, detalhes ou nota
filter_conditions=Filtros
filter_contains=Cont\u00E9m
filter_created_after=Criado ap\u00F3s
@@ -434,26 +458,29 @@ filter_selected_node_view=N\u00F3s selecionados no momento
filter_selected_node_view_snapshot=Sele\u00E7\u00E3o salva
filter_style=Estilo
filter_time=Filtro de data
-FilterComposerDialog.save=Salvar
+filterConditions=Filtros Definidos pelo Usu\u00E1rio
filters_not_loaded=Filtro n\u00E3o pode ser carregado; arquivo corrompido
+find=Localizar / Procurar
find_what=Procurar o qu\u00EA
FindAction.text=Procurar...
-FirstGroupNodeAction.text=N\u00F3 resumo (come\u00E7o de grupo)
+FindNextAction.text=Localizar pr\u00F3ximo
+FindPreviousAction.text=Localizar anterior
fit_map_to_page=&Ajustar para uma p\u00E1gina
fit_map_to_page_height=Ajustar &altura para uma p\u00E1gina
fit_map_to_page_width=Ajustar &largura para uma p\u00E1gina
-FitToPage.text=Amplia para &caber na p\u00E1gina
+FitToPage.text=Amplia para caber na p\u00E1gina
FitToPage.tooltip=Ajusta a amplia\u00E7\u00E3o de modo que o mapa todo caiba na janela atual.
fold=Recolher
FoldAllAction.text=Recolher tudo
FoldAllAction.tooltip=<html>Contrai o n\u00F3 selecionado e todos os seus filhos.</html>
FoldOneLevelAction.text=Recolher um n\u00EDvel
FoldOneLevelAction.tooltip=<html>Contrai os n\u00F3s selecionados um n\u00EDvel.</html>
-follow_graphical_link=Ir para:
+follow_graphical_link=Ir para
FollowLinkAction.text=Seguir link
font=Fonte
FontFamilyAction.text=fam\u00EDlia da fonte
FontSizeAction.text=tamanho da fonte
+format=&Formatar
format_invalid_pattern=N\u00E3o \u00E9 um padr\u00E3o v\u00E1lido
format_menu_cloud_shapes=Adicionar nuvem ou mudar estilo
format_menu_edge_styles=&Estilos de borda
@@ -465,7 +492,7 @@ FormatPaste.text=Cola formata\u00E7\u00E3o
FormatPaste.tooltip=<html>Cola a formata\u00E7\u00E3o de um n\u00F3.</html>
formats_not_loaded=Formatos n\u00E3o puderam ser carregados; arquivos corrompidos
formula.error.attributeValueIsNull=Valor do atributo "{0}" \u00E9 nulo depois da avalia\u00E7\u00E3o.
-formula.error.circularReference=Refer\u00EAncia circular: A f\u00F3rmula no n\u00F3 "{0}" referencia a si mesmo.
+formula.error.circularReference=Refer\u00EAncia circular\: A f\u00F3rmula no n\u00F3 "{0}" referencia a si mesmo.
formula.EvaluateAllAction.text=Avalia todos
formula.EvaluateAllAction.tooltip=Avaliar todas as f\u00F3rmulas do mapa atual
formula.menuname=F\u00F3rmulas
@@ -507,7 +534,7 @@ HierarchicalIconsAction.text=Mostra os \u00EDcones hierarquicamente
HierarchicalIconsAction.tooltip=Se um dos meus filhos (netos) tem um \u00EDcone, eu mostrarei este \u00EDcone pequeno tamb\u00E9m.
hot_keys=Teclas de atalho
hot_keys_table=Tabela de teclas de atalho
-HotKeyInfoAction.text=Tecla de refer\u00EAncia
+HotKeyInfoAction.text=Manual com Todos os Atalhos
html_export_based_on_headings=Exportar HTML - Baseado nos cabe\u00E7alhos
html_export_fold_all=Exportar HTML - Todos os enlaces
html_export_fold_currently_folded=Exportar HTML - Sem expandir os enlaces
@@ -643,14 +670,15 @@ IconProgressIconUpAction.text=Progresso para cima
IconProgressIconUpAction.tooltip=Aumenta/insere \u00EDcones de progresso (0% -> 25% -> 50% -> 75% -> 100% + OK).
IconProgressRemoveAction.text=Remover progresso
IconProgressRemoveAction.tooltip=Remove \u00EDcones de progresso e de progresso extendido.
+icons=\u00CDcones
IconSelectionPlugin.text=Selecionar \u00EDcone...
IconSelectionPlugin.tooltip=<html>Aqui voc\u00EA pode selecionar um \u00EDcone usando uma janela.</html>
image_covertLink=Converte link em imagem
ImageFlavorHandler=Imagem (use arquivo separado)
-import=Importar
+import=&Importar
import_linked_branch_no_link=O n\u00F3 selecionado n\u00E3o tem nenhum link para ser importado.
ImportAction.text=Importar
-ImportBranchAction.text=Galho...
+ImportBranchAction.text=Ramo...
ImportExplorerFavoritesAction.text=Favoritos IE...
ImportFolderStructureAction.text=Estrutura de pastas...
ImportLinkedBranchAction.text=Galhos referenciados
@@ -666,21 +694,22 @@ invalid_url=N\u00E3o foi poss\u00EDve3l criar uma URL v\u00E1lida
invalid_url_msg=N\u00E3o foi poss\u00EDvel criar uma URL v\u00E1lida para {0}
ItalicAction.text=It\u00E1lica
italicise_branch=It\u00E1lico
-java_version=Vers\u00E3o do java: {0}
-JoinNodesAction.text=Unir n\u00F3s
+java_version=Vers\u00E3o do java\: {0}
+lastOpenedMaps=Mapas Abertos Recentemente
latex_editor=Editor LaTeX
LatexDeleteLatexAction.text=Remover f\u00F3rmula LaTeX
-LatexEditLatexAction.text=Editar f\u00F3rmula &LaTeX...
-LatexInsertLatexAction.msg1=<html>Voc\u00EA est\u00E1 tentando inserir uma f\u00F3rmula <i>legacy</i> do LaTeX.<br/> A nova maneira de se criar um texto ou f\u00F3rmula LaTeX est\u00E1 descrito na p\u00E1gina: </html>
-LatexInsertLatexAction.msg2=<html>Em resumo: <ul><li>use um prefixo "\\latex" no n\u00F3 de texto ou</li><li><i>Vizualizar->Painel de Propriedades</i>, em seguida <i>Texto Principal->Formatar->LaTeX</i></li></ul></html>
+LatexEditLatexAction.text=Editar f\u00F3rmula LaTeX...
+LatexInsertLatexAction.msg1=<html>Voc\u00EA est\u00E1 tentando inserir uma f\u00F3rmula <i>legacy</i> do LaTeX.<br/> A nova maneira de se criar um texto ou f\u00F3rmula LaTeX est\u00E1 descrito na p\u00E1gina\: </html>
+LatexInsertLatexAction.msg2=<html>Em resumo\: <ul><li>use um prefixo "\\latex" no n\u00F3 de texto ou</li><li><i>Vizualizar->Painel de Propriedades</i>, em seguida <i>Texto Principal->Formatar->LaTeX</i></li></ul></html>
LatexInsertLatexAction.text=Adicionar f\u00F3rmula LaTeX...
latexPatternFormat=LaTeX
less_than_two_selected_nodes=\u00C9 preciso selecionar ao menos dois n\u00F3s para estabelecer um link.
-license=Licen\u00E7a: GPL 2 ou posterior
+license=Licen\u00E7a\: GPL 2 ou posterior
license_text=<html>Esse programa \u00E9 um software livre; voc\u00EA pode redistribu\u00ED-lo e/ou<br>modific\u00E1-lo sob os termos da GNU - Licen\u00E7a P\u00FAblica Geral<br>como publicado pela Funda\u00E7\u00E3o do Software Livre; mesmo a vers\u00E3o 2<br>da licen\u00E7a, ou(em sua opini\u00E3o) qualquer vers\u00E3o posterior.<br><br>Esse programa \u00E9 distribu\u00EDdo com a esperan\u00E7a de ser \u00FAtil,<br> mas SEM NENHUMA GARANTIA; sem mesmo a garantia impl\u00EDcita de<br>COM [...]
link_error=Link incorreto "{0}" n\u00E3o carregada
link_not_available_any_more=O link n\u00E3o \u00E9 mais v\u00E1lido. Um dos n\u00F3s foi apagado.
link_not_found=Link {0} n\u00E3o encontrado.
+links=Link
load=&Carregar
load_accelerator_presets=Carregar
LoadAcceleratorPresetsAction.textPatterns.text=Padr\u00F5es de texto
@@ -690,8 +719,8 @@ locking_old_lock_removed=O Mapa {0} foi travado pelo usu\u00E1rio {1}. O travame
long_node_changed_cancel=Voc\u00EA mudou o n\u00F3. Voc\u00EA quer descartar as mudan\u00E7as?
long_node_changed_submit=Voc\u00EA mudou o n\u00F3. Voc\u00EA quer salvar as mudan\u00E7as?
lots_of_links_warning=Voc\u00EA est\u00E1 para criar v\u00E1rios links para o mesmo n\u00F3. Voc\u00EA realmente quer criar esses links?
-main_resource_directory=Instala\u00E7\u00E3o de recursos: {0}
-MainView.errorUpdateText=Erro ao definir oo texto para a seguinte entrada: {0}.
+main_resource_directory=Instala\u00E7\u00E3o de recursos\: {0}
+MainView.errorUpdateText=Erro ao definir oo texto para a seguinte entrada\: {0}.
MakeLinkFromAnchorAction.text=Fa\u00E7a um link a partir da \u00E2ncora
MakeLinkFromAnchorAction.tooltip=<html>Criar um link local ou global a partir<br/> da \u00E2ncora do n\u00F3 para o n\u00F3 selecionado</html>
MakeLinkToAnchorAction.text=Faz um link para a \u00E2ncora
@@ -700,16 +729,16 @@ ManageAddOnsAction.text=Adicionais
ManageAddOnsDialog.activate=Ativar
ManageAddOnsDialog.activation.success={0} ser\u00E1 ativado depois de reiniciar.
ManageAddOnsDialog.authored.by=por {0}
-ManageAddOnsDialog.cannot.activate=N\u00E3o foi poss\u00EDvel ativar: {0} ainda est\u00E1 ativo.
+ManageAddOnsDialog.cannot.activate=N\u00E3o foi poss\u00EDvel ativar\: {0} ainda est\u00E1 ativo.
ManageAddOnsDialog.cannot.configure=N\u00E3o foi poss\u00EDvel configurar {0}.
-ManageAddOnsDialog.cannot.deactivate=N\u00E3o foi poss\u00EDvel desativar: {0} n\u00E3o est\u00E1 ativo.
+ManageAddOnsDialog.cannot.deactivate=N\u00E3o foi poss\u00EDvel desativar\: {0} n\u00E3o est\u00E1 ativo.
ManageAddOnsDialog.cannot.deinstall=N\u00E3o foi poss\u00EDvel desinstalar {0}.
ManageAddOnsDialog.configure=Configurar
ManageAddOnsDialog.deactivate=Desativar
ManageAddOnsDialog.deactivation.success={0} ser\u00E1 desativado depois de um rein\u00EDcio.
ManageAddOnsDialog.deinstall=Desinstalar
ManageAddOnsDialog.deinstallation.success={0} ser\u00E1 desinstalado ap\u00F3s o rein\u00EDcio.
-ManageAddOnsDialog.error=Erro na instala\u00E7\u00E3o: {0}.
+ManageAddOnsDialog.error=Erro na instala\u00E7\u00E3o\: {0}.
ManageAddOnsDialog.install=$Instalar
ManageAddOnsDialog.install.from.known.location=Instale o adicional a partir de um local conhecido
ManageAddOnsDialog.install.tooltip=Insira a URL de um arquivo de instala\u00E7\u00E3o de adicionais aqui
@@ -728,30 +757,30 @@ ManageAddOnsDialog.tab.manage.themes=Temas
ManageAddOnsDialog.tab.manage.themes.tooltip=Gerenciar temas instalados
ManageAddOnsDialog.tab.manage.tooltip=Gerenciar adicionais instalados
ManageAddOnsDialog.visit.addon.page=Visitar a p\u00E1gina do adicional...
-ManageConditionalStylesAction.text=&Gerenciar estilos condicionais para mapa
-ManageNodeConditionalStylesAction.text=&Gerenciar estilos condicionais para n\u00F3
+ManageConditionalStylesAction.text=Gerenciar estilos condicionais para mapa
+ManageNodeConditionalStylesAction.text=Gerenciar estilos condicionais para n\u00F3
map_already_exists=Esse mapa j\u00E1 existe. Voc\u00EA gostaria de sobrescrev\u00EA-lo?
+map_background=Fundo do Mapa
map_corrupted=Mapa corrompido. Ver detalhes?
map_load_error=N\u00E3o foi poss\u00EDvel carregar o mapa {0}
map_locked_by_open=O Mapa {0} j\u00E1 est\u00E1 sendo editado por {1}. Abrindo somente para leitura.
map_locked_by_save_as=O Mapa {0} j\u00E1 est\u00E1 sendo editado por {1}. A\u00E7\u00E3o de Salvar como abortada.
map_not_saved=O mapa n\u00E3o foi salvo anteriormente.
+MapBackgroundClearAction.text=Redefinir Configura\u00E7\u00F5es Padr\u00E3o do Fundo do Mapa
MapBackgroundColorAction.text=Cor de fundo do mapa
+MapBackgroundImageAction.text=Imagem de Fundo
+maps=Mapas Abertos
MaxNodeWidth.text=Define a largura m\u00E1xima do n\u00F3
menu_applyStyle=Aplicar estilo
menu_attributes=&Atributos
menu_clouds=Nuvens
menu_copy=Copiar
-menu_coreFormat=O cora\u00E7\u00E3o do n\u00F3
+menu_coreFormat=Conte\u00FAdo do N\u00F3
menu_details=Detalhes
menu_displayAttributes=Atributos do n\u00F3
menu_encryption=Prote\u00E7\u00E3o por palavra chave
menu_error=Erro na estrutura de menu definida pelo usu\u00E1rio {0}.\n{1}\nAbortando
menu_extensions=Extens\u00F5es do n\u00F3
-menu_extras=&Ferramentas
-menu_file_import=&Importar
-menu_filter=&Fitrar
-menu_format=&Formatar
menu_group=Grupo do n\u00F3
menu_hoverView=Dicas de ferramenta
menu_iconByCategory=\u00CDcone por categoria...
@@ -759,26 +788,20 @@ menu_iconView=\u00CDcones
menu_image=Imagem
menu_insert=&Inserir
menu_latex_formula=F\u00F3rmula LaTeX
-menu_links=Link
menu_manageStyles=&Gerenciar estilos
menu_moveNode=Mover e organizar
-menu_navigate=&Navegar
menu_newNode=Novo n\u00F3
menu_node=N\u00F3
menu_node_features=Caracter\u00EDsticas do n\u00F3
menu_nodes=&N\u00F3
menu_nodeView=N\u00FAcleo do n\u00F3
-menu_notes=Anota\u00E7\u00E3o
menu_noteView=Anota\u00E7\u00F5es
menu_openmaps=Mapas
-menu_progress=\u00CDcone de Andamento (%)
menu_remove_icons=Remover \u00EDcones
menu_removeAttribute=Remover atributo
menu_select=Selecionar
menu_time=Gerenciamento de tempo
menu_title=N\u00FAcleo do n\u00F3
-menu_toolbars=Barras de ferramentas
-menu_view=Visualizar
menu_viewmode=Defini\u00E7\u00F5es de vizualiza\u00E7\u00E3o
MenuUtils.invalid_menuitem={0} n\u00E3o \u00E9 uma tecla de item de menu v\u00E1lida.
mindmap=Mapa
@@ -798,12 +821,14 @@ ModesMenuAction.Browse.text=Navegador de mapa
ModesMenuAction.File.text=Gerenciador de arquivos
ModesMenuAction.MindMap.text=Editor de mapa mental
most_recent_files=Arquivos mais recentes
+MoveAction.text=Mover
MoveToRootAction.text=Mover para raiz
NameConditionAction.text=Defina o nome
+navigate=&Navegar
NavigationNextMapAction.text=Pr\u00F3ximo mapa
NavigationPreviousMapAction.text=Mapa anterior
new=&Novo
-new_map_from_user_templates.text=Novo mapa a partir do &Modelo...
+new_map_from_user_templates.text=Novo mapa a partir do Modelo...
new_mindmap=Novo mapa da mente
new_node=Novo n\u00F3
new_node_as_sibling_not_possible_for_the_root=N\u00E3o \u00E9 poss\u00EDvel um novo n\u00F3 irm\u00E3o a partir da ra\u00EDz
@@ -816,21 +841,22 @@ NewerFileRevisionsFoundDialog.file_name=Arquivo
NewerFileRevisionsFoundDialog.file_size=Bytes
NewerFileRevisionsFoundDialog.open=&Abrir
NewerFileRevisionsFoundDialog.open.tooltip=Abrir o arquivo mesmo que esteja desatualizado
-NewerFileRevisionsFoundDialog.question=Encontradas novas revis\u00F5es de {0}!
+NewerFileRevisionsFoundDialog.question=Encontradas novas revis\u00F5es de {0}\!
NewerFileRevisionsFoundDialog.restore=Rest&aurar
NewerFileRevisionsFoundDialog.restore.tooltip=Substituir {0} por {1}
-NewerFileRevisionsFoundDialog.title=Encontradas novas revis\u00F5es de arquivo!
-NewFreeNodeAction.text=Novo n\u00F3 liberado
+NewerFileRevisionsFoundDialog.title=Encontradas novas revis\u00F5es de arquivo\!
+NewFreeNodeAction.text=Novo n\u00F3 Flutuante
NewLevelStyleAction.text=Adicionar estilo de n\u00EDvel
-newmap.install.addon.question={0} parece ser um pacote add-on\u21B5\nDeseja instala-lo?\u21B5\n(Selecione "N\u00E3o" para abri-lo normalmente.)
+newmap.install.addon.question={0} parece ser um pacote add-on?\nDeseja instala-lo??\n(Selecione "N\u00E3o" para abri-lo normalmente.)
newmap.install.addon.title=Instalar o add-on?
-NewMapAction.text=Novo
+NewMapAction.text=Novo mapa
NewMapViewAction.text=Nova vizualisa\u00E7\u00E3o do mapa
NewParentNode.text=Novo n\u00F3 pai
NewParentNode.tooltip=<html>Todos os selecionados s\u00E3o enviados para um novo pai.</html>
NewPreviousSiblingAction.text=Novo n\u00F3 irm\u00E3o acima
NewSiblingAction.text=Novo n\u00F3 irm\u00E3o abaixo
-NewSummaryAction.text=Novo n\u00F3 de sum\u00E1rio (dos n\u00F3s selecionados)
+NewSummaryAction.text=Novo n\u00F3 sum\u00E1rio
+NewSummaryAction.tooltip=Chave abra\u00E7ando 2 ou mais N\u00F3s Filhos
NewUserStyleAction.text=Novo estilo com base na sele\u00E7\u00E3o
NextNodeAction.BACK.text=V\u00E1 para o n\u00F3 anterior
NextNodeAction.BACK_N_FOLD.text=V\u00E1 para o n\u00F3 anterior (colapsar)
@@ -855,27 +881,27 @@ node_styles=Estilos de n\u00F3
NodeBackgroundColorAction.text=Cor de fundo do n\u00F3...
NodeColorAction.text=Cor do n\u00F3...
NodeColorBlendAction.text=Cor da mistura
-NodeDownAction.text=Mover o n\u00F3 (irm\u00E3o para baixo)
+NodeDownAction.text=Mover n\u00F3 para Baixo
NodeExtensions.EditNodeExtensions=Editar extens\u00F5es de n\u00F3
NodeExtensions.RemoveNodeExtensions=Remover extens\u00F5es de n\u00F3
NodeListAction.text=Busca e substitui...
NodeListAction.tooltip=Mostra todos os n\u00F3s como uma lista filtr\u00E1vel.
NodeShapeAction.bubble.text=Bolha
-NodeShapeAction.fork.text=Ramificar
-NodeUpAction.text=Mover o n\u00F3 (irm\u00E3o acima)
-NodeWidthAction.text=Definir os limites da largura do n\u00F3
+NodeShapeAction.fork.text=Estilo forca
+NodeUpAction.text=Mover n\u00F3 para Cima
nonboldify_branch=Retirar o negrito
nonitalicise_branch=Retirar o it\u00E1lico
normal=Normal
not_saved_for_image_error=O mapa deve ser salvo antes que voc\u00EA possa escolher uma imagem por meio do seletor de arquivo
not_saved_for_link_error=O mapa precisa ser salvo antes que voc\u00EA possa setar uma refer\u00EAncia pelo seletor de arquivos
note_window_location=posi\u00E7\u00E3o do painel de anota\u00E7\u00F5es
+notes=Anota\u00E7\u00E3o
ok=OK
OKAction.text=OK
OnlineReference.text=mapas da documenta\u00E7\u00E3o online
open_asMindMap=Mapa mental
-OpenAction.text=Abrir...
-OpenFreeplaneSiteAction.text=Homepage do Freepllane
+OpenAction.text=Abrir Mapas Salvos...
+OpenFreeplaneSiteAction.text=P\u00E1gina do Freeplane na Internet
OpenMapsAddLocation.text=Adicionar caminho do OpenMaps...
OpenMapsRemoveLocation.text=Remover caminho do OpenMaps
OpenMapsViewLocation.text=Vizualizar caminho do OpenMaps...
@@ -907,7 +933,7 @@ OptionPanel.antialias_none=Sem suaviza\u00E7\u00E3o
OptionPanel.Appearance=Apar\u00EAncia
OptionPanel.apply_system_screen_resolution=Aplicar a resolu\u00E7\u00E3o de tela padr\u00E3o do sistema
OptionPanel.approximate_search_threshold=princ\u00EDpio de correspond\u00EAncia aproximada
-OptionPanel.approximate_search_threshold.tooltip=<html>Limite para correspond\u00EAncia aproximada<br/><font size="2">consulte http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(quanto maior a varia\u00E7\u00E3o menor<br/>ser\u00E1 o termo encontrado)</html>
+OptionPanel.approximate_search_threshold.tooltip=<html>Limite para correspond\u00EAncia aproximada<br/><font size\="2">consulte http\://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(quanto maior a varia\u00E7\u00E3o menor<br/>ser\u00E1 o termo encontrado)</html>
OptionPanel.ar=\u00C1rabe
OptionPanel.ARC=Arco
OptionPanel.as_parent=Como pai
@@ -936,31 +962,32 @@ OptionPanel.compare_as_number=Comparar uns n\u00FAmeros
OptionPanel.convert_to_current_version=<html>Automaticamente converter mapas de vers\u00F5es antigas do Freeplane<br> para a vers\u00E3o atual?</html>
OptionPanel.convert_to_current_version.tooltip=<html>Apenas para mapas grandes que n\u00E3o precisam ser convertidas <br>(este \u00E9 um conhecimento de expert) voc\u00EA pode abrir os mapas sem convert\u00EA-los.</html>
OptionPanel.cs=Tcheco
-OptionPanel.cut_nodes_without_question=Cortar os n\u00F3s sem confirmar?
-OptionPanel.cut_nodes_without_question.tooltip=Se esta caixa de marca\u00E7\u00E3o for selecionada, os n\u00F3s ser\u00E3o cortados sem confirma\u00E7\u00E3o. Isto poder\u00E1 causar perda de informa\u00E7\u00F5es, caso acontecer acidentalmente.
+OptionPanel.cut_nodes_without_question=Cortar os n\u00F3s sem pedir confirma\u00E7\u00E3o ?
+OptionPanel.cut_nodes_without_question.tooltip=Se esta op\u00E7\u00E3o for selecionada, os n\u00F3s ser\u00E3o cortados sem confirma\u00E7\u00E3o.
OptionPanel.da=Dinamarca
OptionPanel.date_format=Formato de data padr\u00E3o
OptionPanel.date_format.tooltip=CURTO, M\u00C9DIO, LONGO, INTEIRO ou PADR\u00C3O como "MM/dd/yyyy"
OptionPanel.datetime_format=Formato de data e hora padr\u00E3o
-OptionPanel.datetime_format.tooltip=<datestyle>,<timestyle> (estilo CURTO, M\u00C9DIO, LONGO ou INTEIRO) ou um padr\u00E3o inteiro como "M/d/yyyy hh:mm"
+OptionPanel.datetime_format.tooltip=<datestyle>,<timestyle> (estilo CURTO, M\u00C9DIO, LONGO ou INTEIRO) ou um padr\u00E3o inteiro como "M/d/yyyy hh\:mm"
OptionPanel.de=Alemanha
OptionPanel.default=Padr\u00E3o
OptionPanel.default_attribute_key_column_width=Atributo padr\u00E3o de largura de chave
OptionPanel.default_attribute_value_column_width=Atributo padr\u00E3o valor de largura
OptionPanel.default_browser_command_mac=Comando padr\u00E3o do Mac para browser
-OptionPanel.default_browser_command_mac.tooltip=<html> e para o MAC: (gra\u00E7as ao Nick!)</html>
+OptionPanel.default_browser_command_mac.tooltip=<html> e para o MAC\: (gra\u00E7as ao Nick\!)</html>
OptionPanel.default_browser_command_other_os=Comando padr\u00E3o para o browser em outros sistemas operacionais
-OptionPanel.default_browser_command_other_os.tooltip=<html> Este \u00E9 tipicamente Linux:</html>
+OptionPanel.default_browser_command_other_os.tooltip=<html> Este \u00E9 tipicamente Linux\:</html>
OptionPanel.default_browser_command_windows_9x=Comando padr\u00E3o para o browser no Windows 9x
-OptionPanel.default_browser_command_windows_9x.tooltip=<html>Para o Windows (as aspas ("") s\u00E3o necess\u00E1rias para links que tem "=" em suas URLs).</html>
+OptionPanel.default_browser_command_windows_9x.tooltip=<html>Para o Windows (as aspas ("") s\u00E3o necess\u00E1rias para links que tem "\=" em suas URLs).</html>
OptionPanel.default_browser_command_windows_nt=Comando padr\u00E3o para o browser no Windows NT
-OptionPanel.default_browser_command_windows_nt.tooltip=<html>Para o Windows (as aspas ("") s\u00E3o necess\u00E1rias para links que tem "=" em suas URLs).</html>
+OptionPanel.default_browser_command_windows_nt.tooltip=<html>Para o Windows (as aspas ("") s\u00E3o necess\u00E1rias para links que tem "\=" em suas URLs).</html>
OptionPanel.default_charset=Conjunto de caracteres
+OptionPanel.default_save_dir=Pasta Padr\u00E3o para Salvar
OptionPanel.Defaults=Padr\u00F5es
OptionPanel.delete_automatic_saves_at_exit=Apaga grava\u00E7\u00F5es autom\u00E1ticas quando sair
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Caso voc\u00EA deseje que as grava\u00E7\u00F5es autom\u00E1ticas sejam apagadas quando o Freeplane for desligado normalmente, selecione esta caixa de di\u00E1logo.</html>
-OptionPanel.delete_nodes_without_question=Remover sem confirma??o?
-OptionPanel.delete_nodes_without_question.tooltip=Se esta op??o for escolhida os n\u00F3s serao removidos sem confirma??o. isto pode causar perda de informa??o se pressionada sem inten??o.
+OptionPanel.delete_nodes_without_question=Deletar n\u00F3s sem pedir confirma\u00E7\u00E3o ?
+OptionPanel.delete_nodes_without_question.tooltip=Se esta op\u00E7\u00E3o for escolhida os n\u00F3s ser\u00E3o removidos sem que o programa pe\u00E7a sua confirma\u00E7\u00E3o.
OptionPanel.disable_cursor_move_paper=Desabilita cursor de movimenta\u00E7\u00E3o da tela
OptionPanel.disable_cursor_move_paper.tooltip=<html>N\u00E3o mostra o cursor de 'mover' enquanto est\u00E1 movendo a figura</html>
OptionPanel.display_inline_editor_for_all_new_nodes=Mostrar o editor interno para todos os novos n\u00F3s
@@ -990,13 +1017,13 @@ OptionPanel.et=Estoniano
OptionPanel.execute_scripts_without_asking=Execu\u00E7\u00E3o de script habilitada
OptionPanel.execute_scripts_without_asking.tooltip=<html>Scripts Freeplane sao capazes de executar qualquer acao em seu computador. <br>Desta forma, voc\u00EA nao deve executar scripts que voc\u00EA nao tenha certeza que sejam seguros.</html>
OptionPanel.execute_scripts_without_exec_restriction=Autoriza\u00E7\u00E3o para executar outras aplica\u00E7\u00F5es (N\u00C3O RECOMENDADA)
-OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>Se seus Groovy Scripts precisar executar outras aplica\u00E7\u00F5es especiais (como um browser) sem te perguntar, habilitar esta op\u00E7\u00E3o. Cuidado ao usar pois um script malicioso pode prejudicar seu computador!</body></html>
+OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>Se seus Groovy Scripts precisar executar outras aplica\u00E7\u00F5es especiais (como um browser) sem te perguntar, habilitar esta op\u00E7\u00E3o. Cuidado ao usar pois um script malicioso pode prejudicar seu computador\!</body></html>
OptionPanel.execute_scripts_without_file_restriction=Permitir opera\u00E7\u00F5es de leitura do arquivo (N\u00C3O RECOMENDADA)
-OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>Se Groovy Scripts precisa ter acesso de leitura (abrir, fechar, ler),<br>voc\u00EA precisa habilitar essa op\u00E7\u00E3o.<br>Cuidado, um script malicioso pode prejudicar seu computador!</body></html>
+OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>Se Groovy Scripts precisa ter acesso de leitura (abrir, fechar, ler),<br>voc\u00EA precisa habilitar essa op\u00E7\u00E3o.<br>Cuidado, um script malicioso pode prejudicar seu computador\!</body></html>
OptionPanel.execute_scripts_without_network_restriction=Permitir opera\u00E7\u00F5es de rede (N\u00C3O RECOMENDADA)
-OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>Se os scripts Groovy precisa executar a\u00E7\u00F5es especiais de rede,<br>voc\u00EA tem que habilitar essa op\u00E7\u00E3o. <br>Use com cuidado, o script malicioso pode prejudicar seguran\u00E7a das informa\u00E7\u00F5es!</body></html>
+OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>Se os scripts Groovy precisa executar a\u00E7\u00F5es especiais de rede,<br>voc\u00EA tem que habilitar essa op\u00E7\u00E3o. <br>Use com cuidado, o script malicioso pode prejudicar seguran\u00E7a das informa\u00E7\u00F5es\!</body></html>
OptionPanel.execute_scripts_without_write_restriction=Permitir opera\u00E7\u00F5es de arquivo/escrita (N\u00C3O RECOMENDADA)
-OptionPanel.execute_scripts_without_write_restriction.tooltip=<html><body>Se precisar de seus scripts Groovy para acesso de grava\u00E7\u00E3o aos arquivos (escrever, apagar (!)),<br>voc\u00EA tem que habilitar essa op\u00E7\u00E3o. <br>Normalmente usado com acesso de leitura.<br>Use com cuidado, pois script malicioso pode prejudicar seu computador!</body></html>
+OptionPanel.execute_scripts_without_write_restriction.tooltip=<html><body>Se precisar de seus scripts Groovy para acesso de grava\u00E7\u00E3o aos arquivos (escrever, apagar (\!)),<br>voc\u00EA tem que habilitar essa op\u00E7\u00E3o. <br>Normalmente usado com acesso de leitura.<br>Use com cuidado, pois script malicioso pode prejudicar seu computador\!</body></html>
OptionPanel.experimental_file_locking_on=Bloqueio de arquivo experimental
OptionPanel.experimental_file_locking_on.tooltip=<html> Caracter\u00EDstica experimental</html>
OptionPanel.export_icons_in_html=Exporta \u00EDcones para HTML
@@ -1017,7 +1044,7 @@ OptionPanel.gl=Galego
OptionPanel.goto_note_end_on_edit=Mova o cursor de nota para o final
OptionPanel.grid_size=Tamanho da lacuna de grade
OptionPanel.groovy_editor_font=Fonte para editor Groovy Syntax Highlighting
-OptionPanel.groovy_editor_font.tooltip=Usar 'Dialog' ou 'Monospaced' se voc\u00EA necessita caracteres unicode!
+OptionPanel.groovy_editor_font.tooltip=Usar 'Dialog' ou 'Monospaced' se voc\u00EA necessita caracteres unicode\!
OptionPanel.groovy_editor_font_size=Tamanho da fonte para editor Groovy Syntax Highlighting
OptionPanel.gtk=GTK
OptionPanel.hide_edge=Ocultar a borda
@@ -1056,7 +1083,7 @@ OptionPanel.last_opened_list_length=Comprimento da \u00FAltima lista de arquivos
OptionPanel.latex_disable_editor=Desativar editor LaTeX Syntax Highlighting
OptionPanel.latex_disable_editor.tooltip=Marque esta op\u00E7\u00E3o se voc\u00EA est\u00E1 tendo problemas com o editor LaTeX
OptionPanel.latex_editor_font=Fonte para LaTeX Syntax Highlighting
-OptionPanel.latex_editor_font.tooltip=Usar 'Dialog' ou 'Monospaced' se voc\u00EA necessita de caracteres unicode!
+OptionPanel.latex_editor_font.tooltip=Usar 'Dialog' ou 'Monospaced' se voc\u00EA necessita de caracteres unicode\!
OptionPanel.latex_editor_font_size=Tamanho da fonte para editor LaTeX Syntax Highlighting
OptionPanel.latex_macros=Macros comuns LaTeX
OptionPanel.layout_map_on_text_change=Mapa de layout durante a edi\u00E7\u00E3o
@@ -1069,7 +1096,7 @@ OptionPanel.load_folding_from_map_default_fold_all=Carregar do mapa ou recolher
OptionPanel.load_folding_from_map_default_unfold_all=Carregar do mapa ou expandir tudo
OptionPanel.load_last_map=Abrir o \u00FAltimo mapa automaticamente
OptionPanel.load_last_map.tooltip=<html>Caso selecionado, quando o Freeplane inicializar ele ir\u00E1 abrir automaticamente o \u00FAltimo mapa aberto.</html>
-OptionPanel.load_last_maps=Carregar todos as \u00FAltimas mapas
+OptionPanel.load_last_maps=Abrir todos os \u00FAltimos mapas
OptionPanel.lookandfeel=Apar\u00EAncia e Comportamento
OptionPanel.lookandfeel.tooltip=<html>Para usar Look&Feel. 'metal', 'windows', 'motif' e 'gtk' s\u00E3o suportados, 'mac' \u00E9 avaliado somente na plataforma MacOS. Por padr\u00E3o, a apar\u00EAncia \u00E9 usada. Se voc\u00EA quer coloar seu pr\u00F3prio L&F, por favor, entre aqui o nome da classe e assegurar que o(s) arquivo(s) JAR correspondente(s) \u00E9(s\u00E3o) carregado(s). Se houver problemas com a apar\u00EAncia, escolha 'nada'. Ele trabalha com applets.</html>
OptionPanel.lt=Lt
@@ -1084,10 +1111,10 @@ OptionPanel.max_shortened_text_length=Largura m\u00E1xima de texto abreviado
OptionPanel.metal=Metal
OptionPanel.min_node_width=Largura m\u00EDnima do n\u00F3
OptionPanel.motif=Motivo
-OptionPanel.nb=Noruegu\u00EAs
+OptionPanel.nb=Noruegu\u00EAs Bokm\u00E5l / Norsk bokm\u00E5l
OptionPanel.never_save_folding=Nunca
OptionPanel.nl=Holand\u00EAs
-OptionPanel.nn=Noruegu\u00EAs
+OptionPanel.nn=Noruegu\u00EAs Nynorsk / Norsk nynorsk
OptionPanel.nodebackgroundcolor=Plano de fundo
OptionPanel.nodebackgroundcolor.tooltip=O plano de fundo do n\u00F3 quando n\u00E3o est\u00E1 selecionado.
OptionPanel.nodecolor=Texto
@@ -1098,16 +1125,14 @@ OptionPanel.nodefontitalic=It\u00E1lico
OptionPanel.nodefontname=Fam\u00EDlia de fontes
OptionPanel.nodefontsize=Tamanho da fonte
OptionPanel.nodeformat=Formato
-OptionPanel.nodeformat.tooltip=<html>Substitui\u00E7\u00E3o de texto e/ou formata\u00E7\u00E3o:<ul><li><em>Expan\u00E3o do modelo</em> (<tt>%s</tt> \u00E9 texto original), por exemplo <tt>BEWARE: %s</tt><li><em>Formata\u00E7\u00E3o de datas e n\u00FAmeros</em> - veja os exemplos na caixa de sele\u00E7\u00E3o</ul></html>
+OptionPanel.nodeformat.tooltip=<html>Substitui\u00E7\u00E3o de texto e/ou formata\u00E7\u00E3o\:<ul><li><em>Expan\u00E3o do modelo</em> (<tt>%s</tt> \u00E9 texto original), por exemplo <tt>BEWARE\: %s</tt><li><em>Formata\u00E7\u00E3o de datas e n\u00FAmeros</em> - veja os exemplos na caixa de sele\u00E7\u00E3o</ul></html>
OptionPanel.nodenumbering=Numera\u00E7\u00E3o de n\u00F3
OptionPanel.nodenumbering.tooltip=Adiciona n\u00FAmero de s\u00E9rie (p.e. 1.3.1) para o texto do n\u00F3.
-OptionPanel.nodeshape=Estilo do n\u00F3
-OptionPanel.nodeshape.tooltip=<html>O estilo descreve a forma exterior de um n\u00F3. <br>Valores poss\u00EDveis:<br><table border="1"><tr><td>base: </td><td> sem caixa circundante,</td></tr><tr><td>bolha: </td><td> n\u00F3 com um ret\u00E2nculo envolvente,</td></tr><tr><td>Como pai: </td><td> levar o estilo do n\u00F3 pai <br>ou o estilo de n\u00F3 de raiz padr\u00E3o para o n\u00F3 raiz,</td></tr><tr><td>Combinado: </td><td> Bolha quando o n\u00F3 \u00E9 recolhido, caso contr\u00E1rio [...]
OptionPanel.nodetext=Texto principal
OptionPanel.nodetext.tooltip=Aqui voc\u00EA pode definir o texto dos n\u00F3s. O texto anterior \u00E9 descartado quando o padr\u00E3o \u00E9 aplicado.
OptionPanel.nothing=Nenhum
OptionPanel.number_format=Padr\u00E3o formato de n\u00FAmero
-OptionPanel.number_format.tooltip=Um padr\u00E3o contendo '#' para opcional ou '0' para d\u00EDgitos obrigat\u00F3rios. Exemplos: "0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_format.tooltip=Um padr\u00E3o contendo '\#' para opcional ou '0' para d\u00EDgitos obrigat\u00F3rios. Exemplos\: "0.00", "0.0%", "$\#.00", "\#0"
OptionPanel.number_of_different_files_for_automatic_save=N\u00FAmero de arquivos diferentes para salvamento autom\u00E1tico
OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> N\u00FAmero de arquivos diferentes para armazenar os mapas. Quando for realizado este n\u00FAmero de grava\u00E7\u00F5es autom\u00E1ticas o primeiro arquivo gravada ser\u00E1 regravado com o mapa mais recente e o ciclo se reinicia.</html>
OptionPanel.OK=Salvar
@@ -1120,10 +1145,10 @@ OptionPanel.outline_hgap=Dist\u00E2ncia horizontal
OptionPanel.outline_vgap=Dist\u00E2ncia vertical
OptionPanel.paint_connectors_behind=Pintar conectores atr\u00E1s de n\u00F3s
OptionPanel.parse_data=Reconhecer a entrada de n\u00FAmeros e data/hora
-OptionPanel.parse_data.tooltip=Tente analisar a data, data e hora e o n\u00FAmero de entrada e aplicar formatos padr\u00F5es. Exemplos: 100,000.00, 12/31, 12/31/99, 1999-12-31 e 1999-12-31 23:59
+OptionPanel.parse_data.tooltip=Tente analisar a data, data e hora e o n\u00FAmero de entrada e aplicar formatos padr\u00F5es. Exemplos\: 100,000.00, 12/31, 12/31/99, 1999-12-31 e 1999-12-31 23\:59
OptionPanel.PASTE_HTML=Colar como HTML
OptionPanel.PASTE_PLAIN_TEXT=Colar como texto sem formata\u00E7\u00E3o
-OptionPanel.path_property_may_not_be_empty=Propriedade do caminho n\u00E3o pode ser vazia! Mudan\u00E7a pode ser revertida.
+OptionPanel.path_property_may_not_be_empty=Propriedade do caminho n\u00E3o pode ser vazia\! Mudan\u00E7a pode ser revertida.
OptionPanel.patternname=Nome
OptionPanel.patternname.tooltip=Nome do padr\u00E3o exclusivo
OptionPanel.pl=Polon\u00EAs
@@ -1141,8 +1166,8 @@ OptionPanel.RECT=Ret\u00E2ngulo
OptionPanel.relative=Relativo
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"Perguntar" perguntar\u00E1 voc\u00EA (uso em d\u00FAvida).<br>"Sim" exibe o editor RichText.<br>"N\u00E3o" Exibe o editor de texto simples.</html>
OptionPanel.remind_use_rich_text_in_new_nodes=Uso de rich text para n\u00F3s colados
-OptionPanel.remove_notes_without_question=Remover notas sem quest\u00E3o?
-OptionPanel.remove_notes_without_question.tooltip=Se esta caixa de sele\u00E7\u00E3o for marcada as notas de n\u00F3s ser\u00E3o removidas sem confirma\u00E7\u00E3o. Isso pode causar perda de informa\u00E7\u00F5es se pressionado sem inten\u00E7\u00E3o.
+OptionPanel.remove_notes_without_question=Remover notas sem pedir confirma\u00E7\u00E3o ?
+OptionPanel.remove_notes_without_question.tooltip=Se esta p\u00E7\u00E3o for marcada as notas dos n\u00F3s ser\u00E3o poder\u00E3o ser removidas sem confirma\u00E7\u00E3o.
OptionPanel.resources_use_default_font_for_notes_too=Usar a fonte padr\u00E3o para as notas tamb\u00E9m
OptionPanel.resources_use_margin_top_zero_for_notes=Remover a margem superior para notas
OptionPanel.revision_color=Cor de revis\u00E3o
@@ -1151,13 +1176,14 @@ OptionPanel.ROUND_RECT=Ret\u00E2ngulo redondo
OptionPanel.ru=Russo
OptionPanel.save_folding=Salvar recolhido
OptionPanel.save_folding_if_map_is_changed=Se o mapa \u00E9 modificado
+OptionPanel.save_last_visited_node=Salvar \u00FAltima posi\u00E7\u00E3o do Mapa
OptionPanel.save_modification_times=Economize horas de modifica\u00E7\u00F5es
-OptionPanel.script_classpath=Script do caminho classe: Diret\u00F3rios adicionais contendo classes e/ou JARs (veja a dica de ferramenta)
-OptionPanel.script_classpath.tooltip=<html>A lista de JARs e/ou diret\u00F3rios para adicionar a f\u00F3rmula e o caminho de classe do script.<br>Uso ; (Windows) ou : (Linux, Mac) para separar as entradas.<br>Diret\u00F3rios ser\u00E3o verificados para JARs e para arquivos.class.<br>Caminhos de que n\u00E3o s\u00E3o absolutos ser\u00E3o considerados relativos ao diret\u00F3rio de usu\u00E1rio FreePlane.<br>Se voc\u00EA definir o caminho de classe tem que permitir o acesso de leitura tam [...]
+OptionPanel.script_classpath=Script do caminho classe\: Diret\u00F3rios adicionais contendo classes e/ou JARs (veja a dica de ferramenta)
+OptionPanel.script_classpath.tooltip=<html>A lista de JARs e/ou diret\u00F3rios para adicionar a f\u00F3rmula e o caminho de classe do script.<br>Uso ; (Windows) ou \: (Linux, Mac) para separar as entradas.<br>Diret\u00F3rios ser\u00E3o verificados para JARs e para arquivos.class.<br>Caminhos de que n\u00E3o s\u00E3o absolutos ser\u00E3o considerados relativos ao diret\u00F3rio de usu\u00E1rio FreePlane.<br>Se voc\u00EA definir o caminho de classe tem que permitir o acesso de leitura ta [...]
OptionPanel.script_compilation_disabled_extensions=Extens\u00F5es de arquivos n\u00E3o podem ser compilados (veja a dica de ferramenta)
OptionPanel.script_compilation_disabled_extensions.tooltip=<html>Se todos os scripts de uma linguagem instalada (exceto<br>Groovy e JavaScript) t\u00EAm um problema geral de compila\u00E7\u00E3o<br>tente adicionar a extens\u00E3o do arquivo aqui (lista separada por ponto-e-v\u00EDrgula).</html>
OptionPanel.script_directories=Caminho de busca de script (veja a dica de ferramenta)
-OptionPanel.script_directories.tooltip=<html>Uma lista de diret\u00F3rios (al\u00E9m do "scripts").<br>Uso do ; (Windows) ou : (Linux, Mac) para separar as entradas.<br>Caminhos n\u00E3o absolutos ser\u00E3o considerados relativos ao diret\u00F3rio de usu\u00E1rio FreePlane.</html>
+OptionPanel.script_directories.tooltip=<html>Uma lista de diret\u00F3rios (al\u00E9m do "scripts").<br>Uso do ; (Windows) ou \: (Linux, Mac) para separar as entradas.<br>Caminhos n\u00E3o absolutos ser\u00E3o considerados relativos ao diret\u00F3rio de usu\u00E1rio FreePlane.</html>
OptionPanel.script_user_key_name_for_signing=Alias de chave de usu\u00E1rio para assinatura opcional
OptionPanel.script_user_key_name_for_signing.tooltip=<html>Se voc\u00EA quer assinar os seus scripts, digite o alias da chave aqui. <br>A chave dever\u00E1 residir no armazenamento padr\u00E3o de chaves. <br>A senha da chave secreta deve coincidir com a senha do armazenamento de chaves (este \u00E9 o padr\u00E3o).</html>
OptionPanel.scrollbar_increment=Velocidade
@@ -1231,7 +1257,7 @@ OptionPanel.separator.tooltip=Tempos de dica de ferramenta
OptionPanel.separator.undo=Desfazer
OptionPanel.separator.updates=Atualiza\u00E7\u00F5es do programa
OptionPanel.set_property_text=Mudar
-OptionPanel.set_property_text.tooltip=Vazio:N\u00E3o toque; Menos: Remove a propriedade (define valores padr\u00E3o); Mais:Altera propriedade
+OptionPanel.set_property_text.tooltip=Vazio\:N\u00E3o toque; Menos\: Remove a propriedade (define valores padr\u00E3o); Mais\:Altera propriedade
OptionPanel.setscript=Modificar?
OptionPanel.setscript.tooltip=Um script pode ser associado ao estilo.
OptionPanel.sharp_bezier=bezier "afiado"
@@ -1239,7 +1265,7 @@ OptionPanel.sharp_linear=linear "afiado"
OptionPanel.show_icon_for_attributes=Mostra \u00EDcones para atributos
OptionPanel.show_node_tooltips=Exibir dicas de ferramenta
OptionPanel.show_note_icons=Mostrar \u00EDcones de nota
-OptionPanel.show_styles_in_tooltip=Exisir estilo de n\u00F3 em dicas de ferramenta
+OptionPanel.show_styles_in_tooltip=\ Exibir estilo do n\u00F3 na Caixa da Dica de Ferramenta
OptionPanel.signed_script_are_trusted=Confia em scripts assinados (recomendado).
OptionPanel.signed_script_are_trusted.tooltip=Se scripts s\u00E3o assinados por uma parte de confian\u00E7a (p.e. de autores do Freeplane ou por si mesmo), ele \u00E9 executado sem restri\u00E7\u00F5es.
OptionPanel.simplyhtml.default_paste_mode=Modo de pasta padr\u00E3o
@@ -1247,7 +1273,7 @@ OptionPanel.single_backup_directory=Usar o \u00FAnico diret\u00F3rio para arquiv
OptionPanel.single_backup_directory.tooltip=<html>Backup e c\u00F3pias autom\u00E1ticas ser\u00E3o colocados em um \u00FAnico diret\u00F3rio em vez de um sub-diret\u00F3rios</html>
OptionPanel.single_backup_directory_path=Diret\u00F3rio de backup (se a op\u00E7\u00E3o acima for selecionada)
OptionPanel.single_backup_directory_path.tooltip=<html>Substituir padr\u00E3o <freeplaneuserdir>/.backup</html>
-OptionPanel.single_instance=Abrir arquivo na execu\u00E7\u00E3o de uma inst\u00E2ncia
+OptionPanel.single_instance=Abrir arquivos na inst\u00E2ncia aberta
OptionPanel.single_instance_force=Evitar uma segunda inst\u00E2ncia, em qualquer caso
OptionPanel.single_instance_force.tooltip=Evitar uma segunda inst\u00E2ncia, mesmo se n\u00E3o h\u00E1 nenhum arquivo para carregar
OptionPanel.sk=Eslovaco
@@ -1255,7 +1281,7 @@ OptionPanel.sl=Sl
OptionPanel.slow_scroll_selected_node=Rolagem lenta para n\u00F3 selecionado
OptionPanel.spelling_opt_case_sensitive=Modo sensitivo
OptionPanel.spelling_opt_ignore_all_caps_words=Ignore todas as palavras de letras mai\u00FAsculas.
-OptionPanel.spelling_opt_ignore_capitalization=Ignorar letras capitalizadas no in\u00EDcio da palavra
+OptionPanel.spelling_opt_ignore_capitalization=\
OptionPanel.spelling_opt_ignore_words_with_numbers=Ignorar palavras com n\u00FAmeros
OptionPanel.spelling_opt_suggestions_limit_dialog=Contagem m\u00E1xima de sugest\u00F5es na caixa de di\u00E1logo
OptionPanel.spelling_opt_suggestions_limit_menu=Contagem m\u00E1xima de sugest\u00F5es no menu
@@ -1274,9 +1300,9 @@ OptionPanel.standardlinkcolor.tooltip=<html>A cor padr\u00E3o do link em nota\u0
OptionPanel.standardlinkestyle=Estilo padr\u00E3o do link
OptionPanel.standardlinkestyle.tooltip=<html>O estilo padr\u00E3o do link. No momento apenas 'bezier' \u00E9 suportado</html>
OptionPanel.standardselectednodecolor=Cor padr\u00E3o do n\u00F3 selecionado
-OptionPanel.standardselectednodecolor.tooltip=<html>A cor padr\u00E3o dos n\u00F3s selecionados. Em nota\u00E7\u00E3o HTML (#RRGGBB em valores hexadecimais) </html>
+OptionPanel.standardselectednodecolor.tooltip=<html>A cor padr\u00E3o dos n\u00F3s selecionados. Em nota\u00E7\u00E3o HTML (\#RRGGBB em valores hexadecimais) </html>
OptionPanel.standardselectednoderectanglecolor=Selecionar n\u00F3 na bolha cor
-OptionPanel.standardselectednoderectanglecolor.tooltip=<html>Cor da bolha marcada pelos n\u00F3s. Na nota\u00E7\u00E3o de html (#RRGGBB em valores HEX) </html>
+OptionPanel.standardselectednoderectanglecolor.tooltip=<html>Cor da bolha marcada pelos n\u00F3s. Na nota\u00E7\u00E3o de html (\#RRGGBB em valores HEX) </html>
OptionPanel.STAR=Estrela
OptionPanel.structured_html_import=Importar HTML como estrutura de n\u00F3
OptionPanel.structured_icon_toolbar=\u00CDcone estruturada na barra de ferramentas
@@ -1289,8 +1315,8 @@ OptionPanel.time_for_delayed_selection=Tempo para sele\u00E7\u00E3o retardada
OptionPanel.time_for_delayed_selection.tooltip=<html> Selecione o tempo de atraso dos n\u00F3s quando o mouse estive sobre os mesmos (em milisegundos). Altere este valor para 1, caso deseje sele\u00E7\u00E3o instantanea quando o mouse estiver sobre o n\u00F3.</html>
OptionPanel.toolTipManager.dismissDelay=Descartar o atraso em mil\u00E9simo
OptionPanel.toolTipManager.initialDelay=Atraso inicial em mil\u00E9simo
-OptionPanel.toolTipManager.max_tooltip_width=Largura da dica de ferramenta
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>A largura padr\u00E3o da dica de ferramenta em pixels.</html>
+OptionPanel.toolTipManager.max_tooltip_width=Largura M\u00E1xima da dica de ferramenta
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=Largura m\u00E1xima da dica de ferramento em pixels.
OptionPanel.toolTipManager.reshowDelay=Atraso de exibi\u00E7\u00E3o em mil\u00E9simo
OptionPanel.tr=Tr
OptionPanel.uk_UA=Ucraniano
@@ -1302,15 +1328,15 @@ OptionPanel.unfold_on_paste.tooltip=Expandir n\u00F3 ao colar ou arrastar e solt
OptionPanel.use_common_out_point_for_root_node=Bordas come\u00E7am de um ponto no n\u00F3 raiz
OptionPanel.use_common_out_point_for_root_node.tooltip=Bordas come\u00E7am de um ponto no n\u00F3 raiz
OptionPanel.use_tabbed_pane=Usar abas
-OptionPanel.use_tabbed_pane.tooltip=Se selecionado os mapas sao mostrados em abas (como no FireFox :-) ).
+OptionPanel.use_tabbed_pane.tooltip=Se selecionado os mapas sao mostrados em abas (como no FireFox \:-) ).
OptionPanel.user_defined_screen_resolution=Resolu\u00E7\u00E3o de tela definida pelo usu\u00E1rio (dpi)
-OptionPanel.validate_classpath_needs_readaccess=Scripts: Ao definir o caminho de classe voc\u00EA tem que permitir acesso de leitura em arquivos!
+OptionPanel.validate_classpath_needs_readaccess=Scripts\: Ao definir o caminho de classe voc\u00EA tem que permitir acesso de leitura em arquivos\!
OptionPanel.validate_invalid_date_format=Padr\u00E3o inv\u00E1lido no formato da data
OptionPanel.validate_invalid_datetime_format=Padr\u00E3o inv\u00E1lido no formato da data e hora
OptionPanel.validate_invalid_number_format=Padr\u00E3o inv\u00E1lido no formato n\u00FAmero
-OptionPanel.validate_write_without_read=Scripts: Considere adicionar leitura/arquivo para escrita/arquivo.
-OptionPanel.validation_error=<html><body>Erro(s) de valida\u00E7\u00E3o:<p><em>{0}</em><p>Por favor, altere as prefer\u00EAncias para corrigir o(s) erro(s).</body></html>
-OptionPanel.validation_warning=<html><body>Aviso(s) de valida\u00E7\u00E3o:<p><em>{0}</em></body></html>
+OptionPanel.validate_write_without_read=Scripts\: Considere adicionar leitura/arquivo para escrita/arquivo.
+OptionPanel.validation_error=<html><body>Erro(s) de valida\u00E7\u00E3o\:<p><em>{0}</em><p>Por favor, altere as prefer\u00EAncias para corrigir o(s) erro(s).</body></html>
+OptionPanel.validation_warning=<html><body>Aviso(s) de valida\u00E7\u00E3o\:<p><em>{0}</em></body></html>
OptionPanel.vi=Vietnamita
OptionPanel.wheel_velocity=Velocidade
OptionPanel.wheel_velocity.tooltip=Um valor mais alto resulta em um efeito mais r\u00E1pido ao se mover a roda do mouse sobre o mapa.
@@ -1334,7 +1360,7 @@ overwrite_keyset_question=Substituir o conjunto de chaves existente?
PageAction.text=Configurar impress\u00E3o...
password_is_not_ascii=Senha n\u00E3o \u00E9 ASCII
PasteAction.text=Colar
-PasteAttributes.text=Colar at&ributos
+PasteAttributes.text=Colar atributos
PatternNewNameProperty=Novo padr\u00E3o
PatternToString.backgroundColor=Cor de fundo
PatternToString.Child=Estilo de n\u00F3 filho
@@ -1357,15 +1383,15 @@ PeriodUnit.YEAR=anos
plugins/latex/LatexNodeHook.editorTitle=Editar f\u00F3rmulas LaTex
plugins/script_filter=Script filtro {0}
plugins/script_filter_error={0} teve que retornar um resultado booleano em {1} mas retornou {2}
-plugins/script_filter_execute_error=Erro de execu\u00E7\u00E3o {0}\npara n\u00F3 {1}:\n{2}
+plugins/script_filter_execute_error=Erro de execu\u00E7\u00E3o {0}\npara n\u00F3 {1}\:\n{2}
plugins/ScriptEditor.cancel=&Descartar altera\u00E7\u00F5es e sair
plugins/ScriptEditor.exit=&Salvar e sair
-plugins/ScriptEditor.FORBIDDEN_ACTION=Os scripts Groovy est\u00E3o restritos. O seguinte {0,choice,0#File|1#Network|2#Exec} opera\u00E7\u00E3o \u00E9 negada: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write} {2}. Voc\u00EA pode alterar isso nas configura\u00E7\u00F5es do programa.
+plugins/ScriptEditor.FORBIDDEN_ACTION=Os scripts Groovy est\u00E3o restritos. O seguinte {0,choice,0\#File|1\#Network|2\#Exec} opera\u00E7\u00E3o \u00E9 negada\: {1,choice,0\#Accept|1\#Connect|2\#Listen|3\#Multicast|4\#SetFactory|5\#Exec|6\#Link|7\#Delete|8\#Read|9\#Write} {2}. Voc\u00EA pode alterar isso nas configura\u00E7\u00F5es do programa.
plugins/ScriptEditor.menu_actions=&A\u00E7\u00F5es
plugins/ScriptEditor.new_script=Novo script
plugins/ScriptEditor.run=Executar
plugins/ScriptEditor.sign=Sinal do script...
-plugins/ScriptEditor/window.Result=Resultado:
+plugins/ScriptEditor/window.Result=Resultado\:
plugins/ScriptEditor/window.title=Editor de scripts
plugins/ScriptingEngine.illegalAccessToInternalAPI=Acesso ilegal a API interna (pacote {0}). - Por favor entre em contato com a equipe Freeplane se a API de script n\u00E3o for suficiente.
plugins/TimeList.xml_Created=Criado
@@ -1382,9 +1408,9 @@ plugins/TimeManagement.xml_closeButton=Fechar
plugins/TimeManagement.xml_Export=Exportar n\u00F3s selecionados
plugins/TimeManagement.xml_Find=Buscar
plugins/TimeManagement.xml_Goto=Ir para
-plugins/TimeManagement.xml_hour=Hora:
+plugins/TimeManagement.xml_hour=Hora\:
plugins/TimeManagement.xml_menu_actions=A\u00E7\u00F5es
-plugins/TimeManagement.xml_minute=Minuto:
+plugins/TimeManagement.xml_minute=Minuto\:
plugins/TimeManagement.xml_reminderButton=Lembre-me nesta data
plugins/TimeManagement.xml_reminderButton_tooltip=<html>Quando clicado, um temporizador \u00E9 programado para a data estabelecida. Ent\u00E3o um cursor piscante \u00E9 ativado para chamar a sua aten\u00E7\u00E3o.<br> Se voce fechar o mapa, os temporizadores ser\u00E3o reativados a pr\u00F3xima v\u00EAz que o mapa for aberto.</html>
plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>Currently, there may only be one reminder per node. <br>The current remnider is scheduled at {0,date} {0,time}, your choice was {1,date} {1,time}. <br><br>Do you want to change the node's reminder time (YES) <br>or do you want to keep the old one (NO)?</html>
@@ -1402,10 +1428,11 @@ plugins/TimeManagement.xml_WindowTitle=Gerenciamento de tempo
plugins/TimeManagement.xml_WindowTitle_All_Nodes=Busca & substitui
preferences=Prefer\u00EAncias
print_preview_title=Visualizar impress\u00E3o
-PrintAction.text=Imprimir...
+PrintAction.text=Imprimir mapa...
PrintDirectAction.text=Imprimir
printing_settings=Escala de impress\u00E3o
PrintPreviewAction.text=Imprimir preview...
+progress=\u00CDcone de Andamento (%)
PropertyAction.dialog=Prefer\u00EAncias
PropertyAction.text=Prefer\u00EAncias ...
QuickFilterAction.text=Filtro r\u00E1pido
@@ -1413,7 +1440,7 @@ QuickFindAction.BACK.text=Localizar anterior
QuickFindAction.FORWARD.text=Localizar pr\u00F3ximo
QuickFindAllAction.text=Selecionar todos os n\u00F3s correspondentes
QuickHighlightAction.text=Destacar todos os n\u00F3s correspondentes
-QuitAction.text=Sair
+QuitAction.text=Sair do Freeplane
read_only=Apenas para leitura
ReadScriptError.text=Erro ao ler o script
really_convert_to_current_version=<html>Este mapa foi criado com uma versao anterior do Freeplane. <br>Voc\u00EA deseja converter (recomendado)? <br>(De outra forma ele sera lido como ele esta sem garantia.) </html>
@@ -1424,6 +1451,7 @@ really_remove_notes=Realmente remover a(s) nota(s)?
ReapplyFilterAction.text=Reaplicar a a\u00E7\u00E3o do filtro
red=Vermelho
RedefineStyleAction.text=Redefinir estilo
+RedefineStyleAction.tooltip=Define o estilo e as configura\u00E7\u00F5es do n\u00F3 selecionado como o padr\u00E3o aplic\u00E1vel a todos os n\u00F3s daquele n\u00EDvel
RedoAction.text=Refazer
RedoFilterAction.text=Refazer
regular_expressions=Express\u00F5es regulares
@@ -1431,6 +1459,7 @@ ReminderHookAction.text=Remove alarme
ReminderHookAction.tooltip=Remove o alarme de um n\u00F3.
remove_file_from_list_on_error=Arquivo {0} n\u00E3o abriu. Remover a \u00FAltima lista de arquivo aberto?
remove_shortcut_question=Substituir o atalho?
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=Remover o Engessamento dos N\u00F3s
RemoveAllIconsAction.text=Remover todos os \u00EDcones
RemoveConnectorAction.text=Remover conector
RemoveEncryption.text=Remover senha
@@ -1448,26 +1477,28 @@ replace_shortcut_title=Substituir atalho?
ReportBugAction.text=Reportar um erro
RequestFeatureAction.text=Solicitar um recurso
reset_to_default=Usar padr\u00E3o
-ResetNodeLocationAction.text=Redefinir posi\u00E7\u00E3o
+ResetNodeLocationAction.text=Redefinir posi\u00E7\u00E3o do N\u00F3
ResetStyleAction.text=Redefinir estilo de n\u00F3
-RevertAction.text=&Restaurar do local hist\u00F3rico
-RevisionPluginAction.text=Mudan\u00E7a e &revis\u00E3o da cor de fundo
+RevertAction.text=Restaurar do local hist\u00F3rico
+RevisionPluginAction.text=Mudan\u00E7a e revis\u00E3o da cor de fundo
+save=Salvar
save_failed=Tentativa de salvar o mapa {0} falhou.
save_unsaved=Salvar o seguinte mapa da mente?
save_unsaved_styles=Salvar estilo?
SaveAcceleratorPresetsAction.text=Salvar conjunto de teclas de atalho ...
-SaveAction.text=Salvar
-SaveAll.text=Sa&lvar todos os mapas abertos
+SaveAction.text=Salvar Mapa
+SaveAll.text=Salvar todos os mapas abertos
SaveAll.tooltip=Salvar todos os mapas abertos
SaveAsAction.text=Salvar como...
saved=Salvo
saving_canceled=Salvamento cancelado
scanners_not_loaded=Os scanners n\u00E3o p\u00F4de ser carregado, arquivo corrompido
-scheme_evaluate=Avaliar!
+scheme_evaluate=Avaliar\!
script_execution_disabled=Execu\u00E7\u00E3o do script desativado, veja em Ferramentas/Prefer\u00EAncias/Plugins
ScriptEditor.text=Editor de scripts...
ScriptEditor.tooltip=Permite escrever scripts maiores dentro do Freeplane.
ScriptEditorPanel.changed_cancel=Os scripts foram alterados. Voc\u00EA realmente quer abandonar as altera\u00E7\u00F5es ?
+scripting=Scripts
scripting_api_generator_legend=Legenda
scripting_api_generator_proxy=Proxy
scripting_api_generator_title=Script de API
@@ -1487,28 +1518,34 @@ selection_method_delayed=Sele\u00E7\u00E3o autom\u00E1tica com atraso
selection_method_direct=Apontar seleciona
SelectNoteAction.text=Chave de Edi\u00E7\u00E3o de Anota\u00E7\u00F5es
SelectNoteAction.tooltip=Switch to resp. from note window
-set_accelerator_on_next_click_action=Para criar um novo atalho de teclado: pressione 'CTRL' e clique no comando desejado no menu.
+set_accelerator_on_next_click_action=Para criar um novo atalho de teclado\: pressione 'CTRL' e clique no comando desejado no menu.
SetAccelerator.dialogTitle=Atribui\u00E7\u00E3o de teclas de atalho
SetAccelerator.keystrokeDetected=Pressionamento de tecla '{0}' n\u00E3o \u00E9 atribu\u00EDdo a qualquer item de menu.
SetAcceleratorOnNextClickAction.text=Atribuir teclas de atalho...
-SetImageByFileChooserAction.text=Indicar imagem (Seletor de arquivos ou refer\u00EAncia)...
+SetAlwaysUnfoldedNodeFlagsAction.text=Engessar / Travar a Posi\u00E7\u00E3o dos N\u00F3s
+SetBooleanPropertyAction.show_styles_in_tooltip.tooltip=N\u00E3o \u00E9 recomend\u00E1vel que esta op\u00E7\u00E3o seja marcada.
+SetImageByFileChooserAction.text=Criar um Link com um Arquivo em Meu Computador
+SetImageByFileChooserAction.tooltip=Este recurso permite que voc\u00EA crie um link com qualquer arquivo em seu computador e ao clicar no link dentro do n\u00F3 o arquivo ir\u00E1 abrir automaticamente
SetLinkAnchorAction.text=Definir link \u00E2ncora
SetLinkAnchorAction.tooltip=<html>Definir o n\u00F3 selecionado como \u00E2ncora para futura<br/>cria\u00E7\u00E3o de links locais ou globais.
-SetLinkAnchorAction.tooltip_anchored=<html>definir o n\u00F3 selecionado como \u00E2ncora para futura<br/>cria\u00E7\u00E3o de links locais ou globais. \u00C2ncora atual:<br/>{0}
-SetLinkByFileChooserAction.text=Indicar refer\u00EAncia (Seletor de arquivos)...
-SetLinkByTextFieldAction.text=Indicar refer\u00EAncia (Campo de texto)...
+SetLinkAnchorAction.tooltip_anchored=<html>definir o n\u00F3 selecionado como \u00E2ncora para futura<br/>cria\u00E7\u00E3o de links locais ou globais. \u00C2ncora atual\:<br/>{0}
+SetLinkByFileChooserAction.text=Criar um Link para abrir um arquivo dentro do meu computador - (Escolher arquivo)
+SetLinkByFileChooserAction.tooltip=Aqui voc\u00EA poder\u00E1 selecionar qualquer arquivo de dentro do seu computador e quando voc\u00EA clicar no n\u00F3 com este link para este aquivo ele ser\u00E1 aberto automaticamente
+SetLinkByTextFieldAction.text=Adicionar Link Manualmente
+SetLinkByTextFieldAction.tooltip=Link da Internet ou Link de um arquivo dentro do meu computador
SetNodeLink.text=Conjunto de n\u00F3 link...
SetNoteWindowPosition.bottom.text=Bot\u00E3o
SetNoteWindowPosition.left.text=Esquerda
SetNoteWindowPosition.right.text=Direita
SetNoteWindowPosition.top.text=Superior
-SetShortenerStateAction.text=Minimizar o n\u00F3
+SetShortenerStateAction.text=Minimizar o n\u00F3 (Texto, Detalhes e Etc)
+SetShortenerStateAction.tooltip=Esta fun\u00E7\u00E3o faz com que o os detalhes fiquem ocultos e s\u00F3 apare\u00E7am se voc\u00EA posicioar o mouse sobre o n\u00F3, uma \u00F3tima fun\u00E7\u00E3o para deixar o seu mapa mais leve.
sf_login_required=Source Forge - login necess\u00E1rio. Continuar?
ShowAllAttributesAction.text=Mostrar todos os atributos
ShowAncestorsAction.text=Mostra ancestrais
ShowAttributeDialogAction.text=Gerenciador de atributos...
ShowDescendantsAction.text=Mostra descendentes
-ShowFilterToolbarAction.text=Filtro barra de ferramentas
+ShowFilterToolbarAction.text=Barra de Filtro (Est\u00E1 Relacionada a Fun\u00E7\u00E3o de Localizar)
ShowFormatPanel.text=Painel de propriedades
ShowFormatPanel.tooltip=Apresentar uma caixa de di\u00E1logo na qual atributos de n\u00F3 e borda podem ser alterados ao mesmo tempo.
ShowHideNoteAction.text=Mostra/esconde janela de notas
@@ -1520,7 +1557,7 @@ ShowSelectionAsRectangleAction.text=Sele\u00E7\u00E3o retangular
simplyhtml.aboutFrameTitle=Sobre esta aplica\u00E7\u00E3o
simplyhtml.aboutLabel=Sobre SimplyHTML...
simplyhtml.alignCenter=centro
-simplyhtml.alignLabel=Alinhamentoo:
+simplyhtml.alignLabel=Alinhamentoo\:
simplyhtml.alignLeft=esquerda
simplyhtml.alignRight=direita
simplyhtml.allCellsRangeLabel=todas as c\u00E9lulas
@@ -1528,12 +1565,12 @@ simplyhtml.allOccurrencesReplaced=Todas as ocorr\u00EAncias foram substitu\u00ED
simplyhtml.appendTableColLabel=Adicionar coluna
simplyhtml.appendTableRowLabel=Adicionar linha
simplyhtml.applyCellAttrLabel=Aplicar em
-simplyhtml.backgroundLabel=Plano de fundo:
+simplyhtml.backgroundLabel=Plano de fundo\:
simplyhtml.boldItalicName=Negrito it\u00E1lico
simplyhtml.boldName=Negrito
-simplyhtml.borderColorLabel=Cor:
+simplyhtml.borderColorLabel=Cor\:
simplyhtml.borderWidthLabel=Largura
-simplyhtml.bottomLabel=abaixo:
+simplyhtml.bottomLabel=abaixo\:
simplyhtml.cancelBtnName=Cancelar
simplyhtml.cellBorderTabLabel=Bordas
simplyhtml.cellGenTabLabel=Geral
@@ -1561,7 +1598,7 @@ simplyhtml.cutTip=Cortar
simplyhtml.defaultDocName=Sem nome
simplyhtml.deleteTableColLabel=Apagar coluna
simplyhtml.deleteTableRowLabel=Apagar linha
-simplyhtml.docTitleQuery=Altera t\u00EDtulo para:
+simplyhtml.docTitleQuery=Altera t\u00EDtulo para\:
simplyhtml.docTitleTitle=Editar t\u00EDtulo do documento
simplyhtml.editLabel=Editar
simplyhtml.effectLabel=Efeito
@@ -1582,7 +1619,7 @@ simplyhtml.fontTabLabel=Fonte
simplyhtml.fontTip=Formatar fonte...
simplyhtml.fontUnderlineLabel=Sublinhado
simplyhtml.fontUnderlineTip=Liga/desliga sublinhado
-simplyhtml.foregroundLabel=Plano de frente:
+simplyhtml.foregroundLabel=Plano de frente\:
simplyhtml.formatLabel=Formatar
simplyhtml.formatListLabel=Lista...
simplyhtml.formatListTip=Muda formata\u00E7\u00E3o da lista
@@ -1600,16 +1637,16 @@ simplyhtml.insertTableRowLabel=Inserir linha
simplyhtml.insertTableTitle=Inserir tabela
simplyhtml.italicName=It\u00E1lico
simplyhtml.layoutTabTitle=Ver layout
-simplyhtml.leftLabel=esquerda:
+simplyhtml.leftLabel=esquerda\:
simplyhtml.listDialogTitle=Formatar lista
-simplyhtml.listIndentTitle=Indenta\u00E7\u00E3o:
+simplyhtml.listIndentTitle=Indenta\u00E7\u00E3o\:
simplyhtml.listPosInside=dentro
-simplyhtml.listPositionLabel=Posi\u00E7\u00E3o:
+simplyhtml.listPositionLabel=Posi\u00E7\u00E3o\:
simplyhtml.listPosOutside=fora
simplyhtml.listTypeCircle=marcador redondo
simplyhtml.listTypeDecimal=1.,2.,3.,4.
simplyhtml.listTypeDisc=S\u00EDmbolo de arquivo como marcador
-simplyhtml.listTypeLabel=Tipo:
+simplyhtml.listTypeLabel=Tipo\:
simplyhtml.listTypeLowerAlpha=a.,b.,c.,d.
simplyhtml.listTypeLowerRoman=i.,ii.,iii.,iv.
simplyhtml.listTypeNone=nenhum
@@ -1651,9 +1688,9 @@ simplyhtml.replaceAll=Tudo
simplyhtml.replaceDone=Feito
simplyhtml.replaceNo=N\u00E3o
simplyhtml.replaceThisQuery=substitui esta ocorr\u00EAncia de
-simplyhtml.replaceWith=Substituir com:
+simplyhtml.replaceWith=Substituir com\:
simplyhtml.replaceYes=Sim
-simplyhtml.rightLabel=direita:
+simplyhtml.rightLabel=direita\:
simplyhtml.searchDown=Procurar abaixo
simplyhtml.searchDown.tooltip=Localizar de cima para baixo.
simplyhtml.searchFromStart=A partir do in\u00EDcio
@@ -1667,13 +1704,13 @@ simplyhtml.strikeLabel=Riscado
simplyhtml.styleLabel=Estilo
simplyhtml.styleNameInputText=Nome do novo estilo?
simplyhtml.styleNameInputTitle=Salvar estilo
-simplyhtml.tableBgColLabel=Cor de fundo:
+simplyhtml.tableBgColLabel=Cor de fundo\:
simplyhtml.tableDialogTitle=Formatar tabela
simplyhtml.tableLabel=Tabela
simplyhtml.tablePanelTitle=Formato da tabela
-simplyhtml.tableWidthLabel=Largura:
-simplyhtml.textIndentLabel=Indenta\u00E7\u00E3o:
-simplyhtml.textToFind=Buscar texto:
+simplyhtml.tableWidthLabel=Largura\:
+simplyhtml.textIndentLabel=Indenta\u00E7\u00E3o\:
+simplyhtml.textToFind=Buscar texto\:
simplyhtml.thisCellRangeLabel=Esta c\u00E9lula
simplyhtml.thisColRangeLabel=esta coluna
simplyhtml.thisRowRangeLabel=esta linha
@@ -1681,25 +1718,25 @@ simplyhtml.toggleBulletsLabel=Liga/desliga lista com marcadores
simplyhtml.toggleBulletsTip=Liga/desliga lista com marcadores
simplyhtml.toggleNumbersLabel=Liga/desliga lista numerada
simplyhtml.toggleNumbersTip=Liga/desliga lista numerada
-simplyhtml.topLabel=acima:
+simplyhtml.topLabel=acima\:
simplyhtml.uLineLabel=Sublinhado
simplyhtml.unableToOpenFileError=Arquivo n\u00E3o p\u00F4de ser aberto
-simplyhtml.unableToRedoError=N\u00E3o \u00E9 poss\u00EDvel refazer:
-simplyhtml.unableToUndoError=N\u00E3o \u00E9 poss\u00EDvel desfazer:
+simplyhtml.unableToRedoError=N\u00E3o \u00E9 poss\u00EDvel refazer\:
+simplyhtml.unableToUndoError=N\u00E3o \u00E9 poss\u00EDvel desfazer\:
simplyhtml.undoLabel=Desfazer
simplyhtml.undoTip=Desfaz a \u00FAltima a\u00E7\u00E3o
simplyhtml.valignBaseline=base de refer\u00EAncia
simplyhtml.valignBottom=Base
-simplyhtml.valignLabel=Alinhamento vertical:
+simplyhtml.valignLabel=Alinhamento vertical\:
simplyhtml.valignMiddle=Meio
simplyhtml.valignTop=Topo
simplyhtml.wholeWordsOnly=Apenas palavras inteiras
simplyhtml.wholeWordsOnly.tooltip=Restringir correspond\u00EAncia de palavras inteiras.
-SortNodes.text=Ordenar filho&s
+SortNodes.text=Ordenar filhos
SortNodes.tooltip=Ordena todos os filhos de um n\u00F3 alfabeticamente.
-split=Dividir
+split=&Dividir
SplitConditionAction.text=Dividir
-SplitNode.text=Divide n\u00F3
+SplitNode.text=Dividir n\u00F3
SplitNode.tooltip=<html>N\u00F3 est\u00E1 dividido</html>
STANDARD_FORMAT=Padr\u00E3o
stop_processing=Parar
@@ -1737,23 +1774,29 @@ styles_menu=Estilos dispon\u00EDveis
submenu_keystroke_in_use_error=Pressionamento de tecla {0} n\u00E3o pode ser usado para o submenu {1}. Pressionamento de tecla removido.
summary_nodes=Resumo de n\u00F3s
summary_not_possible=N\u00E3o \u00E9 poss\u00EDvel criar resumo de n\u00F3 para sele\u00E7\u00E3o atual
-SummaryNodeAction.text=Resumo de n\u00F3 (conjunto/redefinir)
svg=SVG
template_dir=Modelos padr\u00F5es
+TextAlignAction.CENTER.text=Texto Centralizado
+TextAlignAction.LEFT.text=Alinhar Texto \u00E0 Esquerda
+TextAlignAction.RIGHT.text=Alinhar Texto \u00E0 Direita
TimeListAction.text=Gerenciar tarefas...
TimeListAction.tooltip=Mostra todos os hor\u00E1rios programados e os n\u00F3s correspondentes.
TimeManagementAction.text=Gerenciar o tempo...
TimeManagementAction.tooltip=<html>Mostra o m\u00F3dulo calend\u00E1rio feito por Kai Toedter.</html>
ToggleChildrenFoldedAction.text=Expandir ou recolher os filhos
ToggleDetailsAction.text=Ocultar detalhes
-ToggleFBarAction.text=Barra de fun\u00E7\u00F5es
+ToggleFBarAction.text=Barra de fun\u00E7\u00F5es (Pouca Utilidade para Usu\u00E1rios)
+ToggleFBarAction.tooltip=Recomenda-se manter esta Barra Oculta.
ToggleFoldedAction.text=Recolher ou expandir
ToggleFullScreenAction.text=Modo tela cheia
-ToggleLeftToolbarAction.text=Ativar barra da esquerda
-ToggleMenubarAction.text=Ativar barra de menis
+ToggleLeftToolbarAction.text=Barra de \u00CDcones
+ToggleMenubarAction.text=Barra de Menu
ToggleScrollbarsAction.text=Barra de rolagem
-ToggleStatusAction.text=Exibir linha de status
-ToggleToolbarAction.text=Ativar barra de ferramentas
+ToggleScrollbarsAction.tooltip=Recomenda-se manter esta Barra Oculta.
+ToggleStatusAction.text=Barra de Status
+ToggleStatusAction.tooltip=Recomenda-se manter esta Barra Oculta.
+ToggleToolbarAction.text=Barra de Ferramentas
+toolbars=Barras de ferramentas
undefined_error=Um erro inesperado ocorreu. Por favor tente reportar um erro.
underline=Sublinhado
UnderlineAction.text=Sublinhado
@@ -1777,25 +1820,26 @@ updater.version.installed=Vers\u00E3o instalada
updater.version.latest=\u00DAltima vers\u00E3o
updater.version.noUpdateUrl=Nenhuma URL de atualiza\u00E7\u00E3o ou site para este complemento.
updater.version.unknown=desconhecido
-updater.version.unreachable=Fonte inacess\u00EDvel:
+updater.version.unreachable=Fonte inacess\u00EDvel\:
updater.viewChangelog=Visualizar altera\u00E7\u00F5es
-url_error=Essa URL \u00E9 malformada!
-url_load_error=N\u00E3o posso ler o mapa da URL:
+url_error=Essa URL \u00E9 malformada\!
+url_load_error=N\u00E3o posso ler o mapa da URL\:
url_open_error=N\u00E3o foi poss\u00EDvel abrir o URL {0}.
used_in_menu=Este atalho n\u00E3o pode ser definido, \u00E9 usado como um menu de atalho.
UsePlainTextAction.text=Usar texto sem formata\u00E7\u00E3o
-user_config_folder=Pasta de configura\u00E7\u00E3o do usu\u00E1rio: {0}
+user_config_folder=Pasta de configura\u00E7\u00E3o do usu\u00E1rio\: {0}
user_defined_filters=Filtros definidos pelo usu\u00E1rio
user_defined_scale=Escala definida pelo &usu\u00E1rio
user_defined_zoom=Definido pelo usu\u00E1rio
user_defined_zoom_status_bar=Mudando a amplia\u00E7\u00E3o para {0}%.
user_icon=\u00CDcone de usu\u00E1rio "{0}"
user_template_dir=Modelos de usu\u00E1rio
-user_zoom=Fator de amplia\u00E7\u00E3o da impress\u00E3o (0.0 - 2.0):
+user_zoom=Fator de amplia\u00E7\u00E3o da impress\u00E3o (0.0 - 2.0)\:
value_format=Formato de valor
version_up_to_date=Voc\u00EA j\u00E1 est\u00E1 usando a \u00FAltima vers\u00E3o
-ViewerControllerAction.text=Objeto externo...
+view=Visualizar
ViewLayoutTypeAction.OUTLINE.text=Visualizar estrutura de t\u00F3picos
+web_resources=Contatos da Freeplane na Internet
WebDocuAction.text=Documenta\u00E7\u00E3o na internet
width=Largura
wrong_regexp=Errado a express\u00E3o regular "{0}", erro {1}
@@ -1809,5 +1853,6 @@ xslt_export.ms_word=Word 2003 XML
xslt_export.text=Texto sem formata\u00E7\u00E3o
xslt_export_not_possible=N\u00E3o \u00E9 poss\u00EDvel exportar FreePlane XLST
yes=Sim
+zoom=Zoom
ZoomInAction.text=Aumentar
ZoomOutAction.text=Diminuir
diff --git a/freeplane/resources/translations/Resources_pt_PT.properties b/freeplane/resources/translations/Resources_pt_PT.properties
index 78b0e50..ebcfaf0 100644
--- a/freeplane/resources/translations/Resources_pt_PT.properties
+++ b/freeplane/resources/translations/Resources_pt_PT.properties
@@ -35,6 +35,7 @@ actual_node_styles=Estilos condicionais do n\u00F3 aplicados ao n\u00F3
add=&Adicionar
AddConnectorAction.text=Adicionar liga\u00E7\u00E3o
AddElementaryConditionAction.text=Adicionar
+AddExecutionLinkAction.text=Adicionar hiperliga\u00E7\u00E3o para executar um comando OS...
AddLocalLinkAction.text=Adicionar hiperliga\u00E7\u00E3o local
AddMenuItemLinkAction.text=Adicionar hiperliga\u00E7\u00E3o a item de menu...
AddOnDetailsPanel.authored.by=Por {0}
@@ -82,8 +83,8 @@ antialias_all=Uniformizar tudo
antialias_edges=Uniformizar linhas
antialias_none=N\u00E3o uniformizar
apply=&Aplicar
-ApplyAction.text=&Aplicar
-ApplyFormatPlugin.text=A<erar formato ...
+ApplyAction.text=Aplicar
+ApplyFormatPlugin.text=Alterar formato ...
ApplyFormatPlugin.tooltip=Mostra uma janela na qual os atributos do n\u00F3 e linhas podem ser modificados de uma vez s\u00F3.
ApplyNoFilteringAction.text=Sem filtragem
ApplySelectedViewConditionAction.text=Filtrar os n\u00F3s selecionados
@@ -96,6 +97,7 @@ attribute_delete_value=Apagar este valor
attribute_font_size_tooltip=Tamanho da letra do atributo
attribute_list_box_label_text=Valores existentes
attribute_name=Nome do atributo
+attribute_name_or_value=Nome ou valor de atributo
attribute_replace=Substituir por
attribute_top=Todos os atributos conhecidos para os mapas carregados
attribute_value=Valor do atributo
@@ -137,14 +139,21 @@ attributes_visible_tooltip=Selecionados vis\u00EDveis
automatic_layout=Desenho autom\u00E1tico
automatic_layout_disabled=desativado
automatically_save_message=O mapa foi gravado automaticamente (com o nome {0})...
+AutomaticEdgeColor.FOR_BRANCHES=para ramos
+AutomaticEdgeColor.FOR_COLUMN=para coluna
+AutomaticEdgeColor.FOR_COLUMNS=para colunas
+AutomaticEdgeColor.FOR_LEVELS=para n\u00EDveis
+AutomaticEdgeColor.ON_BRANCH_CREATION=ao criar ramo
AutomaticEdgeColorHookAction.text=Cor da linha autom\u00E1tica
AutomaticLayout.ALL=para todos os n\u00F3s
+AutomaticLayout.COLUMNS=para colunas
AutomaticLayout.HEADINGS=para n\u00F3s finais
AutomaticLayout.level=N\u00EDvel {0}
AutomaticLayout.level.root=Ra\u00EDz
-AutomaticLayoutAction.text=&Aplicar estilos por n\u00EDvel
+AutomaticLayoutAction.text=Aplicar estilos por n\u00EDvel
AutomaticLayoutAction.tooltip=<html>Fixa o desenho do mapa. <br>O primeiro n\u00EDvel \u00E9 preto, o segundo azul, etc.</html>
AutomaticLayoutControllerAction.ALL.text=para todos os n\u00F3s
+AutomaticLayoutControllerAction.COLUMNS.text=para colunas
AutomaticLayoutControllerAction.HEADINGS.text=para n\u00F3s finais
AutomaticLayoutControllerAction.null.text=desativado
BackAction.text=Recuar
@@ -161,17 +170,20 @@ branch=Ramo
browse=Navegar...
calendar_attributes_panel=Calend\u00E1rio e atributos
calendar_panel=Calend\u00E1rio
+can_not_clone_encrypted_node=Imposs\u00EDvel clonar n\u00F3s encriptados
can_not_connect_to_info_server=Imposs\u00EDvel estabelecer liga\u00E7\u00E3o ao servidor
can_not_delete_predefined_style=Imposs\u00EDvel eliminar estilo predefinido
can_not_delete_root_style=Imposs\u00EDvel eliminar estilo ra\u00EDz
can_not_delete_style_group=Imposs\u00EDvel eliminar grupo de estilos
+can_not_encrypt_cloned_node=Imposs\u00EDvel encriptar n\u00F3s clonados
can_not_save_key_set=Imposs\u00EDvel gravar conjunto de atalhos
cancel=&Cancelar
-CancelAction.text=&Cancelar
+CancelAction.text=Cancelar
cannot_add_parent_diff_parents=Todos os n\u00F3s devem ter o mesmo n\u00F3-m\u00E3e para usar esta fun\u00E7\u00E3o.
cannot_add_parent_to_root=O n\u00F3-ra\u00EDz n\u00E3o pode ser adicionado a um novo n\u00F3-m\u00E3e.
cannot_delete_root=O n\u00F3 ra\u00EDz n\u00E3o pode ser eliminado ou cortado.
cannot_join_nodes_with_children=Imposs\u00EDvel juntar n\u00F3s com filhos
+cannot_move_into_child_node=Imposs\u00EDvel mover para n\u00F3 filho
cannot_move_to_child=Imposs\u00EDvel mover um n\u00F3 para um dos seus filhos.
CenterAction.text=Centrar
CenterSelectedNodeAction.text=Centrar n\u00F3 selecionado
@@ -196,8 +208,10 @@ choose_node_background_color=Selecione a cor de fundo do n\u00F3:
choose_node_color=Escolha a cor do n\u00F3:
ClearLinkAnchorAction.text=Eliminar \u00E2ncora da liga\u00E7\u00E3o
ClearLinkAnchorAction.tooltip=<html>eliminar \u00E2ncora do n\u00F3 previamente definida</html>
+CloneAction.text=Colar clone
close_btn=Fe&char
-CloseAction.text=Fe&char mapa atual
+CloseAction.text=Fechar mapa atual
+cloud_shapes=Formas da nuvem
CloudAction.text=Adicionar/remover nuvem
CloudColorAction.text=Cor da nuvem...
CloudShapeAction.ARC.text=Arco
@@ -214,34 +228,37 @@ connector_label=R\u00F3tulo do conector
connector_lines=Linhas do conector
connector_shapes=Formas do conector
ConnectorColorAction.text=Cor do conector...
-CopyAction.text=&Copiar
+ConvertCloneToIndependentNodeAction.text=Desfazer clonagem
+CopyAction.text=Copiar
CopyAction.tooltip=Copiar ramo selecionado
-CopyAttributes.text=Copiar &atributos
+CopyAttributes.text=Copiar atributos
CopyIDAction.text=Copiar ID do n\u00F3
CopyMapStylesAction.text=Copiar estilo do mapa de...
CopyNodeURIAction.text=Copiar URL do n\u00F3
-copyright=Copyright \u00A9 2000-2014 Equipa do Freeplane e outros
-CopySingleAction.text=Copiar n\u00F3 (&simples)
+copyright=Copyright \u00A9 2000-2016 Equipa do Freeplane e outros
+CopySingleAction.text=Copiar n\u00F3 (simples)
CopySingleAction.tooltip=Copiar s\u00F3 o n\u00F3 selecionado
CopyStyleExtensionsAction.text=Copiar extens\u00F5es do n\u00F3 de estilo
corrupt_map=O conte\u00FAdo do mapa est\u00E1 corrompido
CreateConjunctConditionAction.text=E
CreateDisjunctConditionAction.text=Ou
CreateNotSatisfiedConditionAction.text=N\u00E3o
-CreationModificationPluginAction.text=Mostrar informa\u00E7\u00F5es das &modifica\u00E7\u00F5es
+CreationModificationPluginAction.text=Mostrar horas das modifica\u00E7\u00F5es
CreationModificationPluginAction.tooltip=<html>Esta fun\u00E7\u00E3o mant\u00E9m um registo da cria\u00E7\u00E3o e modifica\u00E7\u00E3o dos n\u00F3s.</html>
current_dir=Mapas
-CutAction.text=Cor&tar
+CutAction.text=Cortar
decrease_branch_font_size=Reduzir letra
DecreaseNodeFontAction.text=Reduzir letra
default=Predefini\u00E7\u00E3o
+defaultAuxiliaryWordList=um, o, de
DefaultColorAction.text=Cor predefinida
+defaultstyle.attributes=Atributos
defaultstyle.details=Detalhes
defaultstyle.floating=N\u00F3 flutuante
defaultstyle.note=Nota
delete=&Eliminar
delete_child=Eliminar n\u00F3
-DeleteAction.text=Rem&over n\u00F3
+DeleteAction.text=Remover n\u00F3
DeleteConditionAction.text=Eliminar
DeleteDetailsAction.text=Eliminar detalhes do n\u00F3
DeleteLevelStyleAction.text=Eliminar estilo do n\u00EDvel
@@ -263,7 +280,9 @@ edge=Linha
edge_is_formatted_by_style=O formato da linha \u00E9 controlado pelo estilo. Edite os estilos se necess\u00E1rio.
edge_style=Estilo da linha
edge_width=Largura da linha
+edge_widths=Larguras da margem
EdgeColorAction.text=Cor da linha...
+EdgeProperties=Propriedades da margem
EdgeStyleAction.bezier.text=Curva suave (B\u00E9zier)
EdgeStyleAction.bezier.tooltip=<html>Mostrar a linha como curva suave</html>
EdgeStyleAction.hide_edge.text=Ocultar linha
@@ -304,9 +323,11 @@ EditLongAction.text=Editar n\u00FAcleo do n\u00F3 em janela
EditNoteInDialogAction.text=Editar n\u00F3 em janela
EditScript=Editar script...
EditStylesAction.text=Editar estilos
-EncryptedMap.text=Novo mapa prote&gido (encriptado)...
+EncryptedMap.text=Novo mapa protegido (encriptado)...
EncryptedMap.tooltip=Novo mapa encriptado
+encryption=Encripta\u00E7\u00E3o
enter_base_url=Vou colar liga\u00E7\u00F5es relativas. Por favor indique a URL base.
+enter_command=Insira o comando
enter_condition_name=Introduza o nome da nova condi\u00E7\u00E3o
enter_confirms=&Enter confirma
enter_keyset_name=Introduza o nome do conjunto de atalhos
@@ -320,6 +341,8 @@ error_applying_template=Erro ao aplicar o modelo XSL.
error_creating_directory=Imposs\u00EDvel criar a pasta para exporta\u00E7\u00E3o.
error_in_template=Erros no modelo predefinido {0}. Tente eliminar este ficheiro.
errornumber={0} erros
+ExecuteScript.available_modes_tooltip={0} est\u00E1 dispon\u00EDvel para
+ExecuteScript.script=Script
ExecuteScriptError.text=Erro ao executar o script:\n{0}
ExecuteScriptForAllNodes.text=Executar todos os scripts
ExecuteScriptForSelectionAction.text=Executar os scripts dos n\u00F3s selecionados
@@ -333,7 +356,7 @@ export_failed=Falha na exporta\u00E7\u00E3o
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
export_using_xslt=Exportar para Freeplane
-ExportAction.text=&Exportar mapa...
+ExportAction.text=Exportar mapa...
ExportBranchAction.text=Mover ramo para novo mapa...
ExportBranchToHTMLAction.text=Ramo como HTML
exported_file={0} ficheiros
@@ -354,6 +377,7 @@ ExternalImageChangeAction.text=Alterar imagem...
ExternalImageRemoveAction.text=Eliminar imagem
ExtractLinkFromTextAction.text=Converter texto em hiperliga\u00E7\u00E3o
ExtractLinkFromTextAction.tooltip=Criar uma hiperliga\u00E7\u00E3o a partir do texto mostrado no n\u00F3
+extras=&Ferramentas
f_button_unassigned=<nenhuma a\u00E7\u00E3o>
FaqOpenURLAction.text=FAQ
file=&Ficheiro
@@ -373,7 +397,7 @@ FileProperties_NodeSelectionCount=N\u00FAmero de n\u00F3s selecionados:
FileProperties_TotalFilteredCount=N\u00FAmero de n\u00F3s que satisfazem o filtro:
FileProperties_TotalLeafCount=N\u00FAmero total de n\u00F3s finais:
FileProperties_TotalNodeCount=N\u00FAmero total de n\u00F3s:
-FilePropertiesAction.text=Estat\u00EDst&icas do mapa...
+FilePropertiesAction.text=Estat\u00EDsticas do mapa...
FileRevisionsDialog.cancel=&Cancelar
FileRevisionsDialog.file_last_modified=Selo de data
FileRevisionsDialog.file_name=Ficheiro
@@ -384,10 +408,12 @@ FileRevisionsDialog.question=Encontradas revis\u00F5es de {0}
FileRevisionsDialog.restore=Resta&urar
FileRevisionsDialog.restore.tooltip=Substituir {0} por {1}
FileRevisionsDialog.title=Revis\u00F5es do ficheiro
-filter=Filtro
+filter=F&iltrar
filter_add=&Adicionar
filter_and=E
filter_any_text=N\u00FAcleo, detalhes ou nota
+filter_clone_snapshot=Clones gravados da sele\u00E7\u00E3o
+filter_clones=Clones da sele\u00E7\u00E3o
filter_conditions=Filtros
filter_contains=Cont\u00E9m
filter_created_after=Criado depois de
@@ -434,11 +460,16 @@ filter_selected_node_view=N\u00F3s atualmente selecionados
filter_selected_node_view_snapshot=Sele\u00E7\u00E3o gravada
filter_style=Estilo
filter_time=Filtro de data
-FilterComposerDialog.save=&Gravar
+FilterCondition=Condi\u00E7\u00F5es do filtro
+filterConditions=Filtros definidos pelo utilizador
+filterConditions.noActions=Sem filtros com nome
filters_not_loaded=Imposs\u00EDvel carregar o filtro, ficheiro corrompido
+find=Localizar
find_what=Localizar o qu\u00EA
-FindAction.text=Localizar...
-FirstGroupNodeAction.text=N\u00F3 resumo (in\u00EDcio de grupo)
+FindAction.text=&Localizar...
+FindNextAction.text=Localizar seguinte
+FindPreviousAction.text=Localizar anterior
+fit_background_to_page=Ajustar imagem de fundo a uma p\u00E1gina
fit_map_to_page=A&justar numa pagina
fit_map_to_page_height=Ajustar altura a uma p\u00E1gina
fit_map_to_page_width=Ajustar largura a uma p\u00E1gina
@@ -449,11 +480,13 @@ FoldAllAction.text=Dobrar todos
FoldAllAction.tooltip=<html>Dobra os n\u00F3s selecionados e todos os seus n\u00F3s-filho.</html>
FoldOneLevelAction.text=Dobrar um n\u00EDvel
FoldOneLevelAction.tooltip=<html>Dobra os n\u00F3s selecionados um n\u00EDvel.</html>
-follow_graphical_link=Ir para:
+follow_clone=Dentro de "{0}"
+follow_graphical_link=Ir para "{0}"
FollowLinkAction.text=Seguir liga\u00E7\u00E3o
font=Tipo de letra
FontFamilyAction.text=Fam\u00EDlia da letra
FontSizeAction.text=Tamanho da letra
+format=F&ormatar
format_invalid_pattern=Padr\u00E3o inv\u00E1lido
format_menu_cloud_shapes=Adicionar cor ou alterar estilo
format_menu_edge_styles=&Estilo das linhas
@@ -488,6 +521,8 @@ freeplane_reverted=Freeplane_Revertido_
FreeplaneHelpStarter.text=Ajuda...
FreeplaneHelpStarter.tooltip=Extens\u00E3o da ajuda do Freeplane
GettingStartedAction.text=Tutorial
+goto=Ir para
+goto.noActions=Sem n\u00F3s destino
GotoLinkNodeAction.text=Ir para a liga\u00E7\u00E3o
GotoNodeAction.text=Ir para o n\u00F3 com a ID...
GrabKeyDialog.common.cancel=Cancelar
@@ -503,7 +538,7 @@ help=Aj&uda
HideableAction.tooltip=<html>Marca o fundo de cada n\u00F3 alterado.</html>
HideAllAttributesAction.text=Ocultar todos os atributos
HierarchicalIcons2Action.text=Mostrar intersec\u00E7\u00E3o dos \u00EDcones-filho
-HierarchicalIconsAction.text=Mostrar \u00EDcones &hierarquicamente
+HierarchicalIconsAction.text=Mostrar \u00EDcones hierarquicamente
HierarchicalIconsAction.tooltip=Se um dos meus netos tiver um \u00EDcone, tamb\u00E9m mostro este \u00EDcone num formato pequeno.
hot_keys=Atalhos
hot_keys_table=Tabela de atalhos
@@ -619,7 +654,7 @@ icon_wizard=Varinha m\u00E1gica
icon_xmag=A discutir
icon_yes=Importante
IconGroupPopupAction.arrows.text=Setas
-IconGroupPopupAction.docs_folders.text=Documentos e pastas
+IconGroupPopupAction.docs_folders.text=Documentos & pastas
IconGroupPopupAction.flags.text=Bandeiras
IconGroupPopupAction.math.text=Matem\u00E1tica
IconGroupPopupAction.media.text=Multim\u00E9dia
@@ -643,19 +678,21 @@ IconProgressIconUpAction.text=Aumentar progresso
IconProgressIconUpAction.tooltip=Incrementa/insere \u00EDcones de progresso (0%->25%->50%->75%->100%->Completo).
IconProgressRemoveAction.text=Remove indicador de progresso
IconProgressRemoveAction.tooltip=Remove \u00EDcones de progresso e o \u00EDcone clic\u00E1vel.
+icons=\u00CDcones
IconSelectionPlugin.text=Selecionar \u00EDcone da tabela...
IconSelectionPlugin.tooltip=<html>Aqui pode selecionar um \u00EDcone usando uma subjanela.</html>
image_covertLink=Converter liga\u00E7\u00E3o em imagem
ImageFlavorHandler=Imagem (usar ficheiro separado)
-import=Importar
+import=I&mportar
import_linked_branch_no_link=O n\u00F3 selecionado n\u00E3o tem liga\u00E7\u00F5es para importar.
-ImportAction.text=&Importar mapa
-ImportBranchAction.text=&Ramo...
-ImportExplorerFavoritesAction.text=Favoritos do I&Explorer...
+ImportAction.text=Importar mapa
+ImportBranchAction.text=Ramo...
+ImportExplorerFavoritesAction.text=Favoritos do IExplorer...
ImportFolderStructureAction.text=Estrutura de pastas...
-ImportLinkedBranchAction.text=Importar ramo &ligado
-ImportLinkedBranchWithoutRootAction.text=Ramo ligado sem &raiz...
+ImportLinkedBranchAction.text=Importar ramo ligado
+ImportLinkedBranchWithoutRootAction.text=Ramo ligado sem raiz...
ImportMindmanagerFiles.text=Mapa MindManager X5...
+ImportXmlFile.text=Importar fiheiro XML
increase_branch_font_size=Aumentar letra
IncreaseNodeFontAction.text=Aumentar letra
internal_error_tooltip=Erro interno. Clique para abrir o di\u00E1rio log.0 para mais informa\u00E7\u00E3o.
@@ -667,22 +704,31 @@ invalid_url_msg=Imposs\u00EDvel criar URL v\u00E1lido para {0}
ItalicAction.text=It\u00E1lico
italicise_branch=It\u00E1lico
java_version=Vers\u00E3o Java: {0}
-JoinNodesAction.text=Juntar n\u00F3s
+JoinNodesAction.separator.format=Unir n\u00F3s com "{0}"
+lastOpenedMaps=Mapas mais recentes
+lastOpenedMaps.noActions=Sem mapas no hist\u00F3rico
latex_editor=Editar f\u00F3rmula LaTex
-LatexDeleteLatexAction.text=Remover f\u00F3rmula LaTex
-LatexEditLatexAction.text=Editar f\u00F3rmula LaTex...
+LatexDeleteLatexAction.text=Remover f\u00F3rmula LaTeX
+LatexEditLatexAction.text=Editar f\u00F3rmula LaTeX...
LatexInsertLatexAction.msg1=<html>Est\u00E1 a tentar inserir uma f\u00F3rmula LaTex <i>antiga</i>.<br/>A nova forma de criar texto/f\u00F3rmulas LaTeX \u00E9 descrita nesta p\u00E1gina:</html>
LatexInsertLatexAction.msg2=<html>Em resumo: <ul><li>use um prefixo "\\latex " no n\u00F3 de texto ou</li><li><i>Ver->Propriedades</i>, e depois <i>Texto do n\u00FAcleo->Formatar->Latex</i></li></ul></html>
-LatexInsertLatexAction.text=Adicionar f\u00F3rmula &LaTex...
+LatexInsertLatexAction.text=Adicionar f\u00F3rmula LaTex...
latexPatternFormat=LaTex
+LengthUnits.cm=cm
+LengthUnits.in=pol
+LengthUnits.mm=mm
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=Tem de selecionar pelo menos dois n\u00F3s para criar liga\u00E7\u00F5es.
license=Licen\u00E7a: GPL 2 ou posterior
license_text=<html>Este programa \u00E9 gratuito; pode redistribui-lo e/ou<br>modific\u00E1-lo sob os termos da licen\u00E7a p\u00FAblica geral - GNU General Public License<br>como publicado pela Free Software Foundation; seja a vers\u00E3o 2<br>da Licen\u00E7a, ou (por escolha sua) outra vers\u00E3o posterior.<br><br>Este programa \u00E9 distribu\u00EDdo na esperan\u00E7a de que seja \u00FAtil,<br>mas SEM QUALQUER GARANTIA; sem sequer a garantia impl\u00EDcita de<br>VALOR COMERCIAL ou S [...]
link_error=Liga\u00E7\u00E3o incorreta, {0} n\u00E3o carregado
link_not_available_any_more=A liga\u00E7\u00E3o j\u00E1 n\u00E3o \u00E9 v\u00E1lida. O n\u00F3 foi eliminado no meio tempo.
link_not_found=Liga\u00E7\u00E3o {0} n\u00E3o encontrada.
+links=Liga\u00E7\u00E3o
load=&Carregar
load_accelerator_presets=Carregar
+load_accelerator_presets.noActions=Sem predefini\u00E7\u00F5es
LoadAcceleratorPresetsAction.textPatterns.text=Padr\u00F5es de texto
locking_failed_by_open=Bloqueio do mapa {0} falhou. A abrir em modo s\u00F3 de leitura.
locking_failed_by_save_as=Bloqueio do mapa {0} falhou. Opera\u00E7\u00E3o "Gravar como" cancelada.
@@ -690,6 +736,7 @@ locking_old_lock_removed=O mapa {0} foi bloqueado pelo utilizador {1}. O bloquei
long_node_changed_cancel=O n\u00F3 foi modificado. Quer ignorar as altera\u00E7\u00F5es?
long_node_changed_submit=O n\u00F3 foi modificado. Quer gravar as altera\u00E7\u00F5es?
lots_of_links_warning=Vai criar muitas liga\u00E7\u00F5es ao mesmo n\u00F3. Tem a certeza que quer continuar?
+main_menu=Menu
main_resource_directory=Recursos da instala\u00E7\u00E3o: {0}
MainView.errorUpdateText=Erro ao definir o texto para a entrada: {0}.
MakeLinkFromAnchorAction.text=Criar liga\u00E7\u00E3o a partir da \u00E2ncora
@@ -728,15 +775,20 @@ ManageAddOnsDialog.tab.manage.themes=Temas
ManageAddOnsDialog.tab.manage.themes.tooltip=Gerir temas instalados
ManageAddOnsDialog.tab.manage.tooltip=Gerir suplementos instalados
ManageAddOnsDialog.visit.addon.page=Visite a p\u00E1gina de suplementos...
-ManageConditionalStylesAction.text=Gerir estilos condicionais para o &mapa
-ManageNodeConditionalStylesAction.text=Gerir estilos condicionais p&ara n\u00F3s
+ManageConditionalStylesAction.text=Gerir estilos condicionais para o mapa
+ManageNodeConditionalStylesAction.text=Gerir estilos condicionais para n\u00F3s
map_already_exists=O mapa j\u00E1 existe. Quer substitui-lo?
+map_background=Fundo do mapa
+map_background_image=Imagem de fundo
map_corrupted=Mapa corrompido. Ver detalhes?
map_load_error=Imposs\u00EDvel carregar o mapa {0}
map_locked_by_open=O mapa {0} est\u00E1 a ser editado pelo utilizador {1}. A abrir em modo s\u00F3 de leitura.
map_locked_by_save_as=O mapa {0} est\u00E1 a ser editado pelo utilizador {1}. Opera\u00E7\u00E3o "Gravar como" cancelada.
map_not_saved=O mapa ainda n\u00E3o foi gravado.
-MapBackgroundColorAction.text=Cor de fundo do mapa
+MapBackgroundClearAction.text=Limpar
+MapBackgroundColorAction.text=Cor de fundo
+MapBackgroundImageAction.text=Imagem de fundo...
+maps=Mapas
MaxNodeWidth.text=Definir largura m\u00E1xima do n\u00F3
menu_applyStyle=Aplicar estilo
menu_attributes=&Atributos
@@ -748,10 +800,6 @@ menu_displayAttributes=Atributos do n\u00F3
menu_encryption=Prote\u00E7\u00E3o por palavra-passe
menu_error=Erro na estrutura do menu definido pelo utilizador {0}:\n{1}\nA cancelar
menu_extensions=Extens\u00F5es do n\u00F3
-menu_extras=&Ferramentas
-menu_file_import=I&mportar
-menu_filter=F&iltrar
-menu_format=F&ormatar
menu_group=Grupo de n\u00F3s
menu_hoverView=Sugest\u00F5es
menu_iconByCategory=\u00CDcone por categoria...
@@ -759,26 +807,20 @@ menu_iconView=\u00CDcones
menu_image=Imagem
menu_insert=In&serir
menu_latex_formula=F\u00F3rmula LaTex
-menu_links=Liga\u00E7\u00E3o
menu_manageStyles=&Gerir estilos
menu_moveNode=Mover e ordenar
-menu_navigate=&Navegar
menu_newNode=Novo n\u00F3
menu_node=N\u00F3
menu_node_features=Funcionalidades do n\u00F3
menu_nodes=&N\u00F3s
menu_nodeView=N\u00FAcleo do n\u00F3
-menu_notes=Nota
menu_noteView=Notas
menu_openmaps=Mapas
-menu_progress=\u00CDcone de progresso (%)
menu_remove_icons=Remover \u00EDcones
menu_removeAttribute=Remover atributo
menu_select=Selecionar
menu_time=Gest\u00E3o de tempo
menu_title=N\u00FAcleo do n\u00F3
-menu_toolbars=Barras de ferramentas
-menu_view=&Ver
menu_viewmode=Ver defini\u00E7\u00F5es
MenuUtils.invalid_menuitem={0} n\u00E3o \u00E9 um atalho de menu v\u00E1lido.
mindmap=Mapa
@@ -792,14 +834,17 @@ mode_File=Modo Ficheiro
mode_MindMap=Modo Mapa mental
mode_na=Modo n\u00E3o dispon\u00EDvel
mode_status=Modo alterado para {0}
+mode_StyleMap=Edi\u00E7\u00E3o de estilo
mode_title=Freeplane - {0}
modes=Modos
ModesMenuAction.Browse.text=Navegador de mapas
ModesMenuAction.File.text=Explorador de ficheiros
ModesMenuAction.MindMap.text=Editor de mapa mental
most_recent_files=Ficheiros recentes
+MoveAction.text=Mover
MoveToRootAction.text=Ir para a ra\u00EDz
NameConditionAction.text=Definir nome
+navigate=&Navegar
NavigationNextMapAction.text=Mapa seguinte
NavigationPreviousMapAction.text=Mapa anterior
new=&Novo
@@ -820,11 +865,11 @@ NewerFileRevisionsFoundDialog.question=Encontradas novas revis\u00F5es de {0}!
NewerFileRevisionsFoundDialog.restore=Resta&urar
NewerFileRevisionsFoundDialog.restore.tooltip=Substituir {0} por {1}
NewerFileRevisionsFoundDialog.title=Novas revis\u00F5es de ficheiro encontradas!
-NewFreeNodeAction.text=Novo n\u00F3 livre
+NewFreeNodeAction.text=Novo n\u00F3 flutuante
NewLevelStyleAction.text=Adicionar estilo de n\u00EDvel
newmap.install.addon.question={0} parece ser um pacote de suplementos\nQuer instal\u00E1-lo?\n(selecione "N\u00E3o" para abrir normalmente).
newmap.install.addon.title=Instalar suplemento?
-NewMapAction.text=&Novo mapa
+NewMapAction.text=Novo mapa
NewMapViewAction.text=Nova vista de mapa
NewParentNode.text=Novo n\u00F3-m\u00E3e
NewParentNode.tooltip=<html>Toda a sele\u00E7\u00E3o ser\u00E1 enviada para um novo n\u00F3-m\u00E3e.</html>
@@ -849,6 +894,7 @@ node=N\u00F3
node_changed_discard_changes=O n\u00F3 foi modificado. Quer ignorar as altera\u00E7\u00F5es?
node_is_write_protected=O n\u00F3 destino est\u00E1 protegido contra escrita.
node_location_help=Arrastar altera a localiza\u00E7\u00E3o do n\u00F3, Ctrl + Arrastar altera as dist\u00E2ncias, duplo clique e Ctrl + duplo clique rep\u00F5em-nas.
+node_popup_scripting=Scripts
node_selector=Sele\u00E7\u00E3o de n\u00F3
node_selector_message=Duplo clique para selecionar n\u00F3
node_styles=Estilos do n\u00F3
@@ -860,21 +906,31 @@ NodeExtensions.EditNodeExtensions=Editar extens\u00F5es do n\u00F3
NodeExtensions.RemoveNodeExtensions=Remover extens\u00F5es do n\u00F3
NodeListAction.text=Localizar e substituir...
NodeListAction.tooltip=Mostra todos os n\u00F3s como lista para procura com propriedades de filtragem.
-NodeShapeAction.bubble.text=&Bolha
-NodeShapeAction.fork.text=Bi&furca\u00E7\u00E3o
+NodeShapeAction.bubble.text=Bolha
+NodeShapeAction.fork.text=Bifurca\u00E7\u00E3o
+NodeShapeAction.narrow_hexagon.text=Hex\u00E1gono estreito
+NodeShapeAction.oval.text=Oval
+NodeShapeAction.rectangle.text=Ret\u00E2ngulo
+NodeShapeAction.small_bubble.text=Bolha pequena
+NodeShapeAction.small_wide_hexagon.text=Hex\u00E1gono pequeno
+NodeShapeAction.wide_hexagon.text=Hex\u00E1gono largo
NodeUpAction.text=Mover n\u00F3 para cima
-NodeWidthAction.text=Definir limites de largura do n\u00F3
nonboldify_branch=Anular Negrito
nonitalicise_branch=Anular It\u00E1lico
normal=Normal
not_saved_for_image_error=O mapa tem de ser gravado antes de definir uma imagem com o seletor de ficheiros
not_saved_for_link_error=O mapa tem que ser gravado antes de definir uma liga\u00E7\u00E3o com o seletor de ficheiros
note_window_location=Posi\u00E7\u00E3o da janela de notas
+notes=Nota
+NotificationOptions.CLOSE=Fechar
+NotificationOptions.REMIND_ME_LATER=Lembrar-me mais tarde
+NotificationOptions.REMOVE_REMINDER=Remover lembrete
+NotificationOptions.SELECT_NODE=Ir para o lembrete
ok=Aceitar
OKAction.text=Aceitar
OnlineReference.text=Mapas de documenta\u00E7\u00E3o online
open_asMindMap=Mapa mental
-OpenAction.text=&Abrir mapa gravado...
+OpenAction.text=Abrir mapa gravado...
OpenFreeplaneSiteAction.text=P\u00E1gina inicial do Freeplane
OpenMapsAddLocation.text=Adicionar local do OpenMaps...
OpenMapsRemoveLocation.text=Remover local do OpenMaps...
@@ -898,6 +954,7 @@ OptionPanel.always_load_last_maps.tooltip=Abrir os \u00FAltimos ficheiros defini
OptionPanel.always_save_folding=Sempre
OptionPanel.always_save_folding_state=Gravar sempre as altera\u00E7\u00F5es ao estado das dobras
OptionPanel.always_save_folding_state.tooltip=Se marcada, cada a\u00E7\u00E3o de dobra mancha o mapa e lembra-o de o gravar.
+OptionPanel.always_show_less_than_N_nodes_after_load=Desdobrar alguns n\u00F3s
OptionPanel.always_unfold_all_after_load=Desdobrar todos
OptionPanel.antialias=Suaviza\u00E7\u00E3o
OptionPanel.antialias.tooltip=<html>Determina a qualidade do mapa. Mais suaviza\u00E7\u00E3o demora mais tempo.</html>
@@ -935,6 +992,8 @@ OptionPanel.combined=Combinado
OptionPanel.compare_as_number=Comparar como n\u00FAmeros
OptionPanel.convert_to_current_version=<html>Converter automaticamente mapas de vers\u00F5es anteriores<br/>do Freeplane para a vers\u00E3o atual?</html>
OptionPanel.convert_to_current_version.tooltip=<html>S\u00F3 pode abrir mapas sem convers\u00E3o para mapas muito grandes <br/>que n\u00E3o precisem de ser convertidos(conhecimento especializado)
+OptionPanel.copyFormatToNewSibling=Copiar formato para novos parentes
+OptionPanel.copyFormatToNewSiblingIncludesIcons=Copiar formato com \u00EDcones
OptionPanel.cs=Checo / \u010Desky
OptionPanel.cut_nodes_without_question=Cortar n\u00F3s sem confirma\u00E7\u00E3o?
OptionPanel.cut_nodes_without_question.tooltip=Se esta caixa estiver marcada os n\u00F3s s\u00E3o cortados sem confirma\u00E7\u00E3o.. Isto pode causar perda n\u00E3o intencional de informa\u00E7\u00E3o.
@@ -956,6 +1015,7 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>Para o Windows (as
OptionPanel.default_browser_command_windows_nt=Comando predefinido do navegador Windows NT
OptionPanel.default_browser_command_windows_nt.tooltip=<html>Para o Windows (as "" aspas s\u00E3o necess\u00E1rias porque as liga\u00E7\u00F5es t\u00EAm "=" no URL).</html>
OptionPanel.default_charset=Conjunto de carateres
+OptionPanel.default_save_dir=Pasta de grava\u00E7\u00E3o predefinida
OptionPanel.Defaults=Predefini\u00E7\u00F5es
OptionPanel.delete_automatic_saves_at_exit=Eliminar grava\u00E7\u00F5es autom\u00E1ticas ao sair
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Se os ficheiros devem ser eliminados automaticamente no encerramento normal do Freeplane, defina esta vari\u00E1vel como verdadeira</html>
@@ -987,6 +1047,7 @@ OptionPanel.en=Ingl\u00EAs / English
OptionPanel.Environment=Ambiente
OptionPanel.es=Espanhol, Castelhano / espa\u00F1ol, castellano
OptionPanel.et=Estoniano / eesti, eesti keel
+OptionPanel.eu=Basco
OptionPanel.execute_scripts_without_asking=Execu\u00E7\u00E3o de scripts ativada
OptionPanel.execute_scripts_without_asking.tooltip=<html>Os scripts no Freeplane s\u00E3o capazes de efetuar qualquer a\u00E7\u00E3o no seu computador.<br>Assim, n\u00E3o deve executar scripts que n\u00E3o conhe\u00E7a como seguros.</html>
OptionPanel.execute_scripts_without_exec_restriction=Permitir a execu\u00E7\u00E3o de outros programas (N\u00C3O recomendado)
@@ -1004,6 +1065,7 @@ OptionPanel.export_icons_in_html.tooltip=<html> Informar se o HTML exportado a p
OptionPanel.exported_image_resolution_dpi=Resolu\u00E7\u00E3o da imagem exportada (em DPI)
OptionPanel.Files=Ficheiros
OptionPanel.first=Primeiro
+OptionPanel.fit_to_viewport=Ajustar imagem de fundo \u00E0 janela
OptionPanel.fold_on_click_inside=Dobrar ao clicar no interior
OptionPanel.foldingsymbolwidth=Largura do s\u00EDmbolo de dobragem
OptionPanel.foldingsymbolwidth.tooltip=<html>Largura do c\u00EDrculo de dobragem</html>
@@ -1042,8 +1104,10 @@ OptionPanel.id=Indon\u00E9sio / Bahasa Indonesia
OptionPanel.IGNORE=N\u00E3o fazer nada
OptionPanel.il__enter_confirms_by_default=Por predefini\u00E7\u00E3o, Enter confirma
OptionPanel.image_cache=para imagens
+OptionPanel.indentationUsesTabsInTextOutput=Usar tabula\u00E7\u00F5es em sa\u00EDda de texto
OptionPanel.it=Italiano / Italiano
OptionPanel.ja=Japon\u00EAs / \u65E5\u672C\u8A9E
+OptionPanel.JoinNodesAction.textSeparators=Separador de texto
OptionPanel.key_type_action=Ao escrever
OptionPanel.Keystrokes=Atalhos
OptionPanel.ko=Coreano / \uD55C\uAD6D\uC5B4 (\u97D3\u570B\u8A9E), \uC870\uC120\uB9D0 (\u671D\u9BAE\u8A9E)
@@ -1084,6 +1148,7 @@ OptionPanel.max_shortened_text_length=Largura m\u00E1xima de texto abreviado
OptionPanel.metal=Metal
OptionPanel.min_node_width=Largura m\u00EDnima do n\u00F3
OptionPanel.motif=Motif
+OptionPanel.narrow_hexagon=Hex\u00E1gono estreito
OptionPanel.nb=Noruegu\u00EAs Bokm\u00E5l / Norsk bokm\u00E5l
OptionPanel.never_save_folding=Nunca
OptionPanel.nl=Holand\u00EAs, Flandres / Nederlands, Vlaams
@@ -1101,8 +1166,7 @@ OptionPanel.nodeformat=Formato
OptionPanel.nodeformat.tooltip=<html>Substitui\u00E7\u00E3o e/ou formata\u00E7\u00E3o de texto:<ul><li><em> expans\u00E3o de modelo</em> (<tt>%s</tt> \u00E9 o texto original), i.e. <tt>ATEN\u00C7\u00C3O: %s</tt><li><em>formata\u00E7\u00E3o de datas e n\u00FAmeros</em> - veja os exemplos na caixa de sele\u00E7\u00E3o</ul></html>
OptionPanel.nodenumbering=Numera\u00E7\u00E3o de n\u00F3s
OptionPanel.nodenumbering.tooltip=Adiciona n\u00FAmero de s\u00E9rie ao texto do n\u00F3 (i.e. 1.3.1).
-OptionPanel.nodeshape=Estilo do n\u00F3
-OptionPanel.nodeshape.tooltip=<html>O estilo descreve a forma exterior do n\u00F3. <br>Valores poss\u00EDveis:<br><table border="1"><tr><td>bifurca\u00E7\u00E3o: </td><td> sem contorno,</td></tr><tr><td>bolha: </td><td> n\u00F3 rodeado por ret\u00E2ngulo,</td></tr><tr><td>N\u00F3-m\u00E3e: </td><td> mesmo estilo do n\u00F3-m\u00E3e <br>ou a predefini\u00E7\u00E3o do n\u00F3-ra\u00EDz para o n\u00F3-ra\u00EDz,</td></tr><tr><td>Combinado: </td><td> Bolha quando o n\u00F3 est\u00E1 dobrado, [...]
+OptionPanel.nodeshape=Forma do n\u00F3
OptionPanel.nodetext=Texto do n\u00F3
OptionPanel.nodetext.tooltip=Aqui pode definir o texto do n\u00F3. O texto anterior \u00E9 descartado quando aplica este padr\u00E3o.
OptionPanel.nothing=Nada
@@ -1118,9 +1182,14 @@ OptionPanel.org.freeplane.plugin.bugreport.denied=Nunca enviar
OptionPanel.org.freeplane.plugin.bugreport.userid=Identificador opcional a enviar
OptionPanel.outline_hgap=Dist\u00E2ncia horizontal
OptionPanel.outline_vgap=Dist\u00E2ncia vertical
+OptionPanel.oval=Oval
OptionPanel.paint_connectors_behind=Pintar liga\u00E7\u00F5es atr\u00E1s dos n\u00F3s
OptionPanel.parse_data=Reconhecer introdu\u00E7\u00E3o de n\u00FAmeros e data/hora
OptionPanel.parse_data.tooltip=Tentar detetar data, data/hora e n\u00FAmeros e aplicar formatos padr\u00E3o. Exemplos: 100.000,00, 12/31, 12/31/99, 1999-12-31 e 1999-12-31 12:55
+OptionPanel.parse_formulas=Reconhecer f\u00F3rmulas
+OptionPanel.parse_formulas.tooltip=Processar f\u00F3rmulas em n\u00F3s come\u00E7ados por "=": veja http://www.freeplane.org/wiki/index.php/Formulas.
+OptionPanel.parse_latex=Reconhecer LaTeX
+OptionPanel.parse_latex.tooltip=Reconhecer f\u00F3rmulas LaTeX por formato ou prefixo: veja http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane.
OptionPanel.PASTE_HTML=Copiar como HTML
OptionPanel.PASTE_PLAIN_TEXT=Copiar como texto simples
OptionPanel.path_property_may_not_be_empty=O caminho da propriedade n\u00E3o pode estar vazio! A altera\u00E7\u00E3o foi revertida.
@@ -1138,9 +1207,13 @@ OptionPanel.printonwhitebackground.tooltip=<html>Usar sempre um fundo branco par
OptionPanel.pt_BR=Portuguese(Brazil)/Portugu\u00EAs(Brasil)
OptionPanel.pt_PT=Portuguese(Portugal)/Portugu\u00EAs(Portugal)
OptionPanel.RECT=Ret\u00E2ngulo
+OptionPanel.rectangle=Ret\u00E2ngulo
OptionPanel.relative=Relativo
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"Perguntar" pergunta-lhe (use se tem d\u00FAvidas).<br>"Sim" mostra o editor de Rich Text.<br>"N\u00E3o" mostra o editor de texto simples.</html>
OptionPanel.remind_use_rich_text_in_new_nodes=Use Rich Text para n\u00F3s colados
+OptionPanel.remindersBlink=Piscar dos lembretes
+OptionPanel.remindersShowNotifications=Lembretes mostram bal\u00F5es de notifica\u00E7\u00E3o
+OptionPanel.remindersStandardDelay=Atraso do lembrete
OptionPanel.remove_notes_without_question=Remover notas sem confirmar?
OptionPanel.remove_notes_without_question.tooltip=Se esta caixa estiver marcada, as notas dos n\u00F3s selecionados s\u00E3o removidas sem confirma\u00E7\u00E3o. Isto pode causar perda de informa\u00E7\u00E3o n\u00E3o intencional.
OptionPanel.resources_use_default_font_for_notes_too=Usar letra predefinida tamb\u00E9m para as notas
@@ -1151,6 +1224,7 @@ OptionPanel.ROUND_RECT=Ret\u00E2ngulo arredondado
OptionPanel.ru=Russo / \u0420\u0443\u0441\u0441\u043A\u0438\u0439
OptionPanel.save_folding=Gravar dobragem
OptionPanel.save_folding_if_map_is_changed=Se o mapa est\u00E1 alterado
+OptionPanel.save_last_visited_node=Gravar \u00FAltima posi\u00E7\u00E3o no mapa
OptionPanel.save_modification_times=Gravar hora das altera\u00E7\u00F5es
OptionPanel.script_classpath=Caminho de classe de scripts: pastas adicionais contendo classes e/ou JARs (ver sugest\u00E3o)
OptionPanel.script_classpath.tooltip=<html>Uma lista de JARs e/ou pastas para adicionar ao caminho de classes de scripts e f\u00F3rmulas.<br>Use ; (Windows) ou : (Linux, Mac) para separar entradas.<br>V\u00E3o ser procurados ficheiros JARs e .class nas pastas.<br>Caminhos que n\u00E3o sejam absolutos ser\u00E3o considerados relativos \u00E0 pasta de instala\u00E7\u00E3o do Freeplane.<br>Se definir este caminho, tamb\u00E9m tem de permitir acesso de leitura!</html>
@@ -1162,6 +1236,7 @@ OptionPanel.script_user_key_name_for_signing=Chave de utilizador opcional para a
OptionPanel.script_user_key_name_for_signing.tooltip=<html>Se quer assinar os seus scripts, introduza a chave alternativa aqui.<br>Espera-se que a chave resida no armaz\u00E9m predefinido.<br>A palavra-passe da chave secreta tem de coincidir com a palavra-passe de armaz\u00E9m (esta \u00E9 a predefini\u00E7\u00E3o).</html>
OptionPanel.scrollbar_increment=Velocidade
OptionPanel.scrolling_speed=Velocidade de desloca\u00E7\u00E3o autom\u00E1tica
+OptionPanel.scrollOnUnfold=Rolar mapa ap\u00F3s desdobrar um n\u00F3
OptionPanel.selection_method=M\u00E9todo de sele\u00E7\u00E3o
OptionPanel.selection_method.tooltip=<html> com o seguinte interruptor pode ativar/desativar o esquema de atraso da sele\u00E7\u00E3o. Op\u00E7\u00F5es autom\u00E1ticas. N\u00E3o modifique estes, pois ser\u00E3o guardados em auto.properties de qualquer maneira.</html>
OptionPanel.selection_method_by_click=Por clique
@@ -1195,6 +1270,7 @@ OptionPanel.separator.icon_properties=\u00CDcones
OptionPanel.separator.icons=\u00CDcones em "Selecionar \u00EDcone..."
OptionPanel.separator.initial_map_size=Tamanho inicial do mapa
OptionPanel.separator.inline_editor=Editor em linha de n\u00F3s
+OptionPanel.separator.JoinNodesAction=Unir n\u00F3s
OptionPanel.separator.key_typing=Escrever chave
OptionPanel.separator.language=Idioma
OptionPanel.separator.latex=LaTex
@@ -1215,6 +1291,7 @@ OptionPanel.separator.other_defaults=Outras predefini\u00E7\u00F5es
OptionPanel.separator.others=Outros v\u00EDnculos chave
OptionPanel.separator.outline_view=Vista de destaque
OptionPanel.separator.patterns=Padr\u00F5es
+OptionPanel.separator.reminderOptions=Op\u00E7\u00F5es de lembretes
OptionPanel.separator.RichTextEditor=Editor de Rich-Text
OptionPanel.separator.root_node_appearance=Apar\u00EAncia do n\u00F3-ra\u00EDz
OptionPanel.separator.save=Gravar
@@ -1226,6 +1303,7 @@ OptionPanel.separator.selection_method=M\u00E9todo de sele\u00E7\u00E3o
OptionPanel.separator.single_instance_mode=Inst\u00E2ncia \u00FAnica do programa
OptionPanel.separator.size_limits=Limites de tamanho
OptionPanel.separator.spelling=Op\u00E7\u00F5es de verifica\u00E7\u00E3o ortogr\u00E1fica
+OptionPanel.separator.SplitToWordsAction=Dividir n\u00F3 em palavras
OptionPanel.separator.status=Linha de estado
OptionPanel.separator.tooltip=Tempo das sugest\u00F5es
OptionPanel.separator.undo=Desfazer
@@ -1234,9 +1312,13 @@ OptionPanel.set_property_text=Alterar
OptionPanel.set_property_text.tooltip=Marcar para alterar este estilo adequadamente
OptionPanel.setscript=Alterar?
OptionPanel.setscript.tooltip=Pode associar um script ao estilo.
+OptionPanel.shape_horizontal_margin=Margem horizontal
+OptionPanel.shape_vertical_margin=Margem vertical
OptionPanel.sharp_bezier=Curva afiada (B\u00E9zier)
OptionPanel.sharp_linear=Linear afiada
+OptionPanel.shouldCenterSmallMaps=Centrar mapas pequenos
OptionPanel.show_icon_for_attributes=Mostrar \u00EDcone para atributos
+OptionPanel.show_less_than_N_nodes_by_default_after_load=Carregar do mapa ou desdobrar alguns n\u00F3s
OptionPanel.show_node_tooltips=Mostrar sugest\u00F5es
OptionPanel.show_note_icons=Mostrar \u00EDcones de notas
OptionPanel.show_styles_in_tooltip=Mostrar estilos de n\u00F3s nas sugest\u00F5es
@@ -1253,12 +1335,19 @@ OptionPanel.single_instance_force.tooltip=Evitar uma segunda inst\u00E2ncia mesm
OptionPanel.sk=Eslovaco / sloven\u010Dina
OptionPanel.sl=Esloveno / sloven\u0161\u010Dina
OptionPanel.slow_scroll_selected_node=Deslocar lentamente para o n\u00F3 selecionado
+OptionPanel.small_bubble=Bolha pequena
+OptionPanel.small_wide_hexagon=Hex\u00E1gono pequeno
OptionPanel.spelling_opt_case_sensitive=Distinguir mai\u00FAsculas/min\u00FAsculas
OptionPanel.spelling_opt_ignore_all_caps_words=Ignorar palavras em mai\u00FAsculas.
OptionPanel.spelling_opt_ignore_capitalization=Ignorar mai\u00FAsculas no princ\u00EDpio da palavra
OptionPanel.spelling_opt_ignore_words_with_numbers=Ignorar palavras com n\u00FAmeros
OptionPanel.spelling_opt_suggestions_limit_dialog=N\u00FAmero m\u00E1ximo de sugest\u00F5es na janela
OptionPanel.spelling_opt_suggestions_limit_menu=N\u00FAmero m\u00E1ximo de sugest\u00F5es no menu
+OptionPanel.SplitToWordsAction.auxiliaryWordList=lista de palavras auxiliares
+OptionPanel.SplitToWordsAction.charactersAcceptedInWord=Caracteres em palavras
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=manter n\u00F3 original vazio
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=n\u00FAmero do n\u00F3 na linha
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=gravar texto original como detalhes
OptionPanel.sr=S\u00E9rvio / \u0441\u0440\u043F\u0441\u043A\u0438
OptionPanel.standard_template=Ficheiro modelo padr\u00E3o
OptionPanel.standardbackgroundcolor=Cor padr\u00E3o do fundo
@@ -1278,26 +1367,32 @@ OptionPanel.standardselectednodecolor.tooltip=<html>A cor padr\u00E3o do n\u00F3
OptionPanel.standardselectednoderectanglecolor=Selecionar cor da bolha
OptionPanel.standardselectednoderectanglecolor.tooltip=<html>A cor da bolha que marca os n\u00F3s selecionados. Em nota\u00E7\u00E3o html ( em valores hexadecimais #RRGGBB)</html>
OptionPanel.STAR=Estrela
+OptionPanel.statesymbolwidth=Largura do s\u00EDmbolo de estado
OptionPanel.structured_html_import=Importar HTML como estrutura de n\u00F3
OptionPanel.structured_icon_toolbar=Barra de \u00EDcones estruturada
OptionPanel.summary=Resumo
OptionPanel.sv=Sueco / Svenska
OptionPanel.text.use_ctrl_key=Usar 'Atribuir atalho' no menu Ferramentas
+OptionPanel.textalignment=Alinhamento de texto
OptionPanel.time_for_automatic_save=Tempo para grava\u00E7\u00E3o autom\u00E1tica
OptionPanel.time_for_automatic_save.tooltip=<html> tempo decorrido entre duas grava\u00E7\u00F5es autom\u00E1ticas (em mseg): para desativar grava\u00E7\u00F5es autom\u00E1ticas defina este n\u00FAmero para 2000000000.</html>
OptionPanel.time_for_delayed_selection=Tempo para atraso da sele\u00E7\u00E3o
OptionPanel.time_for_delayed_selection.tooltip=<html>O tempo de atraso na sele\u00E7\u00E3o quando o rato est\u00E1 sobre os n\u00F3s (em mseg). Altere este valor para 1 se quiser que a sele\u00E7\u00E3o se fa\u00E7a imediatamente ao passar do rato.</html>
OptionPanel.toolTipManager.dismissDelay=Atraso de sa\u00EDda, mseg
OptionPanel.toolTipManager.initialDelay=Atraso inicial, mseg
-OptionPanel.toolTipManager.max_tooltip_width=Comprimento da sugest\u00E3o
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>A dimens\u00E3o predefinida da sugest\u00E3o em pixels.</html>
+OptionPanel.toolTipManager.max_tooltip_height=Altura m\u00E1xima da sugest\u00E3o do n\u00F3
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=A altura m\u00E1xima da sugest\u00E3o do n\u00F3, em pixels.
+OptionPanel.toolTipManager.max_tooltip_width=Largura m\u00E1xima da sugest\u00E3o do n\u00F3
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=A largura m\u00E1xima da sugest\u00E3o do n\u00F3, em pixels.
OptionPanel.toolTipManager.reshowDelay=Voltar a mostrar atraso, mseg
+OptionPanel.tr=Turco / T\u00FCrk\u00E7e
OptionPanel.uk_UA=Ucraniano / \u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430
OptionPanel.undefined_font=Tipo de letra indefinida
OptionPanel.undo_levels=N\u00EDveis de "Desfazer"
OptionPanel.undo_levels.tooltip=<html>Determina quantos comandos ser\u00E3o gravados para desfazer.</html>
OptionPanel.unfold_on_paste=Desdobrar o n\u00F3 ao colar
OptionPanel.unfold_on_paste.tooltip=Desdobrar o n\u00F3 ao colar ou Arrastar e Largar
+OptionPanel.uniform_shape=Uniforme
OptionPanel.use_common_out_point_for_root_node=As linhas come\u00E7am num ponto do n\u00F3-raiz
OptionPanel.use_common_out_point_for_root_node.tooltip=As linhas come\u00E7am num ponto do n\u00F3-raiz
OptionPanel.use_tabbed_pane=Utilizar separadores
@@ -1310,9 +1405,12 @@ OptionPanel.validate_invalid_number_format=Formato padr\u00E3o num\u00E9rico inv
OptionPanel.validate_write_without_read=Scripts: considere adicionar a leitura \u00E0 escrita de ficheiros.
OptionPanel.validation_error=<html><body>Erro(s) de valida\u00E7\u00E3o:<p><em>{0}</em><p>por favor altere as prefer\u00EAncias para reparar o(s) erro(s).</body></html>
OptionPanel.validation_warning=<html><body>Aviso(s) de valida\u00E7\u00E3o:<p><em>{0}</em></body></html>
+OptionPanel.vertical_child_gap=Espa\u00E7o do filho
+OptionPanel.vertical_child_gap.tooltip=Dist\u00E2ncia vertical entre n\u00F3s-filho
OptionPanel.vi=Vietnamita / Ti\u1EBFng Vi\u1EC7t
OptionPanel.wheel_velocity=Velocidade
OptionPanel.wheel_velocity.tooltip=Um valor alto resulta num mais r\u00E1pido efeito dos movimentos da roda do rato no mapa.
+OptionPanel.wide_hexagon=Hex\u00E1gono largo
OptionPanel.windows=Windows
OptionPanel.zh_CN=Chin\u00EAs, simplificado / \u7B80\u4F53\u5B57
OptionPanel.zh_TW=Chin\u00EAs, tradicional / \u7E41\u9AD4\u5B57
@@ -1332,8 +1430,8 @@ out_of_memory=Sem mem\u00F3ria.
overwrite_keyset_question=Substituir conjunto de chaves existente?
PageAction.text=Configurar impress\u00E3o...
password_is_not_ascii=A palavra-passe n\u00E3o est\u00E1 em ASCII
-PasteAction.text=Co&lar
-PasteAttributes.text=Colar at&ributos
+PasteAction.text=Colar
+PasteAttributes.text=Colar atributos
PatternNewNameProperty=Novo padr\u00E3o
PatternToString.backgroundColor=Cor de fundo
PatternToString.Child=Estilo do n\u00F3-filho
@@ -1401,10 +1499,11 @@ plugins/TimeManagement.xml_WindowTitle=Gerir tempo
plugins/TimeManagement.xml_WindowTitle_All_Nodes=Procurar & Substituir
preferences=Prefer\u00EAncias
print_preview_title=Pr\u00E9-visualizar impress\u00E3o
-PrintAction.text=Im&primir mapa...
+PrintAction.text=Imprimir mapa...
PrintDirectAction.text=Imprimir
printing_settings=Escala de impress\u00E3o
-PrintPreviewAction.text=Pr\u00E9-visualizar impress\u00E3o...
+PrintPreviewAction.text=Antever impress\u00E3o...
+progress=\u00CDcone de progresso (%)
PropertyAction.dialog=Prefer\u00EAncias
PropertyAction.text=Prefer\u00EAncias...
QuickFilterAction.text=Filtro r\u00E1pido
@@ -1423,13 +1522,16 @@ really_remove_notes=Eliminar realmente a(s) nota(s)?
ReapplyFilterAction.text=Reaplicar a\u00E7\u00E3o de filtragem
red=Vermelho
RedefineStyleAction.text=Redefinir estilo
-RedoAction.text=&Refazer
+RedoAction.text=Refazer
RedoFilterAction.text=Refazer a\u00E7\u00E3o de filtragem
regular_expressions=Express\u00F5es regulares
ReminderHookAction.text=Remover lembrete
ReminderHookAction.tooltip=Remove o lembrete de um n\u00F3.
+reminderNotification=Notifica\u00E7\u00E3o do lembrete
remove_file_from_list_on_error=O ficheiro {0} n\u00E3o foi aberto. Quer remov\u00EA-lo da lista de ficheiros recentes?
remove_shortcut_question=Substituir atalho?
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=Repor n\u00F3s desdobrados
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=Permite dobrar todos os n\u00F3s
RemoveAllIconsAction.text=Eliminar todos os \u00EDcones
RemoveConnectorAction.text=Eliminar conector
RemoveEncryption.text=Remover palavra-passe
@@ -1447,31 +1549,40 @@ replace_shortcut_title=Substituir atalho?
ReportBugAction.text=Reportar um erro
RequestFeatureAction.text=Sugerir uma funcionalidade
reset_to_default=Usar a predefini\u00E7\u00E3o
-ResetNodeLocationAction.text=Repor a &posi\u00E7\u00E3o do n\u00F3
+ResetNodeLocationAction.text=Repor a posi\u00E7\u00E3o do n\u00F3
ResetStyleAction.text=Repor estilo do n\u00F3
-RevertAction.text=&Restaurar do hist\u00F3rico local
-RevisionPluginAction.text=Alterar a cor de fundo das &revis\u00F5es
+RevertAction.text=Restaurar do hist\u00F3rico local
+RevisionPluginAction.text=Alterar a cor de fundo das revis\u00F5es
+save=&Gravar
save_failed=Falha ao tentar gravar o mapa {0}.
save_unsaved=Gravar o mapa seguinte?
save_unsaved_styles=Gravar estilos?
SaveAcceleratorPresetsAction.text=Gravar conjunto de atalhos...
-SaveAction.text=Gravar mapa
+SaveAction.text=&Gravar mapa
+SaveAction_readonlyMsg=Este mapa \u00E9 s\u00F3 de leitura. Por favor, use "Ficheiro->Gravar mapa como..." para gravar este mapa.
+SaveAction_readonlyTitle=Tentativa de gravar mapa s\u00F3 de leitura
SaveAll.text=Gravar &todos os mapas abertos
SaveAll.tooltip=Grava todos os mapas abertos
-SaveAsAction.text=Gr&avar mapa como...
+SaveAs_toReadonlyMsg={0} \u00E9 s\u00F3 de leitura. Por favor, grave num ficheiro diferente.
+SaveAs_toReadonlyTitle=Tentativa de gravar num ficheiro s\u00F3 de leitura
+SaveAsAction.text=Gravar mapa como...
saved=Gravado
saving_canceled=Grava\u00E7\u00E3o cancelada
scanners_not_loaded=Imposs\u00EDvel carregar os scanners, ficheiro corrompido
scheme_evaluate=Avaliar!
script_execution_disabled=Execu\u00E7\u00E3o de scripts desativada, veja Ferramentas/Prefer\u00EAncias/Plugins
-ScriptEditor.text=Editor de S&cripts...
+ScriptEditor.text=Editor de Scripts...
ScriptEditor.tooltip=Permite criar scripts grandes no Freeplane.
ScriptEditorPanel.changed_cancel=Os scripts foram alterados. Tem a certeza que quer abandonar as altera\u00E7\u00F5es?
+scripting=Scripts
scripting_api_generator_legend=Legenda
scripting_api_generator_proxy=Proxy
scripting_api_generator_title=API de scripts
scripting_api_generator_utilities=Utilidades
scripting_api_generator_web=Recursos Web
+ScriptsRunToggleAction.ON_SELECTED_NODE.text=Executar scripts em todos os n\u00F3s selecionados
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=Executar scripts nos n\u00F3s selecionados, recursivamente
+ScriptsRunToggleAction.ON_SINGLE_NODE.text=Executar scripts num s\u00F3 n\u00F3 selecionado
select_favorites_folder=Escolha a pasta em que se encontram os seus favoritos
select_file_export_to=Selecione o ficheiro para o qual exportar
select_folder_for_importing=Escolha a pasta para importar
@@ -1480,7 +1591,7 @@ select_menu_item_dialog=Selecione um item de menu
select_menu_item_root_node=Menu
SelectAllAction.text=Selecionar todos os n\u00F3s vis\u00EDveis
SelectBranchAction.text=Selecionar o ramo vis\u00EDvel
-SelectedPasteAction.text=Col&ar como...
+SelectedPasteAction.text=Colar como...
selection_method_by_click=Clique \u00FAnico para selecionar
selection_method_delayed=Sele\u00E7\u00E3o autom\u00E1tica atrasada
selection_method_direct=Apontar para selecionar
@@ -1490,6 +1601,8 @@ set_accelerator_on_next_click_action=Para criar um novo atalho de teclado: prima
SetAccelerator.dialogTitle=Atribui\u00E7\u00E3o de atalhos
SetAccelerator.keystrokeDetected=A chave {0} n\u00E3o est\u00E1 atribu\u00EDda a nenhum item de menu.
SetAcceleratorOnNextClickAction.text=Atribuir atalho...
+SetAlwaysUnfoldedNodeFlagsAction.text=Manter n\u00F3s desdobrados
+SetAlwaysUnfoldedNodeFlagsAction.tooltip=Impedir dobras nos n\u00F3s atualmente desdobrados
SetImageByFileChooserAction.text=Imagem por escolha ou liga\u00E7\u00E3o...
SetLinkAnchorAction.text=Definir \u00E2ncora da liga\u00E7\u00E3o
SetLinkAnchorAction.tooltip=<html>definir o n\u00F3 selecionado como \u00E2ncora para cria\u00E7\u00E3o<br/>futura de liga\u00E7\u00F5es locais ou globais.
@@ -1694,12 +1807,13 @@ simplyhtml.valignMiddle=ao centro
simplyhtml.valignTop=em cima
simplyhtml.wholeWordsOnly=S\u00F3 palavras inteiras
simplyhtml.wholeWordsOnly.tooltip=Restringir coincid\u00EAncias a palavras inteiras.
-SortNodes.text=Ordenar n\u00F3&s-filho
+SortNodes.text=Ordenar n\u00F3s-filho
SortNodes.tooltip=Ordena alfabeticamente todos os n\u00F3s-filho.
-split=Dividir
+split=&Dividir
SplitConditionAction.text=Dividir
SplitNode.text=Dividir n\u00F3
SplitNode.tooltip=<html>O n\u00F3 est\u00E1 dividido</html>
+SplitToWordsAction.text=Dividir com {0} palavras na linha
STANDARD_FORMAT=Padr\u00E3o
stop_processing=Parar
StringFlavorHandler=Texto simples como hierarquia dos n\u00F3s
@@ -1732,27 +1846,39 @@ styles.subtopic=Subt\u00F3pico
styles.topic=T\u00F3pico
styles.user-defined=Estilos do utilizador
styles.website=P\u00E1gina Web
+styles_background_html=\n <html>\n <head>\n </head>\n <body>\n <table width="800" style="text-align: left; vertical-align: top">\n <tr valign="top">\n <th>\n <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold">\n Sobre este conjunto de estilo\n </div>\n <div style="text-align: left; font-weight: normal">\n <div style="margin: 3pt">\n Este padr\u00E3o foi desenvolvido ap\u00F3s 11 anos de persquisa pedag\u00F3gica so [...]
styles_menu=Estilos dispon\u00EDveis
submenu_keystroke_in_use_error=Imposs\u00EDvel usar o atalho {0} para o submenu {1}. Atalho removido.
summary_nodes=N\u00F3s-resumo
summary_not_possible=Imposs\u00EDvel criar n\u00F3-resumo para a sele\u00E7\u00E3o atual
-SummaryNodeAction.text=N\u00F3-resumo (definir/repor)
svg=SVG
template_dir=Modelos padr\u00E3o
+TextAlignAction.CENTER.text=Texto centrado
+TextAlignAction.DEFAULT.text=Predefini\u00E7\u00E3o
+TextAlignAction.LEFT.text=Texto alinhado \u00E0 esquerda
+TextAlignAction.RIGHT.text=Texto alinhado \u00E0 direita
+textalignment=Alinhamento de texto
TimeListAction.text=Gerir tarefas...
TimeListAction.tooltip=Mostra todos os agendamentos e os n\u00F3s correspondentes.
TimeManagementAction.text=Gerir tempo...
TimeManagementAction.tooltip=<html>Mostra o m\u00F3dulo Calend\u00E1rio de Kai Toedter.</html>
+TimePeriodUnits.days=dias
+TimePeriodUnits.hours=horas
+TimePeriodUnits.minutes=minutos
+TimePeriodUnits.ms=ms
+TimePeriodUnits.seconds=segundos
+TimePeriodUnits.weeks=semanas
ToggleChildrenFoldedAction.text=(Des)dobrar n\u00F3s-filho
ToggleDetailsAction.text=Ocultar detalhes
ToggleFBarAction.text=Barra de teclas de fun\u00E7\u00E3o
ToggleFoldedAction.text=(Des)dobrar
ToggleFullScreenAction.text=Modo Ecr\u00E3 completo
-ToggleLeftToolbarAction.text=&Barra de ferramentas \u00CDcones
+ToggleLeftToolbarAction.text=Barra de ferramentas \u00CDcones
ToggleMenubarAction.text=Barra de menus
ToggleScrollbarsAction.text=Barras de deslocamento
ToggleStatusAction.text=Mostrar linha de estado
-ToggleToolbarAction.text=Barra de ferramen&tas
+ToggleToolbarAction.text=Barra de ferramentas
+toolbars=Barras de ferramentas
undefined_error=Ocorreu um erro inesperado. Por favor tente criar um relat\u00F3rio de erros.
underline=Sublinhado
UnderlineAction.text=Sublinhado
@@ -1791,11 +1917,14 @@ user_defined_zoom_status_bar=Amplia\u00E7\u00E3o personalizada de {0}%.
user_icon=\u00CDcone do utilizador "{0}"
user_template_dir=Modelos do utilizador
user_zoom=Amplia\u00E7\u00E3o para impress\u00E3o(0.0 - 2.0):
+userScripts=Scripts
value_format=Formato do valor
version_up_to_date=J\u00E1 tem a mais recente vers\u00E3o do programa
-ViewerControllerAction.text=Objeto externo...
+view=&Ver
ViewLayoutTypeAction.OUTLINE.text=Vista de destaque
+web_resources=Recursos web
WebDocuAction.text=Documenta\u00E7\u00E3o Web
+WhatsNewAction.text=O que h\u00E1 de novo no Freeplane 1.5.x
width=Largura
wrong_regexp=Express\u00E3o regular errada "{0}", erro {1}
xslt_export.html=Documento HTML
@@ -1808,5 +1937,6 @@ xslt_export.ms_word=Formato XML Microsoft Word 2003
xslt_export.text=Texto simples
xslt_export_not_possible=Exporta\u00E7\u00E3o para Freeplane XSLT n\u00E3o \u00E9 poss\u00EDvel
yes=Sim
+zoom=Amplia\u00E7\u00E3o
ZoomInAction.text=Ampliar
ZoomOutAction.text=Reduzir
diff --git a/freeplane/resources/translations/Resources_ru.properties b/freeplane/resources/translations/Resources_ru.properties
index 177625a..e018fe5 100644
--- a/freeplane/resources/translations/Resources_ru.properties
+++ b/freeplane/resources/translations/Resources_ru.properties
@@ -35,7 +35,8 @@ actual_node_styles=\u0423\u0441\u043B\u043E\u0432\u043D\u044B\u0435 \u0441\u0442
add=&\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C
AddConnectorAction.text=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0432\u044F\u0437\u044C
AddElementaryConditionAction.text=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C
-AddLocalLinkAction.text=\u0421\u0441\u044B\u043B\u043A\u0430 \u043D\u0430 \u0443\u0437\u0435\u043B
+AddExecutionLinkAction.text=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0433\u0438\u043F\u0435\u0440\u0441\u0441\u044B\u043B\u043A\u0443 \u0434\u043B\u044F \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u044B \u041E\u0421...
+AddLocalLinkAction.text=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043C\u0435\u0441\u0442\u043D\u0443\u044E \u0433\u0438\u043F\u0435\u0440\u0441\u0441\u044B\u043B\u043A\u0443
AddMenuItemLinkAction.text=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u043F\u0443\u043D\u043A\u0442 \u0438\u0437 \u043C\u0435\u043D\u044E...
AddOnDetailsPanel.authored.by=\u0410\u0432\u0442\u043E\u0440 {0}
AddOnDetailsPanel.header.function=\u041D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435
@@ -98,6 +99,7 @@ attribute_delete_value=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u044D\u0442\u
attribute_font_size_tooltip=\u0420\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0434\u043B\u044F \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043E\u0432
attribute_list_box_label_text=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F
attribute_name=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attribute_name_or_value=\u0418\u043C\u044F \u0438\u043B\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
attribute_replace=\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430
attribute_top=\u0412\u0441\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044B \u0441 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043D\u044B\u0445 \u043A\u0430\u0440\u0442
attribute_value=\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
@@ -139,6 +141,10 @@ attributes_visible_tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u04
automatic_layout=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0440\u0430\u0437\u043C\u0435\u0449\u0435\u043D\u0438\u0435
automatic_layout_disabled=\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E
automatically_save_message=\u041A\u0430\u0440\u0442\u0430 \u0431\u044B\u043B\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 (\u0432 \u0444\u0430\u0439\u043B {0}) ...
+AutomaticEdgeColor.FOR_BRANCHES=\u0434\u043B\u044F \u0432\u0435\u0442\u0432\u0435\u0439
+AutomaticEdgeColor.FOR_COLUMNS=\u0434\u043B\u044F \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432
+AutomaticEdgeColor.FOR_LEVELS=\u0434\u043B\u044F \u0443\u0440\u043E\u0432\u043D\u0435\u0439
+AutomaticEdgeColor.ON_BRANCH_CREATION=\u043F\u043E \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044E \u0432\u0435\u0442\u0432\u0438
AutomaticEdgeColorHookAction.text=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0446\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
AutomaticLayout.ALL=\u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0443\u0437\u043B\u043E\u0432
AutomaticLayout.HEADINGS=\u0434\u043B\u044F \u043D\u0435\u043A\u0440\u0430\u0439\u043D\u0438\u0445 \u0443\u0437\u043B\u043E\u0432
@@ -147,6 +153,7 @@ AutomaticLayout.level.root=\u041A\u043E\u0440\u0435\u043D\u044C
AutomaticLayoutAction.text=&\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435
AutomaticLayoutAction.tooltip=<html>\u0424\u0438\u043A\u0441\u0438\u0440\u0443\u0435\u0442 \u0432\u0438\u0434 \u043A\u0430\u0440\u0442\u044B <br>\u0423\u0437\u043B\u044B \u043F\u0435\u0440\u0432\u043E\u0433\u043E \u0443\u0440\u043E\u0432\u043D\u044F \u0441\u0442\u0430\u043D\u0443\u0442 \u0447\u0435\u0440\u043D\u044B\u043C\u0438, \u0432\u0442\u043E\u0440\u043E\u0433\u043E - \u0441\u0438\u043D\u0438\u043C\u0438 \u0438 \u0442.\u0434.</html>
AutomaticLayoutControllerAction.ALL.text=\u0434\u043B\u044F \u0432\u0441\u0435\u0445 \u0443\u0437\u043B\u043E\u0432
+AutomaticLayoutControllerAction.COLUMNS.text=\u0434\u043B\u044F \u043A\u043E\u043B\u043E\u043D\u043D
AutomaticLayoutControllerAction.HEADINGS.text=\u0434\u043B\u044F \u043D\u0435\u043A\u0440\u0430\u0439\u043D\u0438\u0445 \u0443\u0437\u043B\u043E\u0432
AutomaticLayoutControllerAction.null.text=\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043E
BackAction.text=\u041D\u0430\u0437\u0430\u0434
@@ -163,10 +170,12 @@ branch=\u0412\u0435\u0442\u0432\u044C
browse=\u041E\u0431\u0437\u043E\u0440...
calendar_attributes_panel=\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044B
calendar_panel=\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u044C
+can_not_clone_encrypted_node=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043A\u043B\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0443\u0437\u043B\u044B
can_not_connect_to_info_server=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043A \u0441\u0435\u0440\u0432\u0435\u0440\u0443
can_not_delete_predefined_style=\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0435\u0434\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u0441\u0442\u0438\u043B\u044F
can_not_delete_root_style=\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0433\u043E \u0441\u0442\u0438\u043B\u044F
can_not_delete_style_group=\u041E\u0448\u0438\u0431\u043A\u0430 \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0433\u0440\u0443\u043F\u043F\u044B \u0441\u0442\u0438\u043B\u044F
+can_not_encrypt_cloned_node=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u0442\u044C \u043A\u043B\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u0443\u0437\u043B\u044B
can_not_save_key_set=\u041D\u0435 \u043C\u043E\u0433\u0443 \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u043D\u0430\u0431\u043E\u0440 \u0433\u043E\u0440\u044F\u0447\u0438\u0445 \u043A\u043B\u0430\u0432\u0438\u0448
cancel=&\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C
CancelAction.text=&\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C
@@ -174,6 +183,7 @@ cannot_add_parent_diff_parents=\u0414\u043B\u044F \u044D\u0442\u043E\u0439 \u043
cannot_add_parent_to_root=\u041A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u0443\u0437\u0435\u043B \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044C \u043F\u043E\u0434\u0447\u0438\u043D\u0451\u043D\u043D\u044B\u043C.
cannot_delete_root=\u041A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u0443\u0437\u0435\u043B \u043D\u0435\u043B\u044C\u0437\u044F \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0438\u043B\u0438 \u0432\u044B\u0440\u0435\u0437\u0430\u0442\u044C.
cannot_join_nodes_with_children=\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u044F\u0442\u044C \u0443\u0437\u043B\u044B \u0441 \u0438\u0445 \u043F\u043E\u0434\u0447\u0438\u043D\u0451\u043D\u043D\u044B\u043C\u0438 \u0443\u0437\u043B\u0430\u043C\u0438
+cannot_move_into_child_node=\u041D\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044F \u043F\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u0443\u0437\u0435\u043B
cannot_move_to_child=\u0423\u0437\u0435\u043B \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u043F\u0435\u0440\u0435\u043C\u0435\u0449\u0451\u043D \u0432 \u0441\u0432\u043E\u0439 \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u0443\u0437\u0435\u043B.
CenterAction.text=\u0426\u0435\u043D\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C
CenterSelectedNodeAction.text=\u0426\u0435\u043D\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u043E\u043C\u0435\u0447\u0435\u043D\u044B\u0439 \u0443\u0437\u0435\u043B
@@ -198,8 +208,10 @@ choose_node_background_color=\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u
choose_node_color=\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430 \u0443\u0437\u043B\u0430:
ClearLinkAnchorAction.text=\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u044F\u043A\u043E\u0440\u044C \u0441\u0441\u044B\u043B\u043A\u0438
ClearLinkAnchorAction.tooltip=<html>\u043E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044B\u0439 \u044F\u043A\u043E\u0440\u044C</html>
+CloneAction.text=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u043B\u043E\u043D
close_btn=&\u0417\u0430\u043A\u0440\u044B\u0442\u044C
CloseAction.text=&\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u043A\u0430\u0440\u0442\u0443
+cloud_shapes=\u0424\u0438\u0433\u0443\u0440\u044B \u043E\u0431\u043B\u0430\u043A\u043E\u0432
CloudAction.text=\u041E\u0431\u043B\u0430\u043A\u043E
CloudColorAction.text=\u0426\u0432\u0435\u0442 \u043E\u0431\u043B\u0430\u043A\u0430 ...
CloudShapeAction.ARC.text=\u0414\u0443\u0433\u0430
@@ -238,6 +250,7 @@ decrease_branch_font_size=\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C
DecreaseNodeFontAction.text=\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438
default=\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E
DefaultColorAction.text=\u0426\u0432\u0435\u0442 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E
+defaultstyle.attributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044B
defaultstyle.details=\u0421\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435 (\u0434\u0435\u0442\u0430\u043B\u0438)
defaultstyle.floating=\u041F\u043B\u0430\u0432\u0430\u044E\u0449\u0438\u0439 \u0443\u0437\u0435\u043B
defaultstyle.note=\u0417\u0430\u043C\u0435\u0442\u043A\u0430
@@ -355,6 +368,7 @@ ExternalImageChangeAction.text=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C
ExternalImageRemoveAction.text=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u043D\u0435\u0448\u043D\u0435\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435
ExtractLinkFromTextAction.text=\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0433\u0438\u043F\u0435\u0440\u0441\u0441\u044B\u043B\u043A\u0443 \u0432 \u0442\u0435\u043A\u0441\u0442
ExtractLinkFromTextAction.tooltip=\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0441\u0442 \u0432 \u0433\u0438\u043F\u0435\u0440\u0441\u0441\u044B\u043B\u043A\u0443
+extras=&\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E
f_button_unassigned=<\u043D\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F>
FaqOpenURLAction.text=\u0427\u0430\u0441\u0442\u043E \u0417\u0430\u0434\u0430\u0432\u0430\u0435\u043C\u044B\u0435 \u0412\u043E\u043F\u0440\u043E\u0441\u044B
file=&\u0424\u0430\u0439\u043B
@@ -385,7 +399,7 @@ FileRevisionsDialog.question=\u041E\u0431\u043D\u0430\u0440\u0443\u0436\u0435\u0
FileRevisionsDialog.restore=&\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C
FileRevisionsDialog.restore.tooltip=\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C {0} \u043D\u0430 {1}
FileRevisionsDialog.title=\u0412\u0435\u0440\u0441\u0438\u0438 \u0444\u0430\u0439\u043B\u0430
-filter=\u0424\u0438\u043B\u044C\u0442\u0440
+filter=\u0424&\u0438\u043B\u044C\u0442\u0440
filter_add=&\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C
filter_and=&\u0418
filter_any_text=\u0422\u0435\u043A\u0441\u0442, \u043F\u043E\u0434\u0440\u043E\u0431\u043D\u043E\u0441\u0442\u0438 \u0438\u043B\u0438 \u043F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u0435
@@ -435,11 +449,11 @@ filter_selected_node_view=\u0412\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B
filter_selected_node_view_snapshot=\u0421\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0439 \u0432\u044B\u0431\u043E\u0440
filter_style=\u0421\u0442\u0438\u043B\u044C
filter_time=\u0424\u0438\u043B\u044C\u0442\u0440 \u0434\u0430\u0442\u044B
-FilterComposerDialog.save=&\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C
filters_not_loaded=\u041D\u0435 \u043C\u043E\u0433\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440, \u0444\u0430\u0439\u043B \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0435\u043D
find_what=\u0418\u0441\u043A\u043E\u043C\u044B\u0439 \u0442\u0435\u043A\u0441\u0442
FindAction.text=\u0418\u0441\u043A\u0430\u0442\u044C...
-FirstGroupNodeAction.text=\u041D\u0430\u0447\u0430\u0442\u044C \u0433\u0440\u0443\u043F\u043F\u0443 \u0443\u0437\u043B\u043E\u0432
+FindNextAction.text=\u041D\u0430\u0439\u0442\u0438 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0435\u0435
+FindPreviousAction.text=\u041D\u0430\u0439\u0442\u0438 \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0435\u0435
fit_map_to_page=&\u0423\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435
fit_map_to_page_height=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C &\u0432\u044B\u0441\u043E\u0442\u0443 \u0432 \u043E\u0434\u043D\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443
fit_map_to_page_width=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C &\u0448\u0438\u0440\u0438\u043D\u0443 \u0432 \u043E\u0434\u043D\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443
@@ -455,6 +469,7 @@ FollowLinkAction.text=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043F\u043E \u
font=\u0428\u0440\u0438\u0444\u0442
FontFamilyAction.text=\u0428\u0440\u0438\u0444\u0442
FontSizeAction.text=\u0420\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
+format=\u0424&\u043E\u0440\u043C\u0430\u0442
format_invalid_pattern=\u041D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0439 \u0448\u0430\u0431\u043B\u043E\u043D
format_menu_cloud_shapes=\u041E\u0431\u043B\u0430\u043A\u043E
format_menu_edge_styles=\u0422\u0438\u043F &\u0440\u0435\u0431\u0440\u0430
@@ -500,7 +515,7 @@ GrabKeyDialog.grab-key.remove=\u0423\u0434\u0430\u043B\u0438\u0442\u044C
GrabKeyDialog.grab-key.remove-ask=\u0412\u044B \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448\u0438?
GrabKeyDialog.grab-key.title=\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u043D\u043E\u0432\u0443\u044E \u043A\u043B\u0430\u0432\u0438\u0448\u0443
green=\u0417\u0435\u043B\u0451\u043D\u044B\u0439
-help=\u041F\u043E&\u043C\u043E\u0449\u044C
+help=\u041F\u043E\u043C\u043E\u0449\u044C
HideableAction.tooltip=<html>\u041E\u0442\u043C\u0435\u0447\u0430\u0435\u0442 \u0444\u043E\u043D \u0438\u0437\u043C\u0435\u043D\u0451\u043D\u043D\u043E\u0433\u043E \u0443\u0437\u043B\u0430.</html>
HideAllAttributesAction.text=\u0421\u043F\u0440\u044F\u0442\u0430\u0442\u044C \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044B
HierarchicalIcons2Action.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043D\u0438\u044F \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0445 \u043F\u0438\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u043C
@@ -648,7 +663,7 @@ IconSelectionPlugin.text=\u0412\u044B\u0431\u043E\u0440 \u043F\u0438\u043A\u0442
IconSelectionPlugin.tooltip=<html>\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043E\u043A\u043D\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u043F\u0438\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u043C\u044B</html>
image_covertLink=\u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u043E\u0432\u0430\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u0432 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435
ImageFlavorHandler=\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 (\u0438\u0437 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0430)
-import=\u0418\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C
+import=&\u0418\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C
import_linked_branch_no_link=\u0412\u044B\u0431\u0440\u0430\u043D\u043D\u044B\u0439 \u0443\u0437\u0435\u043B \u043D\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044B\u043B\u043A\u0438 \u043D\u0430 \u043A\u0430\u0440\u0442\u0443, \u043F\u0440\u0438\u0433\u043E\u0434\u043D\u0443\u044E \u0434\u043B\u044F \u0438\u043C\u043F\u043E\u0440\u0442\u0430.
ImportAction.text=&\u0418\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C
ImportBranchAction.text=\u0418\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0432\u0435\u0442\u0432\u044C \u0438\u0437 (mm-) \u0444\u0430\u0439\u043B\u0430...
@@ -668,7 +683,6 @@ invalid_url_msg=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0437\u0434\u0
ItalicAction.text=\u041A\u0443\u0440\u0441\u0438\u0432
italicise_branch=\u0428\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438 \u043A\u0443\u0440\u0441\u0438\u0432
java_version=\u0412\u0435\u0440\u0441\u0438\u044F Java: {0}
-JoinNodesAction.text=\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u0443\u0437\u043B\u044B
latex_editor=\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0444\u043E\u0440\u043C\u0443\u043B\u0443 LaTex
LatexDeleteLatexAction.text=\u0423\u0434\u0430\u043B\u0438\u0442\u044C LaTe&X \u0444\u043E\u0440\u043C\u0443\u043B\u0443
LatexEditLatexAction.text=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C &LaTeX \u0444\u043E\u0440\u043C\u0443\u043B\u0443...
@@ -676,12 +690,18 @@ LatexInsertLatexAction.msg1=<html>\u0412\u044B \u043F\u044B\u0442\u0430\u0435\u0
LatexInsertLatexAction.msg2=<html>\u0412 \u043A\u0440\u0430\u0434\u0446\u0435: <ul><li>\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043F\u0440\u0435\u0444\u0438\u043A\u0441 "\\latex " \u0432 \u0442\u0435\u043A\u0441\u0442\u0435 \u0443\u0437\u043B\u0430 \u0438\u043B\u0438</li><li><i>\u0412\u0438\u0434 -> \u041F\u0430\u043D\u0435\u043B\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F </i>, \u0437\u0430\u0442\u0435\u043C <i> [...]
LatexInsertLatexAction.text=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C &LaTeX \u0444\u043E\u0440\u043C\u0443\u043B\u0443...
latexPatternFormat=LaTeX
+LengthUnits.cm=\u0441\u043C
+LengthUnits.in=\u0434\u044E\u0439\u043C
+LengthUnits.mm=\u043C\u043C
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=\u0427\u0442\u043E\u0431\u044B \u043D\u0430\u0440\u0438\u0441\u043E\u0432\u0430\u0442\u044C \u0441\u0432\u044F\u0437\u044C, \u0432\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043C\u0438\u043D\u0438\u043C\u0443\u043C \u0434\u0432\u0430 \u0443\u0437\u043B\u0430.
license=\u041B\u0438\u0446\u0435\u043D\u0437\u0438\u044F
license_text=<html>\u042D\u0442\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043C\u0430 \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u043E; \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044C \u0435\u0435 \u0438/\u0438\u043B\u0438<br>\u0438\u0437\u043C\u0435\u043D\u044F\u0442\u044C \u043D\u0430 \u0443\u0441\u043B\u043E\u0432\ [...]
link_error=\u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u0441\u0441\u044B\u043B\u043A\u0430 "{0}" \u043D\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u0430
link_not_available_any_more=\u0421\u0432\u044F\u0437\u044C \u043D\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043B\u044C\u043D\u0430. \u0423\u0437\u0435\u043B \u0431\u044B\u043B \u0443\u0434\u0430\u043B\u0435\u043D.
link_not_found=\u0421\u0441\u044B\u043B\u043A\u0430 {0} \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430.
+links=\u0421\u0441\u044B\u043B\u043A\u0438
load=&\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C
load_accelerator_presets=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C
LoadAcceleratorPresetsAction.textPatterns.text=\u0428\u0430\u0431\u043B\u043E\u043D\u044B \u0442\u0435\u043A\u0441\u0442\u0430
@@ -746,7 +766,6 @@ map_locked_by_save_as=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u044
map_not_saved=\u042D\u0442\u0430 \u043A\u0430\u0440\u0442\u0430 \u043D\u0435 \u0431\u044B\u043B\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 \u0440\u0430\u043D\u0435\u0435.
MapBackgroundColorAction.text=\u0424\u043E\u043D \u043A\u0430\u0440\u0442\u044B
MaxNodeWidth.text=\u0417\u0430\u0434\u0430\u0442\u044C \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0443\u044E \u0448\u0438\u0440\u0438\u043D\u0443 \u0443\u0437\u043B\u0430
-MaxNodeWidthAction.text=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0443\u044E \u0448\u0438\u0440\u0438\u043D\u0443 \u0443\u0437\u043B\u0430
menu_applyStyle=\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u0442\u0438\u043B\u044C
menu_attributes=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C &\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044B
menu_clouds=\u041E\u0431\u043B\u0430\u043A\u0430
@@ -757,10 +776,6 @@ menu_displayAttributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044B \u0443\u
menu_encryption=\u0428\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435
menu_error=\u041E\u0448\u0438\u0431\u043A\u0430 \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u0433\u043E \u043C\u0435\u043D\u044E {0}:\n{1}\n\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0435
menu_extensions=\u0420\u0430\u0437\u0448\u0438\u0440\u0435\u043D\u0438\u044F \u0443\u0437\u043B\u0430
-menu_extras=&\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E
-menu_file_import=&\u0418\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C
-menu_filter=\u0424&\u0438\u043B\u044C\u0442\u0440
-menu_format=\u0424&\u043E\u0440\u043C\u0430\u0442
menu_group=\u0413\u0440\u0443\u043F\u043F\u0430 \u0443\u0437\u043B\u043E\u0432
menu_hoverView=\u0412\u0441\u043F\u043B\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u043F\u043E\u0434\u0441\u043A\u0430\u0437\u043A\u0438
menu_iconByCategory=\u0418\u043A\u043E\u043D\u043A\u0438 \u043F\u043E \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u044F\u043C...
@@ -768,26 +783,20 @@ menu_iconView=\u0418\u043A\u043E\u043D\u043A\u0438
menu_image=\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435
menu_insert=\u0412\u0441\u0442&\u0430\u0432\u043A\u0430
menu_latex_formula=\u0424\u043E\u0440\u043C\u0443\u043B\u0430 LaTeX
-menu_links=\u0421\u0441\u044B\u043B\u043A\u0438
menu_manageStyles=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0441\u0442\u0438\u043B\u044F\u043C\u0438
menu_moveNode=\u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0430
-menu_navigate=&\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F
menu_newNode=\u041D\u043E\u0432\u044B\u0439 \u0443\u0437\u0435\u043B
menu_node=\u0423\u0437\u0435\u043B
menu_node_features=&\u0424\u0443\u043D\u043A\u0446\u0438\u0438 \u0443\u0437\u043B\u0430
menu_nodes=&\u0423\u0437\u043B\u044B
menu_nodeView=\u042F\u0434\u0440\u043E \u0443\u0437\u043B\u0430
-menu_notes=\u0417\u0430\u043C\u0435\u0442\u043A\u0430
menu_noteView=\u0417\u0430\u043C\u0435\u0442\u043A\u0438
menu_openmaps=\u041A\u0430\u0440\u0442\u044B
-menu_progress=\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435
menu_remove_icons=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0438\u043A\u043E\u043D\u043A\u0438
menu_removeAttribute=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0430\u0442\u0440\u0438\u0431\u0443\u0442
menu_select=\u0412\u044B\u0431\u0440\u0430\u0442\u044C
menu_time=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u0435\u043C
menu_title=\u042F\u0434\u0440\u043E \u0443\u0437\u043B\u0430
-menu_toolbars=\u041F\u0430\u043D\u0435\u043B\u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432
-menu_view=&\u0412\u0438\u0434
menu_viewmode=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u044B \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F
MenuUtils.invalid_menuitem={0} - \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u044B\u0439 \u043A\u043B\u044E\u0447 \u043F\u0443\u043D\u043A\u0442\u0430 \u043C\u0435\u043D\u044E.
mindmap=\u0410\u0441\u0441\u043E\u0446\u0438\u0430\u0442\u0438\u0432\u043D\u0430\u044F \u043A\u0430\u0440\u0442\u0430
@@ -809,6 +818,7 @@ ModesMenuAction.MindMap.text=\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u
most_recent_files=&\u041D\u0435\u0434\u0430\u0432\u043D\u0438\u0435 \u0444\u0430\u0439\u043B\u044B
MoveToRootAction.text=\u0412\u044B\u0434\u0435\u043B\u0438\u0442\u044C \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u0443\u0437\u0435\u043B
NameConditionAction.text=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0438\u043C\u044F
+navigate=&\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F
NavigationNextMapAction.text=\u0421\u043B\u0435\u0434\u0443\u044E\u0449\u0430\u044F \u043A\u0430\u0440\u0442\u0430
NavigationPreviousMapAction.text=\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0430\u044F \u043A\u0430\u0440\u0442\u0430
new=&\u0421\u043E\u0437\u0434\u0430\u0442\u044C
@@ -829,7 +839,6 @@ NewerFileRevisionsFoundDialog.question=\u041D\u0430\u0439\u0434\u0435\u043D\u043
NewerFileRevisionsFoundDialog.restore=\u0412\u043E&\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C
NewerFileRevisionsFoundDialog.restore.tooltip=\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C {0} \u043D\u0430 {1}
NewerFileRevisionsFoundDialog.title=\u041E\u0431\u043D\u043E\u0440\u0443\u0436\u0435\u043D\u0430 \u043D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F \u0444\u0430\u0439\u043B\u0430!
-NewFreeNodeAction.text=\u041D\u043E\u0432\u044B\u0439 \u0441\u0432\u043E\u0431\u043E\u0434\u043D\u044B\u0439 \u0443\u0437\u0435\u043B
NewLevelStyleAction.text=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0441\u043A\u0438\u0439 \u0441\u0442\u0438\u043B\u044C \u0443\u0440\u043E\u0432\u043D\u044F
newmap.install.addon.question={0} \u043F\u043E\u0445\u043E\u0436 \u043D\u0430 \u043F\u0430\u043A\u0435\u0442 \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F\n\u0411\u0443\u0434\u0435\u0442\u0435 \u0435\u0433\u043E \u0443\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0442\u044C?\n(\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 "\u041D\u0435\u0442", \u0447\u0442\u043E\u0431\u044B \u043F\u0440\u043E\u0441\u0442\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u044C \ [...]
newmap.install.addon.title=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0434\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435?
@@ -872,13 +881,13 @@ NodeListAction.tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432\u
NodeShapeAction.bubble.text=\u0422\u0438\u043F \u0443\u0437\u043B\u0430 "&\u041E\u0432\u0430\u043B"
NodeShapeAction.fork.text=\u0422\u0438\u043F \u0443\u0437\u043B\u0430 "&\u041A\u0440\u0438\u0432\u0430\u044F"
NodeUpAction.text=\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u0432\u0432\u0435\u0440\u0445
-NodeWidthAction.text=\u0417\u0430\u0434\u0430\u0442\u044C \u043F\u0440\u0435\u0434\u0435\u043B\u044B \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F \u0448\u0438\u0440\u0438\u043D\u044B \u0443\u0437\u043B\u0430
nonboldify_branch=\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u043E\u043B\u0443\u0436\u0438\u0440\u043D\u043E\u0435 \u043D\u0430\u0447\u0435\u0440\u0442\u0430\u043D\u0438\u0435
nonitalicise_branch=\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E\u0435 \u043D\u0430\u0447\u0435\u0440\u0442\u0430\u043D\u0438\u0435
normal=\u041E\u0431\u044B\u0447\u043D\u044B\u0439
not_saved_for_image_error=\u041A\u0430\u0440\u0442\u0430 \u0434\u043E\u043B\u0436\u0430 \u0431\u044B\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 \u043F\u0435\u0440\u0435\u0434 \u0442\u0435\u043C \u043A\u0430\u043A \u0432\u044B \u0441\u043C\u043E\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435 \u0438\u0437 \u0444\u0430\u0439\u043B\u0430
not_saved_for_link_error=\u041A\u0430\u0440\u0442\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0430 \u043F\u0435\u0440\u0435\u0434 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435\u043C \u0444\u0430\u0439\u043B\u043E\u0432\u043E\u0439 \u0441\u0441\u044B\u043B\u043A\u0438
note_window_location=\u041F\u043E\u043B\u043E\u0436\u0435\u043D\u0438\u0435 \u043F\u0440\u0438\u043C\u0435\u0447\u0430\u043D\u0438\u0439
+notes=\u0417\u0430\u043C\u0435\u0442\u043A\u0430
ok=&\u041E\u041A
OKAction.text=&\u041E\u041A
OnlineReference.text=\u041E\u043D\u043B\u0430\u0439\u043D \u043A\u0430\u0440\u0442\u044B \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0438
@@ -1110,8 +1119,6 @@ OptionPanel.nodeformat=\u0424\u043E\u0440\u043C\u0430\u0442
OptionPanel.nodeformat.tooltip=<html>\u0417\u0430\u043C\u0435\u043D\u0430 \u0438/\u0438\u043B\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430:<ul><li><em>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u0448\u0430\u0431\u043B\u043E\u043D\u0430</em> (<tt>%s</tt> \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442), \u0442.\u0435. <tt>\u0412\u041D\u0418\u041C\u0410\u041 [...]
OptionPanel.nodenumbering=\u041D\u0443\u043C\u0435\u0440\u0430\u0446\u0438\u044F \u0443\u0437\u043B\u043E\u0432
OptionPanel.nodenumbering.tooltip=\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043F\u043E\u0440\u044F\u0434\u043A\u043E\u0432\u044B\u0439 \u043D\u043E\u043C\u0435\u0440 (\u0442.\u0435. 1.3.1) \u0432 \u0442\u0435\u043A\u0441\u0442 \u0443\u0437\u043B\u0430.
-OptionPanel.nodeshape=\u0421\u0442\u0438\u043B\u044C \u0443\u0437\u043B\u0430
-OptionPanel.nodeshape.tooltip=<html>\u0421\u0442\u0438\u043B\u044C \u043E\u043F\u0438\u0441\u044B\u0432\u0430\u0435\u0442 \u0432\u043D\u0435\u0448\u043D\u044E\u044E \u0444\u043E\u0440\u043C\u0443 \u0443\u0437\u043B\u0430. <br>\u0412\u043E\u0437\u043C\u043E\u0436\u043D\u044B\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F:<br><table border="1"><tr><td>\u0432\u0435\u0442\u043A\u0430: </td><td>\u0431\u0435\u0437 \u043E\u043A\u0440\u0443\u0436\u0430\u044E\u0449\u0435\u0439 \u0440\u043 [...]
OptionPanel.nodetext=\u0422\u0435\u043A\u0441\u0442 \u0443\u0437\u043B\u0430
OptionPanel.nodetext.tooltip=\u0417\u0434\u0435\u0441\u044C \u043C\u043E\u0436\u043D\u043E \u0432\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u043A\u0441\u0442 \u0443\u0437\u043B\u0430. \u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043C\u0435\u043D\u0451\u043D \u043D\u0430 \u043D\u043E\u0432\u044B\u0439.
OptionPanel.nothing=\u041D\u0438\u0447\u0435\u0433\u043E
@@ -1415,6 +1422,7 @@ PrintAction.text=&\u041F\u0435\u0447\u0430\u0442\u044C...
PrintDirectAction.text=\u041D\u0430\u043F\u0435\u0447\u0430\u0442\u0430\u0442\u044C
printing_settings=\u041C\u0430\u0441\u0448\u0442\u0430\u0431 \u043F\u0435\u0447\u0430\u0442\u0438
PrintPreviewAction.text=\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440...
+progress=\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435
PropertyAction.dialog=\u0423\u0441\u0442\u0430\u043D\u0432\u043E\u043A\u0438
PropertyAction.text=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0438 ...
QuickFilterAction.text=\u0411\u044B\u0441\u0442\u0440\u044B\u0439 \u0444\u0438\u043B\u044C\u0442\u0440
@@ -1461,6 +1469,7 @@ ResetNodeLocationAction.text=\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0
ResetStyleAction.text=\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u0439 \u0441\u0442\u0438\u043B\u044C \u0443\u0437\u043B\u0430
RevertAction.text=&\u0412\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0438\u0437 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0439 \u0438\u0441\u0442\u043E\u0440\u0438\u0438
RevisionPluginAction.text=\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0446\u0432\u0435\u0442 &\u0444\u043E\u043D\u0430 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439
+save=&\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C
save_failed=\u041F\u043E\u043F\u044B\u0442\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u043A\u0430\u0440\u0442\u044B {0} \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C.
save_unsaved=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0443\u044E \u043A\u0430\u0440\u0442\u0443?
save_unsaved_styles=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0441\u0442\u0438\u043B\u0438?
@@ -1599,7 +1608,7 @@ simplyhtml.formatParaLabel=\u041F\u0430\u0440\u0430\u0433\u0440\u0430\u0444...
simplyhtml.formatParaTip=\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u0440\u0430\u0433\u0440\u0430\u0444
simplyhtml.formatTableLabel=\u0422\u0430\u0431\u043B\u0438\u0446\u0430...
simplyhtml.formatTableTip=\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0430\u0431\u043B\u0438\u0446\u0443
-simplyhtml.helpLabel=\u041F\u043E&\u043C\u043E\u0449\u044C
+simplyhtml.helpLabel=\u041F\u043E\u043C\u043E\u0449\u044C
simplyhtml.htmlTabTitle=HTML \u041A\u043E\u0434
simplyhtml.imageFileDesc=\u0424\u0430\u0439\u043B \u0441 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435\u043C
simplyhtml.insertTableColLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0442\u043E\u043B\u0431\u0435\u0446
@@ -1649,7 +1658,7 @@ simplyhtml.pasteLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C
simplyhtml.pastePlainTextLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u043D\u0435\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442
simplyhtml.pasteTip=\u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044C
simplyhtml.plainName=\u043E\u0431\u044B\u0447\u043D\u044B\u0439
-simplyhtml.previewLabel=\u041F&\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C
+simplyhtml.previewLabel=\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C
simplyhtml.previewText=\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u0442\u0435\u043A\u0441\u0442
simplyhtml.prevTableCellLabel=\u041F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0430\u044F \u043A\u043B\u0435\u0442\u043A\u0430
simplyhtml.printLabel=\u041F\u0435\u0447\u0430\u0442\u044C...
@@ -1706,7 +1715,7 @@ simplyhtml.wholeWordsOnly=\u0422\u043E\u043B\u044C\u043A\u043E \u0441\u043B\u043
simplyhtml.wholeWordsOnly.tooltip=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0442\u044C \u0441\u043E\u0432\u043F\u0430\u0434\u0435\u043D\u0438\u044F \u0446\u0435\u043B\u044B\u043C\u0438 \u0441\u043B\u043E\u0432\u0430\u043C\u0438.
SortNodes.text=\u0423\u043F\u043E\u0440\u044F\u0434\u043E\u0447\u0438\u0442\u044C \u0443\u0437\u043B\u044B
SortNodes.tooltip=\u0423\u043F\u043E\u0440\u044F\u0434\u043E\u0447\u0438\u0442\u044C \u0432\u0441\u0435 \u043F\u043E\u0434\u0447\u0438\u043D\u0451\u043D\u043D\u044B\u0435 \u0443\u0437\u043B\u044B \u043F\u043E \u0430\u043B\u0444\u0430\u0432\u0438\u0442\u0443.
-split=\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u044C
+split=&\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u044C
SplitConditionAction.text=\u0420\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u044C
SplitNode.text=&\u0420\u0430\u0437\u0431\u0438\u0442\u044C \u0443\u0437\u0435\u043B
SplitNode.tooltip=<html>\u0421\u0434\u0435\u043B\u0430\u0442\u044C \u0438\u0437 \u043A\u0430\u0436\u0434\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0438 \u0443\u0437\u043B\u0430 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u0443\u0437\u0435\u043B</html>
@@ -1746,7 +1755,6 @@ styles_menu=\u0421\u0442\u0438\u043B\u0438
submenu_keystroke_in_use_error=\u0421\u043E\u0447\u0435\u0442\u0430\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 {0} \u043D\u0435 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u043E \u0434\u043B\u044F \u043F\u043E\u0434\u043C\u0435\u043D\u044E {1}. \u041D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u043A\u043B\u0430\u0432\u0438\u0448 \u0443\u0431\u0440\u0430\u043D\u043E.
summary_nodes=\u0423\u0437\u043B\u044B \u0438\u0442\u043E\u0433\u043E\u0432
summary_not_possible=\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0441\u0432\u043E\u0434\u043D\u043E\u0433\u043E \u0443\u0437\u043B\u0430 \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u0438\u044F
-SummaryNodeAction.text=\u0421\u0432\u043E\u0434\u043D\u044B\u0439 \u0443\u0437\u0435\u043B
svg=SVG
template_dir=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 \u0448\u0430\u0431\u043B\u043E\u043D
TimeListAction.text=&\u0420\u0430\u0441\u043F\u0438\u0441\u0430\u043D\u0438\u0435...
@@ -1763,6 +1771,7 @@ ToggleMenubarAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C/\u0441
ToggleScrollbarsAction.text=\u041F\u043E\u043B\u043E\u0441\u044B \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438
ToggleStatusAction.text=\u041E\u0442\u043E\u0431\u0440\u0430\u0436\u0430\u0442\u044C \u0441\u0442\u0440\u043E\u043A\u0443 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F
ToggleToolbarAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C/\u0441\u043F\u0440\u044F\u0442\u0430\u0442\u044C \u0432\u0435\u0440\u0445\u043D\u044E\u044E \u043F\u0430\u043D\u0435\u043B\u044C \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432
+toolbars=\u041F\u0430\u043D\u0435\u043B\u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432
undefined_error=\u041D\u0435\u043E\u0436\u0438\u0434\u0430\u043D\u043D\u0430\u044F \u043E\u0448\u0438\u0431\u043A\u0430. \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0441\u043E\u043E\u0431\u0449\u0438\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A\u0430\u043C \u0447\u0435\u0440\u0435\u0437 \u0444\u043E\u0440\u0443\u043C.
underline=\u041F\u043E\u0434\u0447\u0451\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u0435
UnderlineAction.text=\u041F\u043E\u0434\u0447\u0451\u0440\u043A\u0438\u0432\u0430\u043D\u0438\u0435
@@ -1803,7 +1812,7 @@ user_template_dir=\u0428\u0430\u0431\u043B\u043E\u043D\u044B \u043F\u043E\u043B\
user_zoom=\u041C\u0430\u0441\u0448\u0442\u0430\u0431 \u043F\u0435\u0447\u0430\u0442\u0438 (0.0 - 2.0):
value_format=\u0424\u043E\u0440\u043C\u0430\u0442 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F
version_up_to_date=\u0412\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0432\u0435\u0440\u0441\u0438\u044E
-ViewerControllerAction.text=\u0412\u043D\u0435\u0448\u043D\u0438\u0439 \u043E\u0431\u044A\u0435\u043A\u0442...
+view=&\u0412\u0438\u0434
ViewLayoutTypeAction.OUTLINE.text=\u0421\u0445\u0435\u043C\u0430\u0442\u0438\u0447\u043D\u044B\u0439 \u0432\u0438\u0434
WebDocuAction.text=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044F \u0432 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0435
width=\u0428\u0438\u0440\u0438\u043D\u0430
@@ -1818,5 +1827,6 @@ xslt_export.ms_word=XML \u0444\u043E\u0440\u043C\u0430\u0442 MS Word 2003
xslt_export.text=\u041E\u0431\u044B\u0447\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442
xslt_export_not_possible=\u042D\u043A\u0441\u043F\u043E\u0440\u0442 \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 XSLT \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u0435\u043D
yes=\u0414\u0430
+zoom=\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0435
ZoomInAction.text=\u041F\u0440\u0438\u0431\u043B\u0438\u0437\u0438\u0442\u044C
ZoomOutAction.text=\u041E\u0442\u0434\u0430\u043B\u0438\u0442\u044C
diff --git a/freeplane/resources/translations/Resources_sk.properties b/freeplane/resources/translations/Resources_sk.properties
index 22ecdf4..3ce48ef 100644
--- a/freeplane/resources/translations/Resources_sk.properties
+++ b/freeplane/resources/translations/Resources_sk.properties
@@ -150,12 +150,13 @@ ExportToImage.png.text=Ako PNG...
ExportToOoWriter.text=Ako dokument programu OpenOffice Writer...
ExportToOoWriter.tooltip=Rozbalen\u00E9 uzly tvoria \u0161trukt\u00FAru, zbalen\u00E9 uzly tvoria obsah dokumentu.
extension_menu=Fyzick\u00FD \u0161t\u00FDl
+extras=N\u00E1stroje
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=Ot\u00E1zky
file=S\u00FAbor
file_already_exists=S\u00FAbor {0} u\u017E existuje. Chcete ho prep\u00EDsa\u0165?
file_not_found=S\u00FAbor {0} sa nena\u0161iel
-filter=Filter
+filter=Filter[translate me]
filter_add=Pridaj
filter_and=A
filter_conditions=Filtre
@@ -190,6 +191,7 @@ FollowLinkAction.text=Otvor hyperlinku:
font=P\u00EDsmo
FontFamilyAction.text=typ p\u00EDsma
FontSizeAction.text=ve\u013Ekos\u0165 p\u00EDsma
+format=Form\u00E1t
format_menu_edge_styles=\u0160t\u00FDly hr\u00E1n
format_menu_edge_widths=Hr\u00FAbky hr\u00E1n
FormatCopy.text=Kop\u00EDruj form\u00E1t
@@ -295,7 +297,7 @@ IconGroupPopupAction.docs_folders.text=Docs & Folders[translate me]
IconGroupPopupAction.smiley.text=Smiley[translate me]
IconSelectionPlugin.text=Vyber ikonu...
IconSelectionPlugin.tooltip=<html>Tu m\u00F4\u017Eete vybra\u0165 ikonu pomocou podokna.</html>
-import=Import
+import=Importuj
import_linked_branch_no_link=Ozna\u010Den\u00FD uzol nem\u00E1 linku, z ktorej by sa dalo importova\u0165.
ImportAction.text=Importuj
ImportBranchAction.text=Vetva...
@@ -308,7 +310,6 @@ increase_branch_font_size=V\u00E4\u010D\u0161ie p\u00EDsmo
IncreaseNodeFontAction.text=V\u00E4\u010D\u0161ie p\u00EDsmo
ItalicAction.text=Kurz\u00EDva
italicise_branch=Zme\u0148 na kurz\u00EDvu
-JoinNodesAction.text=Spoj uzly
less_than_two_selected_nodes=Aby ste dostali linky, mus\u00EDte vybra\u0165 aspo\u0148 dva uzly.
link_not_available_any_more=T\u00E1to linka u\u017E neplat\u00ED. Uzol bol medzi\u010Dasom zmazan\u00FD.
link_not_found=Nena\u0161la sa linka {0}.
@@ -324,13 +325,7 @@ map_locked_by_open=Mapu {0} u\u017E edituje pou\u017E\u00EDvate\u013E {1}. Otv\u
map_locked_by_save_as=Mapu {0} edituje pou\u017E\u00EDvate\u013E {1}. Akcia Ulo\u017E ako zru\u0161en\u00E1.
map_not_saved=T\u00E1to mapa e\u0161te nebola ulo\u017Een\u00E1.
menu_attributes=Vlastnosti
-menu_extras=N\u00E1stroje
-menu_file_import=Importuj
-menu_filter=Filter[translate me]
-menu_format=Form\u00E1t
menu_insert=Vlo\u017E
-menu_navigate=Naviguj
-menu_view=Poh\u013Ead
mindmap=Mapa
mindmaps=Mapy
mindmaps_desc=Mapy (*.mm)
@@ -341,6 +336,7 @@ modes=Re\u017Eimy
ModesMenuAction.MindMap.text=Mind Map Editor[translate me]
most_recent_files=Naposledy pou\u017Eit\u00E9 s\u00FAbory
MoveToRootAction.text=Presu\u0148 na kore\u0148
+navigate=Naviguj
NavigationNextMapAction.text=\u010Eal\u0161ia mapa
NavigationPreviousMapAction.text=Predch\u00E1dzaj\u00FAca mapa
new_mindmap=Nov\u00E1 mapa my\u0161lienok
@@ -485,7 +481,6 @@ OptionPanel.nodefontbold=Tu\u010Dn\u00E9 p\u00EDsmo
OptionPanel.nodefontitalic=Kurz\u00EDva
OptionPanel.nodefontname=P\u00EDsmo uzla
OptionPanel.nodefontsize=P\u00EDsmo uzla
-OptionPanel.nodeshape=\u0160t\u00FDl uzla
OptionPanel.nodetext=Text uzla
OptionPanel.nothing=Ni\u010D
OptionPanel.number_of_different_files_for_automatic_save=Po\u010Det r\u00F4znych s\u00FAborov pri automatickom ukladan\u00ED
@@ -675,7 +670,7 @@ simplyhtml.replaceYes=\u00C1no
simplyhtml.styleLabel=\u0160t\u00FDl
simplyhtml.uLineLabel=Pod\u010Diarkni
simplyhtml.undoLabel=Sp\u00E4\u0165
-split=Rozde\u013E
+split=&Rozde\u013E
style=\u0160t\u00FDl
svg=SVG[translate me]
TimeListAction.text=Zobraz zoznam pl\u00E1nova\u010Da \u010Dasu...
@@ -704,6 +699,7 @@ UsePlainTextAction.text=Pou\u017Ei \u010Dist\u00FD text
user_defined_zoom=Zadan\u00FD u\u017E\u00EDvate\u013Eom.
user_defined_zoom_status_bar=Men\u00EDm zaostrenie na hodnotu zadan\u00FA u\u017E\u00EDvate\u013Eom: {0}%.
user_zoom=Zadajte koeficient zaostrenia (0.0 - 2.0):
+view=Poh\u013Ead
width=\u0160\u00EDrka
yes=\u00C1no
ZoomInAction.text=Zv\u00E4\u010D\u0161i zaostrenie
diff --git a/freeplane/resources/translations/Resources_sl.properties b/freeplane/resources/translations/Resources_sl.properties
index a7a10ea..c34b8b3 100644
--- a/freeplane/resources/translations/Resources_sl.properties
+++ b/freeplane/resources/translations/Resources_sl.properties
@@ -167,12 +167,13 @@ ExportToImage.png.text=Kot PNG ...
ExportToOoWriter.text=Kot dokument OpenOffice.org Writer ...
ExportToOoWriter.tooltip=Neprepognjena vozli\u0161\u010Da oblikujejo strukturo, prepognjena vozli\u0161\u010Da pa vsebino dokumenta.
extension_menu=Fizi\u010Dni slog
+extras=Orodja
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=Pogosto zastavljena vpra\u0161anja (FAQ)
file=Datoteka
file_already_exists=Datoteka {0} \u017Ee obstaja. Jo \u017Eelite prepisati?
file_not_found=Datoteke {0} ni mo\u010D najti
-filter=filter
+filter=Filter[translate me]
filter_add=dodaj
filter_and=in
filter_conditions=Filtri
@@ -207,6 +208,7 @@ FollowLinkAction.text=Follow Link[translate me]
font=Pisava
FontFamilyAction.text=dru\u017Eina pisav
FontSizeAction.text=velikost pisave
+format=Oblika
format_menu_edge_styles=Slogi robov
format_menu_edge_widths=\u0160irine robov
FormatCopy.text=Kopiraj obliko
@@ -336,7 +338,6 @@ increase_branch_font_size=Ve\u010Dja pisava
IncreaseNodeFontAction.text=Ve\u010Dja pisava
ItalicAction.text=Le\u017Ee\u010De
italicise_branch=Zale\u017Ei
-JoinNodesAction.text=Zdru\u017Ei vozli\u0161\u010Da
less_than_two_selected_nodes=Izbrati morate vsaj dve vozli\u0161\u010Di, da bi dobili povezave.
link_not_available_any_more=Povezava ni ve\u010D veljavna. Medtem je bilo vozli\u0161\u010De \u017Ee izbrisano.
link_not_found=Povezave {0} ni mogo\u010De najti.
@@ -353,13 +354,7 @@ map_locked_by_open=Miselni vzorec {0} je \u017Ee urejevan s strani uporabnika {1
map_locked_by_save_as=Miselni vzorec {0} je \u017Ee urejevan s strani uporabnika {1}. Akcija Shrani kot je prekinjena.
map_not_saved=Miselni vzorec prej ni bil shranjen.
menu_attributes=Atributi
-menu_extras=Orodja
-menu_file_import=Uvozi
-menu_filter=Filter[translate me]
-menu_format=Oblika
menu_insert=Vstavi
-menu_navigate=Krmar
-menu_view=Pogled
mindmap=Miselni vzorec
mindmaps=Miselni vzorci
mindmaps_desc=Miselni vzorci (*.mm)
@@ -376,6 +371,7 @@ ModesMenuAction.File.text=File Explorer[translate me]
ModesMenuAction.MindMap.text=Mind Map Editor[translate me]
most_recent_files=Zadnje odprte datoteke
MoveToRootAction.text=Premakni k korenskemu vozli\u0161\u010Du
+navigate=Krmar
NavigationNextMapAction.text=Naslednji vzorec
NavigationPreviousMapAction.text=Prej\u0161nji vzorec
new_mindmap=Nov miselni vzorec
@@ -542,8 +538,6 @@ OptionPanel.nodefontbold=Krepka pisava
OptionPanel.nodefontitalic=Le\u017Ee\u010Da pisava
OptionPanel.nodefontname=Pisava vozli\u0161\u010Da
OptionPanel.nodefontsize=Pisava vozli\u0161\u010Da
-OptionPanel.nodeshape=Slog vozli\u0161\u010Da
-OptionPanel.nodeshape.tooltip=nodeshape.tooltip
OptionPanel.nodetext=Besedilo voli\u0161\u010Da
OptionPanel.nodetext.tooltip=nodetext.tooltip
OptionPanel.nothing=ni\u010D
@@ -931,7 +925,7 @@ simplyhtml.valignTop=na vrh
simplyhtml.wholeWordsOnly=Samo cele besede
SortNodes.text=Razvrsti otroke
SortNodes.tooltip=Razvrsti vse otroke vozli\u0161\u010Da po abecedi.
-split=Razdeli
+split=&Razdeli
SplitNode.text=Razdeli vozli\u0161\u010De
SplitNode.tooltip=<html>Vozli\u0161\u010De je razdeljeno</html>
style=Slog
@@ -944,9 +938,9 @@ ToggleChildrenFoldedAction.text=(Raz)postri otroke
ToggleFBarAction.text=F-Bar[translate me]
ToggleFoldedAction.text=Preklopi prepognjene
ToggleFullScreenAction.text=Full screen mode[translate me]
-ToggleLeftToolbarAction.text=&Drugotna vrstica
+ToggleLeftToolbarAction.text=Drugotna vrstica
ToggleMenubarAction.text=Menijska vrstica
-ToggleToolbarAction.text=&Orodna vrstica
+ToggleToolbarAction.text=Orodna vrstica
undefined_error=Pri\u0161lo je do nepri\u010Dakovane napake. Prosimo poskusite oddati poro\u010Dilo o hro\u0161\u010Du.
underline=Pod\u010Drtano
underlined=Pod\u010Drtano
@@ -964,6 +958,7 @@ UsePlainTextAction.text=Uporabi navadno besedilo
user_defined_zoom=Uporabni\u0161ko dolo\u010Deno.
user_defined_zoom_status_bar=Spreminjanje pogleda na uporabni\u0161ko dolo\u010Deno vrednost {0}%.
user_zoom=Faktor pove\u010Dave tiskanja (0.0 - 2.0):
+view=Pogled
WebDocuAction.text=Spletna dokumentacija
width=\u0160irina
yes=Da
diff --git a/freeplane/resources/translations/Resources_sr.properties b/freeplane/resources/translations/Resources_sr.properties
index 6c776ca..550ad93 100644
--- a/freeplane/resources/translations/Resources_sr.properties
+++ b/freeplane/resources/translations/Resources_sr.properties
@@ -1,1780 +1,1773 @@
-\u0418\u0437\u0432\u043e\u0440\u043d\u0438=\u041d\u0430\u0437\u0430\u0434
-about_text=Freeplane -\u0431\u0435\u0441\u043f\u043f\u0430\u0442\u0430\u043d \u043f\u0440\u043e\u0433\u0440\u0430\u043c \u0437\u0430 \u043f\u0440\u0430\u0432\u0459\u0435\u045a\u0435 \u043c\u0430\u043f\u0430 \u0443\u043c\u0430 \u0438 \u043d\u0430\u0434\u043e\u0433\u0440\u0430\u0434\u045a\u0443 \u0437\u043d\u0430\u045a\u0430
-AboutAction.text=\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0443
-acceleratorPresets=\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0435\u0447\u0438\u0446\u0430
-accelerators_loading_error=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0435 \u043f\u0440\u0435\u0447\u0438\u0446\u0435 \u0438\u0437 {0}
-accessories/plugins/ApplyFormatPlugin.dialog.title=\u041f\u0440\u043e\u043c\u0435\u043d\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=\u041f\u0440\u043e\u043c\u0435\u043d\u0438 \u043e\u0431\u0440\u0430\u0437\u0430\u0446
-accessories/plugins/EncryptNode.properties_0=\u041e\u0434\u0430\u0431\u0435\u0440\u0438 \u043b\u043e\u0437\u0438\u043d\u043a\u0443 \u0437\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438 \u0447\u0432\u043e\u0440.
-accessories/plugins/EncryptNode.properties_1=\u041b\u043e\u0437\u0438\u043d\u043a\u0435 \u043d\u0438\u0441\u0443 \u0438\u0441\u0442\u0435 \u0438\u043b\u0438 \u0458\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u043a\u0430.
-accessories/plugins/EncryptNode.properties_2=\u0423\u043d\u0435\u0441\u0438 \u043b\u043e\u0437\u0438\u043d\u043a\u0443:
-accessories/plugins/EncryptNode.properties_3=\u041f\u043e\u043d\u043e\u0432\u043e \u0443\u043d\u0435\u0441\u0438 \u043b\u043e\u0437\u0438\u043d\u043a\u0443:
-accessories/plugins/EncryptNode.properties_4=\u0423\u043d\u0435\u0441\u0438 \u043b\u043e\u0437\u0438\u043d\u043a\u0443.
-accessories/plugins/EncryptNode.properties_5=<html>\u0423\u043f\u0430\u043c\u0442\u0438, \u0441\u043d\u0430\u0433\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u045a\u0430 <br>\u0443\u0432\u0435\u043a \u0437\u0430\u0432\u0438\u0441\u0438 \u043e\u0434 \u043a\u0432\u0430\u043b\u0438\u0442\u0435\u0442\u0430 \u0432\u0430\u0448\u0435 \u043b\u043e\u0437\u0438\u043d\u043a\u0435.
+\u0418\u0437\u0432\u043E\u0440\u043D\u0438=\u041D\u0430\u0437\u0430\u0434
+about_text=Freeplane -\u0431\u0435\u0441\u043F\u043F\u0430\u0442\u0430\u043D \u043F\u0440\u043E\u0433\u0440\u0430\u043C \u0437\u0430 \u043F\u0440\u0430\u0432\u0459\u0435\u045A\u0435 \u043C\u0430\u043F\u0430 \u0443\u043C\u0430 \u0438 \u043D\u0430\u0434\u043E\u0433\u0440\u0430\u0434\u045A\u0443 \u0437\u043D\u0430\u045A\u0430
+AboutAction.text=\u041E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443
+acceleratorPresets=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0435\u0447\u0438\u0446\u0430
+accelerators_loading_error=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0435 \u043F\u0440\u0435\u0447\u0438\u0446\u0435 \u0438\u0437 {0}
+accessories/plugins/ApplyFormatPlugin.dialog.title=\u041F\u0440\u043E\u043C\u0435\u043D\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0430 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=\u041F\u0440\u043E\u043C\u0435\u043D\u0438 \u043E\u0431\u0440\u0430\u0437\u0430\u0446
+accessories/plugins/EncryptNode.properties_0=\u041E\u0434\u0430\u0431\u0435\u0440\u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u0437\u0430 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438 \u0447\u0432\u043E\u0440.
+accessories/plugins/EncryptNode.properties_1=\u041B\u043E\u0437\u0438\u043D\u043A\u0435 \u043D\u0438\u0441\u0443 \u0438\u0441\u0442\u0435 \u0438\u043B\u0438 \u0458\u0435 \u043F\u0440\u0435\u043A\u0440\u0430\u0442\u043A\u0430.
+accessories/plugins/EncryptNode.properties_2=\u0423\u043D\u0435\u0441\u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0443:
+accessories/plugins/EncryptNode.properties_3=\u041F\u043E\u043D\u043E\u0432\u043E \u0443\u043D\u0435\u0441\u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0443:
+accessories/plugins/EncryptNode.properties_4=\u0423\u043D\u0435\u0441\u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0443.
+accessories/plugins/EncryptNode.properties_5=<html>\u0423\u043F\u0430\u043C\u0442\u0438, \u0441\u043D\u0430\u0433\u0430 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u045A\u0430 <br>\u0443\u0432\u0435\u043A \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u043A\u0432\u0430\u043B\u0438\u0442\u0435\u0442\u0430 \u0432\u0430\u0448\u0435 \u043B\u043E\u0437\u0438\u043D\u043A\u0435.
accessories/plugins/EncryptNode.properties_6=\u0423 \u0440\u0435\u0434\u0443
-accessories/plugins/EncryptNode.properties_7=\u041e\u0442\u043a\u0430\u0436\u0438
-accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=\u041c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0459\u0443\u0447\u0438\u0442\u0438 \u0438\u043b\u0438 \u0438\u0441\u043a\u0459\u0443\u0447\u0438\u0442\u0438 \u0441\u0442\u0430\u045a\u0435 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u045a\u0430 \u0441\u0430\u043c\u043e \u043d\u0430 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e\u043c \u0447\u0432\u043e\u0440\u0443. \u041c\u043e\u043b\u0438\u043c \u0434\u0430 [...]
-accessories/plugins/EncryptNode.properties_select_me=\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u0437\u0430 \u043d\u0430\u0441\u0442\u0430\u0432\u0430\u043a!
-accessories/plugins/EncryptNode.properties_wrong_password=\u041b\u043e\u0437\u0438\u043d\u043a\u0430 \u043d\u0438\u0458\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043d\u0430.
+accessories/plugins/EncryptNode.properties_7=\u041E\u0442\u043A\u0430\u0436\u0438
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=\u041C\u043E\u0436\u0435\u0442\u0435 \u0443\u043A\u0459\u0443\u0447\u0438\u0442\u0438 \u0438\u043B\u0438 \u0438\u0441\u043A\u0459\u0443\u0447\u0438\u0442\u0438 \u0441\u0442\u0430\u045A\u0435 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u045A\u0430 \u0441\u0430\u043C\u043E \u043D\u0430 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E\u043C \u0447\u0432\u043E\u0440\u0443. \u041C\u043E\u043B\u0438\u043C \u0434\u0430 [...]
+accessories/plugins/EncryptNode.properties_select_me=\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u0437\u0430 \u043D\u0430\u0441\u0442\u0430\u0432\u0430\u043A!
+accessories/plugins/EncryptNode.properties_wrong_password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u043D\u0438\u0458\u0435 \u0438\u0441\u043F\u0440\u0430\u0432\u043D\u0430.
accessories/plugins/ExportWithTWiki.text=TWiki...
-accessories/plugins/ExportWithTWiki.tooltip=\u0418\u0437\u0432\u0435\u0437\u0438 \u043c\u0430\u043f\u0443 \u043a\u0430\u043e Twiki \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442.
-accessories/plugins/ExportWithXSLT.tooltip=\u041e\u0432\u043e \u0458\u0435 \u0458\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d \u0438\u0437\u0432\u043e\u0437\u043d\u0438 \u043c\u0435\u0442\u043e\u0434.
-accessories/plugins/ExportWithXSLT_Applet.text=\u041a\u0430\u043e Java \u0430\u043f\u043b\u0435\u0442...
-accessories/plugins/ExportWithXSLT_Applet.tooltip=\u0418\u0437\u0432\u043e\u0437 \u043c\u0430\u043f\u0435 \u0443\u043c\u0430 \u043a\u0430\u043e Java \u0430\u043f\u043b\u0435\u0442 \u0443 \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u0430\u0447\u0443 .
-accessories/plugins/ExportWithXSLT_Flash.text=\u041a\u0430\u043e \u0424\u043b\u0435\u0448...
-accessories/plugins/ExportWithXSLT_Flash.tooltip=\u0418\u0437\u0432\u043e\u0437 \u043c\u0430\u043f\u0435 \u043a\u0430\u043e \u0444\u043b\u0435\u0448 \u0430\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0458\u0435.
-accessories/plugins/ExportWithXSLT_HTML.text=\u041a\u0430\u043e XHTML (JavaScript \u0438\u0437\u0434\u0430\u045a\u0435)...
-accessories/plugins/ExportWithXSLT_HTML3.text=\u041a\u0430\u043e XHTML (\u0438\u0437\u0434\u0430\u045a\u0435 \u043a\u043b\u0438\u043a\u0442\u0430\u0458\u0443\u045b\u0435 \u0441\u043b\u0438\u043a\u0435 \u043c\u0430\u043f\u0435)...
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0438\u0437 \u0421\u0420\u0415\u0414\u0421\u0422\u0410\u0412\u0410 \u0447\u0432\u043e\u0440\u0430 \u0443 TaskJuggler \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443...
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>\u0418\u0437\u0432\u043e\u0437 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0438\u0437 \u0421\u0420\u0415\u0414\u0421\u0422\u0410\u0412\u0410 \u0447\u0432\u043e\u0440\u0430 \u0443 TaskJuggler \u043c\u043e\u0434\u0443\u043b. </html>
-accessories/plugins/ExportWithXSLT_TASKSTJI.text=\u0417\u0430\u0434\u0430\u0446\u0438 \u0438\u0437 \u0447\u0432\u043e\u0440\u0430 \u0417\u0430\u0434\u0430\u0446\u0438 \u0443 TaskJuggler \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443...
-accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>\u0418\u0437\u0432\u043e\u0437\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043a\u0435 \u0438\u0437 \u0447\u0432\u043e\u0440\u0430 \u0417\u0430\u0434\u0430\u0446\u0438 \u0443 TaskJuggler \u043c\u043e\u0434\u0443\u043b. </html>
-action_keystroke_in_use_error=\u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0430 \u043f\u0440\u0435\u0447\u0438\u0446\u0430 {0} \u043a\u043e\u0458\u0443 \u0436\u0435\u043b\u0438\u0442\u0435 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u0430 \u0430\u043a\u0446\u0438\u0458\u0443 {1} \u0432\u0435\u045b \u0458\u0435 \u043a\u043e\u0440\u0438\u0448\u045b\u0435\u043d\u0430 \u0437\u0430 \u0430\u043a\u0446\u0438\u0458\u0443 {2}
-active=\u0410\u043a\u0442\u0438\u0432\u0430\u043d
-actual_map_styles=\u0423\u0441\u043b\u043e\u0432\u0438 \u0441\u0442\u0438\u043b\u043e\u0432\u0430 \u043c\u0430\u043f\u0435 \u043f\u0440\u0438\u043c\u0435\u045a\u0435\u043d\u0438 \u043d\u0430 \u0447\u0432\u043e\u0440\u0443
-actual_node_styles=\u0423\u0441\u043b\u043e\u0432\u0438 \u0441\u0442\u0438\u043b\u043e\u0432\u0430 \u0447\u0432\u043e\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u045a\u0435\u043d\u0438 \u043d\u0430 \u0447\u0432\u043e\u0440\u0443
-add=&\u0414\u043e\u0434\u0430\u0458
-AddConnectorAction.text=\u0414\u043e\u0434\u0430\u0458 \u043f\u043e\u0432\u0435\u0437\u043d\u0438\u043a
-AddElementaryConditionAction.text=\u0414\u043e\u0434\u0430\u0458
-AddLocalLinkAction.text=\u0414\u043e\u0434\u0430\u0458 \u043b\u043e\u043a\u0430\u043b\u043d\u0443 \u0445\u0438\u043f\u0435\u0440\u0432\u0435\u0437\u0443
-AddMenuItemLinkAction.text=\u0414\u043e\u0434\u0430\u0458 \u0445\u0438\u043f\u0435\u0440\u0432\u0435\u0437\u0443 \u0443 \u0441\u0442\u0430\u0432\u043a\u0435 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0430 ...
-AddOnDetailsPanel.authored.by=\u041e\u0434 {0}
-AddOnDetailsPanel.header.function=\u0424\u0443\u043d\u043a\u0446\u0438\u0458\u0430
-AddOnDetailsPanel.header.menu=\u041f\u043e\u043b\u043e\u0436\u0430\u0458 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0430
-AddOnDetailsPanel.header.shortcut=\u041f\u0440\u0435\u0447\u0438\u0446\u0430
-AddOnDetailsPanel.homepage=\u041f\u043e\u0447\u0435\u0442\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430:
-addons.installer.canceled=\u0418\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u0458\u0430 \u0458\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u043d\u0430
-addons.installer.confirm.licence=<html><body><h1>\u041b\u0438\u0446\u0435\u043d\u0446\u0430</h1>{0}<p><p><em>\u0414\u0430 \u043b\u0438 \u043f\u0440\u0438\u0445\u0432\u0430\u0442\u0430\u0442\u0435 \u043e\u0432\u0443 \u043b\u0438\u0446\u0435\u043d\u0446\u0443?</em></p></body></html>
-addons.installer.failed=\u0418\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u0458\u0430 \u043d\u0438\u0458\u0435 \u0443\u0441\u043f\u0435\u043b\u0430: {0}
-addons.installer.freeplaneversion.format.error=\u0424\u043e\u0440\u043c\u0430\u0442 \u0433\u0440\u0435\u0448\u043a\u0435 \u0443 {0} (\u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442: {1})
-addons.installer.html.script=\u0421\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0431\u0438\u0442\u0438 \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0430 \u043a\u0430\u043e HTML
-addons.installer.install=\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0458
-addons.installer.invalid.keyboard.shortcut=\u041d\u0435\u0432\u0430\u0436\u0435\u045b\u0430 \u043f\u0440\u0435\u0447\u0438\u0446\u0430 {0}.
-addons.installer.licence.unchanged=\u041b\u0438\u0446\u0435\u043d\u0446\u0430 \u0458\u0435 \u043d\u0435\u043f\u0440\u043e\u043c\u0435\u045a\u0435\u043d\u0430
-addons.installer.map.structure=\u0413\u0440\u0435\u0448\u043a\u0430 \u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438 \u043c\u0430\u043f\u0435: {0}
-addons.installer.missing.child.nodes=\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0458\u0435 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u0447\u0432\u043e\u0440: {0}
-addons.installer.missing.permission.attribute=\u0421\u043a\u0440\u0438\u043f\u0442\u0430 {0}: \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0458\u0435 \u0434\u043e\u0437\u0432\u043e\u043b\u0430 \u0437\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 {1}
-addons.installer.missing.properties=\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0458\u0443 \u0441\u0432\u043e\u0458\u0441\u0442\u0432\u0430: {0}
-addons.installer.missing.translation=\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0458\u0435 \u043f\u0440\u0435\u0432\u043e\u0434 {0} \u043d\u0430 \u0458\u0435\u0437\u0438\u043a\u0443 {1}
-addons.installer.no.scripts=\u041d\u0435\u043c\u0430 \u043f\u0440\u043e\u043d\u0430\u0452\u0435\u043d\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u0438
-addons.installer.no.zipdata=\u041d\u0438\u0441\u0443 \u043f\u0440\u043e\u043d\u0430\u0452\u0435\u043d\u0438 \u0441\u0430\u0436\u0435\u0442\u0438 \u043f\u043e\u0434\u0430\u0446\u0438
-addons.installer.nonstandard.permissions=\u0421\u043a\u0440\u0438\u043f\u0442\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u0441\u043b\u0435\u0434\u0435\u045b\u0435 \u0434\u043e\u0437\u0432\u043e\u043b\u0435 \u043a\u043e\u0458\u0435 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u043d\u0438\u0441\u0443 \u043e\u043c\u043e\u0433\u0443\u045b\u0435\u043d\u0435: {0}.\n\u041e\u043d\u0435 \u0442\u0440\u0435\u0431\u0430 \u0434\u0430 \u0431\u0443\u0434\u0443 \u0434\u043e\u0434\u0430\u0442 [...]
-addons.installer.one.child.expected=\u041e\u0447\u0435\u043a\u0438\u0432\u0430\u043d \u0458\u0435 \u0442\u0430\u0447\u043d\u043e \u0458\u0435\u0434\u0430\u043d \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u043e\u0434 {0} \u0430\u043b\u0438 \u0458\u0435 \u0434\u043e\u0431\u0438\u043e {1}.
-addons.installer.script.no.execution_mode="\u0418\u0437\u0432\u0440\u0448\u043d\u0438_\u0440\u0435\u0436\u0438\u043c" \u043d\u0438\u0458\u0435 \u043e\u0434\u0440\u0435\u0452\u0435\u043d \u0437\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 {0}
-addons.installer.script.no.menulocation=\u0411\u0435\u0437 "menuLocation" \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438\u0445 \u0437\u0430 {0}
-addons.installer.script.no.menutitle=\u0411\u0435\u0437 "menuTitleKey" \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438\u0445 \u0437\u0430 {0}
-addons.installer.script.no.permissions=\u041d\u0435\u043c\u0430 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0435 \u0434\u043e\u0437\u0432\u043e\u043b\u0435 \u0437\u0430 {0}
-addons.installer.success=\u0423\u0441\u043f\u0435\u0448\u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u0458\u0430.\n\u041d\u043e\u0432\u0438 \u0434\u043e\u0434\u0430\u0442\u0430\u043a \u045b\u0435 \u0431\u0438\u0442\u0438 \u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u045a\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043f\u043e\u043a\u0440\u0435\u0442\u0430\u045a\u0430.
-addons.installer.success.update=\u041d\u0430\u0434\u043e\u0433\u0440\u0430\u0434\u045a\u0430 \u0438\u0437 {0} \u0443 {1} \u0458\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u0430.\n\u041d\u0435\u043a\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0458\u0435 \u043c\u043e\u0433\u0443 \u0431\u0438\u0442\u0438 \u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u045a\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043f\u043e\u043a\u0440\u0435\u0442\u0430\u045a\u0430..
-addons.installer.title=\u0418\u043d\u0441\u0442\u0430\u043b\u0435\u0440 \u0434\u043e\u0434\u0430\u0442\u0430\u043a\u0430
-addons.installer.too.new=\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e Freeplane \u0438\u0437\u0434\u0430\u045a\u0435 {0} \u0458\u0435 \u0442\u0430\u043a\u043e\u0452\u0435 \u043d\u043e\u0432\u043e. \u041e\u0432\u0430\u0458 \u0434\u043e\u0434\u0430\u0442\u0430\u043a \u043f\u043e\u0434\u0440\u0436\u0430\u0432\u0430 \u043d\u0430\u0458\u0432\u0438\u0448\u0435 {1}
-addons.installer.too.old=\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e Freeplane \u0438\u0437\u0434\u0430\u045a\u0435 {0} \u0458\u0435 \u0441\u0443\u0432\u0438\u0448\u0435 \u0441\u0442\u0430\u0440\u043e. \u041e\u0432\u0430\u0458 \u0434\u043e\u0434\u0430\u0442\u0430\u043a \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u043d\u0430\u0458\u043c\u0430\u045a\u0435 {1}
-addons.installer.unknown.deinstallation.rules=\u041d\u0435\u043f\u043e\u0437\u043d\u0430\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0437\u0430 \u0434\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u0458\u0443 {0}
-addons.installer.update=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u043d\u0430 \u0438\u0437\u0434\u0430\u045a\u0435 {0}
-addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">\u041f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u0458\u0435 \u0441\u0430\u043c\u043e \u0434\u0430 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0442\u0435 \u0434\u043e\u0434\u0430\u0442\u043a\u0435 \u0438\u0437 \u0438\u0437\u0432\u043e\u0440\u0430 \u0443 \u043a\u043e\u0458\u0435 \u0438\u043c\u0430\u0442\u0435 \u043f\u043e\u0432\u0435\u0440\u0435\u045a\u0435. \u0417\u043b\u043e\u043d\u0430\u043c\u0 [...]
+accessories/plugins/ExportWithTWiki.tooltip=\u0418\u0437\u0432\u0435\u0437\u0438 \u043C\u0430\u043F\u0443 \u043A\u0430\u043E Twiki \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442.
+accessories/plugins/ExportWithXSLT.tooltip=\u041E\u0432\u043E \u0458\u0435 \u0458\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D \u0438\u0437\u0432\u043E\u0437\u043D\u0438 \u043C\u0435\u0442\u043E\u0434.
+accessories/plugins/ExportWithXSLT_Applet.text=\u041A\u0430\u043E Java \u0430\u043F\u043B\u0435\u0442...
+accessories/plugins/ExportWithXSLT_Applet.tooltip=\u0418\u0437\u0432\u043E\u0437 \u043C\u0430\u043F\u0435 \u0443\u043C\u0430 \u043A\u0430\u043E Java \u0430\u043F\u043B\u0435\u0442 \u0443 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447\u0443 .
+accessories/plugins/ExportWithXSLT_Flash.text=\u041A\u0430\u043E \u0424\u043B\u0435\u0448...
+accessories/plugins/ExportWithXSLT_Flash.tooltip=\u0418\u0437\u0432\u043E\u0437 \u043C\u0430\u043F\u0435 \u043A\u0430\u043E \u0444\u043B\u0435\u0448 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0435.
+accessories/plugins/ExportWithXSLT_HTML.text=\u041A\u0430\u043E XHTML (JavaScript \u0438\u0437\u0434\u0430\u045A\u0435)...
+accessories/plugins/ExportWithXSLT_HTML3.text=\u041A\u0430\u043E XHTML (\u0438\u0437\u0434\u0430\u045A\u0435 \u043A\u043B\u0438\u043A\u0442\u0430\u0458\u0443\u045B\u0435 \u0441\u043B\u0438\u043A\u0435 \u043C\u0430\u043F\u0435)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0438\u0437 \u0421\u0420\u0415\u0414\u0421\u0422\u0410\u0412\u0410 \u0447\u0432\u043E\u0440\u0430 \u0443 TaskJuggler \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>\u0418\u0437\u0432\u043E\u0437 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u0438\u0437 \u0421\u0420\u0415\u0414\u0421\u0422\u0410\u0412\u0410 \u0447\u0432\u043E\u0440\u0430 \u0443 TaskJuggler \u043C\u043E\u0434\u0443\u043B. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text=\u0417\u0430\u0434\u0430\u0446\u0438 \u0438\u0437 \u0447\u0432\u043E\u0440\u0430 \u0417\u0430\u0434\u0430\u0446\u0438 \u0443 TaskJuggler \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>\u0418\u0437\u0432\u043E\u0437\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0435 \u0438\u0437 \u0447\u0432\u043E\u0440\u0430 \u0417\u0430\u0434\u0430\u0446\u0438 \u0443 TaskJuggler \u043C\u043E\u0434\u0443\u043B. </html>
+action_keystroke_in_use_error=\u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0430 \u043F\u0440\u0435\u0447\u0438\u0446\u0430 {0} \u043A\u043E\u0458\u0443 \u0436\u0435\u043B\u0438\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u0430 \u0430\u043A\u0446\u0438\u0458\u0443 {1} \u0432\u0435\u045B \u0458\u0435 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u043D\u0430 \u0437\u0430 \u0430\u043A\u0446\u0438\u0458\u0443 {2}
+active=\u0410\u043A\u0442\u0438\u0432\u0430\u043D
+actual_map_styles=\u0423\u0441\u043B\u043E\u0432\u0438 \u0441\u0442\u0438\u043B\u043E\u0432\u0430 \u043C\u0430\u043F\u0435 \u043F\u0440\u0438\u043C\u0435\u045A\u0435\u043D\u0438 \u043D\u0430 \u0447\u0432\u043E\u0440\u0443
+actual_node_styles=\u0423\u0441\u043B\u043E\u0432\u0438 \u0441\u0442\u0438\u043B\u043E\u0432\u0430 \u0447\u0432\u043E\u0440\u0430 \u043F\u0440\u0438\u043C\u0435\u045A\u0435\u043D\u0438 \u043D\u0430 \u0447\u0432\u043E\u0440\u0443
+add=&\u0414\u043E\u0434\u0430\u0458
+AddConnectorAction.text=\u0414\u043E\u0434\u0430\u0458 \u043F\u043E\u0432\u0435\u0437\u043D\u0438\u043A
+AddElementaryConditionAction.text=\u0414\u043E\u0434\u0430\u0458
+AddLocalLinkAction.text=\u0414\u043E\u0434\u0430\u0458 \u043B\u043E\u043A\u0430\u043B\u043D\u0443 \u0445\u0438\u043F\u0435\u0440\u0432\u0435\u0437\u0443
+AddMenuItemLinkAction.text=\u0414\u043E\u0434\u0430\u0458 \u0445\u0438\u043F\u0435\u0440\u0432\u0435\u0437\u0443 \u0443 \u0441\u0442\u0430\u0432\u043A\u0435 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0430 ...
+AddOnDetailsPanel.authored.by=\u041E\u0434 {0}
+AddOnDetailsPanel.header.function=\u0424\u0443\u043D\u043A\u0446\u0438\u0458\u0430
+AddOnDetailsPanel.header.menu=\u041F\u043E\u043B\u043E\u0436\u0430\u0458 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0430
+AddOnDetailsPanel.header.shortcut=\u041F\u0440\u0435\u0447\u0438\u0446\u0430
+AddOnDetailsPanel.homepage=\u041F\u043E\u0447\u0435\u0442\u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430:
+addons.installer.canceled=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0458\u0435 \u043E\u0442\u043A\u0430\u0437\u0430\u043D\u0430
+addons.installer.confirm.licence=<html><body><h1>\u041B\u0438\u0446\u0435\u043D\u0446\u0430</h1>{0}<p><p><em>\u0414\u0430 \u043B\u0438 \u043F\u0440\u0438\u0445\u0432\u0430\u0442\u0430\u0442\u0435 \u043E\u0432\u0443 \u043B\u0438\u0446\u0435\u043D\u0446\u0443?</em></p></body></html>
+addons.installer.failed=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u0430: {0}
+addons.installer.freeplaneversion.format.error=\u0424\u043E\u0440\u043C\u0430\u0442 \u0433\u0440\u0435\u0448\u043A\u0435 \u0443 {0} (\u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442: {1})
+addons.installer.html.script=\u0421\u043A\u0440\u0438\u043F\u0442\u0430 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u043D\u0430 \u043A\u0430\u043E HTML
+addons.installer.install=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458
+addons.installer.invalid.keyboard.shortcut=\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0430 \u043F\u0440\u0435\u0447\u0438\u0446\u0430 {0}.
+addons.installer.licence.unchanged=\u041B\u0438\u0446\u0435\u043D\u0446\u0430 \u0458\u0435 \u043D\u0435\u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u0430
+addons.installer.map.structure=\u0413\u0440\u0435\u0448\u043A\u0430 \u0443 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0438 \u043C\u0430\u043F\u0435: {0}
+addons.installer.missing.child.nodes=\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0458\u0435 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u0447\u0432\u043E\u0440: {0}
+addons.installer.missing.permission.attribute=\u0421\u043A\u0440\u0438\u043F\u0442\u0430 {0}: \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0458\u0435 \u0434\u043E\u0437\u0432\u043E\u043B\u0430 \u0437\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 {1}
+addons.installer.missing.properties=\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0458\u0443 \u0441\u0432\u043E\u0458\u0441\u0442\u0432\u0430: {0}
+addons.installer.missing.translation=\u041D\u0435\u0434\u043E\u0441\u0442\u0430\u0458\u0435 \u043F\u0440\u0435\u0432\u043E\u0434 {0} \u043D\u0430 \u0458\u0435\u0437\u0438\u043A\u0443 {1}
+addons.installer.no.scripts=\u041D\u0435\u043C\u0430 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0438\u0445 \u0441\u043A\u0440\u0438\u043F\u0442\u0438
+addons.installer.no.zipdata=\u041D\u0438\u0441\u0443 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0438 \u0441\u0430\u0436\u0435\u0442\u0438 \u043F\u043E\u0434\u0430\u0446\u0438
+addons.installer.nonstandard.permissions=\u0421\u043A\u0440\u0438\u043F\u0442\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0435 \u0434\u043E\u0437\u0432\u043E\u043B\u0435 \u043A\u043E\u0458\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043D\u0438\u0441\u0443 \u043E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0435: {0}.\n\u041E\u043D\u0435 \u0442\u0440\u0435\u0431\u0430 \u0434\u0430 \u0431\u0443\u0434\u0443 \u0434\u043E\u0434\u0430\u0442 [...]
+addons.installer.one.child.expected=\u041E\u0447\u0435\u043A\u0438\u0432\u0430\u043D \u0458\u0435 \u0442\u0430\u0447\u043D\u043E \u0458\u0435\u0434\u0430\u043D \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u043E\u0434 {0} \u0430\u043B\u0438 \u0458\u0435 \u0434\u043E\u0431\u0438\u043E {1}.
+addons.installer.script.no.execution_mode="\u0418\u0437\u0432\u0440\u0448\u043D\u0438_\u0440\u0435\u0436\u0438\u043C" \u043D\u0438\u0458\u0435 \u043E\u0434\u0440\u0435\u0452\u0435\u043D \u0437\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 {0}
+addons.installer.script.no.menulocation=\u0411\u0435\u0437 "menuLocation" \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438\u0445 \u0437\u0430 {0}
+addons.installer.script.no.menutitle=\u0411\u0435\u0437 "menuTitleKey" \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438\u0445 \u0437\u0430 {0}
+addons.installer.script.no.permissions=\u041D\u0435\u043C\u0430 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435 \u0434\u043E\u0437\u0432\u043E\u043B\u0435 \u0437\u0430 {0}
+addons.installer.success=\u0423\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430.\n\u041D\u043E\u0432\u0438 \u0434\u043E\u0434\u0430\u0442\u0430\u043A \u045B\u0435 \u0431\u0438\u0442\u0438 \u043D\u0430 \u0440\u0430\u0441\u043F\u043E\u043B\u0430\u0433\u0430\u045A\u0443 \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u0435\u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430.
+addons.installer.success.update=\u041D\u0430\u0434\u043E\u0433\u0440\u0430\u0434\u045A\u0430 \u0438\u0437 {0} \u0443 {1} \u0458\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u0430.\n\u041D\u0435\u043A\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0435 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u043D\u0430 \u0440\u0430\u0441\u043F\u043E\u043B\u0430\u0433\u0430\u045A\u0443 \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u0435\u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430..
+addons.installer.title=\u0418\u043D\u0441\u0442\u0430\u043B\u0435\u0440 \u0434\u043E\u0434\u0430\u0442\u0430\u043A\u0430
+addons.installer.too.new=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E Freeplane \u0438\u0437\u0434\u0430\u045A\u0435 {0} \u0458\u0435 \u0442\u0430\u043A\u043E\u0452\u0435 \u043D\u043E\u0432\u043E. \u041E\u0432\u0430\u0458 \u0434\u043E\u0434\u0430\u0442\u0430\u043A \u043F\u043E\u0434\u0440\u0436\u0430\u0432\u0430 \u043D\u0430\u0458\u0432\u0438\u0448\u0435 {1}
+addons.installer.too.old=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E Freeplane \u0438\u0437\u0434\u0430\u045A\u0435 {0} \u0458\u0435 \u0441\u0443\u0432\u0438\u0448\u0435 \u0441\u0442\u0430\u0440\u043E. \u041E\u0432\u0430\u0458 \u0434\u043E\u0434\u0430\u0442\u0430\u043A \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 {1}
+addons.installer.unknown.deinstallation.rules=\u041D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u043E \u043F\u0440\u0430\u0432\u0438\u043B\u043E \u0437\u0430 \u0434\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 {0}
+addons.installer.update=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u043D\u0430 \u0438\u0437\u0434\u0430\u045A\u0435 {0}
+addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0441\u0430\u043C\u043E \u0434\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u043A\u0435 \u0438\u0437 \u0438\u0437\u0432\u043E\u0440\u0430 \u0443 \u043A\u043E\u0458\u0435 \u0438\u043C\u0430\u0442\u0435 \u043F\u043E\u0432\u0435\u0440\u0435\u045A\u0435. \u0417\u043B\u043E\u043D\u0430\u043C\u0 [...]
addons.site=http://freeplane.sourceforge.net/addons/
-AddStyleAttributes.text=\u0414\u043e\u0434\u0430\u0458 \u0441\u0432\u043e\u0458\u0441\u0442\u0432\u0430 \u0441\u0442\u0438\u043b\u0430
-AddStyleAttributes.tooltip=\u0414\u043e\u0434\u0430\u0458 \u0441\u0432\u043e\u0458\u0441\u0442\u0432\u0430 \u0438\u0437 \u0441\u0442\u0438\u043b\u0430 \u0447\u0432\u043e\u0440\u0430.
-AllMapsNodeListAction.text=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438 \u0443 \u0441\u0432\u0438\u043c \u043c\u0430\u043f\u0430\u043c\u0430
-always=\u0423\u0432\u0435\u043a
-AlwaysUnfoldedNodeAction.text=\u0423\u0432\u0435\u043a \u0440\u0430\u0441\u043a\u043b\u043e\u043f\u0459\u0435\u043d \u0447\u0432\u043e\u0440 (\u043f\u043e\u0441\u0442\u0430\u0432\u0438/\u043f\u043e\u043d\u0438\u0448\u0442\u0438
-antialias_all=\u0423\u0433\u043b\u0430\u0447\u0430\u0432\u0430\u045a\u0435 \u0441\u0432\u0435\u0433\u0430
-antialias_edges=\u0423\u0433\u043b\u0430\u0447\u0430\u0432\u0430\u045a\u0435 \u0440\u0443\u0431\u043e\u0432\u0430
-antialias_none=\u0411\u0435\u0437 \u0443\u0433\u043b\u0430\u0447\u0430\u0432\u0430\u045a\u0430
-apply=&\u041f\u0440\u0438\u043c\u0435\u043d\u0438
-ApplyAction.text=&\u041f\u0440\u0438\u043c\u0435\u043d\u0438
-ApplyFormatPlugin.text=\u041f\u0440\u043e\u043c\u0435\u043d\u0438 &\u043e\u0431\u043b\u0438\u043a...
-ApplyFormatPlugin.tooltip=\u041f\u0440\u0438\u043a\u0430\u0437\u0443\u0458\u0435 \u0434\u0438\u0458\u0430\u043b\u043e\u0433 \u0443 \u043a\u043e\u0458\u0435\u043c \u043e\u0441\u043e\u0431\u0438\u043d\u0435 \u0447\u0432\u043e\u0440\u0430 \u0438 \u0440\u0443\u0431\u0430 \u043c\u043e\u0433\u0443 \u0431\u0438\u0442\u0438 \u043f\u0440\u043e\u043c\u0435\u045a\u0435\u043d\u0435 \u043e\u0434\u043c\u0430\u0445.
-ApplyNoFilteringAction.text=\u0411\u0435\u0437 \u0444\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u045a\u0430
-ApplySelectedViewConditionAction.text=\u0424\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u0458 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-ApplyToVisibleAction.text=\u041f\u0440\u0438\u043c\u0435\u043d\u0438 \u043d\u0430 \u0444\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u043d\u0438\u043c \u0447\u0432\u043e\u0440\u043e\u0432\u0438\u043c\u0430
-as_parent=\u041a\u0430\u043e \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u0438
-AskForHelp.text=\u041f\u0438\u0442\u0430\u0458 \u0437\u0430 \u043f\u043e\u043c\u043e\u045b
-AssignAttributesAction.text=\u041f\u0440\u043e\u0448\u0438\u0440\u0435\u043d\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447\u0430...
-attribute_delete=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0441\u0432\u0435 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438
-attribute_delete_value=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u043e\u0432\u0443 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442
-attribute_font_size_tooltip=\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
-attribute_list_box_label_text=\u041f\u043e\u0441\u0442\u043e\u0458\u0435\u045b\u0435 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438
-attribute_name=\u0418\u043c\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
-attribute_replace=\u0417\u0430\u043c\u0435\u043d\u0438 \u0441\u0430:
-attribute_top=\u0421\u0432\u0430 \u043f\u043e\u0437\u043d\u0430\u0442\u0430 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430 \u0437\u0430 \u0443\u0447\u0438\u0442\u0430\u043d\u0435 \u043c\u0430\u043f\u0435
-attribute_value=\u0412\u0440\u0435\u0434\u043d\u043e\u0441\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
-attributes_AddAttributeAction.text=\u0414\u043e\u0434\u0430\u0458 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0443 \u0434\u0438\u0458\u0430\u043b\u043e\u0433...
-attributes_adding_empty_attribute_error=\u041d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043f\u0440\u0430\u0437\u0430\u043d \u043d\u0438\u0437 \u0437\u0430 \u043d\u0430\u0437\u0438\u0432 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430
-attributes_all=\u0421\u0432\u0430 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430
-attributes_assign_dialog=\u041f\u0440\u043e\u0448\u0438\u0440\u0438 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447\u0430
+AddStyleAttributes.text=\u0414\u043E\u0434\u0430\u0458 \u0441\u0432\u043E\u0458\u0441\u0442\u0432\u0430 \u0441\u0442\u0438\u043B\u0430
+AddStyleAttributes.tooltip=\u0414\u043E\u0434\u0430\u0458 \u0441\u0432\u043E\u0458\u0441\u0442\u0432\u0430 \u0438\u0437 \u0441\u0442\u0438\u043B\u0430 \u0447\u0432\u043E\u0440\u0430.
+AllMapsNodeListAction.text=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043C\u0435\u043D\u0438 \u0443 \u0441\u0432\u0438\u043C \u043C\u0430\u043F\u0430\u043C\u0430
+always=\u0423\u0432\u0435\u043A
+AlwaysUnfoldedNodeAction.text=\u0423\u0432\u0435\u043A \u0440\u0430\u0441\u043A\u043B\u043E\u043F\u0459\u0435\u043D \u0447\u0432\u043E\u0440 (\u043F\u043E\u0441\u0442\u0430\u0432\u0438/\u043F\u043E\u043D\u0438\u0448\u0442\u0438
+antialias_all=\u0423\u0433\u043B\u0430\u0447\u0430\u0432\u0430\u045A\u0435 \u0441\u0432\u0435\u0433\u0430
+antialias_edges=\u0423\u0433\u043B\u0430\u0447\u0430\u0432\u0430\u045A\u0435 \u0440\u0443\u0431\u043E\u0432\u0430
+antialias_none=\u0411\u0435\u0437 \u0443\u0433\u043B\u0430\u0447\u0430\u0432\u0430\u045A\u0430
+apply=&\u041F\u0440\u0438\u043C\u0435\u043D\u0438
+ApplyAction.text=&\u041F\u0440\u0438\u043C\u0435\u043D\u0438
+ApplyFormatPlugin.text=\u041F\u0440\u043E\u043C\u0435\u043D\u0438 &\u043E\u0431\u043B\u0438\u043A...
+ApplyFormatPlugin.tooltip=\u041F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u0434\u0438\u0458\u0430\u043B\u043E\u0433 \u0443 \u043A\u043E\u0458\u0435\u043C \u043E\u0441\u043E\u0431\u0438\u043D\u0435 \u0447\u0432\u043E\u0440\u0430 \u0438 \u0440\u0443\u0431\u0430 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u0435 \u043E\u0434\u043C\u0430\u0445.
+ApplyNoFilteringAction.text=\u0411\u0435\u0437 \u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u045A\u0430
+ApplySelectedViewConditionAction.text=\u0424\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u0458 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+ApplyToVisibleAction.text=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 \u043D\u0430 \u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u043D\u0438\u043C \u0447\u0432\u043E\u0440\u043E\u0432\u0438\u043C\u0430
+as_parent=\u041A\u0430\u043E \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u0438
+AskForHelp.text=\u041F\u0438\u0442\u0430\u0458 \u0437\u0430 \u043F\u043E\u043C\u043E\u045B
+AssignAttributesAction.text=\u041F\u0440\u043E\u0448\u0438\u0440\u0435\u043D\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447\u0430...
+attribute_delete=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0441\u0432\u0435 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438
+attribute_delete_value=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u043E\u0432\u0443 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442
+attribute_font_size_tooltip=\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430 \u0441\u043B\u043E\u0432\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attribute_list_box_label_text=\u041F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0435 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438
+attribute_name=\u0418\u043C\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attribute_replace=\u0417\u0430\u043C\u0435\u043D\u0438 \u0441\u0430:
+attribute_top=\u0421\u0432\u0430 \u043F\u043E\u0437\u043D\u0430\u0442\u0430 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430 \u0437\u0430 \u0443\u0447\u0438\u0442\u0430\u043D\u0435 \u043C\u0430\u043F\u0435
+attribute_value=\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attributes_AddAttributeAction.text=\u0414\u043E\u0434\u0430\u0458 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0443 \u0434\u0438\u0458\u0430\u043B\u043E\u0433...
+attributes_adding_empty_attribute_error=\u041D\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043F\u0440\u0430\u0437\u0430\u043D \u043D\u0438\u0437 \u0437\u0430 \u043D\u0430\u0437\u0438\u0432 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430
+attributes_all=\u0421\u0432\u0430 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430
+attributes_assign_dialog=\u041F\u0440\u043E\u0448\u0438\u0440\u0438 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447\u0430
attributes_attribute=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438
-attributes_close=\u0417\u0430\u0442\u0432\u043e\u0440\u0438
-attributes_deselect_all=\u041d\u0438\u0448\u0442\u0430
-attributes_dialog_title=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u043c\u0430
+attributes_close=\u0417\u0430\u0442\u0432\u043E\u0440\u0438
+attributes_deselect_all=\u041D\u0438\u0448\u0442\u0430
+attributes_dialog_title=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u043C\u0430
attributes_edit=\u0423\u0440\u0435\u0434\u0438
-attributes_edit_tooltip=\u0423\u0440\u0435\u0434\u0438 \u0441\u043a\u0443\u043f
-attributes_for_selected=\u041e\u0434\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0438
-attributes_for_visible=\u0421\u0432\u0438 \u0432\u0438\u0434\u0459\u0438\u0432\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0438
-attributes_import=&\u0423\u0432\u043e\u0437
-attributes_import_tooltip=\u0423\u0432\u043e\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0447\u0438\u0442\u0430\u043d\u0438\u0445 \u043c\u0430\u043f\u0430
-attributes_no_import_candidates_found=\u041d\u0438\u0441\u0443 \u043f\u0440\u043e\u043d\u0430\u0452\u0435\u043d\u0430 \u043d\u043e\u0432\u0430 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430
+attributes_edit_tooltip=\u0423\u0440\u0435\u0434\u0438 \u0441\u043A\u0443\u043F
+attributes_for_selected=\u041E\u0434\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0438
+attributes_for_visible=\u0421\u0432\u0438 \u0432\u0438\u0434\u0459\u0438\u0432\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0438
+attributes_import=&\u0423\u0432\u043E\u0437
+attributes_import_tooltip=\u0423\u0432\u043E\u0437 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0447\u0438\u0442\u0430\u043D\u0438\u0445 \u043C\u0430\u043F\u0430
+attributes_no_import_candidates_found=\u041D\u0438\u0441\u0443 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0430 \u043D\u043E\u0432\u0430 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430
attributes_popup_delete=\u0418\u0437\u0431\u0440\u0438\u0448\u0438
-attributes_popup_down=\u0414\u043e\u043b\u0435
+attributes_popup_down=\u0414\u043E\u043B\u0435
attributes_popup_edit=\u0423\u0440\u0435\u0434\u0438
-attributes_popup_hide=\u0421\u0430\u043a\u0440\u0438\u0458
-attributes_popup_new=\u041d\u043e\u0432\u043e \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0435
-attributes_popup_optimal_width=\u041e\u043f\u0442\u0438\u043c\u0430\u043b\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0430
-attributes_popup_up=\u0413\u043e\u0440\u0435
-attributes_refresh=\u041e\u0441\u0432\u0435\u0436\u0438
-attributes_RemoveAllAttributesAction.text=\u0423\u043a\u043b\u043e\u043d\u0438\u0442\u0435 \u0441\u0432\u0430 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430
-attributes_RemoveFirstAttributeAction.text=\u0423\u043a\u043b\u043e\u043d\u0438\u0442\u0435 \u043f\u0440\u0432\u043e \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0435
-attributes_RemoveLastAttributeAction.text=\u0423\u043a\u043b\u043e\u043d\u0438\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0435 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0435
-attributes_restricted_attributes_tooltip=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438 \u0441\u043a\u0443\u043f \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430
-attributes_restricted_values_tooltip=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438 \u0441\u043a\u0443\u043f \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438 \u0437\u0430 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0435
-attributes_restriction=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d \u0441\u043a\u0443\u043f
+attributes_popup_hide=\u0421\u0430\u043A\u0440\u0438\u0458
+attributes_popup_new=\u041D\u043E\u0432\u043E \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0435
+attributes_popup_optimal_width=\u041E\u043F\u0442\u0438\u043C\u0430\u043B\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430
+attributes_popup_up=\u0413\u043E\u0440\u0435
+attributes_refresh=\u041E\u0441\u0432\u0435\u0436\u0438
+attributes_RemoveAllAttributesAction.text=\u0423\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u0441\u0432\u0430 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430
+attributes_RemoveFirstAttributeAction.text=\u0423\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043F\u0440\u0432\u043E \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0435
+attributes_RemoveLastAttributeAction.text=\u0423\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0435 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0435
+attributes_restricted_attributes_tooltip=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438 \u0441\u043A\u0443\u043F \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430
+attributes_restricted_values_tooltip=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438 \u0441\u043A\u0443\u043F \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438 \u0437\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0435
+attributes_restriction=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D \u0441\u043A\u0443\u043F
attributes_select_all=\u0421\u0432\u0435
-attributes_select_all_tooltip=\u041e\u0437\u043d\u0430\u0447\u0438/\u041e\u0434\u0437\u043d\u0430\u0447\u0438 \u0441\u0432\u0435
-attributes_show=\u041f\u0440\u0438\u043a\u0430\u0436\u0438
-attributes_skip_root=\u041f\u0440\u0435\u0441\u043a\u043e\u0447\u0438 \u0438\u0437\u0432\u043e\u0440\u043d\u0438 \u0447\u0432\u043e\u0440
-attributes_visible=\u0418\u0437\u0430\u0431\u0440\u0430\u043d\u0438 \u0441\u0443 \u0432\u0438\u0434\u0459\u0438\u0432\u0438
-attributes_visible_tooltip=\u0418\u0437\u0430\u0431\u0440\u0430\u043d\u0438 \u0441\u0443 \u0432\u0438\u0434\u0459\u0438\u0432\u0438
-automatic_layout=\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u043e\u0440\u0435\u0434
-automatic_layout_disabled=\u043e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0435\u043d
-automatically_save_message=\u041c\u0430\u043f\u0430 \u0458\u0435 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0430 (\u043a\u043e\u0440\u0438\u0441\u0442\u0435\u045b\u0438 \u0438\u043c\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435 {0}) ...
-AutomaticEdgeColorHookAction.text=\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0430 \u0431\u043e\u0458\u0430 \u0440\u0443\u0431\u0430
-AutomaticLayout.ALL=\u0437\u0430 \u0441\u0432\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-AutomaticLayout.HEADINGS=\u0437\u0430 \u043d\u0435\u043e\u0441\u0442\u0430\u0432\u0459\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-AutomaticLayout.level=\u041d\u0438\u0432\u043e {0}
-AutomaticLayout.level.root=\u0418\u0437\u0432\u043e\u0440\u043d\u0438
-AutomaticLayoutAction.text=&\u041f\u0440\u0438\u043c\u0435\u043d\u0438 \u043d\u0438\u0432\u043e \u0441\u0442\u0438\u043b\u0430
-AutomaticLayoutAction.tooltip=<html>\u041f\u043e\u043f\u0440\u0430\u0432\u0459\u0430 \u0438\u0437\u0433\u043b\u0435\u0434 \u043c\u0430\u043f\u0435. <br>\u041f\u0440\u0432\u0438 \u043d\u0438\u0432\u043e \u0458\u0435 \u0446\u0440\u043d\u0438, \u0434\u0440\u0443\u0433\u0438 \u043f\u043b\u0430\u0432\u0438, \u0438\u0442\u0434.</html>
-AutomaticLayoutControllerAction.ALL.text=\u0437\u0430 \u0441\u0432\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-AutomaticLayoutControllerAction.HEADINGS.text=\u0437\u0430 \u043d\u0435\u043e\u0441\u0442\u0430\u0432\u0459\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-AutomaticLayoutControllerAction.null.text=\u043e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0435\u043d\u043e
-BackAction.tooltip=\u0421\u043a\u043e\u043a \u0443\u043d\u0430\u0437\u0430\u0434 \u043d\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e\u043c \u043d\u0438\u0437\u0443
-background=\u041f\u043e\u0437\u0430\u0434\u0438\u043d\u0430
-bitmaps=\u0420\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0430 \u0441\u043b\u0438\u043a\u0430
-black=\u0426\u0440\u043d\u043e
-BlinkingNodeHookAction.text=\u0422\u0440\u0435\u043f\u0435\u0440\u0435\u045b\u0438 \u0447\u0432\u043e\u0440
-BlinkingNodeHookAction.tooltip=<html>\u041e\u0432\u043e \u0447\u0438\u043d\u0438 \u0434\u0430 \u0447\u0432\u043e\u0440 \u0442\u0440\u0435\u043f\u0435\u0440\u0438. \u0411\u0443\u0434\u0438\u0442\u0435 \u043e\u043f\u0440\u0435\u0437\u043d\u0438. \u041d\u0435 \u043f\u043e\u0432\u0435\u0437\u0443\u0458\u0442\u0435 \u0433\u0430 \u0441 \u043f\u0440\u0435\u0432\u0438\u0448\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0430 \u0438 <strong> \u043d\u0435 \u0441 \u043e\u0441\u0442\u0430\u043b\u0438\u [...]
-blue=\u041f\u043b\u0430\u0432\u0430
-BoldAction.text=\u041f\u043e\u0434\u0435\u0431\u0459\u0430\u043d\u043e
-boldify_branch=\u041f\u043e\u0434\u0435\u0431\u0459\u0430\u0458
-branch=\u0413\u0440\u0430\u043d\u0430
-BranchesOverlapAction.text=\u0413\u0440\u0430\u043d\u0435 \u043c\u043e\u0433\u0443 \u0434\u0430 \u0441\u0435 \u043f\u0440\u0435\u043a\u043b\u0430\u043f\u0430\u0458\u0443
-browse=\u041f\u0440\u0435\u0433\u043b\u0435\u0434...
-calendar_attributes_panel=\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440 \u0438 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430
-calendar_panel=\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440
-can_not_connect_to_info_server=\u041d\u0435 \u043c\u043e\u0433\u0443 \u0441\u0435 \u043f\u043e\u0432\u0435\u0437\u0430\u0442\u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u0442\u0435\u0459
-can_not_delete_predefined_style=\u041d\u0435 \u043c\u043e\u0433\u0443 \u043e\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0443\u043d\u0430\u043f\u0440\u0435\u0434 \u043f\u043e\u0441\u0442\u0430\u0432\u0459\u0435\u043d\u0438 \u0441\u0442\u0438\u043b
-can_not_delete_root_style=\u041d\u0435 \u043c\u043e\u0433\u0443 \u043e\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0438\u0437\u0432\u043e\u0440\u043d\u0438 \u0441\u0442\u0438\u043b
-can_not_delete_style_group=\u041d\u0435 \u043c\u043e\u0433\u0443 \u043e\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0441\u043a\u0443\u043f\u0438\u043d\u0443 \u0441\u0442\u0438\u043b\u043e\u0432\u0430
-can_not_save_key_set=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0438 \u0441\u043a\u0443\u043f \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0435\u0447\u0438\u0446\u0430
-cancel=&\u041e\u0442\u043a\u0430\u0436\u0438
-CancelAction.text=&\u041e\u0442\u043a\u0430\u0436\u0438
-cannot_add_parent_diff_parents=\u0421\u0432\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0438 \u043c\u043e\u0440\u0430\u0458\u0443 \u0438\u043c\u0430\u0442\u0438 \u0438\u0441\u0442\u043e\u0433 \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0433 \u0437\u0430 \u043a\u043e\u0440\u0438\u0448\u045b\u0435\u045a\u0435 \u043e\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0458\u0435.
-cannot_add_parent_to_root=\u041a\u043e\u0440\u0435\u043d\u0441\u043a\u0438 \u0447\u0432\u043e\u0440 \u043d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u0434\u043e\u0434\u0430\u0442\u0438 \u043d\u043e\u0432\u043e\u043c \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u043c
-cannot_delete_root=\u041a\u043e\u0440\u0435\u043d\u0441\u043a\u0438 \u0447\u0432\u043e\u0440 \u043d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0438\u043b\u0438 \u0438\u0437\u0440\u0435\u0437\u0430\u0442\u0438
-cannot_join_nodes_with_children=\u0427\u0432\u043e\u0440\u043e\u0432\u0435 \u043d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u043f\u043e\u0432\u0435\u0437\u0430\u0442\u0438 \u0441 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438\u043c
-cannot_move_to_child=\u0427\u0432\u043e\u0440 \u043d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u043f\u043e\u043c\u0435\u0440\u0438\u0442\u0438 \u043f\u0440\u0435\u043c\u0430 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u043c \u0447\u0432\u043e\u0440\u0443.
-CenterAction.text=\u0421\u0440\u0435\u0434\u0438\u043d\u0430
-CenterSelectedNodeAction.text=\u041e\u0434\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440 \u0443 \u0441\u0440\u0435\u0434\u0438\u043d\u0438
-ChangeConnectorArrowsAction.backward.text=\u041d\u0430\u0446\u0440\u0430\u0458 \u0441\u0442\u0440\u0435\u043b\u0438\u0446\u0443 \u0443\u043d\u0430\u0437\u0430\u0434
-ChangeConnectorArrowsAction.both.text=\u041d\u0430\u0446\u0440\u0442\u0430\u0458 \u0441\u0442\u0440\u0435\u043b\u0438\u0446\u0443 \u043d\u0430\u043f\u0440\u0435\u0434 \u0438 \u043d\u0430\u0437\u0430\u0434
-ChangeConnectorArrowsAction.forward.text=\u041d\u0430\u0446\u0440\u0442\u0430\u0458 \u0441\u0442\u0440\u0435\u043b\u0438\u0446\u0443 \u043d\u0430\u043f\u0440\u0435\u0434
-ChangeConnectorArrowsAction.none.text=\u041d\u0438\u0448\u0442\u0430
-ChangeConnectorArrowsAction.text=\u041f\u0440\u043e\u043c\u0435\u043d\u0430 \u0441\u0442\u0440\u0435\u043b\u0438\u0446\u0430 \u043f\u043e\u0432\u0435\u0437\u043d\u0438\u043a\u0430
-ChangeConnectorShapeAction.CUBIC_CURVE.text=\u041a\u0440\u0438\u0432\u0430
-ChangeConnectorShapeAction.EDGE_LIKE.text=\u0421\u0438\u043c\u0443\u043b\u0430\u0446\u0438\u0458\u0430 \u0440\u0443\u0431\u0430
+attributes_select_all_tooltip=\u041E\u0437\u043D\u0430\u0447\u0438/\u041E\u0434\u0437\u043D\u0430\u0447\u0438 \u0441\u0432\u0435
+attributes_show=\u041F\u0440\u0438\u043A\u0430\u0436\u0438
+attributes_skip_root=\u041F\u0440\u0435\u0441\u043A\u043E\u0447\u0438 \u0438\u0437\u0432\u043E\u0440\u043D\u0438 \u0447\u0432\u043E\u0440
+attributes_visible=\u0418\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u0441\u0443 \u0432\u0438\u0434\u0459\u0438\u0432\u0438
+attributes_visible_tooltip=\u0418\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u0441\u0443 \u0432\u0438\u0434\u0459\u0438\u0432\u0438
+automatic_layout=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0440\u0430\u0441\u043F\u043E\u0440\u0435\u0434
+automatic_layout_disabled=\u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D
+automatically_save_message=\u041C\u0430\u043F\u0430 \u0458\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430 (\u043A\u043E\u0440\u0438\u0441\u0442\u0435\u045B\u0438 \u0438\u043C\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 {0}) ...
+AutomaticEdgeColorHookAction.text=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0430 \u0431\u043E\u0458\u0430 \u0440\u0443\u0431\u0430
+AutomaticLayout.ALL=\u0437\u0430 \u0441\u0432\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+AutomaticLayout.HEADINGS=\u0437\u0430 \u043D\u0435\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+AutomaticLayout.level=\u041D\u0438\u0432\u043E {0}
+AutomaticLayout.level.root=\u0418\u0437\u0432\u043E\u0440\u043D\u0438
+AutomaticLayoutAction.text=&\u041F\u0440\u0438\u043C\u0435\u043D\u0438 \u043D\u0438\u0432\u043E \u0441\u0442\u0438\u043B\u0430
+AutomaticLayoutAction.tooltip=<html>\u041F\u043E\u043F\u0440\u0430\u0432\u0459\u0430 \u0438\u0437\u0433\u043B\u0435\u0434 \u043C\u0430\u043F\u0435. <br>\u041F\u0440\u0432\u0438 \u043D\u0438\u0432\u043E \u0458\u0435 \u0446\u0440\u043D\u0438, \u0434\u0440\u0443\u0433\u0438 \u043F\u043B\u0430\u0432\u0438, \u0438\u0442\u0434.</html>
+AutomaticLayoutControllerAction.ALL.text=\u0437\u0430 \u0441\u0432\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+AutomaticLayoutControllerAction.HEADINGS.text=\u0437\u0430 \u043D\u0435\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+AutomaticLayoutControllerAction.null.text=\u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E
+BackAction.tooltip=\u0421\u043A\u043E\u043A \u0443\u043D\u0430\u0437\u0430\u0434 \u043D\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E\u043C \u043D\u0438\u0437\u0443
+background=\u041F\u043E\u0437\u0430\u0434\u0438\u043D\u0430
+bitmaps=\u0420\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0430 \u0441\u043B\u0438\u043A\u0430
+black=\u0426\u0440\u043D\u043E
+BlinkingNodeHookAction.text=\u0422\u0440\u0435\u043F\u0435\u0440\u0435\u045B\u0438 \u0447\u0432\u043E\u0440
+BlinkingNodeHookAction.tooltip=<html>\u041E\u0432\u043E \u0447\u0438\u043D\u0438 \u0434\u0430 \u0447\u0432\u043E\u0440 \u0442\u0440\u0435\u043F\u0435\u0440\u0438. \u0411\u0443\u0434\u0438\u0442\u0435 \u043E\u043F\u0440\u0435\u0437\u043D\u0438. \u041D\u0435 \u043F\u043E\u0432\u0435\u0437\u0443\u0458\u0442\u0435 \u0433\u0430 \u0441 \u043F\u0440\u0435\u0432\u0438\u0448\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0430 \u0438 <strong> \u043D\u0435 \u0441 \u043E\u0441\u0442\u0430\u043B\u0438\u [...]
+blue=\u041F\u043B\u0430\u0432\u0430
+BoldAction.text=\u041F\u043E\u0434\u0435\u0431\u0459\u0430\u043D\u043E
+boldify_branch=\u041F\u043E\u0434\u0435\u0431\u0459\u0430\u0458
+branch=\u0413\u0440\u0430\u043D\u0430
+BranchesOverlapAction.text=\u0413\u0440\u0430\u043D\u0435 \u043C\u043E\u0433\u0443 \u0434\u0430 \u0441\u0435 \u043F\u0440\u0435\u043A\u043B\u0430\u043F\u0430\u0458\u0443
+browse=\u041F\u0440\u0435\u0433\u043B\u0435\u0434...
+calendar_attributes_panel=\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440 \u0438 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430
+calendar_panel=\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440
+can_not_connect_to_info_server=\u041D\u0435 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u0442\u0438 \u043D\u0430 \u043F\u043E\u0441\u043B\u0443\u0436\u0438\u0442\u0435\u0459
+can_not_delete_predefined_style=\u041D\u0435 \u043C\u043E\u0433\u0443 \u043E\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0443\u043D\u0430\u043F\u0440\u0435\u0434 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0438 \u0441\u0442\u0438\u043B
+can_not_delete_root_style=\u041D\u0435 \u043C\u043E\u0433\u0443 \u043E\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0438\u0437\u0432\u043E\u0440\u043D\u0438 \u0441\u0442\u0438\u043B
+can_not_delete_style_group=\u041D\u0435 \u043C\u043E\u0433\u0443 \u043E\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0441\u043A\u0443\u043F\u0438\u043D\u0443 \u0441\u0442\u0438\u043B\u043E\u0432\u0430
+can_not_save_key_set=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0438 \u0441\u043A\u0443\u043F \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0435\u0447\u0438\u0446\u0430
+cancel=&\u041E\u0442\u043A\u0430\u0436\u0438
+CancelAction.text=&\u041E\u0442\u043A\u0430\u0436\u0438
+cannot_add_parent_diff_parents=\u0421\u0432\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0438 \u043C\u043E\u0440\u0430\u0458\u0443 \u0438\u043C\u0430\u0442\u0438 \u0438\u0441\u0442\u043E\u0433 \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u0437\u0430 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435 \u043E\u0432\u0435 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0435.
+cannot_add_parent_to_root=\u041A\u043E\u0440\u0435\u043D\u0441\u043A\u0438 \u0447\u0432\u043E\u0440 \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043D\u043E\u0432\u043E\u043C \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u043C
+cannot_delete_root=\u041A\u043E\u0440\u0435\u043D\u0441\u043A\u0438 \u0447\u0432\u043E\u0440 \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0438\u043B\u0438 \u0438\u0437\u0440\u0435\u0437\u0430\u0442\u0438
+cannot_join_nodes_with_children=\u0427\u0432\u043E\u0440\u043E\u0432\u0435 \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u0442\u0438 \u0441 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438\u043C
+cannot_move_to_child=\u0427\u0432\u043E\u0440 \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u043E\u043C\u0435\u0440\u0438\u0442\u0438 \u043F\u0440\u0435\u043C\u0430 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u043C \u0447\u0432\u043E\u0440\u0443.
+CenterAction.text=\u0421\u0440\u0435\u0434\u0438\u043D\u0430
+CenterSelectedNodeAction.text=\u041E\u0434\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440 \u0443 \u0441\u0440\u0435\u0434\u0438\u043D\u0438
+ChangeConnectorArrowsAction.backward.text=\u041D\u0430\u0446\u0440\u0430\u0458 \u0441\u0442\u0440\u0435\u043B\u0438\u0446\u0443 \u0443\u043D\u0430\u0437\u0430\u0434
+ChangeConnectorArrowsAction.both.text=\u041D\u0430\u0446\u0440\u0442\u0430\u0458 \u0441\u0442\u0440\u0435\u043B\u0438\u0446\u0443 \u043D\u0430\u043F\u0440\u0435\u0434 \u0438 \u043D\u0430\u0437\u0430\u0434
+ChangeConnectorArrowsAction.forward.text=\u041D\u0430\u0446\u0440\u0442\u0430\u0458 \u0441\u0442\u0440\u0435\u043B\u0438\u0446\u0443 \u043D\u0430\u043F\u0440\u0435\u0434
+ChangeConnectorArrowsAction.none.text=\u041D\u0438\u0448\u0442\u0430
+ChangeConnectorArrowsAction.text=\u041F\u0440\u043E\u043C\u0435\u043D\u0430 \u0441\u0442\u0440\u0435\u043B\u0438\u0446\u0430 \u043F\u043E\u0432\u0435\u0437\u043D\u0438\u043A\u0430
+ChangeConnectorShapeAction.CUBIC_CURVE.text=\u041A\u0440\u0438\u0432\u0430
+ChangeConnectorShapeAction.EDGE_LIKE.text=\u0421\u0438\u043C\u0443\u043B\u0430\u0446\u0438\u0458\u0430 \u0440\u0443\u0431\u0430
ChangeConnectorShapeAction.LINE.text=\u0426\u0440\u0442\u0430
-ChangeConnectorShapeAction.LINEAR_PATH.text=\u041b\u0438\u043d\u0435\u0430\u0440\u043d\u0430 \u043f\u0443\u0442\u0430\u045a\u0430
-ChangeNodeLevelLeftsAction.text=\u041f\u0440\u0435\u043c\u0435\u0448\u0442\u0430\u045a\u0435 \u0447\u0432\u043e\u0440\u0430 (\u041d\u0430\u0434\u0440\u0435\u0452\u0435\u043d - \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u0430\u043d)
-ChangeNodeLevelLeftsAction.tooltip=\u041b\u0435\u0432\u043e \u043e\u0434 \u043a\u043e\u0440\u0435\u043d\u0430 \u0447\u0432\u043e\u0440\u043e\u0432\u0438 \u0441\u0443 \u043f\u043e\u043c\u0435\u0440\u0435\u043d\u0438 \u043f\u0440\u0435\u043c\u0430 \u0434\u043e\u043b\u0435. \u0427\u0432\u043e\u0440\u043e\u0432\u0438 \u0441\u0443 \u043f\u043e\u0441\u0442\u0430\u043b\u0438 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u043e\u0434 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u043 [...]
-ChangeNodeLevelRightsAction.text=\u041f\u0440\u0435\u043c\u0435\u0448\u0442\u0430\u045a\u0435 \u0447\u0432\u043e\u0440 (\u0420\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u0430\u043d - \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d)
-ChangeNodeLevelRightsAction.tooltip=\u0414\u0435\u0441\u043d\u043e \u043e\u0434 \u043a\u043e\u0440\u0435\u043d\u0430 \u0447\u0432\u043e\u0440\u043e\u0432\u0438 \u0441\u0443 \u043f\u043e\u043c\u0435\u0440\u0435\u043d\u0438 \u043f\u0440\u0435\u043c\u0430 \u0434\u043e\u043b\u0435. \u0427\u0432\u043e\u0440\u043e\u0432\u0438 \u0441\u0443 \u043f\u043e\u0441\u0442\u0430\u043b\u0438 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u043e\u0434 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u04 [...]
-choose_background_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u043e\u0458\u0443 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0435 \u043c\u0430\u043f\u0435:
-choose_cloud_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u043e\u0458\u0443 \u043e\u0431\u043b\u0430\u0447\u0438\u045b\u0430:
-choose_edge_color=\u041e\u0434\u0430\u0431\u0435\u0440\u0438 \u0431\u043e\u0458\u0443 \u0440\u0443\u0431\u0430
-choose_map_background_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0441\u043a\u0443 \u0431\u043e\u0458\u0443 \u043c\u0430\u043f\u0435
-choose_node_background_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u043e\u0458\u0443 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0435 \u0447\u0432\u043e\u0440\u0430:
-choose_node_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u043e\u0458\u0443 \u0447\u0432\u043e\u0440\u0430:
-ClearLinkAnchorAction.text=\u041e\u0447\u0438\u0441\u0442\u0438 \u0441\u0438\u0434\u0440\u043e \u0432\u0435\u0437\u0435
-ClearLinkAnchorAction.tooltip=<html>\u043e\u0447\u0438\u0441\u0442\u0438 \u043f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0459\u0435\u043d\u043e \u0441\u0438\u0434\u0440\u043e \u0447\u0432\u043e\u0440\u0430</html>
-close_btn=&\u0417\u0430\u0442\u0432\u043e\u0440\u0438
-CloseAction.text=&\u0417\u0430\u0442\u0432\u043e\u0440\u0438 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u0443 \u043c\u0430\u043f\u0443
-CloudAction.text=\u0414\u043e\u0434\u0430\u0458 / \u0443\u043a\u043b\u043e\u043d\u0438 \u043e\u0431\u043b\u0430\u043a (\u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u043e)
-CloudColorAction.text=\u0411\u043e\u0458\u0430 \u043e\u0431\u043b\u0430\u0447\u0438\u045b\u0430...
-CloudShapeAction.ARC.text=\u041b\u0443\u043a
-CloudShapeAction.RECT.text=\u041f\u0440\u0430\u0432\u043e\u0443\u0433\u0430\u043e\u043d\u0438\u043a
-CloudShapeAction.ROUND_RECT.text=\u0417\u0430\u043e\u0431\u0459\u0435\u043d\u0438 \u043f\u0440\u0430\u0432\u043e\u0443\u0433\u0430\u043e\u043d\u0438\u043a
+ChangeConnectorShapeAction.LINEAR_PATH.text=\u041B\u0438\u043D\u0435\u0430\u0440\u043D\u0430 \u043F\u0443\u0442\u0430\u045A\u0430
+ChangeNodeLevelLeftsAction.text=\u041F\u0440\u0435\u043C\u0435\u0448\u0442\u0430\u045A\u0435 \u0447\u0432\u043E\u0440\u0430 (\u041D\u0430\u0434\u0440\u0435\u0452\u0435\u043D - \u0440\u0430\u0432\u043D\u043E\u043F\u0440\u0430\u0432\u0430\u043D)
+ChangeNodeLevelLeftsAction.tooltip=\u041B\u0435\u0432\u043E \u043E\u0434 \u043A\u043E\u0440\u0435\u043D\u0430 \u0447\u0432\u043E\u0440\u043E\u0432\u0438 \u0441\u0443 \u043F\u043E\u043C\u0435\u0440\u0435\u043D\u0438 \u043F\u0440\u0435\u043C\u0430 \u0434\u043E\u043B\u0435. \u0427\u0432\u043E\u0440\u043E\u0432\u0438 \u0441\u0443 \u043F\u043E\u0441\u0442\u0430\u043B\u0438 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u043E\u0434 \u0440\u0430\u0432\u043D\u043E\u043F\u0440\u0430\u043 [...]
+ChangeNodeLevelRightsAction.text=\u041F\u0440\u0435\u043C\u0435\u0448\u0442\u0430\u045A\u0435 \u0447\u0432\u043E\u0440 (\u0420\u0430\u0432\u043D\u043E\u043F\u0440\u0430\u0432\u0430\u043D - \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D)
+ChangeNodeLevelRightsAction.tooltip=\u0414\u0435\u0441\u043D\u043E \u043E\u0434 \u043A\u043E\u0440\u0435\u043D\u0430 \u0447\u0432\u043E\u0440\u043E\u0432\u0438 \u0441\u0443 \u043F\u043E\u043C\u0435\u0440\u0435\u043D\u0438 \u043F\u0440\u0435\u043C\u0430 \u0434\u043E\u043B\u0435. \u0427\u0432\u043E\u0440\u043E\u0432\u0438 \u0441\u0443 \u043F\u043E\u0441\u0442\u0430\u043B\u0438 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u043E\u0434 \u0440\u0430\u0432\u043D\u043E\u043F\u0440\u04 [...]
+choose_background_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u043E\u0458\u0443 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0435 \u043C\u0430\u043F\u0435:
+choose_cloud_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u043E\u0458\u0443 \u043E\u0431\u043B\u0430\u0447\u0438\u045B\u0430:
+choose_edge_color=\u041E\u0434\u0430\u0431\u0435\u0440\u0438 \u0431\u043E\u0458\u0443 \u0440\u0443\u0431\u0430
+choose_map_background_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0441\u043A\u0443 \u0431\u043E\u0458\u0443 \u043C\u0430\u043F\u0435
+choose_node_background_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u043E\u0458\u0443 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0435 \u0447\u0432\u043E\u0440\u0430:
+choose_node_color=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0431\u043E\u0458\u0443 \u0447\u0432\u043E\u0440\u0430:
+ClearLinkAnchorAction.text=\u041E\u0447\u0438\u0441\u0442\u0438 \u0441\u0438\u0434\u0440\u043E \u0432\u0435\u0437\u0435
+ClearLinkAnchorAction.tooltip=<html>\u043E\u0447\u0438\u0441\u0442\u0438 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u0441\u0438\u0434\u0440\u043E \u0447\u0432\u043E\u0440\u0430</html>
+close_btn=&\u0417\u0430\u0442\u0432\u043E\u0440\u0438
+CloseAction.text=&\u0417\u0430\u0442\u0432\u043E\u0440\u0438 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0443 \u043C\u0430\u043F\u0443
+CloudAction.text=\u0414\u043E\u0434\u0430\u0458 / \u0443\u043A\u043B\u043E\u043D\u0438 \u043E\u0431\u043B\u0430\u043A (\u043F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u043E)
+CloudColorAction.text=\u0411\u043E\u0458\u0430 \u043E\u0431\u043B\u0430\u0447\u0438\u045B\u0430...
+CloudShapeAction.ARC.text=\u041B\u0443\u043A
+CloudShapeAction.RECT.text=\u041F\u0440\u0430\u0432\u043E\u0443\u0433\u0430\u043E\u043D\u0438\u043A
+CloudShapeAction.ROUND_RECT.text=\u0417\u0430\u043E\u0431\u0459\u0435\u043D\u0438 \u043F\u0440\u0430\u0432\u043E\u0443\u0433\u0430\u043E\u043D\u0438\u043A
CloudShapeAction.STAR.text=\u0417\u0432\u0435\u0437\u0434\u0430
-ColorProperty.ResetColor=\u0412\u0440\u0430\u0442\u0438 \u0438\u0437\u0432\u043e\u0440\u043d\u0435 \u0431\u043e\u0458\u0435
-combined=\u041a\u043e\u043c\u0431\u0438\u043d\u043e\u0432\u0430\u043d\u043e
-condition=\u0421\u0442\u0430\u045a\u0435
-confirmation=\u041f\u043e\u0442\u0432\u0440\u0434\u0430
-connector=\u041f\u043e\u0432\u0435\u0437\u043d\u0438\u043a
-connector_arrows=\u0421\u0442\u0440\u0435\u043b\u0438\u0446\u0430 \u043f\u0440\u0438\u043a\u0459\u0443\u0447\u043a\u0430
-connector_label=\u041e\u0437\u043d\u0430\u043a\u0430 \u043f\u043e\u0432\u0435\u0437\u043d\u0438\u043a\u0430
-connector_lines=\u0426\u0440\u0442\u0435 \u043f\u043e\u0432\u0435\u0437\u043d\u0438\u043a\u0430
-connector_shapes=\u041e\u0431\u043b\u0438\u043a \u043f\u043e\u0432\u0435\u0437\u043d\u0438\u043a\u0430
-ConnectorColorAction.text=\u0411\u043e\u0458\u0430 \u043f\u043e\u0432\u0435\u0437\u043d\u0438\u043a\u0430
-CopyAction.text=\u0423\u043c\u043d\u043e\u0436\u0438
-CopyAction.tooltip=\u0423\u043c\u043d\u043e\u0436\u0438 \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u0435 \u0433\u0440\u0430\u043d\u0435
-CopyAttributes.text=\u0423\u043c\u043d\u043e\u0436\u0438 &\u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430
-CopyIDAction.text=\u0423\u043c\u043d\u043e\u0436\u0438 \u0418\u0414 \u0447\u0432\u043e\u0440\u0430
-CopyMapStylesAction.text=\u0423\u043c\u043d\u043e\u0436\u0438 \u0441\u0442\u0438\u043b \u043c\u0430\u043f\u0435 \u0438\u0437...
-CopyNodeURIAction.text=\u0423\u043c\u043d\u043e\u0436\u0438 URI \u0447\u0432\u043e\u0440\u0430
-copyright=\u0410\u0443\u0442\u043e\u0440\u0441\u043a\u043e \u043f\u0440\u0430\u0432\u043e \u00a9 2000-2014 Freeplane \u0442\u0438\u043c\u0430 \u0438 \u043e\u0441\u0442\u0430\u043b\u0438\u0445
-CopySingleAction.text=\u0423\u043c\u043d\u043e\u0436\u0438 \u0447\u0432\u043e\u0440 \u043f\u043e\u0458\u0435\u0434\u0438\u043d\u0447\u043d\u043e
-CopySingleAction.tooltip=\u0423\u043c\u043d\u043e\u0436\u0438 \u0441\u0430\u043c\u043e \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440
-CopyStyleExtensionsAction.text=\u0423\u043c\u043d\u043e\u0436\u0438 \u043d\u0430\u0441\u0442\u0430\u0432\u043a\u0435 \u0438\u0437 \u0441\u0442\u0438\u043b\u0430 \u0447\u0432\u043e\u0440\u0430
-corrupt_map=\u0421\u0430\u0434\u0440\u0436\u0430\u0458 \u043c\u0430\u043f\u0435 \u0458\u0435 \u043e\u0448\u0442\u0435\u045b\u0435\u043d
+ColorProperty.ResetColor=\u0412\u0440\u0430\u0442\u0438 \u0438\u0437\u0432\u043E\u0440\u043D\u0435 \u0431\u043E\u0458\u0435
+combined=\u041A\u043E\u043C\u0431\u0438\u043D\u043E\u0432\u0430\u043D\u043E
+condition=\u0421\u0442\u0430\u045A\u0435
+confirmation=\u041F\u043E\u0442\u0432\u0440\u0434\u0430
+connector=\u041F\u043E\u0432\u0435\u0437\u043D\u0438\u043A
+connector_arrows=\u0421\u0442\u0440\u0435\u043B\u0438\u0446\u0430 \u043F\u0440\u0438\u043A\u0459\u0443\u0447\u043A\u0430
+connector_label=\u041E\u0437\u043D\u0430\u043A\u0430 \u043F\u043E\u0432\u0435\u0437\u043D\u0438\u043A\u0430
+connector_lines=\u0426\u0440\u0442\u0435 \u043F\u043E\u0432\u0435\u0437\u043D\u0438\u043A\u0430
+connector_shapes=\u041E\u0431\u043B\u0438\u043A \u043F\u043E\u0432\u0435\u0437\u043D\u0438\u043A\u0430
+ConnectorColorAction.text=\u0411\u043E\u0458\u0430 \u043F\u043E\u0432\u0435\u0437\u043D\u0438\u043A\u0430
+CopyAction.text=\u0423\u043C\u043D\u043E\u0436\u0438
+CopyAction.tooltip=\u0423\u043C\u043D\u043E\u0436\u0438 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0435 \u0433\u0440\u0430\u043D\u0435
+CopyAttributes.text=\u0423\u043C\u043D\u043E\u0436\u0438 &\u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430
+CopyIDAction.text=\u0423\u043C\u043D\u043E\u0436\u0438 \u0418\u0414 \u0447\u0432\u043E\u0440\u0430
+CopyMapStylesAction.text=\u0423\u043C\u043D\u043E\u0436\u0438 \u0441\u0442\u0438\u043B \u043C\u0430\u043F\u0435 \u0438\u0437...
+CopyNodeURIAction.text=\u0423\u043C\u043D\u043E\u0436\u0438 URI \u0447\u0432\u043E\u0440\u0430
+copyright=\u0410\u0443\u0442\u043E\u0440\u0441\u043A\u043E \u043F\u0440\u0430\u0432\u043E \u00A9 2000-2014 Freeplane \u0442\u0438\u043C\u0430 \u0438 \u043E\u0441\u0442\u0430\u043B\u0438\u0445
+CopySingleAction.text=\u0423\u043C\u043D\u043E\u0436\u0438 \u0447\u0432\u043E\u0440 \u043F\u043E\u0458\u0435\u0434\u0438\u043D\u0447\u043D\u043E
+CopySingleAction.tooltip=\u0423\u043C\u043D\u043E\u0436\u0438 \u0441\u0430\u043C\u043E \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440
+CopyStyleExtensionsAction.text=\u0423\u043C\u043D\u043E\u0436\u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u043A\u0435 \u0438\u0437 \u0441\u0442\u0438\u043B\u0430 \u0447\u0432\u043E\u0440\u0430
+corrupt_map=\u0421\u0430\u0434\u0440\u0436\u0430\u0458 \u043C\u0430\u043F\u0435 \u0458\u0435 \u043E\u0448\u0442\u0435\u045B\u0435\u043D
CreateConjunctConditionAction.text=\u0418
-CreateDisjunctConditionAction.text=\u0418\u043b\u0438
-CreateNotSatisfiedConditionAction.text=\u041d\u0435
-CreationModificationPluginAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 &\u0432\u0440\u0435\u043c\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0435
-CreationModificationPluginAction.tooltip=<html>\u041e\u0432\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0458\u0430 \u0431\u0435\u043b\u0435\u0436\u0438 \u0432\u0440\u0435\u043c\u0435 \u0441\u0442\u0432\u0430\u0440\u0430\u045a\u0430 \u0447\u0432\u043e\u0440\u0430 \u0438 \u0432\u0440\u0435\u043c\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u0430.</html>
-current_dir=\u041c\u0430\u043f\u0435
+CreateDisjunctConditionAction.text=\u0418\u043B\u0438
+CreateNotSatisfiedConditionAction.text=\u041D\u0435
+CreationModificationPluginAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 &\u0432\u0440\u0435\u043C\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0435
+CreationModificationPluginAction.tooltip=<html>\u041E\u0432\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430 \u0431\u0435\u043B\u0435\u0436\u0438 \u0432\u0440\u0435\u043C\u0435 \u0441\u0442\u0432\u0430\u0440\u0430\u045A\u0430 \u0447\u0432\u043E\u0440\u0430 \u0438 \u0432\u0440\u0435\u043C\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u0430.</html>
+current_dir=\u041C\u0430\u043F\u0435
CutAction.text=\u0418\u0441\u0435\u0446\u0438
-decrease_branch_font_size=\u041c\u0430\u045a\u0430 \u0441\u043b\u043e\u0432\u0430
-DecreaseNodeFontAction.text=\u041c\u0430\u045a\u0430 \u0441\u043b\u043e\u0432\u0430
-default=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u043e
-DefaultColorAction.text=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0430 \u0431\u043e\u0458\u0430
+decrease_branch_font_size=\u041C\u0430\u045A\u0430 \u0441\u043B\u043E\u0432\u0430
+DecreaseNodeFontAction.text=\u041C\u0430\u045A\u0430 \u0441\u043B\u043E\u0432\u0430
+default=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u043E
+DefaultColorAction.text=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u0431\u043E\u0458\u0430
defaultstyle.details=\u0414\u0435\u0442\u0430\u0459\u0438
-defaultstyle.floating=\u041f\u043b\u0443\u0442\u0430\u0458\u0443\u045b\u0438 \u0447\u0432\u043e\u0440
-defaultstyle.note=\u0411\u0435\u043b\u0435\u0448\u043a\u0430
+defaultstyle.floating=\u041F\u043B\u0443\u0442\u0430\u0458\u0443\u045B\u0438 \u0447\u0432\u043E\u0440
+defaultstyle.note=\u0411\u0435\u043B\u0435\u0448\u043A\u0430
delete=&\u0418\u0437\u0431\u0440\u0438\u0448\u0438
-delete_child=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0447\u0432\u043e\u0440
-DeleteAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u0447\u0432\u043e\u0440
+delete_child=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0447\u0432\u043E\u0440
+DeleteAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u0447\u0432\u043E\u0440
DeleteConditionAction.text=\u0418\u0437\u0431\u0440\u0438\u0448\u0438
-DeleteDetailsAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u0434\u0435\u0442\u0430\u0459\u0435 \u0447\u0432\u043e\u0440\u0430
-DeleteLevelStyleAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u045a\u0435 \u043d\u0438\u0432\u043e\u0430 \u0441\u0442\u0438\u043b\u0430
-DeleteStyleAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u0441\u0442\u0438\u043b
-DeleteUserStyleAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0438 \u0434\u0435\u0444\u0438\u043d\u0438\u0441\u0430\u043d\u0438 \u0441\u0442\u0438\u043b
-dialect_info.app=\u041c\u0430\u043f\u0430 \u0443\u043c\u0430 {0} \u0458\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u0459\u0435\u043d\u0430 \u0441\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043e\u043c {1}.
-dialect_info.unknownApp=\u041c\u0430\u043f\u0430 \u0443\u043c\u0430 {0} \u0458\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u0459\u0435\u043d\u0430 \u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u0435 \u043d\u0435\u043f\u043e\u0437\u043d\u0430\u0442\u043e\u0433 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430.
-dialect_info.unknownURL=\u040a\u0435\u043d\u0430 \u0432\u0435\u0431 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0438\u0458\u0435 \u043f\u043e\u0437\u043d\u0430\u0442\u0430
-dialect_info.url=\u041f\u043e\u0441\u0435\u0442\u0438\u0442\u0435 \u0432\u0435\u0431 \u0441\u0430\u0458\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430 {0} \u0437\u0430 \u0432\u0438\u0448\u0435 \u043f\u043e\u0434\u0430\u0442\u0430\u043a\u0430.
-dialect_info.warning=Freeplane \u043c\u043e\u0436\u0435 \u043e\u0442\u0432\u043e\u0440\u0438\u0442\u0438, \u043f\u0440\u0438\u043a\u0430\u0437\u0430\u0442\u0438 \u0438\u043b\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0438 \u043f\u043e\u0433\u0440\u0448\u043d\u043e.
-DirectHtmlFlavorHandler=HTML \u043a\u0430\u043e \u043f\u043e\u0458\u0435\u0434\u0438\u043d\u0430\u0447\u043d\u0438 \u0447\u0432\u043e\u0440
-DocumentationAction.text=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0458\u0430
-down=\u0414&\u043e\u043b\u0435
-download=\u041f\u0440\u0435\u0443\u0437\u0438\u043c\u0430\u045a\u0435
-dropped_file_error=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u043e\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u0438\u0441\u043f\u0443\u0448\u0442\u0435\u043d\u0443 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443. \u0420\u0430\u0437\u043b\u043e\u0433: {0}
+DeleteDetailsAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u0434\u0435\u0442\u0430\u0459\u0435 \u0447\u0432\u043E\u0440\u0430
+DeleteLevelStyleAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435 \u043D\u0438\u0432\u043E\u0430 \u0441\u0442\u0438\u043B\u0430
+DeleteStyleAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u0441\u0442\u0438\u043B
+DeleteUserStyleAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u0434\u0435\u0444\u0438\u043D\u0438\u0441\u0430\u043D\u0438 \u0441\u0442\u0438\u043B
+dialect_info.app=\u041C\u0430\u043F\u0430 \u0443\u043C\u0430 {0} \u0458\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u0430 \u0441\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u043C {1}.
+dialect_info.unknownApp=\u041C\u0430\u043F\u0430 \u0443\u043C\u0430 {0} \u0458\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u0430 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 \u043D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u043E\u0433 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430.
+dialect_info.unknownURL=\u040A\u0435\u043D\u0430 \u0432\u0435\u0431 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043D\u0438\u0458\u0435 \u043F\u043E\u0437\u043D\u0430\u0442\u0430
+dialect_info.url=\u041F\u043E\u0441\u0435\u0442\u0438\u0442\u0435 \u0432\u0435\u0431 \u0441\u0430\u0458\u0442 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430 {0} \u0437\u0430 \u0432\u0438\u0448\u0435 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430.
+dialect_info.warning=Freeplane \u043C\u043E\u0436\u0435 \u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0438, \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u0442\u0438 \u0438\u043B\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0438 \u043F\u043E\u0433\u0440\u0448\u043D\u043E.
+DirectHtmlFlavorHandler=HTML \u043A\u0430\u043E \u043F\u043E\u0458\u0435\u0434\u0438\u043D\u0430\u0447\u043D\u0438 \u0447\u0432\u043E\u0440
+DocumentationAction.text=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0430
+down=\u0414&\u043E\u043B\u0435
+download=\u041F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435
+dropped_file_error=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0438\u0441\u043F\u0443\u0448\u0442\u0435\u043D\u0443 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443. \u0420\u0430\u0437\u043B\u043E\u0433: {0}
edge=\u0420\u0443\u0431
-edge_is_formatted_by_style=\u041e\u0431\u043b\u0438\u043a \u0440\u0443\u0431\u0430 \u043e\u0434\u0440\u0435\u0452\u0435\u043d \u0458\u0435 \u0443 \u0441\u0442\u0438\u043b\u0443. \u0423\u0440\u0435\u0434\u0438\u0442\u0435 \u0441\u0440\u043e\u0434\u043d\u0435 \u0441\u0442\u0438\u043b\u043e\u0432\u0435 \u0430\u043a\u043e \u0436\u0435\u043b\u0438\u0442\u0435.
-edge_style=\u0421\u0442\u0438\u043b \u0440\u0443\u0431\u0430
-edge_width=\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u0443\u0431\u0430
-EdgeColorAction.text=\u0411\u043e\u0458\u0430 \u0440\u0443\u0431\u0430...
-EdgeStyleAction.bezier.text=\u041b\u0430\u0433\u0430\u043d\u043e \u0437\u0430\u043e\u0431\u0459\u0435\u043d (\u043a\u0440\u0438\u0432\u0438\u043d\u0430)
-EdgeStyleAction.bezier.tooltip=<html>\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0440\u0443\u0431 \u043a\u0430\u043e \u0433\u043b\u0430\u0442\u043a\u0443 \u043a\u0440\u0438\u0432\u0443.</html>
-EdgeStyleAction.hide_edge.text=\u0421\u043a\u0440\u0438\u0432\u0435\u043d\u0438 \u0440\u0443\u0431
-EdgeStyleAction.hide_edge.tooltip=<html>\u0417\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435 \u043f\u0440\u0438\u043a\u0430\u0436\u0438 \u0440\u0443\u0431 \u0434\u043e \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0433 \u043a\u0430\u043e<br>\u0442\u0430\u0447\u043a\u0430\u0441\u0442\u0443 \u043b\u0438\u043d\u0438\u0458\u0443. \u0423 \u0441\u0443\u043f\u0440\u043e\u0442\u043d\u043e\u043c \u0441\u0430\u043a\u0440\u0438\u0458 \u0 [...]
-EdgeStyleAction.horizontal.text=\u0412\u043e\u0434\u043e\u0440\u0430\u0432\u043d\u043e
-EdgeStyleAction.horizontal.tooltip=<html>\u041a\u043e\u0440\u0438\u0441\u0442\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u043d\u0435 \u043f\u0440\u0430\u0432\u0435 \u043b\u0438\u043d\u0438\u0458\u0435 \u0437\u0430 \u0440\u0443\u0431\u043e\u0432\u0435.</html>
-EdgeStyleAction.linear.text=\u041b\u0438\u043d\u0435\u0430\u0440\u043d\u043e
-EdgeStyleAction.linear.tooltip=<html>\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0438\u0432\u0438\u0446\u0435 \u043a\u0430\u043e \u043f\u0440\u0430\u0432\u0435 \u043b\u0438\u043d\u0438\u0458\u0435.</html>
-EdgeStyleAction.sharp_bezier.text=\u041e\u0448\u0442\u0440\u043e \u0437\u0430\u043e\u0431\u0459\u0435\u043d (\u043a\u0440\u0438\u0432\u0438\u043d\u0430)
-EdgeStyleAction.sharp_bezier.tooltip=<html>\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0438\u0432\u0438\u0446\u0435 \u043a\u0430\u043e \u0433\u043b\u0430\u0442\u043a\u0435 \u043a\u0440\u0438\u0432\u0435 \u0441\u0430 \u0437\u0430\u043e\u0448\u0442\u0440\u0435\u043d\u0438\u043c \u043a\u0440\u0430\u0458\u0435\u0432\u0438\u043c\u0430.</html>
-EdgeStyleAction.sharp_linear.text=\u041e\u0448\u0442\u0440\u043e \u043b\u0438\u043d\u0435\u0430\u0440\u043d\u043e
-EdgeStyleAction.sharp_linear.tooltip=<html>\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0438\u0432\u0438\u0446\u0435 \u043a\u0430\u043e \u043f\u0440\u0430\u0432\u0435 \u043b\u0438\u043d\u0438\u0458\u0435 \u0441\u0430 \u0437\u0430\u043e\u0448\u0442\u0440\u0435\u043d\u0438\u043c \u043a\u0440\u0430\u0458\u0435\u0432\u0438\u043c\u0430.</html>
-EdgeStyleAsParentAction.text=\u041a\u0430\u043e \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u0438
-EdgeStyleAsParentAction.tooltip=<html>\u041a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0441\u0442\u0438\u043b \u0438\u0432\u0438\u0446\u0435 \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430.</html>[\u0437\u0430\u0441\u0442\u0430\u0440\u0435\u043e]
-EdgeWidthAction_width_parent.text=\u041d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u0438
-EdgeWidthAction_width_thin.text=\u0422\u0430\u043d\u043a\u043e
+edge_is_formatted_by_style=\u041E\u0431\u043B\u0438\u043A \u0440\u0443\u0431\u0430 \u043E\u0434\u0440\u0435\u0452\u0435\u043D \u0458\u0435 \u0443 \u0441\u0442\u0438\u043B\u0443. \u0423\u0440\u0435\u0434\u0438\u0442\u0435 \u0441\u0440\u043E\u0434\u043D\u0435 \u0441\u0442\u0438\u043B\u043E\u0432\u0435 \u0430\u043A\u043E \u0436\u0435\u043B\u0438\u0442\u0435.
+edge_style=\u0421\u0442\u0438\u043B \u0440\u0443\u0431\u0430
+edge_width=\u0428\u0438\u0440\u0438\u043D\u0430 \u0440\u0443\u0431\u0430
+EdgeColorAction.text=\u0411\u043E\u0458\u0430 \u0440\u0443\u0431\u0430...
+EdgeStyleAction.bezier.text=\u041B\u0430\u0433\u0430\u043D\u043E \u0437\u0430\u043E\u0431\u0459\u0435\u043D (\u043A\u0440\u0438\u0432\u0438\u043D\u0430)
+EdgeStyleAction.bezier.tooltip=<html>\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0440\u0443\u0431 \u043A\u0430\u043E \u0433\u043B\u0430\u0442\u043A\u0443 \u043A\u0440\u0438\u0432\u0443.</html>
+EdgeStyleAction.hide_edge.text=\u0421\u043A\u0440\u0438\u0432\u0435\u043D\u0438 \u0440\u0443\u0431
+EdgeStyleAction.hide_edge.tooltip=<html>\u0417\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435 \u043F\u0440\u0438\u043A\u0430\u0436\u0438 \u0440\u0443\u0431 \u0434\u043E \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u043A\u0430\u043E<br>\u0442\u0430\u0447\u043A\u0430\u0441\u0442\u0443 \u043B\u0438\u043D\u0438\u0458\u0443. \u0423 \u0441\u0443\u043F\u0440\u043E\u0442\u043D\u043E\u043C \u0441\u0430\u043A\u0440\u0438\u0458 \u0 [...]
+EdgeStyleAction.horizontal.text=\u0412\u043E\u0434\u043E\u0440\u0430\u0432\u043D\u043E
+EdgeStyleAction.horizontal.tooltip=<html>\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u043D\u043E\u0440\u043C\u0430\u043B\u043D\u0435 \u043F\u0440\u0430\u0432\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 \u0437\u0430 \u0440\u0443\u0431\u043E\u0432\u0435.</html>
+EdgeStyleAction.linear.text=\u041B\u0438\u043D\u0435\u0430\u0440\u043D\u043E
+EdgeStyleAction.linear.tooltip=<html>\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0438\u0432\u0438\u0446\u0435 \u043A\u0430\u043E \u043F\u0440\u0430\u0432\u0435 \u043B\u0438\u043D\u0438\u0458\u0435.</html>
+EdgeStyleAction.sharp_bezier.text=\u041E\u0448\u0442\u0440\u043E \u0437\u0430\u043E\u0431\u0459\u0435\u043D (\u043A\u0440\u0438\u0432\u0438\u043D\u0430)
+EdgeStyleAction.sharp_bezier.tooltip=<html>\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0438\u0432\u0438\u0446\u0435 \u043A\u0430\u043E \u0433\u043B\u0430\u0442\u043A\u0435 \u043A\u0440\u0438\u0432\u0435 \u0441\u0430 \u0437\u0430\u043E\u0448\u0442\u0440\u0435\u043D\u0438\u043C \u043A\u0440\u0430\u0458\u0435\u0432\u0438\u043C\u0430.</html>
+EdgeStyleAction.sharp_linear.text=\u041E\u0448\u0442\u0440\u043E \u043B\u0438\u043D\u0435\u0430\u0440\u043D\u043E
+EdgeStyleAction.sharp_linear.tooltip=<html>\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0438\u0432\u0438\u0446\u0435 \u043A\u0430\u043E \u043F\u0440\u0430\u0432\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 \u0441\u0430 \u0437\u0430\u043E\u0448\u0442\u0440\u0435\u043D\u0438\u043C \u043A\u0440\u0430\u0458\u0435\u0432\u0438\u043C\u0430.</html>
+EdgeStyleAsParentAction.text=\u041A\u0430\u043E \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u0438
+EdgeStyleAsParentAction.tooltip=<html>\u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0441\u0442\u0438\u043B \u0438\u0432\u0438\u0446\u0435 \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430.</html>[\u0437\u0430\u0441\u0442\u0430\u0440\u0435\u043E]
+EdgeWidthAction_width_parent.text=\u041D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u0438
+EdgeWidthAction_width_thin.text=\u0422\u0430\u043D\u043A\u043E
edit=&\u0423\u0440\u0435\u0434\u0438
edit.decision=HTML \u0423\u0440\u0435\u0452\u0438\u0432\u0430\u0447
-edit.edit_rich_text=\u0416\u0435\u043b\u0438\u0448 \u043b\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u045a\u0435 \u043a\u0430\u043e \u043f\u043e\u0434\u0435\u0431\u0459\u0430\u043d\u043e \u0438\u043b\u0438 \u0438\u0441\u043a\u043e\u0448\u0435\u043d\u043e?
-edit_details=\u0423\u0440\u0435\u0434\u0438 \u0434\u0435\u0442\u0430\u0459\u0435 \u0447\u0432\u043e\u0440\u0430...
-edit_end_label=<html>\u041f\u043e\u0432\u0435\u0437\u043d\u0438\u043a<br>label
-edit_label_font_family=\u0421\u043b\u043e\u0432\u043e\u043b\u0438\u043a
-edit_label_font_size=\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430
-edit_link_manually=\u0420\u0443\u0447\u043d\u043e \u0443\u0440\u0435\u0434\u0438 \u0432\u0435\u0437\u0443 (\u0445\u0438\u043f\u0435\u0440\u0432\u0435\u0437\u0443)...
-edit_long_node=\u0423\u0440\u0435\u0434\u0438 \u0458\u0435\u0437\u0433\u0440\u043e \u0447\u0432\u043e\u0440\u0430 \u0443 \u0434\u0438\u0458\u0430\u043b\u043e\u0433\u0443...
-edit_middle_label=<html>\u0421\u0440\u0435\u0434\u045a\u0430<br>\u043e\u0437\u043d\u0430\u043a\u0430
-edit_source_label=<html>\u0418\u0437\u0432\u043e\u0440\u043d\u0430<br>\u043e\u0437\u043d\u0430\u043a\u0430
-edit_target_label=\u0423\u0440\u0435\u0434\u0438 \u0446\u0438\u0459\u043d\u0438 \u043d\u0430\u0437\u0438\u0432
-edit_transparency_label=\u041f\u0440\u043e\u0437\u0438\u0440\u043d\u043e\u0441\u0442
-edit_width_label=\u0428\u0438\u0440\u0438\u043d\u0430
-EditAction.text=\u0423\u0440\u0435\u0434\u0438 \u0458\u0435\u0437\u0433\u0440\u043e \u0447\u0432\u043e\u0440a \u0443 \u043b\u0438\u043d\u0438\u0458\u0438
-EditAttributesAction.text=\u0423\u0440\u0435\u0434\u0438 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0430 \u0443 \u043b\u0438\u043d\u0438\u0458\u0438
-EditDetailsAction.text=\u0423\u0440\u0435\u0434\u0438 \u0434\u0435\u0442\u0430\u0459\u0435 \u0447\u0432\u043e\u0440\u0430 \u0443 \u043b\u0438\u043d\u0438\u0458\u0438
-EditDetailsInDialogAction.text=\u0418\u0437\u043c\u0435\u043d\u0438 \u0434\u0435\u0442\u0430\u0459\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0430 \u0443 \u0434\u0438\u0458\u0430\u043b\u043e\u0433\u0443
-EditFilterAction.text=\u0421\u0430\u0447\u0438\u043d\u0438 \u0444\u0438\u043b\u0442\u0435\u0440
-EditLongAction.text=\u0423\u0440\u0435\u0434\u0438 \u0458\u0435\u0437\u0433\u0440\u043e \u0447\u0432\u043e\u0440\u0430 \u0443 \u0434\u0438\u0458\u0430\u043b\u043e\u0433\u0443
-EditNoteInDialogAction.text=\u0423\u0440\u0435\u0434\u0438 \u0431\u0435\u043b\u0435\u0448\u043a\u0435 \u0443 \u0434\u0438\u0458\u0430\u043b\u043e\u0433\u0443
-EditScript=\u0423\u0440\u0435\u0434\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0443...
-EditStylesAction.text=\u0423\u0440\u0435\u0434\u0438 \u0441\u0442\u0438\u043b
-EncryptedMap.text=\u041d\u0430\u043f\u0440\u0430\u0432\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0443 \u043c\u0430\u043f\u0443...
-EncryptedMap.tooltip=\u041d\u043e\u0432\u0430 \u0437\u0430\u0448\u0442\u0438\u045b\u0435\u043d\u0430 \u043c\u0430\u043f\u0430
-enter_base_url=\u0411\u0438\u045b\u0435 \u0437\u0430\u043b\u0435\u043f\u0459\u0435\u043d\u0435 \u0440\u0435\u043b\u0430\u0442\u0438\u0432\u043d\u0435 \u0430\u0434\u0440\u0435\u0441\u0435. \u041c\u043e\u043b\u0438\u043c \u0443\u043d\u0435\u0441\u0438\u0442\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0438 \u0423\u0420\u041b.
-enter_condition_name=\u0423\u043f\u0438\u0448\u0438 \u043d\u043e\u0432\u043e \u0438\u043c\u0435 \u0443\u0441\u043b\u043e\u0432\u0430
-enter_confirms=&Enter \u043a\u0430\u043e \u043f\u043e\u0442\u0432\u0440\u0434\u0430
-enter_keyset_name=\u0423\u043d\u0435\u0441\u0438 \u043d\u0430\u0437\u0438\u0432 \u0441\u043a\u0443\u043f\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0435\u0447\u0438\u0446\u0430
-enter_map_url=\u0423\u043d\u0435\u0441\u0438 \u0423\u0420\u041b \u043c\u0430\u043f\u0435
-enter_new_style_name=\u0423\u043d\u0435\u0441\u0438 \u043d\u0430\u0437\u0438\u0432 \u043d\u043e\u0432\u043e\u0433 \u0441\u0442\u0438\u043b\u0430
-enter_node_id=\u0423\u043d\u0435\u0441\u0438 \u0418\u0414 \u0447\u0432\u043e\u0440\u0430
-enter_zoom=\u0423\u043a\u0459\u0443\u0447\u0438 \u0443\u0432\u0435\u045b\u0430\u045a\u0435
-EnterPassword.text=\u0423\u043d\u0435\u0441\u0438 \u043b\u043e\u0437\u0438\u043d\u043a\u0443
-error=\u0413\u0440\u0435\u0448\u043a\u0430
-error_applying_template=\u0413\u0440\u0435\u0448\u043a\u0430 \u043f\u0440\u0438\u043b\u0438\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0435 XSL \u0448\u0430\u0431\u043b\u043e\u043d\u0430.
-error_creating_directory=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u0438 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0443 \u0437\u0430 \u0438\u0437\u0432\u043e\u0437.
-error_in_template=\u0413\u0440\u0435\u0448\u043a\u0435 \u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0443 \u043c\u0430\u043f\u0435 {0}. \u041f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u0434\u0430 \u0443\u043a\u043b\u043e\u043d\u0438\u0442\u0435 \u043e\u0432\u0443 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443.
-errornumber={0} \u0433\u0440\u0435\u0448\u043a\u0430
-ExecuteScriptError.text=\u0413\u0440\u0435\u0448\u043a\u0430 \u043f\u0440\u0438 \u0438\u0437\u0432\u043e\u0452\u0435\u045a\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0435:\n{0}
-ExecuteScriptForAllNodes.text=\u0418\u0437\u0432\u043e\u0452\u0435\u045a\u0435 \u0441\u0432\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u0438
-ExecuteScriptForSelectionAction.text=\u0418\u0437\u0432\u043e\u0452\u0435\u045a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0438 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-ExecuteScriptOnSelectedNode.text=\u0418\u0437\u0432\u043e\u0434\u0438 {0} \u043d\u0430 \u0441\u0432\u0438\u043c \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u043c \u0447\u0432\u043e\u0440\u043e\u0432\u0438\u043c\u0430
-ExecuteScriptOnSelectedNodeRecursively.text=\u0418\u0437\u0432\u043e\u0434\u0438 {0} \u043d\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u043c \u0447\u0432\u043e\u0440\u043e\u0432\u0438\u043c\u0430, \u0440\u0435\u043a\u0443\u0440\u0437\u0438\u0432\u043d\u043e
-ExecuteScriptOnSingleNode.text=\u0418\u0437\u0432\u043e\u0434\u0438 {0} \u043d\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e\u043c \u0447\u0432\u043e\u0440\u0443
-ExecuteScripts.noScriptsAvailable=\u041d\u0438\u0441\u0443 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0435
-ExecuteScripts.text=\u0421\u043a\u0440\u0438\u043f\u0442\u0435
-ExecuteScriptSecurityError.text=\u0414\u043e\u0448\u043b\u043e \u0458\u0435 \u0434\u043e \u0433\u0440\u0435\u0448\u043a\u0435 \u0442\u043e\u043a\u043e\u043c \u0438\u0437\u0432\u0440\u0448\u0435\u045a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0435: {0}
-export_failed=\u0418\u0437\u0432\u043e\u0437 \u043d\u0438\u0458\u0435 \u0443\u0441\u043f\u0435\u043e
-export_pdf_text=\u041f\u0440\u0435\u043d\u043e\u0441\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 (PDF)
+edit.edit_rich_text=\u0416\u0435\u043B\u0438\u0448 \u043B\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435 \u043A\u0430\u043E \u043F\u043E\u0434\u0435\u0431\u0459\u0430\u043D\u043E \u0438\u043B\u0438 \u0438\u0441\u043A\u043E\u0448\u0435\u043D\u043E?
+edit_details=\u0423\u0440\u0435\u0434\u0438 \u0434\u0435\u0442\u0430\u0459\u0435 \u0447\u0432\u043E\u0440\u0430...
+edit_end_label=<html>\u041F\u043E\u0432\u0435\u0437\u043D\u0438\u043A<br>label
+edit_label_font_family=\u0421\u043B\u043E\u0432\u043E\u043B\u0438\u043A
+edit_label_font_size=\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430 \u0441\u043B\u043E\u0432\u0430
+edit_link_manually=\u0420\u0443\u0447\u043D\u043E \u0443\u0440\u0435\u0434\u0438 \u0432\u0435\u0437\u0443 (\u0445\u0438\u043F\u0435\u0440\u0432\u0435\u0437\u0443)...
+edit_long_node=\u0423\u0440\u0435\u0434\u0438 \u0458\u0435\u0437\u0433\u0440\u043E \u0447\u0432\u043E\u0440\u0430 \u0443 \u0434\u0438\u0458\u0430\u043B\u043E\u0433\u0443...
+edit_middle_label=<html>\u0421\u0440\u0435\u0434\u045A\u0430<br>\u043E\u0437\u043D\u0430\u043A\u0430
+edit_source_label=<html>\u0418\u0437\u0432\u043E\u0440\u043D\u0430<br>\u043E\u0437\u043D\u0430\u043A\u0430
+edit_target_label=\u0423\u0440\u0435\u0434\u0438 \u0446\u0438\u0459\u043D\u0438 \u043D\u0430\u0437\u0438\u0432
+edit_transparency_label=\u041F\u0440\u043E\u0437\u0438\u0440\u043D\u043E\u0441\u0442
+edit_width_label=\u0428\u0438\u0440\u0438\u043D\u0430
+EditAction.text=\u0423\u0440\u0435\u0434\u0438 \u0458\u0435\u0437\u0433\u0440\u043E \u0447\u0432\u043E\u0440a \u0443 \u043B\u0438\u043D\u0438\u0458\u0438
+EditAttributesAction.text=\u0423\u0440\u0435\u0434\u0438 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0430 \u0443 \u043B\u0438\u043D\u0438\u0458\u0438
+EditDetailsAction.text=\u0423\u0440\u0435\u0434\u0438 \u0434\u0435\u0442\u0430\u0459\u0435 \u0447\u0432\u043E\u0440\u0430 \u0443 \u043B\u0438\u043D\u0438\u0458\u0438
+EditDetailsInDialogAction.text=\u0418\u0437\u043C\u0435\u043D\u0438 \u0434\u0435\u0442\u0430\u0459\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0430 \u0443 \u0434\u0438\u0458\u0430\u043B\u043E\u0433\u0443
+EditFilterAction.text=\u0421\u0430\u0447\u0438\u043D\u0438 \u0444\u0438\u043B\u0442\u0435\u0440
+EditLongAction.text=\u0423\u0440\u0435\u0434\u0438 \u0458\u0435\u0437\u0433\u0440\u043E \u0447\u0432\u043E\u0440\u0430 \u0443 \u0434\u0438\u0458\u0430\u043B\u043E\u0433\u0443
+EditNoteInDialogAction.text=\u0423\u0440\u0435\u0434\u0438 \u0431\u0435\u043B\u0435\u0448\u043A\u0435 \u0443 \u0434\u0438\u0458\u0430\u043B\u043E\u0433\u0443
+EditScript=\u0423\u0440\u0435\u0434\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0443...
+EditStylesAction.text=\u0423\u0440\u0435\u0434\u0438 \u0441\u0442\u0438\u043B
+EncryptedMap.text=\u041D\u0430\u043F\u0440\u0430\u0432\u0438 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0443 \u043C\u0430\u043F\u0443...
+EncryptedMap.tooltip=\u041D\u043E\u0432\u0430 \u0437\u0430\u0448\u0442\u0438\u045B\u0435\u043D\u0430 \u043C\u0430\u043F\u0430
+enter_base_url=\u0411\u0438\u045B\u0435 \u0437\u0430\u043B\u0435\u043F\u0459\u0435\u043D\u0435 \u0440\u0435\u043B\u0430\u0442\u0438\u0432\u043D\u0435 \u0430\u0434\u0440\u0435\u0441\u0435. \u041C\u043E\u043B\u0438\u043C \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u0438 \u0423\u0420\u041B.
+enter_condition_name=\u0423\u043F\u0438\u0448\u0438 \u043D\u043E\u0432\u043E \u0438\u043C\u0435 \u0443\u0441\u043B\u043E\u0432\u0430
+enter_confirms=&Enter \u043A\u0430\u043E \u043F\u043E\u0442\u0432\u0440\u0434\u0430
+enter_keyset_name=\u0423\u043D\u0435\u0441\u0438 \u043D\u0430\u0437\u0438\u0432 \u0441\u043A\u0443\u043F\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0435\u0447\u0438\u0446\u0430
+enter_map_url=\u0423\u043D\u0435\u0441\u0438 \u0423\u0420\u041B \u043C\u0430\u043F\u0435
+enter_new_style_name=\u0423\u043D\u0435\u0441\u0438 \u043D\u0430\u0437\u0438\u0432 \u043D\u043E\u0432\u043E\u0433 \u0441\u0442\u0438\u043B\u0430
+enter_node_id=\u0423\u043D\u0435\u0441\u0438 \u0418\u0414 \u0447\u0432\u043E\u0440\u0430
+enter_zoom=\u0423\u043A\u0459\u0443\u0447\u0438 \u0443\u0432\u0435\u045B\u0430\u045A\u0435
+EnterPassword.text=\u0423\u043D\u0435\u0441\u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0443
+error=\u0413\u0440\u0435\u0448\u043A\u0430
+error_applying_template=\u0413\u0440\u0435\u0448\u043A\u0430 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043F\u0440\u0438\u043C\u0435\u043D\u0435 XSL \u0448\u0430\u0431\u043B\u043E\u043D\u0430.
+error_creating_directory=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0438 \u0444\u0430\u0441\u0446\u0438\u043A\u043B\u0443 \u0437\u0430 \u0438\u0437\u0432\u043E\u0437.
+error_in_template=\u0413\u0440\u0435\u0448\u043A\u0435 \u0443 \u043F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u043E\u043C \u0448\u0430\u0431\u043B\u043E\u043D\u0443 \u043C\u0430\u043F\u0435 {0}. \u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043E\u0432\u0443 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443.
+errornumber={0} \u0433\u0440\u0435\u0448\u043A\u0430
+ExecuteScriptError.text=\u0413\u0440\u0435\u0448\u043A\u0430 \u043F\u0440\u0438 \u0438\u0437\u0432\u043E\u0452\u0435\u045A\u0443 \u0441\u043A\u0440\u0438\u043F\u0442\u0435:\n{0}
+ExecuteScriptForAllNodes.text=\u0418\u0437\u0432\u043E\u0452\u0435\u045A\u0435 \u0441\u0432\u0438\u0445 \u0441\u043A\u0440\u0438\u043F\u0442\u0438
+ExecuteScriptForSelectionAction.text=\u0418\u0437\u0432\u043E\u0452\u0435\u045A\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+ExecuteScriptOnSelectedNode.text=\u0418\u0437\u0432\u043E\u0434\u0438 {0} \u043D\u0430 \u0441\u0432\u0438\u043C \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u043C \u0447\u0432\u043E\u0440\u043E\u0432\u0438\u043C\u0430
+ExecuteScriptOnSelectedNodeRecursively.text=\u0418\u0437\u0432\u043E\u0434\u0438 {0} \u043D\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u043C \u0447\u0432\u043E\u0440\u043E\u0432\u0438\u043C\u0430, \u0440\u0435\u043A\u0443\u0440\u0437\u0438\u0432\u043D\u043E
+ExecuteScriptOnSingleNode.text=\u0418\u0437\u0432\u043E\u0434\u0438 {0} \u043D\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E\u043C \u0447\u0432\u043E\u0440\u0443
+ExecuteScripts.noScriptsAvailable=\u041D\u0438\u0441\u0443 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0435
+ExecuteScripts.text=\u0421\u043A\u0440\u0438\u043F\u0442\u0435
+ExecuteScriptSecurityError.text=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u0433\u0440\u0435\u0448\u043A\u0435 \u0442\u043E\u043A\u043E\u043C \u0438\u0437\u0432\u0440\u0448\u0435\u045A\u0430 \u0441\u043A\u0440\u0438\u043F\u0442\u0435: {0}
+export_failed=\u0418\u0437\u0432\u043E\u0437 \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043E
+export_pdf_text=\u041F\u0440\u0435\u043D\u043E\u0441\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430 (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
-export_using_xslt=\u0418\u0437\u0432\u043e\u0437 Freeplane-\u0430
-ExportAction.text=&\u0418\u0437\u0432\u043e\u0437 \u043c\u0430\u043f\u0435
-ExportBranchAction.text=\u041f\u0440\u0435\u043c\u0435\u0441\u0442\u0438 \u0433\u0440\u0430\u043d\u0443 \u043d\u0430 \u043d\u043e\u0432\u0443 \u043c\u0430\u043f\u0443...
-ExportBranchToHTMLAction.text=\u0413\u0440\u0430\u043d\u0430 \u043a\u0430\u043e HTML
-exported_file={0} \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-ExportPdf.text=\u041f\u0414\u0424
+export_using_xslt=\u0418\u0437\u0432\u043E\u0437 Freeplane-\u0430
+ExportAction.text=&\u0418\u0437\u0432\u043E\u0437 \u043C\u0430\u043F\u0435
+ExportBranchAction.text=\u041F\u0440\u0435\u043C\u0435\u0441\u0442\u0438 \u0433\u0440\u0430\u043D\u0443 \u043D\u0430 \u043D\u043E\u0432\u0443 \u043C\u0430\u043F\u0443...
+ExportBranchToHTMLAction.text=\u0413\u0440\u0430\u043D\u0430 \u043A\u0430\u043E HTML
+exported_file={0} \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+ExportPdf.text=\u041F\u0414\u0424
ExportSvg.text=SVG
ExportToHTMLAction.text=HTM
ExportToImage.jpg.text=JPEG
ExportToImage.png.text=PNG
-ExportToOoWriter.text=Open Office Write \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442...
-extension_menu=\u0424\u0438\u0437\u0438\u0447\u043a\u0438 \u0441\u0442\u0438\u043b
-ExternalImage_popupMenu_Change=\u0418\u0437\u043c\u0435\u043d\u0438...
-ExternalImage_popupMenu_Open=\u041e\u0442\u0432\u043e\u0440\u0438 \u0443 \u043f\u0440\u0438\u043a\u0430\u0437\u0438\u0432\u0430\u0447\u0443
-ExternalImage_popupMenu_Remove=\u0423\u043a\u043b\u043e\u043d\u0438
-ExternalImage_popupMenu_ResetZoom=\u0423 \u043f\u043e\u0447\u0435\u0442\u043d\u043e \u043f\u043e\u0432\u0435\u045b\u0430\u045a\u0435
-ExternalImageAddAction.text=\u0414\u043e\u0434\u0430\u0458 \u0441\u043b\u0438\u043a\u0443...
-ExternalImageChangeAction.text=\u041f\u0440\u043e\u043c\u0435\u043d\u0438 \u0441\u043b\u0438\u043a\u0443...
-ExternalImageRemoveAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u0441\u043b\u0438\u043a\u0443
-ExtractLinkFromTextAction.text=\u041f\u0440\u0435\u0431\u0430\u0446\u0438 \u0432\u0435\u0437\u0443 \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u0430
-ExtractLinkFromTextAction.tooltip=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u0445\u0438\u043f\u0435\u0440\u0432\u0435\u0437\u0443 \u043d\u0430\u0452\u0435\u043d\u0443 \u0443 \u0442\u0435\u043a\u0441\u0442\u0443 \u0447\u0432\u043e\u0440\u0430
-f_button_unassigned=<\u0431\u0435\u0437 \u0430\u043a\u0446\u0438\u0458\u0435>
-FaqOpenURLAction.text=\u0427\u041f\u041f
-file=&\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-file_already_exists=\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0430 {0} \u0432\u0435\u045b \u043f\u043e\u0441\u0442\u043e\u0458\u0438. \u0414\u0430 \u043b\u0438 \u0436\u0435\u043b\u0438\u0442\u0435 \u0434\u0430 \u0458\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435?
-file_not_found=\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0430 {0} \u043d\u0438\u0458\u0435 \u043d\u0430\u0452\u0435\u043d\u0430
-FileListFlavorHandler=\u0412\u0435\u0437\u0435 \u0434\u043e \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-FileProperties_BranchLeafCount=\u0411\u0440\u043e\u0458 \u043b\u0438\u0441\u0442\u043e\u0432\u0430 \u0447\u0432\u043e\u0440\u0430 \u0443 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u043c \u0433\u0440\u0430\u043d\u0430\u043c\u0430:
-FileProperties_BranchNodeCount=\u0411\u0440\u043e\u0458 \u0447\u0432\u043e\u0440\u043e\u0432\u0430 \u0443 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u043c \u0433\u0440\u0430\u043d\u0430\u043c\u0430:
-FileProperties_ChangesSinceLastSave=\u041f\u0440\u043e\u043c\u0435\u043d\u0435 \u043e\u0434 \u0437\u0430\u0434\u045a\u0435\u0433 \u0447\u0443\u0432\u0430\u045a\u0430:
-FileProperties_FileName=\u041d\u0430\u0437\u0438\u0432 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435:
-FileProperties_FileSaved=\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0430:
-FileProperties_FileSize=\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435:
-FileProperties_MainBranchCount=\u0411\u0440\u043e\u0458 \u0433\u043b\u0430\u0432\u043d\u0438\u0445 \u0433\u0440\u0430\u043d\u0430:
-FileProperties_NeverSaved=\u041d\u0438\u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u043e
-FileProperties_NodeChildCount=\u0411\u0440\u043e\u0458 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438\u0445 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430:
-FileProperties_NodeSelectionCount=\u0411\u0440\u043e\u0458 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430:
-FileProperties_TotalFilteredCount=\u0411\u0440\u043e\u0458 \u0447\u0432\u043e\u0440\u043e\u0432\u0430 \u043a\u043e\u0458\u0438 \u0437\u0430\u0434\u043e\u0432\u043e\u0459\u0430\u0432\u0430\u0458\u0443 \u0444\u0438\u043b\u0442\u0435\u0440:
-FileProperties_TotalLeafCount=\u0423\u043a\u0443\u043f\u0430\u043d \u0431\u0440\u043e\u0458 \u043b\u0438\u0441\u0442\u043e\u0432\u0430 \u0447\u0432\u043e\u0440\u0430:
-FileProperties_TotalNodeCount=\u0423\u043a\u0443\u043f\u0430\u043d \u0431\u0440\u043e\u0458 \u0447\u0432\u043e\u0440\u043e\u0432\u0430:
-FilePropertiesAction.text=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043c\u0430&\u043f\u0435...
-FileRevisionsDialog.cancel=&\u041e\u0442\u043a\u0430\u0436\u0438
-FileRevisionsDialog.file_last_modified=\u0412\u0440\u0435\u043c\u0435\u043d\u0441\u043a\u0430 \u043e\u0437\u043d\u0430\u043a\u0430
-FileRevisionsDialog.file_name=\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-FileRevisionsDialog.file_size=\u0411\u0430\u0458\u0442\u043e\u0432\u0430
-FileRevisionsDialog.open=&\u041e\u0442\u0432\u043e\u0440\u0438
-FileRevisionsDialog.open.tooltip=\u041e\u0442\u0432\u043e\u0440\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443 \u0447\u0430\u043a \u0438 \u0430\u043a\u043e \u0458\u0435 \u0437\u0430\u0441\u0442\u0430\u0440\u0435\u043b\u0430
-FileRevisionsDialog.question=\u041d\u0430\u0452\u0435\u043d\u0435 \u0441\u0443 \u0438\u0441\u043f\u0440\u0430\u0432\u0459\u0435\u043d\u0435 \u0443 {0}
+ExportToOoWriter.text=Open Office Write \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442...
+extension_menu=\u0424\u0438\u0437\u0438\u0447\u043A\u0438 \u0441\u0442\u0438\u043B
+ExternalImage_popupMenu_Change=\u0418\u0437\u043C\u0435\u043D\u0438...
+ExternalImage_popupMenu_Open=\u041E\u0442\u0432\u043E\u0440\u0438 \u0443 \u043F\u0440\u0438\u043A\u0430\u0437\u0438\u0432\u0430\u0447\u0443
+ExternalImage_popupMenu_Remove=\u0423\u043A\u043B\u043E\u043D\u0438
+ExternalImage_popupMenu_ResetZoom=\u0423 \u043F\u043E\u0447\u0435\u0442\u043D\u043E \u043F\u043E\u0432\u0435\u045B\u0430\u045A\u0435
+ExternalImageAddAction.text=\u0414\u043E\u0434\u0430\u0458 \u0441\u043B\u0438\u043A\u0443...
+ExternalImageChangeAction.text=\u041F\u0440\u043E\u043C\u0435\u043D\u0438 \u0441\u043B\u0438\u043A\u0443...
+ExternalImageRemoveAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u0441\u043B\u0438\u043A\u0443
+ExtractLinkFromTextAction.text=\u041F\u0440\u0435\u0431\u0430\u0446\u0438 \u0432\u0435\u0437\u0443 \u0438\u0437 \u0442\u0435\u043A\u0441\u0442\u0430
+ExtractLinkFromTextAction.tooltip=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0445\u0438\u043F\u0435\u0440\u0432\u0435\u0437\u0443 \u043D\u0430\u0452\u0435\u043D\u0443 \u0443 \u0442\u0435\u043A\u0441\u0442\u0443 \u0447\u0432\u043E\u0440\u0430
+extras=&\u0410\u043B\u0430\u0442\u043A\u0435
+f_button_unassigned=<\u0431\u0435\u0437 \u0430\u043A\u0446\u0438\u0458\u0435>
+FaqOpenURLAction.text=\u0427\u041F\u041F
+file=&\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+file_already_exists=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 {0} \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438. \u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0458\u0435 \u0437\u0430\u043C\u0435\u043D\u0438\u0442\u0435?
+file_not_found=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 {0} \u043D\u0438\u0458\u0435 \u043D\u0430\u0452\u0435\u043D\u0430
+FileListFlavorHandler=\u0412\u0435\u0437\u0435 \u0434\u043E \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+FileProperties_BranchLeafCount=\u0411\u0440\u043E\u0458 \u043B\u0438\u0441\u0442\u043E\u0432\u0430 \u0447\u0432\u043E\u0440\u0430 \u0443 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u043C \u0433\u0440\u0430\u043D\u0430\u043C\u0430:
+FileProperties_BranchNodeCount=\u0411\u0440\u043E\u0458 \u0447\u0432\u043E\u0440\u043E\u0432\u0430 \u0443 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u043C \u0433\u0440\u0430\u043D\u0430\u043C\u0430:
+FileProperties_ChangesSinceLastSave=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 \u043E\u0434 \u0437\u0430\u0434\u045A\u0435\u0433 \u0447\u0443\u0432\u0430\u045A\u0430:
+FileProperties_FileName=\u041D\u0430\u0437\u0438\u0432 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435:
+FileProperties_FileSaved=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430:
+FileProperties_FileSize=\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435:
+FileProperties_MainBranchCount=\u0411\u0440\u043E\u0458 \u0433\u043B\u0430\u0432\u043D\u0438\u0445 \u0433\u0440\u0430\u043D\u0430:
+FileProperties_NeverSaved=\u041D\u0438\u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u043E
+FileProperties_NodeChildCount=\u0411\u0440\u043E\u0458 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438\u0445 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430:
+FileProperties_NodeSelectionCount=\u0411\u0440\u043E\u0458 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430:
+FileProperties_TotalFilteredCount=\u0411\u0440\u043E\u0458 \u0447\u0432\u043E\u0440\u043E\u0432\u0430 \u043A\u043E\u0458\u0438 \u0437\u0430\u0434\u043E\u0432\u043E\u0459\u0430\u0432\u0430\u0458\u0443 \u0444\u0438\u043B\u0442\u0435\u0440:
+FileProperties_TotalLeafCount=\u0423\u043A\u0443\u043F\u0430\u043D \u0431\u0440\u043E\u0458 \u043B\u0438\u0441\u0442\u043E\u0432\u0430 \u0447\u0432\u043E\u0440\u0430:
+FileProperties_TotalNodeCount=\u0423\u043A\u0443\u043F\u0430\u043D \u0431\u0440\u043E\u0458 \u0447\u0432\u043E\u0440\u043E\u0432\u0430:
+FilePropertiesAction.text=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u043C\u0430&\u043F\u0435...
+FileRevisionsDialog.cancel=&\u041E\u0442\u043A\u0430\u0436\u0438
+FileRevisionsDialog.file_last_modified=\u0412\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0430 \u043E\u0437\u043D\u0430\u043A\u0430
+FileRevisionsDialog.file_name=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+FileRevisionsDialog.file_size=\u0411\u0430\u0458\u0442\u043E\u0432\u0430
+FileRevisionsDialog.open=&\u041E\u0442\u0432\u043E\u0440\u0438
+FileRevisionsDialog.open.tooltip=\u041E\u0442\u0432\u043E\u0440\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0447\u0430\u043A \u0438 \u0430\u043A\u043E \u0458\u0435 \u0437\u0430\u0441\u0442\u0430\u0440\u0435\u043B\u0430
+FileRevisionsDialog.question=\u041D\u0430\u0452\u0435\u043D\u0435 \u0441\u0443 \u0438\u0441\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u0435 \u0443 {0}
FileRevisionsDialog.restore=\u0412\u0440\u0430\u0442\u0438
-FileRevisionsDialog.restore.tooltip=\u0417\u0430\u043c\u0435\u043d\u0438 {0} \u0441\u0430 {1}
-FileRevisionsDialog.title=\u0418\u0441\u043f\u0440\u0430\u0432\u0459\u0435\u043d\u0430 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-filter=\u0424\u0438\u043b\u0442\u0435\u0440
-filter_add=&\u0414\u043e\u0434\u0430\u0458
+FileRevisionsDialog.restore.tooltip=\u0417\u0430\u043C\u0435\u043D\u0438 {0} \u0441\u0430 {1}
+FileRevisionsDialog.title=\u0418\u0441\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+filter=\u0424&\u0438\u043B\u0442\u0435\u0440
+filter_add=&\u0414\u043E\u0434\u0430\u0458
filter_and=&\u0418
-filter_any_text=\u0408\u0435\u0437\u0433\u0440\u0430, \u0434\u0435\u0442\u0430\u0459\u0438 \u0438\u043b\u0438 \u0431\u0435\u043b\u0435\u0448\u043a\u0435
-filter_conditions=\u0424\u0438\u043b\u0442\u0435\u0440\u0438
+filter_any_text=\u0408\u0435\u0437\u0433\u0440\u0430, \u0434\u0435\u0442\u0430\u0459\u0438 \u0438\u043B\u0438 \u0431\u0435\u043B\u0435\u0448\u043A\u0435
+filter_conditions=\u0424\u0438\u043B\u0442\u0435\u0440\u0438
filter_contains=\u0421\u0430\u0434\u0440\u0436\u0438
-filter_created_after=\u041d\u0430\u043f\u0440\u0430\u0432\u0459\u0435\u043d\u043e \u043f\u043e\u0441\u043b\u0435
-filter_created_before=\u041d\u0430\u043f\u0440\u0430\u0432\u0459\u0435\u043d\u043e \u043f\u0440\u0435
+filter_created_after=\u041D\u0430\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u043E \u043F\u043E\u0441\u043B\u0435
+filter_created_before=\u041D\u0430\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u043E \u043F\u0440\u0435
filter_delete=&\u0418\u0437\u0431\u0440\u0438\u0448\u0438
filter_details=\u0414\u0435\u0442\u0430\u0459\u0438
-filter_dialog=\u0421\u0430\u0441\u0442\u0430\u0432\u0459\u0430\u0447 \u0444\u0438\u043b\u0442\u0435\u0440\u0430
-filter_does_not_exist=\u041d\u0435 \u043f\u043e\u0441\u0442\u043e\u0458\u0438
-filter_edit_description=\u0423\u0440\u0435\u0434\u0438 \u0441\u043f\u0438\u0441\u0430\u043a \u0444\u0438\u043b\u0442\u0435\u0440\u0430
-filter_enter_value=\u0423\u043d\u043e\u0441 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438
-filter_even_level=\u0427\u0432\u043e\u0440 \u0438\u0437 \u0440\u0430\u0437\u043d\u0438\u0445 \u043d\u0438\u0432\u043e\u0430
-filter_exist=\u041f\u043e\u0441\u0442\u043e\u0458\u0438
-filter_icon=\u0418\u043a\u043e\u043d\u0430
-filter_is_equal_to=\u0408\u0435\u0434\u043d\u0430\u043a\u043e \u0458\u0435
-filter_is_not_equal_to=\u041d\u0438\u0458\u0435 \u0458\u0435\u0434\u043d\u0430\u043a\u043e
-filter_leaf=\u0417\u0430\u0432\u0440\u0448\u043d\u0438 \u0447\u0432\u043e\u0440
-filter_link=\u0425\u0438\u043f\u0435\u0440\u0432\u0435\u0437\u0430
-filter_match_approximately=&\u041f\u0440\u0438\u0431\u043b\u0438\u0436\u043d\u043e
-filter_match_approximately_tooltip=<html>\u041e\u043c\u043e\u0433\u0443\u045b\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u043d\u043e \u0443\u043f\u043e\u0440\u0435\u0452\u0438\u0432\u0430\u045a\u0435,<br/>\u043d\u043f\u0440.. \u0443 \u043f\u043e\u0442\u0440\u0430\u0437\u0438 \u0437\u0430 '\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435' \u043d\u0430\u045b\u0438 \u045b\u0435 '\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435'.</html>
-filter_match_case=\u0420\u0430\u0437\u043b\u0438\u043a\u0443\u0458 \u0441\u043b\u043e\u0432\u0430
-filter_match_case_tooltip=\u0420\u0430\u0437\u043b\u0438\u043a\u0443\u0458 \u0441\u043b\u043e\u0432\u0430 \u043a\u043e\u0434 \u0443\u043f\u043e\u0440\u0435\u0452\u0438\u0432\u0430\u045a\u0430.
-filter_modified_after=\u041f\u0440\u043e\u043c\u0435\u045a\u0435\u043d\u043e \u043f\u043e\u0441\u043b\u0435
-filter_modified_before=\u041f\u0440\u043e\u043c\u0435\u045a\u0435\u043d\u043e \u043f\u0440\u0435
-filter_no_filtering=\u0411\u0435\u0437 \u0444\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u045a\u0430 (\u0443\u043a\u043b\u043e\u043d\u0438)
-filter_node=\u0408\u0435\u0437\u0433\u0440\u043e \u0442\u0435\u043a\u0441\u0442\u0430
-filter_node_level=\u041d\u0438\u0432\u043e \u0447\u0432\u043e\u0440\u0430
-filter_not=&\u041d\u0435
-filter_note=\u0411\u0435\u043b\u0435\u0448\u043a\u0430
-filter_odd_level=\u0427\u0432\u043e\u0440\u043e\u0432\u0435 \u0441\u0430 \u0438\u0441\u0442\u043e\u0433 \u043d\u0438\u0432\u043e\u0430
-filter_or=\u0418&\u043b\u0438
-filter_parent=\u041d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u0442\u0435\u043a\u0441\u0442
-filter_periodic_level=\u041f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043a\u0438
-filter_priority=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442
-filter_regexp_matches=\u0420\u0435\u0433\u0443\u043b\u0430\u0440\u043d\u0438 \u0438\u0437\u0440\u0430\u0437 \u0441\u043f\u0430\u0440\u0438 \u0441\u0430
-filter_reminder=\u041f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a
-filter_reminder_after=\u0437\u0430\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u043e\u0441\u043b\u0435
-filter_reminder_before=\u0437\u0430\u043a\u0430\u0437\u0430\u043d\u043e \u043f\u0440\u0435
-filter_reminder_executed=\u043e\u0431\u0430\u0432\u0459\u0435\u043d\u043e
-filter_reminder_later=\u0437\u0430\u043a\u0430\u0437\u0430\u043d\u043e \u0437\u0430 \u043a\u0430\u0441\u043d\u0438\u0458\u0435
-filter_root=\u0418\u0437\u0432\u043e\u0440\u043d\u0438 \u0447\u0432\u043e\u0440
-filter_script=\u0421\u043a\u0440\u0438\u043f\u0442\u0430 \u0444\u0438\u043b\u0442\u0435\u0440\u0430
-filter_select=&\u041e\u0437\u043d\u0430\u0447\u0438
-filter_selected_node_view=\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0438
-filter_selected_node_view_snapshot=\u0421\u0430\u0447\u0443\u0432\u0430\u043d\u0438 \u0438\u0437\u0431\u043e\u0440
-filter_style=\u0421\u0442\u0438\u043b
-filter_time=\u0424\u0438\u043b\u0442\u0435\u0440 \u0434\u0430\u0442\u0443\u043c\u0430
-FilterComposerDialog.save=&\u0421\u0430\u0447\u0443\u0432\u0430\u0458
-filters_not_loaded=\u0424\u0438\u043b\u0442\u0435\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043d, \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0458\u0435 \u043e\u0448\u0442\u0435\u045b\u0435\u043d\u0430
-find_what=\u0428\u0442\u0430 \u043f\u0440\u043e\u043d\u0430\u045b\u0438...
+filter_dialog=\u0421\u0430\u0441\u0442\u0430\u0432\u0459\u0430\u0447 \u0444\u0438\u043B\u0442\u0435\u0440\u0430
+filter_does_not_exist=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438
+filter_edit_description=\u0423\u0440\u0435\u0434\u0438 \u0441\u043F\u0438\u0441\u0430\u043A \u0444\u0438\u043B\u0442\u0435\u0440\u0430
+filter_enter_value=\u0423\u043D\u043E\u0441 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438
+filter_even_level=\u0427\u0432\u043E\u0440 \u0438\u0437 \u0440\u0430\u0437\u043D\u0438\u0445 \u043D\u0438\u0432\u043E\u0430
+filter_exist=\u041F\u043E\u0441\u0442\u043E\u0458\u0438
+filter_icon=\u0418\u043A\u043E\u043D\u0430
+filter_is_equal_to=\u0408\u0435\u0434\u043D\u0430\u043A\u043E \u0458\u0435
+filter_is_not_equal_to=\u041D\u0438\u0458\u0435 \u0458\u0435\u0434\u043D\u0430\u043A\u043E
+filter_leaf=\u0417\u0430\u0432\u0440\u0448\u043D\u0438 \u0447\u0432\u043E\u0440
+filter_link=\u0425\u0438\u043F\u0435\u0440\u0432\u0435\u0437\u0430
+filter_match_approximately=&\u041F\u0440\u0438\u0431\u043B\u0438\u0436\u043D\u043E
+filter_match_approximately_tooltip=<html>\u041E\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0440\u0438\u0431\u043B\u0438\u0436\u043D\u043E \u0443\u043F\u043E\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0435,<br/>\u043D\u043F\u0440.. \u0443 \u043F\u043E\u0442\u0440\u0430\u0437\u0438 \u0437\u0430 '\u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435' \u043D\u0430\u045B\u0438 \u045B\u0435 '\u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435'.</html>
+filter_match_case=\u0420\u0430\u0437\u043B\u0438\u043A\u0443\u0458 \u0441\u043B\u043E\u0432\u0430
+filter_match_case_tooltip=\u0420\u0430\u0437\u043B\u0438\u043A\u0443\u0458 \u0441\u043B\u043E\u0432\u0430 \u043A\u043E\u0434 \u0443\u043F\u043E\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0430.
+filter_modified_after=\u041F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u043E \u043F\u043E\u0441\u043B\u0435
+filter_modified_before=\u041F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u043E \u043F\u0440\u0435
+filter_no_filtering=\u0411\u0435\u0437 \u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u045A\u0430 (\u0443\u043A\u043B\u043E\u043D\u0438)
+filter_node=\u0408\u0435\u0437\u0433\u0440\u043E \u0442\u0435\u043A\u0441\u0442\u0430
+filter_node_level=\u041D\u0438\u0432\u043E \u0447\u0432\u043E\u0440\u0430
+filter_not=&\u041D\u0435
+filter_note=\u0411\u0435\u043B\u0435\u0448\u043A\u0430
+filter_odd_level=\u0427\u0432\u043E\u0440\u043E\u0432\u0435 \u0441\u0430 \u0438\u0441\u0442\u043E\u0433 \u043D\u0438\u0432\u043E\u0430
+filter_or=\u0418&\u043B\u0438
+filter_parent=\u041D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u0442\u0435\u043A\u0441\u0442
+filter_periodic_level=\u041F\u0435\u0440\u0438\u043E\u0434\u0438\u0447\u043A\u0438
+filter_priority=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442
+filter_regexp_matches=\u0420\u0435\u0433\u0443\u043B\u0430\u0440\u043D\u0438 \u0438\u0437\u0440\u0430\u0437 \u0441\u043F\u0430\u0440\u0438 \u0441\u0430
+filter_reminder=\u041F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A
+filter_reminder_after=\u0437\u0430\u043A\u0430\u0437\u0430\u043D\u043E \u043F\u043E\u0441\u043B\u0435
+filter_reminder_before=\u0437\u0430\u043A\u0430\u0437\u0430\u043D\u043E \u043F\u0440\u0435
+filter_reminder_executed=\u043E\u0431\u0430\u0432\u0459\u0435\u043D\u043E
+filter_reminder_later=\u0437\u0430\u043A\u0430\u0437\u0430\u043D\u043E \u0437\u0430 \u043A\u0430\u0441\u043D\u0438\u0458\u0435
+filter_root=\u0418\u0437\u0432\u043E\u0440\u043D\u0438 \u0447\u0432\u043E\u0440
+filter_script=\u0421\u043A\u0440\u0438\u043F\u0442\u0430 \u0444\u0438\u043B\u0442\u0435\u0440\u0430
+filter_select=&\u041E\u0437\u043D\u0430\u0447\u0438
+filter_selected_node_view=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0438
+filter_selected_node_view_snapshot=\u0421\u0430\u0447\u0443\u0432\u0430\u043D\u0438 \u0438\u0437\u0431\u043E\u0440
+filter_style=\u0421\u0442\u0438\u043B
+filter_time=\u0424\u0438\u043B\u0442\u0435\u0440 \u0434\u0430\u0442\u0443\u043C\u0430
+filters_not_loaded=\u0424\u0438\u043B\u0442\u0435\u0440 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043D, \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0458\u0435 \u043E\u0448\u0442\u0435\u045B\u0435\u043D\u0430
+find_what=\u0428\u0442\u0430 \u043F\u0440\u043E\u043D\u0430\u045B\u0438...
FindAction.text=\u0422\u0440\u0430\u0436\u0438...
-FirstGroupNodeAction.text=\u041f\u0440\u0435\u0433\u043b\u0435\u0434 \u0447\u0432\u043e\u0440\u0430 (\u043f\u043e\u0447\u0435\u0442\u0430 \u0433\u0440\u0443\u043f\u0430)
-fit_map_to_page=\u041f\u0440\u0438\u043b\u0430\u0433\u043e\u0434\u0438 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0438 \u0458\u0435\u0434\u043d\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435
-fit_map_to_page_height=\u041f\u0440\u0438\u043b\u0430\u0433\u043e\u0434\u0438 \u0432\u0438\u0441\u0438\u043d\u0443 \u0437\u0430 \u0458\u0435\u0434\u043d\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443
-fit_map_to_page_width=\u041f\u0440\u0438\u043b\u0430\u0433\u043e\u0434\u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u0437\u0430 \u0458\u0435\u0434\u043d\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443
-FitToPage.text=\u041f\u0440\u0438\u043b\u0430\u0433\u043e\u0434\u0438 \u043f\u043e\u0432\u0435\u045b\u0430\u045a\u0435 \u043d\u0430 &\u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 \u0435\u043a\u0440\u0430\u043d\u0430
-FitToPage.tooltip=\u041f\u0440\u0438\u043b\u0430\u0433\u043e\u0434\u0438 \u043f\u043e\u0432\u0435\u045b\u0430\u045a\u0435 \u0442\u0430\u043a\u043e \u0434\u0430 \u0441\u0435 \u0446\u0435\u043b\u0430 \u043c\u0430\u043f\u0430 \u0441\u043c\u0435\u0441\u0442\u0438 \u0443 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u0438 \u043f\u0440\u043e\u0437\u043e\u0440
-fold=\u0421\u043b\u043e\u0436\u0438
-FoldAllAction.text=\u0421\u043b\u043e\u0436\u0438 \u0441\u0432\u0435
-FoldAllAction.tooltip=<html> \u0421\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435 \u0438 \u045a\u0438\u0445\u043e\u0432\u0435 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0435.</html>
-FoldOneLevelAction.text=\u0421\u043a\u043b\u043e\u043f\u0438 \u0458\u0435\u0434\u0430\u043d \u043d\u0438\u0432\u043e
-FoldOneLevelAction.tooltip=<html>\u0421\u043a\u043b\u043e\u043f\u0438 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435 \u0437\u0430 \u0458\u0435\u0434\u0430\u043d \u043d\u0438\u0432\u043e.</html>
-follow_graphical_link=\u0418\u0434\u0438 \u043d\u0430:
-FollowLinkAction.text=\u041f\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u0435\u0437\u0443
-font=\u0421\u043b\u043e\u0432\u043e\u043b\u0438\u043a
-FontFamilyAction.text=\u041e\u0431\u043b\u0438\u043a \u0441\u043b\u043e\u0432\u0430
-FontSizeAction.text=\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430
-format_invalid_pattern=\u041d\u0435 \u0432\u0430\u0436\u0438 \u0448\u0430\u0431\u043b\u043e\u043d
-format_menu_cloud_shapes=\u0414\u043e\u0434\u0430\u0458 \u043e\u0431\u043b\u0430\u043a \u0438\u043b\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0438 \u0441\u0442\u0438\u043b
-format_menu_edge_styles=&\u0421\u0442\u0438\u043b \u0440\u0443\u0431\u0430
-format_menu_edge_widths=\u0428\u0438\u0440\u0438\u043d\u0430 &\u0440\u0443\u0431\u0430
-format_panel=\u0424\u043e\u0440\u043c\u0430\u0442
-FormatCopy.text=\u0423\u043c\u043d\u043e\u0436\u0438 \u043e\u0431\u043b\u0438\u043a
-FormatCopy.tooltip=<html>\u0423\u043c\u043d\u043e\u0436\u0438 \u043e\u0431\u043b\u0438\u043a \u0447\u0432\u043e\u0440\u0430.</html>
-FormatPaste.text=\u041d\u0430\u043b\u0435\u043f\u0438 \u043e\u0431\u043b\u0438\u043a
-FormatPaste.tooltip=<html>\u041d\u0430\u043b\u0435\u043f\u0438 \u043e\u0431\u043b\u0438\u043a \u0447\u0432\u043e\u0440\u0430.</html>
-formats_not_loaded=\u041e\u0431\u043b\u0438\u0446\u0438 \u043d\u0435 \u043c\u043e\u0433\u0443 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043d\u0438, \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0458\u0435 \u043e\u0448\u0442\u0435\u045b\u0435\u043d\u0430
-formula.error.attributeValueIsNull=\u0412\u0440\u0435\u0434\u043d\u043e\u0441\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 ''{0}'' \u0458\u0435\u0434\u043d\u0430\u043a\u0430 \u0458\u0435 \u043d\u0443\u043b\u0438 \u043d\u0430\u043a\u043e\u043d \u043f\u0440\u043e\u0446\u0435\u043d\u0435.
-formula.error.circularReference=\u041a\u0440\u0443\u0436\u043d\u0430 \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0446\u0430: \u0424\u043e\u0440\u043c\u0443\u043b\u0430 \u0447\u0432\u043e\u0440\u0430 ''{0}'' \u0441\u0430\u0434\u0440\u0436\u0438 \u0441\u0432\u043e\u0458\u0443 \u0432\u043b\u0430\u0441\u0442\u0438\u0442\u0443 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442.
-formula.EvaluateAllAction.text=\u041f\u0440\u043e\u0446\u0435\u043d\u0438 \u0441\u0432\u0435
-formula.EvaluateAllAction.tooltip=\u041f\u0440\u043e\u0446\u0435\u043d\u0438 \u0441\u0432\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u0443 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0458 \u043c\u0430\u043f\u0438
-formula.menuname=\u0424\u043e\u0440\u043c\u0443\u043b\u0435
-formula_editor=\u0423\u0440\u0435\u0434\u0438 \u0444\u043e\u0440\u043c\u0443\u043b\u0443
-ForwardAction.text=\u041d\u0430\u043f\u0440\u0435\u0434
-ForwardAction.tooltip=\u0421\u043a\u043e\u043a \u0443\u043d\u0430\u043f\u0440\u0435\u0434 \u043d\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e\u043c \u043d\u0438\u0437\u0443
-FreeNodeAction.text=\u0421\u043b\u043e\u0431\u043e\u0434\u043d\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u0430\u043d \u0447\u0432\u043e\u0440\u0430 (\u043f\u043e\u0441\u0442\u0430\u0432\u0438 / \u0443 \u043f\u043e\u0447\u0435\u0442\u043d\u043e)
-Freeplane.progress.buildScreen=\u0413\u0440\u0430\u0434\u045a\u0430 \u043f\u0440\u0438\u043a\u0430\u0437\u0430...
-Freeplane.progress.createController=\u0421\u0442\u0432\u0430\u0440\u0430\u045a\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0440\u0430...
-Freeplane.progress.createInitialMode=\u0421\u0442\u0432\u0430\u0440\u0430\u045a\u0435 \u043f\u043e\u0447\u0435\u0442\u043d\u043e\u0433 \u043d\u0430\u0447\u0438\u043d\u0430...
-Freeplane.progress.endStartup=\u0417\u0430\u0432\u0440\u0448\u0435\u0442\u0430\u043a \u043f\u043e\u043a\u0440\u0435\u0442\u0430\u045a\u0430.
-Freeplane.progress.gettingPreferenceDirectories=\u041f\u0440\u0438\u0431\u0430\u0432\u0459\u0430\u045a\u0435 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0435 \u043f\u043e\u0433\u043e\u0434\u043d\u043e\u0441\u0442\u0438...
-Freeplane.progress.gettingPreferences=\u041f\u0440\u0438\u0431\u0430\u0432\u0459\u0430\u045a\u0435 \u043f\u043e\u0433\u043e\u0434\u043d\u043e\u0441\u0442\u0438...
-Freeplane.progress.loadMaps=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045a\u0435 \u043c\u0430\u043f\u0430...
-Freeplane.progress.propagateLookAndFeel=\u0412\u0435\u0436\u0431\u0430 \u043d\u0430 \u0438\u0437\u0433\u043b\u0435\u0434 \u0438 \u043e\u0441\u0435\u045b\u0430\u0458...
-Freeplane.progress.settingPreferences=\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435...
-Freeplane.progress.startCreateController=\u0417\u0430\u043f\u043e\u0447\u0438\u045a\u0430\u045a\u0435 \u0441\u0442\u0432\u0430\u0440\u0430\u045a\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0440\u0430...
-Freeplane.progress.updateLookAndFeel=\u041e\u0441\u0432\u0435\u0436\u0430\u0432\u0430\u045a\u0435 \u0438\u0437\u0433\u043b\u0435\u0434\u0430 \u0438 \u0443\u0433\u043e\u0452\u0430\u0458\u0430...
-freeplane_reverted=Freeplane_\u041f\u0440\u0435\u043e\u043a\u0440\u0435\u043d\u0443\u0442\u043e_
-FreeplaneHelpStarter.text=\u041f\u043e\u043c\u043e\u045b...
-FreeplaneHelpStarter.tooltip=\u041f\u0440\u043e\u0448\u0438\u0440\u0435\u043d\u0430 \u043f\u043e\u043c\u043e\u045b Freeplanea
-GettingStartedAction.text=\u041f\u0440\u0432\u0438 \u043a\u043e\u0440\u0430\u0446\u0438
-GotoLinkNodeAction.text=\u0418\u0434\u0438 \u043d\u0430 \u0432\u0435\u0437\u0443
-GotoNodeAction.text=\u0418\u0434\u0438 \u043d\u0430 \u0447\u0432\u043e\u0440 \u0441\u0430 ID...
-GrabKeyDialog.common.cancel=\u041e\u0442\u043a\u0430\u0436\u0438
+FindNextAction.text=\u041D\u0430\u0452\u0438 \u0441\u043B\u0435\u0434\u0435\u045B\u0435
+FindPreviousAction.text=\u041D\u0430\u0452\u0438 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E
+fit_map_to_page=\u041F\u0440\u0438\u043B\u0430\u0433\u043E\u0434\u0438 \u0432\u0435\u043B\u0438\u0447\u0438\u043D\u0438 \u0458\u0435\u0434\u043D\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435
+fit_map_to_page_height=\u041F\u0440\u0438\u043B\u0430\u0433\u043E\u0434\u0438 \u0432\u0438\u0441\u0438\u043D\u0443 \u0437\u0430 \u0458\u0435\u0434\u043D\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443
+fit_map_to_page_width=\u041F\u0440\u0438\u043B\u0430\u0433\u043E\u0434\u0438 \u0448\u0438\u0440\u0438\u043D\u0443 \u0437\u0430 \u0458\u0435\u0434\u043D\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443
+FitToPage.text=\u041F\u0440\u0438\u043B\u0430\u0433\u043E\u0434\u0438 \u043F\u043E\u0432\u0435\u045B\u0430\u045A\u0435 \u043D\u0430 &\u0432\u0435\u043B\u0438\u0447\u0438\u043D\u0443 \u0435\u043A\u0440\u0430\u043D\u0430
+FitToPage.tooltip=\u041F\u0440\u0438\u043B\u0430\u0433\u043E\u0434\u0438 \u043F\u043E\u0432\u0435\u045B\u0430\u045A\u0435 \u0442\u0430\u043A\u043E \u0434\u0430 \u0441\u0435 \u0446\u0435\u043B\u0430 \u043C\u0430\u043F\u0430 \u0441\u043C\u0435\u0441\u0442\u0438 \u0443 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u043F\u0440\u043E\u0437\u043E\u0440
+fold=\u0421\u043B\u043E\u0436\u0438
+FoldAllAction.text=\u0421\u043B\u043E\u0436\u0438 \u0441\u0432\u0435
+FoldAllAction.tooltip=<html> \u0421\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435 \u0438 \u045A\u0438\u0445\u043E\u0432\u0435 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435.</html>
+FoldOneLevelAction.text=\u0421\u043A\u043B\u043E\u043F\u0438 \u0458\u0435\u0434\u0430\u043D \u043D\u0438\u0432\u043E
+FoldOneLevelAction.tooltip=<html>\u0421\u043A\u043B\u043E\u043F\u0438 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435 \u0437\u0430 \u0458\u0435\u0434\u0430\u043D \u043D\u0438\u0432\u043E.</html>
+follow_graphical_link=\u0418\u0434\u0438 \u043D\u0430:
+FollowLinkAction.text=\u041F\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u0435\u0437\u0443
+font=\u0421\u043B\u043E\u0432\u043E\u043B\u0438\u043A
+FontFamilyAction.text=\u041E\u0431\u043B\u0438\u043A \u0441\u043B\u043E\u0432\u0430
+FontSizeAction.text=\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430 \u0441\u043B\u043E\u0432\u0430
+format=\u041E&\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435
+format_invalid_pattern=\u041D\u0435 \u0432\u0430\u0436\u0438 \u0448\u0430\u0431\u043B\u043E\u043D
+format_menu_cloud_shapes=\u0414\u043E\u0434\u0430\u0458 \u043E\u0431\u043B\u0430\u043A \u0438\u043B\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0438 \u0441\u0442\u0438\u043B
+format_menu_edge_styles=&\u0421\u0442\u0438\u043B \u0440\u0443\u0431\u0430
+format_menu_edge_widths=\u0428\u0438\u0440\u0438\u043D\u0430 &\u0440\u0443\u0431\u0430
+format_panel=\u0424\u043E\u0440\u043C\u0430\u0442
+FormatCopy.text=\u0423\u043C\u043D\u043E\u0436\u0438 \u043E\u0431\u043B\u0438\u043A
+FormatCopy.tooltip=<html>\u0423\u043C\u043D\u043E\u0436\u0438 \u043E\u0431\u043B\u0438\u043A \u0447\u0432\u043E\u0440\u0430.</html>
+FormatPaste.text=\u041D\u0430\u043B\u0435\u043F\u0438 \u043E\u0431\u043B\u0438\u043A
+FormatPaste.tooltip=<html>\u041D\u0430\u043B\u0435\u043F\u0438 \u043E\u0431\u043B\u0438\u043A \u0447\u0432\u043E\u0440\u0430.</html>
+formats_not_loaded=\u041E\u0431\u043B\u0438\u0446\u0438 \u043D\u0435 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043D\u0438, \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0458\u0435 \u043E\u0448\u0442\u0435\u045B\u0435\u043D\u0430
+formula.error.attributeValueIsNull=\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 ''{0}'' \u0458\u0435\u0434\u043D\u0430\u043A\u0430 \u0458\u0435 \u043D\u0443\u043B\u0438 \u043D\u0430\u043A\u043E\u043D \u043F\u0440\u043E\u0446\u0435\u043D\u0435.
+formula.error.circularReference=\u041A\u0440\u0443\u0436\u043D\u0430 \u0440\u0435\u0444\u0435\u0440\u0435\u043D\u0446\u0430: \u0424\u043E\u0440\u043C\u0443\u043B\u0430 \u0447\u0432\u043E\u0440\u0430 ''{0}'' \u0441\u0430\u0434\u0440\u0436\u0438 \u0441\u0432\u043E\u0458\u0443 \u0432\u043B\u0430\u0441\u0442\u0438\u0442\u0443 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442.
+formula.EvaluateAllAction.text=\u041F\u0440\u043E\u0446\u0435\u043D\u0438 \u0441\u0432\u0435
+formula.EvaluateAllAction.tooltip=\u041F\u0440\u043E\u0446\u0435\u043D\u0438 \u0441\u0432\u0435 \u0444\u043E\u0440\u043C\u0443\u043B\u0435 \u0443 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0458 \u043C\u0430\u043F\u0438
+formula.menuname=\u0424\u043E\u0440\u043C\u0443\u043B\u0435
+formula_editor=\u0423\u0440\u0435\u0434\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0443
+ForwardAction.text=\u041D\u0430\u043F\u0440\u0435\u0434
+ForwardAction.tooltip=\u0421\u043A\u043E\u043A \u0443\u043D\u0430\u043F\u0440\u0435\u0434 \u043D\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E\u043C \u043D\u0438\u0437\u0443
+FreeNodeAction.text=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u043E \u043F\u043E\u0437\u0438\u0446\u0438\u043E\u043D\u0438\u0440\u0430\u043D \u0447\u0432\u043E\u0440\u0430 (\u043F\u043E\u0441\u0442\u0430\u0432\u0438 / \u0443 \u043F\u043E\u0447\u0435\u0442\u043D\u043E)
+Freeplane.progress.buildScreen=\u0413\u0440\u0430\u0434\u045A\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0430...
+Freeplane.progress.createController=\u0421\u0442\u0432\u0430\u0440\u0430\u045A\u0435 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043E\u0440\u0430...
+Freeplane.progress.createInitialMode=\u0421\u0442\u0432\u0430\u0440\u0430\u045A\u0435 \u043F\u043E\u0447\u0435\u0442\u043D\u043E\u0433 \u043D\u0430\u0447\u0438\u043D\u0430...
+Freeplane.progress.endStartup=\u0417\u0430\u0432\u0440\u0448\u0435\u0442\u0430\u043A \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430.
+Freeplane.progress.gettingPreferenceDirectories=\u041F\u0440\u0438\u0431\u0430\u0432\u0459\u0430\u045A\u0435 \u0444\u0430\u0441\u0446\u0438\u043A\u043B\u0435 \u043F\u043E\u0433\u043E\u0434\u043D\u043E\u0441\u0442\u0438...
+Freeplane.progress.gettingPreferences=\u041F\u0440\u0438\u0431\u0430\u0432\u0459\u0430\u045A\u0435 \u043F\u043E\u0433\u043E\u0434\u043D\u043E\u0441\u0442\u0438...
+Freeplane.progress.loadMaps=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435 \u043C\u0430\u043F\u0430...
+Freeplane.progress.propagateLookAndFeel=\u0412\u0435\u0436\u0431\u0430 \u043D\u0430 \u0438\u0437\u0433\u043B\u0435\u0434 \u0438 \u043E\u0441\u0435\u045B\u0430\u0458...
+Freeplane.progress.settingPreferences=\u041F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u043D\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435...
+Freeplane.progress.startCreateController=\u0417\u0430\u043F\u043E\u0447\u0438\u045A\u0430\u045A\u0435 \u0441\u0442\u0432\u0430\u0440\u0430\u045A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043E\u0440\u0430...
+Freeplane.progress.updateLookAndFeel=\u041E\u0441\u0432\u0435\u0436\u0430\u0432\u0430\u045A\u0435 \u0438\u0437\u0433\u043B\u0435\u0434\u0430 \u0438 \u0443\u0433\u043E\u0452\u0430\u0458\u0430...
+freeplane_reverted=Freeplane_\u041F\u0440\u0435\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E_
+FreeplaneHelpStarter.text=\u041F\u043E\u043C\u043E\u045B...
+FreeplaneHelpStarter.tooltip=\u041F\u0440\u043E\u0448\u0438\u0440\u0435\u043D\u0430 \u043F\u043E\u043C\u043E\u045B Freeplanea
+GettingStartedAction.text=\u041F\u0440\u0432\u0438 \u043A\u043E\u0440\u0430\u0446\u0438
+GotoLinkNodeAction.text=\u0418\u0434\u0438 \u043D\u0430 \u0432\u0435\u0437\u0443
+GotoNodeAction.text=\u0418\u0434\u0438 \u043D\u0430 \u0447\u0432\u043E\u0440 \u0441\u0430 ID...
+GrabKeyDialog.common.cancel=\u041E\u0442\u043A\u0430\u0436\u0438
GrabKeyDialog.common.ok=\u0423 \u0440\u0435\u0434\u0443
-GrabKeyDialog.grab-key.assigned-to=\u0414\u043e\u0434\u0435\u0459\u0435\u043d\u043e
-GrabKeyDialog.grab-key.assigned-to.none=\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u043d\u0438\u0458\u0435 \u0434\u043e\u0434\u0435\u0459\u0435\u043d\u043e
-GrabKeyDialog.grab-key.clear=\u041e\u0447\u0438\u0441\u0442\u0438
-GrabKeyDialog.grab-key.remove=\u0423\u043a\u043b\u043e\u043d\u0438
-GrabKeyDialog.grab-key.remove-ask=\u0408\u0435\u0441\u0442\u0435 \u043b\u0438 \u0441\u0438\u0433\u0443\u0440\u043d\u0438 \u0434\u0430 \u0436\u0435\u043b\u0438\u0442\u0435 \u0443\u043a\u043b\u043e\u043d\u0438\u0442\u0438 \u0430\u043a\u0446\u0438\u0458\u0443 \u0442\u0430\u0441\u0442\u0435\u0440\u0430?
-GrabKeyDialog.grab-key.title=\u0423\u043d\u0435\u0441\u0438 \u043d\u043e\u0432\u0438 \u0442\u0430\u0441\u0442\u0435\u0440
-green=\u0417\u0435\u043b\u0435\u043d\u043e
-help=\u041f\u043e\u043c\u043e\u045b
-HideableAction.tooltip=<html> \u041e\u0431\u0435\u043b\u0435\u0436\u0430\u0432\u0430 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0443 \u0441\u0432\u0430\u043a\u043e\u0433 \u043f\u0440\u043e\u043c\u0435\u045a\u0435\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430.</html>
-HideAllAttributesAction.text=\u0421\u0430\u043a\u0440\u0438\u0458 \u0441\u0432\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435
-HierarchicalIcons2Action.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0440\u0430\u0441\u043a\u0440\u0448\u045b\u0435 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0435 \u0438\u043a\u043e\u043d\u0435
-HierarchicalIconsAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 &\u0445\u0438\u0458\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0443 \u0438\u043a\u043e\u043d\u0430
-HierarchicalIconsAction.tooltip=\u0410\u043a\u043e \u0458\u0435\u0434\u043d\u0430 \u043e\u0434\u00a0\u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430\u00a0\u0438\u043c\u0430\u00a0\u0438\u043a\u043e\u043d\u0443,\u00a0\u043e\u043d\u0430 \u045b\u0435 \u0431\u0438\u0442\u0438 \u043f\u0440\u0438\u043a\u0430\u0437\u0430\u043d\u0430\u00a0\u0443 \u043c\u0430\u043b\u043e\u043c\u00a0\u0444\u043e\u0440\u043c\u0430\u0442\u0443, \u0442\u0430\u043a [...]
-hot_keys=\u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0435 \u043f\u0440\u0435\u0447\u0438\u0446\u0435
-hot_keys_table=\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0435\u0447\u0438\u0446\u0430
-HotKeyInfoAction.text=\u0420\u0430\u0441\u043f\u043e\u0440\u0435\u0434 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0435\u0447\u0438\u0446\u0430
-html_export_based_on_headings=HTML \u0418\u0437\u0432\u043e\u0437 - \u043f\u0440\u0435\u043c\u0430 \u043d\u0430\u0441\u043b\u043e\u0432\u0438\u043c\u0430
-html_export_fold_all=HTML \u0418\u0437\u0432\u043e\u0437 - \u0421\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435
-html_export_fold_currently_folded=HTML \u0418\u0437\u0432\u043e\u0437 - \u0421\u043a\u043b\u043e\u043f\u0438 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0440\u0430\u0447\u0432\u0430\u045a\u0435
-html_export_no_folding=HTML \u0418\u0437\u0432\u043e\u0437 - \u0411\u0435\u0437 \u0440\u0430\u0447\u0432\u0430\u045a\u0430
-html_problem=<html>\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u043f\u0440\u0435\u0434\u043e\u0447\u0438\u0442\u0438 html<br><br>{0}
+GrabKeyDialog.grab-key.assigned-to=\u0414\u043E\u0434\u0435\u0459\u0435\u043D\u043E
+GrabKeyDialog.grab-key.assigned-to.none=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043D\u0438\u0458\u0435 \u0434\u043E\u0434\u0435\u0459\u0435\u043D\u043E
+GrabKeyDialog.grab-key.clear=\u041E\u0447\u0438\u0441\u0442\u0438
+GrabKeyDialog.grab-key.remove=\u0423\u043A\u043B\u043E\u043D\u0438
+GrabKeyDialog.grab-key.remove-ask=\u0408\u0435\u0441\u0442\u0435 \u043B\u0438 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0438 \u0430\u043A\u0446\u0438\u0458\u0443 \u0442\u0430\u0441\u0442\u0435\u0440\u0430?
+GrabKeyDialog.grab-key.title=\u0423\u043D\u0435\u0441\u0438 \u043D\u043E\u0432\u0438 \u0442\u0430\u0441\u0442\u0435\u0440
+green=\u0417\u0435\u043B\u0435\u043D\u043E
+help=\u041F\u043E\u043C\u043E\u045B
+HideableAction.tooltip=<html> \u041E\u0431\u0435\u043B\u0435\u0436\u0430\u0432\u0430 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0443 \u0441\u0432\u0430\u043A\u043E\u0433 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430.</html>
+HideAllAttributesAction.text=\u0421\u0430\u043A\u0440\u0438\u0458 \u0441\u0432\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435
+HierarchicalIcons2Action.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0440\u0430\u0441\u043A\u0440\u0448\u045B\u0435 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0435
+HierarchicalIconsAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 &\u0445\u0438\u0458\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0443 \u0438\u043A\u043E\u043D\u0430
+HierarchicalIconsAction.tooltip=\u0410\u043A\u043E \u0458\u0435\u0434\u043D\u0430 \u043E\u0434\u00A0\u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430\u00A0\u0438\u043C\u0430\u00A0\u0438\u043A\u043E\u043D\u0443,\u00A0\u043E\u043D\u0430 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u0430\u00A0\u0443 \u043C\u0430\u043B\u043E\u043C\u00A0\u0444\u043E\u0440\u043C\u0430\u0442\u0443, \u0442\u0430\u043A [...]
+hot_keys=\u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0435 \u043F\u0440\u0435\u0447\u0438\u0446\u0435
+hot_keys_table=\u0422\u0430\u0431\u043B\u0438\u0446\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0435\u0447\u0438\u0446\u0430
+HotKeyInfoAction.text=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0435\u0447\u0438\u0446\u0430
+html_export_based_on_headings=HTML \u0418\u0437\u0432\u043E\u0437 - \u043F\u0440\u0435\u043C\u0430 \u043D\u0430\u0441\u043B\u043E\u0432\u0438\u043C\u0430
+html_export_fold_all=HTML \u0418\u0437\u0432\u043E\u0437 - \u0421\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435
+html_export_fold_currently_folded=HTML \u0418\u0437\u0432\u043E\u0437 - \u0421\u043A\u043B\u043E\u043F\u0438 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0440\u0430\u0447\u0432\u0430\u045A\u0435
+html_export_no_folding=HTML \u0418\u0437\u0432\u043E\u0437 - \u0411\u0435\u0437 \u0440\u0430\u0447\u0432\u0430\u045A\u0430
+html_problem=<html>\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u0440\u0435\u0434\u043E\u0447\u0438\u0442\u0438 html<br><br>{0}
icon_0%=0%
icon_100%=100%
icon_25%=25%
icon_50%=50%
icon_75%=75%
-icon_addition=\u0414\u043e\u043f\u0443\u043d\u0430
-icon_attach=\u041f\u043e\u0433\u043b\u0435\u0434\u0430\u0458 \u0442\u0443
-icon_audio=\u0410\u0443\u0434\u0438\u043e
-icon_back=\u041d\u0430\u0442\u0440\u0430\u0433
+icon_addition=\u0414\u043E\u043F\u0443\u043D\u0430
+icon_attach=\u041F\u043E\u0433\u043B\u0435\u0434\u0430\u0458 \u0442\u0443
+icon_audio=\u0410\u0443\u0434\u0438\u043E
+icon_back=\u041D\u0430\u0442\u0440\u0430\u0433
icon_bee=Freeplane
-icon_bell=\u0417\u0430\u043f\u0430\u043c\u0442\u0438
-icon_bookmark=\u0418\u0437\u0432\u0440\u0441\u043d\u043e
-icon_broken-line=\u041f\u0440\u0435\u043a\u0438\u043d\u0443\u0442\u043e
-icon_button_cancel=\u041d\u0438\u0458\u0435 \u0443\u0440\u0435\u0434\u0443
+icon_bell=\u0417\u0430\u043F\u0430\u043C\u0442\u0438
+icon_bookmark=\u0418\u0437\u0432\u0440\u0441\u043D\u043E
+icon_broken-line=\u041F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u043E
+icon_button_cancel=\u041D\u0438\u0458\u0435 \u0443\u0440\u0435\u0434\u0443
icon_button_ok=\u0423 \u0440\u0435\u0434\u0443
-icon_calendar=\u0414\u0430\u0442\u0443\u043c
-icon_checked=\u041f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e
-icon_clanbomber=\u041e\u043f\u0430\u0441\u043d\u043e
-icon_clock=\u0412\u0440\u0435\u043c\u0435
-icon_clock2=\u041f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a
-icon_closed=\u0417\u0430\u0431\u0440\u0430\u045a\u0435\u043d \u0443\u043b\u0430\u0437
-icon_decrypted=\u041e\u0442\u043a\u0459\u0443\u0447\u0430\u043d\u043e
-icon_desktop_new=\u041d\u0435 \u0437\u0430\u0431\u043e\u0440\u0430\u0432\u0438
-icon_division=\u041f\u043e\u0434\u0435\u043b\u0430
-icon_down=\u0414\u043e\u043b\u0435
-icon_edit=\u041f\u0440\u043e\u0447\u0438\u0441\u0442\u0438
-icon_encrypted=\u0417\u0430\u043a\u0459\u0443\u0447\u0430\u043d\u043e
-icon_executable=\u0418\u0437\u0432\u0440\u0448\u043d\u043e
-icon_family=\u041f\u043e\u0440\u043e\u0434\u0438\u0446\u0430
-icon_fema=\u041c\u0443\u0448\u043a\u043e \u0438 \u0436\u0435\u043d\u0441\u043a\u043e
-icon_female1=\u0416\u0435\u043d\u04301
-icon_female2=\u0416\u0435\u043d\u04302
-icon_females=\u0416\u0435\u043d\u0435
-icon_flag=\u0426\u0440\u0432\u0435\u043d\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
-icon_flag-black=\u0426\u0440\u043d\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
-icon_flag-blue=\u041f\u043b\u0430\u0432\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
-icon_flag-green=\u0417\u0435\u043b\u0435\u043d\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
-icon_flag-orange=\u041d\u0430\u0440\u0430\u043d\u045f\u0430\u0441\u0442\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
+icon_calendar=\u0414\u0430\u0442\u0443\u043C
+icon_checked=\u041F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E
+icon_clanbomber=\u041E\u043F\u0430\u0441\u043D\u043E
+icon_clock=\u0412\u0440\u0435\u043C\u0435
+icon_clock2=\u041F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A
+icon_closed=\u0417\u0430\u0431\u0440\u0430\u045A\u0435\u043D \u0443\u043B\u0430\u0437
+icon_decrypted=\u041E\u0442\u043A\u0459\u0443\u0447\u0430\u043D\u043E
+icon_desktop_new=\u041D\u0435 \u0437\u0430\u0431\u043E\u0440\u0430\u0432\u0438
+icon_division=\u041F\u043E\u0434\u0435\u043B\u0430
+icon_down=\u0414\u043E\u043B\u0435
+icon_edit=\u041F\u0440\u043E\u0447\u0438\u0441\u0442\u0438
+icon_encrypted=\u0417\u0430\u043A\u0459\u0443\u0447\u0430\u043D\u043E
+icon_executable=\u0418\u0437\u0432\u0440\u0448\u043D\u043E
+icon_family=\u041F\u043E\u0440\u043E\u0434\u0438\u0446\u0430
+icon_fema=\u041C\u0443\u0448\u043A\u043E \u0438 \u0436\u0435\u043D\u0441\u043A\u043E
+icon_female1=\u0416\u0435\u043D\u04301
+icon_female2=\u0416\u0435\u043D\u04302
+icon_females=\u0416\u0435\u043D\u0435
+icon_flag=\u0426\u0440\u0432\u0435\u043D\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
+icon_flag-black=\u0426\u0440\u043D\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
+icon_flag-blue=\u041F\u043B\u0430\u0432\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
+icon_flag-green=\u0417\u0435\u043B\u0435\u043D\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
+icon_flag-orange=\u041D\u0430\u0440\u0430\u043D\u045F\u0430\u0441\u0442\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
icon_flag-pink=\u0420\u0443\u0436\u0438\u0447\u0430\u0441\u0442\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
icon_flag-yellow=\u0416\u0443\u0442\u0430 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0446\u0430
-icon_folder=\u0424\u0430\u0441\u0446\u0438\u043a\u043b\u0430
-icon_forward=\u041d\u0430\u043f\u0440\u0435\u0434
+icon_folder=\u0424\u0430\u0441\u0446\u0438\u043A\u043B\u0430
+icon_forward=\u041D\u0430\u043F\u0440\u0435\u0434
icon_freemind_butterfly=FreeMind
-icon_full-0=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 0
-icon_full-1=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 1
-icon_full-2=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 2
-icon_full-3=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 3
-icon_full-4=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 4
-icon_full-5=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 5
-icon_full-6=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 6
-icon_full-7=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 7
-icon_full-8=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 8
-icon_full-9=\u041f\u0440\u0435\u0434\u043d\u043e\u0441\u0442 9
-icon_go=\u0417\u0435\u043b\u0435\u043d\u0438 \u0441\u0435\u043c\u0430\u0444\u043e\u0440
-icon_gohome=\u0414\u043e\u043c
-icon_group=\u0421\u043a\u0443\u043f\u0438\u043d\u0430
-icon_help=\u041f\u0438\u0442\u0430\u045a\u0435
-icon_hourglass=\u0427\u0435\u043a\u0430\u045a\u0435
-icon_icon_not_found=\u041d\u0435\u043c\u0430 \u0438\u043a\u043e\u043d\u0435
-icon_idea=\u0417\u0430\u043c\u0438\u0441\u0430\u043e
-icon_image=\u0421\u043b\u0438\u043a\u0430
-icon_info=\u041e\u0431\u0430\u0432\u0435\u0448\u0442\u0435\u045a\u0435
-icon_internet=\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442
-icon_internet_warning=\u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0443\u043f\u043e\u0437\u043e\u0440\u0435\u045a\u0435
-icon_kaddressbook=\u0422\u0435\u043b\u0435\u0444\u043e\u043d
-icon_kmail=\u0415-\u043f\u043e\u0448\u0442\u0430
-icon_knotify=\u041c\u0443\u0437\u0438\u043a\u0430
-icon_korn=\u041f\u043e\u0448\u0442\u0430\u043d\u0441\u043a\u043e \u0441\u0430\u043d\u0434\u0443\u0447\u0435
-icon_ksmiletris=\u0421\u0440\u0435\u045b\u0430\u043d \u0441\u0430\u043c
-icon_launch=\u041f\u043e\u043a\u0440\u0435\u043d\u0438
-icon_licq=\u041b\u0435\u043f\u043e
-icon_list=\u0421\u043f\u0438\u0441\u0430\u043a
-icon_Mail=\u041f\u043e\u0448\u0442\u0430
-icon_male1=\u041c\u0443\u0448\u043a\u0430\u0440\u0430\u04461
-icon_male2=\u041c\u0443\u0448\u043a\u0430\u0440\u0430\u04462
-icon_males=\u041c\u0443\u0448\u043a\u0430\u0440\u0446\u0438
-icon_menu=\u0418\u043a\u043e\u043d\u0435
-icon_messagebox_warning=\u0412\u0430\u0436\u043d\u043e
-icon_mindmap=\u041c\u0430\u043f\u0430 \u0443\u043c\u0430
-icon_multiplication=\u0423\u043c\u043d\u043e\u0436\u0430\u0432\u0430\u045a\u0435
-icon_narrative=\u041f\u0440\u0438\u043f\u043e\u0432\u0435\u0434\u0430\u045a\u0435
-icon_negative=\u041d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e
-icon_neutral=\u041d\u0435\u0443\u0442\u0440\u0430\u043b\u043d\u043e
-icon_password=\u041a\u0459\u0443\u0447
-icon_pencil=\u041f\u043e\u0431\u043e\u0459\u0448\u0430\u045a\u0435
+icon_full-0=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 0
+icon_full-1=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 1
+icon_full-2=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 2
+icon_full-3=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 3
+icon_full-4=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 4
+icon_full-5=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 5
+icon_full-6=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 6
+icon_full-7=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 7
+icon_full-8=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 8
+icon_full-9=\u041F\u0440\u0435\u0434\u043D\u043E\u0441\u0442 9
+icon_go=\u0417\u0435\u043B\u0435\u043D\u0438 \u0441\u0435\u043C\u0430\u0444\u043E\u0440
+icon_gohome=\u0414\u043E\u043C
+icon_group=\u0421\u043A\u0443\u043F\u0438\u043D\u0430
+icon_help=\u041F\u0438\u0442\u0430\u045A\u0435
+icon_hourglass=\u0427\u0435\u043A\u0430\u045A\u0435
+icon_icon_not_found=\u041D\u0435\u043C\u0430 \u0438\u043A\u043E\u043D\u0435
+icon_idea=\u0417\u0430\u043C\u0438\u0441\u0430\u043E
+icon_image=\u0421\u043B\u0438\u043A\u0430
+icon_info=\u041E\u0431\u0430\u0432\u0435\u0448\u0442\u0435\u045A\u0435
+icon_internet=\u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442
+icon_internet_warning=\u0418\u043D\u0442\u0435\u0440\u043D\u0435\u0442 \u0443\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435
+icon_kaddressbook=\u0422\u0435\u043B\u0435\u0444\u043E\u043D
+icon_kmail=\u0415-\u043F\u043E\u0448\u0442\u0430
+icon_knotify=\u041C\u0443\u0437\u0438\u043A\u0430
+icon_korn=\u041F\u043E\u0448\u0442\u0430\u043D\u0441\u043A\u043E \u0441\u0430\u043D\u0434\u0443\u0447\u0435
+icon_ksmiletris=\u0421\u0440\u0435\u045B\u0430\u043D \u0441\u0430\u043C
+icon_launch=\u041F\u043E\u043A\u0440\u0435\u043D\u0438
+icon_licq=\u041B\u0435\u043F\u043E
+icon_list=\u0421\u043F\u0438\u0441\u0430\u043A
+icon_Mail=\u041F\u043E\u0448\u0442\u0430
+icon_male1=\u041C\u0443\u0448\u043A\u0430\u0440\u0430\u04461
+icon_male2=\u041C\u0443\u0448\u043A\u0430\u0440\u0430\u04462
+icon_males=\u041C\u0443\u0448\u043A\u0430\u0440\u0446\u0438
+icon_menu=\u0418\u043A\u043E\u043D\u0435
+icon_messagebox_warning=\u0412\u0430\u0436\u043D\u043E
+icon_mindmap=\u041C\u0430\u043F\u0430 \u0443\u043C\u0430
+icon_multiplication=\u0423\u043C\u043D\u043E\u0436\u0430\u0432\u0430\u045A\u0435
+icon_narrative=\u041F\u0440\u0438\u043F\u043E\u0432\u0435\u0434\u0430\u045A\u0435
+icon_negative=\u041D\u0435\u0433\u0430\u0442\u0438\u0432\u043D\u043E
+icon_neutral=\u041D\u0435\u0443\u0442\u0440\u0430\u043B\u043D\u043E
+icon_password=\u041A\u0459\u0443\u0447
+icon_pencil=\u041F\u043E\u0431\u043E\u0459\u0448\u0430\u045A\u0435
icon_penguin=Linux
-icon_positive=\u041f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u043e
-icon_prepare=\u0416\u0443\u0442\u0438 \u0441\u0435\u043c\u0430\u0444\u043e\u0440
-icon_revision=\u041f\u0440\u0435\u0440\u0430\u0452\u0435\u043d\u043e
+icon_positive=\u041F\u043E\u0437\u0438\u0442\u0438\u0432\u043D\u043E
+icon_prepare=\u0416\u0443\u0442\u0438 \u0441\u0435\u043C\u0430\u0444\u043E\u0440
+icon_revision=\u041F\u0440\u0435\u0440\u0430\u0452\u0435\u043D\u043E
icon_smiley-angry=\u0409\u0443\u0442
-icon_smiley-neutral=\u0420\u0430\u0432\u043d\u043e\u0434\u0443\u0448\u0430\u043d
-icon_smiley-oh=\u0418\u0437\u043d\u0435\u043d\u0430\u0452\u0435\u043d
-icon_smily_bad=\u041d\u0435\u0437\u0430\u0434\u043e\u0432\u043e\u0459\u0430\u043d \u0441\u0430\u043c
-icon_stop=\u0426\u0440\u0432\u0435\u043d\u0438 \u0441\u0435\u043c\u0430\u0444\u043e\u0440
-icon_stop-sign=\u0421\u0442\u0430\u043d\u0438
-icon_subtraction=\u041e\u0434\u0443\u0437\u0438\u043c\u0430\u045a\u0435
-icon_unchecked=\u041d\u0435\u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043e
-icon_up=\u0413\u043e\u0440\u0435
-icon_user_icon=\u041a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0435 \u0438\u043a\u043e\u043d\u0435
-icon_very_negative=\u0412\u0440\u043b\u043e \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e
-icon_very_positive=\u0412\u0440\u043b\u043e \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u043e
-icon_video=\u0412\u0438\u0434\u0435\u043e
-icon_wizard=\u0427\u0430\u0440\u043e\u043b\u0438\u0458\u0430
-icon_xmag=\u0420\u0430\u0441\u043f\u0440\u0430\u0432\u0430
-icon_yes=\u0412\u0430\u0436\u043d\u043e
-IconGroupPopupAction.arrows.text=\u0421\u0442\u0440\u0435\u043b\u0438\u0446\u0435
-IconGroupPopupAction.docs_folders.text=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438 \u0438 \u0444\u0430\u0441\u0430\u0446\u0438\u043a\u043b\u0435
+icon_smiley-neutral=\u0420\u0430\u0432\u043D\u043E\u0434\u0443\u0448\u0430\u043D
+icon_smiley-oh=\u0418\u0437\u043D\u0435\u043D\u0430\u0452\u0435\u043D
+icon_smily_bad=\u041D\u0435\u0437\u0430\u0434\u043E\u0432\u043E\u0459\u0430\u043D \u0441\u0430\u043C
+icon_stop=\u0426\u0440\u0432\u0435\u043D\u0438 \u0441\u0435\u043C\u0430\u0444\u043E\u0440
+icon_stop-sign=\u0421\u0442\u0430\u043D\u0438
+icon_subtraction=\u041E\u0434\u0443\u0437\u0438\u043C\u0430\u045A\u0435
+icon_unchecked=\u041D\u0435\u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u043E
+icon_up=\u0413\u043E\u0440\u0435
+icon_user_icon=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0435 \u0438\u043A\u043E\u043D\u0435
+icon_very_negative=\u0412\u0440\u043B\u043E \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u043D\u043E
+icon_very_positive=\u0412\u0440\u043B\u043E \u043F\u043E\u0437\u0438\u0442\u0438\u0432\u043D\u043E
+icon_video=\u0412\u0438\u0434\u0435\u043E
+icon_wizard=\u0427\u0430\u0440\u043E\u043B\u0438\u0458\u0430
+icon_xmag=\u0420\u0430\u0441\u043F\u0440\u0430\u0432\u0430
+icon_yes=\u0412\u0430\u0436\u043D\u043E
+IconGroupPopupAction.arrows.text=\u0421\u0442\u0440\u0435\u043B\u0438\u0446\u0435
+IconGroupPopupAction.docs_folders.text=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438 \u0438 \u0444\u0430\u0441\u0430\u0446\u0438\u043A\u043B\u0435
IconGroupPopupAction.flags.text=\u0417\u0430\u0441\u0442\u0430\u0432\u0435
-IconGroupPopupAction.math.text=\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430
-IconGroupPopupAction.media.text=\u041c\u0435\u0434\u0438\u0458\u0438
-IconGroupPopupAction.miscellaneous.text=\u041e\u0441\u0442\u0430\u043b\u043e
-IconGroupPopupAction.nature.text=\u041f\u0440\u0438\u0440\u043e\u0434\u0430
-IconGroupPopupAction.numbers.text=\u0411\u0440\u043e\u0458\u0435\u0432\u0438
-IconGroupPopupAction.office.text=\u041a\u0430\u043d\u0446\u0435\u043b\u0430\u0440\u0438\u0458\u0430
+IconGroupPopupAction.math.text=\u041C\u0430\u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430
+IconGroupPopupAction.media.text=\u041C\u0435\u0434\u0438\u0458\u0438
+IconGroupPopupAction.miscellaneous.text=\u041E\u0441\u0442\u0430\u043B\u043E
+IconGroupPopupAction.nature.text=\u041F\u0440\u0438\u0440\u043E\u0434\u0430
+IconGroupPopupAction.numbers.text=\u0411\u0440\u043E\u0458\u0435\u0432\u0438
+IconGroupPopupAction.office.text=\u041A\u0430\u043D\u0446\u0435\u043B\u0430\u0440\u0438\u0458\u0430
IconGroupPopupAction.people.text=\u0409\u0443\u0434\u0438
-IconGroupPopupAction.rating.text=\u041f\u0440\u043e\u0446\u0435\u043d\u0430
-IconGroupPopupAction.signs.text=\u0417\u043d\u0430\u043a\u043e\u0432\u0438
-IconGroupPopupAction.smiley.text=\u0421\u043c\u0435\u0448\u0446\u0438
-IconGroupPopupAction.time.text=\u0412\u0440\u0435\u043c\u0435
-IconGroupPopupAction.user.text=\u041a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0435 \u0438\u043a\u043e\u043d\u0435
-IconProgressExtended10Action.text=\u041f\u043e\u0431\u043e\u0459\u0448\u0430\u043d\u0435 \u043f\u0435\u0440\u0444\u043e\u0440\u043c\u0430\u043d\u0441\u0435 \u043e\u0434 10%
-IconProgressExtended10Action.tooltip=<html>\u0414\u043e\u0434\u0430\u0458\u0435 \u043d\u0430\u0437\u043d\u0430\u043a\u0443 \u043d\u0430\u043f\u0440\u0435\u0434\u043a\u0430 \u0434\u0430 \u0458\u0435 \u043f\u043e\u0432\u0435\u045b\u0430\u043d \u0437\u0430 10% \u043d\u0430 \u0434\u0432\u043e\u0441\u0442\u0440\u0443\u043a\u0438 \u043b\u0435\u0432\u0438 \u043a\u043b\u0438\u043a.<br>Control + \u043b\u0435\u0432\u0438 \u0434\u0432\u043e\u043a\u043b\u0438 \u0441\u043c\u0430\u045a\u0443\u0458\u0 [...]
-IconProgressExtended25Action.text=\u041f\u043e\u0431\u043e\u0459\u0448\u0430\u043d\u0435 \u043f\u0435\u0440\u0444\u043e\u0440\u043c\u0430\u043d\u0441\u0435 \u043e\u0434 25%
-IconProgressExtended25Action.tooltip=<html>\u0414\u043e\u0434\u0430\u0458\u0435 \u043d\u0430\u0437\u043d\u0430\u043a\u0443 \u043d\u0430\u043f\u0440\u0435\u0442\u043a\u0430 \u0434\u0430 \u0458\u0435 \u043f\u043e\u0432\u0435\u045b\u0430\u043d \u0437\u0430 25% \u043d\u0430 \u043b\u0435\u0432\u0438 \u0434\u0432\u043e\u043a\u043b\u0438\u043a.<br> Control + \u043b\u0435\u0432\u0438 \u0434\u0432\u043e\u043a\u043b\u0438\u043a \u0441\u043c\u0430\u045a\u0443\u0458\u0435/\u0443\u043a\u043b\u0430\u [...]
-IconProgressIconDownAction.text=\u041d\u0430\u043f\u0440\u0435\u0434\u0430\u043a \u043d\u0430\u0434\u043e\u043b\u0435
-IconProgressIconDownAction.tooltip=\u0421\u043c\u0430\u045a\u0443\u0458\u0435/ \u0443\u0431\u0430\u0446\u0443\u0458\u0435 /\u0438\u0437\u0431\u0430\u0446\u0443\u0458\u0435 \u043d\u0430\u043f\u0440\u0435\u0434\u0430\u043a \u0438\u043a\u043e\u043d\u0430 (100% -> 75% -> 50% -> 25% -> 0% -> \u0443\u043a\u043b\u043e\u043d\u0438).
-IconProgressIconUpAction.text=\u041d\u0430\u043f\u0440\u0435\u0434\u0430\u043a \u043d\u0430\u0433\u043e\u0440\u0435
-IconProgressIconUpAction.tooltip=\u041f\u043e\u0432\u0435\u045b\u0430\u0432\u0430/ \u0443\u0431\u0430\u0446\u0443\u0458\u0435 \u043d\u0430\u043f\u0440\u0435\u0434\u0430\u043a \u0438\u043a\u043e\u043d\u0430 (0% -> 25% -> 50% -> 75% -> 100% + \u0423 \u0440\u0435\u0434\u0443).
-IconProgressRemoveAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u043d\u0430\u043f\u0440\u0435\u0434\u0430\u043a
-IconProgressRemoveAction.tooltip=\u0423\u043a\u043b\u0430\u045a\u0430 \u043d\u0430\u043f\u0440\u0435\u0434\u0430\u043a \u0438\u043a\u043e\u043d\u0430 \u0438 \u043f\u0440\u043e\u0448\u0438\u0440\u0435\u043d \u043d\u0430\u043f\u0440\u0435\u0434\u0430\u043a \u0438\u043a\u043e\u043d\u0435.
-IconSelectionPlugin.text=\u0418\u043a\u043e\u043d\u0430 \u0441\u0430 \u0442\u0430\u0431\u0435\u043b\u0435...
-IconSelectionPlugin.tooltip=<html>\u041e\u0432\u0434\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0434\u0430\u0431\u0440\u0430\u0442\u0438 \u0438\u043a\u043e\u043d\u0443 \u043a\u043e\u0440\u0438\u0441\u0442\u0435\u045b\u0438 \u043f\u043e\u0434 \u043f\u0440\u043e\u0437\u043e\u0440.</html>
-image_covertLink=\u041f\u0440\u0435\u0442\u0432\u043e\u0440\u0438 \u0432\u0435\u0437\u0443 \u0443 \u0441\u043b\u0438\u043a\u0443
-ImageFlavorHandler=\u0421\u043b\u0438\u043a\u0430 (\u043a\u043e\u0440\u0438\u0441\u0442\u0438 \u043f\u043e\u0441\u0435\u0431\u043d\u0443 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443)
-import=\u0423\u0432\u043e\u0437
-import_linked_branch_no_link=\u041e\u0434\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440 \u043d\u0435\u043c\u0430 \u043d\u0438\u043a\u0430\u043a\u0432\u0443 \u0432\u0435\u0437\u0443 \u0437\u0430 \u0443\u0432\u043e\u0437.
-ImportAction.text=\u0423&\u0432\u043e\u0437
-ImportBranchAction.text=\u0413\u0440\u0430\u043d\u0430...
-ImportExplorerFavoritesAction.text=\u0418\u0441\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u0447 \u0444\u0430\u0432\u043e\u0440\u0438\u0442\u0430...
-ImportFolderStructureAction.text=\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0435...
-ImportLinkedBranchAction.text=\u041f\u043e\u0432\u0435\u0437\u0430\u043d\u0430 \u0433\u0440\u0430\u043d\u0430
-ImportLinkedBranchWithoutRootAction.text=\u041f\u043e\u0432\u0435\u0437\u0430\u043d\u0430 \u0433\u0440\u0430\u043d\u0430 \u0431\u0435\u0437 \u043a\u043e\u0440\u0435\u043d\u0430...
-ImportMindmanagerFiles.text=MindManager X5 \u043c\u0430\u043f\u0435...
-increase_branch_font_size=\u0412\u0435\u045b\u0430 \u0441\u043b\u043e\u0432\u0430
-IncreaseNodeFontAction.text=\u0412\u0435\u045b\u0430 \u0441\u043b\u043e\u0432\u0430
-internal_error_tooltip=\u0414\u043e\u0448\u043b\u043e \u0458\u0435 \u0434\u043e \u0443\u043d\u0443\u0442\u0440\u0430\u0448\u045a\u0435 \u0433\u0440\u0435\u0448\u043a\u0435. \u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u043e\u0442\u0432\u043e\u0440\u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0443 log \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443 log.0 \u0437\u0430 \u0432\u0438\u0448\u0435 \u043f\u043e\u0434\u0430\u044 [...]
-invalid_export_file=\u041d\u0435\u0432\u0430\u0436\u0435\u045b\u0435 \u0438\u0437\u0432\u043e\u0437\u043d\u043e \u0438\u043c\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435
-invalid_file_msg=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u043f\u0440\u043e\u043d\u0430\u045b\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443 \u0437\u0430 {0}
-invalid_uri=\u041d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u0430 URI {0}
-invalid_url=\u041d\u0435 \u043c\u043e\u0433\u0443 \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u0432\u0430\u0459\u0430\u043d\u0443 \u0423\u0420\u041b
-invalid_url_msg=\u041d\u0435 \u043c\u043e\u0433\u0443 \u0441\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u0432\u0430\u0459\u0430\u043d\u0443 \u0423\u0420\u041b \u0437\u0430 {0}
-ItalicAction.text=\u0423\u043a\u043e\u0448\u0435\u043d\u043e
-italicise_branch=\u0423\u043a\u043e\u0441\u0438
-java_version=\u0418\u0437\u0434\u0430\u045a\u0435 Java: {0}
-JoinNodesAction.text=\u041f\u0440\u0438\u0434\u0440\u0443\u0436\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-KeyDocumentationAction.text=\u0420\u0430\u0441\u043f\u043e\u0440\u0435\u0434 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0435\u0447\u0438\u0446\u0430 \u041f\u0414\u0424 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430
-LatexDeleteLatexAction.text=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 LaTe&X \u0444\u043e\u0440\u043c\u0443\u043b\u0443
-LatexEditLatexAction.text=\u0423\u0440\u0435\u0434\u0438 LaTe&X \u0444\u043e\u0440\u043c\u0443\u043b\u0443...
-LatexInsertLatexAction.text=\u0414\u043e\u0434\u0430\u0458 LaTe&X \u0444\u043e\u0440\u043c\u0443\u043b\u0443...
-less_than_two_selected_nodes=\u041c\u043e\u0440\u0430\u0442\u0435 \u0434\u0430 \u0438\u0437\u0430\u0431\u0435\u0440\u0435\u0442\u0435 \u043d\u0430\u0458\u043c\u0430\u045a\u0435 \u0434\u0432\u0430 \u0447\u0432\u043e\u0440\u0430 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0434\u043e\u0431\u0438\u043b\u0438 \u0432\u0435\u0437\u0443
-license=\u0414\u043e\u0437\u0432\u043e\u043b\u0430: GPL 2 \u0438\u043b\u0438 \u043a\u0430\u0441\u043d\u0438\u0458\u0430
-license_text=<html>\u041e\u0432\u0430\u0458 \u043f\u0440\u043e\u0433\u0440\u0430\u043c \u0458\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u0430\u043d; \u043c\u043e\u0436\u0435\u0442\u0435 \u0433\u0430 \u0434\u0435\u043b\u0438\u0442\u0438 \u0438 / \u0438\u043b\u0438<br>\u043c\u0435\u045a\u0430\u0442\u0438 \u043f\u043e\u0434 \u0443\u0441\u043b\u043e\u0432\u0438\u043c\u0430 \u0438\u0437 GNU-\u043e\u0432\u0435 \u041e\u043f\u0448\u0442\u0435 \u0458\u0430\u0432\u043d\u0435 \u043b\u0438\ [...]
-link_error=\u041d\u0435\u0438\u0441\u043f\u0440\u0430\u0432\u043d\u0430 \u0432\u0435\u0437\u0430 "{0}" \u043d\u0438\u0458\u0435 \u0443\u0447\u0438\u0442\u0430\u043d\u0430
-link_not_available_any_more=\u0412\u0435\u0437\u0430 \u043d\u0438\u0458\u0435 \u0432\u0430\u0459\u0430\u043d\u0430. \u0423 \u043c\u0435\u0452\u0443\u0432\u0440\u0435\u043c\u0435\u043d\u0443 \u0458\u0435 \u0447\u0432\u043e\u0440 \u043e\u0431\u0440\u0438\u0441\u0430\u043d.
-link_not_found=\u0412\u0435\u0437\u0430 {0} \u043d\u0438\u0458\u0435 \u043d\u0430\u0452\u0435\u043d\u0430.
+IconGroupPopupAction.rating.text=\u041F\u0440\u043E\u0446\u0435\u043D\u0430
+IconGroupPopupAction.signs.text=\u0417\u043D\u0430\u043A\u043E\u0432\u0438
+IconGroupPopupAction.smiley.text=\u0421\u043C\u0435\u0448\u0446\u0438
+IconGroupPopupAction.time.text=\u0412\u0440\u0435\u043C\u0435
+IconGroupPopupAction.user.text=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0435 \u0438\u043A\u043E\u043D\u0435
+IconProgressExtended10Action.text=\u041F\u043E\u0431\u043E\u0459\u0448\u0430\u043D\u0435 \u043F\u0435\u0440\u0444\u043E\u0440\u043C\u0430\u043D\u0441\u0435 \u043E\u0434 10%
+IconProgressExtended10Action.tooltip=<html>\u0414\u043E\u0434\u0430\u0458\u0435 \u043D\u0430\u0437\u043D\u0430\u043A\u0443 \u043D\u0430\u043F\u0440\u0435\u0434\u043A\u0430 \u0434\u0430 \u0458\u0435 \u043F\u043E\u0432\u0435\u045B\u0430\u043D \u0437\u0430 10% \u043D\u0430 \u0434\u0432\u043E\u0441\u0442\u0440\u0443\u043A\u0438 \u043B\u0435\u0432\u0438 \u043A\u043B\u0438\u043A.<br>Control + \u043B\u0435\u0432\u0438 \u0434\u0432\u043E\u043A\u043B\u0438 \u0441\u043C\u0430\u045A\u0443\u0458\u0 [...]
+IconProgressExtended25Action.text=\u041F\u043E\u0431\u043E\u0459\u0448\u0430\u043D\u0435 \u043F\u0435\u0440\u0444\u043E\u0440\u043C\u0430\u043D\u0441\u0435 \u043E\u0434 25%
+IconProgressExtended25Action.tooltip=<html>\u0414\u043E\u0434\u0430\u0458\u0435 \u043D\u0430\u0437\u043D\u0430\u043A\u0443 \u043D\u0430\u043F\u0440\u0435\u0442\u043A\u0430 \u0434\u0430 \u0458\u0435 \u043F\u043E\u0432\u0435\u045B\u0430\u043D \u0437\u0430 25% \u043D\u0430 \u043B\u0435\u0432\u0438 \u0434\u0432\u043E\u043A\u043B\u0438\u043A.<br> Control + \u043B\u0435\u0432\u0438 \u0434\u0432\u043E\u043A\u043B\u0438\u043A \u0441\u043C\u0430\u045A\u0443\u0458\u0435/\u0443\u043A\u043B\u0430\u [...]
+IconProgressIconDownAction.text=\u041D\u0430\u043F\u0440\u0435\u0434\u0430\u043A \u043D\u0430\u0434\u043E\u043B\u0435
+IconProgressIconDownAction.tooltip=\u0421\u043C\u0430\u045A\u0443\u0458\u0435/ \u0443\u0431\u0430\u0446\u0443\u0458\u0435 /\u0438\u0437\u0431\u0430\u0446\u0443\u0458\u0435 \u043D\u0430\u043F\u0440\u0435\u0434\u0430\u043A \u0438\u043A\u043E\u043D\u0430 (100% -> 75% -> 50% -> 25% -> 0% -> \u0443\u043A\u043B\u043E\u043D\u0438).
+IconProgressIconUpAction.text=\u041D\u0430\u043F\u0440\u0435\u0434\u0430\u043A \u043D\u0430\u0433\u043E\u0440\u0435
+IconProgressIconUpAction.tooltip=\u041F\u043E\u0432\u0435\u045B\u0430\u0432\u0430/ \u0443\u0431\u0430\u0446\u0443\u0458\u0435 \u043D\u0430\u043F\u0440\u0435\u0434\u0430\u043A \u0438\u043A\u043E\u043D\u0430 (0% -> 25% -> 50% -> 75% -> 100% + \u0423 \u0440\u0435\u0434\u0443).
+IconProgressRemoveAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u043D\u0430\u043F\u0440\u0435\u0434\u0430\u043A
+IconProgressRemoveAction.tooltip=\u0423\u043A\u043B\u0430\u045A\u0430 \u043D\u0430\u043F\u0440\u0435\u0434\u0430\u043A \u0438\u043A\u043E\u043D\u0430 \u0438 \u043F\u0440\u043E\u0448\u0438\u0440\u0435\u043D \u043D\u0430\u043F\u0440\u0435\u0434\u0430\u043A \u0438\u043A\u043E\u043D\u0435.
+IconSelectionPlugin.text=\u0418\u043A\u043E\u043D\u0430 \u0441\u0430 \u0442\u0430\u0431\u0435\u043B\u0435...
+IconSelectionPlugin.tooltip=<html>\u041E\u0432\u0434\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u0442\u0438 \u0438\u043A\u043E\u043D\u0443 \u043A\u043E\u0440\u0438\u0441\u0442\u0435\u045B\u0438 \u043F\u043E\u0434 \u043F\u0440\u043E\u0437\u043E\u0440.</html>
+image_covertLink=\u041F\u0440\u0435\u0442\u0432\u043E\u0440\u0438 \u0432\u0435\u0437\u0443 \u0443 \u0441\u043B\u0438\u043A\u0443
+ImageFlavorHandler=\u0421\u043B\u0438\u043A\u0430 (\u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043F\u043E\u0441\u0435\u0431\u043D\u0443 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443)
+import=\u0423&\u0432\u043E\u0437
+import_linked_branch_no_link=\u041E\u0434\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440 \u043D\u0435\u043C\u0430 \u043D\u0438\u043A\u0430\u043A\u0432\u0443 \u0432\u0435\u0437\u0443 \u0437\u0430 \u0443\u0432\u043E\u0437.
+ImportAction.text=\u0423&\u0432\u043E\u0437
+ImportBranchAction.text=\u0413\u0440\u0430\u043D\u0430...
+ImportExplorerFavoritesAction.text=\u0418\u0441\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u0447 \u0444\u0430\u0432\u043E\u0440\u0438\u0442\u0430...
+ImportFolderStructureAction.text=\u0421\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435 \u0444\u0430\u0441\u0446\u0438\u043A\u043B\u0435...
+ImportLinkedBranchAction.text=\u041F\u043E\u0432\u0435\u0437\u0430\u043D\u0430 \u0433\u0440\u0430\u043D\u0430
+ImportLinkedBranchWithoutRootAction.text=\u041F\u043E\u0432\u0435\u0437\u0430\u043D\u0430 \u0433\u0440\u0430\u043D\u0430 \u0431\u0435\u0437 \u043A\u043E\u0440\u0435\u043D\u0430...
+ImportMindmanagerFiles.text=MindManager X5 \u043C\u0430\u043F\u0435...
+increase_branch_font_size=\u0412\u0435\u045B\u0430 \u0441\u043B\u043E\u0432\u0430
+IncreaseNodeFontAction.text=\u0412\u0435\u045B\u0430 \u0441\u043B\u043E\u0432\u0430
+internal_error_tooltip=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u0443\u043D\u0443\u0442\u0440\u0430\u0448\u045A\u0435 \u0433\u0440\u0435\u0448\u043A\u0435. \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u043E\u0442\u0432\u043E\u0440\u0438\u043B\u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0443 log \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 log.0 \u0437\u0430 \u0432\u0438\u0448\u0435 \u043F\u043E\u0434\u0430\u044 [...]
+invalid_export_file=\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0435 \u0438\u0437\u0432\u043E\u0437\u043D\u043E \u0438\u043C\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435
+invalid_file_msg=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u0440\u043E\u043D\u0430\u045B\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0437\u0430 {0}
+invalid_uri=\u041D\u0435\u0438\u0441\u043F\u0440\u0430\u0432\u043D\u0430 URI {0}
+invalid_url=\u041D\u0435 \u043C\u043E\u0433\u0443 \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0432\u0430\u0459\u0430\u043D\u0443 \u0423\u0420\u041B
+invalid_url_msg=\u041D\u0435 \u043C\u043E\u0433\u0443 \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0432\u0430\u0459\u0430\u043D\u0443 \u0423\u0420\u041B \u0437\u0430 {0}
+ItalicAction.text=\u0423\u043A\u043E\u0448\u0435\u043D\u043E
+italicise_branch=\u0423\u043A\u043E\u0441\u0438
+java_version=\u0418\u0437\u0434\u0430\u045A\u0435 Java: {0}
+KeyDocumentationAction.text=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0435\u0447\u0438\u0446\u0430 \u041F\u0414\u0424 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430
+LatexDeleteLatexAction.text=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 LaTe&X \u0444\u043E\u0440\u043C\u0443\u043B\u0443
+LatexEditLatexAction.text=\u0423\u0440\u0435\u0434\u0438 LaTe&X \u0444\u043E\u0440\u043C\u0443\u043B\u0443...
+LatexInsertLatexAction.text=\u0414\u043E\u0434\u0430\u0458 LaTe&X \u0444\u043E\u0440\u043C\u0443\u043B\u0443...
+less_than_two_selected_nodes=\u041C\u043E\u0440\u0430\u0442\u0435 \u0434\u0430 \u0438\u0437\u0430\u0431\u0435\u0440\u0435\u0442\u0435 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0434\u0432\u0430 \u0447\u0432\u043E\u0440\u0430 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0434\u043E\u0431\u0438\u043B\u0438 \u0432\u0435\u0437\u0443
+license=\u0414\u043E\u0437\u0432\u043E\u043B\u0430: GPL 2 \u0438\u043B\u0438 \u043A\u0430\u0441\u043D\u0438\u0458\u0430
+license_text=<html>\u041E\u0432\u0430\u0458 \u043F\u0440\u043E\u0433\u0440\u0430\u043C \u0458\u0435 \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u0430\u043D; \u043C\u043E\u0436\u0435\u0442\u0435 \u0433\u0430 \u0434\u0435\u043B\u0438\u0442\u0438 \u0438 / \u0438\u043B\u0438<br>\u043C\u0435\u045A\u0430\u0442\u0438 \u043F\u043E\u0434 \u0443\u0441\u043B\u043E\u0432\u0438\u043C\u0430 \u0438\u0437 GNU-\u043E\u0432\u0435 \u041E\u043F\u0448\u0442\u0435 \u0458\u0430\u0432\u043D\u0435 \u043B\u0438\ [...]
+link_error=\u041D\u0435\u0438\u0441\u043F\u0440\u0430\u0432\u043D\u0430 \u0432\u0435\u0437\u0430 "{0}" \u043D\u0438\u0458\u0435 \u0443\u0447\u0438\u0442\u0430\u043D\u0430
+link_not_available_any_more=\u0412\u0435\u0437\u0430 \u043D\u0438\u0458\u0435 \u0432\u0430\u0459\u0430\u043D\u0430. \u0423 \u043C\u0435\u0452\u0443\u0432\u0440\u0435\u043C\u0435\u043D\u0443 \u0458\u0435 \u0447\u0432\u043E\u0440 \u043E\u0431\u0440\u0438\u0441\u0430\u043D.
+link_not_found=\u0412\u0435\u0437\u0430 {0} \u043D\u0438\u0458\u0435 \u043D\u0430\u0452\u0435\u043D\u0430.
+links=\u0412\u0435\u0437\u0435
load=&\u0423\u0447\u0438\u0442\u0430\u0458
load_accelerator_presets=\u0423\u0447\u0438\u0442\u0430\u0458
-LoadAcceleratorPresetsAction.textPatterns.text=\u0428\u0430\u0431\u043b\u043e\u043d \u0442\u0435\u043a\u0441\u0442\u0430
-locking_failed_by_open=\u0417\u0430\u043a\u0459\u0443\u0447\u0430\u0432\u0430\u045a\u0435 \u043c\u0430\u043f\u0435 {0} \u043d\u0438\u0458\u0435 \u0443\u0441\u043f\u0435\u043b\u043e. \u041e\u0442\u0432\u0430\u0440\u0430\u045a\u0435 \u0441\u0430\u043c\u043e \u0437\u0430 \u0447\u0438\u0442\u0430\u045a\u0435.
-locking_failed_by_save_as=\u0417\u0430\u043a\u0459\u0443\u0447\u0430\u0432\u0430\u045a\u0435 \u043c\u0430\u043f\u0435 {0} \u043d\u0438\u0458\u0435 \u0443\u0441\u043f\u0435\u043b\u043e. \u0420\u0430\u0434\u045a\u0430 - \u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u043a\u0430\u043e- \u0458\u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0443\u0442\u0430.
-locking_old_lock_removed=\u041c\u0430\u043f\u0430 {0} \u0458\u0435 \u0437\u0430\u043a\u0459\u0443\u0447\u0430\u043d\u0430 \u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u0435 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u0430 {1}. \u0417\u0430\u043a\u0459\u0443\u0447\u0430\u0432\u0430\u045a\u0435 \u043c\u0430\u043f\u0435 \u0458\u0435 \u0443\u043a\u043b\u043e\u045a\u0435\u043d\u043e, \u0458\u0435\u0440 \u0458\u0435 \u043c\u0430\u043f\u0430 \u0441\u0442\u0430\u0440\u0438\u0458\u0430.
-long_node_changed_cancel=\u041f\u0440\u043e\u043c\u0435\u043d\u0438\u043b\u0438 \u0441\u0442\u0435 \u0447\u0432\u043e\u0440. \u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u043e\u0434\u0431\u0430\u0446\u0438\u0442\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0435?
-long_node_changed_submit=\u041f\u0440\u043e\u043c\u0435\u043d\u0438\u043b\u0438 \u0441\u0442\u0435 \u0447\u0432\u043e\u0440. \u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0435?
-lots_of_links_warning=\u041d\u0430\u043f\u0440\u0430\u0432\u0438\u045b\u0435\u0442\u0435 \u043f\u0440\u0435\u0432\u0438\u0448\u0435 \u0432\u0435\u0437\u0430 \u043d\u0430 \u0438\u0441\u0442\u043e\u043c \u0447\u0432\u043e\u0440\u0443. \u0417\u0430\u0438\u0441\u0442\u0430 \u0436\u0435\u043b\u0438\u0442\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u0438 \u0442\u043e\u043b\u0438\u043a\u043e \u0432\u0435\u0437\u0430?
-main_resource_directory=\u041c\u0435\u0441\u0442\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u0458\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430: {0}
-MainView.errorUpdateText=\u0413\u0440\u0435\u0448\u043a\u0430 \u0443 \u043f\u043e\u0441\u0442\u0430\u0432\u0459\u0430\u043d\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 \u0437\u0430 \u0441\u043b\u0435\u0434\u0435\u045b\u0438 \u0443\u043d\u043e\u0441: {0}.\n\u0413\u0440\u0435\u0448\u043a\u0430 \u0458\u0435: {1}
-MakeLinkFromAnchorAction.text=\u041d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u0432\u0435\u0437\u0443 \u0441\u0430 \u0441\u0438\u0434\u0440\u043e\u043c
-MakeLinkFromAnchorAction.tooltip=<html>\u043d\u0430\u043f\u0440\u0430\u0432\u0438 \u043b\u043e\u043a\u0430\u043b\u043d\u0443 \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u043d\u0443 \u0432\u0435\u0437\u0443 \u043e\u0434<br/>\u0441\u0438\u0434\u0440\u0430 \u0447\u0432\u043e\u0440\u0430 \u0434\u043e \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430</html>
-MakeLinkToAnchorAction.text=\u041d\u0430\u043f\u0440\u0430\u0432\u0438 \u0432\u0435\u0437\u0443 \u0434\u043e \u0441\u0438\u0434\u0440\u0430
-MakeLinkToAnchorAction.tooltip=<html>\u043d\u0430\u043f\u0440\u0430\u0432\u0438 \u043b\u043e\u043a\u0430\u043b\u043d\u0443 \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u043d\u0443 \u0432\u0435\u0437\u0443 \u043e\u0434<br/>\u0438\u0437\u0430\u0431\u0440\u0430\u043d\u0435 \u0431\u0435\u043b\u0435\u0448\u043a\u0435 \u0434\u043e \u0441\u0438\u0434\u0440\u0430 \u0447\u0432\u043e\u0440\u0430</html>
-ManageAddOnsAction.text=\u0414\u043e\u0434\u0430\u0446\u0438
-ManageAddOnsDialog.activate=\u0423\u043a\u0459\u0443\u0447\u0438
-ManageAddOnsDialog.activation.success={0} \u045b\u0435 \u0441\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u0442\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043d\u043e\u0432\u043d\u043e\u0433 \u043f\u043e\u043a\u0440\u0435\u0442\u0430\u045a\u0430.
-ManageAddOnsDialog.authored.by=\u043e\u0434 {0}
-ManageAddOnsDialog.cannot.activate=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u0442\u0438: {0} \u0432\u0435\u045b \u0458\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u043d.
-ManageAddOnsDialog.cannot.configure=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u043f\u043e\u0434\u0435\u0441\u0438\u0442\u0438 {0}.
-ManageAddOnsDialog.cannot.deactivate=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u043e\u0431\u0443\u0441\u0442\u0430\u0432\u0438\u0442\u0438: {0} \u043d\u0438\u0458\u0435 \u0430\u043a\u0442\u0438\u0432\u0430\u043d.
-ManageAddOnsDialog.cannot.deinstall=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u0434\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0442\u0438 {0}.
-ManageAddOnsDialog.configure=\u041f\u043e\u0434\u0435\u0441\u0438
-ManageAddOnsDialog.deactivate=\u041e\u0431\u0443\u0441\u0442\u0430\u0432\u0438
-ManageAddOnsDialog.deactivation.success={0} \u045b\u0435 \u0431\u0438\u0442\u0438 \u043e\u0431\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043d \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043d\u043e\u0432\u043d\u043e\u0433 \u043f\u043e\u043a\u0440\u0435\u0442\u0430\u045a\u0430.
-ManageAddOnsDialog.deinstall=\u0423\u043a\u043b\u043e\u043d\u0438
-ManageAddOnsDialog.deinstallation.success={0} \u045b\u0435 \u0431\u0438\u0442\u0438 \u0443\u043a\u043b\u043e\u045a\u0435\u043d \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043d\u043e\u0432\u043d\u043e\u0433 \u043f\u043e\u043a\u0440\u0435\u0442\u0430\u045a\u0430.
-ManageAddOnsDialog.error=\u0413\u0440\u0435\u0448\u043a\u0430 \u0443 \u0438\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u0458\u0438: {0}.
-ManageAddOnsDialog.install=&\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0458
-ManageAddOnsDialog.install.from.known.location=\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u043e\u0434\u0430\u0442\u0430\u043a \u0441\u0430 \u043f\u043e\u0437\u043d\u0430\u0442\u0435 \u043b\u043e\u043a\u0430\u0446\u0438\u0458\u0435
-ManageAddOnsDialog.install.tooltip=\u041e\u0432\u0434\u0435 \u0443\u043c\u0435\u0442\u043d\u0438 \u0423\u0420\u041b \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435 \u0434\u043e\u0434\u0430\u0442\u043a\u0430 \u0437\u0430 \u0438\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u0458\u0443
-ManageAddOnsDialog.map.not.opened=\u041c\u0430\u043f\u0430 {0} \u0438\u0437\u0433\u043b\u0435\u0434\u0430 \u043d\u0438\u0458\u0435 \u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0430.
-ManageAddOnsDialog.really.deinstall=\u0416\u0435\u043b\u0438\u0442\u0435 \u0443\u043a\u043b\u043e\u043d\u0438\u0442\u0438 {0}?
-ManageAddOnsDialog.search=\u0422\u0440\u0430\u0436\u0438 \u0434\u043e\u0434\u0430\u0442\u043a\u0435
+LoadAcceleratorPresetsAction.textPatterns.text=\u0428\u0430\u0431\u043B\u043E\u043D \u0442\u0435\u043A\u0441\u0442\u0430
+locking_failed_by_open=\u0417\u0430\u043A\u0459\u0443\u0447\u0430\u0432\u0430\u045A\u0435 \u043C\u0430\u043F\u0435 {0} \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E. \u041E\u0442\u0432\u0430\u0440\u0430\u045A\u0435 \u0441\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435.
+locking_failed_by_save_as=\u0417\u0430\u043A\u0459\u0443\u0447\u0430\u0432\u0430\u045A\u0435 \u043C\u0430\u043F\u0435 {0} \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E. \u0420\u0430\u0434\u045A\u0430 - \u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u043A\u0430\u043E- \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u0430.
+locking_old_lock_removed=\u041C\u0430\u043F\u0430 {0} \u0458\u0435 \u0437\u0430\u043A\u0459\u0443\u0447\u0430\u043D\u0430 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 {1}. \u0417\u0430\u043A\u0459\u0443\u0447\u0430\u0432\u0430\u045A\u0435 \u043C\u0430\u043F\u0435 \u0458\u0435 \u0443\u043A\u043B\u043E\u045A\u0435\u043D\u043E, \u0458\u0435\u0440 \u0458\u0435 \u043C\u0430\u043F\u0430 \u0441\u0442\u0430\u0440\u0438\u0458\u0430.
+long_node_changed_cancel=\u041F\u0440\u043E\u043C\u0435\u043D\u0438\u043B\u0438 \u0441\u0442\u0435 \u0447\u0432\u043E\u0440. \u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u043E\u0434\u0431\u0430\u0446\u0438\u0442\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0435?
+long_node_changed_submit=\u041F\u0440\u043E\u043C\u0435\u043D\u0438\u043B\u0438 \u0441\u0442\u0435 \u0447\u0432\u043E\u0440. \u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0435?
+lots_of_links_warning=\u041D\u0430\u043F\u0440\u0430\u0432\u0438\u045B\u0435\u0442\u0435 \u043F\u0440\u0435\u0432\u0438\u0448\u0435 \u0432\u0435\u0437\u0430 \u043D\u0430 \u0438\u0441\u0442\u043E\u043C \u0447\u0432\u043E\u0440\u0443. \u0417\u0430\u0438\u0441\u0442\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0438 \u0442\u043E\u043B\u0438\u043A\u043E \u0432\u0435\u0437\u0430?
+main_resource_directory=\u041C\u0435\u0441\u0442\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430: {0}
+MainView.errorUpdateText=\u0413\u0440\u0435\u0448\u043A\u0430 \u0443 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u043D\u0443 \u0442\u0435\u043A\u0441\u0442\u0430 \u0437\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0438 \u0443\u043D\u043E\u0441: {0}.\n\u0413\u0440\u0435\u0448\u043A\u0430 \u0458\u0435: {1}
+MakeLinkFromAnchorAction.text=\u041D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0435 \u0432\u0435\u0437\u0443 \u0441\u0430 \u0441\u0438\u0434\u0440\u043E\u043C
+MakeLinkFromAnchorAction.tooltip=<html>\u043D\u0430\u043F\u0440\u0430\u0432\u0438 \u043B\u043E\u043A\u0430\u043B\u043D\u0443 \u0438\u043B\u0438 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0443 \u0432\u0435\u0437\u0443 \u043E\u0434<br/>\u0441\u0438\u0434\u0440\u0430 \u0447\u0432\u043E\u0440\u0430 \u0434\u043E \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430</html>
+MakeLinkToAnchorAction.text=\u041D\u0430\u043F\u0440\u0430\u0432\u0438 \u0432\u0435\u0437\u0443 \u0434\u043E \u0441\u0438\u0434\u0440\u0430
+MakeLinkToAnchorAction.tooltip=<html>\u043D\u0430\u043F\u0440\u0430\u0432\u0438 \u043B\u043E\u043A\u0430\u043B\u043D\u0443 \u0438\u043B\u0438 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0443 \u0432\u0435\u0437\u0443 \u043E\u0434<br/>\u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0435 \u0431\u0435\u043B\u0435\u0448\u043A\u0435 \u0434\u043E \u0441\u0438\u0434\u0440\u0430 \u0447\u0432\u043E\u0440\u0430</html>
+ManageAddOnsAction.text=\u0414\u043E\u0434\u0430\u0446\u0438
+ManageAddOnsDialog.activate=\u0423\u043A\u0459\u0443\u0447\u0438
+ManageAddOnsDialog.activation.success={0} \u045B\u0435 \u0441\u0435 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0430\u0442\u0438 \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043D\u043E\u0432\u043D\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430.
+ManageAddOnsDialog.authored.by=\u043E\u0434 {0}
+ManageAddOnsDialog.cannot.activate=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0430\u0442\u0438: {0} \u0432\u0435\u045B \u0458\u0435 \u0430\u043A\u0442\u0438\u0432\u0430\u043D.
+ManageAddOnsDialog.cannot.configure=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u043E\u0434\u0435\u0441\u0438\u0442\u0438 {0}.
+ManageAddOnsDialog.cannot.deactivate=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043E\u0431\u0443\u0441\u0442\u0430\u0432\u0438\u0442\u0438: {0} \u043D\u0438\u0458\u0435 \u0430\u043A\u0442\u0438\u0432\u0430\u043D.
+ManageAddOnsDialog.cannot.deinstall=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0434\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0438 {0}.
+ManageAddOnsDialog.configure=\u041F\u043E\u0434\u0435\u0441\u0438
+ManageAddOnsDialog.deactivate=\u041E\u0431\u0443\u0441\u0442\u0430\u0432\u0438
+ManageAddOnsDialog.deactivation.success={0} \u045B\u0435 \u0431\u0438\u0442\u0438 \u043E\u0431\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043D\u043E\u0432\u043D\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430.
+ManageAddOnsDialog.deinstall=\u0423\u043A\u043B\u043E\u043D\u0438
+ManageAddOnsDialog.deinstallation.success={0} \u045B\u0435 \u0431\u0438\u0442\u0438 \u0443\u043A\u043B\u043E\u045A\u0435\u043D \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043D\u043E\u0432\u043D\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430.
+ManageAddOnsDialog.error=\u0413\u0440\u0435\u0448\u043A\u0430 \u0443 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0438: {0}.
+ManageAddOnsDialog.install=&\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458
+ManageAddOnsDialog.install.from.known.location=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u043F\u043E\u0437\u043D\u0430\u0442\u0435 \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0435
+ManageAddOnsDialog.install.tooltip=\u041E\u0432\u0434\u0435 \u0443\u043C\u0435\u0442\u043D\u0438 \u0423\u0420\u041B \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0434\u043E\u0434\u0430\u0442\u043A\u0430 \u0437\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443
+ManageAddOnsDialog.map.not.opened=\u041C\u0430\u043F\u0430 {0} \u0438\u0437\u0433\u043B\u0435\u0434\u0430 \u043D\u0438\u0458\u0435 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0430.
+ManageAddOnsDialog.really.deinstall=\u0416\u0435\u043B\u0438\u0442\u0435 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0438 {0}?
+ManageAddOnsDialog.search=\u0422\u0440\u0430\u0436\u0438 \u0434\u043E\u0434\u0430\u0442\u043A\u0435
ManageAddOnsDialog.search.file=\u0422\u0440\u0430\u0436\u0438
-ManageAddOnsDialog.select.tooltip=\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443
-ManageAddOnsDialog.status.downloading=\u041f\u0440\u0435\u0443\u0437\u0438\u043c\u0430\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435...
-ManageAddOnsDialog.status.installing=\u0418\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u0458\u0430 \u0434\u043e\u0434\u0430\u0442\u043a\u0430...
-ManageAddOnsDialog.status.success=\u0423\u0441\u043f\u0435\u0448\u043d\u0430 \u0438\u043d\u0441\u0442\u0430\u043b\u0430\u0446\u0438\u0458\u0430 {0}.
-ManageAddOnsDialog.tab.install=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0458
-ManageAddOnsDialog.tab.install.tooltip=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0458 \u043d\u043e\u0432\u0435 \u0434\u043e\u0434\u0430\u0442\u043a\u0435
-ManageAddOnsDialog.tab.manage=\u0414\u043e\u0434\u0430\u0446\u0438
-ManageAddOnsDialog.tab.manage.themes=\u0422\u0435\u043c\u0435
-ManageAddOnsDialog.tab.manage.themes.tooltip=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0438\u043c \u0442\u0435\u043c\u0430\u043c\u0430
-ManageAddOnsDialog.tab.manage.tooltip=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0438\u043c \u0434\u043e\u0434\u0430\u0446\u0438\u043c\u0430
-ManageAddOnsDialog.visit.addon.page=\u041f\u043e\u0441\u0435\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0434\u043e\u0434\u0430\u0442\u0430\u043a\u0430...
-ManageConditionalStylesAction.text=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0444\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u043d\u0438\u043c \u0441\u0442\u0438\u043b\u043e\u0432\u0438\u043c\u0430
-ManageNodeConditionalStylesAction.text=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0443\u0441\u043b\u043e\u0432\u043d\u0438\u0445 \u0441\u0442\u0438\u043b\u043e\u0432\u0430 \u0447\u0432\u043e\u0440\u0430
-map_already_exists=\u041c\u0430\u043f\u0430 \u0432\u0435\u045b \u043f\u043e\u0441\u0442\u043e\u0458\u0438. \u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0458\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0438?
-map_corrupted=\u041c\u0430\u043f\u0430 \u0458\u0435 \u043e\u0448\u0442\u0435\u045b\u0435\u043d\u0430. \u041f\u0440\u0438\u043a\u0430\u0437 \u0434\u0435\u0442\u0430\u0459\u0430?
-map_load_error=\u041d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u043c\u0430\u043f\u0443 {0}
-map_locked_by_open=\u041c\u0430\u043f\u0430 {0} \u0441\u0435 \u0443\u0440\u0435\u0452\u0443\u0458\u0435 \u043a\u043e\u0434 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u0430 {1}. \u041e\u0442\u0432\u0430\u0440\u0430\u045a\u0435 \u0441\u0430\u043c\u043e \u0437\u0430 \u0447\u0438\u0442\u0430\u045a\u0435.
-map_locked_by_save_as=\u041c\u0430\u043f\u0430 {0} \u0441\u0435 \u0443\u0440\u0435\u0452\u0443\u0458\u0435 \u043e\u0434 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u0430 {1}. \u0420\u0430\u0434\u045a\u0430 - \u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u043a\u0430\u043e - \u0458\u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0443\u0442\u0430.
-map_not_saved=\u041c\u0430\u043f\u0430 \u043d\u0438\u0458\u0435 \u0440\u0430\u043d\u0438\u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0430.
-MapBackgroundColorAction.text=\u0411\u043e\u0458\u0430 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0435 \u043c\u0430\u043f\u0435
-MaxNodeWidth.text=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043d\u0430\u0458\u0432. \u0448\u0438\u0440\u0438\u043d\u0443 \u0447\u0432\u043e\u0440\u0430
-MaxNodeWidthAction.text=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043d\u0430\u0458\u0432\u0435\u045b\u0443 \u0448\u0438\u0440\u0438\u043d\u0443 \u0447\u0432\u043e\u0440\u0430
-menu_applyStyle=\u041f\u0440\u0438\u043c\u0435\u043d\u0438 \u0441\u0442\u0438\u043b
-menu_attributes=\u041e\u0431\u0435&\u043b\u0435\u0436\u0458\u0430
-menu_clouds=\u041e\u0431\u043b\u0430\u0447\u0438\u045b\u0438
-menu_copy=\u0423\u043c\u043d\u043e\u0436\u0438
-menu_coreFormat=\u0408\u0435\u0437\u0433\u0440\u043e \u0447\u0432\u043e\u0440\u0430
+ManageAddOnsDialog.select.tooltip=\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443
+ManageAddOnsDialog.status.downloading=\u041F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435...
+ManageAddOnsDialog.status.installing=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0434\u043E\u0434\u0430\u0442\u043A\u0430...
+ManageAddOnsDialog.status.success=\u0423\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 {0}.
+ManageAddOnsDialog.tab.install=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458
+ManageAddOnsDialog.tab.install.tooltip=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u043D\u043E\u0432\u0435 \u0434\u043E\u0434\u0430\u0442\u043A\u0435
+ManageAddOnsDialog.tab.manage=\u0414\u043E\u0434\u0430\u0446\u0438
+ManageAddOnsDialog.tab.manage.themes=\u0422\u0435\u043C\u0435
+ManageAddOnsDialog.tab.manage.themes.tooltip=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438\u043C \u0442\u0435\u043C\u0430\u043C\u0430
+ManageAddOnsDialog.tab.manage.tooltip=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438\u043C \u0434\u043E\u0434\u0430\u0446\u0438\u043C\u0430
+ManageAddOnsDialog.visit.addon.page=\u041F\u043E\u0441\u0435\u0442\u0438 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0434\u043E\u0434\u0430\u0442\u0430\u043A\u0430...
+ManageConditionalStylesAction.text=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u043D\u0438\u043C \u0441\u0442\u0438\u043B\u043E\u0432\u0438\u043C\u0430
+ManageNodeConditionalStylesAction.text=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0443\u0441\u043B\u043E\u0432\u043D\u0438\u0445 \u0441\u0442\u0438\u043B\u043E\u0432\u0430 \u0447\u0432\u043E\u0440\u0430
+map_already_exists=\u041C\u0430\u043F\u0430 \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438. \u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u0458\u0435 \u0437\u0430\u043C\u0435\u043D\u0438\u0442\u0438?
+map_corrupted=\u041C\u0430\u043F\u0430 \u0458\u0435 \u043E\u0448\u0442\u0435\u045B\u0435\u043D\u0430. \u041F\u0440\u0438\u043A\u0430\u0437 \u0434\u0435\u0442\u0430\u0459\u0430?
+map_load_error=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u043C\u0430\u043F\u0443 {0}
+map_locked_by_open=\u041C\u0430\u043F\u0430 {0} \u0441\u0435 \u0443\u0440\u0435\u0452\u0443\u0458\u0435 \u043A\u043E\u0434 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 {1}. \u041E\u0442\u0432\u0430\u0440\u0430\u045A\u0435 \u0441\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435.
+map_locked_by_save_as=\u041C\u0430\u043F\u0430 {0} \u0441\u0435 \u0443\u0440\u0435\u0452\u0443\u0458\u0435 \u043E\u0434 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 {1}. \u0420\u0430\u0434\u045A\u0430 - \u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u043A\u0430\u043E - \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u0430.
+map_not_saved=\u041C\u0430\u043F\u0430 \u043D\u0438\u0458\u0435 \u0440\u0430\u043D\u0438\u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430.
+MapBackgroundColorAction.text=\u0411\u043E\u0458\u0430 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0435 \u043C\u0430\u043F\u0435
+MaxNodeWidth.text=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043D\u0430\u0458\u0432. \u0448\u0438\u0440\u0438\u043D\u0443 \u0447\u0432\u043E\u0440\u0430
+MaxNodeWidthAction.text=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043D\u0430\u0458\u0432\u0435\u045B\u0443 \u0448\u0438\u0440\u0438\u043D\u0443 \u0447\u0432\u043E\u0440\u0430
+menu_applyStyle=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 \u0441\u0442\u0438\u043B
+menu_attributes=\u041E\u0431\u0435&\u043B\u0435\u0436\u0458\u0430
+menu_clouds=\u041E\u0431\u043B\u0430\u0447\u0438\u045B\u0438
+menu_copy=\u0423\u043C\u043D\u043E\u0436\u0438
+menu_coreFormat=\u0408\u0435\u0437\u0433\u0440\u043E \u0447\u0432\u043E\u0440\u0430
menu_details=\u0414\u0435\u0442\u0430\u0459\u0438
-menu_displayAttributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0447\u0432\u043e\u0440\u0430
-menu_encryption=\u0417\u0430\u0448\u0442\u0438\u0442\u0430 \u043b\u043e\u0437\u0438\u043d\u043a\u043e\u043c
-menu_error=\u0413\u0440\u0435\u0448\u043a\u0430 \u0443 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0438 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0458 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0430 {0}:\n{1}\n\u041f\u0440\u0435\u043a\u0438\u0434\u0430\u043c
-menu_extensions=\u041f\u0440\u043e\u0448\u0438\u0440\u0435\u045a\u0430 \u0447\u0432\u043e\u0440\u0430
-menu_extras=&\u0410\u043b\u0430\u0442\u043a\u0435
-menu_file_import=\u0423&\u0432\u043e\u0437
-menu_filter=\u0424&\u0438\u043b\u0442\u0435\u0440
-menu_format=\u041e&\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u045a\u0435
-menu_group=\u0421\u043a\u0443\u043f \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-menu_hoverView=\u0410\u043b\u0430\u0442\u043a\u0430 \u0441\u0430\u0432\u0435\u0442\u0430
-menu_iconByCategory=\u0418\u043a\u043e\u043d\u0435 \u043f\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0458\u0430\u043c\u0430...
-menu_iconView=\u0418\u043a\u043e\u043d\u0435
-menu_image=\u0421\u043b\u0438\u043a\u0430
-menu_insert=\u0423\u043c&\u0435\u0442\u043d\u0438
-menu_latex_formula=LaTeX \u0444\u043e\u0440\u043c\u0443\u043b\u0430
-menu_links=\u0412\u0435\u0437\u0435
-menu_manageStyles=&\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0441\u0442\u0438\u043b\u043e\u0432\u0438\u043c\u0430
-menu_moveNode=\u041f\u0440\u0435\u043c\u0435\u0441\u0442\u0438 \u0438 \u0440\u0430\u0437\u0432\u0440\u0441\u0442\u0430\u0458
-menu_navigate=&\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0458\u0430
-menu_newNode=\u041d\u043e\u0432\u0438 \u0447\u0432\u043e\u0440
-menu_node=\u0427\u0432\u043e\u0440
-menu_node_features=\u041a\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0435 &\u0447\u0432\u043e\u0440\u0430
-menu_nodes=&\u0427\u0432\u043e\u0440\u043e\u0432\u0438
-menu_nodeView=\u0408\u0435\u0437\u0433\u0440\u043e \u0447\u0432\u043e\u0440\u0430
-menu_notes=\u0411\u0435\u043b\u0435\u0448\u043a\u0430
-menu_noteView=\u0411\u0435\u043b\u0435\u0448\u043a\u0435
-menu_progress=\u041d\u0430\u043f\u0440\u0435\u0434\u0430\u043a \u0438\u043a\u043e\u043d\u0430 (%)
-menu_remove_icons=\u0423\u043a\u043b\u043e\u043d\u0438 \u0438\u043a\u043e\u043d\u0435
-menu_removeAttribute=\u0423\u043a\u043b\u043e\u043d\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
+menu_displayAttributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0447\u0432\u043E\u0440\u0430
+menu_encryption=\u0417\u0430\u0448\u0442\u0438\u0442\u0430 \u043B\u043E\u0437\u0438\u043D\u043A\u043E\u043C
+menu_error=\u0413\u0440\u0435\u0448\u043A\u0430 \u0443 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0458 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0438 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0430 {0}:\n{1}\n\u041F\u0440\u0435\u043A\u0438\u0434\u0430\u043C
+menu_extensions=\u041F\u0440\u043E\u0448\u0438\u0440\u0435\u045A\u0430 \u0447\u0432\u043E\u0440\u0430
+menu_group=\u0421\u043A\u0443\u043F \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+menu_hoverView=\u0410\u043B\u0430\u0442\u043A\u0430 \u0441\u0430\u0432\u0435\u0442\u0430
+menu_iconByCategory=\u0418\u043A\u043E\u043D\u0435 \u043F\u043E \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0458\u0430\u043C\u0430...
+menu_iconView=\u0418\u043A\u043E\u043D\u0435
+menu_image=\u0421\u043B\u0438\u043A\u0430
+menu_insert=\u0423\u043C&\u0435\u0442\u043D\u0438
+menu_latex_formula=LaTeX \u0444\u043E\u0440\u043C\u0443\u043B\u0430
+menu_manageStyles=&\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0441\u0442\u0438\u043B\u043E\u0432\u0438\u043C\u0430
+menu_moveNode=\u041F\u0440\u0435\u043C\u0435\u0441\u0442\u0438 \u0438 \u0440\u0430\u0437\u0432\u0440\u0441\u0442\u0430\u0458
+menu_newNode=\u041D\u043E\u0432\u0438 \u0447\u0432\u043E\u0440
+menu_node=\u0427\u0432\u043E\u0440
+menu_node_features=\u041A\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043A\u0435 &\u0447\u0432\u043E\u0440\u0430
+menu_nodes=&\u0427\u0432\u043E\u0440\u043E\u0432\u0438
+menu_nodeView=\u0408\u0435\u0437\u0433\u0440\u043E \u0447\u0432\u043E\u0440\u0430
+menu_noteView=\u0411\u0435\u043B\u0435\u0448\u043A\u0435
+menu_remove_icons=\u0423\u043A\u043B\u043E\u043D\u0438 \u0438\u043A\u043E\u043D\u0435
+menu_removeAttribute=\u0423\u043A\u043B\u043E\u043D\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
menu_select=\u0418\u0437\u0430\u0431\u0435\u0440\u0438
-menu_time=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043e\u043c
-menu_title=\u0408\u0435\u0437\u0433\u0440\u043e \u0447\u0432\u043e\u0440\u0430
-menu_toolbars=\u0422\u0440\u0430\u043a\u0435 \u0441\u0430 \u0430\u043b\u0430\u0442\u043a\u0430\u043c\u0430
-menu_view=&\u041f\u0440\u0438\u043a\u0430\u0437
-menu_viewmode=\u041f\u0440\u0438\u043a\u0430\u0437 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438
-MenuReferenceAction.text=\u0421\u0442\u0430\u0432\u043a\u0435 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0430
-MenuUtils.invalid_menuitem={0} \u043d\u0438\u0458\u0435 \u0432\u0430\u0459\u0430\u043d\u0430 \u0441\u0442\u0430\u0432\u043a\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0430 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0430.
-mindmap=\u041c\u0430\u043f\u0430
-MindMapNodesFlavorHandler=\u0425\u0438\u0458\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0430 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-mindmaps=& \u041c\u0430\u043f\u0435
-mindmaps_desc=\u041c\u0430\u043f\u0435 (*.mm)
-mindmaps_filter_desc=\u0424\u0438\u043b\u0442\u0435\u0440\u0438 (*.mmfilter)
-MinNodeWidth.text=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043d\u0430\u0458\u043c. \u0448\u0438\u0440\u0438\u043d\u0443 \u0447\u0432\u043e\u0440\u0430
-mode_Browse=\u0420\u0435\u0436\u0438\u043c \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u0430
-mode_File=\u0420\u0435\u0436\u0438\u043c \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-mode_MindMap=\u0420\u0435\u0436\u0438\u043c \u043c\u0430\u043f\u0430 \u0443\u043c\u0430
-mode_na=\u0420\u0435\u0436\u0438\u043c \u043d\u0438\u0458\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430\u043d
-mode_status=\u0420\u0435\u0436\u0438\u043c \u0458\u0435 \u043f\u0440\u043e\u043c\u0435\u045a\u0435\u043d \u0443 {0}
+menu_time=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u043E\u043C
+menu_title=\u0408\u0435\u0437\u0433\u0440\u043E \u0447\u0432\u043E\u0440\u0430
+menu_viewmode=\u041F\u0440\u0438\u043A\u0430\u0437 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0438
+MenuReferenceAction.text=\u0421\u0442\u0430\u0432\u043A\u0435 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0430
+MenuUtils.invalid_menuitem={0} \u043D\u0438\u0458\u0435 \u0432\u0430\u0459\u0430\u043D\u0430 \u0441\u0442\u0430\u0432\u043A\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0430 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0430.
+mindmap=\u041C\u0430\u043F\u0430
+MindMapNodesFlavorHandler=\u0425\u0438\u0458\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0430 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+mindmaps=& \u041C\u0430\u043F\u0435
+mindmaps_desc=\u041C\u0430\u043F\u0435 (*.mm)
+mindmaps_filter_desc=\u0424\u0438\u043B\u0442\u0435\u0440\u0438 (*.mmfilter)
+MinNodeWidth.text=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043D\u0430\u0458\u043C. \u0448\u0438\u0440\u0438\u043D\u0443 \u0447\u0432\u043E\u0440\u0430
+mode_Browse=\u0420\u0435\u0436\u0438\u043C \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430
+mode_File=\u0420\u0435\u0436\u0438\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+mode_MindMap=\u0420\u0435\u0436\u0438\u043C \u043C\u0430\u043F\u0430 \u0443\u043C\u0430
+mode_na=\u0420\u0435\u0436\u0438\u043C \u043D\u0438\u0458\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0430\u043D
+mode_status=\u0420\u0435\u0436\u0438\u043C \u0458\u0435 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D \u0443 {0}
mode_title=Freeplane - {0}
-modes=\u0420\u0435\u0436\u0438\u043c\u0438
-ModesMenuAction.Browse.text=\u041f\u0440\u0435\u0433\u043b\u0435\u0434\u043d\u0438\u043a \u043c\u0430\u043f\u0430
-ModesMenuAction.File.text=\u0418\u0441\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u0447 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-ModesMenuAction.MindMap.text=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u043c\u0430\u043f\u0430 \u0443\u043c\u0430
-most_recent_files=\u041d\u0435&\u0434\u0430\u0432\u043d\u043e \u043e\u0442\u0432\u0430\u0440\u0430\u043d\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435
-MoveToRootAction.text=\u0418\u0434\u0438 \u043d\u0430 \u0438\u0437\u0432\u043e\u0440\u043d\u0438 \u0447\u0432\u043e\u0440
-NameConditionAction.text=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043d\u0430\u0437\u0438\u0432
-NavigationNextMapAction.text=\u0421\u043b\u0435\u0434\u0435\u045b\u0430 \u043c\u0430\u043f\u0430
-NavigationPreviousMapAction.text=\u041f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u0430 \u043c\u0430\u043f\u0430
-new=&\u041d\u043e\u0432\u0430
-new_map_from_user_templates.text=\u041d\u043e\u0432\u0430 \u043c\u0430\u043f\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430...
-new_mindmap=\u041d\u043e\u0432\u0430 \u043c\u0430\u043f\u0430 \u0443\u043c\u0430
-new_node=\u041d\u043e\u0432\u0438 \u0447\u0432\u043e\u0440
-new_node_as_sibling_not_possible_for_the_root=\u041d\u043e\u0432\u0438 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u0438 \u0447\u0432\u043e\u0440, \u043d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u0438 \u043a\u0430\u043e \u0438\u0437\u0432\u043e\u0440\u043d\u0438.
-new_version_available=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0458\u0435 \u043d\u043e\u0432\u043e \u0438\u0437\u0434\u0430\u045a\u0435 ''{0}'' \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430
-NewChildAction.text=\u041d\u043e\u0432\u0438 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u0447\u0432\u043e\u0440
-NewerFileRevisionsFoundDialog.cancel=&\u041f\u0440\u0435\u0441\u043a\u043e\u0447\u0438
-NewerFileRevisionsFoundDialog.cancel.tooltip=\u041d\u0435 \u043e\u0442\u0432\u0430\u0440\u0430\u0458 \u043e\u0432\u0443 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443
-NewerFileRevisionsFoundDialog.file_last_modified=\u041e\u0437\u043d\u0430\u043a\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0430
-NewerFileRevisionsFoundDialog.file_name=\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-NewerFileRevisionsFoundDialog.file_size=\u0411\u0430\u0458\u0442\u043e\u0432\u0430
-NewerFileRevisionsFoundDialog.open=&\u041e\u0442\u0432\u043e\u0440\u0438
-NewerFileRevisionsFoundDialog.open.tooltip=\u041e\u0442\u0432\u043e\u0440\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443 \u0447\u0430\u043a \u0438\u0430\u043a\u043e \u0458\u0435 \u0437\u0430\u0441\u0442\u0430\u0440\u0435\u043b\u0430.
-NewerFileRevisionsFoundDialog.question=\u041f\u0440\u043e\u043d\u0430\u0452\u0435\u043d\u0430 \u0458\u0435 \u043d\u043e\u0432\u0438\u0458\u0430 \u043f\u043e\u0431\u043e\u0459\u0448\u0430\u043d\u0430 \u0437\u0430 {0}!
+modes=\u0420\u0435\u0436\u0438\u043C\u0438
+ModesMenuAction.Browse.text=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u043D\u0438\u043A \u043C\u0430\u043F\u0430
+ModesMenuAction.File.text=\u0418\u0441\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u0447 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+ModesMenuAction.MindMap.text=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u043C\u0430\u043F\u0430 \u0443\u043C\u0430
+most_recent_files=\u041D\u0435&\u0434\u0430\u0432\u043D\u043E \u043E\u0442\u0432\u0430\u0440\u0430\u043D\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435
+MoveToRootAction.text=\u0418\u0434\u0438 \u043D\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u0438 \u0447\u0432\u043E\u0440
+NameConditionAction.text=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043D\u0430\u0437\u0438\u0432
+navigate=&\u041D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0458\u0430
+NavigationNextMapAction.text=\u0421\u043B\u0435\u0434\u0435\u045B\u0430 \u043C\u0430\u043F\u0430
+NavigationPreviousMapAction.text=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0430 \u043C\u0430\u043F\u0430
+new=&\u041D\u043E\u0432\u0430
+new_map_from_user_templates.text=\u041D\u043E\u0432\u0430 \u043C\u0430\u043F\u0430 \u0438\u0437 \u0448\u0430\u0431\u043B\u043E\u043D\u0430...
+new_mindmap=\u041D\u043E\u0432\u0430 \u043C\u0430\u043F\u0430 \u0443\u043C\u0430
+new_node=\u041D\u043E\u0432\u0438 \u0447\u0432\u043E\u0440
+new_node_as_sibling_not_possible_for_the_root=\u041D\u043E\u0432\u0438 \u0440\u0430\u0432\u043D\u043E\u043F\u0440\u0430\u0432\u043D\u0438 \u0447\u0432\u043E\u0440, \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0438 \u043A\u0430\u043E \u0438\u0437\u0432\u043E\u0440\u043D\u0438.
+new_version_available=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0458\u0435 \u043D\u043E\u0432\u043E \u0438\u0437\u0434\u0430\u045A\u0435 ''{0}'' \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430
+NewChildAction.text=\u041D\u043E\u0432\u0438 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u0447\u0432\u043E\u0440
+NewerFileRevisionsFoundDialog.cancel=&\u041F\u0440\u0435\u0441\u043A\u043E\u0447\u0438
+NewerFileRevisionsFoundDialog.cancel.tooltip=\u041D\u0435 \u043E\u0442\u0432\u0430\u0440\u0430\u0458 \u043E\u0432\u0443 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443
+NewerFileRevisionsFoundDialog.file_last_modified=\u041E\u0437\u043D\u0430\u043A\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0430
+NewerFileRevisionsFoundDialog.file_name=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+NewerFileRevisionsFoundDialog.file_size=\u0411\u0430\u0458\u0442\u043E\u0432\u0430
+NewerFileRevisionsFoundDialog.open=&\u041E\u0442\u0432\u043E\u0440\u0438
+NewerFileRevisionsFoundDialog.open.tooltip=\u041E\u0442\u0432\u043E\u0440\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0447\u0430\u043A \u0438\u0430\u043A\u043E \u0458\u0435 \u0437\u0430\u0441\u0442\u0430\u0440\u0435\u043B\u0430.
+NewerFileRevisionsFoundDialog.question=\u041F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0430 \u0458\u0435 \u043D\u043E\u0432\u0438\u0458\u0430 \u043F\u043E\u0431\u043E\u0459\u0448\u0430\u043D\u0430 \u0437\u0430 {0}!
NewerFileRevisionsFoundDialog.restore=\u0412\u0440\u0430&\u0442\u0438
-NewerFileRevisionsFoundDialog.restore.tooltip=\u0417\u0430\u043c\u0435\u043d\u0438 {0} \u0441\u0430 {1}
-NewerFileRevisionsFoundDialog.title=\u041f\u0440\u043e\u043d\u0430\u0452\u0435\u043d\u043e \u0458\u0435 \u043d\u043e\u0432\u043e \u0438\u0437\u0434\u0430\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435!
-NewFreeNodeAction.text=\u041d\u043e\u0432\u0438 \u0441\u043b\u043e\u0431\u043e\u0434\u0430\u043d \u0447\u0432\u043e\u0440
-NewLevelStyleAction.text=\u0414\u043e\u0434\u0430\u0458 \u0441\u0442\u0438\u043b \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e\u0433 \u043d\u0438\u0432\u043e\u0430
-newmap.install.addon.question={0} \u0438\u0437\u0433\u043b\u0435\u0434\u0430 \u043a\u0430\u043e \u043f\u0430\u043a\u0435\u0442 \u0434\u043e\u0434\u0430\u0442\u043a\u0430\n\u0414\u0430 \u043b\u0438 \u0436\u0435\u043b\u0438\u0442\u0435 \u0434\u0430 \u0433\u0430 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0442\u0435?\n(\u0418\u0437\u0430\u0431\u0435\u0440\u0438 "\u041d\u0435" \u0437\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u043d\u043e \u043e\u0442\u0432\u0430\u0440\u0430\u045a [...]
-newmap.install.addon.title=\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0458 \u0434\u043e\u0434\u0430\u0442\u0430\u043a?
-NewMapAction.text=&\u041d\u043e\u0432\u0430 \u043c\u0430\u043f\u0430
-NewMapViewAction.text=\u041f\u0440\u0438\u043a\u0430\u0437 \u043d\u043e\u0432\u0435 \u043c\u0430\u043f\u0435
-NewParentNode.text=\u041d\u043e\u0432\u0438 \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u0447\u0432\u043e\u0440
-NewParentNode.tooltip=<html>\u0421\u0432\u0438 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0438 \u0434\u043e\u0434\u0435\u0459\u0435\u043d\u0438 \u0441\u0443 \u043d\u043e\u0432\u043e\u043c \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u043c \u0447\u0432\u043e\u0440\u0443.</html>
-NewPreviousSiblingAction.text=\u041d\u043e\u0432\u0438 \u043f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u0438 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u0438 \u0447\u0432\u043e\u0440
-NewSiblingAction.text=\u041d\u043e\u0432\u0438 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u043d\u0438 \u0447\u0432\u043e\u0440
-NewSummaryAction.text=\u041d\u043e\u0432\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434 \u0447\u0432\u043e\u0440\u0430
-NewUserStyleAction.text=\u041d\u043e\u0432\u0438 \u0441\u0442\u0438\u043b \u0438\u0437 \u0441\u0435\u043b\u0435\u043a\u0446\u0438\u0458\u0435
-NextNodeAction.BACK.text=\u041f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u0438 \u0447\u0432\u043e\u0440
-NextNodeAction.BACK_N_FOLD.text=\u0418\u0434\u0438 \u043d\u0430 \u043f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u0438 \u0447\u0432\u043e\u0440 (\u0441\u043a\u043b\u043e\u043f\u0459\u0435\u043d\u043e)
-NextNodeAction.FORWARD.text=\u0418\u0434\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0435\u045b\u0438 \u0447\u0432\u043e\u0440
-NextNodeAction.FORWARD_N_FOLD.text=\u0418\u0434\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0435\u045b\u0438 \u0447\u0432\u043e\u0440 (\u0441\u043a\u043b\u043e\u043f\u0459\u0435\u043d\u043e)
-NextPresentationItemAction.text=\u0420\u0430\u0437\u0432\u0438\u0458 \u0441\u043b\u0435\u0434\u0435\u045b\u0443 \u0441\u0442\u0430\u0432\u043a\u0443 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0458\u0435
-no=\u041d\u0435
-no_copy_attributes_before_paste_attributes=\u041d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043b\u0435\u043f\u0438\u0442\u0438 \u043e\u0431\u0435\u043b\u0435\u0436\u0458\u0435 \u0430\u043a\u043e \u0433\u0430 \u043f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u043e \u043d\u0438\u0441\u0442\u0435 \u0443\u043c\u043d\u043e\u0436\u0438\u043b\u0438.
-NO_FORMAT=\u0422\u0435\u043a\u0441\u0442
-no_format_copy_before_format_paste=\u041d\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043b\u0435\u043f\u0438\u0442\u0438 \u043e\u0431\u043b\u0438\u043a \u0430\u043a\u043e \u0433\u0430 \u043f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u043e \u043d\u0438\u0441\u0442\u0435 \u0443\u043c\u043d\u043e\u0436\u0438\u043b\u0438.
-no_found_from=<html>\u041d\u0438\u0458\u0435 <u>{0}</u> \u043f\u0440\u043e\u043d\u0430\u0452\u0435\u043d \u0443 "{1}".</html>
-no_more_found_from=<html>\u041d\u0435\u043c\u0430 \u0432\u0438\u0448\u0435 <u>{0}</u>\u043f\u0440\u043e\u043d\u0430\u0452\u0435\u043d\u0438\u0445 \u0443 "{1}".</htm>
-no_previous_find=\u041d\u0435\u043c\u0430 \u043f\u043e\u0434\u0430\u0442\u043a\u0430 \u0442\u0440\u0430\u0436\u0435\u045a\u0430.
-no_styles_found_in_map=\u041d\u0435\u043c\u0430 \u043f\u0440\u043e\u043d\u0430\u0452\u0435\u043d\u0438\u0445 \u0441\u0442\u0438\u043b\u043e\u0432\u0430 \u0443 \u043c\u0430\u043f\u0438
-node=\u0427\u0432\u043e\u0440
-node_changed_discard_changes=\u041f\u0440\u043e\u043c\u0435\u043d\u0438\u043b\u0438 \u0441\u0442\u0435 \u0447\u0432\u043e\u0440. \u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u043e\u0434\u0431\u0430\u0446\u0438\u0442\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0435?
-node_is_write_protected=\u0426\u0438\u0459\u043d\u0438 \u0447\u0432\u043e\u0440 \u0458\u0435 \u0437\u0430\u0448\u0442\u0438\u045b\u0435\u043d \u043e\u0434 \u043f\u0438\u0441\u0430\u045a\u0430.
-node_location_help=\u041f\u043e\u0432\u043b\u0430\u0447\u0435\u045a\u0435 \u043c\u0435\u045a\u0430 \u043f\u043e\u043b\u043e\u0436\u0430\u0458 \u0447\u0432\u043e\u0440\u0430, ctrl+\u043f\u043e\u0432\u043b\u0430\u0447\u0435\u045a\u0435 \u043c\u0435\u045a\u0430 \u0440\u0430\u0437\u043c\u0430\u043a, \u0434\u0432\u043e\u043a\u043b\u0438\u043a \u0438 ctrl+\u0434\u0432\u043e\u043a\u043b\u0438\u043a \u0432\u0440\u0430\u045b\u0430 \u0447\u0432\u043e\u0440 \u0443 \u043f\u0440\u0432\u043e\u0431\u04 [...]
-node_selector=\u0418\u0437\u0431\u043e\u0440 \u0447\u0432\u043e\u0440\u0430
-node_selector_message=\u0414\u0432\u043e\u0441\u0442\u0440\u0443\u043a\u0438 \u043a\u043b\u0438\u043a \u0437\u0430 \u0438\u0437\u0431\u043e\u0440 \u0447\u0432\u043e\u0440\u0430
-node_styles=\u0421\u0442\u0438\u043b\u043e\u0432\u0438 \u0447\u0432\u043e\u0440\u0430
-NodeBackgroundColorAction.text=&\u041f\u043e\u0437\u0430\u0434\u0438\u043d\u0441\u043a\u0430 \u0431\u043e\u0458\u0430 \u0447\u0432\u043e\u0440\u0430...
-NodeColorAction.text=\u0411\u043e\u0458\u0430 \u0447\u0432\u043e\u0440\u0430...
-NodeColorBlendAction.text=\u041f\u043e\u043c\u0435\u0448\u0430\u0458 \u0431\u043e\u0458\u0435
-NodeDownAction.text=\u041f\u043e\u043c\u0435\u0440\u0438 \u0447\u0432\u043e\u0440 (\u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u0430\u043d \u0434\u043e\u043b\u0435)
-NodeExtensions.EditNodeExtensions=\u0423\u0440\u0435\u0434\u0438 \u043f\u0440\u043e\u0448\u0438\u0440\u0435\u045a\u0430 \u0447\u0432\u043e\u0440\u0430
-NodeExtensions.RemoveNodeExtensions=\u0423\u043a\u043b\u043e\u043d\u0438 \u043f\u0440\u043e\u0448\u0438\u0440\u0435\u045a\u0430 \u0447\u0432\u043e\u0440\u0430
-NodeListAction.text=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438...
-NodeListAction.tooltip=\u041f\u043e\u043a\u0430\u0436\u0438 \u0441\u0432\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435 \u043a\u0430\u043e \u043f\u0440\u0435\u0442\u0440\u0430\u0436\u0438\u0432 \u043f\u043e\u043f\u0438\u0441 \u0441\u0430 \u0441\u0432\u043e\u0458\u0441\u0442\u0432\u0438\u043c\u0430 \u0444\u0438\u043b\u0442\u0440\u0430.
-NodeShapeAction.bubble.text=&\u041c\u0435\u0445\u0443\u0440\u0438\u045b
+NewerFileRevisionsFoundDialog.restore.tooltip=\u0417\u0430\u043C\u0435\u043D\u0438 {0} \u0441\u0430 {1}
+NewerFileRevisionsFoundDialog.title=\u041F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E \u0458\u0435 \u043D\u043E\u0432\u043E \u0438\u0437\u0434\u0430\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435!
+NewLevelStyleAction.text=\u0414\u043E\u0434\u0430\u0458 \u0441\u0442\u0438\u043B \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u043D\u043E\u0433 \u043D\u0438\u0432\u043E\u0430
+newmap.install.addon.question={0} \u0438\u0437\u0433\u043B\u0435\u0434\u0430 \u043A\u0430\u043E \u043F\u0430\u043A\u0435\u0442 \u0434\u043E\u0434\u0430\u0442\u043A\u0430\n\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0433\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0435?\n(\u0418\u0437\u0430\u0431\u0435\u0440\u0438 "\u041D\u0435" \u0437\u0430 \u043D\u043E\u0440\u043C\u0430\u043B\u043D\u043E \u043E\u0442\u0432\u0430\u0440\u0430\u045A [...]
+newmap.install.addon.title=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u0434\u043E\u0434\u0430\u0442\u0430\u043A?
+NewMapAction.text=&\u041D\u043E\u0432\u0430 \u043C\u0430\u043F\u0430
+NewMapViewAction.text=\u041F\u0440\u0438\u043A\u0430\u0437 \u043D\u043E\u0432\u0435 \u043C\u0430\u043F\u0435
+NewParentNode.text=\u041D\u043E\u0432\u0438 \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u0447\u0432\u043E\u0440
+NewParentNode.tooltip=<html>\u0421\u0432\u0438 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0438 \u0434\u043E\u0434\u0435\u0459\u0435\u043D\u0438 \u0441\u0443 \u043D\u043E\u0432\u043E\u043C \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u043C \u0447\u0432\u043E\u0440\u0443.</html>
+NewPreviousSiblingAction.text=\u041D\u043E\u0432\u0438 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0438 \u0440\u0430\u0432\u043D\u043E\u043F\u0440\u0430\u0432\u043D\u0438 \u0447\u0432\u043E\u0440
+NewSiblingAction.text=\u041D\u043E\u0432\u0438 \u0440\u0430\u0432\u043D\u043E\u043F\u0440\u0430\u0432\u043D\u0438 \u0447\u0432\u043E\u0440
+NewSummaryAction.text=\u041D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u0447\u0432\u043E\u0440\u0430
+NewUserStyleAction.text=\u041D\u043E\u0432\u0438 \u0441\u0442\u0438\u043B \u0438\u0437 \u0441\u0435\u043B\u0435\u043A\u0446\u0438\u0458\u0435
+NextNodeAction.BACK.text=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0438 \u0447\u0432\u043E\u0440
+NextNodeAction.BACK_N_FOLD.text=\u0418\u0434\u0438 \u043D\u0430 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0438 \u0447\u0432\u043E\u0440 (\u0441\u043A\u043B\u043E\u043F\u0459\u0435\u043D\u043E)
+NextNodeAction.FORWARD.text=\u0418\u0434\u0438 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0438 \u0447\u0432\u043E\u0440
+NextNodeAction.FORWARD_N_FOLD.text=\u0418\u0434\u0438 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0438 \u0447\u0432\u043E\u0440 (\u0441\u043A\u043B\u043E\u043F\u0459\u0435\u043D\u043E)
+NextPresentationItemAction.text=\u0420\u0430\u0437\u0432\u0438\u0458 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u0441\u0442\u0430\u0432\u043A\u0443 \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0435
+no=\u041D\u0435
+no_copy_attributes_before_paste_attributes=\u041D\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u043B\u0435\u043F\u0438\u0442\u0438 \u043E\u0431\u0435\u043B\u0435\u0436\u0458\u0435 \u0430\u043A\u043E \u0433\u0430 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u043D\u0438\u0441\u0442\u0435 \u0443\u043C\u043D\u043E\u0436\u0438\u043B\u0438.
+NO_FORMAT=\u0422\u0435\u043A\u0441\u0442
+no_format_copy_before_format_paste=\u041D\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u043B\u0435\u043F\u0438\u0442\u0438 \u043E\u0431\u043B\u0438\u043A \u0430\u043A\u043E \u0433\u0430 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u043D\u0438\u0441\u0442\u0435 \u0443\u043C\u043D\u043E\u0436\u0438\u043B\u0438.
+no_found_from=<html>\u041D\u0438\u0458\u0435 <u>{0}</u> \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D \u0443 "{1}".</html>
+no_more_found_from=<html>\u041D\u0435\u043C\u0430 \u0432\u0438\u0448\u0435 <u>{0}</u>\u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0438\u0445 \u0443 "{1}".</htm>
+no_previous_find=\u041D\u0435\u043C\u0430 \u043F\u043E\u0434\u0430\u0442\u043A\u0430 \u0442\u0440\u0430\u0436\u0435\u045A\u0430.
+no_styles_found_in_map=\u041D\u0435\u043C\u0430 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0438\u0445 \u0441\u0442\u0438\u043B\u043E\u0432\u0430 \u0443 \u043C\u0430\u043F\u0438
+node=\u0427\u0432\u043E\u0440
+node_changed_discard_changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0438\u043B\u0438 \u0441\u0442\u0435 \u0447\u0432\u043E\u0440. \u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u043E\u0434\u0431\u0430\u0446\u0438\u0442\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0435?
+node_is_write_protected=\u0426\u0438\u0459\u043D\u0438 \u0447\u0432\u043E\u0440 \u0458\u0435 \u0437\u0430\u0448\u0442\u0438\u045B\u0435\u043D \u043E\u0434 \u043F\u0438\u0441\u0430\u045A\u0430.
+node_location_help=\u041F\u043E\u0432\u043B\u0430\u0447\u0435\u045A\u0435 \u043C\u0435\u045A\u0430 \u043F\u043E\u043B\u043E\u0436\u0430\u0458 \u0447\u0432\u043E\u0440\u0430, ctrl+\u043F\u043E\u0432\u043B\u0430\u0447\u0435\u045A\u0435 \u043C\u0435\u045A\u0430 \u0440\u0430\u0437\u043C\u0430\u043A, \u0434\u0432\u043E\u043A\u043B\u0438\u043A \u0438 ctrl+\u0434\u0432\u043E\u043A\u043B\u0438\u043A \u0432\u0440\u0430\u045B\u0430 \u0447\u0432\u043E\u0440 \u0443 \u043F\u0440\u0432\u043E\u0431\u04 [...]
+node_selector=\u0418\u0437\u0431\u043E\u0440 \u0447\u0432\u043E\u0440\u0430
+node_selector_message=\u0414\u0432\u043E\u0441\u0442\u0440\u0443\u043A\u0438 \u043A\u043B\u0438\u043A \u0437\u0430 \u0438\u0437\u0431\u043E\u0440 \u0447\u0432\u043E\u0440\u0430
+node_styles=\u0421\u0442\u0438\u043B\u043E\u0432\u0438 \u0447\u0432\u043E\u0440\u0430
+NodeBackgroundColorAction.text=&\u041F\u043E\u0437\u0430\u0434\u0438\u043D\u0441\u043A\u0430 \u0431\u043E\u0458\u0430 \u0447\u0432\u043E\u0440\u0430...
+NodeColorAction.text=\u0411\u043E\u0458\u0430 \u0447\u0432\u043E\u0440\u0430...
+NodeColorBlendAction.text=\u041F\u043E\u043C\u0435\u0448\u0430\u0458 \u0431\u043E\u0458\u0435
+NodeDownAction.text=\u041F\u043E\u043C\u0435\u0440\u0438 \u0447\u0432\u043E\u0440 (\u0440\u0430\u0432\u043D\u043E\u043F\u0440\u0430\u0432\u0430\u043D \u0434\u043E\u043B\u0435)
+NodeExtensions.EditNodeExtensions=\u0423\u0440\u0435\u0434\u0438 \u043F\u0440\u043E\u0448\u0438\u0440\u0435\u045A\u0430 \u0447\u0432\u043E\u0440\u0430
+NodeExtensions.RemoveNodeExtensions=\u0423\u043A\u043B\u043E\u043D\u0438 \u043F\u0440\u043E\u0448\u0438\u0440\u0435\u045A\u0430 \u0447\u0432\u043E\u0440\u0430
+NodeListAction.text=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043C\u0435\u043D\u0438...
+NodeListAction.tooltip=\u041F\u043E\u043A\u0430\u0436\u0438 \u0441\u0432\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435 \u043A\u0430\u043E \u043F\u0440\u0435\u0442\u0440\u0430\u0436\u0438\u0432 \u043F\u043E\u043F\u0438\u0441 \u0441\u0430 \u0441\u0432\u043E\u0458\u0441\u0442\u0432\u0438\u043C\u0430 \u0444\u0438\u043B\u0442\u0440\u0430.
+NodeShapeAction.bubble.text=&\u041C\u0435\u0445\u0443\u0440\u0438\u045B
NodeShapeAction.fork.text=\u0420\u0430&\u0447\u0432\u0430
-NodeUpAction.text=\u041f\u043e\u043c\u0435\u0440\u0438 \u0447\u0432\u043e\u0440 (\u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u0430\u043d \u0433\u043e\u0440\u0435)
-NodeWidthAction.text=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u0448\u0438\u0440\u0438\u043d\u0443 \u0447\u0432\u043e\u0440\u0430
-nonboldify_branch=\u041f\u043e\u043d\u0438\u0448\u0442\u0438 \u043f\u043e\u0434\u0435\u0431\u0459\u0430\u045a\u0435
-nonitalicise_branch=\u041f\u043e\u043d\u0438\u0448\u0442\u0438 \u0438\u0441\u043a\u043e\u0448\u0435\u043d\u043e\u0441\u0442
-normal=\u0423\u043e\u0431\u0438\u0447\u0430\u0458\u0435\u043d
-not_saved_for_image_error=\u041c\u0430\u043f\u0430 \u043c\u043e\u0440\u0430 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0432\u0430\u043d\u0430 \u043f\u0440\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0459\u0430\u045a\u0430 \u0441\u043b\u0438\u043a\u0435
-not_saved_for_link_error=\u041c\u0430\u043f\u0430 \u043c\u043e\u0440\u0430 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0430 \u043f\u0440\u0435 \u043f\u043e\u0432\u0435\u0437\u0438\u0432\u0430\u045a\u0430 \u0441 \u043f\u0440\u0435\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u0447\u0435\u043c \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430.
-note_window_location=\u041f\u043e\u0437\u0438\u0446\u0438\u0458\u0430 \u043e\u043a\u043d\u0430 \u0431\u0435\u043b\u0435\u0448\u043a\u0438
+NodeUpAction.text=\u041F\u043E\u043C\u0435\u0440\u0438 \u0447\u0432\u043E\u0440 (\u0440\u0430\u0432\u043D\u043E\u043F\u0440\u0430\u0432\u0430\u043D \u0433\u043E\u0440\u0435)
+NodeWidthAction.text=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0448\u0438\u0440\u0438\u043D\u0443 \u0447\u0432\u043E\u0440\u0430
+nonboldify_branch=\u041F\u043E\u043D\u0438\u0448\u0442\u0438 \u043F\u043E\u0434\u0435\u0431\u0459\u0430\u045A\u0435
+nonitalicise_branch=\u041F\u043E\u043D\u0438\u0448\u0442\u0438 \u0438\u0441\u043A\u043E\u0448\u0435\u043D\u043E\u0441\u0442
+normal=\u0423\u043E\u0431\u0438\u0447\u0430\u0458\u0435\u043D
+not_saved_for_image_error=\u041C\u0430\u043F\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0432\u0430\u043D\u0430 \u043F\u0440\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0430 \u0441\u043B\u0438\u043A\u0435
+not_saved_for_link_error=\u041C\u0430\u043F\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430 \u043F\u0440\u0435 \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0430 \u0441 \u043F\u0440\u0435\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u0447\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430.
+note_window_location=\u041F\u043E\u0437\u0438\u0446\u0438\u0458\u0430 \u043E\u043A\u043D\u0430 \u0431\u0435\u043B\u0435\u0448\u043A\u0438
+notes=\u0411\u0435\u043B\u0435\u0448\u043A\u0430
ok=&\u0423 \u0440\u0435\u0434\u0443
OKAction.text=&\u0423\u0440\u0435\u0434\u0443
-OnlineReference.text=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0458\u0430 \u043c\u0430\u043f\u0430 \u043d\u0430 \u043c\u0440\u0435\u0436\u0438
-open_asMindMap=\u041c\u0430\u043f\u0430 \u0443\u043c\u0430
-OpenAction.text=\u041e\u0442\u0432\u043e\u0440\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0443 \u043c\u0430\u043f\u0443...
-OpenFreeplaneSiteAction.text=\u0412\u0435\u0431 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 Freeplane
-OpenPathAction.text=\u041e\u0442\u0432\u043e\u0440\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443
-OpenURLMapAction.text=\u041e\u0442\u0432\u043e\u0440\u0438 \u043c\u0430\u043f\u0443 \u0438\u0437 URL...
-OpenUserDirAction.text=\u041e\u0442\u0432\u043e\u0440\u0438 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0443 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0443
-option_changes_may_require_restart=\u0414\u0430 \u0431\u0438\u0441\u0442\u0435 \u0432\u0438\u0434\u0435\u043b\u0438 \u0443\u0447\u0438\u043d\u0430\u043a \u043f\u0440\u043e\u043c\u0435\u043d\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438, \u043c\u043e\u0440\u0430\u0442\u0435 \u043f\u0440\u0435\u043f\u043e\u043a\u0440\u0435\u043d\u0443\u0442\u0438 Freeplane
-OptionalDontShowMeAgainDialog.cancel=&\u041d\u0435
-OptionalDontShowMeAgainDialog.dontShowAgain=\u041d\u0435 &\u043f\u0438\u0442\u0430\u0458 \u043c\u0435 \u043f\u043e\u043d\u043e\u0432\u043d\u043e.
+OnlineReference.text=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0430 \u043C\u0430\u043F\u0430 \u043D\u0430 \u043C\u0440\u0435\u0436\u0438
+open_asMindMap=\u041C\u0430\u043F\u0430 \u0443\u043C\u0430
+OpenAction.text=\u041E\u0442\u0432\u043E\u0440\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0443 \u043C\u0430\u043F\u0443...
+OpenFreeplaneSiteAction.text=\u0412\u0435\u0431 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 Freeplane
+OpenPathAction.text=\u041E\u0442\u0432\u043E\u0440\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443
+OpenURLMapAction.text=\u041E\u0442\u0432\u043E\u0440\u0438 \u043C\u0430\u043F\u0443 \u0438\u0437 URL...
+OpenUserDirAction.text=\u041E\u0442\u0432\u043E\u0440\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0443 \u0444\u0430\u0441\u0446\u0438\u043A\u043B\u0443
+option_changes_may_require_restart=\u0414\u0430 \u0431\u0438\u0441\u0442\u0435 \u0432\u0438\u0434\u0435\u043B\u0438 \u0443\u0447\u0438\u043D\u0430\u043A \u043F\u0440\u043E\u043C\u0435\u043D\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0438, \u043C\u043E\u0440\u0430\u0442\u0435 \u043F\u0440\u0435\u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 Freeplane
+OptionalDontShowMeAgainDialog.cancel=&\u041D\u0435
+OptionalDontShowMeAgainDialog.dontShowAgain=\u041D\u0435 &\u043F\u0438\u0442\u0430\u0458 \u043C\u0435 \u043F\u043E\u043D\u043E\u0432\u043D\u043E.
OptionalDontShowMeAgainDialog.ok=&\u0414\u0430
-OptionalDontShowMeAgainDialog.rememberMyDescision=&\u0417\u0430\u043f\u0430\u043c\u0442\u0438 \u043c\u043e\u0458\u0443 \u043e\u0434\u043b\u0443\u043a\u0443
-OptionPanel.absolute=\u0410\u043f\u0441\u043e\u043b\u0443\u0442\u043d\u0430
-OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0438\u0437\u0433\u043b\u0435\u0434 \u0448\u0430\u0431\u043b\u043e\u043d\u0430
-OptionPanel.ADD_CHILD=\u0414\u043e\u0434\u0430\u0458 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u0447\u0432\u043e\u0440
-OptionPanel.ADD_SIBLING=\u0414\u043e\u0434\u0430\u0458 \u0440\u0430\u0432\u043d\u043e\u043f\u0440\u0430\u0432\u0430\u043d \u0447\u0432\u043e\u0440
-OptionPanel.addons=\u0414\u043e\u0434\u0430\u0446\u0438
-OptionPanel.always_fold_all_after_load=\u0421\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435
-OptionPanel.always_load_last_maps=\u0423\u0447\u0438\u0442\u0430\u0458 \u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0435 \u0438 \u043d\u043e\u0432\u0435 \u043c\u0430\u043f\u0435
-OptionPanel.always_load_last_maps.tooltip=\u041e\u0442\u0432\u0430\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435 \u043f\u0440\u0435\u043c\u0430 \u0433\u043e\u0440\u0435 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u043c \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430\u043c\u0430, \u0447\u0430\u043a \u0438 \u043f\u043e\u043a\u0440\u0435\u0442\u0430\u045a\u0435\u043c FP \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u043e\u04 [...]
-OptionPanel.always_save_folding=\u0423\u0432\u0435\u043a
-OptionPanel.always_save_folding_state=\u0423\u0432\u0435\u043a \u0441\u0430\u0447\u0443\u0432\u0430\u0458 \u043f\u0440\u043e\u043c\u0435\u043d\u0435 \u043f\u043e\u043b\u043e\u0436\u0430\u0458\u0430 \u0441\u043a\u043b\u043e\u043f\u0459\u0435\u043d\u0438\u0445 \u0438 \u0440\u0430\u0441\u043a\u043b\u043e\u043f\u0459\u0435\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430.
-OptionPanel.always_save_folding_state.tooltip=\u041e\u0432\u0430 \u043c\u043e\u0433\u0443\u045b\u043d\u043e\u0441\u0442 \u045b\u0435 \u043f\u0440\u0438\u043b\u0438\u043a\u043e\u043c \u0437\u0430\u0442\u0432\u0430\u0440\u0430\u045a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430 \u0443\u043f\u043e\u0437\u043e\u0440\u0438\u0442\u0438 \u043d\u0430 \u043f\u0440\u043e\u043c\u0435\u043d\u0435 \u0438\u0437\u0433\u043b\u0435\u0434\u0430 \u0441\u0442\u0430\u0431\u043b\u0430 \u043c\u0430\u0 [...]
-OptionPanel.always_unfold_all_after_load=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435
-OptionPanel.antialias=\u0417\u0430\u0433\u043b\u0430\u0452\u0438\u0432\u0430\u045a\u0435
-OptionPanel.antialias.tooltip=<html>\u041e\u0434\u0440\u0435\u0452\u0438\u0432\u0430\u045a\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u043a\u043e\u0433 \u043a\u0432\u0430\u043b\u0438\u0442\u0435\u0442\u0430 \u043c\u0430\u043f\u0435. \u0412\u0438\u0448\u0435 \u0437\u0430\u0433\u043b\u0430\u0452\u0438\u0432\u0430\u045a\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u0432\u0438\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430.</html>
-OptionPanel.antialias_all=\u0417\u0430\u0433\u043b\u0430\u0434\u0438 \u0441\u0432\u0435
-OptionPanel.antialias_edges=\u0417\u0430\u0433\u043b\u0430\u0452\u0438\u0432\u0430\u045a\u0435 \u0440\u0443\u0431\u0430
-OptionPanel.antialias_none=\u0411\u0435\u0437 \u0437\u0430\u0433\u043b\u0430\u0452\u0438\u0432\u0430\u045a\u0430
-OptionPanel.Appearance=\u0418\u0437\u0433\u043b\u0435\u0434
-OptionPanel.apply_system_screen_resolution=\u041f\u0440\u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0443 \u0440\u0435\u0437\u043e\u043b\u0443\u0446\u0438\u0458\u0443 \u0435\u043a\u0440\u0430\u043d\u0430
-OptionPanel.approximate_search_threshold=\u041f\u0440\u0430\u0433 \u0437\u0430 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u043d\u043e \u043f\u043e\u0434\u0443\u0434\u0430\u0440\u0430\u045a\u0435
-OptionPanel.approximate_search_threshold.tooltip=<html>\u041f\u0440\u0430\u0433 \u0437\u0430 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u043d\u043e \u043f\u043e\u0434\u0443\u0434\u0430\u0440\u0430\u045a\u0435<br/><\u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0435 \u0441\u043b\u043e\u0432\u0430="2">\u043f\u043e\u0433\u043b\u0435\u0434\u0430\u0458 http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(\u0432\u0435\u045b\u0430 - \u043c\u0430\u045a\u0430 \u043a\u043e\u043b\u043 [...]
-OptionPanel.ar=Arabic / \u0410\u0440\u0430\u043f\u0441\u043a\u0438
-OptionPanel.ARC=\u041b\u0443\u043a
-OptionPanel.as_parent=\u041a\u0430\u043e \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u0438
-OptionPanel.ask=\u041f\u0438\u0442\u0430\u045a\u0435
-OptionPanel.automatic=\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438
-OptionPanel.automaticFormat_level=\u041f\u0440\u0438\u043c\u0435\u043d\u0438 \u043d\u0438\u0432\u043e \u0441\u0442\u0438\u043b\u043e\u0432\u0430
-OptionPanel.automaticFormat_level1=\u041e\u0431\u043b\u0438\u043a \u0438\u0437\u0432\u043e\u0440\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.automaticFormat_level2=1. \u041d\u0438\u0432\u043e \u043e\u0431\u043b\u0438\u043a\u0430 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.backup_file_number=\u0411\u0440\u043e\u0458 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0438\u0445 \u043f\u0440\u0438\u0447\u0443\u0432\u043d\u0438\u0445 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-OptionPanel.Behaviour=\u041f\u043e\u043d\u0430\u0448\u0430\u045a\u0435
-OptionPanel.bezier=\u041b\u0430\u0433\u0430\u043d\u043e \u0437\u0430\u043a\u0440\u0438\u0432\u0459\u0435\u043d\u0430 (\u043a\u0440\u0438\u0432\u0443\u0459\u0430)
-OptionPanel.bubble=\u041e\u0431\u043b\u0430\u0447\u0438\u045b
-OptionPanel.ca=\u041a\u0430\u0442\u0430\u043b\u043e\u043d\u0441\u043a\u0438
-OptionPanel.Cancel=\u041e\u0442\u043a\u0430\u0436\u0438
-OptionPanel.center_selected_node=\u041e\u0434\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440 \u0443 \u0441\u0440\u0435\u0434\u0438\u0448\u0442\u0443 \u043f\u0440\u0438\u043a\u0430\u0437\u0430
-OptionPanel.check_updates_automatically=\u041f\u0440\u043e\u0432\u0435\u0440\u0438 \u0437\u0430 \u043d\u0430\u0434\u043e\u0433\u0440\u0430\u0434\u045a\u0443 \u043f\u0440\u0438\u043b\u0438\u043a\u043e\u043c \u043f\u043e\u043a\u0440\u0435\u0442\u0430\u045a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430
-OptionPanel.childpattern=\u0428\u0430\u0431\u043b\u043e\u043d \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0433
-OptionPanel.childpattern.tooltip=\u041e\u0434\u0430\u0431\u0440\u0430\u043d\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u045b\u0435 \u0441\u0435 \u043d\u0430 \u0441\u0432\u0438\u043c \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438\u043c \u0447\u0432\u043e\u0440\u043e\u0432\u0438\u043c\u0430
-OptionPanel.clear_all_setters=\u041f\u0440\u0435\u043e\u043a\u0440\u0435\u043d\u0438 \u0441\u0432\u0435
-OptionPanel.clear_all_setters.tooltip=\u041e\u043c\u043e\u0433\u0443\u045b\u0443\u0458\u0435 \u0438\u043b\u0438 \u043e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0443\u0458\u0435 \u0441\u0432\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0435.
-OptionPanel.cloud=\u041e\u0431\u043b\u0430\u0447\u0438\u045b
-OptionPanel.cloudcolor=\u0411\u043e\u0458\u0430 \u043e\u0431\u043b\u0430\u0447\u0438\u045b\u0430
-OptionPanel.cloudshape=\u041e\u0431\u043b\u0438\u043a \u043e\u0431\u043b\u0430\u0447\u0438\u045b\u0430
-OptionPanel.combined=\u041a\u043e\u043c\u0431\u0438\u043d\u043e\u0432\u0430\u043d\u043e
-OptionPanel.compare_as_number=\u0423\u043f\u043e\u0440\u0435\u0434\u0438 \u043a\u0430\u043e \u0431\u0440\u043e\u0458\u0435\u0432\u0435
-OptionPanel.convert_to_current_version=<html>\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e \u043f\u0440\u0435\u0442\u0432\u0430\u0440\u0430\u045a\u0435 \u043c\u0430\u043f\u0430 \u0441\u0442\u0430\u0440\u0438\u0445 \u0438\u0437\u0434\u0430\u045a\u0435 Freeplanea <br>\u0443 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0438\u0437\u0434\u0430\u045a\u0435?</html>
-OptionPanel.convert_to_current_version.tooltip=<html>\u0421\u0430\u043c\u043e \u0437\u0430 \u0432\u0440\u043b\u043e \u0432\u0435\u043b\u0438\u043a\u0435 \u043c\u0430\u043f\u0435 \u0437\u0430 \u043a\u043e\u0458\u0435 \u043d\u0438\u0458\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u043f\u0440\u0435\u0442\u0432\u0430\u0440\u0430\u045a\u0435 <br>(\u0430 \u0437\u0430 \u0442\u043e \u0458\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u0441\u0442\u0440\u0443\u0447\u043d\u043 [...]
-OptionPanel.cs=\u0427\u0435\u0448\u043a\u0438 / \u010desky
-OptionPanel.cut_nodes_without_question=\u0418\u0441\u0435\u0446\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0435 \u0431\u0435\u0437 \u043f\u043e\u0442\u0432\u0440\u0434\u0435.
-OptionPanel.cut_nodes_without_question.tooltip=\u0410\u043a\u043e \u0458\u0435 \u043f\u043e\u0459\u0435 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e \u0447\u0432\u043e\u0440\u043e\u0432\u0438 \u045b\u0435 \u0431\u0438\u0442\u0438 \u0438\u0437\u0440\u0435\u0437\u0430\u043d\u0438 \u0431\u0435\u0437 \u043f\u043e\u0442\u0432\u0440\u0434\u0435. \u041e\u0432\u043e \u043c\u043e\u0436\u0435 \u043f\u0440\u043e\u0443\u0437\u0440\u043e\u043a\u043e\u0432\u0430\u0442\u0438 \u0433\u0443\u0431\u043 [...]
-OptionPanel.da=\u0414\u0430\u043d\u0441\u043a\u0438 / dansk
-OptionPanel.date_format=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442\u0443\u043c\u0430
-OptionPanel.date_format.tooltip=\u0421\u0432\u0430\u043a\u0438 SHORT, MEDIUM, LONG \u0438\u043b\u0438 FULL \u0438\u043b\u0438 \u043a\u0430\u043e \u0448\u0430\u0431\u043b\u043e\u043d "MM/dd/yyyy"
-OptionPanel.datetime_format=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0438 \u0434\u0430\u0442\u0443\u043c\u0430
-OptionPanel.datetime_format.tooltip=\u0421\u0432\u0430\u043a\u0438 <\u043e\u0431\u043b\u0438\u043a \u0434\u0430\u0442\u0443\u043c\u0430>,<\u043e\u0431\u043b\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0430> (\u0441\u0430 SHORT, MEDIUM, LONG \u0438\u043b\u0438 FULL \u043a\u0430\u043e \u0441\u0442\u0438\u043b) \u0438\u043b\u0438 \u043a\u0430\u043e \u043f\u0443\u043d \u0448\u0430\u0431\u043b\u043e\u043d "M/d/yyyy hh:mm"
-OptionPanel.de=\u041d\u0435\u043c\u0430\u0447\u043a\u0438 / Deutsch
-OptionPanel.default=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u043e
-OptionPanel.default_attribute_key_column_width=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u043a\u0459\u0443\u0447\u043d\u043d\u043e\u0433 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
-OptionPanel.default_attribute_value_column_width=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
-OptionPanel.default_browser_command_mac=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0438 \u043d\u0430\u0440\u0435\u0434\u0431\u0435\u043d\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u043d\u0438\u043a \u0437\u0430 Mac
-OptionPanel.default_browser_command_mac.tooltip=<html> \u0438 MAC: (\u0437\u0430\u0445\u0432\u0430\u0459\u0443\u0458\u0443\u045b\u0438 \u041d\u0438\u043a\u0443!)</html>
-OptionPanel.default_browser_command_other_os=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u0430\u0447 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0434\u0440\u0443\u0433\u043e\u0433 \u041e\u0421
-OptionPanel.default_browser_command_other_os.tooltip=<html> \u041e\u0432\u043e \u0458\u0435 \u0442\u0438\u043f\u0438\u0447\u043d\u043e \u0437\u0430 Linux:</html>
-OptionPanel.default_browser_command_windows_9x=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0438 \u043d\u0430\u0440\u0435\u0434\u0431\u0435\u043d\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u043d\u0438\u043a Windows 98
-OptionPanel.default_browser_command_windows_9x.tooltip=<html>\u0417\u0430 Windows 98 (\u0437\u043d\u0430\u0446\u0438 "" \u0441\u0443 \u043e\u0431\u0430\u0432\u0435\u0437\u043d\u0438 \u0437\u0431\u043e\u0433 \u0432\u0435\u0437\u0430, \u043a\u043e\u0458\u0435 \u0438\u043c\u0430\u0458\u0443 "=" \u0443 \u0441\u0432\u043e\u0458\u0435\u043c \u0423\u0420\u041b-\u0443).</html>
-OptionPanel.default_browser_command_windows_nt=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0438 \u043d\u0430\u0440\u0435\u0434\u0431\u0435\u043d\u0438 \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u043d\u0438\u043a Windows Nt
-OptionPanel.default_browser_command_windows_nt.tooltip=<html>\u0417\u0430 Windows NT (\u0437\u043d\u0430\u0446\u0438 "" \u0441\u0443 \u043e\u0431\u0430\u0432\u0435\u0437\u043d\u0438 \u0437\u0431\u043e\u0433 \u0432\u0435\u0437\u0430, \u043a\u043e\u0458\u0435 \u0438\u043c\u0430\u0458\u0443 "=" \u0443 \u0441\u0432\u043e\u0458\u0435\u043c \u0423\u0420\u041b-\u0443).</html>
-OptionPanel.default_charset=\u0421\u043a\u0443\u043f \u0437\u043d\u0430\u043a\u043e\u0432\u0430
-OptionPanel.Defaults=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0435
-OptionPanel.delete_automatic_saves_at_exit=\u041a\u043e\u0434 \u0438\u0437\u043b\u0430\u0437\u0430 \u0438\u0437\u0431\u0440\u0438\u0448\u0438 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435.
-OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> \u0410\u043a\u043e \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435 \u0442\u0440\u0435\u0431\u0430 \u0434\u0430 \u0441\u0435 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0431\u0440\u0438\u0448\u0443 \u043f\u0440\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u043d\u043e\u043c \u0433\u0430\u0448\u0435\u045a\u0435\u045a\u0443 Freeplane, \u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0437\u043d\u0430\u043a \u0437\u0430 \u [...]
-OptionPanel.delete_nodes_without_question=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0435 \u0431\u0435\u0437 \u043f\u043e\u0442\u0432\u0440\u0434\u0435?
-OptionPanel.delete_nodes_without_question.tooltip=\u0410\u043a\u043e \u0458\u0435 \u043f\u043e\u0459\u0435 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e \u0447\u0432\u043e\u0440\u043e\u0432\u0438 \u045b\u0435 \u0431\u0438\u0442\u0438 \u043e\u0431\u0440\u0438\u0441\u0430\u043d\u0438 \u0431\u0435\u0437 \u043f\u043e\u0442\u0432\u0440\u0434\u0435. \u041e\u0432\u043e \u043c\u043e\u0436\u0435 \u043f\u0440\u043e\u0443\u0437\u0440\u043e\u043a\u043e\u0432\u0430\u0442\u0438 \u0433\u0443\u0431\u [...]
-OptionPanel.disable_cursor_move_paper=\u041e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0438 \u043f\u043e\u043c\u0438\u0446\u0430\u045a\u0435 \u043f\u043e\u0434\u043b\u043e\u0433\u0435 \u043f\u043e\u043a\u0430\u0437\u0438\u0432\u0430\u0447\u0430
-OptionPanel.disable_cursor_move_paper.tooltip=<html>\u041d\u0435 \u043f\u0440\u0438\u043a\u0430\u0437\u0443\u0458 \u043f\u043e\u043a\u0430\u0437\u0438\u0432\u0430\u0447 '\u043f\u043e\u043c\u0435\u0440\u0438' \u043f\u0440\u0438\u043b\u0438\u043a\u043e\u043c \u043f\u043e\u0432\u043b\u0430\u0447\u0435\u045a\u0430 \u043f\u043e\u0434\u043b\u043e\u0433\u0435 </html>
-OptionPanel.display_inline_editor_for_all_new_nodes=\u041f\u0440\u0438\u043a\u0430\u0437 \u0441\u0442\u0430\u0437\u0435 \u0443\u0440\u0435\u0434\u043d\u0438\u043a\u0430 \u0437\u0430 \u0441\u0432\u0435 \u043d\u043e\u0432\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-OptionPanel.display_node_id=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0418\u0414 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.edgecolor=\u0411\u043e\u0458\u0430 \u0440\u0443\u0431\u0430
-OptionPanel.edgecolor.tooltip=\u0421\u0432\u043e\u0458\u0441\u0442\u0432\u043e \u0440\u0443\u0431\u0430 \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430 (\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u045b\u0435 \u0441\u0435 \u043d\u0430 \u0441\u0432\u0435 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435)
-OptionPanel.edgestyle=\u0421\u0442\u0438\u043b \u0440\u0443\u0431\u0430
-OptionPanel.edgestyle.tooltip=\u0421\u0432\u043e\u0458\u0441\u0442\u0432\u043e \u0440\u0443\u0431\u0430 \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430 (\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u045b\u0435 \u0441\u0435 \u043d\u0430 \u0441\u0432\u0435 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435)
-OptionPanel.edgewidth=\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u0443\u0431\u0430
-OptionPanel.edgewidth.tooltip=\u0421\u0432\u043e\u0458\u0441\u0442\u0432\u043e \u0440\u0443\u0431\u0430 \u043d\u0430\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430 (\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u045b\u0435 \u0441\u0435 \u043d\u0430 \u0441\u0432\u0435 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435)
-OptionPanel.EDIT_CURRENT=\u0417\u0430\u043c\u0435\u043d\u0438 \u0441\u0430\u0434\u0440\u0436\u0430\u0458
-OptionPanel.edit_on_double_click=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u045a\u0435 \u043d\u0430 \u0434\u0432\u043e\u043a\u043b\u0438\u043a
-OptionPanel.editor_extra_width=\u0414\u043e\u0434\u0430\u0442\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u043a\u043e\u0440\u0430\u043a\u0430
-OptionPanel.editor_extra_width.tooltip=<html>\u041e\u0434\u0440\u0435\u0452\u0443\u0458\u0435 \u0431\u0440\u043e\u0458 \u0442\u0430\u0447\u043a\u0438\u0446\u0430 \u0434\u0430 \u043f\u043e\u0432\u0435\u045b\u0430 \u0448\u0438\u0440\u0438\u043d\u0443 \u0447\u0432\u043e\u0440\u0430 \u0430\u043a\u043e \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0435\u043b\u0430\u0437\u0438 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u0443 \u0448\u0438\u0440\u0438\u043d\u0443.</html>
-OptionPanel.el=\u0413\u0440\u0447\u043a\u0438 / \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
-OptionPanel.el__buttons_above=\u0414\u0443\u0433\u043c\u0435 \u043d\u0430 \u0432\u0440\u0445\u0443 \u043f\u0440\u043e\u0437\u043e\u0440\u0430
-OptionPanel.el__enter_confirms_by_default=Enter \u0458\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0430 \u043f\u043e\u0442\u0432\u0440\u0434\u0430
-OptionPanel.el__max_default_window_height=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0430 \u043d\u0430\u0458\u0432\u0435\u045b\u0430 \u0432\u0438\u0441\u0438\u043d\u0430 \u043f\u0440\u043e\u0437\u043e\u0440\u0430
-OptionPanel.el__max_default_window_width=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0430 \u043d\u0430\u0458\u0432\u0435\u045b\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u043f\u0440\u043e\u0437\u043e\u0440\u0430
-OptionPanel.el__min_default_window_height=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0430 \u043d\u0430\u0458\u043c\u0430\u045a\u0430 \u0432\u0438\u0441\u0438\u043d\u0430 \u043f\u0440\u043e\u0437\u043e\u0440\u0430
-OptionPanel.el__min_default_window_width=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0430 \u043d\u0430\u0458\u043c\u0430\u045a\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u043f\u0440\u043e\u0437\u043e\u0440\u0430
-OptionPanel.el__position_window_below_node=\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u0458 \u043f\u0440\u043e\u0437\u043e\u0440 \u0438\u0441\u043f\u043e\u0434 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.en=\u0415\u043d\u0433\u043b\u0435\u0441\u043a\u0438 / English
-OptionPanel.Environment=\u041e\u043a\u0440\u0443\u0436\u0435\u045a\u0435
-OptionPanel.es=\u0428\u043f\u0430\u043d\u0441\u043a\u0438, \u041a\u0430\u0441\u0442\u0438\u0459\u0441\u043a\u0438 / espa\u00f1ol, castellano
-OptionPanel.et=\u0415\u0441\u0442\u043e\u043d\u0441\u043a\u0438 / eesti, eesti keel
-OptionPanel.execute_scripts_without_asking=\u0418\u0437\u0432\u0440\u0448\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0431\u0435\u0437 \u043f\u043e\u0442\u0432\u0440\u0434\u0435
-OptionPanel.execute_scripts_without_asking.tooltip=<html>\u0423 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 Freeplane \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043c\u043e\u0433\u0443 \u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0431\u0438\u043b\u043e \u043a\u0430\u043a\u0432\u0443 \u0430\u043a\u0446\u0438\u0458\u0443 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c\u0443 \u0440\u0430\u0447\u0443\u043d\u0430\u0440\u0443. <br>\u0417\u0430\u0442\u043e \u043d\u0435 \u0431\u0438\u0441\u044 [...]
-OptionPanel.execute_scripts_without_exec_restriction=\u041e\u043c\u043e\u0433\u0443\u045b\u0438 \u0438\u0437\u0432\u0440\u0448\u0435\u045a\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0445 \u0430\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0458\u0430 (\u041d\u0418\u0408\u0415 \u043f\u0440\u0435\u043f\u043e\u0440\u0443\u0447\u0435\u043d\u043e)
-OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>\u0423\u043a\u043e\u043b\u0438\u043a\u043e Groovy \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0442\u0440\u0435\u0431\u0430\u0458\u0443 \u0443\u043f\u0440\u0430\u0432\u0459\u0430\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045a\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u0438\u0445 \u0430\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0458\u0430 (\u043d\u043f\u0440. \u043a\u0430\u043e \u043f\u0440\u043 [...]
-OptionPanel.execute_scripts_without_file_restriction=\u041e\u043c\u043e\u0433\u0443\u045b\u0438 \u0447\u0438\u0442\u0430\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 (\u041d\u0418\u0408\u0415 \u043f\u0440\u0435\u043f\u043e\u0440\u0443\u0447\u0435\u043d\u043e)
-OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>\u0423\u043a\u043e\u043b\u0438\u043a\u043e Groovy \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0442\u0440\u0435\u0431\u0430\u0458\u0443 \u0443\u043f\u0440\u0430\u0432\u0459\u0430\u0442\u0438 \u0447\u0438\u0442\u0430\u045a\u0435\u043c \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 (\u043d\u043f\u0440. \u043e\u0442\u0432\u043e\u0440\u0438\u0442\u0438, \u0437\u0430\u0442\u0432\u043e\u0440\u0438\u0442\u0438, \u0447\u0 [...]
-OptionPanel.execute_scripts_without_network_restriction=\u041e\u043c\u043e\u0433\u0443\u045b\u0438 \u0443\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u043c\u0440\u0435\u0436\u043d\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0438\u043c\u0430 (\u041d\u0418\u0408\u0415 \u043f\u0440\u0435\u043f\u043e\u0440\u0443\u0447\u0435\u043d\u043e)
-OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>\u0423\u043a\u043e\u043b\u0438\u043a\u043e Groovy \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0442\u0440\u0435\u0431\u0430\u0458\u0443 \u0443\u043f\u0440\u0430\u0432\u0459\u0430\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045a\u0435\u043c \u043c\u0440\u0435\u0436\u043d\u0438\u0445 \u0430\u043a\u0446\u0438\u0458\u0430,<br>\u043c\u043e\u0440\u0430\u0442\u0435 \u043e\u043c\u043e\u0433\u0443\u045b\ [...]
-OptionPanel.execute_scripts_without_write_restriction=\u041e\u043c\u043e\u0433\u0443\u045b\u0438 \u043f\u0438\u0441\u0430\u045a\u0435/\u0431\u0440\u0438\u0441\u0430\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 (\u041d\u0418\u0408\u0415 \u043f\u0440\u0435\u043f\u043e\u0440\u0443\u0447\u0435\u043d\u043e)
-OptionPanel.execute_scripts_without_write_restriction.tooltip=<html><body>\u0423\u043a\u043e\u043b\u0438\u043a\u043e Groovy \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0442\u0440\u0435\u0431\u0430\u0458\u0443 \u0443\u043f\u0440\u0430\u0432\u0459\u0430\u0442\u0438 \u0437\u0430\u043f\u0438\u0441\u0438\u0432\u0430\u045a\u0435\u043c \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435 (\u043d\u043f\u0440. \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u0438, \u043e\u0431\u0440\u0438\u0441\u0430\u04 [...]
-OptionPanel.experimental_file_locking_on=\u041f\u0440\u043e\u0431\u043d\u043e \u0458\u0435 \u0437\u0430\u0442\u0432\u0430\u0440\u0430\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435
-OptionPanel.experimental_file_locking_on.tooltip=<html> \u041f\u0440\u043e\u0431\u043d\u0435 \u043c\u043e\u0433\u0443\u045b\u043d\u043e\u0441\u0442\u0438</html>
-OptionPanel.export_icons_in_html=\u0418\u0437\u0432\u043e\u0437 \u0438\u043a\u043e\u043d\u0430 \u0443 HTML
-OptionPanel.export_icons_in_html.tooltip=<html> \u041f\u043e\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u0443\u043a\u043e\u043b\u0438\u043a\u043e \u0436\u0435\u043b\u0438\u0442\u0435 \u0434\u0430 HTML \u0438\u0437\u0432\u043e\u0437 \u0441\u0430\u0434\u0440\u0436\u0438 \u0438\u043a\u043e\u043d\u0435. \u041f\u043e\u0441\u0442\u043e\u0458\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432\u0435\u0437\u0430 \u043f\u0440\u0435\u043c\u0430 \u0438\u043a\u043e\u043d\u0430\u043c\u0430 \u0443 [...]
-OptionPanel.Files=\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0435
-OptionPanel.first=\u041f\u0440\u0432\u0443
-OptionPanel.fold_on_click_inside=\u0421\u043b\u043e\u043f\u0438 \u043d\u0430 \u043a\u043b\u0438\u043a \u0443\u043d\u0443\u0442\u0440\u0430
-OptionPanel.foldingsymbolwidth=\u0421\u043a\u043b\u0430\u043f\u0430\u045a\u0435 \u0448\u0438\u0440\u0438\u043d\u0435 \u0441\u0438\u043c\u0431\u043e\u043b\u0430.
-OptionPanel.foldingsymbolwidth.tooltip=<html>\u0428\u0438\u0440\u0438\u043d\u0430 \u0441\u043a\u043b\u0430\u043f\u0430\u045a\u0435 \u043e\u0431\u0435\u043b\u0435\u0436\u0430\u0432\u0430\u045a\u0430 \u043a\u0440\u0443\u0433\u0430</html>
+OptionalDontShowMeAgainDialog.rememberMyDescision=&\u0417\u0430\u043F\u0430\u043C\u0442\u0438 \u043C\u043E\u0458\u0443 \u043E\u0434\u043B\u0443\u043A\u0443
+OptionPanel.absolute=\u0410\u043F\u0441\u043E\u043B\u0443\u0442\u043D\u0430
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0438\u0437\u0433\u043B\u0435\u0434 \u0448\u0430\u0431\u043B\u043E\u043D\u0430
+OptionPanel.ADD_CHILD=\u0414\u043E\u0434\u0430\u0458 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u0447\u0432\u043E\u0440
+OptionPanel.ADD_SIBLING=\u0414\u043E\u0434\u0430\u0458 \u0440\u0430\u0432\u043D\u043E\u043F\u0440\u0430\u0432\u0430\u043D \u0447\u0432\u043E\u0440
+OptionPanel.addons=\u0414\u043E\u0434\u0430\u0446\u0438
+OptionPanel.always_fold_all_after_load=\u0421\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435
+OptionPanel.always_load_last_maps=\u0423\u0447\u0438\u0442\u0430\u0458 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0435 \u0438 \u043D\u043E\u0432\u0435 \u043C\u0430\u043F\u0435
+OptionPanel.always_load_last_maps.tooltip=\u041E\u0442\u0432\u0430\u0440\u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u043F\u0440\u0435\u043C\u0430 \u0433\u043E\u0440\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u043C \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0430\u043C\u0430, \u0447\u0430\u043A \u0438 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435\u043C FP \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u043E\u04 [...]
+OptionPanel.always_save_folding=\u0423\u0432\u0435\u043A
+OptionPanel.always_save_folding_state=\u0423\u0432\u0435\u043A \u0441\u0430\u0447\u0443\u0432\u0430\u0458 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u043F\u043E\u043B\u043E\u0436\u0430\u0458\u0430 \u0441\u043A\u043B\u043E\u043F\u0459\u0435\u043D\u0438\u0445 \u0438 \u0440\u0430\u0441\u043A\u043B\u043E\u043F\u0459\u0435\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430.
+OptionPanel.always_save_folding_state.tooltip=\u041E\u0432\u0430 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442 \u045B\u0435 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u0437\u0430\u0442\u0432\u0430\u0440\u0430\u045A\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430 \u0443\u043F\u043E\u0437\u043E\u0440\u0438\u0442\u0438 \u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u0438\u0437\u0433\u043B\u0435\u0434\u0430 \u0441\u0442\u0430\u0431\u043B\u0430 \u043C\u0430\u0 [...]
+OptionPanel.always_unfold_all_after_load=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435
+OptionPanel.antialias=\u0417\u0430\u0433\u043B\u0430\u0452\u0438\u0432\u0430\u045A\u0435
+OptionPanel.antialias.tooltip=<html>\u041E\u0434\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u043A\u043E\u0433 \u043A\u0432\u0430\u043B\u0438\u0442\u0435\u0442\u0430 \u043C\u0430\u043F\u0435. \u0412\u0438\u0448\u0435 \u0437\u0430\u0433\u043B\u0430\u0452\u0438\u0432\u0430\u045A\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u0432\u0438\u0448\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u0430.</html>
+OptionPanel.antialias_all=\u0417\u0430\u0433\u043B\u0430\u0434\u0438 \u0441\u0432\u0435
+OptionPanel.antialias_edges=\u0417\u0430\u0433\u043B\u0430\u0452\u0438\u0432\u0430\u045A\u0435 \u0440\u0443\u0431\u0430
+OptionPanel.antialias_none=\u0411\u0435\u0437 \u0437\u0430\u0433\u043B\u0430\u0452\u0438\u0432\u0430\u045A\u0430
+OptionPanel.Appearance=\u0418\u0437\u0433\u043B\u0435\u0434
+OptionPanel.apply_system_screen_resolution=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 \u043F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0443 \u0440\u0435\u0437\u043E\u043B\u0443\u0446\u0438\u0458\u0443 \u0435\u043A\u0440\u0430\u043D\u0430
+OptionPanel.approximate_search_threshold=\u041F\u0440\u0430\u0433 \u0437\u0430 \u043F\u0440\u0438\u0431\u043B\u0438\u0436\u043D\u043E \u043F\u043E\u0434\u0443\u0434\u0430\u0440\u0430\u045A\u0435
+OptionPanel.approximate_search_threshold.tooltip=<html>\u041F\u0440\u0430\u0433 \u0437\u0430 \u043F\u0440\u0438\u0431\u043B\u0438\u0436\u043D\u043E \u043F\u043E\u0434\u0443\u0434\u0430\u0440\u0430\u045A\u0435<br/><\u0432\u0435\u043B\u0438\u0447\u0438\u043D\u0435 \u0441\u043B\u043E\u0432\u0430="2">\u043F\u043E\u0433\u043B\u0435\u0434\u0430\u0458 http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(\u0432\u0435\u045B\u0430 - \u043C\u0430\u045A\u0430 \u043A\u043E\u043B\u043 [...]
+OptionPanel.ar=Arabic / \u0410\u0440\u0430\u043F\u0441\u043A\u0438
+OptionPanel.ARC=\u041B\u0443\u043A
+OptionPanel.as_parent=\u041A\u0430\u043E \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u0438
+OptionPanel.ask=\u041F\u0438\u0442\u0430\u045A\u0435
+OptionPanel.automatic=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438
+OptionPanel.automaticFormat_level=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 \u043D\u0438\u0432\u043E \u0441\u0442\u0438\u043B\u043E\u0432\u0430
+OptionPanel.automaticFormat_level1=\u041E\u0431\u043B\u0438\u043A \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.automaticFormat_level2=1. \u041D\u0438\u0432\u043E \u043E\u0431\u043B\u0438\u043A\u0430 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.backup_file_number=\u0411\u0440\u043E\u0458 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0438\u0445 \u043F\u0440\u0438\u0447\u0443\u0432\u043D\u0438\u0445 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+OptionPanel.Behaviour=\u041F\u043E\u043D\u0430\u0448\u0430\u045A\u0435
+OptionPanel.bezier=\u041B\u0430\u0433\u0430\u043D\u043E \u0437\u0430\u043A\u0440\u0438\u0432\u0459\u0435\u043D\u0430 (\u043A\u0440\u0438\u0432\u0443\u0459\u0430)
+OptionPanel.bubble=\u041E\u0431\u043B\u0430\u0447\u0438\u045B
+OptionPanel.ca=\u041A\u0430\u0442\u0430\u043B\u043E\u043D\u0441\u043A\u0438
+OptionPanel.Cancel=\u041E\u0442\u043A\u0430\u0436\u0438
+OptionPanel.center_selected_node=\u041E\u0434\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440 \u0443 \u0441\u0440\u0435\u0434\u0438\u0448\u0442\u0443 \u043F\u0440\u0438\u043A\u0430\u0437\u0430
+OptionPanel.check_updates_automatically=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u0437\u0430 \u043D\u0430\u0434\u043E\u0433\u0440\u0430\u0434\u045A\u0443 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430
+OptionPanel.childpattern=\u0428\u0430\u0431\u043B\u043E\u043D \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433
+OptionPanel.childpattern.tooltip=\u041E\u0434\u0430\u0431\u0440\u0430\u043D\u0438 \u0448\u0430\u0431\u043B\u043E\u043D \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u045B\u0435 \u0441\u0435 \u043D\u0430 \u0441\u0432\u0438\u043C \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438\u043C \u0447\u0432\u043E\u0440\u043E\u0432\u0438\u043C\u0430
+OptionPanel.clear_all_setters=\u041F\u0440\u0435\u043E\u043A\u0440\u0435\u043D\u0438 \u0441\u0432\u0435
+OptionPanel.clear_all_setters.tooltip=\u041E\u043C\u043E\u0433\u0443\u045B\u0443\u0458\u0435 \u0438\u043B\u0438 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0443\u0458\u0435 \u0441\u0432\u0435 \u0438\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0435.
+OptionPanel.cloud=\u041E\u0431\u043B\u0430\u0447\u0438\u045B
+OptionPanel.cloudcolor=\u0411\u043E\u0458\u0430 \u043E\u0431\u043B\u0430\u0447\u0438\u045B\u0430
+OptionPanel.cloudshape=\u041E\u0431\u043B\u0438\u043A \u043E\u0431\u043B\u0430\u0447\u0438\u045B\u0430
+OptionPanel.combined=\u041A\u043E\u043C\u0431\u0438\u043D\u043E\u0432\u0430\u043D\u043E
+OptionPanel.compare_as_number=\u0423\u043F\u043E\u0440\u0435\u0434\u0438 \u043A\u0430\u043E \u0431\u0440\u043E\u0458\u0435\u0432\u0435
+OptionPanel.convert_to_current_version=<html>\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u0440\u0435\u0442\u0432\u0430\u0440\u0430\u045A\u0435 \u043C\u0430\u043F\u0430 \u0441\u0442\u0430\u0440\u0438\u0445 \u0438\u0437\u0434\u0430\u045A\u0435 Freeplanea <br>\u0443 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0438\u0437\u0434\u0430\u045A\u0435?</html>
+OptionPanel.convert_to_current_version.tooltip=<html>\u0421\u0430\u043C\u043E \u0437\u0430 \u0432\u0440\u043B\u043E \u0432\u0435\u043B\u0438\u043A\u0435 \u043C\u0430\u043F\u0435 \u0437\u0430 \u043A\u043E\u0458\u0435 \u043D\u0438\u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u043F\u0440\u0435\u0442\u0432\u0430\u0440\u0430\u045A\u0435 <br>(\u0430 \u0437\u0430 \u0442\u043E \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0441\u0442\u0440\u0443\u0447\u043D\u043 [...]
+OptionPanel.cs=\u0427\u0435\u0448\u043A\u0438 / \u010Desky
+OptionPanel.cut_nodes_without_question=\u0418\u0441\u0435\u0446\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0435 \u0431\u0435\u0437 \u043F\u043E\u0442\u0432\u0440\u0434\u0435.
+OptionPanel.cut_nodes_without_question.tooltip=\u0410\u043A\u043E \u0458\u0435 \u043F\u043E\u0459\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E \u0447\u0432\u043E\u0440\u043E\u0432\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0438\u0437\u0440\u0435\u0437\u0430\u043D\u0438 \u0431\u0435\u0437 \u043F\u043E\u0442\u0432\u0440\u0434\u0435. \u041E\u0432\u043E \u043C\u043E\u0436\u0435 \u043F\u0440\u043E\u0443\u0437\u0440\u043E\u043A\u043E\u0432\u0430\u0442\u0438 \u0433\u0443\u0431\u043 [...]
+OptionPanel.da=\u0414\u0430\u043D\u0441\u043A\u0438 / dansk
+OptionPanel.date_format=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u0430\u0442\u0443\u043C\u0430
+OptionPanel.date_format.tooltip=\u0421\u0432\u0430\u043A\u0438 SHORT, MEDIUM, LONG \u0438\u043B\u0438 FULL \u0438\u043B\u0438 \u043A\u0430\u043E \u0448\u0430\u0431\u043B\u043E\u043D "MM/dd/yyyy"
+OptionPanel.datetime_format=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0432\u0440\u0435\u043C\u0435\u043D\u0430 \u0438 \u0434\u0430\u0442\u0443\u043C\u0430
+OptionPanel.datetime_format.tooltip=\u0421\u0432\u0430\u043A\u0438 <\u043E\u0431\u043B\u0438\u043A \u0434\u0430\u0442\u0443\u043C\u0430>,<\u043E\u0431\u043B\u0438\u043A \u0432\u0440\u0435\u043C\u0435\u043D\u0430> (\u0441\u0430 SHORT, MEDIUM, LONG \u0438\u043B\u0438 FULL \u043A\u0430\u043E \u0441\u0442\u0438\u043B) \u0438\u043B\u0438 \u043A\u0430\u043E \u043F\u0443\u043D \u0448\u0430\u0431\u043B\u043E\u043D "M/d/yyyy hh:mm"
+OptionPanel.de=\u041D\u0435\u043C\u0430\u0447\u043A\u0438 / Deutsch
+OptionPanel.default=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u043E
+OptionPanel.default_attribute_key_column_width=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u043A\u0459\u0443\u0447\u043D\u043D\u043E\u0433 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+OptionPanel.default_attribute_value_column_width=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+OptionPanel.default_browser_command_mac=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0438 \u043D\u0430\u0440\u0435\u0434\u0431\u0435\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u043D\u0438\u043A \u0437\u0430 Mac
+OptionPanel.default_browser_command_mac.tooltip=<html> \u0438 MAC: (\u0437\u0430\u0445\u0432\u0430\u0459\u0443\u0458\u0443\u045B\u0438 \u041D\u0438\u043A\u0443!)</html>
+OptionPanel.default_browser_command_other_os=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u0434\u0440\u0443\u0433\u043E\u0433 \u041E\u0421
+OptionPanel.default_browser_command_other_os.tooltip=<html> \u041E\u0432\u043E \u0458\u0435 \u0442\u0438\u043F\u0438\u0447\u043D\u043E \u0437\u0430 Linux:</html>
+OptionPanel.default_browser_command_windows_9x=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0438 \u043D\u0430\u0440\u0435\u0434\u0431\u0435\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u043D\u0438\u043A Windows 98
+OptionPanel.default_browser_command_windows_9x.tooltip=<html>\u0417\u0430 Windows 98 (\u0437\u043D\u0430\u0446\u0438 "" \u0441\u0443 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u0438 \u0437\u0431\u043E\u0433 \u0432\u0435\u0437\u0430, \u043A\u043E\u0458\u0435 \u0438\u043C\u0430\u0458\u0443 "=" \u0443 \u0441\u0432\u043E\u0458\u0435\u043C \u0423\u0420\u041B-\u0443).</html>
+OptionPanel.default_browser_command_windows_nt=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0438 \u043D\u0430\u0440\u0435\u0434\u0431\u0435\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u043D\u0438\u043A Windows Nt
+OptionPanel.default_browser_command_windows_nt.tooltip=<html>\u0417\u0430 Windows NT (\u0437\u043D\u0430\u0446\u0438 "" \u0441\u0443 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u0438 \u0437\u0431\u043E\u0433 \u0432\u0435\u0437\u0430, \u043A\u043E\u0458\u0435 \u0438\u043C\u0430\u0458\u0443 "=" \u0443 \u0441\u0432\u043E\u0458\u0435\u043C \u0423\u0420\u041B-\u0443).</html>
+OptionPanel.default_charset=\u0421\u043A\u0443\u043F \u0437\u043D\u0430\u043A\u043E\u0432\u0430
+OptionPanel.Defaults=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0435
+OptionPanel.delete_automatic_saves_at_exit=\u041A\u043E\u0434 \u0438\u0437\u043B\u0430\u0437\u0430 \u0438\u0437\u0431\u0440\u0438\u0448\u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435.
+OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> \u0410\u043A\u043E \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0442\u0440\u0435\u0431\u0430 \u0434\u0430 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0431\u0440\u0438\u0448\u0443 \u043F\u0440\u0438 \u043D\u043E\u0440\u043C\u0430\u043B\u043D\u043E\u043C \u0433\u0430\u0448\u0435\u045A\u0435\u045A\u0443 Freeplane, \u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0437\u043D\u0430\u043A \u0437\u0430 \u [...]
+OptionPanel.delete_nodes_without_question=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0435 \u0431\u0435\u0437 \u043F\u043E\u0442\u0432\u0440\u0434\u0435?
+OptionPanel.delete_nodes_without_question.tooltip=\u0410\u043A\u043E \u0458\u0435 \u043F\u043E\u0459\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E \u0447\u0432\u043E\u0440\u043E\u0432\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043E\u0431\u0440\u0438\u0441\u0430\u043D\u0438 \u0431\u0435\u0437 \u043F\u043E\u0442\u0432\u0440\u0434\u0435. \u041E\u0432\u043E \u043C\u043E\u0436\u0435 \u043F\u0440\u043E\u0443\u0437\u0440\u043E\u043A\u043E\u0432\u0430\u0442\u0438 \u0433\u0443\u0431\u [...]
+OptionPanel.disable_cursor_move_paper=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u043E\u043C\u0438\u0446\u0430\u045A\u0435 \u043F\u043E\u0434\u043B\u043E\u0433\u0435 \u043F\u043E\u043A\u0430\u0437\u0438\u0432\u0430\u0447\u0430
+OptionPanel.disable_cursor_move_paper.tooltip=<html>\u041D\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0443\u0458 \u043F\u043E\u043A\u0430\u0437\u0438\u0432\u0430\u0447 '\u043F\u043E\u043C\u0435\u0440\u0438' \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043F\u043E\u0432\u043B\u0430\u0447\u0435\u045A\u0430 \u043F\u043E\u0434\u043B\u043E\u0433\u0435 </html>
+OptionPanel.display_inline_editor_for_all_new_nodes=\u041F\u0440\u0438\u043A\u0430\u0437 \u0441\u0442\u0430\u0437\u0435 \u0443\u0440\u0435\u0434\u043D\u0438\u043A\u0430 \u0437\u0430 \u0441\u0432\u0435 \u043D\u043E\u0432\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+OptionPanel.display_node_id=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0418\u0414 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.edgecolor=\u0411\u043E\u0458\u0430 \u0440\u0443\u0431\u0430
+OptionPanel.edgecolor.tooltip=\u0421\u0432\u043E\u0458\u0441\u0442\u0432\u043E \u0440\u0443\u0431\u0430 \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430 (\u043F\u0440\u0438\u043C\u0435\u043D\u0438\u045B\u0435 \u0441\u0435 \u043D\u0430 \u0441\u0432\u0435 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435)
+OptionPanel.edgestyle=\u0421\u0442\u0438\u043B \u0440\u0443\u0431\u0430
+OptionPanel.edgestyle.tooltip=\u0421\u0432\u043E\u0458\u0441\u0442\u0432\u043E \u0440\u0443\u0431\u0430 \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430 (\u043F\u0440\u0438\u043C\u0435\u043D\u0438\u045B\u0435 \u0441\u0435 \u043D\u0430 \u0441\u0432\u0435 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435)
+OptionPanel.edgewidth=\u0428\u0438\u0440\u0438\u043D\u0430 \u0440\u0443\u0431\u0430
+OptionPanel.edgewidth.tooltip=\u0421\u0432\u043E\u0458\u0441\u0442\u0432\u043E \u0440\u0443\u0431\u0430 \u043D\u0430\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430 (\u043F\u0440\u0438\u043C\u0435\u043D\u0438\u045B\u0435 \u0441\u0435 \u043D\u0430 \u0441\u0432\u0435 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435)
+OptionPanel.EDIT_CURRENT=\u0417\u0430\u043C\u0435\u043D\u0438 \u0441\u0430\u0434\u0440\u0436\u0430\u0458
+OptionPanel.edit_on_double_click=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0435 \u043D\u0430 \u0434\u0432\u043E\u043A\u043B\u0438\u043A
+OptionPanel.editor_extra_width=\u0414\u043E\u0434\u0430\u0442\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u043A\u043E\u0440\u0430\u043A\u0430
+OptionPanel.editor_extra_width.tooltip=<html>\u041E\u0434\u0440\u0435\u0452\u0443\u0458\u0435 \u0431\u0440\u043E\u0458 \u0442\u0430\u0447\u043A\u0438\u0446\u0430 \u0434\u0430 \u043F\u043E\u0432\u0435\u045B\u0430 \u0448\u0438\u0440\u0438\u043D\u0443 \u0447\u0432\u043E\u0440\u0430 \u0430\u043A\u043E \u0442\u0435\u043A\u0441\u0442 \u043F\u0440\u0435\u043B\u0430\u0437\u0438 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0443 \u0448\u0438\u0440\u0438\u043D\u0443.</html>
+OptionPanel.el=\u0413\u0440\u0447\u043A\u0438 / \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC
+OptionPanel.el__buttons_above=\u0414\u0443\u0433\u043C\u0435 \u043D\u0430 \u0432\u0440\u0445\u0443 \u043F\u0440\u043E\u0437\u043E\u0440\u0430
+OptionPanel.el__enter_confirms_by_default=Enter \u0458\u0435 \u043F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u043F\u043E\u0442\u0432\u0440\u0434\u0430
+OptionPanel.el__max_default_window_height=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u043D\u0430\u0458\u0432\u0435\u045B\u0430 \u0432\u0438\u0441\u0438\u043D\u0430 \u043F\u0440\u043E\u0437\u043E\u0440\u0430
+OptionPanel.el__max_default_window_width=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u043D\u0430\u0458\u0432\u0435\u045B\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u043F\u0440\u043E\u0437\u043E\u0440\u0430
+OptionPanel.el__min_default_window_height=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u043D\u0430\u0458\u043C\u0430\u045A\u0430 \u0432\u0438\u0441\u0438\u043D\u0430 \u043F\u0440\u043E\u0437\u043E\u0440\u0430
+OptionPanel.el__min_default_window_width=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u043D\u0430\u0458\u043C\u0430\u045A\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u043F\u0440\u043E\u0437\u043E\u0440\u0430
+OptionPanel.el__position_window_below_node=\u041F\u043E\u0441\u0442\u0430\u0432\u0438\u0458 \u043F\u0440\u043E\u0437\u043E\u0440 \u0438\u0441\u043F\u043E\u0434 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.en=\u0415\u043D\u0433\u043B\u0435\u0441\u043A\u0438 / English
+OptionPanel.Environment=\u041E\u043A\u0440\u0443\u0436\u0435\u045A\u0435
+OptionPanel.es=\u0428\u043F\u0430\u043D\u0441\u043A\u0438, \u041A\u0430\u0441\u0442\u0438\u0459\u0441\u043A\u0438 / espa\u00F1ol, castellano
+OptionPanel.et=\u0415\u0441\u0442\u043E\u043D\u0441\u043A\u0438 / eesti, eesti keel
+OptionPanel.execute_scripts_without_asking=\u0418\u0437\u0432\u0440\u0448\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u0431\u0435\u0437 \u043F\u043E\u0442\u0432\u0440\u0434\u0435
+OptionPanel.execute_scripts_without_asking.tooltip=<html>\u0423 \u043F\u0440\u0438\u043D\u0446\u0438\u043F\u0443 Freeplane \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u043C\u043E\u0433\u0443 \u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0431\u0438\u043B\u043E \u043A\u0430\u043A\u0432\u0443 \u0430\u043A\u0446\u0438\u0458\u0443 \u043D\u0430 \u0432\u0430\u0448\u0435\u043C\u0443 \u0440\u0430\u0447\u0443\u043D\u0430\u0440\u0443. <br>\u0417\u0430\u0442\u043E \u043D\u0435 \u0431\u0438\u0441\u044 [...]
+OptionPanel.execute_scripts_without_exec_restriction=\u041E\u043C\u043E\u0433\u0443\u045B\u0438 \u0438\u0437\u0432\u0440\u0448\u0435\u045A\u0435 \u043E\u0441\u0442\u0430\u043B\u0438\u0445 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0430 (\u041D\u0418\u0408\u0415 \u043F\u0440\u0435\u043F\u043E\u0440\u0443\u0447\u0435\u043D\u043E)
+OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>\u0423\u043A\u043E\u043B\u0438\u043A\u043E Groovy \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u0442\u0440\u0435\u0431\u0430\u0458\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435\u043C \u043E\u0441\u0442\u0430\u043B\u0438\u0445 \u0430\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0430 (\u043D\u043F\u0440. \u043A\u0430\u043E \u043F\u0440\u043 [...]
+OptionPanel.execute_scripts_without_file_restriction=\u041E\u043C\u043E\u0433\u0443\u045B\u0438 \u0447\u0438\u0442\u0430\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 (\u041D\u0418\u0408\u0415 \u043F\u0440\u0435\u043F\u043E\u0440\u0443\u0447\u0435\u043D\u043E)
+OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>\u0423\u043A\u043E\u043B\u0438\u043A\u043E Groovy \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u0442\u0440\u0435\u0431\u0430\u0458\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u0442\u0438 \u0447\u0438\u0442\u0430\u045A\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 (\u043D\u043F\u0440. \u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0438, \u0437\u0430\u0442\u0432\u043E\u0440\u0438\u0442\u0438, \u0447\u0 [...]
+OptionPanel.execute_scripts_without_network_restriction=\u041E\u043C\u043E\u0433\u0443\u045B\u0438 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043C\u0440\u0435\u0436\u043D\u0438\u043C \u0440\u0435\u0441\u0443\u0440\u0441\u0438\u043C\u0430 (\u041D\u0418\u0408\u0415 \u043F\u0440\u0435\u043F\u043E\u0440\u0443\u0447\u0435\u043D\u043E)
+OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>\u0423\u043A\u043E\u043B\u0438\u043A\u043E Groovy \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u0442\u0440\u0435\u0431\u0430\u0458\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435\u043C \u043C\u0440\u0435\u0436\u043D\u0438\u0445 \u0430\u043A\u0446\u0438\u0458\u0430,<br>\u043C\u043E\u0440\u0430\u0442\u0435 \u043E\u043C\u043E\u0433\u0443\u045B\ [...]
+OptionPanel.execute_scripts_without_write_restriction=\u041E\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0438\u0441\u0430\u045A\u0435/\u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 (\u041D\u0418\u0408\u0415 \u043F\u0440\u0435\u043F\u043E\u0440\u0443\u0447\u0435\u043D\u043E)
+OptionPanel.execute_scripts_without_write_restriction.tooltip=<html><body>\u0423\u043A\u043E\u043B\u0438\u043A\u043E Groovy \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u0442\u0440\u0435\u0431\u0430\u0458\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u0442\u0438 \u0437\u0430\u043F\u0438\u0441\u0438\u0432\u0430\u045A\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 (\u043D\u043F\u0440. \u0437\u0430\u043F\u0438\u0441\u0430\u0442\u0438, \u043E\u0431\u0440\u0438\u0441\u0430\u04 [...]
+OptionPanel.experimental_file_locking_on=\u041F\u0440\u043E\u0431\u043D\u043E \u0458\u0435 \u0437\u0430\u0442\u0432\u0430\u0440\u0430\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435
+OptionPanel.experimental_file_locking_on.tooltip=<html> \u041F\u0440\u043E\u0431\u043D\u0435 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442\u0438</html>
+OptionPanel.export_icons_in_html=\u0418\u0437\u0432\u043E\u0437 \u0438\u043A\u043E\u043D\u0430 \u0443 HTML
+OptionPanel.export_icons_in_html.tooltip=<html> \u041F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u0443\u043A\u043E\u043B\u0438\u043A\u043E \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 HTML \u0438\u0437\u0432\u043E\u0437 \u0441\u0430\u0434\u0440\u0436\u0438 \u0438\u043A\u043E\u043D\u0435. \u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0432\u0435\u0437\u0430 \u043F\u0440\u0435\u043C\u0430 \u0438\u043A\u043E\u043D\u0430\u043C\u0430 \u0443 [...]
+OptionPanel.Files=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0435
+OptionPanel.first=\u041F\u0440\u0432\u0443
+OptionPanel.fold_on_click_inside=\u0421\u043B\u043E\u043F\u0438 \u043D\u0430 \u043A\u043B\u0438\u043A \u0443\u043D\u0443\u0442\u0440\u0430
+OptionPanel.foldingsymbolwidth=\u0421\u043A\u043B\u0430\u043F\u0430\u045A\u0435 \u0448\u0438\u0440\u0438\u043D\u0435 \u0441\u0438\u043C\u0431\u043E\u043B\u0430.
+OptionPanel.foldingsymbolwidth.tooltip=<html>\u0428\u0438\u0440\u0438\u043D\u0430 \u0441\u043A\u043B\u0430\u043F\u0430\u045A\u0435 \u043E\u0431\u0435\u043B\u0435\u0436\u0430\u0432\u0430\u045A\u0430 \u043A\u0440\u0443\u0433\u0430</html>
OptionPanel.fork=\u0420\u0430\u0447\u0432\u0430
-OptionPanel.format_locale=\u041b\u043e\u043a\u0430\u043b\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438
-OptionPanel.format_locale.tooltip=\u041b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0458\u0430 \u043f\u043e\u0434\u0435\u0448\u0430\u0432\u0430\u045a\u0435 \u0437\u0430 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u045a\u0435 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0443 \u043f\u043e\u0434\u0430\u0442\u0430\u043a\u0430
-OptionPanel.formula_disable_caching=\u041e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0438 \u043c\u0435\u043c\u043e\u0440\u0438\u0458\u0441\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0440 \u0437\u0430 \u0438\u0437\u0440\u0430\u0447\u0443\u043d\u0430\u0432\u0430\u045a\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0435
-OptionPanel.formula_disable_plugin=\u041e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0443 \u0444\u043e\u0440\u043c\u0443\u043b\u0435
-OptionPanel.fr=\u0424\u0440\u0430\u043d\u0446\u0443\u0441\u043a\u0438/ Fran\u00e7ais
-OptionPanel.gl=\u0413\u0430\u043b\u0438\u0446\u0438\u0458\u0441\u043a\u0438 / Galego
-OptionPanel.goto_note_end_on_edit=\u041f\u0440\u0435\u043c\u0435\u0441\u0442\u0438 \u043f\u043e\u043a\u0430\u0437\u0438\u0432\u0430\u0447 \u043d\u0430\u043f\u043e\u043c\u0435\u043d\u0435 \u043d\u0430 \u043a\u0440\u0430\u0458
-OptionPanel.grid_size=\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u043f\u0440\u0430\u0437\u043d\u0438\u043d\u0430 \u043c\u0440\u0435\u0436\u0435
+OptionPanel.format_locale=\u041B\u043E\u043A\u0430\u043B\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0438
+OptionPanel.format_locale.tooltip=\u041B\u043E\u043A\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0458\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u0437\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0430\u045A\u0435 \u0438 \u0430\u043D\u0430\u043B\u0438\u0437\u0443 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430
+OptionPanel.formula_disable_caching=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0441\u043A\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0437\u0430 \u0438\u0437\u0440\u0430\u0447\u0443\u043D\u0430\u0432\u0430\u045A\u0435 \u0444\u043E\u0440\u043C\u0443\u043B\u0435
+OptionPanel.formula_disable_plugin=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0440\u043E\u0446\u0435\u043D\u0443 \u0444\u043E\u0440\u043C\u0443\u043B\u0435
+OptionPanel.fr=\u0424\u0440\u0430\u043D\u0446\u0443\u0441\u043A\u0438/ Fran\u00E7ais
+OptionPanel.gl=\u0413\u0430\u043B\u0438\u0446\u0438\u0458\u0441\u043A\u0438 / Galego
+OptionPanel.goto_note_end_on_edit=\u041F\u0440\u0435\u043C\u0435\u0441\u0442\u0438 \u043F\u043E\u043A\u0430\u0437\u0438\u0432\u0430\u0447 \u043D\u0430\u043F\u043E\u043C\u0435\u043D\u0435 \u043D\u0430 \u043A\u0440\u0430\u0458
+OptionPanel.grid_size=\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430 \u043F\u0440\u0430\u0437\u043D\u0438\u043D\u0430 \u043C\u0440\u0435\u0436\u0435
OptionPanel.gtk=Gtk
-OptionPanel.hide_edge=\u0421\u043a\u0440\u0438\u0432\u0435\u043d\u0438 \u0440\u0443\u0431\u043e\u0432\u0438
-OptionPanel.highlight_formulas=\u0418\u0441\u0442\u0430\u043a\u043d\u0438\u0442\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u0443
-OptionPanel.horizontal=\u0412\u043e\u0434\u043e\u0440\u0430\u0432\u043d\u043e
-OptionPanel.hr=\u0425\u0440\u0432\u0430\u0442\u0441\u043a\u0438 / hrvatski
+OptionPanel.hide_edge=\u0421\u043A\u0440\u0438\u0432\u0435\u043D\u0438 \u0440\u0443\u0431\u043E\u0432\u0438
+OptionPanel.highlight_formulas=\u0418\u0441\u0442\u0430\u043A\u043D\u0438\u0442\u0435 \u0444\u043E\u0440\u043C\u0443\u043B\u0443
+OptionPanel.horizontal=\u0412\u043E\u0434\u043E\u0440\u0430\u0432\u043D\u043E
+OptionPanel.hr=\u0425\u0440\u0432\u0430\u0442\u0441\u043A\u0438 / hrvatski
OptionPanel.HTML=HTML
-OptionPanel.html_export_based_on_headings=\u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u043d\u0430\u0441\u043b\u043e\u0432\u0430
-OptionPanel.html_export_fold_all=\u0421\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435
-OptionPanel.html_export_fold_currently_folded=\u0421\u043a\u043b\u043e\u043f\u0438 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-OptionPanel.html_export_folding=\u0421\u043a\u043b\u0430\u043f\u0430\u045a\u0430 \u043f\u0440\u0438 \u0438\u0437\u0432\u043e\u0437\u0443 \u0443 HTML
-OptionPanel.html_export_no_folding=\u0411\u0435\u0437 \u0441\u043a\u043b\u0430\u043f\u0430\u045a\u0430 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.hu=\u041c\u0430\u0452\u0430\u0440\u0441\u043a\u0438 / Magyar
-OptionPanel.ic_disable=\u041e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0438
-OptionPanel.ic_file=\u0423\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435 \u0434\u0438\u0441\u043a
-OptionPanel.ic_ram=\u0423 \u0420\u0410\u041c-\u0443
-OptionPanel.icon=\u0418\u043a\u043e\u043d\u0430
-OptionPanel.icon.tooltip=\u041d\u0430\u043a\u043e\u043d \u043f\u0440\u0438\u043c\u0435\u043d\u0435 \u0447\u0432\u043e\u0440 \u045b\u0435 \u0438\u043c\u0430\u0442\u0438 \u043e\u0432\u0443 \u0438\u043a\u043e\u043d\u0443.
-OptionPanel.icons.list=\u0421\u043f\u0438\u0441\u0430\u043a \u043f\u0440\u0438\u043a\u0430\u0437\u0430\u043d\u0438\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438\u0445 \u0438\u043a\u043e\u043d\u0430
-OptionPanel.icons.list.tooltip=\u041e\u0432\u0434\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u0438 \u0432\u043b\u0430\u0441\u0442\u0438\u0442\u0438 \u0440\u0430\u0441\u043f\u043e\u0440\u0435\u0434 \u0438\u043a\u043e\u043d\u0430 \u0438\u043b\u0438 \u043e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0438 \u043f\u0440\u0438\u043a\u0430\u0437 \u0438\u043a\u043e\u043d\u0430. \u0418\u043a\u043e\u043d\u0435 \u0442\u0440\u0435\u0431\u043 [...]
-OptionPanel.id=\u0418\u043d\u0434\u043e\u043d\u0435\u0436\u0430\u043d\u0441\u043a\u0438 / Bahasa Indonesia
-OptionPanel.IGNORE=\u041d\u0435 \u0447\u0438\u043d\u0438 \u043d\u0438\u0448\u0442\u0430
-OptionPanel.il__enter_confirms_by_default=Enter \u043a\u0430\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0430 \u043f\u043e\u0442\u0432\u0440\u0434\u0430 \u0443\u043d\u043e\u0441\u0430
-OptionPanel.image_cache=\u0437\u0430 \u0441\u043b\u0438\u043a\u0435
-OptionPanel.it=\u0418\u0442\u0430\u043b\u0438\u0458\u0430\u043d\u0441\u043a\u0438 / Italiano
-OptionPanel.ja=\u0408\u0430\u043f\u0430\u043d\u0441\u043a\u0438 / \u65e5\u672c\u8a9e
-OptionPanel.key_type_action=\u0423\u043d\u043e\u0441 \u0442\u0430\u0441\u0442\u0435\u0440\u043e\u043c:
-OptionPanel.Keystrokes=\u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0435 \u043f\u0440\u0435\u0447\u0438\u0446\u0435
-OptionPanel.ko=\u041a\u043e\u0440\u0435\u0458\u0441\u043a\u0438 / \ud55c\uad6d\uc5b4 (\u97d3\u570b\u8a9e), \uc870\uc120\ub9d0 (\u671d\u9bae\u8a9e)
-OptionPanel.label_font_family=\u041e\u0431\u043b\u0438\u043a \u0441\u043b\u043e\u0432\u0430
-OptionPanel.label_font_size=\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430
-OptionPanel.language=\u0408\u0435\u0437\u0438\u043a
-OptionPanel.language.tooltip=<html>\u041e\u0432\u043e \u0458\u0435 \u0458\u0435\u0437\u0438\u043a \u043a\u043e\u0458\u0438 \u045b\u0435 \u0431\u0438\u0442\u0438 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u0459\u0435\u043d \u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0443. \u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0430 '\u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e' \u043f\u043e\u043a\u0443\u0448\u0430\u0432\u0430 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0442\u0 [...]
-OptionPanel.last=\u041f\u043e\u0441\u043b\u0435\u0434\u045a\u0438
-OptionPanel.last_opened_list_length=\u0421\u043f\u0438\u0441\u0430\u043a \u0437\u0430\u0434\u045a\u0435 \u043e\u0442\u0432\u0430\u0440\u0430\u043d\u0438\u0445 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-OptionPanel.layout_map_on_text_change=\u0418\u0437\u0433\u043b\u0435\u0434 \u043c\u0430\u043f\u0435 \u0443 \u0442\u043e\u043a\u0443 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u045a\u0430
-OptionPanel.layout_map_on_text_change.tooltip=\u041e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0438 \u0437\u0430 \u0431\u043e\u0459\u0435 \u043a\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0435
-OptionPanel.linear=\u041b\u0438\u043d\u0435\u0430\u0440\u043d\u043e
+OptionPanel.html_export_based_on_headings=\u041D\u0430 \u043E\u0441\u043D\u043E\u0432\u0443 \u043D\u0430\u0441\u043B\u043E\u0432\u0430
+OptionPanel.html_export_fold_all=\u0421\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435
+OptionPanel.html_export_fold_currently_folded=\u0421\u043A\u043B\u043E\u043F\u0438 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+OptionPanel.html_export_folding=\u0421\u043A\u043B\u0430\u043F\u0430\u045A\u0430 \u043F\u0440\u0438 \u0438\u0437\u0432\u043E\u0437\u0443 \u0443 HTML
+OptionPanel.html_export_no_folding=\u0411\u0435\u0437 \u0441\u043A\u043B\u0430\u043F\u0430\u045A\u0430 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.hu=\u041C\u0430\u0452\u0430\u0440\u0441\u043A\u0438 / Magyar
+OptionPanel.ic_disable=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438
+OptionPanel.ic_file=\u0423\u043F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435 \u0434\u0438\u0441\u043A
+OptionPanel.ic_ram=\u0423 \u0420\u0410\u041C-\u0443
+OptionPanel.icon=\u0418\u043A\u043E\u043D\u0430
+OptionPanel.icon.tooltip=\u041D\u0430\u043A\u043E\u043D \u043F\u0440\u0438\u043C\u0435\u043D\u0435 \u0447\u0432\u043E\u0440 \u045B\u0435 \u0438\u043C\u0430\u0442\u0438 \u043E\u0432\u0443 \u0438\u043A\u043E\u043D\u0443.
+OptionPanel.icons.list=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u0438\u0445 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438\u0445 \u0438\u043A\u043E\u043D\u0430
+OptionPanel.icons.list.tooltip=\u041E\u0432\u0434\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0438 \u0432\u043B\u0430\u0441\u0442\u0438\u0442\u0438 \u0440\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u0438\u043A\u043E\u043D\u0430 \u0438\u043B\u0438 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0438 \u043F\u0440\u0438\u043A\u0430\u0437 \u0438\u043A\u043E\u043D\u0430. \u0418\u043A\u043E\u043D\u0435 \u0442\u0440\u0435\u0431\u043 [...]
+OptionPanel.id=\u0418\u043D\u0434\u043E\u043D\u0435\u0436\u0430\u043D\u0441\u043A\u0438 / Bahasa Indonesia
+OptionPanel.IGNORE=\u041D\u0435 \u0447\u0438\u043D\u0438 \u043D\u0438\u0448\u0442\u0430
+OptionPanel.il__enter_confirms_by_default=Enter \u043A\u0430\u043E \u043F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u043F\u043E\u0442\u0432\u0440\u0434\u0430 \u0443\u043D\u043E\u0441\u0430
+OptionPanel.image_cache=\u0437\u0430 \u0441\u043B\u0438\u043A\u0435
+OptionPanel.it=\u0418\u0442\u0430\u043B\u0438\u0458\u0430\u043D\u0441\u043A\u0438 / Italiano
+OptionPanel.ja=\u0408\u0430\u043F\u0430\u043D\u0441\u043A\u0438 / \u65E5\u672C\u8A9E
+OptionPanel.key_type_action=\u0423\u043D\u043E\u0441 \u0442\u0430\u0441\u0442\u0435\u0440\u043E\u043C:
+OptionPanel.Keystrokes=\u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0435 \u043F\u0440\u0435\u0447\u0438\u0446\u0435
+OptionPanel.ko=\u041A\u043E\u0440\u0435\u0458\u0441\u043A\u0438 / \uD55C\uAD6D\uC5B4 (\u97D3\u570B\u8A9E), \uC870\uC120\uB9D0 (\u671D\u9BAE\u8A9E)
+OptionPanel.label_font_family=\u041E\u0431\u043B\u0438\u043A \u0441\u043B\u043E\u0432\u0430
+OptionPanel.label_font_size=\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430 \u0441\u043B\u043E\u0432\u0430
+OptionPanel.language=\u0408\u0435\u0437\u0438\u043A
+OptionPanel.language.tooltip=<html>\u041E\u0432\u043E \u0458\u0435 \u0458\u0435\u0437\u0438\u043A \u043A\u043E\u0458\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0459\u0435\u043D \u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443. \u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0430 '\u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E' \u043F\u043E\u043A\u0443\u0448\u0430\u0432\u0430 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0442\u0 [...]
+OptionPanel.last=\u041F\u043E\u0441\u043B\u0435\u0434\u045A\u0438
+OptionPanel.last_opened_list_length=\u0421\u043F\u0438\u0441\u0430\u043A \u0437\u0430\u0434\u045A\u0435 \u043E\u0442\u0432\u0430\u0440\u0430\u043D\u0438\u0445 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+OptionPanel.layout_map_on_text_change=\u0418\u0437\u0433\u043B\u0435\u0434 \u043C\u0430\u043F\u0435 \u0443 \u0442\u043E\u043A\u0443 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0430
+OptionPanel.layout_map_on_text_change.tooltip=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u0437\u0430 \u0431\u043E\u0459\u0435 \u043A\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043A\u0435
+OptionPanel.linear=\u041B\u0438\u043D\u0435\u0430\u0440\u043D\u043E
OptionPanel.links=\u0412\u0435\u0437\u0435
-OptionPanel.links.tooltip=<html>\u041f\u043e\u0441\u0442\u0430\u0432\u0459\u0430\u045a\u0435 \u0432\u0435\u0437\u0430 \u043a\u0430\u043e \u0440\u0435\u043b\u0430\u0442\u0438\u0432\u043d\u0435 \u0438\u043b\u0438 \u0430\u043f\u0441\u043e\u043b\u0443\u0442\u043d\u0435 </html>
-OptionPanel.load_folding=\u041f\u0440\u0438 \u0443\u0447\u0438\u0442\u0430\u0432\u0430\u045a\u0443
-OptionPanel.load_folding_from_map_default_fold_all=\u0423\u0447\u0438\u0442\u0430\u0458 \u0438\u0437 \u043c\u0430\u043f\u0435 \u0438\u043b\u0438 \u0441\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435
-OptionPanel.load_folding_from_map_default_unfold_all=\u0423\u0447\u0438\u0442\u0430\u0458 \u0438\u0437 \u043c\u0430\u043f\u0435 \u0438\u043b\u0438 \u0440\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435
-OptionPanel.load_last_map=\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u043e\u0442\u0432\u043e\u0440\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0443 \u043c\u0430\u043f\u0443
-OptionPanel.load_last_map.tooltip=<html>\u0410\u043a\u043e \u0458\u0435 \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043e, Freeplane \u045b\u0435 \u043f\u0440\u0438\u043b\u0438\u043a\u043e\u043c \u043f\u043e\u043a\u0440\u0435\u0442\u0430\u045a\u0430 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u043e\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0443 \u043a\u043e\u0440\u0438\u0448\u045b\u0435\u043d\u0443 \u043c\u0430\u043f\u0443.</html>
-OptionPanel.load_last_maps=\u0423\u0447\u0438\u0442\u0430\u0458 \u0441\u0432\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0435 \u043c\u0430\u043f\u0435
-OptionPanel.lookandfeel=\u0418\u0437\u0433\u043b\u0435\u0434 \u0438 \u043e\u0441\u0435\u045b\u0430\u0458
-OptionPanel.lookandfeel.tooltip=<html>'\u0418\u0437\u0433\u043b\u0435\u0434 \u0438 \u043e\u0441\u0435\u045b\u0430\u0458' \u043a\u043e\u0458\u0438 \u045b\u0435 \u0431\u0438\u0442\u0438 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u0459\u0435\u043d\u0438. \u041f\u043e\u0434\u0440\u0436\u0430\u043d\u0438 \u0441\u0443 '\u043c\u0435\u0442\u0430\u043b','windows','\u043c\u043e\u0442\u0438\u0432', 'gtk' , 'mac' \u0458\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430\u043d \u0441\u0430\u043c\u043e [...]
-OptionPanel.lt=\u041b\u0438\u0442\u0432\u0430\u043d\u0441\u043a\u0438 / kalba
-OptionPanel.max_displayed_node_count=\u041d\u0430\u0458\u0432\u0435\u045b\u0438 \u0431\u0440\u043e\u0458 \u043f\u0440\u0438\u043a\u0430\u0437\u0430\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-OptionPanel.max_image_width=\u041d\u0430\u0458\u0432. \u0448\u0438\u0440\u0438\u043d\u0430 \u043f\u043e\u0447\u0435\u0442\u043d\u0435 \u0441\u043b\u0438\u043a\u0435
-OptionPanel.max_image_width.tooltip=\u041d\u043e\u0432\u0435 \u0441\u043b\u0438\u043a\u0435 \u0441\u0435 \u0441\u043c\u0430\u045a\u0443\u0458\u0435 \u043d\u0430 \u043e\u0432\u0443 \u0448\u0438\u0440\u0438\u043d\u0443
-OptionPanel.max_menu_item_count=\u041d\u0430\u0458\u0432. \u0431\u0440\u043e\u0458 \u0441\u0442\u0430\u0432\u043a\u0438 \u0443 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0443
-OptionPanel.max_menu_item_count.tooltip=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u045a\u0435 \u0431\u0440\u043e\u0458\u0430 \u0441\u0442\u0430\u0432\u043a\u0438 \u0430\u043a\u043e \u0458\u0435 \u0458\u0435\u0434\u0430\u043d \u043f\u043e\u0434\u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a, \u043d\u0430\u0458\u043c\u0430\u045a\u0435 10
-OptionPanel.max_node_width=\u041d\u0430\u0458\u0432\u0435\u045b\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.max_node_width.tooltip=<html>\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0430 \u043d\u0430\u0458\u0432\u0435\u045b\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u0447\u0432\u043e\u0440\u0430 \u0443 \u0442\u0430\u0447\u043a\u0438\u0446\u0430\u043c\u0430</html>
-OptionPanel.max_shortened_text_length=\u041d\u0430\u0458\u0432\u0435\u045b\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u0441\u043a\u0440\u0430\u045b\u0435\u043d\u043e\u0433 \u0442\u0435\u043a\u0441\u0442\u0430
-OptionPanel.metal=\u041c\u0435\u0442\u0430\u043b
-OptionPanel.min_node_width=\u041d\u0430\u0458\u043c. \u0448\u0438\u0440\u0438\u043d\u0430 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.motif=\u041c\u043e\u0442\u0438\u0432
-OptionPanel.nb=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0438 / Norsk bokm\u00e5l
-OptionPanel.never_save_folding=\u041d\u0438\u043a\u0430\u0434\u0430
-OptionPanel.nl=\u0425\u043e\u043b\u0430\u043d\u0434\u0441\u043a\u0438, \u0424\u043b\u0430\u043c\u0430\u043d\u0441\u043a\u0438 / Nederlands, Vlaams
-OptionPanel.nn=\u041d\u043e\u0440\u0432\u0435\u0448\u043a\u0438 / Norsk nynorsk
-OptionPanel.nodebackgroundcolor=\u041f\u043e\u0437\u0430\u0434\u0438\u043d\u0430
-OptionPanel.nodebackgroundcolor.tooltip=\u041f\u043e\u0437\u0430\u0434\u0438\u043d\u0430 \u0447\u0432\u043e\u0440\u0430 \u043a\u0430\u0434 \u043d\u0438\u0458\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043d.
-OptionPanel.nodecolor=\u0422\u0435\u043a\u0441\u0442
-OptionPanel.nodecolor.tooltip=\u0411\u043e\u0458\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0447\u0432\u043e\u0440\u0430 \u043a\u0430\u0434\u0430 \u043d\u0438\u0458\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043d.
-OptionPanel.nodefontbold=\u041f\u043e\u0434\u0435\u0431\u0459\u0430\u043d\u043e
-OptionPanel.nodefonthyperlink=\u0425\u0438\u043f\u0435\u0440\u0432\u0435\u0437\u0430
-OptionPanel.nodefontitalic=\u0418\u0441\u043a\u043e\u0448\u0435\u043d\u043e
-OptionPanel.nodefontname=\u041e\u0431\u043b\u0438\u043a \u0441\u043b\u043e\u0432\u0430
-OptionPanel.nodefontsize=\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430
-OptionPanel.nodeformat=\u0424\u043e\u0440\u043c\u0430\u0442
-OptionPanel.nodeformat.tooltip=<html>\u0417\u0430\u043c\u0435\u043d\u0430 \u0438 / \u0438\u043b\u0438 \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u045a\u0435 \u0442\u0435\u043a\u0441\u0442\u0430.<ul><li><em>\u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0448\u0438\u0440\u0435\u045a\u0430</em> (<tt>%s</tt> \u0458\u0435 \u0438\u0437\u0432\u043e\u0440\u043d\u0438 \u0442\u0435\u043a\u0441\u0442), \u043d\u043f\u0440. <tt>\u041e\u041f\u0420\u0415\u0417: %s</tt><li><em>\u0424\u04 [...]
-OptionPanel.nodenumbering=\u041d\u0443\u043c\u0435\u0440\u0438\u0441\u0430\u045a\u0435 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.nodenumbering.tooltip=\u0414\u043e\u0434\u0430\u0458\u0435 \u0441\u0435\u0440\u0438\u0458\u0441\u043a\u0438 \u0431\u0440\u043e\u0458 (\u043d\u043f\u0440. 1.3.1) \u0443 \u0442\u0435\u043a\u0441\u0442 \u0447\u0432\u043e\u0440\u0430.
-OptionPanel.nodeshape=\u0421\u0442\u0438\u043b \u0447\u0432\u043e\u0440\u0430
-OptionPanel.nodeshape.tooltip=<html>\u0421\u0442\u0438\u043b \u043e\u043f\u0438\u0441\u0443\u0458\u0435 \u0441\u043f\u043e\u0459\u045a\u0438 \u043e\u0431\u043b\u0438\u043a \u0447\u0432\u043e\u0440\u0430. <br>\u041c\u043e\u0433\u0443\u045b\u0435 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438:<br><table border="1"><tr><td>\u0420\u0430\u0447\u0432\u0430: </td><td> \u0447\u0432\u043e\u0440 \u0431\u0435\u0437 \u0440\u0443\u0431\u0430,</td></tr><tr><td>\u041c\u0435\u0445\u0443\u0440\u0 [...]
-OptionPanel.nodetext=\u0421\u0440\u0436 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.nodetext.tooltip=\u041e\u0432\u0434\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0434\u0440\u0435\u0434\u0438\u0442\u0438 \u0442\u0435\u043a\u0441\u0442 \u0447\u0432\u043e\u0440\u043e\u0432\u0430. \u041a\u043e\u0440\u0438\u0448\u045b\u0435\u045a\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u0438 \u0442\u0435\u043a\u0441\u0442 \u0458\u0435 \u043e\u0434\u0431\u0430\u0447\u0435\u043d.
-OptionPanel.nothing=\u041d\u0438\u0448\u0442\u0430
-OptionPanel.number_format=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0431\u0440\u043e\u0458\u0430
-OptionPanel.number_format.tooltip=\u0421\u0430\u0434\u0440\u0436\u0438 \u0448\u0430\u0431\u043b\u043e\u043d '#' \u0437\u0430 \u0438\u0437\u0431\u043e\u0440\u043d\u0438 \u0438\u043b\u0438 '0' \u0437\u0430 \u043e\u0431\u0430\u0432\u0435\u0437\u043d\u0435 \u0446\u0438\u0444\u0430\u0440\u0435. \u041f\u0440\u0438\u043c\u0435\u0440\u0438: "0.00", "0.0%", "$#.00", "#0"
-OptionPanel.number_of_different_files_for_automatic_save=\u0411\u0440\u043e\u0458 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u043a\u043e\u0458\u0435 \u045b\u0435 \u0431\u0438\u0442\u0438 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0435
-OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> \u0411\u0440\u043e\u0458 n \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0442\u0438\u0445 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0443 \u043a\u043e\u0458\u0435 \u0441\u0435 \u0447\u0443\u0432\u0430\u0458\u0443 \u043c\u0430\u043f\u0435. \u041f\u0440\u0432\u043e \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e \u0447\u0443\u0432\u0430\u045a\u0435 \u0441\u0435 \u0438\u0437\u0432\u043e\u0434\u0438 \u [...]
+OptionPanel.links.tooltip=<html>\u041F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0435 \u0432\u0435\u0437\u0430 \u043A\u0430\u043E \u0440\u0435\u043B\u0430\u0442\u0438\u0432\u043D\u0435 \u0438\u043B\u0438 \u0430\u043F\u0441\u043E\u043B\u0443\u0442\u043D\u0435 </html>
+OptionPanel.load_folding=\u041F\u0440\u0438 \u0443\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0443
+OptionPanel.load_folding_from_map_default_fold_all=\u0423\u0447\u0438\u0442\u0430\u0458 \u0438\u0437 \u043C\u0430\u043F\u0435 \u0438\u043B\u0438 \u0441\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435
+OptionPanel.load_folding_from_map_default_unfold_all=\u0423\u0447\u0438\u0442\u0430\u0458 \u0438\u0437 \u043C\u0430\u043F\u0435 \u0438\u043B\u0438 \u0440\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435
+OptionPanel.load_last_map=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043E\u0442\u0432\u043E\u0440\u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0443 \u043C\u0430\u043F\u0443
+OptionPanel.load_last_map.tooltip=<html>\u0410\u043A\u043E \u0458\u0435 \u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E, Freeplane \u045B\u0435 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0443 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u043D\u0443 \u043C\u0430\u043F\u0443.</html>
+OptionPanel.load_last_maps=\u0423\u0447\u0438\u0442\u0430\u0458 \u0441\u0432\u0435 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0435 \u043C\u0430\u043F\u0435
+OptionPanel.lookandfeel=\u0418\u0437\u0433\u043B\u0435\u0434 \u0438 \u043E\u0441\u0435\u045B\u0430\u0458
+OptionPanel.lookandfeel.tooltip=<html>'\u0418\u0437\u0433\u043B\u0435\u0434 \u0438 \u043E\u0441\u0435\u045B\u0430\u0458' \u043A\u043E\u0458\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0459\u0435\u043D\u0438. \u041F\u043E\u0434\u0440\u0436\u0430\u043D\u0438 \u0441\u0443 '\u043C\u0435\u0442\u0430\u043B','windows','\u043C\u043E\u0442\u0438\u0432', 'gtk' , 'mac' \u0458\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0430\u043D \u0441\u0430\u043C\u043E [...]
+OptionPanel.lt=\u041B\u0438\u0442\u0432\u0430\u043D\u0441\u043A\u0438 / kalba
+OptionPanel.max_displayed_node_count=\u041D\u0430\u0458\u0432\u0435\u045B\u0438 \u0431\u0440\u043E\u0458 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+OptionPanel.max_image_width=\u041D\u0430\u0458\u0432. \u0448\u0438\u0440\u0438\u043D\u0430 \u043F\u043E\u0447\u0435\u0442\u043D\u0435 \u0441\u043B\u0438\u043A\u0435
+OptionPanel.max_image_width.tooltip=\u041D\u043E\u0432\u0435 \u0441\u043B\u0438\u043A\u0435 \u0441\u0435 \u0441\u043C\u0430\u045A\u0443\u0458\u0435 \u043D\u0430 \u043E\u0432\u0443 \u0448\u0438\u0440\u0438\u043D\u0443
+OptionPanel.max_menu_item_count=\u041D\u0430\u0458\u0432. \u0431\u0440\u043E\u0458 \u0441\u0442\u0430\u0432\u043A\u0438 \u0443 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0443
+OptionPanel.max_menu_item_count.tooltip=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u045A\u0435 \u0431\u0440\u043E\u0458\u0430 \u0441\u0442\u0430\u0432\u043A\u0438 \u0430\u043A\u043E \u0458\u0435 \u0458\u0435\u0434\u0430\u043D \u043F\u043E\u0434\u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A, \u043D\u0430\u0458\u043C\u0430\u045A\u0435 10
+OptionPanel.max_node_width=\u041D\u0430\u0458\u0432\u0435\u045B\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.max_node_width.tooltip=<html>\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u043D\u0430\u0458\u0432\u0435\u045B\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0447\u0432\u043E\u0440\u0430 \u0443 \u0442\u0430\u0447\u043A\u0438\u0446\u0430\u043C\u0430</html>
+OptionPanel.max_shortened_text_length=\u041D\u0430\u0458\u0432\u0435\u045B\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0441\u043A\u0440\u0430\u045B\u0435\u043D\u043E\u0433 \u0442\u0435\u043A\u0441\u0442\u0430
+OptionPanel.metal=\u041C\u0435\u0442\u0430\u043B
+OptionPanel.min_node_width=\u041D\u0430\u0458\u043C. \u0448\u0438\u0440\u0438\u043D\u0430 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.motif=\u041C\u043E\u0442\u0438\u0432
+OptionPanel.nb=\u041D\u043E\u0440\u0432\u0435\u0448\u043A\u0438 / Norsk bokm\u00E5l
+OptionPanel.never_save_folding=\u041D\u0438\u043A\u0430\u0434\u0430
+OptionPanel.nl=\u0425\u043E\u043B\u0430\u043D\u0434\u0441\u043A\u0438, \u0424\u043B\u0430\u043C\u0430\u043D\u0441\u043A\u0438 / Nederlands, Vlaams
+OptionPanel.nn=\u041D\u043E\u0440\u0432\u0435\u0448\u043A\u0438 / Norsk nynorsk
+OptionPanel.nodebackgroundcolor=\u041F\u043E\u0437\u0430\u0434\u0438\u043D\u0430
+OptionPanel.nodebackgroundcolor.tooltip=\u041F\u043E\u0437\u0430\u0434\u0438\u043D\u0430 \u0447\u0432\u043E\u0440\u0430 \u043A\u0430\u0434 \u043D\u0438\u0458\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D.
+OptionPanel.nodecolor=\u0422\u0435\u043A\u0441\u0442
+OptionPanel.nodecolor.tooltip=\u0411\u043E\u0458\u0430 \u0442\u0435\u043A\u0441\u0442\u0430 \u0447\u0432\u043E\u0440\u0430 \u043A\u0430\u0434\u0430 \u043D\u0438\u0458\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D.
+OptionPanel.nodefontbold=\u041F\u043E\u0434\u0435\u0431\u0459\u0430\u043D\u043E
+OptionPanel.nodefonthyperlink=\u0425\u0438\u043F\u0435\u0440\u0432\u0435\u0437\u0430
+OptionPanel.nodefontitalic=\u0418\u0441\u043A\u043E\u0448\u0435\u043D\u043E
+OptionPanel.nodefontname=\u041E\u0431\u043B\u0438\u043A \u0441\u043B\u043E\u0432\u0430
+OptionPanel.nodefontsize=\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430 \u0441\u043B\u043E\u0432\u0430
+OptionPanel.nodeformat=\u0424\u043E\u0440\u043C\u0430\u0442
+OptionPanel.nodeformat.tooltip=<html>\u0417\u0430\u043C\u0435\u043D\u0430 \u0438 / \u0438\u043B\u0438 \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435 \u0442\u0435\u043A\u0441\u0442\u0430.<ul><li><em>\u0428\u0430\u0431\u043B\u043E\u043D \u043F\u0440\u043E\u0448\u0438\u0440\u0435\u045A\u0430</em> (<tt>%s</tt> \u0458\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u0438 \u0442\u0435\u043A\u0441\u0442), \u043D\u043F\u0440. <tt>\u041E\u041F\u0420\u0415\u0417: %s</tt><li><em>\u0424\u04 [...]
+OptionPanel.nodenumbering=\u041D\u0443\u043C\u0435\u0440\u0438\u0441\u0430\u045A\u0435 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.nodenumbering.tooltip=\u0414\u043E\u0434\u0430\u0458\u0435 \u0441\u0435\u0440\u0438\u0458\u0441\u043A\u0438 \u0431\u0440\u043E\u0458 (\u043D\u043F\u0440. 1.3.1) \u0443 \u0442\u0435\u043A\u0441\u0442 \u0447\u0432\u043E\u0440\u0430.
+OptionPanel.nodetext=\u0421\u0440\u0436 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.nodetext.tooltip=\u041E\u0432\u0434\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043E\u0434\u0440\u0435\u0434\u0438\u0442\u0438 \u0442\u0435\u043A\u0441\u0442 \u0447\u0432\u043E\u0440\u043E\u0432\u0430. \u041A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435\u043C \u0448\u0430\u0431\u043B\u043E\u043D\u0430 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0438 \u0442\u0435\u043A\u0441\u0442 \u0458\u0435 \u043E\u0434\u0431\u0430\u0447\u0435\u043D.
+OptionPanel.nothing=\u041D\u0438\u0448\u0442\u0430
+OptionPanel.number_format=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0431\u0440\u043E\u0458\u0430
+OptionPanel.number_format.tooltip=\u0421\u0430\u0434\u0440\u0436\u0438 \u0448\u0430\u0431\u043B\u043E\u043D '#' \u0437\u0430 \u0438\u0437\u0431\u043E\u0440\u043D\u0438 \u0438\u043B\u0438 '0' \u0437\u0430 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u0435 \u0446\u0438\u0444\u0430\u0440\u0435. \u041F\u0440\u0438\u043C\u0435\u0440\u0438: "0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_of_different_files_for_automatic_save=\u0411\u0440\u043E\u0458 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043A\u043E\u0458\u0435 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0435
+OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> \u0411\u0440\u043E\u0458 n \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0442\u0438\u0445 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0443 \u043A\u043E\u0458\u0435 \u0441\u0435 \u0447\u0443\u0432\u0430\u0458\u0443 \u043C\u0430\u043F\u0435. \u041F\u0440\u0432\u043E \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u0447\u0443\u0432\u0430\u045A\u0435 \u0441\u0435 \u0438\u0437\u0432\u043E\u0434\u0438 \u [...]
OptionPanel.OK=\u0421\u0430\u0447\u0443\u0432\u0430\u0458
-OptionPanel.org.freeplane.plugin.bugreport=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430
-OptionPanel.org.freeplane.plugin.bugreport.allowed=\u0423\u0432\u0435\u043a \u0448\u0430\u0459\u0438
-OptionPanel.org.freeplane.plugin.bugreport.ask=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0434\u0438\u0458\u0430\u043b\u043e\u0448\u043a\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458
-OptionPanel.org.freeplane.plugin.bugreport.denied=\u041d\u0438\u043a\u0430\u0434 \u043d\u0435 \u0448\u0430\u0459\u0438
-OptionPanel.org.freeplane.plugin.bugreport.userid=\u041f\u043e \u0432\u043e\u0459\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0458\u0430 \u0434\u0430 \u0431\u0443\u0434\u0443 \u043f\u043e\u0441\u043b\u0430\u0442\u0430
-OptionPanel.outline_hgap=\u0412\u043e\u0434\u043e\u0440\u0430\u0432\u043d\u0438 \u0440\u0430\u0437\u043c\u0430\u043a
-OptionPanel.outline_vgap=\u0423\u0441\u043f\u0440\u0430\u0432\u043d\u0438 \u0440\u0430\u0437\u043c\u0430\u043a
-OptionPanel.paint_connectors_behind=\u0426\u0440\u0442\u0430\u0458 \u043f\u043e\u0432\u0435\u0437\u043d\u0438\u043a \u0438\u0437\u0430 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-OptionPanel.parse_data=\u041f\u0440\u0435\u043f\u043e\u0437\u043d\u0430\u0458 \u0443\u043d\u043e\u0441 \u0431\u0440\u043e\u0458\u0435\u0432\u0430, \u0434\u0430\u0442\u0443\u043c - \u0432\u0440\u0435\u043c\u0435
-OptionPanel.parse_data.tooltip=\u041f\u0440\u043e\u0433\u0440\u0430\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0430 \u0443\u043d\u043e\u0441 \u0434\u0430\u0442\u0443\u043c\u0430, \u0434\u0430\u0442\u0443\u043c\u0430-\u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0438 \u0431\u0440\u043e\u0458\u0435\u0432\u0430 \u0438 \u043f\u0440\u0438\u043c\u0435\u045a\u0443\u0458\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u041f\u0 [...]
-OptionPanel.parse_dates=\u041f\u0440\u0435\u043f\u043e\u0437\u043d\u0430\u0458 \u0443\u043d\u043e\u0441 \u0434\u0430\u0442\u0443\u043c\u0430 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430
-OptionPanel.parse_dates.tooltip=\u041f\u0440\u0435\u043f\u043e\u0437\u043d\u0430\u0458 1999-12-31 \u043a\u0430\u043e \u0434\u0430\u0442\u0443\u043c \u0438 1999-12-31 23:59 \u043a\u0430\u043e \u0432\u0440\u0435\u043c\u0435 \u0438 \u043f\u0440\u0438\u043c\u0435\u045a\u0443\u0458 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 (\u043b\u043e\u043a\u0430\u043b\u043d\u0438 \u0437\u0430\u043f\u0438\u0441\u0438)
-OptionPanel.parse_numbers=\u041f\u0440\u0435\u043f\u043e\u0437\u043d\u0430\u0458\u0435 \u0431\u0440\u043e\u0458 \u0443\u043d\u043e\u0441\u0430
-OptionPanel.parse_numbers.tooltip=\u0422\u0443\u043c\u0430\u0447\u0435 \u0443\u043d\u043e\u0441 \u043f\u043e\u043f\u0443\u0442 1.1234 \u043a\u0430\u043e \u0431\u0440\u043e\u0458 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 (\u043b\u043e\u043a\u0430\u043b\u043d\u0438 \u0437\u0430\u043f\u0438\u0441\u0438)
-OptionPanel.PASTE_HTML=\u041d\u0430\u043b\u0435\u043f\u0438 \u043a\u0430\u043e HTML
-OptionPanel.PASTE_PLAIN_TEXT=\u041d\u0430\u043b\u0435\u043f\u0438 \u043a\u0430\u043e \u043e\u0431\u0438\u0447\u0430\u043d \u0442\u0435\u043a\u0441\u0442
-OptionPanel.path_property_may_not_be_empty=\u041f\u043e\u0459\u0435 \u0443\u043d\u043e\u0441\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0431\u0438\u0442\u0438 \u043f\u0440\u0430\u0437\u043d\u043e! \u041f\u0440\u043e\u043c\u0435\u043d\u0430 \u0458\u0435 \u0432\u0440\u0430\u045b\u0435\u043d\u0430.
-OptionPanel.patternname=\u0418\u043c\u0435
-OptionPanel.patternname.tooltip=\u0408\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043e \u0438\u043c\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430
-OptionPanel.pl=\u041f\u043e\u0459\u0441\u043a\u0438 / polski
-OptionPanel.placenewbranches=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043d\u043e\u0432\u0443 \u0433\u0440\u0430\u043d\u0443
-OptionPanel.placenewbranches.tooltip=<html>\u041e\u0434\u0440\u0435\u0452\u0443\u0458\u0435 \u043f\u043e\u043b\u043e\u0436\u0430\u0458 \u043d\u043e\u0432\u0435 \u0433\u0440\u0430\u043d\u0435. \u0412\u0430\u0459\u0430\u043d\u0435 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438 \u0441\u0443 '\u043f\u0440\u0432\u0430' \u0438 '\u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0430' </html>
-OptionPanel.plugin.tooltip=\u041d\u0435\u043c\u0430 \u0443\u0433\u0440\u0430\u0452\u0435\u043d\u0438\u0445 \u0434\u043e\u0434\u0430\u0442\u0430\u043a\u0430.
-OptionPanel.plugins=\u0414\u043e\u0434\u0430\u0446\u0438
-OptionPanel.presentation_dimmer_transparency=\u041f\u0440\u043e\u0437\u0438\u0440\u043d\u043e\u0441\u0442 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0458\u0435
-OptionPanel.presentation_mode=\u0420\u0435\u0436\u0438\u043c \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0458\u0435
-OptionPanel.printonwhitebackground=<html>\u0411\u0435\u043b\u0430 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0430 \u043a\u043e\u0434 \u0448\u0442\u0430\u043c\u043f\u0430\u045a\u0430</html>
-OptionPanel.printonwhitebackground.tooltip=<html>\u0423\u0432\u0435\u043a \u043a\u043e\u0440\u0438\u0441\u0442\u0438 \u0431\u0435\u043b\u0443 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0443 \u043a\u043e\u0434 \u0448\u0442\u0430\u043c\u043f\u0430\u045a\u0430</html>
-OptionPanel.pt_BR=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0438 \u0411\u0420 / Portugu\u00eas (Brasil)
-OptionPanel.pt_PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0441\u043a\u0438 / Portugu\u00eas (Portugal)
-OptionPanel.RECT=\u041f\u0440\u0430\u0432\u043e\u0443\u0433\u0430\u043e\u043d\u0438\u043a
-OptionPanel.relative=\u0420\u0435\u043b\u0430\u0442\u0438\u0432\u043d\u043e
-OptionPanel.remind_type_of_new_nodes.tooltip=<html>"\u041f\u0438\u0442\u0430\u0458" (\u043a\u043e\u0440\u0438\u0441\u0442\u0438 \u0443 \u043d\u0435\u0434\u043e\u0443\u043c\u0438\u0446\u0438).<br>"\u0414\u0430" \u043f\u0440\u0438\u043a\u0430\u0436\u0438 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u0437\u0430 \u0431\u043e\u0459\u0435 \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u045a\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 .<br>"\u041d\u0435" \u043f\u0440\u0438\u043a\u0430\u0 [...]
-OptionPanel.remind_use_rich_text_in_new_nodes=\u041a\u043e\u0440\u0438\u0441\u0442\u0438 \u0431\u043e\u0459\u0435 \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0438 \u0442\u0435\u043a\u0441\u0442 \u0434\u0430 \u043d\u0430\u043b\u0435\u043f\u0438\u0442\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-OptionPanel.remove_notes_without_question=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0431\u0435\u043b\u0435\u0448\u043a\u0435 \u0431\u0435\u0437 \u043f\u0438\u0442\u0430\u045a\u0430?
-OptionPanel.remove_notes_without_question.tooltip=\u0410\u043a\u043e \u0458\u0435 \u043f\u043e\u0459\u0435 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e \u043f\u0440\u0438\u043f\u0430\u0434\u0430\u0458\u0443\u045b\u0435 \u0431\u0435\u043b\u0435\u0448\u043a\u0435 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430 \u0431\u0438\u045b\u0435 \u043e\u0431\u0440\u0438\u0441\u0430\u043d\u0435 \u0431\u0435\u0437 \u043f\u043e\u0442\u0432\u0440\u0434\u0435. \u0 [...]
-OptionPanel.resources_use_default_font_for_notes_too=\u041a\u043e\u0440\u0438\u0441\u0442\u0438 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0438 \u0441\u043b\u043e\u0432\u043e\u043b\u0438\u043a \u0437\u0430 \u0431\u0435\u043b\u0435\u0448\u043a\u0435
-OptionPanel.resources_use_margin_top_zero_for_notes=\u0423\u043a\u043b\u043e\u043d\u0438 \u0433\u043e\u0440\u045a\u0443 \u0438\u0432\u0438\u0446\u0443 \u043a\u043e\u0434 \u0431\u0435\u043b\u0435\u0448\u043a\u0438
-OptionPanel.revision_color=\u0420\u0435\u0432\u0438\u0437\u0438\u0458\u0430 \u0431\u043e\u0458\u0430
-OptionPanel.revision_color.tooltip=\u041f\u043e\u0437\u0430\u0434\u0438\u043d\u0441\u043a\u0430 \u0431\u043e\u0458\u0430 \u0438\u0437\u043c\u0438\u0435\u045a\u0435\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430.
-OptionPanel.ROUND_RECT=\u0417\u0430\u043e\u0431\u0459\u0435\u043d\u0438 \u043f\u0440\u0430\u0432\u043e\u0443\u0433\u0430\u043e\u043d\u0438\u043a
-OptionPanel.ru=\u0420\u0443\u0441\u043a\u0438 / \u0420\u0443\u0441\u0441\u043a\u0438\u0439
-OptionPanel.save_folding=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u0442\u0430\u0431\u043b\u0430
-OptionPanel.save_folding_if_map_is_changed=\u0421\u0430\u043c\u043e \u0430\u043a\u043e \u0458\u0435 \u043c\u0430\u043f\u0430 \u043f\u0440\u043e\u043c\u0435\u045a\u0435\u043d\u0430
-OptionPanel.save_modification_times=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0432\u0440\u0435\u043c\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0435
-OptionPanel.script_classpath=\u041f\u0443\u0442\u0430\u045a\u0430 \u043a\u043b\u0430\u0441\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0435: \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0458\u0443\u043c\u0438 \u043a\u043e\u0458\u0438 \u0441\u0430\u0434\u0440\u0436\u0435 \u043a\u043b\u0430\u0441\u0435 \u0438/\u0438\u043b\u0438 JARs ( \u0432\u0438\u0434\u0438 \u0441\u0430\u0432\u0435\u0442)
-OptionPanel.script_classpath.tooltip=<html>\u0421\u043f\u0438\u0441\u0430\u043a \u043c\u0430\u043f\u0430 (\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0458\u0430) \u043a\u043e\u0458\u0435 \u0441\u0430\u0434\u0440\u0436\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 classpath, \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0438\u043b\u0438 JARs.<br>\u041a\u043e\u0440\u0438\u0441\u0442\u0438 ; (Windows) \u0438\u043b\u0438 : (Linux, Mac) \u0437\u0430 \u043e\u0434\u0432\u0430\u045 [...]
-OptionPanel.script_directories=\u041f\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043f\u0443\u0442\u0430\u045a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 (\u0432\u0438\u0434\u0438 \u0441\u0430\u0432\u0435\u0442)
-OptionPanel.script_directories.tooltip=<html>\u0421\u043f\u0438\u0441\u0430\u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0458\u0430 \u043a\u043e\u0458\u0435 \u0441\u0430\u0434\u0440\u0436\u0435.<br>\u041a\u043e\u0440\u0438\u0441\u0442\u0438 ; (Windows) \u0438\u043b\u0438 : (Linux, Mac) \u0437\u0430 \u043e\u0434\u0432\u0430\u0458\u0430\u045a\u0435 \u0443\u043d\u043e\u0441\u0430.<br>\u041f\u0443\u0442\u0430\u045a\u0435 \u043a\u043e\u0458\u0435 \u043d\u0438\u0441\u0443 \u04 [...]
-OptionPanel.script_user_key_name_for_signing=\u041d\u0435\u043e\u0431\u0430\u0432\u0435\u0437\u043d\u0438 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0438 \u043a\u0459\u0443\u0447 (\u043f\u0441\u0435\u0443\u0434\u043e\u043d\u0438\u043c) \u0437\u0430 \u043f\u043e\u0442\u043f\u0438\u0441\u0438\u0432\u0430\u045a\u0435
-OptionPanel.script_user_key_name_for_signing.tooltip=<html>\u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u043f\u043e\u0442\u043f\u0438\u0441\u0430\u0442\u0438 \u0441\u0432\u043e\u0458\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0443, \u0443\u043d\u0435\u0441\u0438\u0442\u0435 \u043f\u0441\u0435\u0443\u0434\u043e\u043d\u0438\u043c (\u0438\u0437\u043c\u0438\u0448\u0459\u0435\u043d\u0438 \u043a\u0459\u0443\u0447) \u043e\u0432\u0434\u0435. <br>\u041b\u043e\u0437\u0438\u043d\u043a\u0430 [...]
-OptionPanel.scrollbar_increment=\u0411\u0440\u0437\u0438\u043d\u0430
-OptionPanel.scrolling_speed=\u0411\u0440\u0437\u0438\u043d\u0430 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e\u0433 \u043a\u043b\u0438\u0437\u0430\u045a\u0430 \u043f\u0440\u0438\u043a\u0430\u0437\u0430 \u043c\u0430\u043f\u0435
-OptionPanel.selection_method=\u041d\u0430\u0447\u0438\u043d \u0438\u0437\u0431\u043e\u0440\u0430
-OptionPanel.selection_method.tooltip=<html> \u043f\u043e\u043c\u043e\u045b\u0443 \u043e\u0432\u0435 \u043c\u043e\u0433\u0443\u045b\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0438/\u043e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0438 \u043d\u0430\u0447\u0438\u043d \u0438\u0437\u0431\u043e\u0440\u0430 \u0447\u0432\u043e\u0440\u0430 \u0441\u0430 \u0437\u0430\u043a\u0430\u0448\u045a\u0435\u045a\u0435\u043c [...]
-OptionPanel.selection_method_by_click=\u0421\u0430 \u043a\u043b\u0438\u043a\u043e\u043c
-OptionPanel.selection_method_delayed=\u041e\u0434\u043b\u043e\u0436\u0435\u043d\u043e
-OptionPanel.selection_method_direct=\u0414\u0438\u0440\u0435\u043a\u0442\u043d\u043e
-OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName=\u0428\u0430\u0431\u043b\u043e\u043d\u0438
-OptionPanel.separator.anti_alias=\u0417\u0430\u0433\u043b\u0430\u0452\u0438\u0432\u0430\u045a\u0435
+OptionPanel.org.freeplane.plugin.bugreport=\u041F\u043E\u043B\u0438\u0442\u0438\u043A\u0430
+OptionPanel.org.freeplane.plugin.bugreport.allowed=\u0423\u0432\u0435\u043A \u0448\u0430\u0459\u0438
+OptionPanel.org.freeplane.plugin.bugreport.ask=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0434\u0438\u0458\u0430\u043B\u043E\u0448\u043A\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458
+OptionPanel.org.freeplane.plugin.bugreport.denied=\u041D\u0438\u043A\u0430\u0434 \u043D\u0435 \u0448\u0430\u0459\u0438
+OptionPanel.org.freeplane.plugin.bugreport.userid=\u041F\u043E \u0432\u043E\u0459\u0438 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0430 \u0434\u0430 \u0431\u0443\u0434\u0443 \u043F\u043E\u0441\u043B\u0430\u0442\u0430
+OptionPanel.outline_hgap=\u0412\u043E\u0434\u043E\u0440\u0430\u0432\u043D\u0438 \u0440\u0430\u0437\u043C\u0430\u043A
+OptionPanel.outline_vgap=\u0423\u0441\u043F\u0440\u0430\u0432\u043D\u0438 \u0440\u0430\u0437\u043C\u0430\u043A
+OptionPanel.paint_connectors_behind=\u0426\u0440\u0442\u0430\u0458 \u043F\u043E\u0432\u0435\u0437\u043D\u0438\u043A \u0438\u0437\u0430 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+OptionPanel.parse_data=\u041F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0458 \u0443\u043D\u043E\u0441 \u0431\u0440\u043E\u0458\u0435\u0432\u0430, \u0434\u0430\u0442\u0443\u043C - \u0432\u0440\u0435\u043C\u0435
+OptionPanel.parse_data.tooltip=\u041F\u0440\u043E\u0433\u0440\u0430\u043C \u0430\u043D\u0430\u043B\u0438\u0437\u0438\u0440\u0430 \u0443\u043D\u043E\u0441 \u0434\u0430\u0442\u0443\u043C\u0430, \u0434\u0430\u0442\u0443\u043C\u0430-\u0432\u0440\u0435\u043C\u0435\u043D\u0430 \u0438 \u0431\u0440\u043E\u0458\u0435\u0432\u0430 \u0438 \u043F\u0440\u0438\u043C\u0435\u045A\u0443\u0458\u0435 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0435. \u041F\u0 [...]
+OptionPanel.parse_dates=\u041F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0458 \u0443\u043D\u043E\u0441 \u0434\u0430\u0442\u0443\u043C\u0430 \u0438 \u0432\u0440\u0435\u043C\u0435\u043D\u0430
+OptionPanel.parse_dates.tooltip=\u041F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0458 1999-12-31 \u043A\u0430\u043E \u0434\u0430\u0442\u0443\u043C \u0438 1999-12-31 23:59 \u043A\u0430\u043E \u0432\u0440\u0435\u043C\u0435 \u0438 \u043F\u0440\u0438\u043C\u0435\u045A\u0443\u0458 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0435 \u0444\u043E\u0440\u043C\u0430\u0442\u0435 (\u043B\u043E\u043A\u0430\u043B\u043D\u0438 \u0437\u0430\u043F\u0438\u0441\u0438)
+OptionPanel.parse_numbers=\u041F\u0440\u0435\u043F\u043E\u0437\u043D\u0430\u0458\u0435 \u0431\u0440\u043E\u0458 \u0443\u043D\u043E\u0441\u0430
+OptionPanel.parse_numbers.tooltip=\u0422\u0443\u043C\u0430\u0447\u0435 \u0443\u043D\u043E\u0441 \u043F\u043E\u043F\u0443\u0442 1.1234 \u043A\u0430\u043E \u0431\u0440\u043E\u0458 \u0438 \u043F\u0440\u0438\u043C\u0435\u043D\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 (\u043B\u043E\u043A\u0430\u043B\u043D\u0438 \u0437\u0430\u043F\u0438\u0441\u0438)
+OptionPanel.PASTE_HTML=\u041D\u0430\u043B\u0435\u043F\u0438 \u043A\u0430\u043E HTML
+OptionPanel.PASTE_PLAIN_TEXT=\u041D\u0430\u043B\u0435\u043F\u0438 \u043A\u0430\u043E \u043E\u0431\u0438\u0447\u0430\u043D \u0442\u0435\u043A\u0441\u0442
+OptionPanel.path_property_may_not_be_empty=\u041F\u043E\u0459\u0435 \u0443\u043D\u043E\u0441\u0430 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0430\u0437\u043D\u043E! \u041F\u0440\u043E\u043C\u0435\u043D\u0430 \u0458\u0435 \u0432\u0440\u0430\u045B\u0435\u043D\u0430.
+OptionPanel.patternname=\u0418\u043C\u0435
+OptionPanel.patternname.tooltip=\u0408\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u043E \u0438\u043C\u0435 \u0448\u0430\u0431\u043B\u043E\u043D\u0430
+OptionPanel.pl=\u041F\u043E\u0459\u0441\u043A\u0438 / polski
+OptionPanel.placenewbranches=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043D\u043E\u0432\u0443 \u0433\u0440\u0430\u043D\u0443
+OptionPanel.placenewbranches.tooltip=<html>\u041E\u0434\u0440\u0435\u0452\u0443\u0458\u0435 \u043F\u043E\u043B\u043E\u0436\u0430\u0458 \u043D\u043E\u0432\u0435 \u0433\u0440\u0430\u043D\u0435. \u0412\u0430\u0459\u0430\u043D\u0435 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438 \u0441\u0443 '\u043F\u0440\u0432\u0430' \u0438 '\u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0430' </html>
+OptionPanel.plugin.tooltip=\u041D\u0435\u043C\u0430 \u0443\u0433\u0440\u0430\u0452\u0435\u043D\u0438\u0445 \u0434\u043E\u0434\u0430\u0442\u0430\u043A\u0430.
+OptionPanel.plugins=\u0414\u043E\u0434\u0430\u0446\u0438
+OptionPanel.presentation_dimmer_transparency=\u041F\u0440\u043E\u0437\u0438\u0440\u043D\u043E\u0441\u0442 \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0435
+OptionPanel.presentation_mode=\u0420\u0435\u0436\u0438\u043C \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0435
+OptionPanel.printonwhitebackground=<html>\u0411\u0435\u043B\u0430 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0430 \u043A\u043E\u0434 \u0448\u0442\u0430\u043C\u043F\u0430\u045A\u0430</html>
+OptionPanel.printonwhitebackground.tooltip=<html>\u0423\u0432\u0435\u043A \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u0431\u0435\u043B\u0443 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0443 \u043A\u043E\u0434 \u0448\u0442\u0430\u043C\u043F\u0430\u045A\u0430</html>
+OptionPanel.pt_BR=\u041F\u043E\u0440\u0442\u0443\u0433\u0430\u043B\u0441\u043A\u0438 \u0411\u0420 / Portugu\u00EAs (Brasil)
+OptionPanel.pt_PT=\u041F\u043E\u0440\u0442\u0443\u0433\u0430\u043B\u0441\u043A\u0438 / Portugu\u00EAs (Portugal)
+OptionPanel.RECT=\u041F\u0440\u0430\u0432\u043E\u0443\u0433\u0430\u043E\u043D\u0438\u043A
+OptionPanel.relative=\u0420\u0435\u043B\u0430\u0442\u0438\u0432\u043D\u043E
+OptionPanel.remind_type_of_new_nodes.tooltip=<html>"\u041F\u0438\u0442\u0430\u0458" (\u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u0443 \u043D\u0435\u0434\u043E\u0443\u043C\u0438\u0446\u0438).<br>"\u0414\u0430" \u043F\u0440\u0438\u043A\u0430\u0436\u0438 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u0437\u0430 \u0431\u043E\u0459\u0435 \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435 \u0442\u0435\u043A\u0441\u0442\u0430 .<br>"\u041D\u0435" \u043F\u0440\u0438\u043A\u0430\u0 [...]
+OptionPanel.remind_use_rich_text_in_new_nodes=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0431\u043E\u0459\u0435 \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u043D\u0438 \u0442\u0435\u043A\u0441\u0442 \u0434\u0430 \u043D\u0430\u043B\u0435\u043F\u0438\u0442\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+OptionPanel.remove_notes_without_question=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0431\u0435\u043B\u0435\u0448\u043A\u0435 \u0431\u0435\u0437 \u043F\u0438\u0442\u0430\u045A\u0430?
+OptionPanel.remove_notes_without_question.tooltip=\u0410\u043A\u043E \u0458\u0435 \u043F\u043E\u0459\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E \u043F\u0440\u0438\u043F\u0430\u0434\u0430\u0458\u0443\u045B\u0435 \u0431\u0435\u043B\u0435\u0448\u043A\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430 \u0431\u0438\u045B\u0435 \u043E\u0431\u0440\u0438\u0441\u0430\u043D\u0435 \u0431\u0435\u0437 \u043F\u043E\u0442\u0432\u0440\u0434\u0435. \u0 [...]
+OptionPanel.resources_use_default_font_for_notes_too=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u043F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0438 \u0441\u043B\u043E\u0432\u043E\u043B\u0438\u043A \u0437\u0430 \u0431\u0435\u043B\u0435\u0448\u043A\u0435
+OptionPanel.resources_use_margin_top_zero_for_notes=\u0423\u043A\u043B\u043E\u043D\u0438 \u0433\u043E\u0440\u045A\u0443 \u0438\u0432\u0438\u0446\u0443 \u043A\u043E\u0434 \u0431\u0435\u043B\u0435\u0448\u043A\u0438
+OptionPanel.revision_color=\u0420\u0435\u0432\u0438\u0437\u0438\u0458\u0430 \u0431\u043E\u0458\u0430
+OptionPanel.revision_color.tooltip=\u041F\u043E\u0437\u0430\u0434\u0438\u043D\u0441\u043A\u0430 \u0431\u043E\u0458\u0430 \u0438\u0437\u043C\u0438\u0435\u045A\u0435\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430.
+OptionPanel.ROUND_RECT=\u0417\u0430\u043E\u0431\u0459\u0435\u043D\u0438 \u043F\u0440\u0430\u0432\u043E\u0443\u0433\u0430\u043E\u043D\u0438\u043A
+OptionPanel.ru=\u0420\u0443\u0441\u043A\u0438 / \u0420\u0443\u0441\u0441\u043A\u0438\u0439
+OptionPanel.save_folding=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u0441\u0442\u0430\u0431\u043B\u0430
+OptionPanel.save_folding_if_map_is_changed=\u0421\u0430\u043C\u043E \u0430\u043A\u043E \u0458\u0435 \u043C\u0430\u043F\u0430 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u0430
+OptionPanel.save_modification_times=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0432\u0440\u0435\u043C\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0435
+OptionPanel.script_classpath=\u041F\u0443\u0442\u0430\u045A\u0430 \u043A\u043B\u0430\u0441\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0435: \u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0438 \u043A\u043E\u0458\u0438 \u0441\u0430\u0434\u0440\u0436\u0435 \u043A\u043B\u0430\u0441\u0435 \u0438/\u0438\u043B\u0438 JARs ( \u0432\u0438\u0434\u0438 \u0441\u0430\u0432\u0435\u0442)
+OptionPanel.script_classpath.tooltip=<html>\u0421\u043F\u0438\u0441\u0430\u043A \u043C\u0430\u043F\u0430 (\u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0430) \u043A\u043E\u0458\u0435 \u0441\u0430\u0434\u0440\u0436\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0435 classpath, \u0444\u043E\u0440\u043C\u0443\u043B\u0430 \u0438\u043B\u0438 JARs.<br>\u041A\u043E\u0440\u0438\u0441\u0442\u0438 ; (Windows) \u0438\u043B\u0438 : (Linux, Mac) \u0437\u0430 \u043E\u0434\u0432\u0430\u045 [...]
+OptionPanel.script_directories=\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043F\u0443\u0442\u0430\u045A\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0435 (\u0432\u0438\u0434\u0438 \u0441\u0430\u0432\u0435\u0442)
+OptionPanel.script_directories.tooltip=<html>\u0421\u043F\u0438\u0441\u0430\u043A \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0430 \u043A\u043E\u0458\u0435 \u0441\u0430\u0434\u0440\u0436\u0435.<br>\u041A\u043E\u0440\u0438\u0441\u0442\u0438 ; (Windows) \u0438\u043B\u0438 : (Linux, Mac) \u0437\u0430 \u043E\u0434\u0432\u0430\u0458\u0430\u045A\u0435 \u0443\u043D\u043E\u0441\u0430.<br>\u041F\u0443\u0442\u0430\u045A\u0435 \u043A\u043E\u0458\u0435 \u043D\u0438\u0441\u0443 \u04 [...]
+OptionPanel.script_user_key_name_for_signing=\u041D\u0435\u043E\u0431\u0430\u0432\u0435\u0437\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u043A\u0459\u0443\u0447 (\u043F\u0441\u0435\u0443\u0434\u043E\u043D\u0438\u043C) \u0437\u0430 \u043F\u043E\u0442\u043F\u0438\u0441\u0438\u0432\u0430\u045A\u0435
+OptionPanel.script_user_key_name_for_signing.tooltip=<html>\u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u043F\u043E\u0442\u043F\u0438\u0441\u0430\u0442\u0438 \u0441\u0432\u043E\u0458\u0443 \u0441\u043A\u0440\u0438\u043F\u0442\u0443, \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u043F\u0441\u0435\u0443\u0434\u043E\u043D\u0438\u043C (\u0438\u0437\u043C\u0438\u0448\u0459\u0435\u043D\u0438 \u043A\u0459\u0443\u0447) \u043E\u0432\u0434\u0435. <br>\u041B\u043E\u0437\u0438\u043D\u043A\u0430 [...]
+OptionPanel.scrollbar_increment=\u0411\u0440\u0437\u0438\u043D\u0430
+OptionPanel.scrolling_speed=\u0411\u0440\u0437\u0438\u043D\u0430 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E\u0433 \u043A\u043B\u0438\u0437\u0430\u045A\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0430 \u043C\u0430\u043F\u0435
+OptionPanel.selection_method=\u041D\u0430\u0447\u0438\u043D \u0438\u0437\u0431\u043E\u0440\u0430
+OptionPanel.selection_method.tooltip=<html> \u043F\u043E\u043C\u043E\u045B\u0443 \u043E\u0432\u0435 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u043E\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0438/\u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0438 \u043D\u0430\u0447\u0438\u043D \u0438\u0437\u0431\u043E\u0440\u0430 \u0447\u0432\u043E\u0440\u0430 \u0441\u0430 \u0437\u0430\u043A\u0430\u0448\u045A\u0435\u045A\u0435\u043C [...]
+OptionPanel.selection_method_by_click=\u0421\u0430 \u043A\u043B\u0438\u043A\u043E\u043C
+OptionPanel.selection_method_delayed=\u041E\u0434\u043B\u043E\u0436\u0435\u043D\u043E
+OptionPanel.selection_method_direct=\u0414\u0438\u0440\u0435\u043A\u0442\u043D\u043E
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName=\u0428\u0430\u0431\u043B\u043E\u043D\u0438
+OptionPanel.separator.anti_alias=\u0417\u0430\u0433\u043B\u0430\u0452\u0438\u0432\u0430\u045A\u0435
OptionPanel.separator.attributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438
-OptionPanel.separator.automatic_save=\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e \u0447\u0443\u0432\u0430\u045a\u0435
-OptionPanel.separator.behaviour=\u041f\u043e\u043d\u0430\u0448\u0430\u045a\u0435
-OptionPanel.separator.browser=\u041f\u0440\u0435\u0433\u043b\u0435\u0434\u0430\u0447
-OptionPanel.separator.cache=\u041f\u0440\u0438\u0440\u0443\u0447\u043d\u0430 \u043c\u0435\u043c\u043e\u0440\u0438\u0458\u0430
-OptionPanel.separator.CloudControls=\u041e\u0431\u043b\u0430\u0447\u0438\u045b\u0438
-OptionPanel.separator.commands_for_the_program=\u041d\u0430\u0440\u0435\u0434\u0431\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430
-OptionPanel.separator.connectors=\u041f\u043e\u0432\u0435\u0437\u043d\u0438\u0446\u0438
-OptionPanel.separator.data_formats=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u045a\u0435 \u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0430\u045a\u0435 \u043f\u043e\u0434\u0430\u0442\u0430\u043a\u0430
-OptionPanel.separator.default_colors=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0435 \u0431\u043e\u0458\u0435
-OptionPanel.separator.default_fonts=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0438 \u043e\u0431\u043b\u0438\u043a \u0441\u043b\u043e\u0432\u0430
-OptionPanel.separator.default_styles=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0438 \u0441\u0442\u0438\u043b\u043e\u0432\u0438
+OptionPanel.separator.automatic_save=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u0447\u0443\u0432\u0430\u045A\u0435
+OptionPanel.separator.behaviour=\u041F\u043E\u043D\u0430\u0448\u0430\u045A\u0435
+OptionPanel.separator.browser=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447
+OptionPanel.separator.cache=\u041F\u0440\u0438\u0440\u0443\u0447\u043D\u0430 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0430
+OptionPanel.separator.CloudControls=\u041E\u0431\u043B\u0430\u0447\u0438\u045B\u0438
+OptionPanel.separator.commands_for_the_program=\u041D\u0430\u0440\u0435\u0434\u0431\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430
+OptionPanel.separator.connectors=\u041F\u043E\u0432\u0435\u0437\u043D\u0438\u0446\u0438
+OptionPanel.separator.data_formats=\u0424\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u0430\u045A\u0435 \u0438 \u0430\u043D\u0430\u043B\u0438\u0437\u0438\u0440\u0430\u045A\u0435 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430
+OptionPanel.separator.default_colors=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0435 \u0431\u043E\u0458\u0435
+OptionPanel.separator.default_fonts=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0438 \u043E\u0431\u043B\u0438\u043A \u0441\u043B\u043E\u0432\u0430
+OptionPanel.separator.default_styles=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0438 \u0441\u0442\u0438\u043B\u043E\u0432\u0438
OptionPanel.separator.EdgeControls=\u0418\u0432\u0438\u0446\u0435
-OptionPanel.separator.edit_long_node_window=\u0423\u0440\u0435\u0434\u0438 \u0443 \u0434\u0438\u0458\u0430\u043b\u043e\u0433\u0443
-OptionPanel.separator.editing=\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447\u0430
-OptionPanel.separator.files=\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0435
-OptionPanel.separator.formula=\u0424\u043e\u0440\u043c\u0443\u043b\u0435
-OptionPanel.separator.General=\u0423\u043e\u043f\u0448\u0442\u0435\u043d\u043e
-OptionPanel.separator.html_export=\u0418\u0437\u0432\u043e\u0437 \u0443 HTML
-OptionPanel.separator.html_import=\u0423\u0432\u043e\u0437 HTML
-OptionPanel.separator.hyperlink_types=\u0412\u0440\u0441\u0442\u0435 \u0445\u0438\u043f\u0435\u0440\u0432\u0435\u0437\u0430
-OptionPanel.separator.icon_properties=\u0418\u043a\u043e\u043d\u0435
-OptionPanel.separator.icons=\u0418\u043a\u043e\u043d\u0435 \u0443 "\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u0438\u043a\u043e\u043d\u0443..."
-OptionPanel.separator.initial_map_size=\u041f\u043e\u0447\u0435\u0442\u043d\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u043c\u0430\u043f\u0435
-OptionPanel.separator.inline_editor=\u0420\u0435\u0434\u043d\u0438 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.separator.key_typing=\u041a\u0443\u0446\u0430\u045a\u0435
-OptionPanel.separator.language=\u0408\u0435\u0437\u0438\u043a
-OptionPanel.separator.load=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045a\u0435
-OptionPanel.separator.look_and_feel=\u0418\u0437\u0433\u043b\u0435\u0434 \u0438 \u043e\u0441\u0435\u045b\u0430\u0458
-OptionPanel.separator.mouse_wheel=\u0422\u043e\u0447\u043a\u0438\u045b \u043c\u0438\u0448\u0430
-OptionPanel.separator.new_node_commands=\u041d\u0430\u0440\u0435\u0434\u0431\u0435 \u043d\u043e\u0432\u043e\u0433 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.separator.node_editing_commands=\u041d\u0430\u0440\u0435\u0434\u0431\u0435 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u045a\u0430 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.separator.node_navigation_commands=\u041d\u0430\u0440\u0435\u0434\u0431\u0435 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0458\u0435 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.separator.NodeColors=\u0411\u043e\u0458\u0430 \u0446\u0435\u043b\u043e\u0433 \u0458\u0435\u0437\u0433\u0440\u0430
-OptionPanel.separator.NodeFont=\u0421\u043b\u043e\u0432\u043e\u043b\u0438\u043a \u0446\u0435\u043b\u043e\u0433 \u0458\u0435\u0437\u0433\u0440\u0430
-OptionPanel.separator.NodeShape=\u041e\u0431\u043b\u0438\u043a \u0447\u0432\u043e\u0440\u0430
-OptionPanel.separator.NodeStyle=\u0421\u0442\u0438\u043b \u0447\u0432\u043e\u0440\u0430
-OptionPanel.separator.NodeText=\u0421\u0440\u0436 \u0442\u0435\u043a\u0441\u0442\u0430
-OptionPanel.separator.notifications=\u041f\u043e\u0442\u0432\u0440\u0434\u0435
-OptionPanel.separator.org.freeplane.plugin.bugreport=\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043e \u0433\u0440\u0435\u0448\u0446\u0438
-OptionPanel.separator.other_defaults=\u041e\u0441\u0442\u0430\u043b\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0435
-OptionPanel.separator.others=\u041e\u0441\u0442\u0430\u043b\u0435 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0435 \u043f\u0440\u0435\u0447\u0438\u0446\u0435
-OptionPanel.separator.outline_view=\u0428\u0435\u043c\u0430\u0442\u0441\u043a\u0438 \u043f\u0440\u0438\u043a\u0430\u0437
-OptionPanel.separator.patterns=\u0428\u0430\u0431\u043b\u043e\u043d\u0438
-OptionPanel.separator.RichTextEditor=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u0431\u043e\u0433\u0430\u0442\u043e\u0433 \u0442\u0435\u043a\u0441\u0442\u0430
-OptionPanel.separator.root_node_appearance=\u0418\u0437\u0433\u043b\u0435\u0434 \u0438\u0437\u0432\u043e\u0440\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430
+OptionPanel.separator.edit_long_node_window=\u0423\u0440\u0435\u0434\u0438 \u0443 \u0434\u0438\u0458\u0430\u043B\u043E\u0433\u0443
+OptionPanel.separator.editing=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447\u0430
+OptionPanel.separator.files=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0435
+OptionPanel.separator.formula=\u0424\u043E\u0440\u043C\u0443\u043B\u0435
+OptionPanel.separator.General=\u0423\u043E\u043F\u0448\u0442\u0435\u043D\u043E
+OptionPanel.separator.html_export=\u0418\u0437\u0432\u043E\u0437 \u0443 HTML
+OptionPanel.separator.html_import=\u0423\u0432\u043E\u0437 HTML
+OptionPanel.separator.hyperlink_types=\u0412\u0440\u0441\u0442\u0435 \u0445\u0438\u043F\u0435\u0440\u0432\u0435\u0437\u0430
+OptionPanel.separator.icon_properties=\u0418\u043A\u043E\u043D\u0435
+OptionPanel.separator.icons=\u0418\u043A\u043E\u043D\u0435 \u0443 "\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u0438\u043A\u043E\u043D\u0443..."
+OptionPanel.separator.initial_map_size=\u041F\u043E\u0447\u0435\u0442\u043D\u0430 \u0432\u0435\u043B\u0438\u0447\u0438\u043D\u0430 \u043C\u0430\u043F\u0435
+OptionPanel.separator.inline_editor=\u0420\u0435\u0434\u043D\u0438 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.separator.key_typing=\u041A\u0443\u0446\u0430\u045A\u0435
+OptionPanel.separator.language=\u0408\u0435\u0437\u0438\u043A
+OptionPanel.separator.load=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435
+OptionPanel.separator.look_and_feel=\u0418\u0437\u0433\u043B\u0435\u0434 \u0438 \u043E\u0441\u0435\u045B\u0430\u0458
+OptionPanel.separator.mouse_wheel=\u0422\u043E\u0447\u043A\u0438\u045B \u043C\u0438\u0448\u0430
+OptionPanel.separator.new_node_commands=\u041D\u0430\u0440\u0435\u0434\u0431\u0435 \u043D\u043E\u0432\u043E\u0433 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.separator.node_editing_commands=\u041D\u0430\u0440\u0435\u0434\u0431\u0435 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0430 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.separator.node_navigation_commands=\u041D\u0430\u0440\u0435\u0434\u0431\u0435 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0458\u0435 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.separator.NodeColors=\u0411\u043E\u0458\u0430 \u0446\u0435\u043B\u043E\u0433 \u0458\u0435\u0437\u0433\u0440\u0430
+OptionPanel.separator.NodeFont=\u0421\u043B\u043E\u0432\u043E\u043B\u0438\u043A \u0446\u0435\u043B\u043E\u0433 \u0458\u0435\u0437\u0433\u0440\u0430
+OptionPanel.separator.NodeShape=\u041E\u0431\u043B\u0438\u043A \u0447\u0432\u043E\u0440\u0430
+OptionPanel.separator.NodeStyle=\u0421\u0442\u0438\u043B \u0447\u0432\u043E\u0440\u0430
+OptionPanel.separator.NodeText=\u0421\u0440\u0436 \u0442\u0435\u043A\u0441\u0442\u0430
+OptionPanel.separator.notifications=\u041F\u043E\u0442\u0432\u0440\u0434\u0435
+OptionPanel.separator.org.freeplane.plugin.bugreport=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043E \u0433\u0440\u0435\u0448\u0446\u0438
+OptionPanel.separator.other_defaults=\u041E\u0441\u0442\u0430\u043B\u0435 \u043F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0435
+OptionPanel.separator.others=\u041E\u0441\u0442\u0430\u043B\u0435 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0435 \u043F\u0440\u0435\u0447\u0438\u0446\u0435
+OptionPanel.separator.outline_view=\u0428\u0435\u043C\u0430\u0442\u0441\u043A\u0438 \u043F\u0440\u0438\u043A\u0430\u0437
+OptionPanel.separator.patterns=\u0428\u0430\u0431\u043B\u043E\u043D\u0438
+OptionPanel.separator.RichTextEditor=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u0431\u043E\u0433\u0430\u0442\u043E\u0433 \u0442\u0435\u043A\u0441\u0442\u0430
+OptionPanel.separator.root_node_appearance=\u0418\u0437\u0433\u043B\u0435\u0434 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430
OptionPanel.separator.save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458
-OptionPanel.separator.scripting=\u0421\u043a\u0440\u0438\u043f\u0442\u0435
-OptionPanel.separator.scrollbar=\u041a\u043b\u0438\u0437\u0430\u0447
+OptionPanel.separator.scripting=\u0421\u043A\u0440\u0438\u043F\u0442\u0435
+OptionPanel.separator.scrollbar=\u041A\u043B\u0438\u0437\u0430\u0447
OptionPanel.separator.search=\u0422\u0440\u0430\u0436\u0438
-OptionPanel.separator.selection_colors=\u0411\u043e\u0458\u0430 \u0437\u0430 \u0438\u0441\u0442\u0438\u0446\u0430\u045a\u0435
-OptionPanel.separator.selection_method=\u041d\u0430\u0447\u0438\u043d \u0438\u0437\u0431\u043e\u0440\u0430
-OptionPanel.separator.single_instance_mode=\u041f\u0440\u0438\u043c\u0435\u0440 \u0458\u0435\u0434\u043d\u043e\u0433 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430
-OptionPanel.separator.size_limits=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u045a\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0430
-OptionPanel.separator.spelling=\u041c\u043e\u0433\u0443\u045b\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435 \u043f\u0440\u0430\u0432\u043e\u043f\u0438\u0441\u0430
-OptionPanel.separator.status=\u0421\u0442\u0430\u0442\u0443\u0441\u043d\u0430 \u0442\u0440\u0430\u043a\u0430
-OptionPanel.separator.tooltip=\u0412\u0440\u0435\u043c\u0435 \u043f\u0440\u0438\u043a\u0430\u0437\u0430 \u0441\u0430\u0432\u0435\u0442\u0430
-OptionPanel.separator.undo=\u041e\u043f\u043e\u0437\u043e\u0432\u0438
-OptionPanel.separator.updates=\u0418\u0441\u043f\u0440\u0430\u0432\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430
-OptionPanel.set_property_text=\u041f\u0440\u043e\u043c\u0435\u043d\u0438
-OptionPanel.set_property_text.tooltip=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u043e\u0432\u043e \u0441\u0432\u043e\u0458\u0441\u0442\u0432\u043e \u0441\u0442\u0438\u043b\u0430
-OptionPanel.setscript=\u041f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0438?
-OptionPanel.setscript.tooltip=\u0421\u043a\u0440\u0438\u043f\u0442\u0430 \u043c\u043e\u0436\u0435 \u0431\u0438\u0442\u0438 \u043f\u0440\u0438\u0434\u0440\u0443\u0436\u0435\u043d\u0430 \u0441\u0442\u0438\u043b\u0443.
-OptionPanel.sharp_bezier=\u041e\u0448\u0442\u0440\u043e \u0437\u0430\u043a\u0440\u0438\u0432\u0459\u0435\u043d\u0430 (\u043a\u0440\u0438\u0432\u0430\u0458\u0430)
-OptionPanel.sharp_linear=\u041e\u0448\u0442\u0440\u043e \u043b\u0438\u043d\u0435\u0430\u0440\u043d\u043e
-OptionPanel.show_icon_for_attributes=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0438\u043a\u043e\u043d\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
-OptionPanel.show_node_tooltips=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u043e\u043a\u0432\u0438\u0440 \u0441 \u0431\u0435\u043b\u0435\u0448\u043a\u0430\u043c\u0430
-OptionPanel.show_note_icons=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0438\u043a\u043e\u043d\u0435 \u0431\u0435\u043b\u0435\u0448\u043a\u0435
-OptionPanel.show_styles_in_tooltip=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0441\u0442\u0438\u043b\u043e\u0432\u0435 \u0447\u0432\u043e\u0440\u0430 \u0443 \u0438\u0441\u043a\u0430\u0447\u0443\u045b\u0435\u043c \u043f\u0440\u043e\u0437\u043e\u0440\u0443
-OptionPanel.signed_script_are_trusted=\u041e\u043c\u043e\u0433\u0443\u045b\u0438 \u0438\u0437\u0432\u043e\u0452\u0435\u045a\u0435 \u043f\u043e\u0442\u043f\u0438\u0441\u0430\u043d\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u0438 (\u043f\u0440\u0435\u043f\u043e\u0440\u0443\u0447\u0435\u043d\u043e)
-OptionPanel.signed_script_are_trusted.tooltip=\u0410\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0438\u043c\u0430\u0458\u0443 \u043f\u043e\u0432\u0435\u0440\u0459\u0438\u0432 \u043f\u043e\u0442\u043f\u0438\u0441 (\u043d\u043f\u0440. \u0430\u0443\u0442\u043e\u0440\u0430 Freeplanea \u0438\u043b\u0438 \u0441\u0443 \u0432\u043b\u0430\u0441\u0442\u0438\u0442\u0435), \u0438\u0437\u0432\u043e\u0434\u0438\u045b\u0435 \u0441\u0435 \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0 [...]
-OptionPanel.simplyhtml.default_paste_mode=\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0438 \u0440\u0435\u0436\u0438\u043c \u043f\u043e\u0441\u0442\u0430\u0432\u0459\u0430\u045a\u0430
-OptionPanel.single_backup_directory=\u041a\u043e\u0440\u0438\u0441\u0442\u0438 \u0458\u0435\u0434\u0430\u043d\u0443 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0443 \u0437\u0430 \u043f\u0440\u0438\u0447\u0443\u0432\u043d\u0443 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443
-OptionPanel.single_backup_directory.tooltip=<html>\u0427\u0443\u0432\u0430\u045a\u0435 \u043f\u0440\u0438\u0447\u0443\u0432\u043d\u0435 \u0443 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0438 \u0434\u0435\u0444\u0438\u043d\u0438\u0441\u0430\u043d\u0443 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0443, \u0430\u043a\u043e \u043d\u0438\u0458\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d\u043e, \u043f\u0440\u0438\u0447\u0443\u0432\u043d\u0430 \u045b\u0435 \u0431\u0 [...]
-OptionPanel.single_backup_directory_path=\u0424\u0430\u0441\u0446\u0438\u043a\u043b\u0430 \u043f\u0440\u0438\u0447\u0443\u0432\u043d\u0435 (\u0430\u043a\u043e \u0458\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d\u0430 \u043c\u043e\u0433\u0443\u045b\u043d\u043e\u0441\u0442 \u0438\u0437\u043d\u0430\u0434)
-OptionPanel.single_backup_directory_path.tooltip=<html>\u041f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0443 \u043f\u0443\u0442\u0430\u045a\u0443 <freeplaneuserdir>/.backup</html>
-OptionPanel.single_instance=\u041e\u0442\u0432\u043e\u0440\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443 \u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0437\u043e\u0440\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430
-OptionPanel.single_instance_force=\u0418\u0437\u0431\u0435\u0433\u043d\u0438 \u043e\u0442\u0432\u0430\u0440\u0430\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435 \u0443 \u043d\u043e\u0432\u043e\u043c \u043f\u0440\u043e\u0437\u043e\u0440\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430
-OptionPanel.single_instance_force.tooltip=\u0418\u0437\u0431\u0435\u0433\u0430\u0432\u0430\u0458\u0442\u0435 \u0434\u0440\u0443\u0433\u0438 \u0441\u043b\u0443\u0447\u0430\u0458, \u0447\u0430\u043a \u0438 \u0430\u043a\u043e \u043d\u0435 \u043f\u043e\u0441\u0442\u043e\u0458\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0437\u0430 \u0443\u0447\u0438\u0442\u0430\u0432\u0430\u045a\u0435
-OptionPanel.sk=\u0421\u043b\u043e\u0432\u0430\u0447\u043a\u0438 / sloven\u010dina
-OptionPanel.sl=\u0421\u043b\u043e\u0432\u0435\u043d\u0430\u0447\u043a\u0438 / sloven\u0161\u010dina
-OptionPanel.spelling_opt_case_sensitive=\u041e\u0441\u0435\u0442\u0459\u0438\u0432 \u043d\u0430 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u0443 \u0441\u043b\u043e\u0432\u0430
-OptionPanel.spelling_opt_ignore_all_caps_words=\u0417\u0430\u043d\u0435\u043c\u0430\u0440\u0438 \u0440\u0435\u0447\u0438 \u043f\u0438\u0441\u0430\u043d\u0435 \u0432\u0435\u043b\u0438\u043a\u0438\u043c \u0441\u043b\u043e\u0432\u0438\u043c\u0430
-OptionPanel.spelling_opt_ignore_capitalization=\u0417\u0430\u043d\u0435\u043c\u0430\u0440\u0438 \u0432\u0435\u043b\u0438\u043a\u0430 \u0441\u043b\u043e\u0432\u0430 \u043d\u0430 \u043f\u043e\u0447\u0435\u0442\u043a\u0443 \u0440\u0435\u0447\u0438
-OptionPanel.spelling_opt_ignore_words_with_numbers=\u0417\u0430\u043d\u0435\u043c\u0430\u0440\u0438 \u0440\u0435\u0447\u0438 \u043a\u043e\u0458\u0435 \u0441\u0430\u0434\u0440\u0436\u0435 \u0431\u0440\u043e\u0458\u0435\u0432\u0435
-OptionPanel.spelling_opt_suggestions_limit_dialog=\u041d\u0430\u0458\u0432\u0435\u045b\u0438 \u0431\u0440\u043e\u0458 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0445 \u0440\u0435\u0447\u0438 \u0443 \u0434\u0438\u0458\u0430\u043b\u043e\u0433\u0443
-OptionPanel.spelling_opt_suggestions_limit_menu=\u041d\u0430\u0458\u0432\u0435\u045b\u0438 \u0431\u0440\u043e\u0458 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0445 \u0440\u0435\u0447\u0438 \u0443 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0443
-OptionPanel.sr=\u0421\u0440\u043f\u0441\u043a\u0438 / \u0441\u0440\u043f\u0441\u043a\u0438
-OptionPanel.standard_template=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u0430\u043d \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435
-OptionPanel.standardbackgroundcolor=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0430
-OptionPanel.standardbackgroundcolor.tooltip=<html>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0435 \u043c\u0430\u043f\u0435 \u0443 HTML \u0437\u0430\u043f\u0438\u0441\u0443 </html>
-OptionPanel.standardcloudcolor=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u043e\u0431\u043b\u0430\u0447\u0438\u045b\u0430
-OptionPanel.standardcloudcolor.tooltip=<html>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u043e\u0431\u043b\u0430\u0447\u0438\u045b\u0430 \u0443 HTML \u0437\u0430\u043f\u0438\u0441\u0443 </html>
-OptionPanel.standardcloudestyle=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u0430\u043d \u0441\u0442\u0438\u043b \u043e\u0431\u043b\u0430\u0447\u0438\u045b\u0430
-OptionPanel.standardcloudestyle.tooltip=<html>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0441\u0442\u0438\u043b \u043e\u0431\u043b\u0430\u0447\u0438\u045b\u0430. \u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0458\u0435 \u043f\u043e\u0434\u0440\u0436\u0430\u043d \u0441\u0430\u043c\u043e 'bezier' </html>
-OptionPanel.standarddrawrectangleforselection=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u043c\u0435\u0445\u0443\u0440\u0438\u045b \u0437\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440.
-OptionPanel.standarddrawrectangleforselection.tooltip=<html>\u041e\u0434\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440 \u0438\u043c\u0430 \u043c\u0435\u0445\u0443\u0440\u0438\u045b \u0441\u0430 \u0437\u0430\u043e\u0431\u0459\u0435\u043d\u0438\u043c \u0443\u0433\u043b\u043e\u0432\u0438\u043c\u0430 \u043e\u043a\u043e \u0441\u0435\u0431\u0435 .</html>
-OptionPanel.standardlinkcolor=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u0432\u0435\u0437\u0435
-OptionPanel.standardlinkcolor.tooltip=<html>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u0432\u0435\u0437\u0435 \u0443 HTML \u0437\u0430\u043f\u0438\u0441\u0443 </html>
-OptionPanel.standardlinkestyle=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u0430\u043d \u0441\u0442\u0438\u043b \u0432\u0435\u0437\u0435
-OptionPanel.standardlinkestyle.tooltip=<html>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0441\u0442\u0438\u043b \u0432\u0435\u0437\u0435. \u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0458\u0435 \u043f\u043e\u0434\u0440\u0436\u0430\u043d \u0441\u0430\u043c\u043e 'bezier' </html>
-OptionPanel.standardselectednodecolor=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.standardselectednodecolor.tooltip=<html>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430. \u0423 HTML \u0437\u0430\u043f\u0438\u0441\u0443 (#RRGGBB \u0443 \u0445\u0435\u043a\u0441\u0430\u0434\u0435\u0446\u0438\u043c\u0430\u043b\u043d\u043e\u0458 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438) </html>
-OptionPanel.standardselectednoderectanglecolor=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u043c\u0435\u0445\u0443\u0440\u0438\u045b\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.standardselectednoderectanglecolor.tooltip=<html>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0430 \u0431\u043e\u0458\u0430 \u043e\u043a\u0432\u0438\u0440\u0430 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430. \u0423 HTML \u0437\u0430\u043f\u0438\u0441\u0443 (#RRGGBB \u0443 \u0445\u0435\u043a\u0441\u0430\u0434\u0435\u0446\u0438\u043c\u0430\u043b\u043d\u043e\u0458 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438) </html>
+OptionPanel.separator.selection_colors=\u0411\u043E\u0458\u0430 \u0437\u0430 \u0438\u0441\u0442\u0438\u0446\u0430\u045A\u0435
+OptionPanel.separator.selection_method=\u041D\u0430\u0447\u0438\u043D \u0438\u0437\u0431\u043E\u0440\u0430
+OptionPanel.separator.single_instance_mode=\u041F\u0440\u0438\u043C\u0435\u0440 \u0458\u0435\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430
+OptionPanel.separator.size_limits=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u045A\u0430 \u0432\u0435\u043B\u0438\u0447\u0438\u043D\u0430
+OptionPanel.separator.spelling=\u041C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u0435 \u043F\u0440\u0430\u0432\u043E\u043F\u0438\u0441\u0430
+OptionPanel.separator.status=\u0421\u0442\u0430\u0442\u0443\u0441\u043D\u0430 \u0442\u0440\u0430\u043A\u0430
+OptionPanel.separator.tooltip=\u0412\u0440\u0435\u043C\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0430 \u0441\u0430\u0432\u0435\u0442\u0430
+OptionPanel.separator.undo=\u041E\u043F\u043E\u0437\u043E\u0432\u0438
+OptionPanel.separator.updates=\u0418\u0441\u043F\u0440\u0430\u0432\u043A\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430
+OptionPanel.set_property_text=\u041F\u0440\u043E\u043C\u0435\u043D\u0438
+OptionPanel.set_property_text.tooltip=\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u043E\u0432\u043E \u0441\u0432\u043E\u0458\u0441\u0442\u0432\u043E \u0441\u0442\u0438\u043B\u0430
+OptionPanel.setscript=\u041F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0438?
+OptionPanel.setscript.tooltip=\u0421\u043A\u0440\u0438\u043F\u0442\u0430 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0438\u0434\u0440\u0443\u0436\u0435\u043D\u0430 \u0441\u0442\u0438\u043B\u0443.
+OptionPanel.sharp_bezier=\u041E\u0448\u0442\u0440\u043E \u0437\u0430\u043A\u0440\u0438\u0432\u0459\u0435\u043D\u0430 (\u043A\u0440\u0438\u0432\u0430\u0458\u0430)
+OptionPanel.sharp_linear=\u041E\u0448\u0442\u0440\u043E \u043B\u0438\u043D\u0435\u0430\u0440\u043D\u043E
+OptionPanel.show_icon_for_attributes=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0438\u043A\u043E\u043D\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+OptionPanel.show_node_tooltips=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u043E\u043A\u0432\u0438\u0440 \u0441 \u0431\u0435\u043B\u0435\u0448\u043A\u0430\u043C\u0430
+OptionPanel.show_note_icons=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0438\u043A\u043E\u043D\u0435 \u0431\u0435\u043B\u0435\u0448\u043A\u0435
+OptionPanel.show_styles_in_tooltip=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0441\u0442\u0438\u043B\u043E\u0432\u0435 \u0447\u0432\u043E\u0440\u0430 \u0443 \u0438\u0441\u043A\u0430\u0447\u0443\u045B\u0435\u043C \u043F\u0440\u043E\u0437\u043E\u0440\u0443
+OptionPanel.signed_script_are_trusted=\u041E\u043C\u043E\u0433\u0443\u045B\u0438 \u0438\u0437\u0432\u043E\u0452\u0435\u045A\u0435 \u043F\u043E\u0442\u043F\u0438\u0441\u0430\u043D\u0438\u0445 \u0441\u043A\u0440\u0438\u043F\u0442\u0438 (\u043F\u0440\u0435\u043F\u043E\u0440\u0443\u0447\u0435\u043D\u043E)
+OptionPanel.signed_script_are_trusted.tooltip=\u0410\u043A\u043E \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u0438\u043C\u0430\u0458\u0443 \u043F\u043E\u0432\u0435\u0440\u0459\u0438\u0432 \u043F\u043E\u0442\u043F\u0438\u0441 (\u043D\u043F\u0440. \u0430\u0443\u0442\u043E\u0440\u0430 Freeplanea \u0438\u043B\u0438 \u0441\u0443 \u0432\u043B\u0430\u0441\u0442\u0438\u0442\u0435), \u0438\u0437\u0432\u043E\u0434\u0438\u045B\u0435 \u0441\u0435 \u0431\u0435\u0437 \u043E\u0433\u0440\u0430\u043D\u0 [...]
+OptionPanel.simplyhtml.default_paste_mode=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0438 \u0440\u0435\u0436\u0438\u043C \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0430
+OptionPanel.single_backup_directory=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0458\u0435\u0434\u0430\u043D\u0443 \u0444\u0430\u0441\u0446\u0438\u043A\u043B\u0443 \u0437\u0430 \u043F\u0440\u0438\u0447\u0443\u0432\u043D\u0443 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443
+OptionPanel.single_backup_directory.tooltip=<html>\u0427\u0443\u0432\u0430\u045A\u0435 \u043F\u0440\u0438\u0447\u0443\u0432\u043D\u0435 \u0443 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u0434\u0435\u0444\u0438\u043D\u0438\u0441\u0430\u043D\u0443 \u0444\u0430\u0441\u0446\u0438\u043A\u043B\u0443, \u0430\u043A\u043E \u043D\u0438\u0458\u0435 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0430\u043D\u043E, \u043F\u0440\u0438\u0447\u0443\u0432\u043D\u0430 \u045B\u0435 \u0431\u0 [...]
+OptionPanel.single_backup_directory_path=\u0424\u0430\u0441\u0446\u0438\u043A\u043B\u0430 \u043F\u0440\u0438\u0447\u0443\u0432\u043D\u0435 (\u0430\u043A\u043E \u0458\u0435 \u0430\u043A\u0442\u0438\u0432\u0438\u0440\u0430\u043D\u0430 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442 \u0438\u0437\u043D\u0430\u0434)
+OptionPanel.single_backup_directory_path.tooltip=<html>\u041F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u043F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0443 \u043F\u0443\u0442\u0430\u045A\u0443 <freeplaneuserdir>/.backup</html>
+OptionPanel.single_instance=\u041E\u0442\u0432\u043E\u0440\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0443 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u043C \u043F\u0440\u043E\u0437\u043E\u0440\u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430
+OptionPanel.single_instance_force=\u0418\u0437\u0431\u0435\u0433\u043D\u0438 \u043E\u0442\u0432\u0430\u0440\u0430\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0443 \u043D\u043E\u0432\u043E\u043C \u043F\u0440\u043E\u0437\u043E\u0440\u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430
+OptionPanel.single_instance_force.tooltip=\u0418\u0437\u0431\u0435\u0433\u0430\u0432\u0430\u0458\u0442\u0435 \u0434\u0440\u0443\u0433\u0438 \u0441\u043B\u0443\u0447\u0430\u0458, \u0447\u0430\u043A \u0438 \u0430\u043A\u043E \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0437\u0430 \u0443\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435
+OptionPanel.sk=\u0421\u043B\u043E\u0432\u0430\u0447\u043A\u0438 / sloven\u010Dina
+OptionPanel.sl=\u0421\u043B\u043E\u0432\u0435\u043D\u0430\u0447\u043A\u0438 / sloven\u0161\u010Dina
+OptionPanel.spelling_opt_case_sensitive=\u041E\u0441\u0435\u0442\u0459\u0438\u0432 \u043D\u0430 \u0432\u0435\u043B\u0438\u0447\u0438\u043D\u0443 \u0441\u043B\u043E\u0432\u0430
+OptionPanel.spelling_opt_ignore_all_caps_words=\u0417\u0430\u043D\u0435\u043C\u0430\u0440\u0438 \u0440\u0435\u0447\u0438 \u043F\u0438\u0441\u0430\u043D\u0435 \u0432\u0435\u043B\u0438\u043A\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430
+OptionPanel.spelling_opt_ignore_capitalization=\u0417\u0430\u043D\u0435\u043C\u0430\u0440\u0438 \u0432\u0435\u043B\u0438\u043A\u0430 \u0441\u043B\u043E\u0432\u0430 \u043D\u0430 \u043F\u043E\u0447\u0435\u0442\u043A\u0443 \u0440\u0435\u0447\u0438
+OptionPanel.spelling_opt_ignore_words_with_numbers=\u0417\u0430\u043D\u0435\u043C\u0430\u0440\u0438 \u0440\u0435\u0447\u0438 \u043A\u043E\u0458\u0435 \u0441\u0430\u0434\u0440\u0436\u0435 \u0431\u0440\u043E\u0458\u0435\u0432\u0435
+OptionPanel.spelling_opt_suggestions_limit_dialog=\u041D\u0430\u0458\u0432\u0435\u045B\u0438 \u0431\u0440\u043E\u0458 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0445 \u0440\u0435\u0447\u0438 \u0443 \u0434\u0438\u0458\u0430\u043B\u043E\u0433\u0443
+OptionPanel.spelling_opt_suggestions_limit_menu=\u041D\u0430\u0458\u0432\u0435\u045B\u0438 \u0431\u0440\u043E\u0458 \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u0438\u0445 \u0440\u0435\u0447\u0438 \u0443 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0443
+OptionPanel.sr=\u0421\u0440\u043F\u0441\u043A\u0438 / \u0441\u0440\u043F\u0441\u043A\u0438
+OptionPanel.standard_template=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u0430\u043D \u0448\u0430\u0431\u043B\u043E\u043D \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435
+OptionPanel.standardbackgroundcolor=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0430
+OptionPanel.standardbackgroundcolor.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0435 \u043C\u0430\u043F\u0435 \u0443 HTML \u0437\u0430\u043F\u0438\u0441\u0443 </html>
+OptionPanel.standardcloudcolor=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u043E\u0431\u043B\u0430\u0447\u0438\u045B\u0430
+OptionPanel.standardcloudcolor.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u043E\u0431\u043B\u0430\u0447\u0438\u045B\u0430 \u0443 HTML \u0437\u0430\u043F\u0438\u0441\u0443 </html>
+OptionPanel.standardcloudestyle=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u0430\u043D \u0441\u0442\u0438\u043B \u043E\u0431\u043B\u0430\u0447\u0438\u045B\u0430
+OptionPanel.standardcloudestyle.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0441\u0442\u0438\u043B \u043E\u0431\u043B\u0430\u0447\u0438\u045B\u0430. \u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D \u0441\u0430\u043C\u043E 'bezier' </html>
+OptionPanel.standarddrawrectangleforselection=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u043C\u0435\u0445\u0443\u0440\u0438\u045B \u0437\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440.
+OptionPanel.standarddrawrectangleforselection.tooltip=<html>\u041E\u0434\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440 \u0438\u043C\u0430 \u043C\u0435\u0445\u0443\u0440\u0438\u045B \u0441\u0430 \u0437\u0430\u043E\u0431\u0459\u0435\u043D\u0438\u043C \u0443\u0433\u043B\u043E\u0432\u0438\u043C\u0430 \u043E\u043A\u043E \u0441\u0435\u0431\u0435 .</html>
+OptionPanel.standardlinkcolor=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u0432\u0435\u0437\u0435
+OptionPanel.standardlinkcolor.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u0432\u0435\u0437\u0435 \u0443 HTML \u0437\u0430\u043F\u0438\u0441\u0443 </html>
+OptionPanel.standardlinkestyle=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u0430\u043D \u0441\u0442\u0438\u043B \u0432\u0435\u0437\u0435
+OptionPanel.standardlinkestyle.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0441\u0442\u0438\u043B \u0432\u0435\u0437\u0435. \u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D \u0441\u0430\u043C\u043E 'bezier' </html>
+OptionPanel.standardselectednodecolor=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.standardselectednodecolor.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430. \u0423 HTML \u0437\u0430\u043F\u0438\u0441\u0443 (#RRGGBB \u0443 \u0445\u0435\u043A\u0441\u0430\u0434\u0435\u0446\u0438\u043C\u0430\u043B\u043D\u043E\u0458 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438) </html>
+OptionPanel.standardselectednoderectanglecolor=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u043C\u0435\u0445\u0443\u0440\u0438\u045B\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.standardselectednoderectanglecolor.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0431\u043E\u0458\u0430 \u043E\u043A\u0432\u0438\u0440\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430. \u0423 HTML \u0437\u0430\u043F\u0438\u0441\u0443 (#RRGGBB \u0443 \u0445\u0435\u043A\u0441\u0430\u0434\u0435\u0446\u0438\u043C\u0430\u043B\u043D\u043E\u0458 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438) </html>
OptionPanel.STAR=\u0417\u0432\u0435\u0437\u0434\u0430
-OptionPanel.structured_html_import=\u0423\u0432\u043e\u0437 HTML-\u0430 \u043a\u0430\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-OptionPanel.structured_icon_toolbar=\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0430\u043d\u0430 \u0438\u043a\u043e\u043d\u0430 \u0442\u0440\u0430\u043a\u0435 \u0430\u043b\u0430\u0442\u0430
-OptionPanel.summary=\u0420\u0435\u0437\u0438\u043c\u0435
-OptionPanel.sv=\u0428\u0432\u0435\u0434\u0441\u043a\u0438 / svenska
-OptionPanel.text.use_ctrl_key=\u041a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 '\u0414\u043e\u0434\u0435\u043b\u0438 \u043f\u0440\u0435\u0447\u0438\u0446\u0435' \u0438\u0437 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0430 \u0430\u043b\u0430\u0442\u043a\u0438
-OptionPanel.time_for_automatic_save=\u0412\u0440\u0435\u043c\u0435 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e\u0433 \u0447\u0443\u0432\u0430\u045a\u0430
-OptionPanel.time_for_automatic_save.tooltip=<html> \u0432\u0440\u0435\u043c\u0435 \u0438\u0437\u043c\u0435\u0452\u0443 \u0434\u0432\u0430 \u0443\u0437\u0430\u0441\u0442\u043e\u043f\u043d\u0430 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0430 \u0447\u0443\u0432\u0430\u045a\u0430 (\u0443 \u043c\u0441\u0435\u043a): \u0437\u0430 \u043e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u0430\u0432\u0430\u045a\u0435 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e\u0433 \u0447\ [...]
-OptionPanel.time_for_delayed_selection=\u0412\u0440\u0435\u043c\u0435 \u043a\u0430\u0448\u045a\u0435\u045a\u0430 \u043e\u0434\u0430\u0431\u0438\u0440\u0430
-OptionPanel.time_for_delayed_selection.tooltip=<html> \u0412\u0440\u0435\u043c\u0435\u043d\u0441\u043a\u043e \u0437\u0430\u043a\u0430\u0448\u045a\u0435\u045a\u0435 \u043e\u0434\u0430\u0431\u0438\u0440\u0430 \u0447\u0432\u043e\u0440\u0430 \u043a\u0430\u0434\u0430 \u0458\u0435 \u043f\u043e\u043a\u0430\u0437\u0438\u0432\u0430\u0447 \u043c\u0438\u0448\u0430 \u0438\u0437\u043d\u0430\u0434 \u0447\u0432\u043e\u0440\u0430 (\u0443 \u043c\u0438\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430 [...]
-OptionPanel.toolTipManager.dismissDelay=\u0412\u0440\u0435\u043c\u0435 \u043f\u0440\u0435\u0441\u0442\u0430\u043d\u043a\u0430 \u043f\u0440\u0438\u043a\u0430\u0437\u0430, \u043c\u0441
-OptionPanel.toolTipManager.initialDelay=\u0412\u0440\u0435\u043c\u0435 \u043f\u043e\u0447\u0435\u0442\u043a\u0430 \u043f\u0440\u0438\u043a\u0430\u0437\u0430, \u043c\u0441
-OptionPanel.toolTipManager.max_tooltip_width=\u0428\u0438\u0440\u0438\u043d\u0430 \u0441\u0430\u0432\u0435\u0442\u0430 \u0447\u0432\u043e\u0440\u0430
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u0441\u0430\u0432\u0435\u0442\u0430 \u0443 \u0442\u0430\u0447\u043a\u0438\u0446\u0430\u043c\u0430</html>
-OptionPanel.toolTipManager.reshowDelay=\u0412\u0440\u0435\u043c\u0435 \u043f\u043e\u043d\u043e\u0432\u043d\u043e\u0433 \u043f\u0440\u0438\u043a\u0430\u0437\u0430, ms
-OptionPanel.uk_UA=\u0423\u043a\u0440\u0430\u0458\u0438\u043d\u0441\u043a\u0438 / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430
-OptionPanel.undefined_font=\u041d\u0435\u0434\u0435\u0444\u0438\u043d\u0438\u0441\u0430\u043d \u043e\u0431\u043b\u0438\u043a \u0441\u043b\u043e\u0432\u0430
-OptionPanel.undo_levels=\u041d\u0438\u0432\u043e\u0438 \u043e\u043f\u043e\u0437\u0438\u0432\u0430
-OptionPanel.undo_levels.tooltip=<html>\u041e\u0434\u0440\u0435\u0452\u0438\u0432\u0430\u045a\u0435 \u0431\u0440\u043e\u0458\u0430 \u0441\u0430\u0447\u0443\u0432\u0430\u043d\u0438\u0445 \u043a\u043e\u0440\u0430\u043a\u0430 \u043a\u043e\u0458\u0438 \u045b\u0435 \u0441\u0435 \u043c\u043e\u045b\u0438 \u0432\u0440\u0430\u0442\u0438\u0442\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0458\u043e\u043c "\u041e\u043f\u043e\u0437\u043e\u0432\u0438".</html>
-OptionPanel.unfold_on_paste=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0447\u0432\u043e\u0440 \u043a\u0430\u0434 \u0433\u0430 \u043d\u0430\u043b\u0435\u043f\u0438\u0448
-OptionPanel.unfold_on_paste.tooltip=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0447\u0432\u043e\u0440 \u043a\u0430\u0434 \u0433\u0430 \u043d\u0430\u043b\u0435\u043f\u0438\u0448 \u0438\u043b\u0438 \u043a\u0430\u0434 \u043f\u0440\u0435\u0432\u0443\u0447\u0435\u0448 \u0438 \u043f\u0443\u0441\u0442\u0438\u0448 \u0447\u0432\u043e\u0440
-OptionPanel.use_common_out_point_for_root_node=\u0420\u0443\u0431\u043e\u0432\u0438 \u0437\u0430\u043f\u043e\u0447\u0438\u045a\u0443 \u0438\u0437 \u0458\u0435\u0434\u043d\u0435 \u0442\u0430\u0447\u043a\u0435 \u043d\u0430 \u0438\u0437\u0432\u043e\u0440\u043d\u043e\u043c \u0447\u0432\u043e\u0440\u0443
-OptionPanel.use_common_out_point_for_root_node.tooltip=\u0420\u0443\u0431\u043e\u0432\u0438 \u0437\u0430\u043f\u043e\u0447\u0438\u045a\u0443 \u0438\u0437 \u0458\u0435\u0434\u043d\u0435 \u0442\u0430\u0447\u043a\u0435 \u043d\u0430 \u0438\u0437\u0432\u043e\u0440\u043d\u043e\u043c \u0447\u0432\u043e\u0440\u0443
-OptionPanel.use_tabbed_pane=\u041a\u043e\u0440\u0438\u0441\u0442\u0438 \u043a\u0430\u0440\u0442\u0438\u0446\u0435
-OptionPanel.use_tabbed_pane.tooltip=\u0410\u043a\u043e \u0441\u0443 \u0430\u043a\u0442\u0438\u0432\u043d\u0435 \u043c\u0430\u043f\u0435 \u045b\u0435 \u0441\u0435 \u043f\u0440\u0438\u043a\u0430\u0437\u0438\u0432\u0430\u0442\u0438 \u0443 \u043a\u0430\u0440\u0442\u0438\u0446\u0430\u043c\u0430 (\u043a\u0430\u043e \u0443 FireFox-\u0443 :-) ).
-OptionPanel.user_defined_screen_resolution=\u041a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0438 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0430 \u0440\u0435\u0437\u043e\u043b\u0443\u0446\u0438\u0458\u0430 \u0435\u043a\u0440\u0430\u043d\u0430 (dpi)
-OptionPanel.validate_classpath_needs_readaccess=\u0418\u0437\u0432\u043e\u0452\u0435\u045a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0438: \u041a\u0430\u0434\u0430 \u0441\u0443 \u043f\u043e\u0441\u0442\u0430\u0432\u0459\u0435\u043d\u0435 \u043f\u0443\u0442\u0430\u045a\u0435 \u0447\u0438\u0442\u0430\u045a\u0430 JAR \u0438 .class \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u043c\u043e\u0440\u0430\u0442\u0435 \u043e\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0438 \u0447\u0438\u0442\ [...]
-OptionPanel.validate_invalid_date_format=\u041d\u0435\u0432\u0430\u0436\u0435\u045b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u0430\u0442\u0443\u043c\u0430
-OptionPanel.validate_invalid_datetime_format=\u041d\u0435\u0432\u0430\u0436\u0435\u045b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0438 \u0434\u0430\u0442\u0443\u043c\u0430
-OptionPanel.validate_invalid_number_format=\u041d\u0435\u0432\u0430\u0436\u0435\u045b\u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442 \u0431\u0440\u043e\u0458\u0430
-OptionPanel.validate_write_without_read=\u0418\u0437\u0432\u043e\u0452\u0435\u045a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0438: \u043e\u043c\u043e\u0433\u0443\u045b\u0438\u0442\u0435 \u0447\u0438\u0442\u0430\u045a\u0435 \u0438 \u043f\u0438\u0441\u0430\u045a\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430
-OptionPanel.validation_error=<html><body>\u041f\u043e\u0442\u0432\u0440\u0434\u0430 \u0433\u0440\u0435\u0448\u043a\u0435:<p><em>{0}</em><p>\u041f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 \u043a\u0430\u043a\u043e \u0431\u0438 \u0443\u043a\u043b\u043e\u043d\u0438\u043b\u0438 \u0433\u0440\u0435\u0448\u043a\u0443.</body></html>
-OptionPanel.validation_warning=<html><body>\u041f\u043e\u0442\u0432\u0440\u0434\u0430 \u0443\u043f\u043e\u0437\u043e\u0440\u0435\u045a\u0430:<p><em>{0}</em></body></html>
-OptionPanel.vi=\u0412\u0438\u0458\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438 / Ti\u1ebfng Vi\u1ec7t
-OptionPanel.wheel_velocity=\u0411\u0440\u0437\u0438\u043d\u0430
-OptionPanel.wheel_velocity.tooltip=\u0412\u0435\u045b\u0430 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442 \u0440\u0435\u0437\u0443\u043b\u0442\u0443\u0458\u0435 \u043a\u043e\u0434 \u043f\u043e\u043c\u0430\u043a\u0430 \u0442\u043e\u0447\u043a\u0438\u045b\u0430 \u043c\u0438\u0448\u0430 \u0431\u0440\u0436\u0435 \u0443\u0447\u0438\u043d\u043a\u0435 \u043d\u0430 \u043c\u0430\u043f\u0438.
+OptionPanel.structured_html_import=\u0423\u0432\u043E\u0437 HTML-\u0430 \u043A\u0430\u043E \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+OptionPanel.structured_icon_toolbar=\u0421\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0438\u0440\u0430\u043D\u0430 \u0438\u043A\u043E\u043D\u0430 \u0442\u0440\u0430\u043A\u0435 \u0430\u043B\u0430\u0442\u0430
+OptionPanel.summary=\u0420\u0435\u0437\u0438\u043C\u0435
+OptionPanel.sv=\u0428\u0432\u0435\u0434\u0441\u043A\u0438 / svenska
+OptionPanel.text.use_ctrl_key=\u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 '\u0414\u043E\u0434\u0435\u043B\u0438 \u043F\u0440\u0435\u0447\u0438\u0446\u0435' \u0438\u0437 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0430 \u0430\u043B\u0430\u0442\u043A\u0438
+OptionPanel.time_for_automatic_save=\u0412\u0440\u0435\u043C\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E\u0433 \u0447\u0443\u0432\u0430\u045A\u0430
+OptionPanel.time_for_automatic_save.tooltip=<html> \u0432\u0440\u0435\u043C\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 \u0434\u0432\u0430 \u0443\u0437\u0430\u0441\u0442\u043E\u043F\u043D\u0430 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0430 \u0447\u0443\u0432\u0430\u045A\u0430 (\u0443 \u043C\u0441\u0435\u043A): \u0437\u0430 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430\u045A\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E\u0433 \u0447\ [...]
+OptionPanel.time_for_delayed_selection=\u0412\u0440\u0435\u043C\u0435 \u043A\u0430\u0448\u045A\u0435\u045A\u0430 \u043E\u0434\u0430\u0431\u0438\u0440\u0430
+OptionPanel.time_for_delayed_selection.tooltip=<html> \u0412\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u043E \u0437\u0430\u043A\u0430\u0448\u045A\u0435\u045A\u0435 \u043E\u0434\u0430\u0431\u0438\u0440\u0430 \u0447\u0432\u043E\u0440\u0430 \u043A\u0430\u0434\u0430 \u0458\u0435 \u043F\u043E\u043A\u0430\u0437\u0438\u0432\u0430\u0447 \u043C\u0438\u0448\u0430 \u0438\u0437\u043D\u0430\u0434 \u0447\u0432\u043E\u0440\u0430 (\u0443 \u043C\u0438\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430 [...]
+OptionPanel.toolTipManager.dismissDelay=\u0412\u0440\u0435\u043C\u0435 \u043F\u0440\u0435\u0441\u0442\u0430\u043D\u043A\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0430, \u043C\u0441
+OptionPanel.toolTipManager.initialDelay=\u0412\u0440\u0435\u043C\u0435 \u043F\u043E\u0447\u0435\u0442\u043A\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0430, \u043C\u0441
+OptionPanel.toolTipManager.max_tooltip_width=\u0428\u0438\u0440\u0438\u043D\u0430 \u0441\u0430\u0432\u0435\u0442\u0430 \u0447\u0432\u043E\u0440\u0430
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0441\u0430\u0432\u0435\u0442\u0430 \u0443 \u0442\u0430\u0447\u043A\u0438\u0446\u0430\u043C\u0430</html>
+OptionPanel.toolTipManager.reshowDelay=\u0412\u0440\u0435\u043C\u0435 \u043F\u043E\u043D\u043E\u0432\u043D\u043E\u0433 \u043F\u0440\u0438\u043A\u0430\u0437\u0430, ms
+OptionPanel.uk_UA=\u0423\u043A\u0440\u0430\u0458\u0438\u043D\u0441\u043A\u0438 / \u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430
+OptionPanel.undefined_font=\u041D\u0435\u0434\u0435\u0444\u0438\u043D\u0438\u0441\u0430\u043D \u043E\u0431\u043B\u0438\u043A \u0441\u043B\u043E\u0432\u0430
+OptionPanel.undo_levels=\u041D\u0438\u0432\u043E\u0438 \u043E\u043F\u043E\u0437\u0438\u0432\u0430
+OptionPanel.undo_levels.tooltip=<html>\u041E\u0434\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0435 \u0431\u0440\u043E\u0458\u0430 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0438\u0445 \u043A\u043E\u0440\u0430\u043A\u0430 \u043A\u043E\u0458\u0438 \u045B\u0435 \u0441\u0435 \u043C\u043E\u045B\u0438 \u0432\u0440\u0430\u0442\u0438\u0442\u0438 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u043E\u043C "\u041E\u043F\u043E\u0437\u043E\u0432\u0438".</html>
+OptionPanel.unfold_on_paste=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0447\u0432\u043E\u0440 \u043A\u0430\u0434 \u0433\u0430 \u043D\u0430\u043B\u0435\u043F\u0438\u0448
+OptionPanel.unfold_on_paste.tooltip=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0447\u0432\u043E\u0440 \u043A\u0430\u0434 \u0433\u0430 \u043D\u0430\u043B\u0435\u043F\u0438\u0448 \u0438\u043B\u0438 \u043A\u0430\u0434 \u043F\u0440\u0435\u0432\u0443\u0447\u0435\u0448 \u0438 \u043F\u0443\u0441\u0442\u0438\u0448 \u0447\u0432\u043E\u0440
+OptionPanel.use_common_out_point_for_root_node=\u0420\u0443\u0431\u043E\u0432\u0438 \u0437\u0430\u043F\u043E\u0447\u0438\u045A\u0443 \u0438\u0437 \u0458\u0435\u0434\u043D\u0435 \u0442\u0430\u0447\u043A\u0435 \u043D\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u043C \u0447\u0432\u043E\u0440\u0443
+OptionPanel.use_common_out_point_for_root_node.tooltip=\u0420\u0443\u0431\u043E\u0432\u0438 \u0437\u0430\u043F\u043E\u0447\u0438\u045A\u0443 \u0438\u0437 \u0458\u0435\u0434\u043D\u0435 \u0442\u0430\u0447\u043A\u0435 \u043D\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u043C \u0447\u0432\u043E\u0440\u0443
+OptionPanel.use_tabbed_pane=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u043A\u0430\u0440\u0442\u0438\u0446\u0435
+OptionPanel.use_tabbed_pane.tooltip=\u0410\u043A\u043E \u0441\u0443 \u0430\u043A\u0442\u0438\u0432\u043D\u0435 \u043C\u0430\u043F\u0435 \u045B\u0435 \u0441\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0438\u0432\u0430\u0442\u0438 \u0443 \u043A\u0430\u0440\u0442\u0438\u0446\u0430\u043C\u0430 (\u043A\u0430\u043E \u0443 FireFox-\u0443 :-) ).
+OptionPanel.user_defined_screen_resolution=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0430 \u0440\u0435\u0437\u043E\u043B\u0443\u0446\u0438\u0458\u0430 \u0435\u043A\u0440\u0430\u043D\u0430 (dpi)
+OptionPanel.validate_classpath_needs_readaccess=\u0418\u0437\u0432\u043E\u0452\u0435\u045A\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0438: \u041A\u0430\u0434\u0430 \u0441\u0443 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0435 \u043F\u0443\u0442\u0430\u045A\u0435 \u0447\u0438\u0442\u0430\u045A\u0430 JAR \u0438 .class \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043C\u043E\u0440\u0430\u0442\u0435 \u043E\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0438 \u0447\u0438\u0442\ [...]
+OptionPanel.validate_invalid_date_format=\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u0430\u0442\u0443\u043C\u0430
+OptionPanel.validate_invalid_datetime_format=\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0432\u0440\u0435\u043C\u0435\u043D\u0430 \u0438 \u0434\u0430\u0442\u0443\u043C\u0430
+OptionPanel.validate_invalid_number_format=\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0431\u0440\u043E\u0458\u0430
+OptionPanel.validate_write_without_read=\u0418\u0437\u0432\u043E\u0452\u0435\u045A\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0438: \u043E\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0435 \u0447\u0438\u0442\u0430\u045A\u0435 \u0438 \u043F\u0438\u0441\u0430\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430
+OptionPanel.validation_error=<html><body>\u041F\u043E\u0442\u0432\u0440\u0434\u0430 \u0433\u0440\u0435\u0448\u043A\u0435:<p><em>{0}</em><p>\u041F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u043A\u0430\u043A\u043E \u0431\u0438 \u0443\u043A\u043B\u043E\u043D\u0438\u043B\u0438 \u0433\u0440\u0435\u0448\u043A\u0443.</body></html>
+OptionPanel.validation_warning=<html><body>\u041F\u043E\u0442\u0432\u0440\u0434\u0430 \u0443\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0430:<p><em>{0}</em></body></html>
+OptionPanel.vi=\u0412\u0438\u0458\u0435\u0442\u043D\u0430\u043C\u0441\u043A\u0438 / Ti\u1EBFng Vi\u1EC7t
+OptionPanel.wheel_velocity=\u0411\u0440\u0437\u0438\u043D\u0430
+OptionPanel.wheel_velocity.tooltip=\u0412\u0435\u045B\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u0440\u0435\u0437\u0443\u043B\u0442\u0443\u0458\u0435 \u043A\u043E\u0434 \u043F\u043E\u043C\u0430\u043A\u0430 \u0442\u043E\u0447\u043A\u0438\u045B\u0430 \u043C\u0438\u0448\u0430 \u0431\u0440\u0436\u0435 \u0443\u0447\u0438\u043D\u043A\u0435 \u043D\u0430 \u043C\u0430\u043F\u0438.
OptionPanel.windows=Windows
-OptionPanel.zh_CN=\u041a\u0438\u043d\u0435\u0441\u043a\u0438, \u043f\u043e\u0458\u0435\u0434\u043d\u043e\u0441\u0442\u0430\u0432\u0459\u0435\u043d\u0438 / \u7b80\u4f53\u5b57
-OptionPanel.zh_TW=\u041a\u0438\u043d\u0435\u0441\u043a\u0438, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u0430\u043b\u043d\u0438 / \u7e41\u9ad4\u5b57
-org.freeplane.plugin.bugreport.agree=\u041f\u043e\u0448\u0430\u0459\u0438
-org.freeplane.plugin.bugreport.always_agree=\u0423\u0432\u0435\u043a \u043f\u043e\u0448\u0430\u0459\u0438
-org.freeplane.plugin.bugreport.always_deny=\u041d\u0438\u043a\u0430\u0434 \u043d\u0435 \u0448\u0430\u0459\u0438
-org.freeplane.plugin.bugreport.deny=\u041d\u0435 \u0448\u0430\u0459\u0438
-org.freeplane.plugin.bugreport.dialog.title=\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043e \u0433\u0440\u0435\u0448\u0446\u0438
-org.freeplane.plugin.bugreport.freeplane_team=\u041f\u043e\u0440\u0443\u043a\u0430 Freeplane \u0442\u0438\u043c\u0430
-org.freeplane.plugin.bugreport.lastreport=\u041f\u0440\u0438\u043c\u0459\u0435\u043d\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458
-org.freeplane.plugin.bugreport.never=\u041d\u0438\u043a\u0430\u0434 \u043d\u0435 \u043f\u0438\u0442\u0430\u0458 \u0437\u0430 \u043f\u043e\u043c\u043e\u045b
-org.freeplane.plugin.bugreport.question=Freeplane \u0438\u043c\u0430 \u0443\u0433\u0440\u0430\u0452\u0435\u043d \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c \u043f\u0440\u0430\u045b\u0435\u045a\u0430 \u0433\u0440\u0435\u0448\u0430\u043a\u0430.
-org.freeplane.plugin.bugreport.report=\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458
-org.freeplane.plugin.bugreport.wanted_bug=\u041f\u0440\u0438\u0458\u0430\u0432\u0459\u0435\u043d\u0430 \u0458\u0435 \u0443\u043d\u0443\u0442\u0440\u0430\u0448\u045a\u0430 \u0433\u0440\u0435\u0448\u043a\u0430 \u0438 \u0434\u0430\u0442 \u0458\u0435 \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458
-org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined=\u0427\u0432\u043e\u0440 {0} \u043d\u0438\u0458\u0435 \u043e\u0434\u0440\u0435\u0452\u0435\u043d
-out_of_memory=\u041f\u0440\u0435\u043c\u0430\u043b\u043e \u0441\u043b\u043e\u0431\u043e\u0434\u043d\u0435 \u043c\u0435\u043c\u043e\u0440\u0438\u0458\u0435.
-overwrite_keyset_question=\u0417\u0430\u043c\u0435\u043d\u0438 \u043f\u043e\u0441\u0442\u043e\u0458\u0435\u045b\u0438 \u0441\u043a\u0443\u043f \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0435\u0447\u0438\u0446\u0430?
-PageAction.text=\u041f\u043e\u0434\u0435\u0448\u0430\u0432\u0430\u045a\u0435 \u0448\u0442\u0430\u043c\u043f\u0430\u045a\u0430...
-password_is_not_ascii=\u041b\u043e\u0437\u0438\u043d\u043a\u0430 \u043d\u0438\u0458\u0435 ASCII
-PasteAction.text=& \u041d\u0430\u043b\u0435\u043f\u0438
-PasteAttributes.text=\u041d\u0430\u043b\u0435\u043f\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435
-PatternNewNameProperty=\u041d\u043e\u0432\u0438 \u0448\u0430\u0431\u043b\u043e\u043d
-PatternToString.backgroundColor=\u0411\u043e\u0458\u0430 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0435
-PatternToString.Child=\u0421\u0442\u0438\u043b \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u043e\u0433 \u0447\u0432\u043e\u0440\u0430
-PatternToString.color=\u0411\u043e\u0458\u0430
-PatternToString.EdgeColor=\u0411\u043e\u0458\u0430 \u0440\u0443\u0431\u0430
-PatternToString.EdgeStyle=\u0421\u0442\u0438\u043b \u0440\u0443\u0431\u0430
-PatternToString.EdgeWidth=\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u0443\u0431\u0430
-PatternToString.FontBold=\u041f\u043e\u0434\u0435\u0431\u0459\u0430\u043d\u043e
-PatternToString.FontItalic=\u0418\u0441\u043a\u043e\u0448\u0435\u043d\u043e
-PatternToString.FontName=\u041d\u0430\u0437\u0438\u0432 \u0441\u043b\u043e\u0432\u043e\u043b\u0438\u043a\u0430
-PatternToString.Icon=\u0418\u043a\u043e\u043d\u0430
-PatternToString.NodeFontSize=\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430
+OptionPanel.zh_CN=\u041A\u0438\u043D\u0435\u0441\u043A\u0438, \u043F\u043E\u0458\u0435\u0434\u043D\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0438 / \u7B80\u4F53\u5B57
+OptionPanel.zh_TW=\u041A\u0438\u043D\u0435\u0441\u043A\u0438, \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043E\u043D\u0430\u043B\u043D\u0438 / \u7E41\u9AD4\u5B57
+org.freeplane.plugin.bugreport.agree=\u041F\u043E\u0448\u0430\u0459\u0438
+org.freeplane.plugin.bugreport.always_agree=\u0423\u0432\u0435\u043A \u043F\u043E\u0448\u0430\u0459\u0438
+org.freeplane.plugin.bugreport.always_deny=\u041D\u0438\u043A\u0430\u0434 \u043D\u0435 \u0448\u0430\u0459\u0438
+org.freeplane.plugin.bugreport.deny=\u041D\u0435 \u0448\u0430\u0459\u0438
+org.freeplane.plugin.bugreport.dialog.title=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043E \u0433\u0440\u0435\u0448\u0446\u0438
+org.freeplane.plugin.bugreport.freeplane_team=\u041F\u043E\u0440\u0443\u043A\u0430 Freeplane \u0442\u0438\u043C\u0430
+org.freeplane.plugin.bugreport.lastreport=\u041F\u0440\u0438\u043C\u0459\u0435\u043D\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458
+org.freeplane.plugin.bugreport.never=\u041D\u0438\u043A\u0430\u0434 \u043D\u0435 \u043F\u0438\u0442\u0430\u0458 \u0437\u0430 \u043F\u043E\u043C\u043E\u045B
+org.freeplane.plugin.bugreport.question=Freeplane \u0438\u043C\u0430 \u0443\u0433\u0440\u0430\u0452\u0435\u043D \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u043F\u0440\u0430\u045B\u0435\u045A\u0430 \u0433\u0440\u0435\u0448\u0430\u043A\u0430.
+org.freeplane.plugin.bugreport.report=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458
+org.freeplane.plugin.bugreport.wanted_bug=\u041F\u0440\u0438\u0458\u0430\u0432\u0459\u0435\u043D\u0430 \u0458\u0435 \u0443\u043D\u0443\u0442\u0440\u0430\u0448\u045A\u0430 \u0433\u0440\u0435\u0448\u043A\u0430 \u0438 \u0434\u0430\u0442 \u0458\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined=\u0427\u0432\u043E\u0440 {0} \u043D\u0438\u0458\u0435 \u043E\u0434\u0440\u0435\u0452\u0435\u043D
+out_of_memory=\u041F\u0440\u0435\u043C\u0430\u043B\u043E \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0435 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0435.
+overwrite_keyset_question=\u0417\u0430\u043C\u0435\u043D\u0438 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0438 \u0441\u043A\u0443\u043F \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0435\u0447\u0438\u0446\u0430?
+PageAction.text=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u0448\u0442\u0430\u043C\u043F\u0430\u045A\u0430...
+password_is_not_ascii=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u043D\u0438\u0458\u0435 ASCII
+PasteAction.text=& \u041D\u0430\u043B\u0435\u043F\u0438
+PasteAttributes.text=\u041D\u0430\u043B\u0435\u043F\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435
+PatternNewNameProperty=\u041D\u043E\u0432\u0438 \u0448\u0430\u0431\u043B\u043E\u043D
+PatternToString.backgroundColor=\u0411\u043E\u0458\u0430 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0435
+PatternToString.Child=\u0421\u0442\u0438\u043B \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u0447\u0432\u043E\u0440\u0430
+PatternToString.color=\u0411\u043E\u0458\u0430
+PatternToString.EdgeColor=\u0411\u043E\u0458\u0430 \u0440\u0443\u0431\u0430
+PatternToString.EdgeStyle=\u0421\u0442\u0438\u043B \u0440\u0443\u0431\u0430
+PatternToString.EdgeWidth=\u0428\u0438\u0440\u0438\u043D\u0430 \u0440\u0443\u0431\u0430
+PatternToString.FontBold=\u041F\u043E\u0434\u0435\u0431\u0459\u0430\u043D\u043E
+PatternToString.FontItalic=\u0418\u0441\u043A\u043E\u0448\u0435\u043D\u043E
+PatternToString.FontName=\u041D\u0430\u0437\u0438\u0432 \u0441\u043B\u043E\u0432\u043E\u043B\u0438\u043A\u0430
+PatternToString.Icon=\u0418\u043A\u043E\u043D\u0430
+PatternToString.NodeFontSize=\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430 \u0441\u043B\u043E\u0432\u0430
pdfKeyDocLocation=./doc/FM_Key_Mappings_Quick_Guide.pdf
periodic_formula={0} * n + {1}
-PeriodUnit.DAY=\u0434\u0430\u043d\u0438
+PeriodUnit.DAY=\u0434\u0430\u043D\u0438
PeriodUnit.HOUR=\u0441\u0430\u0442\u0438
-PeriodUnit.MINUTE=\u043c\u0438\u043d\u0443\u0442\u0435
-PeriodUnit.MONTH=\u043c\u0435\u0441\u0435\u0446\u0438
-PeriodUnit.WEEK=\u0441\u0435\u0434\u043c\u0438\u0446\u0435
-PeriodUnit.YEAR=\u0433\u043e\u0434\u0438\u043d\u0435
-plugins/latex/LatexNodeHook.editorTitle=\u0423\u0440\u0435\u0434\u0438 Latex \u0444\u043e\u0440\u043c\u0443\u043b\u0443
-plugins/script_filter=\u0424\u0438\u043b\u0442\u0435\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 {0}
-plugins/script_filter_error={0} \u0458\u0435 \u043c\u043e\u0440\u0430\u043e \u0432\u0440\u0430\u0442\u0438\u0442\u0438 \u0411\u0443\u043b\u043e\u0432 \u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442 \u043d\u0430 {1}, \u0430\u043b\u0438 \u0458\u0435 \u0432\u0440\u0430\u0442\u0438\u043e {2}
-plugins/ScriptEditor.cancel=&\u041e\u0434\u0431\u0430\u0446\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0435 \u0438 \u0438\u0437\u0430\u0452\u0438
+PeriodUnit.MINUTE=\u043C\u0438\u043D\u0443\u0442\u0435
+PeriodUnit.MONTH=\u043C\u0435\u0441\u0435\u0446\u0438
+PeriodUnit.WEEK=\u0441\u0435\u0434\u043C\u0438\u0446\u0435
+PeriodUnit.YEAR=\u0433\u043E\u0434\u0438\u043D\u0435
+plugins/latex/LatexNodeHook.editorTitle=\u0423\u0440\u0435\u0434\u0438 Latex \u0444\u043E\u0440\u043C\u0443\u043B\u0443
+plugins/script_filter=\u0424\u0438\u043B\u0442\u0435\u0440 \u0441\u043A\u0440\u0438\u043F\u0442\u0435 {0}
+plugins/script_filter_error={0} \u0458\u0435 \u043C\u043E\u0440\u0430\u043E \u0432\u0440\u0430\u0442\u0438\u0442\u0438 \u0411\u0443\u043B\u043E\u0432 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442 \u043D\u0430 {1}, \u0430\u043B\u0438 \u0458\u0435 \u0432\u0440\u0430\u0442\u0438\u043E {2}
+plugins/ScriptEditor.cancel=&\u041E\u0434\u0431\u0430\u0446\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u0438 \u0438\u0437\u0430\u0452\u0438
plugins/ScriptEditor.exit=&\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0438 \u0438\u0437\u0430\u0452\u0438
-plugins/ScriptEditor.FORBIDDEN_ACTION=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045a\u0435 Freeplane groovy \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0458\u0435 \u0437\u0430\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043d\u043e. \u0417\u0430\u0431\u0440\u0430\u045a\u0435\u043d\u0435 \u0441\u0443 {0,choice,0#File|1#Network|2#Exec} \u0441\u043b\u0435\u0434\u0435\u045b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0458\u0435: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast| [...]
-plugins/ScriptEditor.menu_actions=&\u0410\u043a\u0446\u0438\u0458\u0435
-plugins/ScriptEditor.new_script=\u041d\u043e\u0432\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430
-plugins/ScriptEditor.run=&\u041f\u043e\u043a\u0440\u0435\u043d\u0438
-plugins/ScriptEditor.sign=\u041f\u043e\u0442\u043f\u0438\u0441\u0438\u0432\u0430\u045a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0435...
-plugins/ScriptEditor/window.Result=\u0418\u0441\u0445\u043e\u0434:
-plugins/ScriptEditor/window.title=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u0441\u043a\u0440\u0438\u043f\u0442\u0435
-plugins/ScriptingEngine.illegalAccessToInternalAPI=\u041d\u0435\u0434\u043e\u0437\u0432\u043e\u0459\u0435\u043d\u0438 \u043f\u0440\u0438\u0441\u0442\u0443\u043f \u0438\u043d\u0442\u0435\u0440\u043d\u0438\u043c API ( \u043f\u0430\u043a\u0435\u0442 {0}). - \u041c\u043e\u043b\u0438\u043c \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0438\u0440\u0430\u0458\u0442\u0435 Freeplane \u0442\u0438\u043c \u0430\u043a\u043e API \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043d\u0438\u0441\u0443 \u0434 [...]
-plugins/TimeList.xml_Created=\u041d\u0430\u043f\u0440\u0430\u0432\u0459\u0435\u043d\u043e
-plugins/TimeList.xml_Date=\u0414\u0430\u0442\u0443\u043c
-plugins/TimeList.xml_Icons=\u0418\u043a\u043e\u043d\u0435
-plugins/TimeList.xml_Modified=\u0418\u0437\u043c\u0435\u045a\u0435\u043d\u043e
-plugins/TimeList.xml_Notes=\u0411\u0435\u043b\u0435\u0448\u043a\u0435
-plugins/TimeList.xml_Text=\u0422\u0435\u043a\u0441\u0442
-plugins/TimeManagement.xml_appendButton=\u0414\u043e\u0434\u0430\u0458 \u0434\u0430\u0442\u0443\u043c \u0443 \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u0438
-plugins/TimeManagement.xml_Cancel=\u041e\u0442\u043a\u0430\u0436\u0438
-plugins/TimeManagement.xml_cancelButton=\u041e\u0442\u043a\u0430\u0436\u0438
-plugins/TimeManagement.xml_closeButton=\u0417\u0430\u0442\u0432\u043e\u0440\u0438
-plugins/TimeManagement.xml_Export=\u0418\u0437\u0432\u043e\u0437 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
+plugins/ScriptEditor.FORBIDDEN_ACTION=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 Freeplane groovy \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u0458\u0435 \u0437\u0430\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E. \u0417\u0430\u0431\u0440\u0430\u045A\u0435\u043D\u0435 \u0441\u0443 {0,choice,0#File|1#Network|2#Exec} \u0441\u043B\u0435\u0434\u0435\u045B\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0435: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast| [...]
+plugins/ScriptEditor.menu_actions=&\u0410\u043A\u0446\u0438\u0458\u0435
+plugins/ScriptEditor.new_script=\u041D\u043E\u0432\u0430 \u0441\u043A\u0440\u0438\u043F\u0442\u0430
+plugins/ScriptEditor.run=&\u041F\u043E\u043A\u0440\u0435\u043D\u0438
+plugins/ScriptEditor.sign=\u041F\u043E\u0442\u043F\u0438\u0441\u0438\u0432\u0430\u045A\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0435...
+plugins/ScriptEditor/window.Result=\u0418\u0441\u0445\u043E\u0434:
+plugins/ScriptEditor/window.title=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u0447 \u0441\u043A\u0440\u0438\u043F\u0442\u0435
+plugins/ScriptingEngine.illegalAccessToInternalAPI=\u041D\u0435\u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0438\u043D\u0442\u0435\u0440\u043D\u0438\u043C API ( \u043F\u0430\u043A\u0435\u0442 {0}). - \u041C\u043E\u043B\u0438\u043C \u043A\u043E\u043D\u0442\u0430\u043A\u0442\u0438\u0440\u0430\u0458\u0442\u0435 Freeplane \u0442\u0438\u043C \u0430\u043A\u043E API \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u043D\u0438\u0441\u0443 \u0434 [...]
+plugins/TimeList.xml_Created=\u041D\u0430\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u043E
+plugins/TimeList.xml_Date=\u0414\u0430\u0442\u0443\u043C
+plugins/TimeList.xml_Icons=\u0418\u043A\u043E\u043D\u0435
+plugins/TimeList.xml_Modified=\u0418\u0437\u043C\u0435\u045A\u0435\u043D\u043E
+plugins/TimeList.xml_Notes=\u0411\u0435\u043B\u0435\u0448\u043A\u0435
+plugins/TimeList.xml_Text=\u0422\u0435\u043A\u0441\u0442
+plugins/TimeManagement.xml_appendButton=\u0414\u043E\u0434\u0430\u0458 \u0434\u0430\u0442\u0443\u043C \u0443 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438
+plugins/TimeManagement.xml_Cancel=\u041E\u0442\u043A\u0430\u0436\u0438
+plugins/TimeManagement.xml_cancelButton=\u041E\u0442\u043A\u0430\u0436\u0438
+plugins/TimeManagement.xml_closeButton=\u0417\u0430\u0442\u0432\u043E\u0440\u0438
+plugins/TimeManagement.xml_Export=\u0418\u0437\u0432\u043E\u0437 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
plugins/TimeManagement.xml_Find=\u0422\u0440\u0430\u0436\u0438
-plugins/TimeManagement.xml_Goto=\u0418\u0434\u0438 \u043d\u0430
+plugins/TimeManagement.xml_Goto=\u0418\u0434\u0438 \u043D\u0430
plugins/TimeManagement.xml_hour=\u0421\u0430\u0442:
-plugins/TimeManagement.xml_menu_actions=\u0410\u043a\u0446\u0438\u0458\u0435
-plugins/TimeManagement.xml_minute=\u041c\u0438\u043d\u0443\u0442\u0430:
-plugins/TimeManagement.xml_reminderButton=\u041f\u043e\u0434\u0441\u0435\u0442\u0438 \u043c\u0435 \u043d\u0430 \u0442\u0430\u0458 \u0434\u0430\u043d
-plugins/TimeManagement.xml_reminderButton_tooltip=<html>\u041d\u0430\u043a\u043e\u043d \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u043f\u043e\u0447\u0438\u045a\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0441\u043a\u043e \u043e\u0434\u0431\u0440\u043e\u0458\u0430\u0432\u0430\u045a\u0435 \u043f\u0440\u0435\u043c\u0430 \u0434\u043e\u0434\u0435\u0459\u0435\u043d\u043e\u043c \u0434\u0430\u0442\u0443\u043c\u0443. \u041d\u0430\u043a\u043e\u043d \u0438\u0441\u0442\u0435\u043a\u0430 \u0432\u044 [...]
-plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0458\u0435 \u043c\u043e\u0433\u0443\u045b \u0458\u0435\u0434\u0430\u043d \u043f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a \u043f\u043e \u0447\u0432\u043e\u0440\u0443. <br>\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u0438 \u043f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a \u0458\u0435 \u043f\u043e\u0434\u0435\u0459\u0435\u043d \u043d\u0430 {0,date} {0,time}, \u0432\u0430\u [...]
-plugins/TimeManagement.xml_reminderNode_tooltip=\u041f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a \u0437\u0430\u0434\u0430\u0442\u043a\u0430 \u0458\u0435 \u043f\u043e\u0434\u0435\u0448\u0435\u043d \u043d\u0430 {0,date} {0,time}.
-plugins/TimeManagement.xml_remindLaterButton=\u041f\u043e\u0434\u0441\u0435\u0442\u0438 \u043a\u0430\u0441\u043d\u0438\u0458\u0435
-plugins/TimeManagement.xml_remindLaterButton_tooltip=\u041f\u043e\u0434\u0441\u0435\u0442\u0438 \u043a\u0430\u0441\u043d\u0438\u0458\u0435
-plugins/TimeManagement.xml_removeReminderButton=\u0423\u043a\u043b\u043e\u043d\u0438 \u043f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a
-plugins/TimeManagement.xml_removeReminderButton_tooltip=\u0423\u043a\u043b\u043e\u043d\u0438 \u0441\u0432\u0435 \u043f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a\u0435 \u043a\u043e\u0458\u0438 \u0441\u0443 \u043f\u043e\u0432\u0435\u0437\u0430\u043d\u0438 \u0441 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0438\u043c \u0447\u0432\u043e\u0440\u043e\u0432\u0438\u043c\u0430.
-plugins/TimeManagement.xml_Replace=\u0417\u0430\u043c\u0435\u043d\u0438
-plugins/TimeManagement.xml_Replace_All=\u0417\u0430\u043c\u0435\u043d\u0438 \u0441\u0432\u0435
-plugins/TimeManagement.xml_Replace_Selected=\u0417\u0430\u043c\u0435\u043d\u0438 \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u043e
+plugins/TimeManagement.xml_menu_actions=\u0410\u043A\u0446\u0438\u0458\u0435
+plugins/TimeManagement.xml_minute=\u041C\u0438\u043D\u0443\u0442\u0430:
+plugins/TimeManagement.xml_reminderButton=\u041F\u043E\u0434\u0441\u0435\u0442\u0438 \u043C\u0435 \u043D\u0430 \u0442\u0430\u0458 \u0434\u0430\u043D
+plugins/TimeManagement.xml_reminderButton_tooltip=<html>\u041D\u0430\u043A\u043E\u043D \u043A\u043B\u0438\u043A\u0430 \u0437\u0430\u043F\u043E\u0447\u0438\u045A\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u043E \u043E\u0434\u0431\u0440\u043E\u0458\u0430\u0432\u0430\u045A\u0435 \u043F\u0440\u0435\u043C\u0430 \u0434\u043E\u0434\u0435\u0459\u0435\u043D\u043E\u043C \u0434\u0430\u0442\u0443\u043C\u0443. \u041D\u0430\u043A\u043E\u043D \u0438\u0441\u0442\u0435\u043A\u0430 \u0432\u044 [...]
+plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0458\u0435 \u043C\u043E\u0433\u0443\u045B \u0458\u0435\u0434\u0430\u043D \u043F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A \u043F\u043E \u0447\u0432\u043E\u0440\u0443. <br>\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u043F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A \u0458\u0435 \u043F\u043E\u0434\u0435\u0459\u0435\u043D \u043D\u0430 {0,date} {0,time}, \u0432\u0430\u [...]
+plugins/TimeManagement.xml_reminderNode_tooltip=\u041F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A \u0437\u0430\u0434\u0430\u0442\u043A\u0430 \u0458\u0435 \u043F\u043E\u0434\u0435\u0448\u0435\u043D \u043D\u0430 {0,date} {0,time}.
+plugins/TimeManagement.xml_remindLaterButton=\u041F\u043E\u0434\u0441\u0435\u0442\u0438 \u043A\u0430\u0441\u043D\u0438\u0458\u0435
+plugins/TimeManagement.xml_remindLaterButton_tooltip=\u041F\u043E\u0434\u0441\u0435\u0442\u0438 \u043A\u0430\u0441\u043D\u0438\u0458\u0435
+plugins/TimeManagement.xml_removeReminderButton=\u0423\u043A\u043B\u043E\u043D\u0438 \u043F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A
+plugins/TimeManagement.xml_removeReminderButton_tooltip=\u0423\u043A\u043B\u043E\u043D\u0438 \u0441\u0432\u0435 \u043F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A\u0435 \u043A\u043E\u0458\u0438 \u0441\u0443 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438 \u0441 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0438\u043C \u0447\u0432\u043E\u0440\u043E\u0432\u0438\u043C\u0430.
+plugins/TimeManagement.xml_Replace=\u0417\u0430\u043C\u0435\u043D\u0438
+plugins/TimeManagement.xml_Replace_All=\u0417\u0430\u043C\u0435\u043D\u0438 \u0441\u0432\u0435
+plugins/TimeManagement.xml_Replace_Selected=\u0417\u0430\u043C\u0435\u043D\u0438 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u043E
plugins/TimeManagement.xml_Select=\u0418\u0437\u0430\u0431\u0435\u0440\u0438
-plugins/TimeManagement.xml_todayButton=\u0423 \u043f\u043e\u0447\u0435\u0442\u043d\u043e \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440
-plugins/TimeManagement.xml_WindowTitle=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043e\u043c
-plugins/TimeManagement.xml_WindowTitle_All_Nodes=\u041f\u0440\u0435\u0442\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438
-preferences=\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0435
-print_preview_title=\u041f\u0440\u0435\u0433\u043b\u0435\u0434 \u043f\u0440\u0435 \u0448\u0442\u0430\u043c\u043f\u0430\u045a\u0430
-PrintAction.text=\u041e\u0434\u0448\u0442\u0430\u043c\u043f\u0430\u0458 \u043c\u0430\u043f\u0443...
-PrintDirectAction.text=\u041e\u0434\u0448\u0442\u0430\u043c\u043f\u0430\u0458
-printing_settings=\u0420\u0430\u0437\u043c\u0435\u0440\u0430 \u0448\u0442\u0430\u043c\u043f\u0430\u045a\u0430
-PrintPreviewAction.text=&\u041f\u0440\u0435\u0433\u043b\u0435\u0434 \u043f\u0440\u0435 \u0448\u0442\u0430\u043c\u043f\u0430\u045a\u0430...
-PropertyAction.dialog=\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0435
-PropertyAction.text=\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0435 ...
-QuickFilterAction.text=\u0411\u0440\u0437\u0438 \u0444\u0438\u043b\u0442\u0435\u0440
-QuickFindAction.BACK.text=\u041d\u0430\u0452\u0438 \u043f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u043e
-QuickFindAction.FORWARD.text=\u041d\u0430\u0452\u0438 \u0441\u043b\u0435\u0434\u0435\u045b\u0435
-QuickFindAllAction.text=\u041e\u0437\u043d\u0430\u0447\u0438 \u0441\u0432\u0435 \u043f\u0440\u043e\u043d\u0430\u0452\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-QuickHighlightAction.text=\u0418\u0441\u0442\u0430\u043a\u043d\u0438 \u0441\u0432\u0435 \u043e\u0434\u0433\u043e\u0432\u0430\u0440\u0430\u0458\u0443\u045b\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-QuitAction.text=\u0418\u0437\u043b\u0430\u0437
-read_only=\u0421\u0430\u043c\u043e \u0437\u0430 \u0447\u0438\u0442\u0430\u045a\u0435
-ReadScriptError.text=\u0413\u0440\u0435\u0448\u043a\u0430 \u043a\u043e\u0434 \u0447\u0438\u0442\u0430\u045a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0435
-really_convert_to_current_version=<html>\u041c\u0430\u043f\u0430 \u0458\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u0459\u0435\u043d\u0430 \u0441\u0430 \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043c \u0438\u0437\u0434\u0430\u045a\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430 Freeplane. <br>\u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0438\u0445 \u043f\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u043d\u043e\u0432\u043e \u0438\u0437\u0434\u0430\u045a\u04 [...]
-really_cut_node=\u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0441\u0442\u0432\u0430\u0440\u043d\u043e \u0438\u0437\u0440\u0435\u0437\u0430\u0442\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0435?
-really_execute_script=\u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0441\u0442\u0432\u0430\u0440\u043d\u043e \u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u0443\u043a\u0459\u0443\u0447\u0435\u043d\u0435 \u0443 \u043e\u0432\u043e\u0458 \u043c\u0430\u043f\u0438? \u041f\u043e\u0441\u0442\u043e\u0458\u0438 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442 \u043d\u0430\u0441\u0442\u0430\u043d\u043a\u0430 \u0448\u0442\u0435\u0442\u0435 \u043d [...]
-really_remove_node=\u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0441\u0442\u0432\u0430\u0440\u043d\u043e \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0435?
-really_remove_notes=\u0421\u0442\u0432\u0430\u0440\u043d\u043e \u0436\u0435\u043b\u0438\u0442\u0435 \u0443\u043a\u043b\u043e\u043d\u0438\u0442\u0438 \u0431\u0435\u043b\u0435\u0448\u043a\u0435?
-ReapplyFilterAction.text=\u041f\u043e\u043d\u043e\u0432\u043e \u0444\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u0458 \u0430\u043a\u0446\u0438\u0458\u0443
-red=\u0426\u0440\u0432\u0435\u043d\u043e
-RedefineStyleAction.text=\u041f\u043e\u043d\u043e\u0432\u043e \u043e\u0434\u0440\u0435\u0452\u0438\u0432\u0430\u045a\u0435 \u0441\u0442\u0438\u043b\u0430
-RedoAction.text=\u041f\u043e\u043d\u043e\u0432\u0438
-RedoFilterAction.text=\u041f\u043e\u043d\u043e\u0432\u0438 \u0430\u043a\u0446\u0438\u0458\u0443
-regular_expressions=\u041f\u0440\u0430\u0432\u0438\u043b\u0430\u043d \u0438\u0437\u0440\u0430\u0437
-ReminderHookAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u043f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a
-ReminderHookAction.tooltip=\u0423\u043a\u043b\u043e\u043d\u0438 \u043f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a \u0441 \u0447\u0432\u043e\u0440\u0430.
-remove_file_from_list_on_error=\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0430 {0} \u043d\u0438\u0458\u0435 \u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0430. \u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0458\u0435 \u0443\u043a\u043e\u043d\u0438\u0442\u0438 \u0441\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043e\u0442\u0432\u0430\u0440\u0430\u043d\u0438\u0445 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430?
-remove_shortcut_question=\u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0438 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0443 \u043f\u0440\u0435\u0447\u0438\u0446\u0443?
-RemoveAllIconsAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u0441\u0432\u0435 \u0438\u043a\u043e\u043d\u0435
-RemoveConnectorAction.text=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u043f\u043e\u0432\u0435\u0437\u043d\u0438\u043a
-RemoveEncryption.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0435
-RemoveFormatAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u0444\u043e\u0440\u043c\u0430\u0442
-RemoveIcon_0_Action.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u043f\u0440\u0432\u0443 \u0438\u043a\u043e\u043d\u0443
-RemoveIconAction.text=\u0423\u043a\u043b\u043e\u043d\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u045a\u0443 \u0438\u043a\u043e\u043d\u0443
-RemoveNoteAction.text=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0431\u0435\u043b\u0435\u0448\u043a\u0435
-RemoveNoteAction.tooltip=<html>\u0423\u043a\u043b\u0430\u045a\u0430 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0431\u0435\u043b\u0435\u0436\u0430\u043a\u0430 \u043e\u0434 \u0435\u0432\u0435\u043d\u0442\u0443\u0430\u043b\u043d\u043e \u043d\u0435\u043a\u043e\u043b\u0438\u043a\u043e.</html>
-rename=&\u041f\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0458
-repair_link=\u041f\u043e\u043f\u0440\u0430\u0432\u0438 \u0432\u0435\u0437\u0443
-repair_link_question=\u041d\u0435 \u043c\u043e\u0433\u0443 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u043f\u043e\u0432\u0435\u0437\u0430\u043d\u0443 \u043c\u0430\u043f\u0443. \u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442\u0438 \u0432\u0435\u0437\u0443 \u0440\u0443\u0447\u043d\u043e?
-replace=\u0417\u0430\u043c\u0435\u043d\u0438
-replace_shortcut_question=\u041e\u0432\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0430 \u043f\u0440\u0435\u0447\u0438\u0446\u0430 \u0458\u0435 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u0434\u043e\u0434\u0435\u0459\u0435\u043d\u0430\n {0}.\n\u0417\u0430\u043c\u0435\u043d\u0438 \u0458\u043e\u0458 \u043d\u0430\u043c\u0435\u043d\u0443?
-replace_shortcut_title=\u0417\u0430\u043c\u0435\u043d\u0438 \u043f\u0440\u0435\u0447\u0438\u0446\u0443?
-ReportBugAction.text=\u041f\u0440\u0438\u0458\u0430\u0432\u0438 \u0433\u0440\u0435\u0448\u043a\u0443
-RequestFeatureAction.text=\u0422\u0440\u0430\u0436\u0438\u0442\u0435 \u043d\u043e\u0432\u0430 \u0441\u0432\u043e\u0458\u0441\u0442\u0432\u0430
-reset_to_default=\u041a\u043e\u0440\u0438\u0441\u0442\u0438 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043d\u043e
-ResetNodeLocationAction.text=\u0412\u0440\u0430\u0442\u0438 &\u0438\u0437\u0432\u043e\u0440\u043d\u0438 \u043f\u043e\u043b\u043e\u0436\u0430\u0458
-ResetStyleAction.text=\u0412\u0440\u0430\u0442\u0438 \u043f\u043e\u0447\u0435\u0442\u043d\u0438 \u0441\u0442\u0438\u043b \u0447\u0432\u043e\u0440\u0430
-RevertAction.text=&\u0412\u0440\u0430\u045b\u0430\u045a\u0435 \u0438\u0437 \u043b\u043e\u043a\u0430\u043b\u043d\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u0458\u0435
-RevisionPluginAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u043f\u0440\u043e\u043c\u0435\u045a\u0435\u043d \u0447\u0432\u043e\u0440 \u0443 &\u0431\u043e\u0458\u0438
-save_failed=\u041f\u043e\u043a\u0443\u0448\u0430\u0458 \u0447\u0443\u0432\u0430\u045a\u0430 \u043c\u0430\u043f\u0435 {0} \u043d\u0438\u0458\u0435 \u0443\u0441\u043f\u0435\u043e.
-save_unsaved=\u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0438 \u0441\u043b\u0435\u0434\u0435\u045b\u0443 \u043c\u0430\u043f\u0443 \u0443\u043c\u0430?:
-save_unsaved_styles=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u0442\u0438\u043b\u043e\u0432\u0435?
-SaveAcceleratorPresetsAction.text=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u043a\u0443\u043f \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0438\u0445 \u043f\u0440\u0435\u0447\u0438\u0446\u0430
-SaveAction.text=&\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u043c\u0430\u043f\u0443
-SaveAll.text=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 &\u0441\u0432\u0435 \u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0435 \u043c\u0430\u043f\u0435
-SaveAll.tooltip=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u0432\u0435 \u043e\u0442\u0432\u043e\u0440\u0435\u043d\u0435 \u043c\u0430\u043f\u0435.
-SaveAsAction.text=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u043a\u0430\u043e...
-saved=\u0421\u0430\u0447\u0443\u0432\u0430\u043d\u043e
-saving_canceled=\u0427\u0443\u0432\u0430\u045a\u0435 \u0458\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u043d\u043e
-scanners_not_loaded=\u041f\u0440\u0435\u0433\u043b\u0435\u0434\u0430\u043d\u0435 \u0441\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443 \u0443\u0447\u0438\u0442\u0430\u0442\u0438, \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0458\u0435 \u043e\u0448\u0442\u0435\u045b\u0435\u043d\u0430
-scheme_evaluate=\u041f\u0440\u043e\u0446\u0435\u043d\u0438!
-script_execution_disabled=\u041e\u043d\u0435\u043c\u043e\u0433\u0443\u045b\u043e \u0458\u0435 \u0438\u0437\u0432\u043e\u0452\u0435\u045a\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0438, \u0432\u0438\u0434\u0438 \u0410\u043b\u0430\u0442\u043a\u0435/\u041f\u043e\u0441\u0442\u0430\u0432\u043a\u0435/\u0414\u043e\u0434\u0430\u0446\u0438
-ScriptEditor.text=\u0423&\u0440\u0435\u0434\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0443...
-ScriptEditor.tooltip=\u041e\u043c\u043e\u0433\u0443\u045b\u0430\u0432\u0430 \u043f\u0438\u0441\u0430\u045a\u0435 \u0432\u0435\u043b\u0438\u043a\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u0438 \u0443\u043d\u0443\u0442\u0430\u0440 Freeplanea.
-ScriptEditorPanel.changed_cancel=\u0421\u043a\u0440\u0438\u043f\u0442\u0430 \u0458\u0435 \u043f\u0440\u043e\u043c\u0435\u045a\u0435\u043d\u0430. \u0421\u0442\u0432\u0430\u0440\u043d\u043e \u0436\u0435\u043b\u0438\u0442\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0435?
-scripting_api_generator_legend=\u041d\u0430\u0442\u043f\u0438\u0441
-scripting_api_generator_proxy=\u041f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a
-scripting_api_generator_title=\u041f\u0438\u0441\u0430\u045a\u0435 API \u0441\u043a\u0440\u0438\u043f\u0442\u0435
+plugins/TimeManagement.xml_todayButton=\u0423 \u043F\u043E\u0447\u0435\u0442\u043D\u043E \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440
+plugins/TimeManagement.xml_WindowTitle=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u043E\u043C
+plugins/TimeManagement.xml_WindowTitle_All_Nodes=\u041F\u0440\u0435\u0442\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043C\u0435\u043D\u0438
+preferences=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435
+print_preview_title=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043F\u0440\u0435 \u0448\u0442\u0430\u043C\u043F\u0430\u045A\u0430
+PrintAction.text=\u041E\u0434\u0448\u0442\u0430\u043C\u043F\u0430\u0458 \u043C\u0430\u043F\u0443...
+PrintDirectAction.text=\u041E\u0434\u0448\u0442\u0430\u043C\u043F\u0430\u0458
+printing_settings=\u0420\u0430\u0437\u043C\u0435\u0440\u0430 \u0448\u0442\u0430\u043C\u043F\u0430\u045A\u0430
+PrintPreviewAction.text=&\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043F\u0440\u0435 \u0448\u0442\u0430\u043C\u043F\u0430\u045A\u0430...
+progress=\u041D\u0430\u043F\u0440\u0435\u0434\u0430\u043A \u0438\u043A\u043E\u043D\u0430 (%)
+PropertyAction.dialog=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435
+PropertyAction.text=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 ...
+QuickFilterAction.text=\u0411\u0440\u0437\u0438 \u0444\u0438\u043B\u0442\u0435\u0440
+QuickFindAction.BACK.text=\u041D\u0430\u0452\u0438 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E
+QuickFindAction.FORWARD.text=\u041D\u0430\u0452\u0438 \u0441\u043B\u0435\u0434\u0435\u045B\u0435
+QuickFindAllAction.text=\u041E\u0437\u043D\u0430\u0447\u0438 \u0441\u0432\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+QuickHighlightAction.text=\u0418\u0441\u0442\u0430\u043A\u043D\u0438 \u0441\u0432\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430\u0458\u0443\u045B\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+QuitAction.text=\u0418\u0437\u043B\u0430\u0437
+read_only=\u0421\u0430\u043C\u043E \u0437\u0430 \u0447\u0438\u0442\u0430\u045A\u0435
+ReadScriptError.text=\u0413\u0440\u0435\u0448\u043A\u0430 \u043A\u043E\u0434 \u0447\u0438\u0442\u0430\u045A\u0430 \u0441\u043A\u0440\u0438\u043F\u0442\u0435
+really_convert_to_current_version=<html>\u041C\u0430\u043F\u0430 \u0458\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u0430 \u0441\u0430 \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043C \u0438\u0437\u0434\u0430\u045A\u0435\u043C \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430 Freeplane. <br>\u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u0438\u0445 \u043F\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043D\u0430 \u043D\u043E\u0432\u043E \u0438\u0437\u0434\u0430\u045A\u04 [...]
+really_cut_node=\u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u0441\u0442\u0432\u0430\u0440\u043D\u043E \u0438\u0437\u0440\u0435\u0437\u0430\u0442\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0435?
+really_execute_script=\u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u0441\u0442\u0432\u0430\u0440\u043D\u043E \u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0435 \u0443\u043A\u0459\u0443\u0447\u0435\u043D\u0435 \u0443 \u043E\u0432\u043E\u0458 \u043C\u0430\u043F\u0438? \u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442 \u043D\u0430\u0441\u0442\u0430\u043D\u043A\u0430 \u0448\u0442\u0435\u0442\u0435 \u043D [...]
+really_remove_node=\u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u0441\u0442\u0432\u0430\u0440\u043D\u043E \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0435?
+really_remove_notes=\u0421\u0442\u0432\u0430\u0440\u043D\u043E \u0436\u0435\u043B\u0438\u0442\u0435 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0438 \u0431\u0435\u043B\u0435\u0448\u043A\u0435?
+ReapplyFilterAction.text=\u041F\u043E\u043D\u043E\u0432\u043E \u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u0458 \u0430\u043A\u0446\u0438\u0458\u0443
+red=\u0426\u0440\u0432\u0435\u043D\u043E
+RedefineStyleAction.text=\u041F\u043E\u043D\u043E\u0432\u043E \u043E\u0434\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0435 \u0441\u0442\u0438\u043B\u0430
+RedoAction.text=\u041F\u043E\u043D\u043E\u0432\u0438
+RedoFilterAction.text=\u041F\u043E\u043D\u043E\u0432\u0438 \u0430\u043A\u0446\u0438\u0458\u0443
+regular_expressions=\u041F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0438\u0437\u0440\u0430\u0437
+ReminderHookAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u043F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A
+ReminderHookAction.tooltip=\u0423\u043A\u043B\u043E\u043D\u0438 \u043F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A \u0441 \u0447\u0432\u043E\u0440\u0430.
+remove_file_from_list_on_error=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 {0} \u043D\u0438\u0458\u0435 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0430. \u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u0458\u0435 \u0443\u043A\u043E\u043D\u0438\u0442\u0438 \u0441\u0430 \u0441\u043F\u0438\u0441\u043A\u0430 \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u043E\u0442\u0432\u0430\u0440\u0430\u043D\u0438\u0445 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430?
+remove_shortcut_question=\u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u0437\u0430\u043C\u0435\u043D\u0438\u0442\u0438 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0443 \u043F\u0440\u0435\u0447\u0438\u0446\u0443?
+RemoveAllIconsAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u0441\u0432\u0435 \u0438\u043A\u043E\u043D\u0435
+RemoveConnectorAction.text=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u043F\u043E\u0432\u0435\u0437\u043D\u0438\u043A
+RemoveEncryption.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0435
+RemoveFormatAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u0444\u043E\u0440\u043C\u0430\u0442
+RemoveIcon_0_Action.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u043F\u0440\u0432\u0443 \u0438\u043A\u043E\u043D\u0443
+RemoveIconAction.text=\u0423\u043A\u043B\u043E\u043D\u0438 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0443 \u0438\u043A\u043E\u043D\u0443
+RemoveNoteAction.text=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0431\u0435\u043B\u0435\u0448\u043A\u0435
+RemoveNoteAction.tooltip=<html>\u0423\u043A\u043B\u0430\u045A\u0430 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0431\u0435\u043B\u0435\u0436\u0430\u043A\u0430 \u043E\u0434 \u0435\u0432\u0435\u043D\u0442\u0443\u0430\u043B\u043D\u043E \u043D\u0435\u043A\u043E\u043B\u0438\u043A\u043E.</html>
+rename=&\u041F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458
+repair_link=\u041F\u043E\u043F\u0440\u0430\u0432\u0438 \u0432\u0435\u0437\u0443
+repair_link_question=\u041D\u0435 \u043C\u043E\u0433\u0443 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0443 \u043C\u0430\u043F\u0443. \u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u043F\u043E\u043F\u0440\u0430\u0432\u0438\u0442\u0438 \u0432\u0435\u0437\u0443 \u0440\u0443\u0447\u043D\u043E?
+replace=\u0417\u0430\u043C\u0435\u043D\u0438
+replace_shortcut_question=\u041E\u0432\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0430 \u043F\u0440\u0435\u0447\u0438\u0446\u0430 \u0458\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0434\u043E\u0434\u0435\u0459\u0435\u043D\u0430\n {0}.\n\u0417\u0430\u043C\u0435\u043D\u0438 \u0458\u043E\u0458 \u043D\u0430\u043C\u0435\u043D\u0443?
+replace_shortcut_title=\u0417\u0430\u043C\u0435\u043D\u0438 \u043F\u0440\u0435\u0447\u0438\u0446\u0443?
+ReportBugAction.text=\u041F\u0440\u0438\u0458\u0430\u0432\u0438 \u0433\u0440\u0435\u0448\u043A\u0443
+RequestFeatureAction.text=\u0422\u0440\u0430\u0436\u0438\u0442\u0435 \u043D\u043E\u0432\u0430 \u0441\u0432\u043E\u0458\u0441\u0442\u0432\u0430
+reset_to_default=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u043F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u043E
+ResetNodeLocationAction.text=\u0412\u0440\u0430\u0442\u0438 &\u0438\u0437\u0432\u043E\u0440\u043D\u0438 \u043F\u043E\u043B\u043E\u0436\u0430\u0458
+ResetStyleAction.text=\u0412\u0440\u0430\u0442\u0438 \u043F\u043E\u0447\u0435\u0442\u043D\u0438 \u0441\u0442\u0438\u043B \u0447\u0432\u043E\u0440\u0430
+RevertAction.text=&\u0412\u0440\u0430\u045B\u0430\u045A\u0435 \u0438\u0437 \u043B\u043E\u043A\u0430\u043B\u043D\u0435 \u0438\u0441\u0442\u043E\u0440\u0438\u0458\u0435
+RevisionPluginAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D \u0447\u0432\u043E\u0440 \u0443 &\u0431\u043E\u0458\u0438
+save=&\u0421\u0430\u0447\u0443\u0432\u0430\u0458
+save_failed=\u041F\u043E\u043A\u0443\u0448\u0430\u0458 \u0447\u0443\u0432\u0430\u045A\u0430 \u043C\u0430\u043F\u0435 {0} \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043E.
+save_unsaved=\u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0438 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u043C\u0430\u043F\u0443 \u0443\u043C\u0430?:
+save_unsaved_styles=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u0442\u0438\u043B\u043E\u0432\u0435?
+SaveAcceleratorPresetsAction.text=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u043A\u0443\u043F \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0438\u0445 \u043F\u0440\u0435\u0447\u0438\u0446\u0430
+SaveAction.text=&\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u043C\u0430\u043F\u0443
+SaveAll.text=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 &\u0441\u0432\u0435 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0435 \u043C\u0430\u043F\u0435
+SaveAll.tooltip=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u0432\u0435 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0435 \u043C\u0430\u043F\u0435.
+SaveAsAction.text=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u043A\u0430\u043E...
+saved=\u0421\u0430\u0447\u0443\u0432\u0430\u043D\u043E
+saving_canceled=\u0427\u0443\u0432\u0430\u045A\u0435 \u0458\u0435 \u043E\u0442\u043A\u0430\u0437\u0430\u043D\u043E
+scanners_not_loaded=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u043D\u0435 \u0441\u0435 \u043D\u0435 \u043C\u043E\u0433\u0443 \u0443\u0447\u0438\u0442\u0430\u0442\u0438, \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0458\u0435 \u043E\u0448\u0442\u0435\u045B\u0435\u043D\u0430
+scheme_evaluate=\u041F\u0440\u043E\u0446\u0435\u043D\u0438!
+script_execution_disabled=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u043E \u0458\u0435 \u0438\u0437\u0432\u043E\u0452\u0435\u045A\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0438, \u0432\u0438\u0434\u0438 \u0410\u043B\u0430\u0442\u043A\u0435/\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435/\u0414\u043E\u0434\u0430\u0446\u0438
+ScriptEditor.text=\u0423&\u0440\u0435\u0434\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0443...
+ScriptEditor.tooltip=\u041E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u043F\u0438\u0441\u0430\u045A\u0435 \u0432\u0435\u043B\u0438\u043A\u0438\u0445 \u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0443\u043D\u0443\u0442\u0430\u0440 Freeplanea.
+ScriptEditorPanel.changed_cancel=\u0421\u043A\u0440\u0438\u043F\u0442\u0430 \u0458\u0435 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u0430. \u0421\u0442\u0432\u0430\u0440\u043D\u043E \u0436\u0435\u043B\u0438\u0442\u0435 \u043E\u0442\u043A\u0430\u0437\u0430\u0442\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0435?
+scripting_api_generator_legend=\u041D\u0430\u0442\u043F\u0438\u0441
+scripting_api_generator_proxy=\u041F\u043E\u0441\u0440\u0435\u0434\u043D\u0438\u043A
+scripting_api_generator_title=\u041F\u0438\u0441\u0430\u045A\u0435 API \u0441\u043A\u0440\u0438\u043F\u0442\u0435
scripting_api_generator_utilities=\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u0430
scripting_api_generator_web=\u0412\u0435\u0431 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430
-select_favorites_folder=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0443, \u0443 \u043a\u043e\u0458\u043e\u0458 \u0441\u0435 \u043d\u0430\u043b\u0430\u0437\u0435 \u043e\u043c\u0438\u0459\u0435\u043d\u0435
-select_file_export_to=\u041e\u0434\u0430\u0431\u0435\u0440\u0438 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0443 \u0437\u0430 \u0438\u0437\u0432\u043e\u0437 \u0443
-select_folder_for_importing=\u041e\u0434\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0441\u0446\u0438\u043a\u043b\u0443 \u0437\u0430 \u0443\u0432\u043e\u0437
-select_icon=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u043a\u043e\u043d\u0443
-select_menu_item_dialog=\u041e\u0434\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0442\u0430\u0432\u043a\u0443 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0430
-select_menu_item_root_node=\u0418\u0437\u0431\u043e\u0440\u043d\u0438\u043a
-SelectAllAction.text=\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u0441\u0432\u0435 &\u0432\u0438\u0434\u0459\u0438\u0432\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-SelectBranchAction.text=\u041e\u0434\u0430\u0431\u0435\u0440\u0438 \u0432\u0438\u0434\u0459\u0438\u0432\u0443 \u0433\u0440\u0430\u043d\u0443
-SelectedPasteAction.text=\u041d\u0430\u043b\u0435\u043f\u0438 \u043a\u0430\u043e...
-selection_method_by_click=\u0408\u0435\u0434\u0430\u043d \u043a\u043b\u0438\u043a \u0437\u0430 \u0438\u0437\u0430\u0431\u0438\u0440
-selection_method_delayed=\u041e\u0434\u043b\u043e\u0436\u0435\u043d\u043e \u0430\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e \u0431\u0438\u0440\u0430\u045a\u0435
-selection_method_direct=\u041f\u043e\u043a\u0430\u0437\u0438\u0432\u0430\u0447 \u043d\u0430 \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u043e
-SelectNoteAction.text=\u041f\u0440\u0435\u0431\u0430\u0446\u0438\u0442\u0435 \u0441\u0435 \u043d\u0430 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u045a\u0435 \u0431\u0435\u043b\u0435\u0448\u043a\u0435
-SelectNoteAction.tooltip=\u041f\u0440\u0435\u0431\u0430\u0446\u0443\u0458\u0435 \u043d\u0430 \u043e\u0434\u0433\u043e\u0432\u0430\u0440\u0430\u0458\u0443\u045b\u0438 \u043e\u043a\u043d\u043e \u0431\u0435\u043b\u0435\u0448\u043a\u0435
-set_accelerator_on_next_click_action=\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u0431\u0438\u043b\u043e \u043a\u043e\u0458\u0443 \u0441\u0442\u0430\u0432\u043a\u0443 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0430 \u0437\u0430 \u0434\u043e\u0434\u0435\u043b\u0443 \u043d\u043e\u0432\u0435 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0435 \u043f\u0440\u0435\u0447\u0438\u0446\u0435
-SetAcceleratorOnNextClickAction.text=\u041f\u0440\u0438\u0434\u0440\u0443\u0436\u0438 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0443 \u043f\u0440\u0435\u0447\u0438\u0446\u0443
-SetImageByFileChooserAction.text=\u0421\u043b\u0438\u043a\u0430 \u043f\u043e \u0438\u0437\u0431\u043e\u0440\u0443 \u0438\u043b\u0438 \u0432\u0435\u0437\u0438...
-SetLinkAnchorAction.text=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u0441\u0438\u0434\u0440\u043e \u0432\u0435\u0437\u0435
-SetLinkAnchorAction.tooltip=<html>\u043f\u043e\u0434\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440 \u043a\u0430\u043e \u0441\u0438\u0434\u0440\u043e \u0437\u0430 \u0431\u0443\u0434\u0443\u045b\u043d\u043e\u0441\u0442<br/>\u0441\u0442\u0432\u0430\u0440\u0430\u045a\u0435 \u043b\u043e\u043a\u0430\u043b\u043d\u0438\u0445 \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u043d\u0438\u0445 \u0432\u0435\u0437\u0430.
-SetLinkAnchorAction.tooltip_anchored=<html>\u043f\u043e\u0434\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043d\u0438 \u0447\u0432\u043e\u0440 \u043a\u0430\u043e \u0441\u0438\u0434\u0440\u043e \u0437\u0430 \u0431\u0443\u0434\u0443\u045b\u043d\u043e\u0441\u0442<br/>\u0441\u0442\u0432\u0430\u0440\u0430\u045a\u0435 \u043b\u043e\u043a\u0430\u043b\u043d\u0438\u0445 \u0438\u043b\u0438 \u0433\u043b\u043e\u0431\u0430\u043b\u043d\u0438\u0445 \u0432\u0435\u0437\u0430.. \u042 [...]
-SetLinkByFileChooserAction.text=\u0414\u043e\u0434\u0430\u0458 \u0445\u0438\u043f\u0435\u0440\u0432\u0435\u0437\u0435 (\u0438\u0437\u0430\u0431\u0435\u0440\u0438)...
-SetLinkByTextFieldAction.text=\u0414\u043e\u0434\u0430\u0458 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438 \u0445\u0438\u043f\u0435\u0440\u0432\u0435\u0437\u0443 (\u0442\u0438\u043f)...
-SetNodeLink.text=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u0432\u0435\u0437\u0443 \u0447\u0432\u043e\u0440\u0430
-SetNoteWindowPosition.bottom.text=\u0414\u043e\u043b\u0435
-SetNoteWindowPosition.left.text=\u041b\u0435\u0432\u043e
-SetNoteWindowPosition.right.text=\u0414\u0435\u0441\u043d\u043e
-SetNoteWindowPosition.top.text=\u0413\u043e\u0440\u0435
-SetShortenerStateAction.text=\u0423\u043c\u0430\u045a\u0435\u043d\u0438 \u0447\u0432\u043e\u0440
-sf_login_required=\u041f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u0458\u0435 \u043f\u0440\u0438\u0458\u0430\u0432\u0459\u0438\u0432\u0430\u045a\u0435 \u043d\u0430 Source Forge. \u0416\u0435\u043b\u0438\u0442\u0435 \u043b\u0438 \u043d\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0438?
-ShowAllAttributesAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0441\u0432\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435
-ShowAncestorsAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u043f\u0440\u0435\u0442\u043a\u0435
-ShowAttributeDialogAction.text=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0430&\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u043c\u0430
-ShowDescendantsAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u043f\u043e\u0442\u043e\u043c\u043a\u0435
-ShowFilterToolbarAction.text=\u0424\u0438\u043b\u0442\u0435\u0440 \u0442\u0440\u0430\u043a\u0435 \u0430\u043b\u0430\u0442\u0430
-ShowFormatPanel.text=\u0422\u0430\u0431\u043b\u0430 \u0441\u0432\u043e\u0458\u0441\u0442\u0430\u0432\u0430
-ShowFormatPanel.tooltip=\u041f\u0440\u0438\u043a\u0430\u0437\u0443\u0458\u0435 \u0434\u0438\u0458\u0430\u043b\u043e\u0433 \u0443 \u043a\u043e\u0458\u0435\u043c \u043e\u0431\u043b\u0438\u0446\u0438 \u0447\u0432\u043e\u0440\u043e\u0432\u0430 \u0438 \u0440\u0443\u0431\u043e\u0432\u0430 \u043c\u043e\u0433\u0443 \u0441\u0435 \u043c\u0435\u045a\u0430\u0442\u0438 \u043e\u0434\u0458\u0435\u0434\u043d\u043e\u043c.
-ShowHideNoteAction.text=\u041f\u0440\u0438\u043a\u0430\u0437 \u043e\u043a\u043d\u0430 \u0431\u0435\u043b\u0435\u0448\u043a\u0435
-ShowHideNoteAction.tooltip=\u0423\u043a\u0459\u0443\u0447\u0438\u0432\u0430\u045a\u0435 \u0438\u043b\u0438 \u0438\u0441\u043a\u0459\u0443\u0447\u0438\u0432\u0430\u045a\u0435 \u043f\u0440\u043e\u0437\u043e\u0440\u0430 \u0441 \u0431\u0435\u043b\u0435\u0448\u043a\u0430\u043c\u0430
-ShowNextChildAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0441\u043b\u0435\u0434\u0435\u045b\u0438 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438
-ShowNotesInMapAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0431\u0435\u043b\u0435\u0448\u043a\u0435 \u0443 \u043c\u0430\u043f\u0438
-ShowSelectedAttributesAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435
-ShowSelectionAsRectangleAction.text=\u041f\u0440\u0430\u0432\u043e\u0443\u0433\u0430\u043e\u043d\u0438 \u0438\u0437\u0431\u043e\u0440
-simplyhtml.aboutFrameTitle=\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0443
-simplyhtml.aboutLabel=\u041e SimplyHTML...
-simplyhtml.alignCenter=\u0441\u0440\u0435\u0434\u0438\u043d\u0430
-simplyhtml.alignLabel=\u041f\u043e\u0440\u0430\u0432\u043d\u0430\u0432\u0430\u045a\u0435:
-simplyhtml.alignLeft=\u041b\u0435\u0432\u043e
-simplyhtml.alignRight=\u0414\u0435\u0441\u043d\u043e
-simplyhtml.allCellsRangeLabel=\u0441\u0432\u0435 \u045b\u0435\u043b\u0438\u0458\u0435
-simplyhtml.allOccurrencesReplaced=\u0421\u0432\u0435 \u043f\u043e\u0434\u0443\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438 \u0441\u0443 \u0437\u0430\u043c\u0435\u045a\u0435\u043d\u0435
-simplyhtml.appendTableColLabel=\u0414\u043e\u0434\u0430\u0458 \u0441\u0442\u0443\u0431\u0430\u0446
-simplyhtml.appendTableRowLabel=\u0414\u043e\u0434\u0430\u0458 \u0440\u0435\u0434
-simplyhtml.applyCellAttrLabel=\u041f\u0440\u0438\u043c\u0435\u043d\u0438 \u043d\u0430
-simplyhtml.backgroundLabel=\u041f\u043e\u0437\u0430\u0434\u0438\u043d\u0430:
-simplyhtml.boldItalicName=\u0443\u043a\u043e\u0448\u0435\u043d\u043e - \u043f\u043e\u0434\u0435\u0431\u0459\u0430\u043d\u043e
-simplyhtml.boldName=\u043f\u043e\u0434\u0435\u0431\u0459\u0430\u043d\u043e
-simplyhtml.borderColorLabel=\u0411\u043e\u0458\u0430:
-simplyhtml.borderWidthLabel=\u0428\u0438\u0440\u0438\u043d\u0430
-simplyhtml.bottomLabel=\u0414\u043e\u043b\u0435:
-simplyhtml.cancelBtnName=\u041e\u0442\u043a\u0430\u0436\u0438
-simplyhtml.cellBorderTabLabel=\u0420\u0443\u0431\u043e\u0432\u0438
-simplyhtml.cellGenTabLabel=\u041e\u043f\u0448\u0442\u0435
+select_favorites_folder=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0441\u0446\u0438\u043A\u043B\u0443, \u0443 \u043A\u043E\u0458\u043E\u0458 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0435 \u043E\u043C\u0438\u0459\u0435\u043D\u0435
+select_file_export_to=\u041E\u0434\u0430\u0431\u0435\u0440\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0437\u0430 \u0438\u0437\u0432\u043E\u0437 \u0443
+select_folder_for_importing=\u041E\u0434\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u0430\u0441\u0446\u0438\u043A\u043B\u0443 \u0437\u0430 \u0443\u0432\u043E\u0437
+select_icon=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0438\u043A\u043E\u043D\u0443
+select_menu_item_dialog=\u041E\u0434\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0442\u0430\u0432\u043A\u0443 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0430
+select_menu_item_root_node=\u0418\u0437\u0431\u043E\u0440\u043D\u0438\u043A
+SelectAllAction.text=\u0418\u0437\u0430\u0431\u0435\u0440\u0438 \u0441\u0432\u0435 &\u0432\u0438\u0434\u0459\u0438\u0432\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+SelectBranchAction.text=\u041E\u0434\u0430\u0431\u0435\u0440\u0438 \u0432\u0438\u0434\u0459\u0438\u0432\u0443 \u0433\u0440\u0430\u043D\u0443
+SelectedPasteAction.text=\u041D\u0430\u043B\u0435\u043F\u0438 \u043A\u0430\u043E...
+selection_method_by_click=\u0408\u0435\u0434\u0430\u043D \u043A\u043B\u0438\u043A \u0437\u0430 \u0438\u0437\u0430\u0431\u0438\u0440
+selection_method_delayed=\u041E\u0434\u043B\u043E\u0436\u0435\u043D\u043E \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u0431\u0438\u0440\u0430\u045A\u0435
+selection_method_direct=\u041F\u043E\u043A\u0430\u0437\u0438\u0432\u0430\u0447 \u043D\u0430 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u043E
+SelectNoteAction.text=\u041F\u0440\u0435\u0431\u0430\u0446\u0438\u0442\u0435 \u0441\u0435 \u043D\u0430 \u0443\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0435 \u0431\u0435\u043B\u0435\u0448\u043A\u0435
+SelectNoteAction.tooltip=\u041F\u0440\u0435\u0431\u0430\u0446\u0443\u0458\u0435 \u043D\u0430 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430\u0458\u0443\u045B\u0438 \u043E\u043A\u043D\u043E \u0431\u0435\u043B\u0435\u0448\u043A\u0435
+set_accelerator_on_next_click_action=\u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043D\u0430 \u0431\u0438\u043B\u043E \u043A\u043E\u0458\u0443 \u0441\u0442\u0430\u0432\u043A\u0443 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0430 \u0437\u0430 \u0434\u043E\u0434\u0435\u043B\u0443 \u043D\u043E\u0432\u0435 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0435 \u043F\u0440\u0435\u0447\u0438\u0446\u0435
+SetAcceleratorOnNextClickAction.text=\u041F\u0440\u0438\u0434\u0440\u0443\u0436\u0438 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0443 \u043F\u0440\u0435\u0447\u0438\u0446\u0443
+SetImageByFileChooserAction.text=\u0421\u043B\u0438\u043A\u0430 \u043F\u043E \u0438\u0437\u0431\u043E\u0440\u0443 \u0438\u043B\u0438 \u0432\u0435\u0437\u0438...
+SetLinkAnchorAction.text=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0441\u0438\u0434\u0440\u043E \u0432\u0435\u0437\u0435
+SetLinkAnchorAction.tooltip=<html>\u043F\u043E\u0434\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440 \u043A\u0430\u043E \u0441\u0438\u0434\u0440\u043E \u0437\u0430 \u0431\u0443\u0434\u0443\u045B\u043D\u043E\u0441\u0442<br/>\u0441\u0442\u0432\u0430\u0440\u0430\u045A\u0435 \u043B\u043E\u043A\u0430\u043B\u043D\u0438\u0445 \u0438\u043B\u0438 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u0445 \u0432\u0435\u0437\u0430.
+SetLinkAnchorAction.tooltip_anchored=<html>\u043F\u043E\u0434\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u0447\u0432\u043E\u0440 \u043A\u0430\u043E \u0441\u0438\u0434\u0440\u043E \u0437\u0430 \u0431\u0443\u0434\u0443\u045B\u043D\u043E\u0441\u0442<br/>\u0441\u0442\u0432\u0430\u0440\u0430\u045A\u0435 \u043B\u043E\u043A\u0430\u043B\u043D\u0438\u0445 \u0438\u043B\u0438 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u0445 \u0432\u0435\u0437\u0430.. \u042 [...]
+SetLinkByFileChooserAction.text=\u0414\u043E\u0434\u0430\u0458 \u0445\u0438\u043F\u0435\u0440\u0432\u0435\u0437\u0435 (\u0438\u0437\u0430\u0431\u0435\u0440\u0438)...
+SetLinkByTextFieldAction.text=\u0414\u043E\u0434\u0430\u0458 \u0438\u043B\u0438 \u0438\u0437\u043C\u0435\u043D\u0438 \u0445\u0438\u043F\u0435\u0440\u0432\u0435\u0437\u0443 (\u0442\u0438\u043F)...
+SetNodeLink.text=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0432\u0435\u0437\u0443 \u0447\u0432\u043E\u0440\u0430
+SetNoteWindowPosition.bottom.text=\u0414\u043E\u043B\u0435
+SetNoteWindowPosition.left.text=\u041B\u0435\u0432\u043E
+SetNoteWindowPosition.right.text=\u0414\u0435\u0441\u043D\u043E
+SetNoteWindowPosition.top.text=\u0413\u043E\u0440\u0435
+SetShortenerStateAction.text=\u0423\u043C\u0430\u045A\u0435\u043D\u0438 \u0447\u0432\u043E\u0440
+sf_login_required=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0459\u0438\u0432\u0430\u045A\u0435 \u043D\u0430 Source Forge. \u0416\u0435\u043B\u0438\u0442\u0435 \u043B\u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0438?
+ShowAllAttributesAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0441\u0432\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435
+ShowAncestorsAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u043F\u0440\u0435\u0442\u043A\u0435
+ShowAttributeDialogAction.text=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0430&\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u043C\u0430
+ShowDescendantsAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u043F\u043E\u0442\u043E\u043C\u043A\u0435
+ShowFilterToolbarAction.text=\u0424\u0438\u043B\u0442\u0435\u0440 \u0442\u0440\u0430\u043A\u0435 \u0430\u043B\u0430\u0442\u0430
+ShowFormatPanel.text=\u0422\u0430\u0431\u043B\u0430 \u0441\u0432\u043E\u0458\u0441\u0442\u0430\u0432\u0430
+ShowFormatPanel.tooltip=\u041F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u0434\u0438\u0458\u0430\u043B\u043E\u0433 \u0443 \u043A\u043E\u0458\u0435\u043C \u043E\u0431\u043B\u0438\u0446\u0438 \u0447\u0432\u043E\u0440\u043E\u0432\u0430 \u0438 \u0440\u0443\u0431\u043E\u0432\u0430 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043C\u0435\u045A\u0430\u0442\u0438 \u043E\u0434\u0458\u0435\u0434\u043D\u043E\u043C.
+ShowHideNoteAction.text=\u041F\u0440\u0438\u043A\u0430\u0437 \u043E\u043A\u043D\u0430 \u0431\u0435\u043B\u0435\u0448\u043A\u0435
+ShowHideNoteAction.tooltip=\u0423\u043A\u0459\u0443\u0447\u0438\u0432\u0430\u045A\u0435 \u0438\u043B\u0438 \u0438\u0441\u043A\u0459\u0443\u0447\u0438\u0432\u0430\u045A\u0435 \u043F\u0440\u043E\u0437\u043E\u0440\u0430 \u0441 \u0431\u0435\u043B\u0435\u0448\u043A\u0430\u043C\u0430
+ShowNextChildAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0441\u043B\u0435\u0434\u0435\u045B\u0438 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438
+ShowNotesInMapAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0431\u0435\u043B\u0435\u0448\u043A\u0435 \u0443 \u043C\u0430\u043F\u0438
+ShowSelectedAttributesAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435
+ShowSelectionAsRectangleAction.text=\u041F\u0440\u0430\u0432\u043E\u0443\u0433\u0430\u043E\u043D\u0438 \u0438\u0437\u0431\u043E\u0440
+simplyhtml.aboutFrameTitle=\u041E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443
+simplyhtml.aboutLabel=\u041E SimplyHTML...
+simplyhtml.alignCenter=\u0441\u0440\u0435\u0434\u0438\u043D\u0430
+simplyhtml.alignLabel=\u041F\u043E\u0440\u0430\u0432\u043D\u0430\u0432\u0430\u045A\u0435:
+simplyhtml.alignLeft=\u041B\u0435\u0432\u043E
+simplyhtml.alignRight=\u0414\u0435\u0441\u043D\u043E
+simplyhtml.allCellsRangeLabel=\u0441\u0432\u0435 \u045B\u0435\u043B\u0438\u0458\u0435
+simplyhtml.allOccurrencesReplaced=\u0421\u0432\u0435 \u043F\u043E\u0434\u0443\u0434\u0430\u0440\u043D\u043E\u0441\u0442\u0438 \u0441\u0443 \u0437\u0430\u043C\u0435\u045A\u0435\u043D\u0435
+simplyhtml.appendTableColLabel=\u0414\u043E\u0434\u0430\u0458 \u0441\u0442\u0443\u0431\u0430\u0446
+simplyhtml.appendTableRowLabel=\u0414\u043E\u0434\u0430\u0458 \u0440\u0435\u0434
+simplyhtml.applyCellAttrLabel=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 \u043D\u0430
+simplyhtml.backgroundLabel=\u041F\u043E\u0437\u0430\u0434\u0438\u043D\u0430:
+simplyhtml.boldItalicName=\u0443\u043A\u043E\u0448\u0435\u043D\u043E - \u043F\u043E\u0434\u0435\u0431\u0459\u0430\u043D\u043E
+simplyhtml.boldName=\u043F\u043E\u0434\u0435\u0431\u0459\u0430\u043D\u043E
+simplyhtml.borderColorLabel=\u0411\u043E\u0458\u0430:
+simplyhtml.borderWidthLabel=\u0428\u0438\u0440\u0438\u043D\u0430
+simplyhtml.bottomLabel=\u0414\u043E\u043B\u0435:
+simplyhtml.cancelBtnName=\u041E\u0442\u043A\u0430\u0436\u0438
+simplyhtml.cellBorderTabLabel=\u0420\u0443\u0431\u043E\u0432\u0438
+simplyhtml.cellGenTabLabel=\u041E\u043F\u0448\u0442\u0435
simplyhtml.cellMarginTabLabel=\u0418\u0432\u0438\u0446\u0430
-simplyhtml.cellPanelTitle=\u041e\u0431\u043b\u0438\u043a \u045b\u0435\u043b\u0438\u0458\u0435
-simplyhtml.clearFormatLabel=\u0423\u043a\u043b\u043e\u043d\u0438 \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u045a\u0435
-simplyhtml.clearFormatTip=\u0423\u043a\u043b\u043e\u043d\u0438 \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u045a\u0435
-simplyhtml.close=\u0417\u0430\u0442\u0432\u043e\u0440\u0438
-simplyhtml.closeBtnName=\u0417\u0430\u0442\u0432\u043e\u0440\u0438
-simplyhtml.colorLabel=\u0411\u043e\u0458\u0430
-simplyhtml.copyLabel=\u0423\u043c\u043d\u043e\u0436\u0438
-simplyhtml.copyTip=\u0443\u043c\u043d\u043e\u0436\u0438
-simplyhtml.cTagNameHead1=\u041d\u0430\u0441\u043b\u043e\u0432 1
-simplyhtml.cTagNameHead2=\u041d\u0430\u0441\u043b\u043e\u0432 2
-simplyhtml.cTagNameHead3=\u041d\u0430\u0441\u043b\u043e\u0432 3
-simplyhtml.cTagNameHead4=\u041d\u0430\u0441\u043b\u043e\u0432 4
-simplyhtml.cTagNameHead5=\u041d\u0430\u0441\u043b\u043e\u0432 5
-simplyhtml.cTagNameHead6=\u041d\u0430\u0441\u043b\u043e\u0432 6
+simplyhtml.cellPanelTitle=\u041E\u0431\u043B\u0438\u043A \u045B\u0435\u043B\u0438\u0458\u0435
+simplyhtml.clearFormatLabel=\u0423\u043A\u043B\u043E\u043D\u0438 \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435
+simplyhtml.clearFormatTip=\u0423\u043A\u043B\u043E\u043D\u0438 \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435
+simplyhtml.close=\u0417\u0430\u0442\u0432\u043E\u0440\u0438
+simplyhtml.closeBtnName=\u0417\u0430\u0442\u0432\u043E\u0440\u0438
+simplyhtml.colorLabel=\u0411\u043E\u0458\u0430
+simplyhtml.copyLabel=\u0423\u043C\u043D\u043E\u0436\u0438
+simplyhtml.copyTip=\u0443\u043C\u043D\u043E\u0436\u0438
+simplyhtml.cTagNameHead1=\u041D\u0430\u0441\u043B\u043E\u0432 1
+simplyhtml.cTagNameHead2=\u041D\u0430\u0441\u043B\u043E\u0432 2
+simplyhtml.cTagNameHead3=\u041D\u0430\u0441\u043B\u043E\u0432 3
+simplyhtml.cTagNameHead4=\u041D\u0430\u0441\u043B\u043E\u0432 4
+simplyhtml.cTagNameHead5=\u041D\u0430\u0441\u043B\u043E\u0432 5
+simplyhtml.cTagNameHead6=\u041D\u0430\u0441\u043B\u043E\u0432 6
simplyhtml.cTagNameLink=\u0412\u0435\u0437\u0430
-simplyhtml.cTagNameOL=\u0423\u0440\u0435\u0452\u0435\u043d \u0441\u043f\u0438\u0441\u0430\u043a
-simplyhtml.cTagNamePara=\u041f\u0430\u0441\u0443\u0441
-simplyhtml.cTagNameUL=\u041d\u0435\u0443\u0440\u0435\u0452\u0435\u043d \u0441\u043f\u0438\u0441\u0430\u043a
+simplyhtml.cTagNameOL=\u0423\u0440\u0435\u0452\u0435\u043D \u0441\u043F\u0438\u0441\u0430\u043A
+simplyhtml.cTagNamePara=\u041F\u0430\u0441\u0443\u0441
+simplyhtml.cTagNameUL=\u041D\u0435\u0443\u0440\u0435\u0452\u0435\u043D \u0441\u043F\u0438\u0441\u0430\u043A
simplyhtml.cutLabel=\u0418\u0441\u0435\u0446\u0438
simplyhtml.cutTip=\u0438\u0441\u0435\u0446\u0438
-simplyhtml.defaultDocName=\u0411\u0435\u0437 \u043d\u0430\u0441\u043b\u043e\u0432\u0430
+simplyhtml.defaultDocName=\u0411\u0435\u0437 \u043D\u0430\u0441\u043B\u043E\u0432\u0430
simplyhtml.deleteTableColLabel=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0441\u0442\u0443\u0431\u0430\u0446
simplyhtml.deleteTableRowLabel=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0440\u0435\u0434
-simplyhtml.docTitleQuery=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043d\u0430\u0441\u043b\u043e\u0432 \u043a\u0430\u043e:
-simplyhtml.docTitleTitle=\u0423\u0440\u0435\u0434\u0438 \u043d\u0430\u0441\u043b\u043e\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430
+simplyhtml.docTitleQuery=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043D\u0430\u0441\u043B\u043E\u0432 \u043A\u0430\u043E:
+simplyhtml.docTitleTitle=\u0423\u0440\u0435\u0434\u0438 \u043D\u0430\u0441\u043B\u043E\u0432 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430
simplyhtml.editLabel=\u0423\u0440\u0435\u0434\u0438
-simplyhtml.effectLabel=\u0415\u0444\u0435\u043a\u0442\u0438
-simplyhtml.familyLabel=\u041e\u0431\u043b\u0438\u043a
-simplyhtml.findNext=\u0422\u0440\u0430\u0436\u0438 \u0441\u043b\u0435\u0434\u0435\u045b\u0435...
-simplyhtml.findReplaceDialogTitle=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438
-simplyhtml.findReplaceLabel=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438
-simplyhtml.findReplaceTip=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438
-simplyhtml.fontBoldLabel=\u041f\u043e\u0434\u0435\u0431\u0459\u0430\u043d\u043e
-simplyhtml.fontBoldTip=\u0443\u043a\u0459\u0443\u0447\u0438/\u0438\u0441\u043a\u0459\u0443\u0447\u0438 \u043f\u043e\u0434\u0435\u0431\u0459\u0430\u043d\u043e
-simplyhtml.fontColorLabel=\u0411\u043e\u0458\u0430 \u0442\u0435\u043a\u0441\u0442\u0430
-simplyhtml.fontColorTip=\u0411\u043e\u0458\u0430 \u0442\u0435\u043a\u0441\u0442\u0430
-simplyhtml.fontDialogTitle=\u041e\u0431\u043b\u0438\u043a \u0441\u043b\u043e\u0432\u0430
-simplyhtml.fontItalicLabel=\u0418\u0441\u043a\u043e\u0448\u0435\u043d\u043e
-simplyhtml.fontItalicTip=\u0418\u0441\u043a\u0459\u0443\u0447\u0438/\u0443\u043a\u0459\u0443\u0447\u0438 \u0438\u0441\u043a\u043e\u0448\u0435\u043d\u043e
-simplyhtml.fontLabel=\u0421\u043b\u043e\u0432\u043e\u043b\u0438\u043a...
-simplyhtml.fontTabLabel=\u0421\u043b\u043e\u0432\u043e\u043b\u0438\u043a
-simplyhtml.fontTip=\u041e\u0431\u043b\u0438\u043a \u0441\u043b\u043e\u0432\u0430...
-simplyhtml.fontUnderlineLabel=\u041f\u043e\u0434\u0432\u0443\u0447\u0435\u043d\u043e
-simplyhtml.fontUnderlineTip=\u0423\u043a\u0459\u0443\u0447\u0438/\u0438\u0441\u043a\u0459\u0443\u0447\u0438 \u043f\u043e\u0434\u0432\u0443\u0447\u0435\u043d\u043e
-simplyhtml.foregroundLabel=\u041f\u0440\u0432\u0438 \u043f\u043b\u0430\u043d:
-simplyhtml.formatLabel=\u041e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u045a\u0435
-simplyhtml.formatListLabel=\u0421\u043f\u0438\u0441\u0430\u043a...
-simplyhtml.formatListTip=\u041f\u0440\u043e\u043c\u0435\u043d\u0438 \u043e\u0431\u043b\u0438\u043a \u0441\u043f\u0438\u0441\u043a\u0430
-simplyhtml.formatParaLabel=\u041f\u0430\u0441\u0443\u0441...
-simplyhtml.formatParaTip=\u041f\u0440\u043e\u043c\u0435\u043d\u0438 \u043e\u0431\u043b\u0438\u043a \u043f\u0430\u0441\u0443\u0441\u0430
-simplyhtml.formatTableLabel=\u0422\u0430\u0431\u0435\u043b\u0430...
-simplyhtml.formatTableTip=\u041e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u045a\u0435 \u0442\u0430\u0431\u0435\u043b\u0435
-simplyhtml.helpLabel=\u041f\u043e\u043c\u043e\u045b
-simplyhtml.htmlTabTitle=HTML \u043f\u0440\u0438\u043a\u0430\u0437
-simplyhtml.imageFileDesc=\u0421\u043b\u0438\u043a\u043e\u0432\u043d\u0435 \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435
-simplyhtml.insertTableColLabel=\u0423\u043c\u0435\u0442\u043d\u0438 \u0441\u0442\u0443\u0431\u0430\u0446
-simplyhtml.insertTableLabel=\u0422\u0430\u0431\u0435\u043b\u0430...
-simplyhtml.insertTableMsg=\u041a\u043e\u043b\u0438\u043a\u043e \u0438\u043c\u0430 \u0441\u0442\u0443\u0431\u0430\u0446\u0430?
-simplyhtml.insertTableRowLabel=\u0423\u043c\u0435\u0442\u043d\u0438 \u0440\u0435\u0434
-simplyhtml.insertTableTitle=\u0423\u043c\u0435\u0442\u043d\u0438 \u0442\u0430\u0431\u0435\u043b\u0443
-simplyhtml.italicName=\u0423\u043a\u043e\u0448\u0435\u043d\u043e
-simplyhtml.layoutTabTitle=\u041e\u0441\u043d\u043e\u0432\u043d\u0438 \u043f\u0440\u0438\u043a\u0430\u0437
-simplyhtml.leftLabel=\u043b\u0435\u0432\u043e:
-simplyhtml.listDialogTitle=\u041e\u0431\u043b\u0438\u043a \u0441\u043f\u0438\u0441\u043a\u0430
+simplyhtml.effectLabel=\u0415\u0444\u0435\u043A\u0442\u0438
+simplyhtml.familyLabel=\u041E\u0431\u043B\u0438\u043A
+simplyhtml.findNext=\u0422\u0440\u0430\u0436\u0438 \u0441\u043B\u0435\u0434\u0435\u045B\u0435...
+simplyhtml.findReplaceDialogTitle=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043C\u0435\u043D\u0438
+simplyhtml.findReplaceLabel=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043C\u0435\u043D\u0438
+simplyhtml.findReplaceTip=\u0422\u0440\u0430\u0436\u0438 \u0438 \u0437\u0430\u043C\u0435\u043D\u0438
+simplyhtml.fontBoldLabel=\u041F\u043E\u0434\u0435\u0431\u0459\u0430\u043D\u043E
+simplyhtml.fontBoldTip=\u0443\u043A\u0459\u0443\u0447\u0438/\u0438\u0441\u043A\u0459\u0443\u0447\u0438 \u043F\u043E\u0434\u0435\u0431\u0459\u0430\u043D\u043E
+simplyhtml.fontColorLabel=\u0411\u043E\u0458\u0430 \u0442\u0435\u043A\u0441\u0442\u0430
+simplyhtml.fontColorTip=\u0411\u043E\u0458\u0430 \u0442\u0435\u043A\u0441\u0442\u0430
+simplyhtml.fontDialogTitle=\u041E\u0431\u043B\u0438\u043A \u0441\u043B\u043E\u0432\u0430
+simplyhtml.fontItalicLabel=\u0418\u0441\u043A\u043E\u0448\u0435\u043D\u043E
+simplyhtml.fontItalicTip=\u0418\u0441\u043A\u0459\u0443\u0447\u0438/\u0443\u043A\u0459\u0443\u0447\u0438 \u0438\u0441\u043A\u043E\u0448\u0435\u043D\u043E
+simplyhtml.fontLabel=\u0421\u043B\u043E\u0432\u043E\u043B\u0438\u043A...
+simplyhtml.fontTabLabel=\u0421\u043B\u043E\u0432\u043E\u043B\u0438\u043A
+simplyhtml.fontTip=\u041E\u0431\u043B\u0438\u043A \u0441\u043B\u043E\u0432\u0430...
+simplyhtml.fontUnderlineLabel=\u041F\u043E\u0434\u0432\u0443\u0447\u0435\u043D\u043E
+simplyhtml.fontUnderlineTip=\u0423\u043A\u0459\u0443\u0447\u0438/\u0438\u0441\u043A\u0459\u0443\u0447\u0438 \u043F\u043E\u0434\u0432\u0443\u0447\u0435\u043D\u043E
+simplyhtml.foregroundLabel=\u041F\u0440\u0432\u0438 \u043F\u043B\u0430\u043D:
+simplyhtml.formatLabel=\u041E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435
+simplyhtml.formatListLabel=\u0421\u043F\u0438\u0441\u0430\u043A...
+simplyhtml.formatListTip=\u041F\u0440\u043E\u043C\u0435\u043D\u0438 \u043E\u0431\u043B\u0438\u043A \u0441\u043F\u0438\u0441\u043A\u0430
+simplyhtml.formatParaLabel=\u041F\u0430\u0441\u0443\u0441...
+simplyhtml.formatParaTip=\u041F\u0440\u043E\u043C\u0435\u043D\u0438 \u043E\u0431\u043B\u0438\u043A \u043F\u0430\u0441\u0443\u0441\u0430
+simplyhtml.formatTableLabel=\u0422\u0430\u0431\u0435\u043B\u0430...
+simplyhtml.formatTableTip=\u041E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435 \u0442\u0430\u0431\u0435\u043B\u0435
+simplyhtml.helpLabel=\u041F\u043E\u043C\u043E\u045B
+simplyhtml.htmlTabTitle=HTML \u043F\u0440\u0438\u043A\u0430\u0437
+simplyhtml.imageFileDesc=\u0421\u043B\u0438\u043A\u043E\u0432\u043D\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435
+simplyhtml.insertTableColLabel=\u0423\u043C\u0435\u0442\u043D\u0438 \u0441\u0442\u0443\u0431\u0430\u0446
+simplyhtml.insertTableLabel=\u0422\u0430\u0431\u0435\u043B\u0430...
+simplyhtml.insertTableMsg=\u041A\u043E\u043B\u0438\u043A\u043E \u0438\u043C\u0430 \u0441\u0442\u0443\u0431\u0430\u0446\u0430?
+simplyhtml.insertTableRowLabel=\u0423\u043C\u0435\u0442\u043D\u0438 \u0440\u0435\u0434
+simplyhtml.insertTableTitle=\u0423\u043C\u0435\u0442\u043D\u0438 \u0442\u0430\u0431\u0435\u043B\u0443
+simplyhtml.italicName=\u0423\u043A\u043E\u0448\u0435\u043D\u043E
+simplyhtml.layoutTabTitle=\u041E\u0441\u043D\u043E\u0432\u043D\u0438 \u043F\u0440\u0438\u043A\u0430\u0437
+simplyhtml.leftLabel=\u043B\u0435\u0432\u043E:
+simplyhtml.listDialogTitle=\u041E\u0431\u043B\u0438\u043A \u0441\u043F\u0438\u0441\u043A\u0430
simplyhtml.listIndentTitle=\u0423\u0432\u0443\u0446\u0438:
-simplyhtml.listPosInside=\u0438\u0437\u043d\u0443\u0442\u0440\u0430
-simplyhtml.listPositionLabel=\u041f\u043e\u043b\u043e\u0436\u0430\u0458:
-simplyhtml.listPosOutside=\u0441\u043f\u043e\u0459\u0430
-simplyhtml.listTypeCircle=\u043a\u0440\u0443\u0436\u0438\u045b
+simplyhtml.listPosInside=\u0438\u0437\u043D\u0443\u0442\u0440\u0430
+simplyhtml.listPositionLabel=\u041F\u043E\u043B\u043E\u0436\u0430\u0458:
+simplyhtml.listPosOutside=\u0441\u043F\u043E\u0459\u0430
+simplyhtml.listTypeCircle=\u043A\u0440\u0443\u0436\u0438\u045B
simplyhtml.listTypeDecimal=1.,2.,3.,4.
-simplyhtml.listTypeDisc=\u0441\u0438\u043c\u0431\u043e\u043b \u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435 \u043a\u0430\u043e \u043e\u0437\u043d\u0430\u043a\u0430
-simplyhtml.listTypeLabel=\u0422\u0438\u043f:
+simplyhtml.listTypeDisc=\u0441\u0438\u043C\u0431\u043E\u043B \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u043A\u0430\u043E \u043E\u0437\u043D\u0430\u043A\u0430
+simplyhtml.listTypeLabel=\u0422\u0438\u043F:
simplyhtml.listTypeLowerAlpha=\u0430.,\u0431.,\u0446.,\u0434.
simplyhtml.listTypeLowerRoman=i.,ii.,iii.,iv.
-simplyhtml.listTypeNone=\u043d\u0438\u0448\u0442\u0430
-simplyhtml.listTypeSquare=\u043a\u0432\u0430\u0434\u0440\u0430\u0442
+simplyhtml.listTypeNone=\u043D\u0438\u0448\u0442\u0430
+simplyhtml.listTypeSquare=\u043A\u0432\u0430\u0434\u0440\u0430\u0442
simplyhtml.listTypeUpperAlpha=\u0410.,\u0411.,\u0426.,\u0414.
simplyhtml.listTypeUpperRoman=I.,II.,III.,IV.
-simplyhtml.marginLabel=\u0421\u043f\u043e\u0459\u043d\u0438
-simplyhtml.matchApproximately=\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u043d\u043e
-simplyhtml.matchApproximately.tooltip=<html>\u041e\u043c\u043e\u0433\u0443\u045b\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u043d\u043e \u043f\u043e\u0440\u0435\u0452\u0435\u045a\u0435,<br/>\u043d\u043f\u0440. \u0443 \u043f\u043e\u0442\u0440\u0430\u0437\u0438 \u0437\u0430 '\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435' \u043d\u0430\u045b\u0438 \u045b\u0435 '\u0434\u0430\u0442\u043e\u0442\u0435\u043a\u0435'.</html>
-simplyhtml.matchCase=\u0426\u0438\u0459\u0430\u043d\u0430 \u0440\u0435\u0447
-simplyhtml.matchCase.tooltip=\u0420\u0430\u0437\u043b\u0438\u043a\u0443\u0458 \u0432\u0435\u043b\u0438\u043a\u0430 \u0438 \u043c\u0430\u043b\u0430 \u0441\u043b\u043e\u0432\u0430 \u043a\u043e\u0434 \u043f\u043e\u0440\u0435\u0452\u0435\u045a\u0430.
-simplyhtml.newStyleDefaultName=\u043d\u043e\u0432\u0438 \u0441\u0442\u0438\u043b
-simplyhtml.nextTableCellLabel=\u0421\u043b\u0435\u0434\u0435\u045b\u0430 \u045b\u0435\u043b\u0438\u0458\u0430
-simplyhtml.noLineLabel=\u043d\u0438\u0448\u0442\u0430
-simplyhtml.noMoreOccurrencesFound=\u043d\u0435\u043c\u0430 \u0432\u0438\u0448\u0435 \u043f\u043e\u0434\u0443\u0434\u0430\u0440\u043d\u043e\u0441\u0442\u0438
+simplyhtml.marginLabel=\u0421\u043F\u043E\u0459\u043D\u0438
+simplyhtml.matchApproximately=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043F\u0440\u0438\u0431\u043B\u0438\u0436\u043D\u043E
+simplyhtml.matchApproximately.tooltip=<html>\u041E\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0440\u0438\u0431\u043B\u0438\u0436\u043D\u043E \u043F\u043E\u0440\u0435\u0452\u0435\u045A\u0435,<br/>\u043D\u043F\u0440. \u0443 \u043F\u043E\u0442\u0440\u0430\u0437\u0438 \u0437\u0430 '\u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435' \u043D\u0430\u045B\u0438 \u045B\u0435 '\u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435'.</html>
+simplyhtml.matchCase=\u0426\u0438\u0459\u0430\u043D\u0430 \u0440\u0435\u0447
+simplyhtml.matchCase.tooltip=\u0420\u0430\u0437\u043B\u0438\u043A\u0443\u0458 \u0432\u0435\u043B\u0438\u043A\u0430 \u0438 \u043C\u0430\u043B\u0430 \u0441\u043B\u043E\u0432\u0430 \u043A\u043E\u0434 \u043F\u043E\u0440\u0435\u0452\u0435\u045A\u0430.
+simplyhtml.newStyleDefaultName=\u043D\u043E\u0432\u0438 \u0441\u0442\u0438\u043B
+simplyhtml.nextTableCellLabel=\u0421\u043B\u0435\u0434\u0435\u045B\u0430 \u045B\u0435\u043B\u0438\u0458\u0430
+simplyhtml.noLineLabel=\u043D\u0438\u0448\u0442\u0430
+simplyhtml.noMoreOccurrencesFound=\u043D\u0435\u043C\u0430 \u0432\u0438\u0448\u0435 \u043F\u043E\u0434\u0443\u0434\u0430\u0440\u043D\u043E\u0441\u0442\u0438
simplyhtml.okBtnName=\u0423 \u0440\u0435\u0434\u0443
-simplyhtml.paddingLabel=\u0423\u043d\u0443\u0442\u0440\u0430\u0448\u045a\u0438
-simplyhtml.paraAlignCenterLabel=\u041f\u043e\u0440\u0430\u0432\u043d\u0430\u0458 \u043f\u043e \u0441\u0440\u0435\u0434\u0438\u043d\u0438
-simplyhtml.paraAlignCenterTip=\u041f\u043e\u0440\u0430\u0432\u043d\u0430\u0432\u0430\u045a\u0435 \u043f\u0430\u0441\u0443\u0441\u0430 \u043f\u043e \u0441\u0440\u0435\u0434\u0438\u043d\u0438
-simplyhtml.paraAlignLeftLabel=\u041f\u043e\u0440\u0430\u0432\u043d\u0430\u0458 \u043b\u0435\u0432\u043e
-simplyhtml.paraAlignLeftTip=\u041f\u043e\u0440\u0430\u0432\u043d\u0430\u0432\u0430\u045a\u0435 \u043f\u0430\u0441\u0443\u0441\u0430 \u0443\u043b\u0435\u0432\u043e
-simplyhtml.paraAlignRightLabel=\u041f\u043e\u0440\u0430\u0432\u043d\u0430\u0458 \u0434\u0435\u0441\u043d\u043e
-simplyhtml.paraAlignRightTip=\u041f\u043e\u0440\u0430\u0432\u043d\u0430\u0432\u0430\u045a\u0435 \u043f\u0430\u0441\u0443\u0441\u0430 \u0443\u0434\u0435\u0441\u043d\u043e
-simplyhtml.paraStyleDialogTitle=\u0421\u0442\u0438\u043b \u043f\u0430\u0441\u0443\u0441\u0430
-simplyhtml.paraTabLabel=\u041f\u0430\u0441\u0443\u0441
-simplyhtml.pasteHTMLLabel=\u041d\u0430\u043b\u0435\u043f\u0438 HTML
-simplyhtml.pasteLabel=\u041d\u0430\u043b\u0435\u043f\u0438
-simplyhtml.pastePlainTextLabel=\u041d\u0430\u043b\u0435\u043f\u0438 \u0447\u0438\u0441\u0442 \u0442\u0435\u043a\u0441\u0442
-simplyhtml.pasteTip=\u043d\u0430\u043b\u0435\u043f\u0438
-simplyhtml.plainName=\u043e\u0431\u0438\u0447\u0430\u043d
-simplyhtml.previewLabel=\u041f\u0440\u0435\u0433\u043b\u0435\u0434
-simplyhtml.previewText=\u041f\u0440\u0435\u0433\u043b\u0435\u0434 \u0442\u0435\u043a\u0441\u0442\u0430
-simplyhtml.prevTableCellLabel=\u041f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u0430 \u045b\u0435\u043b\u0438\u0458\u0430
-simplyhtml.printLabel=\u041e\u0434\u0448\u0442\u0430\u043c\u043f\u0430\u0458...
-simplyhtml.redoLabel=\u041f\u043e\u043d\u043e\u0432\u0438
-simplyhtml.redoTip=\u043f\u043e\u043d\u043e\u0432\u0438
-simplyhtml.replace=\u0417\u0430\u043c\u0435\u043d\u0438...
+simplyhtml.paddingLabel=\u0423\u043D\u0443\u0442\u0440\u0430\u0448\u045A\u0438
+simplyhtml.paraAlignCenterLabel=\u041F\u043E\u0440\u0430\u0432\u043D\u0430\u0458 \u043F\u043E \u0441\u0440\u0435\u0434\u0438\u043D\u0438
+simplyhtml.paraAlignCenterTip=\u041F\u043E\u0440\u0430\u0432\u043D\u0430\u0432\u0430\u045A\u0435 \u043F\u0430\u0441\u0443\u0441\u0430 \u043F\u043E \u0441\u0440\u0435\u0434\u0438\u043D\u0438
+simplyhtml.paraAlignLeftLabel=\u041F\u043E\u0440\u0430\u0432\u043D\u0430\u0458 \u043B\u0435\u0432\u043E
+simplyhtml.paraAlignLeftTip=\u041F\u043E\u0440\u0430\u0432\u043D\u0430\u0432\u0430\u045A\u0435 \u043F\u0430\u0441\u0443\u0441\u0430 \u0443\u043B\u0435\u0432\u043E
+simplyhtml.paraAlignRightLabel=\u041F\u043E\u0440\u0430\u0432\u043D\u0430\u0458 \u0434\u0435\u0441\u043D\u043E
+simplyhtml.paraAlignRightTip=\u041F\u043E\u0440\u0430\u0432\u043D\u0430\u0432\u0430\u045A\u0435 \u043F\u0430\u0441\u0443\u0441\u0430 \u0443\u0434\u0435\u0441\u043D\u043E
+simplyhtml.paraStyleDialogTitle=\u0421\u0442\u0438\u043B \u043F\u0430\u0441\u0443\u0441\u0430
+simplyhtml.paraTabLabel=\u041F\u0430\u0441\u0443\u0441
+simplyhtml.pasteHTMLLabel=\u041D\u0430\u043B\u0435\u043F\u0438 HTML
+simplyhtml.pasteLabel=\u041D\u0430\u043B\u0435\u043F\u0438
+simplyhtml.pastePlainTextLabel=\u041D\u0430\u043B\u0435\u043F\u0438 \u0447\u0438\u0441\u0442 \u0442\u0435\u043A\u0441\u0442
+simplyhtml.pasteTip=\u043D\u0430\u043B\u0435\u043F\u0438
+simplyhtml.plainName=\u043E\u0431\u0438\u0447\u0430\u043D
+simplyhtml.previewLabel=\u041F\u0440\u0435\u0433\u043B\u0435\u0434
+simplyhtml.previewText=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0442\u0435\u043A\u0441\u0442\u0430
+simplyhtml.prevTableCellLabel=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0430 \u045B\u0435\u043B\u0438\u0458\u0430
+simplyhtml.printLabel=\u041E\u0434\u0448\u0442\u0430\u043C\u043F\u0430\u0458...
+simplyhtml.redoLabel=\u041F\u043E\u043D\u043E\u0432\u0438
+simplyhtml.redoTip=\u043F\u043E\u043D\u043E\u0432\u0438
+simplyhtml.replace=\u0417\u0430\u043C\u0435\u043D\u0438...
simplyhtml.replaceAll=\u0421\u0432\u0435
-simplyhtml.replaceDone=\u0413\u043e\u0442\u043e\u0432\u043e
-simplyhtml.replaceNo=\u041d\u0435
-simplyhtml.replaceThisQuery=\u0437\u0430\u043c\u0435\u043d\u0438 \u043e\u0432\u0443 \u043f\u043e\u0458\u0430\u0432\u0443
-simplyhtml.replaceWith=\u0417\u0430\u043c\u0435\u043d\u0438 \u0441\u0430:
+simplyhtml.replaceDone=\u0413\u043E\u0442\u043E\u0432\u043E
+simplyhtml.replaceNo=\u041D\u0435
+simplyhtml.replaceThisQuery=\u0437\u0430\u043C\u0435\u043D\u0438 \u043E\u0432\u0443 \u043F\u043E\u0458\u0430\u0432\u0443
+simplyhtml.replaceWith=\u0417\u0430\u043C\u0435\u043D\u0438 \u0441\u0430:
simplyhtml.replaceYes=\u0414\u0430
-simplyhtml.rightLabel=\u0434\u0435\u0441\u043d\u043e:
-simplyhtml.searchDown=\u0422\u0440\u0430\u0436\u0438 \u043d\u0430\u0434\u043e\u043b\u0435
-simplyhtml.searchDown.tooltip=\u041f\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043e\u0434 \u0432\u0440\u0445\u0430 \u0434\u043e \u0434\u043d\u0430.
-simplyhtml.searchFromStart=\u0422\u0440\u0430\u0436\u0438 \u043e\u0434 \u043f\u043e\u0447\u0435\u0442\u043a\u0430
-simplyhtml.searchFromStart.tooltip=\u041f\u043e\u0447\u0435\u0442\u0430\u043a \u043f\u0440\u0435\u0442\u0440\u0430\u0433\u0435 \u0441\u0430 \u0432\u0440\u0445\u0430 \u0443\u043c\u0435\u0441\u0442\u043e \u0441\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0458\u0435 \u043f\u043e\u043a\u0430\u0437\u0438\u0432\u0430\u0447\u0430
-simplyhtml.searchUp=\u0422\u0440\u0430\u0436\u0438 \u043d\u0430\u0433\u043e\u0440\u0435
-simplyhtml.searchUp.tooltip=\u041f\u0440\u0435\u0442\u0440\u0430\u0436\u0438 \u043e\u0434 \u0434\u043d\u0430 \u043a\u0430 \u0432\u0440\u0445\u0443.
-simplyhtml.selectAllLabel=\u041e\u0434\u0430\u0431\u0435\u0440\u0438 \u0441\u0432\u0435
-simplyhtml.sizeLabel=\u0412\u0435\u043b\u0438\u0447\u0438\u043d\u0430
-simplyhtml.standardStyleName=\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u043e
-simplyhtml.strikeLabel=\u041f\u0440\u0435\u0446\u0440\u0442\u0430\u043d\u043e
-simplyhtml.styleLabel=\u0421\u0442\u0438\u043b
-simplyhtml.styleNameInputText=\u041d\u0430\u0437\u0438\u0432 \u043d\u043e\u0432\u043e\u0433 \u0441\u0442\u0438\u043b\u0430?
-simplyhtml.styleNameInputTitle=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u0442\u0438\u043b
-simplyhtml.tableBgColLabel=\u0411\u043e\u0458\u0430 \u043f\u043e\u0437\u0430\u0434\u0438\u043d\u0435:
-simplyhtml.tableDialogTitle=\u041e\u0431\u043b\u0438\u043a \u0442\u0430\u0431\u0435\u043b\u0435
-simplyhtml.tableLabel=\u0422\u0430\u0431\u0435\u043b\u0430
-simplyhtml.tablePanelTitle=\u041e\u0431\u043b\u0438\u043a \u0442\u0430\u0431\u0435\u043b\u0435
-simplyhtml.tableWidthLabel=\u0428\u0438\u0440\u0438\u043d\u0430:
+simplyhtml.rightLabel=\u0434\u0435\u0441\u043D\u043E:
+simplyhtml.searchDown=\u0422\u0440\u0430\u0436\u0438 \u043D\u0430\u0434\u043E\u043B\u0435
+simplyhtml.searchDown.tooltip=\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 \u043E\u0434 \u0432\u0440\u0445\u0430 \u0434\u043E \u0434\u043D\u0430.
+simplyhtml.searchFromStart=\u0422\u0440\u0430\u0436\u0438 \u043E\u0434 \u043F\u043E\u0447\u0435\u0442\u043A\u0430
+simplyhtml.searchFromStart.tooltip=\u041F\u043E\u0447\u0435\u0442\u0430\u043A \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435 \u0441\u0430 \u0432\u0440\u0445\u0430 \u0443\u043C\u0435\u0441\u0442\u043E \u0441\u0430 \u043F\u043E\u0437\u0438\u0446\u0438\u0458\u0435 \u043F\u043E\u043A\u0430\u0437\u0438\u0432\u0430\u0447\u0430
+simplyhtml.searchUp=\u0422\u0440\u0430\u0436\u0438 \u043D\u0430\u0433\u043E\u0440\u0435
+simplyhtml.searchUp.tooltip=\u041F\u0440\u0435\u0442\u0440\u0430\u0436\u0438 \u043E\u0434 \u0434\u043D\u0430 \u043A\u0430 \u0432\u0440\u0445\u0443.
+simplyhtml.selectAllLabel=\u041E\u0434\u0430\u0431\u0435\u0440\u0438 \u0441\u0432\u0435
+simplyhtml.sizeLabel=\u0412\u0435\u043B\u0438\u0447\u0438\u043D\u0430
+simplyhtml.standardStyleName=\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u043E
+simplyhtml.strikeLabel=\u041F\u0440\u0435\u0446\u0440\u0442\u0430\u043D\u043E
+simplyhtml.styleLabel=\u0421\u0442\u0438\u043B
+simplyhtml.styleNameInputText=\u041D\u0430\u0437\u0438\u0432 \u043D\u043E\u0432\u043E\u0433 \u0441\u0442\u0438\u043B\u0430?
+simplyhtml.styleNameInputTitle=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0441\u0442\u0438\u043B
+simplyhtml.tableBgColLabel=\u0411\u043E\u0458\u0430 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0435:
+simplyhtml.tableDialogTitle=\u041E\u0431\u043B\u0438\u043A \u0442\u0430\u0431\u0435\u043B\u0435
+simplyhtml.tableLabel=\u0422\u0430\u0431\u0435\u043B\u0430
+simplyhtml.tablePanelTitle=\u041E\u0431\u043B\u0438\u043A \u0442\u0430\u0431\u0435\u043B\u0435
+simplyhtml.tableWidthLabel=\u0428\u0438\u0440\u0438\u043D\u0430:
simplyhtml.textIndentLabel=\u0423\u0432\u0443\u0446\u0438:
-simplyhtml.textToFind=\u0422\u0440\u0430\u0436\u0438 \u043e\u0432\u043e:
-simplyhtml.thisCellRangeLabel=\u043e\u0432\u0430 \u045b\u0435\u043b\u0438\u0458\u0430
-simplyhtml.thisColRangeLabel=\u043e\u0432\u0430\u0458 \u0441\u0442\u0443\u0431\u0430\u0446
-simplyhtml.thisRowRangeLabel=\u043e\u0432\u0430\u0458 \u0440\u0435\u0434
-simplyhtml.toggleBulletsLabel=\u0423\u041a\u0409/\u0418\u0421\u041a\u0409 \u0441\u043f\u0438\u0441\u0430\u043a \u0441\u0430 \u043e\u0437\u043d\u0430\u043a\u0430\u043c\u0430
-simplyhtml.toggleBulletsTip=\u0423\u041a\u0409/\u0418\u0421\u041a\u0409 \u0441\u043f\u0438\u0441\u0430\u043a \u0441\u0430 \u043e\u0437\u043d\u0430\u043a\u0430\u043c\u0430
-simplyhtml.toggleNumbersLabel=\u0423\u041a\u0409/\u0418\u0421\u041a\u0409 \u0431\u0440\u043e\u0458\u0447\u0430\u043d\u0438 \u0441\u043f\u0438\u0441\u0430\u043a
-simplyhtml.toggleNumbersTip=\u0423\u041a\u0409/\u0418\u0421\u041a\u0409 \u0431\u0440\u043e\u0458\u0447\u0430\u043d\u0438 \u0441\u043f\u0438\u0441\u0430\u043a
+simplyhtml.textToFind=\u0422\u0440\u0430\u0436\u0438 \u043E\u0432\u043E:
+simplyhtml.thisCellRangeLabel=\u043E\u0432\u0430 \u045B\u0435\u043B\u0438\u0458\u0430
+simplyhtml.thisColRangeLabel=\u043E\u0432\u0430\u0458 \u0441\u0442\u0443\u0431\u0430\u0446
+simplyhtml.thisRowRangeLabel=\u043E\u0432\u0430\u0458 \u0440\u0435\u0434
+simplyhtml.toggleBulletsLabel=\u0423\u041A\u0409/\u0418\u0421\u041A\u0409 \u0441\u043F\u0438\u0441\u0430\u043A \u0441\u0430 \u043E\u0437\u043D\u0430\u043A\u0430\u043C\u0430
+simplyhtml.toggleBulletsTip=\u0423\u041A\u0409/\u0418\u0421\u041A\u0409 \u0441\u043F\u0438\u0441\u0430\u043A \u0441\u0430 \u043E\u0437\u043D\u0430\u043A\u0430\u043C\u0430
+simplyhtml.toggleNumbersLabel=\u0423\u041A\u0409/\u0418\u0421\u041A\u0409 \u0431\u0440\u043E\u0458\u0447\u0430\u043D\u0438 \u0441\u043F\u0438\u0441\u0430\u043A
+simplyhtml.toggleNumbersTip=\u0423\u041A\u0409/\u0418\u0421\u041A\u0409 \u0431\u0440\u043E\u0458\u0447\u0430\u043D\u0438 \u0441\u043F\u0438\u0441\u0430\u043A
simplyhtml.topLabel=\u0432\u0440\u0445:
-simplyhtml.uLineLabel=\u041f\u043e\u0434\u0432\u0443\u0447\u0435\u043d\u043e
-simplyhtml.unableToOpenFileError=\u0414\u0430\u0442\u043e\u0442\u0435\u043a\u0430 \u0441\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435 \u043e\u0442\u0432\u043e\u0440\u0438\u0442\u0438
-simplyhtml.unableToRedoError=\u041d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043d\u043e\u0432\u0438\u0442\u0438:
-simplyhtml.unableToUndoError=\u041d\u0435 \u043c\u043e\u0433\u0443 \u043e\u043f\u043e\u0437\u0432\u0430\u0442\u0438:
-simplyhtml.undoLabel=\u041e\u043f\u043e\u0437\u043e\u0432\u0438
-simplyhtml.undoTip=\u043e\u043f\u043e\u0437\u043e\u0432\u0438
-simplyhtml.valignBaseline=\u043e\u0441\u043d\u043e\u0432\u043d\u0430 \u0446\u0440\u0442\u0430
-simplyhtml.valignBottom=\u0434\u043d\u043e
-simplyhtml.valignLabel=\u0423\u0441\u043f\u0440.\u043f\u043e\u0440\u0430\u0432\u043d.:
-simplyhtml.valignMiddle=\u0441\u0440\u0435\u0434\u0438\u043d\u0430
+simplyhtml.uLineLabel=\u041F\u043E\u0434\u0432\u0443\u0447\u0435\u043D\u043E
+simplyhtml.unableToOpenFileError=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0441\u0435 \u043D\u0435 \u043C\u043E\u0436\u0435 \u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0438
+simplyhtml.unableToRedoError=\u041D\u0435 \u043C\u043E\u0433\u0443 \u043F\u043E\u043D\u043E\u0432\u0438\u0442\u0438:
+simplyhtml.unableToUndoError=\u041D\u0435 \u043C\u043E\u0433\u0443 \u043E\u043F\u043E\u0437\u0432\u0430\u0442\u0438:
+simplyhtml.undoLabel=\u041E\u043F\u043E\u0437\u043E\u0432\u0438
+simplyhtml.undoTip=\u043E\u043F\u043E\u0437\u043E\u0432\u0438
+simplyhtml.valignBaseline=\u043E\u0441\u043D\u043E\u0432\u043D\u0430 \u0446\u0440\u0442\u0430
+simplyhtml.valignBottom=\u0434\u043D\u043E
+simplyhtml.valignLabel=\u0423\u0441\u043F\u0440.\u043F\u043E\u0440\u0430\u0432\u043D.:
+simplyhtml.valignMiddle=\u0441\u0440\u0435\u0434\u0438\u043D\u0430
simplyhtml.valignTop=\u0432\u0440\u0445
-simplyhtml.wholeWordsOnly=\u0421\u0430\u043c\u043e \u0446\u0435\u043b\u0435 \u0440\u0435\u0447\u0438
-simplyhtml.wholeWordsOnly.tooltip=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438 \u043f\u043e\u0440\u0435\u0452\u0435\u045a\u0435 \u043d\u0430 \u0446\u0435\u043b\u0435 \u0440\u0435\u0447\u0438.
-SortNodes.text=\u041f\u043e&\u0440\u0435\u0452\u0430\u0458 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0435
-SortNodes.tooltip=\u0420\u0430\u0437\u0432\u0440\u0441\u0442\u0430\u0432\u0430\u045a\u0435 \u0441\u0432\u0438\u0445 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438\u0445 \u0447\u0432\u043e\u0440\u043e\u0432\u0430 \u0430\u0437\u0431\u0443\u0447\u043d\u0438\u043c \u0440\u0435\u0434\u043e\u043c.
-split=&\u0418\u0437\u0434\u0435\u043b\u0438
-SplitConditionAction.text=\u0418\u0437\u0434\u0435\u043b\u0438
-SplitNode.text=&\u0418\u0437\u0434\u0435\u043b\u0438 \u0447\u0432\u043e\u0440
-SplitNode.tooltip=<html>\u0427\u0432\u043e\u0440 \u0458\u0435 \u0438\u0437\u0434\u0435\u0459\u0435\u043d</html>
-STANDARD_FORMAT=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434
-stop_processing=\u0421\u0442\u0430\u043d\u0438
-StringFlavorHandler=\u041e\u0431\u0438\u0447\u0430\u043d \u0442\u0435\u043a\u0441\u0442 \u043a\u0430\u043e \u0445\u0438\u0458\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0430 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-StructuredHtmlFlavorHandler=HTML \u043a\u0430\u043e \u0445\u0438\u0458\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0430 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-style=\u0421\u0442\u0438\u043b
-style_already_exists=\u0421\u0442\u0438\u043b \u0432\u0435\u045b \u043f\u043e\u0441\u0442\u043e\u0458\u0438!
-styledialog.cancel.text=\u041e\u0442\u043a\u0430\u0436\u0438
+simplyhtml.wholeWordsOnly=\u0421\u0430\u043C\u043E \u0446\u0435\u043B\u0435 \u0440\u0435\u0447\u0438
+simplyhtml.wholeWordsOnly.tooltip=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438 \u043F\u043E\u0440\u0435\u0452\u0435\u045A\u0435 \u043D\u0430 \u0446\u0435\u043B\u0435 \u0440\u0435\u0447\u0438.
+SortNodes.text=\u041F\u043E&\u0440\u0435\u0452\u0430\u0458 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435
+SortNodes.tooltip=\u0420\u0430\u0437\u0432\u0440\u0441\u0442\u0430\u0432\u0430\u045A\u0435 \u0441\u0432\u0438\u0445 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438\u0445 \u0447\u0432\u043E\u0440\u043E\u0432\u0430 \u0430\u0437\u0431\u0443\u0447\u043D\u0438\u043C \u0440\u0435\u0434\u043E\u043C.
+split=&\u0418\u0437\u0434\u0435\u043B\u0438
+SplitConditionAction.text=\u0418\u0437\u0434\u0435\u043B\u0438
+SplitNode.text=&\u0418\u0437\u0434\u0435\u043B\u0438 \u0447\u0432\u043E\u0440
+SplitNode.tooltip=<html>\u0427\u0432\u043E\u0440 \u0458\u0435 \u0438\u0437\u0434\u0435\u0459\u0435\u043D</html>
+STANDARD_FORMAT=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434
+stop_processing=\u0421\u0442\u0430\u043D\u0438
+StringFlavorHandler=\u041E\u0431\u0438\u0447\u0430\u043D \u0442\u0435\u043A\u0441\u0442 \u043A\u0430\u043E \u0445\u0438\u0458\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0430 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+StructuredHtmlFlavorHandler=HTML \u043A\u0430\u043E \u0445\u0438\u0458\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0430 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+style=\u0421\u0442\u0438\u043B
+style_already_exists=\u0421\u0442\u0438\u043B \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438!
+styledialog.cancel.text=\u041E\u0442\u043A\u0430\u0436\u0438
styledialog.ok.text=\u0423 \u0440\u0435\u0434\u0443
-styles=\u0421\u0442&\u0438\u043b\u043e\u0432\u0438
-styles.AutomaticLayout=\u0410\u0443\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u0438 \u0438\u0437\u0433\u043b\u0435\u0434
-styles.connection=\u041f\u043e\u0432\u0435\u0437\u0430\u043d\u043e\u0441\u0442
-styles.date=\u0414\u0430\u0442\u0443\u043c
-styles.definition=\u0414\u0435\u0444\u0438\u043d\u0438\u0446\u0438\u0458\u0430
-styles.description=\u041e\u043f\u0438\u0441
-styles.floating_node=\u041b\u0435\u0431\u0434\u0435\u045b\u0438 \u0447\u0432\u043e\u0440
-styles.idea=\u0417\u0430\u043c\u0438\u0441\u0430\u043e
-styles.important=\u0412\u0430\u0436\u043d\u043e
-styles.key=\u041a\u0459\u0443\u0447
-styles.list=\u0421\u043f\u0438\u0441\u0430\u043a
-styles.needs_action=\u041f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u0458\u0435 \u0434\u0435\u0458\u0441\u0442\u0432\u043e
-styles.note=\u0411\u0435\u043b\u0435\u0448\u043a\u0430
+styles=\u0421\u0442&\u0438\u043B\u043E\u0432\u0438
+styles.AutomaticLayout=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0438\u0437\u0433\u043B\u0435\u0434
+styles.connection=\u041F\u043E\u0432\u0435\u0437\u0430\u043D\u043E\u0441\u0442
+styles.date=\u0414\u0430\u0442\u0443\u043C
+styles.definition=\u0414\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0430
+styles.description=\u041E\u043F\u0438\u0441
+styles.floating_node=\u041B\u0435\u0431\u0434\u0435\u045B\u0438 \u0447\u0432\u043E\u0440
+styles.idea=\u0417\u0430\u043C\u0438\u0441\u0430\u043E
+styles.important=\u0412\u0430\u0436\u043D\u043E
+styles.key=\u041A\u0459\u0443\u0447
+styles.list=\u0421\u043F\u0438\u0441\u0430\u043A
+styles.needs_action=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0434\u0435\u0458\u0441\u0442\u0432\u043E
+styles.note=\u0411\u0435\u043B\u0435\u0448\u043A\u0430
styles.ok=\u0423 \u0440\u0435\u0434\u0443
-styles.pending=\u0423 \u0438\u0448\u0447\u0435\u043a\u0438\u0432\u0430\u045a\u0443
-styles.predefined=\u0423\u043d\u0430\u043f\u0440\u0435\u0434 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u0441\u0442\u0438\u043b\u043e\u0432\u0438
-styles.question=\u041f\u0438\u0442\u0430\u045a\u0435
+styles.pending=\u0423 \u0438\u0448\u0447\u0435\u043A\u0438\u0432\u0430\u045A\u0443
+styles.predefined=\u0423\u043D\u0430\u043F\u0440\u0435\u0434 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u0441\u0442\u0438\u043B\u043E\u0432\u0438
+styles.question=\u041F\u0438\u0442\u0430\u045A\u0435
styles.quotation=\u0426\u0438\u0442\u0430\u0442
-styles.root_node=\u0421\u0442\u0438\u043b\u043e\u0432\u0438
-styles.subsubtopic=\u041f\u043e\u0434\u0442\u0435\u043c\u0430
-styles.subtopic=\u041f\u043e\u0434\u0442\u0435\u043c\u0430
-styles.topic=\u0422\u0435\u043c\u0430
-styles.user-defined=\u041a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0438 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438 \u0441\u0442\u0438\u043b\u043e\u0432\u0438
-styles.website=\u0412\u0435\u0431 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430
-styles_menu=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u0438 \u0441\u0442\u0438\u043b\u043e\u0432\u0438
-submenu_keystroke_in_use_error=\u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0430 \u043f\u0440\u0435\u0447\u0438\u0446\u0430 {0} \u043d\u0435 \u043c\u043e\u0436\u0435 \u0431\u0438\u0442\u0438 \u043a\u043e\u0440\u0438\u0448\u045b\u0435\u043d\u0430 \u0437\u0430 \u043f\u043e\u0434\u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a {1}. \u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0430 \u043f\u0440\u0435\u0447\u0438\u0446\u0430 \u0458\u0435 \u0443\u043a\u043b\u043e\u045a\u0435\u043d\u0430.
-summary_nodes=\u0420\u0435\u0437\u0438\u043c\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0430
-summary_not_possible=\u041d\u0435 \u043c\u043e\u0433\u0443 \u0434\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u043c \u043f\u0440\u0435\u0433\u043b\u0435\u0434 \u0447\u0432\u043e\u0440\u0430 \u0437\u0430 \u0442\u0440\u0435\u043d\u0443\u0442\u043d\u0438 \u0438\u0437\u0431\u043e\u0440
-SummaryNodeAction.text=\u0420\u0435\u0437\u0438\u043c\u0435 \u0447\u0432\u043e\u0440\u0430 (\u043f\u043e\u0441\u0442\u0430\u0432\u0438/\u0443 \u043f\u043e\u0447\u0435\u0442\u043d\u043e)
+styles.root_node=\u0421\u0442\u0438\u043B\u043E\u0432\u0438
+styles.subsubtopic=\u041F\u043E\u0434\u0442\u0435\u043C\u0430
+styles.subtopic=\u041F\u043E\u0434\u0442\u0435\u043C\u0430
+styles.topic=\u0422\u0435\u043C\u0430
+styles.user-defined=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u0441\u0442\u0438\u043B\u043E\u0432\u0438
+styles.website=\u0412\u0435\u0431 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430
+styles_menu=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0438 \u0441\u0442\u0438\u043B\u043E\u0432\u0438
+submenu_keystroke_in_use_error=\u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0430 \u043F\u0440\u0435\u0447\u0438\u0446\u0430 {0} \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u043D\u0430 \u0437\u0430 \u043F\u043E\u0434\u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A {1}. \u0422\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0430 \u043F\u0440\u0435\u0447\u0438\u0446\u0430 \u0458\u0435 \u0443\u043A\u043B\u043E\u045A\u0435\u043D\u0430.
+summary_nodes=\u0420\u0435\u0437\u0438\u043C\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0430
+summary_not_possible=\u041D\u0435 \u043C\u043E\u0433\u0443 \u0434\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u043C \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u0447\u0432\u043E\u0440\u0430 \u0437\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u0438\u0437\u0431\u043E\u0440
svg=SVG
-template_dir=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0434\u043d\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0438
-TimeListAction.text=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0437\u0430\u0434\u0430\u0446\u0438\u043c\u0430...
-TimeListAction.tooltip=\u041f\u0440\u0438\u043a\u0430\u0437\u0443\u0458\u0435 \u0441\u0432\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0441\u043a\u0435 \u043f\u043e\u0434\u0441\u0435\u0442\u043d\u0438\u043a\u0435 \u0438 \u043f\u0440\u0438\u043f\u0430\u0434\u0430\u0458\u0443\u045b\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435.
-TimeManagementAction.text=\u0423\u043f\u0440\u0430\u0432\u0459\u0430\u045a\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043e\u043c...
-TimeManagementAction.tooltip=<html> \u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0441\u043a\u0438 \u043c\u043e\u0434\u0443\u043b \u043e\u0434 Kai Toedter.</html>
-ToggleChildrenFoldedAction.text=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438/\u0421\u043a\u043b\u043e\u043f\u0438 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0438
-ToggleDetailsAction.text=\u0421\u0430\u043a\u0440\u0438\u0458 \u0434\u0435\u0442\u0430\u0459\u0435
-ToggleFBarAction.text=F- \u0442\u0440\u0430\u043a\u0430
-ToggleFoldedAction.text=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438/\u0421\u043a\u043b\u043e\u043f\u0438
-ToggleFullScreenAction.text=\u0426\u0435\u043b\u0438 \u0435\u043a\u0440\u0430\u043d
-ToggleLeftToolbarAction.text=&\u0418\u043a\u043e\u043d\u0435 \u0441\u0430 \u0430\u043b\u0430\u0442\u043a\u0430\u043c\u0430
-ToggleMenubarAction.text=&\u0418\u0437\u0431\u043e\u0440\u043d\u0430 \u0442\u0440\u0430\u043a\u0430
-ToggleStatusAction.text=\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u0443 \u0442\u0440\u0430\u043a\u0443
-ToggleToolbarAction.text=&\u0410\u043b\u0430\u0442\u043d\u0430 \u0442\u0440\u0430\u043a\u0430
-undefined_error=\u0414\u043e\u0448\u043b\u043e \u0458\u0435 \u0434\u043e \u043d\u0435\u043e\u0447\u0435\u043a\u0438\u0432\u0430\u043d\u0435 \u0433\u0440\u0435\u0448\u043a\u0435. \u041c\u043e\u043b\u0438\u043c \u043f\u043e\u043a\u0443\u0448\u0430\u0458\u0442\u0435 \u043f\u043e\u0441\u043b\u0430\u0442\u0438 \u043f\u043e\u0440\u0443\u043a\u0443 \u043e \u0433\u0440\u0435\u0448\u0446\u0438.
-underline=\u041f\u043e\u0434\u0432\u0443\u045b\u0438
-UnderlineAction.text=\u041f\u043e\u0434\u0432\u0443\u045b\u0438
-underlined=\u041f\u043e\u0434\u0432\u0443\u0447\u0435\u043d\u043e
-UndoAction.text=\u041e\u043f\u043e\u0437\u043e\u0432\u0438
-UndoFilterAction.text=\u041e\u043f\u043e\u0437\u043e\u0432\u0438 \u0434\u0435\u0458\u0441\u0442\u0432\u043e
-unfold=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0447\u0432\u043e\u0440
-UnfoldAllAction.text=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435
-UnfoldAllAction.tooltip=<html> \u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435 \u0438 \u045a\u0438\u043c\u0430 \u043f\u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0435.</html>
-UnfoldFilteredAncestorsAction.text=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0441\u043a\u0440\u0438\u0432\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435
-UnfoldFilteredAncestorsAction.tooltip=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0441\u0432\u0435 \u0441\u043a\u0440\u0438\u0432\u0435\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435 \u043d\u0430\u043a\u043e\u043d \u0444\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u045a\u0430.
-UnfoldOneLevelAction.text=\u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u0458\u0435\u0434\u0430\u043d \u043d\u0438\u0432\u043e
-UnfoldOneLevelAction.tooltip=<html> \u0420\u0430\u0441\u043a\u043b\u043e\u043f\u0438 \u043e\u0434\u0430\u0431\u0440\u0430\u043d\u0435 \u0447\u0432\u043e\u0440\u043e\u0432\u0435 \u0437\u0430 \u0458\u0435\u0434\u0430\u043d \u043d\u0438\u0432\u043e.</html>
-up=&\u0413\u043e\u0440\u0435
-update_failed=\u041d\u0430\u0434\u043e\u0433\u0440\u0430\u0434\u045a\u0430 \u043d\u0435\u0443\u0441\u043f\u0435\u043b\u0430 \u0441 \u043f\u043e\u0440\u0443\u043a\u043e\u043c {0}
-UpdateCheckAction.text=\u041f\u0440\u043e\u0432\u0435\u0440\u0438 \u0437\u0430 \u043d\u0430\u0434\u043e\u0433\u0440\u0430\u0434\u045a\u0443
-updatecheckdialog=\u0414\u0438\u0458\u0430\u043b\u043e\u0433 \u043f\u0440\u043e\u0432\u0435\u0440\u0435 \u043d\u0430\u0434\u043e\u0433\u0440\u0430\u0434\u045a\u0435
-url_error=\u041e\u0432\u0430\u0458 \u0423\u0420\u041b \u0458\u0435 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u043d\u043e \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d!
-url_load_error=\u041d\u0435 \u043c\u043e\u0433\u0443 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u043c\u0430\u043f\u0443 \u043d\u0430 \u0423\u0420\u041b:
-url_open_error=\u041d\u0435 \u043c\u043e\u0433\u0443 \u043e\u0442\u0432\u043e\u0440\u0438\u0442\u0438 \u0423\u0420\u041b \u0432\u0435\u0437\u0443 {0}.
-used_in_menu=\u041e\u0432\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043a\u0430 \u043f\u0440\u0435\u0447\u0438\u0446\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0431\u0438\u0442\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0459\u0435\u043d\u0430 \u0458\u0435\u0440 \u0441\u0435 \u043a\u043e\u0440\u0438\u0441\u0442\u0438 \u043a\u0430\u043e \u043f\u0440\u0435\u0447\u0438\u0446\u0430 \u0438\u0437\u0431\u043e\u0440\u043d\u0438\u043a\u0430.
-UsePlainTextAction.text=\u041a\u043e\u0440\u0438\u0441\u0442\u0438 \u0458\u0435\u0434\u043d\u043e\u0441\u0442\u0430\u0432\u0430\u043d \u0442\u0435\u043a\u0441\u0442
-user_config_folder=\u041f\u043e\u0434\u0435\u0448\u0435\u043d\u0430 \u043c\u0430\u043f\u0430 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u0430: {0}
-user_defined_scale=\u041a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0438 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430
-user_defined_zoom=\u041a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0438 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u043e
-user_defined_zoom_status_bar=\u0418\u0437\u043c\u0435\u043d\u0430 \u043f\u043e\u0432\u0435\u045b\u0430\u045a\u0430 \u043d\u0430 \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u0438 \u043e\u0434\u0440\u0435\u0452\u0435\u043d\u0443 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442 {0}%.
-user_icon=\u041a\u043e\u0440\u0438\u0441\u043d\u0447\u0438\u043a\u0430 \u0438\u043a\u043e\u043d\u0430 "{0}"
-user_template_dir=\u041a\u043e\u0440\u0438\u0441\u043d\u0447\u0438\u043a\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0438
-user_zoom=\u0424\u0430\u043a\u0442\u043e\u0440 \u043f\u043e\u0432\u0435\u045b\u0430\u045a\u0430 \u0448\u0442\u0430\u043c\u043f\u0430\u045a\u0430 (0.0 - 2.0):
-UseRichFormattingAction.text=\u041a\u043e\u0440\u0438\u0441\u0442\u0438 \u0431\u043e\u0459\u0435 \u043e\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u0438 \u0442\u0435\u043a\u0441\u0442
-value_format=\u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438
-version_up_to_date=\u0422\u0440\u0435\u043d\u0443\u0442\u043d\u043e \u043a\u043e\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043d\u0430\u0458\u043d\u043e\u0432\u0438\u0458\u0435 \u0438\u0437\u0434\u0430\u045a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u0430
-ViewerControllerAction.text=\u0421\u043f\u043e\u0459\u043d\u0438 \u043e\u0431\u0458\u0435\u043a\u0442...
-ViewLayoutTypeAction.OUTLINE.text=\u0428\u0435\u043c\u0430\u0442\u0441\u043a\u0438 \u043f\u0440\u0438\u043a\u0430\u0437
-WebDocuAction.text=\u0412\u0435\u0431 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0458\u0430
-width=\u0428\u0438\u0440\u0438\u043d\u0430
-wrong_regexp=\u041f\u043e\u0433\u0440\u0435\u0448\u0430\u043d \u0458\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043d \u0438\u0437\u0440\u0430\u0437 "{0}", \u0433\u0440\u0435\u0448\u043a\u0430 {1}
-xslt_export.html=HTML \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442
-xslt_export.latex=Latex \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442
-xslt_export.latexbook=Latex \u043a\u045a\u0438\u0433\u0430
+template_dir=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u0438
+TimeListAction.text=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0437\u0430\u0434\u0430\u0446\u0438\u043C\u0430...
+TimeListAction.tooltip=\u041F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u0441\u0432\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0435 \u043F\u043E\u0434\u0441\u0435\u0442\u043D\u0438\u043A\u0435 \u0438 \u043F\u0440\u0438\u043F\u0430\u0434\u0430\u0458\u0443\u045B\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435.
+TimeManagementAction.text=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u043E\u043C...
+TimeManagementAction.tooltip=<html> \u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440\u0441\u043A\u0438 \u043C\u043E\u0434\u0443\u043B \u043E\u0434 Kai Toedter.</html>
+ToggleChildrenFoldedAction.text=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438/\u0421\u043A\u043B\u043E\u043F\u0438 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438
+ToggleDetailsAction.text=\u0421\u0430\u043A\u0440\u0438\u0458 \u0434\u0435\u0442\u0430\u0459\u0435
+ToggleFBarAction.text=F- \u0442\u0440\u0430\u043A\u0430
+ToggleFoldedAction.text=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438/\u0421\u043A\u043B\u043E\u043F\u0438
+ToggleFullScreenAction.text=\u0426\u0435\u043B\u0438 \u0435\u043A\u0440\u0430\u043D
+ToggleLeftToolbarAction.text=&\u0418\u043A\u043E\u043D\u0435 \u0441\u0430 \u0430\u043B\u0430\u0442\u043A\u0430\u043C\u0430
+ToggleMenubarAction.text=&\u0418\u0437\u0431\u043E\u0440\u043D\u0430 \u0442\u0440\u0430\u043A\u0430
+ToggleStatusAction.text=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u043D\u0443 \u0442\u0440\u0430\u043A\u0443
+ToggleToolbarAction.text=&\u0410\u043B\u0430\u0442\u043D\u0430 \u0442\u0440\u0430\u043A\u0430
+toolbars=\u0422\u0440\u0430\u043A\u0435 \u0441\u0430 \u0430\u043B\u0430\u0442\u043A\u0430\u043C\u0430
+undefined_error=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u043D\u0435\u043E\u0447\u0435\u043A\u0438\u0432\u0430\u043D\u0435 \u0433\u0440\u0435\u0448\u043A\u0435. \u041C\u043E\u043B\u0438\u043C \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u043F\u043E\u0441\u043B\u0430\u0442\u0438 \u043F\u043E\u0440\u0443\u043A\u0443 \u043E \u0433\u0440\u0435\u0448\u0446\u0438.
+underline=\u041F\u043E\u0434\u0432\u0443\u045B\u0438
+UnderlineAction.text=\u041F\u043E\u0434\u0432\u0443\u045B\u0438
+underlined=\u041F\u043E\u0434\u0432\u0443\u0447\u0435\u043D\u043E
+UndoAction.text=\u041E\u043F\u043E\u0437\u043E\u0432\u0438
+UndoFilterAction.text=\u041E\u043F\u043E\u0437\u043E\u0432\u0438 \u0434\u0435\u0458\u0441\u0442\u0432\u043E
+unfold=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0447\u0432\u043E\u0440
+UnfoldAllAction.text=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435
+UnfoldAllAction.tooltip=<html> \u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435 \u0438 \u045A\u0438\u043C\u0430 \u043F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435.</html>
+UnfoldFilteredAncestorsAction.text=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0441\u043A\u0440\u0438\u0432\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435
+UnfoldFilteredAncestorsAction.tooltip=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0441\u0432\u0435 \u0441\u043A\u0440\u0438\u0432\u0435\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435 \u043D\u0430\u043A\u043E\u043D \u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u045A\u0430.
+UnfoldOneLevelAction.text=\u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u0458\u0435\u0434\u0430\u043D \u043D\u0438\u0432\u043E
+UnfoldOneLevelAction.tooltip=<html> \u0420\u0430\u0441\u043A\u043B\u043E\u043F\u0438 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0435 \u0447\u0432\u043E\u0440\u043E\u0432\u0435 \u0437\u0430 \u0458\u0435\u0434\u0430\u043D \u043D\u0438\u0432\u043E.</html>
+up=&\u0413\u043E\u0440\u0435
+update_failed=\u041D\u0430\u0434\u043E\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u043B\u0430 \u0441 \u043F\u043E\u0440\u0443\u043A\u043E\u043C {0}
+UpdateCheckAction.text=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u0437\u0430 \u043D\u0430\u0434\u043E\u0433\u0440\u0430\u0434\u045A\u0443
+updatecheckdialog=\u0414\u0438\u0458\u0430\u043B\u043E\u0433 \u043F\u0440\u043E\u0432\u0435\u0440\u0435 \u043D\u0430\u0434\u043E\u0433\u0440\u0430\u0434\u045A\u0435
+url_error=\u041E\u0432\u0430\u0458 \u0423\u0420\u041B \u0458\u0435 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u043D!
+url_load_error=\u041D\u0435 \u043C\u043E\u0433\u0443 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u043C\u0430\u043F\u0443 \u043D\u0430 \u0423\u0420\u041B:
+url_open_error=\u041D\u0435 \u043C\u043E\u0433\u0443 \u043E\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0423\u0420\u041B \u0432\u0435\u0437\u0443 {0}.
+used_in_menu=\u041E\u0432\u0430 \u0442\u0430\u0441\u0442\u0435\u0440\u0441\u043A\u0430 \u043F\u0440\u0435\u0447\u0438\u0446\u0430 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0430 \u0458\u0435\u0440 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043A\u0430\u043E \u043F\u0440\u0435\u0447\u0438\u0446\u0430 \u0438\u0437\u0431\u043E\u0440\u043D\u0438\u043A\u0430.
+UsePlainTextAction.text=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0458\u0435\u0434\u043D\u043E\u0441\u0442\u0430\u0432\u0430\u043D \u0442\u0435\u043A\u0441\u0442
+user_config_folder=\u041F\u043E\u0434\u0435\u0448\u0435\u043D\u0430 \u043C\u0430\u043F\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430: {0}
+user_defined_scale=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0430 \u0440\u0430\u0437\u043C\u0435\u0440\u0430
+user_defined_zoom=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E
+user_defined_zoom_status_bar=\u0418\u0437\u043C\u0435\u043D\u0430 \u043F\u043E\u0432\u0435\u045B\u0430\u045A\u0430 \u043D\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0443 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 {0}%.
+user_icon=\u041A\u043E\u0440\u0438\u0441\u043D\u0447\u0438\u043A\u0430 \u0438\u043A\u043E\u043D\u0430 "{0}"
+user_template_dir=\u041A\u043E\u0440\u0438\u0441\u043D\u0447\u0438\u043A\u0438 \u0448\u0430\u0431\u043B\u043E\u043D\u0438
+user_zoom=\u0424\u0430\u043A\u0442\u043E\u0440 \u043F\u043E\u0432\u0435\u045B\u0430\u045A\u0430 \u0448\u0442\u0430\u043C\u043F\u0430\u045A\u0430 (0.0 - 2.0):
+UseRichFormattingAction.text=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0431\u043E\u0459\u0435 \u043E\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u043D\u0438 \u0442\u0435\u043A\u0441\u0442
+value_format=\u0424\u043E\u0440\u043C\u0430\u0442 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438
+version_up_to_date=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043D\u0430\u0458\u043D\u043E\u0432\u0438\u0458\u0435 \u0438\u0437\u0434\u0430\u045A\u0435 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430
+view=&\u041F\u0440\u0438\u043A\u0430\u0437
+ViewLayoutTypeAction.OUTLINE.text=\u0428\u0435\u043C\u0430\u0442\u0441\u043A\u0438 \u043F\u0440\u0438\u043A\u0430\u0437
+WebDocuAction.text=\u0412\u0435\u0431 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0430
+width=\u0428\u0438\u0440\u0438\u043D\u0430
+wrong_regexp=\u041F\u043E\u0433\u0440\u0435\u0448\u0430\u043D \u0458\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0438\u0437\u0440\u0430\u0437 "{0}", \u0433\u0440\u0435\u0448\u043A\u0430 {1}
+xslt_export.html=HTML \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442
+xslt_export.latex=Latex \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442
+xslt_export.latexbook=Latex \u043A\u045A\u0438\u0433\u0430
xslt_export.mediawiki=Mediawiki
-xslt_export.ms_excel=Excel (2003 \u0438 \u0432\u0438\u0448\u0438) XML \u0444\u043e\u0440\u043c\u0430\u0442
-xslt_export.ms_project=MS Project (2003 \u0438 \u0432\u0438\u0448\u0438) XML \u0444\u043e\u0440\u043c\u0430\u0442
-xslt_export.ms_word=Word (2003 \u0438 \u0432\u0438\u0448\u0438) XML \u0444\u043e\u0440\u043c\u0430\u0442
-xslt_export.text=\u0408\u0435\u0434\u043d\u043e\u0441\u0442\u0430\u0432\u0430\u043d \u0442\u0435\u043a\u0441\u0442
-xslt_export_not_possible=Freeplane XSLT- \u0438\u0437\u0432\u043e\u0437 \u043d\u0438\u0458\u0435 \u043c\u043e\u0433\u0443\u045b
+xslt_export.ms_excel=Excel (2003 \u0438 \u0432\u0438\u0448\u0438) XML \u0444\u043E\u0440\u043C\u0430\u0442
+xslt_export.ms_project=MS Project (2003 \u0438 \u0432\u0438\u0448\u0438) XML \u0444\u043E\u0440\u043C\u0430\u0442
+xslt_export.ms_word=Word (2003 \u0438 \u0432\u0438\u0448\u0438) XML \u0444\u043E\u0440\u043C\u0430\u0442
+xslt_export.text=\u0408\u0435\u0434\u043D\u043E\u0441\u0442\u0430\u0432\u0430\u043D \u0442\u0435\u043A\u0441\u0442
+xslt_export_not_possible=Freeplane XSLT- \u0438\u0437\u0432\u043E\u0437 \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B
yes=\u0414\u0430
-ZoomInAction.text=\u041f\u043e\u0432\u0435\u045b\u0430\u0458
-ZoomOutAction.text=\u0423\u043c\u0430\u045a\u0438
+ZoomInAction.text=\u041F\u043E\u0432\u0435\u045B\u0430\u0458
+ZoomOutAction.text=\u0423\u043C\u0430\u045A\u0438
diff --git a/freeplane/resources/translations/Resources_sv.properties b/freeplane/resources/translations/Resources_sv.properties
index 9600934..26fde16 100644
--- a/freeplane/resources/translations/Resources_sv.properties
+++ b/freeplane/resources/translations/Resources_sv.properties
@@ -1,64 +1,68 @@
+about_text=Freeplane - Fri mjukvara f\u00F6r tankekartor och kunskapsbyggande
AboutAction.text=Om Freeplane
acceleratorPresets=Snabbtangenter
accelerators_loading_error=Can not load accelerators from {0}
-accessories/plugins/ApplyFormatPlugin.dialog.title=\u00c4ndra grenformat
-accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=\u00c4ndra m\u00f6nster
-accessories/plugins/EncryptNode.properties_0=V\u00e4lj l\u00f6senord f\u00f6r krypterad gren
-accessories/plugins/EncryptNode.properties_1=L\u00f6senordet matchar inte eller \u00e4r f\u00f6r kort.
-accessories/plugins/EncryptNode.properties_2=Skriv in l\u00f6senord:
-accessories/plugins/EncryptNode.properties_3=Skriv in l\u00f6senord igen:
-accessories/plugins/EncryptNode.properties_4=Skriv in ditt l\u00f6senord.
-accessories/plugins/EncryptNode.properties_5=<html>Sekretessniv\u00e5n<br>styrs helt och h\u00e5ller av l\u00f6senordets kvalitet.
+accessories/plugins/ApplyFormatPlugin.dialog.title=\u00C4ndra grenformat
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=\u00C4ndra m\u00F6nster
+accessories/plugins/EncryptNode.properties_0=V\u00E4lj l\u00F6senord f\u00F6r krypterad gren
+accessories/plugins/EncryptNode.properties_1=L\u00F6senordet matchar inte eller \u00E4r f\u00F6r kort.
+accessories/plugins/EncryptNode.properties_2=Skriv in l\u00F6senord:
+accessories/plugins/EncryptNode.properties_3=Skriv in l\u00F6senord igen:
+accessories/plugins/EncryptNode.properties_4=Skriv in ditt l\u00F6senord.
+accessories/plugins/EncryptNode.properties_5=<html>Sekretessniv\u00E5n<br>styrs helt och h\u00E5ller av l\u00F6senordets kvalitet.
accessories/plugins/EncryptNode.properties_6=OK
accessories/plugins/EncryptNode.properties_7=Avbryt
-accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=V\u00e4xling av krypteringsniv\u00e5 endast m?jlig p\u00e5 krypterad gren. Anv\u00e4nd verktygsmenyn f\u00f6r att infoga krypterad gren.
-accessories/plugins/EncryptNode.properties_select_me=V\u00e4lj f\u00f6r att forts\u00e4tta!
-accessories/plugins/EncryptNode.properties_wrong_password=Felaktigt l\u00f6senord.
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=V\u00E4xling av krypteringsniv\u00E5 endast m\u00F6jlig p\u00E5 krypterad gren. Anv\u00E4nd verktygsmenyn f\u00F6r att infoga krypterad gren.
+accessories/plugins/EncryptNode.properties_select_me=V\u00E4lj f\u00F6r att forts\u00E4tta!
+accessories/plugins/EncryptNode.properties_wrong_password=Felaktigt l\u00F6senord.
accessories/plugins/ExportWithTWiki.text=Som TWiki...
accessories/plugins/ExportWithTWiki.tooltip=Exportera kartan som ett TWiki-dokument.
-accessories/plugins/ExportWithXSLT.tooltip=Detta \u00e4r en enhetlig exportmetod - XSLT skript.
+accessories/plugins/ExportWithXSLT.tooltip=Detta \u00E4r en enhetlig exportmetod - XSLT skript.
accessories/plugins/ExportWithXSLT_Applet.text=Som Java Applet...
-accessories/plugins/ExportWithXSLT_Applet.tooltip=Exportera tankekartan som Java webbl\u00e4sarapplet.
+accessories/plugins/ExportWithXSLT_Applet.tooltip=Exportera tankekartan som Java webbl\u00E4sarapplet.
accessories/plugins/ExportWithXSLT_Flash.text=Som Flash...
accessories/plugins/ExportWithXSLT_Flash.tooltip=Exportera kartan som Flashapplikation.
accessories/plugins/ExportWithXSLT_HTML.text=Som XHTML (JavaScript version)...
accessories/plugins/ExportWithXSLT_HTML3.text=Som XHTML (Klickbar bildversion)...
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=Resurser fr\u00e5n RESOURCES-gren till TaskJuggler fil...
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>Exporterar resurser from RESOURCES-gren till Taskjuggler modul. </html>
-accessories/plugins/ExportWithXSLT_TASKSTJI.text=Uppgifter fr\u00e5n TASKS-gren till Taskjuggler fil...
-accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>Exporterar uppgifter fr\u00e5n TASKS-gren till Taskjuggler modul. </html>
-action_keystroke_in_use_error=Tangenttryckning {0} beg\u00e4rd f\u00f6r kommando {1} \u00e4r redan anv\u00e4nd f\u00f6r kommando {2}
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=Resurser fr\u00E5n RESOURCES-gren till TaskJuggler fil...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>Exporterar resurser from Resurs-gren till Taskjuggler modul. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text=Uppgifter fr\u00E5n TASKS-gren till Taskjuggler fil...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>Exporterar uppgifter fr\u00E5n TASKS-gren till Taskjuggler modul. </html>
+action_keystroke_in_use_error=Tangenttryckning {0} beg\u00E4rd f\u00F6r kommando {1} \u00E4r redan anv\u00E4nd f\u00F6r kommando {2}
active=Aktiv
-add=L\u00e4gg till
-AddConnectorAction.text=L\u00e4gg till f\u00f6rbindelse
-AddElementaryConditionAction.text=L\u00e4gg till
-AddLocalLinkAction.text=L\u00e4gg till lokal hyperl\u00e4nk
+actual_map_styles=Kartans villkorliga formatering till\u00E4mpad p\u00E5 noden
+actual_node_styles=Nodens villkorliga formatering till\u00E4mpad p\u00E5 noden
+add=L\u00E4gg till
+AddConnectorAction.text=L\u00E4gg till f\u00F6rbindelse
+AddElementaryConditionAction.text=L\u00E4gg till
+AddExecutionLinkAction.text=Addera hyperl\u00E4nk f\u00F6r att exekvera ett OS kommando...
+AddLocalLinkAction.text=L\u00E4gg till lokal hyperl\u00E4nk
AddMenuItemLinkAction.text=Hyperl?nk intern...
-AllMapsNodeListAction.text=S\u00f6k och Ers\u00e4tt i alla kartor
-antialias_all=J\u00e4mna ut alla
-antialias_edges=J\u00e4mna ut kanter
-antialias_none=J\u00e4mna inte ut
-apply=Verkst\u00e4ll
-ApplyAction.text=Verkst\u00e4ll
-ApplyFormatPlugin.text=\u00c4ndra format ...
-ApplyFormatPlugin.tooltip=Visar en dialogruta, d\u00e4r gren- och kant format kan \u00e4ndras.
+AllMapsNodeListAction.text=S\u00F6k och Ers\u00E4tt i alla kartor
+antialias_all=J\u00E4mna ut alla
+antialias_edges=J\u00E4mna ut kanter
+antialias_none=J\u00E4mna inte ut
+apply=Verkst\u00E4ll
+ApplyAction.text=Verkst\u00E4ll
+ApplyFormatPlugin.text=\u00C4ndra format ...
+ApplyFormatPlugin.tooltip=Visar en dialogruta, d\u00E4r gren- och kant format kan \u00E4ndras.
ApplyNoFilteringAction.text=Ingen filtrering
ApplySelectedViewConditionAction.text=Filtrera valda grenar
-ApplyToVisibleAction.text=Verkst\u00e4ll p\u00e5 filtrerade grenar
-as_parent=Som f\u00f6r\u00e4lder
-AskForHelp.text=Fr\u00e5ga om hj\u00e4lp
+ApplyToVisibleAction.text=Verkst\u00E4ll p\u00E5 filtrerade grenar
+as_parent=Som f\u00F6r\u00E4lder
+AskForHelp.text=Fr\u00E5ga om hj\u00E4lp
AssignAttributesAction.text=Ange egenskaper
-attribute_delete=Ta bort alla v\u00e4rden
-attribute_delete_value=Ta bort detta v\u00e4rde
+attribute_delete=Ta bort alla v\u00E4rden
+attribute_delete_value=Ta bort detta v\u00E4rde
attribute_font_size_tooltip=Egenskaper teckenstorlek
-attribute_list_box_label_text=Befintliga v\u00e4rden
-attribute_replace=Ers\u00e4tt med
+attribute_list_box_label_text=Befintliga v\u00E4rden
+attribute_replace=Ers\u00E4tt med
attribute_top=Alla egenskaper i inl?sta tankekartor
-attributes_adding_empty_attribute_error=En tom textstr\u00e4ng kan inte anv\u00e4ndas som egenskapsnamn
+attributes_adding_empty_attribute_error=En tom textstr\u00E4ng kan inte anv\u00E4ndas som egenskapsnamn
attributes_all=Alla egenskaper
attributes_assign_dialog=L?gg till egenskap
attributes_attribute=Egenskaper
-attributes_close=St\u00e4ng
+attributes_close=St\u00E4ng
attributes_deselect_all=Ingenting
attributes_dialog_title=Egenskapshanteraren
attributes_edit=Redigera
@@ -66,100 +70,100 @@ attributes_edit_tooltip=Redigera egenskaper
attributes_for_selected=Markerade grenar
attributes_for_visible=Synliga grenar
attributes_import=Importera
-attributes_import_tooltip=Importera egenskaper fr\u00e5n andra inl?sta tankekartor
+attributes_import_tooltip=Importera egenskaper fr\u00E5n andra inl?sta tankekartor
attributes_no_import_candidates_found=Inga nya egenskaper hittades
attributes_popup_delete=Ta bort
attributes_popup_down=Ned
attributes_popup_edit=Redigera
-attributes_popup_hide=D\u00f6lj
+attributes_popup_hide=D\u00F6lj
attributes_popup_new=Ny egenskap
attributes_popup_optimal_width=Optimal bredd
attributes_popup_up=Upp
attributes_refresh=Uppdatera
-attributes_restricted_attributes_tooltip=Begr\u00e4nsa egenskaper
-attributes_restricted_values_tooltip=Begr\u00e4nsa antal v\u00e4rden f\u00f6r aktuell egenskap
-attributes_restriction=Begr\u00e4nsade egenskaper
+attributes_restricted_attributes_tooltip=Begr\u00E4nsa egenskaper
+attributes_restricted_values_tooltip=Begr\u00E4nsa antal v\u00E4rden f\u00F6r aktuell egenskap
+attributes_restriction=Begr\u00E4nsade egenskaper
attributes_select_all=Alla
attributes_select_all_tooltip=Markera / avmarkera alla
attributes_show=Visa
-attributes_skip_root=Hoppa \u00f6ver rotgren
+attributes_skip_root=Hoppa \u00F6ver rotgren
attributes_visible=Markerad synlig
attributes_visible_tooltip=Markerad synlig
automatically_save_message=Tankekartan sparades automatiskt (med filnamnet {0}) ...
AutomaticEdgeColorHookAction.text=Kantf?rg Auto
AutomaticLayoutAction.text=Format Auto
-AutomaticLayoutAction.tooltip=<html>Ordnar layouten p\u00e5 tankekartan. <br>Den f\u00f6rsta niv\u00e5n \u00e4r svart, den andra \u00e4r bl\u00e5, etc.</html>
+AutomaticLayoutAction.tooltip=<html>Ordnar layouten p\u00E5 tankekartan. <br>Den f\u00F6rsta niv\u00E5n \u00E4r svart, den andra \u00E4r bl\u00E5, etc.</html>
BackAction.text=Backa
-BackAction.tooltip=G\u00e5r bak\u00e5t i historiken p\u00e5 valda grenar
+BackAction.tooltip=G\u00E5r bak\u00E5t i historiken p\u00E5 valda grenar
background=Bakgrund
bitmaps=Bitmap-bilder
-black=Svart
+black=Svart
BlinkingNodeHookAction.text=Blinkande gren
-BlinkingNodeHookAction.tooltip=<html>Detta g\u00f6r s\u00e5 att grenen blinkar. Var f\u00f6rsiktig.<br> Anv\u00e4nd inte i f\u00f6r m\u00e5nga grenar, och <strong> inte med andra auto format p\u00e5 samma gren</strong></html>
-blue=Bl?
+BlinkingNodeHookAction.tooltip=<html>Detta g\u00F6r s\u00E5 att grenen blinkar. Var f\u00F6rsiktig.<br> Anv\u00E4nd inte i f\u00F6r m\u00E5nga grenar, och <strong> inte med andra auto format p\u00E5 samma gren</strong></html>
+blue=Bl?
BoldAction.text=Fet
-boldify_branch=G\u00f6r fetare
-branch=F\u00f6rgrening
-browse=Bl\u00e4ddra...
+boldify_branch=G\u00F6r fetare
+branch=F\u00F6rgrening
+browse=Bl\u00E4ddra...
can_not_connect_to_info_server=Kan inte ansluta till info-servern
can_not_delete_predefined_style=Can not delete predefined style
can_not_delete_root_style=Can not delete root style
can_not_delete_style_group=Can not delete style group
-can_not_save_key_set=Kan inte spara snabbtangentsupps\u00e4ttning
+can_not_save_key_set=Kan inte spara snabbtangentsupps\u00E4ttning
cancel=Avbryt
CancelAction.text=Avbryt
-cannot_add_parent_diff_parents=Alla grenar m\u00e5ste ha samma basgren f\u00f6r att kunna anv\u00e4nda funktionen.
+cannot_add_parent_diff_parents=Alla grenar m\u00E5ste ha samma basgren f\u00F6r att kunna anv\u00E4nda funktionen.
cannot_add_parent_to_root=Endast en rotgren till?ts i kartan.
cannot_delete_root=Rotgrenen kan inte raderas eller klippas ut.
-cannot_join_nodes_with_children=Kan inte f\u00f6rbinda gren med undergren
+cannot_join_nodes_with_children=Kan inte f\u00F6rbinda gren med undergren
cannot_move_to_child=Kan inte flytta gren till egen undergren.
CenterAction.text=Centrera
CenterSelectedNodeAction.text=Centrera vald gren
ChangeConnectorArrowsAction.backward.text=Tllbaka
-ChangeConnectorArrowsAction.both.text=B\u00e5da
-ChangeConnectorArrowsAction.forward.text=Fram\u00e5t
+ChangeConnectorArrowsAction.both.text=B\u00E5da
+ChangeConnectorArrowsAction.forward.text=Fram\u00E5t
ChangeConnectorArrowsAction.none.text=Ingen
-ChangeConnectorArrowsAction.text=\u00c4ndra f\u00f6rbindelsens pilar
-ChangeNodeLevelLeftsAction.text=Gren till v\u00e4nster
-ChangeNodeLevelLeftsAction.tooltip=P\u00e5 v\u00e4nster sida om rotgrenen flyttas grenar ned\u00e5t.<br> Blir undergren till ovanliggande syskongren. P\u00e5 h\u00f6ger sida om rotgrenen flyttas gren upp\u00e5t.<br> Direkt p\u00e5 rotgrenen byter grenarna sida.
-ChangeNodeLevelRightsAction.text=Gren till h\u00f6ger
-ChangeNodeLevelRightsAction.tooltip=P\u00e5 h\u00f6ger sida om rotgrenen flyttas grenar ned\u00e5t.<br> Blir undergren till ovanliggande syskongren.<br> P\u00e5 v\u00e4nster sida om rotgrenen flyttas grenar upp\u00e5t.<br> Direkt p\u00e5 rotgrenen byter grenarna sida.
-choose_background_color=V\u00e4lj bakgrundsf\u00e4rg:
-choose_cloud_color=V\u00e4lj moln f\u00e4rg:
-choose_edge_color=V\u00e4lj kantlinje f\u00e4rg
-choose_map_background_color=V\u00e4lj kart bakgrundsf\u00e4rg
-choose_node_background_color=V\u00e4lj gren bakgrundsf\u00e4rg:
-choose_node_color=V\u00e4lj gren f\u00e4rg:
-CloseAction.text=St\u00e4ng
+ChangeConnectorArrowsAction.text=\u00C4ndra f\u00F6rbindelsens pilar
+ChangeNodeLevelLeftsAction.text=Gren till v\u00E4nster
+ChangeNodeLevelLeftsAction.tooltip=P\u00E5 v\u00E4nster sida om rotgrenen flyttas grenar ned\u00E5t.<br> Blir undergren till ovanliggande syskongren. P\u00E5 h\u00F6ger sida om rotgrenen flyttas gren upp\u00E5t.<br> Direkt p\u00E5 rotgrenen byter grenarna sida.
+ChangeNodeLevelRightsAction.text=Gren till h\u00F6ger
+ChangeNodeLevelRightsAction.tooltip=P\u00E5 h\u00F6ger sida om rotgrenen flyttas grenar ned\u00E5t.<br> Blir undergren till ovanliggande syskongren.<br> P\u00E5 v\u00E4nster sida om rotgrenen flyttas grenar upp\u00E5t.<br> Direkt p\u00E5 rotgrenen byter grenarna sida.
+choose_background_color=V\u00E4lj bakgrundsf\u00E4rg:
+choose_cloud_color=V\u00E4lj moln f\u00E4rg:
+choose_edge_color=V\u00E4lj kantlinje f\u00E4rg
+choose_map_background_color=V\u00E4lj kart bakgrundsf\u00E4rg
+choose_node_background_color=V\u00E4lj gren bakgrundsf\u00E4rg:
+choose_node_color=V\u00E4lj gren f\u00E4rg:
+CloseAction.text=St\u00E4ng
CloudAction.text=Moln
-CloudColorAction.text=Moln f\u00e4rg
+CloudColorAction.text=Moln f\u00E4rg
CloudShapeAction.ARC.text=Rundad
CloudShapeAction.RECT.text=Rektangel
CloudShapeAction.ROUND_RECT.text=Rundad Rektangel
CloudShapeAction.STAR.text=Taggig
-ColorProperty.ResetColor=\u00c5ngra f\u00e4rg
+ColorProperty.ResetColor=\u00C5ngra f\u00E4rg
combined=Kombinerad
condition=Villkor
-confirmation=Bekr\u00e4ftelse
-connector=F\u00f6rbindelse
-connector_label=Etikett p\u00e5 f\u00f6rbindelse
-ConnectorColorAction.text=F\u00e4rg p\u00e5 f\u00f6rbindelse...
+confirmation=Bekr\u00E4ftelse
+connector=F\u00F6rbindelse
+connector_label=Etikett p\u00E5 f\u00F6rbindelse
+ConnectorColorAction.text=F\u00E4rg p\u00E5 f\u00F6rbindelse...
CopyAction.text=Kopiera
CopyIDAction.text=Kopiera gren-ID
-CopyMapStylesAction.text=Kopiera kartstil fr\u00e5n...
+CopyMapStylesAction.text=Kopiera kartstil fr\u00E5n...
CopySingleAction.text=Kopiera enskild
-corrupt_map=Inneh\u00e5llet i kartan \u00e4r korrupt
+corrupt_map=Inneh\u00E5llet i kartan \u00E4r korrupt
CreateConjunctConditionAction.text=Och
CreateDisjunctConditionAction.text=Eller
CreateNotSatisfiedConditionAction.text=Ej
-CreationModificationPluginAction.text=Visa f\u00f6r\u00e4ndrings tidpunkt
-CreationModificationPluginAction.tooltip=<html>Denna funktionen h\u00e5ller reda p\u00e5 n\u00e4r grenen skapades och f\u00f6r\u00e4ndrades.</html>
+CreationModificationPluginAction.text=Visa f\u00F6r\u00E4ndrings tidpunkt
+CreationModificationPluginAction.tooltip=<html>Denna funktionen h\u00E5ller reda p\u00E5 n\u00E4r grenen skapades och f\u00F6r\u00E4ndrades.</html>
current_dir=Kartor
CutAction.text=Klipp ut
decrease_branch_font_size=Minska teckensnitt
DecreaseNodeFontAction.text=Minska teckensnitt
default=Standard
-DefaultColorAction.text=Standard f?rg
+DefaultColorAction.text=Standard f?rg
delete=Ta bort
delete_child=Ta bort gren
DeleteAction.text=Ta bort gren
@@ -172,27 +176,27 @@ DirectHtmlFlavorHandler=HTML som en enda gren
DocumentationAction.text=Dokumentation
down=Ner
download=H?mta
-dropped_file_error=Kan inte \u00f6ppna filen. Anledning: {0}
+dropped_file_error=Kan inte \u00F6ppna filen. Anledning: {0}
edge=Kantlinje
-edge_is_formatted_by_style=Kantformat kontrolleras fr?n mall. Redigera mallen f?r att ?ndra.
+edge_is_formatted_by_style=Kantformat kontrolleras fr?n mall. Redigera mallen f?r att ?ndra.
edge_style=Kantlinjens format
edge_width=Kantlinjens bredd
-EdgeColorAction.text=F\u00e4rg p\u00e5 kantlinje...
+EdgeColorAction.text=F\u00E4rg p\u00E5 kantlinje...
EdgeStyleAction.bezier.text=Bezier
-EdgeStyleAction.hide_edge.text=D\u00f6lj kanten
+EdgeStyleAction.hide_edge.text=D\u00F6lj kanten
EdgeStyleAction.horizontal.text=Horisontell
-EdgeStyleAction.linear.text=Linj\u00e4r
+EdgeStyleAction.linear.text=Linj\u00E4r
EdgeStyleAction.sharp_bezier.text=Skarp Bezier
-EdgeStyleAction.sharp_linear.text=Skarp Linj\u00e4r
-EdgeStyleAsParentAction.text=F\u00f6r\u00e4lder
-EdgeWidthAction_width_parent.text=F\u00f6r\u00e4lder
+EdgeStyleAction.sharp_linear.text=Skarp Linj\u00E4r
+EdgeStyleAsParentAction.text=F\u00F6r\u00E4lder
+EdgeWidthAction_width_parent.text=F\u00F6r\u00E4lder
EdgeWidthAction_width_thin.text=Tunn
edit=Redigera
edit.decision=HTML-redigerare
-edit.edit_rich_text=Anv\u00e4nd fetstil,kursiv format?
+edit.edit_rich_text=Anv\u00E4nd fetstil,kursiv format?
edit_details=Redigera grenens extrainformation
-edit_link_manually=Redigera hyperl\u00e4nk manuellt...
-edit_long_node=Redigera gren ut\u00f6kat textformat
+edit_link_manually=Redigera hyperl\u00E4nk manuellt...
+edit_long_node=Redigera gren ut\u00F6kat textformat
edit_middle_label=Etikett
edit_source_label=Etikett vid starten
edit_target_label=Etikett vid slutet
@@ -200,31 +204,31 @@ EditAction.text=Redigera gren
EditAttributesAction.text=Redigera egenskaper
EditDetailsAction.text=Redigera grenens extrainformation
EditFilterAction.text=Redigera
-EditLongAction.text=Redigera gren ut\u00f6kat textformat
+EditLongAction.text=Redigera gren ut\u00F6kat textformat
EditStylesAction.text=Redigera mall
EncryptedMap.text=Ny krypterad tankekarta...
EncryptedMap.tooltip=Skapa en ny krypterad tankekarta
-enter_base_url=Jag kommer att klistra in relativa l\u00e4nkar. Skriv in bas-URL.
-enter_confirms=Enter bekr\u00e4ftar
-enter_keyset_name=Ange ett namn f\u00f6r snabbtangentsupps\u00e4ttningen
+enter_base_url=Jag kommer att klistra in relativa l\u00E4nkar. Skriv in bas-URL.
+enter_confirms=Enter bekr\u00E4ftar
+enter_keyset_name=Ange ett namn f\u00F6r snabbtangentsupps\u00E4ttningen
enter_new_style_name=Ange nytt mall namn
-EnterPassword.text=V\u00e4xla mellan krypterad/okrypterad
+EnterPassword.text=V\u00E4xla mellan krypterad/okrypterad
error=Fel
-error_applying_template=Fel vid anv\u00e4ndning av XSL mall.
-error_creating_directory=Kan inte skapa mapp f\u00f6r export.
-ExecuteScriptError.text=Fel vid skriptk\u00f6rningen.\nSe loggfilen f\u00f6r detaljer.
-ExecuteScriptForAllNodes.text=K\u00f6r alla skript
-ExecuteScriptForSelectionAction.text=K\u00f6r valda grenars skript
-ExecuteScriptOnSelectedNode.text=K\u00f6r {0} p\u00e5 alla valda grenar
-ExecuteScriptOnSelectedNodeRecursively.text=K\u00f6r rekursivt {0} p\u00e5 valda grenar
-ExecuteScriptOnSingleNode.text=K\u00f6r {0}\u00a0p\u00e5 vald gren
+error_applying_template=Fel vid anv\u00E4ndning av XSL mall.
+error_creating_directory=Kan inte skapa mapp f\u00F6r export.
+ExecuteScriptError.text=Fel vid skriptk\u00F6rningen.\nSe loggfilen f\u00F6r detaljer.
+ExecuteScriptForAllNodes.text=K\u00F6r alla skript
+ExecuteScriptForSelectionAction.text=K\u00F6r valda grenars skript
+ExecuteScriptOnSelectedNode.text=K\u00F6r {0} p\u00E5 alla valda grenar
+ExecuteScriptOnSelectedNodeRecursively.text=K\u00F6r rekursivt {0} p\u00E5 valda grenar
+ExecuteScriptOnSingleNode.text=K\u00F6r {0}\u00A0p\u00E5 vald gren
ExecuteScripts.noScriptsAvailable=Inga
ExecuteScripts.text=Skript
export_failed=Exporten misslyckades
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
export_using_xslt=Exportera med XSLT
-ExportAction.text=&Exportera
+ExportAction.text=Exportera
ExportBranchAction.text=Gren som ny karta...
ExportBranchToHTMLAction.text=Gren som HTML
exported_file={0} fil
@@ -235,122 +239,126 @@ ExportToImage.jpg.text=Som JPEG...
ExportToImage.png.text=Som PNG...
ExportToOoWriter.text=Som Open Office Writer dokument...
extension_menu=Mallar
-ExtractLinkFromTextAction.text=Ny hyperl\u00e4nk fr\u00e5n grentext
-ExtractLinkFromTextAction.tooltip=Skapar en l\u00e4nk om text liknande hyperl\u00e4nk finns i grentexten
+ExtractLinkFromTextAction.text=Ny hyperl\u00E4nk fr\u00E5n grentext
+ExtractLinkFromTextAction.tooltip=Skapar en l\u00E4nk om text liknande hyperl\u00E4nk finns i grentexten
+extras=Verk&tyg
f_button_unassigned=<inget>
FaqOpenURLAction.text=FAQ
file=Arkiv
-file_already_exists=Filen {0} finns redan. Skriv \u00f6ver filen?
+file_already_exists=Filen {0} finns redan. Skriv \u00F6ver filen?
file_not_found=Filen {0} hittades inte
-FileListFlavorHandler=L\u00e4nkar till filer
-filter=Filtrera
-filter_add=L\u00e4gg till
+FileListFlavorHandler=L\u00E4nkar till filer
+filter=F&ilter
+filter_add=L\u00E4gg till
filter_and=Och
filter_conditions=Filter
-filter_contains=Inneh\u00e5ller
+filter_contains=Inneh\u00E5ller
filter_created_after=Skapad efter
-filter_created_before=Skapad f\u00f6re
+filter_created_before=Skapad f\u00F6re
filter_delete=Ta bort
filter_details=Visa grenens extrainformation
filter_dialog=Kombinera filter
filter_does_not_exist=Saknas
filter_edit_description=Redigera filterlista
-filter_enter_value=Fyll i v\u00e4rde
-filter_even_level=Udda gren niv\u00e5er
+filter_enter_value=Fyll i v\u00E4rde
+filter_even_level=Udda gren niv\u00E5er
filter_exist=Finns
filter_icon=Ikon
-filter_is_equal_to=\u00c4r lika med
-filter_is_not_equal_to=\u00c4r inte lika med
-filter_leaf=Grenl\u00f6v
-filter_link=Hyperl\u00e4nk
+filter_is_equal_to=\u00C4r lika med
+filter_is_not_equal_to=\u00C4r inte lika med
+filter_leaf=Grenl\u00F6v
+filter_link=Hyperl\u00E4nk
filter_match_case=Skilj p? versaler/gemena
-filter_modified_after=\u00c4ndrad efter
-filter_modified_before=\u00c4ndrad innan
+filter_modified_after=\u00C4ndrad efter
+filter_modified_before=\u00C4ndrad innan
filter_no_filtering=Ingen filtrering
filter_node=Grentext
-filter_node_level=Gren niv\u00e5
+filter_node_level=Gren niv\u00E5
filter_not=I&nte
filter_note=Anteckning
-filter_odd_level=J\u00e4mna gren niv\u00e5er
+filter_odd_level=J\u00E4mna gren niv\u00E5er
filter_or=Eller
-filter_parent=F\u00f6r\u00e4ldratext
+filter_parent=F\u00F6r\u00E4ldratext
filter_periodic_level=Periodisk
filter_priority=Prioritet
-filter_regexp_matches=Matchar regulj\u00e4rt uttryck (regexp)
+filter_regexp_matches=Matchar regulj\u00E4rt uttryck (regexp)
filter_root=Rotgren
filter_select=Markera
filter_selected_node_view=Markerade grenar
filter_selected_node_view_snapshot=Sparad markering
filter_style=Utseende
filter_time=Datum
-filters_not_loaded=Filter kan inte \u00f6ppnas, filen \u00e4r felaktig
-find_what=S\u00f6k efter
-FindAction.text=S\u00f6k...
-fit_map_to_page=Passa in p\u00e5 en sida
-fit_map_to_page_height=Anpassa h\u00f6jden till en sida
+filters_not_loaded=Filter kan inte \u00F6ppnas, filen \u00E4r felaktig
+find_what=S\u00F6k efter
+FindAction.text=S\u00F6k...
+FindNextAction.text=N?sta
+FindPreviousAction.text=F?reg?ende
+fit_map_to_page=Passa in p\u00E5 en sida
+fit_map_to_page_height=Anpassa h\u00F6jden till en sida
fit_map_to_page_width=Anpassa bredden till en sida
-FitToPage.text=Zooma f\u00f6r passa in i aktuell sida
-FitToPage.tooltip=Justerar zoomningen till att passa in i aktuellt f\u00f6nster.
-fold=D\u00f6lj grenar
-FoldAllAction.text=D\u00f6lj alla
-FoldAllAction.tooltip=<html>D\u00f6lj markerade grenar och alla undergrenar.</html>
-FoldOneLevelAction.text=D\u00f6lj en niv\u00e5
-FoldOneLevelAction.tooltip=<html>D\u00f6lj markerade grenar en niv\u00e5.</html>
-follow_graphical_link=G\u00e5 till:
-FollowLinkAction.text=\u00d6ppna hyperl\u00e4nk:
+FitToPage.text=Zooma f\u00F6r passa in i aktuell sida
+FitToPage.tooltip=Justerar zoomningen till att passa in i aktuellt f\u00F6nster.
+fold=D\u00F6lj grenar
+FoldAllAction.text=D\u00F6lj alla
+FoldAllAction.tooltip=<html>D\u00F6lj markerade grenar och alla undergrenar.</html>
+FoldOneLevelAction.text=D\u00F6lj en niv\u00E5
+FoldOneLevelAction.tooltip=<html>D\u00F6lj markerade grenar en niv\u00E5.</html>
+follow_graphical_link=G\u00E5 till:
+FollowLinkAction.text=\u00D6ppna hyperl\u00E4nk:
font=Teckensnitt
FontFamilyAction.text=Teckensnitt
FontSizeAction.text=Teckenstorlek
-format_menu_cloud_shapes=Moln
+format=Format
+format_menu_cloud_shapes=Moln
format_menu_edge_styles=Kantstil
format_menu_edge_widths=Kantbredd
FormatCopy.text=Kopiera format
FormatCopy.tooltip=<html>Kopierar grenens format.</html>
FormatPaste.text=Klistra in format
FormatPaste.tooltip=<html>Klistrar in grenens format.</html>
-formula.error.attributeValueIsNull=Egenskapsv\u00e4rde ''{0}'' \u00e4r tomt efter utv\u00e4rdering.
+formula.error.attributeValueIsNull=Egenskapsv\u00E4rde ''{0}'' \u00E4r tomt efter utv\u00E4rdering.
formula.error.circularReference=Circular reference: The formula in node ''{0}'' references itself.
-formula.EvaluateAllAction.text=Utv\u00e4rdera alla
-formula.EvaluateAllAction.tooltip=Utv\u00e4rdera all formler i kartan
+formula.EvaluateAllAction.text=Utv\u00E4rdera alla
+formula.EvaluateAllAction.tooltip=Utv\u00E4rdera all formler i kartan
formula.menuname=Formler
formula_editor=Redigera formel
-ForwardAction.text=Fram\u00e5t
-ForwardAction.tooltip=Hoppar fram\u00e5t i markeringshistoriken
-Freeplane.progress.buildScreen=L?ser in sk\u00e4rmbild...
-Freeplane.progress.createController=Ny kontroll\u00f6r...
-Freeplane.progress.createInitialMode=Ny anv\u00e4ndars\u00e4tt...
+ForwardAction.text=Fram\u00E5t
+ForwardAction.tooltip=Hoppar fram\u00E5t i markeringshistoriken
+Freeplane.progress.buildScreen=L?ser in sk\u00E4rmbild...
+Freeplane.progress.createController=Ny kontroll\u00F6r...
+Freeplane.progress.createInitialMode=Ny anv\u00E4ndars\u00E4tt...
Freeplane.progress.endStartup=Avslutar uppstart.
-Freeplane.progress.gettingPreferenceDirectories=H\u00e4mtar katalog f\u00f6r inst\u00e4llningar...
-Freeplane.progress.gettingPreferences=L?s inst\u00e4llningar...
+Freeplane.progress.gettingPreferenceDirectories=H\u00E4mtar katalog f\u00F6r inst\u00E4llningar...
+Freeplane.progress.gettingPreferences=L?s inst\u00E4llningar...
Freeplane.progress.loadMaps=L?s in kartor...
-Freeplane.progress.propagateLookAndFeel=Nytt gr\u00e4nssnitt...
-Freeplane.progress.settingPreferences=Nya inst\u00e4llningar...
-Freeplane.progress.startCreateController=Starta kontroll\u00f6r...
-Freeplane.progress.updateLookAndFeel=Uppdatera gr\u00e4nssnitt
+Freeplane.progress.propagateLookAndFeel=Nytt gr\u00E4nssnitt...
+Freeplane.progress.settingPreferences=Nya inst\u00E4llningar...
+Freeplane.progress.startCreateController=Starta kontroll\u00F6r...
+Freeplane.progress.updateLookAndFeel=Uppdatera gr\u00E4nssnitt
freeplane_reverted=Freeplane_Reverted_
-FreeplaneHelpStarter.text=Hj\u00e4lp...
-FreeplaneHelpStarter.tooltip=Freeplane ut\u00f6kad hj\u00e4lp
-GotoLinkNodeAction.text=G\u00e5 till l\u00e4nk
+FreeplaneHelpStarter.text=Hj\u00E4lp...
+FreeplaneHelpStarter.tooltip=Freeplane ut\u00F6kad hj\u00E4lp
+GotoLinkNodeAction.text=G\u00E5 till l\u00E4nk
GrabKeyDialog.common.cancel=Avbryt
GrabKeyDialog.common.ok=OK
-GrabKeyDialog.grab-key.assigned-to=Anv\u00e4nd till
-GrabKeyDialog.grab-key.assigned-to.none=F\u00f6rn\u00e4rvarande inte anv\u00e4nd
+GrabKeyDialog.grab-key.assigned-to=Anv\u00E4nd till
+GrabKeyDialog.grab-key.assigned-to.none=F\u00F6rn\u00E4rvarande inte anv\u00E4nd
GrabKeyDialog.grab-key.clear=Ta bort
GrabKeyDialog.grab-key.remove=Ta bort
GrabKeyDialog.grab-key.remove-ask=OK, ta bort tangentkombination?
GrabKeyDialog.grab-key.title=Mata in ny tangent
-green=Gr?n
-help=Hj\u00e4lp
-HideableAction.tooltip=<html>Markerar bakgrunden f\u00f6r varje modifierad gren </html>
-HideAllAttributesAction.text=D\u00f6lj alla egenskaper
+green=Gr?n
+help=Hj\u00E4lp
+HideableAction.tooltip=<html>Markerar bakgrunden f\u00F6r varje modifierad gren </html>
+HideAllAttributesAction.text=D\u00F6lj alla egenskaper
HierarchicalIconsAction.text=Visa ikonerna rangordnade
HierarchicalIconsAction.tooltip=Om en av grenarna har en ikon, visas ikonen i mindre format.
hot_keys=Snabbtangenter
hot_keys_table=Snabbtangentstabell
HotKeyInfoAction.text=Snabbtangenter
-html_export_based_on_headings=HTML Export - Baserad p\u00e5 Rubriker
-html_export_fold_all=HTML Export - D\u00f6lj alla
-html_export_fold_currently_folded=HTML Export - D\u00f6lj nuvarande dolda f\u00f6rgreningar
+html_export_based_on_headings=HTML Export - Baserad p\u00E5 Rubriker
+html_export_fold_all=HTML Export - D\u00F6lj alla
+html_export_fold_currently_folded=HTML Export - D\u00F6lj nuvarande dolda f\u00F6rgreningar
html_export_no_folding=HTML Export - Visa alla
icon_0%=0%
icon_100%=100%
@@ -360,21 +368,21 @@ icon_75%=75%
icon_attach=Bilaga
icon_back=Tillbaka
icon_bee=Freeplane
-icon_bell=Kom ih\u00e5g
-icon_bookmark=Utm\u00e4rkt
+icon_bell=Kom ih\u00E5g
+icon_bookmark=Utm\u00E4rkt
icon_broken-line=Trasig
icon_button_cancel=Avbryt
icon_button_ok=OK
icon_calendar=Datum
icon_clanbomber=Varning
icon_clock=Tid
-icon_clock2=P\u00e5minn
+icon_clock2=P\u00E5minn
icon_closed=St?ngd
-icon_decrypted=Uppl\u00e5st
+icon_decrypted=Uppl\u00E5st
icon_desktop_new=Kom ih?g
icon_down=Ned
icon_edit=Redigera
-icon_encrypted=L\u00e5st
+icon_encrypted=L\u00E5st
icon_family=Familj
icon_fema=Par
icon_female1=Kvinna1
@@ -382,13 +390,13 @@ icon_female2=Kvinna2
icon_females=Kvinnor
icon_flag=Flagga
icon_flag-black=Svart flagga
-icon_flag-blue=Bl\u00e5 flagga
-icon_flag-green=Gr\u00f6n flagga
+icon_flag-blue=Bl\u00E5 flagga
+icon_flag-green=Gr\u00F6n flagga
icon_flag-orange=Orange flagga
icon_flag-pink=Rosa flagga
icon_flag-yellow=Gul flagga
icon_folder=Katalog
-icon_forward=Fram\u00e5t
+icon_forward=Fram\u00E5t
icon_freemind_butterfly=FreeMind
icon_full-0=Prioritet 0
icon_full-1=Prioritet 1
@@ -400,18 +408,18 @@ icon_full-6=Prioritet 6
icon_full-7=Prioritet 7
icon_full-8=Prioritet 8
icon_full-9=Prioritet 9
-icon_go=Gr\u00f6nt ljus
+icon_go=Gr\u00F6nt ljus
icon_gohome=Hem
icon_group=Grupp
-icon_help=Fr\u00e5ga
-icon_hourglass=V\u00e4nta
+icon_help=Fr\u00E5ga
+icon_hourglass=V\u00E4nta
icon_icon_not_found=Ikon sakans
-icon_idea=Id\u00e9
+icon_idea=Id\u00E9
icon_info=Info
icon_kaddressbook=Telefon
icon_kmail=E-post
icon_knotify=Musik
-icon_korn=Brevl\u00e5da
+icon_korn=Brevl\u00E5da
icon_ksmiletris=Glad
icon_launch=Lyft
icon_licq=Bra
@@ -419,19 +427,19 @@ icon_list=Lista
icon_Mail=Post
icon_male1=Man1
icon_male2=Man2
-icon_males=M\u00e4n
+icon_males=M\u00E4n
icon_menu=Ikoner
icon_messagebox_warning=?tg?rda
icon_negative=Negativ
icon_neutral=Neutral
-icon_password=L\u00f6senord
-icon_pencil=F\u00f6rb\u00e4ttra
+icon_password=L\u00F6senord
+icon_pencil=F\u00F6rb\u00E4ttra
icon_penguin=Linux
icon_positive=Positiv
icon_prepare=Gult ljus
icon_smiley-angry=Arg
icon_smiley-neutral=Neutral
-icon_smiley-oh=\u00d6verraskad
+icon_smiley-oh=\u00D6verraskad
icon_smily_bad=Ledsen
icon_stop=Stopp
icon_stop-sign=Stopp
@@ -450,170 +458,164 @@ IconGroupPopupAction.nature.text=Natur
IconGroupPopupAction.numbers.text=Siffror
IconGroupPopupAction.office.text=Kontor
IconGroupPopupAction.people.text=Personer
-IconGroupPopupAction.rating.text=Omd\u00f6me
+IconGroupPopupAction.rating.text=Omd\u00F6me
IconGroupPopupAction.signs.text=Symboler
IconGroupPopupAction.smiley.text=Smileys
IconGroupPopupAction.time.text=Tid
IconGroupPopupAction.user.text=Egna ikoner
-IconSelectionPlugin.text=V\u00e4lj ikon...
-IconSelectionPlugin.tooltip=<html>V\u00e4lj ikon genom att anv\u00e4nda ett nytt f\u00f6nster.</html>
-import=Importera
-import_linked_branch_no_link=Den valda grenen har ingen l\u00e4nk att importera fr\u00e5n.
+IconSelectionPlugin.text=V\u00E4lj ikon...
+IconSelectionPlugin.tooltip=<html>V\u00E4lj ikon genom att anv\u00E4nda ett nytt f\u00F6nster.</html>
+import=I&mportera
+import_linked_branch_no_link=Den valda grenen har ingen l\u00E4nk att importera fr\u00E5n.
ImportAction.text=Importera
-ImportBranchAction.text=F\u00f6rgrening...
+ImportBranchAction.text=F\u00F6rgrening...
ImportExplorerFavoritesAction.text=Explorer favoriter...
ImportFolderStructureAction.text=Mappstruktur...
-ImportLinkedBranchAction.text=L\u00e4nkad f\u00f6rgrening
-ImportLinkedBranchWithoutRootAction.text=(L\u00e4nkad f\u00f6rgrening) utan centrum...
+ImportLinkedBranchAction.text=L\u00E4nkad f\u00F6rgrening
+ImportLinkedBranchWithoutRootAction.text=(L\u00E4nkad f\u00F6rgrening) utan centrum...
ImportMindmanagerFiles.text=MindManager X5 tankekarta...
-increase_branch_font_size=\u00d6ka teckensnitt
-IncreaseNodeFontAction.text=\u00d6ka teckensnitt
+increase_branch_font_size=\u00D6ka teckensnitt
+IncreaseNodeFontAction.text=\u00D6ka teckensnitt
invalid_uri=Ogiltig URI: {0}
invalid_url=Kan inte skapa giltig URL
-invalid_url_msg=Kan inte skapa giltig URL f\u00f6r {0}
+invalid_url_msg=Kan inte skapa giltig URL f\u00F6r {0}
ItalicAction.text=Kursiv
italicise_branch=Kursiv
java_version=Java-version: {0}
-JoinNodesAction.text=Ny grenf?rbindelse
-less_than_two_selected_nodes=Markera minst tv\u00e5 grenar f\u00f6r att skapa f?rbindelse/l?nk.
+less_than_two_selected_nodes=Markera minst tv\u00E5 grenar f\u00F6r att skapa f?rbindelse/l?nk.
license=Licens
-link_error=L\u00e4nken "{0}" \u00e4r inkorrekt och l?stes inte in
-link_not_available_any_more=L\u00e4nken ogiltig. Gren borttagen.
-link_not_found=L\u00e4nk {0} saknas.
+link_error=L\u00E4nken "{0}" \u00E4r inkorrekt och l?stes inte in
+link_not_available_any_more=L\u00E4nken ogiltig. Gren borttagen.
+link_not_found=L\u00E4nk {0} saknas.
load=?ppna
LoadAcceleratorPresetsAction.textPatterns.text=Text mallar
-locking_failed_by_open=L\u00e5sningen av tankekartan {0} misslyckades. \u00d6ppnas enbart med l\u00e4sr\u00e4ttighet.
-locking_failed_by_save_as=L\u00e5sningen av kartan {0} misslyckades. "Spara som" avbr\u00f6ts.
-locking_old_lock_removed=Tankekartan {0} \u00e4r l\u00e5st av anv\u00e4ndaren {1}.\n L\u00e5set har tagits bort, pga att det \u00e4r f\u00f6r gammalt..
-long_node_changed_cancel=Grenen f\u00f6r\u00e4ndrad. Ta bort \u00e4ndringen?
-long_node_changed_submit=Grenen f\u00f6r\u00e4ndrad. Spara f\u00f6r\u00e4ndringen?
-lots_of_links_warning=Flera l?nkar till samma gren. Skapa alla l\u00e4nkarna?
+locking_failed_by_open=L\u00E5sningen av tankekartan {0} misslyckades. \u00D6ppnas enbart med l\u00E4sr\u00E4ttighet.
+locking_failed_by_save_as=L\u00E5sningen av kartan {0} misslyckades. "Spara som" avbr\u00F6ts.
+locking_old_lock_removed=Tankekartan {0} \u00E4r l\u00E5st av anv\u00E4ndaren {1}.\n L\u00E5set har tagits bort, pga att det \u00E4r f\u00F6r gammalt..
+long_node_changed_cancel=Grenen f\u00F6r\u00E4ndrad. Ta bort \u00E4ndringen?
+long_node_changed_submit=Grenen f\u00F6r\u00E4ndrad. Spara f\u00F6r\u00E4ndringen?
+lots_of_links_warning=Flera l?nkar till samma gren. Skapa alla l\u00E4nkarna?
main_resource_directory=Katalog: {0}
-MainView.errorUpdateText=Fel vid uppdatering av texten f\u00f6r f\u00f6ljande indata: {0}.\nFelet var: {1}
+MainView.errorUpdateText=Fel vid uppdatering av texten f\u00F6r f\u00F6ljande indata: {0}.\nFelet var: {1}
ManageConditionalStylesAction.text=Villkorsstyrd mall
-map_already_exists=Tankekarta finns redan. Ers\u00e4tt tankekarta?
+map_already_exists=Tankekarta finns redan. Ers\u00E4tt tankekarta?
map_corrupted=Tankekartan felaktig. Visa info?
-map_locked_by_open=Tankekartan {0} redigeras av anv\u00e4ndaren {1}. \u00d6ppnas enbart med l\u00e4sr\u00e4ttigheter.
-map_locked_by_save_as=Tankekartan {0} redigeras av anv\u00e4ndaren {1}. Spara som... ignoreras.
-map_not_saved=Tankekartan sparades inte f\u00f6rut.
+map_locked_by_open=Tankekartan {0} redigeras av anv\u00E4ndaren {1}. \u00D6ppnas enbart med l\u00E4sr\u00E4ttigheter.
+map_locked_by_save_as=Tankekartan {0} redigeras av anv\u00E4ndaren {1}. Spara som... ignoreras.
+map_not_saved=Tankekartan sparades inte f\u00F6rut.
MapBackgroundColorAction.text=Bakgrund
-MaxNodeWidthAction.text=S\u00e4tt maximal grenbredd
+MaxNodeWidthAction.text=S\u00E4tt maximal grenbredd
menu_attributes=Egenskaper
-menu_extras=Verk&tyg
-menu_file_import=I&mportera
-menu_filter=F&ilter
-menu_format=Format
menu_insert=Infoga
-menu_navigate=Navigera
-menu_view=Visa
mindmap=Tankekarta
MindMapNodesFlavorHandler=Grenhierarki
mindmaps=Tankekartor
mindmaps_desc=Tankekartor (*.mm)
mindmaps_filter_desc=Filter (*.mmfilter)
-mode_Browse=Bl\u00e4ddringsl\u00e4ge
-mode_File=Fill\u00e4ge
-mode_MindMap=Kartl\u00e4ge
-mode_na=Arbetss\u00e4ttet inte tillg\u00e4ngligt
-mode_status=Arbetss\u00e4ttet \u00e4ndrat till {0} arbetss\u00e4tt
-mode_title=Freeplane - {0} arbetss\u00e4tt
-modes=Arbetss\u00e4tt
-ModesMenuAction.Browse.text=Kartbl\u00e4ddrare
-ModesMenuAction.File.text=Filbl\u00e4ddrare
-ModesMenuAction.MindMap.text=Redigeringsl\u00e4ge
-most_recent_files=Senast anv\u00e4nda filer
+mode_Browse=Bl\u00E4ddringsl\u00E4ge
+mode_File=Fill\u00E4ge
+mode_MindMap=Kartl\u00E4ge
+mode_na=Arbetss\u00E4ttet inte tillg\u00E4ngligt
+mode_status=Arbetss\u00E4ttet \u00E4ndrat till {0} arbetss\u00E4tt
+mode_title=Freeplane - {0} arbetss\u00E4tt
+modes=Arbetss\u00E4tt
+ModesMenuAction.Browse.text=Kartbl\u00E4ddrare
+ModesMenuAction.File.text=Filbl\u00E4ddrare
+ModesMenuAction.MindMap.text=Redigeringsl\u00E4ge
+most_recent_files=Senast anv\u00E4nda filer
MoveToRootAction.text=Hoppa till rotgren
-NavigationNextMapAction.text=N\u00e4sta karta
-NavigationPreviousMapAction.text=F\u00f6reg\u00e5ende tankekarta
+navigate=Navigera
+NavigationNextMapAction.text=N\u00E4sta karta
+NavigationPreviousMapAction.text=F\u00F6reg\u00E5ende tankekarta
new=&Ny
new_map_from_user_templates.text=?ppna mall ...
new_mindmap=Ny tankekarta
new_node=Ny gren
-new_node_as_sibling_not_possible_for_the_root=Ny syskongren inte m\u00f6jlig fr?n rotgren,
-new_version_available=Ny version ''{0}'' tillg\u00e4nglig
+new_node_as_sibling_not_possible_for_the_root=Ny syskongren inte m\u00F6jlig fr?n rotgren,
+new_version_available=Ny version ''{0}'' tillg\u00E4nglig
NewChildAction.text=Ny undergren
-NewerFileRevisionsFoundDialog.cancel=Hoppa \u00f6ver
-NewerFileRevisionsFoundDialog.cancel.tooltip=\u00c6ppna inte denna fil
+NewerFileRevisionsFoundDialog.cancel=Hoppa \u00F6ver
+NewerFileRevisionsFoundDialog.cancel.tooltip=\u00C6ppna inte denna fil
NewerFileRevisionsFoundDialog.file_last_modified=Tid
NewerFileRevisionsFoundDialog.file_name=Fil
NewerFileRevisionsFoundDialog.file_size=Bytes
-NewerFileRevisionsFoundDialog.open=\u00c6ppna
-NewerFileRevisionsFoundDialog.open.tooltip=\u00c6ppna filen \u00e4ven om den \u00e4r inaktuell
+NewerFileRevisionsFoundDialog.open=\u00C6ppna
+NewerFileRevisionsFoundDialog.open.tooltip=\u00C6ppna filen \u00E4ven om den \u00E4r inaktuell
NewerFileRevisionsFoundDialog.question=Found newer revisions of {0}!\nDo you want to open {0} (see first row) nevertheless?\nTo replace {0} by an auto save file from the list\nselect it and click on ''Restore''.
-NewerFileRevisionsFoundDialog.restore=\u00c5terst\u00e4ll
+NewerFileRevisionsFoundDialog.restore=\u00C5terst\u00E4ll
NewerFileRevisionsFoundDialog.restore.tooltip=Ersatt {0} av {1}
NewerFileRevisionsFoundDialog.title=Nyare fil finns!
-NewLevelStyleAction.text=L\u00e4gg till automatiskt niv\u00e5mall
+NewLevelStyleAction.text=L\u00E4gg till automatiskt niv\u00E5mall
NewMapAction.text=Ny
NewMapViewAction.text=Ny kartvy
-NewParentNode.text=Ny F\u00f6r\u00e4ldragren
+NewParentNode.text=Ny F\u00F6r\u00E4ldragren
NewParentNode.tooltip=<html>Markerad gren med alla undergrenar kopplas till nya grundgren.</html>
-NewPreviousSiblingAction.text=Ny syskongren ovanf\u00f6r
+NewPreviousSiblingAction.text=Ny syskongren ovanf\u00F6r
NewSiblingAction.text=Ny syskongren
NewUserStyleAction.text=Ny mall fr?n markerad
-NextNodeAction.BACK.text=F\u00f6reg\u00e5ende gren
-NextNodeAction.BACK_N_FOLD.text=F\u00f6reg\u00e5ende gren (d\u00f6lj)
-NextNodeAction.FORWARD.text=N\u00e4sta gren
-NextNodeAction.FORWARD_N_FOLD.text=N\u00e4sta gren (d\u00f6lj)
+NextNodeAction.BACK.text=F\u00F6reg\u00E5ende gren
+NextNodeAction.BACK_N_FOLD.text=F\u00F6reg\u00E5ende gren (d\u00F6lj)
+NextNodeAction.FORWARD.text=N\u00E4sta gren
+NextNodeAction.FORWARD_N_FOLD.text=N\u00E4sta gren (d\u00F6lj)
no=Nej
no_format_copy_before_format_paste=Inget format kopierat f?r inklistring.
-no_found_from=<html> Ingen <b>"{0}"</b> hittades fr\u00e5n <b>"{1}"</b>.
-no_more_found_from=<html> Inga fler <b>"{0}"</b> hittades fr\u00e5n <b>"{1}"</b>
-no_previous_find=Ingen f\u00f6reg\u00e5ende tr\u00e4ff.
+no_found_from=<html> Ingen <b>"{0}"</b> hittades fr\u00E5n <b>"{1}"</b>.
+no_more_found_from=<html> Inga fler <b>"{0}"</b> hittades fr\u00E5n <b>"{1}"</b>
+no_previous_find=Ingen f\u00F6reg\u00E5ende tr\u00E4ff.
node=Gren
-node_changed_discard_changes=Grenen f\u00f6r\u00e4ndrad. Ta bort \u00e4ndringen?
-node_is_write_protected=M\u00e5lgrenen \u00e4r skrivskyddad.
-node_location_help=Drag f\u00f6r att flytta grenen, CTRL+drag \u00e4ndrar avst\u00e5nd, dubbelklick \u00e5terst\u00e4ller.
-NodeBackgroundColorAction.text=Gren bakgrundsf\u00e4rg...
-NodeColorAction.text=Grenf\u00e4rg...
-NodeColorBlendAction.text=Blanda f\u00e4rg
-NodeDownAction.text=Gren ned\u00e5t
-NodeListAction.text=S\u00f6k och Ers\u00e4tt...
-NodeListAction.tooltip=Visar alla grenar i en s\u00f6kbar lista med filteregenskaper.
+node_changed_discard_changes=Grenen f\u00F6r\u00E4ndrad. Ta bort \u00E4ndringen?
+node_is_write_protected=M\u00E5lgrenen \u00E4r skrivskyddad.
+node_location_help=Drag f\u00F6r att flytta grenen, CTRL+drag \u00E4ndrar avst\u00E5nd, dubbelklick \u00E5terst\u00E4ller.
+NodeBackgroundColorAction.text=Gren bakgrundsf\u00E4rg...
+NodeColorAction.text=Grenf\u00E4rg...
+NodeColorBlendAction.text=Blanda f\u00E4rg
+NodeDownAction.text=Gren ned\u00E5t
+NodeListAction.text=S\u00F6k och Ers\u00E4tt...
+NodeListAction.tooltip=Visar alla grenar i en s\u00F6kbar lista med filteregenskaper.
NodeShapeAction.bubble.text=Bubbla
NodeShapeAction.fork.text=Enkel
-NodeUpAction.text=Gren upp\u00e5t
+NodeUpAction.text=Gren upp\u00E5t
nonboldify_branch=Ta bort fetstil
nonitalicise_branch=Ta bort kursivstil
normal=Normal
-not_saved_for_image_error=Kartan m\u00e5ste sparas innan bild kan l\u00e4ggas till
-not_saved_for_link_error=Tankekartan m\u00e5ste sparas innan dokument kan l\u00e4nkas.
-note_window_location=Anteckningsf\u00f6nstrets placering
+not_saved_for_image_error=Kartan m\u00E5ste sparas innan bild kan l\u00E4ggas till
+not_saved_for_link_error=Tankekartan m\u00E5ste sparas innan dokument kan l\u00E4nkas.
+note_window_location=Anteckningsf\u00F6nstrets placering
ok=OK
OKAction.text=OK
-OpenAction.text=\u00d6ppna...
+OpenAction.text=\u00D6ppna...
OpenFreeplaneSiteAction.text=Freeplanes hemsida
-OpenPathAction.text=\u00c6ppna fil
-option_changes_may_require_restart=Starta om Freeplane f?r att aktivera nya inst\u00e4llningarna
+OpenPathAction.text=\u00C6ppna fil
+option_changes_may_require_restart=Starta om Freeplane f?r att aktivera nya inst\u00E4llningarna
OptionalDontShowMeAgainDialog.cancel=&Nej
-OptionalDontShowMeAgainDialog.dontShowAgain=&Fr\u00e5ga inte igen.
+OptionalDontShowMeAgainDialog.dontShowAgain=&Fr\u00E5ga inte igen.
OptionalDontShowMeAgainDialog.ok=&Ja
-OptionalDontShowMeAgainDialog.rememberMyDescision=&Kom ih\u00e5g mitt val.
+OptionalDontShowMeAgainDialog.rememberMyDescision=&Kom ih\u00E5g mitt val.
OptionPanel.absolute=Absolut
OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=Automatiskt formatmall
-OptionPanel.always_fold_all_after_load=d\u00f6lj alla
+OptionPanel.always_fold_all_after_load=d\u00F6lj alla
OptionPanel.always_load_last_maps=L?s in senaste anv?nda kartor och ?ppna en ny vid start
-OptionPanel.always_load_last_maps.tooltip=\u00d6ppna senaste kartor enligt inst\u00e4llningarna ovan, \u00e4ven om Freeplane startas genom en fil.
+OptionPanel.always_load_last_maps.tooltip=\u00D6ppna senaste kartor enligt inst\u00E4llningarna ovan, \u00E4ven om Freeplane startas genom en fil.
OptionPanel.always_save_folding=Alltid
-OptionPanel.always_save_folding_state=Spara alltid status (visad/dold) p\u00e5 grenar
-OptionPanel.always_save_folding_state.tooltip=Varje status \u00e4ndring r\u00e4knas som en ?ndring, p\u00e5minnelse att spara visas vid avslut.
+OptionPanel.always_save_folding_state=Spara alltid status (visad/dold) p\u00E5 grenar
+OptionPanel.always_save_folding_state.tooltip=Varje status \u00E4ndring r\u00E4knas som en ?ndring, p\u00E5minnelse att spara visas vid avslut.
OptionPanel.always_unfold_all_after_load=Visa alla
-OptionPanel.antialias=Kantutj\u00e4mning
-OptionPanel.antialias.tooltip=<html>Tar reda p\u00e5 tankekartans kvalitet. Mer kantutj\u00e4mning tar l\u00e4ngre tid.</html>
-OptionPanel.antialias_all=J\u00e4mna ut alla
-OptionPanel.antialias_edges=J\u00e4mna ut kanter
-OptionPanel.antialias_none=Ingen kantutj\u00e4mning
+OptionPanel.antialias=Kantutj\u00E4mning
+OptionPanel.antialias.tooltip=<html>Tar reda p\u00E5 tankekartans kvalitet. Mer kantutj\u00E4mning tar l\u00E4ngre tid.</html>
+OptionPanel.antialias_all=J\u00E4mna ut alla
+OptionPanel.antialias_edges=J\u00E4mna ut kanter
+OptionPanel.antialias_none=Ingen kantutj\u00E4mning
OptionPanel.Appearance=Format
OptionPanel.ar=Ar
OptionPanel.ARC=Rundad
-OptionPanel.as_parent=F\u00f6r\u00e4lder
-OptionPanel.ask=Fr\u00e5ga
+OptionPanel.as_parent=F\u00F6r\u00E4lder
+OptionPanel.ask=Fr\u00E5ga
OptionPanel.automatic=Automatisk
OptionPanel.automaticFormat_level=Auto format
OptionPanel.automaticFormat_level1=Format rotgren
-OptionPanel.automaticFormat_level2=1:a Niv\u00e5 : Grenformat
-OptionPanel.backup_file_number=Antal sparade s\u00e4kerhetskopior filer
-OptionPanel.Behaviour=Inst\u00e4llningar
+OptionPanel.automaticFormat_level2=1:a Niv\u00E5 : Grenformat
+OptionPanel.backup_file_number=Antal sparade s\u00E4kerhetskopior filer
+OptionPanel.Behaviour=Inst\u00E4llningar
OptionPanel.bezier=Bezier
OptionPanel.bubble=Bubbla
OptionPanel.ca=Katalanska
@@ -621,319 +623,317 @@ OptionPanel.Cancel=Avbryt
OptionPanel.center_selected_node=Centrera valda grenar
OptionPanel.check_updates_automatically=Leta efter uppdateringar vid start
OptionPanel.childpattern=Undergrensmall
-OptionPanel.childpattern.tooltip=Den markerade mallen anv\u00e4nds p\u00e5 alla undergrenar.
+OptionPanel.childpattern.tooltip=Den markerade mallen anv\u00E4nds p\u00E5 alla undergrenar.
OptionPanel.clear_all_setters=Byt alla
-OptionPanel.clear_all_setters.tooltip=Visar eller tar bort alla angivna f\u00f6r\u00e4ndringar.
+OptionPanel.clear_all_setters.tooltip=Visar eller tar bort alla angivna f\u00F6r\u00E4ndringar.
OptionPanel.cloud=Moln
-OptionPanel.cloudcolor=Molnf\u00e4rg
+OptionPanel.cloudcolor=Molnf\u00E4rg
OptionPanel.cloudshape=Moln mall
OptionPanel.combined=Kombinerad
-OptionPanel.convert_to_current_version=<html>Konvertera automatiskt \u00e4ldre Freeplane-kartor <br>till den senaste versionen?</html>
-OptionPanel.convert_to_current_version.tooltip=<html>Enbart f\u00f6r v\u00e4ldigt stora kartor som inte beh\u00f6ver konverteras</html>
+OptionPanel.convert_to_current_version=<html>Konvertera automatiskt \u00E4ldre Freeplane-kartor <br>till den senaste versionen?</html>
+OptionPanel.convert_to_current_version.tooltip=<html>Enbart f\u00F6r v\u00E4ldigt stora kartor som inte beh\u00F6ver konverteras</html>
OptionPanel.cs=Tjeckiska
-OptionPanel.cut_nodes_without_question=Klipp ut grenar utan bekr\u00e4ftelse?
-OptionPanel.cut_nodes_without_question.tooltip=Klipper ut grenar utan att fr\u00e5ga, kan leda till dataf\u00f6rlust vid oavsiktlig utklippning.
+OptionPanel.cut_nodes_without_question=Klipp ut grenar utan bekr\u00E4ftelse?
+OptionPanel.cut_nodes_without_question.tooltip=Klipper ut grenar utan att fr\u00E5ga, kan leda till dataf\u00F6rlust vid oavsiktlig utklippning.
OptionPanel.da=Danska
OptionPanel.de=Tyska
OptionPanel.default=Standard
-OptionPanel.default_browser_command_mac=Standard webbl\u00e4sarkommando MAC
+OptionPanel.default_browser_command_mac=Standard webbl\u00E4sarkommando MAC
OptionPanel.default_browser_command_mac.tooltip=<html> och MAC: (tack till Nick!)</html>
-OptionPanel.default_browser_command_other_os=Standard webbl\u00e4sarkommando andra OS
-OptionPanel.default_browser_command_other_os.tooltip=<html> Detta \u00e4r typiskt f\u00f6r Linux:</html>
-OptionPanel.default_browser_command_windows_9x=Standard webbl\u00e4sarkommando Windows 9x
-OptionPanel.default_browser_command_windows_9x.tooltip=<html>F\u00f6r Windows ( "" m\u00e5ste anv\u00e4ndas vid l\u00e4nkar, som har "=" i sina URL).</html>
-OptionPanel.default_browser_command_windows_nt=Standard webbl\u00e4sarkommando Windows NT
-OptionPanel.default_browser_command_windows_nt.tooltip=<html>F\u00f6r Windows ( "" m\u00e5ste anv\u00e4ndas vid l\u00e4nkar, som har "=" i sina URL).</html>
-OptionPanel.default_charset=Teckenupps\u00e4ttning
-OptionPanel.Defaults=Standardv\u00e4rden
+OptionPanel.default_browser_command_other_os=Standard webbl\u00E4sarkommando andra OS
+OptionPanel.default_browser_command_other_os.tooltip=<html> Detta \u00E4r typiskt f\u00F6r Linux:</html>
+OptionPanel.default_browser_command_windows_9x=Standard webbl\u00E4sarkommando Windows 9x
+OptionPanel.default_browser_command_windows_9x.tooltip=<html>F\u00F6r Windows ( "" m\u00E5ste anv\u00E4ndas vid l\u00E4nkar, som har "=" i sina URL).</html>
+OptionPanel.default_browser_command_windows_nt=Standard webbl\u00E4sarkommando Windows NT
+OptionPanel.default_browser_command_windows_nt.tooltip=<html>F\u00F6r Windows ( "" m\u00E5ste anv\u00E4ndas vid l\u00E4nkar, som har "=" i sina URL).</html>
+OptionPanel.default_charset=Teckenupps\u00E4ttning
+OptionPanel.Defaults=Standardv\u00E4rden
OptionPanel.delete_automatic_saves_at_exit=Ta bort autospara vid avslutning
-OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Om filerna ska tas bort automatiskt vid normal avslutning av Freeplane ska f\u00f6ljande varibel vara ikryssad (sant)</html>
-OptionPanel.delete_nodes_without_question=Radera grenar utan bekr\u00e4ftelse?
-OptionPanel.delete_nodes_without_question.tooltip=Raderar grenar utan att fr\u00e5ga, kan orsaka dataf\u00f6rlust vid oavsiktlig anv\u00e4ndning.
-OptionPanel.disable_cursor_move_paper=Ta bort mark\u00f6r Flytta karta
-OptionPanel.disable_cursor_move_paper.tooltip=<html>Visa inte 'flytta' mark\u00f6r n\u00e4r kartan flyttas</html>
+OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Om filerna ska tas bort automatiskt vid normal avslutning av Freeplane ska f\u00F6ljande varibel vara ikryssad (sant)</html>
+OptionPanel.delete_nodes_without_question=Radera grenar utan bekr\u00E4ftelse?
+OptionPanel.delete_nodes_without_question.tooltip=Raderar grenar utan att fr\u00E5ga, kan orsaka dataf\u00F6rlust vid oavsiktlig anv\u00E4ndning.
+OptionPanel.disable_cursor_move_paper=Ta bort mark\u00F6r Flytta karta
+OptionPanel.disable_cursor_move_paper.tooltip=<html>Visa inte 'flytta' mark\u00F6r n\u00E4r kartan flyttas</html>
OptionPanel.display_node_id=Visa gren-ID
-OptionPanel.edgecolor=Kantf\u00e4rg
-OptionPanel.edgecolor.tooltip=Kantegenskap till huvudgren. Alla undergrenar \u00e4ndras ocks\u00e5.
+OptionPanel.edgecolor=Kantf\u00E4rg
+OptionPanel.edgecolor.tooltip=Kantegenskap till huvudgren. Alla undergrenar \u00E4ndras ocks\u00E5.
OptionPanel.edgestyle=Kantstil
-OptionPanel.edgestyle.tooltip=Kantegenskap till huvudgren. Alla undergrenar \u00e4ndras ocks\u00e5.
+OptionPanel.edgestyle.tooltip=Kantegenskap till huvudgren. Alla undergrenar \u00E4ndras ocks\u00E5.
OptionPanel.edgewidth=Kantbredd
-OptionPanel.edgewidth.tooltip=Kantegenskap till huvudgren. Alla undergrenar \u00e4ndras ocks\u00e5.
+OptionPanel.edgewidth.tooltip=Kantegenskap till huvudgren. Alla undergrenar \u00E4ndras ocks\u00E5.
OptionPanel.editor_extra_width=Extravidd: Steg
OptionPanel.el=Grekiska
OptionPanel.el__buttons_above=Knappar upptill
-OptionPanel.el__enter_confirms_by_default=Enter bekr\u00e4ftar som standard
-OptionPanel.el__max_default_window_height=Max f\u00f6nster h\u00f6jd
-OptionPanel.el__max_default_window_width=Max f\u00f6nster bredd
-OptionPanel.el__min_default_window_height=Min f\u00f6nster h\u00f6jd
-OptionPanel.el__min_default_window_width=Min f\u00f6nster bredd
-OptionPanel.el__position_window_below_node=F\u00f6nsterplacering under gren
+OptionPanel.el__enter_confirms_by_default=Enter bekr\u00E4ftar som standard
+OptionPanel.el__max_default_window_height=Max f\u00F6nster h\u00F6jd
+OptionPanel.el__max_default_window_width=Max f\u00F6nster bredd
+OptionPanel.el__min_default_window_height=Min f\u00F6nster h\u00F6jd
+OptionPanel.el__min_default_window_width=Min f\u00F6nster bredd
+OptionPanel.el__position_window_below_node=F\u00F6nsterplacering under gren
OptionPanel.en=En
OptionPanel.Environment=Programinst?llningar
OptionPanel.es=Es
OptionPanel.et=Estniska
-OptionPanel.execute_scripts_without_asking=Ska skript k\u00f6ras utan bekr\u00e4ftelse?
-OptionPanel.execute_scripts_without_asking.tooltip=<html>Freeplane-skrip kan i princip utf\u00f6ra vad som helst p\u00e5 datorn. <br>S\u00e5deles,<br> k\u00f6r inte skript som kan vara os?kra.</html>
-OptionPanel.execute_scripts_without_exec_restriction=Till\u00e5t k\u00f6rning av andra program (INTE rekommenderat)
+OptionPanel.execute_scripts_without_asking=Ska skript k\u00F6ras utan bekr\u00E4ftelse?
+OptionPanel.execute_scripts_without_asking.tooltip=<html>Freeplane-skrip kan i princip utf\u00F6ra vad som helst p\u00E5 datorn. <br>S\u00E5deles,<br> k\u00F6r inte skript som kan vara os?kra.</html>
+OptionPanel.execute_scripts_without_exec_restriction=Till\u00E5t k\u00F6rning av andra program (INTE rekommenderat)
OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>If your Groovy Scripts need to execute special other applications (like a browser) without asking(!),<br>you have to enable this option. <br>But use it with care, as now malicious scripts can hurt your computer!</body></html>
-OptionPanel.execute_scripts_without_file_restriction=Till\u00e5t filoperationer (INTE rekommenderat)
+OptionPanel.execute_scripts_without_file_restriction=Till\u00E5t filoperationer (INTE rekommenderat)
OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>If your Groovy Scripts need to execute special file actions (open, close, read, write, delete(!)),<br>you have to enable this option. <br>But use it with care, as now malicious scripts can hurt your computer!</body></html>
-OptionPanel.execute_scripts_without_network_restriction=Till\u00e5t n\u00e4tverksoperationer (INTE rekommenderat)
+OptionPanel.execute_scripts_without_network_restriction=Till\u00E5t n\u00E4tverksoperationer (INTE rekommenderat)
OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>If your Groovy Scripts need to execute special network actions,<br>you have to enable this option. <br>But use it with care, as now malicious scripts can disclosure your secrets!</body></html>
-OptionPanel.execute_scripts_without_write_restriction=Till?t Fil?ndringar (INTE rekommenderat)
-OptionPanel.execute_scripts_without_write_restriction.tooltip=<html><body>Om Groovy Skcript beh?ver skriv r?ttigheter(Skriva,ta bort fil ),<br>aktivera detta val. <br>Normalt tillsammans med l?s r?ttigheter.<br>Anv?nds med f?rsiktighet d? d?liga skript kan skada lagrat data</body></html>
-OptionPanel.experimental_file_locking_on=Experimentell fill\u00e5sning
-OptionPanel.experimental_file_locking_on.tooltip=<html> Experimentell f\u00f6rekomst</html>
+OptionPanel.execute_scripts_without_write_restriction=Till?t Fil?ndringar (INTE rekommenderat)
+OptionPanel.execute_scripts_without_write_restriction.tooltip=<html><body>Om Groovy Skcript beh?ver skriv r?ttigheter(Skriva,ta bort fil ),<br>aktivera detta val. <br>Normalt tillsammans med l?s r?ttigheter.<br>Anv?nds med f?rsiktighet d? d?liga skript kan skada lagrat data</body></html>
+OptionPanel.experimental_file_locking_on=Experimentell fill\u00E5sning
+OptionPanel.experimental_file_locking_on.tooltip=<html> Experimentell f\u00F6rekomst</html>
OptionPanel.export_icons_in_html=Exportera ikoner till HTML
-OptionPanel.export_icons_in_html.tooltip=<html> Ber\u00e4ttar f\u00f6r HTML exporterad fr\u00e5n Freeplane att ikoner ska f\u00f6lja med.<br> Problemet med ikoner \u00e4r att l\u00e4nkar till ikonerna ganska ofta inte hittas i exporterade HTML-koden.</html>
+OptionPanel.export_icons_in_html.tooltip=<html> Ber\u00E4ttar f\u00F6r HTML exporterad fr\u00E5n Freeplane att ikoner ska f\u00F6lja med.<br> Problemet med ikoner \u00E4r att l\u00E4nkar till ikonerna ganska ofta inte hittas i exporterade HTML-koden.</html>
OptionPanel.Files=Arkiv
-OptionPanel.first=F\u00f6rst
-OptionPanel.foldingsymbolwidth=D\u00f6lj symbolbredd
-OptionPanel.foldingsymbolwidth.tooltip=<html>Bredd p\u00e5 mark\u00f6rcirkel (dold gren) </html>
-OptionPanel.fork=F\u00f6rgrening
+OptionPanel.first=F\u00F6rst
+OptionPanel.foldingsymbolwidth=D\u00F6lj symbolbredd
+OptionPanel.foldingsymbolwidth.tooltip=<html>Bredd p\u00E5 mark\u00F6rcirkel (dold gren) </html>
+OptionPanel.fork=F\u00F6rgrening
OptionPanel.formula_disable_caching=Avaktivera formel cachen
OptionPanel.fr=Franska
OptionPanel.gl=Gl
-OptionPanel.goto_note_end_on_edit=Flytta mark\u00f6ren till slutet
+OptionPanel.goto_note_end_on_edit=Flytta mark\u00F6ren till slutet
OptionPanel.grid_size=Min. pixlar vid grenflytt
OptionPanel.gtk=Gtk
-OptionPanel.hide_edge=D\u00f6lj kanter
+OptionPanel.hide_edge=D\u00F6lj kanter
OptionPanel.horizontal=Horisontell
OptionPanel.hr=Kroatiska
OptionPanel.HTML=HTML
-OptionPanel.html_export_based_on_headings=Baserad p\u00e5 rubriker
-OptionPanel.html_export_fold_all=D\u00f6lj alla
-OptionPanel.html_export_fold_currently_folded=D\u00f6lj aktuell
-OptionPanel.html_export_folding=HTML export
+OptionPanel.html_export_based_on_headings=Baserad p\u00E5 rubriker
+OptionPanel.html_export_fold_all=D\u00F6lj alla
+OptionPanel.html_export_fold_currently_folded=D\u00F6lj aktuell
+OptionPanel.html_export_folding=HTML export
OptionPanel.html_export_no_folding=Visa alla
OptionPanel.hu=Hu
OptionPanel.icon=Ikon
-OptionPanel.icon.tooltip=Om anv\u00e4nds kommer grenen att f\u00e5 ikonen.
-OptionPanel.icons.list=Lista \u00f6ver visade standardikoner
-OptionPanel.icons.list.tooltip=H\u00e4r kan standardikonerna ordnas eller avaktiveras. Separera ikonerna med ';'.
+OptionPanel.icon.tooltip=Om anv\u00E4nds kommer grenen att f\u00E5 ikonen.
+OptionPanel.icons.list=Lista \u00F6ver visade standardikoner
+OptionPanel.icons.list.tooltip=H\u00E4r kan standardikonerna ordnas eller avaktiveras. Separera ikonerna med ';'.
OptionPanel.id=Indonesiska
-OptionPanel.il__enter_confirms_by_default=Enter-tryckning bekr\u00e4ftar
+OptionPanel.il__enter_confirms_by_default=Enter-tryckning bekr\u00E4ftar
OptionPanel.it=It
OptionPanel.ja=Ja
OptionPanel.Keystrokes=Tangentdefinitioner
OptionPanel.ko=Kr
OptionPanel.label_font_family=Typsnittsfamilj
OptionPanel.label_font_size=Teckensnittsstorlek
-OptionPanel.language=Spr\u00e5k
-OptionPanel.language.tooltip=<html>Detta \u00e4r spr\u00e5ket som kommer att anv\u00e4ndas i programmet.<br> 'automatisk' f\u00f6rs\u00f6ker att h\u00e4mta nuvarande anv\u00e4ndares spr\u00e5k. </html>
+OptionPanel.language=Spr\u00E5k
+OptionPanel.language.tooltip=<html>Detta \u00E4r spr\u00E5ket som kommer att anv\u00E4ndas i programmet.<br> 'automatisk' f\u00F6rs\u00F6ker att h\u00E4mta nuvarande anv\u00E4ndares spr\u00E5k. </html>
OptionPanel.last=Sist
OptionPanel.last_opened_list_length=Senaste filer, visa antal
-OptionPanel.linear=Linj\u00e4r
-OptionPanel.links=L\u00e4nkar
-OptionPanel.links.tooltip=<html>Anv\u00e4nd relativa eller absoluta l\u00e4nkar </html>
+OptionPanel.linear=Linj\u00E4r
+OptionPanel.links=L\u00E4nkar
+OptionPanel.links.tooltip=<html>Anv\u00E4nd relativa eller absoluta l\u00E4nkar </html>
OptionPanel.load_folding=Vid laddning
-OptionPanel.load_folding_from_map_default_fold_all=L?s in fr\u00e5n kartan eller d\u00f6lj alla
-OptionPanel.load_folding_from_map_default_unfold_all=L?s in fr\u00e5n kartan eller visa alla
-OptionPanel.load_last_map=\u00d6ppna senaste tankekartan automatiskt
-OptionPanel.load_last_map.tooltip=<html>N\u00e4r Freeplane startas, h\u00e4mtas senast anv\u00e4nda tankekarta, om markerad.</html>
-OptionPanel.load_last_maps=L?s in kartor fr\u00e5n f\u00f6rra g\u00e5ngen
+OptionPanel.load_folding_from_map_default_fold_all=L?s in fr\u00E5n kartan eller d\u00F6lj alla
+OptionPanel.load_folding_from_map_default_unfold_all=L?s in fr\u00E5n kartan eller visa alla
+OptionPanel.load_last_map=\u00D6ppna senaste tankekartan automatiskt
+OptionPanel.load_last_map.tooltip=<html>N\u00E4r Freeplane startas, h\u00E4mtas senast anv\u00E4nda tankekarta, om markerad.</html>
+OptionPanel.load_last_maps=L?s in kartor fr\u00E5n f\u00F6rra g\u00E5ngen
OptionPanel.lookandfeel=Utseende
-OptionPanel.lookandfeel.tooltip=<html>Utseenden att anv\u00e4nda. 'metal','windows','motif', 'gtk' finns tillg\u00e4ngliga,<br> 'mac' finns enbart p\u00e5 MacOS. Standard betyder, att standard mall anv\u00e4nds.<br> Egen vy och k\u00e4nsla, skriv in klassbibliotekets namn h\u00e4r och kontrollera att jarfilerna \u00e4r inl\u00e4sta.<br> Om det uppst\u00e5r problem med mallen, v\u00e4lja 'nothing'. Det fungerar med applets.</html>
+OptionPanel.lookandfeel.tooltip=<html>Utseenden att anv\u00E4nda. 'metal','windows','motif', 'gtk' finns tillg\u00E4ngliga,<br> 'mac' finns enbart p\u00E5 MacOS. Standard betyder, att standard mall anv\u00E4nds.<br> Egen vy och k\u00E4nsla, skriv in klassbibliotekets namn h\u00E4r och kontrollera att jarfilerna \u00E4r inl\u00E4sta.<br> Om det uppst\u00E5r problem med mallen, v\u00E4lja 'nothing'. Det fungerar med applets.</html>
OptionPanel.lt=Lt
OptionPanel.max_displayed_node_count=Max antal visade grenar
OptionPanel.max_node_width=Maximal grenbredd
OptionPanel.max_node_width.tooltip=<html>Standard maximal grenbredd i pixels</html>
-OptionPanel.max_shortened_text_length=Max korta grenl\u00e4ngder
+OptionPanel.max_shortened_text_length=Max korta grenl\u00E4ngder
OptionPanel.metal=Metall
OptionPanel.motif=Motif
OptionPanel.nb=No
OptionPanel.never_save_folding=Aldrig
OptionPanel.nl=Nl
OptionPanel.nn=Norska (Nynorsk)
-OptionPanel.nodebackgroundcolor=Grenens bakgrundsf\u00e4rg
-OptionPanel.nodebackgroundcolor.tooltip=Grenens bakgrundsf\u00e4rg
-OptionPanel.nodecolor=Grenens f\u00e4rg
-OptionPanel.nodecolor.tooltip=Grenens f\u00e4rg
+OptionPanel.nodebackgroundcolor=Grenens bakgrundsf\u00E4rg
+OptionPanel.nodebackgroundcolor.tooltip=Grenens bakgrundsf\u00E4rg
+OptionPanel.nodecolor=Grenens f\u00E4rg
+OptionPanel.nodecolor.tooltip=Grenens f\u00E4rg
OptionPanel.nodefontbold=Fet
OptionPanel.nodefontitalic=Kursivstil
OptionPanel.nodefontname=Grenens teckensnitt
OptionPanel.nodefontsize=Grenens teckensnittsstorlek
-OptionPanel.nodeshape=Grenens stil
-OptionPanel.nodeshape.tooltip=Grenens stil
OptionPanel.nodetext=Grentext
OptionPanel.nodetext.tooltip=Grentext
OptionPanel.nothing=Ingenting
OptionPanel.number_of_different_files_for_automatic_save=Antal olika filer vid autospara
-OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> antal n av olika filer att spara tankekartan i.<br> Den f\u00f6rsta filen autosparas f\u00f6rst, osv. till och med n+1-spara som \u00e5terigen sparas i f\u00f6rsta filen (cykel)</html>
+OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> antal n av olika filer att spara tankekartan i.<br> Den f\u00F6rsta filen autosparas f\u00F6rst, osv. till och med n+1-spara som \u00E5terigen sparas i f\u00F6rsta filen (cykel)</html>
OptionPanel.OK=Spara
OptionPanel.org.freeplane.plugin.bugreport=Policy
OptionPanel.org.freeplane.plugin.bugreport.allowed=Skicka alltid
-OptionPanel.org.freeplane.plugin.bugreport.ask=Fr\u00e5ga
+OptionPanel.org.freeplane.plugin.bugreport.ask=Fr\u00E5ga
OptionPanel.org.freeplane.plugin.bugreport.denied=Skicka aldrig
-OptionPanel.outline_hgap=Horisontellt avst\u00e5nd
-OptionPanel.outline_vgap=Vertikalt avst\u00e5nd
-OptionPanel.paint_connectors_behind=F\u00f6rbindelse d\u00f6ljs av gren
+OptionPanel.outline_hgap=Horisontellt avst\u00E5nd
+OptionPanel.outline_vgap=Vertikalt avst\u00E5nd
+OptionPanel.paint_connectors_behind=F\u00F6rbindelse d\u00F6ljs av gren
OptionPanel.path_property_may_not_be_empty=Path property may not be empty! Change has been reverted.
OptionPanel.patternname=Namn
OptionPanel.patternname.tooltip=Unikt mallnamn
OptionPanel.pl=Pl
-OptionPanel.placenewbranches=Placera nya f\u00f6rgreningar
-OptionPanel.placenewbranches.tooltip=<html>Var placera nya f\u00f6rgreningar. Godk\u00e4nda v\u00e4rden \u00e4r 'f\u00f6rst' och 'sist' </html>
+OptionPanel.placenewbranches=Placera nya f\u00F6rgreningar
+OptionPanel.placenewbranches.tooltip=<html>Var placera nya f\u00F6rgreningar. Godk\u00E4nda v\u00E4rden \u00E4r 'f\u00F6rst' och 'sist' </html>
OptionPanel.plugin.tooltip=Non-core plugins.
OptionPanel.plugins=Plugins
OptionPanel.printonwhitebackground=Vit bakgrund vid utskrift
-OptionPanel.printonwhitebackground.tooltip=Anv\u00e4nd alltid vit bakgrund vid utskrift
+OptionPanel.printonwhitebackground.tooltip=Anv\u00E4nd alltid vit bakgrund vid utskrift
OptionPanel.pt_BR=Pt BR
OptionPanel.pt_PT=Pt PT
OptionPanel.RECT=Rektangel
OptionPanel.relative=Relativ
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"Ask" will ask you (use in doubt).<br>"Yes" displays the rich text editor.<br>"No" displays the plain text editor.</html>
OptionPanel.remind_use_rich_text_in_new_nodes=Anv?nd ut?kat textformat f?r inklistrade grenar
-OptionPanel.remove_notes_without_question=Radera grenar utan att fr\u00e5ga?
-OptionPanel.remove_notes_without_question.tooltip=Raderar omedelbart grenar utan att fr\u00e5ga efter bekr\u00e4ftelse.
-OptionPanel.resources_use_default_font_for_notes_too=Anv\u00e4nd standardtypsnitt \u00e4ven f\u00f6r anteckningar
-OptionPanel.resources_use_margin_top_zero_for_notes=Ta bort \u00f6ver marginalen f\u00f6r anteckningar
-OptionPanel.revision_color=Revideringsf\u00e4rg
-OptionPanel.revision_color.tooltip=Bakgrundsf\u00e4rg f\u00f6r modifierade grenar
+OptionPanel.remove_notes_without_question=Radera grenar utan att fr\u00E5ga?
+OptionPanel.remove_notes_without_question.tooltip=Raderar omedelbart grenar utan att fr\u00E5ga efter bekr\u00E4ftelse.
+OptionPanel.resources_use_default_font_for_notes_too=Anv\u00E4nd standardtypsnitt \u00E4ven f\u00F6r anteckningar
+OptionPanel.resources_use_margin_top_zero_for_notes=Ta bort \u00F6ver marginalen f\u00F6r anteckningar
+OptionPanel.revision_color=Revideringsf\u00E4rg
+OptionPanel.revision_color.tooltip=Bakgrundsf\u00E4rg f\u00F6r modifierade grenar
OptionPanel.ROUND_RECT=Rundad Rektangel
OptionPanel.ru=Ru
OptionPanel.save_folding=Spara status
-OptionPanel.save_folding_if_map_is_changed=Om kartan \u00e4ndras
-OptionPanel.save_modification_times=Spara tidpunkt f\u00f6r ?ndringen
+OptionPanel.save_folding_if_map_is_changed=Om kartan \u00E4ndras
+OptionPanel.save_modification_times=Spara tidpunkt f\u00F6r ?ndringen
OptionPanel.script_classpath=Skript classpath: Katalog inneh?llande klasser och/eller JARs (separera med ;;)
-OptionPanel.script_classpath.tooltip=<html>A list of JARs and/or directories to add to the classpath of scripts and formulas.<br>Use ; (Windows) or : (Linux, Mac) to separate entries.<br>Directories will be scanned for JARs and for .class files.<br>Paths that are not absolute are considered relative to the Freeplane user directory.<br>If you set the classpath you have to permit read access too!</html>
-OptionPanel.script_directories=S\u00f6kv\u00e4g f\u00f6r skript (separera med ;;)
-OptionPanel.script_directories.tooltip=<html>A list of directories.<br>Use ; (Windows) or : (Linux, Mac) to separate entries.<br>Paths that are not absolute are considered relative to the Freeplane user directory.</html>
+OptionPanel.script_classpath.tooltip=<html>A list of JARs and/or directories to add to the classpath of scripts and formulas.<br>Use ; (Windows) or : (Linux, Mac) to separate entries.<br>Directories will be scanned for JARs and for .class files.<br>Paths that are not absolute are considered relative to the Freeplane user directory.<br>If you set the classpath you have to permit read access too!</html>
+OptionPanel.script_directories=S\u00F6kv\u00E4g f\u00F6r skript (separera med ;;)
+OptionPanel.script_directories.tooltip=<html>A list of directories.<br>Use ; (Windows) or : (Linux, Mac) to separate entries.<br>Paths that are not absolute are considered relative to the Freeplane user directory.</html>
OptionPanel.script_user_key_name_for_signing=Option: aliaset till anv?ndarnyckeln f?r signering
OptionPanel.script_user_key_name_for_signing.tooltip=<html>If you want to sign your scripts, enter the alias of the key here. <br>The key is expected to reside in the default keystore. <br>The password of the key's secret key must coincide with the keystore password (this is the default).</html>
OptionPanel.scrollbar_increment=Hastighet
OptionPanel.selection_method=Metod
OptionPanel.selection_method.tooltip=<html> Hur markeringen av grenar sker.</html>
OptionPanel.selection_method_by_click=Vid musklick
-OptionPanel.selection_method_delayed=F\u00f6rdr?jd
+OptionPanel.selection_method_delayed=F\u00F6rdr?jd
OptionPanel.selection_method_direct=Direkt
OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName=Mall
-OptionPanel.separator.anti_alias=Kantutj\u00e4mning
+OptionPanel.separator.anti_alias=Kantutj\u00E4mning
OptionPanel.separator.attributes=Egenskaper
OptionPanel.separator.automatic_save=Autospara
OptionPanel.separator.behaviour=Redigering
-OptionPanel.separator.browser=Webbl\u00e4sare
+OptionPanel.separator.browser=Webbl\u00E4sare
OptionPanel.separator.CloudControls=Moln
-OptionPanel.separator.commands_for_the_program=Kommandon f\u00f6r programmet
-OptionPanel.separator.connectors=F\u00f6rbindelser
-OptionPanel.separator.default_colors=Standardf\u00e4rg
+OptionPanel.separator.commands_for_the_program=Kommandon f\u00F6r programmet
+OptionPanel.separator.connectors=F\u00F6rbindelser
+OptionPanel.separator.default_colors=Standardf\u00E4rg
OptionPanel.separator.default_fonts=Standard teckensnitt
OptionPanel.separator.default_styles=Standardstil
OptionPanel.separator.EdgeControls=Kanter
-OptionPanel.separator.edit_long_node_window=Redigering: Ut\u00f6kat grenf\u00f6nster
-OptionPanel.separator.editing=Redigeringsinst\u00e4llningar
+OptionPanel.separator.edit_long_node_window=Redigering: Ut\u00F6kat grenf\u00F6nster
+OptionPanel.separator.editing=Redigeringsinst\u00E4llningar
OptionPanel.separator.files=Arkiv
OptionPanel.separator.formula=Formel Plugin
-OptionPanel.separator.General=Allm\u00e4n
+OptionPanel.separator.General=Allm\u00E4n
OptionPanel.separator.html_export=Export till Html
-OptionPanel.separator.html_import=Import fr\u00e5n HTML
-OptionPanel.separator.hyperlink_types=Typ av hyperl\u00e4nkar
+OptionPanel.separator.html_import=Import fr\u00E5n HTML
+OptionPanel.separator.hyperlink_types=Typ av hyperl\u00E4nkar
OptionPanel.separator.icon_properties=Ikoner
-OptionPanel.separator.icons=Ikoner i "V\u00e4lj ikon..."-menyn
+OptionPanel.separator.icons=Ikoner i "V\u00E4lj ikon..."-menyn
OptionPanel.separator.initial_map_size=Inledande kartstorlek
OptionPanel.separator.inline_editor=Grenredigering
OptionPanel.separator.key_typing=Tangenttryckning
-OptionPanel.separator.language=Spr\u00e5k
+OptionPanel.separator.language=Spr\u00E5k
OptionPanel.separator.load=Start
OptionPanel.separator.look_and_feel=Utseende
OptionPanel.separator.mouse_wheel=Mushjul
-OptionPanel.separator.new_node_commands=Nya kommandon f\u00f6r grenar
-OptionPanel.separator.node_editing_commands=Kommandon f\u00f6r grenredigering
-OptionPanel.separator.node_navigation_commands=Kommandon f\u00f6r navigering
-OptionPanel.separator.NodeColors=Gren f\u00e4rger
+OptionPanel.separator.new_node_commands=Nya kommandon f\u00F6r grenar
+OptionPanel.separator.node_editing_commands=Kommandon f\u00F6r grenredigering
+OptionPanel.separator.node_navigation_commands=Kommandon f\u00F6r navigering
+OptionPanel.separator.NodeColors=Gren f\u00E4rger
OptionPanel.separator.NodeFont=Grenteckensnitt
OptionPanel.separator.NodeShape=Grenform
OptionPanel.separator.NodeStyle=Grenmall
-OptionPanel.separator.notifications=Bekr\u00e4ftelser
+OptionPanel.separator.notifications=Bekr\u00E4ftelser
OptionPanel.separator.org.freeplane.plugin.bugreport=Automatisk felrapport
OptionPanel.separator.other_defaults=Andra standardv?rden
OptionPanel.separator.others=Andra nyckelbindningar
-OptionPanel.separator.outline_view=\u00d6versiktsvy
+OptionPanel.separator.outline_view=\u00D6versiktsvy
OptionPanel.separator.patterns=Mall
OptionPanel.separator.root_node_appearance=Rotgrenformat
OptionPanel.separator.save=Spara
OptionPanel.separator.scrollbar=Rullningslist
-OptionPanel.separator.selection_colors=Markeringsf\u00e4rger
+OptionPanel.separator.selection_colors=Markeringsf\u00E4rger
OptionPanel.separator.selection_method=Markering av grenar
OptionPanel.separator.single_instance_mode=Endast en kopia av programmet startas
-OptionPanel.separator.size_limits=Storleksgr\u00e4ns
+OptionPanel.separator.size_limits=Storleksgr\u00E4ns
OptionPanel.separator.spelling=Stavningskontroll
OptionPanel.separator.tooltip=Tips-rutor
-OptionPanel.separator.undo=\u00c5ngra
+OptionPanel.separator.undo=\u00C5ngra
OptionPanel.separator.updates=Programuppdateringar
-OptionPanel.set_property_text=\u00c4ndra
-OptionPanel.set_property_text.tooltip=Tom: L?t vara; Markerad = \u00c4ndra egenskaper
-OptionPanel.setscript=\u00c4ndra?
+OptionPanel.set_property_text=\u00C4ndra
+OptionPanel.set_property_text.tooltip=Tom: L?t vara; Markerad = \u00C4ndra egenskaper
+OptionPanel.setscript=\u00C4ndra?
OptionPanel.setscript.tooltip=A script can be associated to the style.
OptionPanel.sharp_bezier=Skarp Bezier
-OptionPanel.sharp_linear=Skarp linj\u00e4r
+OptionPanel.sharp_linear=Skarp linj\u00E4r
OptionPanel.show_icon_for_attributes=Visa egenskapsikon
-OptionPanel.show_node_tooltips=Visa verktygsskript f\u00f6r grenar
-OptionPanel.signed_script_are_trusted=Lita p\u00e5 signerade skript (rekommenderas)
+OptionPanel.show_node_tooltips=Visa verktygsskript f\u00F6r grenar
+OptionPanel.signed_script_are_trusted=Lita p\u00E5 signerade skript (rekommenderas)
OptionPanel.signed_script_are_trusted.tooltip=If scripts are signed by a trusted party (ie. from the Freeplane's authors or by yourself), it is executed without restrictions.
-OptionPanel.single_backup_directory=F?r backup anv\u00e4nd katalog
+OptionPanel.single_backup_directory=F?r backup anv\u00E4nd katalog
OptionPanel.single_backup_directory.tooltip=<html> If backup and auto save files should be put into a single directory instead of a sub directory in the map's directory</html>
OptionPanel.single_backup_directory_path=Backup katalog (om ovan vald)
OptionPanel.single_backup_directory_path.tooltip=<html>Overrides default <freeplaneuserdir>/.backup</html>
-OptionPanel.single_instance=Filer \u00f6ppnas i redan startat program
+OptionPanel.single_instance=Filer \u00F6ppnas i redan startat program
OptionPanel.single_instance_force=Starta endast en kopia av programmet
OptionPanel.sk=Slovakiska
OptionPanel.sl=Sl
-OptionPanel.spelling_opt_case_sensitive=Versalk\u00e4nslig
+OptionPanel.spelling_opt_case_sensitive=Versalk\u00E4nslig
OptionPanel.spelling_opt_ignore_all_caps_words=Ignorera alla ord med enbart versaler
-OptionPanel.spelling_opt_ignore_capitalization=Ignorera ord som b\u00f6rjar med versal
+OptionPanel.spelling_opt_ignore_capitalization=Ignorera ord som b\u00F6rjar med versal
OptionPanel.spelling_opt_ignore_words_with_numbers=Ingorera ord med siffror i
-OptionPanel.spelling_opt_suggestions_limit_dialog=Antal f\u00f6rslag i f\u00f6nstret
-OptionPanel.spelling_opt_suggestions_limit_menu=Antal f\u00f6rslag i menyn
+OptionPanel.spelling_opt_suggestions_limit_dialog=Antal f\u00F6rslag i f\u00F6nstret
+OptionPanel.spelling_opt_suggestions_limit_menu=Antal f\u00F6rslag i menyn
OptionPanel.standard_template=Standard mallfil
-OptionPanel.standardbackgroundcolor=Standard bakgrundsf\u00e4rg
-OptionPanel.standardbackgroundcolor.tooltip=<html>Standard bakgrundsf\u00e4rg i htmlkod </html>
-OptionPanel.standardcloudcolor=Standard molnf\u00e4rg
-OptionPanel.standardcloudcolor.tooltip=<html>Standard molnf\u00e4rg i htmlkod </html>
+OptionPanel.standardbackgroundcolor=Standard bakgrundsf\u00E4rg
+OptionPanel.standardbackgroundcolor.tooltip=<html>Standard bakgrundsf\u00E4rg i htmlkod </html>
+OptionPanel.standardcloudcolor=Standard molnf\u00E4rg
+OptionPanel.standardcloudcolor.tooltip=<html>Standard molnf\u00E4rg i htmlkod </html>
OptionPanel.standardcloudestyle=Standard molnstil
-OptionPanel.standardcloudestyle.tooltip=<html>Standard molnstil. F\u00f6r n\u00e4rvarande finns enbart 'bezier' tillg\u00e4ngligt</html>
+OptionPanel.standardcloudestyle.tooltip=<html>Standard molnstil. F\u00F6r n\u00E4rvarande finns enbart 'bezier' tillg\u00E4ngligt</html>
OptionPanel.standarddrawrectangleforselection=Markera valda grenar med bubblor
OptionPanel.standarddrawrectangleforselection.tooltip=<html>Mark selected nodes by bubble around.</html>
-OptionPanel.standardlinkcolor=Standard l\u00e4nkf\u00e4rg
-OptionPanel.standardlinkcolor.tooltip=<html>Standard l\u00e4nkf\u00e4rg i htmlkod </html>
-OptionPanel.standardlinkestyle=Standard l\u00e4nkstil
-OptionPanel.standardlinkestyle.tooltip=<html>Standard l\u00e4nkstil. F\u00f6r n\u00e4rvarande finns enbart 'bezier' tillg\u00e4ngligt</html>
-OptionPanel.standardselectednodecolor=Standard vald grenf\u00e4rg
-OptionPanel.standardselectednodecolor.tooltip=<html>Standard grenf\u00e4rg om den \u00e4r vald. I htmlkod (#RRGGBB i hexv\u00e4rde) </html>
-OptionPanel.standardselectednoderectanglecolor=F\u00e4rg p\u00e5 markeringsbubbla
+OptionPanel.standardlinkcolor=Standard l\u00E4nkf\u00E4rg
+OptionPanel.standardlinkcolor.tooltip=<html>Standard l\u00E4nkf\u00E4rg i htmlkod </html>
+OptionPanel.standardlinkestyle=Standard l\u00E4nkstil
+OptionPanel.standardlinkestyle.tooltip=<html>Standard l\u00E4nkstil. F\u00F6r n\u00E4rvarande finns enbart 'bezier' tillg\u00E4ngligt</html>
+OptionPanel.standardselectednodecolor=Standard vald grenf\u00E4rg
+OptionPanel.standardselectednodecolor.tooltip=<html>Standard grenf\u00E4rg om den \u00E4r vald. I htmlkod (#RRGGBB i hexv\u00E4rde) </html>
+OptionPanel.standardselectednoderectanglecolor=F\u00E4rg p\u00E5 markeringsbubbla
OptionPanel.standardselectednoderectanglecolor.tooltip=<html>The color of buble marking selected nodes. In html notation (#RRGGBB in hex values) </html>
OptionPanel.STAR=Taggig
OptionPanel.structured_html_import=Importera HTML som grenstruktur
OptionPanel.structured_icon_toolbar=Strukturera ikonraden
OptionPanel.sv=Svenska
-OptionPanel.text.use_ctrl_key=Anv\u00e4nd 'Tilldela snabbkommando' fr\u00e5n Verktygs-menyn
-OptionPanel.time_for_automatic_save=Tid f\u00f6r att spara automatiskt
-OptionPanel.time_for_automatic_save.tooltip=<html> tid mellan tv\u00e5 p\u00e5f\u00f6ljande automatiskt sparade filer (i msec):<br> F\u00f6r att ta bort autospara s\u00e4tt v\u00e4rdet till 2000000000.</html>
-OptionPanel.time_for_delayed_selection=Tid f\u00f6r f\u00f6rdr?jd grenmarkering
-OptionPanel.time_for_delayed_selection.tooltip=<html> F\u00f6rdr?jd markeringstid (i msec) av grenar n\u00e4r musen f\u00f6rs \u00f6ver . <br>\u00c4ndra detta v\u00e4rde till 1 f?r direktval n\u00e4r musen f\u00f6rs \u00f6ver.</html>
+OptionPanel.text.use_ctrl_key=Anv\u00E4nd 'Tilldela snabbkommando' fr\u00E5n Verktygs-menyn
+OptionPanel.time_for_automatic_save=Tid f\u00F6r att spara automatiskt
+OptionPanel.time_for_automatic_save.tooltip=<html> tid mellan tv\u00E5 p\u00E5f\u00F6ljande automatiskt sparade filer (i msec):<br> F\u00F6r att ta bort autospara s\u00E4tt v\u00E4rdet till 2000000000.</html>
+OptionPanel.time_for_delayed_selection=Tid f\u00F6r f\u00F6rdr?jd grenmarkering
+OptionPanel.time_for_delayed_selection.tooltip=<html> F\u00F6rdr?jd markeringstid (i msec) av grenar n\u00E4r musen f\u00F6rs \u00F6ver . <br>\u00C4ndra detta v\u00E4rde till 1 f?r direktval n\u00E4r musen f\u00F6rs \u00F6ver.</html>
OptionPanel.toolTipManager.dismissDelay=Visningstid (ms)
OptionPanel.toolTipManager.initialDelay=Tid innan visning (ms)
OptionPanel.toolTipManager.max_tooltip_width=Inforuta bredd
OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>Standard inforuta, bredd i pixlar.</html>
-OptionPanel.toolTipManager.reshowDelay=Tid innan \u00e5tervisning (ms)
+OptionPanel.toolTipManager.reshowDelay=Tid innan \u00E5tervisning (ms)
OptionPanel.tr=Tr
OptionPanel.uk_UA=Ukrainska
OptionPanel.undefined_font=Odefinierat teckensnitt
-OptionPanel.undo_levels=\u00c5ngra niv\u00e5er
-OptionPanel.undo_levels.tooltip=<html>Antal \u00e5ngrasteg som sparas.</html>
+OptionPanel.undo_levels=\u00C5ngra niv\u00E5er
+OptionPanel.undo_levels.tooltip=<html>Antal \u00E5ngrasteg som sparas.</html>
OptionPanel.unfold_on_paste=Visa gren vid inklistring
-OptionPanel.unfold_on_paste.tooltip=Visa gren vid inklistring eller drag-och-sl\u00e4pp
-OptionPanel.use_common_out_point_for_root_node=Kant startar fr\u00e5n en punkt p\u00e5 rotgrenen
-OptionPanel.use_common_out_point_for_root_node.tooltip=Kant startar fr\u00e5n en punkt p\u00e5 rotgrenen
-OptionPanel.use_tabbed_pane=Anv\u00e4nd flikar
+OptionPanel.unfold_on_paste.tooltip=Visa gren vid inklistring eller drag-och-sl\u00E4pp
+OptionPanel.use_common_out_point_for_root_node=Kant startar fr\u00E5n en punkt p\u00E5 rotgrenen
+OptionPanel.use_common_out_point_for_root_node.tooltip=Kant startar fr\u00E5n en punkt p\u00E5 rotgrenen
+OptionPanel.use_tabbed_pane=Anv\u00E4nd flikar
OptionPanel.use_tabbed_pane.tooltip=If selected the maps are displayed in tabs (like in FireFox :-) ).
-OptionPanel.validate_classpath_needs_readaccess=Scripting: When setting the classpath you have to permit read access on files!
-OptionPanel.validate_write_without_read=Scripting: consider to add Read/File to Write/File.
-OptionPanel.validation_error=<html><body>Validation error(s):<p><em>{0}</em><p>Please change the preferences to fix the error(s).</body></html>
-OptionPanel.validation_warning=<html><body>Validation warning(s):<p><em>{0}</em></body></html>
+OptionPanel.validate_classpath_needs_readaccess=Scripting: When setting the classpath you have to permit read access on files!
+OptionPanel.validate_write_without_read=Scripting: consider to add Read/File to Write/File.
+OptionPanel.validation_error=<html><body>Validation error(s):<p><em>{0}</em><p>Please change the preferences to fix the error(s).</body></html>
+OptionPanel.validation_warning=<html><body>Validation warning(s):<p><em>{0}</em></body></html>
OptionPanel.vi=Vietnamesiska
OptionPanel.wheel_velocity=Hastighet
-OptionPanel.wheel_velocity.tooltip=H\u00f6gre v\u00e4rde ger snabbare respons i tankekartan.
+OptionPanel.wheel_velocity.tooltip=H\u00F6gre v\u00E4rde ger snabbare respons i tankekartan.
OptionPanel.windows=Windows
OptionPanel.zh_CN=Zh CN
OptionPanel.zh_TW=Zh
@@ -942,21 +942,21 @@ org.freeplane.plugin.bugreport.always_agree=Skicka alltid
org.freeplane.plugin.bugreport.always_deny=Skicka aldrig
org.freeplane.plugin.bugreport.deny=Skicka inte
org.freeplane.plugin.bugreport.dialog.title=Automatisk bugrapport
-org.freeplane.plugin.bugreport.freeplane_team=Meddelande fr\u00e5n Freeplane-teamet
+org.freeplane.plugin.bugreport.freeplane_team=Meddelande fr\u00E5n Freeplane-teamet
org.freeplane.plugin.bugreport.lastreport=Senaste rapport mottagen
-org.freeplane.plugin.bugreport.never=Fr\u00e5ga aldrig om hj\u00e4lp
+org.freeplane.plugin.bugreport.never=Fr\u00E5ga aldrig om hj\u00E4lp
org.freeplane.plugin.bugreport.question=Freeplane has an automatic bug tracking engine.\nNo personal data or map content will ever be transmitted.\nBug reports will help us improve the software.
org.freeplane.plugin.bugreport.report=Nuvarande rapport
org.freeplane.plugin.bugreport.wanted_bug=An internal error occurred and was automatically reported.\nWe would like more information in order to reproduce the unexpected behavior.\nPlease help us by submitting a Bug Report to our Mantis bug tracker:\nexplain what you were doing at the time, so that we may reproduce the bug.\n\nPress OK to open the bug tracker page in your web browser.\n\nThank you for your help in making a bug fix possible.\nYour Freeplane Team
-out_of_memory=Slut p\u00e5 minne.
-overwrite_keyset_question=Skriv \u00f6ver nuvarande upps\u00e4ttning?
-PageAction.text=Utskriftsinst\u00e4llningar...
+out_of_memory=Slut p\u00E5 minne.
+overwrite_keyset_question=Skriv \u00F6ver nuvarande upps\u00E4ttning?
+PageAction.text=Utskriftsinst\u00E4llningar...
PasteAction.text=Klistra in
PatternNewNameProperty=Ny mall
-PatternToString.backgroundColor=Bakgrundsf\u00e4rg
-PatternToString.Child=Stil f\u00f6r barn-gren
-PatternToString.color=F\u00e4rg
-PatternToString.EdgeColor=Kantlinjens f\u00e4rg
+PatternToString.backgroundColor=Bakgrundsf\u00E4rg
+PatternToString.Child=Stil f\u00F6r barn-gren
+PatternToString.color=F\u00E4rg
+PatternToString.EdgeColor=Kantlinjens f\u00E4rg
PatternToString.EdgeStyle=Kantlinjens stil
PatternToString.EdgeWidth=Kantlinjens bredd
PatternToString.FontBold=Fet
@@ -968,12 +968,12 @@ periodic_formula={0} * n + {1}
plugins/latex/LatexNodeHook.editorTitle=Redigera Latex-kod
plugins/script_filter=Script Filter {0}
plugins/script_filter_error={0} had to return a boolean result on {1} but returned {2}
-plugins/ScriptEditor.cancel=Ignorera \u00e4ndringar och avsluta
+plugins/ScriptEditor.cancel=Ignorera \u00E4ndringar och avsluta
plugins/ScriptEditor.exit=Avsluta
plugins/ScriptEditor.FORBIDDEN_ACTION=Freeplane groovy scripts are restricted. The following {0,choice,0#File|1#Network|2#Exec} operation is forbidden: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write} {2}. You can change this in the program settings.
plugins/ScriptEditor.menu_actions=Kommandon
plugins/ScriptEditor.new_script=Nytt skript
-plugins/ScriptEditor.run=K\u00f6r
+plugins/ScriptEditor.run=K\u00F6r
plugins/ScriptEditor.sign=Signera skript...
plugins/ScriptEditor/window.Result=Resultat:
plugins/ScriptEditor/window.title=Skriptredigerare
@@ -987,151 +987,151 @@ plugins/TimeList.xml_Text=Text
plugins/TimeManagement.xml_appendButton=Bifoga datum till markerade grenar
plugins/TimeManagement.xml_Cancel=Avbryt
plugins/TimeManagement.xml_cancelButton=Avbryt
-plugins/TimeManagement.xml_closeButton=St\u00e4ng
+plugins/TimeManagement.xml_closeButton=St\u00E4ng
plugins/TimeManagement.xml_Export=Exportera markerade grenar
-plugins/TimeManagement.xml_Find=S\u00f6k
-plugins/TimeManagement.xml_Goto=G\u00e5 till
+plugins/TimeManagement.xml_Find=S\u00F6k
+plugins/TimeManagement.xml_Goto=G\u00E5 till
plugins/TimeManagement.xml_hour=Timme:
plugins/TimeManagement.xml_menu_actions=Aktion
plugins/TimeManagement.xml_minute=Minut:
-plugins/TimeManagement.xml_reminderButton=P\u00e5minn vid detta datum
-plugins/TimeManagement.xml_reminderButton_tooltip=<html>N\u00e4r en timer \u00e4r klickad p\u00e5, sker schemal\u00e4ggning till dagens datum.<br> Blinkande ikoner p\u00e5kallar din uppm\u00e4rksamhet.<br> N?r tankekartan st\u00e4ngs, \u00e5teraktiveras timern n\u00e4sta g\u00e5ng tankekartan \u00f6ppnas.</html>
-plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>F\u00f6r n\u00e4rvarande finns det enbart en p\u00e5minnelse per gren. <br>Den aktuella p\u00e5minnelsen \u00e4r schemalagd till {0,date} {0,time}, Valt var {1,date} {1,time}. <br><br>\u00e4ndra grenens p\u00e5minnelstid (Ja) <br>eller beh\u00e5ll den gamla (Nej)?</html>
-plugins/TimeManagement.xml_reminderNode_tooltip=P\u00e5minnelse {0,date} {0,time}.
-plugins/TimeManagement.xml_removeReminderButton=Ta bort p\u00e5minnelser
-plugins/TimeManagement.xml_removeReminderButton_tooltip=Ta bort alla p\u00e5minnelser fr\u00e5n markerade grenar.
-plugins/TimeManagement.xml_Replace=Ers\u00e4tt
-plugins/TimeManagement.xml_Replace_All=Ers\u00e4tt alla
-plugins/TimeManagement.xml_Replace_Selected=Ers\u00e4tt markerade
-plugins/TimeManagement.xml_Select=V\u00e4lj
+plugins/TimeManagement.xml_reminderButton=P\u00E5minn vid detta datum
+plugins/TimeManagement.xml_reminderButton_tooltip=<html>N\u00E4r en timer \u00E4r klickad p\u00E5, sker schemal\u00E4ggning till dagens datum.<br> Blinkande ikoner p\u00E5kallar din uppm\u00E4rksamhet.<br> N?r tankekartan st\u00E4ngs, \u00E5teraktiveras timern n\u00E4sta g\u00E5ng tankekartan \u00F6ppnas.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>F\u00F6r n\u00E4rvarande finns det enbart en p\u00E5minnelse per gren. <br>Den aktuella p\u00E5minnelsen \u00E4r schemalagd till {0,date} {0,time}, Valt var {1,date} {1,time}. <br><br>\u00E4ndra grenens p\u00E5minnelstid (Ja) <br>eller beh\u00E5ll den gamla (Nej)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip=P\u00E5minnelse {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton=Ta bort p\u00E5minnelser
+plugins/TimeManagement.xml_removeReminderButton_tooltip=Ta bort alla p\u00E5minnelser fr\u00E5n markerade grenar.
+plugins/TimeManagement.xml_Replace=Ers\u00E4tt
+plugins/TimeManagement.xml_Replace_All=Ers\u00E4tt alla
+plugins/TimeManagement.xml_Replace_Selected=Ers\u00E4tt markerade
+plugins/TimeManagement.xml_Select=V\u00E4lj
plugins/TimeManagement.xml_todayButton=Idag
plugins/TimeManagement.xml_WindowTitle=Tidsstyrning
-plugins/TimeManagement.xml_WindowTitle_All_Nodes=S\u00f6k och ers\u00e4tt
+plugins/TimeManagement.xml_WindowTitle_All_Nodes=S\u00F6k och ers\u00E4tt
preferences=Inst?llningar
-print_preview_title=F\u00f6rhandsgranskning
+print_preview_title=F\u00F6rhandsgranskning
PrintAction.text=Skriv ut...
PrintDirectAction.text=Skriv ut
printing_settings=Skala utskrift
-PrintPreviewAction.text=F\u00f6rhandsgranska utskrift...
-PropertyAction.dialog=Inst\u00e4llningar
-PropertyAction.text=Inst\u00e4llningar ...
+PrintPreviewAction.text=F\u00F6rhandsgranska utskrift...
+PropertyAction.dialog=Inst\u00E4llningar
+PropertyAction.text=Inst\u00E4llningar ...
QuickFilterAction.text=Snabbfilter
QuickFindAction.BACK.text=F?reg?ende
QuickFindAction.FORWARD.text=N?sta
QuickFindAllAction.text=Markera alla funna
QuitAction.text=Avsluta
-read_only=Enbart l\u00e4sr\u00e4ttighet
-ReadScriptError.text=Fel vid l\u00e4sning av skript\nSe loggfil f\u00f6r information.
+read_only=Enbart l\u00E4sr\u00E4ttighet
+ReadScriptError.text=Fel vid l\u00E4sning av skript\nSe loggfil f\u00F6r information.
really_convert_to_current_version=<html>This map was created with an older version of Freeplane. <br>Should it be converted (recommended)? <br>(Otherwise it is taken as it is without guarantee.) </html>
really_cut_node=Klippa ut grenarna?
-really_execute_script=K\u00f6r skripten i kartan?\n Det \u00e4r m\u00f6jligt att de \u00e4r skadliga f\u00f6r din dator.
+really_execute_script=K\u00F6r skripten i kartan?\n Det \u00E4r m\u00F6jligt att de \u00E4r skadliga f\u00F6r din dator.
really_remove_node=Radera grenarna?
really_remove_notes=Radera anteckningarna?
ReapplyFilterAction.text=Upprepa
red=R?d
-RedefineStyleAction.text=\u00c4ndra mall
-RedoAction.text=G\u00f6r om
-RedoFilterAction.text=G\u00f6r om
-regular_expressions=Regulj\u00e4r uttryck
-ReminderHookAction.text=Ta bort p\u00e5minnelser
-ReminderHookAction.tooltip=Tar bort en p\u00e5minnelse fr\u00e5n en gren.
+RedefineStyleAction.text=\u00C4ndra mall
+RedoAction.text=G\u00F6r om
+RedoFilterAction.text=G\u00F6r om
+regular_expressions=Regulj\u00E4r uttryck
+ReminderHookAction.text=Ta bort p\u00E5minnelser
+ReminderHookAction.tooltip=Tar bort en p\u00E5minnelse fr\u00E5n en gren.
remove_file_from_list_on_error=File {0} not opened. Remove it from the last opened file list?
-remove_shortcut_question=Ers\u00e4tt snabbkommando?
+remove_shortcut_question=Ers\u00E4tt snabbkommando?
RemoveAllIconsAction.text=Ta bort alla ikoner
-RemoveConnectorAction.text=Ta bort f\u00f6rbindelse
+RemoveConnectorAction.text=Ta bort f\u00F6rbindelse
RemoveFormatAction.text=Ta bort format
-RemoveIcon_0_Action.text=Ta bort f\u00f6rsta ikon
+RemoveIcon_0_Action.text=Ta bort f\u00F6rsta ikon
RemoveIconAction.text=Ta bort senaste ikon
RemoveNoteAction.text=Ta bort anteckningar
-RemoveNoteAction.tooltip=Ta bort anteckningar fr\u00e5n valda grenar.
+RemoveNoteAction.tooltip=Ta bort anteckningar fr\u00E5n valda grenar.
rename=Byt namn
-repair_link=Reparera l\u00e4nk
-repair_link_question=Kan inte l?sa in l\u00e4nkad tankekarta. Reparera l\u00e4nken manuellt?
-replace=Ers\u00e4tt
+repair_link=Reparera l\u00E4nk
+repair_link_question=Kan inte l?sa in l\u00E4nkad tankekarta. Reparera l\u00E4nken manuellt?
+replace=Ers\u00E4tt
ReportBugAction.text=Rapportera ett fel
-RequestFeatureAction.text=Beg\u00e4r en funktionalitet
-reset_to_default=Anv\u00e4nd standardv\u00e4rden
-ResetNodeLocationAction.text=\u00c5ngra grenplacering
-RevisionPluginAction.text=\u00c4ndra bakgrundsf\u00e4rg f\u00f6r revidering
-save_failed=F\u00f6rs\u00f6k att spara tankekartan {0} misslyckades.
+RequestFeatureAction.text=Beg\u00E4r en funktionalitet
+reset_to_default=Anv\u00E4nd standardv\u00E4rden
+ResetNodeLocationAction.text=\u00C5ngra grenplacering
+RevisionPluginAction.text=\u00C4ndra bakgrundsf\u00E4rg f\u00F6r revidering
+save_failed=F\u00F6rs\u00F6k att spara tankekartan {0} misslyckades.
save_unsaved=Spara tankekarta?
save_unsaved_styles=Spara mall?
-SaveAcceleratorPresetsAction.text=Spara snabbkommandoupps\u00e4ttning
+SaveAcceleratorPresetsAction.text=Spara snabbkommandoupps\u00E4ttning
SaveAction.text=Spara
SaveAll.text=Spara alla
-SaveAll.tooltip=Spara alla \u00f6ppna tankekartor
+SaveAll.tooltip=Spara alla \u00F6ppna tankekartor
SaveAsAction.text=Spara som...
saved=Sparad
saving_canceled=Sparandet avbrutet
-scheme_evaluate=Utv\u00e4rdera!
-script_execution_disabled=Skript k?rning avst?ngd
+scheme_evaluate=Utv\u00E4rdera!
+script_execution_disabled=Skript k?rning avst?ngd
ScriptEditor.text=Skriptredigerare...
-ScriptEditor.tooltip=M\u00f6jligg\u00f6r att skriva st\u00f6rre skript i Freeplane.
-ScriptEditorPanel.changed_cancel=Skript \u00e4ndrat. Spara \u00e4ndringen?
-select_favorites_folder=V\u00e4lj mappen med dina favoriter
-select_file_export_to=V\u00e4lj fil att exportera till
-select_folder_for_importing=V\u00e4lj mappen som ska importeras
-select_icon=V\u00e4lj en ikon
-select_menu_item_dialog=V\u00e4lj fr\u00e5n menyn
+ScriptEditor.tooltip=M\u00F6jligg\u00F6r att skriva st\u00F6rre skript i Freeplane.
+ScriptEditorPanel.changed_cancel=Skript \u00E4ndrat. Spara \u00E4ndringen?
+select_favorites_folder=V\u00E4lj mappen med dina favoriter
+select_file_export_to=V\u00E4lj fil att exportera till
+select_folder_for_importing=V\u00E4lj mappen som ska importeras
+select_icon=V\u00E4lj en ikon
+select_menu_item_dialog=V\u00E4lj fr\u00E5n menyn
select_menu_item_root_node=Meny
-SelectAllAction.text=V\u00e4lj alla synliga
-SelectBranchAction.text=V\u00e4lj synlig f\u00f6rgrening
+SelectAllAction.text=V\u00E4lj alla synliga
+SelectBranchAction.text=V\u00E4lj synlig f\u00F6rgrening
SelectedPasteAction.text=Klistra in som...
-selection_method_by_click=Enkelt musklick f\u00f6r att v\u00e4lja
-selection_method_delayed=F\u00f6rsenad automatisk markering
-selection_method_direct=Peka f\u00f6r att v\u00e4lja
-SelectNoteAction.text=Visa redigerare f\u00f6r anteckningar
-SelectNoteAction.tooltip=Anteckningsf\u00f6nster
-set_accelerator_on_next_click_action=Klicka p\u00e5 ett menyalterativ f\u00f6r att tilldela ett nytt snabbkommando
+selection_method_by_click=Enkelt musklick f\u00F6r att v\u00E4lja
+selection_method_delayed=F\u00F6rsenad automatisk markering
+selection_method_direct=Peka f\u00F6r att v\u00E4lja
+SelectNoteAction.text=Visa redigerare f\u00F6r anteckningar
+SelectNoteAction.tooltip=Anteckningsf\u00F6nster
+set_accelerator_on_next_click_action=Klicka p\u00E5 ett menyalterativ f\u00F6r att tilldela ett nytt snabbkommando
SetAcceleratorOnNextClickAction.text=Nytt snabbkommando
-SetImageByFileChooserAction.text=Bild (Dokumentv\u00e4ljare eller l\u00e4nk)...
-SetLinkByFileChooserAction.text=Hyperl\u00e4nk (Dokumentv\u00e4ljare)...
+SetImageByFileChooserAction.text=Bild (Dokumentv\u00E4ljare eller l\u00E4nk)...
+SetLinkByFileChooserAction.text=Hyperl\u00E4nk (Dokumentv\u00E4ljare)...
SetLinkByTextFieldAction.text=Hyperl?nk Manuell...
SetNoteWindowPosition.bottom.text=Nederst
-SetNoteWindowPosition.left.text=V\u00e4nster
-SetNoteWindowPosition.right.text=H\u00f6ger
-SetNoteWindowPosition.top.text=\u00d6verst
+SetNoteWindowPosition.left.text=V\u00E4nster
+SetNoteWindowPosition.right.text=H\u00F6ger
+SetNoteWindowPosition.top.text=\u00D6verst
SetShortenerStateAction.text=Visa/D?lj markering f?r extrainformation
-sf_login_required=SourceForge-login kr\u00e4vs. Forts\u00e4tta?
+sf_login_required=SourceForge-login kr\u00E4vs. Forts\u00E4tta?
ShowAllAttributesAction.text=Visa alla egenskaper
-ShowAncestorsAction.text=Visa f\u00f6r\u00e4ldragren
+ShowAncestorsAction.text=Visa f\u00F6r\u00E4ldragren
ShowAttributeDialogAction.text=Egenskapshanterare
ShowDescendantsAction.text=Visa undergren
-ShowFilterToolbarAction.text=Filter-verktygsf\u00e4lt
-ShowFormatPanel.text=Format f\u00f6nster
+ShowFilterToolbarAction.text=Filter-verktygsf\u00E4lt
+ShowFormatPanel.text=Format f\u00F6nster
ShowFormatPanel.tooltip=Presents a dialog in which node and edge attributes can be changed at once.
-ShowHideNoteAction.text=Anteckningsf\u00f6nster
-ShowHideNoteAction.tooltip=\u00c4r en menygenv\u00e4g f\u00f6r de sm\u00e5 pilarna p\u00e5 delningslinjen.
+ShowHideNoteAction.text=Anteckningsf\u00F6nster
+ShowHideNoteAction.tooltip=\u00C4r en menygenv\u00E4g f\u00F6r de sm\u00E5 pilarna p\u00E5 delningslinjen.
ShowNotesInMapAction.text=Visa anteckning i karta
ShowSelectedAttributesAction.text=Visa markerade egenskaper
-ShowSelectionAsRectangleAction.text=Rektangul\u00e4r markering
+ShowSelectionAsRectangleAction.text=Rektangul\u00E4r markering
simplyhtml.aboutFrameTitle=Om applikationen
simplyhtml.aboutLabel=Om SimplyHTML
simplyhtml.alignCenter=Centrerad
simplyhtml.alignLabel=Justering:
-simplyhtml.alignLeft=V\u00e4nster
-simplyhtml.alignRight=H\u00f6ger
+simplyhtml.alignLeft=V\u00E4nster
+simplyhtml.alignRight=H\u00F6ger
simplyhtml.allCellsRangeLabel=Alla celler
-simplyhtml.allOccurrencesReplaced=Alla f\u00f6rekomster ersatta
-simplyhtml.appendTableColLabel=L\u00e4gg till kolumn
-simplyhtml.appendTableRowLabel=L\u00e4gg till rad
-simplyhtml.applyCellAttrLabel=Till\u00e4mpa p\u00e5
+simplyhtml.allOccurrencesReplaced=Alla f\u00F6rekomster ersatta
+simplyhtml.appendTableColLabel=L\u00E4gg till kolumn
+simplyhtml.appendTableRowLabel=L\u00E4gg till rad
+simplyhtml.applyCellAttrLabel=Till\u00E4mpa p\u00E5
simplyhtml.backgroundLabel=Bakgrund:
simplyhtml.boldItalicName=Fet+kursiv
simplyhtml.boldName=Fet
-simplyhtml.borderColorLabel=F\u00e4rg:
+simplyhtml.borderColorLabel=F\u00E4rg:
simplyhtml.borderWidthLabel=Bredd
simplyhtml.bottomLabel=Nederst:
simplyhtml.cancelBtnName=Avbryt
simplyhtml.cellBorderTabLabel=Kantlinjer
-simplyhtml.cellGenTabLabel=Allm\u00e4n
+simplyhtml.cellGenTabLabel=Allm\u00E4n
simplyhtml.cellMarginTabLabel=Marginal
simplyhtml.cellPanelTitle=Cellformat
simplyhtml.clearFormatLabel=Ta bort format
simplyhtml.clearFormatTip=Ta bort format
-simplyhtml.close=St\u00e4ng
-simplyhtml.closeBtnName=St\u00e4ng
-simplyhtml.colorLabel=F\u00e4rg
+simplyhtml.close=St\u00E4ng
+simplyhtml.closeBtnName=St\u00E4ng
+simplyhtml.colorLabel=F\u00E4rg
simplyhtml.copyLabel=Kopiera
simplyhtml.copyTip=Kopiera
simplyhtml.cTagNameHead1=Rubrik 1
@@ -1140,7 +1140,7 @@ simplyhtml.cTagNameHead3=Rubrik 3
simplyhtml.cTagNameHead4=Rubrik 4
simplyhtml.cTagNameHead5=Rubrik 5
simplyhtml.cTagNameHead6=Rubrik 6
-simplyhtml.cTagNameLink=L\u00e4nk
+simplyhtml.cTagNameLink=L\u00E4nk
simplyhtml.cTagNameOL=Numrerad lista
simplyhtml.cTagNamePara=Stycke
simplyhtml.cTagNameUL=Onumrerad lista
@@ -1149,51 +1149,51 @@ simplyhtml.cutTip=Klipp ut
simplyhtml.defaultDocName=Dokumentnamn
simplyhtml.deleteTableColLabel=Ta bort kolumn
simplyhtml.deleteTableRowLabel=Ta bort rad
-simplyhtml.docTitleQuery=Namn p\u00e5 dokumenttitel:
+simplyhtml.docTitleQuery=Namn p\u00E5 dokumenttitel:
simplyhtml.docTitleTitle=Redigerat dokumenttitel
simplyhtml.editLabel=Redigera
simplyhtml.effectLabel=Effekt
simplyhtml.familyLabel=Familj
-simplyhtml.findNext=S\u00f6k n\u00e4sta...
-simplyhtml.findReplaceDialogTitle=S\u00f6k och ers\u00e4tt
-simplyhtml.findReplaceLabel=S\u00f6k och ers\u00e4tt
-simplyhtml.findReplaceTip=S\u00f6k och ers\u00e4tt
+simplyhtml.findNext=S\u00F6k n\u00E4sta...
+simplyhtml.findReplaceDialogTitle=S\u00F6k och ers\u00E4tt
+simplyhtml.findReplaceLabel=S\u00F6k och ers\u00E4tt
+simplyhtml.findReplaceTip=S\u00F6k och ers\u00E4tt
simplyhtml.fontBoldLabel=Fet
-simplyhtml.fontBoldTip=Fetstil av/p\u00e5
-simplyhtml.fontColorLabel=Textf\u00e4rg
-simplyhtml.fontColorTip=Textf\u00e4rg
+simplyhtml.fontBoldTip=Fetstil av/p\u00E5
+simplyhtml.fontColorLabel=Textf\u00E4rg
+simplyhtml.fontColorTip=Textf\u00E4rg
simplyhtml.fontDialogTitle=Val av teckensnitt
simplyhtml.fontItalicLabel=Kursiv
-simplyhtml.fontItalicTip=Kursiv av/p\u00e5
+simplyhtml.fontItalicTip=Kursiv av/p\u00E5
simplyhtml.fontLabel=Teckensnitt...
simplyhtml.fontTabLabel=Teckensnitt
simplyhtml.fontTip=Val av teckensnitt...
simplyhtml.fontUnderlineLabel=Understruken
-simplyhtml.fontUnderlineTip=Understruken av/p\u00e5
-simplyhtml.foregroundLabel=F\u00f6rgrund:
+simplyhtml.fontUnderlineTip=Understruken av/p\u00E5
+simplyhtml.foregroundLabel=F\u00F6rgrund:
simplyhtml.formatLabel=Format
simplyhtml.formatListLabel=Lista...
-simplyhtml.formatListTip=\u00c4ndra listformat
+simplyhtml.formatListTip=\u00C4ndra listformat
simplyhtml.formatParaLabel=Stycke...
-simplyhtml.formatParaTip=\u00c4ndra styckeformat
+simplyhtml.formatParaTip=\u00C4ndra styckeformat
simplyhtml.formatTableLabel=Tabell...
simplyhtml.formatTableTip=Formattera tabell
-simplyhtml.helpLabel=Hj\u00e4lp
+simplyhtml.helpLabel=Hj\u00E4lp
simplyhtml.htmlTabTitle=HTML-kodvy
simplyhtml.imageFileDesc=Bildfiler
simplyhtml.insertTableColLabel=Infoga kolumn
simplyhtml.insertTableLabel=Tabell...
-simplyhtml.insertTableMsg=Hur m\u00e5nga kolumner?
+simplyhtml.insertTableMsg=Hur m\u00E5nga kolumner?
simplyhtml.insertTableRowLabel=Infoga rad
simplyhtml.insertTableTitle=Infoga tabell
simplyhtml.italicName=Kursiv
simplyhtml.layoutTabTitle=Formatvy
-simplyhtml.leftLabel=V\u00e4nster:
+simplyhtml.leftLabel=V\u00E4nster:
simplyhtml.listDialogTitle=Formatera lista
simplyhtml.listIndentTitle=Indrag:
simplyhtml.listPosInside=Inuti
simplyhtml.listPositionLabel=Position:
-simplyhtml.listPosOutside=Utanf\u00f6r
+simplyhtml.listPosOutside=Utanf\u00F6r
simplyhtml.listTypeCircle=Rund punkt
simplyhtml.listTypeDecimal=1.,2.,3.,4.
simplyhtml.listTypeDisc=Filsymbol som punkt
@@ -1207,75 +1207,75 @@ simplyhtml.listTypeUpperRoman=I.,II.,III.,IV.
simplyhtml.marginLabel=Yttre
simplyhtml.matchCase=Skilj p? versaler/gemena
simplyhtml.newStyleDefaultName=Ny stil
-simplyhtml.nextTableCellLabel=N\u00e4sta cell
+simplyhtml.nextTableCellLabel=N\u00E4sta cell
simplyhtml.noLineLabel=Ingen
-simplyhtml.noMoreOccurrencesFound=Inga (fler) f\u00f6rekomster hittade
+simplyhtml.noMoreOccurrencesFound=Inga (fler) f\u00F6rekomster hittade
simplyhtml.okBtnName=OK
simplyhtml.paddingLabel=Inre
simplyhtml.paraAlignCenterLabel=Centrera
simplyhtml.paraAlignCenterTip=Centrera
-simplyhtml.paraAlignLeftLabel=V\u00e4nsterjustera
-simplyhtml.paraAlignLeftTip=V\u00e4nsterjustera stycke
-simplyhtml.paraAlignRightLabel=H\u00f6gerjustera
-simplyhtml.paraAlignRightTip=H\u00f6gerjustera stycke
+simplyhtml.paraAlignLeftLabel=V\u00E4nsterjustera
+simplyhtml.paraAlignLeftTip=V\u00E4nsterjustera stycke
+simplyhtml.paraAlignRightLabel=H\u00F6gerjustera
+simplyhtml.paraAlignRightTip=H\u00F6gerjustera stycke
simplyhtml.paraStyleDialogTitle=Styckestil
simplyhtml.paraTabLabel=Stycke
simplyhtml.pasteLabel=Klistra in
simplyhtml.pasteTip=Klistra in
simplyhtml.plainName=Enkel
-simplyhtml.previewLabel=F\u00f6rhandsgranska
-simplyhtml.previewText=F\u00f6rhandsgranska text
-simplyhtml.prevTableCellLabel=F\u00f6reg\u00e5ende cell
-simplyhtml.redoLabel=G\u00f6r om
-simplyhtml.redoTip=\u00c5terta
-simplyhtml.replace=Ers\u00e4tt...
+simplyhtml.previewLabel=F\u00F6rhandsgranska
+simplyhtml.previewText=F\u00F6rhandsgranska text
+simplyhtml.prevTableCellLabel=F\u00F6reg\u00E5ende cell
+simplyhtml.redoLabel=G\u00F6r om
+simplyhtml.redoTip=\u00C5terta
+simplyhtml.replace=Ers\u00E4tt...
simplyhtml.replaceAll=Alla
-simplyhtml.replaceDone=F\u00e4rdig
+simplyhtml.replaceDone=F\u00E4rdig
simplyhtml.replaceNo=Nej
-simplyhtml.replaceThisQuery=Ers\u00e4tt denna f\u00f6rekomst
-simplyhtml.replaceWith=Ers\u00e4tt med:
+simplyhtml.replaceThisQuery=Ers\u00E4tt denna f\u00F6rekomst
+simplyhtml.replaceWith=Ers\u00E4tt med:
simplyhtml.replaceYes=Ja
-simplyhtml.rightLabel=H\u00f6ger:
-simplyhtml.searchDown=S\u00f6k ned\u00e5t
-simplyhtml.searchFromStart=S\u00f6k fr\u00e5n b\u00f6rjan
-simplyhtml.searchUp=S\u00f6k upp\u00e5t
+simplyhtml.rightLabel=H\u00F6ger:
+simplyhtml.searchDown=S\u00F6k ned\u00E5t
+simplyhtml.searchFromStart=S\u00F6k fr\u00E5n b\u00F6rjan
+simplyhtml.searchUp=S\u00F6k upp\u00E5t
simplyhtml.selectAllLabel=Markera alla
simplyhtml.sizeLabel=Storlek
simplyhtml.standardStyleName=Standard
simplyhtml.strikeLabel=Genomstruken
simplyhtml.styleLabel=Mall
-simplyhtml.styleNameInputText=Namn p\u00e5 ny mall?
+simplyhtml.styleNameInputText=Namn p\u00E5 ny mall?
simplyhtml.styleNameInputTitle=Spara mall
-simplyhtml.tableBgColLabel=Bakgrundsf\u00e4rg:
+simplyhtml.tableBgColLabel=Bakgrundsf\u00E4rg:
simplyhtml.tableDialogTitle=Formatera tabell
simplyhtml.tableLabel=Tabell
simplyhtml.tablePanelTitle=Tabellformat
simplyhtml.tableWidthLabel=Bredd:
simplyhtml.textIndentLabel=Indrag:
-simplyhtml.textToFind=S\u00f6k efter text:
+simplyhtml.textToFind=S\u00F6k efter text:
simplyhtml.thisCellRangeLabel=Denna cell
simplyhtml.thisColRangeLabel=Denna kolumn
simplyhtml.thisRowRangeLabel=Denna rad
-simplyhtml.toggleBulletsLabel=Punktlista p\u00e5/av
-simplyhtml.toggleBulletsTip=Punktlista p\u00e5/av
-simplyhtml.toggleNumbersLabel=Nummerlista p\u00e5/av
-simplyhtml.toggleNumbersTip=Nummerlista p\u00e5/av
-simplyhtml.topLabel=\u00d6verst:
+simplyhtml.toggleBulletsLabel=Punktlista p\u00E5/av
+simplyhtml.toggleBulletsTip=Punktlista p\u00E5/av
+simplyhtml.toggleNumbersLabel=Nummerlista p\u00E5/av
+simplyhtml.toggleNumbersTip=Nummerlista p\u00E5/av
+simplyhtml.topLabel=\u00D6verst:
simplyhtml.uLineLabel=Understruken
-simplyhtml.unableToOpenFileError=Filen kan inte \u00f6ppnas
-simplyhtml.unableToRedoError=Om\u00f6jligt att \u00e5terta:
-simplyhtml.unableToUndoError=Om\u00f6jligt att \u00e5ngra:
-simplyhtml.undoLabel=\u00c5ngra
-simplyhtml.undoTip=\u00c5ngra
+simplyhtml.unableToOpenFileError=Filen kan inte \u00F6ppnas
+simplyhtml.unableToRedoError=Om\u00F6jligt att \u00E5terta:
+simplyhtml.unableToUndoError=Om\u00F6jligt att \u00E5ngra:
+simplyhtml.undoLabel=\u00C5ngra
+simplyhtml.undoTip=\u00C5ngra
simplyhtml.valignBaseline=Baslinjen
simplyhtml.valignBottom=Underst
simplyhtml.valignLabel=Vert. justerad:
simplyhtml.valignMiddle=Mitten
-simplyhtml.valignTop=\u00d6verst
+simplyhtml.valignTop=\u00D6verst
simplyhtml.wholeWordsOnly=Enbart hela ord
SortNodes.text=Sortera undergrenar
SortNodes.tooltip=Sortera alla undergrenar i alfabetisk ordning.
-split=Dela
+split=&Dela
SplitConditionAction.text=Dela upp
SplitNode.text=Dela upp gren
SplitNode.tooltip=<html>Gren delas upp</html>
@@ -1297,12 +1297,12 @@ styles.idea=Id?
styles.important=Viktig
styles.key=Nyckel
styles.list=Lista
-styles.needs_action=\u00c5tg\u00e4rda
+styles.needs_action=\u00C5tg\u00E4rda
styles.note=Anteckning
styles.ok=OK
styles.pending=Vilande
styles.predefined=Definerade mallar
-styles.question=Fr\u00e5ga
+styles.question=Fr\u00E5ga
styles.quotation=Citat
styles.root_node=Utseende
styles.subsubtopic=Rubrik 3
@@ -1314,48 +1314,48 @@ styles_menu=Mallar
submenu_keystroke_in_use_error=Keystroke {0} can not be used for submenu {1}. Keystroke removed.
svg=SVG
template_dir=Standard Mallar
-TimeListAction.text=Visa schemal\u00e4ggning ...
-TimeListAction.tooltip=Visar alla schemalagda tider och ber\u00f6rda grenar.
+TimeListAction.text=Visa schemal\u00E4ggning ...
+TimeListAction.tooltip=Visar alla schemalagda tider och ber\u00F6rda grenar.
TimeManagementAction.text=Visa kalender...
TimeManagementAction.tooltip=<html>Visar kalendermodulen av Kai Toedter.</html>
ToggleChildrenFoldedAction.text=Visa/D?lj underliggande grenar
ToggleDetailsAction.text=Visa grenens extrainformation
ToggleFBarAction.text=F-kommandon
ToggleFoldedAction.text=Visa/D?lj grenar
-ToggleFullScreenAction.text=Helsk\u00e4rm
-ToggleLeftToolbarAction.text=V\u00e4nster verktygsf\u00e4lt
+ToggleFullScreenAction.text=Helsk\u00E4rm
+ToggleLeftToolbarAction.text=V\u00E4nster verktygsf\u00E4lt
ToggleMenubarAction.text=Menyrad
-ToggleToolbarAction.text=Verktygsf\u00e4lt
-undefined_error=Ett ov\u00e4ntat fel har skett. Skicka en felrapport.
+ToggleToolbarAction.text=Verktygsf\u00E4lt
+undefined_error=Ett ov\u00E4ntat fel har skett. Skicka en felrapport.
underline=Understruken
UnderlineAction.text=Understrykning
underlined=Understruken
-UndoAction.text=\u00c5ngra
-UndoFilterAction.text=\u00c5ngra
-unfold=Visa f\u00f6rgrening
+UndoAction.text=\u00C5ngra
+UndoFilterAction.text=\u00C5ngra
+unfold=Visa f\u00F6rgrening
UnfoldAllAction.text=Visa alla
UnfoldAllAction.tooltip=<html>Visar markerade grenar och alla undergrenar.</html>
-UnfoldOneLevelAction.text=Visa en niv\u00e5
-UnfoldOneLevelAction.tooltip=<html>Visar markerade grenar med en niv\u00e5.</html>
+UnfoldOneLevelAction.text=Visa en niv\u00E5
+UnfoldOneLevelAction.tooltip=<html>Visar markerade grenar med en niv\u00E5.</html>
up=&Upp
update_failed=Update failed with message {0}
UpdateCheckAction.text=Leta efter uppdateringar
-updatecheckdialog=Uppdateringsf\u00f6nster
-url_error=URL:en \u00e4r felaktig!
-url_load_error=Kan inte h\u00e4mta URL:ens tankekarta:
-url_open_error=Kan inte \u00f6ppna URL:en {0}
-used_in_menu=Detta kortkommando kan inte anv\u00e4ndas, anv\u00e4nds av ett menyalternativ.
-UsePlainTextAction.text=Anv\u00e4nd enkel text
-user_config_folder=Mapp f\u00f6r egna inst\u00e4llningar: {0}
+updatecheckdialog=Uppdateringsf\u00F6nster
+url_error=URL:en \u00E4r felaktig!
+url_load_error=Kan inte h\u00E4mta URL:ens tankekarta:
+url_open_error=Kan inte \u00F6ppna URL:en {0}
+used_in_menu=Detta kortkommando kan inte anv\u00E4ndas, anv\u00E4nds av ett menyalternativ.
+UsePlainTextAction.text=Anv\u00E4nd enkel text
+user_config_folder=Mapp f\u00F6r egna inst\u00E4llningar: {0}
user_defined_scale=Egendefinierad skala
user_defined_zoom=Egendefinierad.
-user_defined_zoom_status_bar=F\u00f6r\u00e4ndrar zoom till egendefinierad zoom med v\u00e4rde {0}%.
+user_defined_zoom_status_bar=F\u00F6r\u00E4ndrar zoom till egendefinierad zoom med v\u00E4rde {0}%.
user_icon=Egen ikon "{0}"
user_template_dir=Egna mallar
user_zoom=Utskrift med zoomfaktor (0.0 - 2.0):
version_up_to_date=Senaste versionen redan installerad
-ViewerControllerAction.text=Externt objekt...
-ViewLayoutTypeAction.OUTLINE.text=\u00d6versiktsvy
+view=Visa
+ViewLayoutTypeAction.OUTLINE.text=\u00D6versiktsvy
WebDocuAction.text=Webbdokumentation
width=Bredd
wrong_regexp=Wrong regular expression "{0}", error {1}
diff --git a/freeplane/resources/translations/Resources_tr.properties b/freeplane/resources/translations/Resources_tr.properties
index 887b5b2..2fa4dd5 100644
--- a/freeplane/resources/translations/Resources_tr.properties
+++ b/freeplane/resources/translations/Resources_tr.properties
@@ -94,6 +94,7 @@ ExportToImage.png.text=PNG Olarak...
ExportToOoWriter.text=Open Office Writer Belgesi olarak...
ExportToOoWriter.tooltip=Geni\u015Fletilmi\u015F d\u00FC\u011F\u00FCmler yap\u0131y\u0131, daralt\u0131lm\u0131\u015F d\u00FC\u011F\u00FCmleri belgenin i\u00E7eri\u011Fini olu\u015Fturur.
extension_menu=Fiziksel Bi\u00E7em
+extras=Ara\u00E7lar
f_button_unassigned=<no action>[translate me]
FaqOpenURLAction.text=SSS
file=Dosya
@@ -116,6 +117,7 @@ FollowLinkAction.text=Git:
font=Yaz\u0131tipi
FontFamilyAction.text=yaz\u0131tipi ailesi
FontSizeAction.text=yaz\u0131tipi boyutu
+format=Bi\u00E7im
format_menu_edge_styles=S\u0131n\u0131r Bi\u00E7emleri
format_menu_edge_widths=S\u0131n\u0131r Geni\u015Flikleri
FormatCopy.text=Bi\u00E7imi Kopyala
@@ -210,7 +212,6 @@ increase_branch_font_size=Yaz\u0131tipini B\u00FCy\u00FClt
IncreaseNodeFontAction.text=Yaz\u0131tipini B\u00FCy\u00FClt
ItalicAction.text=Yat\u0131k
italicise_branch=Yat\u0131kla\u015Ft\u0131r
-JoinNodesAction.text=D\u00FC\u011F\u00FCmleri Birle\u015Ftir
less_than_two_selected_nodes=Ba\u011Flant\u0131 olu\u015Fturmak i\u00E7in en az iki d\u00FC\u011F\u00FCm se\u00E7melisiniz.
link_not_available_any_more=Ba\u011Flant\u0131 art\u0131k ge\u00E7erli de\u011Fil. Aradaki d\u00FC\u011F\u00FCm silinmi\u015F.
locking_failed_by_open={0} haritas\u0131n\u0131n kilitlenmesi ba\u015Far\u0131s\u0131z oldu. Salt okunur olarak a\u00E7\u0131l\u0131yor.
@@ -222,12 +223,7 @@ map_already_exists=Harita zaten var. \u00DCzerine yazmak ister misiniz?
map_corrupted=Harita bozuk. Ayr\u0131nt\u0131lar?
map_locked_by_open={0} haritas\u0131 \u015Fu an {1} kullan\u0131c\u0131s\u0131 taraf\u0131ndan d\u00FCzenleniyor. Salt okunur olarak a\u00E7\u0131l\u0131yor.
map_locked_by_save_as={0} haritas\u0131 \u015Fu an {1} kullan\u0131c\u0131s\u0131 taraf\u0131ndan d\u00FCzenleniyor. Farkl\u0131 Kaydetme \u0130ptal Edildi.
-menu_extras=Ara\u00E7lar
-menu_file_import=\u0130\u00E7e Aktar
-menu_format=Bi\u00E7im
menu_insert=Ekle
-menu_navigate=Git
-menu_view=G\u00F6r\u00FCn\u00FCm
mindmap=Harita
mindmaps=Haritalar
mindmaps_desc=Haritalar (*.mm)
@@ -237,6 +233,7 @@ mode_title=Freeplane - {0} Modu
modes=Modlar
most_recent_files=Son Kullan\u0131lanlar
MoveToRootAction.text=K\u00F6ke ta\u015F\u0131
+navigate=Git
NavigationNextMapAction.text=Sonraki Harita
NavigationPreviousMapAction.text=\u00D6nceki Harita
new_mindmap=Yeni Zihin Haritas\u0131
@@ -524,7 +521,7 @@ simplyhtml.uLineLabel=Alt\u0131n\u0131 \u00C7iz
simplyhtml.undoLabel=Geri Al
simplyhtml.valignBaseline=baseline[translate me]
simplyhtml.valignLabel=Vert. Alignment:[translate me]
-split=B\u00F6l
+split=&B\u00F6l
style=Bi\u00E7em
svg=SVG[translate me]
TimeListAction.text=Zamanlay\u0131c\u0131 Listesini G\u00F6ster ...
@@ -552,6 +549,7 @@ url_load_error=Harita y\u00FCklenemedi URL:
user_defined_zoom=Kullan\u0131c\u0131 tan\u0131ml\u0131.
user_defined_zoom_status_bar=Yak\u0131nla\u015Ft\u0131rma kullan\u0131c\u0131 tan\u0131ml\u0131 olarak de\u011Fi\u015Ftirildi {0}%.
user_zoom=\u00D6l\u00E7ek \u00E7arpan\u0131n\u0131 yazd\u0131r (0.0 - 2.0):
+view=G\u00F6r\u00FCn\u00FCm
width=Geni\u015Flik
yes=Evet
ZoomInAction.text=Yakla\u015F
diff --git a/freeplane/resources/translations/Resources_uk_UA.properties b/freeplane/resources/translations/Resources_uk_UA.properties
index 49af676..9318887 100644
--- a/freeplane/resources/translations/Resources_uk_UA.properties
+++ b/freeplane/resources/translations/Resources_uk_UA.properties
@@ -1,91 +1,365 @@
-AboutAction.text=\u041F\u0440\u043E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443...
+about_text=Freeplane - \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430 \u0434\u043B\u044F \u0440\u043E\u0431\u043E\u0442\u0438 \u0437 \u043A\u0430\u0440\u0442\u0430\u043C\u0438 \u0437\u043D\u0430\u043D\u044C \u0442\u0430 \u043F\u0440\u0438\u0439\u043D\u044F\u0442\u0442\u044F \u0440\u0456\u0448\u0435\u043D\u044C
+AboutAction.text=\u041F\u0440\u043E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443
+acceleratorPresets=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0456 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448
+accelerators_loading_error=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0430\u043A\u0441\u0435\u043B\u0435\u0440\u0430\u0442\u043E\u0440\u0456\u0432 \u0437 {0}
+accessories/plugins/ApplyFormatPlugin.dialog.title=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0432\u0443\u0437\u043B\u0456\u0432
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0441\u0442\u0438\u043B\u044C
accessories/plugins/EncryptNode.properties_0=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
-accessories/plugins/EncryptNode.properties_1=\u041D\u0435\u0432\u0456\u0440\u043D\u0438\u0439 \u0430\u0431\u043E \u0434\u0443\u0436\u0435 \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0439 \u043F\u0430\u0440\u043E\u043B\u044C
+accessories/plugins/EncryptNode.properties_1=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0430\u0431\u043E \u0434\u0443\u0436\u0435 \u043A\u043E\u0440\u043E\u0442\u043A\u0438\u0439 \u043F\u0430\u0440\u043E\u043B\u044C.
accessories/plugins/EncryptNode.properties_2=\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C:
accessories/plugins/EncryptNode.properties_3=\u041F\u043E\u0432\u0442\u043E\u0440\u0456\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C:
accessories/plugins/EncryptNode.properties_4=\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C.
-accessories/plugins/EncryptNode.properties_5=<html> \u0412\u0440\u0430\u0445\u0443\u0439\u0442\u0435 \u0449\u043E \u044F\u043A\u0456\u0441\u0442\u044C \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F <br> \u0437\u0430\u043B\u0435\u0436\u0438\u0442\u044C \u0432\u0456\u0434 \u044F\u043A\u043E\u0441\u0442\u0456 \u043F\u0430\u0440\u043E\u043B\u044F
+accessories/plugins/EncryptNode.properties_5=<html>\u0412\u0440\u0430\u0445\u0443\u0439\u0442\u0435 \u0449\u043E \u044F\u043A\u0456\u0441\u0442\u044C \u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F <br> \u0437\u0430\u043B\u0435\u0436\u0438\u0442\u044C \u0432\u0456\u0434 \u044F\u043A\u043E\u0441\u0442\u0456 \u043F\u0430\u0440\u043E\u043B\u044F.
accessories/plugins/EncryptNode.properties_6=\u0413\u0430\u0440\u0430\u0437\u0434
-accessories/plugins/EncryptNode.properties_7=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438
-accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=<html> \u0426\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u044F \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0430\u043D\u0430 \u0442\u0456\u043B\u044C\u043A\u0438 \u0434\u043E \u0456\u0441\u043D\u0443\u044E\u0447\u043E\u0433\u043E \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430 <br> \u0412\u0438 \u [...]
-accessories/plugins/EncryptNode.properties_select_me=\u0412\u0438\u0431\u0435\u0440\u0438 \u043C\u0435\u043D\u0435.
-accessories/plugins/EncryptNode.properties_wrong_password=\u041D\u0435\u0432\u0456\u0440\u043D\u0438\u0439 \u043F\u0430\u0440\u043E\u043B\u044C
-accessories/plugins/ExportWithXSLT.tooltip=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 XSLT - \u0441\u043A\u0440\u0438\u043F\u0442
+accessories/plugins/EncryptNode.properties_7=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=\u041F\u0435\u0440\u0435\u043C\u0438\u043A\u0430\u0442\u0438 \u0437\u0430\u0445\u0438\u0441\u0442 \u043F\u0430\u0440\u043E\u043B\u0435\u043C (\u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F) \u043C\u043E\u0436\u043D\u0430 \u0442\u0456\u043B\u044C\u043A\u0438 \u0434\u043B\u044F \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430. \u0421\u0442\u0432\ [...]
+accessories/plugins/EncryptNode.properties_select_me=\u0412\u0438\u0431\u0435\u0440\u0438 \u043C\u0435\u043D\u0435 \u0434\u043B\u044F \u043F\u0440\u043E\u0434\u043E\u0432\u0436\u0435\u043D\u043D\u044F!
+accessories/plugins/EncryptNode.properties_wrong_password=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u043F\u0430\u0440\u043E\u043B\u044C.
+accessories/plugins/ExportWithTWiki.text=\u042F\u043A TWiki...
+accessories/plugins/ExportWithTWiki.tooltip=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043A\u0430\u0440\u0442\u0443 \u044F\u043A \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 TWiki.
+accessories/plugins/ExportWithXSLT.tooltip=\u0426\u0435 \u043E\u0434\u043D\u043E\u0440\u0456\u0434\u043D\u0438\u0439 \u043C\u0435\u0442\u043E\u0434 \u0435\u043A\u0441\u043F\u043E\u0440\u0442\u0443.
+accessories/plugins/ExportWithXSLT_Applet.text=\u042F\u043A java-\u0430\u043F\u043B\u0435\u0442...
+accessories/plugins/ExportWithXSLT_Applet.tooltip=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043A\u0430\u0440\u0442\u0443 \u044F\u043A java-\u0430\u043F\u043B\u0435\u0442 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0433\u043B\u044F\u0434\u0443 \u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0456.
+accessories/plugins/ExportWithXSLT_Flash.text=\u042F\u043A Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u044F\u043A \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443 flash.
accessories/plugins/ExportWithXSLT_HTML.text=\u042F\u043A XHTML (\u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 Javascript)...
accessories/plugins/ExportWithXSLT_HTML3.text=\u042F\u043A XHTML (\u0437 \u043D\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u0439\u043D\u043E\u044E \u043A\u0430\u0440\u0442\u0438\u043D\u043A\u043E\u044E)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=\u0420\u0435\u0441\u0443\u0440\u0441\u0438 \u0437 \u0432\u0443\u0437\u043B\u0430 RESOURCES \u0443 \u0444\u0430\u0439\u043B \u0434\u043B\u044F TaskJuggler...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0454 \u0440\u0435\u0441\u0443\u0440\u0441\u0438 \u0437 \u0432\u0443\u0437\u043B\u0430 RESOURCES \u0434\u043E \u043C\u043E\u0434\u0443\u043B\u044F Taskjuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text=\u0417\u0430\u0434\u0430\u0447\u0456 \u0437 \u0432\u0443\u0437\u043B\u0430 TASKS \u0443 \u0444\u0430\u0439\u043B \u0434\u043B\u044F TaskJuggler...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0454 \u0437\u0430\u0434\u0430\u0447\u0456 \u0437 \u0432\u0443\u0437\u043B\u0430 TASKS \u0443 \u043C\u043E\u0434\u0443\u043B\u044C Taskjuggler. </html>
+action_keystroke_in_use_error=\u041A\u043B\u0430\u0432\u0456\u0448\u0430 {0}, \u0449\u043E \u043F\u0440\u0438\u0437\u043D\u0430\u0447\u0430\u0454\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u0456\u0457 {1} \u0432\u0436\u0435 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u0434\u0456\u0457 {2}
+active=\u0410\u043A\u0442\u0438\u0432\u043D\u0438\u0439
+actual_map_styles=\u0423\u043C\u043E\u0432\u043D\u0456 \u0441\u0442\u0438\u043B\u0456 \u043A\u0430\u0440\u0442\u0438, \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0430\u043D\u0456 \u0434\u043E \u0432\u0443\u0437\u043B\u0430
+actual_node_styles=\u0423\u043C\u043E\u0432\u043D\u0456 \u0441\u0442\u0438\u043B\u0456 \u0432\u0443\u0437\u043B\u0430, \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0430\u043D\u0456 \u0434\u043E \u0432\u0443\u0437\u043B\u0430
+add=&\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u0438
+AddConnectorAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u0437\u0432'\u044F\u0437\u043E\u043A
+AddElementaryConditionAction.text=\u0414\u043E\u0434\u0430\u0442\u0438
+AddExecutionLinkAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u0433\u0456\u043F\u0435\u0440\u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0434\u043B\u044F \u0432\u0438\u043A\u043E\u043D\u0430\u043D\u043D\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u0438 \u041E\u0421...
AddLocalLinkAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+AddMenuItemLinkAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u043F\u0443\u043D\u043A\u0442 \u0437 \u043C\u0435\u043D\u044E...
+AddOnDetailsPanel.authored.by=\u0410\u0432\u0442\u043E\u0440 {0}
+AddOnDetailsPanel.header.function=\u041F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F
+AddOnDetailsPanel.header.menu=\u041F\u0443\u043D\u043A\u0442 \u043C\u0435\u043D\u044E
+AddOnDetailsPanel.header.shortcut=\u0421\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448
+AddOnDetailsPanel.homepage=\u0414\u043E\u043C\u0430\u0448\u043D\u044F \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430:
+addons.installer.canceled=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u043E
+addons.installer.confirm.licence=<html><body><h1>\u041B\u0456\u0446\u0435\u043D\u0437\u0456\u044F</h1>{0}<p><p><em>\u0412\u0438 \u043F\u0440\u0438\u0439\u043C\u0430\u0454\u0442\u0435 \u0443\u043C\u043E\u0432\u0438 \u043B\u0456\u0446\u0435\u043D\u0437\u0456\u0457?</em></p></body></html>
+addons.installer.failed=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F: {0}
+addons.installer.freeplaneversion.format.error=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u0432 {0} (\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F: {1})
+addons.installer.html.script=\u0422\u0456\u043B\u043E \u0441\u0446\u0435\u043D\u0430\u0440\u0456\u044E \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0432\u0456\u0434\u0444\u043E\u0440\u043C\u0430\u0442\u043E\u0432\u0430\u043D\u043E \u044F\u043A HTML
+addons.installer.install=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438
+addons.installer.invalid.keyboard.shortcut=\u041D\u0435\u0434\u0456\u0439\u0441\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F {0}.
+addons.installer.licence.unchanged=\u041B\u0456\u0446\u0435\u043D\u0437\u0456\u044F \u043D\u0435 \u0437\u043C\u0456\u043D\u044E\u0454\u0442\u044C\u0441\u044F
+addons.installer.map.structure=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0432 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0456 \u043A\u0430\u0440\u0442\u0438: {0}
+addons.installer.missing.child.nodes=\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456 \u0434\u043E\u0447\u0456\u0440\u043D\u0456 \u0432\u0443\u0437\u043B\u0438: {0}
+addons.installer.missing.permission.attribute=\u0421\u0446\u0435\u043D\u0430\u0440\u0456\u0439 {0}: \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u0456 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0434\u043E\u0437\u0432\u043E\u043B\u0443 {1}
+addons.installer.missing.properties=\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456 \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456: {0}
+addons.installer.missing.translation=\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439 \u043F\u0435\u0440\u0435\u043A\u043B\u0430\u0434 {0} \u0432 \u043C\u043E\u0432\u0456 {1}
+addons.installer.no.scripts=\u0421\u0446\u0435\u043D\u0430\u0440\u0456\u0457\u0432 \u043D\u0435 \u0432\u0438\u044F\u0432\u043B\u0435\u043D\u043E
+addons.installer.no.zipdata=\u041D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u0456 \u0434\u0430\u043D\u0456 zip-\u0430\u0440\u0445\u0456\u0432\u0443
+addons.installer.nonstandard.permissions=\u0414\u043B\u044F \u0441\u0446\u0435\u043D\u0430\u0440\u0456\u044E \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0456 \u0442\u0430\u043A\u0456 \u0434\u043E\u0437\u0432\u043E\u043B\u0438, \u044F\u043A\u0456 \u0437\u0430\u0440\u0430\u0437 \u043D\u0435 \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u0456: {0}.\u21B5\n\u0414\u043E\u0434\u0430\u0442\u0438 \u0457\u0445 \u0434\u043E \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0445 \u04 [...]
+addons.installer.one.child.expected=\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u0432\u0441\u044F \u0432\u0441\u044C\u043E\u0433\u043E \u043E\u0434\u0438\u043D \u043D\u0430\u0449\u0430\u0434\u043E\u043A \u0432\u0456\u0434 {0}, \u0430 \u043E\u0442\u0440\u0438\u043C\u0430\u043D\u043E {1}.
+addons.installer.script.name.suffix=\u041D\u0430\u0437\u0432\u0430 \u0441\u0446\u0435\u043D\u0430\u0440\u0456\u044E {0} \u043D\u0435 \u043C\u0430\u0454 \u0440\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u043D\u0430 \u0437\u0440\u0430\u0437\u043E\u043A ".groovy"
+addons.installer.script.no.execution_mode=\u041D\u0435 \u0432\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u0430\u0442\u0440\u0438\u0431\u0443\u0442 "execution_mode" (\u0440\u0435\u0436\u0438\u043C \u0432\u0438\u043A\u043E\u043D\u0430\u043D\u043D\u044F) \u0434\u043B\u044F {0}
+addons.installer.script.no.menulocation=\u041D\u0435 \u0432\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u0430\u0442\u0440\u0438\u0431\u0443\u0442 "menuLocation" (\u043F\u0443\u043D\u043A\u0442 \u043C\u0435\u043D\u044E) \u0434\u043B\u044F {0}
+addons.installer.script.no.menutitle=\u041D\u0435 \u0432\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u0430\u0442\u0440\u0438\u0431\u0443\u0442 "menuTitleKey" (\u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u043C\u0435\u043D\u044E) \u0434\u043B\u044F {0}
+addons.installer.script.no.permissions=\u041D\u0435 \u0432\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u0434\u043E\u0437\u0432\u043E\u043B\u0438 \u0434\u043B\u044F {0}
+addons.installer.success=\u0423\u0441\u043F\u0456\u0448\u043D\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F.\u21B5\n\u041D\u043E\u0432\u0435 \u0434\u043E\u043F\u043E\u0432\u043D\u0435\u043D\u043D\u044F \u0431\u0443\u0434\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043F\u0456\u0441\u043B\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F.
+addons.installer.success.update=\u041E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0437 {0} \u043D\u0430 {1} \u0443\u0441\u043F\u0456\u0448\u043D\u043E \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E.\u21B5\n\u0414\u0435\u044F\u043A\u0456 \u0444\u0443\u043D\u043A\u0446\u0456\u0457 \u0441\u0442\u0430\u043D\u0443\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u043C\u0438 \u043B\u0438\u0448\u0435 \u043F\u0456\u0441\u043B\u044F \u043F\u0435\u0440\u0435\u0437\u0430\ [...]
+addons.installer.title=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u044E\u0432\u0430\u0447 \u0434\u043E\u0434\u0430\u0442\u043A\u0456\u0432
+addons.installer.too.new=\u041F\u043E\u0442\u043E\u0447\u043D\u0430 \u0432\u0435\u0440\u0441\u0456\u044F Freeplane {0} \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u043D\u043E\u0432\u0430. \u0426\u0435\u0439 \u0434\u043E\u0434\u0430\u0442\u043E\u043A \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454 \u0432\u0435\u0440\u0441\u0456\u044E \u043D\u0435 \u0432\u0438\u0449\u0443 \u043D\u0456\u0436 {1}
+addons.installer.too.old=\u041F\u043E\u0442\u043E\u0447\u043D\u0430 \u0432\u0435\u0440\u0441\u0456\u044F Freeplane {0} \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0441\u0442\u0430\u0440\u0430. \u0426\u0435\u0439 \u0434\u043E\u0434\u0430\u0442\u043E\u043A \u0432\u0438\u043C\u0430\u0433\u0430\u0454 \u043F\u0440\u0438\u043D\u0430\u0439\u043C\u043D\u0456 \u0432\u0435\u0440\u0441\u0456\u044E {1}
+addons.installer.unknown.deinstallation.rules=\u041D\u0435\u0432\u0456\u0434\u043E\u043C\u0456 \u043F\u0440\u0430\u0432\u0438\u043B\u0430 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043D\u044F {0}
+addons.installer.update=\u041E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0437 \u0432\u0435\u0440\u0441\u0456\u0457 {0}
+addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">\u0414\u043E\u0434\u0430\u0442\u043A\u0438 \u0441\u043B\u0456\u0434 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u044E\u0432\u0430\u0442\u0438 \u043B\u0438\u0448\u0435 \u0437 \u0434\u043E\u0432\u0456\u0440\u0435\u043D\u0438\u0445 \u0434\u0436\u0435\u0440\u0435\u043B. \u0428\u043A\u0456\u0434\u043B\u0438\u0432\u0456 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438 \u043C\u043E\u0436\u0443\u0442\u044C \u043 [...]
+addons.site=http://freeplane.sourceforge.net/addons/
+AddStyleAttributes.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0441\u0442\u0438\u043B\u044E
+AddStyleAttributes.tooltip=\u0414\u043E\u0434\u0430\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0437 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0443 \u0441\u0442\u0438\u043B\u044E
+AllMapsNodeListAction.text=\u0417\u043D\u0430\u0439\u0442\u0438 \u0456 \u0437\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u0443 \u0432\u0441\u0456\u0445 \u043A\u0430\u0440\u0442\u0430\u0445
+always=\u0417\u0430\u0432\u0436\u0434\u0438
+AlwaysUnfoldedNodeAction.text=\u041F\u043E\u0441\u0442\u0456\u0439\u043D\u043E \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u0439 \u0432\u0443\u0437\u043E\u043B (\u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438/\u0441\u043A\u0438\u043D\u0443\u0442\u0438)
antialias_all=\u0417\u0433\u043B\u0430\u0434\u0436\u0443\u0432\u0430\u0442\u0438 \u0443\u0441\u0435
antialias_edges=\u0417\u0433\u043B\u0430\u0434\u0436\u0443\u0432\u0430\u0442\u0438 \u043B\u0456\u043D\u0456\u0457
antialias_none=\u041D\u0456\u0447\u043E\u0433\u043E \u043D\u0435 \u0437\u0433\u043B\u0430\u0434\u0436\u0443\u0432\u0430\u0442\u0438
+apply=&\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438
+ApplyAction.text=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438
+ApplyFormatPlugin.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 ...
+ApplyFormatPlugin.tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0434\u0456\u0430\u043B\u043E\u0433 \u0434\u043B\u044F \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0443\u0437\u043B\u0456\u0432 \u0456 \u043B\u0456\u043D\u0456\u0439.
+ApplyNoFilteringAction.text=\u0412\u0456\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0438 \u0444\u0456\u043B\u044C\u0442\u0440
+ApplySelectedViewConditionAction.text=\u0424\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0432\u0456\u0434\u043C\u0456\u0447\u0435\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
+ApplyToVisibleAction.text=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0434\u043E \u0432\u0456\u0434\u0444\u0456\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
as_parent=\u042F\u043A \u0443 \u0431\u0430\u0442\u044C\u043A\u0430
+AskForHelp.text=\u0417\u0430\u043F\u0438\u0442\u0430\u0439\u0442\u0435 \u043D\u0430 \u0444\u043E\u0440\u0443\u043C\u0456
+AssignAttributesAction.text=\u041F\u043E\u0448\u0443\u043A \u0456 \u0437\u0430\u043C\u0456\u043D\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0456\u0432...
+attribute_delete=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0432\u0441\u0456 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F
+attribute_delete_value=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0446\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F
+attribute_font_size_tooltip=\u0420\u043E\u0437\u043C\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0443 \u0434\u043B\u044F \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0456\u0432
+attribute_list_box_label_text=\u041D\u0430\u044F\u0432\u043D\u0456 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F
+attribute_name=\u041D\u0430\u0437\u0432\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attribute_name_or_value=\u041D\u0430\u0437\u0432\u0430 \u0430\u0431\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0443
+attribute_replace=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u043D\u0430
+attribute_top=\u0412\u0441\u0456 \u0432\u0456\u0434\u043E\u043C\u0456 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0437 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u0438\u0445 \u043A\u0430\u0440\u0442
+attribute_value=\u0417\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attributes_AddAttributeAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0432 \u0434\u0456\u0430\u043B\u043E\u0437\u0456...
+attributes_adding_empty_attribute_error=\u041F\u0443\u0441\u0442\u0438\u0439 \u0440\u044F\u0434\u043E\u043A \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u043D\u0430\u0437\u0432\u043E\u044E \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attributes_all=\u0412\u0441\u0456 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+attributes_assign_dialog=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+attributes_attribute=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+attributes_close=\u0417\u0430\u043A\u0440\u0438\u0442\u0438
attributes_deselect_all=\u041D\u0456\u0447\u043E\u0433\u043E
-attributes_dialog_title=Attribute Manager[translate me]
-AutomaticLayoutAction.text=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u043F\u043E\u0437\u0438\u0446\u0456\u043E\u043D\u0443\u0432\u0430\u043D\u043D\u044F
+attributes_dialog_title=\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043C\u0438
+attributes_edit=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438
+attributes_edit_tooltip=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u043C\u043D\u043E\u0436\u0438\u043D\u0443
+attributes_for_selected=\u0412\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
+attributes_for_visible=\u0412\u0441\u0456 \u0432\u0438\u0434\u0438\u043C\u0456 \u0432\u0443\u0437\u043B\u0438
+attributes_import=&\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438
+attributes_import_tooltip=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0437 \u0456\u043D\u0448\u0438\u0445 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u0438\u0445 \u043A\u0430\u0440\u0442
+attributes_no_import_candidates_found=\u041D\u043E\u0432\u0438\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0456\u0432 \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E
+attributes_popup_delete=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438
+attributes_popup_down=\u0414\u043E\u043D\u0438\u0437\u0443
+attributes_popup_edit=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438
+attributes_popup_hide=\u0421\u0445\u043E\u0432\u0430\u0442\u0438
+attributes_popup_new=\u041D\u043E\u0432\u0438\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
+attributes_popup_optimal_width=\u041E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430
+attributes_popup_up=\u0412\u0433\u043E\u0440\u0443
+attributes_refresh=\u041E\u043D\u043E\u0432\u0438\u0442\u0438
+attributes_RemoveAllAttributesAction.text=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0432\u0441\u0456 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+attributes_RemoveFirstAttributeAction.text=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u043F\u0435\u0440\u0448\u0438\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
+attributes_RemoveLastAttributeAction.text=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u0456\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
+attributes_restricted_attributes_tooltip=\u041E\u0431\u043C\u0435\u0436\u0438\u0442\u0438 \u043C\u043D\u043E\u0436\u0438\u043D\u0443 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0456\u0432
+attributes_restricted_values_tooltip=\u041E\u0431\u043C\u0435\u0436\u0438\u0442\u0438 \u043C\u043D\u043E\u0436\u0438\u043D\u0443 \u0437\u043D\u0430\u0447\u0435\u043D\u044C \u043F\u043E\u0442\u043E\u0447\u043D\u043E\u0433\u043E \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attributes_restriction=\u041E\u0431\u043C\u0435\u0436\u0438\u0442\u0438
+attributes_select_all=\u0412\u0441\u0456
+attributes_select_all_tooltip=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 / \u0437\u043D\u044F\u0442\u0438 \u0432\u0438\u0431\u0456\u0440 \u0432\u0441\u0456\u0445
+attributes_show=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438
+attributes_skip_root=\u041A\u0440\u0456\u043C \u043A\u043E\u0440\u0435\u043D\u0435\u0432\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+attributes_visible=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456
+attributes_visible_tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456
+automatic_layout=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u0440\u043E\u0437\u043C\u0456\u0449\u0435\u043D\u043D\u044F
+automatic_layout_disabled=\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E
+automatically_save_message=\u041A\u0430\u0440\u0442\u0430 \u0431\u0443\u043B\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0430 (\u0432 \u0444\u0430\u0439\u043B {0}) ...
+AutomaticEdgeColor.FOR_BRANCHES=\u0434\u043B\u044F \u0433\u0456\u043B\u043E\u043A
+AutomaticEdgeColor.FOR_COLUMN=\u0434\u043B\u044F \u0441\u0442\u043E\u0432\u043F\u0447\u0438\u043A\u0430
+AutomaticEdgeColor.FOR_COLUMNS=\u0434\u043B\u044F \u0441\u0442\u043E\u0432\u043F\u0447\u0438\u043A\u0456\u0432
+AutomaticEdgeColor.FOR_LEVELS=\u0434\u043B\u044F \u0440\u0456\u0432\u043D\u0456\u0432
+AutomaticEdgeColor.ON_BRANCH_CREATION=\u043F\u0440\u0438 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u0456 \u0433\u0456\u043B\u043A\u0438
+AutomaticEdgeColorHookAction.text=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0438\u0439 \u043A\u043E\u043B\u0456\u0440 \u0440\u0435\u0431\u0440\u0430
+AutomaticLayout.ALL=\u0434\u043B\u044F \u0432\u0441\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
+AutomaticLayout.COLUMNS=\u0434\u043B\u044F \u0441\u0442\u043E\u0432\u043F\u0447\u0438\u043A\u0456\u0432
+AutomaticLayout.HEADINGS=\u0434\u043B\u044F \u043D\u0435 \u043A\u0440\u0430\u0439\u043D\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
+AutomaticLayout.level=\u0420\u0456\u0432\u0435\u043D\u044C {0}
+AutomaticLayout.level.root=\u041A\u043E\u0440\u0456\u043D\u044C
+AutomaticLayoutAction.text=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u0456 \u0440\u0456\u0432\u043D\u0456\u0432
AutomaticLayoutAction.tooltip=<html> \u0424\u0456\u043A\u0441\u0443\u0454 \u0432\u0438\u0434 \u043A\u0430\u0440\u0442\u0438 <br> \u0412\u0443\u0437\u043B\u0438 \u043F\u0435\u0440\u0448\u043E\u0433\u043E \u0440\u0456\u0432\u043D\u044F \u0441\u0442\u0430\u043D\u0443\u0442\u044C \u0447\u043E\u0440\u043D\u0438\u043C\u0438, \u0434\u0440\u0443\u0433\u043E\u0433\u043E - \u0441\u0438\u043D\u0456\u043C\u0438 \u0456 \u0442\u0430\u043A \u0434\u0430\u043B\u0456 </html>
+AutomaticLayoutControllerAction.ALL.text=\u0434\u043B\u044F \u0432\u0441\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
+AutomaticLayoutControllerAction.COLUMNS.text=\u0434\u043B\u044F \u0441\u0442\u043E\u0432\u043F\u0447\u0438\u043A\u0456\u0432
+AutomaticLayoutControllerAction.HEADINGS.text=\u0434\u043B\u044F \u043D\u0435 \u043A\u0440\u0430\u0439\u043D\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
+AutomaticLayoutControllerAction.null.text=\u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E
BackAction.text=\u041D\u0430\u0437\u0430\u0434
+BackAction.tooltip=\u041F\u0435\u0440\u0435\u0445\u0456\u0434 \u0434\u043E \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044C\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430 \u0432 \u043B\u0430\u043D\u0446\u044E\u0436\u043A\u0443
background=\u041A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443
+bitmaps=\u0422\u043E\u0447\u043A\u043E\u0432\u0438\u0439 \u043C\u0430\u043B\u044E\u043D\u043E\u043A
+black=\u0427\u043E\u0440\u043D\u0438\u0439
BlinkingNodeHookAction.text=\u041C\u0438\u0433\u043E\u0442\u043B\u0438\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
-BlinkingNodeHookAction.tooltip=<html> \u0412\u0443\u0437\u043E\u043B \u043C\u0438\u0433\u0430\u0442\u0438\u043C\u0435. \u0423\u0432\u0430\u0433\u0430! \u0426\u0435\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0430\u043D\u0438\u0439 \u0442\u0456\u043B\u044C\u043A\u0438 \u0434\u043E \u043D\u0435\u0432\u0435\u043B\u0438\u043A\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u0432\u0443\u0437\u [...]
+BlinkingNodeHookAction.tooltip=<html> \u0412\u0443\u0437\u043E\u043B \u0431\u043B\u0438\u043C\u0430\u0442\u0438\u043C\u0435. \u0423\u0432\u0430\u0433\u0430! \u041D\u0435 \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0443\u0439\u0442\u0435 \u0446\u0435\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u043E \u0437\u0430\u043D\u0430\u0434\u0442\u043E \u0431\u0430\u0433\u0430\u0442\u044C\u043E\u0445 \u0432\u0443\u0437\u043B\u0456\u0432, \u0456 <strong>\u043D\u0435 \u043F\u043E\u0454\u04 [...]
+blue=\u0421\u0438\u043D\u0456\u0439
BoldAction.text=\u0416\u0438\u0440\u043D\u043E
boldify_branch=\u0412\u0441\u044E \u0433\u0456\u043B\u043A\u0443 \u0436\u0438\u0440\u043D\u043E
branch=\u0413\u0456\u043B\u043A\u0430
-cancel=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438
-CancelAction.text=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438
-cannot_add_parent_diff_parents=\u0414\u043B\u044F \u0446\u0456\u0454\u0457 \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u0457 \u0432\u0441\u0456 \u0432\u0443\u0437\u043B\u0438 \u043F\u043E\u0432\u0438\u043D\u043D\u0456 \u043C\u0430\u0442\u0438 \u0437\u0430\u0433\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0431\u0430\u0442\u044C\u043A\u0430
-cannot_add_parent_to_root=\u041A\u043E\u0440\u0435\u043D\u0435\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u043D\u0435 \u043C\u043E\u0436\u0435 \u0441\u0442\u0430\u0442\u0438 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u043C
+browse=\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434...
+calendar_attributes_panel=\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440 \u0456 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+calendar_panel=\u041A\u0430\u043B\u0435\u043D\u0434\u0430\u0440
+can_not_clone_encrypted_node=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u043A\u043B\u043E\u043D\u0443\u0432\u0430\u0442\u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
+can_not_connect_to_info_server=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u0434\u043E \u0441\u0435\u0440\u0432\u0435\u0440\u0430
+can_not_delete_predefined_style=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u043D\u0430\u043F\u0435\u0440\u0435\u0434 \u0432\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0441\u0442\u0438\u043B\u044C
+can_not_delete_root_style=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043D\u044F \u043A\u043E\u0440\u0435\u043D\u0435\u0432\u043E\u0433\u043E \u0441\u0442\u0438\u043B\u044E
+can_not_delete_style_group=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043D\u044F \u0433\u0440\u0443\u043F\u0438 \u0441\u0442\u0438\u043B\u044E
+can_not_encrypt_cloned_node=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0437\u0430\u0448\u0438\u0444\u0440\u0443\u0432\u0430\u0442\u0438 \u043A\u043B\u043E\u043D\u043E\u0432\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
+can_not_save_key_set=\u041D\u0435 \u043C\u043E\u0436\u0443 \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043D\u0430\u0431\u0456\u0440 \u0433\u0430\u0440\u044F\u0447\u0438\u0445 \u043A\u043B\u0430\u0432\u0456\u0448
+cancel=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+CancelAction.text=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+cannot_add_parent_diff_parents=\u0414\u043B\u044F \u0446\u0456\u0454\u0457 \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u0457 \u0432\u0441\u0456 \u0432\u0443\u0437\u043B\u0438 \u043F\u043E\u0432\u0438\u043D\u043D\u0456 \u043C\u0430\u0442\u0438 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0435\u0434\u043A\u0430.
+cannot_add_parent_to_root=\u041A\u043E\u0440\u0435\u043D\u0435\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u043D\u0435 \u043C\u043E\u0436\u0435 \u0441\u0442\u0430\u0442\u0438 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u043C.
+cannot_delete_root=\u041A\u043E\u0440\u0435\u043D\u0435\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u043D\u0435 \u043C\u043E\u0436\u043D\u0430 \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0447\u0438 \u0432\u0438\u0440\u0456\u0437\u0430\u0442\u0438.
cannot_join_nodes_with_children=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u043E\u0431'\u0454\u0434\u043D\u0443\u0432\u0430\u0442\u0438 \u0432\u0443\u0437\u043B\u0438 \u0437 \u0457\u0445 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u043C\u0438 \u0432\u0443\u0437\u043B\u0430\u043C\u0438
-cannot_move_to_child=Ein Knoten kann nicht an einen seiner Nachkommen verschoben werden.
+cannot_move_into_child_node=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u043F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438\u0441\u044F \u0432 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u0439 \u0432\u0443\u0437\u043E\u043B
+cannot_move_to_child=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u043F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0432\u0443\u0437\u043E\u043B \u0434\u043E \u043E\u0434\u043D\u043E\u0433\u043E \u0437 \u0439\u043E\u0433\u043E \u043D\u0430\u0449\u0430\u0434\u043A\u0456\u0432.
CenterAction.text=\u0426\u0435\u043D\u0442\u0440\u0443\u0432\u0430\u0442\u0438
+CenterSelectedNodeAction.text=\u0426\u0435\u043D\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
ChangeConnectorArrowsAction.backward.text=\u041D\u0430\u0437\u0430\u0434
+ChangeConnectorArrowsAction.both.text=\u041C\u0430\u043B\u044E\u0432\u0430\u0442\u0438 \u0441\u0442\u0440\u0456\u043B\u043A\u0438 \u043D\u0430 \u043E\u0431\u043E\u0445 \u043A\u0456\u043D\u0446\u044F\u0445
ChangeConnectorArrowsAction.forward.text=\u0412\u043F\u0435\u0440\u0435\u0434
-choose_background_color=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0444\u043E\u043D\u043E\u0432\u0438\u0439 \u043A\u043E\u043B\u0456\u0440
-choose_cloud_color=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043A\u043E\u043B\u0456\u0440 \u0445\u043C\u0430\u0440\u0438
+ChangeConnectorArrowsAction.none.text=\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439
+ChangeConnectorArrowsAction.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0441\u0442\u0440\u0456\u043B\u043A\u0438 \u043D\u0430 \u0437\u0432'\u044F\u0437\u043A\u0443
+ChangeConnectorShapeAction.CUBIC_CURVE.text=\u041A\u0440\u0438\u0432\u0430
+ChangeConnectorShapeAction.EDGE_LIKE.text=\u041C\u043E\u0434\u0435\u043B\u044E\u0432\u0430\u043D\u043D\u044F \u0440\u0435\u0431\u0440\u0430
+ChangeConnectorShapeAction.LINE.text=\u041B\u0456\u043D\u0456\u044F
+ChangeConnectorShapeAction.LINEAR_PATH.text=\u041B\u0456\u043D\u0456\u0439\u043D\u0438\u0439 \u0448\u043B\u044F\u0445
+ChangeNodeLevelLeftsAction.text=\u041F\u0456\u0434\u0432\u0438\u0449\u0438\u0442\u0438 \u0440\u0456\u0432\u0435\u043D\u044C (\u0441\u0443\u0441\u0456\u0434 \u043F\u0440\u0435\u0434\u043A\u0430)
+ChangeNodeLevelLeftsAction.tooltip=\u041B\u0456\u0432\u043E\u0440\u0443\u0447 \u0432\u0456\u0434 \u043A\u043E\u0440\u0435\u043D\u044F \u0432\u0443\u0437\u043B\u0438 \u0437\u043C\u0456\u0449\u0443\u044E\u0442\u044C\u0441\u044F \u0434\u043E\u043D\u0438\u0437\u0443 \u0456 \u0441\u0442\u0430\u044E\u0442\u044C \u043D\u0430\u0449\u0430\u0434\u043A\u0430\u043C\u0438 \u0432\u0443\u0437\u043B\u0430 \u0432\u0438\u0449\u043E\u0433\u043E \u0440\u0456\u0432\u043D\u044F. \u041F\u0440\u0430\u0432\u043E [...]
+ChangeNodeLevelRightsAction.text=\u041F\u043E\u043D\u0438\u0437\u0438\u0442\u0438 \u0440\u0456\u0432\u0435\u043D\u044C (\u043D\u0430\u0449\u0430\u0434\u043E\u043A \u0441\u0443\u0441\u0456\u0434\u0430)
+ChangeNodeLevelRightsAction.tooltip=\u041F\u0440\u0430\u0432\u043E\u0440\u0443\u0447 \u0432\u0456\u0434 \u043A\u043E\u0440\u0435\u043D\u044F \u0432\u0443\u0437\u043B\u0438 \u0437\u043C\u0456\u0449\u0443\u044E\u0442\u044C\u0441\u044F \u0434\u043E\u043D\u0438\u0437\u0443. \u0412\u043E\u043D\u0438 \u0441\u0442\u0430\u044E\u0442\u044C \u043D\u0430\u0449\u0430\u0434\u043A\u0430\u043C\u0438 \u0432\u0443\u0437\u043B\u0430, \u0449\u043E \u043B\u0435\u0436\u0438\u0442\u044C \u0432\u0438\u0449\u04 [...]
+choose_background_color=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043A\u043E\u043B\u0456\u0440 \u0442\u043B\u0430:
+choose_cloud_color=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043A\u043E\u043B\u0456\u0440 \u0445\u043C\u0430\u0440\u0438:
choose_edge_color=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043A\u043E\u043B\u0456\u0440 \u043B\u0456\u043D\u0456\u0457
-choose_node_background_color=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0444\u043E\u043D\u043E\u0432\u0438\u0439 \u043A\u043E\u043B\u0456\u0440 \u0432\u0443\u0437\u043B\u0430
-choose_node_color=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043A\u043E\u043B\u0456\u0440 \u0442\u0435\u043A\u0441\u0442\u0443 \u0432\u0443\u0437\u043B\u0430
-CloseAction.text=\u0417\u0430\u043A\u0440\u0438\u0442\u0438
-CloudAction.text=\u0425\u043C\u0430\u0440\u0430
-CloudColorAction.text=\u041A\u043E\u043B\u0456\u0440 \u0445\u043C\u0430\u0440\u0438 ...
+choose_map_background_color=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u043A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443 \u0434\u043B\u044F \u043A\u0430\u0440\u0442\u0438
+choose_node_background_color=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043A\u043E\u043B\u0456\u0440 \u0442\u043B\u0430 \u0432\u0443\u0437\u043B\u0430:
+choose_node_color=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043A\u043E\u043B\u0456\u0440 \u0442\u0435\u043A\u0441\u0442\u0443 \u0432\u0443\u0437\u043B\u0430:
+ClearLinkAnchorAction.text=\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u044F\u043A\u0456\u0440 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+ClearLinkAnchorAction.tooltip=<html>\u043E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0440\u0430\u043D\u0456\u0448\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439 \u044F\u043A\u0456\u0440 \u0432\u0443\u0437\u043B\u0430</html>
+CloneAction.text=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043A\u043B\u043E\u043D
+close_btn=&\u0417\u0430\u043A\u0440\u0438\u0442\u0438
+CloseAction.text=\u0417\u0430\u043A\u0440\u0438\u0442\u0438 \u043F\u043E\u0442\u043E\u0447\u043D\u0443 \u043A\u0430\u0440\u0442\u0443
+cloud_shapes=\u0424\u043E\u0440\u043C\u0438 \u0445\u043C\u0430\u0440
+CloudAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 / \u0432\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0445\u043C\u0430\u0440\u0443 (\u0442\u0438\u043F\u043E\u0432\u0443)
+CloudColorAction.text=\u041A\u043E\u043B\u0456\u0440 \u0445\u043C\u0430\u0440\u043A\u0438...
+CloudShapeAction.ARC.text=\u0414\u0443\u0433\u0430
+CloudShapeAction.RECT.text=\u041F\u0440\u044F\u043C\u043E\u043A\u0443\u0442\u043D\u0438\u043A
+CloudShapeAction.ROUND_RECT.text=\u0417\u0430\u043E\u043A\u0440\u0443\u0433\u043B\u0435\u043D\u0438\u0439 \u043F\u0440\u044F\u043C\u043E\u043A\u0443\u0442\u043D\u0438\u043A
+CloudShapeAction.STAR.text=\u0417\u0456\u0440\u043A\u0430
ColorProperty.ResetColor=\u0412\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u043F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0438\u0439 \u043A\u043E\u043B\u0456\u0440
combined=\u041A\u043E\u043C\u0431\u0456\u043D\u043E\u0432\u0430\u043D\u043E
-connector=Connector[translate me]
-connector_label=Connector Label[translate me]
+condition=\u0423\u043C\u043E\u0432\u0430
+confirmation=\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F
+connector=\u0417'\u0454\u0434\u043D\u0443\u0432\u0430\u0447
+connector_arrows=\u0421\u0442\u0440\u0456\u043B\u043A\u0438 \u0437'\u0454\u0434\u043D\u0443\u0432\u0430\u0447\u0430
+connector_label=\u041F\u0456\u0434\u043F\u0438\u0441 \u0437'\u0454\u0434\u043D\u0443\u0432\u0430\u0447\u0430
+connector_lines=\u041B\u0456\u043D\u0456\u0457 \u0437'\u0454\u0434\u043D\u0443\u0432\u0430\u0447\u0430
+connector_shapes=\u0424\u043E\u0440\u043C\u0438 \u0437'\u0454\u0434\u043D\u0443\u0432\u0430\u0447\u0430
+ConnectorColorAction.text=\u041A\u043E\u043B\u0456\u0440 \u0437'\u0454\u0434\u043D\u0443\u0432\u0430\u0447\u0430...
+ConvertCloneToIndependentNodeAction.text=\u0412\u0456\u0434'\u0454\u0434\u043D\u0430\u0442\u0438 \u043A\u043B\u043E\u043D
CopyAction.text=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438
+CopyAction.tooltip=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0443 \u0433\u0456\u043B\u043A\u0443
+CopyAttributes.text=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+CopyIDAction.text=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 ID \u0432\u0443\u0437\u043B\u0430
+CopyMapStylesAction.text=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u044C \u043A\u0430\u0440\u0442\u0438 \u0437...
+CopyNodeURIAction.text=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 URI \u0432\u0443\u0437\u043B\u0430
+copyright=Copyright \u00A9 2000-2016 \u041A\u043E\u043C\u0430\u043D\u0434\u0430 Freeplane \u0442\u0430 \u0456\u043D\u0448\u0456
CopySingleAction.text=\u0421\u043A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u043E\u0434\u0438\u043D \u0432\u0443\u0437\u043E\u043B
-CreationModificationPluginAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0447\u0430\u0441 \u0437\u043C\u0456\u043D\u0438
+CopySingleAction.tooltip=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u043B\u0438\u0448\u0435 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
+CopyStyleExtensionsAction.text=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0440\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0437\u0456 \u0441\u0442\u0438\u043B\u044C\u043E\u0432\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+corrupt_map=\u0412\u043C\u0456\u0441\u0442 \u043A\u0430\u0440\u0442\u0438 \u043F\u043E\u0448\u043A\u043E\u0434\u0436\u0435\u043D\u043E
+CreateConjunctConditionAction.text=\u0406
+CreateDisjunctConditionAction.text=\u0410\u0431\u043E
+CreateNotSatisfiedConditionAction.text=\u041D\u0435
+CreationModificationPluginAction.text=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0447\u0430\u0441 \u0437\u043C\u0456\u043D\u0438
CreationModificationPluginAction.tooltip=<html> \u0426\u044F \u0444\u0443\u043D\u043A\u0446\u0456\u044F \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0454 \u0447\u0430\u0441\u0438 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u0456 \u0437\u043C\u0456\u043D\u0438 \u0432\u0443\u0437\u043B\u0456\u0432 </html>
+current_dir=\u041A\u0430\u0440\u0442\u0438
CutAction.text=\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438
decrease_branch_font_size=\u0417\u043C\u0435\u043D\u0448\u0438\u0442\u0438 \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0456\u0454\u0457 \u0433\u0456\u043B\u043A\u0438
DecreaseNodeFontAction.text=\u0417\u043C\u0435\u043D\u0448\u0438\u0442\u0438 \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0456\u0454\u0457 \u0433\u0456\u043B\u043A\u0438
+default=\u0422\u0438\u043F\u043E\u0432\u043E
+DefaultColorAction.text=\u0422\u0438\u043F\u043E\u0432\u0438\u0439 \u043A\u043E\u043B\u0456\u0440
+defaultstyle.attributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+defaultstyle.details=\u041F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456
+defaultstyle.floating=\u041F\u043B\u0430\u0432\u0443\u0447\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
+defaultstyle.note=\u041F\u0440\u0438\u043C\u0456\u0442\u043A\u0430
+delete=&\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438
delete_child=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0432\u0443\u0437\u043E\u043B
DeleteAction.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0432\u0443\u0437\u043E\u043B
+DeleteConditionAction.text=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438
+DeleteDetailsAction.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456 \u0432\u0443\u0437\u043B\u0430
+DeleteLevelStyleAction.text=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0438\u0439 \u0441\u0442\u0438\u043B\u044C \u0440\u0456\u0432\u043D\u0456\u0432
+DeleteStyleAction.text=\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0441\u0442\u0438\u043B\u044C
+DeleteUserStyleAction.text=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0441\u0442\u0438\u043B\u044C \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430
+dialect_info.app=\u0444\u0430\u0439\u043B \u043A\u0430\u0440\u0442\u0438 {0} \u0431\u0443\u0432 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u0438\u0439 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E {1}.
+dialect_info.later_version=\u0424\u0430\u0439\u043B \u043A\u0430\u0440\u0442\u0438 {0} \u0431\u0443\u043B\u043E \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E \u043F\u0456\u0437\u043D\u0456\u0448\u043E\u044E \u0432\u0435\u0440\u0441\u0456\u0454\u044E \u0446\u0456\u0454\u0457 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438.
+dialect_info.unknownApp=\u0424\u0430\u0439\u043B \u043A\u0430\u0440\u0442\u0438 {0} \u0431\u0443\u043B\u043E \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E \u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E\u044E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E.
+dialect_info.unknownURL=\u0407\u0457 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442 \u043D\u0435\u0432\u0456\u0434\u043E\u043C\u0438\u0439.
+dialect_info.url=\u0412\u0456\u0434\u0432\u0456\u0434\u0430\u0439\u0442\u0435 \u0441\u0430\u0439\u0442 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438 {0} \u0449\u043E\u0431 \u043E\u0442\u0440\u0438\u043C\u0430\u0442\u0438 \u0431\u0456\u043B\u044C\u0448\u0435 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u0457.
+dialect_info.warning=Freeplane \u043C\u043E\u0436\u0435 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438, \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0430\u0431\u043E \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0446\u0435\u0439 \u0444\u0430\u0439\u043B .
+DirectHtmlFlavorHandler=HTML \u044F\u043A \u043E\u0434\u0438\u043D\u0438\u0447\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
DocumentationAction.text=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0456\u044F
-edge=\u041B\u0456\u043D\u0456\u044F
+down=\u0412&\u043D\u0438\u0437
+DownConditionAction.text=\u0414\u043E\u043D\u0438\u0437\u0443
+download=\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438
+dropped_file_error=\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043F\u0435\u0440\u0435\u0442\u044F\u0433\u043D\u0443\u0442\u0456 \u0444\u0430\u0439\u043B\u0438. \u041F\u0440\u0438\u0447\u0438\u043D\u0430: {0}
+edge=\u0420\u0435\u0431\u0440\u043E
+edge_is_formatted_by_style=\u0424\u043E\u0440\u043C\u0430\u0442 \u0440\u0435\u0431\u0440\u0430 \u043A\u0435\u0440\u0443\u0454\u0442\u044C\u0441\u044F \u0441\u0442\u0438\u043B\u0435\u043C. \u042F\u043A\u0449\u043E \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E, \u0437\u043C\u0456\u043D\u0456\u0442\u044C \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u0438\u0439 \u0441\u0442\u0438\u043B\u044C.
edge_style=\u0422\u0438\u043F \u043B\u0456\u043D\u0456\u0457
edge_width=\u0422\u043E\u0432\u0449\u0438\u043D\u0430
+edge_widths=\u0428\u0438\u0440\u0438\u043D\u0430 \u0440\u0435\u0431\u0435\u0440
EdgeColorAction.text=\u041A\u043E\u043B\u0456\u0440 \u043B\u0456\u043D\u0456\u0457...
+EdgeProperties=\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 \u0440\u0435\u0431\u0435\u0440
EdgeStyleAction.bezier.text=\u041A\u0440\u0438\u0432\u0430
+EdgeStyleAction.bezier.tooltip=<html>\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0431\u0440\u043E \u044F\u043A \u0433\u043B\u0430\u0434\u0435\u043D\u044C\u043A\u0443 \u043A\u0440\u0438\u0432\u0443.</html>
+EdgeStyleAction.hide_edge.text=\u0421\u0445\u043E\u0432\u0430\u0442\u0438 \u0440\u0435\u0431\u0440\u043E
+EdgeStyleAction.hide_edge.tooltip=<html>\u0414\u043B\u044F \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432 \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0437\u0432'\u044F\u0437\u043E\u043A \u0437 \u043F\u0440\u0435\u0434\u043A\u043E\u043C <br>\u043F\u0443\u043D\u043A\u0442\u0438\u0440\u043D\u043E\u044E \u043B\u0456\u043D\u0456\u0454\u044E. \u0406\u043D\u0448\u0456 \u0440\u0435\u0431\u0440\u0430 \u0441\u0445\u043E\u0432\u0430\u0442\u0438.</html>
+EdgeStyleAction.horizontal.text=\u041B\u0430\u043C\u0430\u043D\u0430
+EdgeStyleAction.horizontal.tooltip=<html>\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0431\u0440\u0430 \u0443 \u043F\u0435\u0440\u043F\u0435\u043D\u0434\u0438\u043A\u0443\u043B\u044F\u0440\u043D\u0438\u043C\u0438 \u043F\u0440\u044F\u043C\u0438\u043C\u0438 \u043B\u0456\u043D\u0456\u044F\u043C\u0438.</html>
EdgeStyleAction.linear.text=\u041F\u0440\u044F\u043C\u0430
+EdgeStyleAction.linear.tooltip=<html>\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0431\u0440\u043E \u043F\u0440\u044F\u043C\u043E\u044E \u043B\u0456\u043D\u0456\u0454\u044E.</html>
EdgeStyleAction.sharp_bezier.text=\u0417\u0430\u0433\u043E\u0441\u0442\u0440\u0435\u043D\u0430 \u043A\u0440\u0438\u0432\u0430
+EdgeStyleAction.sharp_bezier.tooltip=<html>\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0431\u0440\u043E \u0433\u043B\u0430\u0434\u0435\u043D\u044C\u043A\u043E\u044E \u043A\u0440\u0438\u0432\u043E\u044E \u0437 \u0433\u043E\u0441\u0442\u0440\u0438\u043C\u0438 \u043A\u0456\u043D\u0446\u044F\u043C\u0438.</html>
EdgeStyleAction.sharp_linear.text=\u0417\u0430\u0433\u043E\u0441\u0442\u0440\u0435\u043D\u0430 \u043F\u0440\u044F\u043C\u0430
+EdgeStyleAction.sharp_linear.tooltip=<html>\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0440\u0435\u0431\u0440\u043E \u043F\u0440\u044F\u043C\u043E\u044E \u043B\u0456\u043D\u0456\u0454\u044E \u0437 \u0433\u043E\u0441\u0442\u0440\u0438\u043C\u0438 \u043A\u0456\u043D\u0446\u044F\u043C\u0438.</html>
EdgeStyleAsParentAction.text=\u042F\u043A \u0443 \u0431\u0430\u0442\u044C\u043A\u0430
+EdgeStyleAsParentAction.tooltip=<html>\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u044C \u0440\u0435\u0431\u0440\u0430 \u043F\u0440\u0435\u0434\u043A\u0430.</html>[\u0437\u0430\u0441\u0442\u0430\u0440\u0456\u043B\u043E]
EdgeWidthAction_width_parent.text=\u042F\u043A \u0443 \u0431\u0430\u0442\u044C\u043A\u0456\u0432\u0441\u044C\u043A\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
EdgeWidthAction_width_thin.text=\u0422\u043E\u043D\u043A\u0430 \u043B\u0456\u043D\u0456\u044F
-edit=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0442\u0435\u043A\u0441\u0442
+edit=&\u0417\u043C\u0456\u043D\u0438
+edit.decision=\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 HTML
+edit.edit_rich_text=\u0411\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F, \u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434, \u0436\u0438\u0440\u043D\u0435 \u0430\u0431\u043E \u043A\u0443\u0440\u0441\u0438\u0432\u043D\u0435 \u043D\u0430\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F?
+edit_details=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456 \u0432\u0443\u0437\u043B\u0430
+edit_end_label=<html>\u041F\u0456\u0434\u043F\u0438\u0441<br>\u0437'\u0454\u0434\u043D\u0443\u0432\u0430\u0447\u0430
+edit_label_font_family=\u0428\u0440\u0438\u0444\u0442
+edit_label_font_size=\u0420\u043E\u0437\u043C\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0443
edit_link_manually=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0443\u0440\u0443\u0447\u043D\u0443...
+edit_long_node=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0434\u043E\u0432\u0433\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0432\u0443\u0437\u043B\u0430
+edit_middle_label=<html>\u041F\u0440\u043E\u043C\u0456\u0436\u043D\u0438\u0439<br>\u043D\u0430\u043F\u0438\u0441
+edit_note=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0443
+edit_source_label=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0438\u0439 \u043D\u0430\u043F\u0438\u0441
+edit_target_label=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043A\u0456\u043D\u0446\u0435\u0432\u0438\u0439 \u043D\u0430\u043F\u0438\u0441
+edit_transparency_label=\u041F\u0440\u043E\u0437\u043E\u0440\u0456\u0441\u0442\u044C
+edit_width_label=\u0428\u0438\u0440\u0438\u043D\u0430
EditAction.text=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438
-EditLongAction.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0442\u0435\u043A\u0441\u0442 \u0443 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0456...
-EncryptedMap.text=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0443 \u0430\u0441\u043E\u0446\u0456\u0430\u0442\u0438\u0432\u043D\u0443 \u043A\u0430\u0440\u0442\u0443...
+EditAttributesAction.text=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+EditDetailsAction.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456 \u0432\u0443\u0437\u043B\u0430 \u0432 \u0440\u044F\u0434\u043A\u0443
+EditDetailsInDialogAction.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456 \u0432\u0443\u0437\u043B\u0430 \u0432 \u0432\u0456\u043A\u043D\u0456
+EditFilterAction.text=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0444\u0456\u043B\u044C\u0442\u0440
+EditLongAction.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043E\u0441\u043D\u043E\u0432\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u0443 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0456
+EditNoteInDialogAction.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0443 \u0432 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0456
+EditScript=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442...
+EditStylesAction.text=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u0456
+EncryptedMap.text=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0443 (\u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0443) \u043A\u0430\u0440\u0442\u0443...
EncryptedMap.tooltip=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043D\u043E\u0432\u0438\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442, \u044F\u043A\u0438\u0439 \u0431\u0443\u0434\u0435 \u043F\u043E\u0432\u043D\u0456\u0441\u0442\u044E \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0439
+encryption=\u0428\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F
enter_base_url=\u0411\u0443\u0434\u0435 \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u043E \u0432\u0456\u0434\u043D\u043E\u0441\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F. \u0412\u043A\u0430\u0436\u0456\u0442\u044C \u043A\u043E\u0440\u0435\u043D\u0435\u0432\u0438\u0439 URL...
-enter_confirms=\u0412\u0432\u0456\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0443\u0454 \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043D\u043D\u044F.
+enter_command=\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u0443
+enter_condition_name=\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043D\u0430\u0437\u0432\u0443 \u043D\u043E\u0432\u043E\u0457 \u0443\u043C\u043E\u0432\u0438
+enter_confirms=&\u0412\u0432\u0456\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0443\u0454 \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043D\u043D\u044F
+enter_keyset_name=\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043D\u0430\u0437\u0432\u0443 \u043D\u0430\u0431\u043E\u0440\u0443 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u044C \u043A\u043B\u0430\u0432\u0456\u0448
+enter_map_url=\u0412\u0432\u0435\u0434\u0456\u0442\u044C URL \u043A\u0430\u0440\u0442\u0438
+enter_new_style_name=\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043D\u0430\u0437\u0432\u0443 \u043D\u043E\u0432\u043E\u0433\u043E \u0441\u0442\u0438\u043B\u044E
+enter_node_id=\u0412\u0432\u0435\u0434\u0456\u0442\u044C ID \u0432\u0443\u0437\u043B\u0430
+enter_zoom=\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043C\u0430\u0441\u0448\u0442\u0430\u0431
EnterPassword.text=\u041F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E / \u0440\u043E\u0437\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u043E
-error_creating_directory=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u0456 \u0442\u0435\u043A\u0438
-export_pdf_text=\u0444\u043E\u0440\u043C\u0430\u0442 PDF
+error=\u041F\u043E\u043C\u0438\u043B\u043A\u0430
+error_applying_template=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u043D\u043D\u0456 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 XSL.
+error_creating_directory=\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044C \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0442\u0435\u043A\u0443 \u0434\u043B\u044F \u0435\u043A\u0441\u043F\u043E\u0440\u0442\u0443.
+error_in_template=\u0412\u0438\u044F\u0432\u043B\u0435\u043D\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0438 \u0443 \u0442\u0438\u043F\u043E\u0432\u043E\u043C\u0443 \u0448\u0430\u0431\u043B\u043E\u043D\u0456 \u043A\u0430\u0440\u0442\u0438 {0}. \u0421\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0446\u0435\u0439 \u0444\u0430\u0439\u043B.
+errornumber={0} \u043F\u043E\u043C\u0438\u043B\u043A\u0430
+ExecuteScript.available_modes_tooltip={0} \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0434\u043B\u044F
+ExecuteScript.script=\u0421\u043A\u0440\u0438\u043F\u0442
+ExecuteScriptError.text=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0432\u0438\u043A\u043E\u043D\u0430\u043D\u043D\u044F \u0441\u043A\u0440\u0438\u043F\u0442\u0443:\u21B5\n{0}
+ExecuteScriptForAllNodes.text=\u0412\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u0432\u0441\u0456 \u0441\u043A\u0440\u0438\u043F\u0442\u0438
+ExecuteScriptForSelectionAction.text=\u0412\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+ExecuteScriptOnSelectedNode.text=\u0412\u0438\u043A\u043E\u043D\u0430\u0442\u0438 {0} \u043D\u0430 \u0432\u0441\u0456\u0445 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0430\u0445
+ExecuteScriptOnSelectedNodeRecursively.text=\u0412\u0438\u043A\u043E\u043D\u0430\u0442\u0438 {0} \u043D\u0430 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0430\u0445, \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E
+ExecuteScriptOnSingleNode.text=\u0412\u0438\u043A\u043E\u043D\u0430\u0442\u0438 {0} \u043D\u0430 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u043C\u0443 \u0432\u0443\u0437\u043B\u0456
+ExecuteScripts.noScriptsAvailable=\u041D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0456
+ExecuteScripts.text=\u0421\u043A\u0440\u0438\u043F\u0442\u0438
+ExecuteScriptSecurityError.text=\u041F\u0456\u0434 \u0447\u0430\u0441 \u0432\u0438\u043A\u043E\u043D\u0430\u043D\u043D\u044F \u0441\u043A\u0440\u0438\u043F\u0442\u0443 \u0432\u0438\u043D\u0438\u043A\u043B\u0430 \u043F\u043E\u043C\u0438\u043B\u043A\u0430: {0}
+export_failed=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044C
+export_pdf_text=\u0424\u043E\u0440\u043C\u0430\u0442 PDF
export_svg_text=\u041C\u0430\u0441\u0448\u0442\u0430\u0431\u043E\u0432\u0430\u043D\u0430 \u0412\u0435\u043A\u0442\u043E\u0440\u043D\u0430 \u0413\u0440\u0430\u0444\u0456\u043A\u0430 (SVG)
-ExportAction.text=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438
+export_using_xslt=Freeplane \u0435\u043A\u0441\u043F\u043E\u0440\u0442
+ExportAction.text=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043A\u0430\u0440\u0442\u0443...
+ExportBranchAction.text=\u0413\u0456\u043B\u043A\u0443 \u044F\u043A \u043D\u043E\u0432\u0443 \u043A\u0430\u0440\u0442\u0443 ...
ExportBranchToHTMLAction.text=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0433\u0456\u043B\u043A\u0443 \u0434\u043E HTML
-ExportPdf.text=\u042F\u043A PDF...
+exported_file={0} \u0444\u0430\u0439\u043B
+ExportPdf.text=PDF
ExportSvg.text=\u042F\u043A SVG...
ExportToHTMLAction.text=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0434\u043E HTML
ExportToImage.jpg.text=\u042F\u043A JPEG...
@@ -93,75 +367,230 @@ ExportToImage.png.text=\u042F\u043A PNG...
ExportToOoWriter.text=\u042F\u043A \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 Open Office Writer...
ExportToOoWriter.tooltip=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0435\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u0437\u0430\u0434\u0430\u044E\u0442\u044C \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443, \u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0456 \u0432\u0443\u0437\u043B\u0438 \u0432\u0438\u0437\u043D\u0430\u0447\u0430\u044E\u0442\u044C \u0437\u043C\u0456\u0441\u0442 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430.
extension_menu=\u0421\u0442\u0438\u043B\u044C
-f_button_unassigned=<no action>[translate me]
+ExternalImage_popupMenu_Change=\u0417\u043C\u0456\u043D\u0438\u0442\u0438...
+ExternalImage_popupMenu_Open=\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0432 \u043E\u0433\u043B\u044F\u0434\u0430\u0447\u0456
+ExternalImage_popupMenu_Remove=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438
+ExternalImage_popupMenu_ResetZoom=\u0421\u043A\u0438\u043D\u0443\u0442\u0438 \u043C\u0430\u0441\u0448\u0442\u0430\u0431
+ExternalImageAddAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F...
+ExternalImageChangeAction.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F...
+ExternalImageRemoveAction.text=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F
+ExtractLinkFromTextAction.text=\u041F\u0435\u0440\u0435\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0442\u0435\u043A\u0441\u0442 \u043D\u0430 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+ExtractLinkFromTextAction.tooltip=\u0417\u0440\u043E\u0431\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0437 \u0430\u0434\u0440\u0435\u0441\u0438 \u0443 \u0442\u0435\u043A\u0441\u0442\u0456 \u0432\u0443\u0437\u043B\u0430
+extras=&\u0417\u0430\u0441\u043E\u0431\u0438
+f_button_unassigned=<\u043D\u0435 \u043F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043E>
FaqOpenURLAction.text=\u041F\u0438\u0442\u0430\u043D\u043D\u044F, \u0449\u043E \u0447\u0430\u0441\u0442\u043E \u0441\u0442\u0430\u0432\u043B\u044F\u0442\u044C\u0441\u044F
file=\u0424\u0430\u0439\u043B
file_already_exists=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0432\u0436\u0435 \u0456\u0441\u043D\u0443\u0454. \u041F\u0435\u0440\u0435\u043F\u0438\u0441\u0430\u0442\u0438?
-file_not_found=\u041F\u043E\u043C\u0438\u043B\u043A\u0430: \u0444\u0430\u0439\u043B \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u0438\u0439.
-filter_icon=Icon[translate me]
-FindAction.text=\u0428\u0443\u043A\u0430\u0442\u0438
-fit_map_to_page=\u0423\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u0446\u0456
-FitToPage.text=\u041C\u0430\u0441\u0448\u0442\u0430\u0431 "\u0412\u0441\u044F \u043A\u0430\u0440\u0442\u0430"
-FitToPage.tooltip=\u041F\u0456\u0434\u0431\u0438\u0440\u0430\u0454 \u043C\u0430\u0441\u0448\u0442\u0430\u0431, \u0449\u043E\u0431 \u043F\u043E\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0432\u0441\u044E \u043A\u0430\u0440\u0442\u0443 \u0443 \u0432\u0456\u043A\u043D\u0456
-fold=\u0421\u043A\u0440\u0443\u0442\u0438\u0442\u0438
-FoldAllAction.text=\u0421\u043A\u0440\u0443\u0442\u0438\u0442\u0438 \u0432\u0441\u0435
-FoldAllAction.tooltip=<html> \u0417\u0433\u043E\u0440\u0442\u0430\u0454 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u0456 \u0443\u0441\u0456 \u043F\u043E\u0434\u0430\u043B\u044C\u0448\u0456 \u0432\u0443\u0437\u043B\u0438 </html>
-FoldOneLevelAction.text=\u0421\u043A\u0440\u0443\u0442\u0438\u0442\u0438 \u0440\u0456\u0432\u0435\u043D\u044C
-FoldOneLevelAction.tooltip=<html> \u0417\u0433\u043E\u0440\u0442\u0430\u0454 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u043D\u0430 \u043E\u0434\u0438\u043D \u0440\u0456\u0432\u0435\u043D\u044C </html>
+file_not_found=\u0424\u0430\u0439\u043B {0} \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E
+FileListFlavorHandler=\u041F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u0444\u0430\u0439\u043B\u0438
+FileProperties_BranchLeafCount=\u0427\u0438\u0441\u043B\u043E \u043A\u0456\u043D\u0446\u0435\u0432\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432 \u0443 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0433\u0456\u043B\u043A\u0430\u0445:
+FileProperties_BranchNodeCount=\u0427\u0438\u0441\u043B\u043E \u0432\u0443\u0437\u043B\u0456\u0432 \u0443 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0433\u0456\u043B\u043A\u0430\u0445:
+FileProperties_ChangesSinceLastSave=\u0417\u043C\u0456\u043D \u043F\u0456\u0441\u043B\u044F \u043E\u0441\u0442\u0430\u043D\u043D\u044C\u043E\u0433\u043E \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F:
+FileProperties_FileName=\u041D\u0430\u0437\u0432\u0430 \u0444\u0430\u0439\u043B\u0443:
+FileProperties_FileSaved=\u0424\u0430\u0439\u043B \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043E:
+FileProperties_FileSize=\u0420\u043E\u0437\u043C\u0456\u0440 \u0444\u0430\u0439\u043B\u0443:
+FileProperties_MainBranchCount=\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0433\u043E\u043B\u043E\u0432\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432:
+FileProperties_NeverSaved=\u041D\u0435 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u043B\u043E\u0441\u044C
+FileProperties_NodeChildCount=\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043D\u0430\u0449\u0430\u0434\u043A\u0456\u0432 \u0443 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432:
+FileProperties_NodeSelectionCount=\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432:
+FileProperties_TotalFilteredCount=\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0432\u0443\u0437\u043B\u0456\u0432, \u0449\u043E \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u044E\u0442\u044C \u0444\u0456\u043B\u044C\u0442\u0440\u0443:
+FileProperties_TotalLeafCount=\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043A\u0456\u043D\u0446\u0435\u0432\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432:
+FileProperties_TotalNodeCount=\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0432\u0443\u0437\u043B\u0456\u0432:
+FilePropertiesAction.text=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 \u043A\u0430\u0440\u0442\u0438...
+FileRevisionsDialog.cancel=&\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+FileRevisionsDialog.file_last_modified=\u041C\u0456\u0442\u043A\u0430 \u0447\u0430\u0441\u0443
+FileRevisionsDialog.file_name=\u0424\u0430\u0439\u043B
+FileRevisionsDialog.file_size=\u0411\u0430\u0439\u0442\u0456\u0432
+FileRevisionsDialog.open=&\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438
+FileRevisionsDialog.open.tooltip=\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0444\u0430\u0439\u043B, \u043D\u0430\u0432\u0456\u0442\u044C \u044F\u043A\u0449\u043E \u0432\u0456\u043D \u0437\u0430\u0441\u0442\u0430\u0440\u0456\u0432
+FileRevisionsDialog.question=\u0412\u0438\u044F\u0432\u043B\u0435\u043D\u043E \u0432\u0435\u0440\u0441\u0456\u0457 {0}
+FileRevisionsDialog.restore=&\u0412\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438
+FileRevisionsDialog.restore.tooltip=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 {0} \u043D\u0430 {1}
+FileRevisionsDialog.title=\u0412\u0435\u0440\u0441\u0456\u0457 \u0444\u0430\u0439\u043B\u0443
+filter=\u0424&\u0456\u043B\u044C\u0442\u0440
+filter_add=&\u0414\u043E\u0434\u0430\u0442\u0438
+filter_and=&\u0406
+filter_any_text=\u0422\u0435\u043A\u0441\u0442, \u043F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456 \u0430\u0431\u043E \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0430
+filter_clone_snapshot=\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u043A\u043B\u043E\u043D\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E
+filter_clones=\u041A\u043B\u043E\u043D\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E
+filter_conditions=\u0424\u0456\u043B\u044C\u0442\u0440\u0438
+filter_contains=\u041C\u0456\u0441\u0442\u0438\u0442\u044C
+filter_created_after=\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u0456 \u043F\u0456\u0441\u043B\u044F
+filter_created_before=\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u0456 \u0434\u043E
+filter_delete=&\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438
+filter_details=\u041F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456
+filter_dialog=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043D\u043D\u044F \u0444\u0456\u043B\u044C\u0442\u0440\u0430
+filter_does_not_exist=\u041D\u0435 \u0456\u0441\u043D\u0443\u0454
+filter_edit_description=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0441\u043F\u0438\u0441\u043E\u043A \u0444\u0456\u043B\u044C\u0442\u0440\u0456\u0432
+filter_enter_value=\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F
+filter_even_level=\u0412\u0443\u0437\u043E\u043B \u043D\u0435\u043F\u0430\u0440\u043D\u043E\u0433\u043E \u0440\u0456\u0432\u043D\u044F
+filter_exist=\u0406\u0441\u043D\u0443\u0454
+filter_icon=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0430
+filter_is_equal_to=\u0414\u043E\u0440\u0456\u0432\u043D\u044E\u0454
+filter_is_not_equal_to=\u041D\u0435 \u0434\u043E\u0440\u0456\u0432\u043D\u044E\u0454
+filter_leaf=\u041E\u0441\u0442\u0430\u043D\u043D\u0456\u0439 \u0432\u0443\u0437\u043E\u043B
+filter_link=\u0413\u0456\u043F\u0435\u0440\u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+filter_match_approximately=&\u041F\u0440\u0438\u0431\u043B\u0438\u0437\u043D\u043E
+filter_match_approximately_tooltip=<html>\u0414\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u043F\u0440\u0438\u0431\u043B\u0438\u0437\u043D\u0438\u0439 \u043F\u043E\u0448\u0443\u043A,<br/>\u0442\u043E\u0431\u0442\u043E \u043F\u0440\u0438 \u043F\u043E\u0448\u0443\u043A\u0443 "\u043F\u0456\u043D\u043A\u0430" \u0437\u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0438 \u0442\u0430\u043A\u043E\u0436 "\u0441\u0442\u0456\u043D\u043A\u0430".</html>
+filter_match_case=\u0412\u0440\u0430\u0445\u043E\u0432\u0443\u0432\u0430\u0442\u0438 &\u0440\u0435\u0433\u0456\u0441\u0442\u0440
+filter_match_case_tooltip=\u041F\u0440\u0438 \u043F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u0456 \u0432\u0440\u0430\u0445\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0433\u0456\u0441\u0442\u0440.
+filter_modified_after=\u0417\u043C\u0456\u043D\u0435\u043D\u043E \u043F\u0456\u0441\u043B\u044F
+filter_modified_before=\u0417\u043C\u0456\u043D\u0435\u043D\u043E \u0434\u043E
+filter_no_filtering=\u0412\u0456\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0438 \u0444\u0456\u043B\u044C\u0442\u0440
+filter_node=\u0422\u0435\u043A\u0441\u0442 \u0432\u0443\u0437\u043B\u0430
+filter_node_level=\u0420\u0456\u0432\u0435\u043D\u044C \u0432\u0443\u0437\u043B\u0430
+filter_not=&\u041D\u0435
+filter_note=\u041F\u0440\u0438\u043C\u0456\u0442\u043A\u0430
+filter_odd_level=\u041F\u0430\u0440\u043D\u0438\u0439 \u0440\u0456\u0432\u0435\u043D\u044C \u0432\u0443\u0437\u043B\u0430
+filter_or=\u0410&\u0431\u043E
+filter_parent=\u0422\u0435\u043A\u0441\u0442 \u043F\u0440\u0435\u0434\u043A\u0430
+filter_periodic_level=\u041F\u0435\u0440\u0456\u043E\u0434\u0438\u0447\u043D\u0435
+filter_priority=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442
+filter_regexp_matches=\u0412\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u0454 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u043E\u043C\u0443 \u0432\u0438\u0440\u0430\u0437\u0443
+filter_reminder=\u041D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
+filter_reminder_after=\u0437\u0430\u043F\u043B\u0430\u043D\u043E\u0432\u0430\u043D\u043E \u043F\u0456\u0441\u043B\u044F
+filter_reminder_before=\u0437\u0430\u043F\u043B\u0430\u043D\u043E\u0432\u0430\u043D\u043E \u0434\u043E
+filter_reminder_executed=\u0432\u0436\u0435 \u0443\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E
+filter_reminder_later=\u0437\u0430\u043F\u043B\u0430\u043D\u043E\u0432\u0430\u043D\u043E \u043F\u0456\u0437\u043D\u0456\u0448\u0435
+filter_root=\u041A\u043E\u0440\u0435\u043D\u0435\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
+filter_script=\u0424\u0456\u043B\u044C\u0442\u0440 \u0441\u043A\u0440\u0438\u043F\u0442\u0456\u0432
+filter_select=&\u0412\u0438\u0431\u0440\u0430\u0442\u0438
+filter_selected_node_view=\u0412\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
+filter_selected_node_view_snapshot=\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0439 \u0432\u0438\u0431\u0456\u0440
+filter_style=\u0421\u0442\u0438\u043B\u044C
+filter_time=\u0424\u0456\u043B\u044C\u0442\u0440 \u0434\u0430\u0442\u0438
+FilterCondition=\u0423\u043C\u043E\u0432\u0438 \u0444\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u043D\u043D\u044F
+filterConditions=\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044C\u043A\u0456 \u0444\u0456\u043B\u044C\u0442\u0440\u0438
+filterConditions.noActions=\u0424\u0456\u043B\u044C\u0442\u0440\u0438 \u0431\u0435\u0437 \u043D\u0430\u0437\u0432
+filters_not_loaded=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0444\u0456\u043B\u044C\u0442\u0440, \u0444\u0430\u0439\u043B \u043F\u043E\u0448\u043A\u043E\u0434\u0436\u0435\u043D\u043E
+find=\u0417\u043D\u0430\u0439\u0442\u0438
+find_what=\u0428\u0443\u043A\u0430\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442
+FindAction.text=&\u0428\u0443\u043A\u0430\u0442\u0438...
+FindNextAction.text=\u0417\u043D\u0430\u0439\u0442\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0435
+FindPreviousAction.text=\u0417\u043D\u0430\u0439\u0442\u0438 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0454
+fit_background_to_page=\u0412\u043F\u0438\u0441\u0430\u0442\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0442\u043B\u0430 \u0432 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443
+fit_map_to_page=&\u041F\u0456\u0434\u0456\u0433\u043D\u0430\u0442\u0438 \u0434\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438
+fit_map_to_page_height=\u041F\u0456\u0434\u0456\u0433\u043D\u0430\u0442\u0438 &\u0432\u0438\u0441\u043E\u0442\u0443 \u0434\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438
+fit_map_to_page_width=\u041F\u0456\u0434\u0456\u0433\u043D\u0430\u0442\u0438 &\u0448\u0438\u0440\u0438\u043D\u0443 \u0434\u043E \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438
+FitToPage.text=\u041C\u0430\u0441\u0448\u0442\u0430\u0431\u0443\u0432\u0430\u0442\u0438 \u0437\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u043E\u044E
+FitToPage.tooltip=\u041F\u0456\u0434\u0431\u0438\u0440\u0430\u0454 \u043C\u0430\u0441\u0448\u0442\u0430\u0431, \u0449\u043E\u0431 \u043F\u043E\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0432\u0441\u044E \u043A\u0430\u0440\u0442\u0443 \u0443 \u0432\u0456\u043A\u043D\u0456.
+fold=\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438
+FoldAllAction.text=\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0441\u0435
+FoldAllAction.tooltip=<html>\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u0442\u0430 \u0432\u0441\u0456\u0445 \u0457\u0445\u043D\u0456\u0445 \u043D\u0430\u0449\u0430\u0434\u043A\u0456\u0432.</html>
+FoldOneLevelAction.text=\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0440\u0456\u0432\u0435\u043D\u044C
+FoldOneLevelAction.tooltip=<html>\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u043D\u0430 \u043E\u0434\u0438\u043D \u0440\u0456\u0432\u0435\u043D\u044C.</html>
+follow_clone=\u0412\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0456 ''{0}''
+follow_graphical_link=\u041F\u0435\u0440\u0435\u0445\u0456\u0434 \u0434\u043E ''{0}''
+FollowLinkAction.text=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0437\u0430 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F\u043C
font=\u0428\u0440\u0438\u0444\u0442
FontFamilyAction.text=\u0428\u0440\u0438\u0444\u0442
FontSizeAction.text=\u0420\u043E\u0437\u043C\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0443
-format_menu_edge_styles=\u0422\u0438\u043F \u043B\u0456\u043D\u0456\u0439
-format_menu_edge_widths=\u0422\u043E\u0432\u0449\u0438\u043D\u0430 \u043B\u0456\u043D\u0456\u0439
+format=\u0424\u043E\u0440\u043C\u0430\u0442
+format_invalid_pattern=\u041D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u0438\u0439 \u0448\u0430\u0431\u043B\u043E\u043D
+format_menu_cloud_shapes=\u0414\u043E\u0434\u0430\u0442\u0438 \u0430\u0431\u043E \u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u0445\u043C\u0430\u0440\u043A\u0443
+format_menu_edge_styles=\u0421\u0442\u0438\u043B\u0456 &\u0440\u0435\u0431\u0435\u0440
+format_menu_edge_widths=\u0422\u043E\u0432&\u0449\u0438\u043D\u0430 \u0440\u0435\u0431\u0435\u0440
+format_panel=\u0424\u043E\u0440\u043C\u0430\u0442
FormatCopy.text=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442
FormatCopy.tooltip=<html> \u041A\u043E\u043F\u0456\u044E\u0454 \u0444\u043E\u0440\u043C\u0430\u0442 \u0432\u0443\u0437\u043B\u0430 </html>
FormatPaste.text=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442
FormatPaste.tooltip=<html> \u0417\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0443\u0454 \u0434\u043E \u0432\u0443\u0437\u043B\u0430 \u0441\u043A\u043E\u043F\u0456\u0439\u043E\u0432\u0430\u043D\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 </html>
+formats_not_loaded=\u0424\u043E\u0440\u043C\u0430\u0442\u0438 \u043D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438, \u0444\u0430\u0439\u043B \u043F\u043E\u0448\u043A\u043E\u0434\u0436\u0435\u043D\u043E
+formula.error.attributeValueIsNull=\u041F\u0456\u0441\u043B\u044F \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0443 "{0}" - \u043D\u0443\u043B\u044C\u043E\u0432\u0435.
+formula.error.circularReference=\u0426\u0438\u043A\u043B\u0456\u0447\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F: \u0424\u043E\u0440\u043C\u0443\u043B\u0430 \u0443 \u0432\u0443\u0437\u043B\u0456 "{0}" \u043F\u043E\u0441\u0438\u043B\u0430\u0454\u0442\u044C\u0441\u044F \u0441\u0430\u043C\u0430 \u043D\u0430 \u0441\u0435\u0431\u0435.
+formula.EvaluateAllAction.text=\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438 \u0432\u0441\u0435
+formula.EvaluateAllAction.tooltip=\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438 \u0432\u0441\u0456 \u0444\u043E\u0440\u043C\u0443\u043B\u0438 \u043F\u043E\u0442\u043E\u0447\u043D\u043E\u0457 \u043A\u0430\u0440\u0442\u0438
+formula.menuname=\u0424\u043E\u0440\u043C\u0443\u043B\u0438
+formula_editor=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0443
ForwardAction.text=\u0412\u043F\u0435\u0440\u0435\u0434
-freeplane_reverted=Freeplane_Reverted_[translate me]
+ForwardAction.tooltip=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0432\u043F\u0435\u0440\u0435\u0434 \u0443 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u043C\u0443 \u043B\u0430\u043D\u0446\u044E\u0436\u043A\u0443
+FreeNodeAction.text=\u0412\u0456\u043B\u044C\u043D\u043E \u0440\u043E\u0437\u043C\u0456\u0449\u0435\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B (\u0442\u0430\u043A/\u043D\u0456)
+Freeplane.progress.buildScreen=\u0415\u043A\u0440\u0430\u043D \u043F\u043E\u0431\u0443\u0434\u043E\u0432\u0438...
+Freeplane.progress.createController=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u0440...
+Freeplane.progress.createInitialMode=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0438\u0439 \u0440\u0435\u0436\u0438\u043C...
+Freeplane.progress.endStartup=\u0417\u0430\u043F\u0443\u0441\u043A \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E.
+Freeplane.progress.gettingPreferenceDirectories=\u041E\u0442\u0440\u0438\u043C\u0430\u043D\u043D\u044F \u0442\u0435\u043A \u0437 \u0443\u043F\u043E\u0434\u043E\u0431\u0430\u043D\u043D\u044F\u043C\u0438...
+Freeplane.progress.gettingPreferences=\u041E\u0442\u0440\u0438\u043C\u0430\u043D\u043D\u044F \u0443\u043F\u043E\u0434\u043E\u0431\u0430\u043D\u044C...
+Freeplane.progress.loadMaps=\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u043A\u0430\u0440\u0442...
+Freeplane.progress.propagateLookAndFeel=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0432\u0438\u0433\u043B\u044F\u0434\u0443...
+Freeplane.progress.settingPreferences=\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0443\u043F\u043E\u0434\u043E\u0431\u0430\u043D\u044C...
+Freeplane.progress.startCreateController=\u041F\u043E\u0447\u0430\u0442\u0438 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0435\u0440\u0430...
+Freeplane.progress.updateLookAndFeel=\u041E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0432\u0438\u0433\u043B\u044F\u0434\u0443...
+freeplane_reverted=\u041F\u0435\u0440\u0435\u0442\u0432\u043E\u0440\u0435\u043D\u0438\u0439_Freeplane_
FreeplaneHelpStarter.text=\u0414\u043E\u043F\u043E\u043C\u043E\u0433\u0430 ...
-FreeplaneHelpStarter.tooltip=\u0414\u043E\u043F\u043E\u043C\u043E\u0433\u0430...
+FreeplaneHelpStarter.tooltip=\u0414\u0435\u0442\u0430\u043B\u044C\u043D\u0430 \u0434\u043E\u0432\u0456\u0434\u043A\u0430
+GettingStartedAction.text=\u041F\u043E\u0441\u0456\u0431\u043D\u0438\u043A
+goto=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E
+goto.noActions=\u041D\u0435\u043C\u0430\u0454 \u0446\u0456\u043B\u044C\u043E\u0432\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
GotoLinkNodeAction.text=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043F\u043E \u0437\u0432'\u044F\u0437\u0446\u0456
-GrabKeyDialog.common.cancel=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438
+GotoNodeAction.text=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u0432\u0443\u0437\u043B\u0430 \u0437 ID...
+GrabKeyDialog.common.cancel=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
GrabKeyDialog.common.ok=\u0413\u0430\u0440\u0430\u0437\u0434
GrabKeyDialog.grab-key.assigned-to=\u041F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043E
GrabKeyDialog.grab-key.assigned-to.none=\u0412\u0456\u0434\u0441\u0443\u0442\u043D\u0456\u0439
GrabKeyDialog.grab-key.clear=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438
GrabKeyDialog.grab-key.remove=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438
GrabKeyDialog.grab-key.remove-ask=\u0412\u0438 \u0434\u0456\u0439\u0441\u043D\u043E \u0445\u043E\u0447\u0435\u0442\u0435 \u0432\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448\u0456?
-GrabKeyDialog.grab-key.title=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u043D\u043E\u0432\u0443 \u043A\u043B\u0430\u0432\u0456\u0448\u0443
+GrabKeyDialog.grab-key.title=\u041D\u0430\u0442\u0438\u0441\u043D\u0456\u0442\u044C \u043D\u043E\u0432\u0443 \u043A\u043B\u0430\u0432\u0456\u0448\u0443
+green=\u0417\u0435\u043B\u0435\u043D\u0438\u0439
help=\u0414\u043E\u043F\u043E\u043C\u043E\u0433\u0430
-HierarchicalIconsAction.text=\u0414\u043E\u0447\u0456\u0440\u043D\u0456 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
-HierarchicalIconsAction.tooltip=\u041F\u043E\u043A\u0430\u0437\u0443\u0454 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
+HideableAction.tooltip=<html>\u041F\u043E\u0437\u043D\u0430\u0447\u0430\u0454 \u0442\u043B\u043E \u043A\u043E\u0436\u043D\u043E\u0433\u043E \u0437\u043C\u0456\u043D\u0435\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430.</html>
+HideAllAttributesAction.text=\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+HierarchicalIcons2Action.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u043F\u0435\u0440\u0435\u0442\u0438\u043D\u0438 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u0445 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C
+HierarchicalIconsAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0456\u0454\u0440\u0430\u0440\u0445\u0456\u044E \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C
+HierarchicalIconsAction.tooltip=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0437\u043C\u0435\u043D\u0448\u0435\u043D\u0456 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u0431\u043B\u0438\u0437\u044C\u043A\u0438\u0445 \u0456 \u0434\u0430\u043B\u0435\u043A\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432-\u043D\u0430\u0449\u0430\u0434\u043A\u0456\u0432.
+hot_keys=\u0421\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448
+hot_keys_table=\u0422\u0430\u0431\u043B\u0438\u0446\u044F \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u044C \u043A\u043B\u0430\u0432\u0456\u0448
+HotKeyInfoAction.text=\u041E\u043F\u0438\u0441 \u043A\u043B\u0430\u0432\u0456\u0448
html_export_based_on_headings=\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0434\u043E HTML - \u041D\u0430 \u043E\u0441\u043D\u043E\u0432\u0456 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0456\u0432
html_export_fold_all=\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0434\u043E HTML - \u0417\u0433\u043E\u0440\u0442\u0430\u0442\u0438 \u0443\u0441\u0435
html_export_fold_currently_folded=\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0434\u043E HTML - \u0417\u0433\u043E\u0440\u0442\u0430\u0442\u0438 \u044F\u043A \u0437\u0430\u0440\u0430\u0437
html_export_no_folding=\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0434\u043E HTML - \u0411\u0435\u0437 \u0437\u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F
-icon_0%=0%[translate me]
-icon_100%=100%[translate me]
-icon_25%=25%[translate me]
-icon_50%=50%[translate me]
-icon_75%=75%[translate me]
+html_problem=<html>\u041D\u0435 \u0432\u0434\u0430\u0454\u0442\u044C\u0441\u044F \u043E\u0431\u0440\u043E\u0431\u0438\u0442\u0438 HTML<br><br>{0}
+icon_0%=0%
+icon_100%=100%
+icon_25%=25%
+icon_50%=50%
+icon_75%=75%
+icon_addition=\u0414\u043E\u0434\u0430\u0442\u043E\u043A
icon_attach=\u0417\u0432\u0435\u0440\u043D\u0438 \u0443\u0432\u0430\u0433\u0443
+icon_audio=\u0417\u0432\u0443\u043A
icon_back=\u041D\u0430\u0437\u0430\u0434
-icon_bee=Freeplane[translate me]
+icon_bee=Freeplane
icon_bell=\u041D\u0430\u0433\u0430\u0434\u0430\u0442\u0438
icon_bookmark=\u0412\u0456\u0434\u043C\u0456\u043D\u043D\u043E
-icon_broken-line=Broken[translate me]
+icon_broken-line=\u041F\u043E\u0448\u043A\u043E\u0434\u0436\u0435\u043D\u043E
icon_button_cancel=\u041D\u0435 \u0433\u0430\u0440\u0430\u0437\u0434
icon_button_ok=\u0413\u0430\u0440\u0430\u0437\u0434
icon_calendar=\u0414\u0430\u0442\u0430
+icon_checked=\u041F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E
icon_clanbomber=\u041D\u0435\u0431\u0435\u0437\u043F\u0435\u0447\u043D\u043E
-icon_closed=No Entry[translate me]
-icon_decrypted=Unlocked[translate me]
+icon_clock=\u0427\u0430\u0441
+icon_clock2=\u041D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
+icon_closed=\u0412\u0445\u043E\u0434\u0443 \u043D\u0435\u043C\u0430\u0454
+icon_decrypted=\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u043E
icon_desktop_new=\u041D\u0435 \u0437\u0430\u0431\u0443\u0434\u044C
-icon_female1=Female1[translate me]
-icon_female2=Female2[translate me]
-icon_flag=\u041F\u0440\u0430\u043F\u043E\u0440\u0435\u0446\u044C
-icon_flag-black=Black Flag[translate me]
-icon_flag-pink=Pink Flag[translate me]
+icon_division=\u0414\u0456\u043B\u0435\u043D\u043D\u044F
+icon_down=\u0412\u043D\u0438\u0437
+icon_edit=\u0423\u0442\u043E\u0447\u043D\u0438\u0442\u0438
+icon_encrypted=\u0417\u0430\u043A\u0440\u0438\u0442\u043E
+icon_executable=\u0412\u0438\u043A\u043E\u043D\u0443\u0432\u0430\u043D\u0438\u0439
+icon_family=\u0421\u0456\u043C'\u044F
+icon_fema=\u0427\u043E\u043B\u043E\u0432\u0456\u043A \u0456 \u0436\u0456\u043D\u043A\u0430
+icon_female1=\u0416\u0456\u043D\u043A\u04301
+icon_female2=\u0416\u0456\u043D\u043A\u04302
+icon_females=\u0416\u0456\u043D\u043A\u0438
+icon_flag=\u0427\u0435\u0440\u0432\u043E\u043D\u0438\u0439 \u043F\u0440\u0430\u043F\u043E\u0440\u0435\u0446\u044C
+icon_flag-black=\u0427\u043E\u0440\u043D\u0438\u0439 \u043F\u0440\u0430\u043F\u043E\u0440\u0435\u0446\u044C
+icon_flag-blue=\u0421\u0438\u043D\u0456\u0439 \u043F\u0440\u0430\u043F\u043E\u0440\u0435\u0446\u044C
+icon_flag-green=\u0417\u0435\u043B\u0435\u043D\u0438\u0439 \u043F\u0440\u0430\u043F\u043E\u0440\u0435\u0446\u044C
+icon_flag-orange=\u041E\u0440\u0430\u043D\u0436\u0435\u0432\u0438\u0439 \u043F\u0440\u0430\u043F\u043E\u0440\u0435\u0446\u044C
+icon_flag-pink=\u0420\u043E\u0436\u0435\u0432\u0438\u0439 \u043F\u0440\u0430\u043F\u043E\u0440\u0435\u0446\u044C
+icon_flag-yellow=\u0416\u043E\u0432\u0442\u0438\u0439 \u043F\u0440\u0430\u043F\u043E\u0440\u0435\u0446\u044C
+icon_folder=\u0422\u0435\u043A\u0430
icon_forward=\u0412\u043F\u0435\u0440\u0435\u0434
-icon_freemind_butterfly=FreeMind[translate me]
+icon_freemind_butterfly=FreeMind
+icon_full-0=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 0
icon_full-1=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 1
icon_full-2=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 2
icon_full-3=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 3
@@ -169,131 +598,412 @@ icon_full-4=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 4
icon_full-5=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 5
icon_full-6=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 6
icon_full-7=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 7
+icon_full-8=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 8
+icon_full-9=\u041F\u0440\u0456\u043E\u0440\u0438\u0442\u0435\u0442 9
+icon_go=\u0417\u0435\u043B\u0435\u043D\u0435 \u0441\u0432\u0456\u0442\u043B\u043E \u0441\u0432\u0456\u0442\u043B\u043E\u0444\u043E\u0440\u0430
icon_gohome=\u0414\u043E\u0434\u043E\u043C\u0443
+icon_group=\u0413\u0440\u0443\u043F\u0430
icon_help=\u041F\u0438\u0442\u0430\u043D\u043D\u044F
-icon_hourglass=Waiting[translate me]
+icon_hourglass=\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F
+icon_icon_not_found=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0443 \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E
icon_idea=\u0406\u0434\u0435\u044F
+icon_image=\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F
+icon_info=\u0406\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044F
+icon_internet=\u0406\u043D\u0442\u0435\u0440\u043D\u0435\u0442
+icon_internet_warning=\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F \u0406\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0443
icon_kaddressbook=\u0422\u0435\u043B\u0435\u0444\u043E\u043D
+icon_kmail=\u0415\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u0430 \u0430\u0434\u0440\u0435\u0441\u0430
icon_knotify=\u041C\u0443\u0437\u0438\u043A\u0430
icon_korn=\u041F\u043E\u0448\u0442\u043E\u0432\u0430 \u0441\u043A\u0440\u0438\u043D\u044C\u043A\u0430
icon_ksmiletris=\u042F \u0449\u0430\u0441\u043B\u0438\u0432\u0438\u0439
+icon_launch=\u0417\u0430\u043F\u0443\u0441\u043A
icon_licq=\u0424\u0430\u0439\u043D\u0435\u043D\u044C\u043A\u043E
+icon_list=\u0421\u043F\u0438\u0441\u043E\u043A
icon_Mail=\u041F\u043E\u0448\u0442\u0430
-icon_male1=Male1[translate me]
-icon_male2=Male2[translate me]
+icon_male1=\u0427\u043E\u043B\u043E\u0432\u0456\u043A1
+icon_male2=\u0427\u043E\u043B\u043E\u0432\u0456\u043A2
+icon_males=\u0427\u043E\u043B\u043E\u0432\u0456\u043A\u0438
icon_menu=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
icon_messagebox_warning=\u0412\u0430\u0436\u043B\u0438\u0432\u043E
+icon_mindmap=\u0410\u0441\u043E\u0446\u0456\u0430\u0442\u0438\u0432\u043D\u0430 \u043A\u0430\u0440\u0442\u0430
+icon_multiplication=\u041C\u0443\u043B\u044C\u0442\u0438\u043F\u043B\u0456\u043A\u0430\u0446\u0456\u044F
+icon_narrative=\u041A\u043E\u043C\u0435\u043D\u0442\u0430\u0440
+icon_negative=\u041D\u0435\u0433\u0430\u0442\u0438\u0432\u043D\u043E
+icon_neutral=\u041D\u0435\u0439\u0442\u0440\u0430\u043B\u044C\u043D\u043E
icon_password=\u041A\u043B\u044E\u0447
icon_pencil=\u0410\u043A\u0443\u0440\u0430\u0442\u043D\u0456\u0448\u0435
icon_penguin=Linux
-icon_smiley-neutral=No Mind[translate me]
+icon_positive=\u041F\u043E\u0437\u0438\u0442\u0438\u0432\u043D\u043E
+icon_prepare=\u0416\u043E\u0432\u0442\u0435 \u0441\u0432\u0456\u0442\u043B\u043E \u0441\u0432\u0456\u0442\u043B\u043E\u0444\u043E\u0440\u0430
+icon_revision=\u0412\u0435\u0440\u0441\u0456\u044F
+icon_smiley-angry=\u0421\u0435\u0440\u0434\u0438\u0442\u0438\u0439
+icon_smiley-neutral=\u0411\u0430\u0439\u0434\u0443\u0436\u0435
+icon_smiley-oh=\u0417\u0434\u0438\u0432\u043E\u0432\u0430\u043D\u0438\u0439
+icon_smily_bad=\u041C\u0435\u043D\u0456 \u043D\u0435 \u0432\u0435\u0441\u0435\u043B\u043E
icon_stop=\u0421\u0442\u043E\u043F
+icon_stop-sign=\u0421\u0442\u043E\u043F
+icon_subtraction=\u0412\u0456\u0434\u043D\u0456\u043C\u0430\u043D\u043D\u044F
+icon_unchecked=\u041D\u0435 \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E
+icon_up=\u0412\u0433\u043E\u0440\u0443
+icon_user_icon=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430
+icon_very_negative=\u0414\u0443\u0436\u0435 \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u043D\u043E
+icon_very_positive=\u0414\u0443\u0436\u0435 \u043F\u043E\u0437\u0438\u0442\u0438\u0432\u043D\u043E
+icon_video=\u0412\u0456\u0434\u0435\u043E
icon_wizard=\u0427\u0430\u0440\u0456\u0432\u043D\u0438\u0446\u0442\u0432\u043E
icon_xmag=\u041E\u0431\u0433\u043E\u0432\u043E\u0440\u0438\u0442\u0438
icon_yes=\u0412\u0430\u0436\u043B\u0438\u0432\u043E
-IconGroupPopupAction.arrows.text=Arrows[translate me]
-IconGroupPopupAction.smiley.text=Smiley[translate me]
+IconGroupPopupAction.arrows.text=\u0421\u0442\u0440\u0456\u043B\u043A\u0438
+IconGroupPopupAction.docs_folders.text=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438 \u0456 \u0442\u0435\u043A\u0438
+IconGroupPopupAction.flags.text=\u041F\u0440\u0430\u043F\u043E\u0440\u0446\u0456
+IconGroupPopupAction.math.text=\u041C\u0430\u0442\u0435\u043C\u0430\u0442\u0438\u043A\u0430
+IconGroupPopupAction.media.text=\u0417\u041C\u0406
+IconGroupPopupAction.miscellaneous.text=\u0420\u0456\u0437\u043D\u0435
+IconGroupPopupAction.nature.text=\u041F\u0440\u0438\u0440\u043E\u0434\u0430
+IconGroupPopupAction.numbers.text=\u0427\u0438\u0441\u043B\u0430
+IconGroupPopupAction.office.text=\u041E\u0444\u0456\u0441
+IconGroupPopupAction.people.text=\u041B\u044E\u0434\u0438
+IconGroupPopupAction.rating.text=\u0420\u0435\u0439\u0442\u0438\u043D\u0433
+IconGroupPopupAction.signs.text=\u0417\u043D\u0430\u043A\u0438
+IconGroupPopupAction.smiley.text=\u041F\u043E\u0441\u043C\u0456\u0448\u043A\u0438
+IconGroupPopupAction.time.text=\u0427\u0430\u0441
+IconGroupPopupAction.user.text=\u0412\u043B\u0430\u0441\u043D\u0456 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
+IconProgressExtended10Action.text=\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u0438\u0439 \u043F\u043E\u0441\u0442\u0443\u043F 10%
+IconProgressExtended10Action.tooltip=<html>\u0414\u043E\u0434\u0430\u0454 \u0456\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440 \u043F\u043E\u0441\u0442\u0443\u043F\u0443, \u043F\u043E\u043A\u0430\u0437\u0438 \u044F\u043A\u043E\u0433\u043E \u0437\u0431\u0456\u043B\u044C\u0448\u0443\u044E\u0442\u044C\u0441\u044F \u043D\u0430 10% \u043F\u0440\u0438 \u043F\u043E\u0434\u0432\u0456\u0439\u043D\u043E\u043C\u0443 \u043A\u043B\u0430\u0446\u0430\u043D\u043D\u0456.<br> <Ctrl>+\u043F\u043E\u0434\u [...]
+IconProgressExtended25Action.text=\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u0438\u0439 \u043F\u043E\u0441\u0442\u0443\u043F 25%
+IconProgressExtended25Action.tooltip=<html>\u0414\u043E\u0434\u0430\u0454 \u0456\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440 \u043F\u043E\u0441\u0442\u0443\u043F\u0443, \u043F\u043E\u043A\u0430\u0437\u0438 \u044F\u043A\u043E\u0433\u043E \u0437\u0431\u0456\u043B\u044C\u0448\u0443\u044E\u0442\u044C\u0441\u044F \u043D\u0430 25% \u043F\u0440\u0438 \u043F\u043E\u0434\u0432\u0456\u0439\u043D\u043E\u043C\u0443 \u043A\u043B\u0430\u0446\u0430\u043D\u043D\u0456.<br> <Ctrl>+\u043F\u043E\u0434\u [...]
+IconProgressIconDownAction.text=\u041F\u043E\u0441\u0442\u0443\u043F \u0432\u043D\u0438\u0437
+IconProgressIconDownAction.tooltip=\u0417\u043C\u0435\u043D\u0448\u0438\u0442\u0438/ \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438/ \u0432\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0437\u043D\u0430\u0447\u043A\u0438 \u043F\u043E\u0441\u0442\u0443\u043F\u0443 (100% -> 75% -> 50% -> 25% -> 0% -> \u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438).
+IconProgressIconUpAction.text=\u041F\u043E\u0441\u0442\u0443\u043F \u0432\u0433\u043E\u0440\u0443
+IconProgressIconUpAction.tooltip=\u0417\u0431\u0456\u043B\u044C\u0448\u0438\u0442\u0438/ \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0437\u043D\u0430\u0447\u043A\u0438 \u043F\u043E\u0441\u0442\u0443\u043F\u0443 (0% -> 25% -> 50% -> 75% -> 100% + \u0413\u0430\u0440\u0430\u0437\u0434).
+IconProgressRemoveAction.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043F\u043E\u0441\u0442\u0443\u043F
+IconProgressRemoveAction.tooltip=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u043F\u043E\u0441\u0442\u0443\u043F\u0443 \u0456 \u0440\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043E\u0433\u043E \u043F\u043E\u0441\u0442\u0443\u043F\u0443.
+icons=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
IconSelectionPlugin.text=\u0412\u0438\u0431\u0456\u0440 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438...
-IconSelectionPlugin.tooltip=<html> \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0456\u043A\u043D\u043E \u0432\u0438\u0431\u043E\u0440\u0443 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 </html>
-import=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438
-import_linked_branch_no_link=\u0412\u0438\u0431\u0440\u0430\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u043A\u0430\u0440\u0442\u0443, \u043F\u0440\u0438\u0434\u0430\u0442\u043D\u0443 \u0434\u043B\u044F \u0456\u043C\u043F\u043E\u0440\u0442\u0443
-ImportBranchAction.text=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0433\u0456\u043B\u043A\u0443 \u0437 (mm-) \u0444\u0430\u0439\u043B\u0443...
-ImportExplorerFavoritesAction.text=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0437\u0430\u043A\u043B\u0430\u0434\u043A\u0438 \u0437 IE...
-ImportFolderStructureAction.text=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0456\u0432...
-ImportLinkedBranchAction.text=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0433\u0456\u043B\u043A\u0443 \u0437 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
-ImportLinkedBranchWithoutRootAction.text=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0437 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0431\u0435\u0437 \u043A\u043E\u0440\u0435\u043D\u044F
-ImportMindmanagerFiles.text=\u041A\u0430\u0440\u0442\u0430 Mindmanager X5...
+IconSelectionPlugin.tooltip=<html>\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0456\u043A\u043D\u043E \u0432\u0438\u0431\u043E\u0440\u0443 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438.</html>
+image_covertLink=\u041F\u0435\u0440\u0435\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F
+ImageFlavorHandler=\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F (\u0437 \u043E\u043A\u0440\u0435\u043C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0443)
+import=&\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438
+import_linked_branch_no_link=\u0412\u0438\u0431\u0440\u0430\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u043D\u0435 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0434\u043B\u044F \u0456\u043C\u043F\u043E\u0440\u0442\u0443.
+ImportAction.text=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u043A\u0430\u0440\u0442\u0443
+ImportBranchAction.text=\u0413\u0456\u043B\u043A\u0430...
+ImportExplorerFavoritesAction.text=\u0423\u043F\u043E\u0434\u043E\u0431\u0430\u043D\u043D\u044F \u043E\u0433\u043B\u044F\u0434\u0430\u0447\u0430...
+ImportFolderStructureAction.text=\u0421\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430 \u0442\u0435\u043A...
+ImportLinkedBranchAction.text=\u041F\u043E\u0432'\u044F\u0437\u0430\u043D\u0430 \u0433\u0456\u043B\u043A\u0430
+ImportLinkedBranchWithoutRootAction.text=\u041F\u043E\u0432'\u044F\u0437\u0430\u043D\u0430 \u0433\u0456\u043B\u043A\u0430 \u0431\u0435\u0437 \u043A\u043E\u0440\u0435\u043D\u044F...
+ImportMindmanagerFiles.text=\u041A\u0430\u0440\u0442\u0430 MindManager X5...
+ImportXmlFile.text=\u0406\u043C\u043F\u043E\u0440\u0442 \u0444\u0430\u0439\u043B\u0443 xml
increase_branch_font_size=\u0417\u0431\u0456\u043B\u044C\u0448\u0438\u0442\u0438 \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0456\u0454\u0457 \u0433\u0456\u043B\u043A\u0438
IncreaseNodeFontAction.text=\u0417\u0431\u0456\u043B\u044C\u0448\u0438\u0442\u0438 \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0456\u0454\u0457 \u0433\u0456\u043B\u043A\u0438
+internal_error_tooltip=\u0412\u0438\u043D\u0438\u043A\u043B\u0430 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u044F \u043F\u043E\u043C\u0438\u043B\u043A\u0430. \u041A\u043B\u0430\u0446\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u0456\u0439 \u0444\u0430\u0439\u043B \u0436\u0443\u0440\u043D\u0430\u043B\u0443 log.0 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0433\u043B\u044F\u0434\u0443 \u043F\u043E [...]
+invalid_export_file=\u041D\u0435\u043F\u0440\u0438\u043F\u0443\u0441\u0442\u0438\u043C\u0430 \u043D\u0430\u0437\u0432\u0430 \u0444\u0430\u0439\u043B\u0443 \u0434\u043B\u044F \u0435\u043A\u0441\u043F\u043E\u0440\u0442\u0443
+invalid_file_msg=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0437\u043D\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043B \u0434\u043B\u044F {0}
+invalid_uri=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 URI {0}
+invalid_url=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u043E\u0433\u043E URL
+invalid_url_msg=\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 URL \u0434\u043B\u044F {0}
ItalicAction.text=\u041A\u0443\u0440\u0441\u0438\u0432
italicise_branch=\u0428\u0440\u0438\u0444\u0442 \u0432\u0441\u0456\u0454\u0457 \u0433\u0456\u043B\u043A\u0438 \u043A\u0443\u0440\u0441\u0438\u0432
-JoinNodesAction.text=\u041E\u0431'\u0454\u0434\u043D\u0430\u0442\u0438 \u0432\u0443\u0437\u043B\u0438
-less_than_two_selected_nodes=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043C\u0456\u043D\u0456\u043C\u0443\u043C \u0434\u0432\u0430 \u0432\u0443\u0437\u043B\u0438, \u0449\u043E\u0431 \u043D\u0430\u043C\u0430\u043B\u044E\u0432\u0430\u0442\u0438 \u0437\u0432'\u044F\u0437\u043A\u0438
-link_not_available_any_more=\u0417\u0432'\u044F\u0437\u043A\u0430 \u043D\u0435\u0434\u0456\u0439\u0441\u043D\u0430, \u0432\u0443\u0437\u043E\u043B \u0431\u0443\u0432 \u0432\u0438\u043B\u0443\u0447\u0435\u043D\u0438\u0439
-locking_failed_by_open=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u0456\u043D\u0448\u043E\u044E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E \u0456 \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0454\u0442\u044C\u0441\u044F \u0442\u0456\u043B\u044C\u043A\u0438 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F
-locking_failed_by_save_as=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u0456\u043D\u0448\u043E\u044E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E \u0456 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0439.
-locking_old_lock_removed=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0431\u0443\u0432 \u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u0438\u0439 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043C {1}. \u0426\u0435 \u0431\u043B\u043E\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u0435 \u044F\u043A \u043D\u0435\u0434\u0456\u0439\u0441\u043D\u0430
+java_version=\u0412\u0435\u0440\u0441\u0456\u044F Java: {0}
+JoinNodesAction.separator.format=\u0417''\u0454\u0434\u043D\u0430\u0442\u0438 \u0432\u0443\u0437\u043B\u0438 \u0437 "{0}"
+lastOpenedMaps=\u041E\u0441\u0442\u0430\u043D\u043D\u0456 \u043A\u0430\u0440\u0442\u0438
+lastOpenedMaps.noActions=\u041A\u0430\u0440\u0442 \u0432 \u0456\u0441\u0442\u043E\u0440\u0456\u0457 \u043D\u0435\u043C\u0430\u0454
+latex_editor=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0443 LaTeX
+LatexDeleteLatexAction.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0443 LaTeX
+LatexEditLatexAction.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0443 LaTeX...
+LatexInsertLatexAction.msg1=<html>\u0412\u0438 \u043D\u0430\u043C\u0430\u0433\u0430\u0454\u0442\u0435\u0441\u044C \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438 <i>\u0437\u0430\u0441\u0442\u0430\u0440\u0456\u043B\u0443</i> \u0444\u043E\u0440\u043C\u0443\u043B\u0443 LaTeX.<br/>\u041D\u043E\u0432\u0438\u0439 \u0441\u043F\u043E\u0441\u0456\u0431 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u0442\u0435\u043A\u0441\u0442\u0443/\u0444\u043E\u0440\u043C\u0443\u043B LaTeX \u043E\u04 [...]
+LatexInsertLatexAction.msg2=<html>\u041A\u043E\u0440\u043E\u0442\u043A\u043E: <ul><li>\u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 \u043F\u0440\u0435\u0444\u0456\u043A\u0441 "\\latex " \u0443 \u0442\u0435\u043A\u0441\u0442\u0456 \u0432\u0443\u0437\u043B\u0430 \u0430\u0431\u043E</li><li><i>\u0412\u0438\u0433\u043B\u044F\u0434 -> \u041F\u0430\u043D\u0435\u043B\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F </i>, \u043F [...]
+LatexInsertLatexAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0443 LaTeX...
+latexPatternFormat=LaTeX
+LengthUnits.cm=\u0441\u043C
+LengthUnits.in=\u0434\u044E\u0439\u043C
+LengthUnits.mm=\u043C\u043C
+LengthUnits.pt=\u043F\u0442
+LengthUnits.px=px
+less_than_two_selected_nodes=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043F\u0440\u0438\u043D\u0430\u0439\u043C\u043D\u0456 \u0434\u0432\u0430 \u0432\u0443\u0437\u043B\u0438, \u0449\u043E\u0431 \u043D\u0430\u043C\u0430\u043B\u044E\u0432\u0430\u0442\u0438 \u0437\u0432'\u044F\u0437\u043A\u0438.
+license=\u041B\u0456\u0446\u0435\u043D\u0437\u0456\u044F: GPL 2 \u0430\u0431\u043E \u043D\u043E\u0432\u0456\u0448\u0430
+license_text=<html>\u0426\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430 \u043F\u043E\u0448\u0438\u0440\u044E\u0454\u0442\u044C\u0441\u044F \u0431\u0435\u0437\u043F\u043B\u0430\u0442\u043D\u043E; \u0432\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u0438 \u0457\u0457 \u0456/\u0430\u0431\u043E<br>\u0437\u043C\u0456\u043D\u044E\u0432\u0430\u0442\u0438 \u043D\u0430 \u0443\u043C\u043E\u0432\u0430\u0445 \u043B\u0456\u0446\u0435\u043D [...]
+link_error=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F "{0}" \u043D\u0435 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043E
+link_not_available_any_more=\u0417\u0432'\u044F\u0437\u043A\u0430 \u043D\u0435\u0434\u0456\u0439\u0441\u043D\u0430, \u0432\u0443\u0437\u043E\u043B \u0431\u0443\u0432 \u0432\u0438\u043B\u0443\u0447\u0435\u043D\u0438\u0439.
+link_not_found=\u041F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F {0} \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E.
+links=\u041F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+load=&\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438
+load_accelerator_presets=\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438
+load_accelerator_presets.noActions=\u041D\u0435\u043C\u0430\u0454 \u043F\u0435\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043E\u043A
+LoadAcceleratorPresetsAction.textPatterns.text=\u0428\u0430\u0431\u043B\u043E\u043D\u0438 \u0442\u0435\u043A\u0441\u0442\u0443
+locking_failed_by_open=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u0456\u043D\u0448\u043E\u044E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E \u0456 \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0454\u0442\u044C\u0441\u044F \u0442\u0456\u043B\u044C\u043A\u0438 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F.
+locking_failed_by_save_as=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u0456\u043D\u0448\u043E\u044E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E, \u0442\u043E\u043C\u0443 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0439.
+locking_old_lock_removed=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0431\u0443\u0432 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u0438\u0439 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043C {1}. \u0426\u0435 \u0431\u043B\u043E\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u0435, \u043E\u0441\u043A\u0456\u043B\u044C\u043A\u0438 \u0437\u0430\u0441\u0442\u0430\u0440\u0456\u043B\u043E.
long_node_changed_cancel=\u0412\u0438 \u0437\u043C\u0456\u043D\u0438\u043B\u0438 \u0432\u0443\u0437\u043E\u043B. \u0425\u043E\u0447\u0435\u0442\u0435 \u0432\u0456\u0434\u043C\u043E\u0432\u0438\u0442\u0438\u0441\u044F \u0432\u0456\u0434 \u0437\u043C\u0456\u043D?
+long_node_changed_submit=\u0412\u0438 \u0437\u043C\u0456\u043D\u0438\u043B\u0438 \u0432\u0443\u0437\u043E\u043B. \u0411\u0430\u0436\u0430\u0454\u0442\u0435 \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0437\u043C\u0456\u043D\u0438?
lots_of_links_warning=\u0412\u0438 \u0437\u0431\u0438\u0440\u0430\u0454\u0442\u0435\u0441\u044F \u0432\u0456\u0434\u0440\u0430\u0437\u0443 \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0431\u0430\u0433\u0430\u0442\u043E \u0437\u0432'\u044F\u0437\u043E\u043A. \u0412\u0438 \u0434\u0456\u0439\u0441\u043D\u043E \u0446\u044C\u043E\u0433\u043E \u0445\u043E\u0447\u0435\u0442\u0435?
+main_menu=\u041C\u0435\u043D\u044E
+main_resource_directory=\u0420\u0435\u0441\u0443\u0440\u0441\u0438 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F: {0}
+MainView.errorUpdateText=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0442\u0435\u043A\u0441\u0442\u0443 \u0434\u043B\u044F \u043F\u043E\u0442\u043E\u0447\u043D\u043E\u0433\u043E \u0432\u0432\u0435\u0434\u0435\u043D\u043D\u044F: {0}.
+MakeLinkFromAnchorAction.text=\u0417\u0440\u043E\u0431\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0437 \u043F\u0440\u0438\u0432'\u044F\u0437\u043A\u0438
+MakeLinkFromAnchorAction.tooltip=<html>\u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0435 \u0430\u0431\u043E \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0432\u0456\u0434 \u0432\u0443\u0437\u043B\u0430-\u043F\u0440\u0438\u0432'\u044F\u0437\u043A\u0438<br/>\u0434\u043E \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430</html>
+MakeLinkToAnchorAction.text=\u0417\u0440\u043E\u0431\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u043D\u0430 \u043F\u0440\u0438\u0432'\u044F\u0437\u043A\u0443
+MakeLinkToAnchorAction.tooltip=<html>\u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0435 \u0430\u0431\u043E \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u0435 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0432\u0456\u0434<br/>\u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430 \u0434\u043E \u0432\u0443\u0437\u043B\u0430-\u043F\u0440\u0438\u0432'\u044F\u0437\u043A\u0438</html>
+ManageAddOnsAction.text=\u0414\u043E\u0434\u0430\u0442\u043A\u0438
+ManageAddOnsDialog.activate=\u0423\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438
+ManageAddOnsDialog.activation.success={0} \u0431\u0443\u0434\u0435 \u0430\u043A\u0442\u0438\u0432\u043E\u0432\u0430\u043D\u043E \u043F\u0456\u0441\u043B\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0443.
+ManageAddOnsDialog.authored.by=\u0432\u0456\u0434 {0}
+ManageAddOnsDialog.cannot.activate=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0456\u0457: {0} \u0432\u0436\u0435 \u0430\u043A\u0442\u0438\u0432\u043E\u0432\u0430\u043D\u043E.
+ManageAddOnsDialog.cannot.configure=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043A\u043E\u043D\u0444\u0456\u0433\u0443\u0440\u0443\u0432\u0430\u043D\u043D\u044F {0}.
+ManageAddOnsDialog.cannot.deactivate=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0434\u0435\u0430\u043A\u0442\u0438\u0432\u0430\u0446\u0456\u0457: {0} \u043D\u0435 \u0430\u043A\u0442\u0438\u0432\u043E\u0432\u0430\u043D\u043E.
+ManageAddOnsDialog.cannot.deinstall=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043D\u044F {0}.
+ManageAddOnsDialog.configure=\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u0442\u0438
+ManageAddOnsDialog.deactivate=\u0412\u0438\u043C\u043A\u043D\u0443\u0442\u0438
+ManageAddOnsDialog.deactivation.success={0} \u0431\u0443\u0434\u0435 \u0434\u0435\u0430\u043A\u0442\u0438\u0432\u043E\u0432\u0430\u043D\u043E \u043F\u0456\u0441\u043B\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0443.
+ManageAddOnsDialog.deinstall=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438
+ManageAddOnsDialog.deinstallation.success={0} \u0431\u0443\u0434\u0435 \u0432\u0438\u0434\u0430\u043B\u0435\u043D\u043E \u043F\u0456\u0441\u043B\u044F \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u043A\u0443.
+ManageAddOnsDialog.error=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u0456: {0}.
+ManageAddOnsDialog.install=&\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438
+ManageAddOnsDialog.install.from.known.location=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 \u0434\u043E\u0434\u0430\u0442\u043E\u043A \u0437 \u0432\u0456\u0434\u043E\u043C\u043E\u0457 \u0442\u0435\u043A\u0438
+ManageAddOnsDialog.install.tooltip=\u0412\u0432\u0435\u0434\u0456\u0442\u044C URL \u0456\u043D\u0441\u0442\u0430\u043B\u044F\u0446\u0456\u0439\u043D\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0443 \u0434\u043E\u0434\u0430\u0442\u043A\u0443
+ManageAddOnsDialog.map.not.opened=\u0421\u0445\u043E\u0436\u0435, \u0449\u043E \u0430\u0441\u043E\u0446\u0456\u0430\u0442\u0438\u0432\u043D\u0430 \u043A\u0430\u0440\u0442\u0430 {0} \u043D\u0435 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0430.
+ManageAddOnsDialog.really.deinstall=\u0421\u043F\u0440\u0430\u0432\u0434\u0456 \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 {0}?
+ManageAddOnsDialog.search=\u041F\u043E\u0448\u0443\u043A \u0434\u043E\u0434\u0430\u0442\u043A\u0456\u0432
+ManageAddOnsDialog.search.file=\u0428\u0443\u043A\u0430\u0442\u0438
+ManageAddOnsDialog.select.tooltip=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0444\u0430\u0439\u043B
+ManageAddOnsDialog.status.downloading=\u0417\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F \u0444\u0430\u0439\u043B\u0443...
+ManageAddOnsDialog.status.installing=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0434\u043E\u0434\u0430\u0442\u043A\u0443...
+ManageAddOnsDialog.status.success=\u0423\u0441\u043F\u0456\u0448\u043D\u043E \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E {0}.
+ManageAddOnsDialog.tab.install=\u0417\u043D\u0430\u0439\u0442\u0438 \u0456 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438
+ManageAddOnsDialog.tab.install.tooltip=\u041F\u043E\u0448\u0443\u043A \u0442\u0430 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u043D\u043E\u0432\u0438\u0445 \u0434\u043E\u0434\u0430\u0442\u043A\u0456\u0432
+ManageAddOnsDialog.tab.manage=\u0414\u043E\u0434\u0430\u0442\u043A\u0438
+ManageAddOnsDialog.tab.manage.themes=\u0422\u0435\u043C\u0438
+ManageAddOnsDialog.tab.manage.themes.tooltip=\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u043C\u0438 \u0442\u0435\u043C\u0430\u043C\u0438
+ManageAddOnsDialog.tab.manage.tooltip=\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u043C\u0438 \u0434\u043E\u0434\u0430\u0442\u043A\u0430\u043C\u0438
+ManageAddOnsDialog.visit.addon.page=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043D\u0430 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0443 \u0434\u043E\u0434\u0430\u0442\u043A\u0456\u0432...
+ManageConditionalStylesAction.text=\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0443\u043C\u043E\u0432\u043D\u0438\u043C\u0438 \u0441\u0442\u0438\u043B\u044F\u043C\u0438 \u043A\u0430\u0440\u0442\u0438
+ManageNodeConditionalStylesAction.text=\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0443\u043C\u043E\u0432\u043D\u0438\u043C\u0438 \u0441\u0442\u0438\u043B\u044F\u043C\u0438 \u0432\u0443\u0437\u043B\u0430
map_already_exists=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0432\u0436\u0435 \u0456\u0441\u043D\u0443\u0454. \u0412\u0438 \u0445\u043E\u0447\u0435\u0442\u0435 \u043F\u0435\u0440\u0435\u043F\u0438\u0441\u0430\u0442\u0438 \u0439\u043E\u0433\u043E?
+map_background=\u0422\u043B\u043E \u043A\u0430\u0440\u0442\u0438
+map_background_image=\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0442\u043B\u0430
map_corrupted=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u043F\u043E\u0448\u043A\u043E\u0434\u0436\u0435\u043D\u0438\u0439. \u041F\u043E\u0432\u0456\u0434\u043E\u043C\u0438\u0442\u0438 \u043F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456?
+map_load_error=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043A\u0430\u0440\u0442\u0443 {0}
map_locked_by_open=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0432\u0436\u0435 \u0440\u0435\u0434\u0430\u0433\u0443\u0454\u0442\u044C\u0441\u044F \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043C {1}. \u0412\u0456\u043D \u0431\u0443\u0434\u0435 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u0439 \u0442\u0456\u043B\u044C\u043A\u0438 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F.
-map_locked_by_save_as=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0432\u0436\u0435 \u0440\u0435\u0434\u0430\u0433\u0443\u0454\u0442\u044C\u0441\u044F \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043C {1} \u0456 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0439.
-menu_extras=\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E
-menu_file_import=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438
-menu_format=\u0424\u043E\u0440\u043C\u0430\u0442
+map_locked_by_save_as=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 {0} \u0440\u0435\u0434\u0430\u0433\u0443\u0454 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447 {1}, \u0442\u043E\u043C\u0443 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F \u043D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u0435.
+map_not_saved=\u0426\u044F \u043A\u0430\u0440\u0442\u0430 \u043D\u0435 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u043B\u0430\u0441\u044C \u0440\u0430\u043D\u0456\u0448\u0435.
+MapBackgroundClearAction.text=\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438
+MapBackgroundColorAction.text=\u041A\u043E\u043B\u0456\u0440 \u0442\u043B\u0430
+MapBackgroundImageAction.text=\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0442\u043B\u0430...
+maps=\u041A\u0430\u0440\u0442\u0438
+MaxNodeWidth.text=\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0443 \u0448\u0438\u0440\u0438\u043D\u0443 \u0432\u0443\u0437\u043B\u0430
+menu_applyStyle=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u044C
+menu_attributes=&\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+menu_clouds=\u0425\u043C\u0430\u0440\u0438
+menu_copy=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438
+menu_coreFormat=\u042F\u0434\u0440\u043E \u0432\u0443\u0437\u043B\u0430
+menu_details=\u041F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456
+menu_displayAttributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0432\u0443\u0437\u043B\u0430
+menu_encryption=\u0417\u0430\u0445\u0438\u0441\u0442 \u043F\u0430\u0440\u043E\u043B\u0435\u043C
+menu_error=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0443 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0456 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044C\u043A\u043E\u0433\u043E \u043C\u0435\u043D\u044E {0}:\u21B5\n{1}\u21B5\n\u041F\u0440\u0438\u043F\u0438\u043D\u0435\u043D\u043D\u044F
+menu_extensions=\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0432\u0443\u0437\u043B\u0430
+menu_group=\u0413\u0440\u0443\u043F\u0430 \u0432\u0443\u0437\u043B\u0456\u0432
+menu_hoverView=\u041F\u0456\u0434\u043A\u0430\u0437\u043A\u0438, \u0449\u043E \u0432\u0438\u0440\u0438\u043D\u0430\u044E\u0442\u044C
+menu_iconByCategory=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u0437\u0430 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0456\u044F\u043C\u0438...
+menu_iconView=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
+menu_image=\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F
menu_insert=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438
-menu_navigate=\u041F\u0435\u0440\u0435\u043C\u0456\u0449\u0435\u043D\u043D\u044F
-menu_view=\u0412\u0438\u0433\u043B\u044F\u0434
+menu_latex_formula=\u0424\u043E\u0440\u043C\u0443\u043B\u0430 LaTeX
+menu_manageStyles=&\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u0442\u0438\u043B\u044F\u043C\u0438
+menu_moveNode=\u041F\u0435\u0440\u0435\u043C\u0456\u0449\u0435\u043D\u043D\u044F \u0456 \u0432\u043F\u043E\u0440\u044F\u0434\u043A\u0443\u0432\u0430\u043D\u043D\u044F
+menu_newNode=\u041D\u043E\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
+menu_node=\u0412\u0443\u0437\u043E\u043B
+menu_node_features=&\u0424\u0443\u043D\u043A\u0446\u0456\u0457 \u0432\u0443\u0437\u043B\u0430
+menu_nodes=&\u0412\u0443\u0437\u043B\u0438
+menu_nodeView=\u042F\u0434\u0440\u043E \u0432\u0443\u0437\u043B\u0430
+menu_noteView=\u041F\u0430\u043D\u0435\u043B\u044C \u043F\u0440\u0438\u043C\u0456\u0442\u043E\u043A
+menu_openmaps=\u041A\u0430\u0440\u0442\u0438
+menu_remove_icons=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
+menu_removeAttribute=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
+menu_select=\u0412\u0438\u0431\u0440\u0430\u0442\u0438
+menu_time=\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0447\u0430\u0441\u043E\u043C
+menu_title=\u042F\u0434\u0440\u043E \u0432\u0443\u0437\u043B\u0430
+menu_viewmode=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u043F\u0435\u0440\u0435\u0433\u043B\u044F\u0434\u0443
+MenuUtils.invalid_menuitem={0} - \u043D\u0435\u0434\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u0438\u0439 \u043A\u043B\u044E\u0447 \u043F\u0443\u043D\u043A\u0442\u0443 \u043C\u0435\u043D\u044E.
mindmap=\u0410\u0441\u043E\u0446\u0456\u0430\u0442\u0438\u0432\u043D\u0430 \u043A\u0430\u0440\u0442\u0430
+MindMapNodesFlavorHandler=\u0414\u0435\u0440\u0435\u0432\u043E \u0432\u0443\u0437\u043B\u0456\u0432
mindmaps=\u041A\u0430\u0440\u0442\u0438
mindmaps_desc=\u041A\u0430\u0440\u0442\u0438 (*.mm)
-mode_File=File Mode[translate me]
-mode_MindMap=MindMap Mode[translate me]
+mindmaps_filter_desc=\u0424\u0456\u043B\u044C\u0442\u0440\u0438 (*.mmfilter)
+MinNodeWidth.text=\u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u043D\u0430\u0439\u043C\u0435\u043D\u0448\u0443 \u0448\u0438\u0440\u0438\u043D\u0443 \u0432\u0443\u0437\u043B\u0430
+mode_Browse=\u0420\u0435\u0436\u0438\u043C \u043F\u0435\u0440\u0435\u0433\u043B\u044F\u0434\u0443
+mode_File=\u0424\u0430\u0439\u043B\u043E\u0432\u0438\u0439 \u0440\u0435\u0436\u0438\u043C
+mode_MindMap=\u0420\u0435\u0436\u0438\u043C \u043A\u0430\u0440\u0442\u0438 \u0437\u043D\u0430\u043D\u044C
mode_na=\u0420\u0435\u0436\u0438\u043C \u043D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u0438\u0439
mode_status=\u0420\u0435\u0436\u0438\u043C \u0437\u043C\u0456\u043D\u043D\u0438\u0439 \u043D\u0430 {0}
+mode_StyleMap=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043D\u043D\u044F \u0441\u0442\u0438\u043B\u0456\u0432
mode_title=Freeplane - \u0420\u0435\u0436\u0438\u043C "{0}"
modes=\u0420\u0435\u0436\u0438\u043C\u0438
-ModesMenuAction.Browse.text=Map Browser[translate me]
-ModesMenuAction.File.text=File Explorer[translate me]
+ModesMenuAction.Browse.text=\u041E\u0433\u043B\u044F\u0434\u0430\u0447 \u043A\u0430\u0440\u0442
+ModesMenuAction.File.text=\u041E\u0433\u043B\u044F\u0434\u0430\u0447 \u0444\u0430\u0439\u043B\u0456\u0432
+ModesMenuAction.MindMap.text=\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0430\u0441\u043E\u0446\u0456\u0430\u0442\u0438\u0432\u043D\u0438\u0445 \u043A\u0430\u0440\u0442
most_recent_files=\u041D\u0435\u0434\u0430\u0432\u043D\u0456 \u0444\u0430\u0439\u043B\u0438
-MoveToRootAction.text=\u0426\u0435\u043D\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u043A\u043E\u0440\u0456\u043D\u044C
+MoveAction.text=\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438
+MoveToRootAction.text=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u043A\u043E\u0440\u0435\u043D\u044F
+NameConditionAction.text=\u0417\u0430\u0434\u0430\u0442\u0438 \u043D\u0430\u0437\u0432\u0443
+navigate=\u041F\u0435\u0440\u0435\u043C\u0456\u0449\u0435\u043D\u043D\u044F
NavigationNextMapAction.text=\u041D\u0430\u0441\u0442\u0443\u043F\u043D\u0430 \u043A\u0430\u0440\u0442\u0430
NavigationPreviousMapAction.text=\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044F \u043A\u0430\u0440\u0442\u0430
+new=&\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438
+new_map_from_user_templates.text=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043A\u0430\u0440\u0442\u0443 \u0437 \u0448\u0430\u0431\u043B\u043E\u043D\u0443...
new_mindmap=\u041D\u043E\u0432\u0430 \u0430\u0441\u043E\u0446\u0456\u0430\u0442\u0438\u0432\u043D\u0430 \u043A\u0430\u0440\u0442\u0430
new_node=\u041D\u043E\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
new_node_as_sibling_not_possible_for_the_root=\u0421\u043F\u043E\u0440\u0456\u0434\u043D\u0435\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u0434\u043B\u044F \u043A\u043E\u0440\u0435\u043D\u044F \u043D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u0438\u0439
+new_version_available=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043D\u043E\u0432\u0430 \u0432\u0435\u0440\u0441\u0456\u044F ''{0}''
NewChildAction.text=\u041D\u043E\u0432\u0438\u0439 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u0439 \u0432\u0443\u0437\u043E\u043B
-NewMapAction.text=\u041D\u043E\u0432\u0438\u0439
+NewerFileRevisionsFoundDialog.cancel=&\u041F\u0440\u043E\u043F\u0443\u0441\u0442\u0438\u0442\u0438
+NewerFileRevisionsFoundDialog.cancel.tooltip=\u041D\u0435 \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0442\u0438 \u0446\u044C\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0443
+NewerFileRevisionsFoundDialog.file_last_modified=\u041C\u0456\u0442\u043A\u0430 \u0447\u0430\u0441\u0443
+NewerFileRevisionsFoundDialog.file_name=\u0424\u0430\u0439\u043B
+NewerFileRevisionsFoundDialog.file_size=\u0411\u0430\u0439\u0442(\u0456\u0432)
+NewerFileRevisionsFoundDialog.open=&\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438
+NewerFileRevisionsFoundDialog.open.tooltip=\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0444\u0430\u0439\u043B, \u043D\u0430\u0432\u0456\u0442\u044C \u044F\u043A\u0449\u043E \u0432\u0456\u043D \u0437\u0430\u0441\u0442\u0430\u0440\u0456\u0432
+NewerFileRevisionsFoundDialog.question=\u0417\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043D\u043E\u0432\u0456\u0448\u0443 \u0432\u0435\u0440\u0441\u0456\u044E {0}!
+NewerFileRevisionsFoundDialog.restore=\u0412\u0456\u0434&\u043D\u043E\u0432\u0438\u0442\u0438
+NewerFileRevisionsFoundDialog.restore.tooltip=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 {0} \u043D\u0430 {1}
+NewerFileRevisionsFoundDialog.title=\u0417\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u043D\u043E\u0432\u0456\u0448\u0443 \u0432\u0435\u0440\u0441\u0456\u044E \u0444\u0430\u0439\u043B\u0443!
+NewFreeNodeAction.text=\u041D\u043E\u0432\u0438\u0439 \u0440\u0443\u0445\u043E\u043C\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
+NewLevelStyleAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u044C \u0440\u0456\u0432\u043D\u044F
+newmap.install.addon.question={0} \u0441\u0445\u043E\u0436\u0438\u0439 \u043D\u0430 \u043F\u0430\u043A\u0435\u0442 \u0434\u043E\u0434\u0430\u0442\u043A\u0443\u21B5\n\u0411\u0430\u0436\u0430\u0454\u0442\u0435 \u0439\u043E\u0433\u043E \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438?\u21B5\n(\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C "\u041D\u0456", \u0449\u043E\u0431 \u043F\u0440\u043E\u0441\u0442\u043E \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0444\u0430\u0439\u043B.)
+newmap.install.addon.title=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 \u0434\u043E\u0434\u0430\u0442\u043E\u043A?
+NewMapAction.text=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043A\u0430\u0440\u0442\u0443
+NewMapViewAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432 \u043D\u043E\u0432\u0456\u0439 \u0432\u043A\u043B\u0430\u0434\u0446\u0456
NewParentNode.text=\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0431\u0430\u0442\u044C\u043A\u0456\u0432\u0441\u044C\u043A\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
NewParentNode.tooltip=<html> \u0412\u0441\u0456 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u043E\u0442\u0440\u0438\u043C\u0430\u044E\u0442\u044C \u0437\u0430\u0433\u0430\u043B\u044C\u043D\u0438\u0439 \u0431\u0430\u0442\u044C\u043A\u0456\u0432\u0441\u044C\u043A\u0438\u0439 \u0432\u0443\u0437\u043E\u043B </html>
NewPreviousSiblingAction.text=\u041D\u043E\u0432\u0438\u0439 \u0441\u043F\u043E\u0440\u0456\u0434\u043D\u0435\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u0434\u043E \u0446\u044C\u043E\u0433\u043E
NewSiblingAction.text=\u041D\u043E\u0432\u0438\u0439 \u0441\u043F\u043E\u0440\u0456\u0434\u043D\u0435\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u043F\u0456\u0441\u043B\u044F \u0446\u044C\u043E\u0433\u043E
+NewSummaryAction.text=\u041D\u043E\u0432\u0438\u0439 \u043F\u0456\u0434\u0441\u0443\u043C\u043A\u043E\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B (\u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438)
+NewUserStyleAction.text=\u0421\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0441\u0442\u0438\u043B\u044C \u0437 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E
+NextNodeAction.BACK.text=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044C\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+NextNodeAction.BACK_N_FOLD.text=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044C\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430 (\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438)
+NextNodeAction.FORWARD.text=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+NextNodeAction.FORWARD_N_FOLD.text=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430 (\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438)
+NextPresentationItemAction.text=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u0435\u043B\u0435\u043C\u0435\u043D\u0442 \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0456\u0457
no=\u041D\u0456
-no_format_copy_before_format_paste=\u041F\u0435\u0440\u0448 \u043D\u0456\u0436 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442, \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0439\u043E\u0433\u043E \u0441\u043A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438
-no_found_from=\u0422\u0435\u043A\u0441\u0442 "{0}" \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u0438\u0439 \u0432 "{1}" .
-no_more_found_from=\u0422\u0435\u043A\u0441\u0442 "{0}" \u0431\u0456\u043B\u044C\u0448\u0435 \u043D\u0435 \u0437\u0443\u0441\u0442\u0440\u0456\u0447\u0430\u0454\u0442\u044C\u0441\u044F \u0432 "{1}"
+no_copy_attributes_before_paste_attributes=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438, \u0434\u043E\u043A\u0438 \u043D\u0435 \u0441\u043A\u043E\u043F\u0456\u044E\u0454\u0442\u0435 \u044F\u043A\u0456-\u043D\u0435\u0431\u0443\u0434\u044C.
+NO_FORMAT=\u0422\u0435\u043A\u0441\u0442
+no_format_copy_before_format_paste=\u041F\u0435\u0440\u0448 \u043D\u0456\u0436 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442, \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u0439\u043E\u0433\u043E \u0441\u043A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438.
+no_found_from=<html>\u0422\u0435\u043A\u0441\u0442 <u>{0}</u> \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E \u0432 "{1}".</html>
+no_more_found_from=<html>\u0422\u0435\u043A\u0441\u0442 <u>{0}</u> \u0431\u0456\u043B\u044C\u0448\u0435 \u043D\u0435 \u0437\u0443\u0441\u0442\u0440\u0456\u0447\u0430\u0454\u0442\u044C\u0441\u044F \u0432 "{1}".</html>
no_previous_find=\u0420\u0430\u043D\u0456\u0448\u0438\u0445 \u0437\u0431\u0456\u0433\u0456\u0432 \u043D\u0435\u043C\u0430\u0454.
+no_styles_found_in_map=\u0421\u0442\u0438\u043B\u0456\u0432 \u0443 \u043A\u0430\u0440\u0442\u0456 \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E
node=\u0412\u0443\u0437\u043E\u043B
node_changed_discard_changes=\u0412\u0438 \u0437\u043C\u0456\u043D\u0438\u043B\u0438 \u0432\u0443\u0437\u043E\u043B. \u0425\u043E\u0447\u0435\u0442\u0435 \u0432\u0456\u0434\u043C\u043E\u0432\u0438\u0442\u0438\u0441\u044F \u0432\u0456\u0434 \u0437\u043C\u0456\u043D?
-NodeBackgroundColorAction.text=\u0424\u043E\u043D\u043E\u0432\u0438\u0439 \u043A\u043E\u043B\u0456\u0440 \u0432\u0443\u0437\u043B\u0430
+node_is_write_protected=\u0426\u0456\u043B\u044C\u043E\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u0432\u0456\u0434 \u0437\u0430\u043F\u0438\u0441\u0443.
+node_location_help=\u041F\u0435\u0440\u0435\u0442\u044F\u0433\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u044E\u0454 \u043F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044F \u0432\u0443\u0437\u043B\u0430, <ctrl>+\u043F\u0435\u0440\u0435\u0442\u044F\u0433\u0443\u0432\u0430\u043D\u043D\u044F \u0437\u043C\u0456\u043D\u044E\u0454 \u0432\u0456\u0434\u0441\u0442\u0430\u043D\u044C \u043C\u0456\u0436 \u0432\u0443\u0437\u043B\u0430\u043C\u0438, \u043F\u043E\u0434\u0432\u0456\u043 [...]
+node_popup_scripting=\u0421\u043A\u0440\u0438\u043F\u0442\u0438
+node_selector=\u0412\u0438\u0431\u0456\u0440 \u0432\u0443\u0437\u043B\u0456\u0432
+node_selector_message=\u0414\u0432\u0456\u0447\u0456 \u043A\u043B\u0430\u0446\u043D\u0456\u0442\u044C, \u0449\u043E\u0431 \u0432\u0438\u0431\u0440\u0430\u0442\u0438 \u0432\u0443\u0437\u043E\u043B
+node_styles=\u0421\u0442\u0438\u043B\u0456 \u0432\u0443\u0437\u043B\u0456\u0432
+NodeBackgroundColorAction.text=\u041A\u043E\u043B\u0456\u0440 \u0442\u043B\u0430 \u0432\u0443\u0437\u043B\u0430...
NodeColorAction.text=\u041A\u043E\u043B\u0456\u0440 \u0432\u0443\u0437\u043B\u0430...
NodeColorBlendAction.text=\u0417\u0430\u0441\u0432\u0456\u0442\u0438\u0442\u0438 \u0432\u0443\u0437\u043E\u043B
NodeDownAction.text=\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0432\u043D\u0438\u0437
+NodeExtensions.EditNodeExtensions=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0440\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0432\u0443\u0437\u043B\u0430
+NodeExtensions.RemoveNodeExtensions=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0440\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0432\u0443\u0437\u043B\u0430
NodeListAction.text=\u0406\u0441\u0442\u043E\u0440\u0456\u044F...
-NodeListAction.tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0447\u0430\u0441 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F / \u0437\u043C\u0456\u043D\u0438 \u0434\u043B\u044F \u0432\u0441\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
-NodeShapeAction.bubble.text=\u0422\u0438\u043F \u0432\u0443\u0437\u043B\u0430 "\u043E\u0432\u0430\u043B"
-NodeShapeAction.fork.text=\u0422\u0438\u043F \u0432\u0443\u0437\u043B\u0430 "\u043B\u0456\u043D\u0456\u044F"
+NodeListAction.tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0443\u0437\u043B\u0438 \u044F\u043A \u0441\u043F\u0438\u0441\u043E\u043A \u0437 \u043F\u043E\u0448\u0443\u043A\u043E\u043C \u0456 \u0444\u0456\u043B\u044C\u0442\u0440\u043E\u043C.
+NodeShapeAction.bubble.text=\u0411\u0443\u043B\u044C\u0431\u0430\u0448\u043A\u0430
+NodeShapeAction.narrow_hexagon.text=\u0412\u0443\u0437\u044C\u043A\u0438\u0439 \u0448\u0435\u0441\u0442\u0438\u043A\u0443\u0442\u043D\u0438\u043A
+NodeShapeAction.oval.text=\u041E\u0432\u0430\u043B
+NodeShapeAction.rectangle.text=\u041F\u0440\u044F\u043C\u043E\u043A\u0443\u0442\u043D\u0438\u043A
+NodeShapeAction.small_bubble.text=\u041C\u0430\u043B\u0430 \u0431\u0443\u043B\u044C\u0431\u0430\u0448\u043A\u0430
+NodeShapeAction.small_wide_hexagon.text=\u041C\u0430\u043B\u0438\u0439 \u0448\u0435\u0441\u0442\u0438\u043A\u0443\u0442\u043D\u0438\u043A
+NodeShapeAction.wide_hexagon.text=\u0428\u0438\u0440\u043E\u043A\u0438\u0439 \u0448\u0435\u0441\u0442\u0438\u043A\u0443\u0442\u043D\u0438\u043A
NodeUpAction.text=\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u0432\u0433\u043E\u0440\u0443
-nonboldify_branch=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043D\u0430\u043F\u0456\u0432\u0436\u0438\u0440\u043D\u0435 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F
-nonitalicise_branch=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043A\u0443\u0440\u0441\u0438\u0432\u043D\u0435 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F
+nonboldify_branch=\u0412\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u043D\u0430\u043F\u0456\u0432\u0436\u0438\u0440\u043D\u0435 \u043D\u0430\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F
+nonitalicise_branch=\u0412\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u043A\u0443\u0440\u0441\u0438\u0432\u043D\u0435 \u043D\u0430\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F
normal=\u0417\u0432\u0438\u0447\u0430\u0439\u043D\u0438\u0439
+not_saved_for_image_error=\u041F\u0435\u0440\u0448 \u043D\u0456\u0436 \u0437\u0430\u0434\u0430\u0442\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0448\u043B\u044F\u0445\u043E\u043C \u0432\u0438\u0431\u043E\u0440\u0443 \u0444\u0430\u0439\u043B\u0443, \u0441\u043B\u0456\u0434 \u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043A\u0430\u0440\u0442\u0443
not_saved_for_link_error=\u041A\u0430\u0440\u0442\u0430 \u043F\u043E\u0432\u0438\u043D\u043D\u0430 \u0431\u0443\u0442\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0430 \u043F\u0435\u0440\u0435\u0434 \u0432\u0438\u0431\u043E\u0440\u043E\u043C \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+note_window_location=\u0420\u043E\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0430\u043D\u0435\u043B\u0456 \u043F\u0440\u0438\u043C\u0456\u0442\u043E\u043A
+notes=\u041F\u0440\u0438\u043C\u0456\u0442\u043A\u0430
+NotificationOptions.CLOSE=\u0417\u0430\u043A\u0440\u0438\u0442\u0438
+NotificationOptions.REMIND_ME_LATER=\u041D\u0430\u0433\u0430\u0434\u0430\u0442\u0438 \u043F\u0456\u0437\u043D\u0456\u0448\u0435
+NotificationOptions.REMOVE_REMINDER=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
+NotificationOptions.SELECT_NODE=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
ok=\u0413\u0430\u0440\u0430\u0437\u0434
OKAction.text=\u0413\u0430\u0440\u0430\u0437\u0434
-OpenAction.text=\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438
-OpenFreeplaneSiteAction.text=Freeplane's Homepage[translate me]
+OnlineReference.text=\u041A\u0430\u0440\u0442\u0438 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0456\u0457 \u043E\u043D\u043B\u0430\u0439\u043D
+open_asMindMap=\u0410\u0441\u043E\u0446\u0456\u0430\u0442\u0438\u0432\u043D\u0430 \u043A\u0430\u0440\u0442\u0430
+OpenAction.text=\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0443 \u043A\u0430\u0440\u0442\u0443...
+OpenFreeplaneSiteAction.text=\u0421\u0430\u0439\u0442 Freeplane
+OpenMapsAddLocation.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u0440\u043E\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043D\u043D\u044F OpenMaps...
+OpenMapsRemoveLocation.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0440\u043E\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043D\u043D\u044F OpenMaps
+OpenMapsViewLocation.text=\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u0438 \u0440\u043E\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043D\u043D\u044F OpenMaps...
+OpenPathAction.text=\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0444\u0430\u0439\u043B
+OpenURLMapAction.text=\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u043A\u0430\u0440\u0442\u0443 \u0437\u0430 URL...
+OpenUserDirAction.text=\u0412\u0456\u0434\u043A\u0440\u0438\u0442\u0438 \u0442\u0435\u043A\u0443 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430
option_changes_may_require_restart=\u0411\u0456\u043B\u044C\u0448\u0456\u0441\u0442\u044C \u0437\u043C\u0456\u043D \u043D\u0430\u0431\u0443\u0434\u0443\u0442\u044C \u0447\u0438\u043D\u043D\u043E\u0441\u0442\u0456 \u043F\u0456\u0441\u043B\u044F \u043D\u043E\u0432\u043E\u0433\u043E \u0441\u0442\u0430\u0440\u0442\u0443 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438.
+OptionalDontShowMeAgainDialog.cancel=&\u041D\u0456
+OptionalDontShowMeAgainDialog.dontShowAgain=&\u0411\u0456\u043B\u044C\u0448\u0435 \u043D\u0435 \u043F\u0438\u0442\u0430\u0442\u0438.
+OptionalDontShowMeAgainDialog.ok=&\u0422\u0430\u043A
+OptionalDontShowMeAgainDialog.rememberMyDescision=&\u0417\u0430\u043F\u0430\u043C'\u044F\u0442\u0430\u0442\u0438 \u043C\u0456\u0439 \u0432\u0438\u0431\u0456\u0440.
OptionPanel.absolute=\u0410\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u043E
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=\u0428\u0430\u0431\u043B\u043E\u043D\u0438 \u0441\u0442\u0438\u043B\u044E \u0440\u0456\u0432\u043D\u044F
+OptionPanel.ADD_CHILD=\u0414\u043E\u0434\u0430\u0442\u0438 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u0439 \u0432\u0443\u0437\u043E\u043B
+OptionPanel.ADD_SIBLING=\u0414\u043E\u0434\u0430\u0442\u0438 \u0432\u0443\u0437\u043E\u043B-\u0431\u0440\u0430\u0442
+OptionPanel.addons=\u0414\u043E\u0434\u0430\u0442\u043A\u0438
+OptionPanel.always_fold_all_after_load=\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0441\u0456
+OptionPanel.always_load_last_maps=\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u0456 \u0456 \u043D\u043E\u0432\u0443 \u043A\u0430\u0440\u0442\u0443
+OptionPanel.always_load_last_maps.tooltip=\u042F\u043A\u0449\u043E \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E, \u0442\u043E \u043E\u0441\u0442\u0430\u043D\u043D\u0456 \u043A\u0430\u0440\u0442\u0438 \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0442\u0438\u043C\u0443\u0442\u044C\u0441\u044F \u043D\u0430\u0432\u0456\u0442\u044C \u043F\u0440\u0438 \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u043D\u043D\u0456 \u043A\u0430\u0440\u0442\u0438 \u0437 \u0432\u0438 [...]
+OptionPanel.always_save_folding=\u0417\u0430\u0432\u0436\u0434\u0438
+OptionPanel.always_save_folding_state=\u0417\u0430\u0432\u0436\u0434\u0438 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u0437\u043C\u0456\u043D\u0438 \u0441\u0442\u0430\u043D\u0443 \u0437\u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F
+OptionPanel.always_save_folding_state.tooltip=\u042F\u043A\u0449\u043E \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E, \u043A\u043E\u0436\u043D\u0430 \u0434\u0456\u044F \u0449\u043E\u0434\u043E \u0437\u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F \u0432\u0432\u0430\u0436\u0430\u0442\u0438\u043C\u0435\u0442\u044C\u0441\u044F \u0437\u043C\u0456\u043D\u043E\u044E \u0456 \u0432\u0438\u043A\u043B\u0438\u043A\u0430\u0442\u0438\u043C\u0435 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0 [...]
+OptionPanel.always_show_less_than_N_nodes_after_load=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0434\u0435\u044F\u043A\u0456 \u0432\u0443\u0437\u043B\u0438
+OptionPanel.always_unfold_all_after_load=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0441\u0456
OptionPanel.antialias=\u0417\u0433\u043B\u0430\u0434\u0436\u0443\u0432\u0430\u043D\u043D\u044F
-OptionPanel.antialias.tooltip=<html> \u0412\u0438\u0437\u043D\u0430\u0447\u0430\u0454 \u044F\u043A\u0456\u0441\u0442\u044C \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F. </html>
+OptionPanel.antialias.tooltip=<html> \u0412\u0438\u0437\u043D\u0430\u0447\u0430\u0454 \u044F\u043A\u0456\u0441\u0442\u044C \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F. \u0412\u0438\u0449\u0435 \u0437\u0433\u043B\u0430\u0434\u0436\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0438\u043C\u0430\u0433\u0430\u0454 \u0431\u0456\u043B\u044C\u0448\u0435 \u0447\u0430\u0441\u0443.</html>
OptionPanel.antialias_all=\u0417\u0433\u043B\u0430\u0434\u0436\u0443\u0432\u0430\u0442\u0438 \u0443\u0441\u0435
OptionPanel.antialias_edges=\u0417\u0433\u043B\u0430\u0434\u0436\u0443\u0432\u0430\u0442\u0438 \u043B\u0456\u043D\u0456\u0457
OptionPanel.antialias_none=\u041D\u0435 \u0437\u0433\u043B\u0430\u0434\u0436\u0443\u0432\u0430\u0442\u0438
OptionPanel.Appearance=\u0417\u043E\u0432\u043D\u0456\u0448\u043D\u0456\u0439 \u0432\u0438\u0433\u043B\u044F\u0434
-OptionPanel.ar=Ar[translate me]
+OptionPanel.apply_system_screen_resolution=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0442\u0438\u043F\u043E\u0432\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0443 \u0440\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0456\u0441\u0442\u044C \u0435\u043A\u0440\u0430\u043D\u0443
+OptionPanel.approximate_search_threshold=\u041F\u043E\u0440\u0456\u0433 \u0434\u043B\u044F \u043D\u0430\u0431\u043B\u0438\u0436\u0435\u043D\u043E\u0457 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u043E\u0441\u0442\u0456
+OptionPanel.approximate_search_threshold.tooltip=<html>\u041F\u043E\u0440\u0456\u0433 \u0434\u043B\u044F \u043D\u0430\u0431\u043B\u0438\u0436\u0435\u043D\u043E\u0457 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u043E\u0441\u0442\u0456<br/><font size="2">\u0434\u0438\u0432. http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(\u0431\u0456\u043B\u044C\u0448\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F - \u0431\u0456\u043B\u044C\u0448 \u0432\u0456\u0434\ [...]
+OptionPanel.ar=\u0410\u0440\u0430\u0431\u0441\u044C\u043A\u0430 / \u0627\u0644\u0639\u0631\u0628\u064A\u0629
+OptionPanel.ARC=\u0414\u0443\u0433\u0430
OptionPanel.as_parent=\u042F\u043A \u0431\u0430\u0442\u044C\u043A\u043E
+OptionPanel.ask=\u0421\u043F\u0438\u0442\u0430\u0442\u0438
OptionPanel.automatic=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E
+OptionPanel.automaticFormat_level=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u0456 \u0440\u0456\u0432\u043D\u0456\u0432
+OptionPanel.automaticFormat_level1=\u0424\u043E\u0440\u043C\u0430\u0442 \u043A\u043E\u0440\u0435\u043D\u0435\u0432\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+OptionPanel.automaticFormat_level2=\u0424\u043E\u0440\u043C\u0430\u0442 \u0432\u0443\u0437\u043B\u0430 1-\u0433\u043E \u0440\u0456\u0432\u043D\u044F
+OptionPanel.backup_file_number=\u041A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0438\u0445 \u0444\u0430\u0439\u043B\u0456\u0432, \u0449\u043E \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u044E\u0442\u044C\u0441\u044F
OptionPanel.Behaviour=\u041F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0430
OptionPanel.bezier=\u041A\u0440\u0438\u0432\u0430
-OptionPanel.bubble=\u041E\u0432\u0430\u043B
-OptionPanel.Cancel=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438
-OptionPanel.cloud=Cloud[translate me]
+OptionPanel.bubble=\u0411\u0443\u043B\u044C\u0431\u0430\u0448\u043A\u0430
+OptionPanel.ca=\u041A\u0430\u0442\u0430\u043B\u0430\u043D\u0441\u044C\u043A\u0430, \u0412\u0430\u043B\u0435\u043D\u0441\u0456\u044F / Catal\u00E0
+OptionPanel.Cancel=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+OptionPanel.center_selected_node=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0446\u0435\u043D\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u043D\u0430 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u043C\u0443 \u0432\u0443\u0437\u043B\u0456
+OptionPanel.check_updates_automatically=\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u044F\u0442\u0438 \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 \u043D\u0430\u044F\u0432\u043D\u0456\u0441\u0442\u044C \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u044C
+OptionPanel.childpattern=\u0428\u0430\u0431\u043B\u043E\u043D \u0434\u043E\u0447\u0456\u0440\u043D\u044C\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+OptionPanel.childpattern.tooltip=\u0412\u0438\u0431\u0440\u0430\u043D\u0438\u0439 \u0448\u0430\u0431\u043B\u043E\u043D \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0430\u043D\u043E \u0434\u043E \u0432\u0441\u0456\u0445 \u043D\u0430\u0449\u0430\u0434\u043A\u0456\u0432.
+OptionPanel.clear_all_setters=\u041F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438 \u0432\u0441\u0456
+OptionPanel.clear_all_setters.tooltip=\u0423\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438 \u0430\u0431\u043E \u0432\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u0432\u0441\u0456 \u0456\u043D\u0434\u0438\u043A\u0430\u0442\u043E\u0440\u0438 \u0437\u043C\u0456\u043D.
+OptionPanel.cloud=\u0425\u043C\u0430\u0440\u043A\u0430
+OptionPanel.cloudcolor=\u041A\u043E\u043B\u0456\u0440 \u0445\u043C\u0430\u0440\u043A\u0438
+OptionPanel.cloudshape=\u0424\u043E\u0440\u043C\u0430 \u0445\u043C\u0430\u0440\u043A\u0438
OptionPanel.combined=\u041A\u043E\u043C\u0431\u0456\u043D\u043E\u0432\u0430\u043D\u043E
-OptionPanel.cs=Cs
-OptionPanel.da=Dk
-OptionPanel.de=De
+OptionPanel.compare_as_number=\u041F\u043E\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u0442\u0438 \u044F\u043A \u0447\u0438\u0441\u043B\u0430
+OptionPanel.convert_to_current_version=<html>\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u043F\u0435\u0440\u0435\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u0442\u0438 \u043A\u0430\u0440\u0442\u0438 \u0437\u0456 \u0441\u0442\u0430\u0440\u043E\u044E \u0432\u0435\u0440\u0441\u0456\u0457 Freeplane <br>\u0434\u043E \u043F\u043E\u0442\u043E\u0447\u043D\u043E\u0457 \u0432\u0435\u0440\u0441\u0456\u0457?</html>
+OptionPanel.convert_to_current_version.tooltip=<html>\u041B\u0438\u0448\u0435 \u0434\u043B\u044F \u0434\u0443\u0436\u0435 \u0432\u0435\u043B\u0438\u043A\u0438\u0445 \u043A\u0430\u0440\u0442, \u044F\u043A\u0456 \u043D\u0435 \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u043E \u043A\u043E\u043D\u0432\u0435\u0440\u0442\u0443\u0432\u0430\u0442\u0438 <br>(\u0434\u043B\u044F \u0434\u043E\u0441\u0432\u0456\u0434\u0447\u0435\u043D\u0438\u0445 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u [...]
+OptionPanel.copyFormatToNewSibling=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u043D\u0430 \u043D\u043E\u0432\u0456 \u0432\u0443\u0437\u043B\u0438 \u0446\u044C\u043E\u0433\u043E \u0436 \u0440\u0456\u0432\u043D\u044F
+OptionPanel.copyFormatToNewSiblingIncludesIcons=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0437 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0430\u043C\u0438
+OptionPanel.cs=\u0427\u0435\u0441\u044C\u043A\u0430 / \u010Desky
+OptionPanel.cut_nodes_without_question=\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438 \u0432\u0443\u0437\u043B\u0438 \u0431\u0435\u0437 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F?
+OptionPanel.cut_nodes_without_question.tooltip=\u042F\u043A\u0449\u043E \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E, \u0432\u0443\u0437\u043B\u0438 \u0432\u0438\u0440\u0456\u0437\u0430\u0442\u0438\u043C\u0443\u0442\u044C\u0441\u044F \u0431\u0435\u0437 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F. \u041C\u043E\u0436\u043D\u0430 \u0432\u0442\u0440\u0430\u0442\u0438\u0442\u0438 \u0456\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0456\u044E, \u044F\u043A\ [...]
+OptionPanel.da=\u0414\u0430\u043D\u0441\u044C\u043A\u0430 / dansk
+OptionPanel.date_format=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u0430\u0442\u0438
+OptionPanel.date_format.tooltip=SHORT, MEDIUM, LONG, FULL \u0430\u0431\u043E \u0448\u0430\u0431\u043B\u043E\u043D \u043D\u0430 \u0437\u0440\u0430\u0437\u043E\u043A "MM/dd/yyyy"
+OptionPanel.datetime_format=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u0430\u0442\u0438-\u0447\u0430\u0441\u0443
+OptionPanel.datetime_format.tooltip=\u0410\u0431\u043E <datestyle>,<timestyle> (\u0437 SHORT, MEDIUM, LONG \u0447\u0438 FULL \u044F\u043A \u0441\u0442\u0438\u043B\u0435\u043C), \u0430\u0431\u043E \u0437\u0430 \u043F\u043E\u0432\u043D\u0438\u043C \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u043C "M/d/yyyy hh:mm"
+OptionPanel.de=\u041D\u0456\u043C\u0435\u0446\u044C\u043A\u0430 / Deutsch
OptionPanel.default=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442
+OptionPanel.default_attribute_key_column_width=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u043A\u043B\u044E\u0447\u0430 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+OptionPanel.default_attribute_value_column_width=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
OptionPanel.default_browser_command_mac=\u041D\u0430\u0432\u0456\u0433\u0430\u0442\u043E\u0440 \u0434\u043B\u044F Mac
OptionPanel.default_browser_command_mac.tooltip=<html> \u0456 MAC: (\u0441\u043F\u0430\u0441\u0438\u0431\u0456 \u041D\u0456\u043A\u0443) </html>
OptionPanel.default_browser_command_other_os=\u041D\u0430\u0432\u0456\u0433\u0430\u0442\u043E\u0440 \u0434\u043B\u044F \u0456\u043D\u0448\u0438\u0445 \u041E\u0421
@@ -302,221 +1012,925 @@ OptionPanel.default_browser_command_windows_9x=\u041D\u0430\u0432\u0456\u0433\u0
OptionPanel.default_browser_command_windows_9x.tooltip=<html> \u0414\u043B\u044F Windows (\u043B\u0430\u043F\u043A\u0438 "" \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u0456 \u0456\u0437.\u0437\u0430 \u0430\u0434\u0440\u0435\u0441 (URL), "=, \u0449\u043E \u043C\u0456\u0441\u0442\u044F\u0442\u044C "). </html>
OptionPanel.default_browser_command_windows_nt=\u041D\u0430\u0432\u0456\u0433\u0430\u0442\u043E\u0440 \u0434\u043B\u044F Windows NT
OptionPanel.default_browser_command_windows_nt.tooltip=<html> \u0414\u043B\u044F Windows (\u043B\u0430\u043F\u043A\u0438 "" \u043D\u0435\u043E\u0431\u0445\u0456\u0434\u043D\u0456 \u0456\u0437.\u0437\u0430 \u0430\u0434\u0440\u0435\u0441 (URL), "=, \u0449\u043E \u043C\u0456\u0441\u0442\u044F\u0442\u044C "). </html>
-OptionPanel.default_charset=Charset[translate me]
+OptionPanel.default_charset=\u041A\u043E\u0434\u0443\u0432\u0430\u043D\u043D\u044F
+OptionPanel.default_save_dir=\u0422\u0438\u043F\u043E\u0432\u0430 \u0442\u0435\u043A\u0430 \u0434\u043B\u044F \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F
OptionPanel.Defaults=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0456 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F
-OptionPanel.delete_automatic_saves_at_exit=\u0412\u0438\u043B\u0443\u0447\u0430\u0442\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438 \u043F\u0440\u0438 \u0437\u0430\u043A\u0456\u043D\u0447\u0435\u043D\u043D\u0456 \u0440\u043E\u0431\u043E\u0442\u0438 \u0437 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E?
+OptionPanel.delete_automatic_saves_at_exit=\u0412\u0438\u043B\u0443\u0447\u0430\u0442\u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438 \u043F\u0440\u0438 \u0437\u0430\u043A\u0456\u043D\u0447\u0435\u043D\u043D\u0456 \u0440\u043E\u0431\u043E\u0442\u0438 \u0437 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> \u041F\u043E\u0441\u0442\u0430\u0432\u0442\u0435 \u0433\u0430\u043B\u043E\u0447\u043A\u0443, \u0449\u043E\u0431 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438 \u0431\u0443\u043B\u0438 \u0432\u0438\u043B\u0443\u0447\u0435\u043D\u0456 \u043F\u0456\u0441\u043B\u044F \u0437\u0430\u043A\u0456\u043D\u0447\u04 [...]
+OptionPanel.delete_nodes_without_question=\u0412\u0438\u0434\u0430\u043B\u044F\u0442\u0438 \u0432\u0443\u0437\u043B\u0438 \u0431\u0435\u0437 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F?
+OptionPanel.delete_nodes_without_question.tooltip=\u042F\u043A\u0449\u043E \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E, \u0432\u0443\u0437\u043B\u0438 \u0432\u0438\u0434\u0430\u043B\u044F\u0442\u0438\u043C\u0443\u0442\u044C\u0441\u044F \u0431\u0435\u0437 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F. \u042F\u043A\u0449\u043E \u0446\u0435 \u0437\u0440\u043E\u0431\u0438\u0442\u0438 \u0432\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u043E, \u0 [...]
OptionPanel.disable_cursor_move_paper=\u0425\u043E\u0432\u0430\u0442\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043F\u0440\u0438 \u0440\u0443\u0441\u0456 \u043A\u0430\u0440\u0442\u0438
+OptionPanel.disable_cursor_move_paper.tooltip=<html>\u041D\u0435 \u043F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0432\u043A\u0430\u0437\u0456\u0432\u043D\u0438\u043A '\u043F\u0435\u0440\u0435\u043C\u0456\u0449\u0435\u043D\u043D\u044F' \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u0442\u044F\u0433\u0443\u0432\u0430\u043D\u043D\u0456 \u043F\u0430\u043F\u0435\u0440\u0443</html>
+OptionPanel.display_inline_editor_for_all_new_nodes=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0432\u0431\u0443\u0434\u043E\u0432\u0430\u043D\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0434\u043B\u044F \u0432\u0441\u0456\u0445 \u043D\u043E\u0432\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
+OptionPanel.display_node_id=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 ID \u0432\u0443\u0437\u043B\u0430
+OptionPanel.edgecolor=\u041A\u043E\u043B\u0456\u0440 \u0440\u0435\u0431\u0440\u0430
+OptionPanel.edgecolor.tooltip=\u041A\u043E\u043B\u0456\u0440 \u0440\u0435\u0431\u0440\u0430 \u0434\u043E \u0431\u0430\u0442\u044C\u043A\u0456\u0432\u0441\u044C\u043A\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430 (\u0442\u0430\u043A\u043E\u0436 \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u0434\u043E \u0432\u0441\u0456\u0445 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432)
+OptionPanel.edgestyle=\u0421\u0442\u0438\u043B\u044C \u0440\u0435\u0431\u0440\u0430
+OptionPanel.edgestyle.tooltip=\u0421\u0442\u0438\u043B\u044C \u0440\u0435\u0431\u0440\u0430 \u0434\u043E \u0431\u0430\u0442\u044C\u043A\u0456\u0432\u0441\u044C\u043A\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430 (\u0442\u0430\u043A\u043E\u0436 \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u0434\u043E \u0432\u0441\u0456\u0445 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432)
+OptionPanel.edgewidth=\u0422\u043E\u0432\u0449\u0438\u043D\u0430 \u0440\u0435\u0431\u0440\u0430
+OptionPanel.edgewidth.tooltip=\u0422\u043E\u0432\u0449\u0438\u043D\u0430 \u0440\u0435\u0431\u0440\u0430 \u0434\u043E \u0431\u0430\u0442\u044C\u043A\u0456\u0432\u0441\u044C\u043A\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430 (\u0442\u0430\u043A\u043E\u0436 \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u0434\u043E \u0432\u0441\u0456\u0445 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432)
+OptionPanel.EDIT_CURRENT=\u041F\u0435\u0440\u0435\u043F\u0438\u0441\u0430\u0442\u0438 \u0432\u043C\u0456\u0441\u0442
+OptionPanel.edit_on_double_click=\u0420\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438 \u043F\u0456\u0441\u043B\u044F \u043F\u043E\u0434\u0432\u0456\u0439\u043D\u043E\u0433\u043E \u043A\u043B\u0430\u0446\u0430\u043D\u043D\u044F
+OptionPanel.editor_extra_width=\u041A\u0440\u043E\u043A \u043F\u0440\u0438\u0440\u043E\u0441\u0442\u0443 \u0448\u0438\u0440\u0438\u043D\u0438
+OptionPanel.editor_extra_width.tooltip=<html>\u0412\u0438\u0437\u043D\u0430\u0447\u0430\u0454, \u043D\u0430 \u0441\u043A\u0456\u043B\u044C\u043A\u0438 \u043F\u0456\u043A\u0441\u0435\u043B\u0456\u0432 \u0437\u0440\u043E\u0441\u0442\u0430\u0454 \u0448\u0438\u0440\u0438\u043D\u0430 \u0432\u0443\u0437\u043B\u0430, \u044F\u043A\u0449\u043E \u0442\u0435\u043A\u0441\u0442 \u0432\u0438\u0445\u043E\u0434\u0438\u0442\u044C \u0437\u0430 \u043C\u0435\u0436\u0456 \u043F\u043E\u0442\u043E\u0447\u043D\ [...]
+OptionPanel.el=\u0413\u0440\u0435\u0446\u044C\u043A\u0430 / \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC
+OptionPanel.el__buttons_above=\u041A\u043D\u043E\u043F\u043A\u0438 \u0432\u0433\u043E\u0440\u0456
OptionPanel.el__enter_confirms_by_default=<\u0412\u0412\u0406\u0414> \u0437\u0430\u043A\u0440\u0438\u0432\u0430\u0454 \u0434\u0456\u0430\u043B\u043E\u0433
OptionPanel.el__max_default_window_height=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0430 \u0432\u0438\u0441\u043E\u0442\u0430 \u0432\u0456\u043A\u043D\u0430
OptionPanel.el__max_default_window_width=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0432\u0456\u043A\u043D\u0430
OptionPanel.el__min_default_window_height=\u041D\u0430\u0439\u043C\u0435\u043D\u0448\u0430 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0430 \u0432\u0438\u0441\u043E\u0442\u0430 \u0432\u0456\u043A\u043D\u0430
OptionPanel.el__min_default_window_width=\u041D\u0430\u0439\u043C\u0435\u043D\u0448\u0430 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0432\u0456\u043A\u043D\u0430
OptionPanel.el__position_window_below_node=\u041F\u043E\u043B\u043E\u0436\u0435\u043D\u043D\u044F \u0432\u0456\u043A\u043D\u0430 \u043F\u0456\u0434 \u043A\u043D\u043E\u043F\u043A\u0430\u043C\u0438
-OptionPanel.en=En
+OptionPanel.en=\u0410\u043D\u0433\u043B\u0456\u0439\u0441\u044C\u043A\u0430 / English
OptionPanel.Environment=\u041E\u0442\u043E\u0447\u0435\u043D\u043D\u044F
-OptionPanel.es=Es
-OptionPanel.et=Et[translate me]
+OptionPanel.es=\u0406\u0441\u043F\u0430\u043D\u0441\u044C\u043A\u0430, \u041A\u0430\u0441\u0442\u0438\u043B\u0456\u044F / espa\u00F1ol, castellano
+OptionPanel.et=\u0415\u0441\u0442\u043E\u043D\u0441\u044C\u043A\u0430 / eesti, eesti keel
+OptionPanel.execute_scripts_without_asking=\u0412\u0438\u043A\u043E\u043D\u0430\u043D\u043D\u044F \u0441\u043A\u0440\u0438\u043F\u0442\u0456\u0432 \u0434\u043E\u0437\u0432\u043E\u043B\u0435\u043D\u043E
+OptionPanel.execute_scripts_without_asking.tooltip=<html>\u0421\u043A\u0440\u0438\u043F\u0442\u0438 Freeplane \u0432 \u043F\u0440\u0438\u043D\u0446\u0438\u043F\u0456 \u043C\u043E\u0436\u0443\u0442\u044C \u0432\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u0431\u0443\u0434\u044C-\u044F\u043A\u0456 \u0434\u0456\u0457 \u043D\u0430 \u0432\u0430\u0448\u043E\u043C\u0443 \u043A\u043E\u043C\u043F'\u044E\u0442\u0435\u0440\u0456. <br>\u0422\u043E\u043C\u0443 \u043D\u0435 \u0441\u043B\u0456\u0434 \u0 [...]
+OptionPanel.execute_scripts_without_exec_restriction=\u0414\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u0437\u0430\u043F\u0443\u0441\u043A \u0456\u043D\u0448\u0438\u0445 \u043F\u0440\u043E\u0433\u0440\u0430\u043C (\u041D\u0415 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u043E)
+OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>\u042F\u043A\u0449\u043E \u0432\u0430\u0448\u0456 Groovy-\u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0432\u0438\u043C\u0430\u0433\u0430\u044E\u0442\u044C \u0437\u0430\u043F\u0443\u0441\u043A\u0443 \u0456\u043D\u0448\u0438\u0445 \u043F\u0440\u043E\u0433\u0440\u0430\u043C (\u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434, \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430) \u0431\u0435\u0437 \u043F\u0456\u0434\u0 [...]
+OptionPanel.execute_scripts_without_file_restriction=\u0414\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u0457 \u0447\u0438\u0442\u0430\u043D\u043D\u044F \u0444\u0430\u0439\u043B\u0456\u0432 (\u041D\u0415 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u043E)
+OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>\u042F\u043A\u0449\u043E \u0432\u0430\u0448\u0456 Groovy-\u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0432\u0438\u043C\u0430\u0433\u0430\u044E\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F\u0443 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F (\u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438, \u0437\u0430\u043A\u0440\u0438\u0442\u0438, \u0447\u0438\u0442\u0430\u0442\u0438),<br>\u043C\u043E\u0436\u04 [...]
+OptionPanel.execute_scripts_without_network_restriction=\u0414\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u043C\u0435\u0440\u0435\u0436\u0435\u0432\u0456 \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u0457 (\u041D\u0415 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u043E)
+OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>\u042F\u043A\u0449\u043E \u0432\u0430\u0448\u0456 Groovy-\u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0432\u0438\u043C\u0430\u0433\u0430\u044E\u0442\u044C \u0432\u0438\u043A\u043E\u043D\u0430\u043D\u043D\u044F \u043F\u0435\u0432\u043D\u0438\u0445 \u0434\u0456\u0439 \u0443 \u043C\u0435\u0440\u0435\u0436\u0456,<br>\u0443\u0432\u0456\u043C\u043A\u043D\u0456\u0442\u044C \u0446\u0435\u0439 \u043F\u0430\u0440\u0430\u04 [...]
+OptionPanel.execute_scripts_without_write_restriction=\u0414\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u0457 \u0437\u0430\u043F\u0438\u0441\u0443 \u0444\u0430\u0439\u043B\u0456\u0432 (\u041D\u0415 \u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u043E)
+OptionPanel.execute_scripts_without_write_restriction.tooltip=<html><body>\u042F\u043A\u0449\u043E \u0432\u0430\u0448\u0456 Groovy-\u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0432\u0438\u043C\u0430\u0433\u0430\u044E\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F\u0443 \u0434\u043B\u044F \u0437\u0430\u043F\u0438\u0441\u0443 (\u0437\u0430\u043F\u0438\u0441\u0430\u0442\u0438, \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438(!)),<br>\u043C\u043E\u0436\u0435\u0442\u0435 \u0443\u0432\u0456\ [...]
OptionPanel.experimental_file_locking_on=(\u041F\u0440\u043E\u0431\u043D\u0430) \u0431\u043B\u043E\u043A\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u0445 \u0444\u0430\u0439\u043B\u0456\u0432
-OptionPanel.experimental_file_locking_on.tooltip=<html> \u041F\u0440\u043E\u0431\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0456\u044F </html>
+OptionPanel.experimental_file_locking_on.tooltip=<html> \u041F\u0440\u043E\u0431\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0456\u044F</html>
OptionPanel.export_icons_in_html=\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C \u0434\u043E HTML
-OptionPanel.export_icons_in_html.tooltip=<html> \u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0430\u0442\u0438, \u044F\u043A\u0449\u043E HTML \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438. \u0426\u0456 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u043C\u043E\u0436\u043B\u0438\u0432\u043E \u043D\u0435 \u0431\u0443\u0434\u0443\u0442\u044C \u043A\u043E\u0440\u0435\u043A\u0442\u043D\u043E \u043F\u043E\u043A\u0430\ [...]
+OptionPanel.export_icons_in_html.tooltip=<html> \u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0430\u0442\u0438, \u044F\u043A\u0449\u043E HTML, \u0449\u043E \u0435\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0454\u0442\u044C\u0441\u044F \u0437 Freeplane, \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438. \u0426\u0456 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u043C\u043E\u0436\u043B\u0438\u0432\u043E \u043D\u0435 [...]
+OptionPanel.exported_image_resolution_dpi=\u0420\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0456\u0441\u0442\u044C \u0435\u043A\u0441\u043F\u043E\u0440\u0442\u043E\u0432\u0430\u043D\u043E\u0433\u043E \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F (\u0442\u043E\u0447\u043E\u043A/\u0434\u044E\u0439\u043C)
OptionPanel.Files=\u0424\u0430\u0439\u043B\u0438
OptionPanel.first=\u041F\u0435\u0440\u0448\u0438\u0439
+OptionPanel.fit_to_viewport=\u0412\u043F\u0438\u0441\u0430\u0442\u0438 \u0444\u043E\u043D\u043E\u0432\u0435 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0443 \u0432\u0456\u043A\u043D\u043E
+OptionPanel.fold_on_click_inside=\u0417\u0433\u043E\u0440\u0442\u0430\u0442\u0438 \u043F\u0440\u0438 \u043A\u043B\u0430\u0446\u0430\u043D\u043D\u0456 \u0432\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0456
OptionPanel.foldingsymbolwidth=\u0420\u043E\u0437\u043C\u0456\u0440 \u0437\u043D\u0430\u043A\u0443 \u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
-OptionPanel.foldingsymbolwidth.tooltip=<html> \u0420\u043E\u0437\u043C\u0456\u0440 \u0437\u043D\u0430\u043A\u0443, \u0449\u043E \u043F\u043E\u0437\u043D\u0430\u0447\u0430\u0454 \u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438\u0439 \u0432\u0443\u0437\u043E\u043B <html>
-OptionPanel.fork=\u041B\u0456\u043D\u0456\u044F
-OptionPanel.fr=Fr
-OptionPanel.gl=Gl[translate me]
+OptionPanel.foldingsymbolwidth.tooltip=<html>\u0420\u043E\u0437\u043C\u0456\u0440 \u043A\u0440\u0443\u0436\u0435\u0447\u043A\u0430, \u0449\u043E \u043F\u043E\u0437\u043D\u0430\u0447\u0430\u0454 \u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438\u0439 \u0432\u0443\u0437\u043E\u043B</html>
+OptionPanel.fork=\u0413\u0456\u043B\u043A\u0430
+OptionPanel.format_locale=\u041B\u043E\u043A\u0430\u043B\u044C \u0434\u043B\u044F \u0444\u043E\u0440\u043C\u0430\u0442\u0456\u0432
+OptionPanel.format_locale.tooltip=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u043B\u043E\u043A\u0430\u043B\u0456\u0437\u0430\u0446\u0456\u0457 \u0434\u043B\u044F \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0430 \u0440\u043E\u0437\u0431\u043E\u0440\u0443 \u0434\u0430\u043D\u0438\u0445
+OptionPanel.formula_disable_caching=\u0412\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u043A\u0435\u0448 \u0440\u043E\u0437\u0440\u0430\u0445\u0443\u043D\u043A\u0443 \u0444\u043E\u0440\u043C\u0443\u043B
+OptionPanel.formula_disable_plugin=\u0412\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u0440\u043E\u0437\u0440\u0430\u0445\u0443\u043D\u043E\u043A \u0444\u043E\u0440\u043C\u0443\u043B
+OptionPanel.fr=\u0424\u0440\u0430\u043D\u0446\u0443\u0437\u044C\u043A\u0430 / Fran\u00E7ais
+OptionPanel.gl=\u0413\u0430\u043B\u0456\u0441\u0456\u0439\u0441\u044C\u043A\u0430 / Galego
+OptionPanel.goto_note_end_on_edit=\u041F\u0435\u0440\u0435\u043C\u0456\u0441\u0442\u0438\u0442\u0438 \u043A\u0443\u0440\u0441\u043E\u0440 \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0438 \u0432 \u043A\u0456\u043D\u0435\u0446\u044C
+OptionPanel.grid_size=\u0420\u043E\u0437\u043C\u0456\u0440 \u043A\u043B\u0456\u0442\u0438\u043D\u043A\u0438 \u0441\u0456\u0442\u043A\u0438
+OptionPanel.groovy_editor_font=\u0428\u0440\u0438\u0444\u0442 \u0434\u043B\u044F Groovy-\u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0437 \u043F\u0456\u0434\u0441\u0432\u0456\u0447\u0435\u043D\u043D\u044F\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0443
+OptionPanel.groovy_editor_font.tooltip=\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 'Dialog' \u0430\u0431\u043E 'Monospaced', \u044F\u043A\u0449\u043E \u0432\u0430\u043C \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0456 \u0441\u0438\u043C\u0432\u043E\u043B\u0438 Unicode!
+OptionPanel.groovy_editor_font_size=\u0420\u043E\u0437\u043C\u0456\u0440 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432 \u0434\u043B\u044F Groovy-\u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 \u0437 \u043F\u0456\u0434\u0441\u0432\u0456\u0447\u0435\u043D\u043D\u044F\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0443
OptionPanel.gtk=Gtk
-OptionPanel.hr=Hr[translate me]
+OptionPanel.hide_edge=\u0421\u0445\u043E\u0432\u0430\u0442\u0438 \u0440\u0435\u0431\u0440\u043E
+OptionPanel.highlight_formulas=\u041F\u0456\u0434\u0441\u0432\u0456\u0447\u0443\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0438
+OptionPanel.horizontal=\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u043E
+OptionPanel.hr=\u0425\u043E\u0440\u0432\u0430\u0442\u044C\u0441\u044C\u043A\u0430 / hrvatski
OptionPanel.HTML=HTML
OptionPanel.html_export_based_on_headings=\u041F\u043E \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u0445
-OptionPanel.html_export_fold_all=\u0421\u043A\u0440\u0443\u0442\u0438\u0442\u0438 \u0432\u0441\u0435
+OptionPanel.html_export_fold_all=\u0417\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0441\u0435
OptionPanel.html_export_fold_currently_folded=\u042F\u043A \u043D\u0430 \u043A\u0430\u0440\u0442\u0456
OptionPanel.html_export_folding=\u0417\u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F \u043F\u0440\u0438 \u0435\u043A\u0441\u043F\u043E\u0440\u0442\u0456 \u0434\u043E HTML
OptionPanel.html_export_no_folding=\u0411\u0435\u0437 \u0437\u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F
-OptionPanel.hu=Hu
-OptionPanel.icon=Icon[translate me]
-OptionPanel.id=Id[translate me]
-OptionPanel.it=It
-OptionPanel.ja=Ja
+OptionPanel.hu=\u0423\u0433\u043E\u0440\u0441\u044C\u043A\u0430 / Magyar
+OptionPanel.ic_disable=\u0412\u0438\u043C\u043A\u043D\u0443\u0442\u0438
+OptionPanel.ic_file=\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0434\u0438\u0441\u043A
+OptionPanel.ic_ram=\u0412 \u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u0456\u0439 \u043F\u0430\u043C'\u044F\u0442\u0456
+OptionPanel.icon=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0430
+OptionPanel.icon.tooltip=\u042F\u043A\u0449\u043E \u043F\u0440\u0438\u0439\u043D\u044F\u0442\u0438, \u0432\u0443\u0437\u043E\u043B \u043C\u0430\u0442\u0438\u043C\u0435 \u0441\u0430\u043C\u0435 \u0442\u0430\u043A\u0443 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0443.
+OptionPanel.icons.list=\u0421\u043F\u0438\u0441\u043E\u043A \u043F\u043E\u043A\u0430\u0437\u0430\u043D\u0438\u0445 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0445 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C
+OptionPanel.icons.list.tooltip=\u0422\u0443\u0442 \u043C\u043E\u0436\u043D\u0430 \u0443\u043F\u043E\u0440\u044F\u0434\u043A\u0443\u0432\u0430\u0442\u0438 \u0430\u0431\u043E \u0432\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0456 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438. \u0412\u043E\u043D\u0438 \u0431\u0443\u0434\u0443\u0442\u044C \u0440\u043E\u0437\u0434\u0456\u043B\u0435\u043D\u0456 ';'.
+OptionPanel.id=\u0406\u043D\u0434\u043E\u043D\u0435\u0437\u0456\u0439\u0441\u044C\u043A\u0430 / Bahasa Indonesia
+OptionPanel.IGNORE=\u041D\u0435 \u0440\u043E\u0431\u0438\u0442\u0438 \u043D\u0456\u0447\u043E\u0433\u043E
+OptionPanel.il__enter_confirms_by_default=<\u0412\u0412\u0406\u0414> \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0443\u0454 \u0442\u0438\u043F\u043E\u0432\u043E
+OptionPanel.image_cache=\u0434\u043B\u044F \u043C\u0430\u043B\u044E\u043D\u043A\u0456\u0432
+OptionPanel.indentationUsesTabsInTextOutput=\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0442\u0430\u0431\u0443\u043B\u044F\u0446\u0456\u0457 \u043F\u0440\u0438 \u0432\u0438\u0432\u0435\u0434\u0435\u043D\u043D\u0456 \u0442\u0435\u043A\u0441\u0442\u0443
+OptionPanel.it=\u0406\u0442\u0430\u043B\u0456\u0439\u0441\u044C\u043A\u0430 / Italiano
+OptionPanel.ja=\u042F\u043F\u043E\u043D\u0441\u044C\u043A\u0430 / \u65E5\u672C\u8A9E
+OptionPanel.JoinNodesAction.textSeparators=\u0420\u043E\u0437\u0434\u0456\u043B\u044E\u0432\u0430\u0447 \u0442\u0435\u043A\u0441\u0442\u0443
+OptionPanel.key_type_action=\u041F\u0440\u0438 \u043D\u0430\u0431\u043E\u0440\u0456 \u0442\u0435\u043A\u0441\u0442\u0443
OptionPanel.Keystrokes=\u041A\u043B\u0430\u0432\u0456\u0448\u0456
-OptionPanel.ko=Kr
+OptionPanel.ko=\u041A\u043E\u0440\u0435\u0439\u0441\u044C\u043A\u0430 / \uD55C\uAD6D\uC5B4 (\u97D3\u570B\u8A9E), \uC870\uC120\uB9D0 (\u671D\u9BAE\u8A9E)
+OptionPanel.label_font_family=\u0413\u0430\u0440\u043D\u0456\u0442\u0443\u0440\u0430
+OptionPanel.label_font_size=\u0420\u043E\u0437\u043C\u0456\u0440 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432
OptionPanel.language=\u041C\u043E\u0432\u0430
OptionPanel.language.tooltip=<html> \u041C\u043E\u0432\u0430, \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u043D\u0430 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E. '\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E' \u0432\u0438\u0431\u0438\u0440\u0430\u0454 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0443 \u043C\u043E\u0432\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0438 </html>
OptionPanel.last=\u041E\u0441\u0442\u0430\u043D\u043D\u0456\u0439
OptionPanel.last_opened_list_length=\u0420\u043E\u0437\u043C\u0456\u0440 \u043F\u0435\u0440\u0435\u043B\u0456\u043A\u0443 \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u0445 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0456\u0432
+OptionPanel.latex_disable_editor=\u0412\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 LaTeX \u0437 \u043F\u0456\u0434\u0441\u0432\u0456\u0447\u0435\u043D\u043D\u044F\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0443
+OptionPanel.latex_disable_editor.tooltip=\u041F\u043E\u0437\u043D\u0430\u0447\u0442\u0435, \u044F\u043A\u0449\u043E \u0454 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438 \u0437 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u043E\u043C LaTeX
+OptionPanel.latex_editor_font=\u0428\u0440\u0438\u0444\u0442 \u0434\u043B\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 LaTeX \u0437 \u043F\u0456\u0434\u0441\u0432\u0456\u0447\u0435\u043D\u043D\u044F\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0443
+OptionPanel.latex_editor_font.tooltip=\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 'Dialog' \u0430\u0431\u043E 'Monospaced', \u044F\u043A\u0449\u043E \u0432\u0430\u043C \u043F\u043E\u0442\u0440\u0456\u0431\u043D\u0456 \u0441\u0438\u043C\u0432\u043E\u043B\u0438 Unicode!
+OptionPanel.latex_editor_font_size=\u0420\u043E\u0437\u043C\u0456\u0440 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432 \u0434\u043B\u044F \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430 LaTeX \u0437 \u043F\u0456\u0434\u0441\u0432\u0456\u0447\u0435\u043D\u043D\u044F\u043C \u0441\u0438\u043D\u0442\u0430\u043A\u0441\u0438\u0441\u0443
+OptionPanel.latex_macros=\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0456 \u043C\u0430\u043A\u0440\u043E\u0441\u0438 LaTeX
+OptionPanel.layout_map_on_text_change=\u0417\u043C\u0456\u043D\u044E\u0432\u0430\u0442\u0438 \u043C\u0430\u043A\u0435\u0442 \u043F\u0440\u0438 \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043D\u043D\u0456
+OptionPanel.layout_map_on_text_change.tooltip=\u0412\u0438\u043C\u043A\u043D\u0456\u0442\u044C \u0434\u043B\u044F \u043A\u0440\u0430\u0449\u043E\u0457 \u0448\u0432\u0438\u0434\u043A\u043E\u0434\u0456\u0457
OptionPanel.linear=\u041F\u0440\u044F\u043C\u0430
OptionPanel.links=\u0417\u0432'\u044F\u0437\u043A\u0438
+OptionPanel.links.tooltip=<html>\u0420\u043E\u0431\u0438\u0442\u044C \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0432\u0456\u0434\u043D\u043E\u0441\u043D\u0438\u043C \u0430\u0431\u043E \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u0438\u043C</html>
+OptionPanel.load_folding=\u041F\u0440\u0438 \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u0456
+OptionPanel.load_folding_from_map_default_fold_all=\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0437 \u043A\u0430\u0440\u0442\u0438 \u0447\u0438 \u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0441\u0456
+OptionPanel.load_folding_from_map_default_unfold_all=\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0437 \u043A\u0430\u0440\u0442\u0438 \u0447\u0438 \u0440\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0441\u0456
+OptionPanel.load_last_map=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u043A\u0430\u0440\u0442\u0443
+OptionPanel.load_last_map.tooltip=<html>\u042F\u043A\u0449\u043E \u043F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043E, \u0442\u043E \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 Freeplane \u043F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438\u043C\u0435 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0443 \u043A\u0430\u0440\u0442\u0443.</html>
+OptionPanel.load_last_maps=\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0432\u0441\u0456 \u043E\u0441\u0442\u0430\u043D\u043D\u0456 \u043A\u0430\u0440\u0442\u0438
OptionPanel.lookandfeel=\u041F\u0440\u0438\u043A\u0438\u0434
OptionPanel.lookandfeel.tooltip=<html> \u041F\u0440\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u0445 \u0432\u0438\u0431\u0438\u0440\u0430\u0439\u0442\u0435 '\u043D\u0456\u0447\u043E\u0433\u043E' ('nothing'). </html>
-OptionPanel.lt=Lt
+OptionPanel.lt=\u041B\u0438\u0442\u043E\u0432\u0441\u044C\u043A\u0430 / kalba
+OptionPanel.max_displayed_node_count=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u043E\u043A\u0430\u0437\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
+OptionPanel.max_image_width=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u043F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u043C\u0430\u043B\u044E\u043D\u043A\u0430
+OptionPanel.max_image_width.tooltip=\u041D\u043E\u0432\u0456 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u043C\u0435\u043D\u0448\u0443\u0432\u0430\u0442\u0438\u043C\u0443\u0442\u044C\u0441\u044F \u0434\u043E \u0446\u0456\u0454\u0457 \u0448\u0438\u0440\u0438\u043D\u0438
+OptionPanel.max_menu_item_count=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0435 \u0447\u0438\u0441\u043B\u043E \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456\u0432 \u043C\u0435\u043D\u044E
+OptionPanel.max_menu_item_count.tooltip=\u041E\u0431\u043C\u0435\u0436\u0443\u0454 \u0447\u0438\u0441\u043B\u043E \u043F\u0443\u043D\u043A\u0442\u0456\u0432 \u0432 \u043E\u0434\u043D\u043E\u043C\u0443 \u043F\u0456\u0434\u043C\u0435\u043D\u044E, \u043D\u0435 \u043C\u0435\u043D\u0448\u0435 10
OptionPanel.max_node_width=\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0432\u0443\u0437\u043B\u0456\u0432
OptionPanel.max_node_width.tooltip=<html> \u0443 \u043F\u0456\u043A\u0441\u0435\u043B\u044F\u0445 </html>
+OptionPanel.max_shortened_text_length=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0441\u043A\u043E\u0440\u043E\u0447\u0435\u043D\u043E\u0433\u043E \u0442\u0435\u043A\u0441\u0442\u0443
OptionPanel.metal=\u041C\u0435\u0442\u0430\u043B
+OptionPanel.min_node_width=\u041D\u0430\u0439\u043C\u0435\u043D\u0448\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u0432\u0443\u0437\u043B\u0430
OptionPanel.motif=Motif
-OptionPanel.nb=Nb
-OptionPanel.nl=Nl
-OptionPanel.nn=Nn[translate me]
+OptionPanel.narrow_hexagon=\u0412\u0443\u0437\u044C\u043A\u0438\u0439 \u0448\u0435\u0441\u0442\u0438\u043A\u0443\u0442\u043D\u0438\u043A
+OptionPanel.nb=\u041D\u043E\u0440\u0432\u0435\u0437\u044C\u043A\u0430 \u0431\u0443\u043A\u043C\u043E\u043B / Norsk bokm\u00E5l
+OptionPanel.never_save_folding=\u041D\u0456\u043A\u043E\u043B\u0438
+OptionPanel.nl=\u0424\u043B\u0430\u043C\u0430\u043D\u0434\u0441\u044C\u043A\u0430 / Nederlands, Vlaams
+OptionPanel.nn=\u041D\u043E\u0440\u0432\u0435\u0437\u044C\u043A\u0430 \u043D\u044E\u043D\u043E\u0448\u043A / Norsk nynorsk
+OptionPanel.nodebackgroundcolor=\u0422\u043B\u043E
+OptionPanel.nodebackgroundcolor.tooltip=\u0422\u043B\u043E \u043D\u0435\u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430.
+OptionPanel.nodecolor=\u0422\u0435\u043A\u0441\u0442
+OptionPanel.nodecolor.tooltip=\u041A\u043E\u043B\u0456\u0440 \u0442\u0435\u043A\u0441\u0442\u0443 \u043D\u0435\u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430.
+OptionPanel.nodefontbold=\u0416\u0438\u0440\u043D\u0438\u0439
+OptionPanel.nodefonthyperlink=\u0413\u0456\u043F\u0435\u0440\u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+OptionPanel.nodefontitalic=\u041A\u0443\u0440\u0441\u0438\u0432
+OptionPanel.nodefontname=\u0413\u0430\u0440\u043D\u0456\u0442\u0443\u0440\u0430
+OptionPanel.nodefontsize=\u0420\u043E\u0437\u043C\u0456\u0440 \u0441\u0438\u043C\u0432\u043E\u043B\u0456\u0432
+OptionPanel.nodeformat=\u0424\u043E\u0440\u043C\u0430\u0442
+OptionPanel.nodeformat.tooltip=<html>\u0417\u0430\u043C\u0456\u043D\u0430 \u0456/\u0430\u0431\u043E \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0435\u043A\u0441\u0442\u0443:<ul><li><em>\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0448\u0430\u0431\u043B\u043E\u043D\u0430</em> (<tt>%s</tt> \u0432\u0438\u0445\u0456\u0434\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442), \u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434 <tt>\u0423\ [...]
+OptionPanel.nodenumbering=\u041D\u0443\u043C\u0435\u0440\u0430\u0446\u0456\u044F \u0432\u0443\u0437\u043B\u0456\u0432
+OptionPanel.nodenumbering.tooltip=\u0414\u043E\u0434\u0430\u0454 \u043F\u043E\u0441\u043B\u0456\u0434\u043E\u0432\u043D\u0456 \u043D\u043E\u043C\u0435\u0440\u0438 (\u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434, 1.3.1) \u0434\u043E \u0442\u0435\u043A\u0441\u0442\u0443 \u0432\u0443\u0437\u043B\u0456\u0432.
+OptionPanel.nodeshape=\u0424\u043E\u0440\u043C\u0430 \u0432\u0443\u0437\u043B\u0430
+OptionPanel.nodetext=\u0422\u0435\u043A\u0441\u0442 \u044F\u0434\u0440\u0430
+OptionPanel.nodetext.tooltip=\u0422\u0443\u0442 \u043C\u043E\u0436\u043D\u0430 \u0432\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u043A\u0441\u0442 \u0432\u0443\u0437\u043B\u0430. \u041F\u0440\u0438 \u0437\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u043D\u043D\u0456 \u0448\u0430\u0431\u043B\u043E\u043D\u0430 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0456\u0439 \u0442\u0435\u043A\u0441\u0442 \u0431\u0443\u0434\u0435 \u0432\u0442\u0440\u0430\u0447\u0435\u043D\u043E.
OptionPanel.nothing=\u041D\u0456\u0447\u043E\u0433\u043E
+OptionPanel.number_format=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0447\u0438\u0441\u0435\u043B
+OptionPanel.number_format.tooltip=\u0428\u0430\u0431\u043B\u043E\u043D, \u0449\u043E \u043C\u0456\u0441\u0442\u0438\u0442\u044C '#' \u0434\u043B\u044F \u043C\u043E\u0436\u043B\u0438\u0432\u0438\u0445 \u0430\u0431\u043E '0' \u0434\u043B\u044F \u043E\u0431\u043E\u0432'\u044F\u0437\u043A\u043E\u0432\u0438\u0445 \u0446\u0438\u0444\u0440. \u041F\u0440\u0438\u043A\u043B\u0430\u0434\u0438: "0.00", "0.0%", "$#.00", "#0"
OptionPanel.number_of_different_files_for_automatic_save=\u0427\u0438\u0441\u043B\u043E \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0438\u0445 \u0432\u0435\u0440\u0441\u0456\u0439
OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> \u0422\u0456\u043B\u044C\u043A\u0438 \u0437\u0430\u0434\u0430\u043D\u0435 \u0447\u0438\u0441\u043B\u043E \u0432\u0435\u0440\u0441\u0456\u0439 \u0431\u0443\u0434\u0443\u0442\u044C \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456, \u0432\u0441\u0456 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0456 \u0432\u0435\u0440\u0441\u0456\u0457 \u0432\u0456\u0434\u0434\u0430\u043B\u044F\u0442\u0438\u043C\u0443\u0442\u [...]
OptionPanel.OK=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438
-OptionPanel.pl=Pl
-OptionPanel.placenewbranches=\u041F\u043E\u0437\u0438\u0446\u0456\u044F \u043D\u043E\u0432\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
-OptionPanel.pt_BR=Pt BR
-OptionPanel.pt_PT=Pt PT
+OptionPanel.org.freeplane.plugin.bugreport=\u041F\u043E\u043B\u0456\u0442\u0438\u043A\u0430
+OptionPanel.org.freeplane.plugin.bugreport.allowed=\u0417\u0430\u0432\u0436\u0434\u0438 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438
+OptionPanel.org.freeplane.plugin.bugreport.ask=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0434\u0456\u0430\u043B\u043E\u0433 \u0449\u043E\u0434\u043E \u0437\u0432\u0456\u0442\u0443
+OptionPanel.org.freeplane.plugin.bugreport.denied=\u041D\u0435 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438 \u043D\u0456\u043A\u043E\u043B\u0438
+OptionPanel.org.freeplane.plugin.bugreport.userid=\u041D\u0435\u043E\u0431\u043E\u0432'\u044F\u0437\u043A\u043E\u0432\u0438\u0439 \u0456\u0434\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0442\u043E\u0440 \u0434\u043B\u044F \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+OptionPanel.outline_hgap=\u0412\u0456\u0434\u0441\u0442\u0430\u043D\u044C \u043F\u043E \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u0456
+OptionPanel.outline_vgap=\u0412\u0456\u0434\u0441\u0442\u0430\u043D\u044C \u043F\u043E \u0432\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u0456
+OptionPanel.oval=\u041E\u0432\u0430\u043B
+OptionPanel.paint_connectors_behind=\u041C\u0430\u043B\u044E\u0432\u0430\u0442\u0438 \u0437\u0432'\u044F\u0437\u043A\u0438 \u043C\u0456\u0436 \u0432\u0443\u0437\u043B\u0430\u043C\u0438
+OptionPanel.parse_data=\u0420\u043E\u0437\u043F\u0456\u0437\u043D\u0430\u0432\u0430\u0442\u0438 \u0432\u0432\u0435\u0434\u0435\u043D\u0456 \u0447\u0438\u0441\u043B\u0430, \u0434\u0430\u0442\u0438 \u0439 \u0447\u0430\u0441
+OptionPanel.parse_data.tooltip=\u041D\u0430\u043C\u0430\u0433\u0430\u0442\u0438\u0441\u044C \u0440\u043E\u0437\u0456\u0431\u0440\u0430\u0442\u0438 \u0432\u0432\u0435\u0434\u0435\u043D\u0456 \u0434\u0430\u0442\u0443, \u0434\u0430\u0442\u0443-\u0447\u0430\u0441 \u0430\u0431\u043E \u0447\u0438\u0441\u043B\u043E \u0456 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0442\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0456 \u0444\u043E\u0440\u043C\u0430\u0442\u0438. \u0 [...]
+OptionPanel.parse_formulas=\u0420\u043E\u0437\u043F\u0456\u0437\u043D\u0430\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0438
+OptionPanel.parse_formulas.tooltip=\u0420\u043E\u0437\u043F\u0456\u0437\u043D\u0430\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0438 \u0443 \u0432\u0443\u0437\u043B\u0430\u0445, \u0449\u043E \u043F\u043E\u0447\u0438\u043D\u0430\u044E\u0442\u044C\u0441\u044F \u0437 '='. \u0414\u0438\u0432. http://www.freeplane.org/wiki/index.php/Formulas.
+OptionPanel.parse_latex=\u0420\u043E\u0437\u043F\u0456\u0437\u043D\u0430\u0432\u0430\u0442\u0438 LaTeX
+OptionPanel.parse_latex.tooltip=\u0420\u043E\u0437\u043F\u0456\u0437\u043D\u0430\u0432\u0430\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0438 LaTeX \u0437\u0430 \u0444\u043E\u0440\u043C\u0430\u0442\u043E\u043C \u0430\u0431\u043E \u043F\u0440\u0435\u0444\u0456\u043A\u0441\u043E\u043C. \u0414\u0438\u0432. http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane.
+OptionPanel.PASTE_HTML=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u044F\u043A HTML
+OptionPanel.PASTE_PLAIN_TEXT=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u044F\u043A \u043F\u0440\u043E\u0441\u0442\u0438\u0439 \u0442\u0435\u043A\u0441\u0442
+OptionPanel.path_property_may_not_be_empty=\u0412\u043B\u0430\u0441\u0442\u0438\u0432\u0456\u0441\u0442\u044C \u0428\u043B\u044F\u0445 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u043F\u043E\u0440\u043E\u0436\u043D\u044C\u043E\u044E! \u0417\u043C\u0456\u043D\u0438 \u0431\u0443\u0434\u0435 \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u043E.
+OptionPanel.patternname=\u041D\u0430\u0437\u0432\u0430
+OptionPanel.patternname.tooltip=\u0423\u043D\u0456\u043A\u0430\u043B\u044C\u043D\u0430 \u043D\u0430\u0437\u0432\u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u0443
+OptionPanel.pl=\u041F\u043E\u043B\u044C\u0441\u044C\u043A\u0430 / polski
+OptionPanel.placenewbranches=\u0420\u043E\u0437\u0442\u0430\u0448\u0443\u0432\u0430\u043D\u043D\u044F \u043D\u043E\u0432\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
+OptionPanel.placenewbranches.tooltip=<html>\u041C\u0456\u0441\u0446\u0435 \u0434\u043B\u044F \u043D\u043E\u0432\u0438\u0445 \u0433\u0456\u043B\u043E\u043A. \u0414\u043E\u043F\u0443\u0441\u0442\u0438\u043C\u0456 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F '\u041F\u0435\u0440\u0448\u0438\u0439' \u0430\u0431\u043E '\u041E\u0441\u0442\u0430\u043D\u043D\u0456\u0439' </html>
+OptionPanel.plugin.tooltip=\u0414\u043E\u0434\u0430\u0442\u043A\u0438, \u044F\u043A\u0456 \u043D\u0435 \u0432\u0431\u0443\u0434\u043E\u0432\u0430\u043D\u0456.
+OptionPanel.plugins=\u0414\u043E\u0434\u0430\u0442\u043A\u0438
+OptionPanel.presentation_dimmer_transparency=\u041F\u0440\u043E\u0437\u043E\u0440\u0456\u0441\u0442\u044C \u0437\u0430\u0442\u0456\u043D\u0435\u043D\u043D\u044F \u0432 \u0440\u0435\u0436\u0438\u043C\u0456 \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0456\u0457
+OptionPanel.presentation_mode=\u0420\u0435\u0436\u0438\u043C \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0456\u0457
+OptionPanel.printonwhitebackground=<html>\u0411\u0456\u043B\u0435 \u0442\u043B\u043E \u0434\u043B\u044F \u0434\u0440\u0443\u043A\u0443</html>
+OptionPanel.printonwhitebackground.tooltip=<html>\u0417\u0430\u0432\u0436\u0434\u0438 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0431\u0456\u043B\u0435 \u0442\u043B\u043E \u043F\u0456\u0434 \u0447\u0430\u0441 \u0434\u0440\u0443\u043A\u0443</html>
+OptionPanel.pt_BR=\u041F\u043E\u0440\u0442\u0443\u0433\u0430\u043B\u044C\u0441\u044C\u043A\u0430 (\u0411\u0440\u0430\u0437\u0438\u043B\u0456\u044F) / Portugu\u00EAs (Brasil)
+OptionPanel.pt_PT=\u041F\u043E\u0440\u0442\u0443\u0433\u0430\u043B\u044C\u0441\u044C\u043A\u0430 (\u041F\u043E\u0440\u0442\u0443\u0433\u0430\u043B\u0456\u044F) / Portugu\u00EAs (Portugal)
+OptionPanel.RECT=\u041F\u0440\u044F\u043C\u043E\u043A\u0443\u0442\u043D\u0438\u043A
+OptionPanel.rectangle=\u041F\u0440\u044F\u043C\u043E\u043A\u0443\u0442\u043D\u0438\u043A
OptionPanel.relative=\u0412\u0456\u0434\u043D\u043E\u0441\u043D\u043E
-OptionPanel.ru=Ru
-OptionPanel.scrollbar_increment=Speed[translate me]
+OptionPanel.remind_type_of_new_nodes.tooltip=<html>"\u0421\u043F\u0438\u0442\u0430\u0442\u0438" - \u0449\u043E\u0440\u0430\u0437\u0443 \u043F\u0438\u0442\u0430\u0442\u0438\u043C\u0435 (\u0432\u0438\u0431\u0435\u0440\u0456\u0442\u044C, \u044F\u043A\u0449\u043E \u0441\u0443\u043C\u043D\u0456\u0432\u0430\u0454\u0442\u0435\u0441\u044C).<br>"\u0422\u0430\u043A" - \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0442\u0438\u043C\u0435 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0437 \u [...]
+OptionPanel.remind_use_rich_text_in_new_nodes=\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u043E\u0432\u0430\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442
+OptionPanel.remindersBlink=\u0411\u043B\u0438\u043C\u0430\u043D\u043D\u044F \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u044C
+OptionPanel.remindersShowNotifications=\u041D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F \u0432\u0438\u0432\u043E\u0434\u044F\u0442\u044C \u0432\u0456\u043A\u043D\u0430 \u0437 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F\u043C\u0438
+OptionPanel.remindersStandardDelay=\u0417\u0430\u0442\u0440\u0438\u043C\u043A\u0430 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
+OptionPanel.remove_notes_without_question=\u0412\u0438\u0434\u0430\u043B\u044F\u0442\u0438 \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0438 \u0431\u0435\u0437 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F?
+OptionPanel.remove_notes_without_question.tooltip=\u042F\u043A\u0449\u043E \u0446\u0435\u0439 \u043F\u0440\u0430\u043F\u043E\u0440\u0435\u0446\u044C \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E, \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0438, \u0449\u043E \u043D\u0430\u043B\u0435\u0436\u0430\u0442\u044C \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u043C \u0432\u0443\u0437\u043B\u0430\u043C, \u0432\u0438\u043B\u0443\u0447\u0430\u0442\u0438\u043C\u0443\u0442\u044C\u04 [...]
+OptionPanel.resources_use_default_font_for_notes_too=\u0414\u043B\u044F \u043F\u0440\u0438\u043C\u0456\u0442\u043E\u043A \u0442\u0435\u0436 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0442\u0438\u043F\u043E\u0432\u0438\u0439 \u0448\u0440\u0438\u0444\u0442
+OptionPanel.resources_use_margin_top_zero_for_notes=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0432\u0435\u0440\u0445\u043D\u044E \u043C\u0435\u0436\u0443 \u043F\u0440\u0438\u043C\u0456\u0442\u043E\u043A
+OptionPanel.revision_color=\u041A\u043E\u043B\u0456\u0440 \u0432\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C
+OptionPanel.revision_color.tooltip=\u041A\u043E\u043B\u0456\u0440 \u0442\u043B\u0430 \u0434\u043B\u044F \u0437\u043C\u0456\u043D\u044E\u0432\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432.
+OptionPanel.ROUND_RECT=\u0417\u0430\u043A\u0440\u0443\u0433\u043B\u0435\u043D\u0438\u0439 \u043F\u0440\u044F\u043C\u043E\u043A\u0443\u0442\u043D\u0438\u043A
+OptionPanel.ru=\u0420\u043E\u0441\u0456\u0439\u0441\u044C\u043A\u0430 / \u0420\u0443\u0441\u0441\u043A\u0438\u0439
+OptionPanel.save_folding=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0437\u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F
+OptionPanel.save_folding_if_map_is_changed=\u042F\u043A\u0449\u043E \u043A\u0430\u0440\u0442\u0443 \u0437\u043C\u0456\u043D\u0435\u043D\u043E
+OptionPanel.save_last_visited_node=\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u043F\u043E\u0437\u0438\u0446\u0456\u044E \u043D\u0430 \u043A\u0430\u0440\u0442\u0456
+OptionPanel.save_modification_times=\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438 \u0447\u0430\u0441 \u0437\u043C\u0456\u043D
+OptionPanel.script_classpath=\u0414\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u0456 \u0442\u0435\u043A\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0456\u0432 \u043A\u043B\u0430\u0441\u0456\u0432 \u0456 JAR-\u0444\u0430\u0439\u043B\u0456\u0432 (\u0434\u0438\u0432. \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0443)
+OptionPanel.script_classpath.tooltip=<html>\u0421\u043F\u0438\u0441\u043E\u043A JAR-\u0444\u0430\u0439\u043B\u0456\u0432 \u0456 \u0442\u0435\u043A \u0441\u043A\u0440\u0438\u043F\u0442\u0456\u0432 \u043A\u043B\u0430\u0441\u0456\u0432 \u0456 \u0444\u043E\u0440\u043C\u0443\u043B.<br>\u0414\u043B\u044F \u0440\u043E\u0437\u0434\u0456\u043B\u0435\u043D\u043D\u044F \u0437\u0430\u043F\u0438\u0441\u0456\u0432 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0439\u0442\u0435\u0441\u044C ; (Windows) \u0 [...]
+OptionPanel.script_compilation_disabled_extensions=\u0420\u043E\u0437\u0448\u0438\u0440\u0435\u043D\u043D\u044F \u0444\u0430\u0439\u043B\u0456\u0432, \u044F\u043A\u0456 \u043D\u0435 \u043A\u043E\u043C\u043F\u0456\u043B\u044E\u044E\u0442\u044C\u0441\u044F (\u0434\u0438\u0432. \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0443)
+OptionPanel.script_compilation_disabled_extensions.tooltip=<html>\u042F\u043A\u0449\u043E \u0432\u0441\u0456 \u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0434\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u043E \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E\u044E \u043C\u043E\u0432\u043E\u044E (\u0437\u0430 \u0432\u0438\u043D\u044F\u0442\u043A\u043E\u043C<br>Groovy \u0442\u0430 JavaScript) \u0432\u0438\u043A\u043B\u0438\u043A\u0430\u044E\u0442\u044C \u043F\u0440\u043E\u04 [...]
+OptionPanel.script_directories=\u0428\u043B\u044F\u0445\u0438 \u043F\u043E\u0448\u0443\u043A\u0443 \u0441\u043A\u0440\u0438\u043F\u0442\u0456\u0432 (\u0434\u0438\u0432. \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0443)
+OptionPanel.script_directories.tooltip=<html>C\u043F\u0438\u0441\u043E\u043A \u0442\u0435\u043A (\u0434\u043B\u044F \u0434\u043E\u0434\u0430\u0442\u043A\u043E\u0432\u0438\u0445 \u0441\u043A\u0440\u0438\u043F\u0442\u0456\u0432).<br>\u0414\u043B\u044F \u0440\u043E\u0437\u0434\u0456\u043B\u0435\u043D\u043D\u044F \u0437\u0430\u043F\u0438\u0441\u0456\u0432 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0439\u0442\u0435 ; (Windows) \u0430\u0431\u043E : (Linux, Mac).<br>\u0 [...]
+OptionPanel.script_user_key_name_for_signing=\u041D\u0435\u043E\u0431\u043E\u0432'\u044F\u0437\u043A\u043E\u0432\u0438\u0439 \u043F\u0441\u0435\u0432\u0434\u043E\u043D\u0456\u043C \u043A\u043B\u044E\u0447\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430 \u0434\u043B\u044F \u043F\u0456\u0434\u043F\u0438\u0441\u0443
+OptionPanel.script_user_key_name_for_signing.tooltip=<html>\u042F\u043A\u0449\u043E \u0432\u0438 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u043F\u043E\u0437\u043D\u0430\u0447\u0438\u0442\u0438 \u0441\u0432\u043E\u0457 \u0441\u043A\u0440\u0438\u043F\u0442\u0438, \u0432\u0432\u0435\u0434\u0456\u0442\u044C \u043F\u0441\u0435\u0432\u0434\u043E\u043D\u0456\u043C \u043A\u043B\u044E\u0447\u0430 \u0442\u0443\u0442. <br>\u041E\u0447\u0456\u043A\u0443\u0454\u0442\u044C\u0441\u044F, \u0449\u043E [...]
+OptionPanel.scrollbar_increment=\u0428\u0432\u0438\u0434\u043A\u0456\u0441\u0442\u044C
+OptionPanel.scrolling_speed=\u0428\u0432\u0438\u0434\u043A\u0456\u0441\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0443\u0432\u0430\u043D\u043D\u044F \u043A\u0430\u0440\u0442\u0438
+OptionPanel.scrollOnUnfold=\u041F\u0440\u043E\u043A\u0440\u0443\u0442\u0438\u0442\u0438 \u043A\u0430\u0440\u0442\u0443 \u043F\u0456\u0441\u043B\u044F \u0440\u043E\u0437\u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F \u0432\u0443\u0437\u043B\u0430
OptionPanel.selection_method=\u041C\u0435\u0442\u043E\u0434 \u0432\u0438\u0431\u043E\u0440\u0443 \u0432\u0443\u0437\u043B\u0430
+OptionPanel.selection_method.tooltip=<html> \u0414\u0430\u043D\u0438\u043C \u043F\u0435\u0440\u0435\u043C\u0438\u043A\u0430\u0447\u0435\u043C \u043C\u043E\u0436\u043D\u0430 \u0443\u0432\u0456\u043C\u043A\u043D\u0443\u0442\u0438/\u0432\u0438\u043C\u043A\u043D\u0443\u0442\u0438 \u0437\u0430\u0442\u0440\u0438\u043C\u043A\u0443 \u0432\u0438\u0431\u043E\u0440\u0443 \u0432\u0443\u0437\u043B\u0430. \u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0438\u0439 \u043F\u0430\u0440\u0430 [...]
OptionPanel.selection_method_by_click=\u041A\u043B\u0430\u0446\u0430\u043D\u043D\u044F\u043C
OptionPanel.selection_method_delayed=\u0406\u0437 \u0437\u0430\u0442\u0440\u0438\u043C\u043A\u043E\u044E
OptionPanel.selection_method_direct=\u0412\u0456\u0434\u0440\u0430\u0437\u0443
OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName=\u0417\u0440\u0430\u0437\u043E\u043A
OptionPanel.separator.anti_alias=\u0417\u0433\u043B\u0430\u0434\u0436\u0443\u0432\u0430\u043D\u043D\u044F
+OptionPanel.separator.attributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438
OptionPanel.separator.automatic_save=\u0410\u0432\u0442\u043E\u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F
OptionPanel.separator.behaviour=\u041F\u043E\u0432\u0435\u0434\u0456\u043D\u043A\u0430
OptionPanel.separator.browser=\u041D\u0430\u0432\u0456\u0433\u0430\u0442\u043E\u0440
+OptionPanel.separator.cache=\u041A\u0435\u0448
+OptionPanel.separator.CloudControls=\u0425\u043C\u0430\u0440\u0438
OptionPanel.separator.commands_for_the_program=\u0423\u043F\u0440\u0430\u0432\u043B\u0456\u043D\u043D\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043E\u044E
-OptionPanel.separator.default_colors=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u043A\u043E\u043B\u0456\u0440
+OptionPanel.separator.connectors=\u0417'\u0454\u0434\u043D\u0443\u0432\u0430\u0447\u0456
+OptionPanel.separator.data_formats=\u0424\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0442\u0430 \u0440\u043E\u0437\u0431\u0456\u0440 \u0434\u0430\u043D\u0438\u0445
+OptionPanel.separator.default_colors=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0456 \u043A\u043E\u043B\u044C\u043E\u0440\u0438
OptionPanel.separator.default_fonts=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0448\u0440\u0438\u0444\u0442
OptionPanel.separator.default_styles=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0441\u0442\u0438\u043B\u044C
-OptionPanel.separator.EdgeControls=Edges[translate me]
-OptionPanel.separator.edit_long_node_window=\u0412\u0456\u043A\u043D\u043E \u0434\u043B\u044F \u0432\u0435\u043B\u0438\u043A\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
+OptionPanel.separator.EdgeControls=\u0420\u0435\u0431\u0440\u0430
+OptionPanel.separator.edit_long_node_window=\u0412\u0456\u043A\u043D\u043E \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u043D\u043D\u044F
+OptionPanel.separator.editing=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0430
+OptionPanel.separator.export=\u0415\u043A\u0441\u043F\u043E\u0440\u0442
OptionPanel.separator.files=\u0424\u0430\u0439\u043B\u0438
+OptionPanel.separator.formula=\u0424\u043E\u0440\u043C\u0443\u043B\u0438
+OptionPanel.separator.General=\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435
OptionPanel.separator.html_export=\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0434\u043E HTML
+OptionPanel.separator.html_import=\u0406\u043C\u043F\u043E\u0440\u0442 HTML
OptionPanel.separator.hyperlink_types=\u0422\u0438\u043F \u0433\u0456\u043F\u0435\u0440\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u0438\u0445 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C
OptionPanel.separator.icon_properties=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
+OptionPanel.separator.icons=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u0443 "\u0412\u0438\u0431\u0456\u0440 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438..."
OptionPanel.separator.initial_map_size=\u041F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0438\u0439 \u0440\u043E\u0437\u043C\u0456\u0440 \u043A\u0430\u0440\u0442\u0438
+OptionPanel.separator.inline_editor=\u041F\u0440\u043E\u0441\u0442\u0438\u0439 \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0432\u0443\u0437\u043B\u0430
+OptionPanel.separator.JoinNodesAction=\u041E\u0431'\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0443\u0437\u043B\u0456\u0432
OptionPanel.separator.key_typing=\u0412\u0432\u0456\u0434 \u0437 \u043A\u043B\u0430\u0432\u0456\u0430\u0442\u0443\u0440\u0438
OptionPanel.separator.language=\u041C\u043E\u0432\u0430
+OptionPanel.separator.latex=LaTeX
+OptionPanel.separator.load=\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438
OptionPanel.separator.look_and_feel=\u041F\u0440\u0438\u043A\u0438\u0434
+OptionPanel.separator.mouse_wheel=\u041A\u043E\u043B\u0456\u0449\u0430\u0442\u043A\u043E \u043C\u0438\u0448\u0456
OptionPanel.separator.new_node_commands=\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u0432\u0443\u0437\u043B\u0456\u0432
OptionPanel.separator.node_editing_commands=\u0417\u043C\u0456\u043D\u0430 \u0432\u0443\u0437\u043B\u0456\u0432
OptionPanel.separator.node_navigation_commands=\u041D\u0430\u0432\u0456\u0433\u0430\u0446\u0456\u044F
+OptionPanel.separator.NodeColors=\u041A\u043E\u043B\u0456\u0440 \u0432\u0441\u044C\u043E\u0433\u043E \u044F\u0434\u0440\u0430
+OptionPanel.separator.NodeFont=\u0428\u0440\u0438\u0444\u0442 \u0432\u0441\u044C\u043E\u0433\u043E \u044F\u0434\u0440\u0430
+OptionPanel.separator.NodeShape=\u0424\u043E\u0440\u043C\u0430 \u0432\u0443\u0437\u043B\u0430
+OptionPanel.separator.NodeStyle=\u0421\u0442\u0438\u043B\u044C \u0432\u0443\u0437\u043B\u0430
+OptionPanel.separator.NodeText=\u0422\u0435\u043A\u0441\u0442 \u044F\u0434\u0440\u0430
+OptionPanel.separator.notifications=\u041F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F
+OptionPanel.separator.org.freeplane.plugin.bugreport=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u0437\u0432\u0456\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0438
OptionPanel.separator.other_defaults=\u0406\u043D\u0448\u0456 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u0438
+OptionPanel.separator.others=\u0406\u043D\u0448\u0456 \u043F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448
+OptionPanel.separator.outline_view=\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0438
OptionPanel.separator.patterns=\u0417\u0440\u0430\u0437\u043E\u043A
+OptionPanel.separator.reminderOptions=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u044C
+OptionPanel.separator.RichTextEditor=\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 \u0437 \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F\u043C
+OptionPanel.separator.root_node_appearance=\u0412\u0438\u0433\u043B\u044F\u0434 \u043A\u043E\u0440\u0435\u043D\u0435\u0432\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
OptionPanel.separator.save=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438
-OptionPanel.separator.scrollbar=Scrollbar[translate me]
+OptionPanel.separator.scripting=\u0421\u043A\u0440\u0438\u043F\u0442\u0438
+OptionPanel.separator.scrollbar=\u0421\u043C\u0443\u0433\u0430 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438
+OptionPanel.separator.search=\u041F\u043E\u0448\u0443\u043A
+OptionPanel.separator.selection_colors=\u041A\u043E\u043B\u044C\u043E\u0440\u0438 \u043F\u0440\u0438 \u0432\u0438\u0431\u043E\u0440\u0456
OptionPanel.separator.selection_method=\u041C\u0435\u0442\u043E\u0434 \u0432\u0438\u0431\u043E\u0440\u0443 \u0432\u0443\u0437\u043B\u0430
-OptionPanel.sl=Sl
+OptionPanel.separator.single_instance_mode=\u041E\u0434\u0438\u043D \u043F\u0440\u0438\u043C\u0456\u0440\u043D\u0438\u043A \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438
+OptionPanel.separator.size_limits=\u041C\u0435\u0436\u0456 \u0440\u043E\u0437\u043C\u0456\u0440\u0456\u0432
+OptionPanel.separator.spelling=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u043F\u0440\u0430\u0432\u043E\u043F\u0438\u0441\u0443
+OptionPanel.separator.SplitToWordsAction=\u041F\u043E\u0434\u0456\u043B\u0438\u0442\u0438 \u0432\u0443\u0437\u043E\u043B \u043D\u0430 \u0441\u043B\u043E\u0432\u0430
+OptionPanel.separator.status=\u0420\u044F\u0434\u043E\u043A \u0441\u0442\u0430\u043D\u0443
+OptionPanel.separator.tooltip=\u0427\u0430\u0441\u043E\u0432\u0456 \u0456\u043D\u0442\u0435\u0440\u0432\u0430\u043B\u0438 \u043F\u0456\u0434\u043A\u0430\u0437\u043E\u043A
+OptionPanel.separator.undo=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+OptionPanel.separator.updates=\u041E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438
+OptionPanel.set_property_text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438
+OptionPanel.set_property_text.tooltip=\u041F\u043E\u0437\u043D\u0430\u0447\u0442\u0435, \u0449\u043E\u0431 \u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u0446\u044E \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u0456\u0441\u0442\u044C \u0441\u0442\u0438\u043B\u044E
+OptionPanel.setscript=\u0417\u043C\u0456\u043D\u0438\u0442\u0438?
+OptionPanel.setscript.tooltip=\u0421\u043A\u0440\u0438\u043F\u0442 \u043C\u043E\u0436\u043D\u0430 \u043F\u043E\u0432'\u044F\u0437\u0430\u0442\u0438 \u0437\u0456 \u0441\u0442\u0438\u043B\u0435\u043C.
+OptionPanel.shape_horizontal_margin=\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430 \u043C\u0435\u0436\u0430
+OptionPanel.shape_vertical_margin=\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0430 \u043C\u0435\u0436\u0430
+OptionPanel.sharp_bezier=\u0413\u043E\u0441\u0442\u0440\u0430 \u043A\u0440\u0438\u0432\u0430 (\u0411\u0435\u0437\u044C\u0454)
+OptionPanel.sharp_linear=\u0413\u043E\u0441\u0442\u0440\u0430 \u043F\u0440\u044F\u043C\u0430
+OptionPanel.shouldCenterSmallMaps=\u0426\u0435\u043D\u0442\u0440\u0443\u0432\u0430\u0442\u0438 \u043C\u0430\u043B\u0456 \u043A\u0430\u0440\u0442\u0438
+OptionPanel.show_icon_for_attributes=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u0434\u043B\u044F \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0456\u0432
+OptionPanel.show_less_than_N_nodes_by_default_after_load=\u0417\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0437 \u043A\u0430\u0440\u0442\u0438 \u0430\u0431\u043E \u0440\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0434\u0435\u044F\u043A\u0456 \u0432\u0443\u0437\u043B\u0438
+OptionPanel.show_node_tooltips=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0438
+OptionPanel.show_note_icons=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u0434\u043B\u044F \u043F\u0440\u0438\u043C\u0456\u0442\u043E\u043A
+OptionPanel.show_styles_in_tooltip=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u0456 \u0432\u0443\u0437\u043B\u0456\u0432 \u0443 \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0430\u0445
+OptionPanel.signed_script_are_trusted=\u0414\u043E\u0432\u0456\u0440\u044F\u0442\u0438 \u043F\u0456\u0434\u043F\u0438\u0441\u0430\u043D\u0438\u043C \u0441\u043A\u0440\u0438\u043F\u0442\u0430\u043C (\u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u043E).
+OptionPanel.signed_script_are_trusted.tooltip=\u042F\u043A\u0449\u043E \u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u043F\u0456\u0434\u043F\u0438\u0441\u0430\u043D\u043E \u0434\u043E\u0432\u0456\u0440\u0435\u043D\u0438\u043C\u0438 \u043E\u0441\u043E\u0431\u0430\u043C\u0438 (\u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434, \u0430\u0432\u0442\u043E\u0440\u0430\u043C\u0438 Freeplane \u0430\u0431\u043E \u0432\u0430\u043C\u0438), \u0432\u043E\u043D\u0438 \u0432\u0438\u043A\u043E\u043D\u [...]
+OptionPanel.simplyhtml.default_paste_mode=\u0422\u0438\u043F\u043E\u0432\u0438\u0439 \u0440\u0435\u0436\u0438\u043C \u0432\u0441\u0442\u0430\u0432\u043A\u0438
+OptionPanel.single_backup_directory=\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0454\u0434\u0438\u043D\u0443 \u0442\u0435\u043A\u0443 \u0434\u043B\u044F \u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0438\u0445 \u0444\u0430\u0439\u043B\u0456\u0432
+OptionPanel.single_backup_directory.tooltip=<html> \u042F\u043A\u0449\u043E \u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0456 \u0442\u0430 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E \u0444\u0430\u0439\u043B\u0438 \u0441\u043B\u0456\u0434 \u0440\u043E\u0437\u043C\u0456\u0449\u0443\u0432\u0430\u0442\u0438 \u0432 \u0454\u0434\u0438\u043D\u0456\u0439 \u0442\u0435\u0446\u0456, \u0430 \u043D\u0435 \u0432 \u043F\u0456 [...]
+OptionPanel.single_backup_directory_path=\u0420\u0435\u0437\u0435\u0440\u0432\u043D\u0430 \u0442\u0435\u043A\u0430 (\u044F\u043A\u0449\u043E \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0456\u0439 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0432\u0438\u0431\u0440\u0430\u043D\u043E)
+OptionPanel.single_backup_directory_path.tooltip=<html>\u041F\u0435\u0440\u0435\u043A\u0440\u0438\u0432\u0430\u0454 \u0442\u0438\u043F\u043E\u0432\u0443 <freeplaneuserdir>/.backup</html>
+OptionPanel.single_instance=\u0412\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0442\u0438 \u0444\u0430\u0439\u043B\u0438 \u0432 \u0437\u0430\u043F\u0443\u0449\u0435\u043D\u043E\u043C\u0443 \u043F\u0440\u0438\u043C\u0456\u0440\u043D\u0438\u043A\u0443
+OptionPanel.single_instance_force=\u0417\u0430\u0432\u0436\u0434\u0438 \u0443\u043D\u0438\u043A\u0430\u0442\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 \u0434\u0440\u0443\u0433\u043E\u0433\u043E \u043F\u0440\u0438\u043C\u0456\u0440\u043D\u0438\u043A\u0430
+OptionPanel.single_instance_force.tooltip=\u0423\u043D\u0438\u043A\u0430\u0442\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0443 \u0434\u0440\u0443\u0433\u043E\u0433\u043E \u043F\u0440\u0438\u043C\u0456\u0440\u043D\u0438\u043A\u0430, \u043D\u0430\u0432\u0456\u0442\u044C \u044F\u043A\u0449\u043E \u043D\u0435\u043C\u0430\u0454 \u0444\u0430\u0439\u043B\u0443 \u0434\u043B\u044F \u0432\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u043D\u043D\u044F
+OptionPanel.sk=\u0421\u043B\u043E\u0432\u0430\u0446\u044C\u043A\u0430 / sloven\u010Dina
+OptionPanel.sl=\u0421\u043B\u043E\u0432\u0435\u043D\u0441\u044C\u043A\u0430 / sloven\u0161\u010Dina
+OptionPanel.slow_scroll_selected_node=\u041F\u043E\u0432\u0456\u043B\u044C\u043D\u0435 \u043F\u0440\u043E\u043A\u0440\u0443\u0447\u0443\u0432\u0430\u043D\u043D\u044F \u0434\u043E \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+OptionPanel.small_bubble=\u041C\u0430\u043B\u0430 \u0431\u0443\u043B\u044C\u0431\u0430\u0448\u043A\u0430
+OptionPanel.small_wide_hexagon=\u041C\u0430\u043B\u0438\u0439 \u0448\u0435\u0441\u0442\u0438\u043A\u0443\u0442\u043D\u0438\u043A
+OptionPanel.spelling_opt_case_sensitive=\u0427\u0443\u0442\u043B\u0438\u0432\u0456\u0441\u0442\u044C \u0434\u043E \u0440\u0435\u0433\u0456\u0441\u0442\u0440\u0443
+OptionPanel.spelling_opt_ignore_all_caps_words=\u0417\u043D\u0435\u0445\u0442\u0443\u0432\u0430\u0442\u0438 \u0441\u043B\u043E\u0432\u0430\u043C\u0438 \u0437 \u0432\u0435\u043B\u0438\u043A\u0438\u0445 \u043B\u0456\u0442\u0435\u0440.
+OptionPanel.spelling_opt_ignore_capitalization=\u0417\u043D\u0435\u0445\u0442\u0443\u0432\u0430\u0442\u0438 \u0432\u0435\u043B\u0438\u043A\u0438\u043C\u0438 \u043B\u0456\u0442\u0435\u0440\u0430\u043C\u0438 \u043D\u0430 \u043F\u043E\u0447\u0430\u0442\u043A\u0443 \u0441\u043B\u043E\u0432\u0430
+OptionPanel.spelling_opt_ignore_words_with_numbers=\u0417\u043D\u0435\u0445\u0442\u0443\u0432\u0430\u0442\u0438 \u0441\u043B\u043E\u0432\u0430\u043C\u0438 \u0437 \u0446\u0438\u0444\u0440\u0430\u043C\u0438
+OptionPanel.spelling_opt_suggestions_limit_dialog=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u043F\u043E\u0437\u0438\u0446\u0456\u0439 \u0432 \u0434\u0456\u0430\u043B\u043E\u0437\u0456
+OptionPanel.spelling_opt_suggestions_limit_menu=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u043F\u0440\u043E\u043F\u043E\u0437\u0438\u0446\u0456\u0439 \u0443 \u043C\u0435\u043D\u044E
+OptionPanel.SplitToWordsAction.auxiliaryWordList=\u0441\u043F\u0438\u0441\u043E\u043A \u0434\u043E\u043F\u043E\u043C\u0456\u0436\u043D\u0438\u0445 \u0441\u043B\u0456\u0432
+OptionPanel.SplitToWordsAction.charactersAcceptedInWord=\u0437\u043D\u0430\u043A\u0456\u0432 \u0443 \u0441\u043B\u043E\u0432\u0430\u0445
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=\u0437\u0430\u043B\u0438\u0448\u0438\u0442\u0438 \u043F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u043F\u043E\u0440\u043E\u0436\u043D\u0456\u043C
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=\u0447\u0438\u0441\u043B\u043E \u0432\u0443\u0437\u043B\u0456\u0432 \u0443 \u0440\u044F\u0434\u043A\u0443
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=\u0437\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0438\u0439 \u0442\u0435\u043A\u0441\u0442 \u044F\u043A \u043F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456
+OptionPanel.sr=\u0421\u0435\u0440\u0431\u0441\u044C\u043A\u0430 / \u0441\u0440\u043F\u0441\u043A\u0438
+OptionPanel.standard_template=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0444\u0430\u0439\u043B \u0448\u0430\u0431\u043B\u043E\u043D\u0443
OptionPanel.standardbackgroundcolor=\u041A\u043E\u043B\u0456\u0440 \u0444\u043E\u043D\u0443
+OptionPanel.standardbackgroundcolor.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u043A\u043E\u043B\u0456\u0440 \u0442\u043B\u0430 \u0432 \u043D\u043E\u0442\u0430\u0446\u0456\u0457 HTML </html>
OptionPanel.standardcloudcolor=\u041A\u043E\u043B\u0456\u0440 \u0445\u043C\u0430\u0440
+OptionPanel.standardcloudcolor.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u043A\u043E\u043B\u0456\u0440 \u0445\u043C\u0430\u0440\u0438 \u0432 \u043D\u043E\u0442\u0430\u0446\u0456\u0457 HTML </html>
OptionPanel.standardcloudestyle=\u0422\u0438\u043F \u0445\u043C\u0430\u0440
+OptionPanel.standardcloudestyle.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0441\u0442\u0438\u043B\u044C \u0445\u043C\u0430\u0440\u0438. </html>
+OptionPanel.standarddrawrectangleforselection=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u0432 \u0431\u0443\u043B\u044C\u0431\u0430\u0448\u043A\u0430\u0445
+OptionPanel.standarddrawrectangleforselection.tooltip=<html>\u041F\u043E\u0437\u043D\u0430\u0447\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438, \u043F\u043E\u043C\u0456\u0441\u0442\u0438\u0432\u0448\u0438 \u0432 \u0431\u0443\u043B\u044C\u0431\u0430\u0448\u043A\u0438.</html>
OptionPanel.standardlinkcolor=\u041A\u043E\u043B\u0456\u0440 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u044C
+OptionPanel.standardlinkcolor.tooltip=<html>\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u043A\u043E\u043B\u0456\u0440 \u0437\u0432'\u044F\u0437\u043A\u0443 \u0432 \u043D\u043E\u0442\u0430\u0446\u0456\u0457 HTML </html>
OptionPanel.standardlinkestyle=\u0422\u0438\u043F \u0437\u0432'\u044F\u0437\u043E\u043A
+OptionPanel.standardlinkestyle.tooltip=<html>\u0422\u0438\u043F\u043E\u0432\u0438\u0439 \u0441\u0442\u0438\u043B\u044C \u0437\u0432'\u044F\u0437\u043A\u0456\u0432. \u041D\u0430\u0440\u0430\u0437\u0456 \u043F\u0456\u0434\u0442\u0440\u0438\u043C\u0443\u0454\u0442\u044C\u0441\u044F \u043B\u0438\u0448\u0435 \u043A\u0440\u0438\u0432\u0430 \u0411\u0435\u0437\u044C\u0454</html>
OptionPanel.standardselectednodecolor=\u041A\u043E\u043B\u0456\u0440 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
-OptionPanel.sv=Se[translate me]
+OptionPanel.standardselectednodecolor.tooltip=<html>\u0422\u0438\u043F\u043E\u0432\u0438\u0439 \u043A\u043E\u043B\u0456\u0440 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430. \u0412 HTML-\u043D\u043E\u0442\u0430\u0446\u0456\u0457 (\u0448\u0456\u0441\u0442\u043D\u0430\u0434\u0446\u044F\u0442\u043A\u043E\u0432\u0435 #RRGGBB)</html>
+OptionPanel.standardselectednoderectanglecolor=\u041A\u043E\u043B\u0456\u0440 \u0431\u0443\u043B\u044C\u0431\u0430\u0448\u043A\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+OptionPanel.standardselectednoderectanglecolor.tooltip=<html>\u041A\u043E\u043B\u0456\u0440 \u043E\u0431\u0432\u0435\u0434\u0435\u043D\u043D\u044F, \u044F\u043A\u0435 \u043F\u043E\u0437\u043D\u0430\u0447\u0430\u0454 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B. \u0412 \u043D\u043E\u0442\u0430\u0446\u0456\u0457 HTML (\u0448\u0456\u0441\u0442\u043D\u0430\u0434\u0446\u044F\u0442\u043A\u043E\u0432\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F #RRGG [...]
+OptionPanel.STAR=\u0417\u0456\u0440\u043A\u0430
+OptionPanel.structured_html_import=\u0406\u043C\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 HTML \u044F\u043A \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0443 \u0432\u0443\u0437\u043B\u0456\u0432
+OptionPanel.structured_icon_toolbar=\u0421\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u043E\u0432\u0430\u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C
+OptionPanel.summary=\u041F\u0456\u0434\u0441\u0443\u043C\u043E\u043A
+OptionPanel.sv=\u0428\u0432\u0435\u0434\u0441\u044C\u043A\u0430 / svenska
+OptionPanel.text.use_ctrl_key=\u0421\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435\u0441\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u044E '\u041F\u0440\u0438\u0437\u043D\u0430\u0447\u0438\u0442\u0438 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448' \u0437 \u043C\u0435\u043D\u044E \u0417\u0430\u0441\u043E\u0431\u0438
+OptionPanel.textalignment=\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F \u0442\u0435\u043A\u0441\u0442\u0443
OptionPanel.time_for_automatic_save=\u0406\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E\u0433\u043E \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0456\u0432
OptionPanel.time_for_automatic_save.tooltip=<html> \u041F\u0440\u043E\u043C\u0456\u0436\u043E\u043A \u0447\u0430\u0441\u0443 \u043C\u0456\u0436 \u0434\u0432\u043E\u043C\u0430 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0438\u043C\u0438 \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F\u043C\u0438 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0456\u0432 \u0432 \u043C\u0456\u043B\u0456\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445. \u0414\u0443\u0436\u043 [...]
-OptionPanel.time_for_delayed_selection=\u0427\u0430\u0441 \u0437\u0430\u0442\u0440\u0438\u043C\u043A\u0438
-OptionPanel.time_for_delayed_selection.tooltip=<html> (\u0443 \u043C\u0456\u043B\u0456\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445). 1 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u0454 \u0432\u0456\u0434\u0441\u0443\u0442\u043D\u043E\u0441\u0442\u0456 \u0437\u0430\u0442\u0440\u0438\u043C\u043A\u0438 </html>
-OptionPanel.uk_UA=uk_UA
-OptionPanel.undo_levels=\u0427\u0438\u0441\u043B\u043E \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u0439 \u0434\u043B\u044F \u0432\u0456\u0434\u043C\u0456\u043D\u0438
-OptionPanel.undo_levels.tooltip=<html> \u0412\u0438\u0437\u043D\u0430\u0447\u0430\u0454 \u0447\u0438\u0441\u043B\u043E \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u0439, \u044F\u043A\u0456 \u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0432\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438. </html>
-OptionPanel.vi=Vi[translate me]
-OptionPanel.wheel_velocity=Speed[translate me]
+OptionPanel.time_for_delayed_selection=\u0427\u0430\u0441 \u0437\u0430\u0442\u0440\u0438\u043C\u043A\u0438 \u0432\u0438\u0431\u043E\u0440\u0443
+OptionPanel.time_for_delayed_selection.tooltip=<html> \u0417\u0430\u0442\u0440\u0438\u043C\u043A\u0430 \u043F\u0435\u0440\u0435\u0434 \u0442\u0438\u043C, \u044F\u043A \u0432\u0443\u0437\u043E\u043B \u0441\u0442\u0430\u0454 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u043C \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043D\u0456 \u0432\u043A\u0430\u0437\u0456\u0432\u043D\u0438\u043A\u0430 (\u0443 \u043C\u0456\u043B\u0456\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445). 1 [...]
+OptionPanel.toolTipManager.dismissDelay=\u0422\u0440\u0438\u0432\u0430\u043B\u0456\u0441\u0442\u044C \u043F\u043E\u043A\u0430\u0437\u0443, \u043C\u0441
+OptionPanel.toolTipManager.initialDelay=\u041F\u043E\u0447\u0430\u0442\u043A\u043E\u0432\u0430 \u0437\u0430\u0442\u0440\u0438\u043C\u043A\u0430, \u043C\u0441
+OptionPanel.toolTipManager.max_tooltip_height=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u0432\u0438\u0441\u043E\u0442\u0430 \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0438 \u0432\u0443\u0437\u043B\u0430
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u0432\u0438\u0441\u043E\u0442\u0430 \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0438 \u0432 \u043F\u0456\u043A\u0441\u0435\u043B\u044F\u0445.
+OptionPanel.toolTipManager.max_tooltip_width=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0438 \u0432\u0443\u0437\u043B\u0430
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=\u041D\u0430\u0439\u0431\u0456\u043B\u044C\u0448\u0430 \u0448\u0438\u0440\u0438\u043D\u0430 \u043F\u0456\u0434\u043A\u0430\u0437\u043A\u0438 \u0443 \u043F\u0456\u043A\u0441\u0435\u043B\u044F\u0445.
+OptionPanel.toolTipManager.reshowDelay=\u0417\u0430\u0442\u0440\u0438\u043C\u043A\u0430 \u043F\u043E\u0432\u0442\u043E\u0440\u0443, \u043C\u0441
+OptionPanel.tr=\u0422\u0443\u0440\u0435\u0446\u044C\u043A\u0430 / T\u00FCrk\u00E7e
+OptionPanel.uk_UA=\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430
+OptionPanel.undefined_font=\u041D\u0435\u0432\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0448\u0440\u0438\u0444\u0442
+OptionPanel.undo_levels=\u0427\u0438\u0441\u043B\u043E \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u0439 \u0434\u043B\u044F \u0441\u043A\u0430\u0441\u0443\u0432\u0430\u043D\u043D\u044F
+OptionPanel.undo_levels.tooltip=<html>\u0412\u0438\u0437\u043D\u0430\u0447\u0430\u0454 \u0447\u0438\u0441\u043B\u043E \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u0439, \u044F\u043A\u0456 \u043C\u043E\u0436\u0443\u0442\u044C \u0431\u0443\u0442\u0438 \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u0456.</html>
+OptionPanel.unfold_on_paste=\u0420\u043E\u0437\u0433\u043E\u0440\u0442\u0430\u0442\u0438 \u0432\u0443\u0437\u043E\u043B \u043F\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u043D\u043D\u0456
+OptionPanel.unfold_on_paste.tooltip=\u0420\u043E\u0437\u0433\u043E\u0440\u0442\u0430\u0442\u0438 \u0432\u0443\u0437\u043E\u043B \u043F\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043B\u044F\u043D\u043D\u0456 \u0430\u0431\u043E \u043F\u0435\u0440\u0435\u0442\u044F\u0433\u0443\u0432\u0430\u043D\u043D\u0456
+OptionPanel.use_common_out_point_for_root_node=\u0420\u0435\u0431\u0440\u0430 \u043F\u043E\u0447\u0438\u043D\u0430\u044E\u0442\u044C\u0441\u044F \u0437 \u043E\u0434\u043D\u0456\u0454\u0457 \u0442\u043E\u0447\u043A\u0438 \u043A\u043E\u0440\u0435\u043D\u0435\u0432\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+OptionPanel.use_common_out_point_for_root_node.tooltip=\u0420\u0435\u0431\u0440\u0430 \u043F\u043E\u0447\u0438\u043D\u0430\u044E\u0442\u044C\u0441\u044F \u0437 \u043E\u0434\u043D\u0456\u0454\u0457 \u0442\u043E\u0447\u043A\u0438 \u043A\u043E\u0440\u0435\u043D\u0435\u0432\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+OptionPanel.use_tabbed_pane=\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0432\u043A\u043B\u0430\u0434\u043A\u0438
+OptionPanel.use_tabbed_pane.tooltip=\u042F\u043A\u0449\u043E \u0432\u0438\u0431\u0440\u0430\u043D\u043E, \u043A\u0430\u0440\u0442\u0438 \u0431\u0443\u0434\u0443\u0442\u044C \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0456 \u043D\u0430 \u0432\u043A\u043B\u0430\u0434\u043A\u0430\u0445 (\u044F\u043A \u0443 FireFox :-) ).
+OptionPanel.user_defined_screen_resolution=\u0420\u043E\u0437\u0434\u0456\u043B\u044C\u043D\u0456\u0441\u0442\u044C \u0435\u043A\u0440\u0430\u043D\u0443, \u0437\u0430\u0434\u0430\u043D\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043C (dpi)
+OptionPanel.validate_classpath_needs_readaccess=\u0421\u043A\u0440\u0438\u043F\u0442\u0438: \u043F\u0440\u0438 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u0456 \u0448\u043B\u044F\u0445\u0443 \u0434\u043E \u043A\u043B\u0430\u0441\u0456\u0432 \u043F\u043E\u0442\u0440\u0456\u0431\u0435\u043D \u0434\u043E\u0437\u0432\u0456\u043B \u043D\u0430 \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F \u0444\u0430\u0439\u043B\u045 [...]
+OptionPanel.validate_invalid_date_format=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u0430\u0442\u0438
+OptionPanel.validate_invalid_datetime_format=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u0430\u0442\u0438-\u0447\u0430\u0441\u0443
+OptionPanel.validate_invalid_number_format=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0447\u0438\u0441\u043B\u0430
+OptionPanel.validate_write_without_read=\u0421\u043A\u0440\u0438\u043F\u0442\u0438: \u0440\u043E\u0437\u0433\u043B\u044F\u043D\u044C\u0442\u0435 \u0434\u043E\u0434\u0430\u043D\u043D\u044F \u0434\u043E\u0437\u0432\u043E\u043B\u0443 \u0447\u0438\u0442\u0430\u043D\u043D\u044F \u0444\u0430\u0439\u043B\u0443 \u0434\u043E \u0444\u0430\u0439\u043B\u0443 \u0434\u043B\u044F \u0437\u0430\u043F\u0438\u0441\u0443.
+OptionPanel.validation_error=<html><body>\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438(\u043E\u043A):<p><em>{0}</em><p>\u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0437\u043C\u0456\u043D\u0456\u0442\u044C \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0434\u043B\u044F \u0432\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044F \u043F\u043E\u043C\u0438\u043B\u043A\u0438(\u043E\u043A).</bod [...]
+OptionPanel.validation_warning=<html><body>\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u0436\u0435\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438(\u043E\u043A):<p><em>{0}</em></body></html>
+OptionPanel.vertical_child_gap=\u041F\u0440\u043E\u043C\u0456\u0436\u043E\u043A \u043C\u0456\u0436 \u043D\u0430\u0449\u0430\u0434\u043A\u0430\u043C\u0438
+OptionPanel.vertical_child_gap.tooltip=\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0438\u0439 \u043F\u0440\u043E\u043C\u0456\u0436\u043E\u043A \u043C\u0456\u0436 \u0434\u043E\u0447\u0456\u0440\u043D\u0456\u043C\u0438 \u0432\u0443\u0437\u043B\u0430\u043C\u0438
+OptionPanel.vi=\u0412'\u0454\u0442\u043D\u0430\u043C\u0441\u044C\u043A\u0430 / Ti\u1EBFng Vi\u1EC7t
+OptionPanel.wheel_velocity=\u0428\u0432\u0438\u0434\u043A\u0456\u0441\u0442\u044C
+OptionPanel.wheel_velocity.tooltip=\u0411\u0456\u043B\u044C\u0448\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0430\u0454 \u0448\u0432\u0438\u0434\u0448\u043E\u043C\u0443 \u043F\u0435\u0440\u0435\u043C\u0456\u0449\u0443\u0432\u0430\u043D\u043D\u044E \u043A\u0430\u0440\u0442\u0438 \u043A\u043E\u043B\u0456\u0449\u0430\u0442\u043A\u043E\u043C \u043C\u0438\u0448\u0456.
+OptionPanel.wide_hexagon=\u0428\u0438\u0440\u043E\u043A\u0438\u0439 \u0448\u0435\u0441\u0442\u0438\u043A\u0443\u0442\u043D\u0438\u043A
OptionPanel.windows=Windows
-OptionPanel.zh_CN=Zh CN
-OptionPanel.zh_TW=Zh
+OptionPanel.zh_CN=\u041A\u0438\u0442\u0430\u0439\u0441\u044C\u043A\u0430 \u0441\u043F\u0440\u043E\u0449\u0435\u043D\u0430 / \u7B80\u4F53\u5B57
+OptionPanel.zh_TW=\u041A\u0438\u0442\u0430\u0439\u0441\u044C\u043A\u0430 \u0442\u0440\u0430\u0434\u0438\u0446\u0456\u0439\u043D\u0430 / \u7E41\u9AD4\u5B57
+org.freeplane.plugin.bugreport.agree=\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438
+org.freeplane.plugin.bugreport.always_agree=\u041D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438 \u0437\u0430\u0432\u0436\u0434\u0438
+org.freeplane.plugin.bugreport.always_deny=\u041D\u0456\u043A\u043E\u043B\u0438 \u043D\u0435 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438
+org.freeplane.plugin.bugreport.deny=\u041D\u0435 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438
+org.freeplane.plugin.bugreport.dialog.title=\u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u0437\u0432\u0456\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0438
+org.freeplane.plugin.bugreport.freeplane_team=\u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043A\u043E\u043C\u0430\u043D\u0434\u0438 Freeplane
+org.freeplane.plugin.bugreport.lastreport=\u041E\u0442\u0440\u0438\u043C\u0430\u043D\u0438\u0439 \u0437\u0432\u0456\u0442
+org.freeplane.plugin.bugreport.never=\u041D\u0435 \u0437\u0430\u043F\u0438\u0442\u0443\u0432\u0430\u0442\u0438 \u043C\u0435\u043D\u0435 \u043F\u0440\u043E \u0434\u043E\u043F\u043E\u043C\u043E\u0433\u0443
+org.freeplane.plugin.bugreport.question=Freeplane \u043C\u0430\u0454 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0438\u0439 \u0440\u0443\u0448\u0456\u0439 \u0441\u0442\u0435\u0436\u0435\u043D\u043D\u044F \u0437\u0430 \u043F\u043E\u043C\u0438\u043B\u043A\u0430\u043C\u0438.
+org.freeplane.plugin.bugreport.report=\u041F\u043E\u0442\u043E\u0447\u043D\u0438\u0439 \u0437\u0432\u0456\u0442
+org.freeplane.plugin.bugreport.wanted_bug=\u0412\u0438\u043D\u0438\u043A\u043B\u0430 \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u044F \u043F\u043E\u043C\u0438\u043B\u043A\u0430 \u0456 \u0437\u0440\u043E\u0431\u043B\u0435\u043D\u043E \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F.
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined=\u0412\u0443\u0437\u043E\u043B {0} \u043D\u0435 \u0437\u0430\u0434\u0430\u043D\u043E
+out_of_memory=\u041D\u0435 \u0432\u0438\u0441\u0442\u0430\u0447\u0430\u0454 \u043F\u0430\u043C'\u044F\u0442\u0456.
+overwrite_keyset_question=\u041F\u0435\u0440\u0435\u0437\u0430\u043F\u0438\u0441\u0430\u0442\u0438 \u043D\u0430\u044F\u0432\u043D\u0438\u0439 \u043D\u0430\u0431\u0456\u0440?
PageAction.text=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0438...
+password_is_not_ascii=\u041F\u0430\u0440\u043E\u043B\u044C \u043D\u0435 \u0454 \u043F\u043E\u0441\u043B\u0456\u0434\u043E\u0432\u043D\u0456\u0441\u0442\u044E ASCII
PasteAction.text=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438
+PasteAttributes.text=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+PatternNewNameProperty=\u041D\u043E\u0432\u0438\u0439 \u0448\u0430\u0431\u043B\u043E\u043D
+PatternToString.backgroundColor=\u041A\u043E\u043B\u0456\u0440 \u0442\u043B\u0430
+PatternToString.Child=\u0421\u0442\u0438\u043B\u044C \u0434\u043E\u0447\u0456\u0440\u043D\u044C\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+PatternToString.color=\u041A\u043E\u043B\u0456\u0440
+PatternToString.EdgeColor=\u041A\u043E\u043B\u0456\u0440 \u0437\u0432'\u044F\u0437\u043A\u0443
PatternToString.EdgeStyle=\u0422\u0438\u043F \u043B\u0456\u043D\u0456\u0457
PatternToString.EdgeWidth=\u0422\u043E\u0432\u0449\u0438\u043D\u0430
PatternToString.FontBold=\u0416\u0438\u0440\u043D\u043E
-PatternToString.Icon=Icon[translate me]
+PatternToString.FontItalic=\u041A\u0443\u0440\u0441\u0438\u0432
+PatternToString.FontName=\u041D\u0430\u0437\u0432\u0430 \u0448\u0440\u0438\u0444\u0442\u0443
+PatternToString.Icon=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0430
+PatternToString.NodeFontSize=\u0420\u043E\u0437\u043C\u0456\u0440 \u0448\u0440\u0438\u0444\u0442\u0443
+periodic_formula={0} * n + {1}
+PeriodUnit.DAY=\u0434\u043D\u0456
+PeriodUnit.HOUR=\u0433\u043E\u0434\u0438\u043D\u0438
+PeriodUnit.MINUTE=\u0445\u0432\u0438\u043B\u0438\u043D\u0438
+PeriodUnit.MONTH=\u043C\u0456\u0441\u044F\u0446\u0456
+PeriodUnit.WEEK=\u0442\u0438\u0436\u043D\u0456
+PeriodUnit.YEAR=\u0440\u043E\u043A\u0438
+plugins/latex/LatexNodeHook.editorTitle=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0443 LaTeX
+plugins/script_filter=\u0424\u0456\u043B\u044C\u0442\u0440 \u0441\u043A\u0440\u0438\u043F\u0442\u0443 {0}
+plugins/script_filter_error={0} \u043C\u0430\u0432 \u0431\u0438 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438 \u043B\u043E\u0433\u0456\u0447\u043D\u0438\u0439 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043F\u0440\u0438 {1}, \u0430\u043B\u0435 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u0432 {2}
+plugins/script_filter_execute_error=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u043F\u0440\u0438 \u0432\u0438\u043A\u043E\u043D\u0430\u043D\u043D\u0456 {0}\u21B5\n\u0434\u043B\u044F \u0432\u0443\u0437\u043B\u0430 {1}:\u21B5\n{2}
+plugins/ScriptEditor.cancel=&\u0412\u0456\u0434\u043C\u043E\u0432\u0438\u0442\u0438\u0441\u044C \u0432\u0456\u0434 \u0437\u043C\u0456\u043D \u0456 \u0432\u0438\u0439\u0442\u0438
+plugins/ScriptEditor.exit=&\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0456 \u0432\u0438\u0439\u0442\u0438
+plugins/ScriptEditor.FORBIDDEN_ACTION=Groovy-\u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0443 Freeplane \u043E\u0431\u043C\u0435\u0436\u0435\u043D\u0456. \u0422\u0430\u043A\u0430 {0,choice,0#\u0444\u0430\u0439\u043B\u043E\u0432\u0430|1#\u043C\u0435\u0440\u0435\u0436\u0435\u0432\u0430|2#Exec} \u043E\u043F\u0435\u0440\u0430\u0446\u0456\u044F \u0437\u0430\u0431\u043E\u0440\u043E\u043D\u0435\u043D\u0430: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#\u0432\u [...]
+plugins/ScriptEditor.menu_actions=&\u0414\u0456\u0457
+plugins/ScriptEditor.new_script=\u041D\u043E\u0432\u0438\u0439 \u0441\u043A\u0440\u0438\u043F\u0442
+plugins/ScriptEditor.run=&\u0412\u0438\u043A\u043E\u043D\u0430\u0442\u0438
+plugins/ScriptEditor.sign=\u041F\u0456\u0434\u043F\u0438\u0441\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442...
+plugins/ScriptEditor/window.Result=\u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442:
+plugins/ScriptEditor/window.title=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442
+plugins/ScriptingEngine.illegalAccessToInternalAPI=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u044C\u043D\u0438\u0439 \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u0432\u043D\u0443\u0442\u0440\u0456\u0448\u043D\u044C\u043E\u0433\u043E API (\u043F\u0430\u043A\u0435\u0442 {0}). - \u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u0437\u0432\u0435\u0440\u043D\u0456\u0442\u044C\u0441\u044F \u0434\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0438 Freeplane, \u044F\u043A\u04 [...]
plugins/TimeList.xml_Created=\u0421\u0442\u0432\u043E\u0440\u0435\u043D\u0438\u0439
plugins/TimeList.xml_Date=\u0414\u0430\u0442\u0430
+plugins/TimeList.xml_Details=\u041F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456
plugins/TimeList.xml_Icons=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
plugins/TimeList.xml_Modified=\u0417\u043C\u0456\u043D\u0435\u043D\u0438\u0439
+plugins/TimeList.xml_Notes=\u041F\u0440\u0438\u043C\u0456\u0442\u043A\u0438
plugins/TimeList.xml_Text=\u0422\u0435\u043A\u0441\u0442
plugins/TimeManagement.xml_appendButton=\u041F\u0440\u0438\u043A\u0440\u0456\u043F\u0438\u0442\u0438 \u0434\u0430\u0442\u0443 \u0434\u043E \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
-plugins/TimeManagement.xml_Cancel=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438
-plugins/TimeManagement.xml_cancelButton=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438
+plugins/TimeManagement.xml_Cancel=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+plugins/TimeManagement.xml_cancelButton=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+plugins/TimeManagement.xml_closeButton=\u0417\u0430\u043A\u0440\u0438\u0442\u0438
+plugins/TimeManagement.xml_Export=\u0415\u043A\u0441\u043F\u043E\u0440\u0442\u0443\u0432\u0430\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
+plugins/TimeManagement.xml_Find=\u0417\u043D\u0430\u0439\u0442\u0438
+plugins/TimeManagement.xml_Goto=\u041F\u0435\u0440\u0435\u0439\u0442\u0438
plugins/TimeManagement.xml_hour=\u0413\u043E\u0434\u0438\u043D\u0430:
+plugins/TimeManagement.xml_menu_actions=\u0414\u0456\u0457
plugins/TimeManagement.xml_minute=\u0425\u0432\u0438\u043B\u0438\u043D\u0430:
plugins/TimeManagement.xml_reminderButton=\u041D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
-plugins/TimeManagement.xml_reminderButton_tooltip=<html> \u0423 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0439 \u0447\u0430\u0441 \u043C\u0438\u0433\u0430\u043D\u043D\u044F \u0441\u0438\u043C\u0432\u043E\u043B\u0443 \u043F\u043E\u0441\u043B\u0443\u0436\u0438\u0442\u044C \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F\u043C, - \u0442\u0456\u043B\u044C\u043A\u0438 \u044F\u043A\u0449\u043E \u0446\u044F \u043F\u0440\u043E\u0433\u0440\u0430\u043C [...]
+plugins/TimeManagement.xml_reminderButton_tooltip=<html>\u042F\u043A\u0449\u043E \u043D\u0430\u0442\u0438\u0441\u043D\u0443\u0442\u0438, \u0431\u0443\u0434\u0435 \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u043E \u0442\u0430\u0439\u043C\u0435\u0440 \u043D\u0430 \u0432\u043A\u0430\u0437\u0430\u043D\u0443 \u0434\u0430\u0442\u0443. \u0411\u043B\u0438\u043C\u0430\u043D\u043D\u044F \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438 \u043F\u0440\u0438\u0432\u0435\u04 [...]
plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html> \u0412\u0438 \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u0438\u043A\u0440\u0456\u043F\u0438\u0442\u0438 \u043B\u0438\u0448\u0435 \u043E\u0434\u043D\u0443 \u0434\u0430\u0442\u0443 \u043D\u0430 \u0432\u0443\u0437\u043E\u043B <br> \u0412\u0436\u0435 \u0437\u0430\u043F\u0430\u043C'\u044F\u0442\u0430\u043B\u043E {0,date} {0,time}, \u0412\u0438 \u0432\u0432\u043E\u0434\u0438\u0442\u0435 {1,date} {1,time}. <br><br> \u0417\u043C\u [...]
-plugins/TimeManagement.xml_reminderNode_tooltip=\u041D\u0430\u0433\u0430\u0434\u0430\u0442\u0438 {0,date} \u0432 {0,time}
-plugins/TimeManagement.xml_removeReminderButton=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
-plugins/TimeManagement.xml_removeReminderButton_tooltip=\u0412\u0456\u0434\u043C\u0456\u043D\u0430 \u0432\u0441\u0456\u0445 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u044C \u0434\u043B\u044F \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u0432\u0443\u0437\u043B\u0430
+plugins/TimeManagement.xml_reminderNode_tooltip=\u041D\u0430\u0433\u0430\u0434\u0430\u0442\u0438 {0,date} \u043E {0,time}.
+plugins/TimeManagement.xml_remindLaterButton=\u041D\u0430\u0433\u0430\u0434\u0430\u0442\u0438 \u043F\u0456\u0437\u043D\u0456\u0448\u0435
+plugins/TimeManagement.xml_remindLaterButton_tooltip=\u041D\u0430\u0433\u0430\u0434\u0430\u0442\u0438 \u043F\u0456\u0437\u043D\u0456\u0448\u0435
+plugins/TimeManagement.xml_removeReminderButton=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
+plugins/TimeManagement.xml_removeReminderButton_tooltip=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0432\u0441\u0456 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F, \u043F\u043E\u0432'\u044F\u0437\u0430\u043D\u0456 \u0437 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u043C \u0432\u0443\u0437\u043B\u043E\u043C.
+plugins/TimeManagement.xml_Replace=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438
+plugins/TimeManagement.xml_Replace_All=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u0432\u0441\u0435
+plugins/TimeManagement.xml_Replace_Selected=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0435
+plugins/TimeManagement.xml_Select=\u0412\u0438\u0431\u0440\u0430\u0442\u0438
plugins/TimeManagement.xml_todayButton=\u0421\u044C\u043E\u0433\u043E\u0434\u043D\u0456
plugins/TimeManagement.xml_WindowTitle=\u0427\u0430\u0441
+plugins/TimeManagement.xml_WindowTitle_All_Nodes=\u041F\u043E\u0448\u0443\u043A \u0456 \u0437\u0430\u043C\u0456\u043D\u0430
preferences=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438
+print_preview_title=\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434 \u0434\u0440\u0443\u043A\u0443
+PrintAction.text=\u041D\u0430\u0434\u0440\u0443\u043A\u0443\u0432\u0430\u0442\u0438 \u043A\u0430\u0440\u0442\u0443...
PrintDirectAction.text=\u041D\u0430\u0434\u0440\u0443\u043A\u0443\u0432\u0430\u0442\u0438
printing_settings=\u041C\u0430\u0441\u0448\u0442\u0430\u0431 \u0434\u0440\u0443\u043A\u0443
+PrintPreviewAction.text=\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434 \u0434\u0440\u0443\u043A\u0443...
+progress=\u041F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0430 \u043F\u043E\u0441\u0442\u0443\u043F\u0443 (%)
+PropertyAction.dialog=\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F
PropertyAction.text=\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F ...
-QuitAction.text=\u0412\u0438\u0439\u0442\u0438
+QuickFilterAction.text=\u0428\u0432\u0438\u0434\u043A\u0438\u0439 \u0444\u0456\u043B\u044C\u0442\u0440
+QuickFindAction.BACK.text=\u0417\u043D\u0430\u0439\u0442\u0438 \u043F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u0454
+QuickFindAction.FORWARD.text=\u0417\u043D\u0430\u0439\u0442\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0435
+QuickFindAllAction.text=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
+QuickHighlightAction.text=\u041F\u0456\u0434\u0441\u0432\u0456\u0442\u0438\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
+QuitAction.text=\u0412\u0438\u0439\u0442\u0438 \u0437 Freeplane
read_only=\u0422\u0456\u043B\u044C\u043A\u0438 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F
-RedoAction.text=\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438
-RedoFilterAction.text=\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438
-ReminderHookAction.text=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
-ReminderHookAction.tooltip=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
+ReadScriptError.text=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0447\u0438\u0442\u0430\u043D\u043D\u044F \u0441\u043A\u0440\u0438\u043F\u0442\u0443
+really_convert_to_current_version=<html>\u0426\u044E \u043A\u0430\u0440\u0442\u0443 \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E \u0443 Freeplane \u0441\u0442\u0430\u0440\u0456\u0448\u043E\u0457 \u0432\u0435\u0440\u0441\u0456\u0457. <br>\u041F\u0435\u0440\u0435\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0457\u0457 (\u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u043E)? <br>(\u0412 \u0456\u043D\u0448\u043E\u043C\u0443 \u0440\u0430\u0437\u0456 \u0432\u043E\u0 [...]
+really_cut_node=\u0421\u043F\u0440\u0430\u0432\u0434\u0456 \u0432\u0438\u0440\u0456\u0437\u0430\u0442\u0438 \u0432\u0443\u0437\u043B\u0438?
+really_execute_script=\u0421\u043F\u0440\u0430\u0432\u0434\u0456 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0438, \u044F\u043A\u0456 \u043C\u0456\u0441\u0442\u0438\u0442\u044C \u0446\u044F \u043A\u0430\u0440\u0442\u0430? \u0412\u043E\u043D\u0438 \u043C\u043E\u0436\u0443\u0442\u044C \u043F\u043E\u0448\u043A\u043E\u0434\u0438\u0442\u0438 \u0432\u0430\u0448 \u043A\u043E\u043C\u043F'\u044E\u0442\u0435\u0440.
+really_remove_node=\u0421\u043F\u0440\u0430\u0432\u0434\u0456 \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0432\u0443\u0437\u043E\u043B(\u0438)?
+really_remove_notes=\u0421\u043F\u0440\u0430\u0432\u0434\u0456 \u0432\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0443(\u0438)?
+ReapplyFilterAction.text=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0444\u0456\u043B\u044C\u0442\u0440 \u0449\u0435 \u0440\u0430\u0437
+red=\u0427\u0435\u0440\u0432\u043E\u043D\u0438\u0439
+RedefineStyleAction.text=\u041F\u0435\u0440\u0435\u0432\u0438\u0437\u043D\u0430\u0447\u0438\u0442\u0438 \u0441\u0442\u0438\u043B\u044C
+RedoAction.text=\u041F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438
+RedoFilterAction.text=\u041F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438 \u0434\u0456\u044E \u0444\u0456\u043B\u044C\u0442\u0440\u0443
+regular_expressions=\u0420\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u0456 \u0432\u0438\u0440\u0430\u0437\u0438
+ReminderHookAction.text=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
+ReminderHookAction.tooltip=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F \u0437 \u0432\u0443\u0437\u043B\u0430.
+reminderNotification=\u0422\u0435\u043A\u0441\u0442 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u043D\u044F
+remove_file_from_list_on_error=\u0424\u0430\u0439\u043B {0} \u043D\u0435 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u043E. \u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0439\u043E\u0433\u043E \u0437\u0456 \u0441\u043F\u0438\u0441\u043A\u0443 \u043D\u0435\u0434\u0430\u0432\u043D\u043E \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u0445 \u0444\u0430\u0439\u043B\u0456\u0432?
+remove_shortcut_question=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F?
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=\u0421\u043A\u0438\u043D\u0443\u0442\u0438 \u0440\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0456 \u0432\u0443\u0437\u043B\u0438
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=\u0414\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u0437\u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044F \u0434\u043B\u044F \u0432\u0441\u0456\u0445 \u0432\u0443\u0437\u043B\u0456\u0432
RemoveAllIconsAction.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0443\u0441\u0456 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0438
+RemoveConnectorAction.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0437'\u0454\u0434\u043D\u0443\u0432\u0430\u0447
+RemoveEncryption.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043F\u0430\u0440\u043E\u043B\u044C
+RemoveFormatAction.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442
+RemoveIcon_0_Action.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043F\u0435\u0440\u0448\u0443 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0443
RemoveIconAction.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043E\u0441\u0442\u0430\u043D\u043D\u044E \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0443
-repair_link=\u0412\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F?
+RemoveNoteAction.text=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0443
+RemoveNoteAction.tooltip=<html>\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0432\u043C\u0456\u0441\u0442 \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0438 \u0430\u0431\u043E \u0434\u0435\u043A\u0456\u043B\u044C\u043A\u0430 \u043F\u0440\u0438\u043C\u0456\u0442\u043E\u043A.</html>
+rename=&\u041F\u0435\u0440\u0435\u0439\u043C\u0435\u043D\u0443\u0432\u0430\u0442\u0438
+repair_link=\u0412\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
repair_link_question=\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F. \u0412\u0432\u0435\u0441\u0442\u0438 \u0443\u0440\u0443\u0447\u043D\u0443??
-ResetNodeLocationAction.text=\u0412\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u0432\u0438\u0445\u0456\u0434\u043D\u0443 \u043F\u043E\u0437\u0438\u0446\u0456\u044E
-save_unsaved=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043F\u043E\u0442\u043E\u0447\u043D\u0443 \u043A\u0430\u0440\u0442\u0443? :
-SaveAction.text=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438
-SaveAsAction.text=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u044F\u043A...
+replace=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438
+replace_shortcut_question=\u0426\u0435 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448 \u0437\u0430\u0440\u0430\u0437 \u043F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u0435 \u0434\u043B\u044F\n {0}.\n\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0446\u0435 \u043F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F?
+replace_shortcut_title=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F?
+ReportBugAction.text=\u041F\u043E\u0432\u0456\u0434\u043E\u043C\u0438\u0442\u0438 \u043F\u0440\u043E \u043F\u043E\u043C\u0438\u043B\u043A\u0443
+RequestFeatureAction.text=\u0417\u0430\u043F\u0438\u0442 \u043D\u043E\u0432\u0438\u0445 \u0444\u0443\u043D\u043A\u0446\u0456\u0439
+reset_to_default=\u0422\u0438\u043F\u043E\u0432\u0456
+ResetNodeLocationAction.text=\u0412\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u043F\u043E\u0437\u0438\u0446\u0456\u044E \u0432\u0443\u0437\u043B\u0430
+ResetStyleAction.text=\u0421\u043A\u0438\u043D\u0443\u0442\u0438 \u0441\u0442\u0438\u043B\u044C \u0432\u0443\u0437\u043B\u0430
+RevertAction.text=\u0412\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u0437 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0457 \u0456\u0441\u0442\u043E\u0440\u0456\u0457
+RevisionPluginAction.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u043A\u043E\u043B\u0456\u0440 \u0442\u043B\u0430 \u0434\u043B\u044F \u0432\u0438\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044C
+save=&\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438
+save_failed=\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u043F\u0438\u0441\u0430\u0442\u0438 \u043A\u0430\u0440\u0442\u0443 {0}.
+save_unsaved=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043F\u043E\u0442\u043E\u0447\u043D\u0443 \u043A\u0430\u0440\u0442\u0443?
+save_unsaved_styles=\u0417\u0430\u043F\u0438\u0441\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u0456?
+SaveAcceleratorPresetsAction.text=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043D\u0430\u0431\u0456\u0440 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u044C \u043A\u043B\u0430\u0432\u0456\u0448...
+SaveAction.text=&\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043A\u0430\u0440\u0442\u0443
+SaveAction_readonlyMsg=\u0426\u044F \u043A\u0430\u0440\u0442\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043B\u0438\u0448\u0435 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F. \u0414\u043B\u044F \u0437\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F \u0441\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0439\u0442\u0435\u0441\u044C \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u044E '\u0424\u0430\u0439\u043B->\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u04 [...]
+SaveAction_readonlyTitle=\u0421\u043F\u0440\u043E\u0431\u0430 \u0437\u0430\u043F\u0438\u0441\u0443 \u043A\u0430\u0440\u0442\u0438, \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0457 \u043B\u0438\u0448\u0435 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F
+SaveAll.text=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 &\u0432\u0441\u0456 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0456 \u043A\u0430\u0440\u0442\u0438
+SaveAll.tooltip=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0432\u0441\u0456 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0456 \u043A\u0430\u0440\u0442\u0438
+SaveAs_toReadonlyMsg={0} \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043B\u0438\u0448\u0435 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F. \u0417\u0431\u0435\u0440\u0435\u0436\u0456\u0442\u044C \u0434\u043E \u0456\u043D\u0448\u043E\u0433\u043E \u0444\u0430\u0439\u043B\u0443.
+SaveAs_toReadonlyTitle=\u0421\u043F\u0440\u043E\u0431\u0430 \u0437\u0430\u043F\u0438\u0441\u0443 \u0444\u0430\u0439\u043B\u0443, \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u043B\u0438\u0448\u0435 \u0434\u043B\u044F \u0447\u0438\u0442\u0430\u043D\u043D\u044F
+SaveAsAction.text=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u043A\u0430\u0440\u0442\u0443 \u044F\u043A...
saved=\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043E
+saving_canceled=\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u043D\u044F \u0441\u043A\u0430\u0441\u043E\u0432\u0430\u043D\u043E
+scanners_not_loaded=\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044C \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0438\u0442\u0438 \u0441\u043A\u0430\u043D\u0435\u0440\u0438; \u0444\u0430\u0439\u043B \u043F\u043E\u0448\u043A\u043E\u0434\u0436\u0435\u043D\u043E
scheme_evaluate=\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438!
+script_execution_disabled=\u0417\u0430\u043F\u0443\u0441\u043A \u0441\u043A\u0440\u0438\u043F\u0442\u0456\u0432 \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u043E, \u0434\u0438\u0432. \u0417\u0430\u0441\u043E\u0431\u0438/\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F/\u0414\u043E\u0434\u0430\u0442\u043A\u0438
+ScriptEditor.text=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442...
+ScriptEditor.tooltip=\u0414\u043E\u0437\u0432\u043E\u043B\u044F\u0454 \u0441\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u0442\u0438 \u0443 Freeplane \u0431\u0456\u043B\u044C\u0448\u0456 \u0441\u043A\u0440\u0438\u043F\u0442\u0438.
+ScriptEditorPanel.changed_cancel=\u0421\u043A\u0440\u0438\u043F\u0442 \u0437\u043C\u0456\u043D\u0435\u043D\u043E. \u0412\u0438 \u0441\u043F\u0440\u0430\u0432\u0434\u0456 \u0431\u0430\u0436\u0430\u0454\u0442\u0435 \u0432\u0456\u0434\u043C\u043E\u0432\u0438\u0442\u0438\u0441\u044F \u0432\u0456\u0434 \u0446\u0438\u0445 \u0437\u043C\u0456\u043D?
+scripting=\u0421\u043A\u0440\u0438\u043F\u0442\u0438
+scripting_api_generator_legend=\u041F\u043E\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F
+scripting_api_generator_proxy=\u041F\u0440\u043E\u043A\u0441\u0456
+scripting_api_generator_title=API \u0441\u043A\u0440\u0438\u043F\u0442\u0456\u0432
+scripting_api_generator_utilities=\u0423\u0442\u0438\u043B\u0456\u0442\u0438
+scripting_api_generator_web=\u0412\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u0438
+ScriptsRunToggleAction.ON_SELECTED_NODE.text=\u0412\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0443 \u0432\u0441\u0456\u0445 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0430\u0445
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=\u0412\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0443 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0445 \u0432\u0443\u0437\u043B\u0430\u0445, \u0440\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E
+ScriptsRunToggleAction.ON_SINGLE_NODE.text=\u0412\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u0438 \u0432 \u043E\u0434\u043D\u043E\u043C\u0443 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u043C\u0443 \u0432\u0443\u0437\u043B\u0456
select_favorites_folder=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0442\u0435\u043A\u0443, \u0432 \u044F\u043A\u0456\u0439 \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u044E\u0442\u044C\u0441\u044F \u0437\u0430\u043A\u043B\u0430\u0434\u043A\u0438
+select_file_export_to=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0444\u0430\u0439\u043B \u0434\u043B\u044F \u0435\u043A\u0441\u043F\u043E\u0440\u0442\u0443
select_folder_for_importing=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u0442\u0435\u043A\u0443 \u0434\u043B\u044F \u0456\u043C\u043F\u043E\u0440\u0442\u0443
-SelectAllAction.text=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0432\u0441\u0435
-SelectBranchAction.text=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0432\u0441\u044E \u0433\u0456\u043B\u043A\u0443
+select_icon=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0443
+select_menu_item_dialog=\u0412\u0438\u0431\u0435\u0440\u0456\u0442\u044C \u043F\u0443\u043D\u043A\u0442 \u043C\u0435\u043D\u044E
+select_menu_item_root_node=\u041C\u0435\u043D\u044E
+SelectAllAction.text=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0432\u0441\u0456 \u0432\u0438\u0434\u0438\u043C\u0456 \u0432\u0443\u0437\u043B\u0438
+SelectBranchAction.text=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0432\u0438\u0434\u0438\u043C\u0443 \u0433\u0456\u043B\u043A\u0443
+SelectedPasteAction.text=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u044F\u043A...
selection_method_by_click=\u0412\u0438\u0431\u0456\u0440 \u043E\u0434\u0438\u043D\u043E\u0447\u043D\u0438\u043C \u043A\u043B\u0430\u0446\u0430\u043D\u043D\u044F\u043C
selection_method_delayed=\u0412\u0438\u0431\u0456\u0440 \u043D\u0430\u0457\u0437\u0434\u043E\u043C \u0456\u0437 \u0437\u0430\u0442\u0440\u0438\u043C\u043A\u043E\u044E
selection_method_direct=\u0412\u0438\u0431\u0456\u0440 \u043D\u0430\u0457\u0437\u0434\u043E\u043C
-SetImageByFileChooserAction.text=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0444\u0430\u0439\u043B \u0437 \u043A\u0430\u0440\u0442\u0438\u043D\u043A\u043E\u044E
-SetLinkByFileChooserAction.text=\u0412\u043A\u0430\u0437\u0430\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F (\u0432\u0438\u0431\u0456\u0440 \u0444\u0430\u0439\u043B\u0443)
-SetLinkByTextFieldAction.text=\u0412\u043A\u0430\u0437\u0430\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F (\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u0435 \u043F\u043E\u043B\u0435)
+SelectNoteAction.text=\u041F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438 \u0437\u043C\u0456\u043D\u0443 \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0438
+SelectNoteAction.tooltip=\u041F\u0435\u0440\u0435\u043C\u0438\u043A\u0430\u043D\u043D\u044F \u043F\u0430\u043D\u0435\u043B\u0456 \u043F\u0440\u0438\u043C\u0456\u0442\u043E\u043A
+set_accelerator_on_next_click_action=\u0414\u043B\u044F \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448 \u0443\u0442\u0440\u0438\u043C\u0443\u0439\u0442\u0435 'Ctrl' \u043F\u0440\u0438 \u043A\u043B\u0430\u0446\u0430\u043D\u043D\u0456 \u043D\u0430 \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0456 \u0441\u0442\u0440\u0456\u0447\u043A\u0438 \u0430\u0431\u043E \u043C\u0435\u043D\u044E.
+SetAccelerator.dialogTitle=\u041F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u044C \u043A\u043B\u0430\u0432\u0456\u0448
+SetAccelerator.keystrokeDetected=\u041A\u043B\u0430\u0432\u0456\u0448\u0430 "{0}" \u043D\u0435 \u043F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u0430 \u0436\u043E\u0434\u043D\u043E\u043C\u0443 \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0443 \u043C\u0435\u043D\u044E.
+SetAcceleratorOnNextClickAction.text=\u041F\u0440\u0438\u0437\u043D\u0430\u0447\u0438\u0442\u0438 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448...
+SetAlwaysUnfoldedNodeFlagsAction.text=\u0417\u0430\u043B\u0438\u0448\u0438\u0442\u0438 \u0440\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0456 \u0432\u0443\u0437\u043B\u0438
+SetAlwaysUnfoldedNodeFlagsAction.tooltip=\u0417\u0430\u043F\u043E\u0431\u0456\u0433\u0430\u0454 \u0437\u0433\u043E\u0440\u0442\u0430\u043D\u043D\u044E \u0440\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438\u0445 \u0437\u0430\u0440\u0430\u0437 \u0432\u0443\u0437\u043B\u0456\u0432
+SetImageByFileChooserAction.text=\u0417\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u043D\u044F \u0437\u0430 \u0432\u0438\u0431\u043E\u0440\u043E\u043C \u0430\u0431\u043E \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F\u043C...
+SetLinkAnchorAction.text=\u0417\u0430\u0434\u0430\u0442\u0438 \u044F\u043A\u0456\u0440 \u0434\u043B\u044F \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+SetLinkAnchorAction.tooltip=<html>\u0437\u0440\u043E\u0431\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u044F\u043A\u043E\u0440\u0435\u043C \u0434\u043B\u044F \u043F\u043E\u0434\u0430\u043B\u044C\u0448\u043E\u0433\u043E<br/>\u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0438\u0445 \u0430\u0431\u043E \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u0438\u0445 \u043F\u043E\u0441\u0438 [...]
+SetLinkAnchorAction.tooltip_anchored=<html>\u0437\u0440\u043E\u0431\u0438\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0438\u0439 \u0432\u0443\u0437\u043E\u043B \u044F\u043A\u043E\u0440\u0435\u043C \u0434\u043B\u044F \u043F\u043E\u0434\u0430\u043B\u044C\u0448\u043E\u0433\u043E<br/>\u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043D\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u0438\u0445 \u0430\u0431\u043E \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u0438\u0445 \u043F\u043E\u0 [...]
+SetLinkByFileChooserAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F (\u0432\u0438\u0431\u0456\u0440 \u0444\u0430\u0439\u043B\u0443)...
+SetLinkByTextFieldAction.text=\u0414\u043E\u0434\u0430\u0442\u0438 \u0430\u0431\u043E \u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F (\u0442\u0435\u043A\u0441\u0442\u043E\u0432\u0435 \u043F\u043E\u043B\u0435)...
+SetNodeLink.text=\u0417\u0430\u0434\u0430\u0442\u0438 \u043F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F \u0432\u0443\u0437\u043B\u0430...
+SetNoteWindowPosition.bottom.text=\u0412\u043D\u0438\u0437\u0443
+SetNoteWindowPosition.left.text=\u041B\u0456\u0432\u043E\u0440\u0443\u0447
+SetNoteWindowPosition.right.text=\u041F\u0440\u0430\u0432\u043E\u0440\u0443\u0447
+SetNoteWindowPosition.top.text=\u0412\u0433\u043E\u0440\u0456
+SetShortenerStateAction.text=\u041C\u0456\u043D\u0456\u043C\u0456\u0437\u0443\u0432\u0430\u0442\u0438 \u0432\u0443\u0437\u043E\u043B
+sf_login_required=\u041F\u043E\u0442\u0440\u0456\u0431\u0435\u043D \u043B\u043E\u0433\u0456\u043D Source Forge. \u041F\u0440\u043E\u0434\u043E\u0432\u0436\u0438\u0442\u0438?
+ShowAllAttributesAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0441\u0456 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+ShowAncestorsAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u043F\u0440\u0435\u0434\u043A\u0456\u0432
+ShowAttributeDialogAction.text=\u041A\u0435\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043C\u0438...
+ShowDescendantsAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u043D\u0430\u0449\u0430\u0434\u043A\u0456\u0432
+ShowFilterToolbarAction.text=\u041F\u0430\u043D\u0435\u043B\u044C \u0444\u0456\u043B\u044C\u0442\u0440\u0443\u0432\u0430\u043D\u043D\u044F
+ShowFormatPanel.text=\u041F\u0430\u043D\u0435\u043B\u044C \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0435\u0439
+ShowFormatPanel.tooltip=\u0412\u0456\u0434\u043A\u0440\u0438\u0432\u0430\u0454 \u0432\u0456\u043A\u043D\u043E, \u0432 \u044F\u043A\u043E\u043C\u0443 \u0432\u0443\u0437\u043E\u043B \u0456 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438 \u0437\u0432'\u044F\u0437\u043A\u0456\u0432 \u043C\u043E\u0436\u0443\u0442\u044C \u0440\u0435\u0434\u0430\u0433\u0443\u0432\u0430\u0442\u0438\u0441\u044F \u043E\u0434\u043D\u043E\u0447\u0430\u0441\u043D\u043E.
+ShowHideNoteAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u043F\u0430\u043D\u0435\u043B\u044C \u043F\u0440\u0438\u043C\u0456\u0442\u043E\u043A
+ShowHideNoteAction.tooltip=\u0412\u043C\u0438\u043A\u0430\u0454 \u0430\u0431\u043E \u0432\u0438\u043C\u0438\u043A\u0430\u0454 \u043F\u0430\u043D\u0435\u043B\u044C \u043F\u0440\u0438\u043C\u0456\u0442\u043E\u043A.
+ShowNextChildAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u043E\u0433\u043E \u043D\u0430\u0449\u0430\u0434\u043A\u0430
+ShowNotesInMapAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u043F\u0440\u0438\u043C\u0456\u0442\u043A\u0438 \u043D\u0430 \u043A\u0430\u0440\u0442\u0456
+ShowSelectedAttributesAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0438
+ShowSelectionAsRectangleAction.text=\u0412\u0438\u0431\u0456\u0440 \u043F\u0440\u044F\u043C\u043E\u043A\u0443\u0442\u043D\u0438\u043A\u043E\u043C
+simplyhtml.aboutFrameTitle=\u041F\u0440\u043E \u0446\u044E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0443
+simplyhtml.aboutLabel=\u041F\u0440\u043E SimplyHTML...
+simplyhtml.alignCenter=\u0446\u0435\u043D\u0442\u0440
+simplyhtml.alignLabel=\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F:
+simplyhtml.alignLeft=\u043B\u0456\u0432\u043E\u0440\u0443\u0447
+simplyhtml.alignRight=\u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447
+simplyhtml.allCellsRangeLabel=\u0432\u0441\u0456 \u043A\u043E\u043C\u0456\u0440\u043A\u0438
+simplyhtml.allOccurrencesReplaced=\u0412\u0441\u0435 \u0432\u0438\u044F\u0432\u043B\u0435\u043D\u0435 \u0437\u0430\u043C\u0456\u043D\u0435\u043D\u043E
+simplyhtml.appendTableColLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043A\u043E\u043B\u043E\u043D\u043A\u0443
+simplyhtml.appendTableRowLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0440\u044F\u0434\u043E\u043A
+simplyhtml.applyCellAttrLabel=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0434\u043E
+simplyhtml.backgroundLabel=\u0422\u043B\u043E:
+simplyhtml.boldItalicName=\u0436\u0438\u0440\u043D\u0438\u0439 \u043A\u0443\u0440\u0441\u0438\u0432
+simplyhtml.boldName=\u0436\u0438\u0440\u043D\u0438\u0439
+simplyhtml.borderColorLabel=\u041A\u043E\u043B\u0456\u0440:
simplyhtml.borderWidthLabel=\u0422\u043E\u0432\u0449\u0438\u043D\u0430
-simplyhtml.cancelBtnName=\u0412\u0456\u0434\u043C\u0456\u043D\u0438\u0442\u0438
+simplyhtml.bottomLabel=\u0432\u043D\u0438\u0437\u0443:
+simplyhtml.cancelBtnName=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+simplyhtml.cellBorderTabLabel=\u041E\u0431\u0440\u0430\u043C\u043B\u0435\u043D\u043D\u044F
+simplyhtml.cellGenTabLabel=\u0417\u0430\u0433\u0430\u043B\u044C\u043D\u0435
+simplyhtml.cellMarginTabLabel=\u041F\u043E\u043B\u044F
+simplyhtml.cellPanelTitle=\u0424\u043E\u0440\u043C\u0430\u0442 \u043A\u043E\u043C\u0456\u0440\u043A\u0438
+simplyhtml.clearFormatLabel=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F
+simplyhtml.clearFormatTip=\u0412\u0438\u043B\u0443\u0447\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u043D\u043D\u044F
+simplyhtml.close=\u0417\u0430\u043A\u0440\u0438\u0442\u0438
+simplyhtml.closeBtnName=\u0417\u0430\u043A\u0440\u0438\u0442\u0438
+simplyhtml.colorLabel=\u041A\u043E\u043B\u0456\u0440
simplyhtml.copyLabel=\u041A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438
+simplyhtml.copyTip=\u043A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438
+simplyhtml.cTagNameHead1=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 1
+simplyhtml.cTagNameHead2=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 2
+simplyhtml.cTagNameHead3=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 3
+simplyhtml.cTagNameHead4=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 4
+simplyhtml.cTagNameHead5=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 5
+simplyhtml.cTagNameHead6=\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 6
+simplyhtml.cTagNameLink=\u041F\u043E\u0441\u0438\u043B\u0430\u043D\u043D\u044F
+simplyhtml.cTagNameOL=\u0423\u043F\u043E\u0440\u044F\u0434\u043A\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0438\u0441\u043E\u043A
+simplyhtml.cTagNamePara=\u0410\u0431\u0437\u0430\u0446
+simplyhtml.cTagNameUL=\u041D\u0435\u0432\u043F\u043E\u0440\u044F\u0434\u043A\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0438\u0441\u043E\u043A
simplyhtml.cutLabel=\u0412\u0438\u0440\u0456\u0437\u0430\u0442\u0438
+simplyhtml.cutTip=\u0432\u0438\u0440\u0456\u0437\u0430\u0442\u0438
+simplyhtml.defaultDocName=\u0411\u0435\u0437 \u043D\u0430\u0437\u0432\u0438
+simplyhtml.deleteTableColLabel=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0441\u0442\u043E\u0432\u043F\u0447\u0438\u043A
+simplyhtml.deleteTableRowLabel=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0440\u044F\u0434\u043E\u043A
+simplyhtml.docTitleQuery=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A:
+simplyhtml.docTitleTitle=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430
+simplyhtml.editLabel=\u0417\u043C\u0456\u043D\u0438\u0442\u0438
+simplyhtml.effectLabel=\u0415\u0444\u0435\u043A\u0442
+simplyhtml.familyLabel=\u0421\u0456\u043C'\u044F
+simplyhtml.findNext=\u0417\u043D\u0430\u0439\u0442\u0438 \u043D\u0430\u0441\u0442\u0443\u043F\u043D\u0435...
+simplyhtml.findReplaceDialogTitle=\u0417\u043D\u0430\u0439\u0442\u0438 \u0456 \u0437\u0430\u043C\u0456\u043D\u0438\u0442\u0438
+simplyhtml.findReplaceLabel=\u0417\u043D\u0430\u0439\u0442\u0438 \u0456 \u0437\u0430\u043C\u0456\u043D\u0438\u0442\u0438
+simplyhtml.findReplaceTip=\u0417\u043D\u0430\u0439\u0442\u0438 \u0456 \u0437\u0430\u043C\u0456\u043D\u0438\u0442\u0438
simplyhtml.fontBoldLabel=\u0416\u0438\u0440\u043D\u043E
+simplyhtml.fontBoldTip=\u043F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438 \u0436\u0438\u0440\u043D\u0438\u0439 \u0448\u0440\u0438\u0444\u0442
+simplyhtml.fontColorLabel=\u041A\u043E\u043B\u0456\u0440 \u0442\u0435\u043A\u0441\u0442\u0443
+simplyhtml.fontColorTip=\u041A\u043E\u043B\u0456\u0440 \u0442\u0435\u043A\u0441\u0442\u0443
+simplyhtml.fontDialogTitle=\u0424\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u0442\u0438 \u0448\u0440\u0438\u0444\u0442
simplyhtml.fontItalicLabel=\u041A\u0443\u0440\u0441\u0438\u0432
+simplyhtml.fontItalicTip=\u043F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438 \u043A\u0443\u0440\u0441\u0438\u0432
+simplyhtml.fontLabel=\u0428\u0440\u0438\u0444\u0442...
simplyhtml.fontTabLabel=\u0428\u0440\u0438\u0444\u0442
+simplyhtml.fontTip=\u0424\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u0442\u0438 \u0448\u0440\u0438\u0444\u0442...
simplyhtml.fontUnderlineLabel=\u041F\u0456\u0434\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F
+simplyhtml.fontUnderlineTip=\u043F\u0435\u0440\u0435\u043C\u043A\u043D\u0443\u0442\u0438 \u043F\u0456\u0434\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F
+simplyhtml.foregroundLabel=\u041F\u0435\u0440\u0435\u0434\u043D\u0456\u0439 \u043F\u043B\u0430\u043D:
+simplyhtml.formatLabel=\u0424\u043E\u0440\u043C\u0430\u0442
+simplyhtml.formatListLabel=\u0421\u043F\u0438\u0441\u043E\u043A...
+simplyhtml.formatListTip=\u0437\u043C\u0456\u043D\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0441\u043F\u0438\u0441\u043A\u0443
+simplyhtml.formatParaLabel=\u0410\u0431\u0437\u0430\u0446...
+simplyhtml.formatParaTip=\u0417\u043C\u0456\u043D\u0438\u0442\u0438 \u0444\u043E\u0440\u043C\u0430\u0442 \u0430\u0431\u0437\u0430\u0446\u0443
+simplyhtml.formatTableLabel=\u0422\u0430\u0431\u043B\u0438\u0446\u044F...
+simplyhtml.formatTableTip=\u0424\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u0442\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044E
simplyhtml.helpLabel=\u0414\u043E\u043F\u043E\u043C\u043E\u0433\u0430
+simplyhtml.htmlTabTitle=\u041A\u043E\u0434 HTML
+simplyhtml.imageFileDesc=\u0424\u0430\u0439\u043B\u0438 \u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u044C
+simplyhtml.insertTableColLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0441\u0442\u043E\u0432\u043F\u0447\u0438\u043A
+simplyhtml.insertTableLabel=\u0422\u0430\u0431\u043B\u0438\u0446\u044F...
+simplyhtml.insertTableMsg=\u0421\u043A\u0456\u043B\u044C\u043A\u0438 \u0441\u0442\u043E\u0432\u043F\u0447\u0438\u043A\u0456\u0432?
+simplyhtml.insertTableRowLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0440\u044F\u0434\u043E\u043A
+simplyhtml.insertTableTitle=\u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438\u0422\u0430\u0431\u043B\u0438\u0446\u044E
+simplyhtml.italicName=\u043A\u0443\u0440\u0441\u0438\u0432
+simplyhtml.layoutTabTitle=\u0422\u0435\u043A\u0441\u0442
+simplyhtml.leftLabel=\u043B\u0456\u0432\u043E\u0440\u0443\u0447:
+simplyhtml.listDialogTitle=\u0424\u043E\u0440\u043C\u0430\u0442\u0443\u0432\u0430\u0442\u0438 \u0441\u043F\u0438\u0441\u043E\u043A
+simplyhtml.listIndentTitle=\u0412\u0456\u0434\u0441\u0442\u0443\u043F:
+simplyhtml.listPosInside=\u0432\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0456
+simplyhtml.listPositionLabel=\u041F\u043E\u0437\u0438\u0446\u0456\u044F:
+simplyhtml.listPosOutside=\u0437\u043E\u0432\u043D\u0456
+simplyhtml.listTypeCircle=\u043A\u0440\u0443\u0433\u043B\u0438\u0439 \u043C\u0430\u0440\u043A\u0435\u0440
+simplyhtml.listTypeDecimal=1.,2.,3.,4.
+simplyhtml.listTypeDisc=\u0441\u0438\u043C\u0432\u043E\u043B \u0444\u0430\u0439\u043B\u0443 \u044F\u043A \u043C\u0430\u0440\u043A\u0435\u0440
+simplyhtml.listTypeLabel=\u0422\u0438\u043F:
+simplyhtml.listTypeLowerAlpha=a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman=i.,ii.,iii.,iv.
+simplyhtml.listTypeNone=\u043D\u0435\u043C\u0430\u0454
+simplyhtml.listTypeSquare=\u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043D\u0430 \u043F\u043E\u0437\u043D\u0430\u0447\u043A\u0430
+simplyhtml.listTypeUpperAlpha=A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman=I.,II.,III.,IV.
+simplyhtml.marginLabel=\u0417\u043E\u0432\u043D\u0456
+simplyhtml.matchApproximately=\u041F\u0440\u0438\u0431\u043B\u0438\u0437\u043D\u0430 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u0456\u0441\u0442\u044C
+simplyhtml.matchApproximately.tooltip=<html>\u0427\u0438 \u0434\u043E\u043F\u0443\u0441\u043A\u0430\u0454\u0442\u044C\u0441\u044F \u043F\u0440\u0438\u0431\u043B\u0438\u0437\u043D\u0430 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u043D\u0456\u0441\u0442\u044C,<br/>\u043D\u0430\u043F\u0440\u0438\u043A\u043B\u0430\u0434, \u043F\u0440\u0438 \u043F\u043E\u0448\u0443\u043A\u0443 '\u043F\u0456\u043D\u043A\u0430' \u0437\u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0438 \u0442\u0430\u043A\u043 [...]
+simplyhtml.matchCase=\u0412\u0440\u0430\u0445\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0433\u0456\u0441\u0442\u0440
+simplyhtml.matchCase.tooltip=\u0427\u0438 \u0441\u043B\u0456\u0434 \u043F\u0440\u0438 \u043F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u0456 \u0432\u0440\u0430\u0445\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0440\u0435\u0433\u0456\u0441\u0442\u0440.
+simplyhtml.newStyleDefaultName=\u043D\u043E\u0432\u0438\u0439 \u0441\u0442\u0438\u043B\u044C
+simplyhtml.nextTableCellLabel=\u041D\u0430\u0441\u0442\u0443\u043F\u043D\u0430 \u043A\u043E\u043C\u0456\u0440\u043A\u0430
+simplyhtml.noLineLabel=\u043D\u0435\u043C\u0430\u0454
+simplyhtml.noMoreOccurrencesFound=(\u0431\u0456\u043B\u044C\u0448\u0435) \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E
simplyhtml.okBtnName=\u0413\u0430\u0440\u0430\u0437\u0434
+simplyhtml.paddingLabel=\u0412\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0456
+simplyhtml.paraAlignCenterLabel=\u0412\u0438\u0440\u0456\u0432\u043D\u044F\u0442\u0438 \u0437\u0430 \u0446\u0435\u043D\u0442\u0440\u043E\u043C
+simplyhtml.paraAlignCenterTip=\u0412\u0438\u0440\u0456\u0432\u043D\u044F\u0442\u0438 \u0430\u0431\u0437\u0430\u0446 \u0437\u0430 \u0446\u0435\u043D\u0442\u0440\u043E\u043C
+simplyhtml.paraAlignLeftLabel=\u0412\u0438\u0440\u0456\u0432\u043D\u044F\u0442\u0438 \u043B\u0456\u0432\u043E\u0440\u0443\u0447
+simplyhtml.paraAlignLeftTip=\u0412\u0438\u0440\u0456\u0432\u043D\u044F\u0442\u0438 \u0430\u0431\u0437\u0430\u0446 \u0437\u0430 \u043B\u0456\u0432\u0438\u043C \u043A\u0440\u0430\u0454\u043C
+simplyhtml.paraAlignRightLabel=\u0412\u0438\u0440\u0456\u0432\u043D\u044F\u0442\u0438 \u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447
+simplyhtml.paraAlignRightTip=\u0412\u0438\u0440\u0456\u0432\u043D\u044F\u0442\u0438 \u0430\u0431\u0437\u0430\u0446 \u0437\u0430 \u043F\u0440\u0430\u0432\u0438\u043C \u043A\u0440\u0430\u0454\u043C
+simplyhtml.paraStyleDialogTitle=\u0421\u0442\u0438\u043B\u044C \u0430\u0431\u0437\u0430\u0446\u0443
+simplyhtml.paraTabLabel=\u0410\u0431\u0437\u0430\u0446
+simplyhtml.pasteHTMLLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 HTML
simplyhtml.pasteLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438
-simplyhtml.previewLabel=Preview[translate me]
+simplyhtml.pastePlainTextLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u044F\u043A \u043F\u0440\u043E\u0441\u0442\u0438\u0439 \u0442\u0435\u043A\u0441\u0442
+simplyhtml.pasteTip=\u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0438
+simplyhtml.plainName=\u043F\u0440\u043E\u0441\u0442\u0438\u0439
+simplyhtml.previewLabel=\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u0438
+simplyhtml.previewText=\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u0438 \u0442\u0435\u043A\u0441\u0442
+simplyhtml.prevTableCellLabel=\u041F\u043E\u043F\u0435\u0440\u0435\u0434\u043D\u044F \u043A\u043E\u043C\u0456\u0440\u043A\u0430
+simplyhtml.printLabel=\u0414\u0440\u0443\u043A...
simplyhtml.redoLabel=\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0438
+simplyhtml.redoTip=\u043F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438
+simplyhtml.replace=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438...
+simplyhtml.replaceAll=\u0412\u0441\u0435
+simplyhtml.replaceDone=\u0417\u0440\u043E\u0431\u043B\u0435\u043D\u043E
simplyhtml.replaceNo=\u041D\u0456
+simplyhtml.replaceThisQuery=\u0437\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u0446\u0435 \u0432\u0445\u043E\u0434\u0436\u0435\u043D\u043D\u044F
+simplyhtml.replaceWith=\u0417\u0430\u043C\u0456\u043D\u0438\u0442\u0438 \u043D\u0430:
simplyhtml.replaceYes=\u0422\u0430\u043A
+simplyhtml.rightLabel=\u043F\u0440\u0430\u0432\u043E\u0440\u0443\u0447:
+simplyhtml.searchDown=\u041F\u043E\u0448\u0443\u043A \u0434\u043E\u043D\u0438\u0437\u0443
+simplyhtml.searchDown.tooltip=\u041F\u043E\u0448\u0443\u043A \u0437\u0433\u043E\u0440\u0438 \u0434\u043E\u043D\u0438\u0437\u0443.
+simplyhtml.searchFromStart=\u041F\u043E\u0448\u0443\u043A \u0437 \u043F\u043E\u0447\u0430\u0442\u043A\u0443
+simplyhtml.searchFromStart.tooltip=\u0420\u043E\u0437\u043F\u043E\u0447\u0430\u0442\u0438 \u043F\u043E\u0448\u0443\u043A \u0437 \u0432\u0435\u0440\u0445\u0443, \u0430 \u043D\u0435 \u0437 \u043F\u043E\u0437\u0438\u0446\u0456\u0457 \u043A\u0443\u0440\u0441\u043E\u0440\u0430.
+simplyhtml.searchUp=\u041F\u043E\u0448\u0443\u043A \u0432\u0433\u043E\u0440\u0443
+simplyhtml.searchUp.tooltip=\u0428\u0443\u043A\u0430\u0442\u0438 \u0437\u043D\u0438\u0437\u0443 \u0432\u0433\u043E\u0440\u0443.
+simplyhtml.selectAllLabel=\u0412\u0438\u0431\u0440\u0430\u0442\u0438 \u0432\u0441\u0435
+simplyhtml.sizeLabel=\u0420\u043E\u0437\u043C\u0456\u0440
+simplyhtml.standardStyleName=\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439
+simplyhtml.strikeLabel=\u0417\u0430\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043E
simplyhtml.styleLabel=\u0421\u0442\u0438\u043B\u044C
+simplyhtml.styleNameInputText=\u041D\u0430\u0437\u0432\u0430 \u043D\u043E\u0432\u043E\u0433\u043E \u0441\u0442\u0438\u043B\u044E?
+simplyhtml.styleNameInputTitle=\u0417\u0431\u0435\u0440\u0435\u0433\u0442\u0438 \u0441\u0442\u0438\u043B\u044C
+simplyhtml.tableBgColLabel=\u041A\u043E\u043B\u0456\u0440 \u0442\u043B\u0430:
+simplyhtml.tableDialogTitle=\u0424\u043E\u0440\u043C\u0430\u0442 \u0442\u0430\u0431\u043B\u0438\u0446\u0456
+simplyhtml.tableLabel=\u0422\u0430\u0431\u043B\u0438\u0446\u044F
+simplyhtml.tablePanelTitle=\u0424\u043E\u0440\u043C\u0430\u0442 \u0442\u0430\u0431\u043B\u0438\u0446\u0456
+simplyhtml.tableWidthLabel=\u0428\u0438\u0440\u0438\u043D\u0430:
+simplyhtml.textIndentLabel=\u0412\u0456\u0434\u0441\u0442\u0443\u043F:
+simplyhtml.textToFind=\u0422\u0435\u043A\u0441\u0442 \u0434\u043B\u044F \u043F\u043E\u0448\u0443\u043A\u0443:
+simplyhtml.thisCellRangeLabel=\u0446\u044F \u043A\u043E\u043C\u0456\u0440\u043A\u0430
+simplyhtml.thisColRangeLabel=\u0446\u0435\u0439 \u0441\u0442\u043E\u0432\u043F\u0447\u0438\u043A
+simplyhtml.thisRowRangeLabel=\u0446\u0435\u0439 \u0440\u044F\u0434\u043E\u043A
+simplyhtml.toggleBulletsLabel=\u0423\u0432\u0456\u043C\u043A\u043D./\u0432\u0438\u043C\u043A\u043D.\u043C\u0430\u0440\u043A\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0438\u0441\u043E\u043A
+simplyhtml.toggleBulletsTip=\u0443\u0432\u0456\u043C\u043A\u043D./\u0432\u0438\u043C\u043A\u043D. \u043C\u0430\u0440\u043A\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0438\u0441\u043E\u043A
+simplyhtml.toggleNumbersLabel=\u0423\u0432\u0456\u043C\u043A\u043D./\u0432\u0438\u043C\u043A\u043D.\u043D\u0443\u043C\u0435\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0438\u0441\u043E\u043A
+simplyhtml.toggleNumbersTip=\u0443\u0432\u0456\u043C\u043A\u043D./\u0432\u0438\u043C\u043A\u043D. \u043D\u0443\u043C\u0435\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0438\u0441\u043E\u043A
+simplyhtml.topLabel=\u0432\u0433\u043E\u0440\u0456:
simplyhtml.uLineLabel=\u041F\u0456\u0434\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F
-split=\u0420\u043E\u0437\u0434\u0456\u043B\u0438\u0442\u0438
+simplyhtml.unableToOpenFileError=\u0424\u0430\u0439\u043B \u043D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438
+simplyhtml.unableToRedoError=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438:
+simplyhtml.unableToUndoError=\u041D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0441\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438:
+simplyhtml.undoLabel=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+simplyhtml.undoTip=\u0441\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+simplyhtml.valignBaseline=\u0431\u0430\u0437\u043E\u0432\u0430 \u043B\u0456\u043D\u0456\u044F
+simplyhtml.valignBottom=\u0437\u043D\u0438\u0437\u0443
+simplyhtml.valignLabel=\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0435 \u0432\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F:
+simplyhtml.valignMiddle=\u043F\u043E\u0441\u0435\u0440\u0435\u0434\u0438\u043D\u0456
+simplyhtml.valignTop=\u0437\u0432\u0435\u0440\u0445\u0443
+simplyhtml.wholeWordsOnly=\u041B\u0438\u0448\u0435 \u0446\u0456\u043B\u0456 \u0441\u043B\u043E\u0432\u0430
+simplyhtml.wholeWordsOnly.tooltip=\u041E\u0431\u043C\u0435\u0436\u0438\u0442\u0438 \u043F\u043E\u0448\u0443\u043A \u0446\u0456\u043B\u0438\u043C\u0438 \u0441\u043B\u043E\u0432\u0430\u043C\u0438.
+SortNodes.text=\u0423\u043F\u043E\u0440\u044F\u0434\u043A\u0443\u0432\u0430\u0442\u0438 \u043D\u0430\u0449\u0430\u0434\u043A\u0456\u0432
+SortNodes.tooltip=\u0423\u043F\u043E\u0440\u044F\u0434\u043A\u0443\u0432\u0430\u0442\u0438 \u043D\u0430\u0449\u0430\u0434\u043A\u0456\u0432 \u0432\u0443\u0437\u043B\u0430 \u0437\u0430 \u0430\u043B\u0444\u0430\u0432\u0456\u0442\u043E\u043C.
+split=(&S)\u0420\u043E\u0437\u0434\u0456\u043B\u0438\u0442\u0438
+SplitConditionAction.text=\u0420\u043E\u0437\u0434\u0456\u043B\u0438\u0442\u0438
+SplitNode.text=\u0420\u043E\u0437\u0434\u0456\u043B\u0438\u0442\u0438 \u0432\u0443\u0437\u043E\u043B
+SplitNode.tooltip=<html>\u0412\u0443\u0437\u043E\u043B \u0440\u043E\u0437\u0434\u0456\u043B\u0435\u043D\u043E</html>
+SplitToWordsAction.text=\u0420\u043E\u0437\u0431\u0438\u0442\u0438 \u043F\u043E {0} \u0441\u043B\u0456\u0432 \u0443 \u0440\u044F\u0434\u043A\u0443
+STANDARD_FORMAT=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0438\u0439
+stop_processing=\u0421\u0442\u043E\u043F
+StringFlavorHandler=\u0422\u0435\u043A\u0441\u0442 \u044F\u043A \u0434\u0435\u0440\u0435\u0432\u043E \u0432\u0443\u0437\u043B\u0456\u0432
+StructuredHtmlFlavorHandler=HTML \u044F\u043A \u0434\u0435\u0440\u0435\u0432\u043E \u0432\u0443\u0437\u043B\u0456\u0432
style=\u0421\u0442\u0438\u043B\u044C
-svg=SVG[translate me]
+style_already_exists=\u0421\u0442\u0438\u043B\u044C \u0432\u0436\u0435 \u0456\u0441\u043D\u0443\u0454.
+styledialog.cancel.text=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+styledialog.ok.text=\u0413\u0430\u0440\u0430\u0437\u0434
+styles=\u0421&\u0442\u0438\u043B\u0456
+styles.AutomaticLayout=\u0417\u0430\u0441\u0442\u043E\u0441\u0443\u0432\u0430\u0442\u0438 \u0441\u0442\u0438\u043B\u0456 \u0440\u0456\u0432\u043D\u0456\u0432
+styles.connection=\u0417\u0432'\u044F\u0437\u043E\u043A
+styles.date=\u0414\u0430\u0442\u0430
+styles.definition=\u0412\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F
+styles.description=\u041E\u043F\u0438\u0441
+styles.floating_node=\u041F\u043B\u0430\u0432\u0443\u0447\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
+styles.idea=\u0406\u0434\u0435\u044F
+styles.important=\u0412\u0430\u0436\u043B\u0438\u0432\u043E
+styles.key=\u041A\u043B\u044E\u0447
+styles.list=\u0421\u043F\u0438\u0441\u043E\u043A
+styles.needs_action=\u041F\u043E\u0442\u0440\u0456\u0431\u043D\u0430 \u0434\u0456\u044F
+styles.note=\u041F\u0440\u0438\u043C\u0456\u0442\u043A\u0430
+styles.ok=\u0413\u0430\u0440\u0430\u0437\u0434
+styles.pending=\u041E\u0447\u0456\u043A\u0443\u0432\u0430\u043D\u043D\u044F
+styles.predefined=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0456 \u0441\u0442\u0438\u043B\u0456
+styles.question=\u041F\u0438\u0442\u0430\u043D\u043D\u044F
+styles.quotation=\u0426\u0438\u0442\u0430\u0442\u0430
+styles.root_node=\u0421\u0442\u0438\u043B\u0456
+styles.subsubtopic=\u041F\u0456\u0434\u043F\u0456\u0434\u0442\u0435\u043C\u0430
+styles.subtopic=\u041F\u0456\u0434\u0442\u0435\u043C\u0430
+styles.topic=\u0422\u0435\u043C\u0430
+styles.user-defined=\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044C\u043A\u0456 \u0441\u0442\u0438\u043B\u0456
+styles.website=\u0421\u0430\u0439\u0442
+styles_background_html=\n <html>\n <head>\n </head>\n <body>\n <table width="800" style="text-align: left; vertical-align: top">\n <tr valign="top">\n <th>\n <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold">\n\u041F\u0440\u043E \u0446\u0435\u0439 \u043D\u0430\u0431\u0456\u0440 \u0441\u0442\u0438\u043B\u0456\u0432\n </div>\n <div style="text-align: left; font-weight: normal">\n <div style="margin: 3pt">\n \u0426\u [...]
+styles_menu=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0456 \u0441\u0442\u0438\u043B\u0456
+submenu_keystroke_in_use_error=\u041A\u043B\u0430\u0432\u0456\u0448\u0443 {0} \u043D\u0435 \u043C\u043E\u0436\u043D\u0430 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0442\u0438 \u0434\u043B\u044F \u043F\u0456\u0434\u043C\u0435\u043D\u044E {1}. \u041F\u0440\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u0432\u0438\u043B\u0443\u0447\u0435\u043D\u043E.
+summary_nodes=\u041F\u0456\u0434\u0441\u0443\u043C\u043A\u043E\u0432\u0456 \u0432\u0443\u0437\u043B\u0438
+summary_not_possible=\u0417 \u0432\u0438\u0431\u0440\u0430\u043D\u043E\u0433\u043E \u043D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043F\u0456\u0434\u0441\u0443\u043C\u043A\u043E\u0432\u0438\u0439 \u0432\u0443\u0437\u043E\u043B
+svg=SVG
+template_dir=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u0456 \u0448\u0430\u0431\u043B\u043E\u043D\u0438
+TextAlignAction.CENTER.text=\u0426\u0435\u043D\u0442\u0440\u043E\u0432\u0430\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442
+TextAlignAction.DEFAULT.text=\u0422\u0438\u043F\u043E\u0432\u043E
+TextAlignAction.LEFT.text=\u0422\u0435\u043A\u0441\u0442, \u0432\u0438\u0440\u0456\u0432\u043D\u044F\u043D\u0438\u0439 \u0432\u043B\u0456\u0432\u043E
+TextAlignAction.RIGHT.text=\u0422\u0435\u043A\u0441\u0442, \u0432\u0438\u0440\u0456\u0432\u043D\u044F\u043D\u0438\u0439 \u0432\u043F\u0440\u0430\u0432\u043E
+textalignment=\u0412\u0438\u0440\u0456\u0432\u043D\u044E\u0432\u0430\u043D\u043D\u044F \u0442\u0435\u043A\u0441\u0442\u0443
TimeListAction.text=\u0420\u043E\u0437\u043A\u043B\u0430\u0434...
-TimeListAction.tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0441\u0456 \u0447\u0430\u0441\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u044C \u0456\u0437 \u0437\u0432'\u044F\u0437\u0430\u043D\u0438\u043C\u0438 \u0432\u0443\u0437\u043B\u0430\u043C\u0438
+TimeListAction.tooltip=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u0432\u0441\u0456 \u0447\u0430\u0441\u0438 \u043D\u0430\u0433\u0430\u0434\u0443\u0432\u0430\u043D\u044C \u0456 \u043F\u043E\u0432'\u044F\u0437\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438.
TimeManagementAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440...
TimeManagementAction.tooltip=<html> \u041F\u043E\u043A\u0430\u0437\u0443\u0454 \u043A\u0430\u043B\u0435\u043D\u0434\u0430\u0440 \u0432\u0456\u0434 \u041A\u0430\u044F \u0422\u043E\u0434\u0442\u0435\u0440\u0430. </html>
-ToggleChildrenFoldedAction.text=\u0420\u043E\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u0438 / \u0441\u043A\u0440\u0443\u0442\u0438\u0442\u0438 \u0437\u0430\u0445\u043E\u0432\u0430\u0442\u0438 \u0434\u043E\u0447\u0456\u0440\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
-ToggleFoldedAction.text=\u0420\u043E\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u0438 / \u0441\u043A\u0440\u0443\u0442\u0438\u0442\u0438
-ToggleLeftToolbarAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 / \u0437\u0430\u0445\u043E\u0432\u0430\u0442\u0438 \u043B\u0456\u0432\u0443 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u044C
-ToggleMenubarAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 / \u0437\u0430\u0445\u043E\u0432\u0430\u0442\u0438 \u043C\u0435\u043D\u044E
-ToggleToolbarAction.text=\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 / \u0437\u0430\u0445\u043E\u0432\u0430\u0442\u0438 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u044C
-undefined_error=\u041D\u0435\u0441\u043F\u043E\u0434\u0456\u0432\u0430\u043D\u0430 \u043F\u043E\u043C\u0438\u043B\u043A\u0430. \u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u0438\u0442\u0435 \u0440\u043E\u0437\u0440\u043E\u0431\u043D\u0438\u043A\u0456\u0432 \u0447\u0435\u0440\u0435\u0437 \u0444\u043E\u0440\u0443\u043C
+TimePeriodUnits.days=\u0434\u043D\u0456\u0432
+TimePeriodUnits.hours=\u0433\u043E\u0434\u0438\u043D
+TimePeriodUnits.minutes=\u0445\u0432\u0438\u043B\u0438\u043D
+TimePeriodUnits.ms=\u043C\u0441
+TimePeriodUnits.seconds=\u0441\u0435\u043A\u0443\u043D\u0434
+TimePeriodUnits.weeks=\u0442\u0438\u0436\u043D\u0456\u0432
+ToggleChildrenFoldedAction.text=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438/\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0434\u043E\u0447\u0456\u0440\u043D\u0456 \u0432\u0443\u0437\u043B\u0438
+ToggleDetailsAction.text=\u041F\u0440\u0438\u0445\u043E\u0432\u0430\u0442\u0438 \u043F\u043E\u0434\u0440\u043E\u0431\u0438\u0446\u0456
+ToggleFBarAction.text=\u041F\u0430\u043D\u0435\u043B\u044C \u0444\u0443\u043D\u043A\u0446\u0456\u043E\u043D\u0430\u043B\u044C\u043D\u0438\u0445 \u043A\u043B\u0430\u0432\u0456\u0448
+ToggleFoldedAction.text=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438/\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438
+ToggleFullScreenAction.text=\u041F\u043E\u0432\u043D\u043E\u0435\u043A\u0440\u0430\u043D\u043D\u0438\u0439 \u0440\u0435\u0436\u0438\u043C
+ToggleLeftToolbarAction.text=\u041F\u0430\u043D\u0435\u043B\u044C \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C
+ToggleMenubarAction.text=\u0420\u044F\u0434\u043E\u043A \u043C\u0435\u043D\u044E
+ToggleScrollbarsAction.text=\u0421\u043C\u0443\u0433\u0438 \u043F\u0440\u043E\u043A\u0440\u0443\u0442\u043A\u0438
+ToggleStatusAction.text=\u041F\u043E\u043A\u0430\u0437\u0443\u0432\u0430\u0442\u0438 \u0440\u044F\u0434\u043E\u043A \u0441\u0442\u0430\u043D\u0443
+ToggleToolbarAction.text=\u041F\u0430\u043D\u0435\u043B\u044C \u0437\u0430\u0441\u043E\u0431\u0456\u0432
+toolbars=\u041F\u0430\u043D\u0435\u043B\u0456 \u0456\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u0456\u0432
+undefined_error=\u041D\u0435\u0441\u043F\u043E\u0434\u0456\u0432\u0430\u043D\u0430 \u043F\u043E\u043C\u0438\u043B\u043A\u0430. \u0411\u0443\u0434\u044C \u043B\u0430\u0441\u043A\u0430, \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u0442\u0435 \u0440\u043E\u0437\u0440\u043E\u0431\u043D\u0438\u043A\u0430\u043C.
underline=\u041F\u0456\u0434\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F
+UnderlineAction.text=\u041F\u0456\u0434\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043D\u044F
underlined=\u041F\u0456\u0434\u043A\u0440\u0435\u0441\u043B\u0435\u043D\u043E
-unfold=\u0420\u043E\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u0438
-UnfoldAllAction.text=\u0420\u043E\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u0438 \u0432\u0441\u0435
-UnfoldAllAction.tooltip=<html> \u0420\u043E\u0437\u0433\u043E\u0440\u0442\u0430\u0454 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u0456 \u0443\u0441\u0456 \u043F\u043E\u0434\u0430\u043B\u044C\u0448\u0456 \u0432\u0443\u0437\u043B\u0438 </html>
-UnfoldOneLevelAction.text=\u0420\u043E\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u0438 \u0440\u0456\u0432\u0435\u043D\u044C
-UnfoldOneLevelAction.tooltip=<html> \u0420\u043E\u0437\u0433\u043E\u0440\u0442\u0430\u0454 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u043D\u0430 \u043E\u0434\u0438\u043D \u0440\u0456\u0432\u0435\u043D\u044C </html>
-url_error=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0432 \u0430\u0434\u0440\u0435\u0441\u0456 URL
-user_defined_zoom=\u0412\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043C..
+UndoAction.text=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438
+UndoFilterAction.text=\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0434\u0456\u044E \u0444\u0456\u043B\u044C\u0442\u0440\u0443
+unfold=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438
+UnfoldAllAction.text=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0441\u0435
+UnfoldAllAction.tooltip=<html>\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u0442\u0430 \u0432\u0441\u0456\u0445 \u0457\u0445\u043D\u0456\u0445 \u043D\u0430\u0449\u0430\u0434\u043A\u0456\u0432.</html>
+UnfoldOneLevelAction.text=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0440\u0456\u0432\u0435\u043D\u044C
+UnfoldOneLevelAction.tooltip=\u0420\u043E\u0437\u0433\u043E\u0440\u043D\u0443\u0442\u0438 \u0432\u0438\u0431\u0440\u0430\u043D\u0456 \u0432\u0443\u0437\u043B\u0438 \u043D\u0430 \u043E\u0434\u0438\u043D \u0440\u0456\u0432\u0435\u043D\u044C.
+unparsedLatexPatternFormat=\u041D\u0435\u0440\u043E\u0437\u0456\u0431\u0440\u0430\u043D\u0438\u0439 LaTeX
+up=&\u0412\u0433\u043E\u0440\u0443
+UpConditionAction.text=\u0412\u0433\u043E\u0440\u0443
+update_failed=\u041E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u043E\u0441\u044C \u043D\u0435\u0432\u0434\u0430\u043B\u043E \u0437 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F\u043C {0}
+UpdateCheckAction.text=\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438 \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F
+updatecheckdialog=\u0414\u0456\u0430\u043B\u043E\u0433 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u044C
+updater.component=\u041A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442
+updater.goToDownload=\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u0434\u043E \u0437\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F
+updater.version.installed=\u0412\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0430 \u0432\u0435\u0440\u0441\u0456\u044F
+updater.version.latest=\u041E\u0441\u0442\u0430\u043D\u043D\u044F \u0432\u0435\u0440\u0441\u0456\u044F
+updater.version.noUpdateUrl=\u041D\u0435 \u0432\u043A\u0430\u0437\u0430\u043D\u0456 URL \u0434\u043B\u044F \u043E\u043D\u043E\u0432\u043B\u0435\u043D\u043D\u044F \u0430\u0431\u043E \u0434\u043E\u043C\u0430\u0448\u043D\u044F \u0441\u0442\u043E\u0440\u0456\u043D\u043A\u0430 \u0434\u043B\u044F \u0446\u044C\u043E\u0433\u043E \u0434\u043E\u0434\u0430\u0442\u043A\u0443.
+updater.version.unknown=\u043D\u0435\u0432\u0456\u0434\u043E\u043C\u043E
+updater.version.unreachable=\u041D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u0434\u0436\u0435\u0440\u0435\u043B\u043E:
+updater.viewChangelog=\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u043D\u0443\u0442\u0438 \u0436\u0443\u0440\u043D\u0430\u043B \u0437\u043C\u0456\u043D
+url_error=\u041F\u043E\u043C\u0438\u043B\u043A\u0430 \u0432 \u0430\u0434\u0440\u0435\u0441\u0456 URL!
+url_open_error=\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438 URL {0}.
+used_in_menu=\u0426\u0435 \u0441\u043F\u043E\u043B\u0443\u0447\u0435\u043D\u043D\u044F \u043A\u043B\u0430\u0432\u0456\u0448 \u043D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u043E \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0442\u0438, \u043E\u0441\u043A\u0456\u043B\u044C\u043A\u0438 \u0432\u043E\u043D\u043E \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u0434\u043B\u044F \u043C\u0435\u043D\u044E.
+UsePlainTextAction.text=\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0442\u0438 \u043F\u0440\u043E\u0441\u0442\u0438\u0439 \u0442\u0435\u043A\u0441\u0442
+user_config_folder=\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044C\u043A\u0430 \u0442\u0435\u043A\u0430 \u043A\u043E\u043D\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u0457: {0}
+user_defined_filters=\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044C\u043A\u0456 \u0444\u0456\u043B\u044C\u0442\u0440\u0438
+user_defined_scale=&\u041C\u0430\u0441\u0448\u0442\u0430\u0431, \u0437\u0430\u0434\u0430\u043D\u0438\u0439 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043C
+user_defined_zoom=\u0412\u0438\u0437\u043D\u0430\u0447\u0435\u043D\u043E \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0435\u043C
user_defined_zoom_status_bar=\u0417\u043D\u0430\u0447\u0435\u043D\u043D\u044F \u043C\u0430\u0441\u0448\u0442\u0430\u0431\u0443 \u043F\u043E \u0432\u0438\u0431\u043E\u0440\u0443 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430 \u043C\u0456\u043D\u044F\u0454\u0442\u044C\u0441\u044F \u043D\u0430 {0}%.
+user_icon=\u041A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0446\u044C\u043A\u0430 \u043F\u0456\u043A\u0442\u043E\u0433\u0440\u0430\u043C\u0430 "{0}"
+user_template_dir=\u0428\u0430\u0431\u043B\u043E\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430
user_zoom=\u041A\u043E\u0435\u0444\u0456\u0446\u0456\u0454\u043D\u0442 \u0434\u0440\u0443\u043A\u0443 (0.0 - 2.0):
+userScripts=\u0421\u043A\u0440\u0438\u043F\u0442\u0438
+value_format=\u0424\u043E\u0440\u043C\u0430\u0442 \u0437\u043D\u0430\u0447\u0435\u043D\u043D\u044F
+version_up_to_date=\u0412\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0443\u0454\u0442\u0435\u0441\u044C \u043E\u0441\u0442\u0430\u043D\u043D\u044C\u043E\u044E \u0432\u0435\u0440\u0441\u0456\u0454\u044E \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438
+view=\u0412\u0438\u0433\u043B\u044F\u0434
+ViewLayoutTypeAction.OUTLINE.text=\u041F\u0435\u0440\u0435\u0433\u043B\u044F\u0434 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0438
+web_resources=\u0412\u0435\u0431-\u0440\u0435\u0441\u0443\u0440\u0441\u0438
+WebDocuAction.text=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0456\u044F \u0432 \u0406\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u0456
+WhatsNewAction.text=\u0429\u043E \u043D\u043E\u0432\u043E\u0433\u043E \u0443 Freeplane 1.5.x
width=\u0422\u043E\u0432\u0449\u0438\u043D\u0430
+wrong_regexp=\u0423 \u0440\u0435\u0433\u0443\u043B\u044F\u0440\u043D\u043E\u043C\u0443 \u0432\u0438\u0440\u0430\u0437\u0456 "{0}" \u043F\u043E\u043C\u0438\u043B\u043A\u0430 {1}
+xslt_export.html=HTML \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442
+xslt_export.latex=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 LaTeX
+xslt_export.latexbook=\u041A\u043D\u0438\u0433\u0430 LaTeX
+xslt_export.mediawiki=Mediawiki
+xslt_export.ms_excel=Microsoft Excel 2003 XML
+xslt_export.ms_project=Microsoft Project 2003 XML
+xslt_export.ms_word=Microsoft Word 2003 XML
+xslt_export.text=\u0417\u0432\u0438\u0447\u0430\u0439\u043D\u0438\u0439 \u0442\u0435\u043A\u0441\u0442
+xslt_export_not_possible=\u0415\u043A\u0441\u043F\u043E\u0440\u0442 \u0443 \u0444\u043E\u0440\u043C\u0430\u0442 XSLT \u043D\u0435\u043C\u043E\u0436\u043B\u0438\u0432\u0438\u0439
yes=\u0422\u0430\u043A
+zoom=\u041C\u0430\u0441\u0448\u0442\u0430\u0431
ZoomInAction.text=\u041D\u0430\u0431\u043B\u0438\u0437\u0438\u0442\u0438
ZoomOutAction.text=\u0412\u0456\u0434\u0434\u0430\u043B\u0438\u0442\u0438
diff --git a/freeplane/resources/translations/Resources_zh_CN.properties b/freeplane/resources/translations/Resources_zh_CN.properties
index 94416c0..7ae44f3 100644
--- a/freeplane/resources/translations/Resources_zh_CN.properties
+++ b/freeplane/resources/translations/Resources_zh_CN.properties
@@ -1,7 +1,7 @@
-about_text=Freeplane - \u81ea\u7531\u7684\u601d\u7ef4\u5bfc\u56fe\u548c\u77e5\u8bc6\u6784\u5efa\u8f6f\u4ef6
+about_text=Freeplane - \u81EA\u7531\u7684\u601D\u7EF4\u5BFC\u56FE\u548C\u77E5\u8BC6\u6784\u5EFA\u8F6F\u4EF6
AboutAction.text=\u5173\u4E8E
-acceleratorPresets=\u9884\u7f6e\u70ed\u952e
-accelerators_loading_error=\u4e0d\u80fd\u4ece{0}\u52a0\u8f7d\u52a0\u901f\u952e
+acceleratorPresets=\u9884\u7F6E\u70ED\u952E
+accelerators_loading_error=\u4E0D\u80FD\u4ECE{0}\u52A0\u8F7D\u52A0\u901F\u952E
accessories/plugins/ApplyFormatPlugin.dialog.title=\u6539\u53D8\u8282\u70B9\u683C\u5F0F
accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=\u4FEE\u6539\u6A21\u5F0F
accessories/plugins/EncryptNode.properties_0=\u9009\u62E9\u5BC6\u7801
@@ -9,99 +9,102 @@ accessories/plugins/EncryptNode.properties_1=\u5BC6\u7801\u9519\u8BEF\u6216\u5BC
accessories/plugins/EncryptNode.properties_2=\u8F93\u5165\u5BC6\u7801:
accessories/plugins/EncryptNode.properties_3=\u518D\u6B21\u8F93\u5165\u5BC6\u7801:
accessories/plugins/EncryptNode.properties_4=\u8F93\u5165\u4F60\u7684\u5BC6\u7801.
-accessories/plugins/EncryptNode.properties_5=<html>\u8c28\u8bb0, \u52a0\u5bc6\u7684\u5f3a\u5ea6<br> \u5b8c\u5168\u53d6\u51b3\u4e8e\u5bc6\u7801\u7684\u8d28\u91cf.
-accessories/plugins/EncryptNode.properties_6=\u786e\u5b9a
+accessories/plugins/EncryptNode.properties_5=<html>\u8C28\u8BB0, \u52A0\u5BC6\u7684\u5F3A\u5EA6<br> \u5B8C\u5168\u53D6\u51B3\u4E8E\u5BC6\u7801\u7684\u8D28\u91CF.
+accessories/plugins/EncryptNode.properties_6=\u786E\u5B9A
accessories/plugins/EncryptNode.properties_7=\u53D6\u6D88
accessories/plugins/EncryptNode.properties_insert_encrypted_node_first=\u53EA\u80FD\u5207\u6362\u52A0\u5BC6\u8282\u70B9\u7684\u52A0\u5BC6\u72B6\u6001. \u4F7F\u7528\u5DE5\u5177\u83DC\u5355\u63D2\u5165\u52A0\u5BC6\u8282\u70B9.
accessories/plugins/EncryptNode.properties_select_me=\u9009\u4E2D\u4EE5\u7EE7\u7EED!
accessories/plugins/EncryptNode.properties_wrong_password=\u5BC6\u7801\u9519\u8BEF.
accessories/plugins/ExportWithTWiki.text=\u5BFC\u51FA\u4E3ATWiki...
accessories/plugins/ExportWithTWiki.tooltip=\u5C06\u601D\u7EF4\u5BFC\u56FE\u5BFC\u51FA\u6210 TWiki \u6587\u6863.
-accessories/plugins/ExportWithXSLT.tooltip=\u8fd9\u662f\u4e00\u79cd\u4f7f\u7528XSLT\u811a\u672c\u7684\u7edf\u4e00\u5bfc\u51fa\u65b9\u6cd5
+accessories/plugins/ExportWithXSLT.tooltip=\u8FD9\u662F\u4E00\u79CD\u4F7F\u7528XSLT\u811A\u672C\u7684\u7EDF\u4E00\u5BFC\u51FA\u65B9\u6CD5\u3002
accessories/plugins/ExportWithXSLT_Applet.text=\u5BFC\u51FA\u4E3A Java Applet...
-accessories/plugins/ExportWithXSLT_Applet.tooltip=\u5BFC\u51FA\u56FE\u4E3Ajava\u6D4F\u89C8\u5668applet
+accessories/plugins/ExportWithXSLT_Applet.tooltip=\u5BFC\u51FA\u56FE\u4E3Ajava\u6D4F\u89C8\u5668applet\u3002
accessories/plugins/ExportWithXSLT_Flash.text=\u5BFC\u51FA\u4E3AFlash...
accessories/plugins/ExportWithXSLT_Flash.tooltip=\u5BFC\u51FA\u56FE\u4E3A flash \u5E94\u7528.
-accessories/plugins/ExportWithXSLT_HTML.text=\u5bfc\u51fa\u4e3aXHTML(JavaScript\u7248)...
-accessories/plugins/ExportWithXSLT_HTML3.text=\u5bfc\u51fa\u4e3aXHTML(\u53ef\u70b9\u51fb\u7684\u6620\u5c04\u56fe\u50cf\u7248)...
+accessories/plugins/ExportWithXSLT_HTML.text=\u5BFC\u51FA\u4E3AXHTML(JavaScript\u7248)...
+accessories/plugins/ExportWithXSLT_HTML3.text=\u5BFC\u51FA\u4E3AXHTML(\u53EF\u70B9\u51FB\u7684\u6620\u5C04\u56FE\u50CF\u7248)...
accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=\u4ECE RESOURCES \u8282\u70B9\u5230 TaskJuggler \u6587\u4EF6\u7684\u8D44\u6E90...
accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>\u4ECE RESOURCES \u8282\u70B9\u5BFC\u51FA\u8D44\u6E90\u5230 Taskjuggler \u6A21\u5757. </html>
accessories/plugins/ExportWithXSLT_TASKSTJI.text=\u4EFB\u52A1\u4ECE TASKS \u8282\u70B9\u5230 TaskJuggler \u6587\u4EF6...
accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>\u5BFC\u51FA\u4EFB\u52A1\u4ECE TASKS \u8282\u70B9\u5230 Taskjuggler \u6A21\u5757. </html>
-action_keystroke_in_use_error=\u4e3a\u52a8\u4f5c{1}\u8bf7\u6c42\u7684\u6309\u952e{0}\u5df2\u7ecf\u88ab\u52a8\u4f5c{2}\u4f7f\u7528\u4e86
-active=\u6fc0\u6d3b
-actual_map_styles=\u5e94\u7528\u5bfc\u56fe\u6761\u4ef6\u6837\u5f0f
-actual_node_styles=\u4ee5in\u516c\u7528\u8282\u70b9\u6761\u4ef6\u6837\u5f0f
-add=\u6dfb\u52a0(&A)
-AddConnectorAction.text=\u6dfb\u52a0\u8fde\u63a5
-AddElementaryConditionAction.text=\u6dfb\u52a0
-AddLocalLinkAction.text=\u6dfb\u52a0\u672c\u5730\u8d85\u94fe\u63a5
-AddMenuItemLinkAction.text=\u6dfb\u52a0\u8d85\u94fe\u63a5
-AddOnDetailsPanel.authored.by=\u4f5c\u8005{0}
-AddOnDetailsPanel.header.function=\u51fd\u6570
-AddOnDetailsPanel.header.menu=\u83dc\u5355\u4f4d\u7f6e
-AddOnDetailsPanel.header.shortcut=\u5feb\u6377\u65b9\u5f0f
-AddOnDetailsPanel.homepage=\u4e3b\u9875\uff1a
-addons.installer.canceled=\u5b89\u88c5\u5df2\u53d6\u6d88
-addons.installer.confirm.licence=html><body><h1>\u8bb8\u53ef\u534f\u8bae</h1>{0}<p><p><em>\u63a5\u53d7\u8bb8\u53ef\u534f\u8bae?</em></p></body></html>
-addons.installer.failed=\u5b89\u88c5\u5931\u8d25 \uff1a{0}
-addons.installer.freeplaneversion.format.error=\u5728{0}\u5904\u6709\u683c\u5f0f\u9519\u8bef(\u503c\uff1a{1})
-addons.installer.html.script=\u811a\u672c\u53ef\u80fd\u4e0d\u662fHTML\u683c\u5f0f
-addons.installer.install=\u5b89\u88c5
-addons.installer.invalid.keyboard.shortcut=\u4e0d\u53ef\u7528\u7684\u5feb\u6377\u65b9\u5f0f {0}
-addons.installer.licence.unchanged=\u8bb8\u53ef\u6ca1\u6709\u6539\u53d8
-addons.installer.map.structure=\u5bfc\u56fe\u7ed3\u6784\u9519\u8bef: {0}
-addons.installer.missing.child.nodes=\u6ca1\u6709\u5b50\u8282\u70b9: {0}
-addons.installer.missing.permission.attribute=\u811a\u672c {0}: \u6ca1\u6709\u8bb8\u53ef\u5c5e\u6027 {1}
-addons.installer.missing.properties=\u6ca1\u6709\u5c5e\u6027: {0}
-addons.installer.missing.translation={0} \u6ca1\u6709{1}\u5730\u57df\u7684\u7ffb\u8bd1
-addons.installer.no.scripts=\u627e\u4e0d\u5230\u811a\u672c
-addons.installer.no.zipdata=\u627e\u4e0d\u5230zip\u6570\u636e
-addons.installer.nonstandard.permissions=\u8fd9\u4e2a\u811a\u672c\u8981\u6c42\u73b0\u5728\u6ca1\u6709\u88ab\u5141\u8bb8\u7684\u6743\u9650: {0} \n \u628a\u4ed6\u4eec\u52a0\u5230\u6807\u51c6\u6743\u9650\u7ec4\u4e2d\u4e48\uff1f
-addons.installer.one.child.expected={0} \u53ea\u8981\u4e00\u4e2a\u5b50\u8282\u70b9\uff0c\u4f46\u662f\u73b0\u5728\u6709{1}\u4e2a
-addons.installer.script.no.execution_mode={0} \u6ca1\u6709 "execution_mode" \u53d8\u91cf\u5b9a\u4e49
-addons.installer.script.no.menulocation={0} \u6ca1\u6709 "menuLocation" \u53d8\u91cf\u5b9a\u4e49
-addons.installer.script.no.menutitle={0} \u6ca1\u6709 "menuTitleKey" \u53d8\u91cf\u5b9a\u4e49
-addons.installer.script.no.permissions={0} \u6ca1\u6709\u6743\u9650\u5b9a\u4e49
-addons.installer.success=\u5b89\u88c5\u6210\u529f\u3002\n \u65b0\u9644\u52a0\u7ec4\u4ef6\u5c06\u4f1a\u5728\u8f6f\u4ef6\u91cd\u542f\u540e\u751f\u6548
-addons.installer.success.update=\u4ece{0}\u5230{1}\u7684\u5347\u7ea7\u6210\u529f\u3002\n\u4e00\u4e9b\u529f\u80fd\u53ef\u80fd\u53ea\u80fd\u5728\u91cd\u542f\u540e\u751f\u6548
-addons.installer.title=\u63d2\u4ef6\u5b89\u88c5\u5668
-addons.installer.too.new=\u5f53\u524d\u7684Freeplane\u7248\u672c {0} \u592a\u9ad8\u3002\u672c\u63d2\u4ef6\u6700\u9ad8\u652f\u6301\u7248\u672c {1}.
-addons.installer.too.old=\u5f53\u524d\u7684Freeplane\u7248\u672c {0} \u592a\u4f4e\u3002\u672c\u63d2\u4ef6\u9700\u6c42\u6700\u4f4e\u7248\u672c {1}.
-addons.installer.unknown.deinstallation.rules=\u672a\u77e5\u7684\u5378\u8f7d\u89c4\u5219 {0}
-addons.installer.update=\u4ece\u7248\u672c{0}\u66f4\u65b0
-addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">\u4f60\u5e94\u8be5\u53ea\u4ece\u4fe1\u4efb\u7684\u5730\u5740\u5b89\u88c5\u63d2\u4ef6\u3002\u6076\u610f\u7684\u63d2\u4ef6\u53ef\u80fd\u635f\u574f\u4f60\u7684\u6570\u636e\u6216\u8005\u4fb5\u72af\u4f60\u7684\u9690\u79c1</strong></body></html>
+action_keystroke_in_use_error=\u4E3A\u52A8\u4F5C{1}\u8BF7\u6C42\u7684\u6309\u952E{0}\u5DF2\u7ECF\u88AB\u52A8\u4F5C{2}\u4F7F\u7528\u4E86
+active=\u6FC0\u6D3B
+actual_map_styles=\u5E94\u7528\u5BFC\u56FE\u6761\u4EF6\u6837\u5F0F
+actual_node_styles=\u4EE5in\u516C\u7528\u8282\u70B9\u6761\u4EF6\u6837\u5F0F
+add=\u6DFB\u52A0(&A)
+AddConnectorAction.text=\u6DFB\u52A0\u8FDE\u63A5
+AddElementaryConditionAction.text=\u6DFB\u52A0
+AddExecutionLinkAction.text=\u6DFB\u52A0\u8D85\u94FE\u63A5\u6267\u884C\u64CD\u4F5C\u7CFB\u7EDF\u547D\u4EE4...
+AddLocalLinkAction.text=\u6DFB\u52A0\u672C\u5730\u8D85\u94FE\u63A5
+AddMenuItemLinkAction.text=\u6DFB\u52A0\u8D85\u94FE\u63A5\u2026
+AddOnDetailsPanel.authored.by=\u4F5C\u8005{0}
+AddOnDetailsPanel.header.function=\u51FD\u6570
+AddOnDetailsPanel.header.menu=\u83DC\u5355\u4F4D\u7F6E
+AddOnDetailsPanel.header.shortcut=\u5FEB\u6377\u65B9\u5F0F
+AddOnDetailsPanel.homepage=\u4E3B\u9875\uFF1A
+addons.installer.canceled=\u5B89\u88C5\u5DF2\u53D6\u6D88
+addons.installer.confirm.licence=html><body><h1>\u8BB8\u53EF\u534F\u8BAE</h1>{0}<p><p><em>\u63A5\u53D7\u8BB8\u53EF\u534F\u8BAE?</em></p></body></html>
+addons.installer.failed=\u5B89\u88C5\u5931\u8D25 \uFF1A{0}
+addons.installer.freeplaneversion.format.error=\u5728{0}\u5904\u6709\u683C\u5F0F\u9519\u8BEF(\u503C\uFF1A{1})
+addons.installer.html.script=\u811A\u672C\u53EF\u80FD\u4E0D\u662FHTML\u683C\u5F0F
+addons.installer.install=\u5B89\u88C5
+addons.installer.invalid.keyboard.shortcut=\u4E0D\u53EF\u7528\u7684\u5FEB\u6377\u65B9\u5F0F {0}\u3002
+addons.installer.licence.unchanged=\u8BB8\u53EF\u6CA1\u6709\u6539\u53D8
+addons.installer.map.structure=\u5BFC\u56FE\u7ED3\u6784\u9519\u8BEF: {0}
+addons.installer.missing.child.nodes=\u6CA1\u6709\u5B50\u8282\u70B9: {0}
+addons.installer.missing.permission.attribute=\u811A\u672C {0}: \u6CA1\u6709\u8BB8\u53EF\u5C5E\u6027 {1}
+addons.installer.missing.properties=\u6CA1\u6709\u5C5E\u6027: {0}
+addons.installer.missing.translation={0} \u6CA1\u6709{1}\u5730\u57DF\u7684\u7FFB\u8BD1
+addons.installer.no.scripts=\u627E\u4E0D\u5230\u811A\u672C
+addons.installer.no.zipdata=\u627E\u4E0D\u5230zip\u6570\u636E
+addons.installer.nonstandard.permissions=\u8FD9\u4E2A\u811A\u672C\u8981\u6C42\u73B0\u5728\u6CA1\u6709\u88AB\u5141\u8BB8\u7684\u6743\u9650: {0} \n \u628A\u4ED6\u4EEC\u52A0\u5230\u6807\u51C6\u6743\u9650\u7EC4\u4E2D\u4E48\uFF1F
+addons.installer.one.child.expected={0} \u53EA\u8981\u4E00\u4E2A\u5B50\u8282\u70B9\uFF0C\u4F46\u662F\u73B0\u5728\u6709{1}\u4E2A\u3002
+addons.installer.script.name.suffix=\u811A\u672C\u540D\u79F0 {0} \u6CA1\u6709\u540E\u7F00\uFF0C\u4F8B\u5982 ".groovy"
+addons.installer.script.no.execution_mode={0} \u6CA1\u6709 "execution_mode" \u53D8\u91CF\u5B9A\u4E49
+addons.installer.script.no.menulocation={0} \u6CA1\u6709 "menuLocation" \u53D8\u91CF\u5B9A\u4E49
+addons.installer.script.no.menutitle={0} \u6CA1\u6709 "menuTitleKey" \u53D8\u91CF\u5B9A\u4E49
+addons.installer.script.no.permissions={0} \u6CA1\u6709\u6743\u9650\u5B9A\u4E49
+addons.installer.success=\u5B89\u88C5\u6210\u529F\u3002\n \u65B0\u9644\u52A0\u7EC4\u4EF6\u5C06\u4F1A\u5728\u8F6F\u4EF6\u91CD\u542F\u540E\u751F\u6548\u3002
+addons.installer.success.update=\u4ECE{0}\u5230{1}\u7684\u5347\u7EA7\u6210\u529F\u3002\n\u4E00\u4E9B\u529F\u80FD\u53EF\u80FD\u53EA\u80FD\u5728\u91CD\u542F\u540E\u751F\u6548\u3002
+addons.installer.title=\u63D2\u4EF6\u5B89\u88C5\u5668
+addons.installer.too.new=\u5F53\u524D\u7684Freeplane\u7248\u672C {0} \u592A\u9AD8\u3002\u672C\u63D2\u4EF6\u6700\u9AD8\u652F\u6301\u7248\u672C {1}
+addons.installer.too.old=\u5F53\u524D\u7684Freeplane\u7248\u672C {0} \u592A\u4F4E\u3002\u672C\u63D2\u4EF6\u9700\u6C42\u6700\u4F4E\u7248\u672C {1}
+addons.installer.unknown.deinstallation.rules=\u672A\u77E5\u7684\u5378\u8F7D\u89C4\u5219 {0}
+addons.installer.update=\u4ECE\u7248\u672C{0}\u66F4\u65B0
+addons.installer.warning=<html><body><strong style="color: red; font-size: 9px">\u4F60\u5E94\u8BE5\u53EA\u4ECE\u4FE1\u4EFB\u7684\u5730\u5740\u5B89\u88C5\u63D2\u4EF6\u3002\u6076\u610F\u7684\u63D2\u4EF6\u53EF\u80FD\u635F\u574F\u4F60\u7684\u6570\u636E\u6216\u8005\u4FB5\u72AF\u4F60\u7684\u9690\u79C1</strong></body></html>
addons.site=http://freeplane.sourceforge.net/addons/
-AddStyleAttributes.text=\u6837\u5f0f\u4e2d\u7684\u5c5e\u6027
-AddStyleAttributes.tooltip=\u6dfb\u52a0\u6837\u5f0f\u8282\u70b9\u4e2d\u7684\u5c5e\u6027
-AllMapsNodeListAction.text=\u5728\u6240\u6709\u5bfc\u56fe\u4e2d\u67e5\u627e\u548c\u66ff\u6362
-always=\u603b\u662f
-AlwaysUnfoldedNodeAction.text=\u603b\u662f\u5c55\u5f00\u8282\u70b9(\u5f00\u542f/\u5173\u95ed)
+AddStyleAttributes.text=\u6837\u5F0F\u4E2D\u7684\u5C5E\u6027
+AddStyleAttributes.tooltip=\u6DFB\u52A0\u6837\u5F0F\u8282\u70B9\u4E2D\u7684\u5C5E\u6027
+AllMapsNodeListAction.text=\u5728\u6240\u6709\u5BFC\u56FE\u4E2D\u67E5\u627E\u548C\u66FF\u6362
+always=\u603B\u662F
+AlwaysUnfoldedNodeAction.text=\u603B\u662F\u5C55\u5F00\u8282\u70B9(\u5F00\u542F/\u5173\u95ED)
antialias_all=\u5E73\u6ED1\u5168\u90E8
antialias_edges=\u5E73\u6ED1\u8FDE\u7EBF
antialias_none=\u4E0D\u5E73\u6ED1
-apply=\u5e94\u7528(&A)
-ApplyAction.text=\u5e94\u7528(&A)
-ApplyFormatPlugin.text=\u6539\u53d8\u683c\u5f0f(&C)...
+apply=\u5E94\u7528(&A)
+ApplyAction.text=\u5E94\u7528(A)
+ApplyFormatPlugin.text=\u6539\u53D8\u683C\u5F0F(C)...
ApplyFormatPlugin.tooltip=\u663E\u793A\u8282\u70B9\u53CA\u8FDE\u7EBF\u5C5E\u6027\u8BBE\u5B9A\u5BF9\u8BDD\u6846.
ApplyNoFilteringAction.text=\u4E0D\u8FC7\u6EE4
-ApplySelectedViewConditionAction.text=\u8fc7\u6ee4\u9009\u4e2d\u7684\u8282\u70b9
-ApplyToVisibleAction.text=\u5e94\u7528\u5230\u8fc7\u6ee4\u7684\u8282\u70b9
+ApplySelectedViewConditionAction.text=\u8FC7\u6EE4\u9009\u4E2D\u7684\u8282\u70B9
+ApplyToVisibleAction.text=\u5E94\u7528\u5230\u8FC7\u6EE4\u7684\u8282\u70B9
as_parent=\u540C\u7236\u8282\u70B9
-AskForHelp.text=\u8bf7\u6c42\u5e2e\u52a9
-AssignAttributesAction.text=\u6307\u5b9a\u5c5e\u6027(&G)...
+AskForHelp.text=\u8BF7\u6C42\u5E2E\u52A9
+AssignAttributesAction.text=\u6307\u5B9A\u5C5E\u6027(G)...
attribute_delete=\u5220\u9664\u6240\u6709\u503C
attribute_delete_value=\u5220\u9664\u6B64\u503C
attribute_font_size_tooltip=\u5C5E\u6027\u5B57\u4F53\u5927\u5C0F
attribute_list_box_label_text=\u73B0\u5B58\u503C
-attribute_name=\u5c5e\u6027\u540d
+attribute_name=\u5C5E\u6027\u540D
+attribute_name_or_value=\u5C5E\u6027\u540D\u79F0\u6216\u503C
attribute_replace=\u66FF\u6362\u4E3A
attribute_top=\u52A0\u8F7D\u7684\u5BFC\u56FE\u4E2D\u6240\u6709\u5DF2\u77E5\u7684\u5C5E\u6027
-attribute_value=\u5c5e\u6027\u503c
-attributes_AddAttributeAction.text=\u5728\u5bf9\u8bdd\u6846\u4e2d\u6dfb\u52a0\u53d8\u91cf
+attribute_value=\u5C5E\u6027\u503C
+attributes_AddAttributeAction.text=\u5728\u5BF9\u8BDD\u6846\u4E2D\u6DFB\u52A0\u53D8\u91CF\u2026
attributes_adding_empty_attribute_error=\u5C5E\u6027\u540D\u4E0D\u80FD\u4E3A\u7A7A\u5B57\u7B26
attributes_all=\u6240\u6709\u5C5E\u6027
-attributes_assign_dialog=\u8bbe\u5b9a\u5c5e\u6027
+attributes_assign_dialog=\u8BBE\u5B9A\u5C5E\u6027
attributes_attribute=\u5C5E\u6027
attributes_close=\u5173\u95ED
attributes_deselect_all=\u5168\u90E8\u4E0D\u9009
@@ -110,7 +113,7 @@ attributes_edit=\u7F16\u8F91
attributes_edit_tooltip=\u7F16\u8F91\u8BBE\u5B9A
attributes_for_selected=\u9009\u62E9\u7684\u8282\u70B9
attributes_for_visible=\u6240\u6709\u53EF\u89C1\u7684\u8282\u70B9
-attributes_import=\u5bfc\u5165(&I)
+attributes_import=\u5BFC\u5165(&I)
attributes_import_tooltip=\u4ECE\u52A0\u8F7D\u7684\u5176\u4ED6\u5BFC\u56FE\u4E2D\u5BFC\u5165\u5C5E\u6027
attributes_no_import_candidates_found=\u672A\u53D1\u73B0\u65B0\u5C5E\u6027
attributes_popup_delete=\u5220\u9664
@@ -121,9 +124,9 @@ attributes_popup_new=\u65B0\u5C5E\u6027
attributes_popup_optimal_width=\u6700\u4F73\u5BBD\u5EA6
attributes_popup_up=\u4E0A
attributes_refresh=\u5237\u65B0
-attributes_RemoveAllAttributesAction.text=\u79fb\u9664\u6240\u6709\u5c5e\u6027
-attributes_RemoveFirstAttributeAction.text=\u6ea2\u51fa\u7b2c\u4e00\u4e2a\u5c5e\u6027
-attributes_RemoveLastAttributeAction.text=\u79fb\u9664\u6700\u540e\u4e00\u4e2a\u5c5e\u6027
+attributes_RemoveAllAttributesAction.text=\u79FB\u9664\u6240\u6709\u5C5E\u6027
+attributes_RemoveFirstAttributeAction.text=\u6EA2\u51FA\u7B2C\u4E00\u4E2A\u5C5E\u6027
+attributes_RemoveLastAttributeAction.text=\u79FB\u9664\u6700\u540E\u4E00\u4E2A\u5C5E\u6027
attributes_restricted_attributes_tooltip=\u5C5E\u6027\u7684\u53D7\u9650\u8BBE\u7F6E
attributes_restricted_values_tooltip=\u5F53\u524D\u5C5E\u6027\u7684\u53D7\u9650\u8BBE\u7F6E\u503C
attributes_restriction=\u53D7\u9650\u7684\u8BBE\u7F6E
@@ -133,139 +136,156 @@ attributes_show=\u663E\u793A
attributes_skip_root=\u8DF3\u8FC7\u6839\u8282\u70B9
attributes_visible=\u9009\u5B9A\u53EF\u89C1
attributes_visible_tooltip=\u9009\u5B9A\u53EF\u89C1
-automatic_layout=\u81ea\u52a8\u5e03\u5c40
+automatic_layout=\u81EA\u52A8\u5E03\u5C40
automatic_layout_disabled=\u7981\u7528
automatically_save_message=\u81EA\u52A8\u4FDD\u5B58\u5BFC\u56FE (\u4F7F\u7528\u6587\u4EF6\u540D {0}) ...
-AutomaticEdgeColorHookAction.text=\u81ea\u52a8\u53d8\u59d0\u989c\u8272
-AutomaticLayout.ALL=\u6240\u6709\u8282\u70b9
-AutomaticLayout.HEADINGS=\u975e\u53f6\u8282\u70b9
-AutomaticLayout.level=\u5c42\u6b21{0}
+AutomaticEdgeColor.FOR_BRANCHES=\u7ED9\u5206\u652F
+AutomaticEdgeColor.FOR_COLUMNS=\u7ED9\u5217
+AutomaticEdgeColor.FOR_LEVELS=\u7ED9\u7EA7\u522B
+AutomaticEdgeColor.ON_BRANCH_CREATION=\u5728\u5206\u652F\u521B\u5EFA
+AutomaticEdgeColorHookAction.text=\u81EA\u52A8\u53D8\u59D0\u989C\u8272
+AutomaticLayout.ALL=\u6240\u6709\u8282\u70B9
+AutomaticLayout.HEADINGS=\u975E\u53F6\u8282\u70B9
+AutomaticLayout.level=\u5C42\u6B21{0}
AutomaticLayout.level.root=\u6839
-AutomaticLayoutAction.text=\u5e94\u7528\u5c42\u6b21\u6837\u5f0f(&A)
-AutomaticLayoutAction.tooltip=<html>\u8c03\u6574\u5bfc\u56fe\u7684\u5e03\u5c40\u3002<br>\u7b2c\u4e00\u7ea7\u4e3a\u9ed1\u8272\uff0c\u7b2c\u4e8c\u7ea7\u4e3a\u84dd\u8272\uff0c\u7b49\u7b49\u3002</html>
-AutomaticLayoutControllerAction.ALL.text=\u6240\u6709\u8282\u70b9
-AutomaticLayoutControllerAction.HEADINGS.text=\u975e\u53f6\u8282\u70b9
+AutomaticLayoutAction.text=\u5E94\u7528\u5C42\u6B21\u6837\u5F0F
+AutomaticLayoutAction.tooltip=<html>\u8C03\u6574\u5BFC\u56FE\u7684\u5E03\u5C40\u3002<br>\u7B2C\u4E00\u7EA7\u4E3A\u9ED1\u8272\uFF0C\u7B2C\u4E8C\u7EA7\u4E3A\u84DD\u8272\uFF0C\u7B49\u7B49\u3002</html>
+AutomaticLayoutControllerAction.ALL.text=\u6240\u6709\u8282\u70B9
+AutomaticLayoutControllerAction.COLUMNS.text=\u7ED9\u5217
+AutomaticLayoutControllerAction.HEADINGS.text=\u975E\u53F6\u8282\u70B9
AutomaticLayoutControllerAction.null.text=\u7981\u7528
-BackAction.text=\u540e\u9000
+BackAction.text=\u540E\u9000
BackAction.tooltip=\u5728\u9009\u4E2D\u7684\u94FE\u4E2D\u540E\u8DF3
background=\u80CC\u666F
-bitmaps=\u4f4d\u56fe
-black=\u9ed1\u8272
-BlinkingNodeHookAction.text=\u95ea\u70c1\u8282\u70b9
-BlinkingNodeHookAction.tooltip=<html>\u8fd9\u5c06\u4f7f\u8282\u70b9\u95ea\u70c1\u3002\u4f46\u8bf7\u6ce8\u610f\uff0c\u4e0d\u8981\u5bf9\u5f88\u591a\u8282\u70b9\u5e94\u7528\uff0c<strong>\u4e0d\u8981\u5bf9\u540c\u4e00\u4e2a\u8282\u70b9\u5e94\u7528\u5176\u4ed6\u7684\u81ea\u52a8\u683c\u5f0f</strong></html>
-blue=\u84dd\u8272
+bitmaps=\u4F4D\u56FE
+black=\u9ED1\u8272
+BlinkingNodeHookAction.text=\u95EA\u70C1\u8282\u70B9
+BlinkingNodeHookAction.tooltip=<html>\u8FD9\u5C06\u4F7F\u8282\u70B9\u95EA\u70C1\u3002\u4F46\u8BF7\u6CE8\u610F\uFF0C\u4E0D\u8981\u5BF9\u5F88\u591A\u8282\u70B9\u5E94\u7528\uFF0C<strong>\u4E0D\u8981\u5BF9\u540C\u4E00\u4E2A\u8282\u70B9\u5E94\u7528\u5176\u4ED6\u7684\u81EA\u52A8\u683C\u5F0F</strong></html>
+blue=\u84DD\u8272
BoldAction.text=\u7C97\u4F53
boldify_branch=\u52A0\u7C97
-branch=\u5206\u679d
-browse=\u6d4f\u89c8
-calendar_attributes_panel=\u65e5\u5386\u548c\u5c5e\u6027
-calendar_panel=\u65e5\u5386
-can_not_connect_to_info_server=\u65e0\u6cd5\u8fde\u63a5\u5230\u4fe1\u606f\u670d\u52a1\u5668
-can_not_delete_predefined_style=\u4e0d\u80fd\u5220\u9664\u9884\u5b9a\u4e49\u6837\u5f0f
-can_not_delete_root_style=\u4e0d\u80fd\u5220\u9664\u6839\u6837\u5f0f
-can_not_delete_style_group=\u4e0d\u80fd\u5220\u9664\u6837\u5f0f\u7ec4
-can_not_save_key_set=\u65e0\u6cd5\u4fdd\u5b58\u70ed\u952e\u96c6
-cancel=\u53d6\u6d88(&C)
-CancelAction.text=\u53d6\u6d88(&C)
-cannot_add_parent_diff_parents=\u6240\u6709\u8282\u70b9\u5fc5\u987b\u6709\u76f8\u540c\u7684\u7236\u8282\u70b9\u624d\u80fd\u5e94\u7528\u6b64\u529f\u80fd\u3002
-cannot_add_parent_to_root=\u6839\u8282\u70b9\u4e0d\u80fd\u6dfb\u52a0\u65b0\u7684\u7236\u8282\u70b9\u3002
+branch=\u5206\u679D
+browse=\u6D4F\u89C8\u2026
+calendar_attributes_panel=\u65E5\u5386\u548C\u5C5E\u6027
+calendar_panel=\u65E5\u5386
+can_not_clone_encrypted_node=\u65E0\u6CD5\u514B\u9686\u52A0\u5BC6\u8282\u70B9
+can_not_connect_to_info_server=\u65E0\u6CD5\u8FDE\u63A5\u5230\u4FE1\u606F\u670D\u52A1\u5668
+can_not_delete_predefined_style=\u4E0D\u80FD\u5220\u9664\u9884\u5B9A\u4E49\u6837\u5F0F
+can_not_delete_root_style=\u4E0D\u80FD\u5220\u9664\u6839\u6837\u5F0F
+can_not_delete_style_group=\u4E0D\u80FD\u5220\u9664\u6837\u5F0F\u7EC4
+can_not_encrypt_cloned_node=\u65E0\u6CD5\u52A0\u5BC6\u514B\u9686\u8282\u70B9
+can_not_save_key_set=\u65E0\u6CD5\u4FDD\u5B58\u70ED\u952E\u96C6
+cancel=\u53D6\u6D88(&C)
+CancelAction.text=\u53D6\u6D88(C)
+cannot_add_parent_diff_parents=\u6240\u6709\u8282\u70B9\u5FC5\u987B\u6709\u76F8\u540C\u7684\u7236\u8282\u70B9\u624D\u80FD\u5E94\u7528\u6B64\u529F\u80FD\u3002
+cannot_add_parent_to_root=\u6839\u8282\u70B9\u4E0D\u80FD\u6DFB\u52A0\u65B0\u7684\u7236\u8282\u70B9\u3002
cannot_delete_root=\u6839\u8282\u70B9\u4E0D\u80FD\u5220\u9664\u6216\u526A\u5207.
cannot_join_nodes_with_children=\u6709\u5B50\u8282\u70B9\u7684\u8282\u70B9\u4E0D\u80FD\u5408\u5E76
+cannot_move_into_child_node=\u65E0\u6CD5\u79FB\u52A8\u5230\u5B50\u8282\u70B9
cannot_move_to_child=\u4E0D\u80FD\u5C06\u8282\u70B9\u79FB\u5411\u5B83\u7684\u5B50\u8282\u70B9.
CenterAction.text=\u5C45\u4E2D
-CenterSelectedNodeAction.text=\u5c06\u9009\u4e2d\u7684\u8282\u70b9\u5c45\u4e2d
-ChangeConnectorArrowsAction.backward.text=\u540e\u9000
-ChangeConnectorArrowsAction.both.text=\u53cc\u5411
-ChangeConnectorArrowsAction.forward.text=\u524d\u8fdb
-ChangeConnectorArrowsAction.none.text=\u65e0
-ChangeConnectorArrowsAction.text=\u6539\u53d8\u8fde\u63a5\u7bad\u5934
-ChangeConnectorShapeAction.CUBIC_CURVE.text=\u66f2\u7ebf
-ChangeConnectorShapeAction.EDGE_LIKE.text=\u6a21\u62df\u8fb9\u7f18
-ChangeConnectorShapeAction.LINE.text=\u76f4\u7ebf
-ChangeConnectorShapeAction.LINEAR_PATH.text=\u7ebf\u6027\u8def\u5f84
+CenterSelectedNodeAction.text=\u5C06\u9009\u4E2D\u7684\u8282\u70B9\u5C45\u4E2D
+ChangeConnectorArrowsAction.backward.text=\u540E\u9000
+ChangeConnectorArrowsAction.both.text=\u53CC\u5411
+ChangeConnectorArrowsAction.forward.text=\u524D\u8FDB
+ChangeConnectorArrowsAction.none.text=\u65E0
+ChangeConnectorArrowsAction.text=\u6539\u53D8\u8FDE\u63A5\u7BAD\u5934
+ChangeConnectorShapeAction.CUBIC_CURVE.text=\u66F2\u7EBF
+ChangeConnectorShapeAction.EDGE_LIKE.text=\u6A21\u62DF\u8FB9\u7F18
+ChangeConnectorShapeAction.LINE.text=\u76F4\u7EBF
+ChangeConnectorShapeAction.LINEAR_PATH.text=\u7EBF\u6027\u8DEF\u5F84
ChangeNodeLevelLeftsAction.text=\u8282\u70B9\u5DE6\u79FB
ChangeNodeLevelLeftsAction.tooltip=\u5728\u6839\u5DE6\u8FB9\u7684\u8282\u70B9\uFF0C\u964D\u7EA7\u53D8\u6210\u4E0A\u65B9\u540C\u7EA7\u8282\u70B9\u7684\u5B50\u8282\u70B9\u3002\u6839\u53F3\u8FB9\u7684\u8282\u70B9\uFF0C\u5347\u7EA7\u5230\u4E0A\u4E00\u7EA7\u8282\u70B9\uFF0C\u82E5\u4E0E\u6839\u76F4\u63A5\u76F8\u8FDE\uFF0C\u5219\u53D8\u5230\u5DE6\u4FA7.
ChangeNodeLevelRightsAction.text=\u8282\u70B9\u53F3\u79FB
ChangeNodeLevelRightsAction.tooltip=\u5728\u6839\u53F3\u8FB9\u7684\u8282\u70B9\uFF0C\u964D\u7EA7\u53D8\u6210\u4E0A\u65B9\u540C\u7EA7\u8282\u70B9\u7684\u5B50\u8282\u70B9\u3002\u5728\u6839\u5DE6\u8FB9\u8282\u70B9\u5347\u7EA7\u5230\u4E0A\u4E00\u7EA7\u8282\u70B9\uFF0C\u82E5\u4E0E\u6839\u76F4\u63A5\u76F8\u8FDE\uFF0C\u5219\u53D8\u5230\u53F3\u4FA7.
-choose_background_color=\u9009\u62e9\u80cc\u666f\u989c\u8272\uff1a
-choose_cloud_color=\u9009\u62e9\u4e91\u6846\u989c\u8272\uff1a
+choose_background_color=\u9009\u62E9\u80CC\u666F\u989C\u8272\uFF1A
+choose_cloud_color=\u9009\u62E9\u4E91\u6846\u989C\u8272\uFF1A
choose_edge_color=\u9009\u62E9\u8FDE\u7EBF\u989C\u8272
-choose_map_background_color=\u9009\u62e9\u5bfc\u56fe\u80cc\u666f\u989c\u8272
-choose_node_background_color=\u9009\u62e9\u8282\u70b9\u80cc\u666f\u989c\u8272\uff1a
-choose_node_color=\u9009\u62e9\u8282\u70b9\u989c\u8272\uff1a
-ClearLinkAnchorAction.text=\u6e05\u9664\u94fe\u63a5\u951a(Anchor)
-ClearLinkAnchorAction.tooltip=<html>\u6e05\u9664\u5148\u524d\u8bbe\u7f6e\u7684\u8282\u70b9\u951a(Anchor)</html>
-close_btn=\u5173\u95ed(&C)
-CloseAction.text=\u5173\u95ed\u5f53\u524d\u5bfc\u56fe(&C)
+choose_map_background_color=\u9009\u62E9\u5BFC\u56FE\u80CC\u666F\u989C\u8272
+choose_node_background_color=\u9009\u62E9\u8282\u70B9\u80CC\u666F\u989C\u8272\uFF1A
+choose_node_color=\u9009\u62E9\u8282\u70B9\u989C\u8272\uFF1A
+ClearLinkAnchorAction.text=\u6E05\u9664\u94FE\u63A5\u951A(Anchor)
+ClearLinkAnchorAction.tooltip=<html>\u6E05\u9664\u5148\u524D\u8BBE\u7F6E\u7684\u8282\u70B9\u951A(Anchor)</html>
+CloneAction.text=\u7C98\u8D34\u514B\u9686
+close_btn=\u5173\u95ED(&C)
+CloseAction.text=\u5173\u95ED\u5F53\u524D\u5BFC\u56FE
+cloud_shapes=\u4E91\u5F62\u72B6
CloudAction.text=\u4E91\u6846
CloudColorAction.text=\u4E91\u6846\u989C\u8272...
-CloudShapeAction.ARC.text=\u5f27\u5f62
-CloudShapeAction.RECT.text=\u77e9\u5f62
-CloudShapeAction.ROUND_RECT.text=\u5706\u8fb9\u77e9\u5f62
-CloudShapeAction.STAR.text=\u661f\u5f62
+CloudShapeAction.ARC.text=\u5F27\u5F62
+CloudShapeAction.RECT.text=\u77E9\u5F62
+CloudShapeAction.ROUND_RECT.text=\u5706\u8FB9\u77E9\u5F62
+CloudShapeAction.STAR.text=\u661F\u5F62
ColorProperty.ResetColor=\u91CD\u8BBE\u989C\u8272
combined=\u7EC4\u5408
-condition=\u6761\u4ef6
+condition=\u6761\u4EF6
confirmation=\u786E\u8BA4
-connector=\u8fde\u63a5\u5668
-connector_arrows=\u8fde\u63a5\u5668 \u7bad\u5f62
-connector_label=\u8fde\u63a5\u5668 \u6807\u7b7e
-connector_lines=\u8fde\u63a5\u5668 \u76f4\u7ebf
-connector_shapes=\u8fde\u63a5\u5668 \u5f62\u72b6
-ConnectorColorAction.text=\u8fde\u63a5\u5668 \u989c\u8272
-CopyAction.text=\u590d\u5236(&C)
-CopyAction.tooltip=\u590d\u5236\u9009\u5b9a\u5206\u652f
-CopyAttributes.text=\u590d\u5236\u5c5e\u6027(&a)
-CopyIDAction.text=\u590d\u5236\u8282\u70b9ID
-CopyMapStylesAction.text=\u4ece...\u5bfc\u56fe\u6837\u5f0f\u590d\u5236
-CopyNodeURIAction.text=\u590d\u5236\u8282\u70b9URI
-copyright=Copyright \u00a9 2000-2014 Freeplane team and others
-CopySingleAction.text=\u5355\u4E00\u590D\u5236
-CopySingleAction.tooltip=\u53ea\u590d\u5236\u9009\u4e2d\u8282\u70b9
-CopyStyleExtensionsAction.text=\u4ece\u6837\u5f0f\u8282\u70b9\u590d\u5236\u6269\u5c55
-corrupt_map=\u5bfc\u56fe\u5185\u5bb9\u635f\u574f
-CreateConjunctConditionAction.text=\u4e0e
+connector=\u8FDE\u63A5\u5668
+connector_arrows=\u8FDE\u63A5\u5668 \u7BAD\u5F62
+connector_label=\u8FDE\u63A5\u5668 \u6807\u7B7E
+connector_lines=\u8FDE\u63A5\u5668 \u76F4\u7EBF
+connector_shapes=\u8FDE\u63A5\u5668 \u5F62\u72B6
+ConnectorColorAction.text=\u8FDE\u63A5\u5668\u989C\u8272\u2026
+ConvertCloneToIndependentNodeAction.text=\u53D6\u6D88\u514B\u9686
+CopyAction.text=\u590D\u5236(C)
+CopyAction.tooltip=\u590D\u5236\u9009\u5B9A\u5206\u652F
+CopyAttributes.text=\u590D\u5236\u5C5E\u6027(a)
+CopyIDAction.text=\u590D\u5236\u8282\u70B9ID
+CopyMapStylesAction.text=\u4ECE\u5BFC\u56FE\u6837\u5F0F\u590D\u5236\u2026
+CopyNodeURIAction.text=\u590D\u5236\u8282\u70B9URI
+copyright=Copyright \u00A9 2000-2016 Freeplane \u56E2\u961F\u53CA\u5176\u4ED6\u4EBA
+CopySingleAction.text=\u590D\u5236\u8282\u70B9(\u5355\u4E00)
+CopySingleAction.tooltip=\u53EA\u590D\u5236\u9009\u4E2D\u8282\u70B9
+CopyStyleExtensionsAction.text=\u4ECE\u6837\u5F0F\u8282\u70B9\u590D\u5236\u6269\u5C55
+corrupt_map=\u5BFC\u56FE\u5185\u5BB9\u635F\u574F
+CreateConjunctConditionAction.text=\u4E0E
CreateDisjunctConditionAction.text=\u6216
-CreateNotSatisfiedConditionAction.text=\u975e
-CreationModificationPluginAction.text=\u663e\u793a\u4fee\u6539\u65f6\u95f4(&M)
+CreateNotSatisfiedConditionAction.text=\u975E
+CreationModificationPluginAction.text=\u663E\u793A\u4FEE\u6539\u65F6\u95F4
CreationModificationPluginAction.tooltip=<html>\u8FD9\u4E2A\u529F\u80FD\u8DDF\u8E2A\u4FDD\u7559\u8282\u70B9\u7684\u521B\u5EFA\u66F4\u6539\u65F6\u95F4.</html>
-current_dir=\u5bfc\u56fe
-CutAction.text=\u526a\u5207(&t)
+current_dir=\u5BFC\u56FE
+CutAction.text=\u526A\u5207(t)
decrease_branch_font_size=\u7F29\u5C0F\u5B57\u4F53
DecreaseNodeFontAction.text=\u7F29\u5C0F\u5B57\u4F53
-default=\u9ed8\u8ba4
-DefaultColorAction.text=\u9ed8\u8ba4\u989c\u8272
-defaultstyle.details=\u8be6\u7ec6
-defaultstyle.floating=\u6d6e\u70b9\u6a21\u5f0f
-defaultstyle.note=\u6ce8\u89e3
+default=\u9ED8\u8BA4
+defaultAuxiliaryWordList=\u4E00\u4E2A
+DefaultColorAction.text=\u9ED8\u8BA4\u989C\u8272
+defaultstyle.attributes=\u5C5E\u6027
+defaultstyle.details=\u8BE6\u7EC6
+defaultstyle.floating=\u6D6E\u70B9\u6A21\u5F0F
+defaultstyle.note=\u6CE8\u89E3
delete=\u5220\u9664(&D)
-delete_child=\u5220\u9664\u8282\u70b9
-DeleteAction.text=\u5220\u9664\u8282\u70b9\u52a8\u4f5c
+delete_child=\u5220\u9664\u8282\u70B9
+DeleteAction.text=\u5220\u9664\u8282\u70B9
DeleteConditionAction.text=\u5220\u9664
-DeleteDetailsAction.text=\u5220\u9664\u8282\u70b9\u660e\u7ec6
-DeleteLevelStyleAction.text=\u5220\u9664\u5c42\u6b21\u6837\u5f0f
-DeleteStyleAction.text=\u5220\u9664\u6837\u5f0f
-DeleteUserStyleAction.text=\u5220\u9664\u7528\u6237\u5b9a\u4e49\u6837\u5f0f
-dialect_info.app=\u601d\u7ef4\u5bfc\u56fe\u6587\u4ef6{0}\u662f\u7531\u7a0b\u5e8f{1}\u521b\u5efa
-dialect_info.unknownApp=\u601d\u7ef4\u5bfc\u56fe\u6587\u4ef6{0}\u662f\u7531\u672a\u77e5\u7a0b\u5e8f\u521b\u5efa
-dialect_info.unknownURL=\u7f51\u7ad9\u672a\u77e5
-dialect_info.url=\u60f3\u8981\u4e86\u89e3\u66f4\u591a\u4fe1\u606f\uff0c\u8bf7\u8bbf\u95ee\u7f51\u7ad9{0}
-dialect_info.warning=Freeplane\u53ef\u80fd\u9519\u8bef\u7684\u6253\u5f00\uff0c\u663e\u793a\u6216\u8005\u4fdd\u5b58\u5b83
-DirectHtmlFlavorHandler=HTML\u4f5c\u4e3a\u5355\u4e2a\u8282\u70b9
+DeleteDetailsAction.text=\u5220\u9664\u8282\u70B9\u660E\u7EC6
+DeleteLevelStyleAction.text=\u5220\u9664\u5C42\u6B21\u6837\u5F0F
+DeleteStyleAction.text=\u5220\u9664\u6837\u5F0F
+DeleteUserStyleAction.text=\u5220\u9664\u7528\u6237\u5B9A\u4E49\u6837\u5F0F
+dialect_info.app=\u601D\u7EF4\u5BFC\u56FE\u6587\u4EF6{0}\u662F\u7531\u7A0B\u5E8F{1}\u521B\u5EFA\u3002
+dialect_info.later_version=\u5BFC\u56FE\u6587\u4EF6 {0} \u662F\u7528\u672C\u7A0B\u5E8F\u7684\u66F4\u665A\u7248\u672C\u521B\u5EFA\u7684\u3002
+dialect_info.unknownApp=\u601D\u7EF4\u5BFC\u56FE\u6587\u4EF6{0}\u662F\u7531\u672A\u77E5\u7A0B\u5E8F\u521B\u5EFA\u3002
+dialect_info.unknownURL=\u7F51\u7AD9\u672A\u77E5\u3002
+dialect_info.url=\u60F3\u8981\u4E86\u89E3\u66F4\u591A\u4FE1\u606F\uFF0C\u8BF7\u8BBF\u95EE\u7F51\u7AD9{0}\u3002
+dialect_info.warning=Freeplane\u53EF\u80FD\u9519\u8BEF\u5730\u6253\u5F00\u3001\u663E\u793A\u6216\u8005\u4FDD\u5B58\u5B83\u3002
+DirectHtmlFlavorHandler=HTML\u4F5C\u4E3A\u5355\u4E2A\u8282\u70B9
DocumentationAction.text=\u6587\u6863
-down=D&own
-download=\u4e0b\u8f7d
-dropped_file_error=\u65e0\u6cd5\u6253\u5f00\u4e22\u5f03\u7684\u6587\u4ef6\u3002\u539f\u56e0\uff1a{0}
+down=\u4E0B(&O)
+DownConditionAction.text=\u4E0B
+download=\u4E0B\u8F7D
+dropped_file_error=\u65E0\u6CD5\u6253\u5F00\u4E22\u5F03\u7684\u6587\u4EF6\u3002\u539F\u56E0\uFF1A{0}
edge=\u8FDE\u7EBF
-edge_is_formatted_by_style=\u8fb9\u683c\u5f0f\u7531\u6837\u5f0f\u8868\u63a7\u5236\uff0c\u5982\u679c\u60f3\u8981\u6539\u53d8\u8fb9\u683c\u5f0f\uff0c\u8bf7\u7f16\u8f91\u76f8\u5173\u6837\u5f0f\u8868
+edge_is_formatted_by_style=\u8FB9\u683C\u5F0F\u7531\u6837\u5F0F\u8868\u63A7\u5236\uFF0C\u5982\u679C\u60F3\u8981\u6539\u53D8\u8FB9\u683C\u5F0F\uFF0C\u8BF7\u7F16\u8F91\u76F8\u5173\u6837\u5F0F\u8868\u3002
edge_style=\u8FDE\u7EBF\u98CE\u683C
edge_width=\u8FDE\u7EBF\u5BBD\u5EA6
+edge_widths=\u5206\u652F\u7EBF\u5BBD\u5EA6
EdgeColorAction.text=\u8FDE\u7EBF\u989C\u8272...
+EdgeProperties=\u5206\u652F\u7EBF\u5C5E\u6027
EdgeStyleAction.bezier.text=\u8D1D\u585E\u5C14\u66F2\u7EBF
-EdgeStyleAction.bezier.tooltip=<html>Display the edge as a smooth curve.</html>
-EdgeStyleAction.hide_edge.text=\u9690\u85cf\u8fde\u7ebf
+EdgeStyleAction.bezier.tooltip=<html>\u663E\u793A\u5206\u652F\u7EBF\u4E3A\u5E73\u6ED1\u66F2\u7EBF\u3002</html>
+EdgeStyleAction.hide_edge.text=\u9690\u85CF\u8FDE\u7EBF
EdgeStyleAction.hide_edge.tooltip=<html>For selected nodes display edge to parent as a<br>dotted line. Otherwise hide the edge.</html>
-EdgeStyleAction.horizontal.text=\u6c34\u5e73
+EdgeStyleAction.horizontal.text=\u6C34\u5E73
EdgeStyleAction.horizontal.tooltip=<html>Use perpendicular straight lines for edges.</html>
EdgeStyleAction.linear.text=\u76F4\u7EBF
EdgeStyleAction.linear.tooltip=<html>Display the edge as a straight line.</html>
@@ -277,198 +297,212 @@ EdgeStyleAsParentAction.text=\u540C\u7236\u8282\u70B9
EdgeStyleAsParentAction.tooltip=<html>Use edge style of parent node.</html>[obsolete]
EdgeWidthAction_width_parent.text=\u540C\u7236\u8282\u70B9\u8FDE\u7EBF
EdgeWidthAction_width_thin.text=\u7EC6\u8FDE\u7EBF
-edit=\u7f16\u8f91(&E)
+edit=\u7F16\u8F91(&E)
edit.decision=HTML \u7F16\u8F91\u5668
edit.edit_rich_text=\u60A8\u5E0C\u671B\u4F7F\u7528\u7C7B\u4F3C\u4E8E\u7C97\u4F53\u659C\u4F53\u4E4B\u7C7B\u7684\u6837\u5F0F\u4E48?
-edit_details=\u7f16\u8f91\u8282\u70b9\u660e\u7ec6
+edit_details=\u7F16\u8F91\u8282\u70B9\u660E\u7EC6
edit_end_label=<html>Connector<br>label
-edit_label_font_family=\u5b57\u4f53
-edit_label_font_size=\u5b57\u4f53\u5927\u5c0f
+edit_label_font_family=\u5B57\u4F53
+edit_label_font_size=\u5B57\u4F53\u5927\u5C0F
edit_link_manually=\u624B\u52A8\u7F16\u8F91\u94FE\u63A5...
-edit_long_node=\u5728\u5bf9\u8bdd\u6846\u4e2d\u7f16\u8f91\u957f\u8282\u70b9
+edit_long_node=\u5728\u5BF9\u8BDD\u6846\u4E2D\u7F16\u8F91\u957F\u8282\u70B9
edit_middle_label=<html>Middle<br>label
-edit_note=\u7f16\u8f91\u6ce8\u89e3
+edit_note=\u7F16\u8F91\u6CE8\u89E3
edit_source_label=<html>Source<br>label
edit_target_label=<html>Target<br>label
-edit_transparency_label=\u4e0d\u900f\u660e\u6027
-edit_width_label=\u5bbd\u5ea6
+edit_transparency_label=\u4E0D\u900F\u660E\u6027
+edit_width_label=\u5BBD\u5EA6
EditAction.text=\u7F16\u8F91\u8282\u70B9
EditAttributesAction.text=\u7F16\u8F91\u5C5E\u6027
-EditDetailsAction.text=\u7f16\u8bd1\u8282\u70b9\u660e\u7ec6
-EditDetailsInDialogAction.text=\u5728\u5bf9\u8bdd\u6846\u4e2d\u7f16\u8f91\u8282\u70b9\u660e\u7ec6
+EditDetailsAction.text=\u7F16\u8BD1\u8282\u70B9\u660E\u7EC6
+EditDetailsInDialogAction.text=\u5728\u5BF9\u8BDD\u6846\u4E2D\u7F16\u8F91\u8282\u70B9\u660E\u7EC6
EditFilterAction.text=\u7F16\u8F91
-EditLongAction.text=\u7F16\u8F91\u957F\u8282\u70B9...
-EditNoteInDialogAction.text=\u5728\u5bf9\u8bdd\u6846\u4e2d\u7f16\u8f91\u6ce8\u89e3
-EditScript=\u7f16\u8f91\u811a\u672c
-EditStylesAction.text=\u7f16\u8f91\u6837\u5f0f
-EncryptedMap.text=\u521B\u5EFA\u52A0\u5BC6\u56FE ...
+EditLongAction.text=\u7F16\u8F91\u957F\u8282\u70B9
+EditNoteInDialogAction.text=\u5728\u5BF9\u8BDD\u6846\u4E2D\u7F16\u8F91\u6CE8\u89E3
+EditScript=\u7F16\u8F91\u811A\u672C\u2026
+EditStylesAction.text=\u7F16\u8F91\u6837\u5F0F
+EncryptedMap.text=\u65B0\u5EFA\u53D7\u4FDD\u62A4(\u52A0\u5BC6)\u5BFC\u56FE...
EncryptedMap.tooltip=\u521B\u5EFA\u52A0\u5BC6\u56FE
+encryption=\u52A0\u5BC6
enter_base_url=\u5C06\u7C98\u8D34\u76F8\u5BF9\u94FE\u63A5\u3002\u8BF7\u8F93\u5165\u57FA\u7840 URL \u3002
-enter_condition_name=\u8f93\u5165\u65b0\u6761\u4ef6\u540d
-enter_confirms=Enter \u786e\u8ba4(&E)
-enter_keyset_name=\u8f93\u5165\u70ed\u952e\u96c6\u540d\u79f0
-enter_map_url=\u8f93\u5165\u5bfc\u56feURL
-enter_new_style_name=\u8f93\u5165\u65b0\u6837\u5f0f\u540d
-enter_node_id=\u8f93\u5165\u8282\u70b9ID
-enter_zoom=\u8f93\u5165\u7f29\u653e\u6bd4\u4f8b
-EnterPassword.text=\u89e3\u5f00\u6216\u5173\u95ed\u52a0\u5bc6\u8282\u70b9(&T)
+enter_command=\u8BF7\u8F93\u5165\u547D\u4EE4
+enter_condition_name=\u8F93\u5165\u65B0\u6761\u4EF6\u540D
+enter_confirms=Enter \u786E\u8BA4(&E)
+enter_keyset_name=\u8F93\u5165\u70ED\u952E\u96C6\u540D\u79F0
+enter_map_url=\u8F93\u5165\u5BFC\u56FEURL
+enter_new_style_name=\u8F93\u5165\u65B0\u6837\u5F0F\u540D
+enter_node_id=\u8F93\u5165\u8282\u70B9ID
+enter_zoom=\u8F93\u5165\u7F29\u653E\u6BD4\u4F8B
+EnterPassword.text=\u89E3\u5F00\u6216\u5173\u95ED\u52A0\u5BC6\u8282\u70B9(&T)
error=\u9519\u8BEF
error_applying_template=\u5E94\u7528 XSL \u6A21\u677F\u9519\u8BEF.
-error_creating_directory=\u65e0\u6cd5\u521b\u5efa\u5bfc\u51fa\u76ee\u5f55\u3002
-error_in_template=\u9ed8\u8ba4\u5bfc\u56fe\u6a21\u7248{0}\u51fa\u9519\u3002\u5c1d\u8bd5\u5220\u9664\u8fd9\u4e2a\u6587\u4ef6\u6765\u89e3\u51b3\u95ee\u9898
-errornumber={0} \u9519\u8bef
-ExecuteScriptError.text=\u6267\u884c\u811a\u672c\u65f6\u51fa\u9519\u3002\n\u8be6\u60c5\u8bf7\u67e5\u770b\u8bb0\u5f55\u6587\u4ef6\u3002
-ExecuteScriptForAllNodes.text=\u6267\u884c\u6240\u6709\u811a\u672c
-ExecuteScriptForSelectionAction.text=\u6267\u884c\u9009\u4e2d\u8282\u70b9\u811a\u672c
-ExecuteScriptOnSelectedNode.text=\u5bf9\u6240\u6709\u9009\u4e2d\u7684\u8282\u70b9\u6267\u884c{0}
-ExecuteScriptOnSelectedNodeRecursively.text=\u5bf9\u9009\u4e2d\u7684\u8282\u70b9\u9012\u5f52\u6267\u884c{0}
-ExecuteScriptOnSingleNode.text=\u5bf9\u4e00\u4e2a\u9009\u4e2d\u7684\u8282\u70b9\u6267\u884c{0}
-ExecuteScripts.noScriptsAvailable=\u4e0d\u53ef\u7528
-ExecuteScripts.text=\u811a\u672c
-ExecuteScriptSecurityError.text=\u811a\u672c\u6267\u884c\u65f6\u51fa\u73b0\u9519\u8bef\uff1a{0}
-export_failed=\u5bfc\u51fa\u5931\u8d25
+error_creating_directory=\u65E0\u6CD5\u521B\u5EFA\u5BFC\u51FA\u76EE\u5F55\u3002
+error_in_template=\u9ED8\u8BA4\u5BFC\u56FE\u6A21\u7248{0}\u51FA\u9519\u3002\u5C1D\u8BD5\u5220\u9664\u8FD9\u4E2A\u6587\u4EF6\u6765\u89E3\u51B3\u95EE\u9898\u3002
+errornumber={0} \u9519\u8BEF
+ExecuteScript.available_modes_tooltip={0} \u53EF\u7528\u4E8E
+ExecuteScript.script=\u811A\u672C
+ExecuteScriptError.text=\u6267\u884C\u811A\u672C\u65F6\u51FA\u9519\uFF1A\n{0}
+ExecuteScriptForAllNodes.text=\u6267\u884C\u6240\u6709\u811A\u672C
+ExecuteScriptForSelectionAction.text=\u6267\u884C\u9009\u4E2D\u8282\u70B9\u811A\u672C
+ExecuteScriptOnSelectedNode.text=\u5BF9\u6240\u6709\u9009\u4E2D\u7684\u8282\u70B9\u6267\u884C{0}
+ExecuteScriptOnSelectedNodeRecursively.text=\u5BF9\u9009\u4E2D\u7684\u8282\u70B9\u9012\u5F52\u6267\u884C{0}
+ExecuteScriptOnSingleNode.text=\u5BF9\u4E00\u4E2A\u9009\u4E2D\u7684\u8282\u70B9\u6267\u884C{0}
+ExecuteScripts.noScriptsAvailable=\u4E0D\u53EF\u7528
+ExecuteScripts.text=\u811A\u672C
+ExecuteScriptSecurityError.text=\u811A\u672C\u6267\u884C\u65F6\u51FA\u73B0\u9519\u8BEF\uFF1A{0}
+export_failed=\u5BFC\u51FA\u5931\u8D25
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
-export_using_xslt=Freeplane\u4f7f\u7528XSLT\u5bfc\u51fa
-ExportAction.text=\u5bfc\u51fa(&E)
-ExportBranchAction.text=\u5c06\u5206\u679d\u53e6\u5b58\u4e3a\u65b0\u7684\u601d\u7ef4\u5bfc\u56fe...
-ExportBranchToHTMLAction.text=\u5bfc\u51fa\u5206\u679d\u4e3a HTML
-exported_file={0} \u6587\u4ef6
-ExportPdf.text=\u5bfc\u51fa\u4e3aPDF...
-ExportSvg.text=\u5bfc\u51fa\u4e3aSVG...
+export_using_xslt=Freeplane\u4F7F\u7528XSLT\u5BFC\u51FA
+ExportAction.text=\u5BFC\u51FA\u2026
+ExportBranchAction.text=\u5C06\u5206\u679D\u53E6\u5B58\u4E3A\u65B0\u7684\u601D\u7EF4\u5BFC\u56FE...
+ExportBranchToHTMLAction.text=\u5BFC\u51FA\u5206\u679D\u4E3A HTML
+exported_file={0} \u6587\u4EF6
+ExportPdf.text=\u5BFC\u51FA\u4E3APDF...
+ExportSvg.text=\u5BFC\u51FA\u4E3ASVG...
ExportToHTMLAction.text=\u5BFC\u51FA\u4E3AHTML
-ExportToImage.jpg.text=\u5bfc\u51fa\u4e3aJPEG...
-ExportToImage.png.text=\u5bfc\u51fa\u4e3aPNG...
+ExportToImage.jpg.text=\u5BFC\u51FA\u4E3AJPEG...
+ExportToImage.png.text=\u5BFC\u51FA\u4E3APNG...
ExportToOoWriter.text=\u5BFC\u51FA\u4E3A Open Office Writer \u6587\u6863...
extension_menu=\u6837\u5F0F
-ExternalImage_popupMenu_Change=\u66f4\u6362\u56fe\u7247
-ExternalImage_popupMenu_Open=\u5728\u67e5\u770b\u5668\u4e2d\u6253\u5f00
+ExternalImage_popupMenu_Change=\u66F4\u6362\u56FE\u7247\u2026
+ExternalImage_popupMenu_Open=\u5728\u67E5\u770B\u5668\u4E2D\u6253\u5F00
ExternalImage_popupMenu_Remove=\u5220\u9664
-ExternalImage_popupMenu_ResetZoom=\u6062\u590d\u539f\u5927\u5c0f
-ExternalImageAddAction.text=\u6dfb\u52a0\u56fe\u7247...
-ExternalImageChangeAction.text=\u66f4\u6362\u56fe\u7247...
-ExternalImageRemoveAction.text=\u79fb\u9664\u56fe\u7247
-ExtractLinkFromTextAction.text=\u4ece\u6587\u672c\u4e2d\u63d0\u53d6\u8d85\u94fe\u63a5
-ExtractLinkFromTextAction.tooltip=\u8bbe\u7f6e\u8282\u70b9\u6587\u672c\u4e2d\u627e\u5230\u7684\u8d85\u94fe\u63a5
-f_button_unassigned=<\u65e0\u52a8\u4f5c>
+ExternalImage_popupMenu_ResetZoom=\u6062\u590D\u539F\u5927\u5C0F
+ExternalImageAddAction.text=\u6DFB\u52A0\u56FE\u7247...
+ExternalImageChangeAction.text=\u66F4\u6362\u56FE\u7247...
+ExternalImageRemoveAction.text=\u79FB\u9664\u56FE\u7247
+ExtractLinkFromTextAction.text=\u4ECE\u6587\u672C\u4E2D\u63D0\u53D6\u8D85\u94FE\u63A5
+ExtractLinkFromTextAction.tooltip=\u8BBE\u7F6E\u8282\u70B9\u6587\u672C\u4E2D\u627E\u5230\u7684\u8D85\u94FE\u63A5
+extras=\u5DE5\u5177(&T)
+f_button_unassigned=<\u65E0\u52A8\u4F5C>
FaqOpenURLAction.text=FAQ
-file=\u6587\u4ef6(&F)
+file=\u6587\u4EF6(&F)
file_already_exists=\u6587\u4EF6 {0} \u5DF2\u5B58\u5728. \u786E\u5B9A\u8981\u8986\u76D6\u5417?
file_not_found=\u627E\u4E0D\u5230 {0} \u6587\u4EF6
-FileListFlavorHandler=\u5230\u6587\u4ef6\u7684\u8fde\u63a5
-FileProperties_BranchLeafCount=\u9009\u53d6\u7684\u5206\u652f\u672b\u7aef\u8282\u70b9\u6570
-FileProperties_BranchNodeCount=\u9009\u53d6\u7684\u5206\u652f\u7684\u8282\u70b9\u6570
-FileProperties_ChangesSinceLastSave=\u4e0a\u6b21\u4fdd\u5b58\u4e4b\u540e\u7684\u6539\u53d8
-FileProperties_FileName=\u6587\u4ef6\u540d:
-FileProperties_FileSaved=\u6587\u4ef6\u4fdd\u5b58\u5728:
-FileProperties_FileSize=\u6587\u4ef6\u5927\u5c0f:
-FileProperties_MainBranchCount=\u4e3b\u8981\u5206\u652f\u6570:
-FileProperties_NeverSaved=\u4ece\u4e0d\u4fdd\u5b58:
-FileProperties_NodeChildCount=\u9009\u53d6\u5206\u652f\u7684\u5b57\u8282\u70b9\u6570
-FileProperties_NodeSelectionCount=\u9009\u53d6\u7684\u8282\u70b9\u6570
-FileProperties_TotalFilteredCount=\u6ee1\u8db3\u6761\u4ef6\u7684\u8282\u70b9\u6570
-FileProperties_TotalLeafCount=\u6240\u6709\u7684\u53f6\u8282\u70b9\u6570
-FileProperties_TotalNodeCount=\u6240\u6709\u7684\u8282\u70b9\u6570
-FilePropertiesAction.text=\u5bfc\u56fe\u7edf\u8ba1\u4fe1\u606f
-FileRevisionsDialog.cancel=\u53d6\u6d88(&C)
-FileRevisionsDialog.file_last_modified=\u65f6\u95f4\u6233
-FileRevisionsDialog.file_name=\u6587\u4ef6\u540d:
-FileRevisionsDialog.file_size=\u5b57\u8282
-FileRevisionsDialog.open=\u6253\u5f00(&O)
-FileRevisionsDialog.open.tooltip=\u6253\u5f00\u6587\u4ef6(\u5373\u4f7f\u6587\u4ef6\u5df2\u8fc7\u671f)
-FileRevisionsDialog.question=\u627e\u5230\u4fee\u8ba2 {0}
-FileRevisionsDialog.restore=\u6062\u590d
-FileRevisionsDialog.restore.tooltip=\u628a{0}\u66ff\u6362\u4e3a{1}
-FileRevisionsDialog.title=\u6587\u4ef6\u4fee\u8ba2\u5217\u8868
-filter=\u8FC7\u6EE4\u5668
-filter_add=\u6dfb\u52a0(&A)
-filter_and=\u4e0e(&N)
-filter_any_text=\u8282\u70b9\u6838\u5fc3\uff0c\u660e\u7ec6\u6216\u8005\u6ce8\u89e3
+FileListFlavorHandler=\u5230\u6587\u4EF6\u7684\u8FDE\u63A5
+FileProperties_BranchLeafCount=\u9009\u53D6\u7684\u5206\u652F\u672B\u7AEF\u8282\u70B9\u6570\uFF1A
+FileProperties_BranchNodeCount=\u9009\u53D6\u7684\u5206\u652F\u7684\u8282\u70B9\u6570\uFF1A
+FileProperties_ChangesSinceLastSave=\u4E0A\u6B21\u4FDD\u5B58\u4E4B\u540E\u7684\u6539\u53D8\uFF1A
+FileProperties_FileName=\u6587\u4EF6\u540D:
+FileProperties_FileSaved=\u6587\u4EF6\u4FDD\u5B58\u5728:
+FileProperties_FileSize=\u6587\u4EF6\u5927\u5C0F:
+FileProperties_MainBranchCount=\u4E3B\u8981\u5206\u652F\u6570:
+FileProperties_NeverSaved=\u4ECE\u672A\u4FDD\u5B58
+FileProperties_NodeChildCount=\u9009\u53D6\u5206\u652F\u7684\u5B50\u8282\u70B9\u6570\uFF1A
+FileProperties_NodeSelectionCount=\u9009\u53D6\u7684\u8282\u70B9\u6570\uFF1A
+FileProperties_TotalFilteredCount=\u6EE1\u8DB3\u6761\u4EF6\u7684\u8282\u70B9\u6570\uFF1A
+FileProperties_TotalLeafCount=\u6240\u6709\u7684\u53F6\u8282\u70B9\u6570\uFF1A
+FileProperties_TotalNodeCount=\u6240\u6709\u7684\u8282\u70B9\u6570\uFF1A
+FilePropertiesAction.text=\u5BFC\u56FE\u7EDF\u8BA1\u4FE1\u606F...
+FileRevisionsDialog.cancel=\u53D6\u6D88(&C)
+FileRevisionsDialog.file_last_modified=\u65F6\u95F4\u6233
+FileRevisionsDialog.file_name=\u6587\u4EF6\u540D
+FileRevisionsDialog.file_size=\u5B57\u8282
+FileRevisionsDialog.open=\u6253\u5F00(&O)
+FileRevisionsDialog.open.tooltip=\u6253\u5F00\u6587\u4EF6(\u5373\u4F7F\u6587\u4EF6\u5DF2\u8FC7\u671F)
+FileRevisionsDialog.question=\u627E\u5230\u4FEE\u8BA2 {0}
+FileRevisionsDialog.restore=\u6062\u590D
+FileRevisionsDialog.restore.tooltip=\u628A{0}\u66FF\u6362\u4E3A{1}
+FileRevisionsDialog.title=\u6587\u4EF6\u4FEE\u8BA2\u5217\u8868
+filter=\u8FC7\u6EE4\u5668(&I)
+filter_add=\u6DFB\u52A0(&A)
+filter_and=\u4E0E(&N)
+filter_any_text=\u8282\u70B9\u6838\u5FC3\uFF0C\u660E\u7EC6\u6216\u8005\u6CE8\u89E3
+filter_clone_snapshot=\u5DF2\u4FDD\u5B58\u9009\u4E2D\u7684\u514B\u9686
+filter_clones=\u9009\u4E2D\u7684\u514B\u9686
filter_conditions=\u8FC7\u6EE4\u5668
filter_contains=\u5305\u542B
-filter_created_after=\u4e4b\u540e\u521b\u5efa
-filter_created_before=\u4e4b\u524d\u521b\u5efa
+filter_created_after=\u4E4B\u540E\u521B\u5EFA
+filter_created_before=\u4E4B\u524D\u521B\u5EFA
filter_delete=\u5220\u9664(&D)
-filter_details=\u8282\u70b9\u660e\u7ec6
+filter_details=\u8282\u70B9\u660E\u7EC6
filter_dialog=\u8FC7\u6EE4\u5668\u6784\u9020\u5668
filter_does_not_exist=\u4E0D\u5B58\u5728
filter_edit_description=\u7F16\u8F91\u8FC7\u6EE4\u5668\u5217\u8868
filter_enter_value=\u8F93\u5165\u503C
-filter_even_level=\u5947\u6570\u5c42\u8282\u70b9
+filter_even_level=\u5947\u6570\u5C42\u8282\u70B9
filter_exist=\u5B58\u5728
filter_icon=\u56FE\u6807
filter_is_equal_to=\u7B49\u4E8E
filter_is_not_equal_to=\u4E0D\u7B49\u4E8E
-filter_leaf=\u53f6\u8282\u70b9
-filter_link=\u8d85\u94fe\u63a5
-filter_match_approximately=\u8fd1\u4f3c\u5339\u914d
-filter_match_approximately_tooltip=<html>\u662f\u5426\u8fdb\u884c\u7cbe\u786e\u5339\u914ds,<br/>i.e. searching for 'files' will find 'flies'.</html>
-filter_match_case=\u533a\u522b\u5927\u5c0f\u5199
-filter_match_case_tooltip=\u662f\u5426\u533a\u5206\u5927\u5c0f\u5199
-filter_modified_after=\u4e4b\u540e\u4fee\u6539
-filter_modified_before=\u4e4b\u524d\u4fee\u6539
+filter_leaf=\u53F6\u8282\u70B9
+filter_link=\u8D85\u94FE\u63A5
+filter_match_approximately=\u8FD1\u4F3C\u5339\u914D
+filter_match_approximately_tooltip=<html>\u662F\u5426\u8FDB\u884C\u7CBE\u786E\u5339\u914Ds,<br/>i.e. searching for 'files' will find 'flies'.</html>
+filter_match_case=\u533A\u522B\u5927\u5C0F\u5199
+filter_match_case_tooltip=\u662F\u5426\u533A\u5206\u5927\u5C0F\u5199\u3002
+filter_modified_after=\u4E4B\u540E\u4FEE\u6539
+filter_modified_before=\u4E4B\u524D\u4FEE\u6539
filter_no_filtering=\u4E0D\u8FC7\u6EE4
filter_node=\u8282\u70B9\u6587\u672C
-filter_node_level=\u8282\u70b9\u5c42\u6b21
+filter_node_level=\u8282\u70B9\u5C42\u6B21
filter_not=\u975E
-filter_note=\u6ce8\u89e3
-filter_odd_level=\u5076\u6570\u5c42\u6b21\u8282\u70b9
+filter_note=\u6CE8\u89E3
+filter_odd_level=\u5076\u6570\u5C42\u6B21\u8282\u70B9
filter_or=\u6216
-filter_parent=\u7236\u8282\u70b9\u6587\u5b57
-filter_periodic_level=\u5468\u671f\u6027
-filter_priority=\u4f18\u5148\u6743
-filter_regexp_matches=\u6b63\u5219\u8868\u8fbe\u5f0f\u5339\u914d
-filter_reminder=\u63d0\u9192
-filter_reminder_after=\u9884\u5b9a\u5728...\u4e4b\u540e
-filter_reminder_before=\u9884\u5b9a\u5728...\u4e4b\u524d
-filter_reminder_executed=\u5df2\u7ecf\u5f15\u53d1
-filter_reminder_later=\u7a0d\u540e\u5230\u671f
-filter_root=\u6839\u8282\u70b9
-filter_script=\u811a\u672c\u8fc7\u6ee4\u5668
-filter_select=\u9009\u62E9
+filter_parent=\u7236\u8282\u70B9\u6587\u5B57
+filter_periodic_level=\u5468\u671F\u6027
+filter_priority=\u4F18\u5148\u6743
+filter_regexp_matches=\u6B63\u5219\u8868\u8FBE\u5F0F\u5339\u914D
+filter_reminder=\u63D0\u9192
+filter_reminder_after=\u9884\u5B9A\u5728...\u4E4B\u540E
+filter_reminder_before=\u9884\u5B9A\u5728...\u4E4B\u524D
+filter_reminder_executed=\u5DF2\u7ECF\u5F15\u53D1
+filter_reminder_later=\u7A0D\u540E\u5230\u671F
+filter_root=\u6839\u8282\u70B9
+filter_script=\u811A\u672C\u8FC7\u6EE4\u5668
+filter_select=\u9009\u62E9(&S)
filter_selected_node_view=\u76EE\u524D\u9009\u62E9\u7684\u8282\u70B9
-filter_selected_node_view_snapshot=\u5df2\u4fdd\u5b58\u9009\u9879
-filter_style=\u6837\u5f0f
-filter_time=\u65e5\u671f\u8fc7\u6ee4\u5668
-FilterComposerDialog.save=\u4fdd\u5b58(&S)
-filters_not_loaded=\u65e0\u6cd5\u52a0\u8f7d\u8fc7\u6ee4\u5668\uff0c\u6587\u4ef6\u635f\u574f
+filter_selected_node_view_snapshot=\u5DF2\u4FDD\u5B58\u9009\u9879
+filter_style=\u6837\u5F0F
+filter_time=\u65E5\u671F\u8FC7\u6EE4\u5668
+FilterCondition=\u8FC7\u6EE4\u6761\u4EF6
+filterConditions=\u7528\u6237\u5B9A\u4E49\u8FC7\u6EE4\u5668
+filterConditions.noActions=\u65E0\u5DF2\u547D\u540D\u8FC7\u6EE4\u5668
+filters_not_loaded=\u65E0\u6CD5\u52A0\u8F7D\u8FC7\u6EE4\u5668\uFF0C\u6587\u4EF6\u635F\u574F
+find=\u67E5\u627E
find_what=\u67E5\u627E
-FindAction.text=\u67E5\u627E ...
-FirstGroupNodeAction.text=\u8bbe\u5b9a/\u53d6\u6d88 \u7fa4\u7ec4\u5f00\u59cb\u8282\u70b9
+FindAction.text=\u67E5\u627E(&F)\u2026
+FindNextAction.text=\u67E5\u627E\u4E0B\u4E00\u4E2A
+FindPreviousAction.text=\u67E5\u627E\u4E0A\u4E00\u4E2A
+fit_background_to_page=\u80CC\u666F\u56FE\u7247\u9002\u5408\u4E00\u9875
fit_map_to_page=\u9002\u5408\u9875\u9762
-fit_map_to_page_height=\u9002\u5408\u9875\u9762\u9ad8\u5ea6
-fit_map_to_page_width=\u9002\u5408\u9875\u9762\u5bbd\u5ea6
-FitToPage.text=\u7f29\u653e\u4ee5\u9002\u5408\u9875\u9762\u5927\u5c0f
-FitToPage.tooltip=\u8c03\u6574\u7f29\u653e\u4ee5\u4fbf\u6574\u4e2a\u5bfc\u56fe\u9002\u5408\u5f53\u524d\u7a97\u53e3\u5927\u5c0f
+fit_map_to_page_height=\u9002\u5408\u9875\u9762\u9AD8\u5EA6
+fit_map_to_page_width=\u9002\u5408\u9875\u9762\u5BBD\u5EA6
+FitToPage.text=\u7F29\u653E\u4EE5\u9002\u5408\u9875\u9762\u5927\u5C0F
+FitToPage.tooltip=\u8C03\u6574\u7F29\u653E\u4EE5\u4FBF\u6574\u4E2A\u5BFC\u56FE\u9002\u5408\u5F53\u524D\u7A97\u53E3\u5927\u5C0F\u3002
fold=\u6298\u53E0
FoldAllAction.text=\u6298\u53E0\u5168\u90E8
-FoldAllAction.tooltip=<html>\u6298\u53e0\u9009\u4e2d\u7684\u8282\u70b9\u4ee5\u53ca\u5b83\u4eec\u6240\u6709\u7684\u5b50\u8282\u70b9\u3002</html>
-FoldOneLevelAction.text=\u6298\u53e0\u4e00\u7ea7
-FoldOneLevelAction.tooltip=<html>\u4ec5\u6298\u53e0\u9009\u4e2d\u7684\u8282\u70b9\u4e00\u7ea7\u3002</html>
-follow_graphical_link=\u8F6C\u5230:
-FollowLinkAction.text=\u6253\u5F00\u8D85\u94FE\u63A5:
+FoldAllAction.tooltip=<html>\u6298\u53E0\u9009\u4E2D\u7684\u8282\u70B9\u4EE5\u53CA\u5B83\u4EEC\u6240\u6709\u7684\u5B50\u8282\u70B9\u3002</html>
+FoldOneLevelAction.text=\u6298\u53E0\u4E00\u7EA7
+FoldOneLevelAction.tooltip=<html>\u4EC5\u6298\u53E0\u9009\u4E2D\u7684\u8282\u70B9\u4E00\u7EA7\u3002</html>
+follow_clone=\u5185\u5D4C\u4E8E ''{0}''
+follow_graphical_link=\u8F6C\u5230 ''{0}''
+FollowLinkAction.text=\u6253\u5F00\u8D85\u94FE\u63A5
font=\u5B57\u4F53
FontFamilyAction.text=\u5B57\u4F53
FontSizeAction.text=\u5B57\u4F53\u5927\u5C0F
-format_invalid_pattern=\u4e0d\u662f\u6709\u6548\u7684\u6837\u5f0f
-format_menu_cloud_shapes=\u4e91\u72b6\u5305\u88f9(\u65b0\u589e\u6216\u53d8\u5f62)
+format=\u683C\u5F0F(&O)
+format_invalid_pattern=\u4E0D\u662F\u6709\u6548\u7684\u6837\u5F0F
+format_menu_cloud_shapes=\u4E91\u72B6\u5305\u88F9(\u65B0\u589E\u6216\u53D8\u5F62)
format_menu_edge_styles=\u8FDE\u7EBF\u98CE\u683C
format_menu_edge_widths=\u8FDE\u7EBF\u5BBD\u5EA6
-format_panel=\u683c\u5f0f
-FormatCopy.text=\u590d\u5236\u683c\u5f0f
-FormatCopy.tooltip=<html>\u590d\u5236\u4e00\u4e2a\u8282\u70b9\u7684\u683c\u5f0f\u3002</html>
-FormatPaste.text=\u7c98\u8d34\u683c\u5f0f
-FormatPaste.tooltip=<html>\u7c98\u8d34\u4e00\u4e2a\u8282\u70b9\u7684\u683c\u5f0f\u3002</html>
-formats_not_loaded=\u683c\u5f0f\u65e0\u6cd5\u8f7d\u5165\uff0c\u6587\u4ef6\u635f\u6bc1
-formula.error.attributeValueIsNull=\u5c5e\u6027\u503c "{0}" \u662f\u7a7a\u7684
-formula.error.circularReference=\u5faa\u73af\u53c2\u7167: \u8282\u70b9 "{0}" \u7684\u516c\u5f0f\u5f15\u7528\u5230\u81ea\u8eab
-formula.EvaluateAllAction.text=\u8ba1\u7b97\u6240\u6709\u516c\u5f0f
-formula.EvaluateAllAction.tooltip=\u8ba1\u7b97\u5bfc\u56fe\u4e0a\u7684\u6240\u6709\u516c\u5f0f
-formula.menuname=\u516c\u5f0f
-formula_editor=\u7f16\u8f91\u516c\u5f0f
-ForwardAction.text=\u524d\u8fdb
+format_panel=\u683C\u5F0F
+FormatCopy.text=\u590D\u5236\u683C\u5F0F
+FormatCopy.tooltip=<html>\u590D\u5236\u4E00\u4E2A\u8282\u70B9\u7684\u683C\u5F0F\u3002</html>
+FormatPaste.text=\u7C98\u8D34\u683C\u5F0F
+FormatPaste.tooltip=<html>\u7C98\u8D34\u4E00\u4E2A\u8282\u70B9\u7684\u683C\u5F0F\u3002</html>
+formats_not_loaded=\u683C\u5F0F\u65E0\u6CD5\u8F7D\u5165\uFF0C\u6587\u4EF6\u635F\u6BC1
+formula.error.attributeValueIsNull=\u5C5E\u6027\u503C "{0}" \u662F\u7A7A\u7684\u3002
+formula.error.circularReference=\u5FAA\u73AF\u53C2\u7167: \u8282\u70B9 "{0}" \u7684\u516C\u5F0F\u5F15\u7528\u5230\u81EA\u8EAB\u3002
+formula.EvaluateAllAction.text=\u8BA1\u7B97\u6240\u6709\u516C\u5F0F
+formula.EvaluateAllAction.tooltip=\u8BA1\u7B97\u5BFC\u56FE\u4E0A\u7684\u6240\u6709\u516C\u5F0F
+formula.menuname=\u516C\u5F0F
+formula_editor=\u7F16\u8F91\u516C\u5F0F
+ForwardAction.text=\u524D\u8FDB
ForwardAction.tooltip=\u5728\u9009\u4E2D\u7684\u94FE\u4E2D\u524D\u8DF3
-FreeNodeAction.text=\u8bbe\u5b9a/\u53d6\u6d88 \u81ea\u7531\u5b9a\u4f4d\u8282\u70b9
+FreeNodeAction.text=\u8BBE\u5B9A/\u53D6\u6D88 \u81EA\u7531\u5B9A\u4F4D\u8282\u70B9
Freeplane.progress.buildScreen=\u6784\u9020\u5C4F\u5E55...
Freeplane.progress.createController=\u521B\u5EFA\u63A7\u5236\u5668...
Freeplane.progress.createInitialMode=\u521B\u5EFA\u521D\u59CB\u6A21\u5F0F...
@@ -481,54 +515,56 @@ Freeplane.progress.settingPreferences=\u8BBE\u7F6E\u9996\u9009\u9879...
Freeplane.progress.startCreateController=\u5F00\u59CB\u521B\u5EFA\u63A7\u5236\u5668...
Freeplane.progress.updateLookAndFeel=\u66F4\u65B0\u5916\u89C2...
freeplane_reverted=Freeplane_Reverted_
-FreeplaneHelpStarter.text=\u5e2e\u52a9...
-FreeplaneHelpStarter.tooltip=Freeplane\u6269\u5c55\u5e2e\u52a9
-GettingStartedAction.text=\u5feb\u901f\u5165\u95e8
-GotoLinkNodeAction.text=\u8f6c\u81f3\u8fde\u63a5
-GotoNodeAction.text=\u5230\u6307\u5b9aID\u7684\u8282\u70b9...
+FreeplaneHelpStarter.text=\u5E2E\u52A9...
+FreeplaneHelpStarter.tooltip=Freeplane\u6269\u5C55\u5E2E\u52A9
+GettingStartedAction.text=\u5FEB\u901F\u5165\u95E8
+goto=\u8F6C\u5230
+goto.noActions=\u65E0\u76EE\u6807\u8282\u70B9
+GotoLinkNodeAction.text=\u8F6C\u81F3\u8FDE\u63A5
+GotoNodeAction.text=\u5230\u6307\u5B9AID\u7684\u8282\u70B9...
GrabKeyDialog.common.cancel=\u53D6\u6D88
-GrabKeyDialog.common.ok=\u786e\u5b9a
+GrabKeyDialog.common.ok=\u786E\u5B9A
GrabKeyDialog.grab-key.assigned-to=\u6307\u5B9A
GrabKeyDialog.grab-key.assigned-to.none=\u5F53\u524D\u672A\u6307\u5B9A
GrabKeyDialog.grab-key.clear=\u6E05\u9664
GrabKeyDialog.grab-key.remove=\u53BB\u9664
GrabKeyDialog.grab-key.remove-ask=\u786E\u8BA4\u5220\u9664\u6309\u952E?
GrabKeyDialog.grab-key.title=\u8F93\u5165\u65B0\u6309\u952E
-green=\u7eff\u8272
-help=\u5e2e\u52a9(&H)
-HideableAction.tooltip=<html>\u6807\u8bb0\u6bcf\u4e2a\u5df2\u6539\u53d8\u8282\u70b9\u7684\u80cc\u666f\u3002</html>
+green=\u7EFF\u8272
+help=\u5E2E\u52A9(&H)
+HideableAction.tooltip=<html>\u6807\u8BB0\u6BCF\u4E2A\u5DF2\u6539\u53D8\u8282\u70B9\u7684\u80CC\u666F\u3002</html>
HideAllAttributesAction.text=\u9690\u85CF\u6240\u6709\u5C5E\u6027
-HierarchicalIcons2Action.text=\u663e\u793a\u5b50\u8282\u70b9\u56fe\u6807\u7684\u4ea4\u96c6
-HierarchicalIconsAction.text=\u68AF\u7EA7\u56FE\u6807\u663E\u793A
+HierarchicalIcons2Action.text=\u663E\u793A\u5B50\u8282\u70B9\u56FE\u6807\u7684\u4EA4\u96C6
+HierarchicalIconsAction.text=\u663E\u793A\u5206\u7EA7\u56FE\u6807
HierarchicalIconsAction.tooltip=\u4E0D\u8BBA\u5B50\u3001\u4E3B\u8282\u70B9\u7684\u56FE\u6807\uFF0C\u90FD\u5C06\u7F29\u5C0F\u663E\u793A.
-hot_keys=\u5feb\u6377\u952e
-hot_keys_table=\u5feb\u6377\u952e\u5217\u8868
-HotKeyInfoAction.text=\u952e\u53c2\u8003
+hot_keys=\u5FEB\u6377\u952E
+hot_keys_table=\u5FEB\u6377\u952E\u5217\u8868
+HotKeyInfoAction.text=\u952E\u53C2\u8003
html_export_based_on_headings=\u5BFC\u51FA\u4E3A HTML - \u57FA\u4E8E\u65B9\u4F4D
html_export_fold_all=\u5BFC\u51FA\u4E3A HTML - \u5168\u90E8\u6298\u53E0
html_export_fold_currently_folded=\u5BFC\u51FA\u4E3A HTML - \u4FDD\u6301\u6298\u53E0
html_export_no_folding=\u5BFC\u51FA\u4E3A HTML - \u4E0D\u6298\u53E0
-html_problem=<html>\u65e0\u6cd5\u6e32\u67d3HTMLl<br><br>{0}
+html_problem=<html>\u65E0\u6CD5\u6E32\u67D3HTMLl<br><br>{0}
icon_0%=0%
icon_100%=100%
icon_25%=25%
icon_50%=50%
icon_75%=75%
-icon_addition=\u52a0
+icon_addition=\u52A0
icon_attach=\u6709\u9644\u4EF6
-icon_audio=\u97f3\u9891
-icon_back=\u540e\u9000
+icon_audio=\u97F3\u9891
+icon_back=\u540E\u9000
icon_bee=Freeplane
-icon_bell=\u8bb0\u4f4f
+icon_bell=\u8BB0\u4F4F
icon_bookmark=\u6781\u597D
icon_broken-line=\u65AD\u5F00
-icon_button_cancel=\u53d6\u6d88
+icon_button_cancel=\u53D6\u6D88
icon_button_ok=OK
icon_calendar=\u65E5\u671F
-icon_checked=\u9009\u62e9
+icon_checked=\u9009\u62E9
icon_clanbomber=\u5371\u9669
icon_clock=\u65F6\u95F4
-icon_clock2=\u63d0\u9192
+icon_clock2=\u63D0\u9192
icon_closed=\u7981\u5165
icon_decrypted=\u89E3\u5BC6
icon_desktop_new=\u5907\u5FD8
@@ -536,9 +572,9 @@ icon_division=\u9664
icon_down=\u4E0B
icon_edit=\u7CBE\u70BC
icon_encrypted=\u52A0\u9501
-icon_executable=\u53ef\u6267\u884c
-icon_family=\u5bb6\u5ead
-icon_fema=\u7537\u6027\u4e0e\u5973\u6027
+icon_executable=\u53EF\u6267\u884C
+icon_family=\u5BB6\u5EAD
+icon_fema=\u7537\u6027\u4E0E\u5973\u6027
icon_female1=\u5973\u60271
icon_female2=\u5973\u60272
icon_females=\u5973\u6027
@@ -550,9 +586,9 @@ icon_flag-orange=\u6A59\u65D7
icon_flag-pink=\u7C89\u65D7
icon_flag-yellow=\u9EC4\u65D7
icon_folder=\u6587\u4EF6\u5939
-icon_forward=\u524d\u8fdb
+icon_forward=\u524D\u8FDB
icon_freemind_butterfly=FreeMind
-icon_full-0=\u4f18\u5148\u7ea7 0
+icon_full-0=\u4F18\u5148\u7EA7 0
icon_full-1=\u4F18\u5148\u7EA7 1
icon_full-2=\u4F18\u5148\u7EA7 2
icon_full-3=\u4F18\u5148\u7EA7 3
@@ -562,310 +598,342 @@ icon_full-6=\u4F18\u5148\u7EA7 6
icon_full-7=\u4F18\u5148\u7EA7 7
icon_full-8=\u4F18\u5148\u7EA7 8
icon_full-9=\u4F18\u5148\u7EA7 9
-icon_go=\u7eff\u8272\u4ea4\u901a\u706f
+icon_go=\u7EFF\u8272\u4EA4\u901A\u706F
icon_gohome=\u5BB6
-icon_group=\u7ec4
+icon_group=\u7EC4
icon_help=\u95EE\u9898
icon_hourglass=\u7B49\u5F85
-icon_icon_not_found=\u672a\u53d1\u73b0\u56fe\u6807
+icon_icon_not_found=\u672A\u53D1\u73B0\u56FE\u6807
icon_idea=\u60F3\u6CD5
-icon_image=\u56fe\u7247
-icon_info=\u4fe1\u606f
-icon_internet=\u56e0\u7279\u7f51
-icon_internet_warning=\u56e0\u7279\u7f51\u8b66\u544a
+icon_image=\u56FE\u7247
+icon_info=\u4FE1\u606F
+icon_internet=\u56E0\u7279\u7F51
+icon_internet_warning=\u56E0\u7279\u7F51\u8B66\u544A
icon_kaddressbook=\u7535\u8BDD
icon_kmail=\u7535\u90AE
icon_knotify=\u97F3\u4E50
icon_korn=\u90AE\u7BB1
icon_ksmiletris=\u9AD8\u5174
-icon_launch=\u542f\u52a8
+icon_launch=\u542F\u52A8
icon_licq=\u7F8E\u597D
icon_list=\u5217\u8868
icon_Mail=\u90AE\u4EF6
icon_male1=\u7537\u60271
icon_male2=\u7537\u60272
icon_males=\u7537\u6027
-icon_menu=\u56fe\u6807(&C)
+icon_menu=\u56FE\u6807(&C)
icon_messagebox_warning=\u91CD\u8981
-icon_mindmap=\u601d\u7ef4\u5bfc\u56fe
-icon_multiplication=\u4e58
-icon_narrative=\u53d9\u8ff0\u7684
-icon_negative=\u6d88\u6781\u7684
-icon_neutral=\u4e2d\u7acb\u7684
-icon_password=\u5bc6\u7801
+icon_mindmap=\u601D\u7EF4\u5BFC\u56FE
+icon_multiplication=\u4E58
+icon_narrative=\u53D9\u8FF0\u7684
+icon_negative=\u6D88\u6781\u7684
+icon_neutral=\u4E2D\u7ACB\u7684
+icon_password=\u5BC6\u7801
icon_pencil=\u6709\u5F85\u63A8\u6572
icon_penguin=Linux\u4F01\u9E45
-icon_positive=\u79ef\u6781\u7684
-icon_prepare=\u9ec4\u8272\u4ea4\u901a\u706f
-icon_revision=\u4fee\u8ba2
+icon_positive=\u79EF\u6781\u7684
+icon_prepare=\u9EC4\u8272\u4EA4\u901A\u706F
+icon_revision=\u4FEE\u8BA2
icon_smiley-angry=\u751F\u6C14
icon_smiley-neutral=\u6CA1\u5174\u8DA3
icon_smiley-oh=\u60CA\u8BB6
icon_smily_bad=\u6211\u4E0D\u9AD8\u5174
icon_stop=\u505C\u6B62
icon_stop-sign=\u505C\u6B62
-icon_subtraction=\u51cf
-icon_unchecked=\u672a\u9009\u62e9
+icon_subtraction=\u51CF
+icon_unchecked=\u672A\u9009\u62E9
icon_up=\u4E0A
-icon_user_icon=\u7528\u6237\u56fe\u6807
-icon_very_negative=\u975e\u5e38\u6d88\u6781\u7684
-icon_very_positive=\u975e\u5e38\u79ef\u6781\u7684
-icon_video=\u89c6\u9891
+icon_user_icon=\u7528\u6237\u56FE\u6807
+icon_very_negative=\u975E\u5E38\u6D88\u6781\u7684
+icon_very_positive=\u975E\u5E38\u79EF\u6781\u7684
+icon_video=\u89C6\u9891
icon_wizard=\u9B54\u6CD5
icon_xmag=\u6709\u5F85\u8BA8\u8BBA
icon_yes=\u91CD\u8981
-IconGroupPopupAction.arrows.text=\u7bad\u5934
-IconGroupPopupAction.docs_folders.text=\u6587\u4ef6&\u6587\u4ef6\u5939
-IconGroupPopupAction.flags.text=\u65d7\u5b50
-IconGroupPopupAction.math.text=\u6570\u5b66
-IconGroupPopupAction.media.text=\u5a92\u4f53
+IconGroupPopupAction.arrows.text=\u7BAD\u5934
+IconGroupPopupAction.docs_folders.text=\u6587\u4EF6&\u6587\u4EF6\u5939
+IconGroupPopupAction.flags.text=\u65D7\u5B50
+IconGroupPopupAction.math.text=\u6570\u5B66
+IconGroupPopupAction.media.text=\u5A92\u4F53
IconGroupPopupAction.miscellaneous.text=\u6742\u9879
-IconGroupPopupAction.nature.text=\u81ea\u7136
-IconGroupPopupAction.numbers.text=\u6570\u5b57
-IconGroupPopupAction.office.text=\u529e\u516c
-IconGroupPopupAction.people.text=\u4eba
-IconGroupPopupAction.rating.text=\u8bc4\u5b9a
-IconGroupPopupAction.signs.text=\u6807\u5fd7
-IconGroupPopupAction.smiley.text=\u8868\u60c5\u7b26
-IconGroupPopupAction.time.text=\u65f6\u95f4
-IconGroupPopupAction.user.text=\u7528\u6237\u56fe\u6807
-IconProgressExtended10Action.text=\u5ef6\u957f\u8fdb\u5ea6 10%
-IconProgressExtended10Action.tooltip=<html>\u52a0\u5165\u8fdb\u5ea6\u6307\u6807: \u4e4b\u540e\u7528\u9f20\u6807\u5de6\u952e\u53cc\u70b9\u51fb\u53ef\u589e\u52a010% ; <br>\u6bcf\u6b21Control + \u9f20\u6807\u5de6\u952e\u53cc\u70b9\u51fb\u53ef\u51cf\u5c1110% \u76f4\u81f3\u79fb\u9664\u6307\u6807.</html>
-IconProgressExtended25Action.text=\u5ef6\u957f\u8fdb\u5ea6 25%
-IconProgressExtended25Action.tooltip=<html>\u52a0\u5165\u8fdb\u5ea6\u6307\u6807: \u4e4b\u540e\u7528\u9f20\u6807\u5de6\u952e\u53cc\u70b9\u51fb\u53ef\u589e\u52a025% ; <br>\u6bcf\u6b21Control + \u9f20\u6807\u5de6\u952e\u53cc\u70b9\u51fb\u53ef\u51cf\u5c1125% \u76f4\u81f3\u79fb\u9664\u6307\u6807.</html>
-IconProgressIconDownAction.text=\u8fdb\u5ea6\u51cf\u5c11
-IconProgressIconDownAction.tooltip=\u51cf\u5c11/\u63d2\u5165/\u79fb\u9664\u8fdb\u5c55\u56fe\u6807(100% -> 75% -> 50% -> 25% -> 0% -> \u79fb\u9664).
-IconProgressIconUpAction.text=\u8fdb\u5ea6\u589e\u52a0
-IconProgressIconUpAction.tooltip=\u589e\u52a0/\u63d2\u5165\u8fdb\u5c55\u56fe\u6807(0% -> 25% -> 50% -> 75% -> 100% + OK).
-IconProgressRemoveAction.text=\u79fb\u9664\u8fdb\u5ea6
-IconProgressRemoveAction.tooltip=\u79fb\u9664\u8fdb\u5ea6\u56fe\u6807\u548c\u5ef6\u4f38\u8fdb\u5ea6\u56fe\u6807
-IconSelectionPlugin.text=\u9009\u62e9\u56fe\u6807...
-IconSelectionPlugin.tooltip=<html>\u5728\u6b64\u4f7f\u7528\u5b50\u7a97\u53e3\u9009\u62e9\u56fe\u6807\u3002</html>
-image_covertLink=\u5c06\u94fe\u63a5\u8f6c\u5316\u6210\u56fe\u7247
-ImageFlavorHandler=\u56fe\u7247(\u4f7f\u7528\u4e0d\u540c\u7684\u6587\u4ef6)
-import=\u5BFC\u5165
-import_linked_branch_no_link=\u9009\u4e2d\u7684\u8282\u70b9\u6ca1\u6709\u8fde\u63a5\u53ef\u4ee5\u5bfc\u5165\u3002
-ImportAction.text=\u5bfc\u5165(&I)
-ImportBranchAction.text=\u5206\u679d...
-ImportExplorerFavoritesAction.text=\u6536\u85CF\u5939...
-ImportFolderStructureAction.text=\u76EE\u5F55\u7ED3\u6784...
-ImportLinkedBranchAction.text=\u94FE\u63A5\u56FE
-ImportLinkedBranchWithoutRootAction.text=\u94FE\u63A5\u56FE(\u4E0D\u5E26\u6839\u8282\u70B9)...
+IconGroupPopupAction.nature.text=\u81EA\u7136
+IconGroupPopupAction.numbers.text=\u6570\u5B57
+IconGroupPopupAction.office.text=\u529E\u516C
+IconGroupPopupAction.people.text=\u4EBA
+IconGroupPopupAction.rating.text=\u8BC4\u5B9A
+IconGroupPopupAction.signs.text=\u6807\u5FD7
+IconGroupPopupAction.smiley.text=\u8868\u60C5\u7B26
+IconGroupPopupAction.time.text=\u65F6\u95F4
+IconGroupPopupAction.user.text=\u7528\u6237\u56FE\u6807
+IconProgressExtended10Action.text=\u5EF6\u957F\u8FDB\u5EA6 10%
+IconProgressExtended10Action.tooltip=<html>\u52A0\u5165\u8FDB\u5EA6\u6307\u6807: \u4E4B\u540E\u7528\u9F20\u6807\u5DE6\u952E\u53CC\u70B9\u51FB\u53EF\u589E\u52A010% ; <br>\u6BCF\u6B21Control + \u9F20\u6807\u5DE6\u952E\u53CC\u70B9\u51FB\u53EF\u51CF\u5C1110% \u76F4\u81F3\u79FB\u9664\u6307\u6807.</html>
+IconProgressExtended25Action.text=\u5EF6\u957F\u8FDB\u5EA6 25%
+IconProgressExtended25Action.tooltip=<html>\u52A0\u5165\u8FDB\u5EA6\u6307\u6807: \u4E4B\u540E\u7528\u9F20\u6807\u5DE6\u952E\u53CC\u70B9\u51FB\u53EF\u589E\u52A025% ; <br>\u6BCF\u6B21Control + \u9F20\u6807\u5DE6\u952E\u53CC\u70B9\u51FB\u53EF\u51CF\u5C1125% \u76F4\u81F3\u79FB\u9664\u6307\u6807.</html>
+IconProgressIconDownAction.text=\u8FDB\u5EA6\u51CF\u5C11
+IconProgressIconDownAction.tooltip=\u51CF\u5C11/\u63D2\u5165/\u79FB\u9664\u8FDB\u5C55\u56FE\u6807(100% -> 75% -> 50% -> 25% -> 0% -> \u79FB\u9664).
+IconProgressIconUpAction.text=\u8FDB\u5EA6\u589E\u52A0
+IconProgressIconUpAction.tooltip=\u589E\u52A0/\u63D2\u5165\u8FDB\u5C55\u56FE\u6807(0% -> 25% -> 50% -> 75% -> 100% + OK).
+IconProgressRemoveAction.text=\u79FB\u9664\u8FDB\u5EA6
+IconProgressRemoveAction.tooltip=\u79FB\u9664\u8FDB\u5EA6\u56FE\u6807\u548C\u5EF6\u4F38\u8FDB\u5EA6\u56FE\u6807\u3002
+icons=\u56FE\u6807
+IconSelectionPlugin.text=\u9009\u62E9\u56FE\u6807...
+IconSelectionPlugin.tooltip=<html>\u5728\u6B64\u4F7F\u7528\u5B50\u7A97\u53E3\u9009\u62E9\u56FE\u6807\u3002</html>
+image_covertLink=\u5C06\u94FE\u63A5\u8F6C\u5316\u6210\u56FE\u7247
+ImageFlavorHandler=\u56FE\u7247(\u4F7F\u7528\u4E0D\u540C\u7684\u6587\u4EF6)
+import=\u5BFC\u5165(&M)
+import_linked_branch_no_link=\u9009\u4E2D\u7684\u8282\u70B9\u6CA1\u6709\u8FDE\u63A5\u53EF\u4EE5\u5BFC\u5165\u3002
+ImportAction.text=\u5BFC\u5165(I)
+ImportBranchAction.text=\u5206\u652F...
+ImportExplorerFavoritesAction.text=\u6D4F\u89C8\u6536\u85CF\u5939...
+ImportFolderStructureAction.text=\u6587\u4EF6\u5939\u7ED3\u6784...
+ImportLinkedBranchAction.text=\u5DF2\u94FE\u63A5\u5206\u652F
+ImportLinkedBranchWithoutRootAction.text=\u5DF2\u94FE\u63A5\u5206\u652F(\u4E0D\u542B\u6839\u8282\u70B9)...
ImportMindmanagerFiles.text=MindManager X5 \u5BFC\u56FE...
+ImportXmlFile.text=\u5BFC\u5165 xml \u6587\u4EF6
increase_branch_font_size=\u52A0\u5927\u5B57\u4F53
IncreaseNodeFontAction.text=\u52A0\u5927\u5B57\u4F53
-internal_error_tooltip=\u5185\u90e8\u9519\u8bef\u53d1\u751f, \u70b9\u51fb\u6253\u5f00\u6700\u65b0\u7684log.0\u6587\u4ef6\u8fdb\u884c\u67e5\u8be2
-invalid_export_file=\u65e0\u6548\u7684\u5bfc\u51fa\u6587\u4ef6\u540d
-invalid_file_msg=\u627e\u4e0d\u5230{0}\u7684\u6587\u4ef6
-invalid_uri=\u65e0\u6548\u7684URI{0}
-invalid_url=\u65e0\u6cd5\u521b\u5efa\u6709\u6548\u7684URL
-invalid_url_msg=\u65e0\u6cd5\u4e3a{0}\u521b\u5efa\u6709\u6548\u7684URL
+internal_error_tooltip=\u5185\u90E8\u9519\u8BEF\u53D1\u751F, \u70B9\u51FB\u6253\u5F00\u6700\u65B0\u7684log.0\u6587\u4EF6\u8FDB\u884C\u67E5\u8BE2\u3002
+invalid_export_file=\u65E0\u6548\u7684\u5BFC\u51FA\u6587\u4EF6\u540D
+invalid_file_msg=\u627E\u4E0D\u5230{0}\u7684\u6587\u4EF6
+invalid_uri=\u65E0\u6548\u7684URI{0}
+invalid_url=\u65E0\u6CD5\u521B\u5EFA\u6709\u6548\u7684URL
+invalid_url_msg=\u65E0\u6CD5\u4E3A{0}\u521B\u5EFA\u6709\u6548\u7684URL
ItalicAction.text=\u659C\u4F53
italicise_branch=\u659C\u4F53\u5316
-java_version=Java\u7248\u672c\uff1a{0}
-JoinNodesAction.text=\u5408\u5E76\u8282\u70B9
-LatexDeleteLatexAction.text=\u79fb\u9664LaTeX\u516c\u5f0f
-LatexEditLatexAction.text=\u7f16\u8f91LaTeX\u516c\u5f0f
-LatexInsertLatexAction.text=\u65b0\u589eLaTeX\u516c\u5f0f
-less_than_two_selected_nodes=\u81f3\u5c11\u5fc5\u987b\u9009\u62e9\u4e24\u4e2a\u8282\u70b9\u8fdb\u884c\u8fde\u63a5\u3002
-license=\u8bb8\u53ef
+java_version=Java\u7248\u672C\uFF1A{0}
+JoinNodesAction.separator.format=\u7528 "{0}" \u8FDE\u63A5\u8282\u70B9
+lastOpenedMaps=\u6700\u8FD1\u5BFC\u56FE
+lastOpenedMaps.noActions=\u5386\u53F2\u8BB0\u5F55\u4E2D\u65E0\u5BFC\u56FE
+latex_editor=\u7F16\u8F91 LaTeX \u516C\u5F0F
+LatexDeleteLatexAction.text=\u79FB\u9664 LaTeX \u516C\u5F0F
+LatexEditLatexAction.text=\u7F16\u8F91 LaTeX \u516C\u5F0F...
+LatexInsertLatexAction.msg1=<html>You are trying to insert a <i>legacy</i> LaTeX formula.<br/>The new way to create LaTeX text/formulae is described on this page:</html>
+LatexInsertLatexAction.msg2=<html>In short: <ul><li>use a "\\latex " prefix in node text or</li><li><i>View->Properties panel</i>, then <i>Core text->Format->Latex</i></li></ul></html>
+LatexInsertLatexAction.text=\u6DFB\u52A0 LaTeX \u516C\u5F0F...
+latexPatternFormat=LaTeX
+LengthUnits.cm=\u5398\u7C73
+LengthUnits.in=\u82F1\u5BF8
+LengthUnits.mm=\u6BEB\u7C73
+LengthUnits.pt=pt
+LengthUnits.px=px
+less_than_two_selected_nodes=\u81F3\u5C11\u5FC5\u987B\u9009\u62E9\u4E24\u4E2A\u8282\u70B9\u8FDB\u884C\u8FDE\u63A5\u3002
+license=\u8BB8\u53EF
license_text=<html>This program is free software; you can redistribute it and/or<br>modify it under the terms of the GNU General Public License<br>as published by the Free Software Foundation; either version 2<br>of the License, or (at your option) any later version.<br><br>This program is distributed in the hope that it will be useful,<br>but WITHOUT ANY WARRANTY; without even the implied warranty of<br>MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>GNU General Public [...]
-link_error=\u9519\u8bef\u8fde\u63a5\u2014{0}\u2014\u6ca1\u6709\u52a0\u8f7d
-link_not_available_any_more=\u8fde\u63a5\u4e0d\u518d\u6709\u6548\u3002\u8282\u70b9\u5df2\u5220\u9664\u3002
+link_error=\u9519\u8BEF\u8FDE\u63A5\u2014{0}\u2014\u6CA1\u6709\u52A0\u8F7D
+link_not_available_any_more=\u8FDE\u63A5\u4E0D\u518D\u6709\u6548\u3002\u8282\u70B9\u5DF2\u5220\u9664\u3002
link_not_found=\u94FE\u63A5 {0} \u672A\u53D1\u73B0.
-load=\u52a0\u8f7d(&L)
-load_accelerator_presets=\u52a0\u8f7d
-LoadAcceleratorPresetsAction.textPatterns.text=\u6587\u672c\u6a21\u5f0f
+links=\u94FE\u63A5
+load=\u52A0\u8F7D(&L)
+load_accelerator_presets=\u52A0\u8F7D
+load_accelerator_presets.noActions=\u65E0\u9884\u8BBE
+LoadAcceleratorPresetsAction.textPatterns.text=\u6587\u672C\u6A21\u5F0F
locking_failed_by_open=\u601D\u7EF4\u5BFC\u56FE {0} \u52A0\u9501\u5931\u8D25. \u4EE5\u53EA\u8BFB\u65B9\u5F0F\u6253\u5F00.
locking_failed_by_save_as=\u601D\u7EF4\u5BFC\u56FE {0} \u52A0\u9501\u5931\u8D25. \u4FDD\u5B58\u52A8\u4F5C\u88AB\u4E2D\u6B62.
locking_old_lock_removed=\u601D\u7EF4\u5BFC\u56FE {0} \u88AB\u7528\u6237 {1} \u52A0\u9501. \u65E7\u9501\u5DF2\u88AB\u79FB\u9664.
long_node_changed_cancel=\u60A8\u786E\u8BA4\u653E\u5F03\u5BF9\u8282\u70B9\u6240\u505A\u66F4\u6539?
long_node_changed_submit=\u60A8\u786E\u8BA4\u4FDD\u5B58\u5BF9\u8282\u70B9\u6240\u505A\u66F4\u6539?
lots_of_links_warning=\u60A8\u6B63\u8981\u5411\u540C\u4E00\u4E2A\u8282\u70B9\u6DFB\u52A0\u5927\u91CF\u94FE\u63A5. \u60A8\u771F\u7684\u60F3\u8981\u521B\u5EFA\u8FD9\u4E9B\u94FE\u63A5\u5417?
-main_resource_directory=\u5b89\u88c5\u8d44\u6e90\uff1a{0}
-MainView.errorUpdateText=\u8f93\u5165\u7684 {0} \u9519\u8bef\u5730\u8bbe\u5b9a\u6587\u5b57
-ManageAddOnsAction.text=\u9644\u52a0\u7ec4\u4ef6
-ManageAddOnsDialog.activate=\u542f\u7528
-ManageAddOnsDialog.activation.success={0} \u4f1a\u5728\u91cd\u65b0\u542f\u52a8\u540e\u542f\u7528
+main_menu=\u83DC\u5355
+main_resource_directory=\u5B89\u88C5\u8D44\u6E90\uFF1A{0}
+MainView.errorUpdateText=\u8F93\u5165\u7684 {0} \u9519\u8BEF\u5730\u8BBE\u5B9A\u6587\u5B57\u3002
+MakeLinkFromAnchorAction.text=\u4ECE\u951A\u70B9\u5EFA\u7ACB\u94FE\u63A5
+MakeLinkFromAnchorAction.tooltip=<html>create a local or global link from<br/>the anchor node to the selected node</html>
+MakeLinkToAnchorAction.text=\u5EFA\u7ACB\u94FE\u63A5\u5230\u951A\u70B9
+MakeLinkToAnchorAction.tooltip=<html>create a local or global link from<br/>the selected note to the anchor node</html>
+ManageAddOnsAction.text=\u9644\u52A0\u7EC4\u4EF6
+ManageAddOnsDialog.activate=\u542F\u7528
+ManageAddOnsDialog.activation.success={0} \u4F1A\u5728\u91CD\u65B0\u542F\u52A8\u540E\u542F\u7528\u3002
ManageAddOnsDialog.authored.by=by {0}
-ManageAddOnsDialog.cannot.activate=\u65e0\u6cd5\u542f\u7528: {0} \u5df2\u7ecf\u5728\u4f7f\u7528\u4e2d
-ManageAddOnsDialog.cannot.configure=\u65e0\u6cd5\u8bbe\u5b9a {0}
-ManageAddOnsDialog.cannot.deactivate=\u65e0\u6cd5\u505c\u7528: {0} \u6ca1\u6709\u88ab\u542f\u7528
-ManageAddOnsDialog.cannot.deinstall=\u65e0\u6cd5\u79fb\u9664 {0}
-ManageAddOnsDialog.configure=\u8bbe\u5b9a
-ManageAddOnsDialog.deactivate=\u505c\u7528
-ManageAddOnsDialog.deactivation.success={0} \u5728\u91cd\u65b0\u542f\u52a8\u540e\u5c06\u505c\u7528
-ManageAddOnsDialog.deinstall=\u79fb\u9664
-ManageAddOnsDialog.deinstallation.success={0} \u5728\u91cd\u65b0\u542f\u52a8\u540e\u5c06\u88ab\u79fb\u9664
-ManageAddOnsDialog.error={0} \u5b89\u88c5\u9519\u8bef
-ManageAddOnsDialog.install=\u5b89\u88dd
-ManageAddOnsDialog.install.from.known.location=\u4ece\u79fb\u690d\u4f4d\u7f6e\u5b89\u88c5\u9644\u4ef6\u7ec4\u4ef6
-ManageAddOnsDialog.install.tooltip=\u5728\u8fd9\u91cc\u63d2\u5165\u9644\u52a0\u5143\u4ef6\u5b89\u88c5\u6587\u4ef6
-ManageAddOnsDialog.map.not.opened=\u601d\u7ef4\u5bfc\u56fe {0} \u672a\u6253\u5f00
-ManageAddOnsDialog.really.deinstall=\u79fb\u9664 {0}?
-ManageAddOnsDialog.search=\u641c\u7d22\u9644\u52a0\u7ec4\u4ef6
-ManageAddOnsDialog.search.file=\u641c\u7d22
-ManageAddOnsDialog.select.tooltip=\u9009\u62e9\u6587\u4ef6
-ManageAddOnsDialog.status.downloading=\u4e0b\u8f7d\u6587\u4ef6...
-ManageAddOnsDialog.status.installing=\u5b89\u88c5\u9644\u52a0\u7ec4\u4ef6...
-ManageAddOnsDialog.status.success={0} \u5b89\u88dd\u6210\u529f
-ManageAddOnsDialog.tab.install=\u641c\u7d22\u548c\u5b89\u88c5
-ManageAddOnsDialog.tab.install.tooltip=\u641c\u7d22\u548c\u5b89\u88c5\u65b0\u9644\u52a0\u7ec4\u4ef6
-ManageAddOnsDialog.tab.manage=\u9644\u52a0\u7ec4\u4ef6
-ManageAddOnsDialog.tab.manage.themes=\u4e3b\u9898
-ManageAddOnsDialog.tab.manage.themes.tooltip=\u7ba1\u7406\u5df2\u5b89\u88c5\u4e3b\u9898
-ManageAddOnsDialog.tab.manage.tooltip=\u7ba1\u7406\u5df2\u5b89\u88c5\u9644\u52a0\u7ec4\u4ef6
-ManageAddOnsDialog.visit.addon.page=\u8bbf\u95ee\u9644\u52a0\u7ec4\u4ef6\u9875
-ManageConditionalStylesAction.text=\u7ba1\u7406\u601d\u7ef4\u5bfc\u56fe\u6761\u4ef6\u6837\u5f0f
-ManageNodeConditionalStylesAction.text=\u7ba1\u7406\u8282\u70b9\u6761\u4ef6\u6837\u5f0f
+ManageAddOnsDialog.cannot.activate=\u65E0\u6CD5\u542F\u7528: {0} \u5DF2\u7ECF\u5728\u4F7F\u7528\u4E2D\u3002
+ManageAddOnsDialog.cannot.configure=\u65E0\u6CD5\u8BBE\u5B9A {0}\u3002
+ManageAddOnsDialog.cannot.deactivate=\u65E0\u6CD5\u505C\u7528: {0} \u6CA1\u6709\u88AB\u542F\u7528\u3002
+ManageAddOnsDialog.cannot.deinstall=\u65E0\u6CD5\u79FB\u9664 {0}\u3002
+ManageAddOnsDialog.configure=\u8BBE\u5B9A
+ManageAddOnsDialog.deactivate=\u505C\u7528
+ManageAddOnsDialog.deactivation.success={0} \u5728\u91CD\u65B0\u542F\u52A8\u540E\u5C06\u505C\u7528\u3002
+ManageAddOnsDialog.deinstall=\u79FB\u9664
+ManageAddOnsDialog.deinstallation.success={0} \u5728\u91CD\u65B0\u542F\u52A8\u540E\u5C06\u88AB\u79FB\u9664\u3002
+ManageAddOnsDialog.error={0} \u5B89\u88C5\u9519\u8BEF\u3002
+ManageAddOnsDialog.install=\u5B89\u88DD
+ManageAddOnsDialog.install.from.known.location=\u4ECE\u79FB\u690D\u4F4D\u7F6E\u5B89\u88C5\u9644\u4EF6\u7EC4\u4EF6
+ManageAddOnsDialog.install.tooltip=\u5728\u8FD9\u91CC\u63D2\u5165\u9644\u52A0\u5143\u4EF6\u5B89\u88C5\u6587\u4EF6
+ManageAddOnsDialog.map.not.opened=\u601D\u7EF4\u5BFC\u56FE {0} \u672A\u6253\u5F00\u3002
+ManageAddOnsDialog.really.deinstall=\u79FB\u9664 {0}?
+ManageAddOnsDialog.search=\u641C\u7D22\u9644\u52A0\u7EC4\u4EF6
+ManageAddOnsDialog.search.file=\u641C\u7D22
+ManageAddOnsDialog.select.tooltip=\u9009\u62E9\u6587\u4EF6
+ManageAddOnsDialog.status.downloading=\u4E0B\u8F7D\u6587\u4EF6...
+ManageAddOnsDialog.status.installing=\u5B89\u88C5\u9644\u52A0\u7EC4\u4EF6...
+ManageAddOnsDialog.status.success={0} \u5B89\u88DD\u6210\u529F\u3002
+ManageAddOnsDialog.tab.install=\u641C\u7D22\u548C\u5B89\u88C5
+ManageAddOnsDialog.tab.install.tooltip=\u641C\u7D22\u548C\u5B89\u88C5\u65B0\u9644\u52A0\u7EC4\u4EF6
+ManageAddOnsDialog.tab.manage=\u9644\u52A0\u7EC4\u4EF6
+ManageAddOnsDialog.tab.manage.themes=\u4E3B\u9898
+ManageAddOnsDialog.tab.manage.themes.tooltip=\u7BA1\u7406\u5DF2\u5B89\u88C5\u4E3B\u9898
+ManageAddOnsDialog.tab.manage.tooltip=\u7BA1\u7406\u5DF2\u5B89\u88C5\u9644\u52A0\u7EC4\u4EF6
+ManageAddOnsDialog.visit.addon.page=\u8BBF\u95EE\u9644\u52A0\u7EC4\u4EF6\u9875\u2026
+ManageConditionalStylesAction.text=\u7BA1\u7406\u601D\u7EF4\u5BFC\u56FE\u7684\u6761\u4EF6\u6837\u5F0F
+ManageNodeConditionalStylesAction.text=\u7BA1\u7406\u8282\u70B9\u7684\u6761\u4EF6\u6837\u5F0F
map_already_exists=\u601D\u7EF4\u5BFC\u56FE\u5DF2\u5B58\u5728\uFF0C\u8981\u8986\u76D6\u5417?
+map_background=\u5BFC\u56FE\u80CC\u666F
+map_background_image=\u80CC\u666F\u56FE\u7247
map_corrupted=\u601D\u7EF4\u5BFC\u56FE\u5DF2\u635F\u574F. \u67E5\u770B\u8BE6\u7EC6\u4FE1\u606F?
-map_load_error=\u4e0d\u80fd\u8f7d\u5165\u601d\u7ef4\u5bfc\u56fe {0}
+map_load_error=\u4E0D\u80FD\u8F7D\u5165\u601D\u7EF4\u5BFC\u56FE {0}
map_locked_by_open=\u601D\u7EF4\u5BFC\u56FE {0} \u5DF2\u88AB\u7528\u6237 {1} \u6253\u5F00. \u5C06\u4EE5\u53EA\u8BFB\u65B9\u5F0F\u6253\u5F00.
map_locked_by_save_as=\u601D\u7EF4\u5BFC\u56FE {0} \u5DF2\u88AB\u7528\u6237 {1} \u6253\u5F00. \u4FDD\u5B58\u52A8\u4F5C\u88AB\u4E2D\u6B62.
map_not_saved=\u8BE5\u5BFC\u56FE\u4ECE\u672A\u4FDD\u5B58\u8FC7.
-MapBackgroundColorAction.text=\u5bfc\u56fe\u80cc\u666f
-MaxNodeWidth.text=\u8bbe\u5b9a\u6700\u5927\u8282\u70b9\u5bbd\u5ea6
-menu_applyStyle=\u5e94\u7528\u6837\u5f0f
-menu_attributes=\u5c5e\u6027(&A)
-menu_clouds=\u4e91\u6846
-menu_copy=\u590d\u5236
-menu_coreFormat=\u8282\u70b9\u6838\u5fc3\u5185\u5bb9
-menu_details=\u660e\u7ec6
-menu_displayAttributes=\u8282\u70b9\u5c5e\u6027
-menu_encryption=\u5bc6\u7801\u4fdd\u62a4
-menu_error=\u7528\u6237\u5b9a\u4e49\u83dc\u5355\u6837\u5f0f\u9519\u8bef {0};\n {1}\n \u9000\u51fa..
-menu_extensions=\u8282\u70b9\u6269\u5c55\u5185\u5bb9
-menu_extras=\u5de5\u5177(&T)
-menu_file_import=\u5bfc\u5165(&M)
-menu_filter=\u8fc7\u6ee4\u5668(&I)
-menu_format=\u683c\u5f0f(&O)
-menu_group=\u8282\u70b9\u7fa4\u7ec4
-menu_hoverView=\u5de5\u5177\u63d0\u793a
-menu_iconByCategory=\u56fe\u6807\u5206\u7c7b..
-menu_iconView=\u56fe\u6807
-menu_image=\u56fe\u7247
-menu_insert=\u63d2\u5165(&S)
-menu_latex_formula=LaTeX\u516c\u5f0f
-menu_links=\u94fe\u63a5
-menu_manageStyles=\u7ba1\u7406\u6837\u5f0f
-menu_moveNode=\u79fb\u52a8\u548c\u6392\u5e8f
-menu_navigate=\u5b9a\u4f4d(&N)
-menu_newNode=\u65b0\u589e\u8282\u70b9
-menu_node=\u8282\u70b9
-menu_node_features=\u8282\u70b9\u7279\u6027
-menu_nodes=\u8282\u70b9
-menu_nodeView=\u8282\u70b9\u6838\u5fc3
-menu_notes=\u6ce8\u89e3
-menu_noteView=\u6ce8\u89e3
-menu_progress=\u8fdb\u5ea6\u56fe\u6807(%)
-menu_remove_icons=\u79fb\u9664\u56fe\u6807
-menu_removeAttribute=\u79fb\u9664\u5c5e\u6027
-menu_select=\u9009\u62e9
-menu_time=\u65f6\u95f4\u7ba1\u7406
-menu_title=\u8282\u70b9\u6838\u5fc3\u5185\u5bb9
-menu_toolbars=\u5de5\u5177\u680f
-menu_view=\u89c6\u56fe(&V)
-menu_viewmode=\u67e5\u770b\u9009\u9879
-MenuUtils.invalid_menuitem={0} \u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u83dc\u5355\u9879\u7684\u952e
+MapBackgroundClearAction.text=\u6E05\u9664
+MapBackgroundColorAction.text=\u80CC\u666F\u989C\u8272
+MapBackgroundImageAction.text=\u80CC\u666F\u56FE\u7247...
+maps=\u5BFC\u56FE
+MaxNodeWidth.text=\u8BBE\u5B9A\u6700\u5927\u8282\u70B9\u5BBD\u5EA6
+menu_applyStyle=\u5E94\u7528\u6837\u5F0F
+menu_attributes=\u5C5E\u6027(&A)
+menu_clouds=\u4E91\u6846
+menu_copy=\u590D\u5236
+menu_coreFormat=\u8282\u70B9\u6838\u5FC3\u5185\u5BB9
+menu_details=\u660E\u7EC6
+menu_displayAttributes=\u8282\u70B9\u5C5E\u6027
+menu_encryption=\u5BC6\u7801\u4FDD\u62A4
+menu_error=\u7528\u6237\u5B9A\u4E49\u83DC\u5355\u6837\u5F0F\u9519\u8BEF {0};\n {1}\n \u9000\u51FA
+menu_extensions=\u8282\u70B9\u6269\u5C55\u5185\u5BB9
+menu_group=\u8282\u70B9\u7FA4\u7EC4
+menu_hoverView=\u5DE5\u5177\u63D0\u793A
+menu_iconByCategory=\u56FE\u6807\u5206\u7C7B..
+menu_iconView=\u56FE\u6807
+menu_image=\u56FE\u7247
+menu_insert=\u63D2\u5165(&S)
+menu_latex_formula=LaTeX\u516C\u5F0F
+menu_manageStyles=\u7BA1\u7406\u6837\u5F0F
+menu_moveNode=\u79FB\u52A8\u548C\u6392\u5E8F
+menu_newNode=\u65B0\u589E\u8282\u70B9
+menu_node=\u8282\u70B9
+menu_node_features=\u8282\u70B9\u7279\u6027
+menu_nodes=\u8282\u70B9
+menu_nodeView=\u8282\u70B9\u6838\u5FC3
+menu_noteView=\u6CE8\u89E3
+menu_openmaps=\u5BFC\u56FE
+menu_remove_icons=\u79FB\u9664\u56FE\u6807
+menu_removeAttribute=\u79FB\u9664\u5C5E\u6027
+menu_select=\u9009\u62E9
+menu_time=\u65F6\u95F4\u7BA1\u7406
+menu_title=\u8282\u70B9\u6838\u5FC3\u5185\u5BB9
+menu_viewmode=\u67E5\u770B\u9009\u9879
+MenuUtils.invalid_menuitem={0} \u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u83DC\u5355\u9879\u7684\u952E\u3002
mindmap=\u601D\u7EF4\u5BFC\u56FE
-MindMapNodesFlavorHandler=\u8282\u70b9\u5c42\u6b21\u7ed3\u6784
-mindmaps=\u601d\u7ef4\u5bfc\u56fe(&M)
+MindMapNodesFlavorHandler=\u8282\u70B9\u5C42\u6B21\u7ED3\u6784
+mindmaps=\u601D\u7EF4\u5BFC\u56FE(&M)
mindmaps_desc=\u601D\u7EF4\u5BFC\u56FE (*.mm)
mindmaps_filter_desc=\u8FC7\u6EE4\u5668 (*.mmfilter)
-MinNodeWidth.text=\u8bbe\u5b9a\u6700\u5c0f\u8282\u70b9\u5bbd\u5ea6
-mode_Browse=\u6d4f\u89c8\u6a21\u5f0f
-mode_File=\u6587\u4ef6\u6a21\u5f0f
-mode_MindMap=\u601d\u7ef4\u5bfc\u56fe\u6a21\u5f0f
+MinNodeWidth.text=\u8BBE\u5B9A\u6700\u5C0F\u8282\u70B9\u5BBD\u5EA6
+mode_Browse=\u6D4F\u89C8\u6A21\u5F0F
+mode_File=\u6587\u4EF6\u6A21\u5F0F
+mode_MindMap=\u601D\u7EF4\u5BFC\u56FE\u6A21\u5F0F
mode_na=\u6A21\u5F0F\u4E0D\u53EF\u7528
-mode_status=\u6a21\u5f0f\u6539\u53d8\u4e3a{0}
+mode_status=\u6A21\u5F0F\u6539\u53D8\u4E3A{0}
+mode_StyleMap=\u7F16\u8F91\u6837\u5F0F
mode_title=\u601D\u7EF4\u5BFC\u56FE - {0} \u6A21\u5F0F
modes=\u6A21\u5F0F
-ModesMenuAction.Browse.text=\u5bfc\u56fe\u6d4f\u89c8\u5668
-ModesMenuAction.File.text=\u6587\u4ef6\u7ba1\u7406\u5668
-ModesMenuAction.MindMap.text=\u601d\u7ef4\u5bfc\u56fe\u7f16\u8f91\u5668
-most_recent_files=\u6700\u8fd1\u6587\u4ef6(&M)
+ModesMenuAction.Browse.text=\u5BFC\u56FE\u6D4F\u89C8\u5668
+ModesMenuAction.File.text=\u6587\u4EF6\u7BA1\u7406\u5668
+ModesMenuAction.MindMap.text=\u601D\u7EF4\u5BFC\u56FE\u7F16\u8F91\u5668
+most_recent_files=\u6700\u8FD1\u6587\u4EF6(&M)
+MoveAction.text=\u79FB\u52A8
MoveToRootAction.text=\u8F6C\u5230\u6839\u8282\u70B9
-NameConditionAction.text=\u8bbe\u5b9a\u540d\u79f0
-NavigationNextMapAction.text=\u540e\u4e00\u4e2a\u56fe
-NavigationPreviousMapAction.text=\u524d\u4e00\u4e2a\u56fe
-new=\u65b0\u5efa
-new_map_from_user_templates.text=\u65b0\u601d\u7ef4\u5bfc\u56fe(\u4ece\u6a21\u7248...)
+NameConditionAction.text=\u8BBE\u5B9A\u540D\u79F0
+navigate=\u5B9A\u4F4D(&N)
+NavigationNextMapAction.text=\u540E\u4E00\u4E2A\u56FE
+NavigationPreviousMapAction.text=\u524D\u4E00\u4E2A\u56FE
+new=\u65B0\u5EFA
+new_map_from_user_templates.text=\u4ECE\u6A21\u677F\u65B0\u5EFA\u5BFC\u56FE...
new_mindmap=\u65B0\u5EFA\u601D\u7EF4\u5BFC\u56FE
new_node=\u65B0\u589E\u8282\u70B9
-new_node_as_sibling_not_possible_for_the_root=\u65B0\u8282\u70B9\u4E0D\u53EF\u80FD\u662F\u6839\u8282\u70B9\u7684\u5E73\u884C\u8282\u70B9\u3002
-new_version_available=\u53d1\u73b0\u65b0\u7248\u672c ''{0}''
+new_node_as_sibling_not_possible_for_the_root=\u65B0\u8282\u70B9\u4E0D\u53EF\u80FD\u662F\u6839\u8282\u70B9\u7684\u5E73\u884C\u8282\u70B9
+new_version_available=\u53D1\u73B0\u65B0\u7248\u672C ''{0}''
NewChildAction.text=\u63D2\u5165\u5B50\u8282\u70B9
-NewerFileRevisionsFoundDialog.cancel=\u8df3\u8fc7(&S)
-NewerFileRevisionsFoundDialog.cancel.tooltip=\u4e0d\u6253\u5f00\u8fd9\u4e2a\u6587\u4ef6
-NewerFileRevisionsFoundDialog.file_last_modified=\u65f6\u95f4\u6233
-NewerFileRevisionsFoundDialog.file_name=\u6587\u4ef6
-NewerFileRevisionsFoundDialog.file_size=\u5b57\u8282
-NewerFileRevisionsFoundDialog.open=\u6253\u5f00\u6587\u4ef6
-NewerFileRevisionsFoundDialog.open.tooltip=\u6253\u5f00\u6587\u4ef6\u5373\u4f7f\u5b83\u53ef\u80fd\u4e0d\u662f\u6700\u65b0\u7248\u672c
-NewerFileRevisionsFoundDialog.question=\u53d1\u73b0 {0} \u7684\u8f83\u65b0\u7248\u672c
-NewerFileRevisionsFoundDialog.restore=\u6062\u590d
-NewerFileRevisionsFoundDialog.restore.tooltip=\u7528 {1} \u66ff\u6362 {0}
-NewerFileRevisionsFoundDialog.title=\u53d1\u73b0\u8f83\u65b0\u7684\u95ee\u4ef7\u7248\u672c
-NewFreeNodeAction.text=\u65b0\u589e\u81ea\u7531\u8282\u70b9
-NewLevelStyleAction.text=\u65b0\u589e\u5c42\u6b21\u6837\u5f0f
-newmap.install.addon.question={0} \u662f\u4e00\u4e2a\u9644\u52a0\u7ec4\u4ef6\u5305\n\u4f60\u60f3\u5b89\u88c5\u5b83\u4e48?\n(\u9ed8\u8ba4\u9009\u62e9"\u5426".)
-newmap.install.addon.title=\u5b89\u88c5\u9644\u52a0\u7ec4\u4ef6\uff1f
-NewMapAction.text=\u65B0\u5EFA
-NewMapViewAction.text=\u65b0\u601d\u7ef4\u5bfc\u56fe
-NewParentNode.text=\u65b0\u5efa\u7236\u8282\u70b9
-NewParentNode.tooltip=<html>\u6240\u6709\u9009\u4e2d\u7684\u53d1\u9001\u5230\u4e00\u4e2a\u65b0\u7236\u8282\u70b9\u3002</html>
-NewPreviousSiblingAction.text=\u63d2\u5165\u5e73\u884c\u8282\u70b9(\u4e0a\u65b9)
-NewSiblingAction.text=\u63d2\u5165\u5e73\u884c\u8282\u70b9(\u4e0b\u65b9)
-NewSummaryAction.text=\u6dfb\u52a0\u603b\u7ed3\u8282\u70b9(\u9009\u53d6\u8282\u70b9)
-NewUserStyleAction.text=\u65b0\u81ea\u5b9a\u6837\u5f0f(\u4ece\u9009\u53d6\u4e2d)
-NextNodeAction.BACK.text=\u524d\u4e00\u8282\u70b9
-NextNodeAction.BACK_N_FOLD.text=\u524d\u4e00\u8282\u70b9(\u6298\u53e0)
-NextNodeAction.FORWARD.text=\u4e0b\u4e00\u8282\u70b9
-NextNodeAction.FORWARD_N_FOLD.text=\u4e0b\u4e00\u8282\u70b9(\u6298\u53e0)
-NextPresentationItemAction.text=\u5c55\u5f00\u4e0b\u4e00\u4e2a\u6f14\u793a\u6761\u76ee
+NewerFileRevisionsFoundDialog.cancel=\u8DF3\u8FC7(&S)
+NewerFileRevisionsFoundDialog.cancel.tooltip=\u4E0D\u6253\u5F00\u8FD9\u4E2A\u6587\u4EF6
+NewerFileRevisionsFoundDialog.file_last_modified=\u65F6\u95F4\u6233
+NewerFileRevisionsFoundDialog.file_name=\u6587\u4EF6
+NewerFileRevisionsFoundDialog.file_size=\u5B57\u8282
+NewerFileRevisionsFoundDialog.open=\u6253\u5F00\u6587\u4EF6
+NewerFileRevisionsFoundDialog.open.tooltip=\u6253\u5F00\u6587\u4EF6\u5373\u4F7F\u5B83\u53EF\u80FD\u4E0D\u662F\u6700\u65B0\u7248\u672C
+NewerFileRevisionsFoundDialog.question=\u53D1\u73B0 {0} \u7684\u8F83\u65B0\u7248\u672C\uFF01
+NewerFileRevisionsFoundDialog.restore=\u6062\u590D
+NewerFileRevisionsFoundDialog.restore.tooltip=\u7528 {1} \u66FF\u6362 {0}
+NewerFileRevisionsFoundDialog.title=\u53D1\u73B0\u8F83\u65B0\u7684\u6587\u4EF6\u7248\u672C\uFF01
+NewFreeNodeAction.text=\u65B0\u5EFA\u6D6E\u52A8\u8282\u70B9
+NewLevelStyleAction.text=\u65B0\u589E\u5C42\u6B21\u6837\u5F0F
+newmap.install.addon.question={0} \u662F\u4E00\u4E2A\u9644\u52A0\u7EC4\u4EF6\u5305\n\u4F60\u60F3\u5B89\u88C5\u5B83\u4E48?\n(\u9ED8\u8BA4\u9009\u62E9"\u5426".)
+newmap.install.addon.title=\u5B89\u88C5\u9644\u52A0\u7EC4\u4EF6\uFF1F
+NewMapAction.text=\u65B0\u5EFA\u5BFC\u56FE
+NewMapViewAction.text=\u65B0\u601D\u7EF4\u5BFC\u56FE
+NewParentNode.text=\u65B0\u5EFA\u7236\u8282\u70B9
+NewParentNode.tooltip=<html>\u6240\u6709\u9009\u4E2D\u7684\u53D1\u9001\u5230\u4E00\u4E2A\u65B0\u7236\u8282\u70B9\u3002</html>
+NewPreviousSiblingAction.text=\u63D2\u5165\u5E73\u884C\u8282\u70B9(\u4E0A\u65B9)
+NewSiblingAction.text=\u63D2\u5165\u5E73\u884C\u8282\u70B9(\u4E0B\u65B9)
+NewSummaryAction.text=\u6DFB\u52A0\u603B\u7ED3\u8282\u70B9(\u9009\u53D6\u8282\u70B9)
+NewUserStyleAction.text=\u65B0\u81EA\u5B9A\u6837\u5F0F(\u4ECE\u9009\u53D6\u4E2D)
+NextNodeAction.BACK.text=\u524D\u4E00\u8282\u70B9
+NextNodeAction.BACK_N_FOLD.text=\u524D\u4E00\u8282\u70B9(\u6298\u53E0)
+NextNodeAction.FORWARD.text=\u4E0B\u4E00\u8282\u70B9
+NextNodeAction.FORWARD_N_FOLD.text=\u4E0B\u4E00\u8282\u70B9(\u6298\u53E0)
+NextPresentationItemAction.text=\u5C55\u5F00\u4E0B\u4E00\u4E2A\u6F14\u793A\u6761\u76EE
no=\u5426
-no_copy_attributes_before_paste_attributes=\u4f60\u65e0\u6cd5\u5728\u590d\u5236\u5c5e\u6027\u524d\u5c31\u53bb\u8d34\u4e0a\u5c5e\u6027.
-NO_FORMAT=\u6587\u672c(\u65e0\u683c\u5f0f)
-no_format_copy_before_format_paste=\u7c98\u8d34\u683c\u5f0f\u524d\u5fc5\u987b\u5148\u8fdb\u884c\u590d\u5236\u3002
-no_found_from=\u672A\u627E\u5230 "{0}" \u5728 "{1}" \u4E2D.
-no_more_found_from=\u6CA1\u6709\u627E\u5230\u66F4\u591A\u7684 "{0}" \u5728 "{1}" \u4E2D.
+no_copy_attributes_before_paste_attributes=\u4F60\u65E0\u6CD5\u5728\u590D\u5236\u5C5E\u6027\u524D\u5C31\u53BB\u8D34\u4E0A\u5C5E\u6027.
+NO_FORMAT=\u6587\u672C(\u65E0\u683C\u5F0F)
+no_format_copy_before_format_paste=\u7C98\u8D34\u683C\u5F0F\u524D\u5FC5\u987B\u5148\u8FDB\u884C\u590D\u5236\u3002
+no_found_from=<html>\u672A\u627E\u5230 <u>"{0}"</u> \u5728 "{1}" \u4E2D\u3002</html>
+no_more_found_from=<html>\u6CA1\u6709\u627E\u5230\u66F4\u591A\u7684 <u>"{0}"</u> \u5728 "{1}" \u4E2D\u3002</html>
no_previous_find=\u524D\u8FB9\u6CA1\u6709\u4E86.
-no_styles_found_in_map=\u5728\u601d\u7ef4\u5bfc\u56fe\u4e2d\u627e\u4e0d\u5230\u6837\u5f0f
+no_styles_found_in_map=\u5728\u601D\u7EF4\u5BFC\u56FE\u4E2D\u627E\u4E0D\u5230\u6837\u5F0F
node=\u8282\u70B9(node)
node_changed_discard_changes=\u60A8\u786E\u8BA4\u653E\u5F03\u5BF9\u8282\u70B9\u6240\u505A\u66F4\u6539?
-node_is_write_protected=\u76ee\u6807\u8282\u70b9\u5199\u4fdd\u62a4\u3002
+node_is_write_protected=\u76EE\u6807\u8282\u70B9\u5199\u4FDD\u62A4\u3002
node_location_help=\u62D6\u62C9\u6539\u53D8\u8282\u70B9\u7684\u4F4D\u7F6E, ctrl+\u62D6\u62C9 \u6539\u53D8\u8DDD\u79BB, \u53CC\u51FB\u548C ctrl+\u53CC\u51FB \u91CD\u7F6E.
-node_selector=\u8282\u70b9\u9009\u53d6
-node_selector_message=\u53cc\u51fb\u9009\u53d6\u8282\u70b9
-node_styles=\u8282\u70b9\u6837\u5f0f
+node_popup_scripting=\u811A\u672C
+node_selector=\u8282\u70B9\u9009\u53D6
+node_selector_message=\u53CC\u51FB\u9009\u53D6\u8282\u70B9
+node_styles=\u8282\u70B9\u6837\u5F0F
NodeBackgroundColorAction.text=\u8282\u70B9\u80CC\u666F\u989C\u8272...
NodeColorAction.text=\u8282\u70B9\u989C\u8272 ...
NodeColorBlendAction.text=\u8272\u5F69\u6DF7\u5408
NodeDownAction.text=\u4E0B\u79FB
-NodeExtensions.EditNodeExtensions=\u7f16\u8f91\u8282\u70b9\u6269\u5c55\u6027\u8d28
-NodeExtensions.RemoveNodeExtensions=\u79fb\u9664\u8282\u70b9\u6269\u5c55\u6027\u8d28
+NodeExtensions.EditNodeExtensions=\u7F16\u8F91\u8282\u70B9\u6269\u5C55\u6027\u8D28
+NodeExtensions.RemoveNodeExtensions=\u79FB\u9664\u8282\u70B9\u6269\u5C55\u6027\u8D28
NodeListAction.text=\u67E5\u627E\u5E76\u66FF\u6362...
NodeListAction.tooltip=\u4EE5\u5E26\u8FC7\u6EE4\u5668\u5C5E\u6027\u7684\u53EF\u641C\u7D22\u5217\u8868\u663E\u793A\u6240\u6709\u8282\u70B9.
NodeShapeAction.bubble.text=\u6CE1\u6846
NodeShapeAction.fork.text=\u53C9\u72B6
+NodeShapeAction.narrow_hexagon.text=\u72ED\u7A84\u516D\u89D2\u5F62
+NodeShapeAction.oval.text=\u692D\u5706\u5F62
+NodeShapeAction.rectangle.text=\u77E9\u5F62
+NodeShapeAction.wide_hexagon.text=\u5BBD\u516D\u89D2\u5F62
NodeUpAction.text=\u4E0A\u79FB
-NodeWidthAction.text=\u8bbe\u5b9a\u8282\u70b9\u5bbd\u5ea6\u9650\u5236...
+NodeWidthAction.text=\u8BBE\u5B9A\u8282\u70B9\u5BBD\u5EA6\u9650\u5236...
nonboldify_branch=\u53D6\u6D88\u52A0\u7C97
nonitalicise_branch=\u53D6\u6D88\u659C\u4F53
normal=\u5E38\u89C4
-not_saved_for_image_error=\u4f7f\u7528\u6587\u4ef6\u9009\u62e9\u5668\u8bbe\u7f6e\u56fe\u7247\u524d\u5fc5\u987b\u5148\u4fdd\u5b58\u5bfc\u56fe
-not_saved_for_link_error=\u7528\u6587\u4EF6\u9009\u62E9\u5668\u6DFB\u52A0\u6587\u4EF6\u94FE\u63A5\u524D\u5FC5\u987B\u5148\u4FDD\u5B58\u56FE\u3002
-note_window_location=\u6ce8\u89e3\u7a97\u53e3\u4f4d\u7f6e
-ok=\u786e\u5b9a(&O)
-OKAction.text=\u786e\u5b9a (&O)
-OnlineReference.text=\u601d\u7ef4\u5bfc\u56fe\u5728\u7ebf\u6587\u6863
-open_asMindMap=\u601d\u7ef4\u5bfc\u56fe
-OpenAction.text=\u6253\u5F00...
+not_saved_for_image_error=\u4F7F\u7528\u6587\u4EF6\u9009\u62E9\u5668\u8BBE\u7F6E\u56FE\u7247\u524D\u5FC5\u987B\u5148\u4FDD\u5B58\u5BFC\u56FE
+not_saved_for_link_error=\u7528\u6587\u4EF6\u9009\u62E9\u5668\u6DFB\u52A0\u6587\u4EF6\u94FE\u63A5\u524D\u5FC5\u987B\u5148\u4FDD\u5B58\u56FE
+note_window_location=\u6CE8\u89E3\u7A97\u53E3\u4F4D\u7F6E
+notes=\u6CE8\u89E3
+NotificationOptions.CLOSE=\u5173\u95ED
+NotificationOptions.REMIND_ME_LATER=\u7A0D\u540E\u63D0\u9192\u6211
+NotificationOptions.REMOVE_REMINDER=\u79FB\u9664\u63D0\u9192
+NotificationOptions.SELECT_NODE=\u8F6C\u5230\u63D0\u9192
+ok=\u786E\u5B9A(&O)
+OKAction.text=\u786E\u5B9A (O)
+OnlineReference.text=\u601D\u7EF4\u5BFC\u56FE\u5728\u7EBF\u6587\u6863
+open_asMindMap=\u601D\u7EF4\u5BFC\u56FE
+OpenAction.text=\u6253\u5F00\u5DF2\u4FDD\u5B58\u5BFC\u56FE...
OpenFreeplaneSiteAction.text=Freeplane\u7F51\u7AD9\u9996\u9875
-OpenPathAction.text=\u6253\u5f00\u6587\u4ef6
-OpenURLMapAction.text=\u4eceURL\u6253\u5f00\u601d\u7ef4\u5bfc\u56fe
-OpenUserDirAction.text=\u6253\u5f00\u7528\u6237\u76ee\u5f55
+OpenMapsAddLocation.text=\u6DFB\u52A0 OpenMaps \u4F4D\u7F6E...
+OpenMapsRemoveLocation.text=\u79FB\u9664 OpenMaps \u4F4D\u7F6E
+OpenMapsViewLocation.text=\u67E5\u770B OpenMaps \u4F4D\u7F6E...
+OpenPathAction.text=\u6253\u5F00\u6587\u4EF6
+OpenURLMapAction.text=\u4ECEURL\u6253\u5F00\u601D\u7EF4\u5BFC\u56FE\u2026
+OpenUserDirAction.text=\u6253\u5F00\u7528\u6237\u76EE\u5F55
option_changes_may_require_restart=\u91CD\u65B0\u542F\u52A8Freeplane\u540E, \u624D\u53EF\u770B\u5230\u66F4\u6539\u8BBE\u7F6E\u7684\u6548\u679C.
OptionalDontShowMeAgainDialog.cancel=\u5426(&N)
OptionalDontShowMeAgainDialog.dontShowAgain=\u4E0D\u7528\u518D\u8BE2\u95EE\u6211(&D).
@@ -873,64 +941,67 @@ OptionalDontShowMeAgainDialog.ok=\u662F(&Y)
OptionalDontShowMeAgainDialog.rememberMyDescision=\u8BB0\u4F4F\u6211\u7684\u51B3\u5B9A(&R).
OptionPanel.absolute=\u7EDD\u5BF9
OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=\u81EA\u52A8\u5E03\u5C40\u6A21\u5F0F
-OptionPanel.ADD_CHILD=\u6dfb\u52a0\u5b50\u8282\u70b9
-OptionPanel.ADD_SIBLING=\u6dfb\u52a0\u5144\u5f1f\u8282\u70b9
-OptionPanel.addons=\u9644\u52a0\u7ec4\u4ef6
-OptionPanel.always_fold_all_after_load=\u5168\u90e8\u6298\u53e0
-OptionPanel.always_load_last_maps=\u52a0\u8f7d\u4e0a\u6b21\u5bfc\u56fe\u548c\u65b0\u5bfc\u56fe
-OptionPanel.always_load_last_maps.tooltip=\u901a\u8fc7\u4e0a\u9762\u7684\u9009\u9879\u6253\u5f00\u4e0a\u6b21\u6587\u4ef6\uff0c\u751a\u81f3\u5728\u7528\u9009\u4e2d\u7684\u5bfc\u56fe\u6587\u4ef6\u542f\u52a8FreePlane\u65f6\u4e5f\u6709\u6548\u3002
-OptionPanel.always_save_folding=\u603b\u662f
-OptionPanel.always_save_folding_state=\u603b\u662f\u4fdd\u5b58\u6298\u53e0\u72b6\u6001\u7684\u6539\u53d8
-OptionPanel.always_save_folding_state.tooltip=\u5982\u679c\u9009\u4e2d\uff0c\u6bcf\u6b21\u6298\u53e0\u52a8\u4f5c\u90fd\u4f1a\u5bfc\u81f4\u5bfc\u56fe\u6539\u53d8\u5e76\u63d0\u9192\u7528\u6237\u4fdd\u5b58\u3002
-OptionPanel.always_unfold_all_after_load=\u5c55\u5f00\u6240\u6709
+OptionPanel.ADD_CHILD=\u6DFB\u52A0\u5B50\u8282\u70B9
+OptionPanel.ADD_SIBLING=\u6DFB\u52A0\u5144\u5F1F\u8282\u70B9
+OptionPanel.addons=\u9644\u52A0\u7EC4\u4EF6
+OptionPanel.always_fold_all_after_load=\u5168\u90E8\u6298\u53E0
+OptionPanel.always_load_last_maps=\u52A0\u8F7D\u4E0A\u6B21\u5BFC\u56FE\u548C\u65B0\u5BFC\u56FE
+OptionPanel.always_load_last_maps.tooltip=\u901A\u8FC7\u4E0A\u9762\u7684\u9009\u9879\u6253\u5F00\u4E0A\u6B21\u6587\u4EF6\uFF0C\u751A\u81F3\u5728\u7528\u9009\u4E2D\u7684\u5BFC\u56FE\u6587\u4EF6\u542F\u52A8FreePlane\u65F6\u4E5F\u6709\u6548\u3002
+OptionPanel.always_save_folding=\u603B\u662F
+OptionPanel.always_save_folding_state=\u603B\u662F\u4FDD\u5B58\u6298\u53E0\u72B6\u6001\u7684\u6539\u53D8
+OptionPanel.always_save_folding_state.tooltip=\u5982\u679C\u9009\u4E2D\uFF0C\u6BCF\u6B21\u6298\u53E0\u52A8\u4F5C\u90FD\u4F1A\u5BFC\u81F4\u5BFC\u56FE\u6539\u53D8\u5E76\u63D0\u9192\u7528\u6237\u4FDD\u5B58\u3002
+OptionPanel.always_show_less_than_N_nodes_after_load=\u5C55\u5F00\u4E00\u4E9B\u8282\u70B9
+OptionPanel.always_unfold_all_after_load=\u5C55\u5F00\u6240\u6709
OptionPanel.antialias=\u5E73\u6ED1
OptionPanel.antialias.tooltip=<html>\u786E\u5B9A\u56FE\u7684\u8D28\u91CF. \u8D8A\u5E73\u6ED1\u5904\u7406\u65F6\u95F4\u8D8A\u957F.</html>
OptionPanel.antialias_all=\u5E73\u6ED1\u5168\u90E8
OptionPanel.antialias_edges=\u5E73\u6ED1\u8FDE\u7EBF
OptionPanel.antialias_none=\u4E0D\u5E73\u6ED1
OptionPanel.Appearance=\u5916\u89C2
-OptionPanel.apply_system_screen_resolution=\u5e94\u7528\u7cfb\u7edf\u9ed8\u8ba4\u7684\u5c4f\u5e55\u5206\u8fa8\u7387
-OptionPanel.approximate_search_threshold=\u8fd1\u4f3c\u5339\u914d\u9608\u503c
-OptionPanel.approximate_search_threshold.tooltip=<HTML>\u8fd1\u4f3c\u5339\u914d\u9608\u503c<br/> <font size="2">\u8be6\u60c5\u8bf7\u81f3http://freeplane.sf.net/wiki/index.php/Approximate_search < / FONT > <br/> \uff08\u8d8a\u9ad8\u4f1a\u53d1\u73b0\u8d8a\u5c11\u7684\u641c\u7d22\u7ed3\u679c<br/> \uff09 </ HTML >
+OptionPanel.apply_system_screen_resolution=\u5E94\u7528\u7CFB\u7EDF\u9ED8\u8BA4\u7684\u5C4F\u5E55\u5206\u8FA8\u7387
+OptionPanel.approximate_search_threshold=\u8FD1\u4F3C\u5339\u914D\u9608\u503C
+OptionPanel.approximate_search_threshold.tooltip=<html>\u8FD1\u4F3C\u5339\u914D\u9608\u503C<br/> <font size="2">\u8BE6\u60C5\u8BF7\u81F3 http://freeplane.sf.net/wiki/index.php/Approximate_search </font><br/>\uFF08\u8D8A\u9AD8\u4F1A\u53D1\u73B0\u8D8A\u5C11\u7684\u641C\u7D22\u7ED3\u679C<br/>\uFF09 </html>
OptionPanel.ar=\u963F\u6839\u5EF7\u8BED
-OptionPanel.ARC=\u5f27\u5f62
+OptionPanel.ARC=\u5F27\u5F62
OptionPanel.as_parent=\u540C\u7236\u8282\u70B9
OptionPanel.ask=\u8BE2\u95EE
OptionPanel.automatic=\u81EA\u52A8
OptionPanel.automaticFormat_level=\u81EA\u52A8\u5E03\u5C40\u6837\u5F0F
OptionPanel.automaticFormat_level1=\u6839\u8282\u70B9\u683C\u5F0F
OptionPanel.automaticFormat_level2=1. \u7EA7\u8282\u70B9\u683C\u5F0F
-OptionPanel.backup_file_number=\u4fdd\u5b58\u5907\u4efd\u6587\u4ef6\u7684\u4e2a\u6570
+OptionPanel.backup_file_number=\u4FDD\u5B58\u5907\u4EFD\u6587\u4EF6\u7684\u4E2A\u6570
OptionPanel.Behaviour=\u884C\u4E3A
OptionPanel.bezier=\u8D1D\u585E\u5C14\u66F2\u7EBF
-OptionPanel.bubble=\u6c14\u6ce1
-OptionPanel.ca=\u52a0\u6cf0\u7f57\u5c3c\u4e9a\u8bed
+OptionPanel.bubble=\u6C14\u6CE1
+OptionPanel.ca=\u52A0\u6CF0\u7F57\u5C3C\u4E9A\u8BED
OptionPanel.Cancel=\u53D6\u6D88
-OptionPanel.center_selected_node=\u5c06\u9009\u4e2d\u7684\u8282\u70b9\u5c45\u4e2d
-OptionPanel.check_updates_automatically=\u7a0b\u5e8f\u542f\u52a8\u65f6\u68c0\u67e5\u66f4\u65b0
+OptionPanel.center_selected_node=\u5C06\u9009\u4E2D\u7684\u8282\u70B9\u5C45\u4E2D
+OptionPanel.check_updates_automatically=\u7A0B\u5E8F\u542F\u52A8\u65F6\u68C0\u67E5\u66F4\u65B0
OptionPanel.childpattern=\u5B50\u6A21\u5F0F
OptionPanel.childpattern.tooltip=\u5BF9\u6240\u6709\u5B50\u8282\u70B9\u5E94\u7528\u6307\u5B9A\u7684\u6A21\u5F0F.
OptionPanel.clear_all_setters=\u5207\u6362\u6240\u6709\u8BBE\u5B9A
OptionPanel.clear_all_setters.tooltip=\u542F\u7528\u6216\u7981\u7528\u6240\u6709\u53D8\u66F4\u6307\u793A.
-OptionPanel.cloud=\u4e91\u6846
-OptionPanel.cloudcolor=\u4e91\u6846\u548c\u989c\u8272
-OptionPanel.cloudshape=\u4e91\u7684\u5f62\u72b6
+OptionPanel.cloud=\u4E91\u6846
+OptionPanel.cloudcolor=\u4E91\u6846\u548C\u989C\u8272
+OptionPanel.cloudshape=\u4E91\u7684\u5F62\u72B6
OptionPanel.combined=\u7EC4\u5408
-OptionPanel.compare_as_number=\u6570\u5b57\u6bd4\u5bf9
+OptionPanel.compare_as_number=\u6570\u5B57\u6BD4\u5BF9
OptionPanel.convert_to_current_version=<html>\u81EA\u52A8\u5C06\u65E7\u7248\u672C Freeplane \u5BFC\u56FE\u8F6C\u6362\u4E3A <br>\u5F53\u524D\u7684\u7248\u672C?</html>
OptionPanel.convert_to_current_version.tooltip=<html>\u53EA\u4E3A\u65E0\u9700\u8F6C\u6362\u7684\u975E\u5E38\u5927\u7684\u5BFC\u56FE <br>(\u8FD9\u662F\u4E13\u5BB6\u77E5\u8BC6\u5E93) \u4F60\u53EF\u4EE5\u65E0\u9700\u8F6C\u6362\u6253\u5F00\u5BFC\u56FE.</html>
+OptionPanel.copyFormatToNewSibling=\u590D\u5236\u683C\u5F0F\u5230\u65B0\u540C\u7EA7
+OptionPanel.copyFormatToNewSiblingIncludesIcons=\u590D\u5236\u683C\u5F0F(\u542B\u56FE\u6807)
OptionPanel.cs=\u6377\u514B\u8BED
OptionPanel.cut_nodes_without_question=\u65E0\u9700\u786E\u8BA4\u5373\u526A\u5207\u8282\u70B9?
OptionPanel.cut_nodes_without_question.tooltip=\u5982\u679C\u52FE\u9009\u6B64\u590D\u9009\u6846\uFF0C\u5C06\u65E0\u9700\u786E\u8BA4\u5373\u526A\u5207\u8282\u70B9. \u8FD9\u53EF\u80FD\u5BFC\u81F4\u65E0\u610F\u4E2D\u4E22\u5931\u4FE1\u606F.
OptionPanel.da=\u4E39\u9EA6\u8BED
-OptionPanel.date_format=\u6807\u51c6\u65e5\u671f\u683c\u5f0f
-OptionPanel.date_format.tooltip=SHORT, MEDIUM, LONG, FULL \u6216\u662f"MM/dd/yyyy" \u4e4b\u4efb\u4e00\u4e2a
-OptionPanel.datetime_format=\u6807\u51c6\u65e5\u671f\u65f6\u95f4\u683c\u5f0f
-OptionPanel.datetime_format.tooltip=<datestyle>,<timestyle> ( SHORT, MEDIUM, LONG, \u6216FULL) \u6216\u662f"M/d/yyyy hh:mm" \u4e4b\u4efb\u4e00\u4e2a
+OptionPanel.date_format=\u6807\u51C6\u65E5\u671F\u683C\u5F0F
+OptionPanel.date_format.tooltip=SHORT, MEDIUM, LONG, FULL \u6216\u662F"MM/dd/yyyy" \u4E4B\u4EFB\u4E00\u4E2A
+OptionPanel.datetime_format=\u6807\u51C6\u65E5\u671F\u65F6\u95F4\u683C\u5F0F
+OptionPanel.datetime_format.tooltip=<datestyle>,<timestyle> ( SHORT, MEDIUM, LONG, \u6216FULL) \u6216\u662F"M/d/yyyy hh:mm" \u4E4B\u4EFB\u4E00\u4E2A
OptionPanel.de=\u5FB7\u8BED
OptionPanel.default=\u9ED8\u8BA4
-OptionPanel.default_attribute_key_column_width=\u6807\u51c6\u5c5e\u6027\u952e\u5bbd\u5ea6
-OptionPanel.default_attribute_value_column_width=\u6807\u51c6\u5c5e\u6027\u503c\u5bbd\u5ea6
+OptionPanel.default_attribute_key_column_width=\u6807\u51C6\u5C5E\u6027\u952E\u5BBD\u5EA6
+OptionPanel.default_attribute_value_column_width=\u6807\u51C6\u5C5E\u6027\u503C\u5BBD\u5EA6
OptionPanel.default_browser_command_mac=Mac\u9ED8\u8BA4\u6D4F\u89C8\u5668\u547D\u4EE4
OptionPanel.default_browser_command_mac.tooltip=<html> and MAC: (\u611F\u8C22 Nick!)</html>
OptionPanel.default_browser_command_other_os=\u5176\u5B83\u64CD\u4F5C\u7CFB\u7EDF\u7684\u9ED8\u8BA4\u6D4F\u89C8\u5668\u547D\u4EE4
@@ -939,7 +1010,8 @@ OptionPanel.default_browser_command_windows_9x=Windows 9x\u9ED8\u8BA4\u6D4F\u89C
OptionPanel.default_browser_command_windows_9x.tooltip=<html>Windows (\u94FE\u63A5\u4E2D\u7684""\u662F\u5FC5\u9700\u7684 , URL\u4E2D\u6709"=").</html>
OptionPanel.default_browser_command_windows_nt=Windows Nt \u9ED8\u8BA4\u6D4F\u89C8\u5668\u547D\u4EE4
OptionPanel.default_browser_command_windows_nt.tooltip=<html>Windows (\u94FE\u63A5\u4E2D\u7684""\u662F\u5FC5\u9700\u7684 , URL\u4E2D\u6709"=").</html>
-OptionPanel.default_charset=\u5b57\u7b26\u96c6
+OptionPanel.default_charset=\u5B57\u7B26\u96C6
+OptionPanel.default_save_dir=\u9ED8\u8BA4\u4FDD\u5B58\u76EE\u5F55
OptionPanel.Defaults=\u9ED8\u8BA4
OptionPanel.delete_automatic_saves_at_exit=\u9000\u51FA\u65F6\u5220\u9664\u81EA\u52A8\u4FDD\u5B58\u7684\u5907\u4EFD
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> \u5F53\u8BBE\u7F6E\u4E3Atrue\u65F6\uFF0C\u5982\u679CFreeplane\u6B63\u5E38\u9000\u51FA\uFF0C\u5C06\u81EA\u52A8\u5220\u9664\u5907\u4EFD\u6587\u4EF6</html>
@@ -947,20 +1019,20 @@ OptionPanel.delete_nodes_without_question=\u65E0\u9700\u786E\u8BA4\u5373\u5220\u
OptionPanel.delete_nodes_without_question.tooltip=\u5982\u679C\u52FE\u9009\u6B64\u590D\u9009\u6846\uFF0C\u5C06\u65E0\u9700\u786E\u8BA4\u5373\u5220\u9664\u8282\u70B9. \u8FD9\u53EF\u80FD\u5BFC\u81F4\u65E0\u610F\u4E2D\u4E22\u5931\u4FE1\u606F.
OptionPanel.disable_cursor_move_paper=\u62D6\u52A8\u65F6\u7981\u6B62\u6307\u9488
OptionPanel.disable_cursor_move_paper.tooltip=<html>\u62D6\u52A8\u9875\u9762\u65F6\u4E0D\u663E\u793A\u9F20\u6807\u6307\u9488</html>
-OptionPanel.display_inline_editor_for_all_new_nodes=\u5bf9\u6240\u6709\u65b0\u8282\u70b9\u663e\u793a\u5185\u5d4c\u7f16\u8f91\u5217
-OptionPanel.display_node_id=\u663e\u793a\u8282\u70b9ID
+OptionPanel.display_inline_editor_for_all_new_nodes=\u5BF9\u6240\u6709\u65B0\u8282\u70B9\u663E\u793A\u5185\u5D4C\u7F16\u8F91\u5217
+OptionPanel.display_node_id=\u663E\u793A\u8282\u70B9ID
OptionPanel.edgecolor=\u8FDE\u7EBF\u989C\u8272
OptionPanel.edgecolor.tooltip=\u7236\u8282\u70B9\u7684\u8FDE\u7EBF\u5C5E\u6027 (\u4E5F\u9002\u7528\u4E8E\u6240\u6709\u5B50\u8282\u70B9)
OptionPanel.edgestyle=\u8FDE\u7EBF\u6837\u5F0F
OptionPanel.edgestyle.tooltip=\u7236\u8282\u70B9\u7684\u8FDE\u7EBF\u5C5E\u6027 (\u4E5F\u9002\u7528\u4E8E\u6240\u6709\u5B50\u8282\u70B9)
OptionPanel.edgewidth=\u8FDE\u7EBF\u5BBD\u5EA6
OptionPanel.edgewidth.tooltip=\u7236\u8282\u70B9\u7684\u8FDE\u7EBF\u5C5E\u6027 (\u4E5F\u9002\u7528\u4E8E\u6240\u6709\u5B50\u8282\u70B9)
-OptionPanel.EDIT_CURRENT=\u8986\u76d6\u5185\u5bb9
-OptionPanel.edit_on_double_click=\u53cc\u51fb\u65f6\u7f16\u8f91
-OptionPanel.editor_extra_width=\u989d\u5916\u5bbd\u5ea6\u8ddd\u79bb
-OptionPanel.editor_extra_width.tooltip=<html>\u5f53\u6587\u5b57\u8d85\u8fc7\u76ee\u524d\u5bbd\u5ea6\u65f6\uff0c\u51b3\u5b9a\u8981\u589e\u52a0\u7684\u5bbd\u5ea6\u7684\u50cf\u7d20\u503c .</html>
-OptionPanel.el=\u5e0c\u814a\u8bed
-OptionPanel.el__buttons_above=\u9876\u7aef\u6309\u94ae
+OptionPanel.EDIT_CURRENT=\u8986\u76D6\u5185\u5BB9
+OptionPanel.edit_on_double_click=\u53CC\u51FB\u65F6\u7F16\u8F91
+OptionPanel.editor_extra_width=\u989D\u5916\u5BBD\u5EA6\u8DDD\u79BB
+OptionPanel.editor_extra_width.tooltip=<html>\u5F53\u6587\u5B57\u8D85\u8FC7\u76EE\u524D\u5BBD\u5EA6\u65F6\uFF0C\u51B3\u5B9A\u8981\u589E\u52A0\u7684\u5BBD\u5EA6\u7684\u50CF\u7D20\u503C .</html>
+OptionPanel.el=\u5E0C\u814A\u8BED
+OptionPanel.el__buttons_above=\u9876\u7AEF\u6309\u94AE
OptionPanel.el__enter_confirms_by_default=\u9ED8\u8BA4\u8FDB\u5165\u786E\u8BA4
OptionPanel.el__max_default_window_height=\u9ED8\u8BA4\u7A97\u53E3\u6700\u5927\u9AD8\u5EA6
OptionPanel.el__max_default_window_width=\u9ED8\u8BA4\u7A97\u53E3\u6700\u5927\u5BBD\u5EA6
@@ -970,8 +1042,9 @@ OptionPanel.el__position_window_below_node=\u8282\u70B9\u4E0B\u4F4D\u7F6E\u7A97\
OptionPanel.en=\u82F1\u8BED
OptionPanel.Environment=\u73AF\u5883
OptionPanel.es=\u897F\u73ED\u7259\u8BED
-OptionPanel.et=\u7231\u6c99\u5c3c\u4e9a\u8bed
-OptionPanel.execute_scripts_without_asking=\u65E0\u9700\u786E\u8BA4\u6267\u884C\u811A\u672C?
+OptionPanel.et=\u7231\u6C99\u5C3C\u4E9A\u8BED
+OptionPanel.eu=\u5DF4\u65AF\u514B\u8BED
+OptionPanel.execute_scripts_without_asking=\u542F\u7528\u811A\u672C\u6267\u884C
OptionPanel.execute_scripts_without_asking.tooltip=<html>Freeplane \u811A\u672C\u53EF\u80FD\u5728\u4F60\u7684\u7535\u8111\u4E0A\u6267\u884C\u4EFB\u4F55\u52A8\u4F5C. <br>\u5982\u679C\u60A8\u4E0D\u80FD\u80AF\u5B9A\u8FD9\u4E9B\u811A\u672C\u7684\u5B89\u5168\u6027\u8BF7\u4E0D\u8981\u6267\u884C\u5B83\u4EEC.</html>
OptionPanel.execute_scripts_without_exec_restriction=\u5141\u8BB8\u6267\u884C\u5176\u4ED6\u5E94\u7528\u7A0B\u5E8F(\u4E0D\u63A8\u8350)
OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>\u5982\u679C\u4F60\u7684Groovy\u811A\u672C\u9700\u8981\u6267\u884C\u5176\u5B83\u7279\u6B8A\u7684\u5E94\u7528\u7A0B\u5E8F(\u5982\u6D4F\u89C8\u5668)\u800C\u4E0D\u8FDB\u884C\u8BE2\u95EE(!),<br>\u5C31\u5FC5\u987B\u5141\u8BB8\u6B64\u9009\u9879. <br>\u4F46\u8BF7\u5C0F\u5FC3\u4F7F\u7528\uFF0C\u56E0\u4E3A\u6076\u610F\u811A\u672C\u53EF\u80FD\u635F\u5BB3\u4F60\u7684\u8BA1\u7B97\u673A!</body></html>
@@ -979,30 +1052,35 @@ OptionPanel.execute_scripts_without_file_restriction=\u5141\u8BB8\u6587\u4EF6\u6
OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>\u5982\u679C\u4F60\u7684Groovy\u811A\u672C\u9700\u8981\u6267\u884C\u7279\u6B8A\u7684\u6587\u4EF6\u64CD\u4F5C(\u6253\u5F00\uFF0C\u5173\u95ED\uFF0C\u8BFB\uFF0C\u5199\uFF0C\u5220),<br>\u5C31\u5FC5\u987B\u5141\u8BB8\u6B64\u9009\u9879. <br>\u4F46\u8BF7\u5C0F\u5FC3\u4F7F\u7528\uFF0C\u56E0\u4E3A\u6076\u610F\u811A\u672C\u53EF\u80FD\u635F\u5BB3\u4F60\u7684\u8BA1\u7B97\u673A!</body></html>
OptionPanel.execute_scripts_without_network_restriction=\u5141\u8BB8\u7F51\u7EDC\u64CD\u4F5C(\u4E0D\u63A8\u8350)
OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>\u5982\u679C\u4F60\u7684Groovy\u811A\u672C\u9700\u8981\u6267\u884C\u7279\u6B8A\u7684\u7F51\u7EDC\u64CD\u4F5C\uFF0C<br>\u5C31\u5FC5\u987B\u5141\u8BB8\u6B64\u9009\u9879. <br>\u4F46\u8BF7\u5C0F\u5FC3\u4F7F\u7528\uFF0C\u56E0\u4E3A\u6076\u610F\u811A\u672C\u53EF\u80FD\u635F\u5BB3\u4F60\u7684\u8BA1\u7B97\u673A!</body></html>
-OptionPanel.execute_scripts_without_write_restriction=\u5141\u8bb8\u6587\u4ef6\u8986\u5199 (\u4e0d\u5efa\u8bae)
-OptionPanel.execute_scripts_without_write_restriction.tooltip=<html><body>\u5982\u679c\u4f60\u7684Groovy Scripts \u5199\u5165\u6587\u4ef6\u5199\u5165, \u5220\u9664(!)),<br>\u4f60\u5fc5\u987b\u9009\u62e9\u8fd9\u4e2a, <br>\u6b63\u5e38\u60c5\u51b5\u4e0b\u53ea\u5141\u8bb8\u8bfb.<br>\u4f7f\u7528\u8fd9\u529f\u80fd\u8981\u5c0f\u5fc3,\u56e0\u4e3a\u6076\u610f\u7684scripts \u4f1a\u4f24\u5bb3\u4f60\u7684\u7535\u8111!</body></html>
+OptionPanel.execute_scripts_without_write_restriction=\u5141\u8BB8\u6587\u4EF6\u8986\u5199 (\u4E0D\u5EFA\u8BAE)
+OptionPanel.execute_scripts_without_write_restriction.tooltip=<html><body>\u5982\u679C\u4F60\u7684Groovy Scripts \u5199\u5165\u6587\u4EF6\u5199\u5165, \u5220\u9664(!)),<br>\u4F60\u5FC5\u987B\u9009\u62E9\u8FD9\u4E2A, <br>\u6B63\u5E38\u60C5\u51B5\u4E0B\u53EA\u5141\u8BB8\u8BFB.<br>\u4F7F\u7528\u8FD9\u529F\u80FD\u8981\u5C0F\u5FC3,\u56E0\u4E3A\u6076\u610F\u7684scripts \u4F1A\u4F24\u5BB3\u4F60\u7684\u7535\u8111!</body></html>
OptionPanel.experimental_file_locking_on=\u6587\u4EF6\u9501\u5B9A
OptionPanel.experimental_file_locking_on.tooltip=<html> \u5C1D\u8BD5\u529F\u80FD </html>
OptionPanel.export_icons_in_html=Html\u5BFC\u51FA\u56FE\u6807
OptionPanel.export_icons_in_html.tooltip=<html> \u5BFC\u51FA\u65F6\u662F\u5426\u5305\u542B\u56FE\u6807. \u56FE\u6807\u95EE\u9898\uFF1A\u9891\u7E41\u94FE\u63A5\u7684\u56FE\u6807\u5728\u5BFC\u51FA\u7684HTML\u4E2D\u770B\u4E0D\u5230.</html>
+OptionPanel.exported_image_resolution_dpi=\u5BFC\u51FA\u56FE\u50CF\u5206\u8FA8\u7387 (DPI)
OptionPanel.Files=\u6587\u4EF6
OptionPanel.first=\u5F00\u59CB
-OptionPanel.fold_on_click_inside=\u5728\u5185\u90e8\u70b9\u51fb\u65f6\u6298\u53e0
+OptionPanel.fit_to_viewport=\u80CC\u666F\u56FE\u50CF\u9002\u5408\u7A97\u53E3
+OptionPanel.fold_on_click_inside=\u5728\u5185\u90E8\u70B9\u51FB\u65F6\u6298\u53E0
OptionPanel.foldingsymbolwidth=\u6298\u53E0\u7B26\u53F7\u5BBD\u5EA6
OptionPanel.foldingsymbolwidth.tooltip=<html>\u6298\u53E0\u5706\u6807\u8BB0\u7684\u5BBD\u5EA6</html>
-OptionPanel.fork=\u5206\u53c9
-OptionPanel.format_locale=\u683c\u5f0f\u9002\u7528\u573a\u5408
-OptionPanel.format_locale.tooltip=\u5bf9\u683c\u5f0f\u548c\u8d44\u6599\u89e3\u6790\u7684\u9002\u7528\u573a\u5408\u8bbe\u5b9a
-OptionPanel.formula_disable_caching=\u7981\u7528\u516c\u5f0f\u8ba1\u7b97\u7f13\u5b58
-OptionPanel.formula_disable_plugin=\u7981\u7528\u516c\u5f0f\u8ba1\u7b97
+OptionPanel.fork=\u5206\u53C9
+OptionPanel.format_locale=\u683C\u5F0F\u9002\u7528\u573A\u5408
+OptionPanel.format_locale.tooltip=\u5BF9\u683C\u5F0F\u548C\u8D44\u6599\u89E3\u6790\u7684\u9002\u7528\u573A\u5408\u8BBE\u5B9A
+OptionPanel.formula_disable_caching=\u7981\u7528\u516C\u5F0F\u8BA1\u7B97\u7F13\u5B58
+OptionPanel.formula_disable_plugin=\u7981\u7528\u516C\u5F0F\u8BA1\u7B97
OptionPanel.fr=\u6CD5\u8BED
OptionPanel.gl=\u683C\u9675\u5170\u8BED
-OptionPanel.goto_note_end_on_edit=\u79fb\u52a8\u6ce8\u89e3\u5149\u6807\u5230\u6700\u540e
-OptionPanel.grid_size=\u683c\u70b9\u95f4\u683c\u5927\u5c0f
+OptionPanel.goto_note_end_on_edit=\u79FB\u52A8\u6CE8\u89E3\u5149\u6807\u5230\u6700\u540E
+OptionPanel.grid_size=\u683C\u70B9\u95F4\u683C\u5927\u5C0F
+OptionPanel.groovy_editor_font=Font for Groovy Syntax Highlighting Editor
+OptionPanel.groovy_editor_font.tooltip=Use 'Dialog' or 'Monospaced' if you need unicode chars!
+OptionPanel.groovy_editor_font_size=Font size for Groovy Syntax Highlighting Editor
OptionPanel.gtk=Gtk
-OptionPanel.hide_edge=\u9690\u85cf\u8fde\u7ebf
-OptionPanel.highlight_formulas=\u9ad8\u4eae\u516c\u5f0f
-OptionPanel.horizontal=\u6c34\u5e73
+OptionPanel.hide_edge=\u9690\u85CF\u8FDE\u7EBF
+OptionPanel.highlight_formulas=\u9AD8\u4EAE\u516C\u5F0F
+OptionPanel.horizontal=\u6C34\u5E73
OptionPanel.hr=\u514B\u7F57\u5730\u4E9A\u8BED
OptionPanel.HTML=HTML
OptionPanel.html_export_based_on_headings=\u57FA\u4E8E\u65B9\u4F4D
@@ -1012,126 +1090,148 @@ OptionPanel.html_export_folding=Html\u5BFC\u51FA\u6298\u53E0
OptionPanel.html_export_no_folding=\u4E0D\u6298\u53E0
OptionPanel.hu=\u5308\u7259\u5229\u8BED
OptionPanel.ic_disable=\u7981\u7528
-OptionPanel.ic_file=\u4f7f\u7528\u786c\u76d8
+OptionPanel.ic_file=\u4F7F\u7528\u786C\u76D8
OptionPanel.ic_ram=In RAM
OptionPanel.icon=\u56FE\u6807
OptionPanel.icon.tooltip=\u5982\u679C\u5E94\u7528,\u8282\u70B9\u56FE\u6807\u5C06\u88AB\u8BBE\u7F6E\u4E3A\u8FD9\u4E2A\u56FE\u6807.
-OptionPanel.icons.list=\u53ef\u663e\u793a\u7684\u6807\u51c6\u56fe\u6807\u5217\u8868
-OptionPanel.icons.list.tooltip=\u5728\u6b64\u6392\u5e8f\u6216\u7981\u7528\u6807\u51c6\u56fe\u6807\u3002\u56fe\u6807\u5fc5\u987b\u4ee5\u5206\u53f7';'\u5206\u9694\u3002
-OptionPanel.id=\u5370\u5ea6\u5c3c\u897f\u4e9a\u8bed
-OptionPanel.IGNORE=\u5ffd\u7565
-OptionPanel.il__enter_confirms_by_default=\u7f3a\u7701Enter\u786e\u8ba4
+OptionPanel.icons.list=\u53EF\u663E\u793A\u7684\u6807\u51C6\u56FE\u6807\u5217\u8868
+OptionPanel.icons.list.tooltip=\u5728\u6B64\u6392\u5E8F\u6216\u7981\u7528\u6807\u51C6\u56FE\u6807\u3002\u56FE\u6807\u5FC5\u987B\u4EE5\u5206\u53F7';'\u5206\u9694\u3002
+OptionPanel.id=\u5370\u5EA6\u5C3C\u897F\u4E9A\u8BED
+OptionPanel.IGNORE=\u5FFD\u7565
+OptionPanel.il__enter_confirms_by_default=\u7F3A\u7701Enter\u786E\u8BA4
OptionPanel.image_cache=for images
+OptionPanel.indentationUsesTabsInTextOutput=\u5728\u6587\u672C\u8F93\u51FA\u4E2D\u4F7F\u7528 tab
OptionPanel.it=\u610F\u5927\u5229\u8BED
OptionPanel.ja=\u65E5\u8BED
-OptionPanel.key_type_action=\u6572\u51fb\u952e\u76d8\u65f6
+OptionPanel.JoinNodesAction.textSeparators=\u6587\u672C\u5206\u9694\u7B26
+OptionPanel.key_type_action=\u6572\u51FB\u952E\u76D8\u65F6
OptionPanel.Keystrokes=\u6309\u952E
OptionPanel.ko=\u97E9\u8BED
-OptionPanel.label_font_family=\u5b57\u4f53\u96c6
+OptionPanel.label_font_family=\u5B57\u4F53\u96C6
OptionPanel.label_font_size=\u5B57\u4F53\u5927\u5C0F
OptionPanel.language=\u8BED\u8A00
OptionPanel.language.tooltip=<html>\u7A0B\u5E8F\u6240\u7528\u8BED\u8A00. '\u81EA\u52A8' \u5C06\u5C1D\u8BD5\u52A0\u8F7D\u5F53\u524D\u7528\u6237\u7684\u8BED\u8A00. </html>
OptionPanel.last=\u6700\u540E
OptionPanel.last_opened_list_length=\u2014\u6700\u8FD1\u7684\u6587\u4EF6\u2014\u5217\u8868\u957F\u5EA6
-OptionPanel.layout_map_on_text_change=\u7f16\u8f91\u65f6\u66f4\u65b0\u601d\u7ef4\u5bfc\u56fe
-OptionPanel.layout_map_on_text_change.tooltip=\u4e0d\u4f7f\u7528\u6765\u83b7\u5f97\u66f4\u597d\u7684\u6027\u80fd
-OptionPanel.linear=\u76f4\u7ebf
+OptionPanel.latex_disable_editor=\u7981\u7528 LaTeX \u8BED\u6CD5\u9AD8\u4EAE\u7F16\u8F91\u5668
+OptionPanel.latex_disable_editor.tooltip=\u5982\u679C\u60A8\u9047\u5230 LaTeX \u7F16\u8F91\u5668\u7684\u95EE\u9898\uFF0C\u8BF7\u67E5\u770B\u8FD9\u4E2A
+OptionPanel.latex_editor_font=Font for LaTeX Syntax Highlighting Editor
+OptionPanel.latex_editor_font.tooltip=Use 'Dialog' or 'Monospaced' if you need unicode chars!
+OptionPanel.latex_editor_font_size=Font size for LaTeX Syntax Highlighting Editor
+OptionPanel.latex_macros=\u5E38\u7528 LaTeX \u5B8F
+OptionPanel.layout_map_on_text_change=\u7F16\u8F91\u65F6\u66F4\u65B0\u601D\u7EF4\u5BFC\u56FE
+OptionPanel.layout_map_on_text_change.tooltip=\u4E0D\u4F7F\u7528\u6765\u83B7\u5F97\u66F4\u597D\u7684\u6027\u80FD
+OptionPanel.linear=\u76F4\u7EBF
OptionPanel.links=\u94FE\u63A5
OptionPanel.links.tooltip=<html>\u8BBE\u7F6E\u94FE\u63A5\uFF1A\u76F8\u5BF9\u3001\u7EDD\u5BF9 </html>
-OptionPanel.load_folding=\u52a0\u8f7d\u65f6
-OptionPanel.load_folding_from_map_default_fold_all=\u4ece\u5bfc\u56fe\u52a0\u8f7d\u6216\u6298\u53e0\u5168\u90e8
-OptionPanel.load_folding_from_map_default_unfold_all=\u4ece\u5bfc\u56fe\u52a0\u8f7d\u6216\u5c55\u5f00\u5168\u90e8
+OptionPanel.load_folding=\u52A0\u8F7D\u65F6
+OptionPanel.load_folding_from_map_default_fold_all=\u4ECE\u5BFC\u56FE\u52A0\u8F7D\u6216\u6298\u53E0\u5168\u90E8
+OptionPanel.load_folding_from_map_default_unfold_all=\u4ECE\u5BFC\u56FE\u52A0\u8F7D\u6216\u5C55\u5F00\u5168\u90E8
OptionPanel.load_last_map=\u81EA\u52A8\u6253\u5F00\u6700\u540E\u7684\u5BFC\u56FE
OptionPanel.load_last_map.tooltip=<html>\u5982\u679C\u9009\u4E2D\u7684\u8BDD\uFF0CFreeplane \u542F\u52A8\u65F6\u81EA\u52A8\u52A0\u8F7D\u4E0A\u6B21\u6253\u5F00\u7684\u601D\u7EF4\u5BFC\u56FE.</html>
-OptionPanel.load_last_maps=\u52a0\u8f7d\u4e0a\u6b21\u6240\u6709\u7684\u5bfc\u56fe
+OptionPanel.load_last_maps=\u52A0\u8F7D\u4E0A\u6B21\u6240\u6709\u7684\u5BFC\u56FE
OptionPanel.lookandfeel=\u5916\u89C2\u611F\u89C9
OptionPanel.lookandfeel.tooltip=<html>\u4F7F\u7528\u5916\u89C2\u611F\u89C9. \u652F\u6301 'metal','windows','motif', 'gtk', \u4F7F\u7528MacOS\u65F6 'mac' \u53EF\u7528. \u9ED8\u8BA4\u662F\u6307, \u91C7\u7528\u9ED8\u8BA4\u89C2\u611F. \u5982\u679C\u60F3\u4F7F\u7528\u81EA\u5DF1\u7684\u89C2\u611F, \u8F93\u5165class\u540D\u79F0, \u5E76\u4E14\u786E\u8BA4\u76F8\u5E94\u7684jar\u6587\u4EF6\u88AB\u52A0\u8F7D. \u5982\u679C\u89C2\u611F\u6709\u95EE\u9898, \u9009\u62E9 'nothing' . \u5BF9applet\u540C\u68 [...]
OptionPanel.lt=\u7ACB\u9676\u5B9B\u8BED
-OptionPanel.max_displayed_node_count=\u6700\u5927\u663e\u793a\u8282\u70b9\u6570
-OptionPanel.max_image_width=\u6700\u5927\u521d\u59cb\u56fe\u7247\u5bbd\u5ea6
-OptionPanel.max_image_width.tooltip=\u65b0\u7684\u56fe\u50cf\u7f29\u5c0f\u5230\u8fd9\u4e2a\u5bbd\u5ea6
-OptionPanel.max_menu_item_count=\u6700\u5927\u83dc\u5355\u9879\u6570\u76ee
-OptionPanel.max_menu_item_count.tooltip=\u5b50\u83dc\u5355\u6700\u5927\u5141\u8bb8\u7684\u9879\u76ee\u6570(\u6700\u5c11\u4e3a10)
+OptionPanel.max_displayed_node_count=\u6700\u5927\u663E\u793A\u8282\u70B9\u6570
+OptionPanel.max_image_width=\u6700\u5927\u521D\u59CB\u56FE\u7247\u5BBD\u5EA6
+OptionPanel.max_image_width.tooltip=\u65B0\u7684\u56FE\u50CF\u7F29\u5C0F\u5230\u8FD9\u4E2A\u5BBD\u5EA6
+OptionPanel.max_menu_item_count=\u6700\u5927\u83DC\u5355\u9879\u6570\u76EE
+OptionPanel.max_menu_item_count.tooltip=\u5B50\u83DC\u5355\u6700\u5927\u5141\u8BB8\u7684\u9879\u76EE\u6570(\u6700\u5C11\u4E3A10)
OptionPanel.max_node_width=\u8282\u70B9\u6700\u5927\u5BBD\u5EA6
-OptionPanel.max_shortened_text_length=\u6700\u5927\u6587\u5b57\u5bbd\u5ea6
+OptionPanel.max_shortened_text_length=\u6700\u5927\u6587\u5B57\u5BBD\u5EA6
OptionPanel.metal=Metal
-OptionPanel.min_node_width=\u6700\u5c0f\u8282\u70b9\u5bbd\u5ea6
+OptionPanel.min_node_width=\u6700\u5C0F\u8282\u70B9\u5BBD\u5EA6
OptionPanel.motif=Motif
+OptionPanel.narrow_hexagon=\u72ED\u7A84\u516D\u89D2\u5F62
OptionPanel.nb=\u632A\u5A01\u8BED(\u4F2F\u514B\u6885\u5C14)
-OptionPanel.never_save_folding=\u4ece\u4e0d
+OptionPanel.never_save_folding=\u4ECE\u4E0D
OptionPanel.nl=\u5C3C\u52A0\u62C9\u74DC\u8BED
OptionPanel.nn=\u632A\u5A01\u8BED(\u5C3C\u8BFA\u65AF\u514B)
OptionPanel.nodebackgroundcolor=\u8282\u70B9\u80CC\u666F\u989C\u8272
-OptionPanel.nodebackgroundcolor.tooltip=\u672A\u9009\u4E2D\u8282\u70B9\u7684\u80CC\u666F\u989C\u8272
+OptionPanel.nodebackgroundcolor.tooltip=\u672A\u9009\u4E2D\u8282\u70B9\u7684\u80CC\u666F\u989C\u8272\u3002
OptionPanel.nodecolor=\u8282\u70B9\u989C\u8272
-OptionPanel.nodecolor.tooltip=\u672A\u9009\u4E2D\u8282\u70B9\u7684\u524D\u666F\u989C\u8272
+OptionPanel.nodecolor.tooltip=\u672A\u9009\u4E2D\u8282\u70B9\u7684\u524D\u666F\u989C\u8272\u3002
OptionPanel.nodefontbold=\u7C97\u4F53
-OptionPanel.nodefonthyperlink=\u8d85\u94fe\u63a5
+OptionPanel.nodefonthyperlink=\u8D85\u94FE\u63A5
OptionPanel.nodefontitalic=\u659C\u4F53
OptionPanel.nodefontname=\u8282\u70B9\u5B57\u4F53\u540D\u79F0
OptionPanel.nodefontsize=\u8282\u70B9\u5B57\u4F53\u5927\u5C0F
-OptionPanel.nodeformat=\u683c\u5f0f
-OptionPanel.nodeformat.tooltip=<html>\u6587\u5b57\u66ff\u6362/ \u683c\u5f0f:<ul><li><em>\u6837\u5f0f\u6269\u5145</em> (<tt>%s</tt> \u662f\u539f\u59cb\u6587\u5b57), \u4f8b\u5982<tt>\u6ce8\u610f: %s</tt> <li><em>\u65e5\u671f\u548c\u6570\u5b57\u683c\u5f0f</em> - \u770b\u9009\u53d6\u65b9\u5757\u4e2d\u7684\u4f8b\u5b50</ul></html>
-OptionPanel.nodenumbering=\u8282\u70b9\u7f16\u53f7
-OptionPanel.nodenumbering.tooltip=\u5728\u8282\u70b9\u6587\u5b57\u52a0\u4e0a\u6392\u5e8f\u7f16\u53f7 (\u4f8b\u5982 1.3.1)
-OptionPanel.nodeshape=\u8282\u70B9\u6837\u5F0F
-OptionPanel.nodeshape.tooltip=<html>\u6B64\u6837\u5F0F\u63CF\u8FF0\u4E86\u8282\u70B9\u7684\u5916\u8FB9\u5F62\u5F0F. <br>\u53EF\u80FD\u7684\u503C\u6709:<br><table border="1"><tr><td>\u53C9\u5F62: </td><td> \u65E0\u73AF\u7ED5\u6846,</td></tr><tr><td>\u6C14\u6CE1\u6846: </td><td>\u5E26\u73AF\u7ED5\u6846\u7684\u8282\u70B9,</td></tr><tr><td>\u540C\u7236\u8282\u70B9: </td><td>\u4ECE\u7236\u8282\u70B9\u7EE7\u627F\u6837\u5F0F<br>\u6216\u7528\u6839\u8282\u70B9\u7684\u7F3A\u7701\u6837\u5F0F,</td>< [...]
+OptionPanel.nodeformat=\u683C\u5F0F
+OptionPanel.nodeformat.tooltip=<html>\u6587\u5B57\u66FF\u6362/ \u683C\u5F0F:<ul><li><em>\u6837\u5F0F\u6269\u5145</em> (<tt>%s</tt> \u662F\u539F\u59CB\u6587\u5B57), \u4F8B\u5982<tt>\u6CE8\u610F: %s</tt> <li><em>\u65E5\u671F\u548C\u6570\u5B57\u683C\u5F0F</em> - \u770B\u9009\u53D6\u65B9\u5757\u4E2D\u7684\u4F8B\u5B50</ul></html>
+OptionPanel.nodenumbering=\u8282\u70B9\u7F16\u53F7
+OptionPanel.nodenumbering.tooltip=\u5728\u8282\u70B9\u6587\u5B57\u52A0\u4E0A\u6392\u5E8F\u7F16\u53F7 (\u4F8B\u5982 1.3.1)\u3002
+OptionPanel.nodeshape=\u8282\u70B9\u5F62\u72B6
OptionPanel.nodetext=\u8282\u70B9\u6587\u672C
-OptionPanel.nodetext.tooltip=\u5728\u6B64\u5B9A\u4E49\u8282\u70B9\u6587\u672C\uFF0C\u5F53\u6B64\u6A21\u5F0F\u5E94\u7528\u65F6\uFF0C\u4EE5\u524D\u7684\u6587\u672C\u5C06\u88AB\u4E22\u5F03
+OptionPanel.nodetext.tooltip=\u5728\u6B64\u5B9A\u4E49\u8282\u70B9\u6587\u672C\uFF0C\u5F53\u6B64\u6A21\u5F0F\u5E94\u7528\u65F6\uFF0C\u4EE5\u524D\u7684\u6587\u672C\u5C06\u88AB\u4E22\u5F03\u3002
OptionPanel.nothing=\u5168\u90E8\u4E0D\u9009
-OptionPanel.number_format=\u6807\u51c6\u6570\u5b57\u683c\u5f0f
-OptionPanel.number_format.tooltip=\u6837\u5f0f\u53ef\u5305\u542b'#' \u6216'0' \u6765\u8bbe\u5b9a\u5f3a\u5236\u6570\u5b57\u683c\u5f0f, \u4f8b\u5982"0.00", "0.0%", "$#.00", "#0"
+OptionPanel.number_format=\u6807\u51C6\u6570\u5B57\u683C\u5F0F
+OptionPanel.number_format.tooltip=\u6837\u5F0F\u53EF\u5305\u542B'#' \u6216'0' \u6765\u8BBE\u5B9A\u5F3A\u5236\u6570\u5B57\u683C\u5F0F, \u4F8B\u5982"0.00", "0.0%", "$#.00", "#0"
OptionPanel.number_of_different_files_for_automatic_save=\u81EA\u52A8\u4FDD\u5B58\u6587\u4EF6\u4E2A\u6570
OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> \u4FDD\u5B58\u56FE\u7684\u4E0D\u540C\u6587\u4EF6\u4E2A\u6570. \u7B2C\u4E00\u6B21\u81EA\u52A8\u4FDD\u5B58\u5728\u7B2C\u4E00\u4E2A\u6587\u4EF6, \u4F9D\u6B64\u7C7B\u63A8 \u5F53\u5230 n+1-save \u540E\u53C8\u5B58\u50A8\u5230\u7B2C\u4E00\u4E2A\u6587\u4EF6 (\u5FAA\u73AF)</html>
OptionPanel.OK=\u4FDD\u5B58
-OptionPanel.org.freeplane.plugin.bugreport=\u7b56\u7565
-OptionPanel.org.freeplane.plugin.bugreport.allowed=\u603b\u662f\u53d1\u9001
-OptionPanel.org.freeplane.plugin.bugreport.ask=\u663e\u793a\u62a5\u544a\u5bf9\u8bdd\u6846
-OptionPanel.org.freeplane.plugin.bugreport.denied=\u4ece\u4e0d\u53d1\u9001
-OptionPanel.outline_hgap=\u6c34\u5e73\u8ddd\u79bb
-OptionPanel.outline_vgap=\u5782\u76f4\u8ddd\u79bb
-OptionPanel.paint_connectors_behind=\u8282\u70b9\u906e\u76d6\u8fde\u7ebf
-OptionPanel.parse_data=\u8fa8\u8ba4\u8f93\u5165\u4e2d\u7684\u6570\u5b57\u548c\u65e5\u671f-\u65f6\u95f4
-OptionPanel.parse_data.tooltip=\u8bd5\u7740\u89e3\u6790\u65e5\u671f, \u65e5\u671f-\u65f6\u95f4\u548c\u6570\u5b57\u8f93\u5165\u5e76\u5957\u7528\u6807\u51c6\u683c\u5f0f. \u4f8b\u5982100,000.00, 12/31, 12/31/99, 1999-12-31 and 1999-12-31 23:59
-OptionPanel.PASTE_HTML=\u7c98\u8d34\u4e3aHTML
-OptionPanel.PASTE_PLAIN_TEXT=\u7c98\u8d34\u4e3a\u7eaf\u6587\u672c
-OptionPanel.path_property_may_not_be_empty=\u8def\u5f84\u5c5e\u6027\u4e0d\u4e3a\u7a7a\uff01\u53d8\u66f4\u5df2\u6062\u590d\u3002
+OptionPanel.org.freeplane.plugin.bugreport=\u7B56\u7565
+OptionPanel.org.freeplane.plugin.bugreport.allowed=\u603B\u662F\u53D1\u9001
+OptionPanel.org.freeplane.plugin.bugreport.ask=\u663E\u793A\u62A5\u544A\u5BF9\u8BDD\u6846
+OptionPanel.org.freeplane.plugin.bugreport.denied=\u4ECE\u4E0D\u53D1\u9001
+OptionPanel.org.freeplane.plugin.bugreport.userid=\u53EF\u9009\u53D1\u9001\u8BC6\u522B\u7B26
+OptionPanel.outline_hgap=\u6C34\u5E73\u8DDD\u79BB
+OptionPanel.outline_vgap=\u5782\u76F4\u8DDD\u79BB
+OptionPanel.oval=\u692D\u5706\u5F62
+OptionPanel.paint_connectors_behind=\u8282\u70B9\u906E\u76D6\u8FDE\u7EBF
+OptionPanel.parse_data=\u8FA8\u8BA4\u8F93\u5165\u4E2D\u7684\u6570\u5B57\u548C\u65E5\u671F-\u65F6\u95F4
+OptionPanel.parse_data.tooltip=\u8BD5\u7740\u89E3\u6790\u65E5\u671F, \u65E5\u671F-\u65F6\u95F4\u548C\u6570\u5B57\u8F93\u5165\u5E76\u5957\u7528\u6807\u51C6\u683C\u5F0F. \u4F8B\u5982100,000.00, 12/31, 12/31/99, 1999-12-31 and 1999-12-31 23:59
+OptionPanel.parse_formulas=\u8BC6\u522B\u516C\u5F0F
+OptionPanel.parse_formulas.tooltip=Parse formulas on nodes starting with '=': See http://www.freeplane.org/wiki/index.php/Formulas.
+OptionPanel.parse_latex=\u8BC6\u522B LaTeX
+OptionPanel.parse_latex.tooltip=\u6309\u683C\u5F0F\u6216\u524D\u7F00\u8BC6\u522B LaTeX \u516C\u5F0F\uFF1A\u53C2\u89C1 http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane\u3002
+OptionPanel.PASTE_HTML=\u7C98\u8D34\u4E3AHTML
+OptionPanel.PASTE_PLAIN_TEXT=\u7C98\u8D34\u4E3A\u7EAF\u6587\u672C
+OptionPanel.path_property_may_not_be_empty=\u8DEF\u5F84\u5C5E\u6027\u4E0D\u4E3A\u7A7A\uFF01\u53D8\u66F4\u5DF2\u6062\u590D\u3002
OptionPanel.patternname=\u540D\u79F0
OptionPanel.patternname.tooltip=\u6A21\u5F0F\u540D\u79F0\u4E0D\u80FD\u91CD\u590D
OptionPanel.pl=\u6CE2\u5170\u8BED
-OptionPanel.placenewbranches=\u653e\u7f6e\u65b0\u5206\u679d
-OptionPanel.placenewbranches.tooltip=<html>\u6307\u660e\u65b0\u5206\u679d\u7684\u4f4d\u7f6e. \u6709\u6548\u7684\u503c\u4e3a '\u5f00\u59cb' \u548c '\u6700\u540e' </html>
-OptionPanel.plugin.tooltip=\u975e\u6838\u5fc3\u63d2\u4ef6
-OptionPanel.plugins=\u63d2\u4ef6
-OptionPanel.presentation_dimmer_transparency=\u6f14\u793a\u8c03\u5149\u900f\u660e\u5ea6
-OptionPanel.presentation_mode=\u6f14\u793a\u6a21\u5f0f
+OptionPanel.placenewbranches=\u653E\u7F6E\u65B0\u5206\u679D
+OptionPanel.placenewbranches.tooltip=<html>\u6307\u660E\u65B0\u5206\u679D\u7684\u4F4D\u7F6E. \u6709\u6548\u7684\u503C\u4E3A '\u5F00\u59CB' \u548C '\u6700\u540E' </html>
+OptionPanel.plugin.tooltip=\u975E\u6838\u5FC3\u63D2\u4EF6\u3002
+OptionPanel.plugins=\u63D2\u4EF6
+OptionPanel.presentation_dimmer_transparency=\u6F14\u793A\u8C03\u5149\u900F\u660E\u5EA6
+OptionPanel.presentation_mode=\u6F14\u793A\u6A21\u5F0F
OptionPanel.printonwhitebackground=<html>\u6253\u5370\u65F6\u4F7F\u7528\u767D\u8272\u80CC\u666F</html>
OptionPanel.printonwhitebackground.tooltip=<html>\u6253\u5370\u65F6\u603B\u662F\u4F7F\u7528\u767D\u8272\u80CC\u666F</html>
OptionPanel.pt_BR=\u8461\u8404\u7259\u8BED\uFF08\u5DF4\u897F\uFF09
OptionPanel.pt_PT=\u8461\u8404\u7259\u8BED\uFF08\u8461\u8404\u7259\uFF09
-OptionPanel.RECT=\u77e9\u5f62
+OptionPanel.RECT=\u77E9\u5F62
+OptionPanel.rectangle=\u77E9\u5F62
OptionPanel.relative=\u76F8\u5BF9
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"Ask" will ask you (use in doubt).<br>"Yes" displays the rich text editor.<br>"No" displays the plain text editor.</html>
-OptionPanel.remind_use_rich_text_in_new_nodes=\u4f7f\u7528\u5bcc\u6587\u672c\u683c\u5f0f(RTF\uff09\u7c98\u8d34
+OptionPanel.remind_use_rich_text_in_new_nodes=\u4F7F\u7528\u5BCC\u6587\u672C\u683C\u5F0F(RTF\uFF09\u7C98\u8D34
+OptionPanel.remindersBlink=\u7728\u773C\u63D0\u9192
+OptionPanel.remindersShowNotifications=\u63D0\u9192\u663E\u793A\u5F39\u51FA\u901A\u77E5
+OptionPanel.remindersStandardDelay=\u63D0\u9192\u5EF6\u65F6
OptionPanel.remove_notes_without_question=\u4E0D\u63D0\u95EE\u5C31\u79FB\u9664\u6CE8\u89E3\u5417\uFF1F
OptionPanel.remove_notes_without_question.tooltip=\u5982\u679C\u52FE\u9009\u6B64\u590D\u9009\u6846\uFF0C\u5C5E\u4E8E\u9009\u4E2D\u8282\u70B9\u7684\u6CE8\u89E3\u5C06\u4E0D\u8FDB\u884C\u786E\u8BA4\u5C31\u79FB\u9664\u6389\u3002\u8FD9\u53EF\u80FD\u5BFC\u81F4\u65E0\u610F\u4E2D\u4E22\u5931\u4FE1\u606F.
-OptionPanel.resources_use_default_font_for_notes_too=\u6ce8\u89e3\u4e5f\u4f7f\u7528\u7f3a\u7701\u5b57\u4f53
-OptionPanel.resources_use_margin_top_zero_for_notes=\u53bb\u9664\u6ce8\u89e3\u7684\u4e0a\u8fb9\u754c
-OptionPanel.revision_color=\u4fee\u8ba2\u989c\u8272
-OptionPanel.revision_color.tooltip=\u5df2\u6539\u53d8\u7684\u8282\u70b9\u7684\u80cc\u666f\u989c\u8272
-OptionPanel.ROUND_RECT=\u5706\u89d2\u77e9\u5f62
+OptionPanel.resources_use_default_font_for_notes_too=\u6CE8\u89E3\u4E5F\u4F7F\u7528\u7F3A\u7701\u5B57\u4F53
+OptionPanel.resources_use_margin_top_zero_for_notes=\u53BB\u9664\u6CE8\u89E3\u7684\u4E0A\u8FB9\u754C
+OptionPanel.revision_color=\u4FEE\u8BA2\u989C\u8272
+OptionPanel.revision_color.tooltip=\u5DF2\u6539\u53D8\u7684\u8282\u70B9\u7684\u80CC\u666F\u989C\u8272\u3002
+OptionPanel.ROUND_RECT=\u5706\u89D2\u77E9\u5F62
OptionPanel.ru=\u4FC4\u8BED
-OptionPanel.save_folding=\u4fdd\u5b58\u6298\u53e0
-OptionPanel.save_folding_if_map_is_changed=\u5982\u679c\u5bfc\u56fe\u5df2\u4fee\u6539
-OptionPanel.save_modification_times=\u4fdd\u5b58\u4fee\u6539\u6b21\u6570
-OptionPanel.script_classpath=Script\u7c7b\u76ee\u5f55
-OptionPanel.script_classpath.tooltip=<html>\u7528\u6765\u52a0\u5165script \u548c\u516c\u5f0f\u7684\u7c7b\u522b\u8def\u5f84\u7684JAR \u548c\u76ee\u5f55\u5217\u8868.<br>\u4f7f\u7528; (Windows) \u6216: (Linux, Mac) \u6765\u5206\u9694.<br>\u76ee\u5f55\u4f1a\u88ab\u626b\u63cf\u627eJAR \u548c.class \u6863. <br>\u8def\u5f84\u5982\u679c\u4e0d\u662f\u7edd\u5bf9\u8def\u5f84, \u5c06\u88ab\u89c6\u4e3a\u76f8\u5bf9\u4e8eFreeplane \u7684\u4f7f\u7528\u8005\u76ee\u5f55.<br>\u5982\u679c\u4f60\u8bbe\u5b9a\ [...]
-OptionPanel.script_directories=\u811a\u672c\u641c\u7d22\u8def\u5f84(\u4f7f\u7528\u5206\u53f7;\u5206\u9694)
-OptionPanel.script_directories.tooltip=<html>\u76ee\u5f55\u5217\u8868.<br>\u4f7f\u7528; (Windows) \u6216: (Linux, Mac) \u6765\u5206\u9694.<br>\u8def\u5f84\u5982\u679c\u4e0d\u662f\u7edd\u5bf9\u8def\u5f84, \u5c06\u88ab\u89c6\u4e3a\u76f8\u5bf9\u4e8eFreeplane \u7684\u7528\u6237\u76ee\u5f55.</html>
+OptionPanel.save_folding=\u4FDD\u5B58\u6298\u53E0
+OptionPanel.save_folding_if_map_is_changed=\u5982\u679C\u5BFC\u56FE\u5DF2\u4FEE\u6539
+OptionPanel.save_last_visited_node=\u4FDD\u5B58\u5BFC\u56FE\u4E2D\u7684\u4E0A\u4E00\u4E2A\u4F4D\u7F6E
+OptionPanel.save_modification_times=\u4FDD\u5B58\u4FEE\u6539\u6B21\u6570
+OptionPanel.script_classpath=Script\u7C7B\u76EE\u5F55
+OptionPanel.script_classpath.tooltip=<html>\u7528\u6765\u52A0\u5165script \u548C\u516C\u5F0F\u7684\u7C7B\u522B\u8DEF\u5F84\u7684JAR \u548C\u76EE\u5F55\u5217\u8868\u3002<br>\u4F7F\u7528; (Windows) \u6216: (Linux, Mac) \u6765\u5206\u9694\u3002<br>\u76EE\u5F55\u4F1A\u88AB\u626B\u63CF\u627EJAR \u548C.class \u6863\u3002<br>\u8DEF\u5F84\u5982\u679C\u4E0D\u662F\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u5C06\u88AB\u89C6\u4E3A\u76F8\u5BF9\u4E8EFreeplane \u7684\u4F7F\u7528\u8005\u76EE\u5F55\u3002<br>\u5982\u [...]
+OptionPanel.script_compilation_disabled_extensions=\u6587\u4EF6\u6269\u5C55\u540D\u4E0D\u80FD\u88AB\u7F16\u8BD1\uFF08\u53C2\u89C1\u5DE5\u5177\u63D0\u793A\uFF09
+OptionPanel.script_compilation_disabled_extensions.tooltip=<html>If all scripts of an additionally installed language (except<br>Groovy and JavaScript) have a general compilation problem<br>try to add the file extension here (comma-separated list).</html>
+OptionPanel.script_directories=\u811A\u672C\u641C\u7D22\u8DEF\u5F84(\u4F7F\u7528\u5206\u53F7;\u5206\u9694)
+OptionPanel.script_directories.tooltip=<html>\u76EE\u5F55\u5217\u8868.<br>\u4F7F\u7528; (Windows) \u6216: (Linux, Mac) \u6765\u5206\u9694.<br>\u8DEF\u5F84\u5982\u679C\u4E0D\u662F\u7EDD\u5BF9\u8DEF\u5F84, \u5C06\u88AB\u89C6\u4E3A\u76F8\u5BF9\u4E8EFreeplane \u7684\u7528\u6237\u76EE\u5F55.</html>
OptionPanel.script_user_key_name_for_signing=\u811A\u672C\u7B7E\u540D\u7528\u7684\u53EF\u9009\u7528\u6237\u5BC6\u94A5\u522B\u540D
OptionPanel.script_user_key_name_for_signing.tooltip=<html>\u5982\u679C\u60F3\u5BF9\u811A\u672C\u7B7E\u540D\uFF0C\u8BF7\u5728\u6B64\u8F93\u5165\u5BC6\u94A5\u7684\u522B\u540D. <br>\u5BC6\u94A5\u9884\u60F3\u5B58\u5728\u4E8E\u7F3A\u7701\u7684keystore\u4E2D. <br>\u5BC6\u94A5\u7684\u5BC6\u7801\u5FC5\u987B\u4E0Ekeystore\u7684\u5BC6\u7801\u4E00\u81F4(\u7F3A\u7701\u5982\u6B64).</html>
-OptionPanel.scrollbar_increment=\u5feb\u901f
+OptionPanel.scrollbar_increment=\u5FEB\u901F
OptionPanel.scrolling_speed=Automatic map scrolling speed
+OptionPanel.scrollOnUnfold=\u5C55\u5F00\u4E00\u4E2A\u8282\u70B9\u540E\u6EDA\u52A8\u5BFC\u56FE
OptionPanel.selection_method=\u9009\u53D6\u6A21\u5F0F
OptionPanel.selection_method.tooltip=<html> \u4EE5\u4E0B\u9009\u9879\u53EF\u4F9B\u9009\u62E9\uFF1A\u5EF6\u8FDF.\u81EA\u52A8.\u5355\u51FB. \u4E0D\u8981\u66F4\u6539\u8FD9\u4E9B. \u4ED6\u4EEC\u5C06\u4FDD\u5B58\u5728 auto.properties.</html>
OptionPanel.selection_method_by_click=\u5355\u51FB
@@ -1143,30 +1243,33 @@ OptionPanel.separator.attributes=\u5C5E\u6027
OptionPanel.separator.automatic_save=\u81EA\u52A8\u4FDD\u5B58
OptionPanel.separator.behaviour=\u884C\u4E3A
OptionPanel.separator.browser=\u6D4F\u89C8\u5668
-OptionPanel.separator.cache=\u7f13\u5b58
-OptionPanel.separator.CloudControls=\u4e91\u6846
+OptionPanel.separator.cache=\u7F13\u5B58
+OptionPanel.separator.CloudControls=\u4E91\u6846
OptionPanel.separator.commands_for_the_program=\u7A0B\u5E8F\u547D\u4EE4
-OptionPanel.separator.connectors=\u8fde\u63a5
-OptionPanel.separator.data_formats=\u6570\u636e\u683c\u5f0f\u5316\u548c\u89e3\u6790
+OptionPanel.separator.connectors=\u8FDE\u63A5
+OptionPanel.separator.data_formats=\u6570\u636E\u683C\u5F0F\u5316\u548C\u89E3\u6790
OptionPanel.separator.default_colors=\u9ED8\u8BA4\u989C\u8272
OptionPanel.separator.default_fonts=\u9ED8\u8BA4\u5B57\u4F53
OptionPanel.separator.default_styles=\u9ED8\u8BA4\u98CE\u683C
OptionPanel.separator.EdgeControls=\u8FDE\u7EBF
OptionPanel.separator.edit_long_node_window=\u7F16\u8F91\u957F\u8282\u70B9\u7A97\u53E3
-OptionPanel.separator.editing=\u7f16\u8f91\u5668\u8bbe\u7f6e
+OptionPanel.separator.editing=\u7F16\u8F91\u5668\u8BBE\u7F6E
+OptionPanel.separator.export=\u5BFC\u51FA
OptionPanel.separator.files=\u6587\u4EF6
-OptionPanel.separator.formula=\u516c\u5f0f
+OptionPanel.separator.formula=\u516C\u5F0F
OptionPanel.separator.General=\u5E38\u89C4
OptionPanel.separator.html_export=Html\u5BFC\u51FA
-OptionPanel.separator.html_import=Html\u5bfc\u5165
+OptionPanel.separator.html_import=Html\u5BFC\u5165
OptionPanel.separator.hyperlink_types=\u8D85\u94FE\u63A5\u7C7B\u578B
OptionPanel.separator.icon_properties=\u56FE\u6807
OptionPanel.separator.icons="\u9009\u62E9\u56FE\u6807..."\u4E2D\u7684\u56FE\u6807
OptionPanel.separator.initial_map_size=\u601D\u7EF4\u5BFC\u56FE\u521D\u59CB\u5C3A\u5BF8
-OptionPanel.separator.inline_editor=\u5185\u5d4c\u5f0f\u8282\u70b9\u7f16\u8f91\u5668
+OptionPanel.separator.inline_editor=\u5185\u5D4C\u5F0F\u8282\u70B9\u7F16\u8F91\u5668
+OptionPanel.separator.JoinNodesAction=\u52A0\u5165\u8282\u70B9
OptionPanel.separator.key_typing=\u6309\u952E
OptionPanel.separator.language=\u8BED\u8A00
-OptionPanel.separator.load=\u52a0\u8f7d
+OptionPanel.separator.latex=LaTeX
+OptionPanel.separator.load=\u52A0\u8F7D
OptionPanel.separator.look_and_feel=\u5916\u89C2\u611F\u89C9
OptionPanel.separator.mouse_wheel=\u9F20\u6807\u6EDA\u8F6E
OptionPanel.separator.new_node_commands=\u65B0\u5EFA\u8282\u70B9\u547D\u4EE4
@@ -1174,60 +1277,72 @@ OptionPanel.separator.node_editing_commands=\u8282\u70B9\u7F16\u8F91\u547D\u4EE4
OptionPanel.separator.node_navigation_commands=\u8282\u70B9\u5BFC\u822A\u547D\u4EE4
OptionPanel.separator.NodeColors=\u8282\u70B9\u989C\u8272
OptionPanel.separator.NodeFont=\u8282\u70B9\u5B57\u4F53
-OptionPanel.separator.NodeShape=\u8282\u70b9\u5f62\u72b6
-OptionPanel.separator.NodeStyle=\u8282\u70b9\u6837\u5f0f
-OptionPanel.separator.NodeText=\u6838\u5fc3\u6587\u5b57
+OptionPanel.separator.NodeShape=\u8282\u70B9\u5F62\u72B6
+OptionPanel.separator.NodeStyle=\u8282\u70B9\u6837\u5F0F
+OptionPanel.separator.NodeText=\u6838\u5FC3\u6587\u5B57
OptionPanel.separator.notifications=\u786E\u8BA4
-OptionPanel.separator.org.freeplane.plugin.bugreport=\u81ea\u52a8\u9519\u8bef\u62a5\u544a
+OptionPanel.separator.org.freeplane.plugin.bugreport=\u81EA\u52A8\u9519\u8BEF\u62A5\u544A
OptionPanel.separator.other_defaults=\u5176\u5B83\u9ED8\u8BA4\u8BBE\u5B9A
OptionPanel.separator.others=\u5176\u5B83\u5173\u952E\u7684\u8FDE\u63A5
-OptionPanel.separator.outline_view=\u5927\u7eb2\u89c6\u56fe
+OptionPanel.separator.outline_view=\u5927\u7EB2\u89C6\u56FE
OptionPanel.separator.patterns=\u6A21\u5F0F
-OptionPanel.separator.RichTextEditor=\u5bcc\u6587\u672c\u7f16\u8f91\u5668
+OptionPanel.separator.reminderOptions=\u63D0\u9192\u9009\u9879
+OptionPanel.separator.RichTextEditor=\u5BCC\u6587\u672C\u7F16\u8F91\u5668
OptionPanel.separator.root_node_appearance=\u6839\u8282\u70B9\u5916\u89C2
OptionPanel.separator.save=\u4FDD\u5B58
OptionPanel.separator.scripting=Scripting
-OptionPanel.separator.scrollbar=\u6eda\u52a8\u6761
-OptionPanel.separator.search=\u641c\u7d22
+OptionPanel.separator.scrollbar=\u6EDA\u52A8\u6761
+OptionPanel.separator.search=\u641C\u7D22
OptionPanel.separator.selection_colors=\u9009\u5B9A\u65F6\u7684\u989C\u8272
OptionPanel.separator.selection_method=\u9009\u53D6\u6A21\u5F0F
-OptionPanel.separator.single_instance_mode=\u5355\u4e00\u7a0b\u5e8f\u5b9e\u4f8b
-OptionPanel.separator.size_limits=\u5927\u5c0f\u9650\u5236
-OptionPanel.separator.spelling=\u62fc\u5199\u68c0\u67e5\u9009\u9879
-OptionPanel.separator.status=\u72b6\u6001\u884c
-OptionPanel.separator.tooltip=\u5de5\u5177\u63d0\u793a\u65f6\u95f4
-OptionPanel.separator.undo=\u64a4\u9500
-OptionPanel.separator.updates=\u7a0b\u5e8f\u66f4\u65b0
+OptionPanel.separator.single_instance_mode=\u5355\u4E00\u7A0B\u5E8F\u5B9E\u4F8B
+OptionPanel.separator.size_limits=\u5927\u5C0F\u9650\u5236
+OptionPanel.separator.spelling=\u62FC\u5199\u68C0\u67E5\u9009\u9879
+OptionPanel.separator.SplitToWordsAction=\u5206\u79BB\u8282\u70B9\u5230\u5355\u8BCD
+OptionPanel.separator.status=\u72B6\u6001\u884C
+OptionPanel.separator.tooltip=\u5DE5\u5177\u63D0\u793A\u65F6\u95F4
+OptionPanel.separator.undo=\u64A4\u9500
+OptionPanel.separator.updates=\u7A0B\u5E8F\u66F4\u65B0
OptionPanel.set_property_text=\u66F4\u6539
OptionPanel.set_property_text.tooltip=\u7A7A=\u4E0D\u8981\u78B0; \u51CF\u53F7=\u79FB\u9664\u5C5E\u6027 (\u8BBE\u4E3A\u9ED8\u8BA4\u503C); \u52A0\u53F7=\u53D8\u66F4\u5C5E\u6027
OptionPanel.setscript=\u6539\u53D8?
OptionPanel.setscript.tooltip=\u811A\u672C\u80FD\u591F\u5173\u8054\u5230\u6837\u5F0F.
+OptionPanel.shape_horizontal_margin=\u6C34\u5E73\u8FB9\u8DDD
+OptionPanel.shape_vertical_margin=\u5782\u76F4\u8FB9\u8DDD
OptionPanel.sharp_bezier=\u6E10\u7A84\u8D1D\u585E\u5C14\u66F2\u7EBF
OptionPanel.sharp_linear=\u6E10\u7A84\u76F4\u7EBF
+OptionPanel.shouldCenterSmallMaps=\u4E2D\u5FC3\u5C0F\u5BFC\u56FE
OptionPanel.show_icon_for_attributes=\u663E\u793A\u5C5E\u6027\u56FE\u6807
-OptionPanel.show_node_tooltips=\u663e\u793a\u8282\u70b9\u7684\u5de5\u5177\u63d0\u793a
-OptionPanel.show_note_icons=\u663e\u793a\u6ce8\u89e3\u56fe\u6807
-OptionPanel.show_styles_in_tooltip=\u5728\u5de5\u5177\u63d0\u793a\u4e2d\u663e\u793a\u8282\u70b9\u6837\u5f0f
-OptionPanel.signed_script_are_trusted=\u4FE1\u4EFB\u5DF2\u7B7E\u540D\u811A\u672C(\u63A8\u8350)
-OptionPanel.signed_script_are_trusted.tooltip=\u5982\u679C\u811A\u672C\u7531\u4E00\u4E2A\u4FE1\u4EFB\u65B9(\u5982\uFF1AFreeplane\u4F5C\u8005\u6216\u4F60\u672C\u4EBA)\u7B7E\u540D\uFF0C\u5B83\u6267\u884C\u8D77\u6765\u5C31\u4E0D\u53D7\u9650\u5236
-OptionPanel.simplyhtml.default_paste_mode=\u9ed8\u8ba4\u7c98\u8d34\u6a21\u5f0f
-OptionPanel.single_backup_directory=\u4f7f\u7528\u5355\u4e00\u76ee\u5f55\u6765\u5907\u4efd\u6587\u4ef6
-OptionPanel.single_backup_directory.tooltip=<html>\u5982\u679c\u5907\u4efd\u6587\u4ef6\u548c\u81ea\u52a8\u4fdd\u5b58\u6587\u4ef6\u8981\u653e\u5728\u5355\u4e00\u76ee\u5f55\u800c\u4e0d\u662f\u5728\u601d\u7ef4\u5bfc\u56fe\u6240\u5728\u76ee\u5f55\u7684\u5b50\u76ee\u5f55</html>
-OptionPanel.single_backup_directory_path=\u5907\u4efd\u76ee\u5f55(\u4e0a\u8ff0\u9009\u9879\u88ab\u9009\u53d6\u65f6)
-OptionPanel.single_backup_directory_path.tooltip=<html>\u8986\u76d6 <freeplaneuserdir></html>
-OptionPanel.single_instance=\u5728\u5f53\u524d\u8fd0\u884c\u7684\u5b9e\u4f8b\u4e2d\u6253\u5f00\u6587\u4ef6
-OptionPanel.single_instance_force=\u53ea\u8fd0\u884c\u4e00\u4e2a\u5b9e\u4f8b
-OptionPanel.single_instance_force.tooltip=\u5373\u662f\u6ca1\u6709\u6587\u4ef6\u88ab\u6253\u5f00\u4e5f\u907f\u514d\u8fd0\u884c\u7b2c\u4e8c\u4e2a\u5b9e\u4f8b
-OptionPanel.sk=\u65af\u6d1b\u4f10\u514b\u8bed
+OptionPanel.show_less_than_N_nodes_by_default_after_load=\u8F7D\u5165\u5BFC\u56FE\u6216\u5C55\u5F00\u4E00\u4E9B\u8282\u70B9
+OptionPanel.show_node_tooltips=\u663E\u793A\u8282\u70B9\u7684\u5DE5\u5177\u63D0\u793A
+OptionPanel.show_note_icons=\u663E\u793A\u6CE8\u89E3\u56FE\u6807
+OptionPanel.show_styles_in_tooltip=\u5728\u5DE5\u5177\u63D0\u793A\u4E2D\u663E\u793A\u8282\u70B9\u6837\u5F0F
+OptionPanel.signed_script_are_trusted=\u4FE1\u4EFB\u5DF2\u7B7E\u540D\u811A\u672C(\u63A8\u8350)\u3002
+OptionPanel.signed_script_are_trusted.tooltip=\u5982\u679C\u811A\u672C\u7531\u4E00\u4E2A\u4FE1\u4EFB\u65B9(\u5982\uFF1AFreeplane\u4F5C\u8005\u6216\u4F60\u672C\u4EBA)\u7B7E\u540D\uFF0C\u5B83\u6267\u884C\u8D77\u6765\u5C31\u4E0D\u53D7\u9650\u5236\u3002
+OptionPanel.simplyhtml.default_paste_mode=\u9ED8\u8BA4\u7C98\u8D34\u6A21\u5F0F
+OptionPanel.single_backup_directory=\u4F7F\u7528\u5355\u4E00\u76EE\u5F55\u6765\u5907\u4EFD\u6587\u4EF6
+OptionPanel.single_backup_directory.tooltip=<html>\u5982\u679C\u5907\u4EFD\u6587\u4EF6\u548C\u81EA\u52A8\u4FDD\u5B58\u6587\u4EF6\u8981\u653E\u5728\u5355\u4E00\u76EE\u5F55\u800C\u4E0D\u662F\u5728\u601D\u7EF4\u5BFC\u56FE\u6240\u5728\u76EE\u5F55\u7684\u5B50\u76EE\u5F55</html>
+OptionPanel.single_backup_directory_path=\u5907\u4EFD\u76EE\u5F55(\u4E0A\u8FF0\u9009\u9879\u88AB\u9009\u53D6\u65F6)
+OptionPanel.single_backup_directory_path.tooltip=<html>\u8986\u76D6 <freeplaneuserdir></html>
+OptionPanel.single_instance=\u5728\u5F53\u524D\u8FD0\u884C\u7684\u5B9E\u4F8B\u4E2D\u6253\u5F00\u6587\u4EF6
+OptionPanel.single_instance_force=\u53EA\u8FD0\u884C\u4E00\u4E2A\u5B9E\u4F8B
+OptionPanel.single_instance_force.tooltip=\u5373\u662F\u6CA1\u6709\u6587\u4EF6\u88AB\u6253\u5F00\u4E5F\u907F\u514D\u8FD0\u884C\u7B2C\u4E8C\u4E2A\u5B9E\u4F8B
+OptionPanel.sk=\u65AF\u6D1B\u4F10\u514B\u8BED
OptionPanel.sl=\u585E\u62C9\u5229\u6602\u8BED
-OptionPanel.spelling_opt_case_sensitive=\u5927\u5c0f\u5199\u654f\u611f
-OptionPanel.spelling_opt_ignore_all_caps_words=\u5ffd\u7565\u5168\u90e8\u5927\u5199\u7684\u5355\u8bcd\u3002
-OptionPanel.spelling_opt_ignore_capitalization=\u5ffd\u7565\u5355\u8bcd\u7684\u5927\u5199\u9996\u5b57\u6bcd
-OptionPanel.spelling_opt_ignore_words_with_numbers=\u5ffd\u7565\u5e26\u6570\u5b57\u7684\u5355\u8bcd
-OptionPanel.spelling_opt_suggestions_limit_dialog=\u5bf9\u8bdd\u6846\u4e2d\u7684\u6700\u5927\u5efa\u8bae\u4e2a\u6570
-OptionPanel.spelling_opt_suggestions_limit_menu=\u83dc\u5355\u4e2d\u7684\u6700\u5927\u5efa\u8bae\u4e2a\u6570
-OptionPanel.sr=\u0441\u0440\u043f\u0441\u043a\u0438 (\u585e\u5c14\u7ef4\u4e9a\u6587)
-OptionPanel.standard_template=\u6807\u51c6\u6a21\u7248\u6587\u4ef6
+OptionPanel.slow_scroll_selected_node=\u7F13\u6162\u6EDA\u52A8\u5230\u9009\u4E2D\u8282\u70B9
+OptionPanel.spelling_opt_case_sensitive=\u5927\u5C0F\u5199\u654F\u611F
+OptionPanel.spelling_opt_ignore_all_caps_words=\u5FFD\u7565\u5168\u90E8\u5927\u5199\u7684\u5355\u8BCD\u3002
+OptionPanel.spelling_opt_ignore_capitalization=\u5FFD\u7565\u5355\u8BCD\u7684\u5927\u5199\u9996\u5B57\u6BCD
+OptionPanel.spelling_opt_ignore_words_with_numbers=\u5FFD\u7565\u5E26\u6570\u5B57\u7684\u5355\u8BCD
+OptionPanel.spelling_opt_suggestions_limit_dialog=\u5BF9\u8BDD\u6846\u4E2D\u7684\u6700\u5927\u5EFA\u8BAE\u4E2A\u6570
+OptionPanel.spelling_opt_suggestions_limit_menu=\u83DC\u5355\u4E2D\u7684\u6700\u5927\u5EFA\u8BAE\u4E2A\u6570
+OptionPanel.SplitToWordsAction.auxiliaryWordList=\u52A9\u8BCD\u540D\u5355
+OptionPanel.SplitToWordsAction.charactersAcceptedInWord=\u5355\u8BCD\u5B57\u7B26\u6570
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=\u4FDD\u6301\u539F\u8282\u70B9\u4E3A\u7A7A
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=\u884C\u4E2D\u8282\u70B9\u6570
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=\u4FDD\u5B58\u539F\u8282\u70B9\u6587\u672C\u4E3A\u8BE6\u7EC6\u4FE1\u606F
+OptionPanel.sr=\u0441\u0440\u043F\u0441\u043A\u0438 (\u585E\u5C14\u7EF4\u4E9A\u6587)
+OptionPanel.standard_template=\u6807\u51C6\u6A21\u7248\u6587\u4EF6
OptionPanel.standardbackgroundcolor=\u6807\u51C6\u80CC\u666F\u989C\u8272
OptionPanel.standardbackgroundcolor.tooltip=<html>html \u7B26\u53F7\u8868\u793A\u6807\u51C6\u80CC\u666F\u989C\u8272 </html>
OptionPanel.standardcloudcolor=\u6807\u51C6\u4E91\u6846\u989C\u8272
@@ -1244,64 +1359,72 @@ OptionPanel.standardselectednodecolor=\u6807\u51C6\u8282\u70B9\u9009\u4E2D\u989C
OptionPanel.standardselectednodecolor.tooltip=<html>\u8282\u70B9\u9009\u4E2D\u65F6\u7684\u6807\u51C6\u989C\u8272. html \u7B26\u53F7\u8868\u793A (#RRGGBB 16\u8FDB\u5236) </html>
OptionPanel.standardselectednoderectanglecolor=\u9009\u4E2D\u8282\u70B9\u6CE1\u6846\u989C\u8272
OptionPanel.standardselectednoderectanglecolor.tooltip=<html>\u8BBE\u7F6E\u6240\u9009\u8282\u70B9\u7684\u6CE1\u6846\u989C\u8272. \u91C7\u7528html\u6807\u8BB0 (#RRGGBB 16\u8FDB\u5236)</html>
-OptionPanel.STAR=\u661f\u72b6
-OptionPanel.structured_html_import=\u5c06HTML\u5bfc\u5165\u4e3a\u8282\u70b9\u7ed3\u6784
-OptionPanel.structured_icon_toolbar=\u7ed3\u6784\u5316\u56fe\u6807\u5de5\u5177\u6761
+OptionPanel.STAR=\u661F\u72B6
+OptionPanel.statesymbolwidth=\u72B6\u6001\u7B26\u53F7\u5BBD\u5EA6
+OptionPanel.structured_html_import=\u5C06HTML\u5BFC\u5165\u4E3A\u8282\u70B9\u7ED3\u6784
+OptionPanel.structured_icon_toolbar=\u7ED3\u6784\u5316\u56FE\u6807\u5DE5\u5177\u6761
OptionPanel.summary=\u6458\u8981
OptionPanel.sv=\u745E\u5178\u8BED
-OptionPanel.text.use_ctrl_key=\u4ece\u5de5\u5177\u83dc\u5355\u4e2d\u4f7f\u7528\u2014\u6307\u5b9a\u5feb\u6377\u65b9\u5f0f\u2014
+OptionPanel.text.use_ctrl_key=\u4ECE\u5DE5\u5177\u83DC\u5355\u4E2D\u4F7F\u7528\u2014\u6307\u5B9A\u5FEB\u6377\u65B9\u5F0F\u2014
+OptionPanel.textalignment=\u6587\u5B57\u5BF9\u9F50
OptionPanel.time_for_automatic_save=\u81EA\u52A8\u4FDD\u5B58\u95F4\u9694
OptionPanel.time_for_automatic_save.tooltip=<html> \u4E24\u6B21\u81EA\u52A8\u4FDD\u5B58\u76F4\u63A5\u7684\u65F6\u95F4 (\u6BEB\u79D2): \u8BBE\u7F6E 2000000000\u65F6\u81EA\u52A8\u4FDD\u5B58\u88AB\u7981\u6B62.</html>
OptionPanel.time_for_delayed_selection=\u5EF6\u8FDF\u9009\u4E2D\u65F6\u95F4
OptionPanel.time_for_delayed_selection.tooltip=<html>\u5EF6\u8FDF\u9009\u4E2D\u7684\u9F20\u6807\u505C\u7559\u65F6\u95F4 (\u6BEB\u79D2). \u5982\u679C\u60F3\u76F4\u63A5\u9009\u4E2D\u8BBE\u7F6E\u4E3A1.</html>
-OptionPanel.toolTipManager.dismissDelay=\u6d88\u5931\u5ef6\u65f6\uff0c\u6beb\u79d2
-OptionPanel.toolTipManager.initialDelay=\u521d\u59cb\u5ef6\u65f6\uff0c\u6beb\u79d2
-OptionPanel.toolTipManager.max_tooltip_width=\u5DE5\u5177\u63D0\u793A\u5BBD\u5EA6
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>\u5DE5\u5177\u63D0\u793A\u7684\u9ED8\u8BA4\u5BBD\u5EA6-\u50CF\u7D20.</html>
-OptionPanel.toolTipManager.reshowDelay=\u91cd\u663e\u793a\u5ef6\u65f6\uff0c\u6beb\u79d2
+OptionPanel.toolTipManager.dismissDelay=\u6D88\u5931\u5EF6\u65F6\uFF0C\u6BEB\u79D2
+OptionPanel.toolTipManager.initialDelay=\u521D\u59CB\u5EF6\u65F6\uFF0C\u6BEB\u79D2
+OptionPanel.toolTipManager.max_tooltip_height=\u8282\u70B9\u5DE5\u5177\u63D0\u793A\u6700\u5927\u9AD8\u5EA6
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=\u8282\u70B9\u5DE5\u5177\u63D0\u793A\u6700\u5927\u9AD8\u5EA6 (\u50CF\u7D20)\u3002
+OptionPanel.toolTipManager.max_tooltip_width=\u8282\u70B9\u5DE5\u5177\u63D0\u793A\u6700\u5927\u5BBD\u5EA6
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=\u8282\u70B9\u5DE5\u5177\u63D0\u793A\u6700\u5927\u5BBD\u5EA6 (\u50CF\u7D20)\u3002
+OptionPanel.toolTipManager.reshowDelay=\u91CD\u663E\u793A\u5EF6\u65F6\uFF0C\u6BEB\u79D2
OptionPanel.tr=\u571F\u8033\u5176\u8BED
-OptionPanel.uk_UA=\u4e4c\u514b\u5170\u8bed
+OptionPanel.uk_UA=\u4E4C\u514B\u5170\u8BED
OptionPanel.undefined_font=\u672A\u5B9A\u4E49\u7684\u5B57\u4F53
OptionPanel.undo_levels=\u64A4\u9500\u6B21\u6570
OptionPanel.undo_levels.tooltip=<html>\u51B3\u5B9A\u5B58\u50A8\u2014\u64A4\u9500\u2014\u7684\u6700\u5927\u6B65\u6570.</html>
OptionPanel.unfold_on_paste=\u7C98\u8D34\u65F6\u5C55\u5F00\u8282\u70B9
OptionPanel.unfold_on_paste.tooltip=\u7C98\u8D34\u6216\u62D6\u653E\u65F6\u5C55\u5F00\u8282\u70B9
+OptionPanel.uniform_shape=\u4E00\u81F4
OptionPanel.use_common_out_point_for_root_node=\u4ECE\u6839\u8282\u70B9\u5F00\u59CB\u8FDE\u7EBF
OptionPanel.use_common_out_point_for_root_node.tooltip=\u4ECE\u6839\u8282\u70B9\u5F00\u59CB\u8FDE\u7EBF
OptionPanel.use_tabbed_pane=\u4F7F\u7528\u6807\u7B7E\u9875
OptionPanel.use_tabbed_pane.tooltip=\u5982\u679C\u9009\u4E2D\uFF0C\u5BFC\u56FE\u5C06\u663E\u793A\u5728\u6807\u7B7E\u9875\u4E2D (\u5C31\u50CF\u5728 FireFox :-) ).
-OptionPanel.user_defined_screen_resolution=\u7528\u6237\u5b9a\u4e49\u5c4f\u5e55\u5206\u8fa8\u7387(dpi)
-OptionPanel.validate_classpath_needs_readaccess=Scripting:\u8bbe\u5b9a\u7c7b\u8def\u5f84\u662f\u5fc5\u987b\u5141\u8bb8\u6587\u4ef6\u8bfb\u53d6
-OptionPanel.validate_invalid_date_format=\u4e0d\u6b63\u786e\u7684\u65e5\u671f\u683c\u5f0f
-OptionPanel.validate_invalid_datetime_format=\u4e0d\u6b63\u786e\u7684\u65e5\u671f-\u65f6\u95f4\u683c\u5f0f
-OptionPanel.validate_invalid_number_format=\u4e0d\u6b63\u786e\u7684\u6570\u5b57\u683c\u5f0f
-OptionPanel.validate_write_without_read=Scripting: \u5c06 Read/File \u52a0\u5230 Write/File.
-OptionPanel.validation_error=<html><body>\u9a8c\u8bc1\u9519\u8bef:<p><em>{0}</em><p>\u8bf7\u4fee\u6539\u9996\u9009\u9879.</body></html>
-OptionPanel.validation_warning=<html><body>\u9a8c\u8bc1\u8b66\u544a:<p><em>{0}</em></body></html>
-OptionPanel.vi=\u8d8a\u5357\u8bed
+OptionPanel.user_defined_screen_resolution=\u7528\u6237\u5B9A\u4E49\u5C4F\u5E55\u5206\u8FA8\u7387(dpi)
+OptionPanel.validate_classpath_needs_readaccess=\u811A\u672C\uFF1A\u8BBE\u5B9A\u7684\u7C7B\u8DEF\u5F84\u5FC5\u987B\u5141\u8BB8\u8BFB\u53D6\u90A3\u91CC\u7684\u6587\u4EF6\uFF01
+OptionPanel.validate_invalid_date_format=\u4E0D\u6B63\u786E\u7684\u65E5\u671F\u683C\u5F0F
+OptionPanel.validate_invalid_datetime_format=\u4E0D\u6B63\u786E\u7684\u65E5\u671F-\u65F6\u95F4\u683C\u5F0F
+OptionPanel.validate_invalid_number_format=\u4E0D\u6B63\u786E\u7684\u6570\u5B57\u683C\u5F0F
+OptionPanel.validate_write_without_read=Scripting: \u5C06 Read/File \u52A0\u5230 Write/File.
+OptionPanel.validation_error=<html><body>\u9A8C\u8BC1\u9519\u8BEF:<p><em>{0}</em><p>\u8BF7\u4FEE\u6539\u9996\u9009\u9879.</body></html>
+OptionPanel.validation_warning=<html><body>\u9A8C\u8BC1\u8B66\u544A:<p><em>{0}</em></body></html>
+OptionPanel.vertical_child_gap=\u5B50\u95F4\u9694
+OptionPanel.vertical_child_gap.tooltip=Vertical distance between child nodes
+OptionPanel.vi=\u8D8A\u5357\u8BED
OptionPanel.wheel_velocity=\u901F\u5EA6
OptionPanel.wheel_velocity.tooltip=\u503C\u8D8A\u5927\u8F6C\u52A8\u6EDA\u8F6E\u65F6\u56FE\u6EDA\u52A8\u7684\u8D8A\u5FEB.
+OptionPanel.wide_hexagon=\u5BBD\u516D\u89D2\u5F62
OptionPanel.windows=Windows
OptionPanel.zh_CN=\u7B80\u4F53\u4E2D\u6587
OptionPanel.zh_TW=\u7E41\u4F53\u4E2D\u6587
-org.freeplane.plugin.bugreport.agree=\u53d1\u9001
-org.freeplane.plugin.bugreport.always_agree=\u603b\u662f\u53d1\u9001
-org.freeplane.plugin.bugreport.always_deny=\u4ece\u4e0d\u53d1\u9001
-org.freeplane.plugin.bugreport.deny=\u4e0d\u53d1\u9001
-org.freeplane.plugin.bugreport.dialog.title=\u81ea\u52a8\u9519\u8bef\u62a5\u544a
-org.freeplane.plugin.bugreport.freeplane_team=Freeplane\u5c0f\u7ec4\u6d88\u606f
-org.freeplane.plugin.bugreport.lastreport=\u63a5\u6536\u5230\u7684\u62a5\u544a
-org.freeplane.plugin.bugreport.never=\u4ece\u4e0d\u8bf7\u6c42\u5e2e\u52a9
-org.freeplane.plugin.bugreport.question=Freeplane\u5177\u6709\u4e00\u4e2a\u81ea\u52a8\u9519\u8bef\u8ddf\u8e2a\u5f15\u64ce\u3002\n\u4f46\u7edd\u4e0d\u53d1\u9001\u4efb\u4f55\u4e2a\u4eba\u6570\u636e\u6216\u5bfc\u56fe\u5185\u5bb9\u3002\n\u9519\u8bef\u62a5\u544a\u5c06\u6709\u52a9\u4e8e\u6211\u4eec\u6539\u8fdb\u8f6f\u4ef6\u3002
-org.freeplane.plugin.bugreport.report=\u5f53\u524d\u62a5\u544a
-org.freeplane.plugin.bugreport.wanted_bug=\u53d1\u751f\u4e86\u4e00\u4e2a\u5185\u90e8\u9519\u8bef\u5e76\u5df2\u81ea\u52a8\u62a5\u544a\u3002\n\u6211\u4eec\u9700\u8981\u66f4\u591a\u7684\u4fe1\u606f\u4ee5\u4fbf\u518d\u73b0\u8be5\u610f\u5916\u72b6\u6001\u3002\n\u8bf7\u5e2e\u5fd9\u5411\u6211\u4eec\u7684Mantis\u7f3a\u9677\u8ddf\u8e2a\u7cfb\u7edf\u63d0\u4ea4\u4e00\u4efd\u9519\u8bef\u62a5\u544a\uff1a\u63cf\u8ff0\u9519\u8bef\u53d1\u751f\u65f6\u60a8\u7684\u64cd\u4f5c\uff0c\u4ee5\u4fbf\u6211\u4eec\u [...]
-org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined=\u8282\u70b9 {0} \u6ca1\u6709\u5b9a\u4e49
-out_of_memory=\u5185\u5b58\u6ea2\u51fa\u3002
-overwrite_keyset_question=\u8986\u76d6\u73b0\u5b58\u7684\u952e\u96c6\uff1f
+org.freeplane.plugin.bugreport.agree=\u53D1\u9001
+org.freeplane.plugin.bugreport.always_agree=\u603B\u662F\u53D1\u9001
+org.freeplane.plugin.bugreport.always_deny=\u4ECE\u4E0D\u53D1\u9001
+org.freeplane.plugin.bugreport.deny=\u4E0D\u53D1\u9001
+org.freeplane.plugin.bugreport.dialog.title=\u81EA\u52A8\u9519\u8BEF\u62A5\u544A
+org.freeplane.plugin.bugreport.freeplane_team=Freeplane\u5C0F\u7EC4\u6D88\u606F
+org.freeplane.plugin.bugreport.lastreport=\u63A5\u6536\u5230\u7684\u62A5\u544A
+org.freeplane.plugin.bugreport.never=\u4ECE\u4E0D\u8BF7\u6C42\u5E2E\u52A9
+org.freeplane.plugin.bugreport.question=Freeplane\u5177\u6709\u4E00\u4E2A\u81EA\u52A8\u9519\u8BEF\u8DDF\u8E2A\u5F15\u64CE\u3002\n\u4F46\u7EDD\u4E0D\u53D1\u9001\u4EFB\u4F55\u4E2A\u4EBA\u6570\u636E\u6216\u5BFC\u56FE\u5185\u5BB9\u3002\n\u9519\u8BEF\u62A5\u544A\u5C06\u6709\u52A9\u4E8E\u6211\u4EEC\u6539\u8FDB\u8F6F\u4EF6\u3002
+org.freeplane.plugin.bugreport.report=\u5F53\u524D\u62A5\u544A
+org.freeplane.plugin.bugreport.wanted_bug=\u53D1\u751F\u4E86\u4E00\u4E2A\u5185\u90E8\u9519\u8BEF\u5E76\u5DF2\u81EA\u52A8\u62A5\u544A\u3002
+org.freeplane.plugin.script.NodeIdHighlighter.node_is_not_defined=\u8282\u70B9 {0} \u6CA1\u6709\u5B9A\u4E49
+out_of_memory=\u5185\u5B58\u6EA2\u51FA\u3002
+overwrite_keyset_question=\u8986\u76D6\u73B0\u5B58\u7684\u952E\u96C6\uFF1F
PageAction.text=\u6253\u5370\u8BBE\u7F6E...
-password_is_not_ascii=\u5bc6\u7801\u4e0d\u662fASCII
+password_is_not_ascii=\u5BC6\u7801\u4E0D\u662FASCII
PasteAction.text=\u7C98\u8D34
-PasteAttributes.text=\u7c98\u8d34\u5c5e\u6027
+PasteAttributes.text=\u7C98\u8D34\u5C5E\u6027
PatternNewNameProperty=\u65B0\u6A21\u5F0F
PatternToString.backgroundColor=\u80CC\u666F\u989C\u8272
PatternToString.Child=\u5B50\u8282\u70B9\u6837\u5F0F
@@ -1315,15 +1438,16 @@ PatternToString.FontName=\u5B57\u4F53\u540D\u79F0
PatternToString.Icon=\u56FE\u6807
PatternToString.NodeFontSize=\u5B57\u4F53\u5927\u5C0F
periodic_formula={0} * n + {1}
-PeriodUnit.DAY=\u65e5
-PeriodUnit.HOUR=\u5c0f\u65f6
-PeriodUnit.MINUTE=\u5206\u949f
+PeriodUnit.DAY=\u65E5
+PeriodUnit.HOUR=\u5C0F\u65F6
+PeriodUnit.MINUTE=\u5206\u949F
PeriodUnit.MONTH=\u6708
PeriodUnit.WEEK=\u5468
-PeriodUnit.YEAR=\u5e74
-plugins/latex/LatexNodeHook.editorTitle=\u7f16\u8f91Latex
-plugins/script_filter=Script \u8fc7\u6ee4\u5668 {0}
+PeriodUnit.YEAR=\u5E74
+plugins/latex/LatexNodeHook.editorTitle=\u7F16\u8F91Latex
+plugins/script_filter=Script \u8FC7\u6EE4\u5668 {0}
plugins/script_filter_error={0} had to return a boolean result on {1} but returned {2}
+plugins/script_filter_execute_error=Error executing {0}\nfor node {1}:\n{2}
plugins/ScriptEditor.cancel=\u653E\u5F03\u4FEE\u6539\u9000\u51FA(&D)
plugins/ScriptEditor.exit=\u4FDD\u5B58\u9000\u51FA(&S)
plugins/ScriptEditor.FORBIDDEN_ACTION=Freeplane groovy\u811A\u672C\u53D7\u9650. \u4E0B\u9762\u7684 {0,choice,0#File|1#Network|2#Exec} \u64CD\u4F5C\u88AB\u7981\u6B62: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. \u4F60\u53EF\u4EE5\u5728\u7A0B\u5E8F\u8BBE\u7F6E\u4E2D\u66F4\u6539\u6B64\u9009\u9879.
@@ -1333,9 +1457,10 @@ plugins/ScriptEditor.run=\u8FD0\u884C(&R)
plugins/ScriptEditor.sign=\u811A\u672C\u7B7E\u540D...
plugins/ScriptEditor/window.Result=\u7ED3\u679C:
plugins/ScriptEditor/window.title=\u811A\u672C\u7F16\u8F91\u5668
-plugins/ScriptingEngine.illegalAccessToInternalAPI=\u975e\u6cd5\u8bbf\u95ee\u5185\u90e8API (package {0}). \u5982\u679cAPI \u4e0d\u7ed9\u529b\u8bf7\u8054\u7edcFreeplane \u56e2\u961f.
+plugins/ScriptingEngine.illegalAccessToInternalAPI=\u975E\u6CD5\u8BBF\u95EE\u5185\u90E8API (package {0}). \u5982\u679CAPI \u4E0D\u7ED9\u529B\u8BF7\u8054\u7EDCFreeplane \u56E2\u961F.
plugins/TimeList.xml_Created=\u521B\u5EFA
plugins/TimeList.xml_Date=\u65E5\u671F
+plugins/TimeList.xml_Details=\u8BE6\u7EC6\u4FE1\u606F
plugins/TimeList.xml_Icons=\u56FE\u6807
plugins/TimeList.xml_Modified=\u4FEE\u6539
plugins/TimeList.xml_Notes=\u6CE8\u89E3
@@ -1354,8 +1479,8 @@ plugins/TimeManagement.xml_reminderButton=\u5230\u671F\u63D0\u9192
plugins/TimeManagement.xml_reminderButton_tooltip=<html>\u5F53\u7ED9\u5B9A\u65F6\u95F4\u6709\u4E00\u4E2A\u5B9A\u65F6\u5668\u88AB\u8BBE\u7F6E. \u901A\u8FC7\u95EA\u70C1\u56FE\u6807\u63D0\u9192\u4F60.<br> \u5173\u95ED\u56FE\u518D\u6B21\u6253\u5F00\u56FE\u65F6\uFF0C\u5B9A\u65F6\u5668\u5C06\u6FC0\u6D3B.</html>
plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>\u5F53\u524D, \u6BCF\u4E2A\u8282\u70B9\u53EF\u80FD\u53EA\u652F\u6301\u4E00\u4E2A\u63D0\u9192. <br>\u5F53\u524D\u63D0\u9192\u4EE5 {0,date} {0,time}\u8BBE\u5B9A, \u4F60\u7684\u9009\u62E9\u662F {1,date} {1,time}. <br><br>\u786E\u8BA4\u66F4\u6539\u8282\u70B9\u63D0\u9192\u65F6\u95F4 (YES) <br>\u6216\u8005\u4FDD\u6301\u539F\u6709\u7684 (NO)?</html>
plugins/TimeManagement.xml_reminderNode_tooltip=\u9884\u8BBE\u63D0\u9192 {0,date} {0,time}.
-plugins/TimeManagement.xml_remindLaterButton=\u7a0d\u540e\u63d0\u9192
-plugins/TimeManagement.xml_remindLaterButton_tooltip=\u7a0d\u540e\u63d0\u9192
+plugins/TimeManagement.xml_remindLaterButton=\u7A0D\u540E\u63D0\u9192
+plugins/TimeManagement.xml_remindLaterButton_tooltip=\u7A0D\u540E\u63D0\u9192
plugins/TimeManagement.xml_removeReminderButton=\u5220\u9664\u63D0\u9192
plugins/TimeManagement.xml_removeReminderButton_tooltip=\u5220\u9664\u6240\u9009\u8282\u70B9\u7684\u6240\u6709\u76F8\u5173\u63D0\u9192.
plugins/TimeManagement.xml_Replace=\u66FF\u6362
@@ -1367,116 +1492,135 @@ plugins/TimeManagement.xml_WindowTitle=\u65F6\u95F4\u7BA1\u7406
plugins/TimeManagement.xml_WindowTitle_All_Nodes=\u67E5\u627E\u66FF\u6362
preferences=\u9996\u9009\u9879
print_preview_title=\u6253\u5370\u9884\u89C8
-PrintAction.text=\u6253\u5370...
+PrintAction.text=\u6253\u5370\u5BFC\u56FE...
PrintDirectAction.text=\u6253\u5370
printing_settings=\u6253\u5370\u6BD4\u4F8B
-PrintPreviewAction.text=\u6253\u5370\u9884\u89C8
+PrintPreviewAction.text=\u6253\u5370\u9884\u89C8...
+progress=\u8FDB\u5EA6\u56FE\u6807(%)
PropertyAction.dialog=\u9996\u9009\u9879
PropertyAction.text=\u9996\u9009\u9879 ...
-QuickFilterAction.text=\u5feb\u901f\u8fc7\u6ee4
-QuickFindAction.BACK.text=\u67e5\u627e\u4e0a\u4e00\u4e2a
-QuickFindAction.FORWARD.text=\u67e5\u627e\u4e0b\u4e00\u4e2a
-QuickFindAllAction.text=\u9009\u53d6\u6240\u6709\u5339\u914d\u8282\u70b9
-QuickHighlightAction.text=\u9ad8\u70b9\u6240\u6709\u5339\u914d\u8282\u70b9
-QuitAction.text=\u9000\u51FA
+QuickFilterAction.text=\u5FEB\u901F\u8FC7\u6EE4
+QuickFindAction.BACK.text=\u67E5\u627E\u4E0A\u4E00\u4E2A
+QuickFindAction.FORWARD.text=\u67E5\u627E\u4E0B\u4E00\u4E2A
+QuickFindAllAction.text=\u9009\u53D6\u6240\u6709\u5339\u914D\u8282\u70B9
+QuickHighlightAction.text=\u9AD8\u70B9\u6240\u6709\u5339\u914D\u8282\u70B9
+QuitAction.text=\u9000\u51FA Freeplane
read_only=\u53EA\u8BFB
-ReadScriptError.text=\u8bfb\u53d6\u811a\u672c\u9519\u8bef\n\u8be6\u60c5\u8bf7\u67e5\u770blog\u6587\u4ef6
+ReadScriptError.text=\u8BFB\u53D6\u811A\u672C\u9519\u8BEF\n\u8BE6\u60C5\u8BF7\u67E5\u770Blog\u6587\u4EF6
really_convert_to_current_version=<html>\u8BE5\u5BFC\u56FE\u662F\u7528\u65E7\u7248\u672C\u7684 Freeplane\u521B\u5EFA\u7684. <br>\u8F6C\u6362\u5B83 (\u5EFA\u8BAE)? <br>(\u5426\u5219\u4F5C\u4E3A\u672A\u786E\u8BA4\u5904\u7406.) </html>
really_cut_node=\u771F\u7684\u526A\u5207\u8282\u70B9?
really_execute_script=\u4F60\u771F\u7684\u60F3\u6267\u884C\u8BE5\u5BFC\u56FE\u4E2D\u5305\u542B\u7684\u811A\u672C? \u8FD9\u4E9B\u811A\u672C\u53EF\u80FD\u635F\u5BB3\u4F60\u7684\u7535\u8111.
really_remove_node=\u771F\u7684\u8981\u5220\u9664\u8282\u70B9?
really_remove_notes=\u771F\u7684\u8981\u79FB\u9664\u6CE8\u89E3\u5417\uFF1F
-ReapplyFilterAction.text=\u91cd\u65b0\u5e94\u7528
-red=\u7ea2\u8272
-RedefineStyleAction.text=\u91cd\u5b9a\u4e49\u6837\u5f0f
+ReapplyFilterAction.text=\u91CD\u65B0\u5E94\u7528
+red=\u7EA2\u8272
+RedefineStyleAction.text=\u91CD\u5B9A\u4E49\u6837\u5F0F
RedoAction.text=\u91CD\u505A
RedoFilterAction.text=\u91CD\u505A
-regular_expressions=\u6b63\u5219\u8868\u8fbe\u5f0f
+regular_expressions=\u6B63\u5219\u8868\u8FBE\u5F0F
ReminderHookAction.text=\u5220\u9664\u63D0\u9192
ReminderHookAction.tooltip=\u5220\u9664\u8282\u70B9\u76F8\u5173\u63D0\u9192.
-remove_file_from_list_on_error=\u65e0\u6cd5\u6253\u5f00\u6587\u4ef6{0}\u3002\u662f\u5426\u4ece\u6700\u8fd1\u7684\u6587\u4ef6\u5217\u8868\u4e2d\u79fb\u9664\uff1f
-remove_shortcut_question=\u66ff\u6362\u6309\u952e\uff1f
-remove_shortcut_title=\u79fb\u9664\u5feb\u6377\u952e
+reminderNotification=\u63D0\u9192\u901A\u77E5
+remove_file_from_list_on_error=\u65E0\u6CD5\u6253\u5F00\u6587\u4EF6{0}\u3002\u662F\u5426\u4ECE\u6700\u8FD1\u7684\u6587\u4EF6\u5217\u8868\u4E2D\u79FB\u9664\uFF1F
+remove_shortcut_question=\u66FF\u6362\u6309\u952E\uFF1F
+remove_shortcut_title=\u79FB\u9664\u5FEB\u6377\u952E
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=\u91CD\u7F6E\u5C55\u5F00\u8282\u70B9
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=\u5141\u8BB8\u6BCF\u4E2A\u8282\u70B9\u6D6E\u52A8
RemoveAllIconsAction.text=\u5220\u9664\u6240\u6709\u56FE\u6807
-RemoveConnectorAction.text=\u5220\u9664\u8fde\u63a5
-RemoveEncryption.text=\u79fb\u9664\u5bc6\u7801
-RemoveFormatAction.text=\u79fb\u9664\u683c\u5f0f
-RemoveIcon_0_Action.text=\u5220\u9664\u7b2c\u4e00\u4e2a\u56fe\u6807
+RemoveConnectorAction.text=\u5220\u9664\u8FDE\u63A5
+RemoveEncryption.text=\u79FB\u9664\u5BC6\u7801
+RemoveFormatAction.text=\u79FB\u9664\u683C\u5F0F
+RemoveIcon_0_Action.text=\u5220\u9664\u7B2C\u4E00\u4E2A\u56FE\u6807
RemoveIconAction.text=\u5220\u9664\u6700\u540E\u4E00\u4E2A\u56FE\u6807
-RemoveNoteAction.text=\u79fb\u9664\u6ce8\u89e3
-RemoveNoteAction.tooltip=<html>\u79fb\u9664\u53ef\u80fd\u662f\u591a\u4e2a\u6ce8\u89e3\u7684\u5185\u5bb9.</html>
+RemoveNoteAction.text=\u79FB\u9664\u6CE8\u89E3
+RemoveNoteAction.tooltip=<html>\u79FB\u9664\u53EF\u80FD\u662F\u591A\u4E2A\u6CE8\u89E3\u7684\u5185\u5BB9.</html>
rename=\u91CD\u547D\u540D
repair_link=\u4FEE\u590D\u94FE\u63A5
repair_link_question=\u4E0D\u80FD\u52A0\u8F7D\u94FE\u63A5\u56FE\u3002\u624B\u52A8\u4FEE\u590D\u94FE\u63A5\uFF1F
replace=\u66FF\u6362
-replace_shortcut_question=\u8fd9\u4e2a\u5feb\u6377\u952e\u5df2\u7ecf\u6307\u5b9a\u7ed9\n {0}.\n\u662f\u5426\u66ff\u6362?
-replace_shortcut_title=\u66ff\u6362\u5feb\u6377\u952e\uff1f
-ReportBugAction.text=\u62a5\u544a\u9519\u8bef
-RequestFeatureAction.text=\u8bf7\u6c42\u589e\u52a0\u4e00\u4e2a\u529f\u80fd
-reset_to_default=\u4f7f\u7528\u7f3a\u7701
+replace_shortcut_question=\u8FD9\u4E2A\u5FEB\u6377\u952E\u5DF2\u7ECF\u6307\u5B9A\u7ED9\n {0}.\n\u662F\u5426\u66FF\u6362?
+replace_shortcut_title=\u66FF\u6362\u5FEB\u6377\u952E\uFF1F
+ReportBugAction.text=\u62A5\u544A\u9519\u8BEF
+RequestFeatureAction.text=\u8BF7\u6C42\u589E\u52A0\u4E00\u4E2A\u529F\u80FD
+reset_to_default=\u4F7F\u7528\u7F3A\u7701
ResetNodeLocationAction.text=\u91CD\u8BBE\u8282\u70B9\u4F4D\u7F6E
-ResetStyleAction.text=\u91cd\u7f6e\u8282\u70b9\u6837\u5f0f
-RevertAction.text=\u8fd8\u539f\u81f3\u4e0a\u6b21\u4fdd\u5b58\u72b6\u6001
-RevisionPluginAction.text=\u6539\u53d8\u4fee\u8ba2\u90e8\u5206\u7684\u80cc\u666f\u989c\u8272(&R)
+ResetStyleAction.text=\u91CD\u7F6E\u8282\u70B9\u6837\u5F0F
+RevertAction.text=\u8FD8\u539F\u81F3\u4E0A\u6B21\u4FDD\u5B58\u72B6\u6001
+RevisionPluginAction.text=\u6539\u53D8\u4FEE\u8BA2\u90E8\u5206\u7684\u80CC\u666F\u989C\u8272
+save=\u4FDD\u5B58(&S)
save_failed=\u56FE {0} \u5B58\u50A8\u5931\u8D25.
-save_unsaved=\u4FDD\u5B58\u4EE5\u4E0B\u601D\u7EF4\u5BFC\u56FE? :
-save_unsaved_styles=\u4fdd\u5b58\u6837\u5f0f\uff1f
-SaveAcceleratorPresetsAction.text=\u4fdd\u5b58\u70ed\u952e\u96c6
-SaveAction.text=\u4FDD\u5B58
-SaveAll.text=\u4FDD\u5B58\u6240\u6709(&A)
-SaveAll.tooltip=\u4FDD\u5B58\u6240\u6709\u6253\u5F00\u7684\u5BFC\u56FE.
+save_unsaved=\u4FDD\u5B58\u4E0B\u5217\u601D\u7EF4\u5BFC\u56FE\uFF1F
+save_unsaved_styles=\u4FDD\u5B58\u6837\u5F0F\uFF1F
+SaveAcceleratorPresetsAction.text=\u4FDD\u5B58\u70ED\u952E\u96C6\u2026
+SaveAction.text=\u4FDD\u5B58(&S)
+SaveAction_readonlyMsg=This map is read-only. Please use 'File->Save map as...' to save this map.
+SaveAction_readonlyTitle=\u5C1D\u8BD5\u4FDD\u5B58\u53EA\u8BFB\u5BFC\u56FE
+SaveAll.text=\u4FDD\u5B58\u6240\u6709(A)
+SaveAll.tooltip=\u4FDD\u5B58\u6240\u6709\u6253\u5F00\u7684\u5BFC\u56FE
+SaveAs_toReadonlyMsg={0} \u662F\u53EA\u8BFB\u72B6\u6001\u3002\u8BF7\u5C1D\u8BD5\u4FDD\u5B58\u4E3A\u53E6\u4E00\u4E2A\u6587\u4EF6\u3002
+SaveAs_toReadonlyTitle=\u5C1D\u8BD5\u4FDD\u5B58\u5230\u53EA\u8BFB\u6587\u4EF6
SaveAsAction.text=\u53E6\u5B58\u4E3A...
saved=\u4FDD\u5B58\u5B8C\u6BD5
-saving_canceled=\u5df2\u53d6\u6d88\u4fdd\u5b58
-scanners_not_loaded=\u626b\u63cf\u5668\u65e0\u6cd5\u8f7d\u5165\uff0c\u6587\u4ef6\u5df2\u635f\u6bc1
+saving_canceled=\u5DF2\u53D6\u6D88\u4FDD\u5B58
+scanners_not_loaded=\u626B\u63CF\u5668\u65E0\u6CD5\u8F7D\u5165\uFF0C\u6587\u4EF6\u5DF2\u635F\u6BC1
scheme_evaluate=\u8BC4\u4F30!
-script_execution_disabled=\u811a\u672c\u88ab\u7981\u7528\uff0c\u8bf7\u67e5\u770b \u5de5\u5177/\u9996\u9009\u9879/\u63d2\u4ef6
+script_execution_disabled=\u811A\u672C\u88AB\u7981\u7528\uFF0C\u8BF7\u67E5\u770B \u5DE5\u5177/\u9996\u9009\u9879/\u63D2\u4EF6
ScriptEditor.text=\u811A\u672C\u7F16\u8F91\u5668...
ScriptEditor.tooltip=\u5141\u8BB8\u5728Freeplane\u4E2D\u7F16\u5199\u8F83\u957F\u811A\u672C.
ScriptEditorPanel.changed_cancel=\u811A\u672C\u5DF2\u4FEE\u6539. \u4F60\u771F\u7684\u60F3\u653E\u5F03\u8FD9\u4E9B\u4FEE\u6539\u5417?
+scripting=\u811A\u672C
scripting_api_generator_legend=Legend
scripting_api_generator_proxy=Proxy
scripting_api_generator_title=Scripting API
scripting_api_generator_utilities=Utilities
scripting_api_generator_web=Web Resources
+ScriptsRunToggleAction.ON_SELECTED_NODE.text=\u5728\u6240\u6709\u9009\u4E2D\u7684\u8282\u70B9\u4E0A\u6267\u884C\u811A\u672C
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=\u5728\u9009\u4E2D\u7684\u8282\u70B9\u4E0A\u9012\u5F52\u6267\u884C\u811A\u672C
+ScriptsRunToggleAction.ON_SINGLE_NODE.text=\u5728\u9009\u4E2D\u7684\u8282\u70B9\u4E0A\u6267\u884C\u811A\u672C
select_favorites_folder=\u9009\u62E9\u2014\u6536\u85CF\u5939\u2014\u6240\u5728\u7684\u76EE\u5F55
-select_file_export_to=\u9009\u62e9\u8981\u5bfc\u51fa\u5230\u7684\u6587\u4ef6
+select_file_export_to=\u9009\u62E9\u8981\u5BFC\u51FA\u5230\u7684\u6587\u4EF6
select_folder_for_importing=\u9009\u62E9\u5BFC\u5165\u7684\u76EE\u5F55
-select_icon=\u9009\u62e9\u56fe\u6807
-select_menu_item_dialog=\u9009\u62e9\u83dc\u5355\u9879
-select_menu_item_root_node=\u83dc\u5355
+select_icon=\u9009\u62E9\u56FE\u6807
+select_menu_item_dialog=\u9009\u62E9\u83DC\u5355\u9879
+select_menu_item_root_node=\u83DC\u5355
SelectAllAction.text=\u9009\u62E9\u6240\u6709\u53EF\u89C1\u9879
-SelectBranchAction.text=\u9009\u62e9\u53ef\u89c1\u5206\u679d
-SelectedPasteAction.text=\u7c98\u8d34\u4e3a...
+SelectBranchAction.text=\u9009\u62E9\u53EF\u89C1\u5206\u679D
+SelectedPasteAction.text=\u7C98\u8D34\u4E3A...
selection_method_by_click=\u5355\u51FB\u65F6\u9009\u5B9A
selection_method_delayed=\u5EF6\u8FDF\u81EA\u52A8\u9009\u5B9A\u6A21\u5F0F\uFF08\u6307\u5411\u5E76\u5EF6\u8FDF\u4E00\u6BB5\u540E\u9009\u5B9A\uFF09
selection_method_direct=\u6307\u5411\u65F6\u9009\u5B9A
SelectNoteAction.text=\u6CE8\u89E3\u7F16\u8F91\u5207\u6362
-SelectNoteAction.tooltip=\u5207\u6362\u6ce8\u89e3\u7a97\u53e3\u4e0e\u5bfc\u56fe\u7a97\u53e3\u7126\u70b9
-set_accelerator_on_next_click_action=\u70b9\u51fb\u4efb\u610f\u83dc\u5355\u9879\u4ee5\u6307\u5b9a\u4e00\u4e2a\u65b0\u5feb\u6377\u65b9\u5f0f
-SetAcceleratorOnNextClickAction.text=\u6307\u5b9a\u5feb\u6377\u65b9\u5f0f
-SetImageByFileChooserAction.text=\u52a0\u5165\u56fe\u50cf(\u6587\u4ef6\u6216\u94fe\u63a5)...
-SetLinkAnchorAction.text=\u8bbe\u5b9a\u8282\u70b9\u8df3\u8f6c(anchor)
+SelectNoteAction.tooltip=\u5207\u6362\u6CE8\u89E3\u7A97\u53E3\u4E0E\u5BFC\u56FE\u7A97\u53E3\u7126\u70B9
+set_accelerator_on_next_click_action=\u6309\u4F4F Ctrl \u70B9\u51FB\u83DC\u5355\u9879\u4EE5\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684\u952E\u76D8\u5FEB\u6377\u65B9\u5F0F\u3002
+SetAccelerator.dialogTitle=\u5206\u914D\u5FEB\u6377\u952E
+SetAccelerator.keystrokeDetected=\u6309\u952E ''{0}'' \u5C1A\u672A\u6307\u5B9A\u7ED9\u4EFB\u4F55\u83DC\u5355\u9879\u3002
+SetAcceleratorOnNextClickAction.text=\u6307\u5B9A\u5FEB\u6377\u65B9\u5F0F\u2026
+SetAlwaysUnfoldedNodeFlagsAction.text=\u4FDD\u6301\u5C55\u5F00\u8282\u70B9
+SetAlwaysUnfoldedNodeFlagsAction.tooltip=\u907F\u514D\u6298\u53E0\u5F53\u524D\u5C55\u5F00\u7684\u8282\u70B9
+SetImageByFileChooserAction.text=\u52A0\u5165\u56FE\u50CF(\u6587\u4EF6\u6216\u94FE\u63A5)...
+SetLinkAnchorAction.text=\u8BBE\u5B9A\u8282\u70B9\u8DF3\u8F6C(anchor)
+SetLinkAnchorAction.tooltip=<html>set selected node as anchor for future<br/>creation of local or global links.
+SetLinkAnchorAction.tooltip_anchored=<html>set selected node as anchor for future<br/>creation of local or global links. Current anchor:<br/>{0}
SetLinkByFileChooserAction.text=\u52A0\u5165\u8D85\u94FE\u63A5(\u6587\u4EF6)...
-SetLinkByTextFieldAction.text=\u52a0\u5165\u8d85\u94fe\u63a5(\u6587\u5b57)...
-SetNodeLink.text=\u8bbe\u5b9a\u59d0\u5f1f\u554a\u94fe\u63a5...
-SetNoteWindowPosition.bottom.text=\u5e95\u90e8
-SetNoteWindowPosition.left.text=\u5de6\u8fb9
-SetNoteWindowPosition.right.text=\u53f3\u8fb9
-SetNoteWindowPosition.top.text=\u9876\u90e8
-SetShortenerStateAction.text=\u6700\u5c0f\u5316\u8282\u70b9
-sf_login_required=\u9700\u8981\u767b\u5f55Source Forge\u3002\u7ee7\u7eed\u5417\uff1f
+SetLinkByTextFieldAction.text=\u52A0\u5165\u8D85\u94FE\u63A5(\u6587\u5B57)...
+SetNodeLink.text=\u8BBE\u5B9A\u59D0\u5F1F\u554A\u94FE\u63A5...
+SetNoteWindowPosition.bottom.text=\u5E95\u90E8
+SetNoteWindowPosition.left.text=\u5DE6\u8FB9
+SetNoteWindowPosition.right.text=\u53F3\u8FB9
+SetNoteWindowPosition.top.text=\u9876\u90E8
+SetShortenerStateAction.text=\u6700\u5C0F\u5316\u8282\u70B9
+sf_login_required=\u9700\u8981\u767B\u5F55Source Forge\u3002\u7EE7\u7EED\u5417\uFF1F
ShowAllAttributesAction.text=\u663E\u793A\u6240\u6709\u5C5E\u6027
ShowAncestorsAction.text=\u663E\u793A\u4E0A\u4EE3
ShowAttributeDialogAction.text=\u5C5E\u6027\u7BA1\u7406\u5668...
ShowDescendantsAction.text=\u663E\u793A\u540E\u4EE3
-ShowFilterToolbarAction.text=\u8fc7\u6ee4\u5668\u5de5\u5177\u6761
-ShowFormatPanel.text=\u5c5e\u6027\u9762\u677f
-ShowFormatPanel.tooltip=\u5448\u73b0\u4e00\u4e2a\u5bf9\u8bdd\u6846, \u5176\u4e2d\u8282\u70b9\u548c\u5206\u652f\u7ebf\u7684\u5c5e\u6027\u53ef\u4ee5\u540c\u65f6\u4fee\u6539.
+ShowFilterToolbarAction.text=\u8FC7\u6EE4\u5668\u5DE5\u5177\u6761
+ShowFormatPanel.text=\u5C5E\u6027\u9762\u677F
+ShowFormatPanel.tooltip=\u5448\u73B0\u4E00\u4E2A\u5BF9\u8BDD\u6846, \u5176\u4E2D\u8282\u70B9\u548C\u5206\u652F\u7EBF\u7684\u5C5E\u6027\u53EF\u4EE5\u540C\u65F6\u4FEE\u6539.
ShowHideNoteAction.text=\u6CE8\u89E3\u7A97\u53E3
-ShowHideNoteAction.tooltip=\u8ba9\u6ce8\u89e3\u7a97\u53e3\u51fa\u73b0\u6216\u6d88\u5931.
-ShowNextChildAction.text=\u663e\u793a\u4e0b\u4e00\u4e2a\u513f\u5b50
-ShowNotesInMapAction.text=\u5728\u601d\u7ef4\u5bfc\u56fe\u4e0a\u663e\u793a\u6ce8\u89e3
+ShowHideNoteAction.tooltip=\u8BA9\u6CE8\u89E3\u7A97\u53E3\u51FA\u73B0\u6216\u6D88\u5931.
+ShowNextChildAction.text=\u663E\u793A\u4E0B\u4E00\u4E2A\u513F\u5B50
+ShowNotesInMapAction.text=\u5728\u601D\u7EF4\u5BFC\u56FE\u4E0A\u663E\u793A\u6CE8\u89E3
ShowSelectedAttributesAction.text=\u663E\u793A\u9009\u62E9\u7684\u5C5E\u6027
ShowSelectionAsRectangleAction.text=\u77E9\u5F62\u9009\u62E9
simplyhtml.aboutFrameTitle=\u5173\u4E8E\u672C\u7A0B\u5E8F
@@ -1534,8 +1678,8 @@ simplyhtml.findReplaceLabel=\u67E5\u627E\u66FF\u6362
simplyhtml.findReplaceTip=\u67E5\u627E\u66FF\u6362
simplyhtml.fontBoldLabel=\u7C97\u4F53
simplyhtml.fontBoldTip=\u5207\u6362\u7C97\u4F53 \u5F00/\u5173
-simplyhtml.fontColorLabel=\u6587\u672c\u989c\u8272
-simplyhtml.fontColorTip=\u6587\u672c\u989c\u8272
+simplyhtml.fontColorLabel=\u6587\u672C\u989C\u8272
+simplyhtml.fontColorTip=\u6587\u672C\u989C\u8272
simplyhtml.fontDialogTitle=\u5B57\u4F53\u683C\u5F0F
simplyhtml.fontItalicLabel=\u659C\u4F53
simplyhtml.fontItalicTip=\u5207\u6362\u659C\u4F53 \u5F00/\u5173
@@ -1579,10 +1723,10 @@ simplyhtml.listTypeSquare=\u65B9\u5757\u9879\u76EE\u7B26\u53F7
simplyhtml.listTypeUpperAlpha=A.,B.,C.,D.
simplyhtml.listTypeUpperRoman=I.,II.,III.,IV.
simplyhtml.marginLabel=\u9875\u8FB9\u8DDD(\u5916)
-simplyhtml.matchApproximately=\u8fd1\u4f3c\u5339\u914d
-simplyhtml.matchApproximately.tooltip=<html>\u662f\u5426\u5141\u8bb8\u8fd1\u4f3c\u5339\u914d,<br/>i.e. searching for 'files' will find 'flies'.</html>
+simplyhtml.matchApproximately=\u8FD1\u4F3C\u5339\u914D
+simplyhtml.matchApproximately.tooltip=<html>\u662F\u5426\u5141\u8BB8\u8FD1\u4F3C\u5339\u914D,<br/>i.e. searching for 'files' will find 'flies'.</html>
simplyhtml.matchCase=\u533A\u5206\u5927\u5C0F\u5199
-simplyhtml.matchCase.tooltip=\u67e5\u627e\u65f6\u662f\u5426\u533a\u5206\u5927\u5c0f\u5199
+simplyhtml.matchCase.tooltip=\u67E5\u627E\u65F6\u662F\u5426\u533A\u5206\u5927\u5C0F\u5199\u3002
simplyhtml.newStyleDefaultName=\u65B0\u6837\u5F0F
simplyhtml.nextTableCellLabel=\u4E0B\u4E00\u4E2A\u5355\u5143\u683C
simplyhtml.noLineLabel=\u65E0
@@ -1597,9 +1741,9 @@ simplyhtml.paraAlignRightLabel=\u53F3\u5BF9\u9F50
simplyhtml.paraAlignRightTip=\u8BBE\u7F6E\u6BB5\u843D\u53F3\u5BF9\u9F50
simplyhtml.paraStyleDialogTitle=\u6BB5\u843D\u6837\u5F0F
simplyhtml.paraTabLabel=\u6BB5\u843D
-simplyhtml.pasteHTMLLabel=\u7c98\u8d34HTML
+simplyhtml.pasteHTMLLabel=\u7C98\u8D34HTML
simplyhtml.pasteLabel=\u7C98\u8D34
-simplyhtml.pastePlainTextLabel=\u7c98\u8d34\u4e3a\u7eaf\u6587\u672c
+simplyhtml.pastePlainTextLabel=\u7C98\u8D34\u4E3A\u7EAF\u6587\u672C
simplyhtml.pasteTip=\u7C98\u8D34
simplyhtml.plainName=\u65E0\u683C\u5F0F
simplyhtml.previewLabel=\u9884\u89C8
@@ -1617,11 +1761,11 @@ simplyhtml.replaceWith=\u66FF\u6362\u4E3A:
simplyhtml.replaceYes=\u662F
simplyhtml.rightLabel=\u53F3:
simplyhtml.searchDown=\u5411\u4E0B\u67E5\u627E
-simplyhtml.searchDown.tooltip=\u4ece\u6700\u4e0a\u4e00\u884c\u5f00\u59cb\u67e5\u627e
+simplyhtml.searchDown.tooltip=\u4ECE\u6700\u4E0A\u4E00\u884C\u5F00\u59CB\u67E5\u627E\u3002
simplyhtml.searchFromStart=\u4ECE\u5F00\u59CB\u67E5\u627E
-simplyhtml.searchFromStart.tooltip=\u4ece\u6700\u4e0a\u4e00\u884c\u5f00\u59cb\u67e5\u627e\uff0c\u800c\u4e0d\u662f\u4ece\u5149\u6807\u6240\u5728\u4f4d\u7f6e
+simplyhtml.searchFromStart.tooltip=\u4ECE\u6700\u4E0A\u4E00\u884C\u5F00\u59CB\u67E5\u627E\uFF0C\u800C\u4E0D\u662F\u4ECE\u5149\u6807\u6240\u5728\u4F4D\u7F6E\u3002
simplyhtml.searchUp=\u5411\u4E0A\u67E5\u627E
-simplyhtml.searchUp.tooltip=\u4ece\u6700\u672b\u4e00\u884c\u5f80\u4e0a\u67e5\u627e
+simplyhtml.searchUp.tooltip=\u4ECE\u6700\u672B\u4E00\u884C\u5F80\u4E0A\u67E5\u627E\u3002
simplyhtml.selectAllLabel=\u5168\u9009
simplyhtml.sizeLabel=\u5B57\u53F7
simplyhtml.standardStyleName=\u6807\u51C6
@@ -1648,7 +1792,7 @@ simplyhtml.uLineLabel=\u4E0B\u5212\u7EBF
simplyhtml.unableToOpenFileError=\u6253\u4E0D\u5F00\u6587\u4EF6
simplyhtml.unableToRedoError=\u4E0D\u80FD\u91CD\u505A:
simplyhtml.unableToUndoError=\u4E0D\u80FD\u64A4\u9500:
-simplyhtml.undoLabel=\u64a4\u9500
+simplyhtml.undoLabel=\u64A4\u9500
simplyhtml.undoTip=\u64A4\u9500
simplyhtml.valignBaseline=\u57FA\u7EBF
simplyhtml.valignBottom=\u5E95\u90E8
@@ -1656,107 +1800,136 @@ simplyhtml.valignLabel=\u5782\u76F4\u5BF9\u9F50:
simplyhtml.valignMiddle=\u4E2D\u95F4
simplyhtml.valignTop=\u9876\u90E8
simplyhtml.wholeWordsOnly=\u5168\u5B57\u5339\u914D
-simplyhtml.wholeWordsOnly.tooltip=\u4e25\u683c\u5339\u914d\u5168\u5b57
+simplyhtml.wholeWordsOnly.tooltip=\u4E25\u683C\u5339\u914D\u5168\u5B57\u3002
SortNodes.text=\u6392\u5E8F\u5B50\u8282\u70B9
SortNodes.tooltip=\u6309\u5B57\u6BCD\u987A\u5E8F\u6392\u5E8F\u6240\u6709\u5B50\u8282\u70B9.
-split=\u62c6\u5206
-SplitConditionAction.text=\u62c6\u5206
-SplitNode.text=\u62c6\u5206\u8282\u70b9(&S)
-SplitNode.tooltip=<html>\u8282\u70b9\u62c6\u5206</html>
-STANDARD_FORMAT=\u6807\u51c6
-stop_processing=\u505c\u6b62
-StringFlavorHandler=\u7eaf\u6587\u672c\u4f5c\u4e3a\u8282\u70b9\u5c42\u6b21\u7ed3\u6784
-StructuredHtmlFlavorHandler=HTML\u4f5c\u4e3a\u8282\u70b9\u5c42\u6b21\u7ed3\u6784
+split=(&S)\u62C6\u5206
+SplitConditionAction.text=\u62C6\u5206
+SplitNode.text=\u62C6\u5206\u8282\u70B9(S)
+SplitNode.tooltip=<html>\u8282\u70B9\u62C6\u5206</html>
+SplitToWordsAction.text=Split with {0} words in line
+STANDARD_FORMAT=\u6807\u51C6
+stop_processing=\u505C\u6B62
+StringFlavorHandler=\u7EAF\u6587\u672C\u4F5C\u4E3A\u8282\u70B9\u5C42\u6B21\u7ED3\u6784
+StructuredHtmlFlavorHandler=HTML\u4F5C\u4E3A\u8282\u70B9\u5C42\u6B21\u7ED3\u6784
style=\u6837\u5F0F
-style_already_exists=\u6837\u5f0f\u5df2\u7ecf\u5b58\u5728
-styledialog.cancel.text=\u53d6\u6d88
-styledialog.ok.text=\u786e\u5b9a
-styles=\u6837\u5f0f
-styles.AutomaticLayout=\u5e94\u7528\u5c42\u6b21\u6837\u5f0f
-styles.connection=\u8fde\u63a5\u70b9
-styles.date=\u65e5\u671f
-styles.definition=\u5b9a\u4e49
-styles.description=\u63cf\u8ff0
-styles.floating_node=\u6d6e\u52a8\u8282\u70b9
-styles.idea=\u60f3\u6cd5
-styles.important=\u91cd\u8981
-styles.key=\u94a5\u5319
+style_already_exists=\u6837\u5F0F\u5DF2\u7ECF\u5B58\u5728\u3002
+styledialog.cancel.text=\u53D6\u6D88
+styledialog.ok.text=\u786E\u5B9A
+styles=\u6837\u5F0F
+styles.AutomaticLayout=\u5E94\u7528\u5C42\u6B21\u6837\u5F0F
+styles.connection=\u8FDE\u63A5\u70B9
+styles.date=\u65E5\u671F
+styles.definition=\u5B9A\u4E49
+styles.description=\u63CF\u8FF0
+styles.floating_node=\u6D6E\u52A8\u8282\u70B9
+styles.idea=\u60F3\u6CD5
+styles.important=\u91CD\u8981
+styles.key=\u94A5\u5319
styles.list=\u5217\u8868
-styles.needs_action=\u9700\u8981\u884c\u52a8
-styles.note=\u6ce8\u89e3
+styles.needs_action=\u9700\u8981\u884C\u52A8
+styles.note=\u6CE8\u89E3
styles.ok=OK
-styles.pending=\u7b49\u5f85
-styles.predefined=\u9884\u5b9a\u4e49\u6837\u5f0f
-styles.question=\u95ee\u9898
-styles.quotation=\u5f15\u8ff0
-styles.root_node=\u6837\u5f0f
-styles.subsubtopic=\u6b21\u5b50\u6807\u9898
-styles.subtopic=\u5b50\u6807\u9898
+styles.pending=\u7B49\u5F85
+styles.predefined=\u9884\u5B9A\u4E49\u6837\u5F0F
+styles.question=\u95EE\u9898
+styles.quotation=\u5F15\u8FF0
+styles.root_node=\u6837\u5F0F
+styles.subsubtopic=\u6B21\u5B50\u6807\u9898
+styles.subtopic=\u5B50\u6807\u9898
styles.topic=\u6807\u9898
-styles.user-defined=\u7528\u6237\u81ea\u5b9a\u4e49\u6837\u5f0f
-styles.website=\u7f51\u7ad9
-styles_menu=\u53ef\u7528\u7684\u6837\u5f0f
-submenu_keystroke_in_use_error=\u5b50\u83dc\u5355{1}\u4e0d\u80fd\u4f7f\u7528\u6309\u952e{0}\u3002\u6309\u952e\u5df2\u5220\u9664\u3002
-summary_nodes=\u603b\u7ed3\u8282\u70b9
-summary_not_possible=\u65e0\u6cd5\u5bf9\u76ee\u524d\u9009\u53d6\u7684\u5efa\u7acb\u603b\u7ed3\u8282\u70b9
-SummaryNodeAction.text=\u8bbe\u5b9a/\u53d6\u6d88 \u603b\u7ed3\u8282\u70b9
+styles.user-defined=\u7528\u6237\u81EA\u5B9A\u4E49\u6837\u5F0F
+styles.website=\u7F51\u7AD9
+styles_background_html=\n <html>\n <head>\n </head>\n <body>\n <table width="800" style="text-align: left; vertical-align: top">\n <tr valign="top">\n <th>\n <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold">\n About this style set\n </div>\n <div style="text-align: left; font-weight: normal">\n <div style="margin: 3pt">\n This standard was developed after 11 years pedagogy research about how to make the process o [...]
+styles_menu=\u53EF\u7528\u7684\u6837\u5F0F
+submenu_keystroke_in_use_error=\u5B50\u83DC\u5355{1}\u4E0D\u80FD\u4F7F\u7528\u6309\u952E{0}\u3002\u6309\u952E\u5DF2\u5220\u9664\u3002
+summary_nodes=\u603B\u7ED3\u8282\u70B9
+summary_not_possible=\u65E0\u6CD5\u5BF9\u76EE\u524D\u9009\u53D6\u7684\u5EFA\u7ACB\u603B\u7ED3\u8282\u70B9
svg=SVG
-template_dir=\u6807\u51c6\u6a21\u7248
+template_dir=\u6807\u51C6\u6A21\u7248
+TextAlignAction.CENTER.text=\u6587\u5B57\u5C45\u4E2D
+TextAlignAction.DEFAULT.text=\u9ED8\u8BA4
+TextAlignAction.LEFT.text=\u6587\u5B57\u5DE6\u5BF9\u9F50
+TextAlignAction.RIGHT.text=\u6587\u5B57\u53F3\u5BF9\u9F50
+textalignment=\u6587\u5B57\u5BF9\u9F50
TimeListAction.text=\u663E\u793A\u65E5\u7A0B\u5B89\u6392 ...
TimeListAction.tooltip=\u663E\u793A\u6240\u6709\u65E5\u7A0B\u53CA\u76F8\u5E94\u8282\u70B9.
TimeManagementAction.text=\u663E\u793A\u65E5\u5386...
TimeManagementAction.tooltip=<html>\u663E\u793A\u65E5\u5386\u6A21\u5757 by Kai Toedter.</html>
+TimePeriodUnits.days=\u5929
+TimePeriodUnits.hours=\u5C0F\u65F6
+TimePeriodUnits.minutes=\u5206\u949F
+TimePeriodUnits.ms=\u6BEB\u79D2
+TimePeriodUnits.seconds=\u79D2
+TimePeriodUnits.weeks=\u5468
ToggleChildrenFoldedAction.text=\u5C55\u5F00/\u6298\u53E0\u5B50\u8282\u70B9
-ToggleDetailsAction.text=\u9690\u85cf\u8282\u70b9\u7ec6\u8282
+ToggleDetailsAction.text=\u9690\u85CF\u8282\u70B9\u7EC6\u8282
ToggleFBarAction.text=F-Bar
ToggleFoldedAction.text=\u5C55\u5F00/\u6298\u53E0\u8282\u70B9
-ToggleFullScreenAction.text=\u5168\u5c4f\u6a21\u5f0f
-ToggleLeftToolbarAction.text=\u5DE6\u4FA7\u5DE5\u5177\u680F
+ToggleFullScreenAction.text=\u5168\u5C4F\u6A21\u5F0F
+ToggleLeftToolbarAction.text=\u56FE\u6807\u5DE5\u5177\u680F
ToggleMenubarAction.text=\u83DC\u5355\u680F
-ToggleStatusAction.text=\u663e\u793a\u72b6\u6001\u5217
+ToggleScrollbarsAction.text=\u6EDA\u52A8
+ToggleStatusAction.text=\u663E\u793A\u72B6\u6001\u5217
ToggleToolbarAction.text=\u5DE5\u5177\u680F
-undefined_error=\u53d1\u751f\u4e86\u4e00\u4e2a\u610f\u5916\u9519\u8bef\u3002\u8bf7\u8bd5\u7740\u63d0\u4ea4\u4e00\u4e2a\u9519\u8bef\u62a5\u544a\u3002
+toolbars=\u5DE5\u5177\u680F
+undefined_error=\u53D1\u751F\u4E86\u4E00\u4E2A\u610F\u5916\u9519\u8BEF\u3002\u8BF7\u8BD5\u7740\u63D0\u4EA4\u4E00\u4E2A\u9519\u8BEF\u62A5\u544A\u3002
underline=\u4E0B\u5212\u7EBF
-UnderlineAction.text=\u4e0b\u5212\u7ebf
-underlined=\u52a0\u4e0a\u4e0b\u5212\u7ebf
-UndoAction.text=\u64a4\u9500
-UndoFilterAction.text=\u64a4\u9500
+UnderlineAction.text=\u4E0B\u5212\u7EBF
+underlined=\u52A0\u4E0A\u4E0B\u5212\u7EBF
+UndoAction.text=\u64A4\u9500
+UndoFilterAction.text=\u64A4\u9500
unfold=\u5C55\u5F00
-UnfoldAllAction.text=\u5c55\u5f00\u6240\u6709
-UnfoldAllAction.tooltip=<html>\u5c55\u5f00\u9009\u5b9a\u7684\u8282\u70b9\u53ca\u5176\u6240\u6709\u5b50\u8282\u70b9\u3002</html>
-UnfoldOneLevelAction.text=\u5c55\u5f00\u4e00\u7ea7
-UnfoldOneLevelAction.tooltip=<html>\u53ea\u5c55\u5f00\u9009\u5b9a\u7684\u4e00\u7ea7\u8282\u70b9\u3002</html>
-up=\u5411\u4e0a
-update_failed=\u66f4\u65b0\u5931\u8d25\u4fe1\u606f\uff1a{0}
-UpdateCheckAction.text=\u68c0\u67e5\u66f4\u65b0
-updatecheckdialog=\u68c0\u67e5\u66f4\u65b0\u5bf9\u8bdd\u6846
+UnfoldAllAction.text=\u5C55\u5F00\u6240\u6709
+UnfoldAllAction.tooltip=<html>\u5C55\u5F00\u9009\u5B9A\u7684\u8282\u70B9\u53CA\u5176\u6240\u6709\u5B50\u8282\u70B9\u3002</html>
+UnfoldOneLevelAction.text=\u5C55\u5F00\u4E00\u7EA7
+UnfoldOneLevelAction.tooltip=\u5C55\u5F00\u9009\u5B9A\u8282\u70B9\u7684\u4E00\u7EA7\u3002
+unparsedLatexPatternFormat=\u672A\u89E3\u6790\u7684 LaTeX
+up=\u5411\u4E0A
+UpConditionAction.text=\u4E0A
+update_failed=\u66F4\u65B0\u5931\u8D25\u4FE1\u606F\uFF1A{0}
+UpdateCheckAction.text=\u68C0\u67E5\u66F4\u65B0
+updatecheckdialog=\u68C0\u67E5\u66F4\u65B0\u5BF9\u8BDD\u6846
+updater.component=\u7EC4\u4EF6
+updater.goToDownload=\u8F6C\u5230\u4E0B\u8F7D
+updater.version.installed=\u5DF2\u5B89\u88C5\u7248\u672C
+updater.version.latest=\u6700\u65B0\u7248\u672C
+updater.version.noUpdateUrl=\u6B64\u9644\u52A0\u7EC4\u4EF6\u6CA1\u6709\u66F4\u65B0\u7F51\u5740\u4E0E\u9996\u9875\u3002
+updater.version.unknown=\u672A\u77E5
+updater.version.unreachable=\u65E0\u6CD5\u83B7\u5F97\u6E90\uFF1A
+updater.viewChangelog=\u67E5\u770B\u66F4\u6539\u65E5\u5FD7
url_error=URL \u683C\u5F0F\u9519\u8BEF!
-url_open_error=\u65e0\u6cd5\u6253\u5f00URL{0}\u3002
-used_in_menu=\u6b64\u5feb\u6377\u65b9\u5f0f\u4e0d\u80fd\u8bbe\u5b9a\uff0c\u56e0\u4e3a\u5df2\u7ecf\u7528\u4f5c\u83dc\u5355\u5feb\u6377\u65b9\u5f0f\u3002
+url_open_error=\u65E0\u6CD5\u6253\u5F00URL{0}\u3002
+used_in_menu=\u6B64\u5FEB\u6377\u65B9\u5F0F\u4E0D\u80FD\u8BBE\u5B9A\uFF0C\u56E0\u4E3A\u5DF2\u7ECF\u7528\u4F5C\u83DC\u5355\u5FEB\u6377\u65B9\u5F0F\u3002
UsePlainTextAction.text=\u4F7F\u7528\u7EAF\u6587\u672C
-user_config_folder=\u7528\u6237\u914d\u7f6e\u6587\u4ef6\u5939\uff1a{0}
-user_defined_scale=\u7528\u6237\u5b9a\u4e49\u6bd4\u4f8b
-user_defined_zoom=\u7528\u6237\u5B9A\u4E49.
+user_config_folder=\u7528\u6237\u914D\u7F6E\u6587\u4EF6\u5939\uFF1A{0}
+user_defined_filters=\u7528\u6237\u5B9A\u4E49\u8FC7\u6EE4\u5668
+user_defined_scale=\u7528\u6237\u5B9A\u4E49\u6BD4\u4F8B
+user_defined_zoom=\u7528\u6237\u5B9A\u4E49
user_defined_zoom_status_bar=\u7F29\u653E\u4E3A\u7528\u6237\u5B9A\u4E49\u7684 {0}%.
-user_icon=\u7528\u6237\u56fe\u6807"{0}"
-user_template_dir=\u7528\u6237\u6a21\u7248
+user_icon=\u7528\u6237\u56FE\u6807"{0}"
+user_template_dir=\u7528\u6237\u6A21\u7248
user_zoom=\u6253\u5370\u7F29\u653E\u7CFB\u6570 (0.0 - 2.0):
-value_format=\u53d8\u91cf\u683c\u5f0f
-version_up_to_date=\u4f60\u5f53\u524d\u4f7f\u7528\u7684\u662f\u6700\u65b0\u7248\u672c\u7a0b\u5e8f
-ViewerControllerAction.text=\u5916\u90e8\u5bf9\u8c61...
-ViewLayoutTypeAction.OUTLINE.text=\u5927\u7eb2\u89c6\u56fe
+userScripts=\u811A\u672C
+value_format=\u53D8\u91CF\u683C\u5F0F
+version_up_to_date=\u4F60\u5F53\u524D\u4F7F\u7528\u7684\u662F\u6700\u65B0\u7248\u672C\u7A0B\u5E8F
+view=\u89C6\u56FE(&V)
+ViewLayoutTypeAction.OUTLINE.text=\u5927\u7EB2\u89C6\u56FE
+web_resources=\u7F51\u7EDC\u8D44\u6E90
WebDocuAction.text=Web \u6587\u6863
+WhatsNewAction.text=What's new in Freeplane 1.5.x
width=\u5BBD\u5EA6
-wrong_regexp=\u9519\u8bef\u7684\u6b63\u5219\u8868\u8fbe\u5f0f"{0}"\uff0c\u9519\u8bef\uff1a{1}
+wrong_regexp=\u9519\u8BEF\u7684\u6B63\u5219\u8868\u8FBE\u5F0F"{0}"\uFF0C\u9519\u8BEF\uFF1A{1}
xslt_export.html=HTML \u6587\u6863
xslt_export.latex=LateX \u6587\u6863
-xslt_export.latexbook=LateX \u4e66
+xslt_export.latexbook=LateX \u4E66
xslt_export.mediawiki=Mediawiki
-xslt_export.ms_excel=Excel (2003 \u548c\u4e4b\u540e\u7248\u672c) XML \u683c\u5f0f
-xslt_export.ms_project=MS Project (2003 \u548c\u4e4b\u540e\u7248\u672c) XML \u683c\u5f0f
-xslt_export.ms_word=Word (2003 \u548c\u4e4b\u540e\u7248\u672c) XML \u683c\u5f0f
-xslt_export.text=\u7eaf\u6587\u5b57
-xslt_export_not_possible=\u4e0d\u5141\u8bb8Freeplane XSLT\u5bfc\u51fa
+xslt_export.ms_excel=Excel (2003 \u548C\u4E4B\u540E\u7248\u672C) XML \u683C\u5F0F
+xslt_export.ms_project=MS Project (2003 \u548C\u4E4B\u540E\u7248\u672C) XML \u683C\u5F0F
+xslt_export.ms_word=Word (2003 \u548C\u4E4B\u540E\u7248\u672C) XML \u683C\u5F0F
+xslt_export.text=\u7EAF\u6587\u5B57
+xslt_export_not_possible=\u4E0D\u5141\u8BB8Freeplane XSLT\u5BFC\u51FA
yes=\u662F
+zoom=\u7F29\u653E
ZoomInAction.text=\u653E\u5927
ZoomOutAction.text=\u7F29\u5C0F
diff --git a/freeplane/resources/translations/Resources_zh_TW.properties b/freeplane/resources/translations/Resources_zh_TW.properties
index b203571..aa516c7 100644
--- a/freeplane/resources/translations/Resources_zh_TW.properties
+++ b/freeplane/resources/translations/Resources_zh_TW.properties
@@ -35,6 +35,7 @@ actual_node_styles=\u7BC0\u9EDE\u689D\u4EF6\u5F0F\u6A23\u5F0F
add=(&A)\u65B0\u589E
AddConnectorAction.text=\u589E\u52A0\u9023\u7D50\u7DDA
AddElementaryConditionAction.text=\u65B0\u589E
+AddExecutionLinkAction.text=\u589E\u52A0\u8D85\u9023\u7D50\u5230\u57F7\u884C\u4F5C\u696D\u7CFB\u7D71\u547D\u4EE4...
AddLocalLinkAction.text=\u65B0\u589E\u5167\u90E8\u7BC0\u9EDE\u8D85\u9023\u7D50
AddMenuItemLinkAction.text=\u65B0\u589E\u9078\u55AE\u9805\u76EE\u8D85\u9023\u7D50...
AddOnDetailsPanel.authored.by=\u4F5C\u8005\uFF1A{0}
@@ -82,7 +83,7 @@ antialias_all=\u9664\u53BB\u6240\u6709\u92F8\u9F52\u908A
antialias_edges=\u9664\u53BB\u92F8\u9F52\u908A
antialias_none=\u4E0D\u9664\u53BB\u92F8\u9F52\u908A
apply=(&A)\u5957\u7528
-ApplyAction.text=(&A)\u5957\u7528
+ApplyAction.text=(A)\u5957\u7528
ApplyFormatPlugin.text=\u66F4\u6539\u7BC0\u9EDE\u683C\u5F0F...
ApplyFormatPlugin.tooltip=\u986F\u793A\u5C0D\u8A71\u7A97\u4EE5\u4FEE\u6539\u7BC0\u9EDE\u548C\u5206\u652F\u7DDA.
ApplyNoFilteringAction.text=\u4E0D\u7BE9\u9078
@@ -96,6 +97,7 @@ attribute_delete_value=\u522A\u9664\u5C6C\u6027
attribute_font_size_tooltip=\u5C6C\u6027\u5B57\u578B
attribute_list_box_label_text=\u76EE\u524D\u6578\u503C
attribute_name=\u5C6C\u6027\u540D\u7A31
+attribute_name_or_value=\u5C6C\u6027\u540D\u7A31\u6216\u503C
attribute_replace=\u53D6\u4EE3
attribute_top=\u8F09\u5165\u5FC3\u667A\u5716\u7684\u6240\u6709\u5C6C\u6027
attribute_value=\u5C6C\u6027\u503C
@@ -137,14 +139,20 @@ attributes_visible_tooltip=\u986F\u793A/\u96B1\u85CF
automatic_layout=\u81EA\u52D5\u6392\u7248
automatic_layout_disabled=\u4E0D\u4F7F\u7528
automatically_save_message=\u6A94\u6848\u81EA\u52D5\u5B58\u6A94 (\u6A94\u540D\u662F{0}) ...
+AutomaticEdgeColor.FOR_BRANCHES=\u7D66\u5206\u652F
+AutomaticEdgeColor.FOR_COLUMN=\u70BA\u6B04\u4F4D
+AutomaticEdgeColor.FOR_COLUMNS=\u7D66\u6B04\u4F4D
+AutomaticEdgeColor.ON_BRANCH_CREATION=\u5728\u5206\u652F\u5275\u7ACB
AutomaticEdgeColorHookAction.text=\u81EA\u52D5\u5206\u652F\u984F\u8272
AutomaticLayout.ALL=\u6240\u6709
+AutomaticLayout.COLUMNS=\u70BA\u6B04\u4F4D
AutomaticLayout.HEADINGS=\u6A19\u984C
AutomaticLayout.level=\u7B2C {0} \u5C64\u7BC0\u9EDE\u683C\u5F0F
AutomaticLayout.level.root=\u4E3B\u7BC0\u9EDE\u683C\u5F0F
-AutomaticLayoutAction.text=(&A)\u81EA\u52D5\u6392\u7248
+AutomaticLayoutAction.text=(A)\u81EA\u52D5\u6392\u7248
AutomaticLayoutAction.tooltip=<html>\u81EA\u52D5\u8A2D\u5B9A\u6BCF\u5C64\u7BC0\u9EDE\u548C\u5206\u652F\u7DDA\u7684\u683C\u5F0F</html>
AutomaticLayoutControllerAction.ALL.text=\u5C0D\u6240\u6709\u7BC0\u9EDE
+AutomaticLayoutControllerAction.COLUMNS.text=\u70BA\u6B04\u4F4D
AutomaticLayoutControllerAction.HEADINGS.text=\u5C0D\u975E\u7D42\u7AEF\u7BC0\u9EDE
AutomaticLayoutControllerAction.null.text=\u4E0D\u4F7F\u7528
BackAction.text=\u8FD4\u56DE
@@ -167,7 +175,7 @@ can_not_delete_root_style=\u7121\u6CD5\u522A\u9664\u6839\u6A23\u5F0F
can_not_delete_style_group=\u7121\u6CD5\u522A\u9664\u6A23\u5F0F\u7FA4\u7D44
can_not_save_key_set=\u7121\u6CD5\u5132\u5B58\u5FEB\u901F\u9375\u96C6
cancel=(&C)\u53D6\u6D88
-CancelAction.text=(&C)\u53D6\u6D88
+CancelAction.text=(C)\u53D6\u6D88
cannot_add_parent_diff_parents=\u4F7F\u7528\u6B64\u529F\u80FD\u7684\u6240\u6709\u7BC0\u9EDE\u5FC5\u9808\u4F86\u81EA\u540C\u6A23\u7684\u7236\u7BC0\u9EDE\u3002
cannot_add_parent_to_root=\u4E3B\u7BC0\u9EDE\u4E0D\u80FD\u88AB\u52A0\u5230\u65B0\u7684\u7236\u7BC0\u9EDE\u3002
cannot_delete_root=\u4E3B\u7BC0\u9EDE\u4E0D\u53EF\u522A\u9664\u6216\u526A\u4E0B\u3002
@@ -196,8 +204,10 @@ choose_node_background_color=\u9078\u64C7\u7BC0\u9EDE\u7684\u80CC\u666F\u984F\u8
choose_node_color=\u9078\u64C7\u7BC0\u9EDE\u984F\u8272\uFF1A
ClearLinkAnchorAction.text=\u6E05\u9664\u9023\u7D50\u9328\u9EDE
ClearLinkAnchorAction.tooltip=<html>\u6E05\u9664\u5148\u524D\u8A2D\u5B9A\u7684\u7BC0\u9EDE\u9328\u9EDE</html>
+CloneAction.text=\u8CBC\u4E0A\u70BA\u8907\u88FD\u54C1
close_btn=(&C)\u95DC\u9589
-CloseAction.text=(&C)\u95DC\u9589\u76EE\u524D\u5FC3\u667A\u5716
+CloseAction.text=(C)\u95DC\u9589\u76EE\u524D\u5FC3\u667A\u5716
+cloud_shapes=\u96F2\u7684\u5F62\u72C0
CloudAction.text=\u96F2\u72C0\u5305\u8986
CloudColorAction.text=\u96F2\u7684\u984F\u8272...
CloudShapeAction.ARC.text=\u5F27\u5F62
@@ -214,13 +224,13 @@ connector_label=\u9023\u7D50\u7DDA\u6A19\u7C64
connector_lines=\u9023\u7D50\u7DDA\u7DDA\u689D
connector_shapes=\u9023\u7D50\u7DDA\u5916\u5F62
ConnectorColorAction.text=\u9023\u7D50\u7DDA\u984F\u8272...
-CopyAction.text=(&C)\u8907\u88FD
+CopyAction.text=(C)\u8907\u88FD
CopyAction.tooltip=\u8907\u88FD\u9078\u53D6\u7684\u5206\u652F
CopyAttributes.text=\u8907\u88FD\u5C6C\u6027
CopyIDAction.text=\u8907\u88FD\u7BC0\u9EDE\u8EAB\u5206\u78BC (ID)
CopyMapStylesAction.text=\u8907\u88FD\u5FC3\u667A\u5716\u6A23\u5F0F...
CopyNodeURIAction.text=\u8907\u88FD\u7BC0\u9EDE\u9023\u7D50\u7DB2\u5740 (URI)
-copyright=\u7248\u6B0A\u6240\u6709 \u00A9 2000-2014 Freeplane \u5718\u968A\u548C\u5176\u4ED6\u4EBA
+copyright=\u7248\u6B0A\u6240\u6709 \u00A9 2000-2016 Freeplane \u5718\u968A\u548C\u5176\u4ED6\u4EBA
CopySingleAction.text=\u8907\u88FD\u55AE\u4E00\u7BC0\u9EDE
CopySingleAction.tooltip=\u50C5\u8907\u88FD\u9078\u53D6\u7684\u7BC0\u9EDE
CopyStyleExtensionsAction.text=\u532F\u5165\u7BC0\u9EDE\u5EF6\u4F38\u6027\u8CEA\u7684\u6A23\u5F0F
@@ -228,7 +238,7 @@ corrupt_map=\u5FC3\u667A\u5716\u5167\u5BB9\u6BC0\u640D
CreateConjunctConditionAction.text=\u548C
CreateDisjunctConditionAction.text=\u6216
CreateNotSatisfiedConditionAction.text=\u975E
-CreationModificationPluginAction.text=(&m)\u986F\u793A\u4FEE\u6539\u6642\u9593
+CreationModificationPluginAction.text=(m)\u986F\u793A\u4FEE\u6539\u6642\u9593
CreationModificationPluginAction.tooltip=<html>\u6B64\u529F\u80FD\u986F\u793A\u7BC0\u9EDE\u5EFA\u7ACB\u548C\u4FEE\u6539\u7684\u6642\u9593\u3002</html>
current_dir=\u76EE\u524D\u5FC3\u667A\u5716\u76EE\u9304
CutAction.text=\u526A\u4E0B
@@ -236,6 +246,7 @@ decrease_branch_font_size=\u7E2E\u5C0F\u5B57\u578B
DecreaseNodeFontAction.text=\u7E2E\u5C0F\u5B57\u578B
default=\u9810\u8A2D
DefaultColorAction.text=\u9810\u8A2D\u984F\u8272
+defaultstyle.attributes=\u5C6C\u6027
defaultstyle.details=\u7D30\u7BC0
defaultstyle.floating=\u6D6E\u52D5\u7BC0\u9EDE
defaultstyle.note=\u8A3B\u89E3
@@ -263,7 +274,9 @@ edge=\u5206\u652F\u7DDA
edge_is_formatted_by_style=\u5206\u652F\u7DDA\u683C\u5F0F\u88AB\u6A23\u5F0F\u6240\u63A7\u5236, \u9700\u8981\u7684\u8A71\u7DE8\u8F2F\u76F8\u95DC\u6A23\u5F0F.
edge_style=\u5206\u652F\u7DDA\u6A23\u5F0F
edge_width=\u5206\u652F\u7DDA\u5BEC\u5EA6
+edge_widths=\u5206\u652F\u7DDA\u5BEC\u5EA6
EdgeColorAction.text=\u5206\u652F\u7DDA\u984F\u8272...
+EdgeProperties=\u5206\u652F\u7DDA\u6027\u8CEA
EdgeStyleAction.bezier.text=\u8C9D\u6C0F\u66F2\u7DDA
EdgeStyleAction.bezier.tooltip=<html>\u4EE5\u5E73\u6ED1\u66F2\u7DDA\u986F\u793A\u5206\u652F\u7DDA</html>
EdgeStyleAction.hide_edge.text=\u96B1\u85CF\u5206\u652F\u7DDA
@@ -306,7 +319,9 @@ EditScript=\u7DE8\u8F2F scripts...
EditStylesAction.text=\u7DE8\u8F2F\u6A23\u5F0F
EncryptedMap.text=\u65B0\u589E\u52A0\u5BC6\u5FC3\u667A\u5716...
EncryptedMap.tooltip=\u65B0\u589E\u52A0\u5BC6\u5FC3\u667A\u5716
+encryption=\u52A0\u5BC6
enter_base_url=\u5C07\u8CBC\u4E0A\u76F8\u5C0D\u9023\u7D50, \u8ACB\u8F38\u5165\u57FA\u6E96URL.
+enter_command=\u8F38\u5165\u547D\u4EE4
enter_condition_name=\u8F38\u5165\u65B0\u7684\u689D\u4EF6\u540D\u7A31
enter_confirms=\u6309Enter \u78BA\u8A8D
enter_keyset_name=\u8F38\u5165\u5FEB\u901F\u9375\u96C6\u540D\u7A31
@@ -320,6 +335,7 @@ error_applying_template=\u5957\u7528 XSL \u6A21\u677F\u7684\u6642\u5019\u932F\u8
error_creating_directory=\u7121\u6CD5\u5EFA\u7ACB\u532F\u51FA\u6A94\u6848\u76EE\u9304.
error_in_template=\u5167\u5B9A\u6A23\u677F\u5FC3\u667A\u5716 {0} \u6709\u932F\u8AA4. \u8ACB\u79FB\u9664\u9019\u500B\u6A94\u6848.
errornumber={0} \u932F\u8AA4
+ExecuteScript.script=Script
ExecuteScriptError.text=Script \u6307\u4EE4\u57F7\u884C\u932F\u8AA4\uFF1A\n{0}
ExecuteScriptForAllNodes.text=\u57F7\u884C\u6240\u6709 script \u6307\u4EE4
ExecuteScriptForSelectionAction.text=\u57F7\u884C\u9078\u53D6\u7684\u7BC0\u9EDE\u7684 script \u6307\u4EE4
@@ -333,7 +349,7 @@ export_failed=\u532F\u51FA\u5931\u6557
export_pdf_text=PDF\u6A94
export_svg_text=SVG \u6A94 (\u53EF\u7E2E\u653E\u5411\u91CF\u5716\u5F62\u6A94)
export_using_xslt=\u4F7F\u7528 XSLT \u532F\u51FA
-ExportAction.text=(&E)\u532F\u51FA\u5FC3\u667A\u5716...
+ExportAction.text=(E)\u532F\u51FA\u5FC3\u667A\u5716...
ExportBranchAction.text=\u5C07\u5206\u652F\u79FB\u5230\u65B0\u7684\u5FC3\u667A\u5716...
ExportBranchToHTMLAction.text=\u5C07\u5206\u652F\u4F5C\u6210 HTML
exported_file=\u532F\u51FA\u7684\u6A94\u6848 {0}
@@ -353,6 +369,7 @@ ExternalImageChangeAction.text=\u66F4\u63DB\u5716\u7247...
ExternalImageRemoveAction.text=\u79FB\u9664\u5716\u7247
ExtractLinkFromTextAction.text=\u8403\u53D6\u8D85\u9023\u7D50
ExtractLinkFromTextAction.tooltip=\u5F9E\u7BC0\u9EDE\u6587\u5B57\u4E2D\u627E\u5230\u4E26\u8A2D\u5B9A\u8D85\u9023\u7D50
+extras=(&T)\u5DE5\u5177
f_button_unassigned=<\u672A\u8A2D\u5B9A\u52D5\u4F5C>
FaqOpenURLAction.text=\u5E38\u898B\u554F\u984C\u89E3\u7B54
file=\u6A94\u6848
@@ -383,7 +400,7 @@ FileRevisionsDialog.question=\u767C\u73FE {0} \u7684\u4FEE\u8A02\u7248
FileRevisionsDialog.restore=\u56DE\u5FA9
FileRevisionsDialog.restore.tooltip=\u7528 {1} \u53D6\u4EE3 {0}
FileRevisionsDialog.title=\u6A94\u6848\u4FEE\u8A02
-filter=\u7BE9\u9078
+filter=(&i)\u7BE9\u9078
filter_add=\u65B0\u589E
filter_and=AND
filter_any_text=\u7BC0\u9EDE\u6838\u5FC3, \u7D30\u7BC0\u548C\u8A3B\u89E3
@@ -433,11 +450,11 @@ filter_selected_node_view=\u76EE\u524D\u9078\u53D6\u7684\u7BC0\u9EDE
filter_selected_node_view_snapshot=\u5132\u5B58\u9078\u53D6\u7684\u7BC0\u9EDE
filter_style=\u6A23\u5F0F
filter_time=\u65E5\u671F\u7BE9\u9078
-FilterComposerDialog.save=(&S)\u5132\u5B58
filters_not_loaded=\u7BE9\u9078\u6A94\u7121\u6CD5\u8F09\u5165
find_what=\u5C0B\u627E
FindAction.text=\u641C\u5C0B...
-FirstGroupNodeAction.text=\u8A2D\u5B9A/\u53D6\u6D88 \u7FA4\u7D44\u958B\u59CB\u7BC0\u9EDE
+FindNextAction.text=\u5C0B\u627E\u4E0B\u4E00\u500B
+FindPreviousAction.text=\u5C0B\u627E\u524D\u4E00\u500B
fit_map_to_page=(&F)\u8ABF\u6210\u4E00\u9801
fit_map_to_page_height=(&h)\u8ABF\u6210\u4E00\u9801\u9AD8
fit_map_to_page_width=(&w)\u8ABF\u6210\u4E00\u9801\u5BEC
@@ -453,10 +470,11 @@ FollowLinkAction.text=\u958B\u555F\u8D85\u9023\u7D50
font=\u5B57\u578B
FontFamilyAction.text=\u5B57\u9AD4
FontSizeAction.text=\u5B57\u578B\u5927\u5C0F
+format=(&o)\u683C\u5F0F
format_invalid_pattern=\u4E0D\u662F\u6709\u6548\u7684\u6A23\u5F0F
format_menu_cloud_shapes=\u96F2\u72C0\u5305\u8986 (\u65B0\u589E\u6216\u8B8A\u5F62)
-format_menu_edge_styles=\u5206\u652F\u7DDA\u6A23\u5F0F
-format_menu_edge_widths=\u5206\u652F\u7DDA\u5BEC\u5EA6
+format_menu_edge_styles=(&E)\u5206\u652F\u7DDA\u6A23\u5F0F
+format_menu_edge_widths=(&w)\u5206\u652F\u7DDA\u5BEC\u5EA6
format_panel=\u683C\u5F0F
FormatCopy.text=\u8907\u88FD\u683C\u5F0F
FormatCopy.tooltip=<html>\u8907\u88FD\u7BC0\u9EDE\u683C\u5F0F.</html>
@@ -646,14 +664,14 @@ IconSelectionPlugin.text=\u5C0F\u5716\u793A\u5217\u8868...
IconSelectionPlugin.tooltip=<html>\u958B\u5B50\u8996\u7A97\u9078\u64C7\u5C0F\u5716\u793A</html>
image_covertLink=\u5C07\u9023\u7D50\u8F49\u63DB\u6210\u5716\u7247
ImageFlavorHandler=\u5716\u7247 (\u4F7F\u7528\u4E0D\u540C\u7684\u6A94\u6848)
-import=\u532F\u5165
+import=(&m)\u532F\u5165
import_linked_branch_no_link=\u9078\u53D6\u7684\u7BC0\u9EDE\u7121\u9023\u7D50\u6A94\u6848\u53EF\u532F\u5165.
ImportAction.text=\u532F\u5165
ImportBranchAction.text=\u532F\u5165\u7279\u5B9A\u5FC3\u667A\u5716\u6210\u5206\u652F...
ImportExplorerFavoritesAction.text=\u532F\u5165\u6211\u7684\u6700\u611B...
ImportFolderStructureAction.text=\u532F\u5165\u6A94\u6848\u593E\u7684\u6A94\u6848\u6210\u9023\u7D50\u5206\u652F...
ImportLinkedBranchAction.text=\u532F\u5165\u9023\u7D50\u6A94\u6848\u6210\u5206\u652F
-ImportLinkedBranchWithoutRootAction.text=(&w)\u5DF2\u9023\u7D50\u7684\u5206\u652F\u7121 root...
+ImportLinkedBranchWithoutRootAction.text=(w)\u5DF2\u9023\u7D50\u7684\u5206\u652F\u7121 root...
ImportMindmanagerFiles.text=\u532F\u5165 MindManager X5...
increase_branch_font_size=\u52A0\u5927\u5B57\u578B
IncreaseNodeFontAction.text=\u52A0\u5927\u5B57\u578B
@@ -666,20 +684,25 @@ invalid_url_msg=\u7121\u6CD5\u5EFA\u7ACB\u6709\u6548\u7684 URL {0}
ItalicAction.text=\u659C\u9AD4
italicise_branch=\u659C\u9AD4
java_version=Java \u7248\u672C: {0}
-JoinNodesAction.text=\u5408\u4F75\u7BC0\u9EDE
latex_editor=\u7DE8\u8F2F LaTeX \u6578\u5B78\u5F0F
LatexDeleteLatexAction.text=\u79FB\u9664 LaTeX \u6578\u5B78\u5F0F
-LatexEditLatexAction.text=(&L)\u7DE8\u8F2F LaTeX \u6578\u5B78\u5F0F...
+LatexEditLatexAction.text=(L)\u7DE8\u8F2F LaTeX \u6578\u5B78\u5F0F...
LatexInsertLatexAction.msg1=<html>\u60A8\u5617\u8A66\u63D2\u5165\u4E00\u500B<i>\u820A\u5F0F</i>\u7684 LaTeX \u6578\u5B78\u5F0F\u3002<br/>\u65B0\u65B9\u6CD5\u5EFA\u7ACB LaTeX \u6587\u5B57/\u6578\u5B78\u5F0F\u63CF\u8FF0\u65BC\u6B64\u9801\u9762\u4E0A\uFF1A</html>
LatexInsertLatexAction.msg2=<html>\u7E3D\u4E4B\uFF1A<ul><li>\u5728\u7BC0\u9EDE\u6587\u5B57\u4F7F\u7528 "\\latex" \u524D\u7DB4\u6216\u662F</li><li><i>\u6AA2\u8996 -> \u6027\u8CEA\u9762\u677F</i>\uFF0C\u7136\u5F8C<i>\u7BC0\u9EDE\u6838\u5FC3 -> \u683C\u5F0F -> Latex</i></li></ul></html>
-LatexInsertLatexAction.text=(&L)\u65B0\u589E LaTeX \u6578\u5B78\u5F0F...
+LatexInsertLatexAction.text=(L)\u65B0\u589E LaTeX \u6578\u5B78\u5F0F...
latexPatternFormat=LaTeX
+LengthUnits.cm=cm
+LengthUnits.in=in
+LengthUnits.mm=mm
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=\u60A8\u5FC5\u9808\u81F3\u5C11\u9078\u53D6\u5169\u500B\u7BC0\u9EDE\u4F86\u5EFA\u7ACB\u9023\u7D50\u3002
license=\u6388\u6B0A\uFF1AGPL 2 \u6216\u4EE5\u5F8C\u7248\u672C
license_text=<html>This program is free software; you can redistribute it and/or<br>modify it under the terms of the GNU General Public License<br>as published by the Free Software Foundation; either version 2<br>of the License, or (at your option) any later version.<br><br>This program is distributed in the hope that it will be useful,<br>but WITHOUT ANY WARRANTY; without even the implied warranty of<br>MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>GNU General Public [...]
link_error=\u932F\u8AA4\u7684\u9023\u7D50 "{0}" \u672A\u8F09\u5165
link_not_available_any_more=\u9023\u7D50\u4E0D\u518D\u9069\u7528, \u7BC0\u9EDE\u5DF2\u88AB\u522A\u9664.
link_not_found=\u627E\u4E0D\u5230\u9023\u7D50 {0}\u3002
+links=\u8D85\u9023\u7D50
load=(&L)\u8F09\u5165
load_accelerator_presets=\u8F09\u5165
LoadAcceleratorPresetsAction.textPatterns.text=\u6587\u5B57\u6A23\u5F0F
@@ -727,8 +750,8 @@ ManageAddOnsDialog.tab.manage.themes=\u4E3B\u984C
ManageAddOnsDialog.tab.manage.themes.tooltip=\u7BA1\u7406\u5B89\u88DD\u7684\u4E3B\u984C
ManageAddOnsDialog.tab.manage.tooltip=\u7BA1\u7406\u5B89\u88DD\u7684\u9644\u52A0\u5143\u4EF6
ManageAddOnsDialog.visit.addon.page=\u62DC\u8A2A\u9644\u52A0\u5143\u4EF6\u7DB2\u9801...
-ManageConditionalStylesAction.text=(&M)\u7BA1\u7406\u5FC3\u667A\u5716\u7684\u689D\u4EF6\u6A23\u5F0F
-ManageNodeConditionalStylesAction.text=(&a)\u7BA1\u7406\u7BC0\u9EDE\u689D\u4EF6\u6A23\u5F0F
+ManageConditionalStylesAction.text=(M)\u7BA1\u7406\u5FC3\u667A\u5716\u7684\u689D\u4EF6\u6A23\u5F0F
+ManageNodeConditionalStylesAction.text=(a)\u7BA1\u7406\u7BC0\u9EDE\u689D\u4EF6\u6A23\u5F0F
map_already_exists=\u6B64\u5FC3\u667A\u5716\u5DF2\u5B58\u5728\uFF0C\u60A8\u8981\u8986\u5BEB\u55CE\uFF1F
map_corrupted=\u5FC3\u667A\u5716\u640D\u6BC0\uFF0C\u6AA2\u8996\u7D30\u7BC0\u55CE\uFF1F
map_load_error=\u7121\u6CD5\u7121\u6CD5\u8F09\u5165\u5FC3\u667A\u5716 {0}
@@ -747,10 +770,6 @@ menu_displayAttributes=\u7BC0\u9EDE\u5C6C\u6027
menu_encryption=\u5BC6\u78BC\u4FDD\u8B77
menu_error=\u4F7F\u7528\u8005\u5B9A\u7FA9\u7684\u9078\u55AE\u7D50\u69CB {0} \u6709\u932F\u8AA4\uFF1A\n{1}\n\u96E2\u958B
menu_extensions=\u7BC0\u9EDE\u5EF6\u4F38\u5167\u5BB9
-menu_extras=(&T)\u5DE5\u5177
-menu_file_import=(&m)\u532F\u5165
-menu_filter=(&i)\u7BE9\u9078
-menu_format=(&o)\u683C\u5F0F
menu_group=\u7FA4\u7D44\u7BC0\u9EDE
menu_hoverView=\u7BC0\u9EDE\u63D0\u793A
menu_iconByCategory=\u5C0F\u5716\u793A\u5206\u985E...
@@ -758,26 +777,20 @@ menu_iconView=\u5C0F\u5716\u793A
menu_image=\u5716\u7247
menu_insert=(&s)\u65B0\u589E
menu_latex_formula=LaTeX \u6578\u5B78\u5F0F
-menu_links=\u8D85\u9023\u7D50
menu_manageStyles=(&M)\u7BA1\u7406\u6A23\u5F0F
menu_moveNode=\u79FB\u52D5\u548C\u6392\u5E8F
-menu_navigate=(&N)\u5C0E\u89BD
menu_newNode=\u65B0\u589E\u7BC0\u9EDE
menu_node=\u7BC0\u9EDE
menu_node_features=(&u)\u7BC0\u9EDE\u7279\u9EDE
menu_nodes=(&N)\u7BC0\u9EDE
menu_nodeView=\u7BC0\u9EDE\u6838\u5FC3
-menu_notes=\u8A3B\u89E3
menu_noteView=\u8A3B\u89E3
menu_openmaps=\u5FC3\u667A\u5716
-menu_progress=\u9032\u5C55\u5C0F\u5716\u793A (%)
menu_remove_icons=\u79FB\u9664\u5C0F\u5716\u793A
menu_removeAttribute=\u79FB\u9664\u5C6C\u6027
menu_select=\u9078\u53D6
menu_time=\u6642\u9593\u7BA1\u7406
menu_title=\u7BC0\u9EDE\u6838\u5FC3\u5167\u5BB9
-menu_toolbars=\u5DE5\u5177\u5217
-menu_view=(&V)\u6AA2\u8996
menu_viewmode=\u6AA2\u8996\u8A2D\u5B9A
MenuUtils.invalid_menuitem={0} \u4E0D\u662F\u6709\u6548\u7684\u9078\u55AE\u9805\u76EE\u9375\u3002
mindmap=\u5FC3\u667A\u5716
@@ -799,10 +812,11 @@ ModesMenuAction.MindMap.text=\u5FC3\u667A\u5716\u7DE8\u8F2F\u5668
most_recent_files=\u6700\u8FD1\u958B\u555F\u7684\u6A94\u6848
MoveToRootAction.text=\u79FB\u5230\u4E3B\u7BC0\u9EDE
NameConditionAction.text=\u8A2D\u5B9A\u540D\u7A31
+navigate=(&N)\u5C0E\u89BD
NavigationNextMapAction.text=\u4E0B\u4E00\u5F35\u5FC3\u667A\u5716
NavigationPreviousMapAction.text=\u4E0A\u4E00\u5F35\u5FC3\u667A\u5716
new=(&N)\u65B0\u589E
-new_map_from_user_templates.text=(&t)\u7531\u6A23\u7248\u65B0\u589E\u5FC3\u667A\u5716...
+new_map_from_user_templates.text=(t)\u7531\u6A23\u7248\u65B0\u589E\u5FC3\u667A\u5716...
new_mindmap=\u65B0\u5FC3\u667A\u5716
new_node=\u65B0\u589E\u7D50\u9EDE
new_node_as_sibling_not_possible_for_the_root=\u65B0\u7BC0\u9EDE\u4E0D\u80FD\u662F\u4E3B\u7BC0\u9EDE\u7684\u5144\u5F1F\u7BC0\u9EDE
@@ -819,11 +833,10 @@ NewerFileRevisionsFoundDialog.question=\u767C\u73FE {0} \u7684\u8F03\u65B0\u7248
NewerFileRevisionsFoundDialog.restore=(&o)\u5FA9\u539F
NewerFileRevisionsFoundDialog.restore.tooltip=\u7528 {1} \u53D6\u4EE3 {0}
NewerFileRevisionsFoundDialog.title=\u767C\u73FE\u8F03\u65B0\u7684\u6A94\u6848\u7248\u672C!
-NewFreeNodeAction.text=\u65B0\u589E\u6D6E\u52D5\u7BC0\u9EDE
NewLevelStyleAction.text=\u65B0\u589E\u968E\u5C64\u6A23\u5F0F
newmap.install.addon.question={0} \u4F3C\u4E4E\u662F\u4E00\u500B\u9644\u52A0\u5143\u4EF6\n\u60A8\u60F3\u5B89\u88DD\u5B83\u55CE\uFF1F\n(\u9078\u64C7 No \u70BA\u6B63\u5E38\u958B\u555F)
newmap.install.addon.title=\u5B89\u88DD\u9644\u52A0\u5143\u4EF6\uFF1F
-NewMapAction.text=(&N)\u65B0\u589E\u5FC3\u667A\u5716
+NewMapAction.text=(N)\u65B0\u589E\u5FC3\u667A\u5716
NewMapViewAction.text=\u6AA2\u8996\u65B0\u7684\u5FC3\u667A\u5716
NewParentNode.text=\u65B0\u589E\u7236\u7BC0\u9EDE
NewParentNode.tooltip=<html>\u6240\u6709\u9078\u64C7\u7BC0\u9EDE\u5C07\u88AB\u9001\u5230\u4E00\u500B\u65B0\u7684\u7236\u7BC0\u9EDE.</html>
@@ -851,7 +864,7 @@ node_location_help=\u62D6\u66F3\u53EF\u4EE5\u8B8A\u66F4\u7BC0\u9EDE\u4F4D\u7F6E\
node_selector=\u7BC0\u9EDE\u9078\u53D6
node_selector_message=\u96D9\u9EDE\u64CA\u6ED1\u9F20\u4EE5\u9078\u53D6\u7BC0\u9EDE
node_styles=\u7BC0\u9EDE\u6A23\u5F0F
-NodeBackgroundColorAction.text=(&N)\u7BC0\u9EDE\u80CC\u666F\u984F\u8272...
+NodeBackgroundColorAction.text=(N)\u7BC0\u9EDE\u80CC\u666F\u984F\u8272...
NodeColorAction.text=\u7BC0\u9EDE\u6587\u5B57\u984F\u8272...
NodeColorBlendAction.text=\u7BC0\u9EDE\u6587\u5B57\u647B\u548C\u80CC\u666F\u984F\u8272
NodeDownAction.text=\u5C07\u7BC0\u9EDE\u79FB\u5230\u4E0B\u65B9
@@ -859,21 +872,27 @@ NodeExtensions.EditNodeExtensions=\u7DE8\u8F2F\u7BC0\u9EDE\u5EF6\u4F38\u6027\u8C
NodeExtensions.RemoveNodeExtensions=\u79FB\u9664\u7BC0\u9EDE\u5EF6\u4F38\u6027\u8CEA
NodeListAction.text=\u5728\u5FC3\u667A\u5716\u7684\u7BC0\u9EDE\u5217\u8868\u4E2D\u5C0B\u627E\u6216\u53D6\u4EE3 ...
NodeListAction.tooltip=\u986F\u793A\u6240\u6709\u7BC0\u9EDE\u7684\u5217\u8868, \u53EF\u5C0B\u627E\u6216\u53D6\u4EE3\u7BC0\u9EDE\u5167\u5BB9.
-NodeShapeAction.bubble.text=(&B)\u7BC0\u9EDE\u5916\u89C0\u6539\u6210\u6C23\u6CE1\u6846
-NodeShapeAction.fork.text=(&F)\u7BC0\u9EDE\u5916\u89C0\u6539\u6210\u5E95\u7DDA
+NodeShapeAction.bubble.text=(B)\u7BC0\u9EDE\u5916\u89C0\u6539\u6210\u6C23\u6CE1\u6846
+NodeShapeAction.fork.text=(F)\u7BC0\u9EDE\u5916\u89C0\u6539\u6210\u5E95\u7DDA
+NodeShapeAction.narrow_hexagon.text=\u72F9\u7A84\u516D\u89D2\u5F62
+NodeShapeAction.oval.text=\u6A62\u5713\u5F62
+NodeShapeAction.rectangle.text=\u77E9\u5F62
+NodeShapeAction.small_bubble.text=\u5C0F\u6C23\u6CE1
+NodeShapeAction.small_wide_hexagon.text=\u5C0F\u516D\u89D2\u5F62
+NodeShapeAction.wide_hexagon.text=\u5BEC\u516D\u89D2\u5F62
NodeUpAction.text=\u5C07\u7BC0\u9EDE\u79FB\u5230\u4E0A\u65B9
-NodeWidthAction.text=\u8A2D\u5B9A\u7BC0\u9EDE\u5BEC\u5EA6\u9650\u5236
nonboldify_branch=\u53D6\u6D88\u7C97\u9AD4
nonitalicise_branch=\u53D6\u6D88\u659C\u9AD4
normal=\u4E00\u822C
not_saved_for_image_error=\u8A2D\u5B9A\u5716\u7247\u524D\u5FC5\u9808\u5148\u5132\u5B58\u5FC3\u667A\u5716
not_saved_for_link_error=\u8A2D\u5B9A\u9023\u7D50\u524D\u5FC5\u9808\u5148\u5132\u5B58\u5FC3\u667A\u5716
note_window_location=\u8A3B\u89E3\u8996\u7A97\u4F4D\u7F6E
+notes=\u8A3B\u89E3
ok=(&O)\u78BA\u5B9A
-OKAction.text=(&O)\u78BA\u5B9A
+OKAction.text=(O)\u78BA\u5B9A
OnlineReference.text=\u53C3\u8003\u624B\u518A
open_asMindMap=\u5FC3\u667A\u5716
-OpenAction.text=(&O)\u958B\u555F\u820A\u6A94...
+OpenAction.text=(O)\u958B\u555F\u820A\u6A94...
OpenFreeplaneSiteAction.text=Freeplane \u9996\u9801
OpenMapsAddLocation.text=\u589E\u52A0 OpenMaps \u4F4D\u7F6E...
OpenMapsRemoveLocation.text=\u79FB\u9664 OpenMaps \u4F4D\u7F6E
@@ -955,6 +974,7 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>\u9019 "" \u662F\u5
OptionPanel.default_browser_command_windows_nt=\u547C\u53EB\u700F\u89BD\u5668\u6240\u4F7F\u7528\u4E4B\u547D\u4EE4\u63D0\u793A\u5B57\u5143\u57F7\u884C\u53C3\u6578(Windows NT)
OptionPanel.default_browser_command_windows_nt.tooltip=<html>\u9019 "" \u662F\u5FC5\u9808\u7684, \u56E0\u70BA\u4ED6\u5011\u7684 URL \u6709 "=".</html>
OptionPanel.default_charset=\u9810\u8A2D\u5B57\u5143\u96C6
+OptionPanel.default_save_dir=\u9810\u5148\u8A2D\u7F6E\u5132\u5B58\u76EE\u9304
OptionPanel.Defaults=\u7248\u9762\u8A2D\u5B9A
OptionPanel.delete_automatic_saves_at_exit=\u7576\u96E2\u958B\u6642\u522A\u9664\u81EA\u52D5\u5132\u5B58\u6A94
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> \u5982\u679C\u6B63\u5E38\u95DC\u9589\u6642\u60F3\u81EA\u52D5\u522A\u9664\uFF0C\u8ACB\u52FE\u9078\u3002</html>
@@ -1082,6 +1102,7 @@ OptionPanel.max_shortened_text_length=\u6700\u5927\u6587\u5B57\u5BEC\u5EA6
OptionPanel.metal=\u91D1\u5C6C
OptionPanel.min_node_width=\u6700\u5C0F\u7BC0\u9EDE\u5BEC\u5EA6
OptionPanel.motif=\u6A21\u9AD4
+OptionPanel.narrow_hexagon=\u72F9\u7A84\u516D\u89D2\u5F62
OptionPanel.nb=Norsk Bokm\u00E5l (\u632A\u5A01\u5DF4\u514B\u6469\u6587)
OptionPanel.never_save_folding=\u7D55\u4E0D
OptionPanel.nl=Nederlands / Vlaams (\u8377\u862D\u6587 / \u4F5B\u862D\u8292\u6587)
@@ -1099,8 +1120,7 @@ OptionPanel.nodeformat=\u6578\u5B57\u683C\u5F0F
OptionPanel.nodeformat.tooltip=<html>\u6587\u5B57\u66FF\u63DB / \u683C\u5F0F\uFF1A <ul><li><em>\u6A23\u5F0F\u64F4\u5145</em> (<tt>%s</tt> \u662F\u539F\u59CB\u6587\u5B57)\uFF0C\u4F8B\u5982 <tt>\u6CE8\u610F\uFF1A%s</tt><li><em>\u65E5\u671F\u548C\u6578\u5B57\u683C\u5F0F</em> - \u770B\u9078\u53D6\u65B9\u584A\u4E2D\u7684\u4F8B\u5B50</ul></html>
OptionPanel.nodenumbering=\u7BC0\u9EDE\u7DE8\u865F
OptionPanel.nodenumbering.tooltip=\u5728\u7BC0\u9EDE\u6587\u5B57\u52A0\u4E0A\u6392\u5E8F\u7DE8\u865F (\u4F8B\u5982 1.3.1)\u3002
-OptionPanel.nodeshape=\u7BC0\u9EDE\u6A23\u5F0F
-OptionPanel.nodeshape.tooltip=<html>\u7BC0\u9EDE\u6A23\u5F0F\u63CF\u8FF0\u7BC0\u9EDE\u7684\u5916\u89C0\u3002<br>\u9078\u9805\uFF1A<br><table border="1"><tr><td>\u53C9\u72C0\uFF1A</td><td> \u6C92\u6709\u5916\u6846\uFF0C</td></tr><tr><td>\u6CE1\u6CE1\u72C0\uFF1A</td><td> \u7BC0\u9EDE\u6709\u5713\u89D2\u5916\u6846\uFF0C</td></tr><tr><td>\u8DDF\u7236\u7BC0\u9EDE\u76F8\u540C\uFF1A</td><td> \u63A1\u7528\u7236\u7BC0\u9EDE\u7684\u6A23\u5F0F <br>\u6216\u5167\u5B9A\u7684\u4E3B\u7BC0\u9EDE\u6A23\u5 [...]
+OptionPanel.nodeshape=\u7BC0\u9EDE\u5F62\u72C0
OptionPanel.nodetext=\u7BC0\u9EDE\u6587\u5B57
OptionPanel.nodetext.tooltip=\u5B9A\u7FA9\u7BC0\u9EDE\u6587\u5B57\u3002\u4E4B\u524D\u7684\u6587\u5B57\u6703\u88AB\u6368\u68C4\u3002
OptionPanel.nothing=\u53D6\u6D88\u5168\u9078
@@ -1116,9 +1136,14 @@ OptionPanel.org.freeplane.plugin.bugreport.denied=\u6C38\u4E0D\u50B3\u9001
OptionPanel.org.freeplane.plugin.bugreport.userid=\u50B3\u9001\u53EF\u9078\u8B58\u5225\u78BC
OptionPanel.outline_hgap=\u6C34\u5E73\u9593\u8DDD
OptionPanel.outline_vgap=\u5782\u76F4\u9593\u8DDD
+OptionPanel.oval=\u6A62\u5713\u5F62
OptionPanel.paint_connectors_behind=\u9023\u7D50\u7DDA\u5728\u7BC0\u9EDE\u4E0B\u9762
OptionPanel.parse_data=\u8FA8\u8A8D\u8F38\u5165\u4E2D\u7684\u6578\u5B57\u548C\u65E5\u671F-\u6642\u9593
OptionPanel.parse_data.tooltip=\u8A66\u8457\u89E3\u6790\u65E5\u671F\uFF0C\u65E5\u671F-\u6642\u9593\u548C\u6578\u5B57\u8F38\u5165\u4E26\u5957\u7528\u6A19\u6E96\u683C\u5F0F\u3002\u4F8B\u5982\uFF1A100,000.00\u300112/31\u300112/31/99\u30011999-12-31 \u548C 1999-12-31 23:59
+OptionPanel.parse_formulas=\u8A8D\u8B58\u516C\u5F0F
+OptionPanel.parse_formulas.tooltip=\u89E3\u6790\u516C\u5F0F\u5728 '='\u7BC0\u9EDE\u4E0A\u958B\u59CB : \u8ACB\u53C3\u95B1 http://www.freeplane.org/wiki/index.php/Formulas\u3002
+OptionPanel.parse_latex=\u8A8D\u8B58 LaTeX
+OptionPanel.parse_latex.tooltip=\u8A8D\u8B58 LaTeX \u516C\u5F0F\u7531\u683C\u5F0F\u6216\u5B57\u9996\uFF1A\u8ACB\u53C3\u95B1 http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane\u3002
OptionPanel.PASTE_HTML=\u8CBC\u4E0AHTML
OptionPanel.PASTE_PLAIN_TEXT=\u8CBC\u4E0A\u7D14\u6587\u5B57
OptionPanel.path_property_may_not_be_empty=\u8DEF\u5F91\u6027\u8CEA\u53EF\u80FD\u4E0D\u662F\u7A7A\u7684\uFF01\u8B8A\u66F4\u5DF2\u6062\u5FA9\u3002
@@ -1136,6 +1161,7 @@ OptionPanel.printonwhitebackground.tooltip=<html>\u5217\u5370\u6642\u7E3D\u662F\
OptionPanel.pt_BR=Portugu\u00EAs- Brasil (\u5DF4\u897F\u8461\u8404\u7259\u6587)
OptionPanel.pt_PT=Portugu\u00EAs- Portugal (\u8461\u8404\u7259\u6587)
OptionPanel.RECT=\u77E9\u5F62
+OptionPanel.rectangle=\u77E9\u5F62
OptionPanel.relative=\u76F8\u5C0D
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"\u8A62\u554F"\u6703\u8A62\u554F\u60A8\uFF08\u4F7F\u7528\u4E0A\u7591\u60D1\u7684\uFF09\u3002<br>"\u662F"\u5C07\u986F\u793A RTF \u7DE8\u8F2F\u5668\u3002<br>\u201C\u5426\u201D\u5C07\u986F\u793A\u7D14\u6587\u5B57\u7DE8\u8F2F\u5668\u3002</html>
OptionPanel.remind_use_rich_text_in_new_nodes=\u4F7F\u7528\u591A\u6587\u672C\u683C\u5F0F (RTF) \u8CBC\u4E0A
@@ -1232,6 +1258,8 @@ OptionPanel.set_property_text=\u66F4\u6539
OptionPanel.set_property_text.tooltip=\u52FE\u9078\u4EE5\u6539\u8B8A\u9019\u9805\u6A23\u5F0F\u6027\u8CEA
OptionPanel.setscript=\u78BA\u8A8D\u8B8A\u66F4\uFF1F
OptionPanel.setscript.tooltip=\u6307\u4EE4\u5C07\u548C\u76EE\u524D\u8A2D\u5B9A\u7684\u6A23\u5F0F\u76F8\u95DC\u806F.
+OptionPanel.shape_horizontal_margin=\u6C34\u5E73\u908A\u8DDD
+OptionPanel.shape_vertical_margin=\u5782\u76F4\u908A\u8DDD
OptionPanel.sharp_bezier=\u7531\u7C97\u800C\u7D30\u7684\u8C9D\u6C0F\u66F2\u7DDA
OptionPanel.sharp_linear=\u7531\u7C97\u800C\u7D30\u7684\u76F4\u7DDA
OptionPanel.show_icon_for_attributes=\u986F\u793A\u4EE3\u8868\u6709\u5C6C\u6027\u7684\u5C0F\u5716\u793A
@@ -1251,6 +1279,8 @@ OptionPanel.single_instance_force.tooltip=\u907F\u514D Freeplane \u7A0B\u5F0F\u9
OptionPanel.sk=Sloven\u010Dina (\u65AF\u6D1B\u4F10\u514B\u6587)
OptionPanel.sl=Sloven\u0161\u010Dina (\u65AF\u6D1B\u7DAD\u5C3C\u4E9E\u6587)
OptionPanel.slow_scroll_selected_node=\u7DE9\u6162\u6372\u52D5\u5230\u5DF2\u9078\u7BC0\u9EDE
+OptionPanel.small_bubble=\u5C0F\u6C23\u6CE1
+OptionPanel.small_wide_hexagon=\u5C0F\u516D\u89D2\u5F62
OptionPanel.spelling_opt_case_sensitive=\u5340\u5206\u5927\u5C0F\u5BEB
OptionPanel.spelling_opt_ignore_all_caps_words=\u5FFD\u7565\u5168\u5927\u5BEB\u7684\u5B57\u3002
OptionPanel.spelling_opt_ignore_capitalization=\u5FFD\u7565\u5B57\u958B\u982D\u7684\u5927\u5BEB\u5B57\u6BCD
@@ -1281,6 +1311,7 @@ OptionPanel.structured_icon_toolbar=\u7D50\u69CB\u5316\u5C0F\u5716\u793A\u5DE5\u
OptionPanel.summary=\u6458\u8981
OptionPanel.sv=Svenska (\u745E\u5178\u6587)
OptionPanel.text.use_ctrl_key=\u4F7F\u7528\u5DE5\u5177\u9078\u55AE\u4E2D\u7684 '\u6307\u5B9A\u5FEB\u901F\u9375'
+OptionPanel.textalignment=\u6587\u5B57\u5C0D\u9F4A
OptionPanel.time_for_automatic_save=\u81EA\u52D5\u5132\u5B58\u6642\u9593 (\u6BEB\u79D2, ms)
OptionPanel.time_for_automatic_save.tooltip=<html>\u76F8\u9130\u5169\u6B21\u81EA\u52D5\u5132\u5B58\u9593\u7684\u6642\u9593\u9593\u9694\uFF0C\u55AE\u4F4D\uFF1A\u6BEB\u79D2 (msec)\u3002\u5982\u4E0D\u81EA\u52D5\u5132\u5B58\u8ACB\u8A2D\u5B9A 2000000000\u3002</html>
OptionPanel.time_for_delayed_selection=\u5EF6\u9072\u6642\u9593\u8A2D\u5B9A (\u6BEB\u79D2, ms)
@@ -1290,12 +1321,14 @@ OptionPanel.toolTipManager.initialDelay=\u521D\u59CB\u5EF6\u9072\u6642\u9593 (\u
OptionPanel.toolTipManager.max_tooltip_width=\u7BC0\u9EDE\u63D0\u793A\u5BEC\u5EA6
OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>\u7BC0\u9EDE\u63D0\u793A\u5BEC\u5EA6\u7684\u55AE\u4F4D\u662F\u50CF\u7D20\u3002</html>
OptionPanel.toolTipManager.reshowDelay=\u91CD\u65B0\u986F\u793A\u5EF6\u9072\u6642\u9593 (\u6BEB\u79D2, ms)
+OptionPanel.tr=\u571F\u8033\u5176 / T\u00FCrk\u00E7e
OptionPanel.uk_UA=\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430 (\u70CF\u514B\u862D\u6587)
OptionPanel.undefined_font=\u672A\u5B9A\u7FA9\u7684\u5B57\u578B
OptionPanel.undo_levels=\u5FA9\u539F\u6B21\u6578
OptionPanel.undo_levels.tooltip=<html>\u6C7A\u5B9A\u5132\u5B58\u591A\u5C11\u6B65\u9A5F\u53EF\u4F9B\u5FA9\u539F\u3002</html>
OptionPanel.unfold_on_paste=\u8CBC\u4E0A\u7684\u6642\u5019\u5C55\u958B\u7BC0\u9EDE
OptionPanel.unfold_on_paste.tooltip=\u8CBC\u4E0A\u6216\u662F\u62D6\u653E\u7BC0\u9EDE\u7684\u6642\u5019\u5C55\u958B\u7BC0\u9EDE
+OptionPanel.uniform_shape=\u4E00\u81F4
OptionPanel.use_common_out_point_for_root_node=\u5206\u652F\u7DDA\u4F86\u81EA\u4E3B\u7BC0\u9EDE\u7684\u4E00\u500B\u9EDE
OptionPanel.use_common_out_point_for_root_node.tooltip=\u5206\u652F\u7DDA\u5F9E\u4E3B\u7BC0\u9EDE\u4E0A\u7684\u4E00\u500B\u9EDE\u958B\u59CB
OptionPanel.use_tabbed_pane=\u9801\u7C3D\u6A21\u5F0F
@@ -1308,9 +1341,12 @@ OptionPanel.validate_invalid_number_format=\u7121\u6548\u7684\u6578\u5B57\u683C\
OptionPanel.validate_write_without_read=Scripting\uFF1A\u8003\u616E\u5C07 Read/File \u52A0\u5230 Write/File\u3002
OptionPanel.validation_error=<html><body>\u9A57\u8B49\u932F\u8AA4\uFF1A<p><em>{0}</em><p>\u8ACB\u4FEE\u6539\u8A2D\u5B9A\u3002</body></html>
OptionPanel.validation_warning=<html><body>\u9A57\u6B63\u8B66\u544A\uFF1A<p><em>{0}</em></body></html>
+OptionPanel.vertical_child_gap=\u5B50\u9593\u9694
+OptionPanel.vertical_child_gap.tooltip=\u5728\u5B50\u7BC0\u9EDE\u4E4B\u9593\u7684\u5782\u76F4\u8DDD\u96E2
OptionPanel.vi=Ti\u1EBFng Vi\u1EC7t (\u8D8A\u5357\u6587)
OptionPanel.wheel_velocity=\u901F\u5EA6
OptionPanel.wheel_velocity.tooltip=\u503C\u8D8A\u5927\uFF0C\u6ED1\u9F20\u6EFE\u8F2A\u5728\u5716\u4E0A\u79FB\u52D5\u7684\u6548\u61C9\u8D8A\u5FEB\u3002
+OptionPanel.wide_hexagon=\u5BEC\u516D\u89D2\u5F62
OptionPanel.windows=\u8996\u7A97
OptionPanel.zh_CN=\u7C21\u9AD4\u4E2D\u6587
OptionPanel.zh_TW=\u6B63\u9AD4\u4E2D\u6587
@@ -1330,7 +1366,7 @@ out_of_memory=\u8A18\u61B6\u9AD4\u4E0D\u8DB3\u3002
overwrite_keyset_question=\u8986\u84CB\u73FE\u5B58\u7684\u6309\u9375\u96C6\u55CE\uFF1F
PageAction.text=\u8A2D\u5B9A\u5217\u5370\u683C\u5F0F...
password_is_not_ascii=\u5BC6\u78BC\u4E0D\u662F ASCII \u78BC
-PasteAction.text=(&P)\u8CBC\u4E0A
+PasteAction.text=(P)\u8CBC\u4E0A
PasteAttributes.text=\u8CBC\u4E0A\u5C6C\u6027
PatternNewNameProperty=\u65B0\u6A23\u677F
PatternToString.backgroundColor=\u80CC\u666F\u984F\u8272
@@ -1399,10 +1435,11 @@ plugins/TimeManagement.xml_WindowTitle=\u6642\u9593\u7BA1\u7406
plugins/TimeManagement.xml_WindowTitle_All_Nodes=\u641C\u5C0B\u548C\u53D6\u4EE3
preferences=\u5C6C\u6027\u8A2D\u5B9A
print_preview_title=\u9810\u89BD\u5217\u5370
-PrintAction.text=(&P)\u5217\u5370...
+PrintAction.text=(P)\u5217\u5370...
PrintDirectAction.text=\u5217\u5370
printing_settings=\u5217\u5370\u8A2D\u5B9A
-PrintPreviewAction.text=(&v)\u9810\u89BD\u5217\u5370...
+PrintPreviewAction.text=(v)\u9810\u89BD\u5217\u5370...
+progress=\u9032\u5C55\u5C0F\u5716\u793A (%)
PropertyAction.dialog=\u500B\u4EBA\u5316\u8A2D\u5B9A
PropertyAction.text=\u500B\u4EBA\u5316\u8A2D\u5B9A ...
QuickFilterAction.text=\u5FEB\u901F\u7BE9\u9078
@@ -1410,7 +1447,7 @@ QuickFindAction.BACK.text=\u5C0B\u627E\u524D\u4E00\u500B
QuickFindAction.FORWARD.text=\u5C0B\u627E\u4E0B\u4E00\u500B
QuickFindAllAction.text=\u9078\u53D6\u6240\u6709\u5339\u914D\u7684\u7BC0\u9EDE
QuickHighlightAction.text=\u5F37\u8ABF\u6240\u6709\u5339\u914D\u7684\u7BC0\u9EDE
-QuitAction.text=(&Q)\u96E2\u958B Freeplane
+QuitAction.text=(Q)\u96E2\u958B Freeplane
read_only=\u552F\u8B80
ReadScriptError.text=\u8B80\u6307\u4EE4\u6A94\u6642\u767C\u751F\u932F\u8AA4\n\u8ACB\u6AA2\u67E5\u65E5\u8A8C\u6A94
really_convert_to_current_version=<html>\u9019\u500B\u5FC3\u667A\u5716\u662F\u820A\u7248\u7684 Freeplane \u6240\u88FD\u4F5C\u3002<br>\u8981\u8F49\u63DB\u55CE (\u5EFA\u8B70)\uFF1F <br>(\u5426\u5247\u7D50\u679C\u7121\u6CD5\u4FDD\u8B49\u3002) </html>
@@ -1421,7 +1458,7 @@ really_remove_notes=\u771F\u7684\u8981\u79FB\u9664\u8A3B\u89E3\u55CE\uFF1F
ReapplyFilterAction.text=\u91CD\u65B0\u5957\u7528
red=\u7D05\u8272
RedefineStyleAction.text=\u91CD\u65B0\u5B9A\u7FA9\u6A23\u5F0F
-RedoAction.text=(&R)\u53D6\u6D88\u5FA9\u539F
+RedoAction.text=(R)\u53D6\u6D88\u5FA9\u539F
RedoFilterAction.text=\u53D6\u6D88\u5FA9\u539F
regular_expressions=\u4E00\u822C\u8868\u793A
ReminderHookAction.text=\u79FB\u9664\u63D0\u9192\u529F\u80FD
@@ -1445,24 +1482,29 @@ replace_shortcut_title=\u53D6\u4EE3\u5FEB\u901F\u9375\uFF1F
ReportBugAction.text=\u5831\u544A\u4E00\u500B\u932F\u8AA4
RequestFeatureAction.text=\u8ACB\u6C42\u589E\u52A0\u529F\u80FD
reset_to_default=\u4F7F\u7528\u5167\u5B9A\u503C
-ResetNodeLocationAction.text=(&p)\u91CD\u8A2D\u7BC0\u9EDE\u4F4D\u7F6E
+ResetNodeLocationAction.text=(p)\u91CD\u8A2D\u7BC0\u9EDE\u4F4D\u7F6E
ResetStyleAction.text=\u91CD\u8A2D\u7BC0\u9EDE\u6A23\u5F0F
-RevertAction.text=(&R)\u9084\u539F\u81F3\u4E0A\u6B21\u5132\u5B58\u72C0\u614B
+RevertAction.text=(R)\u9084\u539F\u81F3\u4E0A\u6B21\u5132\u5B58\u72C0\u614B
RevisionPluginAction.text=\u6539\u8B8A\u88AB\u4FEE\u8A02\u7BC0\u9EDE\u7684\u80CC\u666F\u984F\u8272
+save=(&S)\u5132\u5B58
save_failed=\u5FC3\u667A\u5716 {0} \u5132\u5B58\u5931\u6557\u3002
save_unsaved=\u5132\u5B58\u4EE5\u4E0B\u5FC3\u667A\u5716\uFF1F
save_unsaved_styles=\u5132\u5B58\u6A23\u5F0F\uFF1F
SaveAcceleratorPresetsAction.text=\u5132\u5B58\u5FEB\u901F\u9375\u96C6...
-SaveAction.text=(&S)\u5B58\u6A94
-SaveAll.text=(&L)\u5132\u5B58\u6240\u6709\u5DF2\u958B\u555F\u5FC3\u667A\u5716
+SaveAction.text=(S)\u5B58\u6A94
+SaveAction_readonlyMsg=\u9019\u5FC3\u667A\u5716\u662F\u552F\u8B80\u3002\u8ACB\u4F7F\u7528 '\u6A94\u6848->\u53E6\u5B58\u65B0\u6A94...'\u4F86\u5132\u5B58\u9019\u5FC3\u667A\u5716\u3002
+SaveAction_readonlyTitle=\u8A66\u5716\u5132\u5B58\u552F\u8B80\u5FC3\u667A\u5716
+SaveAll.text=(L)\u5132\u5B58\u6240\u6709\u5DF2\u958B\u555F\u5FC3\u667A\u5716
SaveAll.tooltip=\u5132\u5B58\u6240\u6709\u5DF2\u958B\u555F\u5FC3\u667A\u5716
+SaveAs_toReadonlyMsg={0} \u662F\u552F\u8B80\u3002\u8ACB\u5132\u5B58\u70BA\u4E0D\u540C\u7684\u6A94\u6848\u3002
+SaveAs_toReadonlyTitle=\u8A66\u5716\u5132\u5B58\u5230\u552F\u8B80\u6A94\u6848
SaveAsAction.text=\u53E6\u5B58\u65B0\u6A94...
saved=\u5B58\u6A94\u5B8C\u7562
saving_canceled=\u5132\u5B58\u53D6\u6D88
scanners_not_loaded=\u6383\u63CF\u5668\u7121\u6CD5\u8F09\u5165\uFF0C\u6A94\u6848\u6BC0\u640D
scheme_evaluate=\u8A55\u4F30\uFF01
script_execution_disabled=Script \u57F7\u884C\u88AB\u6291\u6B62\uFF0C\u8ACB\u770B \u5DE5\u5177>\u500B\u4EBA\u5316\u8A2D\u5B9A>\u5916\u639B\u5143\u4EF6
-ScriptEditor.text=(&c)\u6307\u4EE4\u7DE8\u8F2F\u5668...
+ScriptEditor.text=(c)\u6307\u4EE4\u7DE8\u8F2F\u5668...
ScriptEditor.tooltip=\u5141\u8A31\u5728 Freeplane \u7CFB\u7D71\u5BEB\u5165\u5927\u91CF\u6307\u4EE4\u3002
ScriptEditorPanel.changed_cancel=\u8A9E\u6CD5\u5DF2\u88AB\u66F4\u52D5\u3002\u8ACB\u554F\u60A8\u8981\u653E\u68C4\u9019\u4E9B\u8B8A\u52D5\u55CE\uFF1F
scripting_api_generator_legend=\u5716\u4F8B
@@ -1478,7 +1520,7 @@ select_menu_item_dialog=\u9078\u64C7\u9078\u55AE\u9805\u76EE
select_menu_item_root_node=\u9078\u55AE
SelectAllAction.text=\u9078\u64C7\u6240\u6709\u53EF\u898B\u7684\u7BC0\u9EDE
SelectBranchAction.text=\u9078\u64C7\u6574\u500B\u53EF\u898B\u7684\u5206\u652F
-SelectedPasteAction.text=(&a)\u8CBC\u6210...
+SelectedPasteAction.text=(a)\u8CBC\u6210...
selection_method_by_click=\u55AE\u9EDE\u64CA\u6ED1\u9F20\u5DE6\u9375\u9078\u53D6
selection_method_delayed=\u6ED1\u9F20\u6307\u6A19\u79FB\u5230\u7BC0\u9EDE\u4E00\u6BB5\u6642\u9593\u5F8C\u81EA\u52D5\u9078\u53D6
selection_method_direct=\u6ED1\u9F20\u6307\u6A19\u79FB\u5230\u7BC0\u9EDE\u5373\u81EA\u52D5\u9078\u53D6
@@ -1556,7 +1598,7 @@ simplyhtml.cTagNameUL=\u7121\u5E8F\u5217\u8868
simplyhtml.cutLabel=\u526A\u4E0B
simplyhtml.cutTip=\u526A\u4E0B
simplyhtml.defaultDocName=\u7121\u6A19\u984C
-simplyhtml.deleteTableColLabel=\u522A\u9664\u884C
+simplyhtml.deleteTableColLabel=\u522A\u9664\u6B04\u4F4D
simplyhtml.deleteTableRowLabel=\u522A\u9664\u5217
simplyhtml.docTitleQuery=\u8A2D\u5B9A\u6A19\u984C\uFF1A
simplyhtml.docTitleTitle=\u7DE8\u8F2F\u6587\u4EF6\u6A19\u984C
@@ -1590,7 +1632,7 @@ simplyhtml.formatTableTip=\u683C\u5F0F\u8868
simplyhtml.helpLabel=\u652F\u63F4
simplyhtml.htmlTabTitle=\u6AA2\u8996 HTML \u78BC
simplyhtml.imageFileDesc=\u5F71\u50CF\u6A94
-simplyhtml.insertTableColLabel=\u63D2\u5165\u4E00\u884C
+simplyhtml.insertTableColLabel=\u63D2\u5165\u4E00\u6B04
simplyhtml.insertTableLabel=\u8868\u683C...
simplyhtml.insertTableMsg=\u591A\u5C11\u6B04\u4F4D\uFF1F
simplyhtml.insertTableRowLabel=\u63D2\u5165\u4E00\u5217
@@ -1692,11 +1734,11 @@ simplyhtml.valignMiddle=\u7F6E\u4E2D
simplyhtml.valignTop=\u4E0A\u65B9
simplyhtml.wholeWordsOnly=\u7B26\u5408\u6574\u500B\u6587\u5B57
simplyhtml.wholeWordsOnly.tooltip=\u9650\u5236\u8981\u5C0D\u6574\u500B\u5B57\u5339\u914D\u3002
-SortNodes.text=(&S)\u6392\u5E8F\u5B50\u7BC0\u9EDE
+SortNodes.text=(S)\u6392\u5E8F\u5B50\u7BC0\u9EDE
SortNodes.tooltip=\u6309\u5B57\u6BCD\u9806\u5E8F\u6392\u5E8F\u5B50\u7BC0\u9EDE\u3002
split=(&S)\u5206\u5272
SplitConditionAction.text=\u5206\u5272
-SplitNode.text=(&S)\u5206\u5272\u7BC0\u9EDE (\u7BC0\u9EDE\u5167\u5BB9\u5FC5\u9808\u6709\u5169\u884C\u4EE5\u4E0A)
+SplitNode.text=(S)\u5206\u5272\u7BC0\u9EDE (\u7BC0\u9EDE\u5167\u5BB9\u5FC5\u9808\u6709\u5169\u884C\u4EE5\u4E0A)
SplitNode.tooltip=<html>\u7BC0\u9EDE\u6703\u88AB\u5206\u5272</html>
STANDARD_FORMAT=\u6A19\u6E96
stop_processing=\u505C\u6B62
@@ -1730,13 +1772,18 @@ styles.subtopic=\u5B50\u6A19\u984C
styles.topic=\u6A19\u984C
styles.user-defined=\u4F7F\u7528\u8005\u5B9A\u7FA9\u6A23\u5F0F
styles.website=\u7DB2\u7AD9
+styles_background_html=\n <html>\n <head>\n </head>\n <body>\n <table width="800" style="text-align: left; vertical-align: top">\n <tr valign="top">\n <th>\n <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold">\n \u5C0D\u65BC\u9019\u7A2E\u6A23\u5F0F\u8A2D\u5B9A\n </div>\n <div style="text-align: left; font-weight: normal">\n <div style="margin: 3pt">\n\u9019\u500B\u6A19\u6E96\u662F\u88AB\u958B\u767C\u5F8C 11 \u5E74\ [...]
styles_menu=\u53EF\u7528\u7684\u6A23\u5F0F
submenu_keystroke_in_use_error=\u5B50\u9078\u55AE {1} \u7121\u6CD5\u4F7F\u7528\u6309\u9375 {0}\uFF0C\u79FB\u9664\u6309\u9375\u3002
summary_nodes=\u7E3D\u7D50\u7BC0\u9EDE
summary_not_possible=\u7121\u6CD5\u5C0D\u76EE\u524D\u9078\u53D6\u7684\u5EFA\u7ACB\u7E3D\u7D50\u7BC0\u9EDE
-SummaryNodeAction.text=\u8A2D\u5B9A/\u53D6\u6D88 \u7E3D\u7D50\u7BC0\u9EDE
svg=SVG (\u53EF\u7E2E\u653E\u5411\u91CF\u5716)
template_dir=\u6A19\u6E96\u6A23\u7248
+TextAlignAction.CENTER.text=\u6587\u5B57\u5C45\u4E2D
+TextAlignAction.DEFAULT.text=\u9810\u8A2D\u503C
+TextAlignAction.LEFT.text=\u6587\u5B57\u5411\u5DE6\u5C0D\u9F4A
+TextAlignAction.RIGHT.text=\u6587\u5B57\u5411\u53F3\u5C0D\u9F4A
+textalignment=\u6587\u5B57\u5C0D\u9F4A
TimeListAction.text=\u5217\u51FA\u6642\u9593\u6392\u7A0B ...
TimeListAction.tooltip=\u986F\u793A\u6240\u6709\u7BC0\u9EDE\u8207\u5176\u76F8\u5C0D\u61C9\u7684\u884C\u7A0B.
TimeManagementAction.text=\u986F\u793A\u65E5\u66C6...
@@ -1746,16 +1793,17 @@ ToggleDetailsAction.text=\u96B1\u85CF\u7BC0\u9EDE\u7D30\u7BC0
ToggleFBarAction.text=\u529F\u80FD\u9375\u5217
ToggleFoldedAction.text=\u5C55\u958B/\u647A\u758A \u7BC0\u9EDE
ToggleFullScreenAction.text=\u5168\u87A2\u5E55\u6A21\u5F0F
-ToggleLeftToolbarAction.text=(&I)\u5DE6\u908A\u5C0F\u5716\u793A\u9078\u55AE
+ToggleLeftToolbarAction.text=(I)\u5DE6\u908A\u5C0F\u5716\u793A\u9078\u55AE
ToggleMenubarAction.text=\u9078\u55AE\u5217
ToggleScrollbarsAction.text=\u6372\u8EF8
ToggleStatusAction.text=\u986F\u793A\u72C0\u614B\u5217
-ToggleToolbarAction.text=(&T)\u5DE5\u5177\u5217
+ToggleToolbarAction.text=(T)\u5DE5\u5177\u5217
+toolbars=\u5DE5\u5177\u5217
undefined_error=\u975E\u9810\u671F\u7684\u932F\u8AA4\uFF0C\u8ACB\u63D0\u51FA\u932F\u8AA4\u5831\u544A\u3002
underline=\u5E95\u7DDA
UnderlineAction.text=\u5E95\u7DDA
underlined=\u52A0\u4E0A\u5E95\u7DDA
-UndoAction.text=(&U)\u5FA9\u539F
+UndoAction.text=(U)\u5FA9\u539F
UndoFilterAction.text=\u5FA9\u539F
unfold=\u5C55\u958B
UnfoldAllAction.text=\u5168\u90E8\u5C55\u958B
@@ -1790,7 +1838,7 @@ user_template_dir=\u4F7F\u7528\u8005\u6A23\u7248
user_zoom=\u5217\u5370\u7E2E\u653E\u6BD4 (0.0 - 2.0)\uFF1A
value_format=\u6578\u503C\u683C\u5F0F
version_up_to_date=\u60A8\u5DF2\u7D93\u4F7F\u7528\u6700\u65B0\u7248\u7A0B\u5F0F
-ViewerControllerAction.text=\u5916\u90E8\u7269\u4EF6...
+view=(&V)\u6AA2\u8996
ViewLayoutTypeAction.OUTLINE.text=\u5927\u7DB1\u8996\u5716
WebDocuAction.text=\u7DB2\u9801\u6587\u4EF6
width=\u5BEC
diff --git a/freeplane/resources/xml/ExportWithXSLT.xml b/freeplane/resources/xml/ExportWithXSLT.xml
index 27b2d01..1a3c1c1 100644
--- a/freeplane/resources/xml/ExportWithXSLT.xml
+++ b/freeplane/resources/xml/ExportWithXSLT.xml
@@ -33,11 +33,11 @@
file_type="html"
xslt_file="/xslt/freeplane2applet.xsl"
create_dir="true"
- files_to_copy="${org.freeplane.core.dir.lib}freeplaneviewer.jar,/html/freeplane_applet.jnlp,/html/deployJava.js"
+ files_to_copy="${org.freeplane.core.dir.lib}freeplaneviewer.jar,/html/freeplane_applet.jnlp"
file_prefix=""
copy_map="true"
- copy_map_xslt_file="/xslt/exportmm2appletmm.xsl"
copymode="FILE"
+ mode="FILE"
load_file="true"
set_properties="show_note_icons,
show_icon_for_attributes,
@@ -53,6 +53,8 @@
files_to_copy="visorFreeplane.swf,flashobject.js"
file_prefix="/flash/"
copy_map="true"
+ copymode="EXPORT"
+ mode="FILE"
load_file="true" />
</action>
<action
diff --git a/freeplane/resources/xml/browsemodemenu.mm b/freeplane/resources/xml/browsemodemenu.mm
deleted file mode 100644
index 5cc1ccf..0000000
--- a/freeplane/resources/xml/browsemodemenu.mm
+++ /dev/null
@@ -1,673 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<attribute_registry SHOW_ATTRIBUTES="hide"/>
-<node TEXT="Menu for Browser Mode" FOLDED="false" ID="ID_1676259642" CREATED="1370343428335" MODIFIED="1370343443279"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="category" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="category" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="radio_action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="radio_action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="submenu" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="submenu" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" MAX_WIDTH="600" COLOR="#000000" STYLE="as_parent">
-<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important">
-<icon BUILTIN="yes"/>
-</stylenode>
-<stylenode TEXT="separator" COLOR="#999999"/>
-<stylenode TEXT="action"/>
-<stylenode TEXT="radio_action">
-<icon BUILTIN="unchecked"/>
-</stylenode>
-<stylenode TEXT="category" COLOR="#000000" BACKGROUND_COLOR="#ccffcc">
-<font ITALIC="true"/>
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="submenu">
-<font ITALIC="true"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="10"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="menu_bar" POSITION="right" ID="ID_951169932" CREATED="1370343428336" MODIFIED="1370343428336">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="menu_bar"/>
-<node TEXT="File" FOLDED="true" ID="ID_1673593376" CREATED="1370343428351" MODIFIED="1370343566796">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="file"/>
-<attribute NAME="name_ref" VALUE="file"/>
-<node TEXT="Most recent maps" ID="ID_1625697829" CREATED="1370343428351" MODIFIED="1370343562651">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="menu_key" VALUE="main_menu_most_recent_files"/>
-<attribute NAME="name" VALUE="last"/>
-<attribute NAME="name_ref" VALUE="most_recent_files"/>
-</node>
-<node TEXT="PageAction" ID="ID_432644535" CREATED="1370343428354" MODIFIED="1370343428354">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PageAction"/>
-</node>
-<node TEXT="Print preview..." ID="ID_1392946864" CREATED="1370343428355" MODIFIED="1370343512188">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintPreviewAction"/>
-</node>
-<node TEXT="Print map ..." ID="ID_938124558" CREATED="1370343428355" MODIFIED="1370343515795">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control P"/>
-<attribute NAME="action" VALUE="PrintAction"/>
-</node>
-<node TEXT="Map statistics..." ID="ID_78989943" CREATED="1370343428355" MODIFIED="1370343530852">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FilePropertiesAction"/>
-</node>
-<node TEXT="Close current map" ID="ID_1468657400" CREATED="1370343428355" MODIFIED="1370343544723">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control W"/>
-<attribute NAME="action" VALUE="CloseAction"/>
-</node>
-<node TEXT="Quit Freeplane" ID="ID_306381165" CREATED="1370343428355" MODIFIED="1370343549339">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control Q"/>
-<attribute NAME="action" VALUE="QuitAction"/>
-<attribute NAME="menu_key" VALUE="MB_QuitAction"/>
-</node>
-</node>
-<node TEXT="Edit" FOLDED="true" ID="ID_874402336" CREATED="1370343428356" MODIFIED="1370343568635">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="edit"/>
-<attribute NAME="name_ref" VALUE="edit"/>
-<node TEXT="menu_extensions" FOLDED="true" ID="ID_1987963521" CREATED="1370343428356" MODIFIED="1370343428356">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_extensions"/>
-<attribute NAME="name_ref" VALUE="menu_extensions"/>
-<node TEXT="Minimize node" ID="ID_218334281" CREATED="1370343428356" MODIFIED="1370343723881">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetShortenerStateAction"/>
-</node>
-</node>
-<node TEXT="menu_copy" FOLDED="true" ID="ID_1068748806" CREATED="1370343428356" MODIFIED="1370343428356">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_copy"/>
-<attribute NAME="name_ref" VALUE="menu_copy"/>
-<node TEXT="Copy" ID="ID_693624274" CREATED="1370343428356" MODIFIED="1370343608172">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control C"/>
-<attribute NAME="action" VALUE="CopyAction"/>
-</node>
-<node TEXT="Copy node (single)" ID="ID_1861667072" CREATED="1370343428357" MODIFIED="1370343627458">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift C"/>
-<attribute NAME="action" VALUE="CopySingleAction"/>
-</node>
-</node>
-<node TEXT="find" FOLDED="true" ID="ID_1401379804" CREATED="1370343428358" MODIFIED="1370343428358">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="find"/>
-<node TEXT="Find ..." ID="ID_577962583" CREATED="1370343428360" MODIFIED="1370343594883">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control G"/>
-<attribute NAME="action" VALUE="FindAction"/>
-</node>
-<node TEXT="Find next" ID="ID_1130543161" CREATED="1370343428360" MODIFIED="1370343598026">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift G"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-<node TEXT="Find previous" ID="ID_262166590" CREATED="1370343428360" MODIFIED="1370343603690">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-</node>
-</node>
-<node TEXT="View" FOLDED="true" ID="ID_1135995959" CREATED="1370343428360" MODIFIED="1370343735457">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="view"/>
-<attribute NAME="name_ref" VALUE="menu_view"/>
-<node TEXT="Menu_Toolbar_Panel" FOLDED="true" ID="ID_405676964" CREATED="1370343428361" MODIFIED="1370343428361">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Menu_Toolbar_Panel"/>
-<node TEXT="toolbars" FOLDED="true" ID="ID_268271173" CREATED="1370343428361" MODIFIED="1370343428361">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<node TEXT="toolbars" FOLDED="true" ID="ID_608640070" CREATED="1370343428361" MODIFIED="1370343428361">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<attribute NAME="name_ref" VALUE="menu_toolbars"/>
-<node TEXT="ToggleMenubarAction" ID="ID_1490668198" CREATED="1370343428362" MODIFIED="1370343428362">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MB_ToggleMenubarAction"/>
-</node>
-<node TEXT="ToggleToolbarAction" ID="ID_1764986225" CREATED="1370343428362" MODIFIED="1370343428362">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="ShowFilterToolbarAction" ID="ID_703403162" CREATED="1370343428362" MODIFIED="1370343428362">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFilterToolbarAction"/>
-<attribute NAME="accelerator" VALUE="control F"/>
-</node>
-<node TEXT="ToggleScrollbarsAction" ID="ID_294248280" CREATED="1370343428362" MODIFIED="1370343428362">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleScrollbarsAction"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Zoom" FOLDED="true" ID="ID_1940989441" CREATED="1370343428362" MODIFIED="1370343746953">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="zoom"/>
-<node TEXT="Zoom in" ID="ID_1716346239" CREATED="1370343428362" MODIFIED="1370343750465">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt UP"/>
-<attribute NAME="action" VALUE="ZoomInAction"/>
-</node>
-<node TEXT="Zoom out" ID="ID_1145504960" CREATED="1370343428362" MODIFIED="1370343753785">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt DOWN"/>
-<attribute NAME="action" VALUE="ZoomOutAction"/>
-</node>
-<node TEXT="Center selected node" ID="ID_262109607" CREATED="1370343428363" MODIFIED="1370343790449">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt C"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-</node>
-</node>
-<node TEXT="View settings" FOLDED="true" ID="ID_1183206505" CREATED="1370343428363" MODIFIED="1370343822224">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_viewmode"/>
-<attribute NAME="name_ref" VALUE="menu_viewmode"/>
-<node TEXT="Outline view" ID="ID_235543535" CREATED="1370343428363" MODIFIED="1370343844864">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Rectangular selection" ID="ID_598640103" CREATED="1370343428363" MODIFIED="1370343833768">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowSelectionAsRectangleAction"/>
-</node>
-</node>
-<node TEXT="Tool tips" FOLDED="true" ID="ID_845817461" CREATED="1370343428363" MODIFIED="1370343868904">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_hoverView"/>
-<attribute NAME="name_ref" VALUE="menu_hoverView"/>
-<node TEXT="Hide details" ID="ID_1883354573" CREATED="1370343428363" MODIFIED="1370343947679">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt F2"/>
-<attribute NAME="action" VALUE="ToggleDetailsAction"/>
-</node>
-<node TEXT="Display tool tips" ID="ID_350251826" CREATED="1370343428364" MODIFIED="1370343900271">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.show_node_tooltips"/>
-</node>
-</node>
-<node TEXT="AttributeView" FOLDED="true" ID="ID_1304515396" CREATED="1370343428364" MODIFIED="1370343428364">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="AttributeView"/>
-<node TEXT="menu_displayAttributes" FOLDED="true" ID="ID_1602004789" CREATED="1370343428364" MODIFIED="1370343428364">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_displayAttributes"/>
-<attribute NAME="name_ref" VALUE="menu_displayAttributes"/>
-<node TEXT="Show selected attributes" ID="ID_1742840825" CREATED="1370343428365" MODIFIED="1370343980758">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="ShowSelectedAttributesAction"/>
-</node>
-<node TEXT="Show all attributes" ID="ID_764477884" CREATED="1370343428365" MODIFIED="1370343992262">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="ShowAllAttributesAction"/>
-</node>
-<node TEXT="Hide all attributes" ID="ID_104831214" CREATED="1370343428365" MODIFIED="1370343997870">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="HideAllAttributesAction"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Navigate" FOLDED="true" ID="ID_69427177" CREATED="1370343428365" MODIFIED="1370344058757">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="navigate"/>
-<attribute NAME="name_ref" VALUE="menu_navigate"/>
-<node TEXT="navigate" FOLDED="true" ID="ID_255652186" CREATED="1370343428366" MODIFIED="1370343428366">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="navigate"/>
-<node TEXT="Previous map" ID="ID_1663848870" CREATED="1370343428366" MODIFIED="1370344222196">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift TAB"/>
-<attribute NAME="action" VALUE="NavigationPreviousMapAction"/>
-</node>
-<node TEXT="Next map" ID="ID_346762235" CREATED="1370343428366" MODIFIED="1370344229196">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control TAB"/>
-<attribute NAME="action" VALUE="NavigationNextMapAction"/>
-</node>
-<node TEXT="folding" FOLDED="true" ID="ID_1132523613" CREATED="1370343428366" MODIFIED="1370343428366">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="folding"/>
-<node TEXT="(Un)fold" ID="ID_1869882931" CREATED="1370343428366" MODIFIED="1370344256924">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="SPACE"/>
-<attribute NAME="action" VALUE="ToggleFoldedAction"/>
-</node>
-<node TEXT="Show next child" ID="ID_1818160300" CREATED="1370343428366" MODIFIED="1370344261531">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowNextChildAction"/>
-<attribute NAME="accelerator" VALUE="shift SPACE"/>
-</node>
-<node TEXT="(Un)fold children" ID="ID_1874570321" CREATED="1370343428367" MODIFIED="1370344269155">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control SPACE"/>
-<attribute NAME="action" VALUE="ToggleChildrenFoldedAction"/>
-</node>
-<node TEXT="Unfold one level" ID="ID_1284227579" CREATED="1370343428368" MODIFIED="1370344275139">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt PAGE_DOWN"/>
-<attribute NAME="action" VALUE="UnfoldOneLevelAction"/>
-</node>
-<node TEXT="Fold one level" ID="ID_156543287" CREATED="1370343428368" MODIFIED="1370344278851">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt PAGE_UP"/>
-<attribute NAME="action" VALUE="FoldOneLevelAction"/>
-</node>
-<node TEXT="Unfold all" ID="ID_219851785" CREATED="1370343428368" MODIFIED="1370344283731">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt END"/>
-<attribute NAME="action" VALUE="UnfoldAllAction"/>
-</node>
-<node TEXT="Fold all" ID="ID_1819016354" CREATED="1370343428368" MODIFIED="1370344285907">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt HOME"/>
-<attribute NAME="action" VALUE="FoldAllAction"/>
-</node>
-</node>
-</node>
-<node TEXT="Goto root" ID="ID_756806968" CREATED="1370343428368" MODIFIED="1370344293595">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="ESCAPE"/>
-<attribute NAME="action" VALUE="MoveToRootAction"/>
-</node>
-<node TEXT="Goto node with ID..." ID="ID_300368272" CREATED="1370343428369" MODIFIED="1370344105877">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="GotoNodeAction"/>
-</node>
-<node TEXT="Goto previous node" ID="ID_468261889" CREATED="1370343428369" MODIFIED="1370344113709">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt LEFT"/>
-<attribute NAME="action" VALUE="NextNodeAction.BACK"/>
-</node>
-<node TEXT="Goto next node" ID="ID_1487023447" CREATED="1370343428369" MODIFIED="1370344125774">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt RIGHT"/>
-<attribute NAME="action" VALUE="NextNodeAction.FORWARD"/>
-</node>
-<node TEXT="Goto previous node (fold)" ID="ID_1360825994" CREATED="1370343428369" MODIFIED="1370344142397">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt shift LEFT"/>
-<attribute NAME="action" VALUE="NextNodeAction.BACK_N_FOLD"/>
-</node>
-<node TEXT="Goto next node (fold)" ID="ID_471823393" CREATED="1370343428372" MODIFIED="1370344154925">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt shift RIGHT"/>
-<attribute NAME="action" VALUE="NextNodeAction.FORWARD_N_FOLD"/>
-</node>
-<node TEXT="Unfold next presentation item" ID="ID_70745346" CREATED="1370343428373" MODIFIED="1370344167636">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextPresentationItemAction"/>
-</node>
-<node TEXT="links" FOLDED="true" ID="ID_1317097629" CREATED="1370343428373" MODIFIED="1370343428373">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="links"/>
-<node TEXT="Follow link" ID="ID_495119895" CREATED="1370343428373" MODIFIED="1370344199572">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control ENTER"/>
-<attribute NAME="action" VALUE="FollowLinkAction"/>
-</node>
-</node>
-</node>
-<node TEXT="Filer" FOLDED="true" ID="ID_645149412" CREATED="1370343428373" MODIFIED="1370344297243">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="filter"/>
-<attribute NAME="name_ref" VALUE="menu_filter"/>
-<node TEXT="Filter" FOLDED="true" ID="ID_1749253205" CREATED="1370343428373" MODIFIED="1370343428373">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Filter"/>
-<node TEXT="DoFilter" FOLDED="true" ID="ID_1805860247" CREATED="1370343428373" MODIFIED="1370343428373">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="DoFilter"/>
-<node TEXT="undo filter" ID="ID_660461567" CREATED="1370343428373" MODIFIED="1370344336642">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UndoFilterAction"/>
-</node>
-<node TEXT="Redo filter" ID="ID_1576067187" CREATED="1370343428374" MODIFIED="1370344340493">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RedoFilterAction"/>
-</node>
-<node TEXT="Reapply filter" ID="ID_1884847745" CREATED="1370343428374" MODIFIED="1370344352702">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ReapplyFilterAction"/>
-</node>
-<node TEXT="Quick filter" ID="ID_905319601" CREATED="1370343428374" MODIFIED="1370344361058">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFilterAction"/>
-</node>
-<node TEXT="Filter selected nodes" ID="ID_1117812547" CREATED="1370343428374" MODIFIED="1370344371978">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplySelectedViewConditionAction"/>
-</node>
-<node TEXT="Select all matching nodes" ID="ID_1794886050" CREATED="1370343428374" MODIFIED="1370344381538">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAllAction"/>
-</node>
-<node TEXT="No filtering" ID="ID_1777399100" CREATED="1370343428374" MODIFIED="1370344386098">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplyNoFilteringAction"/>
-</node>
-<node TEXT="Compose filter" ID="ID_1587836692" CREATED="1370343428374" MODIFIED="1370344389354">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditFilterAction"/>
-</node>
-</node>
-<node TEXT="FilterCondition" FOLDED="true" ID="ID_434791760" CREATED="1370343428374" MODIFIED="1370343428374">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="FilterCondition"/>
-<node TEXT="Applies to filtered nodes" ID="ID_1736398664" CREATED="1370343428374" MODIFIED="1370344453833">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplyToVisibleAction"/>
-</node>
-<node TEXT="Show ancestors" ID="ID_885840655" CREATED="1370343428375" MODIFIED="1370344432177">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowAncestorsAction"/>
-</node>
-<node TEXT="Show descendants" ID="ID_1705804597" CREATED="1370343428375" MODIFIED="1370344445497">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowDescendantsAction"/>
-</node>
-</node>
-<node TEXT="Find" FOLDED="true" ID="ID_1867800620" CREATED="1370343428375" MODIFIED="1370343428375">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Find"/>
-<node TEXT="Find previous" ID="ID_1014323743" CREATED="1370343428375" MODIFIED="1370344468713">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-<node TEXT="Find next" ID="ID_767954565" CREATED="1370343428375" MODIFIED="1370344472385">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Extras" FOLDED="true" ID="ID_1169737865" CREATED="1370343428375" MODIFIED="1370344478481">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="extras"/>
-<attribute NAME="name_ref" VALUE="menu_extras"/>
-<node TEXT="Encryption" FOLDED="true" ID="ID_920254780" CREATED="1370343428375" MODIFIED="1370344481577">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="encryption"/>
-<attribute NAME="name_ref" VALUE="menu_encryption"/>
-<node TEXT="Enter password" ID="ID_573043393" CREATED="1370343428376" MODIFIED="1370344486696">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EnterPassword"/>
-</node>
-</node>
-</node>
-<node TEXT="Mindmaps" FOLDED="true" ID="ID_951904015" CREATED="1370343428376" MODIFIED="1370344491177">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="name_ref" VALUE="mindmaps"/>
-<node TEXT="modes" ID="ID_9405523" CREATED="1370343428376" MODIFIED="1370343428376">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_modes"/>
-<attribute NAME="name" VALUE="modes"/>
-</node>
-<node TEXT="navigate" ID="ID_150058962" CREATED="1370343428376" MODIFIED="1370343428376">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_navigate_maps"/>
-<attribute NAME="name" VALUE="navigate"/>
-</node>
-<node TEXT="mindmaps" ID="ID_537066871" CREATED="1370343428376" MODIFIED="1370343428376">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_mindmaps"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-</node>
-</node>
-<node TEXT="Help" FOLDED="true" ID="ID_1277139357" CREATED="1370343428376" MODIFIED="1370344504552">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="help"/>
-<attribute NAME="name_ref" VALUE="help"/>
-<node TEXT="update" FOLDED="true" ID="ID_972374411" CREATED="1370343428377" MODIFIED="1370343428377">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="update"/>
-<node TEXT="Check for updates" ID="ID_939449405" CREATED="1370343428377" MODIFIED="1370344538000">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UpdateCheckAction"/>
-</node>
-</node>
-<node TEXT="Web resources" FOLDED="true" ID="ID_902808063" CREATED="1370343428377" MODIFIED="1370343428377">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Web resources"/>
-<node TEXT="Freeplane's Homepage" ID="ID_209820242" CREATED="1370343428377" MODIFIED="1370344554240">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenFreeplaneSiteAction"/>
-</node>
-<node TEXT="Ask for help" ID="ID_1185626007" CREATED="1370343428377" MODIFIED="1370344561072">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AskForHelp"/>
-</node>
-<node TEXT="Report a bug" ID="ID_858397206" CREATED="1370343428377" MODIFIED="1370344595975">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ReportBugAction"/>
-</node>
-<node TEXT="Request a feature" ID="ID_32257838" CREATED="1370343428377" MODIFIED="1370344604559">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RequestFeatureAction"/>
-</node>
-</node>
-<node TEXT="legacy" FOLDED="true" ID="ID_1396731472" CREATED="1370343428377" MODIFIED="1370343428377">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="legacy"/>
-<node TEXT="About" ID="ID_263533215" CREATED="1370343428377" MODIFIED="1370344613175">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AboutAction"/>
-<attribute NAME="menu_key" VALUE="MB_AboutAction"/>
-</node>
-</node>
-<node TEXT="Tutorial" ID="ID_1223417782" CREATED="1370343428378" MODIFIED="1370344623087">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="GettingStartedAction"/>
-</node>
-<node TEXT="Documentation" ID="ID_1140194712" CREATED="1370343428378" MODIFIED="1370344628423">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="F1"/>
-<attribute NAME="action" VALUE="DocumentationAction"/>
-</node>
-</node>
-</node>
-<node TEXT="map_popup" FOLDED="true" POSITION="right" ID="ID_1830699756" CREATED="1370343428378" MODIFIED="1370343428378">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="map_popup"/>
-<node TEXT="Maps" ID="ID_1158260612" CREATED="1370343428378" MODIFIED="1370344735869">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="menu_key" VALUE="popup_menu_mindmaps"/>
-</node>
-<node TEXT="---" ID="ID_1371257319" CREATED="1370343428378" MODIFIED="1370343428378">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Menubar" ID="ID_1186446429" CREATED="1370343428378" MODIFIED="1370344660934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MP_ToggleMenubarAction"/>
-</node>
-<node TEXT="Toolbar" ID="ID_1075218314" CREATED="1370343428378" MODIFIED="1370344665674">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="Filter toolbar" ID="ID_1862889769" CREATED="1370343428379" MODIFIED="1370344672982">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFilterToolbarAction"/>
-</node>
-<node TEXT="F-keys toolbar" ID="ID_377321612" CREATED="1370343428379" MODIFIED="1370344679806">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleScrollbarsAction"/>
-</node>
-<node TEXT="Outline view" ID="ID_1183283621" CREATED="1370343428379" MODIFIED="1370344702254">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Presentation mode" ID="ID_1313996140" CREATED="1370343428380" MODIFIED="1370344698574">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.presentation_mode"/>
-</node>
-<node TEXT="Center selected node" ID="ID_587549407" CREATED="1370343428380" MODIFIED="1370344711510">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-</node>
-<node TEXT="Goto root" ID="ID_1278328096" CREATED="1370343428380" MODIFIED="1370344715510">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="ESCAPE"/>
-<attribute NAME="action" VALUE="MoveToRootAction"/>
-</node>
-<node TEXT="Goto node with ID..." ID="ID_1367376258" CREATED="1370343428380" MODIFIED="1370344727462">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="GotoNodeAction"/>
-</node>
-</node>
-<node TEXT="node_popup" FOLDED="true" POSITION="right" ID="ID_1003882161" CREATED="1370343428380" MODIFIED="1370343428380">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="node_popup"/>
-<node TEXT="Minimize node" ID="ID_1028056187" CREATED="1370343428381" MODIFIED="1370344795333">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetShortenerStateAction"/>
-</node>
-<node TEXT="Enter password" ID="ID_1446480553" CREATED="1370343428381" MODIFIED="1370344779084">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EnterPassword"/>
-</node>
-<node TEXT="Copy" ID="ID_765323288" CREATED="1370343428382" MODIFIED="1370344765589">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control C"/>
-<attribute NAME="action" VALUE="CopyAction"/>
-</node>
-<node TEXT="Copy node (single)" ID="ID_1110562737" CREATED="1370343428382" MODIFIED="1370344775485">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift C"/>
-<attribute NAME="action" VALUE="CopySingleAction"/>
-</node>
-</node>
-<node TEXT="main_toolbar" FOLDED="true" POSITION="right" ID="ID_494709864" CREATED="1370343428382" MODIFIED="1370343428382">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="main_toolbar"/>
-<node TEXT="main" FOLDED="true" ID="ID_656079159" CREATED="1370343428382" MODIFIED="1370343428382">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="main"/>
-<node TEXT="Previous map" ID="ID_1028131476" CREATED="1370343428382" MODIFIED="1370346044199">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NavigationPreviousMapAction"/>
-</node>
-<node TEXT="Next map" ID="ID_1119132344" CREATED="1370343428382" MODIFIED="1370346049919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NavigationNextMapAction"/>
-</node>
-</node>
-<node TEXT="zoom" ID="ID_1984765408" CREATED="1370343428382" MODIFIED="1370343428382">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_zoom"/>
-<attribute NAME="name" VALUE="zoom"/>
-</node>
-<node TEXT="open" FOLDED="true" ID="ID_33481588" CREATED="1370343428382" MODIFIED="1370343428382">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="open"/>
-<node TEXT="Print map ..." ID="ID_1199035754" CREATED="1370343428383" MODIFIED="1370346082383">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintAction"/>
-</node>
-<node TEXT="Close current map" ID="ID_1142186699" CREATED="1370343428383" MODIFIED="1370346077911">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloseAction"/>
-</node>
-</node>
-<node TEXT="paste" FOLDED="true" ID="ID_391051952" CREATED="1370343428383" MODIFIED="1370343428383">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="paste"/>
-<node TEXT="Copy" ID="ID_1465498341" CREATED="1370343428383" MODIFIED="1370346091191">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyAction"/>
-</node>
-</node>
-<node TEXT="folding" FOLDED="true" ID="ID_209866584" CREATED="1370343428383" MODIFIED="1370343428383">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="folding"/>
-<node TEXT="Unfold one level" ID="ID_1052431770" CREATED="1370343428384" MODIFIED="1370346110055">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UnfoldOneLevelAction"/>
-</node>
-<node TEXT="Fold one level" ID="ID_1237829019" CREATED="1370343428384" MODIFIED="1370346114543">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FoldOneLevelAction"/>
-</node>
-<node TEXT="Unfold all" ID="ID_1481420152" CREATED="1370343428385" MODIFIED="1370346121630">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UnfoldAllAction"/>
-</node>
-<node TEXT="Fold all" ID="ID_34182894" CREATED="1370343428385" MODIFIED="1370346127086">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FoldAllAction"/>
-</node>
-</node>
-<node TEXT="url" ID="ID_266919585" CREATED="1370343428386" MODIFIED="1370343428386">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="url"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_url"/>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane/resources/xml/filemodemenu.mm b/freeplane/resources/xml/filemodemenu.mm
deleted file mode 100644
index 0c87977..0000000
--- a/freeplane/resources/xml/filemodemenu.mm
+++ /dev/null
@@ -1,508 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<attribute_registry SHOW_ATTRIBUTES="hide"/>
-<node TEXT="Menu for Filemode" FOLDED="false" ID="ID_201436647" CREATED="1370196341000" MODIFIED="1370196363296"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="category" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="category" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="radio_action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="radio_action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="submenu" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="submenu" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" MAX_WIDTH="600" COLOR="#000000" STYLE="as_parent">
-<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important">
-<icon BUILTIN="yes"/>
-</stylenode>
-<stylenode TEXT="separator" COLOR="#999999"/>
-<stylenode TEXT="action"/>
-<stylenode TEXT="radio_action">
-<icon BUILTIN="unchecked"/>
-</stylenode>
-<stylenode TEXT="category" COLOR="#000000" BACKGROUND_COLOR="#ccffcc">
-<font ITALIC="true"/>
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="submenu">
-<font ITALIC="true"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="10"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="menu_bar" POSITION="right" ID="ID_32635647" CREATED="1370196341001" MODIFIED="1370196341001">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="menu_bar"/>
-<node TEXT="File" FOLDED="true" ID="ID_559147292" CREATED="1370196341010" MODIFIED="1370196341010">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="file"/>
-<attribute NAME="name_ref" VALUE="file"/>
-<node TEXT="Most recent maps" ID="ID_235051047" CREATED="1370196341010" MODIFIED="1370336913324">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="menu_key" VALUE="main_menu_most_recent_files"/>
-<attribute NAME="name" VALUE="last"/>
-<attribute NAME="name_ref" VALUE="most_recent_files"/>
-</node>
-<node TEXT="Print setup..." ID="ID_1716886830" CREATED="1370196341021" MODIFIED="1370196341021">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PageAction"/>
-</node>
-<node TEXT="Print preview..." ID="ID_1838270397" CREATED="1370196341022" MODIFIED="1370196341022">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintPreviewAction"/>
-</node>
-<node TEXT="Print map..." ID="ID_127592253" CREATED="1370196341025" MODIFIED="1370196341025">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control P"/>
-<attribute NAME="action" VALUE="PrintAction"/>
-</node>
-<node TEXT="Close current map" ID="ID_834282498" CREATED="1370196341026" MODIFIED="1370196341026">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control W"/>
-<attribute NAME="action" VALUE="CloseAction"/>
-</node>
-<node TEXT="Quit Freeplane" ID="ID_620197928" CREATED="1370196341026" MODIFIED="1370196341026">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control Q"/>
-<attribute NAME="action" VALUE="QuitAction"/>
-<attribute NAME="menu_key" VALUE="MB_QuitAction"/>
-</node>
-</node>
-<node TEXT="Edit" FOLDED="true" ID="ID_1176046308" CREATED="1370196341026" MODIFIED="1370196341026">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="edit"/>
-<attribute NAME="name_ref" VALUE="edit"/>
-<node TEXT="find" FOLDED="true" ID="ID_532385965" CREATED="1370196341026" MODIFIED="1370196341026">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="find"/>
-<node TEXT="Find..." ID="ID_1002317457" CREATED="1370196341026" MODIFIED="1370196341026">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control G"/>
-<attribute NAME="action" VALUE="FindAction"/>
-</node>
-<node TEXT="Find next" ID="ID_707793412" CREATED="1370196341027" MODIFIED="1370196341027">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift G"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-<node TEXT="Find previous" ID="ID_236170818" CREATED="1370196341027" MODIFIED="1370196420437">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-<node TEXT="Open File" ID="ID_669079876" CREATED="1370196341027" MODIFIED="1370196341027">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenPathAction"/>
-</node>
-</node>
-</node>
-<node TEXT="view" FOLDED="true" ID="ID_145741322" CREATED="1370196341027" MODIFIED="1370196341027">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="view"/>
-<attribute NAME="name_ref" VALUE="menu_view"/>
-<node TEXT="Menu_Toolbar_Panel" FOLDED="true" ID="ID_1381163767" CREATED="1370196341027" MODIFIED="1370196341027">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Menu_Toolbar_Panel"/>
-<node TEXT="toolbars" FOLDED="true" ID="ID_7330669" CREATED="1370196341028" MODIFIED="1370196341028">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<node TEXT="Toolbars" FOLDED="true" ID="ID_623864969" CREATED="1370196341034" MODIFIED="1370336842333">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<attribute NAME="name_ref" VALUE="menu_toolbars"/>
-<node TEXT="Menubar" ID="ID_550762170" CREATED="1370196341035" MODIFIED="1370196341035">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MB_ToggleMenubarAction"/>
-</node>
-<node TEXT="Toolbar" ID="ID_1101190455" CREATED="1370196341035" MODIFIED="1370196341035">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="Filter toolbar" ID="ID_1834541773" CREATED="1370196341035" MODIFIED="1370196341035">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFilterToolbarAction"/>
-<attribute NAME="accelerator" VALUE="control F"/>
-</node>
-<node TEXT="Scrollbars" ID="ID_1325316435" CREATED="1370196341035" MODIFIED="1370196341035">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleScrollbarsAction"/>
-</node>
-<node TEXT="Presentation mode" ID="ID_1201946503" CREATED="1370196341035" MODIFIED="1370336996637">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.presentation_mode"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="zoom" FOLDED="true" ID="ID_1165816028" CREATED="1370196341035" MODIFIED="1370196341035">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="zoom"/>
-<node TEXT="Zoom in" ID="ID_1613199056" CREATED="1370196341036" MODIFIED="1370196341036">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt UP"/>
-<attribute NAME="action" VALUE="ZoomInAction"/>
-</node>
-<node TEXT="Zoom out" ID="ID_1893025140" CREATED="1370196341036" MODIFIED="1370196341036">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt DOWN"/>
-<attribute NAME="action" VALUE="ZoomOutAction"/>
-</node>
-<node TEXT="Center selected node" ID="ID_1801971893" CREATED="1370196341036" MODIFIED="1370196341036">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt C"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-</node>
-</node>
-<node TEXT="View settings" FOLDED="true" ID="ID_919512036" CREATED="1370196341036" MODIFIED="1370196341036">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_viewmode"/>
-<attribute NAME="name_ref" VALUE="menu_viewmode"/>
-<node TEXT="Outline view" ID="ID_1850220739" CREATED="1370196341036" MODIFIED="1370196341036">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Rectangular selection" ID="ID_1417267859" CREATED="1370196341036" MODIFIED="1370196341036">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowSelectionAsRectangleAction"/>
-</node>
-</node>
-</node>
-<node TEXT="navigate" FOLDED="true" ID="ID_470424918" CREATED="1370196341037" MODIFIED="1370196341037">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="navigate"/>
-<attribute NAME="name_ref" VALUE="menu_navigate"/>
-<node TEXT="navigate" FOLDED="true" ID="ID_922830929" CREATED="1370196341037" MODIFIED="1370196341037">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="navigate"/>
-<node TEXT="Previous map" ID="ID_1700653396" CREATED="1370196341037" MODIFIED="1370196341037">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift TAB"/>
-<attribute NAME="action" VALUE="NavigationPreviousMapAction"/>
-</node>
-<node TEXT="Next map" ID="ID_646647320" CREATED="1370196341037" MODIFIED="1370196341037">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control TAB"/>
-<attribute NAME="action" VALUE="NavigationNextMapAction"/>
-</node>
-<node TEXT="folding" FOLDED="true" ID="ID_1202051404" CREATED="1370196341041" MODIFIED="1370196341041">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="folding"/>
-<node TEXT="(Un)fold" ID="ID_1661783713" CREATED="1370196341041" MODIFIED="1370196341041">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="SPACE"/>
-<attribute NAME="action" VALUE="ToggleFoldedAction"/>
-</node>
-<node TEXT="Show next child" ID="ID_1774683712" CREATED="1370196341042" MODIFIED="1370196341042">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowNextChildAction"/>
-<attribute NAME="accelerator" VALUE="shift SPACE"/>
-</node>
-<node TEXT="(Un)fold children" ID="ID_1995267580" CREATED="1370196341042" MODIFIED="1370196341042">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control SPACE"/>
-<attribute NAME="action" VALUE="ToggleChildrenFoldedAction"/>
-</node>
-</node>
-</node>
-<node TEXT="Goto root" ID="ID_1840726524" CREATED="1370196341042" MODIFIED="1370196341042">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="ESCAPE"/>
-<attribute NAME="action" VALUE="MoveToRootAction"/>
-</node>
-<node TEXT="Goto previous node" ID="ID_1915289168" CREATED="1370196341042" MODIFIED="1370196341042">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt LEFT"/>
-<attribute NAME="action" VALUE="NextNodeAction.BACK"/>
-</node>
-<node TEXT="Goto next node" ID="ID_1200359313" CREATED="1370196341044" MODIFIED="1370196341044">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt RIGHT"/>
-<attribute NAME="action" VALUE="NextNodeAction.FORWARD"/>
-</node>
-</node>
-<node TEXT="Filter" FOLDED="true" ID="ID_865102516" CREATED="1370196341049" MODIFIED="1370196341049">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="filter"/>
-<attribute NAME="name_ref" VALUE="menu_filter"/>
-<node TEXT="Filter" FOLDED="true" ID="ID_1245776869" CREATED="1370196341049" MODIFIED="1370196341049">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Filter"/>
-<node TEXT="DoFilter" FOLDED="true" ID="ID_1770253546" CREATED="1370196341049" MODIFIED="1370196341049">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="DoFilter"/>
-<node TEXT="Undo filter action" ID="ID_1952308974" CREATED="1370196341050" MODIFIED="1370196341050">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UndoFilterAction"/>
-</node>
-<node TEXT="Redo filter action" ID="ID_196177860" CREATED="1370196341050" MODIFIED="1370196341050">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RedoFilterAction"/>
-</node>
-<node TEXT="Reapply filter action" ID="ID_100550506" CREATED="1370196341050" MODIFIED="1370196341050">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ReapplyFilterAction"/>
-</node>
-<node TEXT="Quick filter" ID="ID_1928680482" CREATED="1370196341050" MODIFIED="1370196341050">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFilterAction"/>
-</node>
-<node TEXT="Filter selected nodes" ID="ID_1907894877" CREATED="1370196341111" MODIFIED="1370196341111">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplySelectedViewConditionAction"/>
-</node>
-<node TEXT="Select all matching nodes" ID="ID_592402852" CREATED="1370196341111" MODIFIED="1370196341111">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAllAction"/>
-</node>
-<node TEXT="No filtering" ID="ID_575972793" CREATED="1370196341111" MODIFIED="1370196341111">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplyNoFilteringAction"/>
-</node>
-<node TEXT="Compose filter" ID="ID_1946747633" CREATED="1370196341111" MODIFIED="1370196341111">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditFilterAction"/>
-</node>
-</node>
-<node TEXT="FilterCondition" FOLDED="true" ID="ID_421431012" CREATED="1370196341116" MODIFIED="1370196341116">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="FilterCondition"/>
-<node TEXT="Applies to filtered nodes" ID="ID_706220136" CREATED="1370196341117" MODIFIED="1370196341117">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplyToVisibleAction"/>
-</node>
-<node TEXT="Show ancestors" ID="ID_443820131" CREATED="1370196341117" MODIFIED="1370196341117">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowAncestorsAction"/>
-</node>
-<node TEXT="Show descendants" ID="ID_1961158927" CREATED="1370196341117" MODIFIED="1370196341117">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowDescendantsAction"/>
-</node>
-</node>
-<node TEXT="Find" FOLDED="true" ID="ID_180210796" CREATED="1370196341117" MODIFIED="1370196341117">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Find"/>
-<node TEXT="Find previous" ID="ID_680619885" CREATED="1370196341117" MODIFIED="1370196341117">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-<node TEXT="Find next" ID="ID_967730868" CREATED="1370196341117" MODIFIED="1370196341117">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Maps" FOLDED="true" ID="ID_1277849098" CREATED="1370196341117" MODIFIED="1370196341117">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="name_ref" VALUE="mindmaps"/>
-<node TEXT="Modes" ID="ID_5487162" CREATED="1370196341117" MODIFIED="1370196341117">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_modes"/>
-<attribute NAME="name" VALUE="modes"/>
-</node>
-<node TEXT="navigate" ID="ID_661325256" CREATED="1370196341118" MODIFIED="1370196341118">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_navigate_maps"/>
-<attribute NAME="name" VALUE="navigate"/>
-</node>
-<node TEXT="Maps" ID="ID_1421008563" CREATED="1370196341118" MODIFIED="1370196341118">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_mindmaps"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-</node>
-</node>
-<node TEXT="Help" FOLDED="true" ID="ID_1686155645" CREATED="1370196341118" MODIFIED="1370196341118">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="help"/>
-<attribute NAME="name_ref" VALUE="help"/>
-<node TEXT="update" FOLDED="true" ID="ID_1178888256" CREATED="1370196341118" MODIFIED="1370196341118">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="update"/>
-<node TEXT="Check for updates" ID="ID_702644148" CREATED="1370196341124" MODIFIED="1370196341124">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UpdateCheckAction"/>
-</node>
-</node>
-<node TEXT="Web resources" FOLDED="true" ID="ID_911592986" CREATED="1370196341125" MODIFIED="1370196341125">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Web resources"/>
-<node TEXT="Freeplane's Homepage" ID="ID_1039201186" CREATED="1370196341125" MODIFIED="1370196341125">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenFreeplaneSiteAction"/>
-</node>
-<node TEXT="Ask for help" ID="ID_1079864325" CREATED="1370196341125" MODIFIED="1370196341125">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AskForHelp"/>
-</node>
-<node TEXT="Report a bug" ID="ID_611302666" CREATED="1370196341125" MODIFIED="1370196341125">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ReportBugAction"/>
-</node>
-<node TEXT="Request a feature" ID="ID_688619955" CREATED="1370196341125" MODIFIED="1370196341125">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RequestFeatureAction"/>
-</node>
-</node>
-<node TEXT="legacy" FOLDED="true" ID="ID_183712839" CREATED="1370196341125" MODIFIED="1370196341125">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="legacy"/>
-<node TEXT="About" ID="ID_410708086" CREATED="1370196341134" MODIFIED="1370196341134">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AboutAction"/>
-<attribute NAME="menu_key" VALUE="MB_AboutAction"/>
-</node>
-</node>
-<node TEXT="Tutorial" ID="ID_427345446" CREATED="1370196341134" MODIFIED="1370196341134">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="GettingStartedAction"/>
-</node>
-<node TEXT="Documentation" ID="ID_917660070" CREATED="1370196341134" MODIFIED="1370196341134">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="F1"/>
-<attribute NAME="action" VALUE="DocumentationAction"/>
-</node>
-</node>
-</node>
-<node TEXT="map_popup" FOLDED="true" POSITION="right" ID="ID_1296648975" CREATED="1370196341135" MODIFIED="1370196341135">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="map_popup"/>
-<node TEXT="Maps" ID="ID_299624286" CREATED="1370196341135" MODIFIED="1370196341135">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="menu_key" VALUE="popup_menu_mindmaps"/>
-</node>
-<node TEXT="Menubar" ID="ID_765873519" CREATED="1370196341135" MODIFIED="1370196341135">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MP_ToggleMenubarAction"/>
-</node>
-<node TEXT="Toolbar" ID="ID_1416238396" CREATED="1370196341135" MODIFIED="1370196341135">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="Filter toolbar" ID="ID_1015388149" CREATED="1370196341135" MODIFIED="1370196341135">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFilterToolbarAction"/>
-</node>
-<node TEXT="Scrollbars" ID="ID_1970921662" CREATED="1370196341135" MODIFIED="1370196341135">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleScrollbarsAction"/>
-</node>
-<node TEXT="Outline view" ID="ID_403436016" CREATED="1370196341135" MODIFIED="1370196341135">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Center selected node" ID="ID_1378526351" CREATED="1370196341135" MODIFIED="1370196341135">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-</node>
-<node TEXT="Goto root" ID="ID_1633709060" CREATED="1370196341136" MODIFIED="1370196341136">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="ESCAPE"/>
-<attribute NAME="action" VALUE="MoveToRootAction"/>
-</node>
-</node>
-<node TEXT="node_popup" FOLDED="true" POSITION="right" ID="ID_750660346" CREATED="1370196341136" MODIFIED="1370196341136">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="node_popup"/>
-<node TEXT="Center" ID="ID_854389109" CREATED="1370196341136" MODIFIED="1370196341136">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CenterAction"/>
-</node>
-</node>
-<node TEXT="main_toolbar" FOLDED="true" POSITION="right" ID="ID_507310330" CREATED="1370196341136" MODIFIED="1370196341136">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="main_toolbar"/>
-<node TEXT="update" ID="ID_605543401" CREATED="1370196341136" MODIFIED="1370196341136">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_update"/>
-<attribute NAME="name" VALUE="update"/>
-</node>
-<node TEXT="main" FOLDED="true" ID="ID_1756888414" CREATED="1370196341136" MODIFIED="1370196341136">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="main"/>
-<node TEXT="Previous map" ID="ID_1173271268" CREATED="1370196341136" MODIFIED="1370196341136">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NavigationPreviousMapAction"/>
-</node>
-<node TEXT="Next map" ID="ID_1488201699" CREATED="1370196341136" MODIFIED="1370196341136">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NavigationNextMapAction"/>
-</node>
-</node>
-<node TEXT="zoom" FOLDED="true" ID="ID_287085157" CREATED="1370196341137" MODIFIED="1370196341137">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_zoom"/>
-<attribute NAME="name" VALUE="zoom"/>
-<node TEXT="Center" ID="ID_1136675678" CREATED="1370196341137" MODIFIED="1370196341137">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CenterAction"/>
-</node>
-</node>
-<node TEXT="open" FOLDED="true" ID="ID_104199953" CREATED="1370196341137" MODIFIED="1370196341137">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="open"/>
-<node TEXT="Print map..." ID="ID_1845284650" CREATED="1370196341137" MODIFIED="1370196341137">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintAction"/>
-</node>
-<node TEXT="Close current map" ID="ID_664205456" CREATED="1370196341137" MODIFIED="1370196341137">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloseAction"/>
-</node>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane/resources/xml/mapVersions.xml b/freeplane/resources/xml/mapVersions.xml
index 6a5dcf0..5cfdf2a 100644
--- a/freeplane/resources/xml/mapVersions.xml
+++ b/freeplane/resources/xml/mapVersions.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<MapVersions>
+ <dialect name="FREEPLANE1_5_9" version = "9" versionBegin="freeplane 1.5.9" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
+ <dialect name="FREEPLANE1_5_6" version = "8" versionBegin="freeplane 1.5.6" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
+ <dialect name="FREEPLANE1_5_5" version = "7" versionBegin="freeplane 1.5.5" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
+ <dialect name="FREEPLANE1_5_3" version = "6" versionBegin="freeplane 1.5.3" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
+ <dialect name="FREEPLANE1_5_0" version = "5" versionBegin="freeplane 1.5.0" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
+ <dialect name="FREEPLANE1_4_0" version = "4" versionBegin="freeplane 1.4.0" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
<dialect name="FREEPLANE1_3_0" version = "3" versionBegin="freeplane 1.3.0" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
<dialect name="FREEPLANE1_2_0" version = "2" versionBegin="freeplane 1.2.0" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
<dialect name="FREEPLANE1_1" version = "1" versionBegin="0.9.0" needsConversion="false" anotherDialect="false" appName="Freeplane" url="http://www.freeplane.org" />
diff --git a/freeplane/resources/xml/mindmapmodemenu.mm b/freeplane/resources/xml/mindmapmodemenu.mm
deleted file mode 100644
index ed618aa..0000000
--- a/freeplane/resources/xml/mindmapmodemenu.mm
+++ /dev/null
@@ -1,2116 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<attribute_registry SHOW_ATTRIBUTES="hide"/>
-<node TEXT="Menu for Mindmap Mode" FOLDED="false" ID="ID_691894585" CREATED="1370194798524" MODIFIED="1370195392596"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="category" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="category" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="radio_action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="radio_action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="submenu" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="submenu" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" MAX_WIDTH="600" COLOR="#000000" STYLE="as_parent">
-<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important">
-<icon BUILTIN="yes"/>
-</stylenode>
-<stylenode TEXT="separator" COLOR="#999999"/>
-<stylenode TEXT="action"/>
-<stylenode TEXT="radio_action">
-<icon BUILTIN="unchecked"/>
-</stylenode>
-<stylenode TEXT="category" COLOR="#000000" BACKGROUND_COLOR="#ccffcc">
-<font ITALIC="true"/>
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="submenu">
-<font ITALIC="true"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="10"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="menu_bar" POSITION="right" ID="ID_636805543" CREATED="1370194798524" MODIFIED="1370195023331">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="menu_bar"/>
-<node TEXT="File" FOLDED="true" ID="ID_406009783" CREATED="1370194798535" MODIFIED="1370194798535">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="file"/>
-<attribute NAME="name_ref" VALUE="file"/>
-<node TEXT="New map" ID="ID_1705523326" CREATED="1370194798535" MODIFIED="1370194798535">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewMapAction"/>
-<attribute NAME="accelerator" VALUE="control N"/>
-</node>
-<node TEXT="New map from template..." ID="ID_258280788" CREATED="1370194798537" MODIFIED="1370194798537">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="new_map_from_user_templates"/>
-</node>
-<node TEXT="New protected (encrypted) map ..." ID="ID_1560796784" CREATED="1370194798537" MODIFIED="1370194798537">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EncryptedMap"/>
-</node>
-<node TEXT="---" ID="ID_1642777177" CREATED="1370194798545" MODIFIED="1370194798545">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Save map" ID="ID_1536839431" CREATED="1370194798545" MODIFIED="1370194798545">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SaveAction"/>
-<attribute NAME="accelerator" VALUE="control S"/>
-</node>
-<node TEXT="Save map as..." ID="ID_860034402" CREATED="1370194798545" MODIFIED="1370194798545">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SaveAsAction"/>
-<attribute NAME="accelerator" VALUE="control shift S"/>
-</node>
-<node TEXT="Save all opened maps" ID="ID_1453965278" CREATED="1370194798545" MODIFIED="1370194798545">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SaveAll"/>
-</node>
-<node TEXT="Restore from local history" ID="ID_1303554566" CREATED="1370194798545" MODIFIED="1370194798545">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RevertAction"/>
-</node>
-<node TEXT="---" ID="ID_45483510" CREATED="1370194798546" MODIFIED="1370194798546">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Open saved map..." ID="ID_1448431849" CREATED="1370194798546" MODIFIED="1370194798546">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenAction"/>
-<attribute NAME="accelerator" VALUE="control O"/>
-</node>
-<node TEXT="Open map from URL..." ID="ID_1443001755" CREATED="1370194798546" MODIFIED="1370194798546">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenURLMapAction"/>
-</node>
-<node TEXT="Most recent maps" ID="ID_72482299" CREATED="1370194798546" MODIFIED="1370336921820">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="last"/>
-<attribute NAME="name_ref" VALUE="most_recent_files"/>
-<attribute NAME="menu_key" VALUE="main_menu_most_recent_files"/>
-</node>
-<node TEXT="---" ID="ID_1985431728" CREATED="1370194798546" MODIFIED="1370194798546">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Export map..." ID="ID_1722715061" CREATED="1370194798546" MODIFIED="1370194798546">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExportAction"/>
-</node>
-<node TEXT="Move branch to new map..." ID="ID_978437039" CREATED="1370194798547" MODIFIED="1370194798547">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExportBranchAction"/>
-<attribute NAME="accelerator" VALUE="alt shift A"/>
-</node>
-<node TEXT="Import" FOLDED="true" ID="ID_697626933" CREATED="1370194798551" MODIFIED="1370194798551">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="import"/>
-<attribute NAME="name_ref" VALUE="menu_file_import"/>
-<node TEXT="Branch..." ID="ID_1448767614" CREATED="1370194798551" MODIFIED="1370194798551">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ImportBranchAction"/>
-</node>
-<node TEXT="Linked branch" ID="ID_1130581947" CREATED="1370194798558" MODIFIED="1370194798558">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ImportLinkedBranchAction"/>
-</node>
-<node TEXT="Linked branch without root..." ID="ID_1007652649" CREATED="1370194798558" MODIFIED="1370194798558">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ImportLinkedBranchWithoutRootAction"/>
-</node>
-<node TEXT="---" ID="ID_1324489049" CREATED="1370194798559" MODIFIED="1370194798559">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Explorer favorites..." ID="ID_155149050" CREATED="1370194798559" MODIFIED="1370194798559">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ImportExplorerFavoritesAction"/>
-</node>
-<node TEXT="Folder structure..." ID="ID_1770054265" CREATED="1370194798559" MODIFIED="1370194798559">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ImportFolderStructureAction"/>
-</node>
-<node TEXT="MindManager X5 map..." ID="ID_57842411" CREATED="1370194798559" MODIFIED="1370194798559">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ImportMindmanagerFiles"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1317899899" CREATED="1370194798559" MODIFIED="1370194798559">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Print setup..." ID="ID_115809964" CREATED="1370194798559" MODIFIED="1370194798559">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PageAction"/>
-</node>
-<node TEXT="Print preview..." ID="ID_13338748" CREATED="1370194798561" MODIFIED="1370194798561">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintPreviewAction"/>
-</node>
-<node TEXT="Print map..." ID="ID_374219575" CREATED="1370194798561" MODIFIED="1370194798561">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintAction"/>
-<attribute NAME="accelerator" VALUE="control P"/>
-</node>
-<node TEXT="---" ID="ID_1191657203" CREATED="1370194798561" MODIFIED="1370194798561">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Map statistics..." ID="ID_1855008484" CREATED="1370194798561" MODIFIED="1370194798561">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FilePropertiesAction"/>
-</node>
-<node TEXT="---" ID="ID_1934757137" CREATED="1370194798561" MODIFIED="1370194798561">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Close current map" ID="ID_1536850276" CREATED="1370194798566" MODIFIED="1370194798566">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloseAction"/>
-<attribute NAME="accelerator" VALUE="control W"/>
-</node>
-<node TEXT="---" ID="ID_944150298" CREATED="1370194798566" MODIFIED="1370194798566">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Quit Freeplane" ID="ID_1881174496" CREATED="1370194798566" MODIFIED="1370194798566">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuitAction"/>
-<attribute NAME="accelerator" VALUE="control Q"/>
-<attribute NAME="menu_key" VALUE="MB_QuitAction"/>
-</node>
-</node>
-<node TEXT="Edit" FOLDED="true" ID="ID_1064514668" CREATED="1370194798567" MODIFIED="1370194798567">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="edit"/>
-<attribute NAME="name_ref" VALUE="edit"/>
-<node TEXT="New node" FOLDED="true" ID="ID_1392622016" CREATED="1370194798567" MODIFIED="1370194798567">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_newNode"/>
-<attribute NAME="name_ref" VALUE="menu_newNode"/>
-<node TEXT="New child node" ID="ID_853372580" CREATED="1370194798567" MODIFIED="1370194798567">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewChildAction"/>
-<attribute NAME="accelerator" VALUE="INSERT"/>
-</node>
-<node TEXT="New sibling node" ID="ID_1965609973" CREATED="1370194798567" MODIFIED="1370194798567">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewSiblingAction"/>
-<attribute NAME="accelerator" VALUE="ENTER"/>
-</node>
-<node TEXT="New previous sibling node" ID="ID_166645385" CREATED="1370194798567" MODIFIED="1370194798567">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewPreviousSiblingAction"/>
-<attribute NAME="accelerator" VALUE="shift ENTER"/>
-</node>
-<node TEXT="New parent node" ID="ID_269199803" CREATED="1370194798568" MODIFIED="1370194798568">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewParentNode"/>
-<attribute NAME="accelerator" VALUE="shift INSERT"/>
-</node>
-<node TEXT="New free node" ID="ID_1216154833" CREATED="1370194798568" MODIFIED="1370194798568">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewFreeNodeAction"/>
-</node>
-<node TEXT="New summary node (selected nodes)" ID="ID_702337814" CREATED="1370194798568" MODIFIED="1370194798568">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewSummaryAction"/>
-<attribute NAME="accelerator" VALUE="alt shift INSERT"/>
-</node>
-</node>
-<node TEXT="Node group" FOLDED="true" ID="ID_570938000" CREATED="1370194798568" MODIFIED="1370194798568">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_group"/>
-<attribute NAME="name_ref" VALUE="menu_group"/>
-<node TEXT="Summary node (begin of group)" ID="ID_1010986763" CREATED="1370194798572" MODIFIED="1370194798572">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FirstGroupNodeAction"/>
-<attribute NAME="accelerator" VALUE="alt shift B"/>
-</node>
-<node TEXT="Summary node (set/reset)" ID="ID_952297453" CREATED="1370194798573" MODIFIED="1370194798573">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SummaryNodeAction"/>
-<attribute NAME="accelerator" VALUE="alt shift S"/>
-</node>
-<node TEXT="Always unfolded node (set/reset)" ID="ID_1073653247" CREATED="1370194798573" MODIFIED="1370194798573">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AlwaysUnfoldedNodeAction"/>
-</node>
-<node TEXT="Add / remove cloud (default)" ID="ID_294484372" CREATED="1370194798573" MODIFIED="1370194798573">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloudAction"/>
-<attribute NAME="accelerator" VALUE="control shift B"/>
-</node>
-</node>
-<node TEXT="Connect" ID="ID_803645535" CREATED="1370194798573" MODIFIED="1370194798573">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AddConnectorAction"/>
-<attribute NAME="accelerator" VALUE="control L"/>
-</node>
-<node TEXT="Links" FOLDED="true" ID="ID_1556505118" CREATED="1370194798573" MODIFIED="1370334712365">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="links"/>
-<attribute NAME="name_ref" VALUE="menu_links"/>
-<node TEXT="Add hyperlink (choose)..." ID="ID_1498143382" CREATED="1370194798574" MODIFIED="1370194798574">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetLinkByFileChooserAction"/>
-<attribute NAME="accelerator" VALUE="control shift K"/>
-</node>
-<node TEXT="Add or modify hyperlink (type)..." ID="ID_861972359" CREATED="1370194798574" MODIFIED="1370194798574">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetLinkByTextFieldAction"/>
-<attribute NAME="accelerator" VALUE="control K"/>
-</node>
-<node TEXT="Convert link from within text" ID="ID_1382855387" CREATED="1370194798574" MODIFIED="1370194798574">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExtractLinkFromTextAction"/>
-</node>
-<node TEXT="---" ID="ID_1745866315" CREATED="1370194798574" MODIFIED="1370194798574">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Add local hyperlink" ID="ID_133152604" CREATED="1370194798574" MODIFIED="1370194798574">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AddLocalLinkAction"/>
-<attribute NAME="accelerator" VALUE="alt shift L"/>
-</node>
-<node TEXT="Add hyperlink to menu item..." ID="ID_361535700" CREATED="1370194798574" MODIFIED="1370194798574">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AddMenuItemLinkAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-<node TEXT="---" ID="ID_219304761" CREATED="1370194798575" MODIFIED="1370194798575">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Set link anchor" ID="ID_263691374" CREATED="1370194798575" MODIFIED="1370194798575">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetLinkAnchorAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-<node TEXT="Make link from anchor" ID="ID_1417288354" CREATED="1370194798646" MODIFIED="1370194798646">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MakeLinkFromAnchorAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-<node TEXT="Make link to anchor" ID="ID_1823067975" CREATED="1370194798646" MODIFIED="1370194798646">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MakeLinkToAnchorAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-<node TEXT="Clear link anchor" ID="ID_17511554" CREATED="1370194798646" MODIFIED="1370194798646">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ClearLinkAnchorAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1120284303" CREATED="1370194798647" MODIFIED="1370194798647">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Remove node" ID="ID_16716029" CREATED="1370194798647" MODIFIED="1370194798647">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="DeleteAction"/>
-<attribute NAME="accelerator" VALUE="DELETE"/>
-</node>
-<node TEXT="---" ID="ID_562002085" CREATED="1370194798647" MODIFIED="1370194798647">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Node core" FOLDED="true" ID="ID_266307790" CREATED="1370194798647" MODIFIED="1370194798647">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_title"/>
-<attribute NAME="name_ref" VALUE="menu_title"/>
-<node TEXT="Edit node core in-line" ID="ID_607901764" CREATED="1370194798647" MODIFIED="1370194798647">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditAction"/>
-<attribute NAME="accelerator" VALUE="F2"/>
-</node>
-<node TEXT="Edit on double click" ID="ID_760123705" CREATED="1370194798664" MODIFIED="1370334775676">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.edit_on_double_click"/>
-</node>
-<node TEXT="Edit node core in dialog" ID="ID_1835607764" CREATED="1370194798664" MODIFIED="1370194798664">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditLongAction"/>
-<attribute NAME="accelerator" VALUE="alt ENTER"/>
-</node>
-<node TEXT="Join nodes" ID="ID_1028352921" CREATED="1370194798664" MODIFIED="1370194798664">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="JoinNodesAction"/>
-<attribute NAME="accelerator" VALUE="control J"/>
-</node>
-<node TEXT="Split node" ID="ID_1163943962" CREATED="1370194798665" MODIFIED="1370194798665">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SplitNode"/>
-</node>
-<node TEXT="Change revisions background color" ID="ID_1486500406" CREATED="1370194798665" MODIFIED="1370194798665">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RevisionPluginAction"/>
-</node>
-<node TEXT="---" ID="ID_99391948" CREATED="1370194798665" MODIFIED="1370194798665">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Image by choice or link..." ID="ID_85819761" CREATED="1370194798665" MODIFIED="1370194798665">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetImageByFileChooserAction"/>
-<attribute NAME="accelerator" VALUE="alt shift K"/>
-</node>
-</node>
-<node TEXT="Icons" FOLDED="true" ID="ID_1377598100" CREATED="1370194798665" MODIFIED="1370334781924">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="icons"/>
-<attribute NAME="name_ref" VALUE="menu_iconView"/>
-<node TEXT="Icon from table..." ID="ID_1220884861" CREATED="1370194798665" MODIFIED="1370194798665">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="IconSelectionPlugin"/>
-<attribute NAME="accelerator" VALUE="control F2"/>
-</node>
-<node TEXT="Icons" ID="ID_690477551" CREATED="1370194798671" MODIFIED="1370334796068">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="icons"/>
-<attribute NAME="name_ref" VALUE="menu_iconByCategory"/>
-<node TEXT="---" ID="ID_988568228" CREATED="1370194798672" MODIFIED="1370194798672">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="icons_list" ID="ID_808165381" CREATED="1370194798672" MODIFIED="1370194798672">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="icons_list"/>
-<attribute NAME="menu_key" VALUE="main_menu_icons"/>
-</node>
-</node>
-<node TEXT="Progress icon (%)" FOLDED="true" ID="ID_549158740" CREATED="1370194798672" MODIFIED="1370334849539">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="progress"/>
-<attribute NAME="name_ref" VALUE="menu_progress"/>
-<node TEXT="Progress up" ID="ID_102557355" CREATED="1370194798673" MODIFIED="1370194798673">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="IconProgressIconUpAction"/>
-<attribute NAME="accelerator" VALUE="alt LESS"/>
-</node>
-<node TEXT="Progress down" ID="ID_1904205325" CREATED="1370194798673" MODIFIED="1370194798673">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="IconProgressIconDownAction"/>
-<attribute NAME="accelerator" VALUE="alt shift LESS"/>
-</node>
-<node TEXT="---" ID="ID_341944183" CREATED="1370194798673" MODIFIED="1370194798673">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Extended progress 10%" ID="ID_1112275743" CREATED="1370194798673" MODIFIED="1370194798673">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="IconProgressExtended10Action"/>
-</node>
-<node TEXT="Extended progress 25%" ID="ID_1606614895" CREATED="1370194798673" MODIFIED="1370194798673">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="IconProgressExtended25Action"/>
-</node>
-<node TEXT="---" ID="ID_1038107274" CREATED="1370194798673" MODIFIED="1370194798673">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Remove progress" ID="ID_1751494257" CREATED="1370194798681" MODIFIED="1370194798681">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="IconProgressRemoveAction"/>
-</node>
-</node>
-<node TEXT="Show icons hierarchically" ID="ID_1725079351" CREATED="1370194798681" MODIFIED="1370194798681">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="HierarchicalIconsAction"/>
-</node>
-<node TEXT="Show intersection of child icons" ID="ID_1151473440" CREATED="1370194798681" MODIFIED="1370194798681">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="HierarchicalIcons2Action"/>
-</node>
-<node TEXT="Remove icons" FOLDED="true" ID="ID_1052253050" CREATED="1370194798681" MODIFIED="1370194798681">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_remove_icons"/>
-<node TEXT="Remove first icon" ID="ID_7930582" CREATED="1370194798682" MODIFIED="1370194798682">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveIcon_0_Action"/>
-</node>
-<node TEXT="Remove Last Icon" ID="ID_535299053" CREATED="1370194798682" MODIFIED="1370194798682">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveIconAction"/>
-</node>
-<node TEXT="Remove all icons" ID="ID_114256700" CREATED="1370194798682" MODIFIED="1370194798682">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveAllIconsAction"/>
-</node>
-</node>
-</node>
-<node TEXT="Node extensions" FOLDED="true" ID="ID_1694240299" CREATED="1370194798682" MODIFIED="1370194798682">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_extensions"/>
-<attribute NAME="name_ref" VALUE="menu_extensions"/>
-<node TEXT="Edit node details in-line" ID="ID_1646950700" CREATED="1370194798682" MODIFIED="1370194798682">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditDetailsAction"/>
-</node>
-<node TEXT="Edit node details in dialog" ID="ID_1478340195" CREATED="1370194798682" MODIFIED="1370194798682">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditDetailsInDialogAction"/>
-</node>
-<node TEXT="Copy extensions from style node" ID="ID_481032468" CREATED="1370194798682" MODIFIED="1370194798682">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyStyleExtensionsAction"/>
-</node>
-<node TEXT="Remove node details" ID="ID_904492783" CREATED="1370194798683" MODIFIED="1370194798683">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="DeleteDetailsAction"/>
-</node>
-<node TEXT="---" ID="ID_1349601166" CREATED="1370194798683" MODIFIED="1370194798683">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Add image..." ID="ID_531292236" CREATED="1370194798683" MODIFIED="1370194798683">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExternalImageAddAction"/>
-</node>
-<node TEXT="Change image..." ID="ID_1062097964" CREATED="1370194798683" MODIFIED="1370194798683">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExternalImageChangeAction"/>
-</node>
-<node TEXT="Remove image" ID="ID_1797697627" CREATED="1370194798683" MODIFIED="1370194798683">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExternalImageRemoveAction"/>
-</node>
-<node TEXT="---" ID="ID_1172032718" CREATED="1370194798683" MODIFIED="1370194798683">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Edit attribute in-line" ID="ID_1208895185" CREATED="1370194798683" MODIFIED="1370194798683">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditAttributesAction"/>
-<attribute NAME="accelerator" VALUE="alt F9"/>
-</node>
-<node TEXT="Add attribute in dialog..." ID="ID_812006901" CREATED="1370194798683" MODIFIED="1370194798683">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="attributes_AddAttributeAction"/>
-</node>
-<node TEXT="Find and replace attributes..." ID="ID_1734577061" CREATED="1370194798684" MODIFIED="1370194798684">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AssignAttributesAction"/>
-</node>
-<node TEXT="Copy attributes" ID="ID_388733176" CREATED="1370194798684" MODIFIED="1370194798684">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyAttributes"/>
-</node>
-<node TEXT="Paste attributes" ID="ID_296247951" CREATED="1370194798684" MODIFIED="1370194798684">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PasteAttributes"/>
-</node>
-<node TEXT="Attributes from style" ID="ID_1799464385" CREATED="1370194798684" MODIFIED="1370194798684">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AddStyleAttributes"/>
-</node>
-<node TEXT="Remove attribute" FOLDED="true" ID="ID_1170025037" CREATED="1370194798684" MODIFIED="1370194798684">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_removeAttribute"/>
-<attribute NAME="name_ref" VALUE="menu_removeAttribute"/>
-<node TEXT="Remove first attribute" ID="ID_747672780" CREATED="1370194798684" MODIFIED="1370194798684">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="attributes_RemoveFirstAttributeAction"/>
-</node>
-<node TEXT="Remove last attribute" ID="ID_1297735599" CREATED="1370194798684" MODIFIED="1370194798684">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="attributes_RemoveLastAttributeAction"/>
-</node>
-<node TEXT="Remove all attributes" ID="ID_1695452318" CREATED="1370194798684" MODIFIED="1370194798684">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="attributes_RemoveAllAttributesAction"/>
-</node>
-</node>
-<node TEXT="Attribute manager..." ID="ID_781687084" CREATED="1370194798685" MODIFIED="1370194798685">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowAttributeDialogAction"/>
-</node>
-<node TEXT="---" ID="ID_1580492073" CREATED="1370194798685" MODIFIED="1370194798685">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Add LaTeX formula..." ID="ID_192550812" CREATED="1370194798685" MODIFIED="1370194798685">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="LatexInsertLatexAction"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.latex"/>
-</node>
-<node TEXT="Edit LaTeX formula..." ID="ID_204716025" CREATED="1370194798693" MODIFIED="1370194798693">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="LatexEditLatexAction"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.latex"/>
-</node>
-<node TEXT="Remove LaTeX formula" ID="ID_1707193002" CREATED="1370194798693" MODIFIED="1370194798693">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="LatexDeleteLatexAction"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.latex"/>
-</node>
-<node TEXT="---" ID="ID_1286298150" CREATED="1370194798693" MODIFIED="1370194798693">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Add OpenMaps Location..." ID="ID_825193044" CREATED="1370194798693" MODIFIED="1370194798693">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenMapsAddLocation"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.openmaps"/>
-</node>
-<node TEXT="Remove OpenMaps Location" ID="ID_1841735261" CREATED="1370194798693" MODIFIED="1370194798693">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenMapsRemoveLocation"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.openmaps"/>
-</node>
-<node TEXT="View OpenMaps Location..." ID="ID_1681751583" CREATED="1370194798700" MODIFIED="1370194798700">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenMapsViewLocation"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.openmaps"/>
-</node>
-</node>
-<node TEXT="Notes" FOLDED="true" ID="ID_847498955" CREATED="1370194798701" MODIFIED="1370334870379">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="notes"/>
-<attribute NAME="name_ref" VALUE="menu_notes"/>
-<node TEXT="SelectNoteAction">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SelectNoteAction"/>
-<attribute NAME="accelerator" VALUE="control LESS"/>
-</node>
-<node TEXT="Edit note in dialog" ID="ID_1125575353" CREATED="1370194798701" MODIFIED="1370194798701">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditNoteInDialogAction"/>
-</node>
-<node TEXT="Remove note" ID="ID_400007160" CREATED="1370194798701" MODIFIED="1370194798701">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveNoteAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_342700381" CREATED="1370194798701" MODIFIED="1370194798701">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Undo" ID="ID_323454547" CREATED="1370194798701" MODIFIED="1370343489059">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UndoAction"/>
-<attribute NAME="accelerator" VALUE="control Z"/>
-</node>
-<node TEXT="Redo" ID="ID_1639491869" CREATED="1370194798704" MODIFIED="1370194798704">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RedoAction"/>
-<attribute NAME="accelerator" VALUE="control Y"/>
-</node>
-<node TEXT="Cut" ID="ID_1390723264" CREATED="1370194798704" MODIFIED="1370194798704">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CutAction"/>
-<attribute NAME="accelerator" VALUE="control X"/>
-</node>
-<node TEXT="Copy" FOLDED="true" ID="ID_987993701" CREATED="1370194798705" MODIFIED="1370194798705">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_copy"/>
-<attribute NAME="name_ref" VALUE="menu_copy"/>
-<node TEXT="Copy" ID="ID_1463682071" CREATED="1370194798705" MODIFIED="1370194798705">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyAction"/>
-<attribute NAME="accelerator" VALUE="control C"/>
-</node>
-<node TEXT="Copy node (single)" ID="ID_1987568912" CREATED="1370194798706" MODIFIED="1370194798706">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopySingleAction"/>
-<attribute NAME="accelerator" VALUE="control shift C"/>
-</node>
-<node TEXT="Copy node ID" ID="ID_1031247260" CREATED="1370194798706" MODIFIED="1370194798706">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyIDAction"/>
-</node>
-<node TEXT="Copy node URI" ID="ID_118234000" CREATED="1370194798706" MODIFIED="1370194798706">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyNodeURIAction"/>
-</node>
-</node>
-<node TEXT="Paste" ID="ID_763863977" CREATED="1370194798706" MODIFIED="1370194798706">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PasteAction"/>
-<attribute NAME="accelerator" VALUE="control V"/>
-</node>
-<node TEXT="Paste as..." ID="ID_953688636" CREATED="1370194798707" MODIFIED="1370194798707">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SelectedPasteAction"/>
-</node>
-<node TEXT="---" ID="ID_1646346919" CREATED="1370194798707" MODIFIED="1370194798707">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Move and sort" FOLDED="true" ID="ID_926267534" CREATED="1370194798707" MODIFIED="1370194798707">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_moveNode"/>
-<attribute NAME="name_ref" VALUE="menu_moveNode"/>
-<node TEXT="Move node (Sibling up)" ID="ID_1601300013" CREATED="1370194798707" MODIFIED="1370194798707">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeUpAction"/>
-<attribute NAME="accelerator" VALUE="control UP"/>
-</node>
-<node TEXT="Move node (Sibling down)" ID="ID_1583540115" CREATED="1370194798715" MODIFIED="1370194798715">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeDownAction"/>
-<attribute NAME="accelerator" VALUE="control DOWN"/>
-</node>
-<node TEXT="Sort children" ID="ID_1799547046" CREATED="1370194798715" MODIFIED="1370194798715">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SortNodes"/>
-</node>
-<node TEXT="Move node (Parents sibling)" ID="ID_1399738932" CREATED="1370194798716" MODIFIED="1370194798716">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ChangeNodeLevelLeftsAction"/>
-<attribute NAME="accelerator" VALUE="control LEFT"/>
-</node>
-<node TEXT="Move node (Siblings child)" ID="ID_973589761" CREATED="1370194798716" MODIFIED="1370194798716">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ChangeNodeLevelRightsAction"/>
-<attribute NAME="accelerator" VALUE="control RIGHT"/>
-</node>
-</node>
-<node TEXT="Free positioned node (set/reset)" ID="ID_1170575254" CREATED="1370194798716" MODIFIED="1370194798716">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FreeNodeAction"/>
-</node>
-<node TEXT="Reset node position" ID="ID_56951123" CREATED="1370194798716" MODIFIED="1370194798716">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ResetNodeLocationAction"/>
-</node>
-<node TEXT="---" ID="ID_957163489" CREATED="1370194798716" MODIFIED="1370194798716">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="find" FOLDED="true" ID="ID_1965550790" CREATED="1370194798716" MODIFIED="1370194798716">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="find"/>
-<node TEXT="Find..." ID="ID_8920238" CREATED="1370194798716" MODIFIED="1370194798716">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FindAction"/>
-<attribute NAME="accelerator" VALUE="control G"/>
-</node>
-<node TEXT="Find next" ID="ID_1023154200" CREATED="1370194798716" MODIFIED="1370194798716">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-<attribute NAME="accelerator" VALUE="control shift G"/>
-</node>
-<node TEXT="Find previous" ID="ID_960953165" CREATED="1370194798717" MODIFIED="1370194798717">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-<node TEXT="Find and replace..." ID="ID_1754045628" CREATED="1370194798717" MODIFIED="1370194798717">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeListAction"/>
-<attribute NAME="accelerator" VALUE="control shift F"/>
-</node>
-<node TEXT="Find and replace in all maps" ID="ID_486648719" CREATED="1370194798717" MODIFIED="1370194798717">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AllMapsNodeListAction"/>
-</node>
-</node>
-</node>
-<node TEXT="View" FOLDED="true" ID="ID_736872434" CREATED="1370194798717" MODIFIED="1370334676453">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="view"/>
-<attribute NAME="name_ref" VALUE="menu_view"/>
-<node TEXT="New map view" ID="ID_827837477" CREATED="1370194798727" MODIFIED="1370194798727">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewMapViewAction"/>
-</node>
-<node TEXT="Menu_Toolbar_Panel" FOLDED="true" ID="ID_143256340" CREATED="1370194798727" MODIFIED="1370194798727">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Menu_Toolbar_Panel"/>
-<node TEXT="toolbars" FOLDED="true" ID="ID_741387409" CREATED="1370194798727" MODIFIED="1370194798727">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<node TEXT="Toolbars" FOLDED="true" ID="ID_463056530" CREATED="1370194798727" MODIFIED="1370334915930">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<attribute NAME="name_ref" VALUE="menu_toolbars"/>
-<node TEXT="Menubar" ID="ID_1214899645" CREATED="1370194798727" MODIFIED="1370194798727">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MB_ToggleMenubarAction"/>
-</node>
-<node TEXT="Toolbar" ID="ID_904536782" CREATED="1370194798727" MODIFIED="1370194798727">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="Filter toolbar" ID="ID_715659174" CREATED="1370194798747" MODIFIED="1370194798747">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFilterToolbarAction"/>
-<attribute NAME="accelerator" VALUE="control F"/>
-</node>
-<node TEXT="F-keys Bar" ID="ID_40253593" CREATED="1370194798747" MODIFIED="1370334926482">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleFBarAction"/>
-</node>
-<node TEXT="Icons toolbar" ID="ID_382413945" CREATED="1370194798748" MODIFIED="1370194798748">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleLeftToolbarAction"/>
-</node>
-<node TEXT="Display status line" ID="ID_1911024299" CREATED="1370194798748" MODIFIED="1370194798748">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleStatusAction"/>
-</node>
-<node TEXT="Scrollbars" ID="ID_878393547" CREATED="1370194798749" MODIFIED="1370194798749">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleScrollbarsAction"/>
-</node>
-</node>
-<node TEXT="Properties panel" ID="ID_759196812" CREATED="1370194798749" MODIFIED="1370194798749">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFormatPanel"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_742463946" CREATED="1370194798749" MODIFIED="1370194798749">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-</node>
-<node TEXT="Zoom" FOLDED="true" ID="ID_933007771" CREATED="1370194798749" MODIFIED="1370334933626">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="zoom"/>
-<node TEXT="Zoom in" ID="ID_407406083" CREATED="1370194798749" MODIFIED="1370194798749">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ZoomInAction"/>
-<attribute NAME="accelerator" VALUE="alt UP"/>
-</node>
-<node TEXT="Zoom out" ID="ID_857707228" CREATED="1370194798749" MODIFIED="1370194798749">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ZoomOutAction"/>
-<attribute NAME="accelerator" VALUE="alt DOWN"/>
-</node>
-<node TEXT="Zoom to fit to page" ID="ID_265550818" CREATED="1370194798762" MODIFIED="1370194798762">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FitToPage"/>
-</node>
-<node TEXT="Center selected node" ID="ID_282591741" CREATED="1370194798762" MODIFIED="1370194798762">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-<attribute NAME="accelerator" VALUE="control alt C"/>
-</node>
-<node TEXT="Center selected node" ID="ID_872705376" CREATED="1370194798778" MODIFIED="1370334948650">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.center_selected_node"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1979798018" CREATED="1370194798778" MODIFIED="1370194798778">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="View settings" FOLDED="true" ID="ID_626679579" CREATED="1370194798784" MODIFIED="1370195527394">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_viewmode"/>
-<attribute NAME="name_ref" VALUE="menu_viewmode"/>
-<node TEXT="Outline view" ID="ID_866224638" CREATED="1370194798784" MODIFIED="1370194798784">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Full screen mode" ID="ID_370782802" CREATED="1370194798785" MODIFIED="1370194798785">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleFullScreenAction"/>
-</node>
-<node TEXT="Presentation mode" ID="ID_723572077" CREATED="1370194798785" MODIFIED="1370334966163">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.presentation_mode"/>
-</node>
-<node TEXT="Rectangular selection" ID="ID_1131505033" CREATED="1370194798785" MODIFIED="1370194798785">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowSelectionAsRectangleAction"/>
-</node>
-<node TEXT="Highlight formulas" ID="ID_1286936249" CREATED="1370194798785" MODIFIED="1370334973602">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.highlight_formulas"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1644709030" CREATED="1370194798785" MODIFIED="1370194798785">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Minimize node" ID="ID_483570758" CREATED="1370194798806" MODIFIED="1370194798806">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetShortenerStateAction"/>
-</node>
-<node TEXT="Hide details" ID="ID_681110643" CREATED="1370194798807" MODIFIED="1370194798807">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleDetailsAction"/>
-<attribute NAME="accelerator" VALUE="alt F2"/>
-</node>
-<node TEXT="Tool tips" FOLDED="true" ID="ID_485642837" CREATED="1370194798807" MODIFIED="1370194798807">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_hoverView"/>
-<attribute NAME="name_ref" VALUE="menu_hoverView"/>
-<node TEXT="Display tool tips" ID="ID_1678964910" CREATED="1370194798807" MODIFIED="1370335023905">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.show_node_tooltips"/>
-</node>
-<node TEXT="Display node styles in tool tips" ID="ID_420690474" CREATED="1370194798807" MODIFIED="1370335062113">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.show_styles_in_tooltip"/>
-</node>
-<node TEXT="Display modification times" ID="ID_1658544067" CREATED="1370194798807" MODIFIED="1370194798807">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CreationModificationPluginAction"/>
-</node>
-</node>
-<node TEXT="AttributeView" FOLDED="true" ID="ID_1440176200" CREATED="1370194798807" MODIFIED="1370194798807">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="AttributeView"/>
-<node TEXT="Node attributes" FOLDED="true" ID="ID_414868867" CREATED="1370194798807" MODIFIED="1370194798807">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_displayAttributes"/>
-<attribute NAME="name_ref" VALUE="menu_displayAttributes"/>
-<node TEXT="Show selected attributes" ID="ID_587556905" CREATED="1370194798807" MODIFIED="1370194798807">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="ShowSelectedAttributesAction"/>
-</node>
-<node TEXT="Show all attributes" ID="ID_58568686" CREATED="1370194798807" MODIFIED="1370194798807">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="ShowAllAttributesAction"/>
-</node>
-<node TEXT="Hide all attributes" ID="ID_190347460" CREATED="1370194798808" MODIFIED="1370194798808">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="HideAllAttributesAction"/>
-</node>
-<node TEXT="Show icon for attributes" ID="ID_1236326850" CREATED="1370194798808" MODIFIED="1370344038126">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanMapPropertyAction.show_icon_for_attributes"/>
-</node>
-</node>
-</node>
-<node TEXT="Notes" FOLDED="true" ID="ID_1436570954" CREATED="1370194798808" MODIFIED="1370194798808">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_noteView"/>
-<attribute NAME="name_ref" VALUE="menu_noteView"/>
-<node TEXT="Display note panel" ID="ID_1042871377" CREATED="1370194798808" MODIFIED="1370194798808">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowHideNoteAction"/>
-<attribute NAME="accelerator" VALUE="control GREATER"/>
-</node>
-<node TEXT="Note panel position" FOLDED="true" ID="ID_1676289590" CREATED="1370194798808" MODIFIED="1370194798808">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="note_window_location"/>
-<attribute NAME="name_ref" VALUE="note_window_location"/>
-<node TEXT="Top" ID="ID_1402820198" CREATED="1370194798808" MODIFIED="1370194798808">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="SetNoteWindowPosition.top"/>
-</node>
-<node TEXT="Left" ID="ID_581625920" CREATED="1370194798816" MODIFIED="1370194798816">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="SetNoteWindowPosition.left"/>
-</node>
-<node TEXT="Right" ID="ID_375860983" CREATED="1370194798816" MODIFIED="1370194798816">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="SetNoteWindowPosition.right"/>
-</node>
-<node TEXT="Bottom" ID="ID_888523136" CREATED="1370194798817" MODIFIED="1370194798817">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="SetNoteWindowPosition.bottom"/>
-</node>
-</node>
-<node TEXT="Show note icons" ID="ID_1526587566" CREATED="1370194798817" MODIFIED="1370335082456">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanMapPropertyAction.show_note_icons"/>
-</node>
-<node TEXT="Display notes in map" ID="ID_620871847" CREATED="1370194798817" MODIFIED="1370194798817">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowNotesInMapAction"/>
-</node>
-</node>
-</node>
-<node TEXT="Format" FOLDED="true" ID="ID_74036811" CREATED="1370194798817" MODIFIED="1370334678637">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="format"/>
-<attribute NAME="name_ref" VALUE="menu_format"/>
-<node TEXT="Apply style" ID="ID_979545798" CREATED="1370194798817" MODIFIED="1370194798817">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_applyStyle"/>
-<attribute NAME="name_ref" VALUE="menu_applyStyle"/>
-<attribute NAME="menu_key" VALUE="main_menu_styles"/>
-</node>
-<node TEXT="Apply level styles" FOLDED="true" ID="ID_1818873885" CREATED="1370194798817" MODIFIED="1370194798817">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="AutomaticLayoutAction"/>
-<attribute NAME="name_ref" VALUE="automatic_layout"/>
-<node TEXT="for non leave nodes" ID="ID_348142044" CREATED="1370194798817" MODIFIED="1370194798817">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AutomaticLayoutControllerAction.HEADINGS"/>
-</node>
-<node TEXT="for all nodes" ID="ID_1879525351" CREATED="1370194798817" MODIFIED="1370194798817">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AutomaticLayoutControllerAction.ALL"/>
-</node>
-<node TEXT="disabled" ID="ID_793031894" CREATED="1370194798818" MODIFIED="1370194798818">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AutomaticLayoutControllerAction.null"/>
-</node>
-</node>
-<node TEXT="Manage Styles" FOLDED="true" ID="ID_306428571" CREATED="1370194798818" MODIFIED="1370194798818">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_manageStyles"/>
-<attribute NAME="name_ref" VALUE="menu_manageStyles"/>
-<node TEXT="New style from selection" ID="ID_159416697" CREATED="1370194798818" MODIFIED="1370194798818">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewUserStyleAction"/>
-</node>
-<node TEXT="Redefine style" ID="ID_818301233" CREATED="1370194798818" MODIFIED="1370194798818">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RedefineStyleAction"/>
-</node>
-<node TEXT="Manage conditional styles for map" ID="ID_805486777" CREATED="1370194798818" MODIFIED="1370194798818">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ManageConditionalStylesAction"/>
-</node>
-<node TEXT="Manage conditional styles for node" ID="ID_1005345644" CREATED="1370194798818" MODIFIED="1370194798818">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ManageNodeConditionalStylesAction"/>
-</node>
-<node TEXT="---" ID="ID_1647592745" CREATED="1370194798818" MODIFIED="1370194798818">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Copy map style from..." ID="ID_468835002" CREATED="1370194798821" MODIFIED="1370194798821">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyMapStylesAction"/>
-</node>
-<node TEXT="Edit styles" ID="ID_246750226" CREATED="1370194798822" MODIFIED="1370194798822">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditStylesAction"/>
-</node>
-</node>
-<node TEXT="Copy format" ID="ID_1670892979" CREATED="1370194798822" MODIFIED="1370194798822">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FormatCopy"/>
-<attribute NAME="accelerator" VALUE="alt shift C"/>
-</node>
-<node TEXT="Paste format" ID="ID_1621680412" CREATED="1370194798822" MODIFIED="1370194798822">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FormatPaste"/>
-<attribute NAME="accelerator" VALUE="alt shift V"/>
-</node>
-<node TEXT="---" ID="ID_1154977018" CREATED="1370194798822" MODIFIED="1370194798822">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Map background color" ID="ID_727314892" CREATED="1370194798822" MODIFIED="1370194798822">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MapBackgroundColorAction"/>
-</node>
-<node TEXT="Node core" FOLDED="true" ID="ID_305696182" CREATED="1370194798822" MODIFIED="1370194798822">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_coreFormat"/>
-<attribute NAME="name_ref" VALUE="menu_coreFormat"/>
-<node TEXT="Bold" ID="ID_1378848121" CREATED="1370194798822" MODIFIED="1370194798822">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="BoldAction"/>
-<attribute NAME="accelerator" VALUE="control B"/>
-</node>
-<node TEXT="Italic" ID="ID_1414436366" CREATED="1370194798822" MODIFIED="1370194798822">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ItalicAction"/>
-<attribute NAME="accelerator" VALUE="control I"/>
-</node>
-<node TEXT="Larger font" ID="ID_1548651326" CREATED="1370194798823" MODIFIED="1370194798823">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="IncreaseNodeFontAction"/>
-<attribute NAME="accelerator" VALUE="control PLUS"/>
-</node>
-<node TEXT="Smaller font" ID="ID_1969269056" CREATED="1370194798823" MODIFIED="1370194798823">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="DecreaseNodeFontAction"/>
-<attribute NAME="accelerator" VALUE="control MINUS"/>
-</node>
-<node TEXT="---" ID="ID_1673359742" CREATED="1370194798823" MODIFIED="1370194798823">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Node color..." ID="ID_769544494" CREATED="1370194798823" MODIFIED="1370194798823">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeColorAction"/>
-<attribute NAME="accelerator" VALUE="alt shift F"/>
-</node>
-<node TEXT="Blinking node" ID="ID_1600861868" CREATED="1370194798823" MODIFIED="1370194798823">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="BlinkingNodeHookAction"/>
-</node>
-<node TEXT="Blend color" ID="ID_965772571" CREATED="1370194798823" MODIFIED="1370194798823">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeColorBlendAction"/>
-</node>
-<node TEXT="---" ID="ID_846863399" CREATED="1370194798823" MODIFIED="1370194798823">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Node background color..." ID="ID_131182554" CREATED="1370194798828" MODIFIED="1370194798828">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeBackgroundColorAction"/>
-</node>
-<node TEXT="---" ID="ID_1353593389" CREATED="1370194798828" MODIFIED="1370194798828">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Fork" ID="ID_610003784" CREATED="1370194798829" MODIFIED="1370194798829">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeShapeAction.fork"/>
-</node>
-<node TEXT="Bubble" ID="ID_566669024" CREATED="1370194798829" MODIFIED="1370194798829">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeShapeAction.bubble"/>
-</node>
-<node TEXT="---" ID="ID_884495267" CREATED="1370194798829" MODIFIED="1370194798829">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Remove format" ID="ID_1704403630" CREATED="1370194798829" MODIFIED="1370194798829">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveFormatAction"/>
-</node>
-<node TEXT="Use plain text" ID="ID_1328005461" CREATED="1370194798829" MODIFIED="1370194798829">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UsePlainTextAction"/>
-<attribute NAME="accelerator" VALUE="alt shift P"/>
-</node>
-</node>
-<node TEXT="Cloud properties" FOLDED="true" ID="ID_1111702163" CREATED="1370194798829" MODIFIED="1370335177560">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="CloudProperties"/>
-<node TEXT="Shapes" FOLDED="true" ID="ID_834386191" CREATED="1370194798829" MODIFIED="1370335168864">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="shapes"/>
-<attribute NAME="name_ref" VALUE="format_menu_cloud_shapes"/>
-<node TEXT="Arc" ID="ID_1879026538" CREATED="1370194798829" MODIFIED="1370194798829">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="CloudShapeAction.ARC"/>
-</node>
-<node TEXT="Star" ID="ID_1450209381" CREATED="1370194798829" MODIFIED="1370194798829">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="CloudShapeAction.STAR"/>
-</node>
-<node TEXT="Rectangle" ID="ID_1377798202" CREATED="1370194798829" MODIFIED="1370194798829">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="CloudShapeAction.RECT"/>
-</node>
-<node TEXT="Round rectangle" ID="ID_231098218" CREATED="1370194798830" MODIFIED="1370194798830">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="CloudShapeAction.ROUND_RECT"/>
-</node>
-</node>
-<node TEXT="Cloud color..." ID="ID_524244545" CREATED="1370194798830" MODIFIED="1370194798830">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloudColorAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1656891956" CREATED="1370194798830" MODIFIED="1370194798830">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Edge properties" FOLDED="true" ID="ID_1691391318" CREATED="1370194798830" MODIFIED="1370335185695">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="EdgeProperties"/>
-<node TEXT="Styles" FOLDED="true" ID="ID_1025058933" CREATED="1370194798830" MODIFIED="1370194798830">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="styles"/>
-<attribute NAME="name_ref" VALUE="format_menu_edge_styles"/>
-<node TEXT="As parent" ID="ID_453842689" CREATED="1370194798830" MODIFIED="1370194798830">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAsParentAction"/>
-</node>
-<node TEXT="Linear" ID="ID_760998239" CREATED="1370194798830" MODIFIED="1370194798830">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.linear"/>
-</node>
-<node TEXT="Smoothly curved (bezier)" ID="ID_1966280734" CREATED="1370194798835" MODIFIED="1370194798835">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.bezier"/>
-</node>
-<node TEXT="Sharp linear" ID="ID_1675492093" CREATED="1370194798835" MODIFIED="1370194798835">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.sharp_linear"/>
-</node>
-<node TEXT="Sharply curved (bezier)" ID="ID_21906951" CREATED="1370194798836" MODIFIED="1370194798836">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.sharp_bezier"/>
-</node>
-<node TEXT="Horizontal" ID="ID_988590411" CREATED="1370194798836" MODIFIED="1370194798836">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.horizontal"/>
-</node>
-<node TEXT="Hide edge" ID="ID_1743099691" CREATED="1370194798836" MODIFIED="1370194798836">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.hide_edge"/>
-</node>
-</node>
-<node TEXT="Width" FOLDED="true" ID="ID_762696594" CREATED="1370194798836" MODIFIED="1370335196103">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="widths"/>
-<attribute NAME="name_ref" VALUE="format_menu_edge_widths"/>
-<node TEXT="Parent" ID="ID_1632874082" CREATED="1370194798837" MODIFIED="1370194798837">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_width_parent"/>
-</node>
-<node TEXT="Thin" ID="ID_105397654" CREATED="1370194798837" MODIFIED="1370194798837">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_width_thin"/>
-</node>
-<node TEXT="1" OBJECT="java.lang.Long|1" ID="ID_686807299" CREATED="1370194798837" MODIFIED="1370335252189">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_1"/>
-</node>
-<node TEXT="2" OBJECT="java.lang.Long|2" ID="ID_1378854466" CREATED="1370194798837" MODIFIED="1370335253514">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_2"/>
-</node>
-<node TEXT="4" OBJECT="java.lang.Long|4" ID="ID_1214308721" CREATED="1370194798845" MODIFIED="1370335254979">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_4"/>
-</node>
-<node TEXT="8" OBJECT="java.lang.Long|8" ID="ID_152696495" CREATED="1370194798845" MODIFIED="1370335257126">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_8"/>
-</node>
-</node>
-<node TEXT="Edge color..." ID="ID_977789508" CREATED="1370194798845" MODIFIED="1370194798845">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EdgeColorAction"/>
-<attribute NAME="accelerator" VALUE="alt shift E"/>
-</node>
-<node TEXT="Automatic edge color" ID="ID_83643005" CREATED="1370194798845" MODIFIED="1370194798845">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AutomaticEdgeColorHookAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1126623769" CREATED="1370194798845" MODIFIED="1370194798845">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Set node width limits" ID="ID_530668930" CREATED="1370194798846" MODIFIED="1370194798846">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeWidthAction"/>
-</node>
-</node>
-<node TEXT="Navigate" FOLDED="true" ID="ID_400942186" CREATED="1370194798846" MODIFIED="1370334681725">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="navigate"/>
-<attribute NAME="name_ref" VALUE="menu_navigate"/>
-<attribute NAME="menu_key" VALUE="menu_navigate"/>
-<node TEXT="navigate" FOLDED="true" ID="ID_1118542616" CREATED="1370194798846" MODIFIED="1370194798846">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="navigate"/>
-<node TEXT="Previous map" ID="ID_1130674595" CREATED="1370194798846" MODIFIED="1370194798846">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NavigationPreviousMapAction"/>
-<attribute NAME="accelerator" VALUE="control shift TAB"/>
-</node>
-<node TEXT="Next map" ID="ID_1422147659" CREATED="1370194798846" MODIFIED="1370194798846">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NavigationNextMapAction"/>
-<attribute NAME="accelerator" VALUE="control TAB"/>
-</node>
-<node TEXT="---" ID="ID_1150377789" CREATED="1370194798846" MODIFIED="1370194798846">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="folding" FOLDED="true" ID="ID_842290285" CREATED="1370194798846" MODIFIED="1370194798846">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="folding"/>
-<node TEXT="(Un)fold" ID="ID_1936410673" CREATED="1370194798846" MODIFIED="1370194798846">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleFoldedAction"/>
-<attribute NAME="accelerator" VALUE="SPACE"/>
-</node>
-<node TEXT="Show next child" ID="ID_1660299916" CREATED="1370194798847" MODIFIED="1370194798847">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowNextChildAction"/>
-<attribute NAME="accelerator" VALUE="shift SPACE"/>
-</node>
-<node TEXT="(Un)fold children" ID="ID_706164442" CREATED="1370194798847" MODIFIED="1370194798847">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleChildrenFoldedAction"/>
-<attribute NAME="accelerator" VALUE="control SPACE"/>
-</node>
-<node TEXT="Unfold one level" ID="ID_817918623" CREATED="1370194798847" MODIFIED="1370194798847">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UnfoldOneLevelAction"/>
-<attribute NAME="accelerator" VALUE="alt PAGE_DOWN"/>
-</node>
-<node TEXT="Fold one level" ID="ID_350814939" CREATED="1370194798847" MODIFIED="1370194798847">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FoldOneLevelAction"/>
-<attribute NAME="accelerator" VALUE="alt PAGE_UP"/>
-</node>
-<node TEXT="Unfold all" ID="ID_1639555610" CREATED="1370194798847" MODIFIED="1370194798847">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UnfoldAllAction"/>
-<attribute NAME="accelerator" VALUE="alt END"/>
-</node>
-<node TEXT="Fold all" ID="ID_382857723" CREATED="1370194798847" MODIFIED="1370194798847">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FoldAllAction"/>
-<attribute NAME="accelerator" VALUE="alt HOME"/>
-</node>
-</node>
-</node>
-<node TEXT="---" ID="ID_1287635307" CREATED="1370194798847" MODIFIED="1370194798847">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Select all visible nodes" ID="ID_502719313" CREATED="1370194798847" MODIFIED="1370194798847">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SelectAllAction"/>
-<attribute NAME="accelerator" VALUE="control A"/>
-</node>
-<node TEXT="Select visible branch" ID="ID_697134886" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SelectBranchAction"/>
-<attribute NAME="accelerator" VALUE="control shift A"/>
-</node>
-<node TEXT="---" ID="ID_300938106" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Goto root" ID="ID_1147280816" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MoveToRootAction"/>
-<attribute NAME="accelerator" VALUE="ESCAPE"/>
-</node>
-<node TEXT="Goto node with ID..." ID="ID_1043132007" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="GotoNodeAction"/>
-</node>
-<node TEXT="Goto previous node" ID="ID_543681743" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextNodeAction.BACK"/>
-<attribute NAME="accelerator" VALUE="control alt LEFT"/>
-</node>
-<node TEXT="Goto next node" ID="ID_235562851" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextNodeAction.FORWARD"/>
-<attribute NAME="accelerator" VALUE="control alt RIGHT"/>
-</node>
-<node TEXT="Goto previous node (fold)" ID="ID_1575528067" CREATED="1370194798856" MODIFIED="1370194798856">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextNodeAction.BACK_N_FOLD"/>
-<attribute NAME="accelerator" VALUE="control shift LEFT"/>
-</node>
-<node TEXT="Goto next node (fold)" ID="ID_1170003934" CREATED="1370194798856" MODIFIED="1370194798856">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextNodeAction.FORWARD_N_FOLD"/>
-<attribute NAME="accelerator" VALUE="control shift RIGHT"/>
-</node>
-<node TEXT="Unfold next presentation item" ID="ID_1396867085" CREATED="1370194798856" MODIFIED="1370194798856">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextPresentationItemAction"/>
-<attribute NAME="accelerator" VALUE="control shift SPACE"/>
-</node>
-<node TEXT="Go backward" ID="ID_6096980" CREATED="1370194798856" MODIFIED="1370194798856">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="BackAction"/>
-<attribute NAME="accelerator" VALUE="alt LEFT"/>
-</node>
-<node TEXT="Go forward" ID="ID_291270163" CREATED="1370194798856" MODIFIED="1370194798856">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ForwardAction"/>
-<attribute NAME="accelerator" VALUE="alt RIGHT"/>
-</node>
-<node TEXT="links" ID="ID_1106555890" CREATED="1370194798856" MODIFIED="1370194798856">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="links"/>
-<node TEXT="---" ID="ID_1244155586" CREATED="1370194798857" MODIFIED="1370194798857">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Follow link" ID="ID_490792303" CREATED="1370194798857" MODIFIED="1370194798857">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FollowLinkAction"/>
-<attribute NAME="accelerator" VALUE="control ENTER"/>
-</node>
-<node TEXT="goto links" ID="ID_790442896" CREATED="1370194798861" MODIFIED="1370335408485">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="menu_goto_links"/>
-</node>
-</node>
-</node>
-<node TEXT="Filter" FOLDED="true" ID="ID_1709313215" CREATED="1370194798862" MODIFIED="1370194798862">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="filter"/>
-<attribute NAME="name_ref" VALUE="menu_filter"/>
-<node TEXT="Filter" ID="ID_951564241" CREATED="1370194798862" MODIFIED="1370194798862">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Filter"/>
-<node TEXT="User-defined filters" ID="ID_750739663" CREATED="1370194798862" MODIFIED="1370194798862">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="user_defined_filters"/>
-<attribute NAME="name_ref" VALUE="user_defined_filters"/>
-<attribute NAME="menu_key" VALUE="menu_user_defined_filters"/>
-</node>
-<node TEXT="DoFilter" FOLDED="true" ID="ID_1233594504" CREATED="1370194798868" MODIFIED="1370194798868">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="DoFilter"/>
-<node TEXT="Undo filter" ID="ID_1060614745" CREATED="1370194798869" MODIFIED="1370344398562">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UndoFilterAction"/>
-</node>
-<node TEXT="Redo filter" ID="ID_647411361" CREATED="1370194798869" MODIFIED="1370344401929">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RedoFilterAction"/>
-</node>
-<node TEXT="Reapply filter" ID="ID_1390558533" CREATED="1370194798870" MODIFIED="1370344404457">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ReapplyFilterAction"/>
-</node>
-<node TEXT="---" ID="ID_1385398789" CREATED="1370194798870" MODIFIED="1370194798870">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Quick filter" ID="ID_1967496761" CREATED="1370194798870" MODIFIED="1370194798870">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFilterAction"/>
-</node>
-<node TEXT="Filter selected nodes" ID="ID_630413645" CREATED="1370194798870" MODIFIED="1370194798870">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplySelectedViewConditionAction"/>
-</node>
-<node TEXT="Select all matching nodes" ID="ID_1321944413" CREATED="1370194798870" MODIFIED="1370194798870">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAllAction"/>
-</node>
-<node TEXT="No filtering" ID="ID_851198975" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplyNoFilteringAction"/>
-</node>
-<node TEXT="Compose filter" ID="ID_1388523208" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditFilterAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_242790978" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="FilterCondition" FOLDED="true" ID="ID_947710900" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="FilterCondition"/>
-<node TEXT="Applies to filtered nodes" ID="ID_969015686" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplyToVisibleAction"/>
-</node>
-<node TEXT="Show ancestors" ID="ID_1702252453" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowAncestorsAction"/>
-</node>
-<node TEXT="Show descendants" ID="ID_1364556615" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowDescendantsAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_751464878" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Find" ID="ID_784014675" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Find"/>
-<node TEXT="Find previous" ID="ID_1368935799" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-<node TEXT="Find next" ID="ID_1001632153" CREATED="1370194798882" MODIFIED="1370194798882">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Extras" FOLDED="true" ID="ID_1843603736" CREATED="1370194798883" MODIFIED="1370334683989">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="extras"/>
-<attribute NAME="name_ref" VALUE="menu_extras"/>
-<node TEXT="time" FOLDED="true" ID="ID_538370288" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="time"/>
-<attribute NAME="name_ref" VALUE="menu_time"/>
-<node TEXT="Manage time..." ID="ID_1370300121" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="TimeManagementAction"/>
-<attribute NAME="accelerator" VALUE="control T"/>
-</node>
-<node TEXT="Manage tasks ..." ID="ID_605635543" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="TimeListAction"/>
-</node>
-<node TEXT="Remove reminder" ID="ID_675422744" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ReminderHookAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1606403616" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="encryption" FOLDED="true" ID="ID_914800542" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="encryption"/>
-<attribute NAME="name_ref" VALUE="menu_encryption"/>
-<node TEXT="Enter password" ID="ID_1147903482" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EnterPassword"/>
-</node>
-<node TEXT="Remove password" ID="ID_542006664" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveEncryption"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_49728777" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="first" FOLDED="true" ID="ID_87077110" CREATED="1370194798894" MODIFIED="1370194798894">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="first"/>
-<node TEXT="options" FOLDED="true" ID="ID_1076760803" CREATED="1370194798895" MODIFIED="1370194798895">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="options"/>
-<node TEXT="Add-ons" ID="ID_1083541033" CREATED="1370194798895" MODIFIED="1370194798895">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ManageAddOnsAction"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.script"/>
-</node>
-<node TEXT="Assign hot key..." ID="ID_1428658806" CREATED="1370194798895" MODIFIED="1370194798895">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetAcceleratorOnNextClickAction"/>
-</node>
-<node TEXT="Hot key presets" FOLDED="true" ID="ID_464605071" CREATED="1370194798895" MODIFIED="1370194798895">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="acceleratorPresets"/>
-<attribute NAME="name_ref" VALUE="acceleratorPresets"/>
-<node TEXT="Load" ID="ID_698086099" CREATED="1370194798895" MODIFIED="1370194798895">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="load_accelerator_presets"/>
-<attribute NAME="menu_key" VALUE="main_menu_new_load_accelerator_presets"/>
-</node>
-<node TEXT="Save hot key set..." ID="ID_1931077663" CREATED="1370194798895" MODIFIED="1370194798895">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SaveAcceleratorPresetsAction"/>
-</node>
-</node>
-</node>
-<node TEXT="---" ID="ID_1758063531" CREATED="1370194798895" MODIFIED="1370194798895">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="scripting" ID="ID_403848834" CREATED="1370194798903" MODIFIED="1370194798903">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="scripting"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.script"/>
-<attribute NAME="menu_key" VALUE="main_menu_scripting"/>
-</node>
-<node TEXT="Execute selected node scripts" ID="ID_1948545653" CREATED="1370194798904" MODIFIED="1370194798904">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExecuteScriptForSelectionAction"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.script"/>
-</node>
-<node TEXT="Execute all scripts" ID="ID_1798993664" CREATED="1370194798904" MODIFIED="1370194798904">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExecuteScriptForAllNodes"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.script"/>
-</node>
-<node TEXT="Edit script..." ID="ID_589433052" CREATED="1370194798904" MODIFIED="1370194798904">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ScriptEditor"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.script"/>
-</node>
-<node TEXT="---" ID="ID_204656974" CREATED="1370194798904" MODIFIED="1370194798904">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Formula" FOLDED="true" ID="ID_210823348" CREATED="1370194798904" MODIFIED="1370335693682">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="formula"/>
-<attribute NAME="name_ref" VALUE="formula.menuname"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.formula"/>
-<node TEXT="Evaluate all" ID="ID_725452261" CREATED="1370194798904" MODIFIED="1370194798904">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="formula.EvaluateAllAction"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.formula"/>
-</node>
-<node TEXT="---" ID="ID_1774493535" CREATED="1370194798904" MODIFIED="1370194798904">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_417864337" CREATED="1370194798904" MODIFIED="1370194798904">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Open user directory" ID="ID_1479109245" CREATED="1370194798904" MODIFIED="1370194798904">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenUserDirAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1580920327" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Preferences ..." ID="ID_986394123" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PropertyAction"/>
-<attribute NAME="accelerator" VALUE="control COMMA"/>
-<attribute NAME="menu_key" VALUE="MB_PropertyAction"/>
-</node>
-</node>
-<node TEXT="Maps" FOLDED="true" ID="ID_1802477374" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="name_ref" VALUE="mindmaps"/>
-<node TEXT="Modes" ID="ID_1426335696" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="modes"/>
-<attribute NAME="menu_key" VALUE="main_menu_modes"/>
-</node>
-<node TEXT="navigate" ID="ID_811289470" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="navigate"/>
-<attribute NAME="menu_key" VALUE="main_menu_navigate_maps"/>
-</node>
-<node TEXT="---" ID="ID_1686426603" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Maps" ID="ID_1593219515" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="menu_key" VALUE="main_menu_mindmaps"/>
-</node>
-<node TEXT="---" ID="ID_314119416" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-</node>
-<node TEXT="Help" FOLDED="true" ID="ID_471141721" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="help"/>
-<attribute NAME="name_ref" VALUE="help"/>
-<node TEXT="update" FOLDED="true" ID="ID_722782407" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="update"/>
-<node TEXT="Check for updates" ID="ID_1477489495" CREATED="1370194798905" MODIFIED="1370194798905">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UpdateCheckAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1292710565" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Web resources" FOLDED="true" ID="ID_652775564" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Web resources"/>
-<node TEXT="Freeplane's Homepage" ID="ID_369316306" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenFreeplaneSiteAction"/>
-</node>
-<node TEXT="Ask for help" ID="ID_868967885" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AskForHelp"/>
-</node>
-<node TEXT="Report a bug" ID="ID_418449274" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ReportBugAction"/>
-</node>
-<node TEXT="Request a feature" ID="ID_850613199" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RequestFeatureAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_175779890" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="legacy" FOLDED="true" ID="ID_667870728" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="legacy"/>
-<node TEXT="About" ID="ID_1556433421" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AboutAction"/>
-<attribute NAME="menu_key" VALUE="MB_AboutAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1384662215" CREATED="1370194798914" MODIFIED="1370194798914">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Tutorial" ID="ID_1441537677" CREATED="1370194798914" MODIFIED="1370194798914">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="GettingStartedAction"/>
-<attribute NAME="accelerator" VALUE="F1"/>
-</node>
-<node TEXT="Documentation" ID="ID_1046484195" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="DocumentationAction"/>
-</node>
-<node TEXT="Documentation Maps Online" ID="ID_1808535585" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OnlineReference"/>
-</node>
-<node TEXT="Key reference" ID="ID_304156316" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="HotKeyInfoAction"/>
-</node>
-<node TEXT="---" ID="ID_1669047436" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-</node>
-</node>
-<node TEXT="map_popup" FOLDED="true" POSITION="right" ID="ID_1654114725" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="map_popup"/>
-<node TEXT="Maps" ID="ID_1405453807" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="menu_key" VALUE="popup_menu_mindmaps"/>
-</node>
-<node TEXT="---" ID="ID_1475998756" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Full screen mode" ID="ID_578287914" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleFullScreenAction"/>
-</node>
-<node TEXT="Menubar" ID="ID_1384686201" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MP_ToggleMenubarAction"/>
-</node>
-<node TEXT="Toolbar" ID="ID_1888013842" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="Filter toolbar" ID="ID_1317991825" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFilterToolbarAction"/>
-</node>
-<node TEXT="F-keys Bar" ID="ID_527118617" CREATED="1370194798918" MODIFIED="1370335740913">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleFBarAction"/>
-</node>
-<node TEXT="Icons toolbar" ID="ID_144251549" CREATED="1370194798918" MODIFIED="1370194798918">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleLeftToolbarAction"/>
-</node>
-<node TEXT="Display status line" ID="ID_1199576247" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleStatusAction"/>
-</node>
-<node TEXT="Scrollbars" ID="ID_601963475" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleScrollbarsAction"/>
-</node>
-<node TEXT="---" ID="ID_1597107668" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Properties panel" ID="ID_1646536129" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFormatPanel"/>
-</node>
-<node TEXT="Display note panel" ID="ID_254417168" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowHideNoteAction"/>
-<attribute NAME="accelerator" VALUE="control GREATER"/>
-</node>
-<node TEXT="---" ID="ID_899379662" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Map background color" ID="ID_1982484281" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MapBackgroundColorAction"/>
-</node>
-<node TEXT="---" ID="ID_1222660568" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Outline view" ID="ID_349914674" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Zoom to fit to page" ID="ID_1060546943" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FitToPage"/>
-</node>
-<node TEXT="Center selected node" ID="ID_223012438" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-</node>
-<node TEXT="Goto root" ID="ID_698685529" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MoveToRootAction"/>
-<attribute NAME="accelerator" VALUE="ESCAPE"/>
-</node>
-<node TEXT="Goto node with ID..." ID="ID_250613370" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="GotoNodeAction"/>
-</node>
-</node>
-<node TEXT="node_popup" FOLDED="true" POSITION="right" ID="ID_1281865345" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="node_popup"/>
-<node TEXT="Edit node core in dialog" ID="ID_1485228711" CREATED="1370194798920" MODIFIED="1370194798920">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditLongAction"/>
-<attribute NAME="accelerator" VALUE="alt ENTER"/>
-</node>
-<node TEXT="Edit node details in dialog" ID="ID_1746465857" CREATED="1370194798920" MODIFIED="1370194798920">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditDetailsInDialogAction"/>
-</node>
-<node TEXT="Edit node details in-line" ID="ID_1274185383" CREATED="1370194798925" MODIFIED="1370194798925">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditDetailsAction"/>
-</node>
-<node TEXT="Remove node details" ID="ID_193980725" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="DeleteDetailsAction"/>
-</node>
-<node TEXT="Minimize node" ID="ID_1929653572" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetShortenerStateAction"/>
-</node>
-<node TEXT="Edit note in dialog" ID="ID_951346222" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditNoteInDialogAction"/>
-</node>
-<node TEXT="Add image..." ID="ID_1332445025" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExternalImageAddAction"/>
-</node>
-<node TEXT="Edit attribute in-line" ID="ID_1465258517" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditAttributesAction"/>
-<attribute NAME="accelerator" VALUE="alt F9"/>
-</node>
-<node TEXT="---" ID="ID_1132518583" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="New summary node (selected nodes)" ID="ID_1667132492" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewSummaryAction"/>
-<attribute NAME="accelerator" VALUE="alt shift INSERT"/>
-</node>
-<node TEXT="Summary node (set/reset)" ID="ID_766891920" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SummaryNodeAction"/>
-<attribute NAME="accelerator" VALUE="alt shift S"/>
-</node>
-<node TEXT="Always unfolded node (set/reset)" ID="ID_1471764005" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AlwaysUnfoldedNodeAction"/>
-</node>
-<node TEXT="Free positioned node (set/reset)" ID="ID_827139464" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FreeNodeAction"/>
-</node>
-<node TEXT="Add / remove cloud (default)" ID="ID_1664232726" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloudAction"/>
-<attribute NAME="accelerator" VALUE="control shift B"/>
-</node>
-<node TEXT="Apply style" ID="ID_1332345084" CREATED="1370194798926" MODIFIED="1370194798926">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_applyStyle"/>
-<attribute NAME="name_ref" VALUE="menu_applyStyle"/>
-<attribute NAME="menu_key" VALUE="node_popup_styles"/>
-</node>
-<node TEXT="Connect" ID="ID_851417224" CREATED="1370194798927" MODIFIED="1370194798927">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AddConnectorAction"/>
-<attribute NAME="accelerator" VALUE="control L"/>
-</node>
-<node TEXT="Links" FOLDED="true" ID="ID_1827136568" CREATED="1370194798927" MODIFIED="1370335770860">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="links"/>
-<attribute NAME="name_ref" VALUE="menu_links"/>
-<attribute NAME="menu_key" VALUE="popup_navigate"/>
-<node TEXT="Add hyperlink (choose)..." ID="ID_1328956547" CREATED="1370194798927" MODIFIED="1370194798927">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetLinkByFileChooserAction"/>
-<attribute NAME="accelerator" VALUE="control shift K"/>
-</node>
-<node TEXT="Add or modify hyperlink (type)..." ID="ID_72330031" CREATED="1370194798927" MODIFIED="1370194798927">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetLinkByTextFieldAction"/>
-<attribute NAME="accelerator" VALUE="control K"/>
-</node>
-<node TEXT="Convert link from within text" ID="ID_523595497" CREATED="1370194798927" MODIFIED="1370194798927">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ExtractLinkFromTextAction"/>
-</node>
-<node TEXT="---" ID="ID_133814677" CREATED="1370194798927" MODIFIED="1370194798927">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Add local hyperlink" ID="ID_358598645" CREATED="1370194798927" MODIFIED="1370194798927">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AddLocalLinkAction"/>
-<attribute NAME="accelerator" VALUE="alt shift L"/>
-</node>
-<node TEXT="Add hyperlink to menu item..." ID="ID_1750636716" CREATED="1370194798927" MODIFIED="1370194798927">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AddMenuItemLinkAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-<node TEXT="---" ID="ID_1932798993" CREATED="1370194798927" MODIFIED="1370194798927">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Set link anchor" ID="ID_409197156" CREATED="1370194798927" MODIFIED="1370194798927">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetLinkAnchorAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-<node TEXT="Make link from anchor" ID="ID_105002896" CREATED="1370194798928" MODIFIED="1370194798928">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MakeLinkFromAnchorAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-<node TEXT="Make link to anchor" ID="ID_166361381" CREATED="1370194798928" MODIFIED="1370194798928">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MakeLinkToAnchorAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-<node TEXT="Clear link anchor" ID="ID_1021914424" CREATED="1370194798928" MODIFIED="1370194798928">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ClearLinkAnchorAction"/>
-<attribute NAME="accelerator" VALUE=""/>
-</node>
-<node TEXT="goto links" ID="ID_182715509" CREATED="1370194798928" MODIFIED="1370335805936">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="popup_goto_links"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_760988947" CREATED="1370194798928" MODIFIED="1370194798928">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Enter password" ID="ID_1920623716" CREATED="1370194798928" MODIFIED="1370194798928">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EnterPassword"/>
-</node>
-<node TEXT="scripting" ID="ID_703212235" CREATED="1370194798928" MODIFIED="1370194798928">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="scripting"/>
-<attribute NAME="plugin" VALUE="org.freeplane.plugin.script"/>
-<attribute NAME="menu_key" VALUE="node_popup_scripting"/>
-</node>
-<node TEXT="---" ID="ID_1846395794" CREATED="1370194798928" MODIFIED="1370194798928">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Cut" ID="ID_207687297" CREATED="1370194798933" MODIFIED="1370194798933">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CutAction"/>
-<attribute NAME="accelerator" VALUE="control X"/>
-</node>
-<node TEXT="Copy" ID="ID_1488306063" CREATED="1370194798933" MODIFIED="1370194798933">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyAction"/>
-<attribute NAME="accelerator" VALUE="control C"/>
-</node>
-<node TEXT="Copy node (single)" ID="ID_1131152129" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopySingleAction"/>
-<attribute NAME="accelerator" VALUE="control shift C"/>
-</node>
-<node TEXT="Copy node ID" ID="ID_1058995828" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyIDAction"/>
-</node>
-<node TEXT="Copy node URI" ID="ID_1833296099" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyNodeURIAction"/>
-</node>
-<node TEXT="Paste" ID="ID_1289482635" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PasteAction"/>
-<attribute NAME="accelerator" VALUE="control V"/>
-</node>
-<node TEXT="Sort children" ID="ID_58570021" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SortNodes"/>
-</node>
-<node TEXT="Undo" ID="ID_355735578" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UndoAction"/>
-</node>
-<node TEXT="Redo" ID="ID_827556437" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RedoAction"/>
-</node>
-</node>
-<node TEXT="main_toolbar" FOLDED="true" POSITION="right" ID="ID_900199235" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="main_toolbar"/>
-<node TEXT="---" ID="ID_1334331601" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="history" FOLDED="true" ID="ID_561773939" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="history"/>
-<node TEXT="Go backward" ID="ID_74127203" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="BackAction"/>
-</node>
-<node TEXT="Go forward" ID="ID_1216477531" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ForwardAction"/>
-</node>
-</node>
-<node TEXT="update" ID="ID_1100014383" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="update"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_update"/>
-</node>
-<node TEXT="main" FOLDED="true" ID="ID_1903421620" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="main"/>
-<node TEXT="Previous map" ID="ID_1247564365" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NavigationPreviousMapAction"/>
-</node>
-<node TEXT="Next map" ID="ID_1021884606" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NavigationNextMapAction"/>
-</node>
-</node>
-<node TEXT="zoom" ID="ID_1772632875" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="zoom"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_zoom"/>
-</node>
-<node TEXT="open" FOLDED="true" ID="ID_1297580046" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="open"/>
-<node TEXT="Open saved map..." ID="ID_1136353202" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenAction"/>
-</node>
-<node TEXT="New map" ID="ID_1943108283" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewMapAction"/>
-</node>
-<node TEXT="Save map" ID="ID_107612010" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SaveAction"/>
-</node>
-<node TEXT="Save map as..." ID="ID_722737773" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SaveAsAction"/>
-</node>
-<node TEXT="Print map..." ID="ID_58065896" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintAction"/>
-</node>
-<node TEXT="Close current map" ID="ID_783074872" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloseAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1489814162" CREATED="1370194798936" MODIFIED="1370194798936">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="undo" FOLDED="true" ID="ID_1062589150" CREATED="1370194798936" MODIFIED="1370194798936">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="undo"/>
-<node TEXT="Undo" ID="ID_343705893" CREATED="1370194798936" MODIFIED="1370194798936">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UndoAction"/>
-</node>
-<node TEXT="Redo" ID="ID_1375080567" CREATED="1370194798936" MODIFIED="1370194798936">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RedoAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_994470262" CREATED="1370194798941" MODIFIED="1370194798941">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Font" FOLDED="true" ID="ID_1756351063" CREATED="1370194798941" MODIFIED="1370194798941">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="font"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_font"/>
-<node TEXT="toolbar_styles" ID="ID_1752346910" CREATED="1370194798942" MODIFIED="1370194798942">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbar_styles"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_style"/>
-</node>
-<node TEXT="toolbar_fonts" ID="ID_1000724636" CREATED="1370194798942" MODIFIED="1370194798942">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbar_fonts"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_font_name"/>
-</node>
-<node TEXT="toolbar_fonts" ID="ID_701977165" CREATED="1370194798942" MODIFIED="1370194798942">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbar_fonts"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_font_size"/>
-</node>
-<node TEXT="Bold" ID="ID_317014057" CREATED="1370194798942" MODIFIED="1370194798942">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="BoldAction"/>
-</node>
-<node TEXT="Italic" ID="ID_1605545726" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ItalicAction"/>
-</node>
-</node>
-<node TEXT="---" ID="ID_1378666411" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Add / remove cloud (default)" ID="ID_1763924306" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloudAction"/>
-</node>
-<node TEXT="Cloud color..." ID="ID_1395559934" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloudColorAction"/>
-</node>
-<node TEXT="---" ID="ID_324083546" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="folding" FOLDED="true" ID="ID_67493551" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="folding"/>
-<node TEXT="Unfold one level" ID="ID_1227777430" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UnfoldOneLevelAction"/>
-</node>
-<node TEXT="Fold one level" ID="ID_1181360534" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FoldOneLevelAction"/>
-</node>
-<node TEXT="Unfold all" ID="ID_1631347354" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UnfoldAllAction"/>
-</node>
-<node TEXT="Fold all" ID="ID_1172630625" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FoldAllAction"/>
-</node>
-</node>
-<node TEXT="find" ID="ID_1981407568" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="find"/>
-<node TEXT="Find..." ID="ID_496291044" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FindAction"/>
-</node>
-<node TEXT="Find next" ID="ID_244700007" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-<node TEXT="Find previous" ID="ID_1464814215" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-<node TEXT="Find and replace..." ID="ID_497245284" CREATED="1370194798944" MODIFIED="1370194798944">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeListAction"/>
-</node>
-</node>
-<node TEXT="Enter password" ID="ID_971496927" CREATED="1370194798944" MODIFIED="1370194798944">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EnterPassword"/>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane/resources/xml/mindmapmoderibbon.out.xml b/freeplane/resources/xml/mindmapmoderibbon.out.xml
deleted file mode 100644
index 476f950..0000000
--- a/freeplane/resources/xml/mindmapmoderibbon.out.xml
+++ /dev/null
@@ -1,509 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!--
-This file was generated automatically from a ribbon xml.
-Do not edit this file, edit the original ribbon xml instead.
---><FreeplaneUIEntries>
-<Entry builder="menu_structure">
-<Entry name="ribbon" builder="menu_category">
-<Entry builder="ribbon_taskbar">
-<Entry name="NewMapAction" accelerator="control N" mandatory="true"/>
-<Entry name="EncryptedMap" mandatory="true"/>
-<Entry builder="separator"/>
-<Entry name="OpenAction" accelerator="control O" mandatory="true"/>
-<Entry builder="separator"/>
-<Entry name="SaveAction" accelerator="control S"/>
-<Entry name="SaveAsAction" accelerator="control shift S"/>
-<Entry name="SaveAll"/>
-</Entry>
-<Entry builder="ribbon_menu">
-<Entry name="new" builder="primary_entry">
-<Entry name="new" builder="entry_group">
-<Entry name="NewMapAction" accelerator="control N" mandatory="true"/>
-<Entry name="new_map_from_user_templates" mandatory="true"/>
-<Entry name="EncryptedMap" mandatory="true"/>
-</Entry>
-</Entry>
-<Entry name="open" builder="primary_entry">
-<Entry name="open" builder="entry_group">
-<Entry name="OpenAction" accelerator="control O" mandatory="true"/>
-<Entry name="OpenURLMapAction" mandatory="true"/>
-<Entry name="RevertAction" mandatory="true"/>
-</Entry>
-</Entry>
-<Entry name="lastOpenedMaps" builder="ribbon_contributor"/>
-<Entry name="save" builder="primary_entry">
-<Entry name="save" builder="entry_group">
-<Entry name="SaveAction" accelerator="control S"/>
-<Entry name="SaveAsAction" accelerator="control shift S"/>
-<Entry name="SaveAll"/>
-</Entry>
-</Entry>
-<Entry name="import_export" builder="primary_entry">
-<Entry name="export" builder="entry_group">
-<Entry name="ExportAction"/>
-<Entry name="ExportBranchAction" accelerator="alt shift A"/>
-</Entry>
-<Entry name="import" builder="entry_group">
-<Entry name="ImportBranchAction"/>
-<Entry name="ImportLinkedBranchAction"/>
-<Entry name="ImportLinkedBranchWithoutRootAction"/>
-<Entry name="ImportExplorerFavoritesAction"/>
-<Entry name="ImportFolderStructureAction"/>
-<Entry name="ImportMindmanagerFiles"/>
-</Entry>
-</Entry>
-<Entry name="print" builder="primary_entry">
-<Entry name="print" builder="entry_group">
-<Entry name="PageAction"/>
-<Entry name="PrintPreviewAction"/>
-<Entry name="PrintAction" accelerator="control P"/>
-</Entry>
-</Entry>
-<Entry name="OpenUserDirAction" mandatory="true" builder="primary_entry"/>
-<Entry name="PropertyAction" mandatory="true" builder="primary_entry"/>
-<Entry name="AboutAction" mandatory="true" builder="primary_entry"/>
-<Entry name="help" builder="primary_entry">
-<Entry name="help" builder="entry_group">
-<Entry name="OpenFreeplaneSiteAction" mandatory="true"/>
-<Entry name="GettingStartedAction" accelerator="F1" mandatory="true"/>
-<Entry name="AskForHelp" mandatory="true"/>
-<Entry name="RequestFeatureAction" mandatory="true"/>
-<Entry name="ReportBugAction" mandatory="true"/>
-<Entry name="HotKeyInfoAction" mandatory="true"/>
-</Entry>
-</Entry>
-<Entry name="CloseAction" accelerator="control W" mandatory="true" builder="footer_entry"/>
-<Entry name="QuitAction" mandatory="true" accelerator="alt F4" builder="footer_entry"/>
-</Entry>
-<Entry name="home" orderPriority="first" builder="ribbon_task,toolbar">
-<Entry name="basics" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="NewMapAction" accelerator="control N" mandatory="true">
-<Entry name="EncryptedMap" mandatory="true"/>
-</Entry>
-<Entry name="OpenAction" accelerator="control O" mandatory="true">
-<Entry name="OpenURLMapAction" mandatory="true"/>
-<Entry name="RevertAction" mandatory="true"/>
-</Entry>
-<Entry name="SaveAction" accelerator="control S">
-<Entry name="SaveAsAction" accelerator="control shift S"/>
-<Entry name="SaveAll"/>
-</Entry>
-<Entry name="CloseAction" accelerator="control W"/>
-<Entry name="CutAction" accelerator="control X" priority="medium"/>
-<Entry name="CopyAction" accelerator="control C" priority="medium">
-<Entry name="CopySingleAction" accelerator="control shift C"/>
-<Entry name="CopyIDAction"/>
-<Entry name="CopyNodeURIAction"/>
-</Entry>
-<Entry name="PasteAction" accelerator="control V" priority="medium">
-<Entry name="SelectedPasteAction"/>
-<Entry name="MoveAction"/>
-<Entry name="CloneAction"/>
-</Entry>
-<Entry name="UndoAction" accelerator="control Z" priority="medium">
-<Entry name="RedoAction" accelerator="control Y"/>
-</Entry>
-</Entry>
-<Entry name="nodes" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="ToggleFoldedAction" accelerator="SPACE" priority="top">
-<Entry name="ToggleChildrenFoldedAction" accelerator="control SPACE"/>
-<Entry name="UnfoldAllAction" accelerator="alt END"/>
-<Entry name="FoldAllAction" accelerator="alt HOME"/>
-</Entry>
-<Entry name="NewChildAction" accelerator="INSERT" priority="top"/>
-<Entry name="NewSiblingAction" accelerator="ENTER">
-<Entry name="NewPreviousSiblingAction" accelerator="shift ENTER"/>
-</Entry>
-<Entry name="EditAction" priority="Medium">
-<Entry name="EditLongAction" priority="Top" accelerator="alt ENTER"/>
-</Entry>
-<Entry name="BackAction" accelerator="alt LEFT" priority="Medium"/>
-<Entry name="ForwardAction" accelerator="alt RIGHT" priority="Medium"/>
-</Entry>
-<Entry name="fontStyleContributor" builder="ribbon_contributor"/>
-<Entry name="resources" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="ExternalImageAddAction" accelerator="alt shift K" priority="Top">
-<Entry name="ExternalImageChangeAction"/>
-<Entry name="ExternalImageRemoveAction"/>
-</Entry>
-<Entry name="LatexEditLatexAction" plugin="org.freeplane.plugin.latex">
-<Entry name="LatexDeleteLatexAction" plugin="org.freeplane.plugin.latex"/>
-</Entry>
-<Entry name="EditAttributesAction" accelerator="alt F9" priority="medium">
-<Entry name="attributes_AddAttributeAction"/>
-<Entry name="AssignAttributesAction"/>
-<Entry name="CopyAttributes"/>
-<Entry name="PasteAttributes"/>
-<Entry name="attributes_RemoveAllAttributesAction"/>
-<Entry name="attributes_RemoveFirstAttributeAction"/>
-<Entry name="attributes_RemoveLastAttributeAction"/>
-<Entry name="ShowSelectedAttributesAction"/>
-<Entry name="ShowAllAttributesAction"/>
-<Entry name="HideAllAttributesAction"/>
-<Entry name="SetBooleanMapPropertyAction.show_icon_for_attributes"/>
-<Entry name="ShowAttributeDialogAction"/>
-</Entry>
-<Entry name="AddConnectorAction">
-<Entry name="AddLocalLinkAction" accelerator="alt shift L"/>
-<Entry name="SetLinkByFileChooserAction"/>
-<Entry name="SetLinkByTextFieldAction"/>
-<Entry name="ExtractLinkFromTextAction"/>
-</Entry>
-<Entry name="IconSelectionPlugin">
-<Entry name="RemoveAllIconsAction"/>
-<Entry name="RemoveIcon_0_Action"/>
-<Entry name="RemoveIconAction"/>
-</Entry>
-<Entry name="CloudAction"/>
-<Entry name="CloudColorAction"/>
-<Entry name="EditNoteInDialogAction">
-<Entry name="RemoveNoteAction"/>
-</Entry>
-</Entry>
-</Entry>
-<Entry name="nodes" orderPriority="0" builder="ribbon_task">
-<Entry name="add_node" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="NewChildAction" accelerator="INSERT" priority="top"/>
-<Entry name="NewSiblingAction" accelerator="ENTER" priority="top">
-<Entry name="NewPreviousSiblingAction" accelerator="shift ENTER"/>
-</Entry>
-<Entry name="NewSummaryAction">
-<Entry name="FirstGroupNodeAction" accelerator="alt shift B" priority="medium"/>
-<Entry name="SummaryNodeAction" accelerator="alt shift S"/>
-</Entry>
-<Entry name="NewFreeNodeAction"/>
-<Entry name="NewParentNode" accelerator="shift INSERT"/>
-</Entry>
-<Entry name="edit_node" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="EditAction" priority="Top"/>
-<Entry name="EditLongAction" priority="Top" accelerator="alt ENTER"/>
-<Entry name="DeleteAction" accelerator="DELETE" priority="medium"/>
-<Entry name="NodeUpAction" accelerator="control UP"/>
-<Entry name="NodeDownAction" accelerator="control DOWN"/>
-<Entry name="ChangeNodeLevelLeftsAction" accelerator="control LEFT"/>
-<Entry name="ChangeNodeLevelRightsAction" accelerator="control RIGHT"/>
-</Entry>
-<Entry name="node_details" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="EditDetailsAction" priority="medium"/>
-<Entry name="EditDetailsInDialogAction"/>
-<Entry name="DeleteDetailsAction"/>
-<Entry name="ToggleDetailsAction" accelerator="alt F2"/>
-</Entry>
-<Entry name="node_settings" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="JoinNodesAction" accelerator="control J" priority="medium"/>
-<Entry name="SplitNode"/>
-<Entry name="AlwaysUnfoldedNodeAction"/>
-<Entry name="ResetNodeLocationAction"/>
-<Entry name="SetShortenerStateAction"/>
-<Entry name="FreeNodeAction"/>
-</Entry>
-<Entry name="general_settings" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="RevisionPluginAction"/>
-<Entry name="SetBooleanPropertyAction.edit_on_double_click"/>
-</Entry>
-<Entry name="sort" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="SortNodes"/>
-</Entry>
-</Entry>
-<Entry name="resources" orderPriority="4000" builder="ribbon_task">
-<Entry name="images" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="ExternalImageAddAction" accelerator="alt shift K"/>
-<Entry name="ExternalImageChangeAction"/>
-<Entry name="ExternalImageRemoveAction"/>
-</Entry>
-<Entry name="formula_latex" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="LatexEditLatexAction" plugin="org.freeplane.plugin.latex"/>
-<Entry name="LatexDeleteLatexAction" plugin="org.freeplane.plugin.latex"/>
-</Entry>
-<Entry name="attributes" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="EditAttributesAction" accelerator="alt F9" priority="medium">
-<Entry name="attributes_AddAttributeAction"/>
-</Entry>
-<Entry name="AssignAttributesAction"/>
-<Entry name="CopyAttributes"/>
-<Entry name="PasteAttributes"/>
-<Entry name="attributes_RemoveAllAttributesAction">
-<Entry name="attributes_RemoveFirstAttributeAction"/>
-<Entry name="attributes_RemoveLastAttributeAction"/>
-</Entry>
-<Entry name="menu_displayAttributes">
-<Entry name="ShowSelectedAttributesAction"/>
-<Entry name="ShowAllAttributesAction"/>
-<Entry name="HideAllAttributesAction"/>
-<Entry name="SetBooleanMapPropertyAction.show_icon_for_attributes"/>
-</Entry>
-<Entry name="ShowAttributeDialogAction"/>
-</Entry>
-<Entry name="links" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="AddConnectorAction"/>
-<Entry name="AddLocalLinkAction" accelerator="alt shift L"/>
-<Entry name="SetLinkByFileChooserAction"/>
-<Entry name="SetLinkByTextFieldAction"/>
-<Entry name="ExtractLinkFromTextAction"/>
-<Entry name="SetLinkAnchorAction">
-<Entry name="MakeLinkFromAnchorAction"/>
-<Entry name="MakeLinkToAnchorAction"/>
-<Entry name="ClearLinkAnchorAction"/>
-</Entry>
-</Entry>
-<Entry name="icons" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="IconSelectionPlugin"/>
-<Entry name="HierarchicalIconsAction"/>
-<Entry name="HierarchicalIcons2Action"/>
-<Entry name="RemoveAllIconsAction">
-<Entry name="RemoveIcon_0_Action"/>
-<Entry name="RemoveIconAction"/>
-</Entry>
-<Entry name="IconList" builder="ribbon_contributor"/>
-<Entry name="IconProgressIconUpAction" accelerator="alt LESS">
-<Entry name="IconProgressIconDownAction" accelerator="alt shift LESS"/>
-<Entry name="IconProgressExtended10Action"/>
-<Entry name="IconProgressExtended25Action"/>
-<Entry name="IconProgressRemoveAction"/>
-</Entry>
-</Entry>
-<Entry name="cloud" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="CloudAction"/>
-<Entry name="cloud_shapes">
-<Entry name="CloudShapeAction.ARC"/>
-<Entry name="CloudShapeAction.STAR"/>
-<Entry name="CloudShapeAction.RECT"/>
-<Entry name="CloudShapeAction.ROUND_RECT"/>
-</Entry>
-<Entry name="CloudColorAction"/>
-</Entry>
-<Entry name="notes" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="SelectNoteAction" accelerator="control LESS"/>
-<Entry name="EditNoteInDialogAction"/>
-<Entry name="ShowHideNoteAction" accelerator="control GREATER" priority="medium"/>
-<Entry name="RemoveNoteAction"/>
-<Entry name="ShowNotesInMapAction"/>
-<Entry name="ShowHideNoteAction" accelerator="control GREATER"/>
-<Entry name="SetBooleanMapPropertyAction.show_note_icons"/>
-<Entry name="note_window_location">
-<Entry name="SetNoteWindowPosition.top"/>
-<Entry name="SetNoteWindowPosition.left"/>
-<Entry name="SetNoteWindowPosition.right"/>
-<Entry name="SetNoteWindowPosition.bottom"/>
-</Entry>
-</Entry>
-</Entry>
-<Entry name="formatting" builder="ribbon_task">
-<Entry name="fontStyleContributor" builder="ribbon_contributor"/>
-<Entry name="styleContributor" builder="ribbon_contributor"/>
-<Entry name="manage_styles" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="NewUserStyleAction" priority="medium">
-<Entry name="RedefineStyleAction"/>
-<Entry name="ManageConditionalStylesAction"/>
-<Entry name="ManageNodeConditionalStylesAction"/>
-</Entry>
-<Entry name="CopyMapStylesAction"/>
-<Entry name="CopyStyleExtensionsAction"/>
-<Entry name="EditStylesAction"/>
-<Entry name="FormatCopy" accelerator="alt shift C" priority="medium"/>
-<Entry name="FormatPaste" accelerator="alt shift V" priority="medium"/>
-<Entry name="automatic_layout">
-<Entry name="AutomaticLayoutControllerAction.HEADINGS"/>
-<Entry name="AutomaticLayoutControllerAction.ALL"/>
-<Entry name="AutomaticLayoutControllerAction.null"/>
-</Entry>
-</Entry>
-<Entry name="EdgeProperties" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="format_menu_edge_styles">
-<Entry name="EdgeStyleAsParentAction"/>
-<Entry name="EdgeStyleAction.linear"/>
-<Entry name="EdgeStyleAction.bezier"/>
-<Entry name="EdgeStyleAction.sharp_linear"/>
-<Entry name="EdgeStyleAction.sharp_bezier"/>
-<Entry name="EdgeStyleAction.horizontal"/>
-<Entry name="EdgeStyleAction.hide_edge"/>
-</Entry>
-<Entry name="format_menu_edge_widths">
-<Entry name="EdgeWidthAction_width_parent"/>
-<Entry name="EdgeWidthAction_width_thin"/>
-<Entry name="EdgeWidthAction_1"/>
-<Entry name="EdgeWidthAction_2"/>
-<Entry name="EdgeWidthAction_4"/>
-<Entry name="EdgeWidthAction_8"/>
-</Entry>
-<Entry name="EdgeColorAction" accelerator="alt shift E">
-<Entry name="AutomaticEdgeColorHookAction"/>
-</Entry>
-<Entry name="NodeWidthAction"/>
-</Entry>
-<Entry name="map_background" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="MapBackgroundColorAction"/>
-<Entry name="MapBackgroundImageAction">
-<Entry name="MapBackgroundClearAction"/>
-<Entry name="SetBooleanMapPropertyAction.fit_to_viewport"/>
-</Entry>
-<Entry builder="menu_separator"/>
-</Entry>
-</Entry>
-<Entry name="filter" builder="ribbon_task">
-<Entry name="userDefinedFilters" builder="ribbon_contributor"/>
-<Entry name="filter" resize_policies="Mirror, High2Low" builder="ribbon_band">
-<Entry name="EditFilterAction" priority="top"/>
-<Entry name="FindAction" accelerator="control G" priority="top"/>
-<Entry name="NodeListAction" accelerator="control shift F">
-<Entry name="AllMapsNodeListAction"/>
-</Entry>
-<Entry name="UndoFilterAction" priority="medium"/>
-<Entry name="RedoFilterAction"/>
-<Entry name="ReapplyFilterAction" priority="medium"/>
-<Entry name="ApplySelectedViewConditionAction" priority="medium"/>
-<Entry name="QuickFindAllAction" priority="medium"/>
-<Entry name="ApplyNoFilteringAction" priority="medium"/>
-<Entry name="filterConditionsContributor" builder="ribbon_contributor"/>
-</Entry>
-</Entry>
-<Entry name="navigate" builder="ribbon_task">
-<Entry name="navigate_main" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="NavigationPreviousMapAction" accelerator="control shift TAB" priority="Top"/>
-<Entry name="NavigationNextMapAction" accelerator="control TAB" priority="Top"/>
-<Entry name="BackAction" accelerator="alt LEFT" priority="Top"/>
-<Entry name="ForwardAction" accelerator="alt RIGHT" priority="Top"/>
-<Entry name="NextNodeAction.BACK" accelerator="control alt LEFT" priority="Top">
-<Entry name="NextNodeAction.BACK_N_FOLD" accelerator="control shift LEFT"/>
-</Entry>
-<Entry name="NextNodeAction.FORWARD" accelerator="control alt RIGHT" priority="Top">
-<Entry name="NextNodeAction.FORWARD_N_FOLD" accelerator="control shift RIGHT"/>
-</Entry>
-</Entry>
-<Entry name="navigate_maps" builder="ribbon_contributor"/>
-<Entry name="navigate_modes" builder="ribbon_contributor"/>
-<Entry name="goto" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="MoveToRootAction" accelerator="ESCAPE" priority="Top"/>
-<Entry name="FollowLinkAction" accelerator="control ENTER"/>
-<Entry name="GotoNodeAction"/>
-<Entry name="linkList" builder="ribbon_contributor"/>
-<Entry name="cloneList" builder="ribbon_contributor"/>
-</Entry>
-<Entry name="navigate_nodes" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="ToggleFoldedAction" accelerator="SPACE" priority="top">
-<Entry name="ToggleChildrenFoldedAction" accelerator="control SPACE"/>
-</Entry>
-<Entry name="UnfoldAllAction" accelerator="alt END" priority="top"/>
-<Entry name="FoldAllAction" accelerator="alt HOME" priority="top"/>
-<Entry name="UnfoldOneLevelAction" accelerator="alt PAGE_DOWN"/>
-<Entry name="FoldOneLevelAction" accelerator="alt PAGE_UP"/>
-<Entry name="NextPresentationItemAction" accelerator="control shift SPACE"/>
-</Entry>
-<Entry name="navigate_select" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="SelectAllAction" accelerator="control A" priority="medium"/>
-<Entry name="SelectBranchAction" accelerator="control shift A"/>
-</Entry>
-</Entry>
-<Entry name="tools_and_settings" builder="ribbon_task">
-<Entry name="tools_misc" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="OpenUserDirAction" priority="top"/>
-<Entry name="PropertyAction" accelerator="control COMMA" priority="top"/>
-<Entry name="menu_time" priority="medium">
-<Entry name="TimeManagementAction" accelerator="control T"/>
-<Entry name="TimeListAction"/>
-<Entry name="ReminderHookAction"/>
-</Entry>
-<Entry name="menu_encryption" priority="medium">
-<Entry name="EnterPassword"/>
-<Entry name="RemoveEncryption"/>
-</Entry>
-<Entry name="loadAcceleratorPresets" builder="ribbon_contributor"/>
-<Entry name="SetAcceleratorOnNextClickAction" priority="Top"/>
-<Entry name="scripting" plugin="org.freeplane.plugin.script">
-<Entry name="ExecuteScriptForSelectionAction" plugin="org.freeplane.plugin.script"/>
-<Entry name="ExecuteScriptForAllNodes" plugin="org.freeplane.plugin.script"/>
-<Entry name="ScriptEditor" plugin="org.freeplane.plugin.script"/>
-<Entry name="userScripts" plugin="org.freeplane.plugin.script" builder="ribbon_contributor"/>
-</Entry>
-<Entry name="formula.menuname" plugin="org.freeplane.plugin.formula">
-<Entry name="formula.EvaluateAllAction" plugin="org.freeplane.plugin.formula"/>
-</Entry>
-<Entry name="export">
-<Entry name="ExportAction"/>
-<Entry name="ExportBranchAction" accelerator="alt shift A"/>
-</Entry>
-<Entry name="import">
-<Entry name="ImportBranchAction"/>
-<Entry name="ImportLinkedBranchAction"/>
-<Entry name="ImportLinkedBranchWithoutRootAction"/>
-<Entry name="ImportExplorerFavoritesAction"/>
-<Entry name="ImportFolderStructureAction"/>
-<Entry name="ImportMindmanagerFiles"/>
-</Entry>
-</Entry>
-<Entry name="maps" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="OpenMapsAddLocation" plugin="org.freeplane.plugin.openmaps"/>
-<Entry name="OpenMapsRemoveLocation" plugin="org.freeplane.plugin.openmaps"/>
-<Entry name="OpenMapsViewLocation" plugin="org.freeplane.plugin.openmaps"/>
-</Entry>
-</Entry>
-<Entry name="view" builder="ribbon_task">
-<Entry name="zoomContributor" builder="ribbon_contributor"/>
-<Entry name="view_mode" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="ToggleRibbonAction" priority="top"/>
-<Entry name="CenterSelectedNodeAction" priority="top">
-<Entry name="SetBooleanPropertyAction.center_selected_node"/>
-</Entry>
-<Entry name="ViewLayoutTypeAction.OUTLINE"/>
-<Entry name="ToggleFullScreenAction"/>
-<Entry name="SetBooleanPropertyAction.presentation_mode"/>
-</Entry>
-<Entry name="elements" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="ToggleDetailsAction" accelerator="alt F2"/>
-<Entry name="attribute_options" priority="top">
-<Entry name="ShowSelectedAttributesAction"/>
-<Entry name="ShowAllAttributesAction"/>
-<Entry name="HideAllAttributesAction"/>
-<Entry name="SetBooleanMapPropertyAction.show_icon_for_attributes"/>
-<Entry name="ShowAttributeDialogAction"/>
-</Entry>
-<Entry name="ShowHideNoteAction" accelerator="control GREATER" priority="top"/>
-<Entry name="menu_noteView">
-<Entry name="ShowNotesInMapAction"/>
-<Entry name="SetBooleanMapPropertyAction.show_note_icons"/>
-</Entry>
-<Entry name="note_window_location">
-<Entry name="SetNoteWindowPosition.top"/>
-<Entry name="SetNoteWindowPosition.left"/>
-<Entry name="SetNoteWindowPosition.right"/>
-<Entry name="SetNoteWindowPosition.bottom"/>
-</Entry>
-</Entry>
-<Entry name="tooltips" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="SetBooleanPropertyAction.show_node_tooltips"/>
-<Entry name="SetBooleanPropertyAction.show_styles_in_tooltip"/>
-<Entry name="CreationModificationPluginAction"/>
-</Entry>
-<Entry name="toolbars" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="ToggleFBarAction"/>
-<Entry name="ToggleLeftToolbarAction" priority="top"/>
-<Entry name="ShowFormatPanel" priority="top"/>
-<Entry name="ShowFilterToolbarAction" priority="top" accelerator="control F"/>
-<Entry name="ToggleStatusAction"/>
-<Entry name="ToggleScrollbarsAction"/>
-</Entry>
-<Entry name="view_misc" resize_policies="Mirror" builder="ribbon_band">
-<Entry name="ShowSelectionAsRectangleAction"/>
-<Entry name="SetBooleanPropertyAction.highlight_formulas"/>
-</Entry>
-</Entry>
-<Entry name="help" orderPriority="last" builder="ribbon_task">
-<Entry name="help_misc" resize_policies="Mirror" orderPriority="0" builder="ribbon_band">
-<Entry name="OpenUserDirAction" priority="top" mandatory="true"/>
-<Entry name="UpdateCheckAction" priority="top" mandatory="true"/>
-<Entry name="GettingStartedAction" accelerator="F1" mandatory="true"/>
-<Entry name="HotKeyInfoAction" mandatory="true"/>
-</Entry>
-<Entry name="contact" resize_policies="Mirror" orderPriority="2000" builder="ribbon_band">
-<Entry name="AskForHelp" mandatory="true"/>
-<Entry name="RequestFeatureAction" mandatory="true"/>
-<Entry name="ReportBugAction" mandatory="true"/>
-</Entry>
-<Entry name="about" resize_policies="Mirror" orderPriority="last" builder="ribbon_band">
-<Entry name="OpenFreeplaneSiteAction" priority="top" mandatory="true"/>
-<Entry name="AboutAction" priority="top" mandatory="true"/>
-</Entry>
-</Entry>
-</Entry>
-</Entry>
-</FreeplaneUIEntries>
diff --git a/freeplane/resources/xml/preferences.mm b/freeplane/resources/xml/preferences.mm
deleted file mode 100644
index 9d218a9..0000000
--- a/freeplane/resources/xml/preferences.mm
+++ /dev/null
@@ -1,927 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<attribute_registry SHOW_ATTRIBUTES="hide"/>
-<node TEXT="Preferences" FOLDED="false" ID="ID_1942740593" CREATED="1370183720004" MODIFIED="1370183720004"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="boolean" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="boolean" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="combo" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="combo" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="choice" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="choice" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="font" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="font" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="number" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="number" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="path" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="path" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="remind_value" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="remind_value" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="group" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="group" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="color" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="color" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="string" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="string" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="tab" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="tab" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="text" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="text" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode TEXT="boolean">
-<icon BUILTIN="checked"/>
-</stylenode>
-<stylenode TEXT="combo">
-<icon BUILTIN="list"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-<stylenode TEXT="choice"/>
-<stylenode TEXT="font"/>
-<stylenode TEXT="number"/>
-<stylenode TEXT="path"/>
-<stylenode TEXT="remind_value"/>
-<stylenode TEXT="separator">
-<font BOLD="true"/>
-</stylenode>
-<stylenode TEXT="group">
-<icon BUILTIN="folder"/>
-</stylenode>
-<stylenode TEXT="color">
-<icon BUILTIN="licq"/>
-</stylenode>
-<stylenode TEXT="string">
-<icon BUILTIN="edit"/>
-</stylenode>
-<stylenode TEXT="tab">
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="text">
-<icon BUILTIN="info"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="Environment" POSITION="right" ID="ID_723831545" CREATED="1370183720024" MODIFIED="1370183720024">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE="Environment"/>
-<node TEXT="Single program instance" FOLDED="true" ID="ID_1840688670" CREATED="1370183720024" MODIFIED="1370183720024">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="single_instance_mode"/>
-<node TEXT="Open files in a running instance" ID="ID_885109739" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="single_instance"/>
-</node>
-<node TEXT="Avoid a second instance in any case" ID="ID_1895070379" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="single_instance_force"/>
-</node>
-</node>
-<node TEXT="Language" FOLDED="true" ID="ID_768814664" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="language"/>
-<node TEXT="Language" ID="ID_212812785" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="languages"/>
-<attribute NAME="name" VALUE="language"/>
-</node>
-</node>
-<node TEXT="Files" ID="ID_1398818983" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="files"/>
-<node TEXT="Last opened list length" ID="ID_1451739024" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="last_opened_list_length"/>
-<attribute NAME="min" VALUE="1"/>
-<attribute NAME="max" VALUE="50"/>
-</node>
-<node TEXT="Automatically open last map" ID="ID_187279290" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="load_last_map"/>
-</node>
-<node TEXT="Load all last maps" ID="ID_1898517177" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="load_last_maps"/>
-</node>
-<node TEXT="Load last and new maps" ID="ID_1488586971" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="always_load_last_maps"/>
-</node>
-<node TEXT="Experimental file locking" ID="ID_298137736" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="experimental_file_locking_on"/>
-</node>
-<node TEXT="Standard template file" ID="ID_396156987" CREATED="1370183720025" MODIFIED="1384808649400">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="standard_template"/>
-</node>
-</node>
-<node TEXT="Load" FOLDED="true" ID="ID_1577638913" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="load"/>
-<node TEXT="On load" FOLDED="true" ID="ID_410599" CREATED="1370183720025" MODIFIED="1370183720025">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="load_folding"/>
-<node TEXT="Fold all" ID="ID_477016346" CREATED="1370183720033" MODIFIED="1370183720033">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="always_fold_all_after_load"/>
-</node>
-<node TEXT="Load from map or fold all" ID="ID_185717318" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="load_folding_from_map_default_fold_all"/>
-</node>
-<node TEXT="Load from map or unfold all" ID="ID_1059944310" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="load_folding_from_map_default_unfold_all"/>
-</node>
-<node TEXT="Unfold all" ID="ID_997389407" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="always_unfold_all_after_load"/>
-</node>
-</node>
-<node TEXT="Maximum number of displayed nodes" ID="ID_81186168" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="max_displayed_node_count"/>
-<attribute NAME="min" VALUE="1"/>
-</node>
-</node>
-<node TEXT="Save" FOLDED="true" ID="ID_124150095" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="save"/>
-<node TEXT="Save folding" FOLDED="true" ID="ID_416087882" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="save_folding"/>
-<node TEXT="Never" ID="ID_256325781" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="never_save_folding"/>
-</node>
-<node TEXT="If map is changed" ID="ID_1959130057" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="save_folding_if_map_is_changed"/>
-</node>
-<node TEXT="Always" ID="ID_1006028189" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="always_save_folding"/>
-</node>
-</node>
-<node TEXT="Save modification times" ID="ID_634390567" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="save_modification_times"/>
-</node>
-</node>
-<node TEXT="Automatic save" FOLDED="true" ID="ID_852360897" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="automatic_save"/>
-<node TEXT="Time for automatic save" ID="ID_1498208772" CREATED="1370183720034" MODIFIED="1370183720034">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="time_for_automatic_save"/>
-<attribute NAME="min" VALUE="0"/>
-</node>
-<node TEXT="Use single directory for backup files" ID="ID_899436679" CREATED="1370183720036" MODIFIED="1370183720036">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="single_backup_directory"/>
-</node>
-<node TEXT="Backup directory (if above option is selected)" ID="ID_1706930676" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="path"/>
-<attribute NAME="name" VALUE="single_backup_directory_path"/>
-<attribute NAME="dir" VALUE="true"/>
-</node>
-<node TEXT="Delete automatic saves at exit" ID="ID_703236630" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="delete_automatic_saves_at_exit"/>
-</node>
-<node TEXT="Number of different files for automatic save" ID="ID_634516064" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="number_of_different_files_for_automatic_save"/>
-<attribute NAME="min" VALUE="0"/>
-<attribute NAME="max" VALUE="25"/>
-</node>
-<node TEXT="Number of kept backup files" ID="ID_1192701799" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="backup_file_number"/>
-<attribute NAME="min" VALUE="0"/>
-<attribute NAME="max" VALUE="25"/>
-</node>
-</node>
-<node TEXT="Export" FOLDED="true" ID="ID_954161030" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="export"/>
-<node TEXT="Exported image resolution (in DPI)" ID="ID_697646517" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="exported_image_resolution_dpi"/>
-<attribute NAME="min" VALUE="72"/>
-<attribute NAME="max" VALUE="2400"/>
-</node>
-</node>
-<node TEXT="Hyperlink types" FOLDED="true" ID="ID_1473490330" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="hyperlink_types"/>
-<node TEXT="Links" FOLDED="true" ID="ID_311928787" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="links"/>
-<node TEXT="Relative" ID="ID_509696639" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="relative"/>
-</node>
-<node TEXT="Absolute" ID="ID_812869471" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="absolute"/>
-</node>
-</node>
-</node>
-<node TEXT="Cache" FOLDED="true" ID="ID_1505774869" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="cache"/>
-<node TEXT="for images" FOLDED="true" ID="ID_964050006" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="image_cache"/>
-<node TEXT="Disable" ID="ID_1260513076" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="ic_disable"/>
-</node>
-<node TEXT="Use disk" ID="ID_40737444" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="ic_file"/>
-</node>
-<node TEXT="In RAM" ID="ID_1338158409" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="ic_ram"/>
-</node>
-</node>
-</node>
-<node TEXT="Program updates" FOLDED="true" ID="ID_378448205" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="updates"/>
-<node TEXT="Check for updates on program start" ID="ID_456905076" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="check_updates_automatically"/>
-</node>
-</node>
-<node TEXT="Policy" FOLDED="true" ID="ID_363428684" CREATED="1370183720037" MODIFIED="1370183720037">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="org.freeplane.plugin.bugreport"/>
-<node TEXT="Policy" FOLDED="true" ID="ID_915122560" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="org.freeplane.plugin.bugreport"/>
-<node TEXT="Always send" ID="ID_471506559" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="org.freeplane.plugin.bugreport.allowed"/>
-</node>
-<node TEXT="Never send" ID="ID_90500310" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="org.freeplane.plugin.bugreport.denied"/>
-</node>
-<node TEXT="Show report dialog" ID="ID_1395562400" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="org.freeplane.plugin.bugreport.ask"/>
-</node>
-</node>
-<node TEXT="Optional identifier to be sent" ID="ID_441206896" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="org.freeplane.plugin.bugreport.userid"/>
-</node>
-</node>
-</node>
-<node TEXT="Appearance" FOLDED="true" POSITION="right" ID="ID_37070726" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE="Appearance"/>
-<node TEXT="Look and feel" FOLDED="true" ID="ID_844594313" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="look_and_feel"/>
-<node TEXT="Look and Feel" ID="ID_1265760042" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="group"/>
-<attribute NAME="name" VALUE="lookandfeel"/>
-</node>
-<node TEXT="Apply system screen resolution default" ID="ID_746558491" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="apply_system_screen_resolution"/>
-</node>
-<node TEXT="User defined screen resolution (dpi)" ID="ID_365827132" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="user_defined_screen_resolution"/>
-<attribute NAME="min" VALUE="72"/>
-<attribute NAME="max" VALUE="1200"/>
-</node>
-<node TEXT="Use default font for notes too" ID="ID_733638596" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="resources_use_default_font_for_notes_too"/>
-</node>
-<node TEXT="Remove top margin for notes" ID="ID_59875589" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="resources_use_margin_top_zero_for_notes"/>
-</node>
-<node TEXT="Maximum number of menu items" ID="ID_940027994" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="max_menu_item_count"/>
-<attribute NAME="min" VALUE="10"/>
-</node>
-</node>
-<node TEXT="Status line" FOLDED="true" ID="ID_646613151" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="status"/>
-<node TEXT="Display node ID" ID="ID_108835084" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="display_node_id"/>
-</node>
-</node>
-<node TEXT="Default colors" FOLDED="true" ID="ID_1557885832" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="default_colors"/>
-<node TEXT="Revision color" ID="ID_259628453" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="color"/>
-<attribute NAME="name" VALUE="revision_color"/>
-</node>
-<node TEXT="White background for printing" ID="ID_1279617230" CREATED="1370183720038" MODIFIED="1370183720038">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="printonwhitebackground"/>
-</node>
-<node TEXT="Standard Cloud color" ID="ID_692317954" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="color"/>
-<attribute NAME="name" VALUE="standardcloudcolor"/>
-</node>
-<node TEXT="Presentation dimmer transparenty" ID="ID_1331987741" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="presentation_dimmer_transparency"/>
-<attribute NAME="min" VALUE="0"/>
-<attribute NAME="max" VALUE="255"/>
-</node>
-</node>
-<node TEXT="Selection colors" FOLDED="true" ID="ID_1579556482" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="selection_colors"/>
-<node TEXT="Display selected nodes in bubbles" ID="ID_1336656688" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="standarddrawrectangleforselection"/>
-</node>
-<node TEXT="Selected node bubble color" ID="ID_1908988134" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="color"/>
-<attribute NAME="name" VALUE="standardselectednoderectanglecolor"/>
-</node>
-<node TEXT="Standard selected node color" ID="ID_1025277999" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="color"/>
-<attribute NAME="name" VALUE="standardselectednodecolor"/>
-</node>
-</node>
-<node TEXT="Root node appearance" FOLDED="true" ID="ID_185289096" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="root_node_appearance"/>
-<node TEXT="Edges start from one point at root node" ID="ID_562395828" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="use_common_out_point_for_root_node"/>
-</node>
-</node>
-<node TEXT="Antialias" FOLDED="true" ID="ID_90204332" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="anti_alias"/>
-<node TEXT="Antialias" FOLDED="true" ID="ID_1892518977" CREATED="1370183720045" MODIFIED="1370183720045">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="antialias"/>
-<node TEXT="Antialias edges" ID="ID_801698319" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="antialias_edges"/>
-</node>
-<node TEXT="Antialias all" ID="ID_1863414969" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="antialias_all"/>
-</node>
-<node TEXT="No antialias" ID="ID_1907389980" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="antialias_none"/>
-</node>
-</node>
-</node>
-<node TEXT="Size limits" FOLDED="true" ID="ID_887796087" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="size_limits"/>
-<node TEXT="Maximum shortened text width" ID="ID_1080402416" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="max_shortened_text_length"/>
-</node>
-<node TEXT="Max initial image width" ID="ID_571433786" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="max_image_width"/>
-</node>
-<node TEXT="Node tool tip width" ID="ID_835053857" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="toolTipManager.max_tooltip_width"/>
-</node>
-<node TEXT="Standard attribute key width" ID="ID_721222417" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="default_attribute_key_column_width"/>
-<attribute NAME="min" VALUE="10"/>
-</node>
-<node TEXT="Standard attribute value width" ID="ID_1441167649" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="default_attribute_value_column_width"/>
-<attribute NAME="min" VALUE="10"/>
-</node>
-</node>
-<node TEXT="Connectors" FOLDED="true" ID="ID_908110780" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="connectors"/>
-<node TEXT="Standard link color" ID="ID_965690541" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="color"/>
-<attribute NAME="name" VALUE="standardlinkcolor"/>
-</node>
-<node TEXT="connector_alpha" ID="ID_1042325065" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="connector_alpha"/>
-<attribute NAME="text" VALUE="edit_transparency_label"/>
-<attribute NAME="min" VALUE="20"/>
-<attribute NAME="max" VALUE="255"/>
-</node>
-<node TEXT="connector_shape" FOLDED="true" ID="ID_1605623486" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="connector_shape"/>
-<attribute NAME="text" VALUE="connector_shapes"/>
-<node TEXT="LINE" ID="ID_836366585" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="LINE"/>
-<attribute NAME="text" VALUE="ChangeConnectorShapeAction.LINE.text"/>
-</node>
-<node TEXT="LINEAR_PATH" ID="ID_1763438017" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="LINEAR_PATH"/>
-<attribute NAME="text" VALUE="ChangeConnectorShapeAction.LINEAR_PATH.text"/>
-</node>
-<node TEXT="CUBIC_CURVE" ID="ID_1225462774" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="CUBIC_CURVE"/>
-<attribute NAME="text" VALUE="ChangeConnectorShapeAction.CUBIC_CURVE.text"/>
-</node>
-<node TEXT="EDGE_LIKE" ID="ID_1571287345" CREATED="1370183720046" MODIFIED="1370183720046">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="EDGE_LIKE"/>
-<attribute NAME="text" VALUE="ChangeConnectorShapeAction.EDGE_LIKE.text"/>
-</node>
-</node>
-<node TEXT="connector_width" ID="ID_1534013234" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="connector_width"/>
-<attribute NAME="text" VALUE="edit_width_label"/>
-<attribute NAME="min" VALUE="1"/>
-<attribute NAME="max" VALUE="32"/>
-</node>
-<node TEXT="Font family" ID="ID_557649283" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="font"/>
-<attribute NAME="name" VALUE="label_font_family"/>
-</node>
-<node TEXT="Font size" ID="ID_1800154658" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="label_font_size"/>
-<attribute NAME="min" VALUE="4"/>
-<attribute NAME="max" VALUE="216"/>
-</node>
-<node TEXT="Paint connectors behind nodes" ID="ID_673192924" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="paint_connectors_behind"/>
-</node>
-</node>
-<node TEXT="Edit in dialog" FOLDED="true" ID="ID_1513160130" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="edit_long_node_window"/>
-<node TEXT="Buttons at the top" ID="ID_952752518" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="el__buttons_above"/>
-</node>
-<node TEXT="Position window below node" ID="ID_682710154" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="el__position_window_below_node"/>
-</node>
-<node TEXT="Min default window height" ID="ID_692742423" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="el__min_default_window_height"/>
-</node>
-<node TEXT="Max default window height" ID="ID_701741164" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="el__max_default_window_height"/>
-</node>
-<node TEXT="Min default window width" ID="ID_376949997" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="el__min_default_window_width"/>
-</node>
-<node TEXT="Max default window width" ID="ID_429760868" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="el__max_default_window_width"/>
-</node>
-</node>
-<node TEXT="Outline view" FOLDED="true" ID="ID_1390048143" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="outline_view"/>
-<node TEXT="Vertical distance" ID="ID_1110006236" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="outline_vgap"/>
-<attribute NAME="min" VALUE="1"/>
-</node>
-<node TEXT="Horizontal distance" ID="ID_592653838" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="outline_hgap"/>
-<attribute NAME="min" VALUE="1"/>
-</node>
-</node>
-<node TEXT="Icons" FOLDED="true" ID="ID_277900726" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="icon_properties"/>
-<node TEXT="Structured icon toolbar" ID="ID_510627650" CREATED="1370183720047" MODIFIED="1370183720047">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="structured_icon_toolbar"/>
-</node>
-</node>
-</node>
-<node TEXT="Keystrokes" FOLDED="true" POSITION="right" ID="ID_618364125" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE="Keystrokes"/>
-<attribute NAME="layout" VALUE="right:max(40dlu;p), 4dlu, 80dlu, 7dlu,right:max(40dlu;p), 4dlu, 80dlu, 7dlu"/>
-<node TEXT="Commands for the program" ID="ID_298335309" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="commands_for_the_program"/>
-</node>
-<node TEXT="use_ctrl_key" ID="ID_1873157630" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="text"/>
-<attribute NAME="name" VALUE="use_ctrl_key"/>
-</node>
-<node TEXT="Icons in "Select icon..."" ID="ID_1158116466" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="icons"/>
-</node>
-</node>
-<node TEXT="Behaviour" FOLDED="true" POSITION="right" ID="ID_630037237" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE="Behaviour"/>
-<node TEXT="Behaviour" FOLDED="true" ID="ID_1310182301" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="behaviour"/>
-<node TEXT="Place new branches" FOLDED="true" ID="ID_877092297" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="placenewbranches"/>
-<node TEXT="First" ID="ID_199036669" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="first"/>
-</node>
-<node TEXT="Last" ID="ID_467170704" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="last"/>
-</node>
-</node>
-<node TEXT="Unfold node on paste" ID="ID_1679270241" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="unfold_on_paste"/>
-</node>
-<node TEXT="Fold on click inside" ID="ID_1874267432" CREATED="1370183720048" MODIFIED="1370183720048">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="fold_on_click_inside"/>
-</node>
-<node TEXT="Disable cursor move paper" ID="ID_1895979293" CREATED="1370183720052" MODIFIED="1370183720052">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="disable_cursor_move_paper"/>
-</node>
-<node TEXT="Folding symbol width" ID="ID_598554753" CREATED="1370183720052" MODIFIED="1370183720052">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="foldingsymbolwidth"/>
-</node>
-<node TEXT="Edit on double click" ID="ID_1121593000" CREATED="1370183720052" MODIFIED="1370183720052">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="edit_on_double_click"/>
-</node>
-<node TEXT="Grid gap size" ID="ID_1158278472" CREATED="1370183720052" MODIFIED="1370183720052">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="grid_size"/>
-<attribute NAME="min" VALUE="1"/>
-</node>
-<node TEXT="Automatic map scrolling speed" ID="ID_904143728" CREATED="1370183720052" MODIFIED="1370183720052">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="scrolling_speed"/>
-<attribute NAME="min" VALUE="1"/>
-<attribute NAME="max" VALUE="30"/>
-</node>
-<node TEXT="Move note cursor to the end" ID="ID_956381715" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="goto_note_end_on_edit"/>
-</node>
-<node TEXT="On key type" FOLDED="true" ID="ID_564669547" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="key_type_action"/>
-<node TEXT="Overwrite content" ID="ID_1153246997" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="EDIT_CURRENT"/>
-</node>
-<node TEXT="Do nothing" ID="ID_886636310" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="IGNORE"/>
-</node>
-<node TEXT="Add sibling node" ID="ID_413294727" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="ADD_SIBLING"/>
-</node>
-<node TEXT="Add child node" ID="ID_642981674" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="ADD_CHILD"/>
-</node>
-</node>
-</node>
-<node TEXT="Data formatting and parsing" FOLDED="true" ID="ID_1442063739" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="data_formats"/>
-<node TEXT="Recognize input of numbers and date-time" ID="ID_910768774" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="parse_data"/>
-</node>
-<node TEXT="Standard number format" ID="ID_1270880306" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="number_format"/>
-</node>
-<node TEXT="Standard date format" ID="ID_515913650" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="date_format"/>
-</node>
-<node TEXT="Standard date-time format" ID="ID_355710167" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="datetime_format"/>
-</node>
-<node TEXT="Locale for formats" ID="ID_876601772" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="languages"/>
-<attribute NAME="name" VALUE="format_locale"/>
-</node>
-</node>
-<node TEXT="Search" FOLDED="true" ID="ID_1984074531" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="search"/>
-<node TEXT="Compare as numbers" ID="ID_1362174029" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="compare_as_number"/>
-</node>
-<node TEXT="Threshold for approximate matching" ID="ID_1267144945" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="approximate_search_threshold"/>
-<attribute NAME="min" VALUE="0.1"/>
-<attribute NAME="max" VALUE="1.0"/>
-<attribute NAME="step" VALUE="0.05"/>
-</node>
-</node>
-<node TEXT="In-line node editor" FOLDED="true" ID="ID_557632654" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="inline_editor"/>
-<node TEXT="Display inline editor for all new nodes" ID="ID_1014770406" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="display_inline_editor_for_all_new_nodes"/>
-</node>
-<node TEXT="Layout map during editing" ID="ID_171758367" CREATED="1370183720053" MODIFIED="1370183720053">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="layout_map_on_text_change"/>
-</node>
-<node TEXT="Enter confirms by default" ID="ID_1902257146" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="el__enter_confirms_by_default"/>
-</node>
-<node TEXT="Extra width step" ID="ID_1871144597" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="editor_extra_width"/>
-<attribute NAME="min" VALUE="0"/>
-<attribute NAME="max" VALUE="1000"/>
-<attribute NAME="step" VALUE="40"/>
-</node>
-</node>
-<node TEXT="Spell checker options" FOLDED="true" ID="ID_1278191355" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="spelling"/>
-<node TEXT="Case sensitive" ID="ID_1306174035" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="spelling_opt_case_sensitive"/>
-</node>
-<node TEXT="Ignore all upper case words." ID="ID_203534582" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="spelling_opt_ignore_all_caps_words"/>
-</node>
-<node TEXT="Ignore capital letters at word begin" ID="ID_1714670354" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="spelling_opt_ignore_capitalization"/>
-</node>
-<node TEXT="Ignore words with numbers" ID="ID_495998983" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="spelling_opt_ignore_words_with_numbers"/>
-</node>
-<node TEXT="Maximum count of suggestions in the dialog" ID="ID_1873561798" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="spelling_opt_suggestions_limit_dialog"/>
-<attribute NAME="min" VALUE="0"/>
-</node>
-<node TEXT="Maximum count of suggestions in the menu" ID="ID_748379690" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="spelling_opt_suggestions_limit_menu"/>
-<attribute NAME="min" VALUE="0"/>
-</node>
-</node>
-<node TEXT="Confirmations" FOLDED="true" ID="ID_1302130978" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="notifications"/>
-<node TEXT="Use rich text for pasted nodes" ID="ID_815038150" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="remind_value"/>
-<attribute NAME="name" VALUE="remind_use_rich_text_in_new_nodes"/>
-</node>
-<node TEXT="Delete nodes without confirmation?" ID="ID_1610007906" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="delete_nodes_without_question"/>
-</node>
-<node TEXT="Cut nodes without confirmation?" ID="ID_511499285" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="cut_nodes_without_question"/>
-</node>
-<node TEXT="Remove notes without question?" ID="ID_931265655" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="remove_notes_without_question"/>
-</node>
-</node>
-<node TEXT="Selection method" FOLDED="true" ID="ID_503444195" CREATED="1370183720054" MODIFIED="1370183720054">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="selection_method"/>
-<node TEXT="Selection method" FOLDED="true" ID="ID_1686471954" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="selection_method"/>
-<node TEXT="Direct" ID="ID_168679294" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="selection_method_direct"/>
-</node>
-<node TEXT="Delayed" ID="ID_1705316999" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="selection_method_delayed"/>
-</node>
-<node TEXT="By click" ID="ID_1394653756" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="selection_method_by_click"/>
-</node>
-</node>
-<node TEXT="Time for delayed selection" ID="ID_178397801" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="time_for_delayed_selection"/>
-</node>
-<node TEXT="Center selected node automatically" ID="ID_1909142239" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="center_selected_node"/>
-</node>
-<node TEXT="Slow scrolling to selected node">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="slow_scroll_selected_node"/>
-</node>
-</node>
-<node TEXT="Mouse wheel" FOLDED="true" ID="ID_503866131" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="mouse_wheel"/>
-<node TEXT="Speed" ID="ID_1770927331" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="wheel_velocity"/>
-</node>
-</node>
-<node TEXT="Scrollbar" FOLDED="true" ID="ID_1893063596" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="scrollbar"/>
-<node TEXT="Speed" ID="ID_107891399" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="scrollbar_increment"/>
-</node>
-</node>
-<node TEXT="Tooltip times" FOLDED="true" ID="ID_460104421" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="tooltip"/>
-<node TEXT="Display tool tips" ID="ID_816419280" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="show_node_tooltips"/>
-</node>
-<node TEXT="Initial delay, ms" ID="ID_111812950" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="toolTipManager.initialDelay"/>
-<attribute NAME="min" VALUE="0"/>
-</node>
-<node TEXT="Dismiss delay, ms" ID="ID_1805226613" CREATED="1370183720055" MODIFIED="1370183720055">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="toolTipManager.dismissDelay"/>
-<attribute NAME="min" VALUE="0"/>
-</node>
-<node TEXT="Reshow delay, ms" ID="ID_1829907889" CREATED="1370183720059" MODIFIED="1370183720059">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="toolTipManager.reshowDelay"/>
-<attribute NAME="min" VALUE="0"/>
-</node>
-<node TEXT="Display node styles in tool tips" ID="ID_593396324" CREATED="1370183720059" MODIFIED="1370183720059">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="show_styles_in_tooltip"/>
-</node>
-</node>
-<node TEXT="Undo" FOLDED="true" ID="ID_1519744325" CREATED="1370183720059" MODIFIED="1370183720059">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="undo"/>
-<node TEXT="Undo levels" ID="ID_165120822" CREATED="1370183720059" MODIFIED="1370183720059">
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="undo_levels"/>
-</node>
-</node>
-<node TEXT="Rich-Text Editor" FOLDED="true" ID="ID_104180183" CREATED="1370183720059" MODIFIED="1370183720059">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="RichTextEditor"/>
-<node TEXT="Default paste mode" FOLDED="true" ID="ID_802213301" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="simplyhtml.default_paste_mode"/>
-<node TEXT="Paste as HTML" ID="ID_579434040" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="PASTE_HTML"/>
-</node>
-<node TEXT="Paste as plain-text" ID="ID_1807400987" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="PASTE_PLAIN_TEXT"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="HTML" FOLDED="true" POSITION="right" ID="ID_1401105906" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE="HTML"/>
-<node TEXT="Browser" FOLDED="true" ID="ID_479521225" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="browser"/>
-<node TEXT="Default browser command Windows Nt" ID="ID_154419270" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="default_browser_command_windows_nt"/>
-</node>
-<node TEXT="Default browser command Windows 9x" ID="ID_723429836" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="default_browser_command_windows_9x"/>
-</node>
-<node TEXT="Default browser command other OS" ID="ID_1313532976" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="default_browser_command_other_os"/>
-</node>
-<node TEXT="Default browser command Mac" ID="ID_554942195" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="default_browser_command_mac"/>
-</node>
-</node>
-<node TEXT="Html Export" FOLDED="true" ID="ID_572384290" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="html_export"/>
-<node TEXT="Html export folding" FOLDED="true" ID="ID_122608747" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="combo"/>
-<attribute NAME="name" VALUE="html_export_folding"/>
-<node TEXT="No folding" ID="ID_1569400510" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="html_export_no_folding"/>
-</node>
-<node TEXT="Fold currently folded" ID="ID_22456022" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="html_export_fold_currently_folded"/>
-</node>
-<node TEXT="Fold all" ID="ID_1433182149" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="html_export_fold_all"/>
-</node>
-<node TEXT="Based On Headings" ID="ID_1665090138" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="choice"/>
-<attribute NAME="value" VALUE="html_export_based_on_headings"/>
-</node>
-</node>
-<node TEXT="Export icons in Html" ID="ID_1975340209" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="export_icons_in_html"/>
-</node>
-</node>
-<node TEXT="Html Import" FOLDED="true" ID="ID_1883761755" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="html_import"/>
-<node TEXT="Import HTML as node structure" ID="ID_1958637376" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="structured_html_import"/>
-</node>
-</node>
-</node>
-<node TEXT="Plugins" POSITION="right" ID="ID_460770893" CREATED="1370183720060" MODIFIED="1370183720060">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE="plugins"/>
-</node>
-</node>
-</map>
diff --git a/freeplane/resources/xml/stylemodemenu.mm b/freeplane/resources/xml/stylemodemenu.mm
deleted file mode 100644
index 76632f5..0000000
--- a/freeplane/resources/xml/stylemodemenu.mm
+++ /dev/null
@@ -1,695 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<attribute_registry SHOW_ATTRIBUTES="hide"/>
-<node TEXT="Menu for Style Mode" FOLDED="false" ID="ID_1153816448" CREATED="1370196501348" MODIFIED="1370196531464"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="category" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="category" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="radio_action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="radio_action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="submenu" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="submenu" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" MAX_WIDTH="600" COLOR="#000000" STYLE="as_parent">
-<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important">
-<icon BUILTIN="yes"/>
-</stylenode>
-<stylenode TEXT="separator" COLOR="#999999"/>
-<stylenode TEXT="action"/>
-<stylenode TEXT="radio_action">
-<icon BUILTIN="unchecked"/>
-</stylenode>
-<stylenode TEXT="category" COLOR="#000000" BACKGROUND_COLOR="#ccffcc">
-<font ITALIC="true"/>
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="submenu">
-<font ITALIC="true"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="10"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="menu_bar" POSITION="right" ID="ID_1301431569" CREATED="1370196501353" MODIFIED="1370196501353">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="menu_bar"/>
-<node TEXT="File" ID="ID_1513089688" CREATED="1370196501360" MODIFIED="1370196501360">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="file"/>
-<attribute NAME="name_ref" VALUE="file"/>
-<node TEXT="OK" ID="ID_533612695" CREATED="1370196501360" MODIFIED="1370196501360">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="styledialog.ok"/>
-</node>
-<node TEXT="Cancel" ID="ID_796177157" CREATED="1370196501368" MODIFIED="1370196501368">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="styledialog.cancel"/>
-</node>
-</node>
-<node TEXT="Edit" FOLDED="true" ID="ID_1301905948" CREATED="1370196501368" MODIFIED="1370196501368">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="edit"/>
-<attribute NAME="name_ref" VALUE="edit"/>
-<node TEXT="Node group" FOLDED="true" ID="ID_777721731" CREATED="1370196501369" MODIFIED="1370196501369">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_group"/>
-<attribute NAME="name_ref" VALUE="menu_group"/>
-<node TEXT="Add / remove cloud (default)" ID="ID_988321725" CREATED="1370196501369" MODIFIED="1370196501369">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift B"/>
-<attribute NAME="action" VALUE="CloudAction"/>
-</node>
-</node>
-<node TEXT="Icons" FOLDED="true" ID="ID_764034244" CREATED="1370196501369" MODIFIED="1370337081696">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="icons"/>
-<attribute NAME="name_ref" VALUE="menu_iconView"/>
-<node TEXT="Icons by category" ID="ID_781060873" CREATED="1370196501369" MODIFIED="1370337168033">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="icons"/>
-<attribute NAME="name_ref" VALUE="menu_iconByCategory"/>
-<node TEXT="icons_list" ID="ID_589292743" CREATED="1370196501370" MODIFIED="1370196501370">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_icons"/>
-<attribute NAME="name" VALUE="icons_list"/>
-</node>
-</node>
-<node TEXT="Remove icons" FOLDED="true" ID="ID_838633891" CREATED="1370196501370" MODIFIED="1370196501370">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_remove_icons"/>
-<node TEXT="Remove first icon" ID="ID_80559687" CREATED="1370196501370" MODIFIED="1370196501370">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveIcon_0_Action"/>
-</node>
-<node TEXT="Remove Last Icon" ID="ID_10379614" CREATED="1370196501370" MODIFIED="1370196501370">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveIconAction"/>
-</node>
-<node TEXT="Remove all icons" ID="ID_904607174" CREATED="1370196501370" MODIFIED="1370196501370">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveAllIconsAction"/>
-</node>
-</node>
-</node>
-<node TEXT="Node extensions" FOLDED="true" ID="ID_491471557" CREATED="1370196501375" MODIFIED="1370196501375">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_extensions"/>
-<attribute NAME="name_ref" VALUE="menu_extensions"/>
-<node TEXT="Edit node details in-line" ID="ID_1729079758" CREATED="1370196501376" MODIFIED="1370196501376">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditDetailsAction"/>
-</node>
-<node TEXT="Edit node details in dialog" ID="ID_434330448" CREATED="1370196501376" MODIFIED="1370196501376">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditDetailsInDialogAction"/>
-</node>
-<node TEXT="Remove node details" ID="ID_892624514" CREATED="1370196501376" MODIFIED="1370196501376">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="DeleteDetailsAction"/>
-</node>
-<node TEXT="Edit attribute in-line" ID="ID_1299054924" CREATED="1370196501378" MODIFIED="1370196501378">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt F9"/>
-<attribute NAME="action" VALUE="EditAttributesAction"/>
-</node>
-<node TEXT="Copy attributes" ID="ID_1905479531" CREATED="1370196501379" MODIFIED="1370196501379">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyAttributes"/>
-</node>
-<node TEXT="Paste attributes" ID="ID_1709526524" CREATED="1370196501379" MODIFIED="1370196501379">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PasteAttributes"/>
-</node>
-</node>
-<node TEXT="notes" FOLDED="true" ID="ID_1988810122" CREATED="1370196501379" MODIFIED="1370196501379">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="notes"/>
-<attribute NAME="name_ref" VALUE="menu_notes"/>
-<node TEXT="Edit note in dialog" ID="ID_1290550656" CREATED="1370196501379" MODIFIED="1370196501379">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditNoteInDialogAction"/>
-</node>
-<node TEXT="Remove note" ID="ID_1930535271" CREATED="1370196501379" MODIFIED="1370196501379">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveNoteAction"/>
-</node>
-</node>
-<node TEXT="Undo" ID="ID_641909829" CREATED="1370196501379" MODIFIED="1370196501379">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control Z"/>
-<attribute NAME="action" VALUE="UndoAction"/>
-</node>
-<node TEXT="Redo" ID="ID_446487635" CREATED="1370196501379" MODIFIED="1370196501379">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control Y"/>
-<attribute NAME="action" VALUE="RedoAction"/>
-</node>
-<node TEXT="Move and sort" FOLDED="true" ID="ID_1872083241" CREATED="1370196501380" MODIFIED="1370196501380">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_moveNode"/>
-<attribute NAME="name_ref" VALUE="menu_moveNode"/>
-<node TEXT="Move node (Sibling up)" ID="ID_1131994926" CREATED="1370196501380" MODIFIED="1370196501380">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control UP"/>
-<attribute NAME="action" VALUE="NodeUpAction"/>
-</node>
-<node TEXT="Move node (Sibling down)" ID="ID_360232098" CREATED="1370196501380" MODIFIED="1370196501380">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control DOWN"/>
-<attribute NAME="action" VALUE="NodeDownAction"/>
-</node>
-</node>
-<node TEXT="find" FOLDED="true" ID="ID_1704489500" CREATED="1370196501384" MODIFIED="1370196501384">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="find"/>
-<node TEXT="Find..." ID="ID_705690498" CREATED="1370196501384" MODIFIED="1370196501384">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control G"/>
-<attribute NAME="action" VALUE="FindAction"/>
-</node>
-<node TEXT="Find next" ID="ID_1248441209" CREATED="1370196501385" MODIFIED="1370196501385">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift G"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-<node TEXT="Find previous" ID="ID_1957590634" CREATED="1370196501385" MODIFIED="1370196501385">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-</node>
-</node>
-<node TEXT="View" FOLDED="true" ID="ID_1971871198" CREATED="1370196501385" MODIFIED="1370337204561">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="view"/>
-<attribute NAME="name_ref" VALUE="menu_view"/>
-<node TEXT="Menu_Toolbar_Panel" FOLDED="true" ID="ID_1212160763" CREATED="1370196501385" MODIFIED="1370196501385">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Menu_Toolbar_Panel"/>
-<node TEXT="toolbars" ID="ID_566424244" CREATED="1370196501385" MODIFIED="1370196501385">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<node TEXT="Toolbars" FOLDED="true" ID="ID_1553060806" CREATED="1370196501385" MODIFIED="1370337193088">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<attribute NAME="name_ref" VALUE="menu_toolbars"/>
-<node TEXT="Menubar" ID="ID_1346534219" CREATED="1370196501386" MODIFIED="1370196501386">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MB_ToggleMenubarAction"/>
-</node>
-<node TEXT="Toolbar" ID="ID_1206782328" CREATED="1370196501386" MODIFIED="1370196501386">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="Icons toolbar" ID="ID_143509291" CREATED="1370196501386" MODIFIED="1370196501386">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleLeftToolbarAction"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="zoom" FOLDED="true" ID="ID_1867698846" CREATED="1370196501386" MODIFIED="1370196501386">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="zoom"/>
-<node TEXT="Zoom in" ID="ID_1106942969" CREATED="1370196501390" MODIFIED="1370196501390">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt UP"/>
-<attribute NAME="action" VALUE="ZoomInAction"/>
-</node>
-<node TEXT="Zoom out" ID="ID_1134494932" CREATED="1370196501390" MODIFIED="1370196501390">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt DOWN"/>
-<attribute NAME="action" VALUE="ZoomOutAction"/>
-</node>
-<node TEXT="Center selected node" ID="ID_22528557" CREATED="1370196501390" MODIFIED="1370196501390">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt C"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-</node>
-</node>
-<node TEXT="View settings" FOLDED="true" ID="ID_1103116018" CREATED="1370196501392" MODIFIED="1370196501392">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_viewmode"/>
-<attribute NAME="name_ref" VALUE="menu_viewmode"/>
-<node TEXT="Outline view" ID="ID_1018765753" CREATED="1370196501392" MODIFIED="1370196501392">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Rectangular selection" ID="ID_639449416" CREATED="1370196501392" MODIFIED="1370196501392">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowSelectionAsRectangleAction"/>
-</node>
-</node>
-<node TEXT="Tool tips" FOLDED="true" ID="ID_1032582897" CREATED="1370196501392" MODIFIED="1370196501392">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_hoverView"/>
-<attribute NAME="name_ref" VALUE="menu_hoverView"/>
-<node TEXT="Hide details" ID="ID_1817839558" CREATED="1370196501392" MODIFIED="1370196501392">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt F2"/>
-<attribute NAME="action" VALUE="ToggleDetailsAction"/>
-</node>
-</node>
-<node TEXT="AttributeView" FOLDED="true" ID="ID_878694972" CREATED="1370196501392" MODIFIED="1370196501392">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="AttributeView"/>
-<node TEXT="Node attributes" FOLDED="true" ID="ID_1140943197" CREATED="1370196501393" MODIFIED="1370196501393">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_displayAttributes"/>
-<attribute NAME="name_ref" VALUE="menu_displayAttributes"/>
-<node TEXT="Show selected attributes" ID="ID_1349655560" CREATED="1370196501393" MODIFIED="1370196501393">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="ShowSelectedAttributesAction"/>
-</node>
-<node TEXT="Show all attributes" ID="ID_722942122" CREATED="1370196501398" MODIFIED="1370196501398">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="ShowAllAttributesAction"/>
-</node>
-<node TEXT="Hide all attributes" ID="ID_861733585" CREATED="1370196501469" MODIFIED="1370196501469">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="HideAllAttributesAction"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Format" FOLDED="true" ID="ID_941939596" CREATED="1370196501470" MODIFIED="1370337222438">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="format"/>
-<attribute NAME="name_ref" VALUE="menu_format"/>
-<node TEXT="Manage Styles" FOLDED="true" ID="ID_489169381" CREATED="1370196501470" MODIFIED="1370196501470">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_manageStyles"/>
-<attribute NAME="name_ref" VALUE="menu_manageStyles"/>
-<node TEXT="Remove user defined style" ID="ID_1797684812" CREATED="1370196501470" MODIFIED="1370196501470">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE=""/>
-<attribute NAME="action" VALUE="DeleteUserStyleAction"/>
-</node>
-<node TEXT="Add level style" ID="ID_987121524" CREATED="1370196501470" MODIFIED="1370196501470">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewLevelStyleAction"/>
-</node>
-<node TEXT="Remove level style" ID="ID_1654784204" CREATED="1370196501470" MODIFIED="1370196501470">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="DeleteLevelStyleAction"/>
-</node>
-<node TEXT="New style from selection" ID="ID_1487933757" CREATED="1370196501482" MODIFIED="1370196501482">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewUserStyleAction"/>
-</node>
-<node TEXT="Manage conditional styles for node" ID="ID_1281236150" CREATED="1370196501482" MODIFIED="1370196501482">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ManageNodeConditionalStylesAction"/>
-</node>
-</node>
-<node TEXT="Copy format" ID="ID_1256349478" CREATED="1370196501487" MODIFIED="1370196501487">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt shift C"/>
-<attribute NAME="action" VALUE="FormatCopy"/>
-</node>
-<node TEXT="Paste format" ID="ID_1602936166" CREATED="1370196501488" MODIFIED="1370196501488">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt shift V"/>
-<attribute NAME="action" VALUE="FormatPaste"/>
-</node>
-<node TEXT="Node core" FOLDED="true" ID="ID_1878292210" CREATED="1370196501488" MODIFIED="1370196501488">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_coreFormat"/>
-<attribute NAME="name_ref" VALUE="menu_coreFormat"/>
-<node TEXT="Bold" ID="ID_562699633" CREATED="1370196501488" MODIFIED="1370196501488">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control B"/>
-<attribute NAME="action" VALUE="BoldAction"/>
-</node>
-<node TEXT="Italic" ID="ID_57037811" CREATED="1370196501488" MODIFIED="1370196501488">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control I"/>
-<attribute NAME="action" VALUE="ItalicAction"/>
-</node>
-<node TEXT="Larger font" ID="ID_1314391557" CREATED="1370196501501" MODIFIED="1370196501501">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control PLUS"/>
-<attribute NAME="action" VALUE="IncreaseNodeFontAction"/>
-</node>
-<node TEXT="Smaller font" ID="ID_422780926" CREATED="1370196501502" MODIFIED="1370196501502">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control MINUS"/>
-<attribute NAME="action" VALUE="DecreaseNodeFontAction"/>
-</node>
-<node TEXT="---" ID="ID_1782441557" CREATED="1370196501502" MODIFIED="1370196501502">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Node color..." ID="ID_1192363418" CREATED="1370196501502" MODIFIED="1370196501502">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt shift F"/>
-<attribute NAME="action" VALUE="NodeColorAction"/>
-</node>
-<node TEXT="Blend color" ID="ID_1154714207" CREATED="1370196501502" MODIFIED="1370196501502">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeColorBlendAction"/>
-</node>
-<node TEXT="Node background color..." ID="ID_503684710" CREATED="1370196501502" MODIFIED="1370196501502">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeBackgroundColorAction"/>
-</node>
-<node TEXT="---" ID="ID_1844938793" CREATED="1370196501507" MODIFIED="1370196501507">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Fork" ID="ID_916275363" CREATED="1370196501507" MODIFIED="1370196501507">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeShapeAction.fork"/>
-</node>
-<node TEXT="Bubble" ID="ID_264318710" CREATED="1370196501507" MODIFIED="1370196501507">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeShapeAction.bubble"/>
-</node>
-<node TEXT="---" ID="ID_721528911" CREATED="1370196501507" MODIFIED="1370196501507">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Remove format" ID="ID_872430761" CREATED="1370196501507" MODIFIED="1370196501507">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RemoveFormatAction"/>
-</node>
-</node>
-<node TEXT="Cloud properties" FOLDED="true" ID="ID_680662992" CREATED="1370196501508" MODIFIED="1370337239848">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="CloudProperties"/>
-<node TEXT="Cloud color..." ID="ID_520617030" CREATED="1370196501508" MODIFIED="1370196501508">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloudColorAction"/>
-</node>
-</node>
-<node TEXT="Edge properties" FOLDED="true" ID="ID_1540738912" CREATED="1370196501508" MODIFIED="1370337236313">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="EdgeProperties"/>
-<node TEXT="Styles" FOLDED="true" ID="ID_1151570828" CREATED="1370196501508" MODIFIED="1370196501508">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="styles"/>
-<attribute NAME="name_ref" VALUE="format_menu_edge_styles"/>
-<node TEXT="As parent" ID="ID_1750135519" CREATED="1370196501508" MODIFIED="1370196501508">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAsParentAction"/>
-</node>
-<node TEXT="Linear" ID="ID_1328810534" CREATED="1370196501508" MODIFIED="1370196501508">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.linear"/>
-</node>
-<node TEXT="Smoothly curved (bezier)" ID="ID_1036665923" CREATED="1370196501511" MODIFIED="1370196501511">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.bezier"/>
-</node>
-<node TEXT="Sharp linear" ID="ID_720258787" CREATED="1370196501511" MODIFIED="1370196501511">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.sharp_linear"/>
-</node>
-<node TEXT="Sharply curved (bezier)" ID="ID_501772397" CREATED="1370196501511" MODIFIED="1370196501511">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.sharp_bezier"/>
-</node>
-<node TEXT="Horizontal" ID="ID_1858243750" CREATED="1370196501512" MODIFIED="1370196501512">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.horizontal"/>
-</node>
-<node TEXT="Hide edge" ID="ID_496774124" CREATED="1370196501512" MODIFIED="1370196501512">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeStyleAction.hide_edge"/>
-</node>
-</node>
-<node TEXT="widths" FOLDED="true" ID="ID_417875680" CREATED="1370196501512" MODIFIED="1370196501512">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="widths"/>
-<attribute NAME="name_ref" VALUE="format_menu_edge_widths"/>
-<node TEXT="Parent" ID="ID_665198255" CREATED="1370196501512" MODIFIED="1370196501512">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_width_parent"/>
-</node>
-<node TEXT="Thin" ID="ID_1293845557" CREATED="1370196501512" MODIFIED="1370196501512">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_width_thin"/>
-</node>
-<node TEXT="1" OBJECT="java.lang.Long|1" ID="ID_87819819" CREATED="1370196501512" MODIFIED="1370337248602">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_1"/>
-</node>
-<node TEXT="2" OBJECT="java.lang.Long|2" ID="ID_121140983" CREATED="1370196501512" MODIFIED="1370337249446">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_2"/>
-</node>
-<node TEXT="4" OBJECT="java.lang.Long|4" ID="ID_909658892" CREATED="1370196501513" MODIFIED="1370337251851">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_4"/>
-</node>
-<node TEXT="8" OBJECT="java.lang.Long|8" ID="ID_609459319" CREATED="1370196501513" MODIFIED="1370337253325">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="EdgeWidthAction_8"/>
-</node>
-</node>
-<node TEXT="Edge color..." ID="ID_568123634" CREATED="1370196501513" MODIFIED="1370196501513">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt shift E"/>
-<attribute NAME="action" VALUE="EdgeColorAction"/>
-</node>
-</node>
-<node TEXT="Set node width limits" ID="ID_219822382" CREATED="1370196501513" MODIFIED="1370196501513">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NodeWidthAction"/>
-</node>
-</node>
-<node TEXT="Navigate" FOLDED="true" ID="ID_101184743" CREATED="1370196501513" MODIFIED="1370337347567">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="navigate"/>
-<attribute NAME="name_ref" VALUE="menu_navigate"/>
-<node TEXT="navigate" FOLDED="true" ID="ID_1999881987" CREATED="1370196501517" MODIFIED="1370196501517">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="navigate"/>
-<node TEXT="folding" FOLDED="true" ID="ID_143345870" CREATED="1370196501517" MODIFIED="1370196501517">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="folding"/>
-<node TEXT="(Un)fold" ID="ID_482999007" CREATED="1370196501517" MODIFIED="1370196501517">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="SPACE"/>
-<attribute NAME="action" VALUE="ToggleFoldedAction"/>
-</node>
-<node TEXT="Show next child" ID="ID_275223124" CREATED="1370196501517" MODIFIED="1370196501517">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowNextChildAction"/>
-<attribute NAME="accelerator" VALUE="shift SPACE"/>
-</node>
-<node TEXT="(Un)fold children" ID="ID_1154243434" CREATED="1370196501517" MODIFIED="1370196501517">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control SPACE"/>
-<attribute NAME="action" VALUE="ToggleChildrenFoldedAction"/>
-</node>
-</node>
-</node>
-<node TEXT="Select all visible nodes" ID="ID_1348970027" CREATED="1370196501517" MODIFIED="1370196501517">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control A"/>
-<attribute NAME="action" VALUE="SelectAllAction"/>
-</node>
-<node TEXT="Select visible branch" ID="ID_1030191991" CREATED="1370196501522" MODIFIED="1370196501522">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift A"/>
-<attribute NAME="action" VALUE="SelectBranchAction"/>
-</node>
-</node>
-<node TEXT="Maps" FOLDED="true" ID="ID_209260093" CREATED="1370196501522" MODIFIED="1370196501522">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="name_ref" VALUE="mindmaps"/>
-<node TEXT="Modes" ID="ID_977155192" CREATED="1370196501523" MODIFIED="1370196501523">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_modes"/>
-<attribute NAME="name" VALUE="modes"/>
-</node>
-<node TEXT="navigate" ID="ID_750097311" CREATED="1370196501523" MODIFIED="1370196501523">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_navigate_maps"/>
-<attribute NAME="name" VALUE="navigate"/>
-</node>
-<node TEXT="Maps" ID="ID_608790987" CREATED="1370196501524" MODIFIED="1370196501524">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_mindmaps"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-</node>
-</node>
-</node>
-<node TEXT="map_popup" FOLDED="true" POSITION="right" ID="ID_1115053132" CREATED="1370196501528" MODIFIED="1370196501528">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="map_popup"/>
-<node TEXT="Menubar" ID="ID_1888358029" CREATED="1370196501528" MODIFIED="1370196501528">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MP_ToggleMenubarAction"/>
-</node>
-<node TEXT="Toolbar" ID="ID_797599307" CREATED="1370196501528" MODIFIED="1370196501528">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="Icons toolbar" ID="ID_1056809148" CREATED="1370196501528" MODIFIED="1370196501528">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleLeftToolbarAction"/>
-</node>
-<node TEXT="Outline view" ID="ID_428113025" CREATED="1370196501528" MODIFIED="1370196501528">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Center selected node" ID="ID_1988508334" CREATED="1370196501528" MODIFIED="1370196501528">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-</node>
-</node>
-<node TEXT="node_popup" FOLDED="true" POSITION="right" ID="ID_1356522776" CREATED="1370196501529" MODIFIED="1370196501529">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="node_popup"/>
-<node TEXT="Edit node details in dialog" ID="ID_1010190057" CREATED="1370196501529" MODIFIED="1370196501529">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditDetailsInDialogAction"/>
-</node>
-<node TEXT="Edit node details in-line" ID="ID_54257149" CREATED="1370196501529" MODIFIED="1370196501529">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditDetailsAction"/>
-</node>
-<node TEXT="Remove node details" ID="ID_1207276165" CREATED="1370196501529" MODIFIED="1370196501529">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="DeleteDetailsAction"/>
-</node>
-<node TEXT="Edit note in dialog" ID="ID_1901787539" CREATED="1370196501529" MODIFIED="1370196501529">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditNoteInDialogAction"/>
-</node>
-<node TEXT="Edit attribute in-line" ID="ID_1390671748" CREATED="1370196501529" MODIFIED="1370196501529">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt F9"/>
-<attribute NAME="action" VALUE="EditAttributesAction"/>
-</node>
-<node TEXT="Add / remove cloud (default)" ID="ID_1086573" CREATED="1370196501529" MODIFIED="1370196501529">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift B"/>
-<attribute NAME="action" VALUE="CloudAction"/>
-</node>
-<node TEXT="New style from selection" ID="ID_1942121087" CREATED="1370196501529" MODIFIED="1370196501529">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NewUserStyleAction"/>
-</node>
-<node TEXT="Remove user defined style" ID="ID_1232163939" CREATED="1370196501529" MODIFIED="1370196501529">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="DeleteUserStyleAction"/>
-</node>
-</node>
-<node TEXT="main_toolbar" FOLDED="true" POSITION="right" ID="ID_1378903618" CREATED="1370196501536" MODIFIED="1370196501536">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="main_toolbar"/>
-<node TEXT="undo" FOLDED="true" ID="ID_460145169" CREATED="1370196501537" MODIFIED="1370196501537">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="undo"/>
-<node TEXT="OK" ID="ID_383730707" CREATED="1370196501537" MODIFIED="1370196501537">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="styledialog.ok"/>
-</node>
-<node TEXT="Cancel" ID="ID_744922979" CREATED="1370196501537" MODIFIED="1370196501537">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="styledialog.cancel"/>
-</node>
-<node TEXT="Undo" ID="ID_1603407980" CREATED="1370196501537" MODIFIED="1370196501537">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UndoAction"/>
-</node>
-<node TEXT="Redo" ID="ID_1673787496" CREATED="1370196501537" MODIFIED="1370196501537">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RedoAction"/>
-</node>
-</node>
-<node TEXT="toolbar_styles" ID="ID_638132771" CREATED="1370196501537" MODIFIED="1370196501537">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbar_styles"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_style"/>
-</node>
-<node TEXT="Font" FOLDED="true" ID="ID_882341728" CREATED="1370196501538" MODIFIED="1370196501538">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_font"/>
-<attribute NAME="name" VALUE="font"/>
-<node TEXT="toolbar_fonts" ID="ID_837332243" CREATED="1370196501538" MODIFIED="1370196501538">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbar_fonts"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_font_name"/>
-</node>
-<node TEXT="toolbar_fonts" ID="ID_1821294970" CREATED="1370196501538" MODIFIED="1370196501538">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbar_fonts"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_font_size"/>
-</node>
-<node TEXT="Bold" ID="ID_59998587" CREATED="1370196501548" MODIFIED="1370196501548">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="BoldAction"/>
-</node>
-<node TEXT="Italic" ID="ID_543819632" CREATED="1370196501549" MODIFIED="1370196501549">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ItalicAction"/>
-</node>
-</node>
-<node TEXT="clouds" FOLDED="true" ID="ID_312159840" CREATED="1370196501549" MODIFIED="1370196501549">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="clouds"/>
-<node TEXT="Add / remove cloud (default)" ID="ID_282977218" CREATED="1370196501549" MODIFIED="1370196501549">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloudAction"/>
-</node>
-<node TEXT="Cloud color..." ID="ID_1199839094" CREATED="1370196501549" MODIFIED="1370196501549">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CloudColorAction"/>
-</node>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane/resources/xslt/exportmm2appletmm.xsl b/freeplane/resources/xslt/exportmm2appletmm.xsl
deleted file mode 100644
index b9cac66..0000000
--- a/freeplane/resources/xslt/exportmm2appletmm.xsl
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" standalone="no" ?>
- <!--
- MINDMAPEXPORTFILTER mm Freeplane 1.1
- -->
-
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="xml" indent="yes" encoding="us-ascii" omit-xml-declaration="yes"/>
-
-<xsl:template match="conditional_styles"/>
-<xsl:template match="map_styles"/>
-<xsl:template match="map">
- <map version="0.9.0">
- <xsl:apply-templates select="node()"/>
- </map>
-</xsl:template>
-
-<xsl:template match="@*|node()">
- <xsl:copy>
- <xsl:apply-templates select="@*|node()"/>
- </xsl:copy>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/freeplane2applet.xsl b/freeplane/resources/xslt/freeplane2applet.xsl
index 17698d2..1f673fb 100644
--- a/freeplane/resources/xslt/freeplane2applet.xsl
+++ b/freeplane/resources/xslt/freeplane2applet.xsl
@@ -57,28 +57,38 @@ html { height:100% }
</style>
</head>
<body>
- <xsl:text disable-output-escaping="yes"><script src="</xsl:text>
- <xsl:value-of select="$destination_dir"/>
- <xsl:text disable-output-escaping="yes">deployJava.js"></script></xsl:text>
- <script><xsl:text disable-output-escaping="yes">
- var attributes = {
- code:"org.freeplane.main.applet.FreeplaneApplet", width:"100%", height:"100%"} ;
- var parameters = {
- jnlp_href: "</xsl:text>
- <xsl:value-of select="$destination_dir"/>
- <xsl:text disable-output-escaping="yes">freeplane_applet.jnlp",
- browsemode_initial_map:"./</xsl:text>
- <xsl:value-of select="$destination_dir"/>
- <xsl:text disable-output-escaping="yes">map.mm",
- selection_method:"selection_method_direct"
- } ;
- parameters["location_href"] = window.location.href;
- </xsl:text>
- <xsl:call-template name="appletParameters">
+ <xsl:element name="applet">
+ <xsl:attribute name="code">org.freeplane.main.applet.FreeplaneApplet.class</xsl:attribute>
+ <xsl:attribute name="archive">
+ <xsl:text>./</xsl:text>
+ <xsl:value-of select="$destination_dir"/>
+ <xsl:text>./freeplaneviewer.jar</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="width">100%</xsl:attribute>
+ <xsl:attribute name="height">100%</xsl:attribute>
+ <xsl:element name="param">
+ <xsl:attribute name="name">jnlp_href</xsl:attribute>
+ <xsl:attribute name="value">
+ <xsl:text>./</xsl:text>
+ <xsl:value-of select="$destination_dir"/>
+ <xsl:text>./freeplane_applet.jnlp</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ <xsl:element name="param">
+ <xsl:attribute name="name">browsemode_initial_map</xsl:attribute>
+ <xsl:attribute name="value">./<xsl:value-of select="$destination_dir"/>map.mm</xsl:attribute>
+ </xsl:element>
+ <param name="selection_method" value="selection_method_direct"/>
+ <param name="codebase_lookup" value="false"/>
+ <xsl:element name="script">
+ <xsl:text>document.write("</xsl:text>
+ <xsl:text disable-output-escaping="yes"><param name='location_href' value='" + window.location.href +"'/></xsl:text>
+ <xsl:text>");</xsl:text>
+ </xsl:element>
+ <xsl:call-template name="appletParameters">
<xsl:with-param name="propertyList" select="$propertyList"/>
- </xsl:call-template>
- deployJava.runApplet(attributes, parameters, "1.5");
- </script>
+ </xsl:call-template>
+ </xsl:element>
</body>
</html>
</xsl:template>
@@ -123,11 +133,10 @@ html { height:100% }
<xsl:param name="name"/>
<xsl:param name="value"/>
<xsl:if test="$value">
- <xsl:text disable-output-escaping="yes">parameters["</xsl:text>
- <xsl:value-of select="$name"/>
- <xsl:text disable-output-escaping="yes">"] = "</xsl:text>
- <xsl:value-of select="$value"/>
- <xsl:text disable-output-escaping="yes">"</xsl:text>;
+ <xsl:element name="param">
+ <xsl:attribute name="name"><xsl:value-of select="$name"/></xsl:attribute>
+ <xsl:attribute name="value"><xsl:value-of select="$value"/></xsl:attribute>
+ </xsl:element>
</xsl:if>
</xsl:template>
diff --git a/freeplane/resources/xslt/mm2menu.xsl b/freeplane/resources/xslt/mm2menu.xsl
deleted file mode 100644
index 2f657ee..0000000
--- a/freeplane/resources/xslt/mm2menu.xsl
+++ /dev/null
@@ -1,75 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!---
-
-xsltproc freeplane/resources/xslt/mm2menu.xsl \
- freeplane/resources/xml/mindmapmodemenu.mm \
- > freeplane/resources/xml/mindmapmodemenu.xml
-
--->
-
-<xsl:stylesheet version="1.0"
- xmlns="http://freeplane.sf.net/ui/menu/1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml" version="1.0" indent="yes"
- encoding="UTF-8" omit-xml-declaration="no" />
- <xsl:strip-space elements="*" />
-
- <xsl:template match="map">
- <menu_structure>
- <xsl:comment>
-
-This file was generated automatically from a mindmap.
-Do not edit this file, edit the original mindmap instead.
-
- </xsl:comment>
- <xsl:apply-templates select="*"/>
- </menu_structure>
- </xsl:template>
-
-
- <xsl:template name="gen_node">
- <xsl:element name="menu_{attribute[@NAME='type']/@VALUE}">
- <xsl:for-each select="attribute[not(@NAME='type')]">
- <xsl:attribute name="{@NAME}">
- <xsl:value-of select="@VALUE" />
- </xsl:attribute>
- </xsl:for-each>
- <xsl:apply-templates select="*"/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="node[attribute]">
- <xsl:call-template name="gen_node" />
- </xsl:template>
-
- <xsl:template match="node[attribute[@NAME='type' and @VALUE='--ignore--']]">
- </xsl:template>
-
- <xsl:template match="node[attribute[@NAME='type' and @VALUE='category']]">
- <xsl:call-template name="gen_node" />
- </xsl:template>
-
- <xsl:template match="node[attribute[@NAME='type' and @VALUE='submenu']]">
- <xsl:call-template name="gen_node" />
- </xsl:template>
-
- <xsl:template match="node[attribute[@NAME='type' and @VALUE='action']]">
- <xsl:call-template name="gen_node" />
- </xsl:template>
-
- <xsl:template match="node[attribute[@NAME='type' and @VALUE='radio_action']]">
- <xsl:call-template name="gen_node" />
- </xsl:template>
-
-
- <xsl:template match="node[attribute[@NAME='type' and @VALUE='separator']]">
- <xsl:call-template name="gen_node" />
- </xsl:template>
-
-
- <xsl:template match="richcontent">
- <!-- suppress outputting richcontent nodes -->
- </xsl:template>
-
-</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/mm2preferences.xsl b/freeplane/resources/xslt/mm2preferences.xsl
deleted file mode 100644
index 07cc3b1..0000000
--- a/freeplane/resources/xslt/mm2preferences.xsl
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!---
-
-xsltproc freeplane/ant/mm2preferences.xsl \
- freeplane/resources/xml/preferences.mm \
- > freeplane/resources/xml/preferences.xml
-
--->
-
-<xsl:stylesheet version="1.0"
- xmlns="http://freeplane.sf.net/ui/preferences/1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
-
- <xsl:output method="xml" version="1.0" indent="yes"
- encoding="UTF-8" omit-xml-declaration="no" />
- <xsl:strip-space elements="*" />
-
- <xsl:template match="map">
- <preferences_structure>
- <xsl:comment>
-
-This file was generated automatically from a mindmap.
-Do not edit this file, edit the original mindmap instead.
-
- </xsl:comment>
- <tabbed_pane>
- <xsl:apply-templates select="*"/>
- </tabbed_pane>
- </preferences_structure>
- </xsl:template>
-
-
- <xsl:template name="gen_node">
- <xsl:param name="set_name_attr" select="true()"/>
- <xsl:element name="{attribute[@NAME='type']/@VALUE}">
- <xsl:if test="$set_name_attr">
- <xsl:attribute name="name">
- <xsl:value-of select="attribute[@NAME='name']/@VALUE" />
- </xsl:attribute>
- </xsl:if>
- <xsl:for-each select="attribute[not(@NAME='type' or @NAME='name')]">
- <xsl:attribute name="{@NAME}">
- <xsl:value-of select="@VALUE" />
- </xsl:attribute>
- </xsl:for-each>
- <xsl:apply-templates select="*"/>
- </xsl:element>
- </xsl:template>
-
- <xsl:template match="node[attribute]">
- <xsl:call-template name="gen_node">
- </xsl:call-template>
- </xsl:template>
-
- <xsl:template match="node[attribute[@NAME='type' and @VALUE='--ignore--']]">
- </xsl:template>
-
- <xsl:template match="node[attribute[@NAME='type' and @VALUE='choice']]">
- <xsl:call-template name="gen_node">
- <xsl:with-param name="set_name_attr" select="false()" />
- </xsl:call-template>
- </xsl:template>
-
-
- <xsl:template match="richcontent">
- <!-- suppress outputting richcontent nodes -->
- </xsl:template>
-
-</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/opml2mm.xsl b/freeplane/resources/xslt/opml2mm.xsl
index 3f80e8c..55ac8f1 100644
--- a/freeplane/resources/xslt/opml2mm.xsl
+++ b/freeplane/resources/xslt/opml2mm.xsl
@@ -69,4 +69,4 @@
</xsl:otherwise>
</xsl:choose>
</xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
+</xsl:stylesheet>
diff --git a/freeplane/resources/xslt/xml2mm.xsl b/freeplane/resources/xslt/xml2mm.xsl
new file mode 100644
index 0000000..51291aa
--- /dev/null
+++ b/freeplane/resources/xslt/xml2mm.xsl
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+ <xsl:output method="xml" version="1.0" indent="yes"
+ encoding="ascii" omit-xml-declaration="yes" />
+ <xsl:strip-space elements="*" />
+
+ <xsl:template match="/">
+ <map version="freeplane 1.5.5">
+ <xsl:apply-templates select="node()" />
+ </map>
+ </xsl:template>
+ <xsl:template match="*">
+ <xsl:element name="node">
+ <xsl:attribute name="TEXT">
+ <xsl:value-of select="name()" />
+ </xsl:attribute>
+ <xsl:apply-templates select="@*" />
+ <xsl:if test="not(ancestor::*)">
+ <hook NAME="MapStyle" background="#ffffff">
+ <properties show_icon_for_attributes="false"
+ fit_to_viewport="false;" />
+
+ <map_styles>
+ <stylenode LOCALIZED_TEXT="styles.root_node" STYLE="oval"
+ UNIFORM_SHAPE="true" VGAP_QUANTITY="24.0 pt">
+ <font SIZE="24" />
+ <stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right"
+ STYLE="bubble">
+ <stylenode LOCALIZED_TEXT="default" COLOR="#000000"
+ FORMAT="NO_FORMAT"
+ STYLE="bubble" SHAPE_HORIZONTAL_MARGIN="3.0 px"
+ SHAPE_VERTICAL_MARGIN="2.0 px" MAX_WIDTH_QUANTITY="240 pt"
+ MIN_WIDTH_QUANTITY="240 pt" VGAP_QUANTITY="2.0 px">
+ <font NAME="Arial" SIZE="8" BOLD="false" ITALIC="false" />
+ </stylenode>
+ </stylenode>
+ </stylenode>
+ </map_styles>
+ </hook>
+ <xsl:for-each select="namespace::*">
+ <xsl:if test="string() != 'http://www.w3.org/XML/1998/namespace'">
+ <attribute_layout NAME_WIDTH="50 pt" VALUE_WIDTH="180 pt" />
+ <xsl:element name="attribute">
+ <xsl:attribute name="NAME">
+ <xsl:text>xmlns</xsl:text>
+ <xsl:if test="name() != ''">
+ <xsl:text>:</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="name()" />
+ </xsl:attribute>
+ <xsl:attribute name="VALUE">
+ <xsl:value-of select="string()" />
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:if>
+ </xsl:for-each>
+ </xsl:if>
+ <xsl:apply-templates select="node()|text()" />
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="@*">
+ <attribute_layout NAME_WIDTH="50 pt" VALUE_WIDTH="180 pt" />
+ <xsl:element name="attribute">
+ <xsl:attribute name="NAME">
+ <xsl:value-of select="name()" />
+ </xsl:attribute>
+ <xsl:attribute name="VALUE">
+ <xsl:value-of select="string()" />
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:template>
+
+ <xsl:template match="text()">
+ <xsl:element name="node">
+ <xsl:attribute name="TEXT">
+ <xsl:text>"</xsl:text>
+ <xsl:call-template name="string-trim">
+ <xsl:with-param name="string" select="." />
+ </xsl:call-template>
+ <xsl:text>"</xsl:text>
+ </xsl:attribute>
+ </xsl:element>
+ </xsl:template>
+
+<xsl:variable name="whitespace" select="'
'" />
+
+<!-- Strips trailing whitespace characters from 'string' -->
+<xsl:template name="string-rtrim">
+ <xsl:param name="string" />
+ <xsl:param name="trim" select="$whitespace" />
+
+ <xsl:variable name="length" select="string-length($string)" />
+
+ <xsl:if test="$length > 0">
+ <xsl:choose>
+ <xsl:when test="contains($trim, substring($string, $length, 1))">
+ <xsl:call-template name="string-rtrim">
+ <xsl:with-param name="string" select="substring($string, 1, $length - 1)" />
+ <xsl:with-param name="trim" select="$trim" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<!-- Strips leading whitespace characters from 'string' -->
+<xsl:template name="string-ltrim">
+ <xsl:param name="string" />
+ <xsl:param name="trim" select="$whitespace" />
+
+ <xsl:if test="string-length($string) > 0">
+ <xsl:choose>
+ <xsl:when test="contains($trim, substring($string, 1, 1))">
+ <xsl:call-template name="string-ltrim">
+ <xsl:with-param name="string" select="substring($string, 2)" />
+ <xsl:with-param name="trim" select="$trim" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$string" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:if>
+</xsl:template>
+
+<!-- Strips leading and trailing whitespace characters from 'string' -->
+<xsl:template name="string-trim">
+ <xsl:param name="string" />
+ <xsl:param name="trim" select="$whitespace" />
+ <xsl:call-template name="string-rtrim">
+ <xsl:with-param name="string">
+ <xsl:call-template name="string-ltrim">
+ <xsl:with-param name="string" select="$string" />
+ <xsl:with-param name="trim" select="$trim" />
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="trim" select="$trim" />
+ </xsl:call-template>
+</xsl:template>
+
+</xsl:stylesheet>
+
diff --git a/freeplane/signjar.gradle b/freeplane/signjar.gradle
new file mode 100644
index 0000000..40b285f
--- /dev/null
+++ b/freeplane/signjar.gradle
@@ -0,0 +1,51 @@
+def signJarProperties = file('signjar.properties')
+
+Properties props = new Properties()
+if (signJarProperties.exists())
+{
+ props.load(new FileInputStream(signJarProperties))
+}
+
+task signViewerJarTsa {
+ onlyIf { props['signjar.alias'] && props['signjar.tsaurl'] }
+ doLast {
+ def freeplaneViewerJar = files(viewerJar).getSingleFile()
+ ant.signjar(jar: freeplaneViewerJar,
+ alias: props['signjar.alias'],
+ keystore: props['signjar.keystore'],
+ storetype: props['signjar.storetype'],
+ storepass: props['signjar.storepass'],
+ keypass: props['signjar.keypass'],
+ tsaurl: props['signjar.tsaurl'])
+ }
+ dependsOn viewerJar
+}
+
+task signViewerJarNoTsa {
+ onlyIf { props['signjar.alias'] && !props['signjar.tsaurl'] }
+ doLast {
+ def freeplaneViewerJar = files(viewerJar).getSingleFile()
+ ant.signjar(jar: freeplaneViewerJar,
+ alias: props['signjar.alias'],
+ keystore: props['signjar.keystore'],
+ storetype: props['signjar.storetype'],
+ storepass: props['signjar.storepass'],
+ keypass: props['signjar.keypass'])
+ }
+ dependsOn viewerJar
+}
+
+task doNotSignViewerJar {
+ onlyIf { !props['signjar.alias'] }
+ doLast {
+ println('No ' + rootDir.path + '/freeplane/signjar.properties found')
+ println('Applet is NOT signed!')
+ println('(see ' + rootDir.path + '/freeplane/signjar-example.properties)')
+ }
+ dependsOn viewerJar
+}
+
+// exactly one of three is always enabled (see above)!
+copyOSGiJars.dependsOn signViewerJarTsa
+copyOSGiJars.dependsOn signViewerJarNoTsa
+copyOSGiJars.dependsOn doNotSignViewerJar
diff --git a/freeplane/src/com/thebuzzmedia/imgscalr/AsyncScalr.java b/freeplane/src/com/thebuzzmedia/imgscalr/AsyncScalr.java
deleted file mode 100644
index 1c0b0e3..0000000
--- a/freeplane/src/com/thebuzzmedia/imgscalr/AsyncScalr.java
+++ /dev/null
@@ -1,426 +0,0 @@
-package com.thebuzzmedia.imgscalr;
-
-import java.awt.image.BufferedImage;
-import java.awt.image.BufferedImageOp;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import com.thebuzzmedia.imgscalr.Scalr.Method;
-import com.thebuzzmedia.imgscalr.Scalr.Mode;
-import com.thebuzzmedia.imgscalr.Scalr.Rotation;
-
-/**
- * Class used to provide the asynchronous versions of all the methods defined in
- * {@link Scalr} for the purpose of offering more control over the scaling and
- * ordering of a large number of scale operations.
- * <p/>
- * Given that image-scaling operations, especially when working with large
- * images, can be very hardware-intensive (both CPU and memory), in large-scale
- * deployments (e.g. a busy web application) it becomes increasingly important
- * that the scale operations performed by imgscalr be manageable so as not to
- * fire off too many simultaneous operations that the JVM's heap explodes and
- * runs out of memory.
- * <p/>
- * Up until now it was left to the caller to implement their own serialization
- * or limiting logic to handle these use-cases, but it was determined that this
- * requirement be common enough that it should be integrated directly into the
- * imgscalr library for everyone to benefit from.
- * <p/>
- * Every method in this class wraps the mirrored calls in the {@link Scalr}
- * class in new {@link Callable} instances that are submitted to an internal
- * {@link ExecutorService} for execution at a later date. A {@link Future} is
- * returned to the caller representing the task that will perform the scale
- * operation. {@link Future#get()} or {@link Future#get(long, TimeUnit)} can be
- * used to block on the returned <code>Future</code>, waiting for the scale
- * operation to complete and return the resultant {@link BufferedImage}.
- * <p/>
- * This design provides the following features:
- * <ul>
- * <li>Non-blocking, asynchronous scale operations that can continue execution
- * while waiting on the scaled result.</li>
- * <li>Serialize all scale requests down into a maximum number of
- * <em>simultaneous</em> scale operations with no additional/complex logic. The
- * number of simultaneous scale operations is caller-configurable so as best to
- * optimize the host system (e.g. 1 scale thread per core).</li>
- * <li>No need to worry about overloading the host system with too many scale
- * operations, they will simply queue up in this class and execute in-order.</li>
- * <li>Synchronous/blocking behavior can still be achieved by calling
- * <code>get()</code> or <code>get(long, TimeUnit)</code> immediately on the
- * returned {@link Future} from any of the methods below.</li>
- * </ul>
- *
- * This class also allows callers to provide their own (custom)
- * {@link ExecutorService} for processing scale operations for maximum
- * flexibility; otherwise this class utilizes a fixed {@link ThreadPoolExecutor}
- * via {@link Executors#newFixedThreadPool(int)} that will create the given
- * number of threads and let them sit idle, waiting for work.
- * <h3>Performance</h3>
- * When tuning this class for optimal performance, benchmarking your particular
- * hardware is the best approach. For some rough guidelines though, there are
- * two resources you want to watch closely:
- * <ol>
- * <li>JVM Heap Memory (Assume physical machine memory is always sufficiently
- * large)</li>
- * <li># of CPU Cores</li>
- * </ol>
- * You never want to allocate more scaling threads than you have CPU cores and
- * on a sufficiently busy host where some of the cores may be busy running a
- * database or a web server, you will want to allocate even less scaling
- * threads.
- * <p/>
- * So as a maximum you would never want more scaling threads than CPU cores in
- * any situation and less so on a busy server.
- * <p/>
- * If you allocate more threads than you have available CPU cores, your scaling
- * operations will slow down as the CPU will spend a considerable amount of time
- * context-switching between threads on the same core trying to finish all the
- * tasks in parallel. You might still be tempted to do this because of the I/O
- * delay some threads will encounter reading images off disk, but when you do
- * your own benchmarking you'll likely find (as I did) that the actual disk I/O
- * necessary to pull the image data off disk is a much smaller portion of the
- * execution time than the actual scaling operations.
- * <p/>
- * If you are executing on a storage medium that is unexpectedly slow and I/O is
- * a considerable portion of the scaling operation, feel free to try using more
- * threads than CPU cores to see if that helps; but in most normal cases, it
- * will only slow down all other parallel scaling operations.
- * <p/>
- * As for memory, every time an image is scaled it is decoded into a
- * {@link BufferedImage} and stored in the JVM Heap space (decoded image
- * instances are always larger than the source images on-disk). For larger
- * images, that can use up quite a bit of memory. You will need to benchmark
- * your particular use-cases on your hardware to get an idea of where the sweet
- * spot is for this; if you are operating within tight memory bounds, you may
- * want to limit simultaneous scaling operations to 1 or 2 regardless of the
- * number of cores just to avoid having too many {@link BufferedImage} instances
- * in JVM Heap space at the same time.
- * <p/>
- * These are rough metrics and behaviors to give you an idea of how best to tune
- * this class for your deployment, but nothing can replacement writing a small
- * Java class that scales a handful of images in a number of different ways and
- * testing that directly on your deployment hardware. *
- * <h3>Resource Overhead</h3>
- * The {@link ExecutorService} utilized by this class won't be initialized until
- * the class is referenced for the first time or explicitly set with one of the
- * setter methods. More specifically, if you have no need for asynchronous image
- * processing offered by this class, you don't need to worry about wasted
- * resources or hanging/idle threads as they will never be created if you never
- * reference this class.
- *
- * @author Riyad Kalla (software at thebuzzmedia.com)
- * @since 3.2
- */
-public class AsyncScalr {
- /**
- * Default thread count used to initialize the internal
- * {@link ExecutorService} if a count isn't specified via
- * {@link #setServiceThreadCount(int)} before this class is used.
- * <p/>
- * Default value is <code>2</code>.
- */
- public static final int DEFAULT_THREAD_COUNT = 2;
-
- private static ExecutorService service;
-
- /**
- * Used to init the internal service with a 2-threaded, fixed thread pool if
- * a custom one is not specified with either of the <code>init</code>
- * methods.
- */
- static {
- setServiceThreadCount(DEFAULT_THREAD_COUNT);
- }
-
- /**
- * Used to get access to the internal {@link ExecutorService} used by this
- * class to process scale operations.
- * <p/>
- * <strong>NOTE</strong>: You will need to explicitly shutdown any service
- * currently set on this class before the host JVM exits <em>unless</em> you
- * have passed in a custom {@link ExecutorService} that specifically
- * creates/uses daemon threads (which will exit immediately).
- * <p/>
- * You can call {@link ExecutorService#shutdown()} to wait for all scaling
- * operations to complete first or call
- * {@link ExecutorService#shutdownNow()} to kill any in-process operations
- * and purge all pending operations before exiting.
- *
- * @return the current {@link ExecutorService} used by this class to process
- * scale operations.
- */
- public static ExecutorService getService() {
- return service;
- }
-
- /**
- * Used to initialize the internal {@link ExecutorService} which runs tasks
- * generated by this class with the given service.
- * <p/>
- * <strong>NOTE</strong>: This operation will call
- * {@link ExecutorService#shutdown()} on any existing
- * {@link ExecutorService} currently set on this class. This means this
- * operation will block until all pending (queued) scale operations are
- * completed.
- *
- * @param service
- * A specific {@link ExecutorService} instance that will be used
- * by this class to process scale operations.
- *
- * @throws IllegalArgumentException
- * if <code>service</code> is <code>null</code>.
- */
- public static void setService(ExecutorService service)
- throws IllegalArgumentException {
- if (service == null)
- throw new IllegalArgumentException(
- "service cannot be null; it must be a valid ExecutorService that can execute Callable tasks created by this class.");
-
- /*
- * Shutdown any existing service, waiting for the last scale ops to
- * finish first.
- */
- if (AsyncScalr.service != null) {
- AsyncScalr.service.shutdown();
- }
-
- AsyncScalr.service = service;
- }
-
- /**
- * Used to adjust the fixed number of threads (min/max) used by the internal
- * {@link ThreadPoolExecutor} to executor scale operations.
- * <p/>
- * The following logic is used when applying thread count changes using this
- * method:
- * <ol>
- * <li>If this is the first time the service is being initialized, a new
- * {@link ThreadPoolExecutor} is created with the given fixed number of
- * threads.</li>
- * <li>If a service has already been set and it is of type
- * {@link ThreadPoolExecutor} then the methods
- * {@link ThreadPoolExecutor#setCorePoolSize(int)} and
- * {@link ThreadPoolExecutor#setMaximumPoolSize(int)} are used to adjust the
- * current fixed size of the thread pool without destroying the executor and
- * creating a new one. This avoids unnecessary garbage for the GC and helps
- * keep the task queue intact.</li>
- * <li>If a service has already been set, but it is not of type
- * {@link ThreadPoolExecutor}, then it will be shutdown after all pending
- * tasks have completed and replaced with a new instance of type
- * {@link ThreadPoolExecutor} with the given number of fixed threads.</li>
- * </ol>
- *
- * In the case where an existing {@link ThreadPoolExecutor} thread count is
- * adjusted, if the given <code>threadCount</code> is smaller than the
- * current number of threads in the pool, the extra threads will only be
- * killed after they have completed their work and become idle. No scaling
- * operations will be interrupted.
- *
- * @param threadCount
- * The fixed number of threads (min/max) that the service will be
- * configured to use to process scale operations.
- *
- * @throws IllegalArgumentException
- * if <code>threadCount</code> is < 1.
- */
- public static void setServiceThreadCount(int threadCount)
- throws IllegalArgumentException {
- if (threadCount < 1)
- throw new IllegalArgumentException("threadCount [" + threadCount
- + "] must be > 0.");
-
- // Adjust the service if we can, otherwise replace it.
- if (AsyncScalr.service instanceof ThreadPoolExecutor) {
- ThreadPoolExecutor tpe = (ThreadPoolExecutor) AsyncScalr.service;
-
- // Set the new min/max thread counts for the pool.
- tpe.setCorePoolSize(threadCount);
- tpe.setMaximumPoolSize(threadCount);
- } else
- setService(Executors.newFixedThreadPool(threadCount));
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final int targetSize, final BufferedImageOp... ops)
- throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, targetSize, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Rotation rotation, final int targetSize,
- final BufferedImageOp... ops) throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, rotation, targetSize, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Method scalingMethod, final int targetSize,
- final BufferedImageOp... ops) throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, scalingMethod, targetSize, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Method scalingMethod, final Rotation rotation,
- final int targetSize, final BufferedImageOp... ops)
- throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, scalingMethod, rotation, targetSize,
- ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Mode resizeMode, final int targetSize,
- final BufferedImageOp... ops) throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, resizeMode, targetSize, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Mode resizeMode, final Rotation rotation,
- final int targetSize, final BufferedImageOp... ops)
- throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, resizeMode, rotation, targetSize, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Method scalingMethod, final Mode resizeMode,
- final int targetSize, final BufferedImageOp... ops)
- throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, scalingMethod, resizeMode, targetSize,
- ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Method scalingMethod, final Mode resizeMode,
- final Rotation rotation, final int targetSize,
- final BufferedImageOp... ops) throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, scalingMethod, resizeMode, rotation,
- targetSize, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final int targetWidth, final int targetHeight,
- final BufferedImageOp... ops) throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, targetWidth, targetHeight, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Rotation rotation, final int targetWidth,
- final int targetHeight, final BufferedImageOp... ops)
- throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, rotation, targetWidth, targetHeight,
- ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Method scalingMethod, final int targetWidth,
- final int targetHeight, final BufferedImageOp... ops) {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, scalingMethod, targetWidth,
- targetHeight, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Method scalingMethod, final Rotation rotation,
- final int targetWidth, final int targetHeight,
- final BufferedImageOp... ops) {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, scalingMethod, rotation, targetWidth,
- targetHeight, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Mode resizeMode, final int targetWidth,
- final int targetHeight, final BufferedImageOp... ops)
- throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, resizeMode, targetWidth, targetHeight,
- ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Mode resizeMode, final Rotation rotation,
- final int targetWidth, final int targetHeight,
- final BufferedImageOp... ops) throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, resizeMode, rotation, targetWidth,
- targetHeight, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Method scalingMethod, final Mode resizeMode,
- final int targetWidth, final int targetHeight,
- final BufferedImageOp... ops) throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, scalingMethod, resizeMode,
- targetWidth, targetHeight, ops);
- }
- });
- }
-
- public static Future<BufferedImage> resize(final BufferedImage src,
- final Method scalingMethod, final Mode resizeMode,
- final Rotation rotation, final int targetWidth,
- final int targetHeight, final BufferedImageOp... ops)
- throws IllegalArgumentException {
- return service.submit(new Callable<BufferedImage>() {
- public BufferedImage call() throws Exception {
- return Scalr.resize(src, scalingMethod, resizeMode, rotation,
- targetWidth, targetHeight, ops);
- }
- });
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/com/thebuzzmedia/imgscalr/Scalr.java b/freeplane/src/com/thebuzzmedia/imgscalr/Scalr.java
deleted file mode 100644
index 26cac59..0000000
--- a/freeplane/src/com/thebuzzmedia/imgscalr/Scalr.java
+++ /dev/null
@@ -1,1924 +0,0 @@
-/**
- * Copyright 2011 The Buzz Media, LLC
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * This file is modified by Dimitry Polivaev
- *
- */
-package com.thebuzzmedia.imgscalr;
-
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.RenderingHints;
-import java.awt.Transparency;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.AreaAveragingScaleFilter;
-import java.awt.image.BufferedImage;
-import java.awt.image.BufferedImageOp;
-import java.awt.image.ColorModel;
-import java.awt.image.ConvolveOp;
-import java.awt.image.IndexColorModel;
-import java.awt.image.Kernel;
-
-import javax.imageio.ImageIO;
-
-/**
- * Class used to implement performant, good-quality and intelligent image
- * scaling algorithms in native Java 2D. This class utilizes the Java2D
- * "best practices" for image-scaling, ensuring that images are hardware
- * accelerated at all times if provided by the platform and host-VM.
- * <p/>
- * Hardware acceleration also includes execution of optional caller-supplied
- * {@link BufferedImageOp}s that are applied to the resultant images before
- * returning them as well as any optional rotations specified.
- * <h3>Image Proportions</h3>
- * All scaling operations implemented by this class maintain the proportion of
- * the original image. If image-cropping is desired the caller will need to
- * perform those edits before calling one of the <code>resize</code> methods
- * provided by this class.
- * <p/>
- * In order to maintain the proportionality of the original images, this class
- * implements the following behavior:
- * <ol>
- * <li>If the image is LANDSCAPE-oriented or SQUARE, treat the
- * <code>targetWidth</code> as the primary dimension and re-calculate the
- * <code>targetHeight</code> regardless of what is passed in.</li>
- * <li>If image is PORTRAIT-oriented, treat the <code>targetHeight</code> as the
- * primary dimension and re-calculate the <code>targetWidth</code> regardless of
- * what is passed in.</li>
- * <li>If a {@link Mode} value of {@link Mode#FIT_TO_WIDTH} or
- * {@link Mode#FIT_TO_HEIGHT} is passed in to the <code>resize</code> method,
- * the image's orientation is ignored and the scaled image is fit to the
- * dimension the user specified with the {@link Mode}.</li>
- * </ol>
- * Recalculation of the secondary dimensions is extremely cheap and this
- * approach provides users with better expected-behavior from the library.
- * <h3>Image Quality</h3>
- * This class implements a few different methods for scaling an image, providing
- * either the best-looking result, the fastest result or a balanced result
- * between the two depending on the scaling hint provided (see {@link Method}).
- * <p/>
- * This class also implements the incremental scaling algorithm presented by
- * Chris Campbell in his <a href="http://today.java
- * .net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html">Perils of
- * Image.getScaledInstance()</a> article in order to give the best-looking
- * results to images scaled down below roughly 800px in size where using a
- * single scaling operation (even with
- * {@link RenderingHints#VALUE_INTERPOLATION_BICUBIC} interpolation) would
- * produce a much worse-looking result.
- * <p/>
- * Only when scaling using the {@link Method#AUTOMATIC} method will this class
- * look at the size of the image before selecting an approach to scaling the
- * image. If {@link Method#QUALITY} is specified, the best-looking algorithm
- * possible is always used.
- * <p/>
- * Minor modifications are made to Campbell's original implementation in the
- * form of:
- * <ol>
- * <li>Instead of accepting a user-supplied interpolation method,
- * {@link RenderingHints#VALUE_INTERPOLATION_BICUBIC} interpolation is always
- * used. This was done after A/B comparison testing with large images
- * down-scaled to thumbnail sizes showed noticeable "blurring" when BILINEAR
- * interpolation was used. Given that Campbell's algorithm is only used in
- * QUALITY mode when down-scaling, it was determined that the user's expectation
- * of a much less blurry picture would require that BICUBIC be the default
- * interpolation in order to meet the QUALITY expectation.</li>
- * <li>After each iteration of the do-while loop that incrementally scales the
- * source image down, an explicit effort is made to call
- * {@link BufferedImage#flush()} on the interim temporary {@link BufferedImage}
- * instances created by the algorithm in an attempt to ensure a more complete GC
- * cycle by the VM when cleaning up the temporary instances (this is in addition
- * to disposing of the temporary {@link Graphics2D} references as well).</li>
- * <li>Extensive comments have been added to increase readability of the code.</li>
- * <li>Variable names have been expanded to increase readability of the code.</li>
- * </ol>
- * <p/>
- * <strong>NOTE</strong>: This class does not call {@link BufferedImage#flush()}
- * on any of the <em>source images</em> passed in by calling code; it is up to
- * the original caller to dispose of their source images when they are no longer
- * needed so the VM can most efficiently GC them.
- * <h3>Generated Image Types</h3>
- * Java2D provides support for a number of different image types defined as
- * <code>BufferedImage.TYPE_*</code> variables, unfortunately not all image
- * types are supported equally in Java2D. Some more obscure image types either
- * have poor or no support, leading to severely degraded quality when an attempt
- * is made by imgscalr to create a scaled instance <em>of the same type</em> as
- * the source image.
- * <p/>
- * To avoid imgscalr generating significantly worse-looking results than
- * alternative scaling approaches (e.g.
- * {@link Image#getScaledInstance(int, int, int)}), all resultant images
- * generated by imgscalr are one of two types:
- * <ol>
- * <li>{@link BufferedImage#TYPE_INT_RGB}</li>
- * <li>{@link BufferedImage#TYPE_INT_ARGB}</li>
- * </ol>
- * depending on if the source image utilizes transparency or not.
- * <p/>
- * This is a recommended approach by the Java2D team for dealing with poorly (or
- * non) supported image types. More can be read about this issue <a href=
- * "http://www.mail-archive.com/java2d-interest@capra.eng.sun.com/msg05621.html"
- * >here</a>.
- * <h3>Logging</h3>
- * This class implements all its debug logging via the
- * {@link #log(String, Object...)} method. At this time logging is done directly
- * to <code>System.out</code> via the <code>printf</code> method. This allows
- * the logging to be light weight and easy to capture while adding no
- * dependencies to the library.
- * <p/>
- * Implementation of logging in this class is as efficient as possible; avoiding
- * any calls to the logger or passing of arguments if logging is not enabled to
- * avoid the (hidden) cost of constructing the Object[] argument for the varargs
- * method call.
- * <h3>GIF Transparency</h3>
- * Unfortunately in Java 6 and earlier, support for GIF's
- * {@link IndexColorModel} is sub-par, both in accurate color-selection and in
- * maintaining transparency when moving to an image of type
- * {@link BufferedImage#TYPE_INT_ARGB}; because of this issue when a GIF image
- * is processed by imgscalr and the result saved as a GIF file, it is possible
- * to lose the alpha channel of a transparent image or in the case of applying
- * an optional {@link BufferedImageOp}, lose the entire picture all together in
- * the result (long standing JDK bugs are filed for these).
- * <p/>
- * imgscalr currently does nothing to work around this manually because it is a
- * defect in the native platform code itself. Fortunately it looks like the
- * issues are half-fixed in Java 7 and any manual workarounds we could attempt
- * internally are relatively expensive, in the form of hand-creating and setting
- * RGB values pixel-by-pixel with a custom {@link ColorModel} in the scaled
- * image. This would lead to a very measurable negative impact on performance
- * without the caller understanding why.
- * <p>
- * <strong>Workaround</strong>: A workaround to this issue with all version of
- * Java is to simply save a GIF as a PNG; no change to your code needs to be
- * made except when the image is saved out, e.g. using {@link ImageIO}. When a
- * file type of "PNG" is used, both the transparency and high color quality will
- * be maintained as the PNG code path in Java2D is superior to the GIF
- * implementation.
- * <p>
- * If the issue with optional {@link BufferedImageOp}s destroying GIF image
- * content is ever fixed in the platform, saving out resulting images as GIFs
- * should suddenly start working.
- * <p>
- * More can be read about the issue <a
- * href="http://gman.eichberger.de/2007/07/transparent-gifs-in-java.html"
- * >here</a> and <a
- * href="http://ubuntuforums.org/archive/index.php/t-1060128.html">here</a>.
- *
- * @author Riyad Kalla (software at thebuzzmedia.com)
- * @since 1.1
- */
-public class Scalr {
- /**
- * Flag used to indicate if debugging output has been enabled by setting the
- * "imgscalr.debug" system property to <code>true</code>. This value will be
- * <code>false</code> if the "imgscalr.debug" system property is undefined
- * or set to <code>false</code>.
- * <p/>
- * This system property can be set on startup with:<br/>
- * <code>
- * -Dimgscalr.debug=true
- * </code> or by calling {@link System#setProperty(String, String)} before
- * this class is loaded.
- * <p/>
- * Default value is <code>false</code>.
- */
- public static final boolean DEBUG;
-
- static {
- boolean debug = false;
- try{
- debug = Boolean.getBoolean("imgscalr.debug");
- }
- catch(Exception e) {
- }
- DEBUG = debug;
- }
- /**
- * Prefix to every log message this library logs. Using a well-defined
- * prefix helps make it easier both visually and programmatically to scan
- * log files for messages produced by this library.
- * <p/>
- * The value is "[imgscalr] " (including the space).
- */
- public static final String LOG_PREFIX = "[imgscalr] ";
-
- /**
- * A {@link ConvolveOp} using a very light "blur" kernel that acts like an
- * anti-aliasing filter (softens the image a bit) when applied to an image.
- * <p/>
- * A common request by users of the library was that they wished to "soften"
- * resulting images when scaling them down drastically. After quite a bit of
- * A/B testing, the kernel used by this Op was selected as the closest match
- * for the target which was the softer results from the deprecated
- * {@link AreaAveragingScaleFilter} (which is used internally by the
- * deprecated {@link Image#getScaledInstance(int, int, int)} method in the
- * JDK that imgscalr is meant to replace).
- * <p/>
- * This ConvolveOp uses a 3x3 kernel with the values:
- * <table cellpadding="4" border="1">
- * <tr>
- * <td>.0f</td>
- * <td>.08f</td>
- * <td>.0f</td>
- * </tr>
- * <tr>
- * <td>.08f</td>
- * <td>.68f</td>
- * <td>.08f</td>
- * </tr>
- * <tr>
- * <td>.0f</td>
- * <td>.08f</td>
- * <td>.0f</td>
- * </tr>
- * </table>
- * <p/>
- * For those that have worked with ConvolveOps before, this Op uses the
- * {@link ConvolveOp#EDGE_NO_OP} instruction to not process the pixels along
- * the very edge of the image (otherwise EDGE_ZERO_FILL would create a
- * black-border around the image). If you have not worked with a ConvolveOp
- * before, it just means this default OP will "do the right thing" and not
- * give you garbage results.
- * <p/>
- * This ConvolveOp uses no {@link RenderingHints} values as internally the
- * {@link ConvolveOp} class only uses hints when doing a color conversion
- * between the source and destination {@link BufferedImage} targets.
- * imgscalr allows the {@link ConvolveOp} to create its own destination
- * image every time, so no color conversion is ever needed and thus no
- * hints.
- * <h3>Performance</h3>
- * Use of this (and other) {@link ConvolveOp}s are hardware accelerated when
- * possible. For more information on if your image op is hardware
- * accelerated or not, check the source code of the underlying JDK class
- * that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- * <h3>Known Issues</h3>
- * In all versions of Java (tested up to Java 7 preview Build 131), running
- * this op against a GIF with transparency and attempting to save the
- * resulting image as a GIF results in a corrupted/empty file. The file must
- * be saved out as a PNG to maintain the transparency.
- */
- public static final ConvolveOp OP_ANTIALIAS = new ConvolveOp(
- new Kernel(3, 3, new float[] { .0f, .08f, .0f, .08f, .68f, .08f,
- .0f, .08f, .0f }), ConvolveOp.EDGE_NO_OP, null);
-
- /**
- * Static initializer used to prepare some of the variables used by this
- * class.
- */
- static {
- log("Debug output ENABLED");
- }
-
- /**
- * Used to define the different scaling hints that the algorithm can use.
- */
- public static enum Method {
- /**
- * Used to indicate that the scaling implementation should decide which
- * method to use in order to get the best looking scaled image in the
- * least amount of time.
- * <p/>
- * The scaling algorithm will use the
- * {@link Scalr#THRESHOLD_QUALITY_BALANCED} or
- * {@link Scalr#THRESHOLD_BALANCED_SPEED} thresholds as cut-offs to
- * decide between selecting the <code>QUALITY</code>,
- * <code>BALANCED</code> or <code>SPEED</code> scaling algorithms.
- * <p/>
- * By default the thresholds chosen will give nearly the best looking
- * result in the fastest amount of time. We intend this method to work
- * for 80% of people looking to scale an image quickly and get a good
- * looking result.
- */
- AUTOMATIC,
- /**
- * Used to indicate that the scaling implementation should scale as fast
- * as possible and return a result. For smaller images (800px in size)
- * this can result in noticeable aliasing but it can be a few magnitudes
- * times faster than using the QUALITY method.
- */
- SPEED,
- /**
- * Used to indicate that the scaling implementation should use a scaling
- * operation balanced between SPEED and QUALITY. Sometimes SPEED looks
- * too low quality to be useful (e.g. text can become unreadable when
- * scaled using SPEED) but using QUALITY mode will increase the
- * processing time too much. This mode provides a "better than SPEED"
- * quality in a "less than QUALITY" amount of time.
- */
- BALANCED,
- /**
- * Used to indicate that the scaling implementation should do everything
- * it can to create as nice of a result as possible. This approach is
- * most important for smaller pictures (800px or smaller) and less
- * important for larger pictures as the difference between this method
- * and the SPEED method become less and less noticeable as the
- * source-image size increases. Using the AUTOMATIC method will
- * automatically prefer the QUALITY method when scaling an image down
- * below 800px in size.
- */
- QUALITY;
- }
-
- /**
- * Used to define the different modes of resizing that the algorithm can
- * use.
- */
- public static enum Mode {
- /**
- * Used to indicate that the scaling implementation should calculate
- * dimensions for the resultant image by looking at the image's
- * orientation and generating proportional dimensions that best fit into
- * the target width and height given
- *
- * See "Image Proportions" in the {@link Scalr} class description for
- * more detail.
- */
- AUTOMATIC,
- /**
- * Used to indicate that the scaling implementation should calculate
- * dimensions for the resultant image that best-fit within the given
- * width, regardless of the orientation of the image.
- */
- FIT_TO_WIDTH,
- /**
- * Used to indicate that the scaling implementation should calculate
- * dimensions for the resultant image that best-fit within the given
- * height, regardless of the orientation of the image.
- */
- FIT_TO_HEIGHT;
- }
-
- /**
- * Used to define the different types of rotations that can be applied to an
- * image during a resize operation.
- */
- public static enum Rotation {
- /**
- * No rotation should be applied to the image.
- */
- NONE,
- /**
- * Rotate the image 90-degrees clockwise (to the right). This is
- * equivalent to a quarter-turn of the image to the right.
- */
- CLOCKWISE,
- /**
- * Rotate the image negative 90-degrees counter-clockwise (to the left).
- * This is equivalent to a quarter-turn of the image to the left. This
- * is also equivalent to a 270-degree rotation to the right.
- */
- COUNTER_CLOCKWISE,
- /**
- * Flip the image. This is equivalent to rotating an image 180 degrees
- * (right or left, it doesn't matter).
- */
- FLIP;
- }
-
- /**
- * Threshold (in pixels) at which point the scaling operation using the
- * {@link Method#AUTOMATIC} method will decide if a {@link Method#BALANCED}
- * method will be used (if smaller than or equal to threshold) or a
- * {@link Method#SPEED} method will be used (if larger than threshold).
- * <p/>
- * The bigger the image is being scaled to, the less noticeable degradations
- * in the image becomes and the faster algorithms can be selected.
- * <p/>
- * The value of this threshold (1600) was chosen after visual, by-hand, A/B
- * testing between different types of images scaled with this library; both
- * photographs and screenshots. It was determined that images below this
- * size need to use a {@link Method#BALANCED} scale method to look decent in
- * most all cases while using the faster {@link Method#SPEED} method for
- * images bigger than this threshold showed no noticeable degradation over a
- * <code>BALANCED</code> scale.
- */
- public static final int THRESHOLD_BALANCED_SPEED = 1600;
-
- /**
- * Threshold (in pixels) at which point the scaling operation using the
- * {@link Method#AUTOMATIC} method will decide if a {@link Method#QUALITY}
- * method will be used (if smaller than or equal to threshold) or a
- * {@link Method#BALANCED} method will be used (if larger than threshold).
- * <p/>
- * The bigger the image is being scaled to, the less noticeable degradations
- * in the image becomes and the faster algorithms can be selected.
- * <p/>
- * The value of this threshold (800) was chosen after visual, by-hand, A/B
- * testing between different types of images scaled with this library; both
- * photographs and screenshots. It was determined that images below this
- * size need to use a {@link Method#QUALITY} scale method to look decent in
- * most all cases while using the faster {@link Method#BALANCED} method for
- * images bigger than this threshold showed no noticeable degradation over a
- * <code>QUALITY</code> scale.
- */
- public static final int THRESHOLD_QUALITY_BALANCED = 800;
-
- /**
- * Resize a given image (maintaining its original proportion) to a width and
- * height no bigger than <code>targetSize</code> and apply the given
- * {@link BufferedImageOp}s (if any) to the result before returning it.
- * <p/>
- * A scaling method of {@link Method#AUTOMATIC}, mode of
- * {@link Mode#AUTOMATIC} and rotation of {@link Rotation#NONE} are used.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param targetSize
- * The target width and height (square) that you wish the image
- * to fit within.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetSize</code> is < 0.
- *
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, int targetSize,
- BufferedImageOp... ops) throws IllegalArgumentException {
- return resize(src, Method.AUTOMATIC, Mode.AUTOMATIC, Rotation.NONE,
- targetSize, targetSize, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to a width and
- * height no bigger than <code>targetSize</code>, apply the given
- * {@link BufferedImageOp}s (if any) and then apply the given rotation to
- * the result before returning it.
- * <p/>
- * A scaling method of {@link Method#AUTOMATIC} and mode of
- * {@link Mode#AUTOMATIC} are used.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param rotation
- * The rotation to be applied to the scaled image right before it
- * is returned.
- * @param targetSize
- * The target width and height (square) that you wish the image
- * to fit within.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>rotation</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetSize</code> is < 0.
- *
- * @see Rotation
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Rotation rotation,
- int targetSize, BufferedImageOp... ops)
- throws IllegalArgumentException {
- return resize(src, Method.AUTOMATIC, Mode.AUTOMATIC, rotation,
- targetSize, targetSize, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to a width and
- * height no bigger than <code>targetSize</code> using the given scaling
- * method and apply the given {@link BufferedImageOp}s (if any) to the
- * result before returning it.
- * <p/>
- * A mode of {@link Mode#AUTOMATIC} and rotation of {@link Rotation#NONE}
- * are used.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param scalingMethod
- * The method used for scaling the image; preferring speed to
- * quality or a balance of both.
- * @param targetSize
- * The target width and height (square) that you wish the image
- * to fit within.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>scalingMethod</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetSize</code> is < 0.
- *
- * @see Method
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Method scalingMethod,
- int targetSize, BufferedImageOp... ops)
- throws IllegalArgumentException {
- return resize(src, scalingMethod, Mode.AUTOMATIC, Rotation.NONE,
- targetSize, targetSize, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to a width and
- * height no bigger than <code>targetSize</code> using the given scaling
- * method, apply the given {@link BufferedImageOp}s (if any) and then apply
- * the given rotation to the result before returning it.
- * <p/>
- * A mode of {@link Mode#AUTOMATIC} is used.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param scalingMethod
- * The method used for scaling the image; preferring speed to
- * quality or a balance of both.
- * @param rotation
- * The rotation to be applied to the scaled image right before it
- * is returned.
- * @param targetSize
- * The target width and height (square) that you wish the image
- * to fit within.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>scalingMethod</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>rotation</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetSize</code> is < 0.
- *
- * @see Method
- * @see Rotation
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Method scalingMethod,
- Rotation rotation, int targetSize, BufferedImageOp... ops)
- throws IllegalArgumentException {
- return resize(src, scalingMethod, Mode.AUTOMATIC, rotation, targetSize,
- targetSize, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to a width and
- * height no bigger than <code>targetSize</code> (or fitting the image to
- * the given WIDTH or HEIGHT explicitly, depending on the {@link Mode}
- * specified) and then apply the given {@link BufferedImageOp}s (if any) to
- * the result before returning it.
- * <p/>
- * A scaling method of {@link Method#AUTOMATIC} and rotation of
- * {@link Rotation#NONE} are used.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param resizeMode
- * Used to indicate how imgscalr should calculate the final
- * target size for the image, either fitting the image to the
- * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
- * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
- * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
- * proportional dimensions for the scaled image based on its
- * orientation (landscape, square or portrait). Unless you have
- * very specific size requirements, most of the time you just
- * want to use {@link Mode#AUTOMATIC} to "do the right thing".
- * @param targetSize
- * The target width and height (square) that you wish the image
- * to fit within.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>resizeMode</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetSize</code> is < 0.
- *
- * @see Mode
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Mode resizeMode,
- int targetSize, BufferedImageOp... ops)
- throws IllegalArgumentException {
- return resize(src, Method.AUTOMATIC, resizeMode, Rotation.NONE,
- targetSize, targetSize, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to a width and
- * height no bigger than <code>targetSize</code> (or fitting the image to
- * the given WIDTH or HEIGHT explicitly, depending on the {@link Mode}
- * specified), apply the given {@link BufferedImageOp}s (if any) and then
- * apply the given rotation to the result before returning it.
- * <p/>
- * A scaling method of {@link Method#AUTOMATIC} is used.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param resizeMode
- * Used to indicate how imgscalr should calculate the final
- * target size for the image, either fitting the image to the
- * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
- * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
- * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
- * proportional dimensions for the scaled image based on its
- * orientation (landscape, square or portrait). Unless you have
- * very specific size requirements, most of the time you just
- * want to use {@link Mode#AUTOMATIC} to "do the right thing".
- * @param rotation
- * The rotation to be applied to the scaled image right before it
- * is returned.
- * @param targetSize
- * The target width and height (square) that you wish the image
- * to fit within.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>resizeMode</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>rotation</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetSize</code> is < 0.
- *
- * @see Mode
- * @see Rotation
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Mode resizeMode,
- Rotation rotation, int targetSize, BufferedImageOp... ops)
- throws IllegalArgumentException {
- return resize(src, Method.AUTOMATIC, resizeMode, rotation, targetSize,
- targetSize, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to a width and
- * height no bigger than <code>targetSize</code> (or fitting the image to
- * the given WIDTH or HEIGHT explicitly, depending on the {@link Mode}
- * specified) using the given scaling method and apply the given
- * {@link BufferedImageOp}s (if any) to the result before returning it.
- * <p/>
- * A rotation of {@link Rotation#NONE} is used.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param scalingMethod
- * The method used for scaling the image; preferring speed to
- * quality or a balance of both.
- * @param resizeMode
- * Used to indicate how imgscalr should calculate the final
- * target size for the image, either fitting the image to the
- * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
- * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
- * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
- * proportional dimensions for the scaled image based on its
- * orientation (landscape, square or portrait). Unless you have
- * very specific size requirements, most of the time you just
- * want to use {@link Mode#AUTOMATIC} to "do the right thing".
- * @param targetSize
- * The target width and height (square) that you wish the image
- * to fit within.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>scalingMethod</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>resizeMode</code> is <code>null</code>.
- * @throw IllegalArgumentException if <code>targetSize</code> is < 0.
- *
- * @see Method
- * @see Mode
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Method scalingMethod,
- Mode resizeMode, int targetSize, BufferedImageOp... ops)
- throws IllegalArgumentException {
- return resize(src, scalingMethod, resizeMode, Rotation.NONE,
- targetSize, targetSize, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to a width and
- * height no bigger than <code>targetSize</code> (or fitting the image to
- * the given WIDTH or HEIGHT explicitly, depending on the {@link Mode}
- * specified) using the given scaling method, apply the given
- * {@link BufferedImageOp}s (if any) and apply the given rotation to the
- * result before returning it.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param scalingMethod
- * The method used for scaling the image; preferring speed to
- * quality or a balance of both.
- * @param resizeMode
- * Used to indicate how imgscalr should calculate the final
- * target size for the image, either fitting the image to the
- * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
- * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
- * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
- * proportional dimensions for the scaled image based on its
- * orientation (landscape, square or portrait). Unless you have
- * very specific size requirements, most of the time you just
- * want to use {@link Mode#AUTOMATIC} to "do the right thing".
- * @param rotation
- * The rotation to be applied to the scaled image right before it
- * is returned.
- * @param targetSize
- * The target width and height (square) that you wish the image
- * to fit within.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>scalingMethod</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>resizeMode</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>rotation</code> is <code>null</code>.
- * @throw IllegalArgumentException if <code>targetSize</code> is < 0.
- *
- * @see Method
- * @see Mode
- * @see Rotation
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Method scalingMethod,
- Mode resizeMode, Rotation rotation, int targetSize,
- BufferedImageOp... ops) throws IllegalArgumentException {
- return resize(src, scalingMethod, resizeMode, rotation, targetSize,
- targetSize, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to the target
- * width and height and apply the given {@link BufferedImageOp}s (if any) to
- * the result before returning it.
- * <p/>
- * A scaling method of {@link Method#AUTOMATIC}, mode of
- * {@link Mode#AUTOMATIC} and rotation of {@link Rotation#NONE} are used.
- * <p/>
- * <strong>TIP</strong>: See the class description to understand how this
- * class handles recalculation of the <code>targetWidth</code> or
- * <code>targetHeight</code> depending on the image's orientation in order
- * to maintain the original proportion.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param targetWidth
- * The target width that you wish the image to have.
- * @param targetHeight
- * The target height that you wish the image to have.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetWidth</code> is < 0 or if
- * <code>targetHeight</code> is < 0.
- *
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, int targetWidth,
- int targetHeight, BufferedImageOp... ops)
- throws IllegalArgumentException {
- return resize(src, Method.AUTOMATIC, Mode.AUTOMATIC, Rotation.NONE,
- targetWidth, targetHeight, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to the target
- * width and height, apply the given {@link BufferedImageOp}s (if any) and
- * apply the given rotation to the result before returning it.
- * <p/>
- * A scaling method of {@link Method#AUTOMATIC} and mode of
- * {@link Mode#AUTOMATIC} are used.
- * <p/>
- * <strong>TIP</strong>: See the class description to understand how this
- * class handles recalculation of the <code>targetWidth</code> or
- * <code>targetHeight</code> depending on the image's orientation in order
- * to maintain the original proportion.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param rotation
- * The rotation to be applied to the scaled image right before it
- * is returned.
- * @param targetWidth
- * The target width that you wish the image to have.
- * @param targetHeight
- * The target height that you wish the image to have.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>rotation</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetWidth</code> is < 0 or if
- * <code>targetHeight</code> is < 0.
- *
- * @see Rotation
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Rotation rotation,
- int targetWidth, int targetHeight, BufferedImageOp... ops)
- throws IllegalArgumentException {
- return resize(src, Method.AUTOMATIC, Mode.AUTOMATIC, rotation,
- targetWidth, targetHeight, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to the target
- * width and height using the given scaling method and apply the given
- * {@link BufferedImageOp}s (if any) to the result before returning it.
- * <p/>
- * A mode of {@link Mode#AUTOMATIC} and rotation of {@link Rotation#NONE}
- * are used.
- * <p/>
- * <strong>TIP</strong>: See the class description to understand how this
- * class handles recalculation of the <code>targetWidth</code> or
- * <code>targetHeight</code> depending on the image's orientation in order
- * to maintain the original proportion.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param scalingMethod
- * The method used for scaling the image; preferring speed to
- * quality or a balance of both.
- * @param targetWidth
- * The target width that you wish the image to have.
- * @param targetHeight
- * The target height that you wish the image to have.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image no bigger than the given width
- * and height.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>scalingMethod</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetWidth</code> is < 0 or if
- * <code>targetHeight</code> is < 0.
- *
- * @see Method
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Method scalingMethod,
- int targetWidth, int targetHeight, BufferedImageOp... ops) {
- return resize(src, scalingMethod, Mode.AUTOMATIC, Rotation.NONE,
- targetWidth, targetHeight, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to the target
- * width and height using the given scaling method, apply the given
- * {@link BufferedImageOp}s (if any) and apply the given rotation to the
- * result before returning it.
- * <p/>
- * A mode of {@link Mode#AUTOMATIC} is used.
- * <p/>
- * <strong>TIP</strong>: See the class description to understand how this
- * class handles recalculation of the <code>targetWidth</code> or
- * <code>targetHeight</code> depending on the image's orientation in order
- * to maintain the original proportion.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param scalingMethod
- * The method used for scaling the image; preferring speed to
- * quality or a balance of both.
- * @param rotation
- * The rotation to be applied to the scaled image right before it
- * is returned.
- * @param targetWidth
- * The target width that you wish the image to have.
- * @param targetHeight
- * The target height that you wish the image to have.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image no bigger than the given width
- * and height.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>scalingMethod</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>rotation</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetWidth</code> is < 0 or if
- * <code>targetHeight</code> is < 0.
- *
- * @see Method
- * @see Rotation
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Method scalingMethod,
- Rotation rotation, int targetWidth, int targetHeight,
- BufferedImageOp... ops) {
- return resize(src, scalingMethod, Mode.AUTOMATIC, rotation,
- targetWidth, targetHeight, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to the target
- * width and height (or fitting the image to the given WIDTH or HEIGHT
- * explicitly, depending on the {@link Mode} specified) and then apply the
- * given {@link BufferedImageOp}s (if any) to the result before returning
- * it.
- * <p/>
- * A scaling method of {@link Method#AUTOMATIC} and rotation of
- * {@link Rotation#NONE} are used.
- * <p/>
- * <strong>TIP</strong>: See the class description to understand how this
- * class handles recalculation of the <code>targetWidth</code> or
- * <code>targetHeight</code> depending on the image's orientation in order
- * to maintain the original proportion.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param resizeMode
- * Used to indicate how imgscalr should calculate the final
- * target size for the image, either fitting the image to the
- * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
- * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
- * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
- * proportional dimensions for the scaled image based on its
- * orientation (landscape, square or portrait). Unless you have
- * very specific size requirements, most of the time you just
- * want to use {@link Mode#AUTOMATIC} to "do the right thing".
- * @param targetWidth
- * The target width that you wish the image to have.
- * @param targetHeight
- * The target height that you wish the image to have.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>resizeMode</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetWidth</code> is < 0 or if
- * <code>targetHeight</code> is < 0.
- *
- * @see Mode
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Mode resizeMode,
- int targetWidth, int targetHeight, BufferedImageOp... ops)
- throws IllegalArgumentException {
- return resize(src, Method.AUTOMATIC, resizeMode, Rotation.NONE,
- targetWidth, targetHeight, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to the target
- * width and height (or fitting the image to the given WIDTH or HEIGHT
- * explicitly, depending on the {@link Mode} specified), apply the given
- * {@link BufferedImageOp}s (if any) and then apply the given rotation to
- * the result before returning it.
- * <p/>
- * A scaling method of {@link Method#AUTOMATIC} is used.
- * <p/>
- * <strong>TIP</strong>: See the class description to understand how this
- * class handles recalculation of the <code>targetWidth</code> or
- * <code>targetHeight</code> depending on the image's orientation in order
- * to maintain the original proportion.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param resizeMode
- * Used to indicate how imgscalr should calculate the final
- * target size for the image, either fitting the image to the
- * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
- * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
- * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
- * proportional dimensions for the scaled image based on its
- * orientation (landscape, square or portrait). Unless you have
- * very specific size requirements, most of the time you just
- * want to use {@link Mode#AUTOMATIC} to "do the right thing".
- * @param rotation
- * The rotation to be applied to the scaled image right before it
- * is returned.
- * @param targetWidth
- * The target width that you wish the image to have.
- * @param targetHeight
- * The target height that you wish the image to have.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image with either a width or height of
- * the given target size.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>resizeMode</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>rotation</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetWidth</code> is < 0 or if
- * <code>targetHeight</code> is < 0.
- *
- * @see Mode
- * @see Rotation
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Mode resizeMode,
- Rotation rotation, int targetWidth, int targetHeight,
- BufferedImageOp... ops) throws IllegalArgumentException {
- return resize(src, Method.AUTOMATIC, resizeMode, rotation, targetWidth,
- targetHeight, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to the target
- * width and height (or fitting the image to the given WIDTH or HEIGHT
- * explicitly, depending on the {@link Mode} specified) using the given
- * scaling method and apply the given {@link BufferedImageOp}s (if any) to
- * the result before returning it.
- * <p/>
- * A rotation of {@link Rotation#NONE} is used.
- * <p/>
- * <strong>TIP</strong>: See the class description to understand how this
- * class handles recalculation of the <code>targetWidth</code> or
- * <code>targetHeight</code> depending on the image's orientation in order
- * to maintain the original proportion.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param scalingMethod
- * The method used for scaling the image; preferring speed to
- * quality or a balance of both.
- * @param resizeMode
- * Used to indicate how imgscalr should calculate the final
- * target size for the image, either fitting the image to the
- * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
- * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
- * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
- * proportional dimensions for the scaled image based on its
- * orientation (landscape, square or portrait). Unless you have
- * very specific size requirements, most of the time you just
- * want to use {@link Mode#AUTOMATIC} to "do the right thing".
- * @param targetWidth
- * The target width that you wish the image to have.
- * @param targetHeight
- * The target height that you wish the image to have.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image no bigger than the given width
- * and height.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>scalingMethod</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>resizeMode</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetWidth</code> is < 0 or if
- * <code>targetHeight</code> is < 0.
- *
- * @see Method
- * @see Mode
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Method scalingMethod,
- Mode resizeMode, int targetWidth, int targetHeight,
- BufferedImageOp... ops) throws IllegalArgumentException {
- return resize(src, scalingMethod, resizeMode, Rotation.NONE,
- targetWidth, targetHeight, ops);
- }
-
- /**
- * Resize a given image (maintaining its original proportion) to the target
- * width and height (or fitting the image to the given WIDTH or HEIGHT
- * explicitly, depending on the {@link Mode} specified) using the given
- * scaling method, apply the given {@link BufferedImageOp}s (if any) and
- * apply the given rotation to the result before returning it.
- * <p/>
- * <strong>TIP</strong>: See the class description to understand how this
- * class handles recalculation of the <code>targetWidth</code> or
- * <code>targetHeight</code> depending on the image's orientation in order
- * to maintain the original proportion.
- * <p/>
- * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
- * hardware accelerated operations, but many of the most popular (like
- * {@link ConvolveOp}) are. For more information on if your image op is
- * hardware accelerated or not, check the source code of the underlying JDK
- * class that actually executes the Op code, <a href=
- * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
- * >sun.awt.image.ImagingLib</a>.
- *
- * @param src
- * The image that will be scaled.
- * @param scalingMethod
- * The method used for scaling the image; preferring speed to
- * quality or a balance of both.
- * @param resizeMode
- * Used to indicate how imgscalr should calculate the final
- * target size for the image, either fitting the image to the
- * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
- * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
- * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
- * proportional dimensions for the scaled image based on its
- * orientation (landscape, square or portrait). Unless you have
- * very specific size requirements, most of the time you just
- * want to use {@link Mode#AUTOMATIC} to "do the right thing".
- * @param rotation
- * The rotation to be applied to the scaled image right before it
- * is returned.
- * @param targetWidth
- * The target width that you wish the image to have.
- * @param targetHeight
- * The target height that you wish the image to have.
- * @param ops
- * Zero or more optional image operations (e.g. sharpen, blur,
- * etc.) that can be applied to the final result before returning
- * the image.
- *
- * @return the proportionally scaled image no bigger than the given width
- * and height.
- *
- * @throws IllegalArgumentException
- * if <code>src</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>scalingMethod</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>resizeMode</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>rotation</code> is <code>null</code>.
- * @throws IllegalArgumentException
- * if <code>targetWidth</code> is < 0 or if
- * <code>targetHeight</code> is < 0.
- *
- * @see Method
- * @see Mode
- * @see Rotation
- * @see #OP_ANTIALIAS
- */
- public static BufferedImage resize(BufferedImage src, Method scalingMethod,
- Mode resizeMode, Rotation rotation, int targetWidth,
- int targetHeight, BufferedImageOp... ops)
- throws IllegalArgumentException {
- if (src == null)
- throw new IllegalArgumentException(
- "src cannot be null, a valid BufferedImage instance must be provided.");
- if (scalingMethod == null)
- throw new IllegalArgumentException(
- "scalingMethod cannot be null. A good default value is Method.AUTOMATIC.");
- if (resizeMode == null)
- throw new IllegalArgumentException(
- "resizeMode cannot be null. A good default value is Mode.AUTOMATIC.");
- if (rotation == null)
- throw new IllegalArgumentException(
- "rotation cannot be null. A good default value is Rotation.NONE.");
- if (targetWidth < 0)
- throw new IllegalArgumentException("targetWidth must be >= 0");
- if (targetHeight < 0)
- throw new IllegalArgumentException("targetHeight must be >= 0");
-
- BufferedImage result = null;
-
- long startTime = System.currentTimeMillis();
-
- // Clear the 'null' ops arg passed in from other API methods
- if (ops != null && ops.length == 1 && ops[0] == null)
- ops = null;
-
- int currentWidth = src.getWidth();
- int currentHeight = src.getHeight();
-
- // <= 1 is a square or landscape-oriented image, > 1 is a portrait.
- float ratio = ((float) currentHeight / (float) currentWidth);
-
- if (DEBUG)
- log("START Resizing Source Image [size=%dx%d, mode=%s, orientation=%s, ratio(H/W)=%f] to [targetSize=%dx%d]",
- currentWidth, currentHeight, resizeMode,
- (ratio <= 1 ? "Landscape/Square" : "Portrait"), ratio,
- targetWidth, targetHeight);
-
- /*
- * The proportion of the picture must be honored, the way that is done
- * is to figure out if the image is in a LANDSCAPE/SQUARE or PORTRAIT
- * orientation and depending on its orientation, use the primary
- * dimension (width for LANDSCAPE/SQUARE and height for PORTRAIT) to
- * recalculate the alternative (height and width respectively) value
- * that adheres to the existing ratio. This helps make life easier for
- * the caller as they don't need to pre-compute proportional dimensions
- * before calling the API, they can just specify the dimensions they
- * would like the image to roughly fit within and it will do the right
- * thing without mangling the result.
- */
- if ((ratio <= 1 && resizeMode == Mode.AUTOMATIC)
- || (resizeMode == Mode.FIT_TO_WIDTH)) {
- // First make sure we need to do any work in the first place
- if (targetWidth == src.getWidth())
- return src;
-
- // Save for detailed logging (this is cheap).
- int originalTargetHeight = targetHeight;
-
- /*
- * Landscape or Square Orientation: Ignore the given height and
- * re-calculate a proportionally correct value based on the
- * targetWidth.
- */
- targetHeight = Math.round((float) targetWidth * ratio);
-
- if (DEBUG && originalTargetHeight != targetHeight)
- log("Auto-Corrected targetHeight [from=%d to=%d] to honor image proportions",
- originalTargetHeight, targetHeight);
- } else {
- // First make sure we need to do any work in the first place
- if (targetHeight == src.getHeight())
- return src;
-
- // Save for detailed logging (this is cheap).
- int originalTargetWidth = targetWidth;
-
- /*
- * Portrait Orientation: Ignore the given width and re-calculate a
- * proportionally correct value based on the targetHeight.
- */
- targetWidth = Math.round((float) targetHeight / ratio);
-
- if (DEBUG && originalTargetWidth != targetWidth)
- log("Auto-Corrected targetWidth [from=%d to=%d] to honor image proportions",
- originalTargetWidth, targetWidth);
- }
-
- // If AUTOMATIC was specified, determine the real scaling method.
- if (scalingMethod == Scalr.Method.AUTOMATIC)
- scalingMethod = determineScalingMethod(targetWidth, targetHeight,
- ratio);
-
- if (DEBUG)
- log("Scaling Image to [size=%dx%d] using the %s method...",
- targetWidth, targetHeight, scalingMethod);
-
- // Now we scale the image
- if (scalingMethod == Scalr.Method.SPEED) {
- result = scaleImage(src, targetWidth, targetHeight,
- RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
- } else if (scalingMethod == Scalr.Method.BALANCED) {
- result = scaleImage(src, targetWidth, targetHeight,
- RenderingHints.VALUE_INTERPOLATION_BILINEAR);
- } else if (scalingMethod == Scalr.Method.QUALITY) {
- /*
- * If we are scaling up (in either width or height - since we know
- * the image will stay proportional we just check if either are
- * being scaled up), directly using a single BICUBIC will give us
- * better results then using Chris Campbell's incremental scaling
- * operation (and take a lot less time). If we are scaling down, we
- * must use the incremental scaling algorithm for the best result.
- */
- if (targetWidth > currentWidth || targetHeight > currentHeight) {
- log("\tQUALITY Up-scale, single BICUBIC scaling will be used...");
-
- /*
- * BILINEAR and BICUBIC look similar the smaller the scale jump
- * upwards is, if the scale is larger BICUBIC looks sharper and
- * less fuzzy. But most importantly we have to use BICUBIC to
- * match the contract of the QUALITY rendering method. This note
- * is just here for anyone reading the code and wondering how
- * they can speed their own calls up.
- */
- result = scaleImage(src, targetWidth, targetHeight,
- RenderingHints.VALUE_INTERPOLATION_BICUBIC);
- } else {
- log("\tQUALITY Down-scale, incremental scaling will be used...");
-
- /*
- * Originally we wanted to use BILINEAR interpolation here
- * because it takes 1/3rd the time that the BICUBIC
- * interpolation does, however, when scaling large images down
- * to most sizes bigger than a thumbnail we witnessed noticeable
- * "softening" in the resultant image with BILINEAR that would
- * be unexpectedly annoying to a user expecting a "QUALITY"
- * scale of their original image. Instead BICUBIC was chosen to
- * honor the contract of a QUALITY scale of the original image.
- */
- result = scaleImageIncrementally(src, targetWidth,
- targetHeight,
- RenderingHints.VALUE_INTERPOLATION_BICUBIC);
- }
- }
-
- // Apply the image ops if any were provided
- if (ops != null && ops.length > 0) {
- if (DEBUG)
- log("Applying %d Image Ops to Result", ops.length);
-
- for (BufferedImageOp op : ops) {
- // In case a null op was passed in, skip it instead of dying
- if (op == null)
- continue;
-
- long opStartTime = System.currentTimeMillis();
- Rectangle2D dims = op.getBounds2D(result);
-
- /*
- * We must manually create the target image; we cannot rely on
- * the null-dest filter() method to create a valid destination
- * for us thanks to this JDK bug that has been filed for almost
- * a decade:
- * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4965606
- */
- BufferedImage dest = new BufferedImage((int) Math.round(dims
- .getWidth()), (int) Math.round(dims.getHeight()),
- result.getType());
-
- result = op.filter(result, dest);
-
- if (DEBUG)
- log("\tOp Applied in %d ms, Resultant Image [width=%d, height=%d], Op: %s",
- (System.currentTimeMillis() - opStartTime),
- result.getWidth(), result.getHeight(), op);
- }
- }
-
- // Perform the rotation if one was requested
- if (rotation != Rotation.NONE) {
- if (DEBUG)
- log("Applying %s rotation to image...", rotation);
-
- long rotStartTime = System.currentTimeMillis();
-
- /*
- * A 90 or -90 degree rotation will cause the height and width to
- * flip-flop from the original image to the rotated one.
- *
- * Given that MOST rotations will typically be some form of a
- * 90-degree rotation (portrait to landscape, etc.) just assume that
- * here and correct it below in the switch statement if need be.
- */
- int newWidth = result.getHeight();
- int newHeight = result.getWidth();
-
- /*
- * We create a transform per operation request as (oddly enough) it
- * ends up being faster for the VM to create, use and destroy these
- * instances than it is to re-use a single AffineTransform
- * per-thread via the AffineTransform.setTo(...) methods which was
- * my first choice (less object creation).
- *
- * Unfortunately this introduces the need for ThreadLocal instances
- * of AffineTransforms to avoid race conditions where two or more
- * resize threads are manipulating the same transform before
- * applying it.
- *
- * ThreadLocals are one of the #1 reasons for memory leaks in server
- * applications and since we have no nice way to hook into the
- * init/destroy Servlet cycle or any other initialization cycle for
- * this library to automatically call ThreadLocal.remove() to avoid
- * the memory leak, it would have made using this library *safely*
- * on the server side much harder.
- *
- * So we opt for creating individual transforms per rotation op and
- * let the VM clean them up in a GC.
- */
- AffineTransform tx = new AffineTransform();
-
- switch (rotation) {
- case CLOCKWISE:
- // Reminder: newWidth == result.getHeight() at this point
- tx.translate(newWidth, 0);
- tx.rotate(Math.toRadians(90));
-
- break;
-
- case COUNTER_CLOCKWISE:
- // Reminder: newHeight == result.getWidth() at this point
- tx.translate(0, newHeight);
- tx.rotate(Math.toRadians(-90));
- break;
-
- case FLIP:
- /*
- * This is the one rotation case where the new width and height
- * will be the same as the original image, so reset the values
- * from the defaults we set above.
- */
- newWidth = result.getWidth();
- newHeight = result.getHeight();
-
- tx.translate(newWidth, newHeight);
- tx.rotate(Math.toRadians(180));
- break;
- }
-
- /*
- * Create our target image we will render the rotated result to. At
- * this point the resultant image has already been put into the best
- * image type so we can just copy that without trying to
- * re-determine the most effective image type like scaleImage(...)
- * has to do.
- */
- BufferedImage rotatedImage = new BufferedImage(newWidth, newHeight,
- result.getType());
- Graphics2D g2d = (Graphics2D) rotatedImage.createGraphics();
-
- /*
- * Render the resultant image to our new rotatedImage buffer,
- * applying the AffineTransform that we calculated above during
- * rendering so the pixels from the old position to the new
- * transposed positions are mapped correctly.
- */
- g2d.drawImage(result, tx, null);
- g2d.dispose();
-
- /*
- * Before re-assigning the new result to be returned to our rotated
- * image, explicitly notify the VM that you are done with any
- * resources being used by the old resultant image that we don't
- * need anymore.
- */
- result.flush();
-
- // Reassign the result to our rotated image before returning it.
- result = rotatedImage;
-
- if (DEBUG)
- log("\t%s Rotation Applied in %d ms, Resultant Image [width=%d, height=%d]",
- rotation, (System.currentTimeMillis() - rotStartTime),
- result.getWidth(), result.getHeight());
- }
-
- if (DEBUG) {
- long elapsedTime = System.currentTimeMillis() - startTime;
- log("END Source Image Scaled from [%dx%d] to [%dx%d] and %d BufferedImageOp(s) Applied in %d ms",
- currentWidth, currentHeight, result.getWidth(),
- result.getHeight(), (ops == null ? 0 : ops.length),
- elapsedTime);
- }
-
- return result;
- }
-
- /**
- * Helper method used to ensure a message is loggable before it is logged
- * and then pre-pend a universal prefix to all log messages generated by
- * this library to make the log entries easy to parse visually or
- * programmatically.
- * <p/>
- * If a message cannot be logged (logging is disabled) then this method
- * returns immediately.
- * <p/>
- * <strong>NOTE</strong>: Because Java will auto-box primitive arguments
- * into Objects when building out the <code>params</code> array, care should
- * be taken not to call this method with primitive values unless
- * {@link #DEBUG} is <code>true</code>; otherwise the VM will be spending
- * time performing unnecessary auto-boxing calculations.
- *
- * @param message
- * The log message in <a href=
- * "http://download.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax"
- * >format string syntax</a> that will be logged.
- * @param params
- * The parameters that will be swapped into all the place holders
- * in the original messages before being logged.
- *
- * @see #LOG_PREFIX
- */
- protected static void log(String message, Object... params) {
- if (DEBUG)
- System.out.printf(LOG_PREFIX + message + '\n', params);
- }
-
- /**
- * Used to determine the scaling {@link Method} that is best suited for
- * scaling the image to the targeted dimensions.
- * <p/>
- * This method is intended to be used to select a specific scaling
- * {@link Method} when a {@link Method#AUTOMATIC} method is specified. This
- * method utilizes the {@link #THRESHOLD_QUALITY_BALANCED} and
- * {@link #THRESHOLD_BALANCED_SPEED} thresholds when selecting which method
- * should be used by comparing the primary dimension (width or height)
- * against the threshold and seeing where the image falls. The primary
- * dimension is determined by looking at the orientation of the image:
- * landscape or square images use their width and portrait-oriented images
- * use their height.
- *
- * @param targetWidth
- * The target width for the scaled image.
- * @param targetHeight
- * The target height for the scaled image.
- * @param ratio
- * A height/width ratio used to determine the orientation of the
- * image so the primary dimension (width or height) can be
- * selected to test if it is greater than or less than a
- * particular threshold.
- *
- * @return the fastest {@link Method} suited for scaling the image to the
- * specified dimensions while maintaining a good-looking result.
- */
- protected static Method determineScalingMethod(int targetWidth,
- int targetHeight, float ratio) {
- // Get the primary dimension based on the orientation of the image
- int length = (ratio <= 1 ? targetWidth : targetHeight);
-
- // Default to speed
- Method result = Method.SPEED;
-
- // Figure out which method should be used
- if (length <= THRESHOLD_QUALITY_BALANCED)
- result = Method.QUALITY;
- else if (length <= THRESHOLD_BALANCED_SPEED)
- result = Method.BALANCED;
-
- if (DEBUG)
- log("AUTOMATIC Scaling Method Selected [%s] for Image [size=%dx%d]",
- result.name(), targetWidth, targetHeight);
-
- return result;
- }
-
- /**
- * Used to implement a straight-forward image-scaling operation using Java
- * 2D.
- * <p/>
- * This method uses the Snoracle-encouraged method of
- * <code>Graphics2D.drawImage(...)</code> to scale the given image with the
- * given interpolation hint.
- *
- * @param src
- * The image that will be scaled.
- * @param targetWidth
- * The target width for the scaled image.
- * @param targetHeight
- * The target height for the scaled image.
- * @param interpolationHintValue
- * The {@link RenderingHints} interpolation value used to
- * indicate the method that {@link Graphics2D} should use when
- * scaling the image.
- *
- * @return the result of scaling the original <code>src</code> to the given
- * dimensions using the given interpolation method.
- */
- protected static BufferedImage scaleImage(BufferedImage src,
- int targetWidth, int targetHeight, Object interpolationHintValue) {
- /*
- * Determine the RGB-based TYPE of image (plain RGB or RGB + Alpha) that
- * we want to render the scaled instance into. We force all rendering
- * results into one of these two types, avoiding the case where a source
- * image is of an unsupported (or poorly supported) format by Java2D and
- * the written results, when attempting to re-create and write out that
- * format, is garbage.
- *
- * Originally reported by Magnus Kvalheim from Movellas when scaling
- * certain GIF and PNG images.
- *
- * More information about Java2D and poorly supported image types:
- * http:/
- * /www.mail-archive.com/java2d-interest at capra.eng.sun.com/msg05621.html
- *
- * Thanks to Morten Nobel for the implementation hint:
- * http://code.google
- * .com/p/java-image-scaling/source/browse/trunk/src/main
- * /java/com/mortennobel/imagescaling/MultiStepRescaleOp.java
- */
- int imageType = (src.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB
- : BufferedImage.TYPE_INT_ARGB);
-
- // Setup the rendering resources to match the source image's
- BufferedImage result = new BufferedImage(targetWidth, targetHeight,
- imageType);
- Graphics2D resultGraphics = result.createGraphics();
-
- // Scale the image to the new buffer using the specified rendering hint.
- resultGraphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
- interpolationHintValue);
- resultGraphics.drawImage(src, 0, 0, targetWidth, targetHeight, null);
-
- // Just to be clean, explicitly dispose our temporary graphics object
- resultGraphics.dispose();
-
- // Return the scaled image to the caller.
- return result;
- }
-
- /**
- * Used to implement Chris Campbell's incremental-scaling algorithm: <a
- * href="http://today.java.net/pub/a/today/2007/04/03/perils
- * -of-image-getscaledinstance
- * .html">http://today.java.net/pub/a/today/2007/04/03/perils
- * -of-image-getscaledinstance.html</a>.
- * <p/>
- * Modifications to the original algorithm are variable names and comments
- * added for clarity and the hard-coding of using BICUBIC interpolation as
- * well as the explicit "flush()" operation on the interim BufferedImage
- * instances to avoid resource leaking.
- *
- * @param src
- * The image that will be scaled.
- * @param targetWidth
- * The target width for the scaled image.
- * @param targetHeight
- * The target height for the scaled image.
- * @param interpolationHintValue
- * The {@link RenderingHints} interpolation value used to
- * indicate the method that {@link Graphics2D} should use when
- * scaling the image.
- *
- * @return an image scaled to the given dimensions using the given rendering
- * hint.
- */
- protected static BufferedImage scaleImageIncrementally(BufferedImage src,
- int targetWidth, int targetHeight, Object interpolationHintValue) {
- boolean hasReassignedSrc = false;
- int incrementCount = 0;
- int currentWidth = src.getWidth();
- int currentHeight = src.getHeight();
-
- do {
- /*
- * If the current width is bigger than our target, cut it in half
- * and sample again.
- */
- if (currentWidth > targetWidth) {
- currentWidth /= 2;
-
- /*
- * If we cut the width too far it means we are on our last
- * iteration. Just set it to the target width and finish up.
- */
- if (currentWidth < targetWidth)
- currentWidth = targetWidth;
- }
-
- /*
- * If the current height is bigger than our target, cut it in half
- * and sample again.
- */
-
- if (currentHeight > targetHeight) {
- currentHeight /= 2;
-
- /*
- * If we cut the height too far it means we are on our last
- * iteration. Just set it to the target height and finish up.
- */
-
- if (currentHeight < targetHeight)
- currentHeight = targetHeight;
- }
-
- // Render the incremental scaled image.
- BufferedImage incrementalImage = scaleImage(src, currentWidth,
- currentHeight, interpolationHintValue);
-
- /*
- * Before re-assigning our interim (partially scaled)
- * incrementalImage to be the new src image before we iterate around
- * again to process it down further, we want to flush() the previous
- * src image IF (and only IF) it was one of our own temporary
- * BufferedImages created during this incremental down-sampling
- * cycle. If it wasn't one of ours, then it was the original
- * caller-supplied BufferedImage in which case we don't want to
- * flush() it and just leave it alone.
- */
- if (hasReassignedSrc)
- src.flush();
-
- /*
- * Now treat our incremental partially scaled image as the src image
- * and cycle through our loop again to do another incremental
- * scaling of it (if necessary).
- */
- src = incrementalImage;
-
- /*
- * Keep track of us re-assigning the original caller-supplied source
- * image with one of our interim BufferedImages so we know when to
- * explicitly flush the interim "src" on the next cycle through.
- */
- if (!hasReassignedSrc)
- hasReassignedSrc = true;
-
- // Track how many times we go through this cycle to scale the image.
- incrementCount++;
- } while (currentWidth != targetWidth || currentHeight != targetHeight);
-
- if (DEBUG)
- log("\tScaled Image in %d steps", incrementCount);
-
- /*
- * Once the loop has exited, the src image argument is now our scaled
- * result image that we want to return.
- */
- return src;
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/main/java/com/thebuzzmedia/imgscalr/AsyncScalr.java b/freeplane/src/main/java/com/thebuzzmedia/imgscalr/AsyncScalr.java
new file mode 100644
index 0000000..a115a91
--- /dev/null
+++ b/freeplane/src/main/java/com/thebuzzmedia/imgscalr/AsyncScalr.java
@@ -0,0 +1,570 @@
+/**
+ * Copyright 2011 The Buzz Media, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.thebuzzmedia.imgscalr;
+
+import java.awt.Color;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.ImagingOpException;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.thebuzzmedia.imgscalr.Scalr.Method;
+import com.thebuzzmedia.imgscalr.Scalr.Mode;
+import com.thebuzzmedia.imgscalr.Scalr.Rotation;
+
+/**
+ * Class used to provide the asynchronous versions of all the methods defined in
+ * {@link Scalr} for the purpose of efficiently handling large amounts of image
+ * operations via a select number of processing threads asynchronously.
+ * <p/>
+ * Given that image-scaling operations, especially when working with large
+ * images, can be very hardware-intensive (both CPU and memory), in large-scale
+ * deployments (e.g. a busy web application) it becomes increasingly important
+ * that the scale operations performed by imgscalr be manageable so as not to
+ * fire off too many simultaneous operations that the JVM's heap explodes and
+ * runs out of memory or pegs the CPU on the host machine, staving all other
+ * running processes.
+ * <p/>
+ * Up until now it was left to the caller to implement their own serialization
+ * or limiting logic to handle these use-cases. Given imgscalr's popularity in
+ * web applications it was determined that this requirement be common enough
+ * that it should be integrated directly into the imgscalr library for everyone
+ * to benefit from.
+ * <p/>
+ * Every method in this class wraps the matching methods in the {@link Scalr}
+ * class in new {@link Callable} instances that are submitted to an internal
+ * {@link ExecutorService} for execution at a later date. A {@link Future} is
+ * returned to the caller representing the task that is either currently
+ * performing the scale operation or will at a future date depending on where it
+ * is in the {@link ExecutorService}'s queue. {@link Future#get()} or
+ * {@link Future#get(long, TimeUnit)} can be used to block on the
+ * <code>Future</code>, waiting for the scale operation to complete and return
+ * the resultant {@link BufferedImage} to the caller.
+ * <p/>
+ * This design provides the following features:
+ * <ul>
+ * <li>Non-blocking, asynchronous scale operations that can continue execution
+ * while waiting on the scaled result.</li>
+ * <li>Serialize all scale requests down into a maximum number of
+ * <em>simultaneous</em> scale operations with no additional/complex logic. The
+ * number of simultaneous scale operations is caller-configurable (see
+ * {@link #THREAD_COUNT}) so as best to optimize the host system (e.g. 1 scale
+ * thread per core).</li>
+ * <li>No need to worry about overloading the host system with too many scale
+ * operations, they will simply queue up in this class and execute in-order.</li>
+ * <li>Synchronous/blocking behavior can still be achieved (if desired) by
+ * calling <code>get()</code> or <code>get(long, TimeUnit)</code> immediately on
+ * the returned {@link Future} from any of the methods below.</li>
+ * </ul>
+ * <h3>Performance</h3>
+ * When tuning this class for optimal performance, benchmarking your particular
+ * hardware is the best approach. For some rough guidelines though, there are
+ * two resources you want to watch closely:
+ * <ol>
+ * <li>JVM Heap Memory (Assume physical machine memory is always sufficiently
+ * large)</li>
+ * <li># of CPU Cores</li>
+ * </ol>
+ * You never want to allocate more scaling threads than you have CPU cores and
+ * on a sufficiently busy host where some of the cores may be busy running a
+ * database or a web server, you will want to allocate even less scaling
+ * threads.
+ * <p/>
+ * So as a maximum you would never want more scaling threads than CPU cores in
+ * any situation and less so on a busy server.
+ * <p/>
+ * If you allocate more threads than you have available CPU cores, your scaling
+ * operations will slow down as the CPU will spend a considerable amount of time
+ * context-switching between threads on the same core trying to finish all the
+ * tasks in parallel. You might still be tempted to do this because of the I/O
+ * delay some threads will encounter reading images off disk, but when you do
+ * your own benchmarking you'll likely find (as I did) that the actual disk I/O
+ * necessary to pull the image data off disk is a much smaller portion of the
+ * execution time than the actual scaling operations.
+ * <p/>
+ * If you are executing on a storage medium that is unexpectedly slow and I/O is
+ * a considerable portion of the scaling operation (e.g. S3 or EBS volumes),
+ * feel free to try using more threads than CPU cores to see if that helps; but
+ * in most normal cases, it will only slow down all other parallel scaling
+ * operations.
+ * <p/>
+ * As for memory, every time an image is scaled it is decoded into a
+ * {@link BufferedImage} and stored in the JVM Heap space (decoded image
+ * instances are always larger than the source images on-disk). For larger
+ * images, that can use up quite a bit of memory. You will need to benchmark
+ * your particular use-cases on your hardware to get an idea of where the sweet
+ * spot is for this; if you are operating within tight memory bounds, you may
+ * want to limit simultaneous scaling operations to 1 or 2 regardless of the
+ * number of cores just to avoid having too many {@link BufferedImage} instances
+ * in JVM Heap space at the same time.
+ * <p/>
+ * These are rough metrics and behaviors to give you an idea of how best to tune
+ * this class for your deployment, but nothing can replacement writing a small
+ * Java class that scales a handful of images in a number of different ways and
+ * testing that directly on your deployment hardware.
+ * <h3>Resource Overhead</h3>
+ * The {@link ExecutorService} utilized by this class won't be initialized until
+ * one of the operation methods are called, at which point the
+ * <code>service</code> will be instantiated for the first time and operation
+ * queued up.
+ * <p/>
+ * More specifically, if you have no need for asynchronous image processing
+ * offered by this class, you don't need to worry about wasted resources or
+ * hanging/idle threads as they will never be created if you never use this
+ * class.
+ * <h3>Cleaning up Service Threads</h3>
+ * By default the {@link Thread}s created by the internal
+ * {@link ThreadPoolExecutor} do not run in <code>daemon</code> mode; which
+ * means they will block the host VM from exiting until they are explicitly shut
+ * down in a client application; in a server application the container will shut
+ * down the pool forcibly.
+ * <p/>
+ * If you have used the {@link AsyncScalr} class and are trying to shut down a
+ * client application, you will need to call {@link #getService()} then
+ * {@link ExecutorService#shutdown()} or {@link ExecutorService#shutdownNow()}
+ * to have the threads terminated; you may also want to look at the
+ * {@link ExecutorService#awaitTermination(long, TimeUnit)} method if you'd like
+ * to more closely monitor the shutting down process (and finalization of
+ * pending scale operations).
+ * <h3>Reusing Shutdown AsyncScalr</h3>
+ * If you have previously called <code>shutdown</code> on the underlying service
+ * utilized by this class, subsequent calls to any of the operations this class
+ * provides will invoke the internal {@link #checkService()} method which will
+ * replace the terminated underlying {@link ExecutorService} with a new one via
+ * the {@link #createService()} method.
+ * <h3>Custom Implementations</h3>
+ * If a subclass wants to customize the {@link ExecutorService} or
+ * {@link ThreadFactory} used under the covers, this can be done by overriding
+ * the {@link #createService()} method which is invoked by this class anytime a
+ * new {@link ExecutorService} is needed.
+ * <p/>
+ * By default the {@link #createService()} method delegates to the
+ * {@link #createService(ThreadFactory)} method with a new instance of
+ * {@link DefaultThreadFactory}. Either of these methods can be overridden and
+ * customized easily if desired.
+ * <p/>
+ * <strong>TIP</strong>: A common customization to this class is to make the
+ * {@link Thread}s generated by the underlying factory more server-friendly, in
+ * which case the caller would want to use an instance of the
+ * {@link ServerThreadFactory} when creating the new {@link ExecutorService}.
+ * <p/>
+ * This can be done in one line by overriding {@link #createService()} and
+ * returning the result of:
+ * <code>return createService(new ServerThreadFactory());</code>
+ * <p/>
+ * By default this class uses an {@link ThreadPoolExecutor} internally to handle
+ * execution of queued image operations. If a different type of
+ * {@link ExecutorService} is desired, again, simply overriding the
+ * {@link #createService()} method of choice is the right way to do that.
+ *
+ * @author Riyad Kalla (software at thebuzzmedia.com)
+ * @since 3.2
+ */
+ at SuppressWarnings("javadoc")
+public class AsyncScalr {
+ /**
+ * System property name used to set the number of threads the default
+ * underlying {@link ExecutorService} will use to process async image
+ * operations.
+ * <p/>
+ * Value is "<code>imgscalr.async.threadCount</code>".
+ */
+ public static final String THREAD_COUNT_PROPERTY_NAME = "imgscalr.async.threadCount";
+ /**
+ * Number of threads the internal {@link ExecutorService} will use to
+ * simultaneously execute scale requests.
+ * <p/>
+ * This value can be changed by setting the
+ * <code>imgscalr.async.threadCount</code> system property (see
+ * {@link #THREAD_COUNT_PROPERTY_NAME}) to a valid integer value > 0.
+ * <p/>
+ * Default value is <code>1</code>.
+ */
+ public static final int THREAD_COUNT = Integer.getInteger(THREAD_COUNT_PROPERTY_NAME, 1);
+
+ /**
+ * Initializer used to verify the THREAD_COUNT system property.
+ */
+ static {
+ if (THREAD_COUNT < 1)
+ throw new RuntimeException("System property '" + THREAD_COUNT_PROPERTY_NAME + "' set THREAD_COUNT to "
+ + THREAD_COUNT + ", but THREAD_COUNT must be > 0.");
+ }
+
+ protected static ExecutorService service;
+
+ /**
+ * Used to get access to the internal {@link ExecutorService} used by this
+ * class to process scale operations.
+ * <p/>
+ * <strong>NOTE</strong>: You will need to explicitly shutdown any service
+ * currently set on this class before the host JVM exits.
+ * <p/>
+ * You can call {@link ExecutorService#shutdown()} to wait for all scaling
+ * operations to complete first or call
+ * {@link ExecutorService#shutdownNow()} to kill any in-process operations
+ * and purge all pending operations before exiting.
+ * <p/>
+ * Additionally you can use
+ * {@link ExecutorService#awaitTermination(long, TimeUnit)} after issuing a
+ * shutdown command to try and wait until the service has finished all
+ * tasks.
+ *
+ * @return the current {@link ExecutorService} used by this class to process
+ * scale operations.
+ */
+ public static ExecutorService getService() {
+ return service;
+ }
+
+ /**
+ * @see Scalr#apply(BufferedImage, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> apply(final BufferedImage src, final BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ checkService();
+
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.apply(src, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#crop(BufferedImage, int, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> crop(final BufferedImage src, final int width, final int height,
+ final BufferedImageOp... ops) throws IllegalArgumentException,
+ ImagingOpException {
+ checkService();
+
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.crop(src, width, height, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#crop(BufferedImage, int, int, int, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> crop(final BufferedImage src, final int x, final int y, final int width,
+ final int height, final BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ checkService();
+
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.crop(src, x, y, width, height, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#pad(BufferedImage, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> pad(final BufferedImage src, final int padding, final BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.pad(src, padding, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#pad(BufferedImage, int, Color, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> pad(final BufferedImage src, final int padding, final Color color,
+ final BufferedImageOp... ops) throws IllegalArgumentException,
+ ImagingOpException {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.pad(src, padding, color, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#resize(BufferedImage, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> resize(final BufferedImage src,
+ final int targetSize, final BufferedImageOp... ops)
+ throws IllegalArgumentException,
+ ImagingOpException {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.resize(src, targetSize, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#resize(BufferedImage, Method, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> resize(final BufferedImage src,
+ final Method scalingMethod,
+ final int targetSize, final BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.resize(src, scalingMethod, targetSize, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#resize(BufferedImage, Mode, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> resize(final BufferedImage src,
+ final Mode resizeMode, final int targetSize,
+ final BufferedImageOp... ops) throws IllegalArgumentException,
+ ImagingOpException {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.resize(src, resizeMode, targetSize, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#resize(BufferedImage, Method, Mode, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> resize(final BufferedImage src,
+ final Method scalingMethod, final Mode resizeMode,
+ final int targetSize, final BufferedImageOp... ops)
+ throws IllegalArgumentException,
+ ImagingOpException {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.resize(src, scalingMethod, resizeMode, targetSize,
+ ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#resize(BufferedImage, int, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> resize(final BufferedImage src,
+ final int targetWidth, final int targetHeight,
+ final BufferedImageOp... ops) throws IllegalArgumentException,
+ ImagingOpException {
+ checkService();
+
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.resize(src, targetWidth, targetHeight, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#resize(BufferedImage, Method, int, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> resize(final BufferedImage src,
+ final Method scalingMethod, final int targetWidth,
+ final int targetHeight, final BufferedImageOp... ops) {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.resize(src, scalingMethod, targetWidth,
+ targetHeight, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#resize(BufferedImage, Mode, int, int, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> resize(final BufferedImage src,
+ final Mode resizeMode, final int targetWidth,
+ final int targetHeight, final BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.resize(src, resizeMode, targetWidth, targetHeight,
+ ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#resize(BufferedImage, Method, Mode, int, int,
+ * BufferedImageOp...)
+ */
+ public static Future<BufferedImage> resize(final BufferedImage src,
+ final Method scalingMethod,
+ final Mode resizeMode,
+ final int targetWidth, final int targetHeight,
+ final BufferedImageOp... ops) throws IllegalArgumentException,
+ ImagingOpException {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.resize(src, scalingMethod, resizeMode, targetWidth, targetHeight, ops);
+ }
+ });
+ }
+
+ /**
+ * @see Scalr#rotate(BufferedImage, Rotation, BufferedImageOp...)
+ */
+ public static Future<BufferedImage> rotate(final BufferedImage src, final Rotation rotation,
+ final BufferedImageOp... ops) throws IllegalArgumentException,
+ ImagingOpException {
+ checkService();
+ return service.submit(new Callable<BufferedImage>() {
+ public BufferedImage call() throws Exception {
+ return Scalr.rotate(src, rotation, ops);
+ }
+ });
+ }
+
+ protected static ExecutorService createService() {
+ return createService(new DefaultThreadFactory());
+ }
+
+ protected static ExecutorService createService(ThreadFactory factory)
+ throws IllegalArgumentException {
+ if (factory == null)
+ throw new IllegalArgumentException("factory cannot be null");
+ return Executors.newFixedThreadPool(THREAD_COUNT, factory);
+ }
+
+ /**
+ * Used to verify that the underlying <code>service</code> points at an
+ * active {@link ExecutorService} instance that can be used by this class.
+ * <p/>
+ * If <code>service</code> is <code>null</code>, has been shutdown or
+ * terminated then this method will replace it with a new
+ * {@link ExecutorService} by calling the {@link #createService()} method
+ * and assigning the returned value to <code>service</code>.
+ * <p/>
+ * Any subclass that wants to customize the {@link ExecutorService} or
+ * {@link ThreadFactory} used internally by this class should override the
+ * {@link #createService()}.
+ */
+ protected static void checkService() {
+ if (service == null || service.isShutdown() || service.isTerminated()) {
+ /*
+ * If service was shutdown or terminated, assigning a new value will
+ * free the reference to the instance, allowing it to be GC'ed when
+ * it is done shutting down (assuming it hadn't already).
+ */
+ service = createService();
+ }
+ }
+
+ /**
+ * Default {@link ThreadFactory} used by the internal
+ * {@link ExecutorService} to creates execution {@link Thread}s for image
+ * scaling.
+ * <p/>
+ * More or less a copy of the hidden class backing the
+ * {@link Executors#defaultThreadFactory()} method, but exposed here to make
+ * it easier for implementors to extend and customize.
+ *
+ * @author Doug Lea
+ * @author Riyad Kalla (software at thebuzzmedia.com)
+ * @since 4.0
+ */
+ protected static class DefaultThreadFactory implements ThreadFactory {
+ protected static final AtomicInteger poolNumber = new AtomicInteger(1);
+ protected final ThreadGroup group;
+ protected final AtomicInteger threadNumber = new AtomicInteger(1);
+ protected final String namePrefix;
+
+ DefaultThreadFactory() {
+ SecurityManager manager = System.getSecurityManager();
+ /*
+ * Determine the group that threads created by this factory will be
+ * in.
+ */
+ group = (manager == null ? Thread.currentThread().getThreadGroup() : manager.getThreadGroup());
+ /*
+ * Define a common name prefix for the threads created by this
+ * factory.
+ */
+ namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";
+ }
+
+ /**
+ * Used to create a {@link Thread} capable of executing the given
+ * {@link Runnable}.
+ * <p/>
+ * Thread created by this factory are utilized by the parent
+ * {@link ExecutorService} when processing queued up scale operations.
+ */
+ public Thread newThread(Runnable r) {
+ /*
+ * Create a new thread in our specified group with a meaningful
+ * thread name so it is easy to identify.
+ */
+ Thread thread = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0);
+ // Configure thread according to class or subclass
+ thread.setDaemon(false);
+ thread.setPriority(Thread.NORM_PRIORITY);
+ return thread;
+ }
+ }
+
+ /**
+ * An extension of the {@link DefaultThreadFactory} class that makes two
+ * changes to the execution {@link Thread}s it generations:
+ * <ol>
+ * <li>Threads are set to be daemon threads instead of user threads.</li>
+ * <li>Threads execute with a priority of {@link Thread#MIN_PRIORITY} to
+ * make them more compatible with server environment deployments.</li>
+ * </ol>
+ * This class is provided as a convenience for subclasses to use if they
+ * want this (common) customization to the {@link Thread}s used internally
+ * by {@link AsyncScalr} to process images, but don't want to have to write
+ * the implementation.
+ *
+ * @author Riyad Kalla (software at thebuzzmedia.com)
+ * @since 4.0
+ */
+ protected static class ServerThreadFactory extends DefaultThreadFactory {
+ /**
+ * Overridden to set <code>daemon</code> property to <code>true</code>
+ * and decrease the priority of the new thread to
+ * {@link Thread#MIN_PRIORITY} before returning it.
+ */
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread thread = super.newThread(r);
+ thread.setDaemon(true);
+ thread.setPriority(Thread.MIN_PRIORITY);
+ return thread;
+ }
+ }
+}
diff --git a/freeplane/src/main/java/com/thebuzzmedia/imgscalr/Scalr.java b/freeplane/src/main/java/com/thebuzzmedia/imgscalr/Scalr.java
new file mode 100644
index 0000000..124f764
--- /dev/null
+++ b/freeplane/src/main/java/com/thebuzzmedia/imgscalr/Scalr.java
@@ -0,0 +1,2245 @@
+/**
+ * Copyright 2011 The Buzz Media, LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.thebuzzmedia.imgscalr;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.RenderingHints;
+import java.awt.Transparency;
+import java.awt.color.ColorSpace;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.AreaAveragingScaleFilter;
+import java.awt.image.BufferedImage;
+import java.awt.image.BufferedImageOp;
+import java.awt.image.ColorConvertOp;
+import java.awt.image.ColorModel;
+import java.awt.image.ConvolveOp;
+import java.awt.image.ImagingOpException;
+import java.awt.image.IndexColorModel;
+import java.awt.image.Kernel;
+import java.awt.image.RasterFormatException;
+import java.awt.image.RescaleOp;
+
+import javax.imageio.ImageIO;
+
+/**
+ * Class used to implement performant, high-quality and intelligent image
+ * scaling and manipulation algorithms in native Java 2D.
+ * <p/>
+ * This class utilizes the Java2D "best practices" for image manipulation,
+ * ensuring that all operations (even most user-provided {@link BufferedImageOp}
+ * s) are hardware accelerated if provided by the platform and host-VM.
+ * <p/>
+ * <h3>Image Quality</h3>
+ * This class implements a few different methods for scaling an image, providing
+ * either the best-looking result, the fastest result or a balanced result
+ * between the two depending on the scaling hint provided (see {@link Method}).
+ * <p/>
+ * This class also implements an optimized version of the incremental scaling
+ * algorithm presented by Chris Campbell in his <a href="http://today.java
+ * .net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html">Perils of
+ * Image.getScaledInstance()</a> article in order to give the best-looking image
+ * resize results (e.g. generating thumbnails that aren't blurry or jagged).
+ * <p>
+ * The results generated by imgscalr using this method, as compared to a single
+ * {@link RenderingHints#VALUE_INTERPOLATION_BICUBIC} scale operation look much
+ * better, especially when using the {@link Method#ULTRA_QUALITY} method.
+ * <p/>
+ * Only when scaling using the {@link Method#AUTOMATIC} method will this class
+ * look at the size of the image before selecting an approach to scaling the
+ * image. If {@link Method#QUALITY} is specified, the best-looking algorithm
+ * possible is always used.
+ * <p/>
+ * Minor modifications are made to Campbell's original implementation in the
+ * form of:
+ * <ol>
+ * <li>Instead of accepting a user-supplied interpolation method,
+ * {@link RenderingHints#VALUE_INTERPOLATION_BICUBIC} interpolation is always
+ * used. This was done after A/B comparison testing with large images
+ * down-scaled to thumbnail sizes showed noticeable "blurring" when BILINEAR
+ * interpolation was used. Given that Campbell's algorithm is only used in
+ * QUALITY mode when down-scaling, it was determined that the user's expectation
+ * of a much less blurry picture would require that BICUBIC be the default
+ * interpolation in order to meet the QUALITY expectation.</li>
+ * <li>After each iteration of the do-while loop that incrementally scales the
+ * source image down, an explicit effort is made to call
+ * {@link BufferedImage#flush()} on the interim temporary {@link BufferedImage}
+ * instances created by the algorithm in an attempt to ensure a more complete GC
+ * cycle by the VM when cleaning up the temporary instances (this is in addition
+ * to disposing of the temporary {@link Graphics2D} references as well).</li>
+ * <li>Extensive comments have been added to increase readability of the code.</li>
+ * <li>Variable names have been expanded to increase readability of the code.</li>
+ * </ol>
+ * <p/>
+ * <strong>NOTE</strong>: This class does not call {@link BufferedImage#flush()}
+ * on any of the <em>source images</em> passed in by calling code; it is up to
+ * the original caller to dispose of their source images when they are no longer
+ * needed so the VM can most efficiently GC them.
+ * <h3>Image Proportions</h3>
+ * All scaling operations implemented by this class maintain the proportions of
+ * the original image unless a mode of {@link Mode#FIT_EXACT} is specified; in
+ * which case the orientation and proportion of the source image is ignored and
+ * the image is stretched (if necessary) to fit the exact dimensions given.
+ * <p/>
+ * When not using {@link Mode#FIT_EXACT}, in order to maintain the
+ * proportionality of the original images, this class implements the following
+ * behavior:
+ * <ol>
+ * <li>If the image is LANDSCAPE-oriented or SQUARE, treat the
+ * <code>targetWidth</code> as the primary dimension and re-calculate the
+ * <code>targetHeight</code> regardless of what is passed in.</li>
+ * <li>If image is PORTRAIT-oriented, treat the <code>targetHeight</code> as the
+ * primary dimension and re-calculate the <code>targetWidth</code> regardless of
+ * what is passed in.</li>
+ * <li>If a {@link Mode} value of {@link Mode#FIT_TO_WIDTH} or
+ * {@link Mode#FIT_TO_HEIGHT} is passed in to the <code>resize</code> method,
+ * the image's orientation is ignored and the scaled image is fit to the
+ * preferred dimension by using the value passed in by the user for that
+ * dimension and recalculating the other (regardless of image orientation). This
+ * is useful, for example, when working with PORTRAIT oriented images that you
+ * need to all be the same width or visa-versa (e.g. showing user profile
+ * pictures in a directory listing).</li>
+ * </ol>
+ * <h3>Optimized Image Handling</h3>
+ * Java2D provides support for a number of different image types defined as
+ * <code>BufferedImage.TYPE_*</code> variables, unfortunately not all image
+ * types are supported equally in the Java2D rendering pipeline.
+ * <p/>
+ * Some more obscure image types either have poor or no support, leading to
+ * severely degraded quality and processing performance when an attempt is made
+ * by imgscalr to create a scaled instance <em>of the same type</em> as the
+ * source image. In many cases, especially when applying {@link BufferedImageOp}
+ * s, using poorly supported image types can even lead to exceptions or total
+ * corruption of the image (e.g. solid black image).
+ * <p/>
+ * imgscalr specifically accounts for and automatically hands
+ * <strong>ALL</strong> of these pain points for you internally by shuffling all
+ * images into one of two types:
+ * <ol>
+ * <li>{@link BufferedImage#TYPE_INT_RGB}</li>
+ * <li>{@link BufferedImage#TYPE_INT_ARGB}</li>
+ * </ol>
+ * depending on if the source image utilizes transparency or not. This is a
+ * recommended approach by the Java2D team for dealing with poorly (or non)
+ * supported image types. More can be read about this issue <a href=
+ * "http://www.mail-archive.com/java2d-interest@capra.eng.sun.com/msg05621.html"
+ * >here</a>.
+ * <p/>
+ * This is also the reason we recommend using
+ * {@link #apply(BufferedImage, BufferedImageOp...)} to apply your own ops to
+ * images even if you aren't using imgscalr for anything else.
+ * <h3>GIF Transparency</h3>
+ * Unfortunately in Java 6 and earlier, support for GIF's
+ * {@link IndexColorModel} is sub-par, both in accurate color-selection and in
+ * maintaining transparency when moving to an image of type
+ * {@link BufferedImage#TYPE_INT_ARGB}; because of this issue when a GIF image
+ * is processed by imgscalr and the result saved as a GIF file (instead of PNG),
+ * it is possible to lose the alpha channel of a transparent image or in the
+ * case of applying an optional {@link BufferedImageOp}, lose the entire picture
+ * all together in the result (long standing JDK bugs are filed for all of these
+ * issues).
+ * <p/>
+ * imgscalr currently does nothing to work around this manually because it is a
+ * defect in the native platform code itself. Fortunately it looks like the
+ * issues are half-fixed in Java 7 and any manual workarounds we could attempt
+ * internally are relatively expensive, in the form of hand-creating and setting
+ * RGB values pixel-by-pixel with a custom {@link ColorModel} in the scaled
+ * image. This would lead to a very measurable negative impact on performance
+ * without the caller understanding why.
+ * <p>
+ * <strong>Workaround</strong>: A workaround to this issue with all version of
+ * Java is to simply save a GIF as a PNG; no change to your code needs to be
+ * made except when the image is saved out, e.g. using {@link ImageIO}.
+ * <p>
+ * When a file type of "PNG" is used, both the transparency and high color
+ * quality will be maintained as the PNG code path in Java2D is superior to the
+ * GIF implementation.
+ * <p>
+ * If the issue with optional {@link BufferedImageOp}s destroying GIF image
+ * content is ever fixed in the platform, saving out resulting images as GIFs
+ * should suddenly start working.
+ * <p>
+ * More can be read about the issue <a
+ * href="http://gman.eichberger.de/2007/07/transparent-gifs-in-java.html"
+ * >here</a> and <a
+ * href="http://ubuntuforums.org/archive/index.php/t-1060128.html">here</a>.
+ * <h3>Thread Safety</h3>
+ * The {@link Scalr} class is <strong>thread-safe</strong> (as all the methods
+ * are <code>static</code>); this class maintains no internal state while
+ * performing any of the provided operations and is safe to call simultaneously
+ * from multiple threads.
+ * <h3>Logging</h3>
+ * This class implements all its debug logging via the
+ * {@link #log(int, String, Object...)} method. At this time logging is done
+ * directly to <code>System.out</code> via the <code>printf</code> method. This
+ * allows the logging to be light weight and easy to capture (every imgscalr log
+ * message is prefixed with the {@link #LOG_PREFIX} string) while adding no
+ * dependencies to the library.
+ * <p/>
+ * Implementation of logging in this class is as efficient as possible; avoiding
+ * any calls to the logger method or passing of arguments if logging is not
+ * enabled to avoid the (hidden) cost of constructing the Object[] argument for
+ * the varargs-based method call.
+ *
+ * @author Riyad Kalla (software at thebuzzmedia.com)
+ * @since 1.1
+ */
+public class Scalr {
+ /**
+ * System property name used to define the debug boolean flag.
+ * <p/>
+ * Value is "<code>imgscalr.debug</code>".
+ */
+ public static final String DEBUG_PROPERTY_NAME = "imgscalr.debug";
+ /**
+ * System property name used to define a custom log prefix.
+ * <p/>
+ * Value is "<code>imgscalr.logPrefix</code>".
+ */
+ public static final String LOG_PREFIX_PROPERTY_NAME = "imgscalr.logPrefix";
+ /**
+ * Flag used to indicate if debugging output has been enabled by setting the
+ * "<code>imgscalr.debug</code>" system property to <code>true</code>. This
+ * value will be <code>false</code> if the "<code>imgscalr.debug</code>"
+ * system property is undefined or set to <code>false</code>.
+ * <p/>
+ * This property can be set on startup with:<br/>
+ * <code>
+ * -Dimgscalr.debug=true
+ * </code> or by calling {@link System#setProperty(String, String)} to set a
+ * new property value for {@link #DEBUG_PROPERTY_NAME} before this class is
+ * loaded.
+ * <p/>
+ * Default value is <code>false</code>.
+ */
+ public static final boolean DEBUG = Boolean.getBoolean(DEBUG_PROPERTY_NAME);
+
+ /**
+ * Prefix to every log message this library logs. Using a well-defined
+ * prefix helps make it easier both visually and programmatically to scan
+ * log files for messages produced by this library.
+ * <p/>
+ * This property can be set on startup with:<br/>
+ * <code>
+ * -Dimgscalr.logPrefix=<YOUR PREFIX HERE>
+ * </code> or by calling {@link System#setProperty(String, String)} to set a
+ * new property value for {@link #LOG_PREFIX_PROPERTY_NAME} before this
+ * class is loaded.
+ * <p/>
+ * Default value is "<code>[imgscalr] </code>" (including the space).
+ */
+ public static final String LOG_PREFIX = System.getProperty(LOG_PREFIX_PROPERTY_NAME, "[imgscalr] ");
+
+ /**
+ * A {@link ConvolveOp} using a very light "blur" kernel that acts like an
+ * anti-aliasing filter (softens the image a bit) when applied to an image.
+ * <p/>
+ * A common request by users of the library was that they wished to "soften"
+ * resulting images when scaling them down drastically. After quite a bit of
+ * A/B testing, the kernel used by this Op was selected as the closest match
+ * for the target which was the softer results from the deprecated
+ * {@link AreaAveragingScaleFilter} (which is used internally by the
+ * deprecated {@link Image#getScaledInstance(int, int, int)} method in the
+ * JDK that imgscalr is meant to replace).
+ * <p/>
+ * This ConvolveOp uses a 3x3 kernel with the values:
+ * <table cellpadding="4" border="1">
+ * <tr>
+ * <td>.0f</td>
+ * <td>.08f</td>
+ * <td>.0f</td>
+ * </tr>
+ * <tr>
+ * <td>.08f</td>
+ * <td>.68f</td>
+ * <td>.08f</td>
+ * </tr>
+ * <tr>
+ * <td>.0f</td>
+ * <td>.08f</td>
+ * <td>.0f</td>
+ * </tr>
+ * </table>
+ * <p/>
+ * For those that have worked with ConvolveOps before, this Op uses the
+ * {@link ConvolveOp#EDGE_NO_OP} instruction to not process the pixels along
+ * the very edge of the image (otherwise EDGE_ZERO_FILL would create a
+ * black-border around the image). If you have not worked with a ConvolveOp
+ * before, it just means this default OP will "do the right thing" and not
+ * give you garbage results.
+ * <p/>
+ * This ConvolveOp uses no {@link RenderingHints} values as internally the
+ * {@link ConvolveOp} class only uses hints when doing a color conversion
+ * between the source and destination {@link BufferedImage} targets.
+ * imgscalr allows the {@link ConvolveOp} to create its own destination
+ * image every time, so no color conversion is ever needed and thus no
+ * hints.
+ * <h3>Performance</h3>
+ * Use of this (and other) {@link ConvolveOp}s are hardware accelerated when
+ * possible. For more information on if your image op is hardware
+ * accelerated or not, check the source code of the underlying JDK class
+ * that actually executes the Op code, <a href=
+ * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
+ * >sun.awt.image.ImagingLib</a>.
+ * <h3>Known Issues</h3>
+ * In all versions of Java (tested up to Java 7 preview Build 131), running
+ * this op against a GIF with transparency and attempting to save the
+ * resulting image as a GIF results in a corrupted/empty file. The file must
+ * be saved out as a PNG to maintain the transparency.
+ *
+ * @since 3.0
+ */
+ public static final ConvolveOp OP_ANTIALIAS = new ConvolveOp(
+ new Kernel(3, 3, new float[] { .0f, .08f, .0f, .08f, .68f, .08f,
+ .0f, .08f, .0f }), ConvolveOp.EDGE_NO_OP, null);
+
+ /**
+ * A {@link RescaleOp} used to make any input image 10% darker.
+ * <p/>
+ * This operation can be applied multiple times in a row if greater than 10%
+ * changes in brightness are desired.
+ *
+ * @since 4.0
+ */
+ public static final RescaleOp OP_DARKER = new RescaleOp(0.9f, 0, null);
+ /**
+ * A {@link RescaleOp} used to make any input image 10% brighter.
+ * <p/>
+ * This operation can be applied multiple times in a row if greater than 10%
+ * changes in brightness are desired.
+ *
+ * @since 4.0
+ */
+ public static final RescaleOp OP_BRIGHTER = new RescaleOp(1.1f, 0, null);
+ /**
+ * A {@link ColorConvertOp} used to convert any image to a grayscale color
+ * palette.
+ * <p/>
+ * Applying this op multiple times to the same image has no compounding
+ * effects.
+ *
+ * @since 4.0
+ */
+ public static final ColorConvertOp OP_GRAYSCALE = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY),
+ null);
+ /**
+ * Static initializer used to prepare some of the variables used by this
+ * class.
+ */
+ static {
+ log(0, "Debug output ENABLED");
+ }
+
+ /**
+ * Used to define the different scaling hints that the algorithm can use.
+ *
+ * @author Riyad Kalla (software at thebuzzmedia.com)
+ * @since 1.1
+ */
+ public static enum Method {
+ /**
+ * Used to indicate that the scaling implementation should decide which
+ * method to use in order to get the best looking scaled image in the
+ * least amount of time.
+ * <p/>
+ * The scaling algorithm will use the
+ * {@link Scalr#THRESHOLD_QUALITY_BALANCED} or
+ * {@link Scalr#THRESHOLD_BALANCED_SPEED} thresholds as cut-offs to
+ * decide between selecting the <code>QUALITY</code>,
+ * <code>BALANCED</code> or <code>SPEED</code> scaling algorithms.
+ * <p/>
+ * By default the thresholds chosen will give nearly the best looking
+ * result in the fastest amount of time. We intend this method to work
+ * for 80% of people looking to scale an image quickly and get a good
+ * looking result.
+ */
+ AUTOMATIC,
+ /**
+ * Used to indicate that the scaling implementation should scale as fast
+ * as possible and return a result. For smaller images (800px in size)
+ * this can result in noticeable aliasing but it can be a few magnitudes
+ * times faster than using the QUALITY method.
+ */
+ SPEED,
+ /**
+ * Used to indicate that the scaling implementation should use a scaling
+ * operation balanced between SPEED and QUALITY. Sometimes SPEED looks
+ * too low quality to be useful (e.g. text can become unreadable when
+ * scaled using SPEED) but using QUALITY mode will increase the
+ * processing time too much. This mode provides a "better than SPEED"
+ * quality in a "less than QUALITY" amount of time.
+ */
+ BALANCED,
+ /**
+ * Used to indicate that the scaling implementation should do everything
+ * it can to create as nice of a result as possible. This approach is
+ * most important for smaller pictures (800px or smaller) and less
+ * important for larger pictures as the difference between this method
+ * and the SPEED method become less and less noticeable as the
+ * source-image size increases. Using the AUTOMATIC method will
+ * automatically prefer the QUALITY method when scaling an image down
+ * below 800px in size.
+ */
+ QUALITY,
+ /**
+ * Used to indicate that the scaling implementation should go above and
+ * beyond the work done by {@link Method#QUALITY} to make the image look
+ * exceptionally good at the cost of more processing time. This is
+ * especially evident when generating thumbnails of images that look
+ * jagged with some of the other {@link Method}s (even
+ * {@link Method#QUALITY}).
+ */
+ ULTRA_QUALITY;
+ }
+
+ /**
+ * Used to define the different modes of resizing that the algorithm can
+ * use.
+ *
+ * @author Riyad Kalla (software at thebuzzmedia.com)
+ * @since 3.1
+ */
+ public static enum Mode {
+ /**
+ * Used to indicate that the scaling implementation should calculate
+ * dimensions for the resultant image by looking at the image's
+ * orientation and generating proportional dimensions that best fit into
+ * the target width and height given
+ *
+ * See "Image Proportions" in the {@link Scalr} class description for
+ * more detail.
+ */
+ AUTOMATIC,
+ /**
+ * Used to fit the image to the exact dimensions given regardless of the
+ * image's proportions. If the dimensions are not proportionally
+ * correct, this will introduce vertical or horizontal stretching to the
+ * image.
+ * <p/>
+ * It is recommended that you use one of the other <code>FIT_TO</code>
+ * modes or {@link Mode#AUTOMATIC} if you want the image to look
+ * correct, but if dimension-fitting is the #1 priority regardless of
+ * how it makes the image look, that is what this mode is for.
+ */
+ FIT_EXACT,
+ /**
+ * Used to indicate that the scaling implementation should calculate
+ * dimensions for the largest image that fit within the bounding box,
+ * without cropping or distortion, retaining the original proportions.
+ */
+ BEST_FIT_BOTH,
+ /**
+ * Used to indicate that the scaling implementation should calculate
+ * dimensions for the resultant image that best-fit within the given
+ * width, regardless of the orientation of the image.
+ */
+ FIT_TO_WIDTH,
+ /**
+ * Used to indicate that the scaling implementation should calculate
+ * dimensions for the resultant image that best-fit within the given
+ * height, regardless of the orientation of the image.
+ */
+ FIT_TO_HEIGHT;
+ }
+
+ /**
+ * Used to define the different types of rotations that can be applied to an
+ * image during a resize operation.
+ *
+ * @author Riyad Kalla (software at thebuzzmedia.com)
+ * @since 3.2
+ */
+ public static enum Rotation {
+ /**
+ * 90-degree, clockwise rotation (to the right). This is equivalent to a
+ * quarter-turn of the image to the right; moving the picture on to its
+ * right side.
+ */
+ CW_90,
+ /**
+ * 180-degree, clockwise rotation (to the right). This is equivalent to
+ * 1 half-turn of the image to the right; rotating the picture around
+ * until it is upside down from the original position.
+ */
+ CW_180,
+ /**
+ * 270-degree, clockwise rotation (to the right). This is equivalent to
+ * a quarter-turn of the image to the left; moving the picture on to its
+ * left side.
+ */
+ CW_270,
+ /**
+ * Flip the image horizontally by reflecting it around the y axis.
+ * <p/>
+ * This is not a standard rotation around a center point, but instead
+ * creates the mirrored reflection of the image horizontally.
+ * <p/>
+ * More specifically, the vertical orientation of the image stays the
+ * same (the top stays on top, and the bottom on bottom), but the right
+ * and left sides flip. This is different than a standard rotation where
+ * the top and bottom would also have been flipped.
+ */
+ FLIP_HORZ,
+ /**
+ * Flip the image vertically by reflecting it around the x axis.
+ * <p/>
+ * This is not a standard rotation around a center point, but instead
+ * creates the mirrored reflection of the image vertically.
+ * <p/>
+ * More specifically, the horizontal orientation of the image stays the
+ * same (the left stays on the left and the right stays on the right),
+ * but the top and bottom sides flip. This is different than a standard
+ * rotation where the left and right would also have been flipped.
+ */
+ FLIP_VERT;
+ }
+
+ /**
+ * Threshold (in pixels) at which point the scaling operation using the
+ * {@link Method#AUTOMATIC} method will decide if a {@link Method#BALANCED}
+ * method will be used (if smaller than or equal to threshold) or a
+ * {@link Method#SPEED} method will be used (if larger than threshold).
+ * <p/>
+ * The bigger the image is being scaled to, the less noticeable degradations
+ * in the image becomes and the faster algorithms can be selected.
+ * <p/>
+ * The value of this threshold (1600) was chosen after visual, by-hand, A/B
+ * testing between different types of images scaled with this library; both
+ * photographs and screenshots. It was determined that images below this
+ * size need to use a {@link Method#BALANCED} scale method to look decent in
+ * most all cases while using the faster {@link Method#SPEED} method for
+ * images bigger than this threshold showed no noticeable degradation over a
+ * <code>BALANCED</code> scale.
+ */
+ public static final int THRESHOLD_BALANCED_SPEED = 1600;
+
+ /**
+ * Threshold (in pixels) at which point the scaling operation using the
+ * {@link Method#AUTOMATIC} method will decide if a {@link Method#QUALITY}
+ * method will be used (if smaller than or equal to threshold) or a
+ * {@link Method#BALANCED} method will be used (if larger than threshold).
+ * <p/>
+ * The bigger the image is being scaled to, the less noticeable degradations
+ * in the image becomes and the faster algorithms can be selected.
+ * <p/>
+ * The value of this threshold (800) was chosen after visual, by-hand, A/B
+ * testing between different types of images scaled with this library; both
+ * photographs and screenshots. It was determined that images below this
+ * size need to use a {@link Method#QUALITY} scale method to look decent in
+ * most all cases while using the faster {@link Method#BALANCED} method for
+ * images bigger than this threshold showed no noticeable degradation over a
+ * <code>QUALITY</code> scale.
+ */
+ public static final int THRESHOLD_QUALITY_BALANCED = 800;
+
+ /**
+ * Used to apply, in the order given, 1 or more {@link BufferedImageOp}s to
+ * a given {@link BufferedImage} and return the result.
+ * <p/>
+ * <strong>Feature</strong>: This implementation works around <a
+ * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4965606">a
+ * decade-old JDK bug</a> that can cause a {@link RasterFormatException}
+ * when applying a perfectly valid {@link BufferedImageOp}s to images.
+ * <p/>
+ * <strong>Feature</strong>: This implementation also works around
+ * {@link BufferedImageOp}s failing to apply and throwing
+ * {@link ImagingOpException}s when run against a <code>src</code> image
+ * type that is poorly supported. Unfortunately using {@link ImageIO} and
+ * standard Java methods to load images provides no consistency in getting
+ * images in well-supported formats. This method automatically accounts and
+ * corrects for all those problems (if necessary).
+ * <p/>
+ * It is recommended you always use this method to apply any
+ * {@link BufferedImageOp}s instead of relying on directly using the
+ * {@link BufferedImageOp#filter(BufferedImage, BufferedImage)} method.
+ * <p/>
+ * <strong>Performance</strong>: Not all {@link BufferedImageOp}s are
+ * hardware accelerated operations, but many of the most popular (like
+ * {@link ConvolveOp}) are. For more information on if your image op is
+ * hardware accelerated or not, check the source code of the underlying JDK
+ * class that actually executes the Op code, <a href=
+ * "http://www.docjar.com/html/api/sun/awt/image/ImagingLib.java.html"
+ * >sun.awt.image.ImagingLib</a>.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will have the ops applied to it.
+ * @param ops
+ * <code>1</code> or more ops to apply to the image.
+ *
+ * @return a new {@link BufferedImage} that represents the <code>src</code>
+ * with all the given operations applied to it.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>ops</code> is <code>null</code> or empty.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ */
+ public static BufferedImage apply(BufferedImage src, BufferedImageOp... ops) throws IllegalArgumentException,
+ ImagingOpException {
+ long t = -1;
+ if (DEBUG)
+ t = System.currentTimeMillis();
+ if (src == null)
+ throw new IllegalArgumentException("src cannot be null");
+ if (ops == null || ops.length == 0)
+ throw new IllegalArgumentException("ops cannot be null or empty");
+ int type = src.getType();
+ /*
+ * Ensure the src image is in the best supported image type before we
+ * continue, otherwise it is possible our calls below to getBounds2D and
+ * certainly filter(...) may fail if not.
+ *
+ * Java2D makes an attempt at applying most BufferedImageOps using
+ * hardware acceleration via the ImagingLib internal library.
+ *
+ * Unfortunately may of the BufferedImageOp are written to simply fail
+ * with an ImagingOpException if the operation cannot be applied with no
+ * additional information about what went wrong or attempts at
+ * re-applying it in different ways.
+ *
+ * This is assuming the failing BufferedImageOp even returns a null
+ * image after failing to apply; some simply return a corrupted/black
+ * image that result in no exception and it is up to the user to
+ * discover this.
+ *
+ * In internal testing, EVERY failure I've ever seen was the result of
+ * the source image being in a poorly-supported BufferedImage Type like
+ * BGR or ABGR (even though it was loaded with ImageIO).
+ *
+ * To avoid this nasty/stupid surprise with BufferedImageOps, we always
+ * ensure that the src image starts in an optimally supported format
+ * before we try and apply the filter.
+ */
+ if (!(type == BufferedImage.TYPE_INT_RGB || type == BufferedImage.TYPE_INT_ARGB))
+ src = copyToOptimalImage(src);
+ if (DEBUG)
+ log(0, "Applying %d BufferedImageOps...", ops.length);
+ boolean hasReassignedSrc = false;
+ for (int i = 0; i < ops.length; i++) {
+ long subT = -1;
+ if (DEBUG)
+ subT = System.currentTimeMillis();
+ BufferedImageOp op = ops[i];
+ // Skip null ops instead of throwing an exception.
+ if (op == null)
+ continue;
+ if (DEBUG)
+ log(1, "Applying BufferedImageOp [class=%s, toString=%s]...", op.getClass(), op.toString());
+ /*
+ * Must use op.getBounds instead of src.getWidth and src.getHeight
+ * because we are trying to create an image big enough to hold the
+ * result of this operation (which may be to scale the image
+ * smaller), in that case the bounds reported by this op and the
+ * bounds reported by the source image will be different.
+ */
+ Rectangle2D resultBounds = op.getBounds2D(src);
+ // Watch out for flaky/misbehaving ops that fail to work right.
+ if (resultBounds == null)
+ throw new ImagingOpException(
+ "BufferedImageOp ["
+ + op.toString()
+ + "] getBounds2D(src) returned null bounds for the target image; this should not happen and indicates a problem with application of this type of op.");
+ /*
+ * We must manually create the target image; we cannot rely on the
+ * null-destination filter() method to create a valid destination
+ * for us thanks to this JDK bug that has been filed for almost a
+ * decade:
+ * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4965606
+ */
+ BufferedImage dest = createOptimalImage(src, (int) Math.round(resultBounds.getWidth()),
+ (int) Math.round(resultBounds.getHeight()));
+ // Perform the operation, update our result to return.
+ BufferedImage result = op.filter(src, dest);
+ /*
+ * Flush the 'src' image ONLY IF it is one of our interim temporary
+ * images being used when applying 2 or more operations back to
+ * back. We never want to flush the original image passed in.
+ */
+ if (hasReassignedSrc)
+ src.flush();
+ /*
+ * Incase there are more operations to perform, update what we
+ * consider the 'src' reference to our last result so on the next
+ * iteration the next op is applied to this result and not back
+ * against the original src passed in.
+ */
+ src = result;
+ /*
+ * Keep track of when we re-assign 'src' to an interim temporary
+ * image, so we know when we can explicitly flush it and clean up
+ * references on future iterations.
+ */
+ hasReassignedSrc = true;
+ if (DEBUG)
+ log(1, "Applied BufferedImageOp in %d ms, result [width=%d, height=%d]", System.currentTimeMillis()
+ - subT, result.getWidth(), result.getHeight());
+ }
+ if (DEBUG)
+ log(0, "All %d BufferedImageOps applied in %d ms", ops.length, System.currentTimeMillis() - t);
+ return src;
+ }
+
+ /**
+ * Used to crop the given <code>src</code> image from the top-left corner
+ * and applying any optional {@link BufferedImageOp}s to the result before
+ * returning it.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image to crop.
+ * @param width
+ * The width of the bounding cropping box.
+ * @param height
+ * The height of the bounding cropping box.
+ * @param ops
+ * <code>0</code> or more ops to apply to the image. If
+ * <code>null</code> or empty then <code>src</code> is return
+ * unmodified.
+ *
+ * @return a new {@link BufferedImage} representing the cropped region of
+ * the <code>src</code> image with any optional operations applied
+ * to it.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if any coordinates of the bounding crop box is invalid within
+ * the bounds of the <code>src</code> image (e.g. negative or
+ * too big).
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ */
+ public static BufferedImage crop(BufferedImage src, int width, int height, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ return crop(src, 0, 0, width, height, ops);
+ }
+
+ /**
+ * Used to crop the given <code>src</code> image and apply any optional
+ * {@link BufferedImageOp}s to it before returning the result.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image to crop.
+ * @param x
+ * The x-coordinate of the top-left corner of the bounding box
+ * used for cropping.
+ * @param y
+ * The y-coordinate of the top-left corner of the bounding box
+ * used for cropping.
+ * @param width
+ * The width of the bounding cropping box.
+ * @param height
+ * The height of the bounding cropping box.
+ * @param ops
+ * <code>0</code> or more ops to apply to the image. If
+ * <code>null</code> or empty then <code>src</code> is return
+ * unmodified.
+ *
+ * @return a new {@link BufferedImage} representing the cropped region of
+ * the <code>src</code> image with any optional operations applied
+ * to it.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if any coordinates of the bounding crop box is invalid within
+ * the bounds of the <code>src</code> image (e.g. negative or
+ * too big).
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ */
+ public static BufferedImage crop(BufferedImage src, int x, int y, int width, int height, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ long t = -1;
+ if (DEBUG)
+ t = System.currentTimeMillis();
+ if (src == null)
+ throw new IllegalArgumentException("src cannot be null");
+ if (x < 0 || y < 0 || width < 0 || height < 0)
+ throw new IllegalArgumentException("Invalid crop bounds: x [" + x + "], y [" + y + "], width [" + width
+ + "] and height [" + height + "] must all be >= 0");
+ int srcWidth = src.getWidth();
+ int srcHeight = src.getHeight();
+ if ((x + width) > srcWidth)
+ throw new IllegalArgumentException("Invalid crop bounds: x + width [" + (x + width)
+ + "] must be <= src.getWidth() [" + srcWidth + "]");
+ if ((y + height) > srcHeight)
+ throw new IllegalArgumentException("Invalid crop bounds: y + height [" + (y + height)
+ + "] must be <= src.getHeight() [" + srcHeight + "]");
+ if (DEBUG)
+ log(0, "Cropping Image [width=%d, height=%d] to [x=%d, y=%d, width=%d, height=%d]...", srcWidth, srcHeight,
+ x, y, width, height);
+ // Create a target image of an optimal type to render into.
+ BufferedImage result = createOptimalImage(src, width, height);
+ Graphics g = result.getGraphics();
+ /*
+ * Render the region specified by our crop bounds from the src image
+ * directly into our result image (which is the exact size of the crop
+ * region).
+ */
+ g.drawImage(src, 0, 0, width, height, x, y, (x + width), (y + height), null);
+ g.dispose();
+ if (DEBUG)
+ log(0, "Cropped Image in %d ms", System.currentTimeMillis() - t);
+ // Apply any optional operations (if specified).
+ if (ops != null && ops.length > 0)
+ result = apply(result, ops);
+ return result;
+ }
+
+ /**
+ * Used to apply padding around the edges of an image using
+ * {@link Color#BLACK} to fill the extra padded space and then return the
+ * result.
+ * <p/>
+ * The amount of <code>padding</code> specified is applied to all sides;
+ * more specifically, a <code>padding</code> of <code>2</code> would add 2
+ * extra pixels of space (filled by the given <code>color</code>) on the
+ * top, bottom, left and right sides of the resulting image causing the
+ * result to be 4 pixels wider and 4 pixels taller than the <code>src</code>
+ * image.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image the padding will be added to.
+ * @param padding
+ * The number of pixels of padding to add to each side in the
+ * resulting image. If this value is <code>0</code> then
+ * <code>src</code> is returned unmodified.
+ * @param ops
+ * <code>0</code> or more ops to apply to the image. If
+ * <code>null</code> or empty then <code>src</code> is return
+ * unmodified.
+ *
+ * @return a new {@link BufferedImage} representing <code>src</code> with
+ * the given padding applied to it.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>padding</code> is < <code>1</code>.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ */
+ public static BufferedImage pad(BufferedImage src, int padding, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ return pad(src, padding, Color.BLACK);
+ }
+
+ /**
+ * Used to apply padding around the edges of an image using the given color
+ * to fill the extra padded space and then return the result. {@link Color}s
+ * using an alpha channel (i.e. transparency) are supported.
+ * <p/>
+ * The amount of <code>padding</code> specified is applied to all sides;
+ * more specifically, a <code>padding</code> of <code>2</code> would add 2
+ * extra pixels of space (filled by the given <code>color</code>) on the
+ * top, bottom, left and right sides of the resulting image causing the
+ * result to be 4 pixels wider and 4 pixels taller than the <code>src</code>
+ * image.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image the padding will be added to.
+ * @param padding
+ * The number of pixels of padding to add to each side in the
+ * resulting image. If this value is <code>0</code> then
+ * <code>src</code> is returned unmodified.
+ * @param color
+ * The color to fill the padded space with. {@link Color}s using
+ * an alpha channel (i.e. transparency) are supported.
+ * @param ops
+ * <code>0</code> or more ops to apply to the image. If
+ * <code>null</code> or empty then <code>src</code> is return
+ * unmodified.
+ *
+ * @return a new {@link BufferedImage} representing <code>src</code> with
+ * the given padding applied to it.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>padding</code> is < <code>1</code>.
+ * @throws IllegalArgumentException
+ * if <code>color</code> is <code>null</code>.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ */
+ public static BufferedImage pad(BufferedImage src, int padding, Color color, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ long t = -1;
+ if (DEBUG)
+ t = System.currentTimeMillis();
+ if (src == null)
+ throw new IllegalArgumentException("src cannot be null");
+ if (padding < 1)
+ throw new IllegalArgumentException("padding [" + padding + "] must be > 0");
+ if (color == null)
+ throw new IllegalArgumentException("color cannot be null");
+ int srcWidth = src.getWidth();
+ int srcHeight = src.getHeight();
+ /*
+ * Double the padding to account for all sides of the image. More
+ * specifically, if padding is "1" we add 2 pixels to width and 2 to
+ * height, so we have 1 new pixel of padding all the way around our
+ * image.
+ */
+ int sizeDiff = (padding * 2);
+ int newWidth = srcWidth + sizeDiff;
+ int newHeight = srcHeight + sizeDiff;
+ if (DEBUG)
+ log(0,
+ "Padding Image from [originalWidth=%d, originalHeight=%d, padding=%d] to [newWidth=%d, newHeight=%d]...",
+ srcWidth, srcHeight, padding, newWidth, newHeight);
+ boolean colorHasAlpha = (color.getAlpha() != 255);
+ boolean imageHasAlpha = (src.getTransparency() != BufferedImage.OPAQUE);
+ BufferedImage result;
+ /*
+ * We need to make sure our resulting image that we render into contains
+ * alpha if either our original image OR the padding color we are using
+ * contain it.
+ */
+ if (colorHasAlpha || imageHasAlpha) {
+ if (DEBUG)
+ log(1, "Transparency FOUND in source image or color, using ARGB image type...");
+ result = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
+ }
+ else {
+ if (DEBUG)
+ log(1, "Transparency NOT FOUND in source image or color, using RGB image type...");
+ result = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
+ }
+ Graphics g = result.getGraphics();
+ // "Clear" the background of the new image with our padding color first.
+ g.setColor(color);
+ g.fillRect(0, 0, newWidth, newHeight);
+ // Draw the image into the center of the new padded image.
+ g.drawImage(src, padding, padding, null);
+ g.dispose();
+ if (DEBUG)
+ log(0, "Padding Applied in %d ms", System.currentTimeMillis() - t);
+ // Apply any optional operations (if specified).
+ if (ops != null && ops.length > 0)
+ result = apply(result, ops);
+ return result;
+ }
+
+ /**
+ * Resize a given image (maintaining its original proportion) to a width and
+ * height no bigger than <code>targetSize</code> and apply the given
+ * {@link BufferedImageOp}s (if any) to the result before returning it.
+ * <p/>
+ * A scaling method of {@link Method#AUTOMATIC} and mode of
+ * {@link Mode#AUTOMATIC} are used.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param targetSize
+ * The target width and height (square) that you wish the image
+ * to fit within.
+ * @param ops
+ * <code>0</code> or more optional image operations (e.g.
+ * sharpen, blur, etc.) that can be applied to the final result
+ * before returning the image.
+ *
+ * @return a new {@link BufferedImage} representing the scaled
+ * <code>src</code> image.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>targetSize</code> is < 0.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ */
+ public static BufferedImage resize(BufferedImage src, int targetSize, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ return resize(src, Method.AUTOMATIC, Mode.AUTOMATIC, targetSize, targetSize, ops);
+ }
+
+ /**
+ * Resize a given image (maintaining its original proportion) to a width and
+ * height no bigger than <code>targetSize</code> using the given scaling
+ * method and apply the given {@link BufferedImageOp}s (if any) to the
+ * result before returning it.
+ * <p/>
+ * A mode of {@link Mode#AUTOMATIC} is used.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param scalingMethod
+ * The method used for scaling the image; preferring speed to
+ * quality or a balance of both.
+ * @param targetSize
+ * The target width and height (square) that you wish the image
+ * to fit within.
+ * @param ops
+ * <code>0</code> or more optional image operations (e.g.
+ * sharpen, blur, etc.) that can be applied to the final result
+ * before returning the image.
+ *
+ * @return a new {@link BufferedImage} representing the scaled
+ * <code>src</code> image.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>scalingMethod</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>targetSize</code> is < 0.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ *
+ * @see Method
+ */
+ public static BufferedImage resize(BufferedImage src, Method scalingMethod, int targetSize, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ return resize(src, scalingMethod, Mode.AUTOMATIC, targetSize,
+ targetSize, ops);
+ }
+
+ /**
+ * Resize a given image (maintaining its original proportion) to a width and
+ * height no bigger than <code>targetSize</code> (or fitting the image to
+ * the given WIDTH or HEIGHT explicitly, depending on the {@link Mode}
+ * specified) and apply the given {@link BufferedImageOp}s (if any) to the
+ * result before returning it.
+ * <p/>
+ * A scaling method of {@link Method#AUTOMATIC} is used.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param resizeMode
+ * Used to indicate how imgscalr should calculate the final
+ * target size for the image, either fitting the image to the
+ * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
+ * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
+ * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
+ * proportional dimensions for the scaled image based on its
+ * orientation (landscape, square or portrait). Unless you have
+ * very specific size requirements, most of the time you just
+ * want to use {@link Mode#AUTOMATIC} to "do the right thing".
+ * @param targetSize
+ * The target width and height (square) that you wish the image
+ * to fit within.
+ * @param ops
+ * <code>0</code> or more optional image operations (e.g.
+ * sharpen, blur, etc.) that can be applied to the final result
+ * before returning the image.
+ *
+ * @return a new {@link BufferedImage} representing the scaled
+ * <code>src</code> image.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>resizeMode</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>targetSize</code> is < 0.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ *
+ * @see Mode
+ */
+ public static BufferedImage resize(BufferedImage src, Mode resizeMode, int targetSize, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ return resize(src, Method.AUTOMATIC, resizeMode, targetSize, targetSize, ops);
+ }
+
+ /**
+ * Resize a given image (maintaining its original proportion) to a width and
+ * height no bigger than <code>targetSize</code> (or fitting the image to
+ * the given WIDTH or HEIGHT explicitly, depending on the {@link Mode}
+ * specified) using the given scaling method and apply the given
+ * {@link BufferedImageOp}s (if any) to the result before returning it.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param scalingMethod
+ * The method used for scaling the image; preferring speed to
+ * quality or a balance of both.
+ * @param resizeMode
+ * Used to indicate how imgscalr should calculate the final
+ * target size for the image, either fitting the image to the
+ * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
+ * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
+ * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
+ * proportional dimensions for the scaled image based on its
+ * orientation (landscape, square or portrait). Unless you have
+ * very specific size requirements, most of the time you just
+ * want to use {@link Mode#AUTOMATIC} to "do the right thing".
+ * @param targetSize
+ * The target width and height (square) that you wish the image
+ * to fit within.
+ * @param ops
+ * <code>0</code> or more optional image operations (e.g.
+ * sharpen, blur, etc.) that can be applied to the final result
+ * before returning the image.
+ *
+ * @return a new {@link BufferedImage} representing the scaled
+ * <code>src</code> image.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>scalingMethod</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>resizeMode</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>targetSize</code> is < 0.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ *
+ * @see Method
+ * @see Mode
+ */
+ public static BufferedImage resize(BufferedImage src, Method scalingMethod,
+ Mode resizeMode, int targetSize,
+ BufferedImageOp... ops) throws IllegalArgumentException, ImagingOpException {
+ return resize(src, scalingMethod, resizeMode, targetSize, targetSize, ops);
+ }
+
+ /**
+ * Resize a given image (maintaining its original proportion) to the target
+ * width and height and apply the given {@link BufferedImageOp}s (if any) to
+ * the result before returning it.
+ * <p/>
+ * A scaling method of {@link Method#AUTOMATIC} and mode of
+ * {@link Mode#AUTOMATIC} are used.
+ * <p/>
+ * <strong>TIP</strong>: See the class description to understand how this
+ * class handles recalculation of the <code>targetWidth</code> or
+ * <code>targetHeight</code> depending on the image's orientation in order
+ * to maintain the original proportion.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param targetWidth
+ * The target width that you wish the image to have.
+ * @param targetHeight
+ * The target height that you wish the image to have.
+ * @param ops
+ * <code>0</code> or more optional image operations (e.g.
+ * sharpen, blur, etc.) that can be applied to the final result
+ * before returning the image.
+ *
+ * @return a new {@link BufferedImage} representing the scaled
+ * <code>src</code> image.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>targetWidth</code> is < 0 or if
+ * <code>targetHeight</code> is < 0.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ */
+ public static BufferedImage resize(BufferedImage src, int targetWidth,
+ int targetHeight, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ return resize(src, Method.AUTOMATIC, Mode.AUTOMATIC, targetWidth, targetHeight, ops);
+ }
+
+ /**
+ * Resize a given image (maintaining its original proportion) to the target
+ * width and height using the given scaling method and apply the given
+ * {@link BufferedImageOp}s (if any) to the result before returning it.
+ * <p/>
+ * A mode of {@link Mode#AUTOMATIC} is used.
+ * <p/>
+ * <strong>TIP</strong>: See the class description to understand how this
+ * class handles recalculation of the <code>targetWidth</code> or
+ * <code>targetHeight</code> depending on the image's orientation in order
+ * to maintain the original proportion.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param scalingMethod
+ * The method used for scaling the image; preferring speed to
+ * quality or a balance of both.
+ * @param targetWidth
+ * The target width that you wish the image to have.
+ * @param targetHeight
+ * The target height that you wish the image to have.
+ * @param ops
+ * <code>0</code> or more optional image operations (e.g.
+ * sharpen, blur, etc.) that can be applied to the final result
+ * before returning the image.
+ *
+ * @return a new {@link BufferedImage} representing the scaled
+ * <code>src</code> image.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>scalingMethod</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>targetWidth</code> is < 0 or if
+ * <code>targetHeight</code> is < 0.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ *
+ * @see Method
+ */
+ public static BufferedImage resize(BufferedImage src, Method scalingMethod,
+ int targetWidth, int targetHeight, BufferedImageOp... ops) {
+ return resize(src, scalingMethod, Mode.AUTOMATIC, targetWidth, targetHeight, ops);
+ }
+
+ /**
+ * Resize a given image (maintaining its original proportion) to the target
+ * width and height (or fitting the image to the given WIDTH or HEIGHT
+ * explicitly, depending on the {@link Mode} specified) and apply the given
+ * {@link BufferedImageOp}s (if any) to the result before returning it.
+ * <p/>
+ * A scaling method of {@link Method#AUTOMATIC} is used.
+ * <p/>
+ * <strong>TIP</strong>: See the class description to understand how this
+ * class handles recalculation of the <code>targetWidth</code> or
+ * <code>targetHeight</code> depending on the image's orientation in order
+ * to maintain the original proportion.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param resizeMode
+ * Used to indicate how imgscalr should calculate the final
+ * target size for the image, either fitting the image to the
+ * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
+ * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
+ * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
+ * proportional dimensions for the scaled image based on its
+ * orientation (landscape, square or portrait). Unless you have
+ * very specific size requirements, most of the time you just
+ * want to use {@link Mode#AUTOMATIC} to "do the right thing".
+ * @param targetWidth
+ * The target width that you wish the image to have.
+ * @param targetHeight
+ * The target height that you wish the image to have.
+ * @param ops
+ * <code>0</code> or more optional image operations (e.g.
+ * sharpen, blur, etc.) that can be applied to the final result
+ * before returning the image.
+ *
+ * @return a new {@link BufferedImage} representing the scaled
+ * <code>src</code> image.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>resizeMode</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>targetWidth</code> is < 0 or if
+ * <code>targetHeight</code> is < 0.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ *
+ * @see Mode
+ */
+ public static BufferedImage resize(BufferedImage src, Mode resizeMode,
+ int targetWidth, int targetHeight, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ return resize(src, Method.AUTOMATIC, resizeMode, targetWidth,
+ targetHeight, ops);
+ }
+
+ /**
+ * Resize a given image (maintaining its original proportion) to the target
+ * width and height (or fitting the image to the given WIDTH or HEIGHT
+ * explicitly, depending on the {@link Mode} specified) using the given
+ * scaling method and apply the given {@link BufferedImageOp}s (if any) to
+ * the result before returning it.
+ * <p/>
+ * <strong>TIP</strong>: See the class description to understand how this
+ * class handles recalculation of the <code>targetWidth</code> or
+ * <code>targetHeight</code> depending on the image's orientation in order
+ * to maintain the original proportion.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param scalingMethod
+ * The method used for scaling the image; preferring speed to
+ * quality or a balance of both.
+ * @param resizeMode
+ * Used to indicate how imgscalr should calculate the final
+ * target size for the image, either fitting the image to the
+ * given width ({@link Mode#FIT_TO_WIDTH}) or fitting the image
+ * to the given height ({@link Mode#FIT_TO_HEIGHT}). If
+ * {@link Mode#AUTOMATIC} is passed in, imgscalr will calculate
+ * proportional dimensions for the scaled image based on its
+ * orientation (landscape, square or portrait). Unless you have
+ * very specific size requirements, most of the time you just
+ * want to use {@link Mode#AUTOMATIC} to "do the right thing".
+ * @param targetWidth
+ * The target width that you wish the image to have.
+ * @param targetHeight
+ * The target height that you wish the image to have.
+ * @param ops
+ * <code>0</code> or more optional image operations (e.g.
+ * sharpen, blur, etc.) that can be applied to the final result
+ * before returning the image.
+ *
+ * @return a new {@link BufferedImage} representing the scaled
+ * <code>src</code> image.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>scalingMethod</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>resizeMode</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>targetWidth</code> is < 0 or if
+ * <code>targetHeight</code> is < 0.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ *
+ * @see Method
+ * @see Mode
+ */
+ public static BufferedImage resize(BufferedImage src, Method scalingMethod,
+ Mode resizeMode, int targetWidth, int targetHeight,
+ BufferedImageOp... ops) throws IllegalArgumentException,
+ ImagingOpException {
+ long t = -1;
+ if (DEBUG)
+ t = System.currentTimeMillis();
+
+ if (src == null)
+ throw new IllegalArgumentException("src cannot be null");
+ if (targetWidth < 0)
+ throw new IllegalArgumentException("targetWidth must be >= 0");
+ if (targetHeight < 0)
+ throw new IllegalArgumentException("targetHeight must be >= 0");
+ if (scalingMethod == null)
+ throw new IllegalArgumentException(
+ "scalingMethod cannot be null. A good default value is Method.AUTOMATIC.");
+ if (resizeMode == null)
+ throw new IllegalArgumentException(
+ "resizeMode cannot be null. A good default value is Mode.AUTOMATIC.");
+
+ BufferedImage result = null;
+
+ int currentWidth = src.getWidth();
+ int currentHeight = src.getHeight();
+
+ // <= 1 is a square or landscape-oriented image, > 1 is a portrait.
+ float ratio = ((float) currentHeight / (float) currentWidth);
+
+ if (DEBUG)
+ log(0, "Resizing Image [size=%dx%d, resizeMode=%s, orientation=%s, ratio(H/W)=%f] to [targetSize=%dx%d]",
+ currentWidth, currentHeight, resizeMode,
+ (ratio <= 1 ? "Landscape/Square" : "Portrait"), ratio,
+ targetWidth, targetHeight);
+
+ /*
+ * First determine if ANY size calculation needs to be done, in the case
+ * of FIT_EXACT, ignore image proportions and orientation and just use
+ * what the user sent in, otherwise the proportion of the picture must
+ * be honored.
+ *
+ * The way that is done is to figure out if the image is in a
+ * LANDSCAPE/SQUARE or PORTRAIT orientation and depending on its
+ * orientation, use the primary dimension (width for LANDSCAPE/SQUARE
+ * and height for PORTRAIT) to recalculate the alternative (height and
+ * width respectively) value that adheres to the existing ratio.
+ *
+ * This helps make life easier for the caller as they don't need to
+ * pre-compute proportional dimensions before calling the API, they can
+ * just specify the dimensions they would like the image to roughly fit
+ * within and it will do the right thing without mangling the result.
+ */
+ if (resizeMode == Mode.FIT_EXACT) {
+ if (DEBUG)
+ log(1, "Resize Mode FIT_EXACT used, no width/height checking or re-calculation will be done.");
+ }
+ else if (resizeMode == Mode.BEST_FIT_BOTH) {
+ float requestedHeightScaling = ((float) targetHeight / (float) currentHeight);
+ float requestedWidthScaling = ((float) targetWidth / (float) currentWidth);
+ float actualScaling = Math.min(requestedHeightScaling, requestedWidthScaling);
+ targetHeight = Math.round((float) currentHeight * actualScaling);
+ targetWidth = Math.round((float) currentWidth * actualScaling);
+ if (targetHeight == currentHeight && targetWidth == currentWidth)
+ return src;
+
+ if (DEBUG)
+ log(1, "Auto-Corrected width and height based on scalingRatio %d.", actualScaling);
+ }
+ else {
+ if ((ratio <= 1 && resizeMode == Mode.AUTOMATIC) || (resizeMode == Mode.FIT_TO_WIDTH)) {
+ // First make sure we need to do any work in the first place
+ if (targetWidth == src.getWidth())
+ return src;
+ // Save for detailed logging (this is cheap).
+ int originalTargetHeight = targetHeight;
+
+ /*
+ * Landscape or Square Orientation: Ignore the given height and
+ * re-calculate a proportionally correct value based on the
+ * targetWidth.
+ */
+ targetHeight = Math.round((float) targetWidth * ratio);
+
+ if (DEBUG && originalTargetHeight != targetHeight)
+ log(1, "Auto-Corrected targetHeight [from=%d to=%d] to honor image proportions.",
+ originalTargetHeight, targetHeight);
+ }
+ else {
+ // First make sure we need to do any work in the first place
+ if (targetHeight == src.getHeight())
+ return src;
+
+ // Save for detailed logging (this is cheap).
+ int originalTargetWidth = targetWidth;
+
+ /*
+ * Portrait Orientation: Ignore the given width and re-calculate
+ * a proportionally correct value based on the targetHeight.
+ */
+ targetWidth = Math.round((float) targetHeight / ratio);
+
+ if (DEBUG && originalTargetWidth != targetWidth)
+ log(1, "Auto-Corrected targetWidth [from=%d to=%d] to honor image proportions.",
+ originalTargetWidth, targetWidth);
+ }
+ }
+
+ // If AUTOMATIC was specified, determine the real scaling method.
+ if (scalingMethod == Scalr.Method.AUTOMATIC)
+ scalingMethod = determineScalingMethod(targetWidth, targetHeight,
+ ratio);
+
+ if (DEBUG)
+ log(1, "Using Scaling Method: %s", scalingMethod);
+
+ // Now we scale the image
+ if (scalingMethod == Scalr.Method.SPEED) {
+ result = scaleImage(src, targetWidth, targetHeight,
+ RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
+ } else if (scalingMethod == Scalr.Method.BALANCED) {
+ result = scaleImage(src, targetWidth, targetHeight,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ }
+ else if (scalingMethod == Scalr.Method.QUALITY || scalingMethod == Scalr.Method.ULTRA_QUALITY) {
+ /*
+ * If we are scaling up (in either width or height - since we know
+ * the image will stay proportional we just check if either are
+ * being scaled up), directly using a single BICUBIC will give us
+ * better results then using Chris Campbell's incremental scaling
+ * operation (and take a lot less time).
+ *
+ * If we are scaling down, we must use the incremental scaling
+ * algorithm for the best result.
+ */
+ if (targetWidth > currentWidth || targetHeight > currentHeight) {
+ if (DEBUG)
+ log(1, "QUALITY scale-up, a single BICUBIC scale operation will be used...");
+
+ /*
+ * BILINEAR and BICUBIC look similar the smaller the scale jump
+ * upwards is, if the scale is larger BICUBIC looks sharper and
+ * less fuzzy. But most importantly we have to use BICUBIC to
+ * match the contract of the QUALITY rendering scalingMethod.
+ * This note is just here for anyone reading the code and
+ * wondering how they can speed their own calls up.
+ */
+ result = scaleImage(src, targetWidth, targetHeight,
+ RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+ } else {
+ if (DEBUG)
+ log(1, "QUALITY scale-down, incremental scaling will be used...");
+
+ /*
+ * Originally we wanted to use BILINEAR interpolation here
+ * because it takes 1/3rd the time that the BICUBIC
+ * interpolation does, however, when scaling large images down
+ * to most sizes bigger than a thumbnail we witnessed noticeable
+ * "softening" in the resultant image with BILINEAR that would
+ * be unexpectedly annoying to a user expecting a "QUALITY"
+ * scale of their original image. Instead BICUBIC was chosen to
+ * honor the contract of a QUALITY scale of the original image.
+ */
+ result = scaleImageIncrementally(src, targetWidth,
+ targetHeight, scalingMethod,
+ RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+ }
+ }
+
+ if (DEBUG)
+ log(0, "Resized Image in %d ms", System.currentTimeMillis() - t);
+
+ // Apply any optional operations (if specified).
+ if (ops != null && ops.length > 0)
+ result = apply(result, ops);
+
+ return result;
+ }
+
+ /**
+ * Used to apply a {@link Rotation} and then <code>0</code> or more
+ * {@link BufferedImageOp}s to a given image and return the result.
+ * <p/>
+ * <strong>TIP</strong>: This operation leaves the original <code>src</code>
+ * image unmodified. If the caller is done with the <code>src</code> image
+ * after getting the result of this operation, remember to call
+ * {@link BufferedImage#flush()} on the <code>src</code> to free up native
+ * resources and make it easier for the GC to collect the unused image.
+ *
+ * @param src
+ * The image that will have the rotation applied to it.
+ * @param rotation
+ * The rotation that will be applied to the image.
+ * @param ops
+ * Zero or more optional image operations (e.g. sharpen, blur,
+ * etc.) that can be applied to the final result before returning
+ * the image.
+ *
+ * @return a new {@link BufferedImage} representing <code>src</code> rotated
+ * by the given amount and any optional ops applied to it.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ * @throws IllegalArgumentException
+ * if <code>rotation</code> is <code>null</code>.
+ * @throws ImagingOpException
+ * if one of the given {@link BufferedImageOp}s fails to apply.
+ * These exceptions bubble up from the inside of most of the
+ * {@link BufferedImageOp} implementations and are explicitly
+ * defined on the imgscalr API to make it easier for callers to
+ * catch the exception (if they are passing along optional ops
+ * to be applied). imgscalr takes detailed steps to avoid the
+ * most common pitfalls that will cause {@link BufferedImageOp}s
+ * to fail, even when using straight forward JDK-image
+ * operations.
+ *
+ * @see Rotation
+ */
+ public static BufferedImage rotate(BufferedImage src, Rotation rotation, BufferedImageOp... ops)
+ throws IllegalArgumentException, ImagingOpException {
+ long t = -1;
+ if (DEBUG)
+ t = System.currentTimeMillis();
+
+ if (src == null)
+ throw new IllegalArgumentException("src cannot be null");
+ if (rotation == null)
+ throw new IllegalArgumentException("rotation cannot be null");
+
+ if (DEBUG)
+ log(0, "Rotating Image [%s]...", rotation);
+
+ /*
+ * Setup the default width/height values from our image.
+ *
+ * In the case of a 90 or 270 (-90) degree rotation, these two values
+ * flip-flop and we will correct those cases down below in the switch
+ * statement.
+ */
+ int newWidth = src.getWidth();
+ int newHeight = src.getHeight();
+
+ /*
+ * We create a transform per operation request as (oddly enough) it ends
+ * up being faster for the VM to create, use and destroy these instances
+ * than it is to re-use a single AffineTransform per-thread via the
+ * AffineTransform.setTo(...) methods which was my first choice (less
+ * object creation); after benchmarking this explicit case and looking
+ * at just how much code gets run inside of setTo() I opted for a new AT
+ * for every rotation.
+ *
+ * Besides the performance win, trying to safely reuse AffineTransforms
+ * via setTo(...) would have required ThreadLocal instances to avoid
+ * race conditions where two or more resize threads are manipulating the
+ * same transform before applying it.
+ *
+ * Misusing ThreadLocals are one of the #1 reasons for memory leaks in
+ * server applications and since we have no nice way to hook into the
+ * init/destroy Servlet cycle or any other initialization cycle for this
+ * library to automatically call ThreadLocal.remove() to avoid the
+ * memory leak, it would have made using this library *safely* on the
+ * server side much harder.
+ *
+ * So we opt for creating individual transforms per rotation op and let
+ * the VM clean them up in a GC. I only clarify all this reasoning here
+ * for anyone else reading this code and being tempted to reuse the AT
+ * instances of performance gains; there aren't any AND you get a lot of
+ * pain along with it.
+ */
+ AffineTransform tx = new AffineTransform();
+
+ switch (rotation) {
+ case CW_90:
+ /*
+ * A 90 or -90 degree rotation will cause the height and width to
+ * flip-flop from the original image to the rotated one.
+ */
+ newWidth = src.getHeight();
+ newHeight = src.getWidth();
+ // Reminder: newWidth == result.getHeight() at this point
+ tx.translate(newWidth, 0);
+ tx.rotate(Math.toRadians(90));
+ break;
+
+ case CW_270:
+ /*
+ * A 90 or -90 degree rotation will cause the height and width to
+ * flip-flop from the original image to the rotated one.
+ */
+ newWidth = src.getHeight();
+ newHeight = src.getWidth();
+
+ // Reminder: newHeight == result.getWidth() at this point
+ tx.translate(0, newHeight);
+ tx.rotate(Math.toRadians(-90));
+ break;
+
+ case CW_180:
+ tx.translate(newWidth, newHeight);
+ tx.rotate(Math.toRadians(180));
+ break;
+
+ case FLIP_HORZ:
+ tx.translate(newWidth, 0);
+ tx.scale(-1.0, 1.0);
+ break;
+
+ case FLIP_VERT:
+ tx.translate(0, newHeight);
+ tx.scale(1.0, -1.0);
+ break;
+ }
+
+ // Create our target image we will render the rotated result to.
+ BufferedImage result = createOptimalImage(src, newWidth, newHeight);
+ Graphics2D g2d = (Graphics2D) result.createGraphics();
+
+ /*
+ * Render the resultant image to our new rotatedImage buffer, applying
+ * the AffineTransform that we calculated above during rendering so the
+ * pixels from the old position are transposed to the new positions in
+ * the resulting image correctly.
+ */
+ g2d.drawImage(src, tx, null);
+ g2d.dispose();
+
+ if (DEBUG)
+ log(0, "Rotation Applied in %d ms, result [width=%d, height=%d]", System.currentTimeMillis() - t,
+ result.getWidth(), result.getHeight());
+
+ // Apply any optional operations (if specified).
+ if (ops != null && ops.length > 0)
+ result = apply(result, ops);
+
+ return result;
+ }
+
+ /**
+ * Used to write out a useful and well-formatted log message by any piece of
+ * code inside of the imgscalr library.
+ * <p/>
+ * If a message cannot be logged (logging is disabled) then this method
+ * returns immediately.
+ * <p/>
+ * <strong>NOTE</strong>: Because Java will auto-box primitive arguments
+ * into Objects when building out the <code>params</code> array, care should
+ * be taken not to call this method with primitive values unless
+ * {@link Scalr#DEBUG} is <code>true</code>; otherwise the VM will be
+ * spending time performing unnecessary auto-boxing calculations.
+ *
+ * @param depth
+ * The indentation level of the log message.
+ * @param message
+ * The log message in <a href=
+ * "http://download.oracle.com/javase/6/docs/api/java/util/Formatter.html#syntax"
+ * >format string syntax</a> that will be logged.
+ * @param params
+ * The parameters that will be swapped into all the place holders
+ * in the original messages before being logged.
+ *
+ * @see Scalr#LOG_PREFIX
+ * @see Scalr#LOG_PREFIX_PROPERTY_NAME
+ */
+ protected static void log(int depth, String message, Object... params) {
+ if (Scalr.DEBUG) {
+ System.out.print(Scalr.LOG_PREFIX);
+ for (int i = 0; i < depth; i++)
+ System.out.print("\t");
+ System.out.printf(message, params);
+ System.out.println();
+ }
+ }
+
+ /**
+ * Used to create a {@link BufferedImage} with the most optimal RGB TYPE (
+ * {@link BufferedImage#TYPE_INT_RGB} or {@link BufferedImage#TYPE_INT_ARGB}
+ * ) capable of being rendered into from the given <code>src</code>. The
+ * width and height of both images will be identical.
+ * <p/>
+ * This does not perform a copy of the image data from <code>src</code> into
+ * the result image; see {@link #copyToOptimalImage(BufferedImage)} for
+ * that.
+ * <p/>
+ * We force all rendering results into one of these two types, avoiding the
+ * case where a source image is of an unsupported (or poorly supported)
+ * format by Java2D causing the rendering result to end up looking terrible
+ * (common with GIFs) or be totally corrupt (e.g. solid black image).
+ * <p/>
+ * Originally reported by Magnus Kvalheim from Movellas when scaling certain
+ * GIF and PNG images.
+ *
+ * @param src
+ * The source image that will be analyzed to determine the most
+ * optimal image type it can be rendered into.
+ *
+ * @return a new {@link BufferedImage} representing the most optimal target
+ * image type that <code>src</code> can be rendered into.
+ *
+ * @see <a
+ * href="http://www.mail-archive.com/java2d-interest@capra.eng.sun.com/msg05621.html">How
+ * Java2D handles poorly supported image types</a>
+ * @see <a
+ * href="http://code.google.com/p/java-image-scaling/source/browse/trunk/src/main/java/com/mortennobel/imagescaling/MultiStepRescaleOp.java">Thanks
+ * to Morten Nobel for implementation hint</a>
+ */
+ protected static BufferedImage createOptimalImage(BufferedImage src) {
+ return createOptimalImage(src, src.getWidth(), src.getHeight());
+ }
+
+ /**
+ * Used to create a {@link BufferedImage} with the given dimensions and the
+ * most optimal RGB TYPE ( {@link BufferedImage#TYPE_INT_RGB} or
+ * {@link BufferedImage#TYPE_INT_ARGB} ) capable of being rendered into from
+ * the given <code>src</code>.
+ * <p/>
+ * This does not perform a copy of the image data from <code>src</code> into
+ * the result image; see {@link #copyToOptimalImage(BufferedImage)} for
+ * that.
+ * <p/>
+ * We force all rendering results into one of these two types, avoiding the
+ * case where a source image is of an unsupported (or poorly supported)
+ * format by Java2D causing the rendering result to end up looking terrible
+ * (common with GIFs) or be totally corrupt (e.g. solid black image).
+ * <p/>
+ * Originally reported by Magnus Kvalheim from Movellas when scaling certain
+ * GIF and PNG images.
+ *
+ * @param src
+ * The source image that will be analyzed to determine the most
+ * optimal image type it can be rendered into.
+ * @param width
+ * The width of the newly created resulting image.
+ * @param height
+ * The height of the newly created resulting image.
+ *
+ * @return a new {@link BufferedImage} representing the most optimal target
+ * image type that <code>src</code> can be rendered into.
+ *
+ * @throws IllegalArgumentException
+ * if <code>width</code> or <code>height</code> are < 0.
+ *
+ * @see <a
+ * href="http://www.mail-archive.com/java2d-interest@capra.eng.sun.com/msg05621.html">How
+ * Java2D handles poorly supported image types</a>
+ * @see <a
+ * href="http://code.google.com/p/java-image-scaling/source/browse/trunk/src/main/java/com/mortennobel/imagescaling/MultiStepRescaleOp.java">Thanks
+ * to Morten Nobel for implementation hint</a>
+ */
+ protected static BufferedImage createOptimalImage(BufferedImage src, int width, int height)
+ throws IllegalArgumentException {
+ if (width < 0 || height < 0)
+ throw new IllegalArgumentException("width [" + width + "] and height [" + height + "] must be >= 0");
+ return new BufferedImage(width, height,
+ (src.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB));
+ }
+
+ /**
+ * Used to copy a {@link BufferedImage} from a non-optimal type into a new
+ * {@link BufferedImage} instance of an optimal type (RGB or ARGB). If
+ * <code>src</code> is already of an optimal type, then it is returned
+ * unmodified.
+ * <p/>
+ * This method is meant to be used by any calling code (imgscalr's or
+ * otherwise) to convert any inbound image from a poorly supported image
+ * type into the 2 most well-supported image types in Java2D (
+ * {@link BufferedImage#TYPE_INT_RGB} or {@link BufferedImage#TYPE_INT_ARGB}
+ * ) in order to ensure all subsequent graphics operations are performed as
+ * efficiently and correctly as possible.
+ * <p/>
+ * When using Java2D to work with image types that are not well supported,
+ * the results can be anything from exceptions bubbling up from the depths
+ * of Java2D to images being completely corrupted and just returned as solid
+ * black.
+ *
+ * @param src
+ * The image to copy (if necessary) into an optimally typed
+ * {@link BufferedImage}.
+ *
+ * @return a representation of the <code>src</code> image in an optimally
+ * typed {@link BufferedImage}, otherwise <code>src</code> if it was
+ * already of an optimal type.
+ *
+ * @throws IllegalArgumentException
+ * if <code>src</code> is <code>null</code>.
+ */
+ protected static BufferedImage copyToOptimalImage(BufferedImage src) throws IllegalArgumentException {
+ if (src == null)
+ throw new IllegalArgumentException("src cannot be null");
+ // Calculate the type depending on the presence of alpha.
+ int type = (src.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB
+ : BufferedImage.TYPE_INT_ARGB);
+ BufferedImage result = new BufferedImage(src.getWidth(), src.getHeight(), type);
+ // Render the src image into our new optimal source.
+ Graphics g = result.getGraphics();
+ g.drawImage(src, 0, 0, null);
+ g.dispose();
+ return result;
+ }
+
+ /**
+ * Used to determine the scaling {@link Method} that is best suited for
+ * scaling the image to the targeted dimensions.
+ * <p/>
+ * This method is intended to be used to select a specific scaling
+ * {@link Method} when a {@link Method#AUTOMATIC} method is specified. This
+ * method utilizes the {@link Scalr#THRESHOLD_QUALITY_BALANCED} and
+ * {@link Scalr#THRESHOLD_BALANCED_SPEED} thresholds when selecting which
+ * method should be used by comparing the primary dimension (width or
+ * height) against the threshold and seeing where the image falls. The
+ * primary dimension is determined by looking at the orientation of the
+ * image: landscape or square images use their width and portrait-oriented
+ * images use their height.
+ *
+ * @param targetWidth
+ * The target width for the scaled image.
+ * @param targetHeight
+ * The target height for the scaled image.
+ * @param ratio
+ * A height/width ratio used to determine the orientation of the
+ * image so the primary dimension (width or height) can be
+ * selected to test if it is greater than or less than a
+ * particular threshold.
+ *
+ * @return the fastest {@link Method} suited for scaling the image to the
+ * specified dimensions while maintaining a good-looking result.
+ */
+ protected static Method determineScalingMethod(int targetWidth,
+ int targetHeight, float ratio) {
+ // Get the primary dimension based on the orientation of the image
+ int length = (ratio <= 1 ? targetWidth : targetHeight);
+
+ // Default to speed
+ Method result = Method.SPEED;
+
+ // Figure out which scalingMethod should be used
+ if (length <= Scalr.THRESHOLD_QUALITY_BALANCED)
+ result = Method.QUALITY;
+ else if (length <= Scalr.THRESHOLD_BALANCED_SPEED)
+ result = Method.BALANCED;
+
+ if (DEBUG)
+ log(2, "AUTOMATIC scaling method selected: %s", result.name());
+
+ return result;
+ }
+
+ /**
+ * Used to implement a straight-forward image-scaling operation using Java
+ * 2D.
+ * <p/>
+ * This method uses the Oracle-encouraged method of
+ * <code>Graphics2D.drawImage(...)</code> to scale the given image with the
+ * given interpolation hint.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param targetWidth
+ * The target width for the scaled image.
+ * @param targetHeight
+ * The target height for the scaled image.
+ * @param interpolationHintValue
+ * The {@link RenderingHints} interpolation value used to
+ * indicate the method that {@link Graphics2D} should use when
+ * scaling the image.
+ *
+ * @return the result of scaling the original <code>src</code> to the given
+ * dimensions using the given interpolation method.
+ */
+ protected static BufferedImage scaleImage(BufferedImage src,
+ int targetWidth, int targetHeight, Object interpolationHintValue) {
+ // Setup the rendering resources to match the source image's
+ BufferedImage result = createOptimalImage(src, targetWidth, targetHeight);
+ Graphics2D resultGraphics = result.createGraphics();
+
+ // Scale the image to the new buffer using the specified rendering hint.
+ resultGraphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ interpolationHintValue);
+ resultGraphics.drawImage(src, 0, 0, targetWidth, targetHeight, null);
+
+ // Just to be clean, explicitly dispose our temporary graphics object
+ resultGraphics.dispose();
+
+ // Return the scaled image to the caller.
+ return result;
+ }
+
+ /**
+ * Used to implement Chris Campbell's incremental-scaling algorithm: <a
+ * href="http://today.java.net/pub/a/today/2007/04/03/perils
+ * -of-image-getscaledinstance
+ * .html">http://today.java.net/pub/a/today/2007/04/03/perils
+ * -of-image-getscaledinstance.html</a>.
+ * <p/>
+ * Modifications to the original algorithm are variable names and comments
+ * added for clarity and the hard-coding of using BICUBIC interpolation as
+ * well as the explicit "flush()" operation on the interim BufferedImage
+ * instances to avoid resource leaking.
+ *
+ * @param src
+ * The image that will be scaled.
+ * @param targetWidth
+ * The target width for the scaled image.
+ * @param targetHeight
+ * The target height for the scaled image.
+ * @param scalingMethod
+ * The scaling method specified by the user (or calculated by
+ * imgscalr) to use for this incremental scaling operation.
+ * @param interpolationHintValue
+ * The {@link RenderingHints} interpolation value used to
+ * indicate the method that {@link Graphics2D} should use when
+ * scaling the image.
+ *
+ * @return an image scaled to the given dimensions using the given rendering
+ * hint.
+ */
+ protected static BufferedImage scaleImageIncrementally(BufferedImage src,
+ int targetWidth, int targetHeight,
+ Method scalingMethod, Object interpolationHintValue) {
+ boolean hasReassignedSrc = false;
+ int incrementCount = 0;
+ int currentWidth = src.getWidth();
+ int currentHeight = src.getHeight();
+
+ /*
+ * The original QUALITY mode, representing Chris Campbell's algorithm,
+ * is to step down by 1/2s every time when scaling the image
+ * incrementally. Users pointed out that using this method to scale
+ * images with noticeable straight lines left them really jagged in
+ * smaller thumbnail format.
+ *
+ * After investigation it was discovered that scaling incrementally by
+ * smaller increments was the ONLY way to make the thumbnail sized
+ * images look less jagged and more accurate; almost matching the
+ * accuracy of Mac's built in thumbnail generation which is the highest
+ * quality resize I've come across (better than GIMP Lanczos3 and
+ * Windows 7).
+ *
+ * A divisor of 7 was chose as using 5 still left some jaggedness in the
+ * image while a divisor of 8 or higher made the resulting thumbnail too
+ * soft; like our OP_ANTIALIAS convolve op had been forcibly applied to
+ * the result even if the user didn't want it that soft.
+ *
+ * Using a divisor of 7 for the ULTRA_QUALITY seemed to be the sweet
+ * spot.
+ *
+ * NOTE: Below when the actual fraction is used to calculate the small
+ * portion to subtract from the current dimension, this is a
+ * progressively smaller and smaller chunk. When the code was changed to
+ * do a linear reduction of the image of equal steps for each
+ * incremental resize (e.g. say 50px each time) the result was
+ * significantly worse than the progressive approach used below; even
+ * when a very high number of incremental steps (13) was tested.
+ */
+ int fraction = (scalingMethod == Method.ULTRA_QUALITY ? 7 : 2);
+ do {
+ int prevCurrentWidth = currentWidth;
+ int prevCurrentHeight = currentHeight;
+ /*
+ * If the current width is bigger than our target, cut it in half
+ * and sample again.
+ */
+ if (currentWidth > targetWidth) {
+ currentWidth -= (currentWidth / fraction);
+
+ /*
+ * If we cut the width too far it means we are on our last
+ * iteration. Just set it to the target width and finish up.
+ */
+ if (currentWidth < targetWidth)
+ currentWidth = targetWidth;
+ }
+
+ /*
+ * If the current height is bigger than our target, cut it in half
+ * and sample again.
+ */
+
+ if (currentHeight > targetHeight) {
+ currentHeight -= (currentHeight / fraction);
+
+ /*
+ * If we cut the height too far it means we are on our last
+ * iteration. Just set it to the target height and finish up.
+ */
+
+ if (currentHeight < targetHeight)
+ currentHeight = targetHeight;
+ }
+
+ /*
+ * Stop when we cannot incrementally step down anymore.
+ *
+ * This used to use a || condition, but that would cause problems
+ * when using FIT_EXACT such that sometimes the width OR height
+ * would not change between iterations, but the other dimension
+ * would (e.g. resizing 500x500 to 500x250).
+ *
+ * Now changing this to an && condition requires that both
+ * dimensions do not change between a resize iteration before we
+ * consider ourselves done.
+ */
+ if (prevCurrentWidth == currentWidth && prevCurrentHeight == currentHeight)
+ break;
+ if (DEBUG)
+ log(2, "Scaling from [%d x %d] to [%d x %d]", prevCurrentWidth, prevCurrentHeight, currentWidth,
+ currentHeight);
+ // Render the incremental scaled image.
+ BufferedImage incrementalImage = scaleImage(src, currentWidth,
+ currentHeight, interpolationHintValue);
+
+ /*
+ * Before re-assigning our interim (partially scaled)
+ * incrementalImage to be the new src image before we iterate around
+ * again to process it down further, we want to flush() the previous
+ * src image IF (and only IF) it was one of our own temporary
+ * BufferedImages created during this incremental down-sampling
+ * cycle. If it wasn't one of ours, then it was the original
+ * caller-supplied BufferedImage in which case we don't want to
+ * flush() it and just leave it alone.
+ */
+ if (hasReassignedSrc)
+ src.flush();
+
+ /*
+ * Now treat our incremental partially scaled image as the src image
+ * and cycle through our loop again to do another incremental
+ * scaling of it (if necessary).
+ */
+ src = incrementalImage;
+
+ /*
+ * Keep track of us re-assigning the original caller-supplied source
+ * image with one of our interim BufferedImages so we know when to
+ * explicitly flush the interim "src" on the next cycle through.
+ */
+ hasReassignedSrc = true;
+
+ // Track how many times we go through this cycle to scale the image.
+ incrementCount++;
+ } while (currentWidth != targetWidth || currentHeight != targetHeight);
+
+ if (DEBUG)
+ log(2, "Incrementally Scaled Image in %d steps.", incrementCount);
+
+ /*
+ * Once the loop has exited, the src image argument is now our scaled
+ * result image that we want to return.
+ */
+ return src;
+ }
+}
diff --git a/freeplane/src/main/java/net/infonode/gui/RotatableLabelUI.java b/freeplane/src/main/java/net/infonode/gui/RotatableLabelUI.java
new file mode 100644
index 0000000..e5e99b9
--- /dev/null
+++ b/freeplane/src/main/java/net/infonode/gui/RotatableLabelUI.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2004 NNL Technology AB
+ * Visit www.infonode.net for information about InfoNode(R)
+ * products and how to contact NNL Technology AB.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * Fix by Dimitry Polivaev (2015) : RotatableLabelUI paint uses wrong FontMetrics in paint
+ * => call BasicLabelUI for direction == RIGHT
+ */
+
+
+// $Id: RotatableLabelUI.java,v 1.11 2005/12/04 13:46:04 jesper Exp $
+package net.infonode.gui;
+
+import net.infonode.util.Direction;
+
+import javax.swing.*;
+import javax.swing.plaf.basic.BasicLabelUI;
+import java.awt.*;
+import java.awt.geom.AffineTransform;
+
+public class RotatableLabelUI extends BasicLabelUI {
+ // Optimization
+ private static Rectangle paintIconR = new Rectangle();
+ private static Rectangle paintTextR = new Rectangle();
+ private static Rectangle paintViewR = new Rectangle();
+
+ private Direction direction;
+ private boolean mirror;
+
+ public RotatableLabelUI(Direction direction) {
+ this(direction, false);
+ }
+
+ public RotatableLabelUI(Direction direction, boolean mirror) {
+ this.direction = direction;
+ this.mirror = mirror;
+ }
+
+ public Direction getDirection() {
+ return direction;
+ }
+
+ public void setDirection(Direction direction) {
+ this.direction = direction;
+ }
+
+ public boolean isMirror() {
+ return mirror;
+ }
+
+ public void setMirror(boolean mirror) {
+ this.mirror = mirror;
+ }
+
+ public void paint(Graphics g, JComponent c) {
+ if (direction == Direction.RIGHT && ! mirror){
+ super.paint(g, c);
+ return;
+ }
+ JLabel label = (JLabel) c;
+ String text = label.getText();
+ Icon icon = (label.isEnabled()) ? label.getIcon() : label.getDisabledIcon();
+
+ if (icon == null && text == null)
+ return;
+
+ FontMetrics fm = g.getFontMetrics();
+ Insets insets = c.getInsets();
+
+ paintViewR.x = insets.left;
+ paintViewR.y = insets.top;
+
+ if (direction.isHorizontal()) {
+ paintViewR.height = c.getHeight() - (insets.top + insets.bottom);
+ paintViewR.width = c.getWidth() - (insets.left + insets.right);
+ }
+ else {
+ paintViewR.height = c.getWidth() - (insets.top + insets.bottom);
+ paintViewR.width = c.getHeight() - (insets.left + insets.right);
+ }
+
+ paintIconR.x = paintIconR.y = paintIconR.width = paintIconR.height = 0;
+ paintTextR.x = paintTextR.y = paintTextR.width = paintTextR.height = 0;
+
+ String clippedText = layoutCL(label, fm, text, icon, paintViewR, paintIconR, paintTextR);
+
+ Graphics2D g2 = (Graphics2D) g;
+ AffineTransform tr = g2.getTransform();
+
+ int m = mirror ? -1 : 1;
+ g2.transform(direction == Direction.RIGHT ? new AffineTransform(1, 0, 0, m, 0, mirror ? c.getHeight() : 0) :
+ direction == Direction.DOWN ? new AffineTransform(0, 1, -m, 0, mirror ? 0 : c.getWidth(), 0) :
+ direction == Direction.LEFT ? new AffineTransform(-1,
+ 0,
+ 0,
+ -m,
+ c.getWidth(),
+ mirror ? 0 : c.getHeight()) :
+ new AffineTransform(0, -1, m, 0, mirror ? c.getWidth() : 0, c.getHeight()));
+
+ if (icon != null) {
+ icon.paintIcon(c, g, paintIconR.x, paintIconR.y);
+ }
+
+ if (text != null) {
+ int textX = paintTextR.x;
+ int textY = paintTextR.y + fm.getAscent();
+
+ if (label.isEnabled()) {
+ paintEnabledText(label, g, clippedText, textX, textY);
+ }
+ else {
+ paintDisabledText(label, g, clippedText, textX, textY);
+ }
+ }
+
+ g2.setTransform(tr);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/extension/ExtensionContainer.java b/freeplane/src/main/java/org/freeplane/core/extension/ExtensionContainer.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/extension/ExtensionContainer.java
rename to freeplane/src/main/java/org/freeplane/core/extension/ExtensionContainer.java
diff --git a/freeplane/src/org/freeplane/core/extension/IExtension.java b/freeplane/src/main/java/org/freeplane/core/extension/IExtension.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/extension/IExtension.java
rename to freeplane/src/main/java/org/freeplane/core/extension/IExtension.java
diff --git a/freeplane/src/org/freeplane/core/extension/SmallExtensionMap.java b/freeplane/src/main/java/org/freeplane/core/extension/SmallExtensionMap.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/extension/SmallExtensionMap.java
rename to freeplane/src/main/java/org/freeplane/core/extension/SmallExtensionMap.java
diff --git a/freeplane/src/main/java/org/freeplane/core/io/BackwardCompatibleQuantityWriter.java b/freeplane/src/main/java/org/freeplane/core/io/BackwardCompatibleQuantityWriter.java
new file mode 100644
index 0000000..74f3f32
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/io/BackwardCompatibleQuantityWriter.java
@@ -0,0 +1,37 @@
+package org.freeplane.core.io;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.MapWriter;
+
+public class BackwardCompatibleQuantityWriter {
+
+ final private ITreeWriter writer;
+ final private boolean makeCompatible;
+
+ static public BackwardCompatibleQuantityWriter forWriter(ITreeWriter writer){
+ final Object hint = writer.getHint(BackwardCompatibleQuantityWriter.class);
+ if(Boolean.FALSE.equals(hint)){
+ final boolean makeCompatible = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ final BackwardCompatibleQuantityWriter quantityWriter = new BackwardCompatibleQuantityWriter(writer, makeCompatible);
+ writer.setHint(BackwardCompatibleQuantityWriter.class, quantityWriter);
+ return quantityWriter;
+ }
+ return (BackwardCompatibleQuantityWriter) hint;
+ }
+
+ public BackwardCompatibleQuantityWriter(ITreeWriter writer, boolean makeCompatible) {
+ this.writer = writer;
+ this.makeCompatible = makeCompatible;
+ }
+
+ public void writeQuantity(String name, final Quantity<LengthUnits> value) {
+ if(makeCompatible){
+ writer.addAttribute(name, value.toBaseUnitsRounded());
+ writer.addAttribute(name+"_QUANTITY", value.toString());
+ }
+ else
+ writer.addAttribute(name, value.toString());
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/io/IAttributeHandler.java b/freeplane/src/main/java/org/freeplane/core/io/IAttributeHandler.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IAttributeHandler.java
rename to freeplane/src/main/java/org/freeplane/core/io/IAttributeHandler.java
diff --git a/freeplane/src/org/freeplane/core/io/IAttributeWriter.java b/freeplane/src/main/java/org/freeplane/core/io/IAttributeWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IAttributeWriter.java
rename to freeplane/src/main/java/org/freeplane/core/io/IAttributeWriter.java
diff --git a/freeplane/src/org/freeplane/core/io/IElementContentHandler.java b/freeplane/src/main/java/org/freeplane/core/io/IElementContentHandler.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IElementContentHandler.java
rename to freeplane/src/main/java/org/freeplane/core/io/IElementContentHandler.java
diff --git a/freeplane/src/org/freeplane/core/io/IElementDOMHandler.java b/freeplane/src/main/java/org/freeplane/core/io/IElementDOMHandler.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IElementDOMHandler.java
rename to freeplane/src/main/java/org/freeplane/core/io/IElementDOMHandler.java
diff --git a/freeplane/src/org/freeplane/core/io/IElementHandler.java b/freeplane/src/main/java/org/freeplane/core/io/IElementHandler.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IElementHandler.java
rename to freeplane/src/main/java/org/freeplane/core/io/IElementHandler.java
diff --git a/freeplane/src/org/freeplane/core/io/IElementWriter.java b/freeplane/src/main/java/org/freeplane/core/io/IElementWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IElementWriter.java
rename to freeplane/src/main/java/org/freeplane/core/io/IElementWriter.java
diff --git a/freeplane/src/org/freeplane/core/io/IExtensionAttributeWriter.java b/freeplane/src/main/java/org/freeplane/core/io/IExtensionAttributeWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IExtensionAttributeWriter.java
rename to freeplane/src/main/java/org/freeplane/core/io/IExtensionAttributeWriter.java
diff --git a/freeplane/src/org/freeplane/core/io/IExtensionElementWriter.java b/freeplane/src/main/java/org/freeplane/core/io/IExtensionElementWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IExtensionElementWriter.java
rename to freeplane/src/main/java/org/freeplane/core/io/IExtensionElementWriter.java
diff --git a/freeplane/src/org/freeplane/core/io/IHintProvider.java b/freeplane/src/main/java/org/freeplane/core/io/IHintProvider.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IHintProvider.java
rename to freeplane/src/main/java/org/freeplane/core/io/IHintProvider.java
diff --git a/freeplane/src/org/freeplane/core/io/IReadCompletionListener.java b/freeplane/src/main/java/org/freeplane/core/io/IReadCompletionListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/IReadCompletionListener.java
rename to freeplane/src/main/java/org/freeplane/core/io/IReadCompletionListener.java
diff --git a/freeplane/src/org/freeplane/core/io/ITreeWriter.java b/freeplane/src/main/java/org/freeplane/core/io/ITreeWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/ITreeWriter.java
rename to freeplane/src/main/java/org/freeplane/core/io/ITreeWriter.java
diff --git a/freeplane/src/org/freeplane/core/io/ListHashTable.java b/freeplane/src/main/java/org/freeplane/core/io/ListHashTable.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/ListHashTable.java
rename to freeplane/src/main/java/org/freeplane/core/io/ListHashTable.java
diff --git a/freeplane/src/org/freeplane/core/io/ReadManager.java b/freeplane/src/main/java/org/freeplane/core/io/ReadManager.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/ReadManager.java
rename to freeplane/src/main/java/org/freeplane/core/io/ReadManager.java
diff --git a/freeplane/src/org/freeplane/core/io/UnknownElementWriter.java b/freeplane/src/main/java/org/freeplane/core/io/UnknownElementWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/UnknownElementWriter.java
rename to freeplane/src/main/java/org/freeplane/core/io/UnknownElementWriter.java
diff --git a/freeplane/src/org/freeplane/core/io/UnknownElements.java b/freeplane/src/main/java/org/freeplane/core/io/UnknownElements.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/UnknownElements.java
rename to freeplane/src/main/java/org/freeplane/core/io/UnknownElements.java
diff --git a/freeplane/src/main/java/org/freeplane/core/io/WriteManager.java b/freeplane/src/main/java/org/freeplane/core/io/WriteManager.java
new file mode 100644
index 0000000..cfa96e1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/io/WriteManager.java
@@ -0,0 +1,93 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.io;
+
+import org.freeplane.core.extension.IExtension;
+
+public class WriteManager {
+ final private ListHashTable<String, IAttributeWriter> attributeWriters = new ListHashTable<String, IAttributeWriter>();
+ final private ListHashTable<String, IElementWriter> elementWriters = new ListHashTable<String, IElementWriter>();
+ final private ListHashTable<Class<? extends IExtension>, IExtensionAttributeWriter> extensionAttributeWriters = new ListHashTable<Class<? extends IExtension>, IExtensionAttributeWriter>();;
+ final private ListHashTable<Class<? extends IExtension>, IExtensionElementWriter> extensionElementWriters = new ListHashTable<Class<? extends IExtension>, IExtensionElementWriter>();
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.persistence.Writer#addAttributeSaver(java.lang.String,
+ * freeplane.persistence.AttributeSaver)
+ */
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.persistence.ISaverManager#addAttributeSaver(java.lang.String,
+ * freeplane.persistence.AttributeSaver)
+ */
+ public void addAttributeWriter(final String parentTag, final IAttributeWriter aw) {
+ attributeWriters.add(parentTag, aw);
+ }
+
+ public void addElementWriter(final String parentTag, final IElementWriter nw) {
+ elementWriters.add(parentTag, nw);
+ }
+
+ public void addExtensionAttributeWriter(final Class<? extends IExtension> clazz, final IExtensionAttributeWriter aw) {
+ extensionAttributeWriters.add(clazz, aw);
+ }
+
+ public void addExtensionElementWriter(final Class<? extends IExtension> clazz, final IExtensionElementWriter nw) {
+ extensionElementWriters.add(clazz, nw);
+ }
+
+ public ListHashTable<String, IAttributeWriter> getAttributeWriters() {
+ return attributeWriters;
+ }
+
+ public ListHashTable<String, IElementWriter> getElementWriters() {
+ return elementWriters;
+ }
+
+ public ListHashTable<Class<? extends IExtension>, IExtensionAttributeWriter> getExtensionAttributeWriters() {
+ return extensionAttributeWriters;
+ }
+
+ public ListHashTable<Class<? extends IExtension>, IExtensionElementWriter> getExtensionElementWriters() {
+ return extensionElementWriters;
+ }
+
+ public void removeAttributeWriter(final String parentTag, final IAttributeWriter aw) {
+ final boolean removed = attributeWriters.remove(parentTag, aw);
+ assert removed;
+ }
+
+ public void removeElementWriter(final String parentTag, final IElementWriter nw) {
+ final boolean removed = elementWriters.remove(parentTag, nw);
+ assert removed;
+ }
+
+ public void removeExtensionAttributeWriter(final Class<? extends IExtension> clazz,
+ final IExtensionAttributeWriter aw) {
+ final boolean removed = extensionAttributeWriters.remove(clazz, aw);
+ assert removed;
+ }
+
+ public void removeExtensionElementWriter(final Class<? extends IExtension> clazz, final IExtensionElementWriter nw) {
+ final boolean removed = extensionElementWriters.remove(clazz, nw);
+ assert removed;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/io/xml/StdXMLBuilder.java b/freeplane/src/main/java/org/freeplane/core/io/xml/StdXMLBuilder.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/xml/StdXMLBuilder.java
rename to freeplane/src/main/java/org/freeplane/core/io/xml/StdXMLBuilder.java
diff --git a/freeplane/src/main/java/org/freeplane/core/io/xml/TreeXmlReader.java b/freeplane/src/main/java/org/freeplane/core/io/xml/TreeXmlReader.java
new file mode 100644
index 0000000..4e7abe6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/io/xml/TreeXmlReader.java
@@ -0,0 +1,333 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.io.xml;
+
+import java.awt.Point;
+import java.io.Reader;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IElementContentHandler;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IElementHandler;
+import org.freeplane.core.io.ListHashTable;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.n3.nanoxml.IXMLBuilder;
+import org.freeplane.n3.nanoxml.IXMLReader;
+import org.freeplane.n3.nanoxml.NonValidator;
+import org.freeplane.n3.nanoxml.StdXMLReader;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.n3.nanoxml.XMLException;
+
+public class TreeXmlReader implements IXMLBuilder {
+ public static boolean xmlToBoolean(final String string) {
+ if (string == null) {
+ return false;
+ }
+ if (string.equals("true")) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Extracts a long from xml. Only useful for dates.
+ */
+ public static Date xmlToDate(final String xmlString) {
+ try {
+ return new Date(Long.valueOf(xmlString).longValue());
+ }
+ catch (final Exception e) {
+ return new Date(System.currentTimeMillis());
+ }
+ }
+
+ public static Point xmlToPoint(String string) {
+ if (string == null) {
+ return null;
+ }
+ if (string.startsWith("java.awt.Point")) {
+ string = string.replaceAll("java\\.awt\\.Point\\[x=(-?[0-9]+),y=(-?[0-9]+)\\]", "$1;$2");
+ }
+ final StringTokenizer tok = new StringTokenizer(string, ";");
+ if (tok.countTokens() != 2) {
+ throw new IllegalArgumentException("A point must consist of two numbers (and not: '" + string + "').");
+ }
+ final int x = Integer.parseInt(tok.nextToken());
+ final int y = Integer.parseInt(tok.nextToken());
+ return new Point(x, y);
+ }
+
+ private Hashtable<String, IAttributeHandler> attributeHandlersForTag;
+ private Object currentElement;
+ private String elementContentAsString;
+ final private LinkedList<Object> elementStack = new LinkedList<Object>();
+ private IElementHandler nodeCreator;
+ final private LinkedList<IElementHandler> nodeCreatorStack = new LinkedList<IElementHandler>();
+ private Object parentElement;
+ final private ReadManager parseManager;
+ private XMLParser parser;
+ private XMLElement saveAsXmlUntil;
+ private String tag;
+ private StdXMLBuilder xmlBuilder;
+
+ public TreeXmlReader(final ReadManager parseManager) {
+ super();
+ this.parseManager = parseManager;
+ }
+
+ private boolean addAttribute(final String key, final String value) {
+ if (saveAsXmlUntil == null && attributeHandlersForTag != null) {
+ final IAttributeHandler attributeHandler = attributeHandlersForTag.get(key);
+ if (attributeHandler != null) {
+ try {
+ attributeHandler.setAttribute(currentElement, value);
+ return true;
+ } catch (Exception e) {
+ LogUtils.severe("Can not process attribute" + key + " = '" + value + "'", e);
+ }
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#addAttribute(java.lang
+ * .String, java.lang.String, java.lang.String, java.lang.String,
+ * java.lang.String)
+ */
+ public void addAttribute(final String key, final String nsPrefix, final String nsURI, final String value,
+ final String type) throws Exception {
+ if (!addAttribute(key, value)) {
+ xmlBuilder.addAttribute(key, nsPrefix, nsURI, value, type);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#addPCData(java.io.Reader
+ * , java.lang.String, int)
+ */
+ public void addPCData(final Reader reader, final String systemID, final int lineNr) throws Exception {
+ xmlBuilder.addPCData(reader, systemID, lineNr);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#elementAttributesProcessed
+ * (java.lang.String, java.lang.String, java.lang.String)
+ */
+ public void elementAttributesProcessed(final String name, final String nsPrefix, final String nsURI)
+ throws Exception {
+ xmlBuilder.elementAttributesProcessed(name, nsPrefix, nsURI);
+ if (saveAsXmlUntil != null || nodeCreator != null) {
+ return;
+ }
+ final Iterator<IElementHandler> iterator = getElementHandlers().iterator(tag);
+ final XMLElement lastBuiltElement = xmlBuilder.getLastBuiltElement();
+ while (iterator.hasNext() && currentElement == null) {
+ nodeCreator = iterator.next();
+ try {
+ currentElement = nodeCreator.createElement(parentElement, name, lastBuiltElement);
+ } catch (Exception e) {
+ LogUtils.severe("Can not process element" + name, e);
+ }
+ }
+ if (currentElement != null) {
+ if (nodeCreator instanceof IElementContentHandler) {
+ parser.notParseNextElementContent();
+ }
+ attributeHandlersForTag = getAttributeLoaders().get(tag);
+ if (attributeHandlersForTag == null) {
+ return;
+ }
+ final Enumeration<String> attributeNames = lastBuiltElement.enumerateAttributeNames();
+ while (attributeNames.hasMoreElements()) {
+ final String atName = (String) attributeNames.nextElement();
+ if (addAttribute(atName, lastBuiltElement.getAttribute(atName, null))) {
+ lastBuiltElement.removeAttribute(atName);
+ }
+ }
+ }
+ else {
+ currentElement = null;
+ nodeCreator = null;
+ saveAsXmlUntil = lastBuiltElement;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#endElement(java.lang
+ * .String, java.lang.String, java.lang.String)
+ */
+ public void endElement(final String name, final String nsPrefix, final String nsURI) throws Exception {
+ final XMLElement lastBuiltElement = xmlBuilder.getParentElement();
+ xmlBuilder.endElement(name, nsPrefix, nsURI);
+ if (saveAsXmlUntil == lastBuiltElement) {
+ saveAsXmlUntil = null;
+ }
+ if (saveAsXmlUntil != null) {
+ return;
+ }
+ tag = null;
+ if (0 == elementStack.size()) {
+ return;
+ }
+ final Object element = currentElement;
+ currentElement = elementStack.removeLast();
+ try {
+ if (nodeCreator instanceof IElementContentHandler) {
+ ((IElementContentHandler) nodeCreator).endElement(currentElement, name, element, lastBuiltElement,
+ elementContentAsString);
+ }
+ else if (nodeCreator instanceof IElementDOMHandler) {
+ ((IElementDOMHandler) nodeCreator).endElement(currentElement, name, element, lastBuiltElement);
+ }
+ } catch (Exception e) {
+ LogUtils.severe("Can not process element" + name, e);
+ }
+ final XMLElement top = lastBuiltElement.getParent();
+ if (nodeCreator != null && top != null && top.hasChildren()) {
+ final int lastChildIndex = top.getChildrenCount() - 1;
+ top.removeChildAtIndex(lastChildIndex);
+ }
+ nodeCreator = (IElementHandler) nodeCreatorStack.removeLast();
+ elementContentAsString = null;
+ }
+
+ private Hashtable<String, Hashtable<String, IAttributeHandler>> getAttributeLoaders() {
+ return parseManager.getAttributeHandlers();
+ }
+
+ private ListHashTable<String, IElementHandler> getElementHandlers() {
+ return parseManager.getElementHandlers();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#getResult()
+ */
+ public Object getResult() throws Exception {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.persistence.Reader#load()
+ */
+ public void load(final Reader reader) throws XMLException {
+ parser = new XMLParser();
+ final IXMLReader nanoxmlReader = new StdXMLReader(reader);
+ parser.setReader(nanoxmlReader);
+ parser.setBuilder(this);
+ parser.setValidator(new NonValidator());
+ parser.parse();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#newProcessingInstruction
+ * (java.lang.String, java.io.Reader)
+ */
+ public void newProcessingInstruction(final String target, final Reader reader) throws Exception {
+ xmlBuilder.newProcessingInstruction(target, reader);
+ }
+
+ private void pushParentObjects() {
+ elementStack.addLast(currentElement);
+ nodeCreatorStack.addLast(nodeCreator);
+ }
+
+ /**
+ */
+ public void setElementContent(final String content) {
+ elementContentAsString = content;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#startBuilding(java.lang
+ * .String, int)
+ */
+ public void startBuilding(final String systemID, final int lineNr) throws Exception {
+ xmlBuilder = new StdXMLBuilder();
+ xmlBuilder.startBuilding(systemID, lineNr);
+ saveAsXmlUntil = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#startElement(java.lang
+ * .String, java.lang.String, java.lang.String, java.lang.String, int)
+ */
+ public void startElement(final String name, final String nsPrefix, final String nsURI, final String systemID,
+ final int lineNr) throws Exception {
+ if (saveAsXmlUntil != null) {
+ xmlBuilder.startElement(name, nsPrefix, nsURI, systemID, lineNr);
+ return;
+ }
+ xmlBuilder.startElement(name, nsPrefix, nsURI, systemID, lineNr);
+ tag = name;
+ pushParentObjects();
+ parentElement = currentElement;
+ currentElement = null;
+ final List<IElementHandler> handlers = getElementHandlers().list(tag);
+ if (handlers != null && handlers.size() == 1) {
+ nodeCreator = handlers.get(0);
+ try {
+ currentElement = nodeCreator.createElement(parentElement, tag, null);
+ } catch (Exception e) {
+ LogUtils.severe("Can not process element" + tag, e);
+ }
+ }
+ if (currentElement != null) {
+ attributeHandlersForTag = getAttributeLoaders().get(tag);
+ if (nodeCreator instanceof IElementContentHandler) {
+ parser.notParseNextElementContent();
+ }
+ }
+ else {
+ attributeHandlersForTag = null;
+ currentElement = null;
+ nodeCreator = null;
+ }
+ }
+
+ public void load(Object currentElement, Reader pReader) throws XMLException {
+ this.currentElement = currentElement;
+ load(pReader);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/io/xml/TreeXmlWriter.java b/freeplane/src/main/java/org/freeplane/core/io/xml/TreeXmlWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/xml/TreeXmlWriter.java
rename to freeplane/src/main/java/org/freeplane/core/io/xml/TreeXmlWriter.java
diff --git a/freeplane/src/org/freeplane/core/io/xml/XMLParser.java b/freeplane/src/main/java/org/freeplane/core/io/xml/XMLParser.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/xml/XMLParser.java
rename to freeplane/src/main/java/org/freeplane/core/io/xml/XMLParser.java
diff --git a/freeplane/src/org/freeplane/core/io/xml/XMLWriter.java b/freeplane/src/main/java/org/freeplane/core/io/xml/XMLWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/io/xml/XMLWriter.java
rename to freeplane/src/main/java/org/freeplane/core/io/xml/XMLWriter.java
diff --git a/freeplane/src/org/freeplane/core/resources/IFreeplanePropertyListener.java b/freeplane/src/main/java/org/freeplane/core/resources/IFreeplanePropertyListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/resources/IFreeplanePropertyListener.java
rename to freeplane/src/main/java/org/freeplane/core/resources/IFreeplanePropertyListener.java
diff --git a/freeplane/src/org/freeplane/core/resources/OptionPanelController.java b/freeplane/src/main/java/org/freeplane/core/resources/OptionPanelController.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/resources/OptionPanelController.java
rename to freeplane/src/main/java/org/freeplane/core/resources/OptionPanelController.java
diff --git a/freeplane/src/org/freeplane/core/resources/ResourceBundles.java b/freeplane/src/main/java/org/freeplane/core/resources/ResourceBundles.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/resources/ResourceBundles.java
rename to freeplane/src/main/java/org/freeplane/core/resources/ResourceBundles.java
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/ResourceController.java b/freeplane/src/main/java/org/freeplane/core/resources/ResourceController.java
new file mode 100644
index 0000000..c16dda6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/ResourceController.java
@@ -0,0 +1,320 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources;
+
+import java.io.BufferedInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.ResourceBundle;
+import java.util.Vector;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.ui.TimePeriodUnits;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.mode.AController.IActionOnChange;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public abstract class ResourceController {
+ public static final String FREEPLANE_PROPERTIES = "/freeplane.properties";
+ public static final String LOCAL_PROPERTIES = "LocalProperties.";
+ public static final String RESOURCE_DRAW_RECTANGLE_FOR_SELECTION = "standarddrawrectangleforselection";
+ // some plugins have their own file for registration of defaults
+ public static final String PLUGIN_DEFAULTS_RESOURCE = "defaults.properties";
+
+ static public ResourceController getResourceController() {
+ return Controller.getCurrentController().getResourceController();
+ }
+
+ final private List<IFreeplanePropertyListener> propertyChangeListeners = new Vector<IFreeplanePropertyListener>();
+ private ResourceBundles resources;
+ public static final String FREEPLANE_RESOURCE_URL_PROTOCOL = "freeplaneresource";
+ public static final String OBJECT_TYPE = "ObjectType";
+ public ResourceController() {
+ super();
+ }
+
+ public void addLanguageResources(final String language, final URL url) {
+ resources.addResources(language, url);
+ }
+
+ public void addLanguageResources(final String language, final Map<String, String> resources) {
+ this.resources.addResources(language, resources);
+ }
+
+ public void addPropertyChangeListener(final IFreeplanePropertyListener listener) {
+ propertyChangeListeners.add(listener);
+ }
+
+ /**
+ * @param listener
+ * The new listener. All currently available properties are sent
+ * to the listener after registration. Here, the oldValue
+ * parameter is set to null.
+ */
+ public void addPropertyChangeListenerAndPropagate(final IFreeplanePropertyListener listener) {
+ addPropertyChangeListener(listener);
+ for (final Entry<Object, Object> entry : getProperties().entrySet()) {
+ final String key = (String) entry.getKey();
+ listener.propertyChanged(key, (String) entry.getValue(), null);
+ }
+ }
+
+ protected void loadAnotherLanguage() {
+ resources.loadAnotherLanguage();
+ }
+
+ public void firePropertyChanged(final String property, final String value, final String oldValue) {
+ if (oldValue == null || !oldValue.equals(value)) {
+ setProperty(property, value);
+ for (final IFreeplanePropertyListener listener : getPropertyChangeListeners()) {
+ listener.propertyChanged(property, value, oldValue);
+ }
+ }
+ }
+
+ public boolean getBooleanProperty(final String key) {
+ return Boolean.parseBoolean(getProperty(key));
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T extends Enum<T>> T getEnumProperty(String propertyName, Enum<T> defaultValue) {
+ try{
+ final String cacheProptertyValue = getProperty(propertyName).toUpperCase(Locale.ENGLISH);
+ defaultValue = Enum.valueOf(defaultValue.getClass(), cacheProptertyValue);
+ }
+ catch (Exception e) {
+ LogUtils.severe(e);
+ }
+ return (T)defaultValue;
+ }
+
+
+ /**
+ * @param resourcesNodeTextColor
+ * @return
+ */
+ public String getDefaultProperty(final String key) {
+ return null;
+ }
+
+ /** register defaults in freeplane.properties respectively defaults.properties instead! */
+ public double getDoubleProperty(final String key, final double defaultValue) {
+ try {
+ return Double.parseDouble(ResourceController.getResourceController().getProperty(key));
+ }
+ catch (final Exception e) {
+ return defaultValue;
+ }
+ }
+
+ /**
+ * @return
+ */
+ abstract public String getFreeplaneUserDirectory();
+
+ /** register defaults in freeplane.properties respectively defaults.properties instead! */
+ public int getIntProperty(final String key, final int defaultValue) {
+ try {
+ return Integer.parseInt(getProperty(key));
+ }
+ catch (final NumberFormatException nfe) {
+ return defaultValue;
+ }
+ }
+
+
+ public int getLengthProperty(String name) {
+ final Quantity<LengthUnits> quantity = getLengthQuantityProperty(name);
+ return quantity.toBaseUnitsRounded();
+ }
+
+ public Quantity<LengthUnits> getLengthQuantityProperty(String name) {
+ final String property = getProperty(name);
+ final Quantity<LengthUnits> quantity = Quantity.fromString(property, LengthUnits.px);
+ return quantity;
+ }
+
+ public int getTimeProperty(String name) {
+ final Quantity<TimePeriodUnits> quantity = getTimeQuantityProperty(name);
+ return quantity.toBaseUnitsRounded();
+ }
+
+ public Quantity<TimePeriodUnits> getTimeQuantityProperty(String name) {
+ final String property = getProperty(name);
+ final Quantity<TimePeriodUnits> quantity = Quantity.fromString(property, TimePeriodUnits.ms);
+ return quantity;
+ }
+
+ public int getIntProperty(String key) {
+ return Integer.parseInt(getProperty(key));
+ }
+
+ public double getDoubleProperty(String key) {
+ return Double.parseDouble(getProperty(key));
+ }
+
+ /** register defaults in freeplane.properties respectively defaults.properties instead. */
+ public long getLongProperty(final String key, final int defaultValue) {
+ try {
+ return Long.parseLong(getProperty(key));
+ }
+ catch (final NumberFormatException nfe) {
+ return defaultValue;
+ }
+ }
+
+ abstract public Properties getProperties();
+
+ abstract public String getProperty(final String key);
+
+ /** register defaults in freeplane.properties respectively defaults.properties instead! */
+ public String getProperty(final String key, final String value) {
+ return getProperties().getProperty(key, value);
+ }
+
+ public Collection<IFreeplanePropertyListener> getPropertyChangeListeners() {
+ return Collections.unmodifiableCollection(propertyChangeListeners);
+ }
+
+ public URL getResource(final String name) {
+ return getClass().getResource(name);
+ }
+
+ public InputStream getResourceStream(final String resFileName) throws IOException {
+ final URL resUrl = getResource(resFileName);
+ if (resUrl == null) {
+ LogUtils.severe("Can't find " + resFileName + " as resource.");
+ throw new IllegalArgumentException("Can't find " + resFileName + " as resource.");
+ }
+ return new BufferedInputStream(resUrl.openStream());
+ }
+
+ public String getResourceBaseDir() {
+ return "";
+ }
+
+ public String getInstallationBaseDir() {
+ return "";
+ }
+
+ /** Returns the ResourceBundle with the current language */
+ public ResourceBundle getResources() {
+ if (resources == null) {
+ resources = new ResourceBundles(this);
+ }
+ return resources;
+ }
+
+ public String getLanguageCode() {
+ return resources.getLanguageCode();
+ }
+
+ public String getDefaultLanguageCode() {
+ return resources.getDefaultLanguageCode();
+ }
+
+ public String getText(final String key, final String resource) {
+ return ((ResourceBundles) getResources()).getResourceString(key, resource);
+ }
+
+ protected void init() {
+ }
+
+ public void removePropertyChangeListener(final IFreeplanePropertyListener listener) {
+ propertyChangeListeners.remove(listener);
+ }
+
+ abstract public void saveProperties();
+
+ abstract public void setDefaultProperty(final String key, final String value);
+
+ public void setProperty(final String property, final boolean value) {
+ setProperty(property, Boolean.toString(value));
+ }
+
+ public void setProperty(String name, int value) {
+ setProperty(name, Integer.toString(value));
+ }
+
+ abstract public void setProperty(final String property, final String value);
+
+ /** adds properties from url to properties. Existing properties in resultProps will be overridden.
+ * @return false if anything went wrong. */
+ protected static boolean loadProperties(Properties resultProps, final URL url) {
+ InputStream in = null;
+ try {
+ in = new BufferedInputStream(url.openStream());
+ resultProps.load(in);
+ LogUtils.info("Loaded properties from " + url);
+ return true;
+ }
+ catch (final Exception ex) {
+ System.err.println("Could not load properties from " + url);
+ }
+ finally {
+ FileUtils.silentlyClose(in);
+ }
+ return false;
+ }
+
+ /** will add properties from propertiesUrl if they don't exist yet. */
+ public void addDefaults(URL propertiesUrl) {
+ Properties props = new Properties();
+ loadProperties(props, propertiesUrl);
+ addDefaults(props);
+ }
+
+ /** use generic to make it useable with Properties. KT and VT must be of type String. */
+ public <KT, VT> void addDefaults(Map<KT, VT> defaultProperties) {
+ for (Entry<KT, VT> entry : defaultProperties.entrySet()) {
+ setDefaultProperty((String) entry.getKey(), (String) entry.getValue());
+ }
+ }
+
+ public boolean isApplet() {
+ return false;
+ }
+
+ public void removePropertyChangeListener(final Class<? extends IActionOnChange> clazz, final AFreeplaneAction action) {
+ final Iterator<IFreeplanePropertyListener> iterator = propertyChangeListeners.iterator();
+ while (iterator.hasNext()) {
+ final IFreeplanePropertyListener next = iterator.next();
+ if (next instanceof IActionOnChange && ((IActionOnChange) next).getAction() == action) {
+ iterator.remove();
+ return;
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/SetBooleanPropertyAction.java b/freeplane/src/main/java/org/freeplane/core/resources/SetBooleanPropertyAction.java
new file mode 100644
index 0000000..545bed9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/SetBooleanPropertyAction.java
@@ -0,0 +1,61 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.core.util.TextUtils;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 2, 2011
+ */
+ at SuppressWarnings("serial")
+ at SelectableAction(checkOnPopup = true)
+public class SetBooleanPropertyAction extends AFreeplaneAction{
+
+ private String propertyName;
+ public SetBooleanPropertyAction(String propertyName) {
+ super("SetBooleanPropertyAction." + propertyName,
+ TextUtils.getRawText("OptionPanel." + propertyName),
+ null);
+ this.propertyName = propertyName;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ ResourceController.getResourceController().setProperty(propertyName, ! isPropertySet());
+
+ }
+
+ public String getTextKey() {
+ return "OptionPanel." + propertyName;
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(isPropertySet());
+ }
+
+ public boolean isPropertySet() {
+ return ResourceController.getResourceController().getBooleanProperty(propertyName);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/TranslatedObject.java b/freeplane/src/main/java/org/freeplane/core/resources/TranslatedObject.java
new file mode 100644
index 0000000..6a174db
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/TranslatedObject.java
@@ -0,0 +1,141 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources;
+
+import java.awt.Component;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.Icon;
+import javax.swing.JList;
+import javax.swing.ListCellRenderer;
+
+import org.freeplane.core.util.TextUtils;
+
+/**
+ * Utility Class for displaying local object names in GUI components.
+ *
+ * @author Dimitry Polivaev
+ */
+public class TranslatedObject {
+ static public TranslatedObject literal(final String literal) {
+ final TranslatedObject result = new TranslatedObject();
+ result.object = literal;
+ result.translation = literal;
+ return result;
+ }
+
+ private String translation;
+ private Object object;
+ private Icon icon;
+ private static ListCellRenderer listCellRenderer;
+
+ private TranslatedObject() {
+ }
+
+ public TranslatedObject(final Object object, final String translation) {
+ this.object = object;
+ this.translation = translation;
+ }
+
+ public TranslatedObject(final String object) {
+ this.object = object;
+ translation = TextUtils.getText(object);
+ }
+
+ public Object getObject() {
+ return object;
+ }
+
+ public boolean objectEquals(final Object o) {
+ return object.equals(o);
+ }
+
+ @Override
+ public String toString() {
+ return translation;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (!(obj instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject nobj = (TranslatedObject) obj;
+ return object.equals(nobj.object);
+ }
+
+ @Override
+ public int hashCode() {
+ return object.hashCode();
+ }
+
+ public static TranslatedObject format(final String value) {
+ final int separatorPos = value.indexOf(',');
+ if (separatorPos == -1) {
+ return new TranslatedObject(value);
+ }
+ final String key = value.substring(0, separatorPos);
+ final String s1 = value.substring(separatorPos + 1);
+ final String text = TextUtils.format(key, s1);
+ return new TranslatedObject(value, text);
+ }
+
+ public Icon getIcon() {
+ return icon;
+ }
+
+ public void setIcon(Icon icon) {
+ this.icon = icon;
+ }
+
+ public static ListCellRenderer getIconRenderer() {
+ if(listCellRenderer == null)
+ listCellRenderer = new ListCellRenderer() {
+ private ListCellRenderer delegate = new DefaultListCellRenderer();
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
+ boolean cellHasFocus) {
+ final Object renderedValue;
+ if(value instanceof TranslatedObject){
+ final Icon icon = ((TranslatedObject)value).getIcon();
+ if(icon != null)
+ renderedValue = icon;
+ else
+ renderedValue = value;
+ }
+ else
+ renderedValue = value;
+ return delegate.getListCellRendererComponent(list, renderedValue, index, isSelected, cellHasFocus);
+ }
+ };
+ return listCellRenderer;
+ }
+
+ public static TranslatedObject[] fromEnum(Class<? extends Enum<?>> enumeration) {
+ return fromEnum(enumeration.getSimpleName() + "." , enumeration);
+ }
+ public static TranslatedObject[] fromEnum(final String prefix, Class<? extends Enum<?>> enumeration) {
+ final Enum<?>[] enumConstants=enumeration.getEnumConstants();
+ TranslatedObject[] objs = new TranslatedObject[enumConstants.length];
+ int i = 0;
+ for(Enum<?> value : enumConstants){
+ objs[i++] = new TranslatedObject(value, TextUtils.getText(prefix + value.toString()));
+ }
+ return objs;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/WindowConfigurationStorage.java b/freeplane/src/main/java/org/freeplane/core/resources/WindowConfigurationStorage.java
new file mode 100644
index 0000000..a6c2fbc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/WindowConfigurationStorage.java
@@ -0,0 +1,134 @@
+package org.freeplane.core.resources;
+
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.n3.nanoxml.IXMLParser;
+import org.freeplane.n3.nanoxml.IXMLReader;
+import org.freeplane.n3.nanoxml.StdXMLReader;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.n3.nanoxml.XMLParserFactory;
+import org.freeplane.n3.nanoxml.XMLWriter;
+
+public class WindowConfigurationStorage {
+ protected int height;
+ protected int width;
+ protected int x;
+ protected int y;
+ final private String name;
+
+ public WindowConfigurationStorage(String name) {
+ super();
+ this.name = name;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ private String marshall() {
+ final XMLElement xml = new XMLElement();
+ xml.setAttribute("x", Integer.toString(x));
+ xml.setAttribute("y", Integer.toString(y));
+ xml.setAttribute("width", Integer.toString(width));
+ xml.setAttribute("height", Integer.toString(height));
+ xml.setName(name);
+ marshallSpecificElements(xml);
+ final StringWriter string = new StringWriter();
+ final XMLWriter writer = new XMLWriter(string);
+ try {
+ writer.write(xml);
+ return string.toString();
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ return null;
+ }
+ }
+
+ protected void marshallSpecificElements(XMLElement xml){
+ };
+
+ public void setHeight(final int height) {
+ this.height = height;
+ }
+
+ public void setWidth(final int width) {
+ this.width = width;
+ }
+
+ public void setX(final int x) {
+ this.x = x;
+ }
+
+ public void setY(final int y) {
+ this.y = y;
+ }
+
+ public void storeDialogPositions(final JDialog dialog) {
+ storeDialogPositions(dialog, name);
+ }
+ public void storeDialogPositions(final JDialog dialog, final String window_preference_storage_property) {
+ setX((dialog.getX()));
+ setY((dialog.getY()));
+ setWidth((dialog.getWidth()));
+ setHeight((dialog.getHeight()));
+ final String marshalled = marshall();
+ ResourceController.getResourceController().setProperty(window_preference_storage_property, marshalled);
+ }
+
+ public XMLElement restoreDialogPositions(final JDialog dialog) {
+ return restoreDialogPositions(dialog, name);
+ }
+ public XMLElement restoreDialogPositions(final JDialog dialog, final String window_preference_storage_property) {
+ String marshalled = ResourceController.getResourceController().getProperty(window_preference_storage_property);
+ return unmarschall(marshalled, dialog);
+ }
+ protected XMLElement unmarschall(final String marshalled, final JDialog dialog) {
+ if (marshalled != null) {
+ final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
+ final IXMLReader xmlReader = new StdXMLReader(new StringReader(marshalled));
+ parser.setReader(xmlReader);
+ try {
+ final XMLElement storage = (XMLElement) parser.parse();
+ if (storage != null) {
+ x = Integer.parseInt(storage.getAttribute("x", "-1"));
+ y = Integer.parseInt(storage.getAttribute("y", "-1"));
+ width = Integer.parseInt(storage.getAttribute("width", "-1"));
+ height = Integer.parseInt(storage.getAttribute("height", "-1"));
+ UITools.setBounds(dialog, x, y, width, height);
+ return storage;
+ }
+ }
+ catch (final NumberFormatException e) {
+ LogUtils.severe(e);
+ }
+ catch (final XMLException e) {
+ LogUtils.severe(e);
+ }
+ }
+ UITools.setBounds(dialog, -1, -1, -1, -1);
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/BooleanProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/BooleanProperty.java
new file mode 100644
index 0000000..66fd25e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/BooleanProperty.java
@@ -0,0 +1,81 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+
+import javax.swing.JCheckBox;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class BooleanProperty extends PropertyBean implements IPropertyControl {
+ JCheckBox mCheckBox = new JCheckBox();
+
+ /**
+ */
+ public BooleanProperty(final String name) {
+ super(name);
+ mCheckBox.addItemListener(new ItemListener() {
+ public void itemStateChanged(final ItemEvent pE) {
+ firePropertyChangeEvent();
+ }
+ });
+ }
+
+ @Override
+ public String getValue() {
+ return mCheckBox.isSelected() ? Boolean.TRUE.toString() : Boolean.FALSE.toString();
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, mCheckBox);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mCheckBox.setEnabled(pEnabled);
+ }
+
+ @Override
+ public void setValue(final String value) {
+ final boolean booleanValue = Boolean.parseBoolean(value);
+ setValue(booleanValue);
+ }
+
+ public void setValue(final boolean booleanValue) {
+ mCheckBox.setSelected(booleanValue);
+ }
+
+ public boolean getBooleanValue() {
+ return mCheckBox.isSelected();
+ }
+
+ public void enables(final IPropertyControl control) {
+ control.setEnabled(getBooleanValue());
+ addPropertyChangeListener(new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ control.setEnabled(getBooleanValue());
+ }
+ });
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/ColorProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/ColorProperty.java
new file mode 100644
index 0000000..ca856f7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/ColorProperty.java
@@ -0,0 +1,135 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JButton;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.plaf.basic.BasicButtonUI;
+
+import org.freeplane.core.ui.ColorTracker;
+import org.freeplane.core.ui.components.JFreeplaneMenuItem;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.TextUtils;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class ColorProperty extends PropertyBean implements IPropertyControl, ActionListener {
+ Color color;
+ final private String defaultColor;
+ JButton mButton;
+ final JPopupMenu menu = new JPopupMenu();
+
+ /**
+ * @param defaultColor
+ * @param pTranslator
+ */
+ public ColorProperty(final String name, final String defaultColor) {
+ super(name);
+ this.defaultColor = defaultColor;
+ mButton = new JButton() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ {
+ setUI(BasicButtonUI.createUI(this));
+ }
+ };
+ mButton.addActionListener(this);
+ color = Color.BLACK;
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ final Color result = ColorTracker.showCommonJColorChooserDialog(mButton.getRootPane(), TextUtils
+ .getOptionalText(getLabel()), getColorValue(), ColorUtils.stringToColor(defaultColor));
+ if(result != null){
+ setColorValue(result);
+ firePropertyChangeEvent();
+ }
+ }
+
+ /**
+ */
+ public Color getColorValue() {
+ return color;
+ }
+
+ @Override
+ public String getValue() {
+ final Color colorValue = getColorValue();
+ return ColorUtils.colorToRGBAString(colorValue);
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, mButton);
+ final JMenuItem item = new JFreeplaneMenuItem(TextUtils.getOptionalText("ColorProperty.ResetColor"));
+ item.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ setValue(defaultColor);
+ }
+ });
+ menu.add(item);
+ mButton.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mousePressed(final MouseEvent evt) {
+ if (evt.isPopupTrigger()) {
+ menu.show(evt.getComponent(), evt.getX(), evt.getY());
+ }
+ }
+
+ @Override
+ public void mouseReleased(final MouseEvent evt) {
+ if (evt.isPopupTrigger()) {
+ menu.show(evt.getComponent(), evt.getX(), evt.getY());
+ }
+ }
+ });
+ }
+
+ /**
+ */
+ public void setColorValue(Color input) {
+ color = input;
+ if (input == null) {
+ input = Color.WHITE;
+ }
+ mButton.setBackground(ColorUtils.alphaToColor(255, input));
+ final Color textColor = UITools.getTextColorForBackground(input);
+ mButton.setForeground(textColor);
+ mButton.setText(ColorUtils.colorToString(input));
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mButton.setEnabled(pEnabled);
+ }
+
+ @Override
+ public void setValue(final String value) {
+ setColorValue(ColorUtils.stringToColor(value));
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/ComboProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/ComboProperty.java
new file mode 100644
index 0000000..4c78315
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/ComboProperty.java
@@ -0,0 +1,133 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Vector;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class ComboProperty extends PropertyBean implements IPropertyControl, ActionListener {
+ static public Vector<String> translate(final String[] possibles) {
+ final Vector<String> possibleTranslations = new Vector<String>(possibles.length);
+ for (int i = 0; i < possibles.length; i++) {
+ possibleTranslations.add(TextUtils.getText("OptionPanel." + possibles[i]));
+ }
+ return possibleTranslations;
+ }
+
+ final JComboBox mComboBox;
+ private Vector<String> possibleValues;
+
+ public ComboProperty(final String name, final Collection<String> possibles,
+ final Collection<String> possibleTranslations) {
+ super(name);
+ fillPossibleValues(possibles);
+ mComboBox = new JComboBoxWithBorder();
+ mComboBox.setModel(new DefaultComboBoxModel(new Vector<String>(possibleTranslations)));
+ mComboBox.addActionListener(this);
+ //mComboBox.setRenderer(ComboBoxSmallFontRenderer.INSTANCE);
+ }
+
+ public ComboProperty(final String name, final String[] strings) {
+ this(name, Arrays.asList(strings), ComboProperty.translate(strings));
+ }
+
+ /**
+ */
+ private void fillPossibleValues(final Collection<String> possibles) {
+ possibleValues = new Vector<String>();
+ possibleValues.addAll(possibles);
+ }
+
+ @Override
+ public String getValue() {
+ if(mComboBox.getSelectedIndex() == -1)
+ return mComboBox.getSelectedItem().toString();
+ return possibleValues.get(mComboBox.getSelectedIndex());
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, mComboBox);
+ }
+
+ public Vector<String> getPossibleValues() {
+ return possibleValues;
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mComboBox.setEnabled(pEnabled);
+ }
+
+ @Override
+ public void setValue(final String value) {
+ if (possibleValues.contains(value)) {
+ mComboBox.setSelectedIndex(possibleValues.indexOf(value));
+ }
+ else if(mComboBox.isEditable()){
+ mComboBox.setSelectedItem(value);
+ }
+ else{
+ LogUtils.severe("Can't set the value:" + value + " into the combo box " + getName() + " containing values " + possibleValues);
+ if (mComboBox.getModel().getSize() > 0) {
+ mComboBox.setSelectedIndex(0);
+ }
+ }
+ }
+
+ /**
+ * If your combo base changes, call this method to update the values. The
+ * old selected value is not selected, but the first in the list. Thus, you
+ * should call this method only shortly before setting the value with
+ * setValue.
+ */
+ public void updateComboBoxEntries(final List<String> possibles, final List<String> possibleTranslations) {
+ mComboBox.setModel(new DefaultComboBoxModel(new Vector<String>(possibleTranslations)));
+ fillPossibleValues(possibles);
+ if (possibles.size() > 0) {
+ mComboBox.setSelectedIndex(0);
+ }
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ firePropertyChangeEvent();
+ }
+
+ public void setEditable(boolean aFlag) {
+ mComboBox.setEditable(aFlag);
+ }
+
+ public boolean isEditable() {
+ return mComboBox.isEditable();
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/EditableComboProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/EditableComboProperty.java
new file mode 100644
index 0000000..fbe8c71
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/EditableComboProperty.java
@@ -0,0 +1,89 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.List;
+import java.util.Vector;
+
+import javax.swing.JComboBox;
+
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public abstract class EditableComboProperty<T> extends PropertyBean implements IPropertyControl {
+ final JComboBox comboBox;
+ private T selected;
+
+ public EditableComboProperty(final String name, final List<? extends T> values) {
+ super(name);
+ comboBox = createFormatChooser(values);
+ comboBox.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent pE) {
+ firePropertyChangeEvent();
+ }
+ });
+ }
+
+ private JComboBox createFormatChooser(final List<? extends T> list) {
+ final JComboBox formatChooser = new JComboBoxWithBorder(new Vector<T>(list));
+ formatChooser.setEditable(true);
+ formatChooser.addItemListener(new ItemListener() {
+ public void itemStateChanged(final ItemEvent e) {
+ final T valueObject = toValueObject(e.getItem());
+ if (valueObject != null)
+ selected = valueObject;
+ }
+ });
+ return formatChooser;
+ }
+
+ @Override
+ public String getValue() {
+ return selected == null ? null : selected.toString();
+ }
+
+ public T getSelected() {
+ return selected;
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, comboBox);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ comboBox.setEnabled(pEnabled);
+ }
+
+ @Override
+ public void setValue(final String value) {
+ comboBox.setSelectedItem(value == null ? null : toValueObject(value));
+ }
+
+ public void setToolTipText(String text) {
+ comboBox.setToolTipText(text);
+ }
+
+ abstract public T toValueObject(Object value);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/FontProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/FontProperty.java
new file mode 100644
index 0000000..4506c58
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/FontProperty.java
@@ -0,0 +1,78 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.GraphicsEnvironment;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.util.LogUtils;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class FontProperty extends PropertyBean implements IPropertyControl {
+ final private String[] mAvailableFontFamilyNames;
+ JComboBox mFontComboBox = new JComboBoxWithBorder();
+
+ /**
+ */
+ public FontProperty(final String name) {
+ super(name);
+ mAvailableFontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
+ mFontComboBox.setModel(new DefaultComboBoxModel(mAvailableFontFamilyNames));
+ mFontComboBox.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent pE) {
+ firePropertyChangeEvent();
+ }
+ });
+ }
+
+ @Override
+ public String getValue() {
+ return mAvailableFontFamilyNames[mFontComboBox.getSelectedIndex()];
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, mFontComboBox);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mFontComboBox.setEnabled(pEnabled);
+ }
+
+ @Override
+ public void setValue(final String pValue) {
+ for (int i = 0; i < mAvailableFontFamilyNames.length; i++) {
+ final String fontName = mAvailableFontFamilyNames[i];
+ if (fontName.equals(pValue)) {
+ mFontComboBox.setSelectedIndex(i);
+ return;
+ }
+ }
+ LogUtils.severe("Unknown value:" + pValue);
+ if (mFontComboBox.getModel().getSize() > 0) {
+ mFontComboBox.setSelectedIndex(0);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/GrabKeyDialog.java b/freeplane/src/main/java/org/freeplane/core/resources/components/GrabKeyDialog.java
new file mode 100644
index 0000000..206307e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/GrabKeyDialog.java
@@ -0,0 +1,423 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2001, 2002 Slava Pestov
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.AWTEvent;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.lang.reflect.Field;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+import javax.swing.KeyStroke;
+import javax.swing.WindowConstants;
+import javax.swing.border.EmptyBorder;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+
+/**
+ * A dialog for getting shortcut keys.
+ */
+public class GrabKeyDialog extends JDialog {
+ class ActionHandler implements ActionListener {
+ public void actionPerformed(final ActionEvent evt) {
+ if (evt.getSource() == ok) {
+ if (shortcut.keyChar == null) {
+ isOK = false;
+ dispose();
+ }
+ else if (canClose(UITools.getKeyStroke(shortcut.getText()))) {
+ isOK = true;
+ dispose();
+ }
+ }
+ else if (evt.getSource() == cancel) {
+ dispose();
+ }
+ else if (evt.getSource() == clear) {
+ shortcut.keyChar = KeyEvent.CHAR_UNDEFINED;
+ shortcut.setText(null);
+ shortcut.requestFocus();
+ }
+ }
+ }
+
+ class InputPane extends JTextField {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Makes the tab key work in Java 1.4.
+ *
+ * @since jEdit 3.2pre4
+ */
+ @Override
+ public boolean getFocusTraversalKeysEnabled() {
+ return false;
+ }
+
+ private int getModifierMask() {
+ return modifierMask;
+ }
+
+ private Character keyChar = null;
+
+ @Override
+ protected void processKeyEvent(final KeyEvent evt) {
+ if (KeyEvent.KEY_PRESSED != evt.getID()) {
+ return;
+ }
+ if ((getModifierMask() & evt.getModifiers()) != 0) {
+ final KeyEvent evt2 = new KeyEvent(evt.getComponent(), evt.getID(), evt.getWhen(), ~getModifierMask()
+ & evt.getModifiers(), evt.getKeyCode(), evt.getKeyChar(), evt.getKeyLocation());
+ processKeyEvent(evt2);
+ if (evt2.isConsumed()) {
+ evt.consume();
+ }
+ return;
+ }
+ final int keyCode = evt.getKeyCode();
+ switch (keyCode) {
+ case KeyEvent.VK_DEAD_GRAVE:
+ case KeyEvent.VK_DEAD_ACUTE:
+ case KeyEvent.VK_DEAD_CIRCUMFLEX:
+ case KeyEvent.VK_DEAD_TILDE:
+ case KeyEvent.VK_DEAD_MACRON:
+ case KeyEvent.VK_DEAD_BREVE:
+ case KeyEvent.VK_DEAD_ABOVEDOT:
+ case KeyEvent.VK_DEAD_DIAERESIS:
+ case KeyEvent.VK_DEAD_ABOVERING:
+ case KeyEvent.VK_DEAD_DOUBLEACUTE:
+ case KeyEvent.VK_DEAD_CARON:
+ case KeyEvent.VK_DEAD_CEDILLA:
+ case KeyEvent.VK_DEAD_OGONEK:
+ case KeyEvent.VK_DEAD_IOTA:
+ case KeyEvent.VK_DEAD_VOICED_SOUND:
+ case KeyEvent.VK_DEAD_SEMIVOICED_SOUND:
+ return;
+ case '\0':
+ if (evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED || evt.getKeyChar() == 0) {
+ return;
+ }
+ break;
+ case KeyEvent.VK_WINDOWS:
+ if (Compat.isWindowsOS()) {
+ return;
+ }
+ break;
+ case KeyEvent.VK_ALT:
+ KeyEventTranslator.modifiers |= InputEvent.ALT_MASK;
+ return;
+ case KeyEvent.VK_ALT_GRAPH:
+ KeyEventTranslator.modifiers |= InputEvent.ALT_GRAPH_MASK;
+ return;
+ case KeyEvent.VK_CONTROL:
+ KeyEventTranslator.modifiers |= InputEvent.CTRL_MASK;
+ return;
+ case KeyEvent.VK_SHIFT:
+ KeyEventTranslator.modifiers |= InputEvent.SHIFT_MASK;
+ return;
+ case KeyEvent.VK_META:
+ KeyEventTranslator.modifiers |= InputEvent.META_MASK;
+ return;
+ default:
+ if (KeyEventTranslator.ALT_KEY_PRESSED_DISABLED) {
+ /* we don't handle key pressed A+ */
+ /* they're too troublesome */
+ if ((KeyEventTranslator.modifiers & InputEvent.ALT_MASK) != 0) {
+ return;
+ }
+ }
+ break;
+ }
+ evt.consume();
+ final KeyEventTranslator.Key key = KeyEventTranslator.translateKeyEvent(evt);
+ if (key == null) {
+ return;
+ }
+ keyChar = key.input;
+ final StringBuilder keyString = new StringBuilder(/* getText() */);
+ if (key.modifiers != null) {
+ keyString.append(key.modifiers).append(' ');
+ }
+ if (key.input == ' ') {
+ keyString.append("SPACE");
+ }
+ else if (key.key == 0) {
+ keyString.append(key.input);
+ }
+ else {
+ final String symbolicName = getSymbolicName(key.key);
+ if (symbolicName == null) {
+ return;
+ }
+ keyString.append(symbolicName);
+ }
+ setText(keyString.toString());
+ updateAssignedTo(keyString.toString());
+ }
+
+ public Character getKeyChar() {
+ return keyChar;
+ }
+ }
+
+ /**
+ * Create and show a new modal dialog.
+ *
+ * @param parent
+ * center dialog on this component.
+ * @param binding
+ * the action/macro that should get a binding.
+ * @param allBindings
+ * all other key bindings.
+ * @param debugBuffer
+ * debug info will be dumped to this buffer (may be null)
+ * @since jEdit 4.1pre7
+ */
+ /**
+ * A jEdit action or macro with its two possible shortcuts.
+ *
+ * @since jEdit 3.2pre8
+ */
+ public final static String MODIFIER_SEPARATOR = " ";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ */
+ private static String getText(final String resourceString) {
+ return TextUtils.getText("GrabKeyDialog." + resourceString);
+ }
+
+ public static String toString(final KeyEvent evt) {
+ String id;
+ switch (evt.getID()) {
+ case KeyEvent.KEY_PRESSED:
+ id = "KEY_PRESSED";
+ break;
+ case KeyEvent.KEY_RELEASED:
+ id = "KEY_RELEASED";
+ break;
+ case KeyEvent.KEY_TYPED:
+ id = "KEY_TYPED";
+ break;
+ default:
+ id = "unknown type";
+ break;
+ }
+ return id + ",keyCode=0x" + Integer.toString(evt.getKeyCode(), 16) + ",keyChar=0x"
+ + Integer.toString(evt.getKeyChar(), 16) + ",modifiers=0x" + Integer.toString(evt.getModifiers(), 16);
+ }
+
+ private JLabel assignedTo;
+ private JButton cancel;
+ private JButton clear;
+ private boolean isOK;
+ private int modifierMask;
+ private JButton ok;
+ private InputPane shortcut;
+
+ public Character getKeyChar() {
+ return shortcut.getKeyChar();
+ }
+
+ private IKeystrokeValidator validator;
+
+ public GrabKeyDialog(final String input, final int modifierMask) {
+ super((Window) UITools.getMenuComponent(), ModalityType.APPLICATION_MODAL);
+ setTitle(GrabKeyDialog.getText("grab-key.title"));
+ init(input, modifierMask);
+ }
+
+ public GrabKeyDialog(final String input) {
+ this(input, 0);
+ }
+
+ public boolean canClose(final KeyStroke ks) {
+ return validator == null || validator.isValid(ks, getKeyChar());
+ }
+
+ /**
+ * Makes the tab key work in Java 1.4.
+ *
+ * @since jEdit 3.2pre4
+ */
+ @Override
+ public boolean getFocusTraversalKeysEnabled() {
+ return false;
+ }
+
+ /**
+ * Returns the shortcut, or null if the current shortcut should be removed
+ * or the dialog either has been cancelled. Use isOK() to determine if the
+ * latter is true.
+ */
+ public String getShortcut() {
+ if (isOK) {
+ return shortcut.getText();
+ }
+ else {
+ return null;
+ }
+ }
+
+ private String getSymbolicName(final int keyCode) {
+ if (keyCode == KeyEvent.VK_UNDEFINED) {
+ return null;
+ /*
+ * else if(keyCode == KeyEvent.VK_OPEN_BRACKET) return "["; else
+ * if(keyCode == KeyEvent.VK_CLOSE_BRACKET) return "]";
+ */
+ }
+ if (keyCode >= KeyEvent.VK_A && keyCode <= KeyEvent.VK_Z) {
+ return String.valueOf(Character.toLowerCase((char) keyCode));
+ }
+ try {
+ final Field[] fields = KeyEvent.class.getFields();
+ for (int i = 0; i < fields.length; i++) {
+ final Field field = fields[i];
+ final String name = field.getName();
+ if (name.startsWith("VK_") && field.getInt(null) == keyCode) {
+ return name.substring(3);
+ }
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ return null;
+ }
+
+ public IKeystrokeValidator getValidator() {
+ return validator;
+ }
+
+ private void init(final String inputText, final int modifierMask) {
+ this.modifierMask = modifierMask;
+ enableEvents(AWTEvent.KEY_EVENT_MASK);
+ final JPanel content = new JPanel(new GridLayout(0, 1, 0, 6)) {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Makes the tab key work in Java 1.4.
+ *
+ * @since jEdit 3.2pre4
+ */
+ @Override
+ public boolean getFocusTraversalKeysEnabled() {
+ return false;
+ }
+
+ /**
+ * Returns if this component can be traversed by pressing the Tab
+ * key. This returns false.
+ */
+ @Override
+ public boolean isManagingFocus() {
+ return false;
+ }
+ };
+ content.setBorder(new EmptyBorder(12, 12, 12, 12));
+ setContentPane(content);
+ final Box input = Box.createHorizontalBox();
+ shortcut = new InputPane();
+ if (inputText != null) {
+ shortcut.setText(inputText);
+ }
+ input.add(shortcut);
+ input.add(Box.createHorizontalStrut(12));
+ clear = new JButton((GrabKeyDialog.getText("grab-key.clear")));
+ clear.addActionListener(new ActionHandler());
+ input.add(clear);
+ shortcut.setPreferredSize(new Dimension(200, clear.getPreferredSize().height));
+ assignedTo = new JLabel();
+ updateAssignedTo(null);
+ final Box buttons = Box.createHorizontalBox();
+ buttons.add(Box.createGlue());
+ ok = new JButton(GrabKeyDialog.getText("common.ok"));
+ ok.addActionListener(new ActionHandler());
+ buttons.add(ok);
+ buttons.add(Box.createHorizontalStrut(12));
+ cancel = new JButton(GrabKeyDialog.getText("common.cancel"));
+ cancel.addActionListener(new ActionHandler());
+ buttons.add(cancel);
+ buttons.add(Box.createGlue());
+ content.add(input);
+ content.add(buttons);
+ setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ pack();
+ setLocationRelativeTo(getParent());
+ setResizable(false);
+ }
+
+ /**
+ * Returns if this component can be traversed by pressing the Tab key. This
+ * returns false.
+ */
+ public boolean isManagingFocus() {
+ return false;
+ }
+
+ /**
+ * Returns true, if the dialog has not been cancelled.
+ *
+ * @since jEdit 3.2pre9
+ */
+ public boolean isOK() {
+ return isOK;
+ }
+
+ @Override
+ protected void processKeyEvent(final KeyEvent evt) {
+ shortcut.processKeyEvent(evt);
+ }
+
+ public void setValidator(final IKeystrokeValidator validator) {
+ this.validator = validator;
+ }
+
+ private void updateAssignedTo(final String shortcut) {
+ final String text = (GrabKeyDialog.getText("grab-key.assigned-to.none"));
+ if (ok != null) {
+ ok.setEnabled(true);
+ }
+ assignedTo.setText((GrabKeyDialog.getText("grab-key.assigned-to") + " " + text));
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/IKeystrokeValidator.java b/freeplane/src/main/java/org/freeplane/core/resources/components/IKeystrokeValidator.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/resources/components/IKeystrokeValidator.java
rename to freeplane/src/main/java/org/freeplane/core/resources/components/IKeystrokeValidator.java
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/IPropertyControl.java b/freeplane/src/main/java/org/freeplane/core/resources/components/IPropertyControl.java
new file mode 100644
index 0000000..926d331
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/IPropertyControl.java
@@ -0,0 +1,30 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public interface IPropertyControl {
+ String getTooltip();
+
+ String getName();
+
+ void layout(DefaultFormBuilder builder);
+
+ void setEnabled(boolean pEnabled);
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/IPropertyControlCreator.java b/freeplane/src/main/java/org/freeplane/core/resources/components/IPropertyControlCreator.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/resources/components/IPropertyControlCreator.java
rename to freeplane/src/main/java/org/freeplane/core/resources/components/IPropertyControlCreator.java
diff --git a/freeplane/src/org/freeplane/core/resources/components/IValidator.java b/freeplane/src/main/java/org/freeplane/core/resources/components/IValidator.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/resources/components/IValidator.java
rename to freeplane/src/main/java/org/freeplane/core/resources/components/IValidator.java
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/IconProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/IconProperty.java
new file mode 100644
index 0000000..309c824
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/IconProperty.java
@@ -0,0 +1,105 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import javax.swing.JButton;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.components.IconSelectionPopupDialog;
+import org.freeplane.features.icon.MindIcon;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class IconProperty extends PropertyBean implements IPropertyControl, ActionListener {
+ private MindIcon mActualIcon;
+ private final JButton mButton;
+ /**
+ * Of IconInformation s.
+ */
+ private final List<MindIcon> mIcons;
+
+ public IconProperty(final String name, final List<MindIcon> icons) {
+ super(name);
+ mIcons = icons;
+ mButton = new JButton();
+ mButton.addActionListener(this);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final List<MindIcon> icons = new ArrayList<MindIcon>();
+ final List<String> descriptions = new ArrayList<String>();
+ for (final MindIcon icon : mIcons) {
+ icons.add(icon);
+ descriptions.add(icon.getTranslationValueLabel());
+ }
+ final IconSelectionPopupDialog dialog = new IconSelectionPopupDialog(JOptionPane
+ .getFrameForComponent((Component) e.getSource()), icons);
+ dialog.setLocationRelativeTo(JOptionPane.getFrameForComponent((Component) e.getSource()));
+ dialog.setModal(true);
+ dialog.setVisible(true);
+ final int result = dialog.getResult();
+ if (result >= 0) {
+ final MindIcon icon = mIcons.get(result);
+ setValue(icon.getName());
+ firePropertyChangeEvent();
+ }
+ }
+
+ @Override
+ public String getValue() {
+ return mActualIcon.getName();
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, mButton);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mButton.setEnabled(pEnabled);
+ }
+
+ private void setIcon(final MindIcon actualIcon) {
+ mButton.setIcon(actualIcon.getIcon());
+ mButton.setToolTipText(actualIcon.getTranslationValueLabel());
+ }
+
+ @Override
+ public void setValue(final String value) {
+ for (final MindIcon icon : mIcons) {
+ if (icon.getName().equals(value)) {
+ mActualIcon = icon;
+ setIcon(mActualIcon);
+ return;
+ }
+ }
+ throw new NoSuchElementException();
+ }
+
+ public MindIcon getIcon() {
+ return mActualIcon;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/KeyEventTranslator.java b/freeplane/src/main/java/org/freeplane/core/resources/components/KeyEventTranslator.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/resources/components/KeyEventTranslator.java
rename to freeplane/src/main/java/org/freeplane/core/resources/components/KeyEventTranslator.java
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/KeyProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/KeyProperty.java
new file mode 100644
index 0000000..a87fb3d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/KeyProperty.java
@@ -0,0 +1,114 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+
+import org.freeplane.core.util.TextUtils;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.RowSpec;
+import com.jgoodies.forms.layout.Sizes;
+
+/**
+ * @author Dimitry Polivaev
+ * 27.12.2008
+ */
+public class KeyProperty extends PropertyBean implements IPropertyControl {
+ private static RowSpec rowSpec;
+ private Icon icon;
+ private String labelText;
+ JButton mButton = new JButton();
+ private int modifierMask = 0;
+
+ /**
+ */
+ public KeyProperty(final String name) {
+ super(name);
+ }
+
+ public KeyProperty(String shortcutKey, String labelText) {
+ super(shortcutKey, null, null);
+ this.labelText = labelText;
+ }
+
+ public void disableModifiers() {
+ modifierMask = KeyEvent.ALT_MASK | KeyEvent.CTRL_MASK | KeyEvent.META_MASK;
+ }
+
+ @Override
+ public String getValue() {
+ return mButton.getText();
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ mButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent arg0) {
+ final GrabKeyDialog keyDialog = new GrabKeyDialog(getValue(), modifierMask);
+ keyDialog.setVisible(true);
+ if (keyDialog.isOK()) {
+ setValue(keyDialog.getShortcut());
+ firePropertyChangeEvent();
+ }
+ }
+ });
+ if (labelText == null) {
+ labelText = TextUtils.getOptionalText(getLabel());
+ }
+ final JLabel label = new JLabel(labelText, icon, JLabel.RIGHT);
+ String tooltip = TextUtils.getOptionalText(getTooltip());
+ label.setToolTipText(tooltip);
+ if (KeyProperty.rowSpec == null) {
+ KeyProperty.rowSpec = new RowSpec(RowSpec.FILL, Sizes.dluX(20), 0.0);
+ }
+ if (3 < builder.getColumn()) {
+ builder.appendRelatedComponentsGapRow();
+ builder.appendRow(KeyProperty.rowSpec);
+ builder.nextLine(2);
+ }
+ else {
+ builder.nextColumn(2);
+ }
+ builder.add(label);
+ builder.nextColumn(2);
+ builder.add(mButton);
+ mButton.setToolTipText(tooltip);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mButton.setEnabled(pEnabled);
+ }
+
+ public void setImageIcon(final Icon icon) {
+ this.icon = icon;
+ }
+
+ @Override
+ public void setValue(final String value) {
+ mButton.setText(value);
+ mButton.setToolTipText(mButton.getText());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/NextColumnProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/NextColumnProperty.java
new file mode 100644
index 0000000..0c91a3f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/NextColumnProperty.java
@@ -0,0 +1,49 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class NextColumnProperty implements IPropertyControl {
+ private int n;
+
+ public NextColumnProperty() {
+ this(1);
+ }
+
+ public NextColumnProperty(int n) {
+ this.n=n;
+ }
+
+ public String getTooltip() {
+ return null;
+ }
+
+ public String getName() {
+ return null;
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ for(int i = 0; i < n; i++){
+ builder.append("");
+ }
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/NextLineProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/NextLineProperty.java
new file mode 100644
index 0000000..f045483
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/NextLineProperty.java
@@ -0,0 +1,41 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class NextLineProperty implements IPropertyControl {
+ public NextLineProperty() {
+ super();
+ }
+
+ public String getTooltip() {
+ return null;
+ }
+
+ public String getName() {
+ return null;
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ builder.nextLine();
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/NumberProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/NumberProperty.java
new file mode 100644
index 0000000..1d99d03
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/NumberProperty.java
@@ -0,0 +1,111 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class NumberProperty extends PropertyBean implements IPropertyControl {
+// final private int max;
+// final private int min;
+// final private int step;
+ final private JSpinner spinner;
+ final private boolean isDoubleProperty;
+
+ /**
+ */
+ public NumberProperty(final String name, final int min, final int max, final int step) {
+ super(name);
+// this.min = min;
+// this.max = max;
+// this.step = step;
+ spinner = new JSpinner(new SpinnerNumberModel(min, min, max, step));
+ spinner.addChangeListener(new ChangeListener() {
+ public void stateChanged(final ChangeEvent pE) {
+ firePropertyChangeEvent();
+ }
+ });
+ isDoubleProperty = false;
+ }
+
+ public NumberProperty(final String name, final double min, final double max, final double step) {
+ super(name);
+ spinner = new JSpinner(new SpinnerNumberModel(min, min, max, step));
+ spinner.addChangeListener(new ChangeListener() {
+ public void stateChanged(final ChangeEvent pE) {
+ firePropertyChangeEvent();
+ }
+ });
+ isDoubleProperty = true;
+ }
+
+ @Override
+ public String getValue() {
+ return spinner.getValue().toString();
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, spinner);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ spinner.setEnabled(pEnabled);
+ }
+
+ @Override
+ public void setValue(final String value) {
+ Number someValue;
+ if (isDoubleProperty)
+ {
+ try {
+ someValue = Double.parseDouble(value);
+ }
+ catch (final NumberFormatException e) {
+ someValue = 1.0;
+ }
+ }
+ else
+ {
+ try {
+ someValue = Integer.parseInt(value);
+ }
+ catch (final NumberFormatException e) {
+ someValue = 100;
+ }
+ }
+ spinner.setValue(someValue);
+ }
+
+ public Number getNumberValue() {
+ return (Number)spinner.getValue();
+ }
+
+ public void setValue(double value) {
+ spinner.setValue(value);
+ }
+
+ public void setValue(int value) {
+ spinner.setValue(value);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/OptionPanel.java b/freeplane/src/main/java/org/freeplane/core/resources/components/OptionPanel.java
new file mode 100644
index 0000000..6275b2b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/OptionPanel.java
@@ -0,0 +1,381 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2003 -2013 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.dnd.DropTarget;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Vector;
+
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.filechooser.FileNameExtensionFilter;
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import org.apache.commons.lang.StringUtils;
+import org.dpolivaev.mnemonicsetter.MnemonicSetter;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.IValidator.ValidationResult;
+import org.freeplane.core.ui.FileOpener;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+
+import com.jgoodies.forms.builder.ButtonBarBuilder;
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormLayout;
+
+public class OptionPanel {
+ private static final String FILE_EXTENSION = "freeplaneoptions";
+
+ public interface IOptionPanelFeedback {
+ void writeProperties(Properties props);
+ }
+
+ final static private String OPTION_PANEL_RESOURCE_PREFIX = "OptionPanel.";
+ static final String PREFERENCE_STORAGE_PROPERTY = "OptionPanel_Window_Properties";
+ private Vector<IPropertyControl> controls;
+ final private IOptionPanelFeedback feedback;
+ final private HashMap<String, Integer> tabStringToIndexMap = new HashMap<String, Integer>();
+ final private HashMap<Integer, String> tabIndexToStringMap = new HashMap<Integer, String>();
+ private String selectedPanel;
+ final private JDialog topDialog;
+ private JFileChooser fileChooser;
+
+ /**
+ * @throws IOException
+ */
+ public OptionPanel(final JDialog d, final IOptionPanelFeedback feedback) {
+ super();
+ topDialog = d;
+ this.feedback = feedback;
+ new OptionPanelBuilder();
+ }
+
+ /**
+ * Builds and returns a right aligned button bar with the given buttons.
+ *
+ * @param buttons an array of buttons to add
+ * @return a right aligned button bar with the given buttons
+ */
+ public static JPanel buildRightAlignedBar(JButton... buttons) {
+// ButtonBarBuilder2 builder = new ButtonBarBuilder2();
+ ButtonBarBuilder builder = new ButtonBarBuilder();
+ builder.addGlue();
+ builder.addButton(buttons);
+ return builder.getPanel();
+ }
+
+
+ /**
+ * This method builds the preferences panel.
+ * A list of IPropertyControl is iterated through and
+ * if the IPropertyControl is an instance of TabProperty,
+ * it creates a new "tab" that can be clicked to reveal the appropriate panel.
+ * If the previous selected tab was saved on close,
+ * the appropriate tab is reopened.
+ *
+ * @param controlsTree This is the data that needs to be built
+ */
+ public void buildPanel(final DefaultMutableTreeNode controlsTree) {
+ final JPanel centralPanel = new JPanel();
+ centralPanel.setLayout(new GridLayout(1, 1));
+ final JTabbedPane tabbedPane = new JTabbedPane();
+ tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
+ FormLayout bottomLayout = null;
+ DefaultFormBuilder bottomBuilder = null;
+ initControls(controlsTree);
+ final Iterator<IPropertyControl> iterator = controls.iterator();
+ int tabIndex = 0;
+ while (iterator.hasNext()) {
+ final IPropertyControl control = iterator.next();
+ if (control instanceof TabProperty) {
+ final TabProperty newTab = (TabProperty) control;
+ bottomLayout = new FormLayout(newTab.getName(), "");
+ bottomBuilder = new DefaultFormBuilder(bottomLayout);
+ bottomBuilder.setDefaultDialogBorder();
+ final JScrollPane bottomComponent = new JScrollPane(bottomBuilder.getPanel());
+ UITools.setScrollbarIncrement(bottomComponent);
+ final String tabName = TextUtils.getOptionalText(newTab.getLabel());
+ tabStringToIndexMap.put(tabName, tabIndex);
+ tabIndexToStringMap.put(tabIndex, tabName);
+ tabbedPane.addTab(tabName, bottomComponent);
+ tabIndex++;
+ }
+ else {
+ control.layout(bottomBuilder);
+ }
+ }
+ tabbedPane.addChangeListener(new ChangeListener() {
+ public void stateChanged(final ChangeEvent event) {
+ final JTabbedPane c = (JTabbedPane) event.getSource();
+ selectedPanel = tabIndexToStringMap.get(c.getSelectedIndex());
+ }
+ });
+ centralPanel.add(tabbedPane);
+ if (selectedPanel != null && tabStringToIndexMap.containsKey(selectedPanel)) {
+ // Without the containsKey call the loading of the tab "behaviour"/"behavior" gives a nullpointer exception
+ tabbedPane.setSelectedIndex(tabStringToIndexMap.get(selectedPanel));
+ }
+ topDialog.getContentPane().add(centralPanel, BorderLayout.CENTER);
+ final FileOpener fileOpener = new FileOpener(FILE_EXTENSION, new FileOpener.Listener() {
+
+ @Override
+ public void filesDropped(Collection<URL> urls) throws Exception {
+ for(URL url :urls) {
+ try (final InputStream inputStream = url.openStream()){
+ loadOptions(inputStream);
+ }
+ }
+
+ }
+ });
+
+ new DropTarget(centralPanel, fileOpener);
+
+ final JButton saveButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(saveButton, TextUtils.getRawText("save"));
+ saveButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent arg0) {
+ saveOptionsToFile();
+ }
+ });
+
+ final JButton loadButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(loadButton, TextUtils.getRawText("load"));
+ loadButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent arg0) {
+ loadOptionsFromFile();
+ }
+
+ });
+
+ final JButton cancelButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(cancelButton, TextUtils.getRawText("cancel"));
+ cancelButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent arg0) {
+ closeWindow();
+ }
+ });
+ final JButton okButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(okButton, TextUtils.getRawText("ok"));
+ okButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent arg0) {
+ if (validate()) {
+ closeWindow();
+ feedback.writeProperties(getOptionProperties());
+ }
+ }
+ });
+ topDialog.getRootPane().setDefaultButton(okButton);
+ JButton[] buttons = { saveButton, loadButton, cancelButton, okButton };
+ final JPanel buttonPanel = buildRightAlignedBar(buttons);
+ MnemonicSetter.INSTANCE.setComponentMnemonics(buttonPanel);
+ topDialog.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
+ }
+
+ private void saveOptionsToFile() {
+ final Properties properties = getOptionProperties();
+ if(! validate(properties))
+ return;
+ JFileChooser fileChooser = getFileChooser();
+ final int status = fileChooser.showSaveDialog(topDialog);
+ if(status != JFileChooser.APPROVE_OPTION)
+ return;
+ final File outputFile = getOutputFile(fileChooser);
+ try (final BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(outputFile))){
+ properties.store(output, "");
+ } catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+
+ private File getOutputFile(JFileChooser fileChooser) {
+ File outputFile = fileChooser.getSelectedFile();
+ if(outputFile.getName().contains("."))
+ return outputFile;
+ else
+ return new File(outputFile.getPath() + '.' + FILE_EXTENSION);
+ }
+
+ private JFileChooser getFileChooser() {
+ if(fileChooser == null)
+ fileChooser = createFileChooser();
+ return fileChooser;
+ }
+
+ private JFileChooser createFileChooser() {
+ final JFileChooser fileChooser = new JFileChooser(new File(Compat.getApplicationUserDirectory()));
+ fileChooser.setMultiSelectionEnabled(false);
+ fileChooser.setAcceptAllFileFilterUsed(false);
+ final FileNameExtensionFilter filter = new FileNameExtensionFilter(FILE_EXTENSION, FILE_EXTENSION);
+ fileChooser.setFileFilter(filter);
+ return fileChooser;
+ }
+
+ private void loadOptionsFromFile() {
+ JFileChooser fileChooser = getFileChooser();
+ final int status = fileChooser.showOpenDialog(topDialog);
+ if(status != JFileChooser.APPROVE_OPTION)
+ return;
+ final File inputFile = fileChooser.getSelectedFile();
+ if(! inputFile.canRead())
+ return;
+ try {
+ final BufferedInputStream inStream = new BufferedInputStream(new FileInputStream(inputFile));
+ loadOptions(inStream);
+ } catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+
+ private void loadOptions(final InputStream inputStream) throws IOException {
+ final Properties properties = new Properties();
+ properties.load(inputStream);
+ for (final IPropertyControl control : controls) {
+ if (control instanceof PropertyBean) {
+ final PropertyBean bean = (PropertyBean) control;
+ final String name = bean.getName();
+ final String value = properties.getProperty(name);
+ if(value != null)
+ bean.setValue(value);
+ }
+ }
+ }
+ private boolean validate() {
+ final Properties properties = getOptionProperties();
+ return validate(properties);
+ }
+
+ private boolean validate(final Properties properties) {
+ final ValidationResult result = new ValidationResult();
+ for (final IValidator validator : Controller.getCurrentController().getOptionValidators()) {
+ result.add(validator.validate(properties));
+ }
+ if (!result.isValid()) {
+ UITools.errorMessage(formatErrors("OptionPanel.validation_error", result.getErrors()));
+ LogUtils.severe(result.toString());
+ }
+ else if (result.hasWarnings()) {
+ UITools.informationMessage(formatErrors("OptionPanel.validation_warning", result.getWarnings()));
+ LogUtils.warn(result.toString());
+ }
+ return result.isValid();
+ }
+
+ private String formatErrors(final String key, final ArrayList<String> errors) {
+ // TextUtils.format() xml escapes the format arguments - we don't want that
+ final MessageFormat formatter = new MessageFormat(TextUtils.getText(key));
+ return formatter.format(new Object[] { StringUtils.join(errors.iterator(), "<br>") });
+ }
+
+ /**
+ * This is where the controls are added to the "controls" IProperty Vector
+ * @param controlsTree This is the tree that gets built
+ */
+ private void initControls(final DefaultMutableTreeNode controlsTree) {
+ controls = new Vector<IPropertyControl>();
+ addChildControls(null, controlsTree);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void addChildControls(BooleanProperty parentControl, final DefaultMutableTreeNode controlsTree) {
+ for (final Enumeration<DefaultMutableTreeNode> i = controlsTree.children(); i.hasMoreElements();) {
+ final DefaultMutableTreeNode node = i.nextElement();
+ final IPropertyControlCreator creator = (IPropertyControlCreator) node.getUserObject();
+ if (creator != null) {
+ final IPropertyControl control = creator.createControl();
+ controls.add(control);
+ if (parentControl != null)
+ parentControl.enables(control);
+ addChildControls(asBooleanProperty(control), node);
+ }
+ else
+ addChildControls(parentControl, node);
+ }
+ }
+
+ private BooleanProperty asBooleanProperty(final IPropertyControl control) {
+ return (control instanceof BooleanProperty) ? (BooleanProperty) control : null;
+ }
+
+ public void closeWindow() {
+ final OptionPanelWindowConfigurationStorage storage = new OptionPanelWindowConfigurationStorage();
+ storage.setPanel(OPTION_PANEL_RESOURCE_PREFIX + selectedPanel);
+ storage.storeDialogPositions(topDialog, OptionPanel.PREFERENCE_STORAGE_PROPERTY);
+ topDialog.setVisible(false);
+ topDialog.dispose();
+ }
+
+ private Properties getOptionProperties() {
+ final Properties p = new Properties();
+ for (final IPropertyControl control : controls) {
+ if (control instanceof PropertyBean) {
+ final PropertyBean bean = (PropertyBean) control;
+ final String value = bean.getValue();
+ if (value != null) {
+ p.setProperty(bean.getName(), value);
+ }
+ }
+ }
+ return p;
+ }
+
+ public void setProperties() {
+ for (final IPropertyControl control : controls) {
+ if (control instanceof PropertyBean) {
+ final PropertyBean bean = (PropertyBean) control;
+ final String name = bean.getName();
+ final String value = ResourceController.getResourceController().getProperty(name);
+ bean.setValue(value);
+ }
+ }
+ }
+
+ void setSelectedPanel(final String panel) {
+ if (panel.startsWith(OPTION_PANEL_RESOURCE_PREFIX)) {
+ selectedPanel = panel.substring(OPTION_PANEL_RESOURCE_PREFIX.length());
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/OptionPanelBuilder.java b/freeplane/src/main/java/org/freeplane/core/resources/components/OptionPanelBuilder.java
new file mode 100644
index 0000000..b3b89c0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/OptionPanelBuilder.java
@@ -0,0 +1,655 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.net.URL;
+import java.text.Collator;
+import java.util.Arrays;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.Vector;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.xml.TreeXmlReader;
+import org.freeplane.core.resources.ResourceBundles;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.IndexedTree;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.ui.TimePeriodUnits;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.n3.nanoxml.XMLException;
+
+/**
+ * @author Dimitry Polivaev
+ * 26.12.2008
+ * <p>
+ * Note that the OptionPanelBuilder allows to set a custom validator for options,
+ * see {@link #addValidator(IValidator)}.
+ */
+public class OptionPanelBuilder {
+ private class BooleanOptionCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ return createBooleanOptionCreator(name);
+ }
+ }
+
+ private class ColorOptionCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ return createColorOptionCreator(name);
+ }
+ }
+
+ private class ComboOptionCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final int childrenCount = data.getChildrenCount();
+ final Vector<String> choices = new Vector<String>(childrenCount);
+ final Vector<String> translations = new Vector<String>(childrenCount);
+ for (int i = 0; i < childrenCount; i++) {
+ final XMLElement element = data.getChildAtIndex(i);
+ final String choice = element.getAttribute("value", null);
+ choices.add(choice);
+ final String translationKey = element.getAttribute("text", "OptionPanel." + choice);
+ final String translation = TextUtils.getOptionalText(translationKey);
+ translations.add(translation);
+ }
+ return createComboProperty(name, choices, translations);
+ }
+ }
+
+ private class LanguagesComboCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final Set<String> locales = findAvailableLocales();
+ locales.add(ResourceBundles.LANGUAGE_AUTOMATIC);
+ final Vector<String> choices = new Vector<String>(locales.size());
+ final Vector<String> translations = new Vector<String>(locales.size());
+ // sort according to current locale
+ final TreeMap<String, String> inverseMap = new TreeMap<String, String>(Collator.getInstance());
+ for (String locale : locales) {
+ final String translation = TextUtils.getOptionalText("OptionPanel." + locale);
+ choices.add(locale);
+ translations.add(translation);
+ if (inverseMap.containsKey(translation)) {
+ LogUtils.severe("translation " + translation + " is used for more that one locale, for "
+ + inverseMap.get(translation) + " and for " + locale + ".");
+ }
+ inverseMap.put(translation, locale);
+ }
+ if (inverseMap.size() == choices.size()) {
+ // fix #630: Language not sorted alphabetically
+ choices.clear();
+ translations.clear();
+ for (Entry<String, String> entry : inverseMap.entrySet()) {
+ choices.add(entry.getValue());
+ translations.add(entry.getKey());
+ }
+ }
+ return createComboProperty(name, choices, translations);
+ }
+
+ private Set<String> findAvailableLocales() {
+ final TreeSet<String> locales = new TreeSet<String>();
+ LogUtils.info("available locales not found");
+ // as this happens when Freeplane is started from Eclipse add some locales for developer's sake
+ locales.addAll(Arrays.asList(ResourceController.getResourceController().getProperty("locales") .split(",")));
+ return locales;
+ }
+ }
+
+ private class EmptyCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ return null;
+ }
+ }
+
+ private class FontOptionCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ return createFontOptionCreator(name);
+ }
+ }
+
+ private class KeyOptionCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ return createKeyOptionCreator(name);
+ }
+ }
+
+ private class NumberOptionCreator extends PropertyCreator {
+ private IPropertyControlCreator createNumberPropertyCreator(final String name, final int min, final int step,
+ final int max) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new NumberProperty(name, min, max, step);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createNumberPropertyCreator(
+ final String name, final double min, final double step, final double max) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new NumberProperty(name, min, max, step);
+ }
+ };
+ }
+
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final String minString = data.getAttribute("min", "1");
+ final String maxString = data.getAttribute("max", MAX_INT);
+ final String stepString = data.getAttribute("step", "1");
+ if (minString.contains(".") || maxString.contains(".") || stepString.contains("."))
+ {
+ return createNumberPropertyCreator(name,
+ Double.parseDouble(minString),
+ Double.parseDouble(stepString),
+ Double.parseDouble(maxString));
+ }
+ else
+ {
+ return createNumberPropertyCreator(name,
+ Integer.parseInt(minString),
+ Integer.parseInt(stepString),
+ Integer.parseInt(maxString));
+ }
+ }
+ }
+
+ private class LengthOptionCreator extends PropertyCreator {
+ private IPropertyControlCreator createNumberPropertyCreator(
+ final String name, final String defaultUnit, final double min, final double step, final double max) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new QuantityProperty<LengthUnits>(name, min, max, step, LengthUnits.valueOf(defaultUnit));
+ }
+ };
+ }
+
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final String minString = data.getAttribute("min", "0");
+ final String maxString = data.getAttribute("max", "100000");
+ final String stepString = data.getAttribute("step", "0.1");
+ final String defaultUnit = data.getAttribute("defaultUnit", "px");
+ return createNumberPropertyCreator(name,
+ defaultUnit,
+ Double.parseDouble(minString),
+ Double.parseDouble(stepString),
+ Double.parseDouble(maxString));
+ }
+ }
+
+ private class TimePeriodOptionCreator extends PropertyCreator {
+ private IPropertyControlCreator createNumberPropertyCreator(
+ final String name, final String defaultUnit, final double min, final double step, final double max) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new QuantityProperty<TimePeriodUnits>(name, min, max, step, TimePeriodUnits.valueOf(defaultUnit));
+ }
+ };
+ }
+
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final String minString = data.getAttribute("min", "0");
+ final String maxString = data.getAttribute("max", "100000");
+ final String stepString = data.getAttribute("step", "1");
+ final String defaultUnit = data.getAttribute("defaultUnit", "ms");
+ return createNumberPropertyCreator(name,
+ defaultUnit,
+ Double.parseDouble(minString),
+ Double.parseDouble(stepString),
+ Double.parseDouble(maxString));
+ }
+ }
+ private class PathOptionCreator extends PropertyCreator {
+ private IPropertyControlCreator createPathPropertyCreator(final String name, final boolean isDir,
+ final String[] suffixes) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new PathProperty(name, isDir, suffixes);
+ }
+ };
+ }
+
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final boolean isDir = Boolean.parseBoolean(data.getAttribute("dir", "false"));
+ final String[] suffixes = parseCSV(data.getAttribute("suffixes", ""));
+ return createPathPropertyCreator(name, isDir, suffixes);
+ }
+
+ // Parses CSV, strips whitespace, returns null if empty
+ private String[] parseCSV(String csv) {
+ if (csv == null)
+ return null;
+ final String[] result = csv.trim().split("\\s*,\\s*");
+ return result.length > 0 ? result : null;
+ }
+ }
+
+ private static class Path {
+ static Path emptyPath() {
+ final Path Path = new Path(null);
+ Path.path = null;
+ return Path;
+ }
+
+ String parentPath;
+ String path;
+
+ Path(final String path) {
+ parentPath = path;
+ }
+
+ void setName(final String name) {
+ path = parentPath == null ? name : parentPath + '/' + name;
+ }
+
+ @Override
+ public String toString() {
+ return path;
+ }
+ };
+
+ protected abstract class PropertyCreator implements IElementDOMHandler {
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (attributes == null) {
+ return null;
+ }
+ final String name = attributes.getAttribute("name", null);
+ if (name == null) {
+ return parent == null ? Path.emptyPath() : parent;
+ }
+ final Path path = new Path(parent == null ? null : parent.toString());
+ path.setName(name);
+ if (!tree.contains(path.path)) {
+ tree
+ .addElement(path.parentPath == null ? tree : path.parentPath, this, path.path, IndexedTree.AS_CHILD);
+ }
+ return path;
+ }
+
+ public void endElement(final Object parent, final String tag, final Object userObject,
+ final XMLElement lastBuiltElement) {
+ final String name = lastBuiltElement.getAttribute("name", null);
+ final Path path = (Path) userObject;
+ if (path.path == null) {
+ return;
+ }
+ final DefaultMutableTreeNode treeNode = tree.get(path.path);
+ if (treeNode.getUserObject() == this) {
+ final IPropertyControlCreator creator = getCreator(name, lastBuiltElement);
+ final String text = lastBuiltElement.getAttribute("text", null);
+ if(text == null){
+ treeNode.setUserObject(creator);
+ }
+ else{
+ treeNode.setUserObject(new IPropertyControlCreator(){
+ public IPropertyControl createControl() {
+ final IPropertyControl control = creator.createControl();
+ if( control instanceof PropertyAdapter){
+ final PropertyAdapter control2 = (PropertyAdapter) control;
+ control2.setLabel(text);
+ }
+ return control;
+ }});
+ }
+
+ }
+ }
+
+ abstract public IPropertyControlCreator getCreator(String name, XMLElement data);
+ }
+
+ private class RemindValueCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ return createRemindValueProperty(name);
+ }
+ }
+
+ private class SeparatorCreator extends PropertyCreator {
+ @Override
+ public void endElement(final Object parent, final String tag, final Object userObject,
+ final XMLElement lastBuiltElement) {
+ final Path path = (Path) userObject;
+ final DefaultMutableTreeNode treeNode = tree.get(path.path);
+ if (treeNode.getUserObject() != this) {
+ return;
+ }
+ super.endElement(parent, tag, userObject, lastBuiltElement);
+ tree.addElement(path.parentPath == null ? tree : path.parentPath, nextLineCreator, IndexedTree.AS_CHILD);
+ return;
+ }
+
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final String label = "OptionPanel.separator." + name;
+ return createSeparatorCreator(label);
+ }
+ }
+
+ private class StringOptionCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ return createStringOptionCreator(name);
+ }
+ }
+
+ private class TextBoxOptionCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final int lines = data.getAttribute("lines", 2);
+ return createTextBoxOptionCreator(name, lines);
+ }
+ }
+
+ private class TabCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final String label = "OptionPanel." + name;
+ final String layout = data.getAttribute("layout", null);
+ return createTabCreator(label, layout);
+ }
+ }
+
+ private class TextCreator extends PropertyCreator {
+ @Override
+ public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
+ final String label = "OptionPanel.text." + name;
+ return createTextCreator(label);
+ }
+ }
+
+ private static final String MAX_INT = Integer.toString(Integer.MAX_VALUE);
+ final private IPropertyControlCreator nextLineCreator;
+ final private ReadManager readManager;
+ final private IndexedTree tree;
+
+ public OptionPanelBuilder() {
+ readManager = new ReadManager();
+ tree = new IndexedTree(null);
+ nextLineCreator = new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new NextLineProperty();
+ }
+ };
+ initReadManager();
+ }
+
+ public void addBooleanProperty(final String path, final String name, final int position) {
+ addCreator(path, createBooleanOptionCreator(name), name, position);
+ }
+
+ public void addColorProperty(final String path, final String name, final int position) {
+ addCreator(path, createColorOptionCreator(name), name, position);
+ }
+
+ public void addComboProperty(final String path, final String name, final Vector<String> choices,
+ final Vector<String> translations, final int position) {
+ final IPropertyControlCreator creator = createComboProperty(name, choices, translations);
+ addCreator(path, creator, name, position);
+ }
+
+ public void addEditableComboProperty(final String path, final String name, final Vector<String> choices,
+ final Vector<String> translations, final int position) {
+ final IPropertyControlCreator creator = createEditableComboProperty(name, choices, translations);
+ addCreator(path, creator, name, position);
+ }
+ public void addCreator(final String path, final IPropertyControlCreator creator, final int position) {
+ tree.addElement(path, creator, position);
+ }
+
+ public void addCreator(final String path, final IPropertyControlCreator creator, final String name,
+ final int position) {
+ tree.addElement(path, creator, path + "/" + name, position);
+ }
+
+ public void addFontProperty(final String path, final String name, final int position) {
+ addCreator(path, createFontOptionCreator(name), name, position);
+ }
+
+ public void addKeyProperty(final String path, final String name, final int position) {
+ addCreator(path, createKeyOptionCreator(name), name, position);
+ }
+
+ public void addNumberProperty(final String path, final String name, final int min, final int max, final int step,
+ final int position) {
+ addCreator(path, createNumberOptionCreator(name, min, max, step), name, position);
+ }
+
+ public void addRemindValueProperty(final String path, final String name, final int position) {
+ addCreator(path, createRemindValueProperty(name), name, position);
+ }
+
+ public void addSeparator(final String path, final String name, final int position) {
+ addCreator(path, createSeparatorCreator(name), name, position);
+ }
+
+ public void addSpace(final String path, final int position) {
+ tree.addElement(path, nextLineCreator, position);
+ }
+
+ public void addStringProperty(final String path, final String name, final int position) {
+ addCreator(path, createStringOptionCreator(name), name, position);
+ }
+
+ public void addTab(final String name) {
+ addTab(name, null, IndexedTree.AS_CHILD);
+ }
+
+ public void addTab(final String name, final String layout, final int position) {
+ tree.addElement(tree, createTabCreator(name, layout), name, position);
+ }
+
+ public void addText(final String path, final String name, final int position) {
+ addCreator(path, createTextCreator(name), name, position);
+ }
+
+ private IPropertyControlCreator createBooleanOptionCreator(final String name) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new BooleanProperty(name);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createColorOptionCreator(final String name) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new ColorProperty(name, ResourceController.getResourceController().getDefaultProperty(name));
+ }
+ };
+ }
+
+ private IPropertyControlCreator createComboProperty(final String name, final Vector<String> choices,
+ final Vector<String> translations) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new ComboProperty(name, choices, translations);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createEditableComboProperty(final String name, final Vector<String> choices,
+ final Vector<String> translations) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ final ComboProperty comboProperty = new ComboProperty(name, choices, translations);
+ comboProperty.setEditable(true);
+ return comboProperty;
+ }
+ };
+ }
+
+ private IPropertyControlCreator createFontOptionCreator(final String name) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new FontProperty(name);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createKeyOptionCreator(final String name) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new KeyProperty(name);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createNumberOptionCreator(final String name, final int min, final int max, final int step) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new NumberProperty(name, min, max, step);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createRemindValueProperty(final String name) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new RemindValueProperty(name);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createSeparatorCreator(final String label) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new SeparatorProperty(label);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createStringOptionCreator(final String name) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new StringProperty(name);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createTextBoxOptionCreator(final String name, final int lines) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new TextBoxProperty(name, lines);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createTabCreator(final String label, final String layout) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ if (layout != null) {
+ return new TabProperty(label, layout);
+ }
+ return new TabProperty(label);
+ }
+ };
+ }
+
+ private IPropertyControlCreator createTextCreator(final String label) {
+ return new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ return new Text(label);
+ }
+ };
+ }
+
+ ReadManager getReadManager() {
+ return readManager;
+ }
+
+ public DefaultMutableTreeNode getRoot() {
+ return getTree().getRoot();
+ }
+
+ IndexedTree getTree() {
+ return tree;
+ }
+
+ private void initReadManager() {
+ readManager.addElementHandler("preferences_structure", new EmptyCreator());
+ readManager.addElementHandler("tabbed_pane", new EmptyCreator());
+ readManager.addElementHandler("group", new EmptyCreator());
+ readManager.addElementHandler("tab", new TabCreator());
+ readManager.addElementHandler("separator", new SeparatorCreator());
+ readManager.addElementHandler("text", new TextCreator());
+ readManager.addElementHandler("string", new StringOptionCreator());
+ readManager.addElementHandler("textbox", new TextBoxOptionCreator());
+ readManager.addElementHandler("font", new FontOptionCreator());
+ readManager.addElementHandler("boolean", new BooleanOptionCreator());
+ readManager.addElementHandler("number", new NumberOptionCreator());
+ readManager.addElementHandler("length", new LengthOptionCreator());
+ readManager.addElementHandler("time_period", new TimePeriodOptionCreator());
+ readManager.addElementHandler("path", new PathOptionCreator());
+ readManager.addElementHandler("color", new ColorOptionCreator());
+ readManager.addElementHandler("combo", new ComboOptionCreator());
+ readManager.addElementHandler("languages", new LanguagesComboCreator());
+ readManager.addElementHandler("key", new KeyOptionCreator());
+ readManager.addElementHandler("remind_value", new RemindValueCreator());
+ }
+
+ public void load(final URL menu) {
+ InputStreamReader reader = null;
+ try {
+ reader = new InputStreamReader(new BufferedInputStream(menu.openStream()));
+ load(reader);
+ }
+ catch (final IOException e) {
+ throw new RuntimeException(e);
+ }
+ finally {
+ FileUtils.silentlyClose(reader);
+ }
+ }
+
+ public void load(final Reader inputStreamReader) {
+ final TreeXmlReader treeXmlReader = new TreeXmlReader(readManager);
+ try {
+ treeXmlReader.load(inputStreamReader);
+ }
+ catch (final XMLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/OptionPanelWindowConfigurationStorage.java b/freeplane/src/main/java/org/freeplane/core/resources/components/OptionPanelWindowConfigurationStorage.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/resources/components/OptionPanelWindowConfigurationStorage.java
rename to freeplane/src/main/java/org/freeplane/core/resources/components/OptionPanelWindowConfigurationStorage.java
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/PathProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/PathProperty.java
new file mode 100644
index 0000000..97f8af4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/PathProperty.java
@@ -0,0 +1,168 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.io.File;
+import java.util.Arrays;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.JTextField;
+import javax.swing.border.EmptyBorder;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.TextUtils;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+/**
+ * A PathProperty has an absolute path as a model. It's visual representation
+ * is a text field containing the path and a 'browse' button.
+ * It's configuration has (non-mandatory) options:
+ * - dir [true|false]: if the configured path is a directory
+ * - suffixes: a comma-separated string containing allowed suffixes (without the dot)
+ */
+public class PathProperty extends PropertyBean implements IPropertyControl {
+ private class SelectFileAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ final Object source = e.getSource();
+ if (source == selectButton) {
+ final JFileChooser chooser = createFileChooser();
+ int result = chooser.showOpenDialog(chooser);
+ if (result == JFileChooser.APPROVE_OPTION)
+ setValue(chooser.getSelectedFile().getAbsolutePath());
+ }
+ }
+ }
+
+ final private boolean isDir;
+ final private String[] suffixes;
+ private String path;
+ private JTextField filenameField;
+ private JButton selectButton;
+
+ public PathProperty(final String name, final boolean isDir, final String[] suffixes) {
+ super(name);
+ this.isDir = isDir;
+ this.suffixes = suffixes;
+ }
+
+ private JFileChooser createFileChooser() {
+ final JFileChooser fileChooser = new JFileChooser();
+ if (path != null) {
+ fileChooser.setSelectedFile(new File(path));
+ }
+ FileFilter filter = null;
+ if (isDir) {
+ fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+ }
+ else if (suffixes != null) {
+ filter = new FileFilter() {
+ @Override
+ public String getDescription() {
+ return Arrays.asList(suffixes).toString();
+ }
+
+ @Override
+ public boolean accept(File f) {
+ String extension = FileUtils.getExtension(f);
+ for (String suffix : suffixes) {
+ if (suffix.equalsIgnoreCase(extension))
+ return true;
+ }
+ return false;
+ }
+ };
+ }
+ fileChooser.setFileFilter(filter);
+ fileChooser.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent pE) {
+ firePropertyChangeEvent();
+ }
+ });
+ return fileChooser;
+ }
+
+ @Override
+ public String getValue() {
+ return path;
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ final Box box = Box.createHorizontalBox();
+ box.setBorder(new EmptyBorder(5, 0, 5, 0));
+ filenameField = new JTextField();
+ filenameField.setText(path);
+ filenameField.addFocusListener(new FocusListener() {
+ public void focusLost(FocusEvent e) {
+ final String text = filenameField.getText();
+ if (text == null || text.length() == 0) {
+ filenameField.setText(path);
+ JOptionPane.showConfirmDialog(e.getComponent(), TextUtils.getText("OptionPanel.path_property_may_not_be_empty"), "", JOptionPane.WARNING_MESSAGE);
+ }
+ else {
+ path = text;
+ }
+ }
+ public void focusGained(FocusEvent e) {
+ }
+ });
+ box.add(filenameField);
+ box.add(Box.createHorizontalStrut(3));
+ selectButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(selectButton, TextUtils.getText("browse"));
+ selectButton.addActionListener(new SelectFileAction());
+ selectButton.setMaximumSize(new Dimension(1000, 1000));
+ box.add(selectButton);
+ layout(builder, box);
+ }
+
+ public void setEnabled(final boolean enabled) {
+ if (selectButton != null)
+ selectButton.setEnabled(enabled);
+ if (filenameField != null)
+ filenameField.setEnabled(enabled);
+ }
+
+ @Override
+ public void setValue(String value) {
+ if (value != null) {
+ value = value.replace("{freeplaneuserdir}", ResourceController.getResourceController()
+ .getFreeplaneUserDirectory());
+ value = value.replace("{user.home}", System.getProperty("user.home"));
+ this.path = value;
+ }
+ else {
+ this.path = null;
+ }
+ if (filenameField != null)
+ filenameField.setText(path);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/PropertyAction.java b/freeplane/src/main/java/org/freeplane/core/resources/components/PropertyAction.java
new file mode 100644
index 0000000..50c2e8e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/PropertyAction.java
@@ -0,0 +1,138 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.Frame;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.Properties;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+import javax.swing.WindowConstants;
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.OptionPanel.IOptionPanelFeedback;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+
+/**
+ * @author foltin
+ */
+public class PropertyAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final DefaultMutableTreeNode controls;
+
+ /**
+ * @param controls
+ *
+ */
+ public PropertyAction( final DefaultMutableTreeNode controls) {
+ super("PropertyAction");
+ this.controls = controls;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ JDialog dialog = null;
+ if(e != null){
+ final Object source = e.getSource();
+ if(source instanceof Component){
+ final Window window = SwingUtilities.getWindowAncestor((Component) source);
+ if(window instanceof Dialog){
+ dialog= new JDialog((Dialog)window, true /* modal */);
+ }
+ else if(window instanceof Frame){
+ dialog= new JDialog((Frame)window, true /* modal */);
+ }
+ }
+ }
+ if(dialog == null){
+ dialog= new JDialog((Frame) UITools.getMenuComponent(), true /* modal */);
+ }
+ dialog.setResizable(true);
+ dialog.setUndecorated(false);
+ final OptionPanel options = new OptionPanel(dialog, new IOptionPanelFeedback() {
+ public void writeProperties(final Properties props) {
+ boolean propertiesChanged = false;
+ for (final Object keyObject : props.keySet()) {
+ final String key = keyObject.toString();
+ final String newProperty = props.getProperty(key);
+ propertiesChanged = propertiesChanged
+ || !newProperty.equals(ResourceController.getResourceController().getProperty(key));
+ ResourceController.getResourceController().setProperty(key, newProperty);
+ }
+ if (propertiesChanged) {
+ JOptionPane.showMessageDialog(UITools.getMenuComponent(), TextUtils
+ .getText("option_changes_may_require_restart"));
+ ResourceController.getResourceController().saveProperties();
+ }
+ }
+ });
+ final String marshalled = ResourceController.getResourceController().getProperty(
+ OptionPanel.PREFERENCE_STORAGE_PROPERTY);
+ final OptionPanelWindowConfigurationStorage storage = OptionPanelWindowConfigurationStorage.decorateDialog(
+ marshalled, dialog);
+ if (storage != null) {
+ options.setSelectedPanel(storage.getPanel());
+ }
+ options.buildPanel(controls);
+ options.setProperties();
+ final String title = TextUtils.getText("PropertyAction.dialog");
+ dialog.setTitle(title);
+ dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ dialog.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(final WindowEvent event) {
+ options.closeWindow();
+ }
+ });
+ final Action action = new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent arg0) {
+ options.closeWindow();
+ }
+ };
+ UITools.addEscapeActionToDialog(dialog, action);
+ if (storage == null) {
+ UITools.setBounds(dialog, -1, -1, dialog.getPreferredSize().width + 50, -1);
+ }
+ dialog.setVisible(true);
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/PropertyAdapter.java b/freeplane/src/main/java/org/freeplane/core/resources/components/PropertyAdapter.java
new file mode 100644
index 0000000..031c6f1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/PropertyAdapter.java
@@ -0,0 +1,77 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.TextUtils;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+/**
+ * @author Dimitry Polivaev
+ * 26.12.2008
+ */
+public class PropertyAdapter {
+ private String tooltip;
+ private String label;
+
+ private final String name;
+
+ public PropertyAdapter(final String name) {
+ this(name, "OptionPanel." + name, "OptionPanel." + name + ".tooltip");
+ if (ResourceController.getResourceController().getText(tooltip, null) == null) {
+ tooltip = null;
+ }
+ }
+
+ public PropertyAdapter(final String name, final String label, final String tooltip) {
+ super();
+ assert name != null;
+ this.name = name;
+ this.label = label;
+ this.tooltip = tooltip;
+ }
+
+ public String getTooltip() {
+ return tooltip;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ void setLabel(String label) {
+ this.label = label;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ protected void layout(DefaultFormBuilder builder, JComponent component){
+ final JLabel label = builder.append(TextUtils.getOptionalText(getLabel()), component);
+ String tooltip = TextUtils.getOptionalText(getTooltip());
+ label.setToolTipText(tooltip);
+ component.setToolTipText(tooltip);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/PropertyBean.java b/freeplane/src/main/java/org/freeplane/core/resources/components/PropertyBean.java
new file mode 100644
index 0000000..c421ca1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/PropertyBean.java
@@ -0,0 +1,60 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.List;
+import java.util.Vector;
+
+public abstract class PropertyBean extends PropertyAdapter implements IPropertyControl {
+
+ final private List<PropertyChangeListener> mPropertyChangeListeners = new Vector<PropertyChangeListener>();
+
+ public PropertyBean(final String name) {
+ super(name);
+ }
+
+ public PropertyBean(final String name, final String label, final String description) {
+ super(name, label, description);
+ }
+
+ public void addPropertyChangeListener(final PropertyChangeListener listener) {
+ mPropertyChangeListeners.add(listener);
+ }
+
+ protected void firePropertyChangeEvent() {
+ final PropertyChangeEvent evt = new PropertyChangeEvent(this, getName(), null, getValue());
+ for (final PropertyChangeListener l : mPropertyChangeListeners) {
+ l.propertyChange(evt);
+ }
+ }
+
+ public abstract String getValue();
+
+ public void removePropertyChangeListener(final PropertyChangeListener listener) {
+ mPropertyChangeListeners.remove(listener);
+ }
+
+ public abstract void setValue(String value);
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "(" + getName() + "->" + getValue() + ")";
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/QuantityProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/QuantityProperty.java
new file mode 100644
index 0000000..da94c0c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/QuantityProperty.java
@@ -0,0 +1,117 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.Box;
+import javax.swing.JComboBox;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.util.Convertible;
+import org.freeplane.core.util.Quantity;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class QuantityProperty<U extends Enum<U> & Convertible> extends PropertyBean implements IPropertyControl {
+ final private JSpinner numberSpinner;
+ @SuppressWarnings("rawtypes")
+ final private JComboBox unitBox;
+ final private U defaultUnit;
+ private U currentUnit;
+
+ public QuantityProperty(final String name, final double min, final double max, final double step, U defaultUnit) {
+ super(name);
+ this.defaultUnit = defaultUnit;
+ numberSpinner = new JSpinner(new SpinnerNumberModel(min, min, max, step));
+ TranslatedObject[] units = TranslatedObject.fromEnum(defaultUnit.getDeclaringClass());
+ unitBox = new JComboBoxWithBorder(units);
+ addChangeListeners();
+ }
+
+ private void addChangeListeners() {
+ numberSpinner.addChangeListener(new ChangeListener() {
+ public void stateChanged(final ChangeEvent pE) {
+ firePropertyChangeEvent();
+ }
+ });
+ unitBox.addItemListener(new ItemListener() {
+ @Override
+ public void itemStateChanged(ItemEvent e) {
+ if(e.getStateChange() == ItemEvent.SELECTED) {
+ final U newUnit = getCurrentUnit();
+ double value = (Double) numberSpinner.getValue();
+ final Quantity<U> newQuantity = new Quantity<U>(value, currentUnit).in(newUnit);
+ currentUnit = newUnit;
+ if(value != newQuantity.value)
+ numberSpinner.setValue(newQuantity.value);
+ else
+ firePropertyChangeEvent();
+ }
+ }
+ });
+ }
+
+ @Override
+ public String getValue() {
+ return getQuantifiedValue().toString();
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ Box box = Box.createHorizontalBox();
+ box.add(numberSpinner);
+ box.add(unitBox);
+ layout(builder, box);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ numberSpinner.setEnabled(pEnabled);
+ }
+
+ public void setQuantifiedValue(Quantity<U> quantity){
+ this.currentUnit = quantity.unit;
+ numberSpinner.setValue(quantity.value);
+ unitBox.setSelectedIndex(quantity.unit.ordinal());
+ }
+
+ public Quantity<U> getQuantifiedValue(){
+ double value = (Double) numberSpinner.getValue();
+ U unit = getCurrentUnit();
+ return new Quantity<U>(value, unit);
+ }
+
+ public U getCurrentUnit() {
+ return defaultUnit.getDeclaringClass().getEnumConstants()[unitBox.getSelectedIndex()];
+ }
+
+ @Override
+ public void setValue(final String value)
+ {
+ Quantity<U> quantity = Quantity.fromString(value, defaultUnit);
+ setQuantifiedValue(quantity);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/RemindValueProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/RemindValueProperty.java
new file mode 100644
index 0000000..1a785c3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/RemindValueProperty.java
@@ -0,0 +1,117 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+
+import org.freeplane.core.util.TextUtils;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+/** implementation of <remind> properties. */
+public class RemindValueProperty extends PropertyBean implements IPropertyControl {
+ public static final String DON_T_TOUCH_VALUE = "";
+ protected static final int DON_T_TOUCH_VALUE_INT = 2;
+ static public final String FALSE_VALUE = "false";
+ protected static final int FALSE_VALUE_INT = 1;
+ static public final String TRUE_VALUE = "true";
+ protected static final int TRUE_VALUE_INT = 0;
+ JButton mButton = new JButton();
+ int state = 0;
+
+ /**
+ */
+ public RemindValueProperty(final String name) {
+ super(name);
+ mButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ setState((getState() + 1) % 3);
+ firePropertyChangeEvent();
+ }
+ });
+ }
+
+ private int getState() {
+ return state;
+ }
+
+ @Override
+ public String getValue() {
+ switch (state) {
+ case TRUE_VALUE_INT:
+ return TRUE_VALUE;
+ case FALSE_VALUE_INT:
+ return FALSE_VALUE;
+ case DON_T_TOUCH_VALUE_INT:
+ return DON_T_TOUCH_VALUE;
+ }
+ return null;
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, mButton);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mButton.setEnabled(pEnabled);
+ }
+
+ /**
+ *
+ */
+ protected void setState(final int newState) {
+ state = newState;
+ String[] strings;
+ strings = new String[3];
+ strings[RemindValueProperty.TRUE_VALUE_INT] = TextUtils.getText("OptionalDontShowMeAgainDialog.ok")
+ .replaceFirst("&", "");
+ strings[RemindValueProperty.FALSE_VALUE_INT] = TextUtils.getText("OptionalDontShowMeAgainDialog.cancel")
+ .replaceFirst("&", "");
+ strings[RemindValueProperty.DON_T_TOUCH_VALUE_INT] = TextUtils.getText("OptionPanel.ask").replaceFirst("&",
+ "");
+ mButton.setText(strings[state]);
+ }
+
+ @Override
+ public void setValue(final String value) {
+ if (value == null
+ || !(value.toLowerCase().equals(TRUE_VALUE) || value.toLowerCase().equals(FALSE_VALUE) || value
+ .toLowerCase().equals(DON_T_TOUCH_VALUE))) {
+ throw new IllegalArgumentException("Cannot set a boolean to " + value);
+ }
+ setState(transformString(value));
+ }
+
+ private int transformString(final String string) {
+ if (string == null) {
+ return RemindValueProperty.DON_T_TOUCH_VALUE_INT;
+ }
+ if (string.toLowerCase().equals(TRUE_VALUE)) {
+ return RemindValueProperty.TRUE_VALUE_INT;
+ }
+ if (string.toLowerCase().equals(FALSE_VALUE)) {
+ return RemindValueProperty.FALSE_VALUE_INT;
+ }
+ return RemindValueProperty.DON_T_TOUCH_VALUE_INT;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/SeparatorProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/SeparatorProperty.java
new file mode 100644
index 0000000..ecce3a9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/SeparatorProperty.java
@@ -0,0 +1,52 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import org.freeplane.core.util.TextUtils;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class SeparatorProperty implements IPropertyControl {
+ private final String label;
+
+ public SeparatorProperty(final String label) {
+ super();
+ this.label = label;
+ }
+
+ public String getTooltip() {
+ return null;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getName() {
+ return null;
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ builder.appendSeparator(TextUtils.getOptionalText(getLabel()));
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/StringProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/StringProperty.java
new file mode 100644
index 0000000..f5e07f6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/StringProperty.java
@@ -0,0 +1,62 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JTextField;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class StringProperty extends PropertyBean implements IPropertyControl {
+ final JTextField mTextField;
+
+ /**
+ */
+ public StringProperty(final String name) {
+ super(name);
+ mTextField = new JTextField();
+ mTextField.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent pE) {
+ firePropertyChangeEvent();
+ }
+ });
+ }
+
+ @Override
+ public String getValue() {
+ return mTextField.getText();
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, mTextField);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mTextField.setEnabled(pEnabled);
+ }
+
+ @Override
+ public void setValue(final String value) {
+ mTextField.setText(value);
+ mTextField.selectAll();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/TabProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/TabProperty.java
new file mode 100644
index 0000000..a86a80e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/TabProperty.java
@@ -0,0 +1,60 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+/**
+ * @author Dimitry Polivaev
+ * 27.12.2008
+ */
+public class TabProperty implements IPropertyControl {
+ private static final String DEFAULT_LAYOUT_FORMAT = "right:max(40dlu;p), 4dlu, 200dlu:grow, 7dlu";
+ final private String label;
+ final private String layoutFormat;
+
+ public TabProperty(final String label) {
+ this(label, TabProperty.DEFAULT_LAYOUT_FORMAT);
+ }
+
+ public TabProperty(final String label, final String layoutFormat) {
+ super();
+ this.label = label;
+ this.layoutFormat = layoutFormat;
+ }
+
+ public String getTooltip() {
+ return null;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getName() {
+ return layoutFormat;
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/Text.java b/freeplane/src/main/java/org/freeplane/core/resources/components/Text.java
new file mode 100644
index 0000000..f6a28cc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/Text.java
@@ -0,0 +1,56 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import javax.swing.JLabel;
+
+import org.freeplane.core.util.TextUtils;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class Text implements IPropertyControl {
+ private final String label;
+
+ public Text(final String label) {
+ super();
+ this.label = label;
+ }
+
+ public String getTooltip() {
+ return null;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getName() {
+ return null;
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ builder.append(new JLabel(TextUtils.getOptionalText(getLabel())), builder.getColumnCount()
+ - builder.getColumn() + 1);
+ builder.nextLine();
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/resources/components/TextBoxProperty.java b/freeplane/src/main/java/org/freeplane/core/resources/components/TextBoxProperty.java
new file mode 100644
index 0000000..60bd27c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/resources/components/TextBoxProperty.java
@@ -0,0 +1,59 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Felix Natter in 2013.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.resources.components;
+
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+public class TextBoxProperty extends PropertyBean implements IPropertyControl {
+ final JTextArea mTextArea;
+
+ /**
+ */
+ public TextBoxProperty(final String name, final int lines) {
+ super(name);
+ mTextArea = new JTextArea(lines, 70);
+// mTextArea.setBorder(BorderFactory.createLineBorder(Color.black));
+ mTextArea.setLineWrap(true);
+ }
+
+ @Override
+ public String getValue() {
+ return mTextArea.getText();
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ JScrollPane scrollPane = new JScrollPane(mTextArea);
+ scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+ scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
+ layout(builder, scrollPane);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mTextArea.setEnabled(pEnabled);
+ }
+
+ @Override
+ public void setValue(final String value) {
+ mTextArea.setText(value);
+ mTextArea.selectAll();
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/resources/components/VariableSizeCardLayout.java b/freeplane/src/main/java/org/freeplane/core/resources/components/VariableSizeCardLayout.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/resources/components/VariableSizeCardLayout.java
rename to freeplane/src/main/java/org/freeplane/core/resources/components/VariableSizeCardLayout.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/AFreeplaneAction.java b/freeplane/src/main/java/org/freeplane/core/ui/AFreeplaneAction.java
new file mode 100644
index 0000000..d295fee
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/AFreeplaneAction.java
@@ -0,0 +1,192 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public abstract class AFreeplaneAction extends AbstractAction implements IFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public boolean checkEnabledOnChange() {
+ final EnabledAction annotation = getClass().getAnnotation(EnabledAction.class);
+ if (annotation == null) {
+ return false;
+ }
+ return annotation.checkOnNodeChange();
+ }
+
+ public boolean checkSelectionOnChange() {
+ final SelectableAction annotation = getClass().getAnnotation(SelectableAction.class);
+ if (annotation == null) {
+ return false;
+ }
+ return annotation.checkOnNodeChange();
+ }
+
+ public boolean checkSelectionOnPropertyChange() {
+ final SelectableAction annotation = getClass().getAnnotation(SelectableAction.class);
+ if (annotation == null) {
+ return false;
+ }
+ return !"".equals(annotation.checkOnPropertyChange());
+ }
+
+ public boolean checkSelectionOnPopup(){
+ final SelectableAction annotation = getClass().getAnnotation(SelectableAction.class);
+ if (annotation == null) {
+ return false;
+ }
+ return annotation.checkOnPopup();
+ }
+
+ final private String key;
+ private boolean selected = false;
+
+ static private Map<String, ImageIcon> iconCache = new HashMap<String, ImageIcon>();
+ final private String rawText;
+
+ public AFreeplaneAction(final String key) {
+ super();
+ this.key = key;
+ rawText = TextUtils.getRawText(getTextKey());
+ LabelAndMnemonicSetter.setLabelAndMnemonic(this, rawText);
+ final String iconKey = getIconKey();
+ final ImageIcon cachedIcon = iconCache.get(iconKey);
+ if(cachedIcon != null){
+ putValue(SMALL_ICON, cachedIcon);
+ }
+ else{
+ final String iconResource = ResourceController.getResourceController().getProperty(iconKey, null);
+ if (iconResource != null) {
+ final URL url = ResourceController.getResourceController().getResource(iconResource);
+ if (url == null) {
+ LogUtils.severe("can not load icon '" + iconResource + "'");
+ }
+ else {
+ final ImageIcon icon = new ImageIcon(url);
+ putValue(SMALL_ICON, icon);
+ iconCache.put(iconKey, icon);
+ }
+ }
+ }
+ final String tooltip = TextUtils.getRawText(getTooltipKey(), null);
+ if (tooltip != null && !"".equals(tooltip)) {
+ putValue(Action.SHORT_DESCRIPTION, tooltip);
+ putValue(Action.LONG_DESCRIPTION, tooltip);
+ }
+ // System.out.println(key);
+ }
+
+ // /**
+ // * @param controller
+ // * @param string
+ // */
+ // private AFreeplaneAction( final String titleKey) {
+ // this();
+ // }
+ //
+ public AFreeplaneAction(final String key, final String title, final Icon icon) {
+// this.controller = controller;
+ putValue(SMALL_ICON, icon);
+ if (title != null && !title.equals("")) {
+ LabelAndMnemonicSetter.setLabelAndMnemonic(this, title);
+ }
+ this.rawText = title;
+ this.key = key;
+ }
+
+ public void afterMapChange(final Object newMap) {
+ if (newMap == null) {
+ if (super.isEnabled()) {
+ setEnabled(false);
+ }
+ }
+ else {
+ if (!super.isEnabled()) {
+ setEnabled(true);
+ }
+ setEnabled();
+ }
+ }
+
+ public final String getIconKey() {
+ return key + ".icon";
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getTextKey() {
+ return key + ".text";
+ }
+
+ public final String getTooltipKey() {
+ return key + ".tooltip";
+ }
+
+ public boolean isSelected() {
+ return selected;
+ }
+
+ public void setEnabled() {
+ }
+
+ public void setSelected() {
+ }
+
+ public void setSelected(final boolean newValue) {
+ final boolean oldValue = selected;
+ if (oldValue != newValue) {
+ selected = newValue;
+ firePropertyChange(SelectableAction.SELECTION_PROPERTY, Boolean.valueOf(oldValue), Boolean
+ .valueOf(newValue));
+ }
+ }
+
+ public void setVisible() {
+ }
+
+ public boolean isSelectable() {
+ return getClass().getAnnotation(SelectableAction.class) != null;
+ }
+
+ public String getRawText() {
+ return rawText;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/AMouseListener.java b/freeplane/src/main/java/org/freeplane/core/ui/AMouseListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/AMouseListener.java
rename to freeplane/src/main/java/org/freeplane/core/ui/AMouseListener.java
diff --git a/freeplane/src/org/freeplane/core/ui/AMultipleNodeAction.java b/freeplane/src/main/java/org/freeplane/core/ui/AMultipleNodeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/AMultipleNodeAction.java
rename to freeplane/src/main/java/org/freeplane/core/ui/AMultipleNodeAction.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/AccelerateableAction.java b/freeplane/src/main/java/org/freeplane/core/ui/AccelerateableAction.java
new file mode 100644
index 0000000..73236cf
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/AccelerateableAction.java
@@ -0,0 +1,152 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.beans.PropertyChangeListener;
+
+import javax.swing.JDialog;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.components.IKeyBindingManager;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * 20.04.2009
+ */
+public class AccelerateableAction implements IFreeplaneAction {
+
+ final private AFreeplaneAction originalAction;
+ private static JDialog setAcceleratorOnNextClickActionDialog;
+ private static KeyStroke acceleratorForNextClickedAction;
+
+ public static boolean isNewAcceleratorOnNextClickEnabled() {
+ return setAcceleratorOnNextClickActionDialog != null;
+ }
+
+ private static final String SET_ACCELERATOR_ON_NEXT_CLICK_ACTION = "set_accelerator_on_next_click_action";
+
+ static void setNewAcceleratorOnNextClick(KeyStroke accelerator) {
+ if (AccelerateableAction.isNewAcceleratorOnNextClickEnabled()) {
+ return;
+ }
+ acceleratorForNextClickedAction = accelerator;
+ String title = TextUtils.getText("SetAccelerator.dialogTitle");
+ String text = TextUtils.getText(SET_ACCELERATOR_ON_NEXT_CLICK_ACTION);
+ if(accelerator != null)
+ text = TextUtils.format("SetAccelerator.keystrokeDetected", toString(accelerator)) + "\n" + text;
+ final Component frame = Controller.getCurrentController().getViewController().getMenuComponent();
+ setAcceleratorOnNextClickActionDialog = UITools.createCancelDialog(frame, title, text);
+ getAcceleratorOnNextClickActionDialog().addComponentListener(new ComponentAdapter() {
+ @Override
+ public void componentHidden(final ComponentEvent e) {
+ setAcceleratorOnNextClickActionDialog = null;
+ acceleratorForNextClickedAction = null;
+ }
+ });
+ getAcceleratorOnNextClickActionDialog().setVisible(true);
+ }
+
+ public AccelerateableAction(final AFreeplaneAction originalAction) {
+ super();
+ this.originalAction = originalAction;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final boolean newAcceleratorOnNextClickEnabled = AccelerateableAction.isNewAcceleratorOnNextClickEnabled();
+ final KeyStroke newAccelerator = acceleratorForNextClickedAction;
+ if (newAcceleratorOnNextClickEnabled) {
+ getAcceleratorOnNextClickActionDialog().setVisible(false);
+ }
+ final Object source = e.getSource();
+ if ((newAcceleratorOnNextClickEnabled || 0 != (e.getModifiers() & ActionEvent.CTRL_MASK))
+ && ! (source instanceof IKeyBindingManager &&((IKeyBindingManager) source).isKeyBindingProcessed())) {
+ getAcceleratorManager().newAccelerator(getOriginalAction(), newAccelerator);
+ return;
+ }
+ originalAction.actionPerformed(e);
+ }
+
+ public static JDialog getAcceleratorOnNextClickActionDialog() {
+ return setAcceleratorOnNextClickActionDialog;
+ }
+
+ public static KeyStroke getAcceleratorForNextClick() {
+ return acceleratorForNextClickedAction;
+ }
+
+ public void addPropertyChangeListener(final PropertyChangeListener listener) {
+ originalAction.addPropertyChangeListener(listener);
+ }
+
+ public void afterMapChange(final Object newMap) {
+ originalAction.afterMapChange(newMap);
+ }
+
+ public Object getValue(final String key) {
+ return originalAction.getValue(key);
+ }
+
+ public boolean isEnabled() {
+ return originalAction.isEnabled();
+ }
+
+ public boolean isSelected() {
+ return originalAction.isSelected();
+ }
+
+ public void setSelected(boolean newValue) {
+ originalAction.setSelected(newValue);
+ }
+
+ public AFreeplaneAction getOriginalAction() {
+ return originalAction;
+ }
+
+ private static String toString(final KeyStroke newAccelerator) {
+ return newAccelerator.toString().replaceFirst("pressed ", "");
+ }
+
+ public void putValue(final String key, final Object value) {
+ originalAction.putValue(key, value);
+ }
+
+ public void removePropertyChangeListener(final PropertyChangeListener listener) {
+ originalAction.removePropertyChangeListener(listener);
+ }
+
+ public void setEnabled(final boolean b) {
+ originalAction.setEnabled(b);
+ }
+
+ public String getIconKey() {
+ return originalAction.getIconKey();
+ }
+
+ private ActionAcceleratorManager getAcceleratorManager() {
+ return Controller.getCurrentModeController().getUserInputListenerFactory().getAcceleratorManager();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/ActionAcceleratorManager.java b/freeplane/src/main/java/org/freeplane/core/ui/ActionAcceleratorManager.java
new file mode 100644
index 0000000..48eca82
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/ActionAcceleratorManager.java
@@ -0,0 +1,472 @@
+package org.freeplane.core.ui;
+
+import java.awt.Event;
+import java.awt.event.KeyEvent;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.regex.Pattern;
+
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.GrabKeyDialog;
+import org.freeplane.core.resources.components.IKeystrokeValidator;
+import org.freeplane.core.ui.IEditHandler.FirstAction;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.util.ActionUtils;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.Pair;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.FreeplaneActions;
+import org.freeplane.features.mode.ModeController;
+
+public class ActionAcceleratorManager implements IKeyStrokeProcessor, IAcceleratorMap {
+
+ <V> Pair<ModeController, V> key(V value) {
+ return key(Controller.getCurrentModeController(), value);
+
+ }
+
+ <V> Pair<ModeController, V> key(ModeController modeController, V value) {
+ return new Pair<ModeController, V>(modeController, value);
+
+ }
+
+ private static final String SHORTCUT_PROPERTY_PREFIX = "acceleratorFor.";
+
+ private final Map<Pair<ModeController, KeyStroke>, AFreeplaneAction> accelerators = new HashMap<Pair<ModeController, KeyStroke>, AFreeplaneAction>();
+ private final Map<Pair<ModeController, String>, KeyStroke> actionMap = new HashMap<Pair<ModeController, String>, KeyStroke>();
+ private final Map<FreeplaneActions, Collection<IAcceleratorChangeListener>> changeListenersForActionCollection = new HashMap<FreeplaneActions, Collection<IAcceleratorChangeListener>>();
+
+ private final Properties keysetProps;
+ private final Properties defaultProps;
+
+
+ /***********************************************************************************
+ * CONSTRUCTORS
+ **********************************************************************************/
+
+ public ActionAcceleratorManager() {
+ defaultProps = new Properties();
+ keysetProps = new Properties(defaultProps);
+ }
+
+ public void loadAcceleratorPresets() {
+ try {
+ if (ResourceController.getResourceController().getFreeplaneUserDirectory() != null) {
+ final File defaultPresetsFile = getPresetsFile();
+ if(defaultPresetsFile.exists()) {
+ FileInputStream inputStream = null;
+ try{
+ inputStream = new FileInputStream(defaultPresetsFile);
+ loadAcceleratorPresets(inputStream);
+ }
+ finally{
+ FileUtils.silentlyClose(inputStream);
+ }
+ }
+ else {
+ updateAcceleratorsFromUserProperties();
+ }
+ }
+ }
+ catch (IOException ex) {
+ }
+ }
+
+ private void updateAcceleratorsFromUserProperties() {
+ final Properties properties = ResourceController.getResourceController().getProperties();
+ Iterator<Entry<Object, Object>> propertyIterator = properties.entrySet().iterator();
+ while (propertyIterator.hasNext()){
+ Entry<Object, Object> property = propertyIterator.next();
+ final String key = (String)property.getKey();
+ final String oldPrefix = "acceleratorFor";
+ if(key.startsWith(oldPrefix)){
+ String newKey = SHORTCUT_PROPERTY_PREFIX + key.substring(oldPrefix.length()).replaceFirst("\\$", "").replaceFirst("\\$\\d", "");
+ String value = (String)property.getValue();
+ loadAcceleratorPreset(newKey, value);
+ propertyIterator.remove();
+ }
+ }
+ saveAcceleratorPresets();
+ }
+
+ public void setAccelerator(final AFreeplaneAction action, final KeyStroke keyStroke) {
+ setAccelerator(Controller.getCurrentModeController(), action, keyStroke);
+ }
+
+ private void setAccelerator(ModeController modeController, final AFreeplaneAction action, final KeyStroke keyStroke) {
+ if(action == null) {
+ return;
+ }
+ if(keyStroke != null) {
+ final AFreeplaneAction oldAction = accelerators.put(key(modeController, keyStroke), action);
+ if(action == oldAction || (oldAction != null && action.getKey().equals(oldAction.getKey()))) {
+ return;
+ }
+ if (oldAction != null) {
+ accelerators.put(key(modeController, keyStroke), oldAction);
+ return;
+ }
+ }
+ final KeyStroke removedAccelerator = removeAccelerator(modeController, action);
+ final String actionKey = action.getKey();
+ if(keyStroke != null) {
+ actionMap.put(key(modeController, actionKey), keyStroke);
+ }
+ fireAcceleratorChanged(modeController, action, removedAccelerator, keyStroke);
+ }
+
+ @Override
+ public void setUserDefinedAccelerator(AFreeplaneAction action) {
+ final String actionKey = action.getKey();
+ final String shortcutKey = getPropertyKey(actionKey);
+ String accelerator = getShortcut(shortcutKey);
+ if (accelerator != null){
+ KeyStroke ks = KeyStroke.getKeyStroke(accelerator);
+ setAccelerator(action, ks);
+ }
+ }
+
+ public void setDefaultAccelerator(final AFreeplaneAction action, String accelerator) {
+ final String shortcutKey = getPropertyKey(action.getKey());
+ if (null == getShortcut(shortcutKey)) {
+ accelerator = replaceModifiersForMac(accelerator);
+ defaultProps.setProperty(shortcutKey, accelerator);
+ KeyStroke ks = KeyStroke.getKeyStroke(accelerator);
+ setAccelerator(action, ks);
+ }
+ }
+
+ @Override
+ public void removeAction(FreeplaneActions freeplaneActions, AFreeplaneAction action) {
+ final KeyStroke oldKeystroke = removeAccelerator(action);
+ fireAcceleratorChanged(freeplaneActions, action, oldKeystroke, null);
+ }
+
+
+ public KeyStroke removeAccelerator(final AFreeplaneAction action) {
+ return removeAccelerator(Controller.getCurrentModeController(), action);
+ }
+
+ private KeyStroke removeAccelerator(ModeController modeController, final AFreeplaneAction action)
+ throws AssertionError {
+ if(action == null) {
+ return null;
+ }
+ final String actionKey = action.getKey();
+ final KeyStroke oldAccelerator = actionMap.remove(key(modeController, actionKey));
+ if (oldAccelerator != null) {
+ final AFreeplaneAction oldAction = accelerators.remove(key(modeController, oldAccelerator));
+ if (oldAction != null && !action.getKey().equals(oldAction.getKey())) {
+ throw new AssertionError("unexpected action " + ActionUtils.getActionTitle(action) + " for accelerator " + oldAccelerator + "("+ActionUtils.getActionTitle(oldAction)+")");
+ }
+ }
+ return oldAccelerator;
+ }
+
+ public String getPropertyKey(final String key) {
+ return getPropertyKey(Controller.getCurrentModeController(), key);
+ }
+
+ String getPropertyKey(final ModeController modeController, final String key) {
+ return SHORTCUT_PROPERTY_PREFIX + modeController.getModeName() + "/" + key;
+ }
+
+ public KeyStroke getAccelerator(AFreeplaneAction action) {
+ final String actionKey = action.getKey();
+ return getAccelerator(actionKey);
+ }
+
+ public KeyStroke getAccelerator(final String actionKey) {
+ KeyStroke ks = actionMap.get(key(actionKey));
+ return ks;
+ }
+
+ public void addAcceleratorChangeListener(FreeplaneActions freeplaneActions, IAcceleratorChangeListener changeListener) {
+ synchronized (changeListenersForActionCollection) {
+ Collection<IAcceleratorChangeListener> changeListeners = changeListenersForActionCollection.get(freeplaneActions);
+ if (changeListeners == null) {
+ changeListeners = new ArrayList<IAcceleratorChangeListener>();
+ changeListenersForActionCollection.put(freeplaneActions, changeListeners);
+ }
+ if (!changeListeners.contains(changeListener)) {
+ changeListeners.add(changeListener);
+ }
+ }
+ }
+
+ protected void fireAcceleratorChanged(FreeplaneActions freeplaneActions, AFreeplaneAction action, KeyStroke oldStroke,
+ KeyStroke newStroke) {
+ synchronized (changeListenersForActionCollection) {
+ final Collection<IAcceleratorChangeListener> listeners = changeListenersForActionCollection.get(freeplaneActions);
+ if(listeners != null) {
+ for (IAcceleratorChangeListener listener : listeners) {
+ listener.acceleratorChanged(action, oldStroke, newStroke);
+ }
+ }
+ }
+ }
+
+ private String getShortcut(String key) {
+ return keysetProps.getProperty(key, null);
+ }
+
+ public void newAccelerator(final AFreeplaneAction action, final KeyStroke newAccelerator) {
+ final String shortcutKey = getPropertyKey(action.getKey());
+ final String oldShortcut = getShortcut(shortcutKey);
+ if (newAccelerator == null || !new KeystrokeValidator(action).isValid(newAccelerator, newAccelerator.getKeyChar())) {
+ final GrabKeyDialog grabKeyDialog = new GrabKeyDialog(oldShortcut);
+ final IKeystrokeValidator validator = new KeystrokeValidator(action);
+ grabKeyDialog.setValidator(validator);
+ grabKeyDialog.setVisible(true);
+ if (grabKeyDialog.isOK()) {
+ final String shortcut = grabKeyDialog.getShortcut();
+ final KeyStroke accelerator = UITools.getKeyStroke(shortcut);
+ setAccelerator(action, accelerator);
+ setKeysetProperty(shortcutKey, shortcut);
+ LogUtils.info("created shortcut '" + shortcut + "' for action '" + action.getKey() + "', shortcutKey '"
+ + shortcutKey + "' (" + ActionUtils.getActionTitle(action) + ")");
+ }
+ }
+ else{
+ if(oldShortcut != null){
+ final int replace = JOptionPane.showConfirmDialog(UITools.getCurrentRootComponent(), oldShortcut, TextUtils.removeTranslateComment(TextUtils.getText("remove_shortcut_question")), JOptionPane.YES_NO_OPTION);
+ if (replace != JOptionPane.YES_OPTION) {
+ return;
+ }
+ }
+ setAccelerator(action, newAccelerator);
+ setKeysetProperty(shortcutKey, toString(newAccelerator));
+ LogUtils.info("created shortcut '" + toString(newAccelerator) + "' for action '" + action+ "', shortcutKey '" + shortcutKey + "' (" + ActionUtils.getActionTitle(action) + ")");
+ }
+ saveAcceleratorPresets();
+ }
+
+ public void saveAcceleratorPresets() {
+ try {
+ final FileOutputStream output = new FileOutputStream(getPresetsFile());
+ storeAcceleratorPreset(output);
+ output.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public File getPresetsFile() {
+ File userDirectory = new File(ResourceController.getResourceController().getFreeplaneUserDirectory());
+ if(!userDirectory.exists()) {
+ userDirectory.mkdirs();
+ }
+ return new File(userDirectory, "accelerator.properties");
+ }
+
+ public void loadAcceleratorPresets(final InputStream in) {
+ final Properties prop = new Properties();
+ try {
+ prop.load(in);
+ for (final Entry<Object, Object> property : new ArrayList<Entry<Object, Object>>(prop.entrySet())) {
+ String shortcutKey = (String) property.getKey();
+ final String keystrokeString = (String) property.getValue();
+ final String updatedShortcutKey = updateShortcutKey(shortcutKey);
+ if(! updatedShortcutKey.equals(shortcutKey)) {
+ prop.remove(shortcutKey);
+ if (prop.get(updatedShortcutKey) == null)
+ prop.setProperty(updatedShortcutKey, keystrokeString);
+ else
+ continue;
+ }
+ loadAcceleratorPreset(updatedShortcutKey, keystrokeString);
+ }
+ }
+ catch (final IOException e) {
+ LogUtils.warn("shortcut presets not stored: "+e.getMessage());
+ }
+ }
+
+ final static Pattern oldKeyFormatPattern = Pattern.compile("\\$(.*?)\\$0$");
+ String updateShortcutKey(final String shortcutKey) {
+ String updatedShortcutKey = shortcutKey;
+ final int dotPosition = "acceleratorFor".length();
+ if(shortcutKey.length() > dotPosition && shortcutKey.charAt(dotPosition) != '.')
+ updatedShortcutKey = "acceleratorFor." + shortcutKey.substring(dotPosition);
+ if(updatedShortcutKey.endsWith("$0"))
+ updatedShortcutKey = oldKeyFormatPattern.matcher(updatedShortcutKey).replaceFirst("$1");
+ return updatedShortcutKey;
+ }
+
+ private void loadAcceleratorPreset(final String shortcutKey, final String keystrokeString) {
+ if (!shortcutKey.startsWith(SHORTCUT_PROPERTY_PREFIX)) {
+ LogUtils.warn("wrong property key " + shortcutKey);
+ return;
+ }
+ final int pos = shortcutKey.indexOf("/", SHORTCUT_PROPERTY_PREFIX.length());
+ if (pos <= 0) {
+ LogUtils.warn("wrong property key " + shortcutKey);
+ return;
+ }
+ final String modeName = shortcutKey.substring(SHORTCUT_PROPERTY_PREFIX.length(), pos);
+ final String itemKey = shortcutKey.substring(pos + 1);
+ Controller controller = Controller.getCurrentController();
+ final ModeController modeController = controller.getModeController(modeName);
+ if (modeController != null) {
+ final KeyStroke keyStroke;
+ if (!keystrokeString.equals("")) {
+ keyStroke = UITools.getKeyStroke(keystrokeString);
+ final AFreeplaneAction oldAction = accelerators.get(key(modeController, keyStroke));
+ if (oldAction != null) {
+ setAccelerator(modeController, oldAction, null);
+ final Object key = oldAction.getKey();
+ final String oldShortcutKey = getPropertyKey(modeController, key.toString());
+ setKeysetProperty(oldShortcutKey, "");
+ }
+ }
+ else {
+ keyStroke = null;
+ }
+ final AFreeplaneAction action = modeController.getAction(itemKey);
+ if (action != null) {
+ setAccelerator(modeController, action, keyStroke);
+ }
+ }
+ setKeysetProperty(shortcutKey, keystrokeString);
+ }
+
+ public void storeAcceleratorPreset(OutputStream out) {
+ try {
+ final OutputStream output = new BufferedOutputStream(out);
+ keysetProps.store(output, "");
+ }
+ catch (final IOException e1) {
+ UITools.errorMessage(TextUtils.removeTranslateComment(TextUtils.getText("can_not_save_key_set")));
+ }
+ }
+
+ private static String toString(final KeyStroke newAccelerator) {
+ return newAccelerator.toString().replaceFirst("pressed ", "");
+ }
+
+ private static boolean askForReplaceShortcutViaDialog(String oldMenuItemTitle) {
+ final int replace = JOptionPane.showConfirmDialog(UITools.getCurrentRootComponent(),
+ TextUtils.removeTranslateComment(TextUtils.format("replace_shortcut_question", oldMenuItemTitle)),
+ TextUtils.removeTranslateComment(TextUtils.format("replace_shortcut_title")), JOptionPane.YES_NO_OPTION);
+ return replace == JOptionPane.YES_OPTION;
+ }
+
+ public boolean canProcessKeyEvent(KeyEvent e) {
+ KeyStroke ks;
+ KeyStroke ksE = null;
+ boolean pressed = (e.getID() == KeyEvent.KEY_PRESSED);
+ if(e.getID() == KeyEvent.KEY_TYPED) {
+ ks=KeyStroke.getKeyStroke(e.getKeyChar());
+ } else {
+ if(e.getKeyCode() != e.getExtendedKeyCode()) {
+ ksE=KeyStroke.getKeyStroke(e.getExtendedKeyCode(), e.getModifiers(), !pressed);
+ }
+ ks=KeyStroke.getKeyStroke(e.getKeyCode(), e.getModifiers(), !pressed);
+ }
+ return ksE != null && actionForAccelerator(ksE) != null || actionForAccelerator(ks) != null;
+ }
+
+ private AFreeplaneAction actionForAccelerator(KeyStroke ks) {
+ return accelerators.get(key(ks));
+ }
+
+ public boolean processKeyBinding(KeyStroke ks, KeyEvent event) {
+ AFreeplaneAction action = actionForAccelerator(ks);
+ if(action == null) {
+ final KeyStroke derivedKeyStroke = FreeplaneMenuBar.derive(ks, event.getKeyChar());
+ action = actionForAccelerator(derivedKeyStroke);
+ }
+ if(action != null && action.isEnabled()) {
+ if(action != null && SwingUtilities.notifyAction(action, ks, event, event.getComponent(), event.getModifiers())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private class KeystrokeValidator implements IKeystrokeValidator {
+ private final AFreeplaneAction action;
+
+ private KeystrokeValidator(AFreeplaneAction action) {
+ this.action = action;
+ }
+
+ private boolean checkForOverwriteShortcut(final KeyStroke keystroke) {
+ final AFreeplaneAction priorAssigned = accelerators.get(key(keystroke));
+ if (priorAssigned == null || action.getKey().equals(priorAssigned.getKey())) {
+ return true;
+ }
+ return replaceOrCancel(priorAssigned, ActionUtils.getActionTitle(priorAssigned));
+ }
+
+ private boolean replaceOrCancel(AFreeplaneAction action, String oldMenuItemTitle) {
+ if (askForReplaceShortcutViaDialog(oldMenuItemTitle)) {
+ setAccelerator(action, null);
+ final String shortcutKey = getPropertyKey(action.getKey());
+ setKeysetProperty(shortcutKey, "");
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean isValid(final KeyStroke keystroke, final Character keyChar) {
+ if (keystroke == null) {
+ return true;
+ }
+ if (actionMap.containsKey(key(action.getKey()))) {
+ return true;
+ }
+ if (keyChar != KeyEvent.CHAR_UNDEFINED && (keystroke.getModifiers() & (Event.ALT_MASK | Event.CTRL_MASK | Event.META_MASK)) == 0) {
+ final String keyTypeActionString = ResourceController.getResourceController().getProperty("key_type_action",
+ FirstAction.EDIT_CURRENT.toString());
+ FirstAction keyTypeAction = FirstAction.valueOf(keyTypeActionString);
+ return FirstAction.IGNORE.equals(keyTypeAction);
+ }
+ if (!checkForOverwriteShortcut(keystroke)) {
+ return false;
+ }
+ final KeyStroke derivedKS = FreeplaneMenuBar.derive(keystroke, keyChar);
+ if (derivedKS == keystroke) {
+ return true;
+ }
+ return checkForOverwriteShortcut(derivedKS);
+ }
+ }
+
+ private static String replaceModifiersForMac(String accelerator) {
+ if (Compat.isMacOsX()) {
+ accelerator = accelerator.replaceFirst("CONTROL", "META").replaceFirst("control", "meta");
+ }
+ return accelerator;
+ }
+
+ private void setKeysetProperty(String key, String value) {
+// if(! key.startsWith("acceleratorFor.MindMap"))
+// throw new AssertionError(key);
+ keysetProps.setProperty(key, value);
+
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/ActionEnabler.java b/freeplane/src/main/java/org/freeplane/core/ui/ActionEnabler.java
new file mode 100644
index 0000000..75afcee
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/ActionEnabler.java
@@ -0,0 +1,28 @@
+package org.freeplane.core.ui;
+
+import java.awt.Component;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.lang.ref.WeakReference;
+
+import javax.swing.Action;
+
+public class ActionEnabler implements PropertyChangeListener {
+ final private WeakReference<Component> comp;
+
+ public ActionEnabler(final Component comp) {
+ this.comp = new WeakReference<Component>(comp);
+ }
+
+ public void propertyChange(final PropertyChangeEvent evt) {
+ final Component component = comp.get();
+ if (component == null) {
+ final Action action = (Action) evt.getSource();
+ action.removePropertyChangeListener(this);
+ }
+ else if (evt.getPropertyName().equals("enabled")) {
+ final Action action = (Action) evt.getSource();
+ component.setEnabled(action.isEnabled());
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/ButtonModelStateChangeListenerForProperty.java b/freeplane/src/main/java/org/freeplane/core/ui/ButtonModelStateChangeListenerForProperty.java
new file mode 100644
index 0000000..2e9e1dd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/ButtonModelStateChangeListenerForProperty.java
@@ -0,0 +1,22 @@
+package org.freeplane.core.ui;
+
+import javax.swing.ButtonModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.resources.ResourceController;
+
+public class ButtonModelStateChangeListenerForProperty implements ChangeListener {
+ final private String propertyName;
+
+ public ButtonModelStateChangeListenerForProperty(String propertyName) {
+ super();
+ this.propertyName = propertyName;
+ }
+
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ ButtonModel buttonModel = (ButtonModel)e.getSource();
+ ResourceController.getResourceController().setProperty(propertyName, buttonModel.isSelected());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/ColorTracker.java b/freeplane/src/main/java/org/freeplane/core/ui/ColorTracker.java
new file mode 100644
index 0000000..d0bcd60
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/ColorTracker.java
@@ -0,0 +1,133 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.HeadlessException;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.Serializable;
+
+import javax.swing.JButton;
+import javax.swing.JColorChooser;
+import javax.swing.JDialog;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+public class ColorTracker implements ActionListener, Serializable {
+ static class Closer extends WindowAdapter implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void windowClosing(final WindowEvent e) {
+ e.getWindow().setVisible(false);
+ e.getWindow().dispose();
+ }
+ }
+
+ static class DisposeOnClose extends ComponentAdapter implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void componentHidden(final ComponentEvent e) {
+ final Window w = (Window) e.getComponent();
+ w.dispose();
+ }
+ }
+
+ static JColorChooser colorChooser = new JColorChooser();
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /** Static JColorChooser to have the recent color^^s feature. */
+ static public JColorChooser getCommonJColorChooser() {
+ return ColorTracker.colorChooser;
+ }
+
+ public static Color showCommonJColorChooserDialog(final Component component, final String title,
+ final Color initialColor, final Color defaultColor) {
+ final JColorChooser pane = ColorTracker.getCommonJColorChooser();
+ pane.setColor(initialColor);
+ final ColorTracker ok = new ColorTracker(pane);
+ final JDialog dialog = JColorChooser.createDialog(component, title, true, pane, ok, null);
+ final Container container = (Container) dialog.getContentPane().getComponent(1);
+ if(defaultColor != null){
+ final JButton defaultBtn = new JButton(TextUtils.getText("reset_to_default"));
+ defaultBtn.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ dialog.dispose();
+ ok.setColor(defaultColor);
+ }
+ });
+ container.add(defaultBtn);
+ }
+ dialog.addWindowListener(new Closer());
+ dialog.addComponentListener(new DisposeOnClose());
+ dialog.pack();
+ UITools.setDialogLocationRelativeTo(dialog, component);
+ dialog.setVisible(true);
+ return ok.getColor();
+ }
+
+ public static Color showCommonJColorChooserDialog( final NodeModel nodeModel,
+ final String title, final Color initialColor, Color defaultColor)
+ throws HeadlessException {
+ Controller controller = Controller.getCurrentController();
+ final Component component = controller.getMapViewManager().getComponent(nodeModel);
+ return ColorTracker.showCommonJColorChooserDialog(component, title, initialColor, defaultColor);
+ }
+
+ final private JColorChooser chooser;
+ private Color color;
+
+ ColorTracker(final JColorChooser c) {
+ chooser = c;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ color = chooser.getColor();
+ }
+
+ Color getColor() {
+ return color;
+ }
+
+ protected void setColor(final Color color) {
+ this.color = color;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/ColoredIconCreator.java b/freeplane/src/main/java/org/freeplane/core/ui/ColoredIconCreator.java
new file mode 100644
index 0000000..30ba7a0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/ColoredIconCreator.java
@@ -0,0 +1,72 @@
+package org.freeplane.core.ui;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.imageio.ImageIO;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+public class ColoredIconCreator{
+ final private Map<Color, Icon> coloredNoteIcons;
+ private final int replacedColorRGB;
+ private final Image originalImage;
+ public ColoredIconCreator(URL iconUrl, Color replacedColor) {
+ this(read(iconUrl), replacedColor);
+ }
+ public ColoredIconCreator(Image originalImage, Color replacedColor) {
+ super();
+ replacedColorRGB = 0xffffff & replacedColor.getRGB();
+ coloredNoteIcons = new HashMap<Color, Icon>();
+ this.originalImage = originalImage;
+ }
+
+ private static BufferedImage read(URL iconUrl){
+ try {
+ return ImageIO.read(iconUrl);
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ private BufferedImage copy(Image img)
+ {
+ BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
+ Graphics2D bGr = bimage.createGraphics();
+ bGr.drawImage(img, 0, 0, null);
+ bGr.dispose();
+ return bimage;
+ }
+
+ public Icon createColoredIcon(Color iconColor) {
+ Icon icon = coloredNoteIcons.get(iconColor);
+ if(icon == null && originalImage != null){
+ icon = new ImageIcon(createColoredImage(iconColor));
+ coloredNoteIcons.put(iconColor, icon);
+ }
+ return icon;
+ }
+
+ public Image createColoredImage(Color newColor) {
+ final int newRGB = 0xffffff & newColor.getRGB();
+ if(replacedColorRGB != newRGB && originalImage != null){
+ final BufferedImage img = copy(originalImage);
+ for (int x = 0; x < img.getWidth(); x++) {
+ for (int y = 0; y < img.getHeight(); y++) {
+ final int rgb = img.getRGB(x, y);
+ if ((0xffffff &rgb) == replacedColorRGB)
+ img.setRGB(x, y, 0xff000000 & rgb| newRGB);
+ }
+ }
+ return img;
+ }
+ else
+ return originalImage;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/ControllerPopupMenuListener.java b/freeplane/src/main/java/org/freeplane/core/ui/ControllerPopupMenuListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/ControllerPopupMenuListener.java
rename to freeplane/src/main/java/org/freeplane/core/ui/ControllerPopupMenuListener.java
diff --git a/freeplane/src/org/freeplane/core/ui/DelayedMouseListener.java b/freeplane/src/main/java/org/freeplane/core/ui/DelayedMouseListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/DelayedMouseListener.java
rename to freeplane/src/main/java/org/freeplane/core/ui/DelayedMouseListener.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/DelegatingPopupMenuListener.java b/freeplane/src/main/java/org/freeplane/core/ui/DelegatingPopupMenuListener.java
new file mode 100644
index 0000000..93f7d56
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/DelegatingPopupMenuListener.java
@@ -0,0 +1,35 @@
+package org.freeplane.core.ui;
+
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+
+class DelegatingPopupMenuListener implements PopupMenuListener {
+ final private PopupMenuListener listener;
+ final private Object source;
+
+ public DelegatingPopupMenuListener(final PopupMenuListener listener, final Object source) {
+ super();
+ this.listener = listener;
+ this.source = source;
+ }
+
+ public Object getSource() {
+ return source;
+ }
+
+ private PopupMenuEvent newEvent() {
+ return new PopupMenuEvent(source);
+ }
+
+ public void popupMenuCanceled(final PopupMenuEvent e) {
+ listener.popupMenuCanceled(newEvent());
+ }
+
+ public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
+ listener.popupMenuWillBecomeInvisible(newEvent());
+ }
+
+ public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
+ listener.popupMenuWillBecomeVisible(newEvent());
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/DoubleClickTimer.java b/freeplane/src/main/java/org/freeplane/core/ui/DoubleClickTimer.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/DoubleClickTimer.java
rename to freeplane/src/main/java/org/freeplane/core/ui/DoubleClickTimer.java
diff --git a/freeplane/src/org/freeplane/core/ui/EnabledAction.java b/freeplane/src/main/java/org/freeplane/core/ui/EnabledAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/EnabledAction.java
rename to freeplane/src/main/java/org/freeplane/core/ui/EnabledAction.java
diff --git a/freeplane/src/org/freeplane/core/ui/ExampleFileFilter.java b/freeplane/src/main/java/org/freeplane/core/ui/ExampleFileFilter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/ExampleFileFilter.java
rename to freeplane/src/main/java/org/freeplane/core/ui/ExampleFileFilter.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/FileOpener.java b/freeplane/src/main/java/org/freeplane/core/ui/FileOpener.java
new file mode 100644
index 0000000..7f22865
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/FileOpener.java
@@ -0,0 +1,150 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.dnd.DropTargetListener;
+import java.io.File;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.clipboard.MindMapNodesSelection;
+
+public class FileOpener implements DropTargetListener {
+
+ private final String fileExtension;
+ private Listener listener;
+
+ public static interface Listener {
+ public void filesDropped(Collection<URL> urls ) throws Exception;
+ }
+
+
+ public FileOpener(String fileExtension, Listener listener) {
+ this.listener = listener;
+ this.fileExtension = fileExtension;
+ }
+
+ public void dragEnter(final DropTargetDragEvent dtde) {
+ if (!isDragAcceptable(dtde)) {
+ dtde.rejectDrag();
+ return;
+ }
+ }
+
+ public void dragExit(final DropTargetEvent e) {
+ }
+
+ public void dragOver(final DropTargetDragEvent e) {
+ }
+
+ public void dragScroll(final DropTargetDragEvent e) {
+ }
+
+ static final private Pattern filePattern = Pattern.compile("file://[^\\s" + File.pathSeparatorChar + "]+");
+ private boolean isMindMapUrl(final String urlString) {
+ return urlString.substring(urlString.length() - fileExtension.length() - 1).equalsIgnoreCase("." + fileExtension);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void drop(final DropTargetDropEvent dtde) {
+ if (!isDropAcceptable(dtde)) {
+ dtde.rejectDrop();
+ return;
+ }
+ dtde.acceptDrop(DnDConstants.ACTION_COPY);
+ try {
+ ArrayList<URL> droppedUrls = new ArrayList<>();
+ final Transferable transferable = dtde.getTransferable();
+ if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+ final List<File> list = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
+ for (final File file : list) {
+ if (file.isDirectory() || ! isMindMapUrl(file.getName()) || ! file.canRead()) {
+ continue;
+ }
+ final URL url = Compat.fileToUrl(file);
+
+ droppedUrls.add(url);
+ }
+ }
+ else if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+ final String urlStringRepresentation = (String) transferable.getTransferData(DataFlavor.stringFlavor);
+ if(urlStringRepresentation.startsWith("file:")){
+ final Matcher matcher = filePattern.matcher(urlStringRepresentation);
+ while (matcher.find()) {
+ final String urlString = matcher.group();
+ if(isMindMapUrl(urlString)) {
+ try {
+ final URI uri = new URI(urlString);
+ final URL url = new URL(uri.getScheme(), uri.getHost(), uri.getPath());
+ final File file = Compat.urlToFile(url);
+ if(! file.exists() || file.isDirectory())
+ continue;
+ droppedUrls.add(url);
+ }
+ catch (final Exception e) {
+ e.printStackTrace();
+ continue;
+ }
+ }
+ }
+ }
+ else if(urlStringRepresentation.startsWith("http://") && isMindMapUrl(urlStringRepresentation)){
+ final URL url = new URL(urlStringRepresentation);
+ droppedUrls.add(url);
+ }
+ }
+ listener.filesDropped(droppedUrls);
+ }
+ catch (final Exception e) {
+ UITools.errorMessage(TextUtils.format("dropped_file_error", e.getMessage()));
+ dtde.dropComplete(false);
+ return;
+ }
+ dtde.dropComplete(true);
+ }
+
+ public void dropActionChanged(final DropTargetDragEvent e) {
+ }
+
+ private boolean isDragAcceptable(final DropTargetDragEvent event) {
+ return event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
+ || !event.isDataFlavorSupported(MindMapNodesSelection.mindMapNodesFlavor)
+ && event.isDataFlavorSupported(DataFlavor.stringFlavor);
+ }
+
+ private boolean isDropAcceptable(final DropTargetDropEvent event) {
+ return event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
+ || event.isDataFlavorSupported(DataFlavor.stringFlavor);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/FixedBasicComboBoxEditor.java b/freeplane/src/main/java/org/freeplane/core/ui/FixedBasicComboBoxEditor.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/FixedBasicComboBoxEditor.java
rename to freeplane/src/main/java/org/freeplane/core/ui/FixedBasicComboBoxEditor.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/IAcceleratorChangeListener.java b/freeplane/src/main/java/org/freeplane/core/ui/IAcceleratorChangeListener.java
new file mode 100644
index 0000000..41ba63b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/IAcceleratorChangeListener.java
@@ -0,0 +1,30 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import javax.swing.KeyStroke;
+
+/**
+ * @author Dimitry Polivaev
+ * 03.07.2009
+ */
+public interface IAcceleratorChangeListener {
+ void acceleratorChanged(AFreeplaneAction action, KeyStroke oldStroke, KeyStroke newStroke);
+}
diff --git a/freeplane/src/org/freeplane/core/ui/IEditHandler.java b/freeplane/src/main/java/org/freeplane/core/ui/IEditHandler.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/IEditHandler.java
rename to freeplane/src/main/java/org/freeplane/core/ui/IEditHandler.java
diff --git a/freeplane/src/org/freeplane/core/ui/IFreeplaneAction.java b/freeplane/src/main/java/org/freeplane/core/ui/IFreeplaneAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/IFreeplaneAction.java
rename to freeplane/src/main/java/org/freeplane/core/ui/IFreeplaneAction.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/IKeyStrokeProcessor.java b/freeplane/src/main/java/org/freeplane/core/ui/IKeyStrokeProcessor.java
new file mode 100644
index 0000000..e255e6f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/IKeyStrokeProcessor.java
@@ -0,0 +1,17 @@
+/**
+ * author: Marcel Genzmehr
+ * 17.01.2012
+ */
+package org.freeplane.core.ui;
+
+import java.awt.event.KeyEvent;
+
+import javax.swing.KeyStroke;
+
+/**
+ *
+ */
+public interface IKeyStrokeProcessor {
+ public boolean processKeyBinding(KeyStroke ks, KeyEvent e);
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/IMenuItemEnabledListener.java b/freeplane/src/main/java/org/freeplane/core/ui/IMenuItemEnabledListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/IMenuItemEnabledListener.java
rename to freeplane/src/main/java/org/freeplane/core/ui/IMenuItemEnabledListener.java
diff --git a/freeplane/src/org/freeplane/core/ui/IMouseListener.java b/freeplane/src/main/java/org/freeplane/core/ui/IMouseListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/IMouseListener.java
rename to freeplane/src/main/java/org/freeplane/core/ui/IMouseListener.java
diff --git a/freeplane/src/org/freeplane/core/ui/IMouseWheelEventHandler.java b/freeplane/src/main/java/org/freeplane/core/ui/IMouseWheelEventHandler.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/IMouseWheelEventHandler.java
rename to freeplane/src/main/java/org/freeplane/core/ui/IMouseWheelEventHandler.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/IUserInputListenerFactory.java b/freeplane/src/main/java/org/freeplane/core/ui/IUserInputListenerFactory.java
new file mode 100644
index 0000000..0534884
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/IUserInputListenerFactory.java
@@ -0,0 +1,85 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DropTargetListener;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseWheelListener;
+import java.util.Set;
+
+import javax.swing.JComponent;
+import javax.swing.JPopupMenu;
+
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.menubuilders.generic.BuildPhaseListener;
+import org.freeplane.core.ui.menubuilders.generic.BuilderDestroyerPair;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+
+public interface IUserInputListenerFactory {
+ void addMouseWheelEventHandler(final IMouseWheelEventHandler handler);
+
+ void addToolBar(final String name, final int position, final JComponent toolBar);
+
+ IMouseListener getMapMouseListener();
+
+ MouseWheelListener getMapMouseWheelListener();
+
+ MouseWheelListener getNodeMouseWheelListener();
+
+ JPopupMenu getMapPopup();
+
+ public FreeplaneMenuBar getMenuBar();
+
+ public ActionAcceleratorManager getAcceleratorManager();
+
+ public Set<IMouseWheelEventHandler> getMouseWheelEventHandlers();
+
+ DragGestureListener getNodeDragListener();
+
+ DropTargetListener getNodeDropTargetListener();
+
+ KeyListener getNodeKeyListener();
+
+ IMouseListener getNodeMouseMotionListener();
+
+ JPopupMenu getNodePopupMenu();
+
+ JComponent getToolBar(String name);
+
+ Iterable<JComponent> getToolBars(int position);
+
+ public void removeMouseWheelEventHandler(final IMouseWheelEventHandler handler);
+
+ void updateMapList();
+
+ public void updateMenus(String menuStructureResource, Set<String> plugins);
+
+ public void rebuildMenu(Entry entry);
+
+ void addUiBuilder(Phase phase, String name, BuilderDestroyerPair builderDestroyerPair);
+
+ public void addBuildPhaseListener(BuildPhaseListener listener);
+
+ Entry getGenericMenuStructure();
+
+ void rebuildMenus(String string);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/IndexedTree.java b/freeplane/src/main/java/org/freeplane/core/ui/IndexedTree.java
new file mode 100644
index 0000000..501b317
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/IndexedTree.java
@@ -0,0 +1,263 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import java.util.AbstractCollection;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import org.freeplane.core.util.LogUtils;
+
+/**
+ * @author Dimitry Polivaev
+ * 25.12.2008
+ */
+public class IndexedTree {
+ public static class Node extends DefaultMutableTreeNode {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Object key;
+
+ Node(final Object userObject) {
+ super(userObject);
+ }
+
+ Node(final Object userObject, final Object key) {
+ this(userObject);
+ this.key = key;
+ }
+
+ public Object getKey() {
+ return key;
+ }
+ }
+
+ private final class UserObjects extends AbstractCollection<Object> {
+ @Override
+ public void clear() {
+ string2Element.clear();
+ }
+
+ @Override
+ public boolean contains(final Object o) {
+ final Iterator<Object> iterator = iterator();
+ while (iterator.hasNext()) {
+ final Object next = iterator.next();
+ if (o != null) {
+ if (o.equals(next)) {
+ return true;
+ }
+ }
+ if (next == null) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public Iterator<Object> iterator() {
+ return newObjectIterator();
+ }
+
+ @Override
+ public int size() {
+ return string2Element.size();
+ }
+ }
+ public static final int APPEND = 2;
+ public static final int AFTER = 1;
+ public static final int AS_CHILD = 0;
+ public static final int BEFORE = -1;
+ public static final int PREPEND = -2;
+ private final HashMap<Object, Node> string2Element;
+
+ public IndexedTree(final Object root) {
+ super();
+ final Node rootNode = new Node(root);
+ string2Element = new HashMap<Object, Node>();
+ string2Element.put(this, rootNode);
+ }
+
+ public DefaultMutableTreeNode addElement(final Object relativeKey, final Object element, final int position) {
+ final DefaultMutableTreeNode relativeNode = getNode(relativeKey);
+ final DefaultMutableTreeNode node = new Node(element);
+ if (relativeNode == null) {
+ return node;
+ }
+ addNode(relativeNode, node, position);
+ return node;
+ }
+
+ public DefaultMutableTreeNode addElement(final Object relativeKey, final Object element, final Object key,
+ final int position) {
+ final DefaultMutableTreeNode existingNode = get(key);
+ if (existingNode != null) {
+ throw new KeyAlreadyUsedException(key.toString() + " added twice");
+ }
+ final DefaultMutableTreeNode relativeNode = getNode(relativeKey);
+ if (relativeNode == null) {
+ return null;
+ }
+ final Node node = new Node(element, key);
+ addNode(relativeNode, node, position);
+ string2Element.put(key, node);
+ return node;
+ }
+
+ protected void addNode(final DefaultMutableTreeNode relativeNode, final DefaultMutableTreeNode node,
+ final int position) {
+ switch (position) {
+ case AS_CHILD:
+ relativeNode.add(node);
+ break;
+ case BEFORE: {
+ final DefaultMutableTreeNode parent = (DefaultMutableTreeNode) relativeNode.getParent();
+ if (parent == null) {
+ throw new RuntimeException("relative node has no parent element");
+ }
+ final int index = parent.getIndex(relativeNode);
+ parent.insert(node, index);
+ break;
+ }
+ case AFTER: {
+ final DefaultMutableTreeNode parent = (DefaultMutableTreeNode) relativeNode.getParent();
+ if (parent == null) {
+ throw new RuntimeException("relative node has no parent element");
+ }
+ final int index = parent.getIndex(relativeNode);
+ parent.insert(node, index + 1);
+ break;
+ }
+ case PREPEND: { //DOCEAR -
+// final int index = relativeNode.getChildCount()-1;
+ relativeNode.insert(node, 0);
+ break;
+ }
+ case APPEND: {
+ final int idx = relativeNode.getChildCount()-1;
+ relativeNode.insert(node, idx + 1);
+ break;
+ }
+ default:
+ throw new RuntimeException("wrong position");
+ }
+ }
+
+ public boolean contains(final Object key) {
+ return string2Element.containsKey(key);
+ }
+
+ public String dump() {
+ return string2Element.toString();
+ }
+
+ public DefaultMutableTreeNode get(final Object key) {
+ final Object object = string2Element.get(key);
+ if (object == null) {
+ return null;
+ }
+ return (DefaultMutableTreeNode) object;
+ }
+
+ public Object getKeyByUserObject(final Object object) {
+ final Collection<Node> values = string2Element.values();
+ for (final Node node : values) {
+ if (object != null && object.equals(node.getUserObject())) {
+ return node.getKey();
+ }
+ }
+ return null;
+ }
+
+ protected DefaultMutableTreeNode getNode(final Object key) {
+ final DefaultMutableTreeNode node = (string2Element.get(key));
+ if (node == null) {
+ LogUtils.warn(key + " not found");
+ }
+ return node;
+ }
+
+ public DefaultMutableTreeNode getRoot() {
+ return string2Element.get(this);
+ }
+
+ public Collection<Object> getUserObjects() {
+ return Collections.unmodifiableCollection(new UserObjects());
+ }
+
+ public Iterator<Object> newObjectIterator() {
+ return new Iterator<Object>() {
+ private final Iterator<Node> nodeIterator = string2Element.values().iterator();
+
+ public boolean hasNext() {
+ return nodeIterator.hasNext();
+ }
+
+ public Object next() {
+ return nodeIterator.next().getUserObject();
+ }
+
+ public void remove() {
+ nodeIterator.remove();
+ }
+ };
+ }
+
+ public void removeChildElements(final Object key) {
+ final DefaultMutableTreeNode node = getNode(key);
+ final Enumeration<?> children = node.children();
+ while (children.hasMoreElements()) {
+ final Node child = (Node) children.nextElement();
+ final Object childKey = child.getKey();
+ if (childKey != null) {
+ removeChildElements(childKey);
+ string2Element.remove(childKey);
+ }
+ }
+ node.removeAllChildren();
+ }
+
+ /**
+ */
+ protected void removeChildKeys(final Node node) {
+ final Enumeration<?> children = node.children();
+ while (children.hasMoreElements()) {
+ final Node child = (Node) children.nextElement();
+ string2Element.remove(child.getKey());
+ removeChildKeys(child);
+ }
+ }
+
+ public DefaultMutableTreeNode removeElement(final Object key) {
+ final DefaultMutableTreeNode node = (string2Element.remove(key));
+ if (node != null) {
+ removeChildKeys((Node) node);
+ }
+ return node;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/KeyAlreadyUsedException.java b/freeplane/src/main/java/org/freeplane/core/ui/KeyAlreadyUsedException.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/KeyAlreadyUsedException.java
rename to freeplane/src/main/java/org/freeplane/core/ui/KeyAlreadyUsedException.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/LabelAndMnemonicSetter.java b/freeplane/src/main/java/org/freeplane/core/ui/LabelAndMnemonicSetter.java
new file mode 100644
index 0000000..81bced7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/LabelAndMnemonicSetter.java
@@ -0,0 +1,53 @@
+package org.freeplane.core.ui;
+
+import javax.swing.AbstractButton;
+import javax.swing.Action;
+
+import org.dpolivaev.mnemonicsetter.ActionNameMnemonicHolder;
+import org.dpolivaev.mnemonicsetter.ButtonNameMnemonicHolder;
+import org.dpolivaev.mnemonicsetter.INameMnemonicHolder;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.TextUtils;
+
+public class LabelAndMnemonicSetter {
+
+ /**
+ * Ampersand indicates that the character after it is a mnemo, unless the
+ * character is a space. In "Find & Replace", ampersand does not label
+ * mnemo, while in "&About", mnemo is "Alt + A".
+ */
+ public static void setLabelAndMnemonic(final AbstractButton btn, final String inLabel) {
+ LabelAndMnemonicSetter.setLabelAndMnemonic(new ButtonNameMnemonicHolder(btn), inLabel);
+ }
+
+ /**
+ * Ampersand indicates that the character after it is a mnemo, unless the
+ * character is a space. In "Find & Replace", ampersand does not label
+ * mnemo, while in "&About", mnemo is "Alt + A".
+ */
+ public static void setLabelAndMnemonic(final Action action, final String inLabel) {
+ LabelAndMnemonicSetter.setLabelAndMnemonic(new ActionNameMnemonicHolder(action), inLabel);
+ }
+
+ static void setLabelAndMnemonic(final INameMnemonicHolder item, final String inLabel) {
+ String rawLabel = inLabel;
+ if (rawLabel == null) {
+ rawLabel = item.getText();
+ }
+ if (rawLabel == null) {
+ return;
+ }
+ item.setText(TextUtils.removeMnemonic(rawLabel));
+ final int mnemoSignIndex = rawLabel.indexOf('&');
+ if (mnemoSignIndex >= 0 && mnemoSignIndex + 1 < rawLabel.length()) {
+ final char charAfterMnemoSign = rawLabel.charAt(mnemoSignIndex + 1);
+ if (charAfterMnemoSign != ' ') {
+ if (!Compat.isMacOsX()) {
+ item.setMnemonic(charAfterMnemoSign);
+ item.setDisplayedMnemonicIndex(mnemoSignIndex);
+ }
+ }
+ }
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/LengthUnits.java b/freeplane/src/main/java/org/freeplane/core/ui/LengthUnits.java
new file mode 100644
index 0000000..2a27547
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/LengthUnits.java
@@ -0,0 +1,45 @@
+package org.freeplane.core.ui;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Convertible;
+import org.freeplane.core.util.Quantity;
+
+public enum LengthUnits implements Convertible{
+/*
++---------+-------------+---------------+
+| px | Pixels | Varies |
++---------+-------------+---------------+
+| in | Inches | 1 |
++---------+-------------+---------------+
+| mm | Millimeters | 25.4 |
++---------+-------------+---------------+
+| cm | Centimeters | 2.54 |
++---------+-------------+---------------+
+| pt | Points | 72 |
++---------+-------------+---------------+
+
+ */
+ px(1d),
+ in(UITools.getScreenResolution()),
+ mm(UITools.getScreenResolution() / 25.4),
+ cm(UITools.getScreenResolution() / 2.54),
+ pt(UITools.getScreenResolution() / 72.0);
+
+ LengthUnits(double factor){
+ this.factor = factor;
+
+ }
+ final private double factor;
+ @Override
+ public double factor() {
+ return factor;
+ }
+
+ static public Quantity<LengthUnits> pixelsInPt(double value){
+ return new Quantity<LengthUnits>(value, px).in(pt);
+ }
+
+ static public Quantity<LengthUnits> fromStringInPt(String value){
+ return Quantity.fromString(value, px).in(pt);
+ }
+ }
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/MenuSplitter.java b/freeplane/src/main/java/org/freeplane/core/ui/MenuSplitter.java
new file mode 100644
index 0000000..37d5c83
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/MenuSplitter.java
@@ -0,0 +1,140 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.GraphicsEnvironment;
+import java.awt.Toolkit;
+
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+
+import org.dpolivaev.mnemonicsetter.MnemonicSetter;
+import org.freeplane.core.util.Compat;
+
+/**
+ * @author Dimitry Polivaev
+ * 23.01.2013
+ */
+public class MenuSplitter{
+ private static final String EXTRA_SUBMENU = MenuSplitter.class.getName()+".extra_submenu";
+
+ static final int MAX_HEIGHT;
+
+ static {
+ if (!GraphicsEnvironment.isHeadless()) {
+ MAX_HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height - 100;
+ } else {
+ MAX_HEIGHT = 0;
+ }
+ }
+
+
+ public static int count = 0;
+ private final int maxMenuItemCount;
+
+ public MenuSplitter(int maxMenuItemCount) {
+ this.maxMenuItemCount = maxMenuItemCount;
+ }
+
+ public MenuSplitter() {
+ this(MenuSplitterConfiguration.MAX_MENU_ITEM_COUNT);
+ }
+
+ public void addComponent(Container container, Component component) {
+ if (container instanceof JMenu)
+ addMenuComponent((JMenu) container, component);
+ else
+ container.add(component);
+ }
+
+ public void addMenuComponent(JMenu menu, final Component component, final int index) {
+ final JPopupMenu popupMenu = menu.getPopupMenu();
+ final int itemCount = popupMenu.getComponentCount();
+ if(index == 0 || index < itemCount)
+ popupMenu.insert(component, index);
+ else {
+ final Component lastMenuItem = popupMenu.getComponent(itemCount - 1);
+ final boolean extraSubMenu = isExtraSubMenu(lastMenuItem);
+ if (extraSubMenu || !fitsOnScreen(popupMenu, component)) {
+ final JMenu submenu;
+ if(extraSubMenu) {
+ submenu = (JMenu) lastMenuItem;
+ }
+ else {
+ if (component instanceof JPopupMenu.Separator)
+ return;
+ submenu = new JMenu("-");
+ submenu.putClientProperty(EXTRA_SUBMENU, Boolean.TRUE);
+ popupMenu.add(submenu);
+ if(! Compat.isMacOsX())
+ submenu.getPopupMenu().addPopupMenuListener(MnemonicSetter.INSTANCE);
+ }
+ addMenuComponent(submenu, component, submenu.getPopupMenu().getComponentCount());
+ }
+ else
+ popupMenu.insert(component, index);
+ }
+ }
+
+ public void removeMenuComponent(final Component component) {
+ final Container parent = component.getParent();
+ if (parent != null) {
+ parent.remove(component);
+ if (parent instanceof JPopupMenu) {
+ final Component invoker = ((JPopupMenu) parent).getInvoker();
+ if (isExtraSubMenu(invoker) && parent.getComponentCount() == 0)
+ removeMenuComponent(invoker);
+ }
+ }
+ }
+
+ private boolean fitsOnScreen(final JPopupMenu popupMenu, final Component component) {
+ final int itemCount = popupMenu.getComponentCount();
+ return itemCount < getMaxMenuItemCount() && (popupMenu.getPreferredSize().height + component.getPreferredSize().height) < MAX_HEIGHT;
+ }
+
+ protected int getMaxMenuItemCount() {
+ return maxMenuItemCount;
+ }
+
+ public boolean hasExtraSubMenu(final JMenu menu) {
+ final Component lastComponent = menu.getComponent(menu.getComponentCount()-1);
+ return isExtraSubMenu(lastComponent);
+ }
+
+ public boolean isExtraSubMenu(final Component c) {
+ return (c instanceof JMenu) && (Boolean.TRUE.equals(((JMenu)c).getClientProperty(EXTRA_SUBMENU)));
+ }
+
+ public JMenu getExtraSubMenu(JMenu parentComponent) {
+ final Component lastComponent = parentComponent.getComponent(parentComponent.getComponentCount()-1);
+ if (isExtraSubMenu(lastComponent))
+ return (JMenu) lastComponent;
+ else
+ return null;
+ }
+
+ public void addMenuComponent(JMenu menu, Component component) {
+ addMenuComponent(menu, component, menu.getPopupMenu().getComponentCount());
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/MenuSplitterConfiguration.java b/freeplane/src/main/java/org/freeplane/core/ui/MenuSplitterConfiguration.java
new file mode 100644
index 0000000..33c1f26
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/MenuSplitterConfiguration.java
@@ -0,0 +1,9 @@
+package org.freeplane.core.ui;
+
+import org.freeplane.core.resources.ResourceController;
+
+public class MenuSplitterConfiguration {
+ public static final String MAX_MENU_ITEM_COUNT_KEY = "max_menu_item_count";
+ public static final int MAX_MENU_ITEM_COUNT = ResourceController.getResourceController().getIntProperty(
+ MAX_MENU_ITEM_COUNT_KEY);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/MouseInsideListener.java b/freeplane/src/main/java/org/freeplane/core/ui/MouseInsideListener.java
new file mode 100644
index 0000000..7fa9dd7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/MouseInsideListener.java
@@ -0,0 +1,80 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionListener;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.03.2013
+ */
+public class MouseInsideListener extends MouseAdapter implements MouseMotionListener{
+ private boolean mouseInside = false;
+ private final Component c;
+ public boolean isMouseInside() {
+ return mouseInside;
+ }
+ public MouseInsideListener(Component c){
+ this.c = c;
+ connect();
+ }
+ protected void connect() {
+ recursivelyAddMouseInsideListener(c);
+ }
+ @Override
+ public void mouseEntered(MouseEvent e) {
+ mouseInside = true;
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ mouseInside = false; }
+
+ @Override
+ public void mouseMoved(MouseEvent e) {
+ mouseInside = true;
+ }
+
+ private void recursivelyAddMouseInsideListener(Component c) {
+ c.addMouseListener(this);
+ c.addMouseMotionListener((MouseMotionListener) this);
+ if(c instanceof Container){
+ Container container = (Container) c;
+ for(Component childComponent : container.getComponents())
+ recursivelyAddMouseInsideListener(childComponent);
+ }
+ }
+ private void recursivelyRemoveMouseInsideListener(Component c) {
+ c.removeMouseListener(this);
+ c.removeMouseMotionListener((MouseMotionListener) this);
+ if(c instanceof Container){
+ Container container = (Container) c;
+ for(Component childComponent : container.getComponents())
+ recursivelyRemoveMouseInsideListener(childComponent);
+ }
+ }
+ public void disconnect() {
+ recursivelyRemoveMouseInsideListener(c);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/SelectableAction.java b/freeplane/src/main/java/org/freeplane/core/ui/SelectableAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/SelectableAction.java
rename to freeplane/src/main/java/org/freeplane/core/ui/SelectableAction.java
diff --git a/freeplane/src/org/freeplane/core/ui/SetAcceleratorOnNextClickAction.java b/freeplane/src/main/java/org/freeplane/core/ui/SetAcceleratorOnNextClickAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/SetAcceleratorOnNextClickAction.java
rename to freeplane/src/main/java/org/freeplane/core/ui/SetAcceleratorOnNextClickAction.java
diff --git a/freeplane/src/org/freeplane/core/ui/ShowSelectionAsRectangleAction.java b/freeplane/src/main/java/org/freeplane/core/ui/ShowSelectionAsRectangleAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/ShowSelectionAsRectangleAction.java
rename to freeplane/src/main/java/org/freeplane/core/ui/ShowSelectionAsRectangleAction.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/TimePeriodUnits.java b/freeplane/src/main/java/org/freeplane/core/ui/TimePeriodUnits.java
new file mode 100644
index 0000000..9358646
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/TimePeriodUnits.java
@@ -0,0 +1,39 @@
+package org.freeplane.core.ui;
+
+import org.freeplane.core.util.Convertible;
+
+public enum TimePeriodUnits implements Convertible{
+/*
++---------+-------------+---------------+
+| ms | Milliseconds| 1 |
++---------+-------------+---------------+
+| seconds | Seconds | 1000 ms |
++---------+-------------+---------------+
+| minutes | Minutes | 60 seconds |
++---------+-------------+---------------+
+| hours | Hours | 60 minutes |
++---------+-------------+---------------+
+| days | Days | 24 hours |
++---------+-------------+---------------+
+| weeks | Weeks | 7 days |
++---------+-------------+---------------+
+
+ */
+ ms(1d),
+ seconds (1000 * ms.factor()),
+ minutes (60 * seconds.factor()),
+ hours(60 * minutes.factor()),
+ days(24 * hours.factor()),
+ weeks(7 * days.factor());
+
+ TimePeriodUnits(double factor){
+ this.factor = factor;
+
+ }
+ final private double factor;
+ @Override
+ public double factor() {
+ return factor;
+ }
+
+ }
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/UIBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/UIBuilder.java
new file mode 100644
index 0000000..e066aae
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/UIBuilder.java
@@ -0,0 +1,205 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.util.Enumeration;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreeNode;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public abstract class UIBuilder extends IndexedTree {
+ public static final int ICON_SIZE = 16;
+
+ /**
+ *
+ */
+ public UIBuilder(final Object root) {
+ super(root);
+ }
+
+ protected void addComponent(final Container container, final Component component, final int index) {
+ container.add(component, index);
+ }
+
+ /**
+ */
+ protected void addComponent(final DefaultMutableTreeNode childNode, final int position) {
+ int index;
+ Container parentComponent = getParentComponent(childNode, Container.class);
+ if (parentComponent == null) {
+ return;
+ }
+ if (position == UIBuilder.AS_CHILD
+ && ((DefaultMutableTreeNode) childNode.getParent()).getUserObject() instanceof Container) {
+ index = getParentComponentCount(parentComponent) - 1;
+ }
+ else {
+ final Component relative = getPrevious(childNode);
+ index = -1;
+ if (relative != null) {
+ ParentLoop: for (Container nextParentComponent = parentComponent; nextParentComponent != null; nextParentComponent = getNextParentComponent(nextParentComponent)) {
+ parentComponent = nextParentComponent;
+ for (int i = 0; i < getParentComponentCount(parentComponent); i++) {
+ if (getChildComponent(parentComponent, i) == relative) {
+ index = i;
+ break ParentLoop;
+ }
+ }
+ }
+ }
+ }
+ if (position != UIBuilder.BEFORE) {
+ index++;
+ }
+ final Component component = (Component) childNode.getUserObject();
+ addComponent(parentComponent, component, index);
+ }
+
+ protected Container getNextParentComponent(Container parentComponent) {
+ return null;
+ }
+
+ @Override
+ protected void addNode(final DefaultMutableTreeNode relativeNode, final DefaultMutableTreeNode node,
+ final int position) {
+ super.addNode(relativeNode, node, position);
+ if (node.getUserObject() instanceof Component) {
+ addComponent(node, position);
+ }
+ }
+
+ protected Component getChildComponent(final Container parentComponent, final int index) {
+ return parentComponent.getComponent(index);
+ }
+
+ protected Container getContainer(final DefaultMutableTreeNode node, final Class<?> clazz) {
+ if (node == null) {
+ return null;
+ }
+ final Object userObject = node.getUserObject();
+ if (clazz.isInstance(userObject)) {
+ return (Container) userObject;
+ }
+ return getParentComponent(node, clazz);
+ }
+
+ /**
+ * @param clazz
+ */
+ Container getParentComponent(final DefaultMutableTreeNode child, final Class<?> clazz) {
+ final DefaultMutableTreeNode parent = (DefaultMutableTreeNode) child.getParent();
+ return getContainer(parent, clazz);
+ }
+
+ protected int getParentComponentCount(final Container parentComponent) {
+ return parentComponent.getComponentCount();
+ }
+
+ protected Component getPrevious(final DefaultMutableTreeNode childNode) {
+ final DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) childNode.getParent();
+ if (parentNode == null || parentNode.getUserObject() == null) {
+ return null;
+ }
+ final int childNodeIndex = parentNode.getIndex(childNode);
+ final Component c = getPrevious(parentNode, childNodeIndex - 1);
+ if (c == null) {
+ return getPrevious(parentNode);
+ }
+ return c;
+ }
+
+ /**
+ */
+ private Component getPrevious(final TreeNode parentNode, final int last) {
+ for (int i = last; i >= 0; i--) {
+ final DefaultMutableTreeNode child = (DefaultMutableTreeNode) parentNode.getChildAt(i);
+ final Object userObject = child.getUserObject();
+ if (userObject instanceof Component) {
+ return (Component) userObject;
+ }
+ final Component childComponent = getPrevious(child, child.getChildCount() - 1);
+ if (childComponent != null) {
+ return childComponent;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * @param parentComponent
+ */
+ protected void removeChildComponents(final Container parentComponent, final DefaultMutableTreeNode node) {
+ {
+ final Object userObject = node.getUserObject();
+ if (userObject instanceof Component) {
+ final Component component = (Component) userObject;
+ parentComponent.remove(component);
+ return;
+ }
+ }
+ final Enumeration<?> children = node.children();
+ while (children.hasMoreElements()) {
+ final DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
+ final Object userObject = child.getUserObject();
+ if (userObject instanceof Component) {
+ parentComponent.remove((Component) userObject);
+ }
+ else {
+ removeChildComponents(parentComponent, child);
+ }
+ }
+ }
+
+ @Override
+ public void removeChildElements(final Object key) {
+ final DefaultMutableTreeNode node = getNode(key);
+ if(node == null) {
+ return;
+ }
+ final Container parentComponent = getContainer(node, Container.class);
+ final Enumeration<?> children = node.children();
+ while (children.hasMoreElements()) {
+ final Node child = (Node) children.nextElement();
+ removeChildComponents(parentComponent, child);
+ }
+ super.removeChildElements(key);
+ }
+
+ @Override
+ public DefaultMutableTreeNode removeElement(final Object key) {
+ final DefaultMutableTreeNode node = super.removeElement(key);
+ final Container parentComponent = getParentComponent(node, Container.class);
+ if (parentComponent == null || node == null) {
+ return node;
+ }
+ removeChildComponents(parentComponent, node);
+ ((DefaultMutableTreeNode) node.getParent()).remove(node);
+ if (parentComponent.isShowing()) {
+ parentComponent.validate();
+ parentComponent.repaint();
+ }
+ return node;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/ActionToggleButtonModel.java b/freeplane/src/main/java/org/freeplane/core/ui/components/ActionToggleButtonModel.java
new file mode 100644
index 0000000..4e20289
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/ActionToggleButtonModel.java
@@ -0,0 +1,50 @@
+package org.freeplane.core.ui.components;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JToggleButton;
+
+import org.freeplane.core.ui.IFreeplaneAction;
+
+class ActionToggleButtonModel extends JToggleButton.ToggleButtonModel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private boolean ignoreSetSelected = false;
+
+ ActionToggleButtonModel(final IFreeplaneAction action) {
+ }
+
+ @Override
+ public void setSelected(boolean b) {
+ if(ignoreSetSelected)
+ return;
+ super.setSelected(b);
+ }
+
+ @Override
+ public void setPressed(boolean b) {
+ ignoreSetSelected = true;
+ try {
+ super.setPressed(b);
+ }
+ finally {
+ ignoreSetSelected = false;
+ }
+ }
+
+ @Override
+ protected void fireActionPerformed(ActionEvent e) {
+ boolean setSelectedWasIgnored = ignoreSetSelected;
+ ignoreSetSelected = false;
+ try {
+ super.fireActionPerformed(e);
+ }
+ finally {
+ ignoreSetSelected = setSelectedWasIgnored;
+ }
+ }
+
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/AutoHide.java b/freeplane/src/main/java/org/freeplane/core/ui/components/AutoHide.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/AutoHide.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/AutoHide.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/BitmapImagePreview.java b/freeplane/src/main/java/org/freeplane/core/ui/components/BitmapImagePreview.java
new file mode 100644
index 0000000..fcaae99
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/BitmapImagePreview.java
@@ -0,0 +1,105 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+/**
+ * @author Dimitry Polivaev
+ * 22.08.2009
+ */
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Image;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.border.MatteBorder;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.view.swing.features.filepreview.BitmapViewerComponent;
+
+public class BitmapImagePreview extends JComponent implements PropertyChangeListener {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ protected static final int BORDER_WIDTH = 2;
+ protected final JFileChooser fc;
+
+ public BitmapImagePreview(final JFileChooser fc) {
+ super();
+ this.fc = fc;
+ setBorder(new MatteBorder(BORDER_WIDTH, BORDER_WIDTH, BORDER_WIDTH, BORDER_WIDTH, Color.BLACK));
+ final int previewSize = ResourceController.getResourceController().getIntProperty("image_preview_size", 300);
+ setPreferredSize(new Dimension(previewSize, previewSize));
+ fc.addPropertyChangeListener(this);
+ }
+
+ public void propertyChange(final PropertyChangeEvent e) {
+ final String prop = e.getPropertyName();
+ //If the directory changed, don't show an image.
+ final File file;
+ if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {
+ file = null;
+ //If a file became selected, find out which one.
+ }
+ else if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {
+ file = (File) e.getNewValue();
+ }
+ else {
+ return;
+ }
+ if (file == null || !file.exists()) {
+ return;
+ }
+ if (getComponentCount() == 1) {
+ remove(0);
+ }
+ repaint();
+ try {
+ updateView(file);
+ }
+ catch (final MalformedURLException e1) {
+ LogUtils.warn(e1);
+ }
+ catch (final IOException e1) {
+ LogUtils.warn(e1);
+ }
+ }
+
+ protected void updateView(final File file) throws MalformedURLException, IOException {
+ final BitmapViewerComponent viewer = new BitmapViewerComponent(file.toURI());
+ viewer.setHint(Image.SCALE_FAST);
+ final Dimension size = getSize();
+ size.width -= 2 * BORDER_WIDTH;
+ size.height -= 2 * BORDER_WIDTH;
+ viewer.setPreferredSize(size);
+ viewer.setSize(size);
+ viewer.setLocation(BORDER_WIDTH, BORDER_WIDTH);
+ add(viewer);
+ viewer.revalidate();
+ viewer.repaint();
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/BlindIcon.java b/freeplane/src/main/java/org/freeplane/core/ui/components/BlindIcon.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/BlindIcon.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/BlindIcon.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/ContainerComboBoxEditor.java b/freeplane/src/main/java/org/freeplane/core/ui/components/ContainerComboBoxEditor.java
new file mode 100644
index 0000000..5499a2a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/ContainerComboBoxEditor.java
@@ -0,0 +1,133 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.CardLayout;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.swing.Box;
+import javax.swing.ComboBoxEditor;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+
+import org.freeplane.core.resources.TranslatedObject;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 12, 2011
+ */
+public class ContainerComboBoxEditor implements ComboBoxEditor {
+ final private Map<TranslatedObject, ComboBoxEditor> editors;
+ private ComboBoxEditor editor;
+ final private JComboBox editorSelector;
+ final private JPanel editorPanel;
+ private Box editorComponent;
+
+ final private List<ActionListener> actionListeners;
+
+ public ContainerComboBoxEditor() {
+ editors = new HashMap<TranslatedObject, ComboBoxEditor>();
+ editorComponent = Box.createHorizontalBox();
+ editorSelector = new JComboBoxWithBorder();
+ editorSelector.setEditable(false);
+ editorSelector.setRenderer(TranslatedObject.getIconRenderer());
+ editorSelector.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ final TranslatedObject key = (TranslatedObject) editorSelector.getSelectedItem();
+ editor = editors.get(key);
+ final CardLayout layout = (CardLayout) editorPanel.getLayout();
+ layout.show(editorPanel, key.getObject().toString());
+ editor.getEditorComponent().requestFocusInWindow();
+ final ActionEvent actionEvent = new ActionEvent(editor, 0, null);
+ for (final ActionListener l : actionListeners) {
+ l.actionPerformed(actionEvent);
+ }
+ }
+ });
+ editorComponent.add(editorSelector);
+ editorPanel = new JPanel(new CardLayout(0, 0));
+ editorComponent.add(editorPanel);
+ actionListeners = new LinkedList<ActionListener>();
+ }
+
+ public boolean put(TranslatedObject key, ComboBoxEditor editor){
+ final ComboBoxEditor oldEditor = editors.put(key, editor);
+ if(oldEditor != null){
+ editors.put(key, oldEditor);
+ return false;
+ }
+ final DefaultComboBoxModel model = (DefaultComboBoxModel) editorSelector.getModel();
+ model.addElement(key);
+ if(this.editor == null){
+ this.editor = editor;
+ }
+ editorPanel.add(editor.getEditorComponent(), key.getObject().toString());
+ return true;
+ }
+
+ public Component getEditorComponent() {
+ return editorComponent;
+ }
+
+ public void setItem(Object anObject) {
+ if(anObject == null){
+ setItem("");
+ return;
+ }
+ for(Entry<TranslatedObject, ComboBoxEditor> editorEntry: editors.entrySet()){
+ final ComboBoxEditor editor = editorEntry.getValue();
+ editor.setItem(anObject);
+ final Object item = editor.getItem();
+ TranslatedObject key = editorEntry.getKey();
+ if(anObject.equals(item) && ! key.equals(editorSelector.getSelectedItem())){
+ editorSelector.setSelectedItem(key);
+ return;
+ }
+ }
+ }
+
+ public Object getItem() {
+ return editor.getItem();
+ }
+
+ public void selectAll() {
+ editor.selectAll();
+ }
+
+ public void addActionListener(ActionListener l) {
+ actionListeners.add(l);
+ for(ComboBoxEditor e : editors.values())
+ e.addActionListener(l);
+ }
+
+ public void removeActionListener(ActionListener l) {
+ actionListeners.remove(l);
+ for(ComboBoxEditor e : editors.values())
+ e.removeActionListener(l);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/EnterPasswordDialog.java b/freeplane/src/main/java/org/freeplane/core/ui/components/EnterPasswordDialog.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/EnterPasswordDialog.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/EnterPasswordDialog.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/FButtonBar.java b/freeplane/src/main/java/org/freeplane/core/ui/components/FButtonBar.java
new file mode 100644
index 0000000..38e03db
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/FButtonBar.java
@@ -0,0 +1,365 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.KeyEventDispatcher;
+import java.awt.KeyboardFocusManager;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowFocusListener;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JRootPane;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+import javax.swing.Timer;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IAcceleratorChangeListener;
+import org.freeplane.core.ui.IKeyStrokeProcessor;
+import org.freeplane.core.ui.SetAcceleratorOnNextClickAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * 03.07.2009
+ */
+public class FButtonBar extends JComponent implements IAcceleratorChangeListener, KeyEventDispatcher,
+ WindowFocusListener, IKeyStrokeProcessor {
+ private static final int BUTTON_NUMBER = 12;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private Map<Integer, JButton[]> buttons;
+ private int lastModifiers = -1;
+ private int nextModifiers = 0;
+ private JFrame ownWindowAncestor;
+ final private Timer timer;
+ public FButtonBar(JRootPane rootPane) {
+ timer = new Timer(500, new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ onModifierChangeImpl();
+ }
+ });
+ timer.setRepeats(false);
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
+ buttons = new HashMap<Integer, JButton[]>();
+ onModifierChange();
+ }
+
+ public void acceleratorChanged(final AFreeplaneAction action, final KeyStroke oldStroke, final KeyStroke newStroke) {
+ final int oldButtonNumber = oldStroke != null ? oldStroke.getKeyCode() - KeyEvent.VK_F1 : -1;
+ final int newButtonNumber = newStroke != null ? newStroke.getKeyCode() - KeyEvent.VK_F1 : -1;
+ if (oldButtonNumber >= 0 && oldButtonNumber < BUTTON_NUMBER) {
+ final int modifiers = oldStroke.getModifiers()
+ & (KeyEvent.CTRL_MASK | KeyEvent.META_MASK | KeyEvent.SHIFT_MASK | KeyEvent.ALT_MASK | KeyEvent.ALT_GRAPH_MASK);
+ final JButton[] buttonRow = buttons.get(modifiers);
+ final JButton button = buttonRow[oldButtonNumber];
+ setAcceleratorAction(button, oldStroke);
+ }
+ if (newButtonNumber >= 0 && newButtonNumber < BUTTON_NUMBER) {
+ final int modifiers = newStroke.getModifiers()
+ & (KeyEvent.CTRL_MASK | KeyEvent.META_MASK | KeyEvent.SHIFT_MASK | KeyEvent.ALT_MASK | KeyEvent.ALT_GRAPH_MASK);
+ final JButton[] buttonRow = createButtons(modifiers);
+ final JButton button = buttonRow[newButtonNumber];
+ final String text = (String) action.getValue(Action.NAME);
+ button.setText(text);
+ button.setToolTipText(text);
+ button.setAction(action);
+ button.setEnabled(action.isEnabled());
+ }
+ }
+
+
+ private void setAcceleratorAction(final JButton button, final KeyStroke ks) {
+ final SetAcceleratorOnNextClickAction setAcceleratorAction = new SetAcceleratorOnNextClickAction(ks);
+ button.setAction(setAcceleratorAction);
+ final String text = TextUtils.getText("f_button_unassigned");
+ button.setText(text);
+ button.setToolTipText(setAcceleratorAction.getValue(Action.NAME).toString());
+ }
+
+ private void cleanModifiers(final int modifiers) {
+ if ((nextModifiers & modifiers) == 0) {
+ return;
+ }
+ nextModifiers &= ~modifiers;
+ onModifierChange();
+ }
+
+ private JButton[] createButtonRow(final int modifiers) {
+ final JButton[] buttons = new JButton[BUTTON_NUMBER];
+ for (int i = 0; i < BUTTON_NUMBER; i++) {
+ final String name = "/images/f" + (i + 1) + ".png";
+ final JButton button = buttons[i] = new JButton(new ImageIcon(
+ ResourceController.getResourceController().getResource(name))) {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void configurePropertiesFromAction(final Action a) {
+ }
+ };
+ button.setFocusable(false);
+ button.setBorder(BorderFactory.createEtchedBorder());
+ if (System.getProperty("os.name").startsWith("Mac OS")) {
+ button.setBorderPainted(false);
+ }
+ KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F1 + i, modifiers);
+ setAcceleratorAction(button, ks);
+
+ }
+ return buttons;
+ }
+
+ private JButton[] createButtons(final int modifiers) {
+ JButton[] buttonRow = buttons.get(modifiers);
+ if (buttonRow == null) {
+ buttonRow = createButtonRow(modifiers);
+ buttons.put(modifiers, buttonRow);
+ }
+ return buttonRow;
+ }
+
+ private boolean altPressedEventHidden = false;
+
+ public boolean dispatchKeyEvent(final KeyEvent e) {
+ if(! (Controller.getCurrentModeController() instanceof MModeController ))
+ return false;
+ if (ownWindowAncestor == null) {
+ ownWindowAncestor = (JFrame) SwingUtilities.getWindowAncestor(this);
+ if (ownWindowAncestor == null) {
+ return false;
+ }
+ ownWindowAncestor.addWindowFocusListener(this);
+ }
+ final Window windowAncestor = SwingUtilities.getWindowAncestor(e.getComponent());
+
+ if (windowAncestor == ownWindowAncestor && ownWindowAncestor.getJMenuBar() != null && ownWindowAncestor.getJMenuBar().isEnabled()) {
+ processDispatchedKeyEvent(e);
+ }
+ else {
+ resetModifiers();
+ }
+ if(e.getKeyCode() == KeyEvent.VK_ALT) {
+ switch(e.getID()){
+ case KeyEvent.KEY_PRESSED:{
+ final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ return altPressedEventHidden = ! (focusOwner instanceof JRootPane || 0 == (e.getModifiersEx() & ~(KeyEvent.ALT_MASK | KeyEvent.ALT_DOWN_MASK)));
+ }
+ case KeyEvent.KEY_RELEASED:
+ if(altPressedEventHidden) {
+ altPressedEventHidden = false;
+ return true;
+ }
+ break;
+ }
+ }
+ return false;
+ }
+
+ private void onModifierChange() {
+ if (lastModifiers == nextModifiers) {
+ return;
+ }
+ if (timer.isRunning()) {
+ timer.stop();
+ }
+ if (nextModifiers == 0) {
+ onModifierChangeImpl();
+ }
+ else {
+ timer.start();
+ }
+ }
+
+ private void onModifierChangeImpl() {
+ if (lastModifiers == nextModifiers) {
+ return;
+ }
+ lastModifiers = nextModifiers;
+ removeAll();
+ final JButton[] buttonRow = createButtons(nextModifiers);
+ for (final JButton button : buttonRow) {
+ add(button);
+ }
+ revalidate();
+ repaint();
+ }
+
+ private void processDispatchedKeyEvent(final KeyEvent e) {
+ final int keyCode = e.getKeyCode();
+ switch (e.getID()) {
+ case KeyEvent.KEY_PRESSED:
+ switch (keyCode) {
+ case KeyEvent.VK_CONTROL:
+ setModifiers(KeyEvent.CTRL_MASK);
+ break;
+ case KeyEvent.VK_META:
+ setModifiers(KeyEvent.META_MASK);
+ break;
+ case KeyEvent.VK_SHIFT:
+ setModifiers(KeyEvent.SHIFT_MASK);
+ break;
+ case KeyEvent.VK_ALT:
+ setModifiers(KeyEvent.ALT_MASK);
+ break;
+ case KeyEvent.VK_ALT_GRAPH:
+ setModifiers(KeyEvent.ALT_GRAPH_MASK);
+ break;
+ }
+ break;
+ case KeyEvent.KEY_RELEASED:
+ switch (keyCode) {
+ case KeyEvent.VK_CONTROL:
+ cleanModifiers(KeyEvent.CTRL_MASK);
+ break;
+ case KeyEvent.VK_META:
+ cleanModifiers(KeyEvent.META_MASK);
+ break;
+ case KeyEvent.VK_SHIFT:
+ cleanModifiers(KeyEvent.SHIFT_MASK);
+ break;
+ case KeyEvent.VK_ALT:
+ cleanModifiers(KeyEvent.ALT_MASK);
+ break;
+ case KeyEvent.VK_ALT_GRAPH:
+ cleanModifiers(KeyEvent.ALT_GRAPH_MASK);
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ @Override
+ public boolean processKeyBinding(KeyStroke ks, KeyEvent e) {
+ return processFKey(e);
+ }
+
+ private boolean processFKey(final KeyEvent e){
+ if(e.getID() != KeyEvent.KEY_PRESSED)
+ return false;
+ final Window windowAncestor = SwingUtilities.getWindowAncestor(e.getComponent());
+ if (windowAncestor != ownWindowAncestor) {
+ resetModifiers();
+ return false;
+ }
+ int keyCode = e.getKeyCode();
+ if (keyCode >= KeyEvent.VK_F1 && keyCode <= KeyEvent.VK_F12 ) {
+ final JButton btn = createButtons(nextModifiers)[keyCode - KeyEvent.VK_F1];
+ if(btn.getAction() instanceof SetAcceleratorOnNextClickAction
+ && e.getComponent() instanceof JTextComponent)
+ return false;
+ if(timer.isRunning()){
+ timer.stop();
+ onModifierChangeImpl();
+ }
+ btn.doClick();
+ return true;
+ }
+ return false;
+ }
+
+ private void resetModifiers() {
+ if (nextModifiers == 0) {
+ return;
+ }
+ nextModifiers = 0;
+ onModifierChange();
+ }
+
+ private void setModifiers(final int modifiers) {
+ if ((modifiers & ~ nextModifiers) == 0) {
+ return;
+ }
+ nextModifiers |= modifiers;
+ onModifierChange();
+ }
+
+ public void windowGainedFocus(final WindowEvent e) {
+ }
+
+ public void windowLostFocus(final WindowEvent e) {
+ resetModifiers();
+ }
+
+ @Override
+ public void layout() {
+ final int w = getParent().getWidth();
+ final int border = 5;
+ final int h = getComponent(1).getPreferredSize().height;
+ final int componentCount = getComponentCount();
+ final float availableWidth = w - 2 * border + 0f;
+ final float dw = availableWidth / componentCount;
+ int preferredWidth = 0;
+ int narrowComponentPreferredWidth = 0;
+ for (int i = 0; i < componentCount; i++) {
+ final int cw = getComponent(i).getPreferredSize().width;
+ preferredWidth += cw;
+ if (cw <= dw) {
+ narrowComponentPreferredWidth += cw;
+ }
+ }
+ final float k;
+ if (availableWidth < preferredWidth) {
+ k = (availableWidth - narrowComponentPreferredWidth) / (preferredWidth - narrowComponentPreferredWidth);
+ }
+ else {
+ k = availableWidth / preferredWidth;
+ }
+ float x = border;
+ for (int i = 0; i < componentCount; i++) {
+ float cw = getComponent(i).getPreferredSize().width;
+ if (k > 1f || cw > dw) {
+ cw *= k;
+ }
+ getComponent(i).setBounds((int) x, 0, (int) cw, h);
+ x += cw;
+ }
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ return new Dimension(getParent().getWidth(), getComponent(1).getPreferredSize().height);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/FreeplaneMenuBar.java b/freeplane/src/main/java/org/freeplane/core/ui/components/FreeplaneMenuBar.java
new file mode 100644
index 0000000..7c47000
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/FreeplaneMenuBar.java
@@ -0,0 +1,100 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.event.KeyEvent;
+
+import javax.swing.JMenuBar;
+import javax.swing.KeyStroke;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.ui.IKeyStrokeProcessor;
+
+/**
+ * This is the menu bar for Freeplane. Actions are defined in MenuListener.
+ * Moreover, the StructuredMenuHolder of all menus are hold here.
+ */
+public class FreeplaneMenuBar extends JMenuBar {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private IKeyStrokeProcessor keyEventProcessor;
+
+ public FreeplaneMenuBar(IKeyStrokeProcessor keyEventProcessor) {
+ this.keyEventProcessor = keyEventProcessor;
+ getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F10, 0), "none");
+ }
+
+ static final int KEY_MODIFIERS = KeyEvent.SHIFT_DOWN_MASK | KeyEvent.SHIFT_MASK | KeyEvent.ALT_GRAPH_DOWN_MASK
+ | KeyEvent.ALT_GRAPH_MASK;
+
+ public static KeyStroke derive(final KeyStroke ks, final Character keyChar) {
+ if (ks == null) {
+ return ks;
+ }
+ final int modifiers = ks.getModifiers();
+ if (ks.getKeyChar() == KeyEvent.CHAR_UNDEFINED) {
+ if (0 != (modifiers & KEY_MODIFIERS)) {
+ switch (keyChar) {
+ case '<':
+ return KeyStroke
+ .getKeyStroke(KeyEvent.VK_LESS, modifiers & ~KEY_MODIFIERS, ks.isOnKeyRelease());
+ case '>':
+ return KeyStroke.getKeyStroke(KeyEvent.VK_GREATER, modifiers & ~KEY_MODIFIERS, ks
+ .isOnKeyRelease());
+ case '+':
+ return KeyStroke
+ .getKeyStroke(KeyEvent.VK_PLUS, modifiers & ~KEY_MODIFIERS, ks.isOnKeyRelease());
+ case '-':
+ return KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, modifiers & ~KEY_MODIFIERS, ks
+ .isOnKeyRelease());
+ case '=':
+ return KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, modifiers & ~KEY_MODIFIERS, ks
+ .isOnKeyRelease());
+ case '.':
+ return KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, modifiers & ~KEY_MODIFIERS, ks
+ .isOnKeyRelease());
+ }
+ }
+ if (keyChar != '\0' && keyChar != KeyEvent.CHAR_UNDEFINED) {
+ return KeyStroke.getKeyStroke(keyChar, modifiers);
+ }
+ }
+ return ks;
+ }
+
+ @Override
+ public boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
+ // ignore key events without modifiers if text component is a source
+ if (e.getKeyChar() != KeyEvent.CHAR_UNDEFINED && e.getKeyChar() != '\0' && e.getKeyChar() != KeyEvent.VK_ESCAPE
+ && 0 == (e.getModifiers() & ~KEY_MODIFIERS) && e.getSource() instanceof JTextComponent) {
+ return false;
+ }
+ if (keyEventProcessor.processKeyBinding(ks, e) || super.processKeyBinding(ks, e, condition, pressed)) {
+ return true;
+ }
+ final KeyStroke derivedKS = FreeplaneMenuBar.derive(ks, e.getKeyChar());
+ if (derivedKS == ks) {
+ return false;
+ }
+ return super.processKeyBinding(derivedKS, e, condition, pressed);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/FreeplaneToolBar.java b/freeplane/src/main/java/org/freeplane/core/ui/components/FreeplaneToolBar.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/FreeplaneToolBar.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/FreeplaneToolBar.java
diff --git a/freeplane/src/org/freeplane/core/ui/components/IKeyBindingManager.java b/freeplane/src/main/java/org/freeplane/core/ui/components/IKeyBindingManager.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/IKeyBindingManager.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/IKeyBindingManager.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/IconSelectionPopupDialog.java b/freeplane/src/main/java/org/freeplane/core/ui/components/IconSelectionPopupDialog.java
new file mode 100644
index 0000000..0fac805
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/IconSelectionPopupDialog.java
@@ -0,0 +1,360 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * @author <a href="mailto:labe at users.sourceforge.net">Lars Berning</a>
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.GridLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.List;
+
+import javax.swing.BorderFactory;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.KeyStroke;
+import javax.swing.WindowConstants;
+import javax.swing.border.BevelBorder;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.IIconInformation;
+
+public class IconSelectionPopupDialog extends JDialog implements KeyListener, MouseListener {
+ static class Position {
+ final private int x, y;
+
+ public Position(final int x, final int y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ /**
+ * @return Returns the x.
+ */
+ public int getX() {
+ return x;
+ }
+
+ /**
+ * @return Returns the y.
+ */
+ public int getY() {
+ return y;
+ }
+
+ @Override
+ public String toString() {
+ return ("(" + getX() + "," + getY() + ")");
+ }
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private JLabel descriptionLabel;
+ final private JLabel[] iconLabels;
+ final private JPanel iconPanel = new JPanel();
+ final private List<? extends IIconInformation> icons;
+ private int mModifiers;
+ final private int numOfIcons;
+ private int result;
+ private Position selected = new Position(0, 0);
+ final private int xDimension;
+ private int yDimension;
+
+ public IconSelectionPopupDialog(final Frame frame, final List<? extends IIconInformation> icons) {
+ super(frame, TextUtils.getText("select_icon"));
+ getContentPane().setLayout(new BorderLayout());
+ this.icons = icons;
+ setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(final WindowEvent we) {
+ close();
+ }
+ });
+ numOfIcons = icons.size();
+ xDimension = (int) Math.ceil(Math.sqrt(numOfIcons));
+ if (numOfIcons <= xDimension * (xDimension - 1)) {
+ yDimension = xDimension - 1;
+ }
+ else {
+ yDimension = xDimension;
+ }
+ final GridLayout gridlayout = new GridLayout(0, xDimension);
+ gridlayout.setHgap(3);
+ gridlayout.setVgap(3);
+ iconPanel.setLayout(gridlayout);
+ iconLabels = new JLabel[numOfIcons];
+ for (int i = 0; i < numOfIcons; ++i) {
+ final IIconInformation icon = icons.get(i);
+ iconPanel.add(iconLabels[i] = new JLabel(icon.getIcon()));
+ iconLabels[i].setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
+ iconLabels[i].addMouseListener(this);
+ }
+ final int perIconSize = 27;
+ iconPanel.setPreferredSize(new Dimension(xDimension * perIconSize, yDimension * perIconSize));
+ iconPanel.setMinimumSize(new Dimension(xDimension * perIconSize, yDimension * perIconSize));
+ iconPanel.setMaximumSize(new Dimension(xDimension * perIconSize, yDimension * perIconSize));
+ iconPanel.setSize(new Dimension(xDimension * perIconSize, yDimension * perIconSize));
+ getContentPane().add(iconPanel, BorderLayout.CENTER);
+ descriptionLabel = new JLabel(" ");
+ getContentPane().add(descriptionLabel, BorderLayout.SOUTH);
+ setSelectedPosition(new Position(0, 0));
+ select(getSelectedPosition());
+ addKeyListener(this);
+ pack();
+ }
+
+ private void addIcon(final int pModifiers) {
+ result = calculateIndex(getSelectedPosition());
+ mModifiers = pModifiers;
+ this.dispose();
+ }
+
+ private int calculateIndex(final Position position) {
+ return position.getY() * xDimension + position.getX();
+ }
+
+ private boolean canSelect(final Position position) {
+ return ((position.getX() >= 0) && (position.getX() < xDimension) && (position.getY() >= 0)
+ && (position.getY() < yDimension) && (calculateIndex(position) < numOfIcons));
+ }
+
+ private void close() {
+ result = -1;
+ mModifiers = 0;
+ this.dispose();
+ }
+
+ private void cursorDown() {
+ final Position newPosition = new Position(getSelectedPosition().getX(), getSelectedPosition().getY() + 1);
+ if (canSelect(newPosition)) {
+ select(newPosition);
+ }
+ }
+
+ private void cursorLeft() {
+ final Position newPosition = new Position(getSelectedPosition().getX() - 1, getSelectedPosition().getY());
+ if (canSelect(newPosition)) {
+ select(newPosition);
+ }
+ }
+
+ private void cursorRight() {
+ final Position newPosition = new Position(getSelectedPosition().getX() + 1, getSelectedPosition().getY());
+ if (canSelect(newPosition)) {
+ select(newPosition);
+ }
+ }
+
+ private void cursorUp() {
+ final Position newPosition = new Position(getSelectedPosition().getX(), getSelectedPosition().getY() - 1);
+ if (canSelect(newPosition)) {
+ select(newPosition);
+ }
+ }
+
+ private int findIndexByKeyEvent(final KeyEvent keyEvent) {
+ for (int i = 0; i < icons.size(); i++) {
+ final IIconInformation info = icons.get(i);
+ final KeyStroke iconKeyStroke = info.getKeyStroke();
+ if (iconKeyStroke != null
+ && (keyEvent.getKeyCode() == iconKeyStroke.getKeyCode()
+ && keyEvent.getKeyCode() != 0
+ && (iconKeyStroke.getModifiers() & InputEvent.SHIFT_MASK) == (keyEvent.getModifiers() & InputEvent.SHIFT_MASK) || keyEvent
+ .getKeyChar() == iconKeyStroke.getKeyChar()) && keyEvent.getKeyChar() != 0
+ && keyEvent.getKeyChar() != KeyEvent.CHAR_UNDEFINED) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Transfer shift masks from InputEvent to ActionEvent. But, why don't they
+ * use the same constants???? Java miracle.
+ */
+ public int getModifiers() {
+ int m = mModifiers;
+ if ((mModifiers & (ActionEvent.SHIFT_MASK | InputEvent.SHIFT_DOWN_MASK)) != 0) {
+ m |= ActionEvent.SHIFT_MASK;
+ }
+ if ((mModifiers & (ActionEvent.CTRL_MASK | InputEvent.CTRL_DOWN_MASK)) != 0) {
+ m |= ActionEvent.CTRL_MASK;
+ }
+ if ((mModifiers & (ActionEvent.META_MASK | InputEvent.META_DOWN_MASK)) != 0) {
+ m |= ActionEvent.META_MASK;
+ }
+ if ((mModifiers & (ActionEvent.ALT_MASK | InputEvent.ALT_DOWN_MASK)) != 0) {
+ m |= ActionEvent.ALT_MASK;
+ }
+ return m;
+ }
+
+ private Position getPosition(final JLabel caller) {
+ int index = 0;
+ for (index = 0; index < iconLabels.length; index++) {
+ if (caller == iconLabels[index]) {
+ break;
+ }
+ }
+ return new Position(index % xDimension, index / xDimension);
+ }
+
+ public int getResult() {
+ return result;
+ }
+
+ private Position getSelectedPosition() {
+ return selected;
+ }
+
+ private void highlight(final Position position) {
+ iconLabels[calculateIndex(position)].setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
+ */
+ public void keyPressed(final KeyEvent keyEvent) {
+ switch (keyEvent.getKeyCode()) {
+ case KeyEvent.VK_RIGHT:
+ case KeyEvent.VK_KP_RIGHT:
+ cursorRight();
+ return;
+ case KeyEvent.VK_LEFT:
+ case KeyEvent.VK_KP_LEFT:
+ cursorLeft();
+ return;
+ case KeyEvent.VK_DOWN:
+ case KeyEvent.VK_KP_DOWN:
+ cursorDown();
+ return;
+ case KeyEvent.VK_UP:
+ case KeyEvent.VK_KP_UP:
+ cursorUp();
+ return;
+ case KeyEvent.VK_ESCAPE:
+ keyEvent.consume();
+ close();
+ return;
+ case KeyEvent.VK_ENTER:
+ case KeyEvent.VK_SPACE:
+ keyEvent.consume();
+ addIcon(keyEvent.getModifiers());
+ return;
+ }
+ final int index = findIndexByKeyEvent(keyEvent);
+ if (index != -1) {
+ result = index;
+ mModifiers = keyEvent.getModifiers();
+ keyEvent.consume();
+ this.dispose();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
+ */
+ public void keyReleased(final KeyEvent arg0) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
+ */
+ public void keyTyped(final KeyEvent arg0) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
+ */
+ public void mouseClicked(final MouseEvent mouseEvent) {
+ addIcon(mouseEvent.getModifiers());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
+ */
+ public void mouseEntered(final MouseEvent arg0) {
+ select(getPosition((JLabel) arg0.getSource()));
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
+ */
+ public void mouseExited(final MouseEvent arg0) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
+ */
+ public void mousePressed(final MouseEvent arg0) {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
+ */
+ public void mouseReleased(final MouseEvent arg0) {
+ }
+
+ private void select(final Position position) {
+ unhighlight(getSelectedPosition());
+ setSelectedPosition(position);
+ highlight(position);
+ final int index = calculateIndex(position);
+ final IIconInformation iconInformation = icons.get(index);
+ final String keyStroke = ResourceController.getResourceController().getProperty(iconInformation.getShortcutKey());
+ if (keyStroke != null) {
+ descriptionLabel.setText(iconInformation.getTranslationValueLabel() + ", " + keyStroke);
+ }
+ else {
+ descriptionLabel.setText(iconInformation.getTranslationValueLabel());
+ }
+ }
+
+ private void setSelectedPosition(final Position position) {
+ selected = position;
+ }
+
+ private void unhighlight(final Position position) {
+ iconLabels[calculateIndex(position)].setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/JAutoCheckBoxMenuItem.java b/freeplane/src/main/java/org/freeplane/core/ui/components/JAutoCheckBoxMenuItem.java
new file mode 100644
index 0000000..eb8e9f1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/JAutoCheckBoxMenuItem.java
@@ -0,0 +1,74 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.event.KeyEvent;
+import java.beans.PropertyChangeListener;
+
+import javax.swing.Action;
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.IFreeplaneAction;
+
+
+public class JAutoCheckBoxMenuItem extends JCheckBoxMenuItem implements IKeyBindingManager {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public JAutoCheckBoxMenuItem(final IFreeplaneAction a) {
+ super();
+ setModel(new ActionToggleButtonModel(a));
+ setAction(a);
+ }
+
+
+
+ @Override
+ protected void configurePropertiesFromAction(Action a) {
+ super.configurePropertiesFromAction(a);
+ if(a != null)
+ setSelected(((IFreeplaneAction)a).isSelected());
+ }
+
+ @Override
+ protected PropertyChangeListener createActionPropertyChangeListener(final Action a) {
+ return new PropertyChangeListenerWithSelectionSupport(this, super.createActionPropertyChangeListener(a));
+ };
+
+ private boolean isKeyBindingProcessed = false;
+
+ @Override
+ protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
+ try {
+ isKeyBindingProcessed = true;
+ return super.processKeyBinding(ks, e, condition, pressed);
+ }
+ finally {
+ isKeyBindingProcessed = false;
+ }
+ }
+
+ public boolean isKeyBindingProcessed() {
+ return isKeyBindingProcessed;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/JAutoRadioButtonMenuItem.java b/freeplane/src/main/java/org/freeplane/core/ui/components/JAutoRadioButtonMenuItem.java
new file mode 100644
index 0000000..64c143d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/JAutoRadioButtonMenuItem.java
@@ -0,0 +1,75 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.event.KeyEvent;
+import java.beans.PropertyChangeListener;
+
+import javax.swing.Action;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.IFreeplaneAction;
+
+/**
+ * @author Dimitry Polivaev
+ * Feb 23, 2009
+ */
+public class JAutoRadioButtonMenuItem extends JRadioButtonMenuItem implements IKeyBindingManager {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public JAutoRadioButtonMenuItem(final IFreeplaneAction a) {
+ super();
+ setModel(new ActionToggleButtonModel(a));
+ setAction(a);
+ }
+
+ @Override
+ protected void configurePropertiesFromAction(Action a) {
+ super.configurePropertiesFromAction(a);
+ if(a != null)
+ setSelected(((IFreeplaneAction)a).isSelected());
+ }
+
+ @Override
+ protected PropertyChangeListener createActionPropertyChangeListener(final Action a) {
+ return new PropertyChangeListenerWithSelectionSupport(this, super.createActionPropertyChangeListener(a));
+ };
+
+ private boolean isKeyBindingProcessed = false;
+
+ @Override
+ protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
+ try {
+ isKeyBindingProcessed = true;
+ return super.processKeyBinding(ks, e, condition, pressed);
+ }
+ finally {
+ isKeyBindingProcessed = false;
+ }
+ }
+
+ public boolean isKeyBindingProcessed() {
+ return isKeyBindingProcessed;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/JAutoScrollBarPane.java b/freeplane/src/main/java/org/freeplane/core/ui/components/JAutoScrollBarPane.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/JAutoScrollBarPane.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/JAutoScrollBarPane.java
diff --git a/freeplane/src/org/freeplane/core/ui/components/JAutoToggleButton.java b/freeplane/src/main/java/org/freeplane/core/ui/components/JAutoToggleButton.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/JAutoToggleButton.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/JAutoToggleButton.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/JComboBoxWithBorder.java b/freeplane/src/main/java/org/freeplane/core/ui/components/JComboBoxWithBorder.java
new file mode 100644
index 0000000..79efd2d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/JComboBoxWithBorder.java
@@ -0,0 +1,78 @@
+package org.freeplane.core.ui.components;
+
+import java.awt.Component;
+import java.util.Vector;
+
+import javax.swing.ComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JList;
+import javax.swing.ListCellRenderer;
+import javax.swing.border.Border;
+import javax.swing.border.EmptyBorder;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+
+ at SuppressWarnings("serial")
+public class JComboBoxWithBorder extends JComboBox{
+ private RendererWithBorder rendererWithBorder;
+ static private final int MARGIN = new Quantity<LengthUnits>(2, LengthUnits.pt).toBaseUnitsRounded();
+ static private final Border STANDARD_BORDER = new EmptyBorder(0, MARGIN, 0, MARGIN);
+ class RendererWithBorder implements ListCellRenderer{
+ @Override
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
+ boolean cellHasFocus) {
+ final ListCellRenderer baseRenderer = getBaseRenderer();
+ if(baseRenderer == null)
+ return null;
+ final Component listCellRendererComponent = baseRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+ if(listCellRendererComponent instanceof JComponent) {
+ final JComponent borderOwner = (JComponent) listCellRendererComponent;
+ borderOwner.setBorder(STANDARD_BORDER);
+ }
+ return listCellRendererComponent;
+ }
+
+ }
+
+ public JComboBoxWithBorder() {
+ super();
+ initializeRenderer();
+ }
+
+ public JComboBoxWithBorder(ComboBoxModel aModel) {
+ super(aModel);
+ initializeRenderer();
+ }
+
+ public JComboBoxWithBorder(Object[] items) {
+ super(items);
+ initializeRenderer();
+ }
+
+ public JComboBoxWithBorder(Vector<?> items) {
+ super(items);
+ initializeRenderer();
+ }
+
+ private void initializeRenderer() {
+ rendererWithBorder = new RendererWithBorder();
+ updateUI();
+ }
+
+ @Override
+ public ListCellRenderer getRenderer() {
+ if(rendererWithBorder == null)
+ return super.getRenderer();
+ else
+ return rendererWithBorder;
+ }
+
+
+
+ private ListCellRenderer getBaseRenderer() {
+ return super.getRenderer();
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/JFreeplaneMenuItem.java b/freeplane/src/main/java/org/freeplane/core/ui/components/JFreeplaneMenuItem.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/JFreeplaneMenuItem.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/JFreeplaneMenuItem.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/JResizer.java b/freeplane/src/main/java/org/freeplane/core/ui/components/JResizer.java
new file mode 100644
index 0000000..3e8c865
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/JResizer.java
@@ -0,0 +1,220 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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 CONTROL_SIZE of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.event.ComponentListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionAdapter;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import javax.swing.Box;
+import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
+
+/**
+ * @author Dimitry Polivaev
+ * Jan 24, 2011
+ */
+ at SuppressWarnings("serial")
+public class JResizer extends JComponent {
+ private static final int CONTROL_SIZE = 5;
+ protected boolean sliderLock = false;
+ protected Point point;
+ private int index;
+ public enum Direction {RIGHT, LEFT, UP, DOWN;
+ public Box createBox() {
+ switch (this) {
+ case RIGHT:
+ case LEFT:
+ return Box.createHorizontalBox();
+ default:
+ return Box.createVerticalBox();
+ }
+ }
+
+ public int getPreferredSize(final Component component) {
+ final Dimension preferredSize = component.getPreferredSize();
+ switch (this) {
+ case RIGHT:
+ case LEFT:
+ return preferredSize.width;
+ default:
+ return preferredSize.height;
+ }
+ }
+
+ public void setPreferredSize(Component component, int size) {
+ switch (this) {
+ case RIGHT:
+ case LEFT:
+ component.setPreferredSize(new Dimension(size, 1));
+ return;
+ default:
+ component.setPreferredSize(new Dimension(1, size));
+ }
+ }
+ }
+
+ private final Set<ResizerListener> resizeListener = new LinkedHashSet<ResizerListener>();
+
+ public JResizer(final Direction d) {
+ setOpaque(true);
+ final int w;
+ final int h;
+ if(d.equals(Direction.RIGHT)){
+ w = CONTROL_SIZE;
+ h = 0;
+ setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
+ }
+ else if(d.equals(Direction.LEFT)){
+ h = CONTROL_SIZE;
+ w = 0;
+ setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
+ }
+ else if(d.equals(Direction.UP)){
+ h = 0;
+ w = CONTROL_SIZE;
+ setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));
+ }
+ else /*Direction.DOWN*/ {
+ h = 0;
+ w = CONTROL_SIZE;
+ setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
+ }
+
+ setPreferredSize(new Dimension(w, h));
+ addMouseListener(new MouseAdapter() {
+
+
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ point = null;
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ point = null;
+ }
+
+ });
+ addMouseMotionListener(new MouseMotionAdapter() {
+
+ private int getIndex() {
+ final Container parent = getParent();
+ for(int i = 0; i < parent.getComponentCount(); i++ ){
+ if(JResizer.this.equals(parent.getComponent(i))){
+ if(d.equals(Direction.RIGHT)){
+ return i + 1;
+ }
+ else if(d.equals(Direction.LEFT)){
+ return i - 1;
+ }
+ else if(d.equals(Direction.UP)){
+ return i - 1;
+ }
+ else if(d.equals(Direction.DOWN)){
+ return i + 1;
+ }
+ }
+ }
+ return -1;
+ }
+
+
+ @Override
+ public void mouseDragged(MouseEvent e) {
+ if(sliderLock) {
+ return;
+ }
+ final Point point2 = e.getPoint();
+ SwingUtilities.convertPointToScreen(point2, e.getComponent());
+ if(point != null){
+ final JComponent parent = (JComponent) getParent();
+ final Component resizedComponent = parent.getComponent(index);
+ final Dimension size = new Dimension(resizedComponent.getPreferredSize());
+ if(d.equals(Direction.RIGHT)){
+ size.width -= (point2.x - point.x);
+ }
+ else if(d.equals(Direction.LEFT)){
+ size.width += (point2.x - point.x);
+ }
+ else if(d.equals(Direction.UP)){
+ size.height += (point2.y - point.y);
+ }
+ else if(d.equals(Direction.DOWN)){
+ size.height -= (point2.y - point.y);
+ }
+ resizedComponent.setPreferredSize(new Dimension(Math.max(size.width, 0), Math.max(size.height, 0)));
+ parent.revalidate();
+ parent.repaint();
+ fireSizeChanged(resizedComponent);
+ }
+ else{
+ index = getIndex();
+ }
+ point = point2;
+ }
+ });
+ }
+
+ public void addResizerListener(ResizerListener listener) {
+ if(listener == null) return;
+
+ synchronized (resizeListener) {
+ resizeListener.add(listener);
+ }
+
+ }
+
+ public void removeResizerListener(ComponentListener listener) {
+ if(listener == null) return;
+
+ synchronized (resizeListener) {
+ resizeListener.remove(listener);
+ }
+ }
+
+ public void setSliderLocked(boolean enabled) {
+ this.sliderLock = enabled;
+ }
+
+ public boolean isSliderLocked() {
+ return this.sliderLock;
+ }
+
+ private void fireSizeChanged(Component resizedComponent) {
+ ResizeEvent event = new ResizeEvent(this, resizedComponent);
+ synchronized (this.resizeListener) {
+ for(ResizerListener listener : resizeListener) {
+ listener.componentResized(event);
+ }
+ }
+
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/JRestrictedSizeScrollPane.java b/freeplane/src/main/java/org/freeplane/core/ui/components/JRestrictedSizeScrollPane.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/JRestrictedSizeScrollPane.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/JRestrictedSizeScrollPane.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/MultipleImage.java b/freeplane/src/main/java/org/freeplane/core/ui/components/MultipleImage.java
new file mode 100644
index 0000000..8e5d9ed
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/MultipleImage.java
@@ -0,0 +1,106 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Icon;
+
+import org.freeplane.features.icon.UIIcon;
+
+public class MultipleImage implements Icon {
+ final private List<Icon> mIcons = new ArrayList<Icon>();
+ final private List<UIIcon> mUIIcons = new ArrayList<UIIcon>();
+
+ public MultipleImage() {
+ }
+
+ public void addIcon(final UIIcon uiIcon) {
+ mIcons.add(uiIcon.getIcon());
+ mUIIcons.add(uiIcon);
+ }
+
+ public void addLinkIcon(Icon icon) {
+ mIcons.add(icon);
+ mUIIcons.add(null);
+ };
+
+ public int getIconHeight() {
+ int myY = 0;
+ for (final Icon icon : mIcons) {
+ final int otherHeight = icon.getIconHeight();
+ if (otherHeight > myY) {
+ myY = otherHeight;
+ }
+ }
+ return myY;
+ };
+
+ public int getIconWidth() {
+ int myX = 0;
+ for (final Icon icon : mIcons) {
+ myX += icon.getIconWidth();
+ }
+ return myX;
+ }
+
+ public int getImageCount() {
+ return mIcons.size();
+ }
+
+ public void paintIcon(final Component c, final Graphics g, final int x, final int y) {
+ int myX = x;
+ for (final Icon icon : mIcons) {
+ icon.paintIcon(c, g, myX, y);
+ myX += icon.getIconWidth();
+ }
+ }
+
+ public UIIcon getUIIconAt(Point coordinate){
+ if(coordinate.x < 0 || coordinate.y < 0)
+ return null;
+ int iconX = 0;
+ for (int iconIndex = 0; iconIndex < mIcons.size(); iconIndex++)
+ {
+ iconX += mIcons.get(iconIndex).getIconWidth();
+ if(coordinate.x <= iconX){
+ return mUIIcons.get(iconIndex);
+ }
+ }
+ return null;
+ }
+
+ //DOCEAR - get a rect relative to this image for a specific icon
+ public Rectangle getIconR(Icon icon) {
+ int myX = 0;
+ for (final Icon ico : mIcons) {
+ if(ico.equals(icon)) {
+ return new Rectangle(myX, 0, ico.getIconWidth(), ico.getIconHeight());
+ }
+ myX += ico.getIconWidth();
+ }
+ return null;
+ }
+};
diff --git a/freeplane/src/org/freeplane/core/ui/components/ObjectAndIcon.java b/freeplane/src/main/java/org/freeplane/core/ui/components/ObjectAndIcon.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/ObjectAndIcon.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/ObjectAndIcon.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/OneTouchCollapseResizer.java b/freeplane/src/main/java/org/freeplane/core/ui/components/OneTouchCollapseResizer.java
new file mode 100644
index 0000000..c875e8e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/OneTouchCollapseResizer.java
@@ -0,0 +1,462 @@
+/**
+ * author: Marcel Genzmehr
+ * 29.11.2011
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+
+import org.freeplane.core.util.LogUtils;
+
+/**
+ *
+ */
+public class OneTouchCollapseResizer extends JResizer {
+ private static final long serialVersionUID = 3836146387249880446L;
+ public static final String COLLAPSED = OneTouchCollapseResizer.class.getPackage().getName()+".collapsed";
+ private static final String ALREADY_IN_PAINT = OneTouchCollapseResizer.class.getPackage().getName()+".ALREADY_PAINTING";
+
+ protected boolean expanded = true;
+ private JPanel hotspot;
+ private final int inset = 2;
+ private final Direction direction;
+ private Integer resizeComponentIndex;
+
+ private final Set<ComponentCollapseListener> collapseListener = new LinkedHashSet<ComponentCollapseListener>();
+
+
+
+ /***********************************************************************************
+ * CONSTRUCTORS
+ **********************************************************************************/
+ /**
+ * @param d
+ */
+ public OneTouchCollapseResizer(final Direction d) {
+ super(d);
+ direction = d;
+ this.setDividerSize(7);
+
+ MouseListener listener = new MouseListener() {
+ private void resetCursor() {
+ if(d.equals(Direction.RIGHT)){
+ setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
+ }
+ else if(d.equals(Direction.LEFT)){
+ setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
+ }
+ else if(d.equals(Direction.UP)){
+ setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));
+ }
+ else /*Direction.DOWN*/ {
+ setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
+ }
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ }
+
+ public void mousePressed(MouseEvent e) {
+ }
+
+ public void mouseExited(MouseEvent e) {
+ if(e.getComponent() == getHotSpot()) {
+ resetCursor();
+ }
+ if(isExpanded()) {
+ resetCursor();
+ }
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ if(e.getComponent() == getHotSpot()) {
+ getHotSpot().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+ }
+ if(!isExpanded() || sliderLock) {
+ e.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+ }
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ if((e.getComponent() == getHotSpot()) || sliderLock) {
+
+ if (isExpanded()) {
+ getHotSpot().setEnabled(true);
+ setExpanded(false);
+ }
+ else {
+ setExpanded(true);
+ }
+ }
+ else {
+ if (!isExpanded()) {
+ setExpanded(true);
+ }
+ }
+ }
+ };
+ getHotSpot().addMouseListener(listener);
+ addMouseListener(listener);
+
+ add(getHotSpot());
+ }
+
+ /***********************************************************************************
+ * METHODS
+ **********************************************************************************/
+
+ public boolean isExpanded() {
+ return this.expanded;
+ }
+
+ public void setDividerSize(int size) {
+ final int w;
+ final int h;
+ if(direction.equals(Direction.RIGHT)){
+ w = size;
+ h = 0;
+ }
+ else if(direction.equals(Direction.LEFT)){
+ h = 0;
+ w = size;
+ }
+ else if(direction.equals(Direction.UP)){
+ h = size;
+ w = 0;
+ }
+ else /*Direction.DOWN*/ {
+ h = size;
+ w = 0;
+ }
+ setPreferredSize(new Dimension(w, h));
+ }
+
+ public int getDividerSize() {
+ if(direction.equals(Direction.RIGHT) || direction.equals(Direction.LEFT)){
+ return getPreferredSize().width;
+ }
+ else /*Direction.DOWN || Direction.UP*/ {
+ return getPreferredSize().height;
+ }
+ }
+
+ public void setExpanded(boolean enabled) {
+ if(this.expanded != enabled) {
+ this.expanded = enabled;
+ try {
+ Component resizedComponent = getResizedComponent();
+ if(resizedComponent instanceof JComponent) {
+ ((JComponent) resizedComponent).putClientProperty(COLLAPSED, (enabled ? null : "true"));
+ }
+ if(enabled) {
+ resizedComponent.setPreferredSize(null);
+ }
+ else {
+ resizedComponent.setPreferredSize(new Dimension(0,0));
+ }
+
+ fireCollapseStateChanged(resizedComponent, enabled);
+
+ recalibrate();
+ }
+ catch (Exception e) {
+ LogUtils.warn("Exception in org.freeplane.core.ui.components.OneTouchCollapseResizer.setExpanded(enabled): "+e);
+ }
+ }
+
+ }
+
+ private Component getResizedComponent() {
+ final JComponent parent = (JComponent) getParent();
+ if(parent != null && resizeComponentIndex == null) {
+ resizeComponentIndex = getIndex();
+ }
+ return parent.getComponent(resizeComponentIndex);
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ if(getClientProperty(ALREADY_IN_PAINT) != null) {
+ return;
+ }
+ putClientProperty(ALREADY_IN_PAINT, "true");
+ super.paint(g);
+ if((direction.equals(Direction.RIGHT) || direction.equals(Direction.LEFT))) {
+ int center_y = getHeight()/2;
+ int divSize = getDividerSize();
+ getHotSpot().setBounds(0, center_y-15, divSize, 30);
+ }
+ else {
+ int center_x = getWidth()/2;
+ int divSize = getDividerSize();
+ getHotSpot().setBounds(center_x-15, 0, 30, divSize);
+ }
+ Dimension size = getResizedComponent().getPreferredSize();
+ if((direction.equals(Direction.RIGHT) || direction.equals(Direction.LEFT)) && size.width <= getDividerSize()) {
+ setExpanded(false);
+
+ }
+ else if((direction.equals(Direction.UP) || direction.equals(Direction.DOWN)) && size.height <= getDividerSize()){
+ setExpanded(false);
+ }
+ else {
+ setExpanded(true);
+ }
+ if(getResizedComponent() instanceof JComponent) {
+ ((JComponent) getResizedComponent()).putClientProperty(COLLAPSED, (isExpanded() ? null : "true"));
+ }
+ getHotSpot().paint(g.create(getHotSpot().getLocation().x, getHotSpot().getLocation().y, getHotSpot().getWidth(), getHotSpot().getHeight()));
+ putClientProperty(ALREADY_IN_PAINT, null);
+ }
+
+ private Component getHotSpot() {
+ if(hotspot == null) {
+ hotspot = new JPanel() {
+ private static final long serialVersionUID = -5321517835206976034L;
+
+ @Override
+ public void paint(Graphics g) {
+ if (isExpanded()) {
+ drawCollapseLabel(g);
+ }
+ else {
+ drawExpandLabel(g);
+ }
+ }
+
+ @Override
+ public void updateUI() {
+ try {
+ super.updateUI();
+ }
+ catch (Exception e) {
+ }
+ }
+ };
+ hotspot.setBackground(Color.BLUE);
+ }
+ return hotspot;
+ }
+
+ private void drawCollapseLabel(Graphics g) {
+ Dimension size = g.getClipBounds().getSize();
+ int half_length = Math.round(size.height*0.2f);
+ int center_y = size.height / 2;
+
+ int half_width = Math.round(size.width*0.2f);
+ int center_x = size.width / 2;
+
+ g.setColor(getBackground());
+ g.fillRect(0, 0, getWidth(), getHeight());
+
+ //g.setColor();
+ if(this.direction.equals(Direction.LEFT)) {
+ arrowLeft(g, half_length, center_y);
+ }
+ else if(this.direction.equals(Direction.RIGHT)) {
+ arrowRight(g, half_length, center_y);
+ }
+ else if(this.direction.equals(Direction.UP)) {
+ arrowUp(g, half_width, center_x);
+ }
+ else if(this.direction.equals(Direction.DOWN)) {
+ arrowDown(g, half_width, center_x);
+ }
+ }
+
+
+
+ private void drawExpandLabel(Graphics g) {
+ Dimension size = g.getClipBounds().getSize();
+ int half_length = (size.height-(inset*6))/2;
+ int center_y = size.height / 2;
+
+ int half_width = (size.width-(inset*6))/2;
+ int center_x = size.width / 2;
+
+ g.setColor(getBackground());
+ g.fillRect(0, 0, getWidth(), getHeight());
+
+ if(this.direction.equals(Direction.LEFT)) {
+ arrowRight(g, half_length, center_y);
+ }
+ else if(this.direction.equals(Direction.RIGHT)) {
+ arrowLeft(g, half_length, center_y);
+ }
+ else if(this.direction.equals(Direction.UP)) {
+ arrowDown(g, half_width, center_x);
+ }
+ else if(this.direction.equals(Direction.DOWN)) {
+ arrowUp(g, half_width, center_x);
+ }
+ }
+
+
+ /**
+ * @param g
+ * @param half_length
+ * @param center_y
+ */
+ private void arrowLeft(Graphics g, int half_length, int center_y) {
+ int[] x = new int[]{inset, getSize().width - inset, getSize().width - inset};
+ int[] y = new int[]{center_y, center_y-half_length, center_y + half_length};
+ g.setColor(Color.DARK_GRAY);
+ g.fillPolygon(x, y, 3);
+ g.setColor(Color.DARK_GRAY);
+ g.drawLine(inset, center_y, getSize().width - inset, center_y - half_length);
+ g.setColor(Color.GRAY);
+ g.drawLine( getSize().width - inset, center_y + half_length, inset, center_y);
+ g.setColor(Color.GRAY);
+ g.drawLine( getSize().width - inset, center_y - half_length, getSize().width - inset, center_y + half_length);
+ }
+
+ /**
+ * @param g
+ * @param half_length
+ * @param center_y
+ */
+ private void arrowRight(Graphics g, int half_length, int center_y) {
+ int[] x = new int[]{inset, inset, getSize().width - inset};
+ int[] y = new int[]{center_y+half_length, center_y-half_length, center_y};
+
+ g.setColor( Color.DARK_GRAY);
+ g.fillPolygon(x,y,3);
+ g.setColor( Color.DARK_GRAY);
+ g.drawLine( inset, center_y + half_length, inset, center_y - half_length);
+ g.setColor(Color.GRAY);
+ g.drawLine( inset, center_y - half_length, getSize().width - inset, center_y);
+ g.setColor( Color.LIGHT_GRAY);
+ g.drawLine( getSize().width - inset, center_y, inset, center_y + half_length);
+ }
+
+ private void arrowUp(Graphics g, int half_length, int center_x) {
+ int[] y = new int[]{inset, getSize().height - inset, getSize().height - inset};
+ int[] x = new int[]{center_x, center_x-half_length, center_x + half_length};
+
+ g.setColor(Color.DARK_GRAY);
+ g.fillPolygon(x, y, 3);
+
+ g.setColor(Color.GRAY);
+ g.drawLine(center_x + half_length, getSize().height - inset, center_x, inset);
+ g.setColor(Color.DARK_GRAY);
+ g.drawLine(center_x, inset, center_x - half_length, getSize().height - inset);
+ g.setColor(Color.LIGHT_GRAY);
+ g.drawLine(center_x - half_length, getSize().height - inset, center_x + half_length, getSize().height - inset);
+
+ }
+
+ private void arrowDown(Graphics g, int half_length, int center_x) {
+ int[] y = new int[]{inset, inset, getSize().height - inset};
+ int[] x = new int[]{center_x+half_length, center_x-half_length, center_x};
+
+ g.setColor( Color.DARK_GRAY);
+ g.fillPolygon(x,y,3);
+
+ g.setColor(Color.GRAY);
+ g.drawLine( center_x - half_length, inset, center_x, getSize().height- inset);
+ g.setColor( Color.DARK_GRAY);
+ g.drawLine( center_x + half_length, inset, center_x - half_length, inset);
+ g.setColor( Color.LIGHT_GRAY);
+ g.drawLine(center_x, getSize().height - inset, center_x + half_length, inset);
+ }
+
+ private int getIndex() {
+ final Container parent = getParent();
+ for(int i = 0; i < parent.getComponentCount(); i++ ){
+ if(OneTouchCollapseResizer.this.equals(parent.getComponent(i))){
+ if(direction.equals(Direction.RIGHT)){
+ return i + 1;
+ }
+ else if(direction.equals(Direction.LEFT)){
+ return i - 1;
+ }
+ else if(direction.equals(Direction.UP)){
+ return i - 1;
+ }
+ else if(direction.equals(Direction.DOWN)){
+ return i + 1;
+ }
+ }
+ }
+ return -1;
+ }
+
+ public void addCollapseListener(ComponentCollapseListener listener) {
+ if(listener == null) return;
+
+ synchronized (collapseListener) {
+ collapseListener.add(listener);
+ }
+
+ }
+
+ public void removeCollapseListener(ComponentCollapseListener listener) {
+ if(listener == null) return;
+
+ synchronized (collapseListener) {
+ collapseListener.remove(listener);
+ }
+ }
+
+ protected void fireCollapseStateChanged(Component resizedComponent, boolean expanded) {
+ ResizeEvent event = new ResizeEvent(this, resizedComponent);
+ synchronized (this.collapseListener) {
+ for(ComponentCollapseListener listener : collapseListener) {
+ try {
+ if(expanded) {
+ listener.componentExpanded(event);
+ }
+ else {
+ listener.componentCollapsed(event);
+ }
+ }
+ catch (Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+ }
+
+ }
+
+ public static OneTouchCollapseResizer findResizerFor(Component component) {
+ if(component instanceof Container) {
+ Component[] children = ((Container) component).getComponents();
+ for (Component child : children) {
+ if(child instanceof OneTouchCollapseResizer) {
+ return (OneTouchCollapseResizer) child;
+ }
+ }
+ }
+ if(component == null)
+ return null;
+ Component parent = component.getParent();
+ return findResizerFor(parent);
+ }
+
+ public interface ComponentCollapseListener {
+ public void componentCollapsed(ResizeEvent event);
+ public void componentExpanded(ResizeEvent event);
+ }
+
+ public void recalibrate() {
+ if(getClientProperty(ALREADY_IN_PAINT) == null) {
+ final JComponent parent = (JComponent) getParent();
+ if(parent != null) {
+ parent.revalidate();
+ parent.repaint();
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/OptionalDontShowMeAgainDialog.java b/freeplane/src/main/java/org/freeplane/core/ui/components/OptionalDontShowMeAgainDialog.java
new file mode 100644
index 0000000..3bd6b6c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/OptionalDontShowMeAgainDialog.java
@@ -0,0 +1,230 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.Frame;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.WindowConstants;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * Dialog with a decision that can be disabled.
+ *
+ * @author foltin
+ */
+public class OptionalDontShowMeAgainDialog {
+ public final static int BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED = 1;
+ public final static int ONLY_OK_SELECTION_IS_STORED = 0;
+ public final static int ONLY_OK_SELECTION_IS_SHOWN = 2;
+
+ static public int show( final String pMessageId, final String pTitleId,
+ final String pPropertyName, final int pMessageType) {
+ return new OptionalDontShowMeAgainDialog(pMessageId, pTitleId, pPropertyName, pMessageType).show()
+ .getResult();
+ }
+
+// // private final Controller controller;
+ private JDialog mDialog;
+ private JCheckBox mDontShowAgainBox;
+ final private String mMessageId;
+ final private int mMessageType;
+ final private NodeModel mNode;
+ final private Frame mParent;
+ final private String mPropertyName;
+ private int mResult = JOptionPane.CANCEL_OPTION;
+ final private String mTitleId;
+
+ private OptionalDontShowMeAgainDialog( final String pMessageId, final String pTitleId,
+ final String pPropertyName, final int pMessageType) {
+// this.controller = controller;
+ Controller controller = Controller.getCurrentController();
+ mParent = UITools.getCurrentFrame();
+ final IMapSelection selection = controller.getSelection();
+ if (selection != null) {
+ mNode = selection.getSelected();
+ }
+ else {
+ mNode = null;
+ }
+ mMessageId = pMessageId;
+ mTitleId = pTitleId;
+ mPropertyName = pPropertyName;
+ mMessageType = pMessageType;
+ }
+
+ private void close(final int pResult) {
+ mResult = pResult;
+ if (mDontShowAgainBox.isSelected()) {
+ if (mMessageType == OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED) {
+ if (mResult == JOptionPane.OK_OPTION) {
+ setProperty("true");
+ }
+ }
+ else {
+ setProperty((mResult == JOptionPane.OK_OPTION) ? "true" : "false");
+ }
+ }
+ else {
+ setProperty("");
+ }
+ mDialog.setVisible(false);
+ mDialog.dispose();
+ }
+
+ private String getProperty() {
+ return ResourceController.getResourceController().getProperty(mPropertyName);
+ }
+
+ /**
+ * @return an int from JOptionPane (eg. JOptionPane.OK_OPTION).
+ */
+ private int getResult() {
+ return mResult;
+ }
+
+ private void setProperty(final String value) {
+ ResourceController.getResourceController().setProperty(mPropertyName, value);
+ }
+
+ private OptionalDontShowMeAgainDialog show() {
+ final String property = getProperty();
+ if (StringUtils.equals(property, "true")) {
+ mResult = JOptionPane.OK_OPTION;
+ return this;
+ }
+ if (mMessageType == BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED && StringUtils.equals(property, "false")) {
+ mResult = JOptionPane.CANCEL_OPTION;
+ return this;
+ }
+ mDialog = null;
+ mDialog = new JDialog(mParent, TextUtils.getText(mTitleId));
+ mDialog.setModal(true);
+ mDialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ final AbstractAction cancelAction = new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent pE) {
+ close(JOptionPane.CANCEL_OPTION);
+ }
+ };
+ final AbstractAction okAction = new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent pE) {
+ close(JOptionPane.OK_OPTION);
+ }
+ };
+ UITools.addEscapeActionToDialog(mDialog, cancelAction);
+ mDialog.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(final WindowEvent pE) {
+ close(JOptionPane.CANCEL_OPTION);
+ }
+ });
+ mDialog.getContentPane().setLayout(new GridBagLayout());
+ mDialog.getContentPane().add(
+ new JLabel(TextUtils.getText(mMessageId)),
+ new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
+ 5, 5, 0, 0), 0, 0));
+ final ImageIcon questionMark;
+ if(mMessageType == ONLY_OK_SELECTION_IS_SHOWN){
+ questionMark = new ImageIcon(ResourceController.getResourceController().getResource(
+ "/images/icons/messagebox_warning.png"));
+ }
+ else{
+ questionMark = new ImageIcon(ResourceController.getResourceController().getResource(
+ "/images/icons/help.png"));
+ }
+ mDialog.getContentPane().add(
+ new JLabel(questionMark),
+ new GridBagConstraints(0, 0, 1, 2, 1.0, 2.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
+ 5, 5, 0, 0), 0, 0));
+ String boxString;
+ if (mMessageType != OptionalDontShowMeAgainDialog.BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED) {
+ boxString = "OptionalDontShowMeAgainDialog.dontShowAgain";
+ }
+ else {
+ boxString = "OptionalDontShowMeAgainDialog.rememberMyDescision";
+ }
+ mDontShowAgainBox = new JCheckBox(TextUtils.getRawText(boxString));
+ LabelAndMnemonicSetter.setLabelAndMnemonic(mDontShowAgainBox, null);
+ mDialog.getContentPane().add(
+ mDontShowAgainBox,
+ new GridBagConstraints(0, 2, 3, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
+ 5, 5, 0, 0), 0, 0));
+ final String okText;
+ if(mMessageType == ONLY_OK_SELECTION_IS_SHOWN){
+ okText = TextUtils.getRawText("ok");
+ }
+ else{
+ okText = TextUtils.getRawText("OptionalDontShowMeAgainDialog.ok");
+ }
+ final JButton okButton = new JButton(okText);
+ LabelAndMnemonicSetter.setLabelAndMnemonic(okButton, null);
+ okButton.addActionListener(okAction);
+ mDialog.getContentPane().add(
+ okButton,
+ new GridBagConstraints(2, 3, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
+ 5, 5, 0, 0), 0, 0));
+ if(mMessageType != ONLY_OK_SELECTION_IS_SHOWN){
+ final JButton cancelButton = new JButton(TextUtils.getRawText("OptionalDontShowMeAgainDialog.cancel"));
+ LabelAndMnemonicSetter.setLabelAndMnemonic(cancelButton, null);
+ cancelButton.addActionListener(cancelAction);
+ mDialog.getContentPane().add(
+ cancelButton,
+ new GridBagConstraints(3, 3, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
+ 5, 5, 0, 0), 0, 0));
+ }
+ mDialog.getRootPane().setDefaultButton(okButton);
+ mDialog.pack();
+ if (mNode != null) {
+ UITools.setDialogLocationRelativeTo(mDialog, mNode);
+ }
+ else {
+ mDialog.setLocationRelativeTo(null);
+ }
+ mDialog.setVisible(true);
+ return this;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/PersistentEditableComboBox.java b/freeplane/src/main/java/org/freeplane/core/ui/components/PersistentEditableComboBox.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/PersistentEditableComboBox.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/PersistentEditableComboBox.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/PropertyChangeListenerWithSelectionSupport.java b/freeplane/src/main/java/org/freeplane/core/ui/components/PropertyChangeListenerWithSelectionSupport.java
new file mode 100644
index 0000000..675da07
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/PropertyChangeListenerWithSelectionSupport.java
@@ -0,0 +1,33 @@
+package org.freeplane.core.ui.components;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.lang.ref.WeakReference;
+
+import javax.swing.AbstractButton;
+
+import org.freeplane.core.ui.SelectableAction;
+
+public class PropertyChangeListenerWithSelectionSupport implements PropertyChangeListener{
+ final private WeakReference<AbstractButton> target;
+ final private PropertyChangeListener defaultPropertyChangeListener;
+
+ public PropertyChangeListenerWithSelectionSupport(AbstractButton target, PropertyChangeListener defaultPropertyChanegListener) {
+ super();
+ this.defaultPropertyChangeListener = defaultPropertyChanegListener;
+ this.target = new WeakReference<AbstractButton>(target);
+ }
+
+ public void propertyChange(final PropertyChangeEvent e) {
+ if (e.getPropertyName().equals(SelectableAction.SELECTION_PROPERTY)) {
+ AbstractButton button = target.get();
+ if(button != null) {
+ final Boolean isSelected = (Boolean) e.getNewValue();
+ button.setSelected(isSelected.booleanValue());
+ }
+ }
+ else {
+ defaultPropertyChangeListener.propertyChange(e);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/ResizeEvent.java b/freeplane/src/main/java/org/freeplane/core/ui/components/ResizeEvent.java
new file mode 100644
index 0000000..154f6de
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/ResizeEvent.java
@@ -0,0 +1,23 @@
+package org.freeplane.core.ui.components;
+
+import java.awt.Component;
+import java.util.EventObject;
+
+public class ResizeEvent extends EventObject {
+
+ private static final long serialVersionUID = 3131068483469543037L;
+ private final Component component;
+
+ public ResizeEvent(JResizer source, Component component) {
+ super(source);
+ this.component = component;
+ }
+
+ public JResizer getSource() {
+ return (JResizer) super.getSource();
+ }
+
+ public Component getComponent() {
+ return component;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/ResizerListener.java b/freeplane/src/main/java/org/freeplane/core/ui/components/ResizerListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/ResizerListener.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/ResizerListener.java
diff --git a/freeplane/src/org/freeplane/core/ui/components/ToolbarLayout.java b/freeplane/src/main/java/org/freeplane/core/ui/components/ToolbarLayout.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/ToolbarLayout.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/ToolbarLayout.java
diff --git a/freeplane/src/org/freeplane/core/ui/components/TypedListCellRenderer.java b/freeplane/src/main/java/org/freeplane/core/ui/components/TypedListCellRenderer.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/TypedListCellRenderer.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/TypedListCellRenderer.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/UITools.java b/freeplane/src/main/java/org/freeplane/core/ui/components/UITools.java
new file mode 100644
index 0000000..8e1a743
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/UITools.java
@@ -0,0 +1,668 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.net.URI;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.FocusManager;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.border.CompoundBorder;
+import javax.swing.border.TitledBorder;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.main.application.FreeplaneSplashModern;
+
+/**
+ * Utilities for accessing the GUI, creating dialogs etc.: In scripts available as "global variable" <code>ui</code>.
+ * <p>
+ * In scripts this would be a simple way of opening a info popup:
+ * <pre>
+ * ui.informationMessage("Hello World!")
+ * ui.informationMessage(ui.frame, "Hello World!") // longer version, equivalent
+ * </pre>
+ *
+ * @author Dimitry Polivaev
+ * @since 29.12.2008
+ */
+public class UITools {
+ @SuppressWarnings("serial")
+ public static final class InsertEolAction extends AbstractAction {
+ public void actionPerformed(ActionEvent e) {
+ JTextComponent c = (JTextComponent) e.getSource();
+ c.replaceSelection("\n");
+ }
+ }
+
+ public static final String MAIN_FREEPLANE_FRAME = "mainFreeplaneFrame";
+
+ public static void addEscapeActionToDialog(final JDialog dialog) {
+ class EscapeAction extends AbstractAction {
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ dialog.dispose();
+ };
+ }
+ UITools.addEscapeActionToDialog(dialog, new EscapeAction());
+ }
+
+ public static void addEscapeActionToDialog(final JDialog dialog, final Action action) {
+ UITools.addKeyActionToDialog(dialog, action, "ESCAPE", "end_dialog");
+ }
+
+ public static void addKeyActionToDialog(final JDialog dialog, final Action action, final String keyStroke,
+ final String actionId) {
+ action.putValue(Action.NAME, actionId);
+ dialog.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(keyStroke),
+ action.getValue(Action.NAME));
+ dialog.getRootPane().getActionMap().put(action.getValue(Action.NAME), action);
+ }
+
+ public static void convertPointFromAncestor(final Component ancestor, final Point p, Component c) {
+ int x, y;
+ while (c != ancestor && c != null) {
+ x = c.getX();
+ y = c.getY();
+ p.x -= x;
+ p.y -= y;
+ c = c.getParent();
+ };
+ }
+
+ public static void convertPointToAncestor(final Component source, final Point point, final Class<?> ancestorClass) {
+ final Component destination = SwingUtilities.getAncestorOfClass(ancestorClass, source);
+ UITools.convertPointToAncestor(source, point, destination);
+ }
+
+ public static void convertRectangleToAncestor(final Component from, final Rectangle r, final Component destination) {
+ Point p = new Point(r.x, r.y);
+ UITools.convertPointToAncestor(from, p , destination);
+ r.x = p.x;
+ r.y = p.y;
+ }
+
+ public static void convertPointToAncestor(final Component from, final Point p, final Component destination) {
+ int x, y;
+ for (Component c = from; c != destination && c != null; c = c.getParent()) {
+ x = c.getX();
+ y = c.getY();
+ p.x += x;
+ p.y += y;
+ };
+ }
+
+ static public void errorMessage(final Object message) {
+ final String myMessage;
+ if (message != null) {
+ myMessage = message.toString();
+ }
+ else {
+ myMessage = TextUtils.getText("undefined_error");
+ }
+ LogUtils.warn(myMessage);
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ JOptionPane.showMessageDialog(UITools.getCurrentRootComponent(), myMessage, "Freeplane", JOptionPane.ERROR_MESSAGE);
+ }
+ });
+ }
+
+ static public Component getCurrentRootComponent(){
+ return Controller.getCurrentController().getViewController().getCurrentRootComponent();
+ }
+
+ public static Frame getCurrentFrame() {
+ final Component currentRootComponent = getCurrentRootComponent();
+ return currentRootComponent instanceof Frame ? (Frame)currentRootComponent : JOptionPane.getFrameForComponent(currentRootComponent);
+ }
+
+ public static Frame getFrame() {
+ final Component currentRootComponent = getMenuComponent();
+ return currentRootComponent instanceof Frame ? (Frame)currentRootComponent : JOptionPane.getFrameForComponent(currentRootComponent);
+ }
+
+ static public Component getMenuComponent(){
+ return Controller.getCurrentController().getViewController().getMenuComponent();
+ }
+
+ /** returns a KeyStroke if possible and null otherwise. */
+ public static KeyStroke getKeyStroke(final String keyStrokeDescription) {
+ if (keyStrokeDescription == null) {
+ return null;
+ }
+ final KeyStroke keyStroke = KeyStroke.getKeyStroke(keyStrokeDescription);
+ if (keyStroke != null) {
+ return keyStroke;
+ }
+ final int lastSpacePos = keyStrokeDescription.lastIndexOf(' ') + 1;
+ final String modifiedDescription = keyStrokeDescription.substring(0, lastSpacePos) + "typed "
+ + keyStrokeDescription.substring(lastSpacePos);
+ return KeyStroke.getKeyStroke(modifiedDescription);
+ }
+
+ /** formats a KeyStroke in a ledgible way, e.g. Control+V. Null is converted to "".
+ * Taken from MotifGraphicsUtils.paintMenuItem(). */
+ public static String keyStrokeToString(KeyStroke keyStroke) {
+ String acceleratorText = "";
+ if (keyStroke != null) {
+ int modifiers = keyStroke.getModifiers();
+ if (modifiers > 0) {
+ acceleratorText = KeyEvent.getKeyModifiersText(modifiers);
+ acceleratorText += "+";
+ }
+ acceleratorText += KeyEvent.getKeyText(keyStroke.getKeyCode());
+ }
+ return acceleratorText;
+ }
+
+ static public void informationMessage(final String message) {
+ UITools.informationMessage(UITools.getCurrentRootComponent(), message);
+ }
+
+ static public void informationMessage(final Component frame, final String message) {
+ UITools.informationMessage(frame, message, "Freeplane");
+ }
+
+ static public void informationMessage(final Component frame, final String message, final String title) {
+ JOptionPane.showMessageDialog(frame, message, title, JOptionPane.INFORMATION_MESSAGE);
+ }
+
+ public static void informationMessage(final Component frame, final String text, final String string, final int type) {
+ JOptionPane.showMessageDialog(frame, text, string, type);
+ }
+
+ static public void setBounds(final Component frame, int win_x, int win_y, int win_width, int win_height) {
+ final Rectangle frameBounds = getValidFrameBounds(frame, win_x, win_y, win_width, win_height);
+ frame.setBounds(frameBounds);
+ }
+
+ public static Rectangle getValidFrameBounds(final Component frame, int win_x, int win_y, int win_width,
+ int win_height) {
+ final Rectangle desktopBounds = getDesktopBounds(frame);
+ int screenWidth = desktopBounds.width;
+ if(win_width != -1)
+ win_width = Math.min(win_width, screenWidth );
+ else
+ win_width = screenWidth * 4 / 5;
+ int screenHeight = desktopBounds.height;
+ if(win_height != -1)
+ win_height = Math.min(win_height, screenHeight);
+ else
+ win_height = screenHeight * 4 / 5;
+ if(win_x != -1){
+ win_x = Math.min(screenWidth + desktopBounds.x - win_width, win_x);
+ win_x = Math.max(desktopBounds.x, win_x);
+ }
+ else
+ win_x = desktopBounds.x + (screenWidth - win_width) / 2;
+ if(win_y != -1){
+ win_y = Math.max(desktopBounds.y, win_y);
+ win_y = Math.min(screenHeight + desktopBounds.y - win_height, win_y);
+ }
+ else
+ win_y = desktopBounds.y + (screenHeight - win_height) / 2;
+ final Rectangle frameBounds = new Rectangle( win_x, win_y, win_width, win_height);
+ return frameBounds;
+ }
+
+ public static Rectangle getDesktopBounds(Component frame) {
+ final Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
+ final Insets screenInsets = defaultToolkit.getScreenInsets(frame.getGraphicsConfiguration());
+ final Dimension screenSize = defaultToolkit.getScreenSize();
+ final int screenWidth = screenSize.width - screenInsets.left - screenInsets.right;
+ final int screenHeight = screenSize.height - screenInsets.top - screenInsets.bottom;
+ return new Rectangle(screenInsets.left, screenInsets.top, screenWidth, screenHeight);
+ }
+
+ public static void setDialogLocationRelativeTo(final JDialog dialog, final Component c) {
+ if (c == null || ! c.isShowing()) {
+ return;
+ }
+ final Point compLocation = c.getLocationOnScreen();
+ final int cw = c.getWidth();
+ final int ch = c.getHeight();
+ final Container parent = dialog.getParent();
+ final Point parentLocation = parent.getLocationOnScreen();
+ final int pw = parent.getWidth();
+ final int ph = parent.getHeight();
+ final int dw = dialog.getWidth();
+ final int dh = dialog.getHeight();
+ final Rectangle desktopBounds = getDesktopBounds(c);
+ final int minX = Math.max(parentLocation.x, desktopBounds.x);
+ final int minY = Math.max(parentLocation.y, desktopBounds.y);
+ final int maxX = Math.min(parentLocation.x + pw, desktopBounds.x + desktopBounds.width);
+ final int maxY = Math.min(parentLocation.y + ph, desktopBounds.y + desktopBounds.height);
+ int dx, dy;
+ if (compLocation.x + cw < minX) {
+ dx = minX;
+ }
+ else if (compLocation.x > maxX) {
+ dx = maxX - dw;
+ }
+ else {
+ final int leftSpace = compLocation.x - minX;
+ final int rightSpace = maxX - (compLocation.x + cw);
+ if (leftSpace > rightSpace) {
+ if (leftSpace > dw) {
+ dx = compLocation.x - dw;
+ }
+ else {
+ dx = minX;
+ }
+ }
+ else {
+ if (rightSpace > dw) {
+ dx = compLocation.x + cw;
+ }
+ else {
+ dx = maxX - dw;
+ }
+ }
+ }
+ if (compLocation.y + ch < minY) {
+ dy = minY;
+ }
+ else if (compLocation.y > maxY) {
+ dy = maxY - dh;
+ }
+ else {
+ final int topSpace = compLocation.y - minY;
+ final int bottomSpace = maxY - (compLocation.y + ch);
+ if (topSpace > bottomSpace) {
+ if (topSpace > dh) {
+ dy = compLocation.y - dh;
+ }
+ else {
+ dy = minY;
+ }
+ }
+ else {
+ if (bottomSpace > dh) {
+ dy = compLocation.y + ch;
+ }
+ else {
+ dy = maxY - dh;
+ }
+ }
+ }
+ dialog.setLocation(dx, dy);
+ }
+
+ public static void setDialogLocationRelativeTo(final JDialog dialog,
+ final NodeModel node) {
+ if (node == null) {
+ return;
+ }
+ final IMapViewManager viewController = Controller.getCurrentController().getMapViewManager();
+ viewController.scrollNodeToVisible(node);
+ final Component c = viewController.getComponent(node);
+ UITools.setDialogLocationRelativeTo(dialog, c);
+ }
+
+ public static void setDialogLocationUnder(final JDialog dialog, final NodeModel node) {
+ final Controller controller = Controller.getCurrentController();
+ final IMapViewManager viewController = controller.getMapViewManager();
+ final JComponent c = (JComponent) viewController.getComponent(node);
+ final int x = 0;
+ final int y = c.getHeight();
+ final Point location = new Point(x, y);
+ SwingUtilities.convertPointToScreen(location, c);
+ UITools.setBounds(dialog, location.x, location.y, dialog.getWidth(), dialog.getHeight());
+ }
+
+ /**
+ * Shows the error message "attributes_adding_empty_attribute_error"
+ */
+ public static void showAttributeEmptyStringErrorMessage() {
+ JOptionPane.showMessageDialog(null, TextUtils.getText("attributes_adding_empty_attribute_error"),
+ TextUtils.getText("error"), JOptionPane.ERROR_MESSAGE);
+ }
+
+ static public void showMessage(String message, int messageType) {
+ backOtherWindows();
+ JTextArea infoPane = new JTextArea();
+ infoPane.setEditable(false);
+ infoPane.setMargin(new Insets(5,5,5,5));
+ infoPane.setLineWrap(true);
+ infoPane.setWrapStyleWord(true);
+ infoPane.setText(message);
+ infoPane.setColumns(60);
+ JScrollPane scrollPane = new JScrollPane(infoPane);
+ scrollPane.setPreferredSize(new Dimension(400, 200));
+ JOptionPane.showMessageDialog(getCurrentRootComponent(), scrollPane, "Freeplane", messageType);
+ }
+ public static int showConfirmDialog(final NodeModel node, final Object message, final String title,
+ final int optionType, final int messageType) {
+ final Controller controller = Controller.getCurrentController();
+ final IMapViewManager viewController = controller.getMapViewManager();
+ final Component parentComponent;
+ if (node == null) {
+ parentComponent = getCurrentRootComponent();
+ }
+ else {
+ viewController.scrollNodeToVisible(node);
+ parentComponent = viewController.getComponent(node);
+ }
+ return JOptionPane.showConfirmDialog(parentComponent, message, title, optionType, messageType);
+ }
+
+ public static int showConfirmDialog( final NodeModel node, final Object message,
+ final String title, final int optionType) {
+ return showConfirmDialog( node, message, title, optionType, JOptionPane.QUESTION_MESSAGE);
+ }
+
+ public static String showInputDialog( final NodeModel node, final String message,
+ final String initialValue) {
+ if (node == null) {
+ return null;
+ }
+ final Controller controller = Controller.getCurrentController();
+ final IMapViewManager viewController = controller.getMapViewManager();
+ viewController.scrollNodeToVisible(node);
+ final Component parentComponent = viewController.getComponent(node);
+ return JOptionPane.showInputDialog(parentComponent, message, initialValue);
+ }
+
+ public static String showInputDialog( final NodeModel node, final String text,
+ final String title, final int type) {
+ if (node == null) {
+ return null;
+ }
+ final Controller controller = Controller.getCurrentController();
+ final IMapViewManager viewController = controller.getMapViewManager();
+ viewController.scrollNodeToVisible(node);
+ final Component parentComponent = viewController.getComponent(node);
+ return JOptionPane.showInputDialog(parentComponent, text, title, type);
+ }
+
+ public static final String SCROLLBAR_INCREMENT = "scrollbar_increment";
+
+ public static void setScrollbarIncrement(final JScrollPane scrollPane) {
+ final int scrollbarIncrement = ResourceController.getResourceController()
+ .getIntProperty(SCROLLBAR_INCREMENT, 1);
+ scrollPane.getHorizontalScrollBar().setUnitIncrement(scrollbarIncrement);
+ scrollPane.getVerticalScrollBar().setUnitIncrement(scrollbarIncrement);
+ }
+
+ public static void addScrollbarIncrementPropertyListener(final JScrollPane scrollPane) {
+ ResourceController.getResourceController().addPropertyChangeListener(new IFreeplanePropertyListener() {
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (!propertyName.equals(SCROLLBAR_INCREMENT)) {
+ return;
+ }
+ final int scrollbarIncrement = Integer.valueOf(newValue);
+ scrollPane.getHorizontalScrollBar().setUnitIncrement(scrollbarIncrement);
+ scrollPane.getVerticalScrollBar().setUnitIncrement(scrollbarIncrement);
+ }
+ });
+ }
+
+ public static Color getTextColorForBackground(final Color color) {
+ final int red = color.getRed();
+ final int blue = color.getBlue();
+ final int green = color.getGreen();
+ return red > 0x80 && blue > 0x80 && green > 0x80 ? Color.BLACK : Color.WHITE;
+ }
+
+ public static final Dimension MAX_BUTTON_DIMENSION = new Dimension(1000, 1000);
+
+// FIXME: not used - can we remove it? -- Volker
+// public static Controller getController(Component c) {
+// if(c == null){
+// return null;
+// }
+// final JRootPane rootPane = SwingUtilities.getRootPane(c);
+// if(rootPane == null){
+// return null;
+// }
+// Controller controller = (Controller) rootPane.getClientProperty(Controller.class);
+// if(controller != null){
+// return controller;
+// }
+// return getController(JOptionPane.getFrameForComponent(rootPane));
+// }
+
+ public static void focusOn(JComponent component) {
+ component.addAncestorListener(new AncestorListener() {
+ public void ancestorRemoved(AncestorEvent event) {
+ }
+
+ public void ancestorMoved(AncestorEvent event) {
+ }
+
+ public void ancestorAdded(AncestorEvent event) {
+ final JComponent component = event.getComponent();
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ component.requestFocus(); }
+ });
+ component.removeAncestorListener(this);
+ }
+ });
+ }
+
+ public static BasicStroke createStroke(int width, final int[] dash) {
+ final float[] fdash;
+ if(dash != null){
+ fdash = new float[dash.length];
+ int i = 0;
+ for(float d : dash){
+ fdash[i++] = d;
+ }
+ }
+ else{
+ fdash = null;
+ }
+ final BasicStroke stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1f, fdash, 0f);
+ return stroke;
+ }
+
+ public static void repaintAll(Container root) {
+ root.repaint();
+ for(int i = 0; i < root.getComponentCount(); i++){
+ final Component component = root.getComponent(i);
+ if(component instanceof Container){
+ repaintAll((Container) component);
+ }
+ else{
+ component.repaint();
+ }
+ }
+ }
+
+ public static JDialog createCancelDialog(final Component component, final String titel, final String text) {
+ final String[] options = { TextUtils.getText("cancel") };
+ final JOptionPane infoPane = new JOptionPane(text, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null,
+ options);
+ JDialog dialog = infoPane.createDialog(component, titel);
+ dialog.setModal(false);
+ return dialog;
+ }
+
+ public static void addTitledBorder(final JComponent c, final String title, final float size) {
+ final TitledBorder titledBorder = BorderFactory.createTitledBorder(title);
+ final Font titleFont = UIManager.getFont("TitledBorder.font");
+ titledBorder.setTitleFont(titleFont.deriveFont(size));
+ final Border btnBorder = c.getBorder();
+ if(btnBorder != null){
+ final CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(titledBorder, btnBorder);
+ c.setBorder(compoundBorder);
+ }
+ else{
+ c.setBorder(titledBorder);
+ }
+ }
+
+ public static void backOtherWindows() {
+ Component owner = getMenuComponent();
+ if(owner instanceof Window){
+ final Window[] ownedWindows = ((Window) owner).getOwnedWindows();
+ for(Window w : ownedWindows){
+ if(w.isVisible()){
+ w.toBack();
+ }
+ }
+ }
+ }
+
+ public static JButton createHtmlLinkStyleButton(final URI uri, final String title) {
+ final JButton button = new JButton("<html><a href='" + uri + "'>" + title);
+ button.setBorderPainted(false);
+ button.setOpaque(false);
+ button.setBackground(Color.lightGray);
+ button.setFocusable(false);
+ button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
+ button.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final UrlManager urlManager = modeController.getExtension(UrlManager.class);
+ urlManager.loadURL(uri);
+ }
+ });
+ return button;
+ }
+
+ public static final int getComponentIndex(Component component) {
+ if (component != null && component.getParent() != null) {
+ Container c = component.getParent();
+ for (int i = 0; i < c.getComponentCount(); i++) {
+ if (c.getComponent(i) == component)
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ public static final float FONT_SCALE_FACTOR;
+ static {
+ float factor = 1f;
+ try {
+ factor = UITools.getScreenResolution() / 72f;
+ }
+ catch (Exception e) {
+ }
+ FONT_SCALE_FACTOR = factor;
+ }
+
+ public static int getScreenResolution() {
+ final int systemScreenResolution = Toolkit.getDefaultToolkit().getScreenResolution();
+ if(ResourceController.getResourceController().getBooleanProperty("apply_system_screen_resolution")){
+ return systemScreenResolution;
+ }
+ else
+ return ResourceController.getResourceController().getIntProperty("user_defined_screen_resolution", systemScreenResolution);
+ }
+
+ public static Font scale(Font font) {
+ return font.deriveFont(font.getSize2D()*FONT_SCALE_FACTOR);
+ }
+ public static Font invertScale(Font font) {
+ return font.deriveFont(font.getSize2D()/FONT_SCALE_FACTOR);
+ }
+
+ public static void showFrame() {
+ final Component component = UITools.getMenuComponent();
+ if(component instanceof Window) {
+ Window window = (Window) component;
+ final Window[] ownedWindows = window.getOwnedWindows();
+ for (int i = 0; i < ownedWindows.length; i++) {
+ final Window ownedWindow = ownedWindows[i];
+ if (ownedWindow.getClass().equals(FreeplaneSplashModern.class) && ownedWindow.isVisible()) {
+ ownedWindow.setVisible(false);
+ }
+ }
+ if(window != null && ! window.isVisible()){
+ window.setVisible(true);
+ window.toFront();
+ }
+ }
+ }
+
+ public static boolean isEditingText() {
+ final Component focusOwner = FocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ final boolean isTextComponentFocused = focusOwner instanceof JTextComponent;
+ return isTextComponentFocused && focusOwner.isShowing() && ((JTextComponent)focusOwner).isEditable();
+ }
+
+ public static void executeWhenNodeHasFocus(final Runnable runnable) {
+ final Component selectedComponent = Controller.getCurrentController().getMapViewManager().getSelectedComponent();
+ if(selectedComponent != null && ! selectedComponent.hasFocus()){
+ selectedComponent.addFocusListener(new FocusListener() {
+
+ @Override
+ public void focusLost(FocusEvent e) {
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ selectedComponent.removeFocusListener(this);
+ runnable.run();
+ }
+ });
+ selectedComponent.requestFocusInWindow();
+ }
+ else
+ runnable.run();
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JCalendar.java b/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JCalendar.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/calendar/JCalendar.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JCalendar.java
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JDayChooser.java b/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JDayChooser.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/calendar/JDayChooser.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JDayChooser.java
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JMonthChooser.java b/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JMonthChooser.java
new file mode 100644
index 0000000..1205ae2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JMonthChooser.java
@@ -0,0 +1,376 @@
+/*
+ * JMonthChooser.java - A bean for choosing a month Copyright (C) 2004 Kai
+ * Toedter kai at toedter.com www.toedter.com This program is free software; you
+ * can redistribute it and/or modify it under the terms of the GNU Lesser
+ * General Public License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version. This program
+ * is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details. You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+package org.freeplane.core.ui.components.calendar;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.text.DateFormatSymbols;
+import java.util.Calendar;
+import java.util.Locale;
+
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.JTextField;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.UIManager;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+
+/**
+ * JMonthChooser is a bean for choosing a month.
+ *
+ * @author Kai Toedter
+ * @version $LastChangedRevision: 100 $
+ * @version $LastChangedDate: 2006-06-04 14:36:06 +0200 (So, 04 Jun 2006) $
+ */
+public class JMonthChooser extends JPanel implements ItemListener, ChangeListener {
+ public static final String MONTH_PROPERTY = "month";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Creates a JFrame with a JMonthChooser inside and can be used for testing.
+ *
+ * @param s
+ * The command line arguments
+ */
+ public static void main(final String[] s) {
+ final JFrame frame = new JFrame("MonthChooser");
+ frame.getContentPane().add(new JMonthChooser());
+ frame.pack();
+ frame.setVisible(true);
+ }
+
+ final private JComboBox comboBox;
+ private JDayChooser dayChooser;
+ /** true, if the month chooser has a spinner component */
+ protected boolean hasSpinner;
+ final private boolean initialized;
+ private Locale locale;
+ private boolean localInitialize;
+ private int month;
+ private int oldSpinnerValue = 0;
+ private JSpinner spinner;
+ private JYearChooser yearChooser;
+
+ /**
+ * Default JMonthChooser constructor.
+ */
+ public JMonthChooser() {
+ this(true);
+ }
+
+ /**
+ * JMonthChooser constructor with month spinner parameter.
+ *
+ * @param hasSpinner
+ * true, if the month chooser should have a spinner component
+ */
+ public JMonthChooser(final boolean hasSpinner) {
+ super();
+ setName("JMonthChooser");
+ this.hasSpinner = hasSpinner;
+ setLayout(new BorderLayout());
+ comboBox = new JComboBoxWithBorder();
+ comboBox.addItemListener(this);
+ locale = Locale.getDefault();
+ initNames();
+ if (hasSpinner) {
+ spinner = new JSpinner() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private JTextField textField = new JTextField();
+
+ @Override
+ public Dimension getPreferredSize() {
+ final Dimension size = super.getPreferredSize();
+ return new Dimension(size.width, textField.getPreferredSize().height);
+ }
+ };
+ spinner.addChangeListener(this);
+ spinner.setEditor(comboBox);
+ comboBox.setBorder(new EmptyBorder(0, 0, 0, 0));
+ updateUI();
+ add(spinner, BorderLayout.WEST);
+ }
+ else {
+ add(comboBox, BorderLayout.WEST);
+ }
+ initialized = true;
+ setMonth(Calendar.getInstance().get(Calendar.MONTH));
+ }
+
+ /**
+ * Returns the month chooser's comboBox text area (which allow the focus to
+ * be set to it).
+ *
+ * @return the combo box
+ */
+ public Component getComboBox() {
+ return comboBox;
+ }
+
+ /**
+ * Returns the locale.
+ *
+ * @return the locale value
+ * @see #setLocale
+ */
+ @Override
+ public Locale getLocale() {
+ return locale;
+ }
+
+ /**
+ * Returns the month.
+ *
+ * @return the month value
+ */
+ public int getMonth() {
+ return month;
+ }
+
+ /**
+ * Returns the month chooser's comboBox bar (which allow the focus to be set
+ * to it).
+ *
+ * @return Component the spinner or null, if the month chooser has no
+ * spinner
+ */
+ public Component getSpinner() {
+ return spinner;
+ }
+
+ /**
+ * Returns the type of spinner the month chooser is using.
+ *
+ * @return true, if the month chooser has a spinner
+ */
+ public boolean hasSpinner() {
+ return hasSpinner;
+ }
+
+ /**
+ * Initializes the locale specific month names.
+ */
+ public void initNames() {
+ localInitialize = true;
+ final DateFormatSymbols dateFormatSymbols = new DateFormatSymbols(locale);
+ final String[] monthNames = dateFormatSymbols.getMonths();
+ if (comboBox.getItemCount() == 12) {
+ comboBox.removeAllItems();
+ }
+ for (int i = 0; i < 12; i++) {
+ comboBox.addItem(monthNames[i]);
+ }
+ localInitialize = false;
+ comboBox.setSelectedIndex(month);
+ }
+
+ /**
+ * The ItemListener for the months.
+ *
+ * @param e
+ * the item event
+ */
+ public void itemStateChanged(final ItemEvent e) {
+ if (e.getStateChange() == ItemEvent.SELECTED) {
+ final int index = comboBox.getSelectedIndex();
+ if ((index >= 0) && (index != month)) {
+ setMonth(index, false);
+ }
+ }
+ }
+
+ /**
+ * Convenience method set a day chooser.
+ *
+ * @param dayChooser
+ * the day chooser
+ */
+ public void setDayChooser(final JDayChooser dayChooser) {
+ this.dayChooser = dayChooser;
+ }
+
+ /**
+ * Enable or disable the JMonthChooser.
+ *
+ * @param enabled
+ * the new enabled value
+ */
+ @Override
+ public void setEnabled(final boolean enabled) {
+ super.setEnabled(enabled);
+ comboBox.setEnabled(enabled);
+ if (spinner != null) {
+ spinner.setEnabled(enabled);
+ }
+ }
+
+ /**
+ * Sets the font for this component.
+ *
+ * @param font
+ * the desired <code>Font</code> for this component
+ */
+ @Override
+ public void setFont(final Font font) {
+ if (comboBox != null) {
+ comboBox.setFont(font);
+ }
+ super.setFont(font);
+ }
+
+ /**
+ * Set the locale and initializes the new month names.
+ *
+ * @param l
+ * the new locale value
+ * @see #getLocale
+ */
+ @Override
+ public void setLocale(final Locale l) {
+ if (!initialized) {
+ super.setLocale(l);
+ }
+ else {
+ locale = l;
+ initNames();
+ }
+ }
+
+ /**
+ * Sets the month. This is a bound property. Valuse are valid between 0
+ * (January) and 11 (December). A value < 0 will be treated as 0, a value >
+ * 11 will be treated as 11.
+ *
+ * @param newMonth
+ * the new month value
+ * @see #getMonth
+ */
+ public void setMonth(final int newMonth) {
+ if (newMonth < 0 || newMonth == Integer.MIN_VALUE) {
+ setMonth(0, true);
+ }
+ else if (newMonth > 11) {
+ setMonth(11, true);
+ }
+ else {
+ setMonth(newMonth, true);
+ }
+ }
+
+ /**
+ * Sets the month attribute of the JMonthChooser object. Fires a property
+ * change "month".
+ *
+ * @param newMonth
+ * the new month value
+ * @param select
+ * true, if the month should be selcted in the combo box.
+ */
+ private void setMonth(final int newMonth, final boolean select) {
+ if (!initialized || localInitialize) {
+ return;
+ }
+ final int oldMonth = month;
+ month = newMonth;
+ if (select) {
+ comboBox.setSelectedIndex(month);
+ }
+ if (dayChooser != null) {
+ dayChooser.setMonth(month);
+ }
+ firePropertyChange(JMonthChooser.MONTH_PROPERTY, oldMonth, month);
+ }
+
+ /**
+ * Convenience method set a year chooser. If set, the spin for the month
+ * buttons will spin the year as well
+ *
+ * @param yearChooser
+ * the new yearChooser value
+ */
+ public void setYearChooser(final JYearChooser yearChooser) {
+ this.yearChooser = yearChooser;
+ }
+
+ /**
+ * Is invoked if the state of the spnner changes.
+ *
+ * @param e
+ * the change event.
+ */
+ public void stateChanged(final ChangeEvent e) {
+ final SpinnerNumberModel model = (SpinnerNumberModel) ((JSpinner) e.getSource()).getModel();
+ final int value = model.getNumber().intValue();
+ final boolean increase = (value > oldSpinnerValue) ? true : false;
+ oldSpinnerValue = value;
+ int month = getMonth();
+ if (increase) {
+ month += 1;
+ if (month == 12) {
+ month = 0;
+ if (yearChooser != null) {
+ int year = yearChooser.getYear();
+ year += 1;
+ yearChooser.setYear(year);
+ }
+ }
+ }
+ else {
+ month -= 1;
+ if (month == -1) {
+ month = 11;
+ if (yearChooser != null) {
+ int year = yearChooser.getYear();
+ year -= 1;
+ yearChooser.setYear(year);
+ }
+ }
+ }
+ setMonth(month);
+ }
+
+ /**
+ * Updates the UI.
+ *
+ * @see javax.swing.JPanel#updateUI()
+ */
+ @Override
+ public void updateUI() {
+ final JSpinner testSpinner = new JSpinner();
+ if (spinner != null) {
+ if ("Windows".equals(UIManager.getLookAndFeel().getID())) {
+ spinner.setBorder(testSpinner.getBorder());
+ }
+ else {
+ spinner.setBorder(new EmptyBorder(0, 0, 0, 0));
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JSpinField.java b/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JSpinField.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/calendar/JSpinField.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JSpinField.java
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JTimeChooser.java b/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JTimeChooser.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/calendar/JTimeChooser.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JTimeChooser.java
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JTripleCalendar.java b/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JTripleCalendar.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/calendar/JTripleCalendar.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JTripleCalendar.java
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JYearChooser.java b/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JYearChooser.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/calendar/JYearChooser.java
rename to freeplane/src/main/java/org/freeplane/core/ui/components/calendar/JYearChooser.java
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/jcalendar-license.txt b/freeplane/src/main/java/org/freeplane/core/ui/components/calendar/jcalendar-license.txt
similarity index 100%
rename from freeplane/src/org/freeplane/core/ui/components/calendar/jcalendar-license.txt
rename to freeplane/src/main/java/org/freeplane/core/ui/components/calendar/jcalendar-license.txt
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/html/CssRuleBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/components/html/CssRuleBuilder.java
new file mode 100644
index 0000000..fc15d40
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/html/CssRuleBuilder.java
@@ -0,0 +1,87 @@
+package org.freeplane.core.ui.components.html;
+
+import java.awt.Color;
+import java.awt.Font;
+
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.Quantity;
+
+public class CssRuleBuilder {
+ private StringBuilder rule = new StringBuilder();
+ public String buildRule() {
+ return rule.toString();
+ }
+
+ public CssRuleBuilder withFont(Font font) {
+ return withFont(font, 1f);
+ }
+
+ public CssRuleBuilder withFont(Font font, float fontScaleFactor) {
+ if (font != null) {
+ rule.append(" font-family: ");
+ rule.append(font.getFamily());
+ rule.append("; ");
+ rule.append(" font-size: ");
+ final int fontSize = Math.round(font.getSize() / fontScaleFactor);
+ rule.append(fontSize);
+ rule.append("pt;");
+ if (font.isBold()) {
+ rule.append(" font-weight: bold;");
+ }
+ if (font.isItalic()) {
+ rule.append(" font-style: italic;");
+ }
+ }
+ return this;
+ }
+
+ public CssRuleBuilder withColor(Color color) {
+ if (color != null) {
+ rule.append("color: ").append(ColorUtils.colorToString(color)).append(";");
+ }
+ return this;
+ }
+
+ public CssRuleBuilder withBackground(Color color) {
+ if (color != null) {
+ rule.append("background-color: ").append(ColorUtils.colorToString(color)).append(";");
+ }
+ return this;
+ }
+
+ public CssRuleBuilder withAlignment(int alignment) {
+ switch (alignment) {
+ case SwingConstants.CENTER:
+ rule.append("text-align: center;");
+ break;
+ case SwingConstants.LEFT:
+ rule.append("text-align: left;");
+ break;
+ case SwingConstants.RIGHT:
+ rule.append("text-align: right;");
+ break;
+ default:
+ break;
+ }
+ return this;
+
+ }
+
+ public String toString() {
+ return rule.toString();
+ }
+
+ public CssRuleBuilder withMaxWidthAsPt(Quantity<?>... widths) {
+ int maxBaseUnits = -1;
+ for(Quantity<?> width : widths)
+ if(width != null)
+ maxBaseUnits = Math.max(maxBaseUnits, width.toBaseUnitsRounded());
+ if(maxBaseUnits >= 0)
+ rule.append("width: ")
+ .append(maxBaseUnits).append("pt")
+ .append(";");
+ return this;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/html/ScaledEditorKit.java b/freeplane/src/main/java/org/freeplane/core/ui/components/html/ScaledEditorKit.java
new file mode 100644
index 0000000..3d7e578
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/html/ScaledEditorKit.java
@@ -0,0 +1,103 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Freeplane team and others
+ *
+ * this file is created by Dimitry Polivaev in 2012.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components.html;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.io.StringReader;
+
+import javax.swing.JLabel;
+import javax.swing.text.Document;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.StyleSheet;
+
+import org.freeplane.core.ui.components.UITools;
+
+ at SuppressWarnings("serial")
+public class ScaledEditorKit extends HTMLEditorKit {
+ /** Shared base style for all documents created by us use. */
+ private static StyleSheet defaultStyles;
+
+ protected ScaledEditorKit() {
+ };
+
+ /**
+ * Overriden to return our own slimmed down style sheet.
+ */
+ public StyleSheet getStyleSheet() {
+ if (defaultStyles == null) {
+ defaultStyles = new StyleSheet();
+ StringReader r = new StringReader(ScaledHTML.styleChanges);
+ try {
+ defaultStyles.loadRules(r, null);
+ }
+ catch (Throwable e) {
+ // don't want to die in static initialization...
+ // just display things wrong.
+ }
+ r.close();
+ defaultStyles.addStyleSheet(super.getStyleSheet());
+ }
+ return defaultStyles;
+ }
+
+ @Override
+ public Document createDefaultDocument() {
+ StyleSheet styles = getStyleSheet();
+ StyleSheet ss = new ScaledStyleSheet();
+ ss.addStyleSheet(styles);
+ HTMLDocument doc = new HTMLDocument(ss);
+ doc.setParser(getParser());
+ doc.setAsynchronousLoadPriority(4);
+ doc.setTokenThreshold(100);
+ return doc;
+ }
+
+ static public ScaledEditorKit create() {
+ if (kit == null) {
+ kit = new ScaledEditorKit();
+ }
+ return kit;
+ }
+
+ /**
+ * The source of the html renderers
+ */
+ private static ScaledEditorKit kit;
+
+ public Document createDefaultDocument(JLabel c) {
+ Font font = c.getFont();
+ Color foreground = c.getForeground();
+ StyleSheet styles = getStyleSheet();
+ StyleSheet ss = new ScaledStyleSheet();
+ ss.addStyleSheet(styles);
+ HTMLDocument doc = new HTMLDocument(ss);
+ doc.setPreservesUnknownTags(false);
+ doc.getStyleSheet().addRule(new StringBuffer("body {").append(new CssRuleBuilder()
+ .withFont(font, UITools.FONT_SCALE_FACTOR)
+ .withColor(foreground)
+ .withAlignment(c.getHorizontalAlignment())).append("}").toString());
+ doc.setParser(getParser());
+ doc.setAsynchronousLoadPriority(Integer.MAX_VALUE);
+ doc.setPreservesUnknownTags(false);
+ return doc;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/html/ScaledHTML.java b/freeplane/src/main/java/org/freeplane/core/ui/components/html/ScaledHTML.java
new file mode 100644
index 0000000..b963fec
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/html/ScaledHTML.java
@@ -0,0 +1,213 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Freeplane team and others
+ *
+ * this file is created by Dimitry Polivaev in 2012.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components.html;
+
+import java.awt.Container;
+import java.awt.Graphics;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.io.Reader;
+import java.io.StringReader;
+import java.net.URL;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.plaf.basic.BasicHTML;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.Element;
+import javax.swing.text.Position;
+import javax.swing.text.View;
+import javax.swing.text.ViewFactory;
+import javax.swing.text.html.HTMLDocument;
+
+public class ScaledHTML extends BasicHTML{
+
+ /**
+ * Create an html renderer for the given component and
+ * string of html.
+ */
+ public static View createHTMLView(JLabel c, String html) {
+ ScaledEditorKit kit = ScaledEditorKit.create();
+ Document doc = kit.createDefaultDocument(c);
+ Object base = c.getClientProperty(documentBaseKey);
+ if (base instanceof URL) {
+ ((HTMLDocument)doc).setBase((URL)base);
+ }
+ Reader r = new StringReader(html);
+ try {
+ kit.read(r, doc, 0);
+ } catch (Throwable e) {
+ }
+ ViewFactory f = kit.getViewFactory();
+ View hview = f.create(doc.getDefaultRootElement());
+ View v = new Renderer(c, f, hview);
+ return v;
+ }
+
+ public static void updateRenderer(JLabel c, String text) {
+ View value = null;
+ try{
+ View oldValue = (View)c.getClientProperty(propertyKey);
+ if (isHTMLString(text)) {
+ value = ScaledHTML.createHTMLView(c, text);
+ }
+ if (value != oldValue && oldValue != null) {
+ for (int i = 0; i < oldValue.getViewCount(); i++) {
+ oldValue.getView(i).setParent(null);
+ }
+ }
+ }
+ finally{
+ c.putClientProperty(BasicHTML.propertyKey, value);
+ }
+ }
+
+
+ /**
+ * Overrides to the default stylesheet. Should consider
+ * just creating a completely fresh stylesheet.
+ */
+ static final String styleChanges =
+ "p { margin-top: 0; margin-bottom: 0; margin-left: 0; margin-right: 0 }" +
+ "body { margin-top: 0; margin-bottom: 0; margin-left: 0; margin-right: 0 }";
+
+ /**
+ * Root text view that acts as an HTML renderer.
+ */
+ public static class Renderer extends View {
+
+ Renderer(JComponent c, ViewFactory f, View v) {
+ super(null);
+ setSizeRunning = true;
+ host = c;
+ factory = f;
+ view = v;
+ view.setParent(this);
+ // initially layout to the preferred size
+ setSize(view.getPreferredSpan(X_AXIS), view.getPreferredSpan(Y_AXIS));
+ }
+
+ public AttributeSet getAttributes() {
+ return null;
+ }
+
+ public float getPreferredSpan(int axis) {
+ if (axis == X_AXIS) {
+ // width currently laid out to
+ return width;
+ }
+ return view.getPreferredSpan(axis);
+ }
+
+ public float getMinimumSpan(int axis) {
+ return view.getMinimumSpan(axis);
+ }
+
+ public float getMaximumSpan(int axis) {
+ return Integer.MAX_VALUE;
+ }
+
+ public void preferenceChanged(View child, boolean width, boolean height) {
+ if(! setSizeRunning){
+ setSize(view.getPreferredSpan(X_AXIS), view.getPreferredSpan(Y_AXIS));
+ host.revalidate();
+ host.repaint();
+ }
+ }
+
+ public float getAlignment(int axis) {
+ return view.getAlignment(axis);
+ }
+
+ public void paint(Graphics g, Shape allocation) {
+ Rectangle alloc = allocation.getBounds();
+ view.setSize(alloc.width, alloc.height);
+ view.paint(g, allocation);
+ }
+
+ public void setParent(View parent) {
+ throw new Error("Can't set parent on root view");
+ }
+
+ public int getViewCount() {
+ return 1;
+ }
+ public View getView(int n) {
+ return view;
+ }
+ public Shape modelToView(int pos, Shape a, Position.Bias b) throws BadLocationException {
+ return view.modelToView(pos, a, b);
+ }
+
+ public Shape modelToView(int p0, Position.Bias b0, int p1,
+ Position.Bias b1, Shape a) throws BadLocationException {
+ return view.modelToView(p0, b0, p1, b1, a);
+ }
+
+ public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
+ return view.viewToModel(x, y, a, bias);
+ }
+
+ public Document getDocument() {
+ return view.getDocument();
+ }
+
+ public int getStartOffset() {
+ return view.getStartOffset();
+ }
+
+ public int getEndOffset() {
+ return view.getEndOffset();
+ }
+
+ public Element getElement() {
+ return view.getElement();
+ }
+
+ public void setSize(float width, float height) {
+ setSizeRunning = true;
+ this.width = (int) width;
+ view.setSize(width, height);
+ setSizeRunning = false;
+ }
+
+ public void resetSize() {
+ setSize(0, 0);
+ setSize(view.getPreferredSpan(X_AXIS), view.getPreferredSpan(Y_AXIS));
+ }
+
+ public Container getContainer() {
+ return host;
+ }
+
+ public ViewFactory getViewFactory() {
+ return factory;
+ }
+
+ private int width;
+ private View view;
+ private ViewFactory factory;
+ private JComponent host;
+ private boolean setSizeRunning;
+
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/html/ScaledStyleSheet.java b/freeplane/src/main/java/org/freeplane/core/ui/components/html/ScaledStyleSheet.java
new file mode 100644
index 0000000..df59d7b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/html/ScaledStyleSheet.java
@@ -0,0 +1,61 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Freeplane team and others
+ *
+ * this file is created by Dimitry Polivaev in 2012.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.ui.components.html;
+
+import java.awt.Font;
+import javax.swing.text.AttributeSet;
+import javax.swing.text.html.CSS;
+import javax.swing.text.html.StyleSheet;
+
+import org.freeplane.core.ui.components.UITools;
+
+
+public class ScaledStyleSheet extends StyleSheet{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ public Font getFont(AttributeSet a) {
+ final Font font = super.getFont(a);
+ final float fontScaleFactor = getFontScaleFactor(a);
+ return super.getFont(font.getFamily(), font.getStyle(), Math.round(font.getSize2D() * fontScaleFactor));
+ }
+
+ private float getFontScaleFactor(AttributeSet a) {
+ final Object attribute = a.getAttribute(CSS.Attribute.FONT_SIZE);
+ if(attribute == null)
+ return UITools.FONT_SCALE_FACTOR;
+ final String fontSize = attribute.toString();
+ final int fsLength = fontSize.length();
+ if(fsLength <= 1
+ || Character.isDigit(fontSize.charAt(fsLength-1))
+ || fontSize.endsWith("pt"))
+ return UITools.FONT_SCALE_FACTOR;
+ if(fontSize.endsWith("px"))
+ return 1/1.3f;
+ if(fontSize.endsWith("%") || fontSize.endsWith("em") || fontSize.endsWith("ex")
+ || fontSize.endsWith("er"))
+ return getFontScaleFactor(a.getResolveParent());
+ return UITools.FONT_SCALE_FACTOR;
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/components/html/SynchronousScaledEditorKit.java b/freeplane/src/main/java/org/freeplane/core/ui/components/html/SynchronousScaledEditorKit.java
new file mode 100644
index 0000000..cc7e9d9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/components/html/SynchronousScaledEditorKit.java
@@ -0,0 +1,37 @@
+package org.freeplane.core.ui.components.html;
+
+import javax.swing.text.Element;
+import javax.swing.text.View;
+import javax.swing.text.ViewFactory;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.ImageView;
+
+ at SuppressWarnings("serial")
+public class SynchronousScaledEditorKit extends ScaledEditorKit {
+ private static ViewFactory synchronousFactory;
+ private static ScaledEditorKit kit;
+ static public ScaledEditorKit create() {
+ if (kit == null) {
+ synchronousFactory = new HTMLEditorKit.HTMLFactory(){
+ public View create(Element elem) {
+ View view = super.create(elem);
+
+ if (view instanceof ImageView) {
+ ((ImageView)view).setLoadsSynchronously(true);
+ }
+ return view;
+ }
+ };
+ kit = new SynchronousScaledEditorKit();
+ }
+ return kit;
+ }
+
+ @Override
+ public ViewFactory getViewFactory() {
+ return synchronousFactory;
+ }
+
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/FreeplaneResourceAccessor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/FreeplaneResourceAccessor.java
new file mode 100644
index 0000000..ce4a9d7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/FreeplaneResourceAccessor.java
@@ -0,0 +1,39 @@
+package org.freeplane.core.ui.menubuilders;
+
+import java.net.URL;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+import org.freeplane.core.util.TextUtils;
+
+public class FreeplaneResourceAccessor implements ResourceAccessor {
+ @Override
+ public URL getResource(final String key) {
+ return ResourceController.getResourceController().getResource(key);
+ }
+
+ @Override
+ public String getRawText(String key) {
+ return TextUtils.getRawText(key);
+ }
+
+ @Override
+ public String getProperty(final String key) {
+ return ResourceController.getResourceController().getProperty(key, null);
+ }
+
+ @Override
+ public int getIntProperty(String key, int defaultValue) {
+ return ResourceController.getResourceController().getIntProperty(key, defaultValue);
+ }
+
+ @Override
+ public String getText(String key) {
+ return TextUtils.getText(key);
+ }
+
+ @Override
+ public String getText(String key, String defaultValue) {
+ return TextUtils.getText(key, defaultValue);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/XmlEntryStructureBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/XmlEntryStructureBuilder.java
new file mode 100644
index 0000000..4d42e2a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/XmlEntryStructureBuilder.java
@@ -0,0 +1,111 @@
+package org.freeplane.core.ui.menubuilders;
+
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.Arrays;
+import java.util.LinkedList;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class XmlEntryStructureBuilder implements EntryVisitor{
+
+
+ static final String ENTRY = "Entry";
+ private Reader stringReader;
+
+ public XmlEntryStructureBuilder(Reader stringReader) {
+ this.stringReader = stringReader;
+
+ }
+
+ public void visit(Entry target) {
+ try {
+ SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();
+ XMLReader xmlReader = saxParser.getXMLReader();
+ xmlReader.setContentHandler(new MenuStructureXmlHandler(target));
+ xmlReader.parse(new InputSource(stringReader));
+ } catch (RuntimeException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ static public Entry buildMenuStructure(String xmlWithoutContent) {
+ final Reader reader = new StringReader(xmlWithoutContent);
+ return buildMenuStructure(reader);
+ }
+
+ static public Entry buildMenuStructure(final Reader reader) {
+ XmlEntryStructureBuilder builder = new XmlEntryStructureBuilder(reader);
+ Entry initialMenuStructure = new Entry();
+ builder.visit(initialMenuStructure);
+ return initialMenuStructure;
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+}
+
+class MenuStructureXmlHandler extends DefaultHandler {
+ private static final String NAME = "name";
+ private static final String BUILDER = "builder";
+ final private LinkedList<Entry> childStack;
+
+ public MenuStructureXmlHandler(Entry root) {
+ childStack = new LinkedList<Entry>();
+ childStack.add(root);
+ }
+
+ @Override
+ public void startElement(String uri, String localName,
+ String qName, Attributes attributes)
+ throws SAXException {
+ if(qName.equals(XmlEntryStructureBuilder.ENTRY)){
+ final Entry child = new Entry();
+ for (int attributeIndex = 0; attributeIndex < attributes.getLength(); attributeIndex++){
+ final String attributeName = attributes.getQName(attributeIndex).intern();
+ final String attributeValue = attributes.getValue(attributeName).intern();
+ if(attributeName == BUILDER)
+ child.setBuilders(Arrays.asList(attributeValue.split("\\s*,\\s*")));
+ else if(attributeName == NAME)
+ child.setName(attributeValue);
+ else
+ child.setAttribute(attributeName, toValueObject(attributeValue));
+ }
+ childStack.getLast().addChild(child);
+ childStack.add(child);
+ }
+ }
+
+ private Object toValueObject(String attributeValue) {
+ if("true".equalsIgnoreCase(attributeValue))
+ return Boolean.TRUE;
+ else if("false".equalsIgnoreCase(attributeValue))
+ return Boolean.FALSE;
+ else
+ return attributeValue;
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName)
+ throws SAXException {
+ super.endElement(uri, localName, qName);
+ childStack.removeLast();
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/AcceleratebleActionProvider.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/AcceleratebleActionProvider.java
new file mode 100644
index 0000000..6902bb6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/AcceleratebleActionProvider.java
@@ -0,0 +1,23 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.AccelerateableAction;
+import org.freeplane.core.ui.IFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+
+public class AcceleratebleActionProvider {
+ public IFreeplaneAction wrap(final AFreeplaneAction action) {
+ if (isApplet()) {
+ return action;
+ }
+ return acceleratableAction(action);
+ }
+
+ protected boolean isApplet() {
+ return Controller.getCurrentController().getViewController().isApplet();
+ }
+
+ public IFreeplaneAction acceleratableAction(final AFreeplaneAction action) {
+ return new AccelerateableAction(action);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/AcceleratorBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/AcceleratorBuilder.java
new file mode 100644
index 0000000..d02638f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/AcceleratorBuilder.java
@@ -0,0 +1,37 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+
+public class AcceleratorBuilder implements EntryVisitor{
+
+ private final IAcceleratorMap map;
+ private final IEntriesForAction entries;
+
+ public AcceleratorBuilder(IAcceleratorMap map, IEntriesForAction entries) {
+ this.map = map;
+ this.entries = entries;
+ }
+
+ public void visit(Entry entry) {
+ final AFreeplaneAction action = new EntryAccessor().getAction(entry);
+ if (action != null) {
+ final EntryAccessor entryAccessor = new EntryAccessor();
+ String accelerator = entryAccessor.getAccelerator(entry);
+ if(accelerator != null) {
+ map.setDefaultAccelerator(action, accelerator);
+ }
+ else
+ map.setUserDefinedAccelerator(action);
+ entries.registerEntry(action, entry);
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/AcceleratorDestroyer.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/AcceleratorDestroyer.java
new file mode 100644
index 0000000..5b1a3ca
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/AcceleratorDestroyer.java
@@ -0,0 +1,28 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+
+public class AcceleratorDestroyer implements EntryVisitor{
+
+ private final IEntriesForAction entries;
+
+ public AcceleratorDestroyer(IEntriesForAction entries) {
+ this.entries = entries;
+ }
+
+ public void visit(Entry entry) {
+ final AFreeplaneAction action = new EntryAccessor().getAction(entry);
+ if (action != null) {
+ entries.unregisterEntry(action, entry);
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/ActionFinder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/ActionFinder.java
new file mode 100644
index 0000000..5832423
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/ActionFinder.java
@@ -0,0 +1,68 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import java.util.Arrays;
+
+import org.freeplane.core.resources.SetBooleanPropertyAction;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.FreeplaneActions;
+import org.freeplane.features.styles.SetBooleanMapPropertyAction;
+
+public class ActionFinder implements EntryVisitor{
+
+ final private FreeplaneActions freeplaneActions;
+
+ public ActionFinder(FreeplaneActions freeplaneActions) {
+ this.freeplaneActions = freeplaneActions;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void visit(final Entry target) {
+ final String actionName = target.getName();
+ if (!actionName.isEmpty() && new EntryAccessor().getAction(target) == null) {
+ AFreeplaneAction action = freeplaneActions.getAction(actionName);
+ if(action == null) {
+ for (final Class<? extends AFreeplaneAction> actionClass : Arrays.asList(SetBooleanPropertyAction.class, SetBooleanMapPropertyAction.class)){
+ AFreeplaneAction newAction = createAction(actionClass, actionName);
+ action = newAction;
+ if(action != null) {
+ freeplaneActions.addAction(action);
+ break;
+ }
+ }
+ }
+
+ new EntryAccessor().setAction(target, action);
+ }
+ }
+
+ AFreeplaneAction createAction(final Class<? extends AFreeplaneAction> actionClass, final String actionName) {
+ final String setBooleanPropertyActionPrefix = actionClass.getSimpleName() + ".";
+ AFreeplaneAction newAction = null;
+ if (actionName.startsWith(setBooleanPropertyActionPrefix)) {
+ String propertyName = actionName.substring(setBooleanPropertyActionPrefix.length());
+ newAction = createSetBooleanPropertyAction(actionClass, propertyName);
+ }
+ return newAction;
+ }
+
+ protected AFreeplaneAction createSetBooleanPropertyAction(
+ Class<? extends AFreeplaneAction> actionClass, String propertyName) {
+ try {
+ return actionClass.getConstructor(String.class).newInstance(propertyName);
+ } catch (Exception e) {
+ LogUtils.severe(e);
+ return null;
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/ActionSelectListener.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/ActionSelectListener.java
new file mode 100644
index 0000000..6ef84fc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/ActionSelectListener.java
@@ -0,0 +1,19 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryPopupListener;
+
+public class ActionSelectListener implements EntryPopupListener {
+ public void childEntriesWillBecomeVisible(final Entry submenu) {
+ for (Entry target : submenu.children()) {
+ final AFreeplaneAction action = new EntryAccessor().getAction(target);
+ if (action != null && action.checkSelectionOnPopup() && action.isEnabled())
+ action.setSelected();
+ }
+ }
+
+ public void childEntriesHidden(final Entry target) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/ComponentBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/ComponentBuilder.java
new file mode 100644
index 0000000..f810292
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/ComponentBuilder.java
@@ -0,0 +1,24 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.menu.ComponentProvider;
+
+public class ComponentBuilder implements EntryVisitor {
+ final private ComponentProvider componentProvider;
+
+ public ComponentBuilder(ComponentProvider componentProvider) {
+ this.componentProvider = componentProvider;
+ }
+
+ @Override
+ public void visit(Entry target) {
+ new EntryAccessor().setComponent(target, componentProvider.createComponent(target));
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/EntriesForAction.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/EntriesForAction.java
new file mode 100644
index 0000000..ce0f4aa
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/EntriesForAction.java
@@ -0,0 +1,39 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+
+public class EntriesForAction implements IEntriesForAction {
+ final Map<AFreeplaneAction, Collection<Entry>> entryMap = new HashMap<AFreeplaneAction, Collection<Entry>>();
+
+ @Override
+ public void registerEntry(AFreeplaneAction action, Entry actionEntry) {
+ final Collection<Entry> collection = entryMap.get(action);
+ if (collection == null) {
+ final LinkedList<Entry> list = new LinkedList<Entry>();
+ list.add(actionEntry);
+ entryMap.put(action, list);
+ }
+ else
+ collection.add(actionEntry);
+ }
+
+ @Override
+ public void unregisterEntry(AFreeplaneAction action, Entry actionEntry) {
+ final Collection<Entry> collection = entryMap.get(action);
+ collection.remove(actionEntry);
+ if (collection.isEmpty())
+ entryMap.remove(action);
+ }
+
+ public Collection<Entry> entries(AFreeplaneAction action) {
+ final Collection<Entry> collection = entryMap.get(action);
+ return collection != null ? collection : Collections.<Entry> emptyList();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/IAcceleratorMap.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/IAcceleratorMap.java
new file mode 100644
index 0000000..54bf409
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/IAcceleratorMap.java
@@ -0,0 +1,16 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IAcceleratorChangeListener;
+import org.freeplane.features.mode.FreeplaneActions;
+
+public interface IAcceleratorMap {
+ void setUserDefinedAccelerator(AFreeplaneAction action);
+ void setDefaultAccelerator(final AFreeplaneAction action, final String accelerator);
+ public KeyStroke getAccelerator(AFreeplaneAction action);
+
+ void addAcceleratorChangeListener(FreeplaneActions freeplaneActions, IAcceleratorChangeListener changeListener);
+ void removeAction(FreeplaneActions freeplaneActions, AFreeplaneAction action);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/IEntriesForAction.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/IEntriesForAction.java
new file mode 100644
index 0000000..d15d327
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/action/IEntriesForAction.java
@@ -0,0 +1,10 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+
+public interface IEntriesForAction {
+ void registerEntry(AFreeplaneAction action, Entry actionEntry);
+
+ void unregisterEntry(AFreeplaneAction action, Entry actionEntry);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/AttributeAlreadySetException.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/AttributeAlreadySetException.java
new file mode 100644
index 0000000..c64c8f6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/AttributeAlreadySetException.java
@@ -0,0 +1,10 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+ at SuppressWarnings("serial")
+public class AttributeAlreadySetException extends RuntimeException {
+
+ public AttributeAlreadySetException(Entry entry, Object key, Object object) {
+ super("In entry " + entry.getPath() + " attribute " + key + " already has value " + String.valueOf(object));
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/BuildPhaseListener.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/BuildPhaseListener.java
new file mode 100644
index 0000000..c8bdb1c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/BuildPhaseListener.java
@@ -0,0 +1,8 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+
+public interface BuildPhaseListener {
+
+ void buildPhaseFinished(Phase actions, Entry entry);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/BuildProcessFactory.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/BuildProcessFactory.java
new file mode 100644
index 0000000..5e3d20b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/BuildProcessFactory.java
@@ -0,0 +1,9 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+public interface BuildProcessFactory {
+
+ public PhaseProcessor getBuildProcessor();
+
+ public SubtreeProcessor getChildProcessor();
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/BuilderDestroyerPair.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/BuilderDestroyerPair.java
new file mode 100644
index 0000000..11b2799
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/BuilderDestroyerPair.java
@@ -0,0 +1,22 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+
+
+public class BuilderDestroyerPair {
+ enum VisitorType {
+ BUILDER, DESTROYER
+ };
+ final private EntryVisitor[] visitors;
+ public BuilderDestroyerPair(EntryVisitor builder, EntryVisitor destroyer) {
+ visitors = new EntryVisitor[] { builder, destroyer };
+ }
+
+ public BuilderDestroyerPair(EntryVisitor builder) {
+ this(builder, EntryVisitor.ILLEGAL);
+ }
+
+ public EntryVisitor get(VisitorType visitorType) {
+ return visitors[visitorType.ordinal()];
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ChildActionEntryRemover.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ChildActionEntryRemover.java
new file mode 100644
index 0000000..179a21c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ChildActionEntryRemover.java
@@ -0,0 +1,28 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.FreeplaneActions;
+
+public class ChildActionEntryRemover extends ChildEntryRemover{
+ private final FreeplaneActions freeplaneActions;
+ private final static EntryAccessor entryAccessor = new EntryAccessor();
+
+ public ChildActionEntryRemover(FreeplaneActions freeplaneActions) {
+ super();
+ this.freeplaneActions = freeplaneActions;
+ }
+
+ @Override
+ public void visit(Entry target) {
+ unregisterActions(target);
+ super.visit(target);
+ }
+
+ private void unregisterActions(Entry target) {
+ final AFreeplaneAction action = entryAccessor.getAction(target);
+ if(action != null)
+ freeplaneActions.removeActionIfSet(action.getKey());
+ for(Entry entry : target.children())
+ unregisterActions(entry);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ChildEntryFilter.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ChildEntryFilter.java
new file mode 100644
index 0000000..73205d6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ChildEntryFilter.java
@@ -0,0 +1,18 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+
+public abstract class ChildEntryFilter implements EntryVisitor {
+ abstract public boolean shouldRemove(Entry entry);
+
+ @Override
+ public void visit(Entry entry) {
+ if (shouldRemove(entry))
+ entry.getParent().remove(entry);
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return shouldRemove(entry);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ChildEntryRemover.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ChildEntryRemover.java
new file mode 100644
index 0000000..46ae5e0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ChildEntryRemover.java
@@ -0,0 +1,14 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+
+class ChildEntryRemover implements EntryVisitor {
+ @Override
+ public void visit(Entry target) {
+ target.removeChildren();
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EmptyEntryVisitor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EmptyEntryVisitor.java
new file mode 100644
index 0000000..0b4f518
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EmptyEntryVisitor.java
@@ -0,0 +1,12 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+public class EmptyEntryVisitor implements EntryVisitor {
+ @Override
+ public void visit(Entry target) {
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/Entry.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/Entry.java
new file mode 100644
index 0000000..d7507ba
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/Entry.java
@@ -0,0 +1,253 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.freeplane.core.util.LogUtils;
+
+/**
+ * @author Dimitry
+ *
+ */
+public class Entry {
+
+ private String name;
+ private Entry parent;
+ private List<String> builders;
+ final private Map<Object, Object> attributes;
+ final private ArrayList<Entry> childEntries;
+
+
+ public Entry() {
+ super();
+ this.name = "";
+ childEntries = new ArrayList<Entry>();
+ attributes = new HashMap<Object, Object>();
+ builders = Collections.emptyList();
+ }
+
+
+ public void setAttribute(final String key, Object value) {
+ setAttributeObject(key, value);
+ }
+
+ public void setAttribute(Class<?> valueClass, Object value) {
+ setAttributeObject(valueClass, value);
+ }
+
+ private void setAttributeObject(final Object key, Object value) {
+ if(attributes.containsKey(key)){
+ if(value != attributes.get(key)) {
+ throw new AttributeAlreadySetException(this, key, attributes.get(key));
+ }
+ }
+ else
+ attributes.put(key, value);
+ }
+
+ public Object getAttribute(final String key) {
+ return attributes.get(key);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T getAttribute(final Class<T> key) {
+ return (T)attributes.get(key);
+ }
+
+ public void addChild(Entry entry) {
+ childEntries.add(entry);
+ entry.setParent(this);
+ }
+
+ private void setParent(Entry parent) {
+ this.parent = parent;
+
+ }
+
+ public Entry setBuilders(List<String> builders) {
+ this.builders = builders;
+ return this;
+
+ }
+
+ public Entry setBuilders(String... builders) {
+ return setBuilders(Arrays.asList(builders));
+ }
+
+ public Entry getParent() {
+ return parent;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPath() {
+ return (parent != null ? parent.getPath() : "") + "/" + getName();
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Entry getChild(int index) {
+ return childEntries.get(index);
+ }
+
+ public Entry getChild(int... indices) {
+ Entry entry = this;
+ for(int index : indices)
+ entry = entry.getChild(index);
+ return entry;
+ }
+
+
+ public List<Entry> children() {
+ return childEntries;
+ }
+
+
+ public Collection<String> builders() {
+ return builders;
+ }
+
+
+ public void removeChildren() {
+ childEntries.clear();
+ }
+
+ public Object removeAttribute(String key) {
+ return attributes.remove(key);
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T removeAttribute(Class<T> valueClass) {
+ return (T) attributes.remove(valueClass);
+ }
+
+ public boolean hasChildren() {
+ return ! childEntries.isEmpty();
+ }
+
+ public int getChildCount() {
+ return childEntries.size();
+ }
+
+
+ public Entry getRoot() {
+ return parent == null ? this : parent.getRoot();
+ }
+
+ @Override
+ public String toString() {
+ return "Entry [name=" + name + ", builders=" + builders + ", attributes=" + attributes + ", childEntries="
+ + childEntries + "]";
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((attributes == null) ? 0 : attributes.hashCode());
+ result = prime * result + ((builders == null) ? 0 : builders.hashCode());
+ result = prime * result + ((childEntries == null) ? 0 : childEntries.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Entry other = (Entry) obj;
+ if (attributes == null) {
+ if (other.attributes != null)
+ return false;
+ }
+ else if (!attributes.equals(other.attributes))
+ return false;
+ if (builders == null) {
+ if (other.builders != null)
+ return false;
+ }
+ else if (!builders.equals(other.builders))
+ return false;
+ if (childEntries == null) {
+ if (other.childEntries != null)
+ return false;
+ }
+ else if (!childEntries.equals(other.childEntries))
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ }
+ else if (!name.equals(other.name))
+ return false;
+ return true;
+ }
+
+ public Entry getChild(String name) {
+ for (Entry child : children()) {
+ final String childName = child.getName();
+ if (childName.isEmpty()) {
+ final Entry deepChild = child.getChild(name);
+ if (deepChild != null)
+ return deepChild;
+ }
+ if (name.equals(childName))
+ return child;
+ }
+ return null;
+ }
+
+ public Entry findEntry(String name) {
+ if (this.name.equals(name))
+ return this;
+ for (Entry child : this.children()) {
+ Entry entry = child.findEntry(name);
+ if (entry != null)
+ return entry;
+ }
+ return null;
+ }
+
+ public List<Entry> findEntries(String name) {
+ List<Entry> entries = new ArrayList<Entry>();
+ if (this.name.equals(name))
+ entries.add(this);
+ for (Entry child : this.children()) {
+ entries.addAll(child.findEntries(name));
+ }
+ return entries;
+ }
+
+ public boolean isLeaf() {
+ return childEntries.isEmpty();
+ }
+
+ public Entry getChildByPath(String... names) {
+ Entry entry = this;
+ for (String name : names) {
+ if (!name.isEmpty())
+ entry = entry.getChild(name);
+ if (entry == null)
+ break;
+ }
+ return entry;
+ }
+
+
+ public void remove(Entry entry) {
+ childEntries.remove(entry);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryAccessor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryAccessor.java
new file mode 100644
index 0000000..c255260
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryAccessor.java
@@ -0,0 +1,151 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import java.net.URL;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+
+public class EntryAccessor {
+
+ public static final String COMPONENT = "component";
+ public static final Class<AFreeplaneAction> ACTION = AFreeplaneAction.class;
+ public static final String TEXT = "text";
+ public static final String TEXT_KEY = "textKey";
+ public static final Class<Icon> ICON = Icon.class;
+ public static final String ACCELERATOR = "accelerator";
+ public final ResourceAccessor resourceAccessor;
+ public static final String MENU_ELEMENT_SEPARATOR = " -> ";
+
+ public EntryAccessor(ResourceAccessor resourceAccessor) {
+ this.resourceAccessor = resourceAccessor;
+ }
+
+ public EntryAccessor() {
+ this(ResourceAccessor.NULL_RESOURCE_ACCESSOR);
+ }
+
+ public Icon getIcon(final Entry entry) {
+ if (entry.getAttribute(ICON) != null)
+ return entry.getAttribute(ICON);
+ else {
+ String name = entry.getName();
+ final String key = name + ".icon";
+ final String iconResource = resourceAccessor.getProperty(key);
+ final Icon icon;
+ if (iconResource != null) {
+ final URL url = resourceAccessor.getResource(iconResource);
+ if(url != null)
+ icon = new ImageIcon(url);
+ else {
+ LogUtils.severe("Can not load icon '" + iconResource + "'");
+ icon = null;
+ }
+ }
+ else
+ icon = null;
+ return icon;
+ }
+
+ }
+
+ public String getText(final Entry entry) {
+ if (entry.getAttribute(TEXT) != null)
+ return (String) entry.getAttribute(TEXT);
+ else {
+ final String textKey = (String) entry.getAttribute(TEXT_KEY);
+ if (textKey != null)
+ return (String) resourceAccessor.getRawText(textKey);
+ else {
+ final AFreeplaneAction action = getAction(entry);
+ if (action != null)
+ return action.getRawText();
+ String name = entry.getName();
+ if (name.isEmpty())
+ return "";
+ else {
+ final String rawText = resourceAccessor.getRawText(name);
+ if (rawText != null)
+ return rawText;
+ else
+ return "";
+ }
+ }
+ }
+ }
+
+ public Object getComponent(final Entry entry) {
+ return entry.getAttribute(COMPONENT);
+ }
+
+ public Object removeComponent(final Entry entry) {
+ return entry.removeAttribute(COMPONENT);
+ }
+
+ public void setComponent(final Entry entry, Object component) {
+ entry.setAttribute(COMPONENT, component);
+ }
+
+ public AFreeplaneAction getAction(final Entry entry) {
+ return entry.getAttribute(ACTION);
+ }
+
+ public void setAction(final Entry entry, AFreeplaneAction action) {
+ entry.setAttribute(ACTION, action);
+ }
+
+ public Object getAncestorComponent(final Entry entry) {
+ final Entry parent = entry.getParent();
+ if (parent == null)
+ return null;
+ else {
+ final Object parentComponent = getComponent(parent);
+ if (parentComponent != null)
+ return parentComponent;
+ else
+ return getAncestorComponent(parent);
+ }
+ }
+
+ public void setText(Entry entry, String text) {
+ entry.setAttribute(TEXT, text);
+ }
+
+ public void setIcon(Entry entry, Icon icon) {
+ entry.setAttribute(ICON, icon);
+ }
+
+ public String getAccelerator(Entry entry) {
+ String accelerator = (String) entry.getAttribute(ACCELERATOR);
+ return accelerator;
+ }
+
+ public void addChildAction(Entry target, AFreeplaneAction action) {
+ final Entry actionEntry = new Entry();
+ actionEntry.setName(action.getKey());
+ setAction(actionEntry, action);
+ target.addChild(actionEntry);
+ }
+
+ public String getLocationDescription(Entry entry) {
+ final StringBuilder stringBuilder = new StringBuilder();
+ buildLocationDescription(entry, stringBuilder);
+ return stringBuilder.toString();
+ }
+
+ private void buildLocationDescription(Entry entry, StringBuilder stringBuilder) {
+ final Entry parent = entry.getParent();
+ if(parent != null)
+ buildLocationDescription(parent, stringBuilder);
+ final String entryText = TextUtils.removeMnemonic (getText(entry));
+ if(! entryText.isEmpty()){
+ if(stringBuilder.length() > 0)
+ stringBuilder.append(MENU_ELEMENT_SEPARATOR);
+ stringBuilder.append(entryText);
+ }
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryNavigator.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryNavigator.java
new file mode 100644
index 0000000..232360f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryNavigator.java
@@ -0,0 +1,34 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+
+public class EntryNavigator {
+ private final Map<String, String> aliases = new LinkedHashMap<String, String>();
+
+ public EntryNavigator() {
+ }
+
+ public Entry findChildByPath(Entry top, String path) {
+ final String canonicalPath = replaceAliases(path);
+ return top.getChildByPath(canonicalPath.split("/"));
+ }
+
+ public String replaceAliases(String path) {
+ for (Map.Entry<String, String> entry : aliases.entrySet()) {
+ final String alias = entry.getKey();
+ if (path.startsWith(alias))
+ path = entry.getValue() + path.substring(alias.length());
+ }
+ return path;
+ }
+
+ public void addAlias(String alias, String path) {
+ aliases.put(alias, path);
+ }
+
+ public String toString() {
+ return String.valueOf(aliases);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryNavigatorFactory.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryNavigatorFactory.java
new file mode 100644
index 0000000..db373c9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryNavigatorFactory.java
@@ -0,0 +1,33 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import java.io.IOException;
+
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+
+public class EntryNavigatorFactory{
+ private static final String MENU_ALIASES_PROPERTIES = "/menu_aliases.properties";
+ private EntryNavigator entryNavigator;
+ public EntryNavigator createNavigator() {
+ entryNavigator = new EntryNavigator();
+ try {
+ final String content = FileUtils.slurpResource(MENU_ALIASES_PROPERTIES);
+ for (String line : content.split("[\n\r]+"))
+ parseLine(line);
+ }
+ catch (IOException e) {
+ LogUtils.severe("cannot load " + MENU_ALIASES_PROPERTIES, e);
+ }
+ return entryNavigator;
+ }
+
+ private void parseLine(String line) {
+ line = line.trim();
+ if (line.length() > 0 && ! line.startsWith("#")) {
+ String[] words = line.split("\\s*=\\s*");
+ if (words.length != 2)
+ throw new RuntimeException("parse error in " + MENU_ALIASES_PROPERTIES + " line '" + line + "'");
+ entryNavigator.addAlias(words[0], words[1]);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryPopupListener.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryPopupListener.java
new file mode 100644
index 0000000..5b57ab1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryPopupListener.java
@@ -0,0 +1,10 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+
+public interface EntryPopupListener {
+
+ void childEntriesWillBecomeVisible(Entry entry);
+
+ void childEntriesHidden(Entry entry);
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryPopupListenerCollection.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryPopupListenerCollection.java
new file mode 100644
index 0000000..6c2bdaf
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryPopupListenerCollection.java
@@ -0,0 +1,33 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+public class EntryPopupListenerCollection implements EntryPopupListener {
+
+ final private Collection<EntryPopupListener> listeners;
+
+ public EntryPopupListenerCollection() {
+ listeners = new ArrayList<EntryPopupListener>();
+ }
+
+ public void addEntryPopupListener(EntryPopupListener entryPopupListener) {
+ listeners.add(entryPopupListener);
+ }
+
+ public void childEntriesWillBecomeVisible(Entry entry) {
+ for(EntryPopupListener entryPopupListener : listeners)
+ entryPopupListener.childEntriesWillBecomeVisible(entry);
+
+ }
+
+ public void childEntriesHidden(Entry entry) {
+ for(EntryPopupListener entryPopupListener : listeners)
+ entryPopupListener.childEntriesHidden(entry);
+ }
+
+ public void removeEntryPopupListener(EntryPopupListener entryPopupListener) {
+ listeners.remove(entryPopupListener);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryVisitor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryVisitor.java
new file mode 100644
index 0000000..050f871
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/EntryVisitor.java
@@ -0,0 +1,12 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+
+public interface EntryVisitor {
+ public static final EntryVisitor ILLEGAL = new IllegalEntryVisitor();
+ public static final EntryVisitor EMTPY = new EmptyEntryVisitor();
+ public static final EntryVisitor SKIP = new SkippingEntryVisitor();
+// public static final EntryVisitor CHILD_ENTRY_REMOVER = new ChildEntryRemover();
+
+ public void visit(Entry target);
+ public boolean shouldSkipChildren(Entry entry);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/IllegalEntryVisitor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/IllegalEntryVisitor.java
new file mode 100644
index 0000000..f286549
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/IllegalEntryVisitor.java
@@ -0,0 +1,13 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+public class IllegalEntryVisitor implements EntryVisitor {
+ @Override
+ public void visit(Entry target) {
+ throw new IllegalStateException("no builder found");
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/NullResourceAccessor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/NullResourceAccessor.java
new file mode 100644
index 0000000..8fe1c00
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/NullResourceAccessor.java
@@ -0,0 +1,35 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import java.net.URL;
+
+class NullResourceAccessor implements ResourceAccessor {
+ @Override
+ public URL getResource(String name) {
+ return null;
+ }
+
+ @Override
+ public String getRawText(String name) {
+ return null;
+ }
+
+ @Override
+ public String getProperty(String key) {
+ return null;
+ }
+
+ @Override
+ public int getIntProperty(String name, int defaultValue) {
+ return 0;
+ }
+
+ @Override
+ public String getText(String name) {
+ return null;
+ }
+
+ @Override
+ public String getText(String name, String defaultValue) {
+ return defaultValue;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/PhaseProcessor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/PhaseProcessor.java
new file mode 100644
index 0000000..d629809
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/PhaseProcessor.java
@@ -0,0 +1,70 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.ListIterator;
+import java.util.Map;
+
+public class PhaseProcessor{
+ public static enum Phase {
+ ACTIONS, ACCELERATORS, UI
+ }
+
+ final private LinkedHashMap<Phase, RecursiveMenuStructureProcessor> processors;
+ final private Collection<BuildPhaseListener> buildPhaseListeners;
+
+
+ public PhaseProcessor(Collection<BuildPhaseListener> buildPhaseListeners) {
+ this.processors = new LinkedHashMap<Phase, RecursiveMenuStructureProcessor>();
+ this.buildPhaseListeners = buildPhaseListeners;
+ }
+
+ public PhaseProcessor(){
+ this(Collections.<BuildPhaseListener>emptyList());
+ }
+
+
+ public void build(Entry entry) {
+ for ( Map.Entry<Phase, RecursiveMenuStructureProcessor> processEntry : processors.entrySet()){
+ processEntry.getValue().build(entry);
+ for(BuildPhaseListener listener : buildPhaseListeners)
+ listener.buildPhaseFinished(processEntry.getKey(), entry);
+ }
+ }
+
+
+ public PhaseProcessor forChildren(Entry root, Entry entry) {
+ final PhaseProcessor phaseProcessor = new PhaseProcessor(buildPhaseListeners);
+ for (java.util.Map.Entry<Phase, RecursiveMenuStructureProcessor> processor : processors.entrySet())
+ phaseProcessor.withPhase(processor.getKey(), processor.getValue().forChildren(root, entry));
+ return phaseProcessor;
+ }
+
+ public PhaseProcessor withPhase(Phase phaseName, RecursiveMenuStructureProcessor processor) {
+ processors.put(phaseName, processor);
+ return this;
+ }
+
+ public RecursiveMenuStructureProcessor phase(Phase name) {
+ return processors.get(name);
+ }
+
+
+ public void destroy(Entry entry) {
+ final ListIterator<RecursiveMenuStructureProcessor> processorIterator = new ArrayList<RecursiveMenuStructureProcessor>(processors.values())
+ .listIterator(processors.size());
+ while (processorIterator.hasPrevious())
+ processorIterator.previous().destroy(entry);
+ }
+
+ public void buildChildren(Entry entry) {
+ for ( Map.Entry<Phase, RecursiveMenuStructureProcessor> processEntry : processors.entrySet()){
+ for(Entry child : new ArrayList<Entry>(entry.children()))
+ processEntry.getValue().build(child);
+ for(BuildPhaseListener listener : buildPhaseListeners)
+ listener.buildPhaseFinished(processEntry.getKey(), entry);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/RecursiveMenuStructureProcessor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/RecursiveMenuStructureProcessor.java
new file mode 100644
index 0000000..3275a9d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/RecursiveMenuStructureProcessor.java
@@ -0,0 +1,190 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import static java.lang.Boolean.TRUE;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.freeplane.core.ui.menubuilders.generic.BuilderDestroyerPair.VisitorType;
+
+public class RecursiveMenuStructureProcessor{
+
+ final private Map<String, BuilderDestroyerPair> visitors;
+ final private Map<String, String> subtreeDefaultVisitors;
+ private LinkedList<String> subtreeDefaultVisitorStack;
+ private BuilderDestroyerPair defaultBuilder = new BuilderDestroyerPair(EntryVisitor.ILLEGAL,
+ EntryVisitor.ILLEGAL);
+ public static final String PROCESS_ON_POPUP = "processOnPopup";
+
+ private RecursiveMenuStructureProcessor(Map<String, BuilderDestroyerPair> visitors,
+ Map<String, String> subtreeDefaultVisitors,
+ BuilderDestroyerPair defaultBuilder) {
+ super();
+ this.visitors = visitors;
+ this.subtreeDefaultVisitors = subtreeDefaultVisitors;
+ this.subtreeDefaultVisitorStack = new LinkedList<String>();
+ this.defaultBuilder = defaultBuilder;
+ }
+
+ public RecursiveMenuStructureProcessor() {
+ visitors = new HashMap<String, BuilderDestroyerPair>();
+ subtreeDefaultVisitors = new HashMap<String, String>();
+ subtreeDefaultVisitorStack = new LinkedList<String>();
+ }
+
+ public void addBuilderPair(String name, BuilderDestroyerPair pair) {
+ visitors.put(name, pair);
+ }
+
+ public void addBuilderPair(String name, EntryVisitor builder, EntryVisitor destroyer) {
+ addBuilderPair(name, new BuilderDestroyerPair(builder, destroyer));
+ }
+
+ public void addBuilder(String name, EntryVisitor builder) {
+ addBuilderPair(name, new BuilderDestroyerPair(builder));
+ }
+
+ public void build(Entry target) {
+ process(target, VisitorType.BUILDER);
+ }
+
+ private void process(Entry target, final VisitorType visitorType) {
+ final BuilderDestroyerPair builderDestroyerPair = builderDestroyerPair(target);
+ process(target, builderDestroyerPair, visitorType);
+ }
+
+ private void process(Entry target, final BuilderDestroyerPair builderDestroyerPair, VisitorType visitorType) {
+ final EntryVisitor visitor = builderDestroyerPair.get(visitorType);
+ final boolean shouldSkipChildren = visitor.shouldSkipChildren(target);
+ visitor.visit(target);
+ if (!(shouldSkipChildren || shouldProcessOnEvent(target)))
+ processChildren(target, visitorType);
+ }
+
+ public void destroy(Entry target) {
+ process(target, VisitorType.DESTROYER);
+ }
+
+ public static boolean shouldProcessOnEvent(Entry target) {
+ return TRUE.equals(target.getAttribute(PROCESS_ON_POPUP));
+ }
+
+ private void processChildren(Entry target, VisitorType visitorType) {
+ final int originalDefaultBuilderStackSize = subtreeDefaultVisitorStack.size();
+ final String visitorToCall = visitorToCall(target);
+ if(visitorToCall != null)
+ changeDefaultBuilder(visitorToCall);
+ final List<Entry> children = target.children();
+ for(Entry child:children.toArray(new Entry[children.size()])) {
+ process(child, visitorType);
+ }
+ if(originalDefaultBuilderStackSize < subtreeDefaultVisitorStack.size())
+ subtreeDefaultVisitorStack.removeLast();
+ }
+
+ private BuilderDestroyerPair builderDestroyerPair(Entry target) {
+ final String builderToCall = visitorToCall(target);
+ final BuilderDestroyerPair builder;
+ if(builderToCall != null)
+ builder = visitors.get(builderToCall);
+ else
+ builder = defaultBuilder;
+ return builder;
+ }
+
+ private void changeDefaultBuilder(String calledBuilder) {
+ final String defaultBuilder = subtreeDefaultVisitors.get(calledBuilder);
+ if (defaultBuilder != null && (subtreeDefaultVisitorStack.isEmpty() || ! subtreeDefaultVisitorStack.getLast().equals(defaultBuilder)))
+ subtreeDefaultVisitorStack.addLast(defaultBuilder);
+ }
+
+ private String visitorToCall(Entry target) {
+ String explicitBuilderName = explicitBuilderName(target);
+ if (explicitBuilderName != null)
+ return explicitBuilderName;
+ else if (subtreeDefaultVisitorStack.isEmpty())
+ return null;
+ else
+ return subtreeDefaultVisitorStack.getLast();
+ }
+
+ public void setSubtreeDefaultBuilderPair(String builder, String subtreeBuilder) {
+ subtreeDefaultVisitors.put(builder, subtreeBuilder);
+ }
+
+ public void setDefaultBuilder(EntryVisitor defaultBuilder) {
+ setDefaultBuilderPair(new BuilderDestroyerPair(defaultBuilder, EntryVisitor.EMTPY));
+ }
+
+ public void setDefaultBuilderPair(EntryVisitor defaultBuilder, EntryVisitor defaultDestroyer) {
+ setDefaultBuilderPair(new BuilderDestroyerPair(defaultBuilder, defaultDestroyer));
+ }
+
+ private void setDefaultBuilderPair(BuilderDestroyerPair pair) {
+ this.defaultBuilder = pair;
+ }
+
+ public BuilderDestroyerPair findSubtreeChildrenDefaultBuilder(Entry root, Entry entry) {
+ final Entry explicitDefaultBuilderEntry = explicitDefaultBuilderEntry(root, entry);
+ if (explicitDefaultBuilderEntry != null) {
+ String builderName = explicitBuilderName(explicitDefaultBuilderEntry);
+ if (entry == explicitDefaultBuilderEntry) {
+ builderName = subtreeDefaultVisitors.get(builderName);
+ }
+ else
+ for (Entry index = entry; index != explicitDefaultBuilderEntry; index = index.getParent()) {
+ if (explicitBuilderName(index) == null) {
+ final String nextExplicitDefaultBuilderName = subtreeDefaultVisitors.get(builderName);
+ if (nextExplicitDefaultBuilderName != null)
+ builderName = nextExplicitDefaultBuilderName;
+ }
+ }
+ return visitors.get(builderName);
+ }
+ return defaultBuilder;
+ }
+
+ private Entry explicitDefaultBuilderEntry(Entry root, Entry entry) {
+ String explicitBuilderName = explicitBuilderName(entry);
+ final BuilderDestroyerPair explicitDefaultBuilder = explicitDefaultBuilder(explicitBuilderName);
+ if (explicitDefaultBuilder != null)
+ return entry;
+ else if (root == entry)
+ return null;
+ else
+ return explicitDefaultBuilderEntry(root, entry.getParent());
+ }
+
+ private BuilderDestroyerPair explicitDefaultBuilder(String explicitBuilderName) {
+ final String subtreeDefaultBuilder = subtreeDefaultVisitors.get(explicitBuilderName);
+ final BuilderDestroyerPair explicitDefaultBuilder = visitors.get(subtreeDefaultBuilder);
+ return explicitDefaultBuilder;
+ }
+
+ private String explicitBuilderName(Entry entry) {
+ String builderToCall = null;
+ if (entry != null) {
+ for (String visitorName : entry.builders())
+ if (visitors.containsKey(visitorName)) {
+ builderToCall = visitorName;
+ break;
+ }
+ }
+ return builderToCall;
+ }
+
+ public RecursiveMenuStructureProcessor forChildren(Entry root, Entry subtreeRoot) {
+ return new RecursiveMenuStructureProcessor(visitors, subtreeDefaultVisitors, findSubtreeChildrenDefaultBuilder(root, subtreeRoot));
+ }
+
+ public boolean containsOneOf(Collection<String> builders) {
+ for(String builder:builders)
+ if(visitors.containsKey(builder))
+ return true;
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ResourceAccessor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ResourceAccessor.java
new file mode 100644
index 0000000..7c1f169
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/ResourceAccessor.java
@@ -0,0 +1,19 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import java.net.URL;
+public interface ResourceAccessor {
+
+ public static final ResourceAccessor NULL_RESOURCE_ACCESSOR = new NullResourceAccessor();
+
+ public String getProperty(final String key);
+
+ public String getRawText(String name);
+
+ public String getText(String name);
+
+ public String getText(String name, String defaultValue);
+
+ public URL getResource(final String name);
+
+ public int getIntProperty(final String name, final int defaultValue);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/SkippingEntryVisitor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/SkippingEntryVisitor.java
new file mode 100644
index 0000000..0556c6b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/SkippingEntryVisitor.java
@@ -0,0 +1,12 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+public class SkippingEntryVisitor implements EntryVisitor {
+ @Override
+ public void visit(Entry target) {
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/SubtreeProcessor.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/SubtreeProcessor.java
new file mode 100644
index 0000000..9f8d284
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/generic/SubtreeProcessor.java
@@ -0,0 +1,57 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+public class SubtreeProcessor implements EntryPopupListener {
+ public SubtreeProcessor() {
+ super();
+ }
+
+ private PhaseProcessor processor;
+
+ public void setProcessor(PhaseProcessor processor) {
+ this.processor = processor;
+ }
+
+ @Override
+ public void childEntriesWillBecomeVisible(Entry entry) {
+ if (RecursiveMenuStructureProcessor.shouldProcessOnEvent(entry)) {
+ buildChildren(entry);
+ }
+ }
+
+ public void buildChildren(Entry entry) {
+ final PhaseProcessor subtreeProcessor = forChildren(entry);
+ subtreeProcessor.buildChildren(entry);
+ }
+
+ public void rebuildEntry(Entry entry) {
+ final Entry parent = entry.getParent();
+ final PhaseProcessor subtreeProcessor = parent != null ? forChildren(parent) : processor;
+ subtreeProcessor.destroy(entry);
+ subtreeProcessor.build(entry);
+ }
+
+ private PhaseProcessor forChildren(Entry entry) {
+ final Entry root = entry.getRoot();
+ final PhaseProcessor subtreeProcessor = processor.forChildren(root, entry);
+ return subtreeProcessor;
+ }
+
+ @Override
+ public void childEntriesHidden(Entry entry) {
+ if (RecursiveMenuStructureProcessor.shouldProcessOnEvent(entry)) {
+ destroyChildren(entry);
+ }
+ }
+
+ public void destroyChildren(Entry entry) {
+ final PhaseProcessor subtreeProcessor = forChildren(entry);
+ for (Entry child : entry.children()) {
+ subtreeProcessor.destroy(child);
+ }
+ }
+
+ public void rebuildChildren(Entry entry){
+ destroyChildren(entry);
+ buildChildren(entry);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/ComponentProvider.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/ComponentProvider.java
new file mode 100644
index 0000000..6325388
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/ComponentProvider.java
@@ -0,0 +1,9 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.Component;
+
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+
+public interface ComponentProvider {
+ public Component createComponent(Entry entry);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/EmptyMenuItemBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/EmptyMenuItemBuilder.java
new file mode 100644
index 0000000..df325b0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/EmptyMenuItemBuilder.java
@@ -0,0 +1,45 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.Container;
+
+import javax.swing.JMenu;
+
+import org.freeplane.core.ui.components.JFreeplaneMenuItem;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+import org.freeplane.core.util.TextUtils;
+
+public class EmptyMenuItemBuilder implements EntryVisitor {
+ private final EntryAccessor entryAccessor;
+
+ public EmptyMenuItemBuilder(ResourceAccessor resourceAccessor) {
+ this.entryAccessor = new EntryAccessor(resourceAccessor);
+ }
+ @Override
+ public void visit(Entry target) {
+ final Container container = getMenuItemContainer(target);
+ if(container.getComponentCount() == 0){
+ final String text = TextUtils.getText(target.getParent().getName() + ".noActions");
+ final JFreeplaneMenuItem noActionItem = new JFreeplaneMenuItem(text);
+ noActionItem.setEnabled(false);
+ entryAccessor.setComponent(target, noActionItem);
+ container.add(noActionItem);
+ }
+ }
+
+ private Container getMenuItemContainer(Entry target) {
+ final Container ancestorComponent = (Container) entryAccessor.getAncestorComponent(target);
+ if(ancestorComponent instanceof JMenu)
+ return ((JMenu)ancestorComponent).getPopupMenu();
+ else
+ return ancestorComponent;
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JComponentRemover.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JComponentRemover.java
new file mode 100644
index 0000000..34f686d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JComponentRemover.java
@@ -0,0 +1,42 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.Component;
+
+import javax.swing.AbstractButton;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ActionEnabler;
+import org.freeplane.core.ui.MenuSplitter;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+
+public class JComponentRemover implements EntryVisitor{
+ final private static MenuSplitter menuSplitter = new MenuSplitter(0);
+
+ @Override
+ public void visit(Entry target) {
+ final EntryAccessor entryAccessor = new EntryAccessor();
+ final Component component = (Component) entryAccessor.removeComponent(target);
+ if (component != null) {
+ if(component instanceof AbstractButton)
+ ((AbstractButton)component).setAction(null);
+ removeMenuComponent(component);
+ ActionEnabler actionEnabler = target.removeAttribute(ActionEnabler.class);
+ if(actionEnabler != null){
+ final AFreeplaneAction action = entryAccessor.getAction(target);
+ action.removePropertyChangeListener(actionEnabler);
+ }
+ }
+ }
+
+ private void removeMenuComponent(final Component component) {
+ menuSplitter.removeMenuComponent(component);
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JMenuItemBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JMenuItemBuilder.java
new file mode 100644
index 0000000..399a304
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JMenuItemBuilder.java
@@ -0,0 +1,106 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.Component;
+import java.awt.Container;
+
+import javax.swing.Icon;
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ActionEnabler;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.MenuSplitter;
+import org.freeplane.core.ui.MenuSplitterConfiguration;
+import org.freeplane.core.ui.menubuilders.action.AcceleratebleActionProvider;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryPopupListener;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+import org.dpolivaev.mnemonicsetter.MnemonicSetter;
+
+public class JMenuItemBuilder implements EntryVisitor{
+
+ final private EntryPopupListener popupListener;
+ final ResourceAccessor resourceAccessor;
+ final private MenuSplitter menuSplitter;
+ final private EntryAccessor entryAccessor;
+ final private ComponentProvider menuActionComponentProvider;
+
+ public JMenuItemBuilder(EntryPopupListener popupListener, IAcceleratorMap accelerators,
+ AcceleratebleActionProvider acceleratebleActionProvider, ResourceAccessor resourceAccessor) {
+ this(popupListener,
+ new MenuActionComponentProvider(accelerators, acceleratebleActionProvider, resourceAccessor),
+ resourceAccessor);
+ }
+
+ public JMenuItemBuilder(EntryPopupListener popupListener, ComponentProvider menuActionComponentProvider,
+ ResourceAccessor resourceAccessor) {
+ this.popupListener = popupListener;
+ this.resourceAccessor = resourceAccessor;
+ this.entryAccessor = new EntryAccessor(resourceAccessor);
+ menuSplitter = new MenuSplitter(resourceAccessor.getIntProperty(
+ MenuSplitterConfiguration.MAX_MENU_ITEM_COUNT_KEY, 10));
+ this.menuActionComponentProvider = menuActionComponentProvider;
+ }
+
+ @Override
+ public void visit(Entry entry) {
+ if ((entry.hasChildren() || entryAccessor.getAction(entry) == null) && !entryAccessor.getText(entry).isEmpty())
+ addSubmenu(entry);
+ else
+ addActionItem(entry);
+ }
+
+ private void addActionItem(Entry entry) {
+ final Component actionComponent = createActionComponent(entry);
+ if(actionComponent != null){
+ addComponent(entry, actionComponent);
+ }
+ }
+
+ private Component createActionComponent(Entry entry) {
+ final Component component = menuActionComponentProvider.createComponent(entry);
+ final AFreeplaneAction action = entryAccessor.getAction(entry);
+ if (action != null) {
+ final ActionEnabler actionEnabler = new ActionEnabler(component);
+ action.addPropertyChangeListener(actionEnabler);
+ entry.setAttribute(actionEnabler.getClass(), actionEnabler);
+ }
+ return component;
+ }
+
+ private void addComponent(Entry entry, final Component component) {
+ entryAccessor.setComponent(entry, component);
+ final Container container = (Container) entryAccessor.getAncestorComponent(entry);
+ if (container != null)
+ menuSplitter.addComponent(container, component);
+ }
+
+ private void addSubmenu(final Entry entry) {
+ final Component actionComponent = createActionComponent(entry);
+ JMenu menu = new JMenu();
+ final String rawText = entryAccessor.getText(entry);
+ LabelAndMnemonicSetter.setLabelAndMnemonic(menu, rawText);
+ final Icon icon = entryAccessor.getIcon(entry);
+ if (icon != null) {
+ menu.setIcon(icon);
+ }
+ addComponent(entry, menu);
+ if(actionComponent != null){
+ menuSplitter.addMenuComponent(menu, actionComponent);
+ }
+ final JPopupMenu popupMenu = menu.getPopupMenu();
+ popupMenu.addPopupMenuListener(new PopupMenuListenerForEntry(entry, popupListener));
+ popupMenu.addPopupMenuListener(MnemonicSetter.INSTANCE);
+
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JMenuRadioGroupBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JMenuRadioGroupBuilder.java
new file mode 100644
index 0000000..e13e63c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JMenuRadioGroupBuilder.java
@@ -0,0 +1,41 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import javax.swing.ButtonGroup;
+
+import org.freeplane.core.ui.menubuilders.action.AcceleratebleActionProvider;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryPopupListener;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+
+public class JMenuRadioGroupBuilder implements EntryVisitor {
+ private EntryPopupListener popupListener;
+ private IAcceleratorMap accelerators;
+ private AcceleratebleActionProvider acceleratebleActionProvider;
+ private ResourceAccessor resourceAccessor;
+
+ public JMenuRadioGroupBuilder(EntryPopupListener popupListener, IAcceleratorMap accelerators,
+ AcceleratebleActionProvider acceleratebleActionProvider, ResourceAccessor resourceAccessor) {
+ this.popupListener = popupListener;
+ this.accelerators = accelerators;
+ this.acceleratebleActionProvider = acceleratebleActionProvider;
+ this.resourceAccessor = resourceAccessor;
+ }
+ @Override
+ public void visit(Entry target) {
+ ButtonGroup buttonGroup = new ButtonGroup();
+ final MenuRadioActionComponentProvider menuActionComponentProvider = new MenuRadioActionComponentProvider(
+ accelerators, acceleratebleActionProvider, resourceAccessor, buttonGroup);
+ JMenuItemBuilder menuItemBuilder = new JMenuItemBuilder(popupListener, menuActionComponentProvider, resourceAccessor);
+ menuItemBuilder.visit(target);
+ for (Entry childEntry : target.children()) {
+ menuItemBuilder.visit(childEntry);
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JMenubarBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JMenubarBuilder.java
new file mode 100644
index 0000000..c7a298a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JMenubarBuilder.java
@@ -0,0 +1,43 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+
+import org.dpolivaev.mnemonicsetter.MnemonicSetter;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+
+public class JMenubarBuilder implements EntryVisitor {
+ private final IUserInputListenerFactory userInputListenerFactory;
+
+ public JMenubarBuilder(IUserInputListenerFactory userInputListenerFactory) {
+ super();
+ this.userInputListenerFactory = userInputListenerFactory;
+ }
+
+ @Override
+ public void visit(Entry target) {
+ final FreeplaneMenuBar menuBar = userInputListenerFactory.getMenuBar();
+ addMnemonicsBeforeShowing(menuBar);
+ new EntryAccessor().setComponent(target, menuBar);
+ }
+
+ private void addMnemonicsBeforeShowing(final FreeplaneMenuBar menuBar) {
+ menuBar.addHierarchyListener(new HierarchyListener() {
+ @Override
+ public void hierarchyChanged(HierarchyEvent e) {
+ menuBar.removeHierarchyListener(this);
+ MnemonicSetter.INSTANCE.setComponentMnemonics(menuBar);
+ }
+ });
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JToolbarBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JToolbarBuilder.java
new file mode 100644
index 0000000..c70553d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JToolbarBuilder.java
@@ -0,0 +1,26 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+
+public class JToolbarBuilder implements EntryVisitor {
+ private final IUserInputListenerFactory userInputListenerFactory;
+
+ public JToolbarBuilder(IUserInputListenerFactory userInputListenerFactory) {
+ super();
+ this.userInputListenerFactory = userInputListenerFactory;
+ }
+
+ @Override
+ public void visit(Entry target) {
+ new EntryAccessor().setComponent(target, userInputListenerFactory.getToolBar("/main_toolbar"));
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JToolbarComponentBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JToolbarComponentBuilder.java
new file mode 100644
index 0000000..166a9f5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/JToolbarComponentBuilder.java
@@ -0,0 +1,53 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.Component;
+import java.awt.Container;
+
+import javax.swing.JToolBar;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ActionEnabler;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+
+public class JToolbarComponentBuilder implements EntryVisitor {
+
+ private final ComponentProvider componentProvider;
+
+ public JToolbarComponentBuilder(ComponentProvider componentProvider) {
+ super();
+ this.componentProvider = componentProvider;
+ }
+
+ public JToolbarComponentBuilder() {
+ this(new ToolbarComponentProvider());
+ }
+
+
+ @Override
+ public void visit(Entry entry) {
+ Component component = componentProvider.createComponent(entry);
+ if(component != null){
+ final EntryAccessor entryAccessor = new EntryAccessor();
+ entryAccessor.setComponent(entry, component);
+ final AFreeplaneAction action = entryAccessor.getAction(entry);
+ if (action != null) {
+ final ActionEnabler actionEnabler = new ActionEnabler(component);
+ action.addPropertyChangeListener(actionEnabler);
+ entry.setAttribute(actionEnabler.getClass(), actionEnabler);
+ }
+ final Container container = (Container) new EntryAccessor().getAncestorComponent(entry);
+ if (container instanceof JToolBar)
+ container.add(component);
+ else
+ SwingUtilities.getAncestorOfClass(JToolBar.class, container).add(component);
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuAcceleratorChangeListener.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuAcceleratorChangeListener.java
new file mode 100644
index 0000000..526430b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuAcceleratorChangeListener.java
@@ -0,0 +1,30 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IAcceleratorChangeListener;
+import org.freeplane.core.ui.menubuilders.action.EntriesForAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+
+public class MenuAcceleratorChangeListener implements IAcceleratorChangeListener {
+ final private EntriesForAction entries;
+
+ public MenuAcceleratorChangeListener(EntriesForAction entries) {
+ this.entries = entries;
+ }
+
+ @Override
+ public void acceleratorChanged(AFreeplaneAction action, KeyStroke oldStroke, KeyStroke newStroke) {
+ for (Entry entry : entries.entries(action)) {
+ Object component = new EntryAccessor().getComponent(entry);
+ if (component instanceof JMenu)
+ component = ((JMenu) component).getPopupMenu().getComponent(0);
+ if (component instanceof JMenuItem)
+ ((JMenuItem) component).setAccelerator(newStroke);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuActionComponentProvider.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuActionComponentProvider.java
new file mode 100644
index 0000000..a592140
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuActionComponentProvider.java
@@ -0,0 +1,57 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.Component;
+
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IFreeplaneAction;
+import org.freeplane.core.ui.components.JAutoCheckBoxMenuItem;
+import org.freeplane.core.ui.components.JFreeplaneMenuItem;
+import org.freeplane.core.ui.menubuilders.action.AcceleratebleActionProvider;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+
+public class MenuActionComponentProvider implements ComponentProvider {
+
+ private IAcceleratorMap accelerators;
+ private AcceleratebleActionProvider acceleratebleActionProvider;
+ private EntryAccessor entryAccessor;
+
+ public MenuActionComponentProvider(IAcceleratorMap accelerators, AcceleratebleActionProvider acceleratebleActionProvider,
+ ResourceAccessor resourceAccessor) {
+ this.accelerators = accelerators;
+ this.acceleratebleActionProvider = acceleratebleActionProvider;
+ this.entryAccessor = new EntryAccessor(resourceAccessor);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.ui.menubuilders.menu.ComponentProvider#createComponent(org.freeplane.core.ui.menubuilders.generic.Entry)
+ */
+ @Override
+ public Component createComponent(Entry entry) {
+ final AFreeplaneAction action = entryAccessor.getAction(entry);
+ if(action != null){
+ final JMenuItem actionComponent;
+ IFreeplaneAction wrappedAction = acceleratebleActionProvider.wrap(action);
+ if (action.isSelectable()) {
+ actionComponent = new JAutoCheckBoxMenuItem(wrappedAction);
+ }
+ else {
+ actionComponent = new JFreeplaneMenuItem(wrappedAction);
+ }
+ final KeyStroke accelerator = accelerators.getAccelerator(action);
+ actionComponent.setAccelerator(accelerator);
+ return actionComponent;
+ }
+ else if(entry.builders().contains("separator")){
+ return new JPopupMenu.Separator();
+ }
+ else
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuBuildProcessFactory.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuBuildProcessFactory.java
new file mode 100644
index 0000000..b6752a0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuBuildProcessFactory.java
@@ -0,0 +1,114 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase.ACCELERATORS;
+import static org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase.ACTIONS;
+import static org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase.UI;
+
+import java.util.List;
+
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.menubuilders.action.AcceleratebleActionProvider;
+import org.freeplane.core.ui.menubuilders.action.AcceleratorBuilder;
+import org.freeplane.core.ui.menubuilders.action.AcceleratorDestroyer;
+import org.freeplane.core.ui.menubuilders.action.ActionFinder;
+import org.freeplane.core.ui.menubuilders.action.ActionSelectListener;
+import org.freeplane.core.ui.menubuilders.action.EntriesForAction;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.ui.menubuilders.generic.BuildPhaseListener;
+import org.freeplane.core.ui.menubuilders.generic.BuildProcessFactory;
+import org.freeplane.core.ui.menubuilders.generic.ChildEntryFilter;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryPopupListenerCollection;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor;
+import org.freeplane.core.ui.menubuilders.generic.RecursiveMenuStructureProcessor;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+import org.freeplane.core.ui.menubuilders.generic.SubtreeProcessor;
+import org.freeplane.core.util.Compat;
+import org.freeplane.features.mode.FreeplaneActions;
+
+public class MenuBuildProcessFactory implements BuildProcessFactory {
+
+ private PhaseProcessor buildProcessor;
+
+ private SubtreeProcessor childProcessor;
+
+ public PhaseProcessor getBuildProcessor() {
+ return buildProcessor;
+ }
+
+ public SubtreeProcessor getChildProcessor() {
+ return childProcessor;
+ }
+
+ public MenuBuildProcessFactory(IUserInputListenerFactory userInputListenerFactory,
+ FreeplaneActions modeController,
+ ResourceAccessor resourceAccessor, IAcceleratorMap acceleratorMap, EntriesForAction entries, List<BuildPhaseListener> buildPhaseListeners) {
+ final RecursiveMenuStructureProcessor actionBuilder = new RecursiveMenuStructureProcessor();
+ actionBuilder.setDefaultBuilder(new ActionFinder(modeController));
+
+ final RecursiveMenuStructureProcessor acceleratorBuilder = new RecursiveMenuStructureProcessor();
+ acceleratorBuilder.setDefaultBuilderPair(new AcceleratorBuilder(acceleratorMap, entries),
+ new AcceleratorDestroyer(entries));
+
+ final RecursiveMenuStructureProcessor uiBuilder = new RecursiveMenuStructureProcessor();
+ uiBuilder.setDefaultBuilder(EntryVisitor.EMTPY);
+ uiBuilder.addBuilder("skip", EntryVisitor.SKIP);
+
+ childProcessor = new SubtreeProcessor();
+ final ActionSelectListener actionSelectListener = new ActionSelectListener();
+ EntryPopupListenerCollection entryPopupListenerCollection = new EntryPopupListenerCollection();
+ entryPopupListenerCollection.addEntryPopupListener(childProcessor);
+ entryPopupListenerCollection.addEntryPopupListener(actionSelectListener);
+
+
+ acceleratorMap.addAcceleratorChangeListener(modeController, new MenuAcceleratorChangeListener(entries));
+
+ uiBuilder.addBuilder("toolbar", new JToolbarBuilder(userInputListenerFactory));
+ uiBuilder.setSubtreeDefaultBuilderPair("toolbar", "toolbar.action");
+ uiBuilder.addBuilder("toolbar.action", new JToolbarComponentBuilder());
+
+ uiBuilder.addBuilder("main_menu", new JMenubarBuilder(userInputListenerFactory));
+ uiBuilder.setSubtreeDefaultBuilderPair("main_menu", "menu.action");
+
+ uiBuilder.addBuilderPair("radio_button_group", //
+ new JMenuRadioGroupBuilder(entryPopupListenerCollection, acceleratorMap, new AcceleratebleActionProvider(),
+ resourceAccessor), new JComponentRemover());
+
+ uiBuilder.addBuilder("map_popup", new PopupBuilder(userInputListenerFactory.getMapPopup(), entryPopupListenerCollection));
+ uiBuilder.setSubtreeDefaultBuilderPair("map_popup", "menu.action");
+ uiBuilder.addBuilder("node_popup", new PopupBuilder(userInputListenerFactory.getNodePopupMenu(), entryPopupListenerCollection));
+ uiBuilder.setSubtreeDefaultBuilderPair("node_popup", "menu.action");
+
+ actionBuilder.addBuilder("ignore", new ChildEntryFilter() {
+ @Override
+ public boolean shouldRemove(Entry entry) {
+ return ! uiBuilder.containsOneOf(entry.builders());
+ }
+ });
+
+ if(Compat.isMacOsX()){
+ actionBuilder.addBuilder("removeOnMac", new ChildEntryFilter() {
+ @Override
+ public boolean shouldRemove(Entry entry) {
+ return true;
+ }
+ });
+ }
+
+ JMenuItemBuilder menuBuilder = new JMenuItemBuilder(entryPopupListenerCollection, acceleratorMap, new AcceleratebleActionProvider(),
+ resourceAccessor);
+ JComponentRemover destroyer = new JComponentRemover();
+ uiBuilder.addBuilderPair("menu", menuBuilder, destroyer);
+ uiBuilder.addBuilderPair("menu.action", menuBuilder, destroyer);
+ uiBuilder.addBuilderPair("noActions", new EmptyMenuItemBuilder(resourceAccessor), destroyer);
+
+
+ buildProcessor = new PhaseProcessor(buildPhaseListeners)
+ .withPhase(ACTIONS, actionBuilder) //
+ .withPhase(ACCELERATORS, acceleratorBuilder)
+ .withPhase(UI, uiBuilder);
+ childProcessor.setProcessor(buildProcessor);
+ }
+}
+
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuRadioActionComponentProvider.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuRadioActionComponentProvider.java
new file mode 100644
index 0000000..473827a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/MenuRadioActionComponentProvider.java
@@ -0,0 +1,74 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.Component;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.JRadioButtonMenuItem;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IFreeplaneAction;
+import org.freeplane.core.ui.components.JAutoRadioButtonMenuItem;
+import org.freeplane.core.ui.menubuilders.action.AcceleratebleActionProvider;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+
+public class MenuRadioActionComponentProvider implements ComponentProvider {
+
+ private IAcceleratorMap accelerators;
+ private AcceleratebleActionProvider acceleratebleActionProvider;
+ private EntryAccessor entryAccessor;
+ private ButtonGroup buttonGroup;
+
+ public MenuRadioActionComponentProvider(IAcceleratorMap accelerators, AcceleratebleActionProvider acceleratebleActionProvider,
+ ResourceAccessor resourceAccessor, ButtonGroup buttonGroup) {
+ this.accelerators = accelerators;
+ this.acceleratebleActionProvider = acceleratebleActionProvider;
+ this.buttonGroup = buttonGroup;
+ this.entryAccessor = new EntryAccessor(resourceAccessor);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.ui.menubuilders.menu.ComponentProvider#createComponent(org.freeplane.core.ui.menubuilders.generic.Entry)
+ */
+ @Override
+ public Component createComponent(Entry entry) {
+ final AFreeplaneAction action = entryAccessor.getAction(entry);
+ if(action != null){
+ final JMenuItem actionComponent;
+ IFreeplaneAction wrappedAction = acceleratebleActionProvider.wrap(action);
+ if (action.isSelectable()) {
+ actionComponent = new JAutoRadioButtonMenuItem(wrappedAction);
+ }
+ else {
+ actionComponent = new JRadioButtonMenuItem(wrappedAction);
+ }
+ actionComponent.setSelected(Boolean.parseBoolean(String.valueOf(entry.getAttribute("selected")))
+ || entry.getName().equals(getSelectedActionName(entry)));
+ buttonGroup.add(actionComponent);
+ final KeyStroke accelerator = accelerators.getAccelerator(action);
+ actionComponent.setAccelerator(accelerator);
+ return actionComponent;
+ }
+ else if(entry.builders().contains("separator")){
+ return new JPopupMenu.Separator();
+ }
+ else
+ return null;
+ }
+
+ private String getSelectedActionName(Entry entry) {
+ String selectedAction = (String) entry.getParent().getAttribute("selectedAction");
+ if (selectedAction != null)
+ return selectedAction;
+ String selectedActionProperty = (String) entry.getParent().getAttribute("selectedActionProperty");
+ if (selectedActionProperty != null)
+ return ResourceController.getResourceController().getProperty(selectedActionProperty);
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/PopupBuilder.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/PopupBuilder.java
new file mode 100644
index 0000000..6e340b0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/PopupBuilder.java
@@ -0,0 +1,31 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import javax.swing.JPopupMenu;
+
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryPopupListener;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+
+public class PopupBuilder implements EntryVisitor {
+ final private EntryPopupListener popupListener;
+ private final JPopupMenu nodePopupMenu;
+
+ public PopupBuilder(final JPopupMenu nodePopupMenu, final EntryPopupListener popupListener) {
+ super();
+ this.popupListener =popupListener;
+ this.nodePopupMenu = nodePopupMenu;
+ }
+
+ @Override
+ public void visit(Entry target) {
+ nodePopupMenu.addPopupMenuListener(new PopupMenuListenerForEntry(target, popupListener));
+ new EntryAccessor().setComponent(target, nodePopupMenu);
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/PopupMenuListenerForEntry.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/PopupMenuListenerForEntry.java
new file mode 100644
index 0000000..c3cea90
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/PopupMenuListenerForEntry.java
@@ -0,0 +1,54 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import javax.swing.JMenu;
+import javax.swing.SwingUtilities;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryPopupListener;
+
+class PopupMenuListenerForEntry implements PopupMenuListener{
+ private final Entry entry;
+ private final EntryPopupListener popupListener;
+ final EntryAccessor entryAccessor = new EntryAccessor();
+
+ PopupMenuListenerForEntry(Entry entry, EntryPopupListener popupListener) {
+ this.entry = entry;
+ this.popupListener = popupListener;
+ }
+
+ @Override
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+ fireChildEntriesWillBecomeVisible(entry);
+ }
+
+ @Override
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ fireChildEntriesHidden(entry);
+ }
+ });
+ }
+
+ private void fireChildEntriesWillBecomeVisible(final Entry entry) {
+ popupListener.childEntriesWillBecomeVisible(entry);
+ for (Entry child : entry.children())
+ if (!(entryAccessor.getComponent(child) instanceof JMenu))
+ fireChildEntriesWillBecomeVisible(child);
+ }
+
+ private void fireChildEntriesHidden(final Entry entry) {
+ popupListener.childEntriesHidden(entry);
+ for (Entry child : entry.children())
+ if (!(entryAccessor.getComponent(child) instanceof JMenu))
+ fireChildEntriesHidden(child);
+ }
+
+ @Override
+ public void popupMenuCanceled(PopupMenuEvent e) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/ToolbarComponentProvider.java b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/ToolbarComponentProvider.java
new file mode 100644
index 0000000..b11a911
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/ui/menubuilders/menu/ToolbarComponentProvider.java
@@ -0,0 +1,41 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.Component;
+
+import javax.swing.JButton;
+import javax.swing.JToolBar.Separator;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.JAutoToggleButton;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+
+public class ToolbarComponentProvider implements ComponentProvider {
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.ui.menubuilders.menu.ComponentProvider#createComponent(org.freeplane.core.ui.menubuilders.generic.Entry)
+ */
+ @Override
+ public Component createComponent(Entry entry) {
+ final EntryAccessor entryAccessor = new EntryAccessor();
+ final Object existingComponent = entryAccessor.getComponent(entry);
+ if (existingComponent != null)
+ return (Component) existingComponent;
+ final AFreeplaneAction action = entryAccessor.getAction(entry);
+ Component component;
+ if(action != null){
+ if (action.isSelectable()) {
+ component = new JAutoToggleButton(action);
+ }
+ else {
+ component = new JButton(action);
+ }
+ }
+ else if(entry.builders().contains("separator")){
+ component = new Separator();
+ }
+ else
+ component = null;
+ return component;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/undo/CompoundActor.java b/freeplane/src/main/java/org/freeplane/core/undo/CompoundActor.java
new file mode 100644
index 0000000..43d03c7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/undo/CompoundActor.java
@@ -0,0 +1,79 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.undo;
+
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+/**
+ * Contains a list of actors and applys act() and undo() in a batch operation.
+ *
+ * Implements composite design pattern.
+ *
+ * @author Robert Ladstaetter
+ */
+public class CompoundActor implements IActor {
+ final private LinkedList<IActor> actors;
+
+ public CompoundActor() {
+ this(new LinkedList<IActor>());
+ }
+
+ @SuppressWarnings("unchecked")
+ public CompoundActor(final LinkedList<? extends IActor> actors) {
+ this.actors = (LinkedList<IActor>) actors;
+ }
+
+ public void act() {
+ for (final IActor a : actors) {
+ a.act();
+ }
+ }
+
+ public void add(final IActor firstActor) {
+ actors.add(firstActor);
+ }
+
+ public String getDescription() {
+ if (actors.size() == 0) {
+ return "";
+ }
+ final String firstDescription = actors.getFirst().getDescription();
+ if (actors.size() == 1) {
+ return firstDescription;
+ }
+ final String lastDescription = actors.getLast().getDescription();
+ if (actors.size() == 2 && !firstDescription.equals("") && !lastDescription.equals("")) {
+ return firstDescription + ", " + lastDescription;
+ }
+ return firstDescription + "... " + lastDescription;
+ }
+
+ public void undo() {
+ final ListIterator<IActor> iterator = actors.listIterator(actors.size());
+ while (iterator.hasPrevious()) {
+ iterator.previous().undo();
+ }
+ }
+
+ public boolean isEmpty() {
+ return actors.size() == 0;
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/undo/IActor.java b/freeplane/src/main/java/org/freeplane/core/undo/IActor.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/undo/IActor.java
rename to freeplane/src/main/java/org/freeplane/core/undo/IActor.java
diff --git a/freeplane/src/org/freeplane/core/undo/IUndoHandler.java b/freeplane/src/main/java/org/freeplane/core/undo/IUndoHandler.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/undo/IUndoHandler.java
rename to freeplane/src/main/java/org/freeplane/core/undo/IUndoHandler.java
diff --git a/freeplane/src/main/java/org/freeplane/core/undo/SelectionActor.java b/freeplane/src/main/java/org/freeplane/core/undo/SelectionActor.java
new file mode 100644
index 0000000..d466ef1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/undo/SelectionActor.java
@@ -0,0 +1,89 @@
+package org.freeplane.core.undo;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+public class SelectionActor implements IActor {
+ private final String[] nodeIDs;
+ final private MapModel map;
+ static private SelectionActor lastSelectionActor = null;
+
+ static SelectionActor create(IMapSelection selection){
+ final SelectionActor selectionActor = new SelectionActor(selection);
+ if(!selectionActor.equals(lastSelectionActor))
+ lastSelectionActor = selectionActor;
+ return lastSelectionActor;
+ }
+
+ private SelectionActor(IMapSelection selection) {
+ super();
+ map = selection.getSelected().getMap();
+ final List<NodeModel> nodes = selection.getOrderedSelection();
+ this.nodeIDs = new String[nodes.size()];
+ int index = 0;
+ for(NodeModel node : nodes)
+ nodeIDs[index++] = node.createID();
+ }
+
+
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + map.hashCode();
+ result = prime * result + Arrays.hashCode(nodeIDs);
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ SelectionActor other = (SelectionActor) obj;
+ if (!map.equals(other.map))
+ return false;
+ if (!Arrays.equals(nodeIDs, other.nodeIDs))
+ return false;
+ return true;
+ }
+
+ @Override
+ public void act() {
+ restoreSelection();
+ }
+
+ private void restoreSelection() {
+ final Controller controller = Controller.getCurrentController();
+ if(! map.equals(controller.getMap()))
+ return;
+
+ final IMapSelection selection = controller.getSelection();
+ if(this.equals(new SelectionActor(selection)))
+ return;
+ NodeModel[] nodes = new NodeModel[nodeIDs.length];
+ int index = 0;
+ for(String id : nodeIDs)
+ nodes[index++] = map.getNodeForID(id);
+ selection.replaceSelection(nodes);
+ }
+
+ @Override
+ public String getDescription() {
+ return "Restore selection";
+ }
+
+ @Override
+ public void undo() {
+ restoreSelection();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/undo/UndoHandler.java b/freeplane/src/main/java/org/freeplane/core/undo/UndoHandler.java
new file mode 100644
index 0000000..ba619a5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/undo/UndoHandler.java
@@ -0,0 +1,340 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.undo;
+
+import java.awt.EventQueue;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.ViewController;
+
+public class UndoHandler implements IUndoHandler {
+ final private List<ChangeListener> listeners;
+
+ private class RedoAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ redo();
+ }
+ }
+
+ private class UndoAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ undo();
+ }
+ }
+
+ public static final int COMMIT_DELAY = 2;
+
+ private static class ActorList extends LinkedList<CompoundActor> {
+ private static final long serialVersionUID = 1L;
+ int commitDelay = COMMIT_DELAY;
+ }
+
+ /**
+ *
+ */
+ private static final int MAX_ENTRIES = 100;
+ private static final long TIME_TO_BEGIN_NEW_ACTION = 100;
+ private boolean actionFrameStarted;
+ private ListIterator<CompoundActor> actorIterator;
+ private ActorList actorList;
+ private boolean isUndoActionRunning = false;
+ final private ActionListener redoAction;
+ private long timeOfLastAdd;
+ final private LinkedList<ActorList> transactionList;
+ final private LinkedList<ListIterator<CompoundActor>> transactionIteratorList;
+ final private ActionListener undoAction;
+ private boolean deactivated;
+ private final ChangeEvent event;
+ final private MapModel map;
+
+ public UndoHandler(MapModel map) {
+ this.map = map;
+ actionFrameStarted = false;
+ deactivated = false;
+ listeners = new LinkedList<ChangeListener>();
+ actorList = new ActorList();
+ transactionList = new LinkedList<ActorList>();
+ transactionIteratorList = new LinkedList<ListIterator<CompoundActor>>();
+ actorIterator = actorList.listIterator();
+ redoAction = new RedoAction();
+ timeOfLastAdd = 0;
+ undoAction = new UndoAction();
+ event = new ChangeEvent(this);
+ }
+
+ public void deactivate() {
+ deactivated = true;
+ fireStateChanged();
+ startActionFrame();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.base.undo.UndoHandler#addActor(freeplane.base.undo.UndoableActor
+ * )
+ */
+ public void addActor(final IActor actor) {
+ resetRedo();
+ actorList.commitDelay = COMMIT_DELAY;
+ final long currentTime = System.currentTimeMillis();
+ if (deactivated) {
+ if (!actionFrameStarted && currentTime - timeOfLastAdd > UndoHandler.TIME_TO_BEGIN_NEW_ACTION) {
+ deactivated = false;
+ }
+ else {
+ if (actorList.size() > 0) {
+ actorList.clear();
+ actorIterator = actorList.listIterator();
+ }
+ return;
+ }
+ }
+ if ((actorList.size() > 0)
+ && (actionFrameStarted || currentTime - timeOfLastAdd < UndoHandler.TIME_TO_BEGIN_NEW_ACTION)) {
+ CompoundActor compoundActor = (CompoundActor) actorIterator.previous();
+ compoundActor.add(actor);
+ actorIterator.next();
+ }
+ else {
+ CompoundActor compoundActor = new CompoundActor();
+ final Controller controller = Controller.getCurrentController();
+ if(map == controller.getMap()){
+ final IMapSelection selection = controller.getSelection();
+ final SelectionActor selectionActor = SelectionActor.create(selection);
+ compoundActor.add(selectionActor);
+ }
+ compoundActor.add(actor);
+ actorIterator.add(compoundActor);
+ final int maxEntries = UndoHandler.MAX_ENTRIES;
+ while (actorList.size() > maxEntries) {
+ actorList.removeFirst();
+ actorIterator = actorList.listIterator(actorList.size());
+ }
+ }
+ startActionFrame();
+ timeOfLastAdd = currentTime;
+ fireStateChanged();
+ }
+
+ private void fireStateChanged() {
+ for (final ChangeListener listener : listeners) {
+ listener.stateChanged(event);
+ }
+ }
+
+ public boolean canRedo() {
+ return actorIterator.hasNext();
+ }
+
+ public boolean canUndo() {
+ return actorIterator.hasPrevious();
+ }
+
+ public void commit() {
+ resetRedo();
+ final CompoundActor compoundActor = new CompoundActor(actorList);
+ actionFrameStarted = false;
+ timeOfLastAdd = 0;
+ if (transactionList.isEmpty()) {
+ // FIXME: this happens when new Maps are closed via the scripting API. Fix the basic error instead.
+ LogUtils.warn("transactionList is empty on UndoHandler.commit()");
+ return;
+ }
+ actorList = transactionList.removeLast();
+ actorIterator = transactionIteratorList.removeLast();
+ if (!compoundActor.isEmpty()) {
+ addActor(compoundActor);
+ actionFrameStarted = false;
+ timeOfLastAdd = 0;
+ }
+ else {
+ fireStateChanged();
+ }
+ }
+
+ public void delayedCommit() {
+ if (actorList.commitDelay == 0) {
+ commit();
+ return;
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ actorList.commitDelay--;
+ delayedCommit();
+ }
+ });
+ }
+
+ public void delayedRollback() {
+ if (actorList.commitDelay == 0) {
+ rollback();
+ return;
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ actorList.commitDelay--;
+ delayedRollback();
+ }
+ });
+ }
+
+ public String getLastDescription() {
+ final String description;
+ if (canUndo()) {
+ description = actorList.getLast().getDescription();
+ }
+ else {
+ description = null;
+ }
+ return description;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.base.undo.UndoHandler#getRedoAction()
+ */
+ public ActionListener getRedoAction() {
+ return redoAction;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.base.undo.UndoHandler#getUndoAction()
+ */
+ public ActionListener getUndoAction() {
+ return undoAction;
+ }
+
+ public boolean isUndoActionRunning() {
+ return isUndoActionRunning;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.base.undo.UndoHandler#redo()
+ */
+ public void redo() {
+ if (canRedo()) {
+ final IActor redoActor = actorIterator.next();
+ isUndoActionRunning = true;
+ redoActor.act();
+ isUndoActionRunning = false;
+ fireStateChanged();
+ }
+ }
+
+ public void resetRedo() {
+ while (canRedo()) {
+ actorIterator.next();
+ actorIterator.remove();
+ }
+ fireStateChanged();
+ }
+
+ public void rollback() {
+ try {
+ isUndoActionRunning = true;
+ while (actorIterator.hasPrevious()) {
+ final IActor actor = actorIterator.previous();
+ actor.undo();
+ }
+ }
+ finally {
+ isUndoActionRunning = false;
+ }
+ if (transactionList.isEmpty()) {
+ // FIXME: got here if exceptions occur after opening a map via the scripting API. Fix the basic error instead.
+ LogUtils.warn("transactionList is empty on UndoHandler.rollback()");
+ return;
+ }
+ actorList = transactionList.removeLast();
+ actorIterator = transactionIteratorList.removeLast();
+ fireStateChanged();
+ }
+
+ private void startActionFrame() {
+ if (actionFrameStarted == false) {
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ if (viewController.isDispatchThread()) {
+ actionFrameStarted = true;
+ viewController.invokeLater(new Runnable() {
+ public void run() {
+ actionFrameStarted = false;
+ }
+ });
+ }
+ }
+ }
+
+ public void forceNewTransaction() {
+ timeOfLastAdd = 0;
+ actionFrameStarted = false;
+ }
+
+ public void startTransaction() {
+ transactionList.addLast(actorList);
+ transactionIteratorList.addLast(actorIterator);
+ final ActorList newActorList = new ActorList();
+ actorList = newActorList;
+ actorIterator = newActorList.listIterator();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.base.undo.UndoHandler#undo()
+ */
+ public void undo() {
+ if (canUndo()) {
+ final IActor actor = actorIterator.previous();
+ try {
+ isUndoActionRunning = true;
+ actor.undo();
+ }
+ finally {
+ isUndoActionRunning = false;
+ fireStateChanged();
+ }
+ }
+ }
+
+ public void addChangeListener(final ChangeListener listener) {
+ listeners.add(listener);
+ }
+
+ public void removeChangeListener(final ChangeListener listener) {
+ listeners.remove(listener);
+ }
+
+ public int getTransactionLevel() {
+ return transactionList.size();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/ActionUtils.java b/freeplane/src/main/java/org/freeplane/core/util/ActionUtils.java
new file mode 100644
index 0000000..034fa20
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/ActionUtils.java
@@ -0,0 +1,38 @@
+package org.freeplane.core.util;
+
+import java.awt.event.ActionEvent;
+import javax.swing.Action;
+import org.freeplane.core.ui.AFreeplaneAction;
+
+public abstract class ActionUtils {
+
+
+ public static String getActionTitle(final AFreeplaneAction action) {
+ String title = (String)action.getValue(Action.NAME);
+
+ if(title == null || title.isEmpty()) {
+ title = TextUtils.getText(action.getTextKey());
+ }
+ if(title == null || title.isEmpty()) {
+ title = action.getTextKey();
+ }
+ return TextUtils.removeTranslateComment(title);
+ }
+
+ public static AFreeplaneAction getDummyAction(final String key) {
+ return new AFreeplaneAction(key) {
+ private static final long serialVersionUID = -5405032373977903024L;
+
+ public String getTextKey() {
+ return getKey();
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ //do nothing
+ }
+ };
+ }
+
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/ClassLoaderFactory.java b/freeplane/src/main/java/org/freeplane/core/util/ClassLoaderFactory.java
new file mode 100644
index 0000000..344881f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/ClassLoaderFactory.java
@@ -0,0 +1,48 @@
+package org.freeplane.core.util;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ClassLoaderFactory {
+ private static final FilenameFilter jarFileFilter = new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.toLowerCase().endsWith(".jar");
+ }
+ };
+
+ public static URLClassLoader getClassLoaderForUserLib(){
+ final List<URL> userJars = findJars(new String[]{Compat.getApplicationUserDirectory() + "/lib"});
+ final URLClassLoader urlClassLoader = new URLClassLoader(userJars.toArray(new URL[userJars.size()]));
+ return urlClassLoader;
+ }
+
+ public static List<URL> jarsInExtDir() {
+ String extDirsProperty = System.getProperty("java.ext.dirs");
+ final String[] strings = extDirsProperty == null ? new String[]{}: extDirsProperty.split(File.pathSeparator);
+ return findJars(strings);
+ }
+
+ public static List<URL> findJars(final String[] directories) {
+ try {
+ final List<URL> urls = new ArrayList<URL>();
+ for (String path : directories) {
+ File dir = new File(path);
+ if (dir.isDirectory()) {
+ for (File file : dir.listFiles(jarFileFilter)) {
+ urls.add(file.toURI().toURL());
+ }
+ }
+ }
+ return urls;
+ } catch (MalformedURLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/ColorUtils.java b/freeplane/src/main/java/org/freeplane/core/util/ColorUtils.java
new file mode 100644
index 0000000..2b4e58e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/ColorUtils.java
@@ -0,0 +1,97 @@
+package org.freeplane.core.util;
+
+import java.awt.Color;
+
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * Defines a color with some utility methods.
+ *
+ * @author robert.ladstaetter
+ */
+public class ColorUtils {
+ public static final int NON_TRANSPARENT_ALPHA = 255;
+ public static final String BLACK = "#000000";
+
+ public static String colorToString(final Color col) {
+ if (col == null) {
+ return null;
+ }
+ return String.format("#%02x%02x%02x", col.getRed(), col.getGreen(), col.getBlue());
+ }
+
+ public static String colorToRGBAString(final Color col) {
+ if (col == null) {
+ return null;
+ }
+ return String.format("#%02x%02x%02x%02x", col.getRed(), col.getGreen(), col.getBlue(), col.getAlpha());
+ }
+
+ public static Color rgbStringToColor(final String str) {
+ if (str == null) {
+ return null;
+ }
+ if (str.length() != 7 || str.charAt(0) != '#') {
+ throw new NumberFormatException("wrong color format in " + str + ". Expecting #rrggbb");
+ }
+ final int r = Integer.parseInt(str.substring(1, 3), 16);
+ final int g = Integer.parseInt(str.substring(3, 5), 16);
+ final int b = Integer.parseInt(str.substring(5, 7), 16);
+ return new Color(r, g, b);
+ }
+
+ public static Color stringToColor(final String str) {
+ if (str == null || str.equals("none")) {
+ return null;
+ }
+ if(str.length() == 7)
+ return rgbStringToColor(str);
+
+ if (str.length() != 9 || str.charAt(0) != '#') {
+ throw new NumberFormatException("wrong color format in " + str + ". Expecting #aarrggbb");
+ }
+ final int r = Integer.parseInt(str.substring(1, 3), 16);
+ final int g = Integer.parseInt(str.substring(3, 5), 16);
+ final int b = Integer.parseInt(str.substring(5, 7), 16);
+ final int a = Integer.parseInt(str.substring(7, 9), 16);
+ return new Color(r,g,b,a);
+ }
+
+ public static Color stringToColor(final String str, final Color alphaHolder) {
+ final Color rgb = stringToColor(str);
+ if(alphaHolder == null || isNonTransparent(alphaHolder) || rgb == null)
+ return rgb;
+ else
+ return new Color(rgb.getRed(), rgb.getGreen(), rgb.getBlue(), alphaHolder.getAlpha());
+ }
+
+ protected static boolean isNonTransparent(final Color alphaHolder) {
+ final boolean isNonTransparent = alphaHolder.getAlpha() == NON_TRANSPARENT_ALPHA;
+ return isNonTransparent;
+ }
+
+ static public Color alphaToColor(String value, Color color) {
+ return alphaToColor(Integer.parseInt(value), color);
+ }
+
+ public static Color alphaToColor(final int alpha, final Color rgbHolder) {
+ if(rgbHolder == null)
+ return new Color(0, 0, 0, alpha);
+ if(rgbHolder.getAlpha() == alpha)
+ return rgbHolder;
+ return new Color(rgbHolder.getRed(), rgbHolder.getGreen(), rgbHolder.getBlue(), alpha);
+ }
+
+ public static void setColorAttributes(final XMLElement element, String colorAttribute, String alphaAttribute, final Color color) {
+ element.setAttribute(colorAttribute, colorToString(color));
+ if(! isNonTransparent(color))
+ element.setAttribute(alphaAttribute, Integer.toString(color.getAlpha()));
+ }
+
+ public static void addColorAttributes(final ITreeWriter writer, String colorAttribute, String alphaAttribute, final Color color) {
+ writer.addAttribute(colorAttribute, colorToString(color));
+ if(! isNonTransparent(color))
+ writer.addAttribute(alphaAttribute, Integer.toString(color.getAlpha()));
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/Compat.java b/freeplane/src/main/java/org/freeplane/core/util/Compat.java
new file mode 100644
index 0000000..9ca1dcd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/Compat.java
@@ -0,0 +1,238 @@
+package org.freeplane.core.util;
+
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.freeplane.features.mode.Controller;
+
+/**
+ * Provides methods and constants which are dependend on the underlying java version
+ *
+ * @author robert.ladstaetter
+ */
+public class Compat {
+ public static final String FREEPLANE_USERDIR_PROPERTY = "org.freeplane.userfpdir";
+ public static final String JAVA_VERSION = System.getProperty("java.version");
+ public static final String VERSION_1_6_0 = "1.6.0";
+
+ private static enum OS {
+ MAC, WINDOWS, OTHER
+ };
+
+ private static OS os = null;
+ public static final Set<String> executableExtensions = new HashSet<String>(Arrays.asList(new String[] { "exe",
+ "com", "vbs", "bat", "lnk", "cmd" }));
+
+ public static boolean isWindowsExecutable(final URI link) {
+ if (link == null
+ || !"file".equalsIgnoreCase(link.getScheme())) {
+ return false;
+ }
+ return isWindowsOS() && executableExtensions.contains(FileUtils.getExtension(link.toString()));
+ }
+
+ public static URL fileToUrl(final File pFile) throws MalformedURLException {
+ return pFile.toURL();
+ }
+
+ public static boolean isLowerJdk(final String version) {
+ return JAVA_VERSION.compareTo(version) < 0;
+ }
+
+ public static boolean isMacOsX() {
+ Compat.initOS();
+ return os.equals(OS.MAC);
+ }
+
+ private static void initOS() {
+ if (os == null) {
+ String osProperty;
+ try {
+ osProperty = System.getProperty("os.name");
+ }
+ catch (final SecurityException e) {
+ osProperty = "";
+ }
+ String debugOsName;
+ try {
+ debugOsName = System.getProperty("freeplane.debug.os.name", "");
+ }
+ catch (final SecurityException e) {
+ debugOsName = "";
+ }
+ if (osProperty.startsWith("Mac OS") || debugOsName.startsWith("Mac")) {
+ os = OS.MAC;
+ return;
+ }
+ if (osProperty.startsWith("Windows") || debugOsName.startsWith("Windows")) {
+ os = OS.WINDOWS;
+ return;
+ }
+ os = OS.OTHER;
+ }
+ }
+
+ public static boolean isWindowsOS() {
+ Compat.initOS();
+ return os.equals(OS.WINDOWS);
+ }
+
+ /**
+ * This is a correction of a method getFile of a class URL. Namely, on
+ * Windows it returned file paths like /C: etc., which are not valid on
+ * Windows. This correction is heuristic to a great extend. One of the
+ * reasons is that file: something every browser and every system uses
+ * slightly differently.
+ */
+ private static String urlGetFile(final URL url) {
+ if( !url.getProtocol().equals("file"))
+ return null;
+ String fileName = url.toString().replaceFirst("^file:", "");
+ final String osNameStart = System.getProperty("os.name").substring(0, 3);
+ if (osNameStart.equals("Win") && url.getProtocol().equals("file")) {
+ fileName = fileName.replace('/', File.separatorChar);
+ return (fileName.indexOf(':') >= 0) ? fileName.replaceFirst("^\\\\*", "") : fileName;
+ }
+ else {
+ return fileName;
+ }
+ }
+
+ public static File urlToFile(final URL pUrl) throws URISyntaxException {
+ final String path = Compat.urlGetFile(pUrl);
+ if(path != null)
+ return new File(path);
+ else
+ return null;
+ }
+
+ public static void macAppChanges() {
+ if (!Compat.isMacOsX()) {
+ return;
+ }
+ try {
+ final Class<?> macChanges = Controller.class.getClassLoader().loadClass(
+ "org.freeplane.plugin.macos.MacChanges");
+ final Method method = macChanges.getMethod("apply", Controller.class);
+ method.invoke(null, Controller.getCurrentController());
+ }
+ catch (final Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void fixMousePointerForLinux(){
+ if (isX11WindowManager()) {
+ try {
+ Class<?> xwm = Class.forName("sun.awt.X11.XWM");
+ Field awt_wmgr = xwm.getDeclaredField("awt_wmgr");
+ awt_wmgr.setAccessible(true);
+ Field other_wm = xwm.getDeclaredField("OTHER_WM");
+ other_wm.setAccessible(true);
+ if (awt_wmgr.get(null).equals(other_wm.get(null))) {
+ Field metacity_wm = xwm.getDeclaredField("METACITY_WM");
+ metacity_wm.setAccessible(true);
+ awt_wmgr.set(null, metacity_wm.get(null));
+ }
+ }
+ catch (Exception x) {
+ }
+ } }
+
+ public static boolean isX11WindowManager() {
+ return Arrays.asList("gnome-shell", "mate", "other...").contains(System.getenv("DESKTOP_SESSION"));
+ }
+
+ final public static String CURRENT_VERSION_DIR= File.separatorChar + "1.5.x";
+ final public static String PREVIOUS_VERSION_DIR_NAME = "1.3.x";
+
+ private static String userFpDir = null;
+
+
+ /** the directory *including* the version directory. */
+ public static String getApplicationUserDirectory() {
+ return getApplicationUserDirectoryExcludingVersion() + CURRENT_VERSION_DIR;
+ }
+
+ public static String getApplicationUserDirectoryExcludingVersion() {
+ if(userFpDir == null)
+ findApplicationUserDirectory();
+ return userFpDir;
+ }
+
+ protected static void findApplicationUserDirectory() {
+ final String userFpDirByProperty = System.getProperty(FREEPLANE_USERDIR_PROPERTY);
+ final String userFpDirPath = userFpDirByProperty != null ? userFpDirByProperty : getDefaultFreeplaneUserDirectory();
+ try {
+ userFpDir = new File(userFpDirPath).getCanonicalPath();
+ } catch (IOException e) {
+ try {
+ userFpDir = new File(getDefaultFreeplaneUserDirectory()).getCanonicalPath();
+ } catch (IOException e1) {
+ userFpDir = userFpDirPath;
+ }
+ }
+ }
+
+ public static String getDefaultFreeplaneUserDirectory() {
+ return System.getProperty("user.home")+ File.separator + ".freeplane";
+ }
+
+ static public String smbUri2unc(final URI uri) {
+ String uriString;
+ uriString = ("//" + uri.getHost() + uri.getPath()) .replace('/', '\\');
+ final String fragment = uri.getFragment();
+ if(fragment != null)
+ uriString = uriString + '#' + fragment;
+ return uriString;
+ }
+
+ static public boolean isPlainEvent(final MouseEvent e) {
+ final int modifiers = getModifiers(e);
+ return modifiers == 0;
+ }
+
+ private static int getModifiers(final MouseEvent e) {
+ return e.getModifiersEx() &
+ (InputEvent.CTRL_DOWN_MASK
+ | InputEvent.META_DOWN_MASK
+ | InputEvent.SHIFT_DOWN_MASK
+ | InputEvent.ALT_DOWN_MASK
+ );
+ }
+
+ static public boolean isCtrlEvent(final MouseEvent e) {
+ return isExtendedCtrlEvent(e, 0);
+ }
+
+ public static boolean isCtrlShiftEvent(MouseEvent e) {
+ return isExtendedCtrlEvent(e, InputEvent.SHIFT_DOWN_MASK);
+ }
+
+ public static boolean isCtrlAltEvent(MouseEvent e) {
+ return isExtendedCtrlEvent(e, InputEvent.ALT_DOWN_MASK);
+ }
+
+ static private boolean isExtendedCtrlEvent(final MouseEvent e, int otherModifiers) {
+ final int modifiers = getModifiers(e);
+ if (isMacOsX())
+ return modifiers == (InputEvent.META_DOWN_MASK | otherModifiers);
+ return modifiers == (InputEvent.CTRL_DOWN_MASK|otherModifiers);
+ }
+
+ public static boolean isShiftEvent(MouseEvent e) {
+ final int modifiers = getModifiers(e);
+ return modifiers == InputEvent.SHIFT_DOWN_MASK;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/ConfigurationUtils.java b/freeplane/src/main/java/org/freeplane/core/util/ConfigurationUtils.java
new file mode 100644
index 0000000..694cd5a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/ConfigurationUtils.java
@@ -0,0 +1,52 @@
+package org.freeplane.core.util;
+
+import java.io.File;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+
+public class ConfigurationUtils {
+ private static final String CONFIG_LIST_VALUE_SEPARATOR_STRICT = File.pathSeparator + File.pathSeparator;
+ private static final String CONFIG_LIST_VALUE_SEPARATOR_ONE_OR_MORE = File.pathSeparator + '+';
+
+ /** if not requireTwo one pathseparator suffices otherwise two are required. */
+ public static List<String> decodeListValue(final String value, boolean requireTwo) {
+ if (value.length() == 0)
+ return Collections.emptyList();
+ final String sep = requireTwo ? CONFIG_LIST_VALUE_SEPARATOR_STRICT : CONFIG_LIST_VALUE_SEPARATOR_ONE_OR_MORE;
+ // -1: don't discard trailing empty strings
+ return Arrays.asList(value.split("\\s*" + sep + "\\s*", -1));
+ }
+
+ /** if not requireTwo one pathseparator suffices otherwise two are required. */
+ public static String encodeListValue(final List<String> list, boolean requireTwo) {
+ return StringUtils.join(list.iterator(), requireTwo ? CONFIG_LIST_VALUE_SEPARATOR_STRICT
+ : CONFIG_LIST_VALUE_SEPARATOR_ONE_OR_MORE);
+ }
+
+ public static File getLocalizedFile(final File[] baseDirs, final String document, final String languageCode) {
+ final int extPosition = document.lastIndexOf('.');
+ final String localizedDocument;
+ if (extPosition != -1) {
+ localizedDocument = document.substring(0, extPosition) + "_" + languageCode + document.substring(extPosition);
+ }
+ else{
+ localizedDocument = document;
+ }
+ for(File baseDir : baseDirs){
+ if(baseDir != null){
+ final File localFile = new File(baseDir, localizedDocument);
+ if (localFile.canRead()) {
+ return localFile;
+ }
+ final File file = new File(baseDir, document);
+ if (file.canRead()) {
+ return file;
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/ConstantObject.java b/freeplane/src/main/java/org/freeplane/core/util/ConstantObject.java
new file mode 100644
index 0000000..7d9749f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/ConstantObject.java
@@ -0,0 +1,32 @@
+package org.freeplane.core.util;
+
+public class ConstantObject<T, R extends Enum<?>> implements ObjectRule<T, R> {
+ final private T object;
+
+ public ConstantObject(T object) {
+ this.object = object;
+ }
+
+ @Override
+ public T getValue() {
+ return object;
+ }
+
+ @Override
+ public boolean hasValue() {
+ return true;
+ }
+
+ @Override
+ public void resetCache() {
+ }
+
+ @Override
+ public R getRule() {
+ return null;
+ }
+
+ @Override
+ public void setCache(T value) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/Convertible.java b/freeplane/src/main/java/org/freeplane/core/util/Convertible.java
new file mode 100644
index 0000000..6b421b7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/Convertible.java
@@ -0,0 +1,5 @@
+package org.freeplane.core.util;
+
+public interface Convertible {
+ double factor();
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/DelayedRunner.java b/freeplane/src/main/java/org/freeplane/core/util/DelayedRunner.java
new file mode 100644
index 0000000..3259563
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/DelayedRunner.java
@@ -0,0 +1,25 @@
+package org.freeplane.core.util;
+
+import javax.swing.SwingUtilities;
+
+public class DelayedRunner {
+ private final Runnable runnable;
+ private boolean runTriggered;
+ public DelayedRunner(Runnable runnable) {
+ super();
+ this.runnable = runnable;
+ runTriggered = false;
+ }
+ public void runLater() {
+ if(! runTriggered){
+ runTriggered = true;
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ runTriggered = false;
+ runnable.run();
+ }
+ });
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/FactoryMethod.java b/freeplane/src/main/java/org/freeplane/core/util/FactoryMethod.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/FactoryMethod.java
rename to freeplane/src/main/java/org/freeplane/core/util/FactoryMethod.java
diff --git a/freeplane/src/main/java/org/freeplane/core/util/FileUtils.java b/freeplane/src/main/java/org/freeplane/core/util/FileUtils.java
new file mode 100644
index 0000000..7ebe250
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/FileUtils.java
@@ -0,0 +1,349 @@
+package org.freeplane.core.util;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.Closeable;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.net.URL;
+import java.nio.channels.FileChannel;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.mode.Controller;
+
+public class FileUtils {
+ public static void copyFromURL(final URL resource, final File destinationDirectory) {
+ final String path = resource.getPath();
+ final int index = path.lastIndexOf('/');
+ final String fileName = index > -1 ? path.substring(index + 1) : path;
+ InputStream in = null;
+ OutputStream out = null;
+ try {
+ in = resource.openStream();
+ out = new FileOutputStream(new File(destinationDirectory, fileName));
+ FileUtils.copyStream(in, out);
+ }
+ catch (final Exception e) {
+ LogUtils.severe("File not found or could not be copied. " + "Was searching for " + path
+ + " and should go to " + destinationDirectory.getAbsolutePath());
+ }
+ finally {
+ FileUtils.silentlyClose(in, out);
+ }
+ }
+
+ public static void copyFromResource(final String path, final String fileName, final File destinationDirectory) {
+ final String pathToResource = path + fileName;
+ InputStream in = null;
+ OutputStream out = null;
+ try {
+ final URL resource;
+ if (pathToResource.startsWith("file:")) {
+ resource = new URL(pathToResource);
+ }
+ else {
+ resource = ResourceController.getResourceController().getResource(pathToResource);
+ }
+ if (resource == null) {
+ LogUtils.severe("Cannot find resource: " + pathToResource);
+ return;
+ }
+ in = new BufferedInputStream(resource.openStream());
+ out = new FileOutputStream(new File(destinationDirectory, fileName));
+ FileUtils.copyStream(in, out);
+ }
+ catch (final Exception e) {
+ LogUtils.severe("File not found or could not be copied. " + "Was searching for " + pathToResource
+ + " and should go to " + destinationDirectory.getAbsolutePath());
+ }
+ finally {
+ FileUtils.silentlyClose(in, out);
+ }
+ }
+
+ /** the caller has to close the streams. */
+ public static void copyStream(final InputStream in, final OutputStream out) throws IOException {
+ final byte[] buf = new byte[1024];
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ out.write(buf, 0, len);
+ }
+ }
+
+ public static void dumpStringToFile(final String string, final File outFile, String encoding) throws IOException {
+ FileOutputStream outStream = null;
+ OutputStreamWriter out = null;
+ try {
+ outStream = new FileOutputStream(outFile);
+ out = new OutputStreamWriter(outStream, encoding);
+ out.write(string);
+ }
+ finally {
+ try {
+ if (out != null)
+ out.close();
+ }
+ catch (Exception e) {
+ // no rescue
+ e.printStackTrace();
+ }
+ try {
+ if (outStream != null)
+ outStream.close();
+ }
+ catch (Exception e) {
+ // no rescue
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ */
+ public static boolean createDirectory(final String directoryName) {
+ final File dir = new File(directoryName);
+ if (!dir.exists()) {
+ return dir.mkdirs();
+ }
+ return true;
+ }
+
+ public static Properties loadProperties(final String classpathRessource) {
+ final Properties props = new Properties();
+ InputStream in = null;
+ try {
+ in = FileUtils.class.getResource(classpathRessource).openStream();
+ props.load(in);
+ }
+ catch (final IOException e) {
+ throw new RuntimeException(e);
+ }
+ finally {
+ FileUtils.silentlyClose(in);
+ }
+ return props;
+ }
+
+
+ private static String slurp(final Reader reader) throws IOException {
+ /* read data into a string */
+ final StringBuilder builder = new StringBuilder();
+ final char[] buf = new char[1024];
+ int len;
+ while ((len = reader.read(buf)) > 0) {
+ builder.append(buf, 0, len);
+ }
+ final String result = builder.toString();
+ return result;
+ }
+
+ public static String slurpResource(final URL resource) throws IOException {
+ /* read the `resource` into s atring */
+ InputStream instream = null;
+ try {
+ instream = resource.openStream();
+ final BufferedReader input = new BufferedReader(new InputStreamReader(instream));
+ return slurp(input);
+ }
+ finally {
+ if (instream != null) {
+ instream.close();
+ }
+ }
+ }
+
+ final private static Map<String, String> cachedResources = new HashMap<>();
+
+ public static String slurpResource(final String fileName) throws IOException {
+ if(cachedResources.containsKey(fileName))
+ return cachedResources.get(fileName);
+ /* read the resource `fileName` into s atring */
+ final URL resource = ResourceController.getResourceController().getResource(fileName);
+ if (resource == null) {
+ LogUtils.severe("Cannot find resource: " + fileName);
+ return "";
+ }
+ final String slurpedResource = FileUtils.slurpResource(resource);
+ cachedResources.put(fileName, slurpedResource);
+ return slurpedResource;
+ }
+
+ public static String slurpFile(final File file) throws IOException {
+ FileReader in = null;
+ try {
+ in = new FileReader(file);
+ return slurp(in);
+ }
+ finally {
+ if (in != null) {
+ in.close();
+ }
+ }
+ }
+
+ public static String slurpFile(final String fileName) throws IOException {
+ return FileUtils.slurpFile(new File(fileName));
+ }
+
+ public static Charset defaultCharset() {
+ try {
+ final String defaultCharsetName = ResourceController.getResourceController().getProperty("default_charset");
+ if (defaultCharsetName.equals("JVMdefault")) {
+ return Charset.defaultCharset();
+ }
+ return Charset.forName(defaultCharsetName);
+ }
+ catch (final Exception e) {
+ return Charset.defaultCharset();
+ }
+ }
+
+ /**
+ * Returns the lowercase of the extension of a file.
+ */
+ public static String getExtension(final File f) {
+ return FileUtils.getExtension(f.toString());
+ }
+
+ /**
+ * Returns the lowercase of the extension of a file.
+ */
+ public static String getExtension(final String s) {
+ if (s == null) {
+ return null;
+ }
+ for(int i = s.length() - 1; i >= 0; i--){
+ final char c = s.charAt(i);
+ if(c == File.separatorChar || c == '/' )
+ return "";
+ if(c == '.'){
+ return s.substring(i+1).trim().toLowerCase();
+ }
+ }
+ return "";
+ }
+
+ public static boolean isAbsolutePath(final String path) {
+ final String osNameStart = System.getProperty("os.name").substring(0, 3);
+ final String fileSeparator = System.getProperty("file.separator");
+ if (osNameStart.equals("Win")) {
+ return ((path.length() > 1) && path.substring(1, 2).equals(":")) || path.startsWith(fileSeparator);
+ }
+ else if (osNameStart.equals("Mac")) {
+ return path.startsWith(fileSeparator);
+ }
+ else {
+ return path.startsWith(fileSeparator);
+ }
+ }
+
+ /**
+ * In case of trouble, the method returns null.
+ *
+ * @param pInputFile
+ * the file to read.
+ * @return the complete content of the file. or null if an exception has
+ * occured.
+ */
+ public static String readFile(final File pInputFile) {
+ final StringBuilder lines = new StringBuilder();
+ BufferedReader bufferedReader = null;
+ try {
+ bufferedReader = new BufferedReader(new FileReader(pInputFile));
+ final String endLine = System.getProperty("line.separator");
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ lines.append(line).append(endLine);
+ }
+ bufferedReader.close();
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ if (bufferedReader != null) {
+ try {
+ bufferedReader.close();
+ }
+ catch (final Exception ex) {
+ LogUtils.severe(ex);
+ }
+ }
+ return null;
+ }
+ return lines.toString();
+ }
+
+ public static String removeExtension(final String s) {
+ final int i = s.lastIndexOf('.');
+ return (i > 0 && i < s.length() - 1) ? s.substring(0, i) : s;
+ }
+
+ public static void setHidden(final File file, final boolean hidden, final boolean synchronously) {
+ final String osNameStart = System.getProperty("os.name").substring(0, 3);
+ if (osNameStart.equals("Win")) {
+ try {
+ Controller.exec("attrib " + (hidden ? "+" : "-") + "H \"" + file.getAbsolutePath() + "\"");
+ if (!synchronously) {
+ return;
+ }
+ int timeOut = 10;
+ while (file.isHidden() != hidden && timeOut > 0) {
+ Thread.sleep(10/* miliseconds */);
+ timeOut--;
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+ }
+
+ /** to be used in a finally block. This method is null-safe. */
+ public static void silentlyClose(Closeable... streams) {
+ for (Closeable stream : streams) {
+ if (stream != null) {
+ try {
+ stream.close();
+ }
+ catch (IOException e) {
+ LogUtils.severe(e);
+ }
+ }
+ }
+ }
+
+ public static void copyFile(File in, File out) throws IOException {
+ FileChannel inChannel = new FileInputStream(in).getChannel();
+ FileChannel outChannel = new FileOutputStream(out).getChannel();
+ try {
+ // inChannel.transferTo(0, inChannel.size(), outChannel);
+ // original -- apparently has trouble copying large files on Windows
+ // magic number for Windows, (64Mb - 32Kb)
+ int maxCount = (64 * 1024 * 1024) - (32 * 1024);
+ long size = inChannel.size();
+ long position = 0;
+ while (position < size) {
+ position += inChannel.transferTo(position, maxCount, outChannel);
+ }
+ } finally {
+ if (inChannel != null) {
+ inChannel.close();
+ }
+ if (outChannel != null) {
+ outChannel.close();
+ }
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/core/util/FixedHTMLWriter.java b/freeplane/src/main/java/org/freeplane/core/util/FixedHTMLWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/FixedHTMLWriter.java
rename to freeplane/src/main/java/org/freeplane/core/util/FixedHTMLWriter.java
diff --git a/freeplane/src/org/freeplane/core/util/FreeplaneIconUtils.java b/freeplane/src/main/java/org/freeplane/core/util/FreeplaneIconUtils.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/FreeplaneIconUtils.java
rename to freeplane/src/main/java/org/freeplane/core/util/FreeplaneIconUtils.java
diff --git a/freeplane/src/main/java/org/freeplane/core/util/FreeplaneVersion.java b/freeplane/src/main/java/org/freeplane/core/util/FreeplaneVersion.java
new file mode 100644
index 0000000..0a695a0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/FreeplaneVersion.java
@@ -0,0 +1,227 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.util;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import org.freeplane.core.resources.ResourceController;
+
+/** provides access to the current Freeplane version. In scripts use <code>c.freeplaneVersion</code>.
+ * For usage instructions see {@link #compareTo(FreeplaneVersion)}. */
+public class FreeplaneVersion implements Comparable<FreeplaneVersion> {
+ private static final FreeplaneVersion VERSION = FreeplaneVersion.loadVersion();
+ public static final String VERSION_KEY = "freeplane_version";
+ public static final String VERSION_PROPERTIES = "/version.properties";
+ public static final String XML_VERSION = "freeplane 1.5.9";
+ /** major version, the 1 in "1.0.38 rc" */
+ private final int mMaj;
+ /** mid version, the 0 in "1.0.38 rc" */
+ private final int mMid;
+ /** minor version, the 38 in "1.0.38 rc" */
+ private final int mMin;
+ /** optional patch level (testversion only). */
+ private final int mNum;
+ /** release type e.g. "", "rc", "beta", "alpha" or "nightly_build". */
+ private String mType;
+
+ private final String revision;
+
+ public static FreeplaneVersion getVersion() {
+ return VERSION;
+ }
+
+ /**
+ * Parses a version string as FreeplaneVersion.
+ * Ignores leading 'v' (e.g. "v1.2.6") and accept '.' and ' ' as separator.
+ * @throws IllegalArgumentException on parse errors
+ */
+ public static FreeplaneVersion getVersion(final String pString) throws IllegalArgumentException {
+ if (pString == null)
+ return null;
+ final StringTokenizer t = new StringTokenizer(pString, "v. ", false);
+ final String[] info = new String[t.countTokens()];
+ int i = 0;
+ while (t.hasMoreTokens()) {
+ info[i++] = t.nextToken();
+ }
+ if (info.length < 2 | info.length > 5) {
+ throw new IllegalArgumentException("Wrong number of tokens for version information: " + pString);
+ }
+ try {
+ final int maj = Integer.parseInt(info[0]);
+ final int mid = Integer.parseInt(info[1]);
+ final int min = info.length < 3 ? 0 : Integer.parseInt(info[2]);
+ final String type = info.length < 4 ? "" : info[3];
+ final int num = info.length < 5 ? 0 : Integer.parseInt(info[4]);
+ return new FreeplaneVersion(maj, mid, min, type, num, loadRevision());
+ }
+ catch (final NumberFormatException e) {
+ throw new IllegalArgumentException("Wrong version token: " + pString, e);
+ }
+ }
+
+ private static FreeplaneVersion loadVersion() {
+ final Properties versionProperties = FileUtils.loadProperties(VERSION_PROPERTIES);
+ final String versionString = versionProperties.getProperty(VERSION_KEY);
+ final String versionStatus = versionProperties.getProperty("freeplane_version_status");
+ final FreeplaneVersion version = FreeplaneVersion.getVersion(versionString);
+ version.mType = versionStatus;
+ return version;
+ }
+
+ public int getMaj() {
+ return mMaj;
+ }
+
+ public int getMid() {
+ return mMid;
+ }
+
+ public int getMin() {
+ return mMin;
+ }
+
+ public int getNum() {
+ return mNum;
+ }
+
+ public String getType() {
+ return mType;
+ }
+
+ public String getRevision(){
+ return revision;
+ }
+
+ public FreeplaneVersion(final int pMaj, final int pMid, final int pMin, final String pType, final int pNum, final String revision) {
+ super();
+ mMaj = pMaj;
+ mMid = pMid;
+ mMin = pMin;
+ mType = pType;
+ mNum = pNum;
+ this.revision = revision;
+ }
+
+ public FreeplaneVersion(final int pMaj, final int pMid, final int pMin) {
+ this(pMaj, pMid, pMin, "", 0, "");
+ }
+
+ /** Use it like this:
+ * <pre>
+ * import org.freeplane.core.util.FreeplaneVersion
+ * def required = FreeplaneVersion.getVersion("1.2.20")
+ * if (c.freeplaneVersion < required)
+ * ui.errorMessage("Freeplane version ${c.freeplaneVersion}"
+ * + " not supported - update to at least ${required}")
+ * </pre>
+ */
+ public int compareTo(final FreeplaneVersion o) {
+ if (mMaj < o.mMaj) {
+ return -1;
+ }
+ if (mMaj > o.mMaj) {
+ return 1;
+ }
+ if (mMid < o.mMid) {
+ return -1;
+ }
+ if (mMid > o.mMid) {
+ return 1;
+ }
+ if (mMin < o.mMin) {
+ return -1;
+ }
+ if (mMin > o.mMin) {
+ return 1;
+ }
+ if (mNum < o.mNum) {
+ return -1;
+ }
+ if (mNum > o.mNum) {
+ return 1;
+ }
+ return 0;
+ }
+
+ /** returns the full version number, e.g. "1.0.38 rc". */
+ @Override
+ public String toString() {
+ final StringBuilder buf = new StringBuilder();
+ buf.append(mMaj);
+ buf.append('.');
+ buf.append(mMid);
+ buf.append('.');
+ buf.append(mMin);
+ if (!mType.equals("")) {
+ buf.append(' ');
+ buf.append(mType);
+ }
+ if (mNum != 0) {
+ buf.append(' ');
+ buf.append(mNum);
+ }
+ return buf.toString();
+ }
+
+ /** returns the version number only, e.g. "1.0.38". */
+ public String numberToString() {
+ final StringBuilder buf = new StringBuilder();
+ buf.append(mMaj);
+ buf.append('.');
+ buf.append(mMid);
+ buf.append('.');
+ buf.append(mMin);
+ return buf.toString();
+ }
+
+ public boolean isOlderThan(FreeplaneVersion freeplaneVersion) {
+ return compareTo(freeplaneVersion) < 0;
+ }
+
+ public boolean isNewerThan(FreeplaneVersion freeplaneVersion) {
+ return compareTo(freeplaneVersion) > 0;
+ }
+
+ public boolean isFinal(){
+ return "".equals(mType);
+ }
+
+ private static String loadRevision() {
+ final URL gitInfo = ResourceController.getResourceController().getResource("/gitinfo.properties");
+ final String revision;
+ if(gitInfo != null){
+ Properties gitProps = new Properties();
+ try {
+ gitProps.load(gitInfo.openStream());
+ }
+ catch (IOException e) {
+ }
+ revision = gitProps.getProperty("git-revision", "");
+ }
+ else{
+ revision = "";
+ }
+ return revision;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/HtmlProcessor.java b/freeplane/src/main/java/org/freeplane/core/util/HtmlProcessor.java
new file mode 100644
index 0000000..3fc0f4a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/HtmlProcessor.java
@@ -0,0 +1,40 @@
+package org.freeplane.core.util;
+
+import java.io.StringReader;
+import java.io.StringWriter;
+
+import javax.swing.text.Document;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.HTMLWriter;
+
+public class HtmlProcessor {
+ private final Document doc;
+ public HtmlProcessor(final String input){
+ final HTMLEditorKit kit = new HTMLEditorKit();
+ doc = kit.createDefaultDocument();
+ try {
+ final int defaultDocumentLength = doc.getLength();
+ kit.read(new StringReader(input), doc, defaultDocumentLength);
+ } catch (Exception e) {
+ }
+ }
+ public String htmlSubstring(int pos, int length){
+ final StringWriter writer = new StringWriter();
+ try {
+ if(pos < doc.getLength() && length > 0){
+ final HTMLWriter hw = new HTMLWriter(writer, (HTMLDocument) doc, pos,
+ Math.min(length, doc.getLength() - pos));
+ hw.write();
+ }
+ } catch (Exception e) {
+ }
+ return writer.toString();
+ }
+ public int getDocumentLength() {
+ return doc.getLength();
+ }
+
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/HtmlUtils.java b/freeplane/src/main/java/org/freeplane/core/util/HtmlUtils.java
new file mode 100644
index 0000000..0a807bc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/HtmlUtils.java
@@ -0,0 +1,785 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.util;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.swing.text.AttributeSet;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.HTMLDocument;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Utilities for conversion from/to HTML and XML used in Freeplane: In scripts available
+ * as "global variable" <code>htmlUtils</code>.
+ */
+public class HtmlUtils {
+ public static class IndexPair {
+ final public boolean mIsTag;
+ final public int originalEnd;
+ final public int originalStart;
+ final public int pureTextEnd;
+ final public int pureTextStart;
+
+ public IndexPair(final int pOriginalStart, final int pOriginalEnd, final int pPureTextStart,
+ final int pPureTextEnd, final boolean pIsTag) {
+ super();
+ originalStart = pOriginalStart;
+ originalEnd = pOriginalEnd;
+ pureTextStart = pPureTextStart;
+ pureTextEnd = pPureTextEnd;
+ mIsTag = pIsTag;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder buffer = new StringBuilder();
+ buffer.append("[IndexPair:");
+ buffer.append(" originalStart: ");
+ buffer.append(originalStart);
+ buffer.append(" originalEnd: ");
+ buffer.append(originalEnd);
+ buffer.append(" pureTextStart: ");
+ buffer.append(pureTextStart);
+ buffer.append(" pureTextEnd: ");
+ buffer.append(pureTextEnd);
+ buffer.append(" is a tag: ");
+ buffer.append(mIsTag);
+ buffer.append("]");
+ return buffer.toString();
+ }
+ }
+
+ private static final Pattern FIND_TAGS_PATTERN = Pattern.compile("([^<]*)(<[^>]+>)");
+ private static final Pattern HTML_PATTERN = Pattern.compile("(?s)^\\s*<\\s*html[^>]*>.*", Pattern.CASE_INSENSITIVE);
+ private static Pattern[] PATTERNS;
+ private static HtmlUtils sInstance = new HtmlUtils();
+ private static final Pattern SLASHED_TAGS_PATTERN = Pattern.compile("<((" + "br|area|base|basefont|"
+ + "bgsound|button|col|colgroup|embed|hr" + "|img|input|isindex|keygen|link|meta"
+ + "|object|plaintext|spacer|wbr" + ")(\\s[^>]*)?)/>");
+ private static final Pattern TAGS_PATTERN = Pattern.compile("(?s)<[^><]*>");
+
+ public static HtmlUtils getInstance() {
+ return HtmlUtils.sInstance;
+ }
+
+ /** equivalent to htmlToPlain(text, strictHTMLOnly=true, removeNewLines=true)
+ * @see #htmlToPlain(String, boolean, boolean) */
+ public static String htmlToPlain(final String text) {
+ return HtmlUtils.htmlToPlain(text, /* strictHTMLOnly= */true, /* removeNewLines= */true);
+ }
+
+ /** equivalent to htmlToPlain(text, strictHTMLOnly, removeNewLines=true)
+ * @see #htmlToPlain(String, boolean, boolean) */
+ public static String htmlToPlain(final String text, final boolean strictHTMLOnly) {
+ return htmlToPlain(text, strictHTMLOnly, /* removeNewLines= */true);
+ }
+
+ /** removes html markup and entities, partly and where appropriate by replacing it by plaintext equivalents like
+ * <li> → '*'.
+ * @param strictHTMLOnly if true does nothing unless the text starts with <html>
+ * @param removeNewLines set to false to keep all blank lines. */
+ public static String htmlToPlain(final String text, final boolean strictHTMLOnly, final boolean removeNewLines) {
+ if (strictHTMLOnly && !HtmlUtils.isHtmlNode(text)) {
+ return text;
+ }
+ if (PATTERNS == null) {
+ PATTERNS = new Pattern[] {
+ Pattern.compile("(?ims)>[\n\t]+"),
+ Pattern.compile("(?ims)[\n\t ]+"),
+ Pattern.compile("(?ims)<br[^>]*>"),
+ Pattern.compile("(?ims)<p[^>]*>\\s+"),
+ Pattern.compile("(?ims)<div[^>]*>\\s+"),
+ Pattern.compile("(?ims)<tr[^>]*>\\s+"),
+ Pattern.compile("(?ims)<dt[^>]*>"),
+ Pattern.compile("(?ims)<dd[^>]*>"),
+ Pattern.compile("(?ims)<td[^>]*>"),
+ Pattern.compile("(?ims)<[uo]l[^>]*>"),
+ Pattern.compile("(?ims)<li[^>]*>"),
+ Pattern.compile("(?ims) *</[^>]*>"),
+ Pattern.compile("(?ims)<[^/][^>]*> *"),
+ Pattern.compile("^\n+"),
+ Pattern.compile("(?ims)<"),
+ Pattern.compile("(?ims)>"),
+ Pattern.compile("(?ims)""),
+ Pattern.compile("(?ims) "),
+ Pattern.compile("(?ims)&"),
+ Pattern.compile("(?ims)[ \t]+\n") };
+ }
+ String intermediate = text;
+ int i = 0;
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(">");
+ if (removeNewLines)
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(" ");
+ else
+ i++;
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n ");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(" ");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n * ");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("");
+ if (removeNewLines)
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("");
+ else
+ i++;
+ intermediate = intermediate.trim();
+ intermediate = HtmlUtils.unescapeHTMLUnicodeEntity(intermediate);
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("<");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(">");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\"");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(" ");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("&");
+ intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
+ intermediate = intermediate.replace('\u00a0', ' ');
+ return intermediate;
+ }
+
+ public static boolean isHtmlNode(final String text) {
+ for (int i = 0; i < text.length(); i++) {
+ final char ch = text.charAt(i);
+ if (ch == '<') {
+ break;
+ }
+ if (!Character.isWhitespace(ch) || i == text.length()) {
+ return false;
+ }
+ }
+ return HtmlUtils.HTML_PATTERN.matcher(text).matches();
+ }
+
+ /** transforms {@code &, <, >, \n} and whitespace by their HTML counterpart and
+ * encloses the whole text in {@code <html><body><p>...</p></body></html>}. */
+ public static String plainToHTML(final String text) {
+ char myChar;
+ final String textTabsExpanded = text.replaceAll("\t", " ");
+ final StringBuilder result = new StringBuilder(textTabsExpanded.length());
+ final int lengthMinus1 = textTabsExpanded.length() - 1;
+ result.append("<html><body><p>");
+ for (int i = 0; i < textTabsExpanded.length(); ++i) {
+ myChar = textTabsExpanded.charAt(i);
+ switch (myChar) {
+ case '&':
+ result.append("&");
+ break;
+ case '<':
+ result.append("<");
+ break;
+ case '>':
+ result.append(">");
+ break;
+ case ' ':
+ if (i > 0 && i < lengthMinus1 && textTabsExpanded.charAt(i - 1) > 32
+ && textTabsExpanded.charAt(i + 1) > 32) {
+ result.append(' ');
+ }
+ else {
+ result.append(" ");
+ }
+ break;
+ case '\n':
+ result.append("</p>\n<p>");
+ break;
+ default:
+ result.append(myChar);
+ }
+ }
+ result.append("</p></body></html>");
+ return result.toString();
+ }
+
+ public static String removeAllTagsFromString(final String text) {
+ return HtmlUtils.TAGS_PATTERN.matcher(text).replaceAll("");
+ }
+
+ /**
+ * Removes all tags (<..>) from a string if it starts with "<html>..." to
+ * make it compareable.
+ */
+ public static String removeHtmlTagsFromString(final String text) {
+ if (HtmlUtils.isHtmlNode(text)) {
+ return HtmlUtils.removeAllTagsFromString(text);
+ }
+ else {
+ return text;
+ }
+ }
+
+ public static String toXMLEscapedText(final String text) {
+ final int len = text.length();
+ final StringBuilder result = new StringBuilder(len);
+ char myChar;
+ for (int i = 0; i < len; ++i) {
+ myChar = text.charAt(i);
+ switch (myChar) {
+ case '&':
+ result.append("&");
+ break;
+ case '<':
+ result.append("<");
+ break;
+ case '>':
+ result.append(">");
+ break;
+ case '"':
+ result.append(""");
+ break;
+ default:
+ result.append(myChar);
+ }
+ }
+ return result.toString();
+ }
+
+ public static String toXMLEscapedTextExpandingWhitespace(String text) {
+ text = text.replaceAll("\t", " ");
+ final int len = text.length();
+ final StringBuilder result = new StringBuilder(len);
+ char myChar;
+ for (int i = 0; i < len; ++i) {
+ myChar = text.charAt(i);
+ switch (myChar) {
+ case '&':
+ result.append("&");
+ break;
+ case '<':
+ result.append("<");
+ break;
+ case '>':
+ result.append(">");
+ break;
+ case '"':
+ result.append(""");
+ break;
+ case ' ':
+ if (i > 0 && i < len - 1 && text.charAt(i - 1) > 32 && text.charAt(i + 1) > 32) {
+ result.append(' ');
+ }
+ else {
+ result.append(" ");
+ }
+ break;
+ default:
+ result.append(myChar);
+ }
+ }
+ return result.toString();
+ }
+
+ public static String toXMLUnescapedText(final String text) {
+ return text.replaceAll("<", "<").replaceAll(">", ">").replaceAll(""", "\"").replaceAll("&", "&");
+ }
+
+ public static String unescapeHTMLUnicodeEntity(final String text) {
+ final StringBuilder resultBuilder = new StringBuilder(text.length());
+ final StringBuilder entity = new StringBuilder();
+ boolean readingEntity = false;
+ char myChar;
+ for (int i = 0; i < text.length(); ++i) {
+ myChar = text.charAt(i);
+ if (readingEntity) {
+ if (myChar == ';') {
+ if (entity.charAt(0) == '#') {
+ try {
+ final char c;
+ if (entity.charAt(1) == 'x') {
+ c = (char) Integer.parseInt(entity.substring(2), 16);
+ }
+ else {
+ c = (char) Integer.parseInt(entity.substring(1), 10);
+ }
+ if (c >= ' ' || c == '\t' || c == '\r' || c == '\n') {
+ resultBuilder.append(c);
+ }
+ else {
+ resultBuilder.append(' ');
+ }
+ }
+ catch (final NumberFormatException e) {
+ resultBuilder.append('&').append(entity).append(';');
+ }
+ }
+ else {
+ resultBuilder.append('&').append(entity).append(';');
+ }
+ entity.setLength(0);
+ readingEntity = false;
+ }
+ else {
+ entity.append(myChar);
+ }
+ }
+ else {
+ if (myChar == '&') {
+ readingEntity = true;
+ }
+ else {
+ resultBuilder.append(myChar);
+ }
+ }
+ }
+ if (entity.length() > 0) {
+ resultBuilder.append('&').append(entity);
+ }
+ final String result = resultBuilder.toString();
+ return result;
+ }
+
+ public static String unicodeToHTMLUnicodeEntity(final String text) {
+ /*
+ * Heuristic reserve for expansion : factor 1.2
+ */
+ StringBuilder result = null;
+ int intValue;
+ char myChar;
+ for (int i = 0; i < text.length(); ++i) {
+ myChar = text.charAt(i);
+ intValue = text.charAt(i);
+ if (intValue < 32 || intValue > 126) {
+ if(result == null){
+ result = new StringBuilder((int) (text.length() * 1.2));
+ result.append(text.subSequence(0, i));
+ }
+ result.append("&#x").append(Integer.toString(intValue, 16)).append(';');
+ }
+ else if(result != null){
+ result.append(myChar);
+ }
+ }
+ if(result != null)
+ return result.toString();
+ return text;
+ }
+
+ /**
+ *
+ */
+ private HtmlUtils() {
+ super();
+ }
+
+ /**
+ * @return the maximal index i such that pI is mapped to i by removing all
+ * tags from the original input.
+ */
+ public static int getMaximalOriginalPosition(final int pI, final ArrayList<IndexPair> pListOfIndices) {
+ for (int i = pListOfIndices.size() - 1; i >= 0; --i) {
+ final IndexPair pair = pListOfIndices.get(i);
+ if (pI >= pair.pureTextStart) {
+ if (!pair.mIsTag) {
+ return pair.originalStart + pI - pair.pureTextStart;
+ }
+ else {
+ return pair.originalEnd;
+ }
+ }
+ }
+ throw new IllegalArgumentException("Position " + pI + " not found.");
+ }
+
+ public static int getMinimalOriginalPosition(final int pI, final ArrayList<IndexPair> pListOfIndices) {
+ for (final IndexPair pair : pListOfIndices) {
+ if (pI >= pair.pureTextStart && pI <= pair.pureTextEnd) {
+ return pair.originalStart + pI - pair.pureTextStart;
+ }
+ }
+ throw new IllegalArgumentException("Position " + pI + " not found.");
+ }
+
+ /**
+ * Replaces text in node content without replacing tags. fc, 19.12.06: This
+ * method is very difficult. If you have a simplier method, please supply
+ * it. But look that it complies with FindTextTests!!!
+ */
+ public static String getReplaceResult(final Pattern pattern, final String text, final String replacement) {
+ return new HtmlReplacer().getReplaceResult(pattern, replacement, text);
+ }
+ static class HtmlReplacer{
+ private ArrayList<IndexPair> splittedStringList;
+ private String stringWithoutTags;
+
+ public String getReplaceResult(final Pattern pattern, final String replacement, final String text) {
+ final String unescapedText = unescapeHTMLUnicodeEntity(text);
+ initialize(unescapedText);
+ final Matcher matcher = pattern.matcher(stringWithoutTags);
+ if (! matcher.find()) {
+ return unescapedText;
+ }
+ final StringBuilder sbResult = new StringBuilder();
+ int pureTextPosition = 0;
+ final Iterator<IndexPair> indexPairs = splittedStringList.iterator();
+ IndexPair pair = null;
+ for(;;){
+ final int mStart = matcher.start();
+ final int mEnd = matcher.end();
+
+ if(pair == null){
+ for(pair = indexPairs.next();pair.pureTextEnd <= mStart;pair = indexPairs.next()){
+ if(pair.mIsTag || pureTextPosition <= pair.pureTextStart){
+ sbResult.append(unescapedText, pair.originalStart, pair.originalEnd);
+ }
+ else if(pureTextPosition <= pair.pureTextEnd){
+ sbResult.append(unescapedText, pair.originalStart + pureTextPosition - pair.pureTextStart, pair.originalEnd);
+ }
+ }
+ if(pureTextPosition < pair.pureTextStart){
+ pureTextPosition = pair.pureTextStart;
+ }
+ }
+
+ sbResult.append(unescapedText,
+ pair.originalStart + pureTextPosition - pair.pureTextStart,
+ pair.originalStart + mStart - pair.pureTextStart);
+ appendReplacement(sbResult, matcher, replacement);
+ pureTextPosition = mEnd;
+
+ if(matcher.find()){
+ if(matcher.start() >= pair.pureTextEnd){
+ if(mEnd < pair.pureTextEnd){
+ sbResult.append(unescapedText, pair.originalStart + pureTextPosition - pair.pureTextStart, pair.originalEnd);
+ pureTextPosition = pair.pureTextEnd;
+ }
+ pair = null;
+ }
+ continue;
+ }
+ for(;;){
+ if(pureTextPosition <= pair.pureTextEnd){
+ sbResult.append(unescapedText, pair.originalStart + pureTextPosition - pair.pureTextStart, unescapedText.length());
+ return sbResult.toString();
+ }
+ if(pair.mIsTag){
+ sbResult.append(unescapedText, pair.originalStart, pair.originalEnd);
+ }
+ pair = indexPairs.next();
+ }
+ }
+
+ }
+
+ private void initialize(final String text) {
+ splittedStringList = new ArrayList<IndexPair>();
+ stringWithoutTags = null;
+ {
+ final StringBuffer sb = new StringBuffer();
+ final Matcher matcher = FIND_TAGS_PATTERN.matcher(text);
+ int lastMatchEnd = 0;
+ while (matcher.find()) {
+ final String textWithoutTag = matcher.group(1);
+ int replStart = sb.length();
+ matcher.appendReplacement(sb, "$1");
+ IndexPair indexPair;
+ if (textWithoutTag.length() > 0) {
+ indexPair = new IndexPair(lastMatchEnd, matcher.end(1), replStart, sb.length(), false);
+ lastMatchEnd = matcher.end(1);
+ splittedStringList.add(indexPair);
+ }
+ replStart = sb.length();
+ indexPair = new IndexPair(lastMatchEnd, matcher.end(2), sb.length(), sb.length(), true);
+ lastMatchEnd = matcher.end(2);
+ splittedStringList.add(indexPair);
+ }
+ final int replStart = sb.length();
+ matcher.appendTail(sb);
+ if (sb.length() != replStart) {
+ final IndexPair indexPair = new IndexPair(lastMatchEnd, text.length(), replStart, sb.length(), false);
+ splittedStringList.add(indexPair);
+ }
+ stringWithoutTags = sb.toString();
+ }
+ }
+
+ private void appendReplacement(final StringBuilder sbResult, final Matcher matcher, final String replacement) {
+ int cursor = 0;
+ while (cursor < replacement.length()) {
+ char nextChar = replacement.charAt(cursor);
+ if (nextChar == '\\') {
+ cursor++;
+ nextChar = replacement.charAt(cursor);
+ sbResult.append(nextChar);
+ cursor++;
+ }
+ else if (nextChar == '$') {
+ // Skip past $
+ cursor++;
+ // The first number is always a group
+ int refNum = (int) replacement.charAt(cursor) - '0';
+ if ((refNum < 0) || (refNum > 9))
+ throw new IllegalArgumentException("Illegal group reference");
+ cursor++;
+ // Capture the largest legal group string
+ boolean done = false;
+ while (!done) {
+ if (cursor >= replacement.length()) {
+ break;
+ }
+ int nextDigit = replacement.charAt(cursor) - '0';
+ if ((nextDigit < 0) || (nextDigit > 9)) { // not a number
+ break;
+ }
+ int newRefNum = (refNum * 10) + nextDigit;
+ if (matcher.groupCount() < newRefNum) {
+ done = true;
+ }
+ else {
+ refNum = newRefNum;
+ cursor++;
+ }
+ }
+ // Append group
+ if (matcher.group(refNum) != null)
+ sbResult.append(matcher.group(refNum));
+ }
+ else {
+ sbResult.append(nextChar);
+ cursor++;
+ }
+ }
+ }
+ }
+
+ /**
+ * @return true, if well formed XML.
+ */
+ public static boolean isWellformedXml(final String xml) {
+ try {
+ final SAXParserFactory factory = SAXParserFactory.newInstance();
+ factory.setValidating(false);
+ factory.newSAXParser().parse(new InputSource(new StringReader(xml)), new DefaultHandler());
+ return true;
+ }
+ catch (final SAXParseException e) {
+ LogUtils.warn("XmlParseError on line " + e.getLineNumber() + " of " + xml, e);
+ }
+ catch (final Exception e) {
+ LogUtils.severe("XmlParseError", e);
+ }
+ return false;
+ }
+
+ public static String toHtml(final String xhtmlText) {
+ return HtmlUtils.SLASHED_TAGS_PATTERN.matcher(xhtmlText).replaceAll("<$1>");
+ }
+
+ public static String toXhtml(String htmlText) {
+ if (!HtmlUtils.isHtmlNode(htmlText)) {
+ return null;
+ }
+ final StringReader reader = new StringReader(htmlText);
+ final StringWriter writer = new StringWriter();
+ try {
+ XHTMLWriter.html2xhtml(reader, writer);
+ final String resultXml = writer.toString();
+ if (!HtmlUtils.isWellformedXml(resultXml)) {
+ return HtmlUtils.toXMLEscapedText(htmlText);
+ }
+ return resultXml;
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ catch (final BadLocationException e) {
+ LogUtils.severe(e);
+ }
+ htmlText = htmlText.replaceAll("<", ">");
+ htmlText = htmlText.replaceAll(">", "<");
+ return htmlText;
+ }
+
+ public static int endOfText(final String html) {
+ int bodyEndPos = html.lastIndexOf("</body>");
+ if (bodyEndPos == -1) {
+ bodyEndPos = html.lastIndexOf("</BODY>");
+ }
+ if (bodyEndPos == -1) {
+ bodyEndPos = html.lastIndexOf("</html>");
+ }
+ if (bodyEndPos == -1) {
+ bodyEndPos = html.lastIndexOf("</HTML>");
+ }
+ if (bodyEndPos == -1) {
+ bodyEndPos = html.length();
+ }
+ return bodyEndPos;
+ }
+
+ static public String combineTextWithExceptionInfo(final String text, final Exception ex) {
+ final String escaped = HtmlUtils.toXMLEscapedText(text).replaceAll("\n", "<br>\n");
+ final StringBuilder sb = new StringBuilder();
+ sb.append("<html><body>");
+ sb.append(ex.getClass().getSimpleName());
+ sb.append("<br>\n");
+ sb.append(ex.getMessage());
+ sb.append("<br>\n");
+ sb.append(escaped);
+ final String string = sb.toString();
+ return string;
+ }
+
+ public static String element(final String name, final String content) {
+ return HtmlUtils.element(name, null, content);
+ }
+
+ public static String element(final String name, final Map<String, String> attributes, final String content) {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("<").append(name).append(HtmlUtils.toAttributeString(attributes)).append(">");
+ if (content != null && content.length() > 0) {
+ builder.append(content);
+ }
+ return builder.append("</").append(name).append(">").toString();
+ }
+
+ private static String toAttributeString(final Map<String, String> attributes) {
+ if (attributes == null || attributes.isEmpty()) {
+ return "";
+ }
+ final StringBuilder builder = new StringBuilder();
+ for (final Map.Entry<String, String> entry : attributes.entrySet()) {
+ if (builder.length() > 0) {
+ builder.append(' ');
+ }
+ builder.append(entry.getKey());
+ builder.append("=\"");
+ builder.append(entry.getKey());
+ builder.append('"');
+ }
+ return builder.toString();
+ }
+
+ public static String extractRawBody(final String text) {
+ int start = text.indexOf("<body>");
+ final int textBegin;
+ if (start != -1)
+ textBegin = start + "<body>".length();
+ else{
+ start = text.indexOf("</head>");
+ if (start != -1){
+ textBegin = start+ "</head>".length();
+ }
+ else {
+ start = text.indexOf("<html>");
+ textBegin = start+ "<html>".length();
+ }
+ }
+ int end = text.indexOf("</body>", textBegin);
+ if (end == -1){
+ end = text.indexOf("</html>", textBegin);
+ if (end == -1){
+ end = text.length();
+ }
+ }
+ return text.substring(textBegin, end).trim();
+ }
+
+ /** Gets the string URL of an existing link, or null if none. */
+ public static String getURLOfExistingLink(HTMLDocument doc, int pos) {
+ //setIgnoreActions(true);
+ final Element linkElement = HtmlUtils.getCurrentLinkElement(doc, pos);
+ final boolean foundLink = (linkElement != null);
+ if (!foundLink) {
+ return null;
+ }
+ final AttributeSet elemAttrs = linkElement.getAttributes();
+ final Object linkAttr = elemAttrs.getAttribute(HTML.Tag.A);
+ final Object href = ((AttributeSet) linkAttr).getAttribute(HTML.Attribute.HREF);
+ return href != null ? href.toString() : null;
+ }
+
+ public static Element getCurrentLinkElement(HTMLDocument doc, int pos) {
+ Element element2 = null;
+ Element element = doc.getCharacterElement(pos);
+ Object linkAttribute = null; //elem.getAttributes().getAttribute(HTML.Tag.A);
+ Object href = null;
+ while (element != null && linkAttribute == null) {
+ element2 = element;
+ linkAttribute = element.getAttributes().getAttribute(HTML.Tag.A);
+ if (linkAttribute != null) {
+ href = ((AttributeSet) linkAttribute).getAttribute(HTML.Attribute.HREF);
+ }
+ element = element.getParentElement();
+ }
+ if (linkAttribute != null && href != null) {
+ return element2;
+ }
+ else {
+ return null;
+ }
+ }
+
+ public static boolean isEmpty(String newText) {
+ return ! (newText.contains("<img") || newText.contains("<table"))
+ && htmlToPlain(newText).equals("");
+ }
+
+ public static String toHTMLEscapedText(String s) {
+ return toXMLEscapedText(s).replaceAll("\n", "<br>\n");
+ }
+
+ private static Pattern htmlBodyPattern = Pattern.compile("^\\s*(?:<html>|<body>)+\\s*(.*?)"
+ + "\\s*(?:</body>|</html>)+\\s*$", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
+
+ /**
+ * Join arbitrary texts to html. Plain text arguments will be transformed via
+ * {@link #plainToHTML(String)}, i.e. newlines and other special characters will
+ * be translated to their HTML counterpart and wrapped in a paragraph (<p></p>).
+ * <pre>{@code
+ * // plain + html -> <html><body><p>text1</p>text2</body></html>
+ * HtmlUtils.join("text1", "", "<html><body>text2</body></html>");
+ * // insert an empty paragraph (<p></p>) between two strings:
+ * HtmlUtils.join("text1", "", "text2");
+ * // this will insert two paragraphs:
+ * HtmlUtils.join("text1", "\n", "text2");
+ * }</pre>
+ * @param texts either html (starting with <HTML> or <html>) or plain text.
+ * @return html
+ */
+ public static String join(String... texts) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("<html><body>");
+ for (int i = 0; i < texts.length; i++) {
+ String string = texts[i];
+ if (i > 0)
+ builder.append('\n');
+ if (!isHtmlNode(string))
+ string = plainToHTML(string);
+ builder.append(htmlBodyPattern.matcher(string).replaceFirst("$1"));
+ }
+ builder.append("</body></html>");
+ return builder.toString();
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/LogUtils.java b/freeplane/src/main/java/org/freeplane/core/util/LogUtils.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/LogUtils.java
rename to freeplane/src/main/java/org/freeplane/core/util/LogUtils.java
diff --git a/freeplane/src/org/freeplane/core/util/LoggingOutputStream.java b/freeplane/src/main/java/org/freeplane/core/util/LoggingOutputStream.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/LoggingOutputStream.java
rename to freeplane/src/main/java/org/freeplane/core/util/LoggingOutputStream.java
diff --git a/freeplane/src/main/java/org/freeplane/core/util/MenuUtils.java b/freeplane/src/main/java/org/freeplane/core/util/MenuUtils.java
new file mode 100644
index 0000000..3f48216
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/MenuUtils.java
@@ -0,0 +1,324 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 Volker Boerchers
+ *
+ * This file's author is Volker Boerchers
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.util;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.util.Enumeration;
+import java.util.List;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ActionAcceleratorManager;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.IndexedTree.Node;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.FreeplaneResourceAccessor;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+
+/** Utilities for dealing with the Freeplane menu: In scripts available as "global variable" menuUtils. */
+public class MenuUtils {
+ /** The userObject type for createMenuEntryTree(). */
+ public static class MenuEntry {
+ private final String key;
+ private final String label;
+ private final String iconKey;
+ private final KeyStroke keyStroke;
+ private final String toolTipText;
+
+ public MenuEntry(final String key, final String label, final String iconKey, final KeyStroke keyStroke,
+ final String toolTipText) {
+ this.key = key;
+ this.label = label;
+ this.iconKey = iconKey;
+ this.keyStroke = keyStroke;
+ this.toolTipText = toolTipText;
+ }
+
+ public MenuEntry(String key, String label) {
+ this(key, label, null, null, null);
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getIconKey() {
+ return iconKey;
+ }
+
+ public KeyStroke getKeyStroke() {
+ return keyStroke;
+ }
+
+ public String getToolTipText() {
+ return toolTipText;
+ }
+
+ public MindIcon createMindIcon() {
+ String resource = ResourceController.getResourceController().getProperty(iconKey, null);
+ if (resource == null) {
+ // this is the regular case: most MenuEntries (i.e. actions) will have the iconKey set
+ // but only for a few of these Icons are available
+ return null;
+ }
+ return new MindIcon(resource.replaceAll("/images/(.*).png", "../$1"));
+ }
+
+ @Override
+ public String toString() {
+ return label;
+ }
+ }
+
+ public static class MenuEntryTreeBuilder {
+ private final ActionAcceleratorManager acceleratorManager;
+
+ private MenuEntryTreeBuilder() {
+ acceleratorManager = userInputFactory().getAcceleratorManager();
+ }
+
+ private DefaultMutableTreeNode build(final String menuRootKey) {
+ Entry entry = genericMenuStructure().findEntry(menuRootKey);
+ if (entry == null)
+ throw new IllegalArgumentException("not found: menuRootKey=" + menuRootKey);
+ final DefaultMutableTreeNode treeRoot = new DefaultMutableTreeNode(menuNode2menuEntryNode(entry));
+ addChildrenRecursively(treeRoot, entry.children());
+ return treeRoot;
+ }
+
+ private void addChildrenRecursively(final DefaultMutableTreeNode treeNode, final Iterable<Entry> menuElements) {
+ for (Entry childMenu : menuElements) {
+ final DefaultMutableTreeNode treeChild = menuNode2menuEntryNode(childMenu);
+ // the tree of Entrys contains pseudo elements like builder nodes that have to be skipped
+ if (treeChild != null) {
+ addChildrenRecursively(treeChild, childMenu.children());
+ if (entryIsActionOrIsSubmenu(childMenu, treeChild))
+ treeNode.add(treeChild);
+ }
+ else {
+ addChildrenRecursively(treeNode, childMenu.children());
+ }
+ }
+ }
+
+ private boolean entryIsActionOrIsSubmenu(Entry childMenu, final DefaultMutableTreeNode treeChild) {
+ return !treeChild.isLeaf() || childMenu.isLeaf();
+ }
+
+ private DefaultMutableTreeNode menuNode2menuEntryNode(Entry menuItem) {
+ final EntryAccessor entryAccessor = new EntryAccessor(new FreeplaneResourceAccessor());
+ final AFreeplaneAction action = entryAccessor.getAction(menuItem);
+ final String name = menuItem.getName();
+ if (menuItem.hasChildren() && StringUtils.isNotEmpty(name)) {
+ // the tree of Entrys contains pseudo elements like builder nodes that have to be skipped
+ String text = TextUtils.removeMnemonic(entryAccessor.getText(menuItem));
+ final DefaultMutableTreeNode node = new DefaultMutableTreeNode(new MenuEntry(name, text));
+ if (action != null) {
+ final MenuEntry menuEntry = menuEntry(action);
+ node.add(new DefaultMutableTreeNode(menuEntry));
+ }
+ return node;
+ }
+ else if (action != null) {
+ final MenuEntry menuEntry = menuEntry(action);
+ return new DefaultMutableTreeNode(menuEntry);
+ }
+ else {
+ return null;
+ }
+ }
+
+ private MenuEntry menuEntry(final AFreeplaneAction action) {
+ String text = ActionUtils.getActionTitle(action);
+ String iconKey = action.getIconKey();
+ String tooltip = (String) action.getValue(Action.LONG_DESCRIPTION);
+ KeyStroke accelerator = acceleratorManager.getAccelerator(action);
+ final MenuEntry menuEntry = new MenuEntry(action.getKey(), text, iconKey, accelerator, tooltip);
+ return menuEntry;
+ }
+ }
+
+ /**
+ * returns a tree of all <code>JMenuItem</code> nodes the menu contains (omitting Strings and Separators).
+ * The tree is build from <code>DefaultMutableTreeNode</code> nodes having <code>MenuEntry</code> objects as
+ * their userObjects.
+ *
+ * Note that the root node may have null as userObject if the menu item at <code>menuRootKey</code> doesn't
+ * contain a <code>JMenuItem</code>!
+ *
+ * @param menuRootKey the key of the node that should form the root of the output.
+ * @throws IllegalArgumentException if the menuRootKey does not point to an entry in the menu tree
+ */
+ public static DefaultMutableTreeNode createMenuEntryTree(final String menuRootKey) {
+ return new MenuEntryTreeBuilder().build(menuRootKey);
+ }
+
+ /** Used as the basis for dynamic generation of hotkey list.
+ * Same as {@link #createMenuEntryTree(String)} but all MenuEntries without associated accelerator
+ * and (then) empty submenus are removed from the result.
+ * @throws IllegalArgumentException if the menuRootKey does not point to an entry in the menu tree
+ */
+ public static DefaultMutableTreeNode createAcceleratebleMenuEntryTree(final String menuRootKey) {
+ final DefaultMutableTreeNode menuEntryTreeNode = MenuUtils.createMenuEntryTree(menuRootKey);
+ final DefaultMutableTreeNode result = new DefaultMutableTreeNode(menuEntryTreeNode.getUserObject());
+ addAcceleratableChildrenRecursively(result, menuEntryTreeNode.children());
+ return result;
+ }
+
+ /** Could be (but currently isn't) used to generate a mindmap representation of the menu.
+ * @param children Enumeration of DefaultMutableTreeNode from the menu tree. */
+ @SuppressWarnings("rawtypes")
+ public static void insertAsNodeModelRecursively(final NodeModel nodeModel, final Enumeration children,
+ final MapController mapController) {
+ while (children.hasMoreElements()) {
+ final DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
+ final NodeModel newNodeModel = insertAsNodeModel(nodeModel, child, mapController);
+ if (!child.isLeaf()) {
+ insertAsNodeModelRecursively(newNodeModel, child.children(), mapController);
+ }
+ }
+ }
+
+ private static NodeModel insertAsNodeModel(final NodeModel nodeModel, final DefaultMutableTreeNode treeNode,
+ final MapController mapController) {
+ final MenuEntry menuEntry = (MenuEntry) treeNode.getUserObject();
+ final String text = menuEntry.getKeyStroke() == null ? menuEntry.getLabel() : menuEntry.getLabel() + ": "
+ + MenuUtils.formatKeyStroke(menuEntry.getKeyStroke());
+ final NodeModel newNodeModel = mapController.newNode(text, nodeModel.getMap());
+ if (!treeNode.isLeaf()) {
+ newNodeModel.setFolded(true);
+ }
+ if (menuEntry.getIconKey() != null) {
+ final MindIcon mindIcon = menuEntry.createMindIcon();
+ if (mindIcon != null)
+ newNodeModel.addIcon(mindIcon);
+ }
+ nodeModel.insert(newNodeModel);
+ return newNodeModel;
+ }
+
+ // filters out non-acceleratable menu entries
+ @SuppressWarnings("rawtypes")
+ private static void addAcceleratableChildrenRecursively(final DefaultMutableTreeNode target,
+ final Enumeration sourceChildren) {
+ while (sourceChildren.hasMoreElements()) {
+ final DefaultMutableTreeNode sourceChild = (DefaultMutableTreeNode) sourceChildren.nextElement();
+ final MenuEntry menuEntry = (MenuEntry) sourceChild.getUserObject();
+ if (sourceChild.isLeaf()) {
+ if (menuEntry.getKeyStroke() != null) {
+ target.add(new DefaultMutableTreeNode(menuEntry));
+ }
+ }
+ else {
+ final DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(menuEntry);
+ target.add(newNode);
+ addAcceleratableChildrenRecursively(newNode, sourceChild.children());
+ if (newNode.isLeaf()) {
+ target.remove(newNode);
+ }
+ }
+ }
+ }
+
+ /** pretty print a keystroke. */
+ public static String formatKeyStroke(final KeyStroke keyStroke) {
+ final String keyModifiersText = KeyEvent.getKeyModifiersText(keyStroke.getModifiers());
+ final String keyText = KeyEvent.getKeyText(keyStroke.getKeyCode());
+ return keyModifiersText.length() == 0 ? keyText : keyModifiersText + "+" + keyText;
+ }
+
+ /** there are little reasons to use this in scripts. */
+ public static Node findAssignedMenuItemNodeRecursively(final DefaultMutableTreeNode menubarNode,
+ final KeyStroke keystroke) {
+ final Enumeration<?> children = menubarNode.children();
+ while (children.hasMoreElements()) {
+ final Node child = (Node) children.nextElement();
+ final Object childUserObject = child.getUserObject();
+ if (childUserObject instanceof JMenuItem) {
+ final JMenuItem childMenuItem = (JMenuItem) childUserObject;
+ if (keystroke.equals(childMenuItem.getAccelerator())) {
+ return child;
+ }
+ }
+ // recurse
+ final Node assignedMenuItemNode = findAssignedMenuItemNodeRecursively(child, keystroke);
+ if (assignedMenuItemNode != null)
+ return assignedMenuItemNode;
+ }
+ return null;
+ }
+ /**
+ * to be used from scripts to execute menu items. Find out the menuItemKey
+ * of a menu item with the devtools add-on. It contains a tool for that.
+ */
+ public static void executeMenuItems(final List<String> menuItemKeys) {
+ LogUtils.info("menu items to execute: " + menuItemKeys);
+ final Entry genericMenuStructure = genericMenuStructure();
+ final EntryAccessor entryAccessor = new EntryAccessor(new FreeplaneResourceAccessor());
+ for (String menuItemKey : menuItemKeys) {
+ Entry menuItem = genericMenuStructure.findEntry(menuItemKey);
+ final AFreeplaneAction action = menuItem != null ? entryAccessor.getAction(menuItem) : null;
+ if (action == null) {
+ UITools.errorMessage(TextUtils.format("MenuUtils.invalid_menuitem", menuItemKey));
+ return;
+ }
+ LogUtils.info("executing " + ActionUtils.getActionTitle(action) + "(" + menuItemKey + ")");
+ ActionEvent e = new ActionEvent(menuItem, 0, null);
+ action.actionPerformed(e);
+ }
+ }
+
+ /** returns the icon for a menuItemKey or null if it has none. */
+ public static Icon getMenuItemIcon(String menuItemKey) {
+ Entry menuItem = genericMenuStructure().findEntry(menuItemKey);
+ if (menuItem == null)
+ return null;
+ final EntryAccessor entryAccessor = new EntryAccessor(new FreeplaneResourceAccessor());
+ final AFreeplaneAction action = entryAccessor.getAction(menuItem);
+ return (Icon) action.getValue(Action.SMALL_ICON);
+ }
+
+ private static IUserInputListenerFactory userInputFactory() {
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ return modeController.getUserInputListenerFactory();
+ }
+
+ private static Entry genericMenuStructure() {
+ return userInputFactory().getGenericMenuStructure();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/ObjectRule.java b/freeplane/src/main/java/org/freeplane/core/util/ObjectRule.java
new file mode 100644
index 0000000..d60b93d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/ObjectRule.java
@@ -0,0 +1,9 @@
+package org.freeplane.core.util;
+
+public interface ObjectRule<T, R extends Enum<?>> {
+ T getValue();
+ boolean hasValue();
+ void resetCache();
+ R getRule();
+ void setCache(T value);
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/Pair.java b/freeplane/src/main/java/org/freeplane/core/util/Pair.java
new file mode 100644
index 0000000..e8ecf2c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/Pair.java
@@ -0,0 +1,52 @@
+package org.freeplane.core.util;
+
+
+public class Pair<U, V> {
+ final public U first;
+ final public V second;
+
+ public Pair(U u, V v) {
+ super();
+ this.first = u;
+ this.second = v;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((first == null) ? 0 : first.hashCode());
+ result = prime * result + ((second == null) ? 0 : second.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ Pair<?, ?> other = (Pair<?, ?>) obj;
+ if (first == null) {
+ if (other.first != null)
+ return false;
+ }
+ else if (!first.equals(other.first))
+ return false;
+ if (second == null) {
+ if (other.second != null)
+ return false;
+ }
+ else if (!second.equals(other.second))
+ return false;
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return "Pair [first=" + first + ", second=" + second + "]";
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/Quantity.java b/freeplane/src/main/java/org/freeplane/core/util/Quantity.java
new file mode 100644
index 0000000..a9165b5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/Quantity.java
@@ -0,0 +1,90 @@
+package org.freeplane.core.util;
+
+public class Quantity <U extends Enum<U> & Convertible >{
+
+ public static <U extends Enum<U> & Convertible> Quantity<U> fromString(String valueString, U defaultUnit) {
+ if(valueString == null)
+ return null;
+ final int separatorPosition = valueString.lastIndexOf(' ');
+ final String numberString;
+ final U unit;
+ if(separatorPosition >= 0){
+ numberString = valueString.substring(0, separatorPosition);
+ String unitString = valueString.substring(separatorPosition + 1);
+ final Class<U> unitClass = (Class<U>)defaultUnit.getDeclaringClass();
+ unit = Enum.valueOf(unitClass, unitString);
+ }
+ else {
+ numberString = valueString;
+ unit = defaultUnit;
+ }
+ double doubleValue = Double.parseDouble(numberString);
+ return new Quantity<U>(doubleValue, unit);
+ }
+
+ final public double value;
+ final public U unit;
+
+ public Quantity(double value, U unit) {
+ this.value = value;
+ this.unit = unit;
+ }
+
+ public double toBaseUnits() {
+ return value * unit.factor();
+ }
+
+ public int toBaseUnitsRounded() {
+ return (int) (toBaseUnits() + 0.5d);
+ }
+
+ @Override
+ public String toString() {
+ return value + " " + unit;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + unit.hashCode();
+ long temp;
+ temp = Double.doubleToLongBits(value);
+ result = prime * result + (int) (temp ^ (temp >>> 32));
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ @SuppressWarnings("rawtypes")
+ Quantity other = (Quantity) obj;
+ if (!unit.equals(other.unit))
+ return false;
+ if (Double.doubleToLongBits(value) != Double.doubleToLongBits(other.value))
+ return false;
+ return true;
+ }
+
+ public Quantity<U> in(U unit) {
+ return new Quantity<U>(value * (this.unit.factor() / unit.factor()), unit);
+ }
+
+ public Quantity<U> add(Quantity<U> second) {
+ if(unit == second.unit)
+ return new Quantity<U>(value + second.value, unit);
+ else {
+ final double sum = value + second.in(unit).value;
+ return new Quantity<U>(sum, unit);
+ }
+ }
+
+ public Quantity<U> add(double value, U unit) {
+ return add(new Quantity<U>(value, unit));
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/RuleReference.java b/freeplane/src/main/java/org/freeplane/core/util/RuleReference.java
new file mode 100644
index 0000000..e5d4af4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/RuleReference.java
@@ -0,0 +1,37 @@
+package org.freeplane.core.util;
+
+
+public class RuleReference<T, R extends Enum<?>> implements ObjectRule<T, R> {
+ final private R rule;
+ private T value;
+
+ public RuleReference(R rule) {
+ this.rule = rule;
+ }
+
+ @Override
+ public T getValue() {
+ return value;
+ }
+
+ @Override
+ public boolean hasValue() {
+ return value != null;
+ }
+
+ @Override
+ public void resetCache() {
+ value = null;
+ }
+
+ @Override
+ public R getRule() {
+ return rule;
+ }
+
+ @Override
+ public void setCache(T value) {
+ this.value = value;
+
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/SerializationMethod.java b/freeplane/src/main/java/org/freeplane/core/util/SerializationMethod.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/SerializationMethod.java
rename to freeplane/src/main/java/org/freeplane/core/util/SerializationMethod.java
diff --git a/freeplane/src/org/freeplane/core/util/StdFormatter.java b/freeplane/src/main/java/org/freeplane/core/util/StdFormatter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/StdFormatter.java
rename to freeplane/src/main/java/org/freeplane/core/util/StdFormatter.java
diff --git a/freeplane/src/org/freeplane/core/util/SysUtils.java b/freeplane/src/main/java/org/freeplane/core/util/SysUtils.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/SysUtils.java
rename to freeplane/src/main/java/org/freeplane/core/util/SysUtils.java
diff --git a/freeplane/src/main/java/org/freeplane/core/util/TextUtils.java b/freeplane/src/main/java/org/freeplane/core/util/TextUtils.java
new file mode 100644
index 0000000..d7f3034
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/TextUtils.java
@@ -0,0 +1,175 @@
+package org.freeplane.core.util;
+
+import java.text.DecimalFormat;
+import java.text.MessageFormat;
+import java.text.SimpleDateFormat;
+import java.util.regex.Pattern;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.resources.ResourceBundles;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.format.FormatController;
+
+/** utilities for translations, conversions to/from number and dates etc.
+ * In scripts available as "global variable" <code>textUtils</code>. */
+public class TextUtils {
+ // from http://lists.xml.org/archives/xml-dev/200108/msg00891.html
+ // but make scheme mandatory
+ private static final String URI_REGEXP = "([a-zA-Z][0-9a-zA-Z+\\-\\.]+:" //
+ + "/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?";
+ private static Pattern uriPattern = Pattern.compile(URI_REGEXP);
+
+ public static String format(final String resourceKey, final Object... messageArguments) {
+ final String text = TextUtils.getText(resourceKey);
+ if (text == null)
+ return null;
+ MessageFormat formatter;
+ try {
+ formatter = new MessageFormat(text);
+ }
+ catch (IllegalArgumentException e) {
+ LogUtils.severe("wrong format " + text + " for property " + resourceKey, e);
+ return text;
+ }
+ final Object[] processedArguments;
+ if(text.startsWith("<html>")){
+ processedArguments = new String[messageArguments.length];
+ int i = 0;
+ for(Object s : messageArguments){
+ processedArguments[i++] = HtmlUtils.toHTMLEscapedText(s.toString());
+ }
+ }
+ else{
+ processedArguments = messageArguments;
+ }
+ return formatter.format(processedArguments);
+ }
+
+ public static String getOptionalText(final String string) {
+ return string == null ? null : TextUtils.getRawText(string);
+ }
+
+ public static String removeMnemonic(final String rawLabel) {
+ final int pos = rawLabel.indexOf('&');
+ if(pos == -1)
+ return rawLabel;
+ final int length = rawLabel.length();
+ StringBuilder sb = new StringBuilder(length);
+ sb.append(rawLabel.subSequence(0, pos));
+ sb.append(rawLabel.subSequence(pos + 1, length));
+ return sb.toString();
+
+ }
+
+ /** Removes the "TranslateMe" sign from the end of not translated texts. */
+ public static String removeTranslateComment(String inputString) {
+ if (inputString != null && inputString.endsWith(ResourceBundles.POSTFIX_TRANSLATE_ME)) {
+ inputString = inputString
+ .substring(0, inputString.length() - ResourceBundles.POSTFIX_TRANSLATE_ME.length());
+ }
+ return inputString;
+ }
+
+ public static TranslatedObject createTranslatedString(final String key) {
+ final String fs = TextUtils.getText(key);
+ return new TranslatedObject(key, fs);
+ }
+
+ public static String getText(final String key) {
+ final String text = getRawText(key);
+ if(text == null)
+ return text;
+ return removeMnemonic(text);
+ }
+
+ public static String getRawText(final String key) {
+ if (key == null) {
+ return null;
+ }
+ return ((ResourceBundles) ResourceController.getResourceController().getResources()).getResourceString(key);
+ }
+
+ public static String getText(final String key, final String defaultString) {
+ final String text = getRawText(key, defaultString);
+ if(text == null)
+ return text;
+ return removeMnemonic(text);
+ }
+ public static String getRawText(final String key, final String defaultString) {
+ if (key == null) {
+ return defaultString;
+ }
+ return ((ResourceBundles) ResourceController.getResourceController().getResources()).getResourceString(key,
+ defaultString);
+ }
+
+ public static String getOptionalTranslation(String text) {
+ if(text.startsWith("%")){
+ return getText(text.substring(1));
+ }
+ return text;
+ }
+
+ public static Number toNumber(final String text) throws NumberFormatException {
+ try {
+ return text == null ? null : Long.decode(text);
+ }
+ catch (NumberFormatException e) {
+ // stupid FloatingDecimal.readJavaFormatString() trims the input string -> care for leading whitespace
+ if (text.length() == 0 || Character.isWhitespace(text.charAt(0))) {
+ throw new NumberFormatException("number '" + text + "' empty or starts with space");
+ }
+ return Double.valueOf(text);
+ }
+ }
+
+ public static boolean isNumber(String text) {
+ if (isEmpty(text))
+ return false;
+ final char first = text.charAt(0);
+ if (Character.isLetter(first) || Character.isSpaceChar(first))
+ return false;
+ try {
+ Double.parseDouble(text);
+ return true;
+ }
+ catch (NumberFormatException e) {
+ return false;
+ }
+ }
+
+ public static boolean isEmpty(final String str) {
+ return str == null || str.length() == 0;
+ }
+
+ /** in opposite to the URI make scheme mandatory. */
+ public static boolean matchUriPattern(String text) {
+ return text.length() > 0 && uriPattern.matcher(text).matches();
+ }
+
+ /** accessor for scripts. */
+ public DecimalFormat getDefaultNumberFormat() {
+ return FormatController.getController().getDefaultNumberFormat();
+ }
+
+ /** accessor for scripts. */
+ public SimpleDateFormat getDefaultDateFormat() {
+ return FormatController.getController().getDefaultDateFormat();
+ }
+
+ /** accessor for scripts. */
+ public SimpleDateFormat getDefaultDateTimeFormat() {
+ return FormatController.getController().getDefaultDateTimeFormat();
+ }
+
+ /** Shortcut for scripting: Copies <code>string</code> to the system clipboard. */
+ public static void copyToClipboard(String string) {
+ ClipboardController.getController().setClipboardContents(string);
+ }
+
+ /** Shortcut for scripting: Copies <code>html</code> with mimetype text/html to the system clipboard. */
+ public static void copyHtmlToClipboard(String html) {
+ ClipboardController.getController().setClipboardContentsToHtml(html);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/TypeReference.java b/freeplane/src/main/java/org/freeplane/core/util/TypeReference.java
new file mode 100644
index 0000000..fac08f8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/TypeReference.java
@@ -0,0 +1,116 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.util;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.FormattedNumber;
+
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 2, 2011
+ */
+public class TypeReference{
+
+ static public Object create(final String objSpec) {
+ return create(objSpec, true);
+ }
+
+ static public Object create(final String objSpec, final boolean verbose) {
+ try {
+ final int sep = objSpec.indexOf('|');
+ if (sep == -1)
+ return objSpec;
+ final String type = objSpec.substring(0, sep);
+ final String spec = objSpec.substring(sep + 1);
+ final AccessibleObject factory = getFactory(type);
+ if (factory instanceof Method)
+ return ((Method) factory).invoke(null, spec);
+ return ((Constructor<?>) factory).newInstance(spec);
+ }
+ catch (Exception e) {
+ if (verbose)
+ LogUtils.warn("cannot create for type reference " + objSpec, e);
+ return objSpec;
+ }
+ }
+
+ private static AccessibleObject getFactory(String typeReference) throws ClassNotFoundException, SecurityException,
+ NoSuchMethodException {
+ // backward compatibility
+ if (typeReference.equals("org.freeplane.core.util.FreeplaneDate")
+ || typeReference.equals("org.freeplane.features.common.format.FormattedDate"))
+ typeReference = FormattedDate.class.getName();
+ else if (typeReference.equals("org.freeplane.features.common.format.FormattedNumber"))
+ typeReference = FormattedNumber.class.getName();
+ final Class<?> clazz = TypeReference.class.getClassLoader().loadClass(typeReference);
+ final FactoryMethod factoryAnnotation = clazz.getAnnotation(FactoryMethod.class);
+ if (factoryAnnotation != null)
+ return clazz.getMethod(factoryAnnotation.value(), String.class);
+ else
+ return clazz.getConstructor(String.class);
+ }
+
+ public static String toSpec(Object obj){
+ final Class<? extends Object> clazz = obj.getClass();
+ if(clazz.equals(String.class)){
+ return obj.toString();
+ }
+ final SerializationMethod method = clazz.getAnnotation(SerializationMethod.class);
+ final String type = clazz.getName() + '|';
+ if(method == null){
+ return type + obj.toString();
+ }
+ try {
+ return type + clazz.getMethod(method.value(), obj.getClass()).invoke(null, obj).toString();
+ }
+ catch (Exception e) {
+ LogUtils.warn(e);
+ return obj.toString();
+ }
+ }
+
+ /** copy of HtmlUtils.unicodeToHTMLUnicodeEntity() with the exception that the separator char '|' and the XML
+ * special chars '"' and '&' are escaped too. */
+ public static String encode(String text) {
+ final StringBuilder result = new StringBuilder((int) (text.length() * 1.2));
+ int intValue;
+ char myChar;
+ for (int i = 0; i < text.length(); ++i) {
+ myChar = text.charAt(i);
+ intValue = text.charAt(i);
+ if (intValue < 32 || intValue == 34 || intValue == 38 || intValue == 124 || intValue > 126) {
+ result.append("&#x").append(Integer.toString(intValue, 16)).append(';');
+ }
+ else {
+ result.append(myChar);
+ }
+ }
+ return result.toString();
+ }
+
+ public static String decode(final String spec) {
+ return HtmlUtils.unescapeHTMLUnicodeEntity(spec);
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/XHTMLWriter.java b/freeplane/src/main/java/org/freeplane/core/util/XHTMLWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/XHTMLWriter.java
rename to freeplane/src/main/java/org/freeplane/core/util/XHTMLWriter.java
diff --git a/freeplane/src/org/freeplane/core/util/XmlUtils.java b/freeplane/src/main/java/org/freeplane/core/util/XmlUtils.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/XmlUtils.java
rename to freeplane/src/main/java/org/freeplane/core/util/XmlUtils.java
diff --git a/freeplane/src/main/java/org/freeplane/core/util/XsltPipeReaderFactory.java b/freeplane/src/main/java/org/freeplane/core/util/XsltPipeReaderFactory.java
new file mode 100644
index 0000000..f86eba2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/XsltPipeReaderFactory.java
@@ -0,0 +1,94 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PipedReader;
+import java.io.PipedWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.URL;
+
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.freeplane.core.resources.ResourceController;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.09.2013
+ */
+public class XsltPipeReaderFactory {
+
+ final private String xsltResource;
+ public XsltPipeReaderFactory(final String xsltResource){
+ this.xsltResource = xsltResource;
+
+ }
+
+ public Reader getReader(final InputStream in) throws IOException {
+ final URL xsltUrl = ResourceController.getResourceController().getResource(xsltResource);
+ if (xsltUrl == null) {
+ LogUtils.severe("Can't find " + xsltResource + " as resource.");
+ throw new IllegalArgumentException("Can't find " + xsltResource + " as resource.");
+ }
+ final PipedReader reader = new PipedReader();
+ final Writer writer = new PipedWriter(reader);
+ final Thread transformationThread = new Thread(new Runnable() {
+
+ @Override
+ public void run() {
+ InputStream xsltFile = null;
+ try{
+ xsltFile = xsltUrl.openStream();
+ final Result result = new StreamResult(writer);
+ transform(new StreamSource(in), xsltFile, result);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ finally {
+ FileUtils.silentlyClose(xsltFile);
+ FileUtils.silentlyClose(writer);
+ }
+ }
+ }, "XSLT Transformation");
+ transformationThread.start();
+ return reader;
+ }
+
+ private void transform(final Source xmlSource, final InputStream xsltStream, final Result result)
+ throws TransformerFactoryConfigurationError {
+ final Source xsltSource = new StreamSource(xsltStream);
+ try {
+ final TransformerFactory transFact = TransformerFactory.newInstance();
+ final Transformer trans = transFact.newTransformer(xsltSource);
+ trans.transform(xmlSource, result);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/core/util/collection/DoubleListModel.java b/freeplane/src/main/java/org/freeplane/core/util/collection/DoubleListModel.java
new file mode 100644
index 0000000..92d3304
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/core/util/collection/DoubleListModel.java
@@ -0,0 +1,82 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.core.util.collection;
+
+import javax.swing.AbstractListModel;
+import javax.swing.ListModel;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+public class DoubleListModel extends AbstractListModel implements ListModel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private ListModel first;
+ final private ListModel second;
+
+ public DoubleListModel(final ListModel first, final ListModel second) {
+ super();
+ this.first = first;
+ this.second = second;
+ first.addListDataListener(new ListDataListener() {
+ public void contentsChanged(final ListDataEvent e) {
+ fireContentsChanged(e.getSource(), e.getIndex0(), e.getIndex1());
+ }
+
+ public void intervalAdded(final ListDataEvent e) {
+ fireIntervalAdded(e.getSource(), e.getIndex0(), e.getIndex1());
+ }
+
+ public void intervalRemoved(final ListDataEvent e) {
+ fireIntervalRemoved(e.getSource(), e.getIndex0(), e.getIndex1());
+ }
+ });
+ second.addListDataListener(new ListDataListener() {
+ public void contentsChanged(final ListDataEvent e) {
+ final int firstSize = first.getSize();
+ fireContentsChanged(e.getSource(), firstSize + e.getIndex0(), firstSize + e.getIndex1());
+ }
+
+ public void intervalAdded(final ListDataEvent e) {
+ final int firstSize = first.getSize();
+ fireIntervalAdded(e.getSource(), firstSize + e.getIndex0(), firstSize + e.getIndex1());
+ }
+
+ public void intervalRemoved(final ListDataEvent e) {
+ final int firstSize = first.getSize();
+ fireIntervalRemoved(e.getSource(), firstSize + e.getIndex0(), firstSize + e.getIndex1());
+ }
+ });
+ }
+
+ public Object getElementAt(final int index) {
+ final int firstSize = first.getSize();
+ return index < firstSize ? first.getElementAt(index) : second.getElementAt(index - firstSize);
+ }
+
+ public int getSize() {
+ return first.getSize() + second.getSize();
+ }
+}
diff --git a/freeplane/src/org/freeplane/core/util/collection/ExtendedComboBoxModel.java b/freeplane/src/main/java/org/freeplane/core/util/collection/ExtendedComboBoxModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/collection/ExtendedComboBoxModel.java
rename to freeplane/src/main/java/org/freeplane/core/util/collection/ExtendedComboBoxModel.java
diff --git a/freeplane/src/org/freeplane/core/util/collection/IListModel.java b/freeplane/src/main/java/org/freeplane/core/util/collection/IListModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/collection/IListModel.java
rename to freeplane/src/main/java/org/freeplane/core/util/collection/IListModel.java
diff --git a/freeplane/src/org/freeplane/core/util/collection/MultipleValueMap.java b/freeplane/src/main/java/org/freeplane/core/util/collection/MultipleValueMap.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/collection/MultipleValueMap.java
rename to freeplane/src/main/java/org/freeplane/core/util/collection/MultipleValueMap.java
diff --git a/freeplane/src/org/freeplane/core/util/collection/SortedComboBoxModel.java b/freeplane/src/main/java/org/freeplane/core/util/collection/SortedComboBoxModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/collection/SortedComboBoxModel.java
rename to freeplane/src/main/java/org/freeplane/core/util/collection/SortedComboBoxModel.java
diff --git a/freeplane/src/org/freeplane/core/util/collection/SortedMapVector.java b/freeplane/src/main/java/org/freeplane/core/util/collection/SortedMapVector.java
similarity index 100%
rename from freeplane/src/org/freeplane/core/util/collection/SortedMapVector.java
rename to freeplane/src/main/java/org/freeplane/core/util/collection/SortedMapVector.java
diff --git a/freeplane/src/org/freeplane/features/attribute/Attribute.java b/freeplane/src/main/java/org/freeplane/features/attribute/Attribute.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/Attribute.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/Attribute.java
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeBuilder.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeBuilder.java
new file mode 100644
index 0000000..207a6c5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeBuilder.java
@@ -0,0 +1,337 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import java.io.IOException;
+import java.util.Vector;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IAttributeWriter;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IElementHandler;
+import org.freeplane.core.io.IExtensionElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.BackwardCompatibleQuantityWriter;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.core.util.TypeReference;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapReader;
+import org.freeplane.features.map.MapWriter;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+class AttributeBuilder implements IElementDOMHandler {
+ static class AttributeProperties {
+ Object parent;
+ public AttributeProperties(Object parent) {
+ this.parent = parent;
+ }
+ String attributeName;
+ String attributeValue;
+ String attributeObject;
+ public Object getValue() {
+ Object value;
+ if(attributeObject == null)
+ value = attributeValue;
+ else
+ try {
+ value = TypeReference.create(attributeObject);
+ }
+ catch (Exception e) {
+ LogUtils.warn(e);
+ value = attributeValue;
+ }
+ return value;
+ }
+ }
+
+ static class RegisteredAttributeProperties {
+ String attributeName;
+ boolean manual = false;
+ boolean restricted = false;
+ boolean visible = false;
+ }
+
+ public static final String XML_NODE_ATTRIBUTE = "attribute";
+ public static final String XML_NODE_ATTRIBUTE_LAYOUT = "attribute_layout";
+ public static final String XML_NODE_ATTRIBUTE_REGISTRY = "attribute_registry";
+ public static final String XML_NODE_REGISTERED_ATTRIBUTE_NAME = "attribute_name";
+ public static final String XML_NODE_REGISTERED_ATTRIBUTE_VALUE = "attribute_value";
+ final private AttributeController attributeController;
+// // final private Controller controller;
+ final private MapReader mapReader;
+
+ public AttributeBuilder(final AttributeController attributeController, final MapReader mapReader) {
+ this.attributeController = attributeController;
+ this.mapReader = mapReader;
+ }
+
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (tag.equals(AttributeBuilder.XML_NODE_ATTRIBUTE)
+ || tag.equals(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE)) {
+ return new AttributeProperties(parent);
+ }
+ if (tag.equals(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME)) {
+ return new RegisteredAttributeProperties();
+ }
+ if (tag.equals(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY)) {
+ return parent;
+ }
+ return null;
+ }
+
+ public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
+ /* attributes */
+ if (tag.equals(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME)) {
+ final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
+ if (rap.visible) {
+ AttributeRegistry.getRegistry(getMap()).getElement(rap.attributeName).setVisibility(true);
+ }
+ if (rap.restricted) {
+ AttributeRegistry.getRegistry(getMap()).getElement(rap.attributeName).setRestriction(true);
+ }
+ if (rap.manual) {
+ AttributeRegistry.getRegistry(getMap()).getElement(rap.attributeName).setManual(true);
+ }
+ return;
+ }
+ if (tag.equals(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE)) {
+ final AttributeProperties ap = (AttributeProperties) userObject;
+ final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) ap.parent;
+ final Attribute attribute = new Attribute(rap.attributeName, ap.getValue());
+ final AttributeRegistry r = AttributeRegistry.getRegistry(getMap());
+ r.registry(attribute);
+ }
+ if (parent instanceof NodeModel) {
+ final NodeModel node = (NodeModel) parent;
+ if (tag.equals(AttributeBuilder.XML_NODE_ATTRIBUTE)) {
+ final AttributeProperties ap = (AttributeProperties) userObject;
+ final Attribute attribute = new Attribute(ap.attributeName, ap.getValue());
+ attributeController.createAttributeTableModel(node);
+ final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(node);
+ model.addRowNoUndo(attribute);
+ return;
+ }
+ return;
+ }
+ }
+
+ private MapModel getMap() {
+ return mapReader.getCurrentNodeTreeCreator().getCreatedMap();
+ }
+
+ private void registerAttributeHandlers(final ReadManager reader) {
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, "NAME",
+ new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
+ rap.attributeName = value;
+ AttributeRegistry.getRegistry(getMap()).registry(value);
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, "VISIBLE",
+ new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
+ rap.visible = true;
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, "RESTRICTED",
+ new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
+ rap.restricted = true;
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, "MANUAL",
+ new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
+ rap.manual = true;
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE, "VALUE",
+ new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final AttributeProperties ap = (AttributeProperties) userObject;
+ ap.attributeValue = value;
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE, "OBJECT",
+ new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final AttributeProperties ap = (AttributeProperties) userObject;
+ ap.attributeObject = value;
+ }
+ });
+ reader.addElementHandler(XML_NODE_ATTRIBUTE_LAYOUT, new IElementHandler() {
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ return parent;
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_LAYOUT, "NAME_WIDTH", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ attributeController.createAttributeTableModel(node);
+ final AttributeTableLayoutModel layout = NodeAttributeTableModel.getModel(node).getLayout();
+ layout.setColumnWidth(0, LengthUnits.fromStringInPt(value));
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_LAYOUT, "VALUE_WIDTH", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ attributeController.createAttributeTableModel(node);
+ final AttributeTableLayoutModel layout = NodeAttributeTableModel.getModel(node).getLayout();
+ layout.setColumnWidth(1, LengthUnits.fromStringInPt(value));
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE, "NAME", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final AttributeProperties ap = (AttributeProperties) userObject;
+ ap.attributeName = value;
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE, "VALUE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final AttributeProperties ap = (AttributeProperties) userObject;
+ ap.attributeValue = value;
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE, "OBJECT", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final AttributeProperties ap = (AttributeProperties) userObject;
+ ap.attributeObject = value;
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY, "RESTRICTED", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ AttributeRegistry.getRegistry(getMap()).setRestricted(true);
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY, "SHOW_ATTRIBUTES",
+ new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(getMap());
+ if(attributes != null)
+ attributes.setAttributeViewType(value);
+ }
+ });
+ reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY, "FONT_SIZE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final int size = Integer.parseInt(value.toString());
+ getMap().addExtension(new FontSizeExtension(size));
+ }
+ });
+ }
+
+
+ /**
+ */
+ public void registerBy(final ReadManager reader, final WriteManager writer) {
+ reader.addElementHandler("attribute_registry", this);
+ reader.addElementHandler(AttributeBuilder.XML_NODE_ATTRIBUTE, this);
+ reader.addElementHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, this);
+ reader.addElementHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE, this);
+ writer.addExtensionElementWriter(NodeAttributeTableModel.class, new IExtensionElementWriter() {
+ public void writeContent(final ITreeWriter writer, final Object node, final IExtension extension)
+ throws IOException {
+ final NodeAttributeTableModel attributes = (NodeAttributeTableModel) extension;
+ save((NodeModel)node, attributes, writer);
+ }
+ });
+ writer.addExtensionElementWriter(AttributeRegistry.class, new IExtensionElementWriter() {
+ public void writeContent(final ITreeWriter writer, final Object node, final IExtension extension)
+ throws IOException {
+ final AttributeRegistry attributes = (AttributeRegistry) extension;
+ attributes.write(writer);
+ }
+ });
+ writer.addAttributeWriter(XML_NODE_ATTRIBUTE_LAYOUT, AttributeWriter.INSTANCE);
+ registerAttributeHandlers(reader);
+ }
+
+ void save(NodeModel node, NodeAttributeTableModel table, final ITreeWriter writer) throws IOException {
+ saveLayout(table.getLayout(), writer);
+ if (table.getRowCount() > 0) {
+ final Vector<Attribute> attributes = table.getAttributes();
+ for (int i = 0; i < attributes.size(); i++) {
+ saveAttribute(node, writer, attributes.get(i));
+ }
+ }
+ }
+
+ private static final Quantity<LengthUnits> DEFAULT_COLUMN_WIDTH = new Quantity<LengthUnits>(60, LengthUnits.pt);
+ static class AttributeWriter implements IAttributeWriter{
+ static AttributeWriter INSTANCE = new AttributeWriter();
+
+ @Override
+ public void writeAttributes(ITreeWriter writer, Object userObject, String tag) {
+ AttributeTableLayoutModel layout = (AttributeTableLayoutModel) userObject;
+ final Quantity<LengthUnits> firstColumnWidth = layout.getColumnWidth(0);
+ final Quantity<LengthUnits> secondColumnWidth = layout.getColumnWidth(1);
+ final boolean firstColumnHasOwnWidth = !DEFAULT_COLUMN_WIDTH.equals(firstColumnWidth);
+ final boolean secondColumnHasOwnWidth = !DEFAULT_COLUMN_WIDTH.equals(secondColumnWidth);
+ if (firstColumnHasOwnWidth) {
+ BackwardCompatibleQuantityWriter.forWriter(writer).writeQuantity("NAME_WIDTH", firstColumnWidth);
+ }
+ if (secondColumnHasOwnWidth) {
+ BackwardCompatibleQuantityWriter.forWriter(writer).writeQuantity("VALUE_WIDTH", secondColumnWidth);
+ }
+ }
+
+ }
+ private void saveLayout(AttributeTableLayoutModel layout, final ITreeWriter writer) throws IOException {
+ if (layout != null) {
+ final Quantity<LengthUnits> firstColumnWidth = layout.getColumnWidth(0);
+ final Quantity<LengthUnits> secondColumnWidth = layout.getColumnWidth(1);
+ final boolean firstColumnHasOwnWidth = !DEFAULT_COLUMN_WIDTH.equals(firstColumnWidth);
+ final boolean secondColumnHasOwnWidth = !DEFAULT_COLUMN_WIDTH.equals(secondColumnWidth);
+ if (firstColumnHasOwnWidth || secondColumnHasOwnWidth ) {
+ writer.addElement(layout, AttributeBuilder.XML_NODE_ATTRIBUTE_LAYOUT);
+ }
+ }
+ }
+
+ private void saveAttribute(NodeModel node, final ITreeWriter writer, final Attribute attr) throws IOException {
+ final XMLElement attributeElement = new XMLElement();
+ attributeElement.setName(AttributeBuilder.XML_NODE_ATTRIBUTE);
+ attributeElement.setAttribute("NAME", attr.getName());
+ final Object value = attr.getValue();
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (forceFormatting) {
+ attributeElement.setAttribute("VALUE", TextController.getController().getTransformedTextNoThrow(value, node, null));
+ }
+ else{
+ attributeElement.setAttribute("VALUE", value.toString());
+ if(! (value instanceof String))
+ attributeElement.setAttribute("OBJECT", TypeReference.toSpec(value));
+ }
+ writer.addElement(attr, attributeElement);
+ }
+
+ public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeCompareCondition.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeCompareCondition.java
new file mode 100644
index 0000000..c01eb30
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeCompareCondition.java
@@ -0,0 +1,128 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import org.freeplane.core.io.xml.TreeXmlReader;
+import org.freeplane.core.io.xml.TreeXmlWriter;
+import org.freeplane.core.util.TypeReference;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.CompareConditionAdapter;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class AttributeCompareCondition extends CompareConditionAdapter {
+ static final String ATTRIBUTE = "ATTRIBUTE";
+ static final String COMPARATION_RESULT = "COMPARATION_RESULT";
+ static final String NAME = "attribute_compare_condition";
+ static final String SUCCEED = "SUCCEED";
+
+ static ASelectableCondition load(final XMLElement element) {
+ final Object attr = AttributeConditionController.toAttributeObject(element.getAttribute(ATTRIBUTE, null));
+ Object value = element.getAttribute(CompareConditionAdapter.VALUE, null);
+ if(value == null){
+ final String spec = element.getAttribute(CompareConditionAdapter.OBJECT, null);
+ value = TypeReference.create(spec);
+ }
+
+ final boolean matchCase = TreeXmlReader.xmlToBoolean(element.getAttribute(
+ CompareConditionAdapter.MATCH_CASE, null));
+ final int compResult = Integer.parseInt(element.getAttribute(
+ COMPARATION_RESULT, null));
+ final boolean succeed = TreeXmlReader.xmlToBoolean(element.getAttribute(
+ SUCCEED, null));
+ final boolean matchApproximately = TreeXmlReader.xmlToBoolean(element.getAttribute(
+ MATCH_APPROXIMATELY, null));
+ return new AttributeCompareCondition(attr, value, matchCase, compResult, succeed, matchApproximately);
+ }
+
+ final private Object attribute;
+ final private int comparationResult;
+ final private boolean succeed;
+
+ /**
+ */
+ public AttributeCompareCondition(final Object attribute, final Object value, final boolean matchCase,
+ final int comparationResult, final boolean succeed, final boolean matchApproximately) {
+ super(value, matchCase, matchApproximately);
+ this.attribute = attribute;
+ this.comparationResult = comparationResult;
+ this.succeed = succeed;
+
+ }
+
+ public boolean isEqualityCondition()
+ {
+ return comparationResult == 0;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
+ * .MindMapNode)
+ */
+ public boolean checkNode(final NodeModel node) {
+ final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
+ final TextController textController = TextController.getController();
+ for (int i = 0; i < attributes.getRowCount(); i++) {
+ if(attribute.equals(AttributeConditionController.ANY_ATTRIBUTE_NAME_OR_VALUE_OBJECT)){
+ if (checkContent(attributes.getValueAt(i, 0)))
+ return true;
+
+ }
+ else if(! attributes.getValueAt(i, 0).equals(attribute)) {
+ continue;
+ }
+ final Object originalContent = attributes.getValueAt(i, 1);
+ final Object content = textController.getTransformedObjectNoThrow(originalContent, node, null);
+ if (checkContent(content))
+ return true;
+ }
+ return false;
+ }
+
+ private boolean checkContent(Object content) {
+ compareTo(content);
+ return isComparisonOK() && succeed == (getComparisonResult() == comparationResult);
+ }
+
+ @Override
+ protected String createDescription() {
+ return super.createDescription(attribute.toString(), comparationResult, succeed);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ if (attribute instanceof String) child.setAttribute(ATTRIBUTE, (String) attribute);
+ child.setAttribute(COMPARATION_RESULT, Integer.toString(comparationResult));
+ child.setAttribute(SUCCEED, TreeXmlWriter.BooleanToXml(succeed));
+ child.setAttribute(MATCH_APPROXIMATELY, TreeXmlWriter.BooleanToXml(matchApproximately));
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeConditionController.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeConditionController.java
new file mode 100644
index 0000000..feb9913
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeConditionController.java
@@ -0,0 +1,200 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import java.util.NoSuchElementException;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.ui.FixedBasicComboBoxEditor;
+import org.freeplane.core.ui.components.TypedListCellRenderer;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.collection.DoubleListModel;
+import org.freeplane.core.util.collection.ExtendedComboBoxModel;
+import org.freeplane.core.util.collection.SortedComboBoxModel;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.features.link.LinkTransformer;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+class AttributeConditionController implements IElementaryConditionController {
+private static final String ATTRIBUTE_NAME_OR_VALUE = "attribute_name_or_value";
+static final TranslatedObject ANY_ATTRIBUTE_NAME_OR_VALUE_OBJECT = new TranslatedObject(ATTRIBUTE_NAME_OR_VALUE);
+// // final private Controller controller;
+ private final ExtendedComboBoxModel values = new ExtendedComboBoxModel();
+
+ public AttributeConditionController() {
+ super();
+// this.controller = controller;
+ }
+
+ public boolean canEditValues(final Object selectedItem, final TranslatedObject simpleCond) {
+ return canSelectValues(selectedItem, simpleCond);
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ return ANY_ATTRIBUTE_NAME_OR_VALUE_OBJECT.equals(selectedItem) || selectedItem.getClass().equals(String.class);
+ }
+
+ public boolean canSelectValues(final Object selectedItem, final TranslatedObject simpleCond) {
+ return !simpleCond.objectEquals(ConditionFactory.FILTER_EXIST)
+ && !simpleCond.objectEquals(ConditionFactory.FILTER_DOES_NOT_EXIST);
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCondition,
+ final Object value, final boolean matchCase, final boolean matchApproximately) {
+ final Object attribute = selectedItem;
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_EXIST)) {
+ return new AttributeExistsCondition(attribute);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_DOES_NOT_EXIST)) {
+ return new AttributeNotExistsCondition(attribute);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
+ return new AttributeCompareCondition(attribute, value, matchCase, 0, true, matchApproximately);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
+ return new AttributeCompareCondition(attribute, value, matchCase, 0, false, matchApproximately);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
+ return new AttributeCompareCondition(attribute, value, matchCase, 1, true, false);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
+ return new AttributeCompareCondition(attribute, value, matchCase, -1, false, false);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
+ return new AttributeCompareCondition(attribute, value, matchCase, -1, true, false);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
+ return new AttributeCompareCondition(attribute, value, matchCase, 1, false, false);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)) {
+ return new AttributeContainsCondition(attribute, value.toString(), matchCase, matchApproximately);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_REGEXP)) {
+ return new AttributeMatchesCondition(attribute, value.toString(), matchCase);
+ }
+ return null;
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object selectedItem) {
+ return new DefaultComboBoxModel(new TranslatedObject[] {
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_REGEXP),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_EXIST),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_DOES_NOT_EXIST),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_NOT_EQUAL_TO),
+ TranslatedObject.literal(ConditionFactory.FILTER_GT), TranslatedObject.literal(ConditionFactory.FILTER_GE),
+ TranslatedObject.literal(ConditionFactory.FILTER_LE), TranslatedObject.literal(ConditionFactory.FILTER_LT)
+ });
+ }
+
+ public ListModel getFilteredProperties() {
+ final AttributeRegistry registry = AttributeRegistry.getRegistry(Controller.getCurrentController().getMap());
+ final DefaultListModel anyAttributeList = new DefaultListModel();
+ anyAttributeList.addElement(ANY_ATTRIBUTE_NAME_OR_VALUE_OBJECT);
+ if (registry != null) {
+ return new DoubleListModel(anyAttributeList, registry.getListBoxModel());
+ }
+ return anyAttributeList;
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ if(selectedCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)
+ || selectedCondition.objectEquals(ConditionFactory.FILTER_REGEXP) )
+ return new FixedBasicComboBoxEditor();
+ return FrameController.getTextDateTimeEditor();
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object selectedItem, TranslatedObject simpleCond) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
+ try {
+ final AttributeRegistryElement element = registry.getElement(selectedItem.toString());
+ final SortedComboBoxModel list = element.getValues();
+ SortedComboBoxModel linkedList = new SortedComboBoxModel();
+ for(int i = 0; i < list.getSize();i++){
+ final Object value = list.getElementAt(i);
+ final Object transformedValue = new LinkTransformer(Controller.getCurrentModeController(), 1).transformContent(value, map);
+ linkedList.add(transformedValue);
+ }
+ values.setExtensionList(linkedList);
+ }
+ catch (NoSuchElementException e) {
+ values.setExtensionList(null);
+ }
+ return values;
+ }
+
+ public boolean isCaseDependent(final Object selectedItem, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ if (element.getName().equalsIgnoreCase(AttributeCompareCondition.NAME)) {
+ return AttributeCompareCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(AttributeExistsCondition.NAME)) {
+ return AttributeExistsCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(AttributeNotExistsCondition.NAME)) {
+ return AttributeNotExistsCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(AttributeContainsCondition.NAME)) {
+ return AttributeContainsCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(AttributeMatchesCondition.NAME)) {
+ return AttributeMatchesCondition.load(element);
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ if(selectedCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)
+ || selectedCondition.objectEquals(ConditionFactory.FILTER_REGEXP) )
+ return null;
+ return new TypedListCellRenderer();
+ }
+
+ static Object toAttributeObject(final String attribute) {
+ final Object xmlElementAttribute = attribute != null ? attribute : ANY_ATTRIBUTE_NAME_OR_VALUE_OBJECT;
+ return xmlElementAttribute;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeContainsCondition.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeContainsCondition.java
new file mode 100644
index 0000000..10496ce
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeContainsCondition.java
@@ -0,0 +1,122 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.StringMatchingStrategy;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class AttributeContainsCondition extends ASelectableCondition {
+ static final String ATTRIBUTE = "ATTRIBUTE";
+ static final String NAME = "attribute_contains_condition";
+ static final String VALUE = "VALUE";
+ static final String MATCH_CASE = "MATCH_CASE";
+ static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
+
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new AttributeContainsCondition(
+ AttributeConditionController.toAttributeObject(element.getAttribute(ATTRIBUTE, null)),
+ element.getAttribute(VALUE, null),
+ Boolean.valueOf(element.getAttribute(MATCH_CASE, null)),
+ Boolean.valueOf(element.getAttribute(MATCH_APPROXIMATELY, null))
+ );
+ }
+
+ final private Object attribute;
+ final private String value;
+ final private String comparedValue;
+ final private boolean matchCase;
+ final private boolean matchApproximately;
+ final private StringMatchingStrategy stringMatchingStrategy;
+
+ /**
+ */
+ public AttributeContainsCondition(final Object attribute,final String value, final boolean matchCase,
+ final boolean matchApproximately) {
+ super();
+ this.attribute = attribute;
+ this.value = value;
+ this.matchCase = matchCase;
+ //this.comparedValue = matchCase ? value : value.toLowerCase();
+ this.comparedValue = value;
+ this.matchApproximately = matchApproximately;
+ this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
+ * .MindMapNode)
+ */
+ public boolean checkNode(final NodeModel node) {
+ final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
+ final TextController textController = TextController.getController();
+ for (int i = 0; i < attributes.getRowCount(); i++) {
+ if(attribute.equals(AttributeConditionController.ANY_ATTRIBUTE_NAME_OR_VALUE_OBJECT)){
+ if (checkText(attributes.getValueAt(i, 0).toString()))
+ return true;
+
+ }
+ else if(! attributes.getValueAt(i, 0).equals(attribute)) {
+ continue;
+ }
+ final Object originalContent = attributes.getValueAt(i, 1);
+ String text = textController.getTransformedTextNoThrow(originalContent, node, null);
+ if (checkText(text)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean checkText(String text) {
+ return stringMatchingStrategy.matches(comparedValue, text, true, matchCase);
+ }
+
+ @Override
+ protected String createDescription() {
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
+ return ConditionFactory.createDescription(attribute.toString(), simpleCondition, value, matchCase, matchApproximately);
+ }
+
+ @Override
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ if (attribute instanceof String) child.setAttribute(ATTRIBUTE, (String) attribute);
+ child.setAttribute(VALUE, value);
+ child.setAttribute(MATCH_CASE, Boolean.toString(matchCase));
+ child.setAttribute(MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeController.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeController.java
new file mode 100644
index 0000000..f4150b3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeController.java
@@ -0,0 +1,250 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import java.awt.Component;
+import java.awt.Font;
+import java.net.URI;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.ui.components.html.CssRuleBuilder;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.IStateIconProvider;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.ITooltipProvider;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapReader;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.SetBooleanMapPropertyAction;
+import org.freeplane.features.text.TextController;
+
+/**
+ * @author Dimitry Polivaev 22.11.2008
+ */
+public class AttributeController implements IExtension {
+ public static final String SHOW_ICON_FOR_ATTRIBUTES = "show_icon_for_attributes";
+ private static final Integer ATTRIBUTE_TOOLTIP = 7;
+ static private UIIcon attributeIcon = null;
+ public static AttributeController getController() {
+ return getController(Controller.getCurrentModeController());
+ }
+
+ public static AttributeController getController(ModeController modeController) {
+ return (AttributeController) modeController.getExtension(AttributeController.class);
+ }
+
+ public static void install( final AttributeController attributeController) {
+ Controller.getCurrentModeController().addExtension(AttributeController.class, attributeController);
+ }
+
+ final private ModeController modeController;
+
+ public AttributeController(final ModeController modeController) {
+ this.modeController = modeController;
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ final ReadManager readManager = mapController.getReadManager();
+ final WriteManager writeManager = mapController.getWriteManager();
+ final MapReader mapReader = mapController.getMapReader();
+ final AttributeBuilder attributeBuilder = new AttributeBuilder(this, mapReader);
+ attributeBuilder.registerBy(readManager, writeManager);
+ modeController.addAction(new SetBooleanMapPropertyAction(SHOW_ICON_FOR_ATTRIBUTES));
+ registerTooltipProvider();
+ registerStateIconProvider();
+ }
+
+ public NodeAttributeTableModel createAttributeTableModel(final NodeModel node) {
+ NodeAttributeTableModel attributeModel = (NodeAttributeTableModel) node
+ .getExtension(NodeAttributeTableModel.class);
+ if (attributeModel != null) {
+ return attributeModel;
+ }
+ attributeModel = new NodeAttributeTableModel(node);
+ node.addExtension(attributeModel);
+ if (node.areViewsEmpty()) {
+ return attributeModel;
+ }
+ modeController.getMapController().nodeRefresh(node);
+ return attributeModel;
+ }
+
+ public void performInsertRow(final NodeAttributeTableModel model, final int row, final String name,
+ final Object value) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performRegistryAttribute(final String name) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performRegistryAttributeValue(final String name, final String value, boolean manual) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performRegistrySubtreeAttributes(final NodeModel model) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performRemoveAttribute(final String name) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performRemoveAttributeValue(final String name, final String value) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Attribute performRemoveRow(final NodeAttributeTableModel model, final int row) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performReplaceAtributeName(final String oldName, final String newName) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performReplaceAttributeValue(final String name, final String oldValue, final String newValue) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performSetColumnWidth(final NodeAttributeTableModel model, final int col, final Quantity<LengthUnits> width) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performSetRestriction(final int row, final boolean restricted) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performSetValueAt(final NodeAttributeTableModel model, final Object o, final int row, final int col) {
+ throw new UnsupportedOperationException();
+ }
+
+ public void performSetVisibility(final int index, final boolean isVisible) {
+ throw new UnsupportedOperationException();
+ }
+
+ private void registerTooltipProvider() {
+ modeController.addToolTipProvider(ATTRIBUTE_TOOLTIP, new ITooltipProvider() {
+ public String getTooltip(ModeController modeController, NodeModel node, Component view) {
+ final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
+ final int rowCount = attributes.getRowCount();
+ if (rowCount == 0) {
+ return null;
+ }
+ final AttributeRegistry registry = AttributeRegistry.getRegistry(node.getMap());
+ final TextController textController = TextController.getController(modeController);
+ if (registry.getAttributeViewType().equals(AttributeTableLayoutModel.SHOW_ALL)
+ && ! textController.isMinimized(node)) {
+ return null;
+ }
+ final NodeStyleController style = (NodeStyleController) modeController.getExtension(NodeStyleController.class);
+ final MapStyleModel model = MapStyleModel.getExtension(node.getMap());
+ final NodeModel attributeStyleNode = model.getStyleNodeSafe(MapStyleModel.ATTRIBUTE_STYLE);
+ final Font font = style.getFont(attributeStyleNode);
+ final StringBuilder tooltip = new StringBuilder();
+ tooltip.append("<html><body><table style='border: 1px solid;");
+ tooltip.append( new CssRuleBuilder().withFont(font)
+ .withBackground(style.getBackgroundColor(attributeStyleNode))
+ .withColor(style.getColor(attributeStyleNode))
+ );
+ tooltip.append(" ' width='100%' cellspacing='0' cellpadding='2' ");
+ final int currentRowCount = attributes.getRowCount();
+ for (int i = 0; i < currentRowCount; i++) {
+ tooltip.append("<tr><td style='border: 1px solid;'>");
+ tooltip.append(attributes.getValueAt(i, 0));
+ tooltip.append("</td><td style='border: 1px solid;'>");
+ final Object object = attributes.getValueAt(i, 1);
+ final String text = getTransformedValue(node, textController, object);
+ if(object instanceof URI){
+ tooltip.append("<a");
+ tooltip.append(" href=\"");
+ tooltip.append(object);
+ tooltip.append("\"");
+ tooltip.append(">");
+ tooltip.append(text);
+ tooltip.append("</a>");
+ }
+ else{
+ tooltip.append(text);
+ }
+ tooltip.append("</td></tr>");
+ }
+ tooltip.append("</table></body></html>");
+ return tooltip.toString();
+ }
+
+ private String getTransformedValue(NodeModel node, final TextController textController, final Object value) {
+ try {
+ final String text = textController.getTransformedText(value, node, null);
+ final boolean markTransformedText = TextController.isMarkTransformedTextSet();
+ final String unicodeText = HtmlUtils.unicodeToHTMLUnicodeEntity(text);
+ if (markTransformedText && text != value)
+ return colorize(unicodeText, "green");
+ else
+ return unicodeText;
+ }
+ catch (Throwable e) {
+ LogUtils.warn(e.getMessage(), e);
+ return colorize(
+ TextUtils.format("MainView.errorUpdateText", String.valueOf(value), e.getLocalizedMessage())
+ .replace("\n", "<br>"), "red");
+ }
+ }
+
+ private String colorize(final String text, String color) {
+ return "<span style=\"color:" + color + ";font-style:italic;\">" + text + "</span>";
+ }
+ });
+ }
+
+ private void registerStateIconProvider() {
+ IconController.getController().addStateIconProvider(new IStateIconProvider() {
+ public UIIcon getStateIcon(NodeModel node) {
+ NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);;
+ if (attributes.getRowCount() == 0) {
+ return null;
+ }
+ final String showAttributeIcon = MapStyle.getController(modeController).getPropertySetDefault(node.getMap(), SHOW_ICON_FOR_ATTRIBUTES);
+ final boolean showIcon = Boolean.parseBoolean(showAttributeIcon);
+ if(showIcon) {
+ if (attributeIcon == null) {
+ attributeIcon = IconStoreFactory.create().getUIIcon("showAttributes.png");
+ }
+ return attributeIcon;
+ }
+ else
+ return null;
+ }
+ });
+ }
+
+ public boolean canEdit() {
+ return false;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeExistsCondition.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeExistsCondition.java
new file mode 100644
index 0000000..751a5ac
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeExistsCondition.java
@@ -0,0 +1,84 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class AttributeExistsCondition extends ASelectableCondition {
+ static final String ATTRIBUTE = "ATTRIBUTE";
+ static final String NAME = "attribute_exists_condition";
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new AttributeExistsCondition(
+ AttributeConditionController.toAttributeObject(element.getAttribute(AttributeExistsCondition.ATTRIBUTE, null))
+ );
+ }
+
+ final private Object attribute;
+
+ /**
+ */
+ public AttributeExistsCondition(final Object attribute) {
+ super();
+ this.attribute = attribute;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
+ * .MindMapNode)
+ */
+ public boolean checkNode(final NodeModel node) {
+ final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
+ for (int i = 0; i < attributes.getRowCount(); i++) {
+ if(attribute.equals(AttributeConditionController.ANY_ATTRIBUTE_NAME_OR_VALUE_OBJECT)){
+ return true;
+ }
+ else if (attributes.getValueAt(i, 0).equals(attribute)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_EXIST);
+ return ConditionFactory.createDescription(attribute.toString(), simpleCondition, null, false, false);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ if (attribute instanceof String) child.setAttribute(ATTRIBUTE, (String) attribute);
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeMatchesCondition.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeMatchesCondition.java
new file mode 100644
index 0000000..b78e0f6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeMatchesCondition.java
@@ -0,0 +1,118 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import java.util.regex.Pattern;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * Condition for matching a regexp against an attribute.
+ * Approximate matching setting is ignored here.
+ *
+ * @author Dimitry Polivaev
+ */
+public class AttributeMatchesCondition extends ASelectableCondition {
+ static final String ATTRIBUTE = "ATTRIBUTE";
+ static final String NAME = "attribute_matches_condition";
+ static final String VALUE = "VALUE";
+ static final String MATCH_CASE = "MATCH_CASE";
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new AttributeMatchesCondition(
+ AttributeConditionController.toAttributeObject(element.getAttribute(ATTRIBUTE, null)),
+ element.getAttribute(VALUE, null),
+ Boolean.valueOf(element.getAttribute(MATCH_CASE, null))
+ );
+ }
+
+ final private Object attribute;
+ final private String value;
+ final private Pattern searchPattern;
+ /**
+ */
+ public AttributeMatchesCondition(final Object attribute,final String value, final boolean matchCase) {
+ super();
+ this.attribute = attribute;
+ this.value = value;
+ int flags = Pattern.DOTALL;
+ if (!matchCase) {
+ flags |= Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE;
+ }
+ this.searchPattern = Pattern.compile(value, flags);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
+ * .MindMapNode)
+ */
+ public boolean checkNode(final NodeModel node) {
+ final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
+ final TextController textController = TextController.getController();
+ for (int i = 0; i < attributes.getRowCount(); i++) {
+ if(attribute.equals(AttributeConditionController.ANY_ATTRIBUTE_NAME_OR_VALUE_OBJECT)){
+ if (checkText(attributes.getValueAt(i, 0).toString()))
+ return true;
+
+ }
+ else if(! attributes.getValueAt(i, 0).equals(attribute)) {
+ continue;
+ }
+ final Object originalContent = attributes.getValueAt(i, 1);
+ String text = textController.getTransformedTextNoThrow(originalContent, node, null);
+ if(checkText(text))
+ return true;
+ }
+ return false;
+ }
+
+ private boolean checkText(String text) {
+ return searchPattern.matcher(text).find();
+ }
+
+ @Override
+ protected String createDescription() {
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_REGEXP);
+ return ConditionFactory.createDescription(attribute.toString(), simpleCondition, value, isMatchCase(), false);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ if (attribute instanceof String) child.setAttribute(ATTRIBUTE, (String) attribute);
+ child.setAttribute(VALUE, value);
+ child.setAttribute(MATCH_CASE, Boolean.toString(isMatchCase()));
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+ private boolean isMatchCase() {
+ return (searchPattern.flags() & Pattern.CASE_INSENSITIVE) == 0;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeNotExistsCondition.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeNotExistsCondition.java
new file mode 100644
index 0000000..fdfd1cf
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeNotExistsCondition.java
@@ -0,0 +1,82 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class AttributeNotExistsCondition extends ASelectableCondition {
+ static final String ATTRIBUTE = "ATTRIBUTE";
+ static final String NAME = "attribute_not_exists_condition";
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new AttributeNotExistsCondition(
+ AttributeConditionController.toAttributeObject(element.getAttribute(AttributeNotExistsCondition.ATTRIBUTE, null))
+ );
+ }
+
+
+ final private Object attribute;
+
+ /**
+ */
+ public AttributeNotExistsCondition(final Object attribute) {
+ super();
+ this.attribute = attribute;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
+ * .MindMapNode)
+ */
+ public boolean checkNode(final NodeModel node) {
+ final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
+ for (int i = 0; i < attributes.getRowCount(); i++) {
+ if (attributes.getValueAt(i, 0).equals(attribute)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ protected String createDescription() {
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_DOES_NOT_EXIST);
+ return ConditionFactory.createDescription(attribute.toString(), simpleCondition, null, false, false);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ if (attribute instanceof String) child.setAttribute(ATTRIBUTE, (String) attribute);
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeRegistry.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeRegistry.java
new file mode 100644
index 0000000..b54c6d4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeRegistry.java
@@ -0,0 +1,419 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import java.io.IOException;
+import java.util.NoSuchElementException;
+
+import javax.swing.ComboBoxModel;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.EventListenerList;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.util.collection.IListModel;
+import org.freeplane.core.util.collection.SortedComboBoxModel;
+import org.freeplane.core.util.collection.SortedMapVector;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class AttributeRegistry implements IExtension {
+ static public final int GLOBAL = -1;
+
+ public static AttributeRegistry getRegistry(final MapModel map) {
+ AttributeRegistry registry = (AttributeRegistry) map.getExtension(AttributeRegistry.class);
+ if (registry == null) {
+ final AttributeController attributeController = AttributeController.getController();
+ registry = new AttributeRegistry(attributeController);
+ map.addExtension(AttributeRegistry.class, registry);
+ final NodeModel rootNode = map.getRootNode();
+ if(rootNode != null)
+ registry.registryAttributes(Controller.getCurrentModeController().getMapController(), rootNode);
+ }
+ return registry;
+ }
+
+ private AttributeController attributeController;
+ private ChangeEvent attributesEvent;
+ private String attributeViewType;
+ private ChangeEvent changeEvent;
+ protected SortedMapVector elements;
+ protected boolean isAttributeLayoutChanged;
+ private boolean isRestricted;
+ private EventListenerList listenerList = null;
+ private AttributeRegistryComboBoxColumnModel myComboBoxColumnModel = null;
+ private AttributeRegistryTableModel myTableModel = null;
+ private Boolean restrictionModel;
+ protected int visibleElementsNumber;
+
+ /**
+ *
+ */
+ public AttributeRegistry() {
+ super();
+ }
+
+ public AttributeRegistry(final AttributeController attributeController) {
+ super();
+ listenerList = new EventListenerList();
+ isAttributeLayoutChanged = false;
+ this.attributeController = attributeController;
+ visibleElementsNumber = 0;
+ elements = new SortedMapVector();
+ myTableModel = new AttributeRegistryTableModel(this);
+ isRestricted = false;
+ restrictionModel = Boolean.FALSE;
+ attributeViewType = AttributeTableLayoutModel.SHOW_ALL;
+ }
+
+ public void addAttributesListener(final IAttributesListener l) {
+ listenerList.add(IAttributesListener.class, l);
+ }
+
+ public void addChangeListener(final ChangeListener l) {
+ listenerList.add(ChangeListener.class, l);
+ }
+
+ public void applyChanges() {
+ if (isAttributeLayoutChanged == false) {
+ return;
+ }
+ getAttributeController().performSetRestriction(AttributeRegistry.GLOBAL, restrictionModel.booleanValue());
+ for (int i = 0; i < elements.size(); i++) {
+ final AttributeRegistryElement element = getElement(i);
+ getAttributeController().performSetVisibility(i, element.getVisibilityModel().booleanValue());
+ getAttributeController().performSetRestriction(i, element.getRestriction().booleanValue());
+ }
+ isAttributeLayoutChanged = false;
+ }
+
+ public boolean containsElement(final String name) {
+ return elements.containsKey(name);
+ }
+
+ public void decrementVisibleElementsNumber() {
+ visibleElementsNumber--;
+ }
+
+ public boolean exist(final String attributeName, final Object element) {
+ final int index = indexOf(attributeName);
+ if (index == -1) {
+ return false;
+ }
+ final SortedComboBoxModel values = getElement(index).getValues();
+ for (int i = 0; i < values.getSize(); i++) {
+ if (element.equals(values.getElementAt(i))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void fireAttributeLayoutChanged() {
+ fireStateChanged();
+ }
+
+ protected void fireAttributesChanged() {
+ final Object[] listeners = listenerList.getListenerList();
+ for (int i = listeners.length - 2; i >= 0; i -= 2) {
+ if (listeners[i] == IAttributesListener.class) {
+ if (attributesEvent == null) {
+ attributesEvent = new ChangeEvent(this);
+ }
+ ((IAttributesListener) listeners[i + 1]).attributesChanged(changeEvent);
+ }
+ }
+ }
+
+ public void fireStateChanged() {
+ final Object[] listeners = listenerList.getListenerList();
+ for (int i = listeners.length - 2; i >= 0; i -= 2) {
+ if (listeners[i] == ChangeListener.class) {
+ if (changeEvent == null) {
+ changeEvent = new ChangeEvent(this);
+ }
+ ((ChangeListener) listeners[i + 1]).stateChanged(changeEvent);
+ }
+ }
+ }
+
+ public AttributeController getAttributeController() {
+ return attributeController;
+ }
+
+ public String getAttributeViewType() {
+ return attributeViewType;
+ }
+
+ private AttributeRegistryComboBoxColumnModel getCombinedModel() {
+ if (myComboBoxColumnModel == null) {
+ myComboBoxColumnModel = new AttributeRegistryComboBoxColumnModel(this);
+ }
+ return myComboBoxColumnModel;
+ }
+
+ public ComboBoxModel getComboBoxModel() {
+ return getCombinedModel();
+ }
+
+ public ComboBoxModel getDefaultComboBoxModel(final Comparable<?> attrName) {
+ try {
+ final AttributeRegistryElement elem = getElement(attrName);
+ return elem.getValues();
+ }
+ catch (final NoSuchElementException ex) {
+ return getComboBoxModel();
+ }
+ }
+
+ public AttributeRegistryElement getElement(final Comparable<?> attrName) {
+ final AttributeRegistryElement elem = (AttributeRegistryElement) elements.getValue(attrName);
+ return elem;
+ }
+
+ public AttributeRegistryElement getElement(final int index) {
+ return (AttributeRegistryElement) elements.getValue(index);
+ }
+
+ public SortedMapVector getElements() {
+ return elements;
+ }
+
+ public Comparable<?> getKey(final int index) {
+ return elements.getKey(index);
+ }
+
+ public IListModel getListBoxModel() {
+ return getCombinedModel();
+ }
+
+ Boolean getRestriction(final int row) {
+ if (row == AttributeRegistry.GLOBAL) {
+ return restrictionModel;
+ }
+ else {
+ return getElement(row).getRestriction();
+ }
+ }
+
+ /**
+ */
+ public AttributeRegistryTableModel getTableModel() {
+ return myTableModel;
+ }
+
+ /**
+ */
+ public IListModel getValues(final int row) {
+ if (row == AttributeRegistry.GLOBAL) {
+ return getListBoxModel();
+ }
+ return getElement(row).getValues();
+ }
+
+ public int getVisibleElementsNumber() {
+ return visibleElementsNumber;
+ }
+
+ public void incrementVisibleElementsNumber() {
+ visibleElementsNumber++;
+ }
+
+ /**
+ */
+ public int indexOf(final String string) {
+ return elements.indexOf(string);
+ }
+
+ /**
+ */
+ public boolean isRestricted() {
+ return isRestricted;
+ }
+
+ public boolean isRestricted(final String s) {
+ return getRestriction(indexOf(s)).booleanValue();
+ }
+
+ public void registry(final Attribute newAttribute) {
+ final String name = newAttribute.getName();
+ if (name.equals("")) {
+ return;
+ }
+ final Object value = newAttribute.getValue();
+ try {
+ final AttributeRegistryElement elem = getElement(name);
+ elem.addValue(value);
+ }
+ catch (final NoSuchElementException ex) {
+ final AttributeRegistryElement attributeRegistryElement = new AttributeRegistryElement(this, name);
+ attributeRegistryElement.addValue(value);
+ final int index = getElements().add(name, attributeRegistryElement);
+ getTableModel().fireTableRowsInserted(index, index);
+ };
+ fireAttributesChanged();
+ }
+
+ public void registry(final String name) {
+ final AttributeRegistryElement attributeRegistryElement = new AttributeRegistryElement(this, name);
+ final int index = getElements().add(name, attributeRegistryElement);
+ getTableModel().fireTableRowsInserted(index, index);
+ }
+
+ private void registryAttributes(final MapController mapController, final NodeModel node) {
+ final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(node);
+ if (model == null) {
+ return;
+ }
+ for (int i = 0; i < model.getRowCount(); i++) {
+ registry(model.getAttribute(i));
+ }
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ registryAttributes(mapController, child);
+ }
+ }
+
+ /**
+ */
+ void removeAtribute(final Object o) {
+ getAttributeController().performRemoveAttribute(o.toString());
+ }
+
+ public void removeAttributesListener(final IAttributesListener l) {
+ listenerList.remove(IAttributesListener.class, l);
+ }
+
+ public void removeChangeListener(final ChangeListener l) {
+ listenerList.remove(ChangeListener.class, l);
+ }
+
+ /**
+ */
+ public void resetChanges() {
+ if (isAttributeLayoutChanged == false) {
+ return;
+ }
+ restrictionModel = Boolean.valueOf(isRestricted);
+ for (int i = 0; i < elements.size(); i++) {
+ final AttributeRegistryElement element = getElement(i);
+ element.setVisibilityModel(Boolean.valueOf(element.isVisible()));
+ element.setRestrictionModel(Boolean.valueOf(element.isRestricted()));
+ }
+ isAttributeLayoutChanged = false;
+ }
+
+ public void setAttributeLayoutChanged() {
+ isAttributeLayoutChanged = true;
+ }
+
+ public void setAttributeViewType(final String attributeViewType) {
+ this.attributeViewType = attributeViewType;
+ fireStateChanged();
+ }
+
+ /**
+ */
+ public void setRestricted(final boolean b) {
+ isRestricted = b;
+ restrictionModel = Boolean.valueOf(isRestricted);
+ fireAttributesChanged();
+ }
+
+ /**
+ */
+ private void setRestricted(final int row, final boolean b) {
+ getElement(row).setRestriction(b);
+ }
+
+ public void setRestricted(final String s, final boolean b) {
+ setRestricted(indexOf(s), b);
+ }
+
+ /**
+ */
+ public void setRestrictionModel(final int row, final Boolean value) {
+ if (row == AttributeRegistry.GLOBAL) {
+ restrictionModel = value;
+ }
+ else {
+ getElement(row).setRestrictionModel(value);
+ }
+ setAttributeLayoutChanged();
+ myTableModel.fireRestrictionsUpdated(row);
+ }
+
+ public void setVisibilityModel(final int row, final Boolean visible) {
+ final AttributeRegistryElement element = getElement(row);
+ if (!element.getVisibilityModel().equals(visible)) {
+ element.setVisibilityModel(visible);
+ setAttributeLayoutChanged();
+ myTableModel.fireVisibilityUpdated(row);
+ }
+ }
+
+ public int size() {
+ return elements.size();
+ }
+
+ public void unregistry(final String name) {
+ final int index = elements.indexOf(name);
+ if (getElement(index).isVisible()) {
+ decrementVisibleElementsNumber();
+ }
+ elements.remove(index);
+ getTableModel().fireTableRowsDeleted(index, index);
+ fireAttributesChanged();
+ }
+
+ /**
+ * @throws IOException
+ */
+ public void write(final ITreeWriter writer) throws IOException {
+ final XMLElement attributeRegistry = new XMLElement();
+ boolean toBeSaved = false;
+ if (isRestricted()) {
+ attributeRegistry.setAttribute("RESTRICTED", "true");
+ toBeSaved = true;
+ }
+ if (!attributeViewType.equals(AttributeTableLayoutModel.SHOW_ALL)) {
+ attributeRegistry.setAttribute("SHOW_ATTRIBUTES", attributeViewType);
+ toBeSaved = true;
+ }
+ for (int i = 0; i < size(); i++) {
+ final AttributeRegistryElement element = getElement(i);
+ if (element.isRestricted() || element.isVisible() || element.isManual()) {
+ final XMLElement attributeData = element.save();
+ attributeRegistry.addChild(attributeData);
+ toBeSaved = true;
+ }
+ }
+ if (toBeSaved) {
+ attributeRegistry.setName(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY);
+ writer.addElement(this, attributeRegistry);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeRegistryComboBoxColumnModel.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeRegistryComboBoxColumnModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/AttributeRegistryComboBoxColumnModel.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/AttributeRegistryComboBoxColumnModel.java
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeRegistryElement.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeRegistryElement.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/AttributeRegistryElement.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/AttributeRegistryElement.java
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeRegistryTableModel.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeRegistryTableModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/AttributeRegistryTableModel.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/AttributeRegistryTableModel.java
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/AttributeTableLayoutModel.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeTableLayoutModel.java
new file mode 100644
index 0000000..a5ef378
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeTableLayoutModel.java
@@ -0,0 +1,87 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import javax.swing.event.EventListenerList;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class AttributeTableLayoutModel {
+ public static final String HIDE_ALL = "hide";
+ public static final String SHOW_ALL = "extended";
+ public static final String SHOW_SELECTED = "selected";
+ ColumnWidthChangeEvent[] layoutChangeEvent = { null, null };
+ private EventListenerList listenerList = null;
+ final private Quantity<?>[] width = new Quantity<?>[]{
+ ResourceController.getResourceController().getLengthQuantityProperty("default_attribute_key_column_width").in(LengthUnits.pt),
+ ResourceController.getResourceController().getLengthQuantityProperty("default_attribute_value_column_width").in(LengthUnits.pt)
+ };
+
+ public AttributeTableLayoutModel() {
+ super();
+ }
+
+ public void addColumnWidthChangeListener(final IColumnWidthChangeListener l) {
+ getListenerList().add(IColumnWidthChangeListener.class, l);
+ }
+
+ protected void fireColumnWidthChanged(final int col) {
+ final Object[] listeners = getListenerList().getListenerList();
+ for (int i = listeners.length - 2; i >= 0; i -= 2) {
+ if (listeners[i] == IColumnWidthChangeListener.class) {
+ if (layoutChangeEvent[col] == null) {
+ layoutChangeEvent[col] = new ColumnWidthChangeEvent(this, col);
+ }
+ ((IColumnWidthChangeListener) listeners[i + 1]).columnWidthChanged(layoutChangeEvent[col]);
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Quantity<LengthUnits> getColumnWidth(final int col) {
+ return (Quantity<LengthUnits>) width[col];
+ }
+
+ /**
+ * @return Returns the listenerList.
+ */
+ private EventListenerList getListenerList() {
+ if (listenerList == null) {
+ listenerList = new EventListenerList();
+ }
+ return listenerList;
+ }
+
+ public void removeColumnWidthChangeListener(final IColumnWidthChangeListener l) {
+ getListenerList().remove(IColumnWidthChangeListener.class, l);
+ }
+
+ public void setColumnWidth(final int col, final Quantity<LengthUnits> width) {
+ if (! this.width[col].equals(width)) {
+ this.width[col] = width;
+ fireColumnWidthChanged(col);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeViewTypeAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/AttributeViewTypeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/AttributeViewTypeAction.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/AttributeViewTypeAction.java
diff --git a/freeplane/src/org/freeplane/features/attribute/ColumnWidthChangeEvent.java b/freeplane/src/main/java/org/freeplane/features/attribute/ColumnWidthChangeEvent.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/ColumnWidthChangeEvent.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/ColumnWidthChangeEvent.java
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/FontSizeExtension.java b/freeplane/src/main/java/org/freeplane/features/attribute/FontSizeExtension.java
new file mode 100644
index 0000000..e9d0e4a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/FontSizeExtension.java
@@ -0,0 +1,13 @@
+package org.freeplane.features.attribute;
+
+import org.freeplane.core.extension.IExtension;
+
+public class FontSizeExtension implements IExtension {
+
+ public final int fontSize;
+
+ public FontSizeExtension(int size) {
+ this.fontSize = size;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/HideAllAttributesAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/HideAllAttributesAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/HideAllAttributesAction.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/HideAllAttributesAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/IAttributeTableModel.java b/freeplane/src/main/java/org/freeplane/features/attribute/IAttributeTableModel.java
new file mode 100644
index 0000000..5ba42ef
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/IAttributeTableModel.java
@@ -0,0 +1,37 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public interface IAttributeTableModel {
+ Quantity<LengthUnits> getColumnWidth(int col);
+
+ NodeModel getNode();
+
+ int getRowCount();
+
+ Object getValueAt(int row, int col);
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/IAttributesListener.java b/freeplane/src/main/java/org/freeplane/features/attribute/IAttributesListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/IAttributesListener.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/IAttributesListener.java
diff --git a/freeplane/src/org/freeplane/features/attribute/IColumnWidthChangeListener.java b/freeplane/src/main/java/org/freeplane/features/attribute/IColumnWidthChangeListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/IColumnWidthChangeListener.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/IColumnWidthChangeListener.java
diff --git a/freeplane/src/org/freeplane/features/attribute/ModelessAttributeController.java b/freeplane/src/main/java/org/freeplane/features/attribute/ModelessAttributeController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/ModelessAttributeController.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/ModelessAttributeController.java
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/NodeAttributeTableModel.java b/freeplane/src/main/java/org/freeplane/features/attribute/NodeAttributeTableModel.java
new file mode 100644
index 0000000..8b6a139
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/NodeAttributeTableModel.java
@@ -0,0 +1,269 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Vector;
+
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.TableModel;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class NodeAttributeTableModel implements IExtension, IAttributeTableModel, TableModel {
+ private static final int CAPACITY_INCREMENT = 10;
+ public static final NodeAttributeTableModel EMTPY_ATTRIBUTES = new NodeAttributeTableModel(null);
+
+ public static NodeAttributeTableModel getModel(final NodeModel node) {
+ final NodeAttributeTableModel attributes = (NodeAttributeTableModel) node
+ .getExtension(NodeAttributeTableModel.class);
+ return attributes != null ? attributes : NodeAttributeTableModel.EMTPY_ATTRIBUTES;
+ }
+
+ private Vector<Attribute> attributes;
+ private AttributeTableLayoutModel layout;
+ private HashSet<TableModelListener> listeners;
+ final private NodeModel node;
+
+ public NodeAttributeTableModel(final NodeModel node) {
+ this(node, 0);
+ }
+
+ public NodeAttributeTableModel(final NodeModel node, final int size) {
+ super();
+ allocateAttributes(size);
+ this.node = node;
+ }
+
+ public void addRowNoUndo(final Attribute newAttribute) {
+ allocateAttributes(NodeAttributeTableModel.CAPACITY_INCREMENT);
+ final int index = getRowCount();
+ final AttributeRegistry registry = AttributeRegistry.getRegistry(node.getMap());
+ registry.registry(newAttribute);
+ attributes.add(newAttribute);
+ fireTableRowsInserted(index, index);
+ }
+
+ public void addTableModelListener(final TableModelListener listener) {
+ if (listeners == null) {
+ listeners = new HashSet<TableModelListener>();
+ }
+ listeners.add(listener);
+ }
+
+ private void allocateAttributes(final int size) {
+ if (attributes == null && size > 0) {
+ attributes = new Vector<Attribute>(size, NodeAttributeTableModel.CAPACITY_INCREMENT);
+ }
+ }
+
+ public void fireTableCellUpdated(final int row, final int column) {
+ if (listeners == null) {
+ return;
+ }
+ fireTableChanged(new TableModelEvent(this, row, row, column));
+ }
+
+ private void fireTableChanged(final TableModelEvent e) {
+ if (listeners == null) {
+ return;
+ }
+ final ArrayList<TableModelListener> arrayList = new ArrayList<TableModelListener>(listeners);
+ for (final TableModelListener listener : arrayList) {
+ listener.tableChanged(e);
+ }
+ }
+
+ public void fireTableRowsDeleted(final int firstRow, final int lastRow) {
+ if (listeners == null) {
+ return;
+ }
+ fireTableChanged(new TableModelEvent(this, firstRow, lastRow, TableModelEvent.ALL_COLUMNS,
+ TableModelEvent.DELETE));
+ }
+
+ public void fireTableRowsInserted(final int firstRow, final int lastRow) {
+ if (listeners == null) {
+ return;
+ }
+ fireTableChanged(new TableModelEvent(this, firstRow, lastRow, TableModelEvent.ALL_COLUMNS,
+ TableModelEvent.INSERT));
+ }
+
+ public void fireTableRowsUpdated(final int firstRow, final int lastRow) {
+ if (listeners == null) {
+ return;
+ }
+ fireTableChanged(new TableModelEvent(this, firstRow, lastRow, TableModelEvent.ALL_COLUMNS,
+ TableModelEvent.UPDATE));
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.modes.attributes.AttributeTableModel#get(int)
+ */
+ public Attribute getAttribute(final int row) {
+ return attributes.get(row);
+ }
+
+ public List<String> getAttributeKeyList() {
+ final Vector<String> returnValue = new Vector<String>();
+ for (final Attribute attr : getAttributes()) {
+ returnValue.add(attr.getName());
+ }
+ return returnValue;
+ }
+
+ public int getAttributePosition(final String pKey) {
+ if (pKey == null) {
+ return -1;
+ }
+ int pos = 0;
+ for (final Attribute attr : getAttributes()) {
+ if (pKey.equals(attr.getName())) {
+ return pos;
+ }
+ pos++;
+ }
+ return -1;
+ }
+
+ /**
+ * @return a list of Attribute elements.
+ */
+ public Vector<Attribute> getAttributes() {
+ allocateAttributes(NodeAttributeTableModel.CAPACITY_INCREMENT);
+ return attributes;
+ }
+
+ public int getAttributeTableLength() {
+ return getRowCount();
+ }
+
+ public Class<Object> getColumnClass(final int col) {
+ return Object.class;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.TableModel#getColumnCount()
+ */
+ public int getColumnCount() {
+ return 2;
+ }
+
+ public String getColumnName(final int col) {
+ return " ";
+ }
+
+ public Quantity<LengthUnits> getColumnWidth(final int col) {
+ return getLayout().getColumnWidth(col);
+ }
+
+ public AttributeTableLayoutModel getLayout() {
+ if (layout == null) {
+ layout = new AttributeTableLayoutModel();
+ }
+ return layout;
+ }
+
+ public Object getName(final int row) {
+ final Attribute attr = attributes.get(row);
+ return attr.getName();
+ }
+
+ public NodeModel getNode() {
+ return node;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.TableModel#getRowCount()
+ */
+ public int getRowCount() {
+ return attributes == null ? 0 : attributes.size();
+ }
+
+ public Object getValue(final int row) {
+ final Attribute attr = attributes.get(row);
+ return attr.getValue();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.TableModel#getValueAt(int, int)
+ */
+ public Object getValueAt(final int row, final int col) {
+ if (attributes != null) {
+ switch (col) {
+ case 0:
+ return getName(row);
+ case 1:
+ return getValue(row);
+ }
+ }
+ return null;
+ }
+
+ public boolean isCellEditable(final int arg0, final int arg1) {
+ return false;
+ }
+
+ public void removeTableModelListener(final TableModelListener listener) {
+ if (listeners == null) {
+ return;
+ }
+ listeners.remove(listener);
+ }
+
+ public void setName(final int row, final Object newName) {
+ final Attribute attr = attributes.get(row);
+ attr.setName(newName.toString());
+ fireTableRowsUpdated(row, row);
+ }
+
+ public void setValue(final int row, final Object newValue) {
+ final Attribute attr = attributes.get(row);
+ attr.setValue(newValue);
+ fireTableRowsUpdated(row, row);
+ }
+
+ public void setValueAt(final Object value, final int rowIndex, final int columnIndex) {
+ switch (columnIndex) {
+ case 0:
+ setName(rowIndex, value);
+ return;
+ case 1:
+ setValue(rowIndex, value);
+ return;
+ default:
+ throw new ArrayIndexOutOfBoundsException(columnIndex + " >= 2");
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/ShowAllAttributesAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/ShowAllAttributesAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/ShowAllAttributesAction.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/ShowAllAttributesAction.java
diff --git a/freeplane/src/org/freeplane/features/attribute/ShowSelectedAttributesAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/ShowSelectedAttributesAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/ShowSelectedAttributesAction.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/ShowSelectedAttributesAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AddAttributeAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AddAttributeAction.java
new file mode 100644
index 0000000..7a496f0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AddAttributeAction.java
@@ -0,0 +1,183 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Stefan Ott in 2011.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.Collection;
+import java.util.NoSuchElementException;
+
+import javax.swing.ComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.border.EtchedBorder;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.ui.components.TypedListCellRenderer;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.AttributeRegistry;
+import org.freeplane.features.attribute.AttributeRegistryElement;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.attribute.mindmapmode.AssignAttributeDialog.ClonedComboBoxModel;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at EnabledAction(checkOnNodeChange = true)
+public class AddAttributeAction extends AFreeplaneAction {
+ /**
+ * @author Stefan Ott
+ *
+ * This action adds an attribute to all selected nodes
+ */
+ private static final long serialVersionUID = 1L;
+ private JComboBox attributeNames = null;
+ private JComboBox attributeValues = null;
+ private final AttributeController attrContr = AttributeController.getController();
+
+ public AddAttributeAction() {
+ super("attributes_AddAttributeAction");
+ };
+
+ public void actionPerformed(final ActionEvent arg0) {
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ final int selection = UITools.showConfirmDialog(Controller.getCurrentController().getSelection().getSelected(),
+ getPanel(), TextUtils.getText("attributes_AddAttributeAction.text"),
+ JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
+ //OK button pressed
+ if (selection == JOptionPane.OK_OPTION) {
+ if (attributeNames.getSelectedItem() == null) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ final String name = attributeNames.getSelectedItem().toString();
+ if (name.equals("")) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ final Object valueSelectedItem = attributeValues.getSelectedItem();
+ final String value = valueSelectedItem != null ? valueSelectedItem.toString() : "";
+ //Add attributes to nodes
+ for (final NodeModel node : nodes) {
+ final NodeAttributeTableModel attributes = attrContr.createAttributeTableModel(node);
+ attrContr.performInsertRow(attributes, attributes.getRowCount(), name, value);
+ }
+ }
+ }
+
+ /**
+ * This method creates the input dialog
+ *
+ * @return : the input dialog
+ */
+ private JPanel getPanel() {
+ final JPanel panel = new JPanel();
+ panel.setLayout(new GridBagLayout());
+ panel.setBorder(new EtchedBorder());
+ final GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = GridBagConstraints.CENTER;
+ gridBagConstraints.insets = new Insets(20, 10, 2, 10);
+ // Size of JComboBoxes
+ final String pattern = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
+ final JLabel patternLabel = new JLabel(pattern);
+ final Dimension comboBoxMaximumSize = patternLabel.getPreferredSize();
+ comboBoxMaximumSize.width += 4;
+ comboBoxMaximumSize.height += 10;
+ //Label: name
+ final JLabel nameLabel = new JLabel(TextUtils.getText("attribute_name"));
+ panel.add(nameLabel, gridBagConstraints);
+ gridBagConstraints.gridx++;
+ //Label: value
+ final JLabel valueLabel = new JLabel(TextUtils.getText("attribute_value"));
+ panel.add(valueLabel, gridBagConstraints);
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy++;
+ //Attribute name combo-box
+ gridBagConstraints.insets = new Insets(2, 10, 20, 10);
+ attributeNames = new JComboBoxWithBorder();
+ final MapModel map = Controller.getCurrentController().getMap();
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
+ final ComboBoxModel names = attributes.getComboBoxModel();
+ attributeNames.setModel(new ClonedComboBoxModel(names));
+ attributeNames.setEditable(true);
+ attributeNames.setMaximumSize(comboBoxMaximumSize);
+ attributeNames.setPreferredSize(comboBoxMaximumSize);
+ attributeNames.addItemListener(new ItemListener() {
+ public void itemStateChanged(final ItemEvent e) {
+ selectedAttributeChanged(e.getItem(), attributeValues);
+ }
+ });
+ panel.add(attributeNames, gridBagConstraints);
+ //Attribute value combo-box
+ attributeValues = new JComboBoxWithBorder();
+ attributeValues.setRenderer(new TypedListCellRenderer());
+ attributeValues.setMaximumSize(comboBoxMaximumSize);
+ attributeValues.setPreferredSize(comboBoxMaximumSize);
+ gridBagConstraints.gridx++;
+ panel.add(attributeValues, gridBagConstraints);
+ //set focus to attributeNames
+ panel.addHierarchyListener(new HierarchyListener() {
+ public void hierarchyChanged(HierarchyEvent e) {
+ final Component component = e.getComponent();
+ if(component.isShowing()){
+ attributeNames.requestFocus();
+ component.removeHierarchyListener(this);
+ }
+ }
+ });
+ return panel;
+ }
+
+ protected void selectedAttributeChanged(final Object selectedAttributeName, final JComboBox values) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
+ try {
+ final AttributeRegistryElement element = attributes.getElement(selectedAttributeName.toString());
+ final ComboBoxModel selectedValues = element.getValues();
+ values.setModel(new ClonedComboBoxModel(selectedValues));
+ try {
+ final Object firstValue = selectedValues.getElementAt(0);
+ values.setSelectedItem(firstValue);
+ }
+ catch (final ArrayIndexOutOfBoundsException ex) {
+ }
+ values.setEditable(!element.isRestricted());
+ }
+ catch (final NoSuchElementException ex) {
+ values.setEditable(!selectedAttributeName.toString().equals(""));
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AssignAttributeDialog.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AssignAttributeDialog.java
new file mode 100644
index 0000000..7655b2c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AssignAttributeDialog.java
@@ -0,0 +1,509 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import javax.swing.AbstractListModel;
+import javax.swing.Box;
+import javax.swing.ButtonGroup;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JRadioButton;
+import javax.swing.border.Border;
+import javax.swing.border.CompoundBorder;
+import javax.swing.border.EmptyBorder;
+import javax.swing.border.EtchedBorder;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ListDataListener;
+
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.ui.components.TypedListCellRenderer;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.attribute.Attribute;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.AttributeRegistry;
+import org.freeplane.features.attribute.AttributeRegistryElement;
+import org.freeplane.features.attribute.IAttributesListener;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+class AssignAttributeDialog extends JDialog implements IAttributesListener, IMapSelectionListener {
+ private class AddAction extends IteratingAction {
+ private String name;
+ private String value;
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ if (attributeNames.getSelectedItem() == null) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ name = attributeNames.getSelectedItem().toString();
+ if (name.equals("")) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ final Object valueSelectedItem = attributeValues.getSelectedItem();
+ value = valueSelectedItem != null ? valueSelectedItem.toString() : "";
+ super.actionPerformed(e);
+ if (valueSelectedItem == null) {
+ selectedAttributeChanged(name, attributeValues);
+ }
+ }
+
+ @Override
+ protected void performAction(final NodeModel model) {
+ attributeController.createAttributeTableModel(model);
+ final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(model);
+ attributeController.performInsertRow(attributes, attributes.getRowCount(), name, value);
+ }
+ }
+
+ protected static class ClonedComboBoxModel extends AbstractListModel implements ComboBoxModel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Object selectedItem;
+ final private AbstractListModel sharedListModel;
+
+ public ClonedComboBoxModel(final ComboBoxModel sharedListModel) {
+ super();
+ this.sharedListModel = (AbstractListModel) sharedListModel;
+ }
+
+ @Override
+ public void addListDataListener(final ListDataListener l) {
+ super.addListDataListener(l);
+ sharedListModel.addListDataListener(l);
+ }
+
+ public Object getElementAt(final int index) {
+ return sharedListModel.getElementAt(index);
+ }
+
+ public Object getSelectedItem() {
+ return selectedItem;
+ }
+
+ public int getSize() {
+ return sharedListModel.getSize();
+ }
+
+ @Override
+ public void removeListDataListener(final ListDataListener l) {
+ super.removeListDataListener(l);
+ sharedListModel.removeListDataListener(l);
+ }
+
+ public void setSelectedItem(final Object anItem) {
+ selectedItem = anItem;
+ fireContentsChanged(this, -1, -1);
+ }
+ }
+
+ private class DeleteAttributeAction extends IteratingAction {
+ private String name;
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ final Object selectedItem = attributeNames.getSelectedItem();
+ if (selectedItem == null) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ name = selectedItem.toString();
+ if (name.equals("")) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ super.actionPerformed(e);
+ }
+
+ @Override
+ protected void performAction(final NodeModel model) {
+ final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(model);
+ for (int i = attributes.getRowCount() - 1; i >= 0; i--) {
+ if (attributes.getAttribute(i).getName().equals(name)) {
+ attributeController.performRemoveRow(attributes, i);
+ }
+ }
+ }
+ }
+
+ private class DeleteValueAction extends IteratingAction {
+ private String name;
+ private String value;
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ if (attributeNames.getSelectedItem() == null) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ name = attributeNames.getSelectedItem().toString();
+ if (name.equals("")) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ final Object valueSelectedItem = attributeValues.getSelectedItem();
+ value = valueSelectedItem != null ? valueSelectedItem.toString() : "";
+ super.actionPerformed(e);
+ }
+
+ @Override
+ protected void performAction(final NodeModel model) {
+ final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(model);
+ for (int i = attributes.getRowCount() - 1; i >= 0; i--) {
+ final Attribute attribute = attributes.getAttribute(i);
+ if (attribute.getName().equals(name) && attribute.getValue().equals(value)) {
+ attributeController.performRemoveRow(attributes, i);
+ }
+ }
+ }
+ }
+
+ private abstract class IteratingAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ try {
+ if (selectedBtn.getModel().isSelected()) {
+ final Collection<NodeModel> selecteds = mapSelection.getSelection();
+ final Iterator<NodeModel> iterator = selecteds.iterator();
+ while (iterator.hasNext()) {
+ final NodeModel selectedNodeView = iterator.next();
+ performAction(selectedNodeView);
+ }
+ return;
+ }
+ final NodeModel nodeView = Controller.getCurrentController().getMap().getRootNode();
+ iterate(nodeView);
+ }
+ catch (final NullPointerException ex) {
+ }
+ }
+
+ private void iterate(final NodeModel node) {
+ if (node.hasVisibleContent()) {
+ if (!node.isRoot() || !skipRootBtn.isSelected()) {
+ performAction(node);
+ }
+ }
+ if (node.isFolded()) {
+ return;
+ }
+ final Iterator<NodeModel> iterator = node.getChildren().iterator();
+ while (iterator.hasNext()) {
+ iterate(iterator.next());
+ }
+ }
+
+ abstract protected void performAction(NodeModel model);
+
+ }
+
+ private class ReplaceValueAction extends IteratingAction {
+ private String name;
+ private String replacingName;
+ private String replacingValue;
+ private String value;
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ if (attributeNames.getSelectedItem() == null) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ if (replacingAttributeNames.getSelectedItem() == null) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ name = attributeNames.getSelectedItem().toString();
+ if (name.equals("")) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ replacingName = replacingAttributeNames.getSelectedItem().toString();
+ if (replacingName.equals("")) {
+ UITools.showAttributeEmptyStringErrorMessage();
+ return;
+ }
+ final Object valueSelectedItem = attributeValues.getSelectedItem();
+ value = valueSelectedItem != null ? valueSelectedItem.toString() : "";
+ final Object replacingValueSelectedItem = replacingAttributeValues.getSelectedItem();
+ replacingValue = replacingValueSelectedItem != null ? replacingValueSelectedItem.toString() : "";
+ super.actionPerformed(e);
+ }
+
+ @Override
+ protected void performAction(final NodeModel model) {
+ final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(model);
+ for (int i = attributes.getRowCount() - 1; i >= 0; i--) {
+ final Attribute attribute = attributes.getAttribute(i);
+ if (attribute.getName().equals(name) && attribute.getValue().equals(value)) {
+ attributeController.performRemoveRow(attributes, i);
+ attributeController.performInsertRow(attributes, i, replacingName, replacingValue);
+ }
+ }
+ }
+ }
+
+ private static final Dimension maxButtonDimension = new Dimension(1000, 1000);
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private AttributeController attributeController;
+ final private JComboBox attributeNames;
+ final private JComboBox attributeValues;
+ private IMapSelection mapSelection;
+ final private JComboBox replacingAttributeNames;
+ final private JComboBox replacingAttributeValues;
+ final private JRadioButton selectedBtn;
+ final private JCheckBox skipRootBtn;
+ final private JRadioButton visibleBtn;
+
+ public AssignAttributeDialog(final AttributeController attributeController, final Frame frame) {
+ super(frame, TextUtils.getText("attributes_assign_dialog"), false);
+ this.attributeController = attributeController;
+ mapSelection = Controller.getCurrentController().getSelection();
+ final Border actionBorder = new CompoundBorder(new EmptyBorder(5, 10, 0, 10), new CompoundBorder(
+ new EtchedBorder(), new EmptyBorder(5, 5, 5, 5)));
+ final Border emptyBorder = new EmptyBorder(5, 5, 5, 5);
+ final Border btnBorder = new EmptyBorder(2, 2, 2, 2);
+ selectedBtn = new JRadioButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(selectedBtn, TextUtils.getRawText("attributes_for_selected"));
+ selectedBtn.setSelected(true);
+ visibleBtn = new JRadioButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(visibleBtn, TextUtils.getRawText("attributes_for_visible"));
+ final ButtonGroup group = new ButtonGroup();
+ group.add(selectedBtn);
+ group.add(visibleBtn);
+ skipRootBtn = new JCheckBox();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(skipRootBtn, TextUtils.getRawText("attributes_skip_root"));
+ skipRootBtn.setSelected(true);
+ final Box selectionBox = Box.createHorizontalBox();
+ selectionBox.setBorder(emptyBorder);
+ selectionBox.add(Box.createHorizontalGlue());
+ selectionBox.add(selectedBtn);
+ selectionBox.add(Box.createHorizontalGlue());
+ selectionBox.add(visibleBtn);
+ selectionBox.add(Box.createHorizontalGlue());
+ selectionBox.add(skipRootBtn);
+ selectionBox.add(Box.createHorizontalGlue());
+ getContentPane().add(selectionBox, BorderLayout.NORTH);
+ final JButton addBtn = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(addBtn, TextUtils.getRawText("filter_add"));
+ addBtn.addActionListener(new AddAction());
+ addBtn.setMaximumSize(AssignAttributeDialog.maxButtonDimension);
+ final JButton deleteAttributeBtn = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(deleteAttributeBtn, TextUtils.getRawText("attribute_delete"));
+ deleteAttributeBtn.addActionListener(new DeleteAttributeAction());
+ deleteAttributeBtn.setMaximumSize(AssignAttributeDialog.maxButtonDimension);
+ final JButton deleteAttributeValueBtn = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(deleteAttributeValueBtn, TextUtils.getRawText("attribute_delete_value"));
+ deleteAttributeValueBtn.addActionListener(new DeleteValueAction());
+ deleteAttributeValueBtn.setMaximumSize(AssignAttributeDialog.maxButtonDimension);
+ final JButton replaceBtn = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(replaceBtn, TextUtils.getRawText("attribute_replace"));
+ replaceBtn.addActionListener(new ReplaceValueAction());
+ replaceBtn.setMaximumSize(AssignAttributeDialog.maxButtonDimension);
+ UITools.addEscapeActionToDialog(this);
+ // Size of JComboBoxes (30 chars)
+ final String pattern = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
+ final JLabel patternLabel = new JLabel(pattern);
+ final Dimension comboBoxMaximumSize = patternLabel.getPreferredSize();
+ comboBoxMaximumSize.width += 4;
+ comboBoxMaximumSize.height += 10;
+ attributeNames = new JComboBoxWithBorder();
+ attributeNames.setMaximumSize(comboBoxMaximumSize);
+ attributeNames.setPreferredSize(comboBoxMaximumSize);
+ attributeNames.addItemListener(new ItemListener() {
+ public void itemStateChanged(final ItemEvent e) {
+ selectedAttributeChanged(e.getItem(), attributeValues);
+ }
+ });
+ attributeValues = new JComboBoxWithBorder();
+ attributeValues.setRenderer(new TypedListCellRenderer());
+ attributeValues.setMaximumSize(comboBoxMaximumSize);
+ attributeValues.setPreferredSize(comboBoxMaximumSize);
+ replacingAttributeNames = new JComboBoxWithBorder();
+ replacingAttributeNames.setMaximumSize(comboBoxMaximumSize);
+ replacingAttributeNames.setPreferredSize(comboBoxMaximumSize);
+ replacingAttributeNames.addItemListener(new ItemListener() {
+ public void itemStateChanged(final ItemEvent e) {
+ selectedAttributeChanged(e.getItem(), replacingAttributeValues);
+ }
+ });
+ replacingAttributeValues = new JComboBoxWithBorder();
+ replacingAttributeValues.setRenderer(new TypedListCellRenderer());
+ replacingAttributeValues.setMaximumSize(comboBoxMaximumSize);
+ replacingAttributeValues.setPreferredSize(comboBoxMaximumSize);
+ final Box addDeleteBtnBox = Box.createVerticalBox();
+ addDeleteBtnBox.setBorder(btnBorder);
+ addDeleteBtnBox.add(Box.createVerticalGlue());
+ addDeleteBtnBox.add(addBtn);
+ addDeleteBtnBox.add(deleteAttributeBtn);
+ addDeleteBtnBox.add(deleteAttributeValueBtn);
+ addDeleteBtnBox.add(Box.createVerticalGlue());
+ final Box addDeleteBox = Box.createHorizontalBox();
+ addDeleteBox.setBorder(actionBorder);
+ addDeleteBox.add(Box.createHorizontalGlue());
+ addDeleteBox.add(addDeleteBtnBox);
+ addDeleteBox.add(Box.createHorizontalStrut(5));
+ addDeleteBox.add(attributeNames);
+ addDeleteBox.add(Box.createHorizontalStrut(5));
+ addDeleteBox.add(attributeValues);
+ addDeleteBox.add(Box.createHorizontalStrut(5));
+ final Box outerReplaceBox = Box.createVerticalBox();
+ outerReplaceBox.setBorder(actionBorder);
+ final Box replaceBox = Box.createHorizontalBox();
+ replaceBox.setBorder(btnBorder);
+ replaceBox.add(Box.createHorizontalGlue());
+ replaceBox.add(replaceBtn);
+ replaceBox.add(Box.createHorizontalStrut(5));
+ replaceBox.add(replacingAttributeNames);
+ replaceBox.add(Box.createHorizontalStrut(5));
+ replaceBox.add(replacingAttributeValues);
+ replaceBox.add(Box.createHorizontalStrut(5));
+ outerReplaceBox.add(Box.createVerticalGlue());
+ outerReplaceBox.add(replaceBox);
+ outerReplaceBox.add(Box.createVerticalGlue());
+ final Box actionBox = Box.createVerticalBox();
+ actionBox.add(Box.createVerticalGlue());
+ actionBox.add(addDeleteBox);
+ actionBox.add(Box.createVerticalStrut(5));
+ actionBox.add(outerReplaceBox);
+ actionBox.add(Box.createVerticalGlue());
+ getContentPane().add(actionBox, BorderLayout.CENTER);
+ final JButton closeBtn = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(closeBtn, TextUtils.getRawText("simplyhtml.closeBtnName"));
+ closeBtn.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ dispose();
+ }
+ });
+ final Box bottomBox = Box.createHorizontalBox();
+ bottomBox.setBorder(emptyBorder);
+ bottomBox.add(Box.createHorizontalGlue());
+ bottomBox.add(closeBtn);
+ bottomBox.add(Box.createHorizontalGlue());
+ getContentPane().add(bottomBox, BorderLayout.SOUTH);
+ pack();
+ comboBoxMaximumSize.width = 1000;
+ attributeNames.setMaximumSize(comboBoxMaximumSize);
+ attributeValues.setMaximumSize(comboBoxMaximumSize);
+ replacingAttributeNames.setMaximumSize(comboBoxMaximumSize);
+ replacingAttributeValues.setMaximumSize(comboBoxMaximumSize);
+ afterMapChange(null, Controller.getCurrentController().getMap());
+ Controller.getCurrentController().getMapViewManager().addMapSelectionListener(this);
+ }
+
+ public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
+ if (oldMap != null) {
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(oldMap);
+ if (attributes != null) {
+ attributes.removeAttributesListener(this);
+ }
+ }
+ if (newMap == null) {
+ setVisible(false);
+ return;
+ }
+ mapSelection = Controller.getCurrentController().getSelection();
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(newMap);
+ if (attributes == null) {
+ setVisible(false);
+ return;
+ }
+ attributes.addAttributesListener(this);
+ attributesChanged();
+ }
+
+ private void attributesChanged() {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
+ final ComboBoxModel names = attributes.getComboBoxModel();
+ attributeNames.setModel(new ClonedComboBoxModel(names));
+ attributeNames.setEditable(!attributes.isRestricted());
+ replacingAttributeNames.setModel(new ClonedComboBoxModel(names));
+ replacingAttributeNames.setEditable(!attributes.isRestricted());
+ if (attributes.size() > 0) {
+ final Object first = names.getElementAt(0);
+ attributeNames.setSelectedItem(first);
+ replacingAttributeNames.setSelectedItem(first);
+ selectedAttributeChanged(attributeNames.getSelectedItem(), attributeValues);
+ selectedAttributeChanged(replacingAttributeNames.getSelectedItem(), replacingAttributeValues);
+ }
+ else {
+ attributeValues.setModel(new DefaultComboBoxModel());
+ attributeValues.setEditable(false);
+ replacingAttributeValues.setModel(new DefaultComboBoxModel());
+ replacingAttributeValues.setEditable(false);
+ }
+ }
+
+ public void attributesChanged(final ChangeEvent e) {
+ attributesChanged();
+ }
+
+ public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
+ }
+
+ private void selectedAttributeChanged(final Object selectedAttributeName, final JComboBox values) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
+ try {
+ final AttributeRegistryElement element = attributes.getElement(selectedAttributeName.toString());
+ final ComboBoxModel selectedValues = element.getValues();
+ values.setModel(new ClonedComboBoxModel(selectedValues));
+ try {
+ final Object firstValue = selectedValues.getElementAt(0);
+ values.setSelectedItem(firstValue);
+ }
+ catch (final ArrayIndexOutOfBoundsException ex) {
+ }
+ values.setEditable(!element.isRestricted());
+ }
+ catch (final NoSuchElementException ex) {
+ values.setEditable(!selectedAttributeName.toString().equals(""));
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AssignAttributesAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AssignAttributesAction.java
new file mode 100644
index 0000000..3bd5bfd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AssignAttributesAction.java
@@ -0,0 +1,48 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.mode.Controller;
+
+class AssignAttributesAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private AssignAttributeDialog assignAttributeDialog;
+
+ public AssignAttributesAction() {
+ super("AssignAttributesAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ if (assignAttributeDialog == null) {
+ assignAttributeDialog = new AssignAttributeDialog(AttributeController.getController(),
+ UITools.getCurrentFrame());
+ }
+ assignAttributeDialog.setVisible(true);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AttributeManagerDialog.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AttributeManagerDialog.java
new file mode 100644
index 0000000..c9ff0b5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AttributeManagerDialog.java
@@ -0,0 +1,267 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Box;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.WindowConstants;
+import javax.swing.border.EmptyBorder;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.collection.IListModel;
+import org.freeplane.features.attribute.AttributeRegistry;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class AttributeManagerDialog extends JDialog implements IMapSelectionListener {
+ private class ApplyAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ ApplyAction() {
+ super("ApplyAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public void actionPerformed(final ActionEvent e) {
+ applyChanges();
+ Controller.getCurrentModeController().startTransaction();
+ }
+ }
+
+ private class CancelAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ CancelAction() {
+ super("CancelAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public void actionPerformed(final ActionEvent e) {
+ resetChanges();
+ AttributeManagerDialog.this.setVisible(false);
+ }
+ }
+
+ private class ClosingListener extends WindowAdapter {
+ @Override
+ public void windowClosing(final WindowEvent e) {
+ resetChanges();
+ super.windowClosing(e);
+ setVisible(false);
+ }
+ }
+
+ class EditListAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String labelText;
+ private IListModel listBoxModel;
+ private int row = 0;
+ private String title;
+
+ public EditListAction() {
+ super(null, AttributeManagerDialog.editButtonImage);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ ListDialog.showDialog((Component) e.getSource(), AttributeManagerDialog.this, labelText, title,
+ listBoxModel, "xxxxxxxxxxxxxxxxxxxxx");
+ }
+
+ public int getRow() {
+ return row;
+ }
+
+ public void setListBoxModel(final String title, final String labelText, final IListModel listBoxModel) {
+ this.title = title;
+ this.labelText = labelText;
+ this.listBoxModel = listBoxModel;
+ }
+
+ public void setRow(final int row) {
+ this.row = row;
+ }
+ }
+
+ private class ImportAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ ImportAction() {
+ super("ImportAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public void actionPerformed(final ActionEvent e) {
+ if (importDialog == null) {
+ importDialog = new ImportAttributesDialog(AttributeManagerDialog.this);
+ }
+ importDialog.show();
+ }
+ }
+
+ private class OKAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ OKAction() {
+ super("OKAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public void actionPerformed(final ActionEvent e) {
+ applyChanges();
+ AttributeManagerDialog.this.setVisible(false);
+ }
+ }
+
+ static final Icon editButtonImage = new ImageIcon(ResourceController.getResourceController().getResource(
+ "/images/edit12.png"));
+ private static final long serialVersionUID = 1L;
+// // final private Controller controller;
+ private ImportAttributesDialog importDialog = null;
+ private AttributeRegistry model;
+ final private JTable view;
+
+ public AttributeManagerDialog( final Frame frame) {
+ super(frame, TextUtils.getText("attributes_dialog_title"), true);
+ Controller controller = Controller.getCurrentController();
+// this.controller = controller;
+ view = new AttributeRegistryTable(new EditListAction());
+ model = AttributeRegistry.getRegistry(controller.getMap());
+ view.setModel(model.getTableModel());
+ view.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ view.getTableHeader().setReorderingAllowed(false);
+ final JScrollPane scrollPane = new JScrollPane(view);
+ getContentPane().add(scrollPane, BorderLayout.CENTER);
+ final Box southButtons = Box.createHorizontalBox();
+ southButtons.setBorder(new EmptyBorder(5, 5, 5, 5));
+ getContentPane().add(southButtons, BorderLayout.SOUTH);
+ southButtons.add(Box.createHorizontalGlue());
+ final JButton ok = new JButton(new OKAction());
+ southButtons.add(ok);
+ southButtons.add(Box.createHorizontalGlue());
+ final JButton apply = new JButton(new ApplyAction());
+ southButtons.add(apply);
+ southButtons.add(Box.createHorizontalGlue());
+ final JButton cancel = new JButton(new CancelAction());
+ southButtons.add(cancel);
+ southButtons.add(Box.createHorizontalGlue());
+ final JButton importBtn = new JButton(new ImportAction());
+ importBtn.setToolTipText(TextUtils.getText("attributes_import_tooltip"));
+ southButtons.add(importBtn);
+ southButtons.add(Box.createHorizontalGlue());
+ UITools.addEscapeActionToDialog(this);
+ setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ addWindowListener(new ClosingListener());
+ controller.getMapViewManager().addMapSelectionListener(this);
+ }
+
+ public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
+ if (newMap != null) {
+ model = AttributeRegistry.getRegistry(newMap);
+ if (model != null) {
+ view.setModel(model.getTableModel());
+ }
+ else {
+ setVisible(false);
+ }
+ }
+ }
+
+ private void applyChanges() {
+ model.applyChanges();
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ modeController.delayedCommit();
+ final MapController mapController = modeController.getMapController();
+ final MapModel map = Controller.getCurrentController().getMap();
+ assert(AttributeRegistry.getRegistry(map) == model);
+ mapController.setSaved(map, false);
+ }
+
+ public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
+ }
+
+ private void resetChanges() {
+ model.resetChanges();
+ Controller.getCurrentModeController().rollback();
+ }
+
+ @Override
+ public void show() {
+ Controller.getCurrentModeController().startTransaction();
+ super.show();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeRegistryTable.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AttributeRegistryTable.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeRegistryTable.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AttributeRegistryTable.java
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeUtilities.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AttributeUtilities.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeUtilities.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/AttributeUtilities.java
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/CopyAttributes.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/CopyAttributes.java
new file mode 100644
index 0000000..4f9b137
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/CopyAttributes.java
@@ -0,0 +1,169 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.attribute.Attribute;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+
+ at EnabledAction(checkOnNodeChange=true)
+class CopyAttributes extends AFreeplaneAction {
+ private static Object[] attributes = null;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public static Object[] getAttributes() {
+ return attributes;
+ }
+
+ public CopyAttributes() {
+ super("CopyAttributes");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ copyAttributes(node);
+ }
+
+ /**
+ */
+ private void copyAttributes(final NodeModel node) {
+ final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(node);
+ if(model == null){
+ attributes = null;
+ return;
+ }
+ final int attributeTableLength = model.getAttributeTableLength();
+ attributes = new Object[attributeTableLength * 2];
+ for(int i = 0; i < attributeTableLength; i++){
+ final Attribute attribute = model.getAttribute(i);
+ attributes[2 * i] = attribute.getName();
+ attributes[2 * i+1] = attribute.getValue();
+ }
+ }
+ @Override
+ public void setEnabled() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ if(node != null){
+ final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(node);
+ setEnabled(model != null && model.getAttributeTableLength() > 0);
+ }
+ else
+ setEnabled(false);
+ }
+}
+
+ at EnabledAction(checkOnNodeChange = true)
+class PasteAttributes extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public PasteAttributes() {
+ super("PasteAttributes");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ pasteAttributes(node);
+ }
+
+ /**
+ */
+ private void pasteAttributes(final NodeModel node) {
+ Object[] attributes = CopyAttributes.getAttributes();
+ if (attributes == null) {
+ JOptionPane.showMessageDialog(Controller.getCurrentController().getViewController().getCurrentRootComponent(), TextUtils
+ .getText("no_copy_attributes_before_paste_attributes"), "" /*=Title*/, JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ final MAttributeController controller = MAttributeController.getController();
+ for(int i = 0; i < attributes.length;){
+ final String name = attributes[i++].toString();
+ final Object value = attributes[i++];
+ controller.addAttribute(node, new Attribute(name, value));
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ setEnabled(CopyAttributes.getAttributes() != null);
+ }
+}
+
+ at EnabledAction(checkOnNodeChange = true)
+class AddStyleAttributes extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public AddStyleAttributes() {
+ super("AddStyleAttributes");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ pasteAttributes(node);
+ }
+
+ /**
+ */
+ private void pasteAttributes(final NodeModel node) {
+ final NodeModel model = getAttributes(node);
+ if(model == null){
+ return;
+ }
+ final MAttributeController controller = MAttributeController.getController();
+ controller.copyAttributesToNode(model, node);
+ }
+
+ private NodeModel getAttributes(final NodeModel node) {
+ final IStyle style = LogicalStyleController.getController().getFirstStyle(node);
+ final MapStyleModel extension = MapStyleModel.getExtension(node.getMap());
+ final NodeModel styleNode = extension.getStyleNode(style);
+ return styleNode;
+ }
+
+ @Override
+ public void setEnabled() {
+ for (final NodeModel selected : Controller.getCurrentModeController().getMapController().getSelectedNodes()) {
+ if(getAttributes(selected) != null){
+ setEnabled(true);
+ return;
+ }
+ }
+ setEnabled(false);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/ImportAttributesDialog.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/ImportAttributesDialog.java
new file mode 100644
index 0000000..d7251fb
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/ImportAttributesDialog.java
@@ -0,0 +1,360 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.Iterator;
+import java.util.Map.Entry;
+
+import javax.swing.Box;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JTree;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeNode;
+import javax.swing.tree.TreeSelectionModel;
+
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.collection.SortedComboBoxModel;
+import org.freeplane.features.attribute.AttributeRegistry;
+import org.freeplane.features.attribute.AttributeRegistryElement;
+import org.freeplane.features.icon.IconStore;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.IMapViewManager;
+
+class ImportAttributesDialog extends JDialog implements TreeSelectionListener {
+ private static final IconStore STORE = IconStoreFactory.create();
+
+ static private class AttributeTreeNodeInfo extends TreeNodeInfo {
+ final private boolean restricted;
+
+ public AttributeTreeNodeInfo(final String info, final boolean restricted) {
+ super(info);
+ this.restricted = restricted;
+ }
+
+ boolean isRestricted() {
+ return restricted;
+ }
+ }
+
+ static private class MyRenderer extends DefaultTreeCellRenderer {
+ static final Icon iconFull = STORE.getUIIcon("ok_button.png").getIcon();
+ static final Icon iconNotSelected = STORE.getUIIcon("cancel_button.png").getIcon();
+ static final Icon iconPartial = STORE.getUIIcon("forward.png").getIcon();
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public MyRenderer() {
+ }
+
+ @Override
+ public Component getTreeCellRendererComponent(final JTree tree, final Object value, final boolean sel,
+ final boolean expanded, final boolean leaf, final int row,
+ final boolean hasFocus) {
+ super.getTreeCellRendererComponent(tree, value, false, expanded, leaf, row, false);
+ final DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
+ final TreeNodeInfo info = (TreeNodeInfo) node.getUserObject();
+ switch (info.getSelected()) {
+ case TreeNodeInfo.FULL_SELECTED:
+ setIcon(MyRenderer.iconFull);
+ break;
+ case TreeNodeInfo.PARTIAL_SELECTED:
+ setIcon(MyRenderer.iconPartial);
+ break;
+ case TreeNodeInfo.NOT_SELECTED:
+ setIcon(MyRenderer.iconNotSelected);
+ break;
+ }
+ return this;
+ }
+ }
+
+ static private class TreeNodeInfo {
+ static final private int FULL_SELECTED = 0;
+ static final private int NOT_SELECTED = 2;
+ static final private int PARTIAL_SELECTED = 1;
+ final private String info;
+ private int selected;
+
+ public TreeNodeInfo(final String info) {
+ this.info = info;
+ selected = TreeNodeInfo.NOT_SELECTED;
+ }
+
+ String getInfo() {
+ return info;
+ }
+
+ int getSelected() {
+ return selected;
+ }
+
+ void setSelected(final int selected) {
+ this.selected = selected;
+ }
+
+ @Override
+ public String toString() {
+ return info;
+ }
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+// // final private Controller controller;
+ private AttributeRegistry currentAttributes;
+ final private Component parentComponent;
+ MyRenderer renderer = null;
+ final private JScrollPane scrollPane;
+ final private DefaultMutableTreeNode topNode;
+ final private JTree tree;
+ final private DefaultTreeModel treeModel;
+
+ public ImportAttributesDialog( final Component parentComponent) {
+ super(UITools.getCurrentFrame(), TextUtils
+ .getText("attributes_import"), true);
+// this.controller = controller;
+ this.parentComponent = parentComponent;
+ final TreeNodeInfo nodeInfo = new TreeNodeInfo(TextUtils.getText("attribute_top"));
+ topNode = new DefaultMutableTreeNode(nodeInfo);
+ treeModel = new DefaultTreeModel(topNode);
+ tree = new JTree(treeModel);
+ tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+ tree.addTreeSelectionListener(this);
+ scrollPane = new JScrollPane();
+ scrollPane.setViewportView(tree);
+ scrollPane.setPreferredSize(new Dimension(600, 300));
+ getContentPane().add(scrollPane, BorderLayout.CENTER);
+ final Box buttons = Box.createHorizontalBox();
+ buttons.setBorder(new EmptyBorder(5, 5, 5, 5));
+ final JButton okBtn = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(okBtn, TextUtils.getRawText("ok"));
+ okBtn.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ performImport(topNode);
+ dispose();
+ }
+ });
+ final JButton cancelBtn = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(cancelBtn, TextUtils.getRawText("cancel"));
+ cancelBtn.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ dispose();
+ }
+ });
+ buttons.add(Box.createHorizontalGlue());
+ buttons.add(okBtn);
+ buttons.add(Box.createHorizontalGlue());
+ buttons.add(cancelBtn);
+ buttons.add(Box.createHorizontalGlue());
+ getContentPane().add(buttons, BorderLayout.SOUTH);
+ UITools.addEscapeActionToDialog(this);
+ }
+
+ private void createAttributeSubTrees(final DefaultMutableTreeNode mapInfo, final AttributeRegistry attributes) {
+ if (attributes == null) {
+ return;
+ }
+ for (int i = 0; i < attributes.size(); i++) {
+ final AttributeRegistryElement element = attributes.getElement(i);
+ final TreeNodeInfo treeNodeInfo = new AttributeTreeNodeInfo(element.getKey().toString(), element
+ .isRestricted());
+ final DefaultMutableTreeNode attributeInfo = new DefaultMutableTreeNode(treeNodeInfo);
+ createValueSubTrees(attributeInfo, element, currentAttributes);
+ if (attributeInfo.getChildCount() != 0) {
+ mapInfo.add(attributeInfo);
+ }
+ }
+ }
+
+ private void createMapSubTrees(final DefaultMutableTreeNode top) {
+ top.removeAllChildren();
+ final TreeNodeInfo topInfo = (TreeNodeInfo) top.getUserObject();
+ topInfo.setSelected(TreeNodeInfo.NOT_SELECTED);
+ Controller controller = Controller.getCurrentController();
+ final IMapViewManager mapViewManager = controller.getMapViewManager();
+ final MapModel currentMap = controller.getMap();
+ currentAttributes = AttributeRegistry.getRegistry(currentMap);
+ final Iterator<Entry<String, MapModel>> iterator = mapViewManager.getMaps().entrySet().iterator();
+ while (iterator.hasNext()) {
+ final Entry<String, MapModel> entry = iterator.next();
+ final String nextmapName = entry.getKey();
+ final MapModel nextMap = entry.getValue();
+ if (nextMap == currentMap) {
+ continue;
+ }
+ final TreeNodeInfo treeNodeInfo = new TreeNodeInfo(nextmapName);
+ final DefaultMutableTreeNode mapInfo = new DefaultMutableTreeNode(treeNodeInfo);
+ createAttributeSubTrees(mapInfo, AttributeRegistry.getRegistry(nextMap));
+ if (mapInfo.getChildCount() != 0) {
+ top.add(mapInfo);
+ }
+ }
+ }
+
+ private void createValueSubTrees(final DefaultMutableTreeNode attributeInfo,
+ final AttributeRegistryElement element, final AttributeRegistry currentAttributes) {
+ final String attributeName = element.getKey().toString();
+ final SortedComboBoxModel values = element.getValues();
+ for (int i = 0; i < values.getSize(); i++) {
+ final Object nextElement = values.getElementAt(i);
+ if (!currentAttributes.exist(attributeName, nextElement)) {
+ final TreeNodeInfo treeNodeInfo = new TreeNodeInfo(nextElement.toString());
+ final DefaultMutableTreeNode valueInfo = new DefaultMutableTreeNode(treeNodeInfo);
+ attributeInfo.add(valueInfo);
+ }
+ }
+ }
+
+ private void performImport(final DefaultMutableTreeNode node) {
+ final TreeNodeInfo info = (TreeNodeInfo) node.getUserObject();
+ if (info.getSelected() == TreeNodeInfo.NOT_SELECTED) {
+ return;
+ }
+ final String name = info.getInfo();
+ boolean attributeNameRegistered = false;
+ for (int i = 0; i < node.getChildCount(); i++) {
+ final DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i);
+ if (childNode.isLeaf()) {
+ if (attributeNameRegistered == false) {
+ attributeNameRegistered = true;
+ if (-1 == currentAttributes.indexOf(name)) {
+ currentAttributes.getAttributeController().performRegistryAttribute(name);
+ final int index = currentAttributes.indexOf(name);
+ currentAttributes.getAttributeController().performSetRestriction(index,
+ ((AttributeTreeNodeInfo) info).isRestricted());
+ }
+ }
+ final TreeNodeInfo childInfo = (TreeNodeInfo) childNode.getUserObject();
+ if (childInfo.getSelected() == TreeNodeInfo.FULL_SELECTED) {
+ final String value = childInfo.getInfo();
+ currentAttributes.getAttributeController().performRegistryAttributeValue(name, value, true);
+ }
+ }
+ else {
+ performImport(childNode);
+ }
+ }
+ }
+
+ private void setParentSelectionType(final DefaultMutableTreeNode selectedNode, final int newSelectionType) {
+ final TreeNode parentNode = selectedNode.getParent();
+ if (parentNode == null) {
+ return;
+ }
+ final DefaultMutableTreeNode defaultMutableParentNode = (DefaultMutableTreeNode) parentNode;
+ final TreeNodeInfo info = (TreeNodeInfo) (defaultMutableParentNode).getUserObject();
+ if (newSelectionType == TreeNodeInfo.PARTIAL_SELECTED) {
+ if (info.getSelected() != TreeNodeInfo.PARTIAL_SELECTED) {
+ info.setSelected(TreeNodeInfo.PARTIAL_SELECTED);
+ treeModel.nodeChanged(defaultMutableParentNode);
+ }
+ setParentSelectionType(defaultMutableParentNode, TreeNodeInfo.PARTIAL_SELECTED);
+ return;
+ }
+ for (int i = 0; i < defaultMutableParentNode.getChildCount(); i++) {
+ final TreeNodeInfo childInfo = (TreeNodeInfo) ((DefaultMutableTreeNode) defaultMutableParentNode
+ .getChildAt(i)).getUserObject();
+ if (childInfo.getSelected() != newSelectionType) {
+ if (info.getSelected() != TreeNodeInfo.PARTIAL_SELECTED) {
+ info.setSelected(TreeNodeInfo.PARTIAL_SELECTED);
+ treeModel.nodeChanged(defaultMutableParentNode);
+ }
+ setParentSelectionType(defaultMutableParentNode, TreeNodeInfo.PARTIAL_SELECTED);
+ return;
+ }
+ }
+ if (info.getSelected() != newSelectionType) {
+ info.setSelected(newSelectionType);
+ treeModel.nodeChanged(defaultMutableParentNode);
+ }
+ setParentSelectionType(defaultMutableParentNode, newSelectionType);
+ }
+
+ private void setSelectionType(final TreeNode selectedNode, final int newSelectionType) {
+ final TreeNodeInfo info = (TreeNodeInfo) ((DefaultMutableTreeNode) selectedNode).getUserObject();
+ if (info.getSelected() != newSelectionType) {
+ info.setSelected(newSelectionType);
+ treeModel.nodeChanged(selectedNode);
+ }
+ for (int i = 0; i < selectedNode.getChildCount(); i++) {
+ setSelectionType(selectedNode.getChildAt(i), newSelectionType);
+ }
+ }
+
+ @Override
+ public void show() {
+ createMapSubTrees(topNode);
+ if (topNode.getChildCount() == 0) {
+ JOptionPane.showMessageDialog(parentComponent, TextUtils.getText("attributes_no_import_candidates_found"),
+ getTitle(), JOptionPane.INFORMATION_MESSAGE);
+ return;
+ }
+ treeModel.reload();
+ if (renderer == null) {
+ renderer = new MyRenderer();
+ }
+ tree.setCellRenderer(renderer);
+ setLocationRelativeTo(parentComponent);
+ pack();
+ super.show();
+ }
+
+ public void valueChanged(final TreeSelectionEvent e) {
+ final DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
+ if (selectedNode == null) {
+ return;
+ }
+ final TreeNodeInfo info = (TreeNodeInfo) selectedNode.getUserObject();
+ int newSelectionType;
+ switch (info.getSelected()) {
+ case TreeNodeInfo.FULL_SELECTED:
+ newSelectionType = TreeNodeInfo.NOT_SELECTED;
+ break;
+ default:
+ newSelectionType = TreeNodeInfo.FULL_SELECTED;
+ break;
+ }
+ setSelectionType(selectedNode, newSelectionType);
+ setParentSelectionType(selectedNode, newSelectionType);
+ tree.clearSelection();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/ListDialog.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/ListDialog.java
new file mode 100644
index 0000000..32cc76d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/ListDialog.java
@@ -0,0 +1,339 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.ListSelectionModel;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.TypedListCellRenderer;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.collection.IListModel;
+
+class ListDialog extends JDialog {
+ private class AddAction implements ActionListener {
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public void actionPerformed(final ActionEvent e) {
+ data.add(getCurrentText());
+ addButton.setEnabled(false);
+ selectText();
+ }
+ }
+
+ private class CloseAction implements ActionListener {
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public void actionPerformed(final ActionEvent e) {
+ ListDialog.dialog.dispose();
+ }
+ }
+
+ private class DeleteAction implements ActionListener {
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public void actionPerformed(final ActionEvent e) {
+ final Object[] selectedValues = list.getSelectedValues();
+ for (int i = 0; i < selectedValues.length; i++) {
+ data.remove(selectedValues[i]);
+ }
+ if (data.getSize() == 0) {
+ data.add("");
+ }
+ list.clearSelection();
+ }
+ }
+
+ final private class ListSelectionChangeListener implements ListSelectionListener {
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.ListSelectionListener#valueChanged(javax.swing.
+ * event.ListSelectionEvent)
+ */
+ public void valueChanged(final ListSelectionEvent e) {
+ final int minIndex = list.getMinSelectionIndex();
+ final int maxIndex = list.getMaxSelectionIndex();
+ if (minIndex == maxIndex && minIndex != -1) {
+ textField.setText(data.getElementAt(minIndex).toString());
+ selectText();
+ }
+ updateButtons();
+ }
+ }
+
+ private class RenameAction implements ActionListener {
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public void actionPerformed(final ActionEvent e) {
+ final Object[] selectedValues = list.getSelectedValues();
+ for (int i = 0; i < selectedValues.length; i++) {
+ if (!selectedValues[i].equals(getCurrentText())) {
+ data.replace(selectedValues[i], getCurrentText());
+ }
+ }
+ renameButton.setEnabled(false);
+ list.clearSelection();
+ selectText();
+ }
+ }
+
+ final private class TextChangeListener implements DocumentListener {
+ public void changedUpdate(final DocumentEvent e) {
+ update();
+ }
+
+ public void insertUpdate(final DocumentEvent e) {
+ update();
+ }
+
+ public void removeUpdate(final DocumentEvent e) {
+ update();
+ }
+
+ private void update() {
+ updateButtons();
+ }
+ }
+
+ private static ListDialog dialog;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public static void showDialog(final Component frameComp, final Component locationComp, final String labelText,
+ final String title, final IListModel possibleValues, final String longValue) {
+ final Window window = SwingUtilities.getWindowAncestor(frameComp);
+ if(window instanceof Frame)
+ ListDialog.dialog = new ListDialog((Frame)window, locationComp, labelText, title, possibleValues, longValue);
+ else if(window instanceof Dialog)
+ ListDialog.dialog = new ListDialog((Dialog )window, locationComp, labelText, title, possibleValues, longValue);
+ else{
+ final Frame frame = JOptionPane.getFrameForComponent(frameComp);
+ ListDialog.dialog = new ListDialog(frame, locationComp, labelText, title, possibleValues, longValue);
+ }
+ UITools.addEscapeActionToDialog(ListDialog.dialog);
+ ListDialog.dialog.show();
+ }
+
+ private JButton addButton;
+ private IListModel data = null;
+ private JButton deleteButton;
+ private JList list;
+ private JButton renameButton;
+ private JTextField textField;
+
+ private ListDialog(final Frame frame, final Component locationComp, final String labelText, final String title,
+ final IListModel data, final String longValue) {
+ super(frame, title, true);
+ init(locationComp, labelText, data, longValue);
+ }
+
+ private ListDialog(final Dialog frame, final Component locationComp, final String labelText, final String title,
+ final IListModel data, final String longValue) {
+ super(frame, title, true);
+ init(locationComp, labelText, data, longValue);
+ }
+
+ public void init(final Component locationComp, final String labelText, final IListModel data, final String longValue) {
+ this.data = data;
+ final JButton closeButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(closeButton, TextUtils.getRawText("simplyhtml.closeBtnName"));
+ closeButton.addActionListener(new CloseAction());
+ getRootPane().setDefaultButton(closeButton);
+ addButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(addButton, TextUtils.getRawText("add"));
+ final AddAction addAction = new AddAction();
+ addButton.addActionListener(addAction);
+ renameButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(renameButton, TextUtils.getRawText("rename"));
+ renameButton.addActionListener(new RenameAction());
+ deleteButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(deleteButton, TextUtils.getRawText("delete"));
+ deleteButton.addActionListener(new DeleteAction());
+ textField = new JTextField(20);
+ textField.getDocument().addDocumentListener(new TextChangeListener());
+ list = new JList(data) {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation,
+ final int direction) {
+ int row;
+ if (orientation == SwingConstants.VERTICAL && direction < 0 && (row = getFirstVisibleIndex()) != -1) {
+ final Rectangle r = getCellBounds(row, row);
+ if ((r.y == visibleRect.y) && (row != 0)) {
+ final Point loc = r.getLocation();
+ loc.y--;
+ final int prevIndex = locationToIndex(loc);
+ final Rectangle prevR = getCellBounds(prevIndex, prevIndex);
+ if (prevR == null || prevR.y >= r.y) {
+ return 0;
+ }
+ return prevR.height;
+ }
+ }
+ return super.getScrollableUnitIncrement(visibleRect, orientation, direction);
+ }
+ };
+ list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
+ if (longValue != null) {
+ list.setPrototypeCellValue(longValue);
+ }
+ list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
+ list.setVisibleRowCount(-1);
+ list.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(final MouseEvent e) {
+ if (e.getClickCount() == 2) {
+ addButton.doClick();
+ }
+ }
+ });
+ list.setCellRenderer(new TypedListCellRenderer());
+ list.setModel(data);
+ list.addListSelectionListener(new ListSelectionChangeListener());
+ final JScrollPane listScroller = new JScrollPane(list);
+ listScroller.setPreferredSize(new Dimension(250, 80));
+ listScroller.setAlignmentX(Component.LEFT_ALIGNMENT);
+ final JPanel listPane = new JPanel();
+ listPane.setLayout(new BoxLayout(listPane, BoxLayout.PAGE_AXIS));
+ final JLabel label = new JLabel(labelText);
+ label.setLabelFor(list);
+ listPane.add(label);
+ listPane.add(Box.createRigidArea(new Dimension(0, 5)));
+ listPane.add(listScroller);
+ listPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
+ final JPanel buttonPane = new JPanel();
+ buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
+ buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
+ buttonPane.add(Box.createHorizontalGlue());
+ buttonPane.add(closeButton);
+ buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
+ buttonPane.add(addButton);
+ buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
+ buttonPane.add(renameButton);
+ buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
+ buttonPane.add(deleteButton);
+ final JPanel textPane = new JPanel();
+ textPane.setLayout(new BoxLayout(textPane, BoxLayout.LINE_AXIS));
+ textPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
+ textPane.add(textField);
+ final Container contentPane = getContentPane();
+ contentPane.add(textPane, BorderLayout.PAGE_START);
+ contentPane.add(listPane, BorderLayout.CENTER);
+ contentPane.add(buttonPane, BorderLayout.PAGE_END);
+ updateButtons();
+ pack();
+ setLocationRelativeTo(locationComp);
+ }
+
+ private String getCurrentText() {
+ final Document document = textField.getDocument();
+ try {
+ final String text = document.getText(0, document.getLength());
+ return text;
+ }
+ catch (final BadLocationException e) {
+ LogUtils.severe(e);
+ return "";
+ }
+ }
+
+ private int getIndexOf(final String text) {
+ for (int i = 0; i < data.getSize(); i++) {
+ if (data.getElementAt(i).toString().equals(text)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ private void selectText() {
+ textField.requestFocusInWindow();
+ textField.select(0, textField.getDocument().getLength());
+ }
+
+ /**
+ *
+ */
+ private void updateButtons() {
+ final String text = getCurrentText();
+ final boolean isNewText = -1 == getIndexOf(text);
+ addButton.setEnabled(isNewText);
+ final int minSelectionIndex = list.getMinSelectionIndex();
+ renameButton.setEnabled(minSelectionIndex != -1);
+ deleteButton.setEnabled(minSelectionIndex != -1);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/MAttributeController.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/MAttributeController.java
new file mode 100644
index 0000000..9d29c94
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/MAttributeController.java
@@ -0,0 +1,844 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute.mindmapmode;
+
+import java.util.NoSuchElementException;
+import java.util.Vector;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.core.util.collection.SortedComboBoxModel;
+import org.freeplane.features.attribute.Attribute;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.AttributeRegistry;
+import org.freeplane.features.attribute.AttributeRegistryElement;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+public class MAttributeController extends AttributeController {
+
+ static public MAttributeController getController(){
+ return (MAttributeController) AttributeController.getController();
+ }
+ private class AttributeChanger implements IVisitor {
+ final private Object name;
+ final private Object newValue;
+ final private Object oldValue;
+
+ public AttributeChanger(final Object name, final Object oldValue, final Object newValue) {
+ super();
+ this.name = name;
+ this.oldValue = oldValue;
+ this.newValue = newValue;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.attributes.AttributeRegistry.Visitor#visit(freeplane
+ * .modes.attributes.ConcreteAttributeTableModel)
+ */
+ public void visit(final NodeAttributeTableModel model) {
+ for (int i = 0; i < model.getRowCount(); i++) {
+ if (model.getName(i).equals(name) && model.getValue(i).equals(oldValue)) {
+ final int row = i;
+ final IActor actor = new SetAttributeValueActor(model, row, newValue);
+ Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
+ }
+ }
+ }
+ }
+
+ private class AttributeRemover implements IVisitor {
+ final private Object name;
+
+ public AttributeRemover(final Object name) {
+ super();
+ this.name = name;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.attributes.AttributeRegistry.Visitor#visit(freeplane
+ * .modes.attributes.ConcreteAttributeTableModel)
+ */
+ public void visit(final NodeAttributeTableModel model) {
+ for (int i = 0; i < model.getRowCount(); i++) {
+ if (model.getName(i).equals(name)) {
+ final int row = i;
+ final IActor actor = new RemoveAttributeActor(model, row);
+ Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
+ }
+ }
+ }
+ }
+
+ private class AttributeRenamer implements IVisitor {
+ final private Object newName;
+ final private Object oldName;
+
+ public AttributeRenamer(final Object oldName, final Object newName) {
+ super();
+ this.newName = newName;
+ this.oldName = oldName;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.attributes.AttributeRegistry.Visitor#visit(freeplane
+ * .modes.attributes.ConcreteAttributeTableModel)
+ */
+ public void visit(final NodeAttributeTableModel model) {
+ for (int i = 0; i < model.getRowCount(); i++) {
+ if (model.getName(i).equals(oldName)) {
+ final int row = i;
+ final String name = newName.toString();
+ final String oldName = this.oldName.toString();
+ final IActor actor = new SetAttributeNameActor(model, name, oldName, row);
+ Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
+ }
+ }
+ }
+ }
+
+ private class AttributeValueRemover implements IVisitor {
+ final private Object name;
+ final private Object value;
+
+ public AttributeValueRemover(final Object name, final Object value) {
+ super();
+ this.name = name;
+ this.value = value;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.attributes.AttributeRegistry.Visitor#visit(freeplane
+ * .modes.attributes.ConcreteAttributeTableModel)
+ */
+ public void visit(final NodeAttributeTableModel model) {
+ for (int i = 0; i < model.getRowCount(); i++) {
+ if (model.getName(i).equals(name) && model.getValue(i).equals(value)) {
+ final IActor actor = new RemoveAttributeActor(model, i);
+ Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
+ }
+ }
+ }
+ }
+
+ private class InsertAttributeActor implements IActor {
+ private final NodeAttributeTableModel model;
+ private final String name;
+ private final int row;
+ private final Object value;
+
+ private InsertAttributeActor(final NodeAttributeTableModel model, final int row, final String name,
+ final Object value) {
+ this.row = row;
+ this.name = name;
+ this.model = model;
+ this.value = value;
+ }
+
+ public void act() {
+ final Attribute newAttribute = new Attribute(name, value);
+ model.getAttributes().add(row, newAttribute);
+ model.fireTableRowsInserted(row, row);
+ }
+
+ public String getDescription() {
+ return "InsertAttributeActor";
+ }
+
+ public void undo() {
+ model.getAttributes().remove(row);
+ model.fireTableRowsDeleted(row, row);
+ }
+ }
+
+ private class Iterator {
+ final private IVisitor visitor;
+
+ Iterator(final IVisitor v) {
+ visitor = v;
+ }
+
+ /**
+ */
+ void iterate(final NodeModel node) {
+ visitor.visit(NodeAttributeTableModel.getModel(node));
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ iterate(child);
+ }
+ }
+ }
+
+ private static interface IVisitor {
+ void visit(NodeAttributeTableModel model);
+ }
+
+ private static class RegistryAttributeActor implements IActor {
+ private final boolean manual;
+ private final MapModel map;
+ private final String name;
+ private final AttributeRegistry registry;
+ private final boolean visible;
+
+ private RegistryAttributeActor(final String name, final boolean manual, final boolean visible,
+ final AttributeRegistry registry, final MapModel map) {
+ this.name = name;
+ this.registry = registry;
+ this.manual = manual;
+ this.visible = visible;
+ this.map = map;
+ }
+
+ public void act() {
+ final AttributeRegistryElement attributeRegistryElement = new AttributeRegistryElement(registry, name);
+ attributeRegistryElement.setManual(manual);
+ attributeRegistryElement.setVisibility(visible);
+ final int index = registry.getElements().add(name, attributeRegistryElement);
+ registry.getTableModel().fireTableRowsInserted(index, index);
+ if (manual || visible) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.getMapController().setSaved(map, false);
+ }
+ }
+
+ public String getDescription() {
+ return "RegistryAttributeActor";
+ }
+
+ public void undo() {
+ registry.unregistry(name);
+ if (manual) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.getMapController().setSaved(map, false);
+ }
+ }
+ }
+
+ private static class RegistryAttributeValueActor implements IActor {
+ private final AttributeRegistryElement element;
+ private final Object newValue;
+ private final boolean setManual;
+ private final boolean wasManual;
+
+ private RegistryAttributeValueActor(final AttributeRegistryElement element, final Object newValue, boolean setManual) {
+ this.element = element;
+ this.newValue = newValue;
+ this.setManual = setManual;
+ this.wasManual = element.isManual();
+ }
+
+ public void act() {
+ if (newValue != null){
+ element.addValue(newValue);
+ if(setManual)
+ element.setManual(true);
+ }
+ }
+
+ public String getDescription() {
+ return "RegistryAttributeValueActor";
+ }
+
+ public void undo() {
+ if (newValue != null){
+ element.removeValue(newValue);
+ if(setManual & ! wasManual)
+ element.setManual(false);
+ }
+ }
+ }
+
+ private class RemoveAttributeActor implements IActor {
+ final private InsertAttributeActor insertActor;
+
+ private RemoveAttributeActor(final NodeAttributeTableModel model, final int row) {
+ final Attribute attribute = model.getAttribute(row);
+ final String name = attribute.getName();
+ final Object value = attribute.getValue();
+ insertActor = new InsertAttributeActor(model, row, name, value);
+ }
+
+ public void act() {
+ insertActor.undo();
+ }
+
+ public String getDescription() {
+ return "RemoveAttributeActor";
+ }
+
+ public void undo() {
+ insertActor.act();
+ }
+ }
+
+ private static class ReplaceAttributeValueActor implements IActor {
+ private final String name;
+ private final String newValue;
+ private final String oldValue;
+ private final AttributeRegistry registry;
+
+ private ReplaceAttributeValueActor(final AttributeRegistry registry, final String name, final String oldValue,
+ final String newValue) {
+ this.registry = registry;
+ this.name = name;
+ this.oldValue = oldValue;
+ this.newValue = newValue;
+ }
+
+ public void act() {
+ registry.getElement(name).replaceValue(oldValue, newValue);
+ }
+
+ public String getDescription() {
+ return "ReplaceAttributeValueActor";
+ }
+
+ public void undo() {
+ registry.getElement(name).replaceValue(newValue, oldValue);
+ }
+ }
+
+ private static class SetAttributeColumnWidthActor implements IActor {
+ private final int col;
+ private final NodeAttributeTableModel model;
+ private final Quantity<LengthUnits> oldWidth;
+ private final Quantity<LengthUnits> width;
+
+ private SetAttributeColumnWidthActor(final int col, final Quantity<LengthUnits> oldWidth, final Quantity<LengthUnits> width,
+ final NodeAttributeTableModel model) {
+ this.col = col;
+ this.oldWidth = oldWidth;
+ this.width = width;
+ this.model = model;
+ }
+
+ public void act() {
+ model.getLayout().setColumnWidth(col, width);
+ }
+
+ public String getDescription() {
+ return "SetAttributeColumnWidthActor";
+ }
+
+ public void undo() {
+ model.getLayout().setColumnWidth(col, oldWidth);
+ }
+ }
+
+ private static class SetAttributeNameActor implements IActor {
+ private final NodeAttributeTableModel model;
+ private final String name;
+ private final String oldName;
+ private final int row;
+
+ private SetAttributeNameActor(final NodeAttributeTableModel model, final String name, final String oldName,
+ final int row) {
+ this.model = model;
+ this.name = name;
+ this.oldName = oldName;
+ this.row = row;
+ }
+
+ public void act() {
+ model.getAttribute(row).setName(name);
+ model.fireTableCellUpdated(row, 0);
+ }
+
+ public String getDescription() {
+ return "setAttributeName";
+ }
+
+ public void undo() {
+ model.getAttribute(row).setName(oldName);
+ model.fireTableCellUpdated(row, 0);
+ }
+ }
+
+ private static class SetAttributeRestrictedActor implements IActor {
+ private final int index;
+ private final boolean isRestricted;
+ private final AttributeRegistry registry;
+
+ private SetAttributeRestrictedActor(final AttributeRegistry registry, final int index,
+ final boolean isRestricted) {
+ this.registry = registry;
+ this.index = index;
+ this.isRestricted = isRestricted;
+ }
+
+ public void act() {
+ act(isRestricted);
+ }
+
+ public void act(final boolean isRestricted) {
+ if (index == AttributeRegistry.GLOBAL) {
+ registry.setRestricted(isRestricted);
+ }
+ else {
+ registry.getElement(index).setRestriction(isRestricted);
+ }
+ }
+
+ public String getDescription() {
+ return "SetAttributeRestrictedActor";
+ }
+
+ public void undo() {
+ act(!isRestricted);
+ }
+ }
+
+ private static final class SetAttributeValueActor implements IActor {
+ private final NodeAttributeTableModel model;
+ private final Object newValue;
+ private final Object oldValue;
+ private final int row;
+
+ private SetAttributeValueActor(final NodeAttributeTableModel model, final int row, final Object newValue) {
+ this.row = row;
+ oldValue = model.getAttribute(row).getValue();
+ this.newValue = newValue;
+ this.model = model;
+ }
+
+ public void act() {
+ model.getAttribute(row).setValue(newValue);
+ model.fireTableCellUpdated(row, 1);
+ }
+
+ public String getDescription() {
+ return "SetAttributeValue";
+ }
+
+ public void undo() {
+ model.getAttribute(row).setValue(oldValue);
+ model.fireTableCellUpdated(row, 1);
+ }
+ }
+
+ private static class SetAttributeVisibleActor implements IActor {
+ private final AttributeRegistry attributeRegistry;
+ private final int index;
+ private final boolean isVisible;
+
+ private SetAttributeVisibleActor(final AttributeRegistry attributeRegistry, final int index,
+ final boolean isVisible) {
+ this.attributeRegistry = attributeRegistry;
+ this.index = index;
+ this.isVisible = isVisible;
+ }
+
+ public void act() {
+ act(isVisible);
+ }
+
+ private void act(final boolean isVisible) {
+ attributeRegistry.getElement(index).setVisibility(isVisible);
+ attributeRegistry.fireStateChanged();
+ }
+
+ public String getDescription() {
+ return "SetAttributeVisibleActor";
+ }
+
+ public void undo() {
+ act(!isVisible);
+ }
+ }
+
+ private static class UnregistryAttributeActor implements IActor {
+ final private RegistryAttributeActor registryActor;
+
+ private UnregistryAttributeActor(final String name, final AttributeRegistry registry, final MapModel map) {
+ registryActor = new RegistryAttributeActor(name, registry.getElement(name).isManual(), registry.getElement(
+ name).isVisible(), registry, map);
+ }
+
+ public void act() {
+ registryActor.undo();
+ }
+
+ public String getDescription() {
+ return "UnregistryAttributeActor";
+ }
+
+ public void undo() {
+ registryActor.act();
+ }
+ }
+
+ private static class UnregistryAttributeValueActor implements IActor {
+ final private RegistryAttributeValueActor registryActor;
+
+ private UnregistryAttributeValueActor(final AttributeRegistryElement element, final String newValue) {
+ registryActor = new RegistryAttributeValueActor(element, newValue, element.isManual());
+ }
+
+ public void act() {
+ registryActor.undo();
+ }
+
+ public String getDescription() {
+ return "UnregistryAttributeValueActor";
+ }
+
+ public void undo() {
+ registryActor.act();
+ }
+ }
+
+ InsertAttributeActor insertAttributeActor;
+
+ public MAttributeController(final ModeController modeController) {
+ super(modeController);
+ createActions();
+ }
+
+ public int addAttribute(final NodeModel node, final Attribute pAttribute) {
+ createAttributeTableModel(node);
+ final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
+ final int rowCount = attributes.getRowCount();
+ performInsertRow(attributes, rowCount, pAttribute.getName(), pAttribute.getValue());
+ return rowCount;
+ }
+
+ /**
+ *
+ */
+ private void createActions() {
+ ModeController modeController = Controller.getCurrentModeController();
+ modeController.addAction(new AssignAttributesAction());
+ modeController.addAction(new ShowAttributeDialogAction());
+ modeController.addAction(new CopyAttributes());
+ modeController.addAction(new PasteAttributes());
+ modeController.addAction(new AddStyleAttributes());
+ }
+
+ public int editAttribute(final NodeModel pNode, final String pName, final String pNewValue) {
+ createAttributeTableModel(pNode);
+ final Attribute newAttribute = new Attribute(pName, pNewValue);
+ final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(pNode);
+ for (int i = 0; i < attributes.getRowCount(); i++) {
+ if (pName.equals(attributes.getAttribute(i).getName())) {
+ if (pNewValue != null) {
+ setAttribute(pNode, i, newAttribute);
+ }
+ else {
+ removeAttribute(pNode, i);
+ }
+ return i;
+ }
+ }
+ if (pNewValue == null) {
+ return -1;
+ }
+ return addAttribute(pNode, newAttribute);
+ }
+
+ @Override
+ public void performInsertRow(final NodeAttributeTableModel model, final int row, final String name, Object value) {
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
+ if (name.equals("")) {
+ return;
+ }
+ try {
+ final AttributeRegistryElement element = attributes.getElement(name);
+ final int index = element.getValues().getIndexOf(value);
+ if (index == -1) {
+ if (element.isRestricted()) {
+ value = element.getValues().firstElement().toString();
+ }
+ else {
+ final IActor actor = new RegistryAttributeValueActor(element, value, false);
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+ }
+ }
+ catch (final NoSuchElementException ex) {
+ final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
+ final IActor nameActor = new RegistryAttributeActor(name, false, false, registry, map);
+ Controller.getCurrentModeController().execute(nameActor, map);
+ final AttributeRegistryElement element = registry.getElement(name);
+ final IActor valueActor = new RegistryAttributeValueActor(element, value, false);
+ Controller.getCurrentModeController().execute(valueActor, map);
+ }
+ final Object newValue = value;
+ final IActor actor = new InsertAttributeActor(model, row, name, newValue);
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+ @Override
+ public void performRegistryAttribute(final String name) {
+ if (name.equals("")) {
+ return;
+ }
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
+ try {
+ attributeRegistry.getElement(name);
+ }
+ catch (final NoSuchElementException ex) {
+ final IActor actor = new RegistryAttributeActor(name, true, false, attributeRegistry, map);
+ Controller.getCurrentModeController().execute(actor, map);
+ return;
+ }
+ }
+
+ @Override
+ public void performRegistryAttributeValue(final String name, final String value, boolean manual) {
+ if (name.equals("")) {
+ return;
+ }
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
+ try {
+ final AttributeRegistryElement element = attributeRegistry.getElement(name);
+ if (element.getValues().contains(value)) {
+ return;
+ }
+ final IActor actor = new RegistryAttributeValueActor(element, value, manual);
+ Controller.getCurrentModeController().execute(actor, map);
+ return;
+ }
+ catch (final NoSuchElementException ex) {
+ final IActor nameActor = new RegistryAttributeActor(name, true, false, attributeRegistry, map);
+ Controller.getCurrentModeController().execute(nameActor, map);
+ final AttributeRegistryElement element = attributeRegistry.getElement(name);
+ final IActor valueActor = new RegistryAttributeValueActor(element, value, false);
+ Controller.getCurrentModeController().execute(valueActor, map);
+ }
+ }
+
+ @Override
+ public void performRegistrySubtreeAttributes(final NodeModel node) {
+ final NodeAttributeTableModel nodeAttributeTableModel = NodeAttributeTableModel.getModel(node);
+ for (int i = 0; i < nodeAttributeTableModel.getRowCount(); i++) {
+ final String name = nodeAttributeTableModel.getValueAt(i, 0).toString();
+ final String value = nodeAttributeTableModel.getValueAt(i, 1).toString();
+ performRegistryAttributeValue(name, value, false);
+ }
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ performRegistrySubtreeAttributes(child);
+ }
+ }
+
+ @Override
+ public void performRemoveAttribute(final String name) {
+ final IVisitor remover = new AttributeRemover(name);
+ final Iterator iterator = new Iterator(remover);
+ ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel root = modeController.getMapController().getRootNode();
+ iterator.iterate(root);
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
+ final IActor actor = new UnregistryAttributeActor(name, attributeRegistry, map);
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+ @Override
+ public void performRemoveAttributeValue(final String name, final String value) {
+ final IVisitor remover = new AttributeValueRemover(name, value);
+ final Iterator iterator = new Iterator(remover);
+ ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel root = modeController.getMapController().getRootNode();
+ iterator.iterate(root);
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
+ final IActor unregistryActor = new UnregistryAttributeValueActor(attributeRegistry.getElement(name), value);
+ Controller.getCurrentModeController().execute(unregistryActor, map);
+ }
+
+ @Override
+ public Attribute performRemoveRow(final NodeAttributeTableModel model, final int row) {
+ final Vector<Attribute> attributes = model.getAttributes();
+ final Object o = attributes.elementAt(row);
+ final IActor actor = new RemoveAttributeActor(model, row);
+ Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
+ return (Attribute) o;
+ }
+
+ @Override
+ public void performReplaceAtributeName(final String oldName, final String newName) {
+ if (oldName.equals("") || newName.equals("") || oldName.equals(newName)) {
+ return;
+ }
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
+ final int iOld = registry.getElements().indexOf(oldName);
+ final AttributeRegistryElement oldElement = registry.getElement(iOld);
+ final SortedComboBoxModel values = oldElement.getValues();
+ final IActor registryActor = new RegistryAttributeActor(newName, oldElement.isManual(), oldElement.isVisible(),
+ registry, map);
+ Controller.getCurrentModeController().execute(registryActor, map);
+ final AttributeRegistryElement newElement = registry.getElement(newName);
+ for (int i = 0; i < values.getSize(); i++) {
+ final IActor registryValueActor = new RegistryAttributeValueActor(newElement, values.getElementAt(i)
+ .toString(), false);
+ Controller.getCurrentModeController().execute(registryValueActor, map);
+ }
+ final IVisitor replacer = new AttributeRenamer(oldName, newName);
+ final Iterator iterator = new Iterator(replacer);
+ ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel root = modeController.getMapController().getRootNode();
+ iterator.iterate(root);
+ final IActor unregistryActor = new UnregistryAttributeActor(oldName, registry, map);
+ Controller.getCurrentModeController().execute(unregistryActor, map);
+ }
+
+ @Override
+ public void performReplaceAttributeValue(final String name, final String oldValue, final String newValue) {
+ Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ ModeController modeController = controller.getModeController();
+ final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
+ final IActor actor = new ReplaceAttributeValueActor(registry, name, oldValue, newValue);
+ Controller.getCurrentModeController().execute(actor, map);
+ final IVisitor replacer = new AttributeChanger(name, oldValue, newValue);
+ final Iterator iterator = new Iterator(replacer);
+ final NodeModel root = modeController.getMapController().getRootNode();
+ iterator.iterate(root);
+ }
+
+ @Override
+ public void performSetColumnWidth(final NodeAttributeTableModel model, final int col, final Quantity<LengthUnits> width) {
+ final Quantity<LengthUnits> oldWidth = model.getLayout().getColumnWidth(col);
+ if (width.equals(oldWidth)) {
+ return;
+ }
+ final IActor actor = new SetAttributeColumnWidthActor(col, oldWidth, width, model);
+ Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
+ }
+
+ @Override
+ public void performSetRestriction(final int index, final boolean isRestricted) {
+ boolean currentValue;
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
+ if (index == AttributeRegistry.GLOBAL) {
+ currentValue = registry.isRestricted();
+ }
+ else {
+ currentValue = registry.getElement(index).isRestricted();
+ }
+ if (currentValue == isRestricted) {
+ return;
+ }
+ final IActor actor = new SetAttributeRestrictedActor(registry, index, isRestricted);
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+ @Override
+ public void performSetValueAt(final NodeAttributeTableModel model, final Object o, final int row, final int col) {
+ final Attribute attribute = model.getAttribute(row);
+ final MapModel map = model.getNode().getMap();
+ final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
+ switch (col) {
+ case 0: {
+ final String name = o.toString().trim();
+ final String oldName = attribute.getName();
+ if (oldName.equals(name)) {
+ return;
+ }
+ final IActor nameActor = new SetAttributeNameActor(model, name, oldName, row);
+ Controller.getCurrentModeController().execute(nameActor, map);
+ try {
+ final AttributeRegistryElement element = registry.getElement(name);
+ final String value = model.getValueAt(row, 1).toString();
+ final int index = element.getValues().getIndexOf(value);
+ if (index == -1) {
+ final IActor valueActor = new SetAttributeValueActor(model, row, element.getValues().firstElement());
+ Controller.getCurrentModeController().execute(valueActor, map);
+ }
+ }
+ catch (final NoSuchElementException ex) {
+ final IActor registryActor = new RegistryAttributeActor(name, false, false, registry, map);
+ Controller.getCurrentModeController().execute(registryActor, map);
+ }
+ break;
+ }
+ case 1: {
+ if (attribute.getValue().equals(o)) {
+ return;
+ }
+ final IActor actor = new SetAttributeValueActor(model, row, o);
+ Controller.getCurrentModeController().execute(actor, map);
+ final String name = model.getValueAt(row, 0).toString();
+ final AttributeRegistryElement element = registry.getElement(name);
+ final int index = element.getValues().getIndexOf(o);
+ if (index == -1) {
+ final IActor registryActor = new RegistryAttributeValueActor(element, o, false);
+ Controller.getCurrentModeController().execute(registryActor, map);
+ }
+ break;
+ }
+ }
+ }
+
+ @Override
+ public void performSetVisibility(final int index, final boolean isVisible) {
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
+ if (attributeRegistry.getElement(index).isVisible() == isVisible) {
+ return;
+ }
+ final IActor actor = new SetAttributeVisibleActor(attributeRegistry, index, isVisible);
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+ public void removeAttribute(final NodeModel pNode, final int pPosition) {
+ createAttributeTableModel(pNode);
+ performRemoveRow(NodeAttributeTableModel.getModel(pNode), pPosition);
+ }
+
+ public void setAttribute(final NodeModel pNode, final int pPosition, final Attribute pAttribute) {
+ createAttributeTableModel(pNode);
+ final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(pNode);
+ performSetValueAt(model, pAttribute.getName(), pPosition, 0);
+ performSetValueAt(model, pAttribute.getValue(), pPosition, 1);
+ }
+
+ public void copyAttributesToNode(NodeModel source, NodeModel target) {
+ if (source == null)
+ return;
+ final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(source);
+ if (model.getRowCount() == 0)
+ return;
+ final int attributeTableLength = model.getAttributeTableLength();
+ for(int i = 0; i < attributeTableLength; i++){
+ final Attribute attribute = model.getAttribute(i);
+ addAttribute(target, new Attribute(attribute.getName(), attribute.getValue()));
+ }
+ }
+ public boolean canEdit() {
+ return true;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveAllAttributesAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/RemoveAllAttributesAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveAllAttributesAction.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/RemoveAllAttributesAction.java
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveFirstAttributeAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/RemoveFirstAttributeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveFirstAttributeAction.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/RemoveFirstAttributeAction.java
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveLastAttributeAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/RemoveLastAttributeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/attribute/mindmapmode/RemoveLastAttributeAction.java
rename to freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/RemoveLastAttributeAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/ShowAttributeDialogAction.java b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/ShowAttributeDialogAction.java
new file mode 100644
index 0000000..6f526c0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/attribute/mindmapmode/ShowAttributeDialogAction.java
@@ -0,0 +1,60 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.attribute.mindmapmode;
+
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.mode.Controller;
+
+class ShowAttributeDialogAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private AttributeManagerDialog attributeDialog = null;
+ private Frame frame;
+
+ /**
+ *
+ */
+ ShowAttributeDialogAction() {
+ super("ShowAttributeDialogAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if (frame == null) {
+ frame = UITools.getCurrentFrame();
+ }
+ if (getAttributeDialog().isVisible() == false && Controller.getCurrentController().getMap() != null) {
+ getAttributeDialog().pack();
+ getAttributeDialog().show();
+ }
+ }
+
+ private AttributeManagerDialog getAttributeDialog() {
+ if (attributeDialog == null) {
+ attributeDialog = new AttributeManagerDialog(frame);
+ }
+ return attributeDialog;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/clipboard/ClipboardController.java b/freeplane/src/main/java/org/freeplane/features/clipboard/ClipboardController.java
new file mode 100644
index 0000000..4cf3997
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/clipboard/ClipboardController.java
@@ -0,0 +1,457 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.clipboard;
+
+import java.awt.Color;
+import java.awt.GraphicsEnvironment;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Vector;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.text.TextController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class ClipboardController implements IExtension {
+ public static final String NODESEPARATOR = "<nodeseparator>";
+
+ public static ClipboardController getController() {
+ return (ClipboardController) Controller.getCurrentModeController().getExtension(ClipboardController.class);
+ }
+
+ public static void install( final ClipboardController clipboardController) {
+ Controller.getCurrentModeController().addExtension(ClipboardController.class, clipboardController);
+ }
+
+ final private Clipboard clipboard;
+// final private ModeController modeController;
+ final private Clipboard selection;
+
+ public ClipboardController() {
+ super();
+// this.modeController = modeController;
+ final Toolkit toolkit = Toolkit.getDefaultToolkit();
+
+ if (!GraphicsEnvironment.isHeadless()) {
+ selection = toolkit.getSystemSelection();
+ clipboard = toolkit.getSystemClipboard();
+ } else {
+ selection = null;
+ clipboard = null;
+ }
+ createActions();
+ }
+
+ private void collectColors(final NodeModel node, final HashSet<Color> colors) {
+ final Color color = NodeStyleModel.getColor(node);
+ if (color != null) {
+ colors.add(color);
+ }
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ collectColors(child, colors);
+ }
+ }
+
+ public MindMapNodesSelection copy(final Collection<NodeModel> selectedNodes, final boolean copyInvisible) {
+ try {
+ final String forNodesFlavor = createForNodesFlavor(selectedNodes, copyInvisible);
+ final String plainText = getAsPlainText(selectedNodes);
+ return new MindMapNodesSelection(forNodesFlavor, plainText, getAsRTF(selectedNodes),
+ getAsHTML(selectedNodes));
+ }
+ catch (final UnsupportedFlavorException ex) {
+ LogUtils.severe(ex);
+ }
+ catch (final IOException ex) {
+ LogUtils.severe(ex);
+ }
+ return null;
+ }
+
+ public Transferable copy(final IMapSelection selection) {
+ return copy(selection.getSortedSelection(true), false);
+ }
+
+ public Transferable copy(final NodeModel node, final boolean saveInvisible) {
+ final StringWriter stringWriter = new StringWriter();
+ try {
+ Controller.getCurrentModeController().getMapController().getMapWriter().writeNodeAsXml(stringWriter, node, Mode.CLIPBOARD,
+ saveInvisible, true, false);
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ return new MindMapNodesSelection(stringWriter.toString());
+ }
+
+ public Transferable copySingle(final Collection<NodeModel> source) {
+ final int size = source.size();
+ final Vector<NodeModel> target = new Vector<NodeModel>(size);
+ target.setSize(size);
+ int i = 0;
+ for (NodeModel node : source) {
+ target.set(i, new SingleCopySource(node));
+ i++;
+ }
+ return copy(target, false);
+ }
+
+ /**
+ *
+ */
+ private void createActions() {
+ final Controller controller = Controller.getCurrentController();
+ ModeController modeController = controller.getModeController();
+ modeController.addAction(new CopyAction());
+ modeController.addAction(new CopySingleAction());
+ if(!controller.getViewController().isApplet())
+ modeController.addAction(new CopyIDAction());
+ modeController.addAction(new CopyNodeURIAction());
+ }
+
+ public String createForNodesFlavor(final Collection<NodeModel> selectedNodes, final boolean copyInvisible)
+ throws UnsupportedFlavorException, IOException {
+ String forNodesFlavor = "";
+ boolean firstLoop = true;
+ for (final NodeModel tmpNode : selectedNodes) {
+ if (firstLoop) {
+ firstLoop = false;
+ }
+ else {
+ forNodesFlavor += "<nodeseparator>";
+ }
+ forNodesFlavor += copy(tmpNode, copyInvisible).getTransferData(MindMapNodesSelection.mindMapNodesFlavor);
+ }
+ return forNodesFlavor;
+ }
+
+ public String getAsHTML(final Collection<NodeModel> selectedNodes) {
+ try {
+ final StringWriter stringWriter = new StringWriter();
+ final BufferedWriter fileout = new BufferedWriter(stringWriter);
+ writeHTML(selectedNodes, fileout);
+ fileout.close();
+ return stringWriter.toString();
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ return null;
+ }
+ }
+
+ public String getAsPlainText(final Collection<NodeModel> selectedNodes) {
+ try {
+ final StringWriter stringWriter = new StringWriter();
+ final BufferedWriter fileout = new BufferedWriter(stringWriter);
+ for (final Iterator<NodeModel> it = selectedNodes.iterator(); it.hasNext();) {
+ writeTXT(it.next(), fileout,/* depth= */0);
+ }
+ fileout.close();
+ return stringWriter.toString();
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ return null;
+ }
+ }
+
+ public String getAsRTF(final Collection<NodeModel> selectedNodes) {
+ try {
+ final StringWriter stringWriter = new StringWriter();
+ final BufferedWriter fileout = new BufferedWriter(stringWriter);
+ writeRTF(selectedNodes, fileout);
+ fileout.close();
+ return stringWriter.toString();
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ return null;
+ }
+ }
+
+ /**
+ */
+ public Transferable getClipboardContents() {
+ if (clipboard != null) {
+ return clipboard.getContents(this);
+ }
+ return null;
+ }
+
+ private String rtfEscapeUnicodeAndSpecialCharacters(final String text) {
+ final int len = text.length();
+ final StringBuilder result = new StringBuilder(len);
+ int intValue;
+ char myChar;
+ for (int i = 0; i < len; ++i) {
+ myChar = text.charAt(i);
+ intValue = text.charAt(i);
+ if (intValue > 128) {
+ result.append("\\u").append(intValue).append("?");
+ }
+ else {
+ switch (myChar) {
+ case '\\':
+ result.append("\\\\");
+ break;
+ case '{':
+ result.append("\\{");
+ break;
+ case '}':
+ result.append("\\}");
+ break;
+ case '\n':
+ result.append(" \\line ");
+ break;
+ default:
+ result.append(myChar);
+ }
+ }
+ }
+ return result.toString();
+ }
+
+ public void saveHTML(final NodeModel rootNodeOfBranch, final File file) throws IOException {
+ final BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
+ final MindMapHTMLWriter htmlWriter = new MindMapHTMLWriter(Controller.getCurrentModeController().getMapController(), fileout);
+ htmlWriter.writeHTML(rootNodeOfBranch);
+ }
+
+ public boolean saveTXT(final NodeModel rootNodeOfBranch, final File file) {
+ try {
+ final BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
+ writeTXT(rootNodeOfBranch, fileout,/* depth= */
+ 0);
+ fileout.close();
+ return true;
+ }
+ catch (final Exception e) {
+ LogUtils.severe("Error in MindMapMapModel.saveTXT(): ", e);
+ return false;
+ }
+ }
+
+ /**
+ */
+ public void setClipboardContents(final Transferable t) {
+ if (clipboard != null) {
+ clipboard.setContents(t, null);
+ }
+ if (selection != null) {
+ selection.setContents(t, null);
+ }
+ }
+
+ /** copies a string to the system clipboard. */
+ public void setClipboardContents(final String string) {
+ setClipboardContents(new StringSelection(string));
+ }
+
+ /** copies a string to the system clipboard with text/html mimetype. */
+ public void setClipboardContentsToHtml(final String html) {
+ setClipboardContents(new HtmlSelection(html));
+ }
+
+ public NodeModel duplicate(final NodeModel source, boolean withChildren) {
+ try {
+ final StringWriter writer = new StringWriter();
+ ModeController modeController = Controller.getCurrentModeController();
+ modeController.getMapController().getMapWriter()
+ .writeNodeAsXml(writer, source, Mode.CLIPBOARD, true, withChildren, false);
+ final String result = writer.toString();
+ final NodeModel copy = modeController.getMapController().getMapReader().createNodeTreeFromXml(
+ source.getMap(), new StringReader(result), Mode.CLIPBOARD);
+ copy.setFolded(false);
+ return copy;
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ return null;
+ }
+ }
+
+ private void writeChildrenRTF(final NodeModel node, final Writer fileout, final int depth,
+ final HashMap<Color, Integer> colorTable) throws IOException {
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ if (child.hasVisibleContent()) {
+ writeRTF(child, fileout, depth + 1, colorTable);
+ }
+ else {
+ writeChildrenRTF(child, fileout, depth, colorTable);
+ }
+ }
+ }
+
+ private void writeChildrenText(final NodeModel node, final Writer fileout, final int depth, String indentation)
+ throws IOException {
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ if (child.hasVisibleContent()) {
+ writeTXT(child, fileout, depth + 1, indentation);
+ }
+ else {
+ writeChildrenText(child, fileout, depth, indentation);
+ }
+ }
+ }
+
+ public void writeHTML(final Collection<NodeModel> selectedNodes, final Writer fileout) throws IOException {
+ final MindMapHTMLWriter htmlWriter = new MindMapHTMLWriter(Controller.getCurrentModeController().getMapController(), fileout);
+ htmlWriter.writeHTML(selectedNodes);
+ }
+
+ public boolean writeRTF(final Collection<NodeModel> selectedNodes, final BufferedWriter fileout) {
+ try {
+ final HashSet<Color> colors = new HashSet<Color>();
+ for (final Iterator<NodeModel> it = selectedNodes.iterator(); it.hasNext();) {
+ collectColors(it.next(), colors);
+ }
+ String colorTableString = "{\\colortbl;\\red0\\green0\\blue255;";
+ final HashMap<Color, Integer> colorTable = new HashMap<Color, Integer>();
+ int colorPosition = 2;
+ for (final Color color : colors) {
+ colorTableString += "\\red" + color.getRed() + "\\green" + color.getGreen() + "\\blue"
+ + color.getBlue() + ";";
+ colorTable.put(color, new Integer(colorPosition));
+ }
+ colorTableString += "}";
+ fileout.write("{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fswiss\\fcharset0 Arial;}"
+ + colorTableString + "}" + "\\viewkind4\\uc1\\pard\\f0\\fs20{}");
+ for (final Iterator<NodeModel> it = selectedNodes.iterator(); it.hasNext();) {
+ writeRTF(it.next(), fileout,/* depth= */0, colorTable);
+ }
+ fileout.write("}");
+ return true;
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ return false;
+ }
+ }
+
+ public void writeRTF(final NodeModel mindMapNodeModel, final Writer fileout, final int depth,
+ final HashMap<Color, Integer> colorTable) throws IOException {
+ String pre = "{" + "\\li" + depth * 350;
+ String level;
+ if (depth <= 8) {
+ level = "\\outlinelevel" + depth;
+ }
+ else {
+ level = "";
+ }
+ String fontsize = "";
+ if (NodeStyleModel.getColor(mindMapNodeModel) != null) {
+ pre += "\\cf" + colorTable.get(NodeStyleModel.getColor(mindMapNodeModel)).intValue();
+ }
+ final NodeStyleModel font = NodeStyleModel.getModel(mindMapNodeModel);
+ if (font != null) {
+ if (Boolean.TRUE.equals(font.isItalic())) {
+ pre += "\\i ";
+ }
+ if (Boolean.TRUE.equals(font.isBold())) {
+ pre += "\\b ";
+ }
+ if (font.getFontSize() != null) {
+ fontsize = "\\fs" + Math.round(1.5 * font.getFontSize());
+ pre += fontsize;
+ }
+ }
+ pre += "{}";
+ fileout.write("\\li" + depth * 350 + level + "{}");
+ final String nodeText = TextController.getController().getPlainTextContent(mindMapNodeModel);
+ if (nodeText.matches(" *")) {
+ fileout.write("o");
+ }
+ else {
+ final String text = rtfEscapeUnicodeAndSpecialCharacters(nodeText);
+ if (NodeLinks.getValidLink(mindMapNodeModel) != null) {
+ final String link = rtfEscapeUnicodeAndSpecialCharacters(NodeLinks.getLinkAsString(mindMapNodeModel));
+ if (link.equals(nodeText)) {
+ fileout.write(pre + "<{\\ul\\cf1 " + link + "}>" + "}");
+ }
+ else {
+ fileout.write("{" + fontsize + pre + text + "} ");
+ fileout.write("<{\\ul\\cf1 " + link + "}}>");
+ }
+ }
+ else {
+ fileout.write(pre + text + "}");
+ }
+ }
+ fileout.write("\\par");
+ fileout.write("\n");
+ writeChildrenRTF(mindMapNodeModel, fileout, depth, colorTable);
+ }
+
+ public void writeTXT(final NodeModel mindMapNodeModel, final Writer fileout, final int depth) throws IOException {
+ boolean indentationUsesTabsInTextOutput = ResourceController.getResourceController().getBooleanProperty("indentationUsesTabsInTextOutput");
+ String indentation = indentationUsesTabsInTextOutput ? "\t" : " ";
+ writeTXT(mindMapNodeModel, fileout, depth, indentation);
+ }
+
+ private void writeTXT(final NodeModel mindMapNodeModel, final Writer fileout, final int depth, String indentation) throws IOException {
+ String plainTextContent = TextController.getController().getPlainTextContent(mindMapNodeModel).replace('\n', ' ');
+ for (int i = 0; i < depth; ++i) {
+ fileout.write(indentation);
+ }
+ if (plainTextContent.matches(" *")) {
+ fileout.write("o");
+ }
+ else {
+ if (NodeLinks.getValidLink(mindMapNodeModel) != null) {
+ final String link = NodeLinks.getLinkAsString(mindMapNodeModel);
+ if (!link.equals(plainTextContent)) {
+ fileout.write(plainTextContent + " ");
+ }
+ fileout.write("<" + link + ">");
+ }
+ else {
+ fileout.write(plainTextContent);
+ }
+ }
+ fileout.write("\n");
+ writeChildrenText(mindMapNodeModel, fileout, depth, indentation);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/clipboard/CopyAction.java b/freeplane/src/main/java/org/freeplane/features/clipboard/CopyAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/clipboard/CopyAction.java
rename to freeplane/src/main/java/org/freeplane/features/clipboard/CopyAction.java
diff --git a/freeplane/src/org/freeplane/features/clipboard/CopyIDAction.java b/freeplane/src/main/java/org/freeplane/features/clipboard/CopyIDAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/clipboard/CopyIDAction.java
rename to freeplane/src/main/java/org/freeplane/features/clipboard/CopyIDAction.java
diff --git a/freeplane/src/org/freeplane/features/clipboard/CopyNodeURIAction.java b/freeplane/src/main/java/org/freeplane/features/clipboard/CopyNodeURIAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/clipboard/CopyNodeURIAction.java
rename to freeplane/src/main/java/org/freeplane/features/clipboard/CopyNodeURIAction.java
diff --git a/freeplane/src/org/freeplane/features/clipboard/CopySingleAction.java b/freeplane/src/main/java/org/freeplane/features/clipboard/CopySingleAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/clipboard/CopySingleAction.java
rename to freeplane/src/main/java/org/freeplane/features/clipboard/CopySingleAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/clipboard/HtmlSelection.java b/freeplane/src/main/java/org/freeplane/features/clipboard/HtmlSelection.java
new file mode 100644
index 0000000..6f15114
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/clipboard/HtmlSelection.java
@@ -0,0 +1,60 @@
+package org.freeplane.features.clipboard;
+
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+// http://stackoverflow.com/questions/30518705/copy-jtextarea-as-text-html-dataflavor
+public class HtmlSelection implements Transferable {
+ private static List<DataFlavor> htmlFlavors = new ArrayList<DataFlavor>(3);
+
+ static {
+ try {
+ htmlFlavors.add(new DataFlavor("text/html;class=java.lang.String"));
+ htmlFlavors.add(new DataFlavor("text/html;class=java.io.Reader"));
+ htmlFlavors.add(new DataFlavor("text/html;charset=unicode;class=java.io.InputStream"));
+ }
+ catch (ClassNotFoundException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ private String html;
+
+ public HtmlSelection(String html) {
+ this.html = html;
+ }
+
+ public DataFlavor[] getTransferDataFlavors() {
+ return (DataFlavor[]) htmlFlavors.toArray(new DataFlavor[htmlFlavors.size()]);
+ }
+
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ return htmlFlavors.contains(flavor);
+ }
+
+ public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
+ if (String.class.equals(flavor.getRepresentationClass())) {
+ return html;
+ }
+ else if (Reader.class.equals(flavor.getRepresentationClass())) {
+ return new StringReader(html);
+ }
+ else if (InputStream.class.equals(flavor.getRepresentationClass())) {
+ // Java 7: return new ByteArrayInputStream(s.getBytes(StandardCharsets.UTF_8));
+ try {
+ return new ByteArrayInputStream(html.getBytes("UTF-8"));
+ }
+ catch (Exception e) {
+ // won't happen
+ }
+ }
+ throw new UnsupportedFlavorException(flavor);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/clipboard/MindMapHTMLWriter.java b/freeplane/src/main/java/org/freeplane/features/clipboard/MindMapHTMLWriter.java
new file mode 100644
index 0000000..e1d090c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/clipboard/MindMapHTMLWriter.java
@@ -0,0 +1,421 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.clipboard;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Collection;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.text.DetailTextModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.url.UrlManager;
+
+
+class MindMapHTMLWriter {
+ private static String el = System.getProperty("line.separator");
+
+ private static String convertSpecialChar(final char c) {
+ String cvt;
+ switch ((int) c) {
+ case 0xe4:
+ cvt = "ä";
+ break;
+ case 0xf6:
+ cvt = "ö";
+ break;
+ case 0xfc:
+ cvt = "ü";
+ break;
+ case 0xc4:
+ cvt = "Ä";
+ break;
+ case 0xd6:
+ cvt = "Ö";
+ break;
+ case 0xdc:
+ cvt = "Ü";
+ break;
+ case 0xdf:
+ cvt = "ß";
+ break;
+ default:
+ cvt = "&#" + Integer.toString((int) c) + ";";
+ break;
+ }
+ return cvt;
+ }
+
+ private static String writeHTML_escapeUnicodeAndSpecialCharacters(final String text) {
+ final int len = text.length();
+ final StringBuilder result = new StringBuilder(len);
+ int intValue;
+ char myChar;
+ boolean previousSpace = false;
+ boolean spaceOccured = false;
+ for (int i = 0; i < len; ++i) {
+ myChar = text.charAt(i);
+ intValue = (int) text.charAt(i);
+ if (intValue >= 128) {
+ result.append(MindMapHTMLWriter.convertSpecialChar(myChar));
+ }
+ else {
+ spaceOccured = false;
+ switch (myChar) {
+ case '&':
+ result.append("&");
+ break;
+ case '<':
+ result.append("<");
+ break;
+ case '>':
+ result.append(">");
+ break;
+ case ' ':
+ spaceOccured = true;
+ if (previousSpace) {
+ result.append(" ");
+ }
+ else {
+ result.append(" ");
+ }
+ break;
+ case '\n':
+ result.append("\n<br>\n");
+ break;
+ default:
+ result.append(myChar);
+ }
+ previousSpace = spaceOccured;
+ }
+ }
+ return result.toString();
+ }
+
+ final private boolean basedOnHeadings;
+ final private Writer fileout;
+ final private MapController mapController;
+ private boolean writeFoldingCode;
+ private final NodeStyleController nodeStyleController;
+ private Font defaultFont;
+ private Color defaultColor;
+
+ MindMapHTMLWriter(final MapController mapController, final Writer fileout) {
+ this.mapController = mapController;
+ nodeStyleController = NodeStyleController.getController();
+ this.fileout = fileout;
+ writeFoldingCode = false;
+ basedOnHeadings = (getProperty("html_export_folding").equals("html_export_based_on_headings"));
+ }
+
+ private String fontStyle(Color color, Font font) throws IOException {
+ StringBuilder fontStyle = new StringBuilder();
+ if(color != null && (defaultColor == null || ! color.equals(defaultColor)))
+ fontStyle.append("color: ").append(ColorUtils.colorToString(color)).append( "; ");
+ if(font != null){
+ final int fontSize = font.getSize();
+ if (defaultFont == null || fontSize != defaultFont.getSize())
+ fontStyle.append("font-size: ").append(fontSize).append( "pt; ");
+ final String fontFamily = font.getFamily();
+ if (defaultFont == null || ! fontFamily.equals(defaultFont.getFamily()))
+ fontStyle.append("font-family: ").append(fontFamily).append( ", sans-serif; ");
+ if ((defaultFont == null || ! defaultFont.isItalic()) && font.isItalic()) {
+ fontStyle.append("font-style: italic; ");
+ }
+ if ((defaultFont == null || ! defaultFont.isBold()) && font.isBold()) {
+ fontStyle.append("font-weight: bold; ");
+ }
+ }
+ return fontStyle.toString();
+ }
+
+ private String getProperty(final String key) {
+ return ResourceController.getResourceController().getProperty(key);
+ }
+
+ private void writeBodyWithFolding(final NodeModel rootNodeOfBranch) throws IOException {
+ writeJavaScript();
+ fileout.write("<SPAN class=\"foldspecial\" onclick=\"fold_document()\">All +</SPAN>" + MindMapHTMLWriter.el);
+ fileout.write("<SPAN class=\"foldspecial\" onclick=\"unfold_document()\">All -</SPAN>" + MindMapHTMLWriter.el);
+ writeHTML(rootNodeOfBranch, "1", 0, /* isRoot */true, true, /* depth */
+ 1);
+ fileout.write("<SCRIPT type=\"text/javascript\">" + MindMapHTMLWriter.el);
+ fileout.write("fold_document();" + MindMapHTMLWriter.el);
+ fileout.write("</SCRIPT>" + MindMapHTMLWriter.el);
+ }
+
+ private void writeFoldingButtons(final String localParentID) throws IOException {
+ fileout.write("<span id=\"show" + localParentID + "\" class=\"foldclosed\" onClick=\"show_folder('"
+ + localParentID + "')\" style=\"POSITION: absolute\">+</span> " + "<span id=\"hide" + localParentID
+ + "\" class=\"foldopened\" onClick=\"hide_folder('" + localParentID + "')\">-</span>");
+ fileout.write("\n");
+ }
+
+ void writeHTML(final Collection<NodeModel> selectedNodes) throws IOException {
+ fileout.write("<html>" + MindMapHTMLWriter.el + "<head>" + MindMapHTMLWriter.el);
+ if(! selectedNodes.isEmpty()){
+ final MapModel map = selectedNodes.iterator().next().getMap();
+ setDefaultsFrom(map);
+ writeStyle();
+ }
+ fileout.write(MindMapHTMLWriter.el + "</head>" + MindMapHTMLWriter.el + "<body>" + MindMapHTMLWriter.el);
+ for (NodeModel node : selectedNodes) {
+ writeHTML(node, "1", 0, /* isRoot */true, true, /* depth */1);
+ }
+ fileout.write("</body>" + MindMapHTMLWriter.el);
+ fileout.write("</html>" + MindMapHTMLWriter.el);
+ fileout.close();
+ resetDefaults();
+ }
+
+ private void resetDefaults() {
+ defaultFont = null;
+ defaultColor = null;
+ }
+
+ private void setDefaultsFrom(MapModel map) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ final NodeModel styleNode = model.getStyleNodeSafe(MapStyleModel.DEFAULT_STYLE);
+ defaultFont = nodeStyleController.getFont(styleNode);
+ defaultColor = nodeStyleController.getColor(styleNode);
+ }
+
+ void writeHTML(final NodeModel rootNodeOfBranch) throws IOException {
+ setDefaultsFrom(rootNodeOfBranch.getMap());
+ final String htmlExportFoldingOption = getProperty("html_export_folding");
+ writeFoldingCode = (htmlExportFoldingOption.equals("html_export_fold_currently_folded") && mapController
+ .hasFoldedStrictDescendant(rootNodeOfBranch))
+ || htmlExportFoldingOption.equals("html_export_fold_all");
+ ResourceController.getResourceController().getBooleanProperty("export_icons_in_html");
+ fileout
+ .write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"
+ + MindMapHTMLWriter.el + "<html>" + MindMapHTMLWriter.el + "<head>" + MindMapHTMLWriter.el);
+ fileout.write("<title>"
+ + MindMapHTMLWriter.writeHTML_escapeUnicodeAndSpecialCharacters(TextController.getController().getPlainTextContent(rootNodeOfBranch)
+ .replace('\n', ' ')) + "</title>" + MindMapHTMLWriter.el);
+ writeStyle();
+ fileout.write(MindMapHTMLWriter.el + "</head>" + MindMapHTMLWriter.el + "<body");
+ final MapStyleModel style = MapStyleModel.getExtension(rootNodeOfBranch.getMap());
+ final Color background = style != null ? style.getBackgroundColor() : null;
+ if (background != null) {
+ fileout.write(" bgcolor=" + ColorUtils.colorToString(background));
+ }
+ fileout.write(">" + MindMapHTMLWriter.el);
+ if (writeFoldingCode) {
+ writeBodyWithFolding(rootNodeOfBranch);
+ }
+ else {
+ writeHTML(rootNodeOfBranch, "1", 0, /* isRoot */true, true, /* depth */
+ 1);
+ }
+ fileout.write("</body>" + MindMapHTMLWriter.el);
+ fileout.write("</html>" + MindMapHTMLWriter.el);
+ fileout.close();
+ resetDefaults();
+ }
+
+ private int writeHTML(final NodeModel model, final String parentID, int lastChildNumber, final boolean isRoot,
+ final boolean treatAsParagraph, final int depth) throws IOException {
+ if (! model.hasVisibleContent()) {
+ for (final NodeModel child : mapController.childrenUnfolded(model)) {
+ lastChildNumber = writeHTML(child, parentID, lastChildNumber, false, false, depth);
+ }
+ return lastChildNumber;
+ }
+ boolean createFolding = false;
+ if(writeFoldingCode){
+ createFolding = mapController.isFolded(model);
+ if (getProperty("html_export_folding").equals("html_export_fold_all")) {
+ createFolding = mapController.hasChildren(model);
+ }
+ if (getProperty("html_export_folding").equals("html_export_no_folding") || basedOnHeadings || isRoot) {
+ createFolding = false;
+ }
+ }
+ final TextController textController = TextController.getController();
+ final Object userObject = model.getUserObject();
+ final String text = textController.getTransformedTextNoThrow(userObject, model, userObject);
+ final boolean hasHtml = text.startsWith("<html>");
+ final boolean heading = basedOnHeadings && !hasHtml && mapController.hasChildren(model) && depth <= 6;
+ if (!treatAsParagraph && !basedOnHeadings) {
+ fileout.write("<li>");
+ }
+ else {
+ if (heading) {
+ fileout.write("<h" + depth + ">");
+ }
+ else if (!hasHtml) {
+ fileout.write("<p>");
+ }
+ }
+ String localParentID = parentID;
+ if (createFolding) {
+ lastChildNumber++;
+ localParentID = parentID + "_" + lastChildNumber;
+ writeFoldingButtons(localParentID);
+ }
+ final String fontStyle = fontStyle(nodeStyleController.getColor(model), nodeStyleController.getFont(model));
+ if (!fontStyle.equals("")) {
+ fileout.write("<span style=\"" + fontStyle + "\">");
+ }
+ String link = NodeLinks.getLinkAsString(model);
+ if (link != null) {
+ if (link.endsWith(UrlManager.FREEPLANE_FILE_EXTENSION)) {
+ link += ".html";
+ }
+ fileout.write("<a href=\"" + link + "\" target=\"_blank\">");
+ }
+ if (ResourceController.getResourceController().getBooleanProperty("export_icons_in_html")) {
+ writeIcons(model);
+ }
+ writeModelContent(text);
+ if (link != null) {
+ fileout.write("</a>" + MindMapHTMLWriter.el);
+ }
+ if (fontStyle != "") {
+ fileout.write("</span>");
+ }
+ final String detailText = DetailTextModel.getDetailTextText(model);
+ if(detailText != null){
+ writeModelContent(detailText);
+ }
+ final String noteContent = NoteModel.getNoteText(model);
+ if(noteContent != null){
+ writeModelContent(noteContent);
+ }
+ fileout.write(MindMapHTMLWriter.el);
+ if (heading) {
+ fileout.write("</h" + depth + ">" + MindMapHTMLWriter.el);
+ }
+ if (getProperty("html_export_folding").equals("html_export_based_on_headings")) {
+ for (final NodeModel child : mapController.childrenUnfolded(model)) {
+ lastChildNumber = writeHTML(child, parentID, lastChildNumber,/*isRoot=*/false,
+ false, depth + 1);
+ }
+ return lastChildNumber;
+ }
+ if (mapController.hasChildren(model)) {
+ if (getProperty("html_export_folding").equals("html_export_based_on_headings")) {
+ for (final NodeModel child : mapController.childrenUnfolded(model)) {
+ lastChildNumber = writeHTML(child, parentID, lastChildNumber,
+ /*isRoot=*/false, false, depth + 1);
+ }
+ }
+ else if (createFolding) {
+ fileout.write("<ul id=\"fold" + localParentID
+ + "\" style=\"POSITION: relative; VISIBILITY: visible;\">");
+ int localLastChildNumber = 0;
+ for (final NodeModel child : mapController.childrenUnfolded(model)) {
+ localLastChildNumber = writeHTML(child, localParentID, localLastChildNumber,
+ /* isRoot=*/false, false, depth + 1);
+ }
+ }
+ else {
+ fileout.write("<ul>");
+ for (final NodeModel child : mapController.childrenUnfolded(model)) {
+ lastChildNumber = writeHTML(child, parentID, lastChildNumber,
+ /* isRoot= */false, false, depth + 1);
+ }
+ }
+ fileout.write(MindMapHTMLWriter.el);
+ fileout.write("</ul>");
+ }
+ if (!treatAsParagraph) {
+ fileout.write(MindMapHTMLWriter.el + "</li>" + MindMapHTMLWriter.el);
+ }
+ return lastChildNumber;
+ }
+
+ private void writeIcons(final NodeModel model) throws IOException {
+ final Collection<MindIcon> icons = IconController.getController().getIcons(model);
+ for (MindIcon icon : icons) {
+ final String iconFileName = icon.getFileName();
+ fileout.write("<img src=\"" + iconFileName + "\" alt=\"" + icon.getTranslationValueLabel() + "\">");
+ }
+ }
+
+ private void writeJavaScript() throws IOException {
+ fileout.write("<script type=\"text/javascript\">" + MindMapHTMLWriter.el);
+ fileout.write(FileUtils.slurpResource("/html/folding.js"));
+ fileout.write(MindMapHTMLWriter.el + "</script>" + MindMapHTMLWriter.el);
+ }
+
+ private void writeModelContent(final String string) throws IOException {
+ if (string.matches(" +")) {
+ fileout.write(" ");
+ }
+ else if (string.startsWith("<html")) {
+ String output = string.substring(6);
+ int start = output.indexOf("<body");
+ if (start == -1) {
+ start = output.indexOf('>') + 1;
+ }
+ else {
+ start = output.indexOf('>', start + 5) + 1;
+ }
+ int end = output.indexOf("</body>");
+ if (end == -1) {
+ end = output.indexOf("</html>");
+ }
+ if (end == -1) {
+ end = output.length();
+ }
+ output = output.substring(start, end);
+ fileout.write(output);
+ }
+ else {
+ fileout.write(HtmlUtils.unicodeToHTMLUnicodeEntity(string));
+ }
+ }
+ private void writeStyle() throws IOException {
+ fileout.write("<style type=\"text/css\">" + MindMapHTMLWriter.el);
+ fileout.write(" body {");
+ writeDefaultFontStyle();
+ fileout.write("}" + MindMapHTMLWriter.el);
+ fileout.write(FileUtils.slurpResource("/html/freeplane.css"));
+ if(writeFoldingCode)
+ fileout.write(FileUtils.slurpResource("/html/folding.css"));
+ fileout.write(MindMapHTMLWriter.el + MindMapHTMLWriter.el + "</style>" + MindMapHTMLWriter.el
+ + "<!-- ^ Position is not set to relative / absolute here because of Mozilla -->");
+ }
+
+ private void writeDefaultFontStyle() throws IOException {
+ Font font = defaultFont;
+ defaultFont = null;
+ Color color = defaultColor;
+ defaultColor = null;
+ fileout.write(fontStyle(color, font));
+ defaultFont = font;
+ defaultColor = color;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/clipboard/MindMapNodesSelection.java b/freeplane/src/main/java/org/freeplane/features/clipboard/MindMapNodesSelection.java
new file mode 100644
index 0000000..2966696
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/clipboard/MindMapNodesSelection.java
@@ -0,0 +1,143 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.clipboard;
+
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.ClipboardOwner;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.ByteArrayInputStream;
+import java.util.Collection;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.NodeModel;
+
+public class MindMapNodesSelection implements Transferable, ClipboardOwner {
+ public static DataFlavor dropActionFlavor = null;
+ public static DataFlavor fileListFlavor = null;
+ public static DataFlavor htmlFlavor = null;
+ public static DataFlavor mindMapNodesFlavor = null;
+ public static DataFlavor mindMapNodeObjectsFlavor = null;
+ public static DataFlavor mindMapNodeSingleObjectsFlavor = null;
+ public static DataFlavor rtfFlavor = null;
+ static {
+ try {
+ MindMapNodesSelection.mindMapNodesFlavor = new DataFlavor("text/freeplane-nodes; class=java.lang.String");
+ MindMapNodesSelection.mindMapNodeObjectsFlavor = new DataFlavor("application/freeplane-nodes; class=java.util.Collection");
+ MindMapNodesSelection.mindMapNodeSingleObjectsFlavor = new DataFlavor("application/freeplane-single-nodes; class=java.util.Collection");
+ MindMapNodesSelection.rtfFlavor = new DataFlavor("text/rtf; class=java.io.InputStream");
+ MindMapNodesSelection.htmlFlavor = new DataFlavor("text/html; class=java.lang.String");
+ MindMapNodesSelection.fileListFlavor = new DataFlavor("application/x-java-file-list; class=java.util.List");
+ MindMapNodesSelection.dropActionFlavor = new DataFlavor("text/drop-action; class=java.lang.String");
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+ final private String htmlContent;
+ final private String nodesContent;
+ final private String rtfContent;
+ final private String stringContent;
+ private String dropActionContent;
+ private Collection<NodeModel> nodes;
+ private boolean selectionContainsSingleNodes;
+
+ public MindMapNodesSelection(final String nodesContent, final String stringContent, final String rtfContent,
+ final String htmlContent) {
+ this.nodesContent = nodesContent;
+ this.rtfContent = rtfContent;
+ this.stringContent = stringContent;
+ this.htmlContent = htmlContent;
+ this.dropActionContent = null;
+ }
+
+ public MindMapNodesSelection(final String nodesContent) {
+ this(nodesContent, null, null, null);
+ }
+
+ public Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException {
+ if (flavor.equals(DataFlavor.stringFlavor)) {
+ return stringContent;
+ }
+ if (flavor.equals(MindMapNodesSelection.mindMapNodesFlavor)) {
+ return nodesContent;
+ }
+ if (flavor.equals(MindMapNodesSelection.dropActionFlavor)) {
+ return dropActionContent;
+ }
+ if (flavor.equals(MindMapNodesSelection.rtfFlavor)) {
+ final byte[] byteArray = rtfContent.getBytes();
+ return new ByteArrayInputStream(byteArray);
+ }
+ if (flavor.equals(MindMapNodesSelection.htmlFlavor) && htmlContent != null) {
+ return htmlContent;
+ }
+ if (containsObjectsFor(flavor)) {
+ return nodes;
+ }
+ throw new UnsupportedFlavorException(flavor);
+ }
+
+ boolean containsObjectsFor(final DataFlavor flavor) {
+ return nodes != null && (flavor.equals(MindMapNodesSelection.mindMapNodeObjectsFlavor) && ! selectionContainsSingleNodes
+ || flavor.equals(MindMapNodesSelection.mindMapNodeSingleObjectsFlavor) && selectionContainsSingleNodes);
+ }
+
+ public DataFlavor[] getTransferDataFlavors() {
+ return new DataFlavor[] { DataFlavor.stringFlavor, MindMapNodesSelection.mindMapNodesFlavor,
+ MindMapNodesSelection.rtfFlavor, MindMapNodesSelection.htmlFlavor,
+ MindMapNodesSelection.dropActionFlavor,
+ MindMapNodesSelection.mindMapNodeObjectsFlavor , MindMapNodesSelection.mindMapNodeSingleObjectsFlavor };
+ }
+
+ public boolean isDataFlavorSupported(final DataFlavor flavor) {
+ if (flavor.equals(DataFlavor.stringFlavor) && stringContent != null) {
+ return true;
+ }
+ if (flavor.equals(MindMapNodesSelection.mindMapNodesFlavor) && nodesContent != null) {
+ return true;
+ }
+ if (flavor.equals(MindMapNodesSelection.rtfFlavor) && rtfContent != null) {
+ return true;
+ }
+ if (flavor.equals(MindMapNodesSelection.dropActionFlavor) && dropActionContent != null) {
+ return true;
+ }
+ if (flavor.equals(MindMapNodesSelection.htmlFlavor) && htmlContent != null) {
+ return true;
+ }
+ if (containsObjectsFor(flavor)) {
+ return true;
+ }
+ return false;
+ }
+
+ public void lostOwnership(final Clipboard clipboard, final Transferable contents) {
+ }
+
+ public void setDropAction(final String dropActionContent) {
+ this.dropActionContent = dropActionContent;
+ }
+
+ public void setNodeObjects(Collection<NodeModel> collection, boolean selectionContainsSingleNodes) {
+ nodes = collection;
+ this.selectionContainsSingleNodes = selectionContainsSingleNodes;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/clipboard/SingleCopySource.java b/freeplane/src/main/java/org/freeplane/features/clipboard/SingleCopySource.java
new file mode 100644
index 0000000..d12acf6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/clipboard/SingleCopySource.java
@@ -0,0 +1,366 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.clipboard;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.tree.MutableTreeNode;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.filter.FilterInfo;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.map.HistoryInformationModel;
+import org.freeplane.features.map.INodeView;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.ui.INodeViewVisitor;
+
+/**
+ * @author Dimitry Polivaev
+ * 03.02.2013
+ */
+class SingleCopySource extends NodeModel {
+
+ private static final String METHOD_NOT_SUPPORTED = "method not supported";
+ private final NodeModel delegate;
+
+ @Override
+ protected List<NodeModel> getChildrenInternal() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ protected void init(final Object userObject) {
+ }
+
+ public SingleCopySource(NodeModel delegate) {
+ super(null);
+ this.delegate =delegate;
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+ @Override
+ public Object getUserObject() {
+ return delegate.getUserObject();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ return super.equals(obj);
+ }
+
+ @Override
+ public void acceptViewVisitor(INodeViewVisitor visitor) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void addExtension(IExtension extension) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public IExtension putExtension(IExtension extension) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void addIcon(MindIcon icon) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void addIcon(MindIcon icon, int position) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void addViewer(INodeView viewer) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public boolean areViewsEmpty() {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public Enumeration<NodeModel> children() {
+ return super.children();
+ }
+
+ @Override
+ public boolean containsExtension(Class<? extends IExtension> clazz) {
+ return delegate.containsExtension(clazz);
+ }
+
+ @Override
+ public String createID() {
+ return delegate.createID();
+ }
+
+ @Override
+ public void fireNodeChanged(NodeChangeEvent nodeChangeEvent) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public boolean getAllowsChildren() {
+ return delegate.getAllowsChildren();
+ }
+
+ @Override
+ public NodeModel getChildAt(int childIndex) {
+ return super.getChildAt(childIndex);
+ }
+
+ @Override
+ public int getChildCount() {
+ return super.getChildCount();
+ }
+
+ @Override
+ public List<NodeModel> getChildren() {
+ return super.getChildren();
+ }
+
+ @Override
+ public <T extends IExtension> T getExtension(Class<T> clazz) {
+ return delegate.getExtension(clazz);
+ }
+
+ @Override
+ public Map<Class<? extends IExtension>, IExtension> getSharedExtensions() {
+ return delegate.getSharedExtensions();
+ }
+
+ @Override
+ public FilterInfo getFilterInfo() {
+ return delegate.getFilterInfo();
+ }
+
+ @Override
+ public HistoryInformationModel getHistoryInformation() {
+ return delegate.getHistoryInformation();
+ }
+
+ @Override
+ public MindIcon getIcon(int position) {
+ return delegate.getIcon(position);
+ }
+
+ @Override
+ public List<MindIcon> getIcons() {
+ return delegate.getIcons();
+ }
+
+ @Override
+ public String getID() {
+ return delegate.getID();
+ }
+
+ @Override
+ public int getIndex(NodeModel node) {
+ return super.getIndex(node);
+ }
+
+ @Override
+ public MapModel getMap() {
+ return delegate.getMap();
+ }
+
+ @Override
+ public int getNodeLevel(boolean countHidden) {
+ return delegate.getNodeLevel(countHidden);
+ }
+
+ @Override
+ public NodeModel getParentNode() {
+ return delegate.getParentNode();
+ }
+
+ @Override
+ public NodeModel[] getPathToRoot() {
+ return delegate.getPathToRoot();
+ }
+
+ @Override
+ public String getText() {
+ return delegate.getText();
+ }
+
+ @Override
+ public Collection<INodeView> getViewers() {
+ return delegate.getViewers();
+ }
+
+ @Override
+ public boolean hasChildren() {
+ return false;
+ }
+
+ @Override
+ public boolean hasID() {
+ return delegate.hasID();
+ }
+
+ public void insert(MutableTreeNode child, int index) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public boolean isDescendantOf(NodeModel node) {
+ return delegate.isDescendantOf(node);
+ }
+
+ @Override
+ public boolean isFolded() {
+ return false;
+ }
+
+ @Override
+ public boolean isLeaf() {
+ return delegate.isLeaf();
+ }
+
+ @Override
+ public boolean isLeft() {
+ return delegate.isLeft();
+ }
+
+ @Override
+ public boolean isNewChildLeft() {
+ return delegate.isNewChildLeft();
+ }
+
+ @Override
+ public boolean isRoot() {
+ return delegate.isRoot();
+ }
+
+ @Override
+ public boolean isVisible() {
+ return delegate.isVisible();
+ }
+
+ @Override
+ public boolean hasVisibleContent() {
+ return delegate.hasVisibleContent();
+ }
+
+ @Override
+ public boolean isHiddenSummary() {
+ return delegate.isHiddenSummary();
+ }
+
+ public void remove(MutableTreeNode node) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public <T extends IExtension> T removeExtension(Class<T> clazz) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public boolean removeExtension(IExtension extension) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public int removeIcon() {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public int removeIcon(int position) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void removeViewer(INodeView viewer) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void setFolded(boolean folded) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void setHistoryInformation(HistoryInformationModel historyInformation) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void setID(String value) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void setLeft(boolean isLeft) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void setMap(MapModel map) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ public void setParent(MutableTreeNode newParent) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public void setParent(NodeModel newParent) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public String toString() {
+ return delegate.toString();
+ }
+
+ @Override
+ public int depth() {
+ return delegate.depth();
+ }
+
+ @Override
+ public void insert(NodeModel newNodeModel) {
+ throw new RuntimeException(METHOD_NOT_SUPPORTED);
+ }
+
+ @Override
+ public NodeModel getVisibleAncestorOrSelf() {
+ return delegate.getVisibleAncestorOrSelf();
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/CloneAction.java b/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/CloneAction.java
new file mode 100644
index 0000000..2c7f0c9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/CloneAction.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.clipboard.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+class CloneAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public CloneAction() {
+ super("CloneAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MClipboardController clipboardController = (MClipboardController) ClipboardController
+ .getController();
+ final NodeModel parent = Controller.getCurrentController().getSelection().getSelected();
+ clipboardController.addClone(clipboardController.getClipboardContents(), parent);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/clipboard/mindmapmode/CutAction.java b/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/CutAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/clipboard/mindmapmode/CutAction.java
rename to freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/CutAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/MClipboardController.java b/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/MClipboardController.java
new file mode 100644
index 0000000..3b816be
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/MClipboardController.java
@@ -0,0 +1,882 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.clipboard.mindmapmode;
+
+import java.awt.Graphics2D;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.dnd.DnDConstants;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.imageio.ImageIO;
+import javax.swing.JFileChooser;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.ElementIterator;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.FixedHTMLWriter;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.clipboard.MindMapNodesSelection;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.CloneEncryptedNodeException;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapReader;
+import org.freeplane.features.map.MapReader.NodeTreeCreator;
+import org.freeplane.features.map.MapWriter.Hint;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.map.mindmapmode.SummaryGroupEdgeListAdder;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.view.swing.features.filepreview.ExternalResource;
+import org.freeplane.view.swing.features.filepreview.ViewerController;
+import org.freeplane.view.swing.features.filepreview.ViewerController.PasteMode;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MClipboardController extends ClipboardController {
+ public static final String RESOURCES_REMIND_USE_RICH_TEXT_IN_NEW_NODES = "remind_use_rich_text_in_new_nodes";
+ private class DirectHtmlFlavorHandler implements IDataFlavorHandler {
+ private String textFromClipboard;
+
+ public DirectHtmlFlavorHandler(final String textFromClipboard) {
+ this.textFromClipboard = textFromClipboard;
+ }
+
+ void paste(final NodeModel target) {
+ textFromClipboard = cleanHtml(textFromClipboard);
+ final NodeModel node = Controller.getCurrentModeController().getMapController().newNode(textFromClipboard,
+ Controller.getCurrentController().getMap());
+ final String text = textFromClipboard;
+ final Matcher m = HREF_PATTERN.matcher(text);
+ if (m.matches()) {
+ final String body = m.group(2);
+ if (!body.matches(".*<\\s*a.*")) {
+ final String href = m.group(1);
+ ((MLinkController) LinkController.getController()).setLinkTypeDependantLink(node, href);
+ }
+ }
+ ((MMapController) Controller.getCurrentModeController().getMapController()).insertNode(node, target);
+ }
+
+ public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
+ paste(target);
+ }
+ }
+
+ private class FileListFlavorHandler implements IDataFlavorHandler {
+ final List<File> fileList;
+
+ public FileListFlavorHandler(final List<File> fileList) {
+ super();
+ this.fileList = fileList;
+ }
+
+ public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
+ boolean pasteImages = dropAction == DnDConstants.ACTION_COPY;
+ ViewerController viewerController = ((ViewerController)Controller.getCurrentModeController().getExtension(ViewerController.class));
+ for (final File file : fileList) {
+ if(pasteImages && viewerController.paste(file, target, PasteMode.valueOf(asSibling), isLeft)){
+ continue;
+ }
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ final NodeModel node = mapController.newNode(file.getName(), target.getMap());
+ ((MLinkController) LinkController.getController()).setLinkTypeDependantLink(node, file);
+ mapController.insertNode(node, target, asSibling, isLeft, isLeft);
+ }
+ }
+ }
+
+ interface IDataFlavorHandler {
+ void paste(Transferable t, NodeModel target, boolean asSibling, boolean isLeft, int dropAction);
+ }
+
+ private class MindMapNodesFlavorHandler implements IDataFlavorHandler {
+ private final String textFromClipboard;
+
+ public MindMapNodesFlavorHandler(final String textFromClipboard) {
+ this.textFromClipboard = textFromClipboard;
+ }
+
+ public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
+ if (textFromClipboard != null) {
+ paste(textFromClipboard, target, asSibling, isLeft);
+ }
+ }
+
+ private void paste(final String text, final NodeModel target, final boolean asSibling, final boolean isLeft) {
+ final String[] textLines = text.split(ClipboardController.NODESEPARATOR);
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ final MapReader mapReader = mapController.getMapReader();
+ final NodeTreeCreator nodeTreeCreator = mapReader.nodeTreeCreator(target.getMap());
+ nodeTreeCreator.setHint(Hint.MODE, Mode.CLIPBOARD);
+ for (int i = 0; i < textLines.length; ++i) {
+ try {
+ final NodeModel newModel = nodeTreeCreator.create(new StringReader(textLines[i]));
+ newModel.removeExtension(FreeNode.class);
+ final boolean wasLeft = newModel.isLeft();
+ mapController.insertNode(newModel, target, asSibling, isLeft, wasLeft != isLeft);
+ }
+ catch (final XMLException e) {
+ LogUtils.severe("error on paste", e);
+ }
+ }
+ nodeTreeCreator.finish(target);
+ }
+ }
+
+ private static class PasteHtmlWriter extends FixedHTMLWriter {
+ private final Element element;
+
+ public PasteHtmlWriter(final Writer writer, final Element element, final HTMLDocument doc, final int pos,
+ final int len) {
+ super(writer, doc, pos, len);
+ this.element = getStandAloneElement(element);
+ }
+
+ @Override
+ protected ElementIterator getElementIterator() {
+ return new ElementIterator(element);
+ }
+
+ private Element getStandAloneElement(final Element element) {
+ final String name = element.getName();
+ if (name.equals("ul") || name.equals("ol") || name.equals("table") || name.equals("html")) {
+ return element;
+ }
+ return getStandAloneElement(element.getParentElement());
+ }
+
+ @Override
+ public void write() throws IOException, BadLocationException {
+ if (element.getName().equals("html")) {
+ super.write();
+ return;
+ }
+ write("<html>");
+ super.write();
+ write("</html>");
+ }
+ }
+
+ private class StringFlavorHandler implements IDataFlavorHandler {
+ private final String textFromClipboard;
+
+ public StringFlavorHandler(final String textFromClipboard) {
+ this.textFromClipboard = textFromClipboard;
+ }
+
+ public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
+ final TextFragment[] textFragments = split(textFromClipboard);
+ pasteStringWithoutRedisplay(textFragments, target, asSibling, isLeft);
+ }
+
+ private TextFragment[] split(final String textFromClipboard) {
+ final LinkedList<TextFragment> textFragments = new LinkedList<TextFragment>();
+ final String[] textLines = textFromClipboard.split("\n");
+ for (int i = 0; i < textLines.length; ++i) {
+ String text = textLines[i];
+ text = text.replaceAll("\t", " ");
+ if (text.matches(" *")) {
+ continue;
+ }
+ int depth = 0;
+ while (depth < text.length() && text.charAt(depth) == ' ') {
+ ++depth;
+ }
+ final String visibleText = text.trim();
+ final String link = LinkController.findLink(text);
+ if (!visibleText.equals("")) {
+ textFragments.add(new TextFragment(visibleText, link, depth));
+ }
+ }
+ return textFragments.toArray(new TextFragment[textFragments.size()]);
+ }
+ }
+
+ private class StructuredHtmlFlavorHandler implements IDataFlavorHandler {
+ private final String textFromClipboard;
+
+ public StructuredHtmlFlavorHandler(final String textFromClipboard) {
+ this.textFromClipboard = textFromClipboard;
+ }
+
+ private String addFragment(final HTMLDocument doc, final Element element, final int depth, final int start,
+ final int end, final LinkedList<TextFragment> htmlFragments)
+ throws BadLocationException, IOException {
+ final String paragraphText = doc.getText(start, end - start).trim();
+ if (paragraphText.length() > 0) {
+ final StringWriter out = new StringWriter();
+ new PasteHtmlWriter(out, element, doc, start, end - start).write();
+ final String string = out.toString();
+ if (!string.equals("")) {
+ final String link = LinkController.findLink(string);
+ final TextFragment htmlFragment = new TextFragment(string, link, depth);
+ htmlFragments.add(htmlFragment);
+ }
+ }
+ return paragraphText;
+ }
+
+ private Element getParentElement(final HTMLDocument doc) {
+ final Element htmlRoot = doc.getDefaultRootElement();
+ final Element bodyElement = htmlRoot.getElement(htmlRoot.getElementCount() - 1);
+ Element parentCandidate = bodyElement;
+ do {
+ if (parentCandidate.getElementCount() > 1) {
+ return parentCandidate;
+ }
+ parentCandidate = parentCandidate.getElement(0);
+ } while (!(parentCandidate.isLeaf() || parentCandidate.getName().equalsIgnoreCase("p-implied")));
+ return bodyElement;
+ }
+
+ private boolean isSeparateElement(final Element current) {
+ return !current.isLeaf();
+ }
+
+ public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
+ pasteHtmlWithoutRedisplay(textFromClipboard, target, asSibling, isLeft);
+ }
+
+ private void pasteHtmlWithoutRedisplay(final Object t, final NodeModel parent, final boolean asSibling,
+ final boolean isLeft) {
+ String textFromClipboard = (String) t;
+ textFromClipboard = cleanHtml(textFromClipboard);
+ final TextFragment[] htmlFragments = split(textFromClipboard);
+ pasteStringWithoutRedisplay(htmlFragments, parent, asSibling, isLeft);
+ }
+
+ private void split(final HTMLDocument doc, final Element parent, final LinkedList<TextFragment> htmlFragments,
+ int depth) throws BadLocationException, IOException {
+ final int elementCount = parent.getElementCount();
+ int headerDepth = 0;
+ boolean headerFound = false;
+ int start = -1;
+ int end = -1;
+ Element last = null;
+ for (int i = 0; i < elementCount; i++) {
+ final Element current = parent.getElement(i);
+ final String name = current.getName();
+ final Matcher matcher = HEADER_REGEX.matcher(name);
+ if (matcher.matches()) {
+ try {
+ if (!headerFound) {
+ depth--;
+ }
+ final int newHeaderDepth = Integer.parseInt(matcher.group(1));
+ depth += newHeaderDepth - headerDepth;
+ headerDepth = newHeaderDepth;
+ headerFound = true;
+ }
+ catch (final NumberFormatException e) {
+ LogUtils.severe(e);
+ }
+ }
+ else {
+ if (headerFound) {
+ headerFound = false;
+ depth++;
+ }
+ }
+ final boolean separateElement = isSeparateElement(current);
+ if (separateElement && current.getElementCount() != 0) {
+ start = -1;
+ last = null;
+ split(doc, current, htmlFragments, depth + 1);
+ continue;
+ }
+ if (separateElement && start != -1) {
+ addFragment(doc, last, depth, start, end, htmlFragments);
+ }
+ if (start == -1 || separateElement) {
+ start = current.getStartOffset();
+ last = current;
+ }
+ end = current.getEndOffset();
+ if (separateElement) {
+ addFragment(doc, current, depth, start, end, htmlFragments);
+ }
+ }
+ if (start != -1) {
+ addFragment(doc, last, depth, start, end, htmlFragments);
+ }
+ }
+
+ private TextFragment[] split(final String text) {
+ final LinkedList<TextFragment> htmlFragments = new LinkedList<TextFragment>();
+ final HTMLEditorKit kit = new HTMLEditorKit();
+ final HTMLDocument doc = new HTMLDocument();
+ final StringReader buf = new StringReader(text);
+ try {
+ kit.read(buf, doc, 0);
+ final Element parent = getParentElement(doc);
+ split(doc, parent, htmlFragments, 0);
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ catch (final BadLocationException e) {
+ LogUtils.severe(e);
+ }
+ return htmlFragments.toArray(new TextFragment[htmlFragments.size()]);
+ }
+ }
+
+ private static class TextFragment {
+ int depth;
+ String link;
+ String text;
+
+ public TextFragment(final String text, final String link, final int depth) {
+ super();
+ this.text = text;
+ this.depth = depth;
+ this.link = link;
+ }
+ }
+
+ private class ImageFlavorHandler implements IDataFlavorHandler {
+ private static final String IMAGE_FORMAT = "png";
+ final private BufferedImage image;
+
+ public ImageFlavorHandler(BufferedImage img) {
+ super();
+ BufferedImage fixedImg = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
+ Graphics2D fig = fixedImg.createGraphics();
+ fig.drawImage(img, 0, 0, null);
+ fig.dispose();
+ fixedImg.flush();
+ this.image = fixedImg;
+ }
+
+ public void paste(Transferable t, NodeModel target, boolean asSibling, boolean isLeft, int dropAction) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MMapController mapController = (MMapController) modeController.getMapController();
+ File mindmapFile = target.getMap().getFile();
+ if(mindmapFile == null) {
+ UITools.errorMessage(TextUtils.getRawText("map_not_saved"));
+ return;
+ }
+ final String mmFileName = mindmapFile.getName();
+ String fileNameTemplate = mmFileName.substring(0, mmFileName.lastIndexOf('.')) + "_";
+ while (fileNameTemplate.length() < 3)
+ fileNameTemplate = fileNameTemplate + '_';
+ //file that we'll save to disk.
+ File file;
+ try {
+ final File dir = mindmapFile.getParentFile();
+ file = File.createTempFile(fileNameTemplate, "."+IMAGE_FORMAT, dir);
+ String imgfilepath=file.getAbsolutePath();
+ File tempFile = file = new File(imgfilepath);
+ final JFileChooser fileChooser = new JFileChooser(file);
+ final ExampleFileFilter filter = new ExampleFileFilter();
+ filter.addExtension(IMAGE_FORMAT);
+ fileChooser.setAcceptAllFileFilterUsed(false);
+ fileChooser.setFileFilter(filter);
+ fileChooser.setSelectedFile(file);
+ int returnVal = fileChooser.showSaveDialog(UITools.getCurrentRootComponent());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ tempFile.delete();
+ return;
+ }
+ file = fileChooser.getSelectedFile();
+ if(tempFile.exists() && ! file.getAbsoluteFile().equals(tempFile)){
+ tempFile.delete();
+ }
+ if(file.isDirectory())
+ return;
+ if(! FileUtils.getExtension(file.getName()).equals(IMAGE_FORMAT))
+ file = new File(file.getPath() + '.' + IMAGE_FORMAT);
+ final URI uri = LinkController.toLinkTypeDependantURI(mindmapFile, file);
+ ImageIO.write(image, IMAGE_FORMAT, file);
+ final NodeModel node = mapController.newNode(file.getName(), target.getMap());
+ final ExternalResource extension = new ExternalResource(uri);
+ node.addExtension(extension);
+ mapController.insertNode(node, target, asSibling, isLeft, isLeft);
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ private static final Pattern HEADER_REGEX = Pattern.compile("h(\\d)", Pattern.CASE_INSENSITIVE);
+ private static final Pattern HREF_PATTERN = Pattern
+ .compile("<html>\\s*<body>\\s*<a\\s+href=\"([^>]+)\">(.*)</a>\\s*</body>\\s*</html>");
+ private static final String RESOURCE_UNFOLD_ON_PASTE = "unfold_on_paste";
+ public static final String RESOURCES_CUT_NODES_WITHOUT_QUESTION = "cut_nodes_without_question";
+
+ public static String firstLetterCapitalized(final String text) {
+ if (text == null || text.length() == 0) {
+ return text;
+ }
+ return text.substring(0, 1).toUpperCase() + text.substring(1, text.length());
+ }
+
+ private List<NodeModel> newNodes;
+
+ /**
+ * @param modeController
+ */
+ public MClipboardController() {
+ super();
+ createActions();
+ }
+
+ private String cleanHtml(String in) {
+ in = in.replaceFirst("(?i)(?s)<head>.*</head>", "").replaceFirst("(?i)(?s)^.*<html[^>]*>", "<html>")
+ .replaceFirst("(?i)(?s)<body [^>]*>", "<body>").replaceAll("(?i)(?s)<script.*?>.*?</script>", "")
+ .replaceAll("(?i)(?s)</?tbody.*?>", "").replaceAll("(?i)(?s)<!--.*?-->", "").replaceAll(
+ "(?i)(?s)</?o[^>]*>", "");
+ if (StringUtils.equals(ResourceController.getResourceController().getProperty(
+ "cut_out_pictures_when_pasting_html"), "true")) {
+ in = in.replaceAll("(?i)(?s)<img[^>]*>", "");
+ }
+ in = HtmlUtils.unescapeHTMLUnicodeEntity(in);
+ return in;
+ }
+
+ /**
+ * @param modeController
+ */
+ private void createActions() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addAction(new CutAction());
+ modeController.addAction(new PasteAction());
+ modeController.addAction(new SelectedPasteAction());
+ modeController.addAction(new CloneAction());
+ modeController.addAction(new MoveAction());
+ }
+
+
+
+ @Override
+ public Transferable copy(IMapSelection selection) {
+ final List<NodeModel> collection = selection.getSortedSelection(true);
+ final MindMapNodesSelection transferable = copy(new SummaryGroupEdgeListAdder(collection).addSummaryEdgeNodes(), false);
+ transferable.setNodeObjects(collection, false);
+ return transferable;
+ }
+
+
+
+ @Override
+ public Transferable copySingle(Collection<NodeModel> source) {
+ final MindMapNodesSelection transferable = (MindMapNodesSelection) super.copySingle(source);
+ transferable.setNodeObjects(new ArrayList<NodeModel>(source), true);
+ return transferable;
+ }
+
+ Transferable cut(final List<NodeModel> collection) {
+ Controller.getCurrentModeController().getMapController().sortNodesByDepth(collection);
+ final MindMapNodesSelection transferable = copy(new SummaryGroupEdgeListAdder(collection).addSummaryEdgeNodes(), true);
+ ((MMapController) Controller.getCurrentModeController().getMapController()).deleteNodes(collection);
+ setClipboardContents(transferable);
+ return transferable;
+ }
+
+ private IDataFlavorHandler getFlavorHandler(final Transferable t) {
+ if (t.isDataFlavorSupported(MindMapNodesSelection.mindMapNodesFlavor)) {
+ try {
+ final String textFromClipboard = t.getTransferData(MindMapNodesSelection.mindMapNodesFlavor).toString();
+ return new MindMapNodesFlavorHandler(textFromClipboard);
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ if (t.isDataFlavorSupported(MindMapNodesSelection.fileListFlavor)) {
+ try {
+ final List<File> fileList = castToFileList(t.getTransferData(MindMapNodesSelection.fileListFlavor));
+ if (!shouldIgnoreFileListFlavor(fileList))
+ return new FileListFlavorHandler(fileList);
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ final ResourceController resourceController = ResourceController.getResourceController();
+ DataFlavor supportedHtmlFlavor = getSupportedHtmlFlavor(t);
+ if (supportedHtmlFlavor != null) {
+ try {
+ final String textFromClipboard = t.getTransferData(supportedHtmlFlavor).toString();
+ if (textFromClipboard.charAt(0) != 65533) {
+ if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+ final MTextController textController = (MTextController) TextController
+ .getController();
+ final boolean richText = textController.useRichTextInEditor(RESOURCES_REMIND_USE_RICH_TEXT_IN_NEW_NODES);
+ if (richText) {
+ final boolean structuredHtmlImport = resourceController
+ .getBooleanProperty("structured_html_import");
+ final IDataFlavorHandler htmlFlavorHandler;
+ if (structuredHtmlImport) {
+ htmlFlavorHandler = new StructuredHtmlFlavorHandler(textFromClipboard);
+ }
+ else {
+ htmlFlavorHandler = new DirectHtmlFlavorHandler(textFromClipboard);
+ }
+ return htmlFlavorHandler;
+ }
+ }
+ }
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+ try {
+ final String plainTextFromClipboard = t.getTransferData(DataFlavor.stringFlavor).toString();
+ return new StringFlavorHandler(plainTextFromClipboard);
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
+ try {
+ BufferedImage image = (BufferedImage) t.getTransferData(DataFlavor.imageFlavor);
+ return new ImageFlavorHandler(image);
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ return null;
+ }
+
+ private boolean shouldIgnoreFileListFlavor(final List<File> fileList) {
+ if(fileList.isEmpty())
+ return true;
+ final File file = fileList.get(0);
+ if(file.isDirectory())
+ return false;
+ final String name = file.getName();
+ return name.endsWith(".URL") || name.endsWith(".url");
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<File> castToFileList(Object transferData) {
+ return (List<File>) transferData;
+ }
+
+ Collection<IDataFlavorHandler> getFlavorHandlers() {
+ final Transferable t = getClipboardContents();
+ final Collection<IDataFlavorHandler> handlerList = new LinkedList<IDataFlavorHandler>();
+ if (t == null) {
+ return handlerList;
+ }
+ if (t.isDataFlavorSupported(MindMapNodesSelection.mindMapNodesFlavor)) {
+ try {
+ final String textFromClipboard = t.getTransferData(MindMapNodesSelection.mindMapNodesFlavor).toString();
+ handlerList.add(new MindMapNodesFlavorHandler(textFromClipboard));
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ DataFlavor supportedHtmlFlavor = getSupportedHtmlFlavor(t);
+ if (supportedHtmlFlavor != null) {
+ try {
+ final String textFromClipboard = t.getTransferData(supportedHtmlFlavor).toString();
+ if (textFromClipboard.charAt(0) != 65533) {
+ if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+ handlerList.add(new StructuredHtmlFlavorHandler(textFromClipboard));
+ handlerList.add(new DirectHtmlFlavorHandler(textFromClipboard));
+ }
+ }
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+ try {
+ final String plainTextFromClipboard = t.getTransferData(DataFlavor.stringFlavor).toString();
+ handlerList.add(new StringFlavorHandler(plainTextFromClipboard));
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ if (t.isDataFlavorSupported(MindMapNodesSelection.fileListFlavor)) {
+ try {
+ final List<File> fileList = castToFileList(t.getTransferData(MindMapNodesSelection.fileListFlavor));
+ handlerList.add(new FileListFlavorHandler(fileList));
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
+ try {
+ BufferedImage image = (BufferedImage) t.getTransferData(DataFlavor.imageFlavor);
+ handlerList.add(new ImageFlavorHandler(image));
+ }
+ catch (final UnsupportedFlavorException e) {
+ }
+ catch (final IOException e) {
+ }
+ }
+ return handlerList;
+ }
+ private DataFlavor getSupportedHtmlFlavor(Transferable t) {
+ for (DataFlavor dataFlavor : t.getTransferDataFlavors())
+ if(dataFlavor.getPrimaryType().equals(MindMapNodesSelection.htmlFlavor.getPrimaryType())
+ && dataFlavor.getSubType().equals(MindMapNodesSelection.htmlFlavor.getSubType())
+ && dataFlavor.getRepresentationClass().equals(MindMapNodesSelection.htmlFlavor.getRepresentationClass())
+ )
+ return dataFlavor;
+ return null;
+ }
+
+ public void paste(final Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft) {
+ paste(t, target, asSibling, isLeft, DnDConstants.ACTION_NONE);
+ }
+
+ public void paste(final Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
+ if (t == null) {
+ return;
+ }
+ /*
+ * DataFlavor[] fl = t.getTransferDataFlavors(); for (int i = 0; i <
+ * fl.length; i++) { System.out.println(fl[i]); }
+ */
+ final IDataFlavorHandler handler = getFlavorHandler(t);
+ paste(t, handler, target, asSibling, isLeft, dropAction);
+ }
+
+ void paste(final Transferable t, final IDataFlavorHandler handler, final NodeModel target, final boolean asSibling, final boolean isLeft) {
+ paste(t, handler, target, asSibling, isLeft, DnDConstants.ACTION_NONE);
+ }
+
+ void paste(final Transferable t, final IDataFlavorHandler handler, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
+ if (handler == null) {
+ return;
+ }
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ if (asSibling && !mapController.isWriteable(target.getParentNode()) || !asSibling
+ && !mapController.isWriteable(target)) {
+ final String message = TextUtils.getText("node_is_write_protected");
+ UITools.errorMessage(message);
+ return;
+ }
+ try {
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ if (newNodes == null) {
+ newNodes = new LinkedList<NodeModel>();
+ }
+ newNodes.clear();
+ handler.paste(t, target, asSibling, isLeft, dropAction);
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (!asSibling && modeController.getMapController().isFolded(target)
+ && ResourceController.getResourceController().getBooleanProperty(RESOURCE_UNFOLD_ON_PASTE)) {
+ modeController.getMapController().setFoldedAndScroll(target, false);
+ }
+ for (final NodeModel child : newNodes) {
+ AttributeController.getController().performRegistrySubtreeAttributes(child);
+ }
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+ private void pasteStringWithoutRedisplay(final TextFragment[] textFragments, NodeModel parent,
+ final boolean asSibling, final boolean isLeft) {
+ final MapModel map = parent.getMap();
+ int insertionIndex;
+ if (asSibling) {
+ NodeModel target = parent;
+ parent = parent.getParentNode();
+ final NodeModel childNode = target;
+ insertionIndex = parent.getIndex(childNode);
+ }
+ else{
+ insertionIndex = parent.getChildCount();
+ }
+ final ArrayList<NodeModel> parentNodes = new ArrayList<NodeModel>();
+ final ArrayList<Integer> parentNodesDepths = new ArrayList<Integer>();
+ parentNodes.add(parent);
+ parentNodesDepths.add(new Integer(-1));
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ for (int i = 0; i < textFragments.length; ++i) {
+ final TextFragment textFragment = textFragments[i];
+ String text = textFragment.text;
+ final String link = textFragment.link;
+ URI uri = null;
+ if (link != null) {
+ try {
+ URI linkUri = new URI(link);
+ uri = linkUri;
+
+ File absoluteFile = UrlManager.getController().getAbsoluteFile(map, uri);
+ if(absoluteFile != null) {
+ //if ("file".equals(linkUri.getScheme())) {
+ final File mapFile = map.getFile();
+ uri = LinkController.toLinkTypeDependantURI(mapFile, absoluteFile);
+ if(link.equals(text)){
+ text = uri.toString();
+ }
+ }
+
+ }
+ catch (Exception e) {
+ }
+ }
+ final NodeModel node = mapController.newNode(text, map);
+ if(uri != null){
+ NodeLinks.createLinkExtension(node).setHyperLink(uri);
+ }
+ for (int j = parentNodes.size() - 1; j >= 0; --j) {
+ if (textFragment.depth > ((Integer) parentNodesDepths.get(j)).intValue()) {
+ for (int k = j + 1; k < parentNodes.size(); ++k) {
+ final NodeModel n = (NodeModel) parentNodes.get(k);
+ if (n.getParentNode() == null) {
+ mapController.insertNode(n, parent, insertionIndex++);
+ }
+ parentNodes.remove(k);
+ parentNodesDepths.remove(k);
+ }
+ final NodeModel target = (NodeModel) parentNodes.get(j);
+ node.setLeft(isLeft);
+ if (target != parent) {
+ target.setFolded(true);
+ target.insert(node, target.getChildCount());
+ }
+ parentNodes.add(node);
+ parentNodesDepths.add(new Integer(textFragment.depth));
+ break;
+ }
+ }
+ }
+ {
+ for (int k = 0; k < parentNodes.size(); ++k) {
+ final NodeModel n = (NodeModel) parentNodes.get(k);
+ if (map.getRootNode() != n && n.getParentNode() == null) {
+ mapController.insertNode(n, parent, insertionIndex++);
+ }
+ }
+ }
+ }
+
+ private enum Operation{CLONE, MOVE};
+
+ public void addClone(final Transferable transferable, final NodeModel target) {
+ processTransferable(transferable, target, Operation.CLONE);
+ }
+
+ public void move(final Transferable transferable, final NodeModel target) {
+ processTransferable(transferable, target, Operation.MOVE);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void processTransferable(final Transferable transferable, final NodeModel target, Operation operation) {
+ try {
+ final Collection<NodeModel> clonedNodes;
+ final boolean asSingleNodes;
+ if (operation == Operation.CLONE && transferable.isDataFlavorSupported(MindMapNodesSelection.mindMapNodeSingleObjectsFlavor)){
+ clonedNodes = (Collection<NodeModel>) transferable.getTransferData(MindMapNodesSelection.mindMapNodeSingleObjectsFlavor);
+ asSingleNodes = true;
+ }
+ else if(transferable.isDataFlavorSupported(MindMapNodesSelection.mindMapNodeObjectsFlavor)){
+ clonedNodes = (Collection<NodeModel>) transferable.getTransferData(MindMapNodesSelection.mindMapNodeObjectsFlavor);
+ asSingleNodes = false;
+ }
+ else
+ return;
+
+ final List<NodeModel> movedNodes = new ArrayList<NodeModel>(clonedNodes.size());
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ for(NodeModel clonedNode:clonedNodes){
+ if(clonedNode.getParentNode() == null || ! clonedNode.getMap().equals(target.getMap()))
+ return;
+ if (!clonedNode.isRoot() && ! clonedNode.subtreeContainsCloneOf(target)) {
+ switch(operation){
+ case CLONE:
+ try {
+ final NodeModel clone = asSingleNodes ? clonedNode.cloneContent() : clonedNode.cloneTree();
+ mapController.addNewNode(clone, target, target.getChildCount(), target.isNewChildLeft());
+ } catch (CloneEncryptedNodeException e) {
+ UITools.errorMessage(TextUtils.getText("can_not_clone_encrypted_node"));
+ }
+ break;
+ case MOVE:
+ movedNodes.add(clonedNode);
+ break;
+ }
+ }
+ }
+ switch(operation){
+ case MOVE:
+ mapController.moveNodesAsChildren(movedNodes, target, target.isNewChildLeft(), true);
+ break;
+ default:
+ break;
+ }
+ }
+ catch (Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/MoveAction.java b/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/MoveAction.java
new file mode 100644
index 0000000..d439224
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/MoveAction.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.clipboard.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+class MoveAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public MoveAction() {
+ super("MoveAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MClipboardController clipboardController = (MClipboardController) ClipboardController
+ .getController();
+ final NodeModel parent = Controller.getCurrentController().getSelection().getSelected();
+ clipboardController.move(clipboardController.getClipboardContents(), parent);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/clipboard/mindmapmode/PasteAction.java b/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/PasteAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/clipboard/mindmapmode/PasteAction.java
rename to freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/PasteAction.java
diff --git a/freeplane/src/org/freeplane/features/clipboard/mindmapmode/SelectedPasteAction.java b/freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/SelectedPasteAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/clipboard/mindmapmode/SelectedPasteAction.java
rename to freeplane/src/main/java/org/freeplane/features/clipboard/mindmapmode/SelectedPasteAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/cloud/CloudBuilder.java b/freeplane/src/main/java/org/freeplane/features/cloud/CloudBuilder.java
new file mode 100644
index 0000000..10a7266
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/cloud/CloudBuilder.java
@@ -0,0 +1,156 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.cloud;
+
+import java.awt.Color;
+import java.io.IOException;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IElementWriter;
+import org.freeplane.core.io.IExtensionElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapWriter;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+class CloudBuilder implements IElementDOMHandler, IExtensionElementWriter, IElementWriter {
+// private final MapController mapController;
+ private final CloudController cc;
+
+ public CloudBuilder(final MapController mapController, final CloudController cc) {
+// this.mapController = mapController;
+ this.cc = cc;
+ }
+
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (tag.equals("cloud")) {
+ final CloudModel oldCloud = CloudModel.getModel((NodeModel) parent);
+ return oldCloud != null ? oldCloud : new CloudModel();
+ }
+ return null;
+ }
+
+ public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
+ if (parent instanceof NodeModel) {
+ final NodeModel node = (NodeModel) parent;
+ if (userObject instanceof CloudModel) {
+ final CloudModel cloud = (CloudModel) userObject;
+ CloudModel.setModel(node, cloud);
+ }
+ }
+ }
+
+ private void registerAttributeHandlers(final ReadManager reader) {
+ reader.addAttributeHandler("cloud", "STYLE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ // final CloudModel cloud = (CloudModel) userObject;
+ // cloud.setStyle(value.toString());
+ }
+ });
+ reader.addAttributeHandler("cloud", "COLOR", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final CloudModel cloud = (CloudModel) userObject;
+ cloud.setColor(ColorUtils.stringToColor(value, cloud.getColor()));
+ }
+ });
+ reader.addAttributeHandler("cloud", "ALPHA", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final CloudModel cloud = (CloudModel) userObject;
+ cloud.setColor(ColorUtils.alphaToColor(value, cloud.getColor()));
+ }
+ });
+ reader.addAttributeHandler("cloud", "SHAPE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final CloudModel cloud = (CloudModel) userObject;
+ cloud.setShape(CloudModel.Shape.valueOf(value));
+ }
+ });
+ reader.addAttributeHandler("cloud", "WIDTH", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ // final CloudModel cloud = (CloudModel) userObject;
+ // cloud.setWidth(Integer.parseInt(value.toString()));
+ }
+ });
+ }
+
+ /**
+ */
+ public void registerBy(final ReadManager reader, final WriteManager writer) {
+ reader.addElementHandler("cloud", this);
+ registerAttributeHandlers(reader);
+ writer.addExtensionElementWriter(CloudModel.class, this);
+ writer.addElementWriter(NodeBuilder.XML_NODE, this);
+ writer.addElementWriter(NodeBuilder.XML_STYLENODE, this);
+ }
+
+ public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object userObject, final String tag) throws IOException {
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (!forceFormatting) {
+ return;
+ }
+ writeContentImpl(writer, (NodeModel) userObject, null);
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object userObject, final IExtension extension)
+ throws IOException {
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (forceFormatting) {
+ return;
+ }
+ writeContentImpl(writer, null, extension);
+ }
+
+ private void writeContentImpl(final ITreeWriter writer, final NodeModel node, final IExtension extension)
+ throws IOException {
+ final CloudModel model = extension != null ? (CloudModel) extension : cc.getCloud(node);
+ if (model == null) {
+ return;
+ }
+ final XMLElement cloud = new XMLElement();
+ cloud.setName("cloud");
+ // final String style = model.getStyle();
+ // if (style != null) {
+ // cloud.setAttribute("STYLE", style);
+ // }
+ final Color color = model.getColor();
+ if (color != null) {
+ ColorUtils.setColorAttributes(cloud, "COLOR", "ALPHA", color);
+ }
+ final CloudModel.Shape shape = model.getShape();
+ if (shape != null) {
+ cloud.setAttribute("SHAPE", shape.toString());
+ }
+ // final int width = model.getWidth();
+ // if (width != CloudController.DEFAULT_WIDTH) {
+ // cloud.setAttribute("WIDTH", Integer.toString(width));
+ // }
+ writer.addElement(model, cloud);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/cloud/CloudController.java b/freeplane/src/main/java/org/freeplane/features/cloud/CloudController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/cloud/CloudController.java
rename to freeplane/src/main/java/org/freeplane/features/cloud/CloudController.java
diff --git a/freeplane/src/org/freeplane/features/cloud/CloudModel.java b/freeplane/src/main/java/org/freeplane/features/cloud/CloudModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/cloud/CloudModel.java
rename to freeplane/src/main/java/org/freeplane/features/cloud/CloudModel.java
diff --git a/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudAction.java b/freeplane/src/main/java/org/freeplane/features/cloud/mindmapmode/CloudAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudAction.java
rename to freeplane/src/main/java/org/freeplane/features/cloud/mindmapmode/CloudAction.java
diff --git a/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudColorAction.java b/freeplane/src/main/java/org/freeplane/features/cloud/mindmapmode/CloudColorAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudColorAction.java
rename to freeplane/src/main/java/org/freeplane/features/cloud/mindmapmode/CloudColorAction.java
diff --git a/freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudShapeAction.java b/freeplane/src/main/java/org/freeplane/features/cloud/mindmapmode/CloudShapeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/cloud/mindmapmode/CloudShapeAction.java
rename to freeplane/src/main/java/org/freeplane/features/cloud/mindmapmode/CloudShapeAction.java
diff --git a/freeplane/src/org/freeplane/features/cloud/mindmapmode/MCloudController.java b/freeplane/src/main/java/org/freeplane/features/cloud/mindmapmode/MCloudController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/cloud/mindmapmode/MCloudController.java
rename to freeplane/src/main/java/org/freeplane/features/cloud/mindmapmode/MCloudController.java
diff --git a/freeplane/src/main/java/org/freeplane/features/edge/AutomaticEdgeColor.java b/freeplane/src/main/java/org/freeplane/features/edge/AutomaticEdgeColor.java
new file mode 100644
index 0000000..c8aafc7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/edge/AutomaticEdgeColor.java
@@ -0,0 +1,31 @@
+package org.freeplane.features.edge;
+
+import org.freeplane.core.extension.IExtension;
+
+public class AutomaticEdgeColor implements IExtension{
+ public enum Rule {
+ FOR_BRANCHES(true), FOR_LEVELS(true), FOR_COLUMNS(true), ON_BRANCH_CREATION(false);
+
+ public final boolean isActiveOnCreation;
+ public final boolean isDynamic;
+
+ private Rule(boolean isDynamic) {
+ this.isActiveOnCreation = ! isDynamic;
+ this.isDynamic = isDynamic;
+ }
+ };
+ private int colorCount;
+ final public Rule rule;
+ public int getColorCounter() {
+ return colorCount;
+ }
+ public AutomaticEdgeColor(Rule rule, int colorCount) {
+ super();
+ this.rule = rule;
+ this.colorCount = colorCount;
+ }
+
+ void increaseColorCounter() {
+ colorCount++;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/edge/AutomaticEdgeColorHook.java b/freeplane/src/main/java/org/freeplane/features/edge/AutomaticEdgeColorHook.java
new file mode 100644
index 0000000..88b71f7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/edge/AutomaticEdgeColorHook.java
@@ -0,0 +1,157 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.edge;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
+import org.freeplane.features.edge.AutomaticEdgeColor.Rule;
+import org.freeplane.features.edge.mindmapmode.MEdgeController;
+import org.freeplane.features.map.AMapChangeListenerAdapter;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.styles.AutomaticLayoutController;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.LogicalStyleModel;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Nov 28, 2010
+ */
+
+ at NodeHookDescriptor(hookName = "AutomaticEdgeColor")
+public class AutomaticEdgeColorHook extends PersistentNodeHook implements IExtension{
+ private ModeController modeController;
+
+ private class Listener extends AMapChangeListenerAdapter{
+ @Override
+ public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
+ if(!isActiveOnCreation(child) || modeController.isUndoAction()){
+ return;
+ }
+ if(MapStyleModel.FLOATING_STYLE.equals(LogicalStyleModel.getStyle(child)))
+ return;
+ if(parent.isRoot()){
+ final EdgeModel edgeModel = EdgeModel.createEdgeModel(child);
+ if(null == edgeModel.getColor()){
+ final MEdgeController controller = (MEdgeController) EdgeController.getController();
+ final AutomaticEdgeColor model = (AutomaticEdgeColor) getMapHook(parent.getMap());
+ model.increaseColorCounter();
+ int colorCounter = model.getColorCounter();
+ AutomaticLayoutController automaticLatoutController = modeController.getExtension(AutomaticLayoutController.class);
+ NodeModel styleNode = automaticLatoutController.getStyleNode(parent.getMap(), colorCounter, true);
+ if(styleNode != null){
+ controller.setColor(child, controller.getColor(styleNode));
+ }
+ }
+ }
+ else{
+ final MEdgeController controller = (MEdgeController) EdgeController.getController();
+ controller.setColor(child, null);
+ final boolean edgeStylesEquals = controller.getColor(child).equals(controller.getColor(parent));
+ if(! edgeStylesEquals){
+ OptionalDontShowMeAgainDialog.show("edge_is_formatted_by_style", "confirmation",
+ "ignore_edge_format_by_style", OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_SHOWN);
+ }
+ }
+ }
+
+ private boolean isActiveOnCreation(NodeModel node) {
+ final AutomaticEdgeColor extension = node.getMap().getRootNode().getExtension(AutomaticEdgeColor.class);
+ return extension != null && extension.rule.isActiveOnCreation;
+ }
+
+ @Override
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ onNodeInserted(nodeMoveEvent.newParent, nodeMoveEvent.child, nodeMoveEvent.newIndex);
+ }
+ }
+
+ public AutomaticEdgeColorHook() {
+ super();
+ final Listener listener = new Listener();
+ modeController = Controller.getCurrentModeController();
+ modeController.addExtension(AutomaticEdgeColorHook.class, this);
+
+ final MapController mapController = modeController.getMapController();
+ mapController.addMapChangeListener(listener);
+ }
+
+ @Override
+ protected void registerActions() {
+ }
+
+
+
+ @Override
+ protected Class<? extends IExtension> getExtensionClass() {
+ return AutomaticEdgeColor.class;
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ final int colorCount = element == null ? 0 : element.getAttribute("COUNTER", 0);
+ final Rule rule;
+ if (element == null)
+ rule = Rule.ON_BRANCH_CREATION;
+ else
+ rule = safeValueOf(element.getAttribute("RULE", null), Rule.ON_BRANCH_CREATION);
+ return new AutomaticEdgeColor(rule, colorCount);
+ }
+
+ @SuppressWarnings("unchecked")
+ public static <T extends Enum<T>> T safeValueOf(final String value, T defaultValue) {
+ try {
+ return value == null ? defaultValue : (T) Enum.valueOf(defaultValue.getClass(), value);
+ }
+ catch (Exception e) {
+ return defaultValue;
+ }
+ }
+
+ @Override
+ protected void saveExtension(IExtension extension, XMLElement element) {
+ final AutomaticEdgeColor automaticEdgeColor = (AutomaticEdgeColor)extension;
+ super.saveExtension(extension, element);
+ final int colorCount = automaticEdgeColor.getColorCounter();
+ element.setAttribute("COUNTER", Integer.toString(colorCount));
+ element.setAttribute("RULE", automaticEdgeColor.rule.toString());
+ }
+
+ @Override
+ protected IExtension toggle(NodeModel node, IExtension extension) {
+ extension = super.toggle(node, extension);
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ if(modeController.isUndoAction()){
+ return extension;
+ }
+ LogicalStyleController.getController().refreshMap(node.getMap());
+ return extension;
+ }
+
+}
+
diff --git a/freeplane/src/main/java/org/freeplane/features/edge/EdgeBuilder.java b/freeplane/src/main/java/org/freeplane/features/edge/EdgeBuilder.java
new file mode 100644
index 0000000..f8b5156
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/edge/EdgeBuilder.java
@@ -0,0 +1,175 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.edge;
+
+import java.awt.Color;
+import java.io.IOException;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IElementWriter;
+import org.freeplane.core.io.IExtensionElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.features.map.MapWriter;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+class EdgeBuilder implements IElementDOMHandler, IExtensionElementWriter, IElementWriter {
+ private final EdgeController ec;
+
+ public EdgeBuilder(final EdgeController ec) {
+ this.ec = ec;
+ }
+
+ protected EdgeModel createEdge(final NodeModel node) {
+ return EdgeModel.createEdgeModel(node);
+ }
+
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (tag.equals("edge")) {
+ return createEdge((NodeModel) parent);
+ }
+ return null;
+ }
+
+ public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
+ /* attributes */
+ if (parent instanceof NodeModel) {
+ final NodeModel node = (NodeModel) parent;
+ if (userObject instanceof EdgeModel) {
+ final EdgeModel edge = (EdgeModel) userObject;
+ EdgeModel.setModel(node, edge);
+ }
+ return;
+ }
+ }
+
+ private void registerAttributeHandlers(final ReadManager reader) {
+ reader.addAttributeHandler("edge", "STYLE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final EdgeModel edge = (EdgeModel) userObject;
+ edge.setStyle(EdgeStyle.getStyle(value));
+ }
+ });
+ reader.addAttributeHandler("edge", "HIDE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final EdgeModel edge = (EdgeModel) userObject;
+ edge.setStyle(EdgeStyle.EDGESTYLE_HIDDEN);
+ }
+ });
+ reader.addAttributeHandler("edge", "COLOR", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final EdgeModel edge = (EdgeModel) userObject;
+ edge.setColor(ColorUtils.stringToColor(value, edge.getColor()));
+ }
+ });
+ reader.addAttributeHandler("edge", "ALPHA", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final EdgeModel edge = (EdgeModel) userObject;
+ edge.setColor(ColorUtils.alphaToColor(value, edge.getColor()));
+ }
+ });
+ reader.addAttributeHandler("edge", "WIDTH", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final EdgeModel edge = (EdgeModel) userObject;
+ if (value.equals(EdgeModel.EDGEWIDTH_THIN)) {
+ edge.setWidth(EdgeModel.WIDTH_THIN);
+ }
+ else {
+ edge.setWidth(Integer.parseInt(value.toString()));
+ }
+ }
+ });
+ }
+
+ /**
+ */
+ public void registerBy(final ReadManager reader, final WriteManager writer) {
+ reader.addElementHandler("edge", this);
+ registerAttributeHandlers(reader);
+ writer.addExtensionElementWriter(EdgeModel.class, this);
+ writer.addElementWriter(NodeBuilder.XML_NODE, this);
+ writer.addElementWriter(NodeBuilder.XML_STYLENODE, this);
+ }
+
+ public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object element, final String tag) throws IOException {
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (!forceFormatting) {
+ return;
+ }
+ final NodeModel node = (NodeModel) element;
+ writeContent(writer, node, null, forceFormatting);
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object userObject, final IExtension extension)
+ throws IOException {
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (forceFormatting) {
+ return;
+ }
+ final EdgeModel model = (EdgeModel) extension;
+ writeContent(writer, null, model, forceFormatting);
+ }
+
+ private void writeContent(final ITreeWriter writer, final NodeModel node, final EdgeModel model,
+ final boolean forceFormatting) throws IOException {
+ final EdgeStyle styleObj = forceFormatting ? ec.getStyle(node) : model.getStyle();
+ final String style = EdgeStyle.toString(styleObj);
+ final Color color = forceFormatting ? ec.getColor(node) : model.getColor();
+ final int width = forceFormatting ? ec.getWidth(node) : model.getWidth();
+ if (forceFormatting || style != null || color != null || width != EdgeModel.DEFAULT_WIDTH) {
+ final XMLElement edge = new XMLElement();
+ edge.setName("edge");
+ boolean relevant = false;
+ if (style != null) {
+ if (style.equals(EdgeStyle.EDGESTYLE_HIDDEN)) {
+ edge.setAttribute("HIDE", "true");
+ relevant = true;
+ }
+ edge.setAttribute("STYLE", style);
+ relevant = true;
+ }
+ if (color != null) {
+ ColorUtils.setColorAttributes(edge, "COLOR", "ALPHA", color);
+ relevant = true;
+ }
+ if (width != EdgeModel.WIDTH_PARENT) {
+ if (width == EdgeModel.WIDTH_THIN) {
+ edge.setAttribute("WIDTH", EdgeModel.EDGEWIDTH_THIN);
+ }
+ else {
+ edge.setAttribute("WIDTH", Integer.toString(width));
+ }
+ relevant = true;
+ }
+ if (relevant) {
+ writer.addElement(model, edge);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/edge/EdgeController.java b/freeplane/src/main/java/org/freeplane/features/edge/EdgeController.java
new file mode 100644
index 0000000..3119ab7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/edge/EdgeController.java
@@ -0,0 +1,277 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.edge;
+
+import java.awt.Color;
+import java.util.Collection;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.util.ConstantObject;
+import org.freeplane.core.util.ObjectRule;
+import org.freeplane.core.util.RuleReference;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ExclusivePropertyChain;
+import org.freeplane.features.mode.IPropertyHandler;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.AutomaticLayoutController;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class EdgeController implements IExtension {
+ public static final EdgeStyle STANDARD_EDGE_STYLE = EdgeStyle.EDGESTYLE_BEZIER;
+ public static final Color STANDARD_EDGE_COLOR = new Color(Color.GRAY.getRGB());
+ public static enum Rules {BY_PARENT, BY_COLUMN, BY_LEVEL, BY_BRANCH};
+
+ public static EdgeController getController() {
+ return getController(Controller.getCurrentModeController());
+ }
+
+ public static EdgeController getController(ModeController modeController) {
+ return (EdgeController) modeController.getExtension(EdgeController.class);
+ }
+ public static void install( final EdgeController edgeController) {
+ Controller.getCurrentModeController().addExtension(EdgeController.class, edgeController);
+ }
+
+ final private ExclusivePropertyChain<ObjectRule<Color, Rules>, NodeModel> colorHandlers;
+// private final ModeController modeController;
+ final private ExclusivePropertyChain<EdgeStyle, NodeModel> styleHandlers;
+ final private ExclusivePropertyChain<Integer, NodeModel> widthHandlers;
+ private ModeController modeController;
+
+ public EdgeController(final ModeController modeController) {
+ this.modeController = modeController;
+ colorHandlers = new ExclusivePropertyChain<ObjectRule<Color, Rules>, NodeModel>();
+ styleHandlers = new ExclusivePropertyChain<EdgeStyle, NodeModel>();
+ widthHandlers = new ExclusivePropertyChain<Integer, NodeModel>();
+
+ addColorGetter(IPropertyHandler.NODE, new IPropertyHandler<ObjectRule<Color, Rules>, NodeModel>() {
+ public ObjectRule<Color, Rules> getProperty(final NodeModel node, final ObjectRule<Color, Rules> currentValue) {
+ return getStyleEdgeColorRule(node);
+ }
+ });
+
+ addColorGetter(IPropertyHandler.AUTO, new IPropertyHandler<ObjectRule<Color, Rules>, NodeModel>() {
+ @Override
+ public ObjectRule<Color, Rules> getProperty(NodeModel model, ObjectRule<Color, Rules> currentValue) {
+ MapModel map = model.getMap();
+ AutomaticEdgeColor layout = map.getRootNode().getExtension(AutomaticEdgeColor.class);
+ if(layout != null){
+ switch(layout.rule) {
+ case FOR_COLUMNS:
+ return new RuleReference<Color, EdgeController.Rules>(Rules.BY_COLUMN);
+ case FOR_LEVELS:
+ return new RuleReference<Color, EdgeController.Rules>(Rules.BY_LEVEL);
+ case FOR_BRANCHES:{
+ NodeModel parentNode = model.getParentNode();
+ if (parentNode!= null && parentNode.isRoot()){
+ return new RuleReference<Color, EdgeController.Rules>(Rules.BY_BRANCH);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ return null;
+ }
+ });
+ addColorGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<ObjectRule<Color, Rules>, NodeModel>() {
+ public ObjectRule<Color, Rules> getProperty(NodeModel node, final ObjectRule<Color, Rules> currentValue) {
+ return new RuleReference<Color, EdgeController.Rules>(Rules.BY_PARENT);
+ }
+ });
+
+ addStyleGetter(IPropertyHandler.STYLE, new IPropertyHandler<EdgeStyle, NodeModel>() {
+ public EdgeStyle getProperty(final NodeModel node, final EdgeStyle currentValu) {
+ return getStyleStyle(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
+ }
+ });
+ addStyleGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<EdgeStyle, NodeModel>() {
+ public EdgeStyle getProperty(NodeModel node, final EdgeStyle currentValue) {
+ if(node.getParentNode() != null){
+ return null;
+ }
+ return STANDARD_EDGE_STYLE;
+ }
+ });
+ addWidthGetter(IPropertyHandler.STYLE, new IPropertyHandler<Integer, NodeModel>() {
+ public Integer getProperty(final NodeModel node, final Integer currentValue) {
+ return getStyleWidth(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
+ }
+ });
+
+ addWidthGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Integer, NodeModel>() {
+ public Integer getProperty(NodeModel node, final Integer currentValue) {
+ if(node.getParentNode() != null){
+ return null;
+ }
+ return new Integer(EdgeModel.WIDTH_THIN);
+ }
+ });
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ final ReadManager readManager = mapController.getReadManager();
+ final WriteManager writeManager = mapController.getWriteManager();
+ final EdgeBuilder edgeBuilder = new EdgeBuilder(this);
+ edgeBuilder.registerBy(readManager, writeManager);
+ }
+
+ public IPropertyHandler<ObjectRule<Color, Rules>, NodeModel> addColorGetter(final Integer key,
+ final IPropertyHandler<ObjectRule<Color, Rules>, NodeModel> getter) {
+ return colorHandlers.addGetter(key, getter);
+ }
+
+ public IPropertyHandler<EdgeStyle, NodeModel> addStyleGetter(final Integer key,
+ final IPropertyHandler<EdgeStyle, NodeModel> getter) {
+ return styleHandlers.addGetter(key, getter);
+ }
+
+ public IPropertyHandler<Integer, NodeModel> addWidthGetter(final Integer key,
+ final IPropertyHandler<Integer, NodeModel> getter) {
+ return widthHandlers.addGetter(key, getter);
+ }
+
+ public Color getColor(final NodeModel node) {
+ return getColor(node, true);
+ }
+
+ public Color getColor(final NodeModel node, final boolean resolveColor) {
+ final ObjectRule<Color, Rules> colorRule = getColorRule(node);
+ if(colorRule.hasValue())
+ return colorRule.getValue();
+ if(Rules.BY_PARENT == colorRule.getRule()) {
+ final NodeModel parentNode = node.getParentNode();
+ if(parentNode != null)
+ return getColor(parentNode);
+ }
+ return STANDARD_EDGE_COLOR;
+ }
+
+ public ObjectRule<Color, Rules> getColorRule(final NodeModel node) {
+ final ObjectRule<Color, Rules> color = colorHandlers.getProperty(node);
+ return color;
+ }
+
+ public EdgeStyle getStyle(final NodeModel node) {
+ return getStyle(node, true);
+ }
+
+ public EdgeStyle getStyle(final NodeModel node, final boolean resolveParent) {
+ final EdgeStyle style = styleHandlers.getProperty(node);
+ if(style == null && resolveParent)
+ return getStyle(node.getParentNode());
+ return style;
+ }
+
+ public int getWidth(final NodeModel node) {
+ return getWidth(node, true);
+ }
+
+ public Integer getWidth(final NodeModel node, final boolean resolveParent) {
+ final Integer width = widthHandlers.getProperty(node);
+ if(width == null && resolveParent)
+ return getWidth(node.getParentNode());
+ return width;
+ }
+
+ private ObjectRule<Color, Rules> getStyleEdgeColorRule(NodeModel node) {
+ MapModel map = node.getMap();
+ Collection<IStyle> collection = LogicalStyleController.getController(modeController).getStyles(node);
+ final MapStyleModel styles = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : collection){
+ final NodeModel styleNode = styles.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ if (node != styleNode && map.getRootNode().containsExtension(AutomaticEdgeColor.class)) {
+ AutomaticLayoutController automaticLayoutController = modeController.getExtension(AutomaticLayoutController.class);
+ if (automaticLayoutController != null && automaticLayoutController.isAutomaticLevelStyle(styleNode)) {
+ continue;
+ }
+ }
+ ObjectRule<Color, Rules> nodeColor = getNodeColorRule(styleNode);
+ if(nodeColor != null)
+ return nodeColor;
+ }
+ return null;
+ }
+
+ private Integer getStyleWidth(final MapModel map, final Collection<IStyle> collection) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : collection){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final EdgeModel styleModel = EdgeModel.getModel(styleNode);
+ if (styleModel == null) {
+ continue;
+ }
+ final int width = styleModel.getWidth();
+ if (width == EdgeModel.DEFAULT_WIDTH ) {
+ continue;
+ }
+ return width;
+ }
+ return null;
+ }
+
+ private EdgeStyle getStyleStyle(final MapModel map, final Collection<IStyle> collection) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : collection){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final EdgeModel styleModel = EdgeModel.getModel(styleNode);
+ if (styleModel == null) {
+ continue;
+ }
+ final EdgeStyle style = styleModel.getStyle();
+ if (style == null) {
+ continue;
+ }
+ return style;
+ }
+ return null;
+ }
+
+ private ObjectRule<Color, Rules> getNodeColorRule(NodeModel styleNode) {
+ final EdgeModel styleModel = EdgeModel.getModel(styleNode);
+ if (styleModel == null) {
+ return null;
+ }
+ final Color styleColor = styleModel.getColor();
+ if (styleColor == null) {
+ return null;
+ }
+ return new ConstantObject<Color, Rules>(styleColor);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/edge/EdgeModel.java b/freeplane/src/main/java/org/freeplane/features/edge/EdgeModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/edge/EdgeModel.java
rename to freeplane/src/main/java/org/freeplane/features/edge/EdgeModel.java
diff --git a/freeplane/src/org/freeplane/features/edge/EdgeStyle.java b/freeplane/src/main/java/org/freeplane/features/edge/EdgeStyle.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/edge/EdgeStyle.java
rename to freeplane/src/main/java/org/freeplane/features/edge/EdgeStyle.java
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeColorAction.java b/freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/EdgeColorAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeColorAction.java
rename to freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/EdgeColorAction.java
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAction.java b/freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/EdgeStyleAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAction.java
rename to freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/EdgeStyleAction.java
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAsParentAction.java b/freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/EdgeStyleAsParentAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeStyleAsParentAction.java
rename to freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/EdgeStyleAsParentAction.java
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeWidthAction.java b/freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/EdgeWidthAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/edge/mindmapmode/EdgeWidthAction.java
rename to freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/EdgeWidthAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/MEdgeController.java b/freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/MEdgeController.java
new file mode 100644
index 0000000..558abf6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/edge/mindmapmode/MEdgeController.java
@@ -0,0 +1,295 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.edge.mindmapmode;
+
+import java.awt.Color;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.ObjectRule;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.edge.EdgeModel;
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.map.IExtensionCopier;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.LogicalStyleKeys;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MEdgeController extends EdgeController {
+ private static class ExtensionCopier implements IExtensionCopier {
+ final private ModeController modeController;
+
+ public ExtensionCopier(ModeController modeController) {
+ this.modeController = modeController;
+ }
+
+ public void copy(final Object key, final NodeModel from, final NodeModel to) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ copy(from, to);
+ }
+
+ public void copy(final NodeModel from, final NodeModel to) {
+ final EdgeModel fromStyle = (EdgeModel) from.getExtension(EdgeModel.class);
+ if (fromStyle == null) {
+ return;
+ }
+ final EdgeModel toStyle = EdgeModel.createEdgeModel(to);
+ final Color color = fromStyle.getColor();
+ if(color != null)
+ toStyle.setColor(color);
+ final EdgeStyle style = fromStyle.getStyle();
+ if(style != null)
+ toStyle.setStyle(style);
+ final int width = fromStyle.getWidth();
+ if(width != EdgeModel.DEFAULT_WIDTH)
+ toStyle.setWidth(width);
+ }
+
+ public void remove(final Object key, final NodeModel from) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ from.removeExtension(EdgeModel.class);
+ }
+
+ public void remove(final Object key, final NodeModel from, final NodeModel which) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ final EdgeModel whichStyle = (EdgeModel) which.getExtension(EdgeModel.class);
+ if (whichStyle == null) {
+ return;
+ }
+ final EdgeModel fromStyle = (EdgeModel) from.getExtension(EdgeModel.class);
+ if (fromStyle == null) {
+ return;
+ }
+ from.removeExtension(fromStyle);
+ EdgeModel delta = new EdgeModel();
+ final Color color = fromStyle.getColor();
+ boolean deltaFound = false;
+ if(color != null && whichStyle.getColor() == null){
+ delta.setColor(color);
+ deltaFound = true;
+ }
+ final EdgeStyle style = fromStyle.getStyle();
+ if(style != null && whichStyle.getStyle() == null){
+ delta.setStyle(style);
+ deltaFound = true;
+ }
+ final int width = fromStyle.getWidth();
+ if(width != EdgeModel.DEFAULT_WIDTH && whichStyle.getWidth() == EdgeModel.DEFAULT_WIDTH){
+ delta.setWidth(width);
+ deltaFound = true;
+ }
+ if(deltaFound)
+ from.addExtension(delta);
+ }
+
+ public void resolveParentExtensions(Object key, NodeModel to) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ resolveColor(to);
+ resolveWidth(to);
+ resolveStyle(to);
+ }
+
+ private void resolveColor(NodeModel to) {
+ if (getColorRule(to).hasValue())
+ return;
+ for(NodeModel source = to.getParentNode(); source != null; source = source.getParentNode() ){
+ final ObjectRule<Color, Rules> colorRule = getColorRule(source);
+ if(colorRule.hasValue()){
+ EdgeModel.createEdgeModel(to).setColor(colorRule.getValue());
+ return;
+ }
+ }
+ }
+
+ private ObjectRule<Color, Rules> getColorRule (NodeModel node) {
+ return modeController.getExtension(EdgeController.class).getColorRule(node);
+ }
+
+ private void resolveWidth(NodeModel to) {
+ if (null != getWidth(to))
+ return;
+ for(NodeModel source = to.getParentNode(); source != null; source = source.getParentNode() ){
+ final Integer width = getWidth(source);
+ if(width != null){
+ EdgeModel.createEdgeModel(to).setWidth(width);
+ return;
+ }
+ }
+ }
+
+ private Integer getWidth(NodeModel node) {
+ return modeController.getExtension(EdgeController.class).getWidth(node, false);
+ }
+
+ private void resolveStyle(NodeModel to) {
+ if (null != getStyle(to))
+ return;
+ for(NodeModel source = to.getParentNode(); source != null; source = source.getParentNode() ){
+ final EdgeStyle style = getStyle(source);
+ if(style != null){
+ EdgeModel.createEdgeModel(to).setStyle(style);
+ return;
+ }
+ }
+ }
+ private EdgeStyle getStyle(NodeModel node) {
+ return modeController.getExtension(EdgeController.class).getStyle(node, false);
+ }
+
+ }
+
+ public MEdgeController(final ModeController modeController) {
+ super(modeController);
+ modeController.registerExtensionCopier(new ExtensionCopier(modeController));
+ modeController.addAction(new EdgeColorAction());
+ modeController.addAction(new EdgeWidthAction(EdgeModel.WIDTH_PARENT));
+ modeController.addAction(new EdgeWidthAction(EdgeModel.WIDTH_THIN));
+ modeController.addAction(new EdgeWidthAction(1));
+ modeController.addAction(new EdgeWidthAction(2));
+ modeController.addAction(new EdgeWidthAction(4));
+ modeController.addAction(new EdgeWidthAction(8));
+ modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_LINEAR));
+ modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_BEZIER));
+ modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_SHARP_LINEAR));
+ modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_SHARP_BEZIER));
+ modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_HORIZONTAL));
+ modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_HIDDEN));
+ modeController.addAction(new EdgeStyleAsParentAction());
+ }
+
+ public void setColor(final NodeModel node, final Color color) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Color oldColor = EdgeModel.createEdgeModel(node).getColor();
+ if (color == oldColor || color != null && color.equals(oldColor)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ EdgeModel.createEdgeModel(node).setColor(color);
+ modeController.getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setColor";
+ }
+
+ public void undo() {
+ EdgeModel.createEdgeModel(node).setColor(oldColor);
+ modeController.getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void setStyle(final NodeModel node, final EdgeStyle style) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final EdgeStyle oldStyle;
+ if (style != null) {
+ oldStyle = EdgeModel.createEdgeModel(node).getStyle();
+ if (style.equals(oldStyle)) {
+ return;
+ }
+ }
+ else {
+ oldStyle = EdgeModel.createEdgeModel(node).getStyle();
+ if (oldStyle == null) {
+ return;
+ }
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ EdgeModel.createEdgeModel(node).setStyle(style);
+ modeController.getMapController().nodeChanged(node);
+ edgeStyleRefresh(node);
+ }
+
+ private void edgeStyleRefresh(final NodeModel node) {
+ for (final NodeModel child : modeController.getMapController().childrenUnfolded(node)) {
+ if(child.getViewers().isEmpty())
+ continue;
+ final EdgeModel edge = EdgeModel.getModel(child);
+ if (edge == null || edge.getStyle() == null) {
+ modeController.getMapController().nodeRefresh(child);
+ edgeStyleRefresh(child);
+ }
+ }
+ }
+
+ public String getDescription() {
+ return "setStyle";
+ }
+
+ public void undo() {
+ EdgeModel.createEdgeModel(node).setStyle(oldStyle);
+ modeController.getMapController().nodeChanged(node);
+ edgeStyleRefresh(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void setWidth(final NodeModel node, final int width) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final int oldWidth = EdgeModel.createEdgeModel(node).getWidth();
+ if (width == oldWidth) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ EdgeModel.createEdgeModel(node).setWidth(width);
+ modeController.getMapController().nodeChanged(node);
+ edgeWidthRefresh(node);
+ }
+
+ private void edgeWidthRefresh(final NodeModel node) {
+ for (final NodeModel child : modeController.getMapController().childrenUnfolded(node)) {
+ if(child.getViewers().isEmpty())
+ continue;
+ final EdgeModel edge = EdgeModel.getModel(child);
+ if (edge == null || edge.getWidth() == EdgeModel.WIDTH_PARENT) {
+ modeController.getMapController().nodeRefresh(child);
+ edgeWidthRefresh(child);
+ }
+ }
+ }
+
+ public String getDescription() {
+ return "setWidth";
+ }
+
+ public void undo() {
+ EdgeModel.createEdgeModel(node).setWidth(oldWidth);
+ modeController.getMapController().nodeChanged(node);
+ edgeWidthRefresh(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/Base64Coding.java b/freeplane/src/main/java/org/freeplane/features/encrypt/Base64Coding.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/encrypt/Base64Coding.java
rename to freeplane/src/main/java/org/freeplane/features/encrypt/Base64Coding.java
diff --git a/freeplane/src/org/freeplane/features/encrypt/DesEncrypter.java b/freeplane/src/main/java/org/freeplane/features/encrypt/DesEncrypter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/encrypt/DesEncrypter.java
rename to freeplane/src/main/java/org/freeplane/features/encrypt/DesEncrypter.java
diff --git a/freeplane/src/main/java/org/freeplane/features/encrypt/EncryptionController.java b/freeplane/src/main/java/org/freeplane/features/encrypt/EncryptionController.java
new file mode 100644
index 0000000..0175414
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/encrypt/EncryptionController.java
@@ -0,0 +1,168 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.encrypt;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.IStateIconProvider;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.IconStore;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.EncryptionModel;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * Feb 13, 2011
+ */
+public class EncryptionController implements IExtension {
+ private static final IconStore STORE = IconStoreFactory.create();
+ private static UIIcon decryptedIcon = STORE.getUIIcon("unlock.png");
+ private static UIIcon encryptedIcon = STORE.getUIIcon("lock.png");
+
+ public static void install(EncryptionController encryptionController){
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(EncryptionController.class, encryptionController);
+ final EnterPassword pwdAction = new EnterPassword(encryptionController);
+ modeController.addAction(pwdAction);
+ }
+
+
+ public EncryptionController(final ModeController modeController) {
+ registerStateIconProvider(modeController);
+ }
+
+ private void registerStateIconProvider(final ModeController modeController) {
+ IconController.getController(modeController).addStateIconProvider(new IStateIconProvider() {
+ public UIIcon getStateIcon(NodeModel node) {
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
+ if (encryptionModel != null) {
+ if(encryptionModel.isAccessible())
+ return decryptedIcon;
+ else
+ return encryptedIcon;
+ }
+ return null;
+ }
+ });
+ }
+
+ public void toggleCryptState(final NodeModel node, PasswordStrategy passwordStrategy) {
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
+ if (encryptionModel != null) {
+ final boolean wasFolded = node.isFolded();
+ final boolean wasAccessible = encryptionModel.isAccessible();
+ if (wasAccessible)
+ encryptionModel.calculateEncryptedContent(Controller.getCurrentModeController().getMapController());
+ else {
+ if (!doPasswordCheckAndDecryptNode(encryptionModel, passwordStrategy))
+ return;
+ }
+ final boolean becomesFolded = wasAccessible;
+ final boolean becomesAccessible = ! wasAccessible;
+ Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(node);
+ final IActor actor = new IActor() {
+ public void act() {
+ encryptionModel.setAccessible(becomesAccessible);
+ if (becomesFolded != wasFolded) {
+ node.setFolded(becomesFolded);
+ }
+ fireEncyptionChangedEvent(node);
+ }
+
+ public String getDescription() {
+ return "toggleCryptState";
+ }
+
+ public void undo() {
+ encryptionModel.setAccessible(wasAccessible);
+ if(becomesFolded != wasFolded)
+ node.setFolded(wasFolded);
+ fireEncyptionChangedEvent(node);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+ else {
+ encrypt(node, passwordStrategy);
+ }
+ }
+
+ private boolean doPasswordCheckAndDecryptNode(final EncryptionModel encryptionModel, PasswordStrategy passwordStrategy) {
+ while (true) {
+ final StringBuilder password = passwordStrategy.getPassword();
+ if (passwordStrategy.isCancelled())
+ return false;
+ if (!decrypt(encryptionModel, password)) {
+ passwordStrategy.onWrongPassword();
+ return false;
+ }
+ else {
+ return true;
+ }
+ }
+ }
+
+ private boolean decrypt(final EncryptionModel encryptionModel, final StringBuilder password) {
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ return encryptionModel.decrypt(mapController, new SingleDesEncrypter(password));
+ }
+
+ private void encrypt(final NodeModel node, PasswordStrategy passwordStrategy) {
+ if(node.allClones().size() > 1) {
+ UITools.errorMessage(TextUtils.getText("can_not_encrypt_cloned_node"));
+ return;
+ }
+
+ final StringBuilder password = passwordStrategy.getPasswordWithConfirmation();
+ if (passwordStrategy.isCancelled()) {
+ return;
+ }
+ final EncryptionModel encryptionModel = new EncryptionModel(node);
+ encryptionModel.setEncrypter(new SingleDesEncrypter(password));
+ final IActor actor = new IActor() {
+ public void act() {
+ node.addExtension(encryptionModel);
+ fireEncyptionChangedEvent(node);
+ }
+
+ public String getDescription() {
+ return "encrypt";
+ }
+
+ public void undo() {
+ node.removeExtension(encryptionModel);
+ fireEncyptionChangedEvent(node);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+
+ private void fireEncyptionChangedEvent(final NodeModel node) {
+ Controller.getCurrentModeController().getMapController().nodeRefresh(node, EncryptionModel.class, null, null);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/EnterPassword.java b/freeplane/src/main/java/org/freeplane/features/encrypt/EnterPassword.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/encrypt/EnterPassword.java
rename to freeplane/src/main/java/org/freeplane/features/encrypt/EnterPassword.java
diff --git a/freeplane/src/org/freeplane/features/encrypt/PasswordStrategy.java b/freeplane/src/main/java/org/freeplane/features/encrypt/PasswordStrategy.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/encrypt/PasswordStrategy.java
rename to freeplane/src/main/java/org/freeplane/features/encrypt/PasswordStrategy.java
diff --git a/freeplane/src/org/freeplane/features/encrypt/SingleDesEncrypter.java b/freeplane/src/main/java/org/freeplane/features/encrypt/SingleDesEncrypter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/encrypt/SingleDesEncrypter.java
rename to freeplane/src/main/java/org/freeplane/features/encrypt/SingleDesEncrypter.java
diff --git a/freeplane/src/main/java/org/freeplane/features/encrypt/SwingPasswordStrategy.java b/freeplane/src/main/java/org/freeplane/features/encrypt/SwingPasswordStrategy.java
new file mode 100644
index 0000000..27b1855
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/encrypt/SwingPasswordStrategy.java
@@ -0,0 +1,43 @@
+package org.freeplane.features.encrypt;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.components.EnterPasswordDialog;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+
+public class SwingPasswordStrategy implements PasswordStrategy {
+
+ private boolean isCancelled;
+
+ public StringBuilder getPassword() {
+ return getPasswordImpl(false);
+ }
+
+ public StringBuilder getPasswordWithConfirmation() {
+ return getPasswordImpl(true);
+ }
+
+ private StringBuilder getPasswordImpl(boolean withConfirmation) {
+ final EnterPasswordDialog pwdDialog = new EnterPasswordDialog(UITools.getCurrentFrame(), withConfirmation);
+ pwdDialog.setModal(true);
+ pwdDialog.setVisible(true);
+ if (pwdDialog.getResult() == EnterPasswordDialog.CANCEL) {
+ isCancelled = true;
+ return null;
+ }
+ return pwdDialog.getPassword();
+ }
+
+ public void onWrongPassword() {
+ final Controller controller = Controller.getCurrentController();
+ JOptionPane.showMessageDialog(controller.getViewController().getCurrentRootComponent(), TextUtils
+ .getText("accessories/plugins/EncryptNode.properties_wrong_password"), "Freeplane",
+ JOptionPane.ERROR_MESSAGE);
+ }
+
+ public boolean isCancelled() {
+ return isCancelled;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/TripleDesEncrypter.java b/freeplane/src/main/java/org/freeplane/features/encrypt/TripleDesEncrypter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/encrypt/TripleDesEncrypter.java
rename to freeplane/src/main/java/org/freeplane/features/encrypt/TripleDesEncrypter.java
diff --git a/freeplane/src/main/java/org/freeplane/features/encrypt/mindmapmode/EncryptedMap.java b/freeplane/src/main/java/org/freeplane/features/encrypt/mindmapmode/EncryptedMap.java
new file mode 100644
index 0000000..49e2c9d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/encrypt/mindmapmode/EncryptedMap.java
@@ -0,0 +1,81 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.encrypt.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.EnterPasswordDialog;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.encrypt.SingleDesEncrypter;
+import org.freeplane.features.map.EncryptionModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+
+class EncryptedMap extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ EncryptedMap() {
+ super("EncryptedMap");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ newEncryptedMap();
+ }
+
+ /**
+ * @param e
+ */
+ private StringBuilder getUsersPassword() {
+ final EnterPasswordDialog pwdDialog = new EnterPasswordDialog(UITools.getCurrentFrame(), true);
+ pwdDialog.setModal(true);
+ pwdDialog.show();
+ if (pwdDialog.getResult() == EnterPasswordDialog.CANCEL) {
+ return null;
+ }
+ final StringBuilder password = pwdDialog.getPassword();
+ return password;
+ }
+
+ /**
+ * @param e
+ *
+ */
+ private void newEncryptedMap() {
+ final StringBuilder password = getUsersPassword();
+ if (password == null) {
+ return;
+ }
+ final ModeController modeController = Controller.getCurrentModeController();
+ MFileManager.getController(modeController).newMapFromDefaultTemplate();
+ NodeModel node = Controller.getCurrentController().getMap().getRootNode();
+ final EncryptionModel encryptedMindMapNode = new EncryptionModel(node);
+ encryptedMindMapNode.setEncrypter(new SingleDesEncrypter(password));
+ node.addExtension(encryptedMindMapNode);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/encrypt/mindmapmode/MEncryptionController.java b/freeplane/src/main/java/org/freeplane/features/encrypt/mindmapmode/MEncryptionController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/encrypt/mindmapmode/MEncryptionController.java
rename to freeplane/src/main/java/org/freeplane/features/encrypt/mindmapmode/MEncryptionController.java
diff --git a/freeplane/src/org/freeplane/features/encrypt/mindmapmode/RemoveEncryption.java b/freeplane/src/main/java/org/freeplane/features/encrypt/mindmapmode/RemoveEncryption.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/encrypt/mindmapmode/RemoveEncryption.java
rename to freeplane/src/main/java/org/freeplane/features/encrypt/mindmapmode/RemoveEncryption.java
diff --git a/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportAction.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportAction.java
new file mode 100644
index 0000000..2afa55b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportAction.java
@@ -0,0 +1,56 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.export.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author foltin To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+class ExportAction extends AFreeplaneAction {
+ private ExportDialog exp = null;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ExportAction() {
+ super("ExportAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if(exp == null){
+ exp = new ExportDialog();
+ }
+ final MapModel model = Controller.getCurrentController().getMap();
+ if (model == null) {
+ return;
+ }
+ export(model);
+ }
+
+ private void export(final MapModel model) {
+ exp.export(UITools.getCurrentRootComponent(), model);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportBranchToHTMLAction.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportBranchToHTMLAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/export/mindmapmode/ExportBranchToHTMLAction.java
rename to freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportBranchToHTMLAction.java
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportController.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/export/mindmapmode/ExportController.java
rename to freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportController.java
diff --git a/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportDialog.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportDialog.java
new file mode 100644
index 0000000..b7fa1f4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportDialog.java
@@ -0,0 +1,188 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Eric Lavarde, Freeplane admins
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.export.mindmapmode;
+
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.text.MessageFormat;
+
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+
+/**
+ * This class uses the JFileChooser dialog to allow users to choose a file name to
+ * export to. The filter selection is created by gathering all the *.xsl files
+ * present in the user-specific and system-specific Export-directories of Freeplane.
+ * Those files are recognised by their extension (.xsl) but also by the fact that they
+ * contain within the 5 first lines a string of the form:
+ * <pre>MINDMAPEXPORT <i>extensions</i> <i>description</i></pre>
+ * where the fields in italic are relative to the file format to which the mindmap will
+ * be exported to using this specific XSLT sheet:
+ * <ul>
+ * <li><i>extensions</i> is a semi-column separated list of acceptable file extensions
+ * without asterisk or dot, e.g. "jpg;jpeg".</li>
+ * <li><i>description</i> is a description of the file format, e.g. "JPEG image".</li>
+ * </ul>
+ * Only the first unique combination of extensions and description will be kept, in such
+ * a way that users can "overwrite" an already existing XSLT sheet with their own
+ * version.
+ * @author Eric Lavarde
+ * @see javax.swing.JFileChooser
+ *
+ */
+public class ExportDialog {
+ /** the JFileChooser dialog used to choose filter and the file to export to. */
+ final private JFileChooser fileChooser = new JFileChooser();
+
+ /**
+ * This constructor does <i>not</i> the export per itself.
+ * It populates the {@link #fileChooser} field
+ * (especially the {@link JFileChooser#getChoosableFileFilters() choosable
+ * file filters}).
+ */
+ public ExportDialog() {
+ super();
+ fileChooser.setAcceptAllFileFilterUsed(false); // the user can't select an "All Files filter"
+ fileChooser.setDialogTitle(TextUtils.getText("export_using_xslt"));
+ fileChooser.setToolTipText(TextUtils.getText("select_file_export_to"));
+ final ExportController exportEngineRegistry = ExportController.getContoller();
+ for (FileFilter filter : exportEngineRegistry.getFileFilters()) {
+ fileChooser.addChoosableFileFilter(filter);
+ }
+ final FileFilter fileFilter = fileChooser.getChoosableFileFilters()[0];
+ fileChooser.setFileFilter(fileFilter);
+ }
+
+ /**
+ * A function to call again and again in order to export the same XML source file.
+ * @see #export(Component)
+ */
+ /**
+ * A function to call again and again in order to export the same XML source file.
+ * @param parentframe a parent component for the dialogs to appear (can be null).
+ * @param streamSource
+ */
+ void export(final Component parentframe, final MapModel map) {
+ final ExportController exportEngineRegistry = ExportController.getContoller();
+ if (exportEngineRegistry.getFilterMap().isEmpty()) {
+ JOptionPane.showMessageDialog(parentframe, TextUtils.getText("xslt_export_not_possible"));
+ return;
+ }
+ // Finish to setup the File Chooser...
+ // And then use it
+ final String absolutePathWithoutExtension;
+ final File xmlSourceFile = map.getFile();
+ if (xmlSourceFile != null) {
+ absolutePathWithoutExtension = FileUtils.removeExtension(xmlSourceFile.getAbsolutePath());
+ }
+ else {
+ absolutePathWithoutExtension = null;
+ }
+ final PropertyChangeListener filterChangeListener = new PropertyChangeListener() {
+ final private File selectedFile = absolutePathWithoutExtension == null ? null : new File(
+ absolutePathWithoutExtension);
+
+ public void propertyChange(final PropertyChangeEvent evt) {
+ if (evt.getPropertyName().equals(JFileChooser.FILE_FILTER_CHANGED_PROPERTY)) {
+ final FileFilter filter = fileChooser.getFileFilter();
+ if(! (filter instanceof ExampleFileFilter)){
+ return;
+ }
+ final File acceptableFile = getAcceptableFile(selectedFile, (ExampleFileFilter) filter);
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ fileChooser.setSelectedFile(acceptableFile);
+ }
+ });
+ return;
+ }
+ if (selectedFile != null && evt.getPropertyName().equals(JFileChooser.DIRECTORY_CHANGED_PROPERTY)) {
+ final FileFilter filter = fileChooser.getFileFilter();
+ if(! (filter instanceof ExampleFileFilter)){
+ return;
+ }
+ final File acceptableFile = getAcceptableFile(selectedFile, (ExampleFileFilter) filter);
+ final File currentDirectory = fileChooser.getCurrentDirectory();
+ if(currentDirectory != null){
+ final File file = new File (currentDirectory, acceptableFile.getName());
+ fileChooser.setSelectedFile(file);
+ }
+ else
+ fileChooser.setSelectedFile(acceptableFile);
+ return;
+ }
+ }
+ };
+ filterChangeListener.propertyChange(new PropertyChangeEvent(fileChooser,
+ JFileChooser.FILE_FILTER_CHANGED_PROPERTY, null, fileChooser.getFileFilter()));
+ try {
+ fileChooser.addPropertyChangeListener(filterChangeListener);
+ final int returnVal = fileChooser.showSaveDialog(parentframe);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ // we check which filter has been selected by the user and use its
+ // description as key for the map to get the corresponding XSLT file
+ if(! (fileChooser.getFileFilter() instanceof ExampleFileFilter)){
+ UITools.errorMessage(TextUtils.getText("invalid_export_file"));
+ return;
+ }
+ final ExampleFileFilter fileFilter = (ExampleFileFilter) fileChooser.getFileFilter();
+ final File selectedFile = getAcceptableFile(fileChooser.getSelectedFile(), fileFilter);
+ if (selectedFile == null) {
+ return;
+ }
+ if (selectedFile.isDirectory()) {
+ return;
+ }
+ if (selectedFile.exists()) {
+ final String overwriteText = MessageFormat.format(TextUtils.getText("file_already_exists"),
+ new Object[] { selectedFile.toString() });
+ final int overwriteMap = JOptionPane.showConfirmDialog(UITools.getCurrentRootComponent(), overwriteText,
+ overwriteText, JOptionPane.YES_NO_OPTION);
+ if (overwriteMap != JOptionPane.YES_OPTION) {
+ return;
+ }
+ }
+ final IExportEngine exportEngine = exportEngineRegistry.getFilterMap().get(fileFilter);
+ exportEngine.export(map, selectedFile);
+ }
+ }
+ finally {
+ fileChooser.removePropertyChangeListener(filterChangeListener);
+ }
+ }
+
+ private File getAcceptableFile(File selectedFile, final ExampleFileFilter fileFilter) {
+ if (selectedFile == null) {
+ return null;
+ }
+ if (!fileFilter.accept(selectedFile)) {
+ selectedFile = new File(selectedFile.getAbsolutePath() + '.' + fileFilter.getExtensionProposal());
+ }
+ return selectedFile;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToHTMLAction.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportToHTMLAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/export/mindmapmode/ExportToHTMLAction.java
rename to freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportToHTMLAction.java
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToImage.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportToImage.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/export/mindmapmode/ExportToImage.java
rename to freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportToImage.java
diff --git a/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportToOoWriter.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportToOoWriter.java
new file mode 100644
index 0000000..e3369e7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportToOoWriter.java
@@ -0,0 +1,133 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.export.mindmapmode;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import javax.swing.filechooser.FileFilter;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author foltin
+ */
+public class ExportToOoWriter implements IExportEngine {
+ public ExportToOoWriter() {
+ }
+
+
+ public FileFilter getFileFilter(){
+ return new ExampleFileFilter("odt", TextUtils.getText("ExportToOoWriter.text"));
+ }
+
+ public void export(MapModel map, File chosenFile) {
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ try {
+ exportToOoWriter(map, chosenFile);
+ }
+ catch (final Exception ex) {
+ LogUtils.warn(ex);
+ UITools.errorMessage(TextUtils.getText("export_failed"));
+ }
+ finally{
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+ /**
+ * @return true, if successful.
+ */
+ private void applyXsltFile(final String xsltFileName, final StringWriter writer, final Result result)
+ throws IOException {
+ final URL xsltUrl = ResourceController.getResourceController().getResource(xsltFileName);
+ if (xsltUrl == null) {
+ LogUtils.severe("Can't find " + xsltFileName + " as resource.");
+ throw new IllegalArgumentException("Can't find " + xsltFileName + " as resource.");
+ }
+ final InputStream xsltStream = new BufferedInputStream(xsltUrl.openStream());
+ final Source xsltSource = new StreamSource(xsltStream);
+ try {
+ final StringReader reader = new StringReader(writer.getBuffer().toString());
+ final TransformerFactory transFact = TransformerFactory.newInstance();
+ final Transformer trans = transFact.newTransformer(xsltSource);
+ trans.transform(new StreamSource(reader), result);
+ return;
+ }
+ catch (final Exception e) {
+ UITools.errorMessage(e.getMessage());
+ LogUtils.warn(e);
+ return;
+ }
+ finally {
+ FileUtils.silentlyClose(xsltStream);
+ }
+ }
+
+
+ public void exportToOoWriter(MapModel map, final File file) throws IOException {
+ final ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(file));
+ try {
+ final StringWriter writer = new StringWriter();
+ final ModeController controller = Controller.getCurrentModeController();
+ controller.getMapController().getFilteredXml(map, writer, Mode.EXPORT, true);
+ final Result result = new StreamResult(zipout);
+
+ ZipEntry entry = new ZipEntry("content.xml");
+ zipout.putNextEntry(entry);
+ applyXsltFile("/xslt/export2oowriter.xsl", writer, result);
+ zipout.closeEntry();
+
+ entry = new ZipEntry("META-INF/manifest.xml");
+ zipout.putNextEntry(entry);
+ applyXsltFile("/xslt/export2oowriter.manifest.xsl", writer, result);
+ zipout.closeEntry();
+
+ entry = new ZipEntry("styles.xml");
+ zipout.putNextEntry(entry);
+ applyXsltFile("/xslt/export2oowriter.styles.xsl", writer, result);
+ zipout.closeEntry();
+ }
+ finally {
+ zipout.close();
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportWithXSLT.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportWithXSLT.java
new file mode 100644
index 0000000..4c7ec42
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ExportWithXSLT.java
@@ -0,0 +1,326 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.export.mindmapmode;
+
+import java.awt.image.RenderedImage;
+import java.io.BufferedInputStream;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URL;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.imageio.ImageIO;
+import javax.swing.JOptionPane;
+import javax.swing.ListModel;
+import javax.swing.filechooser.FileFilter;
+import javax.xml.transform.Result;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.url.UrlManager;
+
+/**
+ * @author foltin To change the template for this generated type comment go to
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class ExportWithXSLT implements IExportEngine {
+
+ private static final Pattern propertyReferenceEpression = Pattern.compile("\\$\\{[^}]+\\}");
+
+ /**
+ * @param map
+ */
+ static void copyIconsToDirectory(final MapModel map, final String directoryName) {
+ final ListModel icons = map.getIconRegistry().getIconsAsListModel();
+ for (int i = 0; i < icons.getSize(); i++) {
+ final UIIcon icon = (UIIcon) icons.getElementAt(i);
+ final String iconName = icon.getName();
+ final StringBuilder sb = new StringBuilder(directoryName);
+ final int lastIndexOfSeparator = iconName.lastIndexOf('/');
+ if (lastIndexOfSeparator != -1) {
+ sb.append(File.separatorChar);
+ sb.append(iconName.substring(0, lastIndexOfSeparator));
+ }
+ final File destinationDirectory = new File(sb.toString());
+ destinationDirectory.mkdirs();
+ FileUtils.copyFromURL(icon.getUrl(), destinationDirectory);
+ }
+ }
+
+ /**
+ * For test purposes. True=no error
+ */
+ private boolean mTransformResultWithoutError = false;
+ final private Properties properties;
+ private final String name;
+
+ public ExportWithXSLT(final String name, final Properties properties) {
+ this.name = name;
+ this.properties = properties;
+ }
+
+ /**
+ */
+ private void copyFilesFromResourcesToDirectory(final String targetDirectoryName, final String sourceDirectoryPath,
+ final String files) {
+ final StringTokenizer tokenizer = new StringTokenizer(files, ",");
+ final File destinationDirectory = new File(targetDirectoryName);
+ while (tokenizer.hasMoreTokens()) {
+ final String sourceFile = tokenizer.nextToken();
+ int nameStartPosition = sourceFile.lastIndexOf('/') + 1;
+ String sourceFileDirectory = nameStartPosition > 0 ? sourceFile.substring(0, nameStartPosition) : "";
+ String sourceFileName = nameStartPosition > 0 ? sourceFile.substring(nameStartPosition) : sourceFile;
+ FileUtils.copyFromResource(sourceDirectoryPath + sourceFileDirectory, sourceFileName, destinationDirectory);
+ }
+ }
+
+ /**
+ * @param map
+ */
+ private boolean copyIcons(final MapModel map, final String directoryName) {
+ boolean success;
+ final String iconDirectoryName = directoryName + File.separatorChar + "icons";
+ success = FileUtils.createDirectory(iconDirectoryName);
+ if (success) {
+ ExportWithXSLT.copyIconsToDirectory(map, iconDirectoryName);
+ }
+ return success;
+ }
+
+ private boolean copyMap(final MapModel map, final String pDirectoryName, final Mode mode) {
+ boolean success = true;
+ try {
+ final BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
+ pDirectoryName + File.separator + "map" + UrlManager.FREEPLANE_FILE_EXTENSION)));
+ Controller.getCurrentModeController().getMapController().getFilteredXml(map, fileout, mode, Mode.EXPORT.equals(mode));
+ }
+ catch (final IOException e) {
+ success = false;
+ }
+ return success;
+ }
+
+ /**
+ * @param map
+ */
+ private boolean createImageFromMap(MapModel map, final String directoryName) {
+ if (Controller.getCurrentController().getMapViewManager().getMapViewComponent() == null) {
+ return false;
+ }
+ final RenderedImage image = new ImageCreator(UITools.getScreenResolution()).createBufferedImage(map);
+ if(image == null){
+ return false;
+ }
+ try {
+ final FileOutputStream out = new FileOutputStream(directoryName + File.separator + "image.png");
+ ImageIO.write(image, "png", out);
+ out.close();
+ return true;
+ }
+ catch (final IOException e1) {
+ LogUtils.severe(e1);
+ return false;
+ }
+ }
+
+ /**
+ * @param create_image
+ */
+ private String getAreaCode(final boolean create_image) {
+ String areaCode = "";
+ if (create_image) {
+ areaCode = Controller.getCurrentController().getMapViewManager().createHtmlMap();
+ }
+ return areaCode;
+ }
+
+ /**
+ * @param mode
+ * @throws IOException
+ */
+ private String getMapXml(final Mode mode) throws IOException {
+ final StringWriter writer = new StringWriter();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Controller controller = modeController.getController();
+ final MapModel map = controller.getMap();
+ modeController.getMapController().getFilteredXml(map, writer, mode, Mode.EXPORT.equals(mode));
+ return writer.getBuffer().toString();
+ }
+
+ String getProperty(final String key) {
+ final String property = getProperty(key, null);
+ if (property == null)
+ return property;
+ Matcher r = propertyReferenceEpression.matcher(property);
+ r.reset();
+ boolean result = r.find();
+ if (result) {
+ StringBuffer sb = new StringBuffer();
+ do {
+ String propertyReference = r.group();
+ String propertyName = propertyReference.substring(2, propertyReference.length() - 1);
+ r.appendReplacement(sb, System.getProperty(propertyName, propertyReference));
+ result = r.find();
+ } while (result);
+ r.appendTail(sb);
+ return sb.toString();
+ }
+ return property;
+ }
+
+ String getProperty(final String key, final String value) {
+ return properties.getProperty(key, value);
+ }
+
+ public boolean isTransformResultWithoutError() {
+ return mTransformResultWithoutError;
+ }
+
+ /**
+ * @param saveFile
+ */
+ public void export(final MapModel map, final File saveFile) {
+ try {
+ mTransformResultWithoutError = true;
+ final boolean create_image = StringUtils.equals(getProperty("create_html_linked_image"), "true");
+ final String areaCode = getAreaCode(create_image);
+ final String xsltFileName = getProperty("xslt_file");
+ final Mode mode = Mode.valueOf(getProperty("mode", Mode.EXPORT.name()));
+ String[] parameters = getProperty("set_properties", "").split(",\\s*");
+ boolean success = transformMapWithXslt(xsltFileName, saveFile, areaCode, mode, parameters);
+ if (!success) {
+ JOptionPane.showMessageDialog(UITools.getCurrentRootComponent(), getProperty("error_applying_template"), "Freeplane",
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ if (success && StringUtils.equals(getProperty("create_dir"), "true")) {
+ final String directoryName = saveFile.getAbsolutePath() + "_files";
+ success = FileUtils.createDirectory(directoryName);
+ if (success) {
+ final String files = getProperty("files_to_copy");
+ final String filePrefix = getProperty("file_prefix");
+ copyFilesFromResourcesToDirectory(directoryName, filePrefix, files);
+ }
+ if (success && StringUtils.equals(getProperty("copy_icons"), "true")) {
+ success = copyIcons(map, directoryName);
+ }
+ if (success && StringUtils.equals(getProperty("copy_map"), "true")) {
+ String copyМapХsltFile = getProperty("copy_map_xslt_file");
+ final Mode copymode = Mode.valueOf(getProperty("copymode", Mode.EXPORT.name()));
+ if (copyМapХsltFile != null){
+ success = transformMapWithXslt(copyМapХsltFile, new File(directoryName, "map.mm"), "", copymode, new String[]{});
+ } else {
+ success = copyMap(map, directoryName, copymode);
+ }
+ }
+ if (success && create_image) {
+ success = createImageFromMap(map, directoryName);
+ }
+ }
+ if (!success) {
+ JOptionPane.showMessageDialog(UITools.getCurrentRootComponent(), getProperty("error_creating_directory"), "Freeplane",
+ JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ if (StringUtils.equals(getProperty("load_file"), "true")) {
+ Controller.getCurrentController().getViewController().openDocument(Compat.fileToUrl(saveFile));
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ mTransformResultWithoutError = false;
+ }
+ }
+
+ private boolean transformMapWithXslt(final String xsltFileName, final File saveFile, final String areaCode,
+ final Mode mode, String[] parameters) throws IOException,
+ TransformerFactoryConfigurationError {
+ final String map = getMapXml(mode);
+ final StringReader reader = new StringReader(map);
+ ResourceController resourceController = ResourceController.getResourceController();
+ final URL xsltUrl = resourceController.getResource(xsltFileName);
+ if (xsltUrl == null) {
+ LogUtils.severe("Can't find " + xsltFileName + " as resource.");
+ throw new IllegalArgumentException("Can't find " + xsltFileName + " as resource.");
+ }
+ final InputStream xsltFile = new BufferedInputStream(xsltUrl.openStream());
+ final Source xsltSource = new StreamSource(xsltFile);
+ final Result result = new StreamResult(saveFile);
+ try {
+ final TransformerFactory transFact = TransformerFactory.newInstance();
+ final Transformer trans = transFact.newTransformer(xsltSource);
+ final URI uri = new URI(null, null, saveFile.getName() + "_files/", null);
+ trans.setParameter("destination_dir", uri.toString());
+ trans.setParameter("area_code", areaCode);
+ trans.setParameter("folding_type", resourceController.getProperty(
+ "html_export_folding"));
+ StringBuilder sb = new StringBuilder();
+ for(String p : parameters){
+ String value = resourceController.getProperty(p, null);
+ if(value != null && ! value.equals(resourceController.getDefaultProperty(p))){
+ sb.append(p);
+ sb.append('=');
+ sb.append(value);
+ sb.append("$$$");
+ }
+
+ }
+ trans.setParameter("propertyList", sb.toString());
+ trans.transform(new StreamSource(reader), result);
+ }
+ catch (final Exception e) {
+ LogUtils.warn(e);
+ return false;
+ }
+ finally {
+ FileUtils.silentlyClose(xsltFile);
+ }
+ return true;
+ }
+
+ public FileFilter getFileFilter() {
+ return new ExampleFileFilter(getProperty("file_type"), TextUtils.getText(name + ".text"));
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/IExportEngine.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/IExportEngine.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/export/mindmapmode/IExportEngine.java
rename to freeplane/src/main/java/org/freeplane/features/export/mindmapmode/IExportEngine.java
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ImageCreator.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ImageCreator.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/export/mindmapmode/ImageCreator.java
rename to freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ImageCreator.java
diff --git a/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ImportMindmanagerFiles.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ImportMindmanagerFiles.java
new file mode 100644
index 0000000..a799ef9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ImportMindmanagerFiles.java
@@ -0,0 +1,93 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.export.mindmapmode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import javax.swing.JFileChooser;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * Applies an XSLT to the Document.xml file of MindManager(c) files.
+ */
+public class ImportMindmanagerFiles extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ImportMindmanagerFiles() {
+ super("ImportMindmanagerFiles");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final String type = "mmap";
+ final Component component = Controller.getCurrentController().getViewController().getCurrentRootComponent();
+ final JFileChooser chooser = new JFileChooser();
+ final ExampleFileFilter filter = new ExampleFileFilter(type, null);
+ chooser.setFileFilter(filter);
+ chooser.setAcceptAllFileFilterUsed(true);
+ final File mmFile = Controller.getCurrentController().getMap().getFile();
+ if (mmFile != null && mmFile.getParentFile() != null) {
+ chooser.setSelectedFile(mmFile.getParentFile());
+ }
+ final int returnVal = chooser.showOpenDialog(component);
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+ final File chosenFile = chooser.getSelectedFile();
+ importMindmanagerFile(chosenFile);
+ }
+
+ private void importMindmanagerFile(final File file) {
+ ZipInputStream in = null;
+ try {
+ in = new ZipInputStream(new FileInputStream(file));
+ while (in.available() != 0) {
+ final ZipEntry entry = in.getNextEntry();
+ if (entry == null) {
+ break;
+ }
+ if (!entry.getName().equals("Document.xml")) {
+ continue;
+ }
+ final String xsltFileName = "/xslt/mindmanager2mm.xsl";
+ final File outputFile = new File (file.getParent(), file.getName() + org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION);
+ new XmlImporter(xsltFileName).importXml(in, outputFile);
+ break;
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ finally {
+ FileUtils.silentlyClose(in);
+ }
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ImportXmlFile.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ImportXmlFile.java
new file mode 100644
index 0000000..1a8e4e6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/ImportXmlFile.java
@@ -0,0 +1,73 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.export.mindmapmode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.io.File;
+
+import javax.swing.JFileChooser;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * Applies an XSLT to the Document.xml file of MindManager(c) files.
+ */
+public class ImportXmlFile extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ImportXmlFile() {
+ super("ImportXmlFile");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final String type = "xml";
+ final Component component = Controller.getCurrentController().getViewController().getCurrentRootComponent();
+ final JFileChooser chooser = new JFileChooser();
+ final ExampleFileFilter filter = new ExampleFileFilter(type, null);
+ chooser.setFileFilter(filter);
+ chooser.setAcceptAllFileFilterUsed(true);
+ final File mmFile = Controller.getCurrentController().getMap().getFile();
+ if (mmFile != null && mmFile.getParentFile() != null) {
+ chooser.setSelectedFile(mmFile.getParentFile());
+ }
+ final int returnVal = chooser.showOpenDialog(component);
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+ final File chosenFile = chooser.getSelectedFile();
+ importXmlFile(chosenFile);
+ }
+
+ private void importXmlFile(final File file) {
+ final String xsltFileName = "/xslt/xml2mm.xsl";
+ try{
+ new XmlImporter(xsltFileName).importXml(file);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/XmlImporter.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/XmlImporter.java
new file mode 100644
index 0000000..ef9a49e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/XmlImporter.java
@@ -0,0 +1,83 @@
+package org.freeplane.features.export.mindmapmode;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.XsltPipeReaderFactory;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.map.mindmapmode.MMapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.n3.nanoxml.XMLParseException;
+
+public class XmlImporter {
+
+ final private String xsltResource;
+ public XmlImporter(final String xsltResource){
+ this.xsltResource = xsltResource;
+ }
+
+ public void importXml(final File file) throws XMLParseException, MalformedURLException, IOException, URISyntaxException, XMLException{
+ final File directory = file.getParentFile();
+ final File outputFile = new File (directory, file.getName() + org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION);
+ importXml(file, outputFile);
+ }
+
+ public void importXml(final File inputFile, final File outputFile) throws FileNotFoundException, IOException,
+ XMLParseException, URISyntaxException, XMLException, MalformedURLException {
+ FileInputStream in = null;
+ try{
+ in = new FileInputStream(inputFile);
+ importXml(in, outputFile);
+ }
+ finally {
+ FileUtils.silentlyClose(in);
+ }
+ }
+
+ public void importXml(final InputStream in, final File outputFile) throws IOException, FileNotFoundException,
+ XMLParseException, URISyntaxException, XMLException, MalformedURLException {
+ final URL mapUrl = Compat.fileToUrl(outputFile);
+ if(outputFile.exists()){
+ if(Controller.getCurrentController().getMapViewManager().tryToChangeToMapView(mapUrl))
+ return;
+ final int overwriteMap = JOptionPane.showConfirmDialog(Controller.getCurrentController()
+ .getMapViewManager().getMapViewComponent(), TextUtils.getText("map_already_exists"), "Freeplane",
+ JOptionPane.YES_NO_OPTION);
+ if (overwriteMap != JOptionPane.YES_OPTION) {
+ return ;
+ }
+ }
+ newMap(in, outputFile);
+ }
+
+ private void newMap(final InputStream in, final File outputFile)
+ throws IOException, XMLException, MalformedURLException {
+ final Reader reader = new XsltPipeReaderFactory(xsltResource).getReader(in);
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ final MapModel map = new MMapModel();
+ modeController.getMapController().getMapReader().createNodeTreeFromXml(map, reader, Mode.FILE);
+ final URL mapUrl = Compat.fileToUrl(outputFile);
+ map.setURL(mapUrl);
+ map.setSaved(false);
+ mapController.fireMapCreated(map);
+ mapController.newMapView(map);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/XsltExportEngine.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/XsltExportEngine.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/export/mindmapmode/XsltExportEngine.java
rename to freeplane/src/main/java/org/freeplane/features/export/mindmapmode/XsltExportEngine.java
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/XsltExportEngineFactory.java b/freeplane/src/main/java/org/freeplane/features/export/mindmapmode/XsltExportEngineFactory.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/export/mindmapmode/XsltExportEngineFactory.java
rename to freeplane/src/main/java/org/freeplane/features/export/mindmapmode/XsltExportEngineFactory.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/AFilterComposerDialog.java b/freeplane/src/main/java/org/freeplane/features/filter/AFilterComposerDialog.java
new file mode 100644
index 0000000..ac30da8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/AFilterComposerDialog.java
@@ -0,0 +1,661 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.util.Collection;
+
+import javax.swing.Action;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.ListSelectionModel;
+import javax.swing.SwingConstants;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionNotSatisfiedDecorator;
+import org.freeplane.features.filter.condition.ConjunctConditions;
+import org.freeplane.features.filter.condition.DisjunctConditions;
+import org.freeplane.features.filter.condition.ICombinedCondition;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public abstract class AFilterComposerDialog extends JDialog implements IMapSelectionListener {
+ /**
+ * @author Dimitry Polivaev
+ */
+ private class AddElementaryConditionAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ AddElementaryConditionAction() {
+ super("AddElementaryConditionAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ ASelectableCondition newCond;
+ newCond = editor.getCondition();
+ if (newCond != null) {
+ final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
+ model.addElement(newCond);
+ }
+ validate();
+ }
+ }
+
+ private class CloseAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ final Object source = e.getSource();
+ final boolean success;
+ if (source == btnOK || source == btnApply) {
+ success = applyChanges();
+ }
+ else {
+ success = true;
+ }
+ if (!success) {
+ return;
+ }
+ internalConditionsModel = null;
+ if (source == btnOK) {
+ dispose(true);
+ }
+ else if (source == btnCancel) {
+ dispose(false);
+ }
+ else {
+ initInternalConditionModel();
+ }
+ }
+
+ }
+
+ private boolean success;
+
+ public boolean isSuccess() {
+ return success;
+ }
+
+ private void dispose(boolean b) {
+ this.success = b;
+ dispose();
+ }
+ private class ConditionListMouseListener extends MouseAdapter {
+ @Override
+ public void mouseClicked(final MouseEvent e) {
+ if (e.getClickCount() == 2) {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ if (selectCondition()) {
+ dispose(true);
+ }
+ }
+ });
+ }
+ }
+ }
+
+ private class ConditionListSelectionListener implements ListSelectionListener {
+ public void valueChanged(final ListSelectionEvent e) {
+ final int minSelectionIndex = elementaryConditionList.getMinSelectionIndex();
+ if (minSelectionIndex == -1) {
+ btnNot.setEnabled(false);
+ btnSplit.setEnabled(false);
+ btnAnd.setEnabled(false);
+ btnOr.setEnabled(false);
+ btnDelete.setEnabled(false);
+ btnName.setEnabled(false);
+ btnUp.setEnabled(false);
+ btnDown.setEnabled(false);
+ }
+ else {
+ btnUp.setEnabled(true);
+ btnDown.setEnabled(true);
+ btnDelete.setEnabled(true);
+ final int maxSelectionIndex = elementaryConditionList.getMaxSelectionIndex();
+ final boolean oneElementChosen = minSelectionIndex == maxSelectionIndex;
+ btnNot.setEnabled(oneElementChosen);
+ btnName.setEnabled(oneElementChosen);
+ btnAnd.setEnabled(! oneElementChosen);
+ btnOr.setEnabled(! oneElementChosen);
+ btnSplit.setEnabled(oneElementChosen && elementaryConditionList.getSelectedValue() instanceof ICombinedCondition);
+ }
+ }
+ }
+
+ private class CreateConjunctConditionAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ CreateConjunctConditionAction() {
+ super("CreateConjunctConditionAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ASelectableCondition[] selectedValues = toConditionsArray(elementaryConditionList.getSelectedValues());
+ if (selectedValues.length < 2) {
+ return;
+ }
+ final ASelectableCondition newCond = new ConjunctConditions(selectedValues);
+ final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
+ model.addElement(newCond);
+ validate();
+ }
+ }
+
+ private class CreateDisjunctConditionAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ CreateDisjunctConditionAction() {
+ super("CreateDisjunctConditionAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ASelectableCondition[] selectedValues = toConditionsArray(elementaryConditionList.getSelectedValues());
+ if (selectedValues.length < 2) {
+ return;
+ }
+ final ASelectableCondition newCond = new DisjunctConditions(selectedValues);
+ final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
+ model.addElement(newCond);
+ validate();
+ }
+ }
+
+ private ASelectableCondition[] toConditionsArray(final Object[] objects) {
+ final ASelectableCondition[] conditions = new ASelectableCondition[objects.length];
+ for (int i = 0; i < objects.length; i++) {
+ conditions[i] = (ASelectableCondition) objects[i];
+ }
+ return conditions;
+ }
+
+ private class CreateNotSatisfiedConditionAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ CreateNotSatisfiedConditionAction() {
+ super("CreateNotSatisfiedConditionAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final int min = elementaryConditionList.getMinSelectionIndex();
+ if (min >= 0) {
+ final int max = elementaryConditionList.getMinSelectionIndex();
+ if (min == max) {
+ final ASelectableCondition oldCond = (ASelectableCondition) elementaryConditionList
+ .getSelectedValue();
+ final ASelectableCondition newCond = new ConditionNotSatisfiedDecorator(oldCond);
+ final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
+ model.addElement(newCond);
+ validate();
+ }
+ }
+ }
+ }
+
+ private class SplitConditionAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ SplitConditionAction() {
+ super("SplitConditionAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final int min = elementaryConditionList.getMinSelectionIndex();
+ if (min >= 0) {
+ final int max = elementaryConditionList.getMinSelectionIndex();
+ if (min == max) {
+ final ASelectableCondition oldCond = (ASelectableCondition) elementaryConditionList
+ .getSelectedValue();
+ if (!(oldCond instanceof ICombinedCondition)) {
+ return;
+ }
+ final Collection<ASelectableCondition> newConditions = ((ICombinedCondition) oldCond).split();
+ final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
+ for (ASelectableCondition newCond : newConditions) {
+ final int index = model.getIndexOf(newCond);
+ if (-1 == index) {
+ model.addElement(newCond);
+ final int newIndex = model.getSize() - 1;
+ elementaryConditionList.addSelectionInterval(newIndex, newIndex);
+ }
+ else {
+ elementaryConditionList.addSelectionInterval(index, index);
+ }
+ }
+ elementaryConditionList.removeSelectionInterval(min, min);
+ validate();
+ }
+ }
+ }
+ }
+
+ private class DeleteConditionAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ DeleteConditionAction() {
+ super("DeleteConditionAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
+ final int minSelectionIndex = elementaryConditionList.getMinSelectionIndex();
+ int selectedIndex;
+ while (0 <= (selectedIndex = elementaryConditionList.getSelectedIndex())) {
+ model.removeElementAt(selectedIndex);
+ }
+ final int size = elementaryConditionList.getModel().getSize();
+ if (size > 0) {
+ elementaryConditionList.setSelectedIndex(minSelectionIndex < size ? minSelectionIndex : size - 1);
+ }
+ validate();
+ }
+ }
+
+ private class NameConditionAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ NameConditionAction() {
+ super("NameConditionAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
+ final int minSelectionIndex = elementaryConditionList.getMinSelectionIndex();
+ if (minSelectionIndex == -1) {
+ return;
+ }
+ final ASelectableCondition condition = (ASelectableCondition) model.getElementAt(minSelectionIndex);
+ final String userName = condition.getUserName();
+ final String newUserName = JOptionPane.showInputDialog(AFilterComposerDialog.this,
+ TextUtils.getText("enter_condition_name"), userName == null ? "" : userName);
+ if(newUserName == null)
+ return;
+ XMLElement xmlCondition = new XMLElement();
+ condition.toXml(xmlCondition);
+ ASelectableCondition newCondition = filterController.getConditionFactory().loadCondition(xmlCondition.getChildAtIndex(0));
+ if(newCondition== null)
+ return;
+ if (newUserName.equals("")) {
+ if(userName == null)
+ return;
+ newCondition.setUserName(null);
+ }
+ else {
+ if(newUserName.equals(userName))
+ return;
+ newCondition.setUserName(newUserName);
+ }
+ model.removeElementAt(minSelectionIndex);
+ model.insertElementAt(newCondition, minSelectionIndex);
+ }
+ }
+
+ private class MoveConditionAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private int positionChange;
+ private DefaultComboBoxModel model;
+ private int[] selectedIndices;
+
+ MoveConditionAction(String key, boolean up) {
+ super(key);
+ this.positionChange = up ? -1 : 1;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ model = (DefaultComboBoxModel) elementaryConditionList.getModel();
+ selectedIndices = elementaryConditionList.getSelectedIndices();
+ if(positionChange < 1)
+ for (int selectedIndexPosition = 0; selectedIndexPosition < selectedIndices.length; selectedIndexPosition++){
+ moveIndex(selectedIndexPosition);
+ }
+ else
+ for (int selectedIndexPosition = selectedIndices.length - 1; selectedIndexPosition >= 0; selectedIndexPosition--){
+ moveIndex(selectedIndexPosition);
+ }
+ elementaryConditionList.setSelectedIndices(selectedIndices);
+ }
+
+ protected void moveIndex(int selectedIndexPosition) {
+ int index = selectedIndices[selectedIndexPosition];
+ final ASelectableCondition condition = (ASelectableCondition) model.getElementAt(index);
+ final int newPosition = index + positionChange;
+ if(newPosition >= 0 && newPosition < model.getSize() && ! elementaryConditionList.isSelectedIndex(newPosition)){
+ model.removeElementAt(index);
+ model.insertElementAt(condition, newPosition);
+ selectedIndices[selectedIndexPosition] = newPosition;
+ }
+ }
+ }
+ private class LoadAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ final JFileChooser chooser = getFileChooser();
+ final int returnVal = chooser.showOpenDialog(AFilterComposerDialog.this);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ try {
+ final File theFile = chooser.getSelectedFile();
+ internalConditionsModel.removeAllElements();
+ filterController.loadConditions(internalConditionsModel, theFile.getCanonicalPath(), true);
+ }
+ catch (final Exception ex) {
+ LogUtils.severe(ex);
+ }
+ }
+ }
+ }
+
+ static private class MindMapFilterFileFilter extends FileFilter {
+ static FileFilter filter = new MindMapFilterFileFilter();
+
+ @Override
+ public boolean accept(final File f) {
+ if (f.isDirectory()) {
+ return true;
+ }
+ final String extension = FileUtils.getExtension(f.getName());
+ if (extension != null) {
+ if (extension.equals(FilterController.FREEPLANE_FILTER_EXTENSION_WITHOUT_DOT)) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getDescription() {
+ return TextUtils.getText("mindmaps_filter_desc");
+ }
+ }
+
+ private class SaveAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ final JFileChooser chooser = getFileChooser();
+ chooser.setDialogTitle(TextUtils.getText("SaveAsAction.text"));
+ final int returnVal = chooser.showSaveDialog(AFilterComposerDialog.this);
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+ try {
+ final File f = chooser.getSelectedFile();
+ String canonicalPath = f.getCanonicalPath();
+ final String suffix = '.' + FilterController.FREEPLANE_FILTER_EXTENSION_WITHOUT_DOT;
+ if (!canonicalPath.endsWith(suffix)) {
+ canonicalPath = canonicalPath + suffix;
+ }
+ filterController.saveConditions(internalConditionsModel, canonicalPath);
+ }
+ catch (final Exception ex) {
+ LogUtils.severe(ex);
+ }
+ }
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final int GAP_BETWEEN_BUTTONS = 10;
+ final private JButton btnAnd;
+ final private JButton btnApply;
+ final private JButton btnCancel;
+ final private JButton btnDelete;
+ final private JButton btnName;
+ final private JButton btnUp;
+ final private JButton btnDown;
+ private JButton btnLoad;
+ final private JButton btnNot;
+ final private JButton btnSplit;
+ final private JButton btnOK;
+ final private JButton btnOr;
+ private JButton btnSave;
+ final private ConditionListSelectionListener conditionListListener;
+ // // final private Controller controller;
+ final private FilterConditionEditor editor;
+ final private JList elementaryConditionList;
+ final private FilterController filterController;
+ private DefaultComboBoxModel internalConditionsModel;
+ private Box conditionButtonBox;
+
+ public AFilterComposerDialog(String title, boolean modal) {
+ super(UITools.getCurrentFrame(), title, modal);
+ filterController = FilterController.getCurrentFilterController();
+ editor = new FilterConditionEditor(filterController);
+ editor.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(),
+ BorderFactory.createEmptyBorder(5, 0, 5, 0)));
+ // this.controller = controller;
+ getContentPane().add(editor, BorderLayout.NORTH);
+ conditionButtonBox = Box.createVerticalBox();
+ conditionButtonBox.setBorder(new EmptyBorder(0, 10, 0, 10));
+ getContentPane().add(conditionButtonBox, BorderLayout.EAST);
+ addAction(new AddElementaryConditionAction(), true);
+ btnNot = addAction(new CreateNotSatisfiedConditionAction(), false);
+ btnAnd = addAction(new CreateConjunctConditionAction(), false);
+ btnOr = addAction(new CreateDisjunctConditionAction(), false);
+ btnSplit = addAction(new SplitConditionAction(), false);
+ btnDelete = addAction(new DeleteConditionAction(), false);
+ btnName = addAction(new NameConditionAction(), false);
+ btnUp = addAction(new MoveConditionAction("UpConditionAction", true), false);
+ btnDown = addAction(new MoveConditionAction("DownConditionAction", false), false);
+ conditionButtonBox.add(Box.createVerticalGlue());
+ final Box controllerBox = Box.createHorizontalBox();
+ controllerBox.setBorder(new EmptyBorder(5, 0, 5, 0));
+ getContentPane().add(controllerBox, BorderLayout.SOUTH);
+ final CloseAction closeAction = new CloseAction();
+ btnOK = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(btnOK, TextUtils.getRawText("ok"));
+ btnOK.addActionListener(closeAction);
+ btnOK.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ controllerBox.add(Box.createHorizontalGlue());
+ controllerBox.add(btnOK);
+ if (!isModal()) {
+ btnApply = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(btnApply, TextUtils.getRawText("apply"));
+ btnApply.addActionListener(closeAction);
+ btnApply.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ controllerBox.add(Box.createHorizontalGlue());
+ controllerBox.add(btnApply);
+ }
+ else {
+ btnApply = null;
+ }
+ btnCancel = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(btnCancel, TextUtils.getRawText("cancel"));
+ btnCancel.addActionListener(closeAction);
+ btnCancel.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ controllerBox.add(Box.createHorizontalGlue());
+ controllerBox.add(btnCancel);
+ controllerBox.add(Box.createHorizontalGlue());
+ Controller controller = Controller.getCurrentController();
+ if (!controller.getViewController().isApplet()) {
+ final ActionListener saveAction = new SaveAction();
+ btnSave = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(btnSave, TextUtils.getRawText("save"));
+ btnSave.addActionListener(saveAction);
+ btnSave.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ final ActionListener loadAction = new LoadAction();
+ btnLoad = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(btnLoad, TextUtils.getRawText("load"));
+ btnLoad.addActionListener(loadAction);
+ btnLoad.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ controllerBox.add(btnSave);
+ controllerBox.add(Box.createHorizontalGlue());
+ controllerBox.add(btnLoad);
+ controllerBox.add(Box.createHorizontalGlue());
+ }
+ elementaryConditionList = new JList();
+ elementaryConditionList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
+ elementaryConditionList.setCellRenderer(filterController.getConditionRenderer());
+ elementaryConditionList.setLayoutOrientation(JList.VERTICAL);
+ elementaryConditionList.setAlignmentX(Component.LEFT_ALIGNMENT);
+ conditionListListener = new ConditionListSelectionListener();
+ elementaryConditionList.addListSelectionListener(conditionListListener);
+ elementaryConditionList.addMouseListener(new ConditionListMouseListener());
+ final JScrollPane conditionScrollPane = new JScrollPane(elementaryConditionList);
+ UITools.setScrollbarIncrement(conditionScrollPane);
+ UITools.addScrollbarIncrementPropertyListener(conditionScrollPane);
+ final JLabel conditionColumnHeader = new JLabel(TextUtils.getText("filter_conditions"));
+ conditionColumnHeader.setHorizontalAlignment(SwingConstants.CENTER);
+ conditionScrollPane.setColumnHeaderView(conditionColumnHeader);
+ final Rectangle desktopBounds = UITools.getDesktopBounds(this);
+ Dimension preferredSize = new Dimension(desktopBounds.width * 2 / 3, desktopBounds.height * 2 / 3);
+ conditionScrollPane.setPreferredSize(preferredSize);
+ getContentPane().add(conditionScrollPane, BorderLayout.CENTER);
+ UITools.addEscapeActionToDialog(this);
+ pack();
+ }
+
+ private JButton addAction(Action action, boolean enabled) {
+ JButton button = new JButton(action);
+ button.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ conditionButtonBox.add(Box.createVerticalStrut(GAP_BETWEEN_BUTTONS));
+ conditionButtonBox.add(button);
+ if(! enabled)
+ button.setEnabled(false);
+ return button;
+ }
+
+ public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
+ editor.mapChanged(newMap);
+ }
+
+ private boolean applyChanges() {
+ internalConditionsModel.setSelectedItem(elementaryConditionList.getSelectedValue());
+ final int[] selectedIndices = elementaryConditionList.getSelectedIndices();
+ if (applyModel(internalConditionsModel, selectedIndices)) {
+ internalConditionsModel = null;
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+ abstract protected boolean applyModel(DefaultComboBoxModel model, int[] selectedIndices);
+
+ public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
+ }
+
+ protected JFileChooser getFileChooser() {
+ final JFileChooser chooser = UrlManager.getController().getFileChooser(MindMapFilterFileFilter.filter, false);
+ return chooser;
+ }
+
+ private void initInternalConditionModel() {
+ internalConditionsModel = createModel();
+ elementaryConditionList.setModel(internalConditionsModel);
+ Object selectedItem = internalConditionsModel.getSelectedItem();
+ if (selectedItem != null) {
+ int selectedIndex = internalConditionsModel.getIndexOf(selectedItem);
+ if (selectedIndex >= 0) {
+ elementaryConditionList.setSelectedIndex(selectedIndex);
+ return;
+ }
+ }
+ }
+
+ abstract protected DefaultComboBoxModel createModel();
+
+ private boolean selectCondition() {
+ final int min = elementaryConditionList.getMinSelectionIndex();
+ if (min >= 0) {
+ final int max = elementaryConditionList.getMinSelectionIndex();
+ if (min == max) {
+ return applyChanges();
+ }
+ }
+ return false;
+ }
+
+ /**
+ */
+ public void setSelectedItem(final Object selectedItem) {
+ elementaryConditionList.setSelectedValue(selectedItem, true);
+ }
+
+ @Override
+ public void show() {
+ initInternalConditionModel();
+ success = false;
+ super.show();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/ApplyNamedFilterAction.java b/freeplane/src/main/java/org/freeplane/features/filter/ApplyNamedFilterAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/ApplyNamedFilterAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/ApplyNamedFilterAction.java
diff --git a/freeplane/src/org/freeplane/features/filter/ApplyNoFilteringAction.java b/freeplane/src/main/java/org/freeplane/features/filter/ApplyNoFilteringAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/ApplyNoFilteringAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/ApplyNoFilteringAction.java
diff --git a/freeplane/src/org/freeplane/features/filter/ApplySelectedViewConditionAction.java b/freeplane/src/main/java/org/freeplane/features/filter/ApplySelectedViewConditionAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/ApplySelectedViewConditionAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/ApplySelectedViewConditionAction.java
diff --git a/freeplane/src/org/freeplane/features/filter/ApplyToVisibleAction.java b/freeplane/src/main/java/org/freeplane/features/filter/ApplyToVisibleAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/ApplyToVisibleAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/ApplyToVisibleAction.java
diff --git a/freeplane/src/org/freeplane/features/filter/DamerauLevenshtein.java b/freeplane/src/main/java/org/freeplane/features/filter/DamerauLevenshtein.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/DamerauLevenshtein.java
rename to freeplane/src/main/java/org/freeplane/features/filter/DamerauLevenshtein.java
diff --git a/freeplane/src/org/freeplane/features/filter/EditDistanceStringMatchingStrategy.java b/freeplane/src/main/java/org/freeplane/features/filter/EditDistanceStringMatchingStrategy.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/EditDistanceStringMatchingStrategy.java
rename to freeplane/src/main/java/org/freeplane/features/filter/EditDistanceStringMatchingStrategy.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/EditFilterAction.java b/freeplane/src/main/java/org/freeplane/features/filter/EditFilterAction.java
new file mode 100644
index 0000000..80709d6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/EditFilterAction.java
@@ -0,0 +1,108 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 28, 2009
+ */
+class EditFilterAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+ private AFilterComposerDialog filterDialog = null;
+
+ EditFilterAction(final FilterController filterController) {
+ super("EditFilterAction");
+ this.filterController = filterController;
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ final Object selectedItem = filterController.getFilterConditions().getSelectedItem();
+ if (selectedItem != null) {
+ getFilterDialog().setSelectedItem(selectedItem);
+ }
+ getFilterDialog().show();
+ }
+
+ private class FilterComposerDialog extends AFilterComposerDialog{
+
+ public FilterComposerDialog() {
+ super(TextUtils.getText("filter_dialog"), false);
+ }
+
+ protected DefaultComboBoxModel createModel() {
+ DefaultComboBoxModel model = new DefaultComboBoxModel();
+ ComboBoxModel externalConditionsModel = filterController.getFilterConditions();
+ for (int i = FilterController.USER_DEFINED_CONDITION_START_INDEX; i < externalConditionsModel.getSize(); i++) {
+ final Object element = externalConditionsModel.getElementAt(i);
+ model.addElement(element);
+ }
+ Object selectedItem = externalConditionsModel.getSelectedItem();
+ if(model.getIndexOf(selectedItem) != -1){
+ model.setSelectedItem(selectedItem);
+ }
+ else{
+ model.setSelectedItem(null);
+ }
+ return model;
+ }
+
+ protected boolean applyModel(DefaultComboBoxModel model, int[] selectedIndices) {
+ filterController.setFilterConditions(model);
+ return true;
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ private AFilterComposerDialog getFilterDialog() {
+ if (filterDialog == null) {
+ filterDialog = new FilterComposerDialog();
+ getFilterDialog().setLocationRelativeTo(filterController.getFilterToolbar());
+ Controller.getCurrentController().getMapViewManager().addMapSelectionListener(filterDialog);
+ }
+ return filterDialog;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/ExactStringMatchingStrategy.java b/freeplane/src/main/java/org/freeplane/features/filter/ExactStringMatchingStrategy.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/ExactStringMatchingStrategy.java
rename to freeplane/src/main/java/org/freeplane/features/filter/ExactStringMatchingStrategy.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/Filter.java b/freeplane/src/main/java/org/freeplane/features/filter/Filter.java
new file mode 100644
index 0000000..d3b8c8c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/Filter.java
@@ -0,0 +1,240 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import java.util.Collection;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.filter.condition.ICondition;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class Filter {
+ static Filter createTransparentFilter() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ return new Filter(null, resourceController.getBooleanProperty("filter.showAncestors"), resourceController.getBooleanProperty("filter.showDescendants"), false);
+ }
+
+ final private boolean appliesToVisibleNodesOnly;
+ final private ICondition condition;
+ final private int options;
+
+ public Filter(final ICondition condition, final boolean areAncestorsShown,
+ final boolean areDescendantsShown, final boolean applyToVisibleNodesOnly) {
+ super();
+ this.condition = condition;
+ int options = FilterInfo.FILTER_INITIAL_VALUE | FilterInfo.FILTER_SHOW_MATCHED;
+ if (areAncestorsShown) {
+ options += FilterInfo.FILTER_SHOW_ANCESTOR;
+ }
+ options += FilterInfo.FILTER_SHOW_ECLIPSED;
+ if (areDescendantsShown) {
+ options += FilterInfo.FILTER_SHOW_DESCENDANT;
+ }
+ this.options = options;
+ appliesToVisibleNodesOnly = condition != null && applyToVisibleNodesOnly;
+ }
+
+ void addFilterResult(final NodeModel node, final int flag) {
+ node.getFilterInfo().add(flag);
+ }
+
+ protected boolean appliesToVisibleNodesOnly() {
+ return appliesToVisibleNodesOnly;
+ }
+
+ static private Icon filterIcon;
+
+ void displayFilterStatus() {
+ if (filterIcon == null) {
+ filterIcon = new ImageIcon(ResourceController.getResourceController().getResource("/images/filter.png"));
+ }
+ if (getCondition() != null) {
+ Controller.getCurrentController().getViewController().addStatusInfo("filter", null, filterIcon);
+ }
+ else {
+ Controller.getCurrentController().getViewController().removeStatus("filter");
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.Filter#applyFilter(freeplane.modes.MindMap)
+ */
+ public void applyFilter(Object source, final MapModel map, final boolean force) {
+ if (map == null) {
+ return;
+ }
+ try {
+ displayFilterStatus();
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ final Filter oldFilter = map.getFilter();
+ map.setFilter(this);
+ if (force || !isConditionStronger(oldFilter)) {
+ final NodeModel root = map.getRootNode();
+ resetFilter(root);
+ if (filterChildren(root, checkNode(root), false)) {
+ addFilterResult(root, FilterInfo.FILTER_SHOW_ANCESTOR);
+ }
+ }
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ final NodeModel selected = selection.getSelected();
+ final NodeModel selectedVisible = selected.getVisibleAncestorOrSelf();
+ selection.keepNodePosition(selectedVisible, 0.5f, 0.5f);
+ refreshMap(source, map);
+ selectVisibleNode();
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+ private boolean applyFilter(final NodeModel node,
+ final boolean isAncestorSelected, final boolean isAncestorEclipsed,
+ boolean isDescendantSelected) {
+ final boolean conditionSatisfied = checkNode(node);
+ resetFilter(node);
+ if (isAncestorSelected) {
+ addFilterResult(node, FilterInfo.FILTER_SHOW_DESCENDANT);
+ }
+ if (conditionSatisfied) {
+ isDescendantSelected = true;
+ addFilterResult(node, FilterInfo.FILTER_SHOW_MATCHED);
+ }
+ else {
+ addFilterResult(node, FilterInfo.FILTER_SHOW_HIDDEN);
+ }
+ if (isAncestorEclipsed) {
+ addFilterResult(node, FilterInfo.FILTER_SHOW_ECLIPSED);
+ }
+ if (filterChildren(node, conditionSatisfied || isAncestorSelected, !conditionSatisfied
+ || isAncestorEclipsed)) {
+ addFilterResult(node, FilterInfo.FILTER_SHOW_ANCESTOR);
+ isDescendantSelected = true;
+ }
+ return isDescendantSelected;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.controller.filter.Filter#areAncestorsShown()
+ */
+ public boolean areAncestorsShown() {
+ return 0 != (options & FilterInfo.FILTER_SHOW_ANCESTOR);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.controller.filter.Filter#areDescendantsShown()
+ */
+ public boolean areDescendantsShown() {
+ return 0 != (options & FilterInfo.FILTER_SHOW_DESCENDANT);
+ }
+
+ private boolean checkNode(final NodeModel node) {
+ if (condition == null) {
+ return true;
+ }
+ if (appliesToVisibleNodesOnly && !node.hasVisibleContent()) {
+ return false;
+ }
+ return condition.checkNode(node);
+ }
+
+ private boolean filterChildren(final NodeModel node,
+ final boolean isAncestorSelected, final boolean isAncestorEclipsed) {
+ boolean isDescendantSelected = false;
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ isDescendantSelected = applyFilter(child, isAncestorSelected, isAncestorEclipsed,
+ isDescendantSelected);
+ }
+ return isDescendantSelected;
+ }
+
+ public ICondition getCondition() {
+ return condition;
+ }
+
+ public boolean isConditionStronger(final Filter oldFilter) {
+ return (!appliesToVisibleNodesOnly || appliesToVisibleNodesOnly == oldFilter.appliesToVisibleNodesOnly)
+ && (condition != null && condition.equals(oldFilter.getCondition()) || condition == null
+ && oldFilter.getCondition() == null);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.filter.Filter#isVisible(freeplane.modes.MindMapNode)
+ */
+ public boolean isVisible(final NodeModel node) {
+ if (condition == null) {
+ return true;
+ }
+ final int filterResult = node.getFilterInfo().get();
+ return ((options & FilterInfo.FILTER_SHOW_ANCESTOR) != 0 || (options & FilterInfo.FILTER_SHOW_ECLIPSED) >= (filterResult & FilterInfo.FILTER_SHOW_ECLIPSED))
+ && ((options & filterResult & ~FilterInfo.FILTER_SHOW_ECLIPSED) != 0);
+ }
+
+ private void refreshMap(Object source, MapModel map) {
+ Controller.getCurrentModeController().getMapController().fireMapChanged(new MapChangeEvent(source, map, Filter.class, null, this));
+ }
+
+ private void resetFilter(final NodeModel node) {
+ node.getFilterInfo().reset();
+ }
+
+ private void selectVisibleNode() {
+ final IMapSelection mapSelection = Controller.getCurrentController().getSelection();
+ final Collection<NodeModel> selectedNodes = mapSelection.getSelection();
+ final NodeModel[] array = new NodeModel[selectedNodes.size()];
+ boolean next = false;
+ for(NodeModel node : selectedNodes.toArray(array)){
+ if(next){
+ if (!node.hasVisibleContent()) {
+ mapSelection.toggleSelected(node);
+ }
+ }
+ else
+ next = true;
+ }
+ NodeModel selected = mapSelection.getSelected();
+ if (!selected.hasVisibleContent()) {
+ if(mapSelection.getSelection().size() > 1){
+ mapSelection.toggleSelected(selected);
+ }
+ else
+ mapSelection.selectAsTheOnlyOneSelected(selected.getVisibleAncestorOrSelf());
+ }
+ mapSelection.setSiblingMaxLevel(mapSelection.getSelected().getNodeLevel(false));
+ }
+
+ public boolean matches(NodeModel nodeModel) {
+ return 0 != (nodeModel.getFilterInfo().get() & FilterInfo.FILTER_SHOW_MATCHED);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/FilterConditionEditor.java b/freeplane/src/main/java/org/freeplane/features/filter/FilterConditionEditor.java
new file mode 100644
index 0000000..9699886
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/FilterConditionEditor.java
@@ -0,0 +1,341 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.lang.ref.WeakReference;
+import java.util.Iterator;
+
+import javax.swing.Box;
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.ListCellRenderer;
+import javax.swing.RootPaneContainer;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.FixedBasicComboBoxEditor;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.collection.ExtendedComboBoxModel;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * 23.05.2009
+ */
+public class FilterConditionEditor extends JComponent {
+ private class ElementaryConditionChangeListener implements ItemListener {
+ public void itemStateChanged(final ItemEvent e) {
+ if (e.getStateChange() == ItemEvent.SELECTED) {
+ setValuesEditor();
+ }
+ }
+ }
+
+ private class FilteredPropertyChangeListener implements ItemListener {
+ public void itemStateChanged(final ItemEvent e) {
+ if (e.getStateChange() == ItemEvent.SELECTED) {
+ final Object selectedProperty = filteredPropertiesComponent.getSelectedItem();
+ final IElementaryConditionController conditionController = filterController.getConditionFactory()
+ .getConditionController(selectedProperty);
+ final ComboBoxModel simpleConditionComboBoxModel = conditionController
+ .getConditionsForProperty(selectedProperty);
+ elementaryConditions.setModel(simpleConditionComboBoxModel);
+ elementaryConditions.setEnabled(simpleConditionComboBoxModel.getSize() > 0);
+ setValuesEditor();
+ return;
+ }
+ }
+ }
+
+
+ /**
+ * Start "Find next" action when pressing enter key in "value" combo box
+ */
+ private void setValuesEnterKeyListener()
+ {
+ if (enterKeyActionListener != null)
+ {
+ values.getEditor().removeActionListener(enterKeyActionListener);
+ values.getEditor().addActionListener(enterKeyActionListener);
+ }
+ }
+
+ public void setSearchingBusyCursor()
+ {
+ RootPaneContainer root = (RootPaneContainer)getTopLevelAncestor();
+ root.getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ root.getGlassPane().setVisible(true);
+ }
+
+ public void setSearchingDefaultCursor()
+ {
+ RootPaneContainer root = (RootPaneContainer)getTopLevelAncestor();
+ root.getGlassPane().setCursor(Cursor.getDefaultCursor());
+ root.getGlassPane().setVisible(false);
+ }
+
+ private void setValuesEditor() {
+ final Object selectedProperty = filteredPropertiesComponent.getSelectedItem();
+ final IElementaryConditionController conditionController = filterController.getConditionFactory()
+ .getConditionController(selectedProperty);
+ final TranslatedObject selectedCondition = (TranslatedObject) elementaryConditions.getSelectedItem();
+ final boolean canSelectValues = conditionController
+ .canSelectValues(selectedProperty, selectedCondition);
+ values.setEnabled(canSelectValues);
+ values.setEditable(false);
+ values.setModel(conditionController.getValuesForProperty(selectedProperty, selectedCondition));
+
+ final ComboBoxEditor valueEditor = conditionController.getValueEditor(selectedProperty, selectedCondition);
+ values.setEditor(valueEditor != null ? valueEditor : new FixedBasicComboBoxEditor());
+ setValuesEnterKeyListener();
+
+ final ListCellRenderer valueRenderer = conditionController.getValueRenderer(selectedProperty, selectedCondition);
+ values.setRenderer(valueRenderer != null ? valueRenderer : filterController.getConditionRenderer());
+
+ values.setEditable(conditionController.canEditValues(selectedProperty, selectedCondition));
+ if (values.getModel().getSize() > 0) {
+ values.setSelectedIndex(0);
+ }
+ caseSensitive.setEnabled(canSelectValues
+ && conditionController.isCaseDependent(selectedProperty, selectedCondition));
+ approximateMatching.setEnabled(canSelectValues
+ && conditionController.supportsApproximateMatching(selectedProperty, selectedCondition));
+ }
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final String PROPERTY_FILTER_MATCH_CASE = "filter_match_case";
+ private static final String PROPERTY_FILTER_MATCH_CASE_TOOLTIP = "filter_match_case_tooltip";
+ private static final String PROPERTY_FILTER_APPROXIMATE_MATCH = "filter_match_approximately";
+ private static final String PROPERTY_FILTER_APPROXIMATE_MATCH_TOOLTIP = "filter_match_approximately_tooltip";
+ final private JCheckBox caseSensitive;
+ final private JCheckBox approximateMatching;
+ final private JComboBox elementaryConditions;
+ final private FilterController filterController;
+ final private JComboBox filteredPropertiesComponent;
+ final private ExtendedComboBoxModel filteredPropertiesModel;
+ private WeakReference<MapModel> lastMap;
+ final private JComboBox values;
+ private ActionListener enterKeyActionListener;
+ public FilterConditionEditor(final FilterController filterController) {
+ this(filterController, 5, false);
+ }
+ public FilterConditionEditor(final FilterController filterController, final int borderWidth, final boolean horizontal) {
+ super();
+ setLayout(new GridBagLayout());
+ final GridBagConstraints gridBagConstraints = new GridBagConstraints();
+ gridBagConstraints.fill = GridBagConstraints.BOTH;
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = GridBagConstraints.NORTH;
+ gridBagConstraints.insets = new Insets(0, borderWidth, 0, borderWidth);
+ this.filterController = filterController;
+ //Basic layout
+ //Item to search for
+ filteredPropertiesComponent = new JComboBoxWithBorder();
+ filteredPropertiesModel = new ExtendedComboBoxModel();
+ filteredPropertiesComponent.setModel(filteredPropertiesModel);
+ filteredPropertiesComponent.addItemListener(new FilteredPropertyChangeListener());
+ add(Box.createHorizontalGlue(), gridBagConstraints);
+ gridBagConstraints.gridx++;
+ filteredPropertiesComponent.setAlignmentY(Component.TOP_ALIGNMENT);
+ add(filteredPropertiesComponent, gridBagConstraints);
+ gridBagConstraints.gridx++;
+ filteredPropertiesComponent.setRenderer(filterController.getConditionRenderer());
+ //Search condition
+ elementaryConditions = new JComboBoxWithBorder();
+ elementaryConditions.addItemListener(new ElementaryConditionChangeListener());
+ elementaryConditions.setAlignmentY(Component.TOP_ALIGNMENT);
+ add(elementaryConditions, gridBagConstraints);
+ gridBagConstraints.gridx++;
+ elementaryConditions.setRenderer(filterController.getConditionRenderer());
+ //Search value
+ values = new JComboBoxWithBorder();
+ values.setPreferredSize(new Dimension(240,20));
+ gridBagConstraints.anchor = GridBagConstraints.WEST;
+ add(values, gridBagConstraints);
+ if(horizontal){
+ gridBagConstraints.gridx++;
+ }
+ else{
+ gridBagConstraints.gridy++;
+ }
+ values.setEditable(true);
+ setValuesEnterKeyListener();
+
+ JPanel ignoreCaseAndApproximateMatchingPanel = new JPanel();
+ ignoreCaseAndApproximateMatchingPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
+
+ // Ignore case checkbox
+ caseSensitive = new JCheckBox();
+ caseSensitive.setModel(filterController.getCaseSensitiveButtonModel());
+ caseSensitive.setToolTipText(TextUtils.getRawText(PROPERTY_FILTER_MATCH_CASE_TOOLTIP));
+ //add(caseSensitive, gridBagConstraints);
+ ignoreCaseAndApproximateMatchingPanel.add(caseSensitive);
+ //gridBagConstraints.gridx++;
+ LabelAndMnemonicSetter.setLabelAndMnemonic(caseSensitive,TextUtils.getRawText(PROPERTY_FILTER_MATCH_CASE));
+ caseSensitive.setSelected(ResourceController.getResourceController().getBooleanProperty(
+ PROPERTY_FILTER_MATCH_CASE));
+
+ // add approximate matching checkbox
+ approximateMatching = new JCheckBox();
+ approximateMatching.setModel(filterController.getApproximateMatchingButtonModel());
+ approximateMatching.setToolTipText(TextUtils.getRawText(PROPERTY_FILTER_APPROXIMATE_MATCH_TOOLTIP));
+ LabelAndMnemonicSetter.setLabelAndMnemonic(approximateMatching, TextUtils.getRawText(PROPERTY_FILTER_APPROXIMATE_MATCH));
+ //add(approximateMatching, gridBagConstraints);
+ ignoreCaseAndApproximateMatchingPanel.add(approximateMatching);
+ approximateMatching.setSelected(ResourceController.getResourceController().getBooleanProperty(
+ PROPERTY_FILTER_APPROXIMATE_MATCH));
+ mapChanged(Controller.getCurrentController().getMap());
+
+ add(ignoreCaseAndApproximateMatchingPanel, gridBagConstraints);
+
+ }
+
+ public void focusInputField(final boolean selectAll) {
+ if (values.isEnabled()) {
+ values.requestFocus();
+ final Component editorComponent = values.getEditor().getEditorComponent();
+ if (selectAll && editorComponent instanceof JTextComponent) {
+ ((JTextComponent) editorComponent).selectAll();
+ }
+ return;
+ }
+ }
+
+ public boolean isInputFieldFocused(){
+ if (values.isFocusOwner())
+ return true;
+ if (values.isPopupVisible() || values.getEditor().getEditorComponent().isFocusOwner())
+ return true;
+ return false;
+ }
+
+ public ASelectableCondition getCondition() {
+ ASelectableCondition newCond;
+ Object value;
+ if(values.isEditable()){
+ value = values.getEditor().getItem();
+ }
+ else{
+ value = values.getSelectedItem();
+ }
+ if (value == null) {
+ value = "";
+ }
+ final TranslatedObject simpleCond = (TranslatedObject) elementaryConditions.getSelectedItem();
+ final boolean matchCase = caseSensitive.isSelected();
+ final boolean matchApproximately = approximateMatching.isSelected();
+ ResourceController.getResourceController().setProperty(PROPERTY_FILTER_MATCH_CASE, matchCase);
+ final Object selectedItem = filteredPropertiesComponent.getSelectedItem();
+ newCond = filterController.getConditionFactory().createCondition(selectedItem, simpleCond, value, matchCase, matchApproximately);
+ if (values.isEditable()) {
+ if (!value.equals("")) {
+ DefaultComboBoxModel list = (DefaultComboBoxModel) values.getModel();
+ int indexOfValue = list.getIndexOf(value);
+ if(indexOfValue > 0)
+ list.removeElementAt(indexOfValue);
+ if(indexOfValue == -1 || list.getIndexOf(value) != indexOfValue){
+ values.insertItemAt(value, 0);
+ values.setSelectedIndex(0);
+ }
+ else if(indexOfValue != -1){
+ values.setSelectedIndex(indexOfValue);
+ }
+ if (values.getItemCount() >= 10) {
+ values.removeItemAt(9);
+ }
+ }
+ }
+ return newCond;
+ }
+
+ /**
+ */
+ public void mapChanged(final MapModel newMap) {
+ if (newMap != null) {
+ if (lastMap != null && lastMap.get() == newMap) {
+ return;
+ }
+ filteredPropertiesModel.removeAllElements();
+ final Iterator<IElementaryConditionController> conditionIterator = filterController.getConditionFactory()
+ .conditionIterator();
+ while (conditionIterator.hasNext()) {
+ final IElementaryConditionController next = conditionIterator.next();
+ filteredPropertiesModel.addExtensionList(next.getFilteredProperties());
+ filteredPropertiesModel.setSelectedItem(filteredPropertiesModel.getElementAt(0));
+ }
+ }
+ else {
+ filteredPropertiesComponent.setSelectedIndex(-1);
+ filteredPropertiesModel.setExtensionList(null);
+ }
+ lastMap = new WeakReference<MapModel>(newMap);
+ }
+
+ public void setEnterKeyActionListener(ActionListener enterKeyActionListener) {
+ if (enterKeyActionListener == null)
+ {
+ throw new NullPointerException("null value in setEnterKeyActionListener()!");
+ }
+ if (this.enterKeyActionListener != null)
+ {
+ values.getEditor().removeActionListener(this.enterKeyActionListener);
+ }
+ this.enterKeyActionListener = enterKeyActionListener;
+ values.getEditor().addActionListener(enterKeyActionListener);
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ super.setEnabled(enabled);
+ for(int i = 0; i < getComponentCount(); i++){
+ Component c = getComponent(i);
+ c.setEnabled(enabled);
+ if (c instanceof JComboBox)
+ ((JComboBox)c).getEditor().getEditorComponent().setEnabled(enabled);
+ }
+ }
+
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/FilterController.java b/freeplane/src/main/java/org/freeplane/features/filter/FilterController.java
new file mode 100644
index 0000000..cb2f42b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/FilterController.java
@@ -0,0 +1,657 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.security.AccessControlException;
+import java.util.Vector;
+
+import javax.swing.ButtonModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JToggleButton;
+import javax.swing.JToolBar;
+import javax.swing.SwingConstants;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ButtonModelStateChangeListenerForProperty;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.core.ui.components.FreeplaneToolBar;
+import org.freeplane.core.ui.components.JAutoToggleButton;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.filter.condition.ConditionSnapshotFactory;
+import org.freeplane.features.filter.condition.DefaultConditionRenderer;
+import org.freeplane.features.filter.condition.ICondition;
+import org.freeplane.features.filter.condition.NoFilteringCondition;
+import org.freeplane.features.filter.condition.SelectedViewCondition;
+import org.freeplane.features.map.CloneOfSelectedViewCondition;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapNavigationUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.features.ui.ToggleToolbarAction;
+import org.freeplane.features.ui.UIComponentVisibilityDispatcher;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.n3.nanoxml.IXMLParser;
+import org.freeplane.n3.nanoxml.IXMLReader;
+import org.freeplane.n3.nanoxml.StdXMLReader;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.n3.nanoxml.XMLParserFactory;
+import org.freeplane.n3.nanoxml.XMLWriter;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class FilterController implements IMapSelectionListener, IExtension {
+ public static int TOOLBAR_SIDE = ViewController.TOP;
+ @SuppressWarnings("serial")
+ @SelectableAction(checkOnPopup = true)
+ private class ToggleFilterToolbarAction extends ToggleToolbarAction {
+ private ToggleFilterToolbarAction(String actionName, String toolbarName) {
+ super(actionName, toolbarName);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent event) {
+ final JComponent toolbar = getToolbar();
+ if(toolbar == null)
+ return;
+ final boolean visible = isVisible();
+ if(visible && ! quickEditor.isInputFieldFocused() && (EventQueue.getCurrentEvent() instanceof KeyEvent))
+ quickEditor.focusInputField(true);
+ else {
+ changeFocusWhenVisibilityChanges(toolbar);
+ super.actionPerformed(event);
+ }
+ }
+
+ private void changeFocusWhenVisibilityChanges(final JComponent toolBar) {
+ quickEditor.addAncestorListener(new AncestorListener() {
+ public void ancestorAdded(final AncestorEvent event) {
+ quickEditor.focusInputField(true);
+ quickEditor.removeAncestorListener(this);
+ }
+ public void ancestorMoved(final AncestorEvent event) {
+ }
+ public void ancestorRemoved(final AncestorEvent event) {
+ final Component selectedComponent = Controller.getCurrentController().getMapViewManager().getSelectedComponent();
+ if(selectedComponent != null)
+ selectedComponent.requestFocusInWindow();
+ quickEditor.removeAncestorListener(this);
+ }
+ });
+ }
+ }
+
+ private class FilterChangeListener implements ListDataListener, ChangeListener {
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
+ * )
+ */
+ public FilterChangeListener() {
+ }
+
+ public void contentsChanged(final ListDataEvent e) {
+ if (e.getIndex0() == -1) {
+ applyFilter(false);
+ }
+ }
+
+ public void intervalAdded(final ListDataEvent e) {
+ }
+
+ public void intervalRemoved(final ListDataEvent e) {
+ }
+
+ public void stateChanged(final ChangeEvent e) {
+ applyFilter(false);
+ }
+ }
+
+ static final String FREEPLANE_FILTER_EXTENSION_WITHOUT_DOT = "mmfilter";
+ private static final ASelectableCondition NO_FILTERING = NoFilteringCondition.createCondition();
+
+ public static FilterController getController(Controller controller) {
+ return controller.getExtension(FilterController.class);
+ }
+
+ public static FilterController getCurrentFilterController() {
+ return getController(Controller.getCurrentController());
+ }
+
+ public static void install() {
+ Controller.getCurrentController().addExtension(FilterController.class, new FilterController());
+ }
+
+ private final ButtonModel applyToVisibleNodeOnly;
+ private ConditionFactory conditionFactory;
+ private DefaultConditionRenderer conditionRenderer = null;
+// // private final Controller controller;
+ final private FilterChangeListener filterChangeListener;
+ private DefaultComboBoxModel filterConditions;
+ private final FilterMenuBuilder filterMenuBuilder;
+ private JToolBar filterToolbar;
+ private final FilterHistory history;
+ private Filter inactiveFilter;
+ final private String pathToFilterFile;
+ private ASelectableCondition selectedViewCondition;
+ private ASelectableCondition cloneOfSelectedViewCondition;
+ private final ButtonModel showAncestors;
+ private final ButtonModel approximateMatchingButtonModel;
+ private final ButtonModel caseSensitiveButtonModel;
+ private final ButtonModel showDescendants;
+ private final ButtonModel highlightNodes;
+ private ASelectableCondition highlightCondition;
+ private JComboBox activeFilterConditionComboBox;
+ private final FilterConditionEditor quickEditor;
+ static final int USER_DEFINED_CONDITION_START_INDEX = 3;
+ final private QuickFilterAction quickFilterAction;
+
+ public FilterController() {
+ Controller controller = Controller.getCurrentController();
+ filterMenuBuilder = new FilterMenuBuilder(controller, this);
+ history = new FilterHistory();
+ filterChangeListener = new FilterChangeListener();
+ showAncestors = new JToggleButton.ToggleButtonModel();
+ final Filter transparentFilter = createTransparentFilter();
+ showAncestors.setSelected(transparentFilter.areAncestorsShown());
+ showAncestors.addChangeListener(filterChangeListener);
+ showAncestors.addChangeListener(new ButtonModelStateChangeListenerForProperty("filter.showAncestors"));
+ showDescendants = new JToggleButton.ToggleButtonModel();
+ showDescendants.setSelected(transparentFilter.areDescendantsShown());
+ showDescendants.addChangeListener(filterChangeListener);
+ showDescendants.addChangeListener(new ButtonModelStateChangeListenerForProperty("filter.showDescendants"));
+ highlightNodes = new JToggleButton.ToggleButtonModel();
+ highlightNodes.setSelected(false);
+ applyToVisibleNodeOnly = new JToggleButton.ToggleButtonModel();
+ applyToVisibleNodeOnly.setSelected(false);
+ approximateMatchingButtonModel = new JToggleButton.ToggleButtonModel();
+ approximateMatchingButtonModel.setSelected(false);
+ caseSensitiveButtonModel = new JToggleButton.ToggleButtonModel();
+ caseSensitiveButtonModel.setSelected(false);
+
+ controller.getMapViewManager().addMapSelectionListener(this);
+ final AFreeplaneAction showFilterToolbar = new ToggleFilterToolbarAction("ShowFilterToolbarAction", "/filter_toolbar");
+ quickEditor = new FilterConditionEditor(this, 0, true);
+ quickEditor.setEnterKeyActionListener( new ActionListener() {
+
+ public void actionPerformed(ActionEvent e) {
+ ((QuickFindAction)Controller.getCurrentController().getAction("QuickFindAction.FORWARD")).executeAction(true);
+ if(getHighlightNodes().isSelected()){
+ setHighlightCondition( quickEditor.getCondition());
+ }
+ }
+
+ }
+ );
+ controller.addAction(showFilterToolbar);
+ controller.addAction(new ApplyNoFilteringAction(this));
+ controller.addAction(new ApplySelectedViewConditionAction(this));
+ controller.addAction(new EditFilterAction(this));
+ controller.addAction(new UndoFilterAction(this));
+ controller.addAction(new RedoFilterAction(this));
+ controller.addAction(new ReapplyFilterAction(this));
+ controller.addAction(new ShowAncestorsAction(this));
+ controller.addAction(new ShowDescendantsAction(this));
+ controller.addAction(new ApplyToVisibleAction(this));
+ quickFilterAction = new QuickFilterAction(this, quickEditor);
+ controller.addAction(quickFilterAction);
+ controller.addAction(new QuickFindAction(this, quickEditor, Direction.BACK));
+ controller.addAction(new QuickFindAction(this, quickEditor, Direction.FORWARD));
+ controller.addAction(new QuickFindAllAction(this, quickEditor));
+ controller.addAction(new QuickHighlightAction(this, quickEditor));
+
+ final FindAction find = new FindAction();
+ controller.addAction(find);
+ controller.addAction(find.getFindNextAction());
+ controller.addAction(find.getFindPreviousAction());
+ pathToFilterFile = ResourceController.getResourceController().getFreeplaneUserDirectory() + File.separator
+ + "auto." + FilterController.FREEPLANE_FILTER_EXTENSION_WITHOUT_DOT;
+ }
+
+ private void addStandardConditions() {
+ final ASelectableCondition noFiltering = NO_FILTERING;
+ filterConditions.insertElementAt(noFiltering, 0);
+ if (selectedViewCondition == null) {
+ selectedViewCondition = SelectedViewCondition.CreateCondition();
+ }
+ filterConditions.insertElementAt(selectedViewCondition, 1);
+ if (filterConditions.getSelectedItem() == null) {
+ filterConditions.setSelectedItem(noFiltering);
+ }
+
+ if (cloneOfSelectedViewCondition == null)
+ cloneOfSelectedViewCondition = CloneOfSelectedViewCondition.CreateCondition();
+ filterConditions.insertElementAt(cloneOfSelectedViewCondition, 2);
+ }
+
+ /**
+ */
+ public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
+ if(filterToolbar == null){
+ return;
+ }
+ history.clear();
+ if (newMap != null) {
+ filterToolbar.setEnabled(true);
+ activeFilterConditionComboBox.setEnabled(true);
+ quickEditor.setEnabled(true);
+ quickEditor.mapChanged(newMap);
+ final Filter filter = newMap.getFilter();
+ updateSettingsFromFilter(filter);
+ quickFilterAction.setSelected(isFilterActive());
+
+ }
+ else {
+ filterConditions.setSelectedItem(filterConditions.getElementAt(0));
+ filterToolbar.setEnabled(false);
+ quickEditor.setEnabled(false);
+ activeFilterConditionComboBox.setEnabled(false);
+ }
+ }
+
+ void applyFilter(final boolean force) {
+ quickFilterAction.setSelected(isFilterActive());
+ final ASelectableCondition selectedCondition = getSelectedCondition();
+ final Filter filter = createFilter(selectedCondition);
+ final ICondition condition = condition(filter);
+ if(condition != selectedCondition && condition instanceof ASelectableCondition)
+ getFilterConditions().setSelectedItem(condition);
+ else
+ applyFilter(filter, Controller.getCurrentController().getMap(), force);
+ }
+
+ public void applyFilter(final Filter filter, MapModel map, final boolean force) {
+ filter.applyFilter(this, map, force);
+ history.add(filter);
+ }
+
+ public void applyNoFiltering() {
+ getFilterConditions().setSelectedItem(NO_FILTERING);
+ }
+
+ void applySelectedViewCondition() {
+ if (getFilterConditions().getSelectedItem() != selectedViewCondition) {
+ getFilterConditions().setSelectedItem(selectedViewCondition);
+ }
+ else {
+ applyFilter(true);
+ }
+ }
+
+ public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
+ }
+
+ private Filter createFilter(final ASelectableCondition selectedCondition) {
+
+ final ASelectableCondition filterCondition;
+ if (selectedCondition == null || selectedCondition.equals(NO_FILTERING)) {
+ filterCondition = null;
+ }
+ else if (selectedCondition instanceof ConditionSnapshotFactory) {
+ filterCondition = ((ConditionSnapshotFactory)selectedCondition).createSnapshotCondition();
+ }
+ else {
+ filterCondition = selectedCondition;
+ }
+ final Filter filter = new Filter(filterCondition, showAncestors.isSelected(), showDescendants
+ .isSelected(), applyToVisibleNodeOnly.isSelected());
+ return filter;
+ }
+
+ private JToolBar createFilterToolbar() {
+ final JToolBar filterToolbar = new FreeplaneToolBar("filter_toolbar", SwingConstants.HORIZONTAL);
+ filterToolbar.setVisible(ResourceController.getResourceController()
+ .getBooleanProperty("filter_toolbar_visible"));
+ Controller controller = Controller.getCurrentController();
+ FrameController frameController = (FrameController) controller.getViewController();
+ UIComponentVisibilityDispatcher.install(frameController, filterToolbar, "filter_toolbar_visible");
+ final JButton undoBtn = new JButton(controller.getAction("UndoFilterAction"));
+ final JButton redoBtn = new JButton(controller.getAction("RedoFilterAction"));
+ final JToggleButton showAncestorsBox = new JAutoToggleButton(controller.getAction("ShowAncestorsAction"),
+ showAncestors);
+ showAncestorsBox.setSelected(showAncestors.isSelected());
+ final JToggleButton showDescendantsBox = new JAutoToggleButton(controller.getAction("ShowDescendantsAction"),
+ showDescendants);
+ final JToggleButton applyToVisibleBox = new JAutoToggleButton(controller.getAction("ApplyToVisibleAction"),
+ applyToVisibleNodeOnly);
+ final JButton btnEdit = new JButton(controller.getAction("EditFilterAction"));
+ activeFilterConditionComboBox = new JComboBoxWithBorder(getFilterConditions());
+ final JButton applyBtn = new JButton(controller.getAction("ReapplyFilterAction"));
+ final JButton filterSelectedBtn = new JButton(controller.getAction("ApplySelectedViewConditionAction"));
+ final JButton noFilteringBtn = new JButton(controller.getAction("ApplyNoFilteringAction"));
+ final JButton applyFindPreviousBtn = new JButton(controller.getAction("QuickFindAction.BACK"));
+ final JButton applyFindNextBtn = new JButton(controller.getAction("QuickFindAction.FORWARD"));
+ final JAutoToggleButton applyQuickFilterBtn = new JAutoToggleButton(controller.getAction("QuickFilterAction"));
+ final JButton applyQuickSelectBtn = new JButton(controller.getAction("QuickFindAllAction"));
+ final JToggleButton applyQuickHighlightBtn = new JAutoToggleButton(controller.getAction("QuickHighlightAction"));
+
+ filterToolbar.addSeparator();
+ filterToolbar.add(undoBtn);
+ filterToolbar.add(redoBtn);
+ filterToolbar.add(showAncestorsBox);
+ filterToolbar.add(showDescendantsBox);
+ filterToolbar.add(applyToVisibleBox);
+ filterToolbar.add(activeFilterConditionComboBox);
+ filterToolbar.add(applyBtn);
+ filterToolbar.add(filterSelectedBtn);
+ filterToolbar.add(noFilteringBtn);
+ filterToolbar.add(btnEdit);
+ filterToolbar.addSeparator();
+ filterToolbar.add(quickEditor);
+ filterToolbar.add(applyFindPreviousBtn);
+ filterToolbar.add(applyFindNextBtn);
+ filterToolbar.add(applyQuickSelectBtn);
+ filterToolbar.add(applyQuickFilterBtn);
+ filterToolbar.add(applyQuickHighlightBtn);
+ final DefaultConditionRenderer toolbarConditionRenderer = new DefaultConditionRenderer(TextUtils.getText("filter_no_filtering"), false);
+ activeFilterConditionComboBox.setRenderer(toolbarConditionRenderer);
+ return filterToolbar;
+ }
+
+ public Filter createTransparentFilter() {
+ if (inactiveFilter == null) {
+ inactiveFilter = Filter.createTransparentFilter();
+ }
+ return inactiveFilter;
+ }
+
+ protected ButtonModel getApplyToVisibleNodeOnly() {
+ return applyToVisibleNodeOnly;
+ }
+
+ public ConditionFactory getConditionFactory() {
+ if (conditionFactory == null) {
+ conditionFactory = new ConditionFactory();
+ }
+ return conditionFactory;
+ }
+
+ DefaultConditionRenderer getConditionRenderer() {
+ if (conditionRenderer == null) {
+ conditionRenderer = new DefaultConditionRenderer(TextUtils.getText("filter_no_filtering"), true);
+ }
+ return conditionRenderer;
+ }
+
+ public DefaultComboBoxModel getFilterConditions() {
+ if (filterConditions == null) {
+ initConditions();
+ }
+ return filterConditions;
+ }
+
+ /**
+ */
+ public JToolBar getFilterToolbar() {
+ if (filterToolbar == null) {
+ filterToolbar = createFilterToolbar();
+ }
+ return filterToolbar;
+ }
+
+ public FilterHistory getHistory() {
+ return history;
+ }
+
+ ASelectableCondition getSelectedCondition() {
+ return (ASelectableCondition) getFilterConditions().getSelectedItem();
+ }
+
+ public ButtonModel getShowAncestors() {
+ return showAncestors;
+ }
+
+ public ButtonModel getShowDescendants() {
+ return showDescendants;
+ }
+
+ public ButtonModel getHighlightNodes() {
+ return highlightNodes;
+ }
+
+ public ASelectableCondition getHighlightCondition() {
+ return highlightCondition;
+ }
+
+ void setHighlightCondition(final ASelectableCondition condition) {
+ if(condition != null){
+ this.highlightCondition = condition;
+ getHighlightNodes().setSelected(true);
+ }
+ else{
+ this.highlightCondition = null;
+ }
+ final Component mapViewComponent = Controller.getCurrentController().getMapViewManager().getMapViewComponent();
+ if(mapViewComponent != null)
+ mapViewComponent.repaint();
+ }
+
+ private void initConditions() {
+ filterConditions = new DefaultComboBoxModel();
+ addStandardConditions();
+ filterConditions.setSelectedItem(filterConditions.getElementAt(0));
+ filterConditions.addListDataListener(filterChangeListener);
+ }
+
+ public void loadDefaultConditions() {
+ try {
+ loadConditions(getFilterConditions(), pathToFilterFile, false);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ void loadConditions(final DefaultComboBoxModel filterConditionModel, final String pathToFilterFile,
+ final boolean showPopupOnError)
+ throws IOException {
+ try {
+ final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
+ File filterFile = new File(pathToFilterFile);
+ final IXMLReader reader = new StdXMLReader(new BufferedInputStream(new FileInputStream(filterFile)));
+ parser.setReader(reader);
+ reader.setSystemID(filterFile.toURL().toString());
+ final XMLElement loader = (XMLElement) parser.parse();
+ final Vector<XMLElement> conditions = loader.getChildren();
+ for (int i = 0; i < conditions.size(); i++) {
+ final ASelectableCondition condition = getConditionFactory().loadCondition(conditions.get(i));
+ if(condition != null){
+ filterConditionModel.addElement(condition);
+ }
+ }
+ }
+ catch (final FileNotFoundException e) {
+ }
+ catch (final AccessControlException e) {
+ }
+ catch (final Exception e) {
+ LogUtils.warn(e);
+ if (showPopupOnError) {
+ UITools.errorMessage(TextUtils.getText("filters_not_loaded"));
+ }
+ }
+ }
+
+ public void saveConditions() {
+ try {
+ saveConditions(getFilterConditions(), pathToFilterFile);
+ }
+ catch (final Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+
+ void saveConditions(final DefaultComboBoxModel filterConditionModel, final String pathToFilterFile)
+ throws IOException {
+ final XMLElement saver = new XMLElement();
+ saver.setName("filter_conditions");
+ final Writer writer = new FileWriter(pathToFilterFile);
+ for (int i = 0; i < filterConditionModel.getSize(); i++) {
+ final ASelectableCondition cond = (ASelectableCondition) filterConditionModel.getElementAt(i);
+ if (cond != null && !(cond instanceof NoFilteringCondition)) {
+ cond.toXml(saver);
+ }
+ }
+ final XMLWriter xmlWriter = new XMLWriter(writer);
+ xmlWriter.write(saver, true);
+ writer.close();
+ }
+
+ void setFilterConditions(final DefaultComboBoxModel newConditionModel) {
+ filterConditions.removeListDataListener(filterChangeListener);
+ filterConditions.removeAllElements();
+ for (int i = 0; i < newConditionModel.getSize(); i++) {
+ filterConditions.addElement(newConditionModel.getElementAt(i));
+ }
+ filterConditions.setSelectedItem(newConditionModel.getSelectedItem());
+ addStandardConditions();
+ filterConditions.addListDataListener(filterChangeListener);
+ applyFilter(false);
+ filterMenuBuilder.updateMenus();
+ }
+
+ private void updateSettingsFromFilter(final Filter filter) {
+ getFilterConditions().removeListDataListener(filterChangeListener);
+ showAncestors.removeChangeListener(filterChangeListener);
+ showDescendants.removeChangeListener(filterChangeListener);
+ filterConditions.setSelectedItem(condition(filter));
+ showAncestors.setSelected(filter.areAncestorsShown());
+ showDescendants.setSelected(filter.areDescendantsShown());
+ applyToVisibleNodeOnly.setSelected(filter.appliesToVisibleNodesOnly());
+ filterConditions.addListDataListener(filterChangeListener);
+ showAncestors.addChangeListener(filterChangeListener);
+ showDescendants.addChangeListener(filterChangeListener);
+ quickFilterAction.setSelected(isFilterActive());
+ }
+
+ private ICondition condition(final Filter filter) {
+ final ICondition condition = filter.getCondition();
+ if (condition == null)
+ return NO_FILTERING;
+ else
+ return condition;
+ }
+
+ void updateSettingsFromHistory() {
+ final Filter filter = history.getCurrentFilter();
+ updateSettingsFromFilter(filter);
+ }
+
+ NodeModel findNext(final NodeModel from, final NodeModel end, final Direction direction,
+ final ASelectableCondition condition) {
+ NodeModel next = from;
+ for (;;) {
+ do {
+ switch (direction) {
+ case FORWARD:
+ case FORWARD_N_FOLD:
+ next = MapNavigationUtils.findNext(direction, next, end);
+ break;
+ case BACK:
+ case BACK_N_FOLD:
+ next = MapNavigationUtils.findPrevious(direction, next, end);
+ break;
+ }
+ if (next == null) {
+ return null;
+ }
+ } while (!next.hasVisibleContent());
+ if (next == from) {
+ break;
+ }
+ if (condition == null || condition.checkNode(next)) {
+ return next;
+ }
+ }
+ return null;
+ }
+
+ public void redo() {
+ history.redo();
+ updateSettingsFromHistory();
+ }
+
+ public void undo() {
+ history.undo();
+ updateSettingsFromHistory();
+ }
+
+ public boolean isNodeHighlighted(NodeModel node) {
+ return highlightCondition != null && highlightCondition.checkNode(node);
+ }
+
+ public ButtonModel getApproximateMatchingButtonModel() {
+ return approximateMatchingButtonModel;
+ }
+
+ public ButtonModel getCaseSensitiveButtonModel() {
+ return caseSensitiveButtonModel;
+ }
+
+ public void apply(ASelectableCondition condition) {
+ final DefaultComboBoxModel filterConditions = getFilterConditions();
+ if(condition.equals(filterConditions.getSelectedItem()))
+ applyFilter(true);
+ else
+ filterConditions.setSelectedItem(condition);
+ }
+
+ public EntryVisitor getMenuBuilder() {
+ return filterMenuBuilder;
+ }
+
+ public boolean isFilterActive() {
+ final ASelectableCondition selectedCondition = getSelectedCondition();
+ return NO_FILTERING != selectedCondition && null != selectedCondition;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/FilterHistory.java b/freeplane/src/main/java/org/freeplane/features/filter/FilterHistory.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/FilterHistory.java
rename to freeplane/src/main/java/org/freeplane/features/filter/FilterHistory.java
diff --git a/freeplane/src/org/freeplane/features/filter/FilterInfo.java b/freeplane/src/main/java/org/freeplane/features/filter/FilterInfo.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/FilterInfo.java
rename to freeplane/src/main/java/org/freeplane/features/filter/FilterInfo.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/FilterMenuBuilder.java b/freeplane/src/main/java/org/freeplane/features/filter/FilterMenuBuilder.java
new file mode 100644
index 0000000..e49d7f6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/FilterMenuBuilder.java
@@ -0,0 +1,69 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import java.util.HashSet;
+
+import javax.swing.DefaultComboBoxModel;
+
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * 23.03.2013
+ */
+public class FilterMenuBuilder implements EntryVisitor {
+ private final FilterController filterController;
+ private final Controller controller;
+ FilterMenuBuilder(Controller controller, FilterController filterController){
+ this.controller = controller;
+ this.filterController = filterController;
+ }
+ @Override
+ public void visit(Entry target) {
+ final DefaultComboBoxModel filterConditions = filterController.getFilterConditions();
+ final HashSet<String> usedNames = new HashSet<String>();
+ for(int i = 0; i < filterConditions.getSize(); i++){
+ final ASelectableCondition condition = (ASelectableCondition) filterConditions.getElementAt(i);
+ final String conditionName = condition.getUserName();
+ if(conditionName != null && usedNames.add(conditionName)){
+ final ApplyNamedFilterAction action = new ApplyNamedFilterAction(filterController, condition);
+ controller.addActionIfNotAlreadySet(action);
+ new EntryAccessor().addChildAction(target, action);
+ }
+ }
+
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+
+ public void updateMenus() {
+ final IUserInputListenerFactory userInputListenerFactory = Controller.getCurrentModeController().getUserInputListenerFactory();
+ userInputListenerFactory.rebuildMenus("filterConditions");
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/FindAction.java b/freeplane/src/main/java/org/freeplane/features/filter/FindAction.java
new file mode 100644
index 0000000..76b9b46
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/FindAction.java
@@ -0,0 +1,191 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowFocusListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ICondition;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+class FindAction extends AFreeplaneAction {
+ static final String KEY = "FindAction";
+ private static final long serialVersionUID = 1L;
+ private FilterConditionEditor editor;
+ final private FindNextAction findNextAction;
+ final private AFreeplaneAction findPreviousAction;
+
+ public FindAction() {
+ super(KEY);
+ findNextAction = new FindNextAction();
+ findPreviousAction = new FindPreviousAction();
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ if (selection == null) {
+ return;
+ }
+ final NodeModel start = selection.getSelected();
+ if (editor == null) {
+ editor = new FilterConditionEditor(FilterController.getCurrentFilterController());
+ editor.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(5, 0, 5, 0)));
+
+ }
+ else {
+ editor.mapChanged(start.getMap());
+ }
+ editor.addAncestorListener(new AncestorListener() {
+ public void ancestorAdded(final AncestorEvent event) {
+ final Component component = event.getComponent();
+ final Window windowAncestor = SwingUtilities.getWindowAncestor(component);
+ if(windowAncestor.isFocused())
+ editor.focusInputField(true);
+ else{
+ windowAncestor.addWindowFocusListener(new WindowFocusListener() {
+ public void windowLostFocus(WindowEvent e) {
+ }
+
+ public void windowGainedFocus(WindowEvent e) {
+ windowAncestor.removeWindowFocusListener(this);
+ editor.focusInputField(true);
+ }
+ });
+ windowAncestor.toFront();
+ }
+ editor.removeAncestorListener(this);
+ }
+
+ public void ancestorMoved(final AncestorEvent event) {
+ }
+
+ public void ancestorRemoved(final AncestorEvent event) {
+ }
+ });
+ final int run = UITools.showConfirmDialog(start, editor, TextUtils.getText("FindAction.text"),
+ JOptionPane.OK_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);
+ final Container parent = editor.getParent();
+ if (parent != null) {
+ parent.remove(editor);
+ }
+ if (run != JOptionPane.OK_OPTION) {
+ return;
+ }
+ final ASelectableCondition condition = editor.getCondition();
+ findFirst(condition);
+ }
+
+ void findFirst(final ASelectableCondition condition) {
+ final FoundNodes info = FoundNodes.get(Controller.getCurrentController().getMap());
+ info.condition = condition;
+ if (info.condition == null) {
+ return;
+ }
+ info.rootID = Controller.getCurrentController().getSelection().getSelected().createID();
+ findNext(Direction.FORWARD);
+ }
+
+ void findNext(Direction direction) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final FoundNodes info = FoundNodes.get(map);
+ if (info.condition == null) {
+ displayNoPreviousFindMessage();
+ return;
+ }
+ final FilterController filterController = FilterController.getCurrentFilterController();
+ final NodeModel start = Controller.getCurrentController().getSelection().getSelected();
+ final NodeModel root = map.getNodeForID(info.rootID);
+ if (root == null) {
+ info.condition = null;
+ displayNoPreviousFindMessage();
+ return;
+ }
+ final NodeModel next = filterController.findNext(start, null, direction, info.condition);
+ if (next == null) {
+ displayNotFoundMessage(root, info.condition);
+ return;
+ }
+ info.displayFoundNode(next);
+ }
+
+ private void displayNoPreviousFindMessage() {
+ UITools.informationMessage(Controller.getCurrentController().getViewController().getCurrentRootComponent(), TextUtils
+ .getText("no_previous_find"));
+ }
+
+ private void displayNotFoundMessage(final NodeModel start, final ICondition condition) {
+ final String message = TextUtils.format("no_more_found_from", condition.toString(), getFindFromText(start));
+ UITools.informationMessage(Controller.getCurrentController().getViewController().getCurrentRootComponent(), message);
+ }
+
+ public String getFindFromText(final NodeModel node) {
+ final String plainNodeText = node.toString().replaceAll("\n", " ");
+ return plainNodeText.length() <= 30 ? plainNodeText : plainNodeText.substring(0, 30) + "...";
+ }
+
+ public AFreeplaneAction getFindNextAction() {
+ return findNextAction;
+ }
+
+ public AFreeplaneAction getFindPreviousAction() {
+ return findPreviousAction;
+ }
+
+ @SuppressWarnings("serial")
+ private class FindNextAction extends AFreeplaneAction{
+ FindNextAction() {
+ super("FindNextAction");
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ findNext(Direction.FORWARD);
+ }
+ }
+ @SuppressWarnings("serial")
+ private class FindPreviousAction extends AFreeplaneAction{
+ FindPreviousAction() {
+ super("FindPreviousAction");
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ findNext(Direction.BACK);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/FoundNodes.java b/freeplane/src/main/java/org/freeplane/features/filter/FoundNodes.java
new file mode 100644
index 0000000..519221d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/FoundNodes.java
@@ -0,0 +1,60 @@
+package org.freeplane.features.filter;
+
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+class FoundNodes implements IExtension {
+ String rootID;
+ final LinkedList<String> nodesUnfoldedByDisplay = new LinkedList<String>();
+ ASelectableCondition condition;
+
+ static FoundNodes get(final MapModel map) {
+ if (map == null) {
+ return null;
+ }
+ FoundNodes nodes = (FoundNodes) map.getExtension(FoundNodes.class);
+ if (nodes == null) {
+ nodes = new FoundNodes();
+ map.addExtension(nodes);
+ }
+ return nodes;
+ }
+
+ /**
+ * Display a node in the display (used by find and the goto action by arrow
+ * link actions).
+ */
+ void displayFoundNode(final NodeModel node) {
+ final MapModel map = node.getMap();
+ final LinkedList<String> nodesUnfoldedByDisplay = new LinkedList<String>();
+ NodeModel nodeOnPath = null;
+ for (nodeOnPath = node; nodeOnPath != null && !this.nodesUnfoldedByDisplay.contains(nodeOnPath.createID()); nodeOnPath = nodeOnPath
+ .getParentNode()) {
+ if (Controller.getCurrentModeController().getMapController().isFolded(nodeOnPath)) {
+ nodesUnfoldedByDisplay.add(nodeOnPath.createID());
+ }
+ }
+ final ListIterator<String> oldPathIterator = this.nodesUnfoldedByDisplay
+ .listIterator(this.nodesUnfoldedByDisplay.size());
+ while (oldPathIterator.hasPrevious()) {
+ final String oldPathNodeID = oldPathIterator.previous();
+ final NodeModel oldPathNode = map.getNodeForID(oldPathNodeID);
+ if (oldPathNode != null && oldPathNode.equals(nodeOnPath)) {
+ break;
+ }
+ oldPathIterator.remove();
+ if (oldPathNode != null) {
+ Controller.getCurrentModeController().getMapController().setFolded(oldPathNode, true);
+ }
+ }
+ this.nodesUnfoldedByDisplay.addAll(nodesUnfoldedByDisplay);
+ Controller.getCurrentModeController().getMapController().select(node);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/filter/NextNodeAction.java b/freeplane/src/main/java/org/freeplane/features/filter/NextNodeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/NextNodeAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/NextNodeAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/NextPresentationItemAction.java b/freeplane/src/main/java/org/freeplane/features/filter/NextPresentationItemAction.java
new file mode 100644
index 0000000..6c67b08
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/NextPresentationItemAction.java
@@ -0,0 +1,45 @@
+package org.freeplane.features.filter;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.HideChildSubtree;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.mode.Controller;
+
+public class NextPresentationItemAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NextPresentationItemAction() {
+ super("NextPresentationItemAction");
+ }
+
+ /**
+ *
+ */
+ public void actionPerformed(final ActionEvent e) {
+ final FilterController filterController = FilterController.getCurrentFilterController();
+ final NodeModel start = Controller.getCurrentController().getSelection().getSelected();
+ final NodeModel next = filterController.findNext(start, null, Direction.FORWARD_N_FOLD, null);
+ if(next != null){
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ if (!next.hasVisibleContent()) {
+ next.getFilterInfo().reset();
+ mapController.nodeRefresh(next);
+ }
+ final NodeModel[] path = next.getPathToRoot();
+ for (int i = 1; i < path.length; i++) {
+ final NodeModel nodeOnPath = path[i];
+ final NodeModel parentNode = nodeOnPath.getParentNode();
+ while(parentNode.isFolded() || nodeOnPath.containsExtension(HideChildSubtree.class))
+ mapController.showNextChild(parentNode);
+ }
+ Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(next);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/PseudoDamerauLevenshtein.java b/freeplane/src/main/java/org/freeplane/features/filter/PseudoDamerauLevenshtein.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/PseudoDamerauLevenshtein.java
rename to freeplane/src/main/java/org/freeplane/features/filter/PseudoDamerauLevenshtein.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/QuickFilterAction.java b/freeplane/src/main/java/org/freeplane/features/filter/QuickFilterAction.java
new file mode 100644
index 0000000..f5b742e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/QuickFilterAction.java
@@ -0,0 +1,66 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 30, 2009
+ */
+ at SelectableAction
+final class QuickFilterAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterController filterController;
+ private final FilterConditionEditor filterEditor;
+
+ /**
+ * @param filterController
+ * @param quickEditor
+ */
+ QuickFilterAction(final FilterController filterController, FilterConditionEditor quickEditor) {
+ super("QuickFilterAction");
+ this.filterController = filterController;
+ this.filterEditor = quickEditor;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ASelectableCondition condition = filterEditor.getCondition();
+ if(condition == null){
+ return;
+ }
+ if (condition.equals(filterController.getSelectedCondition()))
+ filterController.applyNoFiltering();
+ else {
+ setSelected(false);
+ filterController.apply(condition);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/QuickFindAction.java b/freeplane/src/main/java/org/freeplane/features/filter/QuickFindAction.java
new file mode 100644
index 0000000..e3771bd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/QuickFindAction.java
@@ -0,0 +1,99 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 30, 2009
+ */
+final class QuickFindAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final FilterConditionEditor filterEditor;
+ private final FilterController filterController;
+ private final Direction direction;
+
+
+ /**
+ * @param filterController
+ * @param quickEditor
+ */
+ QuickFindAction(final FilterController filterController, FilterConditionEditor quickEditor, final Direction direction) {
+ super("QuickFindAction." + direction);
+ this.filterController = filterController;
+ this.filterEditor = quickEditor;
+ this.direction =direction ;
+ }
+
+ public void executeAction(final boolean reFocusSearchInputField)
+ {
+ final ASelectableCondition condition = filterEditor.getCondition();
+ if(condition == null){
+ return;
+ }
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ if(selection == null){
+ return;
+ }
+ final NodeModel selected = selection.getSelected();
+
+ final NodeModel next;
+ try
+ {
+ filterEditor.setSearchingBusyCursor();
+ next = filterController.findNext(selected, null, direction, condition);
+ }
+ finally
+ {
+ filterEditor.setSearchingDefaultCursor();
+ }
+
+ if(next != null){
+ FoundNodes.get(next.getMap()).displayFoundNode(next);
+
+ if (reFocusSearchInputField)
+ {
+ // this is called by Enter key listener in FilterConditionEditor
+ // => we want to re-focus the search term input field so that one can hit enter
+ // again to find the next search result!
+ filterEditor.focusInputField(false);
+ }
+ }
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ executeAction(false);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/QuickFindAllAction.java b/freeplane/src/main/java/org/freeplane/features/filter/QuickFindAllAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/QuickFindAllAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/QuickFindAllAction.java
diff --git a/freeplane/src/org/freeplane/features/filter/QuickHighlightAction.java b/freeplane/src/main/java/org/freeplane/features/filter/QuickHighlightAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/QuickHighlightAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/QuickHighlightAction.java
diff --git a/freeplane/src/org/freeplane/features/filter/ReapplyFilterAction.java b/freeplane/src/main/java/org/freeplane/features/filter/ReapplyFilterAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/ReapplyFilterAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/ReapplyFilterAction.java
diff --git a/freeplane/src/org/freeplane/features/filter/RedoFilterAction.java b/freeplane/src/main/java/org/freeplane/features/filter/RedoFilterAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/RedoFilterAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/RedoFilterAction.java
diff --git a/freeplane/src/org/freeplane/features/filter/ShowAncestorsAction.java b/freeplane/src/main/java/org/freeplane/features/filter/ShowAncestorsAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/ShowAncestorsAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/ShowAncestorsAction.java
diff --git a/freeplane/src/org/freeplane/features/filter/ShowDescendantsAction.java b/freeplane/src/main/java/org/freeplane/features/filter/ShowDescendantsAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/ShowDescendantsAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/ShowDescendantsAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/StringMatchingStrategy.java b/freeplane/src/main/java/org/freeplane/features/filter/StringMatchingStrategy.java
new file mode 100644
index 0000000..6d53acc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/StringMatchingStrategy.java
@@ -0,0 +1,43 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry Polivaev
+ *
+ * This file author is Felix Natter
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter;
+
+import org.freeplane.core.resources.ResourceController;
+
+public interface StringMatchingStrategy {
+
+ double APPROXIMATE_MATCHING_MINPROB = ResourceController.getResourceController().getDoubleProperty("approximate_search_threshold");
+
+ static final StringMatchingStrategy DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY = new PseudoDamerauLevenshtein();
+ static final StringMatchingStrategy EXACT_STRING_MATCHING_STRATEGY = new ExactStringMatchingStrategy();
+
+ /**
+ * Check for a match between a search term and a text.
+ *
+ * @param searchTerm the text to search for
+ * @param searchText the text to search in
+ * @param subStringMatch whether to for substring instead of equality
+ * @param caseSensitive whether to honor case
+ * @return whether the configuration results in a match
+ */
+ boolean matches(final String searchTerm, final String searchText, final boolean subStringMatch,
+ final boolean caseSensitive);
+
+}
diff --git a/freeplane/src/org/freeplane/features/filter/UndoFilterAction.java b/freeplane/src/main/java/org/freeplane/features/filter/UndoFilterAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/UndoFilterAction.java
rename to freeplane/src/main/java/org/freeplane/features/filter/UndoFilterAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/condition/ASelectableCondition.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/ASelectableCondition.java
new file mode 100644
index 0000000..baa608f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/condition/ASelectableCondition.java
@@ -0,0 +1,132 @@
+package org.freeplane.features.filter.condition;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedExceptionAction;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+
+import org.freeplane.n3.nanoxml.XMLElement;
+
+
+public abstract class ASelectableCondition implements ICondition{
+ public static final float STRING_MIN_MATCH_PROB = 0.7F;
+ transient private String description;
+ transient private JComponent renderer;
+ private String userName;
+ private static Method EQUALS;
+ private static Method HASH;
+ static{
+ try{
+ final ClassLoader classLoader = ASelectableCondition.class.getClassLoader();
+ EQUALS = classLoader.loadClass("org.apache.commons.lang.builder.EqualsBuilder").getMethod("reflectionEquals", Object.class, Object.class);
+ HASH = classLoader.loadClass("org.apache.commons.lang.builder.HashCodeBuilder").getMethod("reflectionHashCode", Object.class);
+ }
+ catch(Exception e){
+
+ }
+ }
+
+ public ASelectableCondition() {
+ super();
+ }
+
+ @Override
+ public int hashCode() {
+ if(HASH == null){
+ return super.hashCode();
+ }
+ try {
+ return (Integer) HASH.invoke(null, this);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ return super.hashCode();
+ }
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if(EQUALS == null){
+ return super.equals(obj);
+ }
+ try {
+ return AccessController.doPrivileged(new PrivilegedExceptionAction<Boolean>() {
+ @Override
+ public Boolean run()
+ throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+ return (Boolean) EQUALS.invoke(null, ASelectableCondition.this, obj);
+ }
+ }).booleanValue();
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ return super.equals(obj);
+ }
+ }
+ protected abstract String createDescription();
+
+ final public JComponent getListCellRendererComponent() {
+ if (renderer == null) {
+ renderer = createRendererComponent();
+ if(userName != null){
+ final JCondition jCondition = new JCondition();
+ jCondition.add(new JLabel(userName + " : "));
+ jCondition.add(renderer);
+ renderer = jCondition;
+ }
+ }
+ return renderer;
+ }
+
+ protected JComponent createRendererComponent() {
+ return ConditionFactory.createCellRendererComponent(toString());
+ }
+
+ @Override
+ final public String toString() {
+ if (description == null) {
+ description = createDescription();
+ }
+ return description;
+ }
+
+ public void toXml(final XMLElement element) {
+ final XMLElement child = new XMLElement();
+ child.setName(getName());
+ if(userName != null){
+ child.setAttribute("user_name", userName);
+ }
+ fillXML(child);
+ element.addChild(child);
+ }
+
+ protected void fillXML(XMLElement element){}
+
+ abstract protected String getName();
+
+
+ public void setUserName(String userName) {
+ if(userName == this.userName || userName != null && userName.equals(this.userName))
+ return;
+ this.userName = userName;
+ renderer = null;
+ }
+
+
+ public String getUserName() {
+ return userName;
+ }
+
+
+ protected JComponent createShortRendererComponent() {
+ if(userName == null){
+ return createRendererComponent();
+ }
+ final JLabel label = new JLabel('"' + userName + '"');
+ return label;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/condition/CompareConditionAdapter.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/CompareConditionAdapter.java
new file mode 100644
index 0000000..9690cee
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/condition/CompareConditionAdapter.java
@@ -0,0 +1,214 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter.condition;
+
+import java.util.Date;
+
+import org.freeplane.core.io.xml.TreeXmlWriter;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.TypeReference;
+import org.freeplane.features.filter.StringMatchingStrategy;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.FormattedNumber;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * Adapter for Conditions which compare values (</<=/>/>=/=/!=)
+ *
+ * @author ?
+ *
+ */
+abstract public class CompareConditionAdapter extends ASelectableCondition {
+ public static final String OBJECT = "OBJECT";
+ public static final String MATCH_CASE = "MATCH_CASE";
+ public static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
+ public static final String VALUE = "VALUE";
+ private Comparable<?> conditionValue;
+ final private boolean matchCase;
+ final protected boolean matchApproximately;
+ final StringMatchingStrategy stringMatchingStrategy;
+ private int comparisonResult;
+ private boolean error;
+
+ abstract public boolean isEqualityCondition();
+
+ @SuppressWarnings("deprecation")
+ protected CompareConditionAdapter(final Object value, final boolean matchCase, final boolean matchApproximately) {
+ super();
+ this.matchCase = matchCase;
+ this.matchApproximately = matchApproximately;
+ stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ final ResourceController resourceController = ResourceController.getResourceController();
+ if(value instanceof String && resourceController.getBooleanProperty("compare_as_number") && TextUtils.isNumber((String) value)) {
+ Number number = TextUtils.toNumber((String) value);
+ if(number instanceof Comparable<?>){
+ conditionValue = (Comparable<?>) number;
+ }
+ return;
+ }
+ if(value instanceof FormattedNumber){
+ conditionValue = (FormattedNumber)value;
+ return;
+ }
+
+ if(value instanceof FormattedDate){
+ final FormattedDate date = (FormattedDate) value;
+ if(date.containsTime() ||
+ date.getHours() == 0 && date.getMinutes() == 0 && date.getSeconds() == 0) {
+ conditionValue = date;
+ }
+ else{
+ final Date reducedDate = new Date(date.getYear(), date.getMonth(), date.getDate());
+ conditionValue = new FormattedDate(reducedDate.getTime(), date.getDateFormat());
+ }
+ return;
+ }
+ conditionValue = value.toString();
+
+ }
+
+ protected CompareConditionAdapter(final Double value) {
+ super();
+ this.matchCase = false;
+ this.matchApproximately = false;
+ conditionValue = value;
+ stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ }
+
+ protected CompareConditionAdapter(final Long value) {
+ super();
+ this.matchCase = false;
+ this.matchApproximately = false;
+ conditionValue = value;
+ stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ }
+
+ @Override
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ if(conditionValue instanceof IFormattedObject){
+ child.setAttribute(OBJECT, TypeReference.toSpec(conditionValue));
+ }
+ else
+ child.setAttribute(CompareConditionAdapter.VALUE, conditionValue.toString());
+ child.setAttribute(CompareConditionAdapter.MATCH_CASE, TreeXmlWriter.BooleanToXml(matchCase));
+ child.setAttribute(CompareConditionAdapter.MATCH_APPROXIMATELY, TreeXmlWriter.BooleanToXml(matchApproximately));
+ }
+
+ protected void compareTo(final Object transformedContent){
+ error = false;
+ comparisonResult = Integer.signum(compareToData(transformedContent));
+ }
+
+ private int compareToData(final Object transformedContent) {
+ if (conditionValue instanceof FormattedNumber && transformedContent instanceof Number){
+ return -((FormattedNumber)conditionValue).compareTo((Number)transformedContent);
+ }
+ if (conditionValue instanceof Number && transformedContent instanceof String) {
+ try {
+ Number number = TextUtils.toNumber((String)transformedContent);
+ if (conditionValue instanceof FormattedNumber){
+ return -((FormattedNumber)conditionValue).compareTo(number);
+ }
+ if(number instanceof Long)
+ return compareTo((Long)number);
+ if(number instanceof Double)
+ return compareTo((Double)number);
+ }
+ catch (final NumberFormatException fne) {
+ };
+ error = true;
+ return 0;
+ }
+ if (conditionValue instanceof FormattedDate) {
+ if (transformedContent instanceof Date) {
+ return compareTo((Date)transformedContent);
+ }
+ error = true;
+ return 0;
+ }
+
+ final String valueAsString = conditionValue.toString();
+ final String text = transformedContent.toString();
+ if (isEqualityCondition())
+ {
+ return stringMatchingStrategy.matches(valueAsString, text, false, matchCase) ? 0 : -1;
+ }
+ else
+ {
+ return matchCase ? text.compareTo(valueAsString) : text.compareToIgnoreCase(valueAsString);
+ }
+ }
+
+ protected int getComparisonResult() {
+ return comparisonResult;
+ }
+
+ protected boolean isComparisonOK() {
+ return ! error;
+ }
+
+ private int compareTo(final Double value) {
+ return value.compareTo(((Number) conditionValue).doubleValue());
+ }
+
+ protected int compareTo(final Long value) {
+ return value.compareTo((Long) conditionValue);
+ }
+
+ @SuppressWarnings("deprecation")
+ private int compareTo(final Date value) {
+ if (((FormattedDate) conditionValue).containsTime() || (value.getHours() == 0 && value.getMinutes() == 0 && value.getSeconds() == 0))
+ return value.compareTo((Date) conditionValue);
+ return new Date(value.getYear(), value.getMonth(), value.getDate()).compareTo((Date) conditionValue);
+ }
+
+ public String createDescription(final String attribute, final int comparationResult, final boolean succeed) {
+ String simpleCondition;
+ switch (comparationResult) {
+ case -1:
+ simpleCondition = succeed ? ConditionFactory.FILTER_LT : ConditionFactory.FILTER_GE;
+ break;
+ case 0:
+ simpleCondition = TextUtils.getText(succeed ? ConditionFactory.FILTER_IS_EQUAL_TO
+ : ConditionFactory.FILTER_IS_NOT_EQUAL_TO);
+ break;
+ case 1:
+ simpleCondition = succeed ? ConditionFactory.FILTER_GT : ConditionFactory.FILTER_LE;
+ break;
+ default:
+ throw new IllegalArgumentException();
+ }
+ return ConditionFactory.createDescription(attribute, simpleCondition, valueDescription(), matchCase, matchApproximately);
+ }
+
+ private String valueDescription() {
+ return conditionValue.toString();
+ }
+
+ public Comparable<?> getConditionValue() {
+ return conditionValue;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/condition/ConditionFactory.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/ConditionFactory.java
new file mode 100644
index 0000000..a8a17d7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/condition/ConditionFactory.java
@@ -0,0 +1,134 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter.condition;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class ConditionFactory {
+ public static final String FILTER_CONTAINS = "filter_contains";
+ public static final String FILTER_DOES_NOT_EXIST = "filter_does_not_exist";
+ public static final String FILTER_EXIST = "filter_exist";
+ public static final String FILTER_GE = ">=";
+ public static final String FILTER_GT = ">";
+ public static final String FILTER_MATCH_CASE = "filter_match_case";
+ public static final String FILTER_MATCH_APPROX = "filter_match_approximately";
+ public static final String FILTER_IS_EQUAL_TO = "filter_is_equal_to";
+ public static final String FILTER_IS_NOT_EQUAL_TO = "filter_is_not_equal_to";
+ public static final String FILTER_LE = "<=";
+ public static final String FILTER_LT = "<";
+ public static final String FILTER_REGEXP = "filter_regexp_matches";
+
+ static public JComponent createCellRendererComponent(final String description) {
+ final JCondition component = new JCondition();
+ final JLabel label = new JLabel(description);
+ component.add(label);
+ return component;
+ }
+
+ public static String createDescription(final String attribute, final String simpleCondition, final String value,
+ final boolean matchCase, final boolean matchApproximately) {
+ final String description = attribute + " " + simpleCondition + (value != null ? " \"" + value + "\"" : "")
+ + (matchCase && value != null ? ", " + TextUtils.getText(ConditionFactory.FILTER_MATCH_CASE) : "")
+ + (matchApproximately && value != null ? ", " + TextUtils.getText(ConditionFactory.FILTER_MATCH_APPROX) : "");
+ return description;
+ }
+
+ final private SortedMap<Integer, IElementaryConditionController> conditionControllers;
+
+ public ConditionFactory() {
+ conditionControllers = new TreeMap<Integer, IElementaryConditionController>();
+ }
+
+ public void addConditionController(final int position, final IElementaryConditionController controller) {
+ final IElementaryConditionController old = conditionControllers.put(new Integer(position), controller);
+ assert old == null;
+ }
+
+ public Iterator<IElementaryConditionController> conditionIterator() {
+ final Iterator<IElementaryConditionController> iterator = conditionControllers.values().iterator();
+ return iterator;
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase,
+ final boolean matchApproximately) {
+ return getConditionController(selectedItem).createCondition(selectedItem, simpleCond, value, matchCase,
+ matchApproximately);
+ }
+
+ public IElementaryConditionController getConditionController(final Object item) {
+ final Iterator<IElementaryConditionController> iterator = conditionIterator();
+ while (iterator.hasNext()) {
+ final IElementaryConditionController next = iterator.next();
+ if (next.canHandle(item)) {
+ return next;
+ }
+ }
+ throw new NoSuchElementException();
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ final ASelectableCondition condition = loadCondition2(element);
+ if(condition != null){
+ final String userName = element.getAttribute("user_name", null);
+ condition.setUserName(userName);
+ }
+ return condition;
+ }
+
+ private ASelectableCondition loadCondition2(final XMLElement element) {
+ if (element.getName().equalsIgnoreCase(ConditionNotSatisfiedDecorator.NAME)) {
+ return ConditionNotSatisfiedDecorator.load(this, element);
+ }
+ if (element.getName().equalsIgnoreCase(ConjunctConditions.NAME)) {
+ return ConjunctConditions.load(this, element);
+ }
+ if (element.getName().equalsIgnoreCase(DisjunctConditions.NAME)) {
+ return DisjunctConditions.load(this, element);
+ }
+ final Iterator<IElementaryConditionController> conditionIterator = conditionIterator();
+ while (conditionIterator.hasNext()) {
+ final ASelectableCondition condition = conditionIterator.next().loadCondition(element);
+ if (condition != null) {
+ return condition;
+ }
+ }
+ return null;
+ }
+
+ public IElementaryConditionController removeConditionController(final int position,
+ final IElementaryConditionController controller) {
+ final IElementaryConditionController old = conditionControllers.remove(new Integer(position));
+ return old;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ConditionNotSatisfiedDecorator.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/ConditionNotSatisfiedDecorator.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/condition/ConditionNotSatisfiedDecorator.java
rename to freeplane/src/main/java/org/freeplane/features/filter/condition/ConditionNotSatisfiedDecorator.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/condition/ConditionSnapshotFactory.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/ConditionSnapshotFactory.java
new file mode 100644
index 0000000..3b524f4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/condition/ConditionSnapshotFactory.java
@@ -0,0 +1,30 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter.condition;
+
+
+/**
+ * @author Dimitry Polivaev
+ * 26.04.2014
+ */
+public interface ConditionSnapshotFactory {
+
+ ASelectableCondition createSnapshotCondition();
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ConjunctConditions.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/ConjunctConditions.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/condition/ConjunctConditions.java
rename to freeplane/src/main/java/org/freeplane/features/filter/condition/ConjunctConditions.java
diff --git a/freeplane/src/org/freeplane/features/filter/condition/DefaultConditionRenderer.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/DefaultConditionRenderer.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/condition/DefaultConditionRenderer.java
rename to freeplane/src/main/java/org/freeplane/features/filter/condition/DefaultConditionRenderer.java
diff --git a/freeplane/src/org/freeplane/features/filter/condition/DisjunctConditions.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/DisjunctConditions.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/condition/DisjunctConditions.java
rename to freeplane/src/main/java/org/freeplane/features/filter/condition/DisjunctConditions.java
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ICombinedCondition.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/ICombinedCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/condition/ICombinedCondition.java
rename to freeplane/src/main/java/org/freeplane/features/filter/condition/ICombinedCondition.java
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ICondition.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/ICondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/condition/ICondition.java
rename to freeplane/src/main/java/org/freeplane/features/filter/condition/ICondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/condition/IElementaryConditionController.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/IElementaryConditionController.java
new file mode 100644
index 0000000..64b8cb5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/condition/IElementaryConditionController.java
@@ -0,0 +1,60 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter.condition;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+public interface IElementaryConditionController {
+ boolean canEditValues(final Object property, final TranslatedObject simpleCond);
+
+ boolean canHandle(final Object selectedItem);
+
+ boolean canSelectValues(final Object property, final TranslatedObject simpleCond);
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase,
+ final boolean approximateMatching);
+
+ ComboBoxModel getConditionsForProperty(final Object property);
+
+ ListModel getFilteredProperties();
+
+ ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition);
+
+ ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition);
+
+ ComboBoxModel getValuesForProperty(final Object property, TranslatedObject simpleCond);
+
+ boolean isCaseDependent(final Object property, final TranslatedObject simpleCond);
+
+ boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond);
+
+ ASelectableCondition loadCondition(final XMLElement element);
+}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/JCondition.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/JCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/condition/JCondition.java
rename to freeplane/src/main/java/org/freeplane/features/filter/condition/JCondition.java
diff --git a/freeplane/src/org/freeplane/features/filter/condition/NoFilteringCondition.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/NoFilteringCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/filter/condition/NoFilteringCondition.java
rename to freeplane/src/main/java/org/freeplane/features/filter/condition/NoFilteringCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/condition/SelectedViewCondition.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/SelectedViewCondition.java
new file mode 100644
index 0000000..9bbd7c9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/condition/SelectedViewCondition.java
@@ -0,0 +1,65 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter.condition;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class SelectedViewCondition extends ASelectableCondition implements ConditionSnapshotFactory{
+ private static final String NAME = "selected_view_condition";
+ private static String description;
+
+ public static ASelectableCondition CreateCondition() {
+ return new SelectedViewCondition();
+ }
+
+// // private final Controller controller;
+
+ public SelectedViewCondition() {
+ super();
+// this.controller = controller;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ return selection != null && selection.isSelected(node);
+ }
+
+ @Override
+ protected String createDescription() {
+ if (SelectedViewCondition.description == null) {
+ SelectedViewCondition.description = TextUtils.getText("filter_selected_node_view");
+ }
+ return SelectedViewCondition.description;
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+ public void toXml(final XMLElement element) {}
+
+ public ASelectableCondition createSnapshotCondition() {
+ return new SelectedViewSnapshotCondition(Controller.getCurrentController().getSelection().getSelection());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/filter/condition/SelectedViewSnapshotCondition.java b/freeplane/src/main/java/org/freeplane/features/filter/condition/SelectedViewSnapshotCondition.java
new file mode 100644
index 0000000..67ff88c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/filter/condition/SelectedViewSnapshotCondition.java
@@ -0,0 +1,58 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.filter.condition;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class SelectedViewSnapshotCondition extends ASelectableCondition {
+ private static final String NAME = "selected_view_snapshot";
+ private static String description;
+
+ HashSet<NodeModel> selectedNodes;
+
+ public SelectedViewSnapshotCondition(Collection<NodeModel> selectedNodes) {
+ super();
+ this.selectedNodes = new HashSet<NodeModel>();
+ this.selectedNodes.addAll(selectedNodes);
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ return selectedNodes.contains(node);
+ }
+
+ @Override
+ protected String createDescription() {
+ if (SelectedViewSnapshotCondition.description == null) {
+ SelectedViewSnapshotCondition.description = TextUtils.getText("filter_selected_node_view_snapshot");
+ }
+ return SelectedViewSnapshotCondition.description;
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+ public void toXml(final XMLElement element) {}
+}
diff --git a/freeplane/src/org/freeplane/features/format/DateFormatParser.java b/freeplane/src/main/java/org/freeplane/features/format/DateFormatParser.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/DateFormatParser.java
rename to freeplane/src/main/java/org/freeplane/features/format/DateFormatParser.java
diff --git a/freeplane/src/org/freeplane/features/format/DatePatternFormat.java b/freeplane/src/main/java/org/freeplane/features/format/DatePatternFormat.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/DatePatternFormat.java
rename to freeplane/src/main/java/org/freeplane/features/format/DatePatternFormat.java
diff --git a/freeplane/src/org/freeplane/features/format/DecimalFormatParser.java b/freeplane/src/main/java/org/freeplane/features/format/DecimalFormatParser.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/DecimalFormatParser.java
rename to freeplane/src/main/java/org/freeplane/features/format/DecimalFormatParser.java
diff --git a/freeplane/src/org/freeplane/features/format/DecimalPatternFormat.java b/freeplane/src/main/java/org/freeplane/features/format/DecimalPatternFormat.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/DecimalPatternFormat.java
rename to freeplane/src/main/java/org/freeplane/features/format/DecimalPatternFormat.java
diff --git a/freeplane/src/org/freeplane/features/format/FormatController.java b/freeplane/src/main/java/org/freeplane/features/format/FormatController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/FormatController.java
rename to freeplane/src/main/java/org/freeplane/features/format/FormatController.java
diff --git a/freeplane/src/org/freeplane/features/format/FormatUtils.java b/freeplane/src/main/java/org/freeplane/features/format/FormatUtils.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/FormatUtils.java
rename to freeplane/src/main/java/org/freeplane/features/format/FormatUtils.java
diff --git a/freeplane/src/org/freeplane/features/format/FormattedDate.java b/freeplane/src/main/java/org/freeplane/features/format/FormattedDate.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/FormattedDate.java
rename to freeplane/src/main/java/org/freeplane/features/format/FormattedDate.java
diff --git a/freeplane/src/org/freeplane/features/format/FormattedFormula.java b/freeplane/src/main/java/org/freeplane/features/format/FormattedFormula.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/FormattedFormula.java
rename to freeplane/src/main/java/org/freeplane/features/format/FormattedFormula.java
diff --git a/freeplane/src/org/freeplane/features/format/FormattedNumber.java b/freeplane/src/main/java/org/freeplane/features/format/FormattedNumber.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/FormattedNumber.java
rename to freeplane/src/main/java/org/freeplane/features/format/FormattedNumber.java
diff --git a/freeplane/src/org/freeplane/features/format/FormattedObject.java b/freeplane/src/main/java/org/freeplane/features/format/FormattedObject.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/FormattedObject.java
rename to freeplane/src/main/java/org/freeplane/features/format/FormattedObject.java
diff --git a/freeplane/src/org/freeplane/features/format/FormatterPatternFormat.java b/freeplane/src/main/java/org/freeplane/features/format/FormatterPatternFormat.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/FormatterPatternFormat.java
rename to freeplane/src/main/java/org/freeplane/features/format/FormatterPatternFormat.java
diff --git a/freeplane/src/org/freeplane/features/format/IFormattedObject.java b/freeplane/src/main/java/org/freeplane/features/format/IFormattedObject.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/IFormattedObject.java
rename to freeplane/src/main/java/org/freeplane/features/format/IFormattedObject.java
diff --git a/freeplane/src/main/java/org/freeplane/features/format/IdentityPatternFormat.java b/freeplane/src/main/java/org/freeplane/features/format/IdentityPatternFormat.java
new file mode 100644
index 0000000..f073dc3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/format/IdentityPatternFormat.java
@@ -0,0 +1,30 @@
+package org.freeplane.features.format;
+
+import org.freeplane.core.util.TextUtils;
+
+public class IdentityPatternFormat extends PatternFormat {
+ public IdentityPatternFormat(String pattern) {
+ super(pattern, TYPE_IDENTITY);
+ }
+
+ IdentityPatternFormat() {
+ this(IDENTITY_PATTERN);
+ }
+
+ @Override
+ public String getStyle() {
+ return STYLE_FORMATTER;
+ }
+
+ @Override
+ public Object formatObject(Object toFormat) {
+ if (toFormat instanceof IFormattedObject)
+ return ((IFormattedObject) toFormat).getObject();
+ return toFormat;
+ }
+
+ @Override
+ public String toString() {
+ return TextUtils.getText(getPattern());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/format/IsoDateParser.java b/freeplane/src/main/java/org/freeplane/features/format/IsoDateParser.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/IsoDateParser.java
rename to freeplane/src/main/java/org/freeplane/features/format/IsoDateParser.java
diff --git a/freeplane/src/org/freeplane/features/format/NumberLiteralParser.java b/freeplane/src/main/java/org/freeplane/features/format/NumberLiteralParser.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/NumberLiteralParser.java
rename to freeplane/src/main/java/org/freeplane/features/format/NumberLiteralParser.java
diff --git a/freeplane/src/org/freeplane/features/format/Parser.java b/freeplane/src/main/java/org/freeplane/features/format/Parser.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/Parser.java
rename to freeplane/src/main/java/org/freeplane/features/format/Parser.java
diff --git a/freeplane/src/org/freeplane/features/format/PatternFormat.java b/freeplane/src/main/java/org/freeplane/features/format/PatternFormat.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/PatternFormat.java
rename to freeplane/src/main/java/org/freeplane/features/format/PatternFormat.java
diff --git a/freeplane/src/org/freeplane/features/format/Scanner.java b/freeplane/src/main/java/org/freeplane/features/format/Scanner.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/Scanner.java
rename to freeplane/src/main/java/org/freeplane/features/format/Scanner.java
diff --git a/freeplane/src/org/freeplane/features/format/ScannerController.java b/freeplane/src/main/java/org/freeplane/features/format/ScannerController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/format/ScannerController.java
rename to freeplane/src/main/java/org/freeplane/features/format/ScannerController.java
diff --git a/freeplane/src/main/java/org/freeplane/features/format/StandardPatternFormat.java b/freeplane/src/main/java/org/freeplane/features/format/StandardPatternFormat.java
new file mode 100644
index 0000000..0012229
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/format/StandardPatternFormat.java
@@ -0,0 +1,26 @@
+package org.freeplane.features.format;
+
+import org.freeplane.core.util.TextUtils;
+
+class StandardPatternFormat extends PatternFormat {
+ public StandardPatternFormat() {
+ super(STANDARD_FORMAT_PATTERN, TYPE_STANDARD);
+ }
+
+ @Override
+ public String getStyle() {
+ return STYLE_FORMATTER;
+ }
+
+ @Override
+ public Object formatObject(Object toFormat) {
+ if (toFormat instanceof IFormattedObject)
+ toFormat = ((IFormattedObject) toFormat).getObject();
+ return FormatController.formatUsingDefault(toFormat);
+ }
+
+ @Override
+ public String toString() {
+ return TextUtils.getText(STANDARD_FORMAT_PATTERN);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/help/AboutAction.java b/freeplane/src/main/java/org/freeplane/features/help/AboutAction.java
new file mode 100644
index 0000000..394daf3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/help/AboutAction.java
@@ -0,0 +1,87 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.help;
+
+import java.awt.event.ActionEvent;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.TextUtils;
+
+
+class AboutAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ AboutAction() {
+ super("AboutAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ Box box = Box.createVerticalBox();
+ String about = TextUtils.getText("about_text") + " " + FreeplaneVersion.getVersion();
+ addUri(box, "homepage_url", about);
+ addUri(box, "copyright_url", TextUtils.getText("copyright"));
+ addMessage(box, FreeplaneVersion.getVersion().getRevision());
+ addFormattedMessage(box, "java_version", Compat.JAVA_VERSION);
+ addFormattedMessage(box, "main_resource_directory", ResourceController.getResourceController().getResourceBaseDir());
+ addUri(box, "license_url", TextUtils.getText("license"));
+ addMessage(box, TextUtils.getText("license_text"));
+
+ JOptionPane.showMessageDialog(UITools.getCurrentRootComponent(), box, TextUtils
+ .getText("AboutAction.text"), JOptionPane.INFORMATION_MESSAGE);
+ }
+
+ private void addFormattedMessage(Box box, String format, String parameter) {
+ box.add(new JLabel(TextUtils.format(format, parameter)));
+ }
+
+ private void addMessage(Box box, String localMessage) {
+ box.add(new JLabel(localMessage));
+ }
+
+ private void addUri(Box box, String uriProperty, String message) {
+ try {
+ URI uri;
+ uri = new URI( ResourceController.getResourceController().getProperty(uriProperty));
+ JButton uriButton = UITools.createHtmlLinkStyleButton(uri, message);
+ uriButton.setHorizontalAlignment(SwingConstants.LEADING);
+ box.add(uriButton);
+ } catch (URISyntaxException e1) {
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/help/DocumentationAction.java b/freeplane/src/main/java/org/freeplane/features/help/DocumentationAction.java
new file mode 100644
index 0000000..e174cfe
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/help/DocumentationAction.java
@@ -0,0 +1,51 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.help;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+
+class DocumentationAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+ private final String document;
+
+ DocumentationAction( final String actionName, final String document) {
+ super(actionName);
+ this.document = document;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ UITools.executeWhenNodeHasFocus(new Runnable() {
+ public void run() {
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ mapController.newDocumentationMap(document);
+ }
+ });
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/help/FilePropertiesAction.java b/freeplane/src/main/java/org/freeplane/features/help/FilePropertiesAction.java
new file mode 100644
index 0000000..b774a64
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/help/FilePropertiesAction.java
@@ -0,0 +1,351 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.help;
+
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.net.URL;
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Enumeration;
+import javax.swing.BorderFactory;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JSeparator;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.Filter;
+import org.freeplane.features.filter.condition.ICondition;
+import org.freeplane.features.icon.factory.ImageIconFactory;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Stefan Ott
+ */
+class FilePropertiesAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ FilePropertiesAction() {
+ super("FilePropertiesAction");
+ }
+
+ /**
+ * Gets called when File -> Properties is selected
+ */
+ public void actionPerformed(final ActionEvent e) {
+ //variables for informations to be displayed
+ final String fileNamePath, fileSavedDateTime, fileSize;
+ final int fileChangesSinceSave;
+ //get informations
+ //if file has been saved once
+ final MapModel map = Controller.getCurrentController().getMap();
+ if (map.getFile() != null) {
+ //fileNamePath
+ fileNamePath = map.getFile().toString();
+ //fleSavedDateTime as formatted string
+ final Calendar c = Calendar.getInstance();
+ c.setTimeInMillis(map.getFile().lastModified());
+ final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
+ fileSavedDateTime = df.format(c.getTime());
+ //fileSize as formatted string
+ final DecimalFormat def = new DecimalFormat();
+ def.setGroupingUsed(true);
+ fileSize = def.format(map.getFile().length()) + " "
+ + TextUtils.getText("FileRevisionsDialog.file_size");
+ //fileChangesSinceSave
+ fileChangesSinceSave = map.getNumberOfChangesSinceLastSave();
+ }
+ else {
+ fileNamePath = TextUtils.getText("FileProperties_NeverSaved");
+ fileSavedDateTime = TextUtils.getText("FileProperties_NeverSaved");
+ fileSize = TextUtils.getText("FileProperties_NeverSaved");
+ fileChangesSinceSave = 0;
+ }
+ //node statistics
+ final NodeModel rootNode = map.getRootNode();
+ final int nodeMainBranches = rootNode.getChildCount();
+ final ICondition trueCondition = new ICondition() {
+ public boolean checkNode(NodeModel node) {
+ return true;
+ }
+ };
+ final ICondition isLeafCondition = new ICondition() {
+ public boolean checkNode(NodeModel node) {
+ return node.isLeaf();
+ }
+ };
+ final int nodeTotalNodeCount = getNodeCount(rootNode, trueCondition);
+ final int nodeTotalLeafCount = getNodeCount(rootNode, isLeafCondition);
+ final Filter filter = map.getFilter();
+ final int nodeTotalFiltered;
+ if(filter != null && filter.getCondition() != null){
+ final ICondition matchesFilterCondition = new ICondition() {
+ public boolean checkNode(NodeModel node) {
+ return filter.matches(node);
+ }
+ };
+ nodeTotalFiltered = getNodeCount(rootNode, matchesFilterCondition);
+ }
+ else{
+ nodeTotalFiltered = -1;
+ }
+ //Multiple nodes may be selected
+ final Collection<NodeModel> nodes = Controller.getCurrentController().getSelection().getSelection();
+ boolean isDescendant = false;
+ int nodeRelativeChildCount = 0;
+ int nodeRelativeNodeCount = 0;
+ int nodeRelativeLeafCount = 0;
+ for (final NodeModel n : nodes) {
+ nodeRelativeChildCount += n.getChildCount();
+ isDescendant = false;
+ //Nodes and leaf nodes are only counted once per branch
+ for (NodeModel node : nodes) {
+ if (n.isDescendantOf(node)) {
+ isDescendant = true;
+ break;
+ }
+ }
+ if (!isDescendant) {
+ nodeRelativeNodeCount += getNodeCount(n, trueCondition);
+ nodeRelativeLeafCount += getNodeCount(n, isLeafCondition);
+ }
+ }
+ final int nodeSelectedNodeCount = Controller.getCurrentController().getSelection().getSelection().size();
+ //build component
+ final JPanel panel = new JPanel();
+ final GridBagLayout gridbag = new GridBagLayout();
+ panel.setLayout(gridbag);
+ panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(),
+ BorderFactory.createEmptyBorder(5, 0, 5, 0)));
+ final GridBagConstraints c = new GridBagConstraints();
+ c.gridx = 0;
+ c.gridy = 0;
+ c.gridwidth = 1;
+ c.ipady = 5;
+ c.ipadx = 0;
+ c.insets = new Insets(0, 10, 0, 10);
+ c.anchor = GridBagConstraints.FIRST_LINE_START;
+ //fileNamePath
+ final URL imageURL = ResourceController.getResourceController().getResource("/images/filenew.png");
+ final JLabel fileIcon = new JLabel(ImageIconFactory.getInstance().getImageIcon(imageURL));
+ gridbag.setConstraints(fileIcon, c);
+ panel.add(fileIcon);
+ c.gridx = 1;
+ final JLabel fileNamePathText = new JLabel(TextUtils.getText("FileProperties_FileName"));
+ gridbag.setConstraints(fileNamePathText, c);
+ panel.add(fileNamePathText);
+ c.gridx = 2;
+ final JLabel fileNamePathLabel = new JLabel(fileNamePath);
+ gridbag.setConstraints(fileNamePathLabel, c);
+ panel.add(fileNamePathLabel);
+ //fileSize
+ c.gridy++;
+ c.gridx = 1;
+ final JLabel fileSizeText = new JLabel(TextUtils.getText("FileProperties_FileSize"));
+ gridbag.setConstraints(fileSizeText, c);
+ panel.add(fileSizeText);
+ c.gridx = 2;
+ final JLabel fileSizeLabel = new JLabel(fileSize);
+ gridbag.setConstraints(fileSizeLabel, c);
+ panel.add(fileSizeLabel);
+ //fileSavedDateTime
+ c.gridy++;
+ c.gridx = 1;
+ final JLabel fileSavedDateTimeText = new JLabel(TextUtils.getText("FileProperties_FileSaved"));
+ gridbag.setConstraints(fileSavedDateTimeText, c);
+ panel.add(fileSavedDateTimeText);
+ c.gridx = 2;
+ final JLabel fileSavedDateTimeLabel = new JLabel(fileSavedDateTime);
+ gridbag.setConstraints(fileSavedDateTimeLabel, c);
+ panel.add(fileSavedDateTimeLabel);
+ //fileChangesSinceSave
+ c.gridy++;
+ c.gridx = 1;
+ final JLabel fileChangesSinceSaveText = new JLabel(TextUtils.getText("FileProperties_ChangesSinceLastSave"));
+ gridbag.setConstraints(fileChangesSinceSaveText, c);
+ panel.add(fileChangesSinceSaveText);
+ c.gridx = 2;
+ final JLabel fileChangesSinceSaveLabel = new JLabel(String.valueOf(fileChangesSinceSave));
+ gridbag.setConstraints(fileChangesSinceSaveLabel, c);
+ panel.add(fileChangesSinceSaveLabel);
+ //Separator
+ c.gridy++;
+ c.gridx = 0;
+ c.insets = new Insets(5, 10, 5, 10);
+ c.ipady = 2;
+ c.gridwidth = 3;
+ final JSeparator js = new JSeparator(SwingConstants.HORIZONTAL);
+ js.setLayout(gridbag);
+ js.setBorder(BorderFactory.createEtchedBorder());
+ js.setPreferredSize(new Dimension(0, 0));
+ c.fill = GridBagConstraints.HORIZONTAL;
+ gridbag.setConstraints(js, c);
+ panel.add(js);
+ //nodeTotalNodeCount
+ c.gridy++;
+ c.insets = new Insets(0, 10, 0, 10);
+ c.ipady = 5;
+ c.gridwidth = 1;
+ c.gridx = 0;
+ final URL imageURL2 = ResourceController.getResourceController().getResource("/images/MapStats.png");
+ final JLabel MapStatsIcon = new JLabel(ImageIconFactory.getInstance().getImageIcon(imageURL2));
+ gridbag.setConstraints(MapStatsIcon, c);
+ panel.add(MapStatsIcon);
+ c.gridx = 1;
+ final JLabel nodeTotalNodeCountText = new JLabel(TextUtils.getText("FileProperties_TotalNodeCount"));
+ gridbag.setConstraints(nodeTotalNodeCountText, c);
+ panel.add(nodeTotalNodeCountText);
+ c.gridx = 2;
+ final JLabel nodeTotalNodeCountLabel = new JLabel(String.valueOf(nodeTotalNodeCount));
+ gridbag.setConstraints(nodeTotalNodeCountLabel, c);
+ panel.add(nodeTotalNodeCountLabel);
+ //nodeTotalFiltered
+ if(nodeTotalFiltered != -1){
+ c.gridy++;
+ c.gridx = 1;
+ final JLabel nodeTotalFilteredLabelText = new JLabel(TextUtils.getText("FileProperties_TotalFilteredCount"));
+ gridbag.setConstraints(nodeTotalFilteredLabelText, c);
+ panel.add(nodeTotalFilteredLabelText);
+ c.gridx = 2;
+ final JLabel nodeTotalFilteredLabel = new JLabel(String.valueOf(nodeTotalFiltered));
+ gridbag.setConstraints(nodeTotalFilteredLabel, c);
+ panel.add(nodeTotalFilteredLabel);
+ }
+ //nodeTotalLeafCount
+ c.gridy++;
+
+ c.gridx = 1;
+ final JLabel nodeTotalLeafCountText = new JLabel(TextUtils.getText("FileProperties_TotalLeafCount"));
+ gridbag.setConstraints(nodeTotalLeafCountText, c);
+ panel.add(nodeTotalLeafCountText);
+ c.gridx = 2;
+ final JLabel nodeTotalLeafCountLabel = new JLabel(String.valueOf(nodeTotalLeafCount));
+ gridbag.setConstraints(nodeTotalLeafCountLabel, c);
+ panel.add(nodeTotalLeafCountLabel);
+ //nodeMainBranches
+ c.gridy++;
+ c.gridx = 1;
+ final JLabel nodeMainBranchesText = new JLabel(TextUtils.getText("FileProperties_MainBranchCount"));
+ gridbag.setConstraints(nodeMainBranchesText, c);
+ panel.add(nodeMainBranchesText);
+ c.gridx = 2;
+ final JLabel nodeMainBranchesLabel = new JLabel(String.valueOf(nodeMainBranches));
+ gridbag.setConstraints(nodeMainBranchesLabel, c);
+ panel.add(nodeMainBranchesLabel);
+ //Separator
+ c.gridy++;
+ c.gridx = 0;
+ c.insets = new Insets(5, 10, 5, 10);
+ c.ipady = 2;
+ c.gridwidth = 3;
+ final JSeparator js2 = new JSeparator(SwingConstants.HORIZONTAL);
+ js2.setLayout(gridbag);
+ js2.setBorder(BorderFactory.createEtchedBorder());
+ js2.setPreferredSize(new Dimension(0, 0));
+ c.fill = GridBagConstraints.HORIZONTAL;
+ gridbag.setConstraints(js2, c);
+ panel.add(js2);
+ //nodeRelativeNodeCount
+ c.gridy++;
+ c.insets = new Insets(0, 10, 0, 10);
+ c.ipady = 5;
+ c.gridwidth = 1;
+ c.gridx = 0;
+ final URL imageURL3 = ResourceController.getResourceController().getResource("/images/BranchStats.png");
+ final JLabel BranchStatsIcon = new JLabel(ImageIconFactory.getInstance().getImageIcon(imageURL3));
+ gridbag.setConstraints(BranchStatsIcon, c);
+ panel.add(BranchStatsIcon);
+ c.gridx = 1;
+ final JLabel nodeRelativeNodeCountText = new JLabel(TextUtils.getText("FileProperties_BranchNodeCount"));
+ gridbag.setConstraints(nodeRelativeNodeCountText, c);
+ panel.add(nodeRelativeNodeCountText);
+ c.gridx = 2;
+ final JLabel nodeRelativeNodeCountLabel = new JLabel(String.valueOf(nodeRelativeNodeCount));
+ gridbag.setConstraints(nodeRelativeNodeCountLabel, c);
+ panel.add(nodeRelativeNodeCountLabel);
+ //nodeRelativeLeafCount
+ c.gridy++;
+ c.gridx = 1;
+ final JLabel nodeRelativeLeafCountText = new JLabel(TextUtils.getText("FileProperties_BranchLeafCount"));
+ gridbag.setConstraints(nodeRelativeLeafCountText, c);
+ panel.add(nodeRelativeLeafCountText);
+ c.gridx = 2;
+ final JLabel nodeRelativeLeafCountLabel = new JLabel(String.valueOf(nodeRelativeLeafCount));
+ gridbag.setConstraints(nodeRelativeLeafCountLabel, c);
+ panel.add(nodeRelativeLeafCountLabel);
+ //nodeRelativeChildCount
+ c.gridy++;
+ c.gridx = 1;
+ final JLabel nodeRelativeChildCountText = new JLabel(TextUtils.getText("FileProperties_NodeChildCount"));
+ gridbag.setConstraints(nodeRelativeChildCountText, c);
+ panel.add(nodeRelativeChildCountText);
+ c.gridx = 2;
+ final JLabel nodeRelativeChildCountLabel = new JLabel(String.valueOf(nodeRelativeChildCount));
+ gridbag.setConstraints(nodeRelativeChildCountLabel, c);
+ panel.add(nodeRelativeChildCountLabel);
+ //nodeSelectedNodeCount
+ c.gridy++;
+ c.gridx = 1;
+ final JLabel nodeSelectedNodeCountText = new JLabel(TextUtils.getText("FileProperties_NodeSelectionCount"));
+ gridbag.setConstraints(nodeSelectedNodeCountText, c);
+ panel.add(nodeSelectedNodeCountText);
+ c.gridx = 2;
+ final JLabel nodeSelectedNodeCountLabel = new JLabel(String.valueOf(nodeSelectedNodeCount));
+ gridbag.setConstraints(nodeSelectedNodeCountLabel, c);
+ panel.add(nodeSelectedNodeCountLabel);
+ //Show dialog
+ JOptionPane.showMessageDialog(UITools.getCurrentRootComponent(), panel,
+ TextUtils.getText("FilePropertiesAction.text"), JOptionPane.PLAIN_MESSAGE);
+ }
+
+ /**
+ * Builts an array containing nodes form the given node on downwards.
+ *
+ * @param NodeModel node: The node from which on to search
+ * @param boolean CountLeaves: If true only leave nodes are included in the return list,
+ * otherwise all nodes from the selected on are included
+ *
+ * @return Returns a list of nodes
+ */
+ private int getNodeCount(final NodeModel node, final ICondition condition) {
+ int result = 0;
+ final Enumeration<NodeModel> children = node.children();
+ if (condition.checkNode(node)) {
+ result++;
+ }
+ while (children.hasMoreElements()) {
+ final NodeModel child = children.nextElement();
+ result += getNodeCount(child, condition);
+ }
+ return result;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/help/HelpController.java b/freeplane/src/main/java/org/freeplane/features/help/HelpController.java
new file mode 100644
index 0000000..9fe2a38
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/help/HelpController.java
@@ -0,0 +1,70 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.help;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class HelpController implements IExtension {
+ public static HelpController getController() {
+ return (HelpController) Controller.getCurrentController().getExtension(HelpController.class);
+ }
+
+ public static void install() {
+ Controller controller = Controller.getCurrentController();
+ controller.addExtension(HelpController.class, new HelpController());
+ }
+
+ public HelpController() {
+ super();
+ Controller controller = Controller.getCurrentController();
+ final ResourceController resourceController = ResourceController.getResourceController();
+ controller.addAction(new AboutAction());
+ controller.addAction(new OpenURLAction("OpenFreeplaneSiteAction", resourceController.getProperty("webFreeplaneLocation")));
+ if(resourceController.isApplet())
+ return;
+ controller.addAction(new FilePropertiesAction());
+ controller.addAction(new OpenSourceForgeURLAction("ReportBugAction", resourceController.getProperty("bugTrackerLocation")));
+ controller.addAction(new OpenSourceForgeURLAction("RequestFeatureAction", resourceController.getProperty("featureTrackerLocation")));
+ controller.addAction(new OpenSourceForgeURLAction("AskForHelp", resourceController.getProperty("helpForumLocation")));
+ controller.addAction(new OpenURLAction("WebDocuAction", resourceController.getProperty("webDocuLocation")));
+ final String defaultMap = resourceController.getProperty("docu_map");
+ controller.addAction(new DocumentationAction("DocumentationAction", defaultMap));
+ final String tutorialMap = resourceController.getProperty("tutorial_map");
+ controller.addAction(new DocumentationAction("GettingStartedAction", tutorialMap));
+ final String whatsNewMap = resourceController.getProperty("whatsnew_map");
+ controller.addAction(new DocumentationAction("WhatsNewAction", whatsNewMap));
+ controller.addAction(new HotKeyInfoAction());
+ controller.addAction(new OnlineDocumentationAction("OnlineReference", "docu-online"));
+ }
+
+ /**
+ * @param e
+ */
+ public void webDocu(final ActionEvent e) {
+ Controller.getCurrentController().getAction("WebDocuAction").actionPerformed(e);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/help/HotKeyInfoAction.java b/freeplane/src/main/java/org/freeplane/features/help/HotKeyInfoAction.java
new file mode 100644
index 0000000..4e39328
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/help/HotKeyInfoAction.java
@@ -0,0 +1,136 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.help;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.Enumeration;
+
+import javax.swing.JDialog;
+import javax.swing.JEditorPane;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.MenuUtils;
+import org.freeplane.core.util.MenuUtils.MenuEntry;
+import org.freeplane.core.util.TextUtils;
+
+/**
+ * @author Dimitry Polivaev
+ * Sep 27, 2011
+ */
+
+public class HotKeyInfoAction extends AFreeplaneAction{
+
+ public HotKeyInfoAction() {
+ super("HotKeyInfoAction");
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ // ==========================================================================
+ // format accelerator map as html text
+ // ==========================================================================
+ private String formatAsHtml(final Enumeration<DefaultMutableTreeNode> children) {
+ final StringBuilder builder = new StringBuilder();
+ builder.append("<html><head><style type=\"text/css\">" //
+ //doesn't work: + " table { margin: 1px 0px; border-spacing: 0px; }"//
+ + " h1 { background-color: #B5C8DB; margin-bottom: 0px; margin-top: 1ex; }"//
+ + " h2 { background-color: #B5C8DB; margin-bottom: 0px; margin-top: 1ex; }"//
+ + " h3 { background-color: #B5C8DB; margin-bottom: 0px; margin-top: 1ex; }"//
+ + "</head><body width=\"600\">");
+ appendAsHtml(builder, children, "", 2);
+ builder.append("</body></html>");
+ return builder.toString();
+ }
+
+ private void appendAsHtml(final StringBuilder builder, final Enumeration<DefaultMutableTreeNode> children,
+ final String title, final int level) {
+ if(! title.equals(""))
+ builder.append("<h").append(level).append('>').append(title).append("</h").append(level).append('>');
+ appendChildrenAsHtml(builder, children, title, level);
+ }
+
+ @SuppressWarnings("unchecked")
+ private void appendChildrenAsHtml(final StringBuilder builder,
+ final Enumeration<DefaultMutableTreeNode> children, final String title,
+ final int level) {
+ final ArrayList<MenuEntry> menuEntries = new ArrayList<MenuEntry>();
+ final ArrayList<DefaultMutableTreeNode> submenus = new ArrayList<DefaultMutableTreeNode>();
+ // sort and divide
+ while (children.hasMoreElements()) {
+ final DefaultMutableTreeNode node = children.nextElement();
+ if (node.isLeaf()) {
+ menuEntries.add((MenuEntry) node.getUserObject());
+ }
+ else {
+ submenus.add(node);
+ }
+ }
+ // actions
+ if (!menuEntries.isEmpty()) {
+ builder.append("<table cellspacing=\"0\" cellpadding=\"0\">");
+ for (final MenuEntry entry : menuEntries) {
+ final String keystroke = entry.getKeyStroke() == null ? "" //
+ : MenuUtils.formatKeyStroke(entry.getKeyStroke());
+ builder.append(el("tr", el("td", entry.getLabel() + " ")
+ + el("td", keystroke)
+ + el("td", entry.getToolTipText())));
+ }
+ builder.append("</table>");
+ }
+ // submenus
+ for (final DefaultMutableTreeNode node : submenus) {
+ final String subtitle = (level > 2 ? title + "→" : "") + String.valueOf(node.getUserObject());
+ appendAsHtml(builder, node.children(), subtitle, level + 1);
+ }
+ }
+
+ private String el(final String name, final String content) {
+ return HtmlUtils.element(name, content);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void actionPerformed(ActionEvent e) {
+ final DefaultMutableTreeNode menuEntryTree = MenuUtils.createAcceleratebleMenuEntryTree("main_menu");
+ final String title = TextUtils.getText("hot_keys_table");
+ final String html = formatAsHtml(menuEntryTree.children());
+ JEditorPane refPane = new JEditorPane("text/html", html);
+ refPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false);
+ refPane.setCaretPosition(0);
+ refPane.setEditable(false);
+ final Dimension preferredSize = refPane.getPreferredSize();
+ JScrollPane scrollPane = new JScrollPane(refPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ scrollPane.setPreferredSize(new Dimension(preferredSize.width, 600));
+ JOptionPane pane = new JOptionPane(scrollPane, JOptionPane.INFORMATION_MESSAGE);
+ JDialog dialog = pane.createDialog(UITools.getMenuComponent(), title);
+ // the line below is added to the example from the docs
+ dialog.setModal(false); // this says not to block background components
+ dialog.setResizable(true);
+ dialog.setVisible(true);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/help/OnlineDocumentationAction.java b/freeplane/src/main/java/org/freeplane/features/help/OnlineDocumentationAction.java
new file mode 100644
index 0000000..73fdf30
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/help/OnlineDocumentationAction.java
@@ -0,0 +1,77 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.help;
+
+import java.awt.event.ActionEvent;
+import java.net.MalformedURLException;
+import java.net.URL;
+import javax.swing.SwingUtilities;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.url.NodeAndMapReference;
+
+
+class OnlineDocumentationAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+ private final NodeAndMapReference nodeAndMapReference;
+
+ OnlineDocumentationAction( final String actionName, final String urlProperty) {
+ super(actionName);
+ final String urlString = ResourceController.getResourceController().getProperty(urlProperty);
+ nodeAndMapReference = new NodeAndMapReference(urlString);
+ }
+
+ public void actionPerformed(final ActionEvent event) {
+ try {
+ final URL url = new URL(nodeAndMapReference.getMapReference());
+ if(url == null)
+ return;
+ UITools.executeWhenNodeHasFocus( new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ if (nodeAndMapReference.hasFreeplaneFileExtension()) {
+ Controller.getCurrentController().selectMode(MModeController.MODENAME);
+ MMapController mapController = (MMapController)Controller.getCurrentModeController().getMapController();
+ mapController.newDocumentationMap(url);
+ if(nodeAndMapReference.hasNodeReference())
+ mapController.select(nodeAndMapReference.getNodeReference());
+ }
+ else {
+ Controller.getCurrentController().getViewController().openDocument(url);
+ }
+ }
+ catch (final Exception e1) {
+ LogUtils.severe(e1);
+ }
+ }
+ });
+ }
+ catch (MalformedURLException ex) {
+ ex.printStackTrace();
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/help/OpenSourceForgeURLAction.java b/freeplane/src/main/java/org/freeplane/features/help/OpenSourceForgeURLAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/help/OpenSourceForgeURLAction.java
rename to freeplane/src/main/java/org/freeplane/features/help/OpenSourceForgeURLAction.java
diff --git a/freeplane/src/org/freeplane/features/help/OpenURLAction.java b/freeplane/src/main/java/org/freeplane/features/help/OpenURLAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/help/OpenURLAction.java
rename to freeplane/src/main/java/org/freeplane/features/help/OpenURLAction.java
diff --git a/freeplane/src/org/freeplane/features/icon/AccumulatedIcons.java b/freeplane/src/main/java/org/freeplane/features/icon/AccumulatedIcons.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/icon/AccumulatedIcons.java
rename to freeplane/src/main/java/org/freeplane/features/icon/AccumulatedIcons.java
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/HierarchicalIcons.java b/freeplane/src/main/java/org/freeplane/features/icon/HierarchicalIcons.java
new file mode 100644
index 0000000..c5d7f71
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/HierarchicalIcons.java
@@ -0,0 +1,213 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file author is Christian Foltin
+ * It is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import java.util.Map;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IReadCompletionListener;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Foltin
+ */
+ at NodeHookDescriptor(hookName = "accessories/plugins/HierarchicalIcons.properties")
+public class HierarchicalIcons extends PersistentNodeHook implements INodeChangeListener, IMapChangeListener,
+ IReadCompletionListener, IExtension {
+ public static final String ICONS = "hierarchical_icons";
+
+ public HierarchicalIcons() {
+ this(Mode.OR);
+ final ModeController modeController = Controller.getCurrentModeController();
+ IconController.getController(modeController).addStateIconProvider(new IStateIconProvider() {
+ public UIIcon getStateIcon(NodeModel node) {
+ AccumulatedIcons iconSet = node.getExtension(AccumulatedIcons.class);
+ if(iconSet != null)
+ return new UIIconSet(iconSet.getAccumulatedIcons(), 0.75f);
+ else
+ return null;
+ }
+ });
+ new HierarchicalIcons2();
+ }
+ protected HierarchicalIcons(Mode mode) {
+ super();
+ this.mode = mode;
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.getMapController().getReadManager().addReadCompletionListener(this);
+ modeController.getMapController().addNodeChangeListener(this);
+ modeController.getMapController().addMapChangeListener(this);
+ }
+
+ @Override
+ protected void add(final NodeModel node, final IExtension extension) {
+ if(MapStyleModel.getExtension(node.getMap()) != null){
+ gatherLeavesAndSetStyle(node);
+ gatherLeavesAndSetParentsStyle(node);
+ }
+ super.add(node, extension);
+ }
+
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ return this;
+ }
+
+ /**
+ */
+ private void gatherLeavesAndSetParentsStyle(final NodeModel node) {
+ if (node.getChildCount() == 0) {
+ for (NodeModel parent = node.getParentNode(); parent != null; parent = parent.getParentNode()) {
+ AccumulatedIcons.setStyleCheckForChange(parent, mode);
+ }
+ return;
+ }
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ gatherLeavesAndSetParentsStyle(child);
+ }
+ }
+
+ /**
+ */
+ private void gatherLeavesAndSetStyle(final NodeModel node) {
+ node.removeExtension(AccumulatedIcons.class);
+ if (node.getChildCount() == 0) {
+ AccumulatedIcons.setStyleCheckForChange(node, mode);
+ return;
+ }
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ gatherLeavesAndSetStyle(child);
+ }
+ }
+
+ public void mapChanged(final MapChangeEvent event) {
+ final MapModel map = event.getMap();
+ if(map == null){
+ return;
+ }
+ final NodeModel rootNode = map.getRootNode();
+ if (!isActive(rootNode)) {
+ return;
+ }
+ final Object property = event.getProperty();
+ if(! property.equals(MapStyle.MAP_STYLES)){
+ return;
+ }
+ gatherLeavesAndSetStyle(rootNode);
+ gatherLeavesAndSetParentsStyle(rootNode);
+ }
+
+ public void nodeChanged(final NodeChangeEvent event) {
+ final NodeModel node = event.getNode();
+ if (!isActive(node)) {
+ return;
+ }
+ setStyleRecursive(node);
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ if (!isActive(nodeDeletionEvent.parent)) {
+ return;
+ }
+ setStyleRecursive(nodeDeletionEvent.parent);
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
+ if (!isActive(parent)) {
+ return;
+ }
+ setStyleRecursive(child);
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ if (!isActive(nodeMoveEvent.newParent)) {
+ return;
+ }
+ setStyleRecursive(nodeMoveEvent.oldParent);
+ setStyleRecursive(nodeMoveEvent.child);
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void readingCompleted(final NodeModel topNode, final Map<String, String> newIds) {
+ if (!topNode.containsExtension(getClass()) && !topNode.getMap().getRootNode().containsExtension(getClass())) {
+ return;
+ }
+ gatherLeavesAndSetStyle(topNode);
+ gatherLeavesAndSetParentsStyle(topNode);
+ }
+
+ @Override
+ protected void remove(final NodeModel node, final IExtension extension) {
+ removeIcons(node);
+ super.remove(node, extension);
+ }
+
+ /**
+ */
+ private void removeIcons(final NodeModel node) {
+ AccumulatedIcons icons = node.removeExtension(AccumulatedIcons.class);
+ if(icons != null){
+ Controller.getCurrentModeController().getMapController().delayedNodeRefresh(node, HierarchicalIcons.ICONS, null, null);
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ removeIcons(child);
+ }
+ }
+ }
+
+ public static enum Mode{AND, OR};
+ private Mode mode = Mode.OR;
+
+ /**
+ */
+ private void setStyleRecursive(final NodeModel node) {
+ if (AccumulatedIcons.setStyleCheckForChange(node, mode) && node.getParentNode() != null) {
+ setStyleRecursive(node.getParentNode());
+ }
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+
+}
+
+ at NodeHookDescriptor(hookName = "accessories/plugins/HierarchicalIcons2.properties")
+class HierarchicalIcons2 extends HierarchicalIcons{
+ public HierarchicalIcons2() {
+ super(Mode.AND);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/IIconInformation.java b/freeplane/src/main/java/org/freeplane/features/icon/IIconInformation.java
new file mode 100644
index 0000000..94bda73
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/IIconInformation.java
@@ -0,0 +1,35 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import javax.swing.Icon;
+import javax.swing.KeyStroke;
+
+public interface IIconInformation {
+ String getTranslationKeyLabel();
+
+ String getTranslationValueLabel();
+
+ Icon getIcon();
+
+ KeyStroke getKeyStroke();
+
+ String getShortcutKey();
+}
diff --git a/freeplane/src/org/freeplane/features/icon/IStateIconProvider.java b/freeplane/src/main/java/org/freeplane/features/icon/IStateIconProvider.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/icon/IStateIconProvider.java
rename to freeplane/src/main/java/org/freeplane/features/icon/IStateIconProvider.java
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/IconBuilder.java b/freeplane/src/main/java/org/freeplane/features/icon/IconBuilder.java
new file mode 100644
index 0000000..f343bd0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/IconBuilder.java
@@ -0,0 +1,99 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.features.map.MapWriter;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeWriter;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+class IconBuilder implements IElementDOMHandler, IElementWriter {
+ private final IconStore store;
+ public IconBuilder(final IconController iconController, final IconStore icons) {
+ store = icons;
+ }
+
+ static class IconProperties {
+ String iconName;
+ }
+
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (tag.equals("icon")) {
+ return new IconProperties();
+ }
+ return null;
+ }
+
+ public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
+ if (parent instanceof NodeModel && tag.equals("icon")) {
+ final NodeModel node = (NodeModel) parent;
+ final IconProperties ip = (IconProperties) userObject;
+ final String iconName = ip.iconName;
+ if(iconName != null)
+ node.addIcon(store.getMindIcon(iconName));
+ return;
+ }
+ }
+
+ private void registerAttributeHandlers(final ReadManager reader) {
+ reader.addAttributeHandler("icon", "BUILTIN", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final IconProperties ip = (IconProperties) userObject;
+ ip.iconName = value;
+ }
+ });
+ }
+
+ /**
+ */
+ public void registerBy(final ReadManager reader, final WriteManager writer) {
+ reader.addElementHandler("icon", this);
+ registerAttributeHandlers(reader);
+ writer.addElementWriter(NodeBuilder.XML_NODE, this);
+ writer.addElementWriter(NodeBuilder.XML_STYLENODE, this);
+ }
+
+ public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object element, final String tag) throws IOException {
+ if(! NodeWriter.shouldWriteSharedContent(writer))
+ return;
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ final NodeModel node = (NodeModel) element;
+ final Collection<MindIcon> icons = forceFormatting ? IconController.getController().getIcons(node) : node.getIcons();
+ for (MindIcon icon : icons) {
+ final XMLElement iconElement = new XMLElement();
+ iconElement.setName("icon");
+ iconElement.setAttribute("BUILTIN", icon.getName());
+ writer.addElement(node, iconElement);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/IconClickedEvent.java b/freeplane/src/main/java/org/freeplane/features/icon/IconClickedEvent.java
new file mode 100644
index 0000000..f256320
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/IconClickedEvent.java
@@ -0,0 +1,21 @@
+package org.freeplane.features.icon;
+
+import org.freeplane.features.map.NodeModel;
+
+public class IconClickedEvent {
+ private final UIIcon icon;
+ private final NodeModel node;
+
+ public IconClickedEvent(final UIIcon icon, final NodeModel node) {
+ this.icon = icon;
+ this.node = node;
+ }
+
+ public UIIcon getUIIcon() {
+ return icon;
+ }
+
+ public NodeModel getNode() {
+ return node;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/IconConditionController.java b/freeplane/src/main/java/org/freeplane/features/icon/IconConditionController.java
new file mode 100644
index 0000000..cf29bec
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/IconConditionController.java
@@ -0,0 +1,128 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.collection.ExtendedComboBoxModel;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.filter.condition.DefaultConditionRenderer;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+class IconConditionController implements IElementaryConditionController {
+ static final String FILTER_ICON = "filter_icon";
+// // final private Controller controller;
+
+ public IconConditionController() {
+ super();
+// this.controller = controller;
+ }
+
+ public boolean canEditValues(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ return namedObject.objectEquals(IconConditionController.FILTER_ICON);
+ }
+
+ public boolean canSelectValues(final Object property, final TranslatedObject simpleCond) {
+ return !simpleCond.objectEquals(ConditionFactory.FILTER_EXIST);
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase, final boolean approximateMatching) {
+ if (simpleCond.objectEquals(ConditionFactory.FILTER_CONTAINS))
+ return value instanceof UIIcon ? new IconContainedCondition(((UIIcon) value).getName()) : null;
+ if (simpleCond.objectEquals(ConditionFactory.FILTER_EXIST))
+ return new IconExistsCondition();
+ return null;
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object property) {
+ return new DefaultComboBoxModel(getIconConditionNames());
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(FILTER_ICON));
+ return list;
+ }
+
+ public Object[] getIconConditionNames() {
+ return new TranslatedObject[] {
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_EXIST),
+ };
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ return null;
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object property, TranslatedObject simpleCond) {
+ final ListModel icons = Controller.getCurrentController().getMap().getIconRegistry().getIconsAsListModel();
+ final ExtendedComboBoxModel extendedComboBoxModel = new ExtendedComboBoxModel();
+ extendedComboBoxModel.setExtensionList(icons);
+ return extendedComboBoxModel;
+ }
+
+ public boolean isCaseDependent(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ if (element.getName().equalsIgnoreCase(IconContainedCondition.NAME)) {
+ return IconContainedCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(IconExistsCondition.NAME)) {
+ return IconExistsCondition.load(element);
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ // don't return null as this would make FilterConditionEditor fall back to filterController.getConditionRenderer()
+ // (and that would put in a default string like "No Filtering (remove)"!)
+ return new DefaultConditionRenderer("", true);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/IconContainedCondition.java b/freeplane/src/main/java/org/freeplane/features/icon/IconContainedCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/icon/IconContainedCondition.java
rename to freeplane/src/main/java/org/freeplane/features/icon/IconContainedCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/IconController.java b/freeplane/src/main/java/org/freeplane/features/icon/IconController.java
new file mode 100644
index 0000000..b9523ef
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/IconController.java
@@ -0,0 +1,153 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.CombinedPropertyChain;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.IPropertyHandler;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.StyleNode;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class IconController implements IExtension {
+ final private CombinedPropertyChain<Collection<MindIcon>, NodeModel> iconHandlers;
+ public static IconController getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return getController(modeController);
+ }
+ public static IconController getController(ModeController modeController) {
+ return (IconController) modeController.getExtension(IconController.class);
+ }
+
+ public static void install() {
+ final ConditionFactory conditionFactory = FilterController.getCurrentFilterController().getConditionFactory();
+ conditionFactory.addConditionController(10, new IconConditionController());
+ conditionFactory.addConditionController(50, new PriorityConditionController());
+ }
+
+ public static void install( final IconController iconController) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(IconController.class, iconController);
+ }
+
+// final private ModeController modeController;
+ final private Collection<IStateIconProvider> stateIconProviders;
+
+ final private List<IconMouseListener> iconMouseListeners;
+
+ public void addIconMouseListener(final IconMouseListener iconMouseListener) {
+ iconMouseListeners.add(iconMouseListener);
+ }
+
+ public boolean addStateIconProvider(IStateIconProvider o) {
+ return stateIconProviders.add(o);
+ }
+ public boolean removeStateIconProvider(IStateIconProvider o) {
+ return stateIconProviders.remove(o);
+ }
+ public IconController(final ModeController modeController) {
+ super();
+ stateIconProviders = new LinkedList<IStateIconProvider>();
+ iconHandlers = new CombinedPropertyChain<Collection<MindIcon>, NodeModel>(false);
+// this.modeController = modeController;
+ final MapController mapController = modeController.getMapController();
+ final ReadManager readManager = mapController.getReadManager();
+ final WriteManager writeManager = mapController.getWriteManager();
+ final IconBuilder textBuilder = new IconBuilder(this, IconStoreFactory.create());
+ textBuilder.registerBy(readManager, writeManager);
+ addIconGetter(IPropertyHandler.STYLE, new IPropertyHandler<Collection<MindIcon>, NodeModel>() {
+ public Collection<MindIcon> getProperty(final NodeModel node, final Collection<MindIcon> currentValue) {
+ final MapStyleModel model = MapStyleModel.getExtension(node.getMap());
+ final Collection<IStyle> styleKeys = LogicalStyleController.getController(modeController).getStyles(node);
+ for(IStyle styleKey : styleKeys){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null || node == styleNode && !(styleKey instanceof StyleNode)) {
+ continue;
+ }
+ final List<MindIcon> styleIcons;
+ styleIcons = styleNode.getIcons();
+ currentValue.addAll(styleIcons);
+ }
+ return currentValue;
+ }
+ });
+ iconMouseListeners = new LinkedList<IconMouseListener>();
+ }
+
+ public IPropertyHandler<Collection<MindIcon>, NodeModel> addIconGetter(
+ final Integer key,
+ final IPropertyHandler<Collection<MindIcon>, NodeModel> getter) {
+ return iconHandlers.addGetter(key, getter);
+ }
+
+ public IPropertyHandler<Collection<MindIcon>, NodeModel> removeIconGetter(
+ final Integer key,
+ final IPropertyHandler<Collection<MindIcon>, NodeModel> getter) {
+ return iconHandlers.addGetter(key, getter);
+ }
+
+
+ public Collection<MindIcon> getIcons(final NodeModel node) {
+ final Collection<MindIcon> icons = iconHandlers.getProperty(node, new LinkedList<MindIcon>());
+ return icons;
+ }
+
+ public final Collection<UIIcon> getStateIcons(final NodeModel node){
+ final LinkedList<UIIcon> icons = new LinkedList<UIIcon>();
+ for(IStateIconProvider provider : stateIconProviders){
+ final UIIcon stateIcon = provider.getStateIcon(node);
+ if(stateIcon != null){
+ icons.add(stateIcon);
+ final IconRegistry iconRegistry = node.getMap().getIconRegistry();
+ iconRegistry.addIcon(stateIcon);
+ }
+ }
+ return icons;
+ }
+ public boolean onIconClicked(NodeModel node, UIIcon icon) {
+ boolean processed = false;
+ for (IconMouseListener listener : iconMouseListeners)
+ {
+ final IconClickedEvent event = new IconClickedEvent(icon, node);
+ if(listener.onIconClicked(event)) {
+ processed = true;
+ }
+ }
+ return processed;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/icon/IconExistsCondition.java b/freeplane/src/main/java/org/freeplane/features/icon/IconExistsCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/icon/IconExistsCondition.java
rename to freeplane/src/main/java/org/freeplane/features/icon/IconExistsCondition.java
diff --git a/freeplane/src/org/freeplane/features/icon/IconGroup.java b/freeplane/src/main/java/org/freeplane/features/icon/IconGroup.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/icon/IconGroup.java
rename to freeplane/src/main/java/org/freeplane/features/icon/IconGroup.java
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/IconMouseListener.java b/freeplane/src/main/java/org/freeplane/features/icon/IconMouseListener.java
new file mode 100644
index 0000000..fec9d4e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/IconMouseListener.java
@@ -0,0 +1,5 @@
+package org.freeplane.features.icon;
+
+public interface IconMouseListener {
+ boolean onIconClicked(final IconClickedEvent event);
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/IconNotFound.java b/freeplane/src/main/java/org/freeplane/features/icon/IconNotFound.java
new file mode 100644
index 0000000..d0a38f5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/IconNotFound.java
@@ -0,0 +1,42 @@
+package org.freeplane.features.icon;
+
+import java.net.URL;
+
+import javax.swing.ImageIcon;
+
+import org.freeplane.core.resources.ResourceController;
+
+public class IconNotFound extends MindIcon {
+ private static final String DEFAULT_IMAGE_PATH = "/images";
+// private static final IconNotFound ICON_NOT_FOUND = new IconNotFound();
+
+ public IconNotFound(final String originallyRequestedIconName) {
+ super(originallyRequestedIconName, "IconNotFound.png", "icon not found");
+ }
+
+ @Override
+ public String getImagePath() {
+ return DEFAULT_IMAGE_PATH;
+ }
+
+ /**
+ * creates an ImageIcon from <code>getImagePath()/filename</code>. If this is not possible returns an IconNotFound.
+ * THIS METHOD is USED for displaying add-on images, so there is not image 'name'.
+ */
+ public static ImageIcon createIconOrReturnNotFoundIcon(final String fileName) {
+ final URL resource = ResourceController.getResourceController()
+ .getResource(DEFAULT_IMAGE_PATH + "/" + fileName);
+ final ImageIcon icon = (resource == null) ? null : new ImageIcon(resource);
+ return icon == null ? (ImageIcon) new IconNotFound("?").getIcon() : icon;
+ }
+
+ /**
+ * creates an ImageIcon from <code>getImagePath()/filename</code>. If this is not possible returns null.
+ */
+ public static ImageIcon createIconOrReturnNull(final String fileName) {
+ final URL resource = ResourceController.getResourceController()
+ .getResource(DEFAULT_IMAGE_PATH + "/" + fileName);
+ return (resource == null) ? null : new ImageIcon(resource);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/IconRegistry.java b/freeplane/src/main/java/org/freeplane/features/icon/IconRegistry.java
new file mode 100644
index 0000000..243679f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/IconRegistry.java
@@ -0,0 +1,77 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import javax.swing.ListModel;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.util.collection.SortedComboBoxModel;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ *
+ * maintains a set of icons which currently are or have been
+ * used on the map during the last editing session. This information is
+ * used in IconConditionController calling IconRegistry.getIcons() to
+ * prepare values available in Filter Editor Dialog / find dialog when
+ * filter on icons is selected
+ *
+ * 03.01.2009
+ */
+public class IconRegistry implements IExtension {
+ final private SortedComboBoxModel mapIcons;
+
+ public IconRegistry(final MapController mapController, final MapModel map) {
+ super();
+ mapIcons = new SortedComboBoxModel();
+ final NodeModel rootNode = map.getRootNode();
+ if(rootNode != null)
+ registryNodeIcons(mapController, rootNode);
+ }
+
+ public void addIcon(final UIIcon icon) {
+ if(icon != null)
+ mapIcons.add(icon);
+ }
+
+ public ListModel getIconsAsListModel() {
+ return mapIcons;
+ }
+
+ private void registryNodeIcons(final MapController mapController, final NodeModel node) {
+ for (final MindIcon icon : node.getIcons()) {
+ addIcon(icon);
+ }
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ registryNodeIcons(mapController, child);
+ }
+ }
+
+ public void addIcons(final MapModel map) {
+ final IconRegistry newRegistry = map.getIconRegistry();
+ final SortedComboBoxModel newMapIcons = newRegistry.mapIcons;
+ for (final Object uiIcon : newMapIcons) {
+ mapIcons.add(uiIcon);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/IconStore.java b/freeplane/src/main/java/org/freeplane/features/icon/IconStore.java
new file mode 100644
index 0000000..4bbc659
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/IconStore.java
@@ -0,0 +1,146 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Tamas Eppel
+ *
+ * This file author is Tamas Eppel
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.icon.factory.MindIconFactory;
+
+/**
+ *
+ * Stores all kinds of icons used in Freeplane.
+ *
+ * @author Tamas Eppel
+ *
+ */
+public class IconStore {
+ private final Map<String, IconGroup> groups;
+ private final Map<String, MindIcon> mindIcons;
+ private final Map<String, UIIcon> uiIcons;
+
+ public IconStore() {
+ groups = new LinkedHashMap<String, IconGroup>();
+ mindIcons = new HashMap<String, MindIcon>();
+ uiIcons = new HashMap<String, UIIcon>();
+ }
+
+ /**
+ * Adds a new MindIcon group to the store.
+ *
+ * @param group
+ */
+ public void addGroup(final IconGroup group) {
+ groups.put(group.getName(), group);
+ for (final MindIcon icon : group.getIcons()) {
+ mindIcons.put(icon.getName(), icon);
+ }
+ }
+
+ /**
+ * Adds a new MindIcon to the group with the given name.
+ *
+ * @param groupName where to add the icon
+ * @param icon to add
+ */
+ public void addMindIcon(final String groupName, final MindIcon icon) {
+ if (!groups.containsKey(groupName)) {
+ final IconGroup group = new IconGroup(groupName, icon);
+ groups.put(groupName, group);
+ }
+ groups.get(groupName).addIcon(icon);
+ mindIcons.put(icon.getName(), icon);
+ }
+
+ public void addUIIcon(final UIIcon uiIcon) {
+ uiIcons.put(uiIcon.getFileName(), uiIcon);
+ }
+
+ /**
+ * @return all groups in the store
+ */
+ public Collection<IconGroup> getGroups() {
+ return groups.values();
+ }
+
+ /**
+ * @return all MindIcons from all groups in the store, including user icons
+ */
+ public Collection<MindIcon> getMindIcons() {
+ final List<MindIcon> icons = new ArrayList<MindIcon>();
+ for (final IconGroup group : groups.values()) {
+ icons.addAll(group.getIcons());
+ }
+ return icons;
+ }
+
+ /**
+ * @return all user icons in the store
+ */
+ public Collection<MindIcon> getUserIcons() {
+ return groups.get("user").getIcons();
+ }
+
+ /**
+ * @param name of MindIcon to return
+ * @return MindIcon with given name
+ */
+ public MindIcon getMindIcon(final String name) {
+ if(name == null){
+ return new IconNotFound(name);
+ }
+ if (mindIcons.containsKey(name)) {
+ return mindIcons.get(name);
+ }
+ // icons in directory /image are not registered
+ final MindIcon mindIcon = MindIconFactory.create(name);
+ if (ResourceController.getResourceController().getResource(mindIcon.getPath()) != null) {
+ return mindIcon;
+ }
+ return new IconNotFound(name);
+ }
+
+ /**
+ * Returns a UIIcon with a given name. If one is not found in the store,
+ * it will be created and stored.
+ *
+ * @param name of UIIcon to return
+ * @return UIIcon with given name
+ */
+ public UIIcon getUIIcon(final String name) {
+ UIIcon result;
+ if (mindIcons.containsKey(name)) {
+ result = mindIcons.get(name);
+ }
+ else if (uiIcons.containsKey(name)) {
+ result = uiIcons.get(name);
+ }
+ else {
+ result = new UIIcon(name, name);
+ uiIcons.put(name, result);
+ }
+ return result;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/MindIcon.java b/freeplane/src/main/java/org/freeplane/features/icon/MindIcon.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/icon/MindIcon.java
rename to freeplane/src/main/java/org/freeplane/features/icon/MindIcon.java
diff --git a/freeplane/src/org/freeplane/features/icon/PriorityCompareCondition.java b/freeplane/src/main/java/org/freeplane/features/icon/PriorityCompareCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/icon/PriorityCompareCondition.java
rename to freeplane/src/main/java/org/freeplane/features/icon/PriorityCompareCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/PriorityConditionController.java b/freeplane/src/main/java/org/freeplane/features/icon/PriorityConditionController.java
new file mode 100644
index 0000000..c273d06
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/PriorityConditionController.java
@@ -0,0 +1,135 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+class PriorityConditionController implements IElementaryConditionController {
+ static final String FILTER_PRIORITY = "filter_priority";
+ private static final IconStore STORE = IconStoreFactory.create();
+
+ public PriorityConditionController() {
+ super();
+ }
+
+ public boolean canEditValues(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ return namedObject.objectEquals(PriorityConditionController.FILTER_PRIORITY);
+ }
+
+ public boolean canSelectValues(final Object property, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCondition,
+ final Object valueObj, final boolean matchCase,
+ final boolean matchApproximately) {
+ final String value = ((MindIcon) valueObj).getName().substring(5, 6);
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
+ return new PriorityCompareCondition(value, 0, true);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
+ return new PriorityCompareCondition(value, 0, false);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
+ return new PriorityCompareCondition(value, 1, true);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
+ return new PriorityCompareCondition(value, -1, false);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
+ return new PriorityCompareCondition(value, -1, true);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
+ return new PriorityCompareCondition(value, 1, false);
+ }
+ return null;
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object selectedItem) {
+ return new DefaultComboBoxModel(new TranslatedObject[] {
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_NOT_EQUAL_TO),
+ TranslatedObject.literal(ConditionFactory.FILTER_GT), TranslatedObject.literal(ConditionFactory.FILTER_GE),
+ TranslatedObject.literal(ConditionFactory.FILTER_LE), TranslatedObject.literal(ConditionFactory.FILTER_LT), });
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(FILTER_PRIORITY));
+ return list;
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ return null;
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object property, TranslatedObject simpleCond) {
+ final Object[] items = new Object[10];
+ for (int i = 1; i < 10; ++i) {
+ items[i - 1] = STORE.getMindIcon("full-" + Integer.toString(i));
+ }
+ final ComboBoxModel box = new DefaultComboBoxModel(items);
+ return box;
+ }
+
+ public boolean isCaseDependent(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ if (element.getName().equalsIgnoreCase(PriorityCompareCondition.NAME)) {
+ return PriorityCompareCondition.load(element);
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/UIIcon.java b/freeplane/src/main/java/org/freeplane/features/icon/UIIcon.java
new file mode 100644
index 0000000..2b94193
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/UIIcon.java
@@ -0,0 +1,188 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Tamas Eppel
+ *
+ * This file author is Tamas Eppel
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import java.net.URL;
+import java.util.regex.Pattern;
+
+import javax.swing.Icon;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.factory.ImageIconFactory;
+
+/**
+ * Base class for all icons used in FreePlane.
+ *
+ * @author Tamas Eppel
+ *
+ */
+public class UIIcon implements IIconInformation, Comparable<UIIcon> {
+ private static final String DEFAULT_IMAGE_PATH = "/images";
+ protected static final String SEPARATOR = "/";
+ protected static final String THEME_FOLDER_KEY = "icon.theme.folder";
+ protected static final ResourceController RESOURCE_CONTROLLER = ResourceController.getResourceController();
+ private static final Pattern parentDirPattern = Pattern.compile(SEPARATOR + "[^" + SEPARATOR + ".]+" + SEPARATOR
+ + "\\.\\." + SEPARATOR);
+ private final String name;
+ private final String fileName;
+ private final String translationKeyLabel;
+ private final String shortcutKey;
+ private URL resourceURL;
+
+ public UIIcon(final String name, final String fileName) {
+ this(name, fileName, "", "?");
+ }
+
+ public UIIcon(final String name, final String fileName, final String translationKeyLabel) {
+ this(name, fileName, translationKeyLabel, "?");
+ }
+
+ public UIIcon(final String name, final String fileName, final String translationKeyLabel, final String shortcutKey) {
+ this.name = name;
+ this.fileName = fileName;
+ this.translationKeyLabel = translationKeyLabel;
+ this.shortcutKey = shortcutKey;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ /**
+ * @return key for the shortcut in the property file
+ */
+ public String getShortcutKey() {
+ return shortcutKey;
+ }
+
+ public String getTranslationKeyLabel() {
+ return translationKeyLabel;
+ }
+
+ public String getTranslationValueLabel() {
+ return TextUtils.getText(translationKeyLabel, "");
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Icon getIcon() {
+ return ImageIconFactory.getInstance().getImageIcon(this);
+ }
+
+ public KeyStroke getKeyStroke() {
+ return null;
+ }
+
+ public String getImagePath() {
+ return DEFAULT_IMAGE_PATH;
+ }
+
+ public URL getUrl() {
+ if (resourceURL != null) {
+ return resourceURL;
+ }
+ final String path = getPath();
+ resourceURL = RESOURCE_CONTROLLER.getResource(path);
+ return resourceURL;
+ }
+
+ public String getPath() {
+ StringBuilder builder = new StringBuilder();
+ builder = new StringBuilder();
+ builder.append(this.getImagePath());
+ builder.append(SEPARATOR);
+ builder.append(fileName);
+ final String path = parentDirPattern.matcher(builder.toString()).replaceFirst(SEPARATOR);
+ return path;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((translationKeyLabel == null) ? 0 : translationKeyLabel.hashCode());
+ result = prime * result + ((fileName == null) ? 0 : fileName.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + ((shortcutKey == null) ? 0 : shortcutKey.hashCode());
+ result = prime * result + this.getClass().hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (this.getClass() != obj.getClass()) {
+ return false;
+ }
+ final UIIcon other = (UIIcon) obj;
+ if (translationKeyLabel == null) {
+ if (other.translationKeyLabel != null) {
+ return false;
+ }
+ }
+ else if (!translationKeyLabel.equals(other.translationKeyLabel)) {
+ return false;
+ }
+ if (fileName == null) {
+ if (other.fileName != null) {
+ return false;
+ }
+ }
+ else if (!fileName.equals(other.fileName)) {
+ return false;
+ }
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ }
+ else if (!name.equals(other.name)) {
+ return false;
+ }
+ if (shortcutKey == null) {
+ if (other.shortcutKey != null) {
+ return false;
+ }
+ }
+ else if (!shortcutKey.equals(other.shortcutKey)) {
+ return false;
+ }
+ return true;
+ }
+
+ public int compareTo(final UIIcon uiIcon) {
+ return this.getPath().compareTo(uiIcon.getPath());
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/UIIconSet.java b/freeplane/src/main/java/org/freeplane/features/icon/UIIconSet.java
new file mode 100644
index 0000000..ff20f3b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/UIIconSet.java
@@ -0,0 +1,94 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Tamas Eppel
+ *
+ * This file author is Tamas Eppel
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.Icon;
+
+import org.freeplane.core.ui.components.MultipleImage;
+
+public class UIIconSet extends UIIcon {
+ final Collection<UIIcon> uiIcons;
+ final float zoom;
+
+ public Collection<UIIcon> getIcons() {
+ return uiIcons;
+ }
+
+ List<UIIcon> imageIcons;
+ private MultipleImage compoundIcon;
+
+ public UIIconSet(final Collection<UIIcon> uiIcons, final float zoom) {
+ super("", "");
+ this.zoom = zoom;
+ this.uiIcons = Collections.unmodifiableCollection(uiIcons);
+ imageIcons = new LinkedList<UIIcon>();
+ for (final UIIcon uiIcon : uiIcons) {
+ final UIIcon icon;
+ if (zoom == 1f) {
+ icon = uiIcon;
+ }
+ else {
+ icon = new ZoomedIcon(uiIcon, zoom);
+ }
+ imageIcons.add(icon);
+ }
+ }
+
+ @Override
+ public Icon getIcon() {
+ if (compoundIcon == null) {
+ compoundIcon = new MultipleImage();
+ for (final UIIcon icon : imageIcons) {
+ compoundIcon.addIcon(icon);
+ }
+ }
+ return compoundIcon;
+ }
+
+ @Override
+ public int compareTo(final UIIcon uiIcon) {
+ return 1;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (this.getClass() != obj.getClass()) {
+ return false;
+ }
+ final UIIconSet uiIconSet = (UIIconSet) obj;
+ return zoom == uiIconSet.zoom && uiIcons.equals(uiIconSet.uiIcons);
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * uiIcons.hashCode();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/UserIcon.java b/freeplane/src/main/java/org/freeplane/features/icon/UserIcon.java
new file mode 100644
index 0000000..039adf0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/UserIcon.java
@@ -0,0 +1,72 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Tamas Eppel
+ *
+ * This file author is Tamas Eppel
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+
+/**
+ *
+ * Represents all icons used in Freeplane
+ *
+ * @author Tamas Eppel
+ *
+ */
+public class UserIcon extends MindIcon {
+ public UserIcon(final String name, final String fileName, final String description) {
+ super(name, fileName, description);
+ }
+
+ @Override
+ public String getPath() {
+ final StringBuilder builder = new StringBuilder();
+ builder.append(ResourceController.getResourceController().getFreeplaneUserDirectory());
+ builder.append(SEPARATOR);
+ builder.append("icons");
+ builder.append(SEPARATOR);
+ builder.append(this.getFileName());
+ final String path = builder.toString().replace(File.separatorChar, '/');
+ return path;
+ }
+
+ @Override
+ public URL getUrl() {
+ URL result = null;
+ final String urlString = getPath();
+ try {
+ result = new File(urlString).toURI().toURL();
+ }
+ catch (final MalformedURLException e) {
+ LogUtils.warn(String.format("could not create URL from [%s]", urlString));
+ }
+ return result;
+ }
+
+ @Override
+ public String getTranslationValueLabel() {
+ return getTranslationKeyLabel();
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/ZoomedIcon.java b/freeplane/src/main/java/org/freeplane/features/icon/ZoomedIcon.java
new file mode 100644
index 0000000..4054ccc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/ZoomedIcon.java
@@ -0,0 +1,90 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Tamas Eppel
+ *
+ * This file author is Tamas Eppel
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon;
+
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+
+public class ZoomedIcon extends UIIcon {
+ final static private Map<UIIcon, Map<Float, ImageIcon>> zoomedIcons = new HashMap<UIIcon, Map<Float, ImageIcon>>();
+ private final UIIcon uiIcon;
+ private final float zoom;
+ private ImageIcon zoomedIcon;
+
+ public ZoomedIcon(final UIIcon uiIcon, final float zoom) {
+ super(uiIcon.getName(), uiIcon.getFileName(), uiIcon.getTranslationValueLabel(), uiIcon.getShortcutKey());
+ this.uiIcon = uiIcon;
+ this.zoom = zoom;
+ }
+
+ @Override
+ public Icon getIcon() {
+ if (zoomedIcon == null) {
+ Map<Float, ImageIcon> icons = zoomedIcons.get(uiIcon);
+ if (icons == null) {
+ icons = new HashMap<Float, ImageIcon>();
+ zoomedIcons.put(uiIcon, icons);
+ }
+ zoomedIcon = icons.get(zoom);
+ if (zoomedIcon != null) {
+ return zoomedIcon;
+ }
+ final Icon icon = uiIcon.getIcon();
+ final int width = icon.getIconWidth();
+ final int height = icon.getIconHeight();
+ final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+ final Graphics2D g = image.createGraphics();
+ icon.paintIcon(null, g, 0, 0);
+ final Image scaledImage = image.getScaledInstance((int) (width * zoom), (int) (height * zoom),
+ Image.SCALE_SMOOTH);
+ zoomedIcon = new ImageIcon(scaledImage);
+ icons.put(zoom, zoomedIcon);
+ g.dispose();
+ }
+ return zoomedIcon;
+ }
+
+ @Override
+ public String getPath() {
+ return uiIcon.getPath();
+ }
+
+ @Override
+ public URL getUrl() {
+ return uiIcon.getUrl();
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ return super.equals(obj) && zoom == ((ZoomedIcon) obj).zoom;
+ }
+
+ @Override
+ public int hashCode() {
+ return 31 * super.hashCode() + Float.valueOf(zoom).hashCode();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/factory/IconStoreFactory.java b/freeplane/src/main/java/org/freeplane/features/icon/factory/IconStoreFactory.java
new file mode 100644
index 0000000..28ffb75
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/factory/IconStoreFactory.java
@@ -0,0 +1,155 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Tamas Eppel
+ *
+ * This file author is Tamas Eppel
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon.factory;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.IconGroup;
+import org.freeplane.features.icon.IconNotFound;
+import org.freeplane.features.icon.IconStore;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.icon.UserIcon;
+
+/**
+ *
+ * Factory for IconStore objects.
+ *
+ * @author Tamas Eppel
+ *
+ */
+public class IconStoreFactory {
+ private static final String SEPARATOR = ";";
+ private static final ResourceController RESOURCE_CONTROLLER = ResourceController.getResourceController();
+ private static final String GROUP_NAMES_KEY = "icons.groups";
+ private static final String GROUP_KEY = "icons.group.%s";
+ private static final String GROUP_ICON_KEY = "IconGroupPopupAction.%s.icon";
+ private static final String GROUP_DESC_KEY = "IconGroupPopupAction.%s.text";
+ private static IconStore groups;
+
+ /**
+ *
+ * Creates an IconStore from the property file. If one was already
+ * constructed it will be returned without creating a new one.
+ *
+ * @return
+ */
+ public static IconStore create() {
+ if (groups != null) {
+ return groups;
+ }
+ groups = new IconStore();
+ IconStoreFactory.setIconGroups(groups);
+ return groups;
+ }
+
+ private static void setIconGroups(final IconStore iconStore) {
+ final String[] groupNames = RESOURCE_CONTROLLER.getProperty(GROUP_NAMES_KEY).split(SEPARATOR);
+ for (final String groupName : groupNames) {
+ final String description = TextUtils.getText(String.format(GROUP_DESC_KEY, groupName));
+ List<MindIcon> icons;
+ UIIcon groupIcon = null;
+ if ("user".equals(groupName)) {
+ icons = IconStoreFactory.getUserIcons();
+ groupIcon = MindIconFactory.create("user_icon");
+ }
+ else {
+ final String groupIconName = RESOURCE_CONTROLLER.getProperty(String.format(GROUP_ICON_KEY, groupName));
+ final Map<String, MindIcon> iconMap = IconStoreFactory.getIcons(groupName);
+ groupIcon = iconMap.get(groupIconName);
+ icons = new ArrayList<MindIcon>(iconMap.values());
+ }
+ if (groupIcon == null) {
+ groupIcon = icons.size() > 0 ? icons.get(0) : new IconNotFound("?");
+ }
+ iconStore.addGroup(new IconGroup(groupName, groupIcon, description, icons));
+ }
+ }
+
+ private static Map<String, MindIcon> getIcons(final String groupName) {
+ final String[] iconNames = RESOURCE_CONTROLLER.getProperty(String.format(GROUP_KEY, groupName))
+ .split(SEPARATOR);
+ final Map<String, MindIcon> icons = new LinkedHashMap<String, MindIcon>(iconNames.length);
+ for (final String iconName : iconNames) {
+ final MindIcon icon = MindIconFactory.create(iconName);
+ icons.put(iconName, icon);
+ }
+ return icons;
+ }
+
+ private static List<MindIcon> getUserIcons() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ if (resourceController.isApplet()) {
+ return Collections.emptyList();
+ }
+ final File iconDir = new File(resourceController.getFreeplaneUserDirectory(), "icons");
+ if (!iconDir.exists()) {
+ LogUtils.info("creating user icons directory " + iconDir);
+ iconDir.mkdirs();
+ return Collections.emptyList();
+ }
+ return IconStoreFactory.getUserIcons(iconDir, "");
+ }
+
+ private static List<MindIcon> getUserIcons(final File iconDir, final String dir) {
+ final String[] userIconArray = iconDir.list(new FilenameFilter() {
+ public boolean accept(final File dir, final String name) {
+ final int nameLength = name.length();
+ return nameLength > 4 && name.substring(nameLength - 4).equalsIgnoreCase(".png") || new File(dir, name).isDirectory();
+ }
+ });
+ if (userIconArray == null) {
+ return Collections.emptyList();
+ }
+ final List<MindIcon> icons = new ArrayList<MindIcon>(userIconArray.length);
+ for (final String fileName : userIconArray) {
+ final File childDir = new File(iconDir, fileName);
+ if (childDir.isDirectory()) {
+ final String fullName = dir + fileName;
+ final List<MindIcon> childUserIcons = IconStoreFactory.getUserIcons(childDir, fullName + '/');
+ icons.addAll(childUserIcons);
+ }
+ }
+ for (final String fileName : userIconArray) {
+ final File childDir = new File(iconDir, fileName);
+ final String fullName = dir + fileName;
+ if (childDir.isDirectory()) {
+ continue;
+ }
+ final String iconName = fullName.substring(0, fullName.length() - 4);
+ final String iconDescription = fileName.substring(0, fileName.length() - 4);
+ if (iconName.equals("")) {
+ continue;
+ }
+ final UserIcon icon = new UserIcon(iconName, fullName, iconDescription);
+ icons.add(icon);
+ }
+ return icons;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/icon/factory/ImageIconFactory.java b/freeplane/src/main/java/org/freeplane/features/icon/factory/ImageIconFactory.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/icon/factory/ImageIconFactory.java
rename to freeplane/src/main/java/org/freeplane/features/icon/factory/ImageIconFactory.java
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/factory/MindIconFactory.java b/freeplane/src/main/java/org/freeplane/features/icon/factory/MindIconFactory.java
new file mode 100644
index 0000000..bc599ff
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/factory/MindIconFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Tamas Eppel
+ *
+ * This file author is Tamas Eppel
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon.factory;
+
+import org.freeplane.features.icon.MindIcon;
+
+/**
+ * @author Tamas Eppel
+ */
+public class MindIconFactory {
+ private static final String DESC_KEY = "icon_%s";
+
+ /**
+ * Constructs a MindIcon with the given name from the property file.
+ * The name of the icon is the file name without the extension.
+ */
+ public static MindIcon create(final String name) {
+ final String translationKeyLabel = name.indexOf('/') > 0 ? "" : String.format(DESC_KEY, name);
+ return new MindIcon(name, name + ".png", translationKeyLabel);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/IconAction.java b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/IconAction.java
new file mode 100644
index 0000000..89f9a1b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/IconAction.java
@@ -0,0 +1,79 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.icon.IIconInformation;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.icon.factory.ImageIconFactory;
+import org.freeplane.features.map.NodeModel;
+
+class IconAction extends AMultipleNodeAction implements IIconInformation {
+
+ private static final long serialVersionUID = 1L;
+ final private MindIcon icon;
+
+ public IconAction( final MindIcon _icon) {
+ super("IconAction." + _icon.getName(), _icon.getTranslationValueLabel(), ImageIconFactory.getInstance()
+ .getImageIcon(_icon));
+ icon = _icon;
+ putValue(Action.SHORT_DESCRIPTION, getTranslationValueLabel());
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e, final NodeModel node) {
+ ((MIconController) IconController.getController()).addIcon(node, icon);
+ }
+
+ public String getTranslationKeyLabel() {
+ return icon.getTranslationKeyLabel();
+ }
+
+ public String getTranslationValueLabel() {
+ return icon.getTranslationValueLabel();
+ }
+
+ public Icon getIcon() {
+ return ImageIconFactory.getInstance().getImageIcon(icon);
+ }
+
+ public KeyStroke getKeyStroke() {
+ final String keystrokeResourceName = icon.getShortcutKey();
+ final String keyStrokeDescription = ResourceController.getResourceController().getProperty(keystrokeResourceName);
+ return UITools.getKeyStroke(keyStrokeDescription);
+ }
+
+ public MindIcon getMindIcon() {
+ return icon;
+ }
+
+ public String getShortcutKey() {
+ return icon.getShortcutKey();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/IconSelectionPlugin.java b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/IconSelectionPlugin.java
new file mode 100644
index 0000000..2f545a8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/IconSelectionPlugin.java
@@ -0,0 +1,84 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+
+import javax.swing.Action;
+import javax.swing.ListModel;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.IconSelectionPopupDialog;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.icon.IIconInformation;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.IconRegistry;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author adapted to the plugin mechanism by ganzer
+ */
+public class IconSelectionPlugin extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public IconSelectionPlugin() {
+ super("IconSelectionPlugin");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ ArrayList<IIconInformation> actions = new ArrayList<IIconInformation>();
+
+ final Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final IconRegistry iconRegistry = map.getIconRegistry();
+ final ListModel usedIcons = iconRegistry.getIconsAsListModel();
+ for(int i = 0; i < usedIcons.getSize(); i++){
+ final Object icon = usedIcons.getElementAt(i);
+ if(icon instanceof MindIcon){
+ actions.add(new IconAction((MindIcon) icon));
+ }
+ }
+
+ final MIconController mIconController = (MIconController) IconController.getController();
+ for (AFreeplaneAction aFreeplaneAction : mIconController.getIconActions())
+ actions.add((IIconInformation) aFreeplaneAction);
+
+ actions.add((IIconInformation) modeController.getAction("RemoveIcon_0_Action"));
+ actions.add((IIconInformation) modeController.getAction("RemoveIconAction"));
+ actions.add((IIconInformation) modeController.getAction("RemoveAllIconsAction"));
+
+ final IconSelectionPopupDialog selectionDialog = new IconSelectionPopupDialog(UITools.getCurrentFrame(), actions);
+ final NodeModel selected = controller.getSelection().getSelected();
+ controller.getMapViewManager().scrollNodeToVisible(selected);
+ selectionDialog.pack();
+ UITools.setDialogLocationRelativeTo(selectionDialog, selected);
+ selectionDialog.setModal(true);
+ selectionDialog.show();
+ final int result = selectionDialog.getResult();
+ if (result >= 0) {
+ final Action action = (Action) actions.get(result);
+ action.actionPerformed(new ActionEvent(action, 0, NodeModel.NODE_ICON, selectionDialog.getModifiers()));
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/MIconController.java b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/MIconController.java
new file mode 100644
index 0000000..ba618a0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/MIconController.java
@@ -0,0 +1,432 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.Insets;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.JComponent;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JToolBar;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.IPropertyControl;
+import org.freeplane.core.resources.components.IPropertyControlCreator;
+import org.freeplane.core.resources.components.KeyProperty;
+import org.freeplane.core.resources.components.OptionPanelBuilder;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IndexedTree;
+import org.freeplane.core.ui.MenuSplitter;
+import org.freeplane.core.ui.components.FreeplaneToolBar;
+import org.freeplane.core.ui.components.JAutoScrollBarPane;
+import org.freeplane.core.ui.components.JResizer.Direction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.features.icon.IIconInformation;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.IconGroup;
+import org.freeplane.features.icon.IconStore;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.IExtensionCopier;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.ui.CollapseableBoxBuilder;
+import org.freeplane.features.ui.FrameController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MIconController extends IconController {
+ private final class IconActionBuilder implements EntryVisitor {
+ private final HashMap<String, Entry> submenuEntries = new HashMap<String, Entry>();
+ final private ModeController modeController;
+
+ public IconActionBuilder(ModeController modeController) {
+ this.modeController = modeController;
+ }
+
+ @Override
+ public void visit(Entry target) {
+ addIcons(target);
+ submenuEntries.clear();
+ updateIconToolbar(modeController);
+ }
+
+ private void addIcons(final Entry target) {
+ for (final IconGroup iconGroup : STORE.getGroups()) {
+ addIconGroup(target, iconGroup);
+ }
+ }
+
+ private void addIconGroup(final Entry target, final IconGroup group) {
+ if (group.getIcons().size() < 1) {
+ return;
+ }
+ final Entry item = new Entry();
+ EntryAccessor entryAccessor = new EntryAccessor();
+ entryAccessor.setIcon(item, group.getGroupIcon().getIcon());
+ entryAccessor.setText(item, group.getDescription());
+ target.addChild(item);
+ for (final MindIcon icon : group.getIcons()) {
+ final String fileName = icon.getFileName();
+ addAction(item, "", icon, fileName);
+ }
+ }
+
+ private void addAction(final Entry target, final String itemKey, final MindIcon icon,
+ final String fileName) {
+ final int separatorPosition = fileName.indexOf('/');
+ EntryAccessor entryAccessor = new EntryAccessor();
+ if (separatorPosition == -1) {
+ entryAccessor.addChildAction(target, iconActions.get(icon));
+ }
+ else {
+ final String submenuName = fileName.substring(0, separatorPosition);
+ final String submenuKey = itemKey + "/" + submenuName;
+ Entry submenu = submenuEntries.get(submenuKey);
+ if (submenu == null) {
+ submenu = new Entry();
+ entryAccessor.setText(submenu, submenuName);
+ submenuEntries.put(submenuKey, submenu);
+ target.addChild(submenu);
+ }
+ addAction(submenu, submenuKey, icon, fileName.substring(separatorPosition + 1));
+ }
+ }
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+ }
+
+ public static enum Keys {
+ ICONS
+ };
+
+ private static class ExtensionCopier implements IExtensionCopier {
+ public void copy(final Object key, final NodeModel from, final NodeModel to) {
+ if (!key.equals(Keys.ICONS)) {
+ return;
+ }
+ copy(from, to);
+ }
+
+ public void copy(final NodeModel from, final NodeModel to) {
+ final List<MindIcon> sourceIcons = from.getIcons();
+ final List<MindIcon> targetIcons = to.getIcons();
+ for (final MindIcon icon : sourceIcons) {
+ if (targetIcons.contains(icon)) {
+ continue;
+ }
+ to.addIcon(icon);
+ }
+ }
+
+ public void remove(final Object key, final NodeModel from) {
+ if (!key.equals(Keys.ICONS)) {
+ return;
+ }
+ while (from.removeIcon() > 0) {
+ ;
+ }
+ }
+
+ public void remove(final Object key, final NodeModel from, final NodeModel which) {
+ if (!key.equals(Keys.ICONS)) {
+ return;
+ }
+ final List<MindIcon> targetIcons = from.getIcons();
+ final List<MindIcon> whichIcons = which.getIcons();
+ final Iterator<MindIcon> targetIconIterator = targetIcons.iterator();
+ while (targetIconIterator.hasNext()) {
+ MindIcon icon = targetIconIterator.next();
+ if (!whichIcons.contains(icon)) {
+ continue;
+ }
+ targetIconIterator.remove();
+ }
+ }
+ public void resolveParentExtensions(Object key, NodeModel to) {
+ }
+ }
+
+ private final Map<MindIcon, AFreeplaneAction> iconActions = new LinkedHashMap<MindIcon, AFreeplaneAction>();
+ private final IconStore STORE = IconStoreFactory.create();
+ private final JToolBar iconToolBar;
+ private final Box iconBox;
+
+ /**
+ * @param modeController
+ */
+ public MIconController(final ModeController modeController) {
+ super(modeController);
+ modeController.registerExtensionCopier(new ExtensionCopier());
+ iconToolBar = new FreeplaneToolBar("icon_toolbar", SwingConstants.VERTICAL);
+ JAutoScrollBarPane iconToolBarScrollPane = new JAutoScrollBarPane(iconToolBar);
+ UITools.setScrollbarIncrement(iconToolBarScrollPane);
+ UITools.addScrollbarIncrementPropertyListener(iconToolBarScrollPane);
+ FrameController frameController = (FrameController) modeController.getController().getViewController();
+ iconBox = new CollapseableBoxBuilder(frameController).setPropertyNameBase("leftToolbarVisible").setResizeable(false).createBox(iconToolBarScrollPane, Direction.LEFT);
+ createIconActions(modeController);
+ createPreferences();
+ modeController.addUiBuilder(Phase.ACTIONS, "icon_actions", new IconActionBuilder(modeController));
+ }
+
+ public void addIcon(final NodeModel node, final MindIcon icon) {
+ final IActor actor = new IActor() {
+ public void act() {
+ node.addIcon(icon);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, null, icon);
+ }
+
+ public String getDescription() {
+ return "addIcon";
+ }
+
+ public void undo() {
+ node.removeIcon();
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, icon, null);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ public void addIcon(final NodeModel node, final MindIcon icon, final int position) {
+ final IActor actor = new IActor() {
+ public void act() {
+ node.addIcon(icon, position);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, null, icon);
+ }
+
+ public String getDescription() {
+ return "addIcon";
+ }
+
+ public void undo() {
+ node.removeIcon(position);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, icon, null);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ private void createIconActions(final ModeController modeController) {
+ modeController.addAction(new RemoveIconAction(0));
+ modeController.addAction(new RemoveIconAction(-1));
+ modeController.addAction(new RemoveAllIconsAction());
+ for (final MindIcon icon : STORE.getMindIcons()) {
+ final IconAction myAction = new IconAction(icon);
+ modeController.addActionIfNotAlreadySet(myAction);
+ iconActions.put(icon, myAction);
+ }
+ }
+
+ private void createPreferences() {
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ final OptionPanelBuilder optionPanelBuilder = modeController.getOptionPanelBuilder();
+ final List<AFreeplaneAction> actions = new ArrayList<AFreeplaneAction>();
+ actions.addAll(iconActions.values());
+ actions.add(modeController.getAction("RemoveIcon_0_Action"));
+ actions.add(modeController.getAction("RemoveIconAction"));
+ actions.add(modeController.getAction("RemoveAllIconsAction"));
+
+ for (final AFreeplaneAction iconAction : actions) {
+ final IIconInformation info = (IIconInformation) iconAction;
+ optionPanelBuilder.addCreator("Keystrokes/icons", new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ final KeyProperty keyProperty = new KeyProperty(info.getShortcutKey(), info.getTranslationValueLabel());
+ keyProperty.setImageIcon(info.getIcon());
+ keyProperty.disableModifiers();
+ return keyProperty;
+ }
+ }, IndexedTree.AS_CHILD);
+ }
+ }
+
+ public Collection<AFreeplaneAction> getIconActions() {
+ return Collections.unmodifiableCollection(iconActions.values());
+ }
+
+ /**
+ * @return
+ */
+ public JComponent getIconToolBarScrollPane() {
+ return iconBox;
+ }
+
+ public Collection<MindIcon> getMindIcons() {
+ final List<MindIcon> iconInfoList = new ArrayList<MindIcon>();
+ final Collection<AFreeplaneAction> iconActions = getIconActions();
+ for (final Action action : iconActions) {
+ final MindIcon info = ((IconAction) action).getMindIcon();
+ iconInfoList.add(info);
+ }
+ return iconInfoList;
+ }
+
+ private JMenu getSubmenu( final IconGroup group) {
+ final JMenu menu = new JMenu("\u25ba") {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected Point getPopupMenuOrigin() {
+ return new Point(getWidth(), 0);
+ }
+ };
+ menu.setFont(menu.getFont().deriveFont(8F));
+ menu.setMargin(new Insets(0, 0, 0, 0));
+ menu.setIcon(group.getGroupIcon().getIcon());
+ for (final MindIcon icon : group.getIcons()) {
+ addActionToIconSubmenu(menu, icon, icon.getFileName());
+ }
+ menu.setToolTipText(group.getDescription());
+ return menu;
+ }
+
+ private void addActionToIconSubmenu(final JMenu menu, final MindIcon icon, final String fileName) {
+ final AFreeplaneAction myAction = iconActions.get(icon);
+ final int separatorPosition = fileName.indexOf('/');
+ if (separatorPosition == -1) {
+ new MenuSplitter().addMenuComponent(menu, new JMenuItem(myAction), menu.getItemCount());
+ return;
+ }
+ final String submenuName = fileName.substring(0, separatorPosition);
+ final int componentCount = menu.getItemCount();
+ if (componentCount != 0) {
+ final Component lastComponent = menu.getMenuComponent(componentCount - 1);
+ if (lastComponent instanceof JMenu) {
+ final JMenu lastSubmenu = (JMenu) lastComponent;
+ if (lastSubmenu.getText().equals(submenuName)) {
+ addActionToIconSubmenu(lastSubmenu, icon, fileName.substring(separatorPosition + 1));
+ return;
+ }
+ }
+ }
+ final JMenu submenu = new JMenu(submenuName);
+ menu.add(submenu);
+ addActionToIconSubmenu(submenu, icon, fileName.substring(separatorPosition + 1));
+ }
+
+ private void insertSubmenus(final JToolBar iconToolBar) {
+ final JMenuBar iconMenuBar = new JMenuBar() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Dimension getMaximumSize() {
+ final Dimension preferredSize = getPreferredSize();
+ return new Dimension(Short.MAX_VALUE, preferredSize.height);
+ }
+ };
+ iconMenuBar.setAlignmentX(JComponent.CENTER_ALIGNMENT);
+ iconMenuBar.setLayout(new GridLayout(0, 1));
+ for (final IconGroup iconGroup : STORE.getGroups()) {
+ iconMenuBar.add(getSubmenu(iconGroup));
+ }
+ iconToolBar.add(iconMenuBar);
+ }
+
+ public void removeAllIcons(final NodeModel node) {
+ final int size = node.getIcons().size();
+ final MIconController iconController = (MIconController) IconController.getController();
+ for (int i = 0; i < size; i++) {
+ iconController.removeIcon(node, 0);
+ }
+ }
+
+ public int removeIcon(final NodeModel node) {
+ return removeIcon(node, -1);
+ }
+
+ public int removeIcon(final NodeModel node, final int position) {
+ final int size = node.getIcons().size();
+ final int index = position >= 0 ? position : size + position;
+ if (size == 0 || size <= index) {
+ return size;
+ }
+ final IActor actor = new IActor() {
+ private final MindIcon icon = node.getIcon(index);
+
+ public void act() {
+ node.removeIcon(index);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, icon, null);
+ }
+
+ public String getDescription() {
+ return "removeIcon";
+ }
+
+ public void undo() {
+ node.addIcon(icon, index);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, null, icon);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ return node.getIcons().size();
+ }
+
+ private void updateIconToolbar(ModeController modeController) {
+ iconToolBar.removeAll();
+ iconToolBar.add(modeController.getAction("RemoveIcon_0_Action"))
+ .setAlignmentX(JComponent.CENTER_ALIGNMENT);
+ iconToolBar.add(modeController.getAction("RemoveIconAction")).setAlignmentX(JComponent.CENTER_ALIGNMENT);
+ iconToolBar.add(modeController.getAction("RemoveAllIconsAction")).setAlignmentX(
+ JComponent.CENTER_ALIGNMENT);
+ iconToolBar.addSeparator();
+ if (ResourceController.getResourceController().getBooleanProperty("structured_icon_toolbar")) {
+ insertSubmenus(iconToolBar);
+ return;
+ }
+ final String[] fpIcons = ResourceController.getResourceController().getProperty("icons.list").split(";");
+ for (final String icon : fpIcons) {
+ final MindIcon mindIcon = STORE.getMindIcon(icon);
+ final AFreeplaneAction iconAction = iconActions.get(mindIcon);
+ iconToolBar.add(iconAction).setAlignmentX(JComponent.CENTER_ALIGNMENT);
+ }
+ final Collection<MindIcon> userIcons = STORE.getUserIcons();
+ for (final MindIcon icon : userIcons) {
+ final AFreeplaneAction iconAction = iconActions.get(icon);
+ iconToolBar.add(iconAction).setAlignmentX(JComponent.CENTER_ALIGNMENT);
+ }
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/RemoveAllIconsAction.java b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/RemoveAllIconsAction.java
new file mode 100644
index 0000000..1deaeb9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/RemoveAllIconsAction.java
@@ -0,0 +1,73 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.icon.IIconInformation;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author foltin
+ */
+class RemoveAllIconsAction extends AMultipleNodeAction implements IIconInformation {
+
+ private static final long serialVersionUID = 1L;
+
+ public RemoveAllIconsAction() {
+ super("RemoveAllIconsAction");
+ putValue(Action.SHORT_DESCRIPTION, getTranslationValueLabel());
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final MIconController iconController = (MIconController) IconController.getController();
+ iconController.removeAllIcons(node);
+ }
+
+ public String getTranslationKeyLabel() {
+ return null;
+ }
+
+ public String getTranslationValueLabel() {
+ return (String) getValue(Action.NAME);
+ }
+
+ public Icon getIcon() {
+ return (ImageIcon) getValue(Action.SMALL_ICON);
+ }
+
+ public KeyStroke getKeyStroke() {
+ return UITools.getKeyStroke(ResourceController.getResourceController().getProperty(getShortcutKey()));
+ }
+
+ public String getShortcutKey() {
+ return getKey() + ".shortcut";
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/RemoveIconAction.java b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/RemoveIconAction.java
new file mode 100644
index 0000000..b6ef1cf
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/icon/mindmapmode/RemoveIconAction.java
@@ -0,0 +1,76 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.icon.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.icon.IIconInformation;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author foltin
+ */
+class RemoveIconAction extends AMultipleNodeAction implements IIconInformation {
+
+ private static final long serialVersionUID = 1L;
+ final private int position;
+
+ public RemoveIconAction( final int position) {
+ super(position == -1 ? "RemoveIconAction" : "RemoveIcon_" + position + "_Action");
+ this.position = position;
+ putValue(Action.SHORT_DESCRIPTION, getTranslationValueLabel());
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final MIconController iconController = (MIconController) IconController.getController();
+ iconController.removeIcon(node, position);
+ return;
+ }
+
+ public String getTranslationKeyLabel() {
+ return null;
+ }
+
+ public String getTranslationValueLabel() {
+ return (String) getValue(Action.NAME);
+ }
+
+ public Icon getIcon() {
+ return (ImageIcon) getValue(Action.SMALL_ICON);
+ }
+
+ public KeyStroke getKeyStroke() {
+ return UITools.getKeyStroke(ResourceController.getResourceController().getProperty(getShortcutKey()));
+ }
+
+ public String getShortcutKey() {
+ return getKey() + ".shortcut";
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/ArrowType.java b/freeplane/src/main/java/org/freeplane/features/link/ArrowType.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/ArrowType.java
rename to freeplane/src/main/java/org/freeplane/features/link/ArrowType.java
diff --git a/freeplane/src/org/freeplane/features/link/ConnectorExistsCondition.java b/freeplane/src/main/java/org/freeplane/features/link/ConnectorExistsCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/ConnectorExistsCondition.java
rename to freeplane/src/main/java/org/freeplane/features/link/ConnectorExistsCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/ConnectorLabelCondition.java b/freeplane/src/main/java/org/freeplane/features/link/ConnectorLabelCondition.java
new file mode 100644
index 0000000..b2a8dfc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/ConnectorLabelCondition.java
@@ -0,0 +1,115 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.util.Set;
+
+import org.freeplane.features.filter.StringMatchingStrategy;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 7, 2009
+ */
+public abstract class ConnectorLabelCondition extends ASelectableCondition {
+ static final String TEXT = "TEXT";
+ static final String MATCH_CASE = "MATCH_CASE";
+ static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
+ final private String text;
+ final private boolean matchCase;
+ final private boolean matchApproximately;
+ final private StringMatchingStrategy stringMatchingStrategy;
+
+ protected boolean matchCase() {
+ return matchCase;
+ }
+
+ protected boolean matchApproximately() {
+ return matchApproximately;
+ }
+
+ protected StringMatchingStrategy getStringMatchingStrategy()
+ {
+ return stringMatchingStrategy;
+ }
+
+ public ConnectorLabelCondition(final String text, final boolean matchCase,
+ final boolean matchApproximately) {
+ super();
+ this.matchCase = matchCase;
+ //this.text = matchCase ? text : text.toLowerCase();
+ this.text = text;
+ this.matchApproximately = matchApproximately;
+ stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ abstract protected boolean checkLink(final ConnectorModel connector);
+
+ public boolean checkNode(final NodeModel node) {
+ final NodeLinks nodeLinks = NodeLinks.getLinkExtension(node);
+ if (nodeLinks != null) {
+ for (final NodeLinkModel l : nodeLinks.getLinks()) {
+ if (!(l instanceof ConnectorModel)) {
+ continue;
+ }
+ if (checkLink((ConnectorModel) l)) {
+ return true;
+ }
+ }
+ }
+ if (!node.hasID()) {
+ return false;
+ }
+ final MapLinks mapLinks = MapLinks.getLinks(node.getMap());
+ if (mapLinks == null) {
+ return false;
+ }
+ final Set<NodeLinkModel> targetLinks = mapLinks.get(node.getID());
+ if (targetLinks == null) {
+ return false;
+ }
+ for (final NodeLinkModel l : targetLinks) {
+ if (!(l instanceof ConnectorModel)) {
+ continue;
+ }
+ if (checkLink((ConnectorModel) l)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ abstract protected String createDescription();
+
+ protected abstract String getName();
+
+ protected void fillXML(final XMLElement child) {
+ child.setAttribute(TEXT, text);
+ child.setAttribute(MATCH_CASE, Boolean.toString(matchCase));
+ child.setAttribute(MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/ConnectorLabelContainsCondition.java b/freeplane/src/main/java/org/freeplane/features/link/ConnectorLabelContainsCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/ConnectorLabelContainsCondition.java
rename to freeplane/src/main/java/org/freeplane/features/link/ConnectorLabelContainsCondition.java
diff --git a/freeplane/src/org/freeplane/features/link/ConnectorLabelEqualsCondition.java b/freeplane/src/main/java/org/freeplane/features/link/ConnectorLabelEqualsCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/ConnectorLabelEqualsCondition.java
rename to freeplane/src/main/java/org/freeplane/features/link/ConnectorLabelEqualsCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/ConnectorModel.java b/freeplane/src/main/java/org/freeplane/features/link/ConnectorModel.java
new file mode 100644
index 0000000..257e7d7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/ConnectorModel.java
@@ -0,0 +1,228 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.awt.Color;
+import java.awt.Point;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeRelativePath;
+
+public class ConnectorModel extends NodeLinkModel {
+
+ public static enum Shape {
+ LINE, LINEAR_PATH, CUBIC_CURVE, EDGE_LIKE
+ };
+
+ final private ConnectorProperties connectorProperties;
+
+ public ConnectorModel(final NodeModel source, final String targetID, final Color color,
+ final int alpha, final Shape shape, final int width,
+ final String labelFontFamily, final int labelFontSize) {
+ this(source, targetID, new ConnectorProperties(color, alpha, shape, width, labelFontFamily, labelFontSize));
+ }
+
+ private ConnectorModel(final NodeModel source, final String targetID, final ConnectorProperties connectorProperties) {
+ super(source, targetID);
+ assert source != null;
+ this.connectorProperties = connectorProperties;
+ }
+
+ public Shape getShape() {
+ return connectorProperties.getShape();
+ }
+
+ public void setShape(Shape shape) {
+ connectorProperties.setShape(shape);
+ }
+
+ public int[] getDash() {
+ return connectorProperties.getDash();
+ }
+
+ public void setDash(int[] dash) {
+ connectorProperties.setDash(dash);
+ }
+
+ public Color getColor() {
+ return connectorProperties.getColor();
+ }
+
+ public ArrowType getEndArrow() {
+ return connectorProperties.getEndArrow();
+ }
+
+ public Point getEndInclination() {
+ return connectorProperties.getEndInclination();
+ }
+
+ public String getMiddleLabel() {
+ return connectorProperties.getMiddleLabel();
+ }
+
+ public String getSourceLabel() {
+ return connectorProperties.getSourceLabel();
+ }
+
+ public ArrowType getStartArrow() {
+ return connectorProperties.getStartArrow();
+ }
+
+ public Point getStartInclination() {
+ return connectorProperties.getStartInclination();
+ }
+
+ public String getTargetLabel() {
+ return connectorProperties.getTargetLabel();
+ }
+
+ public int getWidth() {
+ return connectorProperties.getWidth();
+ }
+
+ public void setColor(Color color) {
+ connectorProperties.setColor(color);
+ }
+
+ public void setEndArrow(ArrowType endArrow) {
+ connectorProperties.setEndArrow(endArrow);
+ }
+
+ public void setEndInclination(Point endInclination) {
+ connectorProperties.setEndInclination(endInclination);
+ }
+
+ public void setMiddleLabel(String middleLabel) {
+ connectorProperties.setMiddleLabel(middleLabel);
+ }
+
+ public boolean getShowControlPointsFlag() {
+ return connectorProperties.getShowControlPointsFlag();
+ }
+
+ public void setShowControlPoints(boolean bShowControlPointsFlag) {
+ connectorProperties.setShowControlPoints(bShowControlPointsFlag);
+ }
+
+ public void setSourceLabel(String label) {
+ connectorProperties.setSourceLabel(label);
+ }
+
+ public void setStartArrow(ArrowType startArrow) {
+ connectorProperties.setStartArrow(startArrow);
+ }
+
+ public void setStartInclination(Point startInclination) {
+ connectorProperties.setStartInclination(startInclination);
+ }
+
+ public void setTargetLabel(String targetLabel) {
+ connectorProperties.setTargetLabel(targetLabel);
+ }
+
+ public void setWidth(int width) {
+ connectorProperties.setWidth(width);
+ }
+
+ public void setAlpha(int alpha) {
+ connectorProperties.setAlpha(alpha);
+ }
+
+ public int getAlpha() {
+ return connectorProperties.getAlpha();
+ }
+
+ public String getLabelFontFamily() {
+ return connectorProperties.getLabelFontFamily();
+ }
+
+ public void setLabelFontFamily(String labelFontFamily) {
+ connectorProperties.setLabelFontFamily(labelFontFamily);
+ }
+
+ public int getLabelFontSize() {
+ return connectorProperties.getLabelFontSize();
+ }
+
+ public void setLabelFontSize(int labelFontSize) {
+ connectorProperties.setLabelFontSize(labelFontSize);
+ }
+
+ public void changeInclination(int deltaX, int deltaY, NodeModel linkedNodeView, Point changedInclination) {
+ connectorProperties.changeInclination(deltaX, deltaY, linkedNodeView, changedInclination);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + connectorProperties.hashCode();
+ result = prime * result + getSource().hashCode();
+ final String targetID = getTargetID();
+ if(targetID == null)
+ return result;
+ result = prime * result + targetID.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ConnectorModel other = (ConnectorModel) obj;
+ if (!connectorProperties.equals(other.connectorProperties) || !getSource().equals(other.getSource()))
+ return false;
+ final String targetID = getTargetID();
+ if(targetID == null)
+ return other.getTargetID() == null;
+ else
+ return targetID.equals(other.getTargetID());
+ }
+
+ public NodeLinkModel cloneForSource(NodeModel sourceClone, String targetId) {
+ return new ConnectorModel(sourceClone, targetId, connectorProperties);
+ }
+
+ public NodeLinkModel cloneForSource(NodeModel sourceClone) {
+ final NodeModel source = getSource();
+ if(sourceClone == source)
+ return this;
+ final NodeModel target = getTarget();
+ if(target != null && target.getParentNode() != null && source.getParentNode() != null){
+ final NodeRelativePath nodeRelativePath = new NodeRelativePath(source, target);
+ final NodeModel commonAncestor = nodeRelativePath.commonAncestor();
+ final NodeModel ancestorClone = nodeRelativePath.ancestorForBegin(sourceClone);
+ if(commonAncestor.isSubtreeCloneOf(ancestorClone)) {
+ final NodeRelativePath pathAncestorToSource = new NodeRelativePath(commonAncestor, source);
+ final NodeRelativePath clonePath = new NodeRelativePath(ancestorClone, sourceClone);
+ if (pathAncestorToSource.equalPathsTo(clonePath)) {
+ final NodeModel targetClone = nodeRelativePath.pathEnd(ancestorClone);
+ String targetID = targetClone.createID();
+ return cloneForSource(sourceClone, targetID);
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/ConnectorProperties.java b/freeplane/src/main/java/org/freeplane/features/link/ConnectorProperties.java
new file mode 100644
index 0000000..becc7d5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/ConnectorProperties.java
@@ -0,0 +1,221 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.awt.Color;
+import java.awt.Point;
+
+import org.freeplane.features.link.ConnectorModel.Shape;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 23.03.2014
+ */
+class ConnectorProperties{
+ private Color color;
+ private int alpha;
+ private ArrowType endArrow;
+ private int[] dash;
+ private Point endInclination;
+ private String middleLabel;
+ private String sourceLabel;
+ private ArrowType startArrow;
+ private Point startInclination;
+ private String targetLabel;
+ private int width;
+ private Shape shape;
+
+ private String labelFontFamily;
+ private int labelFontSize;
+
+ public ConnectorProperties(final Color color,
+ final int alpha, final Shape shape, final int width,
+ final String labelFontFamily, final int labelFontSize) {
+ assert color != null;
+ assert shape != null;
+ this.color = color;
+ this.setAlpha(alpha);
+ this.width = width;
+ this.shape = shape;
+ this.labelFontFamily = labelFontFamily;
+ this.labelFontSize = labelFontSize;
+ startArrow = ArrowType.NONE;
+ endArrow = ArrowType.DEFAULT;
+ }
+ public Shape getShape() {
+ return shape;
+ }
+
+ public void setShape(final Shape shape) {
+ assert shape != null;
+ this.shape = shape;
+ }
+
+ public int[] getDash() {
+ return dash;
+ }
+
+ public void setDash(int[] dash) {
+ this.dash = dash;
+ }
+
+
+ public Color getColor() {
+ return color;
+ }
+
+ public ArrowType getEndArrow() {
+ return endArrow;
+ }
+
+ public Point getEndInclination() {
+ if (endInclination == null) {
+ return null;
+ }
+ return new Point(endInclination);
+ }
+
+ public String getMiddleLabel() {
+ return middleLabel;
+ }
+
+ public String getSourceLabel() {
+ return sourceLabel;
+ }
+
+ public ArrowType getStartArrow() {
+ return startArrow;
+ }
+
+ public Point getStartInclination() {
+ if (startInclination == null) {
+ return null;
+ }
+ return new Point(startInclination);
+ }
+
+ public String getTargetLabel() {
+ return targetLabel;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public void setColor(final Color color) {
+ assert color != null;
+ this.color = color;
+ }
+
+ public void setEndArrow(final ArrowType endArrow) {
+ assert endArrow != null;
+ this.endArrow = endArrow;
+ }
+
+ public void setEndInclination(final Point endInclination) {
+ assert endInclination != null;
+ this.endInclination = endInclination;
+ }
+
+ public void setMiddleLabel(final String middleLabel) {
+ this.middleLabel = empty2null(middleLabel);
+ }
+
+ private boolean showControlPointsFlag;
+
+ public boolean getShowControlPointsFlag() {
+ return showControlPointsFlag;
+ }
+
+ public void setShowControlPoints(final boolean bShowControlPointsFlag) {
+ showControlPointsFlag = bShowControlPointsFlag;
+ }
+
+ public void setSourceLabel(final String label) {
+ sourceLabel = empty2null(label);
+ }
+
+ public void setStartArrow(final ArrowType startArrow) {
+ assert startArrow != null;
+ this.startArrow = startArrow;
+ }
+
+ public void setStartInclination(final Point startInclination) {
+ this.startInclination = startInclination;
+ }
+
+ public void setTargetLabel(final String targetLabel) {
+ this.targetLabel = empty2null(targetLabel);
+ }
+
+ public void setWidth(final int width) {
+ this.width = width;
+ }
+
+ public void setAlpha(int alpha) {
+ this.alpha = alpha;
+ }
+
+ public int getAlpha() {
+ return alpha;
+ }
+ public String getLabelFontFamily() {
+ return labelFontFamily;
+ }
+
+ public void setLabelFontFamily(String labelFontFamily) {
+ this.labelFontFamily = labelFontFamily;
+ }
+
+ public int getLabelFontSize() {
+ return labelFontSize;
+ }
+
+ public void setLabelFontSize(int labelFontSize) {
+ this.labelFontSize = labelFontSize;
+ }
+
+ private String empty2null(final String label) {
+ return "".equals(label) ? null : label;
+ }
+
+ public void changeInclination(int deltaX, final int deltaY, final NodeModel linkedNodeView,
+ final Point changedInclination) {
+ if (linkedNodeView.isLeft()) {
+ deltaX = -deltaX;
+ }
+ changedInclination.translate(deltaX, deltaY);
+ if (changedInclination.x != 0 && Math.abs((double) changedInclination.y / changedInclination.x) < 0.015) {
+ changedInclination.y = 0;
+ }
+ final double k = changedInclination.distance(0, 0);
+ if (k < 10) {
+ if (k > 0) {
+ changedInclination.x = (int) (changedInclination.x * 10 / k);
+ changedInclination.y = (int) (changedInclination.y * 10 / k);
+ }
+ else {
+ changedInclination.x = 10;
+ }
+ }
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/link/EvaluationDependencies.java b/freeplane/src/main/java/org/freeplane/features/link/EvaluationDependencies.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/EvaluationDependencies.java
rename to freeplane/src/main/java/org/freeplane/features/link/EvaluationDependencies.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/FollowLinkAction.java b/freeplane/src/main/java/org/freeplane/features/link/FollowLinkAction.java
new file mode 100644
index 0000000..5ea7e3a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/FollowLinkAction.java
@@ -0,0 +1,61 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+ at EnabledAction(checkOnNodeChange = true)
+class FollowLinkAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public FollowLinkAction() {
+ super("FollowLinkAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ LinkController linkController = LinkController.getController();
+ NodeModel selNode = mapController.getSelectedNode();
+ linkController.loadURL(selNode, e);
+ }
+
+ @Override
+ public void setEnabled() {
+ setEnabled(isLinkEnabled());
+ }
+
+ private boolean isLinkEnabled() {
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ for (final NodeModel selNode : mapController.getSelectedNodes()) {
+ if (NodeLinks.getValidLink(selNode) != null) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/GotoLinkNodeAction.java b/freeplane/src/main/java/org/freeplane/features/link/GotoLinkNodeAction.java
new file mode 100644
index 0000000..9080735
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/GotoLinkNodeAction.java
@@ -0,0 +1,76 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.TextController;
+
+/** Follow a graphical link (AKA connector) action. */
+class GotoLinkNodeAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final LinkController linkController;
+ private final NodeModel target;
+
+ public GotoLinkNodeAction(final LinkController linkController, String actionName, final NodeModel target) {
+ this(linkController, target);
+ }
+
+ public GotoLinkNodeAction(final LinkController linkController, final NodeModel target) {
+ super("GotoLinkNodeAction");
+ this.target = target;
+ this.linkController = linkController;
+ }
+
+ public void configureText(String actionName, final NodeModel target) {
+ if (target != null) {
+ final String adaptedText = TextController.getController().getShortPlainText(target);
+ putValue(Action.NAME, TextUtils.format(actionName, adaptedText));
+ StringBuilder path = new StringBuilder();
+ appendPath(path, target.getParentNode());
+ path.append(target);
+ putValue(Action.SHORT_DESCRIPTION, path.toString());
+ }
+ }
+
+ private void appendPath(StringBuilder path, final NodeModel target) {
+ if(target != null){
+ appendPath(path, target.getParentNode());
+ final String shortText = TextController.getController().getShortPlainText(target);
+ path.append(shortText);
+ path.append(" -> ");
+ }
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ linkController.onDeselect(Controller.getCurrentModeController().getMapController().getSelectedNode());
+ Controller.getCurrentModeController().getMapController().select(target);
+ linkController.onSelect(target);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/HyperLinkCondition.java b/freeplane/src/main/java/org/freeplane/features/link/HyperLinkCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/HyperLinkCondition.java
rename to freeplane/src/main/java/org/freeplane/features/link/HyperLinkCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/HyperLinkContainsCondition.java b/freeplane/src/main/java/org/freeplane/features/link/HyperLinkContainsCondition.java
new file mode 100644
index 0000000..26868bd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/HyperLinkContainsCondition.java
@@ -0,0 +1,74 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.net.URI;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.StringMatchingStrategy;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 7, 2009
+ */
+public class HyperLinkContainsCondition extends HyperLinkCondition {
+ public static final String NAME = "hyper_link_contains";
+ public static final String MATCH_CASE = "MATCH_CASE";
+ public static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
+
+ private final boolean matchCase;
+ private final boolean matchApproximately;
+ private final StringMatchingStrategy stringMatchingStrategy;
+
+ public HyperLinkContainsCondition(final String hyperlink, final boolean matchCase, final boolean matchApproximately) {
+ super(hyperlink);
+ this.matchCase = matchCase;
+ this.matchApproximately = matchApproximately;
+ this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ }
+
+ @Override
+ protected boolean checkLink(final URI nodeLink) {
+ return stringMatchingStrategy.matches(getHyperlink(), nodeLink.toString(), true, matchCase);
+// return nodeLink.toString().contains(getHyperlink());
+ }
+
+ @Override
+ protected String createDescription() {
+ final String condition = TextUtils.getText(LinkConditionController.FILTER_LINK);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
+ return ConditionFactory.createDescription(condition, simpleCondition, getHyperlink(), matchCase, matchApproximately);
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+
+ @Override
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(HyperLinkContainsCondition.MATCH_CASE, Boolean.toString(matchCase));
+ child.setAttribute(HyperLinkContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/HyperLinkEqualsCondition.java b/freeplane/src/main/java/org/freeplane/features/link/HyperLinkEqualsCondition.java
new file mode 100644
index 0000000..dbe45bb
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/HyperLinkEqualsCondition.java
@@ -0,0 +1,75 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.net.URI;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.StringMatchingStrategy;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 7, 2009
+ */
+public class HyperLinkEqualsCondition extends HyperLinkCondition {
+ public static final String NAME = "hyper_link_equals";
+ public static final String MATCH_CASE = "MATCH_CASE";
+ public static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
+
+ private final boolean matchCase;
+ private final boolean matchApproximately;
+ private final StringMatchingStrategy stringMatchingStrategy;
+
+ public HyperLinkEqualsCondition(final String hyperlink, final boolean matchCase, final boolean matchApproximately) {
+ super(hyperlink);
+ this.matchCase = matchCase;
+ this.matchApproximately = matchApproximately;
+ this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ }
+
+ @Override
+ protected boolean checkLink(final URI nodeLink) {
+// return getHyperlink().equals(nodeLink);
+ return stringMatchingStrategy.matches(getHyperlink(), nodeLink.toString(), false, matchCase);
+ }
+
+ @Override
+ protected String createDescription() {
+ final String condition = TextUtils.getText(LinkConditionController.FILTER_LINK);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_IS_EQUAL_TO);
+ return ConditionFactory.createDescription(condition, simpleCondition, getHyperlink(), matchCase, matchApproximately);
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+
+ @Override
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(HyperLinkContainsCondition.MATCH_CASE, Boolean.toString(matchCase));
+ child.setAttribute(HyperLinkContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/link/HyperLinkExistsCondition.java b/freeplane/src/main/java/org/freeplane/features/link/HyperLinkExistsCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/HyperLinkExistsCondition.java
rename to freeplane/src/main/java/org/freeplane/features/link/HyperLinkExistsCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/HyperTextLinkModel.java b/freeplane/src/main/java/org/freeplane/features/link/HyperTextLinkModel.java
new file mode 100644
index 0000000..0641cd9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/HyperTextLinkModel.java
@@ -0,0 +1,80 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class HyperTextLinkModel extends NodeLinkModel {
+ /**
+ * @param source
+ * @param target
+ */
+ public HyperTextLinkModel(final NodeModel source, final String targetID) {
+ super(source, targetID);
+ }
+
+ public NodeLinkModel cloneForSource(NodeModel sourceClone, String targetId) {
+ return new HyperTextLinkModel(sourceClone, targetId);
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + getSource().hashCode();
+ final String targetID = getTargetID();
+ if(targetID == null)
+ return result;
+ result = prime * result + targetID.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ NodeLinkModel other = (NodeLinkModel) obj;
+ if (!getSource().equals(other.getSource()))
+ return false;
+ final String targetID = getTargetID();
+ if(targetID == null)
+ return other.getTargetID() == null;
+ else
+ return targetID.equals(other.getTargetID());
+ }
+
+ public NodeLinkModel cloneForSource(NodeModel sourceClone) {
+ final NodeModel source = getSource();
+ if(sourceClone == source)
+ return this;
+ final NodeModel target = getTarget();
+ if(target != null){
+ return cloneForSource(sourceClone, target.getID());
+ }
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/LinkBuilder.java b/freeplane/src/main/java/org/freeplane/features/link/LinkBuilder.java
new file mode 100644
index 0000000..568f4de
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/LinkBuilder.java
@@ -0,0 +1,363 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.awt.Color;
+import java.awt.Point;
+import java.io.IOException;
+import java.net.URI;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IReadCompletionListener;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.xml.TreeXmlReader;
+import org.freeplane.core.io.xml.TreeXmlWriter;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.features.link.ConnectorModel.Shape;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.url.MapVersionInterpreter;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class LinkBuilder implements IElementDOMHandler, IReadCompletionListener{
+ private static final int FREEPLANE_VERSION_WITH_CURVED_LOOPED_CONNECTORS = 3;
+ private static final String FORMAT_AS_HYPERLINK = "FORMAT_AS_HYPERLINK";
+ private static final String LINK = "LINK";
+ final private HashSet<NodeLinkModel> processedLinks;
+ private final LinkController linkController;
+
+ public LinkBuilder(final LinkController linkController) {
+ this.linkController = linkController;
+ processedLinks = new HashSet<NodeLinkModel>();
+ }
+
+ protected NodeLinkModel createArrowLink(final NodeModel source, final String targetID) {
+ return new ConnectorModel(source, targetID,
+ linkController.getStandardConnectorColor(),
+ linkController.getStandardConnectorAlpha(),
+ linkController.getStandardConnectorShape(),
+ linkController.getStandardConnectorWidth(),
+ linkController.getStandardLabelFontFamily(),
+ linkController.getStandardLabelFontSize());
+ }
+
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (tag.equals("arrowlink")) {
+ return createArrowLink((NodeModel) parent, null);
+ }
+ return null;
+ }
+
+ /**
+ * Completes the links within the getMap(). They are registered in the
+ * registry.
+ */
+ public void readingCompleted(final NodeModel topNode, final Map<String, String> newIds) {
+ final Iterator<NodeLinkModel> iterator = processedLinks.iterator();
+ while (iterator.hasNext()) {
+ final NodeLinkModel arrowLink = iterator.next();
+ final String id = arrowLink.getTargetID();
+ final String newId = newIds.get(id);
+ final String targetID = newId != null ? newId : id;
+ if (targetID == null) {
+ new NullPointerException().printStackTrace();
+ continue;
+ }
+ arrowLink.setTargetID(targetID);
+ final NodeModel source = arrowLink.getSource();
+ NodeLinks.createLinkExtension(source).addArrowlink(arrowLink);
+ }
+ processedLinks.clear();
+ }
+
+ private void registerAttributeHandlers(final ReadManager reader) {
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, LINK, new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ linkController.loadLink(node, value);
+ final Collection<NodeLinkModel> links = NodeLinks.getLinks(node);
+ processedLinks.addAll(links);
+ }
+ });
+
+ final IAttributeHandler hyperlinkHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ linkController.loadLinkFormat(node, Boolean.parseBoolean(value));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, FORMAT_AS_HYPERLINK, hyperlinkHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, FORMAT_AS_HYPERLINK, hyperlinkHandler);
+
+ reader.addAttributeHandler("arrowlink", "EDGE_LIKE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setShape(Shape.EDGE_LIKE);
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "SHAPE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setShape(Shape.valueOf(value));
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "DASH", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ final String[] split = value.split(" ");
+ int[] dash = new int[split.length];
+ int i = 0;
+ for(String s : split){
+ dash[i++] = Integer.parseInt(s);
+ }
+ arrowLink.setDash(dash);
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "DESTINATION", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setTargetID(value);
+ processedLinks.add(arrowLink);
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "SOURCE_LABEL", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setSourceLabel(value.toString());
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "MIDDLE_LABEL", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setMiddleLabel(value.toString());
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "TARGET_LABEL", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setTargetLabel(value.toString());
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "STARTINCLINATION", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setStartInclination(TreeXmlReader.xmlToPoint(value.toString()));
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "ENDINCLINATION", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setEndInclination(TreeXmlReader.xmlToPoint(value.toString()));
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "STARTARROW", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setStartArrow(ArrowType.valueOf(value.toUpperCase(Locale.ENGLISH)));
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "ENDARROW", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setEndArrow(ArrowType.valueOf(value.toUpperCase(Locale.ENGLISH)));
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "WIDTH", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setWidth(Integer.parseInt(value.toString()));
+ }
+ });
+
+ reader.addAttributeHandler("arrowlink", "FONT_FAMILY", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setLabelFontFamily(value.toString());
+ }
+ });
+ reader.addAttributeHandler("arrowlink", "FONT_SIZE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final ConnectorModel arrowLink = (ConnectorModel) userObject;
+ arrowLink.setLabelFontSize(Integer.parseInt(value.toString()));
+ }
+ });
+ }
+
+ public void endElement(Object parent, String tag, Object element, XMLElement dom) {
+ final ConnectorModel arrowLink = (ConnectorModel) element;
+ final String color = dom.getAttribute("COLOR", null);
+ final String transparency = dom.getAttribute("TRANSPARENCY", null);
+ if(color != null){
+ arrowLink.setColor(ColorUtils.stringToColor(color));
+ if(transparency == null){
+ arrowLink.setAlpha(ColorUtils.NON_TRANSPARENT_ALPHA);
+ }
+ }
+ else{
+ arrowLink.setColor(linkController.getStandardConnectorColor());
+ }
+
+ if(transparency != null){
+ arrowLink.setAlpha(Integer.parseInt(transparency));
+ }
+ else if(color == null){
+ arrowLink.setAlpha(linkController.getStandardConnectorAlpha());
+ }
+ fixSelfLoopedConnectorShape(arrowLink);
+ }
+
+ private void fixSelfLoopedConnectorShape(ConnectorModel connector) {
+ if (connector.isSelfLink()
+ && Shape.CUBIC_CURVE.equals(connector.getShape())
+ && MapVersionInterpreter.isOlderThan(connector.getSource().getMap(), FREEPLANE_VERSION_WITH_CURVED_LOOPED_CONNECTORS))
+ connector.setShape(Shape.LINE);
+ }
+
+ void registerBy(final ReadManager reader) {
+ reader.addElementHandler("arrowlink", this);
+ registerAttributeHandlers(reader);
+ reader.addReadCompletionListener(this);
+ }
+
+ public void save(final ITreeWriter writer, final ConnectorModel model) throws IOException {
+ final NodeModel target = model.getTarget();
+ if (target == null) {
+ return;
+ }
+ final XMLElement arrowLink = new XMLElement();
+ arrowLink.setName("arrowlink");
+ final Shape shape = model.getShape();
+ arrowLink.setAttribute("SHAPE", shape.toString());
+ final Color color = model.getColor();
+ arrowLink.setAttribute("COLOR", ColorUtils.colorToString(color));
+ final int width = model.getWidth();
+ arrowLink.setAttribute("WIDTH", Integer.toString(width));
+ final int alpha = model.getAlpha();
+ arrowLink.setAttribute("TRANSPARENCY", Integer.toString(alpha));
+ final int[]dash = model.getDash();
+ if (dash != null) {
+ StringBuilder sb = null;
+ for(int i : dash){
+ if(sb == null){
+ sb = new StringBuilder(dash.length * 4);
+ }
+ else{
+ sb.append(' ');
+ }
+ sb.append(i);
+ }
+ if(sb != null){
+ arrowLink.setAttribute("DASH", sb.toString());
+ }
+ }
+
+ final int fontSize = model.getLabelFontSize();
+ arrowLink.setAttribute("FONT_SIZE", Integer.toString(fontSize));
+
+ final String fontFamily = model.getLabelFontFamily();
+ arrowLink.setAttribute("FONT_FAMILY", fontFamily);
+
+ final String destinationLabel = target.createID();
+
+ if (destinationLabel != null) {
+ arrowLink.setAttribute("DESTINATION", destinationLabel);
+ }
+ final String sourceLabel = model.getSourceLabel();
+ if (sourceLabel != null) {
+ arrowLink.setAttribute("SOURCE_LABEL", sourceLabel);
+ }
+ final String targetLabel = model.getTargetLabel();
+ if (targetLabel != null) {
+ arrowLink.setAttribute("TARGET_LABEL", targetLabel);
+ }
+ final String middleLabel = model.getMiddleLabel();
+ if (middleLabel != null) {
+ arrowLink.setAttribute("MIDDLE_LABEL", middleLabel);
+ }
+ final Point startInclination = model.getStartInclination();
+ if (startInclination != null) {
+ arrowLink.setAttribute("STARTINCLINATION", TreeXmlWriter.PointToXml(startInclination));
+ }
+ final Point endInclination = model.getEndInclination();
+ if (endInclination != null) {
+ arrowLink.setAttribute("ENDINCLINATION", TreeXmlWriter.PointToXml(endInclination));
+ }
+ final String startArrow = model.getStartArrow().toString();
+ if (startArrow != null) {
+ arrowLink.setAttribute("STARTARROW", startArrow);
+ }
+ final String endArrow = model.getEndArrow().toString();
+ if (endArrow != null) {
+ arrowLink.setAttribute("ENDARROW", endArrow);
+ }
+ writer.addElement(model, arrowLink);
+ }
+
+ public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
+ }
+
+ public void writeAttributes(final ITreeWriter writer, final NodeModel node) {
+ final NodeLinks links = node.getExtension(NodeLinks.class);
+ if(links != null) {
+ final URI link = links.getHyperLink(node);
+ if (link != null) {
+ final String string = link.toString();
+ if (string.startsWith("#")) {
+ if ((node).getMap().getNodeForID(string.substring(1)) == null) {
+ return;
+ }
+ }
+ writer.addAttribute(LINK, string);
+ }
+ final Boolean formatNodeAsHyperlink = links.formatNodeAsHyperlink();
+ if (formatNodeAsHyperlink != null) {
+ writer.addAttribute(FORMAT_AS_HYPERLINK, formatNodeAsHyperlink.toString());
+ }
+ }
+ }
+
+ public void writeContent(final ITreeWriter writer, final NodeModel node)
+ throws IOException {
+ final NodeLinks links = node.getExtension(NodeLinks.class);
+ if(links != null) {
+ final Iterator<NodeLinkModel> iterator = links.getLinks().iterator();
+ while (iterator.hasNext()) {
+ final NodeLinkModel linkModel = iterator.next();
+ if (linkModel instanceof ConnectorModel) {
+ final boolean linkNotWrittenBefore = ! processedLinks.contains(linkModel);
+ if(linkNotWrittenBefore) {
+ final ConnectorModel arrowLinkModel = (ConnectorModel) linkModel.cloneForSource((NodeModel) node);
+ if(arrowLinkModel != null) {
+ save(writer, arrowLinkModel);
+ processedLinks.add(linkModel);
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/LinkConditionController.java b/freeplane/src/main/java/org/freeplane/features/link/LinkConditionController.java
new file mode 100644
index 0000000..cfb0e1d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/LinkConditionController.java
@@ -0,0 +1,199 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.ui.FixedBasicComboBoxEditor;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.filter.condition.DefaultConditionRenderer;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 7, 2009
+ */
+public class LinkConditionController implements IElementaryConditionController {
+ static final String FILTER_LINK = "filter_link";
+ static final String CONNECTOR_LABEL = "connector_label";
+ static final String CONNECTOR = "connector";
+ private final ComboBoxModel values = new DefaultComboBoxModel();
+
+ public boolean canEditValues(final Object property, final TranslatedObject simpleCond) {
+ return !simpleCond.objectEquals(ConditionFactory.FILTER_EXIST);
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ return namedObject.objectEquals(FILTER_LINK) || namedObject.objectEquals(CONNECTOR_LABEL)
+ || namedObject.objectEquals(CONNECTOR);
+ }
+
+ public boolean canSelectValues(final Object property, final TranslatedObject simpleCond) {
+ return !simpleCond.objectEquals(ConditionFactory.FILTER_EXIST);
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase,
+ final boolean matchApproximately) {
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ if (namedObject.objectEquals(FILTER_LINK)) {
+ if (simpleCond.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
+ return new HyperLinkEqualsCondition((String) value, matchCase, matchApproximately);
+ }
+ if (simpleCond.objectEquals(ConditionFactory.FILTER_CONTAINS)) {
+ return new HyperLinkContainsCondition((String) value, matchCase, matchApproximately);
+ }
+ if (simpleCond.objectEquals(ConditionFactory.FILTER_EXIST)) {
+ return new HyperLinkExistsCondition();
+ }
+ return null;
+ }
+ if (namedObject.objectEquals(CONNECTOR_LABEL)) {
+ if (simpleCond.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
+ return new ConnectorLabelEqualsCondition((String) value, matchCase, matchApproximately);
+ }
+ if (simpleCond.objectEquals(ConditionFactory.FILTER_CONTAINS)) {
+ return new ConnectorLabelContainsCondition((String) value, matchCase, matchApproximately);
+ }
+ return null;
+ }
+ if (namedObject.objectEquals(CONNECTOR)) {
+ if (simpleCond.objectEquals(ConditionFactory.FILTER_EXIST)) {
+ return new ConnectorExistsCondition();
+ }
+ }
+ return null;
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object property) {
+ final TranslatedObject no = (TranslatedObject) property;
+ final Object[] linkConditionNames;
+ if (no.getObject().equals(FILTER_LINK)) {
+ linkConditionNames = new TranslatedObject[] {
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_EXIST) };
+ }
+ else if (no.getObject().equals(CONNECTOR_LABEL)) {
+ linkConditionNames = new TranslatedObject[] {
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS) };
+ }
+ else {
+ linkConditionNames = new TranslatedObject[] { TextUtils.createTranslatedString(ConditionFactory.FILTER_EXIST) };
+ }
+ return new DefaultComboBoxModel(linkConditionNames);
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(FILTER_LINK));
+ list.addElement(TextUtils.createTranslatedString(CONNECTOR_LABEL));
+ list.addElement(TextUtils.createTranslatedString(CONNECTOR));
+ return list;
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ return new FixedBasicComboBoxEditor();
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object property, TranslatedObject simpleCond) {
+ return values;
+ }
+
+ public boolean isCaseDependent(final Object property, final TranslatedObject simpleCond) {
+ return ((TranslatedObject) property).objectEquals(CONNECTOR_LABEL) ||
+ ((TranslatedObject) property).objectEquals(FILTER_LINK);
+ }
+
+ public boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond) {
+ return ((TranslatedObject) property).objectEquals(CONNECTOR_LABEL) ||
+ ((TranslatedObject) property).objectEquals(FILTER_LINK);
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ if (element.getName().equalsIgnoreCase(HyperLinkEqualsCondition.NAME)) {
+ final String target = element.getAttribute(HyperLinkEqualsCondition.TEXT, null);
+ final boolean matchCase = Boolean.toString(true).equals(
+ element.getAttribute(HyperLinkEqualsCondition.MATCH_CASE, null));
+ final boolean matchApproximately = Boolean.toString(true).equals(
+ element.getAttribute(HyperLinkEqualsCondition.MATCH_APPROXIMATELY, null));
+ return new HyperLinkEqualsCondition(target, matchCase, matchApproximately);
+ }
+ if (element.getName().equalsIgnoreCase(HyperLinkContainsCondition.NAME)) {
+ final String target = element.getAttribute(HyperLinkContainsCondition.TEXT, null);
+ final boolean matchCase = Boolean.toString(true).equals(
+ element.getAttribute(HyperLinkContainsCondition.MATCH_CASE, null));
+ final boolean matchApproximately = Boolean.toString(true).equals(
+ element.getAttribute(HyperLinkContainsCondition.MATCH_APPROXIMATELY, null));
+ return new HyperLinkContainsCondition(target, matchCase, matchApproximately);
+ }
+ if (element.getName().equalsIgnoreCase(HyperLinkExistsCondition.NAME)) {
+ return new HyperLinkExistsCondition();
+ }
+ if (element.getName().equalsIgnoreCase(ConnectorLabelEqualsCondition.NAME)) {
+ final String text = element.getAttribute(ConnectorLabelEqualsCondition.TEXT, null);
+ final boolean matchCase = Boolean.toString(true).equals(
+ element.getAttribute(ConnectorLabelEqualsCondition.MATCH_CASE, null));
+ final boolean matchApproximately = Boolean.toString(true).equals(
+ element.getAttribute(ConnectorLabelEqualsCondition.MATCH_APPROXIMATELY, null));
+ return new ConnectorLabelEqualsCondition(text, matchCase, matchApproximately);
+ }
+ if (element.getName().equalsIgnoreCase(ConnectorLabelContainsCondition.NAME)) {
+ final String text = element.getAttribute(ConnectorLabelContainsCondition.TEXT, null);
+ final boolean matchCase = Boolean.toString(true).equals(
+ element.getAttribute(ConnectorLabelEqualsCondition.MATCH_CASE, null));
+ final boolean matchApproximately = Boolean.toString(true).equals(
+ element.getAttribute(ConnectorLabelEqualsCondition.MATCH_APPROXIMATELY, null));
+ return new ConnectorLabelContainsCondition(text, matchCase, matchApproximately);
+ }
+ if (element.getName().equalsIgnoreCase(ConnectorExistsCondition.NAME)) {
+ return new ConnectorExistsCondition();
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ if (((TranslatedObject)selectedProperty).objectEquals(CONNECTOR) ||
+ (((TranslatedObject)selectedProperty).objectEquals(FILTER_LINK) &&
+ selectedCondition.objectEquals(ConditionFactory.FILTER_EXIST)))
+ {
+ // don't return null as this would make FilterConditionEditor fall back to filterController.getConditionRenderer()
+ // (and that would put in a default string like "No Filtering (remove)"!)
+ return new DefaultConditionRenderer("", true);
+ }
+ else
+ {
+ return null;
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/LinkController.java b/freeplane/src/main/java/org/freeplane/features/link/LinkController.java
new file mode 100644
index 0000000..53fb3d1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/LinkController.java
@@ -0,0 +1,970 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.Box;
+import javax.swing.Icon;
+import javax.swing.InputMap;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JRootPane;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.generic.ChildActionEntryRemover;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.MenuUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.icon.IconStore;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.link.ConnectorModel.Shape;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.SelectionController;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.url.FreeplaneUriConverter;
+import org.freeplane.features.url.UrlManager;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class LinkController extends SelectionController implements IExtension {
+ public static final String MENUITEM_SCHEME = "menuitem";
+ public static final String EXECUTE_APP_SCHEME = "execute";
+ public static LinkController getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return getController(modeController);
+ }
+
+ public static LinkController getController(ModeController modeController) {
+ return modeController.getExtension(LinkController.class);
+ }
+
+ public static void install() {
+ FilterController.getCurrentFilterController().getConditionFactory().addConditionController(30, new LinkConditionController());
+ }
+
+ public static void install( final LinkController linkController) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(LinkController.class, linkController);
+ linkController.init();
+ }
+
+ public static final String LINK_ICON = ResourceController.getResourceController().getProperty("link_icon");
+ private static final String MAIL_ICON = ResourceController.getResourceController().getProperty("mail_icon");
+ public static final String LINK_LOCAL_ICON = ResourceController.getResourceController().getProperty("link_local_icon");
+
+ final protected ModeController modeController;
+
+ public LinkController(ModeController modeController) {
+ this.modeController = modeController;
+ }
+
+ protected void init() {
+ createActions();
+ final MapController mapController = modeController.getMapController();
+ final ReadManager readManager = mapController.getReadManager();
+ LinkBuilder linkBuilder = new LinkBuilder(this);
+ linkBuilder.registerBy(readManager);
+
+ // this IContentTransformer is unconditional because the outcome
+ // (#ID_1698830792 -> Nodename) is usually wanted
+ final LinkTransformer textTransformer = new LinkTransformer(modeController, 10);
+ TextController.getController(modeController).addTextTransformer(textTransformer);
+
+ textTransformer.registerListeners(modeController);
+
+ final INodeSelectionListener listener = new INodeSelectionListener() {
+ public void onDeselect(final NodeModel node) {
+ }
+
+ public void onSelect(final NodeModel node) {
+ final URI link = NodeLinks.getValidLink(node);
+ final String linkString = (link != null ? link.toString() : null);
+ if (linkString != null) {
+ Controller.getCurrentController().getViewController().out(linkString);
+ }
+ }
+ };
+ Controller.getCurrentModeController().getMapController().addNodeSelectionListener(listener);
+ }
+
+ private JButton addLinks(final JComponent arrowLinkPopup, final NodeModel source) {
+ GotoLinkNodeAction gotoLinkNodeAction = new GotoLinkNodeAction(this, source);
+ gotoLinkNodeAction.configureText("follow_graphical_link", source);
+ return addAction(arrowLinkPopup, gotoLinkNodeAction);
+ }
+
+ protected void addPopupComponent(final JComponent arrowLinkPopup, final String label, final JComponent component) {
+ final JComponent componentBox;
+ if(label != null){
+ componentBox = Box.createHorizontalBox();
+ componentBox.add(Box.createHorizontalStrut(10));
+ final JLabel jlabel = new JLabel(label);
+ componentBox.add(jlabel);
+ componentBox.add(Box.createHorizontalStrut(10));
+ componentBox.add(component);
+ }
+ else {
+ componentBox = component;
+ }
+ componentBox.setAlignmentX(JComponent.LEFT_ALIGNMENT);
+ componentBox.setMinimumSize(new Dimension());
+ componentBox.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
+ arrowLinkPopup.add(componentBox);
+ }
+
+ protected void addClosingAction(final JComponent arrowLinkPopup, Action action) {
+ JButton comp = addAction(arrowLinkPopup, action);
+ comp.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ SwingUtilities.getWindowAncestor(arrowLinkPopup).setVisible(false);
+ }
+ });
+ }
+
+ protected JButton addAction(final JComponent arrowLinkPopup, Action action) {
+ JButton comp = new JButton(action);
+ comp.setHorizontalAlignment(JButton.LEFT);
+ addPopupComponent (arrowLinkPopup, null, comp);
+ return comp;
+ }
+
+ /**
+ *
+ */
+ private void createActions() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addAction(new FollowLinkAction());
+ modeController.addUiBuilder(Phase.ACTIONS, "clone_actions", new ClonesMenuBuilder(modeController),
+ new ChildActionEntryRemover(modeController));
+ modeController.addUiBuilder(Phase.ACTIONS, "link_actions", new LinkMenuBuilder(modeController),
+ new ChildActionEntryRemover(modeController));
+ }
+
+ final class LinkMenuBuilder implements EntryVisitor {
+ private final ModeController modeController;
+
+ LinkMenuBuilder(ModeController modeController) {
+ this.modeController = modeController;
+ }
+
+ @Override
+ public void visit(Entry entry) {
+ final IMapSelection selection = modeController.getController().getSelection();
+ if (selection == null)
+ return;
+ final NodeModel node = selection.getSelected();
+ Set<NodeLinkModel> links = new LinkedHashSet<NodeLinkModel>(NodeLinks.getLinks(node));
+ links.addAll(getLinksTo(node));
+ boolean firstAction = true;
+ for (NodeLinkModel link : links) {
+ final String targetID = link.getTargetID();
+ final NodeModel target;
+ if (node.getID().equals(targetID)) {
+ if (link instanceof ConnectorModel) {
+ ConnectorModel cm = (ConnectorModel) link;
+ target = cm.getSource();
+ if (node.equals(target))
+ continue;
+ }
+ else
+ continue;
+ }
+ else
+ target = node.getMap().getNodeForID(targetID);
+ final GotoLinkNodeAction gotoLinkNodeAction = new GotoLinkNodeAction(LinkController.this, target);
+ gotoLinkNodeAction.configureText("follow_graphical_link", target);
+ if (!(link instanceof ConnectorModel)) {
+ gotoLinkNodeAction.putValue(Action.SMALL_ICON, ICON_STORE.getUIIcon(LINK_LOCAL_ICON).getIcon());
+ }
+ if (firstAction) {
+ entry.addChild(new Entry().setBuilders("separator"));
+ firstAction = false;
+ }
+ modeController.addActionIfNotAlreadySet(gotoLinkNodeAction);
+ new EntryAccessor().addChildAction(entry, gotoLinkNodeAction);
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+ }
+
+
+ private class ClonesMenuBuilder implements EntryVisitor {
+ final private ModeController modeController;
+
+ public ClonesMenuBuilder(ModeController modeController) {
+ super();
+ this.modeController = modeController;
+ }
+
+
+ @Override
+ public void visit(Entry target) {
+ final IMapSelection selection = modeController.getController().getSelection();
+ if (selection == null)
+ return;
+ final NodeModel node = selection.getSelected();
+ boolean firstAction = true;
+ NodeModel parentNode = node.getParentNode();
+ if (parentNode != null) {
+ for (NodeModel clone : node.allClones()) {
+ if (!clone.equals(node)) {
+ final GotoLinkNodeAction gotoLinkNodeAction = new GotoLinkNodeAction(LinkController.this, clone);
+ NodeModel subtreeRootParentNode = clone.getSubtreeRoot().getParentNode();
+ gotoLinkNodeAction.configureText("follow_clone", subtreeRootParentNode);
+ if (firstAction) {
+ target.addChild(new Entry().setBuilders("separator"));
+ firstAction = false;
+ }
+ modeController.addActionIfNotAlreadySet(gotoLinkNodeAction);
+ new EntryAccessor().addChildAction(target, gotoLinkNodeAction);
+ }
+ }
+ }
+
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+ }
+ @SuppressWarnings("serial")
+ public static final class ClosePopupAction extends AbstractAction {
+ final private String reason;
+
+ public ClosePopupAction(String reason) {
+ this.reason = reason;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ JComponent src = (JComponent) e.getSource();
+ src.putClientProperty(reason, Boolean.TRUE);
+ SwingUtilities.getWindowAncestor(src).setVisible(false);
+ }
+ }
+
+ protected static final String CANCEL = "CANCEL";
+ protected static final String CLOSE = "CLOSE";
+ protected void createArrowLinkPopup(final ConnectorModel link, final JComponent arrowLinkPopup) {
+
+ registerCloseActions(arrowLinkPopup);
+
+ final NodeModel source = link.getSource();
+ final NodeModel target = link.getTarget();
+ final IMapSelection selection = Controller.getCurrentModeController().getController().getSelection();
+ final JButton sourceButton = addLinks(arrowLinkPopup, source);
+ sourceButton.setEnabled(!selection.isSelected(source));
+ final JButton targetButton = addLinks(arrowLinkPopup, target);
+ targetButton.setEnabled(!selection.isSelected(target));
+
+ sourceButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ sourceButton.setEnabled(false);
+ targetButton.setEnabled(true);
+ }
+ });
+
+ targetButton.addActionListener(new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ targetButton.setEnabled(false);
+ sourceButton.setEnabled(true);
+ }
+ });
+ }
+
+ private void registerCloseActions(final JComponent arrowLinkPopup) {
+ arrowLinkPopup.addHierarchyListener(new HierarchyListener() {
+
+ @Override
+ public void hierarchyChanged(HierarchyEvent e) {
+ if(arrowLinkPopup.isDisplayable()) {
+ arrowLinkPopup.removeHierarchyListener(this);
+ final JRootPane rootPane = arrowLinkPopup.getRootPane();
+ final InputMap inputMap = rootPane.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+ final ActionMap actionMap = rootPane.getActionMap();
+ final ClosePopupAction closeAction = new ClosePopupAction(CLOSE);
+ final ClosePopupAction cancelAction = new ClosePopupAction(CANCEL);
+ inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), cancelAction);
+ actionMap.put(cancelAction, cancelAction);
+ inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.ALT_DOWN_MASK), closeAction);
+ final boolean enterConfirms = ResourceController.getResourceController().getBooleanProperty("el__enter_confirms_by_default");
+ if(enterConfirms)
+ inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), closeAction);
+ actionMap.put(closeAction, closeAction);
+ }
+ }
+ });
+ }
+
+ public Color getColor(final ConnectorModel model) {
+ return model.getColor();
+ }
+
+ public int[] getDash(final ConnectorModel model) {
+ return model.getDash();
+ }
+
+ public String getLinkShortText(final NodeModel node) {
+ final URI uri = NodeLinks.getLink(node);
+ if (uri == null) {
+ return null;
+ }
+ final String adaptedText = uri.toString();
+ if (adaptedText.startsWith("#")) {
+ ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel dest = modeController.getMapController().getNodeFromID(adaptedText.substring(1));
+ if (dest != null) {
+ return TextController.getController().getShortPlainText(dest);
+ }
+ return TextUtils.getText("link_not_available_any_more");
+ }
+ return adaptedText;
+ }
+
+ public Collection<NodeLinkModel> getLinksFrom(NodeModel node) {
+ return NodeLinks.getLinks(node);
+ }
+
+ public Collection<NodeLinkModel> getLinksTo(final NodeModel target) {
+ if (target.hasID() == false) {
+ return Collections.emptySet();
+ }
+ final MapLinks links = target.getMap().getExtension(MapLinks.class);
+ if (links == null) {
+ return Collections.emptySet();
+ }
+
+ ArrayList<NodeLinkModel> clonedLinks = null;
+ for(NodeModel targetClone : target.subtreeClones()){
+ final Set<NodeLinkModel> set = links.get(targetClone.createID());
+ if (set == null) {
+ continue;
+ }
+ if(target.subtreeClones().size() == 1)
+ return set;
+ if (clonedLinks == null)
+ clonedLinks = new ArrayList<NodeLinkModel>(10);
+ for(NodeLinkModel sharedLink : set){
+ final Collection<NodeLinkModel> linkClones = sharedLink.clones();
+ for(NodeLinkModel linkClone : linkClones)
+ if(target.equals(linkClone.getTarget()))
+ clonedLinks.add(linkClone);
+ }
+ }
+ return clonedLinks != null ? clonedLinks : Collections.<NodeLinkModel>emptySet();
+ }
+
+ /**
+ * Link implementation: If this is a link, we want to make a popup with at
+ * least removelink available.
+ */
+ public Component getPopupForModel(final java.lang.Object obj) {
+ if (obj instanceof ConnectorModel) {
+ final ConnectorModel link = (ConnectorModel) obj;
+ final Box arrowLinkPopup = Box.createVerticalBox();
+ arrowLinkPopup.setName(TextUtils.getText("connector"));
+ createArrowLinkPopup(link, arrowLinkPopup);
+ return arrowLinkPopup;
+ }
+ return null;
+ }
+
+ public static final String RESOURCES_LINK_COLOR = "standardlinkcolor";
+ private static final String RESOURCES_CONNECTOR_SHAPE = "connector_shape";
+ private static final String RESOURCES_CONNECTOR_COLOR_ALPHA = "connector_alpha";
+ private static final String RESOURCES_CONNECTOR_WIDTH = "connector_width";
+
+ public int getWidth(final ConnectorModel model) {
+ return model.getWidth();
+ }
+
+ public void loadLink(final NodeModel node, String link) {
+ NodeLinks links = NodeLinks.getLinkExtension(node);
+ if (links == null) {
+ links = NodeLinks.createLinkExtension(node);
+ }
+ if (link != null && link.startsWith("#")) {
+ links.setLocalHyperlink(node, link.substring(1));
+ }
+ else {
+ try {
+ if (link.startsWith("\"") && link.endsWith("\"")) {
+ link = link.substring(1, link.length() - 1);
+ }
+ final URI hyperlink = LinkController.createURI(link);
+ links.setHyperLink(hyperlink);
+ }
+ catch (final URISyntaxException e1) {
+ LogUtils.warn(e1);
+ UITools.errorMessage(TextUtils.format("link_error", link));
+ return;
+ }
+ }
+ }
+
+ void loadLinkFormat(NodeModel node, boolean enabled) {
+ NodeLinks.createLinkExtension(node).setFormatNodeAsHyperlink(enabled);
+ }
+
+
+ public void loadURL(final NodeModel node, final MouseEvent e) {
+ loadURL(node, new ActionEvent(e.getSource(), e.getID(), null));
+ }
+
+ public void loadURL(final MouseEvent e) {
+ ModeController modeController = Controller.getCurrentModeController();
+ loadURL(modeController.getMapController().getSelectedNode(), e);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void loadURI(URI uri) {
+ UrlManager.getController().loadURL(uri);
+ }
+
+ public void loadMap(String map)
+ throws URISyntaxException {
+ UrlManager.getController().loadMap(map);
+ }
+
+ protected void loadURL(final NodeModel selectedNode, final ActionEvent e) {
+ loadURL(selectedNode, e, NodeLinks.getValidLink(selectedNode));
+ }
+
+ public void loadURL(final NodeModel selectedNode, final ActionEvent e, final URI link) {
+ if (link != null) {
+ onDeselect(selectedNode);
+ ModeController modeController = Controller.getCurrentModeController();
+ if (LinkController.isMenuItemLink(link)) {
+ if (e == null) {
+ throw new IllegalArgumentException("ActionEvent is needed for menu item links");
+ }
+ final String actionKey = LinkController.parseSpecialLink(link);
+ final Action action = modeController.getAction(actionKey);
+
+ if (action != null) {
+ action.actionPerformed(e);
+ } else {
+ LogUtils.warn("Trying to call a menu hyperlink action with key '" //
+ + actionKey + "'that doesn't exist.");
+ }
+ }
+ else if (LinkController.isSpecialLink(LinkController.EXECUTE_APP_SCHEME, link)) {
+ final String command = LinkController.parseSpecialLink(link);
+ try {
+ Controller.getCurrentController().getViewController().out(command);
+ Runtime.getRuntime().exec(command);
+ }
+ catch (IOException e1) {
+ }
+ }
+ else {
+ loadURI(link);
+ }
+ onSelect(modeController.getController().getSelection().getSelected());
+ }
+ }
+
+ public static int getLinkType() {
+ return getController().linkType();
+ }
+
+ public static final int LINK_ABSOLUTE = 0;
+ public static final int LINK_RELATIVE_TO_MINDMAP = 1;
+
+ public int linkType() {
+ String linkTypeProperty = ResourceController.getResourceController().getProperty("links");
+ if ("relative".equals(linkTypeProperty)) {
+ return LINK_RELATIVE_TO_MINDMAP;
+ }
+ return LINK_ABSOLUTE;
+ }
+
+ public static URI toLinkTypeDependantURI(final File map, final File input) {
+ int type = getLinkType();
+ if (type == LINK_ABSOLUTE) {
+ return input.getAbsoluteFile().toURI();
+ }
+ return toRelativeURI(map, input, type);
+ }
+
+ public static URI toLinkTypeDependantURI(final File map, final File input, final int linkType) {
+ return toRelativeURI(map, input, linkType);
+ }
+
+ public static URI toRelativeURI(final File map, final File input, final int linkType) {
+ return getController().createRelativeURI(map, input, linkType);
+ }
+
+ public static URI normalizeURI(URI uri){
+ final String UNC_PREFIX = "//";
+ URI normalizedUri = uri.normalize();
+ //Fix UNC paths that are incorrectly normalized by URI#resolve (see Java bug 4723726)
+ String normalizedPath = normalizedUri.getPath();
+ if ("file".equalsIgnoreCase(uri.getScheme()) && uri.getPath() != null && uri.getPath().startsWith(UNC_PREFIX) && (normalizedPath == null || !normalizedPath.startsWith(UNC_PREFIX))){
+ try {
+ normalizedUri = new URI(normalizedUri.getScheme(), ensureUNCPath(normalizedUri.getSchemeSpecificPart()), normalizedUri.getFragment());
+ } catch (URISyntaxException e) {
+ LogUtils.warn(e);
+ }
+ }
+ return normalizedUri;
+ }
+
+ private static String ensureUNCPath(String path) {
+ int len = path.length();
+ StringBuffer result = new StringBuffer(len);
+ for (int i = 0; i < 4; i++) {
+ // if we have hit the first non-slash character, add another leading slash
+ if (i >= len || result.length() > 0 || path.charAt(i) != '/')
+ result.append('/');
+ }
+ result.append(path);
+ return result.toString();
+ }
+
+ public URI createRelativeURI(final File map, final File input, final int linkType) {
+ if (linkType == LINK_ABSOLUTE) {
+ return null;
+ }
+ try {
+ URI mapUri = null;
+ if (map != null) {
+ mapUri = map.getAbsoluteFile().toURI();
+ }
+
+ final URI fileUri = input.getAbsoluteFile().toURI();
+ boolean isUNCinput = fileUri.getPath().startsWith("//");
+ boolean isUNCmap = mapUri.getPath().startsWith("//");
+ if((isUNCinput != isUNCmap)) {
+ return fileUri;
+ }
+ final String filePathAsString = fileUri.getRawPath();
+ final String mapPathAsString = mapUri.getRawPath();
+ int differencePos;
+ final int lastIndexOfSeparatorInMapPath = mapPathAsString.lastIndexOf("/");
+ final int lastIndexOfSeparatorInFilePath = filePathAsString.lastIndexOf("/");
+ int lastCommonSeparatorPos = -1;
+ for (differencePos = 0; differencePos <= lastIndexOfSeparatorInMapPath
+ && differencePos <= lastIndexOfSeparatorInFilePath
+ && filePathAsString.charAt(differencePos) == mapPathAsString.charAt(differencePos); differencePos++) {
+ if (filePathAsString.charAt(differencePos) == '/') {
+ lastCommonSeparatorPos = differencePos;
+ }
+ }
+ if (lastCommonSeparatorPos < 0) {
+ return fileUri;
+ }
+ final StringBuilder relativePath = new StringBuilder();
+ for (int i = lastCommonSeparatorPos + 1; i <= lastIndexOfSeparatorInMapPath; i++) {
+ if (mapPathAsString.charAt(i) == '/') {
+ relativePath.append("../");
+ }
+ }
+ relativePath.append(filePathAsString.substring(lastCommonSeparatorPos + 1));
+
+ return new URI(relativePath.toString());
+ }
+ catch (final URISyntaxException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+// public static URI toRelativeURI(final File map, final File input) {
+// try {
+// final URI fileUri = input.getAbsoluteFile().toURI();
+// if (map == null) {
+// return fileUri;
+// }
+// final URI mapUri = map.getAbsoluteFile().toURI();
+// final String filePathAsString = fileUri.getRawPath();
+// final String mapPathAsString = mapUri.getRawPath();
+// int differencePos;
+// final int lastIndexOfSeparatorInMapPath = mapPathAsString.lastIndexOf("/");
+// final int lastIndexOfSeparatorInFilePath = filePathAsString.lastIndexOf("/");
+// int lastCommonSeparatorPos = 0;
+// for (differencePos = 1; differencePos <= lastIndexOfSeparatorInMapPath
+// && differencePos <= lastIndexOfSeparatorInFilePath
+// && filePathAsString.charAt(differencePos) == mapPathAsString.charAt(differencePos); differencePos++) {
+// if (filePathAsString.charAt(differencePos) == '/') {
+// lastCommonSeparatorPos = differencePos;
+// }
+// }
+// if (lastCommonSeparatorPos == 0) {
+// return fileUri;
+// }
+// final StringBuilder relativePath = new StringBuilder();
+// for (int i = lastCommonSeparatorPos + 1; i <= lastIndexOfSeparatorInMapPath; i++) {
+// if (mapPathAsString.charAt(i) == '/') {
+// relativePath.append("../");
+// }
+// }
+// relativePath.append(filePathAsString.substring(lastCommonSeparatorPos + 1));
+// return new URI(relativePath.toString());
+// }
+// catch (final URISyntaxException e) {
+// e.printStackTrace();
+// }
+// return null;
+// }
+
+ // patterns only need to be compiled once
+ static Pattern patSMB = Pattern.compile( // \\host\path[#fragement]
+ "(?:\\\\\\\\([^\\\\]+)\\\\)(.*?)(?:#([^#]*))?");
+ static Pattern patFile = Pattern.compile( // [drive:]path[#fragment]
+ "((?:\\p{Alpha}:)?([/\\\\])?(?:[^:#?]*))?(?:#([^#]*))?");
+ static Pattern patURI = Pattern.compile( // [scheme:]scheme-specific-part[#fragment]
+ "(?:(\\p{Alpha}[\\p{Alnum}+.-]+):)?(.*?)(?:#([^#]*))?");
+
+ /* Function that tries to transform a not necessarily well-formed
+ * string into a valid URI. We use the fact that the single-argument
+ * URI constructor doesn't escape invalid characters (especially
+ * spaces), whereas the 3-argument constructors does do escape
+ * them (e.g. space into %20).
+ */
+ public static URI createURI(final String inputValue) throws URISyntaxException {
+ try { // first, we try if the string can be interpreted as URI
+ return new URI(inputValue);
+ }
+ catch (final URISyntaxException e) {
+ // [scheme:]scheme-specific-part[#fragment]
+ // we check first if the string matches an SMB
+ // of the form \\host\path[#fragment]
+ {
+ final Matcher mat = patSMB.matcher(inputValue);
+ if (mat.matches()) {
+ final String scheme = "smb";
+ final String ssp = "//" + mat.group(1) + "/" + mat.group(2).replace('\\', '/');
+ final String fragment = mat.group(3);
+ return new URI(scheme, ssp, fragment);
+ }
+ }
+ {
+ final Matcher mat = patFile.matcher(inputValue);
+ if (mat.matches()) {
+ String ssp = mat.group(1);
+ if (File.separatorChar != '/') {
+ ssp = ssp.replace(File.separatorChar, '/');
+ }
+ final String fragment = mat.group(3);
+ if (mat.group(2) == null) {
+ return new URI(null, null, ssp, fragment);
+ }
+ final String scheme = "file";
+ if (ssp.startsWith("//")) {
+ ssp = "//" + ssp;
+ }
+ else if (!ssp.startsWith("/")) {
+ ssp = "/" + ssp;
+ }
+ return new URI(scheme, null, ssp, fragment);
+ }
+ }
+ // if this doesn't work out, we try to
+ // recognize an URI of the form
+ // [scheme:]scheme-specific-part[#fragment]
+ {
+ final Matcher mat = patURI.matcher(inputValue);
+ if (mat.matches()) {
+ final String scheme = mat.group(1);
+ final String ssp = mat.group(2).replace('\\', '/');
+ final String fragment = mat.group(3);
+ return new URI(scheme, ssp, fragment);
+ }
+ }
+ throw new URISyntaxException(inputValue, "This doesn't look like a valid link (URI, file, SMB or URL).");
+ }
+ }
+
+ private static final Pattern urlPattern = Pattern.compile("file://[^\\s\"'<>]+|(:?https?|ftp)://[^\\s\"|<>{}]+");
+ private static final Pattern mailPattern = Pattern.compile("([!+\\-/=~.\\w#]+@[\\w.\\-+?&=%]+)");
+ private static final HashMap<String, Icon> menuItemCache = new HashMap<String, Icon>();
+
+ static public String findLink(final String text) {
+ final Matcher urlMatcher = urlPattern.matcher(text);
+ if (urlMatcher.find()) {
+ String link = urlMatcher.group();
+ try {
+ new URL(link).toURI();
+ return link;
+ }
+ catch (final MalformedURLException e) {
+ return null;
+ }
+ catch (final URISyntaxException e) {
+ return null;
+ }
+ }
+ final Matcher mailMatcher = mailPattern.matcher(text);
+ if (mailMatcher.find()) {
+ final String link = "mailto:" + mailMatcher.group();
+ return link;
+ }
+ return null;
+ }
+
+ public static URI createMenuItemLink(final String content) {
+ return createItemLink(MENUITEM_SCHEME, content);
+ }
+
+ /**
+ * the syntax of item URIs is
+ * <pre>
+ * "scheme" + ":" + "_" + <menuItemKey>
+ * </pre>
+ * Compared to <code>mailto:abc at somewhere.com</code> a "_" is added to prevent the rest being parsed
+ * as a regular path.
+ */
+ public static URI createItemLink(final String scheme, final String content) {
+ try {
+ return new URI(scheme, "_" + content, null);
+ }
+ catch (URISyntaxException e) {
+ throw new RuntimeException("huh? URI should have escaped illegal characters", e);
+ }
+ }
+
+ public static boolean isMenuItemLink(final URI uri) {
+ return isSpecialLink(MENUITEM_SCHEME, uri);
+ }
+
+ public static boolean isSpecialLink(final String requiredScheme, final URI uri) {
+ final String scheme = uri.getScheme();
+ return scheme != null && scheme.equals(requiredScheme);
+ }
+
+ // this will fail badly for non-menuitem uris!
+ public static String parseSpecialLink(final URI uri) {
+ return convertPre15VersionStyleKeysToCurrent(uri.getSchemeSpecificPart().substring(1));
+ }
+
+ private static String convertPre15VersionStyleKeysToCurrent(final String actionKey) {
+ return actionKey.startsWith("$") ? actionKey.replaceFirst("\\$(.*)\\$0", "$1") : actionKey;
+ }
+
+ public int getStandardConnectorWidth() {
+ final String standardWidth = ResourceController.getResourceController().getProperty(RESOURCES_CONNECTOR_WIDTH);
+ final int width = Integer.valueOf(standardWidth);
+ return width;
+ }
+
+ public void setStandardConnectorWidth(final int width) {
+ final String value = Integer.toString(width);
+ ResourceController.getResourceController().setProperty(RESOURCES_CONNECTOR_WIDTH, value);
+ }
+
+ public Color getStandardConnectorColor() {
+ final String standardColor = ResourceController.getResourceController().getProperty(RESOURCES_LINK_COLOR);
+ final Color color = ColorUtils.stringToColor(standardColor);
+ return color;
+ }
+
+ public void setStandardConnectorColor(final Color color) {
+ String value = ColorUtils.colorToString(color);
+ ResourceController.getResourceController().setProperty(RESOURCES_LINK_COLOR, value);
+ }
+
+ public Shape getStandardConnectorShape() {
+ final String standardShape = ResourceController.getResourceController().getProperty(RESOURCES_CONNECTOR_SHAPE);
+ final Shape shape = Shape.valueOf(standardShape);
+ return shape;
+ }
+
+ public void setStandardConnectorShape(final Shape shape) {
+ String value = shape.toString();
+ ResourceController.getResourceController().setProperty(RESOURCES_CONNECTOR_SHAPE, value);
+ }
+
+
+ public int getStandardConnectorAlpha() {
+ final String standardAlpha = ResourceController.getResourceController().getProperty(RESOURCES_CONNECTOR_COLOR_ALPHA);
+ final int alpha = Integer.valueOf(standardAlpha);
+ return alpha;
+ }
+
+ public void setStandardAlpha(final int alpha) {
+ final String value = Integer.toString(alpha);
+ ResourceController.getResourceController().setProperty(RESOURCES_CONNECTOR_COLOR_ALPHA, value);
+ }
+
+ public int getAlpha(ConnectorModel connectorModel) {
+ return connectorModel.getAlpha();
+ }
+
+ public int getStandardLabelFontSize() {
+ return ResourceController.getResourceController().getIntProperty("label_font_size", 12);
+ }
+
+ public String getStandardLabelFontFamily() {
+ return ResourceController.getResourceController().getProperty("label_font_family");
+ }
+
+ private static final String MENUITEM_ICON = "icons/button.png";
+ private static final String EXECUTABLE_ICON = ResourceController.getResourceController().getProperty("executable_icon");
+ private static final IconStore ICON_STORE = IconStoreFactory.create();
+ public static enum LinkType{
+ LOCAL(LINK_LOCAL_ICON), MAIL(MAIL_ICON), EXECUTABLE(EXECUTABLE_ICON), MENU(MENUITEM_ICON), DEFAULT(LINK_ICON);
+ LinkType(String iconPath){
+ final UIIcon uiIcon = ICON_STORE.getUIIcon(iconPath);
+ if(uiIcon == null)
+ this.icon = null;
+ else
+ this.icon = uiIcon.getIcon();
+ }
+ final public Icon icon;
+ }
+
+ public Icon getLinkIcon(final URI link, final NodeModel model) {
+ final LinkType linkType = getLinkType(link, model);
+ if(linkType == null)
+ return null;
+ if(linkType.equals(LinkType.MENU)){
+ final String menuItemKey = parseSpecialLink(link);
+ synchronized (menuItemCache) {
+ Icon icon = menuItemCache.get(menuItemKey);
+ if (icon == null) {
+ final Icon menuItemIcon = MenuUtils.getMenuItemIcon(menuItemKey);
+ icon = (menuItemIcon == null) ? ICON_STORE.getUIIcon(MENUITEM_ICON).getIcon() : menuItemIcon;
+ menuItemCache.put(menuItemKey, icon);
+ }
+ return icon;
+ }
+ }
+ if(LinkType.DEFAULT == linkType && formatNodeAsHyperlink(model))
+ return null;
+ return linkType.icon;
+
+ }
+
+ public static LinkType getLinkType(final URI link, final NodeModel model) {
+ if (link == null)
+ return null;
+ final String linkText = link.toString();
+ if (linkText.startsWith("#")) {
+ final String id = linkText.substring(1);
+ if (model == null || model.getMap().getNodeForID(id) == null) {
+ return null;
+ }
+ else{
+ return LinkType.LOCAL;
+ }
+ }
+ else if (linkText.startsWith("mailto:")) {
+ return LinkType.MAIL;
+ }
+ else if (isMenuItemLink(link)) {
+ return LinkType.MENU;
+ }
+ else if (isSpecialLink(EXECUTE_APP_SCHEME, link) || Compat.isWindowsExecutable(link)) {
+ return LinkType.EXECUTABLE;
+ }
+ else{
+ return LinkType.DEFAULT;
+ }
+ }
+
+ public boolean formatNodeAsHyperlink(final NodeModel node){
+ String text = node.getText();
+ if (text.isEmpty() || HtmlUtils.isHtmlNode(text))
+ return false;
+ final Boolean ownFlag = ownFormatNodeAsHyperlink(node);
+ if(ownFlag != null)
+ return ownFlag;
+ Collection<IStyle> collection = LogicalStyleController.getController(modeController).getStyles(node);
+ final MapStyleModel mapStyles = MapStyleModel.getExtension(node.getMap());
+ for(IStyle styleKey : collection){
+ final NodeModel styleNode = mapStyles.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final Boolean styleFlag = ownFormatNodeAsHyperlink(styleNode);
+ if(styleFlag != null)
+ return styleFlag;
+
+ }
+ return false;
+ }
+
+ private Boolean ownFormatNodeAsHyperlink(final NodeModel node){
+ final NodeLinks linkModel = NodeLinks.getLinkExtension(node);
+ if(linkModel == null){
+ return null;
+ }
+ final Boolean formatNodeAsHyperlink = linkModel.formatNodeAsHyperlink();
+ return formatNodeAsHyperlink;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/LinkTransformer.java b/freeplane/src/main/java/org/freeplane/features/link/LinkTransformer.java
new file mode 100644
index 0000000..6382b65
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/LinkTransformer.java
@@ -0,0 +1,76 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.net.URI;
+
+import javax.swing.Icon;
+
+import org.freeplane.core.ui.components.ObjectAndIcon;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.text.AbstractContentTransformer;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.ui.FrameController;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 3, 2011
+ */
+public class LinkTransformer extends AbstractContentTransformer {
+ private ModeController modeController;
+
+ public LinkTransformer(ModeController modeController, int priority) {
+ super(priority);
+ this.modeController = modeController;
+ }
+
+ public void registerListeners(ModeController modeController) {
+ final NodeUpdateChangeListener listener = new NodeUpdateChangeListener();
+ modeController.getMapController().addNodeChangeListener(listener);
+ modeController.getMapController().addMapChangeListener(listener);
+ }
+
+ public Object transformContent(TextController textController, Object content, NodeModel node, Object transformedExtension) {
+ if(PatternFormat.IDENTITY_PATTERN.equals(textController.getNodeFormat(node)))
+ return content;
+ final MapModel map = node.getMap();
+ return transformContent(content, map);
+ }
+
+ public Object transformContent(Object content, MapModel map) {
+ if(! (content instanceof URI))
+ return content;
+ final String string = content.toString();
+ if(! string.startsWith("#"))
+ return content;
+ final String nodeID=string.substring(1);
+ final NodeModel target = map.getNodeForID(nodeID);
+ if(target != null){
+ final String shortText = TextController.getController(modeController).getShortPlainText(target);
+ final Icon icon = FrameController.localLinkIcon;
+ return new ObjectAndIcon(shortText, icon);
+ }
+ else
+ return content;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/MapLinks.java b/freeplane/src/main/java/org/freeplane/features/link/MapLinks.java
new file mode 100644
index 0000000..dd08262
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/MapLinks.java
@@ -0,0 +1,86 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.MapModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MapLinks implements IExtension {
+ final private HashMap<String, Set<NodeLinkModel>> links = new HashMap<String, Set<NodeLinkModel>>();
+
+ public boolean add(final NodeLinkModel link) {
+ final String targetID = link.getTargetID();
+ Set<NodeLinkModel> set = links.get(targetID);
+ if (set == null) {
+ set = new HashSet<NodeLinkModel>();
+ set.add(link);
+ links.put(targetID, set);
+ return true;
+ }
+ if (set.contains(link)) {
+ return false;
+ }
+ set.add(link);
+ return true;
+ }
+
+ public boolean containsTarget(final String targetID) {
+ return links.containsKey(targetID);
+ }
+
+ public Set<NodeLinkModel> get(final String targetID) {
+ if (targetID == null) {
+ return null;
+ }
+ final Set<NodeLinkModel> set = links.get(targetID);
+ return set == null ? null : Collections.unmodifiableSet(set);
+ }
+
+ public boolean remove(final NodeLinkModel link) {
+ final String targetID = link.getTargetID();
+ final Set<NodeLinkModel> set = links.get(targetID);
+ if (set == null) {
+ return false;
+ }
+ if (set.remove(link)) {
+ if (set.isEmpty()) {
+ links.remove(targetID);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ public void set(final String targetID, final Set<NodeLinkModel> set) {
+ links.put(targetID, set);
+ }
+
+ public static MapLinks getLinks(final MapModel map) {
+ return (MapLinks) map.getExtension(MapLinks.class);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/NodeLinkModel.java b/freeplane/src/main/java/org/freeplane/features/link/NodeLinkModel.java
new file mode 100644
index 0000000..f12255a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/NodeLinkModel.java
@@ -0,0 +1,78 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.freeplane.features.map.Clones;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 08.08.2009
+ */
+public abstract class NodeLinkModel{
+
+ private String targetID;
+ final private NodeModel source;
+
+ public NodeLinkModel(final NodeModel source, final String targetID) {
+ this.targetID = targetID;
+ this.source = source;
+ }
+
+ public NodeModel getSource() {
+ return source;
+ }
+
+ public NodeModel getTarget() {
+ return getSource().getMap().getNodeForID(getTargetID());
+ }
+
+ public String getTargetID() {
+ return targetID;
+ }
+
+ void setTargetID(final String targetID) {
+ this.targetID = targetID;
+ }
+
+ public boolean isSelfLink() {
+ return getSource().createID().equals(getTargetID());
+ }
+
+ public Collection<NodeLinkModel> clones() {
+ final Clones sourceNodeClones = getSource().subtreeClones();
+ if(sourceNodeClones.size() == 1)
+ return Arrays.<NodeLinkModel>asList(this);
+ ArrayList<NodeLinkModel> clones = new ArrayList<NodeLinkModel>(sourceNodeClones.size());
+ for(NodeModel sourceClone : sourceNodeClones) {
+ final NodeLinkModel cloneForSource = cloneForSource(sourceClone);
+ if(cloneForSource != null)
+ clones.add(cloneForSource);
+ }
+ return clones;
+ }
+
+ public abstract NodeLinkModel cloneForSource(NodeModel sourceClone);
+ public abstract NodeLinkModel cloneForSource(NodeModel sourceClone, String targetId);
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/NodeLinks.java b/freeplane/src/main/java/org/freeplane/features/link/NodeLinks.java
new file mode 100644
index 0000000..13dda8a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/NodeLinks.java
@@ -0,0 +1,234 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class NodeLinks implements IExtension {
+ public static final Object CONNECTOR = "connector";
+
+ /**
+ * @param source2
+ * @return
+ */
+ public static NodeLinks createLinkExtension(final NodeModel node) {
+ NodeLinks nodeLinks = NodeLinks.getLinkExtension(node);
+ if (nodeLinks != null) {
+ return nodeLinks;
+ }
+ nodeLinks = new NodeLinks();
+ node.addExtension(nodeLinks);
+ return nodeLinks;
+ }
+
+ public static URI getLink(final NodeModel node) {
+ final NodeLinks links = NodeLinks.getLinkExtension(node);
+ return links != null ? links.getHyperLink(node) : null;
+ }
+
+ public static Boolean formatNodeAsHyperlink(final NodeModel node) {
+ final NodeLinks links = NodeLinks.getLinkExtension(node);
+ return links != null ? links.formatNodeAsHyperlink() : null;
+ }
+
+ public static String getLinkAsString(final NodeModel selectedNode) {
+ final URI link = NodeLinks.getValidLink(selectedNode);
+ return link != null ? link.toString() : null;
+ }
+
+ /**
+ * @param node
+ * @return
+ */
+ public static NodeLinks getLinkExtension(final NodeModel node) {
+ return node.getExtension(NodeLinks.class);
+ }
+
+ public static Collection<NodeLinkModel> getLinks(final NodeModel node) {
+ final NodeLinks links = NodeLinks.getLinkExtension(node);
+ if (links != null) {
+ final Collection<NodeLinkModel> sharedLinks = links.getLinks();
+ final ArrayList<NodeLinkModel> clones = new ArrayList<NodeLinkModel>(sharedLinks.size());
+ for(NodeLinkModel sharedLink : sharedLinks){
+ final NodeLinkModel cloneForSource = sharedLink.cloneForSource(node);
+ if(cloneForSource != null)
+ clones.add(cloneForSource);
+ }
+ return clones;
+ }
+ else
+ return Collections.<NodeLinkModel> emptyList();
+ }
+
+ private URI nonLocalHyperlink;
+ private Boolean formatNodeAsHyperlink;
+ final private LinkedList<NodeLinkModel> links;
+ //DOCEAR - fixed: new property type for node link changes
+ static public final Object HYPERLINK_CHANGED = "hyperlink_changed";
+
+ public NodeLinks() {
+ links = new LinkedList<NodeLinkModel>();
+ }
+
+ public void addArrowlink(final NodeLinkModel newLink) {
+ links.add(newLink);
+ final MapModel map = newLink.getSource().getMap();
+ addLinkToMap(map, newLink);
+ }
+
+ private void addLinkToMap(final MapModel map, final NodeLinkModel newLink) {
+ MapLinks mapLinks = MapLinks.getLinks(map);
+ if (mapLinks == null) {
+ mapLinks = new MapLinks();
+ map.addExtension(mapLinks);
+ }
+ mapLinks.add(newLink);
+ }
+
+ /**
+ * @return
+ */
+ public URI getHyperLink(NodeModel clone) {
+ if(nonLocalHyperlink != null)
+ return nonLocalHyperlink;
+ final Iterator<NodeLinkModel> iterator = links.iterator();
+ while (iterator.hasNext()) {
+ final NodeLinkModel link = iterator.next();
+ if (link instanceof HyperTextLinkModel) {
+ try {
+ return new URI("#" + link.getTargetID());
+ }
+ catch (URISyntaxException e) {
+ LogUtils.severe(e);
+ }
+ }
+ }
+ return null;
+ }
+
+ public List<NodeLinkModel> getLinks() {
+ return Collections.unmodifiableList(links);
+ }
+
+ public void removeArrowlink(final NodeLinkModel link) {
+ final NodeModel node = link.getSource();
+ for (final NodeLinkModel i : NodeLinks.getLinkExtension(node).links) {
+ if (link.equals(i.cloneForSource(link.getSource()))) {
+ links.remove(i);
+ final MapModel map = link.getSource().getMap();
+ removeLinkFromMap(map, i);
+ return;
+ }
+ }
+ }
+
+ private void removeLinkFromMap(final MapModel map, final NodeLinkModel link) {
+ final MapLinks mapLinks = MapLinks.getLinks(map);
+ mapLinks.remove(link);
+ }
+
+ public String removeLocalHyperLink(final NodeModel node) {
+ final Iterator<NodeLinkModel> iterator = links.iterator();
+ while (iterator.hasNext()) {
+ final NodeLinkModel link = iterator.next();
+ if (link instanceof HyperTextLinkModel) {
+ iterator.remove();
+ removeLinkFromMap(node.getMap(), link);
+ return link.getTargetID();
+ }
+ }
+ return null;
+ }
+
+ public void setHyperLink(final URI hyperlink) {
+ this.nonLocalHyperlink = hyperlink;
+ }
+
+ public void setLocalHyperlink(final NodeModel node, final String targetID) {
+ this.nonLocalHyperlink = null;
+ removeLocalHyperLink(node);
+ if (targetID != null) {
+ final HyperTextLinkModel link = new HyperTextLinkModel(node, targetID);
+ links.add(link);
+ addLinkToMap(node.getMap(), link);
+ }
+ }
+
+ public static URI getValidLink(final NodeModel model) {
+ final URI link = NodeLinks.getLink(model);
+ if (link == null) {
+ return null;
+ }
+ final String linkString = link.toString();
+ if (linkString.startsWith("#")) {
+ final String id = linkString.substring(1);
+ if (model.getMap().getNodeForID(id) == null) {
+ return null;
+ }
+ }
+ return link;
+ }
+
+ public Boolean formatNodeAsHyperlink() {
+ return formatNodeAsHyperlink;
+ }
+
+ public void setFormatNodeAsHyperlink(Boolean formatNodeAsHyperlink) {
+ this.formatNodeAsHyperlink = formatNodeAsHyperlink;
+ }
+
+ public void replaceMapLinksForDeletedSourceNode(MapLinks mapLinks, final NodeModel deletionRoot, NodeModel node) {
+ final ListIterator<NodeLinkModel> linkIterator = links.listIterator();
+ LINKS: while (linkIterator.hasNext()) {
+ NodeLinkModel link = linkIterator.next();
+ final NodeModel linkSource = link.getSource();
+ if(linkSource.equals(node)) {
+ mapLinks.remove(link);
+ linkIterator.remove();
+ for(NodeModel newSource : node.subtreeClones()){
+ if(node != newSource && ! newSource.isDescendantOf(deletionRoot)) {
+ final NodeLinkModel cloneForSource = link.cloneForSource(newSource);
+ if(cloneForSource != null){
+ linkIterator.add(cloneForSource);
+ mapLinks.add(cloneForSource);
+ continue LINKS;
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/NodeUpdateChangeListener.java b/freeplane/src/main/java/org/freeplane/features/link/NodeUpdateChangeListener.java
new file mode 100644
index 0000000..746f4e7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/NodeUpdateChangeListener.java
@@ -0,0 +1,68 @@
+package org.freeplane.features.link;
+
+import java.util.List;
+
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.text.IContentTransformer;
+
+/** cares for updating formula nodes on change of other nodes. */
+public class NodeUpdateChangeListener implements INodeChangeListener, IMapChangeListener{
+ public void nodeChanged(NodeChangeEvent event) {
+ Object property = event.getProperty();
+ // Note: this doesn't mean that other properties are not interesting here (e.g. links, notes, ...)
+ // since all these could be referenced by formulas too. It's restricted to the properties that may
+ // contain formulas only to limit the number of updates.
+ if (NodeModel.NODE_TEXT.equals(property)) {
+ nodeChangedImpl(false, event.getNode());
+ }
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ nodeChangedImpl(true, nodeDeletionEvent.parent);
+ }
+
+ public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
+ // all formulas dependent on the child via getChildren() are also dependent on its parent
+ nodeChangedImpl(true, parent);
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ // - all formulas dependent on the child via getChildren() are also dependent on its parent
+ // FIXME: is child updated or do we have to force that here?
+ nodeChangedImpl(true, nodeMoveEvent.oldParent, nodeMoveEvent.newParent);
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void mapChanged(MapChangeEvent event) {
+
+ }
+
+ /** in case of insert we look for dependencies of the parent. But the parent is not actually changed in this case.
+ * So there won't be any updates on the parent, even if it has formula that needs an update due to the
+ * changed children count. */
+ private void nodeChangedImpl(boolean includeChanged, NodeModel... nodes) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ //FIXME: needed???
+ // if (modeController == null || modeController.isUndoAction()) {
+ // return;
+ // }
+ final List<NodeModel> dependencies = EvaluationDependencies.manageChangeAndReturnDependencies(includeChanged, nodes);
+ for (NodeModel dependentNode : dependencies) {
+ modeController.getMapController().delayedNodeRefresh(dependentNode, IContentTransformer.class,
+ null, null);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/AddConnectorAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/AddConnectorAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/AddConnectorAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/AddConnectorAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/AddExecutionLinkAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/AddExecutionLinkAction.java
new file mode 100644
index 0000000..1b4d9ae
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/AddExecutionLinkAction.java
@@ -0,0 +1,59 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 Volker Boerchers
+ *
+ * This file author is Volker Boerchers
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.net.URI;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+class AddExecutionLinkAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public AddExecutionLinkAction() {
+ super(AddExecutionLinkAction.class.getSimpleName());
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel selectedNode = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ String linkAsString;
+ final URI link = NodeLinks.getLink(selectedNode);
+ if (link != null && LinkController.isSpecialLink(LinkController.EXECUTE_APP_SCHEME, link))
+ linkAsString = LinkController.parseSpecialLink(link);
+ else
+ linkAsString = "";
+ final String content = UITools.showInputDialog(Controller.getCurrentController().getSelection().getSelected(),
+ TextUtils.getText("enter_command"), linkAsString);
+
+ final MLinkController linkController = (MLinkController) LinkController.getController();
+ if (content != null) {
+ final URI newLink = content.isEmpty() ? null : LinkController.createItemLink(LinkController.EXECUTE_APP_SCHEME, content);
+ linkController
+ .setLink(selectedNode, newLink,
+ LinkController.LINK_ABSOLUTE);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/AddLocalLinkAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/AddLocalLinkAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/AddLocalLinkAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/AddLocalLinkAction.java
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/AddMenuItemLinkAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/AddMenuItemLinkAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/AddMenuItemLinkAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/AddMenuItemLinkAction.java
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorArrowsAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ChangeConnectorArrowsAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorArrowsAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ChangeConnectorArrowsAction.java
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorDashAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ChangeConnectorDashAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorDashAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ChangeConnectorDashAction.java
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorShapeAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ChangeConnectorShapeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/ChangeConnectorShapeAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ChangeConnectorShapeAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ClearLinkAnchorAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ClearLinkAnchorAction.java
new file mode 100644
index 0000000..e67a8dc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ClearLinkAnchorAction.java
@@ -0,0 +1,55 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Nnamdi Kohn in 2012.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.freeplane.features.link.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.link.LinkController;
+
+ at EnabledAction(checkOnNodeChange=true)
+public class ClearLinkAnchorAction extends AFreeplaneAction {
+ public ClearLinkAnchorAction() {
+ super("ClearLinkAnchorAction");
+ }
+
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+
+ /**
+ * @TODO
+ *
+ * -# clear tickmark in menu
+ * -# clear tooltip for mouse-over ClearLinkAnchorAction in menu
+ *
+ */
+
+ // clear current anchor in LinkModule
+ ((MLinkController)(LinkController.getController())).setAnchorID( null );
+ }
+ @Override
+ public void setEnabled() {
+ final boolean isAnchored = ((MLinkController)(LinkController.getController())).isAnchored();
+ setEnabled( isAnchored );
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ConnectorColorAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ConnectorColorAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/ConnectorColorAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ConnectorColorAction.java
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ExtractLinkFromTextAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ExtractLinkFromTextAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/ExtractLinkFromTextAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/ExtractLinkFromTextAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/MLinkController.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/MLinkController.java
new file mode 100644
index 0000000..dd3923f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/MLinkController.java
@@ -0,0 +1,1158 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link.mindmapmode;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.awt.GraphicsEnvironment;
+import java.awt.Point;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.FocusManager;
+import javax.swing.Icon;
+import javax.swing.InputMap;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JList;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.JSlider;
+import javax.swing.JSpinner;
+import javax.swing.JTextArea;
+import javax.swing.KeyStroke;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.ArrowType;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.ConnectorModel.Shape;
+import org.freeplane.features.link.HyperTextLinkModel;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.MapLinks;
+import org.freeplane.features.link.NodeLinkModel;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.map.IExtensionCopier;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.map.mindmapmode.DocuMapAttribute;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
+import org.freeplane.features.styles.LogicalStyleKeys;
+import org.freeplane.features.url.UrlManager;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MLinkController extends LinkController {
+ private static class StyleCopier implements IExtensionCopier {
+
+ public void copy(Object key, NodeModel from, NodeModel to) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ copy(from, to);
+ }
+
+ public void copy(NodeModel from, NodeModel to) {
+ final Boolean formatNodeAsHyperlink = NodeLinks.formatNodeAsHyperlink(from);
+ if(formatNodeAsHyperlink != null)
+ NodeLinks.createLinkExtension(to).setFormatNodeAsHyperlink(formatNodeAsHyperlink);
+
+ }
+
+ public void remove(Object key, NodeModel from) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ final NodeLinks model = NodeLinks.getLinkExtension(from);
+ if(model != null)
+ model.setFormatNodeAsHyperlink(null);
+ }
+
+ public void remove(Object key, NodeModel from, NodeModel which) {
+ if(NodeLinks.formatNodeAsHyperlink(which) != null)
+ remove(key, from);
+ }
+ public void resolveParentExtensions(Object key, NodeModel to) {
+ }
+ }
+ private final class CreateArrowLinkActor implements IActor {
+ private final String targetID;
+ private final NodeModel source;
+ private ConnectorModel arrowLink;
+
+ public ConnectorModel getArrowLink() {
+ return arrowLink;
+ }
+
+ private CreateArrowLinkActor(final String targetID, final NodeModel source) {
+ this.targetID = targetID;
+ this.source = source;
+ }
+
+ public void act() {
+ NodeLinks nodeLinks = NodeLinks.createLinkExtension(source);
+ arrowLink = new ConnectorModel(source, targetID,
+ getStandardConnectorColor(), getStandardConnectorAlpha(),
+ getStandardConnectorShape(), getStandardConnectorWidth(),
+ getStandardLabelFontFamily(), getStandardLabelFontSize());
+ nodeLinks.addArrowlink(arrowLink);
+ fireNodeConnectorChange(source, arrowLink);
+ }
+
+ public String getDescription() {
+ return "addLink";
+ }
+
+ public void undo() {
+ final NodeLinks nodeLinks = NodeLinks.getLinkExtension(source);
+ nodeLinks.removeArrowlink(arrowLink);
+ fireNodeConnectorChange(source, arrowLink);
+ }
+ }
+
+ private final class TargetLabelSetter implements IActor {
+ private final String oldLabel;
+ private final String label;
+ private final ConnectorModel model;
+
+ private TargetLabelSetter(final String oldLabel, final String label, final ConnectorModel model) {
+ this.oldLabel = oldLabel;
+ this.label = label;
+ this.model = model;
+ }
+
+ public void act() {
+ model.setTargetLabel(label);
+ fireNodeConnectorChange(model.getSource(), model);
+ }
+
+ public String getDescription() {
+ return "setTargetLabel";
+ }
+
+ public void undo() {
+ model.setTargetLabel(oldLabel);
+ fireNodeConnectorChange(model.getSource(), model);
+ }
+ }
+
+ private final class SourceLabelSetter implements IActor {
+ private final ConnectorModel model;
+ private final String label;
+ private final String oldLabel;
+
+ private SourceLabelSetter(final ConnectorModel model, final String label, final String oldLabel) {
+ this.model = model;
+ this.label = label;
+ this.oldLabel = oldLabel;
+ }
+
+ public void act() {
+ model.setSourceLabel(label);
+ fireNodeConnectorChange(model.getSource(), model);
+ }
+
+ public String getDescription() {
+ return "setSourceLabel";
+ }
+
+ public void undo() {
+ model.setSourceLabel(oldLabel);
+ fireNodeConnectorChange(model.getSource(), model);
+ }
+ }
+
+ private final class MiddleLabelSetter implements IActor {
+ private final ConnectorModel model;
+ private final String oldLabel;
+ private final String label;
+
+ private MiddleLabelSetter(final ConnectorModel model, final String oldLabel, final String label) {
+ this.model = model;
+ this.oldLabel = oldLabel;
+ this.label = label;
+ }
+
+ public void act() {
+ model.setMiddleLabel(label);
+ fireNodeConnectorChange(model.getSource(), model);
+ }
+
+ public String getDescription() {
+ return "setMiddleLabel";
+ }
+
+ public void undo() {
+ model.setMiddleLabel(oldLabel);
+ fireNodeConnectorChange(model.getSource(), model);
+ }
+ }
+
+ /**
+ * @author Dimitry Polivaev
+ */
+ private final class MapLinkChanger implements IMapChangeListener {
+
+ public void mapChanged(final MapChangeEvent event) {
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel model, final int newIndex) {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ final MapModel map = model.getMap();
+ final MapLinks links = map.getExtension(MapLinks.class);
+ if (links != null) {
+ insertMapLinks(links, model);
+ updateMapLinksForTargetTree(links, model);
+ }
+ }
+ });
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ NodeModel model = nodeDeletionEvent.node;
+ final MapModel map = model.getMap();
+ final MapLinks links = map.getExtension(MapLinks.class);
+ if (links != null) {
+ deleteMapLinks(links, model, model);
+ updateMapLinksForTargetTree(links, model);
+ }
+ }
+
+ private void insertMapLinks(final MapLinks links, final NodeModel model) {
+ final List<NodeModel> children = model.getChildren();
+ for (final NodeModel child : children) {
+ insertMapLinks(links, child);
+ }
+ insertMapLinksForInsertedSourceNode(links, model);
+ }
+
+ private void insertMapLinksForInsertedSourceNode(MapLinks links, NodeModel model) {
+ final NodeLinks nodeLinks = NodeLinks.getLinkExtension(model);
+ if (nodeLinks != null) {
+ for (final NodeLinkModel link : nodeLinks.getLinks()) {
+ links.add(link);
+ }
+ }
+ }
+
+ private void deleteMapLinks(final MapLinks links, final NodeModel deletionRoot, NodeModel node) {
+ final List<NodeModel> children = node.getChildren();
+ for (final NodeModel child : children) {
+ deleteMapLinks(links, deletionRoot, child);
+ }
+ final NodeLinks nodeLinks = NodeLinks.getLinkExtension(node);
+ if (nodeLinks != null) {
+ nodeLinks.replaceMapLinksForDeletedSourceNode(links, deletionRoot, node);
+ }
+ }
+
+ private void updateMapLinksForTargetTree(final MapLinks links, final NodeModel model) {
+ final List<NodeModel> children = model.getChildren();
+ for (final NodeModel child : children) {
+ updateMapLinksForTargetTree(links, child);
+ }
+ final String id = model.getID();
+ if (id == null) {
+ return;
+ }
+ final Set<NodeLinkModel> linkModels = links.get(id);
+ if (linkModels == null || linkModels.isEmpty()) {
+ return;
+ }
+ for (final NodeLinkModel link : linkModels) {
+ final NodeModel source = link.getSource();
+ if (link instanceof HyperTextLinkModel)
+ Controller.getCurrentModeController().getMapController().delayedNodeRefresh(source, NodeModel.NODE_ICON,
+ null, null);
+ else if(link instanceof ConnectorModel)
+ fireNodeConnectorChange(source, (ConnectorModel) link);
+ }
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+ }
+
+ static private SetLinkByFileChooserAction setLinkByFileChooser;
+ static private SetLinkByTextFieldAction setLinkByTextField;
+ private String anchorID;
+ final private MapLinkChanger mapLinkChanger;
+ public MLinkController(ModeController modeController) {
+ super(modeController);
+ this.anchorID = "";
+ mapLinkChanger = new MapLinkChanger();
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+ this.anchorID = "";
+ createActions();
+ modeController.registerExtensionCopier(new StyleCopier());
+ (modeController.getMapController()).addMapChangeListener(mapLinkChanger);
+ }
+
+ public ConnectorModel addConnector(final NodeModel source, final NodeModel target) {
+ return addConnector(source, target.createID());
+ }
+
+ public void changeArrowsOfArrowLink(final ConnectorModel link, final ArrowType startArrow, final ArrowType endArrow) {
+ final IActor actor = new IActor() {
+ final private ArrowType oldEndArrow = link.getEndArrow();
+ final private ArrowType oldStartArrow = link.getStartArrow();
+
+ public void act() {
+ link.setStartArrow(startArrow);
+ link.setEndArrow(endArrow);
+ fireNodeConnectorChange(link.getSource(), link);
+ }
+
+ public String getDescription() {
+ return "changeArrowsOfArrowLink";
+ }
+
+ public void undo() {
+ link.setStartArrow(oldStartArrow);
+ link.setEndArrow(oldEndArrow);
+ fireNodeConnectorChange(link.getSource(), link);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, link.getSource().getMap());
+ }
+
+ /**
+ *
+ */
+ private void createActions() {
+ setLinkByFileChooser = new SetLinkByFileChooserAction();
+ modeController.addAction(setLinkByFileChooser);
+ final AddConnectorAction addArrowLinkAction = new AddConnectorAction();
+ modeController.addAction(addArrowLinkAction);
+ setLinkByTextField = new SetLinkByTextFieldAction();
+ modeController.addAction(setLinkByTextField);
+ modeController.addAction(new AddLocalLinkAction());
+ modeController.addAction(new AddMenuItemLinkAction());
+ modeController.addAction(new AddExecutionLinkAction());
+ modeController.addAction(new ExtractLinkFromTextAction());
+ modeController.addAction(new SetLinkAnchorAction());
+ modeController.addAction(new MakeLinkToAnchorAction());
+ modeController.addAction(new MakeLinkFromAnchorAction());
+ modeController.addAction(new ClearLinkAnchorAction());
+ }
+
+ @Override
+ protected void createArrowLinkPopup(final ConnectorModel link, final JComponent arrowLinkPopup) {
+ super.createArrowLinkPopup(link, arrowLinkPopup);
+ addClosingAction(arrowLinkPopup, new RemoveConnectorAction(this, link));
+
+ addSeparator(arrowLinkPopup);
+ addAction(arrowLinkPopup, new ConnectorColorAction(this, link));
+
+ final JSlider transparencySlider = new JSlider(20, 255, link.getAlpha());
+ transparencySlider.setMinorTickSpacing(20);
+ transparencySlider.setPaintTicks(true);
+ transparencySlider.setSnapToTicks(true);
+ transparencySlider.setPaintTrack(true);
+ addPopupComponent(arrowLinkPopup, TextUtils.getText("edit_transparency_label"), transparencySlider);
+
+ addSeparator(arrowLinkPopup);
+
+
+ AFreeplaneAction[] arrowActions = new AFreeplaneAction[]{
+ new ChangeConnectorArrowsAction(this, "none", link, ArrowType.NONE, ArrowType.NONE),
+ new ChangeConnectorArrowsAction(this, "forward", link, ArrowType.NONE, ArrowType.DEFAULT),
+ new ChangeConnectorArrowsAction(this, "backward", link, ArrowType.DEFAULT, ArrowType.NONE),
+ new ChangeConnectorArrowsAction(this, "both", link, ArrowType.DEFAULT, ArrowType.DEFAULT)
+ };
+ final JComboBox connectorArrows = createActionBox(arrowActions);
+ addPopupComponent(arrowLinkPopup, TextUtils.getText("connector_arrows"), connectorArrows);
+
+ final boolean twoNodesConnector = ! link.getSource().equals(link.getTarget());
+ AFreeplaneAction[] shapeActions;
+ if(twoNodesConnector){
+ shapeActions = new AFreeplaneAction[] {
+ new ChangeConnectorShapeAction(this, link, Shape.CUBIC_CURVE),
+ new ChangeConnectorShapeAction(this, link, Shape.LINE),
+ new ChangeConnectorShapeAction(this, link, Shape.LINEAR_PATH),
+ new ChangeConnectorShapeAction(this, link, Shape.EDGE_LIKE)
+ };
+ }
+ else {
+ shapeActions = new AFreeplaneAction[] {
+ new ChangeConnectorShapeAction(this, link, Shape.CUBIC_CURVE),
+ new ChangeConnectorShapeAction(this, link, Shape.LINE),
+ new ChangeConnectorShapeAction(this, link, Shape.LINEAR_PATH)
+ };
+ }
+ final JComboBox connectorShapes = createActionBox(shapeActions);
+ addPopupComponent(arrowLinkPopup, TextUtils.getText("connector_shapes"), connectorShapes);
+
+ AFreeplaneAction[] dashActions = new AFreeplaneAction[] {
+ new ChangeConnectorDashAction(this, link, null),
+ new ChangeConnectorDashAction(this, link, new int[]{3, 3}),
+ new ChangeConnectorDashAction(this, link, new int[]{7, 7}),
+ new ChangeConnectorDashAction(this, link, new int[]{2, 7}),
+ new ChangeConnectorDashAction(this, link, new int[]{2, 7, 7, 7})
+ };
+ final JComboBox connectorDashes = createActionBox(dashActions);
+ addPopupComponent(arrowLinkPopup, TextUtils.getText("connector_lines"), connectorDashes);
+
+ final SpinnerNumberModel widthModel = new SpinnerNumberModel(link.getWidth(),1, 32, 1);
+ final JSpinner widthSpinner = new JSpinner(widthModel);
+ addPopupComponent(arrowLinkPopup, TextUtils.getText("edit_width_label"), widthSpinner);
+
+ addSeparator(arrowLinkPopup);
+
+ {
+ final GraphicsEnvironment gEnv = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ final String[] envFonts = gEnv.getAvailableFontFamilyNames();
+ DefaultComboBoxModel fonts = new DefaultComboBoxModel(envFonts);
+ fonts.setSelectedItem(link.getLabelFontFamily());
+ JComboBox fontBox = new JComboBoxWithBorder(fonts);
+ fontBox.setEditable(false);
+ addPopupComponent(arrowLinkPopup, TextUtils.getText("edit_label_font_family"), fontBox);
+ fontBox.addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent e) {
+ final Object item = e.getItem();
+ if(item != null)
+ setLabelFontFamily(link, item.toString());
+ }
+ });
+ }
+ {
+ final Integer[] sizes = {4, 6, 8, 10, 12, 14, 16, 18, 24, 36};
+ DefaultComboBoxModel sizesModel = new DefaultComboBoxModel(sizes);
+ sizesModel.setSelectedItem(link.getLabelFontSize());
+ JComboBox sizesBox = new JComboBoxWithBorder(sizesModel);
+ sizesBox.setEditable(true);
+ addPopupComponent(arrowLinkPopup, TextUtils.getText("edit_label_font_size"), sizesBox);
+ sizesBox.addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent e) {
+ final Object item = e.getItem();
+ if(item != null){
+ final int size;
+ if(item instanceof Integer)
+ size = (Integer)item;
+ else{
+ try{
+ size = Integer.valueOf(item.toString());
+ if(size <=0)
+ return;
+ }
+ catch (NumberFormatException ex){
+ return;
+ }
+ }
+
+ setLabelFontSize(link, size);
+ }
+ }
+ });
+ }
+ final JTextArea sourceLabelEditor;
+ sourceLabelEditor = new JTextArea(link.getSourceLabel());
+ addTextEditor(arrowLinkPopup, "edit_source_label", sourceLabelEditor);
+
+ final JTextArea middleLabelEditor = new JTextArea(link.getMiddleLabel());
+ addTextEditor(arrowLinkPopup, "edit_middle_label" ,middleLabelEditor);
+
+ final JTextArea targetLabelEditor ;
+ targetLabelEditor = new JTextArea(link.getTargetLabel());
+ addTextEditor(arrowLinkPopup, "edit_target_label", targetLabelEditor);
+
+ arrowLinkPopup.addHierarchyListener(new HierarchyListener() {
+ private Component focusOwner;
+ private Window dialog;
+ public void hierarchyChanged(HierarchyEvent e) {
+ final JComponent component = (JComponent) e.getComponent();
+ if(component.isShowing()){
+ if(dialog == null){
+ dialog = SwingUtilities.getWindowAncestor(component);
+ dialog.addWindowListener(new WindowAdapter() {
+
+ @Override
+ public void windowClosing(WindowEvent e) {
+ component.putClientProperty(CANCEL, Boolean.TRUE);
+ }
+ });
+ }
+ if(focusOwner == null)
+ focusOwner = FocusManager.getCurrentManager().getFocusOwner();
+ return;
+ }
+ if(focusOwner == null || ! focusOwner.isShowing())
+ return;
+ focusOwner.requestFocus();
+ if (Boolean.TRUE.equals(component.getClientProperty(CANCEL))) {
+ return;
+ }
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ if (selection == null || selection.getSelected() == null)
+ return;
+ setSourceLabel(link, sourceLabelEditor.getText());
+ setTargetLabel(link, targetLabelEditor.getText());
+ setMiddleLabel(link, middleLabelEditor.getText());
+ setAlpha(link, transparencySlider.getValue());
+ setWidth(link, widthModel.getNumber().intValue());
+ }
+
+ });
+
+ }
+
+ @SuppressWarnings("serial")
+ protected JComboBox createActionBox(AFreeplaneAction[] items) {
+ final JComboBox box = new JComboBoxWithBorder();
+ box.setEditable(false);
+ box.setModel(new DefaultComboBoxModel(items));
+ for(AFreeplaneAction item : items){
+ if(item.isSelected()){
+ box.setSelectedItem(item);
+ break;
+ }
+ }
+ box.setRenderer(new DefaultListCellRenderer() {
+ @Override
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
+ boolean cellHasFocus) {
+ Action action = (Action) value;
+ Icon icon = (Icon)action.getValue(Action.SMALL_ICON);
+ String text = (String)action.getValue(Action.NAME);
+ Object renderedValue = text == null ? icon : text;
+ DefaultListCellRenderer renderer = (DefaultListCellRenderer) super.getListCellRendererComponent(list, renderedValue, index, isSelected, cellHasFocus);
+ if(text != null && icon != null)
+ renderer.setIcon(icon);
+ return renderer;
+ }
+ });
+ box.addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent e) {
+ AFreeplaneAction item = (AFreeplaneAction)e.getItem();
+ final JComboBox box = (JComboBox) e.getSource();
+ item.actionPerformed(new ActionEvent(box, ActionEvent.ACTION_PERFORMED, null));
+ }
+ });
+ return box;
+ }
+
+ private void addSeparator(JComponent arrowLinkPopup) {
+ }
+
+ private void addTextEditor(final JComponent popup, final String label, final JTextArea editor) {
+ final InputMap inputMap = editor.getInputMap();
+ final ActionMap actionMap = editor.getActionMap();
+ final boolean enterConfirms = ResourceController.getResourceController().getBooleanProperty("el__enter_confirms_by_default");
+ final KeyStroke close = KeyStroke.getKeyStroke(enterConfirms ? "ENTER" : "alt ENTER");
+ inputMap.put(close, CLOSE);
+ actionMap.put(CLOSE, new ClosePopupAction(CLOSE));
+
+ final KeyStroke enter = KeyStroke.getKeyStroke(! enterConfirms ? "ENTER" : "alt ENTER");
+ final KeyStroke enter2 = KeyStroke.getKeyStroke("shift ENTER");
+ inputMap.put(enter, "INSERT_EOL");
+ inputMap.put(enter2, "INSERT_EOL");
+ actionMap.put("INSERT_EOL", new UITools.InsertEolAction());
+ editor.setRows(5);
+ editor.setColumns(30);
+
+ final JPopupMenu popupMenu = new JPopupMenu();
+ SpellCheckerController spellCheckerController = SpellCheckerController.getController();
+ spellCheckerController.addSpellCheckerMenu(popupMenu );
+ spellCheckerController.enableAutoSpell(editor, true);
+ editor.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ handlePopup(e);
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ handlePopup(e);
+ }
+
+ private void handlePopup(MouseEvent e) {
+ if(e.isPopupTrigger()){
+ e.consume();
+ popupMenu.show(e.getComponent(), e.getX(), e.getY());
+ }
+
+ }
+
+ });
+
+
+ final JScrollPane scrollPane = new JScrollPane(editor, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
+ addPopupComponent(popup, TextUtils.getText(label), scrollPane);
+ }
+
+ public void setConnectorColor(final ConnectorModel arrowLink, final Color color) {
+ final Color oldColor = arrowLink.getColor();
+ if (color == oldColor || color != null && color.equals(oldColor)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ arrowLink.setColor(color);
+ final NodeModel node = arrowLink.getSource();
+ fireNodeConnectorChange(node, arrowLink);
+ }
+
+ public String getDescription() {
+ return "setConnectorColor";
+ }
+
+ public void undo() {
+ arrowLink.setColor(oldColor);
+ final NodeModel node = arrowLink.getSource();
+ fireNodeConnectorChange(node, arrowLink);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, arrowLink.getSource().getMap());
+ }
+
+ public void setConnectorDash(final ConnectorModel arrowLink, final int[] dash) {
+ final int[] oldDash = arrowLink.getDash();
+ if (dash == oldDash || dash != null && dash.equals(oldDash)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ arrowLink.setDash(dash);
+ final NodeModel node = arrowLink.getSource();
+ fireNodeConnectorChange(node, arrowLink);
+ }
+
+ public String getDescription() {
+ return "setConnectorDash";
+ }
+
+ public void undo() {
+ arrowLink.setDash(oldDash);
+ final NodeModel node = arrowLink.getSource();
+ fireNodeConnectorChange(node, arrowLink);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, arrowLink.getSource().getMap());
+ }
+
+ public void setArrowLinkEndPoints(final ConnectorModel link, final Point startPoint, final Point endPoint) {
+ final IActor actor = new IActor() {
+ final private Point oldEndPoint = link.getEndInclination();
+ final private Point oldStartPoint = link.getStartInclination();
+
+ public void act() {
+ link.setStartInclination(startPoint);
+ link.setEndInclination(endPoint);
+ fireNodeConnectorChange(link.getSource(), link);
+ }
+
+ public String getDescription() {
+ return "setArrowLinkEndPoints";
+ }
+
+ public void undo() {
+ link.setStartInclination(oldStartPoint);
+ link.setEndInclination(oldEndPoint);
+ fireNodeConnectorChange(link.getSource(), link);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, link.getSource().getMap());
+ }
+
+ public void setLink(final NodeModel node, final String link, final int linkType) {
+ if (link != null && !"".equals(link)) {
+ try {
+ final URI uri = new URI(link);
+ setLink(node, uri, linkType);
+ }
+ catch (final URISyntaxException e) {
+ e.printStackTrace();
+ }
+ return;
+ }
+ setLink(node, (URI) null, LINK_ABSOLUTE);
+ }
+
+ private URI relativeLink(final URI argUri, final NodeModel node, final int linkType) {
+ if (linkType != LINK_ABSOLUTE && "file".equals(argUri.getScheme())) {
+ try {
+ final File mapFile = node.getMap().getFile();
+ return LinkController.toRelativeURI(mapFile, new File(argUri), linkType);
+ }
+ catch (Exception e) {
+ }
+ }
+ return argUri;
+ }
+
+ public void setLinkTypeDependantLink(final NodeModel node, final URI argUri) {
+ setLink(node, argUri, getLinkType());
+ }
+
+ public void setLinkTypeDependantLink(final NodeModel node, final File file) {
+ setLink(node, file.toURI(), getLinkType());
+ }
+
+ public void setLinkTypeDependantLink(final NodeModel node, final String link) {
+ setLink(node, link, getLinkType());
+ }
+
+ public void setLink(final NodeModel node, final URI argUri, final int linkType) {
+ final URI uri = relativeLink(argUri, node, linkType);
+ final IActor actor = new IActor() {
+ private URI oldlink;
+ private String oldTargetID;
+
+ public void act() {
+ NodeLinks links = NodeLinks.getLinkExtension(node);
+ if (links != null) {
+ oldlink = links.getHyperLink(node);
+ oldTargetID = links.removeLocalHyperLink(node);
+ }
+ else {
+ links = NodeLinks.createLinkExtension(node);
+ }
+ if (uri != null && uri.toString().startsWith("#")) {
+ links.setLocalHyperlink(node, uri.toString().substring(1));
+ }
+ else
+ links.setHyperLink(uri);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeLinks.HYPERLINK_CHANGED, oldlink, uri);
+
+ }
+
+ public String getDescription() {
+ return "setLink";
+ }
+
+ public void undo() {
+ final NodeLinks links = NodeLinks.getLinkExtension(node);
+ URI undoneLink = links.getHyperLink(node);
+ links.setLocalHyperlink(node, oldTargetID);
+ links.setHyperLink(oldlink);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeLinks.HYPERLINK_CHANGED, undoneLink, oldlink);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ public void setLinkByFileChooser() {
+ setLinkByFileChooser.setLinkByFileChooser();
+ }
+
+ public void setMiddleLabel(final ConnectorModel model, String label) {
+ if ("".equals(label)) {
+ label = null;
+ }
+ String oldLabel = model.getMiddleLabel();
+ if ("".equals(oldLabel)) {
+ oldLabel = null;
+ }
+ if (label == oldLabel || label != null && label.equals(oldLabel)) {
+ return;
+ }
+ final IActor actor = new MiddleLabelSetter(model, oldLabel, label);
+ Controller.getCurrentModeController().execute(actor, model.getSource().getMap());
+ }
+
+ public void setSourceLabel(final ConnectorModel model, String label) {
+ if ("".equals(label)) {
+ label = null;
+ }
+ String oldLabel = model.getSourceLabel();
+ if ("".equals(oldLabel)) {
+ oldLabel = null;
+ }
+ if (label == oldLabel || label != null && label.equals(oldLabel)) {
+ return;
+ }
+ final IActor actor = new SourceLabelSetter(model, label, oldLabel);
+ Controller.getCurrentModeController().execute(actor, model.getSource().getMap());
+ }
+
+ public void setTargetLabel(final ConnectorModel model, String label) {
+ if ("".equals(label)) {
+ label = null;
+ }
+ String oldLabel = model.getTargetLabel();
+ if ("".equals(oldLabel)) {
+ oldLabel = null;
+ }
+ if (label == oldLabel || label != null && label.equals(oldLabel)) {
+ return;
+ }
+ final IActor actor = new TargetLabelSetter(oldLabel, label, model);
+ Controller.getCurrentModeController().execute(actor, model.getSource().getMap());
+ }
+
+ public ConnectorModel addConnector(final NodeModel source, final String targetID) {
+ final CreateArrowLinkActor actor = new CreateArrowLinkActor(targetID, source);
+ Controller.getCurrentModeController().execute(actor, source.getMap());
+ return actor.getArrowLink();
+ }
+
+ public void removeArrowLink(final ConnectorModel arrowLink) {
+ final IActor actor = new IActor() {
+ public void act() {
+ final NodeModel source = arrowLink.getSource();
+ final NodeLinks nodeLinks = NodeLinks.getLinkExtension(source);
+ nodeLinks.removeArrowlink(arrowLink);
+ fireNodeConnectorChange(source, arrowLink);
+ }
+
+ public String getDescription() {
+ return "removeArrowLink";
+ }
+
+ public void undo() {
+ final NodeModel source = arrowLink.getSource();
+ NodeLinks nodeLinks = NodeLinks.createLinkExtension(source);
+ nodeLinks.addArrowlink(arrowLink);
+ fireNodeConnectorChange(source, arrowLink);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, arrowLink.getSource().getMap());
+ }
+
+ public void setShape(final ConnectorModel connector, final Shape shape) {
+ final Shape oldShape = connector.getShape();
+ if (oldShape.equals(shape)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ connector.setShape(shape);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+
+ public String getDescription() {
+ return "setConnectorShape";
+ }
+
+ public void undo() {
+ connector.setShape(oldShape);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
+ }
+
+ public void setWidth(final ConnectorModel connector, final int width) {
+ final int oldWidth = connector.getWidth();
+ if (oldWidth == width) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ connector.setWidth(width);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+
+ public String getDescription() {
+ return "setConnectorWidth";
+ }
+
+ public void undo() {
+ connector.setWidth(oldWidth);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
+ }
+
+
+ public void setLabelFontSize(final ConnectorModel connector, final int width) {
+ final int oldWidth = connector.getLabelFontSize();
+ if (oldWidth == width) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ connector.setLabelFontSize(width);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+
+ public String getDescription() {
+ return "setConnectorWidth";
+ }
+
+ public void undo() {
+ connector.setLabelFontSize(oldWidth);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
+ }
+
+
+ public void setLabelFontFamily(final ConnectorModel connector, final String family) {
+ final String oldFamily = connector.getLabelFontFamily();
+ if (oldFamily.equals(family)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ connector.setLabelFontFamily(family);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+
+ public String getDescription() {
+ return "setConnectorWidth";
+ }
+
+ public void undo() {
+ connector.setLabelFontFamily(oldFamily);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
+ }
+
+ public void setAlpha(final ConnectorModel connector, final int alpha) {
+ final int oldAlpha = connector.getAlpha();
+ if (oldAlpha == alpha) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ connector.setAlpha(alpha);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+
+ public String getDescription() {
+ return "setConnectorAlpha";
+ }
+
+ public void undo() {
+ connector.setAlpha(oldAlpha);
+ final NodeModel node = connector.getSource();
+ fireNodeConnectorChange(node, connector);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
+ }
+
+ @Override
+ @SuppressWarnings("deprecation")
+ public void loadURI(URI uri) {
+ UrlManager.getController().loadURL(uri);
+ }
+
+ @Override
+ protected void loadURL(final NodeModel node, final ActionEvent e) {
+ // load as documentation map if the node belongs to a documentation map
+ boolean addDocuMapAttribute = node.getMap().containsExtension(DocuMapAttribute.class)
+ && ! modeController.containsExtension(DocuMapAttribute.class);
+ if(addDocuMapAttribute){
+ modeController.addExtension(DocuMapAttribute.class, DocuMapAttribute.instance);
+ }
+ try{
+ super.loadURL(node, e);
+ }
+ finally{
+ if(addDocuMapAttribute){
+ modeController.removeExtension(DocuMapAttribute.class);
+ }
+ }
+ }
+
+ public String getAnchorID() {
+ return anchorID;
+ }
+
+ public void setAnchorID(final String anchorID) {
+ this.anchorID = anchorID;
+ final String tooltip;
+ AFreeplaneAction setLinkAnchorAction = modeController.getAction("SetLinkAnchorAction");
+ final boolean anchored = isAnchored();
+ if(anchored)
+ tooltip = TextUtils.format(setLinkAnchorAction.getTooltipKey() + "_anchored", anchorID);
+ else
+ tooltip = TextUtils.getRawText(setLinkAnchorAction.getTooltipKey());
+ setLinkAnchorAction.putValue(Action.SHORT_DESCRIPTION, tooltip);
+ setLinkAnchorAction.putValue(Action.LONG_DESCRIPTION, tooltip);
+ setLinkAnchorAction.setSelected(anchored);
+ modeController.getAction("ClearLinkAnchorAction").setEnabled(anchored);
+ modeController.getAction("MakeLinkToAnchorAction").setEnabled(anchored);
+ modeController.getAction("MakeLinkFromAnchorAction").setEnabled(anchored);
+ }
+
+ public boolean isAnchored() {
+ return anchorID != null && !anchorID.isEmpty();
+ }
+
+ public String getAnchorIDforNode(final NodeModel node) {
+ String targetID = getAnchorID();
+ final String link;
+ // check if anchorID is valid, then set link in current node
+ if (isAnchored() && ! targetID.matches("\\w+://")) {
+
+ // extract fileName from target map
+ final String targetMapFileName = targetID.substring( targetID.indexOf("/") +1, targetID.indexOf("#") );
+
+ // get fileName of selected node (source)
+ final File sourceMapFile = node.getMap().getFile();
+ if(sourceMapFile == null) {
+ UITools.errorMessage(TextUtils.getRawText("map_not_saved"));
+ return null;
+ }
+
+ // check if target and source reside within same map
+ final String sourceMapFileNameURI = sourceMapFile.toURI().toString();
+ if( sourceMapFileNameURI.substring(sourceMapFileNameURI.indexOf("/")+1).equals(targetMapFileName) ) {
+
+ // insert only targetNodeID as link
+ link = targetID.substring(targetID.indexOf("#"));
+
+ } else {
+
+ // insert whole targetPath (including targetNodeID) as link for current node
+ link = targetID;
+ }
+ }
+ else{
+ link = null;
+ }
+ return link;
+ }
+
+ public void setFormatNodeAsHyperlink(final NodeModel node, final Boolean enabled){
+ final NodeLinks links = NodeLinks.createLinkExtension(node);
+ IActor actor = new IActor() {
+ final Boolean old = links.formatNodeAsHyperlink();
+ public void act() {
+ links.setFormatNodeAsHyperlink(enabled);
+ modeController.getMapController().nodeChanged(node);
+ }
+
+ public void undo() {
+ links.setFormatNodeAsHyperlink(old);
+ modeController.getMapController().nodeChanged(node);
+ }
+
+
+ public String getDescription() {
+ return "setFormatNodeAsHyperlink";
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ private void fireNodeConnectorChange(NodeModel source, ConnectorModel arrowLink) {
+ Controller.getCurrentModeController().getMapController().nodeChanged(source, NodeLinks.CONNECTOR, arrowLink, arrowLink);
+ }
+
+ public void deleteMapLinksForClone(final NodeModel model){
+ final MapModel map = model.getMap();
+ final MapLinks mapLinks = map.getExtension(MapLinks.class);
+ if(mapLinks != null){
+ IActor actor = new IActor() {
+ @Override
+ public void undo() {
+ mapLinkChanger.insertMapLinks(mapLinks, model);
+ }
+
+ @Override
+ public String getDescription() {
+ return "deleteMapLinks";
+ }
+
+ @Override
+ public void act() {
+ mapLinkChanger.deleteMapLinks(mapLinks, model, model);
+ }
+ };
+ modeController.execute(actor, map);
+ }
+ }
+
+
+ public void insertMapLinksForClone(final NodeModel model){
+ final MapModel map = model.getMap();
+ final MapLinks mapLinks = map.getExtension(MapLinks.class);
+ if(mapLinks != null){
+ IActor actor = new IActor() {
+ @Override
+ public void undo() {
+ mapLinkChanger.deleteMapLinks(mapLinks, model, model);
+ }
+
+ @Override
+ public String getDescription() {
+ return "deleteMapLinks";
+ }
+
+ @Override
+ public void act() {
+ mapLinkChanger.insertMapLinks(mapLinks, model);
+ }
+ };
+ modeController.execute(actor, map);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/MakeLinkFromAnchorAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/MakeLinkFromAnchorAction.java
new file mode 100644
index 0000000..5f13cbd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/MakeLinkFromAnchorAction.java
@@ -0,0 +1,136 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Nnamdi Kohn in 2012.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.freeplane.features.link.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+ at EnabledAction(checkOnNodeChange=true)
+public class MakeLinkFromAnchorAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public MakeLinkFromAnchorAction() {
+ super("MakeLinkFromAnchorAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+
+ // get reference to current modeController
+ final ModeController modeControllerForSelectedMap = Controller.getCurrentModeController();
+
+ // get reference of selected node (target)
+ final NodeModel targetNode = modeControllerForSelectedMap.getMapController().getSelectedNode();
+ // get file path of selected node (target)
+ final File targetMapFile = targetNode.getMap().getFile();
+ if(targetMapFile == null) {
+ UITools.errorMessage(TextUtils.getRawText("map_not_saved"));
+ return;
+ }
+ // extract file name string (URI) for target
+ final String targetMapFileNameURI = targetMapFile.toURI().toString();
+ // extract file name string for target
+ final String targetMapFileName = targetMapFileNameURI.substring(targetMapFileNameURI.indexOf("/")+1);
+ // get ID (consisting of fileName and nodeID) of selected node (as targetID)
+ final String targetID = targetMapFile.toURI().toString() + '#' + targetNode.createID();
+
+ // get anchorID (as sourceID) from MLinkController
+ final String sourceID = ((MLinkController)(LinkController.getController())).getAnchorID();
+ // check if anchorID valid (should be null when file is closed or anchor is cleared)
+ if( sourceID == null) {
+ return;
+ }
+ // extract anchorMapFileName (source)
+ final String sourceMapFileName = sourceID.substring( sourceID.indexOf("/") +1, sourceID.indexOf("#") );
+
+ // check if target and source reside within same map
+ if( targetMapFileName.equals(sourceMapFileName) ) {
+
+ // get link controller
+ final MLinkController linkController = (MLinkController) MLinkController.getController();
+
+ // get nodeID of anchored node (source)
+ final String sourceNodeID = sourceID.substring( sourceID.indexOf("#")+1 );
+
+ // get reference to node from ID-String (source)
+ final NodeModel sourceNode = modeControllerForSelectedMap.getMapController().getNodeFromID(sourceNodeID);
+
+ // insert only targetNodeID as link
+ linkController.setLink(sourceNode, targetID.substring(targetID.indexOf("#")), LinkController.LINK_ABSOLUTE);
+
+ } else {
+
+ // navigate to anchored map (source)
+ final MLinkController linkController_selected = (MLinkController) MLinkController.getController();
+ try {
+ final URI linkToAnchorNode = LinkController.createURI(sourceID.trim());
+ linkController_selected.loadURI(linkToAnchorNode);
+ }
+ catch (final URISyntaxException e1) {
+ LogUtils.warn(e1);
+ // UITools.errorMessage(TextUtils.format("invalid_uri", link));
+ return;
+ }
+
+ // get reference of anchor node within anchor map
+ final NodeModel sourceNode = modeControllerForSelectedMap.getMapController().getSelectedNode();
+
+ // set link in anchored node within anchored map
+ final MLinkController linkController_anchored = (MLinkController) MLinkController.getController();
+ try {
+ final URI linkToCurrentNode = LinkController.createURI(targetID.trim());
+ linkController_anchored.setLink(sourceNode, linkToCurrentNode, LinkController.LINK_ABSOLUTE);
+ }
+ catch (final URISyntaxException e1) {
+ LogUtils.warn(e1);
+ // UITools.errorMessage(TextUtils.format("invalid_uri", link));
+ return;
+ }
+
+ // re-navigate to target map
+ try {
+ final URI linkBackToSelectedNode = LinkController.createURI(targetID.trim());
+ linkController_anchored.loadURI(linkBackToSelectedNode);
+ }
+ catch (final URISyntaxException e1) {
+ LogUtils.warn(e1);
+ // UITools.errorMessage(TextUtils.format("invalid_uri", link));
+ return;
+ }
+ }
+ }
+ @Override
+ public void setEnabled() {
+ final boolean isAnchored = ((MLinkController)(LinkController.getController())).isAnchored();
+ setEnabled( isAnchored );
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/MakeLinkToAnchorAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/MakeLinkToAnchorAction.java
new file mode 100644
index 0000000..3313737
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/MakeLinkToAnchorAction.java
@@ -0,0 +1,58 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Nnamdi Kohn in 2012.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.freeplane.features.link.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+ at EnabledAction(checkOnNodeChange=true)
+public class MakeLinkToAnchorAction extends AFreeplaneAction {
+
+ private static final long serialVersionUID = 1L;
+
+ public MakeLinkToAnchorAction() {
+ super("MakeLinkToAnchorAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+
+ // get reference of selected node
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
+
+ // get anchorID from MLinkController
+ final MLinkController mLinkController = (MLinkController)(LinkController.getController());
+ final String link = mLinkController.getAnchorIDforNode(selectedNode);
+ if(link != null)
+ mLinkController.setLink(selectedNode, link, LinkController.LINK_ABSOLUTE);
+ }
+
+ @Override
+ public void setEnabled() {
+ final boolean isAnchored = ((MLinkController)(LinkController.getController())).isAnchored();
+ setEnabled( isAnchored );
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/RemoveConnectorAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/RemoveConnectorAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/RemoveConnectorAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/RemoveConnectorAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SelectMenuItemDialog.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SelectMenuItemDialog.java
new file mode 100644
index 0000000..99d11b4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SelectMenuItemDialog.java
@@ -0,0 +1,193 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 Volker Boerchers
+ *
+ * This file author is Volker Boerchers
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JScrollPane;
+import javax.swing.JTree;
+import javax.swing.WindowConstants;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.DefaultTreeCellRenderer;
+import javax.swing.tree.TreeSelectionModel;
+
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.MenuUtils;
+import org.freeplane.core.util.MenuUtils.MenuEntry;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.icon.factory.MindIconFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * Presents the menu bar as a tree.
+ *
+ * Only allows the selection of leaf nodes unless {@link #enableNonLeafNodes()} is invoked.
+ *
+ * @author vboerchers
+ */
+public class SelectMenuItemDialog extends JDialog {
+ private static final long serialVersionUID = 1L;
+ // append "/extras/first/scripting/scripts" for scripts
+ private static final String SELECTION_ROOT_KEY = "main_menu";
+ private static final Dimension DIALOG_DIMENSION = new Dimension(350, 350);
+ private boolean enableNonLeafNodes = false;
+ private JButton btnOK;
+ private final JTree tree;
+ private MenuEntry menuItem;
+
+ private class CloseAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ final Object source = e.getSource();
+ if (source == btnOK) {
+ final DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
+ .getLastSelectedPathComponent();
+ // this condition actually has to be true due to the TreeSelectionListener
+ if (selectedNode != null && nodeIsSelectable(selectedNode)) {
+ menuItem = (MenuEntry) selectedNode.getUserObject();
+ dispose();
+ }
+ }
+ else {
+ dispose();
+ }
+ }
+ }
+
+ private class MenuIconRenderer extends DefaultTreeCellRenderer {
+ private static final String DEFAULT_ICON = "button";
+ private static final long serialVersionUID = 1L;
+
+ public MenuIconRenderer() {
+ setOpenIcon(null);
+ setClosedIcon(null);
+ // set default
+ setLeafIcon(MindIconFactory.create(DEFAULT_ICON).getIcon());
+ }
+
+ @Override
+ public Component getTreeCellRendererComponent(final JTree tree, final Object value, final boolean sel,
+ final boolean expanded, final boolean leaf, final int row,
+ final boolean hasFocus) {
+ super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
+ if (leaf) {
+ final DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
+ final MenuEntry menuEntry = (MenuEntry) node.getUserObject();
+ if (menuEntry.getIconKey() != null) {
+ final MindIcon mindIcon = menuEntry.createMindIcon();
+ if (mindIcon != null)
+ setIcon(mindIcon.getIcon());
+ }
+ }
+ return this;
+ }
+ }
+
+ public SelectMenuItemDialog(final NodeModel node, boolean enableNonLeafNodes) {
+ super((Frame) UITools.getMenuComponent(), TextUtils.getText("select_menu_item_dialog"), true);
+ this.enableNonLeafNodes = enableNonLeafNodes;
+ Controller.getCurrentController().getMapViewManager().scrollNodeToVisible(node);
+ UITools.setDialogLocationRelativeTo(this, node);
+ setSize(DIALOG_DIMENSION);
+ setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ UITools.addEscapeActionToDialog(this);
+ tree = createTree();
+ getContentPane().add(new JScrollPane(tree));
+ getContentPane().add(createButtonBar(), BorderLayout.SOUTH);
+ getRootPane().setDefaultButton(btnOK);
+ setVisible(true);
+ }
+
+ /** Opens a dialog with only leaf nodes are selectable. */
+ public SelectMenuItemDialog(final NodeModel node) {
+ this(node, false);
+ }
+
+ public MenuEntry getMenuItem() {
+ return menuItem;
+ }
+
+ private Box createButtonBar() {
+ final Box controllerBox = Box.createHorizontalBox();
+ controllerBox.setBorder(new EmptyBorder(5, 0, 5, 0));
+ final CloseAction closeAction = new CloseAction();
+ btnOK = createButton("ok", closeAction);
+ final JButton btnCancel = createButton("cancel", closeAction);
+ controllerBox.add(Box.createHorizontalGlue());
+ controllerBox.add(btnOK);
+ controllerBox.add(Box.createHorizontalGlue());
+ controllerBox.add(btnCancel);
+ controllerBox.add(Box.createHorizontalGlue());
+ return controllerBox;
+ }
+
+ private JButton createButton(final String key, final CloseAction closeAction) {
+ final JButton button = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(button, TextUtils.getRawText(key));
+ button.addActionListener(closeAction);
+ button.setMaximumSize(new Dimension(1000, 1000));
+ return button;
+ }
+
+ private JTree createTree() {
+ final DefaultMutableTreeNode treeRoot = MenuUtils.createMenuEntryTree(SELECTION_ROOT_KEY);
+ if (treeRoot.getUserObject() == null)
+ treeRoot.setUserObject(new MenuEntry(null, TextUtils.getText("select_menu_item_root_node")));
+ JTree jTree = new JTree(treeRoot);
+ jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
+ // replace the standard icons
+ jTree.setCellRenderer(new MenuIconRenderer());
+ jTree.addTreeSelectionListener(new TreeSelectionListener() {
+ public void valueChanged(final TreeSelectionEvent e) {
+ final DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
+ btnOK.setEnabled(node != null && nodeIsSelectable(node));
+ }
+ });
+ jTree.addMouseListener(new MouseAdapter() {
+ public void mouseClicked(MouseEvent e) {
+ if (e.getClickCount() >= 2) {
+ if (btnOK.isEnabled())
+ btnOK.doClick();
+ }
+ }
+ });
+
+ return jTree;
+ }
+
+ private boolean nodeIsSelectable(final DefaultMutableTreeNode selectedNode) {
+ return enableNonLeafNodes || selectedNode.isLeaf();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkAnchorAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SetLinkAnchorAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkAnchorAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SetLinkAnchorAction.java
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByFileChooserAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SetLinkByFileChooserAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByFileChooserAction.java
rename to freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SetLinkByFileChooserAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SetLinkByTextFieldAction.java b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SetLinkByTextFieldAction.java
new file mode 100644
index 0000000..2a389f3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/link/mindmapmode/SetLinkByTextFieldAction.java
@@ -0,0 +1,92 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.link.mindmapmode;
+
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.event.ActionEvent;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+class SetLinkByTextFieldAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public SetLinkByTextFieldAction() {
+ super("SetLinkByTextFieldAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
+ String linkAsString = NodeLinks.getLinkAsString(selectedNode);
+ if(Compat.isWindowsOS() && linkAsString != null && linkAsString.startsWith("smb:")){
+ final URI link = NodeLinks.getValidLink(selectedNode);
+ linkAsString = Compat.smbUri2unc(link);
+ }
+ if(linkAsString == null || "".equals(linkAsString)){
+ linkAsString = "http://";
+ // if clipboard contains a valid uri use it
+ ClipboardController clipboardController = modeController.getExtension(ClipboardController.class);
+ Transferable t = clipboardController.getClipboardContents();
+ if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+ try {
+ final String plainTextFromClipboard = t.getTransferData(DataFlavor.stringFlavor).toString().trim();
+ new URI(plainTextFromClipboard);
+ linkAsString = plainTextFromClipboard;
+ }
+ catch (final Exception ex) {
+ }
+ }
+ }
+ final String inputValue = UITools.showInputDialog(
+ Controller.getCurrentController().getSelection().getSelected(), TextUtils.getText("edit_link_manually"), linkAsString);
+ if (inputValue != null && ! inputValue.matches("\\w+://")) {
+ final MLinkController linkController = (MLinkController) MLinkController.getController();
+ if (inputValue.equals("")) {
+ linkController.setLink(selectedNode, (URI) null, LinkController.LINK_ABSOLUTE);
+ return;
+ }
+ try {
+ final URI link = LinkController.createURI(inputValue.trim());
+ linkController.setLink(selectedNode, link, LinkController.LINK_ABSOLUTE);
+ }
+ catch (final URISyntaxException e1) {
+ LogUtils.warn(e1);
+ UITools.errorMessage(TextUtils.format("invalid_uri", inputValue));
+ return;
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/AMapChangeListenerAdapter.java b/freeplane/src/main/java/org/freeplane/features/map/AMapChangeListenerAdapter.java
new file mode 100644
index 0000000..3c284a5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/AMapChangeListenerAdapter.java
@@ -0,0 +1,33 @@
+package org.freeplane.features.map;
+
+
+abstract public class AMapChangeListenerAdapter implements IMapChangeListener, INodeChangeListener, IMapLifeCycleListener {
+ public void mapChanged(MapChangeEvent event) {
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void nodeChanged(NodeChangeEvent event) {
+ }
+
+ public void onCreate(MapModel map) {
+ }
+
+ public void onRemove(MapModel map) {
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/AlwaysUnfoldedNode.java b/freeplane/src/main/java/org/freeplane/features/map/AlwaysUnfoldedNode.java
new file mode 100644
index 0000000..8e3474e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/AlwaysUnfoldedNode.java
@@ -0,0 +1,54 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.mindmapmode.RemoveAllAlwaysUnfoldedNodeFlagsAction;
+import org.freeplane.features.map.mindmapmode.SetAlwaysUnfoldedNodeFlagsAction;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Apr 9, 2011
+ */
+ at NodeHookDescriptor(hookName = "AlwaysUnfoldedNode", onceForMap = false)
+public class AlwaysUnfoldedNode extends PersistentNodeHook implements IExtension{
+
+ @Override
+ protected IExtension createExtension(NodeModel node, XMLElement element) {
+ return this;
+ }
+
+ static public boolean isConnectorNode(final NodeModel nodeModel) {
+ return nodeModel.containsExtension(AlwaysUnfoldedNode.class);
+ }
+
+ @Override
+ protected void add(NodeModel node, IExtension extension) {
+ super.add(node, extension);
+ node.setFolded(false);
+ }
+
+
+}
+
diff --git a/freeplane/src/main/java/org/freeplane/features/map/CloneConditionController.java b/freeplane/src/main/java/org/freeplane/features/map/CloneConditionController.java
new file mode 100644
index 0000000..0e80ee2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/CloneConditionController.java
@@ -0,0 +1,117 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.collection.ExtendedComboBoxModel;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.DefaultConditionRenderer;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+class CloneConditionController implements IElementaryConditionController {
+ static final String FILTER_CLONE = "filter_clones";
+// // final private Controller controller;
+
+ public CloneConditionController() {
+ super();
+// this.controller = controller;
+ }
+
+ public boolean canEditValues(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ return namedObject.objectEquals(CloneConditionController.FILTER_CLONE);
+ }
+
+ public boolean canSelectValues(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase, final boolean approximateMatching) {
+ return new CloneOfSelectedViewCondition();
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object property) {
+ return new DefaultComboBoxModel(getCloneConditionNames());
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(FILTER_CLONE));
+ return list;
+ }
+
+ public Object[] getCloneConditionNames() {
+ return new TranslatedObject[] {
+ TranslatedObject.literal(""),
+ };
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ return null;
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object property, TranslatedObject simpleCond) {
+ final ListModel icons = Controller.getCurrentController().getMap().getIconRegistry().getIconsAsListModel();
+ final ExtendedComboBoxModel extendedComboBoxModel = new ExtendedComboBoxModel();
+ extendedComboBoxModel.setExtensionList(icons);
+ return extendedComboBoxModel;
+ }
+
+ public boolean isCaseDependent(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ if (element.getName().equalsIgnoreCase(CloneOfSelectedViewCondition.NAME)) {
+ return CloneOfSelectedViewCondition.load(element);
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ return new DefaultConditionRenderer("", true);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/CloneEncryptedNodeException.java b/freeplane/src/main/java/org/freeplane/features/map/CloneEncryptedNodeException.java
new file mode 100644
index 0000000..6f24768
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/CloneEncryptedNodeException.java
@@ -0,0 +1,10 @@
+package org.freeplane.features.map;
+
+ at SuppressWarnings("serial")
+public class CloneEncryptedNodeException extends IllegalArgumentException{
+
+ public CloneEncryptedNodeException() {
+ super("Can not clone encrypted nodes");
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/CloneOfSelectedViewCondition.java b/freeplane/src/main/java/org/freeplane/features/map/CloneOfSelectedViewCondition.java
new file mode 100644
index 0000000..4f74b09
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/CloneOfSelectedViewCondition.java
@@ -0,0 +1,71 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionSnapshotFactory;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class CloneOfSelectedViewCondition extends ASelectableCondition implements ConditionSnapshotFactory{
+ static final String NAME = "clone_condition";
+ private static String description;
+
+ public static ASelectableCondition CreateCondition() {
+ return new CloneOfSelectedViewCondition();
+ }
+
+ public CloneOfSelectedViewCondition() {
+ super();
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ if (selection != null){
+ for(NodeModel clone : node.allClones())
+ if (selection.isSelected(clone))
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected String createDescription() {
+ if (CloneOfSelectedViewCondition.description == null) {
+ CloneOfSelectedViewCondition.description = TextUtils.getText("filter_clones");
+ }
+ return CloneOfSelectedViewCondition.description;
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+ public void toXml(final XMLElement element) {}
+
+ public static ASelectableCondition load(XMLElement element) {
+ return new CloneOfSelectedViewCondition();
+ }
+
+ public ASelectableCondition createSnapshotCondition() {
+ return new CloneOfSelectedViewSnapshotCondition(Controller.getCurrentController().getSelection().getSelection());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/CloneOfSelectedViewSnapshotCondition.java b/freeplane/src/main/java/org/freeplane/features/map/CloneOfSelectedViewSnapshotCondition.java
new file mode 100644
index 0000000..c90e4f4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/CloneOfSelectedViewSnapshotCondition.java
@@ -0,0 +1,65 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 26.04.2014
+ */
+public class CloneOfSelectedViewSnapshotCondition extends ASelectableCondition {
+ private static final String NAME = "clone_snapshot";
+ private static String description;
+
+ HashSet<NodeModel> selectedNodes;
+
+ public CloneOfSelectedViewSnapshotCondition(Collection<NodeModel> selectedNodes) {
+ super();
+ this.selectedNodes = new HashSet<NodeModel>();
+ this.selectedNodes.addAll(selectedNodes);
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ for(NodeModel clone : node.allClones())
+ if (selectedNodes.contains(clone))
+ return true;
+ return false;
+ }
+
+ @Override
+ protected String createDescription() {
+ if (CloneOfSelectedViewSnapshotCondition.description == null) {
+ CloneOfSelectedViewSnapshotCondition.description = TextUtils.getText("filter_clone_snapshot");
+ }
+ return CloneOfSelectedViewSnapshotCondition.description;
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+ public void toXml(final XMLElement element) {}
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/Cloner.java b/freeplane/src/main/java/org/freeplane/features/map/Cloner.java
new file mode 100644
index 0000000..c6e4158
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/Cloner.java
@@ -0,0 +1,55 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.List;
+
+import org.freeplane.features.map.NodeModel.CloneType;
+
+/**
+ * @author Dimitry Polivaev
+ * 09.02.2014
+ */
+class Cloner {
+
+ private final NodeModel nodeModel;
+
+ public Cloner(NodeModel nodeModel) {
+ this.nodeModel = nodeModel;
+ }
+
+ public NodeModel cloneTree() {
+ final NodeModel clone = cloneStructure(nodeModel);
+ return clone;
+ }
+
+ private NodeModel cloneStructure(NodeModel node) {
+ if(node.containsExtension(EncryptionModel.class))
+ throw new CloneEncryptedNodeException();
+ final NodeModel clone = node.cloneNode(CloneType.TREE);
+ final List<NodeModel> cloneChildren = clone.getChildrenInternal();
+ for (NodeModel childNode : node.getChildrenInternal()){
+ final NodeModel childClone = cloneStructure(childNode);
+ childClone.setParent(clone);
+ cloneChildren.add(childClone);
+ }
+ return clone;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/Clones.java b/freeplane/src/main/java/org/freeplane/features/map/Clones.java
new file mode 100644
index 0000000..13c096e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/Clones.java
@@ -0,0 +1,39 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.Collection;
+
+import org.freeplane.features.map.NodeModel.CloneType;
+
+/**
+ * @author Dimitry Polivaev
+ * 09.02.2014
+ */
+public interface Clones extends Iterable<NodeModel>{
+ int size();
+ void attach();
+ void detach(NodeModel nodeModel);
+ Clones add(NodeModel clone);
+ Collection<NodeModel> toCollection();
+ boolean contains(NodeModel node);
+ NodeModel head();
+ CloneType getCloneType();
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/DetachedNodeList.java b/freeplane/src/main/java/org/freeplane/features/map/DetachedNodeList.java
new file mode 100644
index 0000000..9fa076c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/DetachedNodeList.java
@@ -0,0 +1,100 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+
+import org.freeplane.features.map.NodeModel.CloneType;
+
+/**
+ * @author Dimitry Polivaev
+ * 16.02.2014
+ */
+public class DetachedNodeList implements Clones {
+ private final NodeModel clonedNode;
+ private final NodeModel clone;
+ private final CloneType cloneType;
+
+ public DetachedNodeList(NodeModel clonedNode, CloneType cloneType) {
+ this(clonedNode, clonedNode, cloneType);
+ }
+
+ public DetachedNodeList forClone(NodeModel node){
+ return new DetachedNodeList(node, clone == clonedNode ? node : clonedNode, cloneType);
+ }
+
+ public DetachedNodeList(NodeModel clone, NodeModel clonedNode, CloneType cloneType) {
+ this.clone = clone;
+ this.clonedNode = clonedNode;
+ this.cloneType = cloneType;
+ }
+
+ public Iterator<NodeModel> iterator() {
+ return Collections.<NodeModel>emptyList().iterator();
+ }
+
+ public int size() {
+ return 0;
+ }
+
+ public void attach() {
+ if(clonedNode == clone)
+ clone.setClones(new SingleNodeList(clone, cloneType));
+ else if (! clonedNode.isAttached()){
+ clone.setClones(new SingleNodeList(clone, cloneType));
+ clonedNode.setClones(new DetachedNodeList(clonedNode, clone, cloneType));
+ }
+ else {
+ final Clones clonesWithNewClone = clonedNode.clones(cloneType).add(clone);
+ clonedNode.setClones(clonesWithNewClone);
+ clone.setClones(clonesWithNewClone);
+ }
+ }
+
+ public void detach(NodeModel nodeModel) {
+ throw new IllegalStateException();
+ }
+
+ public Clones add(NodeModel clone) {
+ throw new IllegalStateException();
+ }
+
+ public Collection<NodeModel> toCollection() {
+ return Collections.<NodeModel>emptyList();
+ }
+
+ public boolean contains(NodeModel node) {
+ return false;
+ }
+
+ public NodeModel otherThan(NodeModel node) {
+ throw new IllegalStateException();
+ }
+
+ public NodeModel head() {
+ throw new IllegalStateException();
+ }
+
+ public CloneType getCloneType() {
+ return cloneType;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/EncryptionModel.java b/freeplane/src/main/java/org/freeplane/features/map/EncryptionModel.java
new file mode 100644
index 0000000..1e362df
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/EncryptionModel.java
@@ -0,0 +1,190 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Iterator;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.map.MapWriter.Mode;
+
+public class EncryptionModel implements IExtension {
+ public static EncryptionModel getModel(final NodeModel node) {
+ return (EncryptionModel) node.getExtension(EncryptionModel.class);
+ }
+
+ private String encryptedContent;
+ private boolean isAccessible = true;
+ /**
+ * is only set to false by the load mechanism. If the node is generated or
+ * it is decrypted once, this is always true.
+ */
+ private boolean isDecrypted = true;
+ private IEncrypter mEncrypter;
+ /**
+ * password have to be stored in a StringBuilder as Strings cannot be deleted
+ * or overwritten.
+ */
+ final private NodeModel node;
+
+ public EncryptionModel(final NodeModel node) {
+ this.node = node;
+ encryptedContent = null;
+ setAccessible(true);
+ isDecrypted = true;
+ }
+
+ /**
+ * @param encryptedContent
+ */
+ public EncryptionModel(final NodeModel node, final String encryptedContent) {
+ this.node = node;
+ this.encryptedContent = encryptedContent;
+ setAccessible(false);
+ isDecrypted = false;
+ }
+
+ /**
+ */
+ public boolean checkPassword(final IEncrypter encrypter) {
+ final String decryptedNode = decryptXml(encryptedContent, encrypter);
+ if (decryptedNode == null || !decryptedNode.equals("") && !decryptedNode.startsWith("<node ")) {
+ LogUtils.warn("Wrong password supplied (stored!=given).");
+ return false;
+ }
+ setEncrypter(encrypter);
+ return true;
+ }
+
+ /**
+ * @param mapController
+ * @return true, if the password was correct.
+ */
+ public boolean decrypt(final MapController mapController, final IEncrypter encrypter) {
+ if (!checkPassword(encrypter)) {
+ return false;
+ }
+ setAccessible(true);
+ if (!isDecrypted) {
+ try {
+ final String childXml = decryptXml(encryptedContent, encrypter);
+ final String[] childs = childXml.split(ClipboardController.NODESEPARATOR);
+ for (int i = 0; i < childs.length; i++) {
+ final String string = childs[i];
+ if (string.length() == 0) {
+ continue;
+ }
+ pasteXML(string, node, mapController);
+ }
+ isDecrypted = true;
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ setAccessible(false);
+ return true;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @return null if the password is wrong.
+ */
+ private String decryptXml(final String encryptedString, final IEncrypter encrypter) {
+ final String decrypted = encrypter.decrypt(encryptedString);
+ return decrypted;
+ }
+
+ /**
+ */
+ private String encryptXml(final StringBuffer childXml) {
+ try {
+ final String encrypted = mEncrypter.encrypt(childXml.toString());
+ return encrypted;
+ }
+ catch (final Exception e) {
+ throw new IllegalArgumentException("Can't encrypt the node.", e);
+ }
+ }
+
+ /**
+ * @param mapController
+ * @param mode
+ * @throws IOException
+ */
+ private void runEncryptedContentGeneration(final MapController mapController) throws IOException {
+ final StringWriter sWriter = new StringWriter();
+ for (final Iterator<NodeModel> i = node.getChildren().listIterator(); i.hasNext();) {
+ final NodeModel child = i.next();
+ mapController.getMapWriter().writeNodeAsXml(sWriter, child, MapWriter.Mode.FILE, true, true, false);
+ if (i.hasNext()) {
+ sWriter.write(ClipboardController.NODESEPARATOR);
+ }
+ }
+ final StringBuffer childXml = sWriter.getBuffer();
+ encryptedContent = encryptXml(childXml);
+ }
+
+ public String calculateEncryptedContent(final MapController mapController) {
+ if (isDecrypted) {
+ try {
+ runEncryptedContentGeneration(mapController);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+ return encryptedContent;
+ }
+
+ /**
+ * @return Returns the isAccessible (ie. if the node is decrypted
+ * (isAccessible==true) or not).
+ */
+ public boolean isAccessible() {
+ return isAccessible;
+ }
+
+ private void pasteXML(final String pasted, final NodeModel target, final MapController mapController) {
+ try {
+ final NodeModel node = mapController.getMapReader().createNodeTreeFromXml(target.getMap(),
+ new StringReader(pasted), Mode.FILE);
+ mapController.insertNodeIntoWithoutUndo(node, target, target.getChildCount());
+ }
+ catch (final Exception ee) {
+ LogUtils.severe(ee);
+ }
+ }
+
+ /**
+ * @param isAccessible
+ * The isAccessible to set.
+ */
+ public void setAccessible(final boolean isAccessible) {
+ this.isAccessible = isAccessible;
+ }
+
+ public void setEncrypter(final IEncrypter encrypter) {
+ mEncrypter = encrypter;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/FirstGroupNode.java b/freeplane/src/main/java/org/freeplane/features/map/FirstGroupNode.java
new file mode 100644
index 0000000..1cd223b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/FirstGroupNode.java
@@ -0,0 +1,49 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Apr 24, 2011
+ */
+ at NodeHookDescriptor(hookName = "FirstGroupNode", onceForMap = false)
+public class FirstGroupNode extends PersistentNodeHook implements IExtension{
+
+ @Override
+ protected IExtension createExtension(NodeModel node, XMLElement element) {
+ return FirstGroupNodeFlag.FIRST_GROUP;
+ }
+
+ @Override
+ protected Class<? extends IExtension> getExtensionClass() {
+ return FirstGroupNodeFlag.class;
+ }
+
+ @Override
+ protected HookAction createHookAction() {
+ return null;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/FirstGroupNodeFlag.java b/freeplane/src/main/java/org/freeplane/features/map/FirstGroupNodeFlag.java
new file mode 100644
index 0000000..623600c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/FirstGroupNodeFlag.java
@@ -0,0 +1,8 @@
+package org.freeplane.features.map;
+
+import org.freeplane.core.extension.IExtension;
+
+public class FirstGroupNodeFlag implements IExtension {
+ public static FirstGroupNodeFlag FIRST_GROUP = new FirstGroupNodeFlag();
+ private FirstGroupNodeFlag(){};
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/FoldingController.java b/freeplane/src/main/java/org/freeplane/features/map/FoldingController.java
new file mode 100644
index 0000000..6f95f51
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/FoldingController.java
@@ -0,0 +1,337 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseWheelEvent;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.Action;
+import javax.swing.JButton;
+import javax.swing.JPopupMenu;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.IMouseWheelEventHandler;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author foltin
+ */
+public class FoldingController implements IMouseWheelEventHandler, IExtension {
+
+ @SuppressWarnings("serial")
+ private class FoldAllAction extends AMultipleNodeAction {
+
+
+ public FoldAllAction() {
+ super("FoldAllAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e, final NodeModel node) {
+ foldAll(node);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private class FoldOneLevelAction extends AMultipleNodeAction {
+
+
+ public FoldOneLevelAction() {
+ super("FoldOneLevelAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e, final NodeModel node) {
+ foldOneStage(node);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private class UnfoldAllAction extends AMultipleNodeAction {
+
+
+ public UnfoldAllAction() {
+ super("UnfoldAllAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e, final NodeModel node) {
+ unfoldAll(node);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private class UnfoldOneLevelAction extends AMultipleNodeAction {
+
+ public UnfoldOneLevelAction() {
+ super("UnfoldOneLevelAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e, final NodeModel node) {
+ unfoldOneStage(node);
+ }
+ }
+
+ protected static Insets nullInsets = new Insets(0, 0, 0, 0);
+
+ @SuppressWarnings("serial")
+ private class FoldingPopupMenu extends JPopupMenu{
+ final private NodeModel node;
+ FoldingPopupMenu(NodeModel node){
+ this.node = node;
+ addAction(new UnfoldOneLevelPopupAction());
+ addAction(new FoldOneLevelPopupAction());
+ addAction(new UnfoldAllPopupAction());
+ addAction(new FoldAllPopupAction());
+ }
+
+ private JButton addAction(Action a) {
+ final JButton menuItem = new JButton(a);
+ menuItem.setToolTipText(menuItem.getText());
+ menuItem.setText(null);
+ add(menuItem);
+ menuItem.setMargin(nullInsets);
+ return menuItem;
+ }
+
+ @SuppressWarnings("serial")
+ private class FoldAllPopupAction extends FoldAllAction{
+ @Override
+ public void actionPerformed(final ActionEvent e){
+ actionPerformed(e, node);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private class FoldOneLevelPopupAction extends FoldOneLevelAction{
+ @Override
+ public void actionPerformed(final ActionEvent e){
+ actionPerformed(e, node);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private class UnfoldAllPopupAction extends UnfoldAllAction{
+ @Override
+ public void actionPerformed(final ActionEvent e){
+ actionPerformed(e, node);
+ }
+ }
+
+ @SuppressWarnings("serial")
+ private class UnfoldOneLevelPopupAction extends UnfoldOneLevelAction{
+ @Override
+ public void actionPerformed(final ActionEvent e){
+ actionPerformed(e, node);
+ }
+ }
+ }
+
+
+
+// // final private Controller controller;
+
+ public static void install( final FoldingController foldingController) {
+ Controller.getCurrentModeController().addExtension(FoldingController.class, foldingController);
+ }
+ public FoldingController() {
+ super();
+ final ModeController modeController = Controller.getCurrentModeController();
+ if(!modeController.getController().getViewController().isHeadless()){
+ final IUserInputListenerFactory userInputListenerFactory = modeController.getUserInputListenerFactory();
+ userInputListenerFactory.addMouseWheelEventHandler(this);
+ for (final AFreeplaneAction annotatedAction : getAnnotatedActions()) {
+ modeController.addAction(annotatedAction);
+ }
+ }
+ }
+
+ private List<AMultipleNodeAction> getAnnotatedActions() {
+ final ArrayList<AMultipleNodeAction> result = new ArrayList<AMultipleNodeAction>();
+ result.add(new UnfoldAllAction());
+ result.add(new FoldAllAction());
+ result.add(new UnfoldOneLevelAction());
+ result.add(new FoldOneLevelAction());
+ return result;
+ }
+
+ protected void foldAll(final NodeModel node) {
+ final MapController modeController = Controller.getCurrentModeController().getMapController();
+ setFolded(node, true);
+ for (NodeModel child : modeController.childrenUnfolded(node)) {
+ foldAll(child);
+ }
+ }
+
+ /**
+ * Unfolds every node that has only children which themselves have children.
+ * As this function is a bit difficult to describe and perhaps not so
+ * useful, it is currently not introduced into the menus.
+ *
+ * @param node
+ * node to start from.
+ */
+ public void foldLastBranches(final NodeModel node) {
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ boolean nodeHasChildWhichIsLeave = false;
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ if (child.getChildCount() == 0) {
+ nodeHasChildWhichIsLeave = true;
+ }
+ }
+ setFolded(node, nodeHasChildWhichIsLeave);
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ foldLastBranches(child);
+ }
+ }
+
+ protected void foldOneStage(final NodeModel node) {
+ foldStageN(node, getMaxDepth(node) - 1);
+ }
+
+ public void foldStageN(final NodeModel node, final int stage) {
+ final int k = depth(node);
+ if (k < stage) {
+ setFolded(node, false);
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ foldStageN(child, stage);
+ }
+ }
+ else {
+ foldAll(node);
+ }
+ }
+
+ protected int getMaxDepth(final NodeModel node) {
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ if (mapController.isFolded(node) || !mapController.hasChildren(node)) {
+ return depth(node);
+ }
+ int k = 0;
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ final int l = getMaxDepth(child);
+ if (l > k) {
+ k = l;
+ }
+ }
+ return k;
+ }
+
+ public int getMinDepth(final NodeModel node) {
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
+ if (encryptionModel != null && !encryptionModel.isAccessible() ) {
+ return Integer.MAX_VALUE;
+ }
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ if(node.containsExtension(HideChildSubtree.class))
+ return depth(node) - 1;
+ if (mapController.isFolded(node)) {
+ return depth(node);
+ }
+ if (!mapController.hasChildren(node)||AlwaysUnfoldedNode.isConnectorNode(node)) {
+ return Integer.MAX_VALUE;
+ }
+ int k = Integer.MAX_VALUE;
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ final int l = getMinDepth(child);
+ if (l < k) {
+ k = l;
+ }
+ }
+ return k;
+ }
+
+ public boolean handleMouseWheelEvent(final MouseWheelEvent e) {
+ if ((e.getModifiers() & InputEvent.ALT_MASK) != 0) {
+ Controller controller = Controller.getCurrentController();
+ final NodeModel rootNode = controller.getMap().getRootNode();
+ if (e.getWheelRotation() > 0) {
+ unfoldOneStage(rootNode);
+ }
+ else {
+ final ModeController modeController = controller.getModeController();
+ modeController.getMapController().select(controller.getMap().getRootNode());
+ foldOneStage(rootNode);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ private void setFolded(final NodeModel node, final boolean state) {
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ if (! node.isRoot()) {
+ mapController.setFolded(node, state);
+ }
+ }
+
+ public void unfoldAll(final NodeModel node) {
+ setFolded(node, false);
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ unfoldAll(child);
+ }
+ }
+
+ protected void unfoldOneStage(final NodeModel node) {
+ int minDepth = getMinDepth(node);
+ if (minDepth < Integer.MAX_VALUE) {
+ minDepth++;
+ }
+ unfoldStageN(node, minDepth);
+ }
+
+ public void unfoldStageN(final NodeModel node, final int stage) {
+ final int k = depth(node);
+ if (k < stage) {
+ setFolded(node, false);
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ unfoldStageN(child, stage);
+ }
+ }
+ else {
+ foldAll(node);
+ }
+ }
+
+ private int depth(NodeModel node) {
+ if (node.isRoot())
+ return 0;
+ final int parentDepth = depth(node.getParentNode());
+ if (! node.hasVisibleContent() || AlwaysUnfoldedNode.isConnectorNode(node)) {
+ return parentDepth;
+ }
+ else
+ return parentDepth + 1;
+ }
+
+ public JPopupMenu createFoldingPopupMenu(NodeModel node){
+ return new FoldingPopupMenu(node);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/FreeNode.java b/freeplane/src/main/java/org/freeplane/features/map/FreeNode.java
new file mode 100644
index 0000000..d70eb52
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/FreeNode.java
@@ -0,0 +1,68 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Apr 9, 2011
+ */
+ at NodeHookDescriptor(hookName = "FreeNode", onceForMap = false)
+public class FreeNode extends PersistentNodeHook implements IExtension{
+
+ public static void install(){
+ new FreeNode();
+ };
+
+
+ @Override
+ protected IExtension createExtension(NodeModel node, XMLElement element) {
+ return this;
+ }
+
+ @Override
+ public void undoableToggleHook(NodeModel node, IExtension extension) {
+ if(node.isRoot())
+ return;
+ final NodeModel[] selecteds = getSelectedNodes();
+ ((MLocationController)LocationController.getController()).moveNodePosition(node, LocationModel.DEFAULT_HGAP, LocationModel.DEFAULT_SHIFT_Y);
+ super.undoableToggleHook(node, extension);
+ if(isFreeNode(node)){
+ MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ mapController.moveNode(node, 0);
+ }
+ Controller.getCurrentController().getSelection().replaceSelection(selecteds);
+ }
+
+
+ static public boolean isFreeNode(final NodeModel nodeModel) {
+ return nodeModel.containsExtension(FreeNode.class);
+ }
+}
+
diff --git a/freeplane/src/org/freeplane/features/map/GotoNodeAction.java b/freeplane/src/main/java/org/freeplane/features/map/GotoNodeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/GotoNodeAction.java
rename to freeplane/src/main/java/org/freeplane/features/map/GotoNodeAction.java
diff --git a/freeplane/src/org/freeplane/features/map/HideChildSubtree.java b/freeplane/src/main/java/org/freeplane/features/map/HideChildSubtree.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/HideChildSubtree.java
rename to freeplane/src/main/java/org/freeplane/features/map/HideChildSubtree.java
diff --git a/freeplane/src/org/freeplane/features/map/HistoryInformationModel.java b/freeplane/src/main/java/org/freeplane/features/map/HistoryInformationModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/HistoryInformationModel.java
rename to freeplane/src/main/java/org/freeplane/features/map/HistoryInformationModel.java
diff --git a/freeplane/src/org/freeplane/features/map/IEncrypter.java b/freeplane/src/main/java/org/freeplane/features/map/IEncrypter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/IEncrypter.java
rename to freeplane/src/main/java/org/freeplane/features/map/IEncrypter.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/IExtensionCopier.java b/freeplane/src/main/java/org/freeplane/features/map/IExtensionCopier.java
new file mode 100644
index 0000000..e569de6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/IExtensionCopier.java
@@ -0,0 +1,12 @@
+package org.freeplane.features.map;
+
+
+public interface IExtensionCopier {
+ void copy(Object key, NodeModel from, NodeModel to);
+
+ void remove(Object key, NodeModel from);
+
+ void remove(Object key, NodeModel from, NodeModel which);
+
+ void resolveParentExtensions(Object key, NodeModel to);
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/IMapChangeListener.java b/freeplane/src/main/java/org/freeplane/features/map/IMapChangeListener.java
new file mode 100644
index 0000000..8f42b55
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/IMapChangeListener.java
@@ -0,0 +1,37 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public interface IMapChangeListener {
+ public void mapChanged(MapChangeEvent event);
+
+ void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent);
+
+ void onNodeInserted(NodeModel parent, NodeModel child, int newIndex);
+
+ void onNodeMoved(NodeMoveEvent nodeMoveEvent);
+
+ void onPreNodeMoved(NodeMoveEvent nodeMoveEvent);
+
+ void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent);
+}
diff --git a/freeplane/src/org/freeplane/features/map/IMapLifeCycleListener.java b/freeplane/src/main/java/org/freeplane/features/map/IMapLifeCycleListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/IMapLifeCycleListener.java
rename to freeplane/src/main/java/org/freeplane/features/map/IMapLifeCycleListener.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/IMapSelection.java b/freeplane/src/main/java/org/freeplane/features/map/IMapSelection.java
new file mode 100644
index 0000000..75683c7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/IMapSelection.java
@@ -0,0 +1,66 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * @author Dimitry Polivaev
+ * 04.01.2009
+ */
+public interface IMapSelection {
+ public void centerNode(final NodeModel node);
+
+ public NodeModel getSelected();
+
+ public Set<NodeModel> getSelection();
+
+ public List<NodeModel> getOrderedSelection();
+
+ public List<NodeModel> getSortedSelection(boolean differentSubtrees);
+
+ public boolean isSelected(final NodeModel node);
+
+ public void keepNodePosition(final NodeModel node, float horizontalPoint, float verticalPoint);
+
+ public void scrollNodeTreeToVisible(final NodeModel node);
+
+ public void makeTheSelected(final NodeModel node);
+
+ public void scrollNodeToVisible(NodeModel selected);
+
+ public void selectAsTheOnlyOneSelected(final NodeModel node);
+
+ public void selectBranch(final NodeModel node, final boolean extend);
+
+ public void selectContinuous(final NodeModel node);
+
+ public void selectRoot();
+
+ public void setSiblingMaxLevel(int nodeLevel);
+
+ public int size();
+
+ public void toggleSelected(final NodeModel node);
+
+ public void replaceSelection(NodeModel[] nodes);
+}
diff --git a/freeplane/src/org/freeplane/features/map/IMapSelectionListener.java b/freeplane/src/main/java/org/freeplane/features/map/IMapSelectionListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/IMapSelectionListener.java
rename to freeplane/src/main/java/org/freeplane/features/map/IMapSelectionListener.java
diff --git a/freeplane/src/org/freeplane/features/map/INodeChangeListener.java b/freeplane/src/main/java/org/freeplane/features/map/INodeChangeListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/INodeChangeListener.java
rename to freeplane/src/main/java/org/freeplane/features/map/INodeChangeListener.java
diff --git a/freeplane/src/org/freeplane/features/map/INodeSelectionListener.java b/freeplane/src/main/java/org/freeplane/features/map/INodeSelectionListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/INodeSelectionListener.java
rename to freeplane/src/main/java/org/freeplane/features/map/INodeSelectionListener.java
diff --git a/freeplane/src/org/freeplane/features/map/INodeView.java b/freeplane/src/main/java/org/freeplane/features/map/INodeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/INodeView.java
rename to freeplane/src/main/java/org/freeplane/features/map/INodeView.java
diff --git a/freeplane/src/org/freeplane/features/map/ITooltipProvider.java b/freeplane/src/main/java/org/freeplane/features/map/ITooltipProvider.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/ITooltipProvider.java
rename to freeplane/src/main/java/org/freeplane/features/map/ITooltipProvider.java
diff --git a/freeplane/src/org/freeplane/features/map/LeafCondition.java b/freeplane/src/main/java/org/freeplane/features/map/LeafCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/LeafCondition.java
rename to freeplane/src/main/java/org/freeplane/features/map/LeafCondition.java
diff --git a/freeplane/src/org/freeplane/features/map/MapChangeEvent.java b/freeplane/src/main/java/org/freeplane/features/map/MapChangeEvent.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/MapChangeEvent.java
rename to freeplane/src/main/java/org/freeplane/features/map/MapChangeEvent.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/MapController.java b/freeplane/src/main/java/org/freeplane/features/map/MapController.java
new file mode 100644
index 0000000..633f4d4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/MapController.java
@@ -0,0 +1,1023 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.awt.EventQueue;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.swing.Action;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.UnknownElementWriter;
+import org.freeplane.core.io.UnknownElements;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.DelayedRunner;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.map.NodeModel.NodeChangeType;
+import org.freeplane.features.mode.AController.IActionOnChange;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.SelectionController;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.main.addons.AddOnsController;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.n3.nanoxml.XMLParseException;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MapController extends SelectionController implements IExtension{
+ public enum Direction {
+ BACK, BACK_N_FOLD, FORWARD, FORWARD_N_FOLD
+ }
+
+ private static boolean hasValidSelection() {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ return selection != null && selection.getSelected() != null;
+ }
+
+ private static class ActionEnablerOnChange implements INodeChangeListener, INodeSelectionListener, IMapChangeListener {
+ final private Collection<AFreeplaneAction> actions;
+ final private DelayedRunner runner;
+
+ public ActionEnablerOnChange() {
+ super();
+ actions = new HashSet<AFreeplaneAction>();
+ runner = new DelayedRunner(new Runnable() {
+ @Override
+ public void run() {
+ setActionsEnabledNow();
+ }
+ });
+ }
+
+ public void nodeChanged(final NodeChangeEvent event) {
+ setActionEnabled();
+ }
+
+ public void onDeselect(final NodeModel node) {
+ }
+
+ public void onSelect(final NodeModel node) {
+ runner.runLater();
+ }
+
+ private void setActionsEnabledNow() {
+ if (hasValidSelection())
+ for (AFreeplaneAction action : actions)
+ action.setEnabled();
+ }
+
+ public void mapChanged(MapChangeEvent event) {
+ setActionEnabled();
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ setActionEnabled();
+ }
+
+ public void onNodeInserted(NodeModel parent, NodeModel child,
+ int newIndex) {
+ setActionEnabled();
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ setActionEnabled();
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ setActionEnabled();
+ }
+
+ private void setActionEnabled() {
+ if (hasValidSelection())
+ runner.runLater();
+ }
+
+ public void add(AFreeplaneAction action) {
+ actions.add(action);
+ }
+
+ public void remove(AFreeplaneAction action) {
+ actions.remove(action);
+ }
+ }
+
+ private static class ActionSelectorOnChange implements INodeChangeListener, INodeSelectionListener, IMapChangeListener {
+ final private Collection<AFreeplaneAction> actions;
+ final private DelayedRunner runner;
+
+ public ActionSelectorOnChange() {
+ super();
+ actions = new HashSet<AFreeplaneAction>();
+ runner = new DelayedRunner(new Runnable() {
+ @Override
+ public void run() {
+ setActionsSelectedNow();
+ }
+ });
+ }
+
+ public void nodeChanged(final NodeChangeEvent event) {
+ if (NodeChangeType.REFRESH.equals(event.getProperty())) {
+ return;
+ }
+ setActionsSelected();
+ }
+
+ private void setActionsSelected() {
+ if (hasValidSelection())
+ runner.runLater();
+ }
+
+ private void setActionsSelectedNow() {
+ if (hasValidSelection())
+ for (AFreeplaneAction action : actions)
+ action.setSelected();
+ }
+
+ public void onDeselect(final NodeModel node) {
+ }
+
+ public void onSelect(final NodeModel node) {
+ setActionsSelected();
+ }
+
+ public void mapChanged(final MapChangeEvent event) {
+ setActionsSelected();
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ setActionsSelected();
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
+ setActionsSelected();
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ setActionsSelected();
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ setActionsSelected();
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ setActionsSelected();
+ }
+
+ public void add(AFreeplaneAction action) {
+ actions.add(action);
+ }
+
+ public void remove(AFreeplaneAction action) {
+ actions.remove(action);
+ }
+ }
+
+ public static void install() {
+ final ConditionFactory conditionFactory = FilterController.getCurrentFilterController().getConditionFactory();
+ conditionFactory.addConditionController(80, new NodeLevelConditionController());
+ conditionFactory.addConditionController(75, new CloneConditionController());
+ }
+
+
+ public void addListenerForAction(final AFreeplaneAction action) {
+ if (action.checkEnabledOnChange()) {
+ actionEnablerOnChange.add(action);
+ }
+ if (action.checkSelectionOnChange()) {
+ actionSelectorOnChange.add(action);
+ }
+ }
+
+ public void removeListenerForAction(final AFreeplaneAction action) {
+ if (action.checkEnabledOnChange()) {
+ actionEnablerOnChange.remove(action);
+ }
+ if (action.checkSelectionOnChange()) {
+ actionSelectorOnChange.remove(action);
+ }
+ }
+
+ /**
+ * This class sortes nodes by ascending depth of their paths to root. This
+ * is useful to assure that children are cutted <b>before </b> their
+ * fathers!!!. Moreover, it sorts nodes with the same depth according to
+ * their position relative to each other.
+ */
+ static private class NodesDepthComparator implements Comparator<NodeModel> {
+ public NodesDepthComparator() {
+ }
+
+ /* the < relation. */
+ public int compare(final NodeModel n1, final NodeModel n2) {
+ final NodeModel[] path1 = n1.getPathToRoot();
+ final NodeModel[] path2 = n2.getPathToRoot();
+ final int depth = path1.length - path2.length;
+ if (depth > 0) {
+ return -1;
+ }
+ if (depth < 0) {
+ return 1;
+ }
+ if (n1.isRoot()) {
+ return 0;
+ }
+ return n1.getParentNode().getIndex(n1) - n2.getParentNode().getIndex(n2);
+ }
+ }
+
+// final private Controller controller;
+ final private Collection<IMapChangeListener> mapChangeListeners;
+ final private Collection<IMapLifeCycleListener> mapLifeCycleListeners;
+ final private MapReader mapReader;
+ final private MapWriter mapWriter;
+ final private ModeController modeController;
+ final LinkedList<INodeChangeListener> nodeChangeListeners;
+ final private ReadManager readManager;
+ private final WriteManager writeManager;
+
+ public MapController(ModeController modeController) {
+ super();
+ modeController.setMapController(this);
+ this.modeController = modeController;
+ mapLifeCycleListeners = new LinkedList<IMapLifeCycleListener>();
+ writeManager = new WriteManager();
+ mapWriter = new MapWriter(this);
+ readManager = new ReadManager();
+ mapReader = new MapReader(readManager);
+ readManager.addElementHandler("map", mapReader);
+ readManager.addAttributeHandler("map", "version", new IAttributeHandler() {
+ public void setAttribute(final Object node, final String value) {
+ }
+ });
+ readManager.addAttributeHandler("map", "dialect", new IAttributeHandler() {
+ public void setAttribute(final Object node, final String value) {
+ }
+ });
+ writeManager.addElementWriter("map", mapWriter);
+ writeManager.addAttributeWriter("map", mapWriter);
+ final UnknownElementWriter unknownElementWriter = new UnknownElementWriter();
+ writeManager.addExtensionAttributeWriter(UnknownElements.class, unknownElementWriter);
+ writeManager.addExtensionElementWriter(UnknownElements.class, unknownElementWriter);
+ mapChangeListeners = new LinkedList<IMapChangeListener>();
+ nodeChangeListeners = new LinkedList<INodeChangeListener>();
+ actionEnablerOnChange = new ActionEnablerOnChange();
+ actionSelectorOnChange = new ActionSelectorOnChange();
+ addNodeSelectionListener(actionEnablerOnChange);
+ addNodeChangeListener(actionEnablerOnChange);
+ addMapChangeListener(actionEnablerOnChange);
+ addNodeSelectionListener(actionSelectorOnChange);
+ addNodeChangeListener(actionSelectorOnChange);
+ addMapChangeListener(actionSelectorOnChange);
+
+ createActions(modeController);
+ }
+
+ public void setFoldedAndScroll(final NodeModel node, final boolean folded){
+ if(node.isFolded() != folded){
+ setFolded(node, folded);
+ if(! folded && ResourceController.getResourceController().getBooleanProperty("scrollOnUnfold")){
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ Controller.getCurrentController().getSelection().scrollNodeTreeToVisible(node);
+ }
+ });
+
+ }
+ }
+ }
+
+ public void setFolded(final NodeModel node, final boolean folded) {
+ if (node == null) {
+ throw new IllegalArgumentException("setFolded was called with a null node.");
+ }
+ if (node.getChildCount() == 0)
+ return;
+ final boolean unfold = ! folded;
+ final boolean childShown = unfoldHiddenChildren(node);
+ boolean mapChanged = false;
+ if (unfold && unfoldInvisibleChildren(node, true))
+ mapChanged = true;
+ if (!(node.isRoot() && folded)) {
+ if (node.isFolded() != folded) {
+ mapChanged = true;
+ }
+ setFoldingState(node, folded);
+ }
+ if(mapChanged){
+ fireFoldingChanged(node);
+ }
+ if(childShown)
+ fireNodeUnfold(node);
+ }
+
+
+ protected void setFoldingState(final NodeModel node, final boolean folded) {
+ node.setFolded(folded);
+ }
+
+ public boolean showNextChild(final NodeModel node) {
+ if (node.getChildCount() == 0)
+ return false;
+ final boolean unfold = Controller.getCurrentController().getMapViewManager().isFoldedOnCurrentView(node);
+ if (unfold){
+ for(NodeModel child:childrenUnfolded(node)){
+ child.addExtension(HideChildSubtree.instance);
+ }
+ setFoldingState(node, false);
+ }
+ boolean childMadeVisible = false;
+ for(NodeModel child:childrenUnfolded(node)){
+ if (child.removeExtension(HideChildSubtree.instance) &&
+ (child.hasVisibleContent() || unfoldInvisibleChildren(child, true))){
+ childMadeVisible = true;
+ break;
+ }
+ }
+ if(childMadeVisible){
+ fireNodeUnfold(node);
+ }
+ return childMadeVisible;
+ }
+
+
+ private void fireNodeUnfold(final NodeModel node) {
+ node.fireNodeChanged(new NodeChangeEvent(node, HideChildSubtree.instance, null,
+ null));
+ }
+
+ public boolean hasHiddenChildren(final NodeModel node){
+ for(NodeModel child:childrenUnfolded(node)){
+ if (child.containsExtension(HideChildSubtree.class)){
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void fireFoldingChanged(final NodeModel node) {
+ if (isFoldingPersistentAlways()) {
+ final MapModel map = node.getMap();
+ setSaved(map, false);
+ }
+ }
+
+ private boolean isFoldingPersistentAlways() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ return resourceController.getProperty(NodeBuilder.RESOURCES_SAVE_FOLDING).equals(
+ NodeBuilder.RESOURCES_ALWAYS_SAVE_FOLDING);
+ }
+
+
+ protected boolean unfoldHiddenChildren(NodeModel node) {
+ final List<NodeModel> children = childrenFolded(node);
+ boolean changed = false;
+ for (NodeModel child : children){
+ if(child.removeExtension(HideChildSubtree.class) != null)
+ changed = true;
+ }
+ return changed;
+ }
+
+
+ private boolean unfoldInvisibleChildren(final NodeModel node, final boolean reportUnfolded) {
+ boolean visibleFound = false;
+ boolean unfolded = false;
+ for(int i = 0; i < node.getChildCount(); i++){
+ final NodeModel child = node.getChildAt(i);
+ if(child.hasVisibleContent())
+ visibleFound = true;
+ else if(unfoldInvisibleChildren(child, false) && child.isFolded()){
+ visibleFound = unfolded = true;
+ setFoldingState(node, false);
+ }
+ }
+ if(reportUnfolded)
+ return unfolded;
+ else
+ return visibleFound;
+ }
+
+ public void addMapChangeListener(final IMapChangeListener listener) {
+ mapChangeListeners.add(listener);
+ }
+
+ public void addMapLifeCycleListener(final IMapLifeCycleListener listener) {
+ mapLifeCycleListeners.add(listener);
+ }
+
+ public void addNodeChangeListener(final INodeChangeListener listener) {
+ nodeChangeListeners.add(listener);
+ }
+
+ public void centerNode(final NodeModel node) {
+ Controller.getCurrentController().getSelection().centerNode(node);
+ }
+
+ public List<NodeModel> childrenFolded(final NodeModel node) {
+ if (node.isFolded()) {
+ final List<NodeModel> empty = Collections.emptyList();
+ return empty;
+ }
+ return childrenUnfolded(node);
+ }
+
+ public List<NodeModel> childrenUnfolded(final NodeModel node) {
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
+ if (encryptionModel != null && !encryptionModel.isAccessible()) {
+ final List<NodeModel> empty = Collections.emptyList();
+ return empty;
+ }
+ return node.getChildren();
+ }
+
+ /**
+ * Return false if user has canceled.
+ */
+ public boolean close(final MapModel map, final boolean force) {
+ fireMapRemoved(map);
+ map.destroy();
+ return true;
+ }
+
+ /**
+ * @param modeController
+ * @param modeController
+ *
+ */
+ private void createActions(ModeController modeController) {
+ modeController.addAction(new ToggleFoldedAction());
+ modeController.addAction(new ToggleChildrenFoldedAction());
+ modeController.addAction(new ShowNextChildAction());
+ modeController.addAction(new GotoNodeAction());
+ }
+
+ public void displayNode(final NodeModel node) {
+ displayNode(node, null);
+ }
+
+ /**
+ * Display a node in the display (used by find and the goto action by arrow
+ * link actions).
+ */
+ public void displayNode(final NodeModel node, final ArrayList<NodeModel> nodesUnfoldedByDisplay) {
+ if (!node.hasVisibleContent()) {
+ node.getFilterInfo().reset();
+ nodeRefresh(node);
+ }
+ final NodeModel[] path = node.getPathToRoot();
+ for (int i = 0; i < path.length - 1; i++) {
+ final NodeModel nodeOnPath = path[i];
+ if (nodesUnfoldedByDisplay != null && isFolded(nodeOnPath)) {
+ nodesUnfoldedByDisplay.add(nodeOnPath);
+ }
+ setFolded(nodeOnPath, false);
+ }
+ }
+
+ public void fireMapChanged(final MapChangeEvent event) {
+ final MapModel map = event.getMap();
+ if (map != null) {
+ setSaved(map, false);
+ }
+ final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
+ for (final IMapChangeListener next : list) {
+ next.mapChanged(event);
+ }
+ if (map != null) {
+ map.fireMapChangeEvent(event);
+ }
+ }
+
+ public void fireMapCreated(final MapModel map) {
+ final IMapLifeCycleListener[] list = mapLifeCycleListeners.toArray(new IMapLifeCycleListener[]{});
+ for (final IMapLifeCycleListener next : list) {
+ next.onCreate(map);
+ }
+ }
+
+ protected void fireMapRemoved(final MapModel map) {
+ final IMapLifeCycleListener[] list = mapLifeCycleListeners.toArray(new IMapLifeCycleListener[]{});
+ for (final IMapLifeCycleListener next : list) {
+ next.onRemove(map);
+ }
+ }
+
+ private void fireNodeChanged(final NodeModel node, final NodeChangeEvent nodeChangeEvent) {
+ final INodeChangeListener[] nodeChangeListeners = this.nodeChangeListeners.toArray(new INodeChangeListener[]{});
+ node.fireNodeChanged(nodeChangeListeners, nodeChangeEvent);
+ }
+
+ protected void fireNodeDeleted(final NodeDeletionEvent nodeDeletionEvent) {
+ final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
+ for (final IMapChangeListener next : list) {
+ next.onNodeDeleted(nodeDeletionEvent);
+ }
+ NodeModel node = nodeDeletionEvent.node;
+ node.getMap().unregistryNodes(node);
+ }
+
+ protected void fireNodeInserted(final NodeModel parent, final NodeModel child, final int index) {
+ parent.getMap().registryNodeRecursive(child);
+ final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
+ for (final IMapChangeListener next : list) {
+ next.onNodeInserted(parent, child, index);
+ }
+ }
+
+ protected void fireNodeMoved(final NodeMoveEvent nodeMoveEvent) {
+ final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
+ for (final IMapChangeListener next : list) {
+ next.onNodeMoved(nodeMoveEvent);
+ }
+ }
+
+ protected void firePreNodeMoved(final NodeMoveEvent nodeMoveEvent) {
+ final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
+ for (final IMapChangeListener next : list) {
+ next.onPreNodeMoved(nodeMoveEvent);
+ }
+ }
+
+ protected void firePreNodeDelete(final NodeDeletionEvent nodeDeletionEvent) {
+ final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
+ for (final IMapChangeListener next : list) {
+ next.onPreNodeDelete(nodeDeletionEvent);
+ }
+ }
+
+ public void getFilteredXml(final MapModel map, final Writer fileout, final Mode mode, final boolean forceFormat)
+ throws IOException {
+ getMapWriter().writeMapAsXml(map, fileout, mode, false, forceFormat);
+ }
+
+ private Boolean getCommonFoldingState(final Collection<NodeModel> list) {
+ Boolean state = null;
+ for(final NodeModel node : list){
+ if (node.getChildCount() == 0) {
+ continue;
+ }
+ if (state == null) {
+ state = canBeUnfolded(node);
+ }
+ else {
+ if (canBeUnfolded(node) != state) {
+ return null;
+ }
+ }
+ }
+ return state;
+ }
+
+
+ private boolean canBeUnfolded(final NodeModel node) {
+ return Controller.getCurrentController().getMapViewManager().isFoldedOnCurrentView(node) || hasHiddenChildren(node);
+ }
+
+ public MapReader getMapReader() {
+ return mapReader;
+ }
+
+ public MapWriter getMapWriter() {
+ return mapWriter;
+ }
+
+ /*
+ * Helper methods
+ */
+ public NodeModel getNodeFromID(final String nodeID) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final NodeModel node = map.getNodeForID(nodeID);
+ return node;
+ }
+
+ public String getNodeID(final NodeModel selected) {
+ return selected.createID();
+ }
+
+ public ReadManager getReadManager() {
+ return readManager;
+ }
+
+ public NodeModel getRootNode() {
+ final MapModel map = Controller.getCurrentController().getMap();
+ return map.getRootNode();
+ }
+
+ public NodeModel getSelectedNode() {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ if(selection != null)
+ return selection.getSelected();
+ return null;
+ }
+
+ /**
+ * fc, 24.1.2004: having two methods getSelecteds with different return
+ * values (linkedlists of models resp. views) is asking for trouble. @see
+ * MapView
+ *
+ * @return returns a list of MindMapNode s.
+ */
+ public Collection<NodeModel> getSelectedNodes() {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ if (selection == null) {
+ final List<NodeModel> list = Collections.emptyList();
+ return list;
+ }
+ return selection.getSelection();
+ }
+
+ public WriteManager getWriteManager() {
+ return writeManager;
+ }
+
+ public boolean hasChildren(final NodeModel node) {
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
+ if (encryptionModel != null && !encryptionModel.isAccessible()) {
+ return false;
+ }
+ return node.hasChildren();
+ }
+
+ /**
+ * True iff one of node's <i>strict</i> descendants is folded. A node N is
+ * not its strict descendant - the fact that node itself is folded is not
+ * sufficient to return true.
+ */
+ public boolean hasFoldedStrictDescendant(final NodeModel node) {
+ for (final NodeModel child : childrenUnfolded(node)) {
+ if (isFolded(child) || hasFoldedStrictDescendant(child)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.modes.MindMap#insertNodeInto(javax.swing.tree.MutableTreeNode,
+ * javax.swing.tree.MutableTreeNode)
+ */
+ public void insertNodeIntoWithoutUndo(final NodeModel newChild, final NodeModel parent) {
+ insertNodeIntoWithoutUndo(newChild, parent, parent.getChildCount());
+ }
+
+ public void insertNodeIntoWithoutUndo(final NodeModel newNode, final NodeModel parent, final int index) {
+ if(parent.getParentNode() != null){
+ newNode.setLeft(parent.isLeft());
+ }
+ parent.insert(newNode, index);
+ fireNodeInserted(parent, newNode, index);
+ }
+
+ public boolean isFolded(final NodeModel node) {
+ return node.isFolded();
+ }
+
+ /**@throws XMLException
+ * @deprecated -- use MapIO*/
+ @Deprecated
+ public boolean newMap(final URL url) throws FileNotFoundException, XMLParseException,IOException, URISyntaxException, XMLException{
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ if (mapViewManager.tryToChangeToMapView(url))
+ return false;
+ try {
+ if (AddOnsController.getController().installIfAppropriate(url))
+ return false;
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ final MapModel newModel = new MapModel();
+ UrlManager.getController().loadCatchExceptions(url, newModel);
+ newModel.setReadOnly(true);
+ newModel.setSaved(true);
+ fireMapCreated(newModel);
+ newMapView(newModel);
+ return true;
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+
+ public void openMapSelectReferencedNode(final URL url) throws FileNotFoundException,
+ XMLParseException, IOException, URISyntaxException, XMLException, MalformedURLException {
+ String nodeReference = url.getRef();
+ if(nodeReference != null){
+ newMap(new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getPath()));
+ select(getNodeFromID(nodeReference));
+ }
+ else{
+ newMap(url);
+ }
+ }
+
+ public void newMapView(final MapModel mapModel) {
+ Controller.getCurrentController().getMapViewManager().newMapView(mapModel, Controller.getCurrentModeController());
+ }
+
+ public MapModel newMap() {
+ final MapModel newModel = newModel();
+ fireMapCreated(newModel);
+ newMapView(newModel);
+ return newModel;
+ }
+
+ public MapModel newModel() {
+ final MapModel mindMapMapModel = new MapModel();
+ mindMapMapModel.createNewRoot();
+ fireMapCreated(mindMapMapModel);
+ return mindMapMapModel;
+ }
+
+ public NodeModel newNode(final Object userObject, final MapModel map) {
+ return new NodeModel(userObject, map);
+ }
+
+ @Deprecated
+ public void nodeChanged(final NodeModel node) {
+ nodeChanged(node, NodeModel.UNKNOWN_PROPERTY, null, null);
+ }
+
+ public void nodeChanged(final NodeModel node, final Object property, final Object oldValue, final Object newValue) {
+ setSaved(node.getMap(), false);
+ nodeRefresh(node, property, oldValue, newValue, true);
+ }
+
+ @Deprecated
+ public void nodeRefresh(final NodeModel node) {
+ nodeRefresh(node, NodeModel.UNKNOWN_PROPERTY, null, null);
+ }
+
+ public void nodeRefresh(final NodeModel node, final Object property, final Object oldValue, final Object newValue) {
+ nodeRefresh(node, property, oldValue, newValue, false);
+ }
+
+ private void nodeRefresh(final NodeModel node, final Object property, final Object oldValue, final Object newValue,
+ final boolean isUpdate) {
+ if (mapReader.isMapLoadingInProcess()) {
+ return;
+ }
+ if (isUpdate && !Controller.getCurrentModeController().isUndoAction()) {
+ final HistoryInformationModel historyInformation = node.getHistoryInformation();
+ if (historyInformation != null) {
+ final IActor historyActor = new IActor() {
+ private final Date lastModifiedAt = historyInformation.getLastModifiedAt();
+ private final Date now = new Date();
+
+ public void undo() {
+ setDate(historyInformation, lastModifiedAt);
+ }
+
+ private void setDate(final HistoryInformationModel historyInformation, final Date lastModifiedAt) {
+ final Date oldLastModifiedAt = historyInformation.getLastModifiedAt();
+ historyInformation.setLastModifiedAt(lastModifiedAt);
+ final NodeChangeEvent nodeChangeEvent = new NodeChangeEvent(node,
+ HistoryInformationModel.class, oldLastModifiedAt, lastModifiedAt);
+ fireNodeChanged(node, nodeChangeEvent);
+ }
+
+ public String getDescription() {
+ return null;
+ }
+
+ public void act() {
+ setDate(historyInformation, now);
+ }
+ };
+ Controller.getCurrentModeController().execute(historyActor, node.getMap());
+ }
+ }
+ final NodeChangeEvent nodeChangeEvent = new NodeChangeEvent(node, property, oldValue, newValue);
+ fireNodeChanged(node, nodeChangeEvent);
+ }
+
+ // nodes may only be refreshed by their own ModeController, so we have to store that too
+ private final ConcurrentHashMap<NodeRefreshKey, NodeRefreshValue> nodesToRefresh = new ConcurrentHashMap<NodeRefreshKey, NodeRefreshValue>();
+ private final ActionEnablerOnChange actionEnablerOnChange;
+ private final ActionSelectorOnChange actionSelectorOnChange;
+
+ private static class NodeRefreshKey{
+ final NodeModel node;
+ final Object property;
+ public NodeRefreshKey(NodeModel node, Object property) {
+ super();
+ this.node = node;
+ this.property = property;
+ }
+ @Override
+ public int hashCode() {
+ return node.hashCode() + propertyHash();
+ }
+ protected int propertyHash() {
+ return property != null ? 37 * property.hashCode() : 0;
+ }
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null || ! obj.getClass().equals(getClass()))
+ return false;
+ NodeRefreshKey key2 = (NodeRefreshKey)obj;
+ return node.equals(key2.node) && (property == key2.property || property != null && property.equals(key2.property));
+ }
+ }
+
+ private static class NodeRefreshValue{
+ final ModeController controller;
+ Object oldValue;
+ Object newValue;
+ public NodeRefreshValue(ModeController controller,
+ Object oldValue, Object newValue) {
+ super();
+ this.controller = controller;
+ this.oldValue = oldValue;
+ this.newValue = newValue;
+ }
+
+ }
+
+ /** optimization of nodeRefresh() as it handles multiple nodes in one Runnable, even nodes that weren't on the
+ * list when the thread was started.*/
+ public void delayedNodeRefresh(final NodeModel node, final Object property, final Object oldValue,
+ final Object newValue) {
+ final boolean startThread = nodesToRefresh.isEmpty();
+ final NodeRefreshValue value = new NodeRefreshValue(Controller.getCurrentModeController(), oldValue, newValue);
+ final NodeRefreshKey key = new NodeRefreshKey(node, property);
+ final NodeRefreshValue old = nodesToRefresh.put(key, value);
+ if(old != null && old.newValue != value.newValue){
+ old.newValue = value.newValue;
+ nodesToRefresh.put(key, old);
+ }
+ if (startThread) {
+ final Runnable refresher = new Runnable() {
+ public void run() {
+ final ModeController currentModeController = Controller.getCurrentModeController();
+ final Iterator<Entry<NodeRefreshKey, NodeRefreshValue>> it = nodesToRefresh.entrySet().iterator();
+ while (it.hasNext()) {
+ final Entry<NodeRefreshKey, NodeRefreshValue> entry = it.next();
+ final NodeRefreshValue info = entry.getValue();
+ if (info.controller == currentModeController){
+ final NodeRefreshKey key = entry.getKey();
+ currentModeController.getMapController().nodeRefresh(key.node, key.property, info.oldValue, info.newValue);
+ }
+ it.remove();
+ }
+ }
+ };
+ EventQueue.invokeLater(refresher);
+ }
+ }
+
+ public void removeMapChangeListener(final IMapChangeListener listener) {
+ mapChangeListeners.remove(listener);
+ }
+
+ public void removeMapLifeCycleListener(final IMapLifeCycleListener listener) {
+ mapLifeCycleListeners.remove(listener);
+ }
+
+ void removeNodeChangeListener(final Class<? extends IActionOnChange> clazz, final Action action) {
+ final Iterator<INodeChangeListener> iterator = nodeChangeListeners.iterator();
+ while (iterator.hasNext()) {
+ final INodeChangeListener next = iterator.next();
+ if (next instanceof IActionOnChange && ((IActionOnChange) next).getAction() == action) {
+ iterator.remove();
+ return;
+ }
+ }
+ }
+
+ void removeMapChangeListener(final Class<? extends IActionOnChange> clazz, final Action action) {
+ final Iterator<IMapChangeListener> iterator = mapChangeListeners.iterator();
+ while (iterator.hasNext()) {
+ final IMapChangeListener next = iterator.next();
+ if (next instanceof IActionOnChange && ((IActionOnChange) next).getAction() == action) {
+ iterator.remove();
+ return;
+ }
+ }
+ }
+
+ public void removeNodeChangeListener(final INodeChangeListener listener) {
+ nodeChangeListeners.remove(listener);
+ }
+
+ void removeNodeSelectionListener(final Class<? extends IActionOnChange> clazz, final Action action) {
+ final Iterator<INodeSelectionListener> iterator = getNodeSelectionListeners().iterator();
+ while (iterator.hasNext()) {
+ final INodeSelectionListener next = iterator.next();
+ if (next instanceof IActionOnChange && ((IActionOnChange) next).getAction() == action) {
+ iterator.remove();
+ return;
+ }
+ }
+ }
+
+ public Collection<IMapChangeListener> getMapChangeListeners() {
+ return Collections.unmodifiableCollection(mapChangeListeners);
+ }
+
+ public Collection<IMapLifeCycleListener> getMapLifeCycleListeners() {
+ return Collections.unmodifiableCollection(mapLifeCycleListeners);
+ }
+
+ public Collection<INodeChangeListener> getNodeChangeListeners() {
+ return Collections.unmodifiableCollection(nodeChangeListeners);
+ }
+
+ public void select(final NodeModel node) {
+ final MapModel map = node.getMap();
+ final Controller controller = Controller.getCurrentController();
+ if (! map.equals(controller.getMap())){
+ controller.getMapViewManager().changeToMap(map);
+ }
+ displayNode(node);
+ controller.getSelection().selectAsTheOnlyOneSelected(node);
+ }
+
+ public void selectMultipleNodes(final NodeModel focussed, final Collection<NodeModel> selecteds) {
+ for (final NodeModel node : selecteds) {
+ displayNode(node);
+ }
+ select(focussed);
+ for (final NodeModel node : selecteds) {
+ Controller.getCurrentController().getSelection().makeTheSelected(node);
+ }
+ }
+
+ public void setSaved(final MapModel mapModel, final boolean saved) {
+ mapModel.setSaved(saved);
+ }
+
+
+ public void sortNodesByDepth(final List<NodeModel> collection) {
+ Collections.sort(collection, new NodesDepthComparator());
+ }
+
+ public void toggleFolded(final Collection<NodeModel> collection) {
+ Boolean isFolded = getCommonFoldingState(collection);
+ final boolean shouldBeFolded = isFolded != null ? ! isFolded : true;
+ final NodeModel nodes[] = collection.toArray(new NodeModel[]{});
+ for (final NodeModel node:nodes) {
+ setFolded(node, shouldBeFolded);
+ }
+ }
+
+ public ModeController getModeController() {
+ return modeController;
+ }
+
+
+ public void select(String nodeReference) {
+ select(getNodeFromID(nodeReference));
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/MapModel.java b/freeplane/src/main/java/org/freeplane/features/map/MapModel.java
new file mode 100644
index 0000000..5c514dc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/MapModel.java
@@ -0,0 +1,299 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.io.File;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import org.freeplane.core.extension.ExtensionContainer;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.Filter;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.icon.IconRegistry;
+import org.freeplane.features.map.mindmapmode.DocuMapAttribute;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+public class MapModel {
+ private static Random ran = new Random();
+ private static final int UNDEFINED_NODE_ID = 2000000000;
+ /**
+ * denotes the amount of changes since the last save. The initial value is
+ * zero, such that new models are not to be saved.
+ */
+ protected int changesPerformedSinceLastSave = 0;
+ private final ExtensionContainer extensionContainer;
+ private Filter filter = null;
+ final private IconRegistry iconRegistry;
+ final private List<IMapChangeListener> listeners;
+ final private Map<String, NodeModel> nodes;
+ private boolean readOnly = false;
+ private NodeModel root;
+ private URL url;
+
+ public MapModel() {
+ extensionContainer = new ExtensionContainer(new HashMap<Class<? extends IExtension>, IExtension>());
+ this.root = null;
+ listeners = new LinkedList<IMapChangeListener>();
+ nodes = new HashMap<String, NodeModel>();
+ final FilterController filterController = FilterController.getCurrentFilterController();
+ if (filterController != null) {
+ filter = filterController.createTransparentFilter();
+ }
+ final ModeController modeController = Controller.getCurrentModeController();
+ iconRegistry = new IconRegistry(modeController.getMapController(), this);
+ }
+
+ public void createNewRoot() {
+ root = new NodeModel(TextUtils.getText("new_mindmap"), this);
+ root.attach();
+ }
+
+ public void addExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
+ extensionContainer.addExtension(clazz, extension);
+ }
+
+ public void addExtension(final IExtension extension) {
+ extensionContainer.addExtension(extension);
+ }
+
+ public IExtension putExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
+ return extensionContainer.putExtension(clazz, extension);
+ }
+
+ public IExtension putExtension(final IExtension extension) {
+ return extensionContainer.putExtension(extension);
+ }
+
+ public boolean containsExtension(Class<? extends IExtension> clazz) {
+ return extensionContainer.containsExtension(clazz);
+ }
+
+ public void addMapChangeListener(final IMapChangeListener listener) {
+ listeners.add(listener);
+ }
+
+ public void destroy() {
+ }
+
+ public void fireMapChangeEvent(final MapChangeEvent event) {
+ for (final IMapChangeListener listener : listeners) {
+ listener.mapChanged(event);
+ }
+ }
+
+ public String generateNodeID(final String proposedID) {
+ if (proposedID != null && !"".equals(proposedID) && getNodeForID(proposedID) == null) {
+ return proposedID;
+ }
+ String returnValue;
+ do {
+ final String prefix = "ID_";
+ /*
+ * The prefix is to enable the id to be an ID in the sense of
+ * XML/DTD.
+ */
+ returnValue = prefix + Integer.toString(ran.nextInt(UNDEFINED_NODE_ID));
+ } while (nodes.containsKey(returnValue));
+ return returnValue;
+ }
+
+ public <T extends IExtension> T getExtension(final Class<T> clazz) {
+ return extensionContainer.getExtension(clazz);
+ }
+
+ public Map<Class<? extends IExtension>, IExtension> getExtensions() {
+ return extensionContainer.getExtensions();
+ }
+
+ /**
+ * Change this to always return null if your model doesn't support files.
+ */
+ public File getFile() {
+ try {
+ return url != null && url.getProtocol().equals("file") ? Compat.urlToFile(url) : null;
+ }
+ catch (URISyntaxException e) {
+ return null;
+ }
+ }
+
+ public Filter getFilter() {
+ return filter;
+ }
+
+ public IconRegistry getIconRegistry() {
+ return iconRegistry;
+ }
+
+ /**
+ * @param nodeID
+ * @return
+ */
+ public NodeModel getNodeForID(final String nodeID) {
+ final NodeModel node = nodes.get(nodeID);
+ return node;
+ }
+
+ public int getNumberOfChangesSinceLastSave() {
+ return changesPerformedSinceLastSave;
+ }
+
+ public NodeModel getRootNode() {
+ return root;
+ }
+
+ public String getTitle() {
+ if (getURL() == null) {
+ return null;
+ }
+ else {
+ return getURL().toString();
+ }
+ }
+
+ /**
+ * Get the value of url.
+ *
+ * @return Value of url.
+ */
+ public URL getURL() {
+ return url;
+ }
+
+ public boolean isReadOnly() {
+ return readOnly || containsExtension(DocuMapAttribute.class);
+ }
+
+ public boolean isSaved() {
+ return changesPerformedSinceLastSave == 0;
+ }
+
+ /**
+ * @param value
+ * @param nodeModel
+ */
+ void registryID(final String value, final NodeModel nodeModel) {
+ final NodeModel old = nodes.put(value, nodeModel);
+ if (null != old && nodeModel != old) {
+ throw new RuntimeException("id " + value + " already registered");
+ }
+ }
+
+ /**
+ * @param nodeModel
+ * @return
+ */
+ public String registryNode(final NodeModel nodeModel) {
+ final String id = generateNodeID(nodeModel.getID());
+ registryID(id, nodeModel);
+ return id;
+ }
+
+ public void registryNodeRecursive(final NodeModel nodeModel) {
+ registryNodeRecursive(nodeModel, 0);
+ }
+
+ private void registryNodeRecursive(final NodeModel nodeModel, final int depth) {
+ if (depth > 400) {
+ throw new StackOverflowError();
+ }
+ final String id = nodeModel.getID();
+ if (id != null) {
+ registryID(id, nodeModel);
+ }
+ final Iterator<NodeModel> iterator = nodeModel.getChildren().iterator();
+ while (iterator.hasNext()) {
+ final NodeModel next = iterator.next();
+ registryNodeRecursive(next, depth + 1);
+ }
+ }
+
+ public IExtension removeExtension(final Class<? extends IExtension> clazz) {
+ return extensionContainer.removeExtension(clazz);
+ }
+
+ public boolean removeExtension(final IExtension extension) {
+ return extensionContainer.removeExtension(extension);
+ };
+
+ public void removeMapChangeListener(final IMapChangeListener listener) {
+ listeners.remove(listener);
+ };
+
+ public void setFilter(final Filter filter) {
+ this.filter = filter;
+ }
+
+ public void setReadOnly(final boolean readOnly) {
+ this.readOnly = readOnly;
+ }
+
+ public void setRoot(final NodeModel root) {
+ this.root = root;
+ root.attach();
+ root.setMap(this);
+ }
+
+ /**
+ * Counts the amount of actions performed.
+ *
+ * @param saved
+ * true if the file was saved recently. False otherwise.
+ */
+ public void setSaved(final boolean saved) {
+ if (saved) {
+ changesPerformedSinceLastSave = 0;
+ }
+ else {
+ ++changesPerformedSinceLastSave;
+ }
+ }
+
+ /**
+ * Set the value of url.
+ *
+ * @param v
+ * Value to assign to url.
+ */
+ public void setURL(final URL v) {
+ url = v;
+ }
+
+ public void unregistryNodes(final NodeModel node) {
+ final List<NodeModel> children = node.getChildren();
+ for (final NodeModel child : children) {
+ unregistryNodes(child);
+ }
+ final String id = node.getID();
+ if (id != null) {
+ nodes.put(id, null);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/MapNavigationUtils.java b/freeplane/src/main/java/org/freeplane/features/map/MapNavigationUtils.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/MapNavigationUtils.java
rename to freeplane/src/main/java/org/freeplane/features/map/MapNavigationUtils.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/MapReader.java b/freeplane/src/main/java/org/freeplane/features/map/MapReader.java
new file mode 100644
index 0000000..a830a98
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/MapReader.java
@@ -0,0 +1,191 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.UnknownElements;
+import org.freeplane.core.io.xml.TreeXmlReader;
+import org.freeplane.features.map.MapWriter.Hint;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.n3.nanoxml.XMLException;
+
+/**
+ * @author Dimitry Polivaev
+ * 20.12.2008
+ */
+public class MapReader implements IElementDOMHandler {
+ public class NodeTreeCreator {
+ private MapModel createdMap;
+ private final Map<Object, Object> hints;
+ private NodeModel mapChild = null;
+ private final Map<String, String> newIds;
+
+ public NodeTreeCreator() {
+ this(new HashMap<Object, Object>());
+ }
+
+ public NodeTreeCreator(Map<Object, Object> hints) {
+ super();
+ newIds = new HashMap<String, String>();
+ this.hints = hints;
+ }
+
+ public NodeModel create(final Reader pReader) throws XMLException {
+ final NodeTreeCreator oldNodeTreeCreator = nodeTreeCreator;
+ final TreeXmlReader reader = new TreeXmlReader(readManager);
+ try {
+ nodeTreeCreator = this;
+ reader.load(createdMap, pReader);
+ final NodeModel node = nodeBuilder.getMapChild();
+ return node;
+ }
+ finally {
+ nodeBuilder.reset();
+ nodeTreeCreator = oldNodeTreeCreator;
+ }
+ }
+
+ public NodeModel createNodeTreeFromXml(final MapModel map, final Reader pReader) throws IOException,
+ XMLException {
+ start(map);
+ final NodeModel node = create(pReader);
+ if (node == null)
+ throw new RuntimeException("corrupted map, no root node found");
+ finish(node);
+ return node;
+ }
+
+ public void finish(final NodeModel node) {
+ final NodeTreeCreator oldNodeTreeCreator = nodeTreeCreator;
+ try {
+ nodeTreeCreator = this;
+ readManager.readingCompleted(node, newIds);
+ newIds.clear();
+ createdMap = null;
+ }
+ finally {
+ nodeTreeCreator = oldNodeTreeCreator;
+ }
+ }
+
+ void start(final MapModel map) {
+ createdMap = map;
+ }
+
+ public MapModel getCreatedMap() {
+ return createdMap;
+ }
+
+ Object getHint(final Object key) {
+ return hints.get(key);
+ }
+
+ public void setHint(final Object key, final Object value) {
+ hints.put(key, value);
+ }
+
+ public void putHints(Map<? extends Object, ? extends Object> m) {
+ hints.putAll(m);
+ }
+
+ NodeModel getMapChild() {
+ return mapChild;
+ }
+
+ public void setMapChild(final NodeModel mapChild) {
+ this.mapChild = mapChild;
+ if(createdMap.getRootNode() == null && mapChild != null)
+ createdMap.setRoot(mapChild);
+ }
+
+ public void substituteNodeID(final String value, final String realId) {
+ newIds.put(value, realId);
+ }
+
+ public String substitutedID(final String idCandicate){
+ final String substitute = newIds.get(idCandicate);
+ if (substitute != null)
+ return substitute;
+ else
+ return idCandicate;
+ }
+ }
+
+ private final NodeBuilder nodeBuilder;
+ final private ReadManager readManager;
+ private NodeTreeCreator nodeTreeCreator;
+
+ public NodeTreeCreator getCurrentNodeTreeCreator() {
+ return nodeTreeCreator;
+ }
+
+ public MapReader(final ReadManager readManager) {
+ this.readManager = readManager;
+ nodeBuilder = new NodeBuilder(this);
+ nodeBuilder.registerBy(readManager);
+ }
+
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ return nodeTreeCreator.getCreatedMap();
+ }
+
+ public NodeModel createNodeTreeFromXml(final MapModel map, final Reader pReader, final Mode mode)
+ throws IOException, XMLException {
+ final Map<Object, Object> hints = new HashMap<Object, Object>(1);
+ hints.put(Hint.MODE, mode);
+ return createNodeTreeFromXml(map, pReader, hints);
+ }
+ public NodeModel createNodeTreeFromXml(final MapModel map, final Reader pReader, final Map<Object, Object> hints)
+ throws IOException, XMLException {
+ final NodeTreeCreator oldNodeTreeCreator = nodeTreeCreator;
+ try {
+ nodeTreeCreator = new NodeTreeCreator(hints);
+ final NodeModel topNode = nodeTreeCreator.createNodeTreeFromXml(map, pReader);
+ return topNode;
+ }
+ finally {
+ nodeTreeCreator = oldNodeTreeCreator;
+ }
+ }
+
+ public void endElement(final Object parent, final String tag, final Object element, final XMLElement dom) {
+ final MapModel map = (MapModel) element;
+ if (dom.getAttributeCount() != 0 || dom.hasChildren()) {
+ map.addExtension(new UnknownElements(dom));
+ }
+ }
+
+ public boolean isMapLoadingInProcess() {
+ return nodeTreeCreator != null;
+ }
+
+ public NodeTreeCreator nodeTreeCreator(final MapModel map) {
+ final NodeTreeCreator nodeTreeCreator = new NodeTreeCreator();
+ nodeTreeCreator.start(map);
+ return nodeTreeCreator;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/MapWriter.java b/freeplane/src/main/java/org/freeplane/features/map/MapWriter.java
new file mode 100644
index 0000000..7abee1e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/MapWriter.java
@@ -0,0 +1,143 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.io.IOException;
+import java.io.Writer;
+import java.util.Arrays;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeWriter;
+import org.freeplane.core.io.IElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.io.xml.TreeXmlWriter;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.features.link.LinkBuilder;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 07.12.2008
+ */
+public class MapWriter implements IElementWriter, IAttributeWriter {
+
+ public enum WriterHint {
+ FORCE_FORMATTING, ALREADY_WRITTEN
+ }
+ private static final String USAGE_COMMENT = "<!--To view this file,"
+ + " download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->"
+ + System.getProperty("line.separator");
+
+ public enum Hint {
+ MODE
+ };
+
+ public enum Mode {
+ CLIPBOARD, FILE, EXPORT, STYLE
+ };
+
+ private NodeWriter currentNodeWriter;
+ final private MapController mapController;
+ private boolean saveInvisible;
+ final WriteManager writeManager;
+
+ public MapWriter(final MapController mapController) {
+ this.mapController = mapController;
+ writeManager = mapController.getWriteManager();
+ }
+
+ public boolean isSaveInvisible() {
+ return saveInvisible;
+ }
+
+ public void setSaveInvisible(final boolean saveInvisible) {
+ this.saveInvisible = saveInvisible;
+ }
+
+ public void writeAttributes(final ITreeWriter writer, final Object userObject, final String tag) {
+ final MapModel map = (MapModel) userObject;
+ writer.addAttribute("version", FreeplaneVersion.XML_VERSION);
+ writer.addExtensionAttributes(map, Arrays.asList(map.getExtensions().values().toArray(new IExtension[] {})));
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object node, final String tag) throws IOException {
+ writer.addElementContent(USAGE_COMMENT);
+ final MapModel map = (MapModel) node;
+ writer.addExtensionNodes(map, Arrays.asList(map.getExtensions().values().toArray(new IExtension[] {})));
+ final NodeModel rootNode = map.getRootNode();
+ writeNode(writer, rootNode, saveInvisible, true);
+ }
+
+ public void writeMapAsXml(final MapModel map, final Writer fileout, final Mode mode, final boolean saveInvisible,
+ final boolean forceFormat) throws IOException {
+ final TreeXmlWriter xmlWriter = new TreeXmlWriter(writeManager, fileout);
+ xmlWriter.setHint(Hint.MODE, mode);
+ if (forceFormat) {
+ xmlWriter.setHint(WriterHint.FORCE_FORMATTING);
+ }
+ final XMLElement xmlMap = new XMLElement("map");
+ setSaveInvisible(saveInvisible);
+ xmlWriter.addElement(map, xmlMap);
+ xmlWriter.flush();
+ fileout.close();
+ }
+
+ private void writeNode(final ITreeWriter xmlWriter, final NodeModel node, final boolean writeInvisible,
+ final boolean writeChildren) throws IOException {
+ final NodeWriter oldNodeWriter = currentNodeWriter;
+ final Object mode = xmlWriter.getHint(Hint.MODE);
+ final String nodeTag;
+ if (Mode.STYLE.equals(mode)) {
+ nodeTag = NodeBuilder.XML_STYLENODE;
+ }
+ else {
+ nodeTag = NodeBuilder.XML_NODE;
+ }
+ if (oldNodeWriter != null)
+ oldNodeWriter.unregisterFrom(writeManager);
+ LinkBuilder currentLinkBuilder = new LinkBuilder(mapController.getModeController().getExtension(LinkController.class));
+ currentNodeWriter = new NodeWriter(mapController, currentLinkBuilder, nodeTag, writeChildren, writeInvisible);
+ try {
+ currentNodeWriter.registerBy(writeManager);
+ xmlWriter.addElement(node, nodeTag);
+ }
+ finally {
+
+ currentNodeWriter.unregisterFrom(writeManager);
+ if (oldNodeWriter != null)
+ oldNodeWriter.registerBy(writeManager);
+ currentNodeWriter = oldNodeWriter;
+ }
+ }
+
+ public void writeNodeAsXml(final Writer writer, final NodeModel node, final Mode mode,
+ final boolean writeInvisible, final boolean writeChildren, boolean forceFormat) throws IOException {
+ final TreeXmlWriter xmlWriter = new TreeXmlWriter(writeManager, writer);
+ xmlWriter.setHint(Hint.MODE, mode);
+ if (forceFormat) {
+ xmlWriter.setHint(WriterHint.FORCE_FORMATTING);
+ }
+ writeNode(xmlWriter, node, writeInvisible, writeChildren);
+ xmlWriter.flush();
+ }
+}
+
diff --git a/freeplane/src/main/java/org/freeplane/features/map/MultipleNodeList.java b/freeplane/src/main/java/org/freeplane/features/map/MultipleNodeList.java
new file mode 100644
index 0000000..9810bce
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/MultipleNodeList.java
@@ -0,0 +1,91 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+import org.freeplane.features.map.NodeModel.CloneType;
+
+/**
+ * @author Dimitry Polivaev
+ * 09.02.2014
+ */
+public class MultipleNodeList implements Clones {
+ private final CloneType cloneType;
+ public MultipleNodeList(CloneType cloneType) {
+ this.cloneType = cloneType;
+ }
+
+ LinkedList<NodeModel> nodes = new LinkedList<NodeModel>();
+ public Clones add(NodeModel nodeModel) {
+ nodes.add(nodeModel);
+ return this;
+ }
+
+ public Clones remove(NodeModel nodeModel) {
+ nodes.remove(nodeModel);
+ if(nodes.size() == 1)
+ return new SingleNodeList(head(), cloneType);
+ else
+ return this;
+
+ }
+
+ public Iterable<NodeModel> all() {
+ return nodes;
+ }
+
+ public Iterator<NodeModel> iterator() {
+ return nodes.iterator();
+ }
+ public int size() {
+ return nodes.size();
+ }
+
+ public void attach() {
+ throw new IllegalStateException();
+
+ }
+
+ public void detach(NodeModel nodeModel) {
+ final Clones reducedClones = remove(nodeModel);
+ final NodeModel head = head();
+ nodeModel.setClones(new DetachedNodeList(nodeModel, head, cloneType));
+ head.setClones(reducedClones);
+ }
+
+ public Collection<NodeModel> toCollection() {
+ return nodes;
+ }
+
+ public boolean contains(NodeModel node) {
+ return node != null && head().equals(node.clones(cloneType).head());
+ }
+
+ public NodeModel head() {
+ return nodes.get(0);
+ }
+
+ public CloneType getCloneType() {
+ return cloneType;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/NodeAbsolutePath.java b/freeplane/src/main/java/org/freeplane/features/map/NodeAbsolutePath.java
new file mode 100644
index 0000000..880d1b8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/NodeAbsolutePath.java
@@ -0,0 +1,54 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * @author Dimitry Polivaev
+ * 23.02.2014
+ */
+public class NodeAbsolutePath{
+ final private List<NodeModel> path;
+ final private ListIterator<NodeModel> iterator;
+ public NodeAbsolutePath(NodeModel node) {
+ path = Arrays.asList(node.getPathToRoot());
+ iterator = path.listIterator();
+ }
+ public int size() {
+ return path.size();
+ }
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+ public NodeModel next() {
+ return iterator.next();
+ }
+ public int lastIndex() {
+ return iterator.previousIndex();
+ }
+ public NodeModel previous() {
+ return iterator.previous();
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/NodeBuilder.java b/freeplane/src/main/java/org/freeplane/features/map/NodeBuilder.java
new file mode 100644
index 0000000..c460290
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/NodeBuilder.java
@@ -0,0 +1,267 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.List;
+import java.util.Map;
+
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IReadCompletionListener;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.UnknownElements;
+import org.freeplane.core.io.xml.TreeXmlReader;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.map.MapWriter.Hint;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.map.NodeModel.CloneType;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class NodeBuilder implements IElementDOMHandler {
+
+
+ private class CloneHandler implements IAttributeHandler {
+ private final CloneType cloneType;
+
+ public CloneHandler(CloneType cloneType) {
+ super();
+ this.cloneType = cloneType;
+ }
+
+ public void setAttribute(final Object userObject, final String proposedReferenceId) {
+ final NodeModel node = (NodeModel) userObject;
+ final String realReference = mapReader.getCurrentNodeTreeCreator().substitutedID(proposedReferenceId);
+ node.convertToClone(getMap().getNodeForID(realReference), cloneType);
+ }
+ }
+
+ static class IconProperties {
+ String iconName;
+ }
+
+ public static final String FOLDING_LOADED = "folding_loaded";
+ private static final String RESOURCES_ALWAYS_FOLD_ALL_AFTER_LOAD = "always_fold_all_after_load";
+ private static final String RESOURCES_ALWAYS_UNFOLD_ALL_AFTER_LOAD = "always_unfold_all_after_load";
+ private static final String RESOURCES_LOAD_FOLDING = "load_folding";
+ private static final String RESOURCES_LOAD_FOLDING_FROM_MAP_DEFAULT_FOLD_ALL = "load_folding_from_map_default_fold_all";
+ private static final String MAX_DISPLAYED_NODE_COUNT = "max_displayed_node_count";
+ private static final String RESOURCES_ALWAYS_SHOW_LESS_THAN_N_NODES_AFTER_LOAD = "always_show_less_than_N_nodes_after_load";
+ private static final String RESOURCES_SHOW_LESS_THAN_N_NODES_BY_DEFAULT_AFTER_LOAD = "show_less_than_N_nodes_by_default_after_load";
+ public static final String RESOURCES_ALWAYS_SAVE_FOLDING = "always_save_folding";
+ public static final String RESOURCES_NEVER_SAVE_FOLDING = "never_save_folding";
+ public static final String RESOURCES_SAVE_FOLDING = "save_folding";
+ public static final String RESOURCES_SAVE_FOLDING_IF_MAP_IS_CHANGED = "save_folding_if_map_is_changed";
+ public static final String RESOURCES_SAVE_MODIFICATION_TIMES = "save_modification_times";
+ public static final String XML_NODE = "node";
+ public static final String XML_STYLENODE = "stylenode";
+ public static final String XML_NODE_ADDITIONAL_INFO = "ADDITIONAL_INFO";
+ public static final String XML_NODE_CLASS = "AA_NODE_CLASS";
+ public static final String XML_NODE_ENCRYPTED_CONTENT = "ENCRYPTED_CONTENT";
+ public static final String XML_NODE_HISTORY_CREATED_AT = "CREATED";
+ public static final String XML_NODE_HISTORY_LAST_MODIFIED_AT = "MODIFIED";
+ private final MapReader mapReader;
+
+ NodeBuilder(final MapReader mapReader) {
+ this.mapReader = mapReader;
+ }
+
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ final NodeModel userObject = createNode();
+ if (getMapChild() == null) {
+ setMapChild(userObject);
+ }
+ return userObject;
+ }
+
+ public NodeModel createNode() {
+ return new NodeModel(getMap());
+ }
+
+ public void endElement(final Object parentObject, final String tag, final Object userObject, final XMLElement dom) {
+ final NodeModel node = (NodeModel) userObject;
+ if (dom.getAttributeCount() != 0 || dom.hasChildren()) {
+ node.addExtension(new UnknownElements(dom));
+ }
+ if (parentObject instanceof MapModel) {
+ setMapChild(node);
+ return;
+ }
+ if (parentObject instanceof NodeModel) {
+ final NodeModel parentNode = (NodeModel) parentObject;
+ if (userObject instanceof NodeModel) {
+ parentNode.insert(node, -1);
+ }
+ return;
+ }
+ }
+
+ private MapModel getMap() {
+ return mapReader.getCurrentNodeTreeCreator().getCreatedMap();
+ }
+
+ public NodeModel getMapChild() {
+ return mapReader.getCurrentNodeTreeCreator().getMapChild();
+ }
+
+ private void registerAttributeHandlers(final ReadManager reader) {
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeBuilder.XML_NODE_ENCRYPTED_CONTENT,
+ new IAttributeHandler() {
+ private void createEncryptedNode(final NodeModel node, final String additionalInfo) {
+ final EncryptionModel encryptionModel = new EncryptionModel(node, additionalInfo);
+ node.addExtension(encryptionModel);
+ }
+
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ createEncryptedNode(node, value);
+ node.setFolded(true);
+ }
+ });
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeBuilder.XML_NODE_HISTORY_CREATED_AT,
+ new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ if (node.getHistoryInformation() == null) {
+ node.setHistoryInformation(new HistoryInformationModel());
+ }
+ node.getHistoryInformation().setCreatedAt(TreeXmlReader.xmlToDate(value));
+ }
+ });
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeBuilder.XML_NODE_HISTORY_LAST_MODIFIED_AT,
+ new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ if (node.getHistoryInformation() == null) {
+ node.setHistoryInformation(new HistoryInformationModel());
+ }
+ node.getHistoryInformation().setLastModifiedAt(TreeXmlReader.xmlToDate(value));
+ }
+ });
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "FOLDED", new IAttributeHandler() {
+ public void setAttribute(Object userObject, String value) {
+ }
+ });
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "FOLDED", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ final Object mode = mapReader.getCurrentNodeTreeCreator().getHint(Hint.MODE);
+
+ if (mode.equals(Mode.FILE)) {
+ final String loadFolding = ResourceController.getResourceController().getProperty(
+ NodeBuilder.RESOURCES_LOAD_FOLDING);
+ if (loadFolding.equals(NodeBuilder.RESOURCES_ALWAYS_FOLD_ALL_AFTER_LOAD)
+ || loadFolding.equals(NodeBuilder.RESOURCES_ALWAYS_UNFOLD_ALL_AFTER_LOAD)
+ || loadFolding.equals(NodeBuilder.RESOURCES_ALWAYS_SHOW_LESS_THAN_N_NODES_AFTER_LOAD)) {
+ return;
+ }
+ mapReader.getCurrentNodeTreeCreator().setHint(FOLDING_LOADED, Boolean.TRUE);
+ }
+ if (value.equals("true")) {
+ node.setFolded(true);
+ }
+ }
+ });
+ reader.addReadCompletionListener(new IReadCompletionListener() {
+ private int foldAll(final NodeModel node, int nodeCount) {
+ if (node.getChildCount() == 0) {
+ return nodeCount;
+ }
+ if (nodeCount <= 0) {
+ node.setFolded(true);
+ }
+ else{
+ nodeCount -= node.getChildCount();
+ }
+ for (final NodeModel child : node.getChildren()) {
+ nodeCount = foldAll(child, nodeCount);
+ }
+ return nodeCount;
+ }
+
+ public void readingCompleted(final NodeModel topNode, final Map<String, String> newIds) {
+ if (!Mode.FILE.equals(mapReader.getCurrentNodeTreeCreator().getHint(Hint.MODE))) {
+ return;
+ }
+ if (Boolean.TRUE.equals(mapReader.getCurrentNodeTreeCreator().getHint(NodeBuilder.FOLDING_LOADED))) {
+ return;
+ }
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final String loadFolding = resourceController.getProperty(NodeBuilder.RESOURCES_LOAD_FOLDING);
+ if (loadFolding.equals(NodeBuilder.RESOURCES_ALWAYS_FOLD_ALL_AFTER_LOAD)
+ || loadFolding.equals(NodeBuilder.RESOURCES_LOAD_FOLDING_FROM_MAP_DEFAULT_FOLD_ALL)
+ || loadFolding.equals(NodeBuilder.RESOURCES_ALWAYS_SHOW_LESS_THAN_N_NODES_AFTER_LOAD)
+ || loadFolding.equals(NodeBuilder.RESOURCES_SHOW_LESS_THAN_N_NODES_BY_DEFAULT_AFTER_LOAD)) {
+ int nodeCount = 1;
+ if (loadFolding.equals(NodeBuilder.RESOURCES_ALWAYS_SHOW_LESS_THAN_N_NODES_AFTER_LOAD)
+ || loadFolding.equals(NodeBuilder.RESOURCES_SHOW_LESS_THAN_N_NODES_BY_DEFAULT_AFTER_LOAD))
+ nodeCount = resourceController.getIntProperty(NodeBuilder.MAX_DISPLAYED_NODE_COUNT, 20);
+ final List<NodeModel> children = topNode.getChildren();
+ nodeCount = nodeCount - 1 - children.size();
+ for (final NodeModel child : children) {
+ nodeCount = foldAll(child, nodeCount);
+ }
+ }
+ }
+ });
+ final IAttributeHandler positionHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ node.setLeft(value.equals("left"));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "POSITION", positionHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "POSITION", positionHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "ID", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ final String realId = getMap().generateNodeID(value);
+ node.setID(realId);
+ if (!realId.equals(value)) {
+ mapReader.getCurrentNodeTreeCreator().substituteNodeID(value, realId);
+ }
+ }
+ });
+
+ final IAttributeHandler subtreeReferenceHandler = new CloneHandler(CloneType.TREE);
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "REFERENCE_ID", subtreeReferenceHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "TREE_ID", subtreeReferenceHandler);
+ final IAttributeHandler contentReferenceHandler = new CloneHandler(CloneType.CONTENT);
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "CONTENT_ID", contentReferenceHandler);
+ }
+
+ /**
+ */
+ public void registerBy(final ReadManager reader) {
+ registerAttributeHandlers(reader);
+ reader.addElementHandler(NodeBuilder.XML_NODE, this);
+ reader.addElementHandler(NodeBuilder.XML_STYLENODE, this);
+ }
+
+ public void reset() {
+ setMapChild(null);
+ }
+
+ public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
+ }
+
+ private void setMapChild(final NodeModel mapChild) {
+ mapReader.getCurrentNodeTreeCreator().setMapChild(mapChild);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/NodeChangeEvent.java b/freeplane/src/main/java/org/freeplane/features/map/NodeChangeEvent.java
new file mode 100644
index 0000000..57cb308
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/NodeChangeEvent.java
@@ -0,0 +1,65 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.awt.AWTEvent;
+
+/**
+ * @author Dimitry Polivaev 27.11.2008
+ */
+public class NodeChangeEvent extends AWTEvent {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private Object newValue;
+ final private Object oldValue;
+ final private Object property;
+// final private ModeController modeController;
+
+ public NodeChangeEvent(final NodeModel node, final Object property,
+ final Object oldValue, final Object newValue) {
+ super(node, 0);
+// this.modeController = modeController;
+ this.oldValue = oldValue;
+ this.newValue = newValue;
+ this.property = property;
+ }
+
+ public Object getNewValue() {
+ return newValue;
+ }
+
+ public NodeModel getNode() {
+ return (NodeModel) getSource();
+ }
+
+ public Object getOldValue() {
+ return oldValue;
+ }
+
+ public Object getProperty() {
+ return property;
+ }
+
+ public NodeChangeEvent forNode(NodeModel node) {
+ return new NodeChangeEvent(node, getProperty(), getOldValue(), getNewValue());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/NodeDeletionEvent.java b/freeplane/src/main/java/org/freeplane/features/map/NodeDeletionEvent.java
new file mode 100644
index 0000000..83ca81d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/NodeDeletionEvent.java
@@ -0,0 +1,14 @@
+package org.freeplane.features.map;
+
+public class NodeDeletionEvent {
+ final public NodeModel parent;
+ final public NodeModel node;
+ final public int index;
+ public NodeDeletionEvent(NodeModel parent, NodeModel node, int index) {
+ super();
+ this.parent = parent;
+ this.node = node;
+ this.index = index;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/map/NodeIconSetModel.java b/freeplane/src/main/java/org/freeplane/features/map/NodeIconSetModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/NodeIconSetModel.java
rename to freeplane/src/main/java/org/freeplane/features/map/NodeIconSetModel.java
diff --git a/freeplane/src/org/freeplane/features/map/NodeLevelCompareCondition.java b/freeplane/src/main/java/org/freeplane/features/map/NodeLevelCompareCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/NodeLevelCompareCondition.java
rename to freeplane/src/main/java/org/freeplane/features/map/NodeLevelCompareCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/NodeLevelConditionController.java b/freeplane/src/main/java/org/freeplane/features/map/NodeLevelConditionController.java
new file mode 100644
index 0000000..777dbb4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/NodeLevelConditionController.java
@@ -0,0 +1,185 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.ui.FixedBasicComboBoxEditor;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 27.07.2010
+ */
+class NodeLevelConditionController implements IElementaryConditionController {
+ static final String FILTER_LEVEL = "filter_node_level";
+ static final String FILTER_ROOT = "filter_root";
+ static final String FILTER_LEAF = "filter_leaf";
+ static final String FILTER_PERIODIC_LEVEL = "filter_periodic_level";
+ private final ComboBoxEditor levelEditor = new NumberComboBoxEditor();
+ private final ComboBoxModel values = new DefaultComboBoxModel();
+ private final ComboBoxModel periodicValues = new DefaultComboBoxModel(PeriodicLevelCondition.createConditions(7));
+
+
+ public boolean canEditValues(final Object selectedItem, final TranslatedObject simpleCond) {
+ return ! simpleCond.objectEquals(FILTER_PERIODIC_LEVEL);
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ if (namedObject.objectEquals(NodeLevelConditionController.FILTER_LEVEL))
+ return true;
+ return false;
+ }
+
+ public boolean canSelectValues(final Object selectedItem, final TranslatedObject simpleCondition) {
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
+ return true;
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
+ return true;
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
+ return true;
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
+ return true;
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
+ return true;
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
+ return true;
+ }
+ if (simpleCondition.objectEquals(FILTER_PERIODIC_LEVEL)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase,
+ final boolean matchApproximately) {
+ if(value instanceof PeriodicLevelCondition){
+ return (ASelectableCondition) value;
+ }
+ return createASelectableCondition(simpleCond, (String) value, matchCase, matchApproximately);
+ }
+
+ protected ASelectableCondition createASelectableCondition(final TranslatedObject simpleCondition, final String value,
+ final boolean matchCase, final boolean matchApproximately) {
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
+ return new NodeLevelCompareCondition(value, matchCase, 0, true);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
+ return new NodeLevelCompareCondition(value, matchCase, 0, false);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
+ return new NodeLevelCompareCondition(value, matchCase, 1, true);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
+ return new NodeLevelCompareCondition(value, matchCase, -1, false);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
+ return new NodeLevelCompareCondition(value, matchCase, -1, true);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
+ return new NodeLevelCompareCondition(value, matchCase, 1, false);
+ }
+ if (simpleCondition.objectEquals(NodeLevelConditionController.FILTER_ROOT))
+ return new RootCondition();
+ if (simpleCondition.objectEquals(NodeLevelConditionController.FILTER_LEAF))
+ return new LeafCondition();
+ return null;
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object selectedItem) {
+ return new DefaultComboBoxModel(new TranslatedObject[] {
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_NOT_EQUAL_TO),
+ TranslatedObject.literal(ConditionFactory.FILTER_GT), TranslatedObject.literal(ConditionFactory.FILTER_GE),
+ TranslatedObject.literal(ConditionFactory.FILTER_LE), TranslatedObject.literal(ConditionFactory.FILTER_LT),
+ TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_ROOT),
+ TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_LEAF),
+ TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_PERIODIC_LEVEL),
+ });
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_LEVEL));
+ return list;
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ if(selectedCondition.objectEquals(FILTER_PERIODIC_LEVEL)){
+ return new FixedBasicComboBoxEditor();
+ }
+ return levelEditor;
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object property, TranslatedObject simpleCond) {
+ if(simpleCond.objectEquals(FILTER_PERIODIC_LEVEL)){
+ return periodicValues;
+ }
+ return values;
+ }
+
+ public boolean isCaseDependent(final Object selectedItem, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean supportsApproximateMatching(final Object selectedItem, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ if (element.getName().equalsIgnoreCase(NodeLevelCompareCondition.NAME)) {
+ return NodeLevelCompareCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(RootCondition.NAME)) {
+ return RootCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(LeafCondition.NAME)) {
+ return LeafCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(PeriodicLevelCondition.NAME)) {
+ return PeriodicLevelCondition.load(element);
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/NodeModel.java b/freeplane/src/main/java/org/freeplane/features/map/NodeModel.java
new file mode 100644
index 0000000..a0d6fca
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/NodeModel.java
@@ -0,0 +1,722 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import static org.freeplane.features.map.NodeModel.CloneType.CONTENT;
+import static org.freeplane.features.map.NodeModel.CloneType.TREE;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.freeplane.core.extension.ExtensionContainer;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.filter.Filter;
+import org.freeplane.features.filter.FilterInfo;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.ui.INodeViewVisitor;
+
+/**
+ * This class represents a single Node of a Tree. It contains direct handles to
+ * its parent and children and to its view.
+ *
+ * Note that this class does not and must not know anything about its extensions,
+ * otherwise this class would become too big.
+ * Extension methods that add functionality to nodes are in the extension packages
+ * and get NodeModel as an argument.
+ */
+public class NodeModel{
+ public enum NodeChangeType {
+ FOLDING, REFRESH
+ }
+
+ public enum CloneType{TREE, CONTENT}
+ final static int TREE_CLONE_INDEX = CloneType.TREE.ordinal();
+ final static int CONTENT_CLONE_INDEX = CloneType.CONTENT.ordinal();
+
+ private static final boolean ALLOWSCHILDREN = true;
+ public final static int LEFT_POSITION = -1;
+ public static final String NODE_TEXT = "node_text";
+ public static final String NOTE_TEXT = "note_text";
+ public final static int RIGHT_POSITION = 1;
+ public final static int UNKNOWN_POSITION = 0;
+ static public final Object UNKNOWN_PROPERTY = new Object();
+ public static final String NODE_ICON = "icon";
+ static public final Object HYPERLINK_CHANGED = "hyperlink_changed";
+
+ private final List<NodeModel> children;
+ private NodeModel parent;
+ final private FilterInfo filterInfo;
+ private String id;
+ private MapModel map = null;
+ private int position = NodeModel.UNKNOWN_POSITION;
+ private NodeModel preferredChild;
+ private Collection<INodeView> views = null;
+
+ private SharedNodeData sharedData;
+ private Clones[] clones;
+
+ void setClones(Clones clones) {
+ this.clones[clones.getCloneType().ordinal()] = clones;
+ for(NodeModel clone : clones)
+ clone.fireNodeChanged(new NodeChangeEvent(this, NodeModel.UNKNOWN_PROPERTY, null, null));
+ }
+
+ public Object getUserObject() {
+ return sharedData.getUserObject();
+ }
+
+ public NodeModel(final MapModel map) {
+ this("", map);
+ }
+
+ public NodeModel(final Object userObject, final MapModel map) {
+ sharedData = new SharedNodeData();
+ init(userObject);
+ this.map = map;
+ children = new ArrayList<NodeModel>();
+ filterInfo = new FilterInfo();
+ clones = new Clones[]{new DetachedNodeList(this, TREE), new DetachedNodeList(this, CONTENT)};
+ }
+
+ private NodeModel(NodeModel toBeCloned, CloneType cloneType){
+ this.map = toBeCloned.map;
+ this.sharedData = toBeCloned.sharedData;
+ children = new ArrayList<NodeModel>();
+ filterInfo = new FilterInfo();
+ clones = new Clones[]{new DetachedNodeList(this, cloneType == TREE ? toBeCloned : this, TREE), new DetachedNodeList(this, toBeCloned, CONTENT)};
+ }
+
+ protected void init(final Object userObject) {
+ setUserObject(userObject);
+ setHistoryInformation(new HistoryInformationModel());
+ }
+
+ public void acceptViewVisitor(final INodeViewVisitor visitor) {
+ if (views == null) {
+ return;
+ }
+ for (final INodeView view : views) {
+ visitor.visit(view);
+ }
+ }
+
+ public void addExtension(final IExtension extension) {
+ getExtensionContainer().addExtension(extension);
+ }
+
+ public IExtension putExtension(final IExtension extension) {
+ return getExtensionContainer().putExtension(extension);
+ }
+
+ public void addIcon(final MindIcon icon) {
+ getIconModel().addIcon(icon);
+ if (map != null) {
+ map.getIconRegistry().addIcon(icon);
+ }
+ }
+
+ public void addIcon(final MindIcon icon, final int position) {
+ getIconModel().addIcon(icon, position);
+ getMap().getIconRegistry().addIcon(icon);
+ }
+
+ public void addViewer(final INodeView viewer) {
+ getViewers().add(viewer);
+ }
+
+ public boolean areViewsEmpty() {
+ return views == null || views.isEmpty();
+ }
+
+ protected List<NodeModel> getChildrenInternal() {
+ return children;
+ }
+
+ public Enumeration<NodeModel> children() {
+ final Iterator<NodeModel> i = getChildrenInternal().iterator();
+ return new Enumeration<NodeModel>() {
+ public boolean hasMoreElements() {
+ return i.hasNext();
+ }
+
+ public NodeModel nextElement() {
+ return i.next();
+ }
+ };
+ }
+
+ public boolean containsExtension(final Class<? extends IExtension> clazz) {
+ return getExtensionContainer().containsExtension(clazz);
+ }
+
+ public String createID() {
+ if (id == null) {
+ id = getMap().registryNode(this);
+ }
+ return id;
+ }
+
+ public void fireNodeChanged(final NodeChangeEvent nodeChangeEvent) {
+ if (views == null) {
+ return;
+ }
+ final Iterator<INodeView> iterator = views.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().nodeChanged(nodeChangeEvent);
+ }
+ }
+
+ private void fireNodeInserted(final NodeModel child, final int index) {
+ if (views == null) {
+ return;
+ }
+ final Iterator<INodeView> iterator = views.iterator();
+ while (iterator.hasNext()) {
+ iterator.next().onNodeInserted(this, child, index);
+ }
+ }
+
+ private void fireNodeRemoved(final NodeModel child, final int index) {
+ if (views == null) {
+ return;
+ }
+ final Iterator<INodeView> iterator = views.iterator();
+ final NodeDeletionEvent nodeDeletionEvent = new NodeDeletionEvent(this, child, index);
+ while (iterator.hasNext()) {
+ iterator.next().onNodeDeleted(nodeDeletionEvent);
+ }
+ }
+
+ public boolean getAllowsChildren() {
+ return NodeModel.ALLOWSCHILDREN;
+ };
+
+ public NodeModel getChildAt(final int childIndex) {
+ return childIndex >= 0 ? getChildrenInternal().get(childIndex) : null;
+ }
+
+ public int getChildCount() {
+ if (getChildrenInternal() == null) {
+ return 0;
+ }
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(this);
+ return encryptionModel == null || encryptionModel.isAccessible() ? getChildrenInternal().size() : 0;
+ }
+
+ public List<NodeModel> getChildren() {
+ List<NodeModel> childrenList;
+ if (getChildrenInternal() != null) {
+ childrenList = getChildrenInternal();
+ }
+ else {
+ childrenList = Collections.emptyList();
+ }
+ return Collections.unmodifiableList(childrenList);
+ }
+
+ public <T extends IExtension> T getExtension(final Class<T> clazz) {
+ return getExtensionContainer().getExtension(clazz);
+ }
+
+ public Map<Class<? extends IExtension>, IExtension> getSharedExtensions() {
+ return getExtensionContainer().getExtensions();
+ };
+
+ public FilterInfo getFilterInfo() {
+ return filterInfo;
+ }
+
+ public HistoryInformationModel getHistoryInformation() {
+ return sharedData.getHistoryInformation();
+ }
+
+ public MindIcon getIcon(final int position) {
+ return getIconModel().getIcon(position);
+ }
+
+ public List<MindIcon> getIcons() {
+ return getIconModel().getIcons();
+ }
+
+ public String getID() {
+ return id;
+ }
+
+ public int getIndex(final NodeModel node) {
+ return children.indexOf(node);
+ }
+
+ public MapModel getMap() {
+ return map;
+ }
+
+ public int getNodeLevel(final boolean countHidden) {
+ int level = 0;
+ NodeModel parent;
+ for (parent = getParentNode(); parent != null; parent = parent.getParentNode()) {
+ if (countHidden || parent.isVisible()) {
+ level++;
+ }
+ }
+ return level;
+ }
+
+ public NodeModel getParentNode() {
+ return parent;
+ }
+
+ public NodeModel[] getPathToRoot() {
+ int i = getNodeLevel(true);
+ final NodeModel[] path = new NodeModel[i + 1];
+ NodeModel node = this;
+ while (i >= 0) {
+ path[i--] = node;
+ node = node.getParentNode();
+ }
+ return path;
+ }
+
+ public String getText() {
+ String string = "";
+ if (getUserObject() != null) {
+ string = getUserObject().toString();
+ }
+ return string;
+ }
+
+ public Collection<INodeView> getViewers() {
+ if (views == null) {
+ views = new LinkedList<INodeView>();
+ }
+ return views;
+ }
+
+ public final String getXmlText() {
+ return sharedData.getXmlText();
+ }
+
+ public boolean hasChildren() {
+ return getChildCount() != 0;
+ }
+
+ public boolean hasID() {
+ return id != null;
+ }
+
+ public void insert(final NodeModel child, int index) {
+ if (!isAccessible()) {
+ throw new IllegalArgumentException("Trying to insert nodes into a ciphered node.");
+ }
+ final NodeModel childNode = child;
+ if (index < 0) {
+ index = getChildCount();
+ children.add(index, child);
+ }
+ else {
+ children.add(index, child);
+ preferredChild = childNode;
+ }
+ child.setParent(this);
+ fireNodeInserted(childNode, getIndex(child));
+ }
+
+ private boolean isAccessible() {
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(this);
+ return encryptionModel == null || encryptionModel.isAccessible();
+ }
+
+ /**
+ * Returns whether the argument is parent or parent of one of the grandpa's
+ * of this node. (transitive)
+ */
+ public boolean isDescendantOf(final NodeModel node) {
+ if (parent == null) {
+ return false;
+ }
+ else if (node == parent) {
+ return true;
+ }
+ else {
+ return parent.isDescendantOf(node);
+ }
+ }
+
+ public boolean isFolded() {
+ return sharedData.isFolded();
+ }
+
+ /*
+ * Notes
+ */
+ public boolean isLeaf() {
+ return getChildCount() == 0;
+ }
+
+ public boolean isLeft() {
+ if (position == NodeModel.UNKNOWN_POSITION && getParentNode() != null) {
+ setLeft(getParentNode().isLeft());
+ }
+ return position == NodeModel.LEFT_POSITION;
+ }
+
+ public boolean isNewChildLeft() {
+ if (!isRoot()) {
+ return isLeft();
+ }
+ int rightChildrenCount = 0;
+ for (int i = 0; i < getChildCount(); i++) {
+ if (!getChildAt(i).isLeft()) {
+ rightChildrenCount++;
+ }
+ if (rightChildrenCount > getChildCount() / 2) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public boolean isRoot() {
+ return getMap().getRootNode() == this;
+ }
+
+ public boolean hasVisibleContent() {
+ return ! isHiddenSummary() && satisfiesFilter();
+ }
+
+ private boolean satisfiesFilter() {
+ final Filter filter = getMap().getFilter();
+ return (filter == null || filter.isVisible(this));
+ }
+
+ public boolean isHiddenSummary() {
+ return SummaryNode.isHidden(this);
+ }
+
+ public boolean isVisible() {
+ return isHiddenSummary() || satisfiesFilter();
+ }
+
+ public void remove(final int index) {
+ final NodeModel child = children.get(index);
+ if (child == preferredChild) {
+ if (getChildrenInternal().size() > index + 1) {
+ preferredChild = (getChildrenInternal().get(index + 1));
+ }
+ else {
+ preferredChild = (index > 0) ? (NodeModel) (getChildrenInternal().get(index - 1)) : null;
+ }
+ }
+ child.setParent(null);
+ children.remove(index);
+ fireNodeRemoved(child, index);
+ }
+
+ public <T extends IExtension> T removeExtension(final Class<T> clazz){
+ return getExtensionContainer().removeExtension(clazz);
+ }
+
+ public boolean removeExtension(final IExtension extension) {
+ return getExtensionContainer().removeExtension(extension);
+ }
+
+ /**
+ * remove last icon
+ *
+ * @return the number of remaining icons.
+ */
+ public int removeIcon() {
+ return getIconModel().removeIcon();
+ }
+
+ /**
+ * @param remove icons with given position
+ *
+ * @return the number of remaining icons
+ */
+ public int removeIcon(final int position) {
+ return getIconModel().removeIcon(position);
+ }
+
+ public void removeViewer(final INodeView viewer) {
+ getViewers().remove(viewer);
+ }
+
+ public void setFolded(boolean folded) {
+ boolean wasFolded = isFolded();
+ if (wasFolded != folded) {
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(this);
+ sharedData.setFolded(encryptionModel != null && !encryptionModel.isAccessible() || folded && ! AlwaysUnfoldedNode.isConnectorNode(this));
+ }
+ fireNodeChanged(new NodeChangeEvent(this, NodeChangeType.FOLDING, Boolean.valueOf(wasFolded), Boolean.valueOf(folded)));
+ }
+
+ public void setHistoryInformation(final HistoryInformationModel historyInformation) {
+ this.sharedData.setHistoryInformation(historyInformation);
+ }
+
+ public void setID(final String value) {
+ id = value;
+ getMap().registryID(value, this);
+ }
+
+ public void setLeft(final boolean isLeft) {
+ position = isLeft ? NodeModel.LEFT_POSITION : NodeModel.RIGHT_POSITION;
+ if (!isRoot()) {
+ for (int i = 0; i < getChildCount(); i++) {
+ final NodeModel child = getChildAt(i);
+ if (child.position != position) {
+ child.setLeft(isLeft);
+ }
+ }
+ }
+ }
+
+ /**
+ */
+ public void setMap(final MapModel map) {
+ this.map = map;
+ for (final NodeModel child : getChildrenInternal()) {
+ child.setMap(map);
+ }
+ }
+
+ public void setParent(final NodeModel newParent) {
+ if(parent == null && newParent != null && newParent.isAttached())
+ attach();
+ else if(parent != null && parent.isAttached() && (newParent == null || !newParent.isAttached()))
+ detach();
+ parent = newParent;
+ }
+
+ void attach() {
+ attachClones();
+ for(NodeModel child : children)
+ child.attach();
+ }
+
+ private void attachClones() {
+ for(Clones clonesGroup : clones)
+ clonesGroup.attach();
+ }
+
+ private void detach() {
+ detachClones();
+ for(NodeModel child : children)
+ child.detach();
+ }
+
+ private void detachClones() {
+ for(Clones clonesGroup : clones)
+ clonesGroup.detach(this);
+ }
+
+
+ boolean isAttached() {
+ return clones[0].size() != 0;
+ }
+
+ public final void setText(final String text) {
+ sharedData.setText(text);
+ }
+
+ public final void setUserObject(final Object data) {
+ sharedData.setUserObject(data);
+ }
+
+ public final void setXmlText(final String pXmlText) {
+ sharedData.setXmlText(pXmlText);
+ }
+
+ @Override
+ public String toString() {
+ return HtmlUtils.htmlToPlain(getText());
+ }
+
+ public int depth() {
+ final NodeModel parentNode = getParentNode();
+ if (parentNode == null) {
+ return 0;
+ }
+ return parentNode.depth() + 1;
+ }
+
+ public void insert(final NodeModel newNodeModel) {
+ insert(newNodeModel, getChildCount());
+ }
+
+ public NodeModel getVisibleAncestorOrSelf() {
+ NodeModel node = this;
+ while (!node.hasVisibleContent()) {
+ node = node.getParentNode();
+ }
+ return node;
+ }
+
+ private ExtensionContainer getExtensionContainer() {
+ return sharedData.getExtensionContainer();
+ }
+
+ private NodeIconSetModel getIconModel() {
+ return sharedData.getIcons();
+ }
+
+ void fireNodeChanged(INodeChangeListener[] nodeChangeListeners, final NodeChangeEvent nodeChangeEvent) {
+ for(NodeModel node : clones[CONTENT.ordinal()]){
+ final NodeChangeEvent cloneEvent = nodeChangeEvent.forNode(node);
+ node.fireSingleNodeChanged(nodeChangeListeners, cloneEvent);
+ }
+ }
+
+ private void fireSingleNodeChanged(INodeChangeListener[] nodeChangeListeners, final NodeChangeEvent nodeChangeEvent) {
+ for (final INodeChangeListener listener : nodeChangeListeners) {
+ listener.nodeChanged(nodeChangeEvent);
+ }
+ fireNodeChanged(nodeChangeEvent);
+ }
+
+ public NodeModel cloneTree(){
+ final NodeModel clone = new Cloner(this).cloneTree();
+ return clone;
+ }
+
+ public NodeModel cloneContent() {
+ if(containsExtension(EncryptionModel.class))
+ throw new CloneEncryptedNodeException();
+ return cloneNode(CloneType.CONTENT);
+ }
+
+ protected NodeModel cloneNode(CloneType cloneType) {
+ final NodeModel clone = new NodeModel(this, cloneType);
+ return clone;
+ }
+
+ public SharedNodeData getSharedData() {
+ return sharedData;
+ }
+
+ public Collection<IExtension> getIndividualExtensionValues() {
+ return Collections.emptyList();
+ }
+
+ public void convertToClone(NodeModel node, CloneType cloneType) {
+ sharedData = node.sharedData;
+ if(cloneType == TREE)
+ this.clones[TREE.ordinal()] = new DetachedNodeList(this, node, TREE);
+ this.clones[CONTENT.ordinal()] = new DetachedNodeList(this, node, CONTENT);
+ }
+
+ public Clones subtreeClones() {
+ return clones(CloneType.TREE);
+ }
+
+ public Clones allClones() {
+ return clones(CloneType.CONTENT);
+ }
+
+ Clones clones(final CloneType cloneType) {
+ return clones[cloneType.ordinal()];
+ }
+
+ public boolean subtreeContainsCloneOf(NodeModel node) {
+ for(NodeModel clone : node.subtreeClones())
+ if(equals(clone))
+ return true;
+ for(NodeModel child : children)
+ if(child.subtreeContainsCloneOf(node))
+ return true;
+ return false;
+ }
+
+ public boolean isSubtreeCloneOf(NodeModel ancestorClone) {
+ return subtreeClones().contains(ancestorClone);
+ }
+
+ public NodeModel getSubtreeRoot() {
+ if(isSubtreeRoot())
+ return this;
+ else
+ return getParentNode().getSubtreeRoot();
+
+ }
+
+ private boolean isSubtreeRoot() {
+ return parent == null || isCloneTreeRoot();
+ }
+
+ public boolean isCloneTreeRoot(){
+ return parent != null && parent.clones[TREE_CLONE_INDEX].size() < clones[TREE_CLONE_INDEX].size()
+ || clones[TREE_CLONE_INDEX].size() == 1 && clones[CONTENT_CLONE_INDEX].size() > 1;
+ }
+
+ public boolean isCloneTreeNode(){
+ return parent != null && clones[TREE_CLONE_INDEX].size() > 1 && parent.clones[TREE_CLONE_INDEX].size() == clones[TREE_CLONE_INDEX].size();
+ }
+
+ public int nextNodeIndex(int index, final boolean leftSide) {
+ return nextNodeIndex(index, leftSide, +1);
+ }
+
+ public int previousNodeIndex(int index, final boolean leftSide) {
+ return nextNodeIndex(index, leftSide, -1);
+ }
+
+ private int nextNodeIndex(int index, final boolean leftSide, final int step) {
+ for(int i = index + step; i >= 0 && i < getChildCount(); i+=step){
+ final NodeModel followingNode = getChildAt(i);
+ if(followingNode.isLeft() == leftSide) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ public NodeModel previousNode(int start, boolean isLeft) {
+ final int previousNodeIndex = previousNodeIndex(start, isLeft);
+ return parent.getChildAt(previousNodeIndex);
+ }
+
+ public int getIndex() {
+ final NodeModel parentNode = getParentNode();
+ return parentNode != null ? parentNode.getIndex(this) : -1;
+ }
+
+ public void swapData(NodeModel duplicate) {
+ this.detachClones();
+ SharedNodeData sharedDataSwap = sharedData;
+ this.sharedData = duplicate.sharedData;
+ duplicate.sharedData = sharedDataSwap;
+ Clones[] clonesSwap = clones;
+ this.clones = duplicate.clones;
+ duplicate.clones = clonesSwap;
+ for(CloneType cloneType : CloneType.values()) {
+ final DetachedNodeList detachedClone = (DetachedNodeList) clones[cloneType.ordinal()];
+ clones[cloneType.ordinal()] = detachedClone.forClone(this);
+ }
+
+ this.attachClones();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/NodeMoveEvent.java b/freeplane/src/main/java/org/freeplane/features/map/NodeMoveEvent.java
new file mode 100644
index 0000000..0c80274
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/NodeMoveEvent.java
@@ -0,0 +1,23 @@
+package org.freeplane.features.map;
+
+public class NodeMoveEvent {
+ final public NodeModel oldParent;
+ final public int oldIndex;
+ final public boolean oldSideLeft;
+ final public NodeModel newParent;
+ final public NodeModel child;
+ final public int newIndex;
+ final public boolean newSideLeft;
+ public NodeMoveEvent(NodeModel oldParent, int oldIndex, boolean oldSideLeft, NodeModel newParent, NodeModel child,
+ int newIndex, boolean newSideLeft) {
+ super();
+ this.oldParent = oldParent;
+ this.oldIndex = oldIndex;
+ this.oldSideLeft = oldSideLeft;
+ this.newParent = newParent;
+ this.child = child;
+ this.newIndex = newIndex;
+ this.newSideLeft = newSideLeft;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/NodeRelativePath.java b/freeplane/src/main/java/org/freeplane/features/map/NodeRelativePath.java
new file mode 100644
index 0000000..a21fe7a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/NodeRelativePath.java
@@ -0,0 +1,120 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.Arrays;
+
+
+/**
+ * @author Dimitry Polivaev
+ * 23.02.2014
+ */
+public class NodeRelativePath {
+
+ private final NodeModel commonAncestor;
+ private final int[] beginPath;
+ private final int[] endPath;
+
+ public NodeRelativePath(NodeModel begin, NodeModel end) {
+ final NodeAbsolutePath absoluteBeginPath = new NodeAbsolutePath(begin);
+ final NodeAbsolutePath absoluteEndPath = new NodeAbsolutePath(end);
+ NodeModel commonAncestor = null;
+ while(absoluteBeginPath.hasNext() && absoluteEndPath.hasNext()){
+ NodeModel nextNodeOnBeginPath = absoluteBeginPath.next();
+ if(nextNodeOnBeginPath.equals(absoluteEndPath.next())){
+ commonAncestor = nextNodeOnBeginPath;
+ }
+ else{
+ absoluteBeginPath.previous();
+ absoluteEndPath.previous();
+ break;
+ }
+ }
+ this.commonAncestor = commonAncestor;
+ int commonAncestorIndex = absoluteBeginPath.lastIndex();
+ beginPath = path(absoluteBeginPath, commonAncestorIndex);
+ endPath = path(absoluteEndPath, commonAncestorIndex);
+ }
+
+ private int [] path(final NodeAbsolutePath absolutePath, int startingIndex) {
+ int [] path = new int[absolutePath.size() - startingIndex - 1];
+ if(path.length > 0){
+ for(int i = 0; i < path.length; i++){
+ NodeModel nodeOnPath = absolutePath.next();
+ final NodeModel parentNode = nodeOnPath.getParentNode();
+ path[i] = parentNode.getIndex(nodeOnPath);
+ }
+ }
+ return path;
+ }
+
+ public NodeModel commonAncestor() {
+ return commonAncestor;
+ }
+
+ public NodeModel pathBegin(NodeModel commonAncestor) {
+ return relativeNode(commonAncestor, beginPath, beginPath.length);
+ }
+
+ public NodeModel pathEnd(NodeModel commonAncestor) {
+ return relativeNode(commonAncestor, endPath, endPath.length);
+ }
+
+ private NodeModel relativeNode(NodeModel commonAncestor, final int[] path, int level) {
+ NodeModel relativeNode = commonAncestor;
+ for(int position = 0; position < level; position++){
+ relativeNode = relativeNode.getChildAt(path[position]);
+ }
+ return relativeNode;
+ }
+
+ public NodeModel ancestorForBegin(NodeModel begin) {
+ final int backLevelNumber = beginPath.length;
+ return ancestor(begin, backLevelNumber);
+
+ }
+
+ private NodeModel ancestor(NodeModel source, final int backLevelNumber) {
+ NodeModel ancestor = source;
+ for(int i = 0; i < backLevelNumber; i++){
+ if(ancestor == null)
+ return ancestor;
+ ancestor = ancestor.getParentNode();
+ }
+ return ancestor;
+ }
+
+ public boolean equalPathsTo(NodeRelativePath nodeRelativePath2) {
+ return Arrays.equals(beginPath, nodeRelativePath2.beginPath) && Arrays.equals(endPath, nodeRelativePath2.endPath);
+ }
+
+ public NodeModel beginPathElement(int level) {
+ return relativeNode(commonAncestor, beginPath, level);
+ }
+
+ public NodeModel endPathElement(int level) {
+ return relativeNode(commonAncestor, endPath, level);
+ }
+
+ public int getPathLength() {
+ return beginPath.length + endPath.length;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/NodeWriter.java b/freeplane/src/main/java/org/freeplane/features/map/NodeWriter.java
new file mode 100644
index 0000000..cd6731e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/NodeWriter.java
@@ -0,0 +1,202 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.freeplane.core.io.IAttributeWriter;
+import org.freeplane.core.io.IElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.io.xml.TreeXmlWriter;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.link.LinkBuilder;
+import org.freeplane.features.map.MapWriter.Hint;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.map.MapWriter.WriterHint;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class NodeWriter implements IElementWriter, IAttributeWriter {
+ private boolean mayWriteChildren;
+ final private MapController mapController;
+ final private boolean shouldWriteChildren;
+ private final boolean writeFolded;
+ final private boolean writeInvisible;
+ private XMLElement xmlNode;
+ final private String nodeTag;
+
+ public static boolean shouldWriteSharedContent(ITreeWriter writer){
+ if (! Boolean.TRUE.equals(writer.getHint(WriterHint.ALREADY_WRITTEN)))
+ return true;
+ final Object mode = writer.getHint(Hint.MODE);
+ return Mode.EXPORT.equals(mode);
+ }
+
+ private final Map<SharedNodeData, NodeModel> alreadyWrittenSharedContent;
+ private final LinkBuilder linkBuilder;
+
+ public NodeWriter(final MapController mapController, LinkBuilder linkBuilder, final String nodeTag, final boolean writeChildren,
+ final boolean writeInvisible) {
+ this.linkBuilder = linkBuilder;
+ alreadyWrittenSharedContent = new HashMap<SharedNodeData, NodeModel>();
+ this.mapController = mapController;
+ this.shouldWriteChildren = writeChildren;
+ this.mayWriteChildren = true;
+ this.writeInvisible = writeInvisible;
+ this.nodeTag = nodeTag;
+ final String saveFolding = ResourceController.getResourceController().getProperty(
+ NodeBuilder.RESOURCES_SAVE_FOLDING);
+ writeFolded = saveFolding.equals(NodeBuilder.RESOURCES_ALWAYS_SAVE_FOLDING)
+ || saveFolding.equals(NodeBuilder.RESOURCES_SAVE_FOLDING_IF_MAP_IS_CHANGED);
+ }
+
+ private void saveChildren(final ITreeWriter writer, final NodeModel node) throws IOException {
+ for (final NodeModel child: mapController.childrenUnfolded(node)) {
+ if (writeInvisible || child.isVisible()) {
+ writer.setHint(WriterHint.ALREADY_WRITTEN, isAlreadyWritten(child));
+ writer.addElement(child, nodeTag);
+ }
+ else {
+ saveChildren(writer, child);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.io.IAttributeWriter#saveAttributes(freeplane.io.ITreeWriter,
+ * java.lang.Object, java.lang.String)
+ */
+ public void writeAttributes(final ITreeWriter writer, final Object content, final String tag) {
+ if (tag.equals(nodeTag)) {
+ final NodeModel node = (NodeModel) content;
+ writeAttributesGenerateContent(writer, node);
+ return;
+ }
+ }
+
+ private void writeAttributesGenerateContent(final ITreeWriter writer, final NodeModel node) {
+ /** fc, 12.6.2005: XML must not contain any zero characters. */
+ xmlNode = new XMLElement();
+ EncryptionModel encryptionModel = EncryptionModel.getModel(node);
+ mayWriteChildren = true;
+ final Object mode = mode(writer);
+ final boolean isNodeAlreadyWritten = isAlreadyWritten(node);
+ if (encryptionModel != null && !(encryptionModel.isAccessible() && Mode.EXPORT.equals(mode)) && ! isNodeAlreadyWritten) {
+ final String enctyptedContent = encryptionModel.calculateEncryptedContent(mapController);
+ if(enctyptedContent != null){
+ writer.addAttribute(NodeBuilder.XML_NODE_ENCRYPTED_CONTENT, enctyptedContent);
+ mayWriteChildren = false;
+ }
+ }
+ if (mayWriteChildren && (writeFolded || !mode(writer).equals(Mode.FILE))) {
+ if(mapController.isFolded(node) && ! isNodeAlreadyWritten){
+ writer.addAttribute("FOLDED", "true");
+ }
+ else if(node.isRoot() && ! Mode.STYLE.equals(mode)){
+ writer.addAttribute("FOLDED", "false");
+ }
+ }
+ final NodeModel parentNode = node.getParentNode();
+ if (parentNode != null && parentNode.isRoot()) {
+ writer.addAttribute("POSITION", node.isLeft() ? "left" : "right");
+ }
+ final boolean saveID = !mode.equals(Mode.STYLE);
+ if (saveID) {
+ final String id = node.createID();
+ writer.addAttribute("ID", id);
+ writeReferenceNodeId(writer, node);
+ }
+ if(! isNodeAlreadyWritten){
+ if (!mode.equals(Mode.STYLE)
+ && node.getHistoryInformation() != null
+ && ResourceController.getResourceController().getBooleanProperty(
+ NodeBuilder.RESOURCES_SAVE_MODIFICATION_TIMES)) {
+ writer.addAttribute(NodeBuilder.XML_NODE_HISTORY_CREATED_AT, TreeXmlWriter.dateToString(node
+ .getHistoryInformation().getCreatedAt()));
+ writer.addAttribute(NodeBuilder.XML_NODE_HISTORY_LAST_MODIFIED_AT, TreeXmlWriter.dateToString(node
+ .getHistoryInformation().getLastModifiedAt()));
+ }
+ }
+ if(! isNodeAlreadyWritten || Mode.EXPORT.equals(mode)) {
+ linkBuilder.writeAttributes(writer, node);
+ writer.addExtensionAttributes(node, node.getSharedExtensions().values());
+ }
+ writer.addExtensionAttributes(node, node.getIndividualExtensionValues());
+ }
+
+ private void writeReferenceNodeId(ITreeWriter writer, NodeModel node) {
+ final NodeModel referenceNode = alreadyWrittenSharedContent.get(node.getSharedData());
+ if(referenceNode != null){
+ if(referenceNode.isSubtreeCloneOf(node))
+ writer.addAttribute("TREE_ID", referenceNode.createID());
+ else
+ writer.addAttribute("CONTENT_ID", referenceNode.createID());
+ }
+
+ }
+
+ private boolean isAlreadyWritten(final NodeModel node) {
+ return alreadyWrittenSharedContent.containsKey(node.getSharedData());
+ }
+
+ private void registerWrittenNode(final NodeModel node) {
+ alreadyWrittenSharedContent.put(node.getSharedData(), node);
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object content, final String tag) throws IOException {
+ final NodeModel node = (NodeModel) content;
+ writer.addExtensionNodes(node, node.getIndividualExtensionValues());
+ final boolean isNodeContentWrittenFirstTime = ! isAlreadyWritten(node);
+ if(isNodeContentWrittenFirstTime)
+ registerWrittenNode(node);
+ linkBuilder.writeContent(writer, node);
+ if(isNodeContentWrittenFirstTime || Mode.EXPORT.equals(mode(writer))){
+ writer.addExtensionNodes(node, node.getSharedExtensions().values());
+ for (int i = 0; i < xmlNode.getChildrenCount(); i++) {
+ writer.addElement(null, xmlNode.getChildAtIndex(i));
+ }
+ }
+ if (mayWriteChildren && shouldWriteChildren && mapController.childrenUnfolded(node).size()>0) {
+ saveChildren(writer, node);
+ }
+ }
+
+ private Object mode(final ITreeWriter writer) {
+ return writer.getHint(Hint.MODE);
+ }
+
+ String getNodeTag() {
+ return nodeTag;
+ }
+
+ void registerBy(WriteManager writeManager) {
+ writeManager.addElementWriter(getNodeTag(), this);
+ writeManager.addAttributeWriter(getNodeTag(), this);
+ }
+
+ void unregisterFrom(WriteManager writeManager) {
+ writeManager.removeElementWriter(getNodeTag(), this);
+ writeManager.removeAttributeWriter(getNodeTag(), this);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/NumberComboBoxEditor.java b/freeplane/src/main/java/org/freeplane/features/map/NumberComboBoxEditor.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/NumberComboBoxEditor.java
rename to freeplane/src/main/java/org/freeplane/features/map/NumberComboBoxEditor.java
diff --git a/freeplane/src/org/freeplane/features/map/PeriodicLevelCondition.java b/freeplane/src/main/java/org/freeplane/features/map/PeriodicLevelCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/PeriodicLevelCondition.java
rename to freeplane/src/main/java/org/freeplane/features/map/PeriodicLevelCondition.java
diff --git a/freeplane/src/org/freeplane/features/map/RootCondition.java b/freeplane/src/main/java/org/freeplane/features/map/RootCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/RootCondition.java
rename to freeplane/src/main/java/org/freeplane/features/map/RootCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/SharedNodeData.java b/freeplane/src/main/java/org/freeplane/features/map/SharedNodeData.java
new file mode 100644
index 0000000..498369f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/SharedNodeData.java
@@ -0,0 +1,104 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import org.freeplane.core.extension.ExtensionContainer;
+import org.freeplane.core.extension.SmallExtensionMap;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.XmlUtils;
+
+/**
+ * @author Dimitry Polivaev 05.02.2014
+ */
+public class SharedNodeData {
+ final private ExtensionContainer extensionContainer;
+ private HistoryInformationModel historyInformation;
+ final private NodeIconSetModel icons;
+ private Object userObject;
+ private String xmlText;
+ private boolean folded;
+
+ public SharedNodeData() {
+ extensionContainer = new ExtensionContainer(new SmallExtensionMap());
+ icons = new NodeIconSetModel();
+ folded = false;
+ }
+
+ public ExtensionContainer getExtensionContainer() {
+ return extensionContainer;
+ }
+
+ public HistoryInformationModel getHistoryInformation() {
+ return historyInformation;
+ }
+
+ public void setHistoryInformation(HistoryInformationModel historyInformation) {
+ this.historyInformation = historyInformation;
+ }
+
+ public NodeIconSetModel getIcons() {
+ return icons;
+ }
+
+ public Object getUserObject() {
+ return userObject;
+ }
+
+ public void setUserObject(Object data) {
+ if (data instanceof String) {
+ setText(data.toString());
+ }
+ else{
+ xmlText = null;
+ this.userObject = data;
+ }
+ }
+
+ public String getXmlText() {
+ return xmlText;
+ }
+
+ public void setXmlText(String xmlText) {
+ xmlText = XmlUtils.makeValidXml(xmlText);
+ userObject = HtmlUtils.toHtml(xmlText);
+ }
+
+ public void setText(String text) {
+ try {
+ userObject = XmlUtils.makeValidXml(text);
+ xmlText = HtmlUtils.toXhtml(text);
+ if (xmlText != null && !xmlText.startsWith("<")) {
+ userObject = " " + text;
+ xmlText = null;
+ }
+ } catch (Exception e) {
+ userObject = " " + text;
+ xmlText = null;
+ }
+ }
+
+ public void setFolded(boolean folded) {
+ this.folded = folded;
+ }
+
+ public boolean isFolded() {
+ return folded;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/ShowNextChildAction.java b/freeplane/src/main/java/org/freeplane/features/map/ShowNextChildAction.java
new file mode 100644
index 0000000..33bd2b4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/ShowNextChildAction.java
@@ -0,0 +1,60 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * 22.04.2012
+ */
+ at SuppressWarnings("serial")
+ at EnabledAction(checkOnNodeChange = true)
+public class ShowNextChildAction extends AFreeplaneAction {
+ public ShowNextChildAction() {
+ super("ShowNextChildAction");
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel selected = controller.getSelection().getSelected();
+ final MapController mapController = controller.getModeController().getMapController();
+ mapController.showNextChild(selected);
+ }
+
+ @Override
+ public void setEnabled() {
+ final Controller controller = Controller.getCurrentController();
+ if(controller.getSelection() != null) {
+ final NodeModel selected = controller.getSelection().getSelected();
+ final MapController mapController = controller.getModeController().getMapController();
+ super.setEnabled(controller.getMapViewManager().isFoldedOnCurrentView(selected) || mapController.hasHiddenChildren(selected));
+ }
+ else {
+ super.setEnabled(false);
+ }
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/SingleNodeList.java b/freeplane/src/main/java/org/freeplane/features/map/SingleNodeList.java
new file mode 100644
index 0000000..ca4eca8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/SingleNodeList.java
@@ -0,0 +1,83 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.freeplane.features.map.NodeModel.CloneType;
+
+/**
+ * @author Dimitry Polivaev
+ * 09.02.2014
+ */
+public class SingleNodeList implements Clones{
+ private final NodeModel nodeModel;
+ private final CloneType cloneType;
+
+ SingleNodeList(NodeModel nodeModel, CloneType cloneType) {
+ this.nodeModel = nodeModel;
+ this.cloneType = cloneType;
+ }
+
+ public Clones add(NodeModel nodeModel) {
+ final MultipleNodeList multipleNodeList = new MultipleNodeList(cloneType);
+ multipleNodeList.add(this.nodeModel);
+ multipleNodeList.add(nodeModel);
+ return multipleNodeList;
+ }
+
+ public Clones remove(NodeModel nodeModel) {
+ return null;
+ }
+
+ public int size() {
+ return 1;
+ }
+
+ public Iterator<NodeModel> iterator() {
+ return Arrays.asList(nodeModel).iterator();
+ }
+
+ public void attach() {
+ throw new IllegalStateException();
+ }
+
+ public void detach(NodeModel nodeModel) {
+ nodeModel.setClones(new DetachedNodeList(nodeModel, cloneType));
+ }
+
+ public Collection<NodeModel> toCollection() {
+ return Arrays.asList(nodeModel);
+ }
+
+ public boolean contains(NodeModel node) {
+ return nodeModel.equals(node);
+ }
+
+ public NodeModel head() {
+ return nodeModel;
+ }
+
+ public CloneType getCloneType() {
+ return cloneType;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/SummaryLevels.java b/freeplane/src/main/java/org/freeplane/features/map/SummaryLevels.java
new file mode 100644
index 0000000..13e97bd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/SummaryLevels.java
@@ -0,0 +1,132 @@
+package org.freeplane.features.map;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+
+public class SummaryLevels{
+ public static final int NODE_NOT_FOUND = -1;
+ private static final boolean[] BOTH_SIDES = {true, false};
+ private static final boolean[] LEFT_SIDE = {true};
+ private static final boolean[] RIGHT_SIDE = {false};
+ public final int[] summaryLevels;
+ public final int highestSummaryLevel;
+ public final boolean[] sides;
+ private final NodeModel parentNode;
+ public SummaryLevels(NodeModel parentNode) {
+ this.parentNode = parentNode;
+ int highestSummaryLevel = 0;
+ int childCount = parentNode.getChildCount();
+ this.summaryLevels = new int[childCount];
+ this.sides = sidesOf(parentNode);
+ for(boolean isLeft : sides){
+
+ int level = 1;
+ boolean useSummaryAsItem = true;
+ for (int i = 0; i < childCount; i++) {
+ final NodeModel child = parentNode.getChildAt(i);
+ if (child.isLeft() == isLeft) {
+ final boolean isItem = !SummaryNode.isSummaryNode(child) || useSummaryAsItem;
+ if (isItem) {
+ if (level > 0)
+ useSummaryAsItem = true;
+ level = 0;
+ if (child.hasVisibleContent()) {
+ useSummaryAsItem = false;
+ }
+ } else {
+ level++;
+ highestSummaryLevel = Math.max(highestSummaryLevel, level);
+ }
+ summaryLevels[i] = level;
+ }
+ }
+ }
+ this.highestSummaryLevel = highestSummaryLevel;
+ }
+ static private boolean[] sidesOf(NodeModel parentNode) {
+ return parentNode.isRoot() ? BOTH_SIDES : parentNode.isLeft() ? LEFT_SIDE : RIGHT_SIDE;
+ }
+
+ public Collection<NodeModel> summarizedNodes(NodeModel summaryNode){
+ if(summaryNode.getParentNode() != parentNode)
+ return Collections.emptyList();
+ final int summaryNodeIndex = parentNode.getIndex(summaryNode);
+ final int summaryLevel = summaryLevels[summaryNodeIndex];
+ if(summaryLevel == 0)
+ return Collections.emptyList();
+ else {
+ final ArrayList<NodeModel> arrayList = new ArrayList<NodeModel>();
+ for(int i = summaryNodeIndex - 1; i >= 0; i--){
+ final int level = summaryLevels[i];
+ if(level >= summaryLevel) {
+ if(sides != BOTH_SIDES || parentNode.getChildAt(i).isLeft() == summaryNode.isLeft())
+ return arrayList;
+ } else if (level == summaryLevel - 1) {
+ final NodeModel child = parentNode.getChildAt(i);
+ if (sides != BOTH_SIDES || child.isLeft() == summaryNode.isLeft()) {
+ if(SummaryNode.isFirstGroupNode(child)) {
+ if(level > 0)
+ arrayList.add(child);
+ return arrayList;
+ }
+ arrayList.add(child);
+ }
+ }
+ }
+ return arrayList;
+ }
+ }
+ public NodeModel findSummaryNode(int index) {
+ final int summaryNodeIndex = findSummaryNodeIndex(index);
+ return parentNode.getChildAt(summaryNodeIndex);
+ }
+
+ public int findSummaryNodeIndex(int index) {
+ final int nodeLevel = summaryLevels[index];
+ final boolean leftSide = parentNode.getChildAt(index).isLeft();
+ for (int i = index + 1; i < parentNode.getChildCount(); i++){
+ final int level = summaryLevels[i];
+ if(level == nodeLevel && SummaryNode.isFirstGroupNode(parentNode.getChildAt(i)))
+ return NODE_NOT_FOUND;
+ if(level > nodeLevel) {
+ final NodeModel summaryNode = parentNode.getChildAt(i);
+ if(summaryNode.isLeft() == leftSide)
+ return i;
+ }
+ }
+ return NODE_NOT_FOUND;
+ }
+
+ public NodeModel findGroupBeginNode(int index) {
+ final int groupBeginNodeIndex = findGroupBeginNodeIndex(index);
+ return parentNode.getChildAt(groupBeginNodeIndex);
+ }
+
+ public int findGroupBeginNodeIndex(int index) {
+ if(index < 0)
+ return NODE_NOT_FOUND;
+ int nodeLevel = summaryLevels[index];
+ final boolean leftSide = parentNode.getChildAt(index).isLeft();
+ for (int i = index; i >= 0; i--){
+ final int level = summaryLevels[i];
+ final NodeModel groupBeginNode = parentNode.getChildAt(i);
+ if(groupBeginNode.isLeft() == leftSide) {
+ if(level > nodeLevel) {
+ return parentNode.nextNodeIndex(i, leftSide);
+ }
+ if(level == nodeLevel) {
+ if(SummaryNode.isFirstGroupNode(groupBeginNode))
+ return i;
+ }
+ }
+ }
+ for (int i = 0; i <= index; i++){
+ final NodeModel groupBeginNode = parentNode.getChildAt(i);
+ if(groupBeginNode.isLeft() == leftSide && summaryLevels[i] == nodeLevel)
+ return i;
+ }
+ return index;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/SummaryNode.java b/freeplane/src/main/java/org/freeplane/features/map/SummaryNode.java
new file mode 100644
index 0000000..8886dd4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/SummaryNode.java
@@ -0,0 +1,109 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Apr 9, 2011
+ */
+ at NodeHookDescriptor(hookName = "SummaryNode", onceForMap = false)
+public class SummaryNode extends PersistentNodeHook implements IExtension{
+
+ private ModeController modeController;
+
+ public static void install(){
+ new SummaryNode();
+ new FirstGroupNode();
+ };
+
+ static public boolean isFirstGroupNode(final NodeModel nodeModel) {
+ return nodeModel.containsExtension(FirstGroupNodeFlag.class);
+ }
+
+
+
+ public SummaryNode() {
+ super();
+ modeController = Controller.getCurrentModeController();
+ }
+
+ @Override
+ protected IExtension createExtension(NodeModel node, XMLElement element) {
+ return SummaryNodeFlag.SUMMARY;
+ }
+
+ @Override
+ protected Class<? extends IExtension> getExtensionClass() {
+ return SummaryNodeFlag.class;
+ }
+
+ @Override
+ protected HookAction createHookAction() {
+ return null;
+ }
+
+ static public boolean isSummaryNode(final NodeModel nodeModel) {
+ return nodeModel.containsExtension(SummaryNodeFlag.class);
+ }
+
+ static public NodeModel getRealNode(final NodeModel nodeModel) {
+ if (!isSummaryNode(nodeModel))
+ return nodeModel;
+ for(int i = nodeModel.getChildCount() - 1; i >= 0; i--){
+ final NodeModel child = nodeModel.getChildAt(i);
+ if(! isHidden(child)) {
+ return child;
+ }
+ }
+ return nodeModel;
+ }
+
+ static public boolean isHidden(final NodeModel nodeModel) {
+ return ! nodeModel.isFolded() && (nodeModel.hasChildren() && isSummaryNode(nodeModel) || isFirstGroupNode(nodeModel))&& nodeModel.getText().isEmpty();
+ }
+
+ public static int getSummaryLevel(NodeModel node) {
+ if(node.isRoot() || ! isSummaryNode(node))
+ return 0;
+ final NodeModel parentNode = node.getParentNode();
+ final int index = parentNode.getIndex(node);
+ final boolean isleft = node.isLeft();
+ int level = 1;
+ for(int i = index - 1; i > 0; i--){
+ final NodeModel child = (NodeModel) parentNode.getChildAt(i);
+ if(isleft == child.isLeft()){
+ if( isSummaryNode(child))
+ level++;
+ else
+ return level;
+ }
+ }
+ return level;
+ }
+}
+
diff --git a/freeplane/src/main/java/org/freeplane/features/map/SummaryNodeFlag.java b/freeplane/src/main/java/org/freeplane/features/map/SummaryNodeFlag.java
new file mode 100644
index 0000000..160d13e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/SummaryNodeFlag.java
@@ -0,0 +1,8 @@
+package org.freeplane.features.map;
+
+import org.freeplane.core.extension.IExtension;
+
+public class SummaryNodeFlag implements IExtension {
+ public static SummaryNodeFlag SUMMARY = new SummaryNodeFlag();
+ private SummaryNodeFlag(){};
+}
diff --git a/freeplane/src/org/freeplane/features/map/ToggleChildrenFoldedAction.java b/freeplane/src/main/java/org/freeplane/features/map/ToggleChildrenFoldedAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/ToggleChildrenFoldedAction.java
rename to freeplane/src/main/java/org/freeplane/features/map/ToggleChildrenFoldedAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/ToggleFoldedAction.java b/freeplane/src/main/java/org/freeplane/features/map/ToggleFoldedAction.java
new file mode 100644
index 0000000..ec058ac
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/ToggleFoldedAction.java
@@ -0,0 +1,52 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author foltin
+ */
+class ToggleFoldedAction extends AFreeplaneAction {
+ static final String NAME = "toggleFolded";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ToggleFoldedAction() {
+ super("ToggleFoldedAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ MapController r = Controller.getCurrentModeController().getMapController();
+ final Collection<NodeModel> selectedNodes = r.getSelectedNodes();
+ if(selectedNodes.size() > 1)
+ r.toggleFolded(selectedNodes);
+ else {
+ final NodeModel selectedNode = r.getSelectedNode();
+ r.setFoldedAndScroll(selectedNode, ! selectedNode.isFolded());
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/filemode/CenterAction.java b/freeplane/src/main/java/org/freeplane/features/map/filemode/CenterAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/filemode/CenterAction.java
rename to freeplane/src/main/java/org/freeplane/features/map/filemode/CenterAction.java
diff --git a/freeplane/src/org/freeplane/features/map/filemode/FMapController.java b/freeplane/src/main/java/org/freeplane/features/map/filemode/FMapController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/filemode/FMapController.java
rename to freeplane/src/main/java/org/freeplane/features/map/filemode/FMapController.java
diff --git a/freeplane/src/org/freeplane/features/map/filemode/FMapModel.java b/freeplane/src/main/java/org/freeplane/features/map/filemode/FMapModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/filemode/FMapModel.java
rename to freeplane/src/main/java/org/freeplane/features/map/filemode/FMapModel.java
diff --git a/freeplane/src/org/freeplane/features/map/filemode/FNodeModel.java b/freeplane/src/main/java/org/freeplane/features/map/filemode/FNodeModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/filemode/FNodeModel.java
rename to freeplane/src/main/java/org/freeplane/features/map/filemode/FNodeModel.java
diff --git a/freeplane/src/org/freeplane/features/map/filemode/OpenPathAction.java b/freeplane/src/main/java/org/freeplane/features/map/filemode/OpenPathAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/filemode/OpenPathAction.java
rename to freeplane/src/main/java/org/freeplane/features/map/filemode/OpenPathAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/ChangeNodeLevelController.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/ChangeNodeLevelController.java
new file mode 100644
index 0000000..f2468ce
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/ChangeNodeLevelController.java
@@ -0,0 +1,187 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import java.util.List;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.ui.IMapViewManager;
+
+/**
+ * @author foltin
+ */
+public class ChangeNodeLevelController {
+ private class ChangeNodeLevelLeftsAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ChangeNodeLevelLeftsAction() {
+ super("ChangeNodeLevelLeftsAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ final Component mapViewComponent = mapViewManager.getMapViewComponent();
+ if (mapViewManager.isLeftTreeSupported(mapViewComponent) && selectedNode.isLeft()) {
+ moveDownwards(selectedNode);
+ }
+ else {
+ moveUpwards(selectedNode);
+ }
+ }
+ }
+
+ private class ChangeNodeLevelRightsAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ChangeNodeLevelRightsAction() {
+ super("ChangeNodeLevelRightsAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ final Component mapViewComponent = mapViewManager.getMapViewComponent();
+ if (mapViewManager.isLeftTreeSupported(mapViewComponent) && selectedNode.isLeft()) {
+ moveUpwards(selectedNode);
+ }
+ else {
+ moveDownwards(selectedNode);
+ }
+ }
+ };
+
+// // final private Controller controller;;
+
+ public ChangeNodeLevelController(MModeController modeController) {
+// this.controller = controller;
+ modeController.addAction(new ChangeNodeLevelLeftsAction());
+ modeController.addAction(new ChangeNodeLevelRightsAction());
+ }
+
+ private boolean checkSelection() {
+ final ModeController currentModeController = Controller.getCurrentModeController();
+ final MapController mapController = currentModeController.getMapController();
+ final NodeModel selectedNode = mapController.getSelectedNode();
+ final NodeModel selectedParent = selectedNode.getParentNode();
+ if (selectedParent == null) {
+ UITools.errorMessage(TextUtils.getText("cannot_add_parent_to_root"));
+ return false;
+ }
+ final Collection<NodeModel> selectedNodes = mapController.getSelectedNodes();
+ for (final NodeModel node : selectedNodes) {
+ if (node.getParentNode() != selectedParent) {
+ UITools.errorMessage(TextUtils.getText("cannot_add_parent_diff_parents"));
+ return false;
+ }
+ }
+ return true;
+ }
+
+ private void moveDownwards( final NodeModel selectedNode) {
+ if (!checkSelection()) {
+ return;
+ }
+ final NodeModel selectedParent = selectedNode.getParentNode();
+ final List<NodeModel> selectedNodes = Controller.getCurrentController().getSelection().getSortedSelection(true);
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ final int ownPosition = selectedParent.getIndex(selectedNode);
+ NodeModel directSibling = null;
+ for (int i = ownPosition - 1; i >= 0; --i) {
+ final NodeModel targetCandidate = (NodeModel) selectedParent.getChildAt(i);
+ if (canMoveTo(selectedNode, selectedNodes, targetCandidate)) {
+ directSibling = targetCandidate;
+ break;
+ }
+ }
+ if (directSibling == null) {
+ for (int i = ownPosition + 1; i < selectedParent.getChildCount(); ++i) {
+ final NodeModel targetCandidate = (NodeModel) selectedParent.getChildAt(i);
+ if (canMoveTo(selectedNode, selectedNodes, targetCandidate)) {
+ directSibling = targetCandidate;
+ break;
+ }
+ }
+ }
+ if (directSibling != null) {
+ for (final NodeModel node : selectedNodes) {
+ ((FreeNode)Controller.getCurrentModeController().getExtension(FreeNode.class)).undoableDeactivateHook(node);
+ }
+ mapController.moveNodes(selectedNodes, directSibling, directSibling.getChildCount());
+ Controller.getCurrentModeController().getMapController().selectMultipleNodes(selectedNode, selectedNodes);
+ }
+ }
+
+ private boolean canMoveTo(final NodeModel selectedNode, final List<NodeModel> selectedNodes,
+ final NodeModel targetCandidate) {
+ return !selectedNodes.contains(targetCandidate) && selectedNode.isLeft() == targetCandidate.isLeft()
+ && (targetCandidate.hasChildren() || ! targetCandidate.isHiddenSummary());
+ }
+
+ private void moveUpwards( final NodeModel selectedNode) {
+ if (!checkSelection()) {
+ return;
+ }
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ NodeModel selectedParent = selectedNode.getParentNode();
+ final List<NodeModel> selectedNodes = Controller.getCurrentController().getSelection().getSortedSelection(true);
+ int position;
+ final boolean changeSide;
+ boolean leftSide = selectedNode.isLeft();
+ if (selectedParent.isRoot()) {
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ final Component mapViewComponent = mapViewManager.getMapViewComponent();
+ if (!mapViewManager.isLeftTreeSupported(mapViewComponent)) {
+ return;
+ }
+ changeSide = true;
+ leftSide = ! leftSide;
+ position = selectedParent.getChildCount();
+ }
+ else {
+ final NodeModel grandParent = selectedParent.getParentNode();
+ final NodeModel childNode = selectedParent;
+ position = grandParent.getIndex(childNode) + 1;
+ selectedParent = grandParent;
+ changeSide = false;
+ }
+ for (final NodeModel node : selectedNodes)
+ ((FreeNode)Controller.getCurrentModeController().getExtension(FreeNode.class)).undoableDeactivateHook(node);
+ mapController.moveNodes(selectedNodes, selectedParent, position, leftSide, changeSide);
+ mapController.selectMultipleNodes(selectedNode, selectedNodes);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/ConvertCloneToIndependentNodeAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/ConvertCloneToIndependentNodeAction.java
new file mode 100644
index 0000000..0b0fef4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/ConvertCloneToIndependentNodeAction.java
@@ -0,0 +1,38 @@
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at SuppressWarnings("serial")
+ at EnabledAction(checkOnNodeChange = true)
+public class ConvertCloneToIndependentNodeAction extends AFreeplaneAction {
+
+ public ConvertCloneToIndependentNodeAction() {
+ super("ConvertCloneToIndependentNodeAction");
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ final List<NodeModel> selectedNodes = Controller.getCurrentController().getSelection().getSortedSelection(false);
+ for(final NodeModel node :selectedNodes)
+ mapController.convertClonesToIndependentNodes(node);
+ }
+
+ @Override
+ public void setEnabled() {
+ final List<NodeModel> selectedNodes = Controller.getCurrentController().getSelection().getSortedSelection(false);
+ for(NodeModel node :selectedNodes)
+ if(! node.isCloneTreeRoot()){
+ setEnabled(false);
+ return;
+ }
+ setEnabled(true);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/DeleteAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/DeleteAction.java
new file mode 100644
index 0000000..a17df6c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/DeleteAction.java
@@ -0,0 +1,60 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+
+class DeleteAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public DeleteAction() {
+ super("DeleteAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ for (final NodeModel node : modeController.getMapController().getSelectedNodes()) {
+ if (node.isRoot()) {
+ return;
+ }
+ }
+ final Controller controller = Controller.getCurrentController();
+ final int showResult = OptionalDontShowMeAgainDialog.show("really_remove_node", "confirmation",
+ MModeController.RESOURCES_DELETE_NODES_WITHOUT_QUESTION,
+ OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED);
+ if (showResult != JOptionPane.OK_OPTION) {
+ return;
+ }
+ final MMapController mapController = (MMapController) modeController.getMapController();
+ mapController.deleteNodes(controller.getSelection().getSortedSelection(true));
+ controller.getMapViewManager().obtainFocusForSelected();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/DocuMapAttribute.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/DocuMapAttribute.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/mindmapmode/DocuMapAttribute.java
rename to freeplane/src/main/java/org/freeplane/features/map/mindmapmode/DocuMapAttribute.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/MMapController.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/MMapController.java
new file mode 100644
index 0000000..e8d88e1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/MMapController.java
@@ -0,0 +1,1073 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map.mindmapmode;
+
+import static org.freeplane.features.map.FirstGroupNodeFlag.FIRST_GROUP;
+import static org.freeplane.features.map.SummaryNodeFlag.SUMMARY;
+
+import java.awt.Component;
+import java.awt.Frame;
+import java.awt.Point;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.swing.Action;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.ConfigurationUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.icon.mindmapmode.MIconController.Keys;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.AlwaysUnfoldedNode;
+import org.freeplane.features.map.Clones;
+import org.freeplane.features.map.EncryptionModel;
+import org.freeplane.features.map.FirstGroupNode;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.map.NodeRelativePath;
+import org.freeplane.features.map.SummaryLevels;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
+import org.freeplane.features.styles.LogicalStyleKeys;
+import org.freeplane.features.styles.LogicalStyleModel;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.features.url.NodeAndMapReference;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+import org.freeplane.features.url.mindmapmode.MFileManager.AlternativeFileMode;
+import org.freeplane.main.addons.AddOnsController;
+import org.freeplane.n3.nanoxml.XMLException;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MMapController extends MapController {
+ public static final int NEW_CHILD = 2;
+ public static final int NEW_SIBLING_BEFORE = 4;
+ public static final int NEW_SIBLING_BEHIND = 3;
+ public static final String RESOURCES_CONVERT_TO_CURRENT_VERSION = "convert_to_current_version";
+
+ public MMapController(ModeController modeController) {
+ super(modeController);
+ createActions(modeController);
+ addNodeSelectionListener(new INodeSelectionListener() {
+ public void onSelect(final NodeModel node) {
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ if (ResourceController.getResourceController().getBooleanProperty("display_node_id")) {
+ viewController.addStatusInfo("display_node_id", "ID=" + node.createID(), null);
+ }
+ }
+
+ public void onDeselect(final NodeModel node) {
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ viewController.addStatusInfo("display_node_id", null, null);
+ }
+ });
+ addMapChangeListener(new IMapChangeListener() {
+
+ @Override
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ @Override
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ @Override
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ if(! nodeMoveEvent.oldParent.equals(nodeMoveEvent.newParent))
+ onNodeDeleted(nodeMoveEvent.oldParent);
+ }
+
+ @Override
+ public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
+ }
+
+ @Override
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ final NodeModel parent = nodeDeletionEvent.parent;
+ onNodeDeleted(parent);
+ }
+
+ private void onNodeDeleted(final NodeModel node) {
+ if (!getModeController().isUndoAction() && ! node.isFolded() && ! node.hasChildren() && SummaryNode.isSummaryNode(node)&& node.getText().isEmpty()){
+ deleteSingleSummaryNode(node);
+ }
+ }
+
+ @Override
+ public void mapChanged(MapChangeEvent event) {
+ }
+ });
+
+ }
+
+ public NodeModel addNewNode(int newNodeMode) {
+ stopEditing();
+ final NodeModel targetNode = getSelectedNode();
+ final NodeModel newNode;
+ switch (newNodeMode) {
+ case MMapController.NEW_SIBLING_BEFORE:
+ case MMapController.NEW_SIBLING_BEHIND: {
+ if (!targetNode.isRoot()) {
+ final NodeModel parent = targetNode.getParentNode();
+ int childPosition = parent.getIndex(targetNode);
+ if (newNodeMode == MMapController.NEW_SIBLING_BEHIND) {
+ childPosition++;
+ }
+ newNode = addNewNode(parent, childPosition, targetNode.isLeft());
+ if (newNode == null) {
+ return null;
+ }
+ if(ResourceController.getResourceController().getBooleanProperty("copyFormatToNewSibling")) {
+ getMModeController().undoableCopyExtensions(LogicalStyleKeys.NODE_STYLE, targetNode, newNode);
+ getMModeController().undoableCopyExtensions(LogicalStyleKeys.LOGICAL_STYLE, targetNode, newNode);
+ if(ResourceController.getResourceController().getBooleanProperty("copyFormatToNewSiblingIncludesIcons")) {
+ getMModeController().undoableCopyExtensions(Keys.ICONS, targetNode, newNode);
+ }
+ }
+ startEditingAfterSelect(newNode);
+ select(newNode);
+ break;
+ }
+ else {
+ newNodeMode = MMapController.NEW_CHILD;
+ }
+ }
+ //$FALL-THROUGH$
+ case MMapController.NEW_CHILD: {
+ final boolean parentFolded = isFolded(targetNode);
+ if (parentFolded) {
+ setFolded(targetNode, false);
+ }
+ final int position = ResourceController.getResourceController().getProperty("placenewbranches").equals(
+ "last") ? targetNode.getChildCount() : 0;
+ newNode = addNewNode(targetNode, position, targetNode.isNewChildLeft());
+ if (newNode == null) {
+ return null;
+ }
+ startEditingAfterSelect(newNode);
+ select(newNode);
+ break;
+ }
+ default:
+ newNode = null;
+ }
+ return newNode;
+ }
+
+ private void startEditingAfterSelect(final NodeModel newNode) {
+ final Component component = Controller.getCurrentController().getMapViewManager().getComponent(newNode);
+ if(component == null)
+ return;
+ component.addFocusListener(new FocusListener() {
+ public void focusLost(FocusEvent e) {
+ }
+
+ public void focusGained(FocusEvent e) {
+ e.getComponent().removeFocusListener(this);
+ final TextController textController = TextController.getController();
+ ((MTextController) textController).edit(newNode, newNode.getParentNode(), true, false, false);
+ }
+ });
+ }
+
+ private void stopEditing() {
+ final TextController textController = TextController.getController();
+ if (textController instanceof MTextController) {
+ ((MTextController) textController).stopEditing();
+ }
+ }
+
+ public void addNewSummaryNodeStartEditing(final NodeModel parentNode, final int start, final int end,
+ final int summaryLevel, final boolean isLeft) {
+ ModeController modeController = getMModeController();
+ stopEditing();
+ final NodeModel newSummaryNode = addNewNode(parentNode, end+1, isLeft);
+ final SummaryNode summary = modeController.getExtension(SummaryNode.class);
+ summary.undoableActivateHook(newSummaryNode, SUMMARY);
+ AlwaysUnfoldedNode unfolded = modeController.getExtension(AlwaysUnfoldedNode.class);
+ unfolded.undoableActivateHook(newSummaryNode, unfolded);
+ final FirstGroupNode firstGroupNodeHook = modeController.getExtension(FirstGroupNode.class);
+ final NodeModel firstNodeInGroup = parentNode.getChildAt(start);
+ if(SummaryNode.isSummaryNode(firstNodeInGroup))
+ firstGroupNodeHook.undoableActivateHook(firstNodeInGroup, FIRST_GROUP);
+ else {
+ final NodeModel previousNode = firstNodeInGroup.previousNode(start, isLeft);
+ if(previousNode == null || SummaryNode.isSummaryNode(previousNode) || !SummaryNode.isFirstGroupNode(previousNode)) {
+ NodeModel newFirstGroup = addNewNode(parentNode, start, isLeft);
+ firstGroupNodeHook.undoableActivateHook(newFirstGroup, FIRST_GROUP);
+ }
+ firstGroupNodeHook.undoableDeactivateHook(firstNodeInGroup);
+ }
+ int level = summaryLevel;
+ for(int i = start+1; i <= end; i++){
+ NodeModel node = parentNode.getChildAt(i);
+ if(isLeft != node.isLeft())
+ continue;
+ if(SummaryNode.isSummaryNode(node))
+ level++;
+ else
+ level = 0;
+ if(level == summaryLevel && SummaryNode.isFirstGroupNode(node)){
+ if(level > 0)
+ firstGroupNodeHook.undoableDeactivateHook(node);
+ else
+ deleteSingleNodeWithClones(node);
+ }
+ }
+ final NodeModel firstSummaryChildNode = addNewNode(newSummaryNode, 0, isLeft);
+ startEditingAfterSelect(firstSummaryChildNode);
+ select(firstSummaryChildNode);
+ }
+
+ public NodeModel addNewNode(final NodeModel parent, final int index, final boolean newNodeIsLeft) {
+ if (!isWriteable(parent)) {
+ UITools.errorMessage(TextUtils.getText("node_is_write_protected"));
+ return null;
+ }
+ final NodeModel newNode = newNode("", parent.getMap());
+ if(addNewNode(newNode, parent, index, newNodeIsLeft))
+ return newNode;
+ else
+ return null;
+ }
+
+ public boolean addNewNode(final NodeModel newNode, final NodeModel parent, final int index, final boolean newNodeIsLeft) {
+ if (!isWriteable(parent)) {
+ UITools.errorMessage(TextUtils.getText("node_is_write_protected"));
+ return false;
+ }
+ insertNewNode(newNode, parent, index, newNodeIsLeft);
+ return true;
+ }
+
+ private void insertNewNode(final NodeModel newNode, final NodeModel parent, final int index,
+ final boolean newNodeIsLeft) {
+ if(index < 0 || index > parent.getChildCount()){
+ insertNewNode(newNode, parent, parent.getChildCount(), newNodeIsLeft);
+ return;
+ }
+ if(newNode.subtreeContainsCloneOf(parent)){
+ UITools.errorMessage("not allowed");
+ return;
+ }
+ stopEditing();
+ insertSingleNewNode(newNode, parent, index, newNodeIsLeft);
+ for(NodeModel parentClone : parent.subtreeClones()){
+ if(parentClone != parent) {
+ final NodeModel childClone = newNode.cloneTree();
+ insertSingleNewNode(childClone, parentClone, index, parentClone.isLeft());
+ }
+ }
+ }
+
+ private void insertSingleNewNode(final NodeModel newNode, final NodeModel parent, final int index,
+ final boolean newNodeIsLeft) {
+ final MapModel map = parent.getMap();
+ newNode.setLeft(newNodeIsLeft);
+ final IActor actor = new IActor() {
+ public void act() {
+ insertNodeIntoWithoutUndo(newNode, parent, index);
+ }
+
+ public String getDescription() {
+ return "addNewNode";
+ }
+
+ public void undo() {
+ deleteWithoutUndo(parent, index);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+ /**
+ * Return false if user has canceled.
+ */
+ @Override
+ public boolean close(final MapModel map, final boolean force) {
+ if (!force && !map.isSaved()) {
+ final List<Component> views = Controller.getCurrentController().getMapViewManager().getViews(map);
+ if (views.size() == 1) {
+ final String text = TextUtils.getText("save_unsaved") + "\n" + map.getTitle();
+ final String title = TextUtils.getText("SaveAction.text");
+ Component dialogParent;
+ final Frame viewFrame = JOptionPane.getFrameForComponent(views.get(0));
+ if(viewFrame != null && viewFrame.isShowing() && viewFrame.getExtendedState() != Frame.ICONIFIED)
+ dialogParent = viewFrame;
+ else
+ dialogParent = UITools.getCurrentRootComponent();
+ final int returnVal = JOptionPane.showOptionDialog(dialogParent, text, title,
+ JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
+ if (returnVal == JOptionPane.YES_OPTION) {
+ final boolean savingNotCancelled = ((MFileManager) UrlManager.getController())
+ .save(map);
+ if (!savingNotCancelled) {
+ return false;
+ }
+ }
+ else if ((returnVal == JOptionPane.CANCEL_OPTION) || (returnVal == JOptionPane.CLOSED_OPTION)) {
+ return false;
+ }
+ }
+ }
+ return super.close(map, force);
+ }
+
+ private void createActions(ModeController modeController) {
+ modeController.addAction(new NewMapViewAction());
+ modeController.addAction(new NewSiblingAction());
+ modeController.addAction(new NewPreviousSiblingAction());
+ modeController.addAction(new NewChildAction());
+ modeController.addAction(new NewSummaryAction());
+ modeController.addAction(new NewFreeNodeAction());
+ modeController.addAction(new DeleteAction());
+ modeController.addAction(new NodeUpAction());
+ modeController.addAction(new NodeDownAction());
+ modeController.addAction(new ConvertCloneToIndependentNodeAction());
+ }
+
+ public void deleteNode(NodeModel node) {
+ deleteNodes(Arrays.asList(node));
+ }
+
+ public void deleteNodes(final List<NodeModel> nodes) {
+ final List<NodeModel> deletedNodesWithSummaryGroupIndicators = new SummaryGroupEdgeListAdder(nodes).addSummaryEdgeNodes();
+ for(NodeModel node : deletedNodesWithSummaryGroupIndicators){
+ deleteSingleNodeWithClones(node);
+ }
+ }
+
+ public void convertClonesToIndependentNodes(final NodeModel node){
+ final MLinkController linkController = (MLinkController) MLinkController.getController();
+ if(node.isCloneTreeRoot()){
+ linkController.deleteMapLinksForClone(node);
+ convertCloneToNode(node);
+ linkController.insertMapLinksForClone(node);
+ }
+ }
+
+ private void convertCloneToNode(final NodeModel node) {
+ final MModeController mModeController = getMModeController();
+ final ClipboardController clipboardController = mModeController.getExtension(ClipboardController.class);
+ final NodeModel duplicate = clipboardController.duplicate(node, false);
+ IActor converter = new IActor() {
+
+ @Override
+ public void act() {
+ node.swapData(duplicate);
+ nodeChanged(node);
+ }
+
+ @Override
+ public void undo() {
+ node.swapData(duplicate);
+ nodeChanged(node);
+ }
+
+ @Override
+ public String getDescription() {
+ return "convertClonesToIndependentNodes";
+ }
+
+ };
+ final boolean shouldConvertChildNodes = node.subtreeClones().size() > 1;
+ mModeController.execute(converter, node.getMap());
+ if(shouldConvertChildNodes)
+ for (NodeModel child : node.getChildren())
+ convertCloneToNode(child);
+ }
+
+ private void deleteSingleNodeWithClones(NodeModel node) {
+ final NodeModel parentNode = node.getParentNode();
+ final int index = parentNode.getIndex(node);
+ for(NodeModel parentClone : parentNode.subtreeClones())
+ deleteSingleNode(parentClone, index);
+ }
+
+ private void deleteSingleSummaryNode(NodeModel summarynode) {
+ final NodeModel summaryParent = summarynode.getParentNode();
+ final SummaryLevels summaryLevels = new SummaryLevels(summaryParent);
+ final int summaryNodeIndex = summarynode.getIndex();
+ final int groupBeginNodeIndex = summaryLevels.findGroupBeginNodeIndex(summaryNodeIndex - 1);
+ deleteSingleNode(summaryParent, summaryNodeIndex);
+ deleteSingleNode(summaryParent, groupBeginNodeIndex);
+ }
+
+ private void deleteSingleNode(final NodeModel parentNode, final int index) {
+ final NodeModel node = parentNode.getChildAt(index);
+ final IActor actor = new IActor() {
+ public void act() {
+ deleteWithoutUndo(parentNode, index);
+ }
+
+ public String getDescription() {
+ return "delete";
+ }
+
+ public void undo() {
+ (Controller.getCurrentModeController().getMapController()).insertNodeIntoWithoutUndo(node, parentNode, index);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, parentNode.getMap());
+ }
+
+ private void deleteWithoutUndo(final NodeModel parent, final int index) {
+ final NodeModel child = parent.getChildAt(index);
+ final NodeDeletionEvent nodeDeletionEvent = new NodeDeletionEvent(parent, child, index);
+ firePreNodeDelete(nodeDeletionEvent);
+ final MapModel map = parent.getMap();
+ setSaved(map, false);
+ parent.remove(index);
+ fireNodeDeleted(nodeDeletionEvent);
+ }
+
+ public MModeController getMModeController() {
+ return (MModeController) Controller.getCurrentModeController();
+ }
+
+ public void insertNode(final NodeModel node, final NodeModel parent) {
+ insertNode(node, parent, parent.getChildCount());
+ }
+
+ public void insertNode(final NodeModel node, final NodeModel target, final boolean asSibling, final boolean isLeft,
+ final boolean changeSide) {
+ NodeModel parent;
+ if (asSibling) {
+ parent = target.getParentNode();
+ }
+ else {
+ parent = target;
+ }
+ if (changeSide) {
+ node.setParent(parent);
+ node.setLeft(isLeft);
+ }
+ if (asSibling) {
+ insertNode(node, parent, parent.getIndex(target));
+ }
+ else {
+ insertNode(node, parent, parent.getChildCount());
+ }
+ }
+
+ public void insertNode(final NodeModel node, final NodeModel parentNode, final int index) {
+ insertNewNode(node, parentNode, index, node.isLeft());
+ }
+
+ @Override
+ public void insertNodeIntoWithoutUndo(final NodeModel newNode, final NodeModel parent, final int index) {
+ setSaved(parent.getMap(), false);
+ super.insertNodeIntoWithoutUndo(newNode, parent, index);
+ }
+
+ public boolean isWriteable(final NodeModel targetNode) {
+ final EncryptionModel encryptionModel = EncryptionModel.getModel(targetNode);
+ if (encryptionModel != null) {
+ return encryptionModel.isAccessible();
+ }
+ return true;
+ }
+
+ public void moveNode(NodeModel node, int newIndex) {
+ moveNodes(Arrays.asList(node), node.getParentNode(), newIndex);
+ }
+
+ public void moveNodes(final List<NodeModel> children, final NodeModel newParent, final int newIndex) {
+ moveNodes(children, newParent, newIndex, false, false);
+ }
+
+ public void moveNodes(final List<NodeModel> movedNodes, final NodeModel newParent, final int newIndex, final boolean isLeft,
+ final boolean changeSide) {
+ final List<NodeModel> movedNodesWithSummaryGroupIndicators = new SummaryGroupEdgeListAdder(movedNodes).addSummaryEdgeNodes();
+ int index = newIndex;
+ for(NodeModel node : movedNodesWithSummaryGroupIndicators)
+ moveNodeAndItsClones(node, newParent, index++, isLeft, changeSide && node.isLeft() != isLeft);
+ }
+
+ public void moveNodeAndItsClones(NodeModel child, final NodeModel newParent, int newIndex, final boolean isLeft,
+ final boolean changeSide) {
+ if(child.subtreeContainsCloneOf(newParent)){
+ UITools.errorMessage("not allowed");
+ return;
+ }
+ final NodeModel oldParent = child.getParentNode();
+ if(newParent != oldParent && newParent.subtreeClones().contains(oldParent)) {
+ moveNodeAndItsClones(child, oldParent, newIndex, newParent.isLeft(), false);
+ return;
+ }
+
+ final NodeModel childNode = child;
+ final int oldIndex = oldParent.getIndex(childNode);
+ final int childCount = newParent.getChildCount();
+ newIndex = newIndex >= childCount ? oldParent == newParent ? childCount - 1 : childCount : newIndex;
+
+ if (oldParent != newParent || oldIndex != newIndex || changeSide != false) {
+ final NodeRelativePath nodeRelativePath = getPathToNearestTargetClone(oldParent, newParent);
+
+ final Set<NodeModel> oldParentClones = new HashSet<NodeModel>(oldParent.subtreeClones().toCollection());
+ final Set<NodeModel> newParentClones = new HashSet<NodeModel>(newParent.subtreeClones().toCollection());
+
+ final NodeModel commonAncestor = nodeRelativePath.commonAncestor();
+ for (NodeModel commonAncestorClone: commonAncestor.subtreeClones()){
+ NodeModel oldParentClone = nodeRelativePath.pathBegin(commonAncestorClone);
+ NodeModel newParentClone = nodeRelativePath.pathEnd(commonAncestorClone);
+ final boolean isLeftForClone = newParentClone == newParent ? isLeft : newParentClone.isLeft();
+ moveSingleNode(oldParentClone.getChildAt(oldIndex), newParentClone, newIndex, isLeftForClone, changeSide);
+ oldParentClones.remove(oldParentClone);
+ newParentClones.remove(newParentClone);
+ }
+
+ for(NodeModel newParentClone : newParentClones)
+ insertSingleNewNode(child.cloneTree(), newParentClone, newIndex, newParentClone.isLeft());
+
+ for(NodeModel oldParentClone : oldParentClones)
+ deleteSingleNode(oldParentClone, oldIndex);
+ }
+ }
+
+ private NodeRelativePath getPathToNearestTargetClone(final NodeModel source, final NodeModel target) {
+ if(source == target)
+ return new NodeRelativePath(source, target);
+ final Clones targetClones = target.subtreeClones();
+ final int pathNumber = targetClones.size();
+ if(pathNumber == 1)
+ return new NodeRelativePath(source, target);
+ Collection<NodeRelativePath> paths = new ArrayList<>(pathNumber);
+ for(NodeModel targetClone : targetClones)
+ paths.add(new NodeRelativePath(source, targetClone));
+ final NodeRelativePath shortestPath = Collections.min(paths, new Comparator<NodeRelativePath>() {
+ @Override
+ public int compare(NodeRelativePath o1, NodeRelativePath o2) {
+ return o1.getPathLength() - o2.getPathLength();
+ }
+ });
+ return shortestPath;
+ }
+
+ private void moveSingleNode(final NodeModel child, final NodeModel newParent, final int newIndex,
+ final boolean isLeft, final boolean changeSide) {
+ final NodeModel oldParent = child.getParentNode();
+ final int oldIndex = oldParent.getIndex(child);
+
+ final boolean wasLeft = child.isLeft();
+ final IActor actor = new IActor() {
+ public void act() {
+ moveNodeToWithoutUndo(child, newParent, newIndex, isLeft, changeSide);
+ }
+
+ public String getDescription() {
+ return "moveNode";
+ }
+
+ public void undo() {
+ moveNodeToWithoutUndo(child, oldParent, oldIndex, wasLeft, changeSide);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, newParent.getMap());
+ }
+
+ public void moveNodesAsChildren(final List<NodeModel> children, final NodeModel target, final boolean isLeft,
+ final boolean changeSide) {
+ FreeNode r = Controller.getCurrentModeController().getExtension(FreeNode.class);
+ for(NodeModel node : children){
+ final IExtension extension = node.getExtension(FreeNode.class);
+ if (extension != null) {
+ r.undoableToggleHook(node, extension);
+ if (MapStyleModel.FLOATING_STYLE.equals(LogicalStyleModel.getStyle(node)))
+ ((MLogicalStyleController)MLogicalStyleController.getController(getMModeController())).setStyle(node, null);
+ }
+ }
+ int position = target.getChildCount();
+ moveNodes(children, target, position, isLeft, changeSide);
+ }
+
+ public void moveNodesBefore(final List<NodeModel> children, final NodeModel target, final boolean isLeft,
+ final boolean changeSide) {
+ final NodeModel newParent = target.getParentNode();
+ int newIndex = newParent.getIndex(target);
+ for(NodeModel node : children){
+ final NodeModel oldParent = node.getParentNode();
+ if(newParent.subtreeClones().contains(oldParent)){
+ final NodeModel childNode = node;
+ final int oldIndex = oldParent.getIndex(childNode);
+ if(oldIndex < newIndex)
+ newIndex--;
+ }
+ Controller.getCurrentModeController().getExtension(FreeNode.class).undoableDeactivateHook(node);
+ }
+ moveNodes(children, newParent, newIndex, isLeft, changeSide);
+ }
+
+ public void moveNodesInGivenDirection(NodeModel selected, Collection<NodeModel> movedNodes, final int direction) {
+ final List<NodeModel> movedNodesWithEdges = new SummaryGroupEdgeListAdder(movedNodes).addSummaryEdgeNodes();
+ final Collection<NodeModel> movedNodeSet = new HashSet<NodeModel>(movedNodesWithEdges);
+
+ final Comparator<Object> comparator = (direction == -1) ? null : new Comparator<Object>() {
+ public int compare(final Object o1, final Object o2) {
+ final int i1 = ((Integer) o1).intValue();
+ final int i2 = ((Integer) o2).intValue();
+ return i2 - i1;
+ }
+ };
+ if (movedNodeSet.size() == 0)
+ return;
+ final NodeModel oneMovedNode = movedNodeSet.iterator().next();
+ final NodeModel parent = oneMovedNode.getParentNode();
+ if (parent != null) {
+ final List<NodeModel> sortedChildren = getSiblingsSortedOnSide(parent);
+ final TreeSet<Integer> range = new TreeSet<Integer>(comparator);
+ for (final NodeModel node : movedNodeSet) {
+ if (node.getParentNode() != parent) {
+ LogUtils.warn("Not all selected nodes have the same parent.");
+ return;
+ }
+ range.add(new Integer(sortedChildren.indexOf(node)));
+ }
+ Integer last = range.iterator().next();
+ for (final Integer newInt : range) {
+ if (Math.abs(newInt.intValue() - last.intValue()) > 1) {
+ LogUtils.warn("Not adjacent nodes. Skipped. ");
+ return;
+ }
+ last = newInt;
+ }
+ Collection<NodeModel> selectedNodes = new ArrayList<NodeModel>(getSelectedNodes());
+ for (final Integer position : range) {
+ final NodeModel node = sortedChildren.get(position.intValue());
+ moveSingleNodeInGivenDirection(node, direction);
+ }
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ selection.selectAsTheOnlyOneSelected(selected);
+ for (NodeModel selectedNode : selectedNodes) {
+ selection.makeTheSelected(selectedNode);
+ }
+ }
+ }
+
+ private int moveSingleNodeInGivenDirection(final NodeModel child, final int direction) {
+ final NodeModel parent = child.getParentNode();
+ final int index = parent.getIndex(child);
+ int newIndex = index;
+ final int maxIndex = parent.getChildCount();
+ final List<NodeModel> sortedOnSideNodes = getSiblingsSortedOnSide(parent);
+ int newPositionInVector = sortedOnSideNodes.indexOf(child) + direction;
+ if (newPositionInVector < 0) {
+ newPositionInVector = maxIndex - 1;
+ }
+ if (newPositionInVector >= maxIndex) {
+ newPositionInVector = 0;
+ }
+ final NodeModel destinationNode = sortedOnSideNodes.get(newPositionInVector);
+ newIndex = parent.getIndex(destinationNode);
+ moveNodeAndItsClones(child, parent, newIndex, child.isLeft(),false);
+ return newIndex;
+ }
+ /**
+ * Sorts nodes by their left/right status. The left are first.
+ */
+ private List<NodeModel> getSiblingsSortedOnSide(final NodeModel node) {
+ final ArrayList<NodeModel> nodes = new ArrayList<NodeModel>(node.getChildCount());
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ nodes.add(child);
+ }
+ if(! node.isRoot()){
+ return nodes;
+ }
+ final MapStyleModel mapStyleModel = MapStyleModel.getExtension(node.getMap());
+ MapViewLayout layoutType = mapStyleModel.getMapViewLayout();
+ if(layoutType.equals(MapViewLayout.OUTLINE)){
+ return nodes;
+ }
+
+ Collections.sort(nodes, new Comparator<Object>() {
+ public int compare(final Object o1, final Object o2) {
+ if (o1 instanceof NodeModel) {
+ final NodeModel n1 = (NodeModel) o1;
+ if (o2 instanceof NodeModel) {
+ final NodeModel n2 = (NodeModel) o2;
+ final int b1 = n1.isLeft() ? 0 : 1;
+ final int b2 = n2.isLeft() ? 0 : 1;
+ return b1 - b2;
+ }
+ }
+ throw new IllegalArgumentException("Elements in LeftRightComparator are not comparable.");
+ }
+ });
+ return nodes;
+ }
+
+ /**
+ * The direction is used if side left and right are present. then the next
+ * suitable place on the same side# is searched. if there is no such place,
+ * then the side is changed.
+ *
+ * @return returns the new index.
+ */
+ private int moveNodeToWithoutUndo(final NodeModel child, final NodeModel newParent, int newIndex,
+ final boolean isLeft, final boolean changeSide) {
+ final NodeModel oldParent = child.getParentNode();
+ final int oldIndex = oldParent.getIndex(child);
+ final boolean oldSideLeft = child.isLeft();
+ final boolean newSideLeft = changeSide ? isLeft : oldSideLeft;
+ final NodeMoveEvent nodeMoveEvent = new NodeMoveEvent(oldParent, oldIndex, oldSideLeft, newParent, child, newIndex, newSideLeft);
+ firePreNodeMoved(nodeMoveEvent);
+ oldParent.remove(oldParent.getIndex(child));
+ if (changeSide) {
+ child.setParent(newParent);
+ child.setLeft(isLeft);
+ }
+ newParent.insert(child, newIndex);
+ fireNodeMoved(nodeMoveEvent);
+ setSaved(newParent.getMap(), false);
+ return newIndex;
+ }
+
+ public MapModel newModel(NodeModel existingNode) {
+ // use new MMapModel() instead of calling this method with a null arg
+ if(existingNode == null)
+ throw new NullPointerException("null node not allowed.");
+ final MMapModel mindMapMapModel = new MMapModel();
+ mindMapMapModel.setRoot(existingNode);
+ mindMapMapModel.registryNodeRecursive(existingNode);
+ fireMapCreated(mindMapMapModel);
+ return mindMapMapModel;
+ }
+
+ @Override
+ public MapModel newModel() {
+ final MMapModel mindMapMapModel = new MMapModel();
+ mindMapMapModel.createNewRoot();
+ fireMapCreated(mindMapMapModel);
+ return mindMapMapModel;
+ }
+
+
+ @Override
+ public void setSaved(final MapModel mapModel, final boolean saved) {
+ final boolean setTitle = saved != mapModel.isSaved() || mapModel.isReadOnly();
+ mapModel.setSaved(saved);
+ if (setTitle) {
+ final Controller controller = Controller.getCurrentController();
+ controller.getMapViewManager().setMapTitles();
+ final AFreeplaneAction saveAction = controller.getModeController().getAction("SaveAction");
+ if(saveAction != null)
+ saveAction.setEnabled();
+ }
+ }
+
+ public NodeModel addFreeNode(final Point pt, final boolean newNodeIsLeft) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final TextController textController = TextController.getController();
+ if (textController instanceof MTextController) {
+ ((MTextController) textController).stopEditing();
+ modeController.forceNewTransaction();
+ }
+ final NodeModel target = getRootNode();
+ final NodeModel targetNode = target;
+ final boolean parentFolded = isFolded(targetNode);
+ if (parentFolded) {
+ setFolded(targetNode, false);
+ }
+ if (!isWriteable(target)) {
+ UITools.errorMessage(TextUtils.getText("node_is_write_protected"));
+ return null;
+ }
+ final NodeModel newNode = newNode("", target.getMap());
+ LogicalStyleModel.createExtension(newNode).setStyle(MapStyleModel.FLOATING_STYLE);
+ newNode.addExtension(modeController.getExtension(FreeNode.class));
+ if(! addNewNode(newNode, target, target.getChildCount(), newNodeIsLeft))
+ return null;
+ final Quantity<LengthUnits> x = LengthUnits.pixelsInPt(pt.x);
+ final Quantity<LengthUnits> y = LengthUnits.pixelsInPt(pt.y);
+ ((MLocationController)MLocationController.getController(modeController)).moveNodePosition(newNode, x, y);
+ final Component component = Controller.getCurrentController().getMapViewManager().getComponent(newNode);
+ if (component == null)
+ return newNode;
+ component.addFocusListener(new FocusListener() {
+ public void focusLost(FocusEvent e) {
+ }
+
+ public void focusGained(FocusEvent e) {
+ e.getComponent().removeFocusListener(this);
+ ((MTextController) textController).edit(newNode, targetNode, true, false, false);
+ }
+ });
+ select(newNode);
+ return newNode;
+ }
+
+ /**@deprecated -- use MMapIO*/
+ @Deprecated
+ public boolean newUntitledMap(final URL url) throws FileNotFoundException, IOException, URISyntaxException, XMLException{
+ try {
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ final MapModel newModel = new MMapModel();
+ UrlManager.getController().load(url, newModel);
+ newModel.setURL(null);
+ fireMapCreated(newModel);
+ newMapView(newModel);
+ return true;
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+ /**@throws XMLException
+ * @deprecated -- use MMapIO*/
+ @Deprecated
+ @Override
+ public boolean newMap(URL url) throws FileNotFoundException, IOException, URISyntaxException, XMLException {
+ // load as documentation map if necessary
+ if(getMModeController().containsExtension(DocuMapAttribute.class)){
+ return newDocumentationMap(url);
+ }
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ if (mapViewManager.tryToChangeToMapView(url))
+ return false;
+ if (AddOnsController.getController().installIfAppropriate(url))
+ return false;
+ URL alternativeURL = null;
+ try {
+ final File file = Compat.urlToFile(url);
+ if(file == null){
+ alternativeURL = url;
+ }
+ else{
+ if(file.exists()){
+ final MFileManager fileManager = MFileManager.getController(getMModeController());
+ File alternativeFile = fileManager.getAlternativeFile(file, AlternativeFileMode.AUTOSAVE);
+ if(alternativeFile != null){
+ if (alternativeFile.getAbsoluteFile().equals(file.getAbsoluteFile()) )
+ alternativeURL = url;
+ else
+ alternativeURL = Compat.fileToUrl(alternativeFile);
+ }
+ else
+ return false;
+ }
+ else{
+ alternativeURL = url;
+ }
+ }
+ }
+ catch (MalformedURLException e) {
+ }
+ catch (URISyntaxException e) {
+ }
+
+ if(alternativeURL == null)
+ return false;
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ try{
+ final MapModel newModel = new MMapModel();
+ final MFileManager fileManager = MFileManager.getController(getMModeController());
+ fileManager.loadAndLock(alternativeURL, newModel);
+ newModel.setURL(url);
+ newModel.setSaved(alternativeURL.equals(url));
+ fireMapCreated(newModel);
+ newMapView(newModel);
+ return true;
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+ public void newDocumentationMap(final String file) {
+ final NodeAndMapReference nodeAndMapReference = new NodeAndMapReference(file);
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final File userDir = new File(resourceController.getFreeplaneUserDirectory());
+ final File baseDir = new File(resourceController.getInstallationBaseDir());
+ final String languageCode = resourceController.getLanguageCode();
+ final File localFile = ConfigurationUtils.getLocalizedFile(new File[]{userDir, baseDir}, nodeAndMapReference.getMapReference(), languageCode);
+ if(localFile == null){
+ String errorMessage = TextUtils.format("invalid_file_msg", file);
+ UITools.errorMessage(errorMessage);
+ return;
+ }
+ try {
+ final URL endUrl = localFile.toURL();
+ try {
+ if (endUrl.getFile().endsWith(".mm")) {
+ Controller.getCurrentController().selectMode(MModeController.MODENAME);
+ newDocumentationMap(endUrl);
+ if(nodeAndMapReference.hasNodeReference())
+ select(nodeAndMapReference.getNodeReference());
+
+ }
+ else {
+ Controller.getCurrentController().getViewController().openDocument(endUrl);
+ }
+ }
+ catch (final Exception e1) {
+ LogUtils.severe(e1);
+ }
+ }
+ catch (final MalformedURLException e1) {
+ LogUtils.warn(e1);
+ }
+ }
+
+
+
+ /**@throws XMLException
+ * @deprecated -- use MMapIO*/
+ @Deprecated
+ public boolean newDocumentationMap(final URL url) throws FileNotFoundException, IOException, URISyntaxException, XMLException{
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ if (mapViewManager.tryToChangeToMapView(url))
+ return false;
+ try {
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ final MapModel newModel = new MMapModel();
+ newModel.addExtension(DocuMapAttribute.instance);
+ UrlManager.getController().load(url, newModel);
+ newModel.setReadOnly(true);
+ fireMapCreated(newModel);
+ newMapView(newModel);
+ newModel.setSaved(true);
+ return true;
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+ /**@throws XMLException
+ * @deprecated -- use MMapIO*/
+ @Deprecated
+ public boolean restoreCurrentMap() throws FileNotFoundException, IOException, URISyntaxException, XMLException {
+ final Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final URL url = map.getURL();
+ if(url == null){
+ UITools.errorMessage(TextUtils.getText("map_not_saved"));
+ return false;
+ }
+
+ if(map.containsExtension(DocuMapAttribute.class)){
+ controller.close(true);
+ return newDocumentationMap(url);
+ }
+
+ final URL alternativeURL = MFileManager.getController(getMModeController()).getAlternativeURL(url, AlternativeFileMode.ALL);
+ if(alternativeURL == null)
+ return false;
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ try{
+ final MapModel newModel = new MMapModel();
+ ((MFileManager)MFileManager.getController()).loadAndLock(alternativeURL, newModel);
+ newModel.setURL(url);
+ newModel.setSaved(alternativeURL.equals(url));
+ fireMapCreated(newModel);
+ controller.close(true);
+ newMapView(newModel);
+ return true;
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+ @Override
+ protected void setFoldingState(final NodeModel node, final boolean folded) {
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ final boolean wasFolded = mapViewManager.isFoldedOnCurrentView(node);
+ if(wasFolded == folded && mapViewManager.getComponent(node) == null)
+ return;
+ if(isFoldingPersistent()){
+ IActor foldingActor = new IActor() {
+ @Override
+ public void undo() {
+ unfoldHiddenChildren(node);
+ MMapController.super.setFoldingState(node, wasFolded);
+ }
+
+ @Override
+ public String getDescription() {
+ return "setFoldingState";
+ }
+
+ @Override
+ public void act() {
+ unfoldHiddenChildren(node);
+ MMapController.super.setFoldingState(node, folded);
+ }
+ };
+ getMModeController().execute(foldingActor, node.getMap());
+ }
+ else
+ super.setFoldingState(node, folded);
+ }
+
+ static private final List<String> foldingSavedOptions = Arrays.asList(NodeBuilder.RESOURCES_ALWAYS_SAVE_FOLDING, NodeBuilder.RESOURCES_SAVE_FOLDING_IF_MAP_IS_CHANGED);
+
+ private boolean isFoldingPersistent() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ return foldingSavedOptions.contains(resourceController.getProperty(NodeBuilder.RESOURCES_SAVE_FOLDING));
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/MMapModel.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/MMapModel.java
new file mode 100644
index 0000000..d4444c1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/MMapModel.java
@@ -0,0 +1,137 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.EventQueue;
+import java.io.File;
+import java.net.URL;
+import java.util.Timer;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.core.undo.UndoHandler;
+import org.freeplane.core.util.SysUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.features.url.mindmapmode.DoAutomaticSave;
+import org.freeplane.features.url.mindmapmode.DummyLockManager;
+import org.freeplane.features.url.mindmapmode.LockManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+
+public class MMapModel extends MapModel {
+ private static int unnamedMapsNumber = 1;
+ private LockManager lockManager;
+ private Timer timerForAutomaticSaving;
+ private int titleNumber = 0;
+
+ /**
+ * The current version and all other version that don't need XML update for
+ * sure.
+ */
+ public MMapModel() {
+ super();
+ addExtension(IUndoHandler.class, new UndoHandler(this));
+ this.setLockManager(ResourceController.getResourceController().getBooleanProperty(
+ "experimental_file_locking_on") ? new LockManager() : new DummyLockManager());
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ scheduleTimerForAutomaticSaving();
+ }
+ });
+ }
+
+ /**
+ * When a map is closed, this method is called.
+ *
+ * @param mindMapMapModel
+ */
+ @Override
+ public void destroy() {
+ getLockManager().releaseLock();
+ getLockManager().releaseTimer();
+ /* cancel the timer, if map is closed. */
+ if (getTimerForAutomaticSaving() != null) {
+ getTimerForAutomaticSaving().cancel();
+ }
+ super.destroy();
+ }
+
+ public LockManager getLockManager() {
+ return lockManager;
+ }
+
+ public Timer getTimerForAutomaticSaving() {
+ return timerForAutomaticSaving;
+ }
+
+ @Override
+ public String getTitle() {
+ final URL url = getURL();
+ if (url != null) {
+ final File file = getFile();
+ if(file != null) {
+ final String fileName = file.getName();
+ if(fileName.endsWith(UrlManager.FREEPLANE_FILE_EXTENSION))
+ return fileName.substring(0, fileName.length() - UrlManager.FREEPLANE_FILE_EXTENSION.length());
+ return fileName;
+ }
+ else
+ return url.toString();
+ }
+ if (titleNumber == 0) {
+ titleNumber = MMapModel.unnamedMapsNumber++;
+ }
+ return TextUtils.getText("mindmap") + titleNumber;
+ }
+
+ public void scheduleTimerForAutomaticSaving() {
+ if (!(UrlManager.getController() instanceof MFileManager)) {
+ return;
+ }
+ final int numberOfTempFiles = Integer.parseInt(ResourceController.getResourceController().getProperty(
+ "number_of_different_files_for_automatic_save"));
+ if (numberOfTempFiles == 0) {
+ return;
+ }
+ final boolean filesShouldBeDeletedAfterShutdown = ResourceController.getResourceController()
+ .getBooleanProperty("delete_automatic_saves_at_exit");
+ final int delay = ResourceController.getResourceController().getTimeProperty("time_for_automatic_save");
+ if (delay == 0) {
+ return;
+ }
+ final boolean useSingleBackupDirectory = ResourceController.getResourceController().getBooleanProperty(
+ "single_backup_directory");
+ final String singleBackupDirectory = ResourceController.getResourceController()
+ .getProperty("single_backup_directory_path");
+ final Timer timer = SysUtils.createTimer("TimerForAutomaticSaving");
+ timer.schedule(new DoAutomaticSave(this, numberOfTempFiles, filesShouldBeDeletedAfterShutdown,
+ useSingleBackupDirectory, singleBackupDirectory), delay, delay);
+ this.setTimerForAutomaticSaving(timer);
+ }
+
+ void setLockManager(final LockManager lockManager) {
+ this.lockManager = lockManager;
+ }
+
+ void setTimerForAutomaticSaving(final Timer timerForAutomaticSaving) {
+ this.timerForAutomaticSaving = timerForAutomaticSaving;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewChildAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewChildAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/mindmapmode/NewChildAction.java
rename to freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewChildAction.java
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewFreeNodeAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewFreeNodeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/mindmapmode/NewFreeNodeAction.java
rename to freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewFreeNodeAction.java
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewMapViewAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewMapViewAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/mindmapmode/NewMapViewAction.java
rename to freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewMapViewAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewParentNode.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewParentNode.java
new file mode 100644
index 0000000..1d45026
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewParentNode.java
@@ -0,0 +1,118 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.EventQueue;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.SummaryLevels;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+
+/**
+ * @author foltin The original version was sent by Stephen Viles (sviles) https:
+ * group_id=7118 Initial Comment: The "New Parent Node" action creates a
+ * node as a parent of one or more selected nodes. If more than one node
+ * is selected, the selected nodes must all have the same parent -- this
+ * restriction is imposed to make the action easier to understand and to
+ * undo manually, and could potentially be removed when we get automated
+ * undo. The root node must not be one of the selected nodes. I find
+ * this action useful when I need to add an extra level of grouping in
+ * the middle of an existing hierarchy. It is quicker than adding a new
+ * node at the same level and then cutting-and-pasting the child nodes.
+ * The code simply performs these actions in sequence, after validating
+ * the selected nodes.
+ */
+public class NewParentNode extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public NewParentNode() {
+ super("NewParentNode");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.extensions.NodeHook#invoke(freeplane.modes.MindMapNode,
+ * java.util.List)
+ */
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel selectedNode = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ if(selectedNode == null)
+ return;
+ Collection<NodeModel> unmodifyable = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ final List<NodeModel> selectedNodes = new ArrayList<NodeModel>(unmodifyable.size());
+ selectedNodes.addAll(unmodifyable);
+ Controller.getCurrentModeController().getMapController().sortNodesByDepth(selectedNodes);
+ if (selectedNode.isRoot()) {
+ UITools.errorMessage(TextUtils.getText("cannot_add_parent_to_root"));
+ return;
+ }
+ final NodeModel newNode = moveToNewParent(selectedNode, selectedNodes);
+ if (newNode == null) {
+ return;
+ }
+ Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(newNode);
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ ((MTextController) TextController.getController()).edit(newNode, selectedNode, true, false, false);
+ }
+ });
+
+ }
+
+ private NodeModel moveToNewParent(final NodeModel selectedNode, final List<NodeModel> selectedNodes) {
+ final NodeModel oldParent = selectedNode.getParentNode();
+ for (final NodeModel node: selectedNodes) {
+ if (node.getParentNode() != oldParent) {
+ UITools.errorMessage(TextUtils.getText("cannot_add_parent_diff_parents"));
+ return null;
+ }
+ if (node.isRoot()) {
+ UITools.errorMessage(TextUtils.getText("cannot_add_parent_to_root"));
+ return null;
+ }
+ }
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ final SummaryLevels summaryLevels = new SummaryLevels(oldParent);
+ int childPosition = selectedNode.getIndex();
+ final NodeModel summaryNode = summaryLevels.findSummaryNode(childPosition);
+ if(summaryNode != null){
+ final Collection<NodeModel> summarizedNodes = summaryLevels.summarizedNodes(summaryNode);
+ if(selectedNodes.containsAll(summarizedNodes))
+ childPosition = summaryLevels.findGroupBeginNodeIndex(childPosition);
+
+ }
+ final NodeModel newParent = mapController.addNewNode(oldParent, childPosition, selectedNode.isLeft());
+ mapController.moveNodesAsChildren(selectedNodes, newParent, false, false);
+ return newParent;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewPreviousSiblingAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewPreviousSiblingAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/mindmapmode/NewPreviousSiblingAction.java
rename to freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewPreviousSiblingAction.java
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewSiblingAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewSiblingAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/map/mindmapmode/NewSiblingAction.java
rename to freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewSiblingAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewSummaryAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewSummaryAction.java
new file mode 100644
index 0000000..ba86889
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NewSummaryAction.java
@@ -0,0 +1,121 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeRelativePath;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+class NewSummaryAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private int start;
+ private int end;
+ private int summaryLevel;
+
+ public NewSummaryAction() {
+ super("NewSummaryAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if(! addNewSummaryNodeStartEditing()){
+ UITools.errorMessage(TextUtils.getText("summary_not_possible"));
+ }
+ }
+
+ private boolean addNewSummaryNodeStartEditing() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IMapSelection selection = modeController.getController().getSelection();
+
+ final List<NodeModel> sortedSelection = selection.getSortedSelection(false);
+
+ final NodeModel firstNode = sortedSelection.get(0);
+ final NodeModel lastNode = sortedSelection.get(sortedSelection.size()-1);
+
+ final boolean isLeft = firstNode.isLeft();
+ // different sides
+ if(isLeft!=lastNode.isLeft()){
+ return false;
+ }
+ final NodeModel parentNode = firstNode.getParentNode();
+ if(parentNode == null)
+ return false;
+ final NodeModel lastParent = lastNode.getParentNode();
+ if(lastParent == null)
+ return false;
+ if(parentNode.equals(lastParent))
+ return addNewSummaryNodeStartEditing(firstNode, lastNode);
+ else {
+ final NodeRelativePath nodeRelativePath = new NodeRelativePath(firstNode, lastNode);
+ NodeModel commonAncestor = nodeRelativePath.commonAncestor();
+ if (commonAncestor == firstNode || commonAncestor == lastNode)
+ return false;
+ final NodeModel newFirstNode = nodeRelativePath.beginPathElement(1);
+ final NodeModel newLastNode = nodeRelativePath.endPathElement(1);
+ return addNewSummaryNodeStartEditing(newFirstNode, newLastNode);
+ }
+ }
+
+ private boolean addNewSummaryNodeStartEditing(final NodeModel firstNode, final NodeModel lastNode) {
+
+ final NodeModel parentNode = firstNode.getParentNode();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final boolean isLeft = firstNode.isLeft();
+ start = parentNode.getIndex(firstNode);
+ end = parentNode.getIndex(lastNode);
+ if(end < start){
+ int temp = end;
+ end = start;
+ start = temp;
+ }
+
+ summaryLevel = SummaryNode.getSummaryLevel(firstNode);
+
+ // selected nodes have different summary levels
+ if (summaryLevel != SummaryNode.getSummaryLevel(lastNode))
+ return false;
+ int level = summaryLevel;
+ for(int i = start+1; i < end; i++){
+ NodeModel node = (NodeModel) parentNode.getChildAt(i);
+ if(isLeft != node.isLeft())
+ continue;
+ if(SummaryNode.isSummaryNode(node))
+ level++;
+ else
+ level = 0;
+ // There is a higher summary node between the selected nodes
+ if(level > summaryLevel)
+ return false;
+ }
+ ((MMapController) modeController.getMapController()).addNewSummaryNodeStartEditing(parentNode, start, end, summaryLevel, isLeft);
+ return true;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NodeDownAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NodeDownAction.java
new file mode 100644
index 0000000..bf0693d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NodeDownAction.java
@@ -0,0 +1,43 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+class NodeDownAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NodeDownAction() {
+ super("NodeDownAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ ((MMapController) modeController.getMapController()).moveNodesInGivenDirection(modeController.getMapController()
+ .getSelectedNode(), modeController.getMapController().getSelectedNodes(), 1);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NodeUpAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NodeUpAction.java
new file mode 100644
index 0000000..01fa63e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/NodeUpAction.java
@@ -0,0 +1,43 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+
+class NodeUpAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NodeUpAction() {
+ super("NodeUpAction");
+ }
+
+
+ public void actionPerformed(final ActionEvent e) {
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ mapController.moveNodesInGivenDirection(mapController.getSelectedNode(), mapController.getSelectedNodes(), -1);
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/RemoveAllAlwaysUnfoldedNodeFlagsAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/RemoveAllAlwaysUnfoldedNodeFlagsAction.java
new file mode 100644
index 0000000..80332ba
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/RemoveAllAlwaysUnfoldedNodeFlagsAction.java
@@ -0,0 +1,35 @@
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.AlwaysUnfoldedNode;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at SuppressWarnings("serial")
+public class RemoveAllAlwaysUnfoldedNodeFlagsAction extends AFreeplaneAction {
+
+ private AlwaysUnfoldedNode flagController;
+
+ public RemoveAllAlwaysUnfoldedNodeFlagsAction(AlwaysUnfoldedNode alwaysUnfoldedNode) {
+ super("RemoveAllAlwaysUnfoldedNodeFlagsAction");
+ this.flagController = alwaysUnfoldedNode;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ final NodeModel rootNode = Controller.getCurrentController().getMap().getRootNode();
+ final NodeModel node = rootNode;
+ removeAlwaysUnfoldedNodeFlags(node);
+ }
+
+ private void removeAlwaysUnfoldedNodeFlags(final NodeModel node) {
+ if(! node.isFolded() && ! node.isRoot() && node.hasVisibleContent()){
+ flagController.undoableDeactivateHook(node);
+ }
+ for(NodeModel child : node.getChildren())
+ removeAlwaysUnfoldedNodeFlags(child);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/SetAlwaysUnfoldedNodeFlagsAction.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/SetAlwaysUnfoldedNodeFlagsAction.java
new file mode 100644
index 0000000..6ba123e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/SetAlwaysUnfoldedNodeFlagsAction.java
@@ -0,0 +1,35 @@
+package org.freeplane.features.map.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.AlwaysUnfoldedNode;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at SuppressWarnings("serial")
+public class SetAlwaysUnfoldedNodeFlagsAction extends AFreeplaneAction {
+
+ private AlwaysUnfoldedNode flagController;
+
+ public SetAlwaysUnfoldedNodeFlagsAction(AlwaysUnfoldedNode alwaysUnfoldedNode) {
+ super("SetAlwaysUnfoldedNodeFlagsAction");
+ this.flagController = alwaysUnfoldedNode;
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ final NodeModel rootNode = Controller.getCurrentController().getMap().getRootNode();
+ final NodeModel node = rootNode;
+ setAlwaysUnfoldedNodeFlags(node);
+ }
+
+ private void setAlwaysUnfoldedNodeFlags(final NodeModel node) {
+ if(! node.isFolded() && ! node.isRoot() && node.hasVisibleContent()){
+ flagController.undoableActivateHook(node, flagController);
+ }
+ for(NodeModel child : node.getChildren())
+ setAlwaysUnfoldedNodeFlags(child);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/SummaryGroupEdgeListAdder.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/SummaryGroupEdgeListAdder.java
new file mode 100644
index 0000000..3d0690d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/SummaryGroupEdgeListAdder.java
@@ -0,0 +1,95 @@
+package org.freeplane.features.map.mindmapmode;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.SummaryLevels;
+import org.freeplane.features.map.SummaryNode;
+
+public class SummaryGroupEdgeListAdder {
+
+ final private Collection<NodeModel> nodes;
+ private List<NodeModel> nodesWithSummaryNodes;
+
+ public SummaryGroupEdgeListAdder(Collection<NodeModel> nodes) {
+ this.nodes = nodes;
+ }
+
+ private class ParentProcessedNodes {
+ int lastSummaryNodeIndex = -1;
+ int lastAddedNodeIndex = -1;
+ final SummaryLevels summaryLevels;
+ final private NodeModel parentNode;
+ ParentProcessedNodes(NodeModel parent){
+ this.summaryLevels = new SummaryLevels(parent);
+ this.parentNode = parent;
+ }
+
+ void addSummaryEdgeNodes(NodeModel node) {
+ final int nodeIndex = node.getIndex();
+ if(lastSummaryNodeIndex >= nodeIndex){
+ if(summaryLevels.summaryLevels[nodeIndex] == 0)
+ nodesWithSummaryNodes.add(++lastAddedNodeIndex, node);
+ }
+ else {
+ final int groupBeginNodeIndex = summaryLevels.findGroupBeginNodeIndex(nodeIndex);
+ final NodeModel groupBeginNode = parentNode.getChildAt(groupBeginNodeIndex);
+ lastSummaryNodeIndex = summaryLevels.findSummaryNodeIndex(nodeIndex);
+ if(lastSummaryNodeIndex != SummaryLevels.NODE_NOT_FOUND ){
+ final NodeModel summaryNode = parentNode.getChildAt(lastSummaryNodeIndex);
+ final Collection<NodeModel> summarizedNodes = summaryLevels.summarizedNodes(summaryNode);
+ if(nodes.containsAll(summarizedNodes)) {
+ if(groupBeginNode != null ){
+ nodesWithSummaryNodes.add(groupBeginNode);
+ lastAddedNodeIndex++;
+ }
+ if(groupBeginNode != node ){
+ nodesWithSummaryNodes.add(node);
+ lastAddedNodeIndex++;
+ }
+ nodesWithSummaryNodes.add(summaryNode);
+ while(parentNode.getChildCount() > lastSummaryNodeIndex + 1){
+ final NodeModel nextNode = parentNode.getChildAt(lastSummaryNodeIndex + 1);
+ if (SummaryNode.isSummaryNode(nextNode)){
+ lastSummaryNodeIndex++;
+ final Collection<NodeModel> summarizedSummaries = summaryLevels.summarizedNodes(nextNode);
+ if(nodesWithSummaryNodes.containsAll(summarizedSummaries)){
+ nodesWithSummaryNodes.add(nextNode);
+ continue;
+ }
+ }
+ break;
+ }
+ return;
+ }
+ }
+ lastAddedNodeIndex++;
+ nodesWithSummaryNodes.add(node);
+ }
+ }
+ }
+
+ public List<NodeModel> addSummaryEdgeNodes() {
+ Map<NodeModel, ParentProcessedNodes> processedNodes = new HashMap<NodeModel, ParentProcessedNodes>();
+ nodesWithSummaryNodes = new LinkedList<NodeModel>();
+ for(NodeModel node : nodes){
+ final NodeModel parentNode = node.getParentNode();
+ if(parentNode != null) {
+ ParentProcessedNodes parentProcessedNodes = processedNodes.get(parentNode);
+ if(parentProcessedNodes == null){
+ parentProcessedNodes = new ParentProcessedNodes(parentNode);
+ processedNodes.put(parentNode, parentProcessedNodes);
+ }
+ parentProcessedNodes.addSummaryEdgeNodes(node);
+ }
+ else
+ nodesWithSummaryNodes.add(node);
+ }
+ return nodesWithSummaryNodes;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/SummaryNodeMapUpdater.java b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/SummaryNodeMapUpdater.java
new file mode 100644
index 0000000..b367585
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/map/mindmapmode/SummaryNodeMapUpdater.java
@@ -0,0 +1,74 @@
+package org.freeplane.features.map.mindmapmode;
+
+import org.freeplane.features.map.AMapChangeListenerAdapter;
+import org.freeplane.features.map.FirstGroupNodeFlag;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.SummaryLevels;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.map.SummaryNodeFlag;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.url.MapVersionInterpreter;
+
+public class SummaryNodeMapUpdater extends AMapChangeListenerAdapter {
+ final private MMapController mapController;
+ final private MModeController modeController;
+ public SummaryNodeMapUpdater(MModeController modeController, MMapController mapController){
+ this.modeController = modeController;
+ this.mapController = mapController;
+
+ }
+ @Override
+ public void onCreate(MapModel map) {
+ final MapVersionInterpreter mapXmlVersionInterpreter = map.getExtension(MapVersionInterpreter.class);
+ if(mapXmlVersionInterpreter == null || mapXmlVersionInterpreter.version < 6){
+ modeController.deactivateUndo((MMapModel) map);
+ updateSummaryNodes(map.getRootNode());
+ }
+ }
+ private void updateSummaryNodes(NodeModel parentNode) {
+ final NodeModel[] nodes = parentNode.getChildren().toArray(new NodeModel[]{});
+ for(NodeModel node : nodes){
+ SummaryLevels summaryLevels = null;
+ if(SummaryNode.isFirstGroupNode(node)){
+ if(summaryLevels == null)
+ summaryLevels = new SummaryLevels(parentNode);
+ if (summaryLevels.findSummaryNode(node.getIndex()) == null)
+ node.removeExtension(FirstGroupNodeFlag.class);
+ }
+ if(SummaryNode.isSummaryNode(node)) {
+ if(summaryLevels == null)
+ summaryLevels = new SummaryLevels(parentNode);
+ final NodeModel groupBeginNode = summaryLevels.findGroupBeginNode(parentNode.previousNodeIndex(node.getIndex(), node.isLeft()));
+ if(groupBeginNode == null)
+ node.removeExtension(SummaryNodeFlag.class);
+ else {
+ if (! groupBeginNode.containsExtension(FirstGroupNodeFlag.class)) {
+ if(SummaryNode.isSummaryNode(groupBeginNode))
+ groupBeginNode.addExtension(FirstGroupNodeFlag.FIRST_GROUP);
+ else {
+ final NodeModel newFirstGroupNode = mapController.addNewNode(groupBeginNode.getParentNode(), groupBeginNode.getIndex(), groupBeginNode.isLeft());
+ newFirstGroupNode.addExtension(FirstGroupNodeFlag.FIRST_GROUP);
+ }
+ }
+ if (node.isFolded() || !node.hasChildren() || !node.getText().isEmpty()){
+ node.removeExtension(SummaryNodeFlag.class);
+ final NodeModel newParent = mapController.addNewNode(node.getParentNode(), node.getIndex(), node.isLeft());
+ newParent.addExtension(SummaryNodeFlag.SUMMARY);
+ if(SummaryNode.isFirstGroupNode(node)){
+ node.removeExtension(FirstGroupNodeFlag.class);
+ newParent.addExtension(FirstGroupNodeFlag.FIRST_GROUP);
+ }
+ mapController.moveNodeAndItsClones(node, newParent, 0, false, false);
+ }
+ }
+ }
+ else if(SummaryNode.isFirstGroupNode(node) && (node.hasChildren() || !node.getText().isEmpty())){
+ final NodeModel newFirstGroupNode = mapController.addNewNode(node.getParentNode(), node.getIndex(), node.isLeft());
+ node.removeExtension(FirstGroupNodeFlag.class);
+ newFirstGroupNode.addExtension(FirstGroupNodeFlag.FIRST_GROUP);
+ }
+ updateSummaryNodes(node);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mapio/MapIO.java b/freeplane/src/main/java/org/freeplane/features/mapio/MapIO.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mapio/MapIO.java
rename to freeplane/src/main/java/org/freeplane/features/mapio/MapIO.java
diff --git a/freeplane/src/main/java/org/freeplane/features/mapio/mindmapmode/MMapIO.java b/freeplane/src/main/java/org/freeplane/features/mapio/mindmapmode/MMapIO.java
new file mode 100644
index 0000000..95f1e92
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mapio/mindmapmode/MMapIO.java
@@ -0,0 +1,121 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mapio.mindmapmode;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mapio.MapIO;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.n3.nanoxml.XMLParseException;
+
+/**
+ * @author Dimitry Polivaev
+ * Jan 14, 2012
+ */
+ at SuppressWarnings("deprecation")
+public class MMapIO extends MapIO{
+ final private MFileManager fileManager;
+ final private MMapController mapController;
+ private MMapIO(MFileManager urlManager, MMapController mapController) {
+ super(urlManager, mapController);
+ this.fileManager = urlManager;
+ this.mapController = mapController;
+ }
+ public static void install(MModeController modeController){
+ MFileManager urlManager = (MFileManager) modeController.getExtension(UrlManager.class);
+ MMapController mapController = (MMapController) modeController.getMapController();
+ final MMapIO mapIO = new MMapIO(urlManager, mapController);
+ modeController.addExtension(MapIO.class, mapIO);
+ }
+ public void load(URL url, MapModel map) throws FileNotFoundException, IOException, XMLException, XMLParseException,
+ URISyntaxException {
+ fileManager.load(url, map);
+ }
+ public boolean loadCatchExceptions(URL url, MapModel map)
+ {
+ return fileManager.loadCatchExceptions(url, map);
+ }
+
+ public void loadSafeAndLock(URL url, MapModel map) throws FileNotFoundException, IOException, XMLParseException,
+ URISyntaxException {
+ fileManager.loadAndLock(url, map);
+ }
+ public void open() {
+ fileManager.open();
+ }
+ public MapModel newMapFromTemplate(File startFile) {
+ return fileManager.newMapFromTemplate(startFile);
+ }
+ public void saveAsUserTemplate() {
+ fileManager.saveAsUserTemplate();
+ }
+ public boolean save(MapModel map) {
+ return fileManager.save(map);
+ }
+ /**
+ * @return false is the action was cancelled
+ */
+ public boolean save(MapModel map, File file) {
+ return fileManager.save(map, file);
+ }
+ /**
+ * @return false is the action was cancelled
+ */
+ public boolean saveAs(MapModel map) {
+ return fileManager.saveAs(map);
+ }
+ public void writeToFile(MapModel map, File file) throws FileNotFoundException, IOException {
+ fileManager.writeToFile(map, file);
+ }
+ public String tryToLock(MapModel map, File file) throws Exception {
+ return fileManager.tryToLock(map, file);
+ }
+ public NodeModel loadTree(MapModel map, File file) throws XMLParseException, IOException {
+ return fileManager.loadTree(map, file);
+ }
+ public MapModel newMapFromDefaultTemplate() {
+ return fileManager.newMapFromDefaultTemplate();
+ }
+ public boolean newUntitledMap(URL url) throws FileNotFoundException, IOException,
+ URISyntaxException, XMLException {
+ return mapController.newUntitledMap(url);
+ }
+ public boolean newMap(URL url) throws FileNotFoundException, IOException, URISyntaxException, XMLException {
+ return mapController.newMap(url);
+ }
+ public boolean newDocumentationMap(URL url) throws FileNotFoundException, IOException,
+ URISyntaxException, XMLException {
+ return mapController.newDocumentationMap(url);
+ }
+ public boolean restoreCurrentMap() throws FileNotFoundException, IOException, URISyntaxException, XMLException {
+ return mapController.restoreCurrentMap();
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/AController.java b/freeplane/src/main/java/org/freeplane/features/mode/AController.java
new file mode 100644
index 0000000..6141794
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/AController.java
@@ -0,0 +1,97 @@
+package org.freeplane.features.mode;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+
+/**
+ * Place for common controller things.
+ *
+ * @author robert.ladstaetter
+ */
+public class AController {
+ private static class ActionSelectorOnPropertyChange implements IFreeplanePropertyListener, IActionOnChange {
+ final String propertyName;
+ final AFreeplaneAction action;
+
+ public ActionSelectorOnPropertyChange(final AFreeplaneAction action) {
+ super();
+ this.action = action;
+ propertyName = action.getClass().getAnnotation(SelectableAction.class).checkOnPropertyChange();
+ }
+
+ public AFreeplaneAction getAction() {
+ return action;
+ }
+
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (this.propertyName.equals(propertyName)) {
+ action.setSelected();
+ }
+ }
+ }
+
+ public interface IActionOnChange {
+ AFreeplaneAction getAction();
+ }
+
+ private final Map<String, AFreeplaneAction> actions = new HashMap<String, AFreeplaneAction>();
+
+ public AController() {
+ }
+
+ public void addAction(final AFreeplaneAction value) {
+ final String key = value.getKey();
+ final AFreeplaneAction old = getActions().put(key, value);
+ //String pattern = key.replaceAll("\\.", "\\\\.").replaceAll("/", "\\\\/");
+ //System.out.println("key\t\t" + value.getClass().getSimpleName() + "\t\ts/\\\"" + pattern + "\\\"/\\\"" + value.getClass().getSimpleName() + "\\\"/;");
+ if (old != null && !old.equals(value)) {
+ getActions().put(key, old);
+ throw new RuntimeException("action " + key + " already registered");
+ }
+ if (value.checkSelectionOnPropertyChange()) {
+ final ActionSelectorOnPropertyChange listener = new ActionSelectorOnPropertyChange(value);
+ ResourceController.getResourceController().addPropertyChangeListener(listener);
+ }
+ }
+
+ public void addActionIfNotAlreadySet(AFreeplaneAction action) {
+ if(getAction(action.getKey())== null)
+ addAction(action);
+ }
+
+ public AFreeplaneAction getAction(final String key) {
+ return getActions().get(key);
+ }
+
+ protected Map<String, AFreeplaneAction> getActions() {
+ return actions;
+ }
+
+ public Set<String> getActionKeys(){
+ return actions.keySet();
+ }
+
+ public AFreeplaneAction removeAction(final String key) {
+ final AFreeplaneAction action = getActions().remove(key);
+ if (action.checkSelectionOnPropertyChange()) {
+ ResourceController.getResourceController().removePropertyChangeListener(
+ ActionSelectorOnPropertyChange.class, action);
+ }
+ return action;
+ }
+
+ public AFreeplaneAction removeActionIfSet(final String key) {
+ if(getAction(key) != null ){
+ return removeAction(key);
+ }
+ else
+ return null;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/mode/CenterSelectedNodeAction.java b/freeplane/src/main/java/org/freeplane/features/mode/CenterSelectedNodeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/CenterSelectedNodeAction.java
rename to freeplane/src/main/java/org/freeplane/features/mode/CenterSelectedNodeAction.java
diff --git a/freeplane/src/org/freeplane/features/mode/CombinedPropertyChain.java b/freeplane/src/main/java/org/freeplane/features/mode/CombinedPropertyChain.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/CombinedPropertyChain.java
rename to freeplane/src/main/java/org/freeplane/features/mode/CombinedPropertyChain.java
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/Controller.java b/freeplane/src/main/java/org/freeplane/features/mode/Controller.java
new file mode 100644
index 0000000..2a529d1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/Controller.java
@@ -0,0 +1,292 @@
+
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode;
+
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.io.IOExceptionWithCause;
+import org.freeplane.core.extension.ExtensionContainer;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.OptionPanelController;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.IValidator;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.main.application.ApplicationLifecycleListener;
+
+/**
+ * Provides the methods to edit/change a Node. Forwards all messages to
+ * MapModel(editing) or MapView(navigation).
+ */
+public class Controller extends AController implements FreeplaneActions{
+ private final ExtensionContainer extensionContainer;
+ /**
+ * Converts from a local link to the real file URL of the documentation map.
+ * (Used to change this behavior under MacOSX).
+ */
+ private ModeController modeController;
+ private ModeController modeController4build;
+ final private Map<String, ModeController> modeControllers = new LinkedHashMap<String, ModeController>();
+ private ViewController viewController;
+ private final ResourceController resourceController;
+ private final List<IValidator> optionValidators = new ArrayList<IValidator>();
+ private final OptionPanelController optionPanelController;
+ private IMapViewManager mapViewManager;
+ private List<ApplicationLifecycleListener> applicationLifecycleListeners = new ArrayList<ApplicationLifecycleListener>(0);
+
+ public Controller(ResourceController resourceController) {
+ super();
+ if(currentController == null){
+ currentController = this;
+ }
+ this.resourceController = resourceController;
+ this.optionPanelController = new OptionPanelController();
+ extensionContainer = new ExtensionContainer(new HashMap<Class<? extends IExtension>, IExtension>());
+ addAction(new MoveToRootAction());
+ addAction(new CenterSelectedNodeAction());
+ }
+
+ public void addExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
+ extensionContainer.addExtension(clazz, extension);
+ }
+
+ public void addModeController(final ModeController modeController) {
+ modeControllers.put(modeController.getModeName(), modeController);
+ }
+
+ /**
+ * Closes the actual map.
+ *
+ * @param withoutSave
+ * true= without save.
+ */
+ public void close(final boolean withoutSave) {
+ getMapViewManager().close(withoutSave);
+ }
+
+ public <T extends IExtension> T getExtension(final Class<T> clazz){
+ return extensionContainer.getExtension(clazz);
+ }
+
+ /**
+ * @return
+ */
+ public MapModel getMap() {
+ return getMapViewManager().getModel();
+ }
+
+ public IMapViewManager getMapViewManager() {
+ return mapViewManager;
+ }
+
+ public void setMapViewManager(IMapViewManager mapViewManager) {
+ this.mapViewManager = mapViewManager;
+ }
+
+ /** @return the current modeController. */
+ public ModeController getModeController() {
+ return modeController4build != null ? modeController4build : modeController;
+ }
+
+ public ModeController getModeController(final String modeName) {
+ return modeControllers.get(modeName);
+ }
+
+ public Set<String> getModes() {
+ return modeControllers.keySet();
+ }
+
+ public IMapSelection getSelection() {
+ return getMapViewManager().getMapSelection();
+ }
+
+ /**
+ * @return
+ */
+ public ViewController getViewController() {
+ return viewController;
+ }
+
+ public void quit() {
+ if (shutdown()) {
+ System.exit(0);
+ }
+ }
+
+ /**
+ * @param actionEvent
+ */
+ public void quit(final ActionEvent actionEvent) {
+ getActions().get("QuitAction").actionPerformed(actionEvent);
+ }
+
+ public void selectMode(ModeController newModeController) {
+ modeController4build = null;
+ final ModeController oldModeController = modeController;
+ if (oldModeController == newModeController) {
+ return;
+ }
+ if (oldModeController != null) {
+ oldModeController.shutdown();
+ }
+ LogUtils.info("requesting mode: " + newModeController.getModeName());
+ modeController = newModeController;
+ viewController.selectMode(oldModeController, newModeController);
+ getMapViewManager().changeToMode(newModeController.getModeName());
+ newModeController.startup();
+ }
+
+ public void selectMode(final String modeName) {
+ final ModeController newModeController = modeControllers.get(modeName);
+ if (newModeController == null) {
+ return;
+ }
+ if (modeController == newModeController) {
+ return;
+ }
+ selectMode(newModeController);
+ }
+
+ public void setViewController(final ViewController viewController) {
+ this.viewController = viewController;
+ }
+
+ public boolean shutdown() {
+ getViewController().saveProperties();
+ ResourceController.getResourceController().saveProperties();
+ if (!getViewController().quit()) {
+ return false;
+ }
+ extensionContainer.getExtensions().clear();
+ return true;
+ }
+
+ public static void exec(final String string) throws IOException {
+ exec(string, false);
+ }
+
+ public static void exec(final String string, boolean waitFor) throws IOException {
+ IControllerExecuteExtension ext = Controller.getCurrentController().getExtension(IControllerExecuteExtension.class);
+ if(ext == null) {
+ ext = Controller.getCurrentController().getDefaultExecuter();
+ }
+
+ ext.exec(string, waitFor);
+ }
+
+ public static void exec(final String[] command) throws IOException {
+ exec(command, false);
+ }
+
+ public static void exec(final String[] command, boolean waitFor) throws IOException {
+ IControllerExecuteExtension ext = Controller.getCurrentController().getExtension(IControllerExecuteExtension.class);
+ if(ext == null) {
+ ext = Controller.getCurrentController().getDefaultExecuter();
+ }
+
+ ext.exec(command, waitFor);
+ }
+
+ private IControllerExecuteExtension getDefaultExecuter() {
+ return new IControllerExecuteExtension() {
+
+ public void exec(String[] command, boolean waitFor) throws IOException {
+ LogUtils.info("execute " + Arrays.toString(command));
+ Process proc = Runtime.getRuntime().exec(command);
+ waiting(waitFor, proc);
+ }
+
+ public void exec(String string, boolean waitFor) throws IOException {
+ LogUtils.info("execute " + string);
+ Process proc = Runtime.getRuntime().exec(string);
+ waiting(waitFor, proc);
+ }
+
+ private void waiting(boolean waitFor, Process proc)
+ throws IOExceptionWithCause {
+ if(waitFor) {
+ try {
+ proc.waitFor();
+ } catch (InterruptedException e) {
+ throw new IOExceptionWithCause(e);
+ }
+ }
+ }
+ };
+ }
+
+ private static ThreadLocal<Controller> threadController = new ThreadLocal<Controller>();
+ private static Controller currentController = null;
+ public static Controller getCurrentController() {
+ final Controller controller = threadController.get();
+ return controller != null ? controller : currentController;
+ }
+
+ public static void setCurrentController(final Controller controller){
+ currentController = controller;
+ }
+
+ public static ModeController getCurrentModeController() {
+ return getCurrentController().getModeController();
+ }
+
+ public void selectModeForBuild(ModeController modeController4build) {
+ this.modeController4build = modeController4build;
+
+ }
+
+ public ResourceController getResourceController() {
+ return resourceController;
+ }
+
+ public void addOptionValidator(IValidator validator) {
+ optionValidators.add(validator);
+ }
+
+ public List<IValidator> getOptionValidators() {
+ return optionValidators;
+ }
+
+ public OptionPanelController getOptionPanelController() {
+ return optionPanelController;
+ }
+
+ /** returns an unmodifiableList. */
+ public List<ApplicationLifecycleListener> getApplicationLifecycleListeners() {
+ return Collections.unmodifiableList(applicationLifecycleListeners);
+ }
+
+ public void addApplicationLifecycleListener(ApplicationLifecycleListener applicationLifecycleListener) {
+ this.applicationLifecycleListeners.add(applicationLifecycleListener);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/ExclusivePropertyChain.java b/freeplane/src/main/java/org/freeplane/features/mode/ExclusivePropertyChain.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/ExclusivePropertyChain.java
rename to freeplane/src/main/java/org/freeplane/features/mode/ExclusivePropertyChain.java
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/FreeplaneActions.java b/freeplane/src/main/java/org/freeplane/features/mode/FreeplaneActions.java
new file mode 100644
index 0000000..498c0d0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/FreeplaneActions.java
@@ -0,0 +1,11 @@
+package org.freeplane.features.mode;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+
+public interface FreeplaneActions {
+ public void addAction(final AFreeplaneAction action);
+ public AFreeplaneAction getAction(final String key);
+ AFreeplaneAction removeActionIfSet(final String key);
+ AFreeplaneAction removeAction(final String key);
+ void addActionIfNotAlreadySet(AFreeplaneAction action);
+}
diff --git a/freeplane/src/org/freeplane/features/mode/IControllerExecuteExtension.java b/freeplane/src/main/java/org/freeplane/features/mode/IControllerExecuteExtension.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/IControllerExecuteExtension.java
rename to freeplane/src/main/java/org/freeplane/features/mode/IControllerExecuteExtension.java
diff --git a/freeplane/src/org/freeplane/features/mode/IPropertyHandler.java b/freeplane/src/main/java/org/freeplane/features/mode/IPropertyHandler.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/IPropertyHandler.java
rename to freeplane/src/main/java/org/freeplane/features/mode/IPropertyHandler.java
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/ModeController.java b/freeplane/src/main/java/org/freeplane/features/mode/ModeController.java
new file mode 100644
index 0000000..50d8693
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/ModeController.java
@@ -0,0 +1,449 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.freeplane.core.extension.ExtensionContainer;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.html.CssRuleBuilder;
+import org.freeplane.core.ui.menubuilders.generic.BuilderDestroyerPair;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.features.map.IExtensionCopier;
+import org.freeplane.features.map.ITooltipProvider;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.ui.INodeViewLifeCycleListener;
+
+/**
+ * Derive from this class to implement the Controller for your mode. Overload
+ * the methods you need for your data model, or use the defaults. There are some
+ * default Actions you may want to use for easy editing of your model. Take
+ * MindMapController as a sample.
+ */
+public class ModeController extends AController implements FreeplaneActions{
+// // final private Controller controller;
+ private final ExtensionContainer extensionContainer;
+ private final Collection<IExtensionCopier> copiers;
+ private boolean isBlocked = false;
+ private MapController mapController;
+ final private Map<Integer, ITooltipProvider> toolTip = new TreeMap<Integer, ITooltipProvider>();
+ /**
+ * The model, this controller belongs to. It may be null, if it is the
+ * default controller that does not show a map.
+ */
+ final private List<INodeViewLifeCycleListener> nodeViewListeners = new LinkedList<INodeViewLifeCycleListener>();
+ /**
+ * Take care! This listener is also used for modelpopups (as for graphical
+ * links).
+ */
+ private IUserInputListenerFactory userInputListenerFactory;
+ final private Controller controller;
+
+ /**
+ * Instantiation order: first me and then the model.
+ */
+ public ModeController(final Controller controller) {
+ this.controller = controller;
+ extensionContainer = new ExtensionContainer(new HashMap<Class<? extends IExtension>, IExtension>());
+ copiers = new LinkedList<IExtensionCopier>();
+ }
+
+ @Override
+ public void addAction(final AFreeplaneAction action) {
+ super.addAction(action);
+ if (mapController != null) {
+ mapController.addListenerForAction(action);
+ }
+ }
+
+
+ public void addExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
+ extensionContainer.addExtension(clazz, extension);
+ }
+
+ public void registerExtensionCopier(final IExtensionCopier copier) {
+ copiers.add(copier);
+ }
+
+ public void unregisterExtensionCopier(final IExtensionCopier copier) {
+ copiers.remove(copier);
+ }
+
+ public void copyExtensions(final Object key, final NodeModel from, final NodeModel to) {
+ for (final IExtensionCopier copier : copiers) {
+ copier.copy(key, from, to);
+ }
+ }
+
+ public void undoableCopyExtensions(final Object key, final NodeModel from, final NodeModel to) {
+ final MapModel map = to.getMap();
+ if (map == null) {
+ copyExtensions(key, from, to);
+ return;
+ }
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ if (undoHandler == null) {
+ copyExtensions(key, from, to);
+ return;
+ }
+ final NodeModel backup = new NodeModel(null);
+ copyExtensions(key, to, backup);
+ final IActor actor = new IActor() {
+ public void undo() {
+ removeExtensions(key, to);
+ copyExtensions(key, backup, to);
+ getMapController().nodeChanged(to);
+ }
+
+ public String getDescription() {
+ return "undoableCopyExtensions";
+ }
+
+ public void act() {
+ copyExtensions(key, from, to);
+ getMapController().nodeChanged(to);
+ }
+ };
+ execute(actor, map);
+ }
+
+ void removeExtensions(final Object key, final NodeModel from, final NodeModel which) {
+ if (from.equals(which)) {
+ for (final IExtensionCopier copier : copiers) {
+ copier.remove(key, from);
+ }
+ return;
+ }
+ for (final IExtensionCopier copier : copiers) {
+ copier.remove(key, from, which);
+ }
+ }
+
+ public void undoableRemoveExtensions(final Object key, final NodeModel from, final NodeModel which) {
+ final MapModel map = from.getMap();
+ if (map == null) {
+ removeExtensions(key, from, which);
+ return;
+ }
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ if (undoHandler == null) {
+ removeExtensions(key, from, which);
+ return;
+ }
+ final NodeModel backup = new NodeModel(null);
+ copyExtensions(key, from, backup);
+ final IActor actor = new IActor() {
+ public void undo() {
+ copyExtensions(key, backup, from);
+ getMapController().nodeChanged(from);
+ }
+
+ public String getDescription() {
+ return "undoableCopyExtensions";
+ }
+
+ public void act() {
+ removeExtensions(key, from, which);
+ getMapController().nodeChanged(from);
+ }
+ };
+ execute(actor, map);
+ }
+
+ public void resolveParentExtensions(final Object key, final NodeModel to) {
+ for (final IExtensionCopier copier : copiers) {
+ copier.resolveParentExtensions(key, to);
+ }
+ }
+
+ public void undoableResolveParentExtensions(final Object key, final NodeModel to) {
+ final MapModel map = to.getMap();
+ if (map == null) {
+ resolveParentExtensions(key, to);
+ return;
+ }
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ if (undoHandler == null) {
+ resolveParentExtensions(key, to);
+ return;
+ }
+ final NodeModel backup = new NodeModel(null);
+ copyExtensions(key, to, backup);
+ final IActor actor = new IActor() {
+ public void undo() {
+ copyExtensions(key, backup, to);
+ getMapController().nodeChanged(to);
+ }
+
+ public String getDescription() {
+ return "undoableCopyExtensions";
+ }
+
+ public void act() {
+ resolveParentExtensions(key, to);
+ getMapController().nodeChanged(to);
+ }
+ };
+ execute(actor, map);
+ }
+
+ void removeExtensions(final Object key, final NodeModel from) {
+ for (final IExtensionCopier copier : copiers) {
+ copier.remove(key, from, from);
+ }
+ }
+
+ public void addINodeViewLifeCycleListener(final INodeViewLifeCycleListener listener) {
+ nodeViewListeners.add(listener);
+ }
+ public void addUiBuilder(Phase phase, String name, EntryVisitor builder) {
+ addUiBuilder(phase, name, new BuilderDestroyerPair(builder));
+ }
+
+ public void addUiBuilder(Phase phase, String name, EntryVisitor builder, EntryVisitor destroyer) {
+ addUiBuilder(phase, name, new BuilderDestroyerPair(builder, destroyer));
+ }
+
+ public void addUiBuilder(Phase phase, String name, BuilderDestroyerPair builderDestroyerPair) {
+ getUserInputListenerFactory().addUiBuilder(phase, name, builderDestroyerPair);
+ }
+
+
+ public void commit() {
+ }
+
+ public boolean isUndoAction() {
+ return false;
+ }
+
+ public void execute(final IActor actor, final MapModel map) {
+ actor.act();
+ }
+
+ @Override
+ public AFreeplaneAction getAction(final String key) {
+ final AFreeplaneAction action = super.getAction(key);
+ if (action != null) {
+ return action;
+ }
+ return getController().getAction(key);
+ }
+
+ public Controller getController() {
+ return controller;
+ }
+
+ public <T extends IExtension> T getExtension(final Class<T> clazz) {
+ return extensionContainer.getExtension(clazz);
+ }
+
+ public boolean containsExtension(final Class<? extends IExtension> clazz) {
+ return extensionContainer.containsExtension(clazz);
+ }
+
+ public void removeExtension(Class<? extends IExtension> clazz) {
+ extensionContainer.removeExtension(clazz);
+ }
+ public MapController getMapController() {
+ return mapController;
+ }
+
+ public String getModeName() {
+ return null;
+ }
+
+ public IUserInputListenerFactory getUserInputListenerFactory() {
+ return userInputListenerFactory;
+ }
+
+ public boolean hasOneVisibleChild(final NodeModel parent) {
+ int count = 0;
+ for (final NodeModel child : getMapController().childrenUnfolded(parent)) {
+ if (child.hasVisibleContent()) {
+ count++;
+ }
+ if (count == 2) {
+ return false;
+ }
+ }
+ return count == 1;
+ }
+
+ public boolean isBlocked() {
+ return isBlocked;
+ }
+
+ public void onViewCreated(final Container node) {
+ for (final INodeViewLifeCycleListener hook : nodeViewListeners) {
+ hook.onViewCreated(node);
+ }
+ }
+
+ public void onViewRemoved(final Container node) {
+ for (final INodeViewLifeCycleListener hook : nodeViewListeners) {
+ hook.onViewRemoved(node);
+ }
+ }
+
+ @Override
+ public AFreeplaneAction removeAction(final String key) {
+ final AFreeplaneAction action = super.removeAction(key);
+ if (mapController != null) {
+ mapController.removeListenerForAction(action);
+ }
+ return action;
+ }
+
+ public void removeINodeViewLifeCycleListener(final INodeViewLifeCycleListener listener) {
+ nodeViewListeners.remove(listener);
+ }
+
+ public void rollback() {
+ }
+
+ public void setBlocked(final boolean isBlocked) {
+ this.isBlocked = isBlocked;
+ }
+
+ public void setMapController(final MapController mapController) {
+ this.mapController = mapController;
+ addExtension(MapController.class, mapController);
+ }
+
+ public void setUserInputListenerFactory(final IUserInputListenerFactory userInputListenerFactory) {
+ this.userInputListenerFactory = userInputListenerFactory;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.modes.ModeController#setVisible(boolean)
+ */
+ public void setVisible(final boolean visible) {
+ final NodeModel node = getController().getSelection().getSelected();
+ if (visible) {
+ mapController.onSelect(node);
+ }
+ else {
+ if (node != null) {
+ mapController.onDeselect(node);
+ }
+ }
+ }
+
+ public void shutdown() {
+ }
+
+ public void startTransaction() {
+ }
+ public void forceNewTransaction() {
+ }
+
+ /**
+ * This method is called after and before a change of the map mapView. Use
+ * it to perform the actions that cannot be performed at creation time.
+ */
+ public void startup() {
+ }
+
+ public void updateMenus(String menuStructure, final Set<String> plugins) {
+ final IUserInputListenerFactory userInputListenerFactory = getUserInputListenerFactory();
+ userInputListenerFactory.updateMenus(menuStructure, plugins);
+ userInputListenerFactory.getAcceleratorManager().loadAcceleratorPresets();
+ }
+
+ public boolean canEdit() {
+ return false;
+ }
+ public String createToolTip(final NodeModel node, Component view) {
+ final MapModel map = node.getMap();
+ // perhaps we should use the solution presented in the 3rd answer at
+ // http://stackoverflow.com/questions/3355469/1-pixel-table-border-in-jtextpane-using-html
+ // html/css example: http://www.wer-weiss-was.de/theme35/article3555660.html
+ final Color background = getExtension(MapStyle.class).getBackground(map);
+ final StringBuilder style = new StringBuilder( "<style type='text/css'>")
+ .append(" body { font-size: 10pt;") // FIXME: copy from NoteController.setNoteTooltip() ?
+ .append(new CssRuleBuilder().withBackground(background))
+ .append(" }</style>");
+ final StringBuilder text = new StringBuilder("<html><head>"+style+"</head><body>");
+ boolean tooltipSet = false;
+ for (final ITooltipProvider provider : toolTip.values()) {
+ String value = provider.getTooltip(this, node, view);
+ if (value == null) {
+ continue;
+ }
+ value = value.replace("<html>", "<div>");
+ value = value.replaceAll("\\s*</?(body|head)>", "");
+ value = value.replace("</html>", "</div>");
+ if (tooltipSet) {
+ text.append("<hr>");
+ }
+ text.append(value);
+ tooltipSet = true;
+ }
+ if (tooltipSet) {
+ text.append("</body></html>");
+// System.err.println("tooltip=" + text);
+ return text.toString();
+ }
+ return null;
+ }
+
+ /**
+ */
+ public void addToolTipProvider(final Integer key, final ITooltipProvider tooltip) {
+ if (tooltip == null) {
+ if (toolTip.containsKey(key)) {
+ toolTip.remove(key);
+ }
+ }
+ else {
+ toolTip.put(key, tooltip);
+ }
+ }
+
+ public boolean canEdit(NodeModel model) {
+ return true;
+ }
+
+ public boolean supportsHookActions() {
+ return false;
+ }
+
+ public boolean shouldCenterCompactMaps() {
+ return true;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/MoveToRootAction.java b/freeplane/src/main/java/org/freeplane/features/mode/MoveToRootAction.java
new file mode 100644
index 0000000..70baa96
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/MoveToRootAction.java
@@ -0,0 +1,51 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.view.swing.map.NodeView;
+
+class MoveToRootAction extends AFreeplaneAction {
+ static final String NAME = "moveToRoot";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ MoveToRootAction() {
+ super("MoveToRootAction");
+ }
+
+ public void actionPerformed(final ActionEvent event) {
+ Controller ctrl = Controller.getCurrentController();
+ final IMapSelection selection = ctrl.getSelection();
+ if (selection != null) {
+ final NodeView selectedComponent = (NodeView) ctrl.getMapViewManager().getSelectedComponent();
+ if (!selectedComponent.focused() && java.awt.EventQueue.getCurrentEvent() instanceof KeyEvent)
+ selectedComponent.requestFocusInWindow();
+ else
+ selection.selectRoot();
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/NodeHookDescriptor.java b/freeplane/src/main/java/org/freeplane/features/mode/NodeHookDescriptor.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/NodeHookDescriptor.java
rename to freeplane/src/main/java/org/freeplane/features/mode/NodeHookDescriptor.java
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/PersistentNodeHook.java b/freeplane/src/main/java/org/freeplane/features/mode/PersistentNodeHook.java
new file mode 100644
index 0000000..6813159
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/PersistentNodeHook.java
@@ -0,0 +1,469 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode;
+
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IElementHandler;
+import org.freeplane.core.io.IExtensionElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public abstract class PersistentNodeHook {
+ static private Set<Class<? extends IExtension>> mapExtensionClasses = new HashSet<Class<? extends IExtension>>();
+
+ public static boolean isMapExtension(final Class<? extends IExtension> clazz) {
+ return mapExtensionClasses.contains(clazz);
+ }
+
+ public abstract class HookAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public HookAction(final String key) {
+ super(key);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ undoableSetHookForSelection(!isActiveForSelection());
+ }
+ }
+
+ @SelectableAction(checkOnNodeChange = true)
+ protected class SelectableHookAction extends HookAction {
+ private static final long serialVersionUID = 1L;
+
+ public SelectableHookAction(final String key) {
+ super(key);
+ // System.out.println("SelectableHookAction " + key);
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ setSelected(!isActiveForSelection());
+ super.actionPerformed(e);
+ setSelected(isActiveForSelection());
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(isActiveForSelection());
+ }
+ }
+
+
+ @SelectableAction(checkOnNodeChange = true)
+ protected class SelectableEnumAction extends HookAction {
+ private static final long serialVersionUID = 1L;
+ final Enum<?> value;
+ public SelectableEnumAction(String key, final Enum<?> value) {
+ super(key + "." + String.valueOf(value));
+ this.value = value;
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ undoableSetHookForSelection(false);
+ if(value != null)
+ undoableSetHookForSelection((IExtension)value);
+ setSelected(true);
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(isActiveForSelection(value));
+ }
+ }
+
+ private final class ToggleHookActor implements IActor {
+ IExtension extension;
+ private final NodeModel node;
+
+ private ToggleHookActor(final NodeModel node, final IExtension extension) {
+ this.node = node;
+ this.extension = extension != null ? extension : node.getExtension(getExtensionClass());
+ }
+
+ public void act() {
+ extension = toggle(node, extension);
+ }
+
+ public String getDescription() {
+ return getHookName();
+ }
+
+ public void undo() {
+ act();
+ }
+ }
+
+ protected class XmlReader implements IElementDOMHandler {
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (attributes == null) {
+ return null;
+ }
+ if (!getHookName().equals(attributes.getAttribute("NAME", null))) {
+ return null;
+ }
+ return parent;
+ }
+
+ public void endElement(final Object parent, final String tag, final Object userObject,
+ final XMLElement lastBuiltElement) {
+ if (getHookAnnotation().onceForMap()) {
+ final XMLElement parentNodeElement = lastBuiltElement.getParent().getParent();
+ if (parentNodeElement == null || !parentNodeElement.getName().equals("map")) {
+ return;
+ }
+ }
+ final NodeModel node = (NodeModel) userObject;
+ if (node.getExtension(getExtensionClass()) != null) {
+ return;
+ }
+ final IExtension extension = createExtension(node, lastBuiltElement);
+ if (extension == null) {
+ return;
+ }
+ add(node, extension);
+ }
+ }
+
+ protected class XmlWriter implements IExtensionElementWriter {
+ public void writeContent(final ITreeWriter writer, final Object object, final IExtension extension)
+ throws IOException {
+ final XMLElement element = new XMLElement("hook");
+ try {
+ saveExtension(extension, element);
+ writer.addElement(null, element);
+ }
+ catch (final Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public PersistentNodeHook() {
+ super();
+ final Class<? extends IExtension> extensionClass = getExtensionClass();
+ if (getHookAnnotation().onceForMap()) {
+ mapExtensionClasses.add(extensionClass);
+ }
+ // this.modeController = modeController;
+ // controller = modeController.getController();
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (modeController.supportsHookActions())
+ registerActions();
+ final MapController mapController = modeController.getMapController();
+ mapController.getReadManager().addElementHandler("hook", createXmlReader());
+ final IExtensionElementWriter xmlWriter = createXmlWriter();
+ if (xmlWriter != null) {
+ mapController.getWriteManager().addExtensionElementWriter(extensionClass, xmlWriter);
+ }
+ if (this instanceof IExtension) {
+ // do not use getExtensionClass() here since in several subclasses getExtensionClass() returns a
+ // different class than getClass()
+ modeController.addExtension((Class<? extends IExtension>) getClass(), (IExtension) this);
+ }
+ }
+
+ protected void registerActions() {
+ final Class<? extends IExtension> extensionClass = getExtensionClass();
+ if(extensionClass.isEnum()){
+ Class<Enum> enumClass = (Class<Enum>) (Class<?>)extensionClass;
+ EnumSet<? extends Enum<?>> all= EnumSet.allOf(enumClass);
+ for(Enum e : all){
+ registerAction(new SelectableEnumAction(getClass().getSimpleName() + "Action", e));
+ }
+ registerAction(new SelectableEnumAction(getClass().getSimpleName() + "Action", null));
+ }
+ else{
+ final HookAction selectableHookAction = createHookAction();
+ if (selectableHookAction != null) {
+ registerAction(selectableHookAction);
+ }
+ }
+ }
+
+ protected void add(final NodeModel node, final IExtension extension) {
+ assert (getExtensionClass().equals(extension.getClass()));
+ node.addExtension(extension);
+ }
+
+ protected IExtension createExtension(final NodeModel node) {
+ return createExtension(node, null);
+ }
+
+ protected IExtension createExtension(final NodeModel node, final XMLElement element){
+ try {
+ final Class<? extends IExtension> extensionClass = getExtensionClass();
+ if(extensionClass.isEnum()){
+ final String value = element.getAttribute("VALUE");
+ final Method factory = extensionClass.getMethod("valueOf", String.class);
+ return (IExtension)factory.invoke(null, value);
+
+ }
+ return extensionClass.newInstance();
+ }
+ catch (SecurityException e) {
+ e.printStackTrace();
+ }
+ catch (Exception e) {
+ }
+ return null;
+ }
+
+ protected HookAction createHookAction() {
+ return new SelectableHookAction(getClass().getSimpleName() + "Action");
+ }
+
+ protected IElementHandler createXmlReader() {
+ return new XmlReader();
+ }
+
+ protected IExtensionElementWriter createXmlWriter() {
+ return new XmlWriter();
+ }
+
+ @SuppressWarnings("unchecked")
+ protected Class<? extends IExtension> getExtensionClass() {
+ return (Class<? extends IExtension>) getClass();
+ }
+
+ private NodeHookDescriptor getHookAnnotation() {
+ final NodeHookDescriptor annotation = getClass().getAnnotation(NodeHookDescriptor.class);
+ return annotation;
+ }
+
+ protected String getHookName() {
+ return getHookAnnotation().hookName();
+ }
+
+ public IExtension getMapHook(final MapModel map) {
+ final NodeModel rootNode = map.getRootNode();
+ return rootNode.getExtension(getExtensionClass());
+ }
+
+ protected NodeModel[] getNodesForSelection() {
+ if (getHookAnnotation().onceForMap()) {
+ return getRootNodeForSelection();
+ }
+ return getSelectedNodes();
+ }
+
+ protected NodeModel[] getRootNodeForSelection() {
+ final NodeModel[] nodes = new NodeModel[1];
+ nodes[0] = Controller.getCurrentController().getMap().getRootNode();
+ return nodes;
+ }
+
+ protected NodeModel[] getSelectedNodes() {
+ final IMapSelection mapSelection = Controller.getCurrentController().getSelection();
+ if(mapSelection != null) {
+ final Collection<NodeModel> selection = mapSelection.getSelection();
+ final int size = selection.size();
+ final NodeModel[] nodes= new NodeModel[size];
+ final Iterator<NodeModel> iterator = selection.iterator();
+ int i = 0;
+ while (iterator.hasNext()) {
+ nodes[i++] = iterator.next();
+ }
+ return nodes;
+ }
+ else
+ return new NodeModel[]{};
+ }
+
+ public boolean isActive(final NodeModel nodeModel) {
+ if (!nodeModel.isRoot() && getHookAnnotation().onceForMap()) {
+ return isActive(nodeModel.getMap().getRootNode());
+ }
+ return nodeModel.containsExtension(getExtensionClass());
+ }
+
+ public IExtension getExtension(final NodeModel nodeModel) {
+ if (!nodeModel.isRoot() && getHookAnnotation().onceForMap()) {
+ return getExtension(nodeModel.getMap().getRootNode());
+ }
+ return nodeModel.getExtension(getExtensionClass());
+ }
+
+ protected boolean isActiveForSelection() {
+ final NodeModel[] nodes = getNodesForSelection();
+ for (int i = 0; i < nodes.length; i++) {
+ final NodeModel nodeModel = nodes[i];
+ if (nodeModel.containsExtension(getExtensionClass())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ private boolean isActiveForSelection(Enum<?> value) {
+ final NodeModel[] nodes = getNodesForSelection();
+ for (int i = 0; i < nodes.length; i++) {
+ final NodeModel nodeModel = nodes[i];
+ final IExtension nodeValue = nodeModel.getExtension(getExtensionClass());
+ if (value == null && nodeValue != null || value != null && !value.equals(nodeValue)) {
+ return false;
+ }
+ }
+ return true;
+ }
+ protected void registerAction(final AFreeplaneAction action) {
+ Controller.getCurrentModeController().addAction(action);
+ }
+
+ protected void remove(final NodeModel node, final IExtension extension) {
+ node.removeExtension(extension);
+ }
+
+ protected void saveExtension(final IExtension extension, final XMLElement element) {
+ element.setAttribute("NAME", getHookName());
+ if(extension instanceof Enum){
+ element.setAttribute("VALUE", extension.toString());
+ }
+ }
+
+ public void undoableActivateHook(final NodeModel node, final IExtension extension) {
+ if (! node.containsExtension(extension.getClass())) {
+ undoableToggleHook(node, extension);
+ }
+ }
+
+ public void undoableDeactivateHook(final NodeModel node) {
+ final IExtension extension = node.getExtension(getExtensionClass());
+ if (extension != null) {
+ undoableToggleHook(node, extension);
+ }
+ }
+
+ public void undoableSetHookForSelection(final boolean enable) {
+ final NodeModel[] nodes = getNodesForSelection();
+ for (int i = 0; i < nodes.length; i++) {
+ final NodeModel node = nodes[i];
+ if (node.containsExtension(getExtensionClass()) != enable) {
+ undoableToggleHook(node);
+ }
+ }
+ }
+
+ public void undoableSetHookForSelection(final IExtension extension) {
+ final NodeModel[] nodes = getNodesForSelection();
+ for (int i = 0; i < nodes.length; i++) {
+ final NodeModel node = nodes[i];
+ if (extension != null || node.containsExtension(getExtensionClass())) {
+ undoableToggleHook(node, extension);
+ }
+ }
+ }
+
+ public void undoableToggleHook(final NodeModel node) {
+ undoableToggleHook(node, node.getExtension(getExtensionClass()));
+ }
+
+ public void undoableToggleHook(final NodeModel node, final IExtension extension) {
+ final IActor actor = new ToggleHookActor(node, extension);
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ protected IExtension toggle(final NodeModel node, IExtension extension) {
+ final IExtension before;
+ final IExtension after;
+ if (extension != null && node.containsExtension(extension.getClass())) {
+ before = extension;
+ after = null;
+ remove(node, extension);
+ }
+ else {
+ if (extension == null) {
+ extension = createExtension(node);
+ }
+ if (extension != null) {
+ add(node, extension);
+ }
+ before = null;
+ after = extension;
+ }
+ Controller.getCurrentModeController().getMapController()
+ .nodeChanged(node, getExtensionClass(), before, after);
+ return extension;
+ }
+
+ public static void removeMapExtensions(NodeModel node) {
+ final IExtension[] extensionArray = node.getSharedExtensions().values().toArray(new IExtension[]{});
+ for(IExtension extension : extensionArray){
+ if(PersistentNodeHook.isMapExtension(extension.getClass())){
+ node.removeExtension(extension);
+ }
+ }
+ }
+
+ public void moveExtension(ModeController modeController, MapModel sourceMap, MapModel targetMap) {
+ final NodeModel sourceNode = sourceMap.getRootNode();
+ final Class<? extends IExtension> extensionClass = getExtensionClass();
+ final IExtension sourceExtension = sourceNode.getExtension(extensionClass);
+ final NodeModel targetNode = targetMap.getRootNode();
+ final IExtension targetExtension = targetNode.getExtension(extensionClass);
+ if(sourceExtension == targetExtension)
+ return;
+ IActor actor = new IActor() {
+ @Override
+ public void act() {
+ if(targetExtension != null)
+ targetNode.removeExtension(targetExtension);
+ if(sourceExtension != null)
+ targetNode.addExtension(sourceExtension);
+ }
+
+ @Override
+ public void undo() {
+ if(sourceExtension != null)
+ targetNode.removeExtension(sourceExtension);
+ if(targetExtension != null)
+ targetNode.addExtension(targetExtension);
+ }
+
+ @Override
+ public String getDescription() {
+ return "move extension " + extensionClass.getName();
+ }
+
+ };
+ modeController.execute(actor, targetMap);
+
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/QuitAction.java b/freeplane/src/main/java/org/freeplane/features/mode/QuitAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/QuitAction.java
rename to freeplane/src/main/java/org/freeplane/features/mode/QuitAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/SelectionController.java b/freeplane/src/main/java/org/freeplane/features/mode/SelectionController.java
new file mode 100644
index 0000000..ed9ada4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/SelectionController.java
@@ -0,0 +1,71 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 12, 2009
+ */
+public class SelectionController {
+ final private LinkedList<INodeSelectionListener> nodeSelectionListeners;
+
+ public SelectionController() {
+ super();
+ nodeSelectionListeners = new LinkedList<INodeSelectionListener>();
+ }
+
+ public void addNodeSelectionListener(final INodeSelectionListener listener) {
+ nodeSelectionListeners.add(listener);
+ }
+
+ public LinkedList<INodeSelectionListener> getNodeSelectionListeners() {
+ return nodeSelectionListeners;
+ }
+
+ public void onDeselect(final NodeModel node) {
+ try {
+ final ArrayList<INodeSelectionListener> copy = new ArrayList<INodeSelectionListener>(nodeSelectionListeners);
+ for (final INodeSelectionListener listener : copy) {
+ listener.onDeselect(node);
+ }
+ }
+ catch (final RuntimeException e) {
+ LogUtils.severe("Error in node selection listeners", e);
+ }
+ }
+
+ public void onSelect(final NodeModel node) {
+ final ArrayList<INodeSelectionListener> copy = new ArrayList<INodeSelectionListener>(nodeSelectionListeners);
+ for (final INodeSelectionListener listener : copy) {
+ listener.onSelect(node);
+ }
+ }
+
+ public void removeNodeSelectionListener(final INodeSelectionListener listener) {
+ nodeSelectionListeners.remove(listener);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/browsemode/BModeController.java b/freeplane/src/main/java/org/freeplane/features/mode/browsemode/BModeController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/browsemode/BModeController.java
rename to freeplane/src/main/java/org/freeplane/features/mode/browsemode/BModeController.java
diff --git a/freeplane/src/org/freeplane/features/mode/filemode/FModeController.java b/freeplane/src/main/java/org/freeplane/features/mode/filemode/FModeController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/filemode/FModeController.java
rename to freeplane/src/main/java/org/freeplane/features/mode/filemode/FModeController.java
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/LoadAcceleratorPresetsAction.java b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/LoadAcceleratorPresetsAction.java
new file mode 100644
index 0000000..31e8ddc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/LoadAcceleratorPresetsAction.java
@@ -0,0 +1,146 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ActionAcceleratorManager;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.generic.ChildActionEntryRemover;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * 04.07.2009
+ */
+public class LoadAcceleratorPresetsAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * A simple help function to get the directory where to search for XSLT
+ * export files distributed with Freeplane.
+ * @return The system directory where XSLT export files are supposed to be.
+ */
+ static private File getAcceleratorsSysDirectory() {
+ return new File(ResourceController.getResourceController().getResourceBaseDir(), "accelerators");
+ }
+
+ /**
+ * A simple help function to get the directory where to search for XSLT
+ * export files written by the user.
+ * @return The user directory where XSLT export files are supposed to be.
+ */
+ static File getAcceleratorsUserDirectory() {
+ return new File(ResourceController.getResourceController().getFreeplaneUserDirectory(), "accelerators");
+ }
+
+ final static public void install(ModeController modeController) {
+ modeController.addUiBuilder(Phase.ACTIONS, "acceleratorPresets", new AcceleratorPresetsBuilder(modeController),
+ new ChildActionEntryRemover(modeController));
+ }
+
+ static class AcceleratorPresetsBuilder implements EntryVisitor {
+ final private ModeController modeController;
+
+ public AcceleratorPresetsBuilder(ModeController modeController) {
+ super();
+ this.modeController = modeController;
+ }
+
+ @Override
+ public void visit(Entry target) {
+ final File[] dirs = { LoadAcceleratorPresetsAction.getAcceleratorsUserDirectory(),
+ LoadAcceleratorPresetsAction.getAcceleratorsSysDirectory() };
+ for (final File dir : dirs) {
+ final File[] fileList = dir.listFiles();
+ if (fileList == null) {
+ continue;
+ }
+ for (final File prop : fileList) {
+ final String fileName = prop.getName();
+ if (prop.isDirectory()) {
+ continue;
+ }
+ if (!fileName.endsWith(".properties")) {
+ continue;
+ }
+ try {
+ final int propNameLength = fileName.lastIndexOf('.');
+ final String propName = fileName.substring(0, propNameLength);
+ final String key = "LoadAcceleratorPresetsAction." + propName;
+ final String title = TextUtils.getText(key + ".text", propName);
+ final LoadAcceleratorPresetsAction loadAcceleratorPresetsAction = new LoadAcceleratorPresetsAction(
+ prop.toURL(), key, title);
+ modeController.addActionIfNotAlreadySet(loadAcceleratorPresetsAction);
+ new EntryAccessor().addChildAction(target, loadAcceleratorPresetsAction);
+ }
+ catch (final Exception e) {
+ UITools.errorMessage(TextUtils.format("accelerators_loading_error", prop.getPath()));
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+ }
+
+ final private URL resource;
+
+ LoadAcceleratorPresetsAction(final URL resource, final String propFileName, final String title) {
+ super("LoadAcceleratorPresetsAction." + propFileName, title, null);
+ this.resource = resource;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ InputStream in = null;
+ try {
+ in = resource.openStream();
+ final ActionAcceleratorManager acclMgr = Controller.getCurrentModeController()
+ .getUserInputListenerFactory().getAcceleratorManager();
+ acclMgr.loadAcceleratorPresets(in);
+ acclMgr.saveAcceleratorPresets();
+ }
+ catch (final IOException e1) {
+ e1.printStackTrace();
+ }
+ finally {
+ FileUtils.silentlyClose(in);
+ }
+}
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/MModeController.java b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/MModeController.java
new file mode 100644
index 0000000..fd8436c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/MModeController.java
@@ -0,0 +1,234 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode.mindmapmode;
+
+import java.net.URL;
+import java.util.Vector;
+
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.OptionPanelBuilder;
+import org.freeplane.core.resources.components.PropertyAction;
+import org.freeplane.core.ui.IndexedTree;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.mindmapmode.MMapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.mindmapmode.MNoteController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+
+public class MModeController extends ModeController {
+ private static final String LOOKANDFEEL_PROPERTY = "lookandfeel";
+ static public final String MODENAME = "MindMap";
+ private RedoAction redo;
+ public static final String RESOURCES_DELETE_NODES_WITHOUT_QUESTION = "delete_nodes_without_question";
+ private UndoAction undo;
+
+ static public MModeController getMModeController() {
+ Controller controller = Controller.getCurrentController();
+ return (MModeController) controller.getModeController(MODENAME);
+ }
+
+ private OptionPanelBuilder optionPanelBuilder;
+
+ public MModeController(final Controller controller) {
+ super(controller);
+ createActions();
+ createOptionPanelControls();
+ }
+
+ private void addUndoableActor(final IActor actor, final MapModel map) {
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.addActor(actor);
+ }
+
+ public void deactivateUndo(final MMapModel map) {
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.deactivate();
+ }
+
+ @Override
+ public void commit() {
+ final MapModel map = getController().getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.commit();
+ }
+
+ public void delayedCommit() {
+ final MMapModel map = (MMapModel) getController().getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.delayedCommit();
+ }
+
+ public void delayedRollback() {
+ final MMapModel map = (MMapModel) getController().getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.delayedRollback();
+ }
+
+ private void createActions() {
+ undo = new UndoAction();
+ redo = new RedoAction();
+ undo.setRedo(redo);
+ redo.setUndo(undo);
+ addAction(undo);
+ addAction(redo);
+ addAction(new SelectBranchAction());
+ addAction(new SelectAllAction());
+ addAction(new SaveAcceleratorPresetsAction());
+ }
+
+ private void createOptionPanelControls() {
+ optionPanelBuilder = new OptionPanelBuilder();
+ final ResourceController resourceController = ResourceController.getResourceController();
+ URL preferences = resourceController.getResource("/xml/preferences.xml");
+ optionPanelBuilder.load(preferences);
+ addAction(createPropertyAction(optionPanelBuilder));
+ }
+
+ public static PropertyAction createPropertyAction(OptionPanelBuilder optionPanelBuilder) {
+ final LookAndFeelInfo[] lafInfo = UIManager.getInstalledLookAndFeels();
+ final Vector<String> lafNames = new Vector<String>(lafInfo.length + 1);
+ final Vector<String> translatedLafNames = new Vector<String>(lafInfo.length + 1);
+ lafNames.add("default");
+ translatedLafNames.add(TextUtils.getOptionalText("OptionPanel.default"));
+ for (int i = 0; i < lafInfo.length; i++) {
+ final LookAndFeelInfo info = lafInfo[i];
+ final String className = info.getClassName();
+ lafNames.add(className);
+ translatedLafNames.add(info.getName());
+ }
+ addCurrentLookAndFeelIfNecessary(lafNames, translatedLafNames);
+ optionPanelBuilder.addEditableComboProperty("Appearance/look_and_feel/lookandfeel", LOOKANDFEEL_PROPERTY, lafNames,
+ translatedLafNames, IndexedTree.AS_CHILD);
+ return new PropertyAction(optionPanelBuilder.getRoot());
+ }
+
+ private static void addCurrentLookAndFeelIfNecessary(Vector<String> lafNames, Vector<String> translatedLafNames) {
+ final String currentLaf = ResourceController.getResourceController().getProperty(LOOKANDFEEL_PROPERTY);
+ if (!lafNames.contains(currentLaf)) {
+ lafNames.add(currentLaf);
+ translatedLafNames.add(currentLaf.replaceFirst(".*\\.", ""));
+ }
+ }
+
+ @Override
+ public void execute(final IActor actor, final MapModel map) {
+ addUndoableActor(actor, map);
+ actor.act();
+ }
+
+ @Override
+ public String getModeName() {
+ return MModeController.MODENAME;
+ }
+
+ public OptionPanelBuilder getOptionPanelBuilder() {
+ return optionPanelBuilder;
+ }
+
+ @Override
+ public boolean isUndoAction() {
+ final MapModel model = getController().getMap();
+ if (!(model instanceof MMapModel)) {
+ return false;
+ }
+ return ((MMapModel) model).getExtension(IUndoHandler.class).isUndoActionRunning();
+ }
+
+ @Override
+ public void rollback() {
+ final MapModel map = getController().getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.rollback();
+ }
+
+ /**
+ *
+ */
+ public boolean save() {
+ return ((MFileManager) UrlManager.getController()).save(getController().getMap());
+ }
+
+ @Override
+ public void shutdown() {
+ super.shutdown();
+ final MNoteController noteController = (MNoteController) NoteController.getController();
+ if (noteController != null) {
+ noteController.shutdownController();
+ }
+ }
+
+ @Override
+ public void startTransaction() {
+ final MapModel map = getController().getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.startTransaction();
+ }
+
+ @Override
+ public void forceNewTransaction() {
+ final MapModel map = getController().getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.forceNewTransaction();
+ }
+
+ /**
+ * This method is called after and before a change of the map mapView. Use
+ * it to perform the actions that cannot be performed at creation time.
+ */
+ @Override
+ public void startup() {
+ super.startup();
+ final NoteController noteController = NoteController.getController();
+ if (noteController != null) {
+ ((MNoteController) noteController).startupController();
+ }
+ }
+
+ public void undo() {
+ undo.actionPerformed(null);
+ }
+
+ public void resetRedo() {
+ redo.reset();
+ }
+
+ @Override
+ public boolean canEdit() {
+ return true;
+ }
+
+ @Override
+ public boolean supportsHookActions() {
+ return true;
+ }
+
+ public boolean shouldCenterCompactMaps() {
+ return ResourceController.getResourceController().getBooleanProperty("shouldCenterSmallMaps");
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/RedoAction.java b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/RedoAction.java
new file mode 100644
index 0000000..212fedd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/RedoAction.java
@@ -0,0 +1,67 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+
+class RedoAction extends AFreeplaneAction{
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Action undo;
+
+ public RedoAction() {
+ super("RedoAction");
+ setEnabled(false);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if(UITools.isEditingText())
+ return;
+ final Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.getRedoAction().actionPerformed(e);
+ undo.setEnabled(undoHandler.canUndo());
+ setEnabled(undoHandler.canRedo());
+ }
+
+ public void reset() {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.resetRedo();
+ setEnabled(false);
+ }
+
+ public void setUndo(final Action undo) {
+ this.undo = undo;
+ }
+ @Override
+ public void afterMapChange(final Object newMap) {}
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/SaveAcceleratorPresetsAction.java b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/SaveAcceleratorPresetsAction.java
new file mode 100644
index 0000000..d768224
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/SaveAcceleratorPresetsAction.java
@@ -0,0 +1,77 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.05.2012
+ */
+class SaveAcceleratorPresetsAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public SaveAcceleratorPresetsAction() {
+ super("SaveAcceleratorPresetsAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final String keyset = JOptionPane.showInputDialog(TextUtils.getText("enter_keyset_name"));
+ if (keyset == null || keyset.equals("")) {
+ return;
+ }
+ final File acceleratorsUserDirectory = LoadAcceleratorPresetsAction.getAcceleratorsUserDirectory();
+ final File keysetFile = new File(acceleratorsUserDirectory, keyset + ".properties");
+ if (keysetFile.exists()) {
+ final int confirm = JOptionPane.showConfirmDialog(UITools.getMenuComponent(), TextUtils
+ .getText("overwrite_keyset_question"), "Freeplane", JOptionPane.YES_NO_OPTION);
+ if (confirm != JOptionPane.YES_OPTION) {
+ return;
+ }
+ }
+ try {
+ acceleratorsUserDirectory.mkdirs();
+ final OutputStream output = new BufferedOutputStream(new FileOutputStream(keysetFile));
+ final IUserInputListenerFactory userInputListenerFactory = Controller.getCurrentModeController()
+ .getUserInputListenerFactory();
+ userInputListenerFactory.getAcceleratorManager().storeAcceleratorPreset(output);
+ output.close();
+ userInputListenerFactory.rebuildMenus("load_accelerator_presets");
+ }
+ catch (final IOException e1) {
+ UITools.errorMessage(TextUtils.getText("can_not_save_key_set"));
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/SelectAllAction.java b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/SelectAllAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/mindmapmode/SelectAllAction.java
rename to freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/SelectAllAction.java
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/SelectBranchAction.java b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/SelectBranchAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/mode/mindmapmode/SelectBranchAction.java
rename to freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/SelectBranchAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/UndoAction.java b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/UndoAction.java
new file mode 100644
index 0000000..8d5ac8c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/mode/mindmapmode/UndoAction.java
@@ -0,0 +1,102 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.mode.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.Action;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.mindmapmode.MMapModel;
+import org.freeplane.features.mode.Controller;
+
+class UndoAction extends AFreeplaneAction implements IMapSelectionListener{
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Action redo;
+ private final ChangeListener changeListener;
+
+ public UndoAction() {
+ super("UndoAction");
+ Controller.getCurrentController().getMapViewManager().addMapSelectionListener(this);
+ setEnabled(false);
+ changeListener = new ChangeListener() {
+ public void stateChanged(final ChangeEvent e) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ if (undoHandler == null) {
+ return;
+ }
+ final Object eventSource = e.getSource();
+ if (!eventSource.equals(undoHandler)) {
+ return;
+ }
+ setEnabled(undoHandler.canUndo());
+ redo.setEnabled(undoHandler.canRedo());
+ }
+ };
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if(UITools.isEditingText())
+ return;
+ final Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
+ undoHandler.getUndoAction().actionPerformed(e);
+
+ }
+
+ public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
+ if (oldMap instanceof MMapModel) {
+ final IUndoHandler undoHandler = oldMap.getExtension(IUndoHandler.class);
+ undoHandler.removeChangeListener(changeListener);
+ }
+ if (newMap == null) {
+ setEnabled(false);
+ redo.setEnabled(false);
+ return;
+ }
+ final IUndoHandler undoHandler = (newMap.getExtension(IUndoHandler.class));
+ if (undoHandler != null) {
+ setEnabled(undoHandler.canUndo());
+ redo.setEnabled(undoHandler.canRedo());
+ undoHandler.addChangeListener(changeListener);
+ }
+ }
+ @Override
+ public void afterMapChange(final Object newMap) {};
+
+ public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
+ }
+
+ public void setRedo(final Action redo) {
+ this.redo = redo;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodelocation/LocationBuilder.java b/freeplane/src/main/java/org/freeplane/features/nodelocation/LocationBuilder.java
new file mode 100644
index 0000000..6727020
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodelocation/LocationBuilder.java
@@ -0,0 +1,87 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodelocation;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IExtensionAttributeWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 06.12.2008
+ */
+class LocationBuilder implements IExtensionAttributeWriter {
+ private void registerAttributeHandlers(final ReadManager reader) {
+ final IAttributeHandler vShiftHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ LocationModel.createLocationModel(node).setShiftY(Quantity.fromString(value, LengthUnits.px));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "VSHIFT", vShiftHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "VSHIFT_QUANTITY", vShiftHandler);
+ final IAttributeHandler vgapHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ LocationModel.createLocationModel(node).setVGap(Quantity.fromString(value, LengthUnits.px));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "VGAP", vgapHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "VGAP_QUANTITY", vgapHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "VGAP", vgapHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "VGAP_QUANTITY", vgapHandler);
+ final IAttributeHandler hgapHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ LocationModel.createLocationModel(node).setHGap(Quantity.fromString(value, LengthUnits.px));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "HGAP_QUANTITY", hgapHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "HGAP", hgapHandler);
+ }
+
+ void registerBy(final ReadManager readManager, final WriteManager writeManager) {
+ registerAttributeHandlers(readManager);
+ writeManager.addExtensionAttributeWriter(LocationModel.class, this);
+ }
+
+ public void writeAttributes(final ITreeWriter writer, final Object userObject, final IExtension extension) {
+ final LocationModel locationModel = (LocationModel) extension;
+ final Quantity<LengthUnits> vGap = locationModel.getVGap();
+ if (vGap != LocationModel.DEFAULT_VGAP) {
+ writer.addAttribute("VGAP_QUANTITY", vGap.toString());
+ }
+ final Quantity<LengthUnits> hGap = locationModel.getHGap();
+ if (locationModel.getHGap() != LocationModel.DEFAULT_HGAP) {
+ writer.addAttribute("HGAP_QUANTITY", hGap.toString());
+ }
+ final Quantity<LengthUnits> shiftY = locationModel.getShiftY();
+ if (shiftY != LocationModel.DEFAULT_SHIFT_Y) {
+ writer.addAttribute("VSHIFT_QUANTITY", shiftY.toString());
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodelocation/LocationController.java b/freeplane/src/main/java/org/freeplane/features/nodelocation/LocationController.java
new file mode 100644
index 0000000..af90a1f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodelocation/LocationController.java
@@ -0,0 +1,123 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodelocation;
+
+import java.util.Collection;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ExclusivePropertyChain;
+import org.freeplane.features.mode.IPropertyHandler;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class LocationController implements IExtension {
+ final private ExclusivePropertyChain<Quantity<LengthUnits>, NodeModel> childGapHandlers;
+ public static LocationController getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return getController(modeController);
+ }
+
+ public static LocationController getController(ModeController modeController) {
+ return modeController.getExtension(LocationController.class);
+ }
+
+ public static void install( final LocationController locationController) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(LocationController.class, locationController);
+ }
+
+// final private ModeController modeController;
+
+ public LocationController() {
+ super();
+// this.modeController = modeController;
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ final ReadManager readManager = mapController.getReadManager();
+ final WriteManager writeManager = mapController.getWriteManager();
+ final LocationBuilder locationBuilder = new LocationBuilder();
+ locationBuilder.registerBy(readManager, writeManager);
+ childGapHandlers = new ExclusivePropertyChain<Quantity<LengthUnits>, NodeModel>();
+ addChildGapGetter(IPropertyHandler.STYLE, new IPropertyHandler<Quantity<LengthUnits>, NodeModel>() {
+ public Quantity<LengthUnits> getProperty(final NodeModel node, final Quantity<LengthUnits> currentValue) {
+ final MapModel map = node.getMap();
+ final LogicalStyleController styleController = LogicalStyleController.getController(modeController);
+ final Collection<IStyle> style = styleController.getStyles(node);
+ final Quantity<LengthUnits> returnedGap = getStyleChildGap(map, style);
+ return returnedGap;
+ }
+ });
+ addChildGapGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Quantity<LengthUnits>, NodeModel>() {
+ public Quantity<LengthUnits> getProperty(final NodeModel node, final Quantity<LengthUnits> currentValue) {
+ return LocationModel.DEFAULT_VGAP;
+ }
+ });
+
+ }
+ private IPropertyHandler<Quantity<LengthUnits>, NodeModel> addChildGapGetter(final Integer key,
+ final IPropertyHandler<Quantity<LengthUnits>, NodeModel> getter) {
+ return childGapHandlers.addGetter(key, getter);
+ }
+
+ private Quantity<LengthUnits> getStyleChildGap(final MapModel map, final Collection<IStyle> styleKeys) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : styleKeys){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final LocationModel styleModel = styleNode.getExtension(LocationModel.class);
+ if (styleModel == null) {
+ continue;
+ }
+ Quantity<LengthUnits> vGap = styleModel.getVGap();
+ if (vGap == LocationModel.DEFAULT_VGAP) {
+ continue;
+ }
+ return vGap;
+ }
+ return null;
+ }
+
+ public Quantity<LengthUnits> getHorizontalShift(NodeModel node){
+ return LocationModel.getModel(node).getHGap();
+ }
+
+ public Quantity<LengthUnits> getVerticalShift(NodeModel node){
+ return LocationModel.getModel(node).getShiftY();
+ }
+
+ public Quantity<LengthUnits> getMinimalDistanceBetweenChildren(NodeModel node){
+ return childGapHandlers.getProperty(node);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodelocation/LocationModel.java b/freeplane/src/main/java/org/freeplane/features/nodelocation/LocationModel.java
new file mode 100644
index 0000000..53130a0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodelocation/LocationModel.java
@@ -0,0 +1,114 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodelocation;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class LocationModel implements IExtension {
+ public static final Quantity<LengthUnits> DEFAULT_HGAP = new Quantity<LengthUnits>(14, LengthUnits.pt);
+ public static final int DEFAULT_HGAP_PX = DEFAULT_HGAP.toBaseUnitsRounded();
+ public static Quantity<LengthUnits> DEFAULT_SHIFT_Y = new Quantity<LengthUnits>(0, LengthUnits.pt);
+ public static Quantity<LengthUnits> DEFAULT_VGAP = new Quantity<LengthUnits>(2, LengthUnits.pt);
+ public static final LocationModel NULL_LOCATION = new LocationModel() {
+ @Override
+ public void setHGap(final Quantity<LengthUnits> gap) {
+ if (gap != getHGap()) {
+ throw new NoSuchMethodError();
+ }
+ }
+
+ @Override
+ public void setShiftY(final Quantity<LengthUnits> shiftY) {
+ if (shiftY != getShiftY()) {
+ throw new NoSuchMethodError();
+ }
+ }
+
+ @Override
+ public void setVGap(final Quantity<LengthUnits> gap) {
+ if (gap != getVGap()) {
+ throw new NoSuchMethodError();
+ }
+ }
+ };
+
+ private Quantity<LengthUnits> hGap;
+ private Quantity<LengthUnits> shiftY;
+ private Quantity<LengthUnits> vGap;
+
+ public LocationModel(){
+ hGap = LocationModel.DEFAULT_HGAP;
+ shiftY = LocationModel.DEFAULT_SHIFT_Y;
+ vGap = LocationModel.DEFAULT_VGAP;
+ }
+
+ public static LocationModel createLocationModel(final NodeModel node) {
+ LocationModel location = (LocationModel) node.getExtension(LocationModel.class);
+ if (location == null) {
+ location = new LocationModel();
+ node.addExtension(location);
+ }
+ return location;
+ }
+
+ public static LocationModel getModel(final NodeModel node) {
+ final LocationModel location = (LocationModel) node.getExtension(LocationModel.class);
+ return location != null ? location : LocationModel.NULL_LOCATION;
+ }
+
+
+ public Quantity<LengthUnits> getHGap() {
+ return hGap;
+ }
+
+ public Quantity<LengthUnits> getShiftY() {
+ return shiftY;
+ }
+
+ public Quantity<LengthUnits> getVGap() {
+ return vGap;
+ }
+
+ public void setHGap(final Quantity<LengthUnits> gap) {
+ assertNotNull(gap);
+ hGap = gap;
+ }
+
+ private void assertNotNull(Object object) {
+ if(object == null)
+ throw new NullPointerException();
+ }
+
+ public void setShiftY(final Quantity<LengthUnits> shiftY) {
+ assertNotNull(shiftY);
+ this.shiftY = shiftY;
+ }
+
+ public void setVGap(final Quantity<LengthUnits> gap) {
+ assertNotNull(gap);
+ vGap = gap.toBaseUnits() >= 0 ? gap : new Quantity<LengthUnits>(0, gap.unit);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftXActor.java b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftXActor.java
new file mode 100644
index 0000000..52a136f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftXActor.java
@@ -0,0 +1,62 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodelocation.mindmapmode;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.nodelocation.LocationModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.03.2014
+ */
+final class ChangeShiftXActor implements IActor {
+ private final Quantity<LengthUnits> shiftX;
+ private final NodeModel node;
+ private final Quantity<LengthUnits> oldShiftX;
+
+ ChangeShiftXActor(final NodeModel node, final Quantity<LengthUnits> shiftX){
+ final LocationModel locationModel = LocationModel.getModel(node);
+ oldShiftX = locationModel.getHGap();
+ this.node = node;
+ this.shiftX = shiftX;
+ }
+
+ public void act() {
+ setShiftX(node, shiftX);
+ }
+
+ public String getDescription() {
+ return "moveNodePosition";
+ }
+
+ private void setShiftX(final NodeModel node, final Quantity<LengthUnits> hGap) {
+ final LocationModel locationModel = LocationModel.createLocationModel(node);
+ locationModel.setHGap(hGap);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public void undo() {
+ setShiftX(node, oldShiftX);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftYActor.java b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftYActor.java
new file mode 100644
index 0000000..a07c599
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftYActor.java
@@ -0,0 +1,62 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodelocation.mindmapmode;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.nodelocation.LocationModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.03.2014
+ */
+final class ChangeShiftYActor implements IActor {
+ private final NodeModel node;
+ private final Quantity<LengthUnits> oldShiftY;
+ private final Quantity<LengthUnits> shiftY;
+
+ ChangeShiftYActor(final NodeModel node, final Quantity<LengthUnits> shiftY){
+ final LocationModel locationModel = LocationModel.getModel(node);
+ oldShiftY = locationModel.getShiftY();
+ this.node = node;
+ this.shiftY = shiftY;
+ }
+
+ public void act() {
+ setShiftY(node, shiftY);
+ }
+
+ public String getDescription() {
+ return "moveNodePosition";
+ }
+
+ private void setShiftY(final NodeModel node, final Quantity<LengthUnits> shiftY) {
+ final LocationModel locationModel = LocationModel.createLocationModel(node);
+ locationModel.setShiftY(shiftY);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public void undo() {
+ setShiftY(node, oldShiftY);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ChangeVGapActor.java b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ChangeVGapActor.java
new file mode 100644
index 0000000..ef17761
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ChangeVGapActor.java
@@ -0,0 +1,61 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodelocation.mindmapmode;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.nodelocation.LocationModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.03.2014
+ */
+final class ChangeVGapActor implements IActor {
+ private final NodeModel node;
+ private final Quantity<LengthUnits> oldVgap;
+ private final Quantity<LengthUnits> vGap;
+
+ ChangeVGapActor(final NodeModel node, final Quantity<LengthUnits> vGap){
+ final LocationModel locationModel = LocationModel.getModel(node);
+ oldVgap = locationModel.getVGap();
+ this.node = node;
+ this.vGap = vGap;
+ }
+
+ public void act() {
+ setVGap(node, vGap);
+ }
+
+ public String getDescription() {
+ return "moveNodePosition";
+ }
+
+ private void setVGap(final NodeModel node, final Quantity<LengthUnits> parentVGap) {
+ LocationModel.createLocationModel(node).setVGap(parentVGap);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public void undo() {
+ setVGap(node, oldVgap);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/MLocationController.java b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/MLocationController.java
new file mode 100644
index 0000000..1a8cc5f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/MLocationController.java
@@ -0,0 +1,116 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodelocation.mindmapmode;
+
+import java.util.ArrayList;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.IExtensionCopier;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.features.styles.LogicalStyleKeys;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MLocationController extends LocationController {
+
+ private static class StyleCopier implements IExtensionCopier {
+ public void copy(Object key, NodeModel from, NodeModel to) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ LocationModel source = from.getExtension(LocationModel.class);
+ if(source != null){
+ LocationModel.createLocationModel(to).setVGap(source.getVGap());
+ }
+ }
+
+ public void remove(Object key, NodeModel from) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ LocationModel target = from.getExtension(LocationModel.class);
+ if(target != null){
+ target.setVGap(LocationModel.DEFAULT_VGAP);
+ }
+ }
+
+ public void remove(Object key, NodeModel from, NodeModel which) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ LocationModel model = which.getExtension(LocationModel.class);
+ if(model != null && model.getVGap() != LocationModel.DEFAULT_VGAP ){
+ remove(key, from);
+ }
+ }
+
+ @Override
+ public void resolveParentExtensions(Object key, NodeModel to) {
+ }
+ }
+
+ public MLocationController() {
+ super();
+ final ModeController modeController = Controller.getCurrentModeController();
+ createActions(modeController);
+ modeController.registerExtensionCopier(new StyleCopier());
+ }
+
+ private void createActions(ModeController modeController) {
+ modeController.addAction(new ResetNodeLocationAction());
+ }
+
+ public void moveNodePosition(final NodeModel node, final Quantity<LengthUnits> hGap, final Quantity<LengthUnits> shiftY) {
+ final ModeController currentModeController = Controller.getCurrentModeController();
+ MapModel map = node.getMap();
+ ArrayList<IActor> actors = new ArrayList<IActor>(3);
+ actors.add(new ChangeShiftXActor(node, hGap));
+ actors.add(new ChangeShiftYActor(node, shiftY));
+ for (final IActor actor : actors) {
+ currentModeController.execute(actor, map);
+ }
+ }
+
+ public void setHorizontalShift(NodeModel node, final Quantity<LengthUnits> horizontalShift){
+ final IActor actor = new ChangeShiftXActor(node, horizontalShift);
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ public void setVerticalShift(NodeModel node, final Quantity<LengthUnits> verticalShift){
+ final IActor actor = new ChangeShiftYActor(node, verticalShift);
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ public void setMinimalDistanceBetweenChildren(NodeModel node, final Quantity<LengthUnits> minimalDistanceBetweenChildren){
+ if(node != null){
+ final IActor actor = new ChangeVGapActor(node, minimalDistanceBetweenChildren);
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ResetNodeLocationAction.java b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ResetNodeLocationAction.java
new file mode 100644
index 0000000..a59fe31
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodelocation/mindmapmode/ResetNodeLocationAction.java
@@ -0,0 +1,50 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodelocation.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.LocationModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 07.12.2008
+ */
+class ResetNodeLocationAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ResetNodeLocationAction() {
+ super("ResetNodeLocationAction");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ MLocationController locationController = (MLocationController) LocationController.getController();
+ locationController.moveNodePosition(node, LocationModel.NULL_LOCATION.getHGap(), LocationModel.NULL_LOCATION
+ .getShiftY());
+ locationController.setMinimalDistanceBetweenChildren(node.getParentNode(), LocationModel.NULL_LOCATION.getVGap());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeSizeModel.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeSizeModel.java
new file mode 100644
index 0000000..0e0527a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeSizeModel.java
@@ -0,0 +1,88 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodestyle;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Nov 13, 2011
+ */
+public class NodeSizeModel implements IExtension {
+
+ public static final int NOT_SET = -1;
+
+ public static NodeSizeModel getModel(final NodeModel node) {
+ return node.getExtension(NodeSizeModel.class);
+ }
+
+ public static NodeSizeModel createNodeSizeModel(final NodeModel node) {
+ NodeSizeModel styleModel = node.getExtension(NodeSizeModel.class);
+ if (styleModel == null) {
+ styleModel = new NodeSizeModel();
+ node.addExtension(styleModel);
+ }
+ return styleModel;
+ }
+
+ private Quantity<LengthUnits> minNodeWidth = null;
+ private Quantity<LengthUnits> maxTextWidth = null;
+
+ public Quantity<LengthUnits> getMaxNodeWidth() {
+ return maxTextWidth;
+ }
+ public void setMaxNodeWidth(Quantity<LengthUnits> maxTextWidth) {
+ this.maxTextWidth = maxTextWidth;
+ }
+
+ public Quantity<LengthUnits> getMinNodeWidth() {
+ return minNodeWidth;
+ }
+
+ public void setMinNodeWidth(Quantity<LengthUnits> quantity) {
+ this.minNodeWidth = quantity;
+ }
+
+ public static void setMaxNodeWidth(NodeModel node, Quantity<LengthUnits> maxTextWidth) {
+ createNodeSizeModel(node).setMaxNodeWidth(maxTextWidth);
+ }
+ public static void setNodeMinWidth(NodeModel node, Quantity<LengthUnits> minNodeWidth) {
+ createNodeSizeModel(node).setMinNodeWidth(minNodeWidth);
+ }
+
+ public static Quantity<LengthUnits> getMaxNodeWidth(NodeModel node) {
+ final NodeSizeModel extension = node.getExtension(NodeSizeModel.class);
+ return extension != null ? extension.getMaxNodeWidth() : null;
+ }
+ public static Quantity<LengthUnits> getMinNodeWidth(NodeModel node) {
+ final NodeSizeModel extension = node.getExtension(NodeSizeModel.class);
+ return extension != null ? extension.getMinNodeWidth() : null;
+ }
+
+ public void copyTo(NodeSizeModel to) {
+ if(maxTextWidth != null)
+ to.setMaxNodeWidth(maxTextWidth);
+ if(minNodeWidth != null)
+ to.setMinNodeWidth(minNodeWidth);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeStyleBuilder.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeStyleBuilder.java
new file mode 100644
index 0000000..4a3d1b3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeStyleBuilder.java
@@ -0,0 +1,409 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodestyle;
+
+import java.awt.Color;
+import java.io.IOException;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IAttributeWriter;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IElementWriter;
+import org.freeplane.core.io.IExtensionAttributeWriter;
+import org.freeplane.core.io.IExtensionElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.BackwardCompatibleQuantityWriter;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.MapWriter;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeWriter;
+import org.freeplane.features.nodestyle.NodeStyleModel.Shape;
+import org.freeplane.features.nodestyle.NodeStyleModel.TextAlign;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+class NodeStyleBuilder implements IElementDOMHandler, IExtensionElementWriter, IExtensionAttributeWriter,
+ IAttributeWriter, IElementWriter {
+ static class FontProperties {
+ String fontName;
+ Integer fontSize;
+ Boolean isBold;
+ Boolean isItalic;
+ }
+
+ private final NodeStyleController nsc;
+
+ public NodeStyleBuilder(final NodeStyleController nsc) {
+ this.nsc = nsc;
+ }
+
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (tag.equals("font")) {
+ return new FontProperties();
+ }
+ return null;
+ }
+
+ public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
+ if (parent instanceof NodeModel) {
+ final NodeModel node = (NodeModel) parent;
+ if (tag.equals("font")) {
+ final FontProperties fp = (FontProperties) userObject;
+ NodeStyleModel nodeStyleModel = NodeStyleModel.getModel(node);
+ if (nodeStyleModel == null) {
+ nodeStyleModel = new NodeStyleModel();
+ node.addExtension(nodeStyleModel);
+ }
+ nodeStyleModel.setFontFamilyName(fp.fontName);
+ nodeStyleModel.setFontSize(fp.fontSize);
+ nodeStyleModel.setItalic(fp.isItalic);
+ nodeStyleModel.setBold(fp.isBold);
+ return;
+ }
+ return;
+ }
+ }
+
+ private void registerAttributeHandlers(final ReadManager reader) {
+ final IAttributeHandler colorHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setColor(node, ColorUtils.stringToColor(value, NodeStyleModel.getColor(node)));
+ }
+ };
+ final IAttributeHandler alphaHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setColor(node, ColorUtils.alphaToColor(value, NodeStyleModel.getColor(node)));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "COLOR", colorHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "ALPHA", alphaHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "COLOR", colorHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "ALPHA", alphaHandler);
+ final IAttributeHandler bgHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setBackgroundColor(node, ColorUtils.stringToColor(value, NodeStyleModel.getBackgroundColor(node)));
+ }
+ };
+ final IAttributeHandler bgAlphaHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setBackgroundColor(node, ColorUtils.alphaToColor(value, NodeStyleModel.getBackgroundColor(node)));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "BACKGROUND_COLOR", bgHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "BACKGROUND_ALPHA", bgAlphaHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "BACKGROUND_COLOR", bgHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "BACKGROUND_ALPHA", bgAlphaHandler);
+
+ final IAttributeHandler shapeHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setShape(node, value);
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "STYLE", shapeHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "STYLE", shapeHandler);
+
+ final IAttributeHandler shapeHorizontalMarginHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setShapeHorizontalMargin(node, Quantity.fromString(value, LengthUnits.px));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "SHAPE_HORIZONTAL_MARGIN", shapeHorizontalMarginHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "SHAPE_HORIZONTAL_MARGIN", shapeHorizontalMarginHandler);
+
+ final IAttributeHandler shapeVerticalMarginHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setShapeVerticalMargin(node, Quantity.fromString(value, LengthUnits.px));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "SHAPE_VERTICAL_MARGIN", shapeVerticalMarginHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "SHAPE_VERTICAL_MARGIN", shapeVerticalMarginHandler);
+
+ final IAttributeHandler uniformShapeHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setShapeUniform(node, Boolean.valueOf(value));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "UNIFORM_SHAPE", uniformShapeHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "UNIFORM_SHAPE", uniformShapeHandler);
+
+ reader.addAttributeHandler("font", "SIZE", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final FontProperties fp = (FontProperties) userObject;
+ fp.fontSize = Integer.parseInt(value.toString());
+ }
+ });
+ reader.addAttributeHandler("font", "NAME", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final FontProperties fp = (FontProperties) userObject;
+ fp.fontName = value;
+ }
+ });
+ reader.addAttributeHandler("font", "BOLD", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final FontProperties fp = (FontProperties) userObject;
+ fp.isBold = value.equals("true");
+ }
+ });
+ reader.addAttributeHandler("font", "ITALIC", new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final FontProperties fp = (FontProperties) userObject;
+ fp.isItalic = value.equals("true");
+ }
+ });
+ final IAttributeHandler nodenumberingHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setNodeNumbering(node, value.equals("true"));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "NUMBERED", nodenumberingHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "NUMBERED", nodenumberingHandler);
+
+ final IAttributeHandler formatHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setNodeFormat(node, value);
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "FORMAT", formatHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "FORMAT", formatHandler);
+ if (FreeplaneVersion.getVersion().isOlderThan(new FreeplaneVersion(1, 3, 0))) {
+ // compatibility for a view 1.2.X preview versions - remove after release 1.3
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "TEMPLATE", formatHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "TEMPLATE", formatHandler);
+ }
+
+ final IAttributeHandler nodeMaxNodeWidthQuantityHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ Quantity<LengthUnits> width = Quantity.fromString(value, LengthUnits.px);
+ NodeSizeModel.setMaxNodeWidth(node, width);
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "MAX_WIDTH_QUANTITY", nodeMaxNodeWidthQuantityHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "MAX_WIDTH_QUANTITY", nodeMaxNodeWidthQuantityHandler);
+
+ final IAttributeHandler nodeMaxNodeWidthHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ if (NodeSizeModel.getMaxNodeWidth(node) == null) {
+ nodeMaxNodeWidthQuantityHandler.setAttribute(node, value);
+ }
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "MAX_WIDTH", nodeMaxNodeWidthHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "MAX_WIDTH", nodeMaxNodeWidthHandler);
+
+ final IAttributeHandler nodeMinNodeWidthQuantityHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ Quantity<LengthUnits> width = Quantity.fromString(value, LengthUnits.px);
+ NodeSizeModel.setNodeMinWidth(node, width);
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "MIN_WIDTH_QUANTITY", nodeMinNodeWidthQuantityHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "MIN_WIDTH_QUANTITY", nodeMinNodeWidthQuantityHandler);
+
+ final IAttributeHandler nodeMinWidthHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ if (NodeSizeModel.getMinNodeWidth(node) == null) {
+ nodeMinNodeWidthQuantityHandler.setAttribute(node, value);
+ }
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "MIN_WIDTH", nodeMinWidthHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "MIN_WIDTH", nodeMinWidthHandler);
+
+ final IAttributeHandler textAlignHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = (NodeModel) userObject;
+ NodeStyleModel.setTextAlign(node, TextAlign.valueOf(value));
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, "TEXT_ALIGN", textAlignHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "TEXT_ALIGN", textAlignHandler);
+ }
+
+ /**
+ */
+ public void registerBy(final ReadManager reader, final WriteManager writer) {
+ reader.addElementHandler("font", this);
+ registerAttributeHandlers(reader);
+ writer.addAttributeWriter(NodeBuilder.XML_NODE, this);
+ writer.addAttributeWriter(NodeBuilder.XML_STYLENODE, this);
+ writer.addElementWriter(NodeBuilder.XML_NODE, this);
+ writer.addElementWriter(NodeBuilder.XML_STYLENODE, this);
+ writer.addExtensionElementWriter(NodeStyleModel.class, this);
+ writer.addExtensionAttributeWriter(NodeStyleModel.class, this);
+ writer.addExtensionAttributeWriter(NodeSizeModel.class, this);
+ }
+
+ public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
+ }
+
+ public void writeAttributes(final ITreeWriter writer, final Object userObject, final String tag) {
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (!forceFormatting) {
+ return;
+ }
+ final NodeModel node = (NodeModel) userObject;
+ writeAttributes(writer, node, (NodeStyleModel)null, true);
+ writeAttributes(writer, node, (NodeSizeModel)null, true);
+ }
+
+ public void writeAttributes(final ITreeWriter writer, final Object userObject, final IExtension extension) {
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (forceFormatting) {
+ return;
+ }
+ if(extension instanceof NodeStyleModel){
+ final NodeStyleModel style = (NodeStyleModel) extension;
+ writeAttributes(writer, null, style, false);
+ return;
+ }
+ if(extension instanceof NodeSizeModel){
+ final NodeSizeModel size = (NodeSizeModel) extension;
+ writeAttributes(writer, null, size, false);
+ return;
+ }
+
+ }
+
+ private void writeAttributes(final ITreeWriter writer, final NodeModel node, final NodeStyleModel style,
+ final boolean forceFormatting) {
+ final Color color = forceFormatting ? nsc.getColor(node) : style.getColor();
+ if (color != null) {
+ ColorUtils.addColorAttributes(writer, "COLOR", "ALPHA", color);
+ }
+ final Color backgroundColor = forceFormatting ? nsc.getBackgroundColor(node) : style.getBackgroundColor();
+ if (backgroundColor != null) {
+ ColorUtils.addColorAttributes(writer, "BACKGROUND_COLOR", "BACKGROUND_ALPHA", backgroundColor);
+ }
+ final ShapeConfigurationModel shapeConfiguration = forceFormatting ? nsc.getShapeConfiguration(node) : style.getShapeConfiguration();
+ final Shape shape = shapeConfiguration.getShape();
+ if (shape != null) {
+ writer.addAttribute("STYLE", shape.toString());
+ }
+ final Quantity<LengthUnits> shapeHorizontalMargin = shapeConfiguration.getHorizontalMargin();
+ if (! shapeHorizontalMargin.equals(ShapeConfigurationModel.DEFAULT_MARGIN)) {
+ BackwardCompatibleQuantityWriter.forWriter(writer).writeQuantity("SHAPE_HORIZONTAL_MARGIN", shapeHorizontalMargin);
+ }
+ final Quantity<LengthUnits> shapeVerticalMargin = shapeConfiguration.getVerticalMargin();
+ if (! shapeVerticalMargin.equals(ShapeConfigurationModel.DEFAULT_MARGIN)) {
+ BackwardCompatibleQuantityWriter.forWriter(writer).writeQuantity("SHAPE_VERTICAL_MARGIN", shapeVerticalMargin);
+ }
+ final boolean uniformShape = shapeConfiguration.isUniform();
+ if (uniformShape) {
+ writer.addAttribute("UNIFORM_SHAPE", "true");
+ }
+ final Boolean numbered = forceFormatting ? nsc.getNodeNumbering(node) : style.getNodeNumbering();
+ if (numbered != null && numbered) {
+ writer.addAttribute("NUMBERED", numbered.toString());
+ }
+ final String format = forceFormatting ? nsc.getNodeFormat(node) : style.getNodeFormat();
+ if (format != null) {
+ writer.addAttribute("FORMAT", format);
+ }
+ final TextAlign textAlign = forceFormatting ? nsc.getTextAlign(node) : style.getTextAlign();
+ if (textAlign != null) {
+ writer.addAttribute("TEXT_ALIGN", textAlign.toString());
+ }
+ }
+
+ private void writeAttributes(final ITreeWriter writer, final NodeModel node, final NodeSizeModel size,
+ final boolean forceFormatting) {
+ final Quantity<LengthUnits> maxTextWidth = forceFormatting ? nsc.getMaxWidth(node) : size.getMaxNodeWidth();
+ if (maxTextWidth != null) {
+ BackwardCompatibleQuantityWriter.forWriter(writer).writeQuantity("MAX_WIDTH", maxTextWidth);
+ }
+
+ final Quantity<LengthUnits> minTextWidth = forceFormatting ? nsc.getMinWidth(node) : size.getMinNodeWidth();
+ if (minTextWidth != null) {
+ BackwardCompatibleQuantityWriter.forWriter(writer).writeQuantity("MIN_WIDTH", minTextWidth);
+ }
+ }
+ public void writeContent(final ITreeWriter writer, final Object userObject, final String tag) throws IOException {
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (!forceFormatting) {
+ return;
+ }
+ final NodeModel node = (NodeModel) userObject;
+ writeContent(writer, node, null, true);
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object userObject, final IExtension extension)
+ throws IOException {
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (forceFormatting) {
+ return;
+ }
+ final NodeStyleModel style = (NodeStyleModel) extension;
+ writeContent(writer, null, style, false);
+ }
+
+ private void writeContent(final ITreeWriter writer, final NodeModel node, final NodeStyleModel style,
+ final boolean forceFormatting) throws IOException {
+ if(! NodeWriter.shouldWriteSharedContent(writer))
+ return;
+ if (forceFormatting || style != null) {
+ final XMLElement fontElement = new XMLElement();
+ fontElement.setName("font");
+ boolean isRelevant = forceFormatting;
+ final String fontFamilyName = forceFormatting ? nsc.getFontFamilyName(node) : style.getFontFamilyName();
+ if (fontFamilyName != null) {
+ fontElement.setAttribute("NAME", fontFamilyName);
+ isRelevant = true;
+ }
+ final Integer fontSize = forceFormatting ? Integer.valueOf(nsc.getFontSize(node)) : style.getFontSize();
+ if (fontSize != null) {
+ fontElement.setAttribute("SIZE", Integer.toString(fontSize));
+ isRelevant = true;
+ }
+ final Boolean bold = forceFormatting ? Boolean.valueOf(nsc.isBold(node)) : style.isBold();
+ if (bold != null) {
+ fontElement.setAttribute("BOLD", bold ? "true" : "false");
+ isRelevant = true;
+ }
+ final Boolean italic = forceFormatting ? Boolean.valueOf(nsc.isItalic(node)) : style.isItalic();
+ if (italic != null) {
+ fontElement.setAttribute("ITALIC", italic ? "true" : "false");
+ isRelevant = true;
+ }
+ if (isRelevant) {
+ writer.addElement(style, fontElement);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeStyleController.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeStyleController.java
new file mode 100644
index 0000000..1e8db89
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeStyleController.java
@@ -0,0 +1,445 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodestyle;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.util.Collection;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.CombinedPropertyChain;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ExclusivePropertyChain;
+import org.freeplane.features.mode.IPropertyHandler;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleModel.Shape;
+import org.freeplane.features.nodestyle.NodeStyleModel.TextAlign;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class NodeStyleController implements IExtension {
+ public static Color standardNodeTextColor = Color.BLACK;
+
+ public static NodeStyleController getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return getController(modeController);
+ }
+
+ public static NodeStyleController getController(ModeController modeController) {
+ return (NodeStyleController) modeController.getExtension(NodeStyleController.class);
+ }
+ public static void install( final NodeStyleController styleController) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(NodeStyleController.class, styleController);
+ }
+
+ final private ExclusivePropertyChain<Color, NodeModel> backgroundColorHandlers;
+// // // final private Controller controller;
+ final private CombinedPropertyChain<Font, NodeModel> fontHandlers;
+ final private ModeController modeController;
+ final private ExclusivePropertyChain<ShapeConfigurationModel, NodeModel> shapeHandlers;
+ final private ExclusivePropertyChain<Color, NodeModel> textColorHandlers;
+ final private ExclusivePropertyChain<TextAlign, NodeModel> textAlignHandlers;
+ public static final String NODE_NUMBERING = "NodeNumbering";
+
+ private static final Quantity<LengthUnits> DEFAULT_MINIMUM_WIDTH = new Quantity<LengthUnits>(0, LengthUnits.cm);
+ private static final Quantity<LengthUnits> DEFAULT_MAXIMUM_WIDTH = new Quantity<LengthUnits>(10, LengthUnits.cm);
+
+ public NodeStyleController(final ModeController modeController) {
+ this.modeController = modeController;
+// controller = modeController.getController();
+ fontHandlers = new CombinedPropertyChain<Font, NodeModel>(true);
+ textColorHandlers = new ExclusivePropertyChain<Color, NodeModel>();
+ backgroundColorHandlers = new ExclusivePropertyChain<Color, NodeModel>();
+ shapeHandlers = new ExclusivePropertyChain<ShapeConfigurationModel, NodeModel>();
+ textAlignHandlers = new ExclusivePropertyChain<TextAlign, NodeModel>();
+
+ addFontGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Font, NodeModel>() {
+ public Font getProperty(final NodeModel node, final Font currentValue) {
+ final Font defaultFont = NodeStyleController.getDefaultFont();
+ return defaultFont;
+ }
+ });
+ addFontGetter(IPropertyHandler.STYLE, new IPropertyHandler<Font, NodeModel>() {
+ public Font getProperty(final NodeModel node, final Font currentValue) {
+ final Font defaultFont = getStyleFont(currentValue, node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
+ return defaultFont;
+ }
+ });
+ addColorGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Color, NodeModel>() {
+ public Color getProperty(final NodeModel node, final Color currentValue) {
+ return standardNodeTextColor;
+ }
+ });
+ addColorGetter(IPropertyHandler.STYLE, new IPropertyHandler<Color, NodeModel>() {
+ public Color getProperty(final NodeModel node, final Color currentValue) {
+ return getStyleTextColor(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
+ }
+ });
+ addBackgroundColorGetter(IPropertyHandler.STYLE, new IPropertyHandler<Color, NodeModel>() {
+ public Color getProperty(final NodeModel node, final Color currentValue) {
+ return getStyleBackgroundColor(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
+ }
+ });
+ addShapeGetter(IPropertyHandler.STYLE, new IPropertyHandler<ShapeConfigurationModel, NodeModel>() {
+ public ShapeConfigurationModel getProperty(final NodeModel node, final ShapeConfigurationModel currentValue) {
+ final MapModel map = node.getMap();
+ final LogicalStyleController styleController = LogicalStyleController.getController(modeController);
+ final Collection<IStyle> style = styleController.getStyles(node);
+ final ShapeConfigurationModel returnedShape = getStyleShape(map, style);
+ return returnedShape;
+ }
+ });
+ addShapeGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<ShapeConfigurationModel, NodeModel>() {
+ public ShapeConfigurationModel getProperty(final NodeModel node, final ShapeConfigurationModel currentValue) {
+ return ShapeConfigurationModel.AS_PARENT;
+ }
+ });
+
+ addTextAlignGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<TextAlign, NodeModel>() {
+ public TextAlign getProperty(final NodeModel node, final TextAlign currentValue) {
+ return TextAlign.DEFAULT;
+ }
+ });
+
+ addTextAlignGetter(IPropertyHandler.STYLE, new IPropertyHandler<TextAlign, NodeModel>() {
+ public TextAlign getProperty(final NodeModel node, final TextAlign currentValue) {
+ return getTextAlign(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
+ }
+ });
+
+ final MapController mapController = modeController.getMapController();
+ final ReadManager readManager = mapController.getReadManager();
+ final WriteManager writeManager = mapController.getWriteManager();
+ final NodeStyleBuilder styleBuilder = new NodeStyleBuilder(this);
+ styleBuilder.registerBy(readManager, writeManager);
+ }
+
+ public IPropertyHandler<Color, NodeModel> addBackgroundColorGetter(final Integer key,
+ final IPropertyHandler<Color, NodeModel> getter) {
+ return backgroundColorHandlers.addGetter(key, getter);
+ }
+
+ public IPropertyHandler<Color, NodeModel> addColorGetter(final Integer key,
+ final IPropertyHandler<Color, NodeModel> getter) {
+ return textColorHandlers.addGetter(key, getter);
+ }
+
+ public IPropertyHandler<TextAlign, NodeModel> addTextAlignGetter(final Integer key,
+ final IPropertyHandler<TextAlign, NodeModel> getter) {
+ return textAlignHandlers.addGetter(key, getter);
+ }
+
+ public IPropertyHandler<Font, NodeModel> addFontGetter(final Integer key,
+ final IPropertyHandler<Font, NodeModel> getter) {
+ return fontHandlers.addGetter(key, getter);
+ }
+
+ public IPropertyHandler<ShapeConfigurationModel, NodeModel> addShapeGetter(final Integer key,
+ final IPropertyHandler<ShapeConfigurationModel, NodeModel> getter) {
+ return shapeHandlers.addGetter(key, getter);
+ }
+
+ public Color getBackgroundColor(final NodeModel node) {
+ return backgroundColorHandlers.getProperty(node);
+ }
+
+ public Color getColor(final NodeModel node) {
+ return textColorHandlers.getProperty(node);
+ }
+
+ private Color getStyleBackgroundColor(final MapModel map, final Collection<IStyle> styleKeys) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : styleKeys){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(styleNode);
+ if (styleModel == null) {
+ continue;
+ }
+ final Color styleColor =styleModel.getBackgroundColor();
+ if (styleColor == null) {
+ continue;
+ }
+ return styleColor;
+ }
+ return null;
+ }
+
+ private Quantity<LengthUnits> getStyleMaxNodeWidth(final MapModel map, final Collection<IStyle> styleKeys) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : styleKeys){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final NodeSizeModel sizeModel = NodeSizeModel.getModel(styleNode);
+ if (sizeModel == null) {
+ continue;
+ }
+ final Quantity<LengthUnits> maxTextWidth = sizeModel.getMaxNodeWidth();
+ if (maxTextWidth == null) {
+ continue;
+ }
+ return maxTextWidth;
+ }
+ return DEFAULT_MAXIMUM_WIDTH;
+ }
+
+ private Quantity<LengthUnits> getStyleMinWidth(final MapModel map, final Collection<IStyle> styleKeys) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : styleKeys){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final NodeSizeModel sizeModel = NodeSizeModel.getModel(styleNode);
+ if (sizeModel == null) {
+ continue;
+ }
+ final Quantity<LengthUnits> minWidth = sizeModel.getMinNodeWidth();
+ if (minWidth == null) {
+ continue;
+ }
+ return minWidth;
+ }
+ return DEFAULT_MINIMUM_WIDTH;
+ }
+
+ public static Font getDefaultFont() {
+ final int fontSize = NodeStyleController.getDefaultFontSize();
+ final int fontStyle = NodeStyleController.getDefaultFontStyle();
+ final String fontFamily = NodeStyleController.getDefaultFontFamilyName();
+ return new Font(fontFamily, fontStyle, fontSize);
+ }
+
+ /**
+ */
+ private static String getDefaultFontFamilyName() {
+ return ResourceController.getResourceController().getProperty("defaultfont");
+ }
+
+ private static int getDefaultFontStyle() {
+ return ResourceController.getResourceController().getIntProperty("defaultfontstyle", 0);
+ }
+
+ private static int getDefaultFontSize() {
+ return ResourceController.getResourceController().getIntProperty("defaultfontsize", 10);
+ }
+
+ public Font getDefaultFont(final MapModel map, final IStyle style) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ final NodeModel styleNode = model.getStyleNodeSafe(style);
+ return getFont(styleNode);
+ }
+
+ private Font getStyleFont(final Font baseFont, final MapModel map, final Collection<IStyle> collection) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ Boolean bold = null;
+ Boolean italic = null;
+ String fontFamilyName = null;
+ Integer fontSize = null;
+ for(IStyle styleKey : collection){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(styleNode);
+ if (styleModel == null) {
+ continue;
+ }
+ if (bold == null) bold = styleModel.isBold();
+ if (italic == null) italic = styleModel.isItalic();
+ if (fontFamilyName == null) fontFamilyName = styleModel.getFontFamilyName();
+ if (fontSize == null) fontSize = styleModel.getFontSize();
+ if(bold != null && italic != null && fontFamilyName != null && fontSize != null) break;
+ }
+ return createFont(baseFont, fontFamilyName, fontSize, bold, italic);
+ }
+
+ public TextAlign getTextAlign(final NodeModel node) {
+ return textAlignHandlers.getProperty(node);
+ }
+
+ private Font createFont(final Font baseFont, String family, Integer size, Boolean bold, Boolean italic) {
+ if (family == null && size == null && bold == null && italic == null) {
+ return baseFont;
+ }
+ if (family == null) {
+ family = baseFont.getFamily();
+ }
+ if (size == null) {
+ size = baseFont.getSize();
+ }
+ if (bold == null) {
+ bold = baseFont.isBold();
+ }
+ if (italic == null) {
+ italic = baseFont.isItalic();
+ }
+ int style = 0;
+ if (bold) {
+ style += Font.BOLD;
+ }
+ if (italic) {
+ style += Font.ITALIC;
+ }
+ return new Font(family, style, size);
+ }
+
+ private ShapeConfigurationModel getStyleShape(final MapModel map, final Collection<IStyle> style) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : style){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(styleNode);
+ if (styleModel == null) {
+ continue;
+ }
+ final ShapeConfigurationModel shapeConfiguration = styleModel.getShapeConfiguration();
+ if (shapeConfiguration.getShape() == null) {
+ continue;
+ }
+ return shapeConfiguration;
+ }
+ return null;
+ }
+
+ private Color getStyleTextColor(final MapModel map, final Collection<IStyle> collection) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : collection){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(styleNode);
+ if (styleModel == null) {
+ continue;
+ }
+ final Color styleColor = styleModel == null ? null : styleModel.getColor();
+ if (styleColor == null) {
+ continue;
+ }
+ return styleColor;
+ }
+ return null;
+ }
+
+ private TextAlign getTextAlign(final MapModel map, final Collection<IStyle> style) {
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ for(IStyle styleKey : style){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(styleNode);
+ if (styleModel == null) {
+ continue;
+ }
+ final TextAlign textAlign = styleModel.getTextAlign();
+ if (textAlign == null) {
+ continue;
+ }
+ return textAlign;
+ }
+ return null;
+ }
+ public Font getFont(final NodeModel node) {
+ final Font font = fontHandlers.getProperty(node, null);
+ return font;
+ }
+
+ public String getFontFamilyName(final NodeModel node) {
+ final Font font = getFont(node);
+ return font.getFamily();
+ }
+
+ public int getFontSize(final NodeModel node) {
+ final Font font = getFont(node);
+ return font.getSize();
+ }
+
+ public Shape getShape(final NodeModel node) {
+ final ShapeConfigurationModel shapeConfiguration = shapeHandlers.getProperty(node);
+ return shapeConfiguration.getShape();
+ }
+
+ public ShapeConfigurationModel getShapeConfiguration(NodeModel node) {
+ final ShapeConfigurationModel shapeConfiguration = shapeHandlers.getProperty(node);
+ return shapeConfiguration;
+ }
+
+
+ public boolean isBold(final NodeModel node) {
+ return getFont(node).isBold();
+ }
+
+ public boolean isItalic(final NodeModel node) {
+ return getFont(node).isItalic();
+ }
+
+ public Boolean getNodeNumbering(NodeModel node) {
+ final NodeStyleModel style = (NodeStyleModel) node.getExtension(NodeStyleModel.class);
+ if (style == null)
+ return false;
+ final Boolean nodeNumbering = style.getNodeNumbering();
+ return nodeNumbering == null ? false : nodeNumbering.booleanValue();
+ }
+
+ public String getNodeFormat(NodeModel node) {
+ final NodeStyleModel style = (NodeStyleModel) node.getExtension(NodeStyleModel.class);
+ return style == null ? null : style.getNodeFormat();
+ }
+
+ public Quantity<LengthUnits> getMaxWidth(NodeModel node) {
+ final MapModel map = node.getMap();
+ final LogicalStyleController styleController = LogicalStyleController.getController(modeController);
+ final Collection<IStyle> style = styleController.getStyles(node);
+ final Quantity<LengthUnits> maxTextWidth = getStyleMaxNodeWidth(map, style);
+ return maxTextWidth;
+ }
+
+ public Quantity<LengthUnits> getMinWidth(NodeModel node) {
+ final MapModel map = node.getMap();
+ final LogicalStyleController styleController = LogicalStyleController.getController(modeController);
+ final Collection<IStyle> style = styleController.getStyles(node);
+ final Quantity<LengthUnits> minWidth = getStyleMinWidth(map, style);
+ return minWidth;
+ }
+
+ public ModeController getModeController() {
+ return modeController;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeStyleModel.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeStyleModel.java
new file mode 100644
index 0000000..34bf9bb
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodestyle/NodeStyleModel.java
@@ -0,0 +1,321 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodestyle;
+
+import java.awt.Color;
+
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev 20.11.2008
+ */
+public class NodeStyleModel implements IExtension, Cloneable {
+ public enum Shape{fork(false), bubble, oval, rectangle, wide_hexagon, narrow_hexagon, as_parent(false), combined;
+ public final boolean hasConfiguration;
+
+ private Shape() {
+ this(true);
+ }
+ private Shape(boolean hasConfiguration) {
+ this.hasConfiguration = hasConfiguration;
+ }
+
+ }
+
+ public enum TextAlign {
+ DEFAULT(SwingConstants.LEFT),
+ LEFT(SwingConstants.LEFT),
+ RIGHT(SwingConstants.RIGHT),
+ CENTER(SwingConstants.CENTER);
+
+ final public int swingConstant;
+
+ TextAlign(int swingConstant){
+ this.swingConstant = swingConstant;}
+ };
+
+ public static NodeStyleModel createNodeStyleModel(final NodeModel node) {
+ NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ if (styleModel == null) {
+ styleModel = new NodeStyleModel();
+ node.addExtension(styleModel);
+ }
+ return styleModel;
+ }
+
+ public static Color getBackgroundColor(final NodeModel node) {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ return styleModel == null ? null : styleModel.getBackgroundColor();
+ }
+
+ public static Color getColor(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? null : styleModel.getColor();
+ }
+
+ public static String getFontFamilyName(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? null : styleModel.getFontFamilyName();
+ }
+
+ public static Integer getFontSize(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? null : styleModel.getFontSize();
+ }
+
+ public static NodeStyleModel getModel(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel;
+ }
+
+ public static Boolean getNodeNumbering(NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? null : styleModel.getNodeNumbering();
+ }
+
+ public static String getNodeFormat(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? null : styleModel.getNodeFormat();
+ }
+
+ public static Shape getShape(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? null : styleModel.getShape();
+ }
+
+ public static ShapeConfigurationModel getShapeConfiguration(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? ShapeConfigurationModel.NULL_SHAPE : styleModel.getShapeConfiguration();
+ }
+
+ public static Boolean isBold(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? null : styleModel.isBold();
+ }
+
+ public static Boolean isItalic(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? null : styleModel.isItalic();
+ }
+
+ public static TextAlign getTextAlign(final NodeModel node) {
+ final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
+ return styleModel == null ? null : styleModel.getTextAlign();
+ }
+
+ public static void setBackgroundColor(final NodeModel node, final Color color) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setBackgroundColor(color);
+ }
+
+ public static void setColor(final NodeModel node, final Color color) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setColor(color);
+ }
+
+ public static void setNodeNumbering(NodeModel node, Boolean enableNodeNumbering) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setNodeNumbering(enableNodeNumbering);
+ }
+
+ public static void setNodeFormat(final NodeModel node, final String nodeFormat) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setNodeFormat(nodeFormat);
+ }
+
+ public static void setShape(final NodeModel node, final String shape) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setShape(shape);
+ }
+
+ public static void setShape(final NodeModel node, final Shape shape) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setShape(shape);
+ }
+
+ public static void setShapeHorizontalMargin(final NodeModel node, final Quantity<LengthUnits> margin) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setShapeConfiguration(styleModel.getShapeConfiguration().withHorizontalMargin(margin));
+ }
+
+ public static void setShapeVerticalMargin(final NodeModel node, final Quantity<LengthUnits> margin) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setShapeConfiguration(styleModel.getShapeConfiguration().withVerticalMargin(margin));
+ }
+
+ public static void setShapeUniform(final NodeModel node, final boolean uniform) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setShapeConfiguration(styleModel.getShapeConfiguration().withUniform(uniform));
+ }
+
+ public static void setShapeConfiguration(final NodeModel node, final ShapeConfigurationModel shape) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setShapeConfiguration(shape);
+ }
+
+ public static void setTextAlign(final NodeModel node, final TextAlign textAlign) {
+ final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
+ styleModel.setTextAlign(textAlign);
+ }
+
+ private Color backgroundColor;
+ private Color color;
+ private String fontFamilyName = null;
+ private Integer fontSize = null;
+ private Boolean isBold = null;
+ private Boolean isItalic = null;
+ private ShapeConfigurationModel shapeConfiguration = ShapeConfigurationModel.NULL_SHAPE;
+ private Boolean nodeNumbering = null;
+ private String nodeFormat = null;
+ private TextAlign textAlign = null;
+
+ @Override
+ protected NodeStyleModel clone() {
+ return copyTo(new NodeStyleModel());
+ }
+
+ public NodeStyleModel copyTo(final NodeStyleModel nodeStyleModel) {
+ if(color != null)
+ nodeStyleModel.setColor(color);
+ if(backgroundColor != null)
+ nodeStyleModel.setBackgroundColor(backgroundColor);
+ if(isBold != null)
+ nodeStyleModel.setBold(isBold);
+ if(fontFamilyName != null)
+ nodeStyleModel.setFontFamilyName(fontFamilyName);
+ if(fontSize != null)
+ nodeStyleModel.setFontSize(fontSize);
+ if(isItalic != null)
+ nodeStyleModel.setItalic(isItalic);
+ if(getShapeConfiguration() != null)
+ nodeStyleModel.setShapeConfiguration(getShapeConfiguration());
+ if(nodeFormat != null)
+ nodeStyleModel.setNodeFormat(nodeFormat);
+ if(nodeNumbering != null)
+ nodeStyleModel.setNodeNumbering(nodeNumbering);
+ if(textAlign != null)
+ nodeStyleModel.setTextAlign(textAlign);
+ return nodeStyleModel;
+ }
+
+ public Color getBackgroundColor() {
+ return backgroundColor;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public String getFontFamilyName() {
+ return fontFamilyName;
+ };
+
+ public Integer getFontSize() {
+ return fontSize;
+ }
+
+ public Boolean getNodeNumbering() {
+ return nodeNumbering;
+ }
+
+ public String getNodeFormat() {
+ return nodeFormat;
+ }
+
+ public Shape getShape() {
+ return getShapeConfiguration().getShape();
+ }
+
+ public Boolean isBold() {
+ return isBold;
+ }
+
+ public Boolean isItalic() {
+ return isItalic;
+ }
+
+ public TextAlign getTextAlign() {
+ return textAlign;
+ }
+
+ public void setBackgroundColor(final Color color) {
+ backgroundColor = color;
+ }
+
+ public void setBold(final Boolean isBold) {
+ this.isBold = isBold;
+ }
+
+ public void setColor(final Color color) {
+ this.color = color;
+ }
+
+ public void setFontFamilyName(final String fontFamilyName) {
+ this.fontFamilyName = fontFamilyName;
+ }
+
+ public void setFontSize(final Integer fontSize) {
+ this.fontSize = fontSize;
+ }
+
+ public void setItalic(final Boolean isItalic) {
+ this.isItalic = isItalic;
+ }
+
+ public void setNodeNumbering(Boolean enableNodeNumbering) {
+ this.nodeNumbering = enableNodeNumbering;
+ }
+
+ public void setNodeFormat(String nodeFormat) {
+ this.nodeFormat = nodeFormat;
+ }
+
+ public void setShape(final String shape) {
+ try {
+ this.setShapeConfiguration(getShapeConfiguration().withShape(shape != null ? Shape.valueOf(shape) : null));
+ } catch (IllegalArgumentException e) {
+ LogUtils.warn("unknown shape " + shape);
+ }
+ }
+
+ public void setShape(final Shape shape) {
+ this.setShapeConfiguration(getShapeConfiguration().withShape(shape));
+ }
+
+ public void setTextAlign(final TextAlign textAlign) {
+ this.textAlign = textAlign;
+ }
+
+ public ShapeConfigurationModel getShapeConfiguration() {
+ return shapeConfiguration;
+ }
+
+ public void setShapeConfiguration(ShapeConfigurationModel shapeConfiguration) {
+ if (shapeConfiguration == null)
+ throw new RuntimeException("Null pointer as shapeConfiguration");
+ this.shapeConfiguration = shapeConfiguration;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/nodestyle/ShapeConfigurationModel.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/ShapeConfigurationModel.java
new file mode 100644
index 0000000..6104fef
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodestyle/ShapeConfigurationModel.java
@@ -0,0 +1,88 @@
+package org.freeplane.features.nodestyle;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.nodestyle.NodeStyleModel.Shape;
+
+public class ShapeConfigurationModel {
+ final private NodeStyleModel.Shape shape;
+ final private Quantity<LengthUnits> horizontalMargin;
+ final private Quantity<LengthUnits> verticalMargin;
+ final private boolean isUniform;
+
+ private ShapeConfigurationModel(final Shape shape, final Quantity<LengthUnits> horizontalMargin, final Quantity<LengthUnits> verticalMargin, final boolean isUniform) {
+ super();
+ this.shape = shape;
+ this.horizontalMargin = horizontalMargin;
+ this.verticalMargin = verticalMargin;
+ this.isUniform = isUniform;
+ }
+
+
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((horizontalMargin == null) ? 0 : horizontalMargin.hashCode());
+ result = prime * result + (isUniform ? 1231 : 1237);
+ result = prime * result + ((shape == null) ? 0 : shape.hashCode());
+ result = prime * result + ((verticalMargin == null) ? 0 : verticalMargin.hashCode());
+ return result;
+ }
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ShapeConfigurationModel other = (ShapeConfigurationModel) obj;
+ if (shape != other.shape)
+ return false;
+ if (isUniform != other.isUniform)
+ return false;
+ if (!horizontalMargin.equals(other.horizontalMargin))
+ return false;
+ if (!verticalMargin.equals(other.verticalMargin))
+ return false;
+ return true;
+ }
+
+
+
+ final static public Quantity<LengthUnits> DEFAULT_MARGIN = new Quantity<LengthUnits>(2, LengthUnits.pt);
+ public static ShapeConfigurationModel NULL_SHAPE = new ShapeConfigurationModel(null, DEFAULT_MARGIN, DEFAULT_MARGIN, false);
+ public static final ShapeConfigurationModel AS_PARENT = NULL_SHAPE.withShape(Shape.as_parent);
+ public static final ShapeConfigurationModel FORK = NULL_SHAPE.withShape(Shape.fork);
+ private static final Quantity<LengthUnits> DEFAULT_HORIZONTAL_OVAL_MARGIN = new Quantity<LengthUnits>(6, LengthUnits.pt);
+ private static final Quantity<LengthUnits> DEFAULT_VERTICAL_OVAL_MARGIN = new Quantity<LengthUnits>(12, LengthUnits.pt);
+ public static final ShapeConfigurationModel DEFAULT_ROOT_OVAL = NULL_SHAPE.withShape(Shape.oval)
+ .withHorizontalMargin(DEFAULT_HORIZONTAL_OVAL_MARGIN).withVerticalMargin(DEFAULT_VERTICAL_OVAL_MARGIN);
+ public NodeStyleModel.Shape getShape() {
+ return shape;
+ }
+ public Quantity<LengthUnits> getHorizontalMargin() {
+ return horizontalMargin;
+ }
+ public Quantity<LengthUnits> getVerticalMargin() {
+ return verticalMargin;
+ }
+ public boolean isUniform() {
+ return isUniform;
+ }
+ public ShapeConfigurationModel withShape(NodeStyleModel.Shape shape) {
+ return new ShapeConfigurationModel(shape, horizontalMargin, verticalMargin, isUniform);
+ }
+ public ShapeConfigurationModel withHorizontalMargin(Quantity<LengthUnits> horizontalMargin) {
+ return new ShapeConfigurationModel(shape, horizontalMargin, verticalMargin, isUniform);
+ }
+ public ShapeConfigurationModel withVerticalMargin(Quantity<LengthUnits> verticalMargin) {
+ return new ShapeConfigurationModel(shape, horizontalMargin, verticalMargin, isUniform);
+ }
+ public ShapeConfigurationModel withUniform(boolean isUniform) {
+ return new ShapeConfigurationModel(shape, horizontalMargin, verticalMargin, isUniform);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/filemode/FNodeStyleController.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/filemode/FNodeStyleController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/filemode/FNodeStyleController.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/filemode/FNodeStyleController.java
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/BoldAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/BoldAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/mindmapmode/BoldAction.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/BoldAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/CopyFormat.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/CopyFormat.java
new file mode 100644
index 0000000..d187b7f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/CopyFormat.java
@@ -0,0 +1,104 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodestyle.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.mindmapmode.MIconController.Keys;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.LogicalStyleKeys;
+
+/**
+ * @author foltin
+ */
+class CopyFormat extends AFreeplaneAction {
+ private static NodeModel pattern = null;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public static NodeModel getPattern() {
+ return pattern;
+ }
+
+ public CopyFormat() {
+ super("FormatCopy");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ copyFormat(Controller.getCurrentModeController().getMapController().getSelectedNode());
+ }
+
+ /**
+ */
+ private void copyFormat(final NodeModel node) {
+ CopyFormat.pattern = new NodeModel(null);
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.copyExtensions(LogicalStyleKeys.NODE_STYLE, node, pattern);
+ modeController.copyExtensions(LogicalStyleKeys.LOGICAL_STYLE, node, pattern);
+ if(ResourceController.getResourceController().getBooleanProperty("copyFormatToNewSiblingIncludesIcons")) {
+ modeController.copyExtensions(Keys.ICONS, node, pattern);
+ }
+ }
+}
+
+class PasteFormat extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public PasteFormat() {
+ super("FormatPaste");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ pasteFormat(node);
+ }
+
+ /**
+ */
+ private void pasteFormat(final NodeModel node) {
+ final NodeModel pattern = CopyFormat.getPattern();
+ if (pattern == null) {
+ JOptionPane.showMessageDialog(Controller.getCurrentController().getViewController().getCurrentRootComponent(), TextUtils
+ .getText("no_format_copy_before_format_paste"), "" /*=Title*/, JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.undoableRemoveExtensions(LogicalStyleKeys.LOGICAL_STYLE, node, node);
+ modeController.undoableCopyExtensions(LogicalStyleKeys.LOGICAL_STYLE, pattern, node);
+ modeController.undoableRemoveExtensions(LogicalStyleKeys.NODE_STYLE, node, node);
+ modeController.undoableCopyExtensions(LogicalStyleKeys.NODE_STYLE, pattern, node);
+ if(ResourceController.getResourceController().getBooleanProperty("copyFormatToNewSiblingIncludesIcons")) {
+ modeController.undoableRemoveExtensions(Keys.ICONS, node, node);
+ modeController.undoableCopyExtensions(Keys.ICONS, pattern, node);
+ }
+
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/FontFamilyAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/FontFamilyAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/mindmapmode/FontFamilyAction.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/FontFamilyAction.java
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/FontSizeAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/FontSizeAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/mindmapmode/FontSizeAction.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/FontSizeAction.java
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/ItalicAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/ItalicAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/mindmapmode/ItalicAction.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/ItalicAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/MNodeStyleController.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/MNodeStyleController.java
new file mode 100644
index 0000000..543bedf
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/MNodeStyleController.java
@@ -0,0 +1,668 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodestyle.mindmapmode;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.IExtensionCopier;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeSizeModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.nodestyle.NodeStyleModel.Shape;
+import org.freeplane.features.nodestyle.NodeStyleModel.TextAlign;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+import org.freeplane.features.styles.LogicalStyleKeys;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MNodeStyleController extends NodeStyleController {
+ private static class StyleCopier implements IExtensionCopier {
+ final private ModeController modeController;
+
+ public StyleCopier(ModeController modeController) {
+ this.modeController = modeController;
+ }
+
+ public void copy(final Object key, final NodeModel from, final NodeModel to) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ copy(from, to);
+ }
+
+ public void copy(final NodeModel from, final NodeModel to) {
+ final NodeStyleModel fromStyle = from.getExtension(NodeStyleModel.class);
+ if (fromStyle != null) {
+ fromStyle.copyTo(NodeStyleModel.createNodeStyleModel(to));
+ }
+ final NodeSizeModel fromSize = from.getExtension(NodeSizeModel.class);
+ if (fromSize != null) {
+ fromSize.copyTo(NodeSizeModel.createNodeSizeModel(to));
+ }
+
+ }
+
+ public void remove(final Object key, final NodeModel from) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ from.removeExtension(NodeStyleModel.class);
+ from.removeExtension(NodeSizeModel.class);
+ }
+
+ public void remove(final Object key, final NodeModel from, final NodeModel which) {
+ removeStyleData(key, from, which);
+ removeSizeData(key, from, which);
+ }
+
+ private void removeSizeData(Object key, NodeModel from, NodeModel which) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ final NodeSizeModel whichData = which.getExtension(NodeSizeModel.class);
+ if (whichData == null) {
+ return;
+ }
+ final NodeSizeModel fromData = from.getExtension(NodeSizeModel.class);
+ if (fromData == null) {
+ return;
+ }
+ if (null != whichData.getMaxNodeWidth()) {
+ fromData.setMaxNodeWidth(null);
+ }
+ if (null != whichData.getMinNodeWidth()) {
+ fromData.setMinNodeWidth(null);
+ }
+ }
+
+ private void removeStyleData(Object key, NodeModel from, NodeModel which) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ final NodeStyleModel whichStyle = (NodeStyleModel) which.getExtension(NodeStyleModel.class);
+ if (whichStyle == null) {
+ return;
+ }
+ final NodeStyleModel fromStyle = (NodeStyleModel) from.getExtension(NodeStyleModel.class);
+ if (fromStyle == null) {
+ return;
+ }
+ if (null != whichStyle.isBold()) {
+ fromStyle.setBold(null);
+ }
+ if (null != whichStyle.isItalic()) {
+ fromStyle.setItalic(null);
+ }
+ if (null != whichStyle.getFontFamilyName()) {
+ fromStyle.setFontFamilyName(null);
+ }
+ if (null != whichStyle.getFontSize()) {
+ fromStyle.setFontSize(null);
+ }
+ if (null != whichStyle.getShape()) {
+ fromStyle.setShapeConfiguration(ShapeConfigurationModel.NULL_SHAPE);
+ }
+ if (null != whichStyle.getColor()) {
+ fromStyle.setColor(null);
+ }
+ if (null != whichStyle.getBackgroundColor()) {
+ fromStyle.setBackgroundColor(null);
+ }
+ if (null != whichStyle.getNodeFormat()) {
+ fromStyle.setNodeFormat(null);
+ }
+ if (null != whichStyle.getNodeNumbering()) {
+ fromStyle.setNodeNumbering(null);
+ }
+ if (null != whichStyle.getTextAlign()) {
+ fromStyle.setTextAlign(null);
+ }
+ }
+
+ public void resolveParentExtensions(Object key, NodeModel to) {
+ if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
+ return;
+ }
+ resolveShape(to);
+ }
+ private void resolveShape(NodeModel to) {
+ if (hasOwnShape(to))
+ return;
+ for(NodeModel source = to.getParentNode(); source != null; source = source.getParentNode() ){
+ if(hasOwnShape(source)){
+ final Shape shape = getShape(source);
+ NodeStyleModel.createNodeStyleModel(to).setShape(shape);
+ return;
+ }
+ }
+ }
+
+ private boolean hasOwnShape(NodeModel to) {
+ return ! Shape.as_parent.equals(getShape(to));
+ }
+
+ private Shape getShape(NodeModel node) {
+ return modeController.getExtension(NodeStyleController.class).getShape(node);
+ }
+
+ }
+
+ public MNodeStyleController(final ModeController modeController) {
+ super(modeController);
+ modeController.registerExtensionCopier(new StyleCopier(modeController));
+ modeController.addAction(new BoldAction());
+ modeController.addAction(new ItalicAction());
+ modeController.addAction(new CopyFormat());
+ modeController.addAction(new PasteFormat());
+ modeController.addAction(new RemoveFormatAction());
+ modeController.addAction(new TextAlignAction(TextAlign.LEFT));
+ modeController.addAction(new TextAlignAction(TextAlign.CENTER));
+ modeController.addAction(new TextAlignAction(TextAlign.RIGHT));
+ final AMultipleNodeAction increaseNodeFont = new AMultipleNodeAction("IncreaseNodeFontAction") {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ increaseFontSize(node, 1);
+ }
+ };
+ modeController.addAction(increaseNodeFont);
+ final AMultipleNodeAction decreaseNodeFont = new AMultipleNodeAction("DecreaseNodeFontAction") {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ increaseFontSize(node, -1);
+ }
+ };
+ modeController.addAction(decreaseNodeFont);
+ modeController.addAction(new NodeColorAction());
+ modeController.addAction(new NodeColorBlendAction());
+ modeController.addAction(new NodeBackgroundColorAction());
+ for(NodeStyleModel.Shape shape : NodeStyleModel.Shape.values()){
+ if(shape.equals(Shape.as_parent))
+ break;
+ modeController.addAction(new NodeShapeAction(shape));
+ }
+ }
+
+ public void copyStyle(final NodeModel source, final NodeModel target) {
+ copyStyleModel(source, target);
+ copySizeModel(source, target);
+ }
+
+ protected void copyStyleModel(final NodeModel source, final NodeModel target) {
+ final NodeStyleModel sourceStyleModel = NodeStyleModel.getModel(source);
+ if (sourceStyleModel != null) {
+ setColor(target, sourceStyleModel.getColor());
+ setBackgroundColor(target, sourceStyleModel.getBackgroundColor());
+ setShapeConfiguration(target, sourceStyleModel.getShapeConfiguration());
+ setFontFamily(target, sourceStyleModel.getFontFamilyName());
+ setFontSize(target, sourceStyleModel.getFontSize());
+ setBold(target, sourceStyleModel.isBold());
+ setItalic(target, sourceStyleModel.isItalic());
+ setNodeFormat(target, sourceStyleModel.getNodeFormat());
+ setNodeNumbering(target, sourceStyleModel.getNodeNumbering());
+ setTextAlign(target, sourceStyleModel.getTextAlign());
+ }
+ }
+ protected void copySizeModel(final NodeModel source, final NodeModel target) {
+ final NodeSizeModel sourceSizeModel = NodeSizeModel.getModel(source);
+ if (sourceSizeModel != null) {
+ setMaxNodeWidth(target, sourceSizeModel.getMaxNodeWidth());
+ setMinNodeWidth(target, sourceSizeModel.getMinNodeWidth());
+ }
+ }
+
+ private NodeStyleModel createOwnStyleModel(final NodeModel node) {
+ {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ if (styleModel != null) {
+ return styleModel;
+ }
+ }
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IActor actor = new IActor() {
+ public void act() {
+ node.addExtension(new NodeStyleModel());
+ }
+
+ public String getDescription() {
+ return null;
+ }
+
+ public void undo() {
+ node.removeExtension(NodeStyleModel.class);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ return NodeStyleModel.getModel(node);
+ }
+
+ private NodeSizeModel createOwnSizeModel(final NodeModel node) {
+ {
+ final NodeSizeModel sizeModel = NodeSizeModel.getModel(node);
+ if (sizeModel != null) {
+ return sizeModel;
+ }
+ }
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IActor actor = new IActor() {
+ public void act() {
+ node.addExtension(new NodeSizeModel());
+ }
+
+ public String getDescription() {
+ return null;
+ }
+
+ public void undo() {
+ node.removeExtension(NodeSizeModel.class);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ return NodeSizeModel.getModel(node);
+ }
+
+ /**
+ *
+ */
+ public void increaseFontSize(final NodeModel node, final int increment) {
+ final int newSize = getFontSize(node) + increment;
+ if (newSize > 0) {
+ setFontSize(node, newSize);
+ }
+ }
+
+ public void setBackgroundColor(final NodeModel node, final Color color) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Color oldColor = NodeStyleModel.getBackgroundColor(node);
+ if (color == oldColor || color != null && color.equals(oldColor)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ NodeStyleModel.setBackgroundColor(node, color);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setBackgroundColor";
+ }
+
+ public void undo() {
+ NodeStyleModel.setBackgroundColor(node, oldColor);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ /**
+ * @param bold
+ */
+ public void setBold(final NodeModel node, final Boolean bold) {
+ final Boolean oldBold = NodeStyleModel.isBold(node);
+ if (oldBold == bold || oldBold != null && oldBold.equals(bold)) {
+ return;
+ }
+ createOwnStyleModel(node);
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IActor actor = new IActor() {
+ public void act() {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ styleModel.setBold(bold);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setBold";
+ }
+
+ public void undo() {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ styleModel.setBold(oldBold);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void setColor(final NodeModel node, final Color color) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Color oldColor = NodeStyleModel.getColor(node);
+ if (oldColor == color || oldColor != null && oldColor.equals(color)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ NodeStyleModel.setColor(node, color);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setColor";
+ }
+
+ public void undo() {
+ NodeStyleModel.setColor(node, oldColor);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ /**
+ * @param fontFamily
+ */
+ public void setFontFamily(final NodeModel node, final String fontFamily) {
+ final String oldFontFamily = NodeStyleModel.getFontFamilyName(node);
+ if (oldFontFamily == fontFamily || oldFontFamily != null && oldFontFamily.equals(fontFamily)) {
+ return;
+ }
+ createOwnStyleModel(node);
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IActor actor = new IActor() {
+ public void act() {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ styleModel.setFontFamilyName(fontFamily);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setFontFamily";
+ }
+
+ public void undo() {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ styleModel.setFontFamilyName(oldFontFamily);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void setFontFamily(final String fontFamily) {
+ for (final NodeModel selected : Controller.getCurrentModeController().getMapController().getSelectedNodes()) {
+ setFontFamily(selected, fontFamily);
+ }
+ }
+
+ public void setFontSize(final int size) {
+ final Collection<NodeModel> selectedNodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel selected : selectedNodes) {
+ setFontSize(selected, size);
+ }
+ }
+
+ /**
+ * @param fontSize
+ */
+ public void setFontSize(final NodeModel node, final Integer fontSize) {
+ final Integer oldFontSize = NodeStyleModel.getFontSize(node);
+ if (oldFontSize == fontSize || oldFontSize != null && oldFontSize.equals(fontSize)) {
+ return;
+ }
+ createOwnStyleModel(node);
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IActor actor = new IActor() {
+ public void act() {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ styleModel.setFontSize(fontSize);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setFontSize";
+ }
+
+ public void undo() {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ styleModel.setFontSize(oldFontSize);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ /**
+ * @param italic
+ */
+ public void setItalic(final NodeModel node, final Boolean italic) {
+ final Boolean oldItalic = NodeStyleModel.isItalic(node);
+ if (oldItalic == italic || oldItalic != null && oldItalic.equals(italic)) {
+ return;
+ }
+ createOwnStyleModel(node);
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IActor actor = new IActor() {
+ public void act() {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ styleModel.setItalic(italic);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setItalic";
+ }
+
+ public void undo() {
+ final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
+ styleModel.setItalic(oldItalic);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void setNodeNumbering(final NodeModel node, final Boolean enableNodeNumbering) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Boolean oldValue = NodeStyleModel.getNodeNumbering(node);
+ final IActor actor = new IActor() {
+ public void act() {
+ NodeStyleModel.setNodeNumbering(node, enableNodeNumbering);
+ final MapController mapController = modeController.getMapController();
+ mapController.setSaved(node.getMap(), false);
+ mapController.delayedNodeRefresh(node, NodeStyleController.NODE_NUMBERING, oldValue, enableNodeNumbering);
+ }
+
+ public String getDescription() {
+ return "setNodeNumbering";
+ }
+
+ public void undo() {
+ NodeStyleModel.setNodeNumbering(node, oldValue);
+ final MapController mapController = modeController.getMapController();
+ mapController.setSaved(node.getMap(), false);
+ modeController.getMapController().delayedNodeRefresh(node, NodeStyleController.NODE_NUMBERING, enableNodeNumbering, oldValue);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void setNodeFormat(final NodeModel node, final String format) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final String oldFormat = NodeStyleModel.getNodeFormat(node);
+ final IActor actor = new IActor() {
+ public void act() {
+ NodeStyleModel.setNodeFormat(node, format);
+ modeController.getMapController().nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setNodeFormat";
+ }
+
+ public void undo() {
+ NodeStyleModel.setNodeFormat(node, oldFormat);
+ modeController.getMapController().nodeChanged(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void setShape(final NodeModel node, final String shape) {
+ setShape(node, shape == null ? null : Shape.valueOf(shape));
+ }
+
+ public void setShape(final NodeModel node, final Shape shape) {
+ final ShapeConfigurationModel oldShape = NodeStyleModel.getShapeConfiguration(node);
+ setShapeConfiguration(node, oldShape.withShape(shape));
+ }
+
+ public void setShapeHorizontalMargin(NodeModel node, Quantity<LengthUnits> margin) {
+ final ShapeConfigurationModel oldShape = NodeStyleModel.getShapeConfiguration(node);
+ setShapeConfiguration(node, oldShape.withHorizontalMargin(margin));
+ }
+
+ public void setShapeVerticalMargin(NodeModel node, Quantity<LengthUnits> margin) {
+ final ShapeConfigurationModel oldShape = NodeStyleModel.getShapeConfiguration(node);
+ setShapeConfiguration(node, oldShape.withVerticalMargin(margin));
+ }
+
+ public void setUniformShape(NodeModel node, boolean uniform) {
+ final ShapeConfigurationModel oldShape = NodeStyleModel.getShapeConfiguration(node);
+ setShapeConfiguration(node, oldShape.withUniform(uniform));
+ }
+
+
+ public void setShapeConfiguration(final NodeModel node, final ShapeConfigurationModel shape) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final ShapeConfigurationModel oldShape = NodeStyleModel.getShapeConfiguration(node);
+ final IActor actor = new IActor() {
+ public void act() {
+ NodeStyleModel.setShapeConfiguration(node, shape);
+ modeController.getMapController().nodeChanged(node);
+ childShapeRefresh(node);
+ }
+
+ public String getDescription() {
+ return "setShape";
+ }
+
+ private void childShapeRefresh(final NodeModel node) {
+ for (final NodeModel child : modeController.getMapController().childrenUnfolded(node)) {
+ if(child.getViewers().isEmpty())
+ continue;
+ final Shape childShape = NodeStyleModel.getShape(child);
+ if (childShape == null || NodeStyleModel.Shape.as_parent.equals(childShape)) {
+ modeController.getMapController().nodeRefresh(child);
+ childShapeRefresh(child);
+ }
+ }
+ }
+
+ public void undo() {
+ NodeStyleModel.setShapeConfiguration(node, oldShape);
+ modeController.getMapController().nodeChanged(node);
+ childShapeRefresh(node);
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+ public void setMinNodeWidth(final NodeModel node, final Quantity<LengthUnits> minNodeWidth) {
+ final NodeSizeModel sizeModel = createOwnSizeModel(node);
+ final Quantity<LengthUnits> oldValue = NodeSizeModel.getMinNodeWidth(node);
+ final IActor actor = new IActor() {
+ public void act() {
+ sizeModel.setMinNodeWidth(minNodeWidth);
+ final MapController mapController = getModeController().getMapController();
+ mapController.nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setMinNodeWidth";
+ }
+
+ public void undo() {
+ sizeModel.setMinNodeWidth(oldValue);
+ final MapController mapController = getModeController().getMapController();
+ mapController.nodeChanged(node);
+ }
+ };
+ getModeController().execute(actor, node.getMap());
+ final Quantity<LengthUnits> maxNodeWidth = getMaxWidth(node);
+ if(maxNodeWidth != null && minNodeWidth != null && maxNodeWidth.toBaseUnits() < minNodeWidth.toBaseUnits()){
+ setMaxNodeWidth(node, minNodeWidth);
+ }
+ }
+
+ public void setMaxNodeWidth(final NodeModel node, final Quantity<LengthUnits> maxNodeWidth) {
+ final NodeSizeModel sizeModel = createOwnSizeModel(node);
+ final Quantity<LengthUnits> oldValue = NodeSizeModel.getMaxNodeWidth(node);
+ final IActor actor = new IActor() {
+ public void act() {
+ sizeModel.setMaxNodeWidth(maxNodeWidth);
+ final MapController mapController = getModeController().getMapController();
+ mapController.nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setMaxNodeWidth";
+ }
+
+ public void undo() {
+ sizeModel.setMaxNodeWidth(oldValue);
+ final MapController mapController = getModeController().getMapController();
+ mapController.nodeChanged(node);
+ }
+ };
+ getModeController().execute(actor, node.getMap());
+ final Quantity<LengthUnits> minNodeWidth = getMinWidth(node);
+ if(maxNodeWidth != null && minNodeWidth != null && maxNodeWidth.toBaseUnitsRounded() < minNodeWidth.toBaseUnitsRounded()){
+ setMinNodeWidth(node, maxNodeWidth);
+ }
+ }
+
+
+ public void setTextAlign(final NodeModel node, final TextAlign textAlign) {
+ final TextAlign oldTextAlign = NodeStyleModel.getTextAlign(node);
+ final IActor actor = new IActor() {
+ public void act() {
+ NodeStyleModel.setTextAlign(node, textAlign);
+ final MapController mapController = getModeController().getMapController();
+ mapController.nodeChanged(node);
+ }
+
+ public String getDescription() {
+ return "setMaxNodeWidth";
+ }
+
+ public void undo() {
+ NodeStyleModel.setTextAlign(node, oldTextAlign);
+ final MapController mapController = getModeController().getMapController();
+ mapController.nodeChanged(node);
+ }
+ };
+ getModeController().execute(actor, node.getMap());
+
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeBackgroundColorAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/NodeBackgroundColorAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeBackgroundColorAction.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/NodeBackgroundColorAction.java
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/NodeColorAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorAction.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/NodeColorAction.java
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorBlendAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/NodeColorBlendAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeColorBlendAction.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/NodeColorBlendAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/NodeShapeAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/NodeShapeAction.java
new file mode 100644
index 0000000..632c091
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/NodeShapeAction.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodestyle.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel.Shape;
+
+class NodeShapeAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private Shape actionShape;
+
+ public NodeShapeAction( final Shape shape) {
+ super("NodeShapeAction." + shape.toString());
+ actionShape = shape;
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ ((MNodeStyleController) NodeStyleController.getController()).setShape(node, actionShape.toString());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/RemoveFormatAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/RemoveFormatAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/mindmapmode/RemoveFormatAction.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/RemoveFormatAction.java
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/RevisionPlugin.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/RevisionPlugin.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/nodestyle/mindmapmode/RevisionPlugin.java
rename to freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/RevisionPlugin.java
diff --git a/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/TextAlignAction.java b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/TextAlignAction.java
new file mode 100644
index 0000000..07e7052
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/nodestyle/mindmapmode/TextAlignAction.java
@@ -0,0 +1,67 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.nodestyle.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel.TextAlign;
+
+ at SelectableAction(checkOnNodeChange = true)
+class TextAlignAction extends AMultipleNodeAction {
+ private final TextAlign textAlign;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private boolean textAlignSet;
+
+ /**
+ */
+ public TextAlignAction(TextAlign textAlign) {
+ super("TextAlignAction." + textAlign);
+ this.textAlign =textAlign;
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ textAlignSet = !isTextAlignSet();
+ super.actionPerformed(e);
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel selected) {
+ ((MNodeStyleController) NodeStyleController.getController()).setTextAlign(selected, textAlignSet ? textAlign : null);
+ }
+
+ boolean isTextAlignSet() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ return textAlign.equals(NodeStyleController.getController().getTextAlign(node));
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(isTextAlignSet());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/note/NoteBuilder.java b/freeplane/src/main/java/org/freeplane/features/note/NoteBuilder.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/note/NoteBuilder.java
rename to freeplane/src/main/java/org/freeplane/features/note/NoteBuilder.java
diff --git a/freeplane/src/main/java/org/freeplane/features/note/NoteController.java b/freeplane/src/main/java/org/freeplane/features/note/NoteController.java
new file mode 100644
index 0000000..1cecf6f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/note/NoteController.java
@@ -0,0 +1,179 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.note;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.net.URL;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.html.CssRuleBuilder;
+import org.freeplane.features.icon.IStateIconProvider;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.ITooltipProvider;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeSizeModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.text.TextController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class NoteController implements IExtension {
+ private static boolean firstRun = true;
+ /**
+ *
+ */
+ public static final String NODE_NOTE_ICON = "accessories.plugins.NodeNoteIcon";
+ private static UIIcon noteIcon;
+ public static URL bwNoteIconUrl;
+ public static final String SHOW_NOTE_ICONS = "show_note_icons";
+ private static final Integer NOTE_TOOLTIP = 9;
+ public static final String SHOW_NOTES_IN_MAP = "show_notes_in_map";
+
+ public static NoteController getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return getController(modeController);
+ }
+
+ public static NoteController getController(ModeController modeController) {
+ return (NoteController) modeController.getExtension(NoteController.class);
+ }
+
+ public static void install( final NoteController noteController) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(NoteController.class, noteController);
+ if (firstRun) {
+ noteIcon = IconStoreFactory.create().getUIIcon("knotes.png");
+ bwNoteIconUrl = ResourceController.getResourceController().getResource("/images/note_black_and_transp.png");
+ firstRun = false;
+ }
+ }
+
+ final private ModeController modeController;
+
+ public NoteController() {
+ super();
+ final ModeController modeController = Controller.getCurrentModeController();
+ this.modeController = modeController;
+ modeController.getMapController().getReadManager().addElementHandler("richcontent", new NoteBuilder(this));
+ final NoteWriter noteWriter = new NoteWriter(this);
+ final WriteManager writeManager = modeController.getMapController().getWriteManager();
+ writeManager.addAttributeWriter("map", noteWriter);
+ writeManager.addExtensionElementWriter(NoteModel.class, noteWriter);
+ registerNoteTooltipProvider(modeController);
+ registerStateIconProvider();
+ }
+
+ public final String getNoteText(final NodeModel node) {
+ final NoteModel extension = (NoteModel) node.getExtension(NoteModel.class);
+ return extension != null ? extension.getHtml() : null;
+ }
+
+ public final String getXmlNoteText(final NodeModel node) {
+ final NoteModel extension = (NoteModel) node.getExtension(NoteModel.class);
+ return extension != null ? extension.getXml() : null;
+ }
+
+ /**
+ * @param data.node
+ */
+ protected void onWrite(final MapModel map) {
+ }
+
+ private void registerNoteTooltipProvider(ModeController modeController) {
+ modeController.addToolTipProvider(NOTE_TOOLTIP, new ITooltipProvider() {
+ public String getTooltip(ModeController modeController, NodeModel node, Component view) {
+ if(showNotesInMap(node.getMap()) && ! TextController.getController(modeController).isMinimized(node)){
+ return null;
+ }
+ final String noteText = NoteModel.getNoteText(node);
+ if (noteText == null)
+ return null;
+ final String rule = getNoteCSSStyle(modeController, node, true);
+ final StringBuilder tooltipBodyBegin = new StringBuilder("<body><div style=\"");
+ tooltipBodyBegin.append(rule);
+ tooltipBodyBegin.append("\">");
+ tooltipBodyBegin.append("<img src =\"");
+ tooltipBodyBegin.append(bwNoteIconUrl.toString());
+ tooltipBodyBegin.append("\">");
+ final String tooltipText = noteText.replaceFirst("<body>",
+ tooltipBodyBegin.toString()).replaceFirst("</body>", "</div></body>");
+ return tooltipText;
+ }
+ });
+ }
+
+ private void registerStateIconProvider() {
+ IconController.getController().addStateIconProvider(new IStateIconProvider() {
+ public UIIcon getStateIcon(NodeModel node) {
+ boolean showIcon;
+ if(NoteModel.getNote(node) != null){
+ final String showNoteIcon = MapStyle.getController(modeController).getPropertySetDefault(node.getMap(), SHOW_NOTE_ICONS);
+ showIcon = Boolean.parseBoolean(showNoteIcon);
+ if(showIcon)
+ return noteIcon;
+ }
+ return null;
+ }
+ });
+ }
+
+ public boolean showNotesInMap(MapModel model) {
+ final String property = MapStyleModel.getExtension(model).getProperty(NoteController.SHOW_NOTES_IN_MAP);
+ return Boolean.parseBoolean(property);
+ }
+
+ protected String getNoteCSSStyle(ModeController modeController, NodeModel node, boolean withWidth) {
+ final StringBuilder rule = new StringBuilder();
+ // set default font for notes:
+ final NodeStyleController style = (NodeStyleController) Controller.getCurrentModeController().getExtension(
+ NodeStyleController.class);
+ MapModel map = modeController.getController().getMap();
+ if(map != null){
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ final NodeModel noteStyleNode = model.getStyleNodeSafe(MapStyleModel.NOTE_STYLE);
+ final Font noteFont = style.getFont(noteStyleNode);
+ Color noteBackground = style.getBackgroundColor(noteStyleNode);
+ Color noteForeground = style.getColor(noteStyleNode);
+ final int alignment = style.getTextAlign(noteStyleNode).swingConstant;
+ final CssRuleBuilder cssRuleBuilder = new CssRuleBuilder()
+ .withFont(noteFont)
+ .withColor(noteForeground)
+ .withBackground(noteBackground)
+ .withAlignment(alignment);
+ if(withWidth)
+ cssRuleBuilder.withMaxWidthAsPt(NodeSizeModel.getMaxNodeWidth(noteStyleNode), style.getMaxWidth(node));
+ rule.append(cssRuleBuilder);
+ }
+ return rule.toString();
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/note/NoteModel.java b/freeplane/src/main/java/org/freeplane/features/note/NoteModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/note/NoteModel.java
rename to freeplane/src/main/java/org/freeplane/features/note/NoteModel.java
diff --git a/freeplane/src/main/java/org/freeplane/features/note/NoteWriter.java b/freeplane/src/main/java/org/freeplane/features/note/NoteWriter.java
new file mode 100644
index 0000000..6c2917f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/note/NoteWriter.java
@@ -0,0 +1,72 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.note;
+
+import java.io.IOException;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeWriter;
+import org.freeplane.core.io.IExtensionElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeWriter;
+import org.freeplane.features.text.NodeTextBuilder;
+import org.freeplane.features.text.RichTextModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ */
+class NoteWriter implements IExtensionElementWriter, IAttributeWriter {
+ NoteController noteManager;
+
+ public NoteWriter(final NoteController noteManager) {
+ super();
+ this.noteManager = noteManager;
+ }
+
+ public void writeAttributes(final ITreeWriter writer, final Object userObject, final String tag) {
+ if(! NodeWriter.shouldWriteSharedContent(writer))
+ return;
+ noteManager.onWrite((MapModel) userObject);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.io.INodeWriter#saveContent(freeplane.io.ITreeWriter,
+ * java.lang.Object, java.lang.String)
+ */
+ public void writeContent(final ITreeWriter writer, final Object element, final IExtension note) throws IOException {
+ RichTextModel note1 = (RichTextModel) note;
+ if (note1.getXml() != null) {
+ final XMLElement htmlElement = new XMLElement();
+ htmlElement.setName(NodeTextBuilder.XML_NODE_XHTML_CONTENT_TAG);
+ if(note instanceof NoteModel){
+ htmlElement.setAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, NodeTextBuilder.XML_NODE_XHTML_TYPE_NOTE);
+ }
+ else{
+ htmlElement.setAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, "UNKNOWN");
+ }
+ final String content = note1.getXml().replace('\0', ' ');
+ writer.addElement('\n' + content + '\n', htmlElement);
+ }
+ return;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/EditNoteInDialogAction.java b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/EditNoteInDialogAction.java
new file mode 100644
index 0000000..cd9def9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/EditNoteInDialogAction.java
@@ -0,0 +1,51 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.note.mindmapmode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.IMapViewManager;
+
+class EditNoteInDialogAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public EditNoteInDialogAction() {
+ super("EditNoteInDialogAction");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.actions.ActorXml#act(freeplane.controller.actions.
+ * generated.instance.XmlAction)
+ */
+ public void actionPerformed(final ActionEvent arg0) {
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel nodeModel = controller.getSelection().getSelected();
+ final IMapViewManager viewController = controller.getMapViewManager();
+ final Component node = viewController.getComponent(nodeModel);
+ node.requestFocus();
+ new NoteDialogStarter().editNoteInDialog(nodeModel);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/MNoteController.java b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/MNoteController.java
new file mode 100644
index 0000000..570af1f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/MNoteController.java
@@ -0,0 +1,359 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.note.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.KeyboardFocusManager;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.net.URI;
+
+import javax.swing.BorderFactory;
+import javax.swing.InputMap;
+import javax.swing.JEditorPane;
+import javax.swing.JPanel;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.html.StyleSheet;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.SetBooleanMapPropertyAction;
+import org.freeplane.features.text.mindmapmode.FreeplaneToSHTMLPropertyChangeAdapter;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.url.UrlManager;
+
+import com.lightdev.app.shtm.SHTMLEditorPane;
+import com.lightdev.app.shtm.SHTMLPanel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MNoteController extends NoteController {
+ final class NoteDocumentListener implements DocumentListener {
+ public void changedUpdate(final DocumentEvent arg0) {
+ docEvent();
+ }
+
+ private void docEvent() {
+ final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ if (focusOwner == null || !SwingUtilities.isDescendingFrom(focusOwner, htmlEditorPanel)) {
+ return;
+ }
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ final MapModel map = modeController.getController().getMap();
+ mapController.setSaved(map, false);
+ }
+
+ public void insertUpdate(final DocumentEvent arg0) {
+ docEvent();
+ }
+
+ public void removeUpdate(final DocumentEvent arg0) {
+ docEvent();
+ }
+ }
+
+ private static class SouthPanel extends JPanel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public SouthPanel() {
+ super(new BorderLayout());
+ setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
+ }
+
+ @Override
+ protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition,
+ final boolean pressed) {
+ return super.processKeyBinding(ks, e, condition, pressed) || e.getKeyChar() == KeyEvent.VK_SPACE
+ || e.getKeyChar() == KeyEvent.VK_ALT;
+ }
+ }
+
+ private static SHTMLPanel htmlEditorPanel;
+ public static final String RESOURCES_REMOVE_NOTES_WITHOUT_QUESTION = "remove_notes_without_question";
+ public static final String RESOURCES_USE_DEFAULT_FONT_FOR_NOTES_TOO = "resources_use_default_font_for_notes_too";
+ public static final String RESOURCES_USE_MARGIN_TOP_ZERO_FOR_NOTES = "resources_use_margin_top_zero_for_notes";
+ static final String RESOURCES_USE_SPLIT_PANE = "use_split_pane";
+ private final NoteManager noteManager;
+ private SHTMLPanel noteViewerComponent;
+
+ /**
+ * @param modeController
+ */
+ public MNoteController(ModeController modeController) {
+ super();
+ noteManager = new NoteManager(this);
+ createActions(modeController);
+ }
+
+ private void createActions(ModeController modeController) {
+ modeController.addAction(new SelectNoteAction(this));
+ modeController.addAction(new ShowHideNoteAction(this));
+ modeController.addAction(new EditNoteInDialogAction());
+ modeController.addAction(new SetNoteWindowPosition("top"));
+ modeController.addAction(new SetNoteWindowPosition( "left"));
+ modeController.addAction(new SetNoteWindowPosition("right"));
+ modeController.addAction(new SetNoteWindowPosition("bottom"));
+ modeController.addAction(new RemoveNoteAction(this));
+ modeController.addAction(new SetBooleanMapPropertyAction(SHOW_NOTE_ICONS));
+ }
+
+ SHTMLPanel getHtmlEditorPanel() {
+ if (htmlEditorPanel != null) {
+ return htmlEditorPanel;
+ }
+ htmlEditorPanel = MTextController.getController().createSHTMLPanel(NoteModel.EDITING_PURPOSE);
+
+ // make sure that SHTML gets notified of relevant config changes!
+ ResourceController.getResourceController().addPropertyChangeListener(
+ new FreeplaneToSHTMLPropertyChangeAdapter(htmlEditorPanel));
+
+ htmlEditorPanel.setMinimumSize(new Dimension(100, 100));
+ final SHTMLEditorPane editorPane = (SHTMLEditorPane) htmlEditorPanel.getEditorPane();
+
+ for (InputMap inputMap = editorPane.getInputMap(); inputMap != null; inputMap = inputMap.getParent()){
+ inputMap.remove(KeyStroke.getKeyStroke("ctrl pressed T"));
+ inputMap.remove(KeyStroke.getKeyStroke("ctrl shift pressed T"));
+ inputMap.remove(KeyStroke.getKeyStroke("ctrl pressed SPACE"));
+ }
+
+ editorPane.addFocusListener(new FocusListener() {
+ private SpellCheckerController spellCheckerController = null;
+ private boolean enabled = false;
+ public void focusLost(final FocusEvent e) {
+ if(! e.isTemporary()){
+ spellCheckerController.enableAutoSpell(editorPane, false);
+ enabled = false;
+ }
+ }
+
+ public void focusGained(final FocusEvent e) {
+ if(! enabled){
+ initSpellChecker();
+ spellCheckerController.enableAutoSpell(editorPane, true);
+ enabled = true;
+ }
+ }
+
+ private void initSpellChecker() {
+ if (spellCheckerController != null) {
+ return;
+ }
+ spellCheckerController = SpellCheckerController.getController();
+ spellCheckerController.addSpellCheckerMenu(editorPane.getPopup());
+ spellCheckerController.enableShortKey(editorPane, true);
+ }
+ });
+ return htmlEditorPanel;
+ }
+
+ SHTMLPanel getNoteViewerComponent() {
+ return noteViewerComponent;
+ }
+
+ void hideNotesPanel() {
+ noteManager.saveNote();
+ noteViewerComponent.setVisible(false);
+ Controller.getCurrentModeController().getController().getViewController().removeSplitPane();
+ ResourceController.getResourceController().setProperty(MNoteController.RESOURCES_USE_SPLIT_PANE, "false");
+ }
+
+ @Override
+ protected void onWrite(final MapModel map) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Controller controller = modeController.getController();
+ final IMapSelection selection = controller.getSelection();
+ if (selection == null) {
+ return;
+ }
+ final NodeModel selected = selection.getSelected();
+ noteManager.saveNote(selected);
+ }
+
+ public void setNoteText(final NodeModel node, final String newText) {
+ final String oldText = getNoteText(node);
+ if (oldText == newText || null != oldText && oldText.equals(newText)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ setText(newText);
+ }
+
+ public String getDescription() {
+ return "setNoteText";
+ }
+
+ private void setText(final String text) {
+ final boolean enabled = !(text == null || text.equals(""));
+ if (enabled) {
+ final NoteModel note = NoteModel.createNote(node);
+ note.setHtml(text);
+ node.addExtension(note);
+ }
+ else {
+ if (null != node.getExtension(NoteModel.class)) {
+ node.removeExtension(NoteModel.class);
+ }
+ }
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NOTE_TEXT, oldText, text);
+ if(noteManager != null)
+ noteManager.updateEditor();
+ }
+
+ public void undo() {
+ setText(oldText);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ private boolean shouldUseSplitPane() {
+ return "true".equals(ResourceController.getResourceController().getProperty(
+ MNoteController.RESOURCES_USE_SPLIT_PANE));
+ }
+
+ void showNotesPanel(final boolean requestFocus) {
+ if (noteViewerComponent == null) {
+ noteViewerComponent = getHtmlEditorPanel();
+ noteManager.updateEditor();
+ }
+ final SouthPanel southPanel = new SouthPanel();
+ southPanel.add(noteViewerComponent, BorderLayout.CENTER);
+// setDefaultFont();
+ noteViewerComponent.setOpenHyperlinkHandler(new ActionListener() {
+ public void actionPerformed(final ActionEvent pE) {
+ try {
+ String uriText = pE.getActionCommand();
+ UrlManager.getController().loadURL(new URI(uriText));
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+ });
+ noteViewerComponent.setVisible(true);
+ ResourceController.getResourceController().setProperty(MNoteController.RESOURCES_USE_SPLIT_PANE, "true");
+ Controller.getCurrentModeController().getController().getViewController().insertComponentIntoSplitPane(southPanel);
+ if (requestFocus) {
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ final SHTMLPanel htmlEditorPanel = getHtmlEditorPanel();
+ htmlEditorPanel.getMostRecentFocusOwner().requestFocus();
+ if (ResourceController.getResourceController().getBooleanProperty("goto_note_end_on_edit")) {
+ final JEditorPane editorPane = htmlEditorPanel.getEditorPane();
+ editorPane.setCaretPosition(editorPane.getDocument().getLength());
+ }
+ }
+ });
+ }
+ southPanel.revalidate();
+ }
+
+ void setDefaultStyle(NodeModel node) {
+ final StyleSheet styleSheet = noteViewerComponent.getDocument().getStyleSheet();
+ styleSheet.removeStyle("body");
+ styleSheet.removeStyle("p");
+ // set default font for notes:
+ final ModeController modeController = Controller.getCurrentModeController();
+ String noteCssRule = getNoteCSSStyle(modeController, node, false);
+ String bodyRule = new StringBuilder( "body {").append(noteCssRule).append("}\n").toString();
+ styleSheet.addRule(bodyRule);
+ if (ResourceController.getResourceController().getBooleanProperty(
+ MNoteController.RESOURCES_USE_MARGIN_TOP_ZERO_FOR_NOTES)) {
+ /* this is used for paragraph spacing. I put it here, too, as
+ * the tooltip display uses the same spacing. But it is to be discussed.
+ * fc, 23.3.2009.
+ */
+ String paragraphtRule = "p {margin-top:0;}\n";
+ styleSheet.addRule(paragraphtRule);
+ }
+ }
+
+ boolean isEditing() {
+ final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ return focusOwner != null && noteViewerComponent != null && SwingUtilities.isDescendingFrom(focusOwner, noteViewerComponent);
+ }
+
+ void setFocusToMap() {
+ final Controller controller = Controller.getCurrentModeController().getController();
+ final NodeModel node = controller.getSelection().getSelected();
+ controller.getMapViewManager().getComponent(node).requestFocusInWindow();
+ }
+
+ public void shutdownController() {
+ Controller.getCurrentModeController().getMapController().removeNodeSelectionListener(noteManager);
+ if (noteViewerComponent == null) {
+ return;
+ }
+ noteViewerComponent.getActionMap().remove("jumpToMapAction");
+ if (shouldUseSplitPane()) {
+ hideNotesPanel();
+ noteViewerComponent = null;
+ }
+ }
+
+ public void startupController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (shouldUseSplitPane()) {
+ showNotesPanel(false);
+ }
+ modeController.getMapController().addNodeSelectionListener(noteManager);
+ noteManager.mNoteDocumentListener = new NoteDocumentListener();
+ }
+
+ boolean isNoteEditorShowing() {
+ return ResourceController.getResourceController().getBooleanProperty(
+ MNoteController.RESOURCES_USE_SPLIT_PANE);
+ }
+
+ public void setShowNotesInMap(final MapModel model, final boolean show) {
+ MapStyle.getController().setProperty(model, SHOW_NOTES_IN_MAP, Boolean.toString(show));
+ }
+
+ public void editNoteInDialog(final NodeModel nodeModel) {
+ new NoteDialogStarter().editNoteInDialog(nodeModel);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/NoteDialogStarter.java b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/NoteDialogStarter.java
new file mode 100644
index 0000000..6ca57a5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/NoteDialogStarter.java
@@ -0,0 +1,73 @@
+package org.freeplane.features.note.mindmapmode;
+
+import java.util.regex.Pattern;
+
+import javax.swing.RootPaneContainer;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.text.mindmapmode.EditNodeBase;
+import org.freeplane.features.text.mindmapmode.IEditBaseCreator;
+import org.freeplane.features.text.mindmapmode.EditNodeBase.EditedComponent;
+
+class NoteDialogStarter{
+ private static final Pattern HTML_HEAD = Pattern.compile("\\s*<head>.*</head>", Pattern.DOTALL);
+ private EditNodeBase mCurrentEditDialog = null;
+
+ void editNoteInDialog(final NodeModel nodeModel) {
+ final Controller controller = Controller.getCurrentController();
+ stopEditing();
+ Controller.getCurrentModeController().setBlocked(true);
+ String text = NoteModel.getNoteText(nodeModel);
+ if(text == null){
+ text = "";
+ }
+ final EditNodeBase.IEditControl editControl = new EditNodeBase.IEditControl() {
+ public void cancel() {
+ Controller.getCurrentModeController().setBlocked(false);
+ mCurrentEditDialog = null;
+ }
+
+ public void ok(final String newText) {
+ setHtmlText(nodeModel, newText);
+ cancel();
+ }
+
+ public void split(final String newText, final int position) {
+ }
+ public boolean canSplit() {
+ return false;
+ }
+
+ public EditedComponent getEditType() {
+ return EditedComponent.NOTE;
+ }
+ };
+ final IEditBaseCreator textFieldCreator = (IEditBaseCreator) Controller.getCurrentController().getMapViewManager();
+ mCurrentEditDialog = textFieldCreator.createEditor(nodeModel, editControl, text, true);
+ final RootPaneContainer frame = (RootPaneContainer) SwingUtilities.getWindowAncestor(controller.getMapViewManager().getMapViewComponent());
+ mCurrentEditDialog.show(frame);
+
+ }
+
+
+ private void setHtmlText(final NodeModel node, final String newText) {
+ final String body = HTML_HEAD.matcher(newText).replaceFirst("");
+ final MNoteController noteController = (MNoteController) MNoteController.getController();
+ final String trimmed = body.replaceFirst("\\s+$", "");
+ if(HtmlUtils.isEmpty(trimmed))
+ noteController.setNoteText(node, null);
+ else
+ noteController.setNoteText(node, trimmed);
+ }
+
+ private void stopEditing() {
+ if (mCurrentEditDialog != null) {
+ mCurrentEditDialog.closeEdit();
+ mCurrentEditDialog = null;
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/NoteManager.java b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/NoteManager.java
new file mode 100644
index 0000000..ef85fd0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/NoteManager.java
@@ -0,0 +1,131 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.note.mindmapmode;
+
+import java.net.URL;
+import java.util.regex.Pattern;
+
+import javax.swing.text.html.HTMLDocument;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.note.mindmapmode.MNoteController.NoteDocumentListener;
+
+import com.lightdev.app.shtm.SHTMLPanel;
+
+final class NoteManager implements INodeSelectionListener {
+ public final static Pattern HEAD = Pattern.compile("<head>.*</head>\n", Pattern.DOTALL);
+ private boolean ignoreEditorUpdate;
+ NoteDocumentListener mNoteDocumentListener;
+ private NodeModel node;
+ /**
+ *
+ */
+ final private MNoteController noteController;
+
+ public NoteManager(final MNoteController noteController) {
+ this.noteController = noteController;
+ }
+
+ public void onDeselect(final NodeModel node) {
+ final SHTMLPanel noteViewerComponent = noteController.getNoteViewerComponent();
+ if (noteViewerComponent == null) {
+ return;
+ }
+ noteViewerComponent.getDocument().removeDocumentListener(mNoteDocumentListener);
+ saveNote(node);
+ this.node = null;
+ }
+
+ public void onSelect(final NodeModel nodeView) {
+ node = nodeView;
+ updateEditor();
+ }
+
+ void saveNote() {
+ if (node == null) {
+ return;
+ }
+ final SHTMLPanel noteViewerComponent = noteController.getNoteViewerComponent();
+ if (noteViewerComponent == null) {
+ return;
+ }
+ boolean editorContentEmpty = true;
+ String documentText = noteViewerComponent.getDocumentText();
+ documentText = HEAD.matcher(documentText).replaceFirst("");
+ editorContentEmpty = HtmlUtils.isEmpty(documentText);
+ Controller.getCurrentModeController().getMapController().removeNodeSelectionListener(this);
+ if (noteViewerComponent.needsSaving()) {
+ try {
+ ignoreEditorUpdate = true;
+ if (editorContentEmpty) {
+ noteController.setNoteText(node, null);
+ }
+ else {
+ noteController.setNoteText(node, documentText);
+ }
+ }
+ finally {
+ ignoreEditorUpdate = false;
+ }
+ }
+ Controller.getCurrentModeController().getMapController().addNodeSelectionListener(this);
+ }
+
+ void saveNote(final NodeModel node) {
+ if (this.node != node) {
+ return;
+ }
+ saveNote();
+ }
+
+ void updateEditor() {
+ if (ignoreEditorUpdate) {
+ return;
+ }
+ final SHTMLPanel noteViewerComponent = noteController.getNoteViewerComponent();
+ if (noteViewerComponent == null) {
+ return;
+ }
+ final HTMLDocument document = noteViewerComponent.getDocument();
+ document.removeDocumentListener(mNoteDocumentListener);
+ try {
+ final URL url = node.getMap().getURL();
+ if (url != null) {
+ document.setBase(url);
+ }
+ else {
+ document.setBase(new URL("file: "));
+ }
+ }
+ catch (final Exception e) {
+ }
+ noteController.setDefaultStyle(node);
+ final String note = node != null ? NoteModel.getNoteText(node) : null;
+ if (note != null)
+ noteViewerComponent.setCurrentDocumentContent(note);
+ else
+ noteViewerComponent.setCurrentDocumentContent("");
+ document.addDocumentListener(mNoteDocumentListener);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/note/mindmapmode/RemoveNoteAction.java b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/RemoveNoteAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/note/mindmapmode/RemoveNoteAction.java
rename to freeplane/src/main/java/org/freeplane/features/note/mindmapmode/RemoveNoteAction.java
diff --git a/freeplane/src/org/freeplane/features/note/mindmapmode/SelectNoteAction.java b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/SelectNoteAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/note/mindmapmode/SelectNoteAction.java
rename to freeplane/src/main/java/org/freeplane/features/note/mindmapmode/SelectNoteAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/SetNoteWindowPosition.java b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/SetNoteWindowPosition.java
new file mode 100644
index 0000000..c300102
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/SetNoteWindowPosition.java
@@ -0,0 +1,38 @@
+package org.freeplane.features.note.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.ViewController;
+
+/** Select Note Window at the position action */
+ at SelectableAction(checkOnPopup = true)
+public class SetNoteWindowPosition extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final String position;
+
+ public SetNoteWindowPosition( final String position) {
+ super("SetNoteWindowPosition." + position);
+ this.position = position;
+ };
+
+ public void actionPerformed(final ActionEvent e) {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ resourceController.setProperty("note_location", position);
+ final ViewController viewController = Controller.getCurrentModeController().getController().getViewController();
+ viewController.changeNoteWindowLocation();
+ }
+
+ @Override
+ public void setSelected() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final boolean isSelected = resourceController.getProperty("note_location").equals(position);
+ setSelected(isSelected);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/note/mindmapmode/ShowHideNoteAction.java b/freeplane/src/main/java/org/freeplane/features/note/mindmapmode/ShowHideNoteAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/note/mindmapmode/ShowHideNoteAction.java
rename to freeplane/src/main/java/org/freeplane/features/note/mindmapmode/ShowHideNoteAction.java
diff --git a/freeplane/src/org/freeplane/features/print/AbstractPrintAction.java b/freeplane/src/main/java/org/freeplane/features/print/AbstractPrintAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/print/AbstractPrintAction.java
rename to freeplane/src/main/java/org/freeplane/features/print/AbstractPrintAction.java
diff --git a/freeplane/src/org/freeplane/features/print/BrowseAction.java b/freeplane/src/main/java/org/freeplane/features/print/BrowseAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/print/BrowseAction.java
rename to freeplane/src/main/java/org/freeplane/features/print/BrowseAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/print/FitMap.java b/freeplane/src/main/java/org/freeplane/features/print/FitMap.java
new file mode 100644
index 0000000..4585f74
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/print/FitMap.java
@@ -0,0 +1,34 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.print;
+
+import org.freeplane.core.resources.ResourceController;
+
+/**
+ * @author Dimitry Polivaev
+ * 30.08.2009
+ */
+public enum FitMap {
+ USER_DEFINED, WIDTH, HEIGHT, PAGE, BACKGROUND;
+ public static FitMap valueOf() {
+ final String fitMapStr = ResourceController.getResourceController().getProperty("fit_map");
+ return FitMap.valueOf(fitMapStr);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/print/PageAction.java b/freeplane/src/main/java/org/freeplane/features/print/PageAction.java
new file mode 100644
index 0000000..3cf71a4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/print/PageAction.java
@@ -0,0 +1,199 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.print;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.ButtonGroup;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JRadioButton;
+import javax.swing.JTextField;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+
+class PageAction extends AbstractPrintAction {
+ static final String NAME = "page";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ PageAction(final PrintController controller) {
+ super("PageAction", controller);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if (!getPrintController().acquirePrinterJobAndPageFormat(false)) {
+ return;
+ }
+ final FitMap fitMap = FitMap.valueOf();
+ //define controls
+ //ButtonGroup
+ final ButtonGroup fitButtons = new ButtonGroup();
+ //Fit to page
+ final JRadioButton fitToPage = new JRadioButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(fitToPage, TextUtils.getRawText("fit_map_to_page"));
+ fitToPage.setSelected(fitMap == FitMap.PAGE);
+ fitButtons.add(fitToPage);
+ //Fit background image to page
+ final JRadioButton fitBackgroundImageToPage = new JRadioButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(fitBackgroundImageToPage, TextUtils.getRawText("fit_background_to_page"));
+ fitBackgroundImageToPage.setSelected(fitMap == FitMap.BACKGROUND);
+ fitButtons.add(fitBackgroundImageToPage);
+ //Fit width
+ final JRadioButton fitToWidth = new JRadioButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(fitToWidth, TextUtils.getRawText("fit_map_to_page_width"));
+ fitToWidth.setSelected(fitMap == FitMap.WIDTH);
+ fitButtons.add(fitToWidth);
+ //Fit to heighth
+ final JRadioButton fitToHeight = new JRadioButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(fitToHeight, TextUtils.getRawText("fit_map_to_page_height"));
+ fitToHeight.setSelected(fitMap == FitMap.HEIGHT);
+ fitButtons.add(fitToHeight);
+ //User defined
+ final JRadioButton userDefaultScale = new JRadioButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(userDefaultScale, TextUtils.getRawText("user_defined_scale"));
+ userDefaultScale.setSelected(fitMap == FitMap.USER_DEFINED);
+ fitButtons.add(userDefaultScale);
+ //User defined label
+ final JLabel userZoomL = new JLabel(TextUtils.getText("user_zoom"));
+ //User defined input field
+ final JTextField userZoom = new JTextField(ResourceController.getResourceController().getProperty("user_zoom"),
+ 3);
+ userZoom.setPreferredSize(new Dimension(30, 21));
+ if (fitMap == FitMap.USER_DEFINED) {
+ userZoom.setEditable(true);
+ userZoom.setEnabled(true);
+ }
+ else {
+ userZoom.setEnabled(false);
+ userZoom.setEditable(false);
+ }
+ //Set up dialog content
+ final JPanel panel = new JPanel();
+ final GridBagLayout gridbag = new GridBagLayout();
+ panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(),
+ BorderFactory.createEmptyBorder(10, 0, 10, 0)));
+ //Action listener if user defined zoom is selected/deselected
+ userDefaultScale.addItemListener(new ItemListener() {
+ public void itemStateChanged(final ItemEvent e) {
+ final boolean selected = e.getStateChange() == ItemEvent.SELECTED;
+ userZoom.setEditable(selected);
+ userZoom.setEnabled(selected);
+ if (selected) {
+ userZoom.requestFocusInWindow();
+ }
+ }
+ });
+ final GridBagConstraints c = new GridBagConstraints();
+ c.gridx = 0;
+ c.gridy = 0;
+ c.gridwidth = 3;
+ c.ipady = 10;
+ c.ipadx = 4;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = new Insets(0, 10, 0, 10);
+ //fit to page
+ gridbag.setConstraints(fitToPage, c);
+ panel.add(fitToPage);
+ c.gridy++;
+ //fit background image to page
+ gridbag.setConstraints(fitBackgroundImageToPage, c);
+ panel.add(fitBackgroundImageToPage);
+ c.gridy++;
+ //fit to width
+ gridbag.setConstraints(fitToWidth, c);
+ panel.add(fitToWidth);
+ c.gridy++;
+ //fit to height
+ gridbag.setConstraints(fitToHeight, c);
+ panel.add(fitToHeight);
+ c.gridy++;
+ //user defined
+ gridbag.setConstraints(userDefaultScale, c);
+ panel.add(userDefaultScale);
+ c.gridy++;
+ c.ipady = 1;
+ c.gridx = 0;
+ c.gridwidth = 1;
+ c.insets = new Insets(0, 0, 0, 0);
+ //spacer
+ final Component b = Box.createRigidArea(new Dimension(25, 1));
+ gridbag.setConstraints(b, c);
+ panel.add(b);
+ c.ipadx = 4;
+ c.gridx = 1;
+ c.gridwidth = 1;
+ //Label
+ gridbag.setConstraints(userZoomL, c);
+ panel.add(userZoomL);
+ c.gridx = 2;
+ c.gridwidth = 1;
+ c.ipadx = 10;
+ c.insets = new Insets(0, 0, 0, 10);
+ //input field
+ gridbag.setConstraints(userZoom, c);
+ panel.add(userZoom);
+ panel.setLayout(gridbag);
+ //show dialog
+ final int result = UITools.showConfirmDialog(null, panel, TextUtils.getText("printing_settings"),
+ JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
+ //evaluate result
+ if (result == JOptionPane.OK_OPTION) {
+ ResourceController.getResourceController().setProperty("user_zoom", userZoom.getText());
+ final FitMap fitMapDecision;
+ if (fitToPage.isSelected()) {
+ fitMapDecision = FitMap.PAGE;
+ }
+ else if (fitBackgroundImageToPage.isSelected()) {
+ fitMapDecision = FitMap.BACKGROUND;
+ }
+ else if (fitToWidth.isSelected()) {
+ fitMapDecision = FitMap.WIDTH;
+ }
+ else if (fitToHeight.isSelected()) {
+ fitMapDecision = FitMap.HEIGHT;
+ }
+ else {
+ fitMapDecision = FitMap.USER_DEFINED;
+ }
+ ResourceController.getResourceController().setProperty("fit_map", fitMapDecision.toString());
+ }
+ else {
+ return;
+ }
+ final PrintController printController = getPrintController();
+ printController.pageDialog();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/print/Preview.java b/freeplane/src/main/java/org/freeplane/features/print/Preview.java
new file mode 100644
index 0000000..eb8c5bb
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/print/Preview.java
@@ -0,0 +1,125 @@
+/*
+ * Preview Dialog - A Preview Dialog for your Swing Applications Copyright (C)
+ * 2003 Jens Kaiser. Written by: 2003 Jens Kaiser <jens.kaiser at web.de> This
+ * program is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Library General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option) any
+ * later version. This program is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
+ * General Public License for more details. You should have received a copy of
+ * the GNU Library General Public License along with this program; if not, write
+ * to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
+ * USA.
+ */
+package org.freeplane.features.print;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.awt.print.PrinterException;
+
+import javax.swing.JComponent;
+
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.view.swing.map.MapView;
+
+class Preview extends JComponent {
+ final private static int DEFAULT_PREVIEW_SIZE = 300;
+ final private static double MINIMUM_ZOOM_FACTOR = 0.1;
+
+ private static final long serialVersionUID = 1L;
+ private Graphics2D imageGraphics;
+ protected int index = 0;
+ private BufferedImage previewPageImage = null;
+ private final PrintController printController;
+ private final Printable view;
+ protected double zoom = 0.0;
+
+ public Preview(final PrintController printController, final Printable view, Dimension size) {
+ this.printController = printController;
+ this.view = view;
+ final PageFormat format = getPageFormat();
+ this.zoom = Math.min(size.getHeight() / format.getHeight(), size.getWidth() / format.getWidth());
+ resize();
+ }
+
+ public void changeZoom(final double zoom) {
+ this.zoom = Math.max(Preview.MINIMUM_ZOOM_FACTOR, this.zoom * zoom);
+ resize();
+ }
+
+ @Override
+ public Dimension getMinimumSize() {
+ return getPreferredSize();
+ }
+
+ private PageFormat getPageFormat() {
+ return printController.getPageFormat();
+ }
+
+ private int getPageHeight(final PageFormat format) {
+ return (int) (format.getHeight() * zoom);
+ }
+
+ public int getPageIndex() {
+ return index;
+ }
+
+ private int getPageWidth(final PageFormat format) {
+ return (int) (format.getWidth() * zoom);
+ }
+
+ public void moveIndex(final int indexStep) {
+ final int newIndex = index + indexStep;
+ if (newIndex >= 0) {
+ index = newIndex;
+ previewPageImage = null;
+ }
+ }
+
+ @Override
+ public void paint(final Graphics g) {
+ try {
+ final Graphics2D g2d = (Graphics2D) g;
+ final PageFormat format = getPageFormat();
+ paintPaper(g, format);
+ if (previewPageImage == null) {
+ previewPageImage = (BufferedImage) createImage(getPageWidth(format) - 1, getPageHeight(format) - 1);
+ imageGraphics = previewPageImage.createGraphics();
+ imageGraphics.scale(zoom, zoom);
+ if(view instanceof MapView)
+ ((MapView)view).preparePrinting();
+ while (Printable.NO_SUCH_PAGE == view.print(imageGraphics, format, index) && index > 0) {
+ index --;
+ }
+ if(view instanceof MapView)
+ ((MapView)view).endPrinting();
+ }
+ g2d.drawImage(previewPageImage, 0, 0, this);
+ }
+ catch (final PrinterException e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ protected void paintPaper(final Graphics g, final PageFormat format) {
+ g.setColor(Color.white);
+ g.fillRect(0, 0, getPageWidth(format), getPageHeight(format));
+ g.setColor(Color.black);
+ g.drawRect(0, 0, getPageWidth(format) - 1, getPageHeight(format) - 1);
+ }
+
+ public void resize() {
+ final PageFormat pageFormat = getPageFormat();
+ int width = getPageWidth(pageFormat);
+ int height = getPageHeight(pageFormat);
+ setPreferredSize(new Dimension(width, height));
+ previewPageImage = null;
+ revalidate();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/print/PreviewDialog.java b/freeplane/src/main/java/org/freeplane/features/print/PreviewDialog.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/print/PreviewDialog.java
rename to freeplane/src/main/java/org/freeplane/features/print/PreviewDialog.java
diff --git a/freeplane/src/org/freeplane/features/print/PrintAction.java b/freeplane/src/main/java/org/freeplane/features/print/PrintAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/print/PrintAction.java
rename to freeplane/src/main/java/org/freeplane/features/print/PrintAction.java
diff --git a/freeplane/src/org/freeplane/features/print/PrintController.java b/freeplane/src/main/java/org/freeplane/features/print/PrintController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/print/PrintController.java
rename to freeplane/src/main/java/org/freeplane/features/print/PrintController.java
diff --git a/freeplane/src/org/freeplane/features/print/PrintDirectAction.java b/freeplane/src/main/java/org/freeplane/features/print/PrintDirectAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/print/PrintDirectAction.java
rename to freeplane/src/main/java/org/freeplane/features/print/PrintDirectAction.java
diff --git a/freeplane/src/org/freeplane/features/print/PrintPreviewAction.java b/freeplane/src/main/java/org/freeplane/features/print/PrintPreviewAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/print/PrintPreviewAction.java
rename to freeplane/src/main/java/org/freeplane/features/print/PrintPreviewAction.java
diff --git a/freeplane/src/org/freeplane/features/print/ZoomAction.java b/freeplane/src/main/java/org/freeplane/features/print/ZoomAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/print/ZoomAction.java
rename to freeplane/src/main/java/org/freeplane/features/print/ZoomAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/script/IScriptEditorStarter.java b/freeplane/src/main/java/org/freeplane/features/script/IScriptEditorStarter.java
new file mode 100644
index 0000000..6958750
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/script/IScriptEditorStarter.java
@@ -0,0 +1,35 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.script;
+
+import java.awt.Dimension;
+
+import javax.swing.ComboBoxEditor;
+
+import org.freeplane.core.extension.IExtension;
+
+/**
+ * @author Dimitry Polivaev
+ * Jul 31, 2011
+ */
+public interface IScriptEditorStarter extends IExtension {
+ String startEditor(String scriptInput);
+ ComboBoxEditor createComboBoxEditor(Dimension dim);
+}
diff --git a/freeplane/src/org/freeplane/features/script/IScriptStarter.java b/freeplane/src/main/java/org/freeplane/features/script/IScriptStarter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/script/IScriptStarter.java
rename to freeplane/src/main/java/org/freeplane/features/script/IScriptStarter.java
diff --git a/freeplane/src/org/freeplane/features/spellchecker/mindmapmode/SpellCheckerController.java b/freeplane/src/main/java/org/freeplane/features/spellchecker/mindmapmode/SpellCheckerController.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/spellchecker/mindmapmode/SpellCheckerController.java
rename to freeplane/src/main/java/org/freeplane/features/spellchecker/mindmapmode/SpellCheckerController.java
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/AutomaticLayout.java b/freeplane/src/main/java/org/freeplane/features/styles/AutomaticLayout.java
new file mode 100644
index 0000000..e99176f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/AutomaticLayout.java
@@ -0,0 +1,12 @@
+package org.freeplane.features.styles;
+
+import org.freeplane.core.extension.IExtension;
+
+public enum AutomaticLayout implements IExtension{
+ HEADINGS(false), ALL(true);
+ public boolean applyToLeaves;
+ private AutomaticLayout(boolean applyToLeaves) {
+ this.applyToLeaves = applyToLeaves;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/AutomaticLayoutController.java b/freeplane/src/main/java/org/freeplane/features/styles/AutomaticLayoutController.java
new file mode 100644
index 0000000..40bc416
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/AutomaticLayoutController.java
@@ -0,0 +1,133 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file author is Christian Foltin
+ * It is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles;
+
+import java.util.Collection;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.IPropertyHandler;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+ at NodeHookDescriptor(hookName = "accessories/plugins/AutomaticLayout.properties")
+public class AutomaticLayoutController extends PersistentNodeHook implements IExtension{
+ private static final int FIRST_CYCLIC_STYLE_LEVEL = 1;
+ private static final String AUTOMATIC_LAYOUT_LEVEL = "AutomaticLayout.level,";
+ private static final String AUTOMATIC_LAYOUT_LEVEL_ROOT = "AutomaticLayout.level.root";
+
+ /**
+ *
+ */
+ public AutomaticLayoutController() {
+ super();
+ LogicalStyleController.getController().addStyleGetter(IPropertyHandler.AUTO, new IPropertyHandler<Collection<IStyle>, NodeModel>() {
+ public Collection<IStyle> getProperty(NodeModel model, Collection<IStyle> currentValue) {
+ AutomaticLayout layout = model.getMap().getRootNode().getExtension(AutomaticLayout.class);
+ final IStyle autoStyle = getStyle(model, layout);
+ if(autoStyle != null){
+ LogicalStyleController.getController().add(model, currentValue, autoStyle);
+ }
+ return currentValue;
+ }
+ });
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ if(element == null || ! element.hasAttribute("VALUE"))
+ return AutomaticLayout.ALL;
+ return super.createExtension(node, element);
+ }
+
+ private IStyle getStyle(final NodeModel node, AutomaticLayout layout) {
+ if(layout == null || node.isLeaf() && ! layout.applyToLeaves)
+ return null;
+ final int depth = node.depth();
+ return getStyle(node.getMap(), depth, false);
+ }
+
+ public IStyle getStyle(final MapModel map, final int depth, boolean cyclic) {
+ final MapStyleModel extension = MapStyleModel.getExtension(map);
+ final String name = depth == 0 ? AUTOMATIC_LAYOUT_LEVEL_ROOT : AUTOMATIC_LAYOUT_LEVEL + depth;
+ final TranslatedObject styleKey = TranslatedObject.format(name);
+ final IStyle style = StyleFactory.create(styleKey);
+ if (extension.getStyleNode(style) != null) {
+ return style;
+ }
+ if(! cyclic)
+ return null;
+
+ final TranslatedObject rootKey = TranslatedObject.format(AUTOMATIC_LAYOUT_LEVEL_ROOT);
+ final IStyle rootStyle = StyleFactory.create(rootKey);
+ NodeModel rootStyleNode = extension.getStyleNode(rootStyle);
+ if(rootStyleNode == null)
+ return null;
+ final NodeModel automaticStylesParentNode = rootStyleNode.getParentNode();
+ final int cycledLevelStyleCount = automaticStylesParentNode.getChildCount() - FIRST_CYCLIC_STYLE_LEVEL;
+ if(cycledLevelStyleCount <= 0)
+ return null;
+ else
+ return getStyle(map, FIRST_CYCLIC_STYLE_LEVEL + ((depth - FIRST_CYCLIC_STYLE_LEVEL) % cycledLevelStyleCount), false);
+ }
+
+ public NodeModel getStyleNode(MapModel map, int depth, boolean cyclic) {
+ IStyle style = getStyle(map, depth, cyclic);
+ if(style != null){
+ final MapStyleModel extension = MapStyleModel.getExtension(map);
+ return extension.getStyleNode(style);
+ }
+ return null;
+ }
+
+
+
+ @Override
+ protected Class<? extends IExtension> getExtensionClass() {
+ return AutomaticLayout.class;
+ }
+
+ @Override
+ protected IExtension toggle(NodeModel node, IExtension extension) {
+ extension = super.toggle(node, extension);
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ if(modeController.isUndoAction()){
+ return extension;
+ }
+ LogicalStyleController.getController().refreshMap(node.getMap());
+ return extension;
+ }
+
+ public boolean isAutomaticLevelStyle(NodeModel styleNode) {
+ NodeModel parentNode = styleNode.getParentNode();
+ if (parentNode == null)
+ return false;
+ Object userObject = parentNode.getUserObject();
+ if (! (userObject instanceof StyleTranslatedObject))
+ return false;
+ return ((StyleTranslatedObject)userObject).getObject().equals(MapStyleModel.STYLES_AUTOMATIC_LAYOUT);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/ConditionalStyleModel.java b/freeplane/src/main/java/org/freeplane/features/styles/ConditionalStyleModel.java
new file mode 100644
index 0000000..e9bde7b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/ConditionalStyleModel.java
@@ -0,0 +1,277 @@
+package org.freeplane.features.styles;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableModel;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class ConditionalStyleModel implements IExtension, Iterable<ConditionalStyleModel.Item>{
+ public class Item{
+ private ASelectableCondition condition;
+ private IStyle style;
+ private boolean isActive;
+ private boolean isLast;
+ private Item(boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast) {
+ super();
+ this.isActive = isActive;
+ this.condition = condition;
+ this.style = style;
+ this.setLast(isLast);
+ }
+
+ public Item(Item prototype) {
+ this(prototype.isActive, prototype.condition, prototype.style, prototype.isLast);
+ }
+
+ public void setCondition(ASelectableCondition condition) {
+ this.condition = condition;
+ }
+ public ASelectableCondition getCondition() {
+ return condition;
+ }
+ public void setStyle(IStyle style) {
+ this.style = style;
+ }
+ public IStyle getStyle() {
+ return style;
+ }
+ public void setActive(boolean isActive) {
+ this.isActive = isActive;
+ }
+ public boolean isActive() {
+ return isActive;
+ }
+ public void setLast(boolean isLast) {
+ this.isLast = isLast;
+ }
+ public boolean isLast() {
+ return isLast;
+ }
+
+ public void toXml(XMLElement conditionalStylesRoot)
+ {
+ final XMLElement itemElement = conditionalStylesRoot.createElement("conditional_style");
+ conditionalStylesRoot.addChild(itemElement);
+ itemElement.setAttribute("ACTIVE", Boolean.toString(isActive()));
+ final IStyle style = getStyle();
+ if (style instanceof StyleTranslatedObject) {
+ final String referencedStyle = ((StyleTranslatedObject)style).getObject().toString();
+ itemElement.setAttribute("LOCALIZED_STYLE_REF", referencedStyle);
+ }
+ else {
+ final String referencedStyle = style.toString();
+ itemElement.setAttribute("STYLE_REF", referencedStyle);
+ }
+ itemElement.setAttribute("LAST", Boolean.toString(isLast()));
+ if(condition != null)
+ condition.toXml(itemElement);
+
+ }
+
+ }
+ private ArrayList<Item> styles;
+ public ConditionalStyleModel() {
+ super();
+ this.styles = new ArrayList<Item>();
+ }
+
+ public ConditionalStyleModel(ConditionalStyleModel conditionalStyleModel) {
+ super();
+ final ArrayList<Item> prototypeStyles = conditionalStyleModel.styles;
+ this.styles = new ArrayList<Item>(prototypeStyles.size());
+ for (Item style : prototypeStyles)
+ styles.add(new Item(style));
+ }
+ private boolean recursiveCall;
+
+ public Collection<IStyle> getStyles(NodeModel node){
+ if(recursiveCall){
+ return Collections.emptyList();
+ }
+ try{
+ recursiveCall = true;
+ Collection<IStyle> matchingStyles = new LinkedHashSet<IStyle>();
+ for(Item item : styles){
+ final ASelectableCondition condition = item.getCondition();
+ if( item.isActive() && (condition == null || condition.checkNode(node))){
+ matchingStyles.add(item.style);
+ if(item.isLast()){
+ break;
+ }
+ }
+ }
+ return matchingStyles;
+ }
+ finally{
+ recursiveCall = false;
+ }
+ }
+
+ void addCondition(boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast){
+ styles.add(new Item(isActive, condition, style, isLast));
+ if(table == null){
+ return;
+ }
+ int index = styles.size() - 1;
+ table.fireTableRowsInserted(index, index);
+ }
+
+ void insertCondition(int index, boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast){
+ styles.add(index, new Item(isActive, condition, style, isLast));
+ if(table == null){
+ return;
+ }
+ table.fireTableRowsInserted(index, index);
+ }
+
+ Item removeCondition(int index){
+ final Item item = styles.remove(index);
+ if(table == null){
+ return item;
+ }
+ table.fireTableRowsDeleted(index, index);
+ return item;
+ }
+
+ void swapConditions(int index1, int index2){
+ final Item item1 = styles.get(index1);
+ final Item item2 = styles.get(index2);
+ styles.set(index1, item2);
+ styles.set(index2, item1);
+ if(table == null){
+ return;
+ }
+ table.fireTableRowsUpdated(index1, index1);
+ table.fireTableRowsUpdated(index2, index2);
+ }
+
+ void moveUp(int index){
+ if(index == 0){
+ return;
+ }
+ swapConditions(index, index - 1);
+ }
+
+ void moveDown(int index){
+ if(index == styles.size() - 1){
+ return;
+ }
+ swapConditions(index, index + 1);
+ }
+
+ void clear(){
+ styles.clear();
+ }
+
+ public Iterator<Item> iterator() {
+ return styles.iterator();
+ }
+ private AbstractTableModel table;
+ public TableModel asTableModel(){
+ if(table != null){
+ return table;
+ }
+ table = new AbstractTableModel() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ Item item = styles.get(rowIndex);
+ switch(columnIndex){
+ case 0:
+ return item.isActive();
+ case 1:
+ return item.getCondition();
+ case 2:
+ return item.getStyle();
+ case 3:
+ return item.isLast();
+ default:
+ throw new ArrayIndexOutOfBoundsException();
+ }
+ }
+
+ public int getRowCount() {
+ return styles.size();
+ }
+
+ public int getColumnCount() {
+ return 4;
+ }
+
+
+
+ @Override
+ public Class<?> getColumnClass(int columnIndex) {
+ switch(columnIndex){
+ case 0:
+ case 3: return Boolean.class;
+ case 1: return ASelectableCondition.class;
+ }
+ return super.getColumnClass(columnIndex);
+ }
+
+
+
+ @Override
+ public String getColumnName(int column) {
+ switch(column){
+ case 0: return TextUtils.getText("active");
+ case 1: return TextUtils.getText("condition");
+ case 2: return TextUtils.getText("style");
+ case 3: return TextUtils.getText("stop_processing");
+ }
+ return super.getColumnName(column);
+ }
+
+ @Override
+ public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
+ Item item = styles.get(rowIndex);
+ switch(columnIndex){
+ case 0:
+ item.setActive((Boolean) aValue);
+ break;
+ case 1:
+ item.setCondition((ASelectableCondition) aValue);
+ break;
+ case 2:
+ item.setStyle((IStyle) aValue);
+ break;
+ case 3:
+ item.setLast((Boolean) aValue);
+ break;
+ default:
+ throw new ArrayIndexOutOfBoundsException();
+ }
+ fireTableCellUpdated(rowIndex, columnIndex);
+ }
+
+ @Override
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
+ return true;
+ }
+ };
+ return table;
+ }
+
+ public int getStyleCount() {
+ return styles.size();
+ }
+
+ public ConditionalStyleModel clone() {
+ final ConditionalStyleModel conditionalStyleModel = new ConditionalStyleModel(this);
+ return conditionalStyleModel;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/IStyle.java b/freeplane/src/main/java/org/freeplane/features/styles/IStyle.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/IStyle.java
rename to freeplane/src/main/java/org/freeplane/features/styles/IStyle.java
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleController.java b/freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleController.java
new file mode 100644
index 0000000..bbd204d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleController.java
@@ -0,0 +1,393 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles;
+
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.lang.ref.WeakReference;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IAttributeWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.ITooltipProvider;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.map.NodeWriter;
+import org.freeplane.features.mode.CombinedPropertyChain;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.IPropertyHandler;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.ConditionalStyleModel.Item;
+
+/**
+ * @author Dimitry Polivaev
+ * 28.09.2009
+ */
+public class LogicalStyleController implements IExtension {
+// final private ModeController modeController;
+
+ private static final int STYLE_TOOLTIP = 0;
+ private WeakReference<NodeModel> cachedNode;
+ private Collection<IStyle> cachedStyle;
+ final private CombinedPropertyChain<Collection<IStyle>, NodeModel> styleHandlers;
+
+ public LogicalStyleController(ModeController modeController) {
+// this.modeController = modeController;
+ styleHandlers = new CombinedPropertyChain<Collection<IStyle>, NodeModel>(false);
+ createBuilder();
+ registerChangeListener();
+ addStyleGetter(IPropertyHandler.NODE, new IPropertyHandler<Collection<IStyle>, NodeModel>() {
+ public Collection<IStyle> getProperty(NodeModel node, Collection<IStyle> currentValue) {
+ final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
+ add(node, styleModel, currentValue, new StyleNode(node));
+ return currentValue;
+ }
+ });
+ addStyleGetter(IPropertyHandler.STYLE, new IPropertyHandler<Collection<IStyle>, NodeModel>() {
+ public Collection<IStyle> getProperty(NodeModel node, Collection<IStyle> currentValue) {
+ final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
+ Collection<IStyle> condStyles = styleModel.getConditionalStyleModel().getStyles(node);
+ addAll(node, styleModel, currentValue, condStyles);
+ return currentValue;
+ }
+ });
+ addStyleGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Collection<IStyle>, NodeModel>() {
+ public Collection<IStyle> getProperty(NodeModel node, Collection<IStyle> currentValue) {
+ add(node, currentValue, MapStyleModel.DEFAULT_STYLE);
+ return currentValue;
+ }
+ });
+ modeController.addToolTipProvider(STYLE_TOOLTIP, new ITooltipProvider() {
+ public String getTooltip(ModeController modeController, NodeModel node, Component view) {
+ if(!ResourceController.getResourceController().getBooleanProperty("show_styles_in_tooltip"))
+ return null;
+ final Collection<IStyle> styles = getStyles(node);
+ if(styles.size() > 0)
+ styles.remove(styles.iterator().next());
+ final String label = TextUtils.getText("node_styles");
+ return HtmlUtils.plainToHTML(label + ": " + getStyleNames(styles, ", "));
+ }
+ });
+ }
+
+ protected Collection<IStyle> getResursively(NodeModel node, Collection<IStyle> collection) {
+ final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
+ Collection<IStyle> set = new LinkedHashSet<IStyle>();
+ addAll(node, styleModel, set, collection);
+ return set;
+ }
+
+ protected void addAll(NodeModel node, MapStyleModel styleModel, Collection<IStyle> currentValue, Collection<IStyle> collection) {
+ for(IStyle styleKey : collection){
+ add(node, styleModel, currentValue, styleKey);
+ }
+ }
+
+ public void add(NodeModel node, Collection<IStyle> currentValue, IStyle style) {
+ final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
+ add(node, styleModel, currentValue, style);
+ }
+
+ protected void add(NodeModel node, MapStyleModel styleModel, Collection<IStyle> currentValue, IStyle styleKey) {
+ if(!currentValue.add(styleKey)){
+ return;
+ }
+ final NodeModel styleNode = styleModel.getStyleNode(styleKey);
+ if (styleNode == null) {
+ return;
+ }
+ if(styleKey instanceof StyleNode){
+ IStyle style = LogicalStyleModel.getStyle(styleNode);
+ if(style != null){
+ add(node, styleModel, currentValue, style);
+ }
+ }
+ final ConditionalStyleModel conditionalStyleModel = styleNode.getExtension(ConditionalStyleModel.class);
+ if(conditionalStyleModel == null)
+ return;
+ Collection<IStyle> styles = conditionalStyleModel.getStyles(node);
+ cachedNode = null;
+ addAll(node, styleModel, currentValue, styles);
+ }
+
+ private void registerChangeListener() {
+ ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ mapController.addMapChangeListener(new IMapChangeListener() {
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ clearCache();
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ clearCache();
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ clearCache();
+ }
+
+ public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
+ clearCache();
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ clearCache();
+ }
+
+ public void mapChanged(MapChangeEvent event) {
+ clearCache();
+ }
+ });
+ mapController.addNodeChangeListener(new INodeChangeListener() {
+ public void nodeChanged(NodeChangeEvent event) {
+ clearCache();
+ }
+ });
+
+ }
+
+ private void createBuilder() {
+ ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ final ReadManager readManager = mapController.getReadManager();
+ readManager.addAttributeHandler(NodeBuilder.XML_NODE, "STYLE_REF", new IAttributeHandler() {
+ public void setAttribute(final Object node, final String value) {
+ final LogicalStyleModel extension = LogicalStyleModel.createExtension((NodeModel) node);
+ extension.setStyle(StyleFactory.create(value));
+ }
+ });
+ readManager.addAttributeHandler(NodeBuilder.XML_NODE, "LOCALIZED_STYLE_REF", new IAttributeHandler() {
+ public void setAttribute(final Object node, final String value) {
+ final LogicalStyleModel extension = LogicalStyleModel.createExtension((NodeModel) node);
+ extension.setStyle(StyleFactory.create(TranslatedObject.format(value)));
+ }
+ });
+ final WriteManager writeManager = mapController.getWriteManager();
+ writeManager.addAttributeWriter(NodeBuilder.XML_NODE, new IAttributeWriter() {
+ public void writeAttributes(final ITreeWriter writer, final Object node, final String tag) {
+ if(! NodeWriter.shouldWriteSharedContent(writer))
+ return;
+ final LogicalStyleModel extension = LogicalStyleModel.getExtension((NodeModel) node);
+ if (extension == null) {
+ return;
+ }
+ final IStyle style = extension.getStyle();
+ if (style == null) {
+ return;
+ }
+ final String value = StyleTranslatedObject.toKeyString(style);
+ if (style instanceof StyleTranslatedObject) {
+ writer.addAttribute("LOCALIZED_STYLE_REF", value);
+ }
+ else {
+ writer.addAttribute("STYLE_REF", value);
+ }
+ }
+ });
+ }
+
+ public static void install( final LogicalStyleController logicalStyleController) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(LogicalStyleController.class, logicalStyleController);
+ }
+
+ public static LogicalStyleController getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return getController(modeController);
+ }
+
+ public static LogicalStyleController getController(ModeController modeController) {
+ return modeController.getExtension(LogicalStyleController.class);
+ }
+ public void refreshMap(final MapModel map) {
+ final IActor actor = new IActor() {
+ public void undo() {
+ refreshMapLater(map);
+ }
+
+ public String getDescription() {
+ return "refreshMap";
+ }
+
+ public void act() {
+ refreshMapLater(map);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+ private static Map<MapModel, Integer> mapsToRefresh = new HashMap<MapModel, Integer>();
+
+ private void refreshMapLater(final MapModel map) {
+ final Integer count = mapsToRefresh.get(map);
+ if (count == null) {
+ mapsToRefresh.put(map, 0);
+ }
+ else {
+ mapsToRefresh.put(map, count + 1);
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ final Integer count = mapsToRefresh.get(map);
+ if (count > 0) {
+ mapsToRefresh.put(map, count - 1);
+ return;
+ }
+ mapsToRefresh.remove(map);
+ final MapStyleModel extension = MapStyleModel.getExtension(map);
+ extension.refreshStyles();
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ mapController.fireMapChanged(
+ new MapChangeEvent(this, map, MapStyle.MAP_STYLES, null, null));
+ }
+ });
+ }
+
+ public IStyle getFirstStyle(final NodeModel node){
+ final Collection<IStyle> styles = getStyles(node);
+ boolean found = false;
+ for(IStyle style:styles){
+ if(found){
+ return style;
+ }
+ if((style instanceof StyleNode)){
+ found = true;
+ }
+ }
+ return MapStyleModel.DEFAULT_STYLE;
+ }
+ public Collection<IStyle> getStyles(final NodeModel node) {
+ if(cachedNode != null && node.equals(cachedNode.get())){
+ return cachedStyle;
+ }
+ cachedStyle = null;
+ cachedNode = null;
+ cachedStyle = styleHandlers.getProperty(node, new LinkedHashSet<IStyle>());
+ cachedNode = new WeakReference<NodeModel>(node);
+ return cachedStyle;
+ }
+
+ public void moveConditionalStyleDown(final ConditionalStyleModel conditionalStyleModel, int index) {
+ conditionalStyleModel.moveDown(index);
+ }
+
+ public void moveConditionalStyleUp(final ConditionalStyleModel conditionalStyleModel, int index) {
+ conditionalStyleModel.moveUp(index);
+ }
+
+ public void addConditionalStyle(final ConditionalStyleModel conditionalStyleModel, boolean isActive,
+ ASelectableCondition condition, IStyle style, boolean isLast) {
+ conditionalStyleModel.addCondition(isActive, condition, style, isLast);
+ }
+
+ public void insertConditionalStyle(final ConditionalStyleModel conditionalStyleModel, int index, boolean isActive,
+ ASelectableCondition condition, IStyle style, boolean isLast) {
+ conditionalStyleModel.insertCondition(index, isActive, condition, style, isLast);
+ }
+
+ public Item removeConditionalStyle(final ConditionalStyleModel conditionalStyleModel, int index) {
+ return conditionalStyleModel.removeCondition(index);
+ }
+
+ private void clearCache() {
+ cachedStyle = null;
+ cachedNode = null;
+ }
+
+ public IPropertyHandler<Collection<IStyle>, NodeModel> addStyleGetter(
+ final Integer key,
+ final IPropertyHandler<Collection<IStyle>, NodeModel> getter) {
+ return styleHandlers.addGetter(key, getter);
+ }
+
+ public IPropertyHandler<Collection<IStyle>, NodeModel> removeStyleGetter(
+ final Integer key,
+ final IPropertyHandler<Collection<IStyle>, NodeModel> getter) {
+ return styleHandlers.addGetter(key, getter);
+ }
+
+ public String getStyleNames(final Collection<IStyle> styles, String separator) {
+ StringBuilder sb = new StringBuilder();
+ int i = 0;
+ for(IStyle style :styles){
+ if(i > 0)
+ sb.append(separator);
+ sb.append(style.toString());
+ i++;
+ }
+ return sb.toString();
+ }
+
+ public Collection<IStyle> getConditionalMapStyles(final NodeModel node) {
+ final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
+ Collection<IStyle> condStyles = styleModel.getConditionalStyleModel().getStyles(node);
+ clearCache();
+ return getResursively(node, condStyles);
+ }
+
+ public Collection<IStyle> getConditionalNodeStyles(final NodeModel node) {
+ final Collection<IStyle> condStyles = new LinkedHashSet<IStyle>();
+ IStyle style = LogicalStyleModel.getStyle(node);
+ if(style != null){
+ condStyles.add(style);
+ }
+
+ final ConditionalStyleModel conditionalStyleModel = node.getExtension(ConditionalStyleModel.class);
+ if(conditionalStyleModel != null) {
+ Collection<IStyle> styles = conditionalStyleModel.getStyles(node);
+ clearCache();
+ condStyles.addAll(styles);
+ }
+ final Collection<IStyle> all = getResursively(node, condStyles);
+ if(style != null){
+ all.remove(style);
+ }
+ return all;
+ }
+
+ public String getNodeStyleNames(NodeModel node, String separator) {
+ return getStyleNames(getConditionalNodeStyles(node), separator);
+ }
+
+ public String getMapStyleNames(NodeModel node, String separator) {
+ return getStyleNames(getConditionalMapStyles(node), separator);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleFilterController.java b/freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleFilterController.java
new file mode 100644
index 0000000..6390476
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleFilterController.java
@@ -0,0 +1,97 @@
+package org.freeplane.features.styles;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class LogicalStyleFilterController implements IElementaryConditionController {
+ static final String FILTER_STYLE = "filter_style";
+// // private final Controller controller;
+
+ public LogicalStyleFilterController() {
+ super();
+// this.controller = controller;
+ }
+
+ public boolean canEditValues(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ return namedObject.objectEquals(LogicalStyleFilterController.FILTER_STYLE);
+ }
+
+ public boolean canSelectValues(final Object property, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase, final boolean matchApproximately) {
+ if(simpleCond.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO))
+ return new StyleCondition((IStyle) value);
+ if(simpleCond.objectEquals(ConditionFactory.FILTER_CONTAINS))
+ return new StyleContainsCondition((IStyle) value);
+ return null;
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object property) {
+ return new DefaultComboBoxModel(getStyleConditionNames());
+ }
+
+ private Object[] getStyleConditionNames() {
+ return new TranslatedObject[] { TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO) ,
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS) };
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(FILTER_STYLE));
+ return list;
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ return null;
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object property, TranslatedObject simpleCond) {
+ final MapStyleModel mapStyles = MapStyleModel.getExtension(Controller.getCurrentController().getMap());
+ return mapStyles.getStylesAsComboBoxModel();
+ }
+
+ public boolean isCaseDependent(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ if (element.getName().equalsIgnoreCase(StyleCondition.NAME)) {
+ return StyleCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(StyleContainsCondition.NAME)) {
+ return StyleContainsCondition.load(element);
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ return null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/LogicalStyleKeys.java b/freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleKeys.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/LogicalStyleKeys.java
rename to freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleKeys.java
diff --git a/freeplane/src/org/freeplane/features/styles/LogicalStyleModel.java b/freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/LogicalStyleModel.java
rename to freeplane/src/main/java/org/freeplane/features/styles/LogicalStyleModel.java
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/MapStyle.java b/freeplane/src/main/java/org/freeplane/features/styles/MapStyle.java
new file mode 100644
index 0000000..1a64cb8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/MapStyle.java
@@ -0,0 +1,557 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles;
+
+import java.awt.Color;
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IElementContentHandler;
+import org.freeplane.core.io.IElementDOMHandler;
+import org.freeplane.core.io.IElementHandler;
+import org.freeplane.core.io.IExtensionElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.edge.AutomaticEdgeColorHook;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.IMapLifeCycleListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapWriter;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.styles.ConditionalStyleModel.Item;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 9, 2009
+ */
+ at NodeHookDescriptor(hookName = "MapStyle")
+public class MapStyle extends PersistentNodeHook implements IExtension, IMapLifeCycleListener {
+ private static final String NODE_CONDITIONAL_STYLES = "NodeConditionalStyles";
+ public static final String RESOURCES_BACKGROUND_COLOR = "standardbackgroundcolor";
+ public static final String RESOURCES_BACKGROUND_IMAGE = "backgroundImageURI";
+ public static final String MAP_STYLES = "MAP_STYLES";
+ public static final String FIT_TO_VIEWPORT = "fit_to_viewport";
+
+ public static void install(boolean persistent){
+ new MapStyle(persistent);
+ }
+
+ protected MapStyle( final boolean persistent) {
+ super();
+ ModeController modeController = Controller.getCurrentModeController();
+ if (persistent) {
+ final MapController mapController = modeController.getMapController();
+ mapController.getWriteManager().addExtensionElementWriter(getExtensionClass(),
+ new XmlWriter());
+ mapController.getReadManager().addElementHandler("conditional_styles", new IElementDOMHandler() {
+ public Object createElement(Object parent, String tag, XMLElement attributes) {
+ return parent;
+ }
+
+ public void endElement(Object parent, String tag, Object element, XMLElement dom) {
+ final NodeModel node = (NodeModel) parent;
+ final MapStyleModel mapStyleModel = MapStyleModel.getExtension(node);
+ if(mapStyleModel != null)
+ loadConditionalStyles(mapStyleModel.getConditionalStyleModel(), dom);
+ }
+ });
+
+ mapController.getWriteManager().addExtensionElementWriter(ConditionalStyleModel.class,
+ new IExtensionElementWriter() {
+ public void writeContent(ITreeWriter writer, Object element, IExtension extension) throws IOException {
+ final ConditionalStyleModel conditionalStyleModel = (ConditionalStyleModel) extension;
+ if (conditionalStyleModel.getStyleCount() == 0)
+ return;
+ final XMLElement hook = new XMLElement("hook");
+ hook.setAttribute("NAME", NODE_CONDITIONAL_STYLES);
+ saveConditionalStyles(conditionalStyleModel, hook, false);
+ writer.addElement(null, hook);
+ }
+ });
+
+ mapController.getReadManager().addElementHandler("hook", new IElementDOMHandler() {
+ public Object createElement(Object parent, String tag, XMLElement attributes) {
+ if (attributes == null
+ || !NODE_CONDITIONAL_STYLES.equals(attributes.getAttribute("NAME", null))) {
+ return null;
+ }
+ final ConditionalStyleModel conditionalStyleModel = new ConditionalStyleModel();
+ ((NodeModel)parent).addExtension(conditionalStyleModel);
+ return conditionalStyleModel;
+ }
+
+ public void endElement(Object parent, String tag, Object element, XMLElement dom) {
+ loadConditionalStyles((ConditionalStyleModel) element, dom);
+ }
+ });
+ mapController.getReadManager().addElementHandler("map_styles", new IElementContentHandler() {
+ public Object createElement(Object parent, String tag, XMLElement attributes) {
+ return parent;
+ }
+ public void endElement(final Object parent, final String tag, final Object userObject,
+ final XMLElement attributes, final String content) {
+ // bugfix
+ if(isContentEmpty(content))
+ return;
+ final NodeModel node = (NodeModel) userObject;
+ final MapStyleModel mapStyleModel = MapStyleModel.getExtension(node);
+ if (mapStyleModel == null) {
+ return;
+ }
+ final MapModel map = node.getMap();
+ mapStyleModel.createStyleMap(map, mapStyleModel, content);
+ map.getIconRegistry().addIcons(mapStyleModel.getStyleMap());
+ }
+ private boolean isContentEmpty(final String content) {
+ return content.indexOf('<') == -1;
+ }
+
+ }
+ );
+
+ }
+ modeController.getMapController().addMapLifeCycleListener(this);
+ final MapController mapController = modeController.getMapController();
+ mapController.addMapLifeCycleListener(this);
+ }
+
+ protected class XmlWriter implements IExtensionElementWriter {
+ public void writeContent(final ITreeWriter writer, final Object object, final IExtension extension)
+ throws IOException {
+ final MapStyleModel mapStyleModel = (MapStyleModel) extension;
+ final MapModel styleMap = mapStyleModel.getStyleMap();
+ final String el = System.getProperty("line.separator");
+ if (styleMap == null) {
+ return;
+ }
+ final MapWriter mapWriter = Controller.getCurrentModeController().getMapController().getMapWriter();
+ final StringWriter sw = new StringWriter();
+ sw.append(el);
+ sw.append("<map_styles>");
+ sw.append(el);
+ final NodeModel rootNode = styleMap.getRootNode();
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ try {
+ mapWriter.writeNodeAsXml(sw, rootNode, Mode.STYLE, true, true, forceFormatting);
+ }
+ catch (final IOException e) {
+ e.printStackTrace();
+ }
+ sw.append("</map_styles>");
+ sw.append(el);
+ final XMLElement element = new XMLElement("hook");
+ saveExtension(extension, element);
+ writer.addElement(sw.toString(), element);
+ }
+ }
+
+ @Override
+ protected XmlWriter createXmlWriter() {
+ return null;
+ }
+
+ protected class MyXmlReader extends XmlReader{
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (null == super.createElement(parent, tag, attributes)){
+ return null;
+ }
+ super.endElement(parent, tag, parent, attributes);
+ return parent;
+ }
+
+ @Override
+ public void endElement(Object parent, String tag, Object userObject, XMLElement xml) {
+ // do nothing for not root nodes
+ final XMLElement parentNodeElement = xml.getParent().getParent();
+ if (parentNodeElement == null || !parentNodeElement.getName().equals("map")) {
+ return;
+ }
+ NodeModel node = (NodeModel) userObject;
+ loadMapStyleProperties(MapStyleModel.getExtension(node), xml);
+ }
+
+ private void loadMapStyleProperties(MapStyleModel model, XMLElement xml) {
+ final Vector<XMLElement> propertyXml = xml.getChildrenNamed("properties");
+ if(propertyXml != null && propertyXml.size() >= 1){
+ final Map<String, String> properties = model.getProperties();
+ final Properties attributes = propertyXml.get(0).getAttributes();
+ for(Entry<Object, Object> attribute:attributes.entrySet()){
+ properties.put(attribute.getKey().toString(), attribute.getValue().toString());
+ }
+ }
+ }
+
+ }
+
+ @Override
+ protected IElementHandler createXmlReader() {
+ return new MyXmlReader();
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ final MapStyleModel model = new MapStyleModel();
+ final String colorString = element.getAttribute("background", null);
+ final String alphaString = element.getAttribute("background_alpha", null);
+ Color bgColor;
+ if (colorString != null) {
+ bgColor = ColorUtils.stringToColor(colorString);
+ }
+ else {
+ bgColor = null;
+ }
+ if (alphaString != null) {
+ bgColor = ColorUtils.alphaToColor(alphaString, bgColor);
+ }
+ model.setBackgroundColor(bgColor);
+ final String zoomString = element.getAttribute("zoom", null);
+ if (zoomString != null) {
+ final float zoom = Float.valueOf(zoomString);
+ model.setZoom(zoom);
+ }
+ final String layoutString = element.getAttribute("layout", null);
+ try {
+ if (layoutString != null) {
+ final MapViewLayout layout = MapViewLayout.valueOf(layoutString);
+ model.setMapViewLayout(layout);
+ }
+ }
+ catch (final Exception e) {
+ }
+ return model;
+ }
+
+ private void loadConditionalStyles(ConditionalStyleModel conditionalStyleModel, XMLElement conditionalStylesRoot) {
+ final ConditionFactory conditionFactory = FilterController.getCurrentFilterController().getConditionFactory();
+ final Vector<XMLElement> styleElements = conditionalStylesRoot.getChildrenNamed("conditional_style");
+ for(XMLElement styleElement : styleElements){
+ final boolean isActive = Boolean.valueOf(styleElement.getAttribute("ACTIVE", "false"));
+ final boolean isLast = Boolean.valueOf(styleElement.getAttribute("LAST", "false"));
+ String styleText = styleElement.getAttribute("LOCALIZED_STYLE_REF", null);
+ final IStyle style;
+ if(styleText != null){
+ style = StyleFactory.create(TranslatedObject.format((String) styleText));
+ }
+ else {
+ style = StyleFactory.create(styleElement.getAttribute("STYLE_REF", null));
+ }
+ final ASelectableCondition condition;
+ if(styleElement.getChildrenCount() == 1){
+ final XMLElement conditionElement = styleElement.getChildAtIndex(0);
+ try {
+ condition = conditionFactory.loadCondition(conditionElement);
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ continue;
+ }
+ }
+ else{
+ condition = null;
+ }
+ conditionalStyleModel.addCondition(isActive, condition, style, isLast);
+ }
+ }
+ private void saveConditionalStyles(ConditionalStyleModel conditionalStyleModel, XMLElement parent, boolean createRoot) {
+ final int styleCount = conditionalStyleModel.getStyleCount();
+ if(styleCount == 0){
+ return;
+ }
+ final XMLElement conditionalStylesRoot;
+ if(createRoot){
+ conditionalStylesRoot = parent.createElement("conditional_styles");
+ parent.addChild(conditionalStylesRoot);
+ }
+ else
+ conditionalStylesRoot = parent;
+ for(final Item item : conditionalStyleModel){
+ item.toXml(conditionalStylesRoot);
+ }
+
+ }
+
+ public Color getBackground(final MapModel map) {
+ final IExtension extension = map.getRootNode().getExtension(MapStyleModel.class);
+ final Color backgroundColor = extension != null ? ((MapStyleModel) extension).getBackgroundColor() : null;
+ if (backgroundColor != null) {
+ return backgroundColor;
+ }
+ final String stdcolor = ResourceController.getResourceController().getProperty(
+ MapStyle.RESOURCES_BACKGROUND_COLOR);
+ final Color standardMapBackgroundColor = ColorUtils.stringToColor(stdcolor);
+ return standardMapBackgroundColor;
+ }
+
+ @Override
+ protected Class<MapStyleModel> getExtensionClass() {
+ return MapStyleModel.class;
+ }
+
+ public void onCreate(final MapModel map) {
+ final NodeModel rootNode = map.getRootNode();
+ final MapStyleModel mapStyleModel = MapStyleModel.getExtension(rootNode);
+ if (mapStyleModel != null && mapStyleModel.getStyleMap() != null) {
+ return;
+ }
+ createDefaultStyleMap(map);
+ }
+
+ private void createDefaultStyleMap(final MapModel map) {
+ UrlManager loader = UrlManager.getController();
+ final File file = loader.defaultTemplateFile();
+ if (file != null) {
+ try {
+ MapModel styleMapContainer = new MapModel();
+ loader.load(Compat.fileToUrl(file), styleMapContainer);
+ if (null != MapStyleModel.getExtension(styleMapContainer)){
+ moveStyle(styleMapContainer, map, false);
+ return;
+ }
+ }
+ catch (Exception e) {
+ LogUtils.warn(e);
+ UITools.errorMessage(TextUtils.format("error_in_template", file));
+ }
+ };
+ MapModel styleMapContainer = new MapModel();
+ try {
+ loader.load(ResourceController.getResourceController().getResource("/styles/viewer_standard.mm"), styleMapContainer);
+ moveStyle(styleMapContainer, map, false);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ private void moveStyle(final MapModel sourceMap, final MapModel targetMap, boolean overwrite) {
+ final MapStyleModel source = (MapStyleModel) sourceMap.getRootNode().removeExtension(MapStyleModel.class);
+ if(source == null)
+ return;
+ final IExtension undoHandler = targetMap.getExtension(IUndoHandler.class);
+ source.getStyleMap().putExtension(IUndoHandler.class, undoHandler);
+ final NodeModel targetRoot = targetMap.getRootNode();
+ final MapStyleModel target = MapStyleModel.getExtension(targetRoot);
+ if(target == null){
+ targetRoot.addExtension(source);
+ }
+ else{
+ target.copyFrom(source, overwrite);
+ }
+ }
+
+
+ @Override
+ protected HookAction createHookAction() {
+ return null;
+ }
+
+ public void copyStyle(final URL source, final MapModel targetMap, boolean undoable) {
+ final MapModel styleMapContainer = new MapModel();
+ final IExtension oldStyleModel = targetMap.getRootNode().removeExtension(MapStyleModel.class);
+ final ModeController modeController = Controller.getCurrentModeController();
+ final UrlManager urlManager = modeController.getExtension(UrlManager.class);
+ urlManager.loadCatchExceptions(source, styleMapContainer);
+ onCreate(styleMapContainer);
+ moveStyle(styleMapContainer, targetMap, true);
+ modeController.getExtension(AutomaticLayoutController.class).moveExtension(modeController, styleMapContainer, targetMap);
+ modeController.getExtension(AutomaticEdgeColorHook.class).moveExtension(modeController, styleMapContainer, targetMap);
+ LogicalStyleController.getController().refreshMap(targetMap);
+ if(! undoable){
+ return;
+ }
+ final IExtension newStyleModel = targetMap.getRootNode().getExtension(MapStyleModel.class);
+ IActor actor = new IActor() {
+ public void undo() {
+ targetMap.getRootNode().putExtension(oldStyleModel);
+ }
+
+ public String getDescription() {
+ return "moveStyle";
+ }
+
+ public void act() {
+ targetMap.getRootNode().putExtension(newStyleModel);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, targetMap);
+ }
+
+ public void onRemove(final MapModel map) {
+ }
+
+ @Override
+ protected void saveExtension(final IExtension extension, final XMLElement element) {
+ final MapStyleModel mapStyleModel = (MapStyleModel) extension;
+ super.saveExtension(extension, element);
+ final Color backgroundColor = mapStyleModel.getBackgroundColor();
+ if (backgroundColor != null) {
+ ColorUtils.setColorAttributes(element, "background", "background_alpha", backgroundColor);
+ }
+ final float zoom = mapStyleModel.getZoom();
+ if (zoom != 1f) {
+ element.setAttribute("zoom", Float.toString(zoom));
+ }
+ final MapViewLayout layout = mapStyleModel.getMapViewLayout();
+ if (!layout.equals(MapViewLayout.MAP)) {
+ element.setAttribute("layout", layout.toString());
+ }
+ saveConditionalStyles(mapStyleModel.getConditionalStyleModel(), element, true);
+ saveProperties(mapStyleModel.getProperties(), element);
+ }
+
+ private void saveProperties(Map<String, String> properties, XMLElement element) {
+ if(properties.isEmpty()){
+ return;
+ }
+ final XMLElement xmlElement = new XMLElement("properties");
+ for (Entry<String, String> entry: properties.entrySet()){
+ xmlElement.setAttribute(entry.getKey(), entry.getValue());
+ }
+ element.addChild(xmlElement);
+ }
+
+ public void setZoom(final MapModel map, final float zoom) {
+ final MapStyleModel mapStyleModel = MapStyleModel.getExtension(map);
+ if (zoom == mapStyleModel.getZoom()) {
+ return;
+ }
+ mapStyleModel.setZoom(zoom);
+ Controller.getCurrentModeController().getMapController().setSaved(map, false);
+ }
+
+
+ public void setMapViewLayout(final MapModel map, final MapViewLayout layout) {
+ final MapStyleModel mapStyleModel = MapStyleModel.getExtension(map);
+ if (layout.equals(mapStyleModel.getMapViewLayout())) {
+ return;
+ }
+ mapStyleModel.setMapViewLayout(layout);
+ Controller.getCurrentModeController().getMapController().setSaved(map, false);
+ }
+
+ public void setBackgroundColor(final MapStyleModel model, final Color actionColor) {
+ final Color oldColor = model.getBackgroundColor();
+ if (actionColor == oldColor || actionColor != null && actionColor.equals(oldColor)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ model.setBackgroundColor(actionColor);
+ Controller.getCurrentModeController().getMapController().fireMapChanged(
+ new MapChangeEvent(MapStyle.this, Controller.getCurrentController().getMap(), MapStyle.RESOURCES_BACKGROUND_COLOR,
+ oldColor, actionColor));
+ }
+
+ public String getDescription() {
+ return "MapStyle.setBackgroundColor";
+ }
+
+ public void undo() {
+ model.setBackgroundColor(oldColor);
+ Controller.getCurrentModeController().getMapController().fireMapChanged(
+ new MapChangeEvent(MapStyle.this, Controller.getCurrentController().getMap(), MapStyle.RESOURCES_BACKGROUND_COLOR,
+ actionColor, oldColor));
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, Controller.getCurrentController().getMap());
+ }
+
+ public static MapStyle getController(final ModeController modeController) {
+ return (MapStyle) modeController.getExtension(MapStyle.class);
+ }
+
+ public static MapStyle getController() {
+ return (MapStyle) getController(Controller.getCurrentModeController());
+ }
+
+ public void setProperty(final MapModel model, final String key, final String newValue) {
+ final MapStyleModel styleModel = MapStyleModel.getExtension(model);
+ final String oldValue = styleModel.getProperty(key);
+ if(oldValue == newValue || oldValue != null && oldValue.equals(newValue)) {
+ return;
+ }
+ IActor actor = new IActor() {
+ public void undo() {
+ setPropertyWithoutUndo(model, key, oldValue);
+ }
+
+ public String getDescription() {
+ return "set map style property";
+ }
+
+ public void act() {
+ setPropertyWithoutUndo(model, key, newValue);
+ }
+
+ private void setPropertyWithoutUndo(final MapModel model, final String key, final String newValue) {
+ styleModel.setProperty(key, newValue);
+ Controller.getCurrentModeController().getMapController().fireMapChanged(
+ new MapChangeEvent(MapStyle.this, model, key, oldValue, newValue));
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, model);
+ }
+
+ public String getPropertySetDefault(final MapModel model, final String key) {
+ final MapStyleModel styleModel = MapStyleModel.getExtension(model);
+ final String oldValue = styleModel.getProperty(key);
+ if(oldValue != null){
+ return oldValue;
+ }
+ final String value = ResourceController.getResourceController().getProperty(key);
+ styleModel.setProperty(key, value);
+ return value;
+ }
+
+ public String getProperty(final MapModel model, final String key) {
+ return MapStyleModel.getExtension(model).getProperty(key);
+ }
+
+ public Map<String, String> getPropertiesReadOnly(final MapModel model) {
+ return Collections.unmodifiableMap(MapStyleModel.getExtension(model).getProperties());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/MapStyleModel.java b/freeplane/src/main/java/org/freeplane/features/styles/MapStyleModel.java
new file mode 100644
index 0000000..e20d0f9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/MapStyleModel.java
@@ -0,0 +1,343 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles;
+
+import java.awt.Color;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.event.ListDataListener;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.attribute.FontSizeExtension;
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.features.edge.EdgeModel;
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapReader;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.MapWriter.Hint;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.features.nodestyle.NodeSizeModel;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 12, 2009
+ */
+public class MapStyleModel implements IExtension {
+ public static final String STYLES_PREDEFINED = "styles.predefined";
+ public static final String STYLES_USER_DEFINED = "styles.user-defined";
+ public static final String STYLES_AUTOMATIC_LAYOUT = "styles.AutomaticLayout";
+ public static final IStyle DEFAULT_STYLE = new StyleTranslatedObject("default");
+ public static final IStyle DETAILS_STYLE = new StyleTranslatedObject("defaultstyle.details");
+ public static final IStyle ATTRIBUTE_STYLE = new StyleTranslatedObject("defaultstyle.attributes");
+ public static final IStyle NOTE_STYLE = new StyleTranslatedObject("defaultstyle.note");
+ public static final IStyle FLOATING_STYLE = new StyleTranslatedObject("defaultstyle.floating");
+ private Map<IStyle, NodeModel> styleNodes;
+ private MapModel styleMap;
+ private ConditionalStyleModel conditionalStyleModel;
+ final private DefaultComboBoxModel stylesComboBoxModel;
+ final private Map<String, String> properties;
+
+ Map<String, String> getProperties() {
+ return properties;
+ }
+
+ public static MapStyleModel getExtension(final MapModel map) {
+ return MapStyleModel.getExtension(map.getRootNode());
+ }
+
+ public MapModel getStyleMap() {
+ return styleMap;
+ }
+
+ public static MapStyleModel getExtension(final NodeModel node) {
+ return (MapStyleModel) node.getExtension(MapStyleModel.class);
+ }
+
+ private Color backgroundColor;
+
+ public MapStyleModel() {
+ conditionalStyleModel = new ConditionalStyleModel();
+ styleNodes = new LinkedHashMap<IStyle, NodeModel>();
+ properties = new LinkedHashMap<String, String>();
+ stylesComboBoxModel = new DefaultComboBoxModel();
+ }
+
+ public ConditionalStyleModel getConditionalStyleModel() {
+ return conditionalStyleModel;
+ }
+
+
+ private void insertStyleMap(MapModel map, MapModel styleMap) {
+ this.styleMap = styleMap;
+ final NodeModel rootNode = styleMap.getRootNode();
+ createNodeStyleMap(rootNode);
+ styleMap.putExtension(IUndoHandler.class, map.getExtension(IUndoHandler.class));
+ final MapStyleModel defaultStyleModel = new MapStyleModel();
+ defaultStyleModel.styleNodes = styleNodes;
+ initStylesComboBoxModel();
+ rootNode.putExtension(defaultStyleModel);
+ }
+
+ public void refreshStyles() {
+ final NodeModel rootNode = styleMap.getRootNode();
+ styleNodes.clear();
+ stylesComboBoxModel.removeAllElements();
+ createNodeStyleMap(rootNode);
+ }
+
+ void createStyleMap(final MapModel parentMap, MapStyleModel mapStyleModel, final String styleMapStr) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ MapModel styleMap = new StyleMapModel();
+ styleMap.createNewRoot();
+ final MapReader mapReader = modeController.getMapController().getMapReader();
+ final Reader styleReader = new StringReader(styleMapStr);
+ NodeModel root;
+ try {
+ Map<Object, Object> hints = new HashMap<Object, Object>();
+ hints.put(Hint.MODE, Mode.FILE);
+ hints.put(NodeBuilder.FOLDING_LOADED, Boolean.TRUE);
+ root = mapReader.createNodeTreeFromXml(styleMap, styleReader, hints);
+ NodeStyleModel.setShapeConfiguration(root, ShapeConfigurationModel.NULL_SHAPE.withShape(NodeStyleModel.Shape.oval).withUniform(true));
+ NodeStyleModel.createNodeStyleModel(root).setFontSize(24);
+ styleMap.setRoot(root);
+ final Quantity<LengthUnits> styleBlockGap = ResourceController.getResourceController().getLengthQuantityProperty("style_block_gap");
+ LocationModel.createLocationModel(root).setVGap(styleBlockGap);
+ insertStyleMap(parentMap, styleMap);
+ NodeModel predefinedStyleParentNode = createStyleGroupNode(styleMap, STYLES_PREDEFINED);
+ createStyleGroupNode(styleMap, STYLES_USER_DEFINED);
+ createStyleGroupNode(styleMap, STYLES_AUTOMATIC_LAYOUT);
+ if(styleNodes.get(DEFAULT_STYLE) == null){
+ final NodeModel newNode = new NodeModel(DEFAULT_STYLE, styleMap);
+ predefinedStyleParentNode.insert(newNode, 0);
+ addStyleNode(newNode);
+ }
+ NodeModel defaultStyleModel = styleNodes.get(DEFAULT_STYLE);
+ if(maxNodeWidth != null && null == NodeSizeModel.getMaxNodeWidth(defaultStyleModel))
+ NodeSizeModel.setMaxNodeWidth(defaultStyleModel, maxNodeWidth);
+ if(minNodeWidth != null && null == NodeSizeModel.getMinNodeWidth(defaultStyleModel))
+ NodeSizeModel.setNodeMinWidth(defaultStyleModel, minNodeWidth);
+ if(styleNodes.get(DETAILS_STYLE) == null){
+ final NodeModel newNode = new NodeModel(DETAILS_STYLE, styleMap);
+ predefinedStyleParentNode.insert(newNode, 1);
+ addStyleNode(newNode);
+ }
+ if(styleNodes.get(ATTRIBUTE_STYLE) == null){
+ final NodeModel newNode = new NodeModel(ATTRIBUTE_STYLE, styleMap);
+ final int defaultFontSize = 9;
+ NodeStyleModel.createNodeStyleModel(newNode).setFontSize(defaultFontSize);
+ predefinedStyleParentNode.insert(newNode, 2);
+ addStyleNode(newNode);
+ }
+ FontSizeExtension fontSizeExtension = parentMap.getExtension(FontSizeExtension.class);
+ if(fontSizeExtension != null){
+ NodeStyleModel.createNodeStyleModel(styleNodes.get(ATTRIBUTE_STYLE)).setFontSize(fontSizeExtension.fontSize);
+ }
+ if(styleNodes.get(NOTE_STYLE) == null){
+ final NodeModel newNode = new NodeModel(NOTE_STYLE, styleMap);
+ NodeStyleModel.createNodeStyleModel(newNode).setBackgroundColor(Color.WHITE);
+ predefinedStyleParentNode.insert(newNode, 3);
+ addStyleNode(newNode);
+ }
+ if(styleNodes.get(FLOATING_STYLE) == null){
+ final NodeModel newNode = new NodeModel(FLOATING_STYLE, styleMap);
+ EdgeModel.createEdgeModel(newNode).setStyle(EdgeStyle.EDGESTYLE_HIDDEN);
+ CloudModel.createModel(newNode).setShape(CloudModel.Shape.ROUND_RECT);
+ predefinedStyleParentNode.insert(newNode, 4);
+ addStyleNode(newNode);
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected NodeModel createStyleGroupNode(MapModel styleMap, String groupName) {
+ NodeModel root = styleMap.getRootNode();
+ NodeModel predefinedStyleParentNode = getStyleNodeGroup(styleMap, groupName);
+ if(predefinedStyleParentNode == null){
+ predefinedStyleParentNode = new NodeModel(styleMap);
+ predefinedStyleParentNode.setUserObject(new StyleTranslatedObject(groupName));
+ root.insert(predefinedStyleParentNode);
+ }
+ NodeStyleModel.setShape(predefinedStyleParentNode, NodeStyleModel.Shape.bubble);
+ return predefinedStyleParentNode;
+ }
+
+ private void createNodeStyleMap(final NodeModel node) {
+ if (node.hasChildren()) {
+ final Enumeration<NodeModel> children = node.children();
+ while (children.hasMoreElements()) {
+ createNodeStyleMap(children.nextElement());
+ }
+ return;
+ }
+ if (node.depth() >= 2) {
+ addStyleNode(node);
+ }
+ }
+
+ public void addStyleNode(final NodeModel node) {
+ final IStyle userObject = (IStyle) node.getUserObject();
+ if(null == styleNodes.put(userObject, node))
+ stylesComboBoxModel.addElement(userObject);
+ }
+
+ private void initStylesComboBoxModel() {
+ stylesComboBoxModel.removeAllElements();
+ for(IStyle s : getStyles())
+ stylesComboBoxModel.addElement(s);
+
+ }
+
+ public void removeStyleNode(final NodeModel node) {
+ final Object userObject = node.getUserObject();
+ if(null != styleNodes.remove(userObject))
+ stylesComboBoxModel.removeElement(userObject);
+ }
+
+ public NodeModel getStyleNodeSafe(final IStyle style) {
+ final NodeModel node = getStyleNode(style);
+ if(node != null)
+ return node;
+ return getStyleNode(DEFAULT_STYLE);
+ }
+ public NodeModel getStyleNode(final IStyle style) {
+ if(style instanceof StyleNode){
+ return ((StyleNode)style).getNode();
+ }
+ final NodeModel node = styleNodes.get(style);
+ return node;
+ }
+
+ public Color getBackgroundColor() {
+ return backgroundColor;
+ }
+
+ public void setBackgroundColor(final Color backgroundColor) {
+ this.backgroundColor = backgroundColor;
+ }
+
+ public Set<IStyle> getStyles() {
+ return styleNodes.keySet();
+ }
+
+ private float zoom = 1f;
+
+ public float getZoom() {
+ return zoom;
+ }
+
+ public MapViewLayout getMapViewLayout() {
+ return mapViewLayout;
+ }
+
+ void setMapViewLayout(final MapViewLayout mapViewLayout) {
+ this.mapViewLayout = mapViewLayout;
+ }
+
+ void setZoom(final float zoom) {
+ this.zoom = zoom;
+ }
+
+ private MapViewLayout mapViewLayout = MapViewLayout.MAP;
+ private Quantity<LengthUnits> maxNodeWidth = null;
+ private Quantity<LengthUnits> minNodeWidth = null;
+ public void setMaxNodeWidth(final Quantity<LengthUnits> maxNodeWidth) {
+ this.maxNodeWidth = maxNodeWidth;
+ }
+
+ public void setMinNodeWidth(final Quantity<LengthUnits> minNodeWidth) {
+ this.minNodeWidth = minNodeWidth;
+ }
+
+ void copyFrom(MapStyleModel source, boolean overwrite) {
+ if(overwrite && source.styleMap != null || styleMap == null){
+ styleMap = source.styleMap;
+ styleNodes = source.styleNodes;
+ initStylesComboBoxModel();
+ conditionalStyleModel = source.conditionalStyleModel;
+ }
+ if(overwrite && source.backgroundColor != null|| backgroundColor == null){
+ backgroundColor = source.backgroundColor;
+ }
+ }
+
+ public void setProperty(String key, String value){
+ if (value != null){
+ properties.put(key, value);
+ }
+ else{
+ properties.remove(key);
+ }
+ }
+
+ public String getProperty(String key){
+ return properties.get(key);
+ }
+
+ public NodeModel getStyleNodeGroup(NodeModel styleNode){
+ final int depth = styleNode.depth();
+ if(depth < 1)
+ return null;
+ NodeModel node = styleNode;
+ for(int i = depth; i > 1; i--){
+ node = node.getParentNode();
+ }
+ return node;
+ }
+
+ public NodeModel getStyleNodeGroup(final MapModel styleMap, final String group) {
+ final NodeModel rootNode = styleMap.getRootNode();
+ final int childCount = rootNode.getChildCount();
+ for(int i = 0; i < childCount; i++){
+ final NodeModel childNode = (NodeModel) rootNode.getChildAt(i);
+ final StyleTranslatedObject userObject = (StyleTranslatedObject) childNode.getUserObject();
+ if(userObject.getObject().equals(group)){
+ return childNode;
+ }
+ }
+ return null;
+ }
+
+ ArrayList<ListDataListener> listeners = new ArrayList<ListDataListener>();
+ ComboBoxModel getStylesAsComboBoxModel() {
+ return stylesComboBoxModel;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/MapViewLayout.java b/freeplane/src/main/java/org/freeplane/features/styles/MapViewLayout.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/MapViewLayout.java
rename to freeplane/src/main/java/org/freeplane/features/styles/MapViewLayout.java
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/SetBooleanMapPropertyAction.java b/freeplane/src/main/java/org/freeplane/features/styles/SetBooleanMapPropertyAction.java
new file mode 100644
index 0000000..8007d3b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/SetBooleanMapPropertyAction.java
@@ -0,0 +1,82 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 2, 2011
+ */
+ at SuppressWarnings("serial")
+ at SelectableAction(checkOnPopup = true)
+ at EnabledAction(checkOnNodeChange = true)
+public class SetBooleanMapPropertyAction extends AFreeplaneAction{
+
+ private String propertyName;
+ public SetBooleanMapPropertyAction(String propertyName) {
+ super("SetBooleanMapPropertyAction." + propertyName,
+ TextUtils.getRawText("OptionPanel." + propertyName),
+ null);
+ this.propertyName = propertyName;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel node = controller.getSelection().getSelected();
+ final ModeController modeController = controller.getModeController();
+ final MapStyle mapStyleController = MapStyle.getController(modeController);
+ final MapModel map = node.getMap();
+ final String value = mapStyleController.getPropertySetDefault(map, propertyName);
+ boolean set = ! Boolean.parseBoolean(value);
+ mapStyleController.setProperty(map, propertyName, Boolean.toString(set));
+ setSelected(set);
+ }
+ @Override
+ public void setSelected() {
+ try {
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel node = controller.getSelection().getSelected();
+ final ModeController modeController = controller.getModeController();
+ final MapStyle mapStyleController = MapStyle.getController(modeController);
+ final String value = mapStyleController.getPropertySetDefault(node.getMap(), propertyName);
+ boolean isSet = Boolean.parseBoolean(value);
+ setSelected(isSet);
+ }
+ catch (Exception e) {
+ setSelected(false);
+ }
+ }
+
+ public void setEnabled() {
+ final Controller controller = Controller.getCurrentController();
+ setEnabled(controller.getSelection() != null);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/StyleCondition.java b/freeplane/src/main/java/org/freeplane/features/styles/StyleCondition.java
new file mode 100644
index 0000000..ef0453c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/StyleCondition.java
@@ -0,0 +1,51 @@
+package org.freeplane.features.styles;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class StyleCondition extends ASelectableCondition {
+ static final String NAME = "style_equals_condition";
+ final private Object value;
+
+ public StyleCondition(final IStyle value) {
+ this.value = value;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ IStyle firstStyle = LogicalStyleController.getController().getFirstStyle(node);
+ return value.equals(firstStyle);
+ }
+
+ public void fillXML(final XMLElement child) {
+ if (value instanceof StyleString) {
+ child.setAttribute("TEXT", value.toString());
+ }
+ else if (value instanceof StyleTranslatedObject) {
+ child.setAttribute("LOCALIZED_TEXT", ((StyleTranslatedObject) value).getObject().toString());
+ }
+ }
+
+ public static ASelectableCondition load(final XMLElement element) {
+ final String text = element.getAttribute("TEXT", null);
+ if (text != null) {
+ return new StyleCondition(new StyleString(text));
+ }
+ final String name = element.getAttribute("LOCALIZED_TEXT", null);
+ if (name != null) {
+ return new StyleCondition(new StyleTranslatedObject(name));
+ }
+ return null;
+ }
+
+ protected String createDescription() {
+ final String filterStyle = TextUtils.getText(LogicalStyleFilterController.FILTER_STYLE);
+ return filterStyle + " '" + value.toString() + '\'';
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/StyleContainsCondition.java b/freeplane/src/main/java/org/freeplane/features/styles/StyleContainsCondition.java
new file mode 100644
index 0000000..7ad6747
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/StyleContainsCondition.java
@@ -0,0 +1,55 @@
+package org.freeplane.features.styles;
+
+import java.util.Collection;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class StyleContainsCondition extends ASelectableCondition {
+ static final String NAME = "style_contains_condition";
+ final private Object value;
+
+ public StyleContainsCondition(final IStyle value) {
+ this.value = value;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final Collection<IStyle> styles = LogicalStyleController.getController().getStyles(node);
+ return styles.contains(value);
+ }
+
+ public void fillXML(final XMLElement child) {
+ if (value instanceof StyleString) {
+ child.setAttribute("TEXT", value.toString());
+ }
+ else if (value instanceof StyleTranslatedObject) {
+ child.setAttribute("LOCALIZED_TEXT", ((StyleTranslatedObject) value).getObject().toString());
+ }
+ }
+
+ public static ASelectableCondition load(final XMLElement element) {
+ final String text = element.getAttribute("TEXT", null);
+ if (text != null) {
+ return new StyleContainsCondition(new StyleString(text));
+ }
+ final String name = element.getAttribute("LOCALIZED_TEXT", null);
+ if (name != null) {
+ return new StyleContainsCondition(new StyleTranslatedObject(name));
+ }
+ return null;
+ }
+
+ protected String createDescription() {
+ final String style = TextUtils.getText(LogicalStyleFilterController.FILTER_STYLE);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
+ return ConditionFactory.createDescription(style, simpleCondition, value.toString(), false, false);
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/StyleFactory.java b/freeplane/src/main/java/org/freeplane/features/styles/StyleFactory.java
new file mode 100644
index 0000000..8ac3b75
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/StyleFactory.java
@@ -0,0 +1,13 @@
+package org.freeplane.features.styles;
+
+import org.freeplane.core.resources.TranslatedObject;
+
+public class StyleFactory {
+ public static IStyle create(String string){
+ return new StyleString(string);
+ }
+
+ public static IStyle create(TranslatedObject no){
+ return new StyleTranslatedObject(no);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/StyleMapModel.java b/freeplane/src/main/java/org/freeplane/features/styles/StyleMapModel.java
new file mode 100644
index 0000000..9546de7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/StyleMapModel.java
@@ -0,0 +1,39 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Feb 6, 2011
+ */
+class StyleMapModel extends MapModel {
+ private static final String STYLES = "styles";
+ StyleMapModel() {
+ super();
+ }
+
+ @Override
+ public String getTitle() {
+ return TextUtils.getText(STYLES);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/StyleNode.java b/freeplane/src/main/java/org/freeplane/features/styles/StyleNode.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/StyleNode.java
rename to freeplane/src/main/java/org/freeplane/features/styles/StyleNode.java
diff --git a/freeplane/src/org/freeplane/features/styles/StyleString.java b/freeplane/src/main/java/org/freeplane/features/styles/StyleString.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/StyleString.java
rename to freeplane/src/main/java/org/freeplane/features/styles/StyleString.java
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/StyleTranslatedObject.java b/freeplane/src/main/java/org/freeplane/features/styles/StyleTranslatedObject.java
new file mode 100644
index 0000000..3d17c40
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/StyleTranslatedObject.java
@@ -0,0 +1,56 @@
+package org.freeplane.features.styles;
+
+import org.freeplane.core.resources.TranslatedObject;
+
+
+public class StyleTranslatedObject implements IStyle {
+ final private TranslatedObject translatedObject;
+
+ public StyleTranslatedObject(TranslatedObject namedObject) {
+ super();
+ if(namedObject == null)
+ throw new NullPointerException();
+ this.translatedObject = namedObject;
+ }
+
+ public StyleTranslatedObject(String string) {
+ if(string == null)
+ throw new NullPointerException();
+ translatedObject = new TranslatedObject(string);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if(this == obj){
+ return true;
+ }
+ if(obj == null){
+ return false;
+ }
+ if(! this.getClass().equals(obj.getClass())){
+ return false;
+ }
+ return translatedObject.equals(((StyleTranslatedObject)obj).translatedObject);
+ }
+
+ @Override
+ public int hashCode() {
+ return translatedObject.hashCode() + 37 * StyleTranslatedObject.class.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return translatedObject.toString();
+ }
+
+ public Object getObject() {
+ return translatedObject.getObject();
+ }
+
+ public static String toKeyString(IStyle style) {
+ if(style instanceof StyleTranslatedObject){
+ return ((StyleTranslatedObject)style).getObject().toString();
+ }
+ return style.toString();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/AManageConditionalStylesAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/AManageConditionalStylesAction.java
new file mode 100644
index 0000000..d991da2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/AManageConditionalStylesAction.java
@@ -0,0 +1,145 @@
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.table.TableModel;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.styles.ConditionalStyleModel;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+
+abstract public class AManageConditionalStylesAction extends AFreeplaneAction {
+ private static final int BUTTON_GAP = 15;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public AManageConditionalStylesAction(final String name) {
+ super(name);
+ }
+
+ abstract public ConditionalStyleModel getConditionalStyleModel();
+
+ protected Component createConditionalStylePane(final MapModel map, final ConditionalStyleModel conditionalStyleModel) {
+ final JPanel pane = new JPanel(new BorderLayout());
+ final MapStyleModel styles = MapStyleModel.getExtension(map);
+ final TableModel tableModel = MLogicalStyleController.getController().getConditionalStyleModelAsTableModel(map, conditionalStyleModel);
+ final ConditionalStyleTable conditionalStyleTable = new ConditionalStyleTable(styles, tableModel);
+ if(conditionalStyleTable.getRowCount() > 0){
+ conditionalStyleTable.setRowSelectionInterval(0, 0);
+ }
+ JScrollPane scrollPane = new JScrollPane(conditionalStyleTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ final int tablePreferredWidth = scrollPane.getViewport().getViewSize().width;
+ scrollPane.setPreferredSize(new Dimension(tablePreferredWidth, 400));
+ pane.add(scrollPane, BorderLayout.CENTER);
+ final Box buttons = Box.createVerticalBox();
+
+ JButton create = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(create, TextUtils.getRawText("new"));
+ create.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ create.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ int row = conditionalStyleTable.getRowCount();
+ final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
+ ((MLogicalStyleController)LogicalStyleController.getController()).addConditionalStyle(map, conditionalStyleModel, true, null, MapStyleModel.DEFAULT_STYLE, false);
+ conditionalStyleTable.setRowSelectionInterval(row, row);
+ }
+ });
+
+ JButton edit = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(edit, TextUtils.getRawText("edit"));
+ edit.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ edit.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ int selectedRow = conditionalStyleTable.getSelectedRow();
+ if(selectedRow == -1){
+ return;
+ }
+ final ASelectableCondition value = (ASelectableCondition) conditionalStyleTable.getValueAt(selectedRow, 1);
+ final MLogicalStyleController styleController = MLogicalStyleController.getController();
+ final ASelectableCondition newCondition = styleController.editCondition(value);
+ conditionalStyleTable.setValueAt(newCondition, selectedRow, 1);
+ }
+ });
+
+ JButton delete = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(delete, TextUtils.getRawText("delete"));
+ delete.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ delete.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ int selectedRow = conditionalStyleTable.getSelectedRow();
+ if(selectedRow == -1){
+ return;
+ }
+ final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
+ ((MLogicalStyleController)LogicalStyleController.getController()).removeConditionalStyle(map, conditionalStyleModel, selectedRow);
+ if(conditionalStyleTable.getRowCount() == selectedRow){
+ selectedRow--;
+ }
+ if(selectedRow == -1){
+ return;
+ }
+ conditionalStyleTable.setRowSelectionInterval(selectedRow, selectedRow);
+ }
+ });
+ JButton up = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(up, TextUtils.getRawText("up"));
+ up.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ up.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ int selectedRow = conditionalStyleTable.getSelectedRow();
+ if(selectedRow <= 0){
+ return;
+ }
+ final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
+ ((MLogicalStyleController)LogicalStyleController.getController()).moveConditionalStyleUp(map, conditionalStyleModel, selectedRow);
+ selectedRow--;
+ conditionalStyleTable.setRowSelectionInterval(selectedRow, selectedRow);
+ }
+ });
+ JButton down = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(down, TextUtils.getRawText("down"));
+ down.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ down.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ int selectedRow = conditionalStyleTable.getSelectedRow();
+ if(selectedRow == -1 || selectedRow == conditionalStyleTable.getRowCount() - 1){
+ return;
+ }
+ final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
+ ((MLogicalStyleController)LogicalStyleController.getController()).moveConditionalStyleDown(map, conditionalStyleModel, selectedRow);
+ selectedRow++;
+ conditionalStyleTable.setRowSelectionInterval(selectedRow, selectedRow);
+ }
+ });
+ buttons.add(Box.createVerticalStrut(BUTTON_GAP));
+ buttons.add(create);
+ buttons.add(Box.createVerticalStrut(BUTTON_GAP));
+ buttons.add(edit);
+ buttons.add(Box.createVerticalStrut(BUTTON_GAP));
+ buttons.add(delete);
+ buttons.add(Box.createVerticalStrut(BUTTON_GAP));
+ buttons.add(up);
+ buttons.add(Box.createVerticalStrut(BUTTON_GAP));
+ buttons.add(down);
+ buttons.add(Box.createVerticalGlue());
+ pane.add(buttons, BorderLayout.EAST);
+ UITools.focusOn(conditionalStyleTable);
+ return pane;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/AssignStyleAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/AssignStyleAction.java
new file mode 100644
index 0000000..a18b00a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/AssignStyleAction.java
@@ -0,0 +1,83 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.LogicalStyleModel;
+import org.freeplane.features.styles.StyleTranslatedObject;
+
+/**
+ * @author Dimitry Polivaev
+ * 28.09.2009
+ */
+ at SelectableAction(checkOnPopup = true)
+public class AssignStyleAction extends AMultipleNodeAction {
+ final private IStyle style;
+
+ public AssignStyleAction(final IStyle style) {
+ super(actionName(style), actionText(style), null);
+ this.style = style;
+ }
+
+ private static String actionText(final IStyle style) {
+ if(style != null)
+ return style.toString();
+ return TextUtils.getRawText("ResetStyleAction.text");
+ }
+
+ private static String actionName(final IStyle style) {
+ if(style != null)
+ return "AssignStyleAction." + StyleTranslatedObject.toKeyString(style);
+ return "ResetStyleAction";
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final MLogicalStyleController controller = (MLogicalStyleController) Controller.getCurrentModeController().getExtension(
+ LogicalStyleController.class);
+ controller.setStyle(node, style);
+ }
+
+ @Override
+ public void setSelected() {
+ IMapSelection selection = Controller.getCurrentController().getSelection();
+ if(selection != null){
+ NodeModel node= selection.getSelected();
+ final IStyle style = LogicalStyleModel.getStyle(node);
+ setSelected(this.style == style || this.style != null && this.style.equals(style));
+ }
+ else
+ setSelected(false);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ComboBoxRendererWithTooltip.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ComboBoxRendererWithTooltip.java
new file mode 100644
index 0000000..174aeaf
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ComboBoxRendererWithTooltip.java
@@ -0,0 +1,67 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Container;
+import javax.swing.JComboBox;
+import javax.swing.JList;
+import javax.swing.plaf.basic.BasicComboBoxRenderer;
+
+/**
+ * @author Dimitry Polivaev
+ * Dec 31, 2011
+ */
+ at SuppressWarnings("serial")
+public class ComboBoxRendererWithTooltip extends BasicComboBoxRenderer {
+ final private JComboBox box;
+ public ComboBoxRendererWithTooltip(JComboBox box){
+ this.box = box;
+ }
+ public Component getListCellRendererComponent(JList list, Object value,
+ int index, boolean isSelected, boolean cellHasFocus) {
+ super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+ final String text;
+ final Container parent = list.getParent();
+ if(parent == null){
+ text = getText();
+ }
+ else {
+ final int parentWidth = parent.getWidth();
+ if(index == -1 || parentWidth > 0 && parentWidth < getPreferredSize().width)
+ text = getText();
+ else
+ text = null;
+ }
+ if(index == -1){
+ box.setToolTipText(text);
+ }
+ else{
+ list.setToolTipText(text);
+ }
+
+ // FELIXHACK
+ //setFont(getFont().deriveFont(8.0F));
+ //setPreferredSize(new Dimension(Math.max(40, getPreferredSize().width), 20));
+ //setBackground(Color.RED);
+
+ return this;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ConditionalStyleTable.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ConditionalStyleTable.java
new file mode 100644
index 0000000..f70ad46
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ConditionalStyleTable.java
@@ -0,0 +1,127 @@
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.util.Collection;
+import java.util.EventObject;
+import javax.swing.AbstractCellEditor;
+import javax.swing.DefaultCellEditor;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JTable;
+import javax.swing.plaf.basic.BasicButtonUI;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.DefaultConditionRenderer;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.MapStyleModel;
+
+class ConditionalStyleTable extends JTable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private MapStyleModel styleModel;
+ private DefaultConditionRenderer conditionRenderer;
+
+ @SuppressWarnings("serial")
+ private class ConditionEditor extends AbstractCellEditor
+ implements TableCellEditor{
+
+ private JButton btn;
+ public ConditionEditor() {
+ super();
+ btn = new JButton(){
+ {
+ setUI(BasicButtonUI.createUI(this));
+ }
+
+ @Override
+ public Color getBackground() {
+ return getSelectionBackground();
+ }
+
+ };
+ }
+
+ private Object cellEditorValue;
+ public Component getTableCellEditorComponent(final JTable table, final Object value, boolean isSelected, int row, int column) {
+ btn.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ final MLogicalStyleController styleController = MLogicalStyleController.getController();
+ cellEditorValue = styleController.editCondition((ASelectableCondition) value);
+ btn.removeActionListener(this);
+ fireEditingStopped();
+ }
+ });
+ return btn;
+ }
+
+ public Object getCellEditorValue() {
+ return cellEditorValue;
+ }
+
+ @Override
+ public boolean isCellEditable(EventObject anEvent) {
+ if (anEvent instanceof MouseEvent) {
+ return ((MouseEvent) anEvent).getClickCount() >= 2;
+ }
+ return true;
+ }
+ }
+
+ public ConditionalStyleTable(MapStyleModel styleModel, TableModel tableModel) {
+ super(tableModel);
+ this.styleModel = styleModel;
+ setCellSelectionEnabled(false);
+ setRowSelectionAllowed(true);
+ final TableColumnModel columnModel = getColumnModel();
+ setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+// setSelectionBackground(DefaultConditionRenderer.SELECTED_BACKGROUND);
+ setRowHeight(20);
+ conditionRenderer = new DefaultConditionRenderer(TextUtils.getText("always"), true);
+ columnModel.getColumn(1).setCellRenderer(conditionRenderer);
+ columnModel.getColumn(1).setCellEditor(new ConditionEditor());
+ final JComboBox styleBox = new JComboBoxWithBorder();
+ styleBox.setEditable(false);
+ columnModel.getColumn(2).setCellEditor(new DefaultCellEditor(styleBox){
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ {
+ setClickCountToStart(2);
+ }
+
+ @Override
+ public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
+ int column) {
+ final Collection<IStyle> styles = ConditionalStyleTable.this.styleModel.getStyles();
+ final DefaultComboBoxModel boxContent = new DefaultComboBoxModel(styles.toArray());
+ styleBox.setModel(boxContent);
+ return super.getTableCellEditorComponent(table, value, isSelected, row, column);
+ }
+
+ });
+ columnModel.getColumn(1).setPreferredWidth(300);
+ columnModel.getColumn(2).setPreferredWidth(180);
+ columnModel.getColumn(2).setCellRenderer(new DefaultStyleRenderer());
+ }
+
+ public MapStyleModel getStyles() {
+ return styleModel;
+ }
+
+}
+
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/CopyMapStylesAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/CopyMapStylesAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/mindmapmode/CopyMapStylesAction.java
rename to freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/CopyMapStylesAction.java
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/CopyStyleExtensionsAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/CopyStyleExtensionsAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/mindmapmode/CopyStyleExtensionsAction.java
rename to freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/CopyStyleExtensionsAction.java
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/DefaultStyleRenderer.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/DefaultStyleRenderer.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/mindmapmode/DefaultStyleRenderer.java
rename to freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/DefaultStyleRenderer.java
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/EditablePatternComboProperty.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/EditablePatternComboProperty.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/mindmapmode/EditablePatternComboProperty.java
rename to freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/EditablePatternComboProperty.java
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/FilterComposerDialog.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/FilterComposerDialog.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/mindmapmode/FilterComposerDialog.java
rename to freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/FilterComposerDialog.java
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/MLogicalStyleController.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/MLogicalStyleController.java
new file mode 100644
index 0000000..4f0b01a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/MLogicalStyleController.java
@@ -0,0 +1,545 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles.mindmapmode;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.event.TableModelListener;
+import javax.swing.table.TableModel;
+
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.menubuilders.generic.ChildActionEntryRemover;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.attribute.mindmapmode.MAttributeController;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.map.IExtensionCopier;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.note.mindmapmode.MNoteController;
+import org.freeplane.features.styles.ConditionalStyleModel;
+import org.freeplane.features.styles.ConditionalStyleModel.Item;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.LogicalStyleKeys;
+import org.freeplane.features.styles.LogicalStyleModel;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.SetBooleanMapPropertyAction;
+import org.freeplane.features.text.DetailTextModel;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.view.swing.features.filepreview.MapBackgroundClearAction;
+import org.freeplane.view.swing.features.filepreview.MapBackgroundImageAction;
+
+/**
+ * @author Dimitry Polivaev
+ * 28.09.2009
+ */
+public class MLogicalStyleController extends LogicalStyleController {
+ private static final String STYLE_ACTIONS = "styleActions";
+
+ private final class RemoveConditionalStyleActor implements IActor {
+ private final int index;
+ private final ConditionalStyleModel conditionalStyleModel;
+ Item item = null;
+
+ private RemoveConditionalStyleActor(ConditionalStyleModel conditionalStyleModel, int index) {
+ this.index = index;
+ this.conditionalStyleModel = conditionalStyleModel;
+ }
+
+ public void undo() {
+ MLogicalStyleController.super.insertConditionalStyle(conditionalStyleModel, index, item.isActive(), item.getCondition(),
+ item.getStyle(), item.isLast());
+ }
+
+ public String getDescription() {
+ return "RemoveConditionalStyle";
+ }
+
+ public void act() {
+ item = MLogicalStyleController.super.removeConditionalStyle(conditionalStyleModel, index);
+ }
+ }
+
+ private final class AddConditionalStyleActor implements IActor {
+ private final ConditionalStyleModel conditionalStyleModel;
+ private final boolean isActive;
+ private final ASelectableCondition condition;
+ private final IStyle style;
+ private boolean isLast;
+
+ public AddConditionalStyleActor(final ConditionalStyleModel conditionalStyleModel, boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast) {
+ this.conditionalStyleModel = conditionalStyleModel;
+ this.isActive = isActive;
+ this.condition = condition;
+ this.style = style;
+ this.isLast = isLast;
+ }
+
+ public void undo() {
+ int index = conditionalStyleModel.getStyleCount() - 1;
+ MLogicalStyleController.super.removeConditionalStyle(conditionalStyleModel, index);
+ }
+
+ public String getDescription() {
+ return "AddConditionalStyle";
+ }
+
+ public void act() {
+ MLogicalStyleController.super.addConditionalStyle(conditionalStyleModel, isActive, condition, style, isLast);
+ }
+ }
+
+ private static class StyleRemover implements INodeChangeListener {
+ public StyleRemover() {
+ }
+
+ public void nodeChanged(final NodeChangeEvent event) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (modeController == null || modeController.isUndoAction()) {
+ return;
+ }
+ if (!event.getProperty().equals(LogicalStyleModel.class)) {
+ return;
+ }
+ final NodeModel node = event.getNode();
+ final MapModel map = node.getMap();
+ final IStyle styleKey = (IStyle) event.getNewValue();
+ final MapStyleModel mapStyles = MapStyleModel.getExtension(map);
+ final NodeModel styleNode = mapStyles.getStyleNode(styleKey);
+ if (styleNode == null) {
+ return;
+ }
+ modeController.undoableRemoveExtensions(LogicalStyleKeys.NODE_STYLE, node, styleNode);
+ }
+ };
+
+ private static class ExtensionCopier implements IExtensionCopier {
+ public void copy(final Object key, final NodeModel from, final NodeModel to) {
+ if (!key.equals(LogicalStyleKeys.LOGICAL_STYLE)) {
+ return;
+ }
+ copy(from, to);
+ }
+
+ public void copy(final NodeModel from, final NodeModel to) {
+ final LogicalStyleModel fromStyle = (LogicalStyleModel) from.getExtension(LogicalStyleModel.class);
+ if (fromStyle == null) {
+ return;
+ }
+ final LogicalStyleModel toStyle = LogicalStyleModel.createExtension(to);
+ toStyle.setStyle(fromStyle.getStyle());
+ }
+
+ public void remove(final Object key, final NodeModel from) {
+ if (!key.equals(LogicalStyleKeys.LOGICAL_STYLE)) {
+ return;
+ }
+ from.removeExtension(LogicalStyleModel.class);
+ }
+
+ public void remove(final Object key, final NodeModel from, final NodeModel which) {
+ if (!key.equals(LogicalStyleKeys.LOGICAL_STYLE)) {
+ return;
+ }
+ final LogicalStyleModel whichStyle = (LogicalStyleModel) which.getExtension(LogicalStyleModel.class);
+ if (whichStyle == null) {
+ return;
+ }
+ final LogicalStyleModel fromStyle = (LogicalStyleModel) from.getExtension(LogicalStyleModel.class);
+ if (fromStyle == null) {
+ return;
+ }
+ from.removeExtension(fromStyle);
+ }
+
+ public void resolveParentExtensions(Object key, NodeModel to) {
+ }
+ }
+
+// private final ModeController modeController;
+ final private List<AssignStyleAction> actions;
+ private FilterComposerDialog filterComposerDialog;
+
+ public MLogicalStyleController(ModeController modeController) {
+ super(modeController);
+// this.modeController = modeController;
+ actions = new LinkedList<AssignStyleAction>();
+ }
+
+ public void initS() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addAction(new ManageNodeConditionalStylesAction());
+ }
+ public void initM() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.getMapController().addNodeChangeListener(new StyleRemover());
+ modeController.registerExtensionCopier(new ExtensionCopier());
+ modeController.addAction(new RedefineStyleAction());
+ modeController.addAction(new NewUserStyleAction());
+ modeController.addAction(new ManageMapConditionalStylesAction());
+ modeController.addAction(new ManageNodeConditionalStylesAction());
+ modeController.addAction(new CopyStyleExtensionsAction());
+ if (modeController.getModeName().equals("MindMap")) {
+ modeController.addAction(new MapBackgroundColorAction());
+ modeController.addAction(new MapBackgroundImageAction());
+ modeController.addAction(new MapBackgroundClearAction());
+ modeController.addAction(new SetBooleanMapPropertyAction(MapStyle.FIT_TO_VIEWPORT));
+ modeController.addAction(new CopyMapStylesAction());
+ }
+ if(! modeController.getController().getViewController().isHeadless()){
+ modeController.addUiBuilder(Phase.ACTIONS, "style_actions", new StyleMenuBuilder(modeController),
+ new ChildActionEntryRemover(modeController));
+ final IUserInputListenerFactory userInputListenerFactory = modeController.getUserInputListenerFactory();
+ Controller.getCurrentController().getMapViewManager().addMapSelectionListener(new IMapSelectionListener() {
+ public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
+ }
+
+ public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
+ userInputListenerFactory.rebuildMenus(STYLE_ACTIONS);
+ }
+ });
+ final MapController mapController = modeController.getMapController();
+ mapController.addMapChangeListener(new IMapChangeListener() {
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void mapChanged(final MapChangeEvent event) {
+ if (event.getProperty().equals(MapStyle.MAP_STYLES)) {
+ userInputListenerFactory.rebuildMenus(STYLE_ACTIONS);
+ }
+ }
+ });
+ mapController.addNodeSelectionListener(new INodeSelectionListener() {
+ public void onSelect(final NodeModel node) {
+ selectActions();
+ }
+
+ public void onDeselect(final NodeModel node) {
+ }
+ });
+ }
+ }
+
+ class StyleMenuBuilder implements EntryVisitor {
+ private final ModeController modeController;
+
+ public StyleMenuBuilder(ModeController modeController) {
+ super();
+ this.modeController = modeController;
+ }
+
+ @Override
+ public void visit(Entry target) {
+ addStyleMenu(target);
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+
+ private void addStyleMenu(final Entry target) {
+ MapModel map = Controller.getCurrentController().getMap();
+ if (map == null) {
+ return;
+ }
+ final MapStyleModel extension = MapStyleModel.getExtension(map);
+ if (extension == null) {
+ return;
+ }
+ actions.clear();
+ final NodeModel rootNode = extension.getStyleMap().getRootNode();
+ final AssignStyleAction resetAction = new AssignStyleAction(null);
+ modeController.addActionIfNotAlreadySet(resetAction);
+ actions.add(resetAction);
+ new EntryAccessor().addChildAction(target, resetAction);
+ addStyleMenu(target, rootNode, extension);
+ }
+
+ private void addStyleMenu(final Entry target, final NodeModel styleMapNode, MapStyleModel extension) {
+ final List<NodeModel> children = styleMapNode.getChildren();
+ final EntryAccessor entryAccessor = new EntryAccessor();
+ for (final NodeModel child : children) {
+ if (child.hasChildren()) {
+ addStyleMenu(target, child, extension);
+ }
+ else {
+ Object userObject = child.getUserObject();
+ if (userObject instanceof IStyle) {
+ final IStyle style = (IStyle) userObject;
+ if (null != extension.getStyleNode(style)) {
+ final AssignStyleAction action = new AssignStyleAction(style);
+ modeController.addActionIfNotAlreadySet(action);
+ actions.add(action);
+ entryAccessor.addChildAction(target, action);
+ }
+ }
+ else
+ LogUtils.severe("unexpected user object on style map: " + userObject);
+ }
+ }
+ }
+ }
+
+ public void setStyle(final NodeModel node, final IStyle style) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IStyle oldStyle = LogicalStyleModel.getStyle(node);
+ if (oldStyle != null && oldStyle.equals(style) || oldStyle == style) {
+ modeController.getMapController().nodeChanged(node, LogicalStyleModel.class, oldStyle, style);
+ return;
+ }
+ final IActor actor = new IActor() {
+ public String getDescription() {
+ return "setStyle";
+ }
+
+ public void act() {
+ changeStyle(modeController, node, oldStyle, style);
+ }
+
+ public void undo() {
+ changeStyle(modeController, node, style, oldStyle);
+ }
+
+ private void changeStyle(final ModeController modeController, final NodeModel node, final IStyle oldStyle,
+ final IStyle style) {
+ if(style != null){
+ final LogicalStyleModel model = LogicalStyleModel.createExtension(node);
+ model.setStyle(style);
+ }
+ else{
+ node.removeExtension(LogicalStyleModel.class);
+ }
+ modeController.getMapController().nodeChanged(node, LogicalStyleModel.class, oldStyle, style);
+ selectActions();
+ }
+ };
+ modeController.execute(actor, node.getMap());
+ }
+
+ public void copyStyleExtensions(final IStyle style, final NodeModel target) {
+ final MTextController textController = MTextController.getController();
+ final MapStyleModel extension = MapStyleModel.getExtension(target.getMap());
+ final NodeModel styleNode = extension.getStyleNode(style);
+ if(styleNode != null){
+ final MAttributeController attributeController = MAttributeController.getController();
+ attributeController.copyAttributesToNode(styleNode, target);
+ final String detailTextText = DetailTextModel.getDetailTextText(styleNode);
+ if(detailTextText != null)
+ textController.setDetails(target, detailTextText);
+ final String noteText = NoteModel.getNoteText(styleNode);
+ if(noteText != null)
+ {
+ MNoteController noteController = (MNoteController) NoteController.getController();
+ noteController.setNoteText(target, noteText);
+ }
+ }
+ }
+
+ void selectActions() {
+ for (final AssignStyleAction action : actions) {
+ action.setSelected();
+ }
+ }
+
+ public void setStyle(final IStyle style) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Collection<NodeModel> selectedNodes = modeController.getMapController().getSelectedNodes();
+ for (final NodeModel selected : selectedNodes) {
+ setStyle(selected, style);
+ }
+ }
+
+
+ public void moveConditionalStyleDown(final MapModel map, final ConditionalStyleModel conditionalStyleModel, final int index) {
+ int maxIndex = conditionalStyleModel.getStyleCount() - 1;
+ if (index < 0 || index >= maxIndex) {
+ return;
+ }
+ IActor actor = new IActor() {
+ public String getDescription() {
+ return "moveConditionalStyleDown";
+ }
+
+ public void act() {
+ MLogicalStyleController.super.moveConditionalStyleDown(conditionalStyleModel, index);
+ }
+
+ public void undo() {
+ MLogicalStyleController.super.moveConditionalStyleUp(conditionalStyleModel, index + 1);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+
+ public void moveConditionalStyleUp(final MapModel map, final ConditionalStyleModel conditionalStyleModel, final int index) {
+ int maxIndex = conditionalStyleModel.getStyleCount() - 1;
+ if (index <= 0 || index > maxIndex) {
+ return;
+ }
+ IActor actor = new IActor() {
+ public String getDescription() {
+ return "moveConditionalStyleUp";
+ }
+
+ public void act() {
+ MLogicalStyleController.super.moveConditionalStyleUp(conditionalStyleModel, index);
+ }
+
+ public void undo() {
+ MLogicalStyleController.super.moveConditionalStyleDown(conditionalStyleModel, index - 1);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+ public static MLogicalStyleController getController() {
+ return (MLogicalStyleController) LogicalStyleController.getController();
+ }
+
+
+ public void addConditionalStyle(final MapModel map, final ConditionalStyleModel conditionalStyleModel, boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast) {
+ AddConditionalStyleActor actor = new AddConditionalStyleActor(conditionalStyleModel, isActive, condition, style, isLast);
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+
+ public Item removeConditionalStyle(final MapModel map, final ConditionalStyleModel conditionalStyleModel, final int index) {
+ RemoveConditionalStyleActor actor = new RemoveConditionalStyleActor(conditionalStyleModel, index);
+ Controller.getCurrentModeController().execute(actor, map);
+ return actor.item;
+ }
+
+ public TableModel getConditionalStyleModelAsTableModel(final MapModel map, final ConditionalStyleModel conditionalStyleModel) {
+ return new TableModel() {
+ private final TableModel tableModel = conditionalStyleModel.asTableModel();
+
+ public void addTableModelListener(TableModelListener l) {
+ tableModel.addTableModelListener(l);
+ }
+
+ public Class<?> getColumnClass(int columnIndex) {
+ return tableModel.getColumnClass(columnIndex);
+ }
+
+ public int getColumnCount() {
+ return tableModel.getColumnCount();
+ }
+
+ public String getColumnName(int columnIndex) {
+ return tableModel.getColumnName(columnIndex);
+ }
+
+ public int getRowCount() {
+ return tableModel.getRowCount();
+ }
+
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ return tableModel.getValueAt(rowIndex, columnIndex);
+ }
+
+ public boolean isCellEditable(int rowIndex, int columnIndex) {
+ return tableModel.isCellEditable(rowIndex, columnIndex);
+ }
+
+ public void removeTableModelListener(TableModelListener l) {
+ tableModel.removeTableModelListener(l);
+ }
+
+ public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) {
+ final Object oldValue = tableModel.getValueAt(rowIndex, columnIndex);
+ if(aValue == oldValue || aValue != null && aValue.equals(oldValue)){
+ return;
+ }
+ IActor actor = new IActor() {
+
+ public String getDescription() {
+ return "set conditional style table cell value";
+ }
+
+ public void act() {
+ tableModel.setValueAt(aValue, rowIndex, columnIndex);
+ }
+
+ public void undo() {
+ tableModel.setValueAt(oldValue, rowIndex, columnIndex);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+ };
+ }
+
+ public FilterComposerDialog getFilterComposerDialog() {
+ if(filterComposerDialog == null){
+ filterComposerDialog = new FilterComposerDialog();
+ Controller.getCurrentController().getMapViewManager().addMapSelectionListener(filterComposerDialog);
+ }
+ return filterComposerDialog;
+ }
+
+ public ASelectableCondition editCondition(ASelectableCondition value) {
+ final FilterComposerDialog filterComposerDialog = getFilterComposerDialog();
+ filterComposerDialog.acceptMultipleConditions(true);
+ if(value != null)
+ filterComposerDialog.addCondition(value);
+ filterComposerDialog.show();
+ List<ASelectableCondition> conditions = filterComposerDialog.getConditions();
+ if(filterComposerDialog.isSuccess())
+ return conditions.isEmpty() ? null : conditions.get(0);
+ return value;
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/MUIFactory.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/MUIFactory.java
new file mode 100644
index 0000000..db646cd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/MUIFactory.java
@@ -0,0 +1,256 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.GraphicsEnvironment;
+import java.util.Collection;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.FixedBasicComboBoxEditor;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapStyleModel;
+
+public class MUIFactory implements INodeSelectionListener, INodeChangeListener, IMapChangeListener,
+ IMapSelectionListener, IExtension {
+// final private Controller controller;
+ private boolean ignoreChangeEvent = false;
+ final private DefaultComboBoxModel fonts, size, styles;
+// private final MModeController modeController;
+
+ public DefaultComboBoxModel getStyles() {
+ return styles;
+ }
+
+ final static public String[] FONT_SIZES = new String[] { "2", "4", "6", "8", "10", "12", "14", "16", "18", "20", "22", "24",
+ "30", "36", "48", "72" };
+ public MUIFactory() {
+ size = new DefaultComboBoxModel(MUIFactory.FONT_SIZES);
+ styles = new DefaultComboBoxModel();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MNodeStyleController styleController = (MNodeStyleController) modeController
+ .getExtension(NodeStyleController.class);
+ final GraphicsEnvironment gEnv = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ final String[] envFonts = gEnv.getAvailableFontFamilyNames();
+ fonts = new DefaultComboBoxModel(envFonts);
+ final ListDataListener fontsListener = new ListDataListener() {
+ public void intervalRemoved(final ListDataEvent e) {
+ }
+
+ public void intervalAdded(final ListDataEvent e) {
+ }
+
+ public void contentsChanged(final ListDataEvent e) {
+ if (e.getIndex0() != -1) {
+ return;
+ }
+ if (ignoreChangeEvent) {
+ return;
+ }
+ ignoreChangeEvent = true;
+ final DefaultComboBoxModel source = (DefaultComboBoxModel) e.getSource();
+ styleController.setFontFamily((String) source.getSelectedItem());
+ ignoreChangeEvent = false;
+ }
+ };
+ fonts.addListDataListener(fontsListener);
+ final ListDataListener sizeListener = new ListDataListener() {
+ public void intervalRemoved(final ListDataEvent e) {
+ }
+
+ public void intervalAdded(final ListDataEvent e) {
+ }
+
+ public void contentsChanged(final ListDataEvent e) {
+ if (e.getIndex0() != -1) {
+ return;
+ }
+ if (ignoreChangeEvent) {
+ return;
+ }
+ try {
+ final DefaultComboBoxModel source = (DefaultComboBoxModel) e.getSource();
+ final int intSize = Integer.parseInt(((String) source.getSelectedItem()));
+ styleController.setFontSize(intSize);
+ }
+ catch (final NumberFormatException nfe) {
+ }
+ }
+ };
+ size.addListDataListener(sizeListener);
+ final ListDataListener styleListener = new ListDataListener() {
+ public void intervalRemoved(final ListDataEvent e) {
+ }
+
+ public void intervalAdded(final ListDataEvent e) {
+ }
+
+ public void contentsChanged(final ListDataEvent e) {
+ if (e.getIndex0() != -1) {
+ return;
+ }
+ if (ignoreChangeEvent) {
+ return;
+ }
+ final DefaultComboBoxModel source = (DefaultComboBoxModel) e.getSource();
+ final IStyle style = (IStyle) source.getSelectedItem();
+ final MLogicalStyleController controller = (MLogicalStyleController) modeController
+ .getExtension(LogicalStyleController.class);
+ controller.setStyle(style);
+ }
+ };
+ styles.addListDataListener(styleListener);
+ }
+
+ private void changeToolbar(final NodeModel node) {
+ final Controller controller = Controller.getCurrentController();
+ final MNodeStyleController styleController = (MNodeStyleController) controller.getModeController()
+ .getExtension(NodeStyleController.class);
+ selectFontSize(Integer.toString(styleController.getFontSize(node)));
+ selectFontName(styleController.getFontFamilyName(node));
+ final LogicalStyleController logicalStyleController = LogicalStyleController.getController();
+ ignoreChangeEvent = true;
+ styles.setSelectedItem(logicalStyleController.getFirstStyle(node));
+ ignoreChangeEvent = false;
+ }
+
+ public void nodeChanged(final NodeChangeEvent event) {
+ IMapSelection selection = Controller.getCurrentController().getSelection();
+ if(selection != null) {
+ if (event.getNode() != selection.getSelected()) {
+ return;
+ }
+ }
+ changeToolbar(event.getNode());
+ }
+
+ public void onDeselect(final NodeModel node) {
+ }
+
+ public void onSelect(final NodeModel node) {
+ changeToolbar(node);
+ }
+
+ private void selectFontName(final String fontName) {
+ if (ignoreChangeEvent) {
+ return;
+ }
+ ignoreChangeEvent = true;
+ fonts.setSelectedItem(fontName);
+ ignoreChangeEvent = false;
+ }
+
+ private void selectFontSize(final String fontSize) {
+ ignoreChangeEvent = true;
+ size.setSelectedItem(fontSize);
+ ignoreChangeEvent = false;
+ }
+
+ public Container createStyleBox() {
+ final JComboBox stylesBox = new JComboBoxWithBorder(styles);
+ stylesBox.setRenderer(new ComboBoxRendererWithTooltip(stylesBox));
+ return stylesBox;
+ }
+
+ public Container createSizeBox() {
+ final JComboBox sizeBox = new JComboBoxWithBorder(size);
+ final Dimension preferredSize = sizeBox.getPreferredSize();
+ sizeBox.setPreferredSize(new Dimension(50, preferredSize.height));
+ sizeBox.setEditor(new FixedBasicComboBoxEditor());
+ sizeBox.setEditable(true);
+ return sizeBox;
+ }
+
+ public Container createFontBox() {
+ final JComboBox fontsBox = new JComboBoxWithBorder(fonts);
+ fontsBox.setMaximumRowCount(9);
+ fontsBox.setRenderer(new ComboBoxRendererWithTooltip(fontsBox));
+ return fontsBox;
+ }
+
+ public void mapChanged(final MapChangeEvent event) {
+ final Object property = event.getProperty();
+ if (property.equals(MapStyle.MAP_STYLES)) {
+ updateMapStyles(event.getMap());
+ final Controller controller = Controller.getCurrentController();
+ changeToolbar(controller.getSelection().getSelected());
+ return;
+ }
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
+ updateMapStyles(newMap);
+ }
+
+ private void updateMapStyles(final MapModel newMap) {
+ ignoreChangeEvent = true;
+ styles.removeAllElements();
+ if (newMap == null) {
+ return;
+ }
+ final Collection<IStyle> styleObjects = MapStyleModel.getExtension(newMap).getStyles();
+ for (final IStyle style : styleObjects) {
+ styles.addElement(style);
+ }
+ ignoreChangeEvent = false;
+ }
+
+ public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/ManageMapConditionalStylesAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ManageMapConditionalStylesAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/mindmapmode/ManageMapConditionalStylesAction.java
rename to freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ManageMapConditionalStylesAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ManageNodeConditionalStylesAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ManageNodeConditionalStylesAction.java
new file mode 100644
index 0000000..4411638
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ManageNodeConditionalStylesAction.java
@@ -0,0 +1,94 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.ConditionalStyleModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Jul 21, 2011
+ */
+public class ManageNodeConditionalStylesAction extends AManageConditionalStylesAction{
+
+ public static final String NAME = "ManageNodeConditionalStylesAction";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ManageNodeConditionalStylesAction() {
+ super(NAME);
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
+ Component pane = createConditionalStylePane(map, conditionalStyleModel);
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.startTransaction();
+ try{
+ final int confirmed = JOptionPane.showConfirmDialog(controller.getMapViewManager().getMapViewComponent(), pane, TextUtils.getText(TextUtils.removeMnemonic("ManageNodeConditionalStylesAction.text")), JOptionPane.OK_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);
+ if(JOptionPane.OK_OPTION == confirmed){
+ modeController.commit();
+ final IMapSelection selection = controller.getSelection();
+ final NodeModel selected = selection.getSelected();
+ modeController.getMapController().nodeChanged(selected,NodeModel.UNKNOWN_PROPERTY,null,null);
+ for (NodeModel otherSelectedNode : selection.getSelection())
+ if (selected != otherSelectedNode) {
+ otherSelectedNode.putExtension(conditionalStyleModel.clone());
+ modeController.getMapController().nodeChanged(otherSelectedNode, NodeModel.UNKNOWN_PROPERTY,
+ null, null);
+ }
+ }
+ else{
+ modeController.rollback();
+
+ }
+ }
+ catch(RuntimeException ex){
+ ex.printStackTrace();
+ modeController.rollback();
+ }
+ }
+
+ @Override
+ public ConditionalStyleModel getConditionalStyleModel() {
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel node = controller.getSelection().getSelected();
+ ConditionalStyleModel conditionalStyleModel = (ConditionalStyleModel) node.getExtension(ConditionalStyleModel.class);
+ if(conditionalStyleModel == null){
+ conditionalStyleModel = new ConditionalStyleModel();
+ node.addExtension(conditionalStyleModel);
+ }
+ return conditionalStyleModel;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/MapBackgroundColorAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/MapBackgroundColorAction.java
new file mode 100644
index 0000000..9b96d10
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/MapBackgroundColorAction.java
@@ -0,0 +1,69 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.Color;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ColorTracker;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapStyleModel;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 12, 2009
+ */
+class MapBackgroundColorAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param mapStyle
+ */
+ MapBackgroundColorAction() {
+ super("MapBackgroundColorAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ MapStyle mapStyle = (MapStyle) controller.getModeController().getExtension(MapStyle.class);
+ final MapStyleModel model = (MapStyleModel) mapStyle.getMapHook(controller.getMap());
+ final Color oldBackgroundColor;
+ final String colorPropertyString = ResourceController.getResourceController().getProperty(
+ MapStyle.RESOURCES_BACKGROUND_COLOR);
+ final Color defaultBgColor = ColorUtils.stringToColor(colorPropertyString);
+ if (model != null) {
+ oldBackgroundColor = model.getBackgroundColor();
+ }
+ else {
+ oldBackgroundColor = defaultBgColor;
+ }
+ final Color actionColor = ColorTracker.showCommonJColorChooserDialog(controller.getSelection()
+ .getSelected(), TextUtils.getText("choose_map_background_color"), oldBackgroundColor, defaultBgColor);
+ mapStyle.setBackgroundColor(model, actionColor);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/NewUserStyleAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/NewUserStyleAction.java
new file mode 100644
index 0000000..308958d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/NewUserStyleAction.java
@@ -0,0 +1,117 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.mindmapmode.MIconController.Keys;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.LogicalStyleKeys;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.StyleFactory;
+import org.freeplane.features.styles.StyleTranslatedObject;
+
+/**
+ * @author Dimitry Polivaev
+ * 02.10.2009
+ */
+public class NewUserStyleAction extends AFreeplaneAction {
+ public NewUserStyleAction() {
+ super("NewUserStyleAction");
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ final String styleName = JOptionPane.showInputDialog(TextUtils.getText("enter_new_style_name"));
+ if (styleName == null) {
+ return;
+ }
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel selectedNode = controller.getSelection().getSelected();
+
+ final MapModel map = controller.getMap();
+ final MapStyleModel styleModel = MapStyleModel.getExtension(map);
+ final MapModel styleMap = styleModel.getStyleMap();
+ final IStyle newStyle = StyleFactory.create(styleName);
+ if (null != styleModel.getStyleNode(newStyle)) {
+ UITools.errorMessage(TextUtils.getText("style_already_exists"));
+ return;
+ }
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ final NodeModel newNode = new NodeModel(styleMap);
+ newNode.setUserObject(newStyle);
+ final LogicalStyleController styleController = LogicalStyleController.getController();
+ final ArrayList<IStyle> styles = new ArrayList<IStyle>(styleController.getStyles(selectedNode));
+ for(int i = styles.size() - 1; i >= 0; i--){
+ IStyle style = styles.get(i);
+ if(MapStyleModel.DEFAULT_STYLE.equals(style)){
+ continue;
+ }
+ final NodeModel styleNode = styleModel.getStyleNode(style);
+ if(styleNode == null){
+ continue;
+ }
+ Controller.getCurrentModeController().copyExtensions(LogicalStyleKeys.NODE_STYLE, styleNode, newNode);
+ }
+ Controller.getCurrentModeController().copyExtensions(LogicalStyleKeys.NODE_STYLE, selectedNode, newNode);
+ Controller.getCurrentModeController().copyExtensions(Keys.ICONS, selectedNode, newNode);
+ NodeModel userStyleParentNode = styleModel.getStyleNodeGroup(styleMap, MapStyleModel.STYLES_USER_DEFINED);
+ if(userStyleParentNode == null){
+ userStyleParentNode = new NodeModel(styleMap);
+ userStyleParentNode.setUserObject(new StyleTranslatedObject(MapStyleModel.STYLES_USER_DEFINED));
+ mapController.insertNode(userStyleParentNode, styleMap.getRootNode(), false, false, true);
+
+ }
+ mapController.insertNode(newNode, userStyleParentNode, false, false, true);
+ mapController.select(newNode);
+ final IActor actor = new IActor() {
+ public void undo() {
+ styleModel.removeStyleNode(newNode);
+ styleController.refreshMap(map);
+ }
+
+ public String getDescription() {
+ return "NewStyle";
+ }
+
+ public void act() {
+ styleModel.addStyleNode(newNode);
+ styleController.refreshMap(map);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, styleMap);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/PatternProperty.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/PatternProperty.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/mindmapmode/PatternProperty.java
rename to freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/PatternProperty.java
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/RedefineStyleAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/RedefineStyleAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/mindmapmode/RedefineStyleAction.java
rename to freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/RedefineStyleAction.java
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/ShowFormatPanelAction.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ShowFormatPanelAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/styles/mindmapmode/ShowFormatPanelAction.java
rename to freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/ShowFormatPanelAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/StyleEditorPanel.java b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/StyleEditorPanel.java
new file mode 100644
index 0000000..6501c0a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/styles/mindmapmode/StyleEditorPanel.java
@@ -0,0 +1,1208 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.styles.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.HeadlessException;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Vector;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import javax.swing.plaf.basic.BasicButtonUI;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.BooleanProperty;
+import org.freeplane.core.resources.components.ColorProperty;
+import org.freeplane.core.resources.components.ComboProperty;
+import org.freeplane.core.resources.components.FontProperty;
+import org.freeplane.core.resources.components.IPropertyControl;
+import org.freeplane.core.resources.components.NextColumnProperty;
+import org.freeplane.core.resources.components.NextLineProperty;
+import org.freeplane.core.resources.components.NumberProperty;
+import org.freeplane.core.resources.components.QuantityProperty;
+import org.freeplane.core.resources.components.SeparatorProperty;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.features.cloud.mindmapmode.MCloudController;
+import org.freeplane.features.edge.AutomaticEdgeColor;
+import org.freeplane.features.edge.AutomaticEdgeColorHook;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.edge.EdgeModel;
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.edge.mindmapmode.MEdgeController;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.AMapChangeListenerAdapter;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
+import org.freeplane.features.nodestyle.NodeSizeModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.nodestyle.NodeStyleModel.Shape;
+import org.freeplane.features.nodestyle.NodeStyleModel.TextAlign;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.features.styles.AutomaticLayout;
+import org.freeplane.features.styles.AutomaticLayoutController;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.LogicalStyleModel;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.ui.IMapViewManager;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.factories.Borders;
+import com.jgoodies.forms.layout.FormLayout;
+
+public class StyleEditorPanel extends JPanel {
+ private static final int FONT_SIZE = Math.round(UITools.FONT_SCALE_FACTOR * 8);
+ private static final TranslatedObject AUTOMATIC_LAYOUT_DISABLED = new TranslatedObject("automatic_layout_disabled");
+
+ private class BgColorChangeListener extends ChangeListener {
+ public BgColorChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(
+ NodeStyleController.class);
+ styleController.setBackgroundColor(node, enabled ? mNodeBackgroundColor.getColorValue() : null);
+ }
+ }
+
+ private class NodeShapeChangeListener extends ChangeListener {
+ public NodeShapeChangeListener(final BooleanProperty mSet, final IPropertyControl... mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(
+ NodeStyleController.class);
+ if(enabled){
+ styleController.setShapeConfiguration(node, ShapeConfigurationModel.NULL_SHAPE
+ .withShape(NodeStyleModel.Shape.valueOf(mNodeShape.getValue()))
+ .withHorizontalMargin(mShapeHorizontalMargin.getQuantifiedValue())
+ .withVerticalMargin(mShapeVerticalMargin.getQuantifiedValue())
+ .withUniform(mUniformShape.getBooleanValue())
+ );
+ }
+ else
+ styleController.setShapeConfiguration(node, ShapeConfigurationModel.NULL_SHAPE);
+ final Shape shape = styleController.getShape(node);
+ enableShapeConfigurationProperties(enabled, shape);
+ }
+ }
+
+ private class ColorChangeListener extends ChangeListener {
+ public ColorChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(
+ NodeStyleController.class);
+ styleController.setColor(node, enabled ? mNodeColor.getColorValue() : null);
+ }
+ }
+
+ private class FontBoldChangeListener extends ChangeListener {
+ public FontBoldChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(
+ NodeStyleController.class);
+ styleController.setBold(node, enabled ? mNodeFontBold.getBooleanValue() : null);
+ }
+ }
+
+ private class FontItalicChangeListener extends ChangeListener {
+ public FontItalicChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(
+ NodeStyleController.class);
+ styleController.setItalic(node, enabled ? mNodeFontItalic.getBooleanValue() : null);
+ }
+ }
+
+ private class FontHyperlinkChangeListener extends ChangeListener {
+ public FontHyperlinkChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MLinkController styleController = (MLinkController) Controller
+ .getCurrentModeController().getExtension(
+ LinkController.class);
+ styleController.setFormatNodeAsHyperlink(node, enabled ? mNodeFontHyperlink.getBooleanValue() : null);
+ }
+ }
+
+ private class FontSizeChangeListener extends ChangeListener {
+ public FontSizeChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(
+ NodeStyleController.class);
+ try {
+ styleController.setFontSize(node, enabled ? Integer.valueOf(mNodeFontSize.getValue()) : null);
+ }
+ catch (NumberFormatException e) {
+ }
+ }
+ }
+
+ private class FontNameChangeListener extends ChangeListener {
+ public FontNameChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(
+ NodeStyleController.class);
+ styleController.setFontFamily(node, enabled ? mNodeFontName.getValue() : null);
+ }
+ }
+
+ private class EdgeColorChangeListener extends ChangeListener {
+ public EdgeColorChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MEdgeController edgeController = (MEdgeController) MEdgeController.getController();
+ edgeController.setColor(node, enabled ? mEdgeColor.getColorValue() : null);
+ }
+ }
+
+ private class EdgeStyleChangeListener extends ChangeListener {
+ public EdgeStyleChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node,
+ final PropertyChangeEvent evt) {
+ final MEdgeController styleController = (MEdgeController) Controller
+ .getCurrentModeController().getExtension(
+ EdgeController.class);
+ styleController.setStyle(node, enabled ? EdgeStyle.getStyle(mEdgeStyle.getValue()) : null);
+ }
+ }
+ private class TextAlignmentChangeListener extends ChangeListener {
+ public TextAlignmentChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node,
+ final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(NodeStyleController.class);
+ styleController.setTextAlign(node, enabled ? TextAlign.valueOf(mNodeTextAlignment.getValue()) : null);
+ }
+ }
+
+
+
+ private class EdgeWidthChangeListener extends ChangeListener {
+ public EdgeWidthChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MEdgeController styleController = (MEdgeController) Controller
+ .getCurrentModeController().getExtension(
+ EdgeController.class);
+ styleController.setWidth(node, enabled ? Integer.parseInt(mEdgeWidth.getValue()): EdgeModel.DEFAULT_WIDTH);
+ }
+ }
+
+ private class MaxNodeWidthChangeListener extends ChangeListener {
+ public MaxNodeWidthChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(NodeStyleController.class);
+ styleController.setMaxNodeWidth(node, enabled ? mMaxNodeWidth.getQuantifiedValue(): null);
+ }
+ }
+
+ private class MinNodeWidthChangeListener extends ChangeListener {
+ public MinNodeWidthChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller
+ .getCurrentModeController().getExtension(NodeStyleController.class);
+ styleController.setMinNodeWidth(node, enabled ? mMinNodeWidth.getQuantifiedValue(): null);
+ }
+ }
+ private class ChildDistanceChangeListener extends ChangeListener {
+ public ChildDistanceChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MLocationController locationController = (MLocationController) Controller.getCurrentModeController().getExtension(LocationController.class);
+ locationController.setMinimalDistanceBetweenChildren(node, enabled ? mChildDistance.getQuantifiedValue(): LocationModel.DEFAULT_VGAP);
+ }
+ }
+
+ private class CloudColorChangeListener extends ChangeListener {
+ public CloudColorChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node,
+ final PropertyChangeEvent evt) {
+ final MCloudController styleController = (MCloudController) Controller
+ .getCurrentModeController().getExtension(
+ CloudController.class);
+ if (enabled) {
+ styleController.setColor(node, mCloudColor.getColorValue());
+ }
+ else {
+ styleController.setCloud(node, false);
+ }
+ }
+ }
+
+ private class CloudShapeChangeListener extends ChangeListener {
+ public CloudShapeChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node,
+ final PropertyChangeEvent evt) {
+ final MCloudController styleController = (MCloudController) Controller
+ .getCurrentModeController().getExtension(
+ CloudController.class);
+ if (enabled) {
+ styleController.setShape(node, CloudModel.Shape.valueOf(mCloudShape.getValue()));
+ }
+ else {
+ styleController.setCloud(node, false);
+ }
+ }
+ }
+
+ private class NodeNumberingChangeListener extends ChangeListener {
+ public NodeNumberingChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller.getCurrentModeController()
+ .getExtension(NodeStyleController.class);
+ styleController.setNodeNumbering(node, enabled ? mNodeNumbering.getBooleanValue() : null);
+ }
+ }
+
+ private class NodeFormatChangeListener extends ChangeListener {
+ public NodeFormatChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
+ super(mSet, mProperty);
+ }
+
+ @Override
+ void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller.getCurrentModeController()
+ .getExtension(NodeStyleController.class);
+ styleController.setNodeFormat(node, enabled ? mNodeFormat.getSelectedPattern() : null);
+ }
+ }
+
+ private class StyleChangeListener implements PropertyChangeListener{
+
+ public StyleChangeListener() {
+ }
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ if(internalChange){
+ return;
+ }
+ BooleanProperty isSet = (BooleanProperty) evt.getSource();
+ final MLogicalStyleController styleController = (MLogicalStyleController) LogicalStyleController.getController();
+ if(isSet.getBooleanValue()){
+ styleController.setStyle((IStyle) uiFactory.getStyles().getSelectedItem());
+ }
+ else{
+ styleController.setStyle(null);
+ }
+ }
+
+ }
+ private abstract class ChangeListener implements PropertyChangeListener {
+ final private Collection<IPropertyControl> properties;
+ final private BooleanProperty mSet;
+
+ public ChangeListener(final BooleanProperty mSet, final IPropertyControl... properties) {
+ super();
+ this.mSet = mSet;
+ this.properties = Arrays.asList(properties);
+ }
+
+ abstract void applyValue(final boolean enabled, NodeModel node, PropertyChangeEvent evt);
+
+ public void propertyChange(final PropertyChangeEvent evt) {
+ if (internalChange) {
+ return;
+ }
+ final boolean enabled;
+ if (evt.getSource().equals(mSet)) {
+ enabled = mSet.getBooleanValue();
+ }
+ else {
+ assert properties.contains(evt.getSource());
+ enabled = true;
+ }
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ final Collection<NodeModel> nodes = selection.getSelection();
+ if (enabled )
+ internalChange = true;
+ for (final NodeModel node : nodes) {
+ applyValue(enabled, node, evt);
+ }
+ if (enabled && ! mSet.getBooleanValue())
+ mSet.setValue(true);
+ internalChange = false;
+ setStyle(selection.getSelected());
+ }
+ }
+
+ private static final String CLOUD_COLOR = "cloudcolor";
+ private static final String EDGE_COLOR = "edgecolor";
+ private static final String EDGE_STYLE = "edgestyle";
+ private static final String CLOUD_SHAPE = "cloudshape";
+ private static final String[] EDGE_STYLES = enumStrings(EdgeStyle.class, EdgeStyle.values().length - 1);
+ private static final String[] CLOUD_SHAPES = StyleEditorPanel.enumStrings(CloudModel.Shape.class);
+ private static final String EDGE_WIDTH = "edgewidth";
+// private static final String ICON = "icon";
+ private static final String NODE_BACKGROUND_COLOR = "nodebackgroundcolor";
+ private static final String NODE_COLOR = "nodecolor";
+ private static final String NODE_FONT_BOLD = "nodefontbold";
+ private static final String NODE_FONT_ITALIC = "nodefontitalic";
+ private static final String NODE_FONT_HYPERLINK = "nodefonthyperlink";
+ private static final String NODE_FONT_NAME = "nodefontname";
+ private static final String NODE_FONT_SIZE = "nodefontsize";
+ private static final String NODE_NUMBERING = "nodenumbering";
+ private static final String NODE_SHAPE = "nodeshape";
+ private static final String NODE_TEXT_COLOR = "standardnodetextcolor";
+ private static final String NODE_FORMAT = "nodeformat";
+ private static final String TEXT_ALIGNMENT = "textalignment";
+ private static final String[] TEXT_ALIGNMENTS = StyleEditorPanel.enumStrings(TextAlign.class);
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final String SET_RESOURCE = "set_property_text";
+ private static final String MAX_TEXT_WIDTH = "max_node_width";
+ private static final String MIN_NODE_WIDTH = "min_node_width";
+ private static final String VERTICAL_CHILD_GAP = "vertical_child_gap";
+ private static final String SHAPE_HORIZONTAL_MARGIN = "shape_horizontal_margin";
+ private static final String SHAPE_VERTICAL_MARGIN = "shape_vertical_margin";
+ private static final String UNIFORM_SHAPE = "uniform_shape";
+
+
+ private static <U extends Enum<U>> String[] enumStrings(Class<U> enumerationClass, int length) {
+ final U[] enumConstants = enumerationClass.getEnumConstants();
+ final String[] strings = new String[length];
+ for (int i = 0; i < length; i++) {
+ strings[i] = enumConstants[i].toString();
+ }
+ return strings;
+ }
+
+ private static <U extends Enum<U>> String[] enumStrings(Class<U> enumerationClass) {
+ return enumStrings(enumerationClass, enumerationClass.getEnumConstants().length);
+ }
+
+ private boolean internalChange;
+ private ColorProperty mCloudColor;
+ private ComboProperty mCloudShape;
+ private List<IPropertyControl> mControls;
+ private ColorProperty mEdgeColor;
+ private ComboProperty mEdgeStyle;
+ private NumberProperty mEdgeWidth;
+// private final ModeController mMindMapController;
+ private ColorProperty mNodeBackgroundColor;
+ private ColorProperty mNodeColor;
+ private BooleanProperty mNodeFontBold;
+ private BooleanProperty mNodeFontItalic;
+ private BooleanProperty mNodeFontHyperlink;
+ private FontProperty mNodeFontName;
+ private ComboProperty mNodeFontSize;
+ private BooleanProperty mNodeNumbering;
+ private ComboProperty mNodeShape;
+ private QuantityProperty<LengthUnits> mShapeHorizontalMargin;
+ private QuantityProperty<LengthUnits> mShapeVerticalMargin;
+ private BooleanProperty mUniformShape;
+ private EditablePatternComboProperty mNodeFormat;
+ private QuantityProperty<LengthUnits> mMaxNodeWidth;
+ private QuantityProperty<LengthUnits> mMinNodeWidth;
+ private QuantityProperty<LengthUnits> mChildDistance;
+ private ComboProperty mNodeTextAlignment;
+
+
+ private BooleanProperty mSetCloud;
+ private BooleanProperty mSetEdgeColor;
+ private BooleanProperty mSetEdgeStyle;
+ private BooleanProperty mSetEdgeWidth;
+ private BooleanProperty mSetNodeBackgroundColor;
+ private BooleanProperty mSetNodeColor;
+ private BooleanProperty mSetNodeFontBold;
+ private BooleanProperty mSetNodeFontItalic;
+ private BooleanProperty mSetNodeFontHyperlink;
+ private BooleanProperty mSetNodeFontName;
+ private BooleanProperty mSetNodeFontSize;
+ private BooleanProperty mSetNodeNumbering;
+ private BooleanProperty mSetNodeShape;
+ private BooleanProperty mSetNodeFormat;
+ private BooleanProperty mSetStyle;
+ private BooleanProperty mSetMaxNodeWidth;
+ private BooleanProperty mSetMinNodeWidth;
+ private BooleanProperty mSetChildDistance;
+ private BooleanProperty mSetNodeTextAlignment;
+
+
+ private final boolean addStyleBox;
+ private final MUIFactory uiFactory;
+ private final ModeController modeController;
+ private JButton mNodeStyleButton;
+ private JButton mMapStyleButton;
+
+ /**
+ * @throws HeadlessException
+ */
+ public StyleEditorPanel(final ModeController modeController, final MUIFactory uiFactory,
+ final boolean addStyleBox) throws HeadlessException {
+ super();
+ this.modeController = modeController;
+ this.addStyleBox = addStyleBox;
+ this.uiFactory = uiFactory;
+ addHierarchyListener(new HierarchyListener() {
+
+ public void hierarchyChanged(HierarchyEvent e) {
+ if(isDisplayable()){
+ removeHierarchyListener(this);
+ init();
+ }
+ }
+ });
+ }
+
+ private void addBgColorControl(final List<IPropertyControl> controls) {
+ mSetNodeBackgroundColor = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeBackgroundColor);
+ mNodeBackgroundColor = new ColorProperty(StyleEditorPanel.NODE_BACKGROUND_COLOR, ResourceController
+ .getResourceController().getDefaultProperty(NODE_BACKGROUND_COLOR));
+ controls.add(mNodeBackgroundColor);
+ final BgColorChangeListener listener = new BgColorChangeListener(mSetNodeBackgroundColor, mNodeBackgroundColor);
+ mSetNodeBackgroundColor.addPropertyChangeListener(listener);
+ mNodeBackgroundColor.addPropertyChangeListener(listener);
+ }
+
+ private void addFormatControl(final List<IPropertyControl> controls) {
+ mSetNodeFormat = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeFormat);
+ mNodeFormat = new EditablePatternComboProperty(StyleEditorPanel.NODE_FORMAT,
+ PatternFormat.getIdentityPatternFormat(), FormatController.getController().getAllFormats());
+ controls.add(mNodeFormat);
+ final NodeFormatChangeListener listener = new NodeFormatChangeListener(mSetNodeFormat, mNodeFormat);
+ mSetNodeFormat.addPropertyChangeListener(listener);
+ mNodeFormat.addPropertyChangeListener(listener);
+ }
+
+ private void addNodeNumberingControl(final List<IPropertyControl> controls) {
+ mSetNodeNumbering = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeNumbering);
+ mNodeNumbering = new BooleanProperty(StyleEditorPanel.NODE_NUMBERING);
+ controls.add(mNodeNumbering);
+ final NodeNumberingChangeListener listener = new NodeNumberingChangeListener(mSetNodeNumbering, mNodeNumbering);
+ mSetNodeNumbering.addPropertyChangeListener(listener);
+ mNodeNumbering.addPropertyChangeListener(listener);
+ }
+
+ private void addCloudColorControl(final List<IPropertyControl> controls) {
+ mSetCloud = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetCloud);
+ mCloudColor = new ColorProperty(StyleEditorPanel.CLOUD_COLOR, ResourceController.getResourceController()
+ .getDefaultProperty(CloudController.RESOURCES_CLOUD_COLOR));
+ controls.add(mCloudColor);
+ final CloudColorChangeListener listener = new CloudColorChangeListener(mSetCloud, mCloudColor);
+ mSetCloud.addPropertyChangeListener(listener);
+ mCloudColor.addPropertyChangeListener(listener);
+ }
+
+ private void addColorControl(final List<IPropertyControl> controls) {
+ mSetNodeColor = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeColor);
+ mNodeColor = new ColorProperty(StyleEditorPanel.NODE_COLOR, ResourceController.getResourceController()
+ .getDefaultProperty(NODE_TEXT_COLOR));
+ controls.add(mNodeColor);
+ final ColorChangeListener listener = new ColorChangeListener(mSetNodeColor, mNodeColor);
+ mSetNodeColor.addPropertyChangeListener(listener);
+ mNodeColor.addPropertyChangeListener(listener);
+ }
+
+ private void addEdgeColorControl(final List<IPropertyControl> controls) {
+ mSetEdgeColor = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetEdgeColor);
+ mEdgeColor = new ColorProperty(StyleEditorPanel.EDGE_COLOR, ColorUtils.colorToString(EdgeController.STANDARD_EDGE_COLOR));
+ controls.add(mEdgeColor);
+ final EdgeColorChangeListener listener = new EdgeColorChangeListener(mSetEdgeColor, mEdgeColor);
+ mSetEdgeColor.addPropertyChangeListener(listener);
+ mEdgeColor.addPropertyChangeListener(listener);
+ }
+
+ private void addEdgeStyleControl(final List<IPropertyControl> controls) {
+ mSetEdgeStyle = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetEdgeStyle);
+ mEdgeStyle = new ComboProperty(StyleEditorPanel.EDGE_STYLE, EDGE_STYLES);
+ controls.add(mEdgeStyle);
+ final EdgeStyleChangeListener listener = new EdgeStyleChangeListener(mSetEdgeStyle, mEdgeStyle);
+ mSetEdgeStyle.addPropertyChangeListener(listener);
+ mEdgeStyle.addPropertyChangeListener(listener);
+ }
+
+ private void addCloudShapeControl(final List<IPropertyControl> controls) {
+ mCloudShape = new ComboProperty(StyleEditorPanel.CLOUD_SHAPE, CLOUD_SHAPES);
+ controls.add(mCloudShape);
+ final CloudShapeChangeListener listener = new CloudShapeChangeListener(mSetCloud, mCloudShape);
+ mSetCloud.addPropertyChangeListener(listener);
+ mCloudShape.addPropertyChangeListener(listener);
+ }
+
+ private void addEdgeWidthControl(final List<IPropertyControl> controls) {
+ mSetEdgeWidth = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetEdgeWidth);
+ mEdgeWidth = new NumberProperty(StyleEditorPanel.EDGE_WIDTH, 0, 100, 1);
+ controls.add(mEdgeWidth);
+ final EdgeWidthChangeListener listener = new EdgeWidthChangeListener(mSetEdgeWidth, mEdgeWidth);
+ mSetEdgeWidth.addPropertyChangeListener(listener);
+ mEdgeWidth.addPropertyChangeListener(listener);
+ }
+
+ private void addMaxNodeWidthControl(final List<IPropertyControl> controls) {
+ mSetMaxNodeWidth = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetMaxNodeWidth);
+ mMaxNodeWidth = new QuantityProperty<LengthUnits>(StyleEditorPanel.MAX_TEXT_WIDTH, 0, 100000, 0.1, LengthUnits.px);
+ controls.add(mMaxNodeWidth);
+ final MaxNodeWidthChangeListener listener = new MaxNodeWidthChangeListener(mSetMaxNodeWidth, mMaxNodeWidth);
+ mSetMaxNodeWidth.addPropertyChangeListener(listener);
+ mMaxNodeWidth.addPropertyChangeListener(listener);
+ }
+
+ private void addMinNodeWidthControl(final List<IPropertyControl> controls) {
+ mSetMinNodeWidth = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetMinNodeWidth);
+ mMinNodeWidth = new QuantityProperty<LengthUnits>(StyleEditorPanel.MIN_NODE_WIDTH, 0, 100000, 0.1, LengthUnits.px);
+ controls.add(mMinNodeWidth);
+ final MinNodeWidthChangeListener listener = new MinNodeWidthChangeListener(mSetMinNodeWidth, mMinNodeWidth);
+ mSetMinNodeWidth.addPropertyChangeListener(listener);
+ mMinNodeWidth.addPropertyChangeListener(listener);
+ }
+
+ private void addChildDistanceControl(final List<IPropertyControl> controls) {
+ mSetChildDistance = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetChildDistance);
+ mChildDistance = new QuantityProperty<LengthUnits>(StyleEditorPanel.VERTICAL_CHILD_GAP, 0, 1000, 0.1, LengthUnits.px);
+ controls.add(mChildDistance);
+ final ChildDistanceChangeListener listener = new ChildDistanceChangeListener(mSetChildDistance, mChildDistance);
+ mSetChildDistance.addPropertyChangeListener(listener);
+ mChildDistance.addPropertyChangeListener(listener);
+ }
+
+ private void addFontBoldControl(final List<IPropertyControl> controls) {
+ mSetNodeFontBold = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeFontBold);
+ mNodeFontBold = new BooleanProperty(StyleEditorPanel.NODE_FONT_BOLD);
+ controls.add(mNodeFontBold);
+ final FontBoldChangeListener listener = new FontBoldChangeListener(mSetNodeFontBold, mNodeFontBold);
+ mSetNodeFontBold.addPropertyChangeListener(listener);
+ mNodeFontBold.addPropertyChangeListener(listener);
+ }
+
+ private void addFontItalicControl(final List<IPropertyControl> controls) {
+ mSetNodeFontItalic = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeFontItalic);
+ mNodeFontItalic = new BooleanProperty(StyleEditorPanel.NODE_FONT_ITALIC);
+ controls.add(mNodeFontItalic);
+ final FontItalicChangeListener listener = new FontItalicChangeListener(mSetNodeFontItalic, mNodeFontItalic);
+ mSetNodeFontItalic.addPropertyChangeListener(listener);
+ mNodeFontItalic.addPropertyChangeListener(listener);
+ }
+
+ private void addFontHyperlinkControl(final List<IPropertyControl> controls) {
+ mSetNodeFontHyperlink = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeFontHyperlink);
+ mNodeFontHyperlink = new BooleanProperty(StyleEditorPanel.NODE_FONT_HYPERLINK);
+ controls.add(mNodeFontHyperlink);
+ final FontHyperlinkChangeListener listener = new FontHyperlinkChangeListener(mSetNodeFontHyperlink, mNodeFontHyperlink);
+ mSetNodeFontHyperlink.addPropertyChangeListener(listener);
+ mNodeFontHyperlink.addPropertyChangeListener(listener);
+ }
+
+ private void addFontNameControl(final List<IPropertyControl> controls) {
+ mSetNodeFontName = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeFontName);
+ mNodeFontName = new FontProperty(StyleEditorPanel.NODE_FONT_NAME);
+ controls.add(mNodeFontName);
+ final FontNameChangeListener listener = new FontNameChangeListener(mSetNodeFontName, mNodeFontName);
+ mSetNodeFontName.addPropertyChangeListener(listener);
+ mNodeFontName.addPropertyChangeListener(listener);
+ }
+
+ private void addFontSizeControl(final List<IPropertyControl> controls) {
+ mSetNodeFontSize = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeFontSize);
+ final List<String> sizesVector = new ArrayList<String>(Arrays.asList(MUIFactory.FONT_SIZES));
+ mNodeFontSize = new ComboProperty(StyleEditorPanel.NODE_FONT_SIZE, sizesVector, sizesVector);
+ mNodeFontSize.setEditable(true);
+ controls.add(mNodeFontSize);
+ final FontSizeChangeListener listener = new FontSizeChangeListener(mSetNodeFontSize, mNodeFontSize);
+ mSetNodeFontSize.addPropertyChangeListener(listener);
+ mNodeFontSize.addPropertyChangeListener(listener);
+ }
+
+ private void addNodeShapeControls(final List<IPropertyControl> controls) {
+ mSetNodeShape = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeShape);
+ mNodeShape = new ComboProperty(StyleEditorPanel.NODE_SHAPE, enumStrings(NodeStyleModel.Shape.class));
+ controls.add(mNodeShape);
+ controls.add(new NextColumnProperty(2));
+ mShapeHorizontalMargin = new QuantityProperty<LengthUnits>(StyleEditorPanel.SHAPE_HORIZONTAL_MARGIN, 0, 1000, 0.1, LengthUnits.pt);
+ controls.add(mShapeHorizontalMargin);
+ controls.add(new NextColumnProperty(2));
+ mShapeVerticalMargin = new QuantityProperty<LengthUnits>(StyleEditorPanel.SHAPE_VERTICAL_MARGIN, 0, 1000, 0.1, LengthUnits.pt);
+ controls.add(mShapeVerticalMargin);
+ controls.add(new NextColumnProperty(2));
+ mUniformShape = new BooleanProperty(StyleEditorPanel.UNIFORM_SHAPE);
+ controls.add(mUniformShape);
+ final NodeShapeChangeListener listener = new NodeShapeChangeListener(mSetNodeShape, mNodeShape, mShapeHorizontalMargin, mShapeVerticalMargin, mUniformShape);
+ mSetNodeShape.addPropertyChangeListener(listener);
+ mNodeShape.addPropertyChangeListener(listener);
+ mShapeHorizontalMargin.addPropertyChangeListener(listener);
+ mShapeVerticalMargin.addPropertyChangeListener(listener);
+ mUniformShape.addPropertyChangeListener(listener);
+ }
+
+ private void addNodeTextAlignmentControl(final List<IPropertyControl> controls) {
+ mSetNodeTextAlignment = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ controls.add(mSetNodeTextAlignment);
+ final Vector<String> possibleTranslations = new Vector<String>(TEXT_ALIGNMENTS.length);
+ for (int i = 0; i < TEXT_ALIGNMENTS.length; i++) {
+ possibleTranslations.add(TextUtils.getText("TextAlignAction." + TEXT_ALIGNMENTS[i] + ".text"));
+ }
+ Vector<String> translations = possibleTranslations;
+ mNodeTextAlignment = new ComboProperty(StyleEditorPanel.TEXT_ALIGNMENT, Arrays.asList(TEXT_ALIGNMENTS), translations);
+ controls.add(mNodeTextAlignment);
+ final TextAlignmentChangeListener listener = new TextAlignmentChangeListener(mSetNodeTextAlignment, mNodeTextAlignment);
+ mSetNodeTextAlignment.addPropertyChangeListener(listener);
+ mNodeTextAlignment.addPropertyChangeListener(listener);
+ }
+
+ private List<IPropertyControl> getControls() {
+ final List<IPropertyControl> controls = new ArrayList<IPropertyControl>();
+ controls.add(new SeparatorProperty("OptionPanel.separator.NodeColors"));
+ addColorControl(controls);
+ addBgColorControl(controls);
+ controls.add(new SeparatorProperty("OptionPanel.separator.NodeText"));
+ addFormatControl(controls);
+ addNodeNumberingControl(controls);
+ controls.add(new SeparatorProperty("OptionPanel.separator.NodeShape"));
+ addNodeShapeControls(controls);
+ addMinNodeWidthControl(controls);
+ addMaxNodeWidthControl(controls);
+ addChildDistanceControl(controls);
+ controls.add(new NextLineProperty());
+ controls.add(new SeparatorProperty("OptionPanel.separator.NodeFont"));
+ addFontNameControl(controls);
+ addFontSizeControl(controls);
+ addFontBoldControl(controls);
+ addFontItalicControl(controls);
+ addNodeTextAlignmentControl(controls);
+ addFontHyperlinkControl(controls);
+ controls.add(new NextLineProperty());
+ controls.add(new SeparatorProperty("OptionPanel.separator.EdgeControls"));
+ addEdgeWidthControl(controls);
+ addEdgeStyleControl(controls);
+ addEdgeColorControl(controls);
+ controls.add(new NextLineProperty());
+ controls.add(new SeparatorProperty("OptionPanel.separator.CloudControls"));
+ addCloudColorControl(controls);
+ controls.add(new NextLineProperty());
+ controls.add(new NextColumnProperty(2));
+ addCloudShapeControl(controls);
+ return controls;
+ }
+
+
+ /**
+ * Creates all controls and adds them to the frame.
+ * @param modeController
+ */
+ private void init() {
+ if(mControls != null)
+ return;
+ final String form = "right:max(20dlu;p), 2dlu, p, 1dlu,right:max(20dlu;p), 4dlu, 80dlu, 7dlu";
+ final FormLayout rightLayout = new FormLayout(form, "");
+ final DefaultFormBuilder rightBuilder = new DefaultFormBuilder(rightLayout);
+ rightBuilder.border(Borders.DLU2);
+ rightBuilder.appendSeparator(TextUtils.getText("OptionPanel.separator.NodeStyle"));
+ if (addStyleBox) {
+ addAutomaticLayout(rightBuilder);
+ addStyleBox(rightBuilder);
+ }
+ mNodeStyleButton = addStyleButton(rightBuilder, "actual_node_styles", modeController.getAction(ManageNodeConditionalStylesAction.NAME));
+ if (addStyleBox) {
+ mMapStyleButton = addStyleButton(rightBuilder, "actual_map_styles", modeController.getAction(ManageMapConditionalStylesAction.NAME));
+ }
+ mControls = getControls();
+ for (final IPropertyControl control : mControls) {
+ control.layout(rightBuilder);
+ }
+ add(rightBuilder.getPanel(), BorderLayout.CENTER);
+ addListeners();
+ setFont(this, FONT_SIZE);
+ }
+
+ private JButton addStyleButton(DefaultFormBuilder rightBuilder, String label, AFreeplaneAction action) {
+ final JButton button = new JButton(){
+ private static final long serialVersionUID = 1L;
+ {
+ setUI(BasicButtonUI.createUI(this));
+
+ }
+ };
+ button.addActionListener(action);
+ button.setHorizontalAlignment(SwingConstants.LEFT);
+ final String labelText = TextUtils.getText(label);
+ UITools.addTitledBorder(button, labelText, FONT_SIZE);
+ rightBuilder.append(button, rightBuilder.getColumnCount());
+ rightBuilder.nextLine();
+ return button;
+ }
+
+ private void addStyleBox(final DefaultFormBuilder rightBuilder) {
+ mStyleBox = uiFactory.createStyleBox();
+ mSetStyle = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
+ final StyleChangeListener listener = new StyleChangeListener();
+ mSetStyle.addPropertyChangeListener(listener);
+ mSetStyle.layout(rightBuilder);
+ rightBuilder.append(new JLabel(TextUtils.getText("style")));
+ rightBuilder.append(mStyleBox);
+ rightBuilder.nextLine();
+ }
+
+ private JComboBox mAutomaticLayoutComboBox;
+ private JComboBox mAutomaticEdgeColorComboBox;
+ private Container mStyleBox;
+ private void addAutomaticLayout(final DefaultFormBuilder rightBuilder) {
+ {
+ if(mAutomaticLayoutComboBox == null){
+ TranslatedObject[] automaticLayoutTypes = TranslatedObject.fromEnum(AutomaticLayout.class);
+ mAutomaticLayoutComboBox = new JComboBoxWithBorder(automaticLayoutTypes);
+ DefaultComboBoxModel automaticLayoutComboBoxModel = (DefaultComboBoxModel) mAutomaticLayoutComboBox.getModel();
+ automaticLayoutComboBoxModel.addElement(AUTOMATIC_LAYOUT_DISABLED);
+ automaticLayoutComboBoxModel.setSelectedItem(AUTOMATIC_LAYOUT_DISABLED);
+ mAutomaticLayoutComboBox.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ if(internalChange)
+ return;
+ final ModeController modeController = Controller.getCurrentModeController();
+ AutomaticLayoutController al = modeController.getExtension(AutomaticLayoutController.class);
+ TranslatedObject selectedItem = (TranslatedObject)mAutomaticLayoutComboBox.getSelectedItem();
+ al.undoableDeactivateHook(Controller.getCurrentController().getMap().getRootNode());
+ if(!selectedItem.equals(AUTOMATIC_LAYOUT_DISABLED)){
+ al.undoableActivateHook(Controller.getCurrentController().getMap().getRootNode(), (AutomaticLayout) selectedItem.getObject());
+ }
+ }
+ });
+ }
+ final String label = TextUtils.getText("AutomaticLayoutAction.text");
+ rightBuilder.append(new JLabel(label), 5);
+ rightBuilder.append(mAutomaticLayoutComboBox);
+ rightBuilder.nextLine();
+ }
+ {
+
+ if(mAutomaticEdgeColorComboBox == null){
+ TranslatedObject[] automaticLayoutTypes = TranslatedObject.fromEnum(AutomaticEdgeColor.class.getSimpleName() + "." , AutomaticEdgeColor.Rule.class);
+ mAutomaticEdgeColorComboBox = new JComboBoxWithBorder(automaticLayoutTypes);
+ DefaultComboBoxModel automaticEdgeColorComboBoxModel = (DefaultComboBoxModel) mAutomaticEdgeColorComboBox.getModel();
+ automaticEdgeColorComboBoxModel.addElement(AUTOMATIC_LAYOUT_DISABLED);
+ automaticEdgeColorComboBoxModel.setSelectedItem(AUTOMATIC_LAYOUT_DISABLED);
+ mAutomaticEdgeColorComboBox.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ if(internalChange)
+ return;
+ final ModeController modeController = Controller.getCurrentModeController();
+ AutomaticEdgeColorHook hook = modeController.getExtension(AutomaticEdgeColorHook.class);
+ TranslatedObject selectedItem = (TranslatedObject)mAutomaticEdgeColorComboBox.getSelectedItem();
+ final MapModel map = Controller.getCurrentController().getMap();
+ final AutomaticEdgeColor oldExtension = (AutomaticEdgeColor) hook.getMapHook(map);
+ final int colorCount = oldExtension == null ? 0 : oldExtension.getColorCounter();
+ final NodeModel rootNode = map.getRootNode();
+ hook.undoableDeactivateHook(rootNode);
+ if(!selectedItem.equals(AUTOMATIC_LAYOUT_DISABLED)){
+ final AutomaticEdgeColor newExtension = new AutomaticEdgeColor((AutomaticEdgeColor.Rule) selectedItem.getObject(), colorCount);
+ hook.undoableActivateHook(rootNode, newExtension);
+ }
+ }
+ });
+ }
+ final String label = TextUtils.getText("AutomaticEdgeColorHookAction.text");
+ rightBuilder.append(new JLabel(label), 5);
+ rightBuilder.append(mAutomaticEdgeColorComboBox);
+ rightBuilder.nextLine();
+ }
+ }
+
+ private void setFont(Container c, float size) {
+ c.setFont(c.getFont().deriveFont(size));
+ for(int i = 0; i < c.getComponentCount(); i++){
+ setFont((Container) c.getComponent(i), size);
+ }
+ }
+
+ public void setStyle( final NodeModel node) {
+ if (internalChange) {
+ return;
+ }
+ internalChange = true;
+ try {
+ final LogicalStyleController logicalStyleController = LogicalStyleController.getController();
+ if(addStyleBox){
+ final boolean isStyleSet = LogicalStyleModel.getStyle(node) != null;
+ mSetStyle.setValue(isStyleSet);
+ setStyleList(mMapStyleButton, logicalStyleController.getMapStyleNames(node, "\n"));
+ }
+ setStyleList(mNodeStyleButton, logicalStyleController.getNodeStyleNames(node, "\n"));
+ final NodeStyleController styleController = NodeStyleController.getController();
+ {
+ final Color nodeColor = NodeStyleModel.getColor(node);
+ final Color viewNodeColor = styleController.getColor(node);
+ mSetNodeColor.setValue(nodeColor != null);
+ mNodeColor.setColorValue(viewNodeColor);
+ }
+ {
+ final Color color = NodeStyleModel.getBackgroundColor(node);
+ final Color viewColor = styleController.getBackgroundColor(node);
+ mSetNodeBackgroundColor.setValue(color != null);
+ mNodeBackgroundColor.setColorValue(viewColor != null ? viewColor : Controller.getCurrentController()
+ .getMapViewManager().getBackgroundColor(node));
+ }
+ {
+ final NodeStyleModel.Shape shape = NodeStyleModel.getShape(node);
+ ShapeConfigurationModel viewShape = styleController.getShapeConfiguration(node);
+ final boolean enabled = shape != null;
+ mSetNodeShape.setValue(enabled);
+ mNodeShape.setValue(viewShape.getShape().toString());
+ enableShapeConfigurationProperties(enabled, shape);
+ mShapeHorizontalMargin.setQuantifiedValue(viewShape.getHorizontalMargin());
+ mShapeVerticalMargin.setQuantifiedValue(viewShape.getVerticalMargin());
+ mUniformShape.setValue(viewShape.isUniform());
+ }
+ final NodeSizeModel nodeSizeModel = NodeSizeModel.getModel(node);
+ {
+ final Quantity<LengthUnits> width = nodeSizeModel != null ? nodeSizeModel.getMaxNodeWidth() : null;
+ final Quantity<LengthUnits> viewWidth = styleController.getMaxWidth(node);
+ mSetMaxNodeWidth.setValue(width != null);
+ mMaxNodeWidth.setQuantifiedValue(viewWidth);
+ }
+ {
+ final Quantity<LengthUnits> width = nodeSizeModel != null ? nodeSizeModel.getMinNodeWidth() : null;
+ final Quantity<LengthUnits> viewWidth = styleController.getMinWidth(node);
+ mSetMinNodeWidth.setValue(width != null);
+ mMinNodeWidth.setQuantifiedValue(viewWidth);
+ }
+ {
+ final LocationModel locationModel = LocationModel.getModel(node);
+ final LocationController locationController = modeController.getExtension(LocationController.class);
+ final Quantity<LengthUnits> gap = locationModel.getVGap();
+ final Quantity<LengthUnits> viewGap = locationController.getMinimalDistanceBetweenChildren(node);
+ mSetChildDistance.setValue(gap != LocationModel.DEFAULT_VGAP);
+ mChildDistance.setQuantifiedValue(viewGap);
+ }
+
+ final EdgeController edgeController = EdgeController.getController();
+ final EdgeModel edgeModel = EdgeModel.getModel(node);
+ {
+ final Color edgeColor = edgeModel != null ? edgeModel.getColor() : null;
+ final Color viewColor = edgeController.getColor(node);
+ mSetEdgeColor.setValue(edgeColor != null);
+ mEdgeColor.setColorValue(viewColor);
+ }
+ {
+ final EdgeStyle style = edgeModel != null ? edgeModel.getStyle() : null;
+ final EdgeStyle viewStyle = edgeController.getStyle(node);
+ mSetEdgeStyle.setValue(style != null);
+ mEdgeStyle.setValue(viewStyle.toString());
+ }
+ {
+ final int width = edgeModel != null ? edgeModel.getWidth() : EdgeModel.DEFAULT_WIDTH;
+ final int viewWidth = edgeController.getWidth(node);
+ mSetEdgeWidth.setValue(width != EdgeModel.DEFAULT_WIDTH);
+ mEdgeWidth.setValue(Integer.toString(viewWidth));
+ }
+ {
+ final CloudController cloudController = CloudController.getController();
+ final CloudModel cloudModel = CloudModel.getModel(node);
+ final Color viewCloudColor = cloudController.getColor(node);
+ mSetCloud.setValue(cloudModel != null);
+ mCloudColor.setColorValue(viewCloudColor);
+
+ final CloudModel.Shape viewCloudShape = cloudController.getShape(node);
+ mCloudShape.setValue(viewCloudShape != null ? viewCloudShape.toString() : CloudModel.Shape.ARC.toString());
+ }
+ {
+ final String fontFamilyName = NodeStyleModel.getFontFamilyName(node);
+ final String viewFontFamilyName = styleController.getFontFamilyName(node);
+ mSetNodeFontName.setValue(fontFamilyName != null);
+ mNodeFontName.setValue(viewFontFamilyName);
+ }
+ {
+ final Integer fontSize = NodeStyleModel.getFontSize(node);
+ final Integer viewfontSize = styleController.getFontSize(node);
+ mSetNodeFontSize.setValue(fontSize != null);
+ mNodeFontSize.setValue(viewfontSize.toString());
+ }
+ {
+ final Boolean bold = NodeStyleModel.isBold(node);
+ final Boolean viewbold = styleController.isBold(node);
+ mSetNodeFontBold.setValue(bold != null);
+ mNodeFontBold.setValue(viewbold);
+ }
+ {
+ final Boolean italic = NodeStyleModel.isItalic(node);
+ final Boolean viewitalic = styleController.isItalic(node);
+ mSetNodeFontItalic.setValue(italic != null);
+ mNodeFontItalic.setValue(viewitalic);
+ }
+ {
+ final TextAlign style = NodeStyleModel.getTextAlign(node);
+ final TextAlign viewStyle = styleController.getTextAlign(node);
+ mSetNodeTextAlignment.setValue(style != null);
+ mNodeTextAlignment.setValue(viewStyle.toString());
+ }
+ {
+ final Boolean hyperlink = NodeLinks.formatNodeAsHyperlink(node);
+ final Boolean viewhyperlink = LinkController.getController().formatNodeAsHyperlink(node);
+ mSetNodeFontHyperlink.setValue(hyperlink != null);
+ mNodeFontHyperlink.setValue(viewhyperlink);
+ }
+ {
+ final Boolean nodeNumbering = NodeStyleModel.getNodeNumbering(node);
+ final Boolean viewNodeNumbering = styleController.getNodeNumbering(node);
+ mSetNodeNumbering.setValue(nodeNumbering != null);
+ mNodeNumbering.setValue(viewNodeNumbering);
+ }
+ {
+ String nodeFormat = NodeStyleModel.getNodeFormat(node);
+ String viewNodeFormat = TextController.getController().getNodeFormat(node);
+ mSetNodeFormat.setValue(nodeFormat != null);
+ if (viewNodeFormat == null && node.getUserObject() instanceof IFormattedObject)
+ viewNodeFormat = ((IFormattedObject)node.getUserObject()).getPattern();
+ mNodeFormat.setValue(viewNodeFormat);
+ }
+ if(mAutomaticLayoutComboBox != null){
+ final ModeController modeController = Controller.getCurrentModeController();
+ AutomaticLayoutController al = modeController.getExtension(AutomaticLayoutController.class);
+ IExtension extension = al.getExtension(node);
+ if(extension == null)
+ mAutomaticLayoutComboBox.setSelectedItem(AUTOMATIC_LAYOUT_DISABLED);
+ else
+ mAutomaticLayoutComboBox.setSelectedIndex(((AutomaticLayout)extension).ordinal());
+ }
+ if(mAutomaticEdgeColorComboBox != null){
+ final ModeController modeController = Controller.getCurrentModeController();
+ AutomaticEdgeColorHook al = (AutomaticEdgeColorHook) modeController.getExtension(AutomaticEdgeColorHook.class);
+ final AutomaticEdgeColor extension = (AutomaticEdgeColor) al.getExtension(node);
+ if(extension == null)
+ mAutomaticEdgeColorComboBox.setSelectedItem(AUTOMATIC_LAYOUT_DISABLED);
+ else
+ mAutomaticEdgeColorComboBox.setSelectedIndex(extension.rule.ordinal());
+ }
+ }
+ finally {
+ internalChange = false;
+ }
+ }
+
+ private void setStyleList(JButton btn, String styles) {
+ if("".equals(styles)){
+ btn.setToolTipText(null);
+ btn.setText(" ");
+ return;
+ }
+ btn.setToolTipText(HtmlUtils.plainToHTML(styles));
+ final String text = styles.replaceAll("\n", ", ");
+ btn.setText(text);
+ }
+
+ private void addListeners() {
+ final Controller controller = Controller.getCurrentController();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ mapController.addNodeSelectionListener(new INodeSelectionListener() {
+ public void onSelect(final NodeModel node) {
+ final IMapSelection selection = controller.getSelection();
+ if (selection == null) {
+ return;
+ }
+ if (selection.size() == 1) {
+ setStyle(node);
+ }
+ }
+
+ public void onDeselect(final NodeModel node) {
+ }
+ });
+ mapController.addNodeChangeListener(new INodeChangeListener() {
+ public void nodeChanged(final NodeChangeEvent event) {
+ final IMapSelection selection = controller.getSelection();
+ if (selection == null) {
+ return;
+ }
+ final NodeModel node = event.getNode();
+ if (selection.getSelected().equals(node)) {
+ setStyle(node);
+ }
+ }
+ });
+ mapController.addMapChangeListener(new AMapChangeListenerAdapter() {
+
+ @Override
+ public void mapChanged(MapChangeEvent event) {
+ if(! MapStyle.MAP_STYLES.equals(event.getProperty()))
+ return;
+ final IMapSelection selection = controller.getSelection();
+ if (selection == null) {
+ return;
+ }
+ final NodeModel node = selection.getSelected();
+ setStyle(node);
+ }
+
+ });
+ final IMapViewManager mapViewManager = controller.getMapViewManager();
+ mapViewManager.addMapViewChangeListener(new IMapViewChangeListener() {
+ public void beforeViewChange(final Component oldView, final Component newView) {
+ }
+
+ public void afterViewCreated(final Component mapView) {
+ }
+
+ public void afterViewClose(final Component oldView) {
+ }
+
+ public void afterViewChange(final Component oldView, final Component newView) {
+ final Container panel = (Container) getComponent(0);
+ for (int i = 0; i < panel.getComponentCount(); i++) {
+ panel.getComponent(i).setEnabled(newView != null);
+ }
+ }
+ });
+ }
+
+ private void enableShapeConfigurationProperties(final boolean enabled, final Shape shape) {
+ final boolean enableConfigurationProperties = enabled && shape.hasConfiguration;
+ mShapeHorizontalMargin.setEnabled(enableConfigurationProperties);
+ mShapeVerticalMargin.setEnabled(enableConfigurationProperties);
+ mUniformShape.setEnabled(enableConfigurationProperties);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/AbstractContentTransformer.java b/freeplane/src/main/java/org/freeplane/features/text/AbstractContentTransformer.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/AbstractContentTransformer.java
rename to freeplane/src/main/java/org/freeplane/features/text/AbstractContentTransformer.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/DetailTextModel.java b/freeplane/src/main/java/org/freeplane/features/text/DetailTextModel.java
new file mode 100644
index 0000000..b0a3118
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/DetailTextModel.java
@@ -0,0 +1,77 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class DetailTextModel extends RichTextModel implements IExtension {
+ public static final String EDITING_PURPOSE = "DetailText";
+ private boolean hidden = false;
+ private String localizedHtmlPropertyName;
+ public DetailTextModel(boolean hidden) {
+ this.hidden = hidden;
+ }
+
+ public boolean isHidden() {
+ return hidden;
+ }
+
+ public void setHidden(boolean hidden) {
+ this.hidden = hidden;
+ }
+
+ public static DetailTextModel createDetailText(final NodeModel node) {
+ DetailTextModel details = DetailTextModel.getDetailText(node);
+ if (details == null) {
+ details = new DetailTextModel(false);
+ node.addExtension(details);
+ }
+ return details;
+ }
+
+ public static DetailTextModel getDetailText(final NodeModel node) {
+ final DetailTextModel extension = (DetailTextModel) node.getExtension(DetailTextModel.class);
+ return extension;
+ }
+
+ public static String getDetailTextText(final NodeModel node) {
+ final DetailTextModel extension = DetailTextModel.getDetailText(node);
+ return extension != null ? extension.getHtml() : null;
+ }
+
+ public static String getXmlDetailTextText(final NodeModel node) {
+ final DetailTextModel extension = DetailTextModel.getDetailText(node);
+ return extension != null ? extension.getHtml() : null;
+ }
+
+ public void setLocalizedHtmlPropertyName(String localizedHtmlPropertyName) {
+ this.localizedHtmlPropertyName = localizedHtmlPropertyName;
+ }
+
+ public String getLocalizedHtmlPropertyName() {
+ return localizedHtmlPropertyName;
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/FormatContentTransformer.java b/freeplane/src/main/java/org/freeplane/features/text/FormatContentTransformer.java
new file mode 100644
index 0000000..f194ea7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/FormatContentTransformer.java
@@ -0,0 +1,100 @@
+package org.freeplane.features.text;
+
+import java.util.List;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.map.NodeModel;
+
+class FormatContentTransformer extends AbstractContentTransformer {
+ final private TextController textController;
+
+ public FormatContentTransformer(final TextController textController, final int priority) {
+ super(priority);
+ this.textController = textController;
+ }
+
+ public Object transformContent(TextController textController, Object obj, final NodeModel node, Object transformedExtension) {
+ if (obj == null || node.getUserObject() != transformedExtension)
+ return obj;
+ final String format = textController.getNodeFormat(node);
+ final boolean nodeNumbering = textController.getNodeNumbering(node);
+ return expandFormat(obj, node, format, nodeNumbering);
+ }
+
+ private Object expandFormat(Object obj, final NodeModel node, final String format, boolean nodeNumbering) {
+ final boolean hasFormat = format != null && format.length() != 0 &&
+ !PatternFormat.IDENTITY_PATTERN.equals(format) && !PatternFormat.STANDARD_FORMAT_PATTERN.equals(format);
+ if (!hasFormat && !nodeNumbering){
+ return obj;
+ }
+ // - if html: strip html header
+ // - if number or date format: Scanner.scan
+ // - format/expand
+ // - if error: use original text
+ // - if nodeNumbering add numbering
+ // - if html: enclose in html tag
+ final boolean isHtml = (obj instanceof String) && HtmlUtils.isHtmlNode((String)obj);
+ if (isHtml) {
+ obj = HtmlUtils.extractRawBody((String)obj);
+ }
+ if (hasFormat)
+ obj = FormatController.format(obj, format);
+ if (nodeNumbering && !node.isRoot()){
+ StringBuilder builder = new StringBuilder(node.getNodeLevel(true) * 2);
+ getPathToRoot(builder, node);
+ builder.append(' ');
+ if (isHtml) {
+ obj = insertPrefix(obj.toString(), builder.toString());
+ }
+ else{
+ obj = builder.toString() + obj;
+ }
+ }
+ if (isHtml)
+ obj = "<html><head></head><body>" + obj + "</body></html>";
+ return obj.toString();
+ }
+
+ private String insertPrefix(String html, String prefix) {
+ StringBuilder sb = new StringBuilder(html.length() + prefix.length() + 1);
+ int i = 0;
+ int level = 0;
+ WHILE: while(i < html.length()){
+ final char c = html.charAt(i);
+ switch(c){
+ case '<': level++; break;
+ case '>': level--; break;
+ default:
+ if(level == 0 && ! Character.isWhitespace(c))
+ break WHILE;
+ }
+ i++;
+ }
+ sb.append(html.subSequence(0, i));
+ sb.append(prefix);
+ sb.append(html.subSequence(i, html.length()));
+ return sb.toString();
+ }
+
+ private void getPathToRoot(StringBuilder builder, NodeModel node) {
+ final NodeModel parentNode = node.getParentNode();
+ if(parentNode == null)
+ return;
+ if( textController.getNodeNumbering(parentNode)){
+ getPathToRoot(builder, parentNode);
+ if (builder.length() > 0)
+ builder.append('.');
+ }
+ final List<NodeModel> children = parentNode.getChildren();
+ int counter = 1;
+ for (NodeModel child : children) {
+ if(child.createID().equals(node.createID()))
+ break;
+ if(textController.getNodeNumbering(child))
+ counter++;
+ }
+ builder.append(counter);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/HighlightedTransformedObject.java b/freeplane/src/main/java/org/freeplane/features/text/HighlightedTransformedObject.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/HighlightedTransformedObject.java
rename to freeplane/src/main/java/org/freeplane/features/text/HighlightedTransformedObject.java
diff --git a/freeplane/src/org/freeplane/features/text/IContentTransformer.java b/freeplane/src/main/java/org/freeplane/features/text/IContentTransformer.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/IContentTransformer.java
rename to freeplane/src/main/java/org/freeplane/features/text/IContentTransformer.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/MatchCaseNodeContainsCondition.java b/freeplane/src/main/java/org/freeplane/features/text/MatchCaseNodeContainsCondition.java
new file mode 100644
index 0000000..78282a8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/MatchCaseNodeContainsCondition.java
@@ -0,0 +1,93 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.StringMatchingStrategy;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class MatchCaseNodeContainsCondition extends ASelectableCondition {
+ static final String NAME = "match_case_node_contains_condition";
+ static final String VALUE = "VALUE";
+ static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new MatchCaseNodeContainsCondition(
+ element.getAttribute(NodeTextCompareCondition.ITEM, TextController.FILTER_NODE),
+ element.getAttribute(MatchCaseNodeContainsCondition.VALUE, null),
+ Boolean.valueOf(element.getAttribute(MatchCaseNodeContainsCondition.MATCH_APPROXIMATELY, null))
+);
+ }
+
+ final private String value;
+ final private String nodeItem;
+ final private boolean matchApproximately;
+ final private StringMatchingStrategy stringMatchingStrategy;
+
+ MatchCaseNodeContainsCondition(String nodeItem, final String value,
+ final boolean matchApproximately) {
+ super();
+ this.value = value;
+ this.nodeItem = nodeItem;
+ this.matchApproximately = matchApproximately;
+ this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final Object content[] = NodeTextConditionController.getItemsForComparison(nodeItem, node);
+ return checkText(content);
+ }
+
+ private boolean checkText(Object content[]) {
+ for(Object o : content){
+ if(checkText(o))
+ return true;
+ }
+ return false;
+ }
+
+ private boolean checkText(final Object o) {
+ //return o != null && o.toString().contains(value);
+ return o != null && stringMatchingStrategy.matches(value, o.toString(), true, true);
+ }
+
+ @Override
+ protected String createDescription() {
+ final String nodeCondition = TextUtils.getText(nodeItem);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
+ return ConditionFactory.createDescription(nodeCondition, simpleCondition, value, true, matchApproximately);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(MatchCaseNodeContainsCondition.VALUE, value);
+ child.setAttribute(NodeTextCompareCondition.ITEM, nodeItem);
+ child.setAttribute(MatchCaseNodeContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/MatchCaseNoteContainsCondition.java b/freeplane/src/main/java/org/freeplane/features/text/MatchCaseNoteContainsCondition.java
new file mode 100644
index 0000000..5c47c13
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/MatchCaseNoteContainsCondition.java
@@ -0,0 +1,93 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.StringMatchingStrategy;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class MatchCaseNoteContainsCondition extends ASelectableCondition {
+ static final String NAME = "match_case_note_contains_condition";
+ static final String VALUE = "VALUE";
+ static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new MatchCaseNoteContainsCondition(element.getAttribute(MatchCaseNoteContainsCondition.VALUE, null),
+ Boolean.valueOf(element.getAttribute(MatchCaseNoteContainsCondition.MATCH_APPROXIMATELY, null)));
+ }
+
+ final private String value;
+ final boolean matchApproximately;
+ final StringMatchingStrategy stringMatchingStrategy;
+
+ protected boolean matchCase()
+ {
+ return true;
+ }
+
+ MatchCaseNoteContainsCondition(final String value, final boolean matchApproximately) {
+ super();
+ this.value = value;
+ this.matchApproximately = matchApproximately;
+ this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final String text = getText(node);
+ if (text == null) {
+ return false;
+ }
+ //return text.indexOf(value) > -1;
+ return stringMatchingStrategy.matches(value, text, true, matchCase());
+ }
+
+ @Override
+ protected String createDescription() {
+ return createDescription(true);
+ }
+
+ protected String createDescription(final boolean matchCase) {
+ final String nodeCondition = TextUtils.getText(TextController.FILTER_NOTE);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
+ return ConditionFactory.createDescription(nodeCondition, simpleCondition, value, matchCase, matchApproximately);
+ }
+
+ protected String getText(final NodeModel node) {
+ final String noteText = NoteModel.getNoteText(node);
+ return noteText == null ? null : HtmlUtils.htmlToPlain(noteText);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(MatchCaseNoteContainsCondition.VALUE, value);
+ child.setAttribute(MatchCaseNodeContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/NodeContainsCondition.java b/freeplane/src/main/java/org/freeplane/features/text/NodeContainsCondition.java
new file mode 100644
index 0000000..0664a43
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/NodeContainsCondition.java
@@ -0,0 +1,94 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.StringMatchingStrategy;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class NodeContainsCondition extends ASelectableCondition {
+ static final String NAME = "node_contains_condition";
+ static final String VALUE = "VALUE";
+ static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
+
+ static ASelectableCondition load(final XMLElement element) {
+ return new NodeContainsCondition(
+ element.getAttribute(NodeTextCompareCondition.ITEM, TextController.FILTER_NODE),
+ element.getAttribute(NodeContainsCondition.VALUE, null),
+ Boolean.valueOf(element.getAttribute(NodeContainsCondition.MATCH_APPROXIMATELY, null)));
+ }
+
+ final private String value;
+ final private String nodeItem;
+ //final private String valueLowerCase;
+ final private boolean matchApproximately;
+ final StringMatchingStrategy stringMatchingStrategy;
+
+ public NodeContainsCondition(String nodeItem, final String value, final boolean matchApproximately) {
+ super();
+ this.value = value;
+ //this.valueLowerCase = value.toLowerCase();
+ this.nodeItem = nodeItem;
+ this.matchApproximately = matchApproximately;
+ stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
+ StringMatchingStrategy.EXACT_STRING_MATCHING_STRATEGY;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final Object content[] = NodeTextConditionController.getItemsForComparison(nodeItem, node);
+ return checkText(content);
+ }
+
+ private boolean checkText(Object content[]) {
+ for(Object o : content){
+ if(checkText(o))
+ return true;
+ }
+ return false;
+ }
+
+ private boolean checkText(final Object o) {
+ //return o != null && o.toString().toLowerCase().indexOf(valueLowerCase) > -1;
+ return o != null && stringMatchingStrategy.matches(value, o.toString(), true, false);
+ }
+
+ @Override
+ protected String createDescription() {
+ final String nodeCondition = TextUtils.getText(nodeItem);
+ final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
+ return ConditionFactory.createDescription(nodeCondition, simpleCondition, value, false, matchApproximately);
+ }
+
+ @Override
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(NodeContainsCondition.VALUE, value);
+ child.setAttribute(NodeTextCompareCondition.ITEM, nodeItem);
+ child.setAttribute(NodeContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/NodeMatchesRegexpCondition.java b/freeplane/src/main/java/org/freeplane/features/text/NodeMatchesRegexpCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/NodeMatchesRegexpCondition.java
rename to freeplane/src/main/java/org/freeplane/features/text/NodeMatchesRegexpCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/NodeTextBuilder.java b/freeplane/src/main/java/org/freeplane/features/text/NodeTextBuilder.java
new file mode 100644
index 0000000..d684f42
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/NodeTextBuilder.java
@@ -0,0 +1,262 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import java.io.IOException;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.IAttributeHandler;
+import org.freeplane.core.io.IAttributeWriter;
+import org.freeplane.core.io.IElementContentHandler;
+import org.freeplane.core.io.IElementWriter;
+import org.freeplane.core.io.IExtensionAttributeWriter;
+import org.freeplane.core.io.IExtensionElementWriter;
+import org.freeplane.core.io.ITreeWriter;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.TypeReference;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.map.MapWriter;
+import org.freeplane.features.map.NodeBuilder;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeWriter;
+import org.freeplane.features.styles.StyleFactory;
+import org.freeplane.features.styles.StyleTranslatedObject;
+import org.freeplane.features.styles.StyleString;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class NodeTextBuilder implements IElementContentHandler, IElementWriter, IAttributeWriter, IExtensionElementWriter, IExtensionAttributeWriter {
+ public static final String XML_NODE_TEXT = "TEXT";
+ public static final String XML_NODE_LOCALIZED_TEXT = "LOCALIZED_TEXT";
+ public static final String XML_NODE_XHTML_CONTENT_TAG = "richcontent";
+ public static final String XML_NODE_XHTML_TYPE_NODE = "NODE";
+ public static final String XML_NODE_XHTML_TYPE_NOTE = "NOTE";
+ public static final String XML_NODE_XHTML_TYPE_DETAILS = "DETAILS";
+ public static final String XML_NODE_XHTML_TYPE_TAG = "TYPE";
+ public static final String XML_NODE_OBJECT = "OBJECT";
+ private static final String XML_NODE_TEXT_SHORTENED = "TEXT_SHORTENED";
+
+ public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
+ if (attributes == null) {
+ return null;
+ }
+ final Object typeAttribute = attributes.getAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, null);
+ if (NodeTextBuilder.XML_NODE_XHTML_TYPE_NODE.equals(typeAttribute)
+ || NodeTextBuilder.XML_NODE_XHTML_TYPE_DETAILS.equals(typeAttribute)) {
+ return parent;
+ }
+ return null;
+ }
+
+ public void endElement(final Object parent, final String tag, final Object obj, final XMLElement attributes,
+ final String content) {
+ assert tag.equals("richcontent");
+ final String xmlText;
+ final Object localizedHtml = attributes.getAttribute("LOCALIZED_HTML", null);
+ if(localizedHtml != null)
+ xmlText = TextUtils.getRawText((String)localizedHtml);
+ else
+ xmlText = content.trim();
+ final Object typeAttribute = attributes.getAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, null);
+ final NodeModel nodeModel = (NodeModel) obj;
+ if (NodeTextBuilder.XML_NODE_XHTML_TYPE_NODE.equals(typeAttribute)) {
+ nodeModel.setXmlText(xmlText);
+ }
+ else if (NodeTextBuilder.XML_NODE_XHTML_TYPE_DETAILS.equals(typeAttribute)) {
+ final boolean hidden = "true".equals(attributes.getAttribute("HIDDEN", "false"));
+ final DetailTextModel details = new DetailTextModel(hidden);
+ details.setXml(xmlText);
+ nodeModel.addExtension(details);
+ if(localizedHtml != null) {
+ details.setLocalizedHtmlPropertyName((String)localizedHtml);
+ }
+ }
+ }
+
+ private void registerAttributeHandlers(final ReadManager reader) {
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeTextBuilder.XML_NODE_TEXT, new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = ((NodeModel) userObject);
+ final Object nodeContent = node.getUserObject();
+ if(nodeContent == null || nodeContent.equals("")){
+ node.setText(value);
+ }
+ }
+ });
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeTextBuilder.XML_NODE_OBJECT, new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = ((NodeModel) userObject);
+ final Object newInstance = TypeReference.create(value);
+ // work around for old maps :
+ // actually we do not need IFormattedObject as user objects
+ // because formatting is saved as an extra attribute
+ if(newInstance instanceof IFormattedObject)
+ node.setUserObject(((IFormattedObject) newInstance).getObject());
+ else
+ node.setUserObject(newInstance);
+ }
+ });
+ IAttributeHandler textShortenedHandler = new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = ((NodeModel) userObject);
+ try {
+ if(Boolean.valueOf(value)){
+ node.addExtension(new ShortenedTextModel());
+ }
+ }
+ catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+ };
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeTextBuilder.XML_NODE_TEXT_SHORTENED, textShortenedHandler);
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, NodeTextBuilder.XML_NODE_TEXT_SHORTENED, textShortenedHandler);
+
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, NodeTextBuilder.XML_NODE_TEXT, new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = ((NodeModel) userObject);
+ node.setUserObject(StyleFactory.create(value));
+ }
+ });
+ reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeTextBuilder.XML_NODE_LOCALIZED_TEXT, new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = ((NodeModel) userObject);
+ node.setUserObject(StyleFactory.create(TranslatedObject.format(value)));
+ }
+ });
+ reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, NodeTextBuilder.XML_NODE_LOCALIZED_TEXT, new IAttributeHandler() {
+ public void setAttribute(final Object userObject, final String value) {
+ final NodeModel node = ((NodeModel) userObject);
+ node.setUserObject(StyleFactory.create(TranslatedObject.format(value)));
+ }
+ });
+ }
+
+ /**
+ * @param writeManager
+ */
+ public void registerBy(final ReadManager reader, final WriteManager writeManager) {
+ registerAttributeHandlers(reader);
+ reader.addElementHandler("richcontent", this);
+ writeManager.addElementWriter(NodeBuilder.XML_NODE, this);
+ writeManager.addElementWriter(NodeBuilder.XML_STYLENODE, this);
+ writeManager.addAttributeWriter(NodeBuilder.XML_NODE, this);
+ writeManager.addAttributeWriter(NodeBuilder.XML_STYLENODE, this);
+ }
+
+ private static class TransformedXMLExtension implements IExtension{
+ final String xml;
+
+ public TransformedXMLExtension(String html) {
+ super();
+ this.xml = HtmlUtils.toXhtml(html);
+ }
+ }
+ public void writeAttributes(final ITreeWriter writer, final Object userObject, final String tag) {
+ if(! NodeWriter.shouldWriteSharedContent(writer))
+ return;
+ final NodeModel node = (NodeModel) userObject;
+ final Object data = node.getUserObject();
+ if(data == null)
+ return;
+ final Class<? extends Object> dataClass = data.getClass();
+ if (dataClass.equals(StyleTranslatedObject.class)) {
+ writer.addAttribute(NodeTextBuilder.XML_NODE_LOCALIZED_TEXT, ((StyleTranslatedObject) data).getObject().toString());
+ return;
+ }
+ if (dataClass.equals(TranslatedObject.class)) {
+ writer.addAttribute(NodeTextBuilder.XML_NODE_LOCALIZED_TEXT, ((TranslatedObject) data).getObject().toString());
+ return;
+ }
+ final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
+ if (forceFormatting) {
+ final String text = TextController.getController().getTransformedTextNoThrow(data, node, data);
+ if (!HtmlUtils.isHtmlNode(text)) {
+ writer.addAttribute(NodeTextBuilder.XML_NODE_TEXT, text.replace('\0', ' '));
+ }
+ else{
+ node.addExtension(new TransformedXMLExtension(text));
+ }
+ }
+ else{
+ final String text = data.toString();
+ if (node.getXmlText() == null) {
+ writer.addAttribute(NodeTextBuilder.XML_NODE_TEXT, text.replace('\0', ' '));
+ }
+ if(! (data instanceof String || data instanceof StyleString)){
+ writer.addAttribute(XML_NODE_OBJECT, TypeReference.toSpec(data));
+ }
+ }
+ }
+
+ public void writeContent(final ITreeWriter writer, final Object element, final String tag) throws IOException {
+ if(! NodeWriter.shouldWriteSharedContent(writer))
+ return;
+ final NodeModel node = (NodeModel) element;
+ final TransformedXMLExtension transformedXML = node.getExtension(TransformedXMLExtension.class);
+ if (transformedXML != null || node.getXmlText() != null) {
+ final XMLElement htmlElement = new XMLElement();
+ htmlElement.setName(NodeTextBuilder.XML_NODE_XHTML_CONTENT_TAG);
+ htmlElement.setAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, NodeTextBuilder.XML_NODE_XHTML_TYPE_NODE);
+ final String xmlText;
+ if (transformedXML != null){
+ xmlText = transformedXML.xml;
+ node.removeExtension(transformedXML);
+ }
+ else
+ xmlText = node.getXmlText();
+ final String content = xmlText.replace('\0', ' ');
+ writer.addElement('\n' + content + '\n', htmlElement);
+ }
+ }
+ /*
+ * (non-Javadoc)
+ * @see freeplane.io.INodeWriter#saveContent(freeplane.io.ITreeWriter,
+ * java.lang.Object, java.lang.String)
+ */
+ public void writeContent(final ITreeWriter writer, final Object element, final IExtension note) throws IOException {
+ DetailTextModel model = (DetailTextModel) note;
+ if (model.getXml() != null) {
+ final XMLElement htmlElement = new XMLElement();
+ htmlElement.setName(NodeTextBuilder.XML_NODE_XHTML_CONTENT_TAG);
+ htmlElement.setAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, NodeTextBuilder.XML_NODE_XHTML_TYPE_DETAILS);
+ if(model.isHidden()){
+ htmlElement.setAttribute("HIDDEN", "true");
+ }
+ if(model.getLocalizedHtmlPropertyName() != null){
+ htmlElement.setAttribute("LOCALIZED_HTML", model.getLocalizedHtmlPropertyName());
+ writer.addElement(null, htmlElement);
+ }
+ else {
+ final String content = model.getXml().replace('\0', ' ');
+ writer.addElement('\n' + content + '\n', htmlElement);
+ }
+ }
+ return;
+ }
+
+ public void writeAttributes(ITreeWriter writer, Object userObject, IExtension extension) {
+ writer.addAttribute(XML_NODE_TEXT_SHORTENED, Boolean.TRUE.toString());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/NodeTextCompareCondition.java b/freeplane/src/main/java/org/freeplane/features/text/NodeTextCompareCondition.java
new file mode 100644
index 0000000..ba0e090
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/NodeTextCompareCondition.java
@@ -0,0 +1,120 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import org.freeplane.core.io.xml.TreeXmlReader;
+import org.freeplane.core.io.xml.TreeXmlWriter;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.TypeReference;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.CompareConditionAdapter;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class NodeTextCompareCondition extends CompareConditionAdapter {
+ static final String COMPARATION_RESULT = "COMPARATION_RESULT";
+ static final String NAME = "node_compare_condition";
+ static final String SUCCEED = "SUCCEED";
+ static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
+ static final String VALUE = "VALUE";
+ static final String ITEM = "ITEM";
+
+ static ASelectableCondition load(final XMLElement element) {
+ final String item = element.getAttribute(NodeTextCompareCondition.ITEM, TextController.FILTER_NODE);
+ final String valueString = element.getAttribute(NodeTextCompareCondition.VALUE, null);
+ final Object value;
+ if(valueString != null)
+ value = valueString;
+ else{
+ final String object = element.getAttribute(NodeTextCompareCondition.OBJECT, null);
+ value = TypeReference.create(object);
+ }
+ final boolean matchCase = TreeXmlReader.xmlToBoolean(element.getAttribute(CompareConditionAdapter.MATCH_CASE, null));
+ final int compResult = Integer.parseInt(element.getAttribute(NodeTextCompareCondition.COMPARATION_RESULT, null));
+ final boolean succeed = TreeXmlReader.xmlToBoolean(element.getAttribute(NodeTextCompareCondition.SUCCEED, null));
+ final boolean matchApproximately = TreeXmlReader.xmlToBoolean(element.getAttribute(NodeTextCompareCondition.MATCH_APPROXIMATELY, null));
+ return new NodeTextCompareCondition(
+ item,
+ value,
+ matchCase,
+ compResult,
+ succeed,
+ matchApproximately);
+ }
+
+ final private int comparationResult;
+ final private boolean succeed;
+ final private String nodeItem;
+
+ NodeTextCompareCondition(String nodeItem, final Object value, final boolean matchCase, final int comparationResult,
+ final boolean succeed, final boolean matchApproximately) {
+ super(value, matchCase, matchApproximately);
+ this.comparationResult = comparationResult;
+ this.succeed = succeed;
+ this.nodeItem=nodeItem;
+ }
+
+ public boolean isEqualityCondition()
+ {
+ return comparationResult == 0;
+ }
+
+ public boolean checkNode(final NodeModel node) {
+ final Object content[] = NodeTextConditionController.getItemsForComparison(nodeItem, node);
+ return content != null && checkContents(content);
+ }
+
+ private boolean checkContents(Object content[]) {
+ for(Object o : content){
+ if(o != null && checkContent(o))
+ return true;
+ }
+ return false;
+ }
+
+ private boolean checkContent(final Object content) {
+ try {
+ compareTo(content);
+ return isComparisonOK() && succeed == (getComparisonResult() == comparationResult);
+ }
+ catch (final NumberFormatException e) {
+ return false;
+ }
+ }
+
+ @Override
+ protected String createDescription() {
+ final String nodeCondition = TextUtils.getText(nodeItem);
+ return super.createDescription(nodeCondition, comparationResult, succeed);
+ }
+
+ public void fillXML(final XMLElement child) {
+ super.fillXML(child);
+ child.setAttribute(NodeTextCompareCondition.COMPARATION_RESULT, Integer.toString(comparationResult));
+ child.setAttribute(NodeTextCompareCondition.SUCCEED, TreeXmlWriter.BooleanToXml(succeed));
+ child.setAttribute(NodeTextCompareCondition.ITEM, nodeItem);
+ child.setAttribute(NodeTextCompareCondition.MATCH_APPROXIMATELY, TreeXmlWriter.BooleanToXml(matchApproximately));
+ }
+
+ @Override
+ protected String getName() {
+ return NAME;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/NodeTextConditionController.java b/freeplane/src/main/java/org/freeplane/features/text/NodeTextConditionController.java
new file mode 100644
index 0000000..d867eb6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/NodeTextConditionController.java
@@ -0,0 +1,225 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import java.util.regex.PatternSyntaxException;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.ui.FixedBasicComboBoxEditor;
+import org.freeplane.core.ui.components.TypedListCellRenderer;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ConditionFactory;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+class NodeTextConditionController implements IElementaryConditionController {
+ private final ComboBoxModel values = new DefaultComboBoxModel();
+
+ public boolean canEditValues(final Object selectedItem, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ return namedObject.objectEquals(TextController.FILTER_NODE)
+ || namedObject.objectEquals(TextController.FILTER_PARENT)
+ || namedObject.objectEquals(TextController.FILTER_DETAILS)
+ || namedObject.objectEquals(TextController.FILTER_NOTE)
+ || namedObject.objectEquals(TextController.FILTER_ANYTEXT);
+ }
+
+ public boolean canSelectValues(final Object selectedItem, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCondition,
+ final Object value, final boolean matchCase, final boolean matchApproximately) {
+ final String item = (String) ((TranslatedObject)selectedItem).getObject();
+ return createASelectableCondition(item, simpleCondition, value, matchCase, matchApproximately);
+ }
+
+ private ASelectableCondition createASelectableCondition(final String item, final TranslatedObject simpleCondition, final Object value,
+ final boolean matchCase, final boolean matchApproximately) {
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)) {
+ if (value.equals("")) {
+ return null;
+ }
+ return matchCase ? new MatchCaseNodeContainsCondition(item, value.toString(), matchApproximately) :
+ new NodeContainsCondition(item, value.toString(), matchApproximately);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_REGEXP)) {
+ try {
+ return new NodeMatchesRegexpCondition(item, value.toString(), matchCase);
+ }
+ catch (final PatternSyntaxException e) {
+ UITools.errorMessage(TextUtils.format("wrong_regexp", value, e.getMessage()));
+ return null;
+ }
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
+ return new NodeTextCompareCondition(item, value, matchCase, 0, true, matchApproximately);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
+ return new NodeTextCompareCondition(item, value, matchCase, 0, false, matchApproximately);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
+ return new NodeTextCompareCondition(item, value, matchCase, 1, true, matchApproximately);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
+ return new NodeTextCompareCondition(item, value, matchCase, -1, false, matchApproximately);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
+ return new NodeTextCompareCondition(item, value, matchCase, -1, true, matchApproximately);
+ }
+ if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
+ return new NodeTextCompareCondition(item, value, matchCase, 1, false, matchApproximately);
+ }
+ return null;
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object selectedItem) {
+ return new DefaultComboBoxModel(new TranslatedObject[] {
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_NOT_EQUAL_TO),
+ TranslatedObject.literal(ConditionFactory.FILTER_GT), TranslatedObject.literal(ConditionFactory.FILTER_GE),
+ TranslatedObject.literal(ConditionFactory.FILTER_LE), TranslatedObject.literal(ConditionFactory.FILTER_LT),
+ TextUtils.createTranslatedString(ConditionFactory.FILTER_REGEXP), });
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(TextController.FILTER_ANYTEXT));
+ list.addElement(TextUtils.createTranslatedString(TextController.FILTER_NODE));
+ list.addElement(TextUtils.createTranslatedString(TextController.FILTER_DETAILS));
+ list.addElement(TextUtils.createTranslatedString(TextController.FILTER_NOTE));
+ list.addElement(TextUtils.createTranslatedString(TextController.FILTER_PARENT));
+ return list;
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ if(selectedCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)
+ || selectedCondition.objectEquals(ConditionFactory.FILTER_REGEXP) )
+ return new FixedBasicComboBoxEditor();
+ return FrameController.getTextDateTimeEditor();
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object selectedItem, TranslatedObject simpleCond) {
+ return values;
+ }
+
+ public boolean isCaseDependent(final Object selectedItem, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public boolean supportsApproximateMatching(final Object selectedItem, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ if (element.getName().equalsIgnoreCase(NodeContainsCondition.NAME)) {
+ return NodeContainsCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(MatchCaseNodeContainsCondition.NAME)) {
+ return MatchCaseNodeContainsCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(NodeTextCompareCondition.NAME)) {
+ return NodeTextCompareCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(NodeMatchesRegexpCondition.NAME)) {
+ return NodeMatchesRegexpCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(NoteContainsCondition.NAME)) {
+ return NoteContainsCondition.load(element);
+ }
+ if (element.getName().equalsIgnoreCase(MatchCaseNoteContainsCondition.NAME)) {
+ return MatchCaseNoteContainsCondition.load(element);
+ }
+ return null;
+ }
+
+ public static Object[] getItemsForComparison(Object nodeItem, final NodeModel node) {
+ if (nodeItem.equals(TextController.FILTER_ANYTEXT)) {
+ return new Object[] {
+ getItemForComparison(TextController.FILTER_NODE, node),
+ getItemForComparison(TextController.FILTER_DETAILS, node),
+ getItemForComparison(TextController.FILTER_NOTE, node) };
+ }
+ else
+ return new Object[] { getItemForComparison(nodeItem, node) };
+ }
+
+ private static Object getItemForComparison(Object nodeItem, final NodeModel node) {
+ final Object result;
+ if(nodeItem.equals(TextController.FILTER_NODE)){
+ result = transformedObject(node);
+ }
+ else if(nodeItem.equals(TextController.FILTER_PARENT)){
+ final NodeModel parentNode = node.getParentNode();
+ if(parentNode == null)
+ result = null;
+ else
+ result = transformedObject(parentNode);
+ }
+ else if(nodeItem.equals(TextController.FILTER_DETAILS)){
+ result = DetailTextModel.getDetailTextText(node);
+ }
+ else if(nodeItem.equals(TextController.FILTER_NOTE)){
+ result = NoteModel.getNoteText(node);
+ }
+ else
+ result = null;
+ if(result instanceof String)
+ return HtmlUtils.htmlToPlain((String)result);
+ return result;
+ }
+
+ private static Object transformedObject(final NodeModel node) {
+ final Object userObject = node.getUserObject();
+ return TextController.getController().getTransformedObjectNoFormattingNoThrow(userObject, node);
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ if(selectedCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)
+ || selectedCondition.objectEquals(ConditionFactory.FILTER_REGEXP) )
+ return null;
+ return new TypedListCellRenderer();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/NoteContainsCondition.java b/freeplane/src/main/java/org/freeplane/features/text/NoteContainsCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/NoteContainsCondition.java
rename to freeplane/src/main/java/org/freeplane/features/text/NoteContainsCondition.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/RichTextModel.java b/freeplane/src/main/java/org/freeplane/features/text/RichTextModel.java
new file mode 100644
index 0000000..df1662d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/RichTextModel.java
@@ -0,0 +1,45 @@
+package org.freeplane.features.text;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.XmlUtils;
+
+
+public class RichTextModel {
+ private String html = null;
+ private String xml = null;
+
+ public String getHtml() {
+ return html;
+ }
+
+ public String getXml() {
+ return xml;
+ }
+
+ public final void setHtml(final String pNoteText) {
+ if (pNoteText == null) {
+ xml = null;
+ html = null;
+ return;
+ }
+ try {
+ html = XmlUtils.makeValidXml(pNoteText);
+ xml = HtmlUtils.toXhtml(html);
+ if (xml != null && !xml.startsWith("<")) {
+ html = xml;
+ }
+ } catch (Exception e) {
+ html = xml = HtmlUtils.unescapeHTMLUnicodeEntity(pNoteText);
+ }
+ }
+
+ public final void setXml(final String pXmlNoteText) {
+ if (pXmlNoteText == null) {
+ xml = null;
+ html = null;
+ return;
+ }
+ xml = XmlUtils.makeValidXml(pXmlNoteText);
+ html = HtmlUtils.toHtml(xml);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/SetShortenerStateAction.java b/freeplane/src/main/java/org/freeplane/features/text/SetShortenerStateAction.java
new file mode 100644
index 0000000..36bda46
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/SetShortenerStateAction.java
@@ -0,0 +1,73 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+
+ at SelectableAction(checkOnNodeChange=true)
+class SetShortenerStateAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private boolean setShortened;
+ public SetShortenerStateAction() {
+ super("SetShortenerStateAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ setShortened = !isShortened();
+ final Controller controller = Controller.getCurrentController();
+ final IMapSelection selection = controller.getSelection();
+ final NodeModel node = selection.getSelected();
+ controller.getMapViewManager().getComponent(node).requestFocusInWindow();
+ selection.keepNodePosition(node, 0.0f, 0.0f);
+ super.actionPerformed(e);
+ }
+
+ private boolean isShortened() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ if(node == null){
+ return false;
+ }
+ final ShortenedTextModel model = ShortenedTextModel.getShortenedTextModel(node);
+ return model != null;
+ }
+
+ @Override
+ protected void actionPerformed(ActionEvent e, NodeModel node) {
+ TextController controller = TextController.getController();
+ controller.setIsMinimized(node, setShortened);
+ }
+
+ @Override
+ public void setSelected() {
+ setSelected(isShortened());
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/text/ShortenedTextModel.java b/freeplane/src/main/java/org/freeplane/features/text/ShortenedTextModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/ShortenedTextModel.java
rename to freeplane/src/main/java/org/freeplane/features/text/ShortenedTextModel.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/TextController.java b/freeplane/src/main/java/org/freeplane/features/text/TextController.java
new file mode 100644
index 0000000..ba7f032
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/TextController.java
@@ -0,0 +1,417 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.swing.Icon;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.io.ReadManager;
+import org.freeplane.core.io.WriteManager;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.html.CssRuleBuilder;
+import org.freeplane.core.util.HtmlProcessor;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.map.ITooltipProvider;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeSizeModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.view.swing.map.MainView;
+
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class TextController implements IExtension {
+ public static final String DETAILS_HIDDEN = "DETAILS_HIDDEN";
+ public static final String FILTER_NODE = "filter_node";
+ public static final String FILTER_ANYTEXT = "filter_any_text";
+ public static final String FILTER_NOTE = "filter_note";
+ public static final String FILTER_PARENT = "filter_parent";
+ public static final String FILTER_DETAILS = "filter_details";
+ private static final Integer NODE_TOOLTIP = 1;
+ private static final Integer DETAILS_TOOLTIP = 2;
+ private final List<IContentTransformer> textTransformers;
+ protected final ModeController modeController;
+ public static final String MARK_TRANSFORMED_TEXT = "highlight_formulas";
+
+
+ public static boolean isMarkTransformedTextSet() {
+ return Controller.getCurrentController().getResourceController().getBooleanProperty(MARK_TRANSFORMED_TEXT);
+ }
+
+ public static TextController getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return getController(modeController);
+ }
+
+ public static TextController getController(ModeController modeController) {
+ return (TextController) modeController.getExtension(TextController.class);
+ }
+
+ public static void install() {
+ FilterController.getCurrentFilterController().getConditionFactory().addConditionController(5,
+ new NodeTextConditionController());
+ }
+
+ public static void install( final TextController textController) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(TextController.class, textController);
+ }
+
+ public TextController(final ModeController modeController) {
+ super();
+ textTransformers = new LinkedList<IContentTransformer>();
+ this.modeController = modeController;
+ final MapController mapController = modeController.getMapController();
+ final ReadManager readManager = mapController.getReadManager();
+ final WriteManager writeManager = mapController.getWriteManager();
+ final NodeTextBuilder textBuilder = new NodeTextBuilder();
+ textBuilder.registerBy(readManager, writeManager);
+ writeManager.addExtensionElementWriter(DetailTextModel.class, textBuilder);
+ writeManager.addExtensionAttributeWriter(ShortenedTextModel.class, textBuilder);
+
+ modeController.addAction(new ToggleDetailsAction());
+ modeController.addAction(new SetShortenerStateAction());
+// modeController.addAction(new ToggleNodeNumberingAction());
+
+ // this IContentTransformer is unconditional because its outcome
+ // is explicitly defined by the user (assigning a format)!
+ addTextTransformer(new FormatContentTransformer(this, 50));
+
+ registerDetailsTooltip();
+ registerNodeTextTooltip();
+ }
+
+ public void addTextTransformer(IContentTransformer textTransformer) {
+ textTransformers.add(textTransformer);
+ Collections.sort(textTransformers);
+ }
+
+ public List<IContentTransformer> getTextTransformers() {
+ return textTransformers;
+ }
+ public void removeTextTransformer(IContentTransformer textTransformer) {
+ textTransformers.remove(textTransformer);
+ }
+
+ public String getText(NodeModel nodeModel) {
+ return nodeModel.getText();
+ }
+
+ public Object getTransformedObject(Object object, final NodeModel nodeModel, Object extension) throws TransformationException{
+ if(object instanceof String){
+ String string = (String) object;
+ if(string.length() > 0 && string.charAt(0) == '\''){
+ if(isTextFormattingDisabled(nodeModel))
+ return string;
+ else
+ return string.substring(1);
+ }
+ }
+ boolean markTransformation = false;
+ for (IContentTransformer textTransformer : getTextTransformers()) {
+ try {
+ Object in = object;
+ object = textTransformer.transformContent(this, in, nodeModel, extension);
+ markTransformation = markTransformation || textTransformer.markTransformation() && ! in.equals(object);
+ }
+ catch (RuntimeException e) {
+ throw new TransformationException(e);
+ }
+ }
+ if(markTransformation)
+ return new HighlightedTransformedObject(object);
+ else
+ return object;
+ }
+
+ public Icon getIcon(Object object, final NodeModel nodeModel, Object extension){
+ if(object instanceof HighlightedTransformedObject){
+ return getIcon(((HighlightedTransformedObject)object).getObject(), nodeModel, extension);
+ }
+ for (IContentTransformer textTransformer : getTextTransformers()) {
+ Icon icon = textTransformer.getIcon(this, object, nodeModel, extension);
+ if( icon != null)
+ return icon;
+ }
+ return null;
+ }
+
+ public boolean isTextFormattingDisabled(final NodeModel nodeModel) {
+ return PatternFormat.IDENTITY_PATTERN.equals(getNodeFormat(nodeModel));
+ }
+
+ /** returns an error message instead of a normal result if something goes wrong. */
+ public Object getTransformedObjectNoThrow(Object data, final NodeModel node, Object extension) {
+ try {
+ return getTransformedObject(data, node, extension);
+ }
+ catch (Throwable e) {
+ LogUtils.warn(e.getMessage(), e);
+ return TextUtils.format("MainView.errorUpdateText", data, e.getLocalizedMessage());
+ }
+ }
+
+ public Object getTransformedObjectNoFormattingNoThrow(Object data, NodeModel node) {
+ return getTransformedObjectNoThrow(data, node, null);
+ }
+
+
+ public Object getTransformedObject(NodeModel node) throws TransformationException{
+ final Object userObject = node.getUserObject();
+ return getTransformedObject(userObject, node, userObject);
+ }
+
+
+ public Object getTransformedObjectNoThrow(NodeModel node) {
+ final Object userObject = node.getUserObject();
+ return getTransformedObjectNoThrow(userObject, node, userObject);
+ }
+
+ /** convenience method for getTransformedText().toString. */
+ public String getTransformedText(Object text, final NodeModel nodeModel, Object extension) throws TransformationException{
+ text = getTransformedObject(text, nodeModel, extension);
+ return text.toString();
+ }
+
+ public String getTransformedTextNoThrow(Object text, final NodeModel nodeModel, Object extension) {
+ text = getTransformedObjectNoThrow(text, nodeModel, extension);
+ return text.toString();
+ }
+
+ public boolean isMinimized(NodeModel node){
+ final ShortenedTextModel shortened = ShortenedTextModel.getShortenedTextModel(node);
+ return shortened != null;
+ }
+
+ // FIXME: This should be getPlainTransformedText() since getText() does not transform too
+ /** returns transformed text converted to plain text. */
+ public String getPlainTextContent(NodeModel nodeModel) {
+ final String text = getTransformedTextNoThrow(nodeModel);
+ return HtmlUtils.htmlToPlain(text);
+ }
+
+ public String getTransformedTextNoThrow(NodeModel nodeModel) {
+ final Object userObject = nodeModel.getUserObject();
+ final Object input;
+ if(userObject instanceof String && HtmlUtils.isHtmlNode((String) userObject))
+ input = HtmlUtils.htmlToPlain((String) userObject);
+ else
+ input = userObject;
+ final String text = getTransformedTextNoThrow(input, nodeModel, userObject);
+ return text;
+ }
+
+ public String getShortPlainText(NodeModel nodeModel) {
+ String adaptedText = getPlainTextContent(nodeModel);
+ if (adaptedText.length() > 40) {
+ adaptedText = adaptedText.substring(0, 40) + " ...";
+ }
+ return adaptedText;
+ }
+
+ public String getShortText(String longText) {
+ String text;
+ final boolean isHtml = HtmlUtils.isHtmlNode(longText);
+ if(isHtml){
+ text = HtmlUtils.htmlToPlain(longText).trim();
+ }
+ else{
+ text = longText;
+ }
+ int length = text.length();
+ final int eolPosition = text.indexOf('\n');
+ final int maxShortenedNodeWidth = ResourceController.getResourceController().getIntProperty("max_shortened_text_length");
+ if(eolPosition == -1 || eolPosition >= length || eolPosition >= maxShortenedNodeWidth){
+ if(length <= maxShortenedNodeWidth){
+ return longText;
+ }
+ length = maxShortenedNodeWidth;
+ }
+ else{
+ length = eolPosition;
+ }
+ if(isHtml)
+ return new HtmlProcessor(longText).htmlSubstring(0, length);
+ else
+ return text.substring(0, length);
+ }
+
+
+ public void setDetailsHidden(NodeModel node, boolean isHidden) {
+ final DetailTextModel details = DetailTextModel.createDetailText(node);
+ if(isHidden == details.isHidden()){
+ return;
+ }
+ details.setHidden(isHidden);
+ node.addExtension(details);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, DETAILS_HIDDEN, ! isHidden, isHidden);
+ }
+
+ private void registerDetailsTooltip() {
+ modeController.addToolTipProvider(DETAILS_TOOLTIP, new ITooltipProvider() {
+ public String getTooltip(ModeController modeController, NodeModel node, Component view) {
+ final DetailTextModel detailText = DetailTextModel.getDetailText(node);
+ if (detailText == null || ! (detailText.isHidden() || ShortenedTextModel.isShortened(node)) ){
+ return null;
+ }
+ final NodeStyleController style = (NodeStyleController) modeController.getExtension(NodeStyleController.class);
+ final MapStyleModel model = MapStyleModel.getExtension(node.getMap());
+ final NodeModel detailStyleNode = model.getStyleNodeSafe(MapStyleModel.DETAILS_STYLE);
+ Font detailFont = style.getFont(detailStyleNode);
+ Color detailBackground = style.getBackgroundColor(detailStyleNode);
+ Color detailForeground = style.getColor(detailStyleNode);
+ final int alignment = style.getTextAlign(detailStyleNode).swingConstant;
+
+ final StringBuilder htmlBodyStyle = new StringBuilder("<body><div style=\"")
+ .append(new CssRuleBuilder()
+ .withFont(detailFont)
+ .withColor(detailForeground)
+ .withBackground(detailBackground)
+ .withAlignment(alignment)
+ .withMaxWidthAsPt(NodeSizeModel.getMaxNodeWidth(detailStyleNode), style.getMaxWidth(node)))
+ .append("\">");
+
+ String noteText= detailText.getHtml();
+ final String tooltipText = noteText.replaceFirst("<body>", htmlBodyStyle.toString())
+ .replaceFirst("</body>", "</div></body>");
+ return tooltipText;
+ }
+ });
+ }
+
+ private void registerNodeTextTooltip() {
+ modeController.addToolTipProvider(NODE_TOOLTIP, new ITooltipProvider() {
+ public String getTooltip(final ModeController modeController, NodeModel node, Component view){
+ return getTooltip(modeController, node, (MainView)view);
+ }
+ private String getTooltip(final ModeController modeController, NodeModel node, MainView view) {
+ if (!ShortenedTextModel.isShortened(node)) {
+ return null;
+ }
+ final NodeStyleController style = (NodeStyleController) modeController.getExtension(NodeStyleController.class);
+ final Font font = style.getFont(node);
+ final StringBuilder htmlBodyStyle = new StringBuilder("<body><div style=\"")
+ .append(new CssRuleBuilder().withFont(font)
+ .withColor(view.getForeground())
+ .withBackground(view.getNodeView().getTextBackground())
+ .withAlignment(view.getHorizontalAlignment())
+ .withMaxWidthAsPt(style.getMaxWidth(node)));
+ final Object data = node.getUserObject();
+ String text;
+ try {
+ text = getTransformedText(data, node, data);
+ if(text.equals(getShortText(text)))
+ return null;
+ }
+ catch (Exception e) {
+ text = TextUtils.format("MainView.errorUpdateText", data, e.getLocalizedMessage());
+ htmlBodyStyle.append("color:red;");
+ }
+
+ htmlBodyStyle.append("\">");
+ if (!HtmlUtils.isHtmlNode(text)) {
+ text = HtmlUtils.plainToHTML(text);
+ }
+ final String tooltipText = text.replaceFirst("<body>", htmlBodyStyle.toString())
+ .replaceFirst("</body>", "</div></body>");
+ return tooltipText;
+ }
+ });
+ }
+
+ public void setIsMinimized(NodeModel node, boolean shortened) {
+ boolean oldState = ShortenedTextModel.getShortenedTextModel(node) != null;
+ if(oldState == shortened){
+ return;
+ }
+ if(shortened){
+ ShortenedTextModel.createShortenedTextModel(node);
+ }
+ else{
+ node.removeExtension(ShortenedTextModel.class);
+ }
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, "SHORTENER", oldState, shortened);
+ }
+
+ public String getNodeFormat(NodeModel node) {
+ Collection<IStyle> collection = LogicalStyleController.getController(modeController).getStyles(node);
+ final MapStyleModel model = MapStyleModel.getExtension(node.getMap());
+ for(IStyle styleKey : collection){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final String format = NodeStyleModel.getNodeFormat(styleNode);
+ if (format != null) {
+ return format;
+ }
+ }
+ // do not return PatternFormat.IDENTITY_PATTERN if parse_data=false because that would
+ // automatically disable all IContentTransformers!
+ return PatternFormat.STANDARD_FORMAT_PATTERN;
+ }
+
+ public boolean parseData() {
+ return false;
+ }
+
+ public boolean getNodeNumbering(NodeModel node) {
+ Collection<IStyle> collection = LogicalStyleController.getController(modeController).getStyles(node);
+ final MapStyleModel model = MapStyleModel.getExtension(node.getMap());
+ for(IStyle styleKey : collection){
+ final NodeModel styleNode = model.getStyleNode(styleKey);
+ if (styleNode == null) {
+ continue;
+ }
+ final Boolean numbering = NodeStyleModel.getNodeNumbering(styleNode);
+ if (numbering != null) {
+ return numbering;
+ }
+ }
+ return false;
+ }
+ public ModeController getModeController() {
+ return modeController;
+ }
+
+ public boolean canEdit() {
+ return false;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/ToggleDetailsAction.java b/freeplane/src/main/java/org/freeplane/features/text/ToggleDetailsAction.java
new file mode 100644
index 0000000..7490dae
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/ToggleDetailsAction.java
@@ -0,0 +1,106 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+ at SelectableAction(checkOnPopup = true)
+ at EnabledAction(checkOnNodeChange = true)
+class ToggleDetailsAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private boolean foundDetails;
+ private boolean isHidden;
+
+ public ToggleDetailsAction() {
+ super("ToggleDetailsAction");
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ checkDetailsEnabled();
+ if(! foundDetails)
+ return;
+ isHidden = !isHidden;
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ selection.keepNodePosition(selection.getSelected(), 0.0f, 0.0f);
+ super.actionPerformed(e);
+ }
+
+ @Override
+ protected void actionPerformed(ActionEvent e, NodeModel node) {
+ final DetailTextModel detailText = DetailTextModel.getDetailText(node);
+ if(detailText == null){
+ return;
+ }
+ TextController controller = TextController.getController();
+ controller.setDetailsHidden(node, isHidden);
+ }
+
+
+ private void checkDetailsEnabled() {
+ foundDetails = false;
+ isHidden = false;
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ final DetailTextModel detailText = DetailTextModel.getDetailText(node);
+ if (detailText != null) {
+ foundDetails = true;
+ isHidden = detailText.isHidden();
+ break;
+ }
+ }
+ }
+
+ @Override
+ public void setSelected() {
+ try {
+ NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ final DetailTextModel detailText = DetailTextModel.getDetailText(node);
+ if (detailText == null) {
+ setSelected(false);
+ setEnabled(false);
+ return;
+ }
+ setEnabled(true);
+ setSelected(detailText.isHidden());
+ }
+ catch(Exception e) {
+ setSelected(false);
+ setEnabled(false);
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ setSelected();
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/text/TransformationException.java b/freeplane/src/main/java/org/freeplane/features/text/TransformationException.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/TransformationException.java
rename to freeplane/src/main/java/org/freeplane/features/text/TransformationException.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/ConditionalContentTransformer.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/ConditionalContentTransformer.java
new file mode 100644
index 0000000..427fb9f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/ConditionalContentTransformer.java
@@ -0,0 +1,92 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Felix Natter
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import javax.swing.Icon;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.IContentTransformer;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.TransformationException;
+import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl;
+
+/**
+ * Decorator for IContentTransformer implementations that enables to switch
+ * on/off depending on prefs option at transformation time
+ * (we do this at transformation in order to not require a restart).
+ *
+ * @author Felix Natter
+ *
+ */
+public class ConditionalContentTransformer implements IContentTransformer, IEditBaseCreator {
+
+ private final IContentTransformer target;
+ private final String prefsConditionKey;
+
+ public ConditionalContentTransformer(IContentTransformer target, final String prefsConditionKey)
+ {
+ this.target = target;
+ this.prefsConditionKey = prefsConditionKey;
+ }
+
+ @Override
+ public int compareTo(IContentTransformer o) {
+ return target.compareTo(o);
+ }
+
+ @Override
+ public Object transformContent(TextController textController,
+ Object content, NodeModel node, Object transformedExtension)
+ throws TransformationException {
+ if (ResourceController.getResourceController().getBooleanProperty(prefsConditionKey))
+ return target.transformContent(textController, content, node, transformedExtension);
+ else
+ return content;
+ }
+
+ @Override
+ public Icon getIcon(TextController textController, Object content,
+ NodeModel node, Object transformedExtension) {
+ if (ResourceController.getResourceController().getBooleanProperty(prefsConditionKey))
+ return target.getIcon(textController, content, node, transformedExtension);
+ else
+ return null;
+ }
+
+ @Override
+ public int getPriority() {
+ return target.getPriority();
+ }
+
+ @Override
+ public boolean markTransformation() {
+ return target.markTransformation();
+ }
+
+ @Override
+ public EditNodeBase createEditor(NodeModel nodeModel, IEditControl editControl, String text, boolean editLong) {
+ if (target instanceof IEditBaseCreator && ResourceController.getResourceController().getBooleanProperty(prefsConditionKey))
+ return ((IEditBaseCreator)target).createEditor(nodeModel, editControl, text, editLong);
+ else
+ return null;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/DeleteDetailsAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/DeleteDetailsAction.java
new file mode 100644
index 0000000..485caec
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/DeleteDetailsAction.java
@@ -0,0 +1,67 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.util.Collection;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.DetailTextModel;
+
+ at EnabledAction(checkOnNodeChange = true)
+class DeleteDetailsAction extends AMultipleNodeAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public DeleteDetailsAction() {
+ super("DeleteDetailsAction");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final DetailTextModel detailText = DetailTextModel.getDetailText(node);
+ if (detailText == null) {
+ return;
+ }
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ selection.keepNodePosition(selection.getSelected(), 0.0f, 0.0f);
+ final MTextController controller = MTextController.getController();
+ controller.setDetailsHidden(node, false);
+ controller.setDetails(node, null);
+ }
+
+ @Override
+ public void setEnabled() {
+ boolean foundDetails = false;
+ final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (final NodeModel node : nodes) {
+ if (node != null && DetailTextModel.getDetailText(node) != null) {
+ foundDetails = true;
+ break;
+ }
+ }
+ setEnabled(foundDetails);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/EditAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/mindmapmode/EditAction.java
rename to freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditDetailsAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditDetailsAction.java
new file mode 100644
index 0000000..6581064
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditDetailsAction.java
@@ -0,0 +1,59 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.IMapViewManager;
+
+class EditDetailsAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private boolean useDialog;
+
+ public EditDetailsAction(final boolean useDialog) {
+ super(useDialog ? "EditDetailsInDialogAction" : "EditDetailsAction");
+ this.useDialog = useDialog;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * freeplane.controller.actions.ActorXml#act(freeplane.controller.actions.
+ * generated.instance.XmlAction)
+ */
+ public void actionPerformed(final ActionEvent arg0) {
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel nodeModel = controller.getSelection().getSelected();
+ final IMapViewManager viewController = controller.getMapViewManager();
+ final Component node = viewController.getComponent(nodeModel);
+ node.requestFocus();
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ selection.keepNodePosition(nodeModel, 0.0f, 0.0f);
+ final MTextController textController = (MTextController) MTextController.getController();
+ textController.editDetails(nodeModel, null, useDialog);
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/EditLongAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditLongAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/mindmapmode/EditLongAction.java
rename to freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditLongAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditNodeBase.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditNodeBase.java
new file mode 100644
index 0000000..373012a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditNodeBase.java
@@ -0,0 +1,332 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Frame;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.JDialog;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
+import javax.swing.RootPaneContainer;
+import javax.swing.WindowConstants;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
+
+/**
+ * @author foltin
+ */
+abstract public class EditNodeBase {
+ public static enum EditedComponent{TEXT, DETAIL, NOTE}
+ abstract static class EditDialog{
+ private final JDialog dialog;
+ protected JDialog getDialog() {
+ return dialog;
+ }
+
+ class CancelAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ confirmedCancel();
+ }
+ }
+
+ class DialogWindowListener extends WindowAdapter {
+ /*
+ * (non-Javadoc)
+ * @seejava.awt.event.WindowAdapter#windowLostFocus(java.awt.event.
+ * WindowEvent)
+ */
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent
+ * )
+ */
+ @Override
+ public void windowClosing(final WindowEvent e) {
+ if (dialog.isVisible()) {
+ confirmedSubmit();
+ }
+ }
+ }
+
+ class SplitAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ split();
+ }
+ }
+
+ class SubmitAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ submit();
+ }
+ }
+
+ private EditNodeBase base;
+
+ protected EditDialog(final EditNodeBase base, final String title, final RootPaneContainer frame) {
+ dialog = frame instanceof Frame ? new JDialog((Frame)frame, title, /*modal=*/true) : new JDialog((JDialog)frame, title, /*modal=*/true);
+ dialog.getContentPane().setLayout(new BorderLayout());
+ dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ final DialogWindowListener dfl = new DialogWindowListener();
+ dialog.addWindowListener(dfl);
+ this.base = base;
+ }
+
+ protected void cancel() {
+ dialog.setVisible(false);
+ }
+
+ protected void confirmedCancel() {
+ if (isChanged()) {
+ final int action = JOptionPane.showConfirmDialog(dialog, TextUtils.getText("long_node_changed_cancel"), "",
+ JOptionPane.OK_CANCEL_OPTION);
+ if (action == JOptionPane.CANCEL_OPTION) {
+ return;
+ }
+ }
+ cancel();
+ }
+
+ protected void confirmedSubmit() {
+ if (isChanged()) {
+ final int action = JOptionPane.showConfirmDialog(dialog, TextUtils.getText("long_node_changed_submit"), "",
+ JOptionPane.YES_NO_CANCEL_OPTION);
+ if (action == JOptionPane.CANCEL_OPTION) {
+ return;
+ }
+ if (action == JOptionPane.YES_OPTION) {
+ submit();
+ return;
+ }
+ }
+ cancel();
+ }
+
+ /**
+ * @return Returns the base.
+ */
+ EditNodeBase getBase() {
+ return base;
+ }
+
+ abstract protected boolean isChanged();
+
+ /**
+ * @param base
+ * The base to set.
+ */
+ void setBase(final EditNodeBase base) {
+ this.base = base;
+ }
+
+ protected void split() {
+ dialog.setVisible(false);
+ }
+
+ protected void submit() {
+ dialog.setVisible(false);
+ }
+
+ public void show() {
+ dialog.show();
+ }
+
+ public void dispose() {
+ dialog.dispose();
+ }
+
+ public Container getContentPane() {
+ return dialog.getContentPane();
+ }
+
+ public Component getFocusOwner() {
+ return dialog.getFocusOwner();
+ }
+
+ public Component getMostRecentFocusOwner() {
+ return dialog.getMostRecentFocusOwner();
+ }
+
+
+ }
+
+ protected JPopupMenu createPopupMenu(Component component){
+ JPopupMenu menu = new JPopupMenu();
+ if(! (component instanceof JTextComponent)){
+ return menu;
+ }
+ final ActionMap actionMap = ((JTextComponent)component).getActionMap();
+ final Action copyAction = actionMap.get(DefaultEditorKit.copyAction);
+ addAction(menu, copyAction, "CopyAction.text");
+ final Action cutAction = actionMap.get(DefaultEditorKit.cutAction);
+ addAction(menu, cutAction, "CutAction.text");
+ final Action pasteAction = actionMap.get(DefaultEditorKit.pasteAction);
+ addAction(menu, pasteAction, "PasteAction.text");
+ SpellCheckerController.getController().addSpellCheckerMenu(menu);
+ return menu;
+ }
+
+ protected void addAction(JPopupMenu menu, final Action action, final String label) {
+ if(action == null)
+ return;
+ final String text = TextUtils.getRawText(label);
+ final JMenuItem item = menu.add(new JMenuItem());
+ LabelAndMnemonicSetter.setLabelAndMnemonic(item, text);
+ item.addActionListener(action);
+ }
+
+ public interface IEditControl {
+ void cancel();
+
+ void ok(String newText);
+
+ void split(String newText, int position);
+
+ boolean canSplit();
+
+ EditedComponent getEditType();
+ }
+
+ protected static final int BUTTON_CANCEL = 1;
+ protected static final int BUTTON_OK = 0;
+ protected static final int BUTTON_SPLIT = 2;
+ final private IEditControl editControl;
+// final private ModeController modeController;
+ protected NodeModel node;
+ protected String text;
+ private Color background;
+ protected Color getBackground() {
+ return background;
+ }
+ protected FocusListener textFieldListener = null;
+ protected EditNodeBase(final NodeModel node, final String text,
+ final IEditControl editControl) {
+// this.modeController = modeController;
+ this.editControl = editControl;
+ this.node = node;
+ this.text = text;
+ }
+
+ public void closeEdit() {
+ if (textFieldListener != null) {
+ textFieldListener.focusLost(null);
+ }
+ }
+
+ /**
+ */
+ public IEditControl getEditControl() {
+ return editControl;
+ }
+
+ /**
+ */
+ public NodeModel getNode() {
+ return node;
+ }
+
+ /**
+ */
+ protected String getText() {
+ return text;
+ }
+
+ /**
+ */
+ public FocusListener getTextFieldListener() {
+ return textFieldListener;
+ }
+
+ protected void redispatchKeyEvents(final JTextComponent textComponent, final KeyEvent firstKeyEvent) {
+ final EventBuffer keyEventDispatcher = MTextController.getController().getEventQueue();
+ if (textComponent.hasFocus()) {
+ keyEventDispatcher.deactivate();
+ return;
+ }
+ keyEventDispatcher.activate();
+ keyEventDispatcher.setTextComponent(textComponent);
+ if (firstKeyEvent == null) {
+ return;
+ }
+ if (firstKeyEvent.getKeyChar() == KeyEvent.CHAR_UNDEFINED) {
+ switch (firstKeyEvent.getKeyCode()) {
+ case KeyEvent.VK_HOME:
+ final int modelIdx = textComponent.viewToModel(new Point(0, 0));
+ if (modelIdx >= 0) // modelIdx is -1 for LaTeX formulas!
+ textComponent.setCaretPosition(modelIdx);
+ // firstKeyEvent.consume();
+ break;
+ case KeyEvent.VK_END:
+ textComponent.setCaretPosition(textComponent.getDocument().getLength());
+ // firstKeyEvent.consume();
+ break;
+ }
+ }
+ else {
+ textComponent.selectAll();
+ }
+ }
+
+ /**
+ */
+ public void setTextFieldListener(final FocusListener listener) {
+ textFieldListener = listener;
+ }
+
+ abstract public void show(RootPaneContainer frame);
+ public void setBackground(Color background) {
+ this.background = background;
+
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditNodeDialog.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditNodeDialog.java
new file mode 100644
index 0000000..e3bf887
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditNodeDialog.java
@@ -0,0 +1,342 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JEditorPane;
+import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+import javax.swing.RootPaneContainer;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
+import org.freeplane.features.ui.IMapViewManager;
+
+/**
+ * @author foltin
+ */
+public class EditNodeDialog extends EditNodeBase {
+ private JTextComponent textComponent;
+ private final boolean enableSplit;
+
+ private class LongNodeDialog extends EditDialog {
+
+ public LongNodeDialog(final RootPaneContainer frame, final String title, final Color background) {
+ super(EditNodeDialog.this, title, frame);
+ final IMapViewManager viewController = Controller.getCurrentModeController().getController()
+ .getMapViewManager();
+ final JScrollPane editorScrollPane;
+ if (textComponent == null) {
+ JTextArea textArea = new JTextArea(getText());
+ textArea.setLineWrap(true);
+ textArea.setWrapStyleWord(true);
+ textComponent = textArea;
+ editorScrollPane = new JScrollPane(textComponent);
+ final SpellCheckerController spellCheckerController = SpellCheckerController.getController();
+ spellCheckerController.enableAutoSpell(textComponent, true);
+ final Font nodeFont = viewController.getFont(getNode());
+ textComponent.setFont(nodeFont);
+ final Color nodeTextColor = viewController.getTextColor(getNode());
+ textComponent.setForeground(nodeTextColor);
+ textComponent.setBackground(background);
+ textComponent.setCaretColor(nodeTextColor);
+ editorScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+ int preferredHeight = viewController.getComponent(getNode()).getHeight();
+ preferredHeight = Math.max(preferredHeight, Integer.parseInt(ResourceController.getResourceController()
+ .getProperty("el__min_default_window_height")));
+ preferredHeight = Math.min(preferredHeight, Integer.parseInt(ResourceController.getResourceController()
+ .getProperty("el__max_default_window_height")));
+ int preferredWidth = viewController.getComponent(getNode()).getWidth();
+ preferredWidth = Math.max(preferredWidth, Integer.parseInt(ResourceController.getResourceController()
+ .getProperty("el__min_default_window_width")));
+ preferredWidth = Math.min(preferredWidth, Integer.parseInt(ResourceController.getResourceController()
+ .getProperty("el__max_default_window_width")));
+ editorScrollPane.setPreferredSize(new Dimension(preferredWidth, preferredHeight));
+ }
+ else {
+ textComponent.setText(getText());
+ final JScrollPane ancestorScrollPane = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, textComponent);
+ if (ancestorScrollPane != null) {
+ editorScrollPane = ancestorScrollPane;
+ }
+ else {
+ editorScrollPane = new JScrollPane(textComponent);
+ }
+ }
+ final JPanel panel = new JPanel();
+ final JButton okButton = new JButton();
+ final JButton cancelButton = new JButton();
+ final JButton splitButton = new JButton();
+ final JCheckBox enterConfirms = new JCheckBox("", ResourceController.getResourceController()
+ .getBooleanProperty("el__enter_confirms_by_default"));
+ LabelAndMnemonicSetter.setLabelAndMnemonic(okButton, TextUtils.getRawText("ok"));
+ LabelAndMnemonicSetter.setLabelAndMnemonic(cancelButton, TextUtils.getRawText("cancel"));
+ LabelAndMnemonicSetter.setLabelAndMnemonic(splitButton, TextUtils.getRawText("split"));
+ LabelAndMnemonicSetter.setLabelAndMnemonic(enterConfirms, TextUtils.getRawText("enter_confirms"));
+ okButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ submit();
+ }
+ });
+ cancelButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ cancel();
+ }
+ });
+ splitButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ split();
+ }
+ });
+ enterConfirms.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ textComponent.requestFocus();
+ ResourceController.getResourceController().setProperty("el__enter_confirms_by_default",
+ Boolean.toString(enterConfirms.isSelected()));
+ }
+ });
+ textComponent.addKeyListener(new KeyListener() {
+ public void keyPressed(final KeyEvent e) {
+ switch (e.getKeyCode()) {
+ case KeyEvent.VK_ESCAPE:
+ e.consume();
+ confirmedCancel();
+ break;
+ case KeyEvent.VK_ENTER:
+ e.consume();
+ if ((e.getModifiers() & InputEvent.SHIFT_MASK) != 0
+ || enterConfirms.isSelected() == ((e.getModifiers() & InputEvent.ALT_MASK) != 0)) {
+ insertString("\n");
+ break;
+ }
+ submit();
+ break;
+ case KeyEvent.VK_TAB:
+ e.consume();
+ insertString(" ");
+ break;
+ }
+ }
+
+ public void insertString(final String text) {
+ try {
+ textComponent.getDocument().insertString(textComponent.getCaretPosition(), text, null);
+ }
+ catch (BadLocationException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void keyReleased(final KeyEvent e) {
+ }
+
+ public void keyTyped(final KeyEvent e) {
+ }
+ });
+ textComponent.addMouseListener(new MouseListener() {
+ private void conditionallyShowPopup(final MouseEvent e) {
+ if (e.isPopupTrigger()) {
+ final Component component = e.getComponent();
+ final JPopupMenu popupMenu = createPopupMenu(component);
+ popupMenu.show(component, e.getX(), e.getY());
+ e.consume();
+ }
+ }
+
+ public void mouseClicked(final MouseEvent e) {
+ }
+
+ public void mouseEntered(final MouseEvent e) {
+ }
+
+ public void mouseExited(final MouseEvent e) {
+ }
+
+ public void mousePressed(final MouseEvent e) {
+ conditionallyShowPopup(e);
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ conditionallyShowPopup(e);
+ }
+ });
+ final JPanel buttonPane = new JPanel();
+ buttonPane.add(enterConfirms);
+ buttonPane.add(okButton);
+ buttonPane.add(cancelButton);
+ if (enableSplit)
+ buttonPane.add(splitButton);
+ buttonPane.setMaximumSize(new Dimension(1000, 20));
+ if (ResourceController.getResourceController().getBooleanProperty("el__buttons_above")) {
+ panel.add(buttonPane);
+ panel.add(editorScrollPane);
+ }
+ else {
+ panel.add(editorScrollPane);
+ panel.add(buttonPane);
+ }
+ panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
+ getDialog().setContentPane(panel);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.view.mindmapview.EditNodeBase.Dialog#cancel()
+ */
+ @Override
+ protected void cancel() {
+ super.cancel();
+ getEditControl().cancel();
+ }
+
+ @Override
+ public Component getMostRecentFocusOwner() {
+ if (getDialog().isFocused()) {
+ return getFocusOwner();
+ }
+ else {
+ return textComponent;
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.view.mindmapview.EditNodeBase.Dialog#isChanged()
+ */
+ @Override
+ protected boolean isChanged() {
+ return !getText().equals(textComponent.getText());
+ }
+
+ @Override
+ public void show() {
+ textComponent.requestFocus();
+ super.show();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.view.mindmapview.EditNodeBase.Dialog#split()
+ */
+ @Override
+ protected void split() {
+ super.split();
+ getEditControl().split(textComponent.getText(), textComponent.getCaretPosition());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.view.mindmapview.EditNodeBase.Dialog#submit()
+ */
+ @Override
+ protected void submit() {
+ super.submit();
+ getEditControl().ok(textComponent.getText());
+ }
+ }
+
+ /** Private variable to hold the last value of the "Enter confirms" state. */
+ final private KeyEvent firstEvent;
+ private String title;
+ private boolean isModal;
+
+ public EditNodeDialog(final NodeModel node, final String text, final KeyEvent firstEvent,
+ final IEditControl editControl, boolean enableSplit) {
+ super(node, text, editControl);
+ this.firstEvent = firstEvent;
+ this.enableSplit = enableSplit;
+ }
+
+ public EditNodeDialog(NodeModel nodeModel, String text, KeyEvent firstEvent, IEditControl editControl,
+ boolean enableSplit, JEditorPane textEditor) {
+ this(nodeModel, text, firstEvent, editControl, enableSplit);
+ textComponent = textEditor;
+ }
+
+ public void show(final RootPaneContainer frame) {
+ if (title == null) {
+ title = TextUtils.getText("edit_long_node");
+ }
+ final EditDialog dialog = new LongNodeDialog(frame, title, getBackground());
+ redispatchKeyEvents(textComponent, firstEvent);
+ if (firstEvent == null) {
+ textComponent.setCaretPosition(getText().length());
+ }
+ dialog.getDialog().setModal(isModal);
+ dialog.getDialog().pack();
+ Controller.getCurrentModeController().getController().getMapViewManager().scrollNodeToVisible(node);
+ if (ResourceController.getResourceController().getBooleanProperty("el__position_window_below_node")) {
+ UITools.setDialogLocationUnder(dialog.getDialog(), getNode());
+ }
+ else {
+ UITools.setDialogLocationRelativeTo(dialog.getDialog(), getNode());
+ }
+ dialog.show();
+ dialog.getDialog().addComponentListener(new ComponentListener() {
+ public void componentShown(final ComponentEvent e) {
+ }
+
+ public void componentResized(final ComponentEvent e) {
+ }
+
+ public void componentMoved(final ComponentEvent e) {
+ }
+
+ public void componentHidden(final ComponentEvent e) {
+ dialog.dispose();
+ }
+ });
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ protected void setModal(boolean isModal) {
+ this.isModal = isModal;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditNodeWYSIWYG.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditNodeWYSIWYG.java
new file mode 100644
index 0000000..90d4926
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EditNodeWYSIWYG.java
@@ -0,0 +1,321 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.net.URL;
+
+import javax.swing.JButton;
+import javax.swing.JEditorPane;
+import javax.swing.JPanel;
+import javax.swing.JRootPane;
+import javax.swing.KeyStroke;
+import javax.swing.RootPaneContainer;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.StyleSheet;
+
+import org.dpolivaev.mnemonicsetter.MnemonicSetter;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.components.html.CssRuleBuilder;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleModel.TextAlign;
+import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
+
+import com.lightdev.app.shtm.SHTMLEditorPane;
+import com.lightdev.app.shtm.SHTMLPanel;
+
+/**
+ * @author Daniel Polansky
+ */
+public class EditNodeWYSIWYG extends EditNodeBase {
+ private static class HTMLDialog extends EditDialog {
+ private SHTMLPanel htmlEditorPanel;
+ private JButton splitButton;
+
+ HTMLDialog(final EditNodeBase base, final String title, String purpose, final RootPaneContainer frame) throws Exception {
+ super(base, title, frame);
+ createEditorPanel(purpose);
+ getContentPane().add(htmlEditorPanel, BorderLayout.CENTER);
+ UITools.addEscapeActionToDialog(getDialog(), new CancelAction());
+ final JButton okButton = new JButton();
+ final JButton cancelButton = new JButton();
+ splitButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(okButton, TextUtils.getRawText("ok"));
+ LabelAndMnemonicSetter.setLabelAndMnemonic(cancelButton, TextUtils.getRawText("cancel"));
+ LabelAndMnemonicSetter.setLabelAndMnemonic(splitButton, TextUtils.getRawText("split"));
+ final SubmitAction submitAction = new SubmitAction();
+ okButton.addActionListener(submitAction);
+ cancelButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ cancel();
+ }
+ });
+ final SplitAction splitAction = new SplitAction();
+ splitButton.addActionListener(splitAction);
+ UITools.addKeyActionToDialog(getDialog(), submitAction, "alt ENTER", "submit");
+ final ModeController modeController = Controller.getCurrentModeController();
+ final KeyStroke splitNodeHotKey = modeController.getUserInputListenerFactory().getAcceleratorManager().getAccelerator("SplitNode");
+ if(splitNodeHotKey != null)
+ UITools.addKeyActionToDialog(getDialog(), splitAction, splitNodeHotKey.toString(), "split");
+ final JPanel buttonPane = new JPanel();
+ buttonPane.add(okButton);
+ buttonPane.add(cancelButton);
+ buttonPane.add(splitButton);
+ buttonPane.setMaximumSize(new Dimension(1000, 20));
+ MnemonicSetter.INSTANCE.setComponentMnemonics(buttonPane, htmlEditorPanel.getMenuBar());
+
+ if (ResourceController.getResourceController().getBooleanProperty("el__buttons_above")) {
+ getContentPane().add(buttonPane, BorderLayout.NORTH);
+ }
+ else {
+ getContentPane().add(buttonPane, BorderLayout.SOUTH);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.view.mindmapview.EditNodeBase.Dialog#close()
+ */
+ @Override
+ protected void cancel() {
+ super.cancel();
+ final StyleSheet styleSheet = htmlEditorPanel.getDocument().getStyleSheet();
+ styleSheet.removeStyle("p");
+ styleSheet.removeStyle("BODY");
+ getBase().getEditControl().cancel();
+ }
+
+ private SHTMLPanel createEditorPanel(String purpose) throws Exception {
+ if (htmlEditorPanel == null) {
+ htmlEditorPanel = MTextController.getController().createSHTMLPanel(purpose);
+ final SHTMLEditorPane editorPane = (SHTMLEditorPane) htmlEditorPanel.getEditorPane();
+ final SpellCheckerController spellCheckerController = SpellCheckerController.getController();
+ spellCheckerController.enableAutoSpell(editorPane, true);
+ spellCheckerController.addSpellCheckerMenu(editorPane.getPopup());
+ spellCheckerController.enableShortKey(editorPane, true);
+ }
+ return htmlEditorPanel;
+ }
+
+ /**
+ * @return Returns the htmlEditorPanel.
+ */
+ public SHTMLPanel getHtmlEditorPanel() {
+ return htmlEditorPanel;
+ }
+
+ @Override
+ public Component getMostRecentFocusOwner() {
+ if (getDialog().isFocused()) {
+ return getFocusOwner();
+ }
+ else {
+ return htmlEditorPanel.getMostRecentFocusOwner();
+ }
+ }
+
+ @Override
+ protected boolean isChanged() {
+ return htmlEditorPanel.needsSaving();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.view.mindmapview.EditNodeBase.Dialog#split()
+ */
+ @Override
+ protected void split() {
+ super.split();
+ final StyleSheet styleSheet = htmlEditorPanel.getDocument().getStyleSheet();
+ styleSheet.removeStyle("p");
+ styleSheet.removeStyle("body");
+ getBase().getEditControl().split(HtmlUtils.unescapeHTMLUnicodeEntity(htmlEditorPanel.getDocumentText()),
+ htmlEditorPanel.getCaretPosition());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.view.mindmapview.EditNodeBase.Dialog#close()
+ */
+ @Override
+ protected void submit() {
+ super.submit();
+ htmlEditorPanel.getDocument().getStyleSheet().removeStyle("p");
+ htmlEditorPanel.getDocument().getStyleSheet().removeStyle("body");
+ if (htmlEditorPanel.needsSaving()) {
+ getBase().getEditControl().ok(HtmlUtils.unescapeHTMLUnicodeEntity(htmlEditorPanel.getDocumentText()));
+ }
+ else {
+ getBase().getEditControl().cancel();
+ }
+ }
+
+ public void setSplitEnabled(boolean enableSplit) {
+ splitButton.setEnabled(enableSplit);
+ splitButton.setVisible(enableSplit);
+ }
+ }
+
+ private static final Dimension PREFERRED_SIZE = new Dimension(600, 400);
+
+ private String title;
+
+ private Font font;
+ private Color textColor = Color.BLACK;
+ private Dimension preferredSize = PREFERRED_SIZE;
+
+ private int horizontalAlignment = TextAlign.DEFAULT.swingConstant;
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String purpose) {
+ this.title = purpose;
+ }
+
+ public Font getFont() {
+ return font;
+ }
+
+ public void setFont(Font font) {
+ this.font = font;
+ }
+
+ public Color getTextColor() {
+ return textColor;
+ }
+
+ public void setTextColor(Color textColor) {
+ this.textColor = textColor;
+ }
+
+ public Dimension getPreferredSize() {
+ return preferredSize;
+ }
+
+ public void setPreferredSize(Dimension preferredSize) {
+ this.preferredSize = preferredSize;
+ }
+
+ public EditNodeWYSIWYG(final NodeModel node, final String text, final IEditControl editControl, boolean enableSplit) {
+ super(node, text, editControl);
+ }
+
+ public void show(final RootPaneContainer frame) {
+ try {
+ HTMLDialog htmlEditorWindow = createHtmlEditor(frame);
+ htmlEditorWindow.setBase(this);
+ final String titleText;
+ titleText = TextUtils.getText(title);
+ htmlEditorWindow.getDialog().setTitle(titleText);
+ htmlEditorWindow.setSplitEnabled(getEditControl().canSplit());
+ final SHTMLPanel htmlEditorPanel = (htmlEditorWindow).getHtmlEditorPanel();
+ final StringBuilder ruleBuilder = new StringBuilder(100);
+ ruleBuilder.append("body {");
+ ruleBuilder.append(new CssRuleBuilder()
+ .withFont(font, UITools.FONT_SCALE_FACTOR)
+ .withColor(textColor)
+ .withBackground(getBackground())
+ .withAlignment(horizontalAlignment));
+ ruleBuilder.append("}\n");
+ ruleBuilder.append("p {margin-top:0;}\n");
+ final HTMLDocument document = htmlEditorPanel.getDocument();
+ final JEditorPane editorPane = htmlEditorPanel.getEditorPane();
+ if(textColor != null){
+ editorPane.setForeground(textColor);
+ editorPane.setCaretColor(textColor);
+ }
+ final StyleSheet styleSheet = document.getStyleSheet();
+ styleSheet.removeStyle("p");
+ styleSheet.removeStyle("body");
+ styleSheet.addRule(ruleBuilder.toString());
+ final URL url = node.getMap().getURL();
+ if (url != null) {
+ document.setBase(url);
+ }
+ else {
+ document.setBase(new URL("file: "));
+ }
+ htmlEditorPanel.setContentPanePreferredSize(preferredSize);
+ htmlEditorWindow.getDialog().pack();
+ if (ResourceController.getResourceController().getBooleanProperty("el__position_window_below_node")) {
+ UITools.setDialogLocationUnder(htmlEditorWindow.getDialog(), node);
+ }
+ else {
+ UITools.setDialogLocationRelativeTo(htmlEditorWindow.getDialog(), node);
+ }
+ String content = text;
+ if (!HtmlUtils.isHtmlNode(content)) {
+ content = HtmlUtils.plainToHTML(content);
+ }
+ htmlEditorPanel.setCurrentDocumentContent(content);
+ final KeyEvent firstKeyEvent = MTextController.getController().getEventQueue().getFirstEvent();
+ final JTextComponent currentPane = htmlEditorPanel.getEditorPane();
+ if (currentPane == htmlEditorPanel.getMostRecentFocusOwner()) {
+ redispatchKeyEvents(currentPane, firstKeyEvent);
+ if (firstKeyEvent == null) {
+ editorPane.setCaretPosition(htmlEditorPanel.getDocument().getLength());
+ }
+ }
+ else{
+ final EventBuffer keyEventDispatcher = MTextController.getController().getEventQueue();
+ keyEventDispatcher.deactivate();
+ }
+ htmlEditorPanel.getMostRecentFocusOwner().requestFocus();
+ htmlEditorWindow.show();
+ }
+ catch (final Exception ex) {
+ LogUtils.severe("Loading of WYSIWYG HTML editor failed. Use the other editors instead.", ex);
+ }
+ }
+
+ public HTMLDialog createHtmlEditor(final RootPaneContainer frame) throws Exception {
+ final JRootPane rootPane = ((RootPaneContainer)frame).getRootPane();
+ HTMLDialog htmlEditorWindow = (HTMLDialog) rootPane.getClientProperty(HTMLDialog.class);
+ if (htmlEditorWindow == null) {
+ htmlEditorWindow = new HTMLDialog(this, "", "", frame);
+ rootPane.putClientProperty(HTMLDialog.class, htmlEditorWindow);
+ // make sure that SHTML gets notified of relevant config changes!
+ ResourceController.getResourceController().addPropertyChangeListener(
+ new FreeplaneToSHTMLPropertyChangeAdapter(htmlEditorWindow.getHtmlEditorPanel()));
+ }
+ return htmlEditorWindow;
+ }
+
+ public void setTextAlignment(int horizontalAlignment) {
+ this.horizontalAlignment = horizontalAlignment;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EventBuffer.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EventBuffer.java
new file mode 100644
index 0000000..12d1cb1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/EventBuffer.java
@@ -0,0 +1,149 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.awt.KeyEventDispatcher;
+import java.awt.KeyboardFocusManager;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+
+/**
+ * @author Dimitry Polivaev
+ * Aug 23, 2011
+ */
+public class EventBuffer implements KeyEventDispatcher, FocusListener {
+ ArrayList<KeyEvent> events = new ArrayList<KeyEvent>(100);
+ private Component textComponent;
+ boolean isActive = false;
+ private InputEvent firstEvent;
+ private KeyEvent dispatchedEvent = null;
+
+ public boolean isActive() {
+ return isActive;
+ }
+ EventBuffer(){}
+ public Component getTextComponent() {
+ return textComponent;
+ }
+
+ public void setTextComponent(Component c) {
+ if(textComponent != null)
+ textComponent.removeFocusListener(this);
+ this.textComponent = c;
+ if(textComponent != null)
+ textComponent.addFocusListener(this);
+ }
+
+ public boolean dispatchKeyEvent(final KeyEvent ke) {
+ if(ke.equals(dispatchedEvent)){
+ return false;
+ }
+ if(textComponent != null){
+ KeyEvent newEvent = new KeyEvent(textComponent, ke.getID(), ke.getWhen(), ke.getModifiers(), ke.getKeyCode(), ke.getKeyChar(), ke.getKeyLocation());
+ events.add(newEvent);
+ }
+ else {
+ events.add(ke);
+ }
+
+ // Prevent Freeplane freeze
+ if(ke.getKeyCode() == KeyEvent.VK_ESCAPE
+ && ke.getID() == KeyEvent.KEY_RELEASED){
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(EventBuffer.this);
+ }
+ });
+ }
+ ke.consume();
+ return true;
+ }
+
+ public void focusGained(final FocusEvent e) {
+ try{
+ textComponent.removeFocusListener(this);
+ for (int i = 0; i < events.size(); i++) {
+ final KeyEvent ke = events.get(i);
+ if(ke.getComponent().equals(textComponent))
+ dispatchedEvent = ke;
+ else{
+ dispatchedEvent = new KeyEvent(textComponent, ke.getID(), ke.getWhen(), ke.getModifiers(), ke.getKeyCode(), ke.getKeyChar(), ke.getKeyLocation());
+ }
+ e.getComponent().dispatchEvent(dispatchedEvent);
+ dispatchedEvent = null;
+ }
+ }
+ finally{
+ deactivate();
+ }
+ }
+
+ public void focusLost(final FocusEvent e) {
+ }
+ public void activate() {
+ if(isActive)
+ return;
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
+ isActive = true;
+ }
+ public void deactivate() {
+ if(! isActive)
+ return;
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
+ isActive = false;
+ if(textComponent != null)
+ textComponent.removeFocusListener(this);
+ textComponent = null;
+ events.clear();
+ firstEvent = null;
+ dispatchedEvent = null;
+ }
+ public void activate(InputEvent e) {
+ activate();
+ if(e instanceof KeyEvent)
+ dispatchKeyEvent((KeyEvent) e);
+ else if(e instanceof MouseEvent)
+ setFirstEvent(e);
+ }
+ public void setFirstEvent(InputEvent e) {
+ firstEvent = e;
+ }
+
+ public KeyEvent getFirstEvent(){
+ if(firstEvent instanceof KeyEvent)
+ return (KeyEvent) firstEvent;
+ if(events.size() == 0)
+ return null;
+ return events.get(0);
+ }
+
+ public MouseEvent getMouseEvent() {
+ if(firstEvent instanceof MouseEvent)
+ return (MouseEvent) firstEvent;
+ else
+ return null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/FreeplaneToSHTMLPropertyChangeAdapter.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/FreeplaneToSHTMLPropertyChangeAdapter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/mindmapmode/FreeplaneToSHTMLPropertyChangeAdapter.java
rename to freeplane/src/main/java/org/freeplane/features/text/mindmapmode/FreeplaneToSHTMLPropertyChangeAdapter.java
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/IEditBaseCreator.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/IEditBaseCreator.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/mindmapmode/IEditBaseCreator.java
rename to freeplane/src/main/java/org/freeplane/features/text/mindmapmode/IEditBaseCreator.java
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/IEditorPaneListener.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/IEditorPaneListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/mindmapmode/IEditorPaneListener.java
rename to freeplane/src/main/java/org/freeplane/features/text/mindmapmode/IEditorPaneListener.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/JoinNodesAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/JoinNodesAction.java
new file mode 100644
index 0000000..c420503
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/JoinNodesAction.java
@@ -0,0 +1,52 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+class JoinNodesAction extends AFreeplaneAction {
+ final static Pattern BODY_END = Pattern.compile("</body>", Pattern.CASE_INSENSITIVE);
+ final static Pattern BODY_START = Pattern.compile("<body>", Pattern.CASE_INSENSITIVE);
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final String separator;
+
+ public JoinNodesAction(String separator) {
+ super("JoinNodesAction." + separator, TextUtils.format("JoinNodesAction.separator.format", separator), null);
+ this.separator = separator.replaceAll("\\\\n", "\n").replaceAll("\\\\t", "\t");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final List<NodeModel> orderedSelection = Controller.getCurrentController().getSelection().getOrderedSelection();
+ final List<NodeModel> selectedNodes = new ArrayList<NodeModel>(orderedSelection);
+ MTextController.getController().joinNodes(selectedNodes, separator);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/MTextController.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/MTextController.java
new file mode 100644
index 0000000..33fce78
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/MTextController.java
@@ -0,0 +1,1041 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.KeyEventDispatcher;
+import java.awt.KeyboardFocusManager;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Collection;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.swing.JEditorPane;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.KeyStroke;
+import javax.swing.RootPaneContainer;
+import javax.swing.SwingUtilities;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ExampleFileFilter;
+import org.freeplane.core.ui.IEditHandler.FirstAction;
+import org.freeplane.core.ui.components.BitmapImagePreview;
+import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.FixedHTMLWriter;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.StringMatchingStrategy;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.format.ScannerController;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.icon.mindmapmode.MIconController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.features.text.DetailTextModel;
+import org.freeplane.features.text.IContentTransformer;
+import org.freeplane.features.text.ShortenedTextModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.EditNodeBase.EditedComponent;
+import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.features.url.UrlManager;
+
+import com.jgoodies.common.base.Objects;
+import com.lightdev.app.shtm.ActionBuilder;
+import com.lightdev.app.shtm.SHTMLPanel;
+import com.lightdev.app.shtm.SHTMLPanelImpl;
+import com.lightdev.app.shtm.TextResources;
+
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MTextController extends TextController {
+
+ private static final String PARSE_DATA_PROPERTY = "parse_data";
+ public static final String NODE_TEXT = "NodeText";
+ private static Pattern FORMATTING_PATTERN = null;
+ private EditNodeBase mCurrentEditDialog = null;
+ private final Collection<IEditorPaneListener> editorPaneListeners;
+ private final EventBuffer eventQueue;
+
+ public static MTextController getController() {
+ return (MTextController) TextController.getController();
+ }
+
+ public MTextController(ModeController modeController) {
+ super(modeController);
+ eventQueue = new EventBuffer();
+ editorPaneListeners = new LinkedList<IEditorPaneListener>();
+ createActions();
+ ResourceController.getResourceController().addPropertyChangeListener(new IFreeplanePropertyListener() {
+ public void propertyChanged(String propertyName, String newValue, String oldValue) {
+ if (PARSE_DATA_PROPERTY.equals(propertyName)) {
+ parseData = null;
+ @SuppressWarnings("unused")
+ boolean dummy = parseData();
+ }
+ }
+ });
+ }
+
+ private void createActions() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addAction(new EditAction());
+ modeController.addAction(new UsePlainTextAction());
+ modeController.addAction(new EditLongAction());
+ modeController.addAction(new SetImageByFileChooserAction());
+ modeController.addAction(new EditDetailsAction(false));
+ modeController.addAction(new EditDetailsAction(true));
+ modeController.addAction(new DeleteDetailsAction());
+ modeController.addUiBuilder(Phase.ACTIONS, "splitToWordsActions", new EntryVisitor() {
+
+ @Override
+ public void visit(Entry target) {
+ final String[] nodeNumbersInLine = ResourceController.getResourceController().getProperty("SplitToWordsAction.nodeNumbersInLine").split("[^\\d]+");
+ for(String nodeNumberInLineAsString : nodeNumbersInLine){
+ try {
+ final int nodeNumberInLine = Integer.parseInt(nodeNumberInLineAsString);
+ if(nodeNumberInLine > 0) {
+ final SplitToWordsAction action = new SplitToWordsAction(nodeNumberInLine);
+ new EntryAccessor().addChildAction(target, action);
+ modeController.addAction(action);
+ }
+ } catch (NumberFormatException e) {
+ }
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+ });
+
+ modeController.addUiBuilder(Phase.ACTIONS, "joinNodesActions", new EntryVisitor() {
+
+ @Override
+ public void visit(Entry target) {
+ final String textSeparators = ResourceController.getResourceController()
+ .getProperty("JoinNodesAction.textSeparators");
+ final Pattern JOIN_NODES_ACTION_SEPARATORS = Pattern.compile("\\{\\{.*?\\}\\}");
+ final Matcher matcher = JOIN_NODES_ACTION_SEPARATORS.matcher(textSeparators);
+ if(matcher.find()) {
+ do{
+ String textSeparator = textSeparators.substring(matcher.start() + 2, matcher.end() - 2);
+ addAction(modeController, target, textSeparator);
+ } while(matcher.find());
+ } else {
+ addAction(modeController, target, textSeparators);
+ }
+ }
+
+ private void addAction(final ModeController modeController, Entry target, String textSeparator) {
+ final JoinNodesAction action = new JoinNodesAction(textSeparator);
+ new EntryAccessor().addChildAction(target, action);
+ modeController.addAction(action);
+ if(target.getChildCount() == 1)
+ target.getChild(0).setAttribute(EntryAccessor.ACCELERATOR, target.getAttribute(EntryAccessor.ACCELERATOR));
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+ });
+ }
+
+ private String[] getContent(final String text, final int pos) {
+ if (pos <= 0) {
+ return null;
+ }
+ final String[] strings = new String[2];
+ if (text.startsWith("<html>")) {
+ final HTMLEditorKit kit = new HTMLEditorKit();
+ final HTMLDocument doc = new HTMLDocument();
+ final StringReader buf = new StringReader(text);
+ try {
+ kit.read(buf, doc, 0);
+ final char[] firstText = doc.getText(0, pos).toCharArray();
+ int firstStart = 0;
+ int firstLen = pos;
+ while ((firstStart < firstLen) && (firstText[firstStart] <= ' ')) {
+ firstStart++;
+ }
+ while ((firstStart < firstLen) && (firstText[firstLen - 1] <= ' ')) {
+ firstLen--;
+ }
+ int secondStart = 0;
+ int secondLen = doc.getLength() - pos;
+ if(secondLen <= 0)
+ return null;
+ final char[] secondText = doc.getText(pos, secondLen).toCharArray();
+ while ((secondStart < secondLen) && (secondText[secondStart] <= ' ')) {
+ secondStart++;
+ }
+ while ((secondStart < secondLen) && (secondText[secondLen - 1] <= ' ')) {
+ secondLen--;
+ }
+ if (firstStart == firstLen || secondStart == secondLen) {
+ return null;
+ }
+ StringWriter out = new StringWriter();
+ new FixedHTMLWriter(out, doc, firstStart, firstLen - firstStart).write();
+ strings[0] = out.toString();
+ out = new StringWriter();
+ new FixedHTMLWriter(out, doc, pos + secondStart, secondLen - secondStart).write();
+ strings[1] = out.toString();
+ return strings;
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ catch (final BadLocationException e) {
+ LogUtils.severe(e);
+ }
+ }
+ else {
+ if (pos >= text.length()) {
+ return null;
+ }
+ strings[0] = text.substring(0, pos);
+ strings[1] = text.substring(pos);
+ }
+ return strings;
+ }
+
+ private String addContent(String joinedContent, final boolean isHtml, String nodeContent, final boolean isHtmlNode, String separator) {
+ if (isHtml) {
+ final String joinedContentParts[] = JoinNodesAction.BODY_END.split(joinedContent, 2);
+ joinedContent = joinedContentParts[0];
+ if (!isHtmlNode) {
+ final String end[] = JoinNodesAction.BODY_START.split(joinedContent, 2);
+ if (end.length == 1) {
+ end[0] = "<html>";
+ }
+ nodeContent = end[0] + "<body><p>" + HtmlUtils.toXMLEscapedTextExpandingWhitespace(nodeContent) + "</p>";
+ }
+ }
+ if (isHtmlNode & !joinedContent.equals("")) {
+ final String nodeContentParts[] = JoinNodesAction.BODY_START.split(nodeContent, 2);
+ // if no <body> tag is found
+ if (nodeContentParts.length == 1) {
+ nodeContent = nodeContent.substring(6);
+ nodeContentParts[0] = "<html>";
+ }
+ else {
+ nodeContent = nodeContentParts[1];
+ }
+ if (!isHtml) {
+ joinedContent = nodeContentParts[0] + "<body><p>" + HtmlUtils.toXMLEscapedTextExpandingWhitespace(joinedContent) + "</p>";
+ }
+ }
+ if (joinedContent.equals("")) {
+ return nodeContent;
+ }
+ joinedContent += isHtml ? HtmlUtils.toXMLEscapedTextExpandingWhitespace(separator) : separator;
+ joinedContent += nodeContent;
+ return joinedContent;
+ }
+
+ public void joinNodes(final List<NodeModel> selectedNodes, final String separator) {
+ if(selectedNodes.isEmpty())
+ return;
+ final NodeModel selectedNode = selectedNodes.get(0);
+ for (final NodeModel node: selectedNodes) {
+ if(node != selectedNode && node.subtreeContainsCloneOf(selectedNode)){
+ UITools.errorMessage(TextUtils.getText("cannot_move_into_child_node"));
+ return;
+ }
+ }
+ String joinedContent = "";
+ final Controller controller = Controller.getCurrentController();
+ boolean isHtml = false;
+ final LinkedHashSet<MindIcon> icons = new LinkedHashSet<MindIcon>();
+ for (final NodeModel node: selectedNodes) {
+ final String nodeContent = node.getText();
+ icons.addAll(node.getIcons());
+ final boolean isHtmlNode = HtmlUtils.isHtmlNode(nodeContent);
+ joinedContent = addContent(joinedContent, isHtml, nodeContent, isHtmlNode, separator);
+ if (node != selectedNode) {
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ mapController.moveNodes(node.getChildren(), selectedNode, selectedNode.getChildCount());
+ mapController.deleteNode(node);
+ }
+ isHtml = isHtml || isHtmlNode;
+ }
+ controller.getSelection().selectAsTheOnlyOneSelected(selectedNode);
+ setNodeText(selectedNode, joinedContent);
+ final MIconController iconController = (MIconController) IconController.getController();
+ iconController.removeAllIcons(selectedNode);
+ for (final MindIcon icon : icons) {
+ iconController.addIcon(selectedNode, icon);
+ }
+ }
+
+ public void setImageByFileChooser() {
+ boolean picturesAmongSelecteds = false;
+ final ModeController modeController = Controller.getCurrentModeController();
+ for (final NodeModel node : modeController.getMapController().getSelectedNodes()) {
+ final URI link = NodeLinks.getLink(node);
+ if (link != null) {
+ final String linkString = link.toString();
+ final String lowerCase = linkString.toLowerCase();
+ if (lowerCase.endsWith(".png") || lowerCase.endsWith(".jpg") || lowerCase.endsWith(".jpeg")
+ || lowerCase.endsWith(".gif")) {
+ picturesAmongSelecteds = true;
+ final String encodedLinkString = HtmlUtils.unicodeToHTMLUnicodeEntity(linkString);
+ final String strText = "<html><img src=\"" + encodedLinkString + "\">";
+ ((MLinkController) LinkController.getController()).setLink(node, (URI) null, LinkController.LINK_ABSOLUTE);
+ setNodeText(node, strText);
+ }
+ }
+ }
+ if (picturesAmongSelecteds) {
+ return;
+ }
+ final Controller controller = modeController.getController();
+ final ViewController viewController = controller.getViewController();
+ final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
+ final MapModel map = selectedNode.getMap();
+ final File file = map.getFile();
+ if (file == null && LinkController.getLinkType() == LinkController.LINK_RELATIVE_TO_MINDMAP) {
+ JOptionPane.showMessageDialog(viewController.getCurrentRootComponent(), TextUtils
+ .getText("not_saved_for_image_error"), "Freeplane", JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+ final ExampleFileFilter filter = new ExampleFileFilter();
+ filter.addExtension("jpg");
+ filter.addExtension("jpeg");
+ filter.addExtension("png");
+ filter.addExtension("gif");
+ filter.setDescription(TextUtils.getText("bitmaps"));
+ final UrlManager urlManager = (UrlManager) modeController.getExtension(UrlManager.class);
+ final JFileChooser chooser = urlManager.getFileChooser(null, false);
+ chooser.setFileFilter(filter);
+ chooser.setAcceptAllFileFilterUsed(false);
+ chooser.setAccessory(new BitmapImagePreview(chooser));
+ final int returnVal = chooser.showOpenDialog(viewController.getCurrentRootComponent());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+ final File input = chooser.getSelectedFile();
+ URI uri = input.toURI();
+ if (uri == null) {
+ return;
+ }
+ // bad hack: try to interpret file as http link
+ if(! input.exists()){
+ uri = LinkController.toRelativeURI(map.getFile(), input, LinkController.LINK_RELATIVE_TO_MINDMAP);
+ if(uri == null || ! "http".equals(uri.getScheme())){
+ UITools.errorMessage(TextUtils.format("file_not_found", input.toString()));
+ return;
+ }
+ }
+ else if (LinkController.getLinkType() != LinkController.LINK_ABSOLUTE) {
+ uri = LinkController.toLinkTypeDependantURI(map.getFile(), input);
+ }
+ String uriString = uri.toString();
+ if(uriString.startsWith("http:/")){
+ uriString = "http://" + uriString.substring("http:/".length());
+ }
+ final String strText = "<html><img src=\"" + uriString + "\">";
+ setNodeText(selectedNode, strText);
+ }
+
+ private static final Pattern HTML_HEAD = Pattern.compile("\\s*<head>.*</head>", Pattern.DOTALL);
+ private EditEventDispatcher keyEventDispatcher;
+ private Boolean parseData;
+
+ public void setGuessedNodeObject(final NodeModel node, final String newText) {
+ if (HtmlUtils.isHtmlNode(newText))
+ setNodeObject(node, newText);
+ else {
+ final Object guessedObject = guessObject(newText, NodeStyleModel.getNodeFormat(node));
+ if(guessedObject instanceof IFormattedObject)
+ setNodeObject(node, ((IFormattedObject) guessedObject).getObject());
+ else
+ setNodeObject(node, newText);
+ }
+ }
+
+ public Object guessObject(final Object text, final String oldFormat) {
+ if (parseData() && text instanceof String) {
+ if (PatternFormat.getIdentityPatternFormat().getPattern().equals(oldFormat))
+ return text;
+ final Object parseResult = ScannerController.getController().parse((String) text);
+ if (oldFormat != null) {
+ final Object formatted = FormatController.format(parseResult, oldFormat, null);
+ return (formatted == null) ? text : formatted;
+ }
+ return parseResult;
+ }
+ return text;
+ }
+
+ public boolean parseData() {
+ if (parseData == null)
+ parseData = ResourceController.getResourceController().getBooleanProperty(PARSE_DATA_PROPERTY);
+ return parseData;
+ }
+
+ /** converts strings to date, number or URI if possible. All other data types are left unchanged. */
+ public Object guessObjectOrURI(final Object object, final String oldFormat) {
+ Object guessedObject = guessObject(object, oldFormat);
+ if (guessedObject == object && !(object instanceof URI) && matchUriPattern(object)) {
+ try {
+ return new URI((String) object);
+ }
+ catch (URISyntaxException e) {
+ LogUtils.warn("URI regular expression does not match URI parser for " + object);
+ return object;
+ }
+ }
+ return guessedObject;
+ }
+
+ private boolean matchUriPattern(Object object) {
+ if (!(object instanceof String))
+ return false;
+ return TextUtils.matchUriPattern((String) object);
+ }
+
+ public void setNodeText(final NodeModel node, final String newText) {
+ setNodeObject(node, newText);
+ }
+
+ public void setNodeObject(final NodeModel node, final Object newObject) {
+ if(newObject == null){
+ setNodeObject(node, "");
+ return;
+ }
+
+ final Object oldText = node.getUserObject();
+ if (oldText.equals(newObject)) {
+ return;
+ }
+
+ final IActor actor = new IActor() {
+ public void act() {
+ if (!oldText.equals(newObject)) {
+ node.setUserObject(newObject);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_TEXT, oldText, newObject);
+ }
+ }
+
+ public String getDescription() {
+ return "setNodeText";
+ }
+
+ public void undo() {
+ if (!oldText.equals(newObject)) {
+ node.setUserObject(oldText);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_TEXT, newObject, oldText);
+ }
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ public void splitNode(final NodeModel node, final int caretPosition, final String newText) {
+ if (node.isRoot()) {
+ return;
+ }
+ final String oldText = node.getText();
+ final String futureText = newText != null ? newText : oldText;
+ final String[] strings = getContent(futureText, caretPosition);
+ if (strings == null) {
+ final String mayBePlainText = makePlainIfNoFormattingFound(futureText);
+ if(! Objects.equals(mayBePlainText, oldText))
+ setNodeObject(node, mayBePlainText);
+ return;
+ }
+ final String newUpperContent = makePlainIfNoFormattingFound(strings[0]);
+ final String newLowerContent = makePlainIfNoFormattingFound(strings[1]);
+ setNodeObject(node, newUpperContent);
+ final NodeModel parent = node.getParentNode();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel lowerNode = ((MMapController) modeController.getMapController()).addNewNode(parent, parent.getIndex(node) + 1, node.isLeft());
+ final MNodeStyleController nodeStyleController = (MNodeStyleController) NodeStyleController
+ .getController();
+ nodeStyleController.copyStyle(node, lowerNode);
+ setNodeObject(lowerNode, newLowerContent);
+ }
+
+ public boolean useRichTextInEditor(String key) {
+ final int showResult = OptionalDontShowMeAgainDialog.show(
+ "OptionPanel." + key, "edit.decision", key,
+ OptionalDontShowMeAgainDialog.BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED);
+ return showResult == JOptionPane.OK_OPTION;
+ }
+
+ public void editDetails(final NodeModel nodeModel, InputEvent e, final boolean editLong) {
+ final Controller controller = Controller.getCurrentController();
+ stopEditing();
+ Controller.getCurrentModeController().setBlocked(true);
+ String text = DetailTextModel.getDetailTextText(nodeModel);
+ final boolean isNewNode = text == null;
+ if(isNewNode){
+ final MTextController textController = (MTextController) MTextController.getController();
+ textController.setDetails(nodeModel, "<html>");
+ text = "";
+ }
+ final EditNodeBase.IEditControl editControl = new EditNodeBase.IEditControl() {
+ public void cancel() {
+ if (isNewNode) {
+ final String detailText = DetailTextModel.getDetailTextText(nodeModel);
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ if(detailText != null)
+ modeController.undo();
+ modeController.resetRedo();
+ }
+ stop();
+ }
+
+ public void ok(final String newText) {
+ if(HtmlUtils.isEmpty(newText))
+ if (isNewNode) {
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ modeController.undo();
+ modeController.resetRedo();
+ }
+ else {
+ keepNodePosition();
+ setDetailsHtmlText(nodeModel, null);
+ }
+ else{
+ keepNodePosition();
+ setDetailsHtmlText(nodeModel, newText);
+ }
+ stop();
+ }
+
+ private void keepNodePosition() {
+ Controller.getCurrentController().getSelection().keepNodePosition(nodeModel, 0, 0);
+ }
+
+ public void split(final String newText, final int position) {
+ }
+ private void stop() {
+ Controller.getCurrentModeController().setBlocked(false);
+ mCurrentEditDialog = null;
+ }
+ public boolean canSplit() {
+ return false;
+ }
+
+ public EditedComponent getEditType() {
+ return EditedComponent.DETAIL;
+ }
+ };
+ mCurrentEditDialog = createEditor(nodeModel, editControl, text, false, editLong, true);
+ final RootPaneContainer frame = (RootPaneContainer) SwingUtilities.getWindowAncestor(controller.getMapViewManager().getMapViewComponent());
+ mCurrentEditDialog.show(frame);
+ }
+
+
+ private void setDetailsHtmlText(final NodeModel node, final String newText) {
+ if(newText != null){
+ final String body = removeHtmlHead(newText);
+ setDetails(node, body.replaceFirst("\\s+$", ""));
+ }
+ else
+ setDetails(node, null);
+ }
+
+ public void setDetails(final NodeModel node, final String newText) {
+ final String oldText = DetailTextModel.getDetailTextText(node);
+ if (oldText == newText || null != oldText && oldText.equals(newText)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ boolean hidden = false;
+ public void act() {
+ setText(newText);
+ }
+
+ public String getDescription() {
+ return "setDetailText";
+ }
+
+ private void setText(final String text) {
+ final boolean containsDetails = !(text == null || text.equals(""));
+ if (containsDetails) {
+ final DetailTextModel details = DetailTextModel.createDetailText(node);
+ details.setHtml(text);
+ details.setHidden(hidden);
+ node.addExtension(details);
+ }
+ else {
+ final DetailTextModel details = (DetailTextModel) node.getExtension(DetailTextModel.class);
+ if (null != details ) {
+ hidden = details.isHidden();
+ node.removeExtension(DetailTextModel.class);
+ }
+ }
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, DetailTextModel.class, oldText, text);
+ }
+
+ public void undo() {
+ setText(oldText);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ public void setDetailsHidden(final NodeModel node, final boolean isHidden) {
+ stopEditing();
+ DetailTextModel details = (DetailTextModel) node.getExtension(DetailTextModel.class);
+ if (details == null || details.isHidden() == isHidden) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ setHidden(isHidden);
+ }
+
+ public String getDescription() {
+ return "setDetailsHidden";
+ }
+
+ private void setHidden(final boolean isHidden) {
+ final DetailTextModel details = DetailTextModel.createDetailText(node);
+ details.setHidden(isHidden);
+ node.addExtension(details);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, DETAILS_HIDDEN, ! isHidden, isHidden);
+ }
+
+ public void undo() {
+ setHidden(! isHidden);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ public void setIsMinimized(final NodeModel node, final boolean state) {
+ ShortenedTextModel details = (ShortenedTextModel) node.getExtension(ShortenedTextModel.class);
+ if (details == null && state == false || details != null && state == true) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ setShortener(state);
+ }
+
+ public String getDescription() {
+ return "setShortener";
+ }
+
+ private void setShortener(final boolean state) {
+ if(state){
+ final ShortenedTextModel details = ShortenedTextModel.createShortenedTextModel(node);
+ node.addExtension(details);
+ }
+ else{
+ node.removeExtension(ShortenedTextModel.class);
+ }
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, ShortenedTextModel.SHORTENER, ! state, state);
+ }
+
+ public void undo() {
+ setShortener(! state);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ public void edit(final FirstAction action, final boolean editLong) {
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel selectedNode = controller.getSelection().getSelected();
+ if (selectedNode != null) {
+ if (FirstAction.EDIT_CURRENT.equals(action)) {
+ edit(selectedNode, selectedNode, false, false, editLong);
+ }
+ else if (!Controller.getCurrentModeController().isBlocked()) {
+ final int mode = FirstAction.ADD_CHILD.equals(action) ? MMapController.NEW_CHILD : MMapController.NEW_SIBLING_BEHIND;
+ ((MMapController) Controller.getCurrentModeController().getMapController()).addNewNode(mode);
+ }
+ }
+ }
+
+ public boolean containsFormatting(final String text){
+ if(FORMATTING_PATTERN == null){
+ FORMATTING_PATTERN = Pattern.compile("<(?!/|html>|head|body|p/?>|!--|style type=\"text/css\">)", Pattern.CASE_INSENSITIVE);
+ }
+ final Matcher matcher = FORMATTING_PATTERN.matcher(text);
+ return matcher.find();
+ }
+
+ private class EditEventDispatcher implements KeyEventDispatcher, INodeChangeListener, INodeSelectionListener{
+ private final boolean editLong;
+ private final boolean parentFolded;
+ private final boolean isNewNode;
+ private final NodeModel prevSelectedModel;
+ private final NodeModel nodeModel;
+ private final ModeController modeController;
+
+ private EditEventDispatcher(ModeController modeController, NodeModel nodeModel, NodeModel prevSelectedModel, boolean isNewNode,
+ boolean parentFolded, boolean editLong) {
+ this.modeController = modeController;
+ this.editLong = editLong;
+ this.parentFolded = parentFolded;
+ this.isNewNode = isNewNode;
+ this.prevSelectedModel = prevSelectedModel;
+ this.nodeModel = nodeModel;
+ }
+
+ public boolean dispatchKeyEvent(KeyEvent e) {
+ if(e.getID() == KeyEvent.KEY_RELEASED || e.getID() == KeyEvent.KEY_TYPED)
+ return false;
+ switch(e.getKeyCode()){
+ case KeyEvent.VK_SHIFT:
+ case KeyEvent.VK_CONTROL:
+ case KeyEvent.VK_CAPS_LOCK:
+ case KeyEvent.VK_ALT:
+ case KeyEvent.VK_ALT_GRAPH:
+ return false;
+ }
+
+ uninstall();
+ if (isMenuEvent(e)){
+ return false;
+ }
+ eventQueue.activate(e);
+ edit(nodeModel, prevSelectedModel, isNewNode, parentFolded, editLong);
+ return true;
+ }
+
+ private boolean isMenuEvent(KeyEvent e) {
+ if(! editLong){
+ final String editLongKeyStrokeProperty = ResourceController.getResourceController().getProperty("acceleratorForMindMap/$EditLongAction$0", null);
+ if(editLongKeyStrokeProperty != null){
+ final KeyStroke editLongKeyStroke = UITools.getKeyStroke(editLongKeyStrokeProperty);
+ if(editLongKeyStroke != null){
+ final KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(e);
+ if(editLongKeyStroke.equals(keyStroke)){
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ public void uninstall() {
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
+ MapController mapController = modeController.getMapController();
+ mapController.removeNodeChangeListener(this);
+ mapController.removeNodeSelectionListener(this);
+ keyEventDispatcher = null;
+ }
+
+ public void install() {
+ KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
+ MapController mapController = modeController.getMapController();
+ mapController.addNodeChangeListener(this);
+ mapController.addNodeSelectionListener(this);
+ }
+
+ public void onDeselect(NodeModel node) {
+ uninstall();
+ }
+
+ public void onSelect(NodeModel node) {
+ uninstall();
+ }
+
+ public void nodeChanged(NodeChangeEvent event) {
+ uninstall();
+ }
+ }
+
+ public void edit(final NodeModel nodeModel, final NodeModel prevSelectedModel, final boolean isNewNode,
+ final boolean parentFolded, final boolean editLong) {
+ if (nodeModel == null || mCurrentEditDialog != null) {
+ return;
+ }
+ final Controller controller = Controller.getCurrentController();
+ if (controller.getMap() != nodeModel.getMap()) {
+ return;
+ }
+ final IMapViewManager viewController = controller.getMapViewManager();
+ final Component map = viewController.getMapViewComponent();
+ map.validate();
+ map.invalidate();
+ final Component node = viewController.getComponent(nodeModel);
+ if (node == null) {
+ return;
+ }
+ node.requestFocus();
+ stopEditing();
+ if(isNewNode && ! eventQueue.isActive()
+ && ! ResourceController.getResourceController().getBooleanProperty("display_inline_editor_for_all_new_nodes")){
+ keyEventDispatcher = new EditEventDispatcher(Controller.getCurrentModeController(), nodeModel, prevSelectedModel, isNewNode, parentFolded, editLong);
+ keyEventDispatcher.install();
+ return;
+ };
+ final IEditControl editControl = new IEditControl() {
+ public void cancel() {
+ if (isNewNode && nodeModel.getMap().equals(controller.getMap())) {
+ if(nodeModel.getParentNode() != null){
+ controller.getSelection().selectAsTheOnlyOneSelected(nodeModel);
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ modeController.undo();
+ modeController.resetRedo();
+ }
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ if (parentFolded) {
+ mapController.setFolded(prevSelectedModel, true);
+ }
+ }
+ stop();
+ }
+
+ private void stop() {
+ Controller.getCurrentModeController().setBlocked(false);
+ viewController.obtainFocusForSelected();
+ mCurrentEditDialog = null;
+ }
+
+ public void ok(final String text) {
+ String processedText = makePlainIfNoFormattingFound(text);
+ keepNodePosition();
+ setGuessedNodeObject(nodeModel, processedText);
+ stop();
+ }
+
+ private void keepNodePosition() {
+ Controller.getCurrentController().getSelection().keepNodePosition(nodeModel, 0, 0);
+ }
+
+
+ public void split(final String text, final int position) {
+ String processedText = HtmlUtils.isHtmlNode(text) ? removeHtmlHead(text) : text;
+ splitNode(nodeModel, position, processedText);
+ viewController.obtainFocusForSelected();
+ stop();
+ }
+ public boolean canSplit() {
+ return true;
+ }
+
+ public EditedComponent getEditType() {
+ return EditedComponent.TEXT;
+ }
+ };
+ mCurrentEditDialog = createEditor(nodeModel, editControl, nodeModel.getText(), isNewNode, editLong, true);
+ final RootPaneContainer frame = (RootPaneContainer) UITools.getCurrentRootComponent();
+ mCurrentEditDialog.show(frame);
+ }
+
+ private EditNodeBase createEditor(final NodeModel nodeModel, final IEditControl editControl,
+ String text, final boolean isNewNode, final boolean editLong,
+ boolean internal) {
+ Controller.getCurrentModeController().setBlocked(true);
+ EditNodeBase base = getEditNodeBase(nodeModel, text, editControl, editLong);
+ if(base != null || ! internal){
+ return base;
+ }
+ final IEditBaseCreator textFieldCreator = (IEditBaseCreator) Controller.getCurrentController().getMapViewManager();
+ return textFieldCreator.createEditor(nodeModel, editControl, text, editLong);
+ }
+
+
+ public EditNodeBase getEditNodeBase(final NodeModel nodeModel, final String text, final IEditControl editControl, final boolean editLong) {
+ final List<IContentTransformer> textTransformers = getTextTransformers();
+ for(IContentTransformer t : textTransformers){
+ if(t instanceof IEditBaseCreator){
+ final EditNodeBase base = ((IEditBaseCreator) t).createEditor(nodeModel, editControl, text, editLong);
+ if(base != null){
+ return base;
+ }
+ }
+ }
+ return null;
+ }
+
+
+ public void stopEditing() {
+ if(keyEventDispatcher != null){
+ keyEventDispatcher.uninstall();
+ }
+ if (mCurrentEditDialog != null) {
+ // Ensure that setText from the edit and the next action
+ // are parts of different transactions
+ mCurrentEditDialog.closeEdit();
+ modeController.forceNewTransaction();
+ mCurrentEditDialog = null;
+ }
+ }
+ public void addEditorPaneListener(IEditorPaneListener l){
+ editorPaneListeners.add(l);
+ }
+
+ public void removeEditorPaneListener(IEditorPaneListener l){
+ editorPaneListeners.remove(l);
+ }
+
+ private void fireEditorPaneCreated(JEditorPane editor, Object purpose){
+ for(IEditorPaneListener l :editorPaneListeners){
+ l.editorPaneCreated(editor, purpose);
+ }
+ }
+
+ /**
+ * Note: when creating an SHTMLPanel using this method, you must make sure to attach
+ * a FreeplaneToSHTMLPropertyChangeAdapter to the panel (see for example EditNodeWYSIWYG.HTMLDialog.createEditorPanel(String))
+ * @param purpose
+ * @return
+ */
+ public SHTMLPanel createSHTMLPanel(String purpose) {
+ SHTMLPanel.setResources(new TextResources() {
+ public String getString(String pKey) {
+ if (pKey.equals("approximate_search_threshold"))
+ {
+ return new Double(StringMatchingStrategy.APPROXIMATE_MATCHING_MINPROB).toString();
+ }
+ pKey = "simplyhtml." + pKey;
+ String resourceString = ResourceController.getResourceController().getText(pKey, null);
+ if (resourceString == null) {
+ resourceString = ResourceController.getResourceController().getProperty(pKey);
+ }
+ return resourceString;
+ }
+ });
+ com.lightdev.app.shtm.ScaledStyleSheet.FONT_SCALE_FACTOR = UITools.FONT_SCALE_FACTOR;
+ SHTMLPanel.setActionBuilder(new ActionBuilder() {
+
+ public void initActions(SHTMLPanel panel) {
+ panel.addAction("editLink", new SHTMLEditLinkAction((SHTMLPanelImpl) panel));
+ panel.addAction("setLinkByFileChooser", new SHTMLSetLinkByFileChooserAction((SHTMLPanelImpl) panel));
+ }
+ });
+ final SHTMLPanel shtmlPanel = SHTMLPanel.createSHTMLPanel();
+ shtmlPanel.setOpenHyperlinkHandler(new ActionListener(){
+
+ public void actionPerformed(ActionEvent pE) {
+ try {
+ UrlManager.getController().loadURL(new URI(pE.getActionCommand()));
+ } catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }});
+
+ final JEditorPane editorPane = shtmlPanel.getEditorPane();
+ editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false);
+ fireEditorPaneCreated(editorPane, purpose);
+
+ return shtmlPanel;
+ }
+
+ public JEditorPane createEditorPane(Object purpose) {
+ @SuppressWarnings("serial")
+ final JEditorPane editorPane = new JEditorPane(){
+
+ @Override
+ public String getSelectedText() {
+ final String selectedText = super.getSelectedText();
+ return selectedText != null ? selectedText.replace('\u00a0', ' ') : null;
+ }
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ try {
+ super.paintComponent(g);
+ }
+ catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+
+ };
+ editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false);
+ fireEditorPaneCreated(editorPane, purpose);
+ return editorPane;
+ }
+
+ public EventBuffer getEventQueue() {
+ return eventQueue;
+ }
+
+ private String makePlainIfNoFormattingFound(String text) {
+ if(HtmlUtils.isHtmlNode(text)){
+ text = removeHtmlHead(text);
+ if(! containsFormatting(text)){
+ text = HtmlUtils.htmlToPlain(text);
+ }
+ }
+ text = text.replaceFirst("\\s+$", "");
+ return text;
+ }
+
+ private String removeHtmlHead(String text) {
+ return HTML_HEAD.matcher(text).replaceFirst("");
+ }
+
+ @Override
+ public boolean canEdit() {
+ return true;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/SHTMLEditLinkAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SHTMLEditLinkAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/mindmapmode/SHTMLEditLinkAction.java
rename to freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SHTMLEditLinkAction.java
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/SHTMLSetLinkByFileChooserAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SHTMLSetLinkByFileChooserAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/mindmapmode/SHTMLSetLinkByFileChooserAction.java
rename to freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SHTMLSetLinkByFileChooserAction.java
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/SetImageByFileChooserAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SetImageByFileChooserAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/mindmapmode/SetImageByFileChooserAction.java
rename to freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SetImageByFileChooserAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SortNodes.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SortNodes.java
new file mode 100644
index 0000000..0d61458
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SortNodes.java
@@ -0,0 +1,76 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Vector;
+
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.TextController;
+
+/**
+ * @author foltin
+ */
+public class SortNodes extends AMultipleNodeAction {
+ final private class NodeTextComparator implements Comparator<Object> {
+ public int compare(final Object pArg0, final Object pArg1) {
+ if (pArg0 instanceof NodeModel) {
+ final NodeModel node1 = (NodeModel) pArg0;
+ if (pArg1 instanceof NodeModel) {
+ final NodeModel node2 = (NodeModel) pArg1;
+ final String nodeText1 = TextController.getController().getPlainTextContent(node1);
+ final String nodeText2 = TextController.getController().getPlainTextContent(node2);
+ return nodeText1.compareToIgnoreCase(nodeText2);
+ }
+ }
+ return 0;
+ }
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * @param controller
+ *
+ */
+ public SortNodes() {
+ super("SortNodes");
+ }
+
+ @Override
+ protected void actionPerformed(final ActionEvent e, final NodeModel node) {
+ final Vector<NodeModel> sortVector = new Vector<NodeModel>();
+ sortVector.addAll(node.getChildren());
+ Collections.sort(sortVector, new NodeTextComparator());
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ int i = 0;
+ for (final NodeModel child : sortVector) {
+ ((FreeNode)Controller.getCurrentModeController().getExtension(FreeNode.class)).undoableDeactivateHook(child);
+ mapController.moveNode(child, i++);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SplitNode.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SplitNode.java
new file mode 100644
index 0000000..f484500
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SplitNode.java
@@ -0,0 +1,170 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.util.Collection;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.html.HTML;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.FixedHTMLWriter;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.features.text.TextController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class SplitNode extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public SplitNode() {
+ super("SplitNode");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.extensions.NodeHook#invoke(freeplane.modes.MindMapNode,
+ * java.util.List)
+ */
+ public void actionPerformed(final ActionEvent e) {
+ final Collection<NodeModel> list = Controller.getCurrentModeController().getMapController().getSelectedNodes();
+ for (NodeModel next : list) {
+ splitNode(next);
+ }
+ }
+
+ private Element getParentElement(final HTMLDocument doc) {
+ final Element htmlRoot = doc.getDefaultRootElement();
+ Element parentCandidate = htmlRoot.getElement(htmlRoot.getElementCount() - 1);
+ do {
+ if (parentCandidate.getElementCount() > 1) {
+ return parentCandidate;
+ }
+ parentCandidate = parentCandidate.getElement(0);
+ } while (!(parentCandidate.isLeaf() || parentCandidate.getName().equalsIgnoreCase("p-implied")));
+ return null;
+ }
+
+ private void splitNode(final NodeModel node) {
+ if (node.isRoot()) {
+ return;
+ }
+ final String text = node.getText();
+ final String[] parts = splitNode(text);
+ if (parts == null || parts.length == 1) {
+ return;
+ }
+ final ModeController c = Controller.getCurrentModeController();
+ int firstPartNumber = 0;
+ while (parts[firstPartNumber] == null) {
+ firstPartNumber++;
+ }
+ ((MTextController) TextController.getController()).setNodeText(node, parts[firstPartNumber]);
+ final NodeModel parent = node.getParentNode();
+ final int nodePosition = parent.getIndex(node) + 1;
+ for (int i = parts.length - 1; i > firstPartNumber; i--) {
+ final MMapController mapController = (MMapController) c.getMapController();
+ final String part = parts[i];
+ if (part == null) {
+ continue;
+ }
+ final NodeModel lowerNode = mapController.addNewNode(parent, nodePosition, node.isLeft());
+ ((MTextController) TextController.getController()).setNodeText(lowerNode, part);
+ final MNodeStyleController nodeStyleController = (MNodeStyleController) NodeStyleController
+ .getController();
+ nodeStyleController.copyStyle(node, lowerNode);
+ mapController.setFolded(lowerNode, !lowerNode.isFolded());
+ }
+ }
+
+ private String[] splitNode(final String text) {
+ if (text.startsWith("<html>")) {
+ String[] parts = null;
+ final HTMLEditorKit kit = new HTMLEditorKit();
+ final HTMLDocument doc = new HTMLDocument();
+ final StringReader buf = new StringReader(text);
+ try {
+ kit.read(buf, doc, 0);
+ final Element parent = getParentElement(doc);
+ if (parent == null) {
+ return null;
+ }
+ final int elementCount = parent.getElementCount();
+ int notEmptyElementCount = 0;
+ parts = new String[elementCount];
+ int start = parent.getStartOffset();
+ for (int i = 0; i < elementCount; i++) {
+ final Element current = parent.getElement(i);
+ if(current.isLeaf() && ! current.getName().equals(HTML.Tag.BR.toString()) && i < elementCount - 1)
+ continue;
+ final int end = current.getEndOffset();
+ final String newFragment = getFragment(doc, start, end);
+ if(newFragment != null ){
+ parts[i] = newFragment;
+ notEmptyElementCount++;
+ }
+ start = end;
+ }
+ if (notEmptyElementCount <= 1) {
+ return null;
+ }
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ catch (final BadLocationException e) {
+ LogUtils.severe(e);
+ }
+ return parts;
+ }
+ return text.split("\n");
+ }
+
+ private String getFragment(final HTMLDocument doc, int start, final int end)
+ throws BadLocationException, IOException {
+ final String paragraphText = doc.getText(start, end - start).trim();
+ if (paragraphText.length() > 0) {
+ final StringWriter out = new StringWriter();
+ new FixedHTMLWriter(out, doc, start, end - start).write();
+ final String fragment = out.toString();
+ if (!fragment.equals("")) {
+ return fragment;
+ }
+ }
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SplitToWordsAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SplitToWordsAction.java
new file mode 100644
index 0000000..4838a5a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/SplitToWordsAction.java
@@ -0,0 +1,162 @@
+package org.freeplane.features.text.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AMultipleNodeAction;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.TransformationException;
+
+ at SuppressWarnings("serial")
+public class SplitToWordsAction extends AMultipleNodeAction{
+
+ static class PatternMaker {
+ static final Pattern ESCAPED_CHARACTERS = Pattern.compile("[\\[\\]\\-\\&\\\\\\^]");
+ static final Pattern WHITE_SPACE = Pattern.compile("\\s+");
+ static String escape(final String characters) {
+ final String withoutWhiteSpace = WHITE_SPACE.matcher(characters).replaceAll("");
+ return ESCAPED_CHARACTERS.matcher(withoutWhiteSpace).replaceAll("\\\\$0");
+ }
+
+ }
+
+ static{
+ ResourceController.getResourceController().setDefaultProperty("SplitToWordsAction.auxiliaryWordList", TextUtils.getText("defaultAuxiliaryWordList"));
+ }
+
+ private final int nodeNumberInLine;
+
+ public SplitToWordsAction(int nodeNumberInLine) {
+ super(createActionKey(nodeNumberInLine), createActionText(nodeNumberInLine), null);
+ auxiliaryWords = Collections.emptySet();
+ this.nodeNumberInLine = nodeNumberInLine;
+ }
+
+ public static String createActionText(int nodeNumberInLine) {
+ final String key = SplitToWordsAction.class.getSimpleName() + ".text";
+ return TextUtils.format(key, nodeNumberInLine);
+ }
+
+ public static String createActionKey(int nodeNumberInLine) {
+ return SplitToWordsAction.class.getSimpleName() + "." + nodeNumberInLine;
+ }
+
+ private static String charactersAcceptedInWord;
+ private static String numberRegularExpression;
+ private static String wordRegularExpression;
+ private static String wordOrNumberRegularExpression;
+ private static Pattern compiledWordPattern;
+ private Collection<String> auxiliaryWords;
+ private boolean leaveOriginalNodeEmpty;
+ private boolean saveOriginalTextAsDetails;
+
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ compileWordPattern();
+ String auxiliaryWordList = ResourceController.getResourceController().getProperty("SplitToWordsAction.auxiliaryWordList").toLowerCase();
+ auxiliaryWords = Arrays.asList(auxiliaryWordList.split("\\s*,\\s*"));
+ leaveOriginalNodeEmpty = ResourceController.getResourceController().getBooleanProperty("SplitToWordsAction.leaveOriginalNodeEmpty");
+ saveOriginalTextAsDetails = ResourceController.getResourceController().getBooleanProperty("SplitToWordsAction.saveOriginalTextAsDetails");
+ super.actionPerformed(e);
+ }
+
+ void compileWordPattern() {
+ charactersAcceptedInWord = charactersAcceptedInWords();
+ wordRegularExpression = "[\\p{L}\\d" + charactersAcceptedInWord + "]+";
+ numberRegularExpression = "-?\\d+(?:[,.]\\d+)*";
+ final String newRegularExpression = numberRegularExpression+"|"+wordRegularExpression;
+ if(! newRegularExpression.equals(wordOrNumberRegularExpression)) {
+ wordOrNumberRegularExpression = newRegularExpression;
+ compiledWordPattern = Pattern.compile(wordOrNumberRegularExpression);
+ }
+ }
+
+ private String charactersAcceptedInWords() {
+ final String characters = ResourceController.getResourceController().getProperty("SplitToWordsAction.charactersAcceptedInWord");
+ return PatternMaker.escape(characters);
+ }
+
+ @Override
+ protected void actionPerformed(ActionEvent e, NodeModel node) {
+
+ final ModeController modeController = Controller.getCurrentModeController();
+ MTextController textController = (MTextController) modeController.getExtension(TextController.class);
+ final MMapController mapController = (MMapController) modeController.getMapController();
+ String details;
+ try {
+ details = textController.getTransformedObject(node).toString();
+ } catch (TransformationException e1) {
+ return;
+ }
+ String plainText = HtmlUtils.htmlToPlain(details).trim();
+
+
+ int nodeCountInLine;
+ boolean newNode;
+
+ if(leaveOriginalNodeEmpty){
+ nodeCountInLine = 0;
+ newNode = true;
+ textController.setNodeText(node, "");
+ }
+ else{
+ nodeCountInLine = -1;
+ newNode = false;
+ }
+
+ NodeModel currentNode = node;
+ final Matcher matcher = compiledWordPattern.matcher(plainText);
+ while (matcher.find()){
+ String word = matcher.group();
+ final String currentText;
+ if(newNode) {
+ if (nodeCountInLine == nodeNumberInLine) {
+ nodeCountInLine = 0;
+ currentNode = node;
+ }
+ currentNode = mapController.addNewNode(currentNode, currentNode.getChildCount(), currentNode.isLeft());
+ nodeCountInLine++;
+ currentText = "";
+ }
+ else if (nodeCountInLine == -1){
+ nodeCountInLine = 0;
+ currentNode = node;
+ currentText = "";
+ }
+ else
+ currentText = currentNode.getText() + ' ';
+
+ boolean auxiliaryWord = auxiliaryWords.contains(word.toLowerCase());
+
+ if (! auxiliaryWord) {
+ textController.setNodeText(currentNode, currentText + capitalize(word));
+ newNode = true;
+ }
+ else {
+ textController.setNodeText(currentNode, currentText + word);
+ newNode = false;
+ }
+ }
+ if(saveOriginalTextAsDetails) {
+ textController.setDetails(currentNode, HtmlUtils.isHtmlNode(details) ? details : HtmlUtils.plainToHTML(details));
+ textController.setIsMinimized(currentNode, true);
+ }
+ }
+
+ private String capitalize(String word) {
+ return word.substring(0, 1).toUpperCase() + word.substring(1);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/UsePlainTextAction.java b/freeplane/src/main/java/org/freeplane/features/text/mindmapmode/UsePlainTextAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/text/mindmapmode/UsePlainTextAction.java
rename to freeplane/src/main/java/org/freeplane/features/text/mindmapmode/UsePlainTextAction.java
diff --git a/freeplane/src/org/freeplane/features/time/CreationModificationPlugin.java b/freeplane/src/main/java/org/freeplane/features/time/CreationModificationPlugin.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/time/CreationModificationPlugin.java
rename to freeplane/src/main/java/org/freeplane/features/time/CreationModificationPlugin.java
diff --git a/freeplane/src/org/freeplane/features/time/TimeComboBoxEditor.java b/freeplane/src/main/java/org/freeplane/features/time/TimeComboBoxEditor.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/time/TimeComboBoxEditor.java
rename to freeplane/src/main/java/org/freeplane/features/time/TimeComboBoxEditor.java
diff --git a/freeplane/src/main/java/org/freeplane/features/time/TimeCondition.java b/freeplane/src/main/java/org/freeplane/features/time/TimeCondition.java
new file mode 100644
index 0000000..cc36f6e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/time/TimeCondition.java
@@ -0,0 +1,69 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.time;
+
+import java.util.Date;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public abstract class TimeCondition extends ASelectableCondition {
+ static final String DATE = "DATE";
+ static final String FILTER_CREATED_AFTER = "filter_created_after";
+ static final String FILTER_CREATED_BEFORE = "filter_created_before";
+ static final String FILTER_MODIFIED_AFTER = "filter_modified_after";
+ static final String FILTER_MODIFIED_BEFORE = "filter_modified_before";
+
+ public static ASelectableCondition create(final TranslatedObject simpleCond, final FormattedDate date) {
+ if (simpleCond.objectEquals(TimeCondition.FILTER_MODIFIED_AFTER)) {
+ return new TimeConditionModifiedAfter(date);
+ }
+ if (simpleCond.objectEquals(TimeCondition.FILTER_MODIFIED_BEFORE)) {
+ return new TimeConditionModifiedBefore(date);
+ }
+ if (simpleCond.objectEquals(TimeCondition.FILTER_CREATED_AFTER)) {
+ return new TimeConditionCreatedAfter(date);
+ }
+ if (simpleCond.objectEquals(TimeCondition.FILTER_CREATED_BEFORE)) {
+ return new TimeConditionCreatedBefore(date);
+ }
+ return null;
+ }
+
+ final private FormattedDate date;
+ public TimeCondition(final FormattedDate date) {
+ this.date = date;
+ }
+
+ abstract protected String createDescription();
+
+ public Date getDate() {
+ return date;
+ }
+
+ abstract protected String getName();
+
+
+ public void fillXML(final XMLElement child) {
+ child.setAttribute(DATE, Long.toString(getDate().getTime()));
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/time/TimeConditionController.java b/freeplane/src/main/java/org/freeplane/features/time/TimeConditionController.java
new file mode 100644
index 0000000..b314e8b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/time/TimeConditionController.java
@@ -0,0 +1,141 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.time;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+public class TimeConditionController implements IElementaryConditionController {
+ static final String FILTER_TIME = "filter_time";
+// // // final private Controller controller;
+ private final ComboBoxEditor editor = new TimeComboBoxEditor(true);
+ private final ComboBoxModel values = new DefaultComboBoxModel();
+
+ public TimeConditionController() {
+ super();
+// this.controller = controller;
+ }
+
+ public boolean canEditValues(final Object property, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ return namedObject.objectEquals(TimeConditionController.FILTER_TIME);
+ }
+
+ public boolean canSelectValues(final Object property, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase,
+ final boolean matchApproximately) {
+ return TimeCondition.create(simpleCond, (FormattedDate) value);
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object property) {
+ return new DefaultComboBoxModel(getTimeConditionNames());
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(FILTER_TIME));
+ return list;
+ }
+
+ public Object[] getTimeConditionNames() {
+ return new TranslatedObject[] { TextUtils.createTranslatedString(TimeCondition.FILTER_MODIFIED_AFTER),
+ TextUtils.createTranslatedString(TimeCondition.FILTER_MODIFIED_BEFORE),
+ TextUtils.createTranslatedString(TimeCondition.FILTER_CREATED_AFTER),
+ TextUtils.createTranslatedString(TimeCondition.FILTER_CREATED_BEFORE) };
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ return editor;
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object selectedItem, TranslatedObject simpleCond) {
+ values.setSelectedItem(FormattedDate.createDefaultFormattedDate(System.currentTimeMillis(), IFormattedObject.TYPE_DATETIME));
+ return values;
+ }
+
+ public boolean isCaseDependent(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ try {
+ if (element.getName().equalsIgnoreCase(TimeConditionCreatedBefore.NAME)) {
+ final String dateString = element.getAttribute(TimeCondition.DATE, null);
+ FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
+ return new TimeConditionCreatedBefore(date);
+ }
+ if (element.getName().equalsIgnoreCase(TimeConditionCreatedAfter.NAME)) {
+ final String dateString = element.getAttribute(TimeCondition.DATE, null);
+ FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
+ return new TimeConditionCreatedAfter(date);
+ }
+ if (element.getName().equalsIgnoreCase(TimeConditionModifiedBefore.NAME)) {
+ final String dateString = element.getAttribute(TimeCondition.DATE, null);
+ FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
+ return new TimeConditionModifiedBefore(date);
+ }
+ if (element.getName().equalsIgnoreCase(TimeConditionModifiedAfter.NAME)) {
+ final String dateString = element.getAttribute(TimeCondition.DATE, null);
+ FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
+ return new TimeConditionModifiedAfter(date);
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ return null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/time/TimeConditionCreatedAfter.java b/freeplane/src/main/java/org/freeplane/features/time/TimeConditionCreatedAfter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/time/TimeConditionCreatedAfter.java
rename to freeplane/src/main/java/org/freeplane/features/time/TimeConditionCreatedAfter.java
diff --git a/freeplane/src/org/freeplane/features/time/TimeConditionCreatedBefore.java b/freeplane/src/main/java/org/freeplane/features/time/TimeConditionCreatedBefore.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/time/TimeConditionCreatedBefore.java
rename to freeplane/src/main/java/org/freeplane/features/time/TimeConditionCreatedBefore.java
diff --git a/freeplane/src/org/freeplane/features/time/TimeConditionModifiedAfter.java b/freeplane/src/main/java/org/freeplane/features/time/TimeConditionModifiedAfter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/time/TimeConditionModifiedAfter.java
rename to freeplane/src/main/java/org/freeplane/features/time/TimeConditionModifiedAfter.java
diff --git a/freeplane/src/org/freeplane/features/time/TimeConditionModifiedBefore.java b/freeplane/src/main/java/org/freeplane/features/time/TimeConditionModifiedBefore.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/time/TimeConditionModifiedBefore.java
rename to freeplane/src/main/java/org/freeplane/features/time/TimeConditionModifiedBefore.java
diff --git a/freeplane/src/main/java/org/freeplane/features/time/TimeController.java b/freeplane/src/main/java/org/freeplane/features/time/TimeController.java
new file mode 100644
index 0000000..956e47a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/time/TimeController.java
@@ -0,0 +1,33 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.time;
+
+import org.freeplane.features.filter.FilterController;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2009
+ */
+public class TimeController {
+ public static void install() {
+ FilterController.getCurrentFilterController().getConditionFactory().addConditionController(40,
+ new TimeConditionController());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/ui/CloseAction.java b/freeplane/src/main/java/org/freeplane/features/ui/CloseAction.java
new file mode 100644
index 0000000..ef8c64e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/ui/CloseAction.java
@@ -0,0 +1,44 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.ui;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+
+/** This closes only the current map */
+public class CloseAction extends AFreeplaneAction {
+ static final String NAME = "close";
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+// // final private Controller controller;
+
+ CloseAction() {
+ super("CloseAction");
+// this.controller = controller;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ Controller.getCurrentController().close(false);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/ui/CollapseableBoxBuilder.java b/freeplane/src/main/java/org/freeplane/features/ui/CollapseableBoxBuilder.java
new file mode 100644
index 0000000..bfae3a3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/ui/CollapseableBoxBuilder.java
@@ -0,0 +1,112 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.ui;
+
+import java.awt.Component;
+
+import javax.swing.Box;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.JResizer.Direction;
+import org.freeplane.core.ui.components.OneTouchCollapseResizer;
+import org.freeplane.core.ui.components.OneTouchCollapseResizer.ComponentCollapseListener;
+import org.freeplane.core.ui.components.ResizeEvent;
+import org.freeplane.core.ui.components.ResizerListener;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.02.2014
+ */
+public class CollapseableBoxBuilder {
+ private static final int DEFAULT_SIZE = 350;
+ private final FrameController frameController;
+ private String propertyNameBase;
+ private boolean resizeable = true;
+ public CollapseableBoxBuilder setResizeable(boolean resizeable) {
+ this.resizeable = resizeable;
+ return this;
+ }
+ public CollapseableBoxBuilder(final FrameController frameController){
+ this.frameController = frameController;
+
+ }
+ public CollapseableBoxBuilder setPropertyNameBase(String name) {
+ this.propertyNameBase = name;
+ return this;
+ }
+ public Box createBox(final Component component, final Direction direction) {
+ Box resisableComponent = direction.createBox();
+ UIComponentVisibilityDispatcher.install(frameController, resisableComponent, propertyNameBase);
+ final UIComponentVisibilityDispatcher dispatcher = UIComponentVisibilityDispatcher.dispatcher(resisableComponent);
+ final String sizePropertyName = dispatcher.getPropertyName() + ".size";
+ final boolean expanded = dispatcher.isVisible();
+
+ OneTouchCollapseResizer resizer = new OneTouchCollapseResizer(direction);
+ dispatcher.setResizer(resizer);
+ switch(direction){
+ case RIGHT:
+ case DOWN:
+ resisableComponent.add(resizer);
+ resisableComponent.add(component);
+ break;
+ default:
+ resisableComponent.add(component);
+ resisableComponent.add(resizer);
+ break;
+ }
+ if(resizeable){
+ try {
+ int size = ResourceController.getResourceController().getIntProperty(sizePropertyName, DEFAULT_SIZE);
+ if(size <= 10) {
+ size = DEFAULT_SIZE;
+ }
+ direction.setPreferredSize(component, size);
+ }
+ catch (Exception e) {
+ // blindly accept
+ }
+ resizer.addResizerListener(new ResizerListener() {
+ public void componentResized(ResizeEvent event) {
+ if(event.getComponent().equals(component)) {
+ ResourceController.getResourceController().setProperty(sizePropertyName, String.valueOf(direction.getPreferredSize(component)));
+ }
+ }
+
+ });
+ }
+ else
+ resizer.setSliderLocked(true);
+ resizer.addCollapseListener(new ComponentCollapseListener() {
+ public void componentCollapsed(ResizeEvent event) {
+ if(event.getComponent().equals(component)) {
+ dispatcher.setProperty(false);
+ }
+ }
+
+ public void componentExpanded(ResizeEvent event) {
+ if(event.getComponent().equals(component)) {
+ dispatcher.setProperty(true);
+ }
+ }
+ });
+ resizer.setExpanded(expanded);
+ return resisableComponent;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/ui/FrameController.java b/freeplane/src/main/java/org/freeplane/features/ui/FrameController.java
new file mode 100644
index 0000000..35b3477
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/ui/FrameController.java
@@ -0,0 +1,665 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.ui;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.GraphicsConfiguration;
+import java.awt.KeyEventDispatcher;
+import java.awt.KeyboardFocusManager;
+import java.awt.LayoutManager;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.KeyEvent;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.ComboBoxEditor;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.LookAndFeel;
+import javax.swing.RootPaneContainer;
+import javax.swing.UIManager;
+import javax.swing.UIManager.LookAndFeelInfo;
+import javax.swing.plaf.basic.BasicComboBoxEditor;
+import javax.swing.plaf.metal.MetalFileChooserUI;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.FixedBasicComboBoxEditor;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.ContainerComboBoxEditor;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.ClassLoaderFactory;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.FormattedObject;
+import org.freeplane.features.format.ScannerController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.StyleTranslatedObject;
+import org.freeplane.features.time.TimeComboBoxEditor;
+
+/**
+ * @author Dimitry Polivaev
+ */
+abstract public class FrameController implements ViewController {
+
+ private final class HorizontalToolbarPanel extends JPanel {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private HorizontalToolbarPanel(final LayoutManager layout) {
+ super(layout);
+ }
+
+ @Override
+ public void validateTree() {
+ if (!isValid()) {
+ super.validateTree();
+ resizeToolbarPane();
+ }
+ }
+
+ private void resizeToolbarPane() {
+ if (getWidth() == 0) {
+ return;
+ }
+ final Dimension oldPreferredSize = getPreferredSize();
+ final Dimension preferredSize;
+ int maxHeight = 0;
+ for(Component component : getComponents()){
+ if(component.isVisible())
+ maxHeight = Math.max(maxHeight, component.getY() + component.getHeight());
+ }
+ if (maxHeight > 0) {
+ preferredSize = new Dimension(getWidth(), maxHeight);
+ }
+ else {
+ preferredSize = new Dimension(0, 0);
+ }
+ if (oldPreferredSize.height != preferredSize.height) {
+ setPreferredSize(preferredSize);
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ getParent().invalidate();
+ ((JComponent) getMainContentPane()).revalidate();
+ }
+ });
+ }
+ }
+ }
+
+ final protected Controller controller;
+ final private JLabel status;
+ final private Map<String, Component> statusInfos;
+ final private JPanel statusPanel;
+ final private JComponent toolbarPanel[];
+
+ final private String propertyKeyPrefix;
+ public static Icon textIcon;
+ public static Icon numberIcon;
+ public static Icon dateIcon;
+ public static Icon dateTimeIcon;
+ public static Icon linkIcon;
+ public static Icon localLinkIcon;
+ private final IMapViewManager mapViewManager;
+
+ public FrameController(Controller controller, final IMapViewManager mapViewManager,
+ final String propertyKeyPrefix) {
+ super();
+ this.controller = controller;
+ this.mapViewManager = mapViewManager;
+ final ResourceController resourceController = ResourceController.getResourceController();
+ if(textIcon == null){
+ FrameController.textIcon = new ImageIcon(resourceController.getResource("/images/text.png"));
+ FrameController.numberIcon = new ImageIcon(resourceController.getResource("/images/number.png"));
+ FrameController.dateIcon = new ImageIcon(resourceController.getResource("/images/calendar_red.png"));
+ FrameController.dateTimeIcon = new ImageIcon(resourceController.getResource("/images/calendar_clock_red.png"));
+ FrameController.linkIcon = new ImageIcon(resourceController.getResource("/images/" + resourceController.getProperty("link_icon")));
+ FrameController.localLinkIcon = new ImageIcon(resourceController.getResource("/images/" + resourceController.getProperty("link_local_icon")));
+ }
+ this.propertyKeyPrefix = propertyKeyPrefix;
+ statusPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 3, 0));
+ UIComponentVisibilityDispatcher.install(this, statusPanel, "toolbarVisible");
+ status = new JLabel();
+ status.setBorder(BorderFactory.createEtchedBorder());
+ statusPanel.add(status);
+ statusInfos = new HashMap<String, Component>();
+ statusInfos.put(STANDARD_STATUS_INFO_KEY, status);
+// this.controller = controller;
+ controller.setViewController(this);
+ controller.addAction(new ToggleFullScreenAction(this));
+ controller.addAction(new CloseAction());
+
+ controller.addAction(new ToggleMenubarAction(this));
+ controller.addAction(new ToggleScrollbarsAction(this));
+ controller.addAction(new ToggleToolbarAction("ToggleToolbarAction", "/main_toolbar"));
+ controller.addAction(new ToggleToolbarAction("ToggleStatusAction", "/status"));
+ toolbarPanel = new JComponent[4];
+
+ toolbarPanel[TOP] = new HorizontalToolbarPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
+ toolbarPanel[BOTTOM] = Box.createVerticalBox();
+ toolbarPanel[LEFT] = Box.createHorizontalBox();
+ toolbarPanel[RIGHT] = Box.createVerticalBox();
+ }
+
+ public void changeNoteWindowLocation() {
+ }
+
+ public void err(final String msg) {
+ status.setText(msg);
+ }
+
+ protected Controller getController() {
+ return Controller.getCurrentController();
+ }
+
+ abstract public FreeplaneMenuBar getFreeplaneMenuBar();
+
+ /**
+ */
+ public JComponent getStatusBar() {
+ return statusPanel;
+ }
+
+ public void init(Controller controller) {
+ final JComponent mainContentPane = getMainContentPane();
+ mainContentPane.add(toolbarPanel[TOP], BorderLayout.NORTH);
+ mainContentPane.add(toolbarPanel[LEFT], BorderLayout.WEST);
+ mainContentPane.add(toolbarPanel[RIGHT], BorderLayout.EAST);
+ mainContentPane.add(toolbarPanel[BOTTOM], BorderLayout.SOUTH);
+ status.setText("");
+ mainContentPane.getRootPane().putClientProperty(Controller.class, controller);
+ }
+
+ private JComponent getMainContentPane() {
+ return (JComponent) ((RootPaneContainer)getMenuComponent()).getContentPane();
+ }
+
+ abstract public void insertComponentIntoSplitPane(JComponent noteViewerComponent);
+
+ abstract public boolean isApplet();
+
+ public boolean isMenubarVisible() {
+ return isComponentVisible("menubar");
+ }
+
+ public boolean areScrollbarsVisible() {
+ return isComponentVisible("scrollbars");
+ }
+
+ private boolean isComponentVisible(String component) {
+ final String property;
+ if (isMenuComponentInFullScreenMode()) {
+ property = component+"Visible.fullscreen";
+ }
+ else {
+ property = component +"Visible";
+ }
+ final boolean booleanProperty = ResourceController.getResourceController().getBooleanProperty(
+ getPropertyKeyPrefix() + property);
+ return booleanProperty;
+ }
+
+ protected boolean isMenuComponentInFullScreenMode() {
+ return isFullScreenEnabled(getMenuComponent());
+ }
+
+ boolean isFullScreenEnabled() {
+ return isFullScreenEnabled(getCurrentRootComponent());
+ }
+
+ boolean isFullScreenEnabled(final Component currentRootComponent) {
+ return currentRootComponent instanceof Frame && !((Frame)currentRootComponent).isResizable();
+ }
+
+
+ abstract public void openDocument(URI uri) throws IOException;
+
+ abstract public void openDocument(URL fileToUrl) throws Exception;
+
+ public void out(final String msg) {
+ status.setText(msg);
+ }
+
+ public void addStatusInfo(final String key, final String info) {
+ addStatusInfo(key, info, null, null);
+ }
+
+ public void addStatusInfo(final String key, Icon icon) {
+ addStatusInfo(key, null, icon, null);
+ }
+
+ public void addStatusInfo(final String key, final String info, Icon icon) {
+ addStatusInfo(key, info, icon, null);
+ }
+
+ public void addStatusInfo(final String key, final String info, Icon icon, final String tooltip) {
+ JLabel label = (JLabel) statusInfos.get(key);
+ if (label == null) {
+ label = new JLabel(info);
+ label.setBorder(BorderFactory.createEtchedBorder());
+ statusInfos.put(key, label);
+ statusPanel.add(label, statusPanel.getComponentCount() - 1);
+ }
+ else {
+ label.setText(info);
+ label.revalidate();
+ label.repaint();
+ }
+ label.setIcon(icon);
+ label.setToolTipText(tooltip);
+ label.setVisible(info != null || icon != null);
+ }
+
+ public void addStatusComponent(final String key, Component component) {
+ Component oldComponent = statusInfos.put(key, component);
+ if (oldComponent == null) {
+ statusPanel.add(component, statusPanel.getComponentCount() - 1);
+ }
+ else {
+ final int index = UITools.getComponentIndex(component);
+ statusPanel.remove(index);
+ statusPanel.add(component, index);
+ }
+ }
+
+ public void removeStatus(final String key) {
+ final Component oldComponent = statusInfos.remove(key);
+ if (oldComponent == null) {
+ return;
+ }
+ statusPanel.remove(oldComponent);
+ }
+
+ /**
+ *
+ */
+ abstract public void removeSplitPane();
+
+ public void saveProperties() {
+ }
+
+ public void selectMode( final ModeController oldModeController, final ModeController newModeController) {
+ if (oldModeController == newModeController) {
+ return;
+ }
+ if (oldModeController != null) {
+ final IUserInputListenerFactory userInputListenerFactory = oldModeController.getUserInputListenerFactory();
+ for (int j = 0; j < 4; j++) {
+ final Iterable<JComponent> modeToolBars = userInputListenerFactory.getToolBars(j);
+ if (modeToolBars != null) {
+ for (final Component toolBar : modeToolBars) {
+ toolbarPanel[j].remove(toolBar);
+ }
+ toolbarPanel[j].revalidate();
+ }
+ }
+ }
+ final IUserInputListenerFactory newUserInputListenerFactory = newModeController.getUserInputListenerFactory();
+ for (int j = 0; j < 4; j++) {
+ final Iterable<JComponent> newToolBars = newUserInputListenerFactory.getToolBars(j);
+ if (newToolBars != null) {
+ int i = 0;
+ for (final JComponent toolBar : newToolBars) {
+ UIComponentVisibilityDispatcher dispatcher = UIComponentVisibilityDispatcher.dispatcher(toolBar);
+ if(dispatcher != null) {
+ dispatcher.resetVisible();
+ toolbarPanel[j].add(toolBar, i++);
+ }
+ }
+ toolbarPanel[j].revalidate();
+ toolbarPanel[j].repaint();
+ }
+ }
+ setFreeplaneMenuBar(newUserInputListenerFactory.getMenuBar());
+ setUIComponentsVisible(newModeController.getController().getMapViewManager(), isMenubarVisible());
+
+ }
+
+ private void setUIComponentsVisible(IMapViewManager iMapViewManager, boolean visible) {
+ setMenubarVisible(visible);
+ }
+
+ abstract protected void setFreeplaneMenuBar(FreeplaneMenuBar menuBar);
+
+ public void setMenubarVisible(final boolean visible) {
+ setComponentVisibleProperty("menubar", visible);
+ final Component freeplaneMenuBar = getFreeplaneMenuBar();
+ freeplaneMenuBar.setVisible(visible);
+ }
+
+ public void setScrollbarsVisible(final boolean visible) {
+ setComponentVisibleProperty("scrollbars", visible);
+ }
+
+ private void setComponentVisibleProperty(final String componentName, final boolean visible) {
+ final String property;
+ if (isMenuComponentInFullScreenMode()) {
+ property = componentName+"Visible.fullscreen";
+ }
+ else {
+ property = componentName+"Visible";
+ }
+ ResourceController.getResourceController().setProperty(getPropertyKeyPrefix() + property, visible);
+ }
+
+ /**
+ * Set the Frame title with mode and file if exist
+ */
+
+ abstract public void setTitle(String frameTitle);
+
+ /**
+ * @param b
+ */
+ abstract public void setWaitingCursor(boolean b);
+
+ public void viewNumberChanged(final int number) {
+ }
+
+ static class FrameState{
+ final Rectangle bounds;
+ final int winState;
+ public FrameState(Rectangle bounds, int winState) {
+ super();
+ this.bounds = bounds;
+ this.winState = winState;
+ }
+
+ }
+
+ protected void setFullScreen(final boolean fullScreen) {
+ final JFrame frame = (JFrame) getCurrentRootComponent();
+ final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ if (fullScreen == isFullScreenEnabled()) {
+ return;
+ }
+ final Controller controller = getController();
+ ResourceController.getResourceController().firePropertyChanged(FULLSCREEN_ENABLED_PROPERTY, Boolean.toString(!fullScreen),Boolean.toString(fullScreen));
+ Iterable<Window> visibleFrames = collectVisibleFrames(frame);
+ if (fullScreen) {
+ final GraphicsConfiguration graphicsConfiguration = frame.getGraphicsConfiguration();
+ final Rectangle bounds = graphicsConfiguration.getBounds();
+ frame.getRootPane().putClientProperty(FrameState.class, new FrameState(frame.getBounds(), frame.getExtendedState()));
+ frame.getExtendedState();
+ frame.dispose();
+ frame.setExtendedState(Frame.MAXIMIZED_BOTH);
+ frame.setBounds(bounds);
+ frame.setUndecorated(true);
+ frame.setResizable(false);
+ setUIComponentsVisible(controller.getMapViewManager(), isMenubarVisible());
+ for (int j = 0; j < 4; j++) {
+ final Iterable<JComponent> toolBars = controller.getModeController().getUserInputListenerFactory()
+ .getToolBars(j);
+ for (final JComponent toolBar : toolBars) {
+ UIComponentVisibilityDispatcher.dispatcher(toolBar).resetVisible();
+ }
+ }
+ showWindows(visibleFrames);
+ }
+ else {
+ frame.dispose();
+ frame.setUndecorated(false);
+ frame.setResizable(true);
+ FrameState frameState = (FrameState) frame.getRootPane().getClientProperty(FrameState.class);
+ frame.setBounds(frameState.bounds);
+ frame.setExtendedState(frameState.winState);
+ setUIComponentsVisible(controller.getMapViewManager(), isMenubarVisible());
+ for (int j = 0; j < 4; j++) {
+ final Iterable<JComponent> toolBars = controller.getModeController().getUserInputListenerFactory()
+ .getToolBars(j);
+ for (final JComponent toolBar : toolBars) {
+ UIComponentVisibilityDispatcher.dispatcher(toolBar).resetVisible();
+ }
+ }
+ showWindows(visibleFrames);
+ }
+ if(focusOwner != null)
+ focusOwner.requestFocus();
+ }
+
+ private Collection<Window> collectVisibleFrames(Window window) {
+ if(! window.isVisible())
+ return Collections.emptyList();
+ Window[] ownedWindows = window.getOwnedWindows();
+ ArrayList<Window> visibleWindows = new ArrayList(ownedWindows.length+ 1);
+ visibleWindows.add(window);
+ for(Window child : ownedWindows){
+ visibleWindows.addAll(collectVisibleFrames(child));
+ }
+ return visibleWindows;
+ }
+
+ protected void showWindows(final Iterable<Window> windows) {
+ for(Window child : windows)
+ child.setVisible(true);
+ }
+
+ public String completeVisiblePropertyKey(final JComponent toolBar) {
+ if(toolBar == null) {
+ return null;
+ }
+ return UIComponentVisibilityDispatcher.dispatcher(toolBar).completeVisiblePropertyKey();
+ }
+
+ protected String getPropertyKeyPrefix() {
+ return propertyKeyPrefix;
+ }
+
+ public static void setLookAndFeel(final String lookAndFeel) {
+ try {
+ if (lookAndFeel.equals("default")) {
+ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ }
+ else {
+ LookAndFeelInfo[] lafInfos = UIManager.getInstalledLookAndFeels();
+ boolean setLnF = false;
+ for(LookAndFeelInfo lafInfo : lafInfos){
+ if(lafInfo.getName().equalsIgnoreCase(lookAndFeel)){
+ UIManager.setLookAndFeel(lafInfo.getClassName());
+ setLnF = true;
+ break;
+ }
+ }
+ if(!setLnF){
+ final URLClassLoader userLibClassLoader = ClassLoaderFactory.getClassLoaderForUserLib();
+ try{
+ final Class<?> lookAndFeelClass = userLibClassLoader.loadClass(lookAndFeel);
+ UIManager.setLookAndFeel((LookAndFeel)lookAndFeelClass.newInstance());
+ final ClassLoader uiClassLoader = lookAndFeelClass.getClassLoader();
+ if(userLibClassLoader != uiClassLoader)
+ userLibClassLoader.close();
+ UIManager.getDefaults().put("ClassLoader", uiClassLoader);
+ } catch (ClassNotFoundException | ClassCastException | InstantiationException e) {
+ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ Controller.getCurrentController().getResourceController().setProperty("lookandfeel", "default");
+ }
+ }
+ }
+ }
+ catch (final Exception ex) {
+ LogUtils.warn("Error while setting Look&Feel" + lookAndFeel);
+ }
+
+ UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
+
+ // Workaround for http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077418
+ // NullPointerException in WindowsFileChooserUI when system icons missing/invalid
+ // set FileChooserUI to MetalFileChooserUI if no JFileChooser can be created
+ try{
+ new JFileChooser();
+ }
+ catch (Throwable t){
+ try{
+ UIManager.getLookAndFeelDefaults().put("FileChooserUI", MetalFileChooserUI.class.getName());
+ }
+ catch (Throwable t1){
+ }
+ }
+
+ final Color color = UIManager.getColor("control");
+ if(color != null && color.getAlpha() < 255)
+ UIManager.getDefaults().put("control", Color.LIGHT_GRAY);
+ }
+
+ public void addObjectTypeInfo(Object value) {
+ if (value instanceof FormattedObject) {
+ value = ((FormattedObject) value).getObject();
+ }
+ if (value instanceof String || value instanceof StyleTranslatedObject) {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.textIcon);
+ }
+ else if (value instanceof FormattedDate) {
+ final FormattedDate fd = (FormattedDate) value;
+ if (fd.containsTime()) {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.dateTimeIcon);
+ }
+ else {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.dateIcon);
+ }
+ }
+ else if (value instanceof Number) {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.numberIcon);
+ }
+ else if (value instanceof URI) {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.linkIcon);
+ }
+ else {
+ addStatusInfo(ResourceController.OBJECT_TYPE, null, null);
+ }
+ }
+
+ public static ComboBoxEditor getTextDateTimeEditor() {
+ final ContainerComboBoxEditor editor = new ContainerComboBoxEditor();
+ final TranslatedObject keyText = new TranslatedObject("text", "1Ab");
+ final BasicComboBoxEditor textEditor = new FixedBasicComboBoxEditor(){
+ private Object oldItem;
+
+ @Override
+ public void setItem(Object object) {
+ oldItem = object;
+ if(object instanceof FormattedDate)
+ super.setItem("");
+ else
+ super.setItem(object);
+ }
+
+ @Override
+ public Object getItem() {
+ final Object item = super.getItem();
+ final Object oldItem = this.oldItem;
+ this.oldItem = null;
+ if(item != null && oldItem != null && item.toString().equals(oldItem.toString()))
+ return oldItem;
+ if(ResourceController.getResourceController().getBooleanProperty("parse_data")
+ && item instanceof String){
+ final Object scannedObject = ScannerController.getController().parse((String)item);
+ return scannedObject;
+ }
+ return item;
+ }
+
+ };
+ editor.put(keyText, textEditor);
+
+ final TranslatedObject keyDate = new TranslatedObject("date", "");
+ keyDate.setIcon(dateIcon);
+ final TimeComboBoxEditor dateComboBoxEditor = new TimeComboBoxEditor(false){
+ @Override
+ public void setItem(Object object) {
+ if(object instanceof FormattedDate && !((FormattedDate)object).containsTime())
+ super.setItem(object);
+ else
+ super.setItem(null);
+ }
+ };
+
+ dateComboBoxEditor.setItem();
+ editor.put(keyDate, dateComboBoxEditor);
+
+ final TranslatedObject keyDateTime = new TranslatedObject("date_time", "");
+ keyDateTime.setIcon(dateTimeIcon);
+ final TimeComboBoxEditor dateTimeComboBoxEditor = new TimeComboBoxEditor(true){
+ @Override
+ public void setItem(Object object) {
+ if(object instanceof FormattedDate && ((FormattedDate)object).containsTime())
+ super.setItem(object);
+ else
+ super.setItem(null);
+ }
+ };
+ dateTimeComboBoxEditor.setItem();
+ editor.put(keyDateTime, dateTimeComboBoxEditor);
+
+ return editor;
+ }
+
+ public boolean quit() {
+ return getController().getMapViewManager().closeAllMaps();
+ }
+
+ public boolean isDispatchThread() {
+ return EventQueue.isDispatchThread();
+ }
+
+ public void invokeLater(Runnable runnable) {
+ EventQueue.invokeLater(runnable);
+ }
+
+ public void invokeAndWait(Runnable runnable) throws InterruptedException, InvocationTargetException {
+ EventQueue.invokeAndWait(runnable);
+ }
+
+ public boolean isHeadless() {
+ return false;
+ }
+
+
+ @Override
+ public List<? extends Component> getMapViewVector() {
+ return mapViewManager.getMapViewVector();
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/ui/IMapViewChangeListener.java b/freeplane/src/main/java/org/freeplane/features/ui/IMapViewChangeListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/ui/IMapViewChangeListener.java
rename to freeplane/src/main/java/org/freeplane/features/ui/IMapViewChangeListener.java
diff --git a/freeplane/src/main/java/org/freeplane/features/ui/IMapViewManager.java b/freeplane/src/main/java/org/freeplane/features/ui/IMapViewManager.java
new file mode 100644
index 0000000..9327bde
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/ui/IMapViewManager.java
@@ -0,0 +1,148 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.ui;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.image.RenderedImage;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.JComboBox;
+
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * 12.01.2009
+ */
+public interface IMapViewManager {
+ public void addMapSelectionListener(final IMapSelectionListener pListener);
+
+ public void addMapViewChangeListener(final IMapViewChangeListener pListener);
+
+ /**
+ * is null if the old mode should be closed.
+ *
+ * @return true if the set command was sucessful.
+ */
+ public boolean changeToMapView(final Component newMapView);
+
+ public boolean changeToMapView(final String mapViewDisplayName);
+
+ public void changeToMap(MapModel map);
+
+ public boolean changeToMode(final String modeName);
+
+ /**
+ * Checks, whether or not a given url is already opened. Unlike
+ * tryToChangeToMapView, it does not consider the map+extension identifiers
+ * nor switches to the mapView.
+ *
+ * @return null, if not found, the map+extension identifier otherwise.
+ */
+ public String checkIfFileIsAlreadyOpened(final URL urlToCheck) throws MalformedURLException;
+
+ /**
+ * Close the currently active map, return false if closing canceled.
+ *
+ * @param withoutSave
+ * forces the closing without any save actions.
+ */
+ public boolean close(final boolean withoutSave);
+ public boolean close(final Component view, final boolean force);
+
+ public String createHtmlMap();
+
+ public RenderedImage createImage(int dpi);
+
+ public Color getBackgroundColor(NodeModel node);
+
+ public Component getComponent(NodeModel node);
+
+ public boolean isFoldedOnCurrentView(NodeModel node);
+
+ public Font getFont(NodeModel node);
+
+ /** @return an unmodifiable set of all display names of current opened maps. */
+ public List<String> getMapKeys();
+
+ public Map<String, MapModel> getMaps();
+
+ public IMapSelection getMapSelection();
+
+ public Component getMapViewComponent();
+
+ public List<? extends Component> getMapViewVector();
+
+ public ModeController getModeController(Component newMap);
+
+ public MapModel getModel();
+
+ public MapModel getModel(Component mapView);
+
+ public Component getSelectedComponent();
+
+ public Color getTextColor(NodeModel node);
+
+ public float getZoom();
+
+ public void newMapView(final MapModel map, ModeController modeController);
+
+ public void removeMapSelectionListener(final IMapSelectionListener pListener);
+
+ public void removeMapViewChangeListener(final IMapViewChangeListener pListener);
+
+ public void scrollNodeToVisible(NodeModel node);
+
+ public void setZoom(float zoom);
+
+ /**
+ * This is the question whether the map is already opened. If this is the
+ * case, the map is automatically opened + returns true. Otherwise does
+ * nothing + returns false.
+ */
+ public boolean tryToChangeToMapView(final String mapView);
+ public boolean tryToChangeToMapView(final URL url) throws MalformedURLException;
+
+ public void updateMapViewName();
+
+ public boolean isLeftTreeSupported(Component mapViewComponent);
+
+ public Map<String, MapModel> getMaps(String modename);
+
+ public List<Component> getViews(MapModel map);
+ public void obtainFocusForSelected();
+ public void setMapTitles();
+ public Object setEdgesRenderingHint(final Graphics2D g);
+ public void setTextRenderingHint(final Graphics2D g);
+ public boolean closeAllMaps();
+
+ public JComboBox createZoomBox();
+
+}
diff --git a/freeplane/src/org/freeplane/features/ui/INodeViewLifeCycleListener.java b/freeplane/src/main/java/org/freeplane/features/ui/INodeViewLifeCycleListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/ui/INodeViewLifeCycleListener.java
rename to freeplane/src/main/java/org/freeplane/features/ui/INodeViewLifeCycleListener.java
diff --git a/freeplane/src/org/freeplane/features/ui/INodeViewVisitor.java b/freeplane/src/main/java/org/freeplane/features/ui/INodeViewVisitor.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/ui/INodeViewVisitor.java
rename to freeplane/src/main/java/org/freeplane/features/ui/INodeViewVisitor.java
diff --git a/freeplane/src/org/freeplane/features/ui/NodeDragListener.java b/freeplane/src/main/java/org/freeplane/features/ui/NodeDragListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/ui/NodeDragListener.java
rename to freeplane/src/main/java/org/freeplane/features/ui/NodeDragListener.java
diff --git a/freeplane/src/org/freeplane/features/ui/ToggleFullScreenAction.java b/freeplane/src/main/java/org/freeplane/features/ui/ToggleFullScreenAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/ui/ToggleFullScreenAction.java
rename to freeplane/src/main/java/org/freeplane/features/ui/ToggleFullScreenAction.java
diff --git a/freeplane/src/org/freeplane/features/ui/ToggleMenubarAction.java b/freeplane/src/main/java/org/freeplane/features/ui/ToggleMenubarAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/ui/ToggleMenubarAction.java
rename to freeplane/src/main/java/org/freeplane/features/ui/ToggleMenubarAction.java
diff --git a/freeplane/src/org/freeplane/features/ui/ToggleScrollbarsAction.java b/freeplane/src/main/java/org/freeplane/features/ui/ToggleScrollbarsAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/ui/ToggleScrollbarsAction.java
rename to freeplane/src/main/java/org/freeplane/features/ui/ToggleScrollbarsAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/ui/ToggleToolbarAction.java b/freeplane/src/main/java/org/freeplane/features/ui/ToggleToolbarAction.java
new file mode 100644
index 0000000..32542db
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/ui/ToggleToolbarAction.java
@@ -0,0 +1,72 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.ui;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JComponent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.mode.Controller;
+
+ at SelectableAction(checkOnPopup = true)
+public class ToggleToolbarAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final String toolbarName;
+
+ public ToggleToolbarAction( final String actionName, final String toolbarName) {
+ super(actionName);
+ this.toolbarName = toolbarName;
+ }
+
+ protected JComponent getToolbar() {
+ final JComponent toolBar = Controller.getCurrentModeController().getUserInputListenerFactory().getToolBar(toolbarName);
+ return toolBar;
+ }
+
+ public void actionPerformed(final ActionEvent event) {
+ final JComponent toolBar = getToolbar();
+ if(toolBar != null)
+ UIComponentVisibilityDispatcher.dispatcher(toolBar).toggleVisibility();
+ }
+
+
+ @Override
+ public void setSelected() {
+ final boolean isVisible = isVisible();
+ setSelected(isVisible);
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+
+ public boolean isVisible() {
+ final JComponent toolBar = getToolbar();
+ return toolBar != null && UIComponentVisibilityDispatcher.dispatcher(toolBar).isVisible();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/ui/UIComponentVisibilityDispatcher.java b/freeplane/src/main/java/org/freeplane/features/ui/UIComponentVisibilityDispatcher.java
new file mode 100644
index 0000000..a60e5f1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/ui/UIComponentVisibilityDispatcher.java
@@ -0,0 +1,128 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.ui;
+
+import java.awt.Component;
+import java.awt.Container;
+
+import javax.swing.FocusManager;
+import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.OneTouchCollapseResizer;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.02.2014
+ */
+public class UIComponentVisibilityDispatcher {
+ private static String KEY = UIComponentVisibilityDispatcher.class.getName() + ".KEY";
+ private final FrameController frameController;
+ private final String key;
+ private final JComponent component;
+ private OneTouchCollapseResizer resizer;
+
+ public void setResizer(OneTouchCollapseResizer resizer) {
+ this.resizer = resizer;
+ }
+
+ public static void install(FrameController frameController, JComponent component, String key){
+ component.putClientProperty(KEY, new UIComponentVisibilityDispatcher(frameController, component, key));
+ }
+
+ public static UIComponentVisibilityDispatcher dispatcher(JComponent component){
+ return (UIComponentVisibilityDispatcher) component.getClientProperty(KEY);
+ }
+
+ public UIComponentVisibilityDispatcher(FrameController frameController, JComponent component, String key) {
+ this.frameController = frameController;
+ this.component = component;
+ this.key = key;
+ }
+
+ public String completeVisiblePropertyKey() {
+ final String completeKeyString;
+ if (frameController.isMenuComponentInFullScreenMode()) {
+ completeKeyString = key + ".fullscreen";
+ }
+ else {
+ completeKeyString = key;
+ }
+ return frameController.getPropertyKeyPrefix() + completeKeyString;
+ }
+
+ public void toggleVisibility() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final boolean wasVisible = resourceController.getBooleanProperty(getPropertyName());
+ setVisible(!wasVisible);
+ }
+
+ public void setVisible(final boolean visible) {
+ setProperty(visible);
+ makeComponentVisible(visible);
+ final Container parent = component.getParent();
+ if(parent != null)
+ ((JComponent) parent).revalidate();
+ if (!visible) {
+ Component focusOwner = FocusManager.getCurrentManager().getFocusOwner();
+ boolean toolbarLostFocus = focusOwner != null && SwingUtilities.isDescendingFrom(focusOwner, component);
+ if (toolbarLostFocus) {
+ final Component selectedComponent = Controller.getCurrentController().getMapViewManager().getSelectedComponent();
+ if (selectedComponent != null)
+ selectedComponent.requestFocus();
+ }
+ }
+
+ }
+
+ public void setProperty(final boolean visible) {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ resourceController.setProperty(getPropertyName(), visible);
+ }
+
+ private void makeComponentVisible(final boolean visible) {
+ if(resizer == null)
+ component.setVisible(visible);
+ else {
+ if (visible || frameController.isMenuComponentInFullScreenMode() && ! visible)
+ resizer.setVisible(visible);
+ resizer.setExpanded(visible);
+ }
+ }
+
+ public String getPropertyName() {
+ final String propertyName = completeVisiblePropertyKey();
+ return propertyName;
+ }
+
+ public boolean isVisible() {
+ final String completeKeyString = completeVisiblePropertyKey();
+ if (completeKeyString == null) {
+ return true;
+ }
+ return !"false".equals(ResourceController.getResourceController().getProperty(completeKeyString, "true"));
+ }
+
+ public void resetVisible() {
+ setVisible(isVisible());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/ui/ViewController.java b/freeplane/src/main/java/org/freeplane/features/ui/ViewController.java
new file mode 100644
index 0000000..30883c3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/ui/ViewController.java
@@ -0,0 +1,132 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.ui;
+
+import java.awt.Component;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URI;
+import java.net.URL;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * 24.12.2012
+ */
+public interface ViewController {
+ public static final String FULLSCREEN_ENABLED_PROPERTY = "fullscreen_enabled";
+ public static final String STANDARD_STATUS_INFO_KEY = "standard";
+ public static final int BOTTOM = 3;
+ public static final int LEFT = 1;
+ public static final int RIGHT = 2;
+ public static final int TOP = 0;
+ public static final String RESOURCE_ANTIALIAS = "antialias";
+
+ public static final String SLOW_SCROLLING = "slowScrolling";
+ public void changeNoteWindowLocation();
+
+ public void err(final String msg);
+
+ public FreeplaneMenuBar getFreeplaneMenuBar();
+
+ /**
+ */
+ public JComponent getStatusBar();
+
+ public void init(Controller controller);
+
+ public void insertComponentIntoSplitPane(JComponent noteViewerComponent);
+
+ public boolean isApplet();
+
+ public boolean isMenubarVisible();
+
+ public void openDocument(URI uri) throws IOException;
+
+ public void openDocument(URL fileToUrl) throws Exception;
+
+ public void out(final String msg);
+
+ public void addStatusInfo(final String key, final String info);
+
+ public void addStatusInfo(final String key, Icon icon);
+
+ public void addStatusInfo(final String key, final String info, Icon icon);
+
+ public void addStatusInfo(final String key, final String info, Icon icon, final String tooltip);
+
+ public void addStatusComponent(final String key, Component component);
+
+ public void removeStatus(final String key);
+
+ /**
+ *
+ */
+ public void removeSplitPane();
+
+ public void saveProperties();
+
+ public void selectMode(final ModeController oldModeController, final ModeController newModeController);
+
+ public void setMenubarVisible(final boolean visible);
+
+ /**
+ * Set the Frame title with mode and file if exist
+ */
+ public void setTitle(String frameTitle);
+
+ /**
+ * @param b
+ */
+ public void setWaitingCursor(boolean b);
+
+ public void viewNumberChanged(final int number);
+
+ public String completeVisiblePropertyKey(final JComponent toolBar);
+
+ public void addObjectTypeInfo(Object value);
+
+ public boolean quit();
+
+ public boolean isDispatchThread();
+ public void invokeLater(Runnable runnable);
+
+ public void invokeAndWait(Runnable runnable) throws InterruptedException, InvocationTargetException, ExecutionException;
+
+ public boolean isHeadless();
+
+ public boolean areScrollbarsVisible();
+
+ public void setScrollbarsVisible(boolean b);
+
+ public void previousMapView();
+
+ public void nextMapView();
+ public Component getCurrentRootComponent();
+ public Component getMenuComponent();
+ public List<? extends Component> getMapViewVector();
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/FreeplaneUriConverter.java b/freeplane/src/main/java/org/freeplane/features/url/FreeplaneUriConverter.java
new file mode 100644
index 0000000..a2a88c9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/FreeplaneUriConverter.java
@@ -0,0 +1,75 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url;
+
+import static org.freeplane.features.url.UrlManager.FREEPLANE_SCHEME;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+
+/**
+ * @author Dimitry Polivaev
+ * 12.01.2014
+ */
+public class FreeplaneUriConverter{
+ private static final String ENCODED_SPACE = "/%20";
+ private static final String ENCODED_FREEPLANE_URI_PREFIX = FREEPLANE_SCHEME + ":" + ENCODED_SPACE;
+ private static final String INTERNET_EXPLORER_FREEPLANE_URI_PREFIX = FREEPLANE_SCHEME + ":" + "/ ";
+ private static final String MS_OFFICE_FREEPLANE_URI_PREFIX = FREEPLANE_SCHEME + ":" + "// ";
+ private static final String[] MICROSOFT_URI_PREFIXES = new String[] {INTERNET_EXPLORER_FREEPLANE_URI_PREFIX, MS_OFFICE_FREEPLANE_URI_PREFIX};
+
+ public String freeplaneUriForFile(final String fileBasedUri) {
+ return ENCODED_FREEPLANE_URI_PREFIX + fileBasedUri.substring(UrlManager.FILE_SCHEME.length() + 1);
+ }
+
+ public URL freeplaneUrl(URI uri) throws MalformedURLException {
+ final String scheme = uri.getScheme();
+ if(FREEPLANE_SCHEME.equals(scheme)){
+ return new URL(UrlManager.FILE_SCHEME, uri.getHost(), uri.getPath().substring(2));
+ }
+ else
+ return new URL(scheme, uri.getHost(), uri.getPath());
+ }
+
+ public String fixPartiallyDecodedFreeplaneUriComingFromInternetExplorer(String uriCandidate) {
+ for (String microsoftPrefix : MICROSOFT_URI_PREFIXES)
+ if(uriCandidate.startsWith(microsoftPrefix)){
+ int referenceStart = uriCandidate.indexOf('#');
+ if(referenceStart == -1)
+ referenceStart = uriCandidate.length();
+ URI uri;
+ try {
+ String path = uriCandidate.substring(microsoftPrefix.length(), referenceStart);
+ uri = new URI(FREEPLANE_SCHEME, path, null);
+ String encodedPath = uri.getRawPath();
+ return ENCODED_FREEPLANE_URI_PREFIX + encodedPath + uriCandidate.substring(referenceStart);
+ }
+ catch (URISyntaxException e) {
+ return uriCandidate;
+ }
+ }
+ return uriCandidate;
+
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/url/IMapConverter.java b/freeplane/src/main/java/org/freeplane/features/url/IMapConverter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/IMapConverter.java
rename to freeplane/src/main/java/org/freeplane/features/url/IMapConverter.java
diff --git a/freeplane/src/org/freeplane/features/url/IMapInputStreamConverter.java b/freeplane/src/main/java/org/freeplane/features/url/IMapInputStreamConverter.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/IMapInputStreamConverter.java
rename to freeplane/src/main/java/org/freeplane/features/url/IMapInputStreamConverter.java
diff --git a/freeplane/src/org/freeplane/features/url/MapConversionException.java b/freeplane/src/main/java/org/freeplane/features/url/MapConversionException.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/MapConversionException.java
rename to freeplane/src/main/java/org/freeplane/features/url/MapConversionException.java
diff --git a/freeplane/src/main/java/org/freeplane/features/url/MapVersionInterpreter.java b/freeplane/src/main/java/org/freeplane/features/url/MapVersionInterpreter.java
new file mode 100644
index 0000000..43ad4f5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/MapVersionInterpreter.java
@@ -0,0 +1,152 @@
+package org.freeplane.features.url;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.core.util.XsltPipeReaderFactory;
+import org.freeplane.features.map.MapModel;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+public class MapVersionInterpreter implements IExtension{
+/*
+ FREEPLANE1_2_0("freeplane 1.2.0", false, false, "Freeplane", "freeplane.url"),
+ FREEPLANE1_1("0.9.0", false, false, "Freeplane", "freeplane.url"),
+ FREEMIND_1("1.", false, true, "FreeMind", "freemind.url"),
+ DOCEAR("docear ", false, true, "Docear", "docear.url"),
+
+*/
+ static final public IMapInputStreamConverter DEFAULT_INPUTSTREAM_CONVERTER = new IMapInputStreamConverter() {
+ private static final String FREEPLANE_VERSION_UPDATER_XSLT = "/xslt/freeplane_version_updater.xslt";
+ public Reader getConvertedStream(File f) throws FileNotFoundException, IOException {
+ return new XsltPipeReaderFactory(FREEPLANE_VERSION_UPDATER_XSLT).getReader(new FileInputStream(f));
+ }
+ };
+ static final public MapVersionInterpreter DEFAULT = new MapVersionInterpreter("", 0, "", true, true, null, null);
+ final public String mapBegin;
+ final public String name;
+ final public int version;
+ final public boolean needsConversion;
+ final public boolean anotherDialect;
+ final public String appName;
+ final public String url;
+ final public IMapInputStreamConverter inputStreamConverter;
+ final public IMapConverter mapConverter;
+
+ MapVersionInterpreter(String name, int version, String versionBegin, boolean needsConversion, boolean anotherDialect,
+ String appName, String url) {
+ this(name, version, versionBegin, needsConversion, anotherDialect, appName, url, DEFAULT_INPUTSTREAM_CONVERTER, null);
+ }
+
+ public MapVersionInterpreter(String name, int version, String versionBegin, boolean needsConversion, boolean anotherDialect,
+ String appName, String url, IMapInputStreamConverter inputStreamConverter, IMapConverter mapConverter) {
+
+ this.inputStreamConverter = inputStreamConverter;
+ this.mapConverter = mapConverter;
+
+ this.name = name;
+ this.version = version;
+ this.mapBegin = "<map version=\"" + versionBegin;
+ this.needsConversion = needsConversion;
+ this.anotherDialect = anotherDialect;
+ this.appName = appName;
+ this.url = url;
+ }
+
+ public static MapVersionInterpreter getVersionInterpreter(String mapBegin){
+ for (MapVersionInterpreter interpreter : MapVersionInterpreter.values()){
+ if(interpreter.knows(mapBegin))
+ return interpreter;
+ }
+ return DEFAULT;
+ }
+
+ private static MapVersionInterpreter[] values = null;
+ private static MapVersionInterpreter[] values() {
+ if(values == null){
+ try {
+ DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder documentBuilder = domFactory.newDocumentBuilder();
+ InputStream resource = ResourceController.getResourceController().getResource("/xml/mapVersions.xml").openStream();
+ Document dom = documentBuilder.parse(resource);
+ Element root = dom.getDocumentElement();
+ NodeList dialectElements = root.getElementsByTagName("dialect");
+ final int dialectNumber = dialectElements.getLength();
+ values = new MapVersionInterpreter[dialectNumber];
+ for(int i = 0; i < dialectNumber; i++){
+ Element dialectElement = (Element) dialectElements.item(i);
+ String versionBegin = dialectElement.getAttribute("versionBegin");
+ boolean needsConversion = Boolean.parseBoolean(dialectElement.getAttribute("needsConversion"));
+ boolean anotherDialect = Boolean.parseBoolean(dialectElement.getAttribute("anotherDialect"));
+ String name = dialectElement.getAttribute("name");
+ String appName = dialectElement.getAttribute("appName");
+ String url = dialectElement.getAttribute("url");
+ int version = Integer.parseInt(dialectElement.getAttribute("version"));
+ values[i] = new MapVersionInterpreter(name, version, versionBegin, needsConversion, anotherDialect, appName, url);
+ }
+ resource.close();
+ } catch (Exception e) {
+ LogUtils.severe(e);
+ values = new MapVersionInterpreter[]{};
+ }
+ }
+ return values;
+ }
+
+ public static void addMapVersionInterpreter(MapVersionInterpreter interpreter) {
+ ArrayList<MapVersionInterpreter> list = new ArrayList<MapVersionInterpreter>();
+ list.add(interpreter);
+ list.addAll(Arrays.asList(values()));
+ values = list.toArray(values);
+ }
+
+ private boolean knows(String mapBegin) {
+ return mapBegin.startsWith(this.mapBegin);
+ }
+
+ public IMapConverter getMapConverter() {
+ return this.mapConverter;
+ }
+
+ public IMapInputStreamConverter getMapInputStreamConverter() {
+ return this.inputStreamConverter;
+ }
+
+ public String getDialectInfo(String path){
+ final String appInfo;
+ if(appName != null) {
+ if("Freeplane".equals(appName))
+ appInfo = TextUtils.format("dialect_info.later_version", path);
+ else
+ appInfo = TextUtils.format("dialect_info.app", path, appName);
+ }
+ else
+ appInfo = TextUtils.format("dialect_info.unknownApp", path);
+ final String warning = TextUtils.getText("dialect_info.warning");
+ final String urlInfo;
+ if(url != null)
+ urlInfo = TextUtils.format("dialect_info.url", url);
+ else
+ urlInfo = TextUtils.getText("dialect_info.unknownURL");
+ return appInfo +" "+ warning +" "+ urlInfo;
+ }
+
+ static public boolean isOlderThan(MapModel map, int version){
+ MapVersionInterpreter versionInterpreter = map.getExtension(MapVersionInterpreter.class);
+ return versionInterpreter != null && versionInterpreter.version < version;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/NodeAndMapReference.java b/freeplane/src/main/java/org/freeplane/features/url/NodeAndMapReference.java
new file mode 100644
index 0000000..4ac0eea
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/NodeAndMapReference.java
@@ -0,0 +1,39 @@
+package org.freeplane.features.url;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class NodeAndMapReference {
+ private static final Pattern FREEPLANE_MAP_WITH_NODE_ID = Pattern.compile("\\.mm#(ID_\\d+)$", Pattern.CASE_INSENSITIVE);
+ final private String nodeReference;
+ final private String mapReference;
+ final private boolean hasFreeplaneFileExtension;
+ public NodeAndMapReference(String nodeInMapReference) {
+ final boolean hasFreeplaneFileExtension = nodeInMapReference.toLowerCase().endsWith(
+ UrlManager.FREEPLANE_FILE_EXTENSION);
+ String mapReference = nodeInMapReference;
+ String nodeReference = null;
+ if (! hasFreeplaneFileExtension) {
+ final Matcher matcher = FREEPLANE_MAP_WITH_NODE_ID.matcher(nodeInMapReference);
+ if(matcher.find()) {
+ nodeReference = matcher.group(1);
+ mapReference = nodeInMapReference.substring(0, matcher.start(1) - 1);
+ }
+ }
+ this.mapReference = mapReference;
+ this.nodeReference = nodeReference;
+ this.hasFreeplaneFileExtension = mapReference.toLowerCase().endsWith(UrlManager.FREEPLANE_FILE_EXTENSION);
+ }
+ public boolean hasFreeplaneFileExtension() {
+ return hasFreeplaneFileExtension;
+ }
+ public String getNodeReference() {
+ return nodeReference;
+ }
+ public boolean hasNodeReference() {
+ return nodeReference != null;
+ }
+ public String getMapReference() {
+ return mapReference;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/UrlManager.java b/freeplane/src/main/java/org/freeplane/features/url/UrlManager.java
new file mode 100644
index 0000000..5f00b95
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/UrlManager.java
@@ -0,0 +1,530 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url;
+
+import static java.util.Arrays.asList;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.HeadlessException;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import javax.swing.AbstractAction;
+import javax.swing.ActionMap;
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.KeyStroke;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mapio.MapIO;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.main.application.ApplicationResourceController;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.n3.nanoxml.XMLParseException;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class UrlManager implements IExtension {
+ public static final String SMB_SCHEME = "smb";
+ public static final String FREEPLANE_SCHEME = "freeplane";
+ public static final String FILE_SCHEME = "file";
+ public static final String FREEPLANE_FILE_EXTENSION_WITHOUT_DOT = "mm";
+ public static final String FREEPLANE_FILE_EXTENSION = "." + FREEPLANE_FILE_EXTENSION_WITHOUT_DOT;
+ public static final String FREEPLANE_ADD_ON_FILE_EXTENSION = ".addon." + FREEPLANE_FILE_EXTENSION_WITHOUT_DOT;
+ private File lastCurrentDir = null;
+ public static final String MAP_URL = "map_url";
+
+ public static UrlManager getController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ return modeController.getExtension(UrlManager.class);
+ }
+
+ public static void install( final UrlManager urlManager) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addExtension(UrlManager.class, urlManager);
+ urlManager.init();
+ }
+
+// // final private Controller controller;
+// final private ModeController modeController;
+
+ public UrlManager() {
+ super();
+ }
+
+ protected void init() {
+// this.modeController = modeController;
+// controller = modeController.getController();
+ createActions();
+ }
+
+ /**
+ *
+ */
+ private void createActions() {
+ }
+
+ public JFileChooser getFileChooser(final FileFilter filter, boolean useDirectorySelector) {
+ return getFileChooser(filter, useDirectorySelector, false);
+ }
+
+ /**
+ * Creates a file chooser with the last selected directory as default.
+ * @param useDirectorySelector
+ */
+ @SuppressWarnings("serial")
+ public JFileChooser getFileChooser(final FileFilter filter, boolean useDirectorySelector, boolean showHiddenFiles) {
+ final File parentFile = getMapsParentFile(Controller.getCurrentController().getMap());
+ if (parentFile != null && getLastCurrentDir() == null) {
+ setLastCurrentDir(parentFile);
+ }
+ final JFileChooser chooser = new JFileChooser(){
+ @Override
+ protected JDialog createDialog(Component parent) throws HeadlessException {
+ final JDialog dialog = super.createDialog(parent);
+ final JComponent selector = createDirectorySelector(this);
+
+ //Close dialog when escape is pressed
+ InputMap in = dialog.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
+ in.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0), "escape");
+ ActionMap aMap = dialog.getRootPane().getActionMap();
+ aMap.put("escape", new AbstractAction()
+ {
+ public void actionPerformed (ActionEvent e)
+ {
+ dialog.dispose();
+ }
+ });
+ if(selector != null){
+ dialog.getContentPane().add(selector, BorderLayout.NORTH);
+ dialog.pack();
+ }
+
+ return dialog;
+ }
+
+ };
+ if (getLastCurrentDir() != null) {
+ chooser.setCurrentDirectory(getLastCurrentDir());
+ }
+ if (showHiddenFiles) {
+ chooser.setFileHidingEnabled(false);
+ }
+ if (filter != null) {
+ chooser.addChoosableFileFilter(filter);
+ chooser.setFileFilter(filter);
+ }
+ return chooser;
+ }
+
+ protected JComponent createDirectorySelector(JFileChooser chooser) {
+ return null;
+ }
+ public File getLastCurrentDir() {
+ return lastCurrentDir;
+ }
+
+ protected File getMapsParentFile(final MapModel map) {
+ if ((map != null) && (map.getFile() != null) && (map.getFile().getParentFile() != null)) {
+ return map.getFile().getParentFile();
+ }
+ return null;
+ }
+
+ public void handleLoadingException(final Exception ex) {
+ final String exceptionType = ex.getClass().getName();
+ if (exceptionType.equals(XMLParseException.class.getName())) {
+ final int showDetail = JOptionPane.showConfirmDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent(),
+ TextUtils.getText("map_corrupted"), "Freeplane", JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE);
+ if (showDetail == JOptionPane.YES_OPTION) {
+ UITools.errorMessage(ex);
+ }
+ }
+ else if (exceptionType.equals(FileNotFoundException.class.getName())) {
+ UITools.errorMessage(ex.getMessage());
+ }
+ else if (exceptionType.equals("org.freeplane.features.url.mindmapmode.SkipException")) {
+ return;
+ }
+ else {
+ LogUtils.severe(ex);
+ UITools.errorMessage(ex);
+ }
+ }
+
+ /**@deprecated -- use {@link MapIO#loadCatchExceptions(URL url, MapModel map)} */
+ @Deprecated
+ public boolean loadCatchExceptions(final URL url, final MapModel map){
+ InputStreamReader urlStreamReader = null;
+ try {
+ urlStreamReader = load(url, map);
+ return true;
+ }
+ catch (final XMLException ex) {
+ LogUtils.warn(ex);
+ }
+ catch (final IOException ex) {
+ LogUtils.warn(ex);
+ }
+ catch (final RuntimeException ex) {
+ LogUtils.severe(ex);
+ }
+ finally {
+ FileUtils.silentlyClose(urlStreamReader);
+ }
+ UITools.errorMessage(TextUtils.format("url_open_error", url.toString()));
+ return false;
+ }
+
+
+ /**@deprecated -- use {@link MapIO#load(URL url, MapModel map)} */
+ @Deprecated
+ public InputStreamReader load(final URL url, final MapModel map)
+ throws IOException, XMLException {
+ InputStreamReader urlStreamReader;
+ setURL(map, url);
+ InputStream inputStream = getLocation(url).openStream();
+ urlStreamReader = new InputStreamReader(inputStream);
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.getMapController().getMapReader().createNodeTreeFromXml(map, urlStreamReader, Mode.FILE);
+ return urlStreamReader;
+ }
+
+ private URL getLocation(final URL url) throws IOException {
+ URLConnection connection = url.openConnection();
+ if(connection instanceof HttpURLConnection){
+ int responseCode = ((HttpURLConnection)connection).getResponseCode();
+ if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP
+ || responseCode == HttpURLConnection.HTTP_MOVED_PERM
+ || responseCode == HttpURLConnection.HTTP_SEE_OTHER){
+ String redirectUrl = connection.getHeaderField("Location");
+ return getLocation(new URL(redirectUrl));
+ }
+ }
+ return url;
+ }
+
+ /**@deprecated -- use {@link MapIO#load(URL url, MapModel map)} */
+ @Deprecated
+ public boolean loadImpl(final URL url, final MapModel map){
+ return loadCatchExceptions(url, map);
+ }
+
+ /**@deprecated -- use LinkController*/
+ @Deprecated
+ public void loadURL(URI uri) {
+ final String uriString = uri.toString();
+ if (uriString.startsWith("#")) {
+ loadLocalLinkURI(uriString);
+ }
+ else {
+ final NodeAndMapReference nodeAndMapReference = new NodeAndMapReference(uriString);
+ if (nodeAndMapReference.hasNodeReference()) {
+ loadNodeReferenceURI(nodeAndMapReference);
+ }
+ else {
+ loadOtherURI(uri, nodeAndMapReference.hasFreeplaneFileExtension());
+ }
+ }
+ }
+
+ private void loadLocalLinkURI(final String uriString) {
+ final String target = uriString.substring(1);
+ selectNode(target);
+ }
+
+ private void selectNode(final String target) {
+ try {
+ final MapController mapController = getMapController();
+ final NodeModel node = mapController.getNodeFromID(target);
+ if (node != null) {
+ mapController.select(node);
+ }
+ else {
+ final String errorMessage = TextUtils.format("link_not_found", target);
+ Controller.getCurrentController().getViewController().err(errorMessage);
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe("link " + target + " not found", e);
+ }
+ }
+
+ private void loadNodeReferenceURI(final NodeAndMapReference nodeAndMapReference) {
+ try {
+ loadURL(new URI(nodeAndMapReference.getMapReference()));
+ selectNode(nodeAndMapReference.getNodeReference());
+ } catch (URISyntaxException e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ private void loadOtherURI(URI uri, final boolean hasFreeplaneFileExtension) {
+ try {
+ if(! uri.isAbsolute()){
+ URI absoluteUri = getAbsoluteUri(uri);
+ if (absoluteUri == null) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ if (map.getURL() == null)
+ UITools.errorMessage(TextUtils.getText("map_not_saved"));
+ else
+ UITools.errorMessage(TextUtils.format("link_not_found", String.valueOf(uri)));
+ return;
+ }
+ uri = absoluteUri;
+ }
+ //DOCEAR: mindmaps can be linked in a mindmap --> therefore project-relative-paths are possible
+ if(! asList(FILE_SCHEME, SMB_SCHEME, FREEPLANE_SCHEME).contains(uri.getScheme())) {
+ try {
+ uri = uri.toURL().openConnection().getURL().toURI().normalize();
+ }
+ catch (Exception e) {
+ // ignore all exceptions due to unknown protocols
+ }
+ }
+ try {
+ if (hasFreeplaneFileExtension) {
+ FreeplaneUriConverter freeplaneUriConverter = new FreeplaneUriConverter();
+ final URL url = freeplaneUriConverter.freeplaneUrl(uri);
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.getMapController().newMap(url);
+ return;
+ }
+ Controller.getCurrentController().getViewController().openDocument(uri);
+ }
+ catch (final Exception e) {
+ LogUtils.warn("link " + uri + " not found", e);
+ UITools.errorMessage(TextUtils.format("link_not_found", uri.toString()));
+ }
+ return;
+ }
+ catch (final MalformedURLException ex) {
+ LogUtils.warn("URL " + uri + " not found", ex);
+ UITools.errorMessage(TextUtils.format("link_not_found", uri));
+ }
+ }
+
+ private MapController getMapController() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ return mapController;
+ }
+
+ public void loadMap(String map)
+ throws URISyntaxException {
+
+ if (map.startsWith(UrlManager.FREEPLANE_SCHEME + ':')) {
+ String fixedUri = new FreeplaneUriConverter().fixPartiallyDecodedFreeplaneUriComingFromInternetExplorer(map);
+ loadURL(new URI(fixedUri));
+ return;
+ }
+
+ if(map.startsWith("http://") || map.startsWith("https://")|| map.startsWith("file:")) {
+ loadURL(new URI(map));
+ }
+ else {
+ if (!FileUtils.isAbsolutePath(map)) {
+ map = System.getProperty("user.dir") + System.getProperty("file.separator") + map;
+ }
+ loadURL(new File(map).toURI());
+ }
+ }
+
+ private URI getAbsoluteUri(final URI uri) throws MalformedURLException {
+ if (uri.isAbsolute()) {
+ return uri;
+ }
+ final MapModel map = Controller.getCurrentController().getMap();
+ return getAbsoluteUri(map, uri);
+ }
+
+
+ public URI getAbsoluteUri(final MapModel map, URI uri) throws MalformedURLException {
+// final URI resolvedURI = resolveProjectUri(uri);
+ final URI resolvedURI = uri;
+ if (resolvedURI == null || resolvedURI.isAbsolute()) {
+ return resolvedURI;
+ }
+ final String path = resolvedURI.getPath();
+ try {
+ URL context = map.getURL();
+ if(context == null)
+ return null;
+ final URL url = new URL(context, path);
+ return new URI(url.getProtocol(), url.getHost(), url.getPath(), uri.getQuery(), uri.getFragment());
+ }
+ catch (final URISyntaxException e) {
+ LogUtils.severe(e);
+ return null;
+ }
+ }
+
+ //DOCEAR - added project relative uri resolution
+ @SuppressWarnings("unused")
+ private URI resolveWorkspaceRelatedUri(final URI uri) {
+ URI resolvedURI;
+ try {
+ resolvedURI = uri.toURL().openConnection().getURL().toURI();
+ } catch (IOException ex) {
+ LogUtils.severe(ex);
+ return null;
+ } catch (URISyntaxException ex) {
+ LogUtils.severe(ex);
+ return null;
+ } catch (IllegalArgumentException ex) {
+ resolvedURI = uri;
+ }
+ return resolvedURI;
+ }
+
+ public File getAbsoluteFile(final MapModel map, final URI uri) {
+ if(uri == null) {
+ return null;
+ }
+ try {
+ URLConnection urlConnection;
+ // windows drive letters are interpreted as uri schemes -> make a file from the scheme-less uri string and use this to resolve the path
+ if(Compat.isWindowsOS() && (uri.getScheme() != null && uri.getScheme().length() == 1)) {
+ urlConnection = (new File(uri.toString())).toURI().toURL().openConnection();
+ }
+ else if(uri.getScheme() == null && !uri.getPath().startsWith(File.separator)) {
+ if(map != null) {
+ urlConnection = (new File(uri.toString())).toURI().toURL().openConnection();
+ }
+ else {
+ urlConnection = UrlManager.getController().getAbsoluteUri(map, uri).toURL().openConnection();
+ }
+ }
+ else {
+ urlConnection = uri.toURL().openConnection();
+ }
+
+ if (urlConnection == null) {
+ return null;
+ }
+ else {
+ URI absoluteUri = urlConnection.getURL().toURI().normalize();
+ if("file".equalsIgnoreCase(absoluteUri.getScheme())){
+ return new File(absoluteUri);
+ }
+ }
+ }
+ catch (URISyntaxException e) {
+ LogUtils.warn(e);
+ }
+ catch (IOException e) {
+ LogUtils.warn(e);
+ }
+ catch (Exception e){
+ LogUtils.warn(e);
+ }
+ return null;
+
+ }
+
+ public URL getAbsoluteUrl(final MapModel map, final URI uri) throws MalformedURLException {
+ final String path = uri.isOpaque() ? uri.getSchemeSpecificPart() : uri.getPath();
+ final StringBuilder sb = new StringBuilder(path);
+ final String query = uri.getQuery();
+ if (query != null) {
+ sb.append('?');
+ sb.append(query);
+ }
+ final String fragment = uri.getFragment();
+ if (fragment != null) {
+ sb.append('#');
+ sb.append(fragment);
+ }
+ if (!uri.isAbsolute() || uri.isOpaque() || uri.getScheme().length()>0) {
+ final URL mapUrl = map.getURL();
+ final String scheme = uri.getScheme();
+ if (scheme == null || mapUrl.getProtocol().equals(scheme)) {
+ final URL url = new URL(mapUrl, sb.toString());
+ return url;
+ }
+ }
+ final URL url = new URL(uri.getScheme(), uri.getHost(), uri.getPort(), sb.toString());
+ return url;
+ }
+
+ public URL getAbsoluteUrl(final URI base, final URI uri) throws MalformedURLException {
+ final String path = uri.isOpaque() ? uri.getSchemeSpecificPart() : uri.getPath();
+ final StringBuilder sb = new StringBuilder(path);
+ final String query = uri.getQuery();
+ if (query != null) {
+ sb.append('?');
+ sb.append(query);
+ }
+ final String fragment = uri.getFragment();
+ if (fragment != null) {
+ sb.append('#');
+ sb.append(fragment);
+ }
+ if (!uri.isAbsolute() || uri.isOpaque() || uri.getScheme().length()>0) {
+ final URL baseUrl = base.toURL();
+ final String scheme = uri.getScheme();
+ if (scheme == null || baseUrl.getProtocol().equals(scheme)) {
+ final URL url = new URL(baseUrl, sb.toString());
+ return url;
+ }
+ }
+ final URL url = new URL(uri.getScheme(), uri.getHost(), uri.getPort(), sb.toString());
+ return url;
+ }
+
+ public void setLastCurrentDir(final File lastCurrentDir) {
+ this.lastCurrentDir = lastCurrentDir;
+ }
+
+ protected void setURL(final MapModel map, final URL url) {
+ map.setURL(url);
+ }
+
+ public File defaultTemplateFile() {
+ return null;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/DoAutomaticSave.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/DoAutomaticSave.java
new file mode 100644
index 0000000..3d75778
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/DoAutomaticSave.java
@@ -0,0 +1,120 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.io.File;
+import java.net.URL;
+import java.util.TimerTask;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.mindmapmode.MMapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.url.UrlManager;
+
+public class DoAutomaticSave extends TimerTask {
+ static final String AUTOSAVE_EXTENSION = "autosave";
+ /**
+ * This value is compared with the result of
+ * getNumberOfChangesSinceLastSave(). If the values coincide, no further
+ * automatic saving is performed until the value changes again.
+ */
+ private int changeState;
+ final private boolean filesShouldBeDeletedAfterShutdown;
+ final private MapModel model;
+ final private int numberOfFiles;
+ private final File singleBackupDirectory;
+ static final String BACKUP_DIR = ".backup";
+
+ public DoAutomaticSave(final MapModel model, final int numberOfTempFiles,
+ final boolean filesShouldBeDeletedAfterShutdown, boolean useSingleBackupDirectory,
+ final String singleBackupDirectory) {
+ this.model = model;
+ numberOfFiles = ((numberOfTempFiles > 0) ? numberOfTempFiles : 1);
+ this.filesShouldBeDeletedAfterShutdown = filesShouldBeDeletedAfterShutdown;
+ this.singleBackupDirectory = useSingleBackupDirectory ? new File(singleBackupDirectory) : null;
+ changeState = model.getNumberOfChangesSinceLastSave();
+ }
+
+ @Override
+ public void run() {
+ /* Map is dirty enough? */
+ if (model.getNumberOfChangesSinceLastSave() == changeState) {
+ return;
+ }
+ changeState = model.getNumberOfChangesSinceLastSave();
+ if (changeState == 0) {
+ /* map was recently saved. */
+ return;
+ }
+ try {
+ cancel();
+ Controller.getCurrentController().getViewController().invokeAndWait(new Runnable() {
+
+ public void run() {
+ /* Now, it is dirty, we save it. */
+ try {
+ final ModeController currentModeController = Controller.getCurrentModeController();
+ if(!(currentModeController instanceof MModeController))
+ return;
+ MModeController modeController = ((MModeController) currentModeController);
+ final File pathToStore;
+ final URL url = model.getURL();
+ final File file = new File(url != null ? url.getFile() //
+ : model.getTitle() + UrlManager.FREEPLANE_FILE_EXTENSION);
+ if (url == null) {
+ pathToStore = new File(ResourceController.getResourceController()
+ .getFreeplaneUserDirectory(), BACKUP_DIR);
+ }
+ else if (singleBackupDirectory != null) {
+ pathToStore = singleBackupDirectory;
+ }
+ else {
+ pathToStore = new File(file.getParent(), BACKUP_DIR);
+ }
+ pathToStore.mkdirs();
+ final File tempFile = MFileManager.renameBackupFiles(pathToStore, file, numberOfFiles,
+ AUTOSAVE_EXTENSION);
+ if (tempFile == null) {
+ return;
+ }
+ if (filesShouldBeDeletedAfterShutdown) {
+ tempFile.deleteOnExit();
+ }
+ ((MFileManager) UrlManager.getController())
+ .saveInternal((MMapModel) model, tempFile, true /*=internal call*/);
+ modeController.getController().getViewController()
+ .out(TextUtils.format("automatically_save_message", tempFile));
+ }
+ catch (final Exception e) {
+ LogUtils.severe("Error in automatic MapModel.save(): ", e);
+ }
+ }
+ });
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/DroppedMindMapOpener.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/DroppedMindMapOpener.java
new file mode 100644
index 0000000..dfc3e90
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/DroppedMindMapOpener.java
@@ -0,0 +1,23 @@
+package org.freeplane.features.url.mindmapmode;
+
+import java.net.URL;
+import java.util.Collection;
+
+import org.freeplane.core.ui.FileOpener.Listener;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+
+public class DroppedMindMapOpener implements Listener{
+
+ @Override
+ public void filesDropped(Collection<URL> urls) throws Exception {
+ if(urls.isEmpty())
+ return;
+ Controller.getCurrentController().selectMode(MModeController.MODENAME);
+ ModeController modeController = Controller.getCurrentModeController();
+ for(URL url : urls){
+ modeController.getMapController().newMap(url);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/DummyLockManager.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/DummyLockManager.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/mindmapmode/DummyLockManager.java
rename to freeplane/src/main/java/org/freeplane/features/url/mindmapmode/DummyLockManager.java
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ExportBranchAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ExportBranchAction.java
new file mode 100644
index 0000000..26f3539
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ExportBranchAction.java
@@ -0,0 +1,184 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.util.Collection;
+
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.styles.LogicalStyleKeys;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.url.UrlManager;
+
+class ExportBranchAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ExportBranchAction() {
+ super("ExportBranchAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel existingNode = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ final Controller controller = Controller.getCurrentController();
+ final MapModel parentMap = controller.getMap();
+ if (parentMap == null || existingNode == null || existingNode.isRoot()) {
+ controller.getViewController().err("Could not export branch.");
+ return;
+ }
+ if (parentMap.getFile() == null) {
+ controller.getViewController().out("You must save the current map first!");
+ ((MModeController) Controller.getCurrentModeController()).save();
+ }
+ JFileChooser chooser;
+ final File file = parentMap.getFile();
+ if (file == null) {
+ return;
+ }
+ chooser = new JFileChooser(file.getParentFile());
+ chooser.setSelectedFile(new File(createFileName(TextController.getController().getShortPlainText(existingNode))));
+ if (((MFileManager) UrlManager.getController()).getFileFilter() != null) {
+ chooser.addChoosableFileFilter(((MFileManager) UrlManager.getController())
+ .getFileFilter());
+ }
+ final int returnVal = chooser.showSaveDialog(controller.getViewController().getCurrentRootComponent());
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ File chosenFile = chooser.getSelectedFile();
+ final String ext = FileUtils.getExtension(chosenFile.getName());
+ if (!ext.equals(org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION_WITHOUT_DOT)) {
+ chosenFile = new File(chosenFile.getParent(), chosenFile.getName()
+ + org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION);
+ }
+ try {
+ Compat.fileToUrl(chosenFile);
+ }
+ catch (final MalformedURLException ex) {
+ UITools.errorMessage(TextUtils.getText("invalid_url"));
+ return;
+ }
+ if (chosenFile.exists()) {
+ final int overwriteMap = JOptionPane.showConfirmDialog(controller.getMapViewManager().getMapViewComponent(),
+ TextUtils.getText("map_already_exists"), "Freeplane", JOptionPane.YES_NO_OPTION);
+ if (overwriteMap != JOptionPane.YES_OPTION) {
+ return;
+ }
+ }
+ /*
+ * Now make a copy from the node, remove the node from the map and
+ * create a new Map with the node as root, store the new Map, add
+ * the copy of the node to the parent, and set a link from the copy
+ * to the new Map.
+ */
+ final NodeModel parent = existingNode.getParentNode();
+ final File oldFile = parentMap.getFile();
+
+ final URI newUri = LinkController.toLinkTypeDependantURI(oldFile, chosenFile);
+ final URI oldUri = LinkController.toLinkTypeDependantURI(chosenFile, file);
+ ((MLinkController) LinkController.getController()).setLink(existingNode,
+ oldUri, LinkController.LINK_ABSOLUTE);
+ final int nodePosition = parent.getIndex(existingNode);
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.undoableResolveParentExtensions(LogicalStyleKeys.NODE_STYLE, existingNode);
+ final MMapController mMapController = (MMapController) modeController.getMapController();
+ mMapController.deleteNode(existingNode);
+ {
+ final IActor actor = new IActor() {
+ private final boolean wasFolded = existingNode.isFolded();
+
+ public void undo() {
+ PersistentNodeHook.removeMapExtensions(existingNode);
+ existingNode.setMap(parentMap);
+ existingNode.setFolded(wasFolded);
+ }
+
+ public String getDescription() {
+ return "ExportBranchAction";
+ }
+
+ public void act() {
+ existingNode.setParent(null);
+ existingNode.setFolded(false);
+ mMapController.newModel(existingNode);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, parentMap);
+ }
+ final MapModel map = existingNode.getMap();
+ IExtension[] oldExtensions = map.getRootNode().getSharedExtensions().values().toArray(new IExtension[]{});
+ for(final IExtension extension : oldExtensions){
+ final Class<? extends IExtension> clazz = extension.getClass();
+ if(PersistentNodeHook.isMapExtension(clazz)){
+ existingNode.removeExtension(clazz);
+ }
+ }
+ final Collection<IExtension> newExtensions = parentMap.getRootNode().getSharedExtensions().values();
+ for(final IExtension extension : newExtensions){
+ final Class<? extends IExtension> clazz = extension.getClass();
+ if(PersistentNodeHook.isMapExtension(clazz)){
+ existingNode.addExtension(extension);
+ }
+ }
+ ((MFileManager) UrlManager.getController()).save(map, chosenFile);
+ final NodeModel newNode = mMapController.addNewNode(parent, nodePosition, existingNode.isLeft());
+ ((MTextController) TextController.getController()).setNodeText(newNode, existingNode.getText());
+ modeController.undoableCopyExtensions(LogicalStyleKeys.NODE_STYLE, existingNode, newNode);
+ map.getFile();
+ ((MLinkController) LinkController.getController()).setLink(newNode, newUri, LinkController.LINK_ABSOLUTE);
+ map.destroy();
+ }
+ }
+
+ private String createFileName(final String shortText) {
+ final StringBuilder builder = new StringBuilder(50);
+ final String[] words = shortText.split("\\s");
+ for (final String word : words) {
+ if ("...".equals(word)) {
+ continue;
+ }
+ builder.append(StringUtils.capitalize(word));
+ }
+ return builder.toString();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/FileRevisionsDialog.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/FileRevisionsDialog.java
new file mode 100644
index 0000000..5d11c96
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/FileRevisionsDialog.java
@@ -0,0 +1,321 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 Volker Boerchers
+ *
+ * This file author is Volker Boerchers
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.File;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.TreeSet;
+
+import javax.swing.AbstractAction;
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.KeyStroke;
+import javax.swing.ListSelectionModel;
+import javax.swing.WindowConstants;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableCellRenderer;
+
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.url.mindmapmode.MFileManager.AlternativeFileMode;
+
+/**
+ * @author vboerchers
+ */
+class FileRevisionsDialog extends JDialog {
+ public static class FileWrapper {
+ private final File file;
+
+ public FileWrapper(final File file) {
+ this.file = file;
+ }
+
+ public File getFile() {
+ return file;
+ }
+
+ @Override
+ public String toString() {
+ return file.getName();
+ }
+ }
+
+ private class RevisionTable extends JTable {
+ private static final long serialVersionUID = 1L;
+
+ public RevisionTable(final Object[][] data, int selectedRow) {
+ super(data, new Object[] { TextUtils.getText(key("file_name")),
+ TextUtils.getText(key("file_size")),
+ TextUtils.getText(key("file_last_modified")) });
+ int width = Toolkit.getDefaultToolkit().getScreenSize().width * 2 / 3;
+ getColumnModel().getColumn(0).setPreferredWidth((int) (width * 0.7));
+ getColumnModel().getColumn(1).setPreferredWidth((int) (width * 0.1));
+ getColumnModel().getColumn(2).setPreferredWidth((int) (width * 0.2));
+ setRowHeight(20);
+ setRowSelectionAllowed(true);
+ setFocusable(false);
+ setDefaultRenderer(Object.class, renderer);
+ setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ setRowSelectionInterval(selectedRow, selectedRow);
+ getSelectionModel().addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(final ListSelectionEvent event) {
+ // Update the word field if a suggestion is click
+ if (!event.getValueIsAdjusting()) {
+ final ListSelectionModel lsm = (ListSelectionModel) event.getSource();
+ final boolean enable = !(lsm.isSelectionEmpty());
+ if (enable) {
+ final FileWrapper fileWrapper = (FileWrapper) getModel().getValueAt(getSelectedRow(), 0);
+ if (file.equals(fileWrapper.getFile())) {
+ setButtonOpenDefault();
+ }
+ else {
+ setButtonOpenRestore(fileWrapper);
+ }
+ setSelectedFile(fileWrapper.getFile());
+ }
+ else {
+ setButtonOpenDefault();
+ }
+ }
+ }
+ });
+ addMouseListener(new MouseAdapter() {
+ public void mouseClicked(MouseEvent e) {
+ if (e.getClickCount() >= 2) {
+ final FileWrapper fileWrapper = (FileWrapper) getModel().getValueAt(getSelectedRow(), 0);
+ setSelectedFile(fileWrapper.getFile());
+ if (fileWrapper != null)
+ btnRestore.doClick();
+ }
+ }
+ });
+ }
+
+ private void setButtonOpenDefault() {
+ LabelAndMnemonicSetter.setLabelAndMnemonic(btnRestore, TextUtils.getRawText(key("open")));
+ btnRestore.setToolTipText(TextUtils.format(key("open.tooltip")));
+ }
+
+ private void setButtonOpenRestore(final FileWrapper fileWrapper) {
+ LabelAndMnemonicSetter.setLabelAndMnemonic(btnRestore, TextUtils.getRawText(key("restore")));
+ btnRestore.setToolTipText(TextUtils.format(key("restore.tooltip"),
+ file.getName(), fileWrapper.toString()));
+ }
+ private final DefaultTableCellRenderer renderer = new DefaultTableCellRenderer() {
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Component getTableCellRendererComponent(final JTable table, final Object value,
+ final boolean isSelected, final boolean hasFocus,
+ final int row, final int column) {
+ final Component c = super
+ .getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+ // change the font of the first line which contains the original file
+ if (containsOriginalFile(table, row))
+ c.setFont(getFont().deriveFont(Font.BOLD));
+ return c;
+ }
+
+ private boolean containsOriginalFile(JTable table, int row) {
+ FileWrapper fileHolder = (FileWrapper) table.getValueAt(row, 0);
+ return fileHolder.getFile().equals(file);
+ }
+ };
+
+ @Override
+ public boolean isCellEditable(final int row, final int column) {
+ return false;
+ }
+
+ }
+
+ private static final long serialVersionUID = 1L;
+ private final static String ALL_KEY_BASE = "FileRevisionsDialog";
+ private final static String AUTOSAVE_KEY_BASE = "NewerFileRevisionsFoundDialog";
+ private String keyBase;
+ private JButton btnRestore;
+ private JButton btnSkip;
+ private boolean cancelled;
+ private final File file;
+ private File selectedFile;
+ private final SimpleDateFormat dateFormat = new SimpleDateFormat();
+ private final NumberFormat fileSizeFormat = NumberFormat.getIntegerInstance();
+
+ private class CloseAction implements ActionListener {
+ public void actionPerformed(final ActionEvent e) {
+ final Object source = e.getSource();
+ cancelled = (source == btnSkip);
+ dispose();
+ }
+ }
+
+ public FileRevisionsDialog(final File file, final File[] revisions, AlternativeFileMode mode) {
+ super((Frame) UITools.getMenuComponent(), true);
+ if(mode == AlternativeFileMode.ALL)
+ keyBase = ALL_KEY_BASE;
+ else if(mode == AlternativeFileMode.AUTOSAVE)
+ keyBase = AUTOSAVE_KEY_BASE;
+ setTitle(TextUtils.getText(key("title")));
+ UITools.backOtherWindows();
+ this.selectedFile = this.file = file;
+ setBackground(Color.white);
+ setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ UITools.addEscapeActionToDialog(this);
+ getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
+ final JTable table = createTable(revisions);
+ final JScrollPane scrollPane = new JScrollPane(table);
+ scrollPane.getViewport().setBackground(Color.white);
+ final Dimension tablePreferredSize = table.getPreferredSize();
+ int maxHeight = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() * 2 / 3;
+ scrollPane.getViewport().setPreferredSize(new Dimension(tablePreferredSize.width, Math.min(maxHeight, tablePreferredSize.height)));
+ add(scrollPane);
+ add(createQuestion());
+ add(createButtonBar());
+ getRootPane().setDefaultButton(btnRestore);
+ getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
+ getRootPane().getActionMap().put("up", new AbstractAction() {
+
+ public void actionPerformed(ActionEvent e) {
+ int newSelectedRow = table.getSelectedRow() - 1;
+ if(newSelectedRow >= 0)
+ table.setRowSelectionInterval(newSelectedRow, newSelectedRow);
+
+ }
+ });
+ getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down");
+ getRootPane().getActionMap().put("down", new AbstractAction() {
+
+ public void actionPerformed(ActionEvent e) {
+ int newSelectedRow = table.getSelectedRow() + 1;
+ if(newSelectedRow < table.getRowCount())
+ table.setRowSelectionInterval(newSelectedRow, newSelectedRow);
+ }
+ });
+ pack();
+ UITools.showFrame();
+ setLocationRelativeTo(UITools.getMenuComponent());
+ setVisible(true);
+ }
+
+ private Component createQuestion() {
+ final String text = TextUtils.format(key("question"), file.getName());
+ final String html = HtmlUtils.plainToHTML(text);
+ final JLabel textArea = new JLabel(html);
+ textArea.setAlignmentX(0.5f);
+ textArea.setFont(new Font("Dialog", Font.BOLD, 12));
+ textArea.setBorder(BorderFactory.createLineBorder(Color.BLACK));
+ return textArea;
+ }
+
+ private String key(final String appendix) {
+ return keyBase + "." + appendix;
+ }
+
+ private JTable createTable(final File[] revisions) {
+ final TreeSet<File> sortedRevisions = new TreeSet<File>(new Comparator<File>() {
+ public int compare(final File f1, final File f2) {
+ final long diff = f1.lastModified() - f2.lastModified();
+ if (diff == 0)
+ return f1.getName().compareTo(f2.getName());
+ return diff < 0 ? -1 : (diff > 0 ? 1 : 0);
+ }
+ });
+ sortedRevisions.add(file);
+ sortedRevisions.addAll(Arrays.asList(revisions));
+ final Object[][] data = new Object[sortedRevisions.size()][];
+ int i = 0;
+ int selectedRow = 0;
+ for (final File f : sortedRevisions) {
+ data[i] = createRow(f);
+ if(f == file)
+ selectedRow = i;
+ i++;
+ }
+ final RevisionTable revisionTable = new RevisionTable(data, selectedRow);
+ return revisionTable;
+ }
+
+ private Object[] createRow(final File file) {
+ return new Object[] { new FileWrapper(file), fileSizeFormat.format(file.length()),
+ dateFormat.format(file.lastModified()) };
+ }
+
+ private Box createButtonBar() {
+ final Box controllerBox = Box.createHorizontalBox();
+ controllerBox.setBorder(new EmptyBorder(5, 0, 5, 0));
+ final CloseAction closeAction = new CloseAction();
+ controllerBox.add(Box.createHorizontalGlue());
+ btnSkip = createButton(key("cancel"), null, closeAction);
+ btnRestore = createButton(key("open"), key("open.tooltip"), closeAction);
+ controllerBox.add(btnRestore);
+ controllerBox.add(Box.createHorizontalStrut(10));
+ controllerBox.add(btnSkip);
+ controllerBox.add(Box.createHorizontalStrut(10));
+ return controllerBox;
+ }
+
+ private JButton createButton(final String key, final String tooltipKey, final ActionListener closeAction) {
+ final JButton button = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(button, TextUtils.getRawText(key));
+ button.addActionListener(closeAction);
+ button.setMaximumSize(new Dimension(1000, 1000));
+ final String selectedFileName = getSelectedFile() == null ? null : getSelectedFile().getName();
+ // arguments are only used for one button but they don't hurt for the other
+ if (tooltipKey != null)
+ button.setToolTipText(TextUtils.format(tooltipKey, file.getName(), selectedFileName));
+ return button;
+ }
+
+ /** returns null on cancel */
+ public File getSelectedFile() {
+ if(cancelled)
+ return null;
+ return selectedFile;
+ }
+
+ private void setSelectedFile(final File selectedFile) {
+ this.selectedFile = selectedFile;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportBranchAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportBranchAction.java
new file mode 100644
index 0000000..e55b242
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportBranchAction.java
@@ -0,0 +1,71 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.net.URL;
+
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.url.UrlManager;
+
+class ImportBranchAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ImportBranchAction() {
+ super("ImportBranchAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final NodeModel parent = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ if (parent == null) {
+ return;
+ }
+ final JFileChooser chooser = new JFileChooser();
+ final FileFilter fileFilter = ((MFileManager) UrlManager.getController()).getFileFilter();
+ if (fileFilter != null) {
+ chooser.addChoosableFileFilter(fileFilter);
+ }
+ final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getViewController().getCurrentRootComponent());
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ try {
+ final MapModel map = parent.getMap();
+ final URL url = map.getURL();
+ final NodeModel node = ((MFileManager) UrlManager.getController()).loadTree(map, chooser.getSelectedFile());
+ map.setURL(url);
+ PersistentNodeHook.removeMapExtensions(node);
+ ((MMapController) Controller.getCurrentModeController().getMapController()).insertNode(node, parent);
+ }
+ catch (final Exception ex) {
+ UrlManager.getController().handleLoadingException(ex);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportExplorerFavoritesAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportExplorerFavoritesAction.java
new file mode 100644
index 0000000..3df9cc5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportExplorerFavoritesAction.java
@@ -0,0 +1,129 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+
+import javax.swing.JFileChooser;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+
+class ImportExplorerFavoritesAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ImportExplorerFavoritesAction() {
+ super("ImportExplorerFavoritesAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final JFileChooser chooser = new JFileChooser();
+ chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+ chooser.setDialogTitle(TextUtils.getText("select_favorites_folder"));
+ final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getViewController().getCurrentRootComponent());
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ final File folder = chooser.getSelectedFile();
+ Controller.getCurrentController().getViewController().out("Importing Favorites ...");
+ importExplorerFavorites(folder, Controller.getCurrentModeController().getMapController().getSelectedNode(),
+ /*redisplay=*/true);
+ Controller.getCurrentController().getViewController().out("Favorites imported.");
+ }
+ }
+
+ /**
+ */
+ private NodeModel addNode(final NodeModel target, final String nodeContent) {
+ final NodeModel node = ((MMapController) Controller.getCurrentModeController().getMapController()).addNewNode(target, target
+ .getChildCount(), target.isNewChildLeft());
+ ((MTextController) TextController.getController()).setNodeText(node, nodeContent);
+ return node;
+ }
+
+ public boolean importExplorerFavorites(final File folder, final NodeModel target, final boolean redisplay) {
+ boolean favoritesFound = false;
+ if (folder.isDirectory()) {
+ final File[] list = folder.listFiles();
+ for (int i = 0; i < list.length; i++) {
+ if (list[i].isDirectory()) {
+ final String nodeContent = list[i].getName();
+ final NodeModel node = addNode(target, nodeContent);
+ final boolean favoritesFoundInSubfolder = importExplorerFavorites(list[i], node, false);
+ if (favoritesFoundInSubfolder) {
+ favoritesFound = true;
+ }
+ else {
+ ((MMapController) Controller.getCurrentModeController().getMapController()).deleteNode(node);
+ }
+ }
+ }
+ for (int i = 0; i < list.length; i++) {
+ if (!list[i].isDirectory() && FileUtils.getExtension(list[i]).equals("url")) {
+ favoritesFound = true;
+ BufferedReader in = null;
+ try {
+ final NodeModel node = addNode(target, FileUtils.removeExtension(list[i].getName()));
+ in = new BufferedReader(new FileReader(list[i]));
+ String line = null;
+ while ((line = in.readLine()) != null) {
+ if (line.startsWith("URL=")) {
+ final String link = line.substring(4);
+ ((MLinkController) LinkController.getController()).setLink(node,LinkController.createURI(link), LinkController.LINK_ABSOLUTE);
+ break;
+ }
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ finally {
+ try {
+ if (in != null) {
+ in.close();
+ }
+ }
+ catch (final IOException e) {
+ LogUtils.warn(e);
+ }
+ }
+ }
+ }
+ }
+ if (redisplay) {
+ Controller.getCurrentModeController().getMapController().nodeChanged(target);
+ }
+ return favoritesFound;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportFolderStructureAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportFolderStructureAction.java
new file mode 100644
index 0000000..0d7af5c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportFolderStructureAction.java
@@ -0,0 +1,99 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.net.MalformedURLException;
+
+import javax.swing.JFileChooser;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.ui.ViewController;
+
+class ImportFolderStructureAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ImportFolderStructureAction() {
+ super("ImportFolderStructureAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final JFileChooser chooser = new JFileChooser();
+ chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+ chooser.setDialogTitle(TextUtils.getText("select_folder_for_importing"));
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ final int returnVal = chooser.showOpenDialog(viewController.getCurrentRootComponent());
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ final File folder = chooser.getSelectedFile();
+ viewController.out("Importing folder structure ...");
+ try {
+ importFolderStructure(folder, Controller.getCurrentModeController().getMapController().getSelectedNode(),
+ /*redisplay=*/true);
+ }
+ catch (final Exception ex) {
+ LogUtils.severe(ex);
+ }
+ viewController.out("Folder structure imported.");
+ }
+ }
+
+ /**
+ */
+ private NodeModel addNode(final NodeModel target, final String nodeContent, final String link) {
+ final NodeModel node = ((MMapController) Controller.getCurrentModeController().getMapController()).addNewNode(target, target
+ .getChildCount(), target.isNewChildLeft());
+ ((MTextController) TextController.getController()).setNodeText(node, nodeContent);
+ ((MLinkController) LinkController.getController()).setLink(node, link, LinkController.LINK_ABSOLUTE);
+ return node;
+ }
+
+ public void importFolderStructure(final File folder, final NodeModel target, final boolean redisplay)
+ throws MalformedURLException {
+ final File[] list = folder.listFiles();
+ if (list == null) {
+ return;
+ }
+ for (int i = 0; i < list.length; i++) {
+ if (list[i].isDirectory()) {
+ final NodeModel node = addNode(target, list[i].getName(), list[i].toURI().toString());
+ importFolderStructure(list[i], node, false);
+ }
+ }
+ for (int i = 0; i < list.length; i++) {
+ if (!list[i].isDirectory()) {
+ addNode(target, list[i].getName(), list[i].toURI().toString());
+ }
+ }
+ Controller.getCurrentModeController().getMapController().setFolded(target, true);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportLinkedBranchAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportLinkedBranchAction.java
new file mode 100644
index 0000000..9f5a839
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportLinkedBranchAction.java
@@ -0,0 +1,90 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.url.UrlManager;
+
+class ImportLinkedBranchAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public ImportLinkedBranchAction() {
+ super("ImportLinkedBranchAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel selected = modeController.getMapController().getSelectedNode();
+ final IMapViewManager viewController = Controller.getCurrentController().getMapViewManager();
+ if (selected == null || NodeLinks.getLink(selected) == null) {
+ JOptionPane.showMessageDialog((viewController.getMapViewComponent()), TextUtils
+ .getText("import_linked_branch_no_link"));
+ return;
+ }
+ final URI uri = NodeLinks.getLink(selected);
+ try {
+ final File file = uri.isAbsolute() && !uri.isOpaque() ? new File(uri) : new File(new URL(map.getURL(), uri
+ .getPath()).getFile());
+ final NodeModel node = ((MFileManager) UrlManager.getController()).loadTree(map, file);
+ PersistentNodeHook.removeMapExtensions(node);
+ ((MMapController) modeController.getMapController()).insertNode(node, selected);
+ ((MLinkController) LinkController.getController()).setLink(selected, (URI) null, LinkController.LINK_ABSOLUTE);
+ ((MLinkController) LinkController.getController()).setLink(node, (URI) null, LinkController.LINK_ABSOLUTE);
+ }
+ catch (final MalformedURLException ex) {
+ UITools.errorMessage(TextUtils.format("invalid_url_msg", uri.toString()));
+ LogUtils.warn(ex);
+ return;
+ }
+ catch (final IllegalArgumentException ex) {
+ UITools.errorMessage(TextUtils.format("invalid_file_msg", uri.toString()));
+ LogUtils.warn(ex);
+ return;
+ }
+ catch (final Exception ex) {
+ UrlManager.getController().handleLoadingException(ex);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/ImportLinkedBranchWithoutRootAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportLinkedBranchWithoutRootAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/mindmapmode/ImportLinkedBranchWithoutRootAction.java
rename to freeplane/src/main/java/org/freeplane/features/url/mindmapmode/ImportLinkedBranchWithoutRootAction.java
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/LockManager.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/LockManager.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/mindmapmode/LockManager.java
rename to freeplane/src/main/java/org/freeplane/features/url/mindmapmode/LockManager.java
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/MFileManager.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/MFileManager.java
new file mode 100644
index 0000000..e482bd5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/MFileManager.java
@@ -0,0 +1,916 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.Component;
+import java.awt.dnd.DropTarget;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedInputStream;
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.SequenceInputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.channels.FileLock;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.regex.Pattern;
+
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.ComboProperty;
+import org.freeplane.core.resources.components.IPropertyControl;
+import org.freeplane.core.resources.components.IPropertyControlCreator;
+import org.freeplane.core.resources.components.OptionPanelBuilder;
+import org.freeplane.core.ui.FileOpener;
+import org.freeplane.core.ui.IndexedTree;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapWriter.Mode;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.map.mindmapmode.MMapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.url.IMapInputStreamConverter;
+import org.freeplane.features.url.MapConversionException;
+import org.freeplane.features.url.MapVersionInterpreter;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.n3.nanoxml.XMLParseException;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class MFileManager extends UrlManager implements IMapViewChangeListener {
+ public static final String STANDARD_TEMPLATE = "standard_template";
+ private static final String DEFAULT_SAVE_DIR_PROPERTY = "default_save_dir";
+ private static final String BACKUP_EXTENSION = "bak";
+ private static final int DEBUG_OFFSET = 0;
+
+ static private class BackupFlag implements IExtension {
+ }
+
+ private class MindMapFilter extends FileFilter {
+ @Override
+ public boolean accept(final File f) {
+ if (f.isDirectory()) {
+ return true;
+ }
+ final String extension = FileUtils.getExtension(f.getName());
+ if (extension != null) {
+ if (extension.equals(UrlManager.FREEPLANE_FILE_EXTENSION_WITHOUT_DOT)) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public String getDescription() {
+ return TextUtils.getText("mindmaps_desc");
+ }
+ }
+
+ private static final String BACKUP_FILE_NUMBER = "backup_file_number";
+ private static final String FREEPLANE_VERSION_UPDATER_XSLT = "/xslt/freeplane_version_updater.xslt";
+ private static File singleBackupDirectory;
+
+ private File[] findFileRevisions(final File file, final File backupDir, final AlternativeFileMode mode) {
+ final String fileExtensionPattern;
+ if(mode == AlternativeFileMode.ALL)
+ fileExtensionPattern = "(" + BACKUP_EXTENSION + "|"+ DoAutomaticSave.AUTOSAVE_EXTENSION + ")";
+ else
+ fileExtensionPattern = DoAutomaticSave.AUTOSAVE_EXTENSION;
+ final Pattern pattern = Pattern.compile("^" + Pattern.quote(backupFileName(file)) + "\\.+\\d+\\." + fileExtensionPattern);
+ if (backupDir.exists()) {
+ final File[] fileList = backupDir.listFiles(new java.io.FileFilter() {
+ public boolean accept(final File f) {
+ final String name = f.getName();
+ return pattern.matcher(name).matches() && f.isFile()
+ // && (f.lastModified() > (file.lastModified() - DEBUG_OFFSET) || name.endsWith(BACKUP_EXTENSION))
+ &&(mode == AlternativeFileMode.ALL || f.lastModified() > (file.lastModified() - DEBUG_OFFSET));
+ }
+ });
+ return fileList;
+ }
+ return new File[0];
+ }
+
+ /** prevents name conflicts with singleBackupDirectory in most cases (uses the file's hashcode). */
+ private static String backupFileName(final File file) {
+ if (singleBackupDirectory == null)
+ return file.getName();
+ return file.getName() + "." + file.hashCode();
+ }
+
+ private static void backupFile(final File file, final int backupFileNumber, final String extension) {
+ if (backupFileNumber == 0) {
+ return;
+ }
+ final File backupDir = MFileManager.backupDir(file);
+ backupDir.mkdir();
+ if (backupDir.exists()) {
+ final File backupFile = MFileManager.renameBackupFiles(backupDir, file, backupFileNumber, extension);
+ if (!backupFile.exists()) {
+ performBackup(file, backupFile);
+ }
+ }
+ }
+
+ private static void performBackup(final File file, final File backupFile) {
+ try {
+ FileUtils.copyFile(file, backupFile);
+ backupFile.setLastModified(file.lastModified());
+ }
+ catch (IOException e) {
+ }
+ }
+
+ private static File backupDir(final File file) {
+ if (singleBackupDirectory != null)
+ return singleBackupDirectory;
+ return new File(file.getParentFile(), DoAutomaticSave.BACKUP_DIR);
+ }
+
+ static File createBackupFile(final File backupDir, final File file, final int number, final String extension) {
+ return new File(backupDir, backupFileName(file) + '.' + number + '.' + extension);
+ }
+
+ static File renameBackupFiles(final File backupDir, final File file, final int backupFileNumber,
+ final String extension) {
+ if (backupFileNumber == 0) {
+ return null;
+ }
+ for (int i = backupFileNumber + 1;; i++) {
+ final File newFile = MFileManager.createBackupFile(backupDir, file, i, extension);
+ if (!newFile.exists()) {
+ break;
+ }
+ newFile.delete();
+ }
+ int i = backupFileNumber;
+ for (;;) {
+ final File newFile = MFileManager.createBackupFile(backupDir, file, i, extension);
+ if (newFile.exists()) {
+ break;
+ }
+ i--;
+ if (i == 0) {
+ break;
+ }
+ }
+ if (i < backupFileNumber) {
+ return MFileManager.createBackupFile(backupDir, file, i + 1, extension);
+ }
+ for (i = 1; i < backupFileNumber; i++) {
+ final File newFile = MFileManager.createBackupFile(backupDir, file, i, extension);
+ final File oldFile = MFileManager.createBackupFile(backupDir, file, i + 1, extension);
+ newFile.delete();
+ if (!oldFile.renameTo(newFile)) {
+ return null;
+ }
+ }
+ return MFileManager.createBackupFile(backupDir, file, backupFileNumber, extension);
+ }
+
+ FileFilter filefilter = new MindMapFilter();
+
+ public MFileManager() {
+ super();
+ setLastCurrentDir(new File(getDefaultSaveDirFromPrefs()));
+ }
+
+ private String getDefaultSaveDirFromPrefs() {
+ return ResourceController.getResourceController().getProperty(DEFAULT_SAVE_DIR_PROPERTY);
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+ createActions();
+ createPreferences();
+ if (ResourceController.getResourceController().getBooleanProperty("single_backup_directory")) {
+ String value = ResourceController.getResourceController().getProperty("single_backup_directory_path");
+ // vb, 2010-10-14: I'm not exactly happy with putting this here - if you have a better place move it!
+ if (value != null && value.indexOf("{freeplaneuserdir}") >= 0) {
+ value = value.replace("{freeplaneuserdir}", ResourceController.getResourceController()
+ .getFreeplaneUserDirectory());
+ ResourceController.getResourceController().setProperty("single_backup_directory_path", value);
+ }
+ singleBackupDirectory = new File(value);
+ }
+ }
+
+ private void createPreferences() {
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ final OptionPanelBuilder optionPanelBuilder = modeController.getOptionPanelBuilder();
+ optionPanelBuilder.addCreator("Environment/load", new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ final Set<String> charsets = Charset.availableCharsets().keySet();
+ final LinkedList<String> charsetList = new LinkedList<String>(charsets);
+ charsetList.addFirst("JVMdefault");
+ final LinkedList<String> charsetTranslationList = new LinkedList<String>(charsets);
+ charsetTranslationList.addFirst(TextUtils.getText("OptionPanel.default"));
+ return new ComboProperty("default_charset", charsetList, charsetTranslationList);
+ }
+ }, IndexedTree.AS_CHILD);
+ optionPanelBuilder.addCreator("Environment/files", new IPropertyControlCreator() {
+ public IPropertyControl createControl() {
+ final TreeSet<String> templates = new TreeSet<String>();
+ for (File dir : new File[]{defaultStandardTemplateDir(), defaultUserTemplateDir()})
+ if(dir.isDirectory())
+ templates.addAll(Arrays.asList(dir.list(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.endsWith(FREEPLANE_FILE_EXTENSION);
+ }
+ })));
+ ComboProperty comboProperty = new ComboProperty(STANDARD_TEMPLATE, templates, templates);
+ comboProperty.setEditable(true);
+ return comboProperty;
+ }
+ }, IndexedTree.AS_CHILD);
+ }
+
+ private void backup(final File file) {
+ if (file == null) {
+ return;
+ }
+ final int backupFileNumber = ResourceController.getResourceController().getIntProperty(BACKUP_FILE_NUMBER, 0);
+ MFileManager.backupFile(file, backupFileNumber, BACKUP_EXTENSION);
+ }
+
+ private void createActions() {
+ final Controller controller = Controller.getCurrentController();
+ final ModeController modeController = controller.getModeController();
+ controller.addAction(new OpenAction());
+ controller.addAction(new OpenURLMapAction());
+ controller.addAction(new NewMapAction());
+ final File userTemplates = defaultUserTemplateDir();
+ userTemplates.mkdir();
+ modeController.addAction(new NewMapFromTemplateAction("new_map_from_user_templates", userTemplates));
+ modeController.addAction(new SaveAction());
+ modeController.addAction(new SaveAsAction());
+ modeController.addAction(new ExportBranchAction());
+ modeController.addAction(new ImportBranchAction());
+ modeController.addAction(new ImportLinkedBranchAction());
+ modeController.addAction(new ImportLinkedBranchWithoutRootAction());
+ modeController.addAction(new ImportExplorerFavoritesAction());
+ modeController.addAction(new ImportFolderStructureAction());
+ modeController.addAction(new RevertAction());
+ modeController.addAction(new OpenUserDirAction());
+ }
+
+ public JFileChooser getFileChooser(boolean useDirectorySelector) {
+ final JFileChooser fileChooser = getFileChooser(getFileFilter(), useDirectorySelector);
+ return fileChooser;
+ }
+
+ public FileFilter getFileFilter() {
+ return filefilter;
+ };
+
+ @Override
+ protected JComponent createDirectorySelector(final JFileChooser chooser) {
+ final JComboBox box = new JComboBoxWithBorder();
+ box.setEditable(false);
+ final File dir = getLastCurrentDir() != null ? getLastCurrentDir() : chooser.getCurrentDirectory();
+ final File templateDir = defaultStandardTemplateDir();
+ final File userTemplateDir = defaultUserTemplateDir();
+ box.addItem(new TranslatedObject(dir, TextUtils.getText("current_dir")));
+ box.addItem(new TranslatedObject(templateDir, TextUtils.getText("template_dir")));
+ box.addItem(new TranslatedObject(userTemplateDir, TextUtils.getText("user_template_dir")));
+ box.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ final JComboBox box = (JComboBox) e.getSource();
+ final TranslatedObject obj = (TranslatedObject) box.getSelectedItem();
+ final File dir = (File) obj.getObject();
+ chooser.setCurrentDirectory(dir);
+ }
+ });
+ File selectedDir = chooser.getCurrentDirectory();
+ final String selectedPath = selectedDir.getAbsolutePath();
+ if (!selectedDir.equals(dir)) {
+ for (int i = 0; i < box.getItemCount(); i++) {
+ TranslatedObject item = (TranslatedObject) box.getItemAt(i);
+ File itemDir = (File) item.getObject();
+ if (itemDir.getAbsolutePath().equals(selectedPath)) {
+ box.setSelectedItem(item);
+ break;
+ }
+ }
+ }
+ return box;
+ }
+
+ /**
+ * Creates a proposal for a file name to save the map. Removes all illegal
+ * characters. Fixed: When creating file names based on the text of the root
+ * node, now all the extra unicode characters are replaced with _. This is
+ * not very good. For chinese content, you would only get a list of ______
+ * as a file name. Only characters special for building file paths shall be
+ * removed (rather than replaced with _), like : or /. The exact list of
+ * dangeous characters needs to be investigated. 0.8.0RC3. Keywords: suggest
+ * file name.
+ *
+ * @param map
+ */
+ private String getFileNameProposal(final MapModel map) {
+ String rootText = TextController.getController().getPlainTextContent((map.getRootNode()));
+ rootText = rootText.replaceAll("[&:/\\\\\0%$#~\\?\\*]+", "");
+ return rootText;
+ }
+
+ public URI getLinkByFileChooser(final MapModel map) {
+ JFileChooser chooser = null;
+ final File file = map.getFile();
+ if (file == null && LinkController.getLinkType() == LinkController.LINK_RELATIVE_TO_MINDMAP) {
+ JOptionPane.showMessageDialog(Controller.getCurrentController().getViewController().getCurrentRootComponent(),
+ TextUtils.getText("not_saved_for_link_error"), "Freeplane", JOptionPane.WARNING_MESSAGE);
+ return null;
+ }
+ if (getLastCurrentDir() != null) {
+ chooser = new JFileChooser(getLastCurrentDir());
+ }
+ else {
+ chooser = new JFileChooser();
+ }
+ chooser.setAcceptAllFileFilterUsed(true);
+ chooser.setFileFilter(chooser.getAcceptAllFileFilter());
+ chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
+ final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getViewController()
+ .getCurrentRootComponent());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return null;
+ }
+ final File input = chooser.getSelectedFile();
+ setLastCurrentDir(input.getParentFile());
+
+ return LinkController.toLinkTypeDependantURI(file, input);
+ }
+
+ /**@deprecated -- use MapIO*/
+ @Deprecated
+ public void loadAndLock(final URL url, final MapModel map) throws FileNotFoundException, IOException, XMLParseException,
+ URISyntaxException {
+ final File file = Compat.urlToFile(url);
+ if(file == null){
+ super.loadCatchExceptions(url, map);
+ return;
+ }
+ if (!file.exists()) {
+ throw new FileNotFoundException(TextUtils.format("file_not_found", file.getPath()));
+ }
+ if (!file.canWrite()) {
+ map.setReadOnly(true);
+ }
+ try {
+ final String lockingUser = tryToLock(map, file);
+ if (lockingUser != null) {
+ UITools.informationMessage(Controller.getCurrentController().getViewController().getCurrentRootComponent(),
+ TextUtils.format("map_locked_by_open", file.getName(), lockingUser));
+ map.setReadOnly(true);
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ UITools.informationMessage(Controller.getCurrentController().getViewController().getCurrentRootComponent(),
+ TextUtils.format("locking_failed_by_open", file.getName()));
+ map.setReadOnly(true);
+ }
+ if (file.length() != 0) {
+ //DOCEAR - fixed: set the file for the map before parsing the xml, necessary for some events
+ setFile(map, file);
+ NodeModel root = loadTree(map, file);
+ assert(map.getRootNode() == root);
+
+ }
+ if(map.getRootNode() == null)
+ map.createNewRoot();
+ }
+
+ public URL getAlternativeURL(final URL url, AlternativeFileMode mode){
+ try {
+ final File file = Compat.urlToFile(url);
+ if(file == null){
+ return url;
+ }
+ File alternativeFile;
+ alternativeFile = getAlternativeFile(file, mode);
+ if(alternativeFile != null)
+ return Compat.fileToUrl(alternativeFile);
+ else
+ return null;
+ }
+ catch (MalformedURLException e) {
+ }
+ catch (URISyntaxException e) {
+ }
+ return null;
+ }
+
+ public enum AlternativeFileMode{ALL, AUTOSAVE};
+ public File getAlternativeFile(final File file, AlternativeFileMode mode){
+ final File[] revisions = findFileRevisions(file, MFileManager.backupDir(file), mode);
+ if(revisions.length == 0 && mode == AlternativeFileMode.AUTOSAVE)
+ return file;
+ final FileRevisionsDialog newerFileRevisionsFoundDialog = new FileRevisionsDialog(file, revisions, mode);
+ final File selectedFile = newerFileRevisionsFoundDialog.getSelectedFile();
+ if(file.equals(selectedFile)){
+ boolean success = file.setLastModified(System.currentTimeMillis());
+ if (!success)
+ LogUtils.warn("Unable to set the last modification time for " + file);
+ }
+ return selectedFile;
+ }
+
+ /**@deprecated -- use MMapIO*/
+ @Deprecated
+ public NodeModel loadTree(final MapModel map, final File file) throws XMLParseException, IOException {
+ try {
+ final NodeModel rootNode = loadTreeImpl(map, file);
+ return rootNode;
+ }
+ catch (final Exception ex) {
+ final String errorMessage = "Error while parsing file:" + file;
+ LogUtils.warn(errorMessage, ex);
+ UITools.errorMessage(errorMessage);
+ final NodeModel result = new NodeModel(map);
+ result.setText(errorMessage);
+ return result;
+ }
+ }
+
+ private NodeModel loadTreeImpl(final MapModel map, final File f) throws FileNotFoundException, IOException,
+ XMLException, MapConversionException {
+ final BufferedInputStream file = new BufferedInputStream(new FileInputStream(f));
+ int versionInfoLength = 1000;
+ final byte[] buffer = new byte[versionInfoLength];
+ final int readCount = file.read(buffer);
+ final String mapStart = new String(buffer, FileUtils.defaultCharset().name());
+ final ByteArrayInputStream readBytes = new ByteArrayInputStream(buffer, 0, readCount);
+ final InputStream sequencedInput = new SequenceInputStream(readBytes, file);
+ Reader reader = null;
+ MapVersionInterpreter versionInterpreter = MapVersionInterpreter.getVersionInterpreter(mapStart);
+ map.addExtension(versionInterpreter);
+ if(versionInterpreter.anotherDialect){
+ String message = versionInterpreter.getDialectInfo(f.getAbsolutePath());
+ UITools.showMessage(message, JOptionPane.WARNING_MESSAGE);
+ }
+ if(versionInterpreter.needsConversion){
+ final int showResult = OptionalDontShowMeAgainDialog.show("really_convert_to_current_version",
+ "confirmation", MMapController.RESOURCES_CONVERT_TO_CURRENT_VERSION,
+ OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED);
+ IMapInputStreamConverter isConverter = versionInterpreter.getMapInputStreamConverter();
+ if (showResult != JOptionPane.OK_OPTION || isConverter == null) {
+ reader = new InputStreamReader(sequencedInput, FileUtils.defaultCharset());
+ }
+ else {
+ sequencedInput.close();
+ //reader = UrlManager.getUpdateReader(f, FREEPLANE_VERSION_UPDATER_XSLT);
+ reader = isConverter.getConvertedStream(f);
+ }
+ } else {
+ reader = new InputStreamReader(sequencedInput, FileUtils.defaultCharset());
+ }
+ try {
+ return Controller.getCurrentModeController().getMapController().getMapReader()
+ .createNodeTreeFromXml(map, reader, Mode.FILE);
+ }
+ finally {
+ FileUtils.silentlyClose(reader);
+ }
+ }
+
+ /**@deprecated -- use LinkController*/
+ @Deprecated
+ @Override
+ public void loadURL(final URI relative) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ if (map == null || map.getURL() == null) {
+ if (!relative.toString().startsWith("#") && !relative.isAbsolute() || relative.isOpaque()) {
+ Controller.getCurrentController().getViewController().out("You must save the current map first!");
+ final boolean result = ((MFileManager) UrlManager.getController()).save(map);
+ if (!result) {
+ return;
+ }
+ }
+ }
+ super.loadURL(relative);
+ }
+
+ /**@deprecated -- use MapIO*/
+ @Deprecated
+ public void open() {
+ final JFileChooser chooser = getFileChooser(false);
+ chooser.setMultiSelectionEnabled(true);
+ final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+ File[] selectedFiles;
+ selectedFiles = chooser.getSelectedFiles();
+ for (int i = 0; i < selectedFiles.length; i++) {
+ final File theFile = selectedFiles[i];
+ try {
+ setLastCurrentDir(theFile.getParentFile());
+ Controller.getCurrentModeController().getMapController().newMap(Compat.fileToUrl(theFile));
+ }
+ catch (final Exception ex) {
+ handleLoadingException(ex);
+ break;
+ }
+ }
+ Controller.getCurrentController().getMapViewManager().setMapTitles();
+ }
+
+ /**@deprecated -- use MMapIO*/
+ @Deprecated
+ public MapModel newMapFromDefaultTemplate() {
+ final File file = defaultTemplateFile();
+ if (file != null) {
+ return newMapFromTemplate(file);
+ }
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ final MapModel map = mapController.newMap();
+ mapController.setSaved(map, true);
+ return map;
+ }
+
+ @Override
+ public File defaultTemplateFile() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final String userDefinedTemplateFilePath = resourceController.getProperty(STANDARD_TEMPLATE);
+ final File userDefinedTemplateFile = new File(userDefinedTemplateFilePath);
+ if(userDefinedTemplateFile.isAbsolute() && userDefinedTemplateFile.exists() && ! userDefinedTemplateFile.isDirectory()){
+ return userDefinedTemplateFile;
+ }
+ for (final String filePath : new String[]{ userDefinedTemplateFilePath, resourceController.getDefaultProperty(STANDARD_TEMPLATE)}){
+ for (final File userTemplates : new File[]{ defaultUserTemplateDir(), defaultStandardTemplateDir()}){
+ if(userTemplates.isDirectory()) {
+ final File userStandard = new File(userTemplates, filePath);
+ if(userStandard.exists() && ! userStandard.isDirectory()) {
+ if(! filePath.equals(userDefinedTemplateFilePath))
+ resourceController.setProperty(STANDARD_TEMPLATE, filePath);
+ return userStandard;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public File defaultUserTemplateDir() {
+ final String userDir = ResourceController.getResourceController().getFreeplaneUserDirectory();
+ final File userTemplates = new File(userDir, "templates");
+ return userTemplates;
+ }
+
+ public File defaultStandardTemplateDir() {
+ final String resourceBaseDir = ResourceController.getResourceController().getResourceBaseDir();
+ final File allUserTemplates = new File(resourceBaseDir, "templates");
+ return allUserTemplates;
+ }
+
+ /**@deprecated -- use MMapIO*/
+ @Deprecated
+ public MapModel newMapFromTemplate(final File startFile) {
+ final File file;
+ if (startFile == null) {
+ file = getLastCurrentDir();
+ }
+ else if (startFile.isDirectory()) {
+ final JFileChooser chooser = getFileChooser(true);
+ chooser.setCurrentDirectory(startFile);
+ final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return null;
+ }
+ file = chooser.getSelectedFile();
+ }
+ else {
+ file = startFile;
+ }
+ try {
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ mapController.newUntitledMap(Compat.fileToUrl(file));
+ final Controller controller = Controller.getCurrentController();
+ final MapModel map = controller.getMap();
+ final Object rootText = map.getRootNode().getUserObject();
+ if(rootText instanceof TranslatedObject){
+ map.getRootNode().setText(rootText.toString());
+ }
+ controller.getModeController().getMapController().setSaved(map, true);
+ return map;
+ }
+ catch (Exception e) {
+ handleLoadingException(e);
+ }
+ return null;
+ }
+
+ /**@deprecated -- use MMapIO*/
+ @Deprecated
+ public void saveAsUserTemplate() {
+ final JFileChooser chooser = new JFileChooser();
+ final FileFilter filter = getFileFilter();
+ chooser.addChoosableFileFilter(filter);
+ chooser.setFileFilter(filter);
+ final File userTemplates = defaultUserTemplateDir();
+ chooser.setCurrentDirectory(userTemplates);
+ final int returnVal = chooser
+ .showOpenDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return;
+ }
+ File file = chooser.getSelectedFile();
+ if (file.exists()) {
+ final int overwriteMap = JOptionPane.showConfirmDialog(Controller.getCurrentController()
+ .getMapViewManager().getMapViewComponent(), TextUtils.getText("map_already_exists"), "Freeplane",
+ JOptionPane.YES_NO_OPTION);
+ if (overwriteMap != JOptionPane.YES_OPTION) {
+ return;
+ }
+ }
+ saveInternal((MMapModel) Controller.getCurrentController().getMap(), file, false);
+ }
+
+ /**@deprecated -- use MMapIO*/
+ @Deprecated
+ public boolean save(final MapModel map) {
+ if (map == null || map.isSaved()) {
+ return true;
+ }
+ if (map.getURL() == null || map.isReadOnly()) {
+ return saveAs(map);
+ }
+ else {
+ return save(map, map.getFile());
+ }
+ }
+
+ /**@deprecated -- use MMapIO*/
+ @Deprecated
+ public boolean save(final MapModel map, final File file) {
+ if(file == null){
+ return saveAs(map);
+ }
+ try {
+ if (null == map.getExtension(BackupFlag.class)) {
+ map.addExtension(new BackupFlag());
+ backup(file);
+ }
+ final String lockingUser = tryToLock(map, file);
+ if (lockingUser != null) {
+ UITools.informationMessage(Controller.getCurrentController().getViewController().getCurrentRootComponent(),
+ TextUtils.format("map_locked_by_save_as", file.getName(), lockingUser));
+ return false;
+ }
+ }
+ catch (final Exception e) {
+ UITools.informationMessage(Controller.getCurrentController().getViewController().getCurrentRootComponent(),
+ TextUtils.format("locking_failed_by_save_as", file.getName()));
+ return false;
+ }
+ final URL urlBefore = map.getURL();
+ final boolean saved = saveInternal((MMapModel) map, file, false);
+ if (!saved) {
+ return false;
+ }
+ map.setReadOnly(false);
+ final URL urlAfter = map.getURL();
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ mapController.fireMapChanged(new MapChangeEvent(this, map, UrlManager.MAP_URL, urlBefore, urlAfter));
+ mapController.setSaved(map, true);
+ return true;
+ }
+
+ /**@deprecated -- use MMapIO*/
+ @Deprecated
+ public boolean saveAs(final MapModel map) {
+ final JFileChooser chooser = getFileChooser(true);
+ if (getMapsParentFile(map) == null) {
+ File defaultFile = new File(getFileNameProposal(map)
+ + org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION);
+ chooser.setSelectedFile(defaultFile);
+ }
+ else {
+ chooser.setSelectedFile(map.getFile());
+ }
+ chooser.setDialogTitle(TextUtils.getText("SaveAsAction.text"));
+ final int returnVal = chooser
+ .showSaveDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return false;
+ }
+ File f = chooser.getSelectedFile();
+ setLastCurrentDir(f.getParentFile());
+ final String ext = FileUtils.getExtension(f.getName());
+ if (!ext.equals(org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION_WITHOUT_DOT)) {
+ f = new File(f.getParent(), f.getName()
+ + org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION);
+ }
+ if (f.exists()) {
+ final int overwriteMap = JOptionPane.showConfirmDialog(Controller.getCurrentController()
+ .getMapViewManager().getMapViewComponent(), TextUtils.getText("map_already_exists"), "Freeplane",
+ JOptionPane.YES_NO_OPTION);
+ if (overwriteMap != JOptionPane.YES_OPTION) {
+ return false;
+ }
+ }
+ // extra backup in this case.
+ File oldFile = map.getFile();
+ if (oldFile != null) {
+ oldFile = oldFile.getAbsoluteFile();
+ }
+ if (!f.getAbsoluteFile().equals(oldFile) && null != map.getExtension(BackupFlag.class)) {
+ map.removeExtension(BackupFlag.class);
+ }
+ if (save(map, f)) {
+ Controller.getCurrentController().getMapViewManager().updateMapViewName();
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * This method is intended to provide both normal save routines and saving
+ * of temporary (internal) files.
+ */
+ boolean saveInternal(final MMapModel map, final File file, final boolean isInternal) {
+ if (file.exists() && !file.canWrite()) {
+ JOptionPane.showMessageDialog(Controller.getCurrentController()
+ .getMapViewManager().getMapViewComponent(),
+ TextUtils.format("SaveAs_toReadonlyMsg", file),
+ TextUtils.getText("SaveAs_toReadonlyTitle"),
+ JOptionPane.WARNING_MESSAGE);
+ return false;
+ }
+ try {
+ if (map.getTimerForAutomaticSaving() != null) {
+ map.getTimerForAutomaticSaving().cancel();
+ }
+ if (!isInternal) {
+ setFile(map, file);
+ }
+ writeToFile(map, file);
+ if (!isInternal) {
+ map.setSaved(true);
+ }
+ map.scheduleTimerForAutomaticSaving();
+ return true;
+ }
+ catch (final IOException e) {
+ final String message = TextUtils.format("save_failed", file.getName());
+ if (!isInternal) {
+ UITools.errorMessage(message);
+ }
+ else {
+ Controller.getCurrentController().getViewController().out(message);
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe("Error in MapModel.save(): ", e);
+ }
+ map.scheduleTimerForAutomaticSaving();
+ return false;
+ }
+
+ /**@deprecated -- use MMapIO*/
+ @Deprecated
+ public void writeToFile(final MapModel map, final File file) throws FileNotFoundException, IOException {
+ final FileOutputStream out = new FileOutputStream(file);
+ FileLock lock = null;
+ try{
+ boolean lockedByOtherApplication = false;
+ try {
+ lock = out.getChannel().tryLock();
+ lockedByOtherApplication = lock == null;
+ }
+ catch (Exception e) {
+ LogUtils.warn(e.getMessage());
+ }
+ if (lockedByOtherApplication) {
+ throw new IOException("can not obtain file lock for " + file);
+ }
+ final BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(out));
+ Controller.getCurrentModeController().getMapController().getMapWriter()
+ .writeMapAsXml(map, fileout, Mode.FILE, true, false);
+ }
+ finally{
+ if (lock != null && lock.isValid())
+ lock.release();
+ if(out != null)
+ out.close();
+ }
+ }
+
+ public void setFile(final MapModel map, final File file) {
+ try {
+ final URL url = Compat.fileToUrl(file);
+ setURL(map, url);
+ }
+ catch (final MalformedURLException e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ /**
+ * Attempts to lock the map using a semaphore file
+ *
+ * @return If the map is locked, return the name of the locking user,
+ * otherwise return null.
+ * @throws Exception
+ * , when the locking failed for other reasons than that the
+ * file is being edited.
+ *
+ * @deprecated -- use MMapIO
+ */
+ @Deprecated
+ public String tryToLock(final MapModel map, final File file) throws Exception {
+ final String lockingUser = ((MMapModel) map).getLockManager().tryToLock(file);
+ final String lockingUserOfOldLock = ((MMapModel) map).getLockManager().popLockingUserOfOldLock();
+ if (lockingUserOfOldLock != null) {
+ UITools.informationMessage(UITools.getCurrentRootComponent(),
+ TextUtils.format("locking_old_lock_removed", file.getName(), lockingUserOfOldLock));
+ }
+ return lockingUser;
+ }
+
+ public void afterViewChange(final Component oldView, final Component newView) {
+ }
+
+ public void afterViewClose(final Component oldView) {
+ }
+
+ public void afterViewCreated(final Component mapView) {
+ if (mapView != null) {
+ final FileOpener fileOpener = new FileOpener("mm", new DroppedMindMapOpener());
+ new DropTarget(mapView, fileOpener);
+ }
+ }
+
+ public void beforeViewChange(final Component oldView, final Component newView) {
+ }
+
+ public static MFileManager getController(ModeController modeController) {
+ return (MFileManager) modeController.getExtension(UrlManager.class);
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/NewMapAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/NewMapAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/mindmapmode/NewMapAction.java
rename to freeplane/src/main/java/org/freeplane/features/url/mindmapmode/NewMapAction.java
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/NewMapFromTemplateAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/NewMapFromTemplateAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/mindmapmode/NewMapFromTemplateAction.java
rename to freeplane/src/main/java/org/freeplane/features/url/mindmapmode/NewMapFromTemplateAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/OpenAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/OpenAction.java
new file mode 100644
index 0000000..dcd7eb6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/OpenAction.java
@@ -0,0 +1,48 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+
+public class OpenAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public OpenAction() {
+ super("OpenAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentController().getModeController(MModeController.MODENAME);
+ MFileManager.getController(modeController).open();
+ Controller.getCurrentController().getMapViewManager().setMapTitles();
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/OpenURLMapAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/OpenURLMapAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/mindmapmode/OpenURLMapAction.java
rename to freeplane/src/main/java/org/freeplane/features/url/mindmapmode/OpenURLMapAction.java
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/OpenUserDirAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/OpenUserDirAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/mindmapmode/OpenUserDirAction.java
rename to freeplane/src/main/java/org/freeplane/features/url/mindmapmode/OpenUserDirAction.java
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/RevertAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/RevertAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/mindmapmode/RevertAction.java
rename to freeplane/src/main/java/org/freeplane/features/url/mindmapmode/RevertAction.java
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/SaveAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/SaveAction.java
new file mode 100644
index 0000000..02d4f10
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/SaveAction.java
@@ -0,0 +1,71 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+
+ at EnabledAction(checkOnNodeChange=true)
+
+class SaveAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public SaveAction() {
+ super("SaveAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ if (Controller.getCurrentController().getMap().isReadOnly()) {
+ JOptionPane.showMessageDialog(Controller.getCurrentController()
+ .getMapViewManager().getMapViewComponent(),
+ TextUtils.getText("SaveAction_readonlyMsg"),
+ TextUtils.getText("SaveAction_readonlyTitle"),
+ JOptionPane.WARNING_MESSAGE);
+ return;
+ }
+ final boolean success = ((MModeController) Controller.getCurrentModeController()).save();
+ final Controller controller = Controller.getCurrentController();
+ if (success) {
+ controller.getViewController().out(TextUtils.getText("saved"));
+ }
+ else {
+ controller.getViewController().out(TextUtils.getText("saving_canceled"));
+ }
+ controller.getMapViewManager().setMapTitles();
+ }
+
+ @Override
+ public void setEnabled() {
+ final Controller controller = Controller.getCurrentController();
+ MapModel map = controller.getMap();
+ setEnabled(map != null && ! map.isSaved());
+ }
+}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAll.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/SaveAll.java
similarity index 100%
rename from freeplane/src/org/freeplane/features/url/mindmapmode/SaveAll.java
rename to freeplane/src/main/java/org/freeplane/features/url/mindmapmode/SaveAll.java
diff --git a/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/SaveAsAction.java b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/SaveAsAction.java
new file mode 100644
index 0000000..ad0f89e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/features/url/mindmapmode/SaveAsAction.java
@@ -0,0 +1,44 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.url.mindmapmode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+
+
+class SaveAsAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public SaveAsAction() {
+ super("SaveAsAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ ((MFileManager) UrlManager.getController()).saveAs(Controller.getCurrentController().getMap());
+ Controller.getCurrentController().getMapViewManager().setMapTitles();
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/addons/AddOnInstaller.java b/freeplane/src/main/java/org/freeplane/main/addons/AddOnInstaller.java
similarity index 100%
rename from freeplane/src/org/freeplane/main/addons/AddOnInstaller.java
rename to freeplane/src/main/java/org/freeplane/main/addons/AddOnInstaller.java
diff --git a/freeplane/src/main/java/org/freeplane/main/addons/AddOnProperties.java b/freeplane/src/main/java/org/freeplane/main/addons/AddOnProperties.java
new file mode 100644
index 0000000..3440cf1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/addons/AddOnProperties.java
@@ -0,0 +1,507 @@
+package org.freeplane.main.addons;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.n3.nanoxml.CdataContentXmlWriter;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+public class AddOnProperties {
+ public enum AddOnType {
+ SCRIPT, PLUGIN
+ }
+ public static final String OP_CONFIGURE = "configure";
+ public static final String OP_DEACTIVATE = "deactivate";
+ public static final String OP_ACTIVATE = "activate";
+ public static final String OP_DEINSTALL = "deinstall";
+
+ private final AddOnType addOnType;
+ private boolean active = true;
+ private String name;
+ private String author;
+ // installed version
+ private String version;
+ // latest known version
+ // filled by the updater to use it either in the updater
+ // or in the add-on manager
+ private String latestVersion;
+ private FreeplaneVersion freeplaneVersionFrom;
+ private FreeplaneVersion freeplaneVersionTo;
+ private URL homepage;
+ // the URL source to fetch the latest version
+ private URL updateUrl;
+ // extra URL where to download the latest version and changelog
+ // these are not stored in the xml file, they are only updated dynamically during update check
+ private URL latestVersionDownloadUrl;
+ private URL latestVersionChangelogUrl;
+ private String description;
+ private String license;
+ private Map<String, Map<String, String>> translations;
+ private String preferencesXml;
+ private Map<String, String> defaultProperties;
+ private List<String[/*action, file*/]> deinstallationRules;
+ private List<String> images;
+ private File addOnPropertiesFile;
+
+ public AddOnProperties(AddOnType addOnType) {
+ this.addOnType = addOnType;
+ }
+
+ public AddOnProperties(AddOnType addOnType, XMLElement addOnElement) {
+ this(addOnType);
+ this.setName(addOnElement.getAttribute("name", null));
+ this.setVersion(addOnElement.getAttribute("version", null));
+ this.setLatestVersion(addOnElement.getAttribute("latestVersion", null));
+ this.setFreeplaneVersionFrom(FreeplaneVersion.getVersion(addOnElement.getAttribute("freeplaneVersionFrom",
+ null)));
+ this.setFreeplaneVersionTo(FreeplaneVersion.getVersion(addOnElement.getAttribute("freeplaneVersionTo", null)));
+ this.setHomepage(parseUrl(addOnElement.getAttribute("homepage", null)));
+ this.setUpdateUrl(parseUrl(addOnElement.getAttribute("updateUrl", null)));
+ this.setActive(Boolean.parseBoolean(addOnElement.getAttribute("active", "true")));
+ this.setDescription(getContentOfFirstElement(addOnElement.getChildrenNamed("description")));
+ this.setLicense(getContentOfFirstElement(addOnElement.getChildrenNamed("license")));
+ this.setAuthor(addOnElement.getAttribute("author", null));
+ this.setTranslations(parseTranslations(addOnElement.getChildrenNamed("translations")));
+ this.setPreferencesXml(getContentOfFirstElement(addOnElement.getChildrenNamed("preferences.xml")));
+ this.setDefaultProperties(parseAttributesToProperties(addOnElement.getChildrenNamed("default.properties")));
+ this.setImages(parseBinaries(addOnElement.getChildrenNamed("images")));
+ this.setDeinstallationRules(parseDeinstallationRules(addOnElement.getChildrenNamed("deinstall")));
+ validate();
+ }
+
+ private URL parseUrl(String url) {
+ try {
+ return new URL(url);
+ }
+ catch (Exception e) {
+ return null;
+ }
+ }
+
+ private String getContentOfFirstElement(Vector<XMLElement> xmlElements) {
+ if (xmlElements == null || xmlElements.isEmpty())
+ return null;
+ return xmlElements.get(0).getContent();
+ }
+
+ private Map<String, Map<String, String>> parseTranslations(Vector<XMLElement> xmlElements) {
+ final Map<String, Map<String, String>> result = new HashMap<String, Map<String, String>>();
+ if (xmlElements != null && !xmlElements.isEmpty()) {
+ for (XMLElement xmlElement : xmlElements.get(0).getChildren()) {
+ Map<String, String> properties = new LinkedHashMap<String, String>();
+ result.put(xmlElement.getAttribute("name", null), properties);
+ for (XMLElement entryXmlElement : xmlElement.getChildren()) {
+ properties.put(entryXmlElement.getAttribute("key", null), entryXmlElement.getContent());
+ }
+ }
+ }
+ return result;
+ }
+
+ private Map<String, String> parseAttributesToProperties(Vector<XMLElement> xmlElements) {
+ if (xmlElements == null || xmlElements.isEmpty())
+ return Collections.emptyMap();
+ return propertiesToStringMap(xmlElements.get(0).getAttributes());
+ }
+
+ private Map<String, String> propertiesToStringMap(Properties props) {
+ final LinkedHashMap<String, String> result = new LinkedHashMap<String, String>();
+ for (Entry<Object, Object> entry : props.entrySet()) {
+ result.put((String) entry.getKey(), (String) entry.getValue());
+ }
+ return result;
+ }
+
+ protected List<String> parseBinaries(Vector<XMLElement> xmlElements) {
+ final List<String> result = new ArrayList<String>();
+ if (xmlElements != null && !xmlElements.isEmpty()) {
+ for (XMLElement xmlElement : xmlElements.get(0).getChildren()) {
+ result.add(xmlElement.getAttribute("name", null));
+ }
+ }
+ return result;
+ }
+
+ private List<String[]> parseDeinstallationRules(Vector<XMLElement> xmlElements) {
+ final List<String[]> result = new ArrayList<String[]>();
+ if (xmlElements != null && !xmlElements.isEmpty()) {
+ for (XMLElement xmlElement : xmlElements.get(0).getChildren()) {
+ result.add(new String[] { xmlElement.getName(), xmlElement.getContent() });
+ }
+ }
+ return result;
+ }
+
+ private void validate() {
+ if (empty(name))
+ throw new RuntimeException("while parsing .addon.xml file: name must be set");
+ if (empty(version))
+ throw new RuntimeException("while parsing .addon.xml file: version must be set");
+ if (freeplaneVersionFrom == null)
+ throw new RuntimeException("while parsing .addon.xml file: freeplaneVersionFrom must be set");
+ if (empty(description))
+ throw new RuntimeException("while parsing .addon.xml file: description must be set");
+ }
+
+ public AddOnType getAddOnType() {
+ return addOnType;
+ }
+
+ /** returns the key that is used to lookup the translated name of the add-on. */
+ public String getNameKey() {
+ return "addons." + name;
+ }
+
+ public String getTranslatedName() {
+ return TextUtils.getRawText(getNameKey());
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(String author) {
+ this.author = author;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ public String getVersion() {
+ return version;
+ }
+
+ public String getLatestVersion() {
+ return latestVersion;
+ }
+
+ public URL getLatestVersionDownloadUrl() {
+ return latestVersionDownloadUrl;
+ }
+
+ public URL getLatestVersionChangelogUrl() {
+ return latestVersionChangelogUrl;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
+
+ public void setLatestVersionDownloadUrl(URL latestVersionDownloadUrl) {
+ this.latestVersionDownloadUrl = latestVersionDownloadUrl;
+ }
+
+ public void setLatestVersionChangelogUrl(URL latestVersionChangelogUrl) {
+ this.latestVersionChangelogUrl = latestVersionChangelogUrl;
+ }
+
+ public void setLatestVersion(String latestVersion) {
+ this.latestVersion = latestVersion;
+ }
+
+ public FreeplaneVersion getFreeplaneVersionFrom() {
+ return freeplaneVersionFrom;
+ }
+
+ public void setFreeplaneVersionFrom(FreeplaneVersion freeplaneVersionFrom) {
+ this.freeplaneVersionFrom = freeplaneVersionFrom;
+ }
+
+ public FreeplaneVersion getFreeplaneVersionTo() {
+ return freeplaneVersionTo;
+ }
+
+ public void setFreeplaneVersionTo(FreeplaneVersion freeplaneVersionTo) {
+ this.freeplaneVersionTo = freeplaneVersionTo;
+ }
+
+ public URL getHomepage() {
+ return homepage;
+ }
+
+ // If the updateUrl is not set, the default is $homepage/version.txt
+ // This will help to update old add-ons.
+ public URL getUpdateUrl() {
+ if (updateUrl != null)
+ return updateUrl;
+ else if (homepage != null && !homepage.getPath().isEmpty())
+ return homepagePlusLatestVersionFile();
+ else
+ return null;
+ }
+
+ private URL homepagePlusLatestVersionFile() {
+ try {
+ final String pathWithForwardSlashes = homepage.getPath() + '/' + AddOnsController.LATEST_VERSION_FILE;
+ return new URL(homepage.getProtocol(), homepage.getHost(), homepage.getPort(), pathWithForwardSlashes);
+ }
+ catch (MalformedURLException e) {
+ return null;
+ }
+ }
+
+ public void setHomepage(URL homepage) {
+ this.homepage = homepage;
+ }
+
+ public void setUpdateUrl(Object updateUrl) {
+ this.updateUrl = toURL(updateUrl);
+ }
+
+ private URL toURL(Object updateUrl) {
+ try {
+ if (updateUrl == null)
+ return null;
+ else if (updateUrl instanceof URL)
+ return (URL) updateUrl;
+ else if (updateUrl instanceof URI)
+ return ((URI) updateUrl).toURL();
+ else
+ return new URL((String) updateUrl.toString());
+ }
+ catch (MalformedURLException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getLicense() {
+ return license;
+ }
+
+ public void setLicense(String license) {
+ this.license = license;
+ }
+
+ public Map<String, Map<String, String>> getTranslations() {
+ return translations;
+ }
+
+ public void setTranslations(Map<String, Map<String, String>> translations) {
+ this.translations = translations;
+ }
+
+ public String getPreferencesXml() {
+ return preferencesXml;
+ }
+
+ public void setPreferencesXml(String preferencesXml) {
+ this.preferencesXml = preferencesXml;
+ }
+
+ public Map<String, String> getDefaultProperties() {
+ return defaultProperties;
+ }
+
+ public void setDefaultProperties(Map<String, String> defaultProperties) {
+ this.defaultProperties = defaultProperties;
+ }
+
+ public List<String[]> getDeinstallationRules() {
+ return deinstallationRules;
+ }
+
+ public void setDeinstallationRules(List<String[]> rules) {
+ this.deinstallationRules = rules;
+ }
+
+ public List<String> getImages() {
+ return images;
+ }
+
+ public void setImages(Collection<String> images) {
+ this.images = new ArrayList<String>(images);
+ }
+
+ /** the persistence location of this AddOnProperties object. */
+ public File getAddOnPropertiesFile() {
+ return addOnPropertiesFile;
+ }
+
+ public void setAddOnPropertiesFile(File file) {
+ addOnPropertiesFile = file;
+ }
+
+ public boolean supportsOperation(String opName) {
+ if (opName.equals(OP_CONFIGURE))
+ return !empty(preferencesXml);
+ if (opName.equals(OP_DEACTIVATE))
+ return active;
+ if (opName.equals(OP_ACTIVATE))
+ return !active;
+ if (opName.equals(OP_DEINSTALL))
+ return deinstallationRules != null && !deinstallationRules.isEmpty();
+ return false;
+ }
+
+ public String toXmlString() {
+ try {
+ final String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
+ final StringWriter writer = new StringWriter();
+ final CdataContentXmlWriter xmlWriter = new CdataContentXmlWriter(writer);
+ xmlWriter.addRawContent(header);
+ xmlWriter.addRawContent(System.getProperty("line.separator"));
+ xmlWriter.write(toXml(), true);
+ return writer.toString();
+ }
+ catch (IOException e) {
+ // StringWriter does not throw an exception but anyhow...
+ throw new RuntimeException(e);
+ }
+ }
+
+ // // this is the Groovy equivalent for all this below - removed from the script to avoid redundancies
+ // writer.write('<?xml version="1.0" encoding="UTF-8"?>' + System.getProperty("line.separator"))
+ // new MarkupBuilder(writer).addon( configMap['properties'] ) {
+ // description('') {
+ // writer.write('<![CDATA[' + configMap['description'] + ']]>')
+ // }
+ // permissions( configMap['permissions'] )
+ // translations {
+ // configMap['translations'].collect{ loc, translationMap ->
+ // locale( name:loc ) {
+ // translationMap.collect{ k,v ->
+ // entry(key:k, v)
+ // }
+ // }
+ // }
+ // }
+ // 'preferences.xml'('') {
+ // writer.write('<![CDATA[' + configMap['preferences.xml'] + ']]>')
+ // }
+ // 'default.properties'( configMap['default.properties'] )
+ // deinstall {
+ // configMap['deinstall'].collect { pair ->
+ // "${pair[0]}"(pair[1])
+ // }
+ // }
+ // }
+ // writer.close()
+ public XMLElement toXml() {
+ final XMLElement addonElement = new XMLElement("addon");
+ addonElement.setAttribute("name", name);
+ addonElement.setAttribute("version", version);
+ addonElement.setAttribute("latestVersion", latestVersion == null ? "" : latestVersion);
+ addonElement.setAttribute("freeplaneVersionFrom", freeplaneVersionFrom.toString());
+ if (freeplaneVersionTo != null)
+ addonElement.setAttribute("freeplaneVersionTo", freeplaneVersionTo.toString());
+ if (homepage != null)
+ addonElement.setAttribute("homepage", homepage.toString());
+ if (updateUrl != null)
+ addonElement.setAttribute("updateUrl", updateUrl.toString());
+ if (author != null)
+ addonElement.setAttribute("author", author);
+ addonElement.setAttribute("active", Boolean.toString(active));
+ addAsChildWithContent(addonElement, "description", description);
+ addAsChildWithContent(addonElement, "license", license);
+ addAsChildWithContent(addonElement, "preferences.xml", preferencesXml);
+ addTranslationsAsChild(addonElement);
+ addDefaultPropertiesAsChild(addonElement);
+ addImagesAsChild(addonElement);
+ addDeinstallationRulesAsChild(addonElement);
+ return addonElement;
+ }
+
+ private void addAsChildWithContent(XMLElement parent, String name, String content) {
+ final XMLElement xmlElement = new XMLElement(name);
+ xmlElement.setContent(content);
+ parent.addChild(xmlElement);
+ }
+
+ private void addTranslationsAsChild(XMLElement parent) {
+ final XMLElement translationsElement = new XMLElement("translations");
+ for (Entry<String, Map<String, String>> localeEntry : translations.entrySet()) {
+ final XMLElement localeElement = new XMLElement("locale");
+ localeElement.setAttribute("name", localeEntry.getKey());
+ for (Entry<String, String> translationEntry : localeEntry.getValue().entrySet()) {
+ final XMLElement translationElement = new XMLElement("entry");
+ translationElement.setAttribute("key", translationEntry.getKey());
+ translationElement.setContent(StringEscapeUtils.escapeJava(translationEntry.getValue()));
+ localeElement.addChild(translationElement);
+ }
+ translationsElement.addChild(localeElement);
+ }
+ parent.addChild(translationsElement);
+ }
+
+ private void addDefaultPropertiesAsChild(XMLElement parent) {
+ final XMLElement xmlElement = new XMLElement("default.properties");
+ for (Entry<String, String> entry : defaultProperties.entrySet()) {
+ xmlElement.setAttribute(entry.getKey(), entry.getValue());
+ }
+ parent.addChild(xmlElement);
+ }
+
+ private void addImagesAsChild(XMLElement parent) {
+ final XMLElement xmlElement = new XMLElement("images");
+ if (images != null) {
+ for (String image : images) {
+ final XMLElement imageElement = new XMLElement("image");
+ imageElement.setAttribute("name", image);
+ xmlElement.addChild(imageElement);
+ }
+ }
+ parent.addChild(xmlElement);
+ }
+
+ private void addDeinstallationRulesAsChild(XMLElement parent) {
+ final XMLElement xmlElement = new XMLElement("deinstall");
+ for (String[] rule : deinstallationRules) {
+ final XMLElement ruleElement = new XMLElement(rule[0]);
+ ruleElement.setContent(rule[1]);
+ xmlElement.addChild(ruleElement);
+ }
+ parent.addChild(xmlElement);
+ }
+
+ private boolean empty(String string) {
+ return string == null || string.length() == 0;
+ }
+
+ @Override
+ public String toString() {
+ return "AddOnProperties(addOnType=" + addOnType + ", active=" + active + ", name=" + name + ", version="
+ + version + ")";
+ }
+
+ public boolean isTheme() {
+ return name != null && name.toLowerCase().endsWith("theme");
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/addons/AddOnsController.java b/freeplane/src/main/java/org/freeplane/main/addons/AddOnsController.java
new file mode 100644
index 0000000..8ff243d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/addons/AddOnsController.java
@@ -0,0 +1,251 @@
+package org.freeplane.main.addons;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.StringReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.swing.JOptionPane;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.main.addons.AddOnProperties.AddOnType;
+import org.freeplane.n3.nanoxml.IXMLParser;
+import org.freeplane.n3.nanoxml.IXMLReader;
+import org.freeplane.n3.nanoxml.StdXMLReader;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.n3.nanoxml.XMLParserFactory;
+
+public class AddOnsController {
+ private static final String ADDONS_DIR = "addons";
+ private static AddOnsController addOnsController;
+ private List<AddOnProperties> installedAddOns = new ArrayList<AddOnProperties>();
+ private boolean autoInstall;
+ public static final String LATEST_VERSION_FILE = "version.properties";
+
+ public AddOnsController() {
+ createAddOnsDirIfNecessary();
+ registerPlugins();
+ autoInstall = true;
+ }
+
+ private void createAddOnsDirIfNecessary() {
+ final File addOnsDir = getAddOnsDir();
+ // in applets the addOnsDir will be null
+ if (addOnsDir != null && !addOnsDir.exists()) {
+ LogUtils.info("creating user add-ons directory " + addOnsDir);
+ addOnsDir.mkdirs();
+ }
+ }
+
+ private void registerPlugins() {
+ final File addOnsDir = getAddOnsDir();
+ // in applets the addOnsDir will be null
+ if (addOnsDir == null)
+ return;
+ File[] addonXmlFiles = addOnsDir.listFiles(new FilenameFilter() {
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".plugin.xml");
+ }
+ });
+ final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
+ for (File file : addonXmlFiles) {
+ BufferedInputStream inputStream = null;
+ try {
+ inputStream = new BufferedInputStream(new FileInputStream(file));
+ final IXMLReader reader = new StdXMLReader(inputStream);
+ parser.setReader(reader);
+ registerInstalledAddOn(new AddOnProperties(AddOnType.PLUGIN, (XMLElement) parser.parse()));
+ }
+ catch (final Exception e) {
+ LogUtils.warn("error parsing " + file, e);
+ }
+ finally {
+ FileUtils.silentlyClose(inputStream);
+ }
+ }
+ }
+
+ public static AddOnsController getController() {
+ if (addOnsController == null)
+ addOnsController = new AddOnsController();
+ return addOnsController;
+ }
+
+ public List<AddOnProperties> getInstalledAddOns() {
+ return Collections.unmodifiableList(new ArrayList<AddOnProperties>(installedAddOns));
+ }
+
+ public void registerInstalledAddOn(final AddOnProperties addOn) {
+ installedAddOns.add(addOn);
+ final ResourceController resourceController = ResourceController.getResourceController();
+ if (addOn.getDefaultProperties() != null)
+ resourceController.addDefaults(addOn.getDefaultProperties());
+ if (addOn.getPreferencesXml() != null) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (modeController instanceof MModeController) {
+ ((MModeController)modeController).getOptionPanelBuilder().load(new StringReader(addOn.getPreferencesXml()));
+ }
+ }
+ if (addOn.getTranslations() != null)
+ registerAddOnResources(addOn, resourceController);
+ }
+
+ /** make the translations of this add-on known system-wide.
+ * Translations of add-ons will always be much worse than of Freeplane itself. By copying translation
+ * for the default language to the selected language we avoid ugly "[translate me]" strings. */
+ public static void registerAddOnResources(final AddOnProperties addOn, final ResourceController rc) {
+ LinkedHashMap<String, Map<String, String>> translations = new LinkedHashMap<>();
+ String defaultLanguage = rc.getDefaultLanguageCode();
+ translations.put(defaultLanguage, getLanguageResources(addOn, defaultLanguage));
+ if (!defaultLanguage.equals(rc.getLanguageCode())) {
+ translations.put(rc.getLanguageCode(), getLanguageResources(addOn, rc.getLanguageCode()));
+ completeResourcesFromDefault(translations.get(defaultLanguage), translations.get(rc.getLanguageCode()));
+ }
+ for (Entry<String, Map<String, String>> entry : translations.entrySet()) {
+ rc.addLanguageResources(entry.getKey(), entry.getValue());
+ rc.addLanguageResources(entry.getKey(), addOptionPanelPrefix(entry.getValue(), addOn.getName()));
+ }
+ }
+
+ private static void completeResourcesFromDefault(Map<String, String> defaultResources,
+ Map<String, String> selectedLanguageResources) {
+ for (Entry<String, String> entry : defaultResources.entrySet()) {
+ if (selectedLanguageResources.get(entry.getKey()) == null) {
+ selectedLanguageResources.put(entry.getKey(), entry.getValue());
+ }
+ }
+ }
+
+ private static Map<String, String> getLanguageResources(AddOnProperties addOn, String language) {
+ final Map<String, String> resources = addOn.getTranslations().get(language);
+ if (resources != null) {
+ return unescapeStrings(new LinkedHashMap<>(resources));
+ }
+ else {
+ return new LinkedHashMap<String, String>();
+ }
+ }
+
+ private static Map<String, String> unescapeStrings(final Map<String, String> resources) {
+ for (Entry<String, String> entry : resources.entrySet()) {
+ if (entry.getValue().indexOf('\\') != -1) {
+ // convert \uFFFF sequences
+ entry.setValue(StringEscapeUtils.unescapeJava(entry.getValue()));
+ }
+ }
+ return resources;
+ }
+
+ /** if the add-on is configurable it's a burden for the add-on-writer that the keys in the configuration are
+ * prepended by "OptionPanel.". This code relieves the developer from taking care of that. */
+ private static Map<String, String> addOptionPanelPrefix(final Map<String, String> resources, final String addOnName) {
+ final HashMap<String, String> result = new HashMap<String, String>(resources.size());
+ for (Entry<String, String> entry : resources.entrySet()) {
+ result.put("OptionPanel." + entry.getKey(), entry.getValue());
+ }
+ final String nameKey = "addons." + addOnName;
+ result.put("OptionPanel.separator." + nameKey, resources.get(nameKey));
+ return result;
+ }
+
+ public File getAddOnsDir() {
+ // in applets the userDir will be null
+ final String userDir = ResourceController.getResourceController().getFreeplaneUserDirectory();
+ return userDir == null ? null : new File(userDir, ADDONS_DIR);
+ }
+
+ public void save(final AddOnProperties addOn) throws IOException {
+ final File addOnsDir = getAddOnsDir();
+ if (addOnsDir != null) {
+ File file = addOn.getAddOnPropertiesFile();
+ if (file == null) {
+ file = new File(addOnsDir, addOn.getName() + "." + addOn.getAddOnType().name().toLowerCase() + ".xml");
+ }
+ FileUtils.dumpStringToFile(addOn.toXmlString(), file, "UTF-8");
+ }
+ }
+
+ public void deinstall(AddOnProperties addOn) {
+ LogUtils.info("deinstalling " + addOn);
+ for (String[] rule : addOn.getDeinstallationRules()) {
+ if (rule[0].equals("delete")) {
+ final File file = new File(expandVariables(rule));
+ if (!file.exists()) {
+ LogUtils.warn("file " + expandVariables(rule) + " should be deleted but does not exist");
+ }
+ else {
+ if (file.delete())
+ LogUtils.info("deleted " + expandVariables(rule));
+ else
+ LogUtils.warn("could not delete file " + expandVariables(rule));
+ }
+ }
+ }
+ installedAddOns.remove(addOn);
+ }
+
+ private String expandVariables(String[] rule) {
+ return rule[1].replace("${installationbase}", ResourceController.getResourceController()
+ .getFreeplaneUserDirectory());
+ }
+
+ /** returns true if the url is an add-on package and the user decided to install it. */
+ public boolean installIfAppropriate(final URL url) {
+ if(! autoInstall)
+ return false;
+ if (url.getFile().endsWith(UrlManager.FREEPLANE_ADD_ON_FILE_EXTENSION)) {
+ AddOnInstaller installer = (AddOnInstaller) Controller.getCurrentModeController().getExtension(
+ AddOnInstaller.class);
+ if (installer == null) {
+ LogUtils.warn("no AddOnInstaller registered. Cannot install " + url);
+ return false;
+ }
+ UITools.backOtherWindows();
+ final int selection = UITools.showConfirmDialog(null,
+ TextUtils.format("newmap.install.addon.question", new File(url.getFile()).getName()),
+ TextUtils.getText("newmap.install.addon.title"), JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE);
+ if (selection == JOptionPane.OK_OPTION) {
+ installer.install(url);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void setAutoInstallEnabled(boolean autoInstall) {
+ this.autoInstall = autoInstall;
+
+ }
+
+ public boolean isAutoInstallEnabled() {
+ return autoInstall;
+ }
+
+ public AddOnProperties getInstalledAddOn(final String name) {
+ // Performance consideration: list is small -> iteration over list is OK.
+ for (AddOnProperties addOn : installedAddOns) {
+ if (addOn.getName().equals(name))
+ return addOn;
+ }
+ return null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/applet/AppletResourceController.java b/freeplane/src/main/java/org/freeplane/main/applet/AppletResourceController.java
similarity index 100%
rename from freeplane/src/org/freeplane/main/applet/AppletResourceController.java
rename to freeplane/src/main/java/org/freeplane/main/applet/AppletResourceController.java
diff --git a/freeplane/src/main/java/org/freeplane/main/applet/AppletViewController.java b/freeplane/src/main/java/org/freeplane/main/applet/AppletViewController.java
new file mode 100644
index 0000000..dc95048
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/applet/AppletViewController.java
@@ -0,0 +1,243 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.applet;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.browsemode.BModeController;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.view.swing.map.MapViewScrollPane;
+
+/**
+ * @author Dimitry Polivaev
+ */
+class AppletViewController extends FrameController implements IMapViewChangeListener {
+ final private FreeplaneApplet applet;
+ private JComponent mComponentInSplitPane;
+ private JComponent mapContentBox;
+ private JScrollPane scrollPane;
+
+ public AppletViewController( final FreeplaneApplet applet, Controller controller,
+ final IMapViewManager mapViewController) {
+ super(controller, mapViewController, "");
+ this.applet = applet;
+ mapViewController.addMapViewChangeListener(this);
+ }
+
+
+ @Override
+ public FreeplaneMenuBar getFreeplaneMenuBar() {
+ return (FreeplaneMenuBar) applet.getJMenuBar();
+ }
+
+ public FreeplaneVersion getFreeplaneVersion() {
+ return FreeplaneVersion.getVersion();
+ }
+
+
+ @Override
+ public void init(Controller controller) {
+ mapContentBox = new JPanel(new BorderLayout());
+ scrollPane = new MapViewScrollPane();
+ mapContentBox.add(scrollPane, BorderLayout.CENTER);
+ applet.getContentPane().add(mapContentBox, BorderLayout.CENTER);
+ super.init(controller);
+ SwingUtilities.updateComponentTreeUI(applet);
+ if (!EventQueue.isDispatchThread()) {
+ try {
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ };
+ });
+ }
+ catch (final InterruptedException e) {
+ LogUtils.severe(e);
+ }
+ catch (final InvocationTargetException e) {
+ LogUtils.severe(e);
+ }
+ }
+ getController().selectMode(BModeController.MODENAME);
+ String initialMapName = ResourceController.getResourceController().getProperty("browsemode_initial_map");
+ if (initialMapName != null && initialMapName.startsWith(".")) {
+ final String locationUrl = applet.getParameter("location_href");
+ try {
+ URI uri = new URI(locationUrl).resolve(new URI(null, null, initialMapName, null));
+ URL documentBase = new URL(uri.getScheme(), uri.getHost(), uri.getPort(), uri.getPath());
+ initialMapName = documentBase.toString();
+ }
+ catch (final Exception e) {
+ UITools.errorMessage(TextUtils.format("map_load_error", initialMapName));
+ System.err.println(e);
+ return;
+ }
+ /* end: new handling for relative urls. fc, 29.10.2003. */
+ }
+ if (initialMapName != "") {
+ try {
+ final URL mapUrl = new URL(initialMapName);
+ getController().getModeController().getMapController().newMap(mapUrl);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+ }
+
+ @Override
+ public void insertComponentIntoSplitPane(final JComponent pMindMapComponent) {
+ if (mComponentInSplitPane == pMindMapComponent) {
+ return;
+ }
+ removeSplitPane();
+ mComponentInSplitPane = pMindMapComponent;
+ mapContentBox.add(pMindMapComponent, BorderLayout.SOUTH);
+ mapContentBox.revalidate();
+ }
+
+ @Override
+ public boolean isApplet() {
+ return true;
+ }
+
+ @Override
+ public void openDocument(final URI location) {
+ try {
+ final String scheme = location.getScheme();
+ final String host = location.getHost();
+ final String path = location.isOpaque() ? location.getSchemeSpecificPart() : location.getPath();
+ final int port = location.getPort();
+ final String query = location.getQuery();
+ final String fragment = location.getFragment();
+ final StringBuilder file = new StringBuilder(path);
+ if(query != null){
+ file.append('?');
+ file.append(query);
+ }
+ if(fragment != null){
+ file.append('#');
+ file.append(fragment);
+ }
+ final URL url = new URL(scheme, host, port, file.toString());
+ openDocument(url);
+ }
+ catch (final MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void openDocument(final URL doc) {
+ applet.getAppletContext().showDocument(doc, "_blank");
+ }
+
+ @Override
+ public void removeSplitPane() {
+ if (mComponentInSplitPane != null) {
+ mapContentBox.remove(mComponentInSplitPane);
+ mapContentBox.revalidate();
+ mComponentInSplitPane = null;
+ }
+ }
+
+ @Override
+ protected void setFreeplaneMenuBar(final FreeplaneMenuBar menuBar) {
+ applet.setJMenuBar(menuBar);
+ }
+
+ @Override
+ public void setTitle(final String frameTitle) {
+ }
+
+ @Override
+ public void setWaitingCursor(final boolean waiting) {
+ applet.setWaitingCursor(waiting);
+ }
+
+ public void start() {
+ try {
+ final IMapSelection selection = getController().getSelection();
+ if (selection != null) {
+ selection.selectRoot();
+ }
+ else {
+ System.err.println("View is null.");
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ public void afterViewChange(Component oldView, Component newView) {
+ if(scrollPane != null)
+ scrollPane.setViewportView(newView);
+ }
+
+ public void afterViewClose(Component oldView) {
+ }
+
+ public void afterViewCreated(Component mapView) {
+ }
+
+ public void beforeViewChange(Component oldView, Component newView) {
+ }
+
+ public void previousMapView() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void nextMapView() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+
+ @Override
+ public Component getCurrentRootComponent() {
+ return applet;
+ }
+
+
+ @Override
+ public Component getMenuComponent() {
+ return applet;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/applet/FreeplaneApplet.java b/freeplane/src/main/java/org/freeplane/main/applet/FreeplaneApplet.java
new file mode 100644
index 0000000..d7fd588
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/applet/FreeplaneApplet.java
@@ -0,0 +1,229 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.applet;
+
+import java.awt.AWTEvent;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.EventQueue;
+import java.awt.HeadlessException;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+import javax.swing.JApplet;
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+import javax.swing.text.html.parser.ParserDelegator;
+
+import org.freeplane.core.ui.ShowSelectionAsRectangleAction;
+import org.freeplane.features.attribute.ModelessAttributeController;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.filter.NextNodeAction;
+import org.freeplane.features.filter.NextPresentationItemAction;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.help.HelpController;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.browsemode.BModeController;
+import org.freeplane.features.print.PrintController;
+import org.freeplane.features.styles.LogicalStyleFilterController;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.time.TimeController;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.main.browsemode.BModeControllerFactory;
+import org.freeplane.view.swing.features.nodehistory.NodeHistory;
+import org.freeplane.view.swing.map.MapViewController;
+import org.freeplane.view.swing.map.ViewLayoutTypeAction;
+
+public class FreeplaneApplet extends JApplet {
+
+ @SuppressWarnings("serial")
+ private class GlassPane extends JComponent{
+ public GlassPane() {
+ addMouseListener(new MouseAdapter(){});
+ }
+
+
+ @Override
+ protected void processMouseEvent(MouseEvent e) {
+ if (e.getID() == MouseEvent.MOUSE_EXITED){
+ return;
+ }
+ Controller currentController = Controller.getCurrentController();
+ if( controller != currentController ){
+ if(! appletLock.tryLock()){
+ return;
+ }
+ Controller.setCurrentController(controller);
+ appletLock.unlock();
+ JOptionPane.getFrameForComponent(this).getMostRecentFocusOwner().requestFocus();
+ if(currentController != null){
+ ((FreeplaneApplet)(currentController.getViewController().getMenuComponent())).getGlassPane().setVisible(true);
+ }
+ }
+ setVisible(false);
+ }
+ }
+
+ private AppletResourceController appletResourceController;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private AppletViewController appletViewController;
+ private Controller controller;
+
+ final static Lock appletLock = new ReentrantLock();
+
+ public FreeplaneApplet() throws HeadlessException {
+ super();
+ }
+
+ @Override
+ public void destroy() {
+ }
+
+ @SuppressWarnings("serial")
+ @Override
+ public void init() {
+ try{
+ appletLock.lock();
+ appletResourceController = new AppletResourceController(this);
+ if (appletResourceController == null) {
+ appletResourceController = new AppletResourceController(this);
+ }
+ new ParserDelegator(){
+ {
+ setDefaultDTD();
+ }
+ };
+ updateLookAndFeel();
+ createRootPane();
+ controller = new Controller(appletResourceController);
+ appletResourceController.init();
+ Controller.setCurrentController(controller);
+ final Container contentPane = getContentPane();
+ contentPane.setLayout(new BorderLayout());
+ MapViewController mapViewController = new MapViewController(controller);
+ appletViewController = new AppletViewController(this, controller, mapViewController);
+ controller.addAction(new ViewLayoutTypeAction(MapViewLayout.OUTLINE));
+ FilterController.install();
+ PrintController.install();
+ HelpController.install();
+ NodeHistory.install(controller);
+ FormatController.install(new FormatController());
+ ModelessAttributeController.install();
+ TextController.install();
+ MapController.install();
+
+ TimeController.install();
+ LinkController.install();
+ IconController.install();
+ FilterController.getCurrentFilterController().getConditionFactory().addConditionController(70,
+ new LogicalStyleFilterController());
+ final BModeController browseController = BModeControllerFactory.createModeController();
+ final Set<String> emptySet = Collections.emptySet();
+ FilterController.getController(controller).loadDefaultConditions();
+ controller.addAction(new ShowSelectionAsRectangleAction());
+ controller.addAction(new NextNodeAction(Direction.FORWARD));
+ controller.addAction(new NextNodeAction(Direction.BACK));
+ controller.addAction(new NextNodeAction(Direction.FORWARD_N_FOLD));
+ controller.addAction(new NextNodeAction(Direction.BACK_N_FOLD));
+ controller.addAction(new NextPresentationItemAction());
+ browseController.updateMenus("/xml/appletmenu.xml", emptySet);
+ controller.selectMode(browseController);
+ appletResourceController.setPropertyByParameter(this, "browsemode_initial_map");
+ appletViewController.init(controller);
+ final GlassPane glassPane = new GlassPane();
+ setGlassPane(glassPane);
+ glassPane.setVisible(true);
+ controller.getViewController().setMenubarVisible(false);
+ }
+ catch(RuntimeException e){
+ e.printStackTrace();
+ throw e;
+ }
+ finally{
+ appletLock.unlock();
+ }
+ }
+
+ @Override
+ public void start() {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ appletViewController.start();
+ }
+ });
+ }
+
+ @Override
+ public void stop() {
+ super.stop();
+ }
+
+ private void updateLookAndFeel() {
+ String lookAndFeel = "";
+ appletResourceController.setPropertyByParameter(this, "lookandfeel");
+ lookAndFeel = appletResourceController.getProperty("lookandfeel");
+ FrameController.setLookAndFeel(lookAndFeel);
+ }
+
+ @Override
+ public Component findComponentAt(int x, int y) {
+ final Component c = super.findComponentAt(x, y);
+ if(c == null){
+ return null;
+ }
+ final AWTEvent currentEvent = EventQueue.getCurrentEvent();
+ if(controller != Controller.getCurrentController()
+ && currentEvent instanceof MouseEvent
+ && currentEvent.getID() == MouseEvent.MOUSE_MOVED){
+ if(appletLock.tryLock()){
+ Controller.setCurrentController(controller);
+ appletLock.unlock();
+ }
+ }
+ return c;
+ }
+
+ public void setWaitingCursor(final boolean waiting) {
+ Component glassPane = getRootPane().getGlassPane();
+ if (waiting) {
+ glassPane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ glassPane.setVisible(true);
+ }
+ else {
+ glassPane.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ glassPane.setVisible(false);
+ }
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/ApplicationLifecycleListener.java b/freeplane/src/main/java/org/freeplane/main/application/ApplicationLifecycleListener.java
new file mode 100644
index 0000000..eef1f51
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/ApplicationLifecycleListener.java
@@ -0,0 +1,5 @@
+package org.freeplane.main.application;
+
+public interface ApplicationLifecycleListener {
+ void onStartupFinished();
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/ApplicationResourceController.java b/freeplane/src/main/java/org/freeplane/main/application/ApplicationResourceController.java
new file mode 100644
index 0000000..2a2b9c3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/ApplicationResourceController.java
@@ -0,0 +1,308 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Locale;
+import java.util.Properties;
+
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceBundles;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.features.filter.FilterController;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class ApplicationResourceController extends ResourceController {
+ final private File autoPropertiesFile;
+ final private Properties defProps;
+ private LastOpenedList lastOpened;
+ final private Properties props;
+ final private ClassLoader urlResourceLoader;
+ private static final String FREEPLANE_MAC_PROPERTIES = "/freeplane_mac.properties";
+ public static final String FREEPLANE_BASEDIRECTORY_PROPERTY = "org.freeplane.basedirectory";
+ public static final String FREEPLANE_GLOBALRESOURCEDIR_PROPERTY = "org.freeplane.globalresourcedir";
+ public static final String DEFAULT_FREEPLANE_GLOBALRESOURCEDIR = "resources";
+
+ /**
+ * @param controller
+ */
+ public ApplicationResourceController() {
+ super();
+ defProps = readDefaultPreferences();
+ props = readUsersPreferences(defProps);
+ final File userDir = createUserDirectory(defProps);
+ final ArrayList<URL> urls = new ArrayList<URL>(2);
+ final String resourceBaseDir = getResourceBaseDir();
+ if (resourceBaseDir != null) {
+ try {
+ final File userResourceDir = new File(userDir, "resources");
+ userResourceDir.mkdirs();
+ if (userResourceDir.exists()) {
+ final URL userResourceUrl = Compat.fileToUrl(userResourceDir);
+ urls.add(userResourceUrl);
+ }
+ final File resourceDir = new File(resourceBaseDir);
+ if (resourceDir.exists()) {
+ final URL globalResourceUrl = Compat.fileToUrl(resourceDir);
+ urls.add(globalResourceUrl);
+ }
+ }
+ catch (final Exception e) {
+ e.printStackTrace();
+ }
+ }
+ if(urls.size() > 0)
+ urlResourceLoader = new URLClassLoader(urls.toArray(new URL[]{}), null);
+ else
+ urlResourceLoader = null;
+ setDefaultLocale(props);
+ autoPropertiesFile = getUserPreferencesFile();
+ addPropertyChangeListener(new IFreeplanePropertyListener() {
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (propertyName.equals(ResourceBundles.RESOURCE_LANGUAGE)) {
+ loadAnotherLanguage();
+ }
+ }
+ });
+ }
+
+ private File createUserDirectory(final Properties pDefaultProperties) {
+ final File userPropertiesFolder = new File(getFreeplaneUserDirectory());
+ try {
+ if (!userPropertiesFolder.exists()) {
+ userPropertiesFolder.mkdirs();
+ }
+ return userPropertiesFolder;
+ }
+ catch (final Exception e) {
+ e.printStackTrace();
+ System.err.println("Cannot create folder for user properties and logging: '"
+ + userPropertiesFolder.getAbsolutePath() + "'");
+ return null;
+ }
+ }
+
+ @Override
+ public String getDefaultProperty(final String key) {
+ return defProps.getProperty(key);
+ }
+
+ @Override
+ public String getFreeplaneUserDirectory() {
+ return Compat.getApplicationUserDirectory();
+ }
+
+ public LastOpenedList getLastOpenedList() {
+ return lastOpened;
+ }
+
+ @Override
+ public Properties getProperties() {
+ return props;
+ }
+
+ @Override
+ public String getProperty(final String key) {
+ return props.getProperty(key);
+ }
+
+ @Override
+ public URL getResource(final String name) {
+ if (urlResourceLoader == null) {
+ return super.getResource(name);
+ }
+ final String relName;
+ if (name.startsWith("/")) {
+ relName = name.substring(1);
+ }
+ else {
+ relName = name;
+ }
+ URL resource = urlResourceLoader.getResource(relName);
+ if (resource != null) {
+ return resource;
+ }
+ resource = super.getResource(name);
+ if (resource != null) {
+ return resource;
+ }
+ if ("/lib/freeplaneviewer.jar".equals(name)) {
+ final String rootDir = new File(getResourceBaseDir()).getAbsoluteFile().getParent();
+ try {
+ final File try1 = new File(rootDir + "/plugins/org.freeplane.core/lib/freeplaneviewer.jar");
+ if (try1.exists()) {
+ return try1.toURL();
+ }
+ final File try2 = new File(rootDir + "/lib/freeplaneviewer.jar");
+ if (try2.exists()) {
+ return try2.toURL();
+ }
+ }
+ catch (final MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public String getResourceBaseDir() {
+ return FreeplaneGUIStarter.getResourceBaseDir();
+ }
+
+ @Override
+ public String getInstallationBaseDir() {
+ return FreeplaneGUIStarter.getInstallationBaseDir();
+ }
+
+ public static File getUserPreferencesFile() {
+ final String freeplaneDirectory = Compat.getApplicationUserDirectory();
+ final File userPropertiesFolder = new File(freeplaneDirectory);
+ final File autoPropertiesFile = new File(userPropertiesFolder, "auto.properties");
+ return autoPropertiesFile;
+ }
+
+ @Override
+ public void init() {
+ lastOpened = new LastOpenedList();
+ super.init();
+ }
+
+ private Properties readDefaultPreferences() {
+ final Properties props = new Properties();
+ readDefaultPreferences(props, ResourceController.FREEPLANE_PROPERTIES);
+ if (Compat.isMacOsX()) {
+ readDefaultPreferences(props, FREEPLANE_MAC_PROPERTIES);
+ }
+ final String propsLocs = props.getProperty("load_next_properties", "");
+ readDefaultPreferences(props, propsLocs.split(";"));
+ return props;
+ }
+
+ private void readDefaultPreferences(final Properties props, final String[] locArray) {
+ for (final String loc : locArray) {
+ readDefaultPreferences(props, loc);
+ }
+ }
+
+ private void readDefaultPreferences(final Properties props, final String propsLoc) {
+ final URL defaultPropsURL = getResource(propsLoc);
+ loadProperties(props, defaultPropsURL);
+ }
+
+ private Properties readUsersPreferences(final Properties defaultPreferences) {
+ final Properties auto = new Properties(defaultPreferences);
+ InputStream in = null;
+ try {
+ final File autoPropertiesFile = getUserPreferencesFile();
+ in = new FileInputStream(autoPropertiesFile);
+ auto.load(in);
+ }
+ catch (final Exception ex) {
+ System.err.println("User properties not found, new file created");
+ }
+ finally {
+ FileUtils.silentlyClose(in);
+ }
+ return auto;
+ }
+
+ @Override
+ public void saveProperties() {
+ lastOpened.saveProperties();
+ OutputStream out = null;
+ try {
+ out = new FileOutputStream(autoPropertiesFile);
+ final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(out, "8859_1");
+ outputStreamWriter.write("#Freeplane ");
+ outputStreamWriter.write(FreeplaneVersion.getVersion().toString());
+ outputStreamWriter.write('\n');
+ outputStreamWriter.flush();
+ props.store(out, null);
+ }
+ catch (final Exception ex) {
+ }
+ finally {
+ if (out != null) {
+ try {
+ out.close();
+ }
+ catch (final IOException e) {
+ }
+ }
+ }
+ FilterController.getCurrentFilterController().saveConditions();
+ }
+
+ /**
+ * @param pProperties
+ */
+ private void setDefaultLocale(final Properties pProperties) {
+ final String lang = pProperties.getProperty(ResourceBundles.RESOURCE_LANGUAGE);
+ if (lang == null) {
+ return;
+ }
+ Locale localeDef = null;
+ switch (lang.length()) {
+ case 2:
+ localeDef = new Locale(lang);
+ break;
+ case 5:
+ localeDef = new Locale(lang.substring(0, 1), lang.substring(3, 4));
+ break;
+ default:
+ return;
+ }
+ Locale.setDefault(localeDef);
+ }
+
+ @Override
+ public void setDefaultProperty(final String key, final String value) {
+ defProps.setProperty(key, value);
+ }
+
+ @Override
+ public void setProperty(final String key, final String value) {
+ final String oldValue = getProperty(key);
+ if (oldValue == value) {
+ return;
+ }
+ if (oldValue != null && oldValue.equals(value)) {
+ return;
+ }
+ props.setProperty(key, value);
+ firePropertyChanged(key, value, oldValue);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/ApplicationViewController.java b/freeplane/src/main/java/org/freeplane/main/application/ApplicationViewController.java
new file mode 100644
index 0000000..4535187
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/ApplicationViewController.java
@@ -0,0 +1,425 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Frame;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.LayoutManager;
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.List;
+import java.util.Locale;
+
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JSplitPane;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.view.swing.map.MapView;
+
+class ApplicationViewController extends FrameController {
+ private static final String SPLIT_PANE_LAST_LEFT_POSITION = "split_pane_last_left_position";
+ private static final String SPLIT_PANE_LAST_POSITION = "split_pane_last_position";
+ private static final String SPLIT_PANE_LAST_RIGHT_POSITION = "split_pane_last_right_position";
+ private static final String SPLIT_PANE_LAST_TOP_POSITION = "split_pane_last_top_position";
+ private static final String SPLIT_PANE_LEFT_POSITION = "split_pane_left_position";
+ private static final String SPLIT_PANE_POSITION = "split_pane_position";
+ private static final String SPLIT_PANE_RIGHT_POSITION = "split_pane_right_position";
+ private static final String SPLIT_PANE_TOP_POSITION = "split_pane_top_position";
+// // final private Controller controller;
+ final private JFrame frame;
+ /** Contains the value where the Note Window should be displayed (right, left, top, bottom) */
+ private String mLocationPreferenceValue;
+ /** Contains the Note Window Component */
+ private JComponent mMindMapComponent;
+ final private JSplitPane mSplitPane;
+ final private NavigationNextMapAction navigationNextMap;
+ final private NavigationPreviousMapAction navigationPreviousMap;
+ final private ResourceController resourceController;
+ private JComponent mapPane;
+ private MapViewDockingWindows mapViewWindows;
+ @SuppressWarnings("serial")
+ public ApplicationViewController( Controller controller, final IMapViewManager mapViewController,
+ final JFrame frame) {
+ super(controller, mapViewController, "");
+// this.controller = controller;
+ navigationPreviousMap = new NavigationPreviousMapAction();
+ controller.addAction(navigationPreviousMap);
+ navigationNextMap = new NavigationNextMapAction();
+ controller.addAction(navigationNextMap);
+ resourceController = ResourceController.getResourceController();
+ this.frame = frame;
+ frame.getContentPane().setLayout(new BorderLayout());
+ // --- Set Note Window Location ---
+ mLocationPreferenceValue = resourceController.getProperty("note_location", "bottom");
+ // disable all hotkeys for JSplitPane
+ mSplitPane = new JSplitPane(){
+ @Override
+ protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed){
+ return false;
+ }
+ };
+ setSplitPaneLayoutManager();
+ final Component contentPane;
+ mapViewWindows = new MapViewDockingWindows();
+ contentPane = mapViewWindows.getMapPane();
+ frame.getContentPane().add(contentPane, BorderLayout.CENTER);
+ mapPane = mapViewWindows.getMapPane();
+ frame.getContentPane().add(mSplitPane, BorderLayout.CENTER);
+ mSplitPane.setLeftComponent(mapPane);
+ mSplitPane.setRightComponent(null);
+ initFrame(frame);
+ }
+
+ /**
+ * Called from the Controller, when the Location of the Note Window is changed on the Menu->View->Note Window Location
+ */
+ @Override
+ public void changeNoteWindowLocation() {
+ mLocationPreferenceValue = resourceController.getProperty("note_location");
+ if(mMindMapComponent != null){
+ insertComponentIntoSplitPane(mMindMapComponent);
+ }
+ }
+
+ public String getAdjustableProperty(final String label) {
+ return resourceController.getProperty(label);
+ }
+
+ @Override
+ public FreeplaneMenuBar getFreeplaneMenuBar() {
+ return Controller.getCurrentModeController().getUserInputListenerFactory().getMenuBar();
+ }
+
+ @Override
+ public void insertComponentIntoSplitPane(final JComponent pMindMapComponent) {
+ // --- Save the Component --
+ mMindMapComponent = pMindMapComponent;
+ // --- Devider position variables --
+ int splitPanePosition = -1;
+ int lastSplitPanePosition = -1;
+ mapPane.setVisible(true);
+ mSplitPane.setLeftComponent(null);
+ mSplitPane.setRightComponent(null);
+ if ("right".equals(mLocationPreferenceValue)) {
+ mSplitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
+ mSplitPane.setLeftComponent(mapPane);
+ mSplitPane.setRightComponent(pMindMapComponent);
+ splitPanePosition = resourceController.getIntProperty(SPLIT_PANE_RIGHT_POSITION, -1);
+ lastSplitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LAST_RIGHT_POSITION, -1);
+ }
+ else if ("left".equals(mLocationPreferenceValue)) {
+ mSplitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
+ mSplitPane.setLeftComponent(pMindMapComponent);
+ mSplitPane.setRightComponent(mapPane);
+ splitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LEFT_POSITION, -1);
+ lastSplitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LAST_LEFT_POSITION, -1);
+ }
+ else if ("top".equals(mLocationPreferenceValue)) {
+ mSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
+ mSplitPane.setLeftComponent(pMindMapComponent);
+ mSplitPane.setRightComponent(mapPane);
+ splitPanePosition = resourceController.getIntProperty(SPLIT_PANE_TOP_POSITION, -1);
+ lastSplitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LAST_TOP_POSITION, -1);
+ }
+ else if ("bottom".equals(mLocationPreferenceValue)) {
+ mSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
+ mSplitPane.setLeftComponent(mapPane);
+ mSplitPane.setRightComponent(pMindMapComponent);
+ splitPanePosition = resourceController.getIntProperty(SPLIT_PANE_POSITION, -1);
+ lastSplitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LAST_POSITION, -1);
+ }
+ mSplitPane.setContinuousLayout(true);
+ mSplitPane.setOneTouchExpandable(false);
+ setSplitPaneLayoutManager();
+ /*
+ * This means that the mind map area gets all the space that results
+ * from resizing the window.
+ */
+ mSplitPane.setResizeWeight(1.0d);
+ if (splitPanePosition != -1 && lastSplitPanePosition != -1) {
+ mSplitPane.setDividerLocation(splitPanePosition);
+ mSplitPane.setLastDividerLocation(lastSplitPanePosition);
+ }
+ else {
+ mSplitPane.setDividerLocation(0.5);
+ }
+ }
+
+ @Override
+ public boolean isApplet() {
+ return false;
+ }
+
+ @Override
+ public void openDocument(final URI uri) throws IOException {
+ new Browser().openDocument(uri);
+ }
+/**
+ * Open url in WWW browser. This method hides some differences between
+ * operating systems.
+ */
+ @Override
+ public void openDocument(final URL url) throws Exception {
+ URI uri = null;
+ try {
+ uri = url.toURI();
+ }
+ catch (URISyntaxException e) {
+ uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), url.getRef());
+ }
+ openDocument(uri);
+ }
+
+ @Override
+ public boolean quit() {
+ if (!super.quit()) {
+ return false;
+ }
+ frame.dispose();
+ return true;
+ }
+
+ @Override
+ public void removeSplitPane() {
+ saveSplitPanePosition();
+ mMindMapComponent = null;
+ mSplitPane.setLeftComponent(null);
+ mSplitPane.setRightComponent(null);
+ mSplitPane.setLeftComponent(mapPane);
+ setSplitPaneLayoutManager();
+ final Controller controller = Controller.getCurrentModeController().getController();
+ final IMapSelection selection = controller.getSelection();
+ if(selection == null){
+ return;
+ }
+ final NodeModel node = selection.getSelected();
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ final Component component = controller.getMapViewManager().getComponent(node);
+ if (component != null) {
+ component.requestFocus();
+ }
+ }
+ });
+ }
+
+ private void setSplitPaneLayoutManager() {
+ final LayoutManager layout = mSplitPane.getLayout();
+ if(layout instanceof SplitPaneLayoutManagerDecorator){
+ return;
+ }
+ mSplitPane.setLayout(new SplitPaneLayoutManagerDecorator(layout));
+ }
+
+ @Override
+ public void saveProperties() {
+ saveSplitPanePosition();
+ if (frame.isResizable()) {
+ final int winState = frame.getExtendedState() & ~Frame.ICONIFIED;
+ if (JFrame.MAXIMIZED_BOTH != (winState & JFrame.MAXIMIZED_BOTH)) {
+ resourceController.setProperty("appwindow_x", String.valueOf(frame.getX()));
+ resourceController.setProperty("appwindow_y", String.valueOf(frame.getY()));
+ resourceController.setProperty("appwindow_width", String.valueOf(frame.getWidth()));
+ resourceController.setProperty("appwindow_height", String.valueOf(frame.getHeight()));
+ }
+ resourceController.setProperty("appwindow_state", String.valueOf(winState));
+ }
+ mapViewWindows.saveLayout();
+ }
+
+ private void saveSplitPanePosition() {
+ if (mSplitPane == null) {
+ return;
+ }
+ if ("right".equals(mLocationPreferenceValue)) {
+ resourceController.setProperty(SPLIT_PANE_RIGHT_POSITION, "" + mSplitPane.getDividerLocation());
+ resourceController.setProperty(SPLIT_PANE_LAST_RIGHT_POSITION, "" + mSplitPane.getLastDividerLocation());
+ }
+ else if ("left".equals(mLocationPreferenceValue)) {
+ resourceController.setProperty(SPLIT_PANE_LEFT_POSITION, "" + mSplitPane.getDividerLocation());
+ resourceController.setProperty(SPLIT_PANE_LAST_LEFT_POSITION, "" + mSplitPane.getLastDividerLocation());
+ }
+ else if ("top".equals(mLocationPreferenceValue)) {
+ resourceController.setProperty(SPLIT_PANE_TOP_POSITION, "" + mSplitPane.getDividerLocation());
+ resourceController.setProperty(SPLIT_PANE_LAST_TOP_POSITION, "" + mSplitPane.getLastDividerLocation());
+ }
+ else { // "bottom".equals(mLocationPreferenceValue) also covered
+ resourceController.setProperty(SPLIT_PANE_POSITION, "" + mSplitPane.getDividerLocation());
+ resourceController.setProperty(SPLIT_PANE_LAST_POSITION, "" + mSplitPane.getLastDividerLocation());
+ }
+ }
+
+ @Override
+ protected void setFreeplaneMenuBar(final FreeplaneMenuBar menuBar) {
+ frame.setJMenuBar(menuBar);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.main.FreeplaneMain#setTitle(java.lang.String)
+ */
+ @Override
+ public void setTitle(final String frameTitle) {
+ frame.setTitle(frameTitle);
+ mapViewWindows.setTitle();
+ }
+
+ @Override
+ public void setWaitingCursor(final boolean waiting) {
+ if (waiting) {
+ frame.getRootPane().getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ frame.getRootPane().getGlassPane().setVisible(true);
+ }
+ else {
+ frame.getRootPane().getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ frame.getRootPane().getGlassPane().setVisible(false);
+ }
+ }
+
+ @Override
+ public void viewNumberChanged(final int number) {
+ navigationPreviousMap.setEnabled(number > 1);
+ navigationNextMap.setEnabled(number > 1);
+ }
+
+ public void initFrame(final JFrame frame) {
+ // Preserve the existing icon image under Mac OS X
+ if (!Compat.isMacOsX()) {
+ final ImageIcon mWindowIcon;
+ if (Compat.isLowerJdk(Compat.VERSION_1_6_0)) {
+ mWindowIcon = new ImageIcon(ResourceController.getResourceController().getResource(
+ "/images/Freeplane_frame_icon.png"));
+ }
+ else {
+ mWindowIcon = new ImageIcon(ResourceController.getResourceController().getResource(
+ "/images/Freeplane_frame_icon_64x64.png"));
+ }
+ frame.setIconImage(mWindowIcon.getImage());
+ }
+ frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+ frame.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(final WindowEvent e) {
+ Controller.getCurrentController().quit(new ActionEvent(this, 0, "quit"));
+ }
+ /*
+ * fc, 14.3.2008: Completely removed, as it damaged the focus if for
+ * example the note window was active.
+ */
+ });
+ frame.setFocusTraversalKeysEnabled(false);
+ final int win_width = ResourceController.getResourceController().getIntProperty("appwindow_width", -1);
+ final int win_height = ResourceController.getResourceController().getIntProperty("appwindow_height", -1);
+ final int win_x = ResourceController.getResourceController().getIntProperty("appwindow_x", -1);
+ final int win_y = ResourceController.getResourceController().getIntProperty("appwindow_y", -1);
+ UITools.setBounds(frame, win_x, win_y, win_width, win_height);
+ applyFrameSize(frame, win_x, win_y);
+
+ int win_state = Integer
+ .parseInt(ResourceController.getResourceController().getProperty("appwindow_state", "0"));
+ win_state = ((win_state & Frame.ICONIFIED) != 0) ? Frame.NORMAL : win_state;
+ frame.setExtendedState(win_state);
+ }
+
+ private void applyFrameSize(final JFrame frame, int win_x, int win_y) {
+ GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ Rectangle r = env.getMaximumWindowBounds();
+ for(GraphicsDevice device : env.getScreenDevices()) {
+ if(!device.equals(env.getDefaultScreenDevice())) {
+ Rectangle bounds = device.getDefaultConfiguration().getBounds();
+ r.add(bounds);
+ }
+ }
+ frame.applyComponentOrientation(ComponentOrientation.getOrientation(Locale.getDefault()));
+ frame.setPreferredSize(new Dimension(Math.min(r.width, frame.getBounds().width), Math.min(r.height, frame.getBounds().height)));
+// frame.setLocation(Math.max(r.x, frame.getBounds().x), Math.max(r.y, frame.getBounds().y));
+ frame.setLocation(Math.max(r.x, win_x), Math.max(r.y, win_y));
+ }
+
+ public void openMapsOnStart() {
+ mapViewWindows.loadLayout();
+ }
+
+ public void focusTo(MapView currentMapView) {
+ mapViewWindows.focusMapViewLater(currentMapView);
+
+ }
+
+ public void previousMapView() {
+ mapViewWindows.selectPreviousMapView();
+
+ }
+
+ public void nextMapView() {
+ mapViewWindows.selectNextMapView();
+ }
+
+ @Override
+ protected void setFullScreen(boolean fullScreen) {
+ super.setFullScreen(fullScreen);
+ if(fullScreen)
+ mapViewWindows.setTabAreaInvisiblePolicy((JFrame) UITools.getCurrentRootComponent());
+ else
+ mapViewWindows.setTabAreaVisiblePolicy((JFrame)UITools.getCurrentRootComponent());
+ }
+
+ @Override
+ public Component getCurrentRootComponent() {
+ final Component mapViewComponent = controller.getMapViewManager().getMapViewComponent();
+ return mapViewComponent != null ? SwingUtilities.getRoot(mapViewComponent) : frame;
+ }
+
+ @Override
+ public Component getMenuComponent() {
+ return frame;
+ }
+
+ @Override
+ public List<? extends Component> getMapViewVector() {
+ return mapViewWindows.getMapViewVector();
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/Browser.java b/freeplane/src/main/java/org/freeplane/main/application/Browser.java
new file mode 100644
index 0000000..f433c7c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/Browser.java
@@ -0,0 +1,98 @@
+package org.freeplane.main.application;
+
+import java.io.IOException;
+import java.net.URI;
+import java.text.MessageFormat;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.features.mode.Controller;
+
+public class Browser {
+ public void openDocument(final URI uri) {
+ String uriString = uri.toString();
+ final String UNC_PREFIX = "file:////";
+ if (uriString.startsWith(UNC_PREFIX)) {
+ uriString = "file://" + uriString.substring(UNC_PREFIX.length());
+ }
+ final String osName = System.getProperty("os.name");
+ if (osName.substring(0, 3).equals("Win")) {
+ String propertyString = "default_browser_command_windows";
+ if (osName.indexOf("9") != -1 || osName.indexOf("Me") != -1) {
+ propertyString += "_9x";
+ }
+ else {
+ propertyString += "_nt";
+ }
+ String[] command = null;
+ try {
+ final Object[] messageArguments = { uriString };
+ final MessageFormat formatter = new MessageFormat(ResourceController.getResourceController()
+ .getProperty(propertyString));
+ final String browserCommand = formatter.format(messageArguments);
+ final String scheme = uri.getScheme();
+ if (scheme.equals("file") || scheme.equals("smb")) {
+ if(scheme.equals("smb")){
+ uriString = Compat.smbUri2unc(uri);
+ }
+ if (System.getProperty("os.name").startsWith("Windows 2000"))
+ command = new String[] { "rundll32", "shell32.dll,ShellExec_RunDLL", uriString };
+ else
+ command = new String[] { "rundll32", "url.dll,FileProtocolHandler", uriString };
+ }
+ else if (uriString.startsWith("mailto:")) {
+ command = new String[] { "rundll32", "url.dll,FileProtocolHandler", uriString };
+ }
+ else {
+ Controller.exec(browserCommand);
+ return;
+ }
+ Controller.exec(command);
+ }
+ catch (final IOException x) {
+ UITools
+ .errorMessage("Could not invoke browser.\n\nFreeplane excecuted the following statement on a command line:\n\""
+ + command
+ + "\".\n\nYou may look at the user or default property called '"
+ + propertyString
+ + "'.");
+ System.err.println("Caught: " + x);
+ }
+ }
+ else if (osName.startsWith("Mac OS")) {
+ String browserCommand = null;
+ try {
+ final Object[] messageArguments = { uriString, uriString };
+ final MessageFormat formatter = new MessageFormat(ResourceController.getResourceController()
+ .getProperty("default_browser_command_mac"));
+ browserCommand = formatter.format(messageArguments);
+ Controller.exec(browserCommand);
+ }
+ catch (final IOException ex2) {
+ UITools
+ .errorMessage("Could not invoke browser.\n\nFreeplane excecuted the following statement on a command line:\n\""
+ + browserCommand
+ + "\".\n\nYou may look at the user or default property called 'default_browser_command_mac'.");
+ System.err.println("Caught: " + ex2);
+ }
+ }
+ else {
+ String browserCommand = null;
+ try {
+ final Object[] messageArguments = { uriString, uriString };
+ final MessageFormat formatter = new MessageFormat(ResourceController.getResourceController()
+ .getProperty("default_browser_command_other_os"));
+ browserCommand = formatter.format(messageArguments);
+ Controller.exec(browserCommand);
+ }
+ catch (final IOException ex2) {
+ UITools
+ .errorMessage("Could not invoke browser.\n\nFreeplane excecuted the following statement on a command line:\n\""
+ + browserCommand
+ + "\".\n\nYou may look at the user or default property called 'default_browser_command_other_os'.");
+ System.err.println("Caught: " + ex2);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/CommandLineParser.java b/freeplane/src/main/java/org/freeplane/main/application/CommandLineParser.java
new file mode 100644
index 0000000..c802af0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/CommandLineParser.java
@@ -0,0 +1,176 @@
+package org.freeplane.main.application;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.freeplane.core.util.Compat;
+
+class CommandLineParser {
+ static final String QUIT_MENU_ITEM_KEY = "MB_QuitAction";
+
+ public static class Options {
+ private static final String HELP_MESSAGE = "Use:\n\tfreeplane [options] [file1 [file2 ...]]" //
+ + "\n -X<menukey>: execute menu item with key <menukey>. Use devtools add-on to find the menu keys" //
+ + "\n -S: stop after executing menu items" //
+ + "\n -N: set the 'nonInteractive' system property to 'true'" //
+ + "\n -U<userdir>: set the freeplane user config directory (default: "
+ + Compat.getDefaultFreeplaneUserDirectory() + ")" //
+ + "\n -h|--help: print this help";
+ private List<String> filesToOpen = new ArrayList<String>();
+ private List<String> menuItemsToExecute = new ArrayList<String>();
+ private boolean stopAfterLaunch;
+ private boolean nonInteractive;
+ private boolean helpRequested = false;
+
+ public void setFilesToOpen(final String[] filesToOpen) {
+ this.filesToOpen = Arrays.asList(filesToOpen);
+ }
+
+ public void setMenuItemsToExecute(final String[] menuItemsToExecute) {
+ this.menuItemsToExecute = Arrays.asList(menuItemsToExecute);
+ }
+
+ public boolean isStopAfterLaunch() {
+ return stopAfterLaunch;
+ }
+
+ public void setStopAfterLaunch(boolean stopAfterLaunch) {
+ this.stopAfterLaunch = stopAfterLaunch;
+ }
+
+ public List<String> getFilesToOpen() {
+ return filesToOpen;
+ }
+
+ public String[] getFilesToOpenAsArray() {
+ return filesToOpen.toArray(new String[filesToOpen.size()]);
+ }
+
+ public List<String> getMenuItemsToExecute() {
+ return menuItemsToExecute;
+ }
+
+ public String[] getMenuItemsToExecuteAsArray() {
+ return menuItemsToExecute.toArray(new String[menuItemsToExecute.size()]);
+ }
+
+ public boolean hasMenuItemsToExecute() {
+ return !menuItemsToExecute.isEmpty();
+ }
+
+ public void addFilesToOpen(String file) {
+ filesToOpen.add(file);
+ }
+
+ public void addMenuItemToExecute(String item) {
+ menuItemsToExecute.add(item);
+ }
+
+ /** leads to setting of system property 'nonInteractive' - check via
+ * <pre>
+ * boolean nonInteractive = Boolean.parseBoolean(System.getProperty("nonInteractive"));
+ * </pre>
+ */
+ public void setNonInteractive(boolean b) {
+ nonInteractive = b;
+ }
+
+ public boolean isNonInteractive() {
+ return nonInteractive;
+ }
+
+ public boolean isHelpRequested() {
+ return helpRequested;
+ }
+
+ public void setHelpRequested(boolean helpRequested) {
+ this.helpRequested = helpRequested;
+ }
+
+ @Override
+ public String toString() {
+ return "Options(files: " + filesToOpen + ", menuItems: " + menuItemsToExecute + ", stopAfterLaunch: "
+ + stopAfterLaunch + ", nonInteractive: " + nonInteractive + ")";
+ }
+
+ public String getHelpMessage() {
+ return HELP_MESSAGE;
+ }
+ }
+
+ public static CommandLineParser.Options parse(String[] args, boolean firstRun) {
+ CommandLineParser.Options result = new CommandLineParser.Options();
+ if (args == null || args.length == 0 || !args[0].startsWith("-")) {
+ result.setFilesToOpen(args);
+ return result;
+ }
+ int i = 0;
+ String[] mutableArgs = new String[args.length];
+ System.arraycopy(args, 0, mutableArgs, 0, args.length);
+ args = mutableArgs;
+ for (; i != args.length; ++i) {
+ String arg = args[i];
+ if (arg.startsWith("-S")) {
+ result.setStopAfterLaunch(true);
+ // -SX mymenuitem is allowed
+ if (arg.length() > 2) {
+ args[i] = "-" + arg.substring(2);
+ --i;
+ }
+ }
+ else if (arg.startsWith("-N")) {
+ result.setNonInteractive(true);
+ // -NX mymenuitem is allowed
+ if (arg.length() > 2) {
+ args[i] = "-" + arg.substring(2);
+ --i;
+ }
+ }
+ else if (arg.startsWith("-X")) {
+ if (arg.length() > 2)
+ result.addMenuItemToExecute(arg.substring(2));
+ else if (args.length > i + 1)
+ result.addMenuItemToExecute(args[++i]);
+ }
+ else if (arg.startsWith("-U")) {
+ String userdir = null;
+ if (arg.length() > 2)
+ userdir = arg.substring(2);
+ else if (args.length > i + 1)
+ userdir = args[++i];
+ else {
+ if (firstRun)
+ System.err.println("option -U<userdir> misses its parameter");
+ }
+ if (userdir != null) {
+ System.setProperty(Compat.FREEPLANE_USERDIR_PROPERTY, userdir);
+ // make sure that old settings aren't imported!
+ System.setProperty("org.freeplane.old_userfpdir", userdir);
+ }
+ }
+ else if (arg.startsWith("-h")) {
+ result.setHelpRequested(true);
+ // -hX mymenuitem is allowed
+ if (arg.length() > 2) {
+ args[i] = "-" + arg.substring(2);
+ --i;
+ }
+ }
+ else if (arg.equals("--help")) {
+ result.setHelpRequested(true);
+ }
+ else {
+ break;
+ }
+ }
+ for (; i != args.length; ++i)
+ result.addFilesToOpen(args[i]);
+ if (result.stopAfterLaunch && !result.menuItemsToExecute.contains(QUIT_MENU_ITEM_KEY))
+ result.addMenuItemToExecute(QUIT_MENU_ITEM_KEY);
+ if (result.isHelpRequested() && firstRun) {
+ System.out.println(result.getHelpMessage());
+ }
+ return result;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/ConnectedToMenuView.java b/freeplane/src/main/java/org/freeplane/main/application/ConnectedToMenuView.java
new file mode 100644
index 0000000..c983a15
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/ConnectedToMenuView.java
@@ -0,0 +1,43 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.Component;
+import java.awt.event.KeyEvent;
+
+import javax.swing.Icon;
+import javax.swing.KeyStroke;
+
+import net.infonode.docking.View;
+
+/**
+ * @author Dimitry Polivaev
+ * 27.04.2013
+ */
+ at SuppressWarnings("serial")
+final class ConnectedToMenuView extends View {
+ ConnectedToMenuView(String title, Icon icon, Component component) {
+ super(title, icon, component);
+ }
+ @Override
+ protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
+ return super.processKeyBinding(ks, e, condition, pressed) || MenuKeyProcessor.INSTANCE.processKeyBinding(ks, e, condition, pressed);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/FreeplaneGUIStarter.java b/freeplane/src/main/java/org/freeplane/main/application/FreeplaneGUIStarter.java
new file mode 100644
index 0000000..f7f3697
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/FreeplaneGUIStarter.java
@@ -0,0 +1,434 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.EventQueue;
+import java.awt.Frame;
+import java.awt.Window;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Set;
+
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.KeyStroke;
+import javax.swing.ToolTipManager;
+
+import org.dpolivaev.mnemonicsetter.MnemonicSetter;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ShowSelectionAsRectangleAction;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.generic.ChildActionEntryRemover;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.ConfigurationUtils;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.MenuUtils;
+import org.freeplane.features.attribute.ModelessAttributeController;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.filter.NextNodeAction;
+import org.freeplane.features.filter.NextPresentationItemAction;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.ScannerController;
+import org.freeplane.features.help.HelpController;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.QuitAction;
+import org.freeplane.features.mode.browsemode.BModeController;
+import org.freeplane.features.mode.filemode.FModeController;
+import org.freeplane.features.mode.mindmapmode.LoadAcceleratorPresetsAction;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.print.PrintController;
+import org.freeplane.features.styles.LogicalStyleFilterController;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.time.TimeController;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+import org.freeplane.main.addons.AddOnsController;
+import org.freeplane.main.application.CommandLineParser.Options;
+import org.freeplane.main.browsemode.BModeControllerFactory;
+import org.freeplane.main.filemode.FModeControllerFactory;
+import org.freeplane.main.mindmapmode.MModeControllerFactory;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.view.swing.features.nodehistory.NodeHistory;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.ViewLayoutTypeAction;
+import org.freeplane.view.swing.map.mindmapmode.MMapViewController;
+
+public class FreeplaneGUIStarter implements FreeplaneStarter {
+
+ private static String RESOURCE_BASE_DIRECTORY;
+ private static String INSTALLATION_BASE_DIRECTORY;
+ static {
+ try {
+ RESOURCE_BASE_DIRECTORY = new File(System.getProperty(ApplicationResourceController.FREEPLANE_GLOBALRESOURCEDIR_PROPERTY,
+ ApplicationResourceController.DEFAULT_FREEPLANE_GLOBALRESOURCEDIR)).getCanonicalPath();
+ INSTALLATION_BASE_DIRECTORY = new File(System.getProperty(ApplicationResourceController.FREEPLANE_BASEDIRECTORY_PROPERTY, RESOURCE_BASE_DIRECTORY + "/..")).getCanonicalPath();
+ } catch (IOException e) {
+ }
+ }
+
+
+ static{
+ Compat.fixMousePointerForLinux();
+ }
+
+ public static String getResourceBaseDir() {
+ return RESOURCE_BASE_DIRECTORY;
+ }
+
+ public static String getInstallationBaseDir() {
+ return INSTALLATION_BASE_DIRECTORY;
+ }
+
+ public static void showSysInfo() {
+ final StringBuilder info = new StringBuilder();
+ info.append("freeplane_version = ");
+ info.append(FreeplaneVersion.getVersion());
+ String revision = FreeplaneVersion.getVersion().getRevision();
+
+ info.append("; freeplane_xml_version = ");
+ info.append(FreeplaneVersion.XML_VERSION);
+ if(! revision.equals("")){
+ info.append("\ngit revision = ");
+ info.append(revision);
+ }
+ info.append("\njava_version = ");
+ info.append(System.getProperty("java.version"));
+ info.append("; os_name = ");
+ info.append(System.getProperty("os.name"));
+ info.append("; os_version = ");
+ info.append(System.getProperty("os.version"));
+ LogUtils.info(info.toString());
+ }
+
+ private final ApplicationResourceController applicationResourceController;
+// // private Controller controller;
+ private FreeplaneSplashModern splash = null;
+ private boolean startupFinished = false;
+ private ApplicationViewController viewController;
+ /** allows to disable loadLastMap(s) if there already is a second instance running. */
+ private boolean dontLoadLastMaps;
+ final private boolean firstRun;
+ private static final String LOAD_LAST_MAPS = "load_last_maps";
+ private static final String LOAD_LAST_MAP = "load_last_map";
+ final private Options options;
+
+ public FreeplaneGUIStarter(String[] args) {
+ super();
+ options = CommandLineParser.parse(args, true);
+ final File userPreferencesFile = ApplicationResourceController.getUserPreferencesFile();
+ firstRun = !userPreferencesFile.exists();
+ new UserPropertiesUpdater().importOldProperties();
+ applicationResourceController = new ApplicationResourceController();
+ }
+
+ public void setDontLoadLastMaps() {
+ dontLoadLastMaps = true;
+ }
+
+ @SuppressWarnings("serial")
+ public Controller createController() {
+ try {
+ Controller controller = new Controller(applicationResourceController);
+ Controller.setCurrentController(controller);
+ Compat.macAppChanges();
+ controller.addAction(new QuitAction());
+ applicationResourceController.init();
+ LogUtils.createLogger();
+ FreeplaneGUIStarter.showSysInfo();
+ final String lookandfeel = System.getProperty("lookandfeel", applicationResourceController
+ .getProperty("lookandfeel"));
+ FrameController.setLookAndFeel(lookandfeel);
+ final JFrame frame;
+ frame = new JFrame("Freeplane");
+ frame.setContentPane(new JPanel(){
+
+ @Override
+ protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) {
+ return super.processKeyBinding(ks, e, condition, pressed)
+ || MenuKeyProcessor.INSTANCE.processKeyBinding(ks, e, condition, pressed);
+ }
+
+ });
+ frame.setName(UITools.MAIN_FREEPLANE_FRAME);
+ final MMapViewController mapViewController = new MMapViewController(controller);
+ viewController = new ApplicationViewController(controller, mapViewController, frame);
+ splash = new FreeplaneSplashModern(frame);
+ if (!System.getProperty("org.freeplane.nosplash", "false").equals("true")) {
+ splash.setVisible(true);
+ }
+ mapViewController.addMapViewChangeListener(applicationResourceController.getLastOpenedList());
+ FilterController.install();
+ PrintController.install();
+ FormatController.install(new FormatController());
+ final ScannerController scannerController = new ScannerController();
+ ScannerController.install(scannerController);
+ scannerController.addParsersForStandardFormats();
+ ModelessAttributeController.install();
+ TextController.install();
+ TimeController.install();
+ LinkController.install();
+ IconController.install();
+ HelpController.install();
+ controller.addAction(new NextNodeAction(Direction.FORWARD));
+ controller.addAction(new NextNodeAction(Direction.BACK));
+ controller.addAction(new NextNodeAction(Direction.FORWARD_N_FOLD));
+ controller.addAction(new NextNodeAction(Direction.BACK_N_FOLD));
+ controller.addAction(new NextPresentationItemAction());
+ controller.addAction(new ShowSelectionAsRectangleAction());
+ controller.addAction(new ViewLayoutTypeAction(MapViewLayout.OUTLINE));
+ FilterController.getCurrentFilterController().getConditionFactory().addConditionController(70,
+ new LogicalStyleFilterController());
+ MapController.install();
+
+ NodeHistory.install(controller);
+ return controller;
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void createModeControllers(final Controller controller) {
+ MModeControllerFactory.createModeController();
+ final ModeController mindMapModeController = controller.getModeController(MModeController.MODENAME);
+ LastOpenedList lastOpenedList = applicationResourceController.getLastOpenedList();
+ mindMapModeController.getMapController().addMapChangeListener(lastOpenedList);
+ lastOpenedList.registerMenuContributor(mindMapModeController);
+ mindMapModeController.addUiBuilder(Phase.ACTIONS, "filterConditions", FilterController
+ .getController(controller)
+ .getMenuBuilder(), new ChildActionEntryRemover(controller));
+ BModeControllerFactory.createModeController();
+ FModeControllerFactory.createModeController();
+ }
+
+ public void buildMenus(final Controller controller, final Set<String> plugins) {
+ LoadAcceleratorPresetsAction.install(controller.getModeController(MModeController.MODENAME));
+ buildMenus(controller, plugins, MModeController.MODENAME, "/xml/mindmapmodemenu.xml");
+ buildMenus(controller, plugins, BModeController.MODENAME, "/xml/browsemodemenu.xml");
+ buildMenus(controller, plugins, FModeController.MODENAME, "/xml/filemodemenu.xml");
+ }
+
+ private void buildMenus(final Controller controller, final Set<String> plugins, String mode, String xml) {
+ ModeController modeController = controller.getModeController(mode);
+ controller.selectModeForBuild(modeController);
+ modeController.updateMenus(xml, plugins);
+ final FreeplaneMenuBar menuBar = modeController.getUserInputListenerFactory().getMenuBar();
+ MnemonicSetter.INSTANCE.setComponentMnemonics(menuBar);
+ controller.selectModeForBuild(null);
+ }
+
+ public void createFrame(final String[] args) {
+ Controller controller = Controller.getCurrentController();
+ ModeController modeController = controller.getModeController(MModeController.MODENAME);
+ controller.selectModeForBuild(modeController);
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ viewController.init(Controller.getCurrentController());
+ splash.toBack();
+ final JFrame frame = (JFrame) viewController.getMenuComponent();
+ final int extendedState = frame.getExtendedState();
+ Container contentPane = frame.getContentPane();
+ contentPane.setVisible(false);
+ splash.dispose();
+ splash = null;
+ ToolTipManager.sharedInstance().setDismissDelay(12000);
+ frame.setVisible(true);
+ if (extendedState != frame.getExtendedState()) {
+ frame.setExtendedState(extendedState);
+ }
+ loadMaps(options.getFilesToOpenAsArray());
+ focusCurrentView();
+ contentPane.setVisible(true);
+ frame.toFront();
+ startupFinished = true;
+ System.setProperty("nonInteractive", Boolean.toString(options.isNonInteractive()));
+ try {
+ Thread.sleep(1000);
+ }
+ catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ fireStartupFinished();
+ MenuUtils.executeMenuItems(options.getMenuItemsToExecute());
+ }
+
+ private void focusCurrentView() {
+ final MapView currentMapView = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
+ if(currentMapView != null){
+ viewController.focusTo(currentMapView);
+ }
+ }
+ });
+ }
+
+ protected void fireStartupFinished() {
+ for (ApplicationLifecycleListener listener : Controller.getCurrentController().getApplicationLifecycleListeners()) {
+ listener.onStartupFinished();
+ }
+ }
+
+ private void loadMaps( final String[] args) {
+ final Controller controller = Controller.getCurrentController();
+ final boolean alwaysLoadLastMaps = ResourceController.getResourceController().getBooleanProperty(
+ "always_load_last_maps");
+
+ if (alwaysLoadLastMaps && !dontLoadLastMaps) {
+ loadLastMaps();
+ }
+ loadMaps(controller, args);
+ if (controller.getMap() == null && !alwaysLoadLastMaps && !dontLoadLastMaps) {
+ final AddOnsController addonsController = AddOnsController.getController();
+ addonsController.setAutoInstallEnabled(false);
+ loadLastMaps();
+ addonsController.setAutoInstallEnabled(true);
+ }
+ final ModeController modeController = Controller.getCurrentModeController();
+ if(firstRun && ! dontLoadLastMaps){
+ final String map = ResourceController.getResourceController().getProperty("whatsnew_map");
+ ((MMapController)modeController.getMapController()).newDocumentationMap(map);
+ }
+ if (null != controller.getMap()) {
+ return;
+ }
+ controller.selectMode(MModeController.MODENAME);
+ MFileManager.getController(modeController).newMapFromDefaultTemplate();
+ }
+
+ private void loadLastMaps() {
+ final boolean loadLastMap = ResourceController.getResourceController().getBooleanProperty(LOAD_LAST_MAP);
+ final boolean loadLastMaps = ResourceController.getResourceController().getBooleanProperty(LOAD_LAST_MAPS);
+ if(loadLastMaps)
+ viewController.openMapsOnStart();
+ if(loadLastMaps || loadLastMap)
+ applicationResourceController.getLastOpenedList().openLastMapOnStart();
+ }
+
+ public void loadMapsLater(final String[] args){
+ EventQueue.invokeLater(new Runnable() {
+
+ public void run() {
+ if(startupFinished && EventQueue.isDispatchThread()){
+ loadMaps(Controller.getCurrentController(), args);
+ toFront();
+ return;
+ }
+ EventQueue.invokeLater(this);
+ }
+ });
+ }
+
+ private void toFront() {
+ final Component menuComponent = UITools.getMenuComponent();
+ if(menuComponent instanceof Frame) {
+ final Frame frame = (Frame) menuComponent;
+ final int state = frame.getExtendedState();
+ if ((state & Frame.ICONIFIED) != 0)
+ frame.setExtendedState(state & ~Frame.ICONIFIED);
+ }
+ if(menuComponent instanceof Window) {
+ Window window = (Window) menuComponent;
+ if (!window.isVisible())
+ window.setVisible(true);
+ window.toFront();
+ window.requestFocus();
+ }
+ }
+
+ private void loadMaps(final Controller controller, final String[] args) {
+ controller.selectMode(MModeController.MODENAME);
+ for (int i = 0; i < args.length; i++) {
+ String fileArgument = args[i];
+ try {
+ final LinkController linkController = LinkController.getController();
+ linkController.loadMap(fileArgument);
+ }
+ catch (final Exception ex) {
+ System.err.println("File " + fileArgument + " not loaded");
+ }
+ }
+ }
+
+ /**
+ */
+ public void run(final String[] args) {
+ try {
+ if (null == System.getProperty("org.freeplane.core.dir.lib", null)) {
+ System.setProperty("org.freeplane.core.dir.lib", "/lib/");
+ }
+ final Controller controller = createController();
+ createModeControllers(controller);
+ FilterController.getController(controller).loadDefaultConditions();
+ final Set<String> emptySet = Collections.emptySet();
+ buildMenus(controller, emptySet);
+ createFrame(args);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ JOptionPane.showMessageDialog(UITools.getMenuComponent(), "freeplane.main.Freeplane can't be started",
+ "Startup problem", JOptionPane.ERROR_MESSAGE);
+ System.exit(1);
+ }
+ }
+
+ public void stop() {
+ try {
+ if (EventQueue.isDispatchThread()) {
+ Controller.getCurrentController().shutdown();
+ return;
+ }
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ Controller.getCurrentController().shutdown();
+ }
+ });
+ }
+ catch (final InterruptedException e) {
+ LogUtils.severe(e);
+ }
+ catch (final InvocationTargetException e) {
+ LogUtils.severe(e);
+ }
+ }
+
+ public ResourceController getResourceController() {
+ return applicationResourceController;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/FreeplaneMain.java b/freeplane/src/main/java/org/freeplane/main/application/FreeplaneMain.java
new file mode 100644
index 0000000..d074ee3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/FreeplaneMain.java
@@ -0,0 +1,51 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import javax.swing.JOptionPane;
+
+public class FreeplaneMain {
+ public static void checkJavaVersion() {
+ final String JAVA_VERSION = System.getProperty("java.version");
+ final String VERSION_1_5_0 = "1.5.0";
+ if (JAVA_VERSION.compareTo(VERSION_1_5_0) < 0) {
+ final String message = "Warning: Freeplane requires version Java 1.5.0 or higher. The running version: "
+ + JAVA_VERSION + " is installed in " + System.getProperty("java.home") + ".";
+ System.err.println(message);
+ JOptionPane.showMessageDialog(null, message, "error", JOptionPane.ERROR_MESSAGE);
+ System.exit(1);
+ }
+ final String osProperty = System.getProperty("os.name");
+ if (osProperty.startsWith("Mac OS")) {
+ System.setProperty("apple.laf.useScreenMenuBar", "true");
+ }
+ }
+
+ static public void main(final String[] args) {
+ FreeplaneMain.checkJavaVersion();
+ final String oldHandler = System.getProperty("java.protocol.handler.pkgs");
+ String newHandler = "org.freeplane.main.application.protocols";
+ if(oldHandler != null)
+ newHandler = oldHandler + '|' + newHandler;
+ System.setProperty("java.protocol.handler.pkgs", newHandler);
+ final FreeplaneStarter starter = new FreeplaneGUIStarter(args);
+ starter.run(args);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/FreeplaneSplashModern.java b/freeplane/src/main/java/org/freeplane/main/application/FreeplaneSplashModern.java
new file mode 100644
index 0000000..e886815
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/FreeplaneSplashModern.java
@@ -0,0 +1,163 @@
+/*
+ * SimplyHTML, a word processor based on Java, HTML and CSS
+ * Copyright (C) 2002 Ulrich Hilger
+ * Copyright (C) 2006 Karsten Pawlik
+ * Copyright (C) 2006 Dimitri Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+package org.freeplane.main.application;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.Toolkit;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.io.InputStream;
+import java.net.URL;
+
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JRootPane;
+import javax.swing.JWindow;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * Class that displays a splash screen
+ * Is run in a separate thread so that the applet continues to load in the background
+ * @author Karsten Pawlik
+ *
+ */
+public class FreeplaneSplashModern extends JWindow {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Font versionTextFont = null;
+
+ public FreeplaneSplashModern(final JFrame frame) {
+ super(frame);
+ splashResource = ResourceController.getResourceController().getResource("/images/Freeplane_splash.png");
+ splashImage = new ImageIcon(splashResource);
+ setBackground(new Color(0x57, 0xbf, 0x5e));
+ final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+ final Dimension labelSize = new Dimension(splashImage.getIconWidth(), splashImage.getIconHeight());
+ setLocation(screenSize.width / 2 - (labelSize.width / 2), screenSize.height / 2 - (labelSize.height / 2));
+ setSize(labelSize);
+ RootPane rootPane = new RootPane();
+ rootPane.setSize(labelSize);
+ setRootPane(rootPane);
+ }
+
+ private void createVersionTextFont() {
+ if(versionTextFont != null){
+ return;
+ }
+ InputStream fontInputStream = null;
+ try {
+ fontInputStream = ResourceController.getResourceController().getResource("/fonts/intuitive-subset.ttf")
+ .openStream();
+ versionTextFont = Font.createFont(Font.TRUETYPE_FONT, fontInputStream);
+ }
+ catch (final Exception e) {
+ versionTextFont = new Font("Arial", Font.PLAIN, 12);
+ }
+ finally {
+ FileUtils.silentlyClose(fontInputStream);
+ }
+ }
+
+ private final ImageIcon splashImage;
+ private final URL splashResource;
+
+ @SuppressWarnings("serial")
+ private class RootPane extends JRootPane{
+
+ public RootPane() {
+ setDoubleBuffered(false);
+ }
+
+ @Override
+ public void paintComponent(final Graphics g) {
+ final Graphics2D g2 = (Graphics2D) g;
+ splashImage.paintIcon(this, g2, 0, 0);
+ if(splashResource.getProtocol().equals("file"))
+ return;
+ g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+ final FreeplaneVersion version = FreeplaneVersion.getVersion();
+ final String versionString = getVersionText(version);
+ g2.setColor(Color.WHITE);
+ createVersionTextFont();
+ final float versionFontSize= 20;
+ g2.setFont(versionTextFont.deriveFont(versionFontSize));
+ int versionStringWidth = g2.getFontMetrics().stringWidth(versionString);
+ final int xCoordinate = splashImage.getIconWidth() - versionStringWidth - 20;
+ final int yCoordinate = 20;
+ g2.drawString(versionString, xCoordinate, yCoordinate);
+ }
+
+ @Override
+ public void paintChildren(final Graphics g) {
+ }
+ }
+
+ private String getVersionText(final FreeplaneVersion version) {
+ final String freeplaneNumber = version.numberToString();
+ final String status = version.getType().toLowerCase();
+ if("".equals(status))
+ return freeplaneNumber;
+ else{
+ final String versionString = freeplaneNumber + " " + status;
+ return versionString;
+ }
+ }
+
+ @Override
+ public void setVisible(final boolean b) {
+ super.setVisible(b);
+ if (b) {
+ paintImmediately();
+ }
+ }
+
+ public void paintImmediately() {
+ ((JComponent) getRootPane()).paintImmediately(0, 0, getWidth(), getHeight());
+ }
+
+ static public void main(String[] args){
+ ApplicationResourceController applicationResourceController = new ApplicationResourceController();
+ Controller controller = new Controller(applicationResourceController);
+ Controller.setCurrentController(controller);
+ FreeplaneSplashModern freeplaneSplashModern = new FreeplaneSplashModern(null);
+ freeplaneSplashModern.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ System.out.println("x = " + e.getX() + " y = " + e.getY());
+ if(e.getClickCount() == 2)
+ System.exit(0);
+ }
+ });
+ freeplaneSplashModern.setVisible(true);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/FreeplaneStarter.java b/freeplane/src/main/java/org/freeplane/main/application/FreeplaneStarter.java
new file mode 100644
index 0000000..6ca7b72
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/FreeplaneStarter.java
@@ -0,0 +1,51 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.util.Set;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev
+ * 24.12.2012
+ */
+public interface FreeplaneStarter {
+ public void setDontLoadLastMaps();
+
+ public Controller createController();
+
+ public void createModeControllers(final Controller controller);
+
+ public void buildMenus(final Controller controller, final Set<String> plugins);
+
+ public void createFrame(final String[] args);
+
+ public void loadMapsLater(final String[] args);
+
+ /**
+ */
+ public void run(final String[] args);
+
+ public void stop();
+
+ public ResourceController getResourceController();
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/IconColorReplacer.java b/freeplane/src/main/java/org/freeplane/main/application/IconColorReplacer.java
new file mode 100644
index 0000000..bdb5679
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/IconColorReplacer.java
@@ -0,0 +1,48 @@
+package org.freeplane.main.application;
+
+import java.awt.Color;
+import java.awt.Image;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.freeplane.core.ui.ColoredIconCreator;
+import org.freeplane.core.util.ColorUtils;
+
+public class IconColorReplacer {
+ final private List<Image> originalIconImages;
+ final Map<Color, List<Image>> derivedImages;
+ public IconColorReplacer(List<Image> iconImages) {
+ this.originalIconImages = iconImages;
+ derivedImages = new HashMap<Color, List<Image>>();
+ derivedImages.put(original, iconImages);
+ }
+ private static final Color original = ColorUtils.stringToColor("#E6D837");
+ private static final Color red = ColorUtils.stringToColor("#ff0000");
+ private static final Color blue = ColorUtils.stringToColor("#0099ff");
+ private static final Color green = ColorUtils.stringToColor("#009900");
+ private static final Color purple = ColorUtils.stringToColor("#cc00cc");
+ private static final Color orange = ColorUtils.stringToColor("#ff6600");
+ static private Color[] colors = new Color[]{
+ original, red, blue, green, purple, orange
+ };
+ private int currentColorIndex = 0;
+
+ public List<Image> getNextIconImages() {
+ currentColorIndex++;
+ currentColorIndex %= colors.length;
+ Color requiredColor = colors[currentColorIndex];
+ List<Image> coloredImages = derivedImages.get(requiredColor);
+ if(coloredImages != null)
+ return coloredImages;
+ coloredImages = new ArrayList<Image>(originalIconImages.size());
+ for(Image originalImage: originalIconImages){
+ ColoredIconCreator coloredIconCreator = new ColoredIconCreator(originalImage, original);
+ Image coloredImage = coloredIconCreator.createColoredImage(requiredColor);
+ coloredImages.add(coloredImage);
+ }
+ derivedImages.put(requiredColor, coloredImages);
+ return coloredImages;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/LastOpenedList.java b/freeplane/src/main/java/org/freeplane/main/application/LastOpenedList.java
new file mode 100644
index 0000000..5cf27e6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/LastOpenedList.java
@@ -0,0 +1,500 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.Component;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import javax.swing.Action;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.generic.ChildActionEntryRemover;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.ConfigurationUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.map.mindmapmode.DocuMapAttribute;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.n3.nanoxml.XMLException;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * This class manages a list of the maps that were opened last. It aims to
+ * provide persistence for the last recent maps and the last selected nodes (in separate properties).
+ * Maps should be shown in the format:"mode\:key",ie."Mindmap\:/home/joerg/freeplane.mm"
+ */
+
+public class LastOpenedList implements IMapViewChangeListener, IMapChangeListener {
+ static class RecentFile {
+ public RecentFile(String restorable, String mapName) {
+ this.restorable = restorable;
+ this.mapName = mapName;
+ }
+ public RecentFile(String restorable) {
+ this(restorable, null);
+ }
+ String restorable;
+ /** map.toString(), not-null only if opened. */
+ String mapName;
+ /** persisted, but not necessary not-null. */
+ String lastVisitedNodeId;
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((restorable == null) ? 0 : restorable.hashCode());
+ return result;
+ }
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ RecentFile other = (RecentFile) obj;
+ if (restorable == null) {
+ if (other.restorable != null)
+ return false;
+ }
+ else if (!restorable.equals(other.restorable))
+ return false;
+ return true;
+ }
+ @Override
+ public String toString() {
+ return "RecentFileL(" + restorable + "@" + lastVisitedNodeId + ")";
+ }
+ }
+
+ private static final String LAST_OPENED_LIST_LENGTH = "last_opened_list_length";
+ private static final String LAST_OPENED = "lastOpened_1.0.20";
+ private static final String LAST_LOCATIONS = "lastLocations";
+ private static boolean PORTABLE_APP = System.getProperty("portableapp", "false").equals("true");
+ private static String USER_DRIVE = System.getProperty("user.home", "").substring(0, 2);
+
+ final private List<RecentFile> lastOpenedList = new LinkedList<RecentFile>();
+ private RecentFile mapSelectedOnStart;
+
+ LastOpenedList() {
+ restore();
+
+ }
+
+ public void registerMenuContributor(final ModeController modeController) {
+ modeController.addUiBuilder(Phase.ACTIONS, "lastOpenedMaps", new EntryVisitor() {
+
+ @Override
+ public void visit(Entry target) {
+ updateMenus(modeController, target);
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+ }, new ChildActionEntryRemover(modeController));
+
+ }
+
+ public void afterViewChange(final Component oldView, final Component newView) {
+ if (newView == null) {
+ updateMenus();
+ return;
+ }
+ final MapModel map = getMapModel(newView);
+ final String restoreString = getRestoreable(map);
+ updateList(map, restoreString);
+ }
+
+ public void afterViewClose(final Component oldView) {
+ updateLastVisitedNodeId(oldView);
+ }
+
+ private boolean selectLastVisitedNode(RecentFile recentFile) {
+ if (recentFile != null && recentFile.lastVisitedNodeId != null) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final NodeModel node = map.getNodeForID(recentFile.lastVisitedNodeId);
+ if (node != null && node.hasVisibleContent()) {
+ IMapSelection selection = Controller.getCurrentController().getSelection();
+ // don't override node selection done by UriManager.loadURI()
+ if (selection.isSelected(map.getRootNode()))
+ selection.selectAsTheOnlyOneSelected(node);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean saveLastPositionInMapEnabled() {
+ return ResourceController.getResourceController().getBooleanProperty("save_last_position_in_map");
+ }
+
+ public void afterViewCreated(final Component mapView) {
+ final MapModel map = getMapModel(mapView);
+ final RecentFile recentFile = findRecentFileByMapModel(map);
+ // the next line will only succeed if the map is already opened
+ if (saveLastPositionInMapEnabled() && ! selectLastVisitedNode(recentFile)) {
+ ensureSelectLastVisitedNodeOnOpen(map, recentFile);
+ }
+ }
+
+ private void ensureSelectLastVisitedNodeOnOpen(final MapModel map, final RecentFile recentFile) {
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ if (recentFile != null && recentFile.lastVisitedNodeId != null) {
+ mapController.addNodeSelectionListener(new INodeSelectionListener() {
+ public void onSelect(NodeModel node) {
+ if (node.getMap() == map) {
+ // only once
+ mapController.removeNodeSelectionListener(this);
+ final NodeModel toSelect = map.getNodeForID(recentFile.lastVisitedNodeId);
+ // don't restore an old position if a new one is selected
+ if (toSelect != null && node.isRoot())
+ Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(toSelect);
+ }
+ }
+
+ public void onDeselect(NodeModel node) {
+ }
+ });
+ }
+ }
+
+ private MapModel getMapModel(final Component mapView) {
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ return mapViewManager.getModel(mapView);
+ }
+
+ public void beforeViewChange(final Component oldView, final Component newView) {
+ }
+
+ private int getMaxMenuEntries() {
+ return ResourceController.getResourceController().getIntProperty(LAST_OPENED_LIST_LENGTH, 25);
+ }
+
+ private String getRestorable(final File file) {
+ if (file == null //
+ || !AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
+ @Override
+ public Boolean run() {
+ return file.exists();
+ }
+ })) {
+ return null;
+ }
+ final String absolutePath = file.getAbsolutePath();
+ if (!PORTABLE_APP || !USER_DRIVE.endsWith(":")) {
+ return "MindMap:" + absolutePath;
+ }
+ final String diskName = absolutePath.substring(0, 2);
+ if (!diskName.equals(USER_DRIVE)) {
+ return "MindMap:" + absolutePath;
+ }
+ return "MindMap::" + absolutePath.substring(2);
+ }
+
+ public String getRestoreable( final MapModel map) {
+ if (map == null) {
+ return null;
+ }
+ //ignore documentation maps loaded using documentation actions
+ if(map.containsExtension(DocuMapAttribute.class))
+ return null;
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (!modeController.getModeName().equals(MModeController.MODENAME)) {
+ return null;
+ }
+ final File file = map.getFile();
+ return getRestorable(file);
+ }
+
+ public void mapChanged(final MapChangeEvent event) {
+ if (!event.getProperty().equals(UrlManager.MAP_URL)) {
+ return;
+ }
+ final URL after = (URL) event.getNewValue();
+ if (after != null) {
+ final String fileAfter = after.getFile();
+ if (fileAfter != null) {
+ final String restorable = getRestorable(new File(fileAfter));
+ updateList(event.getMap(), restorable);
+ }
+ }
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void open(final RecentFile recentFile) throws FileNotFoundException, MalformedURLException, IOException,
+ URISyntaxException, XMLException {
+ if (recentFile == null)
+ return;
+ final StringTokenizer tokens = new StringTokenizer(recentFile.restorable, ":");
+ if (!tokens.hasMoreTokens())
+ return;
+ final boolean changedToMapView = tryToChangeToMapView(recentFile);
+ if (changedToMapView)
+ return;
+ final String mode = tokens.nextToken();
+ Controller.getCurrentController().selectMode(mode);
+ File file = createFileFromRestorable(tokens);
+ if(!changedToMapView)
+ Controller.getCurrentModeController().getMapController().newMap(Compat.fileToUrl(file));
+ else {
+ final MapModel map = Controller.getCurrentController().getMap();
+ Controller.getCurrentModeController().getMapController().newMapView(map);
+ }
+ }
+
+ public File createFileFromRestorable(StringTokenizer tokens) {
+ String fileName = tokens.nextToken(";").substring(1);
+ if (PORTABLE_APP && fileName.startsWith(":") && USER_DRIVE.endsWith(":")) {
+ fileName = USER_DRIVE + fileName.substring(1);
+ }
+ File file = new File(fileName);
+ return file;
+ }
+
+ void openLastMapOnStart() {
+ if (mapSelectedOnStart != null) {
+ if(!tryToChangeToMapView(mapSelectedOnStart))
+ safeOpen(mapSelectedOnStart);
+ }
+ }
+
+ private void restore() {
+ final List<String> lastOpened = getListPropertyNotNull(LAST_OPENED);
+ final List<String> lastLocation = getListPropertyNotNull(LAST_LOCATIONS);
+ for (int i = 0; i < lastOpened.size(); i++) {
+ final RecentFile recentFile = new RecentFile(lastOpened.get(i));
+ if (lastLocation.size() == lastOpened.size())
+ recentFile.lastVisitedNodeId = lastLocation.get(i);
+ lastOpenedList.add(recentFile);
+ }
+ if (!lastOpenedList.isEmpty()) {
+ mapSelectedOnStart = lastOpenedList.get(0);
+ }
+ }
+
+ private List<String> getListPropertyNotNull(String key) {
+ final String lastOpened = ResourceController.getResourceController().getProperty(key, "");
+ return ConfigurationUtils.decodeListValue(lastOpened, true);
+ }
+
+ public void safeOpen(final RecentFile recentFile) {
+ try {
+ open(recentFile);
+ }
+ catch (final Exception ex) {
+ LogUtils.warn(ex);
+ final String message = TextUtils.format("remove_file_from_list_on_error", recentFile.restorable);
+ UITools.showFrame();
+ final Component frame = UITools.getMenuComponent();
+ final int remove = JOptionPane.showConfirmDialog(frame, message, "Freeplane", JOptionPane.YES_NO_OPTION);
+ if (remove == JOptionPane.YES_OPTION) {
+ lastOpenedList.remove(recentFile);
+ updateMenus();
+ }
+ }
+ }
+
+ public void saveProperties() {
+ updateLastVisitedNodeIds();
+ ResourceController.getResourceController().setProperty(LAST_OPENED,
+ ConfigurationUtils.encodeListValue(getRestoreables(), true));
+ ResourceController.getResourceController().setProperty(LAST_LOCATIONS,
+ ConfigurationUtils.encodeListValue(getLastVisitedNodeIds(), true));
+ }
+
+ private void updateLastVisitedNodeIds() {
+ final List<? extends Component> mapViews = Controller.getCurrentController().getMapViewManager()
+ .getMapViewVector();
+ for (Component component : mapViews) {
+ updateLastVisitedNodeId(component);
+ }
+ }
+
+ private void updateLastVisitedNodeId(final Component mapView) {
+ if (!(mapView instanceof MapView))
+ return;
+ final NodeView selected = ((MapView) mapView).getSelected();
+ final RecentFile recentFile = findRecentFileByMapModel(getMapModel(mapView));
+ if (selected != null && recentFile != null) {
+ NodeModel selectedNode = selected.getModel();
+ // if a map has never been visited restoration of the selection has not yet taken place
+ if (!selectedNode.isRoot())
+ recentFile.lastVisitedNodeId = selectedNode.getID();
+ }
+ }
+
+ private RecentFile findRecentFileByRestorable(String restorable) {
+ for (RecentFile recentFile : lastOpenedList) {
+ if (recentFile.restorable.equals(restorable))
+ return recentFile;
+ }
+ return null;
+ }
+
+ private RecentFile findRecentFileByMapModel(final MapModel map) {
+ return findRecentFileByRestorable(getRestoreable(map));
+ }
+
+ private List<String> getRestoreables() {
+ ArrayList<String> result = new ArrayList<String>(lastOpenedList.size());
+ for (RecentFile recentFile : lastOpenedList) {
+ result.add(recentFile.restorable);
+ }
+ return result;
+ }
+
+ private List<String> getLastVisitedNodeIds() {
+ ArrayList<String> result = new ArrayList<String>(lastOpenedList.size());
+ for (RecentFile recentFile : lastOpenedList) {
+ result.add(recentFile.lastVisitedNodeId);
+ }
+ return result;
+ }
+
+ private boolean tryToChangeToMapView(final RecentFile mapSelectedOnStart) {
+ return Controller.getCurrentController().getMapViewManager().tryToChangeToMapView(mapSelectedOnStart.mapName);
+ }
+
+ private void updateList(final MapModel map, final String restoreString) {
+ //ignore documentation maps loaded using documentation actions
+ if(map.containsExtension(DocuMapAttribute.class))
+ return;
+ if (restoreString != null) {
+ RecentFile recentFile = findRecentFileByRestorable(restoreString);
+ if (recentFile != null) {
+ lastOpenedList.remove(recentFile);
+ recentFile.mapName = map.getTitle();
+ lastOpenedList.add(0, recentFile);
+ }
+ else {
+ lastOpenedList.add(0, new RecentFile(restoreString, map.getTitle()));
+ }
+ }
+ updateMenus();
+ }
+
+ private void updateMenus() {
+ final IUserInputListenerFactory userInputListenerFactory = Controller.getCurrentModeController()
+ .getUserInputListenerFactory();
+ userInputListenerFactory.rebuildMenus("lastOpenedMaps");
+ }
+
+ private void updateMenus(ModeController modeController, Entry target) {
+ List<AFreeplaneAction> openMapActions = createOpenLastMapActionList();
+ for (AFreeplaneAction openMapAction : openMapActions) {
+ modeController.addActionIfNotAlreadySet(openMapAction);
+ new EntryAccessor().addChildAction(target, openMapAction);
+ }
+ }
+
+ public List<AFreeplaneAction> createOpenLastMapActionList() {
+ Controller controller = Controller.getCurrentController();
+ final ModeController modeController = controller.getModeController();
+ int i = 0;
+ int maxEntries = getMaxMenuEntries();
+ List<AFreeplaneAction> openMapActions = new ArrayList<AFreeplaneAction>(maxEntries);
+ for (final RecentFile recentFile : lastOpenedList) {
+ if (i == 0
+ && (!modeController.getModeName().equals(MModeController.MODENAME) || controller.getMap() == null || controller
+ .getMap().getURL() == null)) {
+ i++;
+ maxEntries++;
+ }
+ if (i == maxEntries) {
+ break;
+ }
+
+ final AFreeplaneAction openMapAction = new OpenLastOpenedAction(i++, this, recentFile);
+ createOpenMapItemName(openMapAction, recentFile.restorable);
+ openMapActions.add(openMapAction);
+ }
+ return openMapActions;
+ }
+
+ private void createOpenMapItemName(AFreeplaneAction openMapAction, final String restorable) {
+ final int separatorIndex = restorable.indexOf(':');
+ if(separatorIndex == -1)
+ openMapAction.putValue(Action.NAME, restorable);
+
+ String key = restorable.substring(0, separatorIndex);
+ String fileName = restorable.substring(separatorIndex);
+ String keyName = TextUtils.getText("open_as" + key, key);
+ openMapAction.putValue(Action.SHORT_DESCRIPTION, keyName);
+ openMapAction.putValue(Action.DEFAULT, fileName);
+ if(fileName.startsWith("::"))
+ fileName = fileName.substring(2);
+ else
+ fileName = fileName.substring(1);
+
+ openMapAction.putValue(Action.NAME, keyName + " " + fileName);
+
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/MapViewDockingWindows.java b/freeplane/src/main/java/org/freeplane/main/application/MapViewDockingWindows.java
new file mode 100644
index 0000000..7b4a9d7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/MapViewDockingWindows.java
@@ -0,0 +1,511 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2013.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Image;
+import java.awt.Window;
+import java.awt.dnd.DropTarget;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Vector;
+
+import javax.swing.InputMap;
+import javax.swing.JComponent;
+import javax.swing.JDesktopPane;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.SwingUtilities;
+import javax.swing.Timer;
+import javax.swing.UIManager;
+import javax.swing.event.InternalFrameAdapter;
+import javax.swing.event.InternalFrameEvent;
+
+import net.infonode.docking.AbstractTabWindow;
+import net.infonode.docking.DockingWindow;
+import net.infonode.docking.DockingWindowAdapter;
+import net.infonode.docking.FloatingWindow;
+import net.infonode.docking.OperationAbortedException;
+import net.infonode.docking.RootWindow;
+import net.infonode.docking.TabWindow;
+import net.infonode.docking.View;
+import net.infonode.docking.properties.DockingWindowProperties;
+import net.infonode.docking.properties.RootWindowProperties;
+import net.infonode.docking.theme.BlueHighlightDockingTheme;
+import net.infonode.docking.util.DockingUtil;
+import net.infonode.properties.gui.util.ComponentProperties;
+import net.infonode.tabbedpanel.TabAreaProperties;
+import net.infonode.tabbedpanel.TabAreaVisiblePolicy;
+import net.infonode.tabbedpanel.TabDropDownListVisiblePolicy;
+import net.infonode.tabbedpanel.TabLayoutPolicy;
+import net.infonode.tabbedpanel.TabbedPanelProperties;
+import net.infonode.tabbedpanel.titledtab.TitledTabProperties;
+import net.infonode.util.Direction;
+
+import org.apache.commons.codec.binary.Base64;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.FileOpener;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.url.mindmapmode.DroppedMindMapOpener;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.ui.DefaultMapMouseListener;
+
+class MapViewDockingWindows implements IMapViewChangeListener {
+
+ // // final private Controller controller;
+ private static final String OPENED_NOW = "openedNow_1.3.04";
+ private RootWindow rootWindow = null;
+ final private Vector<Component> mapViews;
+ private boolean mPaneSelectionUpdate = true;
+ private boolean loadingLayoutFromObjectInpusStream;
+ private byte[] emptyConfigurations;
+ private final MapViewSerializer viewSerializer;
+
+ public MapViewDockingWindows() {
+ viewSerializer = new MapViewSerializer();
+ rootWindow = new RootWindow(viewSerializer);
+ configureDefaultDockingWindowProperties();
+
+ try {
+ ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+ ObjectOutputStream wrapper = new ObjectOutputStream(byteStream);
+ rootWindow.write(wrapper);
+ wrapper.close();
+ emptyConfigurations = byteStream.toByteArray();
+ }
+ catch (IOException e1) {
+ }
+ removeDesktopPaneAccelerators();
+ mapViews = new Vector<Component>();
+ final FileOpener fileOpener = new FileOpener("mm", new DroppedMindMapOpener());
+ new DropTarget(rootWindow, fileOpener);
+ rootWindow.addMouseListener(new DefaultMapMouseListener());
+
+ final Controller controller = Controller.getCurrentController();
+ controller.getMapViewManager().addMapViewChangeListener(this);
+ rootWindow.addListener(new DockingWindowAdapter(){
+
+ private IconColorReplacer iconColorReplacer;
+
+ @Override
+ public void viewFocusChanged(View previouslyFocusedView, View focusedView) {
+ if (focusedView != null) {
+ Component containedMapView = getContainedMapView(focusedView);
+ final Component mapViewComponent = Controller.getCurrentController().getMapViewManager()
+ .getMapViewComponent();
+ if (containedMapView != mapViewComponent)
+ viewSelectionChanged(containedMapView);
+ }
+ }
+
+ @Override
+ public void windowClosing(DockingWindow window) throws OperationAbortedException {
+ for(Component mapViewComponent : mapViews.toArray(new Component[]{}))
+ if(SwingUtilities.isDescendingFrom(mapViewComponent, window))
+ if (!Controller.getCurrentController().getMapViewManager().close(mapViewComponent, false))
+ throw new OperationAbortedException("can not close view");
+ }
+
+
+
+ @Override
+ public void windowAdded(final DockingWindow addedToWindow, final DockingWindow addedWindow) {
+ if(addedWindow instanceof TabWindow) {
+ final DockingWindowProperties windowProperties = addedWindow.getWindowProperties();
+ windowProperties.setDockEnabled(false);
+ windowProperties.setUndockEnabled(false);
+ if(UITools.getCurrentFrame().isResizable())
+ setTabAreaVisiblePolicy((TabWindow) addedWindow);
+ else
+ setTabAreaPolicy((TabWindow) addedWindow, TabAreaVisiblePolicy.NEVER);
+ }
+ else if(addedWindow instanceof FloatingWindow) {
+ final Container topLevelAncestor = addedWindow.getTopLevelAncestor();
+ if(topLevelAncestor instanceof Window){
+ if(iconColorReplacer == null)
+ iconColorReplacer = new IconColorReplacer(((Window) UITools.getMenuComponent()).getIconImages());
+ final List<Image> iconImages = iconColorReplacer.getNextIconImages();
+ ((Window)topLevelAncestor).setIconImages(iconImages);
+ }
+ }
+ setTabPolicies(addedWindow);
+ }
+
+ private void setTabPolicies(final DockingWindow window) {
+ if(window instanceof TabWindow){
+ TabbedPanelProperties tabbedPanelProperties = ((TabWindow)window).getTabWindowProperties().getTabbedPanelProperties();
+ if(! tabbedPanelProperties.getTabLayoutPolicy().equals(TabLayoutPolicy.COMPRESSION))
+ tabbedPanelProperties.setTabLayoutPolicy(TabLayoutPolicy.COMPRESSION);
+ if(! tabbedPanelProperties.getTabDropDownListVisiblePolicy().equals(TabDropDownListVisiblePolicy.MORE_THAN_ONE_TAB))
+ tabbedPanelProperties.setTabDropDownListVisiblePolicy(TabDropDownListVisiblePolicy.MORE_THAN_ONE_TAB);
+ }
+ for(int i = 0; i < window.getChildWindowCount(); i++){
+ setTabPolicies(window.getChildWindow(i));
+ }
+ }
+
+
+
+ @Override
+ public void windowRemoved(DockingWindow removedFromWindow, DockingWindow removedWindow) {
+ if(removedWindow instanceof TabWindow) {
+ if (removedFromWindow == rootWindow) {
+ final TabAreaProperties tabAreaProperties = ((TabWindow)removedWindow).getTabWindowProperties().getTabbedPanelProperties().getTabAreaProperties();
+ tabAreaProperties.setTabAreaVisiblePolicy(TabAreaVisiblePolicy.ALWAYS);
+ }
+ }
+ }
+ });
+
+ new InternalFrameAdapter() {
+ @Override
+ public void internalFrameClosing(InternalFrameEvent e) {
+ }
+ };
+
+
+ }
+
+ private void configureDefaultDockingWindowProperties() {
+
+ RootWindowProperties rootWindowProperties = rootWindow.getRootWindowProperties();
+ rootWindowProperties.addSuperObject(new BlueHighlightDockingTheme().getRootWindowProperties());
+
+ RootWindowProperties overwrittenProperties = new RootWindowProperties();
+
+ overwrittenProperties.getFloatingWindowProperties().setUseFrame(true);
+
+ final ComponentProperties windowAreaProperties = overwrittenProperties.getWindowAreaProperties();
+ windowAreaProperties.setBackgroundColor(UIManager.getColor("Panel.background"));
+ windowAreaProperties.setInsets(null);
+ windowAreaProperties.setBorder(null);
+
+ TabbedPanelProperties tabbedPanelProperties = overwrittenProperties.getTabWindowProperties().getTabbedPanelProperties();
+ tabbedPanelProperties.setTabLayoutPolicy(TabLayoutPolicy.COMPRESSION);
+ tabbedPanelProperties.setTabDropDownListVisiblePolicy(TabDropDownListVisiblePolicy.MORE_THAN_ONE_TAB);
+ tabbedPanelProperties.setShadowEnabled(false);
+
+ final ComponentProperties contentPaneComponentProperties = tabbedPanelProperties.getContentPanelProperties().getComponentProperties();
+ contentPaneComponentProperties.setInsets(null);
+ contentPaneComponentProperties.setBorder(null);
+
+ Font tabFont = new Font("Dialog", 0, 11);
+ TitledTabProperties titledTabProperties = overwrittenProperties.getTabWindowProperties().getTabProperties().getTitledTabProperties();
+ titledTabProperties.getHighlightedProperties().getComponentProperties().setFont(tabFont);
+ titledTabProperties.getNormalProperties().getComponentProperties().setFont(tabFont);
+ rootWindowProperties.addSuperObject(overwrittenProperties);
+ }
+
+ private void removeDesktopPaneAccelerators() {
+ final InputMap map = new InputMap();
+ rootWindow.setInputMap(JDesktopPane.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, map);
+ }
+
+
+ private DockingWindow getLastFocusedChildWindow(DockingWindow parentWindow) {
+ DockingWindow lastFocusedChildWindow = parentWindow.getLastFocusedChildWindow();
+ if(lastFocusedChildWindow == null)
+ return parentWindow;
+ else
+ return getLastFocusedChildWindow(lastFocusedChildWindow);
+ }
+
+ public void afterViewChange(final Component pOldMap, final Component pNewMap) {
+ if (pNewMap == null) {
+ return;
+ }
+ if(! loadingLayoutFromObjectInpusStream) {
+ for (int i = 0; i < mapViews.size(); ++i) {
+ if (mapViews.get(i) == pNewMap) {
+ View dockedView = getContainingDockedWindow(pNewMap);
+ if(dockedView.isMinimized())
+ dockedView.restore();
+ else
+ dockedView.restoreFocus();
+ focusMapViewLater((MapView) pNewMap);
+ return;
+ }
+ }
+ addDockedWindow(pOldMap, pNewMap);
+ }
+ else if(mapViews.contains(pNewMap))
+ return;
+ mapViews.add(pNewMap);
+ }
+
+ static private View getContainingDockedWindow(final Component pNewMap) {
+ return (View) SwingUtilities.getAncestorOfClass(View.class, pNewMap);
+ }
+
+ private void addDockedView(View oldSelected, View newView) {
+ DockingWindow lastFocusedChildWindow = oldSelected != null ? oldSelected : getLastFocusedChildWindow(rootWindow);
+ if(lastFocusedChildWindow == null) {
+ DockingUtil.addWindow(newView, rootWindow);
+ }
+ else{
+ Container parent = SwingUtilities.getAncestorOfClass(DockingWindow.class, lastFocusedChildWindow);
+ if(parent instanceof TabWindow) {
+ final TabWindow tabWindow = (TabWindow)parent;
+ tabWindow.addTab(newView, tabWindow.getChildWindowIndex(lastFocusedChildWindow) + 1);
+ } else
+ DockingUtil.addWindow(newView, lastFocusedChildWindow.getRootWindow());
+ }
+ }
+
+ static Component getContainedMapView(View dockedWindow) {
+ JScrollPane scrollPane = (JScrollPane) dockedWindow.getComponent();
+ Component view = scrollPane.getViewport().getView();
+ return view;
+ }
+
+ private void addDockedWindow(final Component pOldMap, final Component pNewMap) {
+ final View viewFrame = viewSerializer.newDockedView(pNewMap, createTitle(pNewMap));
+ addDockedView(pOldMap != null ? getContainingDockedWindow(pOldMap) : null, viewFrame);
+ }
+
+ public void afterViewClose(final Component pOldMapView) {
+ for (int i = 0; i < mapViews.size(); ++i) {
+ if (mapViews.get(i) == pOldMapView) {
+ mPaneSelectionUpdate = false;
+ getContainingDockedWindow(pOldMapView).close();
+ mapViews.remove(i);
+ mPaneSelectionUpdate = true;
+ rootWindow.repaint();
+ return;
+ }
+ }
+ }
+
+ public void afterViewCreated(final Component mapView) {
+ }
+
+ public void beforeViewChange(final Component pOldMapView, final Component pNewMapView) {
+ }
+
+ private void viewSelectionChanged(final Component mapView) {
+ if (!mPaneSelectionUpdate) {
+ return;
+ }
+ Controller controller = Controller.getCurrentController();
+ if (mapView != controller.getMapViewManager().getMapViewComponent()) {
+ controller.getMapViewManager().changeToMapView(mapView.getName());
+ }
+ }
+
+ public JComponent getMapPane() {
+ return rootWindow;
+ }
+
+ public void saveLayout(){
+ ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+ try {
+ ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
+ rootWindow.write(objectStream);
+ objectStream.close();
+ String encodedBytes = Base64.encodeBase64String(byteStream.toByteArray());
+ ResourceController.getResourceController().setProperty(OPENED_NOW, encodedBytes);
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void loadLayout(){
+ String encodedBytes = ResourceController.getResourceController().getProperty(OPENED_NOW, null);
+ if(encodedBytes != null){
+ byte[] bytes = Base64.decodeBase64(encodedBytes);
+ ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
+ try {
+ loadingLayoutFromObjectInpusStream = true;
+ rootWindow.read(new ObjectInputStream(byteStream));
+ }
+ catch (Exception e) {
+ LogUtils.severe(e);
+ try {
+ rootWindow.read(new ObjectInputStream(new ByteArrayInputStream(emptyConfigurations)));
+ }
+ catch (IOException e1) {
+ }
+ }
+ finally{
+ viewSerializer.removeDummyViews();
+ loadingLayoutFromObjectInpusStream = false;
+ }
+ rootWindow.getWindowBar(Direction.DOWN).setEnabled(false);
+ }
+ }
+
+ public void focusMapViewLater(final MapView mapView) {
+ Timer timer = new Timer(40, new ActionListener() {
+ int retryCount = 5;
+ public void actionPerformed(final ActionEvent event) {
+ final Timer eventTimer = (Timer)event.getSource();
+ focusMapLater(mapView, eventTimer);
+ }
+ private void focusMapLater(final MapView mapView, final Timer eventTimer) {
+ if(mapView.isShowing() && Controller.getCurrentController().getMapViewManager().getMapViewComponent() == mapView){
+ final NodeView selected = mapView.getSelected();
+ if(selected != null){
+ final Frame frame = JOptionPane.getFrameForComponent(mapView);
+ if (frame.isFocused())
+ selected.requestFocusInWindow();
+ else
+ frame.addWindowFocusListener(new WindowAdapter() {
+ @Override
+ public void windowGainedFocus(WindowEvent e) {
+ frame.removeWindowFocusListener(this);
+ selected.requestFocusInWindow();
+ retryCount = 2;
+ eventTimer.start();
+ }
+ });
+ }
+ }
+ if(retryCount > 1){
+ retryCount--;
+ eventTimer.start();
+ }
+ }
+ });
+ timer.setRepeats(false);
+ timer.start();
+ }
+
+ public void setTitle() {
+ if(loadingLayoutFromObjectInpusStream)
+ return;
+ for (Component mapViewComponent: mapViews) {
+ if (mapViewComponent instanceof MapView ) {
+ String title = createTitle(mapViewComponent);
+ View containingDockedWindow = getContainingDockedWindow(mapViewComponent);
+ containingDockedWindow.getViewProperties().setTitle(title);
+ }
+ }
+ }
+
+ private String createTitle(Component mapViewComponent) {
+ MapView mapView = (MapView)mapViewComponent;
+ String name = mapView.getName();
+ String title;
+ if(mapView.getModel().isSaved() || mapView.getModel().isReadOnly())
+ title = name;
+ else
+ title = name + " *";
+ return title;
+ }
+
+ public void selectNextMapView() {
+ selectMap(1);
+ }
+
+ public void selectPreviousMapView() {
+ selectMap(-1);
+ }
+
+ private void selectMap(final int tabIndexChange) {
+ final Controller controller = Controller.getCurrentController();
+ MapView mapView = (MapView)controller.getMapViewManager().getMapViewComponent();
+ if(mapView != null){
+ AbstractTabWindow tabWindow = (AbstractTabWindow) SwingUtilities.getAncestorOfClass(AbstractTabWindow.class, mapView);
+ if(tabWindow != null){
+ final DockingWindow selectedWindow = tabWindow.getSelectedWindow();
+ final int childWindowIndex = tabWindow.getChildWindowIndex(selectedWindow);
+ final int childWindowCount = tabWindow.getChildWindowCount();
+ final int nextWindowIndex = (childWindowIndex + childWindowCount + tabIndexChange) % childWindowCount;
+ final View nextWindow = (View) tabWindow.getChildWindow(nextWindowIndex);
+ final Component nextMapView = getContainedMapView(nextWindow);
+ Controller.getCurrentController().getMapViewManager().changeToMapView(nextMapView);
+ }
+ }
+ }
+
+ private void setTabAreaVisiblePolicy(final TabWindow window) {
+ setTabAreaPolicy(window,
+ window.getWindowParent() == rootWindow ?
+ TabAreaVisiblePolicy.MORE_THAN_ONE_TAB :
+ TabAreaVisiblePolicy.ALWAYS);
+ }
+
+ private void setTabAreaPolicy(TabWindow window, TabAreaVisiblePolicy tabAreaVisiblePolicy) {
+ final TabAreaProperties tabAreaProperties = window.getTabWindowProperties().getTabbedPanelProperties().getTabAreaProperties();
+ tabAreaProperties.setTabAreaVisiblePolicy(tabAreaVisiblePolicy);
+ }
+
+ public void setTabAreaVisiblePolicy(JFrame frame){
+ DockingWindow window = (DockingWindow) (JOptionPane.getFrameForComponent(rootWindow) == frame ? rootWindow : frame.getContentPane().getComponent(0));
+ setTabAreaVisiblePolicies(window);
+ }
+
+ private void setTabAreaVisiblePolicies(DockingWindow parentWindow) {
+ for(int i = 0; i < parentWindow.getChildWindowCount(); i++){
+ final DockingWindow window = parentWindow.getChildWindow(i);
+ if(window instanceof TabWindow)
+ setTabAreaVisiblePolicy((TabWindow) window);
+ if (!(window instanceof FloatingWindow))
+ setTabAreaVisiblePolicies(window);
+ }
+ }
+
+ public void setTabAreaInvisiblePolicy(JFrame frame){
+ DockingWindow window = (DockingWindow) (JOptionPane.getFrameForComponent(rootWindow) == frame ? rootWindow : frame.getContentPane().getComponent(0));
+ setTabAreaInvisiblePolicies(window);
+ }
+
+ private void setTabAreaInvisiblePolicies(DockingWindow parentWindow) {
+ for(int i = 0; i < parentWindow.getChildWindowCount(); i++){
+ final DockingWindow window = parentWindow.getChildWindow(i);
+ if(window instanceof TabWindow)
+ setTabAreaPolicy((TabWindow) window, TabAreaVisiblePolicy.NEVER);
+ if (!(window instanceof FloatingWindow))
+ setTabAreaInvisiblePolicies(window);
+ }
+ }
+
+ public List<? extends Component> getMapViewVector() {
+ final ArrayList<Component> orderedMapViews = new ArrayList<Component>(mapViews.size());
+ addMapViews(orderedMapViews, rootWindow);
+ return orderedMapViews;
+ }
+
+ private void addMapViews(ArrayList<Component> orderedMapViews, DockingWindow window) {
+ if(window instanceof View)
+ orderedMapViews.add(getContainedMapView((View) window));
+ else
+ for (int windowIndex = 0; windowIndex < window.getChildWindowCount(); windowIndex++)
+ addMapViews(orderedMapViews, window.getChildWindow(windowIndex));
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/MapViewSerializer.java b/freeplane/src/main/java/org/freeplane/main/application/MapViewSerializer.java
new file mode 100644
index 0000000..4399ef1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/MapViewSerializer.java
@@ -0,0 +1,126 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.Component;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import javax.swing.JPanel;
+
+import net.infonode.docking.View;
+import net.infonode.docking.ViewSerializer;
+
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.mindmapmode.DocuMapAttribute;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.MapViewScrollPane;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.04.2013
+ */
+class MapViewSerializer implements ViewSerializer {
+ private Collection<View> viewsToBeRemoved = new ArrayList<View>();
+
+ public void writeView(View view, ObjectOutputStream out) throws IOException {
+ if(view.isDisplayable()) {
+ Component component = MapViewDockingWindows.getContainedMapView(view);
+ if (component instanceof MapView) {
+ MapView mapView = (MapView) component;
+ if(mapView.getModeController().getModeName().equals(MModeController.MODENAME)
+ && ! mapView.getModel().containsExtension(DocuMapAttribute.class)){
+ out.writeBoolean(true);
+ out.writeUTF(mapView.getModeController().getModeName());
+ out.writeObject(mapView.getModel().getURL());
+ return;
+ }
+ }
+ }
+ out.writeBoolean(false);
+ }
+
+ public View readView(ObjectInputStream in) throws IOException {
+ try {
+ if (in.readBoolean()){
+ String modeName = in.readUTF();
+ URL mapUrl = (URL) in.readObject();
+ if(mapUrl == null)
+ return newViewToBeRemoved();
+ Controller controller = Controller.getCurrentController();
+ controller.selectMode(modeName);
+ ModeController modeController = Controller.getCurrentModeController();
+ MapController mapController = modeController.getMapController();
+ boolean newMapLoaded = mapController.newMap(mapUrl);
+ if (!newMapLoaded){
+ MapModel map = controller.getMap();
+ if(map.getURL().equals(mapUrl)){
+ mapController.newMapView(map);
+ }
+ }
+ Component mapViewComponent = controller.getMapViewManager().getMapViewComponent();
+ if(mapViewComponent.getParent() == null) {
+ final Component pNewMap = mapViewComponent;
+ return newDockedView(pNewMap, pNewMap.getName());
+ }
+ else
+ return newViewToBeRemoved();
+ }
+ return newViewToBeRemoved();
+ }
+ catch (Exception e) {
+ return newViewToBeRemoved();
+ }
+ }
+
+ private View newViewToBeRemoved() {
+ View view = new View("", null, new JPanel());
+ viewsToBeRemoved.add(view);
+ return view;
+ }
+
+ protected View newDockedView(final Component pNewMap, final String title) {
+ if(pNewMap.getParent() != null)
+ return null;
+ MapViewScrollPane mapViewScrollPane = new MapViewScrollPane();
+ mapViewScrollPane.getViewport().setView(pNewMap);
+ @SuppressWarnings("serial")
+ final View viewFrame = new ConnectedToMenuView(title, null, mapViewScrollPane);
+ return viewFrame;
+ }
+
+ public void removeDummyViews() {
+ for(View view : viewsToBeRemoved)
+ view.close();
+ viewsToBeRemoved.clear();
+ }
+
+
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/MenuKeyProcessor.java b/freeplane/src/main/java/org/freeplane/main/application/MenuKeyProcessor.java
new file mode 100644
index 0000000..2ac0b0a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/MenuKeyProcessor.java
@@ -0,0 +1,32 @@
+package org.freeplane.main.application;
+
+import static java.awt.event.KeyEvent.VK_ALT;
+import static java.awt.event.KeyEvent.VK_CONTROL;
+import static java.awt.event.KeyEvent.VK_META;
+import static java.awt.event.KeyEvent.VK_SHIFT;
+import static java.awt.event.KeyEvent.VK_WINDOWS;
+
+import java.awt.event.KeyEvent;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.JComponent;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.features.mode.Controller;
+
+public class MenuKeyProcessor {
+ static final MenuKeyProcessor INSTANCE = new MenuKeyProcessor();
+ public boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
+ if(containsModifierKeyCode(ks))
+ return false;
+ final FreeplaneMenuBar freeplaneMenuBar = Controller.getCurrentController().getViewController()
+ .getFreeplaneMenuBar();
+ return freeplaneMenuBar.processKeyBinding(ks, e, JComponent.WHEN_IN_FOCUSED_WINDOW, pressed);
+ }
+ private static final List<Integer> modifierKeyCodes = Arrays.asList(VK_CONTROL, VK_ALT, VK_SHIFT, VK_META, VK_WINDOWS);
+ private boolean containsModifierKeyCode(final KeyStroke ks) {
+ return modifierKeyCodes.contains(ks.getKeyCode());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/NavigationNextMapAction.java b/freeplane/src/main/java/org/freeplane/main/application/NavigationNextMapAction.java
new file mode 100644
index 0000000..5b42e8d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/NavigationNextMapAction.java
@@ -0,0 +1,41 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+
+class NavigationNextMapAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ NavigationNextMapAction() {
+ super("NavigationNextMapAction");
+ setEnabled(false);
+ }
+
+ public void actionPerformed(final ActionEvent event) {
+ Controller.getCurrentController().getViewController().nextMapView();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/NavigationPreviousMapAction.java b/freeplane/src/main/java/org/freeplane/main/application/NavigationPreviousMapAction.java
new file mode 100644
index 0000000..1952bfd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/NavigationPreviousMapAction.java
@@ -0,0 +1,41 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+
+class NavigationPreviousMapAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ NavigationPreviousMapAction() {
+ super("NavigationPreviousMapAction");
+ setEnabled(false);
+ }
+
+ public void actionPerformed(final ActionEvent event) {
+ Controller.getCurrentController().getViewController().previousMapView();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/OpenLastOpenedAction.java b/freeplane/src/main/java/org/freeplane/main/application/OpenLastOpenedAction.java
new file mode 100644
index 0000000..547a3de
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/OpenLastOpenedAction.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.main.application.LastOpenedList.RecentFile;
+
+class OpenLastOpenedAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+ final private LastOpenedList list;
+ final private RecentFile recentFile;
+
+ public OpenLastOpenedAction(final int i, final LastOpenedList list, RecentFile recentFile) {
+ super("OpenLastOpenedAction_" + i, null, null);
+ this.list = list;
+ this.recentFile = recentFile;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ list.safeOpen(recentFile);
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/SingleInstanceManager.java b/freeplane/src/main/java/org/freeplane/main/application/SingleInstanceManager.java
new file mode 100644
index 0000000..61040c2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/SingleInstanceManager.java
@@ -0,0 +1,206 @@
+package org.freeplane.main.application;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.io.RandomAccessFile;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.UnknownHostException;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.main.application.CommandLineParser.Options;
+
+public class SingleInstanceManager {
+ private File lockFile = new File(Compat.getApplicationUserDirectory(), "single_instance.lock");
+ private boolean isSingleInstanceMode;
+ private boolean isSingleInstanceForceMode;
+ private Integer port;
+ private boolean isSlave;
+ private boolean isMasterPresent;
+ final private FreeplaneStarter starter;
+
+ public SingleInstanceManager(FreeplaneStarter starter) {
+ this.starter = starter;
+ final ResourceController resourceController = starter.getResourceController();
+ isSingleInstanceMode = resourceController.getBooleanProperty("single_instance");
+ isSingleInstanceForceMode = resourceController.getBooleanProperty("single_instance_force");
+ }
+
+ public void start(String[] args) {
+ final Options options = CommandLineParser.parse(args, false);
+ final String[] filesToLoad = options.getFilesToOpenAsArray();
+ if (isSingleInstanceMode && !options.hasMenuItemsToExecute()) {
+ initLockFile();
+ if (filesToLoad.length == 0 && !isSingleInstanceForceMode && checkIsMasterPresent()) {
+ isMasterPresent = true;
+ startStandAlone(filesToLoad);
+ }
+ else if (!startAsSlave(filesToLoad)) {
+ if (!startAsMaster(filesToLoad)) {
+ startStandAlone(filesToLoad);
+ }
+ }
+ }
+ else {
+ startStandAlone(filesToLoad);
+ }
+ }
+
+ private boolean checkIsMasterPresent() {
+ if (port == null)
+ return false;
+ try {
+ Socket clientSocket = new Socket("localhost", port);
+ clientSocket.close();
+ LogUtils.info("master is present.");
+ return true;
+ }
+ catch (Exception e) {
+ // this is only a check - we'll log later
+ return false;
+ }
+ }
+
+ public boolean isSlave() {
+ return isSlave;
+ }
+
+ public boolean isMasterPresent() {
+ return isSlave || isMasterPresent;
+ }
+
+ private boolean startAsSlave(String[] filesToLoad) {
+ if (port != null) {
+ isSlave = openFilesInMaster(filesToLoad);
+ return isSlave;
+ }
+ return false;
+ }
+
+ private boolean openFilesInMaster(String[] filesToLoad) {
+ if (port == null)
+ throw new IllegalArgumentException("port may not be null");
+ try {
+ Socket clientSocket = new Socket("localhost", port);
+ OutputStream out = clientSocket.getOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(out);
+ oos.writeObject(filesToLoad);
+ oos.close();
+ clientSocket.close();
+ LogUtils.info("Successfully notified first instance.");
+ return true;
+ }
+ catch (UnknownHostException e) {
+ LogUtils.severe(e.getMessage(), e);
+ return false;
+ }
+ catch (IOException e) {
+ LogUtils.warn("Error connecting to existing instance (stale lockfiles may cause this).", e);
+ return false;
+ }
+ }
+
+ private boolean startAsMaster(String[] filesToLoad) {
+ try {
+ // port number 0: use any free socket
+ final ServerSocket socket = new ServerSocket(0, 10);
+ port = socket.getLocalPort();
+ LogUtils.info("Listening for application instances on socket " + port);
+ createLockFile();
+ Thread filesToOpenListenerThread = new Thread(new Runnable() {
+ public void run() {
+ boolean socketClosed = false;
+ while (!socketClosed) {
+ if (socket.isClosed()) {
+ socketClosed = true;
+ }
+ else {
+ try {
+ Socket client = socket.accept();
+ ObjectInputStream in = new ObjectInputStream(client.getInputStream());
+ String[] filesToLoadForClient = (String[]) in.readObject();
+ LogUtils.info("opening '" + StringUtils.join(filesToLoadForClient, "', '")
+ + "' for client");
+ in.close();
+ client.close();
+ starter.loadMapsLater(filesToLoadForClient);
+ }
+ catch (SecurityException e) {
+ // this happens when the master is currently executing a script
+ LogUtils.warn("master is currently not accepting new files. Try again later", e);
+ }
+ catch (IOException e) {
+ socketClosed = true;
+ }
+ catch (ClassNotFoundException e) {
+ // this should never happen
+ throw new RuntimeException("implementation error", e);
+ }
+ }
+ }
+ }
+ });
+ filesToOpenListenerThread.start();
+ return true;
+ // listen
+ }
+ catch (UnknownHostException e) {
+ LogUtils.severe(e.getMessage(), e);
+ return false;
+ }
+ catch (IOException e) {
+ LogUtils.severe(e.getMessage(), e);
+ return false;
+ }
+ }
+
+ private void createLockFile() throws IOException {
+ final RandomAccessFile randomAccessLockFile = new RandomAccessFile(lockFile, "rwd");
+ randomAccessLockFile.writeBytes(port.toString());
+ randomAccessLockFile.close();
+ Runtime.getRuntime().addShutdownHook(new Thread() {
+ public void run() {
+ try {
+ lockFile.delete();
+ }
+ catch (Exception e) {
+ error("Unable to remove lock file: " + lockFile, e);
+ }
+ }
+ });
+ }
+
+ private void startStandAlone(String[] filesToLoad) {
+ // do nothing - whatever is needed will happen later
+ }
+
+ /**
+ * opens the lock file and tries to get a lock for it.
+ * If it is locked already then try to read the port number from it.
+ */
+ private boolean initLockFile() {
+ try {
+ if (lockFile.exists()) {
+ // slave: read the port from the file
+ final RandomAccessFile randomAccessLockFile = new RandomAccessFile(lockFile, "r");
+ String portAsString = randomAccessLockFile.readLine().trim();
+ randomAccessLockFile.close();
+ port = Integer.parseInt(portAsString);
+ }
+ }
+ catch (Exception e) {
+ error("Unable to create and/or lock file: " + lockFile, e);
+ }
+ return false;
+ }
+
+ private void error(String message, Exception e) {
+ LogUtils.severe(message, e);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/SplitPaneLayoutManagerDecorator.java b/freeplane/src/main/java/org/freeplane/main/application/SplitPaneLayoutManagerDecorator.java
new file mode 100644
index 0000000..d42db49
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/SplitPaneLayoutManagerDecorator.java
@@ -0,0 +1,85 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.LayoutManager;
+
+import javax.swing.JSplitPane;
+
+/**
+ * @author Dimitry Polivaev
+ * Dec 26, 2010
+ */
+final class SplitPaneLayoutManagerDecorator implements LayoutManager {
+ private final LayoutManager lm;
+
+ SplitPaneLayoutManagerDecorator(LayoutManager lm) {
+ this.lm = lm;
+ }
+
+ public void removeLayoutComponent(Component comp) {
+ lm.removeLayoutComponent(comp);
+ }
+
+ public Dimension preferredLayoutSize(Container parent) {
+ final JSplitPane splitPane = (JSplitPane) parent;
+ if(isDividerRequired(splitPane))
+ return lm.preferredLayoutSize(parent);
+ return splitPane.getLeftComponent().getPreferredSize();
+ }
+
+ public Dimension minimumLayoutSize(Container parent) {
+ final JSplitPane splitPane = (JSplitPane) parent;
+ if(isDividerRequired(splitPane))
+ return lm.minimumLayoutSize(parent);
+ return splitPane.getLeftComponent().getMinimumSize();
+ }
+
+ public void layoutContainer(Container parent) {
+ final JSplitPane splitPane = (JSplitPane) parent;
+ if(isDividerRequired(splitPane)){
+ lm.layoutContainer(parent);
+ return;
+ }
+ final Component leftComponent = splitPane.getLeftComponent();
+ for(int i = 0; i < splitPane.getComponentCount(); i++){
+ final Component component = splitPane.getComponent(i);
+ if(component.equals(leftComponent)){
+ component.setBounds(0, 0, splitPane.getWidth(), splitPane.getHeight());
+ }
+ else{
+ component.setBounds(0, 0, 0, 0);
+ }
+ }
+ }
+
+ private boolean isDividerRequired(final JSplitPane splitPane) {
+ final Component rightComponent = splitPane.getRightComponent();
+ final boolean rightComponentVisible = rightComponent != null&& rightComponent.isVisible();
+ return rightComponentVisible;
+ }
+
+ public void addLayoutComponent(String name, Component comp) {
+ lm.addLayoutComponent(name, comp);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/application/UserPropertiesUpdater.java b/freeplane/src/main/java/org/freeplane/main/application/UserPropertiesUpdater.java
new file mode 100644
index 0000000..b3393b8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/UserPropertiesUpdater.java
@@ -0,0 +1,115 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+import org.freeplane.core.util.Compat;
+
+/**
+ * @author Dimitry Polivaev
+ * Nov 1, 2010
+ */
+public class UserPropertiesUpdater {
+ private static final String ORG_FREEPLANE_OLD_USERFPDIR = "org.freeplane.old_userfpdir";
+
+ void importOldProperties(){
+ final File userPreferencesFile = ApplicationResourceController.getUserPreferencesFile();
+ if(userPreferencesFile.exists()){
+ return;
+ }
+ copyUserFilesFromPreviousVersionTo(userPreferencesFile.getParentFile());
+ if(userPreferencesFile.exists()){
+ removeVersionSpecificProperties(userPreferencesFile);
+ return;
+ }
+ }
+
+ private void copyUserFilesFromPreviousVersionTo(File targetDirectory) {
+ final File parentDirectory = targetDirectory.getParentFile();
+ final String previousDirName = Compat.PREVIOUS_VERSION_DIR_NAME;
+ final File sourceDirectory;
+ String old_userfpdir = System.getProperty(ORG_FREEPLANE_OLD_USERFPDIR);
+ if (isDefined(old_userfpdir))
+ sourceDirectory = new File(old_userfpdir, previousDirName);
+ else
+ sourceDirectory = new File(parentDirectory, previousDirName);
+ if (sourceDirectory.exists() && !sourceDirectory.getAbsolutePath().equals(targetDirectory.getAbsolutePath())) {
+ try {
+ parentDirectory.mkdirs();
+ org.apache.commons.io.FileUtils.copyDirectory(sourceDirectory, targetDirectory);
+ }
+ catch (IOException e) {
+ }
+ return;
+ }
+ }
+
+ private boolean isDefined(String old_userfpdir) {
+ return old_userfpdir != null;
+ }
+
+ private void removeVersionSpecificProperties(File userPreferencesFile) {
+ try {
+ Properties userProp = loadProperties(userPreferencesFile);
+ for(String name : new String[]{
+ "lastOpened_1.0.20",
+ "openedNow_1.0.20",
+ "openedNow_1.3.04",
+ "browse_url_storage",
+ "single_backup_directory_path",
+ "standard_template"})
+ userProp.remove(name);
+
+ saveProperties(userProp, userPreferencesFile);
+ }
+ catch (IOException e) {
+ }
+ }
+
+ Properties loadProperties(File userPreferencesFile) throws IOException {
+ FileInputStream inputStream = null;
+ Properties userProp = new Properties();
+ try{
+ inputStream = new FileInputStream(userPreferencesFile);
+ userProp.load(inputStream);
+ }
+ finally {
+ org.freeplane.core.util.FileUtils.silentlyClose(inputStream);
+ }
+ return userProp;
+ }
+
+ void saveProperties(Properties userProp, File userPreferencesFile) throws IOException {
+ FileOutputStream outputStream = null;
+ try{
+ outputStream = new FileOutputStream(userPreferencesFile);
+ userProp.store(outputStream, null);
+ }
+ finally {
+ org.freeplane.core.util.FileUtils.silentlyClose(outputStream);
+ }
+ }
+}
+
diff --git a/freeplane/src/main/java/org/freeplane/main/application/protocols/freeplaneresource/Handler.java b/freeplane/src/main/java/org/freeplane/main/application/protocols/freeplaneresource/Handler.java
new file mode 100644
index 0000000..23f9bc7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/application/protocols/freeplaneresource/Handler.java
@@ -0,0 +1,226 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.application.protocols.freeplaneresource;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.security.Permission;
+import java.util.List;
+import java.util.Map;
+
+import org.freeplane.core.resources.ResourceController;
+
+/** A {@link URLStreamHandler} that handles resources on the classpath. */
+public class Handler extends URLStreamHandler {
+
+ public Handler() {
+ }
+ public Handler(ClassLoader classLoader) {
+ }
+
+ @Override
+ public URLConnection openConnection(URL url) throws IOException {
+ final URL resourceUrl = ResourceController.getResourceController().getResource(url.getPath());
+ final URLConnection connection = resourceUrl.openConnection();
+ return new WrappedConnection(url, connection);
+ }
+}
+
+class WrappedConnection extends URLConnection{
+ private URLConnection connection;
+
+ public WrappedConnection(URL url, URLConnection connection) {
+ super(url);
+ this.connection = connection;
+ }
+
+ public int hashCode() {
+ return connection.hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ return connection.equals(obj);
+ }
+
+ public void connect() throws IOException {
+ connection.connect();
+ }
+
+ public void setConnectTimeout(int timeout) {
+ connection.setConnectTimeout(timeout);
+ }
+
+ public int getConnectTimeout() {
+ return connection.getConnectTimeout();
+ }
+
+ public void setReadTimeout(int timeout) {
+ connection.setReadTimeout(timeout);
+ }
+
+ public int getReadTimeout() {
+ return connection.getReadTimeout();
+ }
+
+ public int getContentLength() {
+ return connection.getContentLength();
+ }
+
+ public long getContentLengthLong() {
+ return connection.getContentLengthLong();
+ }
+
+ public String getContentType() {
+ return connection.getContentType();
+ }
+
+ public String getContentEncoding() {
+ return connection.getContentEncoding();
+ }
+
+ public long getExpiration() {
+ return connection.getExpiration();
+ }
+
+ public long getDate() {
+ return connection.getDate();
+ }
+
+ public long getLastModified() {
+ return connection.getLastModified();
+ }
+
+ public String getHeaderField(String name) {
+ return connection.getHeaderField(name);
+ }
+
+ public Map<String, List<String>> getHeaderFields() {
+ return connection.getHeaderFields();
+ }
+
+ public int getHeaderFieldInt(String name, int Default) {
+ return connection.getHeaderFieldInt(name, Default);
+ }
+
+ public long getHeaderFieldLong(String name, long Default) {
+ return connection.getHeaderFieldLong(name, Default);
+ }
+
+ public long getHeaderFieldDate(String name, long Default) {
+ return connection.getHeaderFieldDate(name, Default);
+ }
+
+ public String getHeaderFieldKey(int n) {
+ return connection.getHeaderFieldKey(n);
+ }
+
+ public String getHeaderField(int n) {
+ return connection.getHeaderField(n);
+ }
+
+ public Object getContent() throws IOException {
+ return connection.getContent();
+ }
+
+ public Object getContent(Class[] classes) throws IOException {
+ return connection.getContent(classes);
+ }
+
+ public Permission getPermission() throws IOException {
+ return connection.getPermission();
+ }
+
+ public InputStream getInputStream() throws IOException {
+ return connection.getInputStream();
+ }
+
+ public OutputStream getOutputStream() throws IOException {
+ return connection.getOutputStream();
+ }
+
+ public void setDoInput(boolean doinput) {
+ connection.setDoInput(doinput);
+ }
+
+ public boolean getDoInput() {
+ return connection.getDoInput();
+ }
+
+ public void setDoOutput(boolean dooutput) {
+ connection.setDoOutput(dooutput);
+ }
+
+ public boolean getDoOutput() {
+ return connection.getDoOutput();
+ }
+
+ public void setAllowUserInteraction(boolean allowuserinteraction) {
+ connection.setAllowUserInteraction(allowuserinteraction);
+ }
+
+ public boolean getAllowUserInteraction() {
+ return connection.getAllowUserInteraction();
+ }
+
+ public void setUseCaches(boolean usecaches) {
+ connection.setUseCaches(usecaches);
+ }
+
+ public boolean getUseCaches() {
+ return connection.getUseCaches();
+ }
+
+ public void setIfModifiedSince(long ifmodifiedsince) {
+ connection.setIfModifiedSince(ifmodifiedsince);
+ }
+
+ public long getIfModifiedSince() {
+ return connection.getIfModifiedSince();
+ }
+
+ public boolean getDefaultUseCaches() {
+ return connection.getDefaultUseCaches();
+ }
+
+ public void setDefaultUseCaches(boolean defaultusecaches) {
+ connection.setDefaultUseCaches(defaultusecaches);
+ }
+
+ public void setRequestProperty(String key, String value) {
+ connection.setRequestProperty(key, value);
+ }
+
+ public void addRequestProperty(String key, String value) {
+ connection.addRequestProperty(key, value);
+ }
+
+ public String getRequestProperty(String key) {
+ return connection.getRequestProperty(key);
+ }
+
+ public Map<String, List<String>> getRequestProperties() {
+ return connection.getRequestProperties();
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/browsemode/BModeControllerFactory.java b/freeplane/src/main/java/org/freeplane/main/browsemode/BModeControllerFactory.java
new file mode 100644
index 0000000..c6be8e2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/browsemode/BModeControllerFactory.java
@@ -0,0 +1,112 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.browsemode;
+
+import java.security.AccessControlException;
+
+import javax.swing.JPopupMenu;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.ui.components.FreeplaneToolBar;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.encrypt.EncryptionController;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.FoldingController;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.mapio.MapIO;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.browsemode.BModeController;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.styles.AutomaticLayoutController;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.features.ui.UIComponentVisibilityDispatcher;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.view.swing.features.filepreview.ViewerController;
+import org.freeplane.view.swing.ui.UserInputListenerFactory;
+
+/**
+ * @author Dimitry Polivaev 24.11.2008
+ */
+public class BModeControllerFactory {
+ private static BModeController modeController;
+
+ static public BModeController createModeController() {
+ final Controller controller = Controller.getCurrentController();
+ modeController = new BModeController(controller);
+ final UserInputListenerFactory userInputListenerFactory = new UserInputListenerFactory(modeController);
+ modeController.setUserInputListenerFactory(userInputListenerFactory);
+ controller.addModeController(modeController);
+ controller.selectModeForBuild(modeController);
+ new MapController(modeController);
+ IconController.install(new IconController(modeController));
+ UrlManager.install(new UrlManager());
+ MapIO.install(modeController);
+ AttributeController.install(new AttributeController(modeController));
+ NodeStyleController.install(new NodeStyleController(modeController));
+ EdgeController.install(new EdgeController(modeController));
+ CloudController.install(new CloudController(modeController));
+ NoteController.install(new NoteController());
+ TextController.install(new TextController(modeController));
+ LinkController.install(new LinkController(modeController));
+ LogicalStyleController.install(new LogicalStyleController(modeController));
+ try {
+ ClipboardController.install(new ClipboardController());
+ }
+ catch (final AccessControlException e) {
+ LogUtils.warn("can not access system clipboard, clipboard controller disabled");
+ }
+ LocationController.install(new LocationController());
+ SummaryNode.install();
+ FreeNode.install();
+ MapStyle.install(true);
+ final BToolbarContributor toolbarContributor = new BToolbarContributor();
+ modeController.addUiBuilder(Phase.ACTIONS, "main_toolbar_url", toolbarContributor);
+ controller.getMapViewManager().addMapViewChangeListener(toolbarContributor);
+ userInputListenerFactory.setNodePopupMenu(new JPopupMenu());
+ final FreeplaneToolBar toolBar = new FreeplaneToolBar("main_toolbar", SwingConstants.HORIZONTAL);
+ FrameController frameController = (FrameController) controller.getViewController();
+ UIComponentVisibilityDispatcher.install(frameController, toolBar, "toolbarVisible");
+ userInputListenerFactory.addToolBar("/main_toolbar", ViewController.TOP, toolBar);
+ userInputListenerFactory.addToolBar("/filter_toolbar", FilterController.TOOLBAR_SIDE, FilterController.getController(
+ controller).getFilterToolbar());
+ userInputListenerFactory.addToolBar("/status", ViewController.BOTTOM, controller.getViewController()
+ .getStatusBar());
+ FoldingController.install(new FoldingController());
+ new ViewerController();
+ EncryptionController.install(new EncryptionController(modeController));
+ new AutomaticLayoutController();
+ return modeController;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/browsemode/BToolbarContributor.java b/freeplane/src/main/java/org/freeplane/main/browsemode/BToolbarContributor.java
new file mode 100644
index 0000000..684a434
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/browsemode/BToolbarContributor.java
@@ -0,0 +1,104 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.browsemode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.net.URL;
+
+import javax.swing.JLabel;
+
+import org.freeplane.core.ui.components.PersistentEditableComboBox;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.ui.IMapViewManager;
+
+class BToolbarContributor implements EntryVisitor, IMapViewChangeListener {
+ private static final String BROWSE_URL_STORAGE_KEY = "browse_url_storage";
+// final private ModeController modeController;
+ private PersistentEditableComboBox urlfield = null;
+
+ public BToolbarContributor() {
+ urlfield = new PersistentEditableComboBox(BROWSE_URL_STORAGE_KEY, 20);
+ urlfield.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent e) {
+ final String urlText = urlfield.getText();
+ if ("".equals(urlText) || e.getActionCommand().equals("comboBoxEdited")) {
+ return;
+ }
+ try {
+ Controller.getCurrentModeController().getMapController().newMap(new URL(urlText));
+ }
+ catch (final Exception e1) {
+ LogUtils.warn(e1);
+ }
+ }
+ });
+ }
+
+ public void afterViewChange(final Component oldView, final Component newView) {
+ if (newView == null) {
+ return;
+ }
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ mapViewManager.getModeController(newView);
+ final MapModel map = mapViewManager.getModel(newView);
+ final URL url = map.getURL();
+ if (url == null) {
+ return;
+ }
+ setURLField(url.toString());
+ }
+
+ public void afterViewClose(final Component oldView) {
+ }
+
+ public void afterViewCreated(final Component mapView) {
+ }
+
+ public void beforeViewChange(final Component oldView, final Component newView) {
+ }
+
+ private void setURLField(final String text) {
+ urlfield.setText(text);
+ }
+
+ @Override
+ public void visit(Entry target) {
+ final EntryAccessor entryAccessor = new EntryAccessor();
+ final Entry label = new Entry();
+ target.addChild(label);
+ entryAccessor.setComponent(label, new JLabel("URL:"));
+ final Entry field = new Entry();
+ target.addChild(field);
+ entryAccessor.setComponent(field, urlfield);
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/filemode/FModeControllerFactory.java b/freeplane/src/main/java/org/freeplane/main/filemode/FModeControllerFactory.java
new file mode 100644
index 0000000..468b195
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/filemode/FModeControllerFactory.java
@@ -0,0 +1,97 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.filemode;
+
+import javax.swing.JPopupMenu;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.ui.components.FreeplaneToolBar;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.filemode.CenterAction;
+import org.freeplane.features.map.filemode.FMapController;
+import org.freeplane.features.map.filemode.OpenPathAction;
+import org.freeplane.features.mapio.MapIO;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.IPropertyHandler;
+import org.freeplane.features.mode.filemode.FModeController;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.features.ui.UIComponentVisibilityDispatcher;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.view.swing.features.nodehistory.NodeHistory;
+import org.freeplane.view.swing.ui.UserInputListenerFactory;
+
+/**
+ * @author Dimitry Polivaev 24.11.2008
+ */
+public class FModeControllerFactory {
+ static private FModeController modeController;
+
+ static public FModeController createModeController() {
+ final Controller controller = Controller.getCurrentController();
+ modeController = new FModeController(controller);
+ final UserInputListenerFactory userInputListenerFactory = new UserInputListenerFactory(modeController);
+ modeController.setUserInputListenerFactory(userInputListenerFactory);
+ controller.addModeController(modeController);
+ controller.selectModeForBuild(modeController);
+ new FMapController(modeController);
+ UrlManager.install(new UrlManager());
+ MapIO.install(modeController);
+ IconController.install(new IconController(modeController));
+ NodeStyleController.install(new NodeStyleController(modeController));
+ EdgeController.install(new EdgeController(modeController));
+ TextController.install(new TextController(modeController));
+ LinkController.install(new LinkController(modeController));
+ CloudController.install(new CloudController(modeController));
+ ClipboardController.install(new ClipboardController());
+ LocationController.install(new LocationController());
+ LogicalStyleController.install(new LogicalStyleController(modeController));
+ MapStyle.install(true);
+ NodeStyleController.getController().addShapeGetter(new Integer(0),
+ new IPropertyHandler<ShapeConfigurationModel, NodeModel>() {
+ public ShapeConfigurationModel getProperty(final NodeModel node, final ShapeConfigurationModel currentValue) {
+ return ShapeConfigurationModel.FORK;
+ }
+ });
+ modeController.addAction(new CenterAction());
+ modeController.addAction(new OpenPathAction());
+ userInputListenerFactory.setNodePopupMenu(new JPopupMenu());
+ final FreeplaneToolBar toolBar = new FreeplaneToolBar("main_toolbar", SwingConstants.HORIZONTAL);
+ FrameController frameController = (FrameController) controller.getViewController();
+ UIComponentVisibilityDispatcher.install(frameController, toolBar, "toolbarVisible");
+ userInputListenerFactory.addToolBar("/main_toolbar", ViewController.TOP, toolBar);
+ userInputListenerFactory.addToolBar("/filter_toolbar", FilterController.TOOLBAR_SIDE, FilterController.getCurrentFilterController().getFilterToolbar());
+ userInputListenerFactory.addToolBar("/status", ViewController.BOTTOM, controller.getViewController().getStatusBar());
+ NodeHistory.install(modeController);
+ return modeController;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/headlessmode/FreeplaneHeadlessStarter.java b/freeplane/src/main/java/org/freeplane/main/headlessmode/FreeplaneHeadlessStarter.java
new file mode 100644
index 0000000..7cbfd03
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/headlessmode/FreeplaneHeadlessStarter.java
@@ -0,0 +1,140 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.headlessmode;
+
+import java.util.Collections;
+import java.util.Set;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.attribute.ModelessAttributeController;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.ScannerController;
+import org.freeplane.features.help.HelpController;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.styles.LogicalStyleFilterController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.time.TimeController;
+import org.freeplane.main.application.ApplicationResourceController;
+import org.freeplane.main.application.FreeplaneGUIStarter;
+import org.freeplane.main.application.FreeplaneStarter;
+import org.freeplane.view.swing.features.nodehistory.NodeHistory;
+
+public class FreeplaneHeadlessStarter implements FreeplaneStarter {
+
+ private ApplicationResourceController applicationResourceController;
+// // private Controller controller;
+ /** allows to disable loadLastMap(s) if there already is a second instance running. */
+ public FreeplaneHeadlessStarter() {
+ super();
+ applicationResourceController = new ApplicationResourceController();
+ }
+
+ public void setDontLoadLastMaps() {
+ }
+
+ public Controller createController() {
+ try {
+ Controller controller = new Controller(applicationResourceController);
+ Controller.setCurrentController(controller);
+ applicationResourceController.init();
+ LogUtils.createLogger();
+ FreeplaneGUIStarter.showSysInfo();
+ final HeadlessMapViewController mapViewController = new HeadlessMapViewController();
+ controller.setMapViewManager(mapViewController);
+ controller.setViewController(new HeadlessUIController(controller, mapViewController, ""));
+ FilterController.install();
+ FormatController.install(new FormatController());
+ final ScannerController scannerController = new ScannerController();
+ ScannerController.install(scannerController);
+ scannerController.addParsersForStandardFormats();
+ ModelessAttributeController.install();
+ TextController.install();
+ TimeController.install();
+ LinkController.install();
+ IconController.install();
+ HelpController.install();
+ FilterController.getCurrentFilterController().getConditionFactory().addConditionController(70,
+ new LogicalStyleFilterController());
+ MapController.install();
+
+ NodeHistory.install(controller);
+ return controller;
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ public void createModeControllers(final Controller controller) {
+ HeadlessMModeControllerFactory.createModeController();
+ controller.getModeController(MModeController.MODENAME).getMapController().addMapChangeListener(
+ applicationResourceController.getLastOpenedList());
+ }
+
+ public void buildMenus(final Controller controller, final Set<String> plugins) {
+ }
+
+
+ public void createFrame(final String[] args) {
+ Controller controller = Controller.getCurrentController();
+ ModeController modeController = controller.getModeController(MModeController.MODENAME);
+ controller.selectModeForBuild(modeController);
+ }
+
+ /**
+ */
+ public void run(final String[] args) {
+ try {
+ if (null == System.getProperty("org.freeplane.core.dir.lib", null)) {
+ System.setProperty("org.freeplane.core.dir.lib", "/lib/");
+ }
+ final Controller controller = createController();
+ createModeControllers(controller);
+ FilterController.getController(controller).loadDefaultConditions();
+ final Set<String> emptySet = Collections.emptySet();
+ buildMenus(controller, emptySet);
+ createFrame(args);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ System.exit(1);
+ }
+ }
+
+ public void stop() {
+ }
+
+ public ResourceController getResourceController() {
+ return applicationResourceController;
+ }
+
+ public void loadMapsLater(String[] args) {
+ // TODO Auto-generated method stub
+
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/headlessmode/HeadlessMModeControllerFactory.java b/freeplane/src/main/java/org/freeplane/main/headlessmode/HeadlessMModeControllerFactory.java
new file mode 100644
index 0000000..54b3f71
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/headlessmode/HeadlessMModeControllerFactory.java
@@ -0,0 +1,148 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.headlessmode;
+
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.mindmapmode.MAttributeController;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.clipboard.mindmapmode.MClipboardController;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.cloud.mindmapmode.MCloudController;
+import org.freeplane.features.edge.AutomaticEdgeColorHook;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.edge.mindmapmode.MEdgeController;
+import org.freeplane.features.encrypt.mindmapmode.MEncryptionController;
+import org.freeplane.features.export.mindmapmode.ExportController;
+import org.freeplane.features.export.mindmapmode.ImportMindmanagerFiles;
+import org.freeplane.features.icon.HierarchicalIcons;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.mindmapmode.MIconController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.AlwaysUnfoldedNode;
+import org.freeplane.features.map.FoldingController;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.map.mindmapmode.ChangeNodeLevelController;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mapio.mindmapmode.MMapIO;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.features.nodestyle.mindmapmode.RevisionPlugin;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.mindmapmode.MNoteController;
+import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
+import org.freeplane.features.styles.AutomaticLayoutController;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.time.CreationModificationPlugin;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+import org.freeplane.view.swing.features.BlinkingNodeHook;
+import org.freeplane.view.swing.features.filepreview.ViewerController;
+import org.freeplane.view.swing.features.nodehistory.NodeHistory;
+import org.freeplane.view.swing.features.progress.mindmapmode.ProgressFactory;
+import org.freeplane.view.swing.map.attribute.EditAttributesAction;
+import org.freeplane.view.swing.ui.UserInputListenerFactory;
+
+/**
+ * @author Dimitry Polivaev 24.11.2008
+ */
+public class HeadlessMModeControllerFactory {
+ private static HeadlessMModeControllerFactory instance;
+
+ public static MModeController createModeController() {
+ return HeadlessMModeControllerFactory.getInstance().createModeControllerImpl();
+ }
+
+ private static HeadlessMModeControllerFactory getInstance() {
+ if (instance == null) {
+ instance = new HeadlessMModeControllerFactory();
+ }
+ return instance;
+ }
+
+// // private Controller controller;
+ private MModeController modeController;
+
+ private void createAddIns() {
+ new HierarchicalIcons();
+ new AutomaticLayoutController();
+ new BlinkingNodeHook();
+ SummaryNode.install();
+ new AlwaysUnfoldedNode();
+ FreeNode.install();
+ new CreationModificationPlugin();
+ new AutomaticEdgeColorHook();
+ new ViewerController();
+ MEncryptionController.install(new MEncryptionController(modeController));
+ new ChangeNodeLevelController(modeController);
+ NodeHistory.install(modeController);
+ modeController.addAction(new ImportMindmanagerFiles());
+ }
+
+ private MModeController createModeControllerImpl() {
+// this.controller = controller;
+ createStandardControllers();
+ createAddIns();
+ return modeController;
+ }
+
+ private void createStandardControllers() {
+ final Controller controller = Controller.getCurrentController();
+ modeController = new MModeController(controller);
+ modeController.setUserInputListenerFactory(new UserInputListenerFactory(modeController));
+ controller.addModeController(modeController);
+ controller.selectModeForBuild(modeController);
+ new MMapController(modeController);
+ final MFileManager fileManager = new MFileManager();
+ UrlManager.install(fileManager);
+ MMapIO.install(modeController);
+ controller.getMapViewManager().addMapViewChangeListener(fileManager);
+ IconController.install(new MIconController(modeController));
+ new ProgressFactory().installActions(modeController);
+ EdgeController.install(new MEdgeController(modeController));
+ CloudController.install(new MCloudController(modeController));
+ NoteController.install(new MNoteController(modeController));
+ final MTextController textController = new MTextController(modeController);
+ TextController.install(textController);
+ LinkController.install(new MLinkController(modeController));
+ NodeStyleController.install(new MNodeStyleController(modeController));
+ ClipboardController.install(new MClipboardController());
+ LocationController.install(new MLocationController());
+ final MLogicalStyleController logicalStyleController = new MLogicalStyleController(modeController);
+ LogicalStyleController.install(logicalStyleController);
+ logicalStyleController.initM();
+ AttributeController.install(new MAttributeController(modeController));
+ modeController.addAction(new EditAttributesAction());
+ SpellCheckerController.install(modeController);
+ ExportController.install(new ExportController("/xml/ExportWithXSLT.xml"));
+ MapStyle.install(true);
+ new RevisionPlugin();
+ FoldingController.install(new FoldingController());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/headlessmode/HeadlessMapViewController.java b/freeplane/src/main/java/org/freeplane/main/headlessmode/HeadlessMapViewController.java
new file mode 100644
index 0000000..365ebca
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/headlessmode/HeadlessMapViewController.java
@@ -0,0 +1,287 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.headlessmode;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.image.RenderedImage;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.JComboBox;
+import javax.swing.JScrollPane;
+
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.ui.IMapViewManager;
+
+/**
+ * @author Dimitry Polivaev
+ * 24.12.2012
+ */
+public class HeadlessMapViewController implements IMapViewManager {
+ final private Map<String, MapModel> maps = new HashMap<String, MapModel>();
+ Collection<IMapSelectionListener> mapSelectionListeners = new ArrayList<IMapSelectionListener>();
+ private MapModel currentMap = null;
+ private String currentKey = null;
+
+ public void addMapSelectionListener(IMapSelectionListener pListener) {
+ mapSelectionListeners.add(pListener);
+ }
+
+ public void addMapViewChangeListener(IMapViewChangeListener pListener) {
+
+ }
+
+ public boolean changeToMapView(Component newMapView) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+
+ @Override
+ public void changeToMap(MapModel map) {
+ for(Map.Entry<String, MapModel> mapEntry : maps.entrySet())
+ if(mapEntry.getValue().equals(map)) {
+ changeToMap(map, mapEntry.getKey());
+ return;
+ }
+ }
+
+ public boolean changeToMapView(String mapViewDisplayName) {
+ if(mapViewDisplayName != null && maps.containsKey(mapViewDisplayName)) {
+ final MapModel nextMap = maps.get(mapViewDisplayName);
+ changeToMap(nextMap, mapViewDisplayName);
+ return true;
+ }
+ else
+ return false;
+ }
+
+ private void changeToMap(final MapModel nextMap, String mapViewDisplayName) {
+ MapModel oldMap = currentMap;
+ for(IMapSelectionListener mapSelectionListener : mapSelectionListeners)
+ mapSelectionListener.beforeMapChange(oldMap, nextMap);
+ currentKey = mapViewDisplayName;
+ currentMap = nextMap;
+ for(IMapSelectionListener mapSelectionListener : mapSelectionListeners)
+ mapSelectionListener.afterMapChange(oldMap, nextMap);
+ }
+
+ public boolean changeToMode(String modeName) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public String checkIfFileIsAlreadyOpened(URL urlToCheck) throws MalformedURLException {
+ final String key = urlToCheck.toString();
+ if(maps.containsKey(key))
+ return key;
+ else
+ return null;
+ }
+
+ public boolean close(boolean withoutSave) {
+ if(currentMap == null)
+ return false;
+ maps.remove(currentKey);
+ currentKey = null;
+ currentMap = null;
+ return true;
+ }
+
+ public String createHtmlMap() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public RenderedImage createImage(int dpi) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Color getBackgroundColor(NodeModel node) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Component getComponent(NodeModel node) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Font getFont(NodeModel node) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public List<String> getMapKeys() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Map<String, MapModel> getMaps() {
+ return maps;
+ }
+
+ public IMapSelection getMapSelection() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Component getMapViewComponent() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public List<? extends Component> getMapViewVector() {
+ return Collections.emptyList();
+ }
+
+ public ModeController getModeController(Component newMap) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public MapModel getModel() {
+ return currentMap;
+ }
+
+ public MapModel getModel(Component mapView) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Component getSelectedComponent() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Color getTextColor(NodeModel node) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public float getZoom() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void newMapView(MapModel map, ModeController modeController) {
+ final String key = map.getURL().toString();
+ if(key.equals(currentKey))
+ close(true);
+ maps.put(key, map);
+ changeToMapView(key);
+ }
+
+ public void nextMapView() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void previousMapView() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void removeMapSelectionListener(IMapSelectionListener pListener) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void removeMapViewChangeListener(IMapViewChangeListener pListener) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void scrollNodeToVisible(NodeModel node) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void setZoom(float zoom) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public boolean tryToChangeToMapView(String mapView) {
+ return changeToMapView(mapView);
+ }
+
+ public boolean tryToChangeToMapView(URL url) throws MalformedURLException {
+ if(url == null)
+ return false;
+ return tryToChangeToMapView(url.toString());
+ }
+
+ public void updateMapViewName() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public boolean isLeftTreeSupported(Component mapViewComponent) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Map<String, MapModel> getMaps(String modename) {
+ return maps;
+ }
+
+ public List<Component> getViews(MapModel map) {
+ return Collections.emptyList();
+ }
+
+ public JScrollPane getScrollPane() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Container getViewport() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void obtainFocusForSelected() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void setMapTitles() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public Object setEdgesRenderingHint(Graphics2D g) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void setTextRenderingHint(Graphics2D g) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public boolean closeAllMaps() {
+ maps.clear();
+ currentKey = null;
+ currentMap = null;
+ return true;
+ }
+
+ public boolean close(Component mapViewComponent, boolean force) {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public JComboBox createZoomBox() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public boolean isFoldedOnCurrentView(NodeModel node) {
+ return node.isFolded();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/headlessmode/HeadlessUIController.java b/freeplane/src/main/java/org/freeplane/main/headlessmode/HeadlessUIController.java
new file mode 100644
index 0000000..c39dd23
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/headlessmode/HeadlessUIController.java
@@ -0,0 +1,245 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.headlessmode;
+
+import java.awt.Component;
+import java.awt.Rectangle;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URI;
+import java.net.URL;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.features.ui.IMapViewManager;
+
+/**
+ * @author Dimitry Polivaev
+ * 24.12.2012
+ */
+public class HeadlessUIController extends FrameController {
+
+ final private AtomicLong workingThreadId = new AtomicLong();
+ final private ExecutorService worker = Executors.newSingleThreadExecutor(new ThreadFactory() {
+ public Thread newThread(Runnable r) {
+ final Thread thread = Executors.defaultThreadFactory().newThread(r);
+ workingThreadId.set(thread.getId());
+ return thread;
+ }
+ }) ;
+
+ public HeadlessUIController(Controller controller, IMapViewManager mapViewManager, String propertyKeyPrefix) {
+ super(controller, mapViewManager, propertyKeyPrefix);
+ }
+
+ public Rectangle getFrameSize() {
+ throw methodNotImplementedException();
+ }
+
+ public void setFrameSize(Rectangle frameSize) {
+ throw methodNotImplementedException();
+ }
+
+ public void changeNoteWindowLocation() {
+ throw methodNotImplementedException();
+ }
+
+ public void err(String msg) {
+ throw methodNotImplementedException();
+ }
+
+ public FreeplaneMenuBar getFreeplaneMenuBar() {
+ throw methodNotImplementedException();
+ }
+
+ public JFrame getJFrame() {
+ throw methodNotImplementedException();
+ }
+
+ public JComponent getStatusBar() {
+ throw methodNotImplementedException();
+ }
+
+ public void init(Controller controller) {
+ throw methodNotImplementedException();
+ }
+
+ public void insertComponentIntoSplitPane(JComponent noteViewerComponent) {
+ throw methodNotImplementedException();
+ }
+
+ public boolean isApplet() {
+ return false;
+ }
+
+ public boolean isMenubarVisible() {
+ throw methodNotImplementedException();
+ }
+
+ public void openDocument(URI uri) throws IOException {
+ throw methodNotImplementedException();
+ }
+
+ public void openDocument(URL fileToUrl) throws Exception {
+ throw methodNotImplementedException();
+ }
+
+ public void out(String msg) {
+ throw methodNotImplementedException();
+ }
+
+ public void addStatusInfo(String key, String info) {
+ throw methodNotImplementedException();
+ }
+
+ public void addStatusInfo(String key, Icon icon) {
+ throw methodNotImplementedException();
+ }
+
+ public void addStatusInfo(String key, String info, Icon icon) {
+ throw methodNotImplementedException();
+ }
+
+ public void addStatusInfo(String key, String info, Icon icon, String tooltip) {
+ throw methodNotImplementedException();
+ }
+
+ public void addStatusComponent(String key, Component component) {
+ throw methodNotImplementedException();
+ }
+
+ public void removeStatus(String key) {
+ throw methodNotImplementedException();
+ }
+
+ public void removeSplitPane() {
+ throw methodNotImplementedException();
+ }
+
+ public void saveProperties() {
+ throw methodNotImplementedException();
+ }
+
+ public void selectMode(ModeController oldModeController, ModeController newModeController) {
+ throw methodNotImplementedException();
+ }
+
+ public void setMenubarVisible(boolean visible) {
+ throw methodNotImplementedException();
+ }
+
+ public void setTitle(String frameTitle) {
+ throw methodNotImplementedException();
+ }
+
+ public void setWaitingCursor(boolean b) {
+ throw methodNotImplementedException();
+ }
+
+ public void viewNumberChanged(int number) {
+ throw methodNotImplementedException();
+ }
+
+ public String completeVisiblePropertyKey(JComponent toolBar) {
+ throw methodNotImplementedException();
+ }
+
+ public void addObjectTypeInfo(Object value) {
+ throw methodNotImplementedException();
+ }
+
+ public boolean quit() {
+ throw methodNotImplementedException();
+ }
+
+ public boolean isDispatchThread() {
+ return workingThreadId.get() == Thread.currentThread().getId();
+ }
+
+ public void invokeLater(Runnable runnable) {
+ worker.execute(runnable);
+ }
+
+ public void invokeAndWait(Runnable runnable) throws InterruptedException, InvocationTargetException {
+ try {
+ worker.submit(runnable).get();
+ } catch (ExecutionException e) {
+ }
+ }
+
+ public boolean isHeadless() {
+ return true;
+ }
+
+ public boolean areScrollbarsVisible() {
+ return false;
+ }
+
+ public void setScrollbarsVisible(boolean b) {
+ }
+
+ public boolean isFullScreenEnabled() {
+ return false;
+ }
+
+ @Override
+ protected void setFreeplaneMenuBar(FreeplaneMenuBar menuBar) {
+ throw methodNotImplementedException();
+ }
+
+ public void previousMapView() {
+ throw methodNotImplementedException();
+
+ }
+
+ public void nextMapView() {
+ throw methodNotImplementedException();
+ }
+
+ @Override
+ public Component getCurrentRootComponent() {
+ throw methodNotImplementedException();
+ }
+
+ @Override
+ public Component getMenuComponent() {
+ throw methodNotImplementedException();
+ }
+
+ @Override
+ protected boolean isMenuComponentInFullScreenMode() {
+ return false;
+ }
+
+ private RuntimeException methodNotImplementedException() {
+ return new RuntimeException("Method not implemented");
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/HttpVersionClient.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/HttpVersionClient.java
new file mode 100644
index 0000000..56f4536
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/HttpVersionClient.java
@@ -0,0 +1,161 @@
+package org.freeplane.main.mindmapmode;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Properties;
+
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.LogUtils;
+
+/**
+ * Handles communication with update webservice.
+ * @author robert ladstaetter
+ */
+class HttpVersionClient {
+ private static URL getUrl(final String versionUrl) {
+ try {
+ return new URL(versionUrl);
+ }
+ catch (final MalformedURLException e) {
+ return null;
+ }
+ }
+
+ private String history;
+ private FreeplaneVersion remoteVersion;
+ private boolean successful;
+ private URL remoteVersionDownloadUrl;
+ private URL remoteVersionChangelogUrl;
+
+ public HttpVersionClient(final String versionUrl, final FreeplaneVersion currentVersion) {
+ this(HttpVersionClient.getUrl(versionUrl), currentVersion);
+ }
+
+ public HttpVersionClient(final URL url, final FreeplaneVersion currentVersion) {
+ remoteVersion = null;
+ history = "";
+ successful = false;
+
+ try {
+ if (isPropertyUrl(url))
+ parseProperties(url, currentVersion);
+ else
+ parseHistory(url, currentVersion);
+ }
+ catch (final NullPointerException e) {
+ LogUtils.warn("problem with update check for url (" + url + ")", e);
+ }
+ catch (final IOException e) {
+ LogUtils.warn("Could not read update url (" + url + ") - check your internet connection.");
+ }
+ catch (final IllegalArgumentException e) {
+ LogUtils.warn("Could not read version from " + url + ":" + e.getMessage());
+ }
+ }
+
+ private boolean isPropertyUrl(final URL url) {
+ return url.getPath() != null && url.getPath().endsWith(".properties");
+ }
+
+ private boolean parseProperties(final URL url, final FreeplaneVersion currentVersion) throws IOException {
+ Properties versionProperties = new Properties();
+ versionProperties.load(new InputStreamReader(url.openConnection().getInputStream()));
+
+ // if the 'version' property doesn't exist, an IllegalArgumentException will be raised since it's mandatory
+ if (versionProperties.getProperty("version") != null) {
+ remoteVersion = FreeplaneVersion.getVersion(versionProperties.getProperty("version"));
+ successful = true;
+ // optional properties
+ remoteVersionDownloadUrl = parseUrl(versionProperties.getProperty("downloadUrl"));
+ remoteVersionChangelogUrl = parseUrl(versionProperties.getProperty("changelogUrl"));
+ return remoteVersion.compareTo(currentVersion) > 0;
+ } else {
+ LogUtils.warn("add-on update: no version found in " + url);
+ return false;
+ }
+ }
+
+ private void parseHistory(final URL url, final FreeplaneVersion currentVersion) throws IOException {
+ BufferedReader in = null;
+ try {
+ // "version.txt" format
+ in = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
+ String line = in.readLine();
+ while (line != null && !line.startsWith("=====")) {
+ line = in.readLine();
+ }
+ while (line != null && line.startsWith("=====")) {
+ line = in.readLine();
+ }
+ if (line == null) {
+ return;
+ }
+ remoteVersion = FreeplaneVersion.getVersion(line);
+ successful = true;
+ if (remoteVersion.compareTo(currentVersion) > 0) {
+ parseHistory(currentVersion, in, line);
+ }
+ }
+ finally {
+ if (in != null) {
+ try {
+ in.close();
+ }
+ catch (final IOException e) {
+ LogUtils.warn("Couldn't close buffered reader.");
+ }
+ }
+ }
+ }
+
+ private void parseHistory(FreeplaneVersion currentVersion, BufferedReader in, String firstLine) throws IOException {
+ final StringBuilder historyBuffer = new StringBuilder();
+ historyBuffer.append(firstLine);
+ historyBuffer.append('\n');
+ for (String line = in.readLine(); line != null; line = in.readLine()) {
+ try {
+ final FreeplaneVersion version = FreeplaneVersion.getVersion(line);
+ if (version.compareTo(currentVersion) <= 0) {
+ break;
+ }
+ }
+ catch (final IllegalArgumentException e) {
+ }
+ historyBuffer.append(line);
+ historyBuffer.append('\n');
+ }
+ history = historyBuffer.toString();
+ }
+
+ private URL parseUrl(final String urlString) {
+ try {
+ return new URL(urlString);
+ } catch (final MalformedURLException e) {
+ return null;
+ }
+ }
+
+ public String getHistory() {
+ return history;
+ }
+
+ public FreeplaneVersion getRemoteVersion() {
+ return remoteVersion;
+ }
+
+ public URL getRemoteVersionDownloadUrl() {
+ return remoteVersionDownloadUrl;
+ }
+
+ public URL getRemoteVersionChangelogUrl() {
+ return remoteVersionChangelogUrl;
+ }
+
+
+ public boolean isSuccessful() {
+ return successful;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/MModeControllerFactory.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/MModeControllerFactory.java
new file mode 100644
index 0000000..08bab78
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/MModeControllerFactory.java
@@ -0,0 +1,363 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.event.KeyEvent;
+
+import javax.swing.Box;
+import javax.swing.JComponent;
+import javax.swing.JPopupMenu;
+import javax.swing.JRootPane;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.KeyStroke;
+import javax.swing.RootPaneContainer;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.IEditHandler;
+import org.freeplane.core.ui.IKeyStrokeProcessor;
+import org.freeplane.core.ui.IMouseListener;
+import org.freeplane.core.ui.SetAcceleratorOnNextClickAction;
+import org.freeplane.core.ui.components.FButtonBar;
+import org.freeplane.core.ui.components.FreeplaneToolBar;
+import org.freeplane.core.ui.components.JResizer.Direction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.action.ComponentBuilder;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.ui.menubuilders.menu.ComponentProvider;
+import org.freeplane.core.ui.menubuilders.menu.JToolbarComponentBuilder;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.mindmapmode.AddAttributeAction;
+import org.freeplane.features.attribute.mindmapmode.MAttributeController;
+import org.freeplane.features.attribute.mindmapmode.RemoveAllAttributesAction;
+import org.freeplane.features.attribute.mindmapmode.RemoveFirstAttributeAction;
+import org.freeplane.features.attribute.mindmapmode.RemoveLastAttributeAction;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.clipboard.mindmapmode.MClipboardController;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.cloud.mindmapmode.MCloudController;
+import org.freeplane.features.edge.AutomaticEdgeColorHook;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.edge.mindmapmode.MEdgeController;
+import org.freeplane.features.encrypt.mindmapmode.MEncryptionController;
+import org.freeplane.features.export.mindmapmode.ExportController;
+import org.freeplane.features.export.mindmapmode.ImportMindmanagerFiles;
+import org.freeplane.features.export.mindmapmode.ImportXmlFile;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.icon.HierarchicalIcons;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.mindmapmode.IconSelectionPlugin;
+import org.freeplane.features.icon.mindmapmode.MIconController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.AlwaysUnfoldedNode;
+import org.freeplane.features.map.FoldingController;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.map.mindmapmode.ChangeNodeLevelController;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.map.mindmapmode.NewParentNode;
+import org.freeplane.features.map.mindmapmode.RemoveAllAlwaysUnfoldedNodeFlagsAction;
+import org.freeplane.features.map.mindmapmode.SetAlwaysUnfoldedNodeFlagsAction;
+import org.freeplane.features.map.mindmapmode.SummaryNodeMapUpdater;
+import org.freeplane.features.mapio.mindmapmode.MMapIO;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.features.nodestyle.mindmapmode.RevisionPlugin;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.mindmapmode.MNoteController;
+import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
+import org.freeplane.features.styles.AutomaticLayoutController;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
+import org.freeplane.features.styles.mindmapmode.MUIFactory;
+import org.freeplane.features.styles.mindmapmode.ShowFormatPanelAction;
+import org.freeplane.features.styles.mindmapmode.StyleEditorPanel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.text.mindmapmode.SortNodes;
+import org.freeplane.features.text.mindmapmode.SplitNode;
+import org.freeplane.features.time.CreationModificationPlugin;
+import org.freeplane.features.ui.CollapseableBoxBuilder;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.features.ui.ToggleToolbarAction;
+import org.freeplane.features.ui.UIComponentVisibilityDispatcher;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+import org.freeplane.features.url.mindmapmode.SaveAll;
+import org.freeplane.main.mindmapmode.stylemode.SModeControllerFactory;
+import org.freeplane.view.swing.features.BlinkingNodeHook;
+import org.freeplane.view.swing.features.FitToPage;
+import org.freeplane.view.swing.features.filepreview.AddExternalImageAction;
+import org.freeplane.view.swing.features.filepreview.ChangeExternalImageAction;
+import org.freeplane.view.swing.features.filepreview.RemoveExternalImageAction;
+import org.freeplane.view.swing.features.filepreview.ViewerController;
+import org.freeplane.view.swing.features.nodehistory.NodeHistory;
+import org.freeplane.view.swing.features.progress.mindmapmode.ProgressFactory;
+import org.freeplane.view.swing.features.time.mindmapmode.ReminderHook;
+import org.freeplane.view.swing.map.ShowNotesInMapAction;
+import org.freeplane.view.swing.map.attribute.AttributePanelManager;
+import org.freeplane.view.swing.map.attribute.EditAttributesAction;
+import org.freeplane.view.swing.ui.DefaultNodeKeyListener;
+import org.freeplane.view.swing.ui.UserInputListenerFactory;
+import org.freeplane.view.swing.ui.mindmapmode.MMapMouseListener;
+import org.freeplane.view.swing.ui.mindmapmode.MNodeDragListener;
+import org.freeplane.view.swing.ui.mindmapmode.MNodeDropListener;
+import org.freeplane.view.swing.ui.mindmapmode.MNodeMotionListener;
+import org.freeplane.view.swing.ui.mindmapmode.MNodeMouseWheelListener;
+
+/**
+ * @author Dimitry Polivaev 24.11.2008
+ */
+public class MModeControllerFactory {
+ private static MModeControllerFactory instance;
+
+ public static MModeController createModeController() {
+ return MModeControllerFactory.getInstance().createModeControllerImpl();
+ }
+
+ private static MModeControllerFactory getInstance() {
+ if (instance == null) {
+ instance = new MModeControllerFactory();
+ }
+ return instance;
+ }
+
+// // private Controller controller;
+ private MModeController modeController;
+ private MUIFactory uiFactory;
+
+ private void createAddIns() {
+ final StyleEditorPanel panel = new StyleEditorPanel(modeController, uiFactory, true);
+ final JScrollPane styleScrollPane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ UITools.setScrollbarIncrement(styleScrollPane);
+ final JComponent tabs = (JComponent) modeController.getUserInputListenerFactory().getToolBar("/format").getComponent(1);
+ tabs.add(TextUtils.getText("format_panel"), styleScrollPane);
+ new AttributePanelManager(modeController);
+ new HierarchicalIcons();
+ new AutomaticLayoutController();
+ new BlinkingNodeHook();
+ SummaryNode.install();
+ final MMapController mapController = (MMapController) modeController.getMapController();
+ mapController.addMapLifeCycleListener(new SummaryNodeMapUpdater(modeController, mapController));
+ final AlwaysUnfoldedNode alwaysUnfoldedNode = new AlwaysUnfoldedNode();
+ modeController.addAction(new SetAlwaysUnfoldedNodeFlagsAction(alwaysUnfoldedNode));
+ modeController.addAction(new RemoveAllAlwaysUnfoldedNodeFlagsAction(alwaysUnfoldedNode));
+ FreeNode.install();
+ new CreationModificationPlugin();
+ modeController.addExtension(ReminderHook.class, new ReminderHook(modeController));
+ new AutomaticEdgeColorHook();
+ new ViewerController();
+ modeController.addAction(new AddAttributeAction());
+ modeController.addAction(new RemoveFirstAttributeAction());
+ modeController.addAction(new RemoveLastAttributeAction());
+ modeController.addAction(new RemoveAllAttributesAction());
+ modeController.addAction(new AddExternalImageAction());
+ modeController.addAction(new RemoveExternalImageAction());
+ modeController.addAction(new ChangeExternalImageAction());
+ modeController.addAction(new ShowFormatPanelAction());
+ modeController.addAction(new FitToPage());
+ modeController.addAction(new UpdateCheckAction());
+ MEncryptionController.install(new MEncryptionController(modeController));
+ modeController.addAction(new IconSelectionPlugin());
+ modeController.addAction(new NewParentNode());
+ modeController.addAction(new SaveAll());
+ modeController.addAction(new SortNodes());
+ modeController.addAction(new SplitNode());
+ new ChangeNodeLevelController(modeController);
+ NodeHistory.install(modeController);
+ modeController.addAction(new ImportXmlFile());
+ modeController.addAction(new ImportMindmanagerFiles());
+ }
+
+ private MModeController createModeControllerImpl() {
+// this.controller = controller;
+ createStandardControllers();
+ createAddIns();
+ return modeController;
+ }
+
+ private void createStandardControllers() {
+ final Controller controller = Controller.getCurrentController();
+ modeController = new MModeController(controller);
+ final UserInputListenerFactory userInputListenerFactory = new UserInputListenerFactory(modeController);
+
+ final IMouseListener nodeMouseMotionListener = new MNodeMotionListener();
+ userInputListenerFactory.setNodeMouseMotionListener(nodeMouseMotionListener);
+ userInputListenerFactory.setNodeMouseWheelListener(new MNodeMouseWheelListener(userInputListenerFactory.getMapMouseWheelListener()));
+ final JPopupMenu popupmenu = new JPopupMenu();
+ userInputListenerFactory.setNodePopupMenu(popupmenu);
+ modeController.setUserInputListenerFactory(userInputListenerFactory);
+ controller.addModeController(modeController);
+ controller.selectModeForBuild(modeController);
+ new MMapController(modeController);
+ final MFileManager fileManager = new MFileManager();
+ UrlManager.install(fileManager);
+ MMapIO.install(modeController);
+ controller.getMapViewManager().addMapViewChangeListener(fileManager);
+ IconController.install(new MIconController(modeController));
+ new ProgressFactory().installActions(modeController);
+ final MapController mapController = modeController.getMapController();
+ EdgeController.install(new MEdgeController(modeController));
+ CloudController.install(new MCloudController(modeController));
+ NoteController.install(new MNoteController(modeController));
+ userInputListenerFactory.setMapMouseListener(new MMapMouseListener());
+ final MTextController textController = new MTextController(modeController);
+ TextController.install(textController);
+ LinkController.install(new MLinkController(modeController));
+ NodeStyleController.install(new MNodeStyleController(modeController));
+ ClipboardController.install(new MClipboardController());
+ userInputListenerFactory.setNodeDragListener(new MNodeDragListener());
+ userInputListenerFactory.setNodeDropTargetListener(new MNodeDropListener());
+ LocationController.install(new MLocationController());
+ final MLogicalStyleController logicalStyleController = new MLogicalStyleController(modeController);
+ LogicalStyleController.install(logicalStyleController);
+ logicalStyleController.initM();
+ AttributeController.install(new MAttributeController(modeController));
+ userInputListenerFactory.setNodeKeyListener(new DefaultNodeKeyListener(new IEditHandler() {
+ public void edit(final KeyEvent e, final FirstAction action, final boolean editLong) {
+ ((MTextController) MTextController.getController(modeController)).getEventQueue().activate(e);
+ textController.edit(action, editLong);
+ }
+ }));
+ userInputListenerFactory.setNodeMotionListener(new MNodeMotionListener());
+ modeController.addAction(new EditAttributesAction());
+ SpellCheckerController.install(modeController);
+ ExportController.install(new ExportController("/xml/ExportWithXSLT.xml"));
+ MapStyle.install(true);
+ final FreeplaneToolBar toolbar = new FreeplaneToolBar("main_toolbar", SwingConstants.HORIZONTAL);
+ final FrameController frameController = (FrameController) controller.getViewController();
+ UIComponentVisibilityDispatcher.install(frameController, toolbar, "toolbarVisible");
+ userInputListenerFactory.addToolBar("/main_toolbar", ViewController.TOP, toolbar);
+ userInputListenerFactory.addToolBar("/filter_toolbar", FilterController.TOOLBAR_SIDE, FilterController.getController(controller).getFilterToolbar());
+ userInputListenerFactory.addToolBar("/status", ViewController.BOTTOM, frameController
+ .getStatusBar());
+ final JTabbedPane formattingPanel = new JTabbedPane();
+ Box resisableTabs = new CollapseableBoxBuilder(frameController).setPropertyNameBase("styleScrollPaneVisible").createBox(formattingPanel, Direction.RIGHT);
+ userInputListenerFactory.addToolBar("/format", ViewController.RIGHT, resisableTabs);
+ final JRootPane rootPane = ((RootPaneContainer)frameController.getMenuComponent()).getRootPane();
+ final FButtonBar fButtonToolBar = new FButtonBar(rootPane);
+ UIComponentVisibilityDispatcher.install(frameController, fButtonToolBar, "fbarVisible");
+ fButtonToolBar.setVisible(ResourceController.getResourceController().getBooleanProperty("fbarVisible"));
+ userInputListenerFactory.addToolBar("/fbuttons", ViewController.TOP, fButtonToolBar);
+ userInputListenerFactory.setKeyEventProcessor(new IKeyStrokeProcessor() {
+ @Override
+ public boolean processKeyBinding(KeyStroke ks, KeyEvent e) {
+ return userInputListenerFactory.getAcceleratorManager().processKeyBinding(ks, e) || fButtonToolBar.processKeyBinding(ks, e);
+ }
+ });
+ controller.addAction(new ToggleToolbarAction("ToggleFBarAction", "/fbuttons"));
+ SModeControllerFactory.install();
+ modeController.addAction(new SetAcceleratorOnNextClickAction());
+ modeController.addAction(new ShowNotesInMapAction());
+ //userInputListenerFactory.getMenuBuilder().setAcceleratorChangeListener(fButtonToolBar);
+ userInputListenerFactory.getAcceleratorManager().addAcceleratorChangeListener(modeController, fButtonToolBar);
+ userInputListenerFactory.addToolBar("/icon_toolbar", ViewController.LEFT, ((MIconController) IconController
+ .getController()).getIconToolBarScrollPane());
+ modeController.addAction(new ToggleToolbarAction("ToggleLeftToolbarAction", "/icon_toolbar"));
+ new RevisionPlugin();
+ FoldingController.install(new FoldingController());
+
+ uiFactory = new MUIFactory();
+ mapController.addNodeChangeListener(uiFactory);
+ mapController.addNodeSelectionListener(uiFactory);
+ mapController.addMapChangeListener(uiFactory);
+ controller.getMapViewManager().addMapSelectionListener(uiFactory);
+ modeController.addExtension(MUIFactory.class, uiFactory);
+
+ modeController.addUiBuilder(Phase.ACTIONS, "main_toolbar_font_name", new ComponentBuilder(
+ new ComponentProvider() {
+ @Override
+ public Component createComponent(Entry entry) {
+ final Container fontBox = uiFactory.createFontBox();
+ final Dimension preferredSize = fontBox.getPreferredSize();
+ preferredSize.width = 90;
+ fontBox.setPreferredSize(preferredSize);
+ return fontBox;
+ }
+ }), EntryVisitor.EMTPY);
+
+
+ modeController.addUiBuilder(Phase.ACTIONS, "main_toolbar_font_size", new ComponentBuilder(
+ new ComponentProvider() {
+ @Override
+ public Component createComponent(Entry entry) {
+ return uiFactory.createSizeBox();
+ }
+ }), EntryVisitor.EMTPY);
+
+
+ modeController.addUiBuilder(Phase.ACTIONS, "main_toolbar_style", new ComponentBuilder(
+ new ComponentProvider() {
+ @Override
+ public Component createComponent(Entry entry) {
+ return uiFactory.createStyleBox();
+ }
+ }), EntryVisitor.EMTPY);
+
+ modeController.addUiBuilder(Phase.UI, "main_toolbar_zoom", new JToolbarComponentBuilder(
+ new ComponentProvider() {
+ @Override
+ public Component createComponent(Entry entry) {
+ return controller.getMapViewManager().createZoomBox();
+ }
+ }));
+
+
+// IconController.getController(modeController).addStateIconProvider(new IStateIconProvider() {
+// public UIIcon getStateIcon(NodeModel node) {
+// final URI link = NodeLinks.getLink(node);
+// return wrapIcon(LinkController.getLinkIcon(link, node));
+// }
+//
+// private UIIcon wrapIcon(final Icon linkIcon) {
+// UIIcon icon = null;
+// if(linkIcon != null) {
+// if(linkIcon instanceof UIIcon) {
+// icon = (UIIcon) linkIcon;
+// }
+// else {
+// icon = new UIIcon("ownIcon", null) {
+// public Icon getIcon() {
+// return linkIcon;
+// }
+// };
+// }
+// }
+// return icon;
+// }
+// });
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/UpdateCheckAction.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/UpdateCheckAction.java
new file mode 100644
index 0000000..17a66d8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/UpdateCheckAction.java
@@ -0,0 +1,515 @@
+package org.freeplane.main.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+import javax.swing.Timer;
+import javax.swing.border.Border;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.main.addons.AddOnProperties;
+import org.freeplane.main.addons.AddOnsController;
+
+/**
+ * Checks for updates.
+ *
+ * @author robert ladstaetter
+ */
+class UpdateCheckAction extends AFreeplaneAction {
+ private static boolean autorunEnabled = true;
+ private static Timer autorunTimer = null;
+ private static final int CHECK_TIME = 30 * 1000;
+ private static final String CHECK_UPDATES_AUTOMATICALLY = "check_updates_automatically";
+ private static final String LAST_UPDATE_CHECK_TIME = "last_update_check_time";
+ private static final String LAST_UPDATE_VERSION = "last_update_verson";
+ /**
+ * the sid.
+ */
+ private static final long serialVersionUID = 1L;
+ private static final int TWO_DAYS = 1 * 24 * 60 * 60 * 1000;
+ private static final String UPDATE_BUTTON_LOCATION = "main_toolbar_update";
+// /**
+// * the url where to download the newest version
+// */
+// private static final String WEB_DOWNLOAD_LOCATION_KEY = "webDownloadLocation";
+ /**
+ * the url to check the local version against
+ */
+ private static final String WEB_UPDATE_LOCATION_KEY = "webUpdateLocation";
+ protected Entry entry;
+
+ /**
+ * the client which asks a remote repository for the current version of the program.
+ */
+ public UpdateCheckAction() {
+ super("UpdateCheckAction");
+ final Controller controller = Controller.getCurrentController();
+ controller.getMapViewManager().addMapViewChangeListener(new IMapViewChangeListener() {
+ public void afterViewChange(final Component oldView, final Component newView) {
+ if (newView == null) {
+ return;
+ }
+ controller.getViewController().invokeLater(new Runnable() {
+ public void run() {
+ removeMe();
+ }
+ });
+ setTimer();
+ }
+
+ public void afterViewClose(final Component oldView) {
+ }
+
+ public void afterViewCreated(final Component mapView) {
+ }
+
+ public void beforeViewChange(final Component oldView, final Component newView) {
+ }
+
+ private void removeMe() {
+ controller.getMapViewManager().removeMapViewChangeListener(this);
+ }
+ });
+ controller.getModeController().addUiBuilder(Phase.ACTIONS, UPDATE_BUTTON_LOCATION,
+ new EntryVisitor() {
+ @Override
+ public void visit(Entry target) {
+ entry = target;
+ new EntryAccessor().setAction(target, UpdateCheckAction.this);
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+ });
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final boolean autoRun = e.getSource().equals(autorunTimer);
+ if (autorunTimer != null) {
+ autorunTimer.stop();
+ autorunTimer = null;
+ }
+ new Thread(new Runnable() {
+ public void run() {
+ try {
+ checkForUpdates(autoRun);
+ } catch (SecurityException e) {
+ // this can happens if the action is started when script is executed
+ }
+ }
+ }, "checkForUpdates").start();
+ }
+
+ private void addUpdateButton(final FreeplaneVersion lastVersion) {
+ if (entry != null) {
+ Controller controller = Controller.getCurrentController();
+ final Component component = (Component) new EntryAccessor().getComponent(entry);
+ if (component != null) {
+ final Dimension preferredSize = component.getPreferredSize();
+ if (lastVersion == null || lastVersion.compareTo(FreeplaneVersion.getVersion()) <= 0) {
+ ResourceController.getResourceController().setProperty(LAST_UPDATE_VERSION, "");
+ component.setPreferredSize(new Dimension(0, preferredSize.height));
+ component.setVisible(false);
+ }
+ else {
+ ResourceController.getResourceController().setProperty(LAST_UPDATE_VERSION, lastVersion.toString());
+ final String updateAvailable = TextUtils.format("new_version_available", lastVersion.toString());
+ controller.getViewController().out(updateAvailable);
+ putValue(SHORT_DESCRIPTION, updateAvailable);
+ putValue(LONG_DESCRIPTION, updateAvailable);
+ component.setPreferredSize(new Dimension(preferredSize.height, preferredSize.height));
+ component.setVisible(true);
+ }
+ }
+ }
+ }
+
+ private void checkForUpdates(final boolean autoRun) {
+ final Date now = new Date();
+ ResourceController.getResourceController().setProperty(LAST_UPDATE_CHECK_TIME, Long.toString(now.getTime()));
+ final Locale defaultLocale = Locale.getDefault();
+ final String language = defaultLocale.getLanguage();
+ final String DEFAULT_LANGUAGE = "en";
+ final String translatedWebUpdate = getWebUpdateUrl(language);
+ final FreeplaneVersion localVersion = FreeplaneVersion.getVersion();
+ final HttpVersionClient translatedVersionClient = new HttpVersionClient(translatedWebUpdate, localVersion);
+ FreeplaneVersion lastTranslatedVersion = translatedVersionClient.getRemoteVersion();
+ if (lastTranslatedVersion == null) {
+ lastTranslatedVersion = localVersion;
+ }
+ final String history;
+ final FreeplaneVersion lastVersion;
+ final boolean connectSuccessfull;
+ if (!language.equals(DEFAULT_LANGUAGE)) {
+ final String defaultWebUpdate = getWebUpdateUrl(DEFAULT_LANGUAGE);
+ final HttpVersionClient defaultVersionClient = new HttpVersionClient(defaultWebUpdate,
+ lastTranslatedVersion);
+ lastVersion = defaultVersionClient.getRemoteVersion();
+ history = defaultVersionClient.getHistory() + translatedVersionClient.getHistory();
+ connectSuccessfull = defaultVersionClient.isSuccessful();
+ }
+ else {
+ lastVersion = lastTranslatedVersion;
+ history = translatedVersionClient.getHistory();
+ connectSuccessfull = translatedVersionClient.isSuccessful();
+ }
+
+ checkForAddonsUpdates();
+ Controller.getCurrentController().getViewController().invokeLater(new Runnable() {
+ public void run() {
+ addUpdateButton(lastVersion);
+ if (autoRun) {
+ return;
+ }
+ showUpdateDialog(connectSuccessfull, localVersion, lastVersion, history);
+ }
+ });
+ }
+
+
+ // looking for new versions of add-ons
+ // and store the latest version as a property
+ private void checkForAddonsUpdates() {
+ // loop on add-ons
+ List<AddOnProperties> installedAddOns = AddOnsController.getController().getInstalledAddOns();
+ LogUtils.info("checking for updates of " + installedAddOns.size() + " add-ons");
+ for (AddOnProperties addOnProperties : installedAddOns) {
+ FreeplaneVersion addOnLocalVersion = toFreeplaneVersion(addOnProperties.getVersion());
+ // get the update-url for this add-on
+ // append the current add-on version for
+ // - statistics (appending a freeplane installation unique id would enable building add-on usage statistics)
+ // - handling special cases ? (maybe we could send the freeplane version too)
+ final URL updateUrl = addOnProperties.getUpdateUrl();
+ if (updateUrl != null) {
+ final String addOnUpdateRequest = updateUrl + "?v=" + addOnLocalVersion.toString();
+ final HttpVersionClient versionClient = new HttpVersionClient(addOnUpdateRequest, addOnLocalVersion);
+ final boolean connectSuccesfull;
+ final FreeplaneVersion latestVersion = versionClient.getRemoteVersion();
+
+ connectSuccesfull = versionClient.isSuccessful();
+ if (connectSuccesfull) {
+ addOnProperties.setLatestVersion(latestVersion.toString());
+ if (versionClient.getRemoteVersionDownloadUrl() != null) {
+ addOnProperties.setLatestVersionDownloadUrl(versionClient.getRemoteVersionDownloadUrl());
+ }
+ if (versionClient.getRemoteVersionChangelogUrl() != null) {
+ addOnProperties.setLatestVersionChangelogUrl(versionClient.getRemoteVersionChangelogUrl());
+ }
+ }
+ }
+ }
+ }
+
+ private String getWebUpdateUrl(final String language) {
+ {
+ final String webUpdateUrl = ResourceController.getResourceController().getProperty(WEB_UPDATE_LOCATION_KEY);
+ final FreeplaneVersion localVersion = FreeplaneVersion.getVersion();
+ final StringBuilder sb = new StringBuilder(webUpdateUrl);
+ final String type = localVersion.getType();
+ if(! type.equals("")){
+ sb.append(type);
+ sb.append('/');
+ }
+ sb.append("history_");
+ sb.append(language);
+ sb.append(".txt");
+ return sb.toString();
+ }
+ }
+
+ private FreeplaneVersion getKnownNewVersion() {
+ final FreeplaneVersion localVersion = FreeplaneVersion.getVersion();
+ final String property = ResourceController.getResourceController().getProperty(LAST_UPDATE_VERSION);
+ if (property.equals("")) {
+ return null;
+ }
+
+ FreeplaneVersion lastVersion = FreeplaneVersion.getVersion(property);
+ if (lastVersion.compareTo(localVersion) <= 0) {
+ lastVersion = null;
+ }
+ return lastVersion;
+ }
+
+ private void setTimer() {
+ if (autorunEnabled == false) {
+ return;
+ }
+ autorunEnabled = ResourceController.getResourceController().getBooleanProperty(CHECK_UPDATES_AUTOMATICALLY);
+ if (autorunEnabled == false) {
+ return;
+ }
+ autorunEnabled = false;
+ final Date now = new Date();
+ final long nextCheckMillis = ResourceController.getResourceController().getLongProperty(LAST_UPDATE_CHECK_TIME,
+ 0)
+ + TWO_DAYS;
+ final Date nextCheckDate = new Date(nextCheckMillis);
+ if (now.before(nextCheckDate)) {
+ final FreeplaneVersion knownNewVersion = getKnownNewVersion();
+ addUpdateButton(knownNewVersion);
+ return;
+ }
+ autorunTimer = new Timer(CHECK_TIME, this);
+ autorunTimer.setRepeats(false);
+ autorunTimer.start();
+ }
+
+
+ private void showUpdateDialog(final boolean connectSuccesfull, final FreeplaneVersion localVersion,
+ final FreeplaneVersion newVersion, final String history) {
+ if (connectSuccesfull == false) {
+ showUpdateDialog("can_not_connect_to_info_server", newVersion, history);
+ } else {
+ showUpdateDialog("new_version_available", newVersion, history);
+ }
+
+ return;
+ }
+
+ private int showUpdateDialog(final String info, final FreeplaneVersion freeplaneLatestVersion, final String history) {
+
+ // dialog layout
+ // - messagePane (verticalBox)
+ // |- gridPane (GridBagLayout)
+ // Components | Installed version | Latestversion | Changelog button | Got to download button
+ //
+ // |- preferences label
+ // |- checkbox for automatic update
+
+ final Box messagePane = Box.createVerticalBox();
+ final JLabel emptyLabel = new JLabel("");
+
+ // grid setup
+ final JPanel gridPane = new JPanel(new GridBagLayout());
+ gridPane.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+
+ final Border paddingBorder = BorderFactory.createEmptyBorder(0, 10, 10, 0);
+ gridPane.setBorder(BorderFactory.createCompoundBorder(paddingBorder,paddingBorder));
+
+ final GridBagConstraints c = new GridBagConstraints();
+ c.fill = GridBagConstraints.HORIZONTAL;
+ int gridRow = 0;
+ c.weightx = 0.5;
+
+
+ // table headers
+ final JLabel componentHeader = new JLabel(TextUtils.getText("updater.component"), SwingConstants.CENTER);
+ final JLabel installedVersionHeader = new JLabel(TextUtils.getText("updater.version.installed"), SwingConstants.CENTER);
+ final JLabel latestVersionHeader = new JLabel(TextUtils.getText("updater.version.latest"), SwingConstants.CENTER);
+
+ final Font boldFont = new Font(componentHeader.getFont().getName(),Font.BOLD,componentHeader.getFont().getSize());
+
+ componentHeader.setFont(boldFont);
+ installedVersionHeader.setFont(boldFont);
+ latestVersionHeader.setFont(boldFont);
+
+ componentHeader.setBorder(paddingBorder);
+ installedVersionHeader.setBorder(paddingBorder);
+ latestVersionHeader.setBorder(paddingBorder);
+
+ // adding headers
+ c.gridy = 0;
+
+ c.gridx = 0;
+ gridPane.add(componentHeader, c);
+ c.gridx = 1;
+ gridPane.add(installedVersionHeader, c);
+ c.gridx = 2;
+ gridPane.add(latestVersionHeader, c);
+ c.gridx = 3;
+ gridPane.add(emptyLabel, c);
+ c.gridx = 4;
+ gridPane.add(emptyLabel, c);
+
+ // first row : freeplane
+ c.gridy = 1;
+
+ final JLabel freeplaneLabel = new JLabel("Freeplane");
+ final FreeplaneVersion freeplaneLocalVersion = FreeplaneVersion.getVersion();
+ final JLabel freeplaneInstalledVersionLabel = new JLabel(freeplaneLocalVersion.toString(), SwingConstants.CENTER);
+ final JLabel freeplaneLatestVersionLabel;
+
+ JButton updateButton;
+ JButton changelogButton;
+ final Locale defaultLocale = Locale.getDefault();
+ final String language = defaultLocale.getLanguage();
+ final String translatedWebUpdate = getWebUpdateUrl(language);
+
+ changelogButton = new JButton(TextUtils.getText("updater.viewChangelog"));
+ changelogButton.addActionListener(openUrlListener);
+ changelogButton.setActionCommand(translatedWebUpdate);
+
+ updateButton = new JButton(TextUtils.getText("updater.goToDownload"));
+ updateButton.addActionListener(openUrlListener);
+ updateButton.setActionCommand("http://freeplane.sourceforge.net");
+
+ Boolean needsUpdate = Boolean.FALSE;
+ if (freeplaneLatestVersion != null) {
+ if (freeplaneLocalVersion.compareTo(freeplaneLatestVersion) < 0) {
+ needsUpdate = Boolean.TRUE;
+ } else {
+ needsUpdate = Boolean.FALSE;
+ }
+ freeplaneLatestVersionLabel = new JLabel(freeplaneLatestVersion.toString(), SwingConstants.CENTER);
+ } else {
+ freeplaneLatestVersionLabel = new JLabel(TextUtils.getText("updater.version.unknown"), SwingConstants.CENTER);
+ freeplaneLatestVersionLabel.setToolTipText(TextUtils.getText(info));
+ }
+ changelogButton.setEnabled(needsUpdate);
+ updateButton.setEnabled(needsUpdate);
+
+ c.gridx = 0;
+ gridPane.add(freeplaneLabel, c);
+ c.gridx = 1;
+ gridPane.add(freeplaneInstalledVersionLabel, c);
+ c.gridx = 2;
+ gridPane.add(freeplaneLatestVersionLabel, c);
+ c.gridx = 3;
+ gridPane.add(changelogButton, c);
+ c.gridx = 4;
+ gridPane.add(updateButton, c);
+
+
+ final List<AddOnProperties> installedAddOns = AddOnsController.getController().getInstalledAddOns();
+ gridRow = 3;
+ for (AddOnProperties addOnProperties : installedAddOns) {
+ FreeplaneVersion addOnLocalVersion = toFreeplaneVersion(addOnProperties.getVersion());
+ FreeplaneVersion addOnLatestVersion = toFreeplaneVersion(addOnProperties.getLatestVersion());
+
+ final JLabel addOnInstalledVersionLabel = new JLabel(addOnLocalVersion.toString(), SwingConstants.CENTER);
+ final JLabel addOnLatestVersionLabel;
+ needsUpdate = Boolean.FALSE;
+ if (addOnLatestVersion != null) {
+ if (addOnLocalVersion.compareTo(addOnLatestVersion) < 0) {
+ needsUpdate = Boolean.TRUE;
+ }
+ addOnLatestVersionLabel = new JLabel(addOnLatestVersion.toString(), SwingConstants.CENTER);
+ } else {
+ addOnLatestVersionLabel = new JLabel(TextUtils.getText("updater.version.unknown"), SwingConstants.CENTER);
+ if (addOnProperties.getUpdateUrl() != null) {
+ addOnLatestVersionLabel.setToolTipText(TextUtils.getText("updater.version.unreachable") + " " + addOnProperties.getUpdateUrl());
+ } else {
+ addOnLatestVersionLabel.setToolTipText(TextUtils.getText("updater.version.noUpdateUrl"));
+ }
+ }
+
+ final JLabel addOnLabel = new JLabel(TextUtils.getText("addons." + addOnProperties.getName()));
+ c.gridx = 0;
+ c.gridy = gridRow;
+ gridPane.add(addOnLabel, c);
+
+ c.gridx = 1;
+ c.gridy = gridRow;
+ gridPane.add(addOnInstalledVersionLabel, c);
+
+ c.gridx = 2;
+ c.gridy = gridRow;
+ gridPane.add(addOnLatestVersionLabel, c);
+
+ c.gridx = 3;
+ c.gridy = gridRow;
+ changelogButton = new JButton(TextUtils.getText("updater.viewChangelog"));
+ changelogButton.addActionListener(openUrlListener);
+ if (addOnProperties.getLatestVersionChangelogUrl() != null) {
+ changelogButton.setActionCommand(addOnProperties.getLatestVersionChangelogUrl().toString());
+ } else if (addOnProperties.getUpdateUrl() != null) {
+ changelogButton.setActionCommand(String.valueOf(addOnProperties.getUpdateUrl()));
+ }
+ gridPane.add(changelogButton,c );
+ changelogButton.setEnabled(needsUpdate);
+
+ c.gridx = 4;
+ c.gridy = gridRow;
+ updateButton = new JButton(TextUtils.getText("updater.goToDownload"));
+ updateButton.addActionListener(openUrlListener);
+ if (addOnProperties.getLatestVersionDownloadUrl() != null) {
+ updateButton.setActionCommand(addOnProperties.getLatestVersionDownloadUrl().toString());
+ } else if (addOnProperties.getHomepage() != null) {
+ updateButton.setActionCommand(addOnProperties.getHomepage().toString());
+ }
+ gridPane.add(updateButton, c);
+ updateButton.setEnabled(needsUpdate);
+
+ gridRow++;
+ }
+ messagePane.add(gridPane);
+
+
+ final JLabel confLabel = new JLabel(TextUtils.getText("preferences"));
+ confLabel.setFont(boldFont);
+ messagePane.add(confLabel);
+ final JCheckBox updateAutomatically = new JCheckBox(TextUtils
+ .getText("OptionPanel.check_updates_automatically"), ResourceController.getResourceController()
+ .getBooleanProperty(CHECK_UPDATES_AUTOMATICALLY));
+ updateAutomatically.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+ messagePane.add(updateAutomatically);
+ final Object[] options;
+ options = new Object[] { TextUtils.getText("simplyhtml.closeBtnName") };
+
+
+ final int choice = JOptionPane.showOptionDialog(UITools.getMenuComponent(), messagePane,
+ TextUtils.getText("updatecheckdialog"), JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null,
+ options, options[0]);
+ ResourceController.getResourceController().setProperty(CHECK_UPDATES_AUTOMATICALLY,
+ Boolean.toString(updateAutomatically.isSelected()));
+ return choice;
+ }
+
+ // note: FreeplaneVersion.getVersion() handles leading 'v' gracefully
+ private FreeplaneVersion toFreeplaneVersion(String versionString) {
+ try {
+ return FreeplaneVersion.getVersion(versionString);
+ } catch (Exception e) {
+ return FreeplaneVersion.getVersion("0.0.0");
+ }
+ }
+
+
+ private ActionListener openUrlListener = new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ try {
+ Controller.getCurrentController().getViewController().openDocument(
+ new URL( ((JButton) e.getSource()).getActionCommand()) );
+ }
+ catch (final MalformedURLException ex) {
+ UITools.errorMessage(TextUtils.getText("url_error") + "\n" + ex);
+ }
+ catch (final Exception ex) {
+ UITools.errorMessage(ex);
+ }
+ }
+ };
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/DeleteLevelStyleAction.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/DeleteLevelStyleAction.java
new file mode 100644
index 0000000..5a2e57f
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/DeleteLevelStyleAction.java
@@ -0,0 +1,81 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.mindmapmode.stylemode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.StyleFactory;
+
+/**
+ * @author Dimitry Polivaev
+ * 02.10.2009
+ */
+public class DeleteLevelStyleAction extends AFreeplaneAction {
+ public DeleteLevelStyleAction() {
+ super("DeleteLevelStyleAction");
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ final SModeController modeController = (SModeController) Controller.getCurrentModeController();
+ final MapModel map = Controller.getCurrentController().getMap();
+ final MapStyleModel styleModel = MapStyleModel.getExtension(map);
+ NodeModel levelStyleParentNode = styleModel.getStyleNodeGroup(map, MapStyleModel.STYLES_AUTOMATIC_LAYOUT);
+ final int childNumber = levelStyleParentNode.getChildCount() - 1;
+ if (childNumber < 1) {
+ UITools.errorMessage(TextUtils.getText("can_not_delete_root_style"));
+ return;
+ }
+ final String styleName = "AutomaticLayout.level," + childNumber;
+ final IStyle styleObject = StyleFactory.create(TranslatedObject.format(styleName));
+ final MMapController mapController = (MMapController) modeController.getMapController();
+ final NodeModel node = styleModel.getStyleNode(styleObject);
+ mapController.deleteNode(node);
+ final IActor actor = new IActor() {
+ public void undo() {
+ styleModel.addStyleNode(node);
+ }
+
+ public String getDescription() {
+ return "DeleteStyle";
+ }
+
+ public void act() {
+ styleModel.removeStyleNode(node);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/DeleteUserStyleAction.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/DeleteUserStyleAction.java
new file mode 100644
index 0000000..66a8c24
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/DeleteUserStyleAction.java
@@ -0,0 +1,82 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.mindmapmode.stylemode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.StyleTranslatedObject;
+
+/**
+ * @author Dimitry Polivaev
+ * 02.10.2009
+ */
+public class DeleteUserStyleAction extends AFreeplaneAction {
+ public DeleteUserStyleAction() {
+ super("DeleteUserStyleAction");
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final Controller controller = modeController.getController();
+ final NodeModel selected = controller.getSelection().getSelected();
+ if (selected.depth() < 2) {
+ UITools.errorMessage(TextUtils.getText("can_not_delete_style_group"));
+ return;
+ }
+ final MapModel map = selected.getMap();
+ final MapStyleModel styleModel = MapStyleModel.getExtension(map);
+ final NodeModel styleNodeGroup = styleModel.getStyleNodeGroup(selected);
+ if (! ((StyleTranslatedObject)styleNodeGroup.getUserObject()).getObject().equals("styles.user-defined")) {
+ UITools.errorMessage(TextUtils.getText("can_not_delete_predefined_style"));
+ return;
+ }
+ final MMapController mapController = (MMapController) modeController.getMapController();
+ mapController.deleteNode(selected);
+ final IActor actor = new IActor() {
+ public void undo() {
+ styleModel.addStyleNode(selected);
+ }
+
+ public String getDescription() {
+ return "DeleteStyle";
+ }
+
+ public void act() {
+ styleModel.removeStyleNode(selected);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/DialogController.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/DialogController.java
new file mode 100644
index 0000000..1dc50b6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/DialogController.java
@@ -0,0 +1,149 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.mindmapmode.stylemode;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Cursor;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JLayeredPane;
+import javax.swing.JScrollPane;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.main.application.Browser;
+import org.freeplane.features.ui.FrameController;
+import org.freeplane.view.swing.map.MapViewScrollPane;
+
+class DialogController extends FrameController {
+ final private JDialog dialog;
+
+ public JDialog getDialog() {
+ return dialog;
+ }
+
+ private JScrollPane mapViewScrollPane = null;
+
+ /** Contains the value where the Note Window should be displayed (right, left, top, bottom) */
+ /** Contains the Note Window Component
+ * @param controller */
+ public DialogController(Controller controller, final IMapViewManager mapViewController, final JDialog dialog) {
+ super(controller, mapViewController, "dialog_");
+ this.dialog = dialog;
+ dialog.getContentPane().setLayout(new BorderLayout());
+ mapViewScrollPane = new MapViewScrollPane();
+ dialog.getContentPane().add(mapViewScrollPane, BorderLayout.CENTER);
+ }
+
+ @Override
+ public FreeplaneMenuBar getFreeplaneMenuBar() {
+ return (FreeplaneMenuBar) dialog.getJMenuBar();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.main.FreeplaneMain#getLayeredPane()
+ */
+ public JLayeredPane getLayeredPane() {
+ return dialog.getLayeredPane();
+ }
+
+ @Override
+ public void insertComponentIntoSplitPane(final JComponent pMindMapComponent) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean isApplet() {
+ return false;
+ }
+
+ @Override
+ public void openDocument(final URI uri) throws IOException {
+ new Browser().openDocument(uri);
+ }
+
+ /**
+ * Open url in WWW browser. This method hides some differences between
+ * operating systems.
+ */
+ @Override
+ public void openDocument(final URL url) throws Exception {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ protected void setFreeplaneMenuBar(final FreeplaneMenuBar menuBar) {
+ dialog.setJMenuBar(menuBar);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.main.FreeplaneMain#setTitle(java.lang.String)
+ */
+ @Override
+ public void setTitle(final String frameTitle) {
+ dialog.setTitle(frameTitle);
+ }
+
+ @Override
+ public void setWaitingCursor(final boolean waiting) {
+ if (waiting) {
+ dialog.getRootPane().getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ dialog.getRootPane().getGlassPane().setVisible(true);
+ }
+ else {
+ dialog.getRootPane().getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ dialog.getRootPane().getGlassPane().setVisible(false);
+ }
+ }
+
+ @Override
+ public void removeSplitPane() {
+ throw new UnsupportedOperationException();
+ }
+
+ public void setMapView(Component mapViewComponent) {
+ mapViewScrollPane.getViewport().setView(mapViewComponent);
+ }
+
+ public void previousMapView() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ public void nextMapView() {
+ throw new RuntimeException("Method not implemented");
+ }
+
+ @Override
+ public Component getCurrentRootComponent() {
+ return dialog;
+ }
+
+ @Override
+ public Component getMenuComponent() {
+ return dialog;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/EditStylesAction.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/EditStylesAction.java
new file mode 100644
index 0000000..97b38bd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/EditStylesAction.java
@@ -0,0 +1,150 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.mindmapmode.stylemode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.resources.WindowConfigurationStorage;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.ui.ViewController;
+
+/**
+ * @author Dimitry Polivaev
+ * 13.09.2009
+ */
+ at SuppressWarnings("serial")
+public class EditStylesAction extends AFreeplaneAction {
+ private Controller mainController = null;
+ private SModeController modeController;
+ protected JDialog dialog;
+ private Component currentMapView;
+
+ public EditStylesAction() {
+ super("EditStylesAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller currentController = Controller.getCurrentController();
+ final MapModel map = currentController.getMap();
+ final MapStyleModel mapStyleModel = MapStyleModel.getExtension(map);
+ final MapModel styleMap = mapStyleModel.getStyleMap();
+ if(styleMap == null){
+ UITools.errorMessage(TextUtils.getText("no_styles_found_in_map"));
+ return;
+ }
+
+ final IMapViewManager mapViewManager = currentController.getMapViewManager();
+ currentMapView = mapViewManager.getMapViewComponent();
+ mapViewManager.changeToMapView((Component)null);
+
+ final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ undoHandler.startTransaction();
+ init();
+ SModeController modeController = getModeController();
+ modeController.getMapController().newMapView(styleMap);
+ Controller controller = modeController.getController();
+ Component mapViewComponent = controller.getMapViewManager().getMapViewComponent();
+ ((DialogController) controller.getViewController()).setMapView(mapViewComponent);
+ dialog.setLocationRelativeTo(currentController.getViewController().getCurrentRootComponent());
+ dialog.setVisible(true);
+ }
+
+ void commit() {
+ final Controller currentController = Controller.getCurrentController();
+ final MapModel currentMap = currentController.getMap();
+ LogicalStyleController.getController().refreshMap(currentMap);
+ final ModeController currentModeController = Controller.getCurrentModeController();
+ currentModeController.commit();
+ }
+
+ void rollback() {
+ Controller.getCurrentModeController().rollback();
+ }
+
+ SModeController getModeController() {
+ return modeController;
+ }
+
+ private void init() {
+ this.mainController = Controller.getCurrentController();
+ if (dialog != null) {
+ Controller.setCurrentController ((Controller) dialog.getRootPane().getClientProperty(Controller.class));
+ return;
+ }
+ dialog = new JDialog(UITools.getCurrentFrame());
+ final WindowConfigurationStorage windowConfigurationStorage = new WindowConfigurationStorage(getKey() + ".dialog");
+ windowConfigurationStorage.restoreDialogPositions(dialog);
+ dialog.setModal(true);
+ dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
+ dialog.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(final WindowEvent e) {
+ getModeController().tryToCloseDialog();
+ }
+ });
+ Controller styleDialogController = SModeControllerFactory.getInstance().createController(dialog);
+ modeController = (SModeController) styleDialogController.getModeController();
+ final ViewController viewController = styleDialogController.getViewController();
+ viewController.init(styleDialogController);
+ dialog.addComponentListener(new ComponentAdapter() {
+ @Override
+ public void componentHidden(final ComponentEvent e) {
+ final WindowConfigurationStorage windowConfigurationStorage = new WindowConfigurationStorage(getKey() + ".dialog");
+ windowConfigurationStorage.storeDialogPositions(dialog);
+ final IMapViewManager mapViewManager = modeController.getController().getMapViewManager();
+ final MapModel map = mapViewManager.getModel();
+ final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ mapViewManager.close(true);
+ Controller.setCurrentController(mainController);
+ super.componentHidden(e);
+ mainController.getMapViewManager().changeToMapView(currentMapView);
+ currentMapView = null;
+ switch (modeController.getStatus()) {
+ case JOptionPane.OK_OPTION:
+ if (undoHandler.canUndo()) {
+ commit();
+ break;
+ }
+ //$FALL-THROUGH$
+ case JOptionPane.CANCEL_OPTION:
+ rollback();
+ }
+ }
+
+ });
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/NewLevelStyleAction.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/NewLevelStyleAction.java
new file mode 100644
index 0000000..bf8d2a2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/NewLevelStyleAction.java
@@ -0,0 +1,76 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.mindmapmode.stylemode;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.StyleFactory;
+
+/**
+ * @author Dimitry Polivaev
+ * 02.10.2009
+ */
+public class NewLevelStyleAction extends AFreeplaneAction {
+ public NewLevelStyleAction() {
+ super("NewLevelStyleAction");
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final MapStyleModel styleModel = MapStyleModel.getExtension(map);
+ NodeModel levelStyleParentNode = styleModel.getStyleNodeGroup(map, MapStyleModel.STYLES_AUTOMATIC_LAYOUT);
+ final String styleName = "AutomaticLayout.level," + levelStyleParentNode.getChildCount();
+ final IStyle styleObject = StyleFactory.create(TranslatedObject.format(styleName));
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ final NodeModel node = new NodeModel(map);
+ node.setUserObject(styleObject);
+ mapController.insertNode(node, levelStyleParentNode, false, false, true);
+ mapController.select(node);
+ final IActor actor = new IActor() {
+ public void undo() {
+ styleModel.removeStyleNode(node);
+ }
+
+ public String getDescription() {
+ return "NewLevelStyle";
+ }
+
+ public void act() {
+ styleModel.addStyleNode(node);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/NewUserStyleAction.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/NewUserStyleAction.java
new file mode 100644
index 0000000..e3754d4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/NewUserStyleAction.java
@@ -0,0 +1,98 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.mindmapmode.stylemode;
+
+import java.awt.event.ActionEvent;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.mindmapmode.MIconController.Keys;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleKeys;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.StyleFactory;
+import org.freeplane.features.styles.StyleTranslatedObject;
+
+/**
+ * @author Dimitry Polivaev
+ * 02.10.2009
+ */
+public class NewUserStyleAction extends AFreeplaneAction {
+ public NewUserStyleAction() {
+ super("NewUserStyleAction");
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent e) {
+ final String styleName = JOptionPane.showInputDialog(TextUtils.getText("enter_new_style_name"));
+ if (styleName == null) {
+ return;
+ }
+ final Controller controller = Controller.getCurrentController();
+ final NodeModel selectedNode = controller.getSelection().getSelected();
+ final MapModel map = controller.getMap();
+ final MapStyleModel styleModel = MapStyleModel.getExtension(map);
+ final IStyle style = StyleFactory.create(styleName);
+ if (null != styleModel.getStyleNode(style)) {
+ UITools.errorMessage(TextUtils.getText("style_already_exists"));
+ return;
+ }
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ final NodeModel newNode = new NodeModel(map);
+ newNode.setUserObject(style);
+ Controller.getCurrentModeController().copyExtensions(LogicalStyleKeys.NODE_STYLE, selectedNode, newNode);
+ Controller.getCurrentModeController().copyExtensions(Keys.ICONS, selectedNode, newNode);
+ NodeModel userStyleParentNode = styleModel.getStyleNodeGroup(map, MapStyleModel.STYLES_USER_DEFINED);
+ if(userStyleParentNode == null){
+ userStyleParentNode = new NodeModel(map);
+ userStyleParentNode.setUserObject(new StyleTranslatedObject(MapStyleModel.STYLES_USER_DEFINED));
+ mapController.insertNode(userStyleParentNode, map.getRootNode(), false, false, true);
+
+ }
+ mapController.insertNode(newNode, userStyleParentNode, false, false, true);
+ mapController.select(newNode);
+ final IActor actor = new IActor() {
+ public void undo() {
+ styleModel.removeStyleNode(newNode);
+ }
+
+ public String getDescription() {
+ return "NewStyle";
+ }
+
+ public void act() {
+ styleModel.addStyleNode(newNode);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, map);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/SModeController.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/SModeController.java
new file mode 100644
index 0000000..ff7e608
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/SModeController.java
@@ -0,0 +1,131 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.mindmapmode.stylemode;
+
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.ui.IMapViewManager;
+
+/**
+ * @author Dimitry Polivaev
+ * 18.09.2009
+ */
+class SModeController extends MModeController {
+
+ @SuppressWarnings("serial")
+ public SModeController(final Controller controller) {
+ super(controller);
+ final Window dialog = ((DialogController) controller.getViewController()).getDialog();
+ dialog.addComponentListener(new ComponentAdapter() {
+ public void componentShown(final ComponentEvent e) {
+ status = JOptionPane.DEFAULT_OPTION;
+ }
+ });
+ final String key = "styledialog";
+ AFreeplaneAction okAction = new AFreeplaneAction(key + ".ok") {
+ public void actionPerformed(final ActionEvent e) {
+ status = JOptionPane.OK_OPTION;
+ closeDialog();
+ }
+ };
+ controller.addAction(okAction);
+ AFreeplaneAction cancelAction = new AFreeplaneAction(key + ".cancel") {
+ public void actionPerformed(final ActionEvent e) {
+ status = JOptionPane.CANCEL_OPTION;
+ closeDialog();
+ }
+ };
+ controller.addAction(cancelAction);
+ AFreeplaneAction tryToCloseAction = new AFreeplaneAction("QuitAction") {
+ public void actionPerformed(final ActionEvent e) {
+ tryToCloseDialog();
+ }
+ };
+ controller.addAction(tryToCloseAction);
+ }
+
+ private int status = JOptionPane.DEFAULT_OPTION;
+
+ public int getStatus() {
+ return status;
+ }
+
+ static public final String MODENAME = "StyleMap";
+
+ @Override
+ public String getModeName() {
+ return SModeController.MODENAME;
+ }
+
+
+ protected void closeDialog() {
+ final Window dialog = ((DialogController) getController().getViewController()).getDialog();
+ dialog.setVisible(false);
+ }
+
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
+ void tryToCloseDialog() {
+ final IMapViewManager mapViewManager = getController().getMapViewManager();
+ final MapModel map = mapViewManager.getModel();
+ final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ final Window dialog = ((DialogController) getController().getViewController()).getDialog();
+ if (! undoHandler.canUndo()){
+ dialog.setVisible(false);
+ return;
+ }
+ final String text = TextUtils.getText("save_unsaved_styles");
+ final String title = TextUtils.getText("SaveAction.text");
+ final int returnVal = JOptionPane.showOptionDialog(
+ dialog, text, title,
+ JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
+ if ((returnVal == JOptionPane.CANCEL_OPTION) || (returnVal == JOptionPane.CLOSED_OPTION)) {
+ return;
+ }
+ setStatus(returnVal == JOptionPane.YES_OPTION ? JOptionPane.OK_OPTION : JOptionPane.CANCEL_OPTION);
+ dialog.setVisible(false);
+ }
+
+ @Override
+ public void startup() {
+ }
+
+ public boolean canEdit(NodeModel model) {
+ return model.getNodeLevel(true) >= 2;
+ }
+
+ public boolean shouldCenterCompactMaps() {
+ return true;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/SModeControllerFactory.java b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/SModeControllerFactory.java
new file mode 100644
index 0000000..af62c5e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/mindmapmode/stylemode/SModeControllerFactory.java
@@ -0,0 +1,227 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.mindmapmode.stylemode;
+
+import java.awt.EventQueue;
+import java.util.Collections;
+import java.util.Set;
+
+import javax.swing.JDialog;
+import javax.swing.JPopupMenu;
+import javax.swing.JScrollPane;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.SetAcceleratorOnNextClickAction;
+import org.freeplane.core.ui.ShowSelectionAsRectangleAction;
+import org.freeplane.core.ui.components.FreeplaneToolBar;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.ModelessAttributeController;
+import org.freeplane.features.attribute.mindmapmode.MAttributeController;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.cloud.mindmapmode.MCloudController;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.edge.mindmapmode.MEdgeController;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.ScannerController;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.mindmapmode.MIconController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mapio.mindmapmode.MMapIO;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.mindmapmode.MNoteController;
+import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
+import org.freeplane.features.styles.mindmapmode.MUIFactory;
+import org.freeplane.features.styles.mindmapmode.ShowFormatPanelAction;
+import org.freeplane.features.styles.mindmapmode.StyleEditorPanel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.ui.ToggleToolbarAction;
+import org.freeplane.features.ui.UIComponentVisibilityDispatcher;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+import org.freeplane.view.swing.map.MapViewController;
+import org.freeplane.view.swing.map.ViewLayoutTypeAction;
+import org.freeplane.view.swing.map.attribute.EditAttributesAction;
+import org.freeplane.view.swing.map.mindmapmode.MMapViewController;
+import org.freeplane.view.swing.ui.DefaultNodeMouseMotionListener;
+import org.freeplane.view.swing.ui.UserInputListenerFactory;
+import org.freeplane.view.swing.ui.mindmapmode.MMapMouseListener;
+import org.freeplane.view.swing.ui.mindmapmode.MNodeMouseWheelListener;
+
+/**
+ * @author Dimitry Polivaev 24.11.2008
+ */
+public class SModeControllerFactory {
+ private static SModeControllerFactory instance;
+
+ static SModeControllerFactory getInstance() {
+ if (instance == null) {
+ instance = new SModeControllerFactory();
+ }
+ return instance;
+ }
+
+ private SModeController modeController;
+
+ Controller createController(final JDialog dialog) {
+ final Controller controller = new Controller(ResourceController.getResourceController());
+ Controller.setCurrentController(controller);
+ final MapViewController mapViewController = new MMapViewController(controller);
+ final DialogController viewController = new DialogController(controller, mapViewController, dialog);
+ controller.setViewController(viewController);
+ FilterController.install();
+ TextController.install();
+ controller.addAction(new ViewLayoutTypeAction(MapViewLayout.OUTLINE));
+ controller.addAction(new ShowSelectionAsRectangleAction());
+ modeController = new SModeController(controller);
+ controller.selectModeForBuild(modeController);
+ modeController.addAction(new NewUserStyleAction());
+ modeController.addAction(new DeleteUserStyleAction());
+ modeController.addAction(new NewLevelStyleAction());
+ modeController.addAction(new DeleteLevelStyleAction());
+ modeController.addAction(new SetAcceleratorOnNextClickAction());
+ final UserInputListenerFactory userInputListenerFactory = new UserInputListenerFactory(modeController);
+ userInputListenerFactory.setNodeMouseMotionListener(new DefaultNodeMouseMotionListener());
+ userInputListenerFactory.setNodeMouseWheelListener(new MNodeMouseWheelListener(userInputListenerFactory.getMapMouseWheelListener()));
+ modeController.setUserInputListenerFactory(userInputListenerFactory);
+ controller.addExtension(ModelessAttributeController.class, new ModelessAttributeController());
+ new MMapController(modeController);
+ TextController.install(new MTextController(modeController));
+ SpellCheckerController.install(modeController);
+ IconController.install(new MIconController(modeController));
+ NodeStyleController.install(new MNodeStyleController(modeController));
+ LocationController.install(new MLocationController());
+ EdgeController.install(new MEdgeController(modeController));
+ CloudController.install(new MCloudController(modeController));
+ NoteController.install(new MNoteController(modeController));
+ LinkController.install(new MLinkController(modeController));
+ MFileManager.install(new MFileManager());
+ MMapIO.install(modeController);
+ final MLogicalStyleController logicalStyleController = new MLogicalStyleController(modeController);
+ logicalStyleController.initS();
+ LogicalStyleController.install(logicalStyleController);
+ AttributeController.install(new MAttributeController(modeController));
+ FormatController.install(new FormatController());
+ final ScannerController scannerController = new ScannerController();
+ ScannerController.install(scannerController);
+ scannerController.addParsersForStandardFormats();
+ modeController.addAction(new EditAttributesAction());
+ userInputListenerFactory.setMapMouseListener(new MMapMouseListener());
+ final JPopupMenu popupmenu = new JPopupMenu();
+ userInputListenerFactory.setNodePopupMenu(popupmenu);
+ final FreeplaneToolBar toolBar = new FreeplaneToolBar("main_toolbar", SwingConstants.HORIZONTAL);
+ UIComponentVisibilityDispatcher.install(viewController, toolBar, "toolbarVisible");
+ userInputListenerFactory.addToolBar("/main_toolbar", ViewController.TOP, toolBar);
+ userInputListenerFactory.addToolBar("/icon_toolbar", ViewController.LEFT, ((MIconController) IconController
+ .getController()).getIconToolBarScrollPane());
+ userInputListenerFactory.addToolBar("/status", ViewController.BOTTOM, controller.getViewController()
+ .getStatusBar());
+ modeController.addAction(new ToggleToolbarAction("ToggleLeftToolbarAction", "/icon_toolbar"));
+ MapStyle.install(false);
+ controller.addModeController(modeController);
+ controller.selectModeForBuild(modeController);
+ final SModeController modeController = this.modeController;
+ final StyleEditorPanel styleEditorPanel = new StyleEditorPanel(modeController, null, false);
+ modeController.addAction(new ShowFormatPanelAction());
+ final MapController mapController = modeController.getMapController();
+ mapController.addNodeSelectionListener(new INodeSelectionListener() {
+ public void onSelect(final NodeModel node) {
+ final IMapSelection selection = controller.getSelection();
+ if (selection == null) {
+ return;
+ }
+ if (selection.size() == 1 && node.depth() >= 2) {
+ return;
+ }
+ final NodeModel nextSelection;
+ if (node.depth() < 2) {
+ if (node.depth() == 1 && node.hasChildren()) {
+ nextSelection = (NodeModel) node.getChildAt(0);
+ }
+ else {
+ nextSelection = (NodeModel) (node.getMap().getRootNode().getChildAt(0).getChildAt(0));
+ }
+ }
+ else {
+ nextSelection = node;
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ selection.selectAsTheOnlyOneSelected(nextSelection);
+ }
+ });
+ }
+
+
+ public void onDeselect(final NodeModel node) {
+ }
+ });
+
+ mapController.addNodeChangeListener(new INodeChangeListener() {
+ public void nodeChanged(NodeChangeEvent event) {
+ final NodeModel node = event.getNode();
+ if(node.getUserObject().equals(MapStyleModel.DEFAULT_STYLE)){
+ mapController.fireMapChanged(new MapChangeEvent(this, node.getMap(), MapStyle.MAP_STYLES, null, null));
+ }
+ }
+ });
+
+
+ final JScrollPane styleScrollPane = new JScrollPane(styleEditorPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
+ JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ UITools.setScrollbarIncrement(styleScrollPane);
+ // styleEditorPanel.setPreferredSize(new Dimension(200, 200));
+ userInputListenerFactory.addToolBar("/format", ViewController.RIGHT, styleScrollPane);
+ UIComponentVisibilityDispatcher.install(viewController, styleScrollPane, "styleScrollPaneVisible");
+ modeController.addExtension(MUIFactory.class, new MUIFactory());
+ final Set<String> emptySet = Collections.emptySet();
+ modeController.updateMenus("/xml/stylemodemenu.xml", emptySet);
+ this.modeController = null;
+ return controller;
+ }
+
+ public static void install() {
+ ModeController modeController = Controller.getCurrentModeController();
+ modeController.addAction(new EditStylesAction());
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/osgi/Activator.java b/freeplane/src/main/java/org/freeplane/main/osgi/Activator.java
similarity index 100%
rename from freeplane/src/org/freeplane/main/osgi/Activator.java
rename to freeplane/src/main/java/org/freeplane/main/osgi/Activator.java
diff --git a/freeplane/src/main/java/org/freeplane/main/osgi/ActivatorImpl.java b/freeplane/src/main/java/org/freeplane/main/osgi/ActivatorImpl.java
new file mode 100644
index 0000000..32985e6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/osgi/ActivatorImpl.java
@@ -0,0 +1,273 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.osgi;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.jar.Manifest;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.main.application.FreeplaneGUIStarter;
+import org.freeplane.main.application.FreeplaneStarter;
+import org.freeplane.main.application.SingleInstanceManager;
+import org.freeplane.main.headlessmode.FreeplaneHeadlessStarter;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.url.URLConstants;
+import org.osgi.service.url.URLStreamHandlerService;
+
+/**
+ * @author Dimitry Polivaev
+ * 05.01.2009
+ */
+class ActivatorImpl implements BundleActivator {
+ private static final String HEADLESS_RUN_PROPERTY_NAME = FreeplaneStarter.class.getName() + ".headless";
+ private FreeplaneStarter starter;
+
+ private String[] getCallParameters() {
+ String param;
+ final LinkedList<String> parameters = new LinkedList<String>();
+ for (int i = 1;; i++) {
+ param = System.getProperty("org.freeplane.param" + i, null);
+ if (param == null) {
+ break;
+ }
+ if (param.equals("")) {
+ continue;
+ }
+ parameters.add(param);
+ }
+ final String[] array = parameters.toArray(new String[parameters.size()]);
+ return array;
+ }
+
+ public void start(final BundleContext context) throws Exception {
+ try {
+ startFramework(context);
+ }
+ catch (final Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+ catch (final Error e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ private void loadPlugins(final BundleContext context) {
+ final String resourceBaseDir = FreeplaneGUIStarter.getResourceBaseDir();
+ final File baseDir = new File(resourceBaseDir).getAbsoluteFile().getParentFile();
+ List<Bundle> loadedPlugins = new LinkedList<Bundle>();
+ loadPlugins(context, new File(baseDir, "plugins"), loadedPlugins);
+ final String freeplaneUserDirectory = Compat.getApplicationUserDirectory();
+ loadPlugins(context, new File(freeplaneUserDirectory), loadedPlugins);
+ for(Bundle plugin:loadedPlugins){
+ try{
+ plugin.start();
+ System.out.println("Started: " + plugin.getLocation() + " (id#" + plugin.getBundleId() + ")");
+ }
+ catch(Exception e){
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void loadPlugins(final BundleContext context, final File file, List<Bundle> loadedPlugins) {
+ if (!file.exists() || !file.isDirectory()) {
+ return;
+ }
+ final File manifest = new File(file, "META-INF/MANIFEST.MF");
+ if (manifest.exists()) {
+ InputStream manifestContent = null;
+ try {
+ manifestContent = new FileInputStream(manifest);
+ final Manifest bundleManifest = new Manifest(manifestContent);
+ final String name = bundleManifest.getMainAttributes().getValue("Bundle-SymbolicName");
+ if (name == null) {
+ return;
+ }
+ final Bundle[] bundles = context.getBundles();
+ for (int i = 0; i < bundles.length; i++) {
+ final Bundle installedBundle = bundles[i];
+ if (installedBundle.getSymbolicName().equals(name)) {
+ System.out.println("Bundle " + name + " already installed");
+ return;
+ }
+ }
+ final String location = "reference:file:" + file.getAbsolutePath();
+ final Bundle bundle = context.installBundle(location);
+ System.out.println("Installed: " + location + " (id#" + bundle.getBundleId() + ")");
+ loadedPlugins.add(bundle);
+ }
+ catch (final Exception e) {
+ e.printStackTrace();
+ }
+ finally {
+ FileUtils.silentlyClose(manifestContent);
+ }
+ return;
+ }
+ final File[] childFiles = file.listFiles();
+ for (int i = 0; i < childFiles.length; i++) {
+ final File child = childFiles[i];
+ loadPlugins(context, child, loadedPlugins);
+ }
+ }
+
+ private void startFramework(final BundleContext context) {
+ registerClasspathUrlHandler(context);
+ if (null == System.getProperty("org.freeplane.core.dir.lib", null)) {
+ final File root = new File(FreeplaneGUIStarter.getResourceBaseDir()).getAbsoluteFile().getParentFile();
+ try {
+ String rootUrl = root.toURI().toURL().toString();
+ if (!rootUrl.endsWith("/")) {
+ rootUrl = rootUrl + "/";
+ }
+ final String libUrl = rootUrl + "core/org.freeplane.core/lib/";
+ System.setProperty("org.freeplane.core.dir.lib", libUrl);
+ }
+ catch (final MalformedURLException e) {
+ }
+ }
+ // initialize ApplicationController - SingleInstanceManager needs the configuration
+ starter = createStarter();
+ final SingleInstanceManager singleInstanceManager = new SingleInstanceManager(starter);
+ singleInstanceManager.start(getCallParameters());
+ if (singleInstanceManager.isSlave()) {
+ LogUtils.info("opened files in master - exiting now");
+ System.exit(0);
+ }
+ else if (singleInstanceManager.isMasterPresent()) {
+ starter.setDontLoadLastMaps();
+ }
+ loadPlugins(context);
+ final Controller controller = starter.createController();
+ starter.createModeControllers(controller);
+ try {
+ final ServiceReference[] controllerProviders = context.getServiceReferences(
+ IControllerExtensionProvider.class.getName(), null);
+ if (controllerProviders != null) {
+ for (int i = 0; i < controllerProviders.length; i++) {
+ final ServiceReference controllerProvider = controllerProviders[i];
+ final IControllerExtensionProvider service = (IControllerExtensionProvider) context
+ .getService(controllerProvider);
+ service.installExtension(controller);
+ context.ungetService(controllerProvider);
+ }
+ }
+ }
+ catch (final InvalidSyntaxException e) {
+ e.printStackTrace();
+ }
+ try {
+ final Set<String> modes = controller.getModes();
+ for (final String modeName : modes) {
+ final ServiceReference[] modeControllerProviders = context.getServiceReferences(
+ IModeControllerExtensionProvider.class.getName(), "(mode=" + modeName + ")");
+ if (modeControllerProviders != null) {
+ final ModeController modeController = controller.getModeController(modeName);
+ Controller.getCurrentController().selectModeForBuild(modeController);
+ for (int i = 0; i < modeControllerProviders.length; i++) {
+ final ServiceReference modeControllerProvider = modeControllerProviders[i];
+ final IModeControllerExtensionProvider service = (IModeControllerExtensionProvider) context
+ .getService(modeControllerProvider);
+ service.installExtension(modeController);
+ context.ungetService(modeControllerProvider);
+ }
+ }
+ }
+ }
+ catch (final InvalidSyntaxException e) {
+ e.printStackTrace();
+ }
+ if ("true".equals(System.getProperty("org.freeplane.exit_on_start", null))) {
+ controller.getViewController().invokeLater(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(1000);
+ }
+ catch (final InterruptedException e) {
+ }
+ System.exit(0);
+ }
+ });
+ return;
+ }
+ controller.getViewController().invokeLater(new Runnable() {
+ public void run() {
+ final Bundle[] bundles = context.getBundles();
+ final HashSet<String> plugins = new HashSet<String>();
+ for(Bundle bundle:bundles){
+ if (bundle.getState() == Bundle.ACTIVE)
+ plugins.add(bundle.getSymbolicName());
+ }
+ FilterController.getController(controller).loadDefaultConditions();
+ starter.buildMenus(controller, plugins);
+ starter.createFrame(getCallParameters());
+ }
+ });
+ }
+
+ public FreeplaneStarter createStarter() {
+ if(Boolean.getBoolean(HEADLESS_RUN_PROPERTY_NAME))
+ return new FreeplaneHeadlessStarter();
+ else
+ return new FreeplaneGUIStarter(getCallParameters());
+ }
+
+ private void registerClasspathUrlHandler(final BundleContext context) {
+ Hashtable<String, String[]> properties = new Hashtable<String, String[]>();
+ properties.put(URLConstants.URL_HANDLER_PROTOCOL, new String[] { ResourceController.FREEPLANE_RESOURCE_URL_PROTOCOL });
+ context.registerService(URLStreamHandlerService.class.getName(), new ResourcesUrlHandler(), properties);
+ }
+
+ public void stop(final BundleContext context) throws Exception {
+ starter.stop();
+ final Bundle[] bundles = context.getBundles();
+ for (int i = 0; i < bundles.length; i++) {
+ final Bundle bundle = bundles[i];
+ if (bundle.getState() >= Bundle.ACTIVE && bundle.getSymbolicName().startsWith("org.freeplane.plugin.")) {
+ try {
+ bundle.stop();
+ }
+ catch (final Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/main/osgi/IControllerExtensionProvider.java b/freeplane/src/main/java/org/freeplane/main/osgi/IControllerExtensionProvider.java
similarity index 100%
rename from freeplane/src/org/freeplane/main/osgi/IControllerExtensionProvider.java
rename to freeplane/src/main/java/org/freeplane/main/osgi/IControllerExtensionProvider.java
diff --git a/freeplane/src/org/freeplane/main/osgi/IModeControllerExtensionProvider.java b/freeplane/src/main/java/org/freeplane/main/osgi/IModeControllerExtensionProvider.java
similarity index 100%
rename from freeplane/src/org/freeplane/main/osgi/IModeControllerExtensionProvider.java
rename to freeplane/src/main/java/org/freeplane/main/osgi/IModeControllerExtensionProvider.java
diff --git a/freeplane/src/main/java/org/freeplane/main/osgi/ResourcesUrlHandler.java b/freeplane/src/main/java/org/freeplane/main/osgi/ResourcesUrlHandler.java
new file mode 100644
index 0000000..c3034ea
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/main/osgi/ResourcesUrlHandler.java
@@ -0,0 +1,34 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.main.osgi;
+
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.freeplane.main.application.protocols.freeplaneresource.Handler;
+import org.osgi.service.url.AbstractURLStreamHandlerService;
+
+public class ResourcesUrlHandler extends AbstractURLStreamHandlerService{
+ final private Handler handler = new Handler();
+ public URLConnection openConnection(URL url) throws IOException{
+ return handler.openConnection(url);
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/CDATAReader.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/CDATAReader.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/CDATAReader.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/CDATAReader.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/CdataContentXmlWriter.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/CdataContentXmlWriter.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/CdataContentXmlWriter.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/CdataContentXmlWriter.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/ContentReader.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/ContentReader.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/ContentReader.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/ContentReader.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLBuilder.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLBuilder.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/IXMLBuilder.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLBuilder.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLEntityResolver.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLEntityResolver.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/IXMLEntityResolver.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLEntityResolver.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLParser.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLParser.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/IXMLParser.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLParser.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLReader.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLReader.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/IXMLReader.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLReader.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/IXMLValidator.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLValidator.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/IXMLValidator.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/IXMLValidator.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/NonValidator.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/NonValidator.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/NonValidator.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/NonValidator.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/PIReader.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/PIReader.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/PIReader.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/PIReader.java
diff --git a/freeplane/src/main/java/org/freeplane/n3/nanoxml/StdXMLBuilder.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/StdXMLBuilder.java
new file mode 100644
index 0000000..1656f82
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/n3/nanoxml/StdXMLBuilder.java
@@ -0,0 +1,282 @@
+/*
+ * StdXMLBuilder.java NanoXML/Java $Revision: 1.3 $ $Date: 2002/01/04 21:03:28 $
+ * $Name: RELEASE_2_2_1 $ This file is part of NanoXML 2 for Java. Copyright (C)
+ * 2000-2002 Marc De Scheemaecker, All Rights Reserved. This software is
+ * provided 'as-is', without any express or implied warranty. In no event will
+ * the authors be held liable for any damages arising from the use of this
+ * software. Permission is granted to anyone to use this software for any
+ * purpose, including commercial applications, and to alter it and redistribute
+ * it freely, subject to the following restrictions: 1. The origin of this
+ * software must not be misrepresented; you must not claim that you wrote the
+ * original software. If you use this software in a product, an acknowledgment
+ * in the product documentation would be appreciated but is not required. 2.
+ * Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software. 3. This notice may not be
+ * removed or altered from any source distribution.
+ */
+package org.freeplane.n3.nanoxml;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.util.Stack;
+
+/**
+ * StdXMLBuilder is a concrete implementation of IXMLBuilder which creates a
+ * tree of IXMLElement from an XML data source.
+ *
+ * @see org.freeplane.n3.nanoxml.XMLElement
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
+ */
+class StdXMLBuilder implements IXMLBuilder {
+ /**
+ * Prototype element for creating the tree.
+ */
+ private XMLElement prototype;
+ /**
+ * The root element of the parsed XML tree.
+ */
+ private XMLElement root;
+ /**
+ * This stack contains the current element and its parents.
+ */
+ private Stack<XMLElement> stack;
+
+ /**
+ * Creates the builder.
+ */
+ public StdXMLBuilder() {
+ this(new XMLElement());
+ }
+
+ /**
+ * Creates the builder.
+ *
+ * @param prototype
+ * the prototype to use when building the tree.
+ */
+ public StdXMLBuilder(final XMLElement prototype) {
+ stack = null;
+ root = null;
+ this.prototype = prototype;
+ }
+
+ /**
+ * This method is called when a new attribute of an XML element is
+ * encountered.
+ *
+ * @param key
+ * the key (name) of the attribute.
+ * @param nsPrefix
+ * the prefix used to identify the namespace. If no namespace has
+ * been specified, this parameter is null.
+ * @param nsURI
+ * the URI associated with the namespace. If no namespace has
+ * been specified, or no URI is associated with nsPrefix, this
+ * parameter is null.
+ * @param value
+ * the value of the attribute.
+ * @param type
+ * the type of the attribute. If no type is known, "CDATA" is
+ * returned.
+ * @throws java.lang.Exception
+ * If an exception occurred while processing the event.
+ */
+ public void addAttribute(final String key, final String nsPrefix, final String nsURI, final String value,
+ final String type) throws Exception {
+ String fullName = key;
+ if (nsPrefix != null) {
+ fullName = nsPrefix + ':' + key;
+ }
+ final XMLElement top = (XMLElement) stack.peek();
+ if (top.hasAttribute(fullName)) {
+ throw new XMLParseException(top.getSystemID(), top.getLineNr(), "Duplicate attribute: " + key);
+ }
+ if (nsPrefix != null) {
+ top.setAttribute(fullName, nsURI, value);
+ }
+ else {
+ top.setAttribute(fullName, value);
+ }
+ }
+
+ /**
+ * This method is called when a PCDATA element is encountered. A Java reader
+ * is supplied from which you can read the data. The reader will only read
+ * the data of the element. You don't need to check for boundaries. If you
+ * don't read the full element, the rest of the data is skipped. You also
+ * don't have to care about entities; they are resolved by the parser.
+ *
+ * @param reader
+ * the Java reader from which you can retrieve the data.
+ * @param systemID
+ * the system ID of the XML data source.
+ * @param lineNr
+ * the line in the source where the element starts.
+ */
+ public void addPCData(final Reader reader, final String systemID, final int lineNr)
+ throws XMLParseException
+ {
+ int bufSize = 2048;
+ int sizeRead = 0;
+ final StringBuilder str = new StringBuilder(bufSize);
+ final char[] buf = new char[bufSize];
+ for (;;) {
+ if (sizeRead >= bufSize) {
+ bufSize *= 2;
+ str.ensureCapacity(bufSize);
+ }
+ int size;
+ try {
+ size = reader.read(buf);
+ }
+ catch (final IOException e) {
+ // was caused by a XML syntax error in the data, e.g "x&;"
+ if (e.getCause() instanceof XMLParseException) {
+ throw (XMLParseException)e.getCause();
+ }
+ break;
+ }
+ if (size < 0) {
+ break;
+ }
+ str.append(buf, 0, size);
+ sizeRead += size;
+ }
+ final XMLElement elt = prototype.createElement(null, systemID, lineNr);
+ elt.setContent(str.toString());
+ if (!stack.empty()) {
+ final XMLElement top = (XMLElement) stack.peek();
+ top.addChild(elt);
+ }
+ }
+
+ /**
+ * This method is called when the attributes of an XML element have been
+ * processed.
+ *
+ * @see #startElement
+ * @see #addAttribute
+ * @param name
+ * the name of the element.
+ * @param nsPrefix
+ * the prefix used to identify the namespace. If no namespace has
+ * been specified, this parameter is null.
+ * @param nsURI
+ * the URI associated with the namespace. If no namespace has
+ * been specified, or no URI is associated with nsPrefix, this
+ * parameter is null.
+ */
+ public void elementAttributesProcessed(final String name, final String nsPrefix, final String nsURI) {
+ }
+
+ /**
+ * This method is called when the end of an XML elemnt is encountered.
+ *
+ * @see #startElement
+ * @param name
+ * the name of the element.
+ * @param nsPrefix
+ * the prefix used to identify the namespace. If no namespace has
+ * been specified, this parameter is null.
+ * @param nsURI
+ * the URI associated with the namespace. If no namespace has
+ * been specified, or no URI is associated with nsPrefix, this
+ * parameter is null.
+ */
+ public void endElement(final String name, final String nsPrefix, final String nsURI) {
+ final XMLElement elt = (XMLElement) stack.pop();
+ if (elt.getChildrenCount() == 1) {
+ final XMLElement child = elt.getChildAtIndex(0);
+ if (child.getName() == null) {
+ elt.setContent(child.getContent());
+ elt.removeChildAtIndex(0);
+ }
+ }
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ prototype = null;
+ root = null;
+ if(stack != null){
+ stack.clear();
+ stack = null;
+ }
+ super.finalize();
+ }
+
+ /**
+ * Returns the result of the building process. This method is called just
+ * before the <I>parse</I> method of IXMLParser returns.
+ *
+ * @see org.freeplane.n3.nanoxml.IXMLParser#parse
+ * @return the result of the building process.
+ */
+ public Object getResult() {
+ return root;
+ }
+
+ /**
+ * This method is called when a processing instruction is encountered. PIs
+ * with target "xml" are handled by the parser.
+ *
+ * @param target
+ * the PI target.
+ * @param reader
+ * to read the data from the PI.
+ */
+ public void newProcessingInstruction(final String target, final Reader reader) {
+ }
+
+ /**
+ * This method is called before the parser starts processing its input.
+ *
+ * @param systemID
+ * the system ID of the XML data source.
+ * @param lineNr
+ * the line on which the parsing starts.
+ */
+ public void startBuilding(final String systemID, final int lineNr) {
+ stack = new Stack<XMLElement>();
+ root = null;
+ }
+
+ /**
+ * This method is called when a new XML element is encountered.
+ *
+ * @see #endElement
+ * @param name
+ * the name of the element.
+ * @param nsPrefix
+ * the prefix used to identify the namespace. If no namespace has
+ * been specified, this parameter is null.
+ * @param nsURI
+ * the URI associated with the namespace. If no namespace has
+ * been specified, or no URI is associated with nsPrefix, this
+ * parameter is null.
+ * @param systemID
+ * the system ID of the XML data source.
+ * @param lineNr
+ * the line in the source where the element starts.
+ */
+ public void startElement(final String name, final String nsPrefix, final String nsURI, final String systemID,
+ final int lineNr) {
+ String fullName = name;
+ if (nsPrefix != null) {
+ fullName = nsPrefix + ':' + name;
+ }
+ final XMLElement elt = new XMLElement(fullName, nsURI, systemID, lineNr);
+ if (stack.empty()) {
+ root = elt;
+ }
+ else {
+ final XMLElement top = (XMLElement) stack.peek();
+ top.addChild(elt);
+ }
+ stack.push(elt);
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/StdXMLParser.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/StdXMLParser.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/StdXMLParser.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/StdXMLParser.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/StdXMLReader.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/StdXMLReader.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/StdXMLReader.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/StdXMLReader.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/ValidatorPlugin.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/ValidatorPlugin.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/ValidatorPlugin.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/ValidatorPlugin.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLAttribute.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLAttribute.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/XMLAttribute.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLAttribute.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLElement.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLElement.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/XMLElement.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLElement.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLEntityResolver.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLEntityResolver.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/XMLEntityResolver.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLEntityResolver.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLException.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLException.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/XMLException.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLException.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLParseException.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLParseException.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/XMLParseException.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLParseException.java
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLParserFactory.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLParserFactory.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/XMLParserFactory.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLParserFactory.java
diff --git a/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLUtil.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLUtil.java
new file mode 100644
index 0000000..f2da16b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLUtil.java
@@ -0,0 +1,615 @@
+/*
+ * XMLUtil.java NanoXML/Java $Revision: 1.5 $ $Date: 2002/02/03 21:19:38 $
+ * $Name: RELEASE_2_2_1 $ This file is part of NanoXML 2 for Java. Copyright (C)
+ * 2000-2002 Marc De Scheemaecker, All Rights Reserved. This software is
+ * provided 'as-is', without any express or implied warranty. In no event will
+ * the authors be held liable for any damages arising from the use of this
+ * software. Permission is granted to anyone to use this software for any
+ * purpose, including commercial applications, and to alter it and redistribute
+ * it freely, subject to the following restrictions: 1. The origin of this
+ * software must not be misrepresented; you must not claim that you wrote the
+ * original software. If you use this software in a product, an acknowledgment
+ * in the product documentation would be appreciated but is not required. 2.
+ * Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software. 3. This notice may not be
+ * removed or altered from any source distribution.
+ */
+package org.freeplane.n3.nanoxml;
+
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * Utility methods for NanoXML.
+ *
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.5 $
+ */
+class XMLUtil {
+ /**
+ * Returns true if the data starts with <I>literal</I>. Enough chars are
+ * read to determine this result.
+ *
+ * @param reader
+ * the reader
+ * @param literal
+ * the literal to check
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static boolean checkLiteral(final IXMLReader reader, final String literal) throws IOException, XMLParseException {
+ for (int i = 0; i < literal.length(); i++) {
+ if (reader.read() != literal.charAt(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Throws an XMLParseException to indicate that extra data is encountered in
+ * a closing tag.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ */
+ static void errorClosingTagNotEmpty(final String systemID, final int lineNr) throws XMLParseException {
+ throw new XMLParseException(systemID, lineNr, "Closing tag must be empty");
+ }
+
+ /**
+ * Throws an XMLParseException to indicate that an expected string is not
+ * encountered.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param expectedString
+ * the string that is expected
+ */
+ static void errorExpectedInput(final String systemID, final int lineNr, final String expectedString)
+ throws XMLParseException {
+ throw new XMLParseException(systemID, lineNr, "Expected: " + expectedString);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an attribute has an
+ * invalid value.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param elementName
+ * the name of the element
+ * @param attributeName
+ * the name of the attribute
+ * @param attributeValue
+ * the value of that attribute
+ */
+ static void errorInvalidAttributeValue(final String systemID, final int lineNr, final String elementName,
+ final String attributeName, final String attributeValue)
+ throws XMLValidationException {
+ throw new XMLValidationException(XMLValidationException.ATTRIBUTE_WITH_INVALID_VALUE, systemID, lineNr,
+ elementName, attributeName, attributeValue, "Invalid value for attribute " + attributeName);
+ }
+
+ /**
+ * Throws an XMLParseException to indicate that an entity could not be
+ * resolved.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param entity
+ * the name of the entity
+ */
+ static void errorInvalidEntity(final String systemID, final int lineNr, final String entity)
+ throws XMLParseException {
+ throw new XMLParseException(systemID, lineNr, "Invalid entity: `&" + entity + ";'");
+ }
+
+ /**
+ * Throws an XMLParseException to indicate that a string is not expected at
+ * this point.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param unexpectedString
+ * the string that is unexpected
+ */
+ static void errorInvalidInput(final String systemID, final int lineNr, final String unexpectedString)
+ throws XMLParseException {
+ throw new XMLParseException(systemID, lineNr, "Invalid input: " + unexpectedString);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an attribute is
+ * missing.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param elementName
+ * the name of the element
+ * @param attributeName
+ * the name of the missing attribute
+ */
+ static void errorMissingAttribute(final String systemID, final int lineNr, final String elementName,
+ final String attributeName) throws XMLValidationException {
+ throw new XMLValidationException(XMLValidationException.MISSING_ATTRIBUTE, systemID, lineNr, elementName,
+ attributeName,
+ /* attributeValue */null, "Element " + elementName + " expects an attribute named " + attributeName);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an element is missing.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param parentElementName
+ * the name of the parent element
+ * @param missingElementName
+ * the name of the missing element
+ */
+ static void errorMissingElement(final String systemID, final int lineNr, final String parentElementName,
+ final String missingElementName) throws XMLValidationException {
+ throw new XMLValidationException(XMLValidationException.MISSING_ELEMENT, systemID, lineNr, missingElementName,
+ /* attributeName */null,
+ /* attributeValue */null, "Element " + parentElementName + " expects to have a " + missingElementName);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that a #PCDATA element was
+ * missing.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param parentElementName
+ * the name of the parent element
+ */
+ static void errorMissingPCData(final String systemID, final int lineNr, final String parentElementName)
+ throws XMLValidationException {
+ throw new XMLValidationException(XMLValidationException.MISSING_PCDATA, systemID, lineNr,
+ /* elementName */null,
+ /* attributeName */null,
+ /* attributeValue */null, "Missing #PCDATA in element " + parentElementName);
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an attribute is
+ * unexpected.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param elementName
+ * the name of the element
+ * @param attributeName
+ * the name of the unexpected attribute
+ */
+ static void errorUnexpectedAttribute(final String systemID, final int lineNr, final String elementName,
+ final String attributeName) throws XMLValidationException {
+ throw new XMLValidationException(XMLValidationException.UNEXPECTED_ATTRIBUTE, systemID, lineNr, elementName,
+ attributeName,
+ /* attributeValue */null, "Element " + elementName + " did not expect an attribute " + "named "
+ + attributeName);
+ }
+
+ /**
+ * Throws an XMLParseException to indicate that a CDATA section is
+ * unexpected at this point.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ */
+ static void errorUnexpectedCDATA(final String systemID, final int lineNr) throws XMLParseException {
+ throw new XMLParseException(systemID, lineNr, "No CDATA section is expected here");
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that an element is
+ * unexpected.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param parentElementName
+ * the name of the parent element
+ * @param unexpectedElementName
+ * the name of the unexpected element
+ */
+ static void errorUnexpectedElement(final String systemID, final int lineNr, final String parentElementName,
+ final String unexpectedElementName) throws XMLValidationException {
+ throw new XMLValidationException(XMLValidationException.UNEXPECTED_ELEMENT, systemID, lineNr,
+ unexpectedElementName,
+ /* attributeName */null,
+ /* attributeValue */null, "Unexpected " + unexpectedElementName + " in a " + parentElementName);
+ }
+
+ /**
+ * Throws an XMLParseException to indicate that an entity reference is
+ * unexpected at this point.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param entity
+ * the name of the entity
+ */
+ static void errorUnexpectedEntity(final String systemID, final int lineNr, final String entity)
+ throws XMLParseException {
+ throw new XMLParseException(systemID, lineNr, "No entity reference is expected here (" + entity + ")");
+ }
+
+ /**
+ * Throws an XMLValidationException to indicate that a #PCDATA element was
+ * unexpected.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param parentElementName
+ * the name of the parent element
+ */
+ static void errorUnexpectedPCData(final String systemID, final int lineNr, final String parentElementName)
+ throws XMLValidationException {
+ throw new XMLValidationException(XMLValidationException.UNEXPECTED_PCDATA, systemID, lineNr,
+ /* elementName */null,
+ /* attributeName */null,
+ /* attributeValue */null, "Unexpected #PCDATA in element " + parentElementName);
+ }
+
+ /**
+ * Throws an XMLParseException to indicate that the closing tag of an
+ * element does not match the opening tag.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param expectedName
+ * the name of the opening tag
+ * @param wrongName
+ * the name of the closing tag
+ */
+ static void errorWrongClosingTag(final String systemID, final int lineNr, final String expectedName,
+ final String wrongName) throws XMLParseException {
+ throw new XMLParseException(systemID, lineNr, "Closing tag does not match opening tag: `" + wrongName
+ + "' != `" + expectedName + "'");
+ }
+
+ /**
+ * Processes a character literal.
+ *
+ * @param entity
+ * the entity
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static char processCharLiteral(String entity) throws IOException, XMLParseException {
+ if (entity.charAt(2) == 'x') {
+ entity = entity.substring(3, entity.length() - 1);
+ return (char) Integer.parseInt(entity, 16);
+ }
+ else {
+ entity = entity.substring(2, entity.length() - 1);
+ return (char) Integer.parseInt(entity, 10);
+ }
+ }
+
+ /**
+ * Processes an entity.
+ *
+ * @param entity
+ * the entity
+ * @param reader
+ * the reader
+ * @param entityResolver
+ * the entity resolver
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static void processEntity(String entity, final IXMLReader reader, final IXMLEntityResolver entityResolver)
+ throws IOException, XMLParseException {
+ entity = entity.substring(1, entity.length() - 1);
+ final Reader entityReader = entityResolver.getEntity(reader, entity);
+ if (entityReader == null) {
+ XMLUtil.errorInvalidEntity(reader.getSystemID(), reader.getLineNr(), entity);
+ }
+ final boolean externalEntity = entityResolver.isExternalEntity(entity);
+ reader.startNewStream(entityReader, !externalEntity);
+ }
+
+ /**
+ * Reads a character from the reader.
+ *
+ * @param reader
+ * the reader
+ * @param entityChar
+ * the escape character (& or %) used to indicate an entity
+ * @return the character, or an entity expression (like e.g. <)
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static String read(final IXMLReader reader, final char entityChar) throws IOException, XMLParseException {
+ char ch = reader.read();
+ final StringBuilder buf = new StringBuilder();
+ buf.append(ch);
+ if (ch == entityChar) {
+ while (ch != ';') {
+ ch = reader.read();
+ buf.append(ch);
+ }
+ }
+ return buf.toString();
+ }
+
+ /**
+ * Reads a character from the reader disallowing entities.
+ *
+ * @param reader
+ * the reader
+ * @param entityChar
+ * the escape character (& or %) used to indicate an entity
+ */
+ static char readChar(final IXMLReader reader, final char entityChar) throws IOException, XMLParseException {
+ final String str = XMLUtil.read(reader, entityChar);
+ final char ch = str.charAt(0);
+ if (ch == entityChar) {
+ XMLUtil.errorUnexpectedEntity(reader.getSystemID(), reader.getLineNr(), str);
+ }
+ return ch;
+ }
+
+ /**
+ * Retrieves an identifier from the data.
+ *
+ * @param reader
+ * the reader
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static String scanIdentifier(final IXMLReader reader) throws IOException, XMLParseException {
+ final StringBuilder result = new StringBuilder();
+ for (;;) {
+ final char ch = reader.read();
+ if ((ch == '_') || (ch == ':') || (ch == '-') || (ch == '.') || ((ch >= 'a') && (ch <= 'z'))
+ || ((ch >= 'A') && (ch <= 'Z')) || ((ch >= '0') && (ch <= '9')) || (ch > '\u007E')) {
+ result.append(ch);
+ }
+ else {
+ reader.unread(ch);
+ break;
+ }
+ }
+ return result.toString();
+ }
+
+ /**
+ * Scans a public ID.
+ *
+ * @param publicID
+ * will contain the public ID
+ * @param reader
+ * the reader
+ * @return the system ID
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static String scanPublicID(final StringBuilder publicID, final IXMLReader reader) throws IOException,
+ XMLParseException {
+ if (!XMLUtil.checkLiteral(reader, "UBLIC")) {
+ return null;
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ publicID.append(XMLUtil.scanString(reader, '\0', null));
+ XMLUtil.skipWhitespace(reader, null);
+ return XMLUtil.scanString(reader, '\0', null);
+ }
+
+ /**
+ * Retrieves a delimited string from the data.
+ *
+ * @param reader
+ * the reader
+ * @param entityChar
+ * the escape character (& or %)
+ * @param entityResolver
+ * the entity resolver
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static String scanString(final IXMLReader reader, final char entityChar, final IXMLEntityResolver entityResolver)
+ throws IOException, XMLParseException {
+ final StringBuilder result = new StringBuilder();
+ final int startingLevel = reader.getStreamLevel();
+ final char delim = reader.read();
+ if ((delim != '\'') && (delim != '"')) {
+ XMLUtil.errorExpectedInput(reader.getSystemID(), reader.getLineNr(), "delimited string");
+ }
+ for (;;) {
+ String str = XMLUtil.read(reader, entityChar);
+ final char ch = str.charAt(0);
+ if (ch == entityChar) {
+ if (str.charAt(1) == '#') {
+ result.append(XMLUtil.processCharLiteral(str));
+ }
+ else {
+ XMLUtil.processEntity(str, reader, entityResolver);
+ }
+ }
+ else if (ch == '&') {
+ reader.unread(ch);
+ str = XMLUtil.read(reader, '&');
+ if (str.charAt(1) == '#') {
+ result.append(XMLUtil.processCharLiteral(str));
+ }
+ else {
+ result.append(str);
+ }
+ }
+ else if (reader.getStreamLevel() == startingLevel) {
+ if (ch == delim) {
+ break;
+ }
+ else if ((ch == 9) || (ch == 10) || (ch == 13)) {
+ result.append(' ');
+ }
+ else {
+ result.append(ch);
+ }
+ }
+ else {
+ result.append(ch);
+ }
+ }
+ return result.toString();
+ }
+
+ /**
+ * Scans a system ID.
+ *
+ * @param reader
+ * the reader
+ * @return the system ID
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static String scanSystemID(final IXMLReader reader) throws IOException, XMLParseException {
+ if (!XMLUtil.checkLiteral(reader, "YSTEM")) {
+ return null;
+ }
+ XMLUtil.skipWhitespace(reader, null);
+ return XMLUtil.scanString(reader, '\0', null);
+ }
+
+ /**
+ * Skips the remainder of a comment. It is assumed that <!- is already
+ * read.
+ *
+ * @param reader
+ * the reader
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static void skipComment(final IXMLReader reader) throws IOException, XMLParseException {
+ if (reader.read() != '-') {
+ XMLUtil.errorExpectedInput(reader.getSystemID(), reader.getLineNr(), "<!--");
+ }
+ int dashesRead = 0;
+ for (;;) {
+ final char ch = reader.read();
+ switch (ch) {
+ case '-':
+ dashesRead++;
+ break;
+ case '>':
+ if (dashesRead == 2) {
+ return;
+ }
+ //$FALL-THROUGH$
+ default:
+ dashesRead = 0;
+ }
+ }
+ }
+
+ /**
+ * Skips the remainder of the current XML tag.
+ *
+ * @param reader
+ * the reader
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static void skipTag(final IXMLReader reader) throws IOException, XMLParseException {
+ int level = 1;
+ while (level > 0) {
+ final char ch = reader.read();
+ switch (ch) {
+ case '<':
+ ++level;
+ break;
+ case '>':
+ --level;
+ break;
+ }
+ }
+ }
+
+ /**
+ * Skips whitespace from the reader.
+ *
+ * @param reader
+ * the reader
+ * @param buffer
+ * where to put the whitespace; null if the whitespace does not
+ * have to be stored.
+ * @throws java.io.IOException
+ * if an error occurred reading the data
+ */
+ static void skipWhitespace(final IXMLReader reader, final StringBuilder buffer) throws IOException {
+ char ch;
+ if (buffer == null) {
+ do {
+ ch = reader.read();
+ } while ((ch == ' ') || (ch == '\t') || (ch == '\n'));
+ }
+ else {
+ for (;;) {
+ ch = reader.read();
+ if ((ch != ' ') && (ch != '\t') && (ch != '\n')) {
+ break;
+ }
+ if (ch == '\n') {
+ buffer.append('\n');
+ }
+ else {
+ buffer.append(' ');
+ }
+ }
+ }
+ reader.unread(ch);
+ }
+
+ /**
+ * Throws an XMLValidationException.
+ *
+ * @param systemID
+ * the system ID of the data source
+ * @param lineNr
+ * the line number in the data source
+ * @param message
+ * the error message
+ * @param elementName
+ * the name of the element
+ * @param attributeName
+ * the name of the attribute
+ * @param attributeValue
+ * the value of that attribute
+ */
+ static void validationError(final String systemID, final int lineNr, final String message,
+ final String elementName, final String attributeName, final String attributeValue)
+ throws XMLValidationException {
+ throw new XMLValidationException(XMLValidationException.MISC_ERROR, systemID, lineNr, elementName,
+ attributeName, attributeValue, message);
+ }
+}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLValidationException.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLValidationException.java
similarity index 100%
rename from freeplane/src/org/freeplane/n3/nanoxml/XMLValidationException.java
rename to freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLValidationException.java
diff --git a/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLWriter.java b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLWriter.java
new file mode 100644
index 0000000..b4e9e8e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/n3/nanoxml/XMLWriter.java
@@ -0,0 +1,280 @@
+/*
+ * XMLWriter.java NanoXML/Java $Revision: 1.4 $ $Date: 2002/03/24 11:37:51 $
+ * $Name: RELEASE_2_2_1 $ This file is part of NanoXML 2 for Java. Copyright (C)
+ * 2000-2002 Marc De Scheemaecker, All Rights Reserved. This software is
+ * provided 'as-is', without any express or implied warranty. In no event will
+ * the authors be held liable for any damages arising from the use of this
+ * software. Permission is granted to anyone to use this software for any
+ * purpose, including commercial applications, and to alter it and redistribute
+ * it freely, subject to the following restrictions: 1. The origin of this
+ * software must not be misrepresented; you must not claim that you wrote the
+ * original software. If you use this software in a product, an acknowledgment
+ * in the product documentation would be appreciated but is not required. 2.
+ * Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software. 3. This notice may not be
+ * removed or altered from any source distribution.
+ */
+package org.freeplane.n3.nanoxml;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.Writer;
+import java.util.Enumeration;
+import java.util.Vector;
+
+/**
+ * An XMLWriter writes XML data to a stream.
+ *
+ * @see org.freeplane.n3.nanoxml.XMLElement
+ * @see java.io.Writer
+ * @author Marc De Scheemaecker
+ * @version $Name: RELEASE_2_2_1 $, $Revision: 1.4 $
+ */
+public class XMLWriter {
+ /**
+ * Where to write the output to.
+ */
+ private PrintWriter writer;
+ private boolean inContent = false;
+
+ /**
+ * Creates a new XML writer.
+ *
+ * @param stream
+ * where to write the output to.
+ */
+ public XMLWriter(final OutputStream stream) {
+ writer = new PrintWriter(stream);
+ }
+
+ /**
+ * Creates a new XML writer.
+ *
+ * @param writer
+ * where to write the output to.
+ */
+ public XMLWriter(final Writer writer) {
+ if (writer instanceof PrintWriter) {
+ this.writer = (PrintWriter) writer;
+ }
+ else {
+ this.writer = new PrintWriter(writer);
+ }
+ }
+
+ /**
+ * Cleans up the object when it's destroyed.
+ */
+ @Override
+ protected void finalize() throws Throwable {
+ writer = null;
+ super.finalize();
+ }
+
+ /**
+ * Writes an XML element.
+ *
+ * @param xml
+ * the non-null XML element to write.
+ */
+ public void write(final XMLElement xml) throws IOException {
+ this.write(xml, false, 0, true);
+ }
+
+ /**
+ * Writes an XML element.
+ *
+ * @param xml
+ * the non-null XML element to write.
+ * @param prettyPrint
+ * if spaces need to be inserted to make the output more readable
+ */
+ public void write(final XMLElement xml, final boolean prettyPrint) throws IOException {
+ this.write(xml, prettyPrint, 0, true);
+ }
+
+ /**
+ * Writes an XML element.
+ *
+ * @param xml
+ * the non-null XML element to write.
+ * @param prettyPrint
+ * if spaces need to be inserted to make the output more readable
+ * @param indent
+ * how many spaces to indent the element.
+ */
+ public void write(final XMLElement xml, final boolean prettyPrint, final int indent) throws IOException {
+ this.write(xml, prettyPrint, indent, true);
+ }
+
+ /**
+ * Writes an XML element.
+ *
+ * @param xml
+ * the non-null XML element to write.
+ * @param prettyPrint
+ * if spaces need to be inserted to make the output more readable
+ * @param indent
+ * how many spaces to indent the element.
+ */
+ public void write(final XMLElement xml, final boolean prettyPrint, final int indent,
+ final boolean collapseEmptyElements) throws IOException {
+ if (prettyPrint) {
+ for (int i = 0; i < indent; i++) {
+ writer.print(' ');
+ }
+ }
+ if (xml.getName() == null) {
+ if (xml.getContent() != null) {
+ if (prettyPrint) {
+ this.writeEncodedContent(xml.getContent().trim());
+ writer.println();
+ }
+ else {
+ this.writeEncodedContent(xml.getContent());
+ }
+ }
+ }
+ else {
+ writer.print('<');
+ writer.print(xml.getFullName());
+ final Vector<String> nsprefixes = new Vector<String>();
+ if (xml.getNamespace() != null) {
+ if (xml.getName().equals(xml.getFullName())) {
+ writer.print(" xmlns=\"" + xml.getNamespace() + '"');
+ }
+ else {
+ String prefix = xml.getFullName();
+ prefix = prefix.substring(0, prefix.indexOf(':'));
+ nsprefixes.addElement(prefix);
+ writer.print(" xmlns:" + prefix);
+ writer.print("=\"" + xml.getNamespace() + "\"");
+ }
+ }
+ Enumeration<String> enumAttributeNames = xml.enumerateAttributeNames();
+ while (enumAttributeNames.hasMoreElements()) {
+ final String key = enumAttributeNames.nextElement();
+ final int index = key.indexOf(':');
+ if (index >= 0) {
+ final String namespace = xml.getAttributeNamespace(key);
+ if (namespace != null) {
+ final String prefix = key.substring(0, index);
+ if (!nsprefixes.contains(prefix)) {
+ writer.print(" xmlns:" + prefix);
+ writer.print("=\"" + namespace + '"');
+ nsprefixes.addElement(prefix);
+ }
+ }
+ }
+ }
+ enumAttributeNames = xml.enumerateAttributeNames();
+ while (enumAttributeNames.hasMoreElements()) {
+ final String key = enumAttributeNames.nextElement();
+ final String value = xml.getAttribute(key, null);
+ writer.print(" " + key + "=\"");
+ this.writeEncoded(value);
+ writer.print('"');
+ }
+ if ((xml.getContent() != null) && (xml.getContent().length() > 0)) {
+ writer.print('>');
+ this.writeEncodedContent(xml.getContent());
+ writer.print("</" + xml.getFullName() + '>');
+ if (prettyPrint) {
+ writer.println();
+ }
+ }
+ else if (xml.hasChildren() || (!collapseEmptyElements)) {
+ writer.print('>');
+ if (prettyPrint) {
+ writer.println();
+ }
+ Enumeration<XMLElement> children = xml.enumerateChildren();
+ while (children.hasMoreElements()) {
+ final XMLElement child = children.nextElement();
+ this.write(child, prettyPrint, indent + 4, collapseEmptyElements);
+ }
+ if (prettyPrint) {
+ for (int i = 0; i < indent; i++) {
+ writer.print(' ');
+ }
+ }
+ writer.print("</" + xml.getFullName() + ">");
+ if (prettyPrint) {
+ writer.println();
+ }
+ }
+ else {
+ writer.print("/>");
+ if (prettyPrint) {
+ writer.println();
+ }
+ }
+ }
+ writer.flush();
+ }
+
+ public void addRawContent(final String comment) {
+ writer.write(comment);
+ }
+
+ /**
+ * Writes a string encoding reserved characters.
+ *
+ * @param str
+ * the string to write.
+ */
+ protected void writeEncoded(final String str) {
+ for (int i = 0; i < str.length(); i++) {
+ final char c = str.charAt(i);
+ switch (c) {
+ case '<':
+ writer.print("<");
+ break;
+ case '>':
+ writer.print(">");
+ break;
+ case '&':
+ writer.print("&");
+ break;
+ case '\'':
+ writer.print("'");
+ break;
+ case '"':
+ writer.print(""");
+ break;
+ case 0x0A:
+ if(inContent){
+ writer.print(c);
+ break;
+ }
+ //$FALL-THROUGH$
+ default:
+ if ((c < ' ') || (c > 0x7E)) {
+ writer.print("&#x");
+ writer.print(Integer.toString(c, 16));
+ writer.print(';');
+ }
+ else {
+ writer.print(c);
+ }
+ }
+ }
+ }
+
+ /**
+ * Writes a string as encoded content string.
+ *
+ * @param str
+ * the string to write.
+ */
+ protected void writeEncodedContent(final String str) {
+ inContent = true;
+ writeEncoded(str);
+ inContent = false;
+ }
+
+ public PrintWriter getWriter() {
+ return writer;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/BlinkingNodeHook.java b/freeplane/src/main/java/org/freeplane/view/swing/features/BlinkingNodeHook.java
new file mode 100644
index 0000000..722bd40
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/BlinkingNodeHook.java
@@ -0,0 +1,197 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file author is Christian Foltin
+ * It is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.util.Collections;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.Vector;
+
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.SysUtils;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.IMapLifeCycleListener;
+import org.freeplane.features.map.INodeView;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.ui.INodeViewVisitor;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ */
+ at NodeHookDescriptor(hookName = "accessories/plugins/BlinkingNodeHook.properties", onceForMap = false)
+public class BlinkingNodeHook extends PersistentNodeHook {
+ protected class TimerColorChanger extends TimerTask implements IExtension, IMapChangeListener,
+ IMapLifeCycleListener {
+ final private NodeModel node;
+ final private Timer timer;
+
+ TimerColorChanger(final NodeModel node) {
+ this.node = node;
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ mapController.addMapChangeListener(this);
+ mapController.addMapLifeCycleListener(this);
+ timer = SysUtils.createTimer(getClass().getSimpleName());
+ timer.schedule(this, 500, 500);
+ BlinkingNodeHook.colors.clear();
+ BlinkingNodeHook.colors.add(Color.BLUE);
+ BlinkingNodeHook.colors.add(Color.RED);
+ BlinkingNodeHook.colors.add(Color.MAGENTA);
+ BlinkingNodeHook.colors.add(Color.CYAN);
+ }
+
+ public Iterable<NodeModel> getNodes() {
+ return node != null ? node.allClones() : Collections.<NodeModel>emptyList();
+ }
+
+ public Timer getTimer() {
+ return timer;
+ }
+
+ /** TimerTask method to enable the selection after a given time. */
+ @Override
+ public void run() {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ final Iterable<NodeModel> nodes = getNodes();
+ if (Controller.getCurrentModeController().isBlocked()) {
+ return;
+ }
+ for(NodeModel node :nodes) {
+ node.acceptViewVisitor(new INodeViewVisitor() {
+ public void visit(final INodeView nodeView) {
+ if(! (nodeView instanceof NodeView)){
+ return;
+ }
+ final Component container = ((NodeView)nodeView).getMainView();
+ if (container == null || !container.isVisible()) {
+ return;
+ }
+ final Color col = container.getForeground();
+ int index = -1;
+ if (col != null && BlinkingNodeHook.colors.contains(col)) {
+ index = BlinkingNodeHook.colors.indexOf(col);
+ }
+ index++;
+ if (index >= BlinkingNodeHook.colors.size()) {
+ index = 0;
+ }
+ container.setForeground(BlinkingNodeHook.colors.get(index));
+ }
+ });
+ }
+ }
+ });
+ }
+
+ public void mapChanged(final MapChangeEvent event) {
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ if (Controller.getCurrentModeController().isUndoAction() || !(node.equals(nodeDeletionEvent.node) || node.isDescendantOf(nodeDeletionEvent.node))) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ remove(node, node.getExtension(TimerColorChanger.class));
+ }
+ });
+ }
+
+ public String getDescription() {
+ return "BlinkingNodeHook.timer";
+ }
+
+ public void undo() {
+ node.addExtension(new TimerColorChanger(node));
+ }
+ };
+ Controller.getCurrentModeController().execute(actor, node.getMap());
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onCreate(final MapModel map) {
+ }
+
+ public void onRemove(final MapModel map) {
+ if (node.getMap().equals(map)) {
+ timer.cancel();
+ }
+ }
+ }
+
+ static Vector<Color> colors = new Vector<Color>();
+
+ public BlinkingNodeHook() {
+ super();
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ return new TimerColorChanger(node);
+ }
+
+ @Override
+ protected Class<TimerColorChanger> getExtensionClass() {
+ return TimerColorChanger.class;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see freeplane.extensions.MindMapHook#shutdownMapHook()
+ */
+ @Override
+ public void remove(final NodeModel node, final IExtension extension) {
+ final TimerColorChanger timer = ((TimerColorChanger) extension);
+ timer.getTimer().cancel();
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ mapController.removeMapChangeListener(timer);
+ mapController.removeMapLifeCycleListener(timer);
+ super.remove(node, extension);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/FitToPage.java b/freeplane/src/main/java/org/freeplane/view/swing/features/FitToPage.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/FitToPage.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/FitToPage.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/AddExternalImageAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/AddExternalImageAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/filepreview/AddExternalImageAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/AddExternalImageAction.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/BitmapViewerComponent.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/BitmapViewerComponent.java
new file mode 100644
index 0000000..7844dea
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/BitmapViewerComponent.java
@@ -0,0 +1,357 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.filepreview;
+
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.ref.WeakReference;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.Iterator;
+import java.util.concurrent.Future;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+import javax.swing.JComponent;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+
+import com.thebuzzmedia.imgscalr.AsyncScalr;
+import com.thebuzzmedia.imgscalr.Scalr;
+
+/**
+ * @author Dimitry Polivaev
+ * 22.08.2009
+ */
+public class BitmapViewerComponent extends JComponent implements ScalableComponent {
+
+ enum CacheType {
+ IC_DISABLE, IC_FILE, IC_RAM
+ }
+
+ private static final long serialVersionUID = 1L;
+ private File cacheFile;
+ private int hint;
+ private BufferedImage cachedImage;
+ private WeakReference<BufferedImage> cachedImageWeakRef;
+ private final URL url;
+ private final Dimension originalSize;
+ private int imageX;
+ private int imageY;
+ private boolean processing;
+ private boolean scaleEnabled;
+ private Dimension maximumSize = null;
+ private boolean center;
+ private final static Object LOCK = new Object();
+ private ImageLoadingListener imageLoadinglistener;
+
+ public BitmapViewerComponent(final URI uri) throws MalformedURLException, IOException {
+ url = uri.toURL();
+ originalSize = readOriginalSize();
+ hint = Image.SCALE_SMOOTH;
+ processing = false;
+ scaleEnabled = true;
+ cachedImage = null;
+ }
+
+ private Dimension readOriginalSize() throws IOException {
+ InputStream inputStream = null;
+ ImageInputStream in = null;
+ try {
+ inputStream = url.openStream();
+ in = ImageIO.createImageInputStream(inputStream);
+ final Iterator<ImageReader> readers = ImageIO.getImageReaders(in);
+ if (readers.hasNext()) {
+ final ImageReader reader = readers.next();
+ try {
+ reader.setInput(in);
+ return new Dimension(reader.getWidth(0), reader.getHeight(0));
+ }
+ finally {
+ reader.dispose();
+ }
+ }
+ else {
+ throw new IOException("can not create image");
+ }
+ }
+ finally {
+ if (in != null) {
+ in.close();
+ }
+ if (inputStream != null) {
+ inputStream.close();
+ }
+ }
+ }
+
+ public boolean isScaleEnabled() {
+ return scaleEnabled;
+ }
+
+ public void setScaleEnabled(final boolean scaleEnabled) {
+ this.scaleEnabled = scaleEnabled;
+ }
+
+ protected int getHint() {
+ return hint;
+ }
+
+ public void setHint(final int hint) {
+ this.hint = hint;
+ }
+
+ public Dimension getOriginalSize() {
+ return new Dimension(originalSize);
+ }
+
+ @Override
+ protected void paintComponent(final Graphics g) {
+ if (processing || componentHasNoArea()) {
+ return;
+ }
+ if (cachedImage == null && cachedImageWeakRef != null) {
+ cachedImage = cachedImageWeakRef.get();
+ cachedImageWeakRef = null;
+ }
+ if (cachedImage == null && cacheFile != null) {
+ loadImageFromCacheFile();
+ if (!isCachedImageValid()) {
+ cacheFile.delete();
+ cacheFile = null;
+ }
+ }
+ if (isCachedImageValid()) {
+ g.drawImage(cachedImage, imageX, imageY, null);
+ flushImage();
+ }
+ else {
+ final BufferedImage image = loadImageFromURL();
+ if (image == null || hasNoArea(image)) {
+ return;
+ }
+ processing = true;
+ final Future<BufferedImage> result = AsyncScalr.resize(image, Scalr.Mode.BEST_FIT_BOTH, getWidth(),
+ getHeight());
+ AsyncScalr.getService().submit(new Runnable() {
+ public void run() {
+ BufferedImage scaledImage = null;
+ try {
+ scaledImage = result.get();
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ return;
+ }
+ finally {
+ image.flush();
+ }
+ final int scaledImageHeight = scaledImage.getHeight();
+ final int scaledImageWidth = scaledImage.getWidth();
+ centerImagePosition(scaledImageWidth, scaledImageHeight);
+ cachedImage = scaledImage;
+ if (getCacheType().equals(CacheType.IC_FILE)) {
+ writeCacheFile();
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ processing = false;
+ if(imageLoadinglistener != null)
+ imageLoadinglistener.imageLoaded();
+ repaint();
+ }
+ });
+ }
+
+ private void centerImagePosition(final int scaledImageWidth, final int scaledImageHeight) {
+ if (center) {
+ imageX = (getWidth() - scaledImageWidth) / 2;
+ imageY = (getHeight() - scaledImageHeight) / 2;
+ }
+ else {
+ if (scaledImageWidth > getHeight()) {
+ imageX = 0;
+ imageY = (getHeight() - scaledImageHeight) / 2;
+ }
+ else {
+ imageX = (getWidth() - scaledImageWidth) / 2;
+ imageY = 0;
+ }
+ }
+ }
+ });
+ }
+ }
+
+ private boolean componentHasNoArea() {
+ return getWidth() == 0 || getHeight() == 0;
+ }
+
+ private boolean hasNoArea(final BufferedImage image) {
+ final int imageWidth = image.getWidth();
+ final int imageHeight = image.getHeight();
+ if (imageWidth == 0 || imageHeight == 0) {
+ return true;
+ }
+ return false;
+ }
+
+ private void loadImageFromCacheFile() {
+ try {
+ cachedImage = ImageIO.read(cacheFile);
+ }
+ catch (final IOException e) {
+ LogUtils.severe("ImageIO can not read cache file " + cacheFile , e);
+ }
+ }
+
+ private boolean isCachedImageValid() {
+ return cachedImage != null
+ && (!scaleEnabled || componentHasSameWidthAsCachedImage()
+ && cachedImageHeightFitsComponentHeight() || cachedImageWidthFitsComponentWidth()
+ && componentHasSameHeightAsCachedImage());
+ }
+
+ private boolean componentHasSameHeightAsCachedImage() {
+ return 1 >= Math.abs(getHeight() - cachedImage.getHeight());
+ }
+
+ private boolean cachedImageWidthFitsComponentWidth() {
+ return getWidth() >= cachedImage.getWidth();
+ }
+
+ private boolean cachedImageHeightFitsComponentHeight() {
+ return getHeight() >= cachedImage.getHeight();
+ }
+
+ private boolean componentHasSameWidthAsCachedImage() {
+ return 1 >= Math.abs(getWidth() - cachedImage.getWidth());
+ }
+
+ private BufferedImage loadImageFromURL() {
+ BufferedImage tempImage = null;
+ try {
+ tempImage = ImageIO.read(url);
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ return tempImage;
+ }
+
+ private void flushImage() {
+ final CacheType cacheType = getCacheType();
+ if (CacheType.IC_RAM.equals(cacheType)) {
+ cachedImage.flush();
+ }
+ else {
+ cachedImageWeakRef = new WeakReference<BufferedImage>(cachedImage);
+ cachedImage = null;
+ }
+ }
+
+ private CacheType getCacheType() {
+ return ResourceController.getResourceController().getEnumProperty("image_cache", CacheType.IC_DISABLE);
+ }
+
+ private void writeCacheFile() {
+ final File tempDir = new File(System.getProperty("java.io.tmpdir"), "freeplane");
+ tempDir.mkdirs();
+ try {
+ synchronized(LOCK) {
+ if(cacheFile == null)
+ cacheFile = File.createTempFile("cachedImage", ".jpg", tempDir);
+ else{
+ cacheFile.delete();
+ cacheFile.createNewFile();
+ }
+
+ }
+ ImageIO.write(cachedImage, "jpg", cacheFile);
+ }
+ catch (final IOException e) {
+ cacheFile.delete();
+ cacheFile = null;
+ }
+ }
+
+ @Override
+ public void removeNotify() {
+ super.removeNotify();
+ if (cacheFile != null) {
+ cacheFile.delete();
+ cacheFile = null;
+ }
+ }
+
+ public void setFinalViewerSize(final Dimension size) {
+ final Dimension sizeWithScaleCorrection = fitToMaximumSize(size);
+ setPreferredSize(sizeWithScaleCorrection);
+ setSize(sizeWithScaleCorrection);
+ setScaleEnabled(true);
+ }
+
+ public void setFinalViewerSize(final float zoom) {
+ final int scaledWidth = (int) (originalSize.width * zoom);
+ final int scaledHeight = (int) (originalSize.height * zoom);
+ setFinalViewerSize(new Dimension(scaledWidth, scaledHeight));
+ }
+
+ public void setDraftViewerSize(final Dimension size) {
+ setPreferredSize(size);
+ setSize(size);
+ setScaleEnabled(false);
+ }
+
+ public void setMaximumComponentSize(final Dimension size) {
+ maximumSize = size;
+ }
+
+ private Dimension fitToMaximumSize(final Dimension size) {
+ if (maximumSize == null || isUnderMaximumSize(size)) {
+ return size;
+ }
+ else {
+ return maximumSize;
+ }
+ }
+
+ private boolean isUnderMaximumSize(final Dimension size) {
+ return maximumSize.getWidth() >= size.width || maximumSize.getHeight() >= size.height;
+ }
+
+ public void setCenter(boolean center) {
+ this.center = center;
+ }
+
+ public void setImageLoadingListener(ImageLoadingListener listener) {
+ this.imageLoadinglistener = listener;
+
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/BitmapViewerFactory.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/BitmapViewerFactory.java
new file mode 100644
index 0000000..d561246
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/BitmapViewerFactory.java
@@ -0,0 +1,99 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.filepreview;
+
+import java.awt.Dimension;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.swing.JComponent;
+
+import org.freeplane.core.util.TextUtils;
+
+/**
+ * @author Dimitry Polivaev
+ * 22.08.2009
+ */
+public class BitmapViewerFactory implements IViewerFactory {
+ public boolean accept(final URI uri) {
+ final Iterator<ImageReader> readers = getImageReaders(uri);
+ return readers.hasNext();
+ }
+
+ private Iterator<ImageReader> getImageReaders(final URI uri) {
+ String path = uri.getRawPath();
+ final int suffixPos = path.lastIndexOf('.') + 1;
+ if (suffixPos == 0) {
+ final List<ImageReader> empty = Collections.emptyList();
+ return empty.iterator();
+ }
+ final String suffix = path.substring(suffixPos);
+ final Iterator<ImageReader> readers = ImageIO.getImageReadersBySuffix(suffix);
+ return readers;
+ }
+
+ public ScalableComponent createViewer(final ExternalResource resource,
+ final URI uri, int maximumWidth) throws MalformedURLException,
+ IOException {
+ final BitmapViewerComponent bitmapViewerComponent = new BitmapViewerComponent(uri);
+ final Dimension originalSize = bitmapViewerComponent.getOriginalSize();
+ float zoom = resource.getZoom();
+ if(zoom == -1){
+ zoom = resource.setZoom(originalSize.width, maximumWidth);
+ }
+ final ViewerLayoutManager viewerLayoutManager = new ViewerLayoutManager(1f, resource, originalSize);
+ ((JComponent) bitmapViewerComponent).setLayout(viewerLayoutManager);
+
+ Dimension zoomedSize = viewerLayoutManager.calculatePreferredSize();
+ bitmapViewerComponent.setFinalViewerSize(zoomedSize );
+ return bitmapViewerComponent;
+ }
+
+ public ScalableComponent createViewer(final URI uri,
+ final Dimension preferredSize) throws MalformedURLException,
+ IOException {
+ final BitmapViewerComponent bitmapViewerComponent = new BitmapViewerComponent(uri);
+ bitmapViewerComponent.setFinalViewerSize(preferredSize);
+ return bitmapViewerComponent;
+ }
+
+ public String getDescription() {
+ return TextUtils.getText("bitmaps");
+ }
+
+ public ScalableComponent createViewer(URI uri, float zoom)
+ throws MalformedURLException, IOException {
+ final BitmapViewerComponent bitmapViewerComponent = new BitmapViewerComponent(uri);
+ bitmapViewerComponent.setFinalViewerSize(zoom);
+ return bitmapViewerComponent;
+ }
+
+ /** extracted to {@link ScalableComponent} but still used in add-ons. */
+ @Deprecated
+ public Dimension getOriginalSize(final JComponent viewer) {
+ return ((BitmapViewerComponent) viewer).getOriginalSize();
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ChangeExternalImageAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ChangeExternalImageAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/filepreview/ChangeExternalImageAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ChangeExternalImageAction.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalImagePopupMenu.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ExternalImagePopupMenu.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalImagePopupMenu.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ExternalImagePopupMenu.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ExternalResource.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ExternalResource.java
new file mode 100644
index 0000000..b4f1b3e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ExternalResource.java
@@ -0,0 +1,87 @@
+package org.freeplane.view.swing.features.filepreview;
+
+import java.awt.Dimension;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.JComponent;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.view.swing.map.NodeView;
+
+public class ExternalResource implements IExtension {
+ final private Set<NodeView> viewers;
+
+ public ExternalResource(URI uri) {
+ if(uri == null)
+ throw new NullPointerException();
+ viewers = new HashSet<NodeView>();
+ this.uri = uri;
+ }
+
+ void removeViewers() {
+ for (final NodeView nodeView : viewers) {
+ nodeView.removeContent(ViewerController.VIEWER_POSITION);
+ }
+ viewers.clear();
+ }
+
+ public Set<NodeView> getViewers() {
+ return viewers;
+ }
+
+ public URI getUri() {
+ return uri;
+ }
+
+ public URI getAbsoluteUri(final MapModel map) {
+ try {
+ final UrlManager urlManager = (UrlManager) Controller.getCurrentModeController().getExtension(UrlManager.class);
+ final URI absoluteUri = urlManager.getAbsoluteUri(map, uri);
+ return absoluteUri;
+ }
+ catch (final MalformedURLException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ final private URI uri;
+ private float zoom = -1f;
+
+ public float getZoom() {
+ return zoom;
+ }
+
+ public void setZoom(final float r) {
+ zoom = r;
+ for (final NodeView nodeView : viewers) {
+ final JComponent viewer = nodeView.getContent(ViewerController.VIEWER_POSITION);
+ final ViewerLayoutManager layoutManager = (ViewerLayoutManager)viewer.getLayout();
+ if(layoutManager != null) {
+ final Dimension preferredSize = layoutManager.calculatePreferredSize();
+ ((ScalableComponent) viewer).setFinalViewerSize(preferredSize);
+ viewer.revalidate();
+ }
+ }
+ }
+
+ public float setZoom(final int originalWidth, final int maximumWidth) {
+ float zoom;
+ final float zoomedWidth;
+ if(originalWidth <= maximumWidth){
+ zoomedWidth = originalWidth;
+ zoom = 1;
+ }
+ else{
+ zoomedWidth = maximumWidth;
+ zoom = zoomedWidth /originalWidth;
+ }
+ setZoom(zoom);
+ return zoom;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/IViewerFactory.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/IViewerFactory.java
new file mode 100644
index 0000000..2ffce81
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/IViewerFactory.java
@@ -0,0 +1,37 @@
+package org.freeplane.view.swing.features.filepreview;
+
+import java.awt.Dimension;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+
+public interface IViewerFactory {
+ /**
+ * Returns true if factory can create viewer component for given URI
+ */
+ boolean accept(URI uri);
+
+ /**
+ * Creates viewer component for given URI with given preferred size
+ */
+ ScalableComponent createViewer(URI uri, final Dimension preferredSize)
+ throws MalformedURLException, IOException;
+
+ /**
+ * Creates viewer component for given URI with given zoom
+ */
+ ScalableComponent createViewer(URI uri, float zoom) throws MalformedURLException,
+ IOException;
+
+ /**
+ * Creates viewer component for given URI calculating its preferred size from the zoom of the resource
+ */
+ ScalableComponent createViewer(ExternalResource resource, URI absoluteUri,
+ int maximumWidth) throws MalformedURLException, IOException;
+
+ /**
+ * Returns description to be used in a user interface
+ */
+ String getDescription();
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ImageLoadingListener.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ImageLoadingListener.java
new file mode 100644
index 0000000..86dce8d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ImageLoadingListener.java
@@ -0,0 +1,28 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.filepreview;
+
+/**
+ * @author Dimitry Polivaev
+ * 06.03.2014
+ */
+public interface ImageLoadingListener {
+ void imageLoaded();
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ImagePreview.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ImagePreview.java
new file mode 100644
index 0000000..c808b28
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ImagePreview.java
@@ -0,0 +1,57 @@
+package org.freeplane.view.swing.features.filepreview;
+
+import java.awt.Dimension;
+import java.awt.Image;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.ui.components.BitmapImagePreview;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.view.swing.features.filepreview.ViewerController.FactoryFileFilter;
+
+/* ImagePreview.java by FileChooserDemo2.java. */
+public class ImagePreview extends BitmapImagePreview {
+ private static final long serialVersionUID = 1L;
+
+ public ImagePreview(final JFileChooser fc) {
+ super(fc);
+ }
+
+ @Override
+ protected void updateView(final File file) {
+ final Object fileFilter = fc.getClientProperty(FactoryFileFilter.class);
+ if(! (fileFilter instanceof FactoryFileFilter))
+ return;
+ final FactoryFileFilter factoryFileFilter = (FactoryFileFilter) fileFilter;
+ final Dimension size = getSize();
+ size.width -= 2 * BORDER_WIDTH;
+ size.height -= 2 * BORDER_WIDTH;
+ JComponent viewer;
+ try {
+ viewer = (JComponent) factoryFileFilter.getFactory().createViewer(file.getAbsoluteFile().toURI(), size);
+ }
+ catch (final MalformedURLException e) {
+ LogUtils.warn(e);
+ return;
+ }
+ catch (final IOException e) {
+ LogUtils.warn(e);
+ return;
+ }
+ if (viewer == null) {
+ return;
+ }
+ viewer.setLocation(BORDER_WIDTH, BORDER_WIDTH);
+ if (viewer instanceof BitmapViewerComponent) {
+ ((BitmapViewerComponent) viewer).setHint(Image.SCALE_FAST);
+ }
+ add(viewer);
+ viewer.revalidate();
+ viewer.repaint();
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/MExternalImageDropListener.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/MExternalImageDropListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/filepreview/MExternalImageDropListener.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/MExternalImageDropListener.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/MapBackgroundClearAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/MapBackgroundClearAction.java
new file mode 100644
index 0000000..1a02bb4
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/MapBackgroundClearAction.java
@@ -0,0 +1,44 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 home
+ *
+ * This file author is home
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.filepreview;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.MapStyle;
+
+/**
+ * @author Dimitry Polivaev
+ * Feb 3, 2014
+ */
+public class MapBackgroundClearAction extends AFreeplaneAction {
+ public MapBackgroundClearAction() {
+ super("MapBackgroundClearAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final MapStyle mapStyle = controller.getModeController().getExtension(MapStyle.class);
+ final MapModel model = controller.getMap();
+ mapStyle.setProperty(model, MapStyle.RESOURCES_BACKGROUND_IMAGE, null);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/MapBackgroundImageAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/MapBackgroundImageAction.java
new file mode 100644
index 0000000..f827057
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/MapBackgroundImageAction.java
@@ -0,0 +1,58 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 home
+ *
+ * This file author is home
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.filepreview;
+
+import java.awt.event.ActionEvent;
+import java.net.URI;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.MapStyle;
+
+/**
+ * Feb 1, 2014
+ */
+public class MapBackgroundImageAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ public MapBackgroundImageAction() {
+ super("MapBackgroundImageAction");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ final ViewerController vc = controller.getModeController().getExtension(ViewerController.class);
+ final NodeModel selectedNode = mapController.getSelectedNode();
+ if (selectedNode == null) {
+ return;
+ }
+ final MapStyle mapStyle = controller.getModeController().getExtension(MapStyle.class);
+ final URI uri = vc.createURI(selectedNode);
+ if (uri == null) {
+ return;
+ }
+ final MapModel model = controller.getMap();
+ mapStyle.setProperty(model, MapStyle.RESOURCES_BACKGROUND_IMAGE, uri.toString());
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/RemoveExternalImageAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/RemoveExternalImageAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/filepreview/RemoveExternalImageAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/RemoveExternalImageAction.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ScalableComponent.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ScalableComponent.java
new file mode 100644
index 0000000..0642d15
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ScalableComponent.java
@@ -0,0 +1,48 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.filepreview;
+
+import java.awt.Dimension;
+
+public interface ScalableComponent {
+ /**
+ * Returns not scaled size of the displayed component
+ */
+ Dimension getOriginalSize();
+
+ /**
+ * Adjusts size of the given viewer component after the mouse button is
+ * released
+ */
+ void setFinalViewerSize(Dimension size);
+ void setFinalViewerSize(float zoom);
+
+ /**
+ * Adjusts size of the given viewer component inside resize operation by
+ * mouse drag
+ */
+ void setDraftViewerSize(Dimension size);
+
+ void setMaximumComponentSize(Dimension size);
+
+ void setCenter(boolean center);
+
+ void setImageLoadingListener(ImageLoadingListener listener);
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ViewerController.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ViewerController.java
new file mode 100644
index 0000000..bf00b7e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ViewerController.java
@@ -0,0 +1,731 @@
+package org.freeplane.view.swing.features.filepreview;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.KeyboardFocusManager;
+import java.awt.dnd.DropTarget;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+import javax.swing.border.MatteBorder;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.INodeView;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.mode.PersistentNodeHook.HookAction;
+import org.freeplane.features.ui.INodeViewLifeCycleListener;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.view.swing.features.progress.mindmapmode.ProgressIcons;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+ at NodeHookDescriptor(hookName = "ExternalObject", //
+onceForMap = false)
+public class ViewerController extends PersistentNodeHook implements INodeViewLifeCycleListener, IExtension {
+ private static final MExternalImageDropListener DTL = new MExternalImageDropListener();
+
+ private final class CombiFactory implements IViewerFactory {
+ private IViewerFactory factory;
+
+ public ScalableComponent createViewer(final URI uri,
+ final Dimension preferredSize) throws MalformedURLException,
+ IOException {
+ factory = getViewerFactory(uri);
+ ScalableComponent component = (factory == null ? null : factory.createViewer(uri,
+ preferredSize));
+ return component;
+ }
+
+ public ScalableComponent createViewer(final ExternalResource resource,
+ final URI absoluteUri, final int maximumWidth)
+ throws MalformedURLException, IOException {
+ factory = getViewerFactory(absoluteUri);
+ ScalableComponent component = factory.createViewer(resource, absoluteUri,
+ maximumWidth);
+ return component;
+ }
+
+ public String getDescription() {
+ final StringBuilder sb = new StringBuilder();
+ for (final IViewerFactory factory : factories) {
+ if (sb.length() != 0) {
+ sb.append(", ");
+ }
+ sb.append(factory.getDescription());
+ }
+ return sb.toString();
+ }
+
+ public boolean accept(final URI uri) {
+ return getViewerFactory(uri) != null;
+ }
+
+ public ScalableComponent createViewer(URI uri, float zoom)
+ throws MalformedURLException, IOException {
+ factory = getViewerFactory(uri);
+ ScalableComponent component = (factory == null ? null : factory.createViewer(uri,
+ zoom));
+ return component;
+ }
+
+ }
+
+ static final class FactoryFileFilter extends FileFilter {
+ private final IViewerFactory factory;
+
+ protected IViewerFactory getFactory() {
+ return factory;
+ }
+
+ private FactoryFileFilter(final IViewerFactory factory) {
+ this.factory = factory;
+ }
+
+ @Override
+ public boolean accept(final File f) {
+ return f.isDirectory() || factory.accept(f.toURI());
+ }
+
+ @Override
+ public String getDescription() {
+ return factory.getDescription();
+ }
+ }
+
+ private class MyMouseListener implements MouseListener, MouseMotionListener {
+ private boolean isActive = false;
+ private boolean sizeChanged = false;
+
+ public void mouseClicked(final MouseEvent e) {
+ if (resetSize(e)) {
+ return;
+ }
+ if (showNext(e)) {
+ return;
+ }
+ }
+
+ private boolean resetSize(final MouseEvent e) {
+ if (e.getClickCount() != 2) {
+ return false;
+ }
+ final JComponent viewer = (JComponent) e.getComponent();
+ final int x = e.getX();
+ final int width = viewer.getWidth();
+ final int y = e.getY();
+ final int height = viewer.getHeight();
+ if (x < width - 4 * BORDER_SIZE || y < height - 4 * BORDER_SIZE) {
+ return false;
+ }
+ final IViewerFactory factory = (IViewerFactory) viewer.getClientProperty(IViewerFactory.class);
+ if (factory == null) {
+ return true;
+ }
+ final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, viewer);
+ setZoom(mapView.getModeController(), mapView.getModel(), (ExternalResource) viewer
+ .getClientProperty(ExternalResource.class), 1f);
+ sizeChanged = false;
+ return true;
+ }
+
+ private boolean showNext(final MouseEvent e) {
+ //double left click
+ final JComponent component = (JComponent) e.getComponent();
+ final int cursorType = component.getCursor().getType();
+ if ((e.getClickCount() != 2) || (e.getButton() != MouseEvent.BUTTON1)
+ || (cursorType == Cursor.SE_RESIZE_CURSOR)) {
+ return false;
+ }
+ final ExternalResource activeView = getModel(e);
+ NodeModel node = null;
+ //get node from mouse click
+ for (int i = 0; i < e.getComponent().getParent().getComponentCount(); i++) {
+ if (e.getComponent().getParent().getComponent(i) instanceof MainView) {
+ final MainView mv = (MainView) e.getComponent().getParent().getComponent(i);
+ node = mv.getNodeView().getModel();
+ break;
+ }
+ }
+ if (node == null) {
+ node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ }
+ final MapModel map = node.getMap();
+ URI absoluteUri = activeView.getAbsoluteUri(map);
+ if(absoluteUri == null)
+ return false;
+ final String sActUri = absoluteUri.toString();
+ if (!sActUri.matches(".*_[0-9]{2}\\.[a-zA-Z0-9]*")) {
+ return false;
+ }
+ int i = Integer.parseInt(sActUri.substring(sActUri.lastIndexOf("_") + 1, sActUri.lastIndexOf("_") + 3));
+ //show previous with ctrl + double click
+ if (e.isControlDown()) {
+ if (i > 0) {
+ i--;
+ }
+ else {
+ //remove view if 0 and down
+ if (activeView.getUri().toString().matches(ProgressIcons.EXTENDED_PROGRESS_ICON_IDENTIFIER)) {
+ ProgressIcons.removeProgressIcons(node);
+ }
+ remove(node, activeView);
+ Controller.getCurrentModeController().getMapController().nodeChanged(node,
+ NodeModel.UNKNOWN_PROPERTY, null, null);
+ return true;
+ }
+ }
+ else {
+ i++;
+ }
+ final String sNextNum;
+ if (i < 10) {
+ sNextNum = "0" + Integer.toString(i);
+ }
+ else {
+ sNextNum = Integer.toString(i);
+ }
+ URI nextUri = null;
+ try {
+ nextUri = new URI(sActUri.replaceFirst("_[0-9]{2}\\.", "_" + sNextNum + "."));
+ }
+ catch (final URISyntaxException e1) {
+ e1.printStackTrace();
+ }
+ final String sNextURI = nextUri.getPath();
+ if ((sNextURI.contains("_tenth_")&& (i > 10))|| ((sNextURI.contains("_quarter_"))&& (i > 4))) {
+ return false;
+ }
+ final ExternalResource nextView = new ExternalResource(nextUri);
+ nextView.setZoom(activeView.getZoom());
+ remove(node, activeView);
+ add(node, nextView);
+ ProgressIcons.updateExtendedProgressIcons(node, sNextURI);
+ return true;
+ }
+
+ public void mouseEntered(final MouseEvent e) {
+ if (isActive) {
+ return;
+ }
+ final ExternalResource model = getModel(e);
+ if (model == null) {
+ return;
+ }
+ Controller.getCurrentController().getViewController().out(model.getUri().toString());
+ setCursor(e);
+ }
+
+ private ExternalResource getModel(final MouseEvent e) {
+ final JComponent component = (JComponent) e.getComponent();
+ final ExternalResource model = (ExternalResource) component.getClientProperty(ExternalResource.class);
+ return model;
+ }
+
+ public void mouseExited(final MouseEvent e) {
+ if (isActive) {
+ return;
+ }
+ setCursor(e);
+ }
+
+ private void setCursor(final MouseEvent e) {
+ final Component component = e.getComponent();
+ final int cursorType;
+ final int x = e.getX();
+ final int width = component.getWidth();
+ final int y = e.getY();
+ final int height = component.getHeight();
+ if (width - 6 * BORDER_SIZE <= x && x <= width && height - 6 * BORDER_SIZE <= y && y <= height) {
+ cursorType = Cursor.SE_RESIZE_CURSOR;
+ }
+ else {
+ cursorType = Cursor.DEFAULT_CURSOR;
+ }
+ final Cursor cursor = component.getCursor();
+ if (cursor.getType() != cursorType) {
+ final Cursor predefinedCursor = cursorType == Cursor.DEFAULT_CURSOR ? null : Cursor
+ .getPredefinedCursor(cursorType);
+ component.setCursor(predefinedCursor);
+ }
+ }
+
+ public void mousePressed(final MouseEvent e) {
+ final JComponent component = (JComponent) e.getComponent();
+ final int cursorType = component.getCursor().getType();
+ if (cursorType == Cursor.SE_RESIZE_CURSOR) {
+ final IViewerFactory factory = (IViewerFactory) component.getClientProperty(IViewerFactory.class);
+ if (factory == null) {
+ return;
+ }
+ isActive = true;
+ return;
+ }
+ else {
+ imagePopupMenu.maybeShowPopup(e);
+ return;
+ }
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ if (sizeChanged) {
+ final JComponent component = (JComponent) e.getComponent();
+ final int x = component.getWidth();
+ final int y = component.getHeight();
+ final double r = Math.sqrt(x * x + y * y);
+ final Dimension originalSize = ((ScalableComponent) component).getOriginalSize();
+ final int w = originalSize.width;
+ final int h = originalSize.height;
+ final double r0 = Math.sqrt(w * w + h * h);
+ final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, component);
+ final float zoom = mapView.getZoom();
+ final float modelSize = (float) (r / r0 / zoom);
+ setZoom(mapView.getModeController(), mapView.getModel(), (ExternalResource) component
+ .getClientProperty(ExternalResource.class), modelSize);
+ sizeChanged = false;
+ }
+ else {
+ imagePopupMenu.maybeShowPopup(e);
+ }
+ isActive = false;
+ setCursor(e);
+ }
+
+ public void mouseDragged(final MouseEvent e) {
+ if (!isActive) {
+ return;
+ }
+ setSize(e);
+ }
+
+ private boolean setSize(final MouseEvent e) {
+ if (!isActive) {
+ return false;
+ }
+ final JComponent component = (JComponent) e.getComponent();
+ final int cursorType = component.getCursor().getType();
+ sizeChanged = true;
+ final Dimension size;
+ switch (cursorType) {
+ case Cursor.SE_RESIZE_CURSOR:
+ final Dimension minimumSize = new Dimension(10, 10);
+ int x = e.getX() - 4 * BORDER_SIZE;
+ int y = e.getY() - 4 * BORDER_SIZE;
+ if (x <= 0 || y <= 0) {
+ return true;
+ }
+ final double r = Math.sqrt(x * x + y * y);
+ final Dimension preferredSize = ((ScalableComponent) component).getOriginalSize();
+ final int width = preferredSize.width;
+ final int height = preferredSize.height;
+ final double r0 = Math.sqrt(width * width + height * height);
+ x = (int) (width * r / r0);
+ y = (int) (height * r / r0);
+ final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, component);
+ if (x < mapView.getZoomed(minimumSize.width) || y < mapView.getZoomed(minimumSize.height)) {
+ return true;
+ }
+ size = new Dimension(x, y);
+ ((ScalableComponent) component).setDraftViewerSize(size);
+ component.revalidate();
+ break;
+ default:
+ }
+ return true;
+ }
+
+ public void mouseMoved(final MouseEvent e) {
+ if (isActive) {
+ return;
+ }
+ setCursor(e);
+ }
+ }
+
+ static private ExternalImagePopupMenu imagePopupMenu;
+ private static final int BORDER_SIZE = 1;
+ private static final Color BORDER_COLOR = Color.BLACK;
+ static final int VIEWER_POSITION = 5;
+ private final MyMouseListener mouseListener = new MyMouseListener();
+ final private Set<IViewerFactory> factories;
+
+ public ViewerController() {
+ super();
+ factories = new HashSet<IViewerFactory>();
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addINodeViewLifeCycleListener(this);
+ modeController.addExtension(this.getClass(), this);
+ factories.add(new BitmapViewerFactory());
+ }
+
+ @Override
+ protected HookAction createHookAction() {
+ return null;
+ }
+
+ public void setZoom(final ModeController modeController, final MapModel map, final ExternalResource model,
+ final float size) {
+ final float oldSize = model.getZoom();
+ if (size == oldSize) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ public void act() {
+ model.setZoom(size);
+ modeController.getMapController().setSaved(map, false);
+ }
+
+ public String getDescription() {
+ return "setModelSize";
+ }
+
+ public void undo() {
+ model.setZoom(oldSize);
+ modeController.getMapController().setSaved(map, false);
+ }
+ };
+ modeController.execute(actor, map);
+ }
+
+ @Override
+ protected void add(final NodeModel node, final IExtension extension) {
+ final ExternalResource preview = (ExternalResource) extension;
+ for(NodeModel nodeClone : node.allClones()){
+ for (final INodeView iNodeView : nodeClone.getViewers()) {
+ final NodeView view = (NodeView) iNodeView;
+ createViewer(preview, view);
+ }
+ }
+ super.add(node, extension);
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node) {
+ URI uri = createURI(node);
+ if(uri == null)
+ return null;
+ File input = new File(uri.getPath());
+ final ExternalResource preview = new ExternalResource(uri);
+ ProgressIcons.updateExtendedProgressIcons(node, input.getName());
+ return preview;
+ }
+
+ protected URI createURI(final NodeModel node) {
+ final Controller controller = Controller.getCurrentController();
+ final ViewController viewController = controller.getViewController();
+ final MapModel map = node.getMap();
+ final File file = map.getFile();
+ final boolean useRelativeUri = ResourceController.getResourceController().getProperty("links").equals(
+ "relative");
+ if (file == null && useRelativeUri) {
+ JOptionPane.showMessageDialog(viewController.getCurrentRootComponent(), TextUtils
+ .getText("not_saved_for_image_error"), "Freeplane", JOptionPane.WARNING_MESSAGE);
+ return null;
+ }
+ final UrlManager urlManager = controller.getModeController().getExtension(UrlManager.class);
+ final JFileChooser chooser = urlManager.getFileChooser(null, false);
+ chooser.setAcceptAllFileFilterUsed(false);
+ final FileFilter fileFilter;
+ if (factories.size() > 1) {
+ fileFilter = getCombiFileFilter();
+ chooser.addChoosableFileFilter(fileFilter);
+ for (final IViewerFactory factory : factories) {
+ chooser.addChoosableFileFilter(new FactoryFileFilter(factory));
+ }
+ }
+ else {
+ fileFilter = new FactoryFileFilter(factories.iterator().next());
+ }
+ chooser.setFileFilter(fileFilter);
+ chooser.putClientProperty(FactoryFileFilter.class, fileFilter);
+ chooser.setAccessory(new ImagePreview(chooser));
+ final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getViewController()
+ .getCurrentRootComponent());
+ if (returnVal != JFileChooser.APPROVE_OPTION) {
+ return null;
+ }
+ final File input = chooser.getSelectedFile();
+ if (input == null) {
+ return null;
+ }
+ URI uri = uriOf(input);
+ if (uri == null) {
+ return null;
+ }
+ if (useRelativeUri && uri.getScheme().equals("file")) {
+ uri = LinkController.toLinkTypeDependantURI(map.getFile(), input);
+ }
+ return uri;
+ }
+
+
+ private URI uriOf(final File input) {
+ String path = input.getPath();
+ try {
+ for (String protocol : new String[]{"http:" + File.separatorChar, "https:" + File.separatorChar}){
+ int uriStart = path.indexOf(protocol);
+ if(uriStart != -1)
+ return new URI(protocol.substring(0, protocol.length() - 1) + "//" + path.substring(uriStart + protocol.length()).replace('\\', '/'));
+ }
+ }
+ catch (URISyntaxException e) {
+ LogUtils.warn(e);
+ }
+ return input.toURI();
+ }
+
+ private IViewerFactory getViewerFactory(final URI uri) {
+ for (final IViewerFactory factory : factories) {
+ if (factory.accept(uri)) {
+ return factory;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ try {
+ final String attrUri = element.getAttribute("URI", null);
+ if (attrUri != null) {
+ final URI uri = new URI(attrUri);
+ final ExternalResource previewUrl = new ExternalResource(uri);
+ final String attrSize = element.getAttribute("SIZE", null);
+ if (attrSize != null) {
+ final float size = Float.parseFloat(attrSize);
+ previewUrl.setZoom(size);
+ }
+ Controller.getCurrentModeController().getMapController().nodeChanged(node);
+ return previewUrl;
+ }
+ }
+ catch (final URISyntaxException e) {
+ }
+ return null;
+ }
+
+ void createViewer(final ExternalResource model, final NodeView view) {
+ final JComponent viewer = createViewer(view.getMap().getModel(), model);
+ if (imagePopupMenu == null) {
+ imagePopupMenu = new ExternalImagePopupMenu();
+ }
+ viewer.setBorder(new MatteBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_COLOR));
+ final Set<NodeView> viewers = model.getViewers();
+ viewers.add(view);
+ viewer.setBounds(viewer.getX() - 5, viewer.getY() - 5, viewer.getWidth() + 15, viewer.getHeight() + 15);
+ view.addContent(viewer, VIEWER_POSITION);
+ if(view.getMap().getModeController().canEdit()){
+ final DropTarget dropTarget = new DropTarget(viewer, DTL);
+ dropTarget.setActive(true);
+ }
+ if(view.isShortened())
+ viewer.setVisible(false);
+ else {
+ viewer.revalidate();
+ viewer.repaint();
+ }
+ }
+
+ void deleteViewer(final ExternalResource model, final NodeView nodeView) {
+ final Set<NodeView> viewers = model.getViewers();
+ if (!viewers.contains(nodeView)) {
+ return;
+ }
+ nodeView.removeContent(VIEWER_POSITION);
+ viewers.remove(nodeView);
+ }
+
+ @Override
+ protected Class<ExternalResource> getExtensionClass() {
+ return ExternalResource.class;
+ }
+
+ public void onViewCreated(final Container container) {
+ final NodeView nodeView = (NodeView) container;
+ final ExternalResource previewUri = nodeView.getModel().getExtension(ExternalResource.class);
+ if (previewUri == null) {
+ return;
+ }
+ createViewer(previewUri, nodeView);
+ }
+
+ public void onViewRemoved(final Container container) {
+ final NodeView nodeView = (NodeView) container;
+ final ExternalResource previewUri = nodeView.getModel().getExtension(ExternalResource.class);
+ if (previewUri == null) {
+ return;
+ }
+ deleteViewer(previewUri, nodeView);
+ }
+
+ @Override
+ protected void remove(final NodeModel node, final IExtension extension) {
+ final ExternalResource resource = (ExternalResource) extension;
+ resource.removeViewers();
+ super.remove(node, extension);
+ }
+
+ @Override
+ protected void saveExtension(final IExtension extension, final XMLElement element) {
+ final ExternalResource previewUri = (ExternalResource) extension;
+ final URI uri = previewUri.getUri();
+ if (uri != null) {
+ element.setAttribute("URI", uri.toString());
+ }
+ final float size = previewUri.getZoom();
+ if (size != -1) {
+ element.setAttribute("SIZE", Float.toString(size));
+ }
+ super.saveExtension(extension, element);
+ }
+
+ private JComponent createViewer(final MapModel map, final ExternalResource model) {
+ final URI uri = model.getUri();
+ if (uri == null) {
+ return new JLabel("no file set");
+ }
+ final URI absoluteUri = model.getAbsoluteUri(map);
+ if (absoluteUri == null) {
+ return new JLabel(uri.toString());
+ }
+ final IViewerFactory factory = getViewerFactory(absoluteUri);
+ if (factory == null) {
+ return new JLabel(uri.toString());
+ }
+ JComponent viewer = null;
+ try {
+ final int maxWidth = ResourceController.getResourceController().getIntProperty("max_image_width");
+ viewer = (JComponent) factory.createViewer(model, absoluteUri, maxWidth);
+ }
+ catch (final Exception e) {
+ final String info = HtmlUtils.combineTextWithExceptionInfo(uri.toString(), e);
+ return new JLabel(info);
+ }
+ if (viewer == null) {
+ return new JLabel(uri.toString());
+ }
+ viewer.putClientProperty(IViewerFactory.class, factory);
+ viewer.putClientProperty(ExternalResource.class, model);
+ viewer.addMouseListener(mouseListener);
+ viewer.addMouseMotionListener(mouseListener);
+ return viewer;
+ }
+
+ private FileFilter getCombiFileFilter() {
+ return new FactoryFileFilter(new CombiFactory());
+ }
+
+ public void addFactory(final IViewerFactory factory) {
+ factories.add(factory);
+ }
+
+ public void removeFactory(final IViewerFactory factory) {
+ factories.remove(factory);
+ }
+
+ /**
+ * This method attaches an image to a node, that is referenced with an uri
+ * @param uri : The image that is to be attached to a node
+ * @param node : The node that is worked upon
+ * @return : true if successful, false otherwise
+ */
+ public boolean paste(final URI uri, final NodeModel node) {
+
+ if (uri == null || getViewerFactory(uri) == null) {
+ return false;
+ }
+
+ final ExternalResource preview = new ExternalResource(uri);
+ undoableDeactivateHook(node);
+ undoableActivateHook(node, preview);
+ ProgressIcons.updateExtendedProgressIcons(node, uri.getPath());
+ return true;
+ }
+
+ public static enum PasteMode{
+ AS_SIBLING, AS_CHILD, INSIDE;
+ public static PasteMode valueOf(boolean asSibling){
+ return asSibling ? AS_SIBLING : AS_CHILD;
+ }
+ }
+
+ public boolean paste(URI uri, final NodeModel node, final boolean isLeft) {
+ return pasteImage(uri, node, PasteMode.INSIDE, isLeft);
+ }
+
+ public boolean paste(final File file, final NodeModel targetNode, final PasteMode mode, final boolean isLeft) {
+ URI uri = uriOf(file);
+ return pasteImage(uri, targetNode, mode, isLeft);
+ }
+
+ public boolean pasteImage(URI uri, final NodeModel targetNode, final PasteMode mode, final boolean isLeft) {
+ if (uri == null || getViewerFactory(uri) == null) {
+ return false;
+ }
+ File file = new File(uri.getPath());
+ boolean isFile = uri.getScheme().equals("file");
+ if (isFile) {
+ if (!file.exists()) {
+ return false;
+ }
+ final File mapFile = targetNode.getMap().getFile();
+ if (mapFile == null && LinkController.getLinkType() == LinkController.LINK_RELATIVE_TO_MINDMAP) {
+ JOptionPane.showMessageDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(),
+ TextUtils.getText("not_saved_for_image_error"), "Freeplane", JOptionPane.WARNING_MESSAGE);
+ return false;
+ }
+ if (LinkController.getLinkType() != LinkController.LINK_ABSOLUTE) {
+ uri = LinkController.toLinkTypeDependantURI(mapFile, file);
+ }
+ }
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ final NodeModel node;
+ if (mode.equals(PasteMode.INSIDE)) {
+ node = targetNode;
+ }
+ else {
+ node = mapController.newNode(file.getName(), targetNode.getMap());
+ mapController.insertNode(node, targetNode, mode.equals(PasteMode.AS_SIBLING), isLeft, isLeft);
+ }
+ final ExternalResource preview = new ExternalResource(uri);
+ undoableDeactivateHook(node);
+ undoableActivateHook(node, preview);
+ ProgressIcons.updateExtendedProgressIcons(node, file.getName());
+ return true;
+ }
+
+ public IViewerFactory getCombiFactory() {
+ return new CombiFactory();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ViewerLayoutManager.java b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ViewerLayoutManager.java
new file mode 100644
index 0000000..880c09a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/filepreview/ViewerLayoutManager.java
@@ -0,0 +1,88 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.filepreview;
+
+/**
+ * @author Dimitry Polivaev
+ * 22.08.2009
+ */
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.LayoutManager;
+
+import javax.swing.SwingUtilities;
+
+import org.freeplane.view.swing.map.MapView;
+
+public class ViewerLayoutManager implements LayoutManager {
+ private float zoom;
+ private ExternalResource externalResource;
+ private Dimension originalSize;
+
+ /**
+ * @param externalResource TODO
+ * @param originalSize TODO
+ *
+ */
+ public ViewerLayoutManager(final float zoom, ExternalResource externalResource, Dimension originalSize) {
+ super();
+ this.zoom = zoom;
+ this.externalResource = externalResource;
+ this.originalSize = originalSize;
+ }
+
+ public void addLayoutComponent(final String name, final Component comp) {
+ }
+
+ public void layoutContainer(final Container parent) {
+ if (!parent.isPreferredSizeSet()) {
+ throw new IllegalStateException("preferred size not set for " + parent);
+ }
+ final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, parent);
+ if (mapView == null) {
+ return;
+ }
+ final float newZoom = mapView.getZoom();
+ if (zoom != newZoom) {
+ zoom = newZoom;
+ final Dimension preferredSize = calculatePreferredSize();
+ parent.setPreferredSize(preferredSize);
+ }
+ }
+
+ public Dimension calculatePreferredSize() {
+ int width = (int) (Math.ceil(originalSize.width * externalResource.getZoom() * zoom));
+ int height = (int) (Math.ceil(originalSize.height * externalResource.getZoom() * zoom));
+ final Dimension preferredSize = new Dimension(width, height);
+ return preferredSize;
+ }
+
+ public Dimension minimumLayoutSize(final Container parent) {
+ return new Dimension(0, 0);
+ }
+
+ public Dimension preferredLayoutSize(final Container parent) {
+ return parent.getPreferredSize();
+ }
+
+ public void removeLayoutComponent(final Component comp) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/nodehistory/BackAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/nodehistory/BackAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/nodehistory/BackAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/nodehistory/BackAction.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/nodehistory/ForwardAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/nodehistory/ForwardAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/nodehistory/ForwardAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/nodehistory/ForwardAction.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHistory.java b/freeplane/src/main/java/org/freeplane/view/swing/features/nodehistory/NodeHistory.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHistory.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/nodehistory/NodeHistory.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/nodehistory/NodeHolder.java b/freeplane/src/main/java/org/freeplane/view/swing/features/nodehistory/NodeHolder.java
new file mode 100644
index 0000000..dc57c2c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/nodehistory/NodeHolder.java
@@ -0,0 +1,110 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.nodehistory;
+
+import java.lang.ref.WeakReference;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.MapViewController;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * 13.12.2008
+ */
+class NodeHolder {
+ private final WeakReference<MapView> mMapView;
+ private final String mNodeId;
+ private boolean reachedByLink;
+
+ public NodeHolder(final NodeView pNode) {
+ mNodeId = pNode.getModel().createID();
+ final MapView mapView = pNode.getMap();
+ mMapView = new WeakReference<MapView>(mapView);
+ reachedByLink = false;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (!(obj instanceof NodeHolder)) {
+ return false;
+ }
+ final NodeHolder nodeHolder = (NodeHolder) obj;
+ return nodeHolder.mMapView.get() == mMapView.get() && nodeHolder.mNodeId.equals(mNodeId);
+ }
+
+ public MapView getHoldMapView() {
+ return mMapView.get();
+ }
+
+ MapView getMapView() {
+ final MapView mapView = mMapView.get();
+ final Controller controller = mapView.getModeController().getController();
+ final MapViewController mapViewManager = (MapViewController) controller.getMapViewManager();
+ for (final MapView m : mapViewManager.getMapViewVector()) {
+ if (m == mapView) {
+ return mapView;
+ }
+ }
+ return null;
+ }
+
+ ModeController getModeController() {
+ ModeController modeController = null;
+ final MapView mapView = getMapView();
+ if (mapView != null) {
+ modeController = mapView.getModeController();
+ }
+ return modeController;
+ }
+
+ /** @return null, if node not found. */
+ public NodeModel getNode() {
+ final MapView modeController = mMapView.get();
+ if (modeController != null) {
+ return modeController.getModel().getNodeForID(mNodeId);
+ }
+ return null;
+ }
+
+ @Override
+ public int hashCode() {
+ final MapView mapView = mMapView.get();
+ return mapView != null ? mapView.hashCode() * 37 : 0 + mNodeId.hashCode();
+ }
+
+ boolean isIdentical(final NodeView pNode) {
+ if(pNode == null || pNode.getModel() == null) return false;
+ final String id = pNode.getModel().createID();
+ final MapView mapView = pNode.getMap();
+ return mapView == mMapView.get() && id.equals(mNodeId);
+ }
+
+ protected boolean isReachedByLink() {
+ return reachedByLink;
+ }
+
+ protected void setReachedByLink(final boolean reachedByLink) {
+ this.reachedByLink = reachedByLink;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress10Action.java b/freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress10Action.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress10Action.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress10Action.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress25Action.java b/freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress25Action.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress25Action.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ExtendedProgress25Action.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressDownAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressDownAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressDownAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressDownAction.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressFactory.java b/freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressFactory.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressFactory.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressFactory.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressIcons.java b/freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressIcons.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressIcons.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressIcons.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUpAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUpAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUpAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUpAction.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUtilities.java b/freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUtilities.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUtilities.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/ProgressUtilities.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/RemoveProgressAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/RemoveProgressAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/progress/mindmapmode/RemoveProgressAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/progress/mindmapmode/RemoveProgressAction.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ClockState.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ClockState.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ClockState.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ClockState.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/PeriodPanel.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/PeriodPanel.java
new file mode 100644
index 0000000..9289fc1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/PeriodPanel.java
@@ -0,0 +1,80 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+
+/**
+ * @author Dimitry Polivaev
+ * Jan 15, 2012
+ */
+ at SuppressWarnings("serial")
+class PeriodPanel extends JPanel {
+ private JSpinner periodComponent;
+ private JComboBox periodUnitBox;
+ PeriodPanel(){
+ SpinnerNumberModel periodModel = new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1);
+ periodComponent = new JSpinner(periodModel);
+ periodUnitBox = new JComboBoxWithBorder(TranslatedObject.fromEnum(PeriodUnit.class));
+ periodUnitBox.setEditable(false);
+ periodUnitBox.setSelectedIndex(PeriodUnit.DAY.ordinal());
+ add(periodComponent);
+ add(periodUnitBox);
+ }
+
+ PeriodUnit getPeriodUnit(){
+ final TranslatedObject selectedItem = (TranslatedObject)periodUnitBox.getSelectedItem();
+ final PeriodUnit period = (PeriodUnit)selectedItem.getObject();
+ return period;
+ }
+
+ void setPeriodUnit(PeriodUnit unit){
+ periodUnitBox.setSelectedIndex(unit.ordinal());
+ }
+
+
+ int getPeriod(){
+ return ((Number)periodComponent.getValue()).intValue();
+ }
+
+ void setPeriod(int period){
+ periodComponent.setValue(period);
+ }
+
+ Date calculateNextTime(Date time) {
+ final PeriodUnit periodUnit = getPeriodUnit();
+ int period = getPeriod();
+ final long timeInMillis = time.getTime();
+ final Calendar calendar = Calendar.getInstance();
+ calendar.setTimeInMillis(timeInMillis);
+ if(periodUnit.equals(PeriodUnit.WEEK))
+ period *= 7;
+ calendar.add(periodUnit.calendarField, period);
+ return calendar.getTime();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/PeriodUnit.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/PeriodUnit.java
new file mode 100644
index 0000000..e303df9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/PeriodUnit.java
@@ -0,0 +1,39 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import java.util.Calendar;
+
+/**
+ * @author Dimitry Polivaev
+ * Jan 15, 2012
+ */
+enum PeriodUnit{
+ MINUTE(Calendar.MINUTE),
+ HOUR(Calendar.HOUR),
+ DAY(Calendar.DATE),
+ WEEK(Calendar.DATE),
+ MONTH(Calendar.MONTH),
+ YEAR(Calendar.YEAR);
+ final int calendarField;
+ PeriodUnit(int calendarField){
+ this.calendarField = calendarField;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderCondition.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderCondition.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderCondition.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderCondition.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionAfter.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionAfter.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionAfter.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionAfter.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionBefore.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionBefore.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionBefore.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionBefore.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionController.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionController.java
new file mode 100644
index 0000000..d31c9c7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionController.java
@@ -0,0 +1,157 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.time.TimeComboBoxEditor;
+import org.freeplane.n3.nanoxml.XMLElement;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+public class ReminderConditionController implements IElementaryConditionController {
+ static final String FILTER_REMINDER = "filter_reminder";
+ private final ComboBoxEditor editor = new TimeComboBoxEditor(true);
+ private final ComboBoxModel values = new DefaultComboBoxModel();
+
+ public ReminderConditionController() {
+ super();
+ }
+
+ public boolean canEditValues(final Object property, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ return namedObject.objectEquals(ReminderConditionController.FILTER_REMINDER);
+ }
+
+ public boolean canSelectValues(final Object property, final TranslatedObject simpleCond) {
+ if(simpleCond.objectEquals(ReminderConditionLater.FILTER_REMINDER_LATER))
+ return false;
+ if(simpleCond.objectEquals(ReminderConditionExecuted.FILTER_REMINDER_EXECUTED))
+ return false;
+ return true;
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase,
+ final boolean matchApproximately) {
+ return ReminderConditionController.create(simpleCond, (FormattedDate) value);
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object property) {
+ return new DefaultComboBoxModel(getTimeConditionNames());
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(FILTER_REMINDER));
+ return list;
+ }
+
+ public Object[] getTimeConditionNames() {
+ return new TranslatedObject[] {
+ TextUtils.createTranslatedString(ReminderConditionLater.FILTER_REMINDER_LATER),
+ TextUtils.createTranslatedString(ReminderConditionExecuted.FILTER_REMINDER_EXECUTED),
+ TextUtils.createTranslatedString(ReminderCondition.FILTER_REMINDER_AFTER),
+ TextUtils.createTranslatedString(ReminderCondition.FILTER_REMINDER_BEFORE) };
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ return editor;
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object selectedItem, TranslatedObject simpleCond) {
+ values.setSelectedItem(FormattedDate.createDefaultFormattedDate(System.currentTimeMillis(), IFormattedObject.TYPE_DATETIME));
+ return values;
+ }
+
+ public boolean isCaseDependent(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ try {
+ if (element.getName().equalsIgnoreCase(ReminderConditionLater.NAME)) {
+ return new ReminderConditionLater();
+ }
+ if (element.getName().equalsIgnoreCase(ReminderConditionExecuted.NAME)) {
+ return new ReminderConditionExecuted();
+ }
+ if (element.getName().equalsIgnoreCase(ReminderConditionBefore.NAME)) {
+ final String dateString = element.getAttribute(ReminderCondition.DATE, null);
+ final FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
+ return new ReminderConditionBefore(date);
+ }
+ if (element.getName().equalsIgnoreCase(ReminderConditionAfter.NAME)) {
+ final String dateString = element.getAttribute(ReminderCondition.DATE, null);
+ final FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
+ return new ReminderConditionAfter(date);
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ return null;
+ }
+
+ public static ASelectableCondition create(final TranslatedObject simpleCond, final FormattedDate date) {
+ if (simpleCond.objectEquals(ReminderConditionLater.FILTER_REMINDER_LATER)) {
+ return new ReminderConditionLater();
+ }
+ if (simpleCond.objectEquals(ReminderConditionExecuted.FILTER_REMINDER_EXECUTED)) {
+ return new ReminderConditionExecuted();
+ }
+ if (simpleCond.objectEquals(ReminderCondition.FILTER_REMINDER_AFTER)) {
+ return new ReminderConditionAfter(date);
+ }
+ if (simpleCond.objectEquals(ReminderCondition.FILTER_REMINDER_BEFORE)) {
+ return new ReminderConditionBefore(date);
+ }
+ return null;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionExecuted.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionExecuted.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionExecuted.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionExecuted.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionLater.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionLater.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionLater.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionLater.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderExtension.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderExtension.java
new file mode 100644
index 0000000..5a7984a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderExtension.java
@@ -0,0 +1,172 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import java.util.Date;
+import java.util.Timer;
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.util.SysUtils;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+
+/**
+ * @author Dimitry Polivaev 30.11.2008
+ */
+public class ReminderExtension implements IExtension, IMapChangeListener {
+ static final int BLINKING_PERIOD = 1000;
+ /**
+ */
+ public static ReminderExtension getExtension(final NodeModel node) {
+ return (ReminderExtension) node.getExtension(ReminderExtension.class);
+ }
+
+ private final NodeModel node;
+ private long remindUserAt = 0;
+ private PeriodUnit periodUnit;
+ private int period;
+ private Timer timer;
+ private String script;
+ private TimerBlinkTask task;
+
+ public ReminderExtension(final NodeModel node) {
+ this.node = node;
+ }
+
+ public NodeModel getNode() {
+ return node;
+ }
+
+ public long getRemindUserAt() {
+ return remindUserAt;
+ }
+
+ public void setRemindUserAt(final long remindUserAt) {
+ this.remindUserAt = remindUserAt;
+ }
+
+
+ public PeriodUnit getPeriodUnit() {
+ return periodUnit;
+ }
+
+ public void setPeriodUnit(PeriodUnit periodUnit) {
+ this.periodUnit = periodUnit;
+ }
+
+ public String getPeriodUnitAsString() {
+ return periodUnit == null ? null : periodUnit.name();
+ }
+
+ public void setPeriodUnitAsString(String periodUnit) {
+ this.periodUnit = PeriodUnit.valueOf(periodUnit);
+ }
+
+ public int getPeriod() {
+ return period;
+ }
+
+ public void setPeriod(int period) {
+ this.period = period;
+ }
+
+ public String getScript() {
+ return script;
+ }
+
+ public void setScript(String script) {
+ this.script = script;
+ }
+
+ public void scheduleTimer(final TimerBlinkTask task, final Date date) {
+ if (timer == null) {
+ timer = SysUtils.createTimer(getClass().getSimpleName());
+ }
+ timer.schedule(task, date, BLINKING_PERIOD);
+ this.task = task;
+ }
+
+ public void deactivateTimer() {
+ if (timer == null) {
+ return;
+ }
+ timer.cancel();
+ timer = null;
+ task = null;
+ }
+
+ private void displayStateIcon(final NodeModel parent, final ClockState state) {
+ if (task != null && ! task.alreadyExecuted() || !isAncestorNode(parent)) {
+ return;
+ }
+ displayState(state, parent, true);
+ }
+
+ private boolean isAncestorNode(final NodeModel parent) {
+ for (NodeModel n = node; n != null; n = n.getParentNode()) {
+ if (n.equals(parent)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
+ displayStateIcon(parent, ClockState.CLOCK_VISIBLE);
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ displayStateIcon(nodeMoveEvent.newParent, ClockState.CLOCK_VISIBLE);
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ displayStateIcon(nodeDeletionEvent.parent, null);
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ displayStateIcon(nodeMoveEvent.oldParent, null);
+ }
+
+ public void mapChanged(final MapChangeEvent event) {
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void displayState(final ClockState stateAdded, final NodeModel pNode,
+ final boolean recurse) {
+ if(stateAdded != null)
+ pNode.putExtension(stateAdded);
+ else
+ pNode.removeExtension(ClockState.class);
+ Controller.getCurrentModeController().getMapController().nodeRefresh(pNode);
+ if (!recurse) {
+ return;
+ }
+ final NodeModel parentNode = pNode.getParentNode();
+ if (parentNode == null) {
+ return;
+ }
+ displayState(stateAdded, parentNode, recurse);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderHook.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderHook.java
new file mode 100644
index 0000000..e2466f7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/ReminderHook.java
@@ -0,0 +1,409 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.text.MessageFormat;
+import java.util.Date;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTabbedPane;
+import javax.swing.Timer;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.icon.IStateIconProvider;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.IconStore;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.ITooltipProvider;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.script.IScriptStarter;
+import org.freeplane.features.text.TextController;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.view.swing.features.time.mindmapmode.TimeManagement.JTimePanel;
+import org.freeplane.view.swing.features.time.mindmapmode.nodelist.AllMapsNodeListAction;
+import org.freeplane.view.swing.features.time.mindmapmode.nodelist.NodeList;
+import org.freeplane.view.swing.features.time.mindmapmode.nodelist.NodeListAction;
+import org.freeplane.view.swing.map.attribute.AttributePanelManager;
+
+/**
+ * @author foltin
+ */
+ at NodeHookDescriptor(hookName = "plugins/TimeManagementReminder.xml", onceForMap = false)
+public class ReminderHook extends PersistentNodeHook implements IExtension {
+
+ private static final String REMINDERS_BLINK = "remindersBlink";
+ //******************************************
+ @EnabledAction(checkOnNodeChange = true)
+ private class ReminderHookAction extends HookAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public ReminderHookAction() {
+ super("ReminderHookAction");
+ }
+
+ @Override
+ public void setEnabled() {
+ setEnabled(isActiveForSelection());
+ }
+ }
+
+ static private class TimeListAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final NodeList timeList;
+
+ public TimeListAction() {
+ super("TimeListAction");
+ timeList = new NodeList(false, false, "timelistwindow.configuration");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ timeList.startup();
+ }
+ }
+
+ static private class TimeManagementAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final TimeManagement timeManagement;
+
+ public TimeManagementAction( final ReminderHook reminderHook) {
+ super("TimeManagementAction");
+ timeManagement = new TimeManagement(reminderHook);
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ timeManagement.showDialog();
+ }
+ }
+
+ //******************************************
+ static final String PLUGIN_LABEL = "plugins/TimeManagementReminder.xml";
+ static final String REMINDUSERAT = "REMINDUSERAT";
+ static final String PERIOD = "PERIOD";
+ static final String UNIT = "UNIT";
+ static final String SCRIPT = "SCRIPT";
+ private static final Integer REMINDER_TOOLTIP = 12;
+ private ModeController modeController;
+
+ /**
+ *
+ */
+ public ReminderHook(ModeController modeController){
+ super();
+ this.modeController = modeController;
+ registerAction(new TimeManagementAction(this));
+ registerAction(new TimeListAction());
+ registerAction(new NodeListAction());
+ registerAction(new AllMapsNodeListAction());
+ registerTooltipProvider();
+ registerStateIconProvider();
+
+ FilterController.getCurrentFilterController().getConditionFactory().addConditionController(90,
+ new ReminderConditionController());
+ createTimePanel();
+ }
+ private static final IconStore STORE = IconStoreFactory.create();
+ private static UIIcon bellIcon;
+ private static UIIcon clockIcon;
+ private static UIIcon flagIcon;
+ void registerStateIconProvider(){
+ IconController.getController(modeController).addStateIconProvider(new IStateIconProvider() {
+ public UIIcon getStateIcon(NodeModel node) {
+ UIIcon icon = null;
+ ClockState stateAdded = node.getExtension(ClockState.class);
+ ReminderExtension reminder = node.getExtension(ReminderExtension.class);
+ if (stateAdded == ClockState.CLOCK_VISIBLE) {
+ icon = getClockIcon();
+ }
+ else if (stateAdded == ClockState.CLOCK_INVISIBLE) {
+ if (reminder != null && node.allClones().contains(reminder.getNode())) {
+ icon = getBellIcon();
+ }
+ else {
+ icon = getFlagIcon();
+ }
+ }
+ if (stateAdded != null || reminder != null && node == reminder.getNode()
+ || ReminderExtension.getExtension(node) == null) {
+ return icon;
+ }
+ return null;
+ }
+ });
+ }
+ private UIIcon getBellIcon() {
+ if (bellIcon == null) {
+ bellIcon = STORE.getUIIcon("bell.png");
+ }
+ return bellIcon;
+ }
+
+ private UIIcon getClockIcon() {
+ if (clockIcon == null) {
+ clockIcon = STORE.getUIIcon("clock.png");
+ }
+ return clockIcon;
+ }
+
+ private UIIcon getFlagIcon() {
+ if (flagIcon == null) {
+ flagIcon = STORE.getUIIcon("flag.png");
+ }
+ return flagIcon;
+ }
+ private void registerTooltipProvider() {
+ modeController.addToolTipProvider(REMINDER_TOOLTIP, new ITooltipProvider() {
+ public String getTooltip(ModeController modeController, NodeModel node, Component view) {
+ final ReminderExtension model = ReminderExtension.getExtension(node);
+ if(model == null)
+ return null;
+ final Date date = new Date(model.getRemindUserAt());
+ final Object[] messageArguments = { date };
+ final MessageFormat formatter = new MessageFormat(TextUtils
+ .getText("plugins/TimeManagement.xml_reminderNode_tooltip"));
+ final String message = formatter.format(messageArguments);
+ return message;
+ }
+ });
+
+ }
+
+ private void createTimePanel() {
+ final TimeManagement timeManagement = new TimeManagement(this);
+ final int axis = BoxLayout.Y_AXIS;
+ final JTimePanel timePanel = timeManagement.createTimePanel(null, false, 1);
+ modeController.getMapController().addNodeSelectionListener(new INodeSelectionListener() {
+ public void onSelect(NodeModel node) {
+ timePanel.update(node);
+ }
+
+ public void onDeselect(NodeModel node) {
+ }
+ });
+ modeController.getMapController().addNodeChangeListener(new INodeChangeListener() {
+ public void nodeChanged(NodeChangeEvent event) {
+ final NodeModel node = event.getNode();
+ if(event.getProperty().equals(getExtensionClass()) && node.equals(modeController.getMapController().getSelectedNode()))
+ timePanel.update(node);
+ }
+ });
+ timePanel.setBorder(BorderFactory.createTitledBorder(TextUtils.getText("calendar_panel")));
+ final JPanel tablePanel = new AttributePanelManager(modeController).getTablePanel();
+ tablePanel.setBorder(BorderFactory.createTitledBorder(TextUtils.getText("attributes_attribute")));
+ final Box panel = new Box(axis);
+ panel.add(timePanel);
+ panel.add(tablePanel);
+ final JTabbedPane tabs = (JTabbedPane) modeController.getUserInputListenerFactory().getToolBar("/format").getComponent(1);
+ final JScrollPane timeScrollPane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ UITools.setScrollbarIncrement(timeScrollPane);
+ tabs.add(TextUtils.getText("calendar_attributes_panel"), timeScrollPane);
+ }
+
+ @Override
+ public void add(final NodeModel node, final IExtension extension) {
+ final ReminderExtension reminderExtension = (ReminderExtension) extension;
+ scheduleTimer(reminderExtension);
+ modeController.getMapController().addMapChangeListener(reminderExtension);
+ super.add(node, extension);
+ }
+
+ void blink(final ReminderExtension model, final boolean stateAdded) {
+ if (model.getNode().getMap() != Controller.getCurrentController().getMap()) {
+ return;
+ }
+ model.displayState((stateAdded) ? ClockState.CLOCK_INVISIBLE : ClockState.CLOCK_VISIBLE, model.getNode(), true);
+ if(! ResourceController.getResourceController().getBooleanProperty(REMINDERS_BLINK))
+ model.deactivateTimer();
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ final ReminderExtension reminderExtension = new ReminderExtension(node);
+ final XMLElement parameters = element.getFirstChildNamed("Parameters");
+ final String time = parameters.getAttribute(REMINDUSERAT, "0");
+ final String unit = parameters.getAttribute(UNIT, "DAY");
+ final String period = parameters.getAttribute(PERIOD, "1");
+ reminderExtension.setRemindUserAt(Long.parseLong(time));
+ reminderExtension.setPeriodUnit(PeriodUnit.valueOf(unit));
+ reminderExtension.setPeriod(Integer.parseInt(period));
+ final String script = parameters.getAttribute(SCRIPT, null);
+ reminderExtension.setScript(script);
+ return reminderExtension;
+ }
+
+ @Override
+ protected HookAction createHookAction() {
+ return new ReminderHookAction();
+ }
+
+ @Override
+ protected Class<? extends IExtension> getExtensionClass() {
+ return ReminderExtension.class;
+ }
+
+ @Override
+ public void remove(final NodeModel node, final IExtension extension) {
+ final ReminderExtension reminderExtension = (ReminderExtension) extension;
+ reminderExtension.deactivateTimer();
+ reminderExtension.displayState(null, reminderExtension.getNode(), true);
+ modeController.getMapController().removeMapChangeListener(reminderExtension);
+ super.remove(node, extension);
+ }
+
+ @Override
+ protected void saveExtension(final IExtension extension, final XMLElement element) {
+ super.saveExtension(extension, element);
+ final ReminderExtension reminderExtension = (ReminderExtension) extension;
+ final XMLElement parameters = element.createElement("Parameters");
+ parameters.setAttribute(REMINDUSERAT, Long.toString(reminderExtension.getRemindUserAt()));
+ parameters.setAttribute(PERIOD, Integer.toString(reminderExtension.getPeriod()));
+ parameters.setAttribute(UNIT, reminderExtension.getPeriodUnit().toString());
+ final String script = reminderExtension.getScript();
+ if(script != null){
+ parameters.setAttribute(SCRIPT, script);
+ }
+
+ element.addChild(parameters);
+ }
+
+ private void scheduleTimer(final ReminderExtension model) {
+ final Date date = new Date(model.getRemindUserAt());
+ scheduleTimer(model, new TimerBlinkTask(this, model, false, System.currentTimeMillis() < date.getTime() + ReminderExtension.BLINKING_PERIOD));
+ model.displayState(ClockState.CLOCK_VISIBLE, model.getNode(), false);
+ }
+
+ private void scheduleTimer(final ReminderExtension model, final TimerBlinkTask task) {
+ final Date date = new Date(model.getRemindUserAt());
+ model.scheduleTimer(task, date);
+ }
+
+ ModeController getModeController() {
+ return modeController;
+ }
+ public void runScript(ReminderExtension reminderExtension) {
+ final String script = reminderExtension.getScript();
+ if(script == null || script.equals(""))
+ return;
+ final IScriptStarter starter = (IScriptStarter) modeController.getExtension(IScriptStarter.class);
+ if(starter == null)
+ return;
+ final NodeModel node = reminderExtension.getNode();
+ final MapModel map = node.getMap();
+ final Controller controller = modeController.getController();
+ if(! controller.getMapViewManager().getMaps(modeController.getModeName()).containsValue(map))
+ return;
+ starter.executeScript(node, script);
+ }
+ /**
+ * @author Dimitry
+ *
+ */
+ enum NotificationOptions {
+ SELECT_NODE, REMOVE_REMINDER, REMIND_ME_LATER, CLOSE;
+
+ @Override
+ public String toString() {
+ return TextUtils.getText("NotificationOptions." + name());
+ }
+
+ };
+ public void showNotificationPopup(ReminderExtension reminderExtension) {
+ final NodeModel node = reminderExtension.getNode();
+
+ String information = modeController.getExtension(TextController.class).getText(node);
+ String title = TextUtils.getText("reminderNotification");
+ final int option = JOptionPane.showOptionDialog(UITools.getCurrentFrame(), new JLabel(information), title, JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, NotificationOptions.values(), NotificationOptions.SELECT_NODE);
+ if(option >= 0) {
+ switch(NotificationOptions.values()[option]){
+ case SELECT_NODE:
+ UITools.executeWhenNodeHasFocus(new Runnable() {
+ @Override
+ public void run() {
+ // Work around because docking windows work with delayed actions
+ final Timer timer = new Timer(100, new ActionListener() {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ Controller.getCurrentModeController().getMapController().select(node);
+ }
+ });
+ timer.setRepeats(false);
+ timer.start();
+ }
+ });
+
+ break;
+ case REMOVE_REMINDER:
+ undoableDeactivateHook(node);
+ break;
+ case REMIND_ME_LATER:
+ remove(node, reminderExtension);
+ final long now = new Date().getTime();
+ final int delay = ResourceController.getResourceController().getTimeProperty("remindersStandardDelay");
+ reminderExtension.setRemindUserAt(now + delay);
+ add(node, reminderExtension);
+ break;
+ case CLOSE:
+ break;
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/TimeManagement.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/TimeManagement.java
new file mode 100644
index 0000000..96fbb60
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/TimeManagement.java
@@ -0,0 +1,539 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.Dimension;
+import java.awt.KeyboardFocusManager;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.text.MessageFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Vector;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.ComboBoxEditor;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JTable;
+import javax.swing.SwingUtilities;
+import javax.swing.WindowConstants;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.components.calendar.JCalendar;
+import org.freeplane.core.ui.components.calendar.JDayChooser;
+import org.freeplane.core.ui.components.calendar.JTripleCalendar;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.script.IScriptEditorStarter;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+import com.jgoodies.forms.layout.FormSpecs;
+import com.jgoodies.forms.layout.FormLayout;
+
+/**
+ * @author foltin
+ */
+class TimeManagement implements PropertyChangeListener, IMapSelectionListener {
+
+ class JTimePanel extends JPanel
+ {
+ private static final long serialVersionUID = 1L;
+ private JButton setReminderButton;
+ private JButton removeReminderButton;
+ private JButton remindLaterButton;
+ private PeriodPanel periodPanel;
+ private ComboBoxEditor scriptEditor;
+ private JCalendar calendarComponent;
+ private JComboBox dateFormatChooser;
+
+ public JTimePanel(boolean useTriple, int colCount) {
+ super();
+ init(useTriple, colCount);
+ final NodeModel selected = reminderHook.getModeController().getMapController().getSelectedNode();
+ update(selected);
+ }
+
+ public void update(NodeModel node){
+ if(node == null)
+ return;
+ final ReminderExtension reminder = ReminderExtension.getExtension(node);
+ final boolean reminderIsSet = reminder != null;
+ removeReminderButton.setEnabled(reminderIsSet);
+ if(reminderIsSet){
+ final long reminderTime = reminder.getRemindUserAt();
+ updateCalendar(reminderTime);
+ periodPanel.setPeriod(reminder.getPeriod());
+ periodPanel.setPeriodUnit(reminder.getPeriodUnit());
+ if(scriptEditor != null)
+ scriptEditor.setItem(reminder.getScript());
+ }
+ else{
+ if(scriptEditor != null)
+ scriptEditor.setItem(null);
+ }
+ }
+
+ private void updateCalendar(final long reminderTime) {
+ TimeManagement.this.calendar.setTimeInMillis(reminderTime);
+ calendarComponent.setCalendar(TimeManagement.this.calendar);
+ dateFormatChooser.repaint();
+ }
+
+ private void init(boolean useTriple, int colCount) {
+ final JComponent calendarContainer;
+ if (useTriple) {
+ final JTripleCalendar trippleCalendar = new JTripleCalendar();
+ calendarComponent = trippleCalendar.getCalendar();
+ calendarContainer = trippleCalendar;
+ }
+ else {
+ calendarComponent = new JCalendar();
+ calendarContainer = calendarComponent;
+ }
+ calendarComponent.setCalendar(TimeManagement.this.calendar);
+ if (dialog != null) {
+ dialog.addWindowFocusListener(new WindowAdapter() {
+ @Override
+ public void windowGainedFocus(WindowEvent e) {
+ calendarComponent.getDayChooser().setFocus();
+ }
+ });
+ }
+ calendarComponent.setMaximumSize(calendarComponent.getPreferredSize());
+ setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
+ add(Box.createHorizontalGlue());
+ calendarComponent.getDayChooser().addPropertyChangeListener(TimeManagement.this);
+ calendarContainer.setAlignmentX(0.5f);
+ add(calendarContainer);
+
+ DefaultFormBuilder btnBuilder = new DefaultFormBuilder(new FormLayout(FormSpecs.GROWING_BUTTON_COLSPEC.toString(), ""));
+ btnBuilder.getLayout().addGroupedColumn(btnBuilder.getColumnCount());
+ for(int i = 1; i< colCount; i++){
+ btnBuilder.appendRelatedComponentsGapColumn();
+ btnBuilder.appendColumn(FormSpecs.GROWING_BUTTON_COLSPEC);
+ btnBuilder.getLayout().addGroupedColumn(btnBuilder.getColumnCount());
+ }
+
+ {
+ final JButton todayButton = new JButton(getResourceString("plugins/TimeManagement.xml_todayButton"));
+ todayButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent arg0) {
+ final Calendar currentTime = Calendar.getInstance();
+ currentTime.set(Calendar.SECOND, 0);
+ TimeManagement.this.calendar.setTimeInMillis(currentTime.getTimeInMillis());
+ calendarComponent.setCalendar(TimeManagement.this.calendar);
+ }
+ });
+ btnBuilder.append(todayButton);
+ }
+ {
+ dateFormatChooser = createDateFormatChooser();
+ btnBuilder.append(dateFormatChooser);
+ }
+ {
+ final JButton appendButton = new JButton(getResourceString("plugins/TimeManagement.xml_appendButton"));
+ if (dialog == null) {
+ appendButton.setFocusable(false);
+ }
+ appendButton.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ insertTime(dialog, appendButton);
+ }
+ });
+ btnBuilder.append(appendButton);
+ }
+ {
+ scriptEditor = null;
+ IScriptEditorStarter editor = (IScriptEditorStarter) reminderHook.getModeController().getExtension(IScriptEditorStarter.class);
+ if(editor != null){
+ scriptEditor = editor.createComboBoxEditor(new Dimension(600, 400));
+ Component scriptButton = scriptEditor.getEditorComponent();
+ btnBuilder.append(scriptButton);
+ }
+ }
+ {
+ setReminderButton = new JButton(getResourceString("plugins/TimeManagement.xml_reminderButton"));
+ setReminderButton.setToolTipText(getResourceString("plugins/TimeManagement.xml_reminderButton_tooltip"));
+ setReminderButton.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ addReminder();
+ }
+ });
+ btnBuilder.append(setReminderButton);
+ }
+ {
+ remindLaterButton = new JButton(
+ getResourceString("plugins/TimeManagement.xml_remindLaterButton"));
+ remindLaterButton.setToolTipText(getResourceString("plugins/TimeManagement.xml_remindLaterButton_tooltip"));
+ remindLaterButton.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ remindLaterReminder();
+ }
+
+ });
+ btnBuilder.append(remindLaterButton);
+ }
+ {
+ periodPanel = new PeriodPanel();
+ btnBuilder.append(periodPanel);
+ }
+ {
+ removeReminderButton = new JButton(
+ getResourceString("plugins/TimeManagement.xml_removeReminderButton"));
+ removeReminderButton.setToolTipText(getResourceString("plugins/TimeManagement.xml_removeReminderButton_tooltip"));
+ removeReminderButton.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ removeReminder();
+ }
+
+ });
+ btnBuilder.append(removeReminderButton);
+ }
+ if (dialog != null) {
+ final JButton cancelButton = new JButton(getResourceString("plugins/TimeManagement.xml_closeButton"));
+ cancelButton.addMouseListener(new MouseAdapter() {
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ disposeDialog();
+ }
+ });
+ btnBuilder.append(cancelButton);
+ }
+ final JPanel btnPanel = btnBuilder.getPanel();
+ btnPanel.setAlignmentX(CENTER_ALIGNMENT);
+ add(btnPanel);
+ }
+
+ private void addReminder() {
+ final Date date = getCalendarDate();
+ String script = null;
+ if(scriptEditor != null){
+ script = (String) scriptEditor.getItem();
+ if(script != null && "".equals(script.trim()))
+ script = null;
+ }
+ Controller controller = Controller.getCurrentController();
+ for (final NodeModel node : controller.getModeController().getMapController().getSelectedNodes()) {
+ final ReminderExtension alreadyPresentHook = ReminderExtension.getExtension(node);
+ if (alreadyPresentHook != null) {
+ final long oldReminderTime = alreadyPresentHook.getRemindUserAt();
+ if(oldReminderTime > System.currentTimeMillis()){
+ final Object[] messageArguments = { new Date(oldReminderTime), date };
+ final MessageFormat formatter = new MessageFormat(
+ getResourceString("plugins/TimeManagement.xml_reminderNode_onlyOneDate"));
+ final String message = formatter.format(messageArguments);
+ final int result = JOptionPane.showConfirmDialog(controller.getViewController().getCurrentRootComponent(), message,
+ "Freeplane", JOptionPane.YES_NO_OPTION);
+ if (result == JOptionPane.NO_OPTION) {
+ return;
+ }
+ }
+ reminderHook.undoableToggleHook(node);
+ }
+ final ReminderExtension reminderExtension = new ReminderExtension(node);
+ reminderExtension.setRemindUserAt(date.getTime());
+ reminderExtension.setPeriodUnit(periodPanel.getPeriodUnit());
+ reminderExtension.setPeriod(periodPanel.getPeriod());
+ reminderExtension.setScript(script);
+ reminderHook.undoableActivateHook(node, reminderExtension);
+ }
+ }
+
+ private void removeReminder() {
+ for (final NodeModel node : getMindMapController().getMapController().getSelectedNodes()) {
+ final ReminderExtension alreadyPresentHook = ReminderExtension.getExtension(node);
+ if (alreadyPresentHook != null) {
+ reminderHook.undoableToggleHook(node);
+ }
+ }
+ }
+ private void remindLaterReminder(){
+ Date nextTime = periodPanel.calculateNextTime(calendar.getTime());
+ updateCalendar(nextTime.getTime());
+ addReminder();
+ }
+ }
+ private Calendar calendar;
+ public final static String REMINDER_HOOK_NAME = "plugins/TimeManagementReminder.xml";
+ private static TimeManagement sCurrentlyOpenTimeManagement = null;
+ private JDialog dialog;
+ private final ReminderHook reminderHook;
+ private PatternFormat dateFormat;
+ private INodeChangeListener nodeChangeListener;
+ private INodeSelectionListener nodeSelectionListener;
+
+ public TimeManagement( final ReminderHook reminderHook) {
+ this.reminderHook = reminderHook;
+ Controller.getCurrentController().getMapViewManager().addMapSelectionListener(this);
+ }
+
+
+ public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
+ }
+
+ public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
+ disposeDialog();
+ }
+
+ /**
+ *
+ */
+ private void disposeDialog() {
+ if (dialog == null) {
+ return;
+ }
+ getMindMapController().getMapController().removeNodeSelectionListener(nodeSelectionListener);
+ nodeSelectionListener = null;
+ getMindMapController().getMapController().removeNodeChangeListener(nodeChangeListener);
+ nodeChangeListener = null;
+ dialog.setVisible(false);
+ dialog.dispose();
+ dialog = null;
+ TimeManagement.sCurrentlyOpenTimeManagement = null;
+ }
+
+ private FormattedDate getCalendarDate() {
+ return new FormattedDate(calendar.getTime(), dateFormat.getPattern());
+ }
+
+ private ModeController getMindMapController() {
+ return Controller.getCurrentModeController();
+ }
+
+ private String getResourceString(final String string) {
+ return TextUtils.getText(string);
+ }
+
+
+ public void propertyChange(final PropertyChangeEvent event) {
+ if (event.getPropertyName().equals(JDayChooser.DAY_PROPERTY)) {
+ }
+ }
+
+ void showDialog() {
+ if (TimeManagement.sCurrentlyOpenTimeManagement != null) {
+ TimeManagement.sCurrentlyOpenTimeManagement.dialog.getContentPane().setVisible(true);
+ return;
+ }
+ TimeManagement.sCurrentlyOpenTimeManagement = this;
+ dialog = new JDialog(UITools.getCurrentFrame(), false /*not modal*/);
+ final JTimePanel timePanel =createTimePanel(dialog, true, 4);
+ nodeSelectionListener = new INodeSelectionListener() {
+ public void onSelect(NodeModel node) {
+ timePanel.update(node);
+ }
+
+ public void onDeselect(NodeModel node) {
+ }
+ };
+ getMindMapController().getMapController().addNodeSelectionListener(nodeSelectionListener);
+ nodeChangeListener = new INodeChangeListener() {
+ public void nodeChanged(NodeChangeEvent event) {
+ final NodeModel node = event.getNode();
+ if(event.getProperty().equals(ReminderExtension.class) && node.equals(getMindMapController().getMapController().getSelectedNode()))
+ timePanel.update(node);
+ }
+ };
+ getMindMapController().getMapController().addNodeChangeListener(nodeChangeListener);
+
+ dialog.setTitle(getResourceString("plugins/TimeManagement.xml_WindowTitle"));
+ dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ dialog.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(final WindowEvent event) {
+ disposeDialog();
+ }
+ });
+ final Action action = new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent arg0) {
+ disposeDialog();
+ }
+ };
+ UITools.addEscapeActionToDialog(dialog, action);
+ dialog.setContentPane(timePanel);
+ dialog.pack();
+ UITools.setBounds(dialog, -1, -1, dialog.getWidth(), dialog.getHeight());
+ dialog.setVisible(true);
+ }
+
+ public JTimePanel createTimePanel(final Dialog dialog, boolean useTriple, int colCount) {
+ if (this.calendar == null) {
+ this.calendar = Calendar.getInstance();
+ this.calendar.set(Calendar.SECOND, 0);
+ this.calendar.set(Calendar.MILLISECOND, 0);
+ }
+ JTimePanel contentPane = new JTimePanel(useTriple, colCount);
+ return contentPane;
+ }
+
+ private JComboBox createDateFormatChooser() {
+ class DateFormatComboBoxElement {
+ private final PatternFormat dateFormat;
+
+ DateFormatComboBoxElement(PatternFormat dateFormat) {
+ this.dateFormat = dateFormat;
+ }
+
+ PatternFormat getDateFormat() {
+ return dateFormat;
+ }
+
+ public String toString() {
+ return dateFormat.formatObject(getCalendarDate()).toString();
+ }
+ }
+ final String dateFormatPattern = ResourceController.getResourceController().getProperty(
+ "date_format");
+ final Vector<DateFormatComboBoxElement> values = new Vector<DateFormatComboBoxElement>();
+ final List<PatternFormat> datePatterns = FormatController.getController().getDateFormats();
+ int selectedIndex = 0;
+ for (int i = 0; i < datePatterns.size(); ++i) {
+ final PatternFormat patternFormat = datePatterns.get(i);
+ values.add(new DateFormatComboBoxElement(patternFormat));
+ if (patternFormat.getPattern().equals(dateFormatPattern)) {
+ dateFormat = patternFormat;
+ selectedIndex = i;
+ }
+ }
+ final JComboBox dateFormatChooser = new JComboBox(values);
+ dateFormatChooser.setFocusable(false);
+ if (!datePatterns.isEmpty()){
+ dateFormatChooser.setSelectedIndex(selectedIndex);
+ dateFormat = ((DateFormatComboBoxElement) (dateFormatChooser.getSelectedItem())).getDateFormat();
+ }
+ dateFormatChooser.addItemListener(new ItemListener() {
+ public void itemStateChanged(final ItemEvent e) {
+ dateFormat = ((DateFormatComboBoxElement) e.getItem()).getDateFormat();
+ final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ if(focusOwner instanceof JTable){
+ JTable table = (JTable) focusOwner;
+ final int[] selectedRows = table.getSelectedRows();
+ final int[] selectedColumns = table.getSelectedColumns();
+ for(int r : selectedRows)
+ for(int c : selectedColumns){
+ Object date = table.getValueAt(r, c);
+ if(date instanceof FormattedDate){
+ final FormattedDate fd = (FormattedDate) date;
+ if(! fd.getDateFormat().equals(dateFormat)){
+ table.setValueAt(new FormattedDate(fd, dateFormat.getPattern()), r, c);
+ }
+ }
+ }
+ }
+ else{
+ ModeController mController = Controller.getCurrentModeController();
+ for (final NodeModel node : mController.getMapController().getSelectedNodes()) {
+ final MTextController textController = (MTextController) TextController.getController();
+ Object date = node.getUserObject();
+ if(date instanceof FormattedDate){
+ final FormattedDate fd = (FormattedDate) date;
+ if(! fd.getDateFormat().equals(dateFormat)){
+ textController.setNodeObject(node, new FormattedDate(fd, dateFormat.getPattern()));
+ }
+ }
+ }
+ }
+
+ }
+ });
+ dateFormatChooser.setAlignmentX(Component.LEFT_ALIGNMENT);
+ return dateFormatChooser;
+ }
+
+ void insertTime(final Dialog dialog, final JButton appendButton) {
+ FormattedDate date = getCalendarDate();
+ final String dateAsString = dateFormat.formatObject(date).toString();
+ final Window parentWindow;
+ if (dialog != null) {
+ parentWindow = (Window) dialog.getParent();
+ }
+ else {
+ parentWindow = SwingUtilities.getWindowAncestor(appendButton);
+ }
+ final Component mostRecentFocusOwner = parentWindow.getMostRecentFocusOwner();
+ if (mostRecentFocusOwner instanceof JTextComponent
+ && !(mostRecentFocusOwner.getClass().getName().contains("JSpinField"))) {
+ final JTextComponent textComponent = (JTextComponent) mostRecentFocusOwner;
+ textComponent.replaceSelection(dateAsString);
+ return;
+ }
+ if(mostRecentFocusOwner instanceof JTable){
+ JTable table = (JTable) mostRecentFocusOwner;
+ final int[] selectedRows = table.getSelectedRows();
+ final int[] selectedColumns = table.getSelectedColumns();
+ for(int r : selectedRows)
+ for(int c : selectedColumns)
+ table.setValueAt(date, r, c);
+ }
+ else{
+ ModeController mController = Controller.getCurrentModeController();
+ for (final NodeModel node : mController.getMapController().getSelectedNodes()) {
+ final MTextController textController = (MTextController) TextController.getController();
+ textController.setNodeObject(node, date);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/TimerBlinkTask.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/TimerBlinkTask.java
new file mode 100644
index 0000000..3b1da4e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/TimerBlinkTask.java
@@ -0,0 +1,85 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode;
+
+import java.util.TimerTask;
+
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.resources.ResourceController;
+
+
+/**
+ * @author Dimitry Polivaev
+ * Feb 20, 2009
+ */
+class TimerBlinkTask extends TimerTask {
+ private final ReminderHook reminderController;
+ /**
+ *
+ */
+ private final ReminderExtension reminderExtension;
+ private boolean stateAdded = false;
+ private boolean runScript;
+ private boolean alreadyExecuted;
+
+ /**
+ * @param b
+ */
+ public TimerBlinkTask(final ReminderHook reminderController, final ReminderExtension reminderExtension,
+ final boolean stateAdded, boolean runScript) {
+ super();
+ this.reminderController = reminderController;
+ this.reminderExtension = reminderExtension;
+ this.stateAdded = stateAdded;
+ this.runScript = runScript;
+ alreadyExecuted = false;
+ }
+
+ @Override
+ public void run() {
+ SwingUtilities.invokeLater(new Runnable() {
+
+ public void run() {
+ if(runScript){
+ runScript = false;
+ reminderController.runScript(reminderExtension);
+ }
+ if(! alreadyExecuted){
+ if(ResourceController.getResourceController().getBooleanProperty("remindersShowNotifications"))
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ reminderController.showNotificationPopup(reminderExtension);
+ }
+ });
+
+ alreadyExecuted = true;
+ }
+ stateAdded = !stateAdded;
+ reminderController.blink(reminderExtension, stateAdded);
+ }
+ });
+ }
+
+ public boolean alreadyExecuted(){
+ return alreadyExecuted;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/AllMapsNodeListAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/AllMapsNodeListAction.java
new file mode 100644
index 0000000..3eb59bb
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/AllMapsNodeListAction.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.09.2009
+ */
+public class AllMapsNodeListAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final NodeList nodeList;
+
+ public AllMapsNodeListAction() {
+ super("AllMapsNodeListAction");
+ nodeList = new NodeList(true, true, "allmapsnodelistwindow.configuration");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ nodeList.startup();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/CoreTextAccessor.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/CoreTextAccessor.java
new file mode 100644
index 0000000..a876543
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/CoreTextAccessor.java
@@ -0,0 +1,47 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+
+/**
+ * @author Dimitry Polivaev 03.10.2013
+ */
+class CoreTextAccessor implements TextAccessor {
+ final private NodeModel node;
+
+ public CoreTextAccessor(NodeModel node) {
+ this.node = node;
+ }
+
+ public String getText() {
+ return node.getText();
+ }
+
+ public void setText(String newText) {
+ ((MTextController) TextController.getController()).setNodeText(node, newText);
+ }
+
+ public NodeModel getNode() {
+ return node;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DateRenderer.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DateRenderer.java
new file mode 100644
index 0000000..8273053
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DateRenderer.java
@@ -0,0 +1,48 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import java.text.DateFormat;
+
+import javax.swing.table.DefaultTableCellRenderer;
+
+/**
+ * @author Dimitry Polivaev
+ * 03.10.2013
+ */
+class DateRenderer extends DefaultTableCellRenderer {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ DateFormat formatter;
+
+ public DateRenderer() {
+ super();
+ }
+
+ @Override
+ public void setValue(final Object value) {
+ if (formatter == null) {
+ formatter = DateFormat.getDateTimeInstance();
+ }
+ setText((value == null) ? "" : formatter.format(value));
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DetailTextAccessor.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DetailTextAccessor.java
new file mode 100644
index 0000000..f75e7d1
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DetailTextAccessor.java
@@ -0,0 +1,49 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.DetailTextModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+
+/**
+ * @author Dimitry Polivaev 03.10.2013
+ */
+class DetailTextAccessor implements TextAccessor {
+ final private NodeModel node;
+
+ public DetailTextAccessor(NodeModel node) {
+ this.node = node;
+ }
+
+ public String getText() {
+ String details = DetailTextModel.getDetailTextText(node);
+ return details != null ? details : "";
+ }
+
+ public void setText(String newText) {
+ ((MTextController) TextController.getController()).setDetails(node, newText);
+ }
+
+ public NodeModel getNode() {
+ return node;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/FlatNodeTableFilterModel.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/FlatNodeTableFilterModel.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/FlatNodeTableFilterModel.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/FlatNodeTableFilterModel.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsHolder.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsHolder.java
new file mode 100644
index 0000000..4d8c125
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsHolder.java
@@ -0,0 +1,66 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.map.NodeModel;
+/**
+ * @author Dimitry Polivaev
+ * 03.10.2013
+ */
+class IconsHolder implements Comparable<IconsHolder> {
+ final private String iconNames;
+ List<MindIcon> icons = new ArrayList<MindIcon>();
+
+ public IconsHolder(final NodeModel node) {
+ icons.addAll(IconController.getController().getIcons(node));
+ if (icons.size() > 0) {
+ final List<MindIcon> toSort = new ArrayList<MindIcon>(icons);
+ Collections.sort(toSort);
+ final StringBuilder builder = new StringBuilder();
+ for (final MindIcon icon : toSort) {
+ builder.append(icon.getName()).append(" ");
+ }
+ iconNames = builder.toString();
+ }
+ else {
+ iconNames = "";
+ }
+ }
+
+ public int compareTo(final IconsHolder compareToObject) {
+ return toString().compareTo(compareToObject.toString());
+ }
+
+ public List<MindIcon> getIcons() {
+ return icons;
+ }
+
+ /** Returns a sorted list of icon names. */
+ @Override
+ public String toString() {
+ return iconNames;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsRenderer.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsRenderer.java
new file mode 100644
index 0000000..4ddcb5e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsRenderer.java
@@ -0,0 +1,57 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import javax.swing.table.DefaultTableCellRenderer;
+
+import org.freeplane.core.ui.components.MultipleImage;
+import org.freeplane.features.icon.MindIcon;
+
+/**
+ * @author Dimitry Polivaev
+ * 03.10.2013
+ */
+class IconsRenderer extends DefaultTableCellRenderer {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public IconsRenderer() {
+ super();
+ }
+
+ @Override
+ public void setValue(final Object value) {
+ if (value instanceof IconsHolder) {
+ final IconsHolder iconsHolder = (IconsHolder) value;
+ final MultipleImage iconImages = new MultipleImage();
+ for (final MindIcon icon : iconsHolder.getIcons()) {
+ iconImages.addIcon(icon);
+ }
+ if (iconImages.getImageCount() > 0) {
+ setIcon(iconImages);
+ }
+ else {
+ setIcon(null);
+ }
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeList.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeList.java
new file mode 100644
index 0000000..92fb58b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeList.java
@@ -0,0 +1,877 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import java.awt.Container;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.EventListener;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import javax.swing.AbstractAction;
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.Timer;
+import javax.swing.WindowConstants;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.text.JTextComponent;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.WindowConfigurationStorage;
+import org.freeplane.core.ui.UIBuilder;
+import org.freeplane.core.ui.components.BlindIcon;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.DelayedRunner;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+import org.freeplane.view.swing.features.time.mindmapmode.ReminderExtension;
+
+/**
+ * @author foltin
+ */
+public class NodeList {
+ private final class MapChangeListener implements IMapChangeListener, INodeChangeListener, IMapSelectionListener {
+ public MapChangeListener() {
+ super();
+ this.runner = new DelayedRunner(new Runnable() {
+
+ @Override
+ public void run() {
+ tableModel.fireTableDataChanged();
+ }
+ });
+ }
+
+ final private DelayedRunner runner;
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ disposeDialog();
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ disposeDialog();
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ disposeDialog();
+ }
+
+ public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
+ disposeDialog();
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ disposeDialog();
+ }
+
+ public void mapChanged(MapChangeEvent event) {
+ disposeDialog();
+ }
+
+ public void nodeChanged(NodeChangeEvent event) {
+ runner.runLater();
+ }
+
+ public void afterMapChange(MapModel oldMap, MapModel newMap) {
+ }
+
+ public void beforeMapChange(MapModel oldMap, MapModel newMap) {
+ disposeDialog();
+ }
+ }
+
+ final private class FilterTextDocumentListener implements DocumentListener, ActionListener {
+ private Timer mTypeDelayTimer = null;
+ private String selectedItem = "";
+ private boolean shouldMatchCase = false;
+ private boolean shouldUseRegex = false;
+
+ private synchronized void delayedChange() {
+ stopTimer();
+ mTypeDelayTimer = new Timer(500, new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ change();
+ }
+ });
+ mTypeDelayTimer.start();
+ }
+ public void stopTimer() {
+ if (mTypeDelayTimer != null) {
+ mTypeDelayTimer.stop();
+ mTypeDelayTimer = null;
+ }
+ }
+ public void changedUpdate(final DocumentEvent event) {
+ delayedChange();
+ }
+
+ public void insertUpdate(final DocumentEvent event) {
+ delayedChange();
+ }
+
+ public void removeUpdate(final DocumentEvent event) {
+ delayedChange();
+ }
+
+ private synchronized void change() {
+ stopTimer();
+ final String selectedItem = (String)mFilterTextSearchField.getEditor().getItem();
+ final boolean shouldMatchCase = matchCase.isSelected();
+ final boolean shouldUseRegex = useRegexInFind.isSelected();
+ if(!this.selectedItem.equals(selectedItem) || this.shouldMatchCase != shouldMatchCase || this.shouldUseRegex != shouldUseRegex) {
+ this.selectedItem = selectedItem;
+ this.shouldMatchCase = shouldMatchCase;
+ this.shouldUseRegex = shouldUseRegex;
+ mFlatNodeTableFilterModel.setFilter( selectedItem, shouldMatchCase, shouldUseRegex);
+ }
+ }
+
+ public void actionPerformed(ActionEvent e) {
+ change();
+ }
+ }
+
+ final private class FlatNodeTable extends JTable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public TableCellRenderer getCellRenderer(final int row, final int column) {
+ final Object object = getModel().getValueAt(row, column);
+ if (object instanceof Date) {
+ return dateRenderer;
+ }
+ if (object instanceof TextHolder) {
+ return textRenderer;
+ }
+ if (object instanceof IconsHolder) {
+ return iconsRenderer;
+ }
+ return super.getCellRenderer(row, column);
+ }
+
+ @Override
+ public boolean isCellEditable(final int rowIndex, final int vColIndex) {
+ return false;
+ }
+
+ @Override
+ protected void processKeyEvent(final KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ENTER) {
+ final EventListener[] el = super.getListeners(KeyListener.class);
+ if (e.getID() != KeyEvent.KEY_RELEASED) {
+ return;
+ }
+ for (int i = 0; i < el.length; i++) {
+ final KeyListener kl = (KeyListener) el[i];
+ kl.keyReleased(e);
+ }
+ return;
+ }
+ super.processKeyEvent(e);
+ }
+ }
+
+ final private class FlatNodeTableKeyListener implements KeyListener {
+ public void keyPressed(final KeyEvent arg0) {
+ }
+
+ public void keyReleased(final KeyEvent arg0) {
+ if (arg0.getKeyCode() == KeyEvent.VK_ESCAPE) {
+ disposeDialog();
+ }
+ if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
+ selectSelectedRows();
+ disposeDialog();
+ }
+ }
+
+ public void keyTyped(final KeyEvent arg0) {
+ }
+ }
+
+ final private class FlatNodeTableMouseAdapter extends MouseAdapter {
+ @Override
+ public void mouseClicked(final MouseEvent e) {
+ if (e.getClickCount() == 2) {
+ final Point p = e.getPoint();
+ final int row = tableView.rowAtPoint(p);
+ selectNodes(row, new int[] { row });
+ if (!(e.isControlDown() || e.isMetaDown()))
+ disposeDialog();
+ }
+ }
+ }
+
+ private class HolderAccessor{
+ private HolderAccessor() {
+ super();
+ }
+
+ public void changeString(final TextHolder textHolder, final String newText) {
+ textHolder.setText(newText);
+ }
+
+ public int getLength() {
+ return mFlatNodeTableFilterModel.getRowCount();
+ }
+
+ public TextHolder[] getNodeHoldersAt(final int row) {
+ return new TextHolder[]{
+ (TextHolder) sorter.getValueAt(row, NodeList.NODE_TEXT_COLUMN),
+ (TextHolder) sorter.getValueAt(row, NodeList.NODE_DETAILS_COLUMN),
+ (TextHolder) sorter.getValueAt(row, NodeList.NODE_NOTES_COLUMN)
+ };
+ }
+ }
+
+ private static String COLUMN_CREATED = "Created";
+ private static String COLUMN_DATE = "Date";
+ private static String COLUMN_ICONS = "Icons";
+ private static String COLUMN_MODIFIED = "Modified";
+ private static String COLUMN_NOTES = "Notes";
+ private static String COLUMN_TEXT = "Text";
+ private static String COLUMN_DETAILS = "Details";
+ private static final int DATE_COLUMN = 0;
+ protected static final int NODE_CREATED_COLUMN = 3;
+ protected static final int NODE_ICON_COLUMN = 2;
+ protected static final int NODE_MODIFIED_COLUMN = 4;
+ protected static final int NODE_DETAILS_COLUMN = 5;
+ protected static final int NODE_NOTES_COLUMN = 6;
+ public static final int NODE_TEXT_COLUMN = 1;
+ private static final String PLUGINS_TIME_LIST_XML_CREATED = "plugins/TimeList.xml_Created";
+ private static final String PLUGINS_TIME_LIST_XML_DATE = "plugins/TimeList.xml_Date";
+ private static final String PLUGINS_TIME_LIST_XML_ICONS = "plugins/TimeList.xml_Icons";
+ private static final String PLUGINS_TIME_LIST_XML_MODIFIED = "plugins/TimeList.xml_Modified";
+ private static final String PLUGINS_TIME_LIST_XML_NOTES = "plugins/TimeList.xml_Notes";
+ private static final String PLUGINS_TIME_LIST_XML_DETAILS = "plugins/TimeList.xml_Details";
+
+ private static final String PLUGINS_TIME_LIST_XML_TEXT = "plugins/TimeList.xml_Text";
+ private static final String PLUGINS_TIME_MANAGEMENT_XML_CLOSE = "plugins/TimeManagement.xml_closeButton";
+ private static final String PLUGINS_TIME_MANAGEMENT_XML_FIND = "plugins/TimeManagement.xml_Find";
+ private static final String PLUGINS_TIME_MANAGEMENT_XML_REPLACE = "plugins/TimeManagement.xml_Replace";
+// private static final String PLUGINS_TIME_MANAGEMENT_XML_SELECT = "plugins/TimeManagement.xml_Select";
+ private static final String PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE = "plugins/TimeManagement.xml_WindowTitle";
+ private static final String PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE_ALL_NODES = "plugins/TimeManagement.xml_WindowTitle_All_Nodes";
+ private final String windowPreferenceStorageProperty;
+// = NodeList.class.getName() + "_properties"
+ private static String replace(final Pattern p, String input, final String replacement) {
+ final String result = HtmlUtils.getReplaceResult(p, input, replacement);
+ return result;
+ }
+
+// // final private Controller controller;
+ private DateRenderer dateRenderer;
+ private JDialog dialog;
+ private IconsRenderer iconsRenderer;
+ final private JComboBox mFilterTextReplaceField;
+ final private JComboBox mFilterTextSearchField;
+ private FlatNodeTableFilterModel mFlatNodeTableFilterModel;
+// final private ModeController modeController;
+ private JLabel mTreeLabel;
+ private TextRenderer textRenderer;
+ private boolean showAllNodes = false;
+ private TableSorter sorter;
+ private JTable tableView;
+ private DefaultTableModel tableModel;
+ private final boolean searchInAllMaps;
+ private final JCheckBox useRegexInReplace;
+ private final JCheckBox useRegexInFind;
+ private final JCheckBox matchCase;
+ final private boolean modal;
+ private final MapChangeListener mapChangeListener;
+
+ public NodeList( final boolean showAllNodes, final boolean searchInAllMaps, String windowPreferenceStorageProperty) {
+ this(false, showAllNodes, searchInAllMaps, windowPreferenceStorageProperty);
+ }
+
+ public NodeList( final boolean modal, final boolean showAllNodes, final boolean searchInAllMaps, String windowPreferenceStorageProperty) {
+// this.modeController = modeController;
+// controller = modeController.getController();
+ this.modal = modal;
+ this.showAllNodes = showAllNodes;
+ this.searchInAllMaps = searchInAllMaps;
+ mFilterTextSearchField = new JComboBoxWithBorder();
+ mFilterTextSearchField.setEditable(true);
+ final FilterTextDocumentListener listener = new FilterTextDocumentListener();
+ mFilterTextSearchField.addActionListener(listener);
+ final JTextComponent editorComponent = (JTextComponent) mFilterTextSearchField.getEditor().getEditorComponent();
+ editorComponent.getDocument().addDocumentListener(listener);
+ mFilterTextSearchField.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(final KeyEvent pEvent) {
+ if (pEvent.getKeyCode() == KeyEvent.VK_DOWN) {
+ mFilterTextReplaceField.requestFocusInWindow();
+ }
+ }
+ });
+ mFilterTextReplaceField = new JComboBoxWithBorder();
+ mFilterTextReplaceField.setEditable(true);
+ mFilterTextReplaceField.addKeyListener(new KeyAdapter() {
+ @Override
+ public void keyPressed(final KeyEvent pEvent) {
+ if (pEvent.getKeyCode() == KeyEvent.VK_DOWN) {
+ tableView.requestFocusInWindow();
+ }
+ else if (pEvent.getKeyCode() == KeyEvent.VK_UP) {
+ mFilterTextSearchField.requestFocusInWindow();
+ }
+ }
+ });
+ useRegexInReplace = new JCheckBox();
+ useRegexInFind = new JCheckBox();
+ useRegexInFind.addActionListener(listener);
+ matchCase = new JCheckBox();
+ matchCase.addActionListener(listener);
+ mapChangeListener = new MapChangeListener();
+ this.windowPreferenceStorageProperty = windowPreferenceStorageProperty;
+ }
+
+ /**
+ *
+ */
+ private void disposeDialog() {
+ if(dialog == null || !dialog.isVisible()){
+ return;
+ }
+ final TimeWindowConfigurationStorage storage = new TimeWindowConfigurationStorage();
+ for (int i = 0; i < tableView.getColumnCount(); i++) {
+ final TimeWindowColumnSetting setting = new TimeWindowColumnSetting();
+ setting.setColumnWidth(tableView.getColumnModel().getColumn(i).getWidth());
+ setting.setColumnSorting(sorter.getSortingStatus(i));
+ storage.addTimeWindowColumnSetting(setting);
+ }
+ storage.storeDialogPositions(dialog, windowPreferenceStorageProperty);
+ dialog.setVisible(false);
+ dialog.dispose();
+ dialog = null;
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ mapController.removeMapChangeListener(mapChangeListener);
+ mapController.removeNodeChangeListener(mapChangeListener);
+ Controller.getCurrentController().getMapViewManager().removeMapSelectionListener(mapChangeListener);
+ }
+
+ protected void exportSelectedRowsAndClose() {
+ final int[] selectedRows = tableView.getSelectedRows();
+ final List<NodeModel> selectedNodes = new ArrayList<NodeModel>();
+ for (int i = 0; i < selectedRows.length; i++) {
+ final int row = selectedRows[i];
+ selectedNodes.add(getMindMapNode(row));
+ }
+ final ModeController mindMapController = Controller.getCurrentModeController();
+ MFileManager.getController(mindMapController).newMapFromDefaultTemplate();
+ final MapModel newMap = Controller.getCurrentController().getMap();
+ for (final NodeModel node : selectedNodes) {
+ final NodeModel copy = ClipboardController.getController().duplicate(node, false);
+ if (copy != null) {
+ mindMapController.getMapController().insertNodeIntoWithoutUndo(copy, newMap.getRootNode());
+ }
+ }
+ disposeDialog();
+ }
+
+ /**
+ */
+ private NodeModel getMindMapNode(final int focussedRow) {
+ final NodeModel selectedNode = ((TextHolder) tableView.getModel().getValueAt(focussedRow,
+ NodeList.NODE_TEXT_COLUMN)).getNode();
+ return selectedNode;
+ }
+
+ private void replace(final HolderAccessor holderAccessor, boolean selectedOnly) {
+ final String searchString = (String) mFilterTextSearchField.getSelectedItem();
+ if(searchString == null)
+ return;
+ final String replaceString = (String) mFilterTextReplaceField.getSelectedItem();
+ Pattern p;
+ try {
+ p = Pattern.compile(useRegexInFind.isSelected() ? searchString : Pattern.quote(searchString),
+ matchCase.isSelected() ? 0 : Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);
+ }
+ catch (final PatternSyntaxException e) {
+ UITools.errorMessage(TextUtils.format("wrong_regexp", searchString, e.getMessage()));
+ return;
+ }
+ final String replacement = replaceString == null ? "" : replaceString;
+ final int length = holderAccessor.getLength();
+ for (int i = 0; i < length; i++) {
+ if( !selectedOnly || tableView.isRowSelected(i)){
+ TextHolder[] textHolders = holderAccessor.getNodeHoldersAt(i);
+ for(final TextHolder textHolder:textHolders){
+ final String text = textHolder.getText();
+ final String replaceResult;
+ final String literalReplacement = useRegexInReplace.isSelected() ? replacement : Matcher.quoteReplacement(replacement);
+ try {
+ if (HtmlUtils.isHtmlNode(text)) {
+ replaceResult = NodeList.replace(p, text,literalReplacement);
+ }
+ else {
+ replaceResult = p.matcher(text).replaceAll(literalReplacement);
+ }
+ }
+ catch (Exception e) {
+ final String message = e.getMessage();
+ UITools.errorMessage(TextUtils.format("wrong_regexp", replacement, message != null ? message : e.getClass().getSimpleName()));
+ return;
+ }
+ if (!StringUtils.equals(text, replaceResult)) {
+ holderAccessor.changeString(textHolder, replaceResult);
+ }
+ }
+ }
+ }
+ mFlatNodeTableFilterModel.resetFilter();
+ mFilterTextSearchField.insertItemAt(mFilterTextSearchField.getSelectedItem(), 0);
+ mFilterTextReplaceField.insertItemAt(mFilterTextReplaceField.getSelectedItem(), 0);
+ mFilterTextSearchField.setSelectedItem("");
+ }
+
+ private void selectNodes(final int focussedRow, final int[] selectedRows) {
+ if (focussedRow >= 0) {
+ final NodeModel focussedNode = getMindMapNode(focussedRow);
+ final MapModel map = focussedNode.getMap();
+ final List<NodeModel> selectedNodes = new ArrayList<NodeModel>();
+ for (final int row : selectedRows) {
+ final NodeModel node = getMindMapNode(row);
+ if (!node.getMap().equals(map)) {
+ continue;
+ }
+ selectedNodes.add(node);
+ }
+ selectMap(map);
+ Controller.getCurrentModeController().getMapController().selectMultipleNodes(focussedNode, selectedNodes);
+ }
+ }
+
+ private void selectMap(final MapModel map) {
+ if (map.equals(Controller.getCurrentController().getMap())) {
+ return;
+ }
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ final Map<String, MapModel> maps = mapViewManager.getMaps(MModeController.MODENAME);
+ for (final Map.Entry<String, MapModel> entry : maps.entrySet()) {
+ if (map.equals(entry.getValue())) {
+ mapViewManager.tryToChangeToMapView(entry.getKey());
+ }
+ }
+ }
+
+ private void selectSelectedRows() {
+ selectNodes(tableView.getSelectedRow(), tableView.getSelectedRows());
+ }
+
+ public void startup() {
+ if(dialog != null){
+ dialog.toFront();
+ return;
+ }
+ NodeList.COLUMN_MODIFIED = TextUtils.getText(PLUGINS_TIME_LIST_XML_MODIFIED);
+ NodeList.COLUMN_CREATED = TextUtils.getText(PLUGINS_TIME_LIST_XML_CREATED);
+ NodeList.COLUMN_ICONS = TextUtils.getText(PLUGINS_TIME_LIST_XML_ICONS);
+ NodeList.COLUMN_TEXT = TextUtils.getText(PLUGINS_TIME_LIST_XML_TEXT);
+ NodeList.COLUMN_DETAILS= TextUtils.getText(PLUGINS_TIME_LIST_XML_DETAILS);
+ NodeList.COLUMN_DATE = TextUtils.getText(PLUGINS_TIME_LIST_XML_DATE);
+ NodeList.COLUMN_NOTES = TextUtils.getText(PLUGINS_TIME_LIST_XML_NOTES);
+ dialog = new JDialog(UITools.getCurrentFrame(), modal /* modal */);
+ String windowTitle;
+ if (showAllNodes) {
+ windowTitle = PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE_ALL_NODES;
+ }
+ else {
+ windowTitle = PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE;
+ }
+ dialog.setTitle(TextUtils.getText(windowTitle));
+ dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ final WindowAdapter windowListener = new WindowAdapter() {
+
+ @Override
+ public void windowGainedFocus(WindowEvent e) {
+ mFilterTextSearchField.getEditor().selectAll();
+ }
+
+ @Override
+ public void windowClosing(final WindowEvent event) {
+ disposeDialog();
+ }
+ };
+ dialog.addWindowListener(windowListener);
+ dialog.addWindowFocusListener(windowListener);
+ UITools.addEscapeActionToDialog(dialog, new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent arg0) {
+ disposeDialog();
+ }
+ });
+ final Container contentPane = dialog.getContentPane();
+ final GridBagLayout gbl = new GridBagLayout();
+ contentPane.setLayout(gbl);
+ final GridBagConstraints layoutConstraints = new GridBagConstraints();
+ layoutConstraints.gridx = 0;
+ layoutConstraints.gridy = 0;
+ layoutConstraints.gridwidth = 1;
+ layoutConstraints.gridheight = 1;
+ layoutConstraints.weightx = 0.0;
+ layoutConstraints.weighty = 0.0;
+ layoutConstraints.anchor = GridBagConstraints.WEST;
+ layoutConstraints.fill = GridBagConstraints.HORIZONTAL;
+ contentPane.add(new JLabel(TextUtils.getText(PLUGINS_TIME_MANAGEMENT_XML_FIND)), layoutConstraints);
+ layoutConstraints.gridwidth = 1;
+ layoutConstraints.gridx++;
+ contentPane.add(Box.createHorizontalStrut(40), layoutConstraints);
+ layoutConstraints.gridx++;
+ contentPane.add(new JLabel(TextUtils.getText("filter_match_case")), layoutConstraints);
+ layoutConstraints.gridx++;
+ contentPane.add(matchCase, layoutConstraints);
+ layoutConstraints.gridx++;
+ contentPane.add(Box.createHorizontalStrut(40), layoutConstraints);
+ layoutConstraints.gridx++;
+ contentPane.add(new JLabel(TextUtils.getText("regular_expressions")), layoutConstraints);
+ layoutConstraints.gridx++;
+ contentPane.add(useRegexInFind, layoutConstraints);
+ layoutConstraints.gridx = 0;
+ layoutConstraints.weightx = 1.0;
+ layoutConstraints.gridwidth = GridBagConstraints.REMAINDER;
+ layoutConstraints.gridy++;
+ contentPane.add(/* new JScrollPane */(mFilterTextSearchField), layoutConstraints);
+ layoutConstraints.gridy++;
+ layoutConstraints.weightx = 0.0;
+ layoutConstraints.gridwidth = 1;
+ contentPane.add(new JLabel(TextUtils.getText(PLUGINS_TIME_MANAGEMENT_XML_REPLACE)), layoutConstraints);
+ layoutConstraints.gridx = 5;
+ contentPane.add(new JLabel(TextUtils.getText("regular_expressions")), layoutConstraints);
+ layoutConstraints.gridx++;
+ contentPane.add(useRegexInReplace, layoutConstraints);
+ layoutConstraints.gridx = 0;
+ layoutConstraints.weightx = 1.0;
+ layoutConstraints.gridwidth = GridBagConstraints.REMAINDER;
+ layoutConstraints.gridy++;
+ contentPane.add(/* new JScrollPane */(mFilterTextReplaceField), layoutConstraints);
+ dateRenderer = new DateRenderer();
+ textRenderer = new TextRenderer();
+ iconsRenderer = new IconsRenderer();
+ tableView = new FlatNodeTable();
+ tableView.addKeyListener(new FlatNodeTableKeyListener());
+ tableView.addMouseListener(new FlatNodeTableMouseAdapter());
+ tableView.getTableHeader().setReorderingAllowed(false);
+ tableModel = updateModel();
+ mFlatNodeTableFilterModel = new FlatNodeTableFilterModel(tableModel,
+ new int[]{NodeList.NODE_TEXT_COLUMN, NodeList.NODE_DETAILS_COLUMN, NodeList.NODE_NOTES_COLUMN}
+ );
+ sorter = new TableSorter(mFlatNodeTableFilterModel);
+ tableView.setModel(sorter);
+ sorter.setTableHeader(tableView.getTableHeader());
+ sorter.setColumnComparator(Date.class, TableSorter.COMPARABLE_COMPARATOR);
+ sorter.setColumnComparator(NodeModel.class, TableSorter.LEXICAL_COMPARATOR);
+ sorter.setColumnComparator(IconsHolder.class, TableSorter.COMPARABLE_COMPARATOR);
+ sorter.setSortingStatus(NodeList.DATE_COLUMN, TableSorter.ASCENDING);
+ final JScrollPane pane = new JScrollPane(tableView);
+ UITools.setScrollbarIncrement(pane);
+ layoutConstraints.gridy++;
+ GridBagConstraints tableConstraints = (GridBagConstraints) layoutConstraints.clone();
+ tableConstraints.weightx = 1;
+ tableConstraints.weighty = 10;
+ tableConstraints.fill = GridBagConstraints.BOTH;
+ contentPane.add(pane, tableConstraints);
+ mTreeLabel = new JLabel();
+ layoutConstraints.gridy++;
+ GridBagConstraints treeConstraints = (GridBagConstraints) layoutConstraints.clone();
+ treeConstraints.fill = GridBagConstraints.BOTH;
+ @SuppressWarnings("serial")
+ JScrollPane scrollPane = new JScrollPane(mTreeLabel){
+ @Override
+ public boolean isValidateRoot() {
+ return false;
+ }
+ };
+ contentPane.add(scrollPane, treeConstraints);
+ final AbstractAction exportAction = new AbstractAction(TextUtils.getText("plugins/TimeManagement.xml_Export")) {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent arg0) {
+ exportSelectedRowsAndClose();
+ }
+ };
+ final JButton exportButton = new JButton(exportAction);
+ final AbstractAction replaceAllAction = new AbstractAction(TextUtils
+ .getText("plugins/TimeManagement.xml_Replace_All")) {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent arg0) {
+ replace(new HolderAccessor(), false);
+ }
+ };
+ final JButton replaceAllButton = new JButton(replaceAllAction);
+ final AbstractAction replaceSelectedAction = new AbstractAction(TextUtils
+ .getText("plugins/TimeManagement.xml_Replace_Selected")) {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent arg0) {
+ replace(new HolderAccessor(), true);
+ }
+ };
+ final JButton replaceSelectedButton = new JButton(replaceSelectedAction);
+ final AbstractAction gotoAction = new AbstractAction(TextUtils.getText("plugins/TimeManagement.xml_Goto")) {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent arg0) {
+ selectSelectedRows();
+ }
+ };
+ final JButton gotoButton = new JButton(gotoAction);
+ final AbstractAction disposeAction = new AbstractAction(TextUtils.getText(PLUGINS_TIME_MANAGEMENT_XML_CLOSE)) {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent arg0) {
+ disposeDialog();
+ }
+ };
+ final JButton cancelButton = new JButton(disposeAction);
+ /* Initial State */
+ gotoAction.setEnabled(false);
+ exportAction.setEnabled(false);
+ replaceSelectedAction.setEnabled(false);
+ final Box bar = Box.createHorizontalBox();
+ bar.add(Box.createHorizontalGlue());
+ bar.add(cancelButton);
+ bar.add(exportButton);
+ bar.add(replaceAllButton);
+ bar.add(replaceSelectedButton);
+ bar.add(gotoButton);
+ bar.add(Box.createHorizontalGlue());
+ layoutConstraints.gridy++;
+ contentPane.add(/* new JScrollPane */(bar), layoutConstraints);
+ final JMenuBar menuBar = new JMenuBar();
+ final JMenu menu = new JMenu(TextUtils.getText("plugins/TimeManagement.xml_menu_actions"));
+ final AbstractAction[] actionList = new AbstractAction[] { gotoAction, replaceSelectedAction,
+ replaceAllAction, exportAction, disposeAction };
+ for (int i = 0; i < actionList.length; i++) {
+ final AbstractAction action = actionList[i];
+ final JMenuItem item = menu.add(action);
+ item.setIcon(new BlindIcon(UIBuilder.ICON_SIZE));
+ }
+ menuBar.add(menu);
+ dialog.setJMenuBar(menuBar);
+ final ListSelectionModel rowSM = tableView.getSelectionModel();
+ rowSM.addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(final ListSelectionEvent e) {
+ if (e.getValueIsAdjusting()) {
+ return;
+ }
+ final ListSelectionModel lsm = (ListSelectionModel) e.getSource();
+ final boolean enable = !(lsm.isSelectionEmpty());
+ replaceSelectedAction.setEnabled(enable);
+ gotoAction.setEnabled(enable);
+ exportAction.setEnabled(enable);
+ }
+ });
+ rowSM.addListSelectionListener(new ListSelectionListener() {
+ String getNodeText(final NodeModel node) {
+ final String nodeText = TextController.getController().getShortPlainText(node);
+ if (node.isRoot())
+ return nodeText;
+ else
+ return getNodeText(node.getParentNode()) + " -> " + nodeText;
+ }
+
+ public void valueChanged(final ListSelectionEvent e) {
+ if (e.getValueIsAdjusting()) {
+ return;
+ }
+ final ListSelectionModel lsm = (ListSelectionModel) e.getSource();
+ if (lsm.isSelectionEmpty()) {
+ mTreeLabel.setText("");
+ return;
+ }
+ final int selectedRow = lsm.getLeadSelectionIndex();
+ final NodeModel mindMapNode = getMindMapNode(selectedRow);
+ mTreeLabel.setText(getNodeText(mindMapNode));
+ }
+ });
+ final String marshalled = ResourceController.getResourceController().getProperty(
+ windowPreferenceStorageProperty);
+ final WindowConfigurationStorage result = TimeWindowConfigurationStorage.decorateDialog(marshalled, dialog);
+ final WindowConfigurationStorage storage = result;
+ if (storage != null) {
+ tableView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+ int column = 0;
+ for (final TimeWindowColumnSetting setting : ((TimeWindowConfigurationStorage) storage)
+ .getListTimeWindowColumnSettingList()) {
+ tableView.getColumnModel().getColumn(column).setPreferredWidth(setting.getColumnWidth());
+ sorter.setSortingStatus(column, setting.getColumnSorting());
+ column++;
+ }
+ }
+ mFlatNodeTableFilterModel.setFilter((String)mFilterTextSearchField.getSelectedItem(),
+ matchCase.isSelected(), useRegexInFind.isSelected());
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MapController mapController = modeController.getMapController();
+ mapController.addMapChangeListener(mapChangeListener);
+ mapController.addNodeChangeListener(mapChangeListener);
+ Controller.getCurrentController().getMapViewManager().addMapSelectionListener(mapChangeListener);
+ dialog.setVisible(true);
+ }
+
+ /**
+ * Creates a table model for the new table and returns it.
+ */
+ private DefaultTableModel updateModel() {
+ final DefaultTableModel model = new DefaultTableModel() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
+ */
+ @Override
+ public Class<?> getColumnClass(final int arg0) {
+ switch (arg0) {
+ case DATE_COLUMN:
+ case NODE_CREATED_COLUMN:
+ case NODE_MODIFIED_COLUMN:
+ return Date.class;
+ case NODE_TEXT_COLUMN:
+ case NODE_NOTES_COLUMN:
+ case NODE_DETAILS_COLUMN:
+ return TextHolder.class;
+ case NODE_ICON_COLUMN:
+ return IconsHolder.class;
+ default:
+ return Object.class;
+ }
+ }
+ };
+ model.addColumn(NodeList.COLUMN_DATE);
+ model.addColumn(NodeList.COLUMN_TEXT);
+ model.addColumn(NodeList.COLUMN_ICONS);
+ model.addColumn(NodeList.COLUMN_CREATED);
+ model.addColumn(NodeList.COLUMN_MODIFIED);
+ model.addColumn(NodeList.COLUMN_DETAILS);
+ model.addColumn(NodeList.COLUMN_NOTES);
+ if (searchInAllMaps == false) {
+ final NodeModel node = Controller.getCurrentController().getMap().getRootNode();
+ updateModel(model, node);
+ }
+ else {
+ final Map<String, MapModel> maps = Controller.getCurrentController().getMapViewManager().getMaps(MModeController.MODENAME);
+ for (final MapModel map : maps.values()) {
+ final NodeModel node = map.getRootNode();
+ updateModel(model, node);
+ }
+ }
+ return model;
+ }
+
+ private void updateModel(final DefaultTableModel model, final NodeModel node) {
+ final ReminderExtension hook = ReminderExtension.getExtension(node);
+ Date date = null;
+ if (hook != null) {
+ date = new Date(hook.getRemindUserAt());
+ }
+ if (showAllNodes && node.hasVisibleContent() || hook != null) {
+ model.addRow(new Object[] {
+ date,
+ new TextHolder(new CoreTextAccessor(node)),
+ new IconsHolder(node),
+ node.getHistoryInformation().getCreatedAt(),
+ node.getHistoryInformation().getLastModifiedAt(),
+ new TextHolder(new DetailTextAccessor(node)) ,
+ new TextHolder(new NoteTextAccessor(node)) });
+ }
+ for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
+ updateModel(model, child);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeListAction.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeListAction.java
new file mode 100644
index 0000000..7bddde9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeListAction.java
@@ -0,0 +1,45 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+
+/**
+ * @author Dimitry Polivaev
+ * 01.09.2009
+ */
+public class NodeListAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final NodeList nodeList;
+
+ public NodeListAction() {
+ super("NodeListAction");
+ nodeList = new NodeList(true, false, "nodelistwindow.configuration");
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ nodeList.startup();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NoteTextAccessor.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NoteTextAccessor.java
new file mode 100644
index 0000000..90cf34d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NoteTextAccessor.java
@@ -0,0 +1,50 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.note.mindmapmode.MNoteController;
+
+/**
+ * @author Dimitry Polivaev 03.10.2013
+ */
+class NoteTextAccessor implements TextAccessor {
+ final private NodeModel node;
+
+ public NoteTextAccessor(NodeModel node) {
+ this.node = node;
+ }
+
+ public String getText() {
+ final String notesText = NoteModel.getNoteText(node);
+ return notesText != null ? notesText : "";
+ }
+
+ public void setText(String newText) {
+ ((MNoteController) Controller.getCurrentModeController().getExtension(NoteController.class)).setNoteText(node, newText);
+ }
+
+ public NodeModel getNode() {
+ return node;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TableSorter.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TableSorter.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TableSorter.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TableSorter.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextAccessor.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextAccessor.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextAccessor.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextAccessor.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextHolder.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextHolder.java
new file mode 100644
index 0000000..b6d5ecf
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextHolder.java
@@ -0,0 +1,73 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 03.10.2013
+ */
+/** removes html in notes before comparison. */
+public class TextHolder implements Comparable<TextHolder> {
+ final private TextAccessor textAccessor;
+ private String originalNotesText = null;
+ private String untaggedNotesText = null;
+
+
+ public TextHolder(final TextAccessor textAccessor) {
+ this.textAccessor = textAccessor;
+ }
+
+ public int compareTo(final TextHolder compareToObject) {
+ return toString().compareTo(compareToObject.toString());
+ }
+
+ public String getUntaggedNotesText() {
+ final String notesText = textAccessor.getText();
+ if (notesText == null) {
+ return "";
+ }
+ if (untaggedNotesText == null || (originalNotesText != null && !originalNotesText.equals(notesText))) {
+ originalNotesText = notesText;
+ untaggedNotesText = HtmlUtils.htmlToPlain(notesText).replaceAll("\\s+", " ");
+ }
+ return untaggedNotesText;
+ }
+
+ @Override
+ public String toString() {
+ return getUntaggedNotesText();
+ }
+
+ public void setText(String newText) {
+ textAccessor.setText(newText);
+
+ }
+
+ public NodeModel getNode() {
+ return textAccessor.getNode();
+ }
+
+ public String getText() {
+ return textAccessor.getText();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextRenderer.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextRenderer.java
new file mode 100644
index 0000000..eb66bdc
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextRenderer.java
@@ -0,0 +1,42 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
+
+import javax.swing.table.DefaultTableCellRenderer;
+
+/**
+ * @author Dimitry Polivaev
+ * 03.10.2013
+ */
+class TextRenderer extends DefaultTableCellRenderer {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public TextRenderer() {
+ super();
+ }
+
+ @Override
+ public void setValue(final Object value) {
+ setText((value == null) ? "" : ((TextHolder) value).getUntaggedNotesText());
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TimeWindowColumnSetting.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TimeWindowColumnSetting.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TimeWindowColumnSetting.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TimeWindowColumnSetting.java
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TimeWindowConfigurationStorage.java b/freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TimeWindowConfigurationStorage.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TimeWindowConfigurationStorage.java
rename to freeplane/src/main/java/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TimeWindowConfigurationStorage.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ArrowIcon.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ArrowIcon.java
new file mode 100644
index 0000000..4977702
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ArrowIcon.java
@@ -0,0 +1,89 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+
+import javax.swing.Icon;
+
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2011
+ */
+class ArrowIcon implements Icon{
+ /**
+ *
+ */
+ private final NodeView nodeView;
+ final private boolean down;
+ final private static int ARROW_HEIGTH = 5;
+ final private static int ARROW_HALF_WIDTH = 4;
+ final private static int ICON_HEIGTH = ARROW_HEIGTH + 2;
+ final private static int ICON_WIDTH = 1 + ARROW_HALF_WIDTH * 2 + 1;
+
+
+ public ArrowIcon(NodeView nodeView, boolean down) {
+ super();
+ this.nodeView = nodeView;
+ this.down = down;
+ }
+
+ public int getIconHeight() {
+ return ICON_HEIGTH;
+ }
+
+ public int getIconWidth() {
+ return ICON_WIDTH;
+ }
+
+ public void paintIcon(Component c, Graphics g, int x, int y) {
+ int[] xs = new int[3];
+ int[] ys = new int[3];
+
+ xs[0] = 1 + ARROW_HALF_WIDTH;
+ xs[1] = 1;
+ xs[2] = xs[0] + ARROW_HALF_WIDTH;
+ if(down){
+ ys[0] = 1 + ARROW_HEIGTH;
+ ys[1] = ys[2] = 1;
+ }
+ else{
+ ys[0] = 1;
+ ys[1] = ys[2] = 1 + ARROW_HEIGTH;
+ }
+ final Color oldColor = g.getColor();
+ final Color color = nodeView.getEdgeColor();
+ g.setColor(color);
+ Graphics2D g2= (Graphics2D) g;
+ final Object renderingHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
+ ModeController modeController = this.nodeView.getMap().getModeController();
+ modeController.getController().getMapViewManager().setEdgesRenderingHint(g2);
+ g.drawPolygon(xs, ys, 3);
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
+ g.setColor(oldColor);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/BubbleMainView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/BubbleMainView.java
new file mode 100644
index 0000000..eb0da74
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/BubbleMainView.java
@@ -0,0 +1,49 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+
+class BubbleMainView extends RectangleMainView {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void paintNodeShape(final Graphics2D g) {
+ g.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 10, 10);
+ }
+
+ @Override
+ protected void paintBackground(final Graphics2D graphics, final Color color) {
+ graphics.setColor(color);
+ graphics.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 10, 10);
+ }
+
+
+ public BubbleMainView(ShapeConfigurationModel shapeConfiguration) {
+ super(shapeConfiguration);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ClickableImageCreator.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ClickableImageCreator.java
new file mode 100644
index 0000000..d06a73d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ClickableImageCreator.java
@@ -0,0 +1,106 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.Vector;
+
+import javax.swing.JComponent;
+
+import org.apache.commons.lang.StringEscapeUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.text.TextController;
+
+/** */
+class ClickableImageCreator {
+ public static class AreaHolder {
+ String alt;
+ Rectangle coordinates = new Rectangle();
+ String href;
+ String shape = "rect";
+ String title;
+ }
+
+ Vector<AreaHolder> area = new Vector<AreaHolder>();
+ private Rectangle innerBounds;
+ final private MapView mapView;
+ final private String regExpLinkReplacement;
+ final private NodeModel root;
+
+ /**
+ * @param regExpLinkReplacement
+ * if for example the link abc must be replaced with FMabcFM,
+ * then this string has to be FM$1FM.
+ */
+ ClickableImageCreator(final NodeModel root, final ModeController modeController, final String regExpLinkReplacement) {
+ super();
+ this.root = root;
+ this.regExpLinkReplacement = regExpLinkReplacement;
+ mapView = ((MapView) modeController.getController().getMapViewManager().getMapViewComponent());
+ if (mapView != null) {
+ mapView.preparePrinting();
+ innerBounds = mapView.getInnerBounds();
+ }
+ else {
+ innerBounds = new Rectangle(0, 0, 100, 100);
+ }
+// this.modeController = modeController;
+ createArea();
+ if (mapView != null)
+ mapView.endPrinting();
+ }
+
+ private void createArea() {
+ createArea(root);
+ }
+
+ private void createArea(final NodeModel node) {
+ final NodeView nodeView = mapView.getNodeView(node);
+ if (nodeView != null) {
+ final AreaHolder holder = new AreaHolder();
+ holder.title = TextController.getController().getShortPlainText(node);
+ holder.alt = TextController.getController().getShortPlainText(node);
+ holder.href = node.createID();
+ final Point contentXY = mapView.getNodeContentLocation(nodeView);
+ final JComponent content = nodeView.getContent();
+ holder.coordinates.x = (int) (contentXY.x - innerBounds.getMinX());
+ holder.coordinates.y = (int) (contentXY.y - innerBounds.getMinY());
+ holder.coordinates.width = content.getWidth();
+ holder.coordinates.height = content.getHeight();
+ area.add(holder);
+ for (final NodeModel child: mapView.getModeController().getMapController().childrenUnfolded(node)) {
+ createArea(child);
+ }
+ }
+ }
+
+ public String generateHtml() {
+ final StringBuilder htmlArea = new StringBuilder();
+ for (final AreaHolder holder : area) {
+ htmlArea.append("<area shape=\"" + holder.shape + "\" href=\"#"
+ + holder.href.replaceFirst("^(.*)$", regExpLinkReplacement) + "\" alt=\""
+ + StringEscapeUtils.escapeHtml(holder.alt) + "\" title=\""
+ + StringEscapeUtils.escapeHtml(holder.title) + "\" coords=\"" + holder.coordinates.x + ","
+ + holder.coordinates.y + "," + (holder.coordinates.width + holder.coordinates.x) + ","
+ + +(holder.coordinates.height + holder.coordinates.y) + "\" />\n");
+ }
+ return htmlArea.toString();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/CloudHeightCalculator.java b/freeplane/src/main/java/org/freeplane/view/swing/map/CloudHeightCalculator.java
new file mode 100644
index 0000000..314f989
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/CloudHeightCalculator.java
@@ -0,0 +1,24 @@
+package org.freeplane.view.swing.map;
+
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.view.swing.map.cloud.CloudView;
+
+public class CloudHeightCalculator {
+ public static final CloudHeightCalculator INSTANCE = new CloudHeightCalculator();
+ /**
+ * Calculates the tree height increment because of the clouds.
+ */
+ public int getAdditionalCloudHeigth(final NodeView node) {
+ if (!node.isContentVisible()) {
+ return 0;
+ }
+ final CloudModel cloud = node.getCloudModel();
+ if (cloud != null) {
+ return CloudView.getAdditionalHeigth(cloud, node);
+ }
+ else {
+ return 0;
+ }
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ContentPane.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ContentPane.java
new file mode 100644
index 0000000..eb8d01d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ContentPane.java
@@ -0,0 +1,41 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.LayoutManager;
+
+import javax.swing.JComponent;
+
+
+class ContentPane extends JComponent {
+ static private LayoutManager layoutManager = new ContentPaneLayout();
+ private static final long serialVersionUID = 1L;
+
+ ContentPane() {
+ setLayout(ContentPane.layoutManager);
+ }
+
+ @Override
+ final public void paint(final Graphics g) {
+ final NodeView parent = (NodeView) getParent();
+ final PaintingMode paintingMode = parent.getMap().getPaintingMode();
+ if(paintingMode.equals(PaintingMode.CLOUDS))
+ return;
+ final boolean selected = parent.isSelected();
+ if(paintingMode.equals(PaintingMode.SELECTED_NODES) == selected)
+ super.paint(g);
+ }
+
+ @Override
+ public boolean contains(final int x, final int y) {
+ if (super.contains(x, y))
+ return true;
+ for(int i = 0; i < getComponentCount(); i++){
+ final Component comp = getComponent(i);
+ if(comp.isVisible() && comp.contains(x-comp.getX(), y-comp.getY()))
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ContentPaneLayout.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ContentPaneLayout.java
new file mode 100644
index 0000000..3e4bd68
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ContentPaneLayout.java
@@ -0,0 +1,68 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.LayoutManager;
+
+class ContentPaneLayout implements LayoutManager {
+ public void addLayoutComponent(final String name, final Component comp) {
+ }
+
+ public void layoutContainer(final Container parent) {
+ final int componentCount = parent.getComponentCount();
+ final int width = parent.getWidth();
+ int y = 0;
+ for (int i = 0; i < componentCount; i++) {
+ final Component component = parent.getComponent(i);
+ if (component.isVisible()) {
+ component.validate();
+ final Dimension preferredCompSize;
+ if( width == 0)
+ preferredCompSize = new Dimension();
+ else
+ preferredCompSize= component.getPreferredSize();
+
+ if (component instanceof ZoomableLabel) {
+ component.setBounds(0, y, width, preferredCompSize.height);
+ }
+ else {
+ if(width > preferredCompSize.width){
+ final int x = (int) (component.getAlignmentX() * (width - preferredCompSize.width));
+ component.setBounds(x, y, preferredCompSize.width, preferredCompSize.height);
+ }
+ else{
+ component.setBounds(0, y, width, preferredCompSize.height);
+ }
+ }
+ y += preferredCompSize.height;
+ }
+ else{
+ component.setBounds(0, y, 0, 0);
+ }
+ }
+ }
+
+ public Dimension minimumLayoutSize(final Container parent) {
+ return preferredLayoutSize(parent);
+ }
+
+ public Dimension preferredLayoutSize(final Container parent) {
+ final Dimension prefSize = new Dimension(0, 0);
+ final int componentCount = parent.getComponentCount();
+ for (int i = 0; i < componentCount; i++) {
+ final Component component = parent.getComponent(i);
+ if (component.isVisible()) {
+ component.validate();
+ final Dimension preferredCompSize = component.getPreferredSize();
+
+ prefSize.height += preferredCompSize.height;
+ prefSize.width = Math.max(prefSize.width, preferredCompSize.width);
+ }
+ }
+ return prefSize;
+ }
+
+ public void removeLayoutComponent(final Component comp) {
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ContentSizeCalculator.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ContentSizeCalculator.java
new file mode 100644
index 0000000..f756c0e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ContentSizeCalculator.java
@@ -0,0 +1,18 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Dimension;
+
+import javax.swing.JComponent;
+
+public class ContentSizeCalculator {
+ public static final Dimension ZERO = new Dimension(0, 0);
+ public static ContentSizeCalculator INSTANCE = new ContentSizeCalculator();
+ public Dimension calculateContentSize(final NodeView view) {
+ if(! view.isContentVisible())
+ return ZERO;
+ final JComponent content = view.getContent();
+ Dimension contentSize= content.getPreferredSize();
+ return contentSize;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/DetailsView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/DetailsView.java
new file mode 100644
index 0000000..609f77a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/DetailsView.java
@@ -0,0 +1,50 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Graphics;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 5, 2011
+ */
+ at SuppressWarnings("serial")
+public
+final class DetailsView extends ZoomableLabel {
+ public DetailsView() {
+ super();
+ }
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ if(isBackgroundSet()){
+ final Color background = getBackground();
+ final Color oldColor = g.getColor();
+ g.setColor(background);
+ final int iconWidth = getIconWidth() + getIconTextGap();
+ g.fillRect(iconWidth, 0, getWidth() - iconWidth, getHeight());
+ g.setColor(oldColor);
+ }
+ super.paintComponent(g);
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/FoldingMark.java b/freeplane/src/main/java/org/freeplane/view/swing/map/FoldingMark.java
new file mode 100644
index 0000000..c0e8e8c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/FoldingMark.java
@@ -0,0 +1,137 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Graphics2D;
+import java.awt.Polygon;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.geom.Ellipse2D;
+
+interface Drawable{
+ void draw(Graphics2D g, NodeView nodeView, Rectangle r);
+}
+
+class DrawableNothing implements Drawable{
+ public void draw(Graphics2D g, NodeView nodeView, Rectangle r) {
+ }
+}
+abstract class DrawableShape implements Drawable{
+ private final Color fillColor;
+
+ public DrawableShape(Color fillColor) {
+ this.fillColor = fillColor;
+ }
+ public void draw(Graphics2D g, NodeView nodeView, Rectangle r) {
+ final Color color = g.getColor();
+ final Color edgeColor = nodeView.getEdgeColor();
+ final Shape shape = getShape(r);
+ g.setColor(getFillColor(nodeView));
+ g.fill(shape);
+ g.setColor(edgeColor);
+ drawShape(g, shape, r, nodeView);
+ g.setColor(color);
+ }
+ protected void drawShape(Graphics2D g, final Shape shape, Rectangle r, NodeView nodeView) {
+ g.draw(shape);
+ }
+ abstract Shape getShape(Rectangle r);
+ protected Color getFillColor(NodeView nodeView) {
+ return fillColor;
+ }
+}
+
+class DrawableEllipse extends DrawableShape{
+ public DrawableEllipse(Color fillColor) {
+ super(fillColor);
+ }
+ Shape getShape(Rectangle r){
+ return new Ellipse2D.Float(r.x, r.y, r.width, r.height);
+ }
+}
+
+class FoldingCircle extends DrawableEllipse{
+ final private boolean folded;
+ final private boolean hiddenChild;
+
+ public FoldingCircle(Color fillColor, boolean folded, boolean hiddenChild) {
+ super(fillColor);
+ this.folded = folded;
+ this.hiddenChild =hiddenChild;
+ }
+
+ @Override
+ protected void drawShape(Graphics2D g, Shape shape, Rectangle r, NodeView nodeView) {
+ super.drawShape(g, shape, r, nodeView);
+ if(nodeView.isRoot() & ! folded)
+ return;
+ if(! nodeView.getMainView().getMouseArea().equals(MouseArea.FOLDING))
+ g.setColor(nodeView.getEdgeColor());
+ else
+ g.setColor(super.getFillColor(nodeView));
+ if(! hiddenChild)
+ g.drawLine(r.x + r.width / 4, r.y + r.height / 2, r.x + r.width * 3/ 4, r.y + r.height / 2);
+ if(folded || hiddenChild)
+ g.drawLine(r.x + r.width / 2, r.y + r.height / 4, r.x + r.width / 2, r.y + r.height * 3 / 4);
+ }
+
+ @Override
+ protected Color getFillColor(NodeView nodeView) {
+ if(nodeView.getMainView().getMouseArea().equals(MouseArea.FOLDING)){
+ return Color.GRAY;
+ }
+ return super.getFillColor(nodeView);
+ }
+
+}
+
+class DrawableTriangle extends DrawableShape{
+ public DrawableTriangle(Color fillColor) {
+ super(fillColor);
+ }
+ Shape getShape(Rectangle r){
+ final Polygon polygon = new Polygon();
+ polygon.addPoint(r.x, r.y);
+ polygon.addPoint(r.x + r.width, r.y);
+ polygon.addPoint(r.x + (r.width + 1) / 2, r.y + r.height);
+ polygon.addPoint(r.x + r.width / 2, r.y + r.height);
+ polygon.addPoint(r.x, r.y);
+ return polygon;
+ }
+}
+
+
+class DrawableRectangle extends DrawableShape{
+ public DrawableRectangle(Color fillColor) {
+ super(fillColor);
+ }
+ Shape getShape(Rectangle r){
+ final Polygon polygon = new Polygon();
+ final int x1 = r.x + 1;
+ final int x2 = x1 + r.width - 3;
+ final int y1 = r.y + 1;
+ final int y2 = y1 + r.height - 3;
+ polygon.addPoint(x1, y1);
+ polygon.addPoint(x2, y1);
+ polygon.addPoint(x2, y2);
+ polygon.addPoint(x1, y2);
+ polygon.addPoint(x1, y1);
+ return polygon;
+ }
+}
+public enum FoldingMark implements Drawable{
+ UNFOLDED(new DrawableNothing()), ITSELF_FOLDED(new DrawableEllipse(Color.WHITE)), UNVISIBLE_CHILDREN_FOLDED(new DrawableEllipse(Color.GRAY)),
+ SHORTENED(new DrawableTriangle(Color.WHITE)),
+ CLONE(new DrawableRectangle(Color.WHITE)),
+ FOLDING_CIRCLE_FOLDED(new FoldingCircle(Color.WHITE, true, false)), FOLDING_CIRCLE_UNFOLDED(new FoldingCircle(Color.WHITE, false, false)),
+ FOLDING_CIRCLE_HIDDEN_CHILD(new FoldingCircle(Color.WHITE, false, true));
+ final Drawable drawable;
+
+ FoldingMark(Drawable drawable){
+ this.drawable = drawable;
+ }
+
+ public void draw(Graphics2D g, NodeView nodeView, Rectangle r) {
+ drawable.draw(g, nodeView, r);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ForkMainView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ForkMainView.java
new file mode 100644
index 0000000..205e0f9
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ForkMainView.java
@@ -0,0 +1,137 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Stroke;
+
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+
+class ForkMainView extends MainView {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public
+ Point getLeftPoint() {
+ int edgeWidth = getEdgeWidth();
+ final Point in = new Point(0, getHeight() - edgeWidth / 2);
+ return in;
+ }
+
+ public int getEdgeWidth() {
+ final NodeView nodeView = getNodeView();
+ final int edgeWidth = nodeView.getEdgeWidth();
+ final EdgeStyle style = nodeView.getEdgeStyle();
+ final int nodeLineWidth = style.getNodeLineWidth(edgeWidth);
+ if(edgeWidth == 0)
+ return nodeLineWidth;
+ else{
+ final int zoomedLineWidth = nodeView.getMap().getZoomed(nodeLineWidth);
+ return zoomedLineWidth;
+ }
+ }
+
+ @Override
+ protected int getMainViewHeightWithFoldingMark() {
+ int height = getHeight();
+ final NodeView nodeView = getNodeView();
+ if (nodeView.isFolded()) {
+ height += getZoomedFoldingSymbolHalfWidth();
+ }
+ return height;
+ }
+
+ @Override
+ public
+ Point getRightPoint() {
+ int edgeWidth = getEdgeWidth();
+ final Point in = new Point(getWidth() - 1, getHeight() - edgeWidth / 2);
+ return in;
+ }
+
+ @Override
+ public void paintComponent(final Graphics graphics) {
+ final Graphics2D g = (Graphics2D) graphics;
+ final NodeView nodeView = getNodeView();
+ if (nodeView.getModel() == null) {
+ return;
+ }
+ paintBackgound(g);
+ paintDragOver(g);
+ super.paintComponent(g);
+ }
+
+ @Override
+ protected void paintBackground(final Graphics2D graphics, final Color color) {
+ graphics.setColor(color);
+ graphics.fillRect(0, 0, getWidth(), getHeight() - getEdgeWidth());
+ }
+
+ @Override
+ void paintDecoration(final NodeView nodeView, final Graphics2D g) {
+ final Stroke oldStroke = g.getStroke();
+ float edgeWidth = getEdgeWidth();
+ g.setStroke(new BasicStroke(edgeWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
+ final Color oldColor = g.getColor();
+ g.setColor(nodeView.getEdgeColor());
+ Point leftLinePoint = getLeftPoint();
+ g.drawLine(leftLinePoint.x, leftLinePoint.y, leftLinePoint.x + getWidth(), leftLinePoint.y);
+ g.setColor(oldColor);
+ g.setStroke(oldStroke);
+ super.paintDecoration(nodeView, g);
+ }
+
+ @Override
+ public Insets getInsets() {
+ return getInsets(null);
+ }
+
+ @Override
+ public Insets getInsets(Insets insets) {
+ final NodeView nodeView = getNodeView();
+ int edgeWidth = nodeView.getEdgeWidth();
+ final EdgeStyle style = nodeView.getEdgeStyle();
+ edgeWidth = style.getNodeLineWidth(edgeWidth);
+ if(insets == null)
+ insets = new Insets(0, 2, edgeWidth, 2);
+ else
+ insets.set(0, 2, edgeWidth, 2);
+ return insets;
+ }
+ private final static int SINGLE_CHILD_SHIFT = -2;
+
+ @Override
+ public int getSingleChildShift() {
+ return SINGLE_CHILD_SHIFT;
+ }
+
+ @Override
+ public ShapeConfigurationModel getShapeConfiguration() {
+ return ShapeConfigurationModel.FORK;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/GlyphPainterMetricResetter.java b/freeplane/src/main/java/org/freeplane/view/swing/map/GlyphPainterMetricResetter.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/GlyphPainterMetricResetter.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/GlyphPainterMetricResetter.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/INodeViewLayout.java b/freeplane/src/main/java/org/freeplane/view/swing/map/INodeViewLayout.java
new file mode 100644
index 0000000..7a0e7cd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/INodeViewLayout.java
@@ -0,0 +1,27 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Dimension;
+import java.awt.LayoutManager;
+
+public interface INodeViewLayout extends LayoutManager {
+ final static Dimension ZERO_DIMENSION = new Dimension(0, 0);
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ImmediatelyValidatingPreferredSizeCalculator.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ImmediatelyValidatingPreferredSizeCalculator.java
new file mode 100644
index 0000000..3492391
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ImmediatelyValidatingPreferredSizeCalculator.java
@@ -0,0 +1,20 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Container;
+import java.awt.Dimension;
+
+public class ImmediatelyValidatingPreferredSizeCalculator {
+ public static final ImmediatelyValidatingPreferredSizeCalculator INSTANCE = new ImmediatelyValidatingPreferredSizeCalculator();
+
+/*
+ * (non-Javadoc)
+ * @see java.awt.LayoutManager#preferredLayoutSize(java.awt.Container)
+ */
+ public Dimension preferredLayoutSize(final Container c) {
+ if (!c.isValid()) {
+ c.validate();
+ }
+ return c.getSize();
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/MainView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/MainView.java
new file mode 100644
index 0000000..b8dca71
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/MainView.java
@@ -0,0 +1,784 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.GradientPaint;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Stroke;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseEvent;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.Collection;
+
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JToolTip;
+import javax.swing.KeyStroke;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.border.Border;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.components.MultipleImage;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.map.HideChildSubtree;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel.TextAlign;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.features.text.HighlightedTransformedObject;
+import org.freeplane.features.text.TextController;
+
+
+/**
+ * Base class for all node views.
+ */
+public abstract class MainView extends ZoomableLabel {
+ private static final int FOLDING_CIRCLE_WIDTH = 16;
+ private static final String USE_COMMON_OUT_POINT_FOR_ROOT_NODE_STRING = "use_common_out_point_for_root_node";
+ public static boolean USE_COMMON_OUT_POINT_FOR_ROOT_NODE = ResourceController.getResourceController().getBooleanProperty(USE_COMMON_OUT_POINT_FOR_ROOT_NODE_STRING);
+
+ static Dimension maximumSize = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
+ static Dimension minimumSize = new Dimension(0,0);
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ protected int isDraggedOver = NodeView.DRAGGED_OVER_NO;
+ private boolean isShortened;
+ private TextModificationState textModified = TextModificationState.NONE;
+ private MouseArea mouseArea = MouseArea.OUT;
+ final static Stroke DEF_STROKE = new BasicStroke();
+ private static final int DRAG_OVAL_WIDTH = 10;
+
+ boolean isShortened() {
+ return isShortened;
+ }
+
+ MainView() {
+ setAlignmentX(Component.CENTER_ALIGNMENT);
+ setHorizontalAlignment(SwingConstants.LEFT);
+ setVerticalAlignment(SwingConstants.CENTER);
+ setHorizontalTextPosition(SwingConstants.TRAILING);
+ setVerticalTextPosition(JLabel.TOP);
+ }
+
+ protected void convertPointFromMap(final Point p) {
+ UITools.convertPointFromAncestor(getMap(), p, this);
+ }
+
+ protected void convertPointToMap(final Point p) {
+ UITools.convertPointToAncestor(this, p, getMap());
+ }
+
+ public boolean dropAsSibling(final double xCoord) {
+ if(getNodeView().isRoot())
+ return false;
+ if(dropLeft(xCoord))
+ return ! isInVerticalRegion(xCoord, 2. / 3);
+ else
+ return isInVerticalRegion(xCoord, 1. / 3);
+ }
+
+ /** @return true if should be on the left, false otherwise. */
+ public boolean dropLeft(final double xCoord) {
+ /* here it is the same as me. */
+ NodeView nodeView = getNodeView();
+ if(getNodeView().isRoot())
+ return xCoord < getSize().width * 1 / 2;
+ else
+ return nodeView.isLeft();
+ }
+
+ public int getDeltaX() {
+ final NodeView nodeView = getNodeView();
+ if (nodeView.isFolded() && nodeView.isLeft()) {
+ return getZoomedFoldingSymbolHalfWidth() * 3;
+ }
+ else
+ return 0;
+ }
+
+ /** get y coordinate including folding symbol */
+ public int getDeltaY() {
+ return 0;
+ }
+
+ public int getDraggedOver() {
+ return isDraggedOver;
+ }
+
+ public abstract Point getLeftPoint();
+
+ /** get height including folding symbol */
+ protected int getMainViewHeightWithFoldingMark() {
+ return getHeight();
+ }
+
+ /** get width including folding symbol */
+ protected int getMainViewWidthWithFoldingMark() {
+ int width = getWidth();
+ final NodeView nodeView = getNodeView();
+ final NodeModel model = nodeView.getModel();
+ if (nodeView.isFolded()) {
+ width += getZoomedFoldingSymbolHalfWidth() * 3;
+ }
+ return width;
+ }
+
+
+ @Override
+ public Dimension getMaximumSize() {
+ return MainView.maximumSize;
+ }
+
+ @Override
+ public Dimension getMinimumSize() {
+ return MainView.minimumSize;
+ }
+
+ public abstract Point getRightPoint();
+
+
+ abstract public ShapeConfigurationModel getShapeConfiguration();
+
+ int getZoomedFoldingSymbolHalfWidth() {
+ return getNodeView().getZoomedFoldingSymbolHalfWidth();
+ }
+
+ public boolean isClickableLink(final double xCoord) {
+ final NodeView nodeView = getNodeView();
+ final NodeModel model = nodeView.getModel();
+ if (NodeLinks.getValidLink(model) == null)
+ return false;
+ return isInIconRegion(xCoord);
+ }
+
+ public boolean isInIconRegion(final double xCoord)
+ {
+ Rectangle iconR = getIconRectangle();
+ return xCoord >= iconR.x && xCoord < iconR.x + iconR.width;
+ }
+
+ private Rectangle getIconRectangle() {
+ ZoomableLabelUI zoomableLabelUI = (ZoomableLabelUI)getUI();
+ Rectangle iconR = zoomableLabelUI.getIconR(this);
+ return iconR;
+ }
+
+ /**
+ * Determines whether or not the xCoord is in the part p of the node: if
+ * node is on the left: part [1-p,1] if node is on the right: part[ 0,p] of
+ * the total width.
+ */
+ public boolean isInVerticalRegion(final double xCoord, final double p) {
+ return xCoord < getSize().width * p;
+ }
+
+ @Override
+ final public void paint(Graphics g){
+ final PaintingMode paintingMode = getMap().getPaintingMode();
+ if(! (PaintingMode.SELECTED_NODES.equals(paintingMode)
+ || PaintingMode.NODES.equals(paintingMode)))
+ return;
+ final NodeView nodeView = getNodeView();
+ final boolean selected = nodeView.isSelected();
+ if(paintingMode.equals(PaintingMode.SELECTED_NODES) == selected)
+ super.paint(g);
+ }
+
+
+ public void paintDragOver(final Graphics2D graphics) {
+ if (isDraggedOver == NodeView.DRAGGED_OVER_SON || isDraggedOver == NodeView.DRAGGED_OVER_SON_LEFT) {
+ paintDragOverSon(graphics);
+ }
+ if (isDraggedOver == NodeView.DRAGGED_OVER_SIBLING) {
+ paintDragOverSibling(graphics);
+ }
+ }
+
+ private void paintDragOverSibling(final Graphics2D graphics) {
+ graphics.setPaint(new GradientPaint(0, getHeight() * 3 / 5, getMap().getBackground(), 0, getHeight() / 5,
+ NodeView.dragColor));
+ graphics.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
+ }
+
+ private void paintDragOverSon(final Graphics2D graphics) {
+ if (getNodeView().isLeft() || isDraggedOver == NodeView.DRAGGED_OVER_SON_LEFT) {
+ graphics.setPaint(new GradientPaint(getWidth() * 3 / 4, 0, getMap().getBackground(), getWidth() / 4, 0,
+ NodeView.dragColor));
+ graphics.fillRect(0, 0, getWidth() * 3 / 4, getHeight() - 1);
+ }
+ else {
+ graphics.setPaint(new GradientPaint(getWidth() / 4, 0, getMap().getBackground(), getWidth() * 3 / 4, 0,
+ NodeView.dragColor));
+ graphics.fillRect(getWidth() / 4, 0, getWidth() - 1, getHeight() - 1);
+ }
+ }
+
+ public FoldingMark foldingMarkType(MapController mapController, NodeView nodeView) {
+ NodeModel node = nodeView.getModel();
+ if (nodeView.isFolded()) {
+ return FoldingMark.ITSELF_FOLDED;
+ }
+ for (final NodeModel child : mapController.childrenUnfolded(node)) {
+ if (child.hasVisibleContent() && child.containsExtension(HideChildSubtree.class)) {
+ return FoldingMark.ITSELF_FOLDED;
+ }
+ }
+ for (final NodeView childView : nodeView.getChildrenViews()) {
+ if (!childView.getModel().hasVisibleContent() && !FoldingMark.UNFOLDED.equals(foldingMarkType(mapController, childView))) {
+ return FoldingMark.UNVISIBLE_CHILDREN_FOLDED;
+ }
+ }
+ return FoldingMark.UNFOLDED;
+ }
+
+ void paintDecoration(final NodeView nodeView, final Graphics2D g) {
+ drawModificationRect(g);
+ paintDragRectangle(g);
+ paintFoldingMark(nodeView, g);
+ if (isShortened()) {
+ FoldingMark.SHORTENED.draw(g, nodeView, decorationMarkBounds(nodeView, 7./3, 5./3));
+ }
+ else if (nodeView.getModel().isCloneTreeRoot())
+ FoldingMark.CLONE.draw(g, nodeView, decorationMarkBounds(nodeView, 2, 2.5));
+ else if (nodeView.getModel().isCloneTreeNode())
+ FoldingMark.CLONE.draw(g, nodeView, decorationMarkBounds(nodeView, 1.5, 2.5));
+ }
+
+ private Rectangle decorationMarkBounds(final NodeView nodeView, double widthFactor, double heightFactor) {
+ final int size = nodeView.getZoomedStateSymbolHalfWidth();
+ int width = (int) (size * widthFactor);
+ int x = nodeView.isLeft() ? getWidth() : 0 - width;
+ int height = (int) (size * heightFactor);
+ int y = (getHeight() - height) / 2;
+ Rectangle decorationMarkBounds = new Rectangle(x, y, width, height);
+ return decorationMarkBounds;
+ }
+
+ protected void paintFoldingMark(final NodeView nodeView, final Graphics2D g) {
+ if (! hasChildren())
+ return;
+ final MapView map = getMap();
+ final MapController mapController = map.getModeController().getMapController();
+ final FoldingMark markType = foldingMarkType(mapController, nodeView);
+ Point mousePosition = null;
+ try {
+ mousePosition = getMousePosition();
+ }
+ catch (Exception e) {
+ }
+ if(mousePosition != null && ! map.isPrinting()){
+ final int width = Math.max(FOLDING_CIRCLE_WIDTH, getZoomedFoldingSymbolHalfWidth() * 2);
+ final Point p = getNodeView().isLeft() ? getLeftPoint() : getRightPoint();
+ if(p.y + width/2 > getHeight())
+ p.y = getHeight() - width;
+ else
+ p.y -= width/2;
+ if(nodeView.isLeft())
+ p.x -= width;
+ final FoldingMark foldingCircle;
+ if(markType.equals(FoldingMark.UNFOLDED)) {
+ final NodeModel node = nodeView.getModel();
+ if(mapController.hasHiddenChildren(node))
+ foldingCircle = FoldingMark.FOLDING_CIRCLE_HIDDEN_CHILD;
+ else
+ foldingCircle = FoldingMark.FOLDING_CIRCLE_UNFOLDED;
+ }
+ else{
+ foldingCircle = FoldingMark.FOLDING_CIRCLE_FOLDED;
+ }
+ foldingCircle.draw(g, nodeView, new Rectangle(p.x, p.y, width, width));
+ }
+ else{
+ final int halfWidth = getZoomedFoldingSymbolHalfWidth();
+ final Point p = getNodeView().isLeft() ? getLeftPoint() : getRightPoint();
+ if (p.x <= 0) {
+ p.x -= halfWidth;
+ }
+ else {
+ p.x += halfWidth;
+ }
+ markType.draw(g, nodeView, new Rectangle(p.x - halfWidth, p.y-halfWidth, halfWidth*2, halfWidth*2));
+ }
+ }
+
+
+ private void paintDragRectangle(final Graphics g) {
+ if (! MouseArea.MOTION.equals(mouseArea))
+ return;
+ final Graphics2D g2 = (Graphics2D) g;
+ final Object renderingHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
+ final MapView parent = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, this);
+ parent.getModeController().getController().getMapViewManager().setEdgesRenderingHint(g2);
+ final Color color = g2.getColor();
+ NodeView movedView = getNodeView();
+ Rectangle r = getDragRectangle();
+ if (movedView .isFree()) {
+ g2.setColor(Color.BLUE);
+ g.fillOval(r.x, r.y, r.width - 1, r.height - 1);
+ }
+ else if (LocationModel.getModel(movedView.getModel()).getHGap().value <= 0) {
+ g2.setColor(Color.RED);
+ g.fillOval(r.x, r.y, r.width- 1, r.height- 1);
+ }
+ g2.setColor(Color.BLACK);
+ g.drawOval(r.x, r.y, r.width- 1, r.height- 1);
+ g2.setColor(color);
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
+ }
+
+ public Rectangle getDragRectangle() {
+ final int size = getDraggingWidth();
+ Rectangle r;
+ if(getNodeView().isLeft())
+ r = new Rectangle(getWidth(), -size, size, getHeight() + size * 2);
+ else
+ r = new Rectangle(-size, -size, size, getHeight() + size * 2);
+ return r;
+ }
+
+ private void drawModificationRect(Graphics g) {
+ final Color color = g.getColor();
+ if(TextModificationState.HIGHLIGHT.equals(textModified)){
+ final boolean markTransformedText = TextController.isMarkTransformedTextSet();
+ if(! markTransformedText)
+ return;
+ g.setColor(Color.GREEN);
+ }
+ else if(TextModificationState.FAILURE.equals(textModified)){
+ g.setColor(Color.RED);
+ }
+ else{
+ return;
+ }
+ g.drawRect(-1, -1, getWidth() + 2, getHeight() + 2);
+ g.setColor(color);
+ }
+
+ protected void paintBackgound(final Graphics2D g) {
+ final Color color = getPaintedBackground();
+ paintBackground(g, color);
+ }
+
+ public Color getPaintedBackground() {
+ final Color color;
+ if (getNodeView().useSelectionColors()) {
+ color = getNodeView().getSelectedColor();
+ }
+ else {
+ color = getNodeView().getTextBackground();
+ }
+ return color;
+ }
+ abstract protected void paintBackground(final Graphics2D graphics, final Color color);
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.JComponent#processKeyBinding(javax.swing.KeyStroke,
+ * java.awt.event.KeyEvent, int, boolean)
+ */
+ @Override
+ protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
+ if (super.processKeyBinding(ks, e, condition, pressed)) {
+ return true;
+ }
+ final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, this);
+ final FreeplaneMenuBar freeplaneMenuBar = mapView.getModeController().getController().getViewController()
+ .getFreeplaneMenuBar();
+ return !freeplaneMenuBar.isVisible()
+ && freeplaneMenuBar.processKeyBinding(ks, e, JComponent.WHEN_IN_FOCUSED_WINDOW, pressed);
+ }
+
+ public void setDraggedOver(final int draggedOver) {
+ isDraggedOver = draggedOver;
+ }
+
+ public void setDraggedOver(final Point p) {
+ final int draggedOver;
+ if(getNodeView().isRoot()) {
+ if (dropLeft(p.getX()))
+ draggedOver = NodeView.DRAGGED_OVER_SON_LEFT;
+ else
+ draggedOver = NodeView.DRAGGED_OVER_SON;
+ }
+ else {
+ if (dropAsSibling(p.getX()))
+ draggedOver = NodeView.DRAGGED_OVER_SIBLING;
+ else
+ draggedOver = NodeView.DRAGGED_OVER_SON;
+ }
+ setDraggedOver(draggedOver);
+ }
+
+ public void updateFont(final NodeView node) {
+ final Font font = NodeStyleController.getController(node.getMap().getModeController()).getFont(node.getModel());
+ setFont(UITools.scale(font));
+ }
+
+ void updateIcons(final NodeView node) {
+// setHorizontalTextPosition(node.isLeft() ? SwingConstants.LEADING : SwingConstants.TRAILING);
+ final MultipleImage iconImages = new MultipleImage();
+ /* fc, 06.10.2003: images? */
+ final NodeModel model = node.getModel();
+ for (final UIIcon icon : IconController.getController().getStateIcons(model)) {
+ iconImages.addIcon(icon);
+ }
+ final ModeController modeController = getNodeView().getMap().getModeController();
+ final Collection<MindIcon> icons = IconController.getController(modeController).getIcons(model);
+ for (final MindIcon myIcon : icons) {
+ iconImages.addIcon(myIcon);
+ }
+ addOwnIcons(iconImages, model);
+ setIcon((iconImages.getImageCount() > 0 ? iconImages : null));
+ }
+
+ private void addOwnIcons(final MultipleImage iconImages, final NodeModel model) {
+ final URI link = NodeLinks.getLink(model);
+ final Icon icon = getNodeView().getMap().getModeController().getExtension(LinkController.class).getLinkIcon(link, model);
+ if(icon != null)
+ iconImages.addLinkIcon(icon);
+ }
+
+ void updateTextColor(final NodeView node) {
+ final Color color = NodeStyleController.getController(node.getMap().getModeController()).getColor(
+ node.getModel());
+ setForeground(color);
+ }
+
+ void updateTextAlign(NodeView node) {
+ final TextAlign textAlign = NodeStyleController.getController(node.getMap().getModeController()).getTextAlign(node.getModel());
+ final boolean isCenteredByDefault = textAlign == TextAlign.DEFAULT && node.isRoot();
+ setHorizontalAlignment(isCenteredByDefault ? TextAlign.CENTER.swingConstant : textAlign.swingConstant);
+ }
+
+
+ public boolean isEdited() {
+ return getComponentCount() == 1 && getComponent(0) instanceof JTextComponent;
+ }
+
+ static enum TextModificationState{NONE, HIGHLIGHT, FAILURE};
+
+ public void updateText(NodeModel nodeModel) {
+ final NodeView nodeView = getNodeView();
+ if(nodeView == null)
+ return;
+ final ModeController modeController = nodeView.getMap().getModeController();
+ final TextController textController = TextController.getController(modeController);
+ isShortened = textController.isMinimized(nodeModel);
+ final Object userObject = nodeModel.getUserObject();
+ String text;
+ try {
+ final Object transformedContent = textController.getTransformedObject(nodeModel);
+ if(nodeView.isSelected()){
+ nodeView.getMap().getModeController().getController().getViewController().addObjectTypeInfo(transformedContent);
+ }
+ Icon icon = textController.getIcon(transformedContent, nodeModel, userObject);
+ putClientProperty(TEXT_RENDERING_ICON, icon);
+ text = transformedContent.toString();
+ textModified = transformedContent instanceof HighlightedTransformedObject ? TextModificationState.HIGHLIGHT : TextModificationState.NONE;
+ }
+ catch (Throwable e) {
+ LogUtils.warn(e.getMessage(), e);
+ text = TextUtils.format("MainView.errorUpdateText", String.valueOf(userObject), e.getLocalizedMessage());
+ textModified = TextModificationState.FAILURE;
+ }
+ if(isShortened){
+ text = textController.getShortText(text);
+ }
+ text = convertTextToHtmlLink(text, nodeModel);
+ updateText(text);
+ }
+
+ private String convertTextToHtmlLink(String text, NodeModel node) {
+ URI link = NodeLinks.getLink(node);
+ if(link == null || "menuitem".equals(link.getScheme()) || ! LinkController.getController().formatNodeAsHyperlink(node))
+ return text;
+ if (HtmlUtils.isHtmlNode(text))
+ text = HtmlUtils.htmlToPlain(text);
+ StringBuilder sb = new StringBuilder("<html><body><a href=\"");
+ sb.append(link.toString());
+ sb.append("\">");
+ final String xmlEscapedText = HtmlUtils.toHTMLEscapedText(text);
+ sb.append(xmlEscapedText);
+ sb.append("</a></body></html>");
+ return sb.toString();
+ }
+
+ @Override
+ public JToolTip createToolTip() {
+ NodeTooltip tip = new NodeTooltip(this.getGraphicsConfiguration());
+ tip.setComponent(this);
+ final URL url = getMap().getModel().getURL();
+ if (url != null) {
+ tip.setBase(url);
+ }
+ else {
+ try {
+ tip.setBase(new URL("file: "));
+ }
+ catch (MalformedURLException e) {
+ }
+ }
+ return tip;
+ }
+
+ @Override
+ public void setBorder(Border border) {
+ }
+
+ static public enum ConnectorLocation{LEFT, RIGHT, TOP, BOTTOM, CENTER};
+
+ public ConnectorLocation getConnectorLocation(Point relativeLocation) {
+ if(relativeLocation.x > getWidth())
+ return ConnectorLocation.RIGHT;
+ if(relativeLocation.x < 0)
+ return ConnectorLocation.LEFT;
+ if(relativeLocation.y > getHeight())
+ return ConnectorLocation.BOTTOM;
+ if(relativeLocation.y <0)
+ return ConnectorLocation.TOP;
+ return ConnectorLocation.CENTER;
+ }
+ public Point getConnectorPoint(Point relativeLocation) {
+ if(relativeLocation.x > getWidth())
+ return getRightPoint();
+ if(relativeLocation.x < 0)
+ return getLeftPoint();
+ if(relativeLocation.y > getHeight()){
+ final Point bottomPoint = getBottomPoint();
+ bottomPoint.y = getNodeView().getContent().getHeight();
+ return bottomPoint;
+ }
+ if(relativeLocation.y <0)
+ return getTopPoint();
+ return getCenterPoint();
+ }
+
+ private Point getCenterPoint() {
+ return new Point(getWidth()/2, getHeight()/2);
+ }
+
+ public Point getTopPoint() {
+ return new Point(getWidth()/2, 0);
+ }
+
+ public Point getBottomPoint() {
+ return new Point(getWidth()/2, getHeight());
+ }
+
+ @Override
+ public String getToolTipText() {
+ final String toolTipText = super.getToolTipText();
+ if(toolTipText != null)
+ return toolTipText;
+ return createToolTipText();
+ }
+
+ private String createToolTipText() {
+ final NodeView nodeView = getNodeView();
+ if (nodeView == null)
+ return "";
+ final ModeController modeController = nodeView.getMap().getModeController();
+ final NodeModel node = nodeView.getModel();
+ return modeController.createToolTip(node, this);
+ }
+
+ @Override
+ public String getToolTipText(MouseEvent event) {
+ final String toolTipText = super.getToolTipText(event);
+ if(toolTipText != null)
+ return toolTipText;
+ return createToolTipText();
+ }
+
+ @Override
+ public boolean contains(int x, int y) {
+ final Point p = new Point(x, y);
+ return isInFoldingRegion(p) || isInDragRegion(p)|| super.contains(x, y);
+ }
+
+ public boolean isInDragRegion(Point p) {
+ if (p.y >= 0 && p.y < getHeight()){
+ final NodeView nodeView = getNodeView();
+ if(nodeView.isRoot())
+ return false;
+ if (MapViewLayout.OUTLINE.equals(nodeView.getMap().getLayoutType()))
+ return false;
+ final int draggingWidth = getDraggingWidth();
+ if(nodeView.isLeft()){
+ final int width = getWidth();
+ return p.x >= width && p.x < width + draggingWidth;
+ }
+ else
+ return p.x >= -draggingWidth && p.x < 0;
+ }
+ return false;
+
+ }
+
+ public boolean isInFoldingRegion(Point p) {
+ if (hasChildren() && p.y >= 0 && p.y < getHeight()) {
+ final boolean isLeft = getNodeView().isLeft();
+ final int width = Math.max(FOLDING_CIRCLE_WIDTH, getZoomedFoldingSymbolHalfWidth() * 2);
+ if (isLeft) {
+ final int maxX = 0;
+ return p.x >= -width && p.x < maxX;
+ }
+ else {
+ final int minX = getWidth();
+ return p.x >= minX && p.x < (getWidth() + width);
+ }
+ }
+ else
+ return false;
+ }
+
+ private boolean hasChildren() {
+ return getNodeView().getModel().hasChildren();
+ }
+
+ public MouseArea getMouseArea() {
+ return mouseArea;
+ }
+ public MouseArea whichMouseArea(Point point) {
+ final int x = point.x;
+ if(isInDragRegion(point))
+ return MouseArea.MOTION;
+ if(isInFoldingRegion(point))
+ return MouseArea.FOLDING;
+ if(isClickableLink(x))
+ return MouseArea.LINK;
+ return MouseArea.DEFAULT;
+ }
+
+
+ public void setMouseArea(MouseArea mouseArea) {
+ if(mouseArea.equals(this.mouseArea))
+ return;
+ final boolean repaintDraggingRectangle = isVisible()
+ && (mouseArea.equals(MouseArea.MOTION)
+ || this.mouseArea.equals(MouseArea.MOTION)
+ );
+ final boolean repaintFoldingRectangle = isVisible()
+ && (mouseArea.equals(MouseArea.OUT)
+ || mouseArea.equals(MouseArea.FOLDING)
+ || this.mouseArea.equals(MouseArea.OUT)
+ || this.mouseArea.equals(MouseArea.FOLDING));
+ this.mouseArea = mouseArea;
+ if(repaintDraggingRectangle)
+ paintDraggingRectangleImmediately();
+ if(repaintFoldingRectangle)
+ paintFoldingRectangleImmediately();
+ }
+
+ private void paintFoldingRectangleImmediately() {
+ final int zoomedFoldingSymbolHalfWidth = getZoomedFoldingSymbolHalfWidth();
+ final int width = Math.max(FOLDING_CIRCLE_WIDTH, zoomedFoldingSymbolHalfWidth * 2);
+ final NodeView nodeView = getNodeView();
+ int height;
+ final int x, y;
+ if (nodeView.isLeft()){
+ x = -width;
+ }
+ else{
+ x = getWidth();
+ }
+ if(FOLDING_CIRCLE_WIDTH >= getHeight()){
+ height = FOLDING_CIRCLE_WIDTH;
+ y = getHeight() - FOLDING_CIRCLE_WIDTH;
+ }
+ else{
+ height = getHeight();
+ y = 0;
+ }
+ height += zoomedFoldingSymbolHalfWidth;
+ final Rectangle foldingRectangle = new Rectangle(x-4, y-4, width+8, height+8);
+ final MapView map = nodeView.getMap();
+ UITools.convertRectangleToAncestor(this, foldingRectangle, map);
+ map.paintImmediately(foldingRectangle);
+ }
+
+ private void paintDraggingRectangleImmediately() {
+ final Rectangle dragRectangle = getDragRectangle();
+ paintDecorationImmediately(dragRectangle);
+ }
+
+ private void paintDecorationImmediately(final Rectangle rectangle) {
+ final MapView map = getMap();
+ UITools.convertRectangleToAncestor(this, rectangle, map);
+ map.paintImmediately(rectangle);
+ }
+
+ @Override
+ public void setVisible(boolean visible) {
+ super.setVisible(visible);
+ if(! visible)
+ setMouseArea(MouseArea.DEFAULT);
+ }
+
+ private int getDraggingWidth() {
+ return getNodeView().getZoomed(DRAG_OVAL_WIDTH);
+ }
+
+ public UIIcon getUIIconAt(Point coordinate){
+ Icon icon = getIcon();
+ if(icon instanceof MultipleImage){
+ Rectangle iconRectangle = getIconRectangle();
+ Point transformedToIconCoordinate = new Point(coordinate);
+ transformedToIconCoordinate.translate(-iconRectangle.x, -iconRectangle.y);
+ return ((MultipleImage)icon).getUIIconAt(transformedToIconCoordinate);
+
+ }
+ else
+ return null;
+ }
+
+ public int getSingleChildShift() {
+ return 0;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/MapScroller.java b/freeplane/src/main/java/org/freeplane/view/swing/map/MapScroller.java
new file mode 100644
index 0000000..bc4d309
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/MapScroller.java
@@ -0,0 +1,283 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.util.List;
+
+import javax.swing.JComponent;
+import javax.swing.JViewport;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.ui.ViewController;
+
+class MapScroller {
+
+ private NodeView anchor;
+ private Point anchorContentLocation;
+ private float anchorHorizontalPoint;
+ private float anchorVerticalPoint;
+ private NodeView scrolledNode = null;
+ private ScrollingDirective scrollingDirective = ScrollingDirective.DONE;
+ private boolean slowScroll;
+ private int extraWidth;
+ final private MapView map;
+
+
+
+ public MapScroller(MapView map) {
+ this.map = map;
+ this.anchorContentLocation = new Point();
+ }
+
+ void anchorToNode(final NodeView view, final float horizontalPoint, final float verticalPoint) {
+ if (view != null && view.getMainView() != null) {
+ setAnchorView(view);
+ anchorHorizontalPoint = horizontalPoint;
+ anchorVerticalPoint = verticalPoint;
+ this.anchorContentLocation = getAnchorCenterPoint();
+ if (scrolledNode == null) {
+ scrolledNode = anchor;
+ scrollingDirective = ScrollingDirective.ANCHOR;
+ extraWidth = 0;
+ }
+ }
+ }
+
+ /**
+ * Scroll the viewport of the map to the south-west, i.e. scroll the map
+ * itself to the north-east.
+ */
+ public void scrollBy(final int x, final int y) {
+ final JViewport mapViewport = (JViewport) map.getParent();
+ if (mapViewport != null) {
+ final Point currentPoint = mapViewport.getViewPosition();
+ currentPoint.translate(x, y);
+ if (currentPoint.getX() < 0) {
+ currentPoint.setLocation(0, currentPoint.getY());
+ }
+ if (currentPoint.getY() < 0) {
+ currentPoint.setLocation(currentPoint.getX(), 0);
+ }
+ final double maxX = map.getSize().getWidth() - mapViewport.getExtentSize().getWidth();
+ final double maxY = map.getSize().getHeight() - mapViewport.getExtentSize().getHeight();
+ if (currentPoint.getX() > maxX) {
+ currentPoint.setLocation(maxX, currentPoint.getY());
+ }
+ if (currentPoint.getY() > maxY) {
+ currentPoint.setLocation(currentPoint.getX(), maxY);
+ }
+ mapViewport.setViewPosition(currentPoint);
+ }
+ }
+
+ public void scrollNode(final NodeView node, ScrollingDirective scrollingDirective, boolean slowScroll) {
+ if (node != null) {
+ this.slowScroll = slowScroll;
+ scrolledNode = node;
+ this.scrollingDirective = scrollingDirective;
+ if (map.isDisplayable() && map.frameLayoutCompleted() && map.isValid())
+ scrollNodeNow(slowScroll);
+ }
+ }
+
+ private Rectangle calculateOptimalVisibleRectangle() {
+ final JViewport viewPort = (JViewport) map.getParent();
+ final Dimension extentSize = viewPort.getExtentSize();
+ final JComponent content = scrolledNode.getContent();
+ Point contentLocation = new Point();
+ UITools.convertPointToAncestor(content, contentLocation, map);
+ final Rectangle rect = new Rectangle(contentLocation.x + content.getWidth() / 2 - extentSize.width / 2,
+ contentLocation.y + content.getHeight() / 2 - extentSize.height
+ / 2, extentSize.width, extentSize.height);
+
+ if(scrollingDirective == ScrollingDirective.SCROLL_TO_BEST_ROOT_POSITION){
+ final Rectangle innerBounds = map.getInnerBounds();
+ if(innerBounds.width <= extentSize.width && map.getModeController().shouldCenterCompactMaps()){
+ rect.x = innerBounds.x - (extentSize.width - innerBounds.width) / 2;
+ }
+ else {
+ NodeView root = map.getRoot();
+ if(!map.isOutlineLayoutSet()) {
+ boolean scrollToTheLeft = false;
+
+ final List<NodeModel> children = root.getModel().getChildren();
+ if(! children.isEmpty()){
+ scrollToTheLeft = true;
+ final boolean outlineLayoutSet = map.isOutlineLayoutSet();
+ for(NodeModel node :children) {
+ if(! outlineLayoutSet && node.isLeft()){
+ scrollToTheLeft = false;
+ break;
+ }
+ }
+ }
+ if(scrollToTheLeft)
+ rect.x += (extentSize.width - content.getWidth()) / 2 - 10;
+ }
+ }
+ }
+ return rect;
+ }
+
+ private void scrollNodeNow(boolean slowScroll) {
+ final JViewport viewPort = (JViewport) map.getParent();
+ if(slowScroll)
+ viewPort.putClientProperty(ViewController.SLOW_SCROLLING, 20);
+ final Rectangle rect = calculateOptimalVisibleRectangle();
+ map.scrollRectToVisible(rect);
+ scrolledNode = null;
+ scrollingDirective = ScrollingDirective.DONE;
+ this.slowScroll = false;
+ if(! anchor.equals(map.getRoot()))
+ this.anchor = map.getRoot();
+ this.anchorContentLocation = getAnchorCenterPoint();
+ }
+
+ void setAnchorView(final NodeView view) {
+ anchor = view;
+ }
+
+ private Point getAnchorCenterPoint() {
+ if (! map.isDisplayable()) {
+ return new Point();
+ }
+ final MainView mainView = anchor.getMainView();
+ final int mainViewWidth = mainView.getWidth();
+ final int mainViewHeight = mainView.getHeight();
+ final Point anchorCenterPoint = new Point((int) (mainViewWidth * anchorHorizontalPoint), (int) (mainViewHeight * anchorVerticalPoint));
+ final JViewport viewPort = (JViewport) map.getParent();
+ UITools.convertPointToAncestor(mainView, anchorCenterPoint, map);
+ final Dimension extentSize = viewPort.getExtentSize();
+ anchorCenterPoint.x += (extentSize.width - viewPort.getWidth()) / 2;
+ anchorCenterPoint.y += (extentSize.height - viewPort.getHeight()) / 2;
+ return anchorCenterPoint;
+ }
+
+ public void scrollNodeToVisible(final NodeView node) {
+ scrollNodeToVisible(node, 0);
+ }
+
+ private void scrollNodeToVisible(final NodeView node, final int extraWidth) {
+ if(scrollingDirective == ScrollingDirective.DONE || scrollingDirective == ScrollingDirective.ANCHOR)
+ scrollingDirective = ScrollingDirective.MAKE_NODE_VISIBLE;
+ if (scrolledNode != null && scrollingDirective != ScrollingDirective.MAKE_NODE_VISIBLE) {
+ if (node != scrolledNode) {
+ if (scrollingDirective == ScrollingDirective.SCROLL_TO_BEST_ROOT_POSITION && !node.isRoot())
+ scrollingDirective = ScrollingDirective.SCROLL_NODE_TO_CENTER;
+ scrollNode(node, scrollingDirective, false);
+ }
+ return;
+ }
+ if (!map.isValid()) {
+ scrolledNode = node;
+ scrollingDirective = ScrollingDirective.MAKE_NODE_VISIBLE;
+ this.extraWidth = extraWidth;
+ return;
+ }
+ final int HORIZ_SPACE = 10;
+ final int HORIZ_SPACE2 = 20;
+ final int VERT_SPACE = 5;
+ final int VERT_SPACE2 = 10;
+ final JComponent nodeContent = node.getContent();
+ int width = nodeContent.getWidth();
+ if (extraWidth < 0) {
+ width -= extraWidth;
+ nodeContent.scrollRectToVisible(new Rectangle(-HORIZ_SPACE + extraWidth, -VERT_SPACE, width + HORIZ_SPACE2,
+ nodeContent.getHeight() + VERT_SPACE2));
+ }
+ else {
+ width += extraWidth;
+ nodeContent.scrollRectToVisible(new Rectangle(-HORIZ_SPACE, -VERT_SPACE, width + HORIZ_SPACE2, nodeContent
+ .getHeight()
+ + VERT_SPACE2));
+ }
+ }
+
+ void scrollToRootNode() {
+ scrollNode(map.getRoot(), ScrollingDirective.SCROLL_TO_BEST_ROOT_POSITION, false);
+ }
+
+ void scrollView() {
+ if(scrolledNode != null && scrollingDirective != ScrollingDirective.MAKE_NODE_VISIBLE
+ && scrollingDirective != ScrollingDirective.ANCHOR){
+ scrollNode(scrolledNode, scrollingDirective, slowScroll);
+ return;
+ }
+ if (anchorContentLocation.getX() == 0 && anchorContentLocation.getY() == 0) {
+ return;
+ }
+ final JViewport vp = (JViewport) map.getParent();
+ final int scrollMode = vp.getScrollMode();
+ vp.setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
+ final Point viewPosition = vp.getViewPosition();
+ final Point oldAnchorContentLocation = anchorContentLocation;
+ final Point newAnchorContentLocation = getAnchorCenterPoint();
+ final int deltaX = newAnchorContentLocation.x - oldAnchorContentLocation.x;
+ final int deltaY = newAnchorContentLocation.y - oldAnchorContentLocation.y;
+ if (deltaX != 0 || deltaY != 0) {
+ viewPosition.x += deltaX;
+ viewPosition.y += deltaY;
+ vp.setViewPosition(viewPosition);
+ }
+ else {
+ map.repaintVisible();
+ }
+// if (scrolledNode == null){
+// scrolledNode = map.getSelected();
+// scrollingDirective = ScrollingDirective.MAKE_NODE_VISIBLE;
+// }
+ if(scrolledNode != null)
+ scrollNodeToVisible(scrolledNode, extraWidth);
+ vp.setScrollMode(scrollMode);
+ scrolledNode = null;
+ scrollingDirective = ScrollingDirective.DONE;
+ setAnchorView(map.getRoot());
+ anchorHorizontalPoint = anchorVerticalPoint = 0;
+ this.anchorContentLocation = getAnchorCenterPoint();
+ }
+
+ void setAnchorContentLocation(){
+ anchorContentLocation = getAnchorCenterPoint();
+ }
+
+ public void scrollNodeTreeToVisible(NodeView node) {
+ final Rectangle visibleRect = map.getVisibleRect();
+ Rectangle requiredRectangle = new Rectangle(node.getSize());
+ int margin = 30;
+ int spaceToCut = node.getSpaceAround() - margin;
+ requiredRectangle.x += spaceToCut;
+ requiredRectangle.y += spaceToCut;
+ requiredRectangle.width -= 2*spaceToCut;
+ requiredRectangle.height -= 2*spaceToCut;
+ final Rectangle contentBounds = node.getContent().getBounds();
+ int lackingWidth = requiredRectangle.width - visibleRect.width;
+ if(lackingWidth > 0){
+ int leftGap = contentBounds.x - requiredRectangle.x - margin;
+ int rightGap = requiredRectangle.x + requiredRectangle. width - contentBounds.x - contentBounds.width - margin;
+ requiredRectangle.width = visibleRect.width;
+ requiredRectangle.x += lackingWidth * leftGap / (leftGap + rightGap);
+ }
+ int lackingHeight = requiredRectangle.height - visibleRect.height;
+ if(lackingHeight > 0){
+ int topGap = contentBounds.y - requiredRectangle.y - margin;
+ int bottomGap = requiredRectangle.y + requiredRectangle. height - contentBounds.y - contentBounds.height - margin;
+ requiredRectangle.height = visibleRect.height;
+ requiredRectangle.y += lackingHeight * topGap / (topGap + bottomGap);
+ }
+ if(! node.getVisibleRect().contains(requiredRectangle)){
+ node.scrollRectToVisible(requiredRectangle);
+ }
+ }
+
+ void anchorToRoot() {
+ final NodeView root = map.getRoot();
+ if(! root.equals(anchor))
+ anchorToNode(root, 0, 0);
+ }
+
+}
+
+enum ScrollingDirective {SCROLL_NODE_TO_CENTER, SCROLL_TO_BEST_ROOT_POSITION, MAKE_NODE_VISIBLE, DONE, ANCHOR}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/MapView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/MapView.java
new file mode 100644
index 0000000..6c53814
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/MapView.java
@@ -0,0 +1,2066 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.AWTKeyStroke;
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Font;
+import java.awt.Frame;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.KeyboardFocusManager;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Stroke;
+import java.awt.dnd.Autoscroll;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.print.PageFormat;
+import java.awt.print.Printable;
+import java.io.FileNotFoundException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.AbstractList;
+import java.util.AbstractSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.Vector;
+
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JViewport;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.io.xml.TreeXmlReader;
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.ModelessAttributeController;
+import org.freeplane.features.filter.Filter;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.ConnectorModel.Shape;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinkModel;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.INodeView;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.print.FitMap;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.view.swing.features.filepreview.IViewerFactory;
+import org.freeplane.view.swing.features.filepreview.ImageLoadingListener;
+import org.freeplane.view.swing.features.filepreview.ScalableComponent;
+import org.freeplane.view.swing.features.filepreview.ViewerController;
+import org.freeplane.view.swing.map.link.ConnectorView;
+import org.freeplane.view.swing.map.link.EdgeLinkView;
+import org.freeplane.view.swing.map.link.ILinkView;
+
+/**
+ * This class represents the view of a whole MindMap (in analogy to class
+ * JTree).
+ */
+public class MapView extends JPanel implements Printable, Autoscroll, IMapChangeListener, IFreeplanePropertyListener {
+
+ private final MapScroller mapScroller;
+ private MapViewLayout layoutType;
+
+ public MapViewLayout getLayoutType() {
+ return layoutType;
+ }
+
+ protected void setLayoutType(final MapViewLayout layoutType) {
+ this.layoutType = layoutType;
+ }
+
+ private boolean showNotes;
+
+ boolean showNotes() {
+ return showNotes;
+ }
+
+ private void setShowNotes() {
+ final boolean showNotes= NoteController.getController(getModeController()).showNotesInMap(getModel());
+ if(this.showNotes == showNotes){
+ return;
+ }
+ this.showNotes = showNotes;
+ getRoot().updateAll();
+ }
+
+ private PaintingMode paintingMode = null;
+
+ private class MapSelection implements IMapSelection {
+ public void centerNode(final NodeModel node) {
+ final NodeView nodeView = getNodeView(node);
+ if (nodeView != null) {
+ mapScroller.scrollNode(nodeView, ScrollingDirective.SCROLL_NODE_TO_CENTER, false);
+ }
+ }
+
+ public NodeModel getSelected() {
+ final NodeView selected = MapView.this.getSelected();
+ return selected.getModel();
+ }
+
+ public Set<NodeModel> getSelection() {
+ return MapView.this.getSelectedNodes();
+ }
+
+
+ public List<NodeModel> getOrderedSelection() {
+ return MapView.this.getOrderedSelectedNodes();
+ }
+ public List<NodeModel> getSortedSelection(final boolean differentSubtrees) {
+ return MapView.this.getSelectedNodesSortedByY(differentSubtrees);
+ }
+
+ public boolean isSelected(final NodeModel node) {
+ if (! getModel().equals(node.getMap()))
+ return false;
+ final NodeView nodeView = getNodeView(node);
+ return nodeView != null && MapView.this.isSelected(nodeView);
+ }
+
+ public void keepNodePosition(final NodeModel node, final float horizontalPoint, final float verticalPoint) {
+ mapScroller.anchorToNode(getNodeView(node), horizontalPoint, verticalPoint);
+ }
+
+ public void scrollNodeTreeToVisible(final NodeModel node) {
+ final NodeView nodeView = getNodeView(node);
+ if(nodeView != null)
+ mapScroller.scrollNodeTreeToVisible(nodeView);
+ }
+
+
+ public void makeTheSelected(final NodeModel node) {
+ final NodeView nodeView = getNodeView(node);
+ if (nodeView != null) {
+ MapView.this.addSelected(nodeView, false);
+ }
+ }
+
+ public void scrollNodeToVisible(final NodeModel node) {
+ mapScroller.scrollNodeToVisible(getNodeView(node));
+ }
+
+ public void selectAsTheOnlyOneSelected(final NodeModel node) {
+ final NodeView nodeView = getNodeView(node);
+ if (nodeView != null) {
+ MapView.this.selectAsTheOnlyOneSelected(nodeView);
+ }
+ }
+
+ public void selectBranch(final NodeModel node, final boolean extend) {
+ if(! extend)
+ selectAsTheOnlyOneSelected(node);
+ MapView.this.addBranchToSelection(getNodeView(node));
+ }
+
+ public void selectContinuous(final NodeModel node) {
+ MapView.this.selectContinuous(getNodeView(node));
+ }
+
+ public void selectRoot() {
+ final NodeModel rootNode = getModel().getRootNode();
+ selectAsTheOnlyOneSelected(rootNode);
+ mapScroller.scrollToRootNode();
+ }
+
+ public void setSiblingMaxLevel(final int nodeLevel) {
+ MapView.this.setSiblingMaxLevel(nodeLevel);
+ }
+
+ public int size() {
+ return getSelection().size();
+ }
+
+ public void toggleSelected(final NodeModel node) {
+ MapView.this.toggleSelected(getNodeView(node));
+ }
+
+ public void replaceSelection(NodeModel[] nodes) {
+ if(nodes.length == 0)
+ return;
+ ArrayList<NodeView> views = new ArrayList<NodeView>(nodes.length);
+ for(NodeModel node : nodes) {
+ final NodeView nodeView = getNodeView(node);
+ if(nodeView != null)
+ views.add(nodeView);
+ }
+ MapView.this.replaceSelection(views.toArray(new NodeView[]{}));
+ }
+
+ }
+
+ private class Selection {
+ final private Set<NodeView> selectedSet = new LinkedHashSet<NodeView>();
+ final private List<NodeView> selectedList = new ArrayList<NodeView>();
+ private NodeView selectedNode = null;
+ private NodeView selectionStart = null;
+ private NodeView selectionEnd = null;
+
+ public Selection() {
+ };
+
+ private void select(final NodeView node) {
+ clear();
+ selectedSet.add(node);
+ selectedList.add(node);
+ selectedNode = node;
+ selectionEnd = selectionStart = node;
+ addSelectionForHooks(node);
+ node.repaintSelected();
+ }
+
+ private boolean add(final NodeView node) {
+ if(selectedNode == null){
+ select(node);
+ return true;
+ }
+ else{
+ if(selectedSet.add(node)){
+ selectedList.add(node);
+ node.repaintSelected();
+ return true;
+ }
+ return false;
+ }
+ }
+
+ private void addSelectionForHooks(final NodeView node) {
+ if(! isSelected())
+ return;
+ final ModeController modeController = getModeController();
+ final MapController mapController = modeController.getMapController();
+ final NodeModel model = node.getModel();
+ mapController.onSelect(model);
+ }
+
+ private void clear() {
+ if (selectedNode != null) {
+ removeSelectionForHooks(selectedNode);
+ selectedNode = null;
+ selectedSet.clear();
+ selectedList.clear();
+ selectionEnd = selectionStart = null;
+ }
+ }
+
+ private boolean contains(final NodeView node) {
+ return selectedSet.contains(node);
+ }
+
+ public Set<NodeView> getSelection() {
+ return Collections.unmodifiableSet(selectedSet);
+ }
+
+ private boolean deselect(final NodeView node) {
+ if(selectionStart == node)
+ selectionEnd = selectionStart = null;
+ else if (selectionEnd == node)
+ selectionEnd = selectionStart;
+ final boolean selectedChanged = selectedNode != null && selectedNode.equals(node);
+ if (selectedChanged) {
+ removeSelectionForHooks(node);
+ }
+ if (selectedSet.remove(node)){
+ final int last = selectedList.size() - 1;
+ if(selectedList.get(last) .equals(node))
+ selectedList.remove(last);
+ else
+ selectedList.remove(node);
+ node.repaintSelected();
+ if(selectedChanged) {
+ if (size() > 0) {
+ selectedNode = selectedSet.iterator().next();
+ addSelectionForHooks(selectedNode);
+ }
+ else{
+ selectedNode = null;
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ private void removeSelectionForHooks(final NodeView node) {
+ if (node.getModel() == null || ! isSelected()) {
+ return;
+ }
+ getModeController().getMapController().onDeselect(node.getModel());
+ }
+
+ private int size() {
+ return selectedSet.size();
+ }
+
+ private void replace(NodeView[] newSelection) {
+ if(newSelection.length == 0)
+ return;
+ final boolean selectedChanges = ! newSelection[0].equals(selectedNode);
+ if (selectedChanges) {
+ if(selectedNode != null)
+ removeSelectionForHooks(selectedNode);
+ selectedNode = newSelection[0];
+ }
+ for(NodeView view : newSelection)
+ if (!selectedSet.contains(view))
+ view.repaintSelected();
+ final NodeView[] oldSelection = selectedSet.toArray(new NodeView[selectedSet.size()]);
+ selectedSet.clear();
+ selectedList.clear();
+ for(NodeView view : newSelection)
+ if (selectedSet.add(view))
+ selectedList.add(view);
+ if(!selectedSet.contains(selectionStart))
+ selectionEnd = selectionStart = selectedNode;
+ else if (!selectedSet.contains(selectionEnd))
+ selectionEnd = selectionStart;
+
+ if (selectedChanges) {
+ addSelectionForHooks(selectedNode);
+ }
+ for(NodeView view : oldSelection)
+ if (!selectedSet.contains(view))
+ view.repaintSelected();
+ }
+
+ public NodeView[] toArray() {
+ return selectedList.toArray(new NodeView[selectedList.size()]);
+ }
+
+ private List<NodeView> getSelectedList() {
+ return selectedList;
+ }
+
+ private Set<NodeView> getSelectedSet() {
+ return selectedSet;
+ }
+
+ public NodeView getSelectionStart() {
+ return selectionStart;
+ }
+
+ public void setSelectionStart(NodeView node) {
+ selectionEnd = selectionStart = node;
+ }
+ public NodeView getSelectionEnd() {
+ return selectionEnd;
+ }
+
+ public void setSelectionEnd(NodeView selectionEnd) {
+ this.selectionEnd = selectionEnd;
+ }
+
+ }
+
+ private static final int margin = 20;
+ static boolean printOnWhiteBackground;
+ static private IFreeplanePropertyListener propertyChangeListener;
+ public static final String RESOURCES_SELECTED_NODE_COLOR = "standardselectednodecolor";
+ public static final String RESOURCES_SELECTED_NODE_RECTANGLE_COLOR = "standardselectednoderectanglecolor";
+ private static final String PRESENTATION_DIMMER_TRANSPARENCY = "presentation_dimmer_transparency";
+ private static final String PRESENTATION_MODE_ENABLED = "presentation_mode";
+
+ private static final long serialVersionUID = 1L;
+ static boolean standardDrawRectangleForSelection;
+ static Color standardSelectColor;
+ private static Stroke standardSelectionStroke;
+ static Color standardSelectRectangleColor;
+ /** Used to identify a right click onto a link curve. */
+ private Vector<ILinkView> arrowLinkViews;
+ private Color background = null;
+ private JComponent backgroundComponent;
+ private Rectangle boundingRectangle = null;
+ private boolean disableMoveCursor = true;
+ private FitMap fitMap = FitMap.USER_DEFINED;
+ private boolean isPreparedForPrinting = false;
+ private boolean isPrinting = false;
+ private final ModeController modeController;
+ final private MapModel model;
+
+ private NodeView rootView = null;
+ private boolean selectedsValid = true;
+ final private Selection selection = new Selection();
+ private int siblingMaxLevel;
+ private float zoom = 1F;
+ private Font noteFont;
+ private Font detailFont;
+ private int detailHorizontalAlignment;
+ private Color detailForeground;
+ private Color detailBackground;
+ private int noteHorizontalAlignment;
+ private Color noteForeground;
+ private Color noteBackground;
+ private static boolean presentationModeEnabled;
+ private boolean fitToViewport;
+ private static int transparency;
+ final private ComponentAdapter backgroundImageResizer;
+ private INodeChangeListener connectorChangeListener;
+
+ public MapView(final MapModel model, final ModeController modeController) {
+ super();
+ this.model = model;
+ this.modeController = modeController;
+ mapScroller = new MapScroller(this);
+ final String name = model.getTitle();
+ setName(name);
+ if (MapView.standardSelectColor == null) {
+ final String stdcolor = ResourceController.getResourceController().getProperty(
+ MapView.RESOURCES_SELECTED_NODE_COLOR);
+ MapView.standardSelectColor = ColorUtils.stringToColor(stdcolor);
+ final String stdtextcolor = ResourceController.getResourceController().getProperty(
+ MapView.RESOURCES_SELECTED_NODE_RECTANGLE_COLOR);
+ MapView.standardSelectRectangleColor = ColorUtils.stringToColor(stdtextcolor);
+ final String drawCircle = ResourceController.getResourceController().getProperty(
+ ResourceController.RESOURCE_DRAW_RECTANGLE_FOR_SELECTION);
+ MapView.standardDrawRectangleForSelection = TreeXmlReader.xmlToBoolean(drawCircle);
+ final String printOnWhite = ResourceController.getResourceController()
+ .getProperty("printonwhitebackground");
+ MapView.printOnWhiteBackground = TreeXmlReader.xmlToBoolean(printOnWhite);
+ MapView.transparency = 255 - ResourceController.getResourceController().getIntProperty(PRESENTATION_DIMMER_TRANSPARENCY, 0x70);
+ MapView.presentationModeEnabled = ResourceController.getResourceController().getBooleanProperty(PRESENTATION_MODE_ENABLED);
+
+ createPropertyChangeListener();
+ }
+ this.setAutoscrolls(true);
+ this.setLayout(new MindMapLayout());
+ final NoteController noteController = NoteController.getController(getModeController());
+ showNotes= noteController != null && noteController.showNotesInMap(getModel());
+ updateContentStyle();
+ initRoot();
+ setBackground(requiredBackground());
+ final MapStyleModel mapStyleModel = MapStyleModel.getExtension(model);
+ zoom = mapStyleModel.getZoom();
+ layoutType = mapStyleModel.getMapViewLayout();
+ final IUserInputListenerFactory userInputListenerFactory = getModeController().getUserInputListenerFactory();
+ addMouseListener(userInputListenerFactory.getMapMouseListener());
+ addMouseMotionListener(userInputListenerFactory.getMapMouseListener());
+ addMouseWheelListener(userInputListenerFactory.getMapMouseWheelListener());
+ setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, emptyNodeViewSet());
+ setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, emptyNodeViewSet());
+ setFocusTraversalKeys(KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS, emptyNodeViewSet());
+ disableMoveCursor = ResourceController.getResourceController().getBooleanProperty("disable_cursor_move_paper");
+ backgroundImageResizer = new ComponentAdapter() {
+ public void componentResized(ComponentEvent e) {
+ if (fitToViewport) {
+ adjustBackgroundComponentScale();
+ repaint();
+ }
+ }
+ };
+ addComponentListener(backgroundImageResizer);
+ final String fitToViewportAsString = MapStyle.getController(modeController).getPropertySetDefault(model,
+ MapStyle.FIT_TO_VIEWPORT);
+ fitToViewport = Boolean.parseBoolean(fitToViewportAsString);
+ loadBackgroundImage();
+ connectorChangeListener = new INodeChangeListener() {
+ public void nodeChanged(NodeChangeEvent event) {
+ if(NodeLinks.CONNECTOR.equals(event.getProperty()) &&
+ event.getNode().getMap().equals(getModel()))
+ repaint();
+ }
+ };
+ }
+
+ public void replaceSelection(NodeView[] views) {
+ selection.replace(views);
+ if(views.length > 0)
+ views[0].requestFocusInWindow();
+ }
+
+ // generics trickery
+ private Set<AWTKeyStroke> emptyNodeViewSet() {
+ return Collections.emptySet();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.dnd.Autoscroll#autoscroll(java.awt.Point)
+ */
+ public void autoscroll(final Point cursorLocn) {
+ final Rectangle r = new Rectangle((int) cursorLocn.getX() - MapView.margin, (int) cursorLocn.getY()
+ - MapView.margin, 1 + 2 * MapView.margin, 1 + 2 * MapView.margin);
+ scrollRectToVisible(r);
+ }
+
+ boolean frameLayoutCompleted() {
+ final Frame frame = JOptionPane.getFrameForComponent(this);
+ final Insets frameInsets = frame.getInsets();
+ final Component rootPane = frame.getComponent(0);
+ final boolean frameLayoutCompleted = rootPane.getWidth() == frame.getWidth() - frameInsets.left - frameInsets.right
+ && rootPane.getHeight() == frame.getHeight() - frameInsets.top - frameInsets.bottom;
+ return frameLayoutCompleted;
+ }
+
+
+ @Override
+ public void addNotify() {
+ super.addNotify();
+ modeController.getMapController().addNodeChangeListener(connectorChangeListener);
+ getParent().addComponentListener(backgroundImageResizer);
+ adjustViewportScrollMode();
+ }
+
+ private void adjustViewportScrollMode() {
+ if(fitToViewport && backgroundComponent != null)
+ ((JViewport) getParent()).setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
+ else
+ ((JViewport) getParent()).setScrollMode(JViewport.BLIT_SCROLL_MODE);
+ }
+
+
+ @Override
+ public void removeNotify() {
+ modeController.getMapController().removeNodeChangeListener(connectorChangeListener);
+ getParent().removeComponentListener(backgroundImageResizer);
+ super.removeNotify();
+ }
+
+ boolean isLayoutCompleted() {
+ final JViewport viewPort = (JViewport) getParent();
+ final Dimension visibleDimension = viewPort.getExtentSize();
+ return visibleDimension.width > 0;
+ }
+
+ static private void createPropertyChangeListener() {
+ MapView.propertyChangeListener = new IFreeplanePropertyListener() {
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ final Component mapView = Controller.getCurrentController().getMapViewManager().getMapViewComponent();
+ if (!(mapView instanceof MapView)) {
+ return;
+ }
+ if (propertyName.equals(RESOURCES_SELECTED_NODE_COLOR)) {
+ MapView.standardSelectColor = ColorUtils.stringToColor(newValue);
+ ((MapView) mapView).repaintSelecteds();
+ return;
+ }
+ if (propertyName.equals(RESOURCES_SELECTED_NODE_RECTANGLE_COLOR)) {
+ MapView.standardSelectRectangleColor = ColorUtils.stringToColor(newValue);
+ ((MapView) mapView).repaintSelecteds();
+ return;
+ }
+ if (propertyName.equals(ResourceController.RESOURCE_DRAW_RECTANGLE_FOR_SELECTION)) {
+ MapView.standardDrawRectangleForSelection = TreeXmlReader.xmlToBoolean(newValue);
+ ((MapView) mapView).repaintSelecteds();
+ return;
+ }
+ if (propertyName.equals("printonwhitebackground")) {
+ MapView.printOnWhiteBackground = TreeXmlReader.xmlToBoolean(newValue);
+ return;
+ }
+ if (propertyName.equals(PRESENTATION_DIMMER_TRANSPARENCY)) {
+ MapView.transparency = 255 - ResourceController.getResourceController().getIntProperty(PRESENTATION_DIMMER_TRANSPARENCY, 0x70);
+ ((MapView) mapView).repaint();
+ return;
+ }
+ if (propertyName.equals(PRESENTATION_MODE_ENABLED)) {
+ MapView.presentationModeEnabled = ResourceController.getResourceController().getBooleanProperty(PRESENTATION_MODE_ENABLED);
+ ((MapView) mapView).repaint();
+ return;
+ }
+ }
+ };
+ ResourceController.getResourceController().addPropertyChangeListener(MapView.propertyChangeListener);
+ }
+
+ public void deselect(final NodeView newSelected) {
+ if (selection.contains(newSelected) && selection.deselect(newSelected)) {
+ newSelected.repaintSelected();
+ }
+ }
+
+ public Object detectCollision(final Point p) {
+ if (arrowLinkViews == null) {
+ return null;
+ }
+ for (int i = 0; i < arrowLinkViews.size(); ++i) {
+ final ILinkView arrowView = arrowLinkViews.get(i);
+ if (arrowView.detectCollision(p, true)) {
+ return arrowView.getModel();
+ }
+ }
+ for (int i = 0; i < arrowLinkViews.size(); ++i) {
+ final ILinkView arrowView = arrowLinkViews.get(i);
+ if (arrowView.detectCollision(p, false)) {
+ return arrowView.getModel();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Call preparePrinting() before printing and endPrinting() after printing
+ * to minimize calculation efforts
+ */
+ public void endPrinting() {
+ if (!isPreparedForPrinting)
+ return;
+ isPreparedForPrinting = false;
+ isPrinting = false;
+ if (zoom == 1f) {
+ getRoot().updateAll();
+ synchronized (getTreeLock()) {
+ validateTree();
+ }
+ }
+ if (MapView.printOnWhiteBackground) {
+ setBackground(background);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.dnd.Autoscroll#getAutoscrollInsets()
+ */
+ public Insets getAutoscrollInsets() {
+ final Container parent = getParent();
+ if (parent == null) {
+ return new Insets(0, 0, 0, 0);
+ }
+ final Rectangle outer = getBounds();
+ final Rectangle inner = parent.getBounds();
+ return new Insets(inner.y - outer.y + MapView.margin, inner.x - outer.x + MapView.margin, outer.height
+ - inner.height - inner.y + outer.y + MapView.margin, outer.width - inner.width - inner.x + outer.x
+ + MapView.margin);
+ }
+
+ public Rectangle getInnerBounds() {
+ final Rectangle innerBounds = rootView.getBounds();
+ final Rectangle maxBounds = new Rectangle(0, 0, getWidth(), getHeight());
+ if(arrowLinkViews != null)
+ for (int i = 0; i < arrowLinkViews.size(); ++i) {
+ final ILinkView arrowView = arrowLinkViews.get(i);
+ arrowView.increaseBounds(innerBounds);
+ }
+ return innerBounds.intersection(maxBounds);
+ }
+
+ public IMapSelection getMapSelection() {
+ return new MapSelection();
+ }
+
+ public ModeController getModeController() {
+ return modeController;
+ }
+
+ public MapModel getModel() {
+ return model;
+ }
+
+ public Point getNodeContentLocation(final NodeView nodeView) {
+ final Point contentXY = new Point(0, 0);
+ UITools.convertPointToAncestor(nodeView.getContent(), contentXY, this);
+ return contentXY;
+ }
+
+ private NodeView getNodeView(Object o) {
+ if(! (o instanceof NodeModel))
+ return null;
+ final NodeView nodeView = getNodeView((NodeModel)o);
+ return nodeView;
+ }
+
+ public NodeView getNodeView(final NodeModel node) {
+ if (node == null) {
+ return null;
+ }
+ for (INodeView iNodeView : node.getViewers()) {
+ if(! (iNodeView instanceof NodeView)){
+ continue;
+ }
+ final NodeView candidateView = (NodeView) iNodeView;
+ if (candidateView.getMap() == this) {
+ return candidateView;
+ }
+ }
+ NodeView root = getRoot();
+ if(root.getModel().equals(node))
+ return root;
+ else
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.JComponent#getPreferredSize()
+ */
+ @Override
+ public Dimension getPreferredSize() {
+ return getLayout().preferredLayoutSize(this);
+ }
+
+ public NodeView getRoot() {
+ return rootView;
+ }
+
+ public NodeView getSelected() {
+ if(! selectedsValid) {
+ NodeView node = selection.selectedNode;
+ if (node == null || ! SwingUtilities.isDescendingFrom(node, this))
+ validateSelecteds();
+ else {
+ final JComponent content = node.getContent();
+ if (content == null || ! content.isVisible())
+ validateSelecteds();
+ }
+ }
+ return selection.selectedNode;
+ }
+
+ public Set<NodeModel> getSelectedNodes() {
+ validateSelecteds();
+ return new AbstractSet<NodeModel>() {
+
+ @Override
+ public int size() {
+ return selection.size();
+ }
+
+ @Override
+ public boolean contains(Object o) {
+ final NodeView nodeView = getNodeView(o);
+ if(nodeView == null)
+ return false;
+ return selection.contains(nodeView);
+ }
+
+ @Override
+ public boolean add(NodeModel o) {
+ final NodeView nodeView = getNodeView(o);
+ if(nodeView == null)
+ return false;
+ return selection.add(nodeView);
+ }
+
+ @Override
+ public boolean remove(Object o) {
+ final NodeView nodeView = getNodeView(o);
+ if(nodeView == null)
+ return false;
+ return selection.deselect(nodeView);
+ }
+
+ @Override
+ public Iterator<NodeModel> iterator() {
+ return new Iterator<NodeModel>() {
+ final Iterator<NodeView> i = selection.getSelectedSet().iterator();
+
+ public boolean hasNext() {
+ return i.hasNext();
+ }
+
+ public NodeModel next() {
+ return i.next().getModel();
+ }
+
+ public void remove() {
+ i.remove();
+ }
+
+ };
+ }
+ };
+ }
+
+ public List<NodeModel> getOrderedSelectedNodes() {
+ validateSelecteds();
+ return new AbstractList<NodeModel>(){
+
+ @Override
+ public boolean add(NodeModel o) {
+ final NodeView nodeView = getNodeView(o);
+ if(nodeView == null)
+ return false;
+ return selection.add(nodeView);
+ }
+
+
+
+ @Override
+ public boolean contains(Object o) {
+ final NodeView nodeView = getNodeView(o);
+ if(nodeView == null)
+ return false;
+ return selection.contains(nodeView);
+ }
+
+
+
+ @Override
+ public boolean remove(Object o) {
+ final NodeView nodeView = getNodeView(o);
+ if(nodeView == null)
+ return false;
+ return selection.deselect(nodeView);
+ }
+
+ @Override
+ public NodeModel get(int index) {
+ return selection.getSelectedList().get(index).getModel();
+ }
+
+ @Override
+ public int size() {
+ return selection.size();
+ }
+ };
+ }
+
+ /**
+ * @param differentSubtrees
+ * @return an ArrayList of MindMapNode objects. If both ancestor and
+ * descandant node are selected, only the ancestor ist returned
+ */
+ ArrayList<NodeModel> getSelectedNodesSortedByY(final boolean differentSubtrees) {
+ validateSelecteds();
+ final TreeMap<Integer, LinkedList<NodeModel>> sortedNodes = new TreeMap<Integer, LinkedList<NodeModel>>();
+ for (final NodeView view : selection.getSelectedSet()) {
+ if (differentSubtrees) {
+ if(viewBelongsToSelectedSubtreeOrItsClone(view))
+ continue;
+ }
+ final Point point = new Point();
+ UITools.convertPointToAncestor(view.getParent(), point, this);
+ final NodeModel node = view.getModel();
+ if(node.getParentNode() != null){
+ point.y += node.getParentNode().getIndex(node);
+ }
+ LinkedList<NodeModel> nodeList = sortedNodes.get(point.y);
+ if (nodeList == null) {
+ nodeList = new LinkedList<NodeModel>();
+ sortedNodes.put(point.y, nodeList);
+ }
+ nodeList.add(node);
+ }
+ final ArrayList<NodeModel> selectedNodes = new ArrayList<NodeModel>();
+ for (final LinkedList<NodeModel> nodeList : sortedNodes.values()) {
+ ADD_NODES: for (final NodeModel nodeModel : nodeList) {
+ if(differentSubtrees){
+ final NodeModel parentNode = nodeModel.getParentNode();
+ if(parentNode != null){
+ final int index = parentNode.getIndex(nodeModel);
+ for(NodeModel parentClone : parentNode.subtreeClones())
+ if(selectedNodes.contains(parentClone.getChildAt(index)))
+ continue ADD_NODES;
+ }
+
+ }
+ selectedNodes.add(nodeModel);
+ }
+ }
+ return selectedNodes;
+ }
+
+ private boolean viewBelongsToSelectedSubtreeOrItsClone(final NodeView view) {
+ HashSet<NodeModel> selectedNodesWithClones = new HashSet<NodeModel>();
+ for (NodeView selectedView : selection.getSelectedList())
+ for(NodeModel clone : selectedView.getModel().subtreeClones())
+ selectedNodesWithClones.add(clone);
+
+ for (Component parent = view.getParent(); parent instanceof NodeView; parent = parent.getParent()) {
+ if (selectedNodesWithClones.contains(((NodeView)parent).getModel())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @return
+ */
+ public Collection<NodeView> getSelection() {
+ validateSelecteds();
+ return selection.getSelection();
+ }
+
+ public int getSiblingMaxLevel() {
+ return siblingMaxLevel;
+ }
+
+ /**
+ * Returns the size of the visible part of the view in view coordinates.
+ */
+ public Dimension getViewportSize() {
+ final JViewport mapViewport = (JViewport) getParent();
+ return mapViewport == null ? null : mapViewport.getSize();
+ }
+
+ private NodeView getVisibleLeft(final NodeView oldSelected) {
+ NodeView newSelected = oldSelected;
+ final NodeModel oldModel = oldSelected.getModel();
+ if (oldModel.isRoot()) {
+ newSelected = oldSelected.getPreferredVisibleChild(isOutlineLayoutSet(), true);
+ }
+ else if (!oldSelected.isLeft()) {
+ newSelected = getVisibleSummarizedOrParentView(oldSelected);
+ }
+ else {
+ if (oldSelected.isFolded()) {
+ getModeController().getMapController().setFoldedAndScroll(oldModel, false);
+ return oldSelected;
+ }
+ newSelected = oldSelected.getPreferredVisibleChild(isOutlineLayoutSet(), true);
+ while (newSelected != null && !newSelected.getModel().hasVisibleContent()) {
+ newSelected = newSelected.getPreferredVisibleChild(isOutlineLayoutSet(), true);
+ }
+ if(newSelected == null)
+ newSelected = getVisibleSummaryView(oldSelected);
+ }
+ return newSelected;
+ }
+
+ boolean isOutlineLayoutSet() {
+ return layoutType.equals(MapViewLayout.OUTLINE);
+ }
+
+ protected NodeView getVisibleSummarizedOrParentView(final NodeView view) {
+ return view.getVisibleSummarizedOrParentView();
+ }
+
+ private NodeView getVisibleSummaryView(NodeView node) {
+ if(node.isRoot())
+ return null;
+ final int currentSummaryLevel = SummaryNode.getSummaryLevel(node.getModel());
+ int level = currentSummaryLevel;
+ final int requiredSummaryLevel = level + 1;
+ final NodeView parent = node.getParentView();
+ for (int i = 1 + getIndex(node);i < parent.getComponentCount();i++){
+ final Component component = parent.getComponent(i);
+ if(! (component instanceof NodeView))
+ break;
+ NodeView next = (NodeView) component;
+ if(next.isLeft() != node.isLeft())
+ continue;
+ if(next.isSummary())
+ level++;
+ else
+ level = 0;
+ if(level == requiredSummaryLevel){
+ if(next.getModel().hasVisibleContent())
+ return next;
+ final NodeView preferredVisibleChild = next.getPreferredVisibleChild(isOutlineLayoutSet(), next.isLeft());
+ if(preferredVisibleChild != null)
+ return preferredVisibleChild;
+ break;
+ }
+ if(level == currentSummaryLevel && SummaryNode.isFirstGroupNode(next.getModel()))
+ break;
+ }
+ return getVisibleSummaryView(parent);
+ }
+
+ int getIndex(NodeView node) {
+ final NodeView parent = node.getParentView();
+ for(int i = 0; i < parent.getComponentCount(); i++){
+ if(parent.getComponent(i).equals(node))
+ return i;
+ }
+ return -1;
+ }
+
+ private NodeView getVisibleRight(final NodeView oldSelected) {
+ NodeView newSelected = oldSelected;
+ final NodeModel oldModel = oldSelected.getModel();
+ if (oldModel.isRoot()) {
+ newSelected = oldSelected.getPreferredVisibleChild(isOutlineLayoutSet(), false);
+ }
+ else if (oldSelected.isLeft()) {
+ newSelected = getVisibleSummarizedOrParentView(oldSelected);
+ }
+ else {
+ if (oldSelected.isFolded()) {
+ getModeController().getMapController().setFoldedAndScroll(oldModel, false);
+ if(oldSelected.getModel().hasVisibleContent())
+ return oldSelected;
+ }
+ newSelected = oldSelected.getPreferredVisibleChild(isOutlineLayoutSet(), false);
+ while (newSelected != null && !newSelected.getModel().hasVisibleContent()) {
+ newSelected = newSelected.getPreferredVisibleChild(isOutlineLayoutSet(), false);
+ }
+ if(newSelected == null)
+ newSelected = getVisibleSummaryView(oldSelected);
+ }
+ return newSelected;
+ }
+
+ public float getZoom() {
+ return zoom;
+ }
+
+ public int getZoomed(final int number) {
+ return (int) Math.ceil(number * zoom);
+ }
+
+ public int getZoomed(double number) {
+ return (int) Math.ceil(number * zoom);
+ }
+
+
+ private void initRoot() {
+
+ rootView = NodeViewFactory.getInstance().newNodeView(getModel().getRootNode(), this, this, 0);
+ mapScroller.setAnchorView(rootView);
+ }
+
+ public boolean isPrinting() {
+ return isPrinting;
+ }
+
+ public boolean isSelected(final NodeView n) {
+ if(isPrinting || (! selectedsValid &&
+ (selection.selectedNode == null || ! SwingUtilities.isDescendingFrom(selection.selectedNode, this) || ! selection.selectedNode.getContent().isVisible())))
+ return false;
+ return selection.contains(n);
+ }
+
+ /**
+ * Add the node to the selection if it is not yet there, making it the
+ * focused selected node.
+ */
+ void addSelected(final NodeView newSelected, boolean scroll) {
+ selection.add(newSelected);
+ if(scroll)
+ mapScroller.scrollNodeToVisible(newSelected);
+ }
+
+ public void mapChanged(final MapChangeEvent event) {
+ final Object property = event.getProperty();
+ if (property.equals(MapStyle.RESOURCES_BACKGROUND_COLOR)) {
+ setBackground(requiredBackground());
+ return;
+ }
+ if (property.equals(MapStyle.MAP_STYLES)){
+ // set default font for notes:
+ updateContentStyle();
+ }
+ if (property.equals(MapStyle.MAP_STYLES) && event.getMap().equals(model)
+ || property.equals(ModelessAttributeController.ATTRIBUTE_VIEW_TYPE)
+ || property.equals(Filter.class)
+ || property.equals(UrlManager.MAP_URL)) {
+ setBackground(requiredBackground());
+ getRoot().updateAll();
+ return;
+ }
+ if(property.equals(AttributeController.SHOW_ICON_FOR_ATTRIBUTES)
+ ||property.equals(NoteController.SHOW_NOTE_ICONS))
+ updateStateIconsRecursively(getRoot());
+ if(property.equals(NoteController.SHOW_NOTES_IN_MAP))
+ setShowNotes();
+ if (property.equals(MapStyle.RESOURCES_BACKGROUND_IMAGE)) {
+ final String fitToViewportAsString = MapStyle.getController(modeController).getPropertySetDefault(model,
+ MapStyle.FIT_TO_VIEWPORT);
+ fitToViewport = Boolean.parseBoolean(fitToViewportAsString);
+ loadBackgroundImage();
+ adjustViewportScrollMode();
+ }
+ if (property.equals(MapStyle.FIT_TO_VIEWPORT)) {
+ final String fitToViewportAsString = MapStyle.getController(modeController).getPropertySetDefault(model,
+ MapStyle.FIT_TO_VIEWPORT);
+ fitToViewport = Boolean.parseBoolean(fitToViewportAsString);
+ adjustViewportScrollMode();
+ adjustBackgroundComponentScale();
+ repaint();
+ }
+ }
+
+ private void loadBackgroundImage() {
+ final MapStyle mapStyle = getModeController().getExtension(MapStyle.class);
+ final String uriString = mapStyle.getProperty(model, MapStyle.RESOURCES_BACKGROUND_IMAGE);
+ backgroundComponent = null;
+ if (uriString != null) {
+ URI uri = assignAbsoluteURI(uriString);
+ final ViewerController vc = getModeController().getExtension(ViewerController.class);
+ final IViewerFactory factory = vc.getCombiFactory();
+ if (uri != null) {
+ assignViewerToBackgroundComponent(factory, uri);
+ }
+ }
+ repaint();
+ }
+
+ private URI assignAbsoluteURI(final String uriString) {
+ final UrlManager urlManager = getModeController().getExtension(UrlManager.class);
+ URI uri = null;
+ try {
+ uri = urlManager.getAbsoluteUri(model, new URI(uriString));
+ }
+ catch (final URISyntaxException e) {
+ LogUtils.severe(e);
+ }
+ catch (MalformedURLException e) {
+ LogUtils.severe(e);
+ }
+ return uri;
+ }
+
+ private void assignViewerToBackgroundComponent(final IViewerFactory factory, final URI uri) {
+ try {
+ if (fitToViewport) {
+ final JViewport vp = (JViewport) getParent();
+ if(vp != null){
+ final Dimension viewPortSize = vp.getVisibleRect().getSize();
+ backgroundComponent = (JComponent) factory.createViewer(uri, viewPortSize);
+ }
+ else
+ backgroundComponent = (JComponent) factory.createViewer(uri, new Dimension(1,1));
+ }
+ else
+ backgroundComponent = (JComponent) factory.createViewer(uri, zoom);
+ ((ScalableComponent) backgroundComponent).setCenter(true);
+ ((ScalableComponent)backgroundComponent).setImageLoadingListener(new ImageLoadingListener() {
+ public void imageLoaded() {
+ repaint();
+ }
+ });
+ }
+ catch (final FileNotFoundException e1) {
+ LogUtils.warn(e1);
+ }
+ catch (final Exception e1) {
+ LogUtils.severe(e1);
+ }
+ }
+
+ private void updateStateIconsRecursively(NodeView node) {
+ final MainView mainView = node.getMainView();
+ if(mainView == null)
+ return;
+ mainView.updateIcons(node);
+ for(int i = 0; i < node.getComponentCount(); i++){
+ final Component component = node.getComponent(i);
+ if(component instanceof NodeView)
+ updateStateIconsRecursively((NodeView) component);
+ }
+ }
+
+ private void updateContentStyle() {
+ final NodeStyleController style = Controller.getCurrentModeController().getExtension(NodeStyleController.class);
+ MapModel map = getModel();
+ final MapStyleModel model = MapStyleModel.getExtension(map);
+ final NodeModel detailStyleNode = model.getStyleNodeSafe(MapStyleModel.DETAILS_STYLE);
+ detailFont = UITools.scale(style.getFont(detailStyleNode));
+ detailBackground = style.getBackgroundColor(detailStyleNode);
+ detailForeground = style.getColor(detailStyleNode);
+ detailHorizontalAlignment = style.getTextAlign(detailStyleNode).swingConstant;
+
+ final NodeModel noteStyleNode = model.getStyleNodeSafe(MapStyleModel.NOTE_STYLE);
+ noteFont = UITools.scale(style.getFont(noteStyleNode));
+ noteBackground = style.getBackgroundColor(noteStyleNode);
+ noteForeground = style.getColor(noteStyleNode);
+ noteHorizontalAlignment = style.getTextAlign(noteStyleNode).swingConstant;
+
+ }
+
+ public boolean selectLeft(boolean continious) {
+ NodeView selected = getSelected();
+ NodeView newSelected = getVisibleLeft(selected);
+ return selectRightOrLeft(newSelected, continious);
+ }
+
+ private boolean selectRightOrLeft(NodeView newSelected, boolean continious) {
+ if (newSelected == null) {
+ return false;
+ }
+ if(continious){
+ if(newSelected.isParentOf(getSelected())){
+ selectAsTheOnlyOneSelected(newSelected);
+ addBranchToSelection(newSelected);
+ }
+ else{
+ addBranchToSelection(getSelected());
+ }
+ }
+ else
+ selectAsTheOnlyOneSelected(newSelected);
+ return true;
+ }
+
+ public boolean selectRight(boolean continious) {
+ NodeView selected = getSelected();
+ NodeView newSelected = getVisibleRight(selected);
+ return selectRightOrLeft(newSelected, continious);
+ }
+
+
+ public boolean selectUp(boolean continious) {
+ return selectSibling(continious, false, false);
+ }
+
+ private boolean selectSibling(final boolean continious, final boolean page, final boolean down) {
+ final NodeView oldSelectionEnd = selection.getSelectionEnd();
+ if(oldSelectionEnd == null)
+ return false;
+ NodeView nextSelected = oldSelectionEnd;
+ {
+ final NodeView nextVisibleSibling = getNextVisibleSibling(nextSelected, down);
+ if (nextSelected == nextVisibleSibling)
+ return false;
+ nextSelected = nextVisibleSibling;
+ }
+ if(page){
+ NodeView sibling = nextSelected;
+ for(;;) {
+ sibling = getNextVisibleSibling(sibling, down);
+ final boolean noNextNodeFound = sibling == nextSelected;
+ if(noNextNodeFound
+ || sibling.getParentView() != nextSelected.getParentView()
+ || sibling.isSelected() && sibling.getParentView() != oldSelectionEnd.getParentView()
+ )
+ break;
+ nextSelected = sibling;
+ }
+ if(nextSelected.isSelected() && nextSelected.getParentView() == oldSelectionEnd.getParentView())
+ nextSelected = getNextVisibleSibling(nextSelected, down);
+ }
+ if(continious){
+ final NodeView selectionStart = selection.getSelectionStart();
+ selectAsTheOnlyOneSelected(selectionStart);
+ Boolean selectsDown = selectsDown(selectionStart, nextSelected);
+ if(selectsDown != null){
+ NodeView node = selectionStart;
+ do{
+ node = getNextVisibleSibling(node, selectsDown);
+ addSelected(node, false);
+ }while(node != nextSelected);
+ selection.setSelectionEnd(nextSelected);
+ mapScroller.scrollNodeToVisible(nextSelected);
+ }
+ }
+ else
+ selectAsTheOnlyOneSelected(nextSelected);
+ return true;
+ }
+
+ private Boolean selectsDown(NodeView first, NodeView second) {
+ if(first == second)
+ return null;
+ NodeView node = first;
+ for(boolean down : new boolean[]{true, false}){
+ for(;;){
+ final NodeView nextVisibleSibling = getNextVisibleSibling(node, down);
+ if(node == nextVisibleSibling)
+ break;
+ node = nextVisibleSibling;
+ if(node == second)
+ return down;
+ };
+ }
+ return null;
+ }
+
+ public NodeView getNextVisibleSibling(NodeView node, boolean down) {
+ return down ? node.getNextVisibleSibling() : node.getPreviousVisibleSibling();
+ }
+
+ public boolean selectDown(boolean continious) {
+ return selectSibling(continious, false, true);
+ }
+
+ public boolean selectPageDown(boolean continious) {
+ return selectSibling(continious, true, true);
+ }
+
+ public boolean selectPageUp(boolean continious) {
+ return selectSibling(continious, true, false);
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ /*****************************************************************
+ ** P A I N T I N G **
+ *****************************************************************/
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.JComponent#paint(java.awt.Graphics)
+ */
+ @Override
+ public void paint(final Graphics g) {
+ if (!isPrinting && isPreparedForPrinting){
+ isPreparedForPrinting = false;
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ endPrinting();
+ repaint();
+ }
+ });
+ return;
+ }
+
+ final Graphics2D g2 = (Graphics2D) g.create();
+ try {
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ Controller.getCurrentController().getMapViewManager().setTextRenderingHint(g2);
+ super.paint(g2);
+ }
+ finally {
+ this.paintingMode = null;
+ g2.dispose();
+ }
+ }
+
+ @Override
+ protected void paintComponent(final Graphics g) {
+ super.paintComponent(g);
+ if (backgroundComponent != null) {
+ paintBackgroundComponent(g);
+ }
+ }
+
+ private void paintBackgroundComponent(final Graphics g) {
+ Graphics backgroundGraphics = g.create();
+ try {
+ setBackgroundComponentLocation(backgroundGraphics);
+ backgroundComponent.paint(backgroundGraphics);
+ }
+ finally {
+ backgroundGraphics.dispose();
+ }
+ }
+
+ private void setBackgroundComponentLocation(Graphics g) {
+ if (fitToViewport) {
+ final JViewport vp = (JViewport) getParent();
+ final Point viewPosition = vp.getViewPosition();
+ g.translate(viewPosition.x, viewPosition.y);
+ }
+ else {
+ final Point centerPoint = getRootCenterPoint();
+ final Point backgroundImageTopLeft = getBackgroundImageTopLeft(centerPoint);
+ g.translate(backgroundImageTopLeft.x, backgroundImageTopLeft.y);
+ }
+ }
+
+ private Point getRootCenterPoint() {
+ final Point centerPoint = new Point(getRoot().getMainView().getWidth() / 2,
+ getRoot().getMainView().getHeight() / 2);
+ UITools.convertPointToAncestor(getRoot().getMainView(), centerPoint, this);
+ return centerPoint;
+ }
+
+ private Point getBackgroundImageTopLeft(Point centerPoint) {
+ int x = centerPoint.x - (backgroundComponent.getWidth() / 2);
+ int y = centerPoint.y - (backgroundComponent.getHeight() / 2);
+ return new Point(x, y);
+ }
+
+ @Override
+ protected void paintChildren(final Graphics g) {
+ final boolean paintLinksBehind = ResourceController.getResourceController().getBooleanProperty(
+ "paint_connectors_behind");
+ final PaintingMode paintModes[];
+ if(paintLinksBehind)
+ paintModes = new PaintingMode[]{
+ PaintingMode.CLOUDS,
+ PaintingMode.LINKS, PaintingMode.NODES, PaintingMode.SELECTED_NODES
+ };
+ else
+ paintModes = new PaintingMode[]{
+ PaintingMode.CLOUDS,
+ PaintingMode.NODES, PaintingMode.SELECTED_NODES, PaintingMode.LINKS
+ };
+ Graphics2D g2 = (Graphics2D) g;
+ paintChildren(g2, paintModes);
+ if(presentationModeEnabled)
+ paintDimmer(g2, paintModes);
+ paintSelecteds(g2);
+ highlightEditor(g2);
+ }
+
+ private void paintChildren(Graphics2D g2, final PaintingMode[] paintModes) {
+ for(PaintingMode paintingMode : paintModes){
+ this.paintingMode = paintingMode;
+ switch(paintingMode){
+ case LINKS:
+ paintLinks(g2);
+ break;
+ default:
+ super.paintChildren(g2);
+ }
+ }
+ };
+
+
+ private void paintDimmer(Graphics2D g2, PaintingMode[] paintModes) {
+ final Color color = g2.getColor();
+ try{
+ Color dimmer = new Color(0, 0, 0, transparency);
+ g2.setColor(dimmer);
+ g2.fillRect(0, 0, getWidth(), getHeight());
+ }
+ finally{
+ g2.setColor(color);
+ }
+ for (final NodeView selected : getSelection()) {
+ highlightSelected(g2, selected, paintModes);
+ }
+ }
+
+ private void highlightEditor(Graphics2D g2) {
+ final Component editor = getComponent(0);
+ if(editor instanceof NodeView)
+ return;
+ final java.awt.Shape oldClip = g2.getClip();
+ try{
+ g2.setClip(editor.getX(), editor.getY(), editor.getWidth(), editor.getHeight());
+ super.paintChildren(g2);
+ }
+ finally{
+ g2.setClip(oldClip);
+ }
+
+ }
+
+ protected PaintingMode getPaintingMode() {
+ return paintingMode;
+ }
+
+ private void paintLinks(final Collection<NodeLinkModel> links, final Graphics2D graphics,
+ final HashSet<ConnectorModel> alreadyPaintedLinks) {
+ final Font font = graphics.getFont();
+ try {
+ final Iterator<NodeLinkModel> linkIterator = links.iterator();
+ while (linkIterator.hasNext()) {
+ final NodeLinkModel next = linkIterator.next();
+ if (!(next instanceof ConnectorModel)) {
+ continue;
+ }
+ final ConnectorModel ref = (ConnectorModel) next;
+ if (alreadyPaintedLinks.add(ref)) {
+ final NodeModel target = ref.getTarget();
+ if (target == null) {
+ continue;
+ }
+ final NodeModel source = ref.getSource();
+ final NodeView sourceView = getNodeView(source);
+ final NodeView targetView = getNodeView(target);
+ final ILinkView arrowLink;
+ if (sourceView != null && targetView != null
+ && (Shape.EDGE_LIKE.equals(ref.getShape()) || sourceView.getMap().getLayoutType() == MapViewLayout.OUTLINE)
+ && source.hasVisibleContent() && target.hasVisibleContent()) {
+ arrowLink = new EdgeLinkView(ref, getModeController(), sourceView, targetView);
+ }
+ else {
+ arrowLink = new ConnectorView(ref, sourceView, targetView, getBackground());
+ }
+ arrowLink.paint(graphics);
+ arrowLinkViews.add(arrowLink);
+ }
+ }
+ }
+ finally {
+ graphics.setFont(font);
+ }
+ }
+
+ private void paintLinks(final Graphics2D graphics) {
+ arrowLinkViews = new Vector<ILinkView>();
+ final Object renderingHint = getModeController().getController().getMapViewManager().setEdgesRenderingHint(
+ graphics);
+ paintLinks(rootView, graphics, new HashSet<ConnectorModel>());
+ graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
+ }
+
+ private void paintLinks(final NodeView source, final Graphics2D graphics,
+ final HashSet<ConnectorModel> alreadyPaintedLinks) {
+ final LinkController linkController = LinkController.getController(getModeController());
+ final NodeModel node = source.getModel();
+ final Collection<NodeLinkModel> outLinks = linkController.getLinksFrom(node);
+ paintLinks(outLinks, graphics, alreadyPaintedLinks);
+ final Collection<NodeLinkModel> inLinks = linkController.getLinksTo(node);
+ paintLinks(inLinks, graphics, alreadyPaintedLinks);
+ final int nodeViewCount = source.getComponentCount();
+ for (int i = 0; i < nodeViewCount; i++) {
+ final Component component = source.getComponent(i);
+ if (!(component instanceof NodeView)) {
+ continue;
+ }
+ final NodeView child = (NodeView) component;
+ if (!isPrinting) {
+ final Rectangle bounds = SwingUtilities.convertRectangle(source, child.getBounds(), this);
+ final JViewport vp = (JViewport) getParent();
+ final Rectangle viewRect = vp.getViewRect();
+ viewRect.x -= viewRect.width;
+ viewRect.y -= viewRect.height;
+ viewRect.width *= 3;
+ viewRect.height *= 3;
+ if (!viewRect.intersects(bounds)) {
+ continue;
+ }
+ }
+ paintLinks(child, graphics, alreadyPaintedLinks);
+ }
+ }
+
+ private void paintSelecteds(final Graphics2D g) {
+ if (!MapView.standardDrawRectangleForSelection || isPrinting()) {
+ return;
+ }
+ final Color c = g.getColor();
+ final Stroke s = g.getStroke();
+ g.setColor(MapView.standardSelectRectangleColor);
+ final Stroke standardSelectionStroke = getStandardSelectionStroke();
+ g.setStroke(standardSelectionStroke);
+ final Object renderingHint = getModeController().getController().getMapViewManager().setEdgesRenderingHint(g);
+ for (final NodeView selected : getSelection()) {
+ paintSelectionRectangle(g, selected);
+ }
+ g.setColor(c);
+ g.setStroke(s);
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
+ }
+
+ private RoundRectangle2D.Float getRoundRectangleAround(NodeView selected, int gap, int arcw) {
+ final JComponent content = selected.getContent();
+ final Point contentLocation = new Point();
+ UITools.convertPointToAncestor(content, contentLocation, this);
+ gap -= 1;
+ final RoundRectangle2D.Float roundRectClip = new RoundRectangle2D.Float(
+ contentLocation.x - gap, contentLocation.y - gap,
+ content.getWidth() + 2 * gap, content.getHeight() + 2 * gap, arcw, arcw);
+ return roundRectClip;
+ }
+
+ private void paintSelectionRectangle(final Graphics2D g, final NodeView selected) {
+ if (selected.getMainView().isEdited()) {
+ return;
+ }
+ final RoundRectangle2D.Float roundRectClip = getRoundRectangleAround(selected, 4, 15);
+ g.draw(roundRectClip);
+ }
+
+ private void highlightSelected(Graphics2D g, NodeView selected, PaintingMode[] paintedModes) {
+ final java.awt.Shape highlightClip;
+ if (MapView.standardDrawRectangleForSelection)
+ highlightClip = getRoundRectangleAround(selected, 4, 15);
+ else
+ highlightClip = getRoundRectangleAround(selected, 4, 2);
+ final java.awt.Shape oldClip = g.getClip();
+ final Rectangle oldClipBounds = g.getClipBounds();
+ try{
+ g.setClip(highlightClip);
+ if(oldClipBounds != null)
+ g.clipRect(oldClipBounds.x, oldClipBounds.y, oldClipBounds.width, oldClipBounds.height);
+ final Rectangle clipBounds = highlightClip.getBounds();
+ final Color color = g.getColor();
+ g.setColor(getBackground());
+ g.fillRect(clipBounds.x, clipBounds.y, clipBounds.width, clipBounds.height);
+ g.setColor(color);
+ paintChildren(g, paintedModes);
+ }
+ finally{
+ g.setClip(oldClip);
+ }
+ }
+
+ Stroke getStandardSelectionStroke() {
+ if (MapView.standardSelectionStroke == null) {
+ MapView.standardSelectionStroke = new BasicStroke(2.0f);
+ }
+ final Stroke standardSelectionStroke = MapView.standardSelectionStroke;
+ return standardSelectionStroke;
+ }
+
+ /**
+ * Call preparePrinting() before printing and endPrinting() after printing
+ * to minimize calculation efforts
+ */
+ public void preparePrinting() {
+ isPrinting = true;
+ if (!isPreparedForPrinting) {
+ if (zoom == 1f) {
+ getRoot().updateAll();
+ synchronized (getTreeLock()) {
+ validateTree();
+ }
+ }
+ if (MapView.printOnWhiteBackground) {
+ background = getBackground();
+ setBackground(Color.WHITE);
+ }
+ fitMap = FitMap.valueOf();
+ if (backgroundComponent != null && fitMap == FitMap.BACKGROUND) {
+ boundingRectangle = getBackgroundImageInnerBounds();
+ }
+ else {
+ boundingRectangle = getInnerBounds();
+ }
+ isPreparedForPrinting = true;
+ }
+ }
+
+ private Rectangle getBackgroundImageInnerBounds() {
+ final Point centerPoint = getRootCenterPoint();
+ final Point backgroundImageTopLeft = getBackgroundImageTopLeft(centerPoint);
+ return new Rectangle(backgroundImageTopLeft.x, backgroundImageTopLeft.y, backgroundComponent.getWidth(), backgroundComponent.getHeight());
+ }
+
+ @Override
+ public void print(final Graphics g) {
+ try {
+ preparePrinting();
+ super.print(g);
+ }
+ finally {
+ isPrinting = false;
+ }
+ }
+
+ public void render(Graphics g1, final Rectangle source, final Rectangle target) {
+ Graphics2D g = (Graphics2D) g1;
+ AffineTransform old = g.getTransform();
+ final double scaleX = (0.0 + target.width) / source.width;
+ final double scaleY = (0.0 + target.height) / source.height;
+ final double zoom;
+ if(scaleX < scaleY){
+ zoom = scaleX;
+ }
+ else{
+ zoom = scaleY;
+ }
+ AffineTransform tr2 = new AffineTransform(old);
+ tr2.translate(target.getWidth() / 2, target.getHeight() / 2);
+ tr2.scale(zoom, zoom);
+ tr2.translate(-source.getX()- (source.getWidth() ) / 2, -source.getY()- (source.getHeight()) / 2);
+ g.setTransform(tr2);
+ final Rectangle clipBounds = g1.getClipBounds();
+ g1.clipRect(source.x, source.y, source.width, source.height);
+ print(g1);
+ g.setTransform(old);
+ g1.setClip(clipBounds.x, clipBounds.y, clipBounds.width, clipBounds.height);
+ }
+
+ public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex) {
+ double userZoomFactor = ResourceController.getResourceController().getDoubleProperty("user_zoom", 1);
+ userZoomFactor = Math.max(0, userZoomFactor);
+ userZoomFactor = Math.min(2, userZoomFactor);
+ if ((fitMap == FitMap.PAGE || fitMap == FitMap.BACKGROUND) && pageIndex > 0) {
+ return Printable.NO_SUCH_PAGE;
+ }
+ final Graphics2D g2 = (Graphics2D) graphics.create();
+ preparePrinting();
+ final double zoomFactor;
+ final double imageableX = pageFormat.getImageableX();
+ final double imageableY = pageFormat.getImageableY();
+ final double imageableWidth = pageFormat.getImageableWidth();
+ final double imageableHeight = pageFormat.getImageableHeight();
+ g2.clipRect((int)imageableX, (int)imageableY, (int)imageableWidth, (int)imageableHeight);
+ final double mapWidth = boundingRectangle.getWidth();
+ final double mapHeight = boundingRectangle.getHeight();
+ if (fitMap == FitMap.PAGE || fitMap == FitMap.BACKGROUND) {
+ final double zoomFactorX = imageableWidth / mapWidth;
+ final double zoomFactorY = imageableHeight / mapHeight;
+ zoomFactor = Math.min(zoomFactorX, zoomFactorY) * 0.99;
+ }
+ else {
+ if (fitMap == FitMap.WIDTH) {
+ zoomFactor = imageableWidth / mapWidth * 0.99;
+ }
+ else if (fitMap == FitMap.HEIGHT) {
+ zoomFactor = imageableHeight / mapHeight * 0.99;
+ }
+ else {
+ zoomFactor = userZoomFactor / UITools.FONT_SCALE_FACTOR;
+ }
+ final int nrPagesInWidth = (int) Math.ceil(zoomFactor * mapWidth
+ / imageableWidth);
+ final int nrPagesInHeight = (int) Math.ceil(zoomFactor * mapHeight
+ / imageableHeight);
+ if (pageIndex >= nrPagesInWidth * nrPagesInHeight) {
+ return Printable.NO_SUCH_PAGE;
+ }
+ final int yPageCoord = (int) Math.floor(pageIndex / nrPagesInWidth);
+ final int xPageCoord = pageIndex - yPageCoord * nrPagesInWidth;
+ g2.translate(-imageableWidth * xPageCoord, -imageableHeight * yPageCoord);
+ }
+ g2.translate(imageableX, imageableY);
+ g2.scale(zoomFactor, zoomFactor);
+ final double mapX = boundingRectangle.getX();
+ final double mapY = boundingRectangle.getY();
+ g2.translate(-mapX, -mapY);
+ print(g2);
+ g2.dispose();
+ return Printable.PAGE_EXISTS;
+ }
+
+ private void repaintSelecteds() {
+ for (final NodeView selected : getSelection()) {
+ selected.repaintSelected();
+ }
+ }
+
+ private Color requiredBackground() {
+ final MapStyle mapStyle = getModeController().getExtension(MapStyle.class);
+ final Color mapBackground = mapStyle.getBackground(model);
+ return mapBackground;
+ }
+
+ void revalidateSelecteds() {
+ selectedsValid = false;
+ }
+
+ /**
+ * Select the node, resulting in only that one being selected.
+ */
+ public void selectAsTheOnlyOneSelected(final NodeView newSelected) {
+ final NodeModel node = newSelected.getModel();
+ if(node.isHiddenSummary())
+ throw new AssertionError("select invisible node");
+ if(node.isVisible())
+ node.getFilterInfo().reset();
+ if (ResourceController.getResourceController().getBooleanProperty("center_selected_node")) {
+ mapScroller.scrollNode(newSelected, ScrollingDirective.SCROLL_NODE_TO_CENTER, ResourceController.getResourceController().getBooleanProperty("slow_scroll_selected_node"));
+ }
+ else {
+ mapScroller.scrollNodeToVisible(newSelected);
+ }
+ selectAsTheOnlyOneSelected(newSelected, true);
+ setSiblingMaxLevel(newSelected.getModel().getNodeLevel(false));
+ }
+
+ public void selectAsTheOnlyOneSelected(final NodeView newSelected, final boolean requestFocus) {
+ if (requestFocus) {
+ newSelected.requestFocusInWindow();
+ }
+ mapScroller.scrollNodeToVisible(newSelected);
+ if(selection.size() == 1 && getSelected().equals(newSelected)){
+ return;
+ }
+ final NodeView[] oldSelecteds = selection.toArray();
+ selection.select(newSelected);
+ if (newSelected.getModel().getParentNode() != null) {
+ ((NodeView) newSelected.getParent()).setPreferredChild(newSelected);
+ }
+ newSelected.repaintSelected();
+ for (final NodeView oldSelected : oldSelecteds) {
+ if (oldSelected != null) {
+ oldSelected.repaintSelected();
+ }
+ }
+ }
+
+ /**
+ * Select the node and his descendants. On extend = false clear up the
+ * previous selection. if extend is false, the past selection will be empty.
+ * if yes, the selection will extended with this node and its children
+ */
+ private void addBranchToSelection(final NodeView newlySelectedNodeView) {
+ if (newlySelectedNodeView.isContentVisible()) {
+ addSelected(newlySelectedNodeView, false);
+ }
+ for (final NodeView target : newlySelectedNodeView.getChildrenViews()) {
+ addBranchToSelection(target);
+ }
+ }
+
+ void selectContinuous(final NodeView newSelected) {
+ final NodeView selectionStart = selection.getSelectionStart();
+ final NodeView selectionEnd = selection.getSelectionEnd();
+ final NodeView parentView = newSelected.getParentView();
+ final boolean left = newSelected.isLeft();
+ if(newSelected.isRoot()
+ || selectionStart == null || selectionEnd == null
+ || parentView != selectionStart.getParentView() || parentView != selectionEnd.getParentView()
+ || left != selectionStart.isLeft() || newSelected.isLeft() != selectionEnd.isLeft()){
+ selection.setSelectionStart(newSelected);
+ if(!newSelected.isSelected())
+ selection.add(newSelected);
+ mapScroller.scrollNodeToVisible(newSelected);
+ return;
+ }
+
+ boolean selectionFound = false;
+ boolean selectionRequired = false;
+ for (NodeView child : parentView.getChildrenViews()){
+ if(child.isLeft() == left){
+ final boolean onOldSelectionMargin = child == selectionStart || child == selectionEnd;
+ boolean selectionFoundNow = ! selectionFound && onOldSelectionMargin;
+ selectionFound = selectionFound || selectionFoundNow;
+
+ final boolean onNewSelectionMargin = child == selectionStart || child == newSelected;
+ boolean selectionRequiredNow = ! selectionRequired && onNewSelectionMargin;
+ selectionRequired = selectionRequired || selectionRequiredNow;
+
+ if(selectionRequired && ! selectionFound && child.getModel().hasVisibleContent())
+ selection.add(child);
+ else if(! selectionRequired && selectionFound)
+ selection.deselect(child);
+
+ if(selectionFound && (selectionStart == selectionEnd || ! selectionFoundNow && onOldSelectionMargin))
+ selectionFound = false;
+ if(selectionRequired && (selectionStart == newSelected || ! selectionRequiredNow && onNewSelectionMargin))
+ selectionRequired = false;
+ }
+ }
+ selection.setSelectionEnd(newSelected);
+ mapScroller.scrollNodeToVisible(newSelected);
+
+ }
+
+ public void setMoveCursor(final boolean isHand) {
+ final int requiredCursor = (isHand && !disableMoveCursor) ? Cursor.MOVE_CURSOR : Cursor.DEFAULT_CURSOR;
+ if (getCursor().getType() != requiredCursor) {
+ setCursor(requiredCursor != Cursor.DEFAULT_CURSOR ? new Cursor(requiredCursor) : null);
+ }
+ }
+
+ void setSiblingMaxLevel(final int level) {
+ siblingMaxLevel = level;
+ }
+
+ public void setZoom(final float zoom) {
+ this.zoom = zoom;
+ mapScroller.anchorToNode(getSelected(), CENTER_ALIGNMENT, CENTER_ALIGNMENT);
+ getRoot().updateAll();
+ adjustBackgroundComponentScale();
+ }
+
+ private void adjustBackgroundComponentScale() {
+ if (backgroundComponent != null) {
+ if (fitToViewport) {
+ final JViewport vp = (JViewport) getParent();
+ final Dimension viewPortSize = vp.getVisibleRect().getSize();
+ ((ScalableComponent) backgroundComponent).setFinalViewerSize(viewPortSize);
+ }
+ else {
+ ((ScalableComponent) backgroundComponent).setMaximumComponentSize(getPreferredSize());
+ ((ScalableComponent) backgroundComponent).setFinalViewerSize(zoom);
+ }
+ }
+ }
+
+ /**
+ * Add the node to the selection if it is not yet there, remove it
+ * otherwise.
+ * @param requestFocus
+ */
+ private void toggleSelected(final NodeView nodeView) {
+ if (isSelected(nodeView)) {
+ if(selection.size() > 1)
+ selection.deselect(nodeView);
+ }
+ else {
+ selection.setSelectionStart(nodeView);
+ selection.add(nodeView);
+ mapScroller.scrollNodeToVisible(nodeView);
+ }
+ }
+
+ private void validateSelecteds() {
+ if (selectedsValid) {
+ return;
+ }
+ selectedsValid = true;
+ final NodeView selectedView = getSelected();
+ if(selectedView == null){
+ final NodeView root = getRoot();
+ selectAsTheOnlyOneSelected(root);
+ mapScroller.scrollToRootNode();
+ return;
+ }
+ final NodeModel selectedNode = selectedView.getModel();
+ final ArrayList<NodeView> selectedNodes = new ArrayList<NodeView>(getSelection().size());
+ for (final NodeView nodeView : getSelection()) {
+ if (nodeView != null) {
+ selectedNodes.add(nodeView);
+ }
+ }
+ selection.clear();
+ for (final NodeView nodeView : selectedNodes) {
+ if (nodeView.isContentVisible()) {
+ selection.add(nodeView);
+ }
+ }
+ if (getSelected() != null) {
+ return;
+ }
+ for(NodeModel node = selectedNode.getParentNode(); node != null; node = node.getParentNode()){
+ final NodeView newNodeView = getNodeView(node);
+ if(newNodeView != null && newNodeView.isContentVisible() ){
+ selectAsTheOnlyOneSelected(newNodeView);
+ return;
+ }
+ }
+ selectAsTheOnlyOneSelected(getRoot());
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.Container#validateTree()
+ */
+ @Override
+ protected void validateTree() {
+ validateSelecteds();
+ getRoot().validateTree();
+ super.validateTree();
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void repaintVisible() {
+ final JViewport vp = (JViewport) getParent();
+ repaint(vp.getViewRect());
+ }
+
+ public void propertyChanged(String propertyName, String newValue, String oldValue) {
+ if(propertyName.equals(TextController.MARK_TRANSFORMED_TEXT))
+ UITools.repaintAll(getRoot());
+ }
+
+ public void selectVisibleAncestorOrSelf(NodeView preferred) {
+ while(! preferred.getModel().hasVisibleContent())
+ preferred = preferred.getParentView();
+ selectAsTheOnlyOneSelected(preferred);
+ }
+
+ public Font getNoteFont() {
+ return noteFont;
+ }
+
+ public Color getNoteForeground() {
+ return noteForeground;
+ }
+
+ public Color getNoteBackground() {
+ return noteBackground;
+ }
+
+ public int getNoteHorizontalAlignment() {
+ return noteHorizontalAlignment;
+ }
+
+ public Font getDetailFont() {
+ return detailFont;
+ }
+
+ public Color getDetailForeground() {
+ return detailForeground;
+ }
+
+ public Color getDetailBackground() {
+ return detailBackground;
+ }
+
+ public int getDetailHorizontalAlignment() {
+ return detailHorizontalAlignment;
+ }
+
+ public boolean isSelected() {
+ return Controller.getCurrentController().getMapViewManager().getMapViewComponent() == MapView.this;
+ }
+
+ void selectIfSelectionIsEmpty(NodeView nodeView) {
+ if(selection.selectedNode == null)
+ selectAsTheOnlyOneSelected(nodeView);
+ }
+
+ public static MapView getMapView(final Component component) {
+ if(component instanceof MapView)
+ return (MapView) component;
+ return (MapView) SwingUtilities.getAncestorOfClass(MapView.class, component);
+ }
+
+ public void select() {
+ getModeController().getController().getMapViewManager().changeToMapView(this);
+ }
+
+ @Override
+ public void setSize(int width, int height) {
+ final boolean sizeChanged = getWidth() != width || getHeight() != height;
+ if(sizeChanged) {
+ super.setSize(width, height);
+ validate();
+ }
+ }
+
+ void scrollView() {
+ if(isDisplayable())
+ mapScroller.scrollView();
+ }
+
+ public void scrollBy(int x, int y) {
+ mapScroller.scrollBy(x, y);
+ }
+
+ public void scrollNodeToVisible(NodeView node) {
+ mapScroller.scrollNodeToVisible(node);
+ }
+
+ public void setAnchorContentLocation() {
+ mapScroller.setAnchorContentLocation();
+ }
+
+ void keepRootNodePosition() {
+ mapScroller.anchorToRoot();
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MapViewChangeObserverCompound.java b/freeplane/src/main/java/org/freeplane/view/swing/map/MapViewChangeObserverCompound.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/MapViewChangeObserverCompound.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/MapViewChangeObserverCompound.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/MapViewController.java b/freeplane/src/main/java/org/freeplane/view/swing/map/MapViewController.java
new file mode 100644
index 0000000..2574db7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/MapViewController.java
@@ -0,0 +1,886 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.EventQueue;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.KeyboardFocusManager;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.awt.image.RenderedImage;
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JOptionPane;
+import javax.swing.JSpinner;
+import javax.swing.SpinnerNumberModel;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ListDataEvent;
+import javax.swing.event.ListDataListener;
+
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.ui.ViewController;
+
+/**
+ * Manages the list of MapViews. As this task is very complex, I exported it
+ * from Controller to this class to keep Controller simple. The information
+ * exchange between controller and this class is managed by observer pattern
+ * (the controller observes changes to the map mapViews here).
+ */
+public class MapViewController implements IMapViewManager , IMapViewChangeListener, IFreeplanePropertyListener {
+ private String lastModeName;
+ /** reference to the current mapmapView; null is allowed, too. */
+ private MapView selectedMapView;
+ MapViewChangeObserverCompound mapViewChangeListeners = new MapViewChangeObserverCompound();
+ /**
+ * A vector of MapView instances. They are ordered according to their screen
+ * order.
+ */
+ final private Vector<MapView> mapViewVector = new Vector<MapView>();
+ private float zoom;
+ private boolean setZoomComboBoxRun;
+ private final Controller controller;
+
+ /**
+ * Reference to the current mode as the mapView may be null.
+ */
+ public MapViewController(Controller controller){
+ this.controller =controller;
+ controller.setMapViewManager(this);
+ addMapViewChangeListener(this);
+ zoomIn = new ZoomInAction(this);
+ controller.addAction(zoomIn);
+ zoomOut = new ZoomOutAction(this);
+ controller.addAction(zoomOut);
+ userDefinedZoom = TextUtils.getText("user_defined_zoom");
+ zoomModel = new DefaultComboBoxModel(getZooms());
+ zoomModel.addElement(userDefinedZoom);
+ ResourceController resourceController = ResourceController.getResourceController();
+ resourceController.addPropertyChangeListener(this);
+ zoomModel.setSelectedItem("100%");
+ zoomModel.addListDataListener(new ListDataListener() {
+ public void intervalRemoved(ListDataEvent e) {
+ }
+
+ public void intervalAdded(ListDataEvent e) {
+ }
+
+ public void contentsChanged(ListDataEvent e) {
+ if (!setZoomComboBoxRun && e.getIndex0() == -1) {
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ setZoomByItem(zoomModel.getSelectedItem());
+ }
+ });
+ }
+ }
+ }) ;
+ final String antialiasProperty = resourceController.getProperty(ViewController.RESOURCE_ANTIALIAS);
+ changeAntialias(antialiasProperty);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#addMapChangeListener(org.freeplane.core.frame.IMapChangeListener)
+ */
+ public void addMapSelectionListener(final IMapSelectionListener pListener) {
+ mapViewChangeListeners.addListener(pListener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#addMapViewChangeListener(org.freeplane.core.frame.IMapViewChangeListener)
+ */
+ public void addMapViewChangeListener(final IMapViewChangeListener pListener) {
+ mapViewChangeListeners.addListener(pListener);
+ }
+
+ private void addToOrChangeInMapViews(final String key, final MapView newOrChangedMapView) {
+ String extension = "";
+ int count = 1;
+ final List<String> mapKeys = getMapKeys();
+ while (mapKeys.contains(key + extension)) {
+ extension = "<" + (++count) + ">";
+ }
+ newOrChangedMapView.setName((key + extension));
+ newOrChangedMapView.setName((key + extension));
+ if (!mapViewVector.contains(newOrChangedMapView)) {
+ mapViewVector.add(newOrChangedMapView);
+ }
+ }
+
+ @Override
+ public void changeToMap(MapModel map) {
+ for (final MapView view : mapViewVector) {
+ if (view.getModel().equals(map)) {
+ changeToMapView(view);
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#changeToMapView(org.freeplane.view.swing.map.MapView)
+ */
+ public boolean changeToMapView(final Component newMapViewComponent) {
+ final MapView newMapView = (MapView) newMapViewComponent;
+ final MapView oldMapView = selectedMapView;
+ if (newMapView == oldMapView) {
+ return true;
+ }
+ mapViewChangeListeners.beforeMapViewChange(oldMapView, newMapView);
+ selectedMapView = newMapView;
+ if (selectedMapView != null) {
+ selectedMapView.revalidateSelecteds();
+ final ModeController modeController = selectedMapView.getModeController();
+ lastModeName = modeController.getModeName();
+ final float mapViewZoom = selectedMapView.getZoom();
+ if (zoom != mapViewZoom) {
+ setZoom(mapViewZoom);
+ }
+ modeController.getController().selectMode(modeController);
+ }
+ mapViewChangeListeners.afterMapViewChange(oldMapView, newMapView);
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#changeToMapView(java.lang.String)
+ */
+ public boolean changeToMapView(final String mapViewDisplayName) {
+ MapView mapViewCandidate = null;
+ for (final MapView mapView : mapViewVector) {
+ final String mapViewName = mapView.getName();
+ if (mapViewDisplayName == mapViewName || mapViewDisplayName != null && mapViewDisplayName.equals(mapViewName)) {
+ mapViewCandidate = mapView;
+ break;
+ }
+ }
+ if (mapViewCandidate == null) {
+ throw new IllegalArgumentException("Map mapView " + mapViewDisplayName + " not found.");
+ }
+ return changeToMapView(mapViewCandidate);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#changeToMode(java.lang.String)
+ */
+ public boolean changeToMode(final String modeName) {
+ if (modeName.equals(lastModeName)) {
+ return true;
+ }
+ MapView mapViewCandidate = null;
+ for (final MapView mapView : mapViewVector) {
+ if (modeName.equals(mapView.getModeController().getModeName())) {
+ mapViewCandidate = mapView;
+ break;
+ }
+ }
+ final MapView oldMapView = selectedMapView;
+ final boolean changed = changeToMapView(mapViewCandidate);
+ if (changed) {
+ lastModeName = modeName;
+ if (oldMapView == selectedMapView) {
+ // if the same map remains selected post event for menu updates.
+ mapViewChangeListeners.afterMapViewChange(oldMapView, selectedMapView);
+ }
+ }
+ return changed;
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#checkIfFileIsAlreadyOpened(java.net.URL)
+ */
+ public String checkIfFileIsAlreadyOpened(final URL urlToCheck) throws MalformedURLException {
+ for (final MapView mapView : mapViewVector) {
+ if (getModel(mapView) != null) {
+ final URL mapViewUrl = getModel(mapView).getURL();
+ if (sameFile(urlToCheck, mapViewUrl)) {
+ return mapView.getName();
+ }
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#close(boolean)
+ */
+ public boolean close(final boolean force) {
+ final MapView mapView = getMapView();
+ return close(mapView, force);
+ }
+
+ public boolean close(final Component mapViewComponent, final boolean force) {
+ if (mapViewComponent == null) {
+ return false;
+ }
+ MapView mapView = (MapView) mapViewComponent;
+ final MapController mapController = mapView.getModeController().getMapController();
+ final boolean closingNotCancelled = mapController.close(mapView.getModel(), force);
+ if (!closingNotCancelled) {
+ return false;
+ }
+ int index = mapViewVector.indexOf(mapView);
+ mapController.removeMapChangeListener(mapView);
+ ResourceController.getResourceController().removePropertyChangeListener(mapView);
+ mapViewVector.remove(mapView);
+ if (mapViewVector.isEmpty()) {
+ /* Keep the current running mode */
+ changeToMapView((MapView) null);
+ }
+ else if(mapView == selectedMapView){
+ if (index >= mapViewVector.size() || index < 0) {
+ index = mapViewVector.size() - 1;
+ }
+ changeToMapView((mapViewVector.get(index)));
+ }
+ mapViewChangeListeners.afterMapViewClose(mapView);
+ mapView.getRoot().remove();
+ return true;
+ }
+
+ public String createHtmlMap() {
+ final MapModel model = getModel();
+ final ClickableImageCreator creator = new ClickableImageCreator(model.getRootNode(), getMapView()
+ .getModeController(), "FM$1FM");
+ return creator.generateHtml();
+ }
+
+ public RenderedImage createImage(int dpi) {
+ final MapView view = getMapView();
+ if (view == null) {
+ return null;
+ }
+ view.preparePrinting();
+ final Rectangle innerBounds = view.getInnerBounds();
+
+ double scaleFactor = (double) dpi / (double) UITools.getScreenResolution();
+
+ int imageWidth = (int) Math.ceil(innerBounds.width * scaleFactor);
+ int imageHeight = (int) Math.ceil(innerBounds.height * scaleFactor);
+
+ final BufferedImage myImage = (BufferedImage) view.createImage(imageWidth, imageHeight);
+ final Graphics2D g = (Graphics2D) myImage.getGraphics();
+ g.scale(scaleFactor, scaleFactor);
+ g.translate(-innerBounds.x, -innerBounds.y);
+ view.print(g);
+ view.endPrinting();
+ return myImage;
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getBackgroundColor(org.freeplane.core.model.NodeModel)
+ */
+ public Color getBackgroundColor(final NodeModel node) {
+ final MapView mapView = getMapView();
+ if (mapView == null) {
+ return null;
+ }
+ final NodeView nodeView = mapView.getNodeView(node);
+ if (nodeView == null) {
+ return null;
+ }
+ return nodeView.getTextBackground();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getComponent(org.freeplane.core.model.NodeModel)
+ */
+ public Component getComponent(final NodeModel node) {
+ if(selectedMapView == null)
+ return null;
+ final NodeView nodeView = selectedMapView.getNodeView(node);
+ if(nodeView == null)
+ return null;
+ return nodeView.getMainView();
+ }
+
+ public boolean isFoldedOnCurrentView(NodeModel node){
+ if(selectedMapView == null)
+ return node.isFolded();
+ final NodeView nodeView = selectedMapView.getNodeView(node);
+ if(nodeView == null)
+ return node.isFolded();
+ return nodeView.isFolded();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getFont(org.freeplane.core.model.NodeModel)
+ */
+ public Font getFont(final NodeModel node) {
+ final MapView mapView = getMapView();
+ if (mapView == null) {
+ return null;
+ }
+ final NodeView nodeView = mapView.getNodeView(node);
+ if (nodeView == null) {
+ return null;
+ }
+ return nodeView.getMainView().getFont();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getMapKeys()
+ */
+ public List<String> getMapKeys() {
+ final LinkedList<String> returnValue = new LinkedList<String>();
+ for (final MapView mapView : mapViewVector) {
+ returnValue.add(mapView.getName());
+ }
+ return Collections.unmodifiableList(returnValue);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getMaps()
+ */
+ public Map<String, MapModel> getMaps() {
+ final HashMap<String, MapModel> returnValue = new HashMap<String, MapModel>(mapViewVector.size());
+ for (final MapView mapView : mapViewVector) {
+ returnValue.put(mapView.getName(), getModel(mapView));
+ }
+ return Collections.unmodifiableMap(returnValue);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getMapSelection()
+ */
+ public IMapSelection getMapSelection() {
+ final MapView mapView = getMapView();
+ return mapView == null ? null : mapView.getMapSelection();
+ }
+
+ public MapView getMapView() {
+ return selectedMapView;
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getMapViewComponent()
+ */
+ public Component getMapViewComponent() {
+ return getMapView();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getMapViewVector()
+ */
+ public List<MapView> getMapViewVector() {
+ return Collections.unmodifiableList(mapViewVector);
+ }
+
+ public ModeController getModeController(final Component mapView) {
+ return ((MapView) mapView).getModeController();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getModel()
+ */
+ public MapModel getModel() {
+ final MapView mapView = getMapView();
+ return mapView == null ? null : getModel(mapView);
+ }
+
+ public MapModel getModel(final Component mapView) {
+ return ((MapView) mapView).getModel();
+ }
+
+ private MapModel getModel(final MapView mapView) {
+ return mapView == null ? null : mapView.getModel();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getSelectedComponent()
+ */
+ public Component getSelectedComponent() {
+ final MapView mapView = getMapView();
+ return mapView == null ? null : mapView.getSelected();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getTextColor(org.freeplane.core.model.NodeModel)
+ */
+ public Color getTextColor(final NodeModel node) {
+ final MapView mapView = getMapView();
+ if (mapView == null) {
+ return null;
+ }
+ final NodeView nodeView = mapView.getNodeView(node);
+ if (nodeView == null) {
+ return null;
+ }
+ return nodeView.getTextColor();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getViewNumber()
+ */
+ public int getViewNumber() {
+ return mapViewVector.size();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#getZoom()
+ */
+ public float getZoom() {
+ return zoom;
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#newMapView(org.freeplane.core.model.MapModel, org.freeplane.core.modecontroller.ModeController)
+ */
+ public void newMapView(final MapModel map, final ModeController modeController) {
+ final MapView mapView = new MapView(map, modeController);
+ addToOrChangeInMapViews(mapView.getName(), mapView);
+ modeController.getMapController().addMapChangeListener(mapView);
+ ResourceController.getResourceController().addPropertyChangeListener(mapView);
+ mapViewChangeListeners.mapViewCreated(mapView);
+ changeToMapView(mapView);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#nextMapView()
+ */
+ public void nextMapView() {
+ int index;
+ final int size = mapViewVector.size();
+ if (getMapView() != null) {
+ index = mapViewVector.indexOf(getMapView());
+ }
+ else {
+ index = size - 1;
+ }
+ if (index + 1 < size && index >= 0) {
+ changeToMapView((mapViewVector.get(index + 1)));
+ }
+ else if (size > 0) {
+ changeToMapView((mapViewVector.get(0)));
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#previousMapView()
+ */
+ public void previousMapView() {
+ int index;
+ final int size = mapViewVector.size();
+ if (getMapView() != null) {
+ index = mapViewVector.indexOf(getMapView());
+ }
+ else {
+ index = 0;
+ }
+ if (index > 0) {
+ changeToMapView((mapViewVector.get(index - 1)));
+ }
+ else {
+ if (size > 0) {
+ changeToMapView((mapViewVector.get(size - 1)));
+ }
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#removeIMapViewChangeListener(org.freeplane.core.frame.IMapChangeListener)
+ */
+ public void removeMapSelectionListener(final IMapSelectionListener pListener) {
+ mapViewChangeListeners.removeListener(pListener);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#removeMapViewChangeListener(org.freeplane.core.frame.IMapViewChangeListener)
+ */
+ public void removeMapViewChangeListener(final IMapViewChangeListener pListener) {
+ mapViewChangeListeners.removeListener(pListener);
+ }
+
+ private boolean sameFile(final URL urlToCheck, final URL mapViewUrl) {
+ if (mapViewUrl == null) {
+ return false;
+ }
+ if (urlToCheck.getProtocol().equals("file") && mapViewUrl.getProtocol().equals("file")) {
+ return (new File(urlToCheck.getFile())).equals(new File(mapViewUrl.getFile()));
+ }
+ return urlToCheck.sameFile(mapViewUrl);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#scrollNodeToVisible(org.freeplane.core.model.NodeModel)
+ */
+ public void scrollNodeToVisible(final NodeModel node) {
+ final NodeView nodeView = selectedMapView.getNodeView(node);
+ if (nodeView != null) {
+ selectedMapView.scrollNodeToVisible(nodeView);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#setZoom(float)
+ */
+ public void setZoom(final float zoom) {
+ this.zoom = zoom;
+ final MapView mapView = getMapView();
+ if (mapView == null) {
+ return;
+ }
+ final MapModel map = mapView.getModel();
+ final MapStyle mapStyle = mapView.getModeController().getExtension(MapStyle.class);
+ if(mapView.getZoom() == zoom){
+ return;
+ }
+ mapStyle.setZoom(map, zoom);
+ mapView.setZoom(zoom);
+ setZoomComboBox(zoom);
+ final Object[] messageArguments = { String.valueOf(zoom * 100f) };
+ final String stringResult = TextUtils.format("user_defined_zoom_status_bar", messageArguments);
+ controller.getViewController().out(stringResult);
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#tryToChangeToMapView(java.lang.String)
+ */
+ public boolean tryToChangeToMapView(final String mapView) {
+ if (mapView != null && getMapKeys().contains(mapView)) {
+ changeToMapView(mapView);
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+ public boolean tryToChangeToMapView(URL url) throws MalformedURLException {
+ final MapModel currentMap = getModel();
+ if(currentMap != null && url.equals(currentMap.getURL()))
+ return true;
+ final String mapExtensionKey = checkIfFileIsAlreadyOpened(url);
+ if (mapExtensionKey != null) {
+ tryToChangeToMapView(mapExtensionKey);
+ return true;
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.core.frame.IMapViewController#updateMapViewName()
+ */
+ public void updateMapViewName() {
+ final MapView r = getMapView();
+ final String name = r.getModel().getTitle();
+ addToOrChangeInMapViews(name, getMapView());
+ changeToMapView(getMapView());
+ }
+
+ public boolean isLeftTreeSupported(final Component mapViewComponent) {
+ return ((MapView) mapViewComponent).getLayoutType() != MapViewLayout.OUTLINE;
+ }
+
+ public Map<String, MapModel> getMaps(final String modename) {
+ final HashMap<String, MapModel> returnValue = new HashMap<String, MapModel>(mapViewVector.size());
+ for (final MapView mapView : mapViewVector) {
+ if (mapView.getModeController().getModeName().equals(modename)) {
+ returnValue.put(mapView.getName(), getModel(mapView));
+ }
+ }
+ return Collections.unmodifiableMap(returnValue);
+ }
+
+ public List<Component> getViews(final MapModel map) {
+ final LinkedList<Component> list = new LinkedList<Component>();
+ for (final MapView view : mapViewVector) {
+ if (view.getModel().equals(map)) {
+ list.add(view);
+ }
+ }
+ return list;
+ }
+ public void afterViewChange(final Component oldMap, final Component pNewMap) {
+ Controller controller = Controller.getCurrentController();
+ final ModeController oldModeController = controller.getModeController();
+ ModeController newModeController = oldModeController;
+ if (pNewMap != null) {
+ final IMapSelection mapSelection = getMapSelection();
+ final NodeModel selected = mapSelection.getSelected();
+ mapSelection.scrollNodeToVisible(selected);
+ setZoomComboBox(getZoom());
+ obtainFocusForSelected();
+ newModeController = getModeController(pNewMap);
+ if (newModeController != oldModeController) {
+ controller.selectMode(newModeController);
+ }
+ }
+ setMapTitles();
+ controller.getViewController().viewNumberChanged(getViewNumber());
+ newModeController.getUserInputListenerFactory().updateMapList();
+ if (pNewMap != null) {
+ newModeController.setVisible(true);
+ }
+ }
+
+ public void afterViewClose(final Component oldView) {
+ ModeController newModeController = getModeController(oldView);
+ newModeController.getUserInputListenerFactory().updateMapList();
+ }
+
+ public void afterViewCreated(final Component mapView) {
+ }
+
+ public void beforeViewChange(final Component oldMap, final Component newMap) {
+ Controller controller = Controller.getCurrentController();
+ final ModeController modeController = controller.getModeController();
+ if (oldMap != null) {
+ modeController.setVisible(false);
+ }
+ }
+
+ private void setZoomByItem(final Object item) {
+ final float zoomValue;
+ if (((String) item).equals(userDefinedZoom)) {
+ final float zoom =getZoom();
+ final int zoomInt = Math.round(100 * zoom);
+ final SpinnerNumberModel spinnerNumberModel = new SpinnerNumberModel(zoomInt, 1, 3200, 1);
+ JSpinner spinner = new JSpinner(spinnerNumberModel);
+ final int option = JOptionPane.showConfirmDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), spinner, TextUtils.getText("enter_zoom"), JOptionPane.OK_CANCEL_OPTION);
+ if(option == JOptionPane.OK_OPTION)
+ zoomValue = spinnerNumberModel.getNumber().floatValue() / 100;
+ else
+ zoomValue = zoom;
+ }
+ else
+ zoomValue = getZoomValue(item);
+ setZoom(zoomValue);
+ }
+
+ final private String userDefinedZoom;
+ final private ZoomInAction zoomIn;
+ private final DefaultComboBoxModel zoomModel;
+ final private ZoomOutAction zoomOut;
+
+ private float getCurrentZoomIndex() {
+ final int selectedIndex = zoomModel.getIndexOf(zoomModel.getSelectedItem());
+ final int itemCount = zoomModel.getSize();
+ if (selectedIndex != - 1) {
+ return selectedIndex;
+ }
+ final float userZoom = getZoom();
+ for (int i = 0; i < itemCount - 1; i++) {
+ if (userZoom < getZoomValue(zoomModel.getElementAt(i))) {
+ return i - 0.5f;
+ }
+ }
+ return itemCount - 1.5f;
+ }
+
+ public String getItemForZoom(final float f) {
+ return (int) (f * 100F) + "%";
+ }
+
+ private void setZoomComboBox(final float f) {
+ setZoomComboBoxRun = true;
+ try {
+ final String toBeFound = getItemForZoom(f);
+ zoomModel.setSelectedItem(toBeFound);
+ }
+ finally {
+ setZoomComboBoxRun = false;
+ }
+ }
+
+ public void zoomIn() {
+ final float currentZoomIndex = getCurrentZoomIndex();
+ if (currentZoomIndex < zoomModel.getSize() - 2) {
+ setZoomByItem(zoomModel.getElementAt((int) (currentZoomIndex + 1f)));
+ }
+ }
+
+ public void zoomOut() {
+ final float currentZoomIndex = getCurrentZoomIndex();
+ if (currentZoomIndex > 0) {
+ setZoomByItem(zoomModel.getElementAt((int) (currentZoomIndex - 0.5f)));
+ }
+ }
+
+ public JComboBox createZoomBox() {
+ if(zoomBox == null) {
+ zoomBox = new JComboBoxWithBorder(zoomModel);
+ }
+ return zoomBox;
+ }
+
+ public String[] getZooms() {
+ return zooms;
+ }
+
+ private float getZoomValue(final Object item) {
+ final String dirty = (String) item;
+ final String cleaned = dirty.substring(0, dirty.length() - 1);
+ final float zoomValue = Integer.parseInt(cleaned, 10) / 100F;
+ return zoomValue;
+ }
+
+ private static final String[] zooms = { "25%", "50%", "75%", "100%", "150%", "200%", "300%", "400%" };
+ public void obtainFocusForSelected() {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ if (getMapView() != null) {
+ final Component selectedComponent = getSelectedComponent();
+ if(selectedComponent != null){
+ selectedComponent.requestFocus();
+ }
+ }
+ }
+ });
+ }
+
+ public boolean closeAllMaps() {
+ while (getMapViewVector().size() > 0) {
+ if (getMapView() != null) {
+ final boolean closingNotCancelled = close(false);
+ if (!closingNotCancelled) {
+ return false;
+ }
+ }
+ else {
+ nextMapView();
+ }
+ }
+ ResourceController.getResourceController().setProperty("antialiasEdges", (antialiasEdges ? "true" : "false"));
+ ResourceController.getResourceController().setProperty("antialiasAll", (antialiasAll ? "true" : "false"));
+ return true;
+ }
+ private boolean antialiasAll = false;
+ private boolean antialiasEdges = false;
+ private JComboBox zoomBox;
+ private boolean getAntialiasAll() {
+ return antialiasAll;
+ }
+
+ private boolean getAntialiasEdges() {
+ return antialiasEdges;
+ }
+
+ public void setAntialiasAll(final boolean antialiasAll) {
+ this.antialiasAll = antialiasAll;
+ }
+
+ public void setAntialiasEdges(final boolean antialiasEdges) {
+ this.antialiasEdges = antialiasEdges;
+ }
+
+ public Object setEdgesRenderingHint(final Graphics2D g) {
+ final Object renderingHint = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
+ if (getAntialiasEdges()) {
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ }
+ else {
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
+ }
+ return renderingHint;
+ }
+
+
+ public void setTextRenderingHint(final Graphics2D g) {
+ if (getAntialiasAll()) {
+ g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+ }
+ else {
+ g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
+ }
+ }
+ /**
+ */
+ private void changeAntialias(final String command) {
+ if (command == null) {
+ return;
+ }
+ if (command.equals("antialias_none")) {
+ setAntialiasEdges(false);
+ setAntialiasAll(false);
+ }
+ if (command.equals("antialias_edges")) {
+ setAntialiasEdges(true);
+ setAntialiasAll(false);
+ }
+ if (command.equals("antialias_all")) {
+ setAntialiasEdges(true);
+ setAntialiasAll(true);
+ }
+ final Component mapView = getMapViewComponent();
+ if (mapView != null) {
+ mapView.repaint();
+ }
+ }
+
+
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (propertyName.equals(ViewController.RESOURCE_ANTIALIAS)) {
+ changeAntialias(newValue);
+ }
+ }
+ public void setMapTitles() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ if (modeController == null) {
+ controller.getViewController().setTitle("");
+ return;
+ }
+ final Object[] messageArguments = { TextUtils.getText(("mode_" + modeController.getModeName())) };
+ final MessageFormat formatter = new MessageFormat(TextUtils.getText("mode_title"));
+ String frameTitle = formatter.format(messageArguments);
+ String viewName = "";
+ final MapModel model = getModel();
+ if (model != null) {
+ viewName = getMapViewComponent().getName();
+ frameTitle = viewName + ((model.isSaved() || model.isReadOnly()) ? "" : "*") + " - " + frameTitle
+ + (model.isReadOnly() ? " (" + TextUtils.getText("read_only") + ")" : "");
+ final File file = model.getFile();
+ if (file != null) {
+ frameTitle += " " + file.getAbsolutePath();
+ }
+ }
+ controller.getViewController().setTitle(frameTitle);
+ modeController.getUserInputListenerFactory().updateMapList();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/MapViewScrollPane.java b/freeplane/src/main/java/org/freeplane/view/swing/map/MapViewScrollPane.java
new file mode 100644
index 0000000..fb6d38a
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/MapViewScrollPane.java
@@ -0,0 +1,205 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Point;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+
+import javax.swing.JScrollPane;
+import javax.swing.JViewport;
+import javax.swing.KeyStroke;
+import javax.swing.Timer;
+import javax.swing.border.Border;
+
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ActionAcceleratorManager;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.ViewController;
+
+/**
+ * @author Dimitry Polivaev
+ * 10.01.2009
+ */
+public class MapViewScrollPane extends JScrollPane implements IFreeplanePropertyListener {
+ @SuppressWarnings("serial")
+ static class MapViewPort extends JViewport{
+ private boolean layoutInProgress = false;
+ @Override
+ public void doLayout() {
+ final Component view = getView();
+ layoutInProgress = view != null && ! view.isValid();
+ super.doLayout();
+ layoutInProgress = false;
+ }
+
+ private Timer timer;
+
+ @Override
+ public void setViewPosition(Point p) {
+ if(! layoutInProgress) {
+ Integer scrollingDelay = (Integer) getClientProperty(ViewController.SLOW_SCROLLING);
+ if(scrollingDelay != null && scrollingDelay != 0){
+ putClientProperty(ViewController.SLOW_SCROLLING, null);
+ slowSetViewPosition(p, scrollingDelay);
+ } else {
+ super.setViewPosition(p);
+ MapView view = (MapView)getView();
+ if (view != null) {
+ view.setAnchorContentLocation();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void setViewSize(Dimension newSize) {
+ Component view = getView();
+ if (view != null) {
+ Dimension oldSize = view.getSize();
+ if (newSize.equals(oldSize)) {
+ view.setSize(newSize);
+ }
+ else
+ super.setViewSize(newSize);
+ }
+ }
+
+ private void slowSetViewPosition(final Point p, final int delay) {
+ if(timer != null) {
+ timer.stop();
+ timer = null;
+ }
+ final Point viewPosition = getViewPosition();
+ int dx = p.x - viewPosition.x;
+ int dy = p.y - viewPosition.y;
+ int slowDx = calcScrollIncrement(dx);
+ int slowDy = calcScrollIncrement(dy);
+ viewPosition.translate(slowDx, slowDy);
+ super.setViewPosition(viewPosition);
+ if(slowDx == dx && slowDy == dy)
+ return;
+ timer = new Timer(delay, new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ timer = null;
+ MapViewPort.this.slowSetViewPosition(p, delay);
+ }
+ });
+ timer.setRepeats(false);
+ timer.start();
+ }
+
+ private int calcScrollIncrement(int dx) {
+ int v = ResourceController.getResourceController().getIntProperty("scrolling_speed");
+ final int slowDX = (int) (v / 5.0 * Math.sqrt(Math.abs(dx)));
+ if (Math.abs(dx) > 2 && slowDX < Math.abs(dx)) {
+ dx = slowDX * Integer.signum(dx);
+ }
+ return dx;
+ }
+ }
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private Border defaultBorder;
+
+ public MapViewScrollPane() {
+ super();
+ setViewport(new MapViewPort());
+ defaultBorder = getBorder();
+ }
+
+ @Override
+ public void addNotify() {
+ super.addNotify();
+ setScrollbarsVisiblilty();
+ UITools.setScrollbarIncrement(this);
+ ResourceController.getResourceController().addPropertyChangeListener(MapViewScrollPane.this);
+ }
+
+ @Override
+ public void removeNotify() {
+ super.removeNotify();
+ ResourceController.getResourceController().removePropertyChangeListener(MapViewScrollPane.this);
+ }
+
+ public void propertyChanged(String propertyName, String newValue, String oldValue) {
+ if(ViewController.FULLSCREEN_ENABLED_PROPERTY.equals(propertyName)
+ || propertyName.startsWith("scrollbarsVisible")){
+ setScrollbarsVisiblilty();
+ }
+ else if (propertyName.equals(UITools.SCROLLBAR_INCREMENT)) {
+ final int scrollbarIncrement = Integer.valueOf(newValue);
+ getHorizontalScrollBar().setUnitIncrement(scrollbarIncrement);
+ getVerticalScrollBar().setUnitIncrement(scrollbarIncrement);
+ }
+
+ }
+
+ private void setScrollbarsVisiblilty() {
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ boolean areScrollbarsVisible = viewController.areScrollbarsVisible();
+ setHorizontalScrollBarPolicy(areScrollbarsVisible ? JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS : JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ setVerticalScrollBarPolicy(areScrollbarsVisible ? JScrollPane.VERTICAL_SCROLLBAR_ALWAYS : JScrollPane.VERTICAL_SCROLLBAR_NEVER);
+ final boolean isFullScreenEnabled = ! UITools.getCurrentFrame().isResizable();
+ setBorder(isFullScreenEnabled && ! areScrollbarsVisible ? null : defaultBorder);
+ }
+
+ @Override
+ public void doLayout() {
+ if(viewport != null){
+ final Component view = viewport.getView();
+ if(view != null)
+ view.invalidate();
+ }
+ super.doLayout();
+ }
+
+ @Override
+ protected void validateTree() {
+ super.validateTree();
+ if(viewport != null){
+ MapView view = (MapView) viewport.getView();
+ if(view != null) {
+ view.scrollView();
+ }
+ }
+ }
+
+ @Override
+ protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) {
+ if(viewport != null){
+ MapView mapView = (MapView) viewport.getView();
+ final ActionAcceleratorManager acceleratorManager = mapView.getModeController().getUserInputListenerFactory().getAcceleratorManager();
+ if(acceleratorManager.canProcessKeyEvent(e))
+ return false;
+ }
+ return super.processKeyBinding(ks, e, condition, pressed);
+ }
+
+
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MindMapLayout.java b/freeplane/src/main/java/org/freeplane/view/swing/map/MindMapLayout.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/MindMapLayout.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/MindMapLayout.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/MouseArea.java b/freeplane/src/main/java/org/freeplane/view/swing/map/MouseArea.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/MouseArea.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/MouseArea.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/NarrowHexagonMainView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/NarrowHexagonMainView.java
new file mode 100644
index 0000000..5f52e47
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/NarrowHexagonMainView.java
@@ -0,0 +1,96 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Polygon;
+
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+
+class NarrowHexagonMainView extends VariableInsetsMainView {
+ private static final double HORIZONTAL_MARGIN_FACTOR = 1.0;
+ private static final double UNIFORM_HEIGHT_TO_WIDTH_RELATION = 2 / Math.sqrt(3);
+ private static final double VERTICAL_MARGIN_FACTOR = 2;
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public NarrowHexagonMainView(ShapeConfigurationModel shapeConfigurationModel) {
+ super(shapeConfigurationModel);
+ }
+
+ protected double getVerticalMarginFactor() {
+ return VERTICAL_MARGIN_FACTOR;
+ }
+
+ protected double getHorizontalMarginFactor() {
+ return HORIZONTAL_MARGIN_FACTOR;
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ if (isPreferredSizeSet()) {
+ return super.getPreferredSize();
+ }
+ if(getShapeConfiguration().isUniform()){
+ final Dimension prefSize = getPreferredRectangleSizeWithoutMargin(getMaximumWidth());
+ double width = (int) Math.ceil(prefSize.width + getZoom() * getMinimumHorizontalInset());
+ width = limitWidth(width);
+ prefSize.width = (int) width;
+ prefSize.height = (int) (width * UNIFORM_HEIGHT_TO_WIDTH_RELATION);
+ return prefSize;
+ }
+ else
+ return super.getPreferredSize();
+ }
+
+
+ @Override
+ protected void paintNodeShape(final Graphics2D g) {
+ Polygon polygon = getPaintedShape();
+ g.draw(polygon);
+ }
+
+ protected Polygon getPaintedShape() {
+ final Polygon polygon;
+ if(getShapeConfiguration().isUniform()){
+ int[] xCoords = new int[]{getWidth() / 2, 0, 0, getWidth() / 2, getWidth() - 1, getWidth() - 1};
+ int[] yCoords = new int[]{0, getHeight()/4, 3 * getHeight() /4 , getHeight() - 1, 3 * getHeight() / 4, getHeight() / 4};
+ polygon = new Polygon(xCoords, yCoords, xCoords.length);
+ }
+ else {
+ final int zoomedVerticalInset = (int) (getHeight() * (1 - 1 / getVerticalMarginFactor() ) / 2);
+ int[] xCoords = new int[]{0, getWidth()/2, getWidth() -1, getWidth() - 1, getWidth()/2, 0};
+ int[] yCoords = new int[]{zoomedVerticalInset, 0, zoomedVerticalInset, getHeight() - zoomedVerticalInset - 1, getHeight() - 1,getHeight() - zoomedVerticalInset - 1};
+ polygon = new Polygon(xCoords, yCoords, xCoords.length);
+ }
+ return polygon;
+ }
+
+ @Override
+ protected void paintBackground(final Graphics2D graphics, final Color color) {
+ graphics.setColor(color);
+ graphics.fill(getPaintedShape());
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/NodeTooltip.java b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeTooltip.java
new file mode 100644
index 0000000..cc3a7c5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeTooltip.java
@@ -0,0 +1,169 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.GraphicsConfiguration;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionListener;
+import java.net.URI;
+import java.net.URL;
+import java.security.AccessControlException;
+
+import javax.swing.JEditorPane;
+import javax.swing.JScrollPane;
+import javax.swing.JToolTip;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.StyleSheet;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.JRestrictedSizeScrollPane;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.components.html.SynchronousScaledEditorKit;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.url.UrlManager;
+
+ at SuppressWarnings("serial")
+public class NodeTooltip extends JToolTip {
+ class LinkMouseListener extends MouseAdapter implements MouseMotionListener{
+ public void mouseMoved(final MouseEvent ev) {
+ final String link = HtmlUtils.getURLOfExistingLink((HTMLDocument) tip.getDocument(), tip.viewToModel(ev.getPoint()));
+ boolean followLink = link != null;
+ Controller currentController = Controller.getCurrentController();
+ final int requiredCursor;
+ if(followLink){
+ currentController.getViewController().out(link);
+ requiredCursor = Cursor.HAND_CURSOR;
+ }
+ else{
+ requiredCursor = Cursor.DEFAULT_CURSOR;
+ }
+ if (tip.getCursor().getType() != requiredCursor) {
+ tip.setCursor(requiredCursor != Cursor.DEFAULT_CURSOR ? new Cursor(requiredCursor) : null);
+ }
+ }
+
+ public void mouseClicked(final MouseEvent ev) {
+ if (Compat.isPlainEvent(ev)) {
+ final String linkURL = HtmlUtils.getURLOfExistingLink((HTMLDocument) tip.getDocument(), tip.viewToModel(ev.getPoint()));
+ if (linkURL != null) {
+ try {
+ UrlManager.getController().loadURL(new URI(linkURL));
+ } catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+ }
+ }
+
+ public void mouseDragged(MouseEvent e) {
+ }
+ }
+
+ final private JEditorPane tip;
+ private int maximumWidth;
+
+ public NodeTooltip(GraphicsConfiguration graphicsConfiguration){
+ tip = new JEditorPane();
+ tip.setContentType("text/html");
+ tip.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false);
+ final HTMLEditorKit kit = SynchronousScaledEditorKit.create();
+ tip.setEditorKit(kit);
+ tip.setEditable(false);
+ tip.setMargin(new Insets(0, 0, 0, 0));
+ final LinkMouseListener linkMouseListener = new LinkMouseListener();
+ tip.addMouseListener(linkMouseListener);
+ tip.addMouseMotionListener(linkMouseListener);
+ final HTMLDocument document = (HTMLDocument) tip.getDocument();
+ final StyleSheet styleSheet = document.getStyleSheet();
+ styleSheet.removeStyle("p");
+ styleSheet.removeStyle("body");
+ styleSheet.addRule("p {margin-top:0;}\n");
+
+ final JRestrictedSizeScrollPane scrollPane = new JRestrictedSizeScrollPane(tip);
+ scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+ scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+ final Rectangle screenBounds = graphicsConfiguration.getBounds();
+ final int screenHeigth = screenBounds.height - 80;
+ final int screenWidth = screenBounds.width - 80;
+ final int maximumHeight = Math.min(screenHeigth, getIntProperty("toolTipManager.max_tooltip_height"));
+ final int scrollBarWidth = scrollPane.getVerticalScrollBar().getPreferredSize().width;
+ scrollPane.setMaximumSize(new Dimension(screenWidth, maximumHeight));
+ maximumWidth = Math.min(screenWidth, getIntProperty("toolTipManager.max_tooltip_width")) - scrollBarWidth;
+ UITools.setScrollbarIncrement(scrollPane);
+ add(scrollPane);
+ tip.setOpaque(true);
+ }
+
+ private int getIntProperty(String propertyName) {
+ return ResourceController.getResourceController().getIntProperty(propertyName, Integer.MAX_VALUE);
+ }
+
+ @Override
+ public void setTipText(String tipText) {
+ try{
+ setTipTextUnsafe(tipText);
+ }
+ catch (Exception e1) {
+ if(e1 instanceof AccessControlException)
+ LogUtils.warn(e1.getMessage());
+ else
+ LogUtils.severe(e1);
+ final String localizedMessage = e1.getLocalizedMessage();
+ final String htmlEscapedText = HtmlUtils.plainToHTML(localizedMessage + '\n' + tipText);
+ try{
+ setTipTextUnsafe(htmlEscapedText);
+ }
+ catch (Exception e2){
+ }
+ }
+ }
+
+ private void setTipTextUnsafe(String tipText) throws Exception{
+ tip.setSize(0, 0);
+ tip.setPreferredSize(null);
+ tip.setText(tipText);
+ Dimension preferredSize = tip.getPreferredSize();
+ if (preferredSize.width > maximumWidth) {
+ final HTMLDocument document = (HTMLDocument) tip.getDocument();
+ document.getStyleSheet().addRule("body { width: " + maximumWidth + "}");
+ // bad hack: call "setEditable" only to update view
+ tip.setEditable(true);
+ tip.setEditable(false);
+ preferredSize = tip.getPreferredSize();
+ }
+ tip.setSize(preferredSize);
+ preferredSize = tip.getPreferredSize();
+ tip.setPreferredSize(preferredSize);
+
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ final Component scrollPane = getComponent(0);
+ return scrollPane.getPreferredSize();
+ }
+
+ @Override
+ public void layout() {
+ final Component scrollPane = getComponent(0);
+ scrollPane.setSize(getPreferredSize());
+ super.layout();
+ }
+
+ void scrollUp() {
+ tip.scrollRectToVisible(new Rectangle(1, 1));
+ }
+
+ public void setBase(URL url){
+ ((HTMLDocument)tip.getDocument()).setBase(url);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/NodeTooltipManager.java b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeTooltipManager.java
new file mode 100644
index 0000000..75e468d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeTooltipManager.java
@@ -0,0 +1,334 @@
+package org.freeplane.view.swing.map;
+
+
+import java.awt.Component;
+import java.awt.GridLayout;
+import java.awt.KeyboardFocusManager;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseMotionListener;
+import java.lang.ref.WeakReference;
+
+import javax.swing.FocusManager;
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JPopupMenu;
+import javax.swing.JToolTip;
+import javax.swing.SwingUtilities;
+import javax.swing.Timer;
+import javax.swing.UIManager;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.resources.IFreeplanePropertyListener;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.MouseInsideListener;
+import org.freeplane.features.map.AMapChangeListenerAdapter;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+public class NodeTooltipManager implements IExtension{
+ private static final String TOOL_TIP_MANAGER = "toolTipManager.";
+ private static final String TOOL_TIP_MANAGER_INITIAL_DELAY = "toolTipManager.initialDelay";
+ private static final String RESOURCES_SHOW_NODE_TOOLTIPS = "show_node_tooltips";
+ private final Timer enterTimer;
+ private final Timer exitTimer;
+ private String toolTipText;
+ private JComponent insideComponent;
+ private MouseEvent mouseEvent;
+
+ private JPopupMenu tipPopup;
+ /** The Window tip is being displayed in. This will be non-null if
+ * the Window tip is in differs from that of insideComponent's Window.
+ */
+ private JToolTip tip;
+ final private ComponentMouseListener componentMouseListener;
+ private WeakReference<Component> focusOwnerRef;
+ private boolean mouseOverComponent;
+ private MouseInsideListener mouseInsideTooltipListener;
+
+ public static NodeTooltipManager getSharedInstance(ModeController modeController){
+ {
+ final NodeTooltipManager instance = modeController.getExtension(NodeTooltipManager.class);
+ if(instance != null){
+ return instance;
+ }
+ }
+ final NodeTooltipManager instance = new NodeTooltipManager();
+ setTooltipDelays(instance);
+ UIManager.put("PopupMenu.consumeEventOnClose", Boolean.FALSE);
+ ResourceController.getResourceController().addPropertyChangeListener(new IFreeplanePropertyListener() {
+ public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
+ if (propertyName.startsWith(TOOL_TIP_MANAGER)) {
+ setTooltipDelays(instance);
+ }
+ }
+ });
+ IMapChangeListener mapChangeListener = new AMapChangeListenerAdapter() {
+
+ @Override
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ instance.hideTipWindow();
+ }
+
+ @Override
+ public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
+ instance.hideTipWindow();
+ }
+
+ @Override
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ instance.hideTipWindow();
+ }
+
+ };
+ MapController mapController = modeController.getMapController();
+ mapController.addMapChangeListener(mapChangeListener);
+ INodeSelectionListener nodeSelectionListener = new INodeSelectionListener() {
+
+ public void onSelect(NodeModel node) {
+ NodeView view = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, instance.insideComponent);
+ if(view != null && node.equals(view.getModel()))
+ return;
+ instance.hideTipWindow();
+ }
+
+ public void onDeselect(NodeModel node) {
+ }
+ };
+ mapController.addNodeSelectionListener(nodeSelectionListener);
+ modeController.addExtension(NodeTooltipManager.class, instance);
+ return instance;
+ }
+ private static void setTooltipDelays(NodeTooltipManager instance) {
+ final int initialDelay = ResourceController.getResourceController().getIntProperty(
+ TOOL_TIP_MANAGER_INITIAL_DELAY, 0);
+ instance.setInitialDelay(initialDelay);
+ }
+ private NodeTooltipManager() {
+ enterTimer = new Timer(750, new insideTimerAction());
+ enterTimer.setRepeats(false);
+ exitTimer = new Timer(150, new exitTimerAction());
+ exitTimer.setRepeats(false);
+ componentMouseListener = new ComponentMouseListener();
+ mouseOverComponent = false;
+ }
+
+ /**
+ * Specifies the initial delay value.
+ *
+ * @param milliseconds the number of milliseconds to delay
+ * (after the cursor has paused) before displaying the
+ * tooltip
+ * @see #getInitialDelay
+ */
+ public void setInitialDelay(int milliseconds) {
+ enterTimer.setInitialDelay(milliseconds);
+ }
+
+ /**
+ * Returns the initial delay value.
+ *
+ * @return an integer representing the initial delay value,
+ * in milliseconds
+ * @see #setInitialDelay
+ */
+ public int getInitialDelay() {
+ return enterTimer.getInitialDelay();
+ }
+
+
+ private void showTipWindow() {
+ Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ if (insideComponent == null || !insideComponent.isShowing() || focusOwner == null)
+ return;
+ tip = insideComponent.createToolTip();
+ tip.addComponentListener(new ComponentAdapter() {
+
+ @Override
+ public void componentResized(ComponentEvent e) {
+ final NodeTooltip component = (NodeTooltip) e.getComponent();
+ component.scrollUp();
+ component.removeComponentListener(this);
+ }
+
+ });
+
+ tip.setTipText(toolTipText);
+ final JComponent nearComponent = insideComponent;
+ focusOwnerRef = new WeakReference<Component>(focusOwner);
+ tipPopup = new JPopupMenu();
+ tipPopup.setLayout(new GridLayout(1, 1));
+ tipPopup.add(tip);
+ mouseInsideTooltipListener = new MouseInsideListener(tipPopup);
+ tipPopup.show(nearComponent, 0, nearComponent.getHeight());
+ focusOwner.requestFocusInWindow();
+ exitTimer.start();
+ }
+
+ private void hideTipWindow() {
+ insideComponent = null;
+ toolTipText = null;
+ mouseEvent = null;
+ if (tipPopup != null && tip != null) {
+ final Component component;
+ final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ if(focusOwner != null && SwingUtilities.isDescendingFrom(focusOwner, tip)){
+ component = focusOwnerRef.get();
+ }
+ else
+ component = null;
+ tipPopup.setVisible(false);
+ if(component != null)
+ component.requestFocusInWindow();
+ tipPopup = null;
+ mouseInsideTooltipListener = null;
+ tip = null;
+ focusOwnerRef = null;
+ enterTimer.stop();
+ exitTimer.stop();
+ }
+ }
+
+ /**
+ * Registers a component for tooltip management.
+ * <p>
+ * This will register key bindings to show and hide the tooltip text
+ * only if <code>component</code> has focus bindings. This is done
+ * so that components that are not normally focus traversable, such
+ * as <code>JLabel</code>, are not made focus traversable as a result
+ * of invoking this method.
+ *
+ * @param component a <code>JComponent</code> object to add
+ * @see JComponent#isFocusTraversable
+ */
+ public void registerComponent(JComponent component) {
+ component.removeMouseListener(componentMouseListener);
+ component.removeMouseMotionListener(componentMouseListener);
+ component.addMouseListener(componentMouseListener);
+ component.addMouseMotionListener(componentMouseListener);
+ }
+
+ /**
+ * Removes a component from tooltip control.
+ *
+ * @param component a <code>JComponent</code> object to remove
+ */
+ public void unregisterComponent(JComponent component) {
+ component.removeMouseListener(componentMouseListener);
+ }
+
+
+ private class ComponentMouseListener extends MouseAdapter implements MouseMotionListener{
+
+ @Override
+ public void mouseEntered(MouseEvent event) {
+ initiateToolTip(event);
+ }
+ @Override
+ public void mouseMoved(MouseEvent event) {
+ initiateToolTip(event);
+ }
+ @Override
+ public void mouseExited(MouseEvent event) {
+ if(insideComponent == event.getComponent())
+ mouseOverComponent = false;
+ }
+
+ @Override
+ public void mouseDragged(MouseEvent e) {
+ }
+ @Override
+ public void mousePressed(MouseEvent e) {
+ hideTipWindow();
+ }
+ }
+
+ private void initiateToolTip(MouseEvent event) {
+ JComponent component = (JComponent) event.getSource();
+ Window focusedWindow = FocusManager.getCurrentManager().getFocusedWindow();
+ if (focusedWindow == null) {
+ return;
+ }
+ if(insideComponent == component){
+ mouseOverComponent = true;
+ return;
+ }
+ hideTipWindow();
+ insideComponent = component;
+ mouseEvent = event;
+ if(ResourceController.getResourceController().getBooleanProperty(RESOURCES_SHOW_NODE_TOOLTIPS))
+ enterTimer.restart();
+ }
+
+ protected boolean isMouseOverComponent() {
+ return mouseOverComponent;
+ }
+
+
+ private class insideTimerAction implements ActionListener {
+ public void actionPerformed(ActionEvent e) {
+ if (insideComponent != null){
+ if (isMouseOverComponent() && !editorActive()) {
+ // Lazy lookup
+ if (toolTipText == null && mouseEvent != null) {
+ toolTipText = insideComponent.getToolTipText(mouseEvent);
+ }
+ if (toolTipText != null) {
+ showTipWindow();
+ return;
+ }
+ }
+ hideTipWindow();
+ }
+ }
+
+ private boolean editorActive() {
+ return KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() instanceof JTextComponent;
+ }
+ }
+
+ private class exitTimerAction implements ActionListener {
+ public void actionPerformed(ActionEvent e) {
+ if(tip == null || insideComponent == null){
+ return;
+ }
+ final KeyboardFocusManager currentKeyboardFocusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
+ final Window activeWindow = currentKeyboardFocusManager.getActiveWindow();
+ if(activeWindow instanceof JDialog && ((JDialog) activeWindow).isModal()
+ && ! SwingUtilities.isDescendingFrom(Controller.getCurrentController().getMapViewManager().getMapViewComponent(), activeWindow)){
+ hideTipWindow();
+ return;
+ }
+
+ if(isMouseOverTip() || isMouseOverComponent()){
+ exitTimer.restart();
+ return;
+ }
+ final Component focusOwner = currentKeyboardFocusManager.getFocusOwner();
+ if(focusOwner != null){
+ if(SwingUtilities.isDescendingFrom(focusOwner, tip)){
+ exitTimer.restart();
+ return;
+ }
+ }
+ hideTipWindow();
+ }
+
+ protected boolean isMouseOverTip() {
+ return mouseInsideTooltipListener.isMouseInside();
+ }
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/NodeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeView.java
new file mode 100644
index 0000000..639e2ee
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeView.java
@@ -0,0 +1,1610 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.Stroke;
+import java.awt.Window;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DragSource;
+import java.awt.dnd.DropTarget;
+import java.awt.dnd.DropTargetListener;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowFocusListener;
+import java.util.LinkedList;
+import java.util.ListIterator;
+
+import javax.swing.JComponent;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.ObjectRule;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.cloud.CloudController;
+import org.freeplane.features.cloud.CloudModel;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.edge.EdgeController.Rules;
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.icon.HierarchicalIcons;
+import org.freeplane.features.map.EncryptionModel;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.HideChildSubtree;
+import org.freeplane.features.map.HistoryInformationModel;
+import org.freeplane.features.map.INodeView;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeModel.NodeChangeType;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.nodestyle.NodeStyleModel.Shape;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+import org.freeplane.features.styles.AutomaticLayoutController;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.features.text.ShortenedTextModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.view.swing.map.attribute.AttributeView;
+import org.freeplane.view.swing.map.cloud.CloudView;
+import org.freeplane.view.swing.map.cloud.CloudViewFactory;
+import org.freeplane.view.swing.map.edge.AutomaticEdgeStyle;
+import org.freeplane.view.swing.map.edge.EdgeView;
+import org.freeplane.view.swing.map.edge.EdgeViewFactory;
+
+/**
+ * This class represents a single Node of a MindMap (in analogy to
+ * TreeCellRenderer).
+ */
+public class NodeView extends JComponent implements INodeView {
+ final static int ALIGN_BOTTOM = -1;
+ final static int ALIGN_CENTER = 0;
+ final static int ALIGN_TOP = 1;
+ protected final static Color dragColor = Color.lightGray;
+ public final static int DRAGGED_OVER_NO = 0;
+ public final static int DRAGGED_OVER_SIBLING = 2;
+ public final static int DRAGGED_OVER_SON = 1;
+ /** For RootNodeView. */
+ public final static int DRAGGED_OVER_SON_LEFT = 3;
+ private static final long serialVersionUID = 1L;
+ static final int SPACE_AROUND = 50;
+ public static final int MAIN_VIEWER_POSITION = 1;
+ public static final int NOTE_VIEWER_POSITION = 10;
+ final static boolean PAINT_DEBUG_BORDER;
+ static {
+ boolean paintDebugBorder = false;
+ try{
+ paintDebugBorder = Boolean.getBoolean("org.freeplane.view.swing.map.NodeView.PAINT_DEBUG_BORDER");
+ }
+ catch(Exception e){
+ }
+ PAINT_DEBUG_BORDER = paintDebugBorder;
+ }
+ static private int maxToolTipWidth;
+ private AttributeView attributeView;
+ private JComponent contentPane;
+ private MainView mainView;
+ private final MapView map;
+ private NodeModel model;
+ private NodeView preferredChild;
+ private EdgeStyle edgeStyle = EdgeStyle.EDGESTYLE_HIDDEN;
+ private Integer edgeWidth = 1;
+ private ObjectRule<Color, Rules> edgeColor = null;
+ private Color modelBackgroundColor;
+
+ private int topOverlap;
+ private int bottomOverlap;
+ private boolean isFolded;
+
+ public static final int DETAIL_VIEWER_POSITION = 2;
+
+ protected NodeView(final NodeModel model, final MapView map, final Container parent) {
+ setFocusCycleRoot(true);
+ this.model = model;
+ this.map = map;
+ this.isFolded = map.getModeController().getMapController().isFolded(model);
+ }
+
+ public boolean isFolded(){
+ return isFolded;
+ }
+
+ void addDragListener(final DragGestureListener dgl) {
+ if (dgl == null) {
+ return;
+ }
+ final DragSource dragSource = DragSource.getDefaultDragSource();
+ dragSource.createDefaultDragGestureRecognizer(getMainView(), DnDConstants.ACTION_COPY
+ | DnDConstants.ACTION_MOVE | DnDConstants.ACTION_LINK, dgl);
+ }
+
+ void addDropListener(final DropTargetListener dtl) {
+ if (dtl == null) {
+ return;
+ }
+ final DropTarget dropTarget = new DropTarget(getMainView(), dtl);
+ dropTarget.setActive(true);
+ }
+
+ private int calcShiftY(final LocationModel locationModel) {
+ try {
+ final NodeModel parent = model.getParentNode();
+ return locationModel.getShiftY().toBaseUnitsRounded() + (! getParentView().isSummary() && getMap().getModeController().hasOneVisibleChild(parent) ? getMainView().getSingleChildShift() : 0);
+ }
+ catch (final NullPointerException e) {
+ return 0;
+ }
+ }
+
+ public static int ADDITIONAL_MOUSE_SENSITIVE_AREA = 50;
+
+ @Override
+ public boolean contains(final int x, final int y) {
+ final int space = getMap().getZoomed(NodeView.SPACE_AROUND);
+ final int reducedSpace = space - ADDITIONAL_MOUSE_SENSITIVE_AREA;
+ if (x >= reducedSpace && x < getWidth() - reducedSpace && y >= reducedSpace && y < getHeight() - reducedSpace){
+ for(int i = getComponentCount()-1; i >= 0; i--){
+ final Component comp = getComponent(i);
+ if(comp.isVisible() && comp.contains(x-comp.getX(), y-comp.getY()))
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected void convertPointToMap(final Point p) {
+ UITools.convertPointToAncestor(this, p, getMap());
+ }
+
+ public void createAttributeView() {
+ if (attributeView == null && NodeAttributeTableModel.getModel(model).getNode() != null) {
+ attributeView = new AttributeView(this, true);
+ }
+ syncronizeAttributeView();
+ }
+
+ public boolean focused() {
+ return mainView.hasFocus();
+ }
+
+ public AttributeView getAttributeView() {
+ if (attributeView == null) {
+ AttributeController.getController(getMap().getModeController()).createAttributeTableModel(model);
+ attributeView = new AttributeView(this, true);
+ }
+ return attributeView;
+ }
+
+ public Color getBackgroundColor() {
+ final Color cloudColor = getCloudColor();
+ if (cloudColor != null) {
+ return cloudColor;
+ }
+ if (isRoot()) {
+ return getMap().getBackground();
+ }
+ return getParentView().getBackgroundColor();
+ }
+
+ public Color getCloudColor() {
+ final CloudModel cloudModel = getCloudModel();
+ if(cloudModel != null){
+ final Color cloudColor = cloudModel.getColor();
+ return cloudColor;
+ }
+ return null;
+ }
+
+ /**
+ * This method returns the NodeViews that are children of this node.
+ */
+ public LinkedList<NodeView> getChildrenViews() {
+ final LinkedList<NodeView> childrenViews = new LinkedList<NodeView>();
+ final Component[] components = getComponents();
+ for (int i = 0; i < components.length; i++) {
+ if (!(components[i] instanceof NodeView)) {
+ continue;
+ }
+ final NodeView view = (NodeView) components[i];
+ childrenViews.add(view);
+ }
+ return childrenViews;
+ }
+
+ public JComponent getContent() {
+ final JComponent c = contentPane == null ? mainView : contentPane;
+ assert (c == null || c.getParent() == this);
+ return c;
+ }
+
+ private Container getContentPane() {
+ if (contentPane == null) {
+ Window windowAncestor = SwingUtilities.getWindowAncestor(mainView);
+ boolean hasFocus = windowAncestor != null && windowAncestor.getMostRecentFocusOwner() == mainView;
+ contentPane = NodeViewFactory.getInstance().newContentPane(this);
+ final int index = getComponentCount() - 1;
+ remove(index);
+ contentPane.add(mainView);
+ mainView.putClientProperty("NODE_VIEW_CONTENT_POSITION", MAIN_VIEWER_POSITION);
+ if(! mainView.isVisible())
+ mainView.setVisible(true);
+ add(contentPane, index);
+ if(hasFocus)
+ restoreFocusToMainView();
+ }
+ return contentPane;
+ }
+
+ private void restoreFocusToMainView() {
+ final Window windowAncestor = SwingUtilities.getWindowAncestor(mainView);
+ if(windowAncestor.isFocused())
+ mainView.requestFocusInWindow();
+ else
+ windowAncestor.addWindowFocusListener(new WindowFocusListener() {
+ public void windowLostFocus(WindowEvent e) {
+ }
+
+ public void windowGainedFocus(WindowEvent e) {
+ mainView.requestFocusInWindow();
+ windowAncestor.removeWindowFocusListener(this);
+ }
+ });
+ }
+
+ /**
+ * Returns the coordinates occupied by the node and its children as a vector
+ * of four point per node.
+ */
+ public void getCoordinates(final LinkedList<Point> inList) {
+ getCoordinates(inList, 0, false, 0, 0);
+ }
+
+ private void getCoordinates(final LinkedList<Point> inList, int additionalDistanceForConvexHull,
+ final boolean byChildren, final int transX, final int transY) {
+ if (!isVisible()) {
+ return;
+ }
+ if (isContentVisible()) {
+ if (byChildren) {
+ final ModeController modeController = getMap().getModeController();
+ final CloudController cloudController = CloudController.getController(modeController);
+ final CloudModel cloud = cloudController.getCloud(getModel());
+ if (cloud != null) {
+ additionalDistanceForConvexHull += CloudView.getAdditionalHeigth(cloud, this) / 5;
+ }
+ }
+ final int x = transX + getContent().getX() - getDeltaX();
+ final int y = transY + getContent().getY() - getDeltaY();
+ final int width = mainView.getMainViewWidthWithFoldingMark();
+ final int heightWithFoldingMark = mainView.getMainViewHeightWithFoldingMark();
+ final int height = Math.max(heightWithFoldingMark, getContent().getHeight());
+ inList.addLast(new Point(-additionalDistanceForConvexHull + x, -additionalDistanceForConvexHull + y));
+ inList
+ .addLast(new Point(-additionalDistanceForConvexHull + x, additionalDistanceForConvexHull + y + height));
+ inList.addLast(new Point(additionalDistanceForConvexHull + x + width, additionalDistanceForConvexHull + y
+ + height));
+ inList
+ .addLast(new Point(additionalDistanceForConvexHull + x + width, -additionalDistanceForConvexHull + y));
+ }
+ for (final NodeView child : getChildrenViews()) {
+ child.getCoordinates(inList, additionalDistanceForConvexHull, true, transX + child.getX(),
+ transY + child.getY());
+ }
+ }
+
+ /** get x coordinate including folding symbol */
+ public int getDeltaX() {
+ return mainView.getDeltaX();
+ }
+
+ /** get y coordinate including folding symbol */
+ public int getDeltaY() {
+ return mainView.getDeltaY();
+ }
+
+ NodeView getFirst(Component startAfter, final boolean leftOnly, final boolean rightOnly) {
+ final Component[] components = getComponents();
+ for (int i = 0; i < components.length; i++) {
+ if (startAfter != null) {
+ if (components[i] == startAfter) {
+ startAfter = null;
+ }
+ continue;
+ }
+ if (!(components[i] instanceof NodeView)) {
+ continue;
+ }
+ final NodeView view = (NodeView) components[i];
+ if (leftOnly && !view.isLeft() || rightOnly && view.isLeft()) {
+ continue;
+ }
+ if (view.isContentVisible()) {
+ return view;
+ }
+ final NodeView child = view.getFirst(null, leftOnly, rightOnly);
+ if (child != null) {
+ return child;
+ }
+ }
+ return null;
+ }
+
+ public int getHGap() {
+ return map.getZoomed(LocationModel.getModel(model).getHGap().toBaseUnits());
+ }
+
+ private NodeView getLast(Component startBefore, final boolean leftOnly, final boolean rightOnly) {
+ final Component[] components = getComponents();
+ for (int i = components.length - 1; i >= 0; i--) {
+ if (startBefore != null) {
+ if (components[i] == startBefore) {
+ startBefore = null;
+ }
+ continue;
+ }
+ if (!(components[i] instanceof NodeView)) {
+ continue;
+ }
+ final NodeView view = (NodeView) components[i];
+ if (leftOnly && !view.isLeft() || rightOnly && view.isLeft()) {
+ continue;
+ }
+ if (view.isContentVisible()) {
+ return view;
+ }
+ final NodeView child = view.getLast(null, leftOnly, rightOnly);
+ if (child != null) {
+ return child;
+ }
+ }
+ return null;
+ }
+
+ LinkedList<NodeView> getLeft(final boolean onlyVisible) {
+ final LinkedList<NodeView> left = new LinkedList<NodeView>();
+ for (final NodeView node : getChildrenViews()) {
+ if (node == null) {
+ continue;
+ }
+ if (node.isLeft()) {
+ left.add(node);
+ }
+ }
+ return left;
+ }
+
+ /**
+ * Returns the Point where the Links should arrive the Node.
+ */
+ public Point getLinkPoint(final Point declination) {
+ int x, y;
+ Point linkPoint;
+ if (declination != null) {
+ x = getMap().getZoomed(declination.x);
+ y = getMap().getZoomed(declination.y);
+ }
+ else {
+ x = 1;
+ y = 0;
+ }
+ if (isLeft()) {
+ x = -x;
+ }
+ if (y != 0) {
+ final double ctgRect = Math.abs((double) getContent().getWidth() / getContent().getHeight());
+ final double ctgLine = Math.abs((double) x / y);
+ int absLinkX, absLinkY;
+ if (ctgRect >= ctgLine) {
+ absLinkX = Math.abs(x * getContent().getHeight() / (2 * y));
+ absLinkY = getContent().getHeight() / 2;
+ }
+ else {
+ absLinkX = getContent().getWidth() / 2;
+ absLinkY = Math.abs(y * getContent().getWidth() / (2 * x));
+ }
+ linkPoint = new Point(getContent().getWidth() / 2 + (x > 0 ? absLinkX : -absLinkX), getContent()
+ .getHeight() / 2 + (y > 0 ? absLinkY : -absLinkY));
+ }
+ else {
+ linkPoint = new Point((x > 0 ? getContent().getWidth() : 0), (getContent().getHeight() / 2));
+ }
+ linkPoint.translate(getContent().getX(), getContent().getY());
+ convertPointToMap(linkPoint);
+ return linkPoint;
+ }
+
+ public MainView getMainView() {
+ return mainView;
+ }
+
+ public Point getMainViewConnectorPoint(NodeView target) {
+ final Point relativeLocation = getRelativeLocation(target);
+ relativeLocation.x += target.getMainView().getWidth()/2;
+ relativeLocation.y += target.getMainView().getHeight()/2;
+ return mainView.getConnectorPoint(relativeLocation);
+ }
+
+ public Point getRelativeLocation(NodeView target) {
+ Component component;
+ int targetX = 0;
+ int targetY = 0;
+ for(component = target.getMainView();
+ !(this.equals(component) || component.getClass().equals(MapView.class));
+ component = component.getParent()){
+ targetX += component.getX();
+ targetY += component.getY();
+ }
+ Point relativeLocation = new Point();
+ UITools.convertPointToAncestor(mainView, relativeLocation, component);
+ relativeLocation.x = targetX - relativeLocation.x;
+ relativeLocation.y = targetY - relativeLocation.y;
+ return relativeLocation;
+ }
+
+ public MapView getMap() {
+ return map;
+ }
+
+ public int getMaxToolTipWidth() {
+ if (maxToolTipWidth == 0) {
+ try {
+ maxToolTipWidth = ResourceController.getResourceController().getIntProperty(
+ "toolTipManager.max_tooltip_width", 600);
+ }
+ catch (final NumberFormatException e) {
+ maxToolTipWidth = 600;
+ }
+ }
+ return maxToolTipWidth;
+ }
+
+ public NodeModel getModel() {
+ return model;
+ }
+
+ protected NodeView getNextSiblingSingle() {
+ LinkedList<NodeView> v = getSiblingViews();
+ final int index = v.indexOf(this);
+ for (int i = index + 1; i < v.size(); i++) {
+ final NodeView nextView = v.get(i);
+ final NodeModel node = nextView.getModel();
+ if (node.hasVisibleContent()) {
+ return nextView;
+ }
+ else if (! node.isHiddenSummary()){
+ final NodeView first = nextView.getFirst(null, false, false);
+ if (first != null) {
+ return first;
+ }
+ }
+ }
+ return this;
+ }
+
+ protected NodeView getNextVisibleSibling() {
+ NodeView sibling;
+ NodeView lastSibling = this;
+ for (sibling = this; !sibling.getModel().isRoot(); sibling = sibling.getParentView()) {
+ lastSibling = sibling;
+ sibling = sibling.getNextSiblingSingle();
+ if (sibling != lastSibling) {
+ break;
+ }
+ }
+ while (sibling.getModel().getNodeLevel(false) < getMap().getSiblingMaxLevel()) {
+ final NodeView first = sibling.getFirst(sibling.isRoot() ? lastSibling : null, this.isLeft(),
+ !this.isLeft());
+ if (first == null) {
+ break;
+ }
+ sibling = first;
+ }
+ if (sibling.isRoot()) {
+ return this;
+ }
+ return sibling;
+ }
+
+ public NodeView getParentView() {
+ final Container parent = getParent();
+ if (parent instanceof NodeView) {
+ return (NodeView) parent;
+ }
+ return null;
+ }
+
+ public NodeView getPreferredVisibleChild(final boolean getUpper, final boolean left) {
+ if (getModel().isLeaf()) {
+ return null;
+ }
+ if (getUpper) {
+ preferredChild = null;
+ }
+ if (preferredChild != null && (left == preferredChild.isLeft()) && preferredChild.getParent() == this) {
+ if (preferredChild.isContentVisible()) {
+ return preferredChild;
+ }
+ else {
+ final NodeView newSelected = preferredChild.getPreferredVisibleChild(getUpper, left);
+ if (newSelected != null) {
+ return newSelected;
+ }
+ }
+ }
+ int yGap = Integer.MAX_VALUE;
+ final NodeView baseComponent;
+ if (isContentVisible()) {
+ baseComponent = this;
+ }
+ else {
+ baseComponent = getAncestorWithVisibleContent();
+ }
+ final int ownX = baseComponent.getContent().getX() + baseComponent.getContent().getWidth() / 2;
+ final int ownY = baseComponent.getContent().getY() + baseComponent.getContent().getHeight() / 2;
+ NodeView newSelected = null;
+ for (int i = 0; i < getComponentCount(); i++) {
+ final Component c = getComponent(i);
+ if (!(c instanceof NodeView)) {
+ continue;
+ }
+ NodeView childView = (NodeView) c;
+ if (!(childView.isLeft() == left)) {
+ continue;
+ }
+ if (!childView.isContentVisible()) {
+ childView = childView.getPreferredVisibleChild(getUpper, left);
+ if (childView == null) {
+ continue;
+ }
+ }
+ if (getUpper) {
+ return childView;
+ }
+ final JComponent childContent = childView.getContent();
+ if(childContent == null)
+ continue;
+ final Point childPoint = new Point(left ? childContent.getWidth() : 0, childContent.getHeight() / 2);
+ UITools.convertPointToAncestor(childContent, childPoint, baseComponent);
+ final int dy = childPoint.y - ownY;
+ final int dx = childPoint.x - ownX;
+ final int gapToChild = dy*dy + dx*dx;
+ if (gapToChild < yGap) {
+ newSelected = childView;
+ preferredChild = (NodeView) c;
+ yGap = gapToChild;
+ }
+ else {
+ break;
+ }
+ }
+ return newSelected;
+ }
+
+ protected NodeView getPreviousSiblingSingle() {
+ LinkedList<NodeView> v = getSiblingViews();
+ final int index = v.indexOf(this);
+ for (int i = index - 1; i >= 0; i--) {
+ final NodeView nextView = v.get(i);
+ final NodeModel node = nextView.getModel();
+ if (node.hasVisibleContent()) {
+ return nextView;
+ }
+ else if (! node.isHiddenSummary()){
+ final NodeView last = nextView.getLast(null, false, false);
+ if (last != null) {
+ return last;
+ }
+ }
+ }
+ return this;
+ }
+
+ protected LinkedList<NodeView> getSiblingViews() {
+ LinkedList<NodeView> v = null;
+ final NodeView parentView = getParentView();
+ if (parentView == null){
+ UITools.errorMessage("unexpected error: node " + getMainView().getText() + " has lost its parent ");
+ }
+ if (parentView.getModel().isRoot()) {
+ if (this.isLeft()) {
+ v = (getParentView()).getLeft(true);
+ }
+ else {
+ v = (getParentView()).getRight(true);
+ }
+ }
+ else {
+ v = getParentView().getChildrenViews();
+ }
+ return v;
+ }
+
+ protected NodeView getPreviousVisibleSibling() {
+ NodeView sibling;
+ NodeView previousSibling = this;
+ for (sibling = this; !sibling.getModel().isRoot(); sibling = sibling.getParentView()) {
+ previousSibling = sibling;
+ sibling = sibling.getPreviousSiblingSingle();
+ if (sibling != previousSibling) {
+ break;
+ }
+ }
+ while (sibling.getModel().getNodeLevel(false) < getMap().getSiblingMaxLevel()) {
+ final NodeView last = sibling.getLast(sibling.isRoot() ? previousSibling : null, this.isLeft(),
+ !this.isLeft());
+ if (last == null) {
+ break;
+ }
+ sibling = last;
+ }
+ if (sibling.isRoot()) {
+ return this;
+ }
+ return sibling;
+ }
+
+ LinkedList<NodeView> getRight(final boolean onlyVisible) {
+ final LinkedList<NodeView> right = new LinkedList<NodeView>();
+ for (final NodeView node : getChildrenViews()) {
+ if (node == null) {
+ continue;
+ }
+ if (!node.isLeft()) {
+ right.add(node);
+ }
+ }
+ return right;
+ }
+
+ /**
+ * @return returns the color that should used to select the node.
+ */
+ public Color getSelectedColor() {
+ return MapView.standardSelectColor;
+ }
+
+ /**
+ * @return Returns the sHIFT.s
+ */
+ public int getShift() {
+ final LocationModel locationModel = LocationModel.getModel(model);
+ return map.getZoomed(calcShiftY(locationModel));
+ }
+
+ public Color getTextBackground() {
+ if (modelBackgroundColor != null) {
+ return modelBackgroundColor;
+ }
+ return getBackgroundColor();
+ }
+
+ public Color getTextColor() {
+ final Color color = NodeStyleController.getController(getMap().getModeController()).getColor(model);
+ return color;
+ }
+
+ /**
+ * @return Returns the VGAP.
+ */
+ public int getMinimalDistanceBetweenChildren() {
+ final double minimalDistanceBetweenChildren = map.getModeController().getExtension(LocationController.class).getMinimalDistanceBetweenChildren(model).toBaseUnits();
+ return map.getZoomed(minimalDistanceBetweenChildren);
+ }
+
+ public NodeView getAncestorWithVisibleContent() {
+ final Container parent = getParent();
+ if (!(parent instanceof NodeView)) {
+ return null;
+ }
+ final NodeView parentView = (NodeView) parent;
+ if (parentView.isContentVisible()) {
+ return parentView;
+ }
+ return parentView.getAncestorWithVisibleContent();
+ }
+
+ public NodeView getChildDistanceContainer(){
+ if (model.isVisible()) {
+ return this;
+ }
+ NodeView parentView = getParentView();
+ if(parentView == null)
+ // actually should not happen
+ return this;
+ return parentView.getChildDistanceContainer();
+
+ }
+
+ public NodeView getVisibleSummarizedOrParentView() {
+ final Container parent = getParent();
+ if (!(parent instanceof NodeView)) {
+ return null;
+ }
+ final NodeView parentView = (NodeView) parent;
+ if(isSummary()){
+ boolean startFromSummary = true;
+ LinkedList<NodeView> v = getSiblingViews();
+ final int index = v.indexOf(this);
+ for (int i = index - 1; i >= 0; i--) {
+ final NodeView nextView = v.get(i);
+ if (nextView.isContentVisible()) {
+ return nextView;
+ }
+ if(! nextView.isSummary())
+ startFromSummary = false;
+ else if(! startFromSummary)
+ break;
+
+ }
+ }
+ if (parentView.isContentVisible()) {
+ return parentView;
+ }
+ return parentView.getVisibleSummarizedOrParentView();
+ }
+
+ public int getZoomedFoldingSymbolHalfWidth() {
+ final int preferredFoldingSymbolHalfWidth = (int) ((ResourceController.getResourceController().getIntProperty("foldingsymbolwidth", 10) * map.getZoom()) / 2);
+ return preferredFoldingSymbolHalfWidth;
+ }
+
+ public int getZoomedStateSymbolHalfWidth() {
+ final int preferredFoldingSymbolHalfWidth = (int) ((ResourceController.getResourceController().getIntProperty("statesymbolwidth", 10) * map.getZoom()) / 2);
+ return preferredFoldingSymbolHalfWidth;
+ }
+
+ void addChildViews() {
+ int index = 0;
+ for (NodeModel child : getMap().getModeController().getMapController().childrenFolded(getModel())) {
+ if(child.containsExtension(HideChildSubtree.class))
+ return;
+ if(getComponentCount() <= index
+ || ! (getComponent(index) instanceof NodeView))
+ addChildView(child, index++);
+ }
+ }
+
+ /**
+ * Create views for the newNode and all his descendants, set their isLeft
+ * attribute according to this view.
+ * @param index2
+ */
+ void addChildView(final NodeModel newNode, int index) {
+ NodeViewFactory.getInstance().newNodeView(newNode, getMap(), this, index);
+ }
+
+ /* fc, 25.1.2004: Refactoring necessary: should call the model. */
+ public boolean isChildOf(final NodeView myNodeView) {
+ return getParentView() == myNodeView;
+ }
+
+ /**
+ */
+ public boolean isContentVisible() {
+ return getModel().hasVisibleContent();
+ }
+
+ public boolean isLeft() {
+ if (getMap().getLayoutType() == MapViewLayout.OUTLINE) {
+ return false;
+ }
+ return getModel().isLeft();
+ }
+
+ public boolean isParentHidden() {
+ final Container parent = getParent();
+ if (!(parent instanceof NodeView)) {
+ return false;
+ }
+ final NodeView parentView = (NodeView) parent;
+ return !parentView.isContentVisible() && ! parentView.getModel().isHiddenSummary();
+ }
+
+ /* fc, 25.1.2004: Refactoring necessary: should call the model. */
+ public boolean isParentOf(final NodeView myNodeView) {
+ return (this == myNodeView.getParentView());
+ }
+
+ public boolean isRoot() {
+ return getModel().isRoot();
+ }
+
+ public boolean isSelected() {
+ return (getMap().isSelected(this));
+ }
+
+ /* fc, 25.1.2004: Refactoring necessary: should call the model. */
+ public boolean isSiblingOf(final NodeView myNodeView) {
+ return getParentView() == myNodeView.getParentView();
+ }
+
+ public void mapChanged(final MapChangeEvent event) {
+ }
+
+ public void nodeChanged(final NodeChangeEvent event) {
+ final NodeModel node = event.getNode();
+ // is node is deleted, skip the rest.
+ if (!node.isRoot() && node.getParentNode() == null) {
+ return;
+ }
+ final Object property = event.getProperty();
+ if (property == NodeChangeType.FOLDING || property == HideChildSubtree.instance || property == EncryptionModel.class) {
+ if(map.isSelected() || property == EncryptionModel.class && ! isFolded){
+ boolean wasFolded = isFolded;
+ isFolded = getMap().getModeController().getMapController().isFolded(model);
+ if(wasFolded != isFolded || property == HideChildSubtree.instance) {
+ treeStructureChanged();
+ getMap().selectIfSelectionIsEmpty(this);
+ Shape shape = NodeStyleController.getController(getMap().getModeController()).getShape(model);
+ if (shape.equals(NodeStyleModel.Shape.combined))
+ update();
+ }
+ }
+ if(property != EncryptionModel.class)
+ return;
+ }
+ // is node is not fully initialized, skip the rest.
+ if (mainView == null) {
+ return;
+ }
+ if (property.equals(NodeModel.NODE_ICON) || property.equals(HierarchicalIcons.ICONS)) {
+ mainView.updateIcons(this);
+ revalidate();
+ return;
+ }
+
+ if (property.equals(HistoryInformationModel.class)) {
+ return;
+ }
+ update();
+ if (!isRoot())
+ getParentView().numberingChanged(node.getParentNode().getIndex(node) + 1);
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ if (isFolded) {
+ return;
+ }
+ final boolean preferredChildIsLeft = preferredChild != null && preferredChild.isLeft();
+ final NodeView node = (NodeView) getComponent(nodeDeletionEvent.index);
+ if (node == preferredChild) {
+ preferredChild = null;
+ for (int j = nodeDeletionEvent.index + 1; j < getComponentCount(); j++) {
+ final Component c = getComponent(j);
+ if (!(c instanceof NodeView)) {
+ break;
+ }
+ final NodeView candidate = (NodeView) c;
+ if (candidate.isVisible() && node.isLeft() == candidate.isLeft()) {
+ preferredChild = candidate;
+ break;
+ }
+ }
+ if (preferredChild == null) {
+ for (int j = nodeDeletionEvent.index - 1; j >= 0; j--) {
+ final Component c = getComponent(j);
+ if (!(c instanceof NodeView)) {
+ break;
+ }
+ final NodeView candidate = (NodeView) c;
+ if (candidate.isVisible() && node.isLeft() == candidate.isLeft()) {
+ preferredChild = candidate;
+ break;
+ }
+ }
+ }
+ }
+ numberingChanged(nodeDeletionEvent.index+1);
+ map.keepRootNodePosition();
+ node.remove();
+ NodeView preferred = getPreferredVisibleChild(false, preferredChildIsLeft);
+ if (preferred == null) {
+ preferred = this;
+ }
+ revalidate();
+ if(getMap().getSelected() == null)
+ getMap().selectVisibleAncestorOrSelf(preferred);
+ }
+
+ public void onNodeInserted(final NodeModel parent, final NodeModel child, final int index) {
+ assert parent == model;
+ if (isFolded) {
+ return;
+ }
+ addChildView(child, index);
+ numberingChanged(index + 1);
+ revalidate();
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ // updates children, starting from firstChangedIndex, if necessary.
+ private void numberingChanged(int firstChangedIndex) {
+ final TextController textController = TextController.getController(getMap().getModeController());
+ if (firstChangedIndex > 0 || textController.getNodeNumbering(getModel())) {
+ final Component[] components = getComponents();
+ for (int i = firstChangedIndex; i < components.length; i++) {
+ if (components[i] instanceof NodeView) {
+ final NodeView view = (NodeView) components[i];
+ final MainView childMainView = view.getMainView();
+ if(childMainView != null){
+ childMainView.updateText(view.getModel());
+ view.numberingChanged(0);
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.JComponent#paint(java.awt.Graphics)
+ */
+ @Override
+ public void paintComponent(final Graphics g) {
+ if(getMainView() == null)
+ return;
+ final PaintingMode paintingMode = map.getPaintingMode();
+ if (isContentVisible()) {
+ final Graphics2D g2 = (Graphics2D) g;
+ final ModeController modeController = map.getModeController();
+ final Object renderingHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
+ switch (paintingMode) {
+ case CLOUDS:
+ modeController.getController().getMapViewManager().setEdgesRenderingHint(g2);
+ final boolean isRoot = isRoot();
+ if (isRoot) {
+ paintCloud(g);
+ }
+ paintClouds(g2);
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
+ break;
+ case NODES:
+ g2.setStroke(MainView.DEF_STROKE);
+ modeController.getController().getMapViewManager().setEdgesRenderingHint(g2);
+ paintEdges(g2, this);
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
+ break;
+ default:
+ break;
+ }
+ }
+ if (PAINT_DEBUG_BORDER && isSelected() && paintingMode.equals(PaintingMode.SELECTED_NODES)){
+ final int spaceAround = getZoomed(SPACE_AROUND);
+ g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
+ g.drawRect(spaceAround - 1, spaceAround - 1, getWidth() - 2 * spaceAround, getHeight() - 2 * spaceAround);
+ }
+ }
+
+ @Override
+ public void paint(Graphics g) {
+ super.paint(g);
+ paintDecoration((Graphics2D) g);
+ }
+
+ private void paintCloud(final Graphics g) {
+ if (!isContentVisible()) {
+ return;
+ }
+ final CloudModel cloudModel = getCloudModel();
+ if (cloudModel == null) {
+ return;
+ }
+ final CloudView cloud = new CloudViewFactory().createCloudView(cloudModel, this);
+ cloud.paint(g);
+ }
+
+ private void paintClouds(final Graphics2D g) {
+ for (int i = getComponentCount() - 1; i >= 0; i--) {
+ final Component component = getComponent(i);
+ if (!(component instanceof NodeView)) {
+ continue;
+ }
+ final NodeView nodeView = (NodeView) component;
+ final Point p = new Point();
+ UITools.convertPointToAncestor(nodeView, p, this);
+ g.translate(p.x, p.y);
+ if (nodeView.isContentVisible()) {
+ nodeView.paintCloud(g);
+ }
+ else {
+ nodeView.paintClouds(g);
+ }
+ g.translate(-p.x, -p.y);
+ }
+ }
+
+ private void paintEdges(final Graphics2D g, NodeView source) {
+ SummaryEdgePainter summaryEdgePainter = new SummaryEdgePainter(this, isRoot() ? true : isLeft());
+ SummaryEdgePainter rightSummaryEdgePainter = isRoot() ? new SummaryEdgePainter(this, false) : null;
+ final int start;
+ final int end;
+ final int step;
+ if (getMap().getLayoutType() == MapViewLayout.OUTLINE){
+ start = getComponentCount() - 1;
+ end = -1;
+ step = -1;
+ }
+ else{
+ start = 0;
+ end = getComponentCount();
+ step = 1;
+ }
+ for (int i = start; i != end; i+=step) {
+ final Component component = getComponent(i);
+ if (!(component instanceof NodeView)) {
+ continue;
+ }
+ final NodeView nodeView = (NodeView) component;
+ if (getMap().getLayoutType() != MapViewLayout.OUTLINE) {
+ SummaryEdgePainter activePainter = nodeView.isLeft() || !isRoot() ? summaryEdgePainter : rightSummaryEdgePainter;
+ activePainter.addChild(nodeView);
+ if(activePainter.paintSummaryEdge(g, source, nodeView)){
+ if(! nodeView.isContentVisible()){
+ final Rectangle bounds = SwingUtilities.convertRectangle(this, nodeView.getBounds(), source);
+ final Graphics cg = g.create(bounds.x, bounds.y, bounds.width, bounds.height);
+ try{
+ nodeView.paintEdges((Graphics2D) cg, nodeView);
+ }
+ finally{
+ cg.dispose();
+ }
+
+ }
+ continue;
+ }
+ }
+ if (nodeView.isContentVisible()) {
+ final EdgeView edge = EdgeViewFactory.getInstance().getEdge(source, nodeView, source);
+ edge.paint(g);
+ }
+ else {
+ nodeView.paintEdges(g, source);
+ }
+ }
+ }
+
+
+ int getSpaceAround() {
+ return getZoomed(NodeView.SPACE_AROUND);
+ }
+
+ public int getZoomed(int x) {
+ return getMap().getZoomed(x);
+ }
+
+ private void paintDecoration(final Graphics2D g) {
+ final PaintingMode paintingMode = map.getPaintingMode();
+ if(! (getMainView() != null &&
+ ( paintingMode.equals(PaintingMode.NODES) && !isSelected() || paintingMode.equals(PaintingMode.SELECTED_NODES) && isSelected())
+ && isContentVisible()))
+ return;
+ final Graphics2D g2 = g;
+ final ModeController modeController = map.getModeController();
+ final Object renderingHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
+ g2.setStroke(MainView.DEF_STROKE);
+ modeController.getController().getMapViewManager().setEdgesRenderingHint(g2);
+ final Point origin = new Point();
+ UITools.convertPointToAncestor(mainView, origin, this);
+ g.translate(origin.x, origin.y);
+ mainView.paintDecoration(this, g);
+ g.translate(-origin.x, -origin.y);
+ final FilterController filterController = FilterController.getController(getMap().getModeController().getController());
+ if(filterController.isNodeHighlighted(getModel())){
+ final Color oldColor = g.getColor();
+ final Stroke oldStroke = g.getStroke();
+ g.setColor(Color.MAGENTA);
+ g.setStroke(getMap().getStandardSelectionStroke());
+ final JComponent content = getContent();
+ Point contentLocation = content.getLocation();
+ final int arcWidth = 8;
+ g.drawRoundRect(contentLocation.x - arcWidth, contentLocation.y - arcWidth, content.getWidth() + 2 * arcWidth,
+ content.getHeight() + 2 * arcWidth, 15, 15);
+ g.setColor(oldColor);
+ g.setStroke(oldStroke);
+ }
+ g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
+ }
+
+ /**
+ * This is a bit problematic, because getChildrenViews() only works if model
+ * is not yet removed. (So do not _really_ delete the model before the view
+ * removed (it needs to stay in memory)
+ */
+ void remove() {
+ for (final ListIterator<NodeView> e = getChildrenViews().listIterator(); e.hasNext();) {
+ e.next().remove();
+ }
+ getMap().deselect(this);
+ getMap().getModeController().onViewRemoved(this);
+ removeFromMap();
+ if (attributeView != null) {
+ attributeView.viewRemoved();
+ }
+ getModel().removeViewer(this);
+ }
+
+ protected void removeFromMap() {
+ setFocusCycleRoot(false);
+ Container parent = getParent();
+ parent.remove(this);
+ }
+
+ private void repaintEdge(final NodeView target) {
+ if (target.getMap().getLayoutType() == MapViewLayout.OUTLINE){
+ target.getAncestorWithVisibleContent().repaint();
+ return;
+ }
+ final Point relativeLocation = getRelativeLocation(target);
+ final MainView targetMainView = target.getMainView();
+ relativeLocation.x += targetMainView.getWidth()/2;
+ relativeLocation.y += targetMainView.getHeight()/2;
+ final Point inPoint = mainView.getConnectorPoint(relativeLocation);
+ UITools.convertPointToAncestor(targetMainView, inPoint, this);
+
+ relativeLocation.x -= targetMainView.getWidth()/2;
+ relativeLocation.y -= targetMainView.getHeight()/2;
+ relativeLocation.x = - relativeLocation.x + mainView.getWidth()/2;
+ relativeLocation.y = - relativeLocation.y + mainView.getHeight()/2;
+ final Point outPoint = targetMainView.getConnectorPoint(relativeLocation);
+ UITools.convertPointToAncestor(getMainView(), outPoint, this);
+
+ final int x = Math.min(inPoint.x, outPoint.x);
+ final int y = Math.min(inPoint.y, outPoint.y);
+ final int w = Math.abs(inPoint.x - outPoint.x);
+ final int h = Math.abs(inPoint.y - outPoint.y);
+ final int EXTRA = 50;
+ repaint(x - EXTRA, y - EXTRA, w + EXTRA * 2, h + EXTRA * 2);
+ }
+
+ void repaintSelected() {
+ // return if main view was not set
+ if (mainView == null) {
+ return;
+ }
+ // do not repaint removed nodes
+ if (model.getParentNode() == null && !model.isRoot()) {
+ return;
+ }
+ if (getEdgeStyle().equals(EdgeStyle.EDGESTYLE_HIDDEN)) {
+ final NodeView visibleParentView = getAncestorWithVisibleContent();
+ if (visibleParentView != null) {
+ visibleParentView.repaintEdge(this);
+ }
+ }
+ final JComponent content = getContent();
+ final int EXTRA = 20;
+ final int x = content.getX() - EXTRA;
+ final int y = content.getY() - EXTRA;
+ repaint(x, y, content.getWidth() + EXTRA * 2, content.getHeight() + EXTRA * 2);
+ }
+
+ @Override
+ public boolean requestFocusInWindow() {
+ if (mainView == null) {
+ return false;
+ }
+ if (super.requestFocusInWindow() && mainView.requestFocusInWindow()) {
+ getMap().scrollNodeToVisible(this);
+ Controller.getCurrentController().getViewController().addObjectTypeInfo(getModel().getUserObject());
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void requestFocus() {
+ if (mainView == null) {
+ return;
+ }
+ getMap().scrollNodeToVisible(this);
+ Controller.getCurrentController().getViewController().addObjectTypeInfo(getModel().getUserObject());
+ super.requestFocus();
+ mainView.requestFocus();
+ }
+
+ void setMainView(final MainView newMainView) {
+ if (contentPane != null) {
+ assert (contentPane.getParent() == this);
+ if (mainView != null)
+ removeContent(MAIN_VIEWER_POSITION);
+ addContent(newMainView, MAIN_VIEWER_POSITION);
+ assert (contentPane.getParent() == this);
+ }
+ else if (mainView != null) {
+ final Container c = mainView.getParent();
+ int i;
+ for (i = c.getComponentCount() - 1; i >= 0 && mainView != c.getComponent(i); i--) {
+ ;
+ }
+ c.remove(i);
+ c.add(newMainView, i);
+ }
+ else {
+ add(newMainView);
+ }
+ mainView = newMainView;
+ ModeController modeController = getMap().getModeController();
+ if(modeController.canEdit(getModel())) {
+ final IUserInputListenerFactory userInputListenerFactory = modeController
+ .getUserInputListenerFactory();
+ mainView.addMouseListener(userInputListenerFactory.getNodeMouseMotionListener());
+ mainView.addMouseMotionListener(userInputListenerFactory.getNodeMouseMotionListener());
+ mainView.addMouseWheelListener(userInputListenerFactory.getNodeMouseWheelListener());
+ mainView.addKeyListener(userInputListenerFactory.getNodeKeyListener());
+ addDragListener(userInputListenerFactory.getNodeDragListener());
+ addDropListener(userInputListenerFactory.getNodeDropTargetListener());
+ }
+ }
+
+ protected void setModel(final NodeModel model) {
+ this.model = model;
+ }
+
+ public void setPreferredChild(final NodeView view) {
+ if(view != null && ! SummaryNode.isSummaryNode(view.getModel()))
+ preferredChild = view;
+ final Container parent = this.getParent();
+ if (view == null) {
+ return;
+ }
+ else if (parent instanceof NodeView) {
+ ((NodeView) parent).setPreferredChild(this);
+ }
+ }
+
+ /**
+ */
+ public void setText(final String string) {
+ mainView.setText(string);
+ }
+
+
+ void syncronizeAttributeView() {
+ if (attributeView != null) {
+ attributeView.syncronizeAttributeView();
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see java.awt.Component#toString()
+ */
+ @Override
+ public String toString() {
+ return getModel().toString() + ", " + super.toString();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * javax.swing.event.TreeModelListener#treeStructureChanged(javax.swing.
+ * event.TreeModelEvent)
+ */
+ private void treeStructureChanged() {
+ map.keepRootNodePosition();
+ for (NodeView child : getChildrenViews()) {
+ child.remove();
+ }
+ addChildViews();
+ map.revalidateSelecteds();
+ revalidate();
+ }
+
+ public void update() {
+ updateShape();
+ updateEdge();
+ if (!isContentVisible()) {
+ mainView.setVisible(false);
+ return;
+ }
+ mainView.setVisible(true);
+ mainView.updateTextColor(this);
+ mainView.updateFont(this);
+ mainView.updateTextAlign(this);
+ MapView map = getMap();
+ final ModeController modeController = map.getModeController();
+ final NodeStyleController nsc = NodeStyleController.getController(modeController);
+ final int minNodeWidth = map.getZoomed(nsc.getMinWidth(getModel()).toBaseUnits());
+ final int maxNodeWidth = map.getZoomed(nsc.getMaxWidth(getModel()).toBaseUnits());
+ mainView.setMinimumWidth(minNodeWidth);
+ mainView.setMaximumWidth(maxNodeWidth);
+
+ createAttributeView();
+ if (attributeView != null) {
+ attributeView.update();
+ }
+ final boolean textShortened = isShortened();
+
+ if(! textShortened){
+ final NodeViewFactory nodeViewFactory = NodeViewFactory.getInstance();
+ nodeViewFactory.updateDetails(this, minNodeWidth, maxNodeWidth);
+ nodeViewFactory.updateNoteViewer(this, minNodeWidth, maxNodeWidth);
+ if (contentPane != null) {
+ final int componentCount = contentPane.getComponentCount();
+ for (int i = 1; i < componentCount; i++) {
+ final Component component = contentPane.getComponent(i);
+ if (component instanceof JComponent) {
+ ((JComponent) component).revalidate();
+ }
+ }
+ }
+ }
+ updateShortener(getModel(), textShortened);
+ mainView.updateIcons(this);
+ mainView.updateText(getModel());
+ updateCloud();
+ modelBackgroundColor = NodeStyleController.getController(getMap().getModeController()).getBackgroundColor(model);
+ revalidate();
+ repaint();
+ }
+
+ public boolean isShortened() {
+ final ModeController modeController = getMap().getModeController();
+ final TextController textController = TextController.getController(modeController);
+ final boolean textShortened = textController.isMinimized(getModel());
+ return textShortened;
+ }
+
+ private void updateEdge() {
+ final EdgeController edgeController = EdgeController.getController(getMap().getModeController());
+ this.edgeStyle = edgeController.getStyle(model, false);
+ final NodeModel realNode = SummaryNode.getRealNode(model);
+ final Integer newWidth = edgeController.getWidth(realNode, false);
+ this.edgeWidth = newWidth;
+ final ObjectRule<Color, Rules> newColor = edgeController.getColorRule(realNode);
+ this.edgeColor = newColor;
+ final NodeModel parentNode = model.getParentNode();
+ if(parentNode != null && SummaryNode.isSummaryNode(parentNode))
+ getParentView().updateEdge();
+ }
+
+ public EdgeStyle getEdgeStyle() {
+ if(edgeStyle != null)
+ return edgeStyle;
+ final NodeView parentView = getParentView();
+ if(parentView != null)
+ return parentView.getEdgeStyle();
+ return EdgeStyle.values()[0];
+ }
+
+ public int getEdgeWidth() {
+ if(edgeWidth != null)
+ return edgeWidth;
+ final NodeView parentView = getParentView();
+ if(parentView != null)
+ return parentView.getEdgeWidth();
+ return 1;
+ }
+
+ public Color getEdgeColor() {
+ if(edgeColor.hasValue())
+ return edgeColor.getValue();
+ Rules rule = edgeColor.getRule();
+ if(rule == EdgeController.Rules.BY_COLUMN){
+ final Color color = new AutomaticEdgeStyle(this).getColor();
+ edgeColor.setCache(color);
+ return color;
+ }
+ final NodeModel parentNode = model.getParentNode();
+ if(rule == EdgeController.Rules.BY_BRANCH && parentNode.isRoot()
+ || rule == EdgeController.Rules.BY_LEVEL){
+ final int index;
+ if (rule == EdgeController.Rules.BY_BRANCH)
+ index = parentNode.getIndex(model) + 1;
+ else
+ index = model.getNodeLevel(false) + (model.isHiddenSummary() ? 1 : 0);
+ ModeController modeController = getMap().getModeController();
+ AutomaticLayoutController automaticLayoutController = modeController.getExtension(AutomaticLayoutController.class);
+ NodeModel styleNode = automaticLayoutController.getStyleNode(map.getModel(), index, true);
+ if(styleNode != null){
+ Color color = modeController.getExtension(EdgeController.class).getColor(styleNode);
+ edgeColor.setCache(color);
+ return color;
+ }
+ }
+ else
+ if(rule == EdgeController.Rules.BY_PARENT) {
+ final NodeView parentView = getParentView();
+ if (parentView != null) {
+ final Color color = parentView.getEdgeColor();
+ return color;
+ }
+ }
+ return Color.GRAY;
+ }
+
+ private void updateCloud() {
+ final CloudModel cloudModel = CloudController.getController(getMap().getModeController()).getCloud(model);
+ putClientProperty(CloudModel.class, cloudModel);
+ }
+
+ public CloudModel getCloudModel() {
+ return (CloudModel) getClientProperty(CloudModel.class);
+ }
+
+ private void updateShortener(NodeModel nodeModel, boolean textShortened) {
+ final boolean componentsVisible = !textShortened;
+ setContentComponentVisible(componentsVisible);
+ }
+
+ private void setContentComponentVisible(final boolean componentsVisible) {
+ if(contentPane == null)
+ return;
+ final Component[] components = getContentPane().getComponents();
+ int index;
+ for (index = 0; index < components.length; index++) {
+ final Component component = components[index];
+ if (component == getMainView()) {
+ continue;
+ }
+ if (component.isVisible() != componentsVisible) {
+ component.setVisible(componentsVisible);
+ }
+ }
+ }
+
+ public void updateAll() {
+ update();
+ invalidate();
+ for (final NodeView child : getChildrenViews()) {
+ child.updateAll();
+ }
+ }
+
+ private void updateShape() {
+ final ShapeConfigurationModel newShape = NodeStyleController.getController(getMap().getModeController()).getShapeConfiguration(model);
+ final ShapeConfigurationModel oldShape;
+ if(mainView != null)
+ oldShape = mainView.getShapeConfiguration();
+ else
+ oldShape = null;
+ if (mainView != null && oldShape.equals(newShape))
+ return;
+ final MainView newMainView = NodeViewFactory.getInstance().newMainView(this);
+ if(newMainView.getShapeConfiguration().equals(oldShape))
+ return;
+ setMainView(newMainView);
+ if (map.getSelected() == this) {
+ requestFocusInWindow();
+ }
+ }
+
+ boolean useSelectionColors() {
+ return isSelected() && !MapView.standardDrawRectangleForSelection && !map.isPrinting();
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ @Override
+ protected void validateTree() {
+ super.validateTree();
+ }
+
+ public void addContent(JComponent component, int pos) {
+ component.putClientProperty("NODE_VIEW_CONTENT_POSITION", pos);
+ final Container contentPane = getContentPane();
+ for (int i = 0; i < contentPane.getComponentCount(); i++) {
+ JComponent content = (JComponent) contentPane.getComponent(i);
+ if (content == null)
+ throw new RuntimeException("component " + i + "is null");
+ final Object clientProperty = content.getClientProperty("NODE_VIEW_CONTENT_POSITION");
+ if (clientProperty == null)
+ throw new RuntimeException("NODE_VIEW_CONTENT_POSITION not set on component " + content.toString() + i
+ + "/" + contentPane.getComponentCount());
+ if (pos < (Integer) clientProperty) {
+ contentPane.add(component, i);
+ return;
+ }
+ }
+ contentPane.add(component);
+ }
+
+ public JComponent removeContent(int pos) {
+ return removeContent(pos, true);
+ }
+
+ private JComponent removeContent(int pos, boolean remove) {
+ if (contentPane == null)
+ return null;
+ for (int i = 0; i < contentPane.getComponentCount(); i++) {
+ JComponent component = (JComponent) contentPane.getComponent(i);
+ Integer contentPos = (Integer) component.getClientProperty("NODE_VIEW_CONTENT_POSITION");
+ if (contentPos == null) {
+ continue;
+ }
+ if (contentPos == pos) {
+ if (remove) {
+ component.putClientProperty("NODE_VIEW_CONTENT_POSITION", null);
+ contentPane.remove(i);
+ }
+ return component;
+ }
+ if (contentPos > pos) {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ public JComponent getContent(int pos) {
+ return removeContent(pos, false);
+ }
+
+ public boolean isSummary() {
+ return SummaryNode.isSummaryNode(getModel());
+ }
+
+ public boolean isFirstGroupNode() {
+ return SummaryNode.isFirstGroupNode(getModel());
+ }
+
+ public boolean isFree() {
+ return FreeNode.isFreeNode(getModel());
+ }
+
+ int getTopOverlap() {
+ return topOverlap;
+ }
+
+ void setTopOverlap(int topOverlap) {
+ this.topOverlap = topOverlap;
+ }
+
+ int getBottomOverlap() {
+ return bottomOverlap;
+ }
+
+ void setBottomOverlap(int bottomOverlap) {
+ this.bottomOverlap = bottomOverlap;
+ }
+
+ @Override
+ public void setBounds(int x, int y, int width, int height) {
+ Rules rule = edgeColor.getRule();
+ if(EdgeController.Rules.BY_PARENT != rule)
+ edgeColor.resetCache();
+ super.setBounds(x, y, width, height);
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/NodeViewFactory.java b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeViewFactory.java
new file mode 100644
index 0000000..3d5e64e
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeViewFactory.java
@@ -0,0 +1,286 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Graphics;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.ui.ColoredIconCreator;
+import org.freeplane.core.ui.IMouseListener;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.text.DetailTextModel;
+import org.freeplane.view.swing.ui.DefaultMapMouseListener;
+import org.freeplane.view.swing.ui.DetailsViewMouseListener;
+
+class NodeViewFactory {
+ private static NodeViewFactory factory;
+
+ static NodeViewFactory getInstance() {
+ if (NodeViewFactory.factory == null) {
+ NodeViewFactory.factory = new NodeViewFactory();
+ }
+ return NodeViewFactory.factory;
+ }
+
+ private NodeViewFactory() {
+ }
+
+ private void fireNodeViewCreated(final NodeView newView) {
+ newView.getMap().getModeController().onViewCreated(newView);
+ }
+
+ JComponent newContentPane(final NodeView view) {
+ return new ContentPane();
+ }
+
+ MainView newMainView(final NodeView node) {
+ ShapeConfigurationModel shapeConfiguration = shapeConfiguration(node);
+ final MainView oldView = node.getMainView();
+ if(oldView != null && oldView.getShapeConfiguration().equals(shapeConfiguration))
+ return oldView;
+ final ModeController modeController = node.getMap().getModeController();
+ final MainView view;
+
+ switch(shapeConfiguration.getShape()){
+ case fork:
+ view = new ForkMainView();
+ break;
+ case bubble:
+ view = new BubbleMainView(shapeConfiguration);
+ break;
+ case oval:
+ view = new OvalMainView(shapeConfiguration);
+ break;
+ case rectangle:
+ view = new RectangleMainView(shapeConfiguration);
+ break;
+ case wide_hexagon:
+ view = new WideHexagonMainView(shapeConfiguration);
+ break;
+ case narrow_hexagon:
+ view = new NarrowHexagonMainView(shapeConfiguration);
+ break;
+ default:
+ System.err.println("Tried to create a NodeView of unknown Style " + String.valueOf(shapeConfiguration.getShape()));
+ view = new ForkMainView();
+
+ }
+
+ NodeTooltipManager toolTipManager = NodeTooltipManager.getSharedInstance(modeController);
+ toolTipManager.registerComponent(view);
+ return view;
+ }
+
+ private ShapeConfigurationModel shapeConfiguration(NodeView node) {
+ final ModeController modeController = node.getMap().getModeController();
+ final NodeModel model = node.getModel();
+ ShapeConfigurationModel shapeConfiguration = NodeStyleController.getController(modeController).getShapeConfiguration(model);
+ if (shapeConfiguration.getShape().equals(NodeStyleModel.Shape.combined)) {
+ if (node.isFolded()) {
+ shapeConfiguration= shapeConfiguration.withShape(NodeStyleModel.Shape.bubble);
+ }
+ else {
+ shapeConfiguration = ShapeConfigurationModel.FORK;
+ }
+ }
+ else while(shapeConfiguration.getShape().equals(NodeStyleModel.Shape.as_parent)){
+ NodeView parent = node.getParentView();
+ if (parent == null)
+ shapeConfiguration = ShapeConfigurationModel.DEFAULT_ROOT_OVAL;
+ else if (parent.getParentView() == null)
+ shapeConfiguration = ShapeConfigurationModel.FORK;
+ else
+ shapeConfiguration = parent.getMainView().getShapeConfiguration();
+ }
+ return shapeConfiguration;
+ }
+
+ /**
+ * Factory method which creates the right NodeView for the model.
+ */
+ NodeView newNodeView(final NodeModel model, final MapView map, final Container parent, final int index) {
+ final NodeView newView = new NodeView(model, map, parent);
+ parent.add(newView, index);
+ newView.setMainView(newMainView(newView));
+ if(map.isDisplayable())
+ updateNewView(newView);
+ else
+ newView.addHierarchyListener(new HierarchyListener() {
+ public void hierarchyChanged(HierarchyEvent e) {
+ NodeView view = (NodeView) e.getComponent();
+ if(displayed(view, e)){
+ view.removeHierarchyListener(this);
+ updateNewView(view);
+ }
+ else if(removed(view, e)){
+ view.removeHierarchyListener(this);
+ }
+ }
+
+ private boolean removed(NodeView view, HierarchyEvent e) {
+ return 0 != (e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) && view.getParent() == null;
+ }
+
+ private boolean displayed(NodeView view, HierarchyEvent e) {
+ return 0 != (e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) && view.isDisplayable();
+ }
+ });
+ return newView;
+ }
+
+ private void updateNewView(final NodeView newView) {
+ newView.getModel().addViewer(newView);
+ newView.setLayout(SelectableLayout.getInstance());
+ newView.update();
+ fireNodeViewCreated(newView);
+ newView.addChildViews();
+ }
+
+ private final Icon coloredIcon = createColoredIcon();
+ private static final IMouseListener DETAILS_MOUSE_LISTENER = new DetailsViewMouseListener();
+ private static final IMouseListener NOTE_MOUSE_LISTENER = new NoteViewMouseListener();
+
+ public ZoomableLabel createNoteViewer() {
+ final ZoomableLabel label = new ZoomableLabel();
+ label.addMouseListener(NOTE_MOUSE_LISTENER);
+ label.addMouseMotionListener(NOTE_MOUSE_LISTENER);
+ label.setIcon(coloredIcon);
+ label.setVerticalTextPosition(JLabel.TOP);
+ return label;
+ }
+
+ static ColoredIconCreator coloredIconCreator = new ColoredIconCreator(NoteController.bwNoteIconUrl, Color.BLACK);
+
+ private Icon createColoredIcon() {
+ return new Icon() {
+ public void paintIcon(Component c, Graphics g, int x, int y) {
+ NodeView nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, c);
+ if(nodeView == null)
+ return;
+ final Color iconColor = nodeView.getEdgeColor();
+ coloredIconCreator.createColoredIcon(iconColor).paintIcon(c, g, x, y);
+ }
+
+ public int getIconWidth() {
+ return coloredIconCreator.createColoredIcon(Color.BLACK).getIconWidth();
+ }
+
+ public int getIconHeight() {
+ return coloredIconCreator.createColoredIcon(Color.BLACK).getIconHeight();
+ }
+ };
+ }
+
+
+ void updateNoteViewer(NodeView nodeView, int minNodeWidth, int maxNodeWidth) {
+ ZoomableLabel note = (ZoomableLabel) nodeView.getContent(NodeView.NOTE_VIEWER_POSITION);
+ String oldText = note != null ? note.getText() : null;
+ String newText = null;
+ if (nodeView.getMap().showNotes()) {
+ final NodeModel model = nodeView.getModel();
+ final NoteModel extension = NoteModel.getNote(model);
+ if (extension != null)
+ newText = extension.getHtml();
+ }
+ if (oldText == null && newText == null) {
+ return;
+ }
+ final ZoomableLabel view;
+ if (oldText != null && newText != null) {
+ view = (ZoomableLabel) nodeView.getContent(NodeView.NOTE_VIEWER_POSITION);
+ }
+ else if (oldText == null && newText != null) {
+ view = NodeViewFactory.getInstance().createNoteViewer();
+ nodeView.addContent(view, NodeView.NOTE_VIEWER_POSITION);
+ }
+ else {
+ assert (oldText != null && newText == null);
+ nodeView.removeContent(NodeView.NOTE_VIEWER_POSITION);
+ return;
+ }
+ final MapView map = nodeView.getMap();
+ view.setFont(map.getNoteFont());
+ view.setForeground(map.getNoteForeground());
+ view.setBackground(map.getNoteBackground());
+ view.setHorizontalAlignment(map.getNoteHorizontalAlignment());
+ view.updateText(newText);
+ view.setMinimumWidth(minNodeWidth);
+ view.setMaximumWidth(maxNodeWidth);
+ view.revalidate();
+ map.repaint();
+
+ }
+
+ void updateDetails(NodeView nodeView, int minNodeWidth, int maxNodeWidth) {
+ final DetailTextModel detailText = DetailTextModel.getDetailText(nodeView.getModel());
+ if (detailText == null) {
+ nodeView.removeContent(NodeView.DETAIL_VIEWER_POSITION);
+ return;
+ }
+ DetailsView detailContent = (DetailsView) nodeView.getContent(NodeView.DETAIL_VIEWER_POSITION);
+ if (detailContent == null) {
+ detailContent = createDetailView();
+ nodeView.addContent(detailContent, NodeView.DETAIL_VIEWER_POSITION);
+ }
+ final MapView map = nodeView.getMap();
+ if (detailText.isHidden()) {
+ final ArrowIcon icon = new ArrowIcon(nodeView, true);
+ detailContent.setIcon(icon);
+ detailContent.setBackground(null);
+ detailContent.updateText("");
+ }
+ else {
+ detailContent.setFont(map.getDetailFont());
+ detailContent.setHorizontalAlignment(map.getDetailHorizontalAlignment());
+ detailContent.setIcon(new ArrowIcon(nodeView, false));
+ detailContent.updateText(detailText.getHtml());
+ detailContent.setForeground(map.getDetailForeground());
+ detailContent.setBackground(map.getDetailBackground());
+ }
+ detailContent.setMinimumWidth(minNodeWidth);
+ detailContent.setMaximumWidth(maxNodeWidth);
+ detailContent.revalidate();
+ map.repaint();
+ }
+
+ private DetailsView createDetailView() {
+ DetailsView detailContent = new DetailsView();
+ final DefaultMapMouseListener mouseListener = new DefaultMapMouseListener();
+ detailContent.addMouseMotionListener(mouseListener);
+ detailContent.addMouseMotionListener(DETAILS_MOUSE_LISTENER);
+ detailContent.addMouseListener(DETAILS_MOUSE_LISTENER);
+ return detailContent;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/NodeViewLayout.java b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeViewLayout.java
new file mode 100644
index 0000000..92c62e7
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/NodeViewLayout.java
@@ -0,0 +1,60 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+
+/**
+ * @author Dimitry Polivaev
+ */
+public class NodeViewLayout implements INodeViewLayout{
+ static private NodeViewLayout instance = null;
+
+ static INodeViewLayout getInstance() {
+ if (NodeViewLayout.instance == null) {
+ NodeViewLayout.instance = new NodeViewLayout();
+ }
+ return NodeViewLayout.instance;
+ }
+
+ public void layoutContainer(final Container c) {
+ NodeView view = (NodeView) c;
+ if(view.getContent() != null){
+ final VerticalNodeViewLayoutStrategy layoutData = new VerticalNodeViewLayoutStrategy(view);
+ layoutData.calculateLayoutData();
+ }
+ }
+
+ public void addLayoutComponent(String name, Component comp) {
+ }
+
+ public void removeLayoutComponent(Component comp) {
+ }
+
+ public Dimension preferredLayoutSize(Container parent) {
+ return ImmediatelyValidatingPreferredSizeCalculator.INSTANCE.preferredLayoutSize(parent);
+ }
+
+ public Dimension minimumLayoutSize(Container parent) {
+ return INodeViewLayout.ZERO_DIMENSION;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/NoteViewMouseListener.java b/freeplane/src/main/java/org/freeplane/view/swing/map/NoteViewMouseListener.java
new file mode 100644
index 0000000..8247658
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/NoteViewMouseListener.java
@@ -0,0 +1,27 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.event.MouseEvent;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.mindmapmode.MNoteController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.view.swing.ui.LinkNavigatorMouseListener;
+import org.freeplane.view.swing.ui.NodeSelector;
+
+public class NoteViewMouseListener extends LinkNavigatorMouseListener {
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if(e.getClickCount() == 2) {
+ TextController controller = TextController.getController();
+ if(controller.canEdit()){
+ NodeModel node = new NodeSelector().getRelatedNodeView(e).getModel();
+ ((MNoteController) NoteController.getController()).editNoteInDialog(node);
+ }
+ }
+ else
+ super.mouseClicked(e);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/OutlineLayout.java b/freeplane/src/main/java/org/freeplane/view/swing/map/OutlineLayout.java
new file mode 100644
index 0000000..3fd8e07
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/OutlineLayout.java
@@ -0,0 +1,116 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+
+import javax.swing.JComponent;
+
+import org.freeplane.core.resources.ResourceController;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.08.2009
+ */
+public class OutlineLayout implements INodeViewLayout {
+
+ static private final INodeViewLayout instance = new OutlineLayout();
+
+ static INodeViewLayout getInstance() {
+ return OutlineLayout.instance;
+ }
+
+ public void layoutContainer(final Container c) {
+ final NodeView view = (NodeView) c;
+ JComponent content = view.getContent();
+
+ if(content == null)
+ return;
+ content.setVisible(view.isContentVisible());
+ final int x = view.getSpaceAround();
+ final int y = x;
+ final Dimension contentProfSize = ContentSizeCalculator.INSTANCE.calculateContentSize(view);
+ content.setBounds(x, y, contentProfSize.width, contentProfSize.height);
+ placeChildren(view);
+ }
+
+ private void placeChildren(NodeView view) {
+ final int childCount = view.getComponentCount() - 1;
+ for (int i = 0; i < childCount; i++) {
+ final Component component = view.getComponent(i);
+ ((NodeView) component).validateTree();
+ }
+ int spaceAround = view.getSpaceAround();
+ final int hgapProperty = ResourceController.getResourceController().getLengthProperty("outline_hgap");
+ int hgap = view.getMap().getZoomed(hgapProperty);
+ final int vgapPropertyValue = ResourceController.getResourceController().getLengthProperty("outline_vgap");
+ int vgap = view.getMap().getZoomed(vgapPropertyValue);
+ JComponent content = view.getContent();
+ int baseX = content.getX();
+ int y = content.getY() + content.getHeight() - spaceAround;
+ if (content.isVisible()) {
+ baseX += hgap;
+ y += vgap;
+ }
+ else if (view.isSummary())
+ baseX += hgap;
+ int right = baseX + content.getWidth() + spaceAround;
+ NodeView child = null;
+ for (int i = 0; i < childCount; i++) {
+ final NodeView component = (NodeView) view.getComponent(i);
+ child = component;
+ final int additionalCloudHeigth = CloudHeightCalculator.INSTANCE.getAdditionalCloudHeigth(child) / 2;
+ y += additionalCloudHeigth;
+ final int x = baseX - child.getContent().getX();
+ child.setLocation(x, y);
+ final int childHeight = child.getHeight() - 2 * spaceAround;
+ if (childHeight != 0) {
+ y += childHeight + vgap + additionalCloudHeigth;
+ }
+ right = Math.max(right, x + child.getWidth() + additionalCloudHeigth);
+ }
+ final int bottom = content.getY() + content.getHeight() + spaceAround;
+ if (child != null) {
+ final NodeView node = child;
+ view.setSize(right,
+ Math.max(bottom, child.getY() + child.getHeight() + CloudHeightCalculator.INSTANCE.getAdditionalCloudHeigth(node) / 2));
+ }
+ else {
+ view.setSize(right, bottom);
+ }
+ }
+
+
+ public void addLayoutComponent(String name, Component comp) {
+ }
+
+ public void removeLayoutComponent(Component comp) {
+ }
+
+ public Dimension preferredLayoutSize(Container parent) {
+ return ImmediatelyValidatingPreferredSizeCalculator.INSTANCE.preferredLayoutSize(parent);
+ }
+
+ public Dimension minimumLayoutSize(Container parent) {
+ return INodeViewLayout.ZERO_DIMENSION;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/OvalMainView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/OvalMainView.java
new file mode 100644
index 0000000..41bf694
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/OvalMainView.java
@@ -0,0 +1,97 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Point;
+
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+
+class OvalMainView extends VariableInsetsMainView {
+ private static final double MARGIN_FACTOR = Math.sqrt(2);
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ public OvalMainView(ShapeConfigurationModel shapeConfigurationModel) {
+ super(shapeConfigurationModel);
+ }
+
+ protected double getVerticalMarginFactor() {
+ return MARGIN_FACTOR;
+ }
+
+ protected double getHorizontalMarginFactor() {
+ return MARGIN_FACTOR;
+ }
+
+ @Override
+ protected void paintNodeShape(final Graphics2D g) {
+ g.drawOval(0, 0, getWidth() - 1, getHeight() - 1);
+ }
+
+ @Override
+ protected void paintBackground(final Graphics2D graphics, final Color color) {
+ graphics.setColor(color);
+ graphics.fillOval(1, 1, getWidth() - 2, getHeight() - 2);
+ }
+
+ @Override
+ public Point getConnectorPoint(Point p) {
+ return getShapeConfiguration().isUniform() || !USE_COMMON_OUT_POINT_FOR_ROOT_NODE && getNodeView().isRoot() ? getConnectorPointAtTheOvalBorder(p) : super.getConnectorPoint(p);
+ }
+
+
+
+ @Override
+ public Dimension getPreferredSize() {
+ if (isPreferredSizeSet()) {
+ return super.getPreferredSize();
+ }
+ if(getShapeConfiguration().isUniform()){
+ final Dimension prefSize = getPreferredRectangleSizeWithoutMargin(getMaximumWidth());
+ double w = prefSize.width + getZoom() * getMinimumHorizontalInset();
+ double h = prefSize.height + getZoom() * getMinimumVerticalInset();
+ int diameter = (int)(Math.ceil(Math.sqrt(w * w + h * h)));
+ prefSize.width = prefSize.height = limitWidth(diameter);
+ return prefSize;
+ }
+ else
+ return super.getPreferredSize();
+ }
+
+ protected Point getConnectorPointAtTheOvalBorder(Point p) {
+ final double nWidth = this.getWidth() / 2f;
+ final double nHeight = this.getHeight() / 2f;
+ int dx = Math.max(Math.abs(p.x - this.getWidth()/2), getNodeView().getZoomed(LocationModel.DEFAULT_HGAP_PX));
+ if(p.x < this.getWidth()/2)
+ dx = -dx;
+ double angle = Math.atan((p.y - nHeight) / dx);
+ if (dx < 0) {
+ angle += Math.PI;
+ }
+ final Point out = new Point((int) ((1f + Math.cos(angle)) * nWidth), (int) ((1f + Math.sin(angle)) * nHeight));
+ return out;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/PaintingMode.java b/freeplane/src/main/java/org/freeplane/view/swing/map/PaintingMode.java
new file mode 100644
index 0000000..2bc0da0
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/PaintingMode.java
@@ -0,0 +1,28 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+/**
+ * @author Dimitry Polivaev
+ * 21.04.2012
+ */
+enum PaintingMode {
+ CLOUDS, NODES, SELECTED_NODES, LINKS, SELECTORS
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/RectangleMainView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/RectangleMainView.java
new file mode 100644
index 0000000..0873a05
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/RectangleMainView.java
@@ -0,0 +1,83 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+
+class RectangleMainView extends ShapedMainView {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void paintNodeShape(final Graphics2D g) {
+ g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
+ }
+
+ @Override
+ protected void paintBackground(final Graphics2D graphics, final Color color) {
+ graphics.setColor(color);
+ graphics.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
+ }
+
+
+ public RectangleMainView(ShapeConfigurationModel shapeConfiguration) {
+ super(shapeConfiguration);
+ }
+
+ public Insets getInsets(){
+ final ShapeConfigurationModel shapeConfiguration = getShapeConfiguration();
+ int horizontalMargin = shapeConfiguration.getHorizontalMargin().toBaseUnitsRounded();
+ int verticalMargin = shapeConfiguration.getVerticalMargin().toBaseUnitsRounded();
+ return new Insets(verticalMargin, horizontalMargin, verticalMargin, horizontalMargin);
+ }
+
+ @Override
+ public Insets getInsets(Insets insets) {
+ return getInsets();
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ final Dimension preferredSize = super.getPreferredSize();
+ if (isPreferredSizeSet()) {
+ return preferredSize;
+ }
+
+ preferredSize.width = limitWidth(preferredSize.width);
+
+ if(getShapeConfiguration().isUniform()) {
+ if(preferredSize.width < preferredSize.height)
+ preferredSize.width = preferredSize.height;
+ else
+ preferredSize.height = preferredSize.width;
+ }
+ return preferredSize;
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/SelectableLayout.java b/freeplane/src/main/java/org/freeplane/view/swing/map/SelectableLayout.java
new file mode 100644
index 0000000..ff80bab
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/SelectableLayout.java
@@ -0,0 +1,67 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Dimension;
+import java.awt.LayoutManager;
+
+import org.freeplane.features.styles.MapViewLayout;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.08.2009
+ */
+public class SelectableLayout implements INodeViewLayout {
+ static final SelectableLayout selectableLayoutInstance = new SelectableLayout();
+
+ public void addLayoutComponent(final String name, final Component comp) {
+ }
+
+ public void layoutContainer(final Container parent) {
+ getLayout(parent).layoutContainer(parent);
+ }
+
+ public Dimension minimumLayoutSize(final Container parent) {
+ return getLayout(parent).minimumLayoutSize(parent);
+ }
+
+ public Dimension preferredLayoutSize(final Container parent) {
+ return getLayout(parent).preferredLayoutSize(parent);
+ }
+
+ public void removeLayoutComponent(final Component comp) {
+ }
+
+ private INodeViewLayout getLayout(final Container parent) {
+ final NodeView view = (NodeView) parent;
+ MapView map = view.getMap();
+ final MapViewLayout layoutType = map.getLayoutType();
+ if (layoutType == MapViewLayout.OUTLINE)
+ return OutlineLayout.getInstance();
+ else
+ return NodeViewLayout.getInstance();
+ }
+
+ static LayoutManager getInstance() {
+ return selectableLayoutInstance;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ShapedMainView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ShapedMainView.java
new file mode 100644
index 0000000..1a7fac8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ShapedMainView.java
@@ -0,0 +1,62 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.RenderingHints;
+
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+
+ at SuppressWarnings("serial")
+abstract public class ShapedMainView extends MainView {
+
+ final private ShapeConfigurationModel shapeConfiguration;
+
+ public ShapedMainView(ShapeConfigurationModel shapeConfiguration) {
+ super();
+ this.shapeConfiguration = shapeConfiguration;
+ }
+
+ public ShapeConfigurationModel getShapeConfiguration(){
+ return shapeConfiguration;
+ }
+
+ @Override
+ public
+ Point getLeftPoint() {
+ final Point in = new Point(0, getHeight() / 2);
+ return in;
+ }
+
+ @Override
+ public
+ Point getRightPoint() {
+ final Point in = getLeftPoint();
+ in.x = getWidth() - 1;
+ return in;
+ }
+
+ @Override
+ public void paintComponent(final Graphics graphics) {
+ final Graphics2D g = (Graphics2D) graphics;
+ final NodeView nodeView = getNodeView();
+ if (nodeView.getModel() == null) {
+ return;
+ }
+ final ModeController modeController = getNodeView().getMap().getModeController();
+ final Object renderingHint = modeController.getController().getMapViewManager().setEdgesRenderingHint(g);
+ paintBackgound(g);
+ paintDragOver(g);
+ final Color edgeColor = nodeView.getEdgeColor();
+ g.setColor(edgeColor);
+ g.setStroke(MainView.DEF_STROKE);
+ paintNodeShape(g);
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
+ super.paintComponent(g);
+ }
+
+ abstract protected void paintNodeShape(final Graphics2D g);
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/ShowNotesInMapAction.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ShowNotesInMapAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/ShowNotesInMapAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/ShowNotesInMapAction.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/SummaryEdgePainter.java b/freeplane/src/main/java/org/freeplane/view/swing/map/SummaryEdgePainter.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/SummaryEdgePainter.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/SummaryEdgePainter.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/VariableInsetsMainView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/VariableInsetsMainView.java
new file mode 100644
index 0000000..9f28e13
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/VariableInsetsMainView.java
@@ -0,0 +1,136 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Dimension;
+import java.awt.Insets;
+
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+
+abstract class VariableInsetsMainView extends ShapedMainView {
+ private static final long serialVersionUID = 1L;
+ private int zoomedVerticalInset;
+ private int zoomedHorizontalInset;
+
+ public VariableInsetsMainView(ShapeConfigurationModel shapeConfiguration) {
+ super(shapeConfiguration);
+ zoomedVerticalInset = zoomedHorizontalInset = getMinimumHorizontalInset();
+ }
+
+ protected boolean areInsetsFixed() {
+ return false;
+ }
+
+
+ @Override
+ public Dimension getPreferredSize() {
+ if (isPreferredSizeSet()) {
+ return super.getPreferredSize();
+ }
+ final Dimension prefSize = getPreferredRectangleSizeWithoutMargin(getMaximumWidth());
+ final double widthWithMargin = Math.max(prefSize.width*getHorizontalMarginFactor(), prefSize.width + getZoom() * getMinimumHorizontalInset());
+ prefSize.width = limitWidth((int) Math.ceil(widthWithMargin));
+ prefSize.height = (int) Math.ceil(Math.max(prefSize.height *getVerticalMarginFactor(), prefSize.height + getZoom() * getMinimumVerticalInset()));
+ return prefSize;
+ }
+
+ abstract protected double getVerticalMarginFactor() ;
+
+ abstract protected double getHorizontalMarginFactor();
+
+ protected int getMinimumHorizontalInset(){
+ return getShapeConfiguration().getHorizontalMargin().toBaseUnitsRounded();
+ }
+
+ protected int getMinimumVerticalInset(){
+ return getShapeConfiguration().getVerticalMargin().toBaseUnitsRounded();
+ }
+
+ protected Dimension getPreferredRectangleSizeWithoutMargin(int maximumWidth) {
+ int scaledMaximumWidth = maximumWidth != Integer.MAX_VALUE ? (int)(maximumWidth / getHorizontalMarginFactor()) : maximumWidth;
+ final int zoomedHorizontalInsetBackup = zoomedHorizontalInset;
+ final int zoomedVerticalInsetBackup = zoomedVerticalInset;
+ final float zoom = getZoom();
+ zoomedHorizontalInset = (int) (zoom * getMinimumHorizontalInset());
+ zoomedVerticalInset = (int) (zoom * getMinimumVerticalInset());
+ final int oldMinimumWidth = getMinimumWidth();
+ final int oldMaximumWidth = getMaximumWidth();
+ final Dimension prefSize;
+ try{
+ this.setMinimumWidth(0);
+ this.setMaximumWidth(scaledMaximumWidth);
+ prefSize = super.getPreferredSize();
+ prefSize.width -= zoomedHorizontalInset;
+ prefSize.height -= zoomedVerticalInset;
+ }
+ finally {
+ zoomedHorizontalInset = zoomedHorizontalInsetBackup;
+ zoomedVerticalInset = zoomedVerticalInsetBackup;
+ setMaximumWidth(oldMaximumWidth);
+ setMinimumWidth(oldMinimumWidth);
+ }
+ return prefSize;
+ }
+
+ @Override
+ public Insets getZoomedInsets() {
+ int topInset = getZoomedVerticalInset();
+ int leftInset = getZoomedHorizontalInset();
+ return new Insets(topInset, leftInset, topInset, leftInset);
+ }
+
+ protected int getZoomedVerticalInset() {
+ return zoomedVerticalInset;
+ }
+
+ protected int getZoomedHorizontalInset() {
+ return zoomedHorizontalInset;
+ }
+
+ @Override
+ public void setBounds(int x, int y, int width, int height) {
+ final int oldMinimumWidth = getMinimumWidth();
+ setMinimumWidth(0);
+ Dimension preferredRectangleSize = getPreferredRectangleSizeWithoutMargin(getMaximumWidth());
+ final Dimension preferredSize = getPreferredSize();
+ setMinimumWidth(oldMinimumWidth);
+ super.setBounds(x, y, width, height);
+ zoomedHorizontalInset = (Math.min(preferredSize.width, width) - preferredRectangleSize.width) / 2;
+ zoomedVerticalInset = (Math.min(preferredSize.height, height) - preferredRectangleSize.height) / 2;
+ }
+
+ @Override
+ public Insets getInsets() {
+ Insets insets = getZoomedInsets();
+ float zoom = getZoom();
+ if(zoom != 1f) {
+ insets.left /= zoom;
+ insets.right /= zoom;
+ insets.top /= zoom;
+ insets.bottom /= zoom;
+ }
+ return insets;
+ }
+
+ @Override
+ public Insets getInsets(Insets insets) {
+ return getInsets();
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/VerticalNodeViewLayoutStrategy.java b/freeplane/src/main/java/org/freeplane/view/swing/map/VerticalNodeViewLayoutStrategy.java
new file mode 100644
index 0000000..09a0886
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/VerticalNodeViewLayoutStrategy.java
@@ -0,0 +1,388 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008-2014 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package org.freeplane.view.swing.map;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.util.Arrays;
+
+import javax.swing.JComponent;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.SummaryLevels;
+import org.freeplane.features.nodelocation.LocationModel;
+
+class VerticalNodeViewLayoutStrategy {
+
+ static private boolean wrongChildComponentsReported = false;
+
+ private int childViewCount;
+ private final int spaceAround;
+ private final NodeView view;
+
+ private final int[] xCoordinates;
+ private final int[] yCoordinates;
+ private final boolean[] isChildFreeNode;
+ private SummaryLevels viewLevels;
+ private int left;
+ private int childContentHeight;
+ private int top;
+ private boolean rightSideCoordinatesAreSet;
+ private boolean leftSideCoordinaresAreSet;
+
+ public VerticalNodeViewLayoutStrategy(NodeView view) {
+ this.view = view;
+ childViewCount = view.getComponentCount() - 1;
+ layoutChildViews(view);
+ this.left = 0;
+ this.childContentHeight = 0;
+ this.top = 0;
+ rightSideCoordinatesAreSet = false;
+ leftSideCoordinaresAreSet = false;
+ this.xCoordinates = new int[childViewCount];
+ this.yCoordinates = new int[childViewCount];
+ this.isChildFreeNode = new boolean[childViewCount];
+ spaceAround = view.getSpaceAround();
+ }
+
+ private void layoutChildViews(NodeView view) {
+ for (int i = 0; i < childViewCount; i++) {
+ final Component component = view.getComponent(i);
+ if(component instanceof NodeView)
+ ((NodeView) component).validateTree();
+ else {
+ childViewCount = i;
+ if(! wrongChildComponentsReported) {
+ wrongChildComponentsReported = true;
+ final String wrongChildComponents = Arrays.toString(view.getComponents());
+ LogUtils.severe("Unexpected child components:" + wrongChildComponents, new Exception());
+ }
+ }
+ }
+ }
+
+ private void setFreeChildNodes(final boolean isLeft) {
+ for (int i = 0; i < childViewCount; i++) {
+ final NodeView child = (NodeView) view.getComponent(i);
+ if (child.isLeft() == isLeft)
+ this.isChildFreeNode[i] = child.isFree();
+ }
+ }
+ public void calculateLayoutData() {
+ viewLevels = new SummaryLevels(view.getModel());
+ for(boolean isLeft : viewLevels.sides)
+ calculateLayoutData(isLeft);
+ applyLayoutToChildComponents();
+ }
+
+ private void calculateLayoutData(final boolean isLeft) {
+ setFreeChildNodes(isLeft);
+ calculateLayoutY(isLeft);
+ calculateLayoutX(isLeft);
+
+ }
+
+ private void calculateLayoutY(final boolean isLeft) {
+ final int minimalDistanceBetweenChildren = view.getChildDistanceContainer().getMinimalDistanceBetweenChildren();
+ final Dimension contentSize = ContentSizeCalculator.INSTANCE.calculateContentSize(view);
+ int childContentHeightSum = 0;
+ int top = 0;
+ int level = viewLevels.highestSummaryLevel + 1;
+ int y = 0;
+ int vGap = 0;
+ int visibleChildCounter = 0;
+ final int[] groupStartIndex = new int[level];
+ final int[] contentHeightSumAtGroupStart = new int[level];
+ final int[] groupUpperYCoordinate = new int[level];
+ final int[] groupLowerYCoordinate = new int[level];
+
+ for (int childViewIndex = 0; childViewIndex < childViewCount; childViewIndex++) {
+ final NodeView child = (NodeView) view.getComponent(childViewIndex);
+ if (child.isLeft() == isLeft) {
+ final int childHeight = child.getHeight() - 2 * spaceAround;
+ final int oldLevel = level;
+ if(childViewIndex >= viewLevels.summaryLevels.length){
+ final String errorMessage = "Bad node view child components: missing node for component " + childViewIndex;
+ UITools.errorMessage(errorMessage);
+ System.err.println(errorMessage);
+ for (int i = 0; i < view.getComponentCount(); i++){
+ final Component component = view.getComponent(i);
+ System.err.println(component);
+ }
+ }
+ level = viewLevels.summaryLevels[childViewIndex];
+ boolean isFreeNode = child.isFree();
+ boolean isItem = level == 0;
+
+ final int childCloudHeigth = CloudHeightCalculator.INSTANCE.getAdditionalCloudHeigth(child);
+ final int childContentHeight = child.getContent().getHeight() + childCloudHeigth;
+ final int childShiftY = child.isContentVisible() ? child.getShift() : 0;
+ final int childContentShift = child.getContent().getY() - childCloudHeigth / 2 - spaceAround;
+
+ if (isItem) {
+ if (isFreeNode)
+ this.yCoordinates[childViewIndex] = childShiftY - childContentShift - childCloudHeigth / 2 - spaceAround;
+ else {
+ if (childHeight != 0) {
+ if (visibleChildCounter > 0)
+ childContentHeightSum += vGap;
+ }
+ if (childShiftY < 0 || visibleChildCounter == 0)
+ top += childShiftY;
+
+ top += - childContentShift + child.getTopOverlap();
+ y -= child.getTopOverlap();
+ if (childShiftY < 0) {
+ this.yCoordinates[childViewIndex] = y;
+ y -= childShiftY;
+ } else {
+ if (visibleChildCounter > 0)
+ y += childShiftY;
+ this.yCoordinates[childViewIndex] = y;
+ }
+ final int summaryNodeIndex = viewLevels.findSummaryNodeIndex(childViewIndex);
+ if(summaryNodeIndex == SummaryLevels.NODE_NOT_FOUND || summaryNodeIndex - 1 == childViewIndex)
+ vGap = minimalDistanceBetweenChildren;
+ else if (childHeight != 0)
+ vGap = summarizedNodeDistance(minimalDistanceBetweenChildren);
+ if (childHeight != 0)
+ y += childHeight + vGap - child.getBottomOverlap();
+
+ childContentHeightSum += childContentHeight;
+ if (oldLevel > 0) {
+ for (int j = 0; j < oldLevel; j++) {
+ groupStartIndex[j] = childViewIndex;
+ groupUpperYCoordinate[j] = Integer.MAX_VALUE;
+ groupLowerYCoordinate[j] = Integer.MIN_VALUE;
+ contentHeightSumAtGroupStart[j] = childContentHeightSum;
+ }
+ } else if (child.isFirstGroupNode()) {
+ contentHeightSumAtGroupStart[0] = childContentHeightSum;
+ groupStartIndex[0] = childViewIndex;
+ }
+ }
+ if (childHeight != 0)
+ visibleChildCounter++;
+ } else {
+ final int itemLevel = level - 1;
+ if (child.isFirstGroupNode()) {
+ contentHeightSumAtGroupStart[level] = contentHeightSumAtGroupStart[itemLevel];
+ groupStartIndex[level] = groupStartIndex[itemLevel];
+ }
+ int summaryY = (groupUpperYCoordinate[itemLevel] + groupLowerYCoordinate[itemLevel]) / 2
+ - childContentHeight / 2 + childShiftY
+ - (child.getContent().getY() - childCloudHeigth / 2 - spaceAround);
+ this.yCoordinates[childViewIndex] = summaryY;
+ if (!isFreeNode) {
+ final int deltaY = summaryY - groupUpperYCoordinate[itemLevel]
+ + child.getTopOverlap();
+ if (deltaY < 0) {
+ top += deltaY;
+ y -= deltaY;
+ summaryY -= deltaY;
+ for (int j = groupStartIndex[itemLevel]; j <= childViewIndex; j++) {
+ NodeView groupItem = (NodeView) view.getComponent(j);
+ if (groupItem.isLeft() == isLeft
+ && (this.viewLevels.summaryLevels[j] > 0 || !this.isChildFreeNode[j]))
+ this.yCoordinates[j] -= deltaY;
+ }
+ }
+ if (childHeight != 0) {
+ summaryY += childHeight + minimalDistanceBetweenChildren
+ - child.getBottomOverlap();
+ }
+ y = Math.max(y, summaryY);
+ }
+ }
+ if (! (isItem && isFreeNode)) {
+ int childUpperCoordinate = this.yCoordinates[childViewIndex] + child.getTopOverlap();
+ int childBottomCoordinate = this.yCoordinates[childViewIndex] + childHeight - child.getBottomOverlap();
+ if (child.isFirstGroupNode()) {
+ if(isItem){
+ groupUpperYCoordinate[level] = Integer.MAX_VALUE;
+ groupLowerYCoordinate[level] = Integer.MIN_VALUE;
+ }
+ else{
+ groupUpperYCoordinate[level] = childUpperCoordinate;
+ groupLowerYCoordinate[level] = childBottomCoordinate;
+ }
+ } else if (childHeight != 0 || isNextNodeSummaryNode(childViewIndex)){
+ groupUpperYCoordinate[level] = Math.min(groupUpperYCoordinate[level], childUpperCoordinate);
+ groupLowerYCoordinate[level] = Math.max(childBottomCoordinate, groupLowerYCoordinate[level]);
+ }
+ }
+ }
+ }
+ top += (contentSize.height - childContentHeightSum) / 2;
+ calculateRelativeCoordinatesForContentAndBothSides(isLeft, childContentHeightSum, top);
+ }
+
+ private boolean isNextNodeSummaryNode(int childViewIndex) {
+ return childViewIndex + 1 < viewLevels.summaryLevels.length && viewLevels.summaryLevels[childViewIndex + 1] > 0;
+ }
+
+ private int summarizedNodeDistance(final int distance) {
+ final int defaultVGap = view.getMap().getZoomed(LocationModel.DEFAULT_VGAP.toBaseUnits());
+ if(defaultVGap >= distance)
+ return distance;
+ else
+ return defaultVGap + (distance - defaultVGap) / 6;
+ }
+
+ private void calculateLayoutX(final boolean isLeft) {
+ final Dimension contentSize = ContentSizeCalculator.INSTANCE.calculateContentSize(view);
+ int level = viewLevels.highestSummaryLevel + 1;
+ final int summaryBaseX[] = new int[level];
+ for (int i = 0; i < childViewCount; i++) {
+ final NodeView child = (NodeView) view.getComponent(i);
+ if (child.isLeft() == isLeft) {
+ final int oldLevel = level;
+ level = viewLevels.summaryLevels[i];
+ boolean isFreeNode = child.isFree();
+ boolean isItem = level == 0;
+ int childHGap;
+ if (child.isContentVisible())
+ childHGap = child.getHGap();
+ else if (child.isSummary())
+ childHGap = child.getZoomed(LocationModel.DEFAULT_HGAP_PX*7/12);
+ else
+ childHGap = 0;
+ if(view.getModel().isHiddenSummary() && ! child.getModel().isHiddenSummary())
+ childHGap -= child.getZoomed(LocationModel.DEFAULT_HGAP_PX*7/12);
+
+ if (isItem) {
+ if (!isFreeNode && (oldLevel > 0 || child.isFirstGroupNode()))
+ summaryBaseX[0] = 0;
+ }
+ else if (child.isFirstGroupNode())
+ summaryBaseX[level] = 0;
+
+
+ final int x;
+ final int baseX;
+ if (level > 0)
+ baseX = summaryBaseX[level - 1];
+ else {
+ if (child.isLeft() != (isItem && isFreeNode)) {
+ baseX = 0;
+ } else {
+ baseX = contentSize.width;
+ }
+ }
+ if (child.isLeft()) {
+ x = baseX - childHGap - child.getContent().getX() - child.getContent().getWidth();
+ summaryBaseX[level] = Math.min(summaryBaseX[level], x + spaceAround);
+ } else {
+ x = baseX + childHGap - child.getContent().getX();
+ summaryBaseX[level] = Math.max(summaryBaseX[level], x + child.getWidth() - spaceAround);
+ }
+ left = Math.min(left, x);
+ this.xCoordinates[i] = x;
+ }
+ }
+ }
+
+ private void calculateRelativeCoordinatesForContentAndBothSides(boolean isLeft, int childContentHeightOnSide, int topOnSide) {
+ if (! (leftSideCoordinaresAreSet || rightSideCoordinatesAreSet)) {
+ childContentHeight = childContentHeightOnSide;
+ top = topOnSide;
+ } else {
+ childContentHeight = Math.max(this.childContentHeight, childContentHeightOnSide);
+ int deltaTop = topOnSide - this.top;
+ final boolean changeLeft;
+ if (deltaTop < 0) {
+ top = topOnSide;
+ changeLeft = !isLeft;
+ deltaTop = -deltaTop;
+ } else {
+ changeLeft = isLeft;
+ }
+ for (int i = 0; i < childViewCount; i++) {
+ NodeView child = (NodeView) view.getComponent(i);
+ if (child.isLeft() == changeLeft
+ && (viewLevels.summaryLevels[i] > 0 || !isChildFreeNode[i])) {
+ yCoordinates[i] += deltaTop;
+ }
+ }
+ }
+ if (isLeft)
+ leftSideCoordinaresAreSet = true;
+ else
+ rightSideCoordinatesAreSet = true;
+ }
+
+ private void applyLayoutToChildComponents() {
+ JComponent content = view.getContent();
+ int spaceAround = view.getSpaceAround();
+ final int contentX = Math.max(spaceAround, -this.left);
+ int cloudHeight = CloudHeightCalculator.INSTANCE
+ .getAdditionalCloudHeigth(view);
+ int contentY = spaceAround + cloudHeight / 2 - Math.min(0, this.top);
+
+ content.setVisible(view.isContentVisible());
+
+ int baseY = contentY - spaceAround + this.top;
+ int minY = 0;
+ for (int i = 0; i < childViewCount; i++) {
+ if (this.viewLevels.summaryLevels[i] == 0 && this.isChildFreeNode[i]) {
+ minY = Math.min(minY, contentY + this.yCoordinates[i]);
+ } else
+ minY = Math.min(minY, baseY + this.yCoordinates[i]);
+ }
+ if (minY < 0) {
+ contentY -= minY;
+ baseY -= minY;
+ }
+ final Dimension contentSize = ContentSizeCalculator.INSTANCE
+ .calculateContentSize(view);
+ int width = contentX + contentSize.width + spaceAround;
+ int height = contentY + contentSize.height + cloudHeight / 2
+ + spaceAround;
+ content.setBounds(contentX, contentY, contentSize.width,
+ contentSize.height);
+ int topOverlap = -minY;
+ int heigthWithoutOverlap = height;
+ for (int i = 0; i < childViewCount; i++) {
+ NodeView child = (NodeView) view.getComponent(i);
+ final int y;
+ if (this.viewLevels.summaryLevels[i] == 0 && this.isChildFreeNode[i]) {
+ y = contentY + this.yCoordinates[i];
+ } else {
+ y = baseY + this.yCoordinates[i];
+ if (!this.isChildFreeNode[i])
+ heigthWithoutOverlap = Math.max(
+ heigthWithoutOverlap,
+ y + child.getHeight() + cloudHeight / 2
+ - child.getBottomOverlap());
+ }
+ final int x = contentX + this.xCoordinates[i];
+ child.setLocation(x, y);
+ width = Math.max(width, child.getX() + child.getWidth());
+ height = Math.max(height, y + child.getHeight() + cloudHeight / 2);
+ }
+
+ view.setSize(width, height);
+ view.setTopOverlap(topOverlap);
+ view.setBottomOverlap(height - heigthWithoutOverlap);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ViewLayoutTypeAction.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ViewLayoutTypeAction.java
new file mode 100644
index 0000000..f646010
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ViewLayoutTypeAction.java
@@ -0,0 +1,84 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.SelectableAction;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapViewLayout;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.08.2009
+ */
+ at SelectableAction(checkOnPopup = true)
+public class ViewLayoutTypeAction extends AFreeplaneAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private final MapViewLayout layoutType;
+
+ public ViewLayoutTypeAction(final MapViewLayout layoutType) {
+ super("ViewLayoutTypeAction." + layoutType.toString());
+ this.layoutType = layoutType;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ final MapView map = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
+ if (isSelected()) {
+ map.setLayoutType(MapViewLayout.MAP);
+ setSelected(false);
+ }
+ else {
+ map.setLayoutType(layoutType);
+ setSelected(true);
+ }
+ final MapStyle mapStyle = (MapStyle) map.getModeController().getExtension(MapStyle.class);
+ mapStyle.setMapViewLayout(map.getModel(), map.getLayoutType());
+ map.getMapSelection().keepNodePosition(map.getSelected().getModel(), 0.5f, 0.5f);
+ final NodeView root = map.getRoot();
+ invalidate(root);
+ root.revalidate();
+ }
+
+ private void invalidate(final Component c) {
+ c.invalidate();
+ if(! (c instanceof Container))
+ return;
+ Container c2 = (Container) c;
+ for(int i = 0; i < c2.getComponentCount(); i++)
+ invalidate(c2.getComponent(i));
+ }
+
+ @Override
+ public void setSelected() {
+ final MapView map = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
+ setSelected(map != null && map.getLayoutType() == layoutType);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/WideHexagonMainView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/WideHexagonMainView.java
new file mode 100644
index 0000000..10d6044
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/WideHexagonMainView.java
@@ -0,0 +1,97 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics2D;
+import java.awt.Polygon;
+
+import org.freeplane.features.nodestyle.ShapeConfigurationModel;
+
+class WideHexagonMainView extends VariableInsetsMainView {
+ private static final double VERTICAL_MARGIN_FACTOR = Math.sqrt(2);
+ private static final double UNIFORM_HEIGHT_TO_WIDTH_RELATION = Math.sqrt(3)/2;
+ private static final double HORIZONTAL_MARGIN_FACTOR = Math.sqrt(2)/ UNIFORM_HEIGHT_TO_WIDTH_RELATION;
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public WideHexagonMainView(ShapeConfigurationModel shapeConfigurationModel) {
+ super(shapeConfigurationModel);
+ }
+
+ protected double getVerticalMarginFactor() {
+ return VERTICAL_MARGIN_FACTOR;
+ }
+
+ protected double getHorizontalMarginFactor() {
+ return HORIZONTAL_MARGIN_FACTOR;
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ if (isPreferredSizeSet()) {
+ return super.getPreferredSize();
+ }
+ if(getShapeConfiguration().isUniform()) {
+ final Dimension prefSize = getPreferredRectangleSizeWithoutMargin(getMaximumWidth());
+ double w = prefSize.width + getZoom() * getMinimumHorizontalInset();
+ double h = prefSize.height + getZoom() * getMinimumVerticalInset();
+ double diameter = Math.sqrt(w * w + h * h);
+ double width = limitWidth (diameter/ UNIFORM_HEIGHT_TO_WIDTH_RELATION);
+ prefSize.width = (int) Math.ceil(width);
+ prefSize.height = (int) (width * UNIFORM_HEIGHT_TO_WIDTH_RELATION);
+ return prefSize;
+ }
+ else
+ return super.getPreferredSize();
+ }
+
+
+ @Override
+ protected void paintNodeShape(final Graphics2D g) {
+ Polygon polygon = getPaintedShape();
+ g.draw(polygon);
+ }
+
+ protected Polygon getPaintedShape() {
+ final Polygon polygon;
+ if(getShapeConfiguration().isUniform()) {
+ int[] xCoords = new int[]{0, getWidth()/4, 3 * getWidth() /4 , getWidth(), 3 * getWidth() / 4, getWidth() / 4};
+ int[] yCoords = new int[]{getHeight() / 2, 0, 0, getHeight() / 2, getHeight() - 1, getHeight() - 1};
+ polygon = new Polygon(xCoords, yCoords, xCoords.length);
+ }
+ else {
+ final int zoomedHorizontalInset = (int) (getWidth() * (1 - 1 / getHorizontalMarginFactor()) / 2);
+ int[] xCoords = new int[]{0, zoomedHorizontalInset, getWidth() - zoomedHorizontalInset - 1, getWidth(), getWidth() - zoomedHorizontalInset - 1, zoomedHorizontalInset};
+ int[] yCoords = new int[]{getHeight() / 2, 0, 0, getHeight() / 2, getHeight() - 1, getHeight() - 1};
+ polygon = new Polygon(xCoords, yCoords, xCoords.length);
+ }
+ return polygon;
+ }
+
+ @Override
+ protected void paintBackground(final Graphics2D graphics, final Color color) {
+ graphics.setColor(color);
+ graphics.fill(getPaintedShape());
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/ZoomInAction.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ZoomInAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/ZoomInAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/ZoomInAction.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/ZoomOutAction.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ZoomOutAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/ZoomOutAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/ZoomOutAction.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ZoomableLabel.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ZoomableLabel.java
new file mode 100644
index 0000000..31b6ee2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ZoomableLabel.java
@@ -0,0 +1,272 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.image.BufferedImage;
+import java.security.AccessControlException;
+
+import javax.swing.Icon;
+import javax.swing.JLabel;
+import javax.swing.SwingUtilities;
+import javax.swing.plaf.basic.BasicHTML;
+import javax.swing.text.View;
+import javax.swing.text.html.HTMLDocument;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+
+ at SuppressWarnings("serial")
+public class ZoomableLabel extends JLabel {
+ public static final String TEXT_RENDERING_ICON = "TextRenderingIcon";
+
+ protected static final Graphics2D fmg;
+ static {
+ fmg = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB).createGraphics();
+ fmg.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+ }
+
+ private int minimumWidth;
+ private int maximumWidth;
+
+ public int getIconWidth() {
+ final Icon icon = getIcon();
+ if (icon == null) {
+ return 0;
+ }
+ return getMap().getZoomed(icon.getIconWidth());
+ }
+
+ public NodeView getNodeView() {
+ return (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, this);
+ }
+
+
+ public Dimension getPreferredSize() {
+ if (isPreferredSizeSet()) {
+ Dimension preferredSize = super.getPreferredSize();
+ return preferredSize;
+ }
+ return ((ZoomableLabelUI)getUI()).getPreferredSize(this);
+ }
+
+ protected float getZoom() {
+ final float zoom = getMap().getZoom();
+ return zoom;
+ }
+
+ protected MapView getMap() {
+ return getNodeView().getMap();
+ }
+
+ @Override
+ public void paint(final Graphics g) {
+ switch (getMap().getPaintingMode()) {
+ case CLOUDS:
+ return;
+ default:
+ break;
+ }
+ super.paint(g);
+ }
+
+ protected void updateText(String text) {
+ try{
+ updateTextUnsafe(text);
+ }
+ catch (Exception e1) {
+ if(e1 instanceof AccessControlException)
+ LogUtils.warn(e1.getMessage());
+ else
+ LogUtils.severe(e1);
+ final String localizedMessage = e1.getLocalizedMessage();
+ if(text.length() > 603)
+ text = text.substring(0, 600) + "...";
+ try{
+ updateTextUnsafe(localizedMessage + '\n' + text);
+ }
+ catch (Exception e2){
+ }
+ }
+ }
+
+ private void updateTextUnsafe(String nodeText) throws Exception{
+ final NodeView node = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, this);
+ final MapView map = node.getMap();
+ if (map == null || nodeText == null) {
+ return;
+ }
+ final boolean isHtml = nodeText.startsWith("<html>");
+ boolean widthMustBeRestricted = ! areInsetsFixed();
+ boolean isLong = false;
+ if (!isHtml) {
+ final String[] lines = nodeText.split("\n");
+ for (int line = 0; line < lines.length; line++) {
+ if (widthMustBeRestricted)
+ break;
+ setText(lines[line]);
+ final int oldMaximumWidth = getMaximumWidth();
+ try{
+ final ModeController modeController = map.getModeController();
+ final NodeStyleController nsc = NodeStyleController.getController(modeController);
+ final double maxNodeWidth = nsc.getMaxWidth(node.getModel()).toBaseUnits();
+ setMaximumWidth(Integer.MAX_VALUE);
+ widthMustBeRestricted = getPreferredSize().width > map.getZoomed(maxNodeWidth);
+ }
+ finally{
+ setMaximumWidth(oldMaximumWidth);
+ }
+ }
+ isLong = widthMustBeRestricted || lines.length > 1;
+ }
+ if (isHtml) {
+ if (nodeText.indexOf("<img") >= 0 && nodeText.indexOf("<base ") < 0) {
+ nodeText = "<html><base href=\"" + map.getModel().getURL() + "\">" + nodeText.substring(6);
+ }
+ final String htmlLongNodeHead = ResourceController.getResourceController().getProperty(
+ "html_long_node_head");
+ if (htmlLongNodeHead != null && !htmlLongNodeHead.equals("")) {
+ if (nodeText.matches("(?ims).*<head>.*")) {
+ nodeText = nodeText.replaceFirst("(?ims).*<head>.*", "<head>" + htmlLongNodeHead);
+ }
+ else {
+ nodeText = nodeText.replaceFirst("(?ims)<html>", "<html><head>" + htmlLongNodeHead + "</head>");
+ }
+ }
+ setText(nodeText);
+ }
+ else if (nodeText.startsWith("<table>")) {
+ final String[] lines = nodeText.split("\n");
+ lines[0] = lines[0].substring(7);
+ final int startingLine = lines[0].matches("\\s*") ? 1 : 0;
+ String text = "<html><table border=1 style=\"border-color: white\">";
+ for (int line = startingLine; line < lines.length; line++) {
+ text += "<tr><td style=\"border-color: white;\">"
+ + HtmlUtils.toXMLEscapedText(lines[line])
+ .replaceAll("\t", "<td style=\"border-color: white\">");
+ }
+ setText(text);
+ }
+ else if (isLong) {
+ String text = HtmlUtils.plainToHTML(nodeText);
+ setText(text);
+ }
+ else {
+ setText(nodeText);
+ }
+ }
+
+ protected boolean areInsetsFixed() {
+ return true;
+ }
+
+ public ZoomableLabel() {
+ setUI(ZoomableLabelUI.createUI(this));
+ }
+
+ @Override
+ public void updateUI() {
+ }
+
+ @Override
+ public FontMetrics getFontMetrics(final Font font) {
+ try {
+ if (!useFractionalMetrics()) {
+ return super.getFontMetrics(font);
+ }
+ fmg.setFont(font);
+ final FontMetrics fontMetrics = fmg.getFontMetrics();
+ return fontMetrics;
+ } catch (Exception e) {
+ return super.getFontMetrics(font);
+ }
+ }
+
+ protected boolean useFractionalMetrics() {
+ final MapView map = getMap();
+ if (map.isPrinting()) {
+ return true;
+ }
+ final float zoom = map.getZoom();
+ return 1f != zoom;
+ }
+
+ protected FontMetrics getFontMetrics() {
+ if (!useFractionalMetrics()) {
+ return super.getFontMetrics(getFont());
+ }
+ fmg.setFont(getFont());
+ final FontMetrics fontMetrics = fmg.getFontMetrics();
+ return fontMetrics;
+ }
+
+ public String getLink(Point p){
+ View view = (View)getClientProperty(BasicHTML.propertyKey);
+ if(view == null)
+ return null;
+ Rectangle textR = ((ZoomableLabelUI)getUI()).getTextR(this);
+ if(textR == null)
+ return null;
+ if(!textR.contains(p))
+ return null;
+ int x = (int) (p.x / getZoom());
+ int y = (int) (p.y / getZoom());
+ final int pos = view.viewToModel(x, y, textR);
+ final HTMLDocument document = (HTMLDocument) view.getDocument();
+ final String linkURL = HtmlUtils.getURLOfExistingLink(document, pos);
+ return linkURL;
+ }
+
+ public Insets getZoomedInsets() {
+ Insets unzoomedInsets = getInsets();
+ float zoom = getZoom();
+ Insets zoomedInsets = new Insets((int) (unzoomedInsets.top * zoom),
+ (int) (unzoomedInsets.left * zoom),
+ (int) (unzoomedInsets.bottom * zoom),
+ (int) (unzoomedInsets.right * zoom));
+ return zoomedInsets;
+ }
+
+ public int getMinimumWidth() {
+ return minimumWidth;
+ }
+
+ public int getMaximumWidth() {
+ return maximumWidth;
+ }
+
+ public void setMaximumWidth(int maximumWidth) {
+ this.maximumWidth = maximumWidth;
+ }
+ public void setMinimumWidth(int minimumWidth) {
+ this.minimumWidth = minimumWidth;
+ }
+
+ protected int limitWidth(int width) {
+ if(width < getMinimumWidth())
+ return getMinimumWidth();
+ else if(width > getMaximumWidth())
+ return getMaximumWidth();
+ else
+ return width;
+ }
+
+ protected double limitWidth(double width) {
+ if(width < getMinimumWidth())
+ return getMinimumWidth();
+ else if(width > getMaximumWidth())
+ return getMaximumWidth();
+ else
+ return width;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/ZoomableLabelUI.java b/freeplane/src/main/java/org/freeplane/view/swing/map/ZoomableLabelUI.java
new file mode 100644
index 0000000..f997d72
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/ZoomableLabelUI.java
@@ -0,0 +1,470 @@
+package org.freeplane.view.swing.map;
+
+import java.awt.Dimension;
+import java.awt.FontMetrics;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Insets;
+import java.awt.Rectangle;
+import java.awt.RenderingHints;
+import java.awt.geom.AffineTransform;
+import java.beans.PropertyChangeEvent;
+import javax.swing.Icon;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.plaf.ComponentUI;
+import javax.swing.plaf.basic.BasicHTML;
+import javax.swing.plaf.basic.BasicLabelUI;
+import javax.swing.text.View;
+
+import org.freeplane.core.ui.components.html.ScaledHTML;
+import org.freeplane.core.util.TextUtils;
+
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+/**
+ * @author Dimitry Polivaev
+ * 23.08.2009
+ */
+public class ZoomableLabelUI extends BasicLabelUI {
+ private boolean isPainting = false;
+
+ static ZoomableLabelUI labelUI = new ZoomableLabelUI();
+ private Rectangle iconR = new Rectangle();
+ private Rectangle textR = new Rectangle();
+ private Rectangle viewR = new Rectangle();
+ private LayoutData layoutData = new LayoutData(iconR, textR);
+
+ public static class LayoutData{
+ final public Rectangle iconR;
+ final public Rectangle textR;
+ public LayoutData(Rectangle iconR, Rectangle textR) {
+ super();
+ this.iconR = iconR;
+ this.textR = textR;
+ }
+
+ }
+
+
+
+ @Override
+ public Dimension getPreferredSize(final JComponent c) {
+ final Dimension preferredSize = super.getPreferredSize(c);
+ final ZoomableLabel zoomableLabel = (ZoomableLabel) c;
+ if(zoomableLabel.getIcon() == null){
+ final int fontHeight = zoomableLabel.getFontMetrics().getHeight();
+ final Insets insets = c.getInsets();
+ preferredSize.width = Math.max(preferredSize.width, fontHeight/2 + insets.left + insets.right);
+ preferredSize.height = Math.max(preferredSize.height, fontHeight + insets.top + insets.bottom);
+ }
+ final float zoom = zoomableLabel.getZoom();
+ if (zoom != 1f) {
+ preferredSize.width = (int) (Math.ceil(zoom * preferredSize.width));
+ preferredSize.height = (int) (Math.ceil(zoom * preferredSize.height));
+ }
+ int minimumWidth = zoomableLabel.getMinimumWidth();
+ if(minimumWidth != 0)
+ preferredSize.width = Math.max(minimumWidth, preferredSize.width);
+ return preferredSize;
+ }
+
+ public static ComponentUI createUI(final JComponent c) {
+ return labelUI;
+ }
+
+ @Override
+ protected String layoutCL(final JLabel label, final FontMetrics fontMetrics, final String text, final Icon icon,
+ final Rectangle viewR, final Rectangle iconR, final Rectangle textR) {
+ final ZoomableLabel zLabel = (ZoomableLabel) label;
+ final float zoom = zLabel.getZoom();
+ if (isPainting) {
+ final Insets insets = zLabel.getInsets();
+ final int width = zLabel.getWidth();
+ final int height = zLabel.getHeight();
+ viewR.x = insets.left;
+ viewR.y = insets.top;
+ viewR.width = (int) (width / zoom) - (insets.left + insets.right);
+ viewR.height = (int)(height / zoom) - (insets.top + insets.bottom);
+ if(viewR.width < 0)
+ viewR.width = 0;
+ }
+ else {
+ if(zLabel.getMaximumWidth() != Integer.MAX_VALUE){
+ final int maximumWidth = (int) (zLabel.getMaximumWidth() / zoom);
+ final Insets insets = label.getInsets();
+ viewR.width = maximumWidth - insets.left - insets.right;
+ if(viewR.width < 0)
+ viewR.width = 0;
+ ScaledHTML.Renderer v = (ScaledHTML.Renderer) label.getClientProperty(BasicHTML.propertyKey);
+ if (v != null) {
+ v.resetSize();
+ float preferredWidth = v.getPreferredSpan(View.X_AXIS);
+ float minimumWidth = v.getMinimumSpan(View.X_AXIS);
+ int textWidth = viewR.width;
+ if(icon != null)
+ textWidth -= icon.getIconWidth() + label.getIconTextGap();
+ if(preferredWidth > textWidth){
+ if(minimumWidth > textWidth){
+ viewR.width += minimumWidth - textWidth;
+ textWidth = (int) minimumWidth;
+ }
+ v.setSize(textWidth, 1);
+ super.layoutCL(zLabel, zLabel.getFontMetrics(), text, icon, viewR, iconR, textR);
+ v.setSize(textR.width, textR.height);
+ return text;
+ }
+ }
+ }
+ }
+ Icon textRenderingIcon = getTextRenderingIcon(zLabel);
+ if(textRenderingIcon != null){
+ layoutLabelWithTextIcon(textRenderingIcon, icon, viewR, iconR, textR, zLabel);
+ }
+ else
+ super.layoutCL(zLabel, zLabel.getFontMetrics(), text, icon, viewR, iconR, textR);
+ return text;
+ }
+
+ static private void layoutLabelWithTextIcon(final Icon textRenderingIcon, final Icon icon,
+ final Rectangle viewR, final Rectangle iconR,
+ final Rectangle textR, final ZoomableLabel zLabel) {
+ JComponent c = (JComponent) zLabel;
+ int horizontalAlignment = zLabel.getHorizontalAlignment();
+ int horizontalTextPosition = zLabel.getHorizontalTextPosition();
+ boolean orientationIsLeftToRight = true;
+ int hAlign = horizontalAlignment;
+ int hTextPos = horizontalTextPosition;
+
+ if (c != null) {
+ if (!(c.getComponentOrientation().isLeftToRight())) {
+ orientationIsLeftToRight = false;
+ }
+ }
+
+ // Translate LEADING/TRAILING values in horizontalAlignment
+ // to LEFT/RIGHT values depending on the components orientation
+ switch (horizontalAlignment) {
+ case SwingUtilities.LEADING:
+ hAlign = (orientationIsLeftToRight) ? SwingUtilities.LEFT : SwingUtilities.RIGHT;
+ break;
+ case SwingUtilities.TRAILING:
+ hAlign = (orientationIsLeftToRight) ? SwingUtilities.RIGHT : SwingUtilities.LEFT;
+ break;
+ }
+
+ // Translate LEADING/TRAILING values in horizontalTextPosition
+ // to LEFT/RIGHT values depending on the components orientation
+ switch (horizontalTextPosition) {
+ case SwingUtilities.LEADING:
+ hTextPos = (orientationIsLeftToRight) ? SwingUtilities.LEFT : SwingUtilities.RIGHT;
+ break;
+ case SwingUtilities.TRAILING:
+ hTextPos = (orientationIsLeftToRight) ? SwingUtilities.RIGHT : SwingUtilities.LEFT;
+ break;
+ }
+ int verticalAlignment = zLabel.getVerticalAlignment();
+ int verticalTextPosition = zLabel.getVerticalTextPosition();
+ if (icon != null) {
+ iconR.width = icon.getIconWidth();
+ iconR.height = icon.getIconHeight();
+ }
+ else {
+ iconR.width = iconR.height = 0;
+ }
+
+ /* Initialize the text bounds rectangle textR. If a null
+ * or and empty String was specified we substitute "" here
+ * and use 0,0,0,0 for textR.
+ */
+
+ int lsb = 0;
+ int rsb = 0;
+ /* Unless both text and icon are non-null, we effectively ignore
+ * the value of textIconGap.
+ */
+ int gap;
+
+ int availTextWidth;
+ gap = (icon == null) ? 0 : zLabel.getIconTextGap();
+
+ if (hTextPos == SwingUtilities.CENTER) {
+ availTextWidth = viewR.width;
+ }
+ else {
+ availTextWidth = viewR.width - (iconR.width + gap);
+ }
+ textR.width = Math.min(availTextWidth, textRenderingIcon.getIconWidth());
+ textR.height = textRenderingIcon.getIconHeight();
+
+
+ /* Compute textR.x,y given the verticalTextPosition and
+ * horizontalTextPosition properties
+ */
+
+ if (verticalTextPosition == SwingUtilities.TOP) {
+ if (hTextPos != SwingUtilities.CENTER) {
+ textR.y = 0;
+ }
+ else {
+ textR.y = -(textR.height + gap);
+ }
+ }
+ else if (verticalTextPosition == SwingUtilities.CENTER) {
+ textR.y = (iconR.height / 2) - (textR.height / 2);
+ }
+ else { // (verticalTextPosition == BOTTOM)
+ if (hTextPos != SwingUtilities.CENTER) {
+ textR.y = iconR.height - textR.height;
+ }
+ else {
+ textR.y = (iconR.height + gap);
+ }
+ }
+
+ if (hTextPos == SwingUtilities.LEFT) {
+ textR.x = -(textR.width + gap);
+ }
+ else if (hTextPos == SwingUtilities.CENTER) {
+ textR.x = (iconR.width / 2) - (textR.width / 2);
+ }
+ else { // (horizontalTextPosition == RIGHT)
+ textR.x = (iconR.width + gap);
+ }
+
+ /* labelR is the rectangle that contains iconR and textR.
+ * Move it to its proper position given the labelAlignment
+ * properties.
+ *
+ * To avoid actually allocating a Rectangle, Rectangle.union
+ * has been inlined below.
+ */
+ int labelR_x = Math.min(iconR.x, textR.x);
+ int labelR_width = Math.max(iconR.x + iconR.width,
+ textR.x + textR.width) - labelR_x;
+ int labelR_y = Math.min(iconR.y, textR.y);
+ int labelR_height = Math.max(iconR.y + iconR.height,
+ textR.y + textR.height) - labelR_y;
+
+ int dx, dy;
+
+ if (verticalAlignment == SwingUtilities.TOP) {
+ dy = viewR.y - labelR_y;
+ }
+ else if (verticalAlignment == SwingUtilities.CENTER) {
+ dy = (viewR.y + (viewR.height / 2)) - (labelR_y + (labelR_height / 2));
+ }
+ else { // (verticalAlignment == BOTTOM)
+ dy = (viewR.y + viewR.height) - (labelR_y + labelR_height);
+ }
+
+ if (hAlign == SwingUtilities.LEFT) {
+ dx = viewR.x - labelR_x;
+ }
+ else if (hAlign == SwingUtilities.RIGHT) {
+ dx = (viewR.x + viewR.width) - (labelR_x + labelR_width);
+ }
+ else { // (horizontalAlignment == CENTER)
+ dx = (viewR.x + (viewR.width / 2)) -
+ (labelR_x + (labelR_width / 2));
+ }
+
+ /* Translate textR and glypyR by dx,dy.
+ */
+
+ textR.x += dx;
+ textR.y += dy;
+
+ iconR.x += dx;
+ iconR.y += dy;
+
+ if (lsb < 0) {
+ // lsb is negative. Shift the x location so that the text is
+ // visually drawn at the right location.
+ textR.x -= lsb;
+
+ textR.width += lsb;
+ }
+ if (rsb > 0) {
+ textR.width -= rsb;
+ }
+ }
+
+ @Override
+ public void paint(final Graphics g, final JComponent label) {
+ final ZoomableLabel mainView = (ZoomableLabel) label;
+ if (!mainView.useFractionalMetrics()) {
+ try {
+ isPainting = true;
+ superPaintSafe(g, mainView);
+ }
+ finally {
+ isPainting = false;
+ }
+ return;
+ }
+ final Graphics2D g2 = (Graphics2D) g;
+ final Object oldRenderingHintFM = g2.getRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS);
+ final Object newRenderingHintFM = RenderingHints.VALUE_FRACTIONALMETRICS_ON;
+ if (oldRenderingHintFM != newRenderingHintFM) {
+ g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, newRenderingHintFM);
+ }
+ final AffineTransform transform = g2.getTransform();
+ final float factor = 0.97f;
+ final float zoom = mainView.getZoom() * factor;
+ if(mainView.getVerticalAlignment() == SwingConstants.CENTER) {
+ final float translationFactorY = 0.5f;
+ g2.translate(0, mainView.getHeight() * (1f - factor) * translationFactorY);
+ }
+ g2.scale(zoom, zoom);
+ final boolean htmlViewSet = null != label.getClientProperty(BasicHTML.propertyKey);
+ try {
+ isPainting = true;
+ if(htmlViewSet){
+ GlyphPainterMetricResetter.resetPainter();
+ }
+ superPaintSafe(g, mainView);
+ }
+ finally {
+ isPainting = false;
+ if(htmlViewSet){
+ GlyphPainterMetricResetter.resetPainter();
+ }
+ }
+ g2.setTransform(transform);
+ if (oldRenderingHintFM != newRenderingHintFM) {
+ g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, oldRenderingHintFM != null ? oldRenderingHintFM
+ : RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT);
+ }
+ }
+
+ // Workaround for http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7126361
+ private void superPaintSafe(final Graphics g, final ZoomableLabel label) {
+ try {
+ Icon textRenderingIcon = getTextRenderingIcon(label);
+ if(textRenderingIcon != null)
+ paintIcons(g, label, textRenderingIcon);
+ else
+ super.paint(g, label);
+ } catch (ClassCastException e) {
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ label.setText(TextUtils.format("html_problem", label.getText()));
+ }
+ });
+ }
+ }
+
+ private void paintIcons(Graphics g, ZoomableLabel label, Icon textRenderingIcon) {
+ Icon icon = (label.isEnabled()) ? label.getIcon() : label.getDisabledIcon();
+ Rectangle paintViewR = new Rectangle();
+ Rectangle paintIconR = new Rectangle();
+ Rectangle paintTextR = new Rectangle();
+ layoutCL(label, null, null, icon, paintViewR, paintIconR, paintTextR);
+ if (icon != null) {
+ icon.paintIcon(label, g, paintIconR.x, paintIconR.y);
+ }
+ textRenderingIcon.paintIcon(label, g, paintTextR.x, paintTextR.y);
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent e) {
+ String name = e.getPropertyName();
+ if (name == "text" || "font" == name || "foreground" == name) {
+ JLabel lbl = ((JLabel) e.getSource());
+ if(getTextRenderingIcon(lbl) != null){
+ ScaledHTML.updateRenderer(lbl, "");
+ }
+ else{
+ String text = lbl.getText();
+ GlyphPainterMetricResetter.resetPainter();
+ try {
+ ScaledHTML.updateRenderer(lbl, text);
+ }
+ finally{
+ GlyphPainterMetricResetter.resetPainter();
+ }
+ View v = (View) lbl.getClientProperty(BasicHTML.propertyKey);
+ if (v != null) {
+ lbl.putClientProperty("preferredWidth", v.getPreferredSpan(View.X_AXIS));
+ }
+ }
+ }
+ else
+ super.propertyChange(e);
+
+ }
+
+ private Icon getTextRenderingIcon(JLabel lbl) {
+ return (Icon) lbl.getClientProperty(ZoomableLabel.TEXT_RENDERING_ICON);
+ }
+
+ @Override
+ protected void installComponents(JLabel c) {
+ ScaledHTML.updateRenderer(c, c.getText());
+ c.setInheritsPopupMenu(true);
+ }
+
+ public Rectangle getIconR(ZoomableLabel label) {
+ layout(label);
+ return iconR;
+ }
+
+ public Rectangle getTextR(ZoomableLabel label) {
+ layout(label);
+ return textR;
+ }
+
+ public LayoutData getLayoutData(ZoomableLabel label) {
+ layout(label);
+ return layoutData;
+ }
+
+ private void layout(ZoomableLabel label) {
+ String text = label.getText();
+ if(text == null || text.equals(""))
+ text = "!";
+ Icon icon = (label.isEnabled()) ? label.getIcon() :
+ label.getDisabledIcon();
+ boolean wasPainting = isPainting;
+ try{
+ isPainting = true;
+ iconR.x = iconR.y = iconR.width = iconR.height = 0;
+ textR.x = textR.y = textR.width = textR.height = 0;
+ layoutCL(label, label.getFontMetrics(), text, icon, viewR, iconR,textR);
+ final float zoom = label.getZoom();
+ iconR.x = (int)(iconR.x * zoom);
+ iconR.y = (int)(iconR.y * zoom);
+ iconR.width = (int)(iconR.width * zoom);
+ iconR.height = (int)(iconR.height * zoom);
+ textR.x = (int)(textR.x * zoom);
+ textR.y = (int)(textR.y * zoom);
+ textR.width = (int)(textR.width * zoom);
+ textR.height = (int)(textR.height * zoom);
+ }
+ finally{
+ isPainting = wasPainting;
+ }
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributePanelManager.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributePanelManager.java
new file mode 100644
index 0000000..0469e94
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributePanelManager.java
@@ -0,0 +1,262 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.attribute;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.util.List;
+import java.util.Vector;
+
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.border.TitledBorder;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.FormattedFormula;
+import org.freeplane.features.format.FormattedObject;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.INodeSelectionListener;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * Jan 9, 2011
+ */
+public class AttributePanelManager{
+ final private JPanel tablePanel;
+ private ModeController modeController;
+ private int axis = BoxLayout.Y_AXIS;
+ private class TableCreator implements INodeSelectionListener, INodeChangeListener{
+
+ private AttributeView attributeView;
+ private JComboBox formatChooser;
+
+ public void onDeselect(NodeModel node) {
+ removeOldView();
+ }
+
+ private void removeOldView() {
+ if(attributeView != null){
+ tablePanel.removeAll();
+ tablePanel.revalidate();
+ tablePanel.repaint();
+ attributeView.viewRemoved();
+ attributeView = null;
+ }
+ }
+
+ public void onSelect(NodeModel node) {
+ removeOldView();
+ final NodeView nodeView = (NodeView) Controller.getCurrentController()
+ .getMapViewManager().getSelectedComponent();
+ if (nodeView == null)
+ return;
+ AttributeController.getController(modeController).createAttributeTableModel(node);
+ attributeView = new AttributeView(nodeView, false);
+ Box buttonBox = new Box(axis);
+ buttonBox.setAlignmentX(0.5f);
+ tablePanel.add(buttonBox);
+ Dimension btnSize = new Dimension();
+ {
+ final JButton newAttributeButton = new JButton(TextUtils.getText("attributes_popup_new"));
+ newAttributeButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent arg0) {
+ attributeView.addRow();
+ }
+ });
+ increaseSize(btnSize, newAttributeButton);
+ buttonBox.add(newAttributeButton);
+ }
+ {
+ final JButton optimalWidthButton = new JButton(TextUtils.getText("attributes_popup_optimal_width"));
+ optimalWidthButton.addActionListener(new ActionListener() {
+ public void actionPerformed(final ActionEvent arg0) {
+ attributeView.setOptimalColumnWidths();
+ }
+ });
+ increaseSize(btnSize, optimalWidthButton);
+ buttonBox.add(optimalWidthButton);
+ }
+ {
+ formatChooser = createFormatChooser();
+ formatChooser.setEnabled(false);
+ increaseSize(btnSize, formatChooser);
+ buttonBox.add(formatChooser);
+ }
+ for (int i = 0; i < buttonBox.getComponentCount(); i++) {
+ buttonBox.getComponent(i).setMaximumSize(btnSize);
+ }
+ formatChooser.addItemListener(new ItemListener() {
+ boolean handlingEvent = false;
+
+ public void itemStateChanged(final ItemEvent e) {
+ if (handlingEvent || !formatChooser.isEnabled() || e.getStateChange() != ItemEvent.SELECTED)
+ return;
+ handlingEvent = true;
+ final PatternFormat newFormat = toPatternFormat(e.getItem());
+ final AttributeTable table = attributeView.getAttributeTable();
+ if (table.getSelectedColumn() == 1 && table.getSelectedRow() != -1) {
+ final Object value = table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
+ try {
+ final Object newValue = formatValue(newFormat, table, value);
+ if (newValue != null)
+ table.setValueAt(newValue, table.getSelectedRow(), table.getSelectedColumn());
+ }
+ catch (Exception e2) {
+ Controller.getCurrentController().getViewController()
+ .out("Pattern is not applicable: " + e2.getMessage());
+ LogUtils.warn("pattern is not applicable", e2);
+ }
+ }
+ handlingEvent = false;
+ }
+
+ public PatternFormat toPatternFormat(Object value) {
+ if (value instanceof PatternFormat)
+ return (PatternFormat) value;
+ final PatternFormat patternFormat = PatternFormat.guessPatternFormat(value.toString());
+ return (patternFormat == null) ? PatternFormat.getIdentityPatternFormat() : patternFormat;
+ }
+
+ private Object formatValue(final PatternFormat newFormat, final AttributeTable table,
+ final Object objectToBeFormatted) {
+ if (formatChooser.getSelectedItem() == null)
+ return null;
+ if (objectToBeFormatted instanceof IFormattedObject) {
+ final Object actualObject = ((IFormattedObject) objectToBeFormatted).getObject();
+ if(actualObject != objectToBeFormatted)
+ return formatValue(newFormat, table, actualObject);
+ }
+ if (newFormat == PatternFormat.getIdentityPatternFormat())
+ return makeFormattedObjectForIdentityFormat(objectToBeFormatted);
+ if (objectToBeFormatted instanceof String && ((String) objectToBeFormatted).startsWith("="))
+ return new FormattedFormula((String) objectToBeFormatted, newFormat.getPattern());
+ return newFormat.formatObject(objectToBeFormatted);
+ }
+
+ private FormattedObject makeFormattedObjectForIdentityFormat(final Object objectToBeFormatted) {
+ return new FormattedObject(String.valueOf(objectToBeFormatted), PatternFormat.IDENTITY_PATTERN);
+ }
+ });
+
+ attributeView.addTableSelectionListener(new ListSelectionListener() {
+ public void valueChanged(final ListSelectionEvent event) {
+ // update format chooser
+ if (!event.getValueIsAdjusting()) {
+ setSelectedFormatItem();
+ }
+ }
+ });
+ tablePanel.add(Box.createVerticalStrut(5));
+ JComponent c = attributeView.getContainer();
+ attributeView.update();
+ c.setAlignmentX(0.5f);
+ tablePanel.add(c);
+ tablePanel.add(Box.createGlue());
+ tablePanel.revalidate();
+ tablePanel.repaint();
+ }
+
+ private void setSelectedFormatItem() {
+ final AttributeTable table = attributeView.getAttributeTable();
+ if (table.getSelectedColumn() == 1 && table.getSelectedRow() != -1) {
+ formatChooser.setEnabled(true);
+ final Object value = table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
+ if (value instanceof IFormattedObject) {
+ final String format = ((IFormattedObject) value).getPattern();
+ formatChooser.setSelectedItem(PatternFormat.guessPatternFormat(format));
+ }
+ else {
+ formatChooser.setSelectedItem(null);
+ }
+ }
+ else {
+ formatChooser.setEnabled(false);
+ }
+ }
+
+ private JComboBox createFormatChooser() {
+ final List<PatternFormat> formats = FormatController.getController().getAllFormats();
+ Vector<PatternFormat> items = new Vector<PatternFormat>(formats);
+ for(int i = items.size()-1; i >= 0; i--){
+ if(! items.get(i).canFormat(NodeAttributeTableModel.class))
+ items.remove(i);
+ }
+ final JComboBox formatChooser = new JComboBoxWithBorder(items);
+ formatChooser.setEditable(true);
+ formatChooser.setSelectedItem(null);
+ final String NODE_FORMAT = "OptionPanel.nodeformat"; // duplicated from StyleEditorPanel
+ formatChooser.setToolTipText(TextUtils.getRawText(NODE_FORMAT + ".tooltip"));
+ formatChooser.setAlignmentX(Component.LEFT_ALIGNMENT);
+ formatChooser.setBorder(new TitledBorder(TextUtils.getText("value_format")));
+ return formatChooser;
+ }
+
+ private void increaseSize(final Dimension btnSize, final JComponent comp) {
+ final Dimension preferredSize = comp.getPreferredSize();
+ btnSize.width = Math.max(btnSize.width, preferredSize.width);
+ btnSize.height = Math.max(btnSize.height, preferredSize.height);
+ }
+
+ public void nodeChanged(NodeChangeEvent event) {
+ if(attributeView != null && event.getProperty().equals(NodeAttributeTableModel.class)){
+ setSelectedFormatItem();
+ }
+ }
+ }
+
+ public AttributePanelManager(final ModeController modeController){
+ this.modeController = modeController;
+ tablePanel = new JPanel();
+ tablePanel.setMinimumSize(new Dimension(0, 0));
+ tablePanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
+ tablePanel.setAlignmentX(JComponent.CENTER_ALIGNMENT);
+ tablePanel.setLayout(new BoxLayout(tablePanel, axis));
+ final TableCreator tableCreator = new TableCreator();
+ final MapController mapController = modeController.getMapController();
+ mapController.addNodeSelectionListener(tableCreator);
+ mapController.addNodeChangeListener(tableCreator);
+ }
+ public JPanel getTablePanel() {
+ return tablePanel;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributePopupMenu.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributePopupMenu.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/attribute/AttributePopupMenu.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributePopupMenu.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeTable.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeTable.java
new file mode 100644
index 0000000..9d71128
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeTable.java
@@ -0,0 +1,959 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.attribute;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.KeyboardFocusManager;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.net.URI;
+import java.util.EventObject;
+
+import javax.swing.AbstractCellEditor;
+import javax.swing.BorderFactory;
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultCellEditor;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.Icon;
+import javax.swing.JComboBox;
+import javax.swing.JComponent;
+import javax.swing.JFrame;
+import javax.swing.JOptionPane;
+import javax.swing.JTable;
+import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.TableModelEvent;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumnModel;
+import javax.swing.table.TableModel;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.ui.components.JComboBoxWithBorder;
+import org.freeplane.core.ui.components.TypedListCellRenderer;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.attribute.AttributeRegistry;
+import org.freeplane.features.attribute.AttributeTableLayoutModel;
+import org.freeplane.features.attribute.ColumnWidthChangeEvent;
+import org.freeplane.features.attribute.IAttributeTableModel;
+import org.freeplane.features.attribute.IColumnWidthChangeListener;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.edge.EdgeModel;
+import org.freeplane.features.format.FormattedObject;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.EditNodeBase;
+import org.freeplane.features.text.mindmapmode.EditNodeBase.EditedComponent;
+import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+
+/**
+ * @author Dimitry Polivaev
+ */
+class AttributeTable extends JTable implements IColumnWidthChangeListener {
+ private static final String EDITING_STOPPED = AttributeTable.class.getName() + ".editingStopped";
+ private static int CLICK_COUNT_TO_START = 2;
+
+ private static final class TableHeaderRendererImpl implements TableCellRenderer {
+ final private TableCellRenderer delegate;
+ TableHeaderRendererImpl(TableCellRenderer renderer){
+ this.delegate = renderer;
+ }
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
+ int row, int column) {
+ final Component c = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+ final int height = (int) (((AttributeTable)table).getZoom() * 6);
+ final Dimension preferredSize = new Dimension(1, height);
+ c.setPreferredSize(preferredSize);
+ return c;
+ }
+ }
+ @SuppressWarnings("serial")
+ private static final class TableHeader extends JTableHeader {
+ private TableHeader(TableColumnModel cm) {
+ super(cm);
+ }
+ @Override
+ protected TableCellRenderer createDefaultRenderer() {
+ return new TableHeaderRendererImpl(super.createDefaultRenderer());
+ }
+ }
+
+ static private class HeaderMouseListener extends MouseAdapter {
+ @Override
+ public void mouseReleased(final MouseEvent e) {
+ final JTableHeader header = (JTableHeader) e.getSource();
+ final AttributeTable table = (AttributeTable) header.getTable();
+ final float zoom = table.attributeView.getMapView().getZoom();
+ final AttributeTableModelDecoratorAdapter model = (AttributeTableModelDecoratorAdapter) table
+ .getModel();
+ for (int col = 0; col < table.getColumnCount(); col++) {
+ final int modelColumnWidth = model.getColumnWidth(col).toBaseUnitsRounded();
+ final int currentColumnWidth = (int) (table.getColumnModel().getColumn(col).getWidth() / zoom);
+ if (modelColumnWidth != currentColumnWidth) {
+ model.setColumnWidth(col, LengthUnits.pixelsInPt(currentColumnWidth));
+ }
+ }
+ }
+ }
+
+ static private class MyFocusListener implements FocusListener {
+ private AttributeTable focusedTable;
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent)
+ */
+ public void focusGained(final FocusEvent event) {
+ final Component source = (Component) event.getSource();
+ event.getOppositeComponent();
+ if (source instanceof AttributeTable) {
+ focusedTable = (AttributeTable) source;
+ }
+ else {
+ focusedTable = (AttributeTable) SwingUtilities.getAncestorOfClass(AttributeTable.class, source);
+ }
+ if(focusedTable != null){
+ focusedTable.setSelectedCellTypeInfo();
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ if (focusedTable != null) {
+ final Component newNodeViewInFocus = SwingUtilities.getAncestorOfClass(NodeView.class,
+ focusedTable);
+ if (newNodeViewInFocus != null) {
+ final NodeView viewer = (NodeView) newNodeViewInFocus;
+ if (viewer != viewer.getMap().getSelected()) {
+ viewer.getMap().selectAsTheOnlyOneSelected(viewer, false);
+ }
+ }
+ }
+ }
+ });
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent)
+ */
+ public void focusLost(final FocusEvent event) {
+ if (event.isTemporary()) {
+ return;
+ }
+ final Component oppositeComponent = event.getOppositeComponent();
+ if (oppositeComponent == null) {
+ return;
+ }
+ final Component newTable;
+ if (oppositeComponent instanceof AttributeTable) {
+ newTable = oppositeComponent;
+ }
+ else {
+ newTable = SwingUtilities.getAncestorOfClass(AttributeTable.class, oppositeComponent);
+ }
+ if (focusedTable == null) {
+ return;
+ }
+ if (focusedTable != newTable) {
+ if (focusedTable.isEditing()) {
+ focusedTable.clearSelection();
+ focusedTable.getCellEditor().stopCellEditing();
+ }
+ if (!focusedTable.attributeView.isPopupShown()) {
+ final AttributeView attributeView = focusedTable.getAttributeView();
+ final String currentAttributeViewType = AttributeRegistry.getRegistry(
+ attributeView.getNode().getMap()).getAttributeViewType();
+ if (attributeView.getViewType() != currentAttributeViewType) {
+ attributeView.stateChanged(null);
+ }
+ }
+ focusedTable = null;
+ return;
+ }
+ }
+ }
+
+ static private MouseListener componentListener = new HeaderMouseListener();
+ static private ComboBoxModel defaultComboBoxModel = null;
+ static private AttributeTableCellRenderer dtcr = new AttributeTableCellRenderer();
+ private static final int EXTRA_HEIGHT = 4;
+ static private MyFocusListener focusListener = new MyFocusListener();
+ static private CursorUpdater cursorUpdater = new CursorUpdater();
+ private static final int MAX_HEIGTH = 300;
+ private static final int MAX_WIDTH = 300;
+ private static final long serialVersionUID = 1L;
+ private static final float TABLE_ROW_HEIGHT = 4;
+
+ static ComboBoxModel getDefaultComboBoxModel() {
+ if (AttributeTable.defaultComboBoxModel == null) {
+ AttributeTable.defaultComboBoxModel = new DefaultComboBoxModel();
+ }
+ return AttributeTable.defaultComboBoxModel;
+ }
+
+ final private AttributeView attributeView;
+ private int highRowIndex = 0;
+ private static DefaultCellEditor dce;
+
+ AttributeTable(final AttributeView attributeView) {
+ super();
+ this.attributeView = attributeView;
+ addFocusListener(AttributeTable.focusListener);
+ addMouseListener(AttributeTable.cursorUpdater);
+ addMouseMotionListener(AttributeTable.cursorUpdater);
+ if (attributeView.getMapView().getModeController().canEdit()) {
+ tableHeader.addMouseListener(AttributeTable.componentListener);
+ }
+ else {
+ tableHeader.setResizingAllowed(false);
+ }
+ setModel(attributeView.getCurrentAttributeTableModel());
+ setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+ getTableHeader().setReorderingAllowed(false);
+ setRowSelectionAllowed(false);
+ putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
+ }
+
+ @Override
+ protected JTableHeader createDefaultTableHeader() {
+ return new TableHeader(columnModel);
+ }
+
+ private void changeSelectedRowHeight(final int rowIndex) {
+ if (highRowIndex != rowIndex) {
+ if (highRowIndex < getRowCount()) {
+ final int h = getRowHeight(highRowIndex);
+ setRowHeight(highRowIndex, h - AttributeTable.EXTRA_HEIGHT);
+ }
+ final int h = getRowHeight(rowIndex);
+ setRowHeight(rowIndex, h + AttributeTable.EXTRA_HEIGHT);
+ highRowIndex = rowIndex;
+ assert highRowIndex >= 0;
+ }
+ }
+
+ @Override
+ public void changeSelection(int rowIndex, int columnIndex, final boolean toggle, final boolean extend) {
+ final int rowCount = getRowCount();
+ if (rowCount == 0) {
+ return;
+ }
+ if (rowIndex >= rowCount) {
+ rowIndex = 0;
+ columnIndex = 0;
+ }
+ changeSelectedRowHeight(rowIndex);
+ super.changeSelection(rowIndex, columnIndex, toggle, extend);
+ }
+
+ public void columnWidthChanged(final ColumnWidthChangeEvent event) {
+ final float zoom = getZoom();
+ final int col = event.getColumnNumber();
+ final AttributeTableLayoutModel layoutModel = (AttributeTableLayoutModel) event.getSource();
+ final int width = layoutModel.getColumnWidth(col).toBaseUnitsRounded();
+ getColumnModel().getColumn(col).setPreferredWidth((int) (width * zoom));
+ final MapView map = attributeView.getMapView();
+ final NodeModel node = attributeView.getNode();
+ map.getModeController().getMapController().nodeChanged(node);
+ }
+
+ /**
+ * @return Returns the currentModel.
+ */
+ public AttributeTableModelDecoratorAdapter getAttributeTableModel() {
+ return (AttributeTableModelDecoratorAdapter) getModel();
+ }
+
+ public AttributeView getAttributeView() {
+ return attributeView;
+ }
+
+
+
+ @Override
+ public boolean editCellAt(int row, int column, EventObject e) {
+ if(isEditing() && getCellEditor() instanceof DialogTableCellEditor){
+ return false;
+ }
+ if(column == 1 && e instanceof MouseEvent){
+ final MouseEvent me = (MouseEvent) e;
+ final Object value = getValueAt(row, column);
+ if(value instanceof URI){
+ final URI uri = (URI) value;
+ final Icon linkIcon = getLinkIcon(uri);
+ final int xmax = linkIcon != null ? linkIcon.getIconWidth() : 0;
+ final int x = me.getX() - getColumnModel().getColumn(0).getWidth();
+ if(x < xmax){
+ LinkController.getController().loadURL(attributeView.getNode(), new ActionEvent(me.getSource(), me.getID(), null), uri);
+ return false;
+ }
+ }
+ }
+ putClientProperty("AttributeTable.EditEvent", e);
+ try{
+ if(super.editCellAt(row, column, e)){
+ final TableCellEditor cellEditor = getCellEditor();
+ if(isEditing() && cellEditor instanceof DialogTableCellEditor){
+ ((JComponent)editorComp).paintImmediately(0, 0, editorComp.getWidth(), editorComp.getHeight());
+ ((DialogTableCellEditor)cellEditor).startEditing();
+ return false;
+ }
+ return true;
+ }
+ return false;
+ }
+ finally{
+ putClientProperty("AttributeTable.EditEvent", null);
+ }
+ }
+
+ Icon getLinkIcon(final URI uri) {
+ NodeModel nodeModel = ((IAttributeTableModel)getModel()).getNode();
+ final Icon linkIcon = Controller.getCurrentModeController().getExtension(LinkController.class).getLinkIcon(uri, nodeModel);
+ return linkIcon;
+ }
+
+ @SuppressWarnings("serial")
+ private class DialogTableCellEditor extends AbstractCellEditor implements TableCellEditor{
+
+ final private IEditControl editControl;
+ private Object value;
+ private EditNodeBase editBase;
+ public DialogTableCellEditor() {
+ super();
+ editControl = new IEditControl() {
+ public void split(String newText, int position) {
+ }
+
+ public void ok(String newText) {
+ value = newText;
+ stopCellEditing();
+ }
+
+ public void cancel() {
+ stopCellEditing();
+ }
+
+ public boolean canSplit() {
+ return false;
+ }
+
+ public EditedComponent getEditType() {
+ return EditedComponent.TEXT;
+ }
+ };
+ }
+
+ public IEditControl getEditControl() {
+ return editControl;
+ }
+
+ public void setEditBase(EditNodeBase editBase) {
+ this.editBase = editBase;
+ }
+
+ public Object getCellEditorValue() {
+ return value;
+ }
+
+ public void startEditing(){
+ if(editBase == null){
+ return;
+ }
+ final JFrame frame = (JFrame) JOptionPane.getFrameForComponent(AttributeTable.this);
+ editBase.show(frame);
+ }
+
+ public boolean isCellEditable(EventObject anEvent) {
+ if (anEvent instanceof MouseEvent) {
+ return ((MouseEvent)anEvent).getClickCount() >= CLICK_COUNT_TO_START;
+ }
+ return true;
+ }
+ public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
+ return new AttributeTableCellRenderer().getTableCellRendererComponent(table, value, true, true, row, column);
+ }
+ };
+
+ @Override
+ public TableCellEditor getCellEditor(final int row, final int col) {
+ return getCellEditor(row, col, (EventObject) getClientProperty("AttributeTable.EditEvent"));
+ }
+
+ @SuppressWarnings("serial")
+ public TableCellEditor getCellEditor(final int row, final int col, EventObject e) {
+ if (dce != null) {
+ dce.stopCellEditing();
+ }
+ if(col == 1){
+ final MTextController textController = (MTextController) TextController.getController();
+ if(e instanceof KeyEvent){
+ final KeyEvent kev = (KeyEvent) e;
+ textController.getEventQueue().setFirstEvent(kev);
+ }
+ final IAttributeTableModel model = (IAttributeTableModel) getModel();
+ final String text = getValueForEdit(row, col);
+ final DialogTableCellEditor dialogTableCellEditor = new DialogTableCellEditor();
+ EditNodeBase base = textController.getEditNodeBase(model.getNode(), text, dialogTableCellEditor.getEditControl(), false);
+ if(base != null){
+ dialogTableCellEditor.setEditBase(base);
+ return dialogTableCellEditor;
+ }
+ }
+ final JComboBox comboBox;
+ if (dce == null) {
+ comboBox = new JComboBoxWithBorder(){
+
+ // Workaround for bug introduced in Java 8: they use wrong component in DefaultCellEditor.EditorDelegate
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if(e != null && e.getSource() == dce){
+ super.actionPerformed(new ActionEvent(getEditor(), e.getID(), e.getActionCommand(),e.getWhen(),e.getModifiers()));
+ }
+ else
+ super.actionPerformed(e);
+ }
+
+ };
+ comboBox.addFocusListener(AttributeTable.focusListener);
+ comboBox.getEditor().getEditorComponent().addFocusListener(AttributeTable.focusListener);
+ comboBox.setRenderer(new TypedListCellRenderer());
+ dce = new DefaultCellEditor(comboBox) {
+ public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int col) {
+ return super.getTableCellEditorComponent(table, ((AttributeTable)table).getValueForEdit(row, col), isSelected, row, col);
+ }
+ };
+ dce.setClickCountToStart(CLICK_COUNT_TO_START);
+ }
+ return dce;
+ }
+
+ private String getValueForEdit(final int row, final int col) {
+ final Object value = getValueAt(row, col);
+ return (value instanceof IFormattedObject ? ((IFormattedObject) value).getObject() : value).toString();
+ }
+
+
+ @Override
+ public TableCellRenderer getCellRenderer(final int row, final int column) {
+ return AttributeTable.dtcr;
+ }
+
+ @Override
+ public Dimension getPreferredScrollableViewportSize() {
+ if (!isValid()) {
+ validate();
+ }
+ final Dimension dimension = super.getPreferredSize();
+ NodeView nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, this);
+ if(nodeView != null){
+ final MapView map = nodeView.getMap();
+ final ModeController modeController = map.getModeController();
+ final NodeStyleController nsc = NodeStyleController.getController(modeController);
+ dimension.width = Math.min(map.getZoomed(nsc.getMaxWidth(nodeView.getModel()).toBaseUnits()), dimension.width);
+ dimension.height = Math.min(map.getZoomed(AttributeTable.MAX_HEIGTH) - getTableHeaderHeight(), dimension.height);
+ }
+ else{
+ dimension.width = Math.min(MAX_WIDTH, dimension.width);
+ dimension.height = Math.min(MAX_HEIGTH, dimension.height);
+ }
+ return dimension;
+ }
+
+ int getTableHeaderHeight() {
+ final JTableHeader tableHeader = getTableHeader();
+ return tableHeader != null ? tableHeader.getPreferredSize().height : 0;
+ }
+
+ float getZoom() {
+ final MapView mapView = attributeView.getMapView();
+ if(SwingUtilities.isDescendingFrom(this, mapView)) {
+ return mapView.getZoom();
+ }
+ return 1f;
+ }
+
+ /**
+ */
+ public void insertRow(final int row) {
+ if (getModel() instanceof ExtendedAttributeTableModelDecorator) {
+ final ExtendedAttributeTableModelDecorator model = (ExtendedAttributeTableModelDecorator) getModel();
+ if (isEditing() && getCellEditor() != null && !getCellEditor().stopCellEditing()) {
+ return;
+ }
+ model.insertRow(row);
+ changeSelection(row, 0, false, false);
+ if (editCellAt(row, 0)) {
+ getEditorComponent().requestFocusInWindow();
+ }
+ }
+ }
+
+ @Override
+ public boolean isVisible() {
+ return super.isVisible() && attributeView.areAttributesVisible();
+ }
+
+ /**
+ */
+ public void moveRowDown(final int row) {
+ if (getModel() instanceof ExtendedAttributeTableModelDecorator && row < getRowCount() - 1) {
+ final ExtendedAttributeTableModelDecorator model = (ExtendedAttributeTableModelDecorator) getModel();
+ model.moveRowDown(row);
+ changeSelection(row + 1, getSelectedColumn(), false, false);
+ }
+ }
+
+ /**
+ */
+ public void moveRowUp(final int row) {
+ if (getModel() instanceof ExtendedAttributeTableModelDecorator && row > 0) {
+ final ExtendedAttributeTableModelDecorator model = (ExtendedAttributeTableModelDecorator) getModel();
+ model.moveRowUp(row);
+ changeSelection(row - 1, getSelectedColumn(), false, false);
+ }
+ }
+
+ @Override
+ public Component prepareEditor(final TableCellEditor tce, final int row, final int col) {
+ if(tce instanceof DialogTableCellEditor){
+ return super.prepareEditor(tce, row, col);
+ }
+ final JComboBox comboBox = (JComboBox) ((DefaultCellEditor) tce).getComponent();
+ final NodeModel node = getAttributeTableModel().getNode();
+ final AttributeRegistry attributes = AttributeRegistry.getRegistry(node.getMap());
+ final ComboBoxModel model;
+ switch (col) {
+ case 0:
+ model = attributes.getComboBoxModel();
+ comboBox.setEditable(!attributes.isRestricted());
+ break;
+ case 1:
+ final String attrName = getAttributeTableModel().getValueAt(row, 0).toString();
+ model = attributes.getDefaultComboBoxModel(attrName);
+ comboBox.setEditable(!attributes.isRestricted(attrName));
+ break;
+ default:
+ model = AttributeTable.getDefaultComboBoxModel();
+ }
+ final Object[] items = new Object[model.getSize()];
+ for (int i = 0; i < items.length; i++) {
+ items[i] = model.getElementAt(i);
+ }
+ final DefaultComboBoxModel currentModel = new DefaultComboBoxModel(items);
+ comboBox.setModel(currentModel);
+ updateComponentColors(comboBox);
+ final JComponent editorComponent = (JComponent) comboBox.getEditor().getEditorComponent();
+ updateComponentColors(editorComponent);
+ editorComponent.setOpaque(true);
+ final Font font = editorComponent.getFont();
+ editorComponent.setFont(font.deriveFont(font.getSize2D() * getZoom()));
+ return super.prepareEditor(tce, row, col);
+ }
+
+ @Override
+ public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
+ Object value = getValueAt(row, column);
+
+ boolean isSelected = false;
+ boolean hasFocus = false;
+
+ // Only indicate the selection and focused cell if not printing
+ MapView map = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, this);
+ if (map == null || ! map.isPrinting()) {
+ isSelected = isCellSelected(row, column);
+
+ boolean rowIsLead =
+ (selectionModel.getLeadSelectionIndex() == row);
+ boolean colIsLead =
+ (columnModel.getSelectionModel().getLeadSelectionIndex() == column);
+
+ final Window windowAncestor = SwingUtilities.getWindowAncestor(this);
+ hasFocus = (rowIsLead && colIsLead) && windowAncestor != null && equals(windowAncestor.getMostRecentFocusOwner());
+ }
+
+ return renderer.getTableCellRendererComponent(this, value,
+ isSelected, hasFocus,
+ row, column);
+ }
+
+ @Override
+ protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
+ if (ks.getKeyCode() == KeyEvent.VK_TAB && e.getModifiers() == 0 && pressed && getSelectedColumn() == 1
+ && getSelectedRow() == getRowCount() - 1 && getModel() instanceof ExtendedAttributeTableModelDecorator) {
+ insertRow(getRowCount());
+ return true;
+ }
+ if (ks.getKeyCode() == KeyEvent.VK_ESCAPE && e.getModifiers() == 0 && pressed) {
+ if (! isEditing()){
+ attributeView.getNodeView().requestFocusInWindow();
+ return true;
+ }
+ else
+ return super.processKeyBinding(ks, e, condition, pressed);
+
+ }
+ boolean retValue = super.processKeyBinding(ks, e, condition, pressed);
+ if (!retValue && condition == JComponent.WHEN_FOCUSED && isFocusOwner() && ks.getKeyCode() != KeyEvent.VK_TAB
+ && e != null && e.getID() == KeyEvent.KEY_PRESSED && !e.isActionKey()
+ && e.getKeyChar() != KeyEvent.CHAR_UNDEFINED
+ && 0 == (e.getModifiers() & (InputEvent.CTRL_MASK | InputEvent.ALT_MASK))) {
+ final int leadRow = getSelectionModel().getLeadSelectionIndex();
+ final int leadColumn = getColumnModel().getSelectionModel().getLeadSelectionIndex();
+ if (leadRow != -1 && leadColumn != -1 && !isEditing()) {
+ if (!editCellAt(leadRow, leadColumn, e)) {
+ return false;
+ }
+ }
+ final Component editorComponent = getEditorComponent();
+ if (editorComponent instanceof JComboBox) {
+ final JComboBox comboBox = (JComboBox) editorComponent;
+ if (comboBox.isEditable()) {
+ final ComboBoxEditor editor = comboBox.getEditor();
+ editor.selectAll();
+ KeyEvent keyEv;
+ keyEv = new KeyEvent(editor.getEditorComponent(), KeyEvent.KEY_TYPED, e.getWhen(),
+ e.getModifiers(), KeyEvent.VK_UNDEFINED, e.getKeyChar(), KeyEvent.KEY_LOCATION_UNKNOWN);
+ retValue = SwingUtilities.processKeyBindings(keyEv);
+ }
+ else {
+ editorComponent.requestFocusInWindow();
+ retValue = true;
+ }
+ }
+ }
+ if (ks.getKeyCode() == KeyEvent.VK_SPACE) {
+ return true;
+ }
+ return retValue;
+ }
+
+ @Override
+ public void removeEditor() {
+ final Component editorComponent = getEditorComponent();
+ final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+ boolean requestFocus = editorComponent != null && focusOwner != null &&
+ (focusOwner == editorComponent || SwingUtilities.isDescendingFrom(focusOwner, editorComponent));
+ getAttributeTableModel().editingCanceled();
+ final boolean focusCycleRoot = isFocusCycleRoot();
+ setFocusCycleRoot(true);
+ super.removeEditor();
+ setFocusCycleRoot(focusCycleRoot);
+ if(requestFocus)
+ requestFocusInWindow();
+ }
+
+ /**
+ */
+ public void removeRow(final int row) {
+ if (getModel() instanceof ExtendedAttributeTableModelDecorator) {
+ final ExtendedAttributeTableModelDecorator model = (ExtendedAttributeTableModelDecorator) getModel();
+ model.removeRow(row);
+ final int rowCount = getRowCount();
+ if (row <= rowCount - 1) {
+ changeSelection(row, getSelectedColumn(), false, false);
+ }
+ else if (rowCount >= 1) {
+ changeSelection(row - 1, getSelectedColumn(), false, false);
+ }
+ }
+ }
+
+ @Override
+ public void setModel(final TableModel dataModel) {
+ super.setModel(dataModel);
+ }
+
+ /**
+ *
+ */
+ public void setOptimalColumnWidths() {
+ Component comp = null;
+ int cellWidth = 0;
+ int maxCellWidth = 2 * (int) (Math.ceil(getFont().getSize2D() / UITools.FONT_SCALE_FACTOR + AttributeTable.TABLE_ROW_HEIGHT));
+ for (int col = 0; col < 2; col++) {
+ for (int row = 0; row < getRowCount(); row++) {
+ comp = AttributeTable.dtcr.getTableCellRendererComponent(this, getValueAt(row, col), false, false, row,
+ col);
+ cellWidth = comp.getPreferredSize().width;
+ maxCellWidth = Math.max(cellWidth, maxCellWidth);
+ }
+ getAttributeTableModel().setColumnWidth(col, LengthUnits.pixelsInPt(maxCellWidth + 1));
+ }
+ }
+
+ @Override
+ public void tableChanged(final TableModelEvent e) {
+ if(isEditing() && null == getClientProperty(EDITING_STOPPED) ){
+ removeEditor();
+ }
+ int selectedRow = getSelectedRow();
+ super.tableChanged(e);
+ if (getParent() == null) {
+ return;
+ }
+ switch(e.getType())
+ {
+ case TableModelEvent.DELETE:
+ if(selectedRow != -1 ){
+ if(e.getFirstRow() <= selectedRow){
+ if( e.getLastRow() >= selectedRow && e.getFirstRow() != 0) {
+ changeSelection(e.getFirstRow() - 1, 0, false, false);
+ }
+ else if(e.getLastRow() < selectedRow){
+ int rowIndex = selectedRow - (e.getLastRow() - e.getFirstRow() + 1);
+ if(rowIndex < 0){
+ rowIndex = 0;
+ }
+ if(rowIndex < getRowCount()){
+ changeSelection(rowIndex , getSelectedColumn(), false, false);
+ }
+ }
+ }
+ }
+ break;
+ case TableModelEvent.INSERT:
+ changeSelection(e.getFirstRow() , getSelectedColumn(), false, false);
+ break;
+ default:
+ if(selectedRow > getRowCount() && getRowCount() > 0){
+ changeSelection(getRowCount() - 1 , getSelectedColumn(), false, false);
+ }
+ }
+ getParent().getParent().invalidate();
+ final NodeModel node = attributeView.getNode();
+ MapController mapController = attributeView.getMapView().getModeController().getMapController();
+ mapController.nodeChanged(node, NodeAttributeTableModel.class, null, null);
+ }
+
+ void updateAttributeTable() {
+ updateComponentColors(this);
+ updateGridColor();
+ updateRowHeights();
+ updateColumnWidths();
+ }
+
+ private void updateGridColor() {
+ final NodeView nodeView = attributeView.getNodeView();
+ if(! SwingUtilities.isDescendingFrom(this, nodeView))
+ return;
+ final MapView mapView = nodeView.getMap();
+ final MapStyleModel model = MapStyleModel.getExtension(mapView.getModel());
+ final NodeModel attributeStyleNode = model.getStyleNodeSafe(MapStyleModel.ATTRIBUTE_STYLE);
+ final EdgeModel edge = EdgeModel.getModel(attributeStyleNode);
+ if(edge != null){
+ final Color edgeColor = edge.getColor();
+ setGridAndBorderColor(edgeColor);
+ }
+ else
+ this.gridColor = null;
+ }
+
+ private Color gridColor = null;
+ public void setGridAndBorderColor(Color gridColor) {
+ this.gridColor = gridColor;
+ if(gridColor != null) {
+ if(! gridColor.equals(getGridColor())) {
+ AttributeViewScrollPane scrollPane = (AttributeViewScrollPane) SwingUtilities.getAncestorOfClass(AttributeViewScrollPane.class, this);
+ scrollPane.setBorder(BorderFactory.createLineBorder(gridColor));
+ super.setGridColor(gridColor);
+ }
+ }
+ }
+
+ private void updateColumnWidths() {
+ final float zoom = getZoom();
+ for (int i = 0; i < 2; i++) {
+ final int width = (int) (getAttributeTableModel().getColumnWidth(i).toBaseUnitsRounded() * zoom);
+ getColumnModel().getColumn(i).setPreferredWidth(width);
+ }
+ }
+
+ private void updateComponentColors(final JComponent c) {
+ final NodeView nodeView = attributeView.getNodeView();
+ if(! SwingUtilities.isDescendingFrom(this, nodeView))
+ return;
+ final MapView mapView = nodeView.getMap();
+ final ModeController modeController = mapView.getModeController();
+ final NodeStyleController style = (NodeStyleController) modeController.getExtension(NodeStyleController.class);
+ final MapStyleModel model = MapStyleModel.getExtension(mapView.getModel());
+ final NodeModel attributeStyleNode = model.getStyleNodeSafe(MapStyleModel.ATTRIBUTE_STYLE);
+ final Font font = style.getFont(attributeStyleNode);
+ c.setFont(font.deriveFont(UITools.FONT_SCALE_FACTOR * font.getSize2D()));
+ final Color backgroundColor = NodeStyleModel.getBackgroundColor(attributeStyleNode);
+ if(backgroundColor!= null) {
+ c.setOpaque(true);
+ c.setBackground(backgroundColor);
+ } else {
+ c.setBackground(nodeView.getBackgroundColor());
+ c.setOpaque(false);
+ }
+ c.setForeground(style.getColor(attributeStyleNode));
+ }
+
+ private void updateRowHeights() {
+ if(! isDisplayable()){
+ addHierarchyListener(new HierarchyListener() {
+ public void hierarchyChanged(HierarchyEvent e) {
+ if(isDisplayable()){
+ updateRowHeights();
+ removeHierarchyListener(this);
+ }
+ }
+ });
+ return;
+ }
+ final int rowCount = getRowCount();
+ if (rowCount == 0) {
+ return;
+ }
+ final int constHeight = getTableHeaderHeight() + AttributeTable.EXTRA_HEIGHT;
+ final float zoom = getZoom();
+ final float fontSize = (float) getFont().getMaxCharBounds(((Graphics2D)getGraphics()).getFontRenderContext()).getHeight();
+ final float tableRowHeight = fontSize + zoom * AttributeTable.TABLE_ROW_HEIGHT;
+ int newHeight = (int) ((tableRowHeight * rowCount + (zoom - 1) * constHeight) / rowCount);
+ if (newHeight < 1) {
+ newHeight = 1;
+ }
+ final int highRowsNumber = (int) ((tableRowHeight - newHeight) * rowCount);
+ for (int i = 0; i < highRowsNumber; i++) {
+ setRowHeight(i, 1 + newHeight + (i == highRowIndex ? AttributeTable.EXTRA_HEIGHT : 0));
+ }
+ for (int i = highRowsNumber; i < rowCount; i++) {
+ setRowHeight(i, newHeight + (i == highRowIndex ? AttributeTable.EXTRA_HEIGHT : 0));
+ }
+ }
+
+ public void viewRemoved(NodeView nodeView) {
+ getModel().removeTableModelListener(this);
+ }
+
+ @Override
+ public void editingStopped(ChangeEvent e) {
+ if(isEditing() && null == getClientProperty(EDITING_STOPPED) ) {
+ try{
+ putClientProperty(EDITING_STOPPED, Boolean.TRUE);
+ // Take in the new value
+ TableCellEditor editor = getCellEditor();
+ if (editor != null) {
+ final Object value = editor.getCellEditorValue();
+ if (value != null) {
+ final String pattern = extractPatternIfAvailable(getValueAt(editingRow, editingColumn));
+ final Object newValue = enforceFormattedObjectForIdentityPattern(value, pattern);
+ setValueAt(newValue, editingRow, editingColumn);
+ }
+ removeEditor();
+ }
+ }
+ finally{
+ putClientProperty(EDITING_STOPPED, null);
+ }
+ }
+ }
+
+ private String extractPatternIfAvailable(final Object oldValue) {
+ return oldValue instanceof IFormattedObject ? ((IFormattedObject) oldValue).getPattern() : null;
+ }
+
+ // unfortunately we have to handle IDENTITY_PATTERN explicitely since (only) attributes
+ // have no place for the format except for the value itself - so we need a FormattedObject here
+ private Object enforceFormattedObjectForIdentityPattern(Object value, final String pattern) {
+ final MTextController textController = (MTextController) TextController.getController();
+ return PatternFormat.IDENTITY_PATTERN.equals(pattern) ? new FormattedObject(value, pattern) : textController
+ .guessObjectOrURI(value, pattern);
+ }
+
+ @Override
+ public void setValueAt(Object aValue, int row, int column) {
+ super.setValueAt(column == 0 ? aValue.toString() : aValue, row, column);
+ setSelectedCellTypeInfo();
+ }
+
+ @Override
+ public void valueChanged(ListSelectionEvent e) {
+ super.valueChanged(e);
+ setSelectedCellTypeInfo();
+ }
+
+
+
+ @Override
+ public void columnSelectionChanged(ListSelectionEvent e) {
+ super.columnSelectionChanged(e);
+ setSelectedCellTypeInfo();
+ }
+
+ private void setSelectedCellTypeInfo() {
+ final int r = getSelectedRow();
+ final int c = getSelectedColumn();
+ if(r >= 0 && c >= 0){
+ final Object value = getValueAt(r, c);
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ viewController.addObjectTypeInfo(value);
+ }
+ }
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ if(gridColor == null){
+ final NodeView nodeView = attributeView.getNodeView();
+ if(SwingUtilities.isDescendingFrom(this, nodeView))
+ setGridAndBorderColor(nodeView.getEdgeColor());
+ }
+ super.paintComponent(g);
+ }
+
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeTableCellRenderer.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeTableCellRenderer.java
new file mode 100644
index 0000000..f98e449
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeTableCellRenderer.java
@@ -0,0 +1,176 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.attribute;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
+import java.net.URI;
+
+import javax.swing.BorderFactory;
+import javax.swing.Icon;
+import javax.swing.JTable;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.table.DefaultTableCellRenderer;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.attribute.IAttributeTableModel;
+import org.freeplane.features.text.HighlightedTransformedObject;
+import org.freeplane.features.text.TextController;
+
+class AttributeTableCellRenderer extends DefaultTableCellRenderer {
+ public AttributeTableCellRenderer() {
+ super();
+ defaultBorder = getBorder();
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ static final float ZOOM_CORRECTION_FACTOR = 0.97F;
+ private boolean isPainting;
+ private float zoom;
+ private boolean opaque;
+ final private Border defaultBorder;
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.JComponent#getHeight()
+ */
+ @Override
+ public int getHeight() {
+ if (isPainting) {
+ if (zoom != 1F) {
+ return (int) (super.getHeight() / zoom);
+ }
+ }
+ return super.getHeight();
+ }
+
+ @Override
+ public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected,
+ final boolean hasFocus, final int row, final int column) {
+ final Component rendererComponent = super.getTableCellRendererComponent(table, value, hasFocus, isSelected, row,
+ column);
+ if (hasFocus) {
+ setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
+ }
+ final AttributeTable attributeTable = (AttributeTable) table;
+ zoom = attributeTable.getZoom();
+ final IAttributeTableModel attributeTableModel = (IAttributeTableModel) table.getModel();
+ final String originalText = value == null ? null : value.toString();
+ String text = originalText;
+ setBorder(defaultBorder);
+ Icon icon;
+ if (column == 1 && value != null) {
+ try {
+ // evaluate values only
+ final TextController textController = TextController.getController();
+ Object transformedObject = textController.getTransformedObject(value, attributeTableModel.getNode(), null);
+ text = transformedObject.toString();
+ if (transformedObject instanceof HighlightedTransformedObject && TextController.isMarkTransformedTextSet()) {
+ setBorder(BorderFactory.createLineBorder(Color.GREEN));
+ }
+ }
+ catch (Exception e) {
+ text = TextUtils.format("MainView.errorUpdateText", originalText, e.getLocalizedMessage());
+ setBorder(BorderFactory.createLineBorder(Color.RED));
+ }
+ if(value instanceof URI){
+ icon = ((AttributeTable)table).getLinkIcon((URI) value);
+ }
+ else{
+ icon = null;
+ }
+ }
+ else{
+ icon = null;
+ }
+ if(icon != getIcon()){
+ setIcon(icon);
+ }
+ setText(text);
+ if(text != originalText){
+ final String toolTip = HtmlUtils.isHtmlNode(originalText) ? text : HtmlUtils.plainToHTML(originalText);
+ setToolTipText(toolTip);
+ }
+ else{
+ final int prefWidth = getPreferredSize().width;
+ final int width = table.getColumnModel().getColumn(column).getWidth();
+ if (prefWidth > width) {
+ final String toolTip = HtmlUtils.isHtmlNode(text) ? text : HtmlUtils.plainToHTML(text);
+ setToolTipText(toolTip);
+ }
+ else {
+ setToolTipText(null);
+ }
+ }
+ setOpaque(hasFocus);
+ return rendererComponent;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see javax.swing.JComponent#getWidth()
+ */
+ @Override
+ public int getWidth() {
+ if (isPainting) {
+ if (zoom != 1F) {
+ return (int) (0.99f + super.getWidth() / zoom);
+ }
+ }
+ return super.getWidth();
+ }
+
+ @Override
+ public void paint(final Graphics g) {
+ final Graphics2D g2 = (Graphics2D) g;
+ if (zoom != 1F) {
+ zoom *= AttributeTableCellRenderer.ZOOM_CORRECTION_FACTOR;
+ final AffineTransform transform = g2.getTransform();
+ g2.scale(zoom, zoom);
+ isPainting = true;
+ super.paint(g);
+ isPainting = false;
+ g2.setTransform(transform);
+ }
+ else {
+ super.paint(g);
+ }
+ }
+
+ @Override
+ public boolean isOpaque() {
+ return opaque;
+ }
+
+ @Override
+ public void setOpaque(boolean opaque) {
+ this.opaque = opaque;
+ }
+
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeTableModelDecoratorAdapter.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeTableModelDecoratorAdapter.java
new file mode 100644
index 0000000..3fc0cc2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeTableModelDecoratorAdapter.java
@@ -0,0 +1,158 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.attribute;
+
+import javax.swing.event.ChangeListener;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.AbstractTableModel;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.AttributeRegistry;
+import org.freeplane.features.attribute.IAttributeTableModel;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ */
+abstract class AttributeTableModelDecoratorAdapter extends AbstractTableModel
+ implements IAttributeTableModel,
+ TableModelListener, ChangeListener{
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ final private AttributeController attributeController;
+ private AttributeRegistry attributeRegistry;
+ private NodeAttributeTableModel nodeAttributeModel;
+ final private TextController textController;
+
+ public AttributeTableModelDecoratorAdapter(final AttributeView attrView) {
+ super();
+ final ModeController modeController = attrView.getMapView().getModeController();
+ attributeController = AttributeController.getController(modeController);
+ textController = TextController.getController(modeController);
+ setNodeAttributeModel(attrView.getAttributes());
+ setAttributeRegistry(attrView.getAttributeRegistry());
+ getNodeAttributeModel().getNode();
+ addListeners();
+ }
+
+ private void addListeners() {
+ getNodeAttributeModel().addTableModelListener(this);
+ getAttributeRegistry().addChangeListener(this);
+ }
+
+ /**
+ * @param view
+ */
+ public abstract boolean areAttributesVisible();
+
+ public void editingCanceled() {
+ }
+
+ public AttributeController getAttributeController() {
+ return attributeController;
+ }
+
+ public AttributeRegistry getAttributeRegistry() {
+ return attributeRegistry;
+ }
+
+ @Override
+ public Class<?> getColumnClass(final int columnIndex) {
+ return getNodeAttributeModel().getColumnClass(columnIndex);
+ }
+
+ public int getColumnCount() {
+ return 2;
+ }
+
+ @Override
+ public String getColumnName(final int columnIndex) {
+ return getNodeAttributeModel().getColumnName(columnIndex);
+ }
+
+ public Quantity<LengthUnits> getColumnWidth(final int col) {
+ return getNodeAttributeModel().getColumnWidth(col);
+ }
+
+ public NodeModel getNode() {
+ return getNodeAttributeModel().getNode();
+ }
+
+ public NodeAttributeTableModel getNodeAttributeModel() {
+ return nodeAttributeModel;
+ }
+
+ private void removeListeners() {
+ getNodeAttributeModel().removeTableModelListener(this);
+ getAttributeRegistry().removeChangeListener(this);
+ }
+
+ public void setAttributeRegistry(final AttributeRegistry attributeRegistry) {
+ this.attributeRegistry = attributeRegistry;
+ }
+
+ public void setColumnWidth(final int col, final Quantity<LengthUnits> width) {
+ getAttributeController().performSetColumnWidth(getNodeAttributeModel(), col, width);
+ }
+
+ public void setNodeAttributeModel(final NodeAttributeTableModel nodeAttributeModel) {
+ this.nodeAttributeModel = nodeAttributeModel;
+ int rowCount = nodeAttributeModel.getRowCount();
+ cacheTransformedValues(0, (rowCount-1));
+ }
+
+ private void cacheTransformedValue(int row) {
+ try {
+ final Object value = nodeAttributeModel.getValueAt(row, 1);
+ if (value != null)
+ textController.getTransformedText(value.toString(), getNode(), null);
+ }
+ catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+
+ public void viewRemoved(NodeView nodeView) {
+ removeListeners();
+ }
+ public void tableChanged(final TableModelEvent e) {
+ switch(e.getType()){
+ case TableModelEvent.INSERT:
+ case TableModelEvent.UPDATE:
+ cacheTransformedValues(e.getFirstRow(), e.getLastRow());
+ }
+
+ }
+ private void cacheTransformedValues(int firstRow, int lastRow) {
+ for(int row = firstRow; row <= lastRow; row++){
+ cacheTransformedValue(row);
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/attribute/AttributeView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeView.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeViewScrollPane.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeViewScrollPane.java
new file mode 100644
index 0000000..efa0812
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/AttributeViewScrollPane.java
@@ -0,0 +1,64 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.attribute;
+
+import java.awt.Component;
+import java.awt.Dimension;
+
+import javax.swing.JScrollPane;
+
+class AttributeViewScrollPane extends JScrollPane {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ */
+ AttributeViewScrollPane(final AttributeTable attributeTable) {
+ super(attributeTable);
+ setAlignmentX(Component.CENTER_ALIGNMENT);
+ setOpaque(false);
+ getViewport().setOpaque(false);
+ }
+
+ @Override
+ public Dimension getMaximumSize() {
+ return getPreferredSize();
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ validate();
+ return super.getPreferredSize();
+ }
+
+ @Override
+ public boolean isVisible() {
+ final Component view = getViewport().getView();
+ return super.isVisible() && view != null && view.isVisible();
+ }
+
+ @Override
+ public boolean isValidateRoot() {
+ return false;
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/CursorUpdater.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/CursorUpdater.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/attribute/CursorUpdater.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/attribute/CursorUpdater.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/EditAttributesAction.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/EditAttributesAction.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/attribute/EditAttributesAction.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/attribute/EditAttributesAction.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/ExtendedAttributeTableModelDecorator.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/ExtendedAttributeTableModelDecorator.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/attribute/ExtendedAttributeTableModelDecorator.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/attribute/ExtendedAttributeTableModelDecorator.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/ReducedAttributeTableModelDecorator.java b/freeplane/src/main/java/org/freeplane/view/swing/map/attribute/ReducedAttributeTableModelDecorator.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/attribute/ReducedAttributeTableModelDecorator.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/attribute/ReducedAttributeTableModelDecorator.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/ArcCloudView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/cloud/ArcCloudView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/cloud/ArcCloudView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/cloud/ArcCloudView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/CloudView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/cloud/CloudView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/cloud/CloudView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/cloud/CloudView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/CloudViewFactory.java b/freeplane/src/main/java/org/freeplane/view/swing/map/cloud/CloudViewFactory.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/cloud/CloudViewFactory.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/cloud/CloudViewFactory.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/ConvexHull.java b/freeplane/src/main/java/org/freeplane/view/swing/map/cloud/ConvexHull.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/cloud/ConvexHull.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/cloud/ConvexHull.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/RectangleCloudView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/cloud/RectangleCloudView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/cloud/RectangleCloudView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/cloud/RectangleCloudView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/cloud/StarCloudView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/cloud/StarCloudView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/cloud/StarCloudView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/cloud/StarCloudView.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/edge/AutomaticEdgeStyle.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/AutomaticEdgeStyle.java
new file mode 100644
index 0000000..2db1090
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/AutomaticEdgeStyle.java
@@ -0,0 +1,72 @@
+package org.freeplane.view.swing.map.edge;
+
+import java.awt.Color;
+import java.awt.Point;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.edge.EdgeController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.styles.AutomaticLayoutController;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+public class AutomaticEdgeStyle {
+ private NodeModel levelStyleNode;
+ private EdgeController edgeController;
+ public AutomaticEdgeStyle(NodeView node){
+ MapView map = node.getMap();
+ ModeController modeController = map.getModeController();
+ AutomaticLayoutController automaticLayoutController = modeController.getExtension(AutomaticLayoutController.class);
+ modeController.getExtension(NodeStyleController.class);
+
+ final NodeView rootView = map.getRoot();
+ Point origin = new Point();
+ final MainView rootContent = rootView.getMainView();
+ UITools.convertPointToAncestor(rootContent, origin, rootView);
+ Point coordinate = new Point();
+ final MainView nodeContent = node.getMainView();
+ UITools.convertPointToAncestor(nodeContent, coordinate, rootView);
+ final MapStyleModel mapStyleNodes = MapStyleModel.getExtension(rootView.getModel());
+
+ final int distance;
+ final int nodeColumnWidth;
+ if(map.getLayoutType() == MapViewLayout.OUTLINE){
+ distance = coordinate.x - origin.x;
+ final int hgapProperty = ResourceController.getResourceController().getLengthProperty("outline_hgap");
+ nodeColumnWidth = map.getZoomed(hgapProperty);
+ }
+ else {
+ if(origin.x < coordinate.x ){
+ distance = coordinate.x + nodeContent.getWidth() - origin.x - rootContent.getWidth();
+ }
+ else{
+ distance = origin.x - coordinate.x;
+ }
+ final NodeModel defaultStyleNode = mapStyleNodes.getStyleNode(MapStyleModel.DEFAULT_STYLE);
+ final NodeStyleController nodeStyleController = modeController.getExtension(NodeStyleController.class);
+ nodeColumnWidth = map.getZoomed(nodeStyleController.getMaxWidth(defaultStyleNode).toBaseUnitsRounded() + LocationModel.DEFAULT_HGAP_PX);
+ }
+ int level = (int) ((float)distance / nodeColumnWidth + 0.5);
+ if(SummaryNode.isHidden(node.getModel()))
+ level++;
+
+ final IStyle levelStyle = automaticLayoutController.getStyle(map.getModel(), level, true);
+ levelStyleNode = mapStyleNodes.getStyleNode(levelStyle);
+ edgeController = modeController.getExtension(EdgeController.class);
+
+
+ }
+
+ public Color getColor(){
+ return levelStyleNode != null ? edgeController.getColor(levelStyleNode) : EdgeController.STANDARD_EDGE_COLOR;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/BezierEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/BezierEdgeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/edge/BezierEdgeView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/edge/BezierEdgeView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/EdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/EdgeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/edge/EdgeView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/edge/EdgeView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/EdgeViewFactory.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/EdgeViewFactory.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/edge/EdgeViewFactory.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/edge/EdgeViewFactory.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/HiddenEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/HiddenEdgeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/edge/HiddenEdgeView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/edge/HiddenEdgeView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/HiddenOutlineEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/HiddenOutlineEdgeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/edge/HiddenOutlineEdgeView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/edge/HiddenOutlineEdgeView.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/edge/HorizontalEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/HorizontalEdgeView.java
new file mode 100644
index 0000000..53d45ca
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/HorizontalEdgeView.java
@@ -0,0 +1,102 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.edge;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Stroke;
+import java.awt.geom.Line2D;
+
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.link.CollisionDetector;
+
+/**
+ * This class represents a single Edge of a MindMap.
+ */
+public class HorizontalEdgeView extends EdgeView {
+ private int xs[];
+ private int ys[];
+
+ public HorizontalEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @Override
+ protected void createStart() {
+ if(getSource().isRoot() && ! MainView.USE_COMMON_OUT_POINT_FOR_ROOT_NODE){
+ super.createStart();
+ }
+ else{
+ if(getTarget().isLeft()){
+ start = getSource().getMainView().getLeftPoint();
+ }
+ else{
+ start = getSource().getMainView().getRightPoint();
+ }
+ }
+ if(getTarget().isLeft()){
+ end = getTarget().getMainView().getRightPoint();
+ }
+ else{
+ end = getTarget().getMainView().getLeftPoint();
+ }
+ }
+
+ @Override
+ protected void draw(final Graphics2D g) {
+ final Color color = getColor();
+ g.setColor(color);
+ final Stroke stroke = getStroke();
+ g.setStroke(stroke);
+ getWidth();
+ int xMiddle = getTarget().getMap().getZoomed(LocationModel.DEFAULT_HGAP_PX) / 2;
+ final boolean left = getTarget().isLeft()
+ || ! MainView.USE_COMMON_OUT_POINT_FOR_ROOT_NODE && getSource().isRoot()&& start.x > end.x;
+ if (left) {
+ xMiddle = -xMiddle;
+ }
+ xMiddle += start.x;
+ xs = new int[] { start.x, xMiddle, xMiddle, end.x };
+ ys = new int[] { start.y, start.y, end.y, end.y };
+ g.drawPolyline(xs, ys, 4);
+ if (isTargetEclipsed()) {
+ g.setColor(g.getBackground());
+ g.setStroke(EdgeView.getEclipsedStroke());
+ g.drawPolyline(xs, ys, 4);
+ g.setColor(color);
+ g.setStroke(stroke);
+ }
+ }
+
+ @Override
+ public boolean detectCollision(final Point p) {
+ final CollisionDetector collisionDetector = new CollisionDetector();
+ for (int i = 1; i < xs.length; i++) {
+ if (collisionDetector.detectCollision(p, new Line2D.Float(xs[i - 1], ys[i - 1], xs[i], ys[i]))) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/LinearEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/LinearEdgeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/edge/LinearEdgeView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/edge/LinearEdgeView.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/edge/OutlineEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/OutlineEdgeView.java
new file mode 100644
index 0000000..0a7d309
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/OutlineEdgeView.java
@@ -0,0 +1,85 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.edge;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Stroke;
+
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * 29.08.2009
+ */
+public class OutlineEdgeView extends EdgeView {
+ public OutlineEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @Override
+ public boolean detectCollision(final Point p) {
+ return false;
+ }
+
+ @Override
+ protected void createStart() {
+ start = getSource().getMainView().getLeftPoint();
+ end = getTarget().getMainView().getLeftPoint();
+ }
+
+ @Override
+ protected void draw(final Graphics2D g) {
+ final Color color = getColor();
+ g.setColor(color);
+ final Stroke stroke = getStroke();
+ g.setStroke(stroke);
+ g.drawLine(start.x, start.y, start.x, end.y);
+ g.drawLine(start.x, end.y, end.x, end.y);
+ if(getTarget().isSummary()){
+ final int gap = getWidth();
+ final int y1 = end.y + gap * 13/8;
+ g.drawLine(start.x, start.y, start.x, y1);
+ int x2 = end.x;
+ if(NodeStyleModel.Shape.fork.equals(getTarget().getMainView().getShapeConfiguration().getShape()))
+ x2 += getTarget().getContent().getWidth();
+ g.drawLine(start.x, y1, x2, y1);
+ }
+ }
+
+ @Override
+ protected Stroke getStroke() {
+ final NodeView target = getTarget();
+ int edgeWidth = target.getEdgeWidth();
+ final EdgeStyle style = target.getEdgeStyle();
+ final int nodeLineWidth = style.getNodeLineWidth(edgeWidth);
+ final int zoomedWidth;
+ if(edgeWidth != 0)
+ zoomedWidth = getTarget().getZoomed(nodeLineWidth);
+ else
+ zoomedWidth = nodeLineWidth;
+ return new BasicStroke(zoomedWidth);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/SharpBezierEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/SharpBezierEdgeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/edge/SharpBezierEdgeView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/edge/SharpBezierEdgeView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/SharpEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/SharpEdgeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/edge/SharpEdgeView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/edge/SharpEdgeView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/SharpLinearEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/SharpLinearEdgeView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/edge/SharpLinearEdgeView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/edge/SharpLinearEdgeView.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/edge/SummaryEdgeView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/SummaryEdgeView.java
new file mode 100644
index 0000000..ec36734
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/edge/SummaryEdgeView.java
@@ -0,0 +1,76 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.edge;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Shape;
+import java.awt.Stroke;
+import java.awt.geom.GeneralPath;
+
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.link.CollisionDetector;
+
+/**
+ * This class represents a single Edge of a MindMap.
+ */
+public class SummaryEdgeView extends EdgeView {
+ private static final int CHILD_XCTRL = 20;
+ private static final int XCTRL = 4;
+
+ public SummaryEdgeView(NodeView source, NodeView target, Component paintedComponent) {
+ super(source, target, paintedComponent);
+ }
+
+ @Override
+ protected void draw(final Graphics2D g) {
+ final Shape graph = update();
+ final Color color = getColor();
+ g.setColor(color);
+ final Stroke stroke = getStroke();
+ g.setStroke(stroke);
+ g.draw(graph);
+ }
+
+ private Shape update() {
+ final boolean isLeft = getTarget().isLeft();
+ final int sign = isLeft ? -1 : 1;
+ final int xctrl = getMap().getZoomed(sign * SummaryEdgeView.XCTRL);
+ final int childXctrl = getMap().getZoomed(sign * SummaryEdgeView.CHILD_XCTRL);
+ final GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD, 5);
+ final int startX;
+ if(isLeft)
+ startX = Math.min(start.x, end.x - childXctrl);
+ else
+ startX = Math.max(start.x, end.x - childXctrl);
+ path.moveTo(startX, start.y);
+ path.lineTo(startX + xctrl, start.y);
+ path.curveTo(startX + 2 * xctrl, start.y, startX, end.y, end.x, end.y);
+ return path;
+ }
+
+ @Override
+ public boolean detectCollision(final Point p) {
+ final Shape graph = update();
+ return new CollisionDetector().detectCollision(p, graph);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/AConnectorView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/link/AConnectorView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/link/AConnectorView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/link/AConnectorView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/CollisionDetector.java b/freeplane/src/main/java/org/freeplane/view/swing/map/link/CollisionDetector.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/link/CollisionDetector.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/link/CollisionDetector.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/link/ConnectorView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/link/ConnectorView.java
new file mode 100644
index 0000000..3f2b052
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/link/ConnectorView.java
@@ -0,0 +1,511 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.link;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Shape;
+import java.awt.Stroke;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.CubicCurve2D;
+import java.awt.geom.GeneralPath;
+import java.awt.geom.Line2D;
+import java.awt.geom.PathIterator;
+import java.awt.geom.Point2D;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.features.link.ArrowType;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinkModel;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * This class represents a ArrowLink around a node.
+ */
+public class ConnectorView extends AConnectorView{
+ private static final int LOOP_INCLINE_OFFSET = 45;
+ private static final int NORMAL_LENGTH = 50;
+ private static final float[] DOTTED_DASH = new float[] { 4, 7};
+ static final Stroke DEF_STROKE = new BasicStroke(1);
+ private static final int LABEL_GAP = 4;
+ private static final double PRECISION = 2;
+ private Shape arrowLinkCurve;
+ private Rectangle sourceTextRectangle;
+ private Rectangle middleTextRectangle;
+ private Rectangle targetTextRectangle;
+ final private Color textColor;
+ final private Color color;
+ final private BasicStroke stroke;
+ final private Color bgColor;
+ /* Note, that source and target are nodeviews and not nodemodels!. */
+ public ConnectorView(final ConnectorModel connectorModel, final NodeView source, final NodeView target, Color bgColor) {
+ super(connectorModel, source, target);
+ final LinkController linkController = LinkController.getController(getModeController());
+ textColor = linkController.getColor(connectorModel);
+ this.bgColor =bgColor;
+ final int alpha = linkController.getAlpha(connectorModel);
+ color = ColorUtils.alphaToColor(alpha, textColor);
+
+ final int width = linkController.getWidth(connectorModel);
+ if (!isSourceVisible() || !isTargetVisible()) {
+ stroke = new BasicStroke(width);
+ }
+ else{
+ stroke = UITools.createStroke(width, linkController.getDash(connectorModel));
+ }
+
+ }
+
+ public float[] zoomDash(float[] dash) {
+ float[] result = dash.clone();
+ final double zoom = getZoom();
+ for(float f : result){
+ f *= zoom;
+ }
+ return result;
+ }
+
+ /**
+ */
+ private Point calcInclination(final NodeView node, final int dellength) {
+ return new Point(dellength, 0);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.view.swing.map.link.ILinkView#detectCollision(java.awt.Point, boolean)
+ */
+ public boolean detectCollision(final Point p, final boolean selectedOnly) {
+ if (selectedOnly && (source == null || !source.isSelected()) && (target == null || !target.isSelected())) {
+ return false;
+ }
+ if (arrowLinkCurve == null) {
+ return false;
+ }
+ return new CollisionDetector().detectCollision(p, arrowLinkCurve);
+ }
+
+ private Rectangle drawEndPointText(final Graphics2D g, final String text, final Point endPoint, final Point controlPoint) {
+ if (text == null || text.equals("")) {
+ return null;
+ }
+ final TextPainter textPainter = new TextPainter(g, text);
+ final int textWidth = textPainter.getTextWidth();
+ final int textHeight = textPainter.getTextHeight();
+ final int x;
+ if (controlPoint.x > endPoint.x) {
+ x = endPoint.x - textWidth - LABEL_GAP;
+ }
+ else {
+ x = endPoint.x + LABEL_GAP;
+ }
+ final int y;
+ if (controlPoint.y > endPoint.y) {
+ y = endPoint.y + LABEL_GAP;
+ }
+ else {
+ y = endPoint.y - textHeight - LABEL_GAP;
+ }
+ textPainter.draw(x, y, textColor, bgColor);
+ return new Rectangle(x, y, textWidth, textHeight);
+ }
+
+ private Rectangle drawMiddleLabel(final Graphics2D g, final String text, final Point centerPoint) {
+ if (text == null || text.equals("")) {
+ return null;
+ }
+ final TextPainter textPainter = new TextPainter(g, text);
+ final int textWidth = textPainter.getTextWidth();
+ final int x = centerPoint.x - textWidth / 2;
+ final int textHeight = textPainter.getTextHeight();
+ int y = centerPoint.y - textHeight/2;
+ textPainter.draw(x, y, textColor, bgColor);
+ return new Rectangle(x, y, textWidth, textHeight);
+ }
+
+ Shape getArrowLinkCurve() {
+ return arrowLinkCurve;
+ }
+
+ NodeLinkModel getArrowLinkModel() {
+ return connectorModel;
+ }
+
+ private Point getCenterPoint() {
+ if (arrowLinkCurve == null) {
+ return null;
+ }
+ final double halfLength = getHalfLength();
+ final PathIterator pathIterator = arrowLinkCurve.getPathIterator(new AffineTransform(), PRECISION);
+ double lastCoords[] = new double[6];
+ pathIterator.currentSegment(lastCoords);
+ double length = 0;
+ for (;;) {
+ pathIterator.next();
+ final double nextCoords[] = new double[6];
+ if (pathIterator.isDone() || PathIterator.SEG_CLOSE == pathIterator.currentSegment(nextCoords)) {
+ break;
+ }
+ final double dx = nextCoords[0] - lastCoords[0];
+ final double dy = nextCoords[1] - lastCoords[1];
+ final double dr = Math.sqrt(dx * dx + dy * dy);
+ length += dr;
+ if (length >= halfLength) {
+ final double k;
+ if (dr < 1) {
+ k = 0.5;
+ }
+ else {
+ k = (length - halfLength) / dr;
+ }
+ return new Point((int) Math.rint(nextCoords[0] - k * dx), (int) Math.rint(nextCoords[1] - k * dy));
+ }
+ lastCoords = nextCoords;
+ }
+ throw new RuntimeException("center point not found");
+ }
+
+ private double getHalfLength() {
+ final PathIterator pathIterator = arrowLinkCurve.getPathIterator(new AffineTransform(), PRECISION);
+ double lastCoords[] = new double[6];
+ pathIterator.currentSegment(lastCoords);
+ double length = 0;
+ for (;;) {
+ pathIterator.next();
+ final double nextCoords[] = new double[6];
+ if (pathIterator.isDone() || PathIterator.SEG_CLOSE == pathIterator.currentSegment(nextCoords)) {
+ break;
+ }
+ final double dx = nextCoords[0] - lastCoords[0];
+ final double dy = nextCoords[1] - lastCoords[1];
+ length += Math.sqrt(dx * dx + dy * dy);
+ lastCoords = nextCoords;
+ }
+ return length / 2;
+ }
+
+ private ModeController getModeController() {
+ NodeView nodeView = source;
+ if (source == null) {
+ nodeView = target;
+ }
+ final MapView mapView = nodeView.getMap();
+ return mapView.getModeController();
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.view.swing.map.link.ILinkView#getModel()
+ */
+ public ConnectorModel getModel() {
+ return connectorModel;
+ }
+
+
+ /**
+ * Computes the intersection between two lines. The calculated point is approximate,
+ * since integers are used. If you need a more precise result, use doubles
+ * everywhere.
+ * (c) 2007 Alexander Hristov. Use Freely (LGPL license). http://www.ahristov.com
+ *
+ * @param x1 Point 1 of Line 1
+ * @param y1 Point 1 of Line 1
+ * @param x2 Point 2 of Line 1
+ * @param y2 Point 2 of Line 1
+ * @param x3 Point 1 of Line 2
+ * @param y3 Point 1 of Line 2
+ * @param x4 Point 2 of Line 2
+ * @param y4 Point 2 of Line 2
+ * @return Point where the segments intersect, or null if they don't
+ */
+ Point intersection(final double x1, final double y1, final double x2, final double y2, final double x3,
+ final double y3, final double x4, final double y4) {
+ final double d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
+ if (d == 0) {
+ return null;
+ }
+ final int xi = (int) (((x3 - x4) * (x1 * y2 - y1 * x2) - (x1 - x2) * (x3 * y4 - y3 * x4)) / d);
+ final int yi = (int) (((y3 - y4) * (x1 * y2 - y1 * x2) - (y1 - y2) * (x3 * y4 - y3 * x4)) / d);
+ if (xi + 2 < Math.min(x1, x2) || xi - 2 > Math.max(x1, x2)) {
+ return null;
+ }
+ return new Point(xi, yi);
+ }
+
+ /**
+ * Computes the unitary normal vector of a segment
+ * @param x1 Starting point of the segment
+ * @param y1 Starting point of the segment
+ * @param x2 Ending point of the segment
+ * @param y2 Ending point of the segment
+ * @return
+ */
+ Point2D.Double normal(final double x1, final double y1, final double x2, final double y2) {
+ double nx, ny;
+ if (x1 == x2) {
+ nx = Math.signum(y2 - y1);
+ ny = 0;
+ }
+ else {
+ final double f = (y2 - y1) / (x2 - x1);
+ nx = f * Math.signum(x2 - x1) / Math.sqrt(1 + f * f);
+ ny = -1 * Math.signum(x2 - x1) / Math.sqrt(1 + f * f);
+ }
+ return new Point2D.Double(nx, ny);
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.view.swing.map.link.ILinkView#paint(java.awt.Graphics)
+ */
+ public void paint(final Graphics graphics) {
+ final boolean selfLink = getSource() == getTarget();
+ if (!isSourceVisible() && !isTargetVisible()) {
+ return;
+ }
+ Point startPoint = null, endPoint = null, startPoint2 = null, endPoint2 = null;
+ boolean targetIsLeft = false;
+ boolean sourceIsLeft = false;
+ final Graphics2D g = (Graphics2D) graphics.create();
+ final Color oldColor = g.getColor();
+ g.setColor(color);
+ /* set stroke. */
+ g.setStroke(stroke);
+ if (isSourceVisible()) {
+ startPoint = source.getLinkPoint(connectorModel.getStartInclination());
+ sourceIsLeft = source.isLeft();
+ }
+ if (isTargetVisible()) {
+ endPoint = target.getLinkPoint(connectorModel.getEndInclination());
+ targetIsLeft = target.isLeft();
+ }
+ if (connectorModel.getEndInclination() == null || connectorModel.getStartInclination() == null) {
+ final int dellength = isSourceVisible() && isTargetVisible() ? Math.max(40, (int)(startPoint.distance(endPoint) / getZoom())) : 40;
+ if (isSourceVisible() && connectorModel.getStartInclination() == null) {
+ final Point incl = calcInclination(source, dellength);
+ connectorModel.setStartInclination(incl);
+ startPoint = source.getLinkPoint(connectorModel.getStartInclination());
+ }
+ if (isTargetVisible() && connectorModel.getEndInclination() == null) {
+ final Point incl = calcInclination(target, dellength);
+ incl.y = -incl.y;
+ if (selfLink) {
+ fixInclineIfLoopNode(incl);
+ }
+ connectorModel.setEndInclination(incl);
+ endPoint = target.getLinkPoint(connectorModel.getEndInclination());
+ }
+ }
+ if (startPoint != null) {
+ startPoint2 = new Point(startPoint);
+ Point startInclination = connectorModel.getStartInclination();
+ if(endPoint == null){
+ normalizeLength(NORMAL_LENGTH, startInclination);
+ }
+ startPoint2.translate(((sourceIsLeft) ? -1 : 1) * getMap().getZoomed(startInclination.x),
+ getMap().getZoomed(startInclination.y));
+
+ }
+ if (endPoint != null) {
+ endPoint2 = new Point(endPoint);
+ Point endInclination = connectorModel.getEndInclination();
+ if(startPoint == null){
+ normalizeLength(NORMAL_LENGTH, endInclination);
+ }
+ endPoint2.translate(((targetIsLeft) ? -1 : 1) * getMap().getZoomed(endInclination.x), getMap()
+ .getZoomed(endInclination.y));
+ }
+ paintCurve(g, startPoint, startPoint2, endPoint2, endPoint);
+ drawLabels(g, startPoint, startPoint2, endPoint2, endPoint);
+ g.setColor(oldColor);
+ }
+
+ private void normalizeLength(int normalLength, Point startInclination) {
+ double k = normalLength / Math.sqrt(startInclination.x * startInclination.x + startInclination.y * startInclination.y);
+ startInclination.x *= k;
+ startInclination.y *= k;
+ }
+
+ private Shape createLine(Point p1, Point p2) {
+ return new Line2D.Float(p1, p2);
+ }
+
+ private Shape createLinearPath(Point startPoint, Point startPoint2, Point endPoint2, Point endPoint) {
+ final GeneralPath generalPath = new GeneralPath(GeneralPath.WIND_NON_ZERO, 4);
+ generalPath.moveTo(startPoint.x, startPoint.y);
+ generalPath.lineTo(startPoint2.x, startPoint2.y);
+ generalPath.lineTo(endPoint2.x, endPoint2.y);
+ generalPath.lineTo(endPoint.x, endPoint.y);
+ return generalPath;
+ }
+
+ private void paintCurve(final Graphics2D g, Point startPoint, Point startPoint2, Point endPoint2, Point endPoint) {
+ final boolean selfLink = getSource() == getTarget();
+ final boolean isLine = ConnectorModel.Shape.LINE.equals(connectorModel.getShape());
+ if (startPoint != null && endPoint != null) {
+ if(isLine) {
+ if (selfLink) {
+ arrowLinkCurve = createLine(startPoint, startPoint2);
+ }
+ else {
+ arrowLinkCurve = createLine(startPoint, endPoint);
+ }
+ }
+ else if (ConnectorModel.Shape.LINEAR_PATH.equals(connectorModel.getShape()))
+ arrowLinkCurve = createLinearPath(startPoint, startPoint2, endPoint2, endPoint);
+ else
+ arrowLinkCurve = createCubicCurve2D(startPoint, startPoint2, endPoint2, endPoint);
+ }
+ else
+ arrowLinkCurve = null;
+ if (arrowLinkCurve != null) {
+ g.draw(arrowLinkCurve);
+ }
+ if (isSourceVisible() && !connectorModel.getStartArrow().equals(ArrowType.NONE)) {
+ if(!selfLink && isLine && endPoint != null)
+ paintArrow(g, endPoint, startPoint);
+ else
+ paintArrow(g, startPoint2, startPoint);
+ }
+ if (isTargetVisible() && !connectorModel.getEndArrow().equals(ArrowType.NONE)) {
+ if(isLine && startPoint != null) {
+ if (selfLink)
+ paintArrow(g, startPoint, startPoint2);
+ else
+ paintArrow(g, startPoint, endPoint);
+ }
+ else
+ paintArrow(g, endPoint2, endPoint);
+ }
+ if (connectorModel.getShowControlPointsFlag()) {
+ g.setColor(textColor);
+ g.setStroke(new BasicStroke(stroke.getLineWidth(), BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0, DOTTED_DASH, 0));
+ }
+ if (connectorModel.getShowControlPointsFlag() || !isSourceVisible() || !isTargetVisible()) {
+ if (startPoint != null) {
+ g.drawLine(startPoint.x, startPoint.y, startPoint2.x, startPoint2.y);
+ drawCircle(g, startPoint2, source.getZoomedFoldingSymbolHalfWidth());
+ if (arrowLinkCurve == null) {
+ arrowLinkCurve = createLine(startPoint, startPoint2);
+ }
+ }
+ if (endPoint != null && !(selfLink && isLine)) {
+ g.drawLine(endPoint.x, endPoint.y, endPoint2.x, endPoint2.y);
+ drawCircle(g, endPoint2, target.getZoomedFoldingSymbolHalfWidth());
+ if (arrowLinkCurve == null) {
+ arrowLinkCurve = createLine(endPoint, endPoint2);
+ }
+ }
+ }
+ }
+
+ private void drawCircle(Graphics2D g, Point p, int hw) {
+ g.setStroke(DEF_STROKE);
+ g.fillOval(p.x - hw, p.y - hw, hw*2, hw*2);
+ }
+
+ private void paintArrow(final Graphics2D g, Point from, Point to) {
+ paintArrow(from, to, g, getZoom() * 10);
+ }
+
+ private void drawLabels(final Graphics2D g, Point startPoint, Point startPoint2, Point endPoint2, Point endPoint) {
+ final String sourceLabel = connectorModel.getSourceLabel();
+ final String middleLabel = connectorModel.getMiddleLabel();
+ final String targetLabel = connectorModel.getTargetLabel();
+ if (sourceLabel == null && middleLabel == null && targetLabel == null) {
+ return;
+ }
+
+ final Font oldFont = g.getFont();
+ final String fontFamily = connectorModel.getLabelFontFamily();
+ final int fontSize = Math.round (connectorModel.getLabelFontSize() * UITools.FONT_SCALE_FACTOR);
+ final Font linksFont = new Font(fontFamily, 0, getZoomed(fontSize));
+ g.setFont(linksFont);
+
+ if (startPoint != null) {
+ sourceTextRectangle = drawEndPointText(g, sourceLabel, startPoint, startPoint2);
+ if (endPoint == null) {
+ middleTextRectangle = drawEndPointText(g, middleLabel, startPoint2, startPoint);
+ }
+ }
+ if (endPoint != null) {
+ targetTextRectangle = drawEndPointText(g, targetLabel, endPoint, endPoint2);
+ if (startPoint == null) {
+ middleTextRectangle = drawEndPointText(g, middleLabel, endPoint2, endPoint);
+ }
+ }
+ if (startPoint != null && endPoint != null) {
+ middleTextRectangle = drawMiddleLabel(g, middleLabel, getCenterPoint());
+ }
+ g.setFont(oldFont);
+ }
+
+ private CubicCurve2D createCubicCurve2D(Point startPoint, Point startPoint2, Point endPoint2, Point endPoint) {
+ final CubicCurve2D arrowLinkCurve = new CubicCurve2D.Double();
+ if (startPoint != null && endPoint != null) {
+ arrowLinkCurve.setCurve(startPoint, startPoint2, endPoint2, endPoint);
+ }
+ else if (startPoint != null) {
+ arrowLinkCurve.setCurve(startPoint, startPoint2, startPoint, startPoint2);
+ }
+ else if (endPoint != null) {
+ arrowLinkCurve.setCurve(endPoint, endPoint2, endPoint, endPoint2);
+ }
+ return arrowLinkCurve;
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.view.swing.map.link.ILinkView#increaseBounds(java.awt.Rectangle)
+ */
+ public void increaseBounds(final Rectangle innerBounds) {
+ final Shape arrowLinkCurve = getArrowLinkCurve();
+ if (arrowLinkCurve == null) {
+ return;
+ }
+ final Rectangle arrowViewBigBounds = arrowLinkCurve.getBounds();
+ if (!innerBounds.contains(arrowViewBigBounds)) {
+ final Rectangle arrowViewBounds = PathBBox.getBBox(arrowLinkCurve).getBounds();
+ innerBounds.add(arrowViewBounds);
+ }
+ increaseBounds(innerBounds, sourceTextRectangle);
+ increaseBounds(innerBounds, middleTextRectangle);
+ increaseBounds(innerBounds, targetTextRectangle);
+ }
+
+ private void increaseBounds(Rectangle innerBounds, Rectangle rect) {
+ if (rect != null)
+ innerBounds.add(rect);
+ }
+
+ private void fixInclineIfLoopNode(Point endIncline) {
+ if (endIncline.y < 0) {
+ endIncline.y -= LOOP_INCLINE_OFFSET;
+ }
+ else {
+ endIncline.y += LOOP_INCLINE_OFFSET;
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/link/EdgeLinkView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/link/EdgeLinkView.java
new file mode 100644
index 0000000..c296d98
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/link/EdgeLinkView.java
@@ -0,0 +1,116 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.link;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Point;
+import java.awt.Rectangle;
+
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.features.link.ArrowType;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.ConnectorModel.Shape;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.MapViewLayout;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.edge.EdgeView;
+import org.freeplane.view.swing.map.edge.EdgeViewFactory;
+
+/**
+ * @author Dimitry Polivaev
+ * 09.08.2009
+ */
+public class EdgeLinkView extends AConnectorView {
+ private final EdgeView edgeView;
+
+ public EdgeLinkView(final ConnectorModel model, final ModeController modeController, final NodeView source,
+ final NodeView target) {
+ super(model, source, target);
+ final MapView map = source.getMap();
+ if (map.getLayoutType() == MapViewLayout.OUTLINE) {
+ edgeView = new OutlineLinkView(source, target, map);
+ }
+ else{
+ edgeView = EdgeViewFactory.getInstance().getEdge(source, target, map);
+ }
+ Color color;
+ if (Shape.EDGE_LIKE.equals(model.getShape())) {
+ color = edgeView.getColor().darker();
+ }
+ else {
+ final LinkController linkController = LinkController.getController(modeController);
+ color = linkController.getColor(connectorModel);
+ final int alpha = linkController.getAlpha(connectorModel);
+ color = ColorUtils.alphaToColor(alpha, color);
+ final int width = linkController.getWidth(model);
+ edgeView.setWidth(width);
+ }
+ edgeView.setColor(color);
+ }
+
+ public boolean detectCollision(final Point p, final boolean selectedOnly) {
+ if (selectedOnly) {
+ final NodeView source = edgeView.getSource();
+ if ((source == null || !source.isSelected())) {
+ final NodeView target = edgeView.getTarget();
+ if ((target == null || !target.isSelected())) {
+ return false;
+ }
+ }
+ }
+ return edgeView.detectCollision(p);
+ }
+
+ public ConnectorModel getModel() {
+ return connectorModel;
+ }
+
+ public void increaseBounds(final Rectangle innerBounds) {
+ //edge link does not increase inner bounds
+ }
+
+ public void paint(final Graphics graphics) {
+ edgeView.paint((Graphics2D) graphics);
+ if(Shape.EDGE_LIKE.equals(connectorModel.getShape())){
+ return;
+ }
+ if (isSourceVisible() && !connectorModel.getStartArrow().equals(ArrowType.NONE)) {
+ Point p1 = edgeView.getStart();
+ Point p2 = new Point(p1);
+ p2.translate(5, 0);
+ paintArrow(graphics, p2, p1);
+ }
+ if (isTargetVisible() && !connectorModel.getEndArrow().equals(ArrowType.NONE)) {
+ Point p1 = edgeView.getEnd();
+ Point p2 = new Point(p1);
+ p2.translate(5, 0);
+ paintArrow(graphics, p2, p1);
+ }
+
+ }
+
+ private void paintArrow(final Graphics graphics, Point from, Point to) {
+ paintArrow(from, to, (Graphics2D)graphics, getZoom() * 10);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/ILinkView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/link/ILinkView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/link/ILinkView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/link/ILinkView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/OutlineLinkView.java b/freeplane/src/main/java/org/freeplane/view/swing/map/link/OutlineLinkView.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/link/OutlineLinkView.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/link/OutlineLinkView.java
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/PathBBox.java b/freeplane/src/main/java/org/freeplane/view/swing/map/link/PathBBox.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/link/PathBBox.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/link/PathBBox.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/link/TextPainter.java b/freeplane/src/main/java/org/freeplane/view/swing/map/link/TextPainter.java
new file mode 100644
index 0000000..2db77b3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/link/TextPainter.java
@@ -0,0 +1,79 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.link;
+
+import java.awt.BasicStroke;
+import java.awt.Color;
+import java.awt.FontMetrics;
+import java.awt.Graphics2D;
+import java.awt.Stroke;
+
+/**
+ * @author Dimitry Polivaev
+ * Apr 22, 2011
+ */
+public class TextPainter{
+ private final int lineHeight;
+ private final int textHeight;
+ public int getLineHeight() {
+ return lineHeight;
+ }
+
+ public int getTextHeight() {
+ return textHeight;
+ }
+
+ public int getTextWidth() {
+ return textWidth;
+ }
+
+ private final int textWidth;
+ private final String[] lines;
+ private final Graphics2D g;
+
+ public TextPainter(final Graphics2D g, final String text){
+ this.g = g;
+ lines = text.split("\n");
+ final FontMetrics fontMetrics = g.getFontMetrics();
+ lineHeight = fontMetrics.getHeight();
+ textHeight = lineHeight * lines.length + fontMetrics.getDescent();
+ int textWidth = 0;
+ for(final String line : lines){
+ final int w = fontMetrics.stringWidth(line);
+ textWidth = Math.max(textWidth, w);
+ }
+ this.textWidth = textWidth;
+ }
+
+ public void draw(int x, int y, Color textColor, Color bgColor){
+ final Color oldColor = g.getColor();
+ final Stroke oldStroke = g.getStroke();
+ g.setColor(bgColor);
+ g.setStroke(new BasicStroke(0.5f));
+ g.fillRect(x, y, textWidth, textHeight);
+ g.setColor(textColor);
+ for(final String line : lines){
+ y+=lineHeight;
+ g.drawString(line, x, y);
+ }
+ g.setColor(oldColor);
+ g.setStroke(oldStroke);
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeExternalApplication.java b/freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/EditNodeExternalApplication.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeExternalApplication.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/EditNodeExternalApplication.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/EditNodeTextField.java b/freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/EditNodeTextField.java
new file mode 100644
index 0000000..a0cd0b8
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/EditNodeTextField.java
@@ -0,0 +1,798 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.mindmapmode;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.EventQueue;
+import java.awt.Font;
+import java.awt.Insets;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Toolkit;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.event.ActionEvent;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.InputMethodEvent;
+import java.awt.event.InputMethodListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.IOException;
+import java.io.Writer;
+import java.net.URI;
+import java.text.AttributedCharacterIterator;
+
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.Icon;
+import javax.swing.InputMap;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
+import javax.swing.JMenu;
+import javax.swing.JPopupMenu;
+import javax.swing.KeyStroke;
+import javax.swing.RootPaneContainer;
+import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
+import javax.swing.border.MatteBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.DefaultEditorKit;
+import javax.swing.text.DefaultEditorKit.PasteAction;
+import javax.swing.text.Document;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.NavigationFilter;
+import javax.swing.text.Position.Bias;
+import javax.swing.text.StyleConstants;
+import javax.swing.text.StyledEditorKit;
+import javax.swing.text.StyledEditorKit.BoldAction;
+import javax.swing.text.StyledEditorKit.ForegroundAction;
+import javax.swing.text.StyledEditorKit.ItalicAction;
+import javax.swing.text.StyledEditorKit.StyledTextAction;
+import javax.swing.text.StyledEditorKit.UnderlineAction;
+import javax.swing.text.html.HTMLDocument;
+import javax.swing.text.html.HTMLEditorKit;
+import javax.swing.text.html.HTMLWriter;
+import javax.swing.text.html.StyleSheet;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.components.html.CssRuleBuilder;
+import org.freeplane.core.ui.components.html.ScaledEditorKit;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.EditNodeBase;
+import org.freeplane.features.text.mindmapmode.EventBuffer;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.ui.IMapViewChangeListener;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.ZoomableLabel;
+import org.freeplane.view.swing.map.ZoomableLabelUI;
+import org.freeplane.view.swing.map.ZoomableLabelUI.LayoutData;
+
+import com.lightdev.app.shtm.SHTMLWriter;
+
+
+/**
+ * @author foltin
+ */
+public class EditNodeTextField extends EditNodeBase {
+ private class MyNavigationFilter extends NavigationFilter {
+ private final JEditorPane textfield;
+ public MyNavigationFilter(JEditorPane textfield) {
+ this.textfield = textfield;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.swing.text.NavigationFilter#moveDot(javax.swing.text.NavigationFilter.FilterBypass, int, javax.swing.text.Position.Bias)
+ */
+ public void moveDot(final FilterBypass fb, int dot, final Bias bias) {
+ dot = getValidPosition(dot);
+ super.moveDot(fb, dot, bias);
+ }
+
+ /* (non-Javadoc)
+ * @see javax.swing.text.NavigationFilter#setDot(javax.swing.text.NavigationFilter.FilterBypass, int, javax.swing.text.Position.Bias)
+ */
+ public void setDot(final FilterBypass fb, int dot, final Bias bias) {
+ dot = getValidPosition(dot);
+ super.setDot(fb, dot, bias);
+ }
+
+ private int getValidPosition(int position) {
+ final HTMLDocument doc = (HTMLDocument) textfield.getDocument();
+ if (doc.getDefaultRootElement().getElementCount() > 1) {
+ final int startPos = doc.getDefaultRootElement().getElement(1).getStartOffset();
+ final int validPosition = Math.max(position, startPos);
+ return validPosition;
+ }
+ return position;
+ }
+ }
+
+ private static class InputMethodInUseListener implements InputMethodListener {
+ private boolean imeInUse = false;
+
+ public void inputMethodTextChanged(InputMethodEvent event) {
+ updateImeInUseState(event);
+ }
+
+ public void caretPositionChanged(InputMethodEvent event) {
+ updateImeInUseState(event);
+ }
+
+ public boolean isIMEInUse(){
+ return imeInUse;
+ }
+
+ private void updateImeInUseState(InputMethodEvent event) {
+ AttributedCharacterIterator aci = event.getText();
+ if(aci != null) {
+ int inputLen = aci.getEndIndex() - aci.getBeginIndex();
+ int committedLen = event.getCommittedCharacterCount();
+ imeInUse = inputLen > 0 && inputLen != committedLen;
+ }
+ else
+ imeInUse = false;
+ }
+
+ }
+
+ private int extraWidth;
+ final private boolean layoutMapOnTextChange;
+
+ private final class MyDocumentListener implements DocumentListener {
+ private boolean updateRunning = false;
+ public void changedUpdate(final DocumentEvent e) {
+ onUpdate();
+ }
+
+ private void onUpdate() {
+ if(updateRunning){
+ return;
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ updateRunning = true;
+ layout();
+ updateRunning = false;
+ }
+ });
+ }
+
+ public void insertUpdate(final DocumentEvent e) {
+ onUpdate();
+ }
+
+ public void removeUpdate(final DocumentEvent e) {
+ onUpdate();
+ }
+ }
+
+ private void layout() {
+ if (textfield == null) {
+ return;
+ }
+ final int lastWidth = textfield.getWidth();
+ final int lastHeight = textfield.getHeight();
+ final boolean lineWrap = lastWidth == maxWidth;
+ Dimension preferredSize = textfield.getPreferredSize();
+ if (!lineWrap) {
+ preferredSize.width ++;
+ if (preferredSize.width > maxWidth) {
+ setLineWrap();
+ preferredSize = textfield.getPreferredSize();
+ }
+ else {
+ if (preferredSize.width < lastWidth) {
+ preferredSize.width = lastWidth;
+ }
+ else {
+ preferredSize.width = Math.min(preferredSize.width + extraWidth, maxWidth);
+ if (preferredSize.width == maxWidth) {
+ setLineWrap();
+ }
+ }
+ }
+ }
+ else {
+ preferredSize.width = Math.max(maxWidth, preferredSize.width);
+ }
+ if(preferredSize.width != lastWidth){
+ preferredSize.height = lastHeight;
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ layout();
+ }
+ });
+ }
+ else{
+ preferredSize.height = Math.max(preferredSize.height, lastHeight);
+ }
+ if (preferredSize.width == lastWidth && preferredSize.height == lastHeight) {
+ textfield.repaint();
+ return;
+ }
+ textfield.setSize(preferredSize);
+ if(layoutMapOnTextChange)
+ parent.setPreferredSize(new Dimension(preferredSize.width + horizontalSpace , preferredSize.height + verticalSpace));
+ textfield.revalidate();
+ final NodeView nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, parent);
+ final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, nodeView);
+ if(mapView == null)
+ return;
+ if(layoutMapOnTextChange)
+ mapView.scrollNodeToVisible(nodeView);
+ else
+ mapView.scrollRectToVisible(textfield.getBounds());
+ }
+
+ private void setLineWrap() {
+ if(null != textfield.getClientProperty("EditNodeTextField.linewrap") || inputMethodInUseListener.isIMEInUse()){
+ return;
+ }
+
+ final HTMLDocument document = (HTMLDocument) textfield.getDocument();
+ document.getStyleSheet().addRule("body { width: " + (maxWidth - 1) + "}");
+ // bad hack: call "setEditable" only to update view
+ textfield.setEditable(false);
+ textfield.setEditable(true);
+ textfield.putClientProperty("EditNodeTextField.linewrap", true);
+ }
+
+ private static final int SPLIT_KEY_CODE;
+ static {
+ String rawLabel = TextUtils.getRawText("split");
+ final int mnemoSignIndex = rawLabel.indexOf('&');
+ if (mnemoSignIndex >= 0 && mnemoSignIndex + 1 < rawLabel.length()) {
+ final char charAfterMnemoSign = rawLabel.charAt(mnemoSignIndex + 1);
+ if (charAfterMnemoSign != ' ') {
+ SPLIT_KEY_CODE = charAfterMnemoSign;
+ }
+ else SPLIT_KEY_CODE = -1;
+ }
+ else SPLIT_KEY_CODE = -1;
+ }
+ private class TextFieldListener implements KeyListener, FocusListener, MouseListener {
+ private static final int KEYSTROKE_MODIFIERS = KeyEvent.ALT_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK | KeyEvent.CTRL_DOWN_MASK | KeyEvent.META_DOWN_MASK;
+ final int CANCEL = 2;
+ final int EDIT = 1;
+ Integer eventSource = EDIT;
+ private boolean popupShown;
+
+ public TextFieldListener() {
+ }
+
+ private void conditionallyShowPopup(final MouseEvent e) {
+ if (e.isPopupTrigger()) {
+ final Component component = e.getComponent();
+ final JPopupMenu popupMenu = createPopupMenu(component);
+ popupShown = true;
+ popupMenu.show(component, e.getX(), e.getY());
+ e.consume();
+ }
+ }
+
+
+
+ public void focusGained(final FocusEvent e) {
+ popupShown = false;
+ }
+
+ public void focusLost(final FocusEvent e) {
+ if (textfield == null || !textfield.isVisible() || eventSource == CANCEL || popupShown) {
+ return;
+ }
+ if (e == null) {
+ submitText();
+ hideMe();
+ eventSource = CANCEL;
+ return;
+ }
+ if (e.isTemporary() && e.getOppositeComponent() == null) {
+ return;
+ }
+ submitText();
+ hideMe();
+ }
+
+ private void submitText() {
+ submitText(getNewText());
+ }
+
+ private void submitText(final String output) {
+ getEditControl().ok(output);
+ }
+
+ public void keyPressed(final KeyEvent e) {
+ if (eventSource == CANCEL||textfield==null) {
+ return;
+ }
+ final int keyCode = e.getKeyCode();
+ switch (keyCode) {
+ case KeyEvent.VK_ESCAPE:
+ if (e.isControlDown() || e.isMetaDown())
+ break;
+ eventSource = CANCEL;
+ hideMe();
+ getEditControl().cancel();
+ nodeView.requestFocusInWindow();
+ e.consume();
+ break;
+ case KeyEvent.VK_ENTER: {
+ if (e.isControlDown() || e.isMetaDown())
+ break;
+ final boolean enterConfirms = ResourceController.getResourceController().getBooleanProperty("el__enter_confirms_by_default");
+ if (enterConfirms == e.isAltDown() || e.isShiftDown()) {
+ e.consume();
+ final Component component = e.getComponent();
+ final KeyEvent keyEvent = new KeyEvent(component, e.getID(), e.getWhen(), 0, keyCode, e
+ .getKeyChar(), e.getKeyLocation());
+ SwingUtilities.processKeyBindings(keyEvent);
+ break;
+ }
+ final String output = getNewText();
+ e.consume();
+ eventSource = CANCEL;
+ hideMe();
+ submitText(output);
+ nodeView.requestFocusInWindow();
+ }
+ break;
+ case KeyEvent.VK_TAB:
+ if (e.isControlDown() || e.isMetaDown())
+ break;
+ textfield.replaceSelection(" ");
+ e.consume();
+ break;
+ case KeyEvent.VK_SPACE:
+ if (e.isControlDown() || e.isMetaDown())
+ break;
+ e.consume();
+ break;
+ default:
+ if(isSplitActionTriggered(e) && getEditControl().canSplit()){
+ eventSource = CANCEL;
+ final String output = getNewText();
+ final int caretPosition = textfield.getCaretPosition();
+ hideMe();
+ getEditControl().split(output, caretPosition);
+ nodeView.requestFocusInWindow();
+ e.consume();
+ }
+ break;
+ }
+ }
+
+ protected boolean isSplitActionTriggered(final KeyEvent e) {
+ final int keyCode = e.getKeyCode();
+ if (keyCode == SPLIT_KEY_CODE && keyCode != -1 && e.isAltDown() && ! Compat.isMacOsX())
+ return true;
+ final ModeController modeController = Controller.getCurrentModeController();
+ final KeyStroke splitNodeHotKey = modeController.getUserInputListenerFactory().getAcceleratorManager().getAccelerator("SplitNode");
+ return splitNodeHotKey != null && splitNodeHotKey.getKeyCode() == keyCode &&
+ (e.getModifiersEx() & KEYSTROKE_MODIFIERS) == (splitNodeHotKey.getModifiers() & KEYSTROKE_MODIFIERS);
+ }
+
+ public void keyReleased(final KeyEvent e) {
+ }
+
+ public void keyTyped(final KeyEvent e) {
+ }
+
+ public void mouseClicked(final MouseEvent ev) {
+ if (textfield != null && (ev.getModifiers() & MouseEvent.CTRL_MASK) != 0) {
+ final String linkURL = HtmlUtils.getURLOfExistingLink((HTMLDocument) textfield.getDocument(), textfield.viewToModel(ev.getPoint()));
+ if (linkURL != null) {
+ try {
+ UrlManager.getController().loadURL(new URI(linkURL));
+ } catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+ }
+ }
+
+ public void mouseEntered(final MouseEvent e) {
+ }
+
+ public void mouseExited(final MouseEvent e) {
+ }
+
+ public void mousePressed(final MouseEvent e) {
+ conditionallyShowPopup(e);
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ conditionallyShowPopup(e);
+ }
+ }
+
+ private class MapViewChangeListener implements IMapViewChangeListener{
+ public void afterViewChange(Component oldView, Component newView) {
+ }
+
+ public void afterViewClose(Component oldView) {
+ }
+
+ public void afterViewCreated(Component mapView) {
+ }
+
+ public void beforeViewChange(Component oldView, Component newView) {
+ final String output = getNewText();
+ hideMe();
+ getEditControl().ok(output);
+ }
+ }
+
+ private JEditorPane textfield;
+ final private InputMethodInUseListener inputMethodInUseListener;
+ private final DocumentListener documentListener;
+ private int maxWidth;
+
+ @SuppressWarnings("serial")
+ public EditNodeTextField(final NodeModel node, final ZoomableLabel parent, final String text, final IEditControl editControl) {
+ super(node, text, editControl);
+ this.parent = parent;
+ this.layoutMapOnTextChange = ResourceController.getResourceController().getBooleanProperty("layout_map_on_text_change");
+ documentListener = new MyDocumentListener();
+
+ pasteAction = new DefaultEditorKit.PasteAction(){
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ JTextComponent target = getTextComponent(e);
+ if (target == null) {
+ return;
+ }
+ final Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this);
+ if(contents.isDataFlavorSupported(DataFlavor.stringFlavor)){
+ try {
+ String text = (String) contents.getTransferData(DataFlavor.stringFlavor);
+ target.replaceSelection(text);
+ }
+ catch (Exception ex) {
+ }
+ }
+ }
+ };
+
+ boldAction = new StyledEditorKit.BoldAction();
+ boldAction.putValue(Action.NAME, TextUtils.getText("BoldAction.text"));
+ boldAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control B"));
+
+ italicAction = new StyledEditorKit.ItalicAction();
+ italicAction.putValue(Action.NAME, TextUtils.getText("ItalicAction.text"));
+ italicAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control I"));
+
+ underlineAction = new StyledEditorKit.UnderlineAction();
+ underlineAction.putValue(Action.NAME, TextUtils.getText("UnderlineAction.text"));
+ underlineAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control U"));
+
+ redAction = new ForegroundAction(TextUtils.getText("red"), Color.RED);
+ redAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control R"));
+
+ greenAction = new ForegroundAction(TextUtils.getText("green"), new Color(0, 0x80, 0));
+ greenAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control G"));
+
+ blueAction = new ForegroundAction(TextUtils.getText("blue"), new Color(0, 0, 0xc0));
+ blueAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control L"));
+
+ blackAction = new ForegroundAction(TextUtils.getText("black"), Color.BLACK);
+ blackAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control K"));
+
+ defaultColorAction = new ExtendedEditorKit.RemoveStyleAttributeAction(StyleConstants.Foreground, TextUtils.getText("DefaultColorAction.text"));
+ defaultColorAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control D"));
+
+ removeFormattingAction = new ExtendedEditorKit.RemoveStyleAttributeAction(null, TextUtils.getText("simplyhtml.clearFormatLabel"));
+ removeFormattingAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control T"));
+
+ inputMethodInUseListener = new InputMethodInUseListener();
+ if(editControl != null ){
+ final ModeController modeController = Controller.getCurrentModeController();
+ final MTextController textController = (MTextController) TextController.getController(modeController);
+ textfield = textController.createEditorPane(MTextController.NODE_TEXT);
+ textfield.setNavigationFilter(new MyNavigationFilter(textfield));
+ textfield.addInputMethodListener(inputMethodInUseListener);
+ }
+ }
+
+ public String getNewText() {
+ final SHTMLWriter shtmlWriter = new SHTMLWriter((HTMLDocument) textfield.getDocument());
+ try {
+ shtmlWriter.write();
+ }
+ catch (Exception e) {
+ LogUtils.severe(e);
+ }
+ return shtmlWriter.toString();
+ }
+
+ private void hideMe() {
+ if (textfield == null) {
+ return;
+ }
+ final JEditorPane textfield = this.textfield;
+ this.textfield = null;
+ textfield.getDocument().removeDocumentListener(documentListener);
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ mapViewManager.removeMapViewChangeListener(mapViewChangeListener);
+ mapViewChangeListener = null;
+ parent.setPreferredSize(null);
+ if(SwingUtilities.getAncestorOfClass(MapView.class, nodeView) != null)
+ nodeView.update();
+ final Dimension textFieldSize = textfield.getSize();
+ final Point textFieldCoordinate = new Point();
+ final MapView mapView = nodeView.getMap();
+ UITools.convertPointToAncestor(textfield, textFieldCoordinate, mapView);
+ textfield.getParent().remove(textfield);
+ parent.revalidate();
+ parent.repaint();
+ mapView.repaint(textFieldCoordinate.x, textFieldCoordinate.y, textFieldSize.width, textFieldSize.height);
+ }
+
+ private final ZoomableLabel parent;
+ private NodeView nodeView;
+ private Font font;
+ private float zoom;
+ private final PasteAction pasteAction;
+ private final BoldAction boldAction;
+ private final ItalicAction italicAction;
+ private final UnderlineAction underlineAction;
+ private final ForegroundAction redAction;
+ private final ForegroundAction greenAction;
+ private final ForegroundAction blueAction;
+ private final ForegroundAction blackAction;
+ private StyledTextAction defaultColorAction;
+ private StyledTextAction removeFormattingAction;
+ private int verticalSpace;
+ private int horizontalSpace;
+ private MapViewChangeListener mapViewChangeListener;
+
+ @Override
+ protected JPopupMenu createPopupMenu(Component component) {
+ JPopupMenu menu = super.createPopupMenu(component);
+ JMenu formatMenu = new JMenu(TextUtils.getText("simplyhtml.formatLabel"));
+ menu.add(formatMenu);
+ if (textfield.getSelectionStart() == textfield.getSelectionEnd()){
+ formatMenu.setEnabled(false);
+ return menu;
+ }
+ formatMenu.add(boldAction);
+ formatMenu.add(italicAction);
+ formatMenu.add(underlineAction);
+ formatMenu.add(redAction);
+ formatMenu.add(greenAction);
+ formatMenu.add(blueAction);
+ formatMenu.add(blackAction);
+ formatMenu.add(defaultColorAction);
+ formatMenu.add(removeFormattingAction);
+ return menu;
+ }
+
+ /* (non-Javadoc)
+ * @see org.freeplane.view.swing.map.INodeTextField#show()
+ */
+ @SuppressWarnings("serial")
+ @Override
+ public void show(final RootPaneContainer frame) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ final IMapViewManager viewController = modeController.getController().getMapViewManager();
+ final MTextController textController = (MTextController) TextController.getController(modeController);
+ nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, parent);
+ font = parent.getFont();
+ zoom = viewController.getZoom();
+ if (zoom != 1F) {
+ final float fontSize = (int) (Math.rint(font.getSize() * zoom));
+ font = font.deriveFont(fontSize);
+ }
+ final HTMLEditorKit kit = new ScaledEditorKit(){
+ @Override
+ public void write(Writer out, Document doc, int pos, int len) throws IOException, BadLocationException {
+ if (doc instanceof HTMLDocument) {
+ HTMLWriter w = new SHTMLWriter(out, (HTMLDocument) doc, pos, len);
+ w.write();
+ }
+ else {
+ super.write(out, doc, pos, len);
+ }
+ }
+ };
+ textfield.setEditorKit(kit);
+
+ final InputMap inputMap = textfield.getInputMap();
+ final ActionMap actionMap = textfield.getActionMap();
+ actionMap.put(DefaultEditorKit.pasteAction, pasteAction);
+
+ inputMap.put((KeyStroke) boldAction.getValue(Action.ACCELERATOR_KEY), "boldAction");
+ actionMap.put("boldAction",boldAction);
+
+ inputMap.put((KeyStroke) italicAction.getValue(Action.ACCELERATOR_KEY), "italicAction");
+ actionMap.put("italicAction", italicAction);
+
+ inputMap.put((KeyStroke) underlineAction.getValue(Action.ACCELERATOR_KEY), "underlineAction");
+ actionMap.put("underlineAction", underlineAction);
+
+ inputMap.put((KeyStroke) redAction.getValue(Action.ACCELERATOR_KEY), "redAction");
+ actionMap.put("redAction", redAction);
+
+ inputMap.put((KeyStroke) greenAction.getValue(Action.ACCELERATOR_KEY), "greenAction");
+ actionMap.put("greenAction", greenAction);
+
+ inputMap.put((KeyStroke) blueAction.getValue(Action.ACCELERATOR_KEY), "blueAction");
+ actionMap.put("blueAction", blueAction);
+
+ inputMap.put((KeyStroke) blackAction.getValue(Action.ACCELERATOR_KEY), "blackAction");
+ actionMap.put("blackAction", blackAction);
+
+ inputMap.put((KeyStroke) defaultColorAction.getValue(Action.ACCELERATOR_KEY), "defaultColorAction");
+ actionMap.put("defaultColorAction", defaultColorAction);
+
+ inputMap.put((KeyStroke) removeFormattingAction.getValue(Action.ACCELERATOR_KEY), "removeFormattingAction");
+ actionMap.put("removeFormattingAction", removeFormattingAction);
+
+ final Color nodeTextColor = parent.getForeground();
+ textfield.setCaretColor(nodeTextColor);
+ final StringBuilder ruleBuilder = new StringBuilder(100);
+ ruleBuilder.append("body {");
+ final int labelHorizontalAlignment = parent.getHorizontalAlignment();
+ ruleBuilder.append(new CssRuleBuilder()
+ .withFont(font, UITools.FONT_SCALE_FACTOR)
+ .withColor(nodeTextColor)
+ .withBackground(getBackground())
+ .withAlignment(labelHorizontalAlignment));
+ ruleBuilder.append("}\n");
+ final HTMLDocument document = (HTMLDocument) textfield.getDocument();
+ final StyleSheet styleSheet = document.getStyleSheet();
+ styleSheet.addRule(ruleBuilder.toString());
+ textfield.setText(text);
+ final MapView mapView = (MapView) viewController.getMapViewComponent();
+ if(! mapView.isValid())
+ mapView.validate();
+ final NodeStyleController nsc = NodeStyleController.getController(modeController);
+ maxWidth = Math.max(mapView.getZoomed(nsc.getMaxWidth(node).toBaseUnitsRounded()), parent.getWidth());
+ final Icon icon = parent.getIcon();
+ if(icon != null){
+ maxWidth -= mapView.getZoomed(icon.getIconWidth());
+ maxWidth -= mapView.getZoomed(parent.getIconTextGap());
+ }
+ Insets parentInsets = parent.getZoomedInsets();
+ maxWidth -= parentInsets.left + parentInsets.right;
+ maxWidth = mapView.getZoomed(maxWidth);
+ extraWidth = ResourceController.getResourceController().getIntProperty("editor_extra_width", 80);
+ extraWidth = mapView.getZoomed(extraWidth);
+ final TextFieldListener textFieldListener = new TextFieldListener();
+ this.textFieldListener = textFieldListener;
+ textfield.addFocusListener(textFieldListener);
+ textfield.addKeyListener(textFieldListener);
+ textfield.addMouseListener(textFieldListener);
+ mapViewChangeListener = new MapViewChangeListener();
+ Controller.getCurrentController().getMapViewManager().addMapViewChangeListener(mapViewChangeListener);
+ SpellCheckerController.getController().enableAutoSpell(textfield, true);
+ mapView.scrollNodeToVisible(nodeView);
+ assert( parent.isValid());
+ final int nodeWidth = parent.getWidth();
+ final int nodeHeight = parent.getHeight();
+ final int textFieldBorderWidth = 2;
+ textfield.setBorder(new MatteBorder(textFieldBorderWidth, textFieldBorderWidth, textFieldBorderWidth, textFieldBorderWidth, nodeView.getSelectedColor()));
+ final Dimension textFieldMinimumSize = textfield.getPreferredSize();
+ textFieldMinimumSize.width += 1;
+ if(textFieldMinimumSize.width < extraWidth)
+ textFieldMinimumSize.width = extraWidth;
+ if(textFieldMinimumSize.width < 10)
+ textFieldMinimumSize.width = 10;
+ if (textFieldMinimumSize.width > maxWidth) {
+ textFieldMinimumSize.width = maxWidth;
+ setLineWrap();
+ textFieldMinimumSize.height = textfield.getPreferredSize().height;
+ }
+ final ZoomableLabelUI parentUI = (ZoomableLabelUI)parent.getUI();
+ final LayoutData layoutData = parentUI.getLayoutData(parent);
+ Rectangle iconR = layoutData.iconR;
+ final Rectangle textR = layoutData.textR;
+ int textFieldX = parentInsets.left - textFieldBorderWidth + (iconR.width > 0 ? textR.x - iconR.x : 0);
+
+
+ final EventBuffer eventQueue = MTextController.getController().getEventQueue();
+ KeyEvent firstEvent = eventQueue.getFirstEvent();
+
+ Point mouseEventPoint = null;
+ if (firstEvent == null) {
+ MouseEvent currentEvent = eventQueue.getMouseEvent();
+ if(currentEvent != null){
+ MouseEvent mouseEvent = (MouseEvent) currentEvent;
+ if(mouseEvent.getComponent().equals(parent)){
+ mouseEventPoint = mouseEvent.getPoint();
+ mouseEventPoint.x -= textR.x;
+ mouseEventPoint.y -= textR.y;
+ }
+ }
+ }
+
+
+ textFieldMinimumSize.width = Math.max(textFieldMinimumSize.width, nodeWidth - textFieldX - (parentInsets.right - textFieldBorderWidth));
+ textFieldMinimumSize.height = Math.max(textFieldMinimumSize.height, textR.height);
+ textfield.setSize(textFieldMinimumSize.width, textFieldMinimumSize.height);
+ final Dimension newParentSize = new Dimension(textFieldX + textFieldMinimumSize.width + parentInsets.right, 2 * textR.y + textFieldMinimumSize.height);
+ horizontalSpace = newParentSize.width - textFieldMinimumSize.width;
+ verticalSpace = 2 * textR.y;
+ final int widthAddedToParent = newParentSize.width - parent.getWidth();
+ final Point location = new Point(textR.x - textFieldBorderWidth, textR.y);
+
+ final int widthAddedToTextField = textFieldMinimumSize.width - (textR.width + 2 * textFieldBorderWidth);
+ if(widthAddedToTextField > 0){
+ switch(labelHorizontalAlignment){
+ case SwingConstants.CENTER:
+ location.x -= (widthAddedToTextField - widthAddedToParent) / 2;
+ if(mouseEventPoint != null)
+ mouseEventPoint.x += widthAddedToTextField / 2;
+ break;
+ case SwingConstants.RIGHT:
+ location.x -= widthAddedToTextField - widthAddedToParent;
+ if(mouseEventPoint != null)
+ mouseEventPoint.x += widthAddedToTextField;
+ break;
+ }
+ }
+
+ if(! layoutMapOnTextChange)
+ UITools.convertPointToAncestor(parent, location, mapView);
+
+ textfield.setBounds(location.x, location.y, textFieldMinimumSize.width, textFieldMinimumSize.height);
+ parent.setPreferredSize(newParentSize);
+ parent.setText("");
+ parent.setHorizontalAlignment(JLabel.LEFT);
+ if(layoutMapOnTextChange)
+ parent.add(textfield, 0);
+ else
+ mapView.add(textfield, 0);
+
+ redispatchKeyEvents(textfield, firstEvent);
+ if (firstEvent == null) {
+ int pos = document.getLength();
+ if(mouseEventPoint != null)
+ pos = textfield.viewToModel(mouseEventPoint);
+ textfield.setCaretPosition(pos);
+ }
+ document.addDocumentListener(documentListener);
+ if(textController.isMinimized(node)){
+ layout();
+ }
+ textfield.repaint();
+ textfield.requestFocusInWindow();
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/map/mindmapmode/ExtendedEditorKit.java b/freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/ExtendedEditorKit.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/map/mindmapmode/ExtendedEditorKit.java
rename to freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/ExtendedEditorKit.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/MMapViewController.java b/freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/MMapViewController.java
new file mode 100644
index 0000000..2dfa2dd
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/map/mindmapmode/MMapViewController.java
@@ -0,0 +1,146 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.map.mindmapmode;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Font;
+import javax.swing.JComponent;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.text.mindmapmode.EditNodeBase;
+import org.freeplane.features.text.mindmapmode.EditNodeBase.EditedComponent;
+import org.freeplane.features.text.mindmapmode.EditNodeWYSIWYG;
+import org.freeplane.features.text.mindmapmode.IEditBaseCreator;
+import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.MapViewController;
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.ZoomableLabel;
+
+/**
+ * @author Dimitry Polivaev
+ * Jan 31, 2009
+ */
+public class MMapViewController extends MapViewController implements IEditBaseCreator {
+ public EditNodeBase createEditor(final NodeModel node, final EditNodeBase.IEditControl editControl,
+ String text, final boolean editLong) {
+ final String htmlEditingOption = ResourceController.getResourceController().getProperty("html_editing_option");
+ final boolean editInternalWysiwyg = editLong && StringUtils.equals(htmlEditingOption, "internal-wysiwyg");
+ final boolean editExternal = editLong && StringUtils.equals(htmlEditingOption, "external");
+ if(! HtmlUtils.isHtmlNode(text)){
+ text = HtmlUtils.plainToHTML(text);
+ }
+ if (editInternalWysiwyg) {
+ final EditNodeWYSIWYG editNodeWYSIWYG = new EditNodeWYSIWYG(node, text, editControl, true);
+ final ViewController viewController = Controller.getCurrentModeController().getController().getViewController();
+ if(EditedComponent.TEXT.equals(editControl.getEditType())){
+ int preferredHeight = (int) (getComponent(node).getHeight() * 1.2);
+ preferredHeight = Math.max(preferredHeight, Integer.parseInt(ResourceController.getResourceController()
+ .getProperty("el__min_default_window_height")));
+ preferredHeight = Math.min(preferredHeight, Integer.parseInt(ResourceController.getResourceController()
+ .getProperty("el__max_default_window_height")));
+ int preferredWidth = (int) (getComponent(node).getWidth() * 1.2);
+ preferredWidth = Math.max(preferredWidth, Integer.parseInt(ResourceController.getResourceController()
+ .getProperty("el__min_default_window_width")));
+ preferredWidth = Math.min(preferredWidth, Integer.parseInt(ResourceController.getResourceController()
+ .getProperty("el__max_default_window_width")));
+ final Dimension preferredSize = new Dimension(preferredWidth, preferredHeight);
+ editNodeWYSIWYG.setPreferredSize(preferredSize);
+ }
+ final MainView mainView = (MainView) getComponent(node);
+ final NodeView nodeView = mainView.getNodeView();
+ if(EditedComponent.TEXT.equals(editControl.getEditType())){
+ final Font font = getFont(node);
+ editNodeWYSIWYG.setTitle("edit_long_node");
+ editNodeWYSIWYG.setFont(font);
+ final Color nodeTextColor = getTextColor(node);
+ editNodeWYSIWYG.setTextColor(nodeTextColor);
+ editNodeWYSIWYG.setBackground (nodeView.getTextBackground());
+ editNodeWYSIWYG.setTextAlignment(mainView.getHorizontalAlignment());
+ }
+ else if(EditedComponent.DETAIL.equals(editControl.getEditType())){
+ final MapView map = nodeView.getMap();
+ editNodeWYSIWYG.setTitle("edit_details");
+ editNodeWYSIWYG.setFont(map.getDetailFont());
+ editNodeWYSIWYG.setTextColor(map.getDetailForeground());
+ editNodeWYSIWYG.setBackground (map.getDetailBackground());
+ editNodeWYSIWYG.setTextAlignment(map.getDetailHorizontalAlignment());
+ }
+ else if(EditedComponent.NOTE.equals(editControl.getEditType())){
+ final MapView map = nodeView.getMap();
+ editNodeWYSIWYG.setTitle("edit_note");
+ editNodeWYSIWYG.setFont(map.getNoteFont());
+ editNodeWYSIWYG.setTextColor(map.getNoteForeground());
+ editNodeWYSIWYG.setBackground (map.getNoteBackground());
+ editNodeWYSIWYG.setTextAlignment(map.getNoteHorizontalAlignment());
+ }
+ return editNodeWYSIWYG;
+ }
+ else if (editExternal) {
+ return new EditNodeExternalApplication(node, text, editControl);
+ }
+ else {
+ final EditNodeBase textfield = createEditor(node, editControl.getEditType(), text, editControl);
+ if(textfield != null)
+ return textfield;
+ }
+ return createEditor(node, editControl, text, true);
+ }
+
+ private EditNodeBase createEditor(final NodeModel node, final EditedComponent parent, final String text,
+ final IEditControl editControl) {
+ final ZoomableLabel parentComponent;
+ final MainView mainView = (MainView) getComponent(node);
+ final NodeView nodeView = mainView.getNodeView();
+ if(EditedComponent.TEXT.equals(parent))
+ parentComponent = mainView;
+ else if(EditedComponent.DETAIL.equals(parent)) {
+ final JComponent component = nodeView.getContent(NodeView.DETAIL_VIEWER_POSITION);
+ if(component instanceof ZoomableLabel)
+ parentComponent = (ZoomableLabel) component;
+ else
+ parentComponent = null;
+ }
+ else
+ parentComponent = null;
+ if(parentComponent == null || ! parentComponent.isVisible()){
+ return null;
+ }
+ final EditNodeTextField textField = new EditNodeTextField(node, (ZoomableLabel) parentComponent, text, editControl);
+ if(EditedComponent.TEXT.equals(parent))
+ textField.setBackground (nodeView.getTextBackground());
+ else if(EditedComponent.DETAIL.equals(parent))
+ textField.setBackground (nodeView.getMap().getDetailBackground());
+ return textField;
+ }
+
+ public MMapViewController(Controller controller) {
+ super(controller);
+ new EditNodeTextField(null, null, null, null);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/AltCodeChecker.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/AltCodeChecker.java
new file mode 100644
index 0000000..7d9af2c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/AltCodeChecker.java
@@ -0,0 +1,25 @@
+package org.freeplane.view.swing.ui;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Recognizes characters typed using alt+1..alt+9
+ * on numeric key pad.
+ * @author Dimitry
+ *
+ */
+public class AltCodeChecker {
+ private static Set<Character> altCodes;
+ static {
+ altCodes = new HashSet<Character>(7);
+ altCodes.addAll(Arrays.asList(
+/* Alt + 7, 8, 9*/ '\u2022', '\u25d8', '\u25cb',
+/* Alt + 4, 5, 6*/ '\u2666', '\u2663', '\u2660',
+/* Alt + 1, 2, 3*/ '\u263a', '\u263b', '\u2665'));
+ }
+ static boolean isAltCode(char keyChar) {
+ return altCodes.contains(keyChar);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultMapMouseListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultMapMouseListener.java
new file mode 100644
index 0000000..51d5a85
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultMapMouseListener.java
@@ -0,0 +1,199 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui;
+
+import java.awt.Component;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.MouseEvent;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowFocusListener;
+
+import javax.swing.JComponent;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.ui.ControllerPopupMenuListener;
+import org.freeplane.core.ui.IMouseListener;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.view.swing.map.MapView;
+
+/**
+ * @author Dimitry Polivaev
+ * 06.01.2009
+ */
+/**
+ * The MouseListener which belongs to MapView
+ */
+public class DefaultMapMouseListener implements IMouseListener {
+
+ public DefaultMapMouseListener() {
+ }
+
+ protected void handlePopup(final MouseEvent e) {
+ if (e.isPopupTrigger()) {
+ Component popup = null;
+ final Component popupForModel;
+ final MapView mapView = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
+ final ModeController modeController = Controller.getCurrentController().getModeController();
+ if(mapView != null){
+ final java.lang.Object obj = mapView.detectCollision(e.getPoint());
+ popupForModel= LinkController.getController(modeController).getPopupForModel(obj);
+ }
+ else{
+ popupForModel = null;
+ }
+ if (popupForModel != null) {
+ final ControllerPopupMenuListener popupListener = new ControllerPopupMenuListener();
+ popupForModel.addHierarchyListener(popupListener);
+ popup = popupForModel;
+ }
+ else {
+ popup = modeController.getUserInputListenerFactory().getMapPopup();
+ }
+ Component component = e.getComponent();
+ if(popup instanceof JPopupMenu) {
+ ((JPopupMenu)popup).show(component, e.getX(), e.getY());
+ }
+ else {
+ final Component window;
+ if(popup instanceof Window){
+ window= popup;
+ }
+ else{
+ JOptionPane pane = new JOptionPane(popup);
+ final JDialog d = pane.createDialog(UITools.getMenuComponent(), popup.getName());
+ final Window frame = d.getOwner();
+ d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+ d.setModal(false);
+ d.pack();
+ d.addWindowFocusListener(new WindowFocusListener() {
+ public void windowLostFocus(WindowEvent e) {
+ }
+
+ public void windowGainedFocus(WindowEvent e) {
+ frame.addWindowFocusListener(new WindowFocusListener() {
+ public void windowLostFocus(WindowEvent e) {
+ }
+
+ public void windowGainedFocus(WindowEvent e) {
+ d.setVisible(false);
+ frame.removeWindowFocusListener(this);
+ }
+ });
+ d.removeWindowFocusListener(this);
+ }
+ });
+ window = d;
+ }
+ Point eventLocation = e.getPoint();
+ SwingUtilities.convertPointToScreen(eventLocation, e.getComponent());
+ UITools.setBounds(window, eventLocation.x, eventLocation.y, window.getWidth(), window.getHeight());
+ window.setVisible(true);
+ }
+
+ }
+ }
+
+ public void mouseClicked(final MouseEvent e) {
+ final Object source = e.getSource();
+ if(! (source instanceof MapView))
+ return;
+ final MapView map = (MapView) source;
+ final Controller controller = map.getModeController().getController();
+ final IMapSelection selection = controller.getSelection();
+ if(selection != null){
+ final NodeModel selected = selection.getSelected();
+ if(selected != null)
+ controller.getMapViewManager().getComponent(selected).requestFocusInWindow();
+ }
+ }
+
+ public void mouseEntered(final MouseEvent e) {
+ }
+
+ public void mouseExited(final MouseEvent e) {
+ }
+
+ public void mouseMoved(final MouseEvent e) {
+ }
+
+ public void mousePressed(final MouseEvent e) {
+ final MapView mapView = MapView.getMapView(e.getComponent());
+ if(mapView != null)
+ mapView.select();
+ if (e.isPopupTrigger()) {
+ handlePopup(e);
+ }
+ else if (e.getButton() == MouseEvent.BUTTON1){
+ if(mapView != null){
+ mapView.setMoveCursor(true);
+ originX = e.getX();
+ originY = e.getY();
+ }
+ }
+ e.consume();
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ final MapView mapView = MapView.getMapView(e.getComponent());
+ if(mapView != null)
+ mapView.setMoveCursor(false);
+ originX = -1;
+ originY = -1;
+ handlePopup(e);
+ e.consume();
+ }
+ // // final private Controller controller;
+ protected int originX = -1;
+ protected int originY = -1;
+
+ /**
+ *
+ */
+ public void mouseDragged(final MouseEvent e) {
+ final JComponent component = (JComponent) e.getComponent();
+ final MapView mapView = MapView.getMapView(component);
+ if(mapView == null)
+ return;
+ if (originX >= 0) {
+ final int dx = originX - e.getX();
+ final int dy = originY - e.getY();
+ final Rectangle visibleRect = component.getVisibleRect();
+ final Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
+ final boolean isEventPointVisible = visibleRect.contains(r);
+ if (isEventPointVisible)
+ mapView.scrollBy(dx, dy);
+ else {
+ mapView.scrollBy(dx/3, dy/3);
+ originX += dx/3;
+ originY += dy/3;
+ }
+ }
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/DefaultMouseWheelListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultMouseWheelListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/ui/DefaultMouseWheelListener.java
rename to freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultMouseWheelListener.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultNodeKeyListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultNodeKeyListener.java
new file mode 100644
index 0000000..d98a70c
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultNodeKeyListener.java
@@ -0,0 +1,146 @@
+package org.freeplane.view.swing.ui;
+
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.ActionAcceleratorManager;
+import org.freeplane.core.ui.ControllerPopupMenuListener;
+import org.freeplane.core.ui.IEditHandler;
+import org.freeplane.core.ui.IEditHandler.FirstAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * The KeyListener which belongs to the node and cares for Events like C-D
+ * (Delete Node). It forwards the requests to NodeController.
+ */
+public class DefaultNodeKeyListener implements KeyListener {
+ final private IEditHandler editHandler;
+
+ public DefaultNodeKeyListener(final IEditHandler editHandler) {
+ this.editHandler = editHandler;
+ }
+
+ public void keyPressed(final KeyEvent e) {
+ final boolean checkForScrollMap = e.isShiftDown() && e.isControlDown()&& e.isAltDown();
+ final MapView mapView = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
+ if (mapView == null || SwingUtilities.isDescendingFrom(mapView, e.getComponent()))
+ return;
+ final ActionAcceleratorManager acceleratorManager = mapView.getModeController().getUserInputListenerFactory().getAcceleratorManager();
+ if(acceleratorManager.canProcessKeyEvent(e))
+ return;
+ if(checkForScrollMap){
+ switch (e.getKeyCode()) {
+ case KeyEvent.VK_UP:
+ mapView.scrollBy(0, -10);
+ e.consume();
+ return;
+ case KeyEvent.VK_DOWN:
+ mapView.scrollBy(0, 10);
+ e.consume();
+ return;
+ case KeyEvent.VK_LEFT:
+ mapView.scrollBy(-10, 0);
+ e.consume();
+ return;
+ case KeyEvent.VK_RIGHT:
+ mapView.scrollBy(10, 0);
+ e.consume();
+ }
+ return;
+ }
+ if ((e.isAltDown() || e.isControlDown() || e.isMetaDown())) {
+ return;
+ }
+ switch (e.getKeyCode()) {
+ case KeyEvent.VK_ENTER:
+ case KeyEvent.VK_ESCAPE:
+ case KeyEvent.VK_SHIFT:
+ case KeyEvent.VK_DELETE:
+ case KeyEvent.VK_SPACE:
+ case KeyEvent.VK_INSERT:
+ case KeyEvent.VK_TAB:
+ return;
+ }
+ final boolean continious = e.isShiftDown();
+ switch (e.getKeyCode()) {
+ case KeyEvent.VK_UP:
+ if (mapView.selectUp(continious))
+ e.consume();
+ return;
+ case KeyEvent.VK_DOWN:
+ if (mapView.selectDown(continious))
+ e.consume();
+ return;
+ case KeyEvent.VK_LEFT:
+ if (mapView.selectLeft(continious))
+ e.consume();
+ return;
+ case KeyEvent.VK_RIGHT:
+ if (mapView.selectRight(continious))
+ e.consume();
+ return;
+ case KeyEvent.VK_PAGE_UP:
+ if (mapView.selectPageUp(continious))
+ e.consume();
+ return;
+ case KeyEvent.VK_PAGE_DOWN:
+ if (mapView.selectPageDown(continious))
+ e.consume();
+ return;
+ case KeyEvent.VK_HOME:
+ case KeyEvent.VK_END:
+ case KeyEvent.VK_BACK_SPACE:
+ if (editHandler != null) {
+ editHandler.edit(e, FirstAction.EDIT_CURRENT, false);
+ }
+ return;
+ case KeyEvent.VK_CONTEXT_MENU:
+ final ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ final NodeView nodeView = mapView.getNodeView(node);
+ final JPopupMenu popupmenu = modeController.getUserInputListenerFactory().getNodePopupMenu();
+ if (popupmenu != null) {
+ popupmenu.addHierarchyListener(new ControllerPopupMenuListener());
+ final MainView mainView = nodeView.getMainView();
+ popupmenu.show(mainView, mainView.getX(), mainView.getY());
+ }
+ }
+ }
+
+ public void keyReleased(final KeyEvent e) {
+ }
+
+ public void keyTyped(final KeyEvent e) {
+ if ((e.isAltDown() || e.isControlDown() || e.isMetaDown()) || AltCodeChecker.isAltCode(e.getKeyChar())) {
+ return;
+ }
+ final String keyTypeActionString = ResourceController.getResourceController().getProperty("key_type_action",
+ FirstAction.EDIT_CURRENT.toString());
+ final FirstAction keyTypeAction = FirstAction.valueOf(keyTypeActionString);
+ if (!FirstAction.IGNORE.equals(keyTypeAction)) {
+ if (! isActionEvent(e)) {
+ if (editHandler != null) {
+ editHandler.edit(e, keyTypeAction, false);
+ }
+ return;
+ }
+ }
+ }
+
+ private boolean isActionEvent(final KeyEvent e) {
+ return e.isActionKey() || isControlCharacter(e.getKeyChar());
+ }
+
+ private boolean isControlCharacter(char keyChar) {
+ return keyChar == KeyEvent.CHAR_UNDEFINED || keyChar <= KeyEvent.VK_SPACE|| keyChar == KeyEvent.VK_DELETE;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultNodeMouseMotionListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultNodeMouseMotionListener.java
new file mode 100644
index 0000000..fa0dbcf
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultNodeMouseMotionListener.java
@@ -0,0 +1,239 @@
+package org.freeplane.view.swing.ui;
+
+import java.awt.Cursor;
+import java.awt.event.MouseEvent;
+import java.net.URI;
+
+import javax.swing.JPopupMenu;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.DoubleClickTimer;
+import org.freeplane.core.ui.IMouseListener;
+import org.freeplane.core.ui.components.AutoHide;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.map.FoldingController;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.MouseArea;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * The MouseMotionListener which belongs to every NodeView
+ */
+public class DefaultNodeMouseMotionListener implements IMouseListener {
+ protected final NodeSelector nodeSelector;
+ private static final String FOLD_ON_CLICK_INSIDE = "fold_on_click_inside";
+ /**
+ * The mouse has to stay in this region to enable the selection after a
+ * given time.
+ */
+ protected final DoubleClickTimer doubleClickTimer;
+
+ public DefaultNodeMouseMotionListener() {
+// mc = modeController;
+ doubleClickTimer = new DoubleClickTimer();
+ nodeSelector = new NodeSelector();
+ }
+
+
+ protected boolean isInFoldingRegion(MouseEvent e) {
+ return ((MainView)e.getComponent()).isInFoldingRegion(e.getPoint());
+ }
+
+ protected boolean isInDragRegion(MouseEvent e) {
+ return ((MainView)e.getComponent()).isInDragRegion(e.getPoint());
+ }
+
+ public void mouseClicked(final MouseEvent e) {
+ final ModeController mc = Controller.getCurrentController().getModeController();
+ if(Compat.isMacOsX()){
+ final JPopupMenu popupmenu = mc.getUserInputListenerFactory().getNodePopupMenu();
+ if(popupmenu.isShowing()){
+ return;
+ }
+ }
+ final MainView component = (MainView) e.getComponent();
+ NodeView nodeView = component.getNodeView();
+ if (nodeView == null)
+ return;
+
+ final NodeModel node = nodeView.getModel();
+ final boolean plainEvent = Compat.isPlainEvent(e);
+ final boolean inside = nodeSelector.isInside(e);
+ final MapController mapController = mc.getMapController();
+ if(e.getButton() == 1){
+ if(plainEvent){
+ UIIcon uiIcon = component.getUIIconAt(e.getPoint());
+ if(uiIcon != null){
+ final IconController iconController = mc.getExtension(IconController.class);
+ final NodeModel model = component.getNodeView().getModel();
+ if(iconController.onIconClicked(model, uiIcon))
+ return;
+ }
+ else if (component.isClickableLink(e.getX())) {
+ LinkController.getController(mc).loadURL(node, e);
+ e.consume();
+ return;
+ }
+
+
+ final String link = component.getLink(e.getPoint());
+ if (link != null) {
+ doubleClickTimer.start(new Runnable() {
+ public void run() {
+ loadLink(link);
+ }
+ });
+ e.consume();
+ return;
+ }
+
+ if(inside && e.getClickCount() == 1 && ResourceController.getResourceController().getBooleanProperty(FOLD_ON_CLICK_INSIDE)){
+ final boolean fold = ! node.isFolded();
+ if (!nodeSelector.shouldSelectOnClick(e)) {
+ doubleClickTimer.start(new Runnable() {
+ public void run() {
+ mapController.setFolded(node, fold);
+ }
+ });
+ }
+ }
+ }
+ else if(Compat.isShiftEvent(e)){
+ if (isInFoldingRegion(e)) {
+ if (! mapController.showNextChild(node))
+ mapController.setFolded(node, true);
+ e.consume();
+ }
+ }
+ }
+ final boolean inFoldingRegion = isInFoldingRegion(e);
+ if ((plainEvent && inFoldingRegion
+ || (inFoldingRegion || inside) && Compat.isCtrlShiftEvent(e))
+ && !nodeSelector.shouldSelectOnClick(e)) {
+ final boolean fold = ! node.isFolded();
+ doubleClickTimer.cancel();
+ mapController.setFolded(node, fold);
+ e.consume();
+ return;
+ }
+ if(inside && e.getButton() == 1 && ! e.isAltDown())
+ nodeSelector.extendSelection(e);
+ }
+
+
+ protected void loadLink(final String link) {
+ try {
+ UrlManager.getController().loadURL(new URI(link));
+ } catch (Exception ex) {
+ LogUtils.warn(ex);
+ }
+ }
+
+ /**
+ * Invoked when a mouse button is pressed on a component and then
+ * dragged.
+ */
+ public void mouseDragged(final MouseEvent e) {
+ if (!nodeSelector.isInside(e))
+ return;
+ nodeSelector.stopTimerForDelayedSelection();
+ nodeSelector.selectSingleNode(e);
+ }
+
+ public void mouseEntered(final MouseEvent e) {
+ if (nodeSelector.isRelevant(e)) {
+ nodeSelector.createTimer(e);
+ mouseMoved(e);
+ }
+ }
+
+ public void mouseExited(final MouseEvent e) {
+ nodeSelector.stopTimerForDelayedSelection();
+ final MainView v = (MainView) e.getSource();
+ v.setMouseArea(MouseArea.OUT);
+ nodeSelector.trackWindowForComponent(v);
+ }
+
+ public void mouseMoved(final MouseEvent e) {
+ if (!nodeSelector.isRelevant(e))
+ return;
+ final MainView node = ((MainView) e.getComponent());
+ String link = node.getLink(e.getPoint());
+ boolean followLink = link != null;
+ Controller currentController = Controller.getCurrentController();
+ if(! followLink){
+ followLink = node.isClickableLink(e.getX());
+ if(followLink){
+ link = LinkController.getController(currentController.getModeController()).getLinkShortText(node.getNodeView().getModel());
+ }
+ }
+ final Cursor requiredCursor;
+ if(followLink){
+ currentController.getViewController().out(link);
+ requiredCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
+ node.setMouseArea(MouseArea.LINK);
+ }
+ else if (isInFoldingRegion(e)){
+ requiredCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
+ node.setMouseArea(MouseArea.FOLDING);
+ }
+ else{
+ requiredCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
+ node.setMouseArea(MouseArea.DEFAULT);
+ }
+ if (node.getCursor().getType() != requiredCursor.getType() || requiredCursor.getType() == Cursor.CUSTOM_CURSOR && node.getCursor() != requiredCursor) {
+ node.setCursor(requiredCursor);
+ }
+ nodeSelector.createTimer(e);
+ }
+
+ public void mousePressed(final MouseEvent e) {
+ final MapView mapView = MapView.getMapView(e.getComponent());
+ mapView.select();
+ doubleClickTimer.cancel();
+ showPopupMenu(e);
+ }
+
+ public void mouseReleased(final MouseEvent e) {
+ nodeSelector.stopTimerForDelayedSelection();
+ showPopupMenu(e);
+ }
+
+ public void showPopupMenu(final MouseEvent e) {
+ if (! e.isPopupTrigger())
+ return;
+ final boolean inside = nodeSelector.isInside(e);
+ final boolean inFoldingRegion = ! inside && isInFoldingRegion(e);
+ if (inside || inFoldingRegion) {
+ if(inside){
+ nodeSelector.stopTimerForDelayedSelection();
+ new NodePopupMenuDisplayer().showNodePopupMenu(e);
+ }
+ else if(inFoldingRegion){
+ showFoldingPopup(e);
+ }
+ }
+ }
+
+ private void showFoldingPopup(MouseEvent e) {
+ ModeController mc = Controller.getCurrentController().getModeController();
+ final FoldingController foldingController = mc.getExtension(FoldingController.class);
+ if(foldingController == null)
+ return;
+ final NodeView nodeView = nodeSelector.getRelatedNodeView(e);
+ final JPopupMenu popupmenu = foldingController.createFoldingPopupMenu(nodeView.getModel());
+ AutoHide.start(popupmenu);
+ new NodePopupMenuDisplayer().showMenuAndConsumeEvent(popupmenu, e);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultNodeMouseWheelListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultNodeMouseWheelListener.java
new file mode 100644
index 0000000..560e031
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/DefaultNodeMouseWheelListener.java
@@ -0,0 +1,33 @@
+package org.freeplane.view.swing.ui;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.view.swing.map.MapView;
+
+public class DefaultNodeMouseWheelListener implements MouseWheelListener{
+ private final MouseWheelListener mapMouseWheelListener;
+ public DefaultNodeMouseWheelListener(MouseWheelListener mapMouseWheelListener) {
+ super();
+ this.mapMouseWheelListener = mapMouseWheelListener;
+ }
+ @Override
+ public void mouseWheelMoved(MouseWheelEvent e) {
+ final Component source = e.getComponent();
+ final Point location = new Point(e.getX(), e.getY());
+ final Container map = SwingUtilities.getAncestorOfClass(MapView.class, source);
+ UITools.convertPointToAncestor(source, location, map);
+ final MouseWheelEvent mapWheelEvent = new MouseWheelEvent(map, e.getID(), e.getWhen(), e.getModifiers() | e.getModifiersEx(),
+ location.x, location.y, e.getXOnScreen(), e.getYOnScreen(),
+ e.getClickCount(), e.isPopupTrigger(), e.getScrollType(),
+ e.getScrollAmount(), e.getWheelRotation());
+ mapMouseWheelListener.mouseWheelMoved(mapWheelEvent);
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/DetailsViewMouseListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/DetailsViewMouseListener.java
new file mode 100644
index 0000000..3cdc002
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/DetailsViewMouseListener.java
@@ -0,0 +1,136 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui;
+
+import java.awt.event.MouseEvent;
+
+import javax.swing.JPopupMenu;
+
+import org.freeplane.core.util.Compat;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.text.DetailTextModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.map.ZoomableLabel;
+
+/**
+ * @author Dimitry Polivaev
+ * Oct 1, 2011
+ */
+public class DetailsViewMouseListener extends LinkNavigatorMouseListener {
+ protected final NodeSelector nodeSelector;
+
+ public DetailsViewMouseListener() {
+ nodeSelector = new NodeSelector();
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ final ModeController mc = Controller.getCurrentController().getModeController();
+ if (Compat.isMacOsX()) {
+ final JPopupMenu popupmenu = mc.getUserInputListenerFactory().getNodePopupMenu();
+ if (popupmenu.isShowing()) {
+ return;
+ }
+ }
+ final NodeView nodeView = nodeSelector.getRelatedNodeView(e);
+ if (nodeView == null)
+ return;
+ final NodeModel model = nodeView.getModel();
+ TextController controller = TextController.getController();
+ if (eventFromHideDisplayArea(e)){
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ selection.keepNodePosition(model, 0.0f, 0.0f);
+ controller.setDetailsHidden(model, ! DetailTextModel.getDetailText(model).isHidden());
+ }
+ else {
+ nodeSelector.extendSelection(e);
+ if (canEdit(controller) && isEditingStartEvent(e)) {
+ final boolean editLong = e.isAltDown();
+ if(! editLong)
+ ((MTextController)controller).getEventQueue().activate(e);
+ ((MTextController) controller).editDetails(model, e, editLong);
+ }
+ else
+ super.mouseClicked(e);
+ }
+ }
+
+ protected boolean eventFromHideDisplayArea(MouseEvent e) {
+ final ZoomableLabel component = (ZoomableLabel) e.getComponent();
+ return e.getX() < component.getIconWidth();
+ }
+
+ private boolean canEdit(TextController controller) {
+ return controller.canEdit();
+ }
+
+ private boolean isEditingStartEvent(MouseEvent e) {
+ return e.getClickCount() == 2;
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ new NodePopupMenuDisplayer().showNodePopupMenu(e);
+ }
+
+ @Override
+ public void mouseReleased(MouseEvent e) {
+ new NodePopupMenuDisplayer().showNodePopupMenu(e);
+ }
+
+ @Override
+ public void mouseMoved(MouseEvent e) {
+ super.mouseMoved(e);
+ if (!eventFromHideDisplayArea(e) && nodeSelector.isRelevant(e))
+ nodeSelector.createTimer(e);
+ else
+ nodeSelector.stopTimerForDelayedSelection();
+ }
+
+ /**
+ * Invoked when a mouse button is pressed on a component and then
+ * dragged.
+ */
+ @Override
+ public void mouseDragged(final MouseEvent e) {
+ nodeSelector.stopTimerForDelayedSelection();
+ nodeSelector.selectSingleNode(e);
+ }
+
+ @Override
+ public void mouseEntered(final MouseEvent e) {
+ if (!eventFromHideDisplayArea(e) && nodeSelector.isRelevant(e)) {
+ mouseMoved(e);
+ }
+ else
+ nodeSelector.stopTimerForDelayedSelection();
+ }
+
+ @Override
+ public void mouseExited(final MouseEvent e) {
+ nodeSelector.stopTimerForDelayedSelection();
+ nodeSelector.trackWindowForComponent(e.getComponent());
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/LinkNavigatorMouseListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/LinkNavigatorMouseListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/ui/LinkNavigatorMouseListener.java
rename to freeplane/src/main/java/org/freeplane/view/swing/ui/LinkNavigatorMouseListener.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/MapsMenuAction.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/MapsMenuAction.java
new file mode 100644
index 0000000..1353aab
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/MapsMenuAction.java
@@ -0,0 +1,50 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.mode.Controller;
+
+ at SuppressWarnings("serial")
+class MapsMenuAction extends AFreeplaneAction {
+ public MapsMenuAction(String command) {
+ super("MapsMenuAction." + command, command, null);
+ }
+
+ public void actionPerformed(final ActionEvent menuEvent) {
+ final String mapId = menuEvent.getActionCommand();
+ UITools.executeWhenNodeHasFocus(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Controller.getCurrentController().getMapViewManager().changeToMapView(mapId);
+ }
+ catch (IllegalArgumentException ex){
+ LogUtils.warn(ex);
+ }
+ }
+ });
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/ModesMenuAction.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/ModesMenuAction.java
new file mode 100644
index 0000000..5984973
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/ModesMenuAction.java
@@ -0,0 +1,43 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.mode.Controller;
+
+class ModesMenuAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+ private final String mode;
+
+ public ModesMenuAction(final String mode, final Controller controller) {
+ super("ModesMenuAction." + mode);
+ this.mode = mode;
+ }
+
+ public void actionPerformed(final ActionEvent e) {
+ Controller.getCurrentController().selectMode(mode);
+ }
+
+ @Override
+ public void afterMapChange(final Object newMap) {
+ }
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/MovedMouseEventFilter.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/MovedMouseEventFilter.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/ui/MovedMouseEventFilter.java
rename to freeplane/src/main/java/org/freeplane/view/swing/ui/MovedMouseEventFilter.java
diff --git a/freeplane/src/org/freeplane/view/swing/ui/NodePopupMenuDisplayer.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/NodePopupMenuDisplayer.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/ui/NodePopupMenuDisplayer.java
rename to freeplane/src/main/java/org/freeplane/view/swing/ui/NodePopupMenuDisplayer.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/NodeSelector.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/NodeSelector.java
new file mode 100644
index 0000000..0c9870b
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/NodeSelector.java
@@ -0,0 +1,196 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui;
+
+import java.awt.Component;
+import java.awt.KeyboardFocusManager;
+import java.awt.Rectangle;
+import java.awt.Window;
+import java.awt.event.MouseEvent;
+import java.awt.geom.Point2D;
+import java.util.Timer;
+import java.util.TimerTask;
+
+import javax.swing.FocusManager;
+import javax.swing.SwingUtilities;
+import javax.swing.text.JTextComponent;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.SysUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * 19.06.2013
+ */
+public class NodeSelector {
+ private static final String SELECTION_METHOD_DIRECT = "selection_method_direct";
+ private static final String SELECTION_METHOD_BY_CLICK = "selection_method_by_click";
+ private static final String TIME_FOR_DELAYED_SELECTION = "time_for_delayed_selection";
+ private static final String SELECTION_METHOD = "selection_method";
+ private final MovedMouseEventFilter windowMouseTracker = new MovedMouseEventFilter();
+
+ protected class TimeDelayedSelection extends TimerTask {
+ final private MouseEvent e;
+
+ TimeDelayedSelection(final MouseEvent e) {
+ this.e = e;
+ }
+
+ /** TimerTask method to enable the selection after a given time. */
+ @Override
+ public void run() {
+ /*
+ * formerly in ControllerAdapter. To guarantee, that
+ * point-to-select does not change selection if any meta key is
+ * pressed.
+ */
+ SwingUtilities.invokeLater(new Runnable() {
+ public void run() {
+ if (e.getModifiers() != 0) {
+ return;
+ }
+ try {
+ Controller controller = Controller.getCurrentController();
+ if (!controller.getModeController().isBlocked() && controller.getSelection().size() <= 1) {
+ final NodeView nodeV = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class,
+ e.getComponent());
+ if (nodeV.isDisplayable() && nodeV.getModel().hasVisibleContent()) {
+ nodeV.getMap().select();
+ controller.getSelection().selectAsTheOnlyOneSelected(nodeV.getModel());
+ }
+ }
+ }
+ catch (NullPointerException e) {
+ }
+ }
+ });
+ }
+ }
+
+ private Rectangle controlRegionForDelayedSelection;
+ private Timer timerForDelayedSelection;
+
+ public void createTimer(final MouseEvent e) {
+ if (controlRegionForDelayedSelection != null && controlRegionForDelayedSelection.contains(e.getPoint())) {
+ return;
+ }
+ if (!isInside(e))
+ return;
+ stopTimerForDelayedSelection();
+ Window focusedWindow = FocusManager.getCurrentManager().getFocusedWindow();
+ if (focusedWindow == null) {
+ return;
+ }
+ if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() instanceof JTextComponent) {
+ return;
+ }
+ /* Region to check for in the sequel. */
+ controlRegionForDelayedSelection = getControlRegion(e.getPoint());
+ final String selectionMethod = ResourceController.getResourceController().getProperty(SELECTION_METHOD);
+ if (selectionMethod.equals(SELECTION_METHOD_BY_CLICK)) {
+ return;
+ }
+ if (selectionMethod.equals(SELECTION_METHOD_DIRECT)) {
+ new TimeDelayedSelection(e).run();
+ return;
+ }
+ final int timeForDelayedSelection = ResourceController.getResourceController().getIntProperty(
+ TIME_FOR_DELAYED_SELECTION, 0);
+ timerForDelayedSelection = SysUtils.createTimer(getClass().getSimpleName());
+ timerForDelayedSelection.schedule(new TimeDelayedSelection(e), timeForDelayedSelection);
+ }
+
+ protected boolean isInside(final MouseEvent e) {
+ return new Rectangle(0, 0, e.getComponent().getWidth(), e.getComponent().getHeight())
+ .contains(e.getPoint());
+ }
+
+ public void stopTimerForDelayedSelection() {
+ if (timerForDelayedSelection != null) {
+ timerForDelayedSelection.cancel();
+ }
+ timerForDelayedSelection = null;
+ controlRegionForDelayedSelection = null;
+ }
+
+ protected Rectangle getControlRegion(final Point2D p) {
+ final int side = 8;
+ return new Rectangle((int) (p.getX() - side / 2), (int) (p.getY() - side / 2), side, side);
+ }
+
+ public boolean shouldSelectOnClick(MouseEvent e) {
+ if (isInside(e)) {
+ final NodeView nodeView = getRelatedNodeView(e);
+ return !nodeView.isSelected() || Controller.getCurrentController().getSelection().size() != 1;
+ }
+ return false;
+ }
+
+ public void extendSelection(final MouseEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ final NodeView nodeView = getRelatedNodeView(e);
+ final NodeModel newlySelectedNode = nodeView.getModel();
+ final boolean extend = Compat.isMacOsX() ? e.isMetaDown() : e.isControlDown();
+ final boolean range = e.isShiftDown();
+ final IMapSelection selection = controller.getSelection();
+ if (range && !extend) {
+ selection.selectContinuous(newlySelectedNode);
+ }
+ else if (extend && !range) {
+ selection.toggleSelected(newlySelectedNode);
+ }
+ if (extend == range) {
+ if (selection.isSelected(newlySelectedNode) && selection.size() == 1
+ && FocusManager.getCurrentManager().getFocusOwner() instanceof MainView)
+ return;
+ else {
+ selection.selectAsTheOnlyOneSelected(newlySelectedNode);
+ }
+ e.consume();
+ }
+ }
+
+ public void selectSingleNode(MouseEvent e) {
+ final NodeView nodeV = getRelatedNodeView(e);
+ final Controller controller = Controller.getCurrentController();
+ if (!((MapView) controller.getMapViewManager().getMapViewComponent()).isSelected(nodeV)) {
+ controller.getSelection().selectAsTheOnlyOneSelected(nodeV.getModel());
+ }
+ }
+
+ public NodeView getRelatedNodeView(MouseEvent e) {
+ return (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, e.getComponent());
+ }
+
+ public boolean isRelevant(MouseEvent e) {
+ return windowMouseTracker.isRelevant(e);
+ }
+
+ public void trackWindowForComponent(Component c) {
+ windowMouseTracker.trackWindowForComponent(c);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/UserInputListenerFactory.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/UserInputListenerFactory.java
new file mode 100644
index 0000000..553e5c5
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/UserInputListenerFactory.java
@@ -0,0 +1,522 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui;
+
+import java.awt.Component;
+import java.awt.dnd.DragGestureListener;
+import java.awt.dnd.DropTargetListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseWheelListener;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import javax.swing.JComponent;
+import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.ActionAcceleratorManager;
+import org.freeplane.core.ui.IKeyStrokeProcessor;
+import org.freeplane.core.ui.IMouseListener;
+import org.freeplane.core.ui.IMouseWheelEventHandler;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.FreeplaneResourceAccessor;
+import org.freeplane.core.ui.menubuilders.XmlEntryStructureBuilder;
+import org.freeplane.core.ui.menubuilders.action.EntriesForAction;
+import org.freeplane.core.ui.menubuilders.generic.BuildPhaseListener;
+import org.freeplane.core.ui.menubuilders.generic.BuildProcessFactory;
+import org.freeplane.core.ui.menubuilders.generic.BuilderDestroyerPair;
+import org.freeplane.core.ui.menubuilders.generic.ChildActionEntryRemover;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.ui.menubuilders.generic.RecursiveMenuStructureProcessor;
+import org.freeplane.core.ui.menubuilders.generic.SubtreeProcessor;
+import org.freeplane.core.ui.menubuilders.menu.MenuAcceleratorChangeListener;
+import org.freeplane.core.ui.menubuilders.menu.MenuBuildProcessFactory;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.IMapSelectionListener;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.view.swing.map.MapView;
+
+public class UserInputListenerFactory implements IUserInputListenerFactory {
+ public static final String NODE_POPUP = "/node_popup";
+// // final private Controller controller;
+ private IMouseListener mapMouseListener;
+ private MouseWheelListener mapMouseWheelListener;
+ private JPopupMenu mapsPopupMenu;
+ private FreeplaneMenuBar menuBar;
+ final private HashSet<IMouseWheelEventHandler> mRegisteredMouseWheelEventHandler = new HashSet<IMouseWheelEventHandler>();
+ private DragGestureListener nodeDragListener;
+ private DropTargetListener nodeDropTargetListener;
+ private KeyListener nodeKeyListener;
+ private IMouseListener nodeMotionListener;
+ private IMouseListener nodeMouseMotionListener;
+ private MouseWheelListener nodeMouseWheelListener;
+ private JPopupMenu nodePopupMenu;
+ private final Map<String, JComponent> toolBars;
+ private final List<JComponent>[] toolbarLists;
+ static private ActionAcceleratorManager acceleratorManager;
+ final private List<Map<String, BuilderDestroyerPair>> customBuilders;
+ final private List<BuildPhaseListener> buildPhaseListeners;
+ private Entry genericMenuStructure;
+ private SubtreeProcessor subtreeBuilder;
+ final private ModeController modeController;
+ final static private IKeyStrokeProcessor DEFAULT_PROCESSOR = new IKeyStrokeProcessor() {
+ @Override
+ public boolean processKeyBinding(KeyStroke ks, KeyEvent e) {
+ return acceleratorManager.processKeyBinding(ks, e);
+ }
+ };
+ final private IKeyStrokeProcessor delegateProcessor = new IKeyStrokeProcessor() {
+ @Override
+ public boolean processKeyBinding(KeyStroke ks, KeyEvent e) {
+ return keyEventProcessor.processKeyBinding(ks, e);
+ }
+ };
+ private IKeyStrokeProcessor keyEventProcessor;
+
+ public UserInputListenerFactory(final ModeController modeController) {
+ this.modeController = modeController;
+ customBuilders = new ArrayList<Map<String, BuilderDestroyerPair>>(Phase.values().length);
+ keyEventProcessor = DEFAULT_PROCESSOR;
+ buildPhaseListeners = new ArrayList<BuildPhaseListener>();
+ for (@SuppressWarnings("unused")
+ Phase phase : Phase.values()) {
+ customBuilders.add(new HashMap<String, BuilderDestroyerPair>());
+ }
+ Controller controller = Controller.getCurrentController();
+ controller.getMapViewManager().addMapSelectionListener(new IMapSelectionListener() {
+ public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
+ if (modeController.equals(Controller.getCurrentModeController())) {
+ final RecursiveMenuStructureProcessor recursiveMenuStructureProcessor = new RecursiveMenuStructureProcessor();
+ recursiveMenuStructureProcessor.setDefaultBuilder(new EntryVisitor() {
+ EntryAccessor entryAccessor = new EntryAccessor();
+
+ @Override
+ public void visit(Entry entry) {
+ final AFreeplaneAction action = entryAccessor.getAction(entry);
+ if (action != null) {
+ action.afterMapChange(newMap);
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return false;
+ }
+ });
+ recursiveMenuStructureProcessor.build(genericMenuStructure);
+ }
+ }
+
+ public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
+ }
+ });
+
+ addUiBuilder(Phase.ACTIONS, "navigate_maps", new BuilderDestroyerPair(new EntryVisitor() {
+ @Override
+ public void visit(Entry target) {
+ createMapActions(target);
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+ }, new ChildActionEntryRemover(modeController)));
+
+ addUiBuilder(Phase.ACTIONS, "navigate_modes", new BuilderDestroyerPair(new EntryVisitor() {
+ @Override
+ public void visit(Entry target) {
+ createModeActions(target);
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+ }, new ChildActionEntryRemover(modeController)));
+
+ toolBars = new LinkedHashMap<String, JComponent>();
+ toolbarLists = newListArray();
+ for (int j = 0; j < 4; j++) {
+ toolbarLists[j] = new LinkedList<JComponent>();
+ }
+ }
+
+ public <T> T getMenu(Class<T> clazz) {
+ return null;
+ }
+
+ public ActionAcceleratorManager getAcceleratorManager() {
+ if(acceleratorManager == null) {
+ acceleratorManager = new ActionAcceleratorManager();
+ }
+ return acceleratorManager;
+ }
+
+
+
+ public void setKeyEventProcessor(IKeyStrokeProcessor keyEventProcessor) {
+ this.keyEventProcessor = keyEventProcessor;
+ }
+
+ // isolate unchecked stuff in this method
+ @SuppressWarnings("unchecked")
+ private List<JComponent>[] newListArray() {
+ return new List[4];
+ }
+
+ public void addToolBar(final String name, final int position, final JComponent toolBar) {
+ toolBars.put(name, toolBar);
+ toolbarLists[position].add(toolBar);
+ }
+
+ public void addMouseWheelEventHandler(final IMouseWheelEventHandler handler) {
+ mRegisteredMouseWheelEventHandler.add(handler);
+ }
+
+ public IMouseListener getMapMouseListener() {
+ if (mapMouseListener == null) {
+ mapMouseListener = new DefaultMapMouseListener();
+ }
+ return mapMouseListener;
+ }
+
+ public MouseWheelListener getMapMouseWheelListener() {
+ if (mapMouseWheelListener == null) {
+ mapMouseWheelListener = new DefaultMouseWheelListener();
+ }
+ return mapMouseWheelListener;
+ }
+
+ public JPopupMenu getMapPopup() {
+ return mapsPopupMenu;
+ }
+
+ public FreeplaneMenuBar getMenuBar() {
+ if (menuBar == null) {
+ menuBar = new FreeplaneMenuBar(delegateProcessor);
+ }
+ return menuBar;
+ }
+
+ public Set<IMouseWheelEventHandler> getMouseWheelEventHandlers() {
+ return Collections.unmodifiableSet(mRegisteredMouseWheelEventHandler);
+ }
+
+ public DragGestureListener getNodeDragListener() {
+ return nodeDragListener;
+ }
+
+ public DropTargetListener getNodeDropTargetListener() {
+ return nodeDropTargetListener;
+ }
+
+ public KeyListener getNodeKeyListener() {
+ if (nodeKeyListener == null) {
+ nodeKeyListener = new DefaultNodeKeyListener(null);
+ }
+ return nodeKeyListener;
+ }
+
+ public IMouseListener getNodeMotionListener() {
+ return nodeMotionListener;
+ }
+
+ public IMouseListener getNodeMouseMotionListener() {
+ if (nodeMouseMotionListener == null) {
+ nodeMouseMotionListener = new DefaultNodeMouseMotionListener();
+ }
+ return nodeMouseMotionListener;
+ }
+
+ public MouseWheelListener getNodeMouseWheelListener() {
+ if (nodeMouseWheelListener == null) {
+ nodeMouseWheelListener = new DefaultNodeMouseWheelListener(getMapMouseWheelListener());
+ }
+ return nodeMouseWheelListener;
+ }
+
+ public JPopupMenu getNodePopupMenu() {
+ return nodePopupMenu;
+ }
+
+ public JComponent getToolBar(final String name) {
+ return toolBars.get(name);
+ }
+
+ public Iterable<JComponent> getToolBars(final int position) {
+ return toolbarLists[position];
+ }
+
+ public void removeMouseWheelEventHandler(final IMouseWheelEventHandler handler) {
+ mRegisteredMouseWheelEventHandler.remove(handler);
+ }
+
+ public void setMapMouseListener(final IMouseListener mapMouseMotionListener) {
+ if (mapMouseListener != null) {
+ throw new RuntimeException("already set");
+ }
+ mapMouseListener = mapMouseMotionListener;
+ }
+
+ public void setMapMouseWheelListener(final MouseWheelListener mouseWheelListener) {
+ if (mapMouseWheelListener != null) {
+ throw new RuntimeException("already set");
+ }
+ mapMouseWheelListener = mouseWheelListener;
+ }
+
+ public void setMenuBar(final FreeplaneMenuBar menuBar) {
+ if (mapMouseWheelListener != null) {
+ throw new RuntimeException("already set");
+ }
+ this.menuBar = menuBar;
+ }
+
+
+ public void setNodeDragListener(DragGestureListener nodeDragListener) {
+ if (this.nodeDragListener != null) {
+ throw new RuntimeException("already set");
+ }
+ this.nodeDragListener = nodeDragListener;
+ }
+
+ public void setNodeDropTargetListener(final DropTargetListener nodeDropTargetListener) {
+ if (this.nodeDropTargetListener != null) {
+ throw new RuntimeException("already set");
+ }
+ this.nodeDropTargetListener = nodeDropTargetListener;
+ }
+
+ public void setNodeKeyListener(final KeyListener nodeKeyListener) {
+ if (this.nodeKeyListener != null) {
+ throw new RuntimeException("already set");
+ }
+ this.nodeKeyListener = nodeKeyListener;
+ }
+
+ public void setNodeMotionListener(final IMouseListener nodeMotionListener) {
+ if (this.nodeMotionListener != null) {
+ throw new RuntimeException("already set");
+ }
+ this.nodeMotionListener = nodeMotionListener;
+ }
+
+ public void setNodeMouseMotionListener(final IMouseListener nodeMouseMotionListener) {
+ if (this.nodeMouseMotionListener != null) {
+ throw new RuntimeException("already set");
+ }
+ this.nodeMouseMotionListener = nodeMouseMotionListener;
+ }
+
+ public void setNodeMouseWheelListener(MouseWheelListener nodeMouseWheelListener) {
+ if (this.nodeMouseWheelListener != null) {
+ throw new RuntimeException("already set");
+ }
+ this.nodeMouseWheelListener = nodeMouseWheelListener;
+ }
+
+ public void setNodePopupMenu(final JPopupMenu nodePopupMenu) {
+ if (this.nodePopupMenu != null) {
+ throw new RuntimeException("already set");
+ }
+ this.nodePopupMenu = nodePopupMenu;
+ }
+
+ public void updateMapList() {
+ for (Entry entry : mapMenuEntries.keySet())
+ rebuildMenu(entry);
+ }
+
+ final private Map<Entry, Entry> mapMenuEntries = new IdentityHashMap<Entry, Entry>();
+
+ private void createModeActions(final Entry modesMenuEntry) {
+ rebuildMenuOnMapChange(modesMenuEntry);
+ Controller controller = Controller.getCurrentController();
+ EntryAccessor entryAccessor = new EntryAccessor();
+ for (final String key : new LinkedList<String>(controller.getModes())) {
+ final AFreeplaneAction modesMenuAction = new ModesMenuAction(key, controller);
+ modeController.addActionIfNotAlreadySet(modesMenuAction);
+ Entry actionEntry = new Entry();
+ entryAccessor.setAction(actionEntry, modesMenuAction);
+ final ModeController modeController = controller.getModeController();
+ if (modeController != null && modeController.getModeName().equals(key)) {
+ actionEntry.setAttribute("selected", true);
+ }
+ modesMenuEntry.addChild(actionEntry);
+ ResourceController.getResourceController().getProperty(("keystroke_mode_" + key));
+ }
+ }
+
+ private void createMapActions(final Entry mapsMenuEntry) {
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ final List<? extends Component> mapViewVector = viewController.getMapViewVector();
+ if (mapViewVector == null) {
+ return;
+ }
+ EntryAccessor entryAccessor = new EntryAccessor();
+ for (final Component mapView : mapViewVector) {
+ final String displayName = mapView.getName();
+ Entry actionEntry = new Entry();
+ final MapsMenuAction action = new MapsMenuAction(displayName);
+ modeController.addActionIfNotAlreadySet(action);
+ entryAccessor.setAction(actionEntry, action);
+ final MapView currentMapView = (MapView) mapViewManager.getMapViewComponent();
+ if (currentMapView != null) {
+ if (mapView == currentMapView) {
+ actionEntry.setAttribute("selected", true);
+ }
+ }
+ mapsMenuEntry.addChild(actionEntry);
+ }
+ }
+
+ private void rebuildMenuOnMapChange(final Entry entry) {
+ Entry menuEntry;
+ for (menuEntry = entry.getParent(); //
+ menuEntry.getName().isEmpty(); //
+ menuEntry = menuEntry.getParent());
+ mapMenuEntries.put(menuEntry, null);
+ }
+
+ public void rebuildMenu(Entry entry){
+ if (subtreeBuilder != null)
+ subtreeBuilder.rebuildChildren(entry);
+ }
+
+ public void rebuildMenus(String name) {
+ final List<Entry> entries = getGenericMenuStructure().findEntries(name);
+ for (Entry entry : entries)
+ rebuildMenu(entry);
+ }
+
+ public void updateMenus(String menuStructureResource, Set<String> plugins) {
+ mapsPopupMenu = new JPopupMenu();
+ mapsPopupMenu.setName(TextUtils.getText("mindmaps"));
+
+ final URL genericStructure = ResourceController.getResourceController().getResource(
+ menuStructureResource);
+ final boolean isUserDefined = genericStructure.getProtocol().equalsIgnoreCase("file");
+ try {
+ final FreeplaneResourceAccessor resourceAccessor = new FreeplaneResourceAccessor();
+ final EntriesForAction entries = new EntriesForAction();
+ final ActionAcceleratorManager acceleratorManager = getAcceleratorManager();
+ final BuildProcessFactory buildProcessFactory = new MenuBuildProcessFactory(this, modeController,
+ resourceAccessor, acceleratorManager, entries, buildPhaseListeners);
+ final PhaseProcessor buildProcessor = buildProcessFactory.getBuildProcessor();
+ subtreeBuilder = buildProcessFactory.getChildProcessor();
+ acceleratorManager.addAcceleratorChangeListener(modeController, new MenuAcceleratorChangeListener(entries));
+ for (final Phase phase : Phase.values())
+ for (java.util.Map.Entry<String, BuilderDestroyerPair> entry : customBuilders.get(phase.ordinal())
+ .entrySet())
+ buildProcessor.phase(phase).addBuilderPair(entry.getKey(), entry.getValue());
+ final InputStream resource = genericStructure.openStream();
+ final BufferedReader reader = new BufferedReader(new InputStreamReader(resource));
+ genericMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(reader);
+ filterPlugins(genericMenuStructure, plugins);
+ buildProcessor.build(genericMenuStructure);
+ if(Boolean.getBoolean("org.freeplane.outputUnusedActions"))
+ outputUnusedActions();
+ }
+ catch (Exception e) {
+ if (isUserDefined) {
+ LogUtils.warn(e);
+ String myMessage = TextUtils.format("menu_error", genericStructure.getPath(), e.getMessage());
+ UITools.backOtherWindows();
+ JOptionPane.showMessageDialog(UITools.getMenuComponent(), myMessage, "Freeplane", JOptionPane.ERROR_MESSAGE);
+ System.exit(-1);
+ }
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ private void filterPlugins(Entry entry, Set<String> plugins) {
+ final Iterator<Entry> iterator = entry.children().iterator();
+ while(iterator.hasNext()){
+ final Entry child = iterator.next();
+ final Object plugin = child.getAttribute("plugin");
+ if(plugin != null && ! plugins.contains(plugin))
+ iterator.remove();
+ else
+ filterPlugins(child, plugins);
+ }
+ }
+
+ private void outputUnusedActions() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("Unused actions for mode ").append(modeController.getModeName()).append('\n');
+ TreeSet<String> actionKeys = new TreeSet<String>();
+ actionKeys.addAll(modeController.getActionKeys());
+ actionKeys.addAll(modeController.getController().getActionKeys());
+ KEYS: for(String key : actionKeys){
+ final List<Entry> entries = genericMenuStructure.findEntries(key);
+ for(Entry entry : entries)
+ if(new EntryAccessor().getComponent(entry) != null)
+ continue KEYS;
+ sb.append(key).append('\n');
+ }
+ LogUtils.info(sb.toString());
+
+ }
+
+ public void addUiBuilder(Phase phase, String name, BuilderDestroyerPair builderDestroyerPair) {
+ customBuilders.get(phase.ordinal()).put(name, builderDestroyerPair);
+ }
+
+ public void addBuildPhaseListener(BuildPhaseListener listener) {
+ buildPhaseListeners.add(listener);
+ }
+
+ @Override
+ public Entry getGenericMenuStructure() {
+ return genericMenuStructure;
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/GlassPaneManager.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/GlassPaneManager.java
new file mode 100644
index 0000000..c0d3b7d
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/GlassPaneManager.java
@@ -0,0 +1,63 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui.mindmapmode;
+
+import java.awt.Component;
+
+import javax.swing.JRootPane;
+import javax.swing.SwingUtilities;
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+
+import org.freeplane.core.ui.DelayedMouseListener;
+import org.freeplane.core.ui.IMouseListener;
+
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 3, 2011
+ */
+public class GlassPaneManager implements AncestorListener {
+ private final IMouseListener mouseListener;
+ private final JRootPane rootPane;
+ public GlassPaneManager(JRootPane jframe, INodeSelector nodeSelector) {
+ this.mouseListener = new DelayedMouseListener(new GlassPaneNodeSelector(nodeSelector), 2, 1);
+ this.rootPane = jframe;
+ }
+
+ public void ancestorRemoved(AncestorEvent event) {
+ final Component glassPane = rootPane.getRootPane().getGlassPane();
+ glassPane.removeMouseListener(mouseListener);
+ glassPane.removeMouseMotionListener(mouseListener);
+ glassPane.setVisible(false);
+ SwingUtilities.getWindowAncestor(rootPane).setFocusableWindowState(true);
+ }
+
+ public void ancestorMoved(AncestorEvent event) {
+ }
+
+ public void ancestorAdded(AncestorEvent event) {
+ final Component glassPane = rootPane.getRootPane().getGlassPane();
+ glassPane.addMouseListener(mouseListener);
+ glassPane.addMouseMotionListener(mouseListener);
+ glassPane.setVisible(true);
+ SwingUtilities.getWindowAncestor(rootPane).setFocusableWindowState(false);
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/GlassPaneNodeSelector.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/GlassPaneNodeSelector.java
new file mode 100644
index 0000000..09a7ca2
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/GlassPaneNodeSelector.java
@@ -0,0 +1,160 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Container;
+import java.awt.Point;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+
+import javax.swing.JScrollBar;
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.ui.IMouseListener;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * Mar 3, 2011
+ */
+class GlassPaneNodeSelector extends MouseAdapter implements IMouseListener{
+
+ /**
+ *
+ */
+ private final INodeSelector nodeSelector;
+ private Component activeComponent;
+ /**
+ * @param nodeSelector
+ */
+ GlassPaneNodeSelector(INodeSelector nodeSelector) {
+ this.nodeSelector = nodeSelector;
+ }
+
+ public void mouseMoved(MouseEvent e) {
+ }
+
+ public void mouseDragged(MouseEvent e) {
+ final Component component = findMapComponent(e);
+ if(canRedispatchEventFor(component)){
+ redispatchMouseEvent(e, component);
+ }
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ if(e.getButton() != 1){
+ return;
+ }
+ final Component component = findMapComponent(e);
+ if(! (component instanceof MainView)){
+ return;
+ }
+ MainView mainView = (MainView) component;
+ NodeView nodeView = mainView.getNodeView();
+ final NodeModel model = nodeView.getModel();
+ switch(e.getClickCount()){
+ case 1:
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ mapController.setFolded(model, ! nodeView.isFolded());
+ break;
+ case 2:
+ nodeSelector.nodeSelected(model);
+ break;
+ }
+ }
+
+ public boolean canRedispatchEventFor(final Component component) {
+ if (component instanceof MapView)
+ return true;
+ if (component instanceof JScrollBar || SwingUtilities.getAncestorOfClass(JScrollBar.class, component) != null)
+ return true;
+ return false;
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ public void mouseExited(MouseEvent e) {
+ }
+
+ public void mousePressed(MouseEvent e) {
+ if(e.getButton() != 1){
+ return;
+ }
+ final Component component = findMapComponent(e);
+ if(canRedispatchEventFor(component)){
+ redispatchMouseEvent(e, component);
+ activeComponent = component;
+ }
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ if(e.getButton() != 1){
+ return;
+ }
+ if(activeComponent != null){
+ redispatchMouseEvent(e, activeComponent);
+ activeComponent = null;
+ }
+ }
+
+ //A basic implementation of redispatching events.
+ private Component findMapComponent(MouseEvent e) {
+ final Component glassPane = e.getComponent();
+ final Point glassPanePoint = e.getPoint();
+ final Container container = SwingUtilities.getRootPane(glassPane).getContentPane();
+ Point containerPoint = SwingUtilities.convertPoint(
+ glassPane,
+ glassPanePoint,
+ container);
+ Component component =
+ SwingUtilities.getDeepestComponentAt(
+ container,
+ containerPoint.x,
+ containerPoint.y);
+ if(component instanceof MainView || component instanceof MapView || component instanceof JScrollBar){
+ return component;
+ }
+ return SwingUtilities.getAncestorOfClass(MapView.class, component);
+ }
+ public void redispatchMouseEvent(MouseEvent e, final Component component) {
+ final Component glassPane = e.getComponent();
+ final Point glassPanePoint = e.getPoint();
+ Point componentPoint = SwingUtilities.convertPoint(
+ glassPane,
+ glassPanePoint,
+ component);
+ component.dispatchEvent(new MouseEvent(component,
+ e.getID(),
+ e.getWhen(),
+ e.getModifiers(),
+ componentPoint.x,
+ componentPoint.y,
+ e.getClickCount(),
+ e.isPopupTrigger()));
+ }
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/INodeSelector.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/INodeSelector.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/ui/mindmapmode/INodeSelector.java
rename to freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/INodeSelector.java
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MMapMouseListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MMapMouseListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MMapMouseListener.java
rename to freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MMapMouseListener.java
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDragListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeDragListener.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDragListener.java
rename to freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeDragListener.java
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeDropListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeDropListener.java
new file mode 100644
index 0000000..212edd6
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeDropListener.java
@@ -0,0 +1,323 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui.mindmapmode;
+
+import java.awt.Component;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.dnd.DropTargetListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+
+import javax.swing.JOptionPane;
+import javax.swing.Timer;
+
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.clipboard.MindMapNodesSelection;
+import org.freeplane.features.clipboard.mindmapmode.MClipboardController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.MouseArea;
+import org.freeplane.view.swing.map.NodeView;
+
+public class MNodeDropListener implements DropTargetListener {
+private static final int UNFOLD_DELAY_MILLISECONDS = 500;
+private Timer timer;
+
+// final private ModeController modeController;
+
+ public MNodeDropListener() {
+ }
+
+ /**
+ * The method is called when the cursor carrying the dragged item enteres
+ * the area of the node. The name "dragEnter" seems to be confusing to me. I
+ * think the difference between dragAcceptable and dropAcceptable is that in
+ * dragAcceptable, you tell if the type of the thing being dragged is OK,
+ * where in dropAcceptable, you tell if your really willing to accept the
+ * item.
+ */
+ public void dragEnter(final DropTargetDragEvent dtde) {
+ supportFolding(dtde);
+ if (isDragAcceptable(dtde)) {
+ dtde.acceptDrag(DnDConstants.ACTION_MOVE);
+ }
+ else {
+ dtde.rejectDrag();
+ }
+ }
+
+ private void supportFolding(final DropTargetDragEvent dtde) {
+ final MainView node = getNode(dtde);
+ if(isInFoldingRegion(dtde)){
+ node.setMouseArea(MouseArea.FOLDING);
+ startUnfoldTimer(node);
+ }
+ else{
+ node.setMouseArea(MouseArea.DEFAULT);
+ stopUnfoldTimer();
+ }
+ }
+
+ private boolean isInFoldingRegion(DropTargetDragEvent dtde) {
+ final MainView node = getNode(dtde);
+ return node.isInFoldingRegion(dtde.getLocation());
+ }
+
+ public void dragExit(final DropTargetEvent e) {
+ getNode(e).setMouseArea(MouseArea.OUT);
+ stopUnfoldTimer();
+ final MainView mainView = getNode(e);
+ mainView.setDraggedOver(NodeView.DRAGGED_OVER_NO);
+ mainView.repaint();
+ }
+
+ private MainView getNode(final DropTargetEvent e) {
+ final Component draggedNode = e.getDropTargetContext().getComponent();
+ final MainView mainView = (MainView) draggedNode;
+ return mainView;
+ }
+
+ public void dragOver(final DropTargetDragEvent dtde) {
+ supportFolding(dtde);
+
+ final MainView draggedNode = (MainView) dtde.getDropTargetContext().getComponent();
+ final int oldDraggedOver = draggedNode.getDraggedOver();
+ draggedNode.setDraggedOver(dtde.getLocation());
+ final int newDraggedOver = draggedNode.getDraggedOver();
+ final boolean repaint = newDraggedOver != oldDraggedOver;
+ if (repaint) {
+ draggedNode.repaint();
+ }
+ }
+
+ private void startUnfoldTimer(final MainView mainView) {
+ if(timer == null){
+ timer = new Timer(UNFOLD_DELAY_MILLISECONDS, new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ if(mainView.isDisplayable()){
+ NodeView nodeView = mainView.getNodeView();
+ final NodeModel node = nodeView.getModel();
+ Controller.getCurrentModeController().getMapController().setFolded(node, !nodeView.isFolded());
+ }
+ }
+ });
+ timer.setRepeats(false);
+ timer.start();
+ }
+ }
+
+ private void stopUnfoldTimer() {
+ if(timer != null){
+ timer.stop();
+ timer = null;
+ }
+
+ }
+
+ public void dragScroll(final DropTargetDragEvent e) {
+ }
+
+ private boolean isDropAcceptable(final DropTargetDropEvent event, int dropAction) {
+ if (dropAction == DnDConstants.ACTION_LINK) {
+ return isFromSameMap(event);
+ }
+
+ if (dropAction == DnDConstants.ACTION_MOVE) {
+ return !isFromDescencantNode(event);
+ }
+ return true;
+ }
+
+ private boolean isFromSameMap(final DropTargetDropEvent event) {
+ final Transferable t = event.getTransferable();
+ final List<NodeModel> transferData;
+ try {
+ transferData = getNodeObjects(t);
+ }
+ catch (Exception e) {
+ return false;
+ }
+ final NodeModel node = ((MainView) event.getDropTargetContext().getComponent()).getNodeView().getModel();
+ for (final NodeModel selected : transferData) {
+ if (selected.getMap() != node.getMap())
+ return false;
+ }
+ return true;
+ }
+
+ private boolean isFromDescencantNode(final DropTargetDropEvent event) {
+ final Transferable t = event.getTransferable();
+ final List<NodeModel> transferData;
+ try {
+ transferData = getNodeObjects(t);
+ }
+ catch (Exception e) {
+ return false;
+ }
+ final NodeModel node = ((MainView) event.getDropTargetContext().getComponent()).getNodeView().getModel();
+ for (final NodeModel selected : transferData) {
+ if ((node == selected) || node.isDescendantOf(selected))
+ return true;
+ }
+ return false;
+
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<NodeModel> getNodeObjects(final Transferable t) throws UnsupportedFlavorException, IOException {
+ return (List<NodeModel>) t.getTransferData(MindMapNodesSelection.mindMapNodeObjectsFlavor);
+ }
+
+ public void drop(final DropTargetDropEvent dtde) {
+ try {
+ final MainView mainView = (MainView) dtde.getDropTargetContext().getComponent();
+ final NodeView targetNodeView = mainView.getNodeView();
+ final MapView mapView = targetNodeView.getMap();
+ mapView.select();
+ final NodeModel targetNode = targetNodeView.getModel();
+ final Controller controller = Controller.getCurrentController();
+ int dropAction = getDropAction(dtde);
+ final Transferable t = dtde.getTransferable();
+ mainView.setDraggedOver(NodeView.DRAGGED_OVER_NO);
+ mainView.repaint();
+ if (dtde.isLocalTransfer() && !isDropAcceptable(dtde, dropAction)) {
+ dtde.rejectDrop();
+ return;
+ }
+ final boolean dropAsSibling = mainView.dropAsSibling(dtde.getLocation().getX());
+ ModeController modeController = controller.getModeController();
+ final MMapController mapController = (MMapController) modeController.getMapController();
+ if ((dropAction == DnDConstants.ACTION_MOVE || dropAction == DnDConstants.ACTION_COPY)) {
+ final NodeModel parent = dropAsSibling ? targetNode.getParentNode() : targetNode;
+ if (!mapController.isWriteable(parent)) {
+ dtde.rejectDrop();
+ final String message = TextUtils.getText("node_is_write_protected");
+ UITools.errorMessage(message);
+ return;
+ }
+ }
+ final boolean isLeft = mainView.dropLeft(dtde.getLocation().getX());
+ if (!dtde.isLocalTransfer()) {
+ dtde.acceptDrop(DnDConstants.ACTION_COPY);
+ ((MClipboardController) ClipboardController.getController()).paste(t, targetNode, dropAsSibling, isLeft, dropAction);
+ dtde.dropComplete(true);
+ return;
+ }
+ dtde.acceptDrop(dropAction);
+ if (dropAction == DnDConstants.ACTION_LINK) {
+ int yesorno = JOptionPane.YES_OPTION;
+ if (controller.getSelection().size() >= 5) {
+ yesorno = JOptionPane.showConfirmDialog(controller.getViewController().getCurrentRootComponent(), TextUtils
+ .getText("lots_of_links_warning"), Integer.toString(controller.getSelection().size())
+ + " links to the same node", JOptionPane.YES_NO_OPTION);
+ }
+ if (yesorno == JOptionPane.YES_OPTION) {
+ for (final NodeModel sourceNodeModel : getNodeObjects(t)) {
+
+ ((MLinkController) LinkController.getController(modeController)).addConnector(
+ sourceNodeModel, targetNode);
+ }
+ }
+ }
+ else {
+ final Collection<NodeModel> selecteds = mapController.getSelectedNodes();
+ if (DnDConstants.ACTION_MOVE == dropAction && isFromSameMap(dtde)) {
+ final NodeModel[] array = selecteds.toArray(new NodeModel[selecteds.size()]);
+ moveNodes(mapController, targetNode, t, dropAsSibling, isLeft);
+
+ if(dropAsSibling || ! targetNodeView.isFolded())
+ controller.getSelection().replaceSelection(array);
+ else
+ controller.getSelection().selectAsTheOnlyOneSelected(targetNode);
+ }
+ else if (DnDConstants.ACTION_COPY == dropAction || DnDConstants.ACTION_MOVE == dropAction) {
+ ((MClipboardController) ClipboardController.getController()).paste(t, targetNode, dropAsSibling,
+ isLeft);
+ controller.getSelection().selectAsTheOnlyOneSelected(targetNode);
+ }
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe("Drop exception:", e);
+ dtde.dropComplete(false);
+ return;
+ }
+ dtde.dropComplete(true);
+ }
+
+ private int getDropAction(final DropTargetDropEvent dtde) throws UnsupportedFlavorException, IOException {
+ int dropAction = dtde.getDropAction();
+ final Transferable t = dtde.getTransferable();
+ if (dtde.isLocalTransfer() && t.isDataFlavorSupported(MindMapNodesSelection.dropActionFlavor)) {
+ final String sourceAction = (String) t.getTransferData(MindMapNodesSelection.dropActionFlavor);
+ if (sourceAction.equals("LINK")) {
+ dropAction = DnDConstants.ACTION_LINK;
+ }
+ if (sourceAction.equals("COPY")) {
+ dropAction = DnDConstants.ACTION_COPY;
+ }
+ }
+ return dropAction;
+ }
+
+ private void moveNodes(final MMapController mapController, final NodeModel targetNode, Transferable t,
+ final boolean dropAsSibling, final boolean isLeft) throws UnsupportedFlavorException,
+ IOException {
+ final List<NodeModel> movedNodes = getNodeObjects(t);
+ if (dropAsSibling) {
+ mapController.moveNodesBefore(movedNodes, targetNode, isLeft, true);
+ }
+ else {
+ mapController.moveNodesAsChildren(movedNodes, targetNode, isLeft, true);
+ }
+ }
+
+ public void dropActionChanged(final DropTargetDragEvent e) {
+ }
+
+ private boolean isDragAcceptable(final DropTargetDragEvent ev) {
+ if (ev.isDataFlavorSupported(DataFlavor.stringFlavor)) {
+ return true;
+ }
+ if (ev.isDataFlavorSupported(MindMapNodesSelection.fileListFlavor)) {
+ return true;
+ }
+ return false;
+ }
+
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeMotionListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeMotionListener.java
new file mode 100644
index 0000000..1d49367
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeMotionListener.java
@@ -0,0 +1,396 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.view.swing.ui.mindmapmode;
+
+import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.EventQueue;
+import java.awt.Point;
+import java.awt.Rectangle;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.util.Collection;
+
+import javax.swing.JScrollPane;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.DoubleClickTimer;
+import org.freeplane.core.ui.IEditHandler.FirstAction;
+import org.freeplane.core.ui.IMouseListener;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.SummaryNode;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.LocationModel;
+import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.MouseArea;
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.ui.DefaultNodeMouseMotionListener;
+
+/**
+ * The MouseMotionListener which belongs to every NodeView
+ */
+public class MNodeMotionListener extends DefaultNodeMouseMotionListener implements IMouseListener {
+ private Point dragStartingPoint = null;
+ private Quantity<LengthUnits> originalHGap;
+ private Quantity<LengthUnits> originalAssignedParentVGap;
+ private Quantity<LengthUnits> minimalDistanceBetweenChildren;
+ private Quantity<LengthUnits> originalShiftY;
+ private static final String EDIT_ON_DOUBLE_CLICK = "edit_on_double_click";
+
+ public MNodeMotionListener() {
+ }
+
+ Point getDragStartingPoint() {
+ return dragStartingPoint;
+ }
+
+ /**
+ */
+ private int getHGapChange(final Point dragNextPoint, final NodeModel node) {
+ final Controller controller = Controller.getCurrentController();
+ final MapView mapView = ((MapView) controller.getMapViewManager().getMapViewComponent());
+ int hGapChange = (int) ((dragNextPoint.x - dragStartingPoint.x) / mapView.getZoom());
+ if (node.isLeft()) {
+ hGapChange = -hGapChange;
+ }
+ return hGapChange;
+ }
+
+ /**
+ */
+ private int getNodeShiftYChange(final Point dragNextPoint, final NodeModel node) {
+ final Controller controller = Controller.getCurrentController();
+ final MapView mapView = ((MapView) controller.getMapViewManager().getMapViewComponent());
+ final int shiftYChange = (int) ((dragNextPoint.y - dragStartingPoint.y) / mapView.getZoom());
+ return shiftYChange;
+ }
+
+ /**
+ */
+ private NodeView getNodeView(final MouseEvent e) {
+ return ((MainView) e.getSource()).getNodeView();
+ }
+
+ /**
+ */
+ private int getVGapChange(final Point dragNextPoint, final NodeModel node) {
+ final Controller controller = Controller.getCurrentController();
+ final MapView mapView = ((MapView) controller.getMapViewManager().getMapViewComponent());
+ final int vGapChange = (int) ((dragNextPoint.y - dragStartingPoint.y) / mapView.getZoom());
+ return vGapChange;
+ }
+
+ public boolean isDragActive() {
+ return dragStartingPoint != null;
+ }
+
+ @Override
+ public void mouseClicked(final MouseEvent e) {
+ boolean shoudResetPosition = e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2
+ && doubleClickTimer.getDelay() > 0;
+ if (shoudResetPosition) {
+ final MainView mainView = (MainView) e.getComponent();
+ if (mainView.getMouseArea().equals(MouseArea.MOTION)) {
+ final Controller controller = Controller.getCurrentController();
+ MLocationController locationController = (MLocationController) LocationController
+ .getController(controller.getModeController());
+ if (e.getModifiersEx() == 0) {
+ final NodeView nodeV = getNodeView(e);
+ final NodeModel node = nodeV.getModel();
+ locationController.moveNodePosition(node, LocationModel.DEFAULT_HGAP, LocationModel.DEFAULT_SHIFT_Y);
+ return;
+ }
+ if (Compat.isCtrlEvent(e)) {
+ final NodeView nodeV = getNodeView(e);
+ NodeModel childDistanceContainer = nodeV.getParentView().getChildDistanceContainer().getModel();
+ locationController.setMinimalDistanceBetweenChildren(childDistanceContainer, LocationModel.DEFAULT_VGAP);
+ return;
+ }
+ }
+ else {
+ if (Compat.isPlainEvent(e) && !isInFoldingRegion(e)) {
+ final MTextController textController = MTextController.getController();
+ textController.getEventQueue().activate(e);
+ textController.edit(FirstAction.EDIT_CURRENT, false);
+ }
+ }
+ }
+ super.mouseClicked(e);
+ }
+
+ @Override
+ public void mouseMoved(final MouseEvent e) {
+ if (isDragActive())
+ return;
+ final MainView v = (MainView) e.getSource();
+ if (v.isInDragRegion(e.getPoint())) {
+ v.setMouseArea(MouseArea.MOTION);
+ v.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+ return;
+ }
+ super.mouseMoved(e);
+ }
+
+ @Override
+ public void mouseExited(MouseEvent e) {
+ if (!isDragActive())
+ super.mouseExited(e);
+ }
+
+ @Override
+ public void mousePressed(MouseEvent e) {
+ final MapView mapView = MapView.getMapView(e.getComponent());
+ mapView.select();
+ doubleClickTimer.cancel();
+ setClickDelay();
+ if (isInDragRegion(e)) {
+ if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == (InputEvent.BUTTON1_DOWN_MASK)) {
+ nodeSelector.stopTimerForDelayedSelection();
+ final NodeView nodeV = getNodeView(e);
+ final Point point = e.getPoint();
+ UITools.convertPointToAncestor(nodeV, point, JScrollPane.class);
+ findGridPoint(point);
+ final NodeModel node = nodeV.getModel();
+ dragStartingPoint = point;
+ originalAssignedParentVGap = LocationModel.getModel(node.getParentNode()).getVGap();
+ NodeModel childDistanceContainer = nodeV.getParentView().getChildDistanceContainer().getModel();
+ minimalDistanceBetweenChildren = mapView.getModeController().getExtension(LocationController.class).getMinimalDistanceBetweenChildren(childDistanceContainer);
+ originalHGap = LocationModel.getModel(node).getHGap();
+ originalShiftY = LocationModel.getModel(node).getShiftY();
+ }
+ }
+ else
+ super.mousePressed(e);
+ }
+
+ @Override
+ public void mouseDragged(final MouseEvent e) {
+ if (!isDragActive())
+ return;
+ if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == (InputEvent.BUTTON1_DOWN_MASK)) {
+ final MainView mainView = (MainView) e.getSource();
+ final NodeView nodeV = getNodeView(e);
+ final MapView mapView = nodeV.getMap();
+ final Point point = e.getPoint();
+ UITools.convertPointToAncestor(nodeV, point, JScrollPane.class);
+ findGridPoint(point);
+ ModeController c = Controller.getCurrentController().getModeController();
+ final Point dragNextPoint = point;
+ boolean shouldMoveSingleNode = !Compat.isCtrlEvent(e);
+ if (shouldMoveSingleNode) {
+ final NodeModel node = nodeV.getModel();
+ final LocationModel locationModel = LocationModel.createLocationModel(node);
+ final int hGapChange = getHGapChange(dragNextPoint, node);
+ if(hGapChange != 0){
+ locationModel.setHGap(originalHGap.add(hGapChange, LengthUnits.px));
+ }
+ final int shiftYChange = getNodeShiftYChange(dragNextPoint, node);
+ if(shiftYChange != 0){
+ locationModel.setShiftY(originalShiftY.add(shiftYChange, LengthUnits.px));
+ }
+ if(hGapChange != 0 || shiftYChange != 0)
+ c.getMapController().nodeRefresh(node);
+ else
+ return;
+ }
+ else {
+ final NodeModel childDistanceContainer = nodeV.getParentView().getChildDistanceContainer().getModel();
+ final int vGapChange = getVGapChange(dragNextPoint, childDistanceContainer);
+ int newVGap = Math.max(0, minimalDistanceBetweenChildren.toBaseUnitsRounded() - vGapChange);
+ LocationModel locationModel = LocationModel.createLocationModel(childDistanceContainer);
+ if(locationModel.getVGap().toBaseUnitsRounded() == newVGap)
+ return;
+ locationModel.setVGap(new Quantity<LengthUnits>(newVGap, LengthUnits.px).in(LengthUnits.pt));
+ final MapController mapController = c.getMapController();
+ mapController.nodeRefresh(childDistanceContainer);
+ mapController.nodeRefresh(nodeV.getModel());
+ }
+ EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ final Rectangle r = mainView.getBounds();
+ UITools.convertRectangleToAncestor(mainView.getParent(), r, mapView);
+ final boolean isEventPointVisible = mapView.getVisibleRect().contains(r);
+ if (!isEventPointVisible) {
+ mapView.scrollRectToVisible(r);
+ }
+ }
+ });
+ }
+ }
+
+ private void findGridPoint(Point point) {
+ final int gridSize = ResourceController.getResourceController().getLengthProperty("grid_size");
+ if (gridSize <= 2) {
+ return;
+ }
+ point.x -= point.x % gridSize;
+ point.y -= point.y % gridSize;
+ }
+
+ @Override
+ public void mouseReleased(final MouseEvent e) {
+ final MainView v = (MainView) e.getSource();
+ if (!v.contains(e.getX(), e.getY())) {
+ v.setMouseArea(MouseArea.OUT);
+ }
+ if (!isDragActive()) {
+ super.mouseReleased(e);
+ return;
+ }
+ final NodeView nodeV = getNodeView(e);
+ final NodeModel node = nodeV.getModel();
+ final ModeController modeController = nodeV.getMap().getModeController();
+ final Controller controller = modeController.getController();
+ MLocationController locationController = (MLocationController) LocationController.getController(controller
+ .getModeController());
+ NodeModel childDistanceContainer = nodeV.getParentView().getChildDistanceContainer().getModel();
+ final Quantity<LengthUnits> parentVGap = locationController.getMinimalDistanceBetweenChildren(childDistanceContainer);
+ Quantity<LengthUnits> hgap = LocationModel.getModel(node).getHGap();
+ final Quantity<LengthUnits> shiftY = LocationModel.getModel(node).getShiftY();
+ adjustNodeIndices(nodeV);
+ resetPositions(node);
+ final Quantity<LengthUnits> hGap = hgap;
+ locationController.moveNodePosition(node, hGap, shiftY);
+ locationController.setMinimalDistanceBetweenChildren(childDistanceContainer, parentVGap);
+ stopDrag();
+ }
+
+ private void adjustNodeIndices(final NodeView nodeV) {
+ NodeModel[] selectedsBackup = null;
+ final NodeModel node = nodeV.getModel();
+ if (FreeNode.isFreeNode(node)) {
+ selectedsBackup = adjustNodeIndexBackupSelection(nodeV, selectedsBackup);
+ }
+ else {
+ final MapView map = nodeV.getMap();
+ final NodeModel[] siblingNodes = node.getParentNode().getChildren().toArray(new NodeModel[] {});
+ for (NodeModel sibling : siblingNodes) {
+ if (FreeNode.isFreeNode(sibling)) {
+ final NodeView siblingV = map.getNodeView(sibling);
+ selectedsBackup = adjustNodeIndexBackupSelection(siblingV, selectedsBackup);
+ }
+ }
+ }
+ if (selectedsBackup != null) {
+ final ModeController modeController = nodeV.getMap().getModeController();
+ final Controller controller = modeController.getController();
+ controller.getSelection().replaceSelection(selectedsBackup);
+ }
+ }
+
+ private NodeModel[] adjustNodeIndexBackupSelection(final NodeView nodeV, NodeModel[] selectedsBackup) {
+ final NodeModel node = nodeV.getModel();
+ boolean isLeft = nodeV.isLeft();
+ final int newIndex = calculateNewNodeIndex(nodeV, isLeft, 0, node.getParentNode().getChildCount());
+ if (newIndex != -1) {
+ final ModeController modeController = nodeV.getMap().getModeController();
+ MMapController mapController = (MMapController) modeController.getMapController();
+ if (selectedsBackup == null) {
+ final Collection<NodeModel> selecteds = mapController.getSelectedNodes();
+ selectedsBackup = selecteds.toArray(new NodeModel[selecteds.size()]);
+ }
+ mapController.moveNode(node, newIndex);
+ }
+ return selectedsBackup;
+ }
+
+ public int getRefX(final NodeView node) {
+ return node.getContent().getX() + node.getContent().getWidth() / 2;
+ }
+
+ private int calculateNewNodeIndex(final NodeView nodeV, final boolean left, final int start, final int end) {
+ final NodeModel node = nodeV.getModel();
+ if (SummaryNode.isSummaryNode(node))
+ return -1;
+ final int nodeY = getRefY(nodeV);
+ final NodeView parent = nodeV.getParentView();
+ int newIndex = 0;
+ int oldIndex = -1;
+ int wrondSideCount = 0;
+ for (int i = start; i < end; i++) {
+ final Component component = parent.getComponent(i);
+ if (!(component instanceof NodeView))
+ continue;
+ NodeView sibling = (NodeView) component;
+ if (sibling.isLeft() == left && !SummaryNode.isSummaryNode(sibling.getModel()) && getRefY(sibling) > nodeY)
+ break;
+ else {
+ if (sibling != nodeV) {
+ newIndex++;
+ if (sibling.isLeft() != left)
+ wrondSideCount++;
+ else
+ wrondSideCount = 0;
+ }
+ else {
+ oldIndex = i;
+ }
+ }
+ }
+ final int result = newIndex - wrondSideCount;
+ if (result == oldIndex)
+ return -1;
+ return result;
+ }
+
+ private int getRefY(NodeView sibling) {
+ return sibling.getY() + sibling.getContent().getY();
+ }
+
+ /**
+ */
+ private void resetPositions(final NodeModel node) {
+ final LocationModel locationModel = LocationModel.getModel(node.getParentNode());
+ locationModel.setVGap(originalAssignedParentVGap);
+ LocationModel.getModel(node).setHGap(originalHGap);
+ LocationModel.getModel(node).setShiftY(originalShiftY);
+ }
+
+ private void resetDragStartingPoint() {
+ dragStartingPoint = null;
+ minimalDistanceBetweenChildren = originalAssignedParentVGap = LocationModel.DEFAULT_VGAP;
+ originalHGap = LocationModel.DEFAULT_HGAP;
+ originalShiftY = LocationModel.DEFAULT_SHIFT_Y;
+ }
+
+ private void stopDrag() {
+ resetDragStartingPoint();
+ }
+
+ private void setClickDelay() {
+ if (ResourceController.getResourceController().getBooleanProperty(EDIT_ON_DOUBLE_CLICK))
+ doubleClickTimer.setDelay(DoubleClickTimer.MAX_TIME_BETWEEN_CLICKS);
+ else {
+ doubleClickTimer.setDelay(0);
+ }
+ }
+}
diff --git a/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeMouseWheelListener.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeMouseWheelListener.java
new file mode 100644
index 0000000..6ccd4d3
--- /dev/null
+++ b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/MNodeMouseWheelListener.java
@@ -0,0 +1,57 @@
+package org.freeplane.view.swing.ui.mindmapmode;
+
+import java.awt.event.MouseWheelEvent;
+import java.awt.event.MouseWheelListener;
+
+import javax.swing.SwingUtilities;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.view.swing.map.MainView;
+import org.freeplane.view.swing.map.MapView;
+import org.freeplane.view.swing.map.NodeView;
+import org.freeplane.view.swing.ui.DefaultNodeMouseWheelListener;
+
+public class MNodeMouseWheelListener extends DefaultNodeMouseWheelListener {
+
+ public MNodeMouseWheelListener(MouseWheelListener mapMouseWheelListener) {
+ super(mapMouseWheelListener);
+ }
+
+ @Override
+ public void mouseWheelMoved(MouseWheelEvent e) {
+ if(! e.isAltDown()){
+ super.mouseWheelMoved(e);
+ return;
+ }
+ final MainView view = (MainView) e.getComponent();
+ final MapView map = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, view);
+ final int wheelRotation = e.getWheelRotation();
+ final NodeView nodeView = view.getNodeView();
+ if(! nodeView.isSelected())
+ map.selectAsTheOnlyOneSelected(nodeView);
+
+ final double factor = e.isControlDown() ? 1 : 6 * LengthUnits.pt.factor();
+ double newZoomedWidth = (view.getWidth() - wheelRotation * factor) / map.getZoom();
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ Quantity<LengthUnits> newZoomedWidthQuantity = LengthUnits.pixelsInPt(newZoomedWidth);
+ final ModeController modeController = map.getModeController();
+ final MNodeStyleController styleController = (MNodeStyleController) modeController.getExtension(NodeStyleController.class);
+
+ selection.keepNodePosition(nodeView.getModel(), 0f, 0f);
+
+ for (final NodeModel node: selection.getSelection()) {
+ styleController.setMinNodeWidth(node, newZoomedWidthQuantity);
+ styleController.setMaxNodeWidth(node, newZoomedWidthQuantity);
+ }
+ }
+
+
+
+}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/NodeSelector.java b/freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/NodeSelector.java
similarity index 100%
rename from freeplane/src/org/freeplane/view/swing/ui/mindmapmode/NodeSelector.java
rename to freeplane/src/main/java/org/freeplane/view/swing/ui/mindmapmode/NodeSelector.java
diff --git a/freeplane/src/org/freeplane/core/io/WriteManager.java b/freeplane/src/org/freeplane/core/io/WriteManager.java
deleted file mode 100644
index 35d2be1..0000000
--- a/freeplane/src/org/freeplane/core/io/WriteManager.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.io;
-
-import org.freeplane.core.extension.IExtension;
-
-public class WriteManager {
- final private ListHashTable<String, IAttributeWriter> attributeWriters = new ListHashTable<String, IAttributeWriter>();
- final private ListHashTable<String, IElementWriter> elementWriters = new ListHashTable<String, IElementWriter>();
- final private ListHashTable<Class<? extends IExtension>, IExtensionAttributeWriter> extensionAttributeWriters = new ListHashTable<Class<? extends IExtension>, IExtensionAttributeWriter>();;
- final private ListHashTable<Class<? extends IExtension>, IExtensionElementWriter> extensionElementWriters = new ListHashTable<Class<? extends IExtension>, IExtensionElementWriter>();
-
- /*
- * (non-Javadoc)
- * @see freeplane.persistence.Writer#addAttributeSaver(java.lang.String,
- * freeplane.persistence.AttributeSaver)
- */
- /*
- * (non-Javadoc)
- * @see
- * freeplane.persistence.ISaverManager#addAttributeSaver(java.lang.String,
- * freeplane.persistence.AttributeSaver)
- */
- public void addAttributeWriter(final String parentTag, final IAttributeWriter aw) {
- attributeWriters.add(parentTag, aw);
- }
-
- public void addElementWriter(final String parentTag, final IElementWriter nw) {
- elementWriters.add(parentTag, nw);
- }
-
- public void addExtensionAttributeWriter(final Class<? extends IExtension> clazz, final IExtensionAttributeWriter aw) {
- extensionAttributeWriters.add(clazz, aw);
- }
-
- public void addExtensionElementWriter(final Class<? extends IExtension> clazz, final IExtensionElementWriter nw) {
- extensionElementWriters.add(clazz, nw);
- }
-
- public ListHashTable<String, IAttributeWriter> getAttributeWriters() {
- return attributeWriters;
- }
-
- public ListHashTable<String, IElementWriter> getElementWriters() {
- return elementWriters;
- }
-
- public ListHashTable<Class<? extends IExtension>, IExtensionAttributeWriter> getExtensionAttributeWriters() {
- return extensionAttributeWriters;
- }
-
- public ListHashTable<Class<? extends IExtension>, IExtensionElementWriter> getExtensionElementWriters() {
- return extensionElementWriters;
- }
-
- public void removeAttributeWriter(final String parentTag, final IAttributeWriter aw) {
- final boolean removed = attributeWriters.remove(parentTag, aw);
- assert removed;
- }
-
- public void removeElementWriter(final String parentTag, final IElementWriter nw) {
- final boolean removed = elementWriters.remove(parentTag, nw);
- assert removed;
- }
-
- public void removeExtensionAttributeWriter(final Class<? extends IExtension> clazz,
- final IExtensionAttributeWriter aw) {
- final boolean removed = extensionAttributeWriters.remove(clazz, aw);
- assert removed;
- }
-
- public void removeExtensionNodeWriter(final Class<? extends IExtension> clazz, final IExtensionElementWriter nw) {
- final boolean removed = extensionElementWriters.remove(clazz, nw);
- assert removed;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/io/xml/TreeXmlReader.java b/freeplane/src/org/freeplane/core/io/xml/TreeXmlReader.java
deleted file mode 100644
index 1a27302..0000000
--- a/freeplane/src/org/freeplane/core/io/xml/TreeXmlReader.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.io.xml;
-
-import java.awt.Point;
-import java.io.Reader;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IElementContentHandler;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IElementHandler;
-import org.freeplane.core.io.ListHashTable;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.n3.nanoxml.IXMLBuilder;
-import org.freeplane.n3.nanoxml.IXMLReader;
-import org.freeplane.n3.nanoxml.NonValidator;
-import org.freeplane.n3.nanoxml.StdXMLReader;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.n3.nanoxml.XMLException;
-
-public class TreeXmlReader implements IXMLBuilder {
- public static boolean xmlToBoolean(final String string) {
- if (string == null) {
- return false;
- }
- if (string.equals("true")) {
- return true;
- }
- return false;
- }
-
- /**
- * Extracts a long from xml. Only useful for dates.
- */
- public static Date xmlToDate(final String xmlString) {
- try {
- return new Date(Long.valueOf(xmlString).longValue());
- }
- catch (final Exception e) {
- return new Date(System.currentTimeMillis());
- }
- }
-
- public static Point xmlToPoint(String string) {
- if (string == null) {
- return null;
- }
- if (string.startsWith("java.awt.Point")) {
- string = string.replaceAll("java\\.awt\\.Point\\[x=(-?[0-9]+),y=(-?[0-9]+)\\]", "$1;$2");
- }
- final StringTokenizer tok = new StringTokenizer(string, ";");
- if (tok.countTokens() != 2) {
- throw new IllegalArgumentException("A point must consist of two numbers (and not: '" + string + "').");
- }
- final int x = Integer.parseInt(tok.nextToken());
- final int y = Integer.parseInt(tok.nextToken());
- return new Point(x, y);
- }
-
- private Hashtable<String, IAttributeHandler> attributeHandlersForTag;
- private Object currentElement;
- private String elementContentAsString;
- final private LinkedList<Object> elementStack = new LinkedList<Object>();
- private IElementHandler nodeCreator;
- final private LinkedList<IElementHandler> nodeCreatorStack = new LinkedList<IElementHandler>();
- private Object parentElement;
- final private ReadManager parseManager;
- private XMLParser parser;
- private XMLElement saveAsXmlUntil;
- private String tag;
- private StdXMLBuilder xmlBuilder;
-
- public TreeXmlReader(final ReadManager parseManager) {
- super();
- this.parseManager = parseManager;
- }
-
- private boolean addAttribute(final String key, final String value) {
- if (saveAsXmlUntil == null && attributeHandlersForTag != null) {
- final IAttributeHandler attributeHandler = attributeHandlersForTag.get(key);
- if (attributeHandler != null) {
- attributeHandler.setAttribute(currentElement, value);
- return true;
- }
- }
- return false;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#addAttribute(java.lang
- * .String, java.lang.String, java.lang.String, java.lang.String,
- * java.lang.String)
- */
- public void addAttribute(final String key, final String nsPrefix, final String nsURI, final String value,
- final String type) throws Exception {
- if (!addAttribute(key, value)) {
- xmlBuilder.addAttribute(key, nsPrefix, nsURI, value, type);
- }
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#addPCData(java.io.Reader
- * , java.lang.String, int)
- */
- public void addPCData(final Reader reader, final String systemID, final int lineNr) throws Exception {
- xmlBuilder.addPCData(reader, systemID, lineNr);
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#elementAttributesProcessed
- * (java.lang.String, java.lang.String, java.lang.String)
- */
- public void elementAttributesProcessed(final String name, final String nsPrefix, final String nsURI)
- throws Exception {
- xmlBuilder.elementAttributesProcessed(name, nsPrefix, nsURI);
- if (saveAsXmlUntil != null || nodeCreator != null) {
- return;
- }
- final Iterator<IElementHandler> iterator = getElementHandlers().iterator(tag);
- final XMLElement lastBuiltElement = xmlBuilder.getLastBuiltElement();
- while (iterator.hasNext() && currentElement == null) {
- nodeCreator = iterator.next();
- currentElement = nodeCreator.createElement(parentElement, name, lastBuiltElement);
- }
- if (currentElement != null) {
- if (nodeCreator instanceof IElementContentHandler) {
- parser.notParseNextElementContent();
- }
- attributeHandlersForTag = getAttributeLoaders().get(tag);
- if (attributeHandlersForTag == null) {
- return;
- }
- final Enumeration<String> attributeNames = lastBuiltElement.enumerateAttributeNames();
- while (attributeNames.hasMoreElements()) {
- final String atName = (String) attributeNames.nextElement();
- if (addAttribute(atName, lastBuiltElement.getAttribute(atName, null))) {
- lastBuiltElement.removeAttribute(atName);
- }
- }
- }
- else {
- currentElement = null;
- nodeCreator = null;
- saveAsXmlUntil = lastBuiltElement;
- }
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#endElement(java.lang
- * .String, java.lang.String, java.lang.String)
- */
- public void endElement(final String name, final String nsPrefix, final String nsURI) throws Exception {
- final XMLElement lastBuiltElement = xmlBuilder.getParentElement();
- xmlBuilder.endElement(name, nsPrefix, nsURI);
- if (saveAsXmlUntil == lastBuiltElement) {
- saveAsXmlUntil = null;
- }
- if (saveAsXmlUntil != null) {
- return;
- }
- tag = null;
- if (0 == elementStack.size()) {
- return;
- }
- final Object element = currentElement;
- currentElement = elementStack.removeLast();
- if (nodeCreator instanceof IElementContentHandler) {
- ((IElementContentHandler) nodeCreator).endElement(currentElement, name, element, lastBuiltElement,
- elementContentAsString);
- }
- else if (nodeCreator instanceof IElementDOMHandler) {
- ((IElementDOMHandler) nodeCreator).endElement(currentElement, name, element, lastBuiltElement);
- }
- final XMLElement top = lastBuiltElement.getParent();
- if (nodeCreator != null && top != null && top.hasChildren()) {
- final int lastChildIndex = top.getChildrenCount() - 1;
- top.removeChildAtIndex(lastChildIndex);
- }
- nodeCreator = (IElementHandler) nodeCreatorStack.removeLast();
- elementContentAsString = null;
- }
-
- private Hashtable<String, Hashtable<String, IAttributeHandler>> getAttributeLoaders() {
- return parseManager.getAttributeHandlers();
- }
-
- private ListHashTable<String, IElementHandler> getElementHandlers() {
- return parseManager.getElementHandlers();
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#getResult()
- */
- public Object getResult() throws Exception {
- return null;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.persistence.Reader#load()
- */
- public void load(final Reader reader) throws XMLException {
- parser = new XMLParser();
- final IXMLReader nanoxmlReader = new StdXMLReader(reader);
- parser.setReader(nanoxmlReader);
- parser.setBuilder(this);
- parser.setValidator(new NonValidator());
- parser.parse();
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#newProcessingInstruction
- * (java.lang.String, java.io.Reader)
- */
- public void newProcessingInstruction(final String target, final Reader reader) throws Exception {
- xmlBuilder.newProcessingInstruction(target, reader);
- }
-
- private void pushParentObjects() {
- elementStack.addLast(currentElement);
- nodeCreatorStack.addLast(nodeCreator);
- }
-
- /**
- */
- public void setElementContent(final String content) {
- elementContentAsString = content;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#startBuilding(java.lang
- * .String, int)
- */
- public void startBuilding(final String systemID, final int lineNr) throws Exception {
- xmlBuilder = new StdXMLBuilder();
- xmlBuilder.startBuilding(systemID, lineNr);
- saveAsXmlUntil = null;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.persistence.xml.n3.nanoxml.IXMLBuilder#startElement(java.lang
- * .String, java.lang.String, java.lang.String, java.lang.String, int)
- */
- public void startElement(final String name, final String nsPrefix, final String nsURI, final String systemID,
- final int lineNr) throws Exception {
- if (saveAsXmlUntil != null) {
- xmlBuilder.startElement(name, nsPrefix, nsURI, systemID, lineNr);
- return;
- }
- xmlBuilder.startElement(name, nsPrefix, nsURI, systemID, lineNr);
- tag = name;
- pushParentObjects();
- parentElement = currentElement;
- currentElement = null;
- final List<IElementHandler> handlers = getElementHandlers().list(tag);
- if (handlers != null && handlers.size() == 1) {
- nodeCreator = handlers.get(0);
- currentElement = nodeCreator.createElement(parentElement, tag, null);
- }
- if (currentElement != null) {
- attributeHandlersForTag = getAttributeLoaders().get(tag);
- if (nodeCreator instanceof IElementContentHandler) {
- parser.notParseNextElementContent();
- }
- }
- else {
- attributeHandlersForTag = null;
- currentElement = null;
- nodeCreator = null;
- }
- }
-
- public void load(Object currentElement, Reader pReader) throws XMLException {
- this.currentElement = currentElement;
- load(pReader);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/NamedObject.java b/freeplane/src/org/freeplane/core/resources/NamedObject.java
deleted file mode 100644
index 5a42676..0000000
--- a/freeplane/src/org/freeplane/core/resources/NamedObject.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources;
-
-import java.awt.Component;
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.Icon;
-import javax.swing.JList;
-import javax.swing.ListCellRenderer;
-
-import org.freeplane.core.util.TextUtils;
-
-/**
- * Utility Class for displaying local object names in GUI components.
- *
- * @author Dimitry Polivaev
- */
-public class NamedObject {
- static public NamedObject literal(final String literal) {
- final NamedObject result = new NamedObject();
- result.object = literal;
- result.name = literal;
- return result;
- }
-
- private String name;
- private Object object;
- private Icon icon;
- private static ListCellRenderer listCellRenderer;
-
- private NamedObject() {
- }
-
- public NamedObject(final Object object, final String name) {
- this.object = object;
- this.name = name;
- }
-
- public NamedObject(final String object) {
- this.object = object;
- name = TextUtils.getText(object);
- }
-
- public Object getObject() {
- return object;
- }
-
- public boolean objectEquals(final Object o) {
- return getObject().equals(o);
- }
-
- @Override
- public String toString() {
- return name;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof NamedObject)) {
- return false;
- }
- final NamedObject nobj = (NamedObject) obj;
- return object.equals(nobj.object) && name.equals(nobj.name);
- }
-
- @Override
- public int hashCode() {
- return 37 * object.hashCode() + name.hashCode();
- }
-
- static public String toKeyString(final Object obj) {
- if (obj instanceof NamedObject) {
- return ((NamedObject) obj).getObject().toString();
- }
- return obj.toString();
- }
-
- public static NamedObject format(final String value) {
- final int separatorPos = value.indexOf(',');
- if (separatorPos == -1) {
- return new NamedObject(value);
- }
- final String key = value.substring(0, separatorPos);
- final String s1 = value.substring(separatorPos + 1);
- final String text = TextUtils.format(key, s1);
- return new NamedObject(value, text);
- }
-
- public Icon getIcon() {
- return icon;
- }
-
- public void setIcon(Icon icon) {
- this.icon = icon;
- }
-
- public static ListCellRenderer getIconRenderer() {
- if(listCellRenderer == null)
- listCellRenderer = new ListCellRenderer() {
- private ListCellRenderer delegate = new DefaultListCellRenderer();
- public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
- boolean cellHasFocus) {
- final Object renderedValue;
- if(value instanceof NamedObject){
- final Icon icon = ((NamedObject)value).getIcon();
- if(icon != null)
- renderedValue = icon;
- else
- renderedValue = value;
- }
- else
- renderedValue = value;
- return delegate.getListCellRendererComponent(list, renderedValue, index, isSelected, cellHasFocus);
- }
- };
- return listCellRenderer;
- }
-
- public static NamedObject[] fromEnum(Class<? extends Enum<?>> enumeration) {
- return fromEnum(enumeration.getSimpleName() + "." , enumeration);
- }
- public static NamedObject[] fromEnum(final String prefix, Class<? extends Enum<?>> enumeration) {
- final Enum<?>[] enumConstants=enumeration.getEnumConstants();
- NamedObject[] objs = new NamedObject[enumConstants.length];
- int i = 0;
- for(Enum<?> value : enumConstants){
- objs[i++] = new NamedObject(value, TextUtils.getText(prefix + value.toString()));
- }
- return objs;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/ResourceController.java b/freeplane/src/org/freeplane/core/resources/ResourceController.java
deleted file mode 100644
index 5ddbf99..0000000
--- a/freeplane/src/org/freeplane/core/resources/ResourceController.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources;
-
-import java.io.BufferedInputStream;
-import java.io.InputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.ResourceBundle;
-import java.util.Vector;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.AController.IActionOnChange;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- */
-public abstract class ResourceController {
- public static final String FREEPLANE_PROPERTIES = "/freeplane.properties";
- public static final String LOCAL_PROPERTIES = "LocalProperties.";
- public static final String RESOURCE_DRAW_RECTANGLE_FOR_SELECTION = "standarddrawrectangleforselection";
- // some plugins have their own file for registration of defaults
- public static final String PLUGIN_DEFAULTS_RESOURCE = "defaults.properties";
-
- static public ResourceController getResourceController() {
- return Controller.getCurrentController().getResourceController();
- }
-
- final private List<IFreeplanePropertyListener> propertyChangeListeners = new Vector<IFreeplanePropertyListener>();
- private ResourceBundles resources;
- public static final String FREEPLANE_RESOURCE_URL_PROTOCOL = "freeplaneresource";
- public static final String OBJECT_TYPE = "ObjectType";
- public ResourceController() {
- super();
- }
-
- public void addLanguageResources(final String language, final URL url) {
- resources.addResources(language, url);
- }
-
- public void addLanguageResources(final String language, final Map<String, String> resources) {
- this.resources.addResources(language, resources);
- }
-
- public void addPropertyChangeListener(final IFreeplanePropertyListener listener) {
- propertyChangeListeners.add(listener);
- }
-
- /**
- * @param listener
- * The new listener. All currently available properties are sent
- * to the listener after registration. Here, the oldValue
- * parameter is set to null.
- */
- public void addPropertyChangeListenerAndPropagate(final IFreeplanePropertyListener listener) {
- addPropertyChangeListener(listener);
- for (final Entry<Object, Object> entry : getProperties().entrySet()) {
- final String key = (String) entry.getKey();
- listener.propertyChanged(key, (String) entry.getValue(), null);
- }
- }
-
- protected void loadAnotherLanguage() {
- resources.loadAnotherLanguage();
- }
-
- public void firePropertyChanged(final String property, final String value, final String oldValue) {
- if (oldValue == null || !oldValue.equals(value)) {
- setProperty(property, value);
- for (final IFreeplanePropertyListener listener : getPropertyChangeListeners()) {
- listener.propertyChanged(property, value, oldValue);
- }
- }
- }
-
- public boolean getBooleanProperty(final String key) {
- return Boolean.parseBoolean(getProperty(key));
- }
-
- @SuppressWarnings("unchecked")
- public <T extends Enum<T>> T getEnumProperty(String propertyName, Enum<T> defaultValue) {
- try{
- final String cacheProptertyValue = getProperty(propertyName).toUpperCase();
- defaultValue = Enum.valueOf(defaultValue.getClass(), cacheProptertyValue);
- }
- catch (Exception e) {
- LogUtils.severe(e);
- }
- return (T)defaultValue;
- }
-
-
- /**
- * @param resourcesNodeTextColor
- * @return
- */
- public String getDefaultProperty(final String key) {
- return null;
- }
-
- /** register defaults in freeplane.properties respectively defaults.properties instead! */
- public double getDoubleProperty(final String key, final double defaultValue) {
- try {
- return Double.parseDouble(ResourceController.getResourceController().getProperty(key));
- }
- catch (final Exception e) {
- return defaultValue;
- }
- }
-
- /**
- * @return
- */
- abstract public String getFreeplaneUserDirectory();
-
- /** register defaults in freeplane.properties respectively defaults.properties instead! */
- public int getIntProperty(final String key, final int defaultValue) {
- try {
- return Integer.parseInt(getProperty(key));
- }
- catch (final NumberFormatException nfe) {
- return defaultValue;
- }
- }
-
-
- public int getIntProperty(String key) {
- return Integer.parseInt(getProperty(key));
- }
-
- public double getDoubleProperty(String key) {
- return Double.parseDouble(getProperty(key));
- }
-
- /** register defaults in freeplane.properties respectively defaults.properties instead. */
- public long getLongProperty(final String key, final int defaultValue) {
- try {
- return Long.parseLong(getProperty(key));
- }
- catch (final NumberFormatException nfe) {
- return defaultValue;
- }
- }
-
- abstract public Properties getProperties();
-
- abstract public String getProperty(final String key);
-
- /** register defaults in freeplane.properties respectively defaults.properties instead! */
- public String getProperty(final String key, final String value) {
- return getProperties().getProperty(key, value);
- }
-
- public Collection<IFreeplanePropertyListener> getPropertyChangeListeners() {
- return Collections.unmodifiableCollection(propertyChangeListeners);
- }
-
- public URL getResource(final String name) {
- return getClass().getResource(name);
- }
-
- public InputStream getResourceStream(final String resFileName) throws IOException {
- final URL resUrl = getResource(resFileName);
- if (resUrl == null) {
- LogUtils.severe("Can't find " + resFileName + " as resource.");
- throw new IllegalArgumentException("Can't find " + resFileName + " as resource.");
- }
- return new BufferedInputStream(resUrl.openStream());
- }
-
- public String getResourceBaseDir() {
- return "";
- }
-
- public String getInstallationBaseDir() {
- return "";
- }
-
- /** Returns the ResourceBundle with the current language */
- public ResourceBundle getResources() {
- if (resources == null) {
- resources = new ResourceBundles(this);
- }
- return resources;
- }
-
- public String getLanguageCode() {
- return resources.getLanguageCode();
- }
-
- public String getDefaultLanguageCode() {
- return resources.getDefaultLanguageCode();
- }
-
- public String getText(final String key, final String resource) {
- return ((ResourceBundles) getResources()).getResourceString(key, resource);
- }
-
- protected void init() {
- }
-
- public void removePropertyChangeListener(final IFreeplanePropertyListener listener) {
- propertyChangeListeners.remove(listener);
- }
-
- abstract public void saveProperties();
-
- abstract public void setDefaultProperty(final String key, final String value);
-
- public void setProperty(final String property, final boolean value) {
- setProperty(property, Boolean.toString(value));
- }
-
- abstract public void setProperty(final String property, final String value);
-
- /** adds properties from url to properties. Existing properties in resultProps will be overridden.
- * @return false if anything went wrong. */
- protected static boolean loadProperties(Properties resultProps, final URL url) {
- InputStream in = null;
- try {
- in = new BufferedInputStream(url.openStream());
- resultProps.load(in);
- System.out.println("Loaded properties from " + url);
- return true;
- }
- catch (final Exception ex) {
- System.err.println("Could not load properties from " + url);
- }
- finally {
- FileUtils.silentlyClose(in);
- }
- return false;
- }
-
- /** will add properties from propertiesUrl if they don't exist yet. */
- public void addDefaults(URL propertiesUrl) {
- Properties props = new Properties();
- loadProperties(props, propertiesUrl);
- addDefaults(props);
- }
-
- /** use generic to make it useable with Properties. KT and VT must be of type String. */
- public <KT, VT> void addDefaults(Map<KT, VT> defaultProperties) {
- for (Entry<KT, VT> entry : defaultProperties.entrySet()) {
- if (getProperty((String) entry.getKey()) == null)
- setProperty((String) entry.getKey(), (String) entry.getValue());
- }
- }
-
- public boolean isApplet() {
- return false;
- }
-
- public void removePropertyChangeListener(final Class<? extends IActionOnChange> clazz, final AFreeplaneAction action) {
- final Iterator<IFreeplanePropertyListener> iterator = propertyChangeListeners.iterator();
- while (iterator.hasNext()) {
- final IFreeplanePropertyListener next = iterator.next();
- if (next instanceof IActionOnChange && ((IActionOnChange) next).getAction() == action) {
- iterator.remove();
- return;
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/SetBooleanPropertyAction.java b/freeplane/src/org/freeplane/core/resources/SetBooleanPropertyAction.java
deleted file mode 100644
index 6b23db1..0000000
--- a/freeplane/src/org/freeplane/core/resources/SetBooleanPropertyAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.core.util.TextUtils;
-
-/**
- * @author Dimitry Polivaev
- * Mar 2, 2011
- */
- at SuppressWarnings("serial")
- at SelectableAction(checkOnPopup = true)
-public class SetBooleanPropertyAction extends AFreeplaneAction{
-
- private String propertyName;
- public SetBooleanPropertyAction(String propertyName) {
- super("SetBooleanPropertyAction." + propertyName,
- TextUtils.getRawText("OptionPanel." + propertyName),
- null);
- this.propertyName = propertyName;
- }
-
- public void actionPerformed(ActionEvent e) {
- ResourceController.getResourceController().setProperty(propertyName, ! isPropertySet());
-
- }
- @Override
- public void setSelected() {
- setSelected(isPropertySet());
- }
-
- public boolean isPropertySet() {
- return ResourceController.getResourceController().getBooleanProperty(propertyName);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/WindowConfigurationStorage.java b/freeplane/src/org/freeplane/core/resources/WindowConfigurationStorage.java
deleted file mode 100644
index e640484..0000000
--- a/freeplane/src/org/freeplane/core/resources/WindowConfigurationStorage.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package org.freeplane.core.resources;
-
-import java.awt.Dimension;
-import java.awt.Frame;
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-
-import javax.swing.JDialog;
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.n3.nanoxml.IXMLParser;
-import org.freeplane.n3.nanoxml.IXMLReader;
-import org.freeplane.n3.nanoxml.StdXMLReader;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.n3.nanoxml.XMLException;
-import org.freeplane.n3.nanoxml.XMLParserFactory;
-import org.freeplane.n3.nanoxml.XMLWriter;
-
-public class WindowConfigurationStorage {
- protected int height;
- protected int width;
- protected int x;
- protected int y;
- final private String name;
-
- public WindowConfigurationStorage(String name) {
- super();
- this.name = name;
- }
-
- public int getHeight() {
- return height;
- }
-
- public int getWidth() {
- return width;
- }
-
- public int getX() {
- return x;
- }
-
- public int getY() {
- return y;
- }
-
- private String marshall() {
- final XMLElement xml = new XMLElement();
- xml.setAttribute("x", Integer.toString(x));
- xml.setAttribute("y", Integer.toString(y));
- xml.setAttribute("width", Integer.toString(width));
- xml.setAttribute("height", Integer.toString(height));
- xml.setName(name);
- marshallSpecificElements(xml);
- final StringWriter string = new StringWriter();
- final XMLWriter writer = new XMLWriter(string);
- try {
- writer.write(xml);
- return string.toString();
- }
- catch (final IOException e) {
- LogUtils.severe(e);
- return null;
- }
- }
-
- protected void marshallSpecificElements(XMLElement xml){
- };
-
- public void setHeight(final int height) {
- this.height = height;
- }
-
- public void setWidth(final int width) {
- this.width = width;
- }
-
- public void setX(final int x) {
- this.x = x;
- }
-
- public void setY(final int y) {
- this.y = y;
- }
-
- public void storeDialogPositions(final JDialog dialog) {
- storeDialogPositions(dialog, name);
- }
- public void storeDialogPositions(final JDialog dialog, final String window_preference_storage_property) {
- setX((dialog.getX()));
- setY((dialog.getY()));
- setWidth((dialog.getWidth()));
- setHeight((dialog.getHeight()));
- final String marshalled = marshall();
- ResourceController.getResourceController().setProperty(window_preference_storage_property, marshalled);
- }
-
- public XMLElement restoreDialogPositions(final JDialog dialog) {
- return restoreDialogPositions(dialog, name);
- }
- public XMLElement restoreDialogPositions(final JDialog dialog, final String window_preference_storage_property) {
- String marshalled = ResourceController.getResourceController().getProperty(window_preference_storage_property);
- return unmarschall(marshalled, dialog);
- }
- protected XMLElement unmarschall(final String marshalled, final JDialog dialog) {
- if (marshalled != null) {
- final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
- final IXMLReader xmlReader = new StdXMLReader(new StringReader(marshalled));
- parser.setReader(xmlReader);
- try {
- final XMLElement storage = (XMLElement) parser.parse();
- if (storage != null) {
- x = Integer.parseInt(storage.getAttribute("x", "-1"));
- y = Integer.parseInt(storage.getAttribute("y", "-1"));
- width = Integer.parseInt(storage.getAttribute("width", "-1"));
- height = Integer.parseInt(storage.getAttribute("height", "-1"));
- UITools.setBounds(dialog, x, y, width, height);
- return storage;
- }
- }
- catch (final NumberFormatException e) {
- LogUtils.severe(e);
- }
- catch (final XMLException e) {
- LogUtils.severe(e);
- }
- }
- final Frame rootFrame = JOptionPane.getFrameForComponent(dialog);
- final Dimension prefSize = rootFrame.getSize();
- prefSize.width = prefSize.width * 3 / 4;
- prefSize.height = prefSize.height * 3 / 4;
- dialog.setSize(prefSize);
- return null;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/BooleanProperty.java b/freeplane/src/org/freeplane/core/resources/components/BooleanProperty.java
deleted file mode 100644
index 040e956..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/BooleanProperty.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import javax.swing.JCheckBox;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class BooleanProperty extends PropertyBean implements IPropertyControl {
- JCheckBox mCheckBox = new JCheckBox();
-
- /**
- */
- public BooleanProperty(final String name) {
- super(name);
- mCheckBox.addItemListener(new ItemListener() {
- public void itemStateChanged(final ItemEvent pE) {
- firePropertyChangeEvent();
- }
- });
- }
-
- @Override
- public String getValue() {
- return mCheckBox.isSelected() ? Boolean.TRUE.toString() : Boolean.FALSE.toString();
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, mCheckBox);
- }
-
- public void setEnabled(final boolean pEnabled) {
- mCheckBox.setEnabled(pEnabled);
- }
-
- @Override
- public void setValue(final String value) {
- final boolean booleanValue = Boolean.parseBoolean(value);
- setValue(booleanValue);
- }
-
- public void setValue(final boolean booleanValue) {
- mCheckBox.setSelected(booleanValue);
- }
-
- public boolean getBooleanValue() {
- return mCheckBox.isSelected();
- }
-
- @Override
- protected Component[] getComponents() {
- return new Component[]{mCheckBox};
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/ColorProperty.java b/freeplane/src/org/freeplane/core/resources/components/ColorProperty.java
deleted file mode 100644
index a071a05..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/ColorProperty.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
-import javax.swing.JButton;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.plaf.basic.BasicButtonUI;
-
-import org.freeplane.core.ui.ColorTracker;
-import org.freeplane.core.ui.components.JFreeplaneMenuItem;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.TextUtils;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class ColorProperty extends PropertyBean implements IPropertyControl, ActionListener {
- Color color;
- final private String defaultColor;
- JButton mButton;
- final JPopupMenu menu = new JPopupMenu();
-
- /**
- * @param defaultColor
- * @param pTranslator
- */
- public ColorProperty(final String name, final String defaultColor) {
- super(name);
- this.defaultColor = defaultColor;
- mButton = new JButton() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- {
- setUI(BasicButtonUI.createUI(this));
- }
- };
- mButton.addActionListener(this);
- color = Color.BLACK;
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- final Color result = ColorTracker.showCommonJColorChooserDialog(mButton.getRootPane(), TextUtils
- .getOptionalText(getLabel()), getColorValue(), ColorUtils.stringToColor(defaultColor));
- if(result != null){
- setColorValue(result);
- firePropertyChangeEvent();
- }
- }
-
- /**
- */
- public Color getColorValue() {
- return color;
- }
-
- @Override
- public String getValue() {
- return ColorUtils.colorToString(getColorValue());
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, mButton);
- final JMenuItem item = new JFreeplaneMenuItem(TextUtils.getOptionalText("ColorProperty.ResetColor"));
- item.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- setValue(defaultColor);
- }
- });
- menu.add(item);
- mButton.addMouseListener(new MouseAdapter() {
- @Override
- public void mousePressed(final MouseEvent evt) {
- if (evt.isPopupTrigger()) {
- menu.show(evt.getComponent(), evt.getX(), evt.getY());
- }
- }
-
- @Override
- public void mouseReleased(final MouseEvent evt) {
- if (evt.isPopupTrigger()) {
- menu.show(evt.getComponent(), evt.getX(), evt.getY());
- }
- }
- });
- }
-
- /**
- */
- public void setColorValue(Color input) {
- color = input;
- if (input == null) {
- input = Color.WHITE;
- }
- mButton.setBackground(input);
- final Color textColor = UITools.getTextColorForBackground(input);
- mButton.setForeground(textColor);
- mButton.setText(ColorUtils.colorToString(input));
- }
-
- public void setEnabled(final boolean pEnabled) {
- mButton.setEnabled(pEnabled);
- }
-
- @Override
- public void setValue(final String value) {
- setColorValue(ColorUtils.stringToColor(value));
- }
-
- @Override
- protected Component[] getComponents() {
- return new Component[]{mButton};
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/ComboProperty.java b/freeplane/src/org/freeplane/core/resources/components/ComboProperty.java
deleted file mode 100644
index d95d770..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/ComboProperty.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JComboBox;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class ComboProperty extends PropertyBean implements IPropertyControl, ActionListener {
- static public Vector<String> translate(final String[] possibles) {
- final Vector<String> possibleTranslations = new Vector<String>(possibles.length);
- for (int i = 0; i < possibles.length; i++) {
- possibleTranslations.add(TextUtils.getText("OptionPanel." + possibles[i]));
- }
- return possibleTranslations;
- }
-
- final JComboBox mComboBox;
- private Vector<String> possibleValues;
-
- public ComboProperty(final String name, final Collection<String> possibles,
- final Collection<String> possibleTranslations) {
- super(name);
- fillPossibleValues(possibles);
- mComboBox = new JComboBox();
- mComboBox.setModel(new DefaultComboBoxModel(new Vector<String>(possibleTranslations)));
- mComboBox.addActionListener(this);
- //mComboBox.setRenderer(ComboBoxSmallFontRenderer.INSTANCE);
- }
-
- public ComboProperty(final String name, final String[] strings) {
- this(name, Arrays.asList(strings), ComboProperty.translate(strings));
- }
-
- /**
- */
- private void fillPossibleValues(final Collection<String> possibles) {
- possibleValues = new Vector<String>();
- possibleValues.addAll(possibles);
- }
-
- @Override
- public String getValue() {
- if(mComboBox.getSelectedIndex() == -1)
- return mComboBox.getSelectedItem().toString();
- return possibleValues.get(mComboBox.getSelectedIndex());
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, mComboBox);
- }
-
- public Vector<String> getPossibleValues() {
- return possibleValues;
- }
-
- public void setEnabled(final boolean pEnabled) {
- mComboBox.setEnabled(pEnabled);
- }
-
- @Override
- public void setValue(final String value) {
- if (possibleValues.contains(value)) {
- mComboBox.setSelectedIndex(possibleValues.indexOf(value));
- }
- else if(mComboBox.isEditable()){
- mComboBox.setSelectedItem(value);
- }
- else{
- LogUtils.severe("Can't set the value:" + value + " into the combo box " + getName() + " containing values " + possibleValues);
- if (mComboBox.getModel().getSize() > 0) {
- mComboBox.setSelectedIndex(0);
- }
- }
- }
-
- /**
- * If your combo base changes, call this method to update the values. The
- * old selected value is not selected, but the first in the list. Thus, you
- * should call this method only shortly before setting the value with
- * setValue.
- */
- public void updateComboBoxEntries(final List<String> possibles, final List<String> possibleTranslations) {
- mComboBox.setModel(new DefaultComboBoxModel(new Vector<String>(possibleTranslations)));
- fillPossibleValues(possibles);
- if (possibles.size() > 0) {
- mComboBox.setSelectedIndex(0);
- }
- }
-
- public void actionPerformed(final ActionEvent e) {
- firePropertyChangeEvent();
- }
-
- @Override
- protected Component[] getComponents() {
- return mComboBox.getComponents();
- }
-
- public void setEditable(boolean aFlag) {
- mComboBox.setEditable(aFlag);
- }
-
- public boolean isEditable() {
- return mComboBox.isEditable();
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/EditableComboProperty.java b/freeplane/src/org/freeplane/core/resources/components/EditableComboProperty.java
deleted file mode 100644
index 4c5ed69..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/EditableComboProperty.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.JComboBox;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public abstract class EditableComboProperty<T> extends PropertyBean implements IPropertyControl {
- final JComboBox comboBox;
- private T selected;
-
- public EditableComboProperty(final String name, final List<? extends T> values) {
- super(name);
- comboBox = createFormatChooser(values);
- comboBox.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent pE) {
- firePropertyChangeEvent();
- }
- });
- }
-
- private JComboBox createFormatChooser(final List<? extends T> list) {
- final JComboBox formatChooser = new JComboBox(new Vector<T>(list));
- formatChooser.setEditable(true);
- formatChooser.addItemListener(new ItemListener() {
- public void itemStateChanged(final ItemEvent e) {
- final T valueObject = toValueObject(e.getItem());
- if (valueObject != null)
- selected = valueObject;
- }
- });
- return formatChooser;
- }
-
- @Override
- public String getValue() {
- return selected == null ? null : selected.toString();
- }
-
- public T getSelected() {
- return selected;
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, comboBox);
- }
-
- public void setEnabled(final boolean pEnabled) {
- comboBox.setEnabled(pEnabled);
- }
-
- @Override
- public void setValue(final String value) {
- comboBox.setSelectedItem(value == null ? null : toValueObject(value));
- }
-
- public void setToolTipText(String text) {
- comboBox.setToolTipText(text);
- }
-
- @Override
- protected Component[] getComponents() {
- return comboBox.getComponents();
- }
-
- abstract public T toValueObject(Object value);
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/FontProperty.java b/freeplane/src/org/freeplane/core/resources/components/FontProperty.java
deleted file mode 100644
index 9daeb77..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/FontProperty.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.GraphicsEnvironment;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JComboBox;
-
-import org.freeplane.core.util.LogUtils;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class FontProperty extends PropertyBean implements IPropertyControl {
- final private String[] mAvailableFontFamilyNames;
- JComboBox mFontComboBox = new JComboBox();
-
- /**
- */
- public FontProperty(final String name) {
- super(name);
- mAvailableFontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
- mFontComboBox.setModel(new DefaultComboBoxModel(mAvailableFontFamilyNames));
- mFontComboBox.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent pE) {
- firePropertyChangeEvent();
- }
- });
- }
-
- @Override
- public String getValue() {
- return mAvailableFontFamilyNames[mFontComboBox.getSelectedIndex()];
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, mFontComboBox);
- }
-
- public void setEnabled(final boolean pEnabled) {
- mFontComboBox.setEnabled(pEnabled);
- }
-
- @Override
- public void setValue(final String pValue) {
- for (int i = 0; i < mAvailableFontFamilyNames.length; i++) {
- final String fontName = mAvailableFontFamilyNames[i];
- if (fontName.equals(pValue)) {
- mFontComboBox.setSelectedIndex(i);
- return;
- }
- }
- LogUtils.severe("Unknown value:" + pValue);
- if (mFontComboBox.getModel().getSize() > 0) {
- mFontComboBox.setSelectedIndex(0);
- }
- }
-
- @Override
- protected Component[] getComponents() {
- return mFontComboBox.getComponents();
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/GrabKeyDialog.java b/freeplane/src/org/freeplane/core/resources/components/GrabKeyDialog.java
deleted file mode 100644
index 93ff8db..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/GrabKeyDialog.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2001, 2002 Slava Pestov
- * Copyright (C) 2009 Dimitry Polivaev
- *
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.AWTEvent;
-import java.awt.Dimension;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.lang.reflect.Field;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import javax.swing.KeyStroke;
-import javax.swing.WindowConstants;
-import javax.swing.border.EmptyBorder;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-
-/**
- * A dialog for getting shortcut keys.
- */
-public class GrabKeyDialog extends JDialog {
- class ActionHandler implements ActionListener {
- public void actionPerformed(final ActionEvent evt) {
- if (evt.getSource() == ok) {
- if (shortcut.keyChar == null) {
- isOK = false;
- dispose();
- }
- else if (canClose(UITools.getKeyStroke(shortcut.getText()))) {
- isOK = true;
- dispose();
- }
- }
- else if (evt.getSource() == cancel) {
- dispose();
- }
- else if (evt.getSource() == clear) {
- shortcut.keyChar = KeyEvent.CHAR_UNDEFINED;
- shortcut.setText(null);
- shortcut.requestFocus();
- }
- }
- }
-
- class InputPane extends JTextField {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * Makes the tab key work in Java 1.4.
- *
- * @since jEdit 3.2pre4
- */
- @Override
- public boolean getFocusTraversalKeysEnabled() {
- return false;
- }
-
- private int getModifierMask() {
- return modifierMask;
- }
-
- private Character keyChar = null;
-
- @Override
- protected void processKeyEvent(final KeyEvent evt) {
- if (KeyEvent.KEY_PRESSED != evt.getID()) {
- return;
- }
- if ((getModifierMask() & evt.getModifiers()) != 0) {
- final KeyEvent evt2 = new KeyEvent(evt.getComponent(), evt.getID(), evt.getWhen(), ~getModifierMask()
- & evt.getModifiers(), evt.getKeyCode(), evt.getKeyChar(), evt.getKeyLocation());
- processKeyEvent(evt2);
- if (evt2.isConsumed()) {
- evt.consume();
- }
- return;
- }
- final int keyCode = evt.getKeyCode();
- switch (keyCode) {
- case KeyEvent.VK_DEAD_GRAVE:
- case KeyEvent.VK_DEAD_ACUTE:
- case KeyEvent.VK_DEAD_CIRCUMFLEX:
- case KeyEvent.VK_DEAD_TILDE:
- case KeyEvent.VK_DEAD_MACRON:
- case KeyEvent.VK_DEAD_BREVE:
- case KeyEvent.VK_DEAD_ABOVEDOT:
- case KeyEvent.VK_DEAD_DIAERESIS:
- case KeyEvent.VK_DEAD_ABOVERING:
- case KeyEvent.VK_DEAD_DOUBLEACUTE:
- case KeyEvent.VK_DEAD_CARON:
- case KeyEvent.VK_DEAD_CEDILLA:
- case KeyEvent.VK_DEAD_OGONEK:
- case KeyEvent.VK_DEAD_IOTA:
- case KeyEvent.VK_DEAD_VOICED_SOUND:
- case KeyEvent.VK_DEAD_SEMIVOICED_SOUND:
- return;
- case '\0':
- if (evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED || evt.getKeyChar() == 0) {
- return;
- }
- break;
- case KeyEvent.VK_WINDOWS:
- if (Compat.isWindowsOS()) {
- return;
- }
- case KeyEvent.VK_ALT:
- KeyEventTranslator.modifiers |= InputEvent.ALT_MASK;
- return;
- case KeyEvent.VK_ALT_GRAPH:
- KeyEventTranslator.modifiers |= InputEvent.ALT_GRAPH_MASK;
- return;
- case KeyEvent.VK_CONTROL:
- KeyEventTranslator.modifiers |= InputEvent.CTRL_MASK;
- return;
- case KeyEvent.VK_SHIFT:
- KeyEventTranslator.modifiers |= InputEvent.SHIFT_MASK;
- return;
- case KeyEvent.VK_META:
- KeyEventTranslator.modifiers |= InputEvent.META_MASK;
- return;
- default:
- if (KeyEventTranslator.ALT_KEY_PRESSED_DISABLED) {
- /* we don't handle key pressed A+ */
- /* they're too troublesome */
- if ((KeyEventTranslator.modifiers & InputEvent.ALT_MASK) != 0) {
- return;
- }
- }
- break;
- }
- evt.consume();
- final KeyEventTranslator.Key key = KeyEventTranslator.translateKeyEvent(evt);
- if (key == null) {
- return;
- }
- keyChar = key.input;
- final StringBuilder keyString = new StringBuilder(/* getText() */);
- if (key.modifiers != null) {
- keyString.append(key.modifiers).append(' ');
- }
- if (key.input == ' ') {
- keyString.append("SPACE");
- }
- else if (key.key == 0) {
- keyString.append(key.input);
- }
- else {
- final String symbolicName = getSymbolicName(key.key);
- if (symbolicName == null) {
- return;
- }
- keyString.append(symbolicName);
- }
- setText(keyString.toString());
- updateAssignedTo(keyString.toString());
- }
-
- public Character getKeyChar() {
- return keyChar;
- }
- }
-
- /**
- * Create and show a new modal dialog.
- *
- * @param parent
- * center dialog on this component.
- * @param binding
- * the action/macro that should get a binding.
- * @param allBindings
- * all other key bindings.
- * @param debugBuffer
- * debug info will be dumped to this buffer (may be null)
- * @since jEdit 4.1pre7
- */
- /**
- * A jEdit action or macro with its two possible shortcuts.
- *
- * @since jEdit 3.2pre8
- */
- public final static String MODIFIER_SEPARATOR = " ";
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- */
- private static String getText(final String resourceString) {
- return TextUtils.getText("GrabKeyDialog." + resourceString);
- }
-
- public static String toString(final KeyEvent evt) {
- String id;
- switch (evt.getID()) {
- case KeyEvent.KEY_PRESSED:
- id = "KEY_PRESSED";
- break;
- case KeyEvent.KEY_RELEASED:
- id = "KEY_RELEASED";
- break;
- case KeyEvent.KEY_TYPED:
- id = "KEY_TYPED";
- break;
- default:
- id = "unknown type";
- break;
- }
- return id + ",keyCode=0x" + Integer.toString(evt.getKeyCode(), 16) + ",keyChar=0x"
- + Integer.toString(evt.getKeyChar(), 16) + ",modifiers=0x" + Integer.toString(evt.getModifiers(), 16);
- }
-
- private JLabel assignedTo;
- private JButton cancel;
- private JButton clear;
- private boolean isOK;
- private int modifierMask;
- private JButton ok;
- private InputPane shortcut;
-
- public Character getKeyChar() {
- return shortcut.getKeyChar();
- }
-
- private IKeystrokeValidator validator;
-
- public GrabKeyDialog(final String input, final int modifierMask) {
- super(UITools.getFrame(), GrabKeyDialog.getText("grab-key.title"), true);
- init(input, modifierMask);
- }
-
- public GrabKeyDialog(final String input) {
- super(UITools.getFrame(), GrabKeyDialog.getText("grab-key.title"), true);
- init(input, 0);
- }
-
- public boolean canClose(final KeyStroke ks) {
- return validator == null || validator.isValid(ks, getKeyChar());
- }
-
- /**
- * Makes the tab key work in Java 1.4.
- *
- * @since jEdit 3.2pre4
- */
- @Override
- public boolean getFocusTraversalKeysEnabled() {
- return false;
- }
-
- /**
- * Returns the shortcut, or null if the current shortcut should be removed
- * or the dialog either has been cancelled. Use isOK() to determine if the
- * latter is true.
- */
- public String getShortcut() {
- if (isOK) {
- return shortcut.getText();
- }
- else {
- return null;
- }
- }
-
- private String getSymbolicName(final int keyCode) {
- if (keyCode == KeyEvent.VK_UNDEFINED) {
- return null;
- /*
- * else if(keyCode == KeyEvent.VK_OPEN_BRACKET) return "["; else
- * if(keyCode == KeyEvent.VK_CLOSE_BRACKET) return "]";
- */
- }
- if (keyCode >= KeyEvent.VK_A && keyCode <= KeyEvent.VK_Z) {
- return String.valueOf(Character.toLowerCase((char) keyCode));
- }
- try {
- final Field[] fields = KeyEvent.class.getFields();
- for (int i = 0; i < fields.length; i++) {
- final Field field = fields[i];
- final String name = field.getName();
- if (name.startsWith("VK_") && field.getInt(null) == keyCode) {
- return name.substring(3);
- }
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- return null;
- }
-
- public IKeystrokeValidator getValidator() {
- return validator;
- }
-
- private void init(final String inputText, final int modifierMask) {
- this.modifierMask = modifierMask;
- enableEvents(AWTEvent.KEY_EVENT_MASK);
- final JPanel content = new JPanel(new GridLayout(0, 1, 0, 6)) {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * Makes the tab key work in Java 1.4.
- *
- * @since jEdit 3.2pre4
- */
- @Override
- public boolean getFocusTraversalKeysEnabled() {
- return false;
- }
-
- /**
- * Returns if this component can be traversed by pressing the Tab
- * key. This returns false.
- */
- @Override
- public boolean isManagingFocus() {
- return false;
- }
- };
- content.setBorder(new EmptyBorder(12, 12, 12, 12));
- setContentPane(content);
- final Box input = Box.createHorizontalBox();
- shortcut = new InputPane();
- if (inputText != null) {
- shortcut.setText(inputText);
- }
- input.add(shortcut);
- input.add(Box.createHorizontalStrut(12));
- clear = new JButton((GrabKeyDialog.getText("grab-key.clear")));
- clear.addActionListener(new ActionHandler());
- input.add(clear);
- shortcut.setPreferredSize(new Dimension(200, clear.getPreferredSize().height));
- assignedTo = new JLabel();
- updateAssignedTo(null);
- final Box buttons = Box.createHorizontalBox();
- buttons.add(Box.createGlue());
- ok = new JButton(GrabKeyDialog.getText("common.ok"));
- ok.addActionListener(new ActionHandler());
- buttons.add(ok);
- buttons.add(Box.createHorizontalStrut(12));
- cancel = new JButton(GrabKeyDialog.getText("common.cancel"));
- cancel.addActionListener(new ActionHandler());
- buttons.add(cancel);
- buttons.add(Box.createGlue());
- content.add(input);
- content.add(buttons);
- setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- pack();
- setLocationRelativeTo(getParent());
- setResizable(false);
- }
-
- /**
- * Returns if this component can be traversed by pressing the Tab key. This
- * returns false.
- */
- public boolean isManagingFocus() {
- return false;
- }
-
- /**
- * Returns true, if the dialog has not been cancelled.
- *
- * @since jEdit 3.2pre9
- */
- public boolean isOK() {
- return isOK;
- }
-
- @Override
- protected void processKeyEvent(final KeyEvent evt) {
- shortcut.processKeyEvent(evt);
- }
-
- public void setValidator(final IKeystrokeValidator validator) {
- this.validator = validator;
- }
-
- private void updateAssignedTo(final String shortcut) {
- final String text = (GrabKeyDialog.getText("grab-key.assigned-to.none"));
- if (ok != null) {
- ok.setEnabled(true);
- }
- assignedTo.setText((GrabKeyDialog.getText("grab-key.assigned-to") + " " + text));
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/IPropertyControl.java b/freeplane/src/org/freeplane/core/resources/components/IPropertyControl.java
deleted file mode 100644
index f105938..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/IPropertyControl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public interface IPropertyControl {
- String getDescription();
-
- String getName();
-
- void layout(DefaultFormBuilder builder);
-
- void setEnabled(boolean pEnabled);
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/IconProperty.java b/freeplane/src/org/freeplane/core/resources/components/IconProperty.java
deleted file mode 100644
index 7711adb..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/IconProperty.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-import javax.swing.JButton;
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.components.IconSelectionPopupDialog;
-import org.freeplane.features.icon.MindIcon;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class IconProperty extends PropertyBean implements IPropertyControl, ActionListener {
- private MindIcon mActualIcon;
- private final JButton mButton;
- /**
- * Of IconInformation s.
- */
- private final List<MindIcon> mIcons;
-
- public IconProperty(final String name, final List<MindIcon> icons) {
- super(name);
- mIcons = icons;
- mButton = new JButton();
- mButton.addActionListener(this);
- }
-
- public void actionPerformed(final ActionEvent e) {
- final List<MindIcon> icons = new ArrayList<MindIcon>();
- final List<String> descriptions = new ArrayList<String>();
- for (final MindIcon icon : mIcons) {
- icons.add(icon);
- descriptions.add(icon.getDescription());
- }
- final IconSelectionPopupDialog dialog = new IconSelectionPopupDialog(JOptionPane
- .getFrameForComponent((Component) e.getSource()), icons);
- dialog.setLocationRelativeTo(JOptionPane.getFrameForComponent((Component) e.getSource()));
- dialog.setModal(true);
- dialog.setVisible(true);
- final int result = dialog.getResult();
- if (result >= 0) {
- final MindIcon icon = mIcons.get(result);
- setValue(icon.getName());
- firePropertyChangeEvent();
- }
- }
-
- @Override
- public String getValue() {
- return mActualIcon.getName();
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, mButton);
- }
-
- public void setEnabled(final boolean pEnabled) {
- mButton.setEnabled(pEnabled);
- }
-
- private void setIcon(final MindIcon actualIcon) {
- mButton.setIcon(actualIcon.getIcon());
- mButton.setToolTipText(actualIcon.getDescription());
- }
-
- @Override
- public void setValue(final String value) {
- for (final MindIcon icon : mIcons) {
- if (icon.getName().equals(value)) {
- mActualIcon = icon;
- setIcon(mActualIcon);
- return;
- }
- }
- throw new NoSuchElementException();
- }
-
- public MindIcon getIcon() {
- return mActualIcon;
- }
-
- @Override
- protected Component[] getComponents() {
- return new Component[]{mButton};
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/KeyProperty.java b/freeplane/src/org/freeplane/core/resources/components/KeyProperty.java
deleted file mode 100644
index c9711bf..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/KeyProperty.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
-
-import javax.swing.Icon;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-
-import org.freeplane.core.util.TextUtils;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.layout.RowSpec;
-import com.jgoodies.forms.layout.Sizes;
-
-/**
- * @author Dimitry Polivaev
- * 27.12.2008
- */
-public class KeyProperty extends PropertyBean implements IPropertyControl {
- private static RowSpec rowSpec;
- private Icon icon;
- private String labelText;
- JButton mButton = new JButton();
- private int modifierMask = 0;
-
- /**
- */
- public KeyProperty(final String name) {
- super(name);
- }
-
- public void disableModifiers() {
- modifierMask = KeyEvent.ALT_MASK | KeyEvent.CTRL_MASK | KeyEvent.META_MASK;
- }
-
- @Override
- public String getValue() {
- return mButton.getText();
- }
-
- public void layout(final DefaultFormBuilder builder) {
- mButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent arg0) {
- final GrabKeyDialog keyDialog = new GrabKeyDialog(getValue(), modifierMask);
- keyDialog.setVisible(true);
- if (keyDialog.isOK()) {
- setValue(keyDialog.getShortcut());
- firePropertyChangeEvent();
- }
- }
- });
- if (labelText == null) {
- labelText = TextUtils.getOptionalText(getLabel());
- }
- final JLabel label = new JLabel(labelText, icon, JLabel.RIGHT);
- String tooltip = TextUtils.getOptionalText(getDescription());
- label.setToolTipText(tooltip);
- if (KeyProperty.rowSpec == null) {
- KeyProperty.rowSpec = new RowSpec(RowSpec.FILL, Sizes.dluX(20), 0.0);
- }
- if (3 < builder.getColumn()) {
- builder.appendRelatedComponentsGapRow();
- builder.appendRow(KeyProperty.rowSpec);
- builder.nextLine(2);
- }
- else {
- builder.nextColumn(2);
- }
- builder.add(label);
- builder.nextColumn(2);
- builder.add(mButton);
- mButton.setToolTipText(tooltip);
- }
-
- public void setEnabled(final boolean pEnabled) {
- mButton.setEnabled(pEnabled);
- }
-
- public void setImageIcon(final Icon icon) {
- this.icon = icon;
- }
-
- public void setLabelText(final String labelText) {
- this.labelText = labelText;
- }
-
- @Override
- public void setValue(final String value) {
- mButton.setText(value);
- mButton.setToolTipText(mButton.getText());
- }
-
- @Override
- protected Component[] getComponents() {
- return new Component[]{mButton};
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/NextColumnProperty.java b/freeplane/src/org/freeplane/core/resources/components/NextColumnProperty.java
deleted file mode 100644
index 4f1a253..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/NextColumnProperty.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class NextColumnProperty implements IPropertyControl {
- private int n;
-
- public NextColumnProperty() {
- this(1);
- }
-
- public NextColumnProperty(int n) {
- this.n=n;
- }
-
- public String getDescription() {
- return null;
- }
-
- public String getName() {
- return null;
- }
-
- public void layout(final DefaultFormBuilder builder) {
- for(int i = 0; i < n; i++){
- builder.append("");
- }
- }
-
- public void setEnabled(final boolean pEnabled) {
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/NextLineProperty.java b/freeplane/src/org/freeplane/core/resources/components/NextLineProperty.java
deleted file mode 100644
index e36207f..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/NextLineProperty.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class NextLineProperty implements IPropertyControl {
- public NextLineProperty() {
- super();
- }
-
- public String getDescription() {
- return null;
- }
-
- public String getName() {
- return null;
- }
-
- public void layout(final DefaultFormBuilder builder) {
- builder.nextLine();
- }
-
- public void setEnabled(final boolean pEnabled) {
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/NumberProperty.java b/freeplane/src/org/freeplane/core/resources/components/NumberProperty.java
deleted file mode 100644
index 8e3d3ab..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/NumberProperty.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-
-import javax.swing.JSpinner;
-import javax.swing.SpinnerNumberModel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class NumberProperty extends PropertyBean implements IPropertyControl {
-// final private int max;
-// final private int min;
-// final private int step;
- final private JSpinner spinner;
- final private boolean isDoubleProperty;
-
- /**
- */
- public NumberProperty(final String name, final int min, final int max, final int step) {
- super(name);
-// this.min = min;
-// this.max = max;
-// this.step = step;
- spinner = new JSpinner(new SpinnerNumberModel(min, min, max, step));
- spinner.addChangeListener(new ChangeListener() {
- public void stateChanged(final ChangeEvent pE) {
- firePropertyChangeEvent();
- }
- });
- isDoubleProperty = false;
- }
-
- public NumberProperty(final String name, final double min, final double max, final double step) {
- super(name);
- spinner = new JSpinner(new SpinnerNumberModel(min, min, max, step));
- spinner.addChangeListener(new ChangeListener() {
- public void stateChanged(final ChangeEvent pE) {
- firePropertyChangeEvent();
- }
- });
- isDoubleProperty = true;
- }
-
- @Override
- public String getValue() {
- return spinner.getValue().toString();
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, spinner);
- }
-
- public void setEnabled(final boolean pEnabled) {
- spinner.setEnabled(pEnabled);
- }
-
- @Override
- public void setValue(final String value) {
- Number someValue;
- if (isDoubleProperty)
- {
- try {
- someValue = Double.parseDouble(value);
- }
- catch (final NumberFormatException e) {
- someValue = 1.0;
- }
- }
- else
- {
- try {
- someValue = Integer.parseInt(value);
- }
- catch (final NumberFormatException e) {
- someValue = 100;
- }
- }
- spinner.setValue(someValue);
- }
-
- @Override
- protected Component[] getComponents() {
- return spinner.getComponents();
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/OptionPanel.java b/freeplane/src/org/freeplane/core/resources/components/OptionPanel.java
deleted file mode 100644
index 3e96bf9..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/OptionPanel.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.BorderLayout;
-import java.awt.CardLayout;
-import java.awt.Color;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.IOException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.Vector;
-
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.IValidator.ValidationResult;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.factories.ButtonBarFactory;
-import com.jgoodies.forms.layout.FormLayout;
-
-public class OptionPanel {
- final private class ChangeTabAction implements ActionListener {
- final private CardLayout cardLayout;
- final private JPanel centralPanel;
- final private String tabName;
-
- private ChangeTabAction(final CardLayout cardLayout, final JPanel centralPanel, final String tabName) {
- super();
- this.cardLayout = cardLayout;
- this.centralPanel = centralPanel;
- this.tabName = tabName;
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- cardLayout.show(centralPanel, tabName);
- for (final JButton button : tabButtonMap.values()) {
- button.setForeground(null);
- }
- getTabButton(tabName).setForeground(OptionPanel.MARKED_BUTTON_COLOR);
- selectedPanel = tabName;
- }
- }
-
- public interface IOptionPanelFeedback {
- void writeProperties(Properties props);
- }
-
- private static final Color MARKED_BUTTON_COLOR = Color.BLUE;
- static final String PREFERENCE_STORAGE_PROPERTY = "OptionPanel_Window_Properties";
- private Vector<IPropertyControl> controls;
- final private IOptionPanelFeedback feedback;
- private String selectedPanel;
- final private HashMap<String, ChangeTabAction> tabActionMap = new HashMap<String, ChangeTabAction>();
- final private HashMap<String, JButton> tabButtonMap = new HashMap<String, JButton>();
- final private JDialog topDialog;
-
- /**
- * @throws IOException
- */
- public OptionPanel(final JDialog d, final IOptionPanelFeedback feedback) {
- super();
- topDialog = d;
- this.feedback = feedback;
- new OptionPanelBuilder();
- }
-
- public void buildPanel(final DefaultMutableTreeNode controlsTree) {
- final FormLayout leftLayout = new FormLayout("max(80dlu;p):grow", "");
- final DefaultFormBuilder leftBuilder = new DefaultFormBuilder(leftLayout);
- final CardLayout cardLayout = new VariableSizeCardLayout();
- final JPanel rightStack = new JPanel(cardLayout);
- FormLayout rightLayout = null;
- DefaultFormBuilder rightBuilder = null;
- String lastTabName = null;
- initControls(controlsTree);
- final Iterator<IPropertyControl> iterator = controls.iterator();
- while (iterator.hasNext()) {
- final IPropertyControl control = iterator.next();
- if (control instanceof TabProperty) {
- final TabProperty newTab = (TabProperty) control;
- if (rightBuilder != null) {
- rightStack.add(rightBuilder.getPanel(), lastTabName);
- }
- rightLayout = new FormLayout(newTab.getDescription(), "");
- rightBuilder = new DefaultFormBuilder(rightLayout);
- rightBuilder.setDefaultDialogBorder();
- lastTabName = newTab.getLabel();
- final JButton tabButton = new JButton(TextUtils.getOptionalText(lastTabName));
- final ChangeTabAction changeTabAction = new ChangeTabAction(cardLayout, rightStack, lastTabName);
- tabButton.addActionListener(changeTabAction);
- registerTabButton(tabButton, lastTabName, changeTabAction);
- leftBuilder.append(tabButton);
- }
- else {
- control.layout(rightBuilder);
- }
- }
- rightStack.add(rightBuilder.getPanel(), lastTabName);
- if (selectedPanel != null && tabActionMap.containsKey(selectedPanel)) {
- (tabActionMap.get(selectedPanel)).actionPerformed(null);
- }
- final JScrollPane rightComponent = new JScrollPane(rightStack);
- UITools.setScrollbarIncrement(rightComponent);
- final JSplitPane centralPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftBuilder.getPanel(),
- rightComponent);
- topDialog.getContentPane().add(centralPanel, BorderLayout.CENTER);
- final JButton cancelButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(cancelButton, TextUtils.getRawText("cancel"));
- cancelButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent arg0) {
- closeWindow();
- }
- });
- final JButton okButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(okButton, TextUtils.getRawText("ok"));
- okButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent arg0) {
- if (validate()) {
- closeWindow();
- feedback.writeProperties(getOptionProperties());
- }
- }
- });
- topDialog.getRootPane().setDefaultButton(okButton);
- topDialog.getContentPane().add(ButtonBarFactory.buildOKCancelBar(cancelButton, okButton), BorderLayout.SOUTH);
- }
-
- private boolean validate() {
- final Properties properties = getOptionProperties();
- final ValidationResult result = new ValidationResult();
- for (IValidator validator : Controller.getCurrentController().getOptionValidators()) {
- result.add(validator.validate(properties));
- }
- if (!result.isValid()) {
- UITools.errorMessage(formatErrors("OptionPanel.validation_error", result.getErrors()));
- LogUtils.severe(result.toString());
- }
- else if (result.hasWarnings()) {
- UITools.informationMessage(formatErrors("OptionPanel.validation_warning", result.getWarnings()));
- LogUtils.warn(result.toString());
- }
- return result.isValid();
- }
-
- private String formatErrors(String key, ArrayList<String> errors) {
- // TextUtils.format() xml escapes the format arguments - we don't want that
- final MessageFormat formatter = new MessageFormat(TextUtils.getText(key));
- return formatter.format(new Object[] { StringUtils.join(errors.iterator(), "<br>") });
- }
-
- @SuppressWarnings("unchecked")
- private void initControls(final DefaultMutableTreeNode controlsTree) {
- controls = new Vector<IPropertyControl>();
- for (final Enumeration<DefaultMutableTreeNode> i = controlsTree.preorderEnumeration(); i.hasMoreElements();) {
- final IPropertyControlCreator creator = (IPropertyControlCreator) i.nextElement().getUserObject();
- if (creator == null) {
- continue;
- }
- final IPropertyControl control = creator.createControl();
- controls.add(control);
- }
- }
-
- public void closeWindow() {
- final OptionPanelWindowConfigurationStorage storage = new OptionPanelWindowConfigurationStorage();
- storage.setPanel(selectedPanel);
- storage.storeDialogPositions(topDialog, OptionPanel.PREFERENCE_STORAGE_PROPERTY);
- topDialog.setVisible(false);
- topDialog.dispose();
- }
-
- private Properties getOptionProperties() {
- final Properties p = new Properties();
- for (final IPropertyControl control : controls) {
- if (control instanceof PropertyBean) {
- final PropertyBean bean = (PropertyBean) control;
- final String value = bean.getValue();
- if (value != null) {
- p.setProperty(bean.getName(), value);
- }
- }
- }
- return p;
- }
-
- private JButton getTabButton(final String name) {
- return tabButtonMap.get(name);
- }
-
- private void registerTabButton(final JButton tabButton, final String name, final ChangeTabAction changeTabAction) {
- tabButtonMap.put(name, tabButton);
- tabActionMap.put(name, changeTabAction);
- if (selectedPanel == null) {
- selectedPanel = name;
- }
- }
-
- public void setProperties() {
- for (final IPropertyControl control : controls) {
- if (control instanceof PropertyBean) {
- final PropertyBean bean = (PropertyBean) control;
- final String name = bean.getName();
- final String value = ResourceController.getResourceController().getProperty(name);
- bean.setValue(value);
- }
- }
- }
-
- void setSelectedPanel(final String panel) {
- selectedPanel = panel;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/OptionPanelBuilder.java b/freeplane/src/org/freeplane/core/resources/components/OptionPanelBuilder.java
deleted file mode 100644
index fb671c2..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/OptionPanelBuilder.java
+++ /dev/null
@@ -1,604 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.net.URL;
-import java.text.Collator;
-import java.util.Arrays;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.Vector;
-
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.xml.TreeXmlReader;
-import org.freeplane.core.resources.ResourceBundles;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.IndexedTree;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.n3.nanoxml.XMLException;
-
-/**
- * @author Dimitry Polivaev
- * 26.12.2008
- * <p>
- * Note that the OptionPanelBuilder allows to set a custom validator for options,
- * see {@link #addValidator(IValidator)}.
- */
-public class OptionPanelBuilder {
- private class BooleanOptionCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- return createBooleanOptionCreator(name);
- }
- }
-
- private class ColorOptionCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- return createColorOptionCreator(name);
- }
- }
-
- private class ComboOptionCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- final int childrenCount = data.getChildrenCount();
- final Vector<String> choices = new Vector<String>(childrenCount);
- final Vector<String> translations = new Vector<String>(childrenCount);
- for (int i = 0; i < childrenCount; i++) {
- final XMLElement element = data.getChildAtIndex(i);
- final String choice = element.getAttribute("value", null);
- choices.add(choice);
- final String translationKey = element.getAttribute("text", "OptionPanel." + choice);
- final String translation = TextUtils.getOptionalText(translationKey);
- translations.add(translation);
- }
- return createComboProperty(name, choices, translations);
- }
- }
-
- private class LanguagesComboCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- final Set<String> locales = findAvailableLocales();
- locales.add(ResourceBundles.LANGUAGE_AUTOMATIC);
- final Vector<String> choices = new Vector<String>(locales.size());
- final Vector<String> translations = new Vector<String>(locales.size());
- // sort according to current locale
- final TreeMap<String, String> inverseMap = new TreeMap<String, String>(Collator.getInstance());
- for (String locale : locales) {
- final String translation = TextUtils.getOptionalText("OptionPanel." + locale);
- choices.add(locale);
- translations.add(translation);
- if (inverseMap.containsKey(translation)) {
- LogUtils.severe("translation " + translation + " is used for more that one locale, for "
- + inverseMap.get(translation) + " and for " + locale + ".");
- }
- inverseMap.put(translation, locale);
- }
- if (inverseMap.size() == choices.size()) {
- // fix #630: Language not sorted alphabetically
- choices.clear();
- translations.clear();
- for (Entry<String, String> entry : inverseMap.entrySet()) {
- choices.add(entry.getValue());
- translations.add(entry.getKey());
- }
- }
- return createComboProperty(name, choices, translations);
- }
-
- private Set<String> findAvailableLocales() {
- final TreeSet<String> locales = new TreeSet<String>();
- final String name = "/translations/locales.txt";
- final InputStream stream = ResourceController.class.getResourceAsStream(name);
- if (stream == null) {
- LogUtils.info("available locales not found");
- // as this happens when Freeplane is started from Eclipse add some locales for developer's sake
- locales.addAll(Arrays.asList(("ar,ca,cs,da,de,el,es,et,fr,gl,hr,hu,id,it,ja,ko,lt,nb,nl,nn,pl,pt_BR,"
- + "pt_PT,ru,sk,sl,sr,sv,tr,uk_UA,zh_CN,zh_TW,en").split(",")));
- return locales;
- }
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- try {
- FileUtils.copyStream(stream, out);
- locales.addAll(Arrays.asList(out.toString().split("\\s+")));
- }
- catch (IOException e) {
- // OK - return locales
- }
- finally {
- FileUtils.silentlyClose(stream);
- }
- return locales;
- }
- }
-
- private class EmptyCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- return null;
- }
- }
-
- private class FontOptionCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- return createFontOptionCreator(name);
- }
- }
-
- private class KeyOptionCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- return createKeyOptionCreator(name);
- }
- }
-
- private class NumberOptionCreator extends PropertyCreator {
- private IPropertyControlCreator createNumberPropertyCreator(final String name, final int min, final int step,
- final int max) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new NumberProperty(name, min, max, step);
- }
- };
- }
-
- private IPropertyControlCreator createNumberPropertyCreator(
- final String name, final double min, final double step, final double max) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new NumberProperty(name, min, max, step);
- }
- };
- }
-
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- final String minString = data.getAttribute("min", "1");
- final String maxString = data.getAttribute("max", MAX_INT);
- final String stepString = data.getAttribute("step", "1");
- if (minString.contains(".") || maxString.contains(".") || stepString.contains("."))
- {
- return createNumberPropertyCreator(name,
- Double.parseDouble(minString),
- Double.parseDouble(stepString),
- Double.parseDouble(maxString));
- }
- else
- {
- return createNumberPropertyCreator(name,
- Integer.parseInt(minString),
- Integer.parseInt(stepString),
- Integer.parseInt(maxString));
- }
- }
- }
-
- private class PathOptionCreator extends PropertyCreator {
- private IPropertyControlCreator createPathPropertyCreator(final String name, final boolean isDir,
- final String[] suffixes) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new PathProperty(name, isDir, suffixes);
- }
- };
- }
-
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- final boolean isDir = Boolean.parseBoolean(data.getAttribute("dir", "false"));
- final String[] suffixes = parseCSV(data.getAttribute("suffixes", ""));
- return createPathPropertyCreator(name, isDir, suffixes);
- }
-
- // Parses CSV, strips whitespace, returns null if empty
- private String[] parseCSV(String csv) {
- if (csv == null)
- return null;
- final String[] result = csv.trim().split("\\s*,\\s*");
- return result.length > 0 ? result : null;
- }
- }
-
- private static class Path {
- static Path emptyPath() {
- final Path Path = new Path(null);
- Path.path = null;
- return Path;
- }
-
- String parentPath;
- String path;
-
- Path(final String path) {
- parentPath = path;
- }
-
- void setName(final String name) {
- path = parentPath == null ? name : parentPath + '/' + name;
- }
-
- @Override
- public String toString() {
- return path;
- }
- };
-
- protected abstract class PropertyCreator implements IElementDOMHandler {
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (attributes == null) {
- return null;
- }
- final String name = attributes.getAttribute("name", null);
- if (name == null) {
- return parent == null ? Path.emptyPath() : parent;
- }
- final Path path = new Path(parent == null ? null : parent.toString());
- path.setName(name);
- if (!tree.contains(path.path)) {
- tree
- .addElement(path.parentPath == null ? tree : path.parentPath, this, path.path, IndexedTree.AS_CHILD);
- }
- return path;
- }
-
- public void endElement(final Object parent, final String tag, final Object userObject,
- final XMLElement lastBuiltElement) {
- final String name = lastBuiltElement.getAttribute("name", null);
- final Path path = (Path) userObject;
- if (path.path == null) {
- return;
- }
- final DefaultMutableTreeNode treeNode = tree.get(path.path);
- if (treeNode.getUserObject() == this) {
- final IPropertyControlCreator creator = getCreator(name, lastBuiltElement);
- final String text = lastBuiltElement.getAttribute("text", null);
- if(text == null){
- treeNode.setUserObject(creator);
- }
- else{
- treeNode.setUserObject(new IPropertyControlCreator(){
- public IPropertyControl createControl() {
- final IPropertyControl control = creator.createControl();
- if( control instanceof PropertyAdapter){
- final PropertyAdapter control2 = (PropertyAdapter) control;
- control2.setLabel(text);
- }
- return control;
- }});
- }
-
- }
- }
-
- abstract public IPropertyControlCreator getCreator(String name, XMLElement data);
- }
-
- private class RemindValueCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- return createRemindValueProperty(name);
- }
- }
-
- private class SeparatorCreator extends PropertyCreator {
- @Override
- public void endElement(final Object parent, final String tag, final Object userObject,
- final XMLElement lastBuiltElement) {
- final Path path = (Path) userObject;
- final DefaultMutableTreeNode treeNode = tree.get(path.path);
- if (treeNode.getUserObject() != this) {
- return;
- }
- super.endElement(parent, tag, userObject, lastBuiltElement);
- tree.addElement(path.parentPath == null ? tree : path.parentPath, nextLineCreator, IndexedTree.AS_CHILD);
- return;
- }
-
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- final String label = "OptionPanel.separator." + name;
- return createSeparatorCreator(label);
- }
- }
-
- private class StringOptionCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- return createStringOptionCreator(name);
- }
- }
-
- private class TextBoxOptionCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- final int lines = data.getAttribute("lines", 2);
- return createTextBoxOptionCreator(name, lines);
- }
- }
-
- private class TabCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- final String label = "OptionPanel." + name;
- final String layout = data.getAttribute("layout", null);
- return createTabCreator(label, layout);
- }
- }
-
- private class TextCreator extends PropertyCreator {
- @Override
- public IPropertyControlCreator getCreator(final String name, final XMLElement data) {
- final String label = "OptionPanel.text." + name;
- return createTextCreator(label);
- }
- }
-
- private static final String MAX_INT = Integer.toString(Integer.MAX_VALUE);
- final private IPropertyControlCreator nextLineCreator;
- final private ReadManager readManager;
- final private IndexedTree tree;
-
- public OptionPanelBuilder() {
- readManager = new ReadManager();
- tree = new IndexedTree(null);
- nextLineCreator = new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new NextLineProperty();
- }
- };
- initReadManager();
- }
-
- public void addBooleanProperty(final String path, final String name, final int position) {
- tree.addElement(path, createBooleanOptionCreator(name), path + "/" + name, position);
- }
-
- public void addColorProperty(final String path, final String name, final int position) {
- tree.addElement(path, createColorOptionCreator(name), path + "/" + name, position);
- }
-
- public void addComboProperty(final String path, final String name, final Vector<String> choices,
- final Vector<String> translations, final int position) {
- tree.addElement(path, createComboProperty(name, choices, translations), path + "/" + name, position);
- }
-
- public void addCreator(final String path, final IPropertyControlCreator creator, final int position) {
- tree.addElement(path, creator, position);
- }
-
- public void addCreator(final String path, final IPropertyControlCreator creator, final String name,
- final int position) {
- tree.addElement(path, creator, path + "/" + name, position);
- }
-
- public void addFontProperty(final String path, final String name, final int position) {
- tree.addElement(path, createFontOptionCreator(name), path + "/" + name, position);
- }
-
- public void addKeyProperty(final String path, final String name, final int position) {
- tree.addElement(path, createKeyOptionCreator(name), path + "/" + name, position);
- }
-
- public void addNumberProperty(final String path, final String name, final int min, final int max, final int step,
- final int position) {
- tree.addElement(path, createNumberOptionCreator(name, min, max, step), path + "/" + name, position);
- }
-
- public void addRemindValueProperty(final String path, final String name, final int position) {
- tree.addElement(path, createRemindValueProperty(name), path + "/" + name, position);
- }
-
- public void addSeparator(final String path, final String name, final int position) {
- tree.addElement(path, createSeparatorCreator(name), path + "/" + name, position);
- }
-
- public void addSpace(final String path, final int position) {
- tree.addElement(path, nextLineCreator, position);
- }
-
- public void addStringProperty(final String path, final String name, final int position) {
- tree.addElement(path, createStringOptionCreator(name), path + "/" + name, position);
- }
-
- public void addTab(final String name) {
- addTab(name, null, IndexedTree.AS_CHILD);
- }
-
- public void addTab(final String name, final String layout, final int position) {
- tree.addElement(tree, createTabCreator(name, layout), name, position);
- }
-
- public void addText(final String path, final String name, final int position) {
- tree.addElement(path, createTextCreator(name), path + "/" + name, position);
- }
-
- private IPropertyControlCreator createBooleanOptionCreator(final String name) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new BooleanProperty(name);
- }
- };
- }
-
- private IPropertyControlCreator createColorOptionCreator(final String name) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new ColorProperty(name, ResourceController.getResourceController().getDefaultProperty(name));
- }
- };
- }
-
- private IPropertyControlCreator createComboProperty(final String name, final Vector<String> choices,
- final Vector<String> translations) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new ComboProperty(name, choices, translations);
- }
- };
- }
-
- private IPropertyControlCreator createFontOptionCreator(final String name) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new FontProperty(name);
- }
- };
- }
-
- private IPropertyControlCreator createKeyOptionCreator(final String name) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new KeyProperty(name);
- }
- };
- }
-
- private Object createNumberOptionCreator(final String name, final int min, final int max, final int step) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new NumberProperty(name, min, max, step);
- }
- };
- }
-
- private IPropertyControlCreator createRemindValueProperty(final String name) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new RemindValueProperty(name);
- }
- };
- }
-
- private IPropertyControlCreator createSeparatorCreator(final String label) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new SeparatorProperty(label);
- }
- };
- }
-
- private IPropertyControlCreator createStringOptionCreator(final String name) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new StringProperty(name);
- }
- };
- }
-
- private IPropertyControlCreator createTextBoxOptionCreator(final String name, final int lines) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new TextBoxProperty(name, lines);
- }
- };
- }
-
- private IPropertyControlCreator createTabCreator(final String label, final String layout) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- if (layout != null) {
- return new TabProperty(label, layout);
- }
- return new TabProperty(label);
- }
- };
- }
-
- private IPropertyControlCreator createTextCreator(final String label) {
- return new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- return new Text(label);
- }
- };
- }
-
- ReadManager getReadManager() {
- return readManager;
- }
-
- public DefaultMutableTreeNode getRoot() {
- return getTree().getRoot();
- }
-
- IndexedTree getTree() {
- return tree;
- }
-
- private void initReadManager() {
- readManager.addElementHandler("preferences_structure", new EmptyCreator());
- readManager.addElementHandler("tabbed_pane", new EmptyCreator());
- readManager.addElementHandler("group", new EmptyCreator());
- readManager.addElementHandler("tab", new TabCreator());
- readManager.addElementHandler("separator", new SeparatorCreator());
- readManager.addElementHandler("text", new TextCreator());
- readManager.addElementHandler("string", new StringOptionCreator());
- readManager.addElementHandler("textbox", new TextBoxOptionCreator());
- readManager.addElementHandler("font", new FontOptionCreator());
- readManager.addElementHandler("boolean", new BooleanOptionCreator());
- readManager.addElementHandler("number", new NumberOptionCreator());
- readManager.addElementHandler("path", new PathOptionCreator());
- readManager.addElementHandler("color", new ColorOptionCreator());
- readManager.addElementHandler("combo", new ComboOptionCreator());
- readManager.addElementHandler("languages", new LanguagesComboCreator());
- readManager.addElementHandler("key", new KeyOptionCreator());
- readManager.addElementHandler("remind_value", new RemindValueCreator());
- }
-
- public void load(final URL menu) {
- InputStreamReader reader = null;
- try {
- reader = new InputStreamReader(new BufferedInputStream(menu.openStream()));
- load(reader);
- }
- catch (final IOException e) {
- throw new RuntimeException(e);
- }
- finally {
- FileUtils.silentlyClose(reader);
- }
- }
-
- public void load(final Reader inputStreamReader) {
- final TreeXmlReader treeXmlReader = new TreeXmlReader(readManager);
- try {
- treeXmlReader.load(inputStreamReader);
- }
- catch (final XMLException e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/PathProperty.java b/freeplane/src/org/freeplane/core/resources/components/PathProperty.java
deleted file mode 100644
index bd37470..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/PathProperty.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.io.File;
-import java.util.Arrays;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.JTextField;
-import javax.swing.border.EmptyBorder;
-import javax.swing.filechooser.FileFilter;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.TextUtils;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-/**
- * A PathProperty has an absolute path as a model. It's visual representation
- * is a text field containing the path and a 'browse' button.
- * It's configuration has (non-mandatory) options:
- * - dir [true|false]: if the configured path is a directory
- * - suffixes: a comma-separated string containing allowed suffixes (without the dot)
- */
-public class PathProperty extends PropertyBean implements IPropertyControl {
- private class SelectFileAction implements ActionListener {
- public void actionPerformed(final ActionEvent e) {
- final Object source = e.getSource();
- if (source == selectButton) {
- final JFileChooser chooser = createFileChooser();
- int result = chooser.showOpenDialog(chooser);
- if (result == JFileChooser.APPROVE_OPTION)
- setValue(chooser.getSelectedFile().getAbsolutePath());
- }
- }
- }
-
- final private boolean isDir;
- final private String[] suffixes;
- private String path;
- private JTextField filenameField;
- private JButton selectButton;
-
- public PathProperty(final String name, final boolean isDir, final String[] suffixes) {
- super(name);
- this.isDir = isDir;
- this.suffixes = suffixes;
- }
-
- private JFileChooser createFileChooser() {
- final JFileChooser fileChooser = new JFileChooser();
- if (path != null) {
- fileChooser.setSelectedFile(new File(path));
- }
- FileFilter filter = null;
- if (isDir) {
- fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- }
- else if (suffixes != null) {
- filter = new FileFilter() {
- @Override
- public String getDescription() {
- return Arrays.asList(suffixes).toString();
- }
-
- @Override
- public boolean accept(File f) {
- String extension = FileUtils.getExtension(f);
- for (String suffix : suffixes) {
- if (suffix.equalsIgnoreCase(extension))
- return true;
- }
- return false;
- }
- };
- }
- fileChooser.setFileFilter(filter);
- fileChooser.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent pE) {
- firePropertyChangeEvent();
- }
- });
- return fileChooser;
- }
-
- @Override
- public String getValue() {
- return path;
- }
-
- public void layout(final DefaultFormBuilder builder) {
- final Box box = Box.createHorizontalBox();
- box.setBorder(new EmptyBorder(5, 0, 5, 0));
- filenameField = new JTextField();
- filenameField.setText(path);
- filenameField.addFocusListener(new FocusListener() {
- public void focusLost(FocusEvent e) {
- final String text = filenameField.getText();
- if (text == null || text.length() == 0) {
- filenameField.setText(path);
- JOptionPane.showConfirmDialog(e.getComponent(), TextUtils.getText("OptionPanel.path_property_may_not_be_empty"), "", JOptionPane.WARNING_MESSAGE);
- }
- else {
- path = text;
- }
- }
- public void focusGained(FocusEvent e) {
- }
- });
- box.add(filenameField);
- box.add(Box.createHorizontalStrut(3));
- selectButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(selectButton, TextUtils.getText("browse"));
- selectButton.addActionListener(new SelectFileAction());
- selectButton.setMaximumSize(new Dimension(1000, 1000));
- box.add(selectButton);
- layout(builder, box);
- }
-
- public void setEnabled(final boolean enabled) {
- if (selectButton != null)
- selectButton.setEnabled(enabled);
- if (filenameField != null)
- filenameField.setEnabled(enabled);
- }
-
- @Override
- public void setValue(String value) {
- if (value != null) {
- value = value.replace("{freeplaneuserdir}", ResourceController.getResourceController()
- .getFreeplaneUserDirectory());
- this.path = value;
- }
- else {
- this.path = null;
- }
- if (filenameField != null)
- filenameField.setText(path);
- }
-
- @Override
- protected Component[] getComponents() {
- return new Component[]{filenameField, selectButton};
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/PropertyAction.java b/freeplane/src/org/freeplane/core/resources/components/PropertyAction.java
deleted file mode 100644
index bae2bbc..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/PropertyAction.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.Dialog;
-import java.awt.Frame;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.util.Properties;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.JDialog;
-import javax.swing.JOptionPane;
-import javax.swing.SwingUtilities;
-import javax.swing.WindowConstants;
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.OptionPanel.IOptionPanelFeedback;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-
-/**
- * @author foltin
- */
-public class PropertyAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private final DefaultMutableTreeNode controls;
-
- /**
- * @param controls
- *
- */
- public PropertyAction( final DefaultMutableTreeNode controls) {
- super("PropertyAction");
- this.controls = controls;
- }
-
- public void actionPerformed(final ActionEvent e) {
- JDialog dialog = null;
- if(e != null){
- final Object source = e.getSource();
- if(source instanceof Component){
- final Window window = SwingUtilities.getWindowAncestor((Component) source);
- if(window instanceof Dialog){
- dialog= new JDialog((Dialog)window, true /* modal */);
- }
- else if(window instanceof Frame){
- dialog= new JDialog((Frame)window, true /* modal */);
- }
- }
- }
- if(dialog == null)
- dialog= new JDialog(UITools.getFrame(), true /* modal */);
- dialog.setResizable(true);
- dialog.setUndecorated(false);
- final OptionPanel options = new OptionPanel(dialog, new IOptionPanelFeedback() {
- public void writeProperties(final Properties props) {
- boolean propertiesChanged = false;
- for (final Object keyObject : props.keySet()) {
- final String key = keyObject.toString();
- final String newProperty = props.getProperty(key);
- propertiesChanged = propertiesChanged
- || !newProperty.equals(ResourceController.getResourceController().getProperty(key));
- ResourceController.getResourceController().setProperty(key, newProperty);
- }
- if (propertiesChanged) {
- JOptionPane.showMessageDialog(UITools.getFrame(), TextUtils
- .getText("option_changes_may_require_restart"));
- ResourceController.getResourceController().saveProperties();
- }
- }
- });
- final String marshalled = ResourceController.getResourceController().getProperty(
- OptionPanel.PREFERENCE_STORAGE_PROPERTY);
- final OptionPanelWindowConfigurationStorage storage = OptionPanelWindowConfigurationStorage.decorateDialog(
- marshalled, dialog);
- if (storage != null) {
- options.setSelectedPanel(storage.getPanel());
- }
- options.buildPanel(controls);
- options.setProperties();
- final String title = TextUtils.getText("PropertyAction.dialog");
- dialog.setTitle(title);
- dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- dialog.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(final WindowEvent event) {
- options.closeWindow();
- }
- });
- final Action action = new AbstractAction() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent arg0) {
- options.closeWindow();
- }
- };
- UITools.addEscapeActionToDialog(dialog, action);
- if (storage == null) {
- UITools.setBounds(dialog, -1, -1, dialog.getPreferredSize().width + 50, -1);
- }
- dialog.setVisible(true);
- }
-
- @Override
- public void afterMapChange(final Object newMap) {
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/PropertyAdapter.java b/freeplane/src/org/freeplane/core/resources/components/PropertyAdapter.java
deleted file mode 100644
index 5a06177..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/PropertyAdapter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.TextUtils;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-/**
- * @author Dimitry Polivaev
- * 26.12.2008
- */
-public class PropertyAdapter {
- private String description;
- private String label;
- void setLabel(String label) {
- this.label = label;
- }
-
- private final String name;
-
- public PropertyAdapter(final String name) {
- this(name, "OptionPanel." + name, "OptionPanel." + name + ".tooltip");
- if (ResourceController.getResourceController().getText(description, null) == null) {
- description = null;
- }
- }
-
- public PropertyAdapter(final String name, final String label, final String description) {
- super();
- assert name != null;
- this.name = name;
- this.label = label;
- this.description = description;
- }
-
- public String getDescription() {
- return description;
- }
-
- public String getLabel() {
- return label;
- }
-
- public String getName() {
- return name;
- }
-
- protected void layout(DefaultFormBuilder builder, JComponent component){
- final JLabel label = builder.append(TextUtils.getOptionalText(getLabel()), component);
- String tooltip = TextUtils.getOptionalText(getDescription());
- label.setToolTipText(tooltip);
- component.setToolTipText(tooltip);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/PropertyBean.java b/freeplane/src/org/freeplane/core/resources/components/PropertyBean.java
deleted file mode 100644
index 3a9ffe9..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/PropertyBean.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.List;
-import java.util.Vector;
-
-public abstract class PropertyBean extends PropertyAdapter implements IPropertyControl {
-
- private class MouseClickListener extends MouseAdapter{
- @Override
- public void mousePressed(MouseEvent e) {
- firePropertyChangeEvent();
- }
- }
-
- final private List<PropertyChangeListener> mPropertyChangeListeners = new Vector<PropertyChangeListener>();
- private MouseClickListener mouseCliskListener;
-
- public PropertyBean(final String name) {
- super(name);
- }
-
- public PropertyBean(final String name, final String label, final String description) {
- super(name, label, description);
- }
-
- public void addPropertyChangeListener(final PropertyChangeListener listener) {
- mPropertyChangeListeners.add(listener);
- }
-
- public void fireOnMouseClick(){
- if(mouseCliskListener != null){
- return;
- }
- mouseCliskListener = new MouseClickListener();
- final Component[] components = getComponents();
- for(Component c:components){
- c.addMouseListener(mouseCliskListener);
- }
- }
-
- protected void firePropertyChangeEvent() {
- final PropertyChangeEvent evt = new PropertyChangeEvent(this, getName(), null, getValue());
- for (final PropertyChangeListener l : mPropertyChangeListeners) {
- l.propertyChange(evt);
- }
- }
-
- public abstract String getValue();
-
- public void removePropertyChangeListener(final PropertyChangeListener listener) {
- mPropertyChangeListeners.remove(listener);
- }
-
- public abstract void setValue(String value);
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + "(" + getName() + "->" + getValue() + ")";
- }
-
- protected abstract Component[] getComponents();
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/RemindValueProperty.java b/freeplane/src/org/freeplane/core/resources/components/RemindValueProperty.java
deleted file mode 100644
index d97c0be..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/RemindValueProperty.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JButton;
-
-import org.freeplane.core.util.TextUtils;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-/** implementation of <remind> properties. */
-public class RemindValueProperty extends PropertyBean implements IPropertyControl {
- public static final String DON_T_TOUCH_VALUE = "";
- protected static final int DON_T_TOUCH_VALUE_INT = 2;
- static public final String FALSE_VALUE = "false";
- protected static final int FALSE_VALUE_INT = 1;
- static public final String TRUE_VALUE = "true";
- protected static final int TRUE_VALUE_INT = 0;
- JButton mButton = new JButton();
- int state = 0;
-
- /**
- */
- public RemindValueProperty(final String name) {
- super(name);
- mButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- setState((getState() + 1) % 3);
- firePropertyChangeEvent();
- }
- });
- }
-
- private int getState() {
- return state;
- }
-
- @Override
- public String getValue() {
- switch (state) {
- case TRUE_VALUE_INT:
- return TRUE_VALUE;
- case FALSE_VALUE_INT:
- return FALSE_VALUE;
- case DON_T_TOUCH_VALUE_INT:
- return DON_T_TOUCH_VALUE;
- }
- return null;
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, mButton);
- }
-
- public void setEnabled(final boolean pEnabled) {
- mButton.setEnabled(pEnabled);
- }
-
- /**
- *
- */
- protected void setState(final int newState) {
- state = newState;
- String[] strings;
- strings = new String[3];
- strings[RemindValueProperty.TRUE_VALUE_INT] = TextUtils.getText("OptionalDontShowMeAgainDialog.ok")
- .replaceFirst("&", "");
- strings[RemindValueProperty.FALSE_VALUE_INT] = TextUtils.getText("OptionalDontShowMeAgainDialog.cancel")
- .replaceFirst("&", "");
- strings[RemindValueProperty.DON_T_TOUCH_VALUE_INT] = TextUtils.getText("OptionPanel.ask").replaceFirst("&",
- "");
- mButton.setText(strings[state]);
- }
-
- @Override
- public void setValue(final String value) {
- if (value == null
- || !(value.toLowerCase().equals(TRUE_VALUE) || value.toLowerCase().equals(FALSE_VALUE) || value
- .toLowerCase().equals(DON_T_TOUCH_VALUE))) {
- throw new IllegalArgumentException("Cannot set a boolean to " + value);
- }
- setState(transformString(value));
- }
-
- private int transformString(final String string) {
- if (string == null) {
- return RemindValueProperty.DON_T_TOUCH_VALUE_INT;
- }
- if (string.toLowerCase().equals(TRUE_VALUE)) {
- return RemindValueProperty.TRUE_VALUE_INT;
- }
- if (string.toLowerCase().equals(FALSE_VALUE)) {
- return RemindValueProperty.FALSE_VALUE_INT;
- }
- return RemindValueProperty.DON_T_TOUCH_VALUE_INT;
- }
-
- @Override
- protected Component[] getComponents() {
- return new Component[]{mButton};
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/SeparatorProperty.java b/freeplane/src/org/freeplane/core/resources/components/SeparatorProperty.java
deleted file mode 100644
index 7318829..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/SeparatorProperty.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import org.freeplane.core.util.TextUtils;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class SeparatorProperty implements IPropertyControl {
- private final String label;
-
- public SeparatorProperty(final String label) {
- super();
- this.label = label;
- }
-
- public String getDescription() {
- return null;
- }
-
- public String getLabel() {
- return label;
- }
-
- public String getName() {
- return null;
- }
-
- public void layout(final DefaultFormBuilder builder) {
- builder.appendSeparator(TextUtils.getOptionalText(getLabel()));
- }
-
- public void setEnabled(final boolean pEnabled) {
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/StringProperty.java b/freeplane/src/org/freeplane/core/resources/components/StringProperty.java
deleted file mode 100644
index e5952ea..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/StringProperty.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JTextField;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class StringProperty extends PropertyBean implements IPropertyControl {
- final JTextField mTextField;
-
- /**
- */
- public StringProperty(final String name) {
- super(name);
- mTextField = new JTextField();
- mTextField.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent pE) {
- firePropertyChangeEvent();
- }
- });
- }
-
- @Override
- public String getValue() {
- return mTextField.getText();
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, mTextField);
- }
-
- public void setEnabled(final boolean pEnabled) {
- mTextField.setEnabled(pEnabled);
- }
-
- @Override
- public void setValue(final String value) {
- mTextField.setText(value);
- mTextField.selectAll();
- }
-
- @Override
- protected Component[] getComponents() {
- return new Component[]{mTextField};
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/TabProperty.java b/freeplane/src/org/freeplane/core/resources/components/TabProperty.java
deleted file mode 100644
index f708d6d..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/TabProperty.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-/**
- * @author Dimitry Polivaev
- * 27.12.2008
- */
-public class TabProperty implements IPropertyControl {
- private static final String DEFAULT_LAYOUT_FORMAT = "right:max(40dlu;p), 4dlu, 200dlu:grow, 7dlu";
- final private String label;
- final private String layoutFormat;
-
- public TabProperty(final String label) {
- this(label, TabProperty.DEFAULT_LAYOUT_FORMAT);
- }
-
- public TabProperty(final String label, final String layoutFormat) {
- super();
- this.label = label;
- this.layoutFormat = layoutFormat;
- }
-
- public String getDescription() {
- return layoutFormat;
- }
-
- public String getLabel() {
- return label;
- }
-
- public String getName() {
- return null;
- }
-
- public void layout(final DefaultFormBuilder builder) {
- }
-
- public void setEnabled(final boolean pEnabled) {
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/Text.java b/freeplane/src/org/freeplane/core/resources/components/Text.java
deleted file mode 100644
index 71048b6..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/Text.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import javax.swing.JLabel;
-
-import org.freeplane.core.util.TextUtils;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class Text implements IPropertyControl {
- private final String label;
-
- public Text(final String label) {
- super();
- this.label = label;
- }
-
- public String getDescription() {
- return null;
- }
-
- public String getLabel() {
- return label;
- }
-
- public String getName() {
- return null;
- }
-
- public void layout(final DefaultFormBuilder builder) {
- builder.append(new JLabel(TextUtils.getOptionalText(getLabel())), builder.getColumnCount()
- - builder.getColumn() + 1);
- builder.nextLine();
- }
-
- public void setEnabled(final boolean pEnabled) {
- }
-}
diff --git a/freeplane/src/org/freeplane/core/resources/components/TextBoxProperty.java b/freeplane/src/org/freeplane/core/resources/components/TextBoxProperty.java
deleted file mode 100644
index a3db8bf..0000000
--- a/freeplane/src/org/freeplane/core/resources/components/TextBoxProperty.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Felix Natter in 2013.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.resources.components;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.BorderFactory;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-public class TextBoxProperty extends PropertyBean implements IPropertyControl {
- final JTextArea mTextArea;
-
- /**
- */
- public TextBoxProperty(final String name, final int lines) {
- super(name);
- mTextArea = new JTextArea(lines, 70);
-// mTextArea.setBorder(BorderFactory.createLineBorder(Color.black));
- mTextArea.setLineWrap(true);
- }
-
- @Override
- public String getValue() {
- return mTextArea.getText();
- }
-
- public void layout(final DefaultFormBuilder builder) {
- JScrollPane scrollPane = new JScrollPane(mTextArea);
- scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
- scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
- layout(builder, scrollPane);
- }
-
- public void setEnabled(final boolean pEnabled) {
- mTextArea.setEnabled(pEnabled);
- }
-
- @Override
- public void setValue(final String value) {
- mTextArea.setText(value);
- mTextArea.selectAll();
- }
-
- @Override
- protected Component[] getComponents() {
- return new Component[]{ mTextArea };
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/AFreeplaneAction.java b/freeplane/src/org/freeplane/core/ui/AFreeplaneAction.java
deleted file mode 100644
index 304a22a..0000000
--- a/freeplane/src/org/freeplane/core/ui/AFreeplaneAction.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-
-/**
- * @author Dimitry Polivaev
- */
-public abstract class AFreeplaneAction extends AbstractAction implements IFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- static public boolean checkEnabledOnChange(final AFreeplaneAction action) {
- final EnabledAction annotation = action.getClass().getAnnotation(EnabledAction.class);
- if (annotation == null) {
- return false;
- }
- return annotation.checkOnNodeChange();
- }
-
- static public boolean checkSelectionOnChange(final AFreeplaneAction action) {
- final SelectableAction annotation = action.getClass().getAnnotation(SelectableAction.class);
- if (annotation == null) {
- return false;
- }
- return annotation.checkOnNodeChange();
- }
-
- static public boolean checkSelectionOnPropertyChange(final AFreeplaneAction action) {
- final SelectableAction annotation = action.getClass().getAnnotation(SelectableAction.class);
- if (annotation == null) {
- return false;
- }
- return !"".equals(annotation.checkOnPropertyChange());
- }
-
- static public boolean checkSelectionOnPopup(final AFreeplaneAction action) {
- final SelectableAction annotation = action.getClass().getAnnotation(SelectableAction.class);
- if (annotation == null) {
- return false;
- }
- return annotation.checkOnPopup();
- }
-
- final private String key;
- private boolean selected = false;
-
- static private Map<String, ImageIcon> iconCache = new HashMap<String, ImageIcon>();
-
- public AFreeplaneAction(final String key) {
- super();
- this.key = key;
- MenuBuilder.setLabelAndMnemonic(this, TextUtils.getRawText(getTextKey()));
- final String iconKey = getIconKey();
- final ImageIcon cachedIcon = iconCache.get(iconKey);
- if(cachedIcon != null){
- putValue(SMALL_ICON, cachedIcon);
- }
- else{
- final String iconResource = ResourceController.getResourceController().getProperty(iconKey, null);
- if (iconResource != null) {
- final URL url = ResourceController.getResourceController().getResource(iconResource);
- if (url == null) {
- LogUtils.severe("can not load icon '" + iconResource + "'");
- }
- else {
- final ImageIcon icon = new ImageIcon(url);
- putValue(SMALL_ICON, icon);
- iconCache.put(iconKey, icon);
- }
- }
- }
- final String tooltip = TextUtils.getRawText(getTooltipKey(), null);
- if (tooltip != null && !"".equals(tooltip)) {
- putValue(Action.SHORT_DESCRIPTION, tooltip);
- putValue(Action.LONG_DESCRIPTION, tooltip);
- }
- // System.out.println(key);
- }
-
- // /**
- // * @param controller
- // * @param string
- // */
- // private AFreeplaneAction( final String titleKey) {
- // this();
- // }
- //
- public AFreeplaneAction(final String key, final String title, final Icon icon) {
-// this.controller = controller;
- putValue(SMALL_ICON, icon);
- if (title != null && !title.equals("")) {
- MenuBuilder.setLabelAndMnemonic(this, title);
- }
- this.key = key;
- }
-
- public void afterMapChange(final Object newMap) {
- if (newMap == null) {
- if (super.isEnabled()) {
- setEnabled(false);
- }
- }
- else {
- if (!super.isEnabled()) {
- setEnabled(true);
- }
- setEnabled();
- }
- }
-
- public final String getIconKey() {
- return key + ".icon";
- }
-
- public String getKey() {
- return key;
- }
-
- final String getTextKey() {
- return key + ".text";
- }
-
- public final String getTooltipKey() {
- return key + ".tooltip";
- }
-
- public boolean isSelected() {
- return selected;
- }
-
- public void setEnabled() {
- }
-
- public void setSelected() {
- }
-
- public void setSelected(final boolean newValue) {
- final boolean oldValue = selected;
- if (oldValue != newValue) {
- selected = newValue;
- firePropertyChange(SelectableAction.SELECTION_PROPERTY, Boolean.valueOf(oldValue), Boolean
- .valueOf(newValue));
- }
- }
-
- public void setVisible() {
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/AccelerateableAction.java b/freeplane/src/org/freeplane/core/ui/AccelerateableAction.java
deleted file mode 100644
index 4a62517..0000000
--- a/freeplane/src/org/freeplane/core/ui/AccelerateableAction.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import java.awt.Component;
-import java.awt.Event;
-import java.awt.Frame;
-import java.awt.event.ActionEvent;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.KeyEvent;
-import java.beans.PropertyChangeListener;
-
-import javax.swing.JDialog;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.KeyStroke;
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.GrabKeyDialog;
-import org.freeplane.core.resources.components.IKeystrokeValidator;
-import org.freeplane.core.ui.IEditHandler.FirstAction;
-import org.freeplane.core.ui.IndexedTree.Node;
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.core.ui.components.IKeyBindingManager;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.MenuUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- * 20.04.2009
- */
-public class AccelerateableAction implements IFreeplaneAction {
- private class KeystrokeValidator implements IKeystrokeValidator {
- private final Component parentComponent;
- private final Object key;
- private final JMenuItem editedItem;
-
- private KeystrokeValidator(Component parentComponent, Object key, JMenuItem editedItem) {
- this.parentComponent = parentComponent;
- this.key = key;
- this.editedItem = editedItem;
- }
-
- private boolean checkForOverwriteShortcut(final DefaultMutableTreeNode menubarNode, final KeyStroke keystroke) {
- final Node priorAssigned = MenuUtils.findAssignedMenuItemNodeRecursively(menubarNode, keystroke);
- if (priorAssigned == null || editedItem.equals(priorAssigned.getUserObject())) {
- return true;
- }
- return replaceOrCancel(priorAssigned, ((JMenuItem) priorAssigned.getUserObject()).getText());
- }
-
- private boolean replaceOrCancel(Node menuItemNode, String oldMenuItemTitle) {
- if (askForReplaceShortcutViaDialog(oldMenuItemTitle, parentComponent)) {
- menuBuilder.setAccelerator(menuItemNode, null);
- final String shortcutKey = menuBuilder.getShortcutKey(menuItemNode.getKey().toString());
- ResourceController.getResourceController().setProperty(shortcutKey, "");
- return true;
- } else {
- return false;
- }
- }
-
- public boolean isValid(final KeyStroke keystroke, final Character keyChar) {
- if (keystroke == null) {
- return true;
- }
- final Node menuBarNode = menuBuilder.getMenuBar(menuBuilder.get(key));
- if (menuBarNode == null) {
- return true;
- }
- if (keyChar != KeyEvent.CHAR_UNDEFINED
- && (keystroke.getModifiers() & (Event.ALT_MASK | Event.CTRL_MASK | Event.META_MASK)) == 0) {
- final String keyTypeActionString = ResourceController.getResourceController().getProperty("key_type_action", FirstAction.EDIT_CURRENT.toString());
- FirstAction keyTypeAction = FirstAction.valueOf(keyTypeActionString);
- return FirstAction.IGNORE.equals(keyTypeAction);
- }
- if ((keystroke.getModifiers() & (Event.ALT_MASK | Event.CTRL_MASK | Event.META_MASK)) == Event.ALT_MASK) {
- final JMenuBar menuBar = (JMenuBar) menuBarNode.getUserObject();
- final int menuCount = menuBar.getMenuCount();
- for (int i = 0; i < menuCount; i++) {
- final JMenu menu = menuBar.getMenu(i);
- final char c = (char) menu.getMnemonic();
- if (Character.toLowerCase(keystroke.getKeyCode()) == Character.toLowerCase(c)) {
- JOptionPane.showMessageDialog(parentComponent, menu.getText(), TextUtils
- .getText("used_in_menu"), JOptionPane.WARNING_MESSAGE);
- return false;
- }
- }
- }
- if (!checkForOverwriteShortcut(menuBarNode, keystroke)) {
- return false;
- }
- final KeyStroke derivedKS = FreeplaneMenuBar.derive(keystroke, keyChar);
- if (derivedKS == keystroke) {
- return true;
- }
- return checkForOverwriteShortcut(menuBarNode, derivedKS);
- }
- }
-
- private final MenuBuilder menuBuilder;
- final private AFreeplaneAction originalAction;
- private static JDialog setAcceleratorOnNextClickActionDialog;
- private static KeyStroke acceleratorForNextClickedAction;
-
- static boolean isNewAcceleratorOnNextClickEnabled() {
- return setAcceleratorOnNextClickActionDialog != null;
- }
-
- private static final String SET_ACCELERATOR_ON_NEXT_CLICK_ACTION = "set_accelerator_on_next_click_action";
-
- static void setNewAcceleratorOnNextClick(KeyStroke accelerator) {
- if (AccelerateableAction.isNewAcceleratorOnNextClickEnabled()) {
- return;
- }
- acceleratorForNextClickedAction = accelerator;
- String title = TextUtils.getText("SetAccelerator.dialogTitle");
- String text = TextUtils.getText(SET_ACCELERATOR_ON_NEXT_CLICK_ACTION);
- if(accelerator != null)
- text = TextUtils.format("SetAccelerator.keystrokeDetected", toString(accelerator)) + "\n" + text;
- final Frame frame = Controller.getCurrentController().getViewController().getFrame();
- setAcceleratorOnNextClickActionDialog = UITools.createCancelDialog(frame, title, text);
- setAcceleratorOnNextClickActionDialog.addComponentListener(new ComponentAdapter() {
- @Override
- public void componentHidden(final ComponentEvent e) {
- setAcceleratorOnNextClickActionDialog = null;
- acceleratorForNextClickedAction = null;
- }
- });
- setAcceleratorOnNextClickActionDialog.setVisible(true);
- }
-
- public AccelerateableAction(final MenuBuilder menuBuilder, final AFreeplaneAction originalAction) {
- super();
- this.menuBuilder = menuBuilder;
- this.originalAction = originalAction;
- }
-
- public void actionPerformed(final ActionEvent e) {
- final boolean newAcceleratorOnNextClickEnabled = AccelerateableAction.isNewAcceleratorOnNextClickEnabled();
- final KeyStroke newAccelerator = acceleratorForNextClickedAction;
- if (newAcceleratorOnNextClickEnabled) {
- setAcceleratorOnNextClickActionDialog.setVisible(false);
- }
- final Object source = e.getSource();
- if ((newAcceleratorOnNextClickEnabled || 0 != (e.getModifiers() & ActionEvent.CTRL_MASK))
- && source instanceof IKeyBindingManager && !((IKeyBindingManager) source).isKeyBindingProcessed()
- && source instanceof JMenuItem) {
- final JMenuItem item = (JMenuItem) source;
- newAccelerator(item, newAccelerator);
- return;
- }
- originalAction.actionPerformed(e);
- }
-
- public void addPropertyChangeListener(final PropertyChangeListener listener) {
- originalAction.addPropertyChangeListener(listener);
- }
-
- public void afterMapChange(final Object newMap) {
- originalAction.afterMapChange(newMap);
- }
-
- public Object getValue(final String key) {
- return originalAction.getValue(key);
- }
-
- public boolean isEnabled() {
- return originalAction.isEnabled();
- }
-
- public boolean isSelected() {
- return originalAction.isSelected();
- }
-
- public void setSelected(boolean newValue) {
- originalAction.setSelected(newValue);
- }
-
- public void newAccelerator(final JMenuItem editedItem, final KeyStroke newAccelerator) {
- final Object key = menuBuilder.getKeyByUserObject(editedItem);
- final String shortcutKey = menuBuilder.getShortcutKey(key.toString());
- final String oldShortcut = ResourceController.getResourceController().getProperty(shortcutKey);
- if (newAccelerator == null
- || !new KeystrokeValidator(editedItem, key, editedItem).isValid(newAccelerator,
- newAccelerator.getKeyChar())) {
- final GrabKeyDialog grabKeyDialog = new GrabKeyDialog(oldShortcut);
- final IKeystrokeValidator validator = new KeystrokeValidator(grabKeyDialog, key, editedItem);
- grabKeyDialog.setValidator(validator);
- grabKeyDialog.setVisible(true);
- if (grabKeyDialog.isOK()) {
- final String shortcut = grabKeyDialog.getShortcut();
- final KeyStroke accelerator = UITools.getKeyStroke(shortcut);
- menuBuilder.setAccelerator((Node) menuBuilder.get(key), accelerator);
- ResourceController.getResourceController().setProperty(shortcutKey, shortcut);
- LogUtils.info("created shortcut '" + shortcut + "' for menuitem '" + key + "', shortcutKey '"
- + shortcutKey + "' (" + editedItem.getText() + ")");
- }
- }
- else{
- if(oldShortcut != null){
- final int replace = JOptionPane.showConfirmDialog(
- editedItem,
- oldShortcut,
- TextUtils.getText("remove_shortcut_question"), JOptionPane.YES_NO_OPTION);
- if (replace != JOptionPane.YES_OPTION) {
- return;
- }
- }
- menuBuilder.setAccelerator((Node) menuBuilder.get(key), newAccelerator);
- ResourceController.getResourceController().setProperty(shortcutKey, toString(newAccelerator));
- LogUtils.info("created shortcut '" + toString(newAccelerator) + "' for menuitem '" + key
- + "', shortcutKey '" + shortcutKey + "' (" + editedItem.getText() + ")");
- }
- }
-
- private static String toString(final KeyStroke newAccelerator) {
- return newAccelerator.toString().replaceFirst("pressed ", "");
- }
-
- private static boolean askForReplaceShortcutViaDialog(String oldMenuItemTitle, Component parentComponent) {
- final int replace = JOptionPane.showConfirmDialog(parentComponent,
- TextUtils.format("replace_shortcut_question", oldMenuItemTitle),
- TextUtils.format("replace_shortcut_title"), JOptionPane.YES_NO_OPTION);
- return replace == JOptionPane.YES_OPTION;
- }
-
- public void putValue(final String key, final Object value) {
- originalAction.putValue(key, value);
- }
-
- public void removePropertyChangeListener(final PropertyChangeListener listener) {
- originalAction.removePropertyChangeListener(listener);
- }
-
- public void setEnabled(final boolean b) {
- originalAction.setEnabled(b);
- }
-
- public String getIconKey() {
- return originalAction.getIconKey();
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/ColorTracker.java b/freeplane/src/org/freeplane/core/ui/ColorTracker.java
deleted file mode 100644
index c4ac13d..0000000
--- a/freeplane/src/org/freeplane/core/ui/ColorTracker.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.HeadlessException;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.Serializable;
-
-import javax.swing.JButton;
-import javax.swing.JColorChooser;
-import javax.swing.JDialog;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-public class ColorTracker implements ActionListener, Serializable {
- static class Closer extends WindowAdapter implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Override
- public void windowClosing(final WindowEvent e) {
- e.getWindow().setVisible(false);
- e.getWindow().dispose();
- }
- }
-
- static class DisposeOnClose extends ComponentAdapter implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Override
- public void componentHidden(final ComponentEvent e) {
- final Window w = (Window) e.getComponent();
- w.dispose();
- }
- }
-
- static JColorChooser colorChooser = new JColorChooser();
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /** Static JColorChooser to have the recent color^^s feature. */
- static public JColorChooser getCommonJColorChooser() {
- return ColorTracker.colorChooser;
- }
-
- public static Color showCommonJColorChooserDialog(final Component component, final String title,
- final Color initialColor, final Color defaultColor) {
- final JColorChooser pane = ColorTracker.getCommonJColorChooser();
- pane.setColor(initialColor);
- final ColorTracker ok = new ColorTracker(pane);
- final JDialog dialog = JColorChooser.createDialog(component, title, true, pane, ok, null);
- final Container container = (Container) dialog.getContentPane().getComponent(1);
- if(defaultColor != null){
- final JButton defaultBtn = new JButton(TextUtils.getText("reset_to_default"));
- defaultBtn.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- dialog.dispose();
- ok.setColor(defaultColor);
- }
- });
- container.add(defaultBtn);
- }
- dialog.addWindowListener(new Closer());
- dialog.addComponentListener(new DisposeOnClose());
- dialog.setVisible(true);
- return ok.getColor();
- }
-
- public static Color showCommonJColorChooserDialog( final NodeModel nodeModel,
- final String title, final Color initialColor, Color defaultColor)
- throws HeadlessException {
- Controller controller = Controller.getCurrentController();
- final Component component = controller.getMapViewManager().getComponent(nodeModel);
- return ColorTracker.showCommonJColorChooserDialog(component, title, initialColor, defaultColor);
- }
-
- final private JColorChooser chooser;
- private Color color;
-
- ColorTracker(final JColorChooser c) {
- chooser = c;
- }
-
- public void actionPerformed(final ActionEvent e) {
- color = chooser.getColor();
- }
-
- Color getColor() {
- return color;
- }
-
- protected void setColor(final Color color) {
- this.color = color;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/IAcceleratorChangeListener.java b/freeplane/src/org/freeplane/core/ui/IAcceleratorChangeListener.java
deleted file mode 100644
index 8edfe40..0000000
--- a/freeplane/src/org/freeplane/core/ui/IAcceleratorChangeListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import javax.swing.JMenuItem;
-import javax.swing.KeyStroke;
-
-/**
- * @author Dimitry Polivaev
- * 03.07.2009
- */
-public interface IAcceleratorChangeListener {
- void acceleratorChanged(JMenuItem action, KeyStroke oldStroke, KeyStroke newStroke);
-}
diff --git a/freeplane/src/org/freeplane/core/ui/IKeyStrokeInterceptor.java b/freeplane/src/org/freeplane/core/ui/IKeyStrokeInterceptor.java
deleted file mode 100644
index 2dbbde4..0000000
--- a/freeplane/src/org/freeplane/core/ui/IKeyStrokeInterceptor.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 17.01.2012
- */
-package org.freeplane.core.ui;
-
-import java.awt.event.KeyEvent;
-
-import javax.swing.KeyStroke;
-
-/**
- *
- */
-public interface IKeyStrokeInterceptor {
- public boolean interceptKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed);
-
-}
diff --git a/freeplane/src/org/freeplane/core/ui/IMenuContributor.java b/freeplane/src/org/freeplane/core/ui/IMenuContributor.java
deleted file mode 100644
index 236fa34..0000000
--- a/freeplane/src/org/freeplane/core/ui/IMenuContributor.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import org.freeplane.features.mode.ModeController;
-
-public interface IMenuContributor {
- public void updateMenus(final ModeController modeController, final MenuBuilder builder);
-}
diff --git a/freeplane/src/org/freeplane/core/ui/IUserInputListenerFactory.java b/freeplane/src/org/freeplane/core/ui/IUserInputListenerFactory.java
deleted file mode 100644
index 3ea8e2b..0000000
--- a/freeplane/src/org/freeplane/core/ui/IUserInputListenerFactory.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import java.awt.dnd.DragGestureListener;
-import java.awt.dnd.DropTargetListener;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseWheelListener;
-import java.util.Set;
-
-import javax.swing.JComponent;
-import javax.swing.JPopupMenu;
-
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-
-public interface IUserInputListenerFactory {
- void addMouseWheelEventHandler(final IMouseWheelEventHandler handler);
-
- void addToolBar(final String name, final int position, final JComponent toolBar);
-
- IMouseListener getMapMouseListener();
-
- MouseWheelListener getMapMouseWheelListener();
-
- JPopupMenu getMapPopup();
-
- FreeplaneMenuBar getMenuBar();
-
- MenuBuilder getMenuBuilder();
-
- public Set<IMouseWheelEventHandler> getMouseWheelEventHandlers();
-
- DragGestureListener getNodeDragListener();
-
- DropTargetListener getNodeDropTargetListener();
-
- KeyListener getNodeKeyListener();
-
- IMouseListener getNodeMouseMotionListener();
-
- JPopupMenu getNodePopupMenu();
-
- JComponent getToolBar(String name);
-
- Iterable<JComponent> getToolBars(int position);
-
- public void removeMouseWheelEventHandler(final IMouseWheelEventHandler handler);
-
- void updateMapList();
-
- public void updateMenus(String menuStructureResource, Set<String> plugins);
-}
diff --git a/freeplane/src/org/freeplane/core/ui/IndexedTree.java b/freeplane/src/org/freeplane/core/ui/IndexedTree.java
deleted file mode 100644
index cdbcc58..0000000
--- a/freeplane/src/org/freeplane/core/ui/IndexedTree.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import java.util.AbstractCollection;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.freeplane.core.util.LogUtils;
-
-/**
- * @author Dimitry Polivaev
- * 25.12.2008
- */
-public class IndexedTree {
- public static class Node extends DefaultMutableTreeNode {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Object key;
-
- Node(final Object userObject) {
- super(userObject);
- }
-
- Node(final Object userObject, final Object key) {
- this(userObject);
- this.key = key;
- }
-
- public Object getKey() {
- return key;
- }
- }
-
- private final class UserObjects extends AbstractCollection<Object> {
- @Override
- public void clear() {
- string2Element.clear();
- }
-
- @Override
- public boolean contains(final Object o) {
- final Iterator<Object> iterator = iterator();
- while (iterator.hasNext()) {
- final Object next = iterator.next();
- if (o != null) {
- if (o.equals(next)) {
- return true;
- }
- }
- if (next == null) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- public Iterator<Object> iterator() {
- return newObjectIterator();
- }
-
- @Override
- public int size() {
- return string2Element.size();
- }
- }
-
- public static final int AFTER = 1;
- public static final int AS_CHILD = 0;
- public static final int BEFORE = -1;
- private final HashMap<Object, Node> string2Element;
-
- public IndexedTree(final Object root) {
- super();
- final Node rootNode = new Node(root);
- string2Element = new HashMap<Object, Node>();
- string2Element.put(this, rootNode);
- }
-
- public DefaultMutableTreeNode addElement(final Object relativeKey, final Object element, final int position) {
- final DefaultMutableTreeNode relativeNode = getNode(relativeKey);
- final DefaultMutableTreeNode node = new Node(element);
- if (relativeNode == null) {
- return node;
- }
- addNode(relativeNode, node, position);
- return node;
- }
-
- public DefaultMutableTreeNode addElement(final Object relativeKey, final Object element, final Object key,
- final int position) {
- final DefaultMutableTreeNode existingNode = get(key);
- if (existingNode != null) {
- throw new KeyAlreadyUsedException(key.toString() + " added twice");
- }
- final DefaultMutableTreeNode relativeNode = getNode(relativeKey);
- if (relativeNode == null) {
- return null;
- }
- final Node node = new Node(element, key);
- addNode(relativeNode, node, position);
- string2Element.put(key, node);
- return node;
- }
-
- protected void addNode(final DefaultMutableTreeNode relativeNode, final DefaultMutableTreeNode node,
- final int position) {
- switch (position) {
- case AS_CHILD:
- relativeNode.add(node);
- break;
- case BEFORE: {
- final DefaultMutableTreeNode parent = (DefaultMutableTreeNode) relativeNode.getParent();
- if (parent == null) {
- throw new RuntimeException("relative node has no parent element");
- }
- final int index = parent.getIndex(relativeNode);
- parent.insert(node, index);
- break;
- }
- case AFTER:
- final DefaultMutableTreeNode parent = (DefaultMutableTreeNode) relativeNode.getParent();
- if (parent == null) {
- throw new RuntimeException("relative node has no parent element");
- }
- final int index = parent.getIndex(relativeNode);
- parent.insert(node, index + 1);
- break;
- default:
- throw new RuntimeException("wrong position");
- }
- }
-
- public boolean contains(final Object key) {
- return string2Element.containsKey(key);
- }
-
- public String dump() {
- return string2Element.toString();
- }
-
- public DefaultMutableTreeNode get(final Object key) {
- final Object object = string2Element.get(key);
- if (object == null) {
- return null;
- }
- return (DefaultMutableTreeNode) object;
- }
-
- public Object getKeyByUserObject(final Object object) {
- final Collection<Node> values = string2Element.values();
- for (final Node node : values) {
- if (object != null && object.equals(node.getUserObject())) {
- return node.getKey();
- }
- }
- return null;
- }
-
- protected DefaultMutableTreeNode getNode(final Object key) {
- final DefaultMutableTreeNode node = (string2Element.get(key));
- if (node == null) {
- LogUtils.warn(key + " not found");
- }
- return node;
- }
-
- public DefaultMutableTreeNode getRoot() {
- return string2Element.get(this);
- }
-
- public Collection<Object> getUserObjects() {
- return Collections.unmodifiableCollection(new UserObjects());
- }
-
- public Iterator<Object> newObjectIterator() {
- return new Iterator<Object>() {
- private final Iterator<Node> nodeIterator = string2Element.values().iterator();
-
- public boolean hasNext() {
- return nodeIterator.hasNext();
- }
-
- public Object next() {
- return nodeIterator.next().getUserObject();
- }
-
- public void remove() {
- nodeIterator.remove();
- }
- };
- }
-
- public void removeChildElements(final Object key) {
- final DefaultMutableTreeNode node = getNode(key);
- final Enumeration<?> children = node.children();
- while (children.hasMoreElements()) {
- final Node child = (Node) children.nextElement();
- final Object childKey = child.getKey();
- if (childKey != null) {
- removeChildElements(childKey);
- string2Element.remove(childKey);
- }
- }
- node.removeAllChildren();
- }
-
- /**
- */
- protected void removeChildKeys(final Node node) {
- final Enumeration<?> children = node.children();
- while (children.hasMoreElements()) {
- final Node child = (Node) children.nextElement();
- string2Element.remove(child.getKey());
- removeChildKeys(child);
- }
- }
-
- public DefaultMutableTreeNode removeElement(final Object key) {
- final DefaultMutableTreeNode node = (string2Element.remove(key));
- if (node != null) {
- removeChildKeys((Node) node);
- }
- return node;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/MenuBuilder.java b/freeplane/src/org/freeplane/core/ui/MenuBuilder.java
deleted file mode 100644
index 760d721..0000000
--- a/freeplane/src/org/freeplane/core/ui/MenuBuilder.java
+++ /dev/null
@@ -1,928 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Insets;
-import java.awt.Toolkit;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.ref.WeakReference;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Set;
-
-import javax.swing.AbstractButton;
-import javax.swing.Action;
-import javax.swing.ButtonGroup;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.JRadioButtonMenuItem;
-import javax.swing.JToolBar;
-import javax.swing.KeyStroke;
-import javax.swing.SwingConstants;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.freeplane.core.io.IElementHandler;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.xml.TreeXmlReader;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.SetBooleanPropertyAction;
-import org.freeplane.core.ui.components.JAutoCheckBoxMenuItem;
-import org.freeplane.core.ui.components.JAutoRadioButtonMenuItem;
-import org.freeplane.core.ui.components.JAutoToggleButton;
-import org.freeplane.core.ui.components.JFreeplaneMenuItem;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class MenuBuilder extends UIBuilder {
- private static class ActionHolder implements INameMnemonicHolder {
- final private Action action;
-
- public ActionHolder(final Action action) {
- super();
- this.action = action;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.Tools.IAbstractButton#getText()
- */
- public String getText() {
- return (String) action.getValue(Action.NAME);
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.main.Tools.IAbstractButton#setDisplayedMnemonicIndex(int)
- */
- public void setDisplayedMnemonicIndex(final int mnemoSignIndex) {
- action.putValue("SwingDisplayedMnemonicIndexKey", mnemoSignIndex);
-
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.Tools.IAbstractButton#setMnemonic(char)
- */
- public void setMnemonic(final char charAfterMnemoSign) {
- int vk = charAfterMnemoSign;
- if (vk >= 'a' && vk <= 'z') {
- vk -= ('a' - 'A');
- }
- action.putValue(Action.MNEMONIC_KEY, new Integer(vk));
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.Tools.IAbstractButton#setText(java.lang.String)
- */
- public void setText(final String text) {
- action.putValue(Action.NAME, text);
- }
- }
-
- public static class ButtonHolder implements INameMnemonicHolder {
- final private AbstractButton btn;
-
- public ButtonHolder(final AbstractButton btn) {
- super();
- this.btn = btn;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.Tools.IAbstractButton#getText()
- */
- public String getText() {
- return btn.getText();
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.main.Tools.IAbstractButton#setDisplayedMnemonicIndex(int)
- */
- public void setDisplayedMnemonicIndex(final int mnemoSignIndex) {
- btn.setDisplayedMnemonicIndex(mnemoSignIndex);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.Tools.IAbstractButton#setMnemonic(char)
- */
- public void setMnemonic(final char charAfterMnemoSign) {
- btn.setMnemonic(charAfterMnemoSign);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.Tools.IAbstractButton#setText(java.lang.String)
- */
- public void setText(final String text) {
- btn.setText(text);
- }
- }
-
- static private class DelegatingPopupMenuListener implements PopupMenuListener {
- final private PopupMenuListener listener;
- final private Object source;
-
- public DelegatingPopupMenuListener(final PopupMenuListener listener, final Object source) {
- super();
- this.listener = listener;
- this.source = source;
- }
-
- public Object getSource() {
- return source;
- }
-
- private PopupMenuEvent newEvent() {
- return new PopupMenuEvent(source);
- }
-
- public void popupMenuCanceled(final PopupMenuEvent e) {
- listener.popupMenuCanceled(newEvent());
- }
-
- public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
- listener.popupMenuWillBecomeInvisible(newEvent());
- }
-
- public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
- listener.popupMenuWillBecomeVisible(newEvent());
- }
- }
-
- static private class Enabler implements PropertyChangeListener {
- final private WeakReference<Component> comp;
-
- public Enabler(final Component comp) {
- this.comp = new WeakReference<Component>(comp);
- }
-
- public void propertyChange(final PropertyChangeEvent evt) {
- final Component component = comp.get();
- if (component == null) {
- final Action action = (Action) evt.getSource();
- action.removePropertyChangeListener(this);
- }
- else if (evt.getPropertyName().equals("enabled")) {
- final Action action = (Action) evt.getSource();
- component.setEnabled(action.isEnabled());
- }
- }
- }
-
- interface INameMnemonicHolder {
- /**
- */
- String getText();
-
- /**
- */
- void setDisplayedMnemonicIndex(int mnemoSignIndex);
-
- /**
- */
- void setMnemonic(char charAfterMnemoSign);
-
- /**
- */
- void setText(String replaceAll);
- }
-
- private static class MenuPath {
- static MenuPath emptyPath() {
- final MenuPath menuPath = new MenuPath("");
- menuPath.key = "";
- return menuPath;
- }
-
- String parentKey;
- String key;
-
- MenuPath(final String key) {
- parentKey = key;
- }
-
- void setKey(final String name) {
- key = name;
- }
-
- void setLastKeySection(final String name) {
- key = parentKey + '/' + name;
- }
-
- @Override
- public String toString() {
- return key;
- }
- }
-
- private class MenuStructureReader {
- private final class ActionCreator implements IElementHandler {
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (attributes == null) {
- return null;
- }
- final MenuPath menuPath = new MenuPath(parent.toString());
- final String action = attributes.getAttribute("action", null);
- final String plugin = attributes.getAttribute("plugin", null);
- if(plugin != null && ! plugins.contains(plugin))
- return null;
- try {
- AFreeplaneAction theAction = modeController.getAction(action);
- if (theAction == null) {
- if(action.startsWith("SetBooleanPropertyAction.")){
- String propertyName = action.substring("SetBooleanPropertyAction.".length());
- theAction = new SetBooleanPropertyAction(propertyName);
- modeController.addAction(theAction);
- }
- else{
- LogUtils.severe("action " + action + " not found");
- return null;
- }
- }
- String menuKey = attributes.getAttribute("menu_key", null);
- if(menuKey == null)
- menuKey = getMenuKey(menuPath.parentKey, theAction.getKey());
- menuPath.setKey(menuKey);
- String accelerator = attributes.getAttribute("accelerator", null);
- if (accelerator != null) {
- if (Compat.isMacOsX()) {
- accelerator = accelerator.replaceFirst("CONTROL", "META").replaceFirst("control", "meta");
- }
- setDefaultAccelerator(menuPath.key, accelerator);
- }
- if (tag.equals("menu_radio_action")) {
- final JRadioButtonMenuItem item = (JRadioButtonMenuItem)
- addRadioItem(menuPath.parentKey, menuPath.key, theAction, "true".equals(attributes.getAttribute("selected", "false")));
- if (buttonGroup == null) {
- buttonGroup = new ButtonGroup();
- }
- buttonGroup.add(item);
- }
- else {
- addAction(menuPath.parentKey, menuPath.key, theAction, MenuBuilder.AS_CHILD);
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- return menuPath;
- }
- }
-
- private final class CategoryCreator implements IElementHandler {
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (attributes == null) {
- return null;
- }
- final String plugin = attributes.getAttribute("plugin", null);
- if(plugin != null && ! plugins.contains(plugin))
- return null;
- buttonGroup = null;
- final MenuPath menuPath = new MenuPath(parent.toString());
- final String menuKey = attributes.getAttribute("menu_key", null);
- if(menuKey == null)
- menuPath.setLastKeySection(attributes.getAttribute("name", null));
- else
- menuPath.setKey(menuKey);
- if (!contains(menuPath.key)) {
- if (tag.equals("menu_submenu")) {
- final JMenu menuItem = new JMenu();
- String nameRef = attributes.getAttribute("name_ref", null);
- if(nameRef == null)
- nameRef = attributes.getAttribute("name", null);
- final String iconResource = ResourceController.getResourceController().getProperty(nameRef + ".icon", null);
- MenuBuilder.setLabelAndMnemonic(menuItem, TextUtils.getRawText(nameRef));
- if(iconResource != null){
- final URL url = ResourceController.getResourceController().getResource(iconResource);
- menuItem.setIcon(new ImageIcon(url));
- }
- addMenuItem(menuPath.parentKey, menuItem, menuPath.key, MenuBuilder.AS_CHILD);
- }
- else {
- if (!(menuPath.parentKey.equals(""))) {
- addMenuItemGroup(menuPath.parentKey, menuPath.key, MenuBuilder.AS_CHILD);
- }
- }
- }
- return menuPath;
- }
- }
-
- private final class SeparatorCreator implements IElementHandler {
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- addSeparator(parent.toString(), MenuBuilder.AS_CHILD);
- return parent;
- }
- }
-
- private final class StructureCreator implements IElementHandler {
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- return MenuPath.emptyPath();
- }
- }
-
- private ButtonGroup buttonGroup;
- final private ReadManager readManager;
-
- public MenuStructureReader() {
- readManager = new ReadManager();
- readManager.addElementHandler("menu_structure", new StructureCreator());
- readManager.addElementHandler("menu_category", new CategoryCreator());
- readManager.addElementHandler("menu_submenu", new CategoryCreator());
- readManager.addElementHandler("menu_action", new ActionCreator());
- readManager.addElementHandler("menu_radio_action", new ActionCreator());
- readManager.addElementHandler("menu_separator", new SeparatorCreator());
- }
-
- public void processMenu(final URL menu) {
- InputStreamReader streamReader = null;
- try {
- streamReader = new InputStreamReader(new BufferedInputStream(menu.openStream()));
- final TreeXmlReader reader = new TreeXmlReader(readManager);
- reader.load(streamReader);
- }
- catch (final Exception e) {
- throw new RuntimeException(e);
- }
- finally {
- FileUtils.silentlyClose(streamReader);
- }
- }
- }
-
- private static Insets nullInsets = new Insets(0, 0, 0, 0);
- private static final String SHORTCUT_PROPERTY_PREFIX = "acceleratorFor";
- static final int MAX_HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height - 100;
-
- static public JMenu createMenu(final String name) {
- final JMenu menu = new JMenu();
- final String text = TextUtils.getRawText(name);
- MenuBuilder.setLabelAndMnemonic(menu, text);
- return menu;
- }
-
- static public JMenuItem createMenuItem(final String name) {
- final JMenuItem menu = new JFreeplaneMenuItem();
- final String text = TextUtils.getRawText(name);
- MenuBuilder.setLabelAndMnemonic(menu, text);
- return menu;
- }
-
- public static void loadAcceleratorPresets(final InputStream in) {
- final Properties prop = new Properties();
- try {
- prop.load(in);
- for (final Entry<Object, Object> property : prop.entrySet()) {
- final String shortcutKey = (String) property.getKey();
- final String keystrokeString = (String) property.getValue();
- if (!shortcutKey.startsWith(SHORTCUT_PROPERTY_PREFIX)) {
- LogUtils.warn("wrong property key " + shortcutKey);
- continue;
- }
- final int pos = shortcutKey.indexOf("/", SHORTCUT_PROPERTY_PREFIX.length());
- if (pos <= 0) {
- LogUtils.warn("wrong property key " + shortcutKey);
- continue;
- }
- final String modeName = shortcutKey.substring(SHORTCUT_PROPERTY_PREFIX.length(), pos);
- final String itemKey = shortcutKey.substring(pos + 1);
- Controller controller = Controller.getCurrentController();
- final ModeController modeController = controller.getModeController(modeName);
- if (modeController == null) {
- LogUtils.warn("unknown mode name in " + shortcutKey);
- continue;
- }
- final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder();
- final Node node = (Node) menuBuilder.get(itemKey);
- if (node == null) {
- LogUtils.warn("wrong key in " + shortcutKey);
- continue;
- }
- final Object obj = node.getUserObject();
- if (!(obj instanceof JMenuItem)) {
- LogUtils.warn("wrong key in " + shortcutKey);
- continue;
- }
- final KeyStroke keyStroke;
- if (!keystrokeString.equals("")) {
- keyStroke = UITools.getKeyStroke(keystrokeString);
- final Node oldNode = menuBuilder.getMenuItemForKeystroke(keyStroke);
- if (oldNode != null) {
- menuBuilder.setAccelerator(oldNode, null);
- final Object key = oldNode.getKey();
- final String oldShortcutKey = menuBuilder.getShortcutKey(key.toString());
- ResourceController.getResourceController().setProperty(oldShortcutKey, "");
- }
- }
- else {
- keyStroke = null;
- }
- menuBuilder.setAccelerator(node, keyStroke);
- ResourceController.getResourceController().setProperty(shortcutKey, keystrokeString);
- }
- }
- catch (final IOException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * Ampersand indicates that the character after it is a mnemo, unless the
- * character is a space. In "Find & Replace", ampersand does not label
- * mnemo, while in "&About", mnemo is "Alt + A".
- */
- public static void setLabelAndMnemonic(final AbstractButton btn, final String inLabel) {
- MenuBuilder.setLabelAndMnemonic(new ButtonHolder(btn), inLabel);
- }
-
- /**
- * Ampersand indicates that the character after it is a mnemo, unless the
- * character is a space. In "Find & Replace", ampersand does not label
- * mnemo, while in "&About", mnemo is "Alt + A".
- */
- public static void setLabelAndMnemonic(final Action action, final String inLabel) {
- MenuBuilder.setLabelAndMnemonic(new ActionHolder(action), inLabel);
- }
-
- private static void setLabelAndMnemonic(final INameMnemonicHolder item, final String inLabel) {
- String rawLabel = inLabel;
- if (rawLabel == null) {
- rawLabel = item.getText();
- }
- if (rawLabel == null) {
- return;
- }
- item.setText(TextUtils.removeMnemonic(rawLabel));
- final int mnemoSignIndex = rawLabel.indexOf('&');
- if (mnemoSignIndex >= 0 && mnemoSignIndex + 1 < rawLabel.length()) {
- final char charAfterMnemoSign = rawLabel.charAt(mnemoSignIndex + 1);
- if (charAfterMnemoSign != ' ') {
- if (!Compat.isMacOsX()) {
- item.setMnemonic(charAfterMnemoSign);
- item.setDisplayedMnemonicIndex(mnemoSignIndex);
- }
- }
- }
- }
-
- private IAcceleratorChangeListener acceleratorChangeListener;
- private final Map<KeyStroke, Node> accelerators = new HashMap<KeyStroke, Node>();
- final private ModeController modeController;
- final MenuStructureReader reader;
- private Set<String> plugins;
-
- public MenuBuilder(ModeController modeController) {
- super(null);
- this.modeController = modeController;
- reader = new MenuStructureReader();
- }
-
- private void setDefaultAccelerator(final String itemKey, final String accelerator) {
- final String shortcutKey = getShortcutKey(itemKey);
- if (null == ResourceController.getResourceController().getProperty(shortcutKey, null)) {
- ResourceController.getResourceController().setDefaultProperty(shortcutKey, accelerator);
- }
- }
-
- /**
- * @return returns the new JMenuItem.
- */
- public void addAction(final String category, final AFreeplaneAction action, final int position) {
- final String menuKey = getMenuKey(category, action.getKey());
- addAction(category, menuKey, action, position);
- }
-
- public String getMenuKey(final String category, String actionKey) {
- actionKey = "$" + actionKey + '$';
- for (int i = 0; i < 1000; i++) {
- final String key = actionKey + i;
- if (null == get(key)) {
- return key;
- }
- }
- return category + '/' + actionKey;
- }
-
- public void addAction(final String category, final String key, final AFreeplaneAction action, final int position) {
- assert action != null;
- assert key != null;
- if (getContainer(get(category), Container.class) instanceof JToolBar) {
- addButton(category, action, key, position);
- return;
- }
- final JMenuItem item;
- if (action.getClass().getAnnotation(SelectableAction.class) != null) {
- item = new JAutoCheckBoxMenuItem(decorateAction(category, action));
- }
- else {
- item = new JFreeplaneMenuItem(decorateAction(category, action));
- }
- addMenuItem(category, item, key, position);
- addListeners(key, action);
- return;
- }
-
- private void addListeners(final String key, final AFreeplaneAction action) {
- if (AFreeplaneAction.checkSelectionOnPopup(action)) {
- addPopupMenuListener(key, new PopupMenuListener() {
- public void popupMenuCanceled(final PopupMenuEvent e) {
- }
-
- public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
- }
-
- public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
- if(action.isEnabled())
- action.setSelected();
- }
- });
- }
- }
-
- private void addButton(final String category, final Action action, final String key, final int position) {
- final AbstractButton button;
- assert action != null;
- if (action.getClass().getAnnotation(SelectableAction.class) != null) {
- button = new JAutoToggleButton(action);
- }
- else {
- button = new JButton(action);
- }
- addElement(category, button, key, position);
- }
-
- @Override
- protected void addComponent(final Container container, final Component component, final int index) {
- if (container instanceof JMenu) {
- new MenuSplitter().addMenuComponent((JMenu) container, component, index);
- return;
- }
- if (container instanceof JToolBar && component instanceof AbstractButton) {
- {
- ((AbstractButton) component).setMargin(MenuBuilder.nullInsets);
- }
- }
- super.addComponent(container, component, index);
- }
-
- public void addComponent(final String parent, final Container item, final Action action, final int position) {
- action.addPropertyChangeListener(new Enabler(item));
- addElement(parent, item, position);
- }
-
- /**
- * Add new first level menu bar.
- */
- public void addMenuBar(final JMenuBar menubar, final String key) {
- addElement(this, menubar, key, UIBuilder.AS_CHILD);
- }
-
- public void addMenuItem(final String relativeKey, final JMenuItem item, final String key, final int position) {
- final String shortcutKey = getShortcutKey(key);
- final String keyStrokeString = ResourceController.getResourceController().getProperty(shortcutKey);
- final Node element = (Node) addElement(relativeKey, item, key, position);
- if (null == getMenuBar(element)) {
- return;
- }
- if (keyStrokeString != null && !keyStrokeString.equals("")) {
- final KeyStroke keyStroke = UITools.getKeyStroke(keyStrokeString);
- setAccelerator(element, keyStroke);
- }
- }
-
- public void addMenuItemGroup(final String key, final int position) {
- addElement(this, key, key, position);
- }
-
- public void addMenuItemGroup(final String relativeKey, final String key, final int position) {
- addElement(relativeKey, key, key, position);
- }
-
- public void addPopupMenu(final JPopupMenu menu, final String key) {
- addElement(this, menu, key, UIBuilder.AS_CHILD);
- }
-
- public void addPopupMenuListener(final Object key, final PopupMenuListener listener) {
- final DefaultMutableTreeNode node = get(key);
- assert (node != null);
- final JPopupMenu popup;
- if (node.getUserObject() instanceof JMenu) {
- popup = ((JMenu) node.getUserObject()).getPopupMenu();
- }
- else if (node.getUserObject() instanceof JPopupMenu) {
- popup = (JPopupMenu) node.getUserObject();
- }
- else {
- final Container container = getContainer(((DefaultMutableTreeNode) node.getParent()), Container.class);
- if (container instanceof JPopupMenu) {
- popup = (JPopupMenu) container;
- }
- else if (container instanceof JMenu) {
- popup = ((JMenu) container).getPopupMenu();
- }
- else {
- throw new RuntimeException("no popup menu found!");
- }
- }
- final Object userObject = node.getUserObject();
- popup.addPopupMenuListener(new DelegatingPopupMenuListener(listener, userObject));
- }
-
- public JMenuItem addRadioItem(final String category, final AFreeplaneAction action, final boolean isSelected) {
- assert action != null;
- final String actionKey = "$" + action.getKey() + '$';
- for(int i = 0; i < 1000; i++){
- String key = actionKey + i;
- if (null == get(key)){
- return addRadioItem(category, key, action, isSelected);
- }
- }
- return addRadioItem(category, category + '/' + actionKey, action, isSelected);
- }
-
- public JMenuItem addRadioItem(final String category, final String key,
- final AFreeplaneAction action, final boolean isSelected) {
- assert key != null;
- final JRadioButtonMenuItem item;
- if (action.getClass().getAnnotation(SelectableAction.class) != null) {
- item = new JAutoRadioButtonMenuItem(decorateAction(category, action));
- }
- else {
- item = new JRadioButtonMenuItem(decorateAction(category, action));
- }
- addMenuItem(category, item, key, MenuBuilder.AS_CHILD);
- item.setSelected(isSelected);
- addListeners(key, action);
- return item;
- }
-
- public void addSeparator() {
- addElement(this, new JPopupMenu.Separator(), UIBuilder.AS_CHILD);
- }
-
- public void addSeparator(final String parentKey, final int position) {
- final Container parent = getContainer(get(parentKey), Container.class);
- if (parent instanceof JMenu || parent instanceof JPopupMenu) {
- addElement(parentKey, new JPopupMenu.Separator(), position);
- return;
- }
- if (parent instanceof JToolBar) {
- final JToolBar t = (JToolBar) parent;
- final JToolBar.Separator s = new JToolBar.Separator();
- addElement(parentKey, s, position);
- if (t.getOrientation() == SwingConstants.VERTICAL) {
- s.setOrientation(SwingConstants.HORIZONTAL);
- }
- else {
- s.setOrientation(SwingConstants.VERTICAL);
- }
- return;
- }
- }
-
- public void addToolbar(final JToolBar toolbar, final String key) {
- addElement(this, toolbar, key, UIBuilder.AS_CHILD);
- }
-
- public void afterMapChange(final MapModel newMap) {
- final Iterator<Object> iterator = newObjectIterator();
- while (iterator.hasNext()) {
- final Object next = iterator.next();
- if (next instanceof AbstractButton) {
- final AbstractButton btn = (AbstractButton) next;
- final Action action = btn.getAction();
- if (action instanceof IFreeplaneAction) {
- ((IFreeplaneAction) action).afterMapChange(newMap);
- }
- }
- }
- }
-
- IFreeplaneAction decorateAction(final String category, final AFreeplaneAction action) {
- if (null == getMenuBar(get(category)) || Controller.getCurrentController().getViewController().isApplet()) {
- return action;
- }
- return decorateAction(action);
- }
-
- public IFreeplaneAction decorateAction(final AFreeplaneAction action) {
- return new AccelerateableAction(this, action);
- }
-
- public IAcceleratorChangeListener getAcceleratorChangeListener() {
- return acceleratorChangeListener;
- }
-
- @Override
- protected Component getChildComponent(final Container parentComponent, final int index) {
- if (parentComponent instanceof JMenu) {
- return ((JMenu) parentComponent).getMenuComponent(index);
- }
- return super.getChildComponent(parentComponent, index);
- }
-
- @Override
- protected Container getNextParentComponent(Container parentComponent) {
- if(parentComponent.getComponentCount() > 0 && parentComponent instanceof JMenu)
- {
- return new MenuSplitter().getExtraSubMenu((JMenu)parentComponent);
- }
- return null;
- }
-
- public Node getMenuBar(DefaultMutableTreeNode element) {
- while (element != null) {
- final Object userObject = element.getUserObject();
- if (userObject instanceof JMenuBar) {
- return (Node) element;
- }
- element = (DefaultMutableTreeNode) element.getParent();
- }
- return null;
- }
-
- private Node getMenuItemForKeystroke(final KeyStroke keyStroke) {
- return accelerators.get(keyStroke);
- }
-
- @Override
- protected DefaultMutableTreeNode getNode(final Object parentKey) {
- final DefaultMutableTreeNode parentNode = super.getNode(parentKey);
- return parentNode;
- }
-
- @Override
- protected int getParentComponentCount(final Container parentComponent) {
- if (parentComponent instanceof JMenu) {
- return ((JMenu) parentComponent).getMenuComponentCount();
- }
- return super.getParentComponentCount(parentComponent);
- }
-
- public String getShortcutKey(final String key) {
- return SHORTCUT_PROPERTY_PREFIX + modeController.getModeName() + "/" + key;
- }
-
- public void processMenuCategory(final URL menu, Set<String> plugins) {
- final Set<String> oldPlugins = this.plugins;
- this.plugins = plugins;
- try{
- reader.processMenu(menu);
- }
- finally{
- this.plugins = oldPlugins;
- }
- }
-
- private KeyStroke removeAccelerator(final Node node) throws AssertionError {
- final KeyStroke oldAccelerator = ((JMenuItem) node.getUserObject()).getAccelerator();
- if (oldAccelerator != null) {
- final Node oldNode = accelerators.remove(oldAccelerator);
- if (!node.equals(oldNode)) {
- throw new AssertionError("unexpected action " + "for accelerator " + oldAccelerator);
- }
- }
- return oldAccelerator;
- }
-
- @SuppressWarnings("unchecked")
- private void removeAccelerators(final DefaultMutableTreeNode node) {
- final Object userObject = node.getUserObject();
- if (userObject instanceof JMenuItem && !(userObject instanceof JMenu)) {
- setAccelerator((Node) node, null);
- }
- for (final Enumeration<Object> children = node.children(); children.hasMoreElements();) {
- removeAccelerators((DefaultMutableTreeNode) children.nextElement());
- }
- }
-
- @Override
- protected void removeChildComponents(final Container parentComponent, final DefaultMutableTreeNode node) {
- removeAccelerators(node);
- if (parentComponent instanceof JMenu) {
- final JMenu menu = (JMenu) parentComponent;
- final JPopupMenu popupMenu = menu.getPopupMenu();
- super.removeChildComponents(popupMenu, node);
- for(int i = popupMenu.getComponentCount()-1; i >= 0; i--){
- final Component component = popupMenu.getComponent(i);
- if(new MenuSplitter().isExtraSubMenu(component)){
- final Container container = (Container) component;
- super.removeChildComponents(container, node);
- if(container.getComponentCount() == 0)
- popupMenu.remove(container);
- }
- }
- }
- else{
- super.removeChildComponents(parentComponent, node);
-
- }
- }
-
- public void removePopupMenuListener(final Object key, final PopupMenuListener listener) {
- final DefaultMutableTreeNode node = get(key);
- final Container container = getContainer(node, Container.class);
- final JPopupMenu popup;
- if (container instanceof JPopupMenu) {
- popup = (JPopupMenu) container;
- }
- else if (container instanceof JMenu) {
- popup = ((JMenu) container).getPopupMenu();
- }
- else {
- throw new RuntimeException("no popup menu found!");
- }
- final Object userObject = node.getUserObject();
- final PopupMenuListener[] popupMenuListeners = popup.getPopupMenuListeners();
- for (int i = 0; i < popupMenuListeners.length; i++) {
- final PopupMenuListener popupMenuListener = popupMenuListeners[i];
- if (!(popupMenuListener instanceof DelegatingPopupMenuListener)
- || !(((DelegatingPopupMenuListener) popupMenuListener).getSource() == userObject)) {
- continue;
- }
- popup.removePopupMenuListener(popupMenuListener);
- break;
- }
- }
-
- void setAccelerator(final Node node, final KeyStroke keyStroke) {
- final Node oldAction = accelerators.put(keyStroke, node);
- final JMenuItem item = (JMenuItem) node.getUserObject();
- if (keyStroke != null && oldAction != null) {
- UITools.errorMessage(TextUtils.format("action_keystroke_in_use_error", keyStroke, item
- .getActionCommand(), ((JMenuItem) oldAction.getUserObject()).getActionCommand()));
- accelerators.put(keyStroke, oldAction);
- final String shortcutKey = getShortcutKey(node.getKey().toString());
- ResourceController.getResourceController().setProperty(shortcutKey, "");
- return;
- }
- if (item instanceof JMenu) {
- UITools.errorMessage(TextUtils.format("submenu_keystroke_in_use_error", keyStroke, item.getText()));
- accelerators.put(keyStroke, oldAction);
- final String shortcutKey = getShortcutKey(node.getKey().toString());
- ResourceController.getResourceController().setProperty(shortcutKey, "");
- return;
- }
- final KeyStroke removedAccelerator = removeAccelerator(node);
- item.setAccelerator(keyStroke);
- if (acceleratorChangeListener != null && (removedAccelerator != null || keyStroke != null)) {
- acceleratorChangeListener.acceleratorChanged(item, removedAccelerator, keyStroke);
- }
- }
-
- public void setAcceleratorChangeListener(final IAcceleratorChangeListener acceleratorChangeListener) {
- this.acceleratorChangeListener = acceleratorChangeListener;
- }
-
- public Map<KeyStroke, Node> getAcceleratorMap() {
- return Collections.unmodifiableMap(accelerators);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/MenuSplitter.java b/freeplane/src/org/freeplane/core/ui/MenuSplitter.java
deleted file mode 100644
index 9f42d91..0000000
--- a/freeplane/src/org/freeplane/core/ui/MenuSplitter.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import java.awt.Component;
-
-import javax.swing.JMenu;
-import javax.swing.JPopupMenu;
-
-import org.freeplane.core.resources.ResourceController;
-
-/**
- * @author Dimitry Polivaev
- * 23.01.2013
- */
-public class MenuSplitter{
- private static final String EXTRA_SUBMENU = MenuBuilder.class.getName()+".extra_submenu";
- private static final int MAX_MENU_ITEM_COUNT = ResourceController.getResourceController().getIntProperty("max_menu_item_count");
-
- public static int count = 0;
- public void addMenuComponent(JMenu menu, final Component component, final int index) {
- final JPopupMenu popupMenu = menu.getPopupMenu();
- final int itemCount = popupMenu.getComponentCount();
- if(index == 0 || index < itemCount)
- popupMenu.insert(component, index);
- else {
- final Component lastMenuItem = popupMenu.getComponent(itemCount - 1);
- final boolean extraSubMenu = isExtraSubMenu(lastMenuItem);
- if (extraSubMenu || !fitsOnScreen(popupMenu, component)) {
- final JMenu submenu;
- if(extraSubMenu) {
- submenu = (JMenu) lastMenuItem;
- }
- else {
- if (component instanceof JPopupMenu.Separator)
- return;
- submenu = new JMenu("");
- submenu.putClientProperty(EXTRA_SUBMENU, Boolean.TRUE);
- popupMenu.add(submenu);
- }
- addMenuComponent(submenu, component, submenu.getPopupMenu().getComponentCount());
- }
- else
- popupMenu.insert(component, index);
- }
- }
-
- private boolean fitsOnScreen(final JPopupMenu popupMenu, final Component component) {
- final int itemCount = popupMenu.getComponentCount();
- return itemCount < MAX_MENU_ITEM_COUNT && (popupMenu.getPreferredSize().height + component.getPreferredSize().height) < MenuBuilder.MAX_HEIGHT;
- }
-
- public boolean hasExtraSubMenu(final JMenu menu) {
- final Component lastComponent = menu.getComponent(menu.getComponentCount()-1);
- return isExtraSubMenu(lastComponent);
- }
-
- public boolean isExtraSubMenu(final Component c) {
- return (c instanceof JMenu) && (Boolean.TRUE.equals(((JMenu)c).getClientProperty(EXTRA_SUBMENU)));
- }
-
- public JMenu getExtraSubMenu(JMenu parentComponent) {
- final Component lastComponent = parentComponent.getComponent(parentComponent.getComponentCount()-1);
- if(new MenuSplitter().isExtraSubMenu(lastComponent))
- return (JMenu) lastComponent;
- else
- return null;
- }
-
-
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/MouseInsideListener.java b/freeplane/src/org/freeplane/core/ui/MouseInsideListener.java
deleted file mode 100644
index 71dac00..0000000
--- a/freeplane/src/org/freeplane/core/ui/MouseInsideListener.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseMotionListener;
-
-/**
- * @author Dimitry Polivaev
- * 01.03.2013
- */
-public class MouseInsideListener extends MouseAdapter implements MouseMotionListener{
- private boolean mouseInside = false;
- private final Component c;
- public boolean isMouseInside() {
- return mouseInside;
- }
- public MouseInsideListener(Component c){
- this.c = c;
- connect();
- }
- protected void connect() {
- recursivelyAddMouseInsideListener(c);
- }
- @Override
- public void mouseEntered(MouseEvent e) {
- mouseInside = true;
- }
-
- @Override
- public void mouseExited(MouseEvent e) {
- mouseInside = false; }
-
- @Override
- public void mouseMoved(MouseEvent e) {
- mouseInside = true;
- }
-
- private void recursivelyAddMouseInsideListener(Component c) {
- c.addMouseListener(this);
- c.addMouseMotionListener((MouseMotionListener) this);
- if(c instanceof Container){
- Container container = (Container) c;
- for(Component childComponent : container.getComponents())
- recursivelyAddMouseInsideListener(childComponent);
- }
- }
- private void recursivelyRemoveMouseInsideListener(Component c) {
- c.removeMouseListener(this);
- c.removeMouseMotionListener((MouseMotionListener) this);
- if(c instanceof Container){
- Container container = (Container) c;
- for(Component childComponent : container.getComponents())
- recursivelyRemoveMouseInsideListener(childComponent);
- }
- }
- public void disconnect() {
- recursivelyRemoveMouseInsideListener(c);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/UIBuilder.java b/freeplane/src/org/freeplane/core/ui/UIBuilder.java
deleted file mode 100644
index 3e9b968..0000000
--- a/freeplane/src/org/freeplane/core/ui/UIBuilder.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.util.Enumeration;
-
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.TreeNode;
-
-/**
- * @author Dimitry Polivaev
- */
-public abstract class UIBuilder extends IndexedTree {
- public static final int ICON_SIZE = 16;
-
- /**
- *
- */
- public UIBuilder(final Object root) {
- super(root);
- }
-
- protected void addComponent(final Container container, final Component component, final int index) {
- container.add(component, index);
- }
-
- /**
- */
- protected void addComponent(final DefaultMutableTreeNode childNode, final int position) {
- int index;
- Container parentComponent = getParentComponent(childNode, Container.class);
- if (parentComponent == null) {
- return;
- }
- if (position == UIBuilder.AS_CHILD
- && ((DefaultMutableTreeNode) childNode.getParent()).getUserObject() instanceof Container) {
- index = getParentComponentCount(parentComponent) - 1;
- }
- else {
- final Component relative = getPrevious(childNode);
- index = -1;
- if (relative != null) {
- ParentLoop: for (Container nextParentComponent = parentComponent; nextParentComponent != null; nextParentComponent = getNextParentComponent(nextParentComponent)) {
- parentComponent = nextParentComponent;
- for (int i = 0; i < getParentComponentCount(parentComponent); i++) {
- if (getChildComponent(parentComponent, i) == relative) {
- index = i;
- break ParentLoop;
- }
- }
- }
- }
- }
- if (position != UIBuilder.BEFORE) {
- index++;
- }
- final Component component = (Component) childNode.getUserObject();
- addComponent(parentComponent, component, index);
- }
-
- protected Container getNextParentComponent(Container parentComponent) {
- return null;
- }
-
- @Override
- protected void addNode(final DefaultMutableTreeNode relativeNode, final DefaultMutableTreeNode node,
- final int position) {
- super.addNode(relativeNode, node, position);
- if (node.getUserObject() instanceof Component) {
- addComponent(node, position);
- }
- }
-
- protected Component getChildComponent(final Container parentComponent, final int index) {
- return parentComponent.getComponent(index);
- }
-
- protected Container getContainer(final DefaultMutableTreeNode node, final Class<?> clazz) {
- if (node == null) {
- return null;
- }
- final Object userObject = node.getUserObject();
- if (clazz.isInstance(userObject)) {
- return (Container) userObject;
- }
- return getParentComponent(node, clazz);
- }
-
- /**
- * @param clazz
- */
- Container getParentComponent(final DefaultMutableTreeNode child, final Class<?> clazz) {
- final DefaultMutableTreeNode parent = (DefaultMutableTreeNode) child.getParent();
- return getContainer(parent, clazz);
- }
-
- protected int getParentComponentCount(final Container parentComponent) {
- return parentComponent.getComponentCount();
- }
-
- protected Component getPrevious(final DefaultMutableTreeNode childNode) {
- final DefaultMutableTreeNode parentNode = (DefaultMutableTreeNode) childNode.getParent();
- if (parentNode == null || parentNode.getUserObject() == null) {
- return null;
- }
- final int childNodeIndex = parentNode.getIndex(childNode);
- final Component c = getPrevious(parentNode, childNodeIndex - 1);
- if (c == null) {
- return getPrevious(parentNode);
- }
- return c;
- }
-
- /**
- */
- private Component getPrevious(final TreeNode parentNode, final int last) {
- for (int i = last; i >= 0; i--) {
- final DefaultMutableTreeNode child = (DefaultMutableTreeNode) parentNode.getChildAt(i);
- final Object userObject = child.getUserObject();
- if (userObject instanceof Component) {
- return (Component) userObject;
- }
- final Component childComponent = getPrevious(child, child.getChildCount() - 1);
- if (childComponent != null) {
- return childComponent;
- }
- }
- return null;
- }
-
- /**
- * @param parentComponent
- */
- protected void removeChildComponents(final Container parentComponent, final DefaultMutableTreeNode node) {
- {
- final Object userObject = node.getUserObject();
- if (userObject instanceof Component) {
- final Component component = (Component) userObject;
- parentComponent.remove(component);
- return;
- }
- }
- final Enumeration<?> children = node.children();
- while (children.hasMoreElements()) {
- final DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
- final Object userObject = child.getUserObject();
- if (userObject instanceof Component) {
- parentComponent.remove((Component) userObject);
- }
- else {
- removeChildComponents(parentComponent, child);
- }
- }
- }
-
- @Override
- public void removeChildElements(final Object key) {
- final DefaultMutableTreeNode node = getNode(key);
- final Container parentComponent = getContainer(node, Container.class);
- final Enumeration<?> children = node.children();
- while (children.hasMoreElements()) {
- final Node child = (Node) children.nextElement();
- removeChildComponents(parentComponent, child);
- }
- super.removeChildElements(key);
- }
-
- @Override
- public DefaultMutableTreeNode removeElement(final Object key) {
- final DefaultMutableTreeNode node = super.removeElement(key);
- final Container parentComponent = getParentComponent(node, Container.class);
- if (parentComponent == null || node == null) {
- return node;
- }
- removeChildComponents(parentComponent, node);
- ((DefaultMutableTreeNode) node.getParent()).remove(node);
- if (parentComponent.isShowing()) {
- parentComponent.validate();
- parentComponent.repaint();
- }
- return node;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/ActionToggleButtonModel.java b/freeplane/src/org/freeplane/core/ui/components/ActionToggleButtonModel.java
deleted file mode 100644
index 9309a3e..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/ActionToggleButtonModel.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.freeplane.core.ui.components;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.JToggleButton;
-
-import org.freeplane.core.ui.IFreeplaneAction;
-
-class ActionToggleButtonModel extends JToggleButton.ToggleButtonModel {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private boolean ignoreSetSelected = false;
-
- ActionToggleButtonModel(final IFreeplaneAction action) {
- }
-
- @Override
- public void setSelected(boolean b) {
- if(ignoreSetSelected)
- return;
- super.setSelected(b);
- }
-
- @Override
- public void setPressed(boolean b) {
- ignoreSetSelected = true;
- try {
- super.setPressed(b);
- }
- finally {
- ignoreSetSelected = false;
- }
- }
-
- @Override
- protected void fireActionPerformed(ActionEvent e) {
- boolean setSelectedWasIgnored = ignoreSetSelected;
- ignoreSetSelected = false;
- try {
- super.fireActionPerformed(e);
- }
- finally {
- ignoreSetSelected = setSelectedWasIgnored;
- }
- }
-
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/ui/components/BitmapImagePreview.java b/freeplane/src/org/freeplane/core/ui/components/BitmapImagePreview.java
deleted file mode 100644
index 018c281..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/BitmapImagePreview.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-/**
- * @author Dimitry Polivaev
- * 22.08.2009
- */
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Image;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-
-import javax.swing.JComponent;
-import javax.swing.JFileChooser;
-import javax.swing.border.MatteBorder;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-
-public class BitmapImagePreview extends JComponent implements PropertyChangeListener {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- protected static final int BORDER_WIDTH = 2;
- protected final JFileChooser fc;
-
- public BitmapImagePreview(final JFileChooser fc) {
- super();
- this.fc = fc;
- setBorder(new MatteBorder(BORDER_WIDTH, BORDER_WIDTH, BORDER_WIDTH, BORDER_WIDTH, Color.BLACK));
- final int previewSize = ResourceController.getResourceController().getIntProperty("image_preview_size", 300);
- setPreferredSize(new Dimension(previewSize, previewSize));
- fc.addPropertyChangeListener(this);
- }
-
- public void propertyChange(final PropertyChangeEvent e) {
- final String prop = e.getPropertyName();
- //If the directory changed, don't show an image.
- final File file;
- if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {
- file = null;
- //If a file became selected, find out which one.
- }
- else if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {
- file = (File) e.getNewValue();
- }
- else {
- return;
- }
- if (file == null || !file.exists()) {
- return;
- }
- if (getComponentCount() == 1) {
- remove(0);
- }
- repaint();
- try {
- updateView(file);
- }
- catch (final MalformedURLException e1) {
- LogUtils.warn(e1);
- }
- catch (final IOException e1) {
- LogUtils.warn(e1);
- }
- }
-
- protected void updateView(final File file) throws MalformedURLException, IOException {
- final BitmapViewerComponent viewer = new BitmapViewerComponent(file.toURI());
- viewer.setHint(Image.SCALE_FAST);
- final Dimension size = getSize();
- size.width -= 2 * BORDER_WIDTH;
- size.height -= 2 * BORDER_WIDTH;
- viewer.setPreferredSize(size);
- viewer.setSize(size);
- viewer.setLocation(BORDER_WIDTH, BORDER_WIDTH);
- add(viewer);
- viewer.revalidate();
- viewer.repaint();
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/BitmapViewerComponent.java b/freeplane/src/org/freeplane/core/ui/components/BitmapViewerComponent.java
deleted file mode 100644
index 6566e54..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/BitmapViewerComponent.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.Dimension;
-import java.awt.EventQueue;
-import java.awt.Graphics;
-import java.awt.Image;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.ref.WeakReference;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.Iterator;
-import java.util.concurrent.Future;
-
-import javax.imageio.ImageIO;
-import javax.imageio.ImageReader;
-import javax.imageio.stream.ImageInputStream;
-import javax.swing.JComponent;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-
-import com.thebuzzmedia.imgscalr.AsyncScalr;
-
-/**
- * @author Dimitry Polivaev
- * 22.08.2009
- */
-public class BitmapViewerComponent extends JComponent {
- /**
- *
- */
- static{
-// System.setProperty("imgscalr.debug", "true");
- AsyncScalr.setServiceThreadCount(1);
- }
-
- enum CacheType{IC_DISABLE, IC_FILE, IC_RAM};
- private static final long serialVersionUID = 1L;
- private File cacheFile;
- private int hint;
- private BufferedImage cachedImage;
- private WeakReference<BufferedImage> cachedImageWeakRef;
- private final URL url;
- private final Dimension originalSize;
- private int imageX;
- private int imageY;
- private boolean processing;
- private boolean scaleEnabled;
-
- public boolean isScaleEnabled() {
- return scaleEnabled;
- }
-
- public void setScaleEnabled(boolean scaleEnabled) {
- this.scaleEnabled = scaleEnabled;
- }
-
- protected int getHint() {
- return hint;
- }
-
- public void setHint(final int hint) {
- this.hint = hint;
- }
-
- public BitmapViewerComponent(final URI uri) throws MalformedURLException, IOException {
- url = uri.toURL();
- originalSize = readOriginalSize();
- hint = Image.SCALE_SMOOTH;
- processing = false;
- scaleEnabled = true;
- cachedImage = null;
- }
-
- private Dimension readOriginalSize() throws IOException {
- InputStream inputStream = null;
- ImageInputStream in = null;
- try {
- inputStream = url.openStream();
- in = ImageIO.createImageInputStream(inputStream);
- final Iterator<ImageReader> readers = ImageIO.getImageReaders(in);
- if (readers.hasNext()) {
- ImageReader reader = readers.next();
- try {
- reader.setInput(in);
- return new Dimension(reader.getWidth(0), reader.getHeight(0));
- } finally {
- reader.dispose();
- }
- }
- else{
- throw new IOException("can not create image");
- }
- } finally {
- if (in != null)
- in.close();
- if(inputStream != null)
- inputStream.close();
- }
- }
-
- public Dimension getOriginalSize() {
- return new Dimension(originalSize);
- }
-
- @Override
- protected void paintComponent(final Graphics g) {
- if(processing)
- return;
- if (getWidth() == 0 || getHeight() == 0) {
- return;
- }
- if(cachedImage == null && cachedImageWeakRef != null){
- cachedImage = cachedImageWeakRef.get();
- cachedImageWeakRef = null;
- }
- if(cachedImage == null && cacheFile != null)
- loadImageFromCacheFile();
- if(! isCachedImageValid()){
- BufferedImage tempImage;
- try {
- tempImage = ImageIO.read(url);
- }
- catch (IOException e) {
- return;
- }
- final BufferedImage image = tempImage;
- final int imageWidth = image.getWidth();
- final int imageHeight = image.getHeight();
- if(imageWidth == 0 || imageHeight == 0){
- return;
- }
- processing = true;
- final Future<BufferedImage> result = AsyncScalr.resize(image, getWidth(),getHeight());
- AsyncScalr.getService().submit(new Runnable() {
- public void run() {
- BufferedImage scaledImage = null;
- try {
- scaledImage = result.get();
- } catch (Exception e) {
- LogUtils.severe(e);
- return;
- }
- finally{
- image.flush();
- }
- final int scaledImageHeight = scaledImage.getHeight();
- final int scaledImageWidth = scaledImage.getWidth();
- if (scaledImageHeight > getHeight()) {
- imageX = 0;
- imageY = (getHeight() - scaledImageHeight) / 2;
- }
- else {
- imageX = (getWidth() - scaledImageWidth) / 2;
- imageY = 0;
- }
- cachedImage = scaledImage;
- if(getCacheType().equals(CacheType.IC_FILE))
- writeCacheFile();
- EventQueue.invokeLater(new Runnable() {
-
- public void run() {
- processing = false;
- repaint();
- }
- });
- }
- });
- }
- else{
- g.drawImage(cachedImage, imageX, imageY, null);
- flushImage();
- }
- }
-
- private void flushImage() {
- final CacheType cacheType = getCacheType();
- if(CacheType.IC_RAM.equals(cacheType)){
- cachedImage.flush();
- }
- else{
- cachedImageWeakRef = new WeakReference<BufferedImage>(cachedImage);
- cachedImage = null;
- }
- }
-
- private CacheType getCacheType() {
- return ResourceController.getResourceController().getEnumProperty("image_cache", CacheType.IC_DISABLE);
- }
-
- private final static Object LOCK = new Object();
- private void writeCacheFile() {
- File tempDir = new File (System.getProperty("java.io.tmpdir"), "freeplane");
- tempDir.mkdirs();
- try {
- synchronized(LOCK) {
- cacheFile = File.createTempFile("cachedImage", ".jpg", tempDir);
- }
- ImageIO.write(cachedImage, "jpg", cacheFile);
-
- } catch (IOException e) {
- cacheFile.delete();
- cacheFile = null;
- }
- }
-
- private boolean isCachedImageValid() {
- return cachedImage != null &&
- (! scaleEnabled
- || 1 >= Math.abs(getWidth() - cachedImage.getWidth()) && getHeight() >= cachedImage.getHeight()
- || getWidth() >= cachedImage.getWidth() && 1 >= Math.abs(getHeight() - cachedImage.getHeight())
- );
- }
-
- private void loadImageFromCacheFile() {
- try {
- cachedImage = ImageIO.read(cacheFile);
- if(isCachedImageValid())
- return;
- } catch (IOException e) {
- }
- cacheFile.delete();
- cacheFile = null;
- }
-
- @Override
- public void removeNotify() {
- super.removeNotify();
- if(cacheFile != null){
- cacheFile.delete();
- cacheFile = null;
- }
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/ContainerComboBoxEditor.java b/freeplane/src/org/freeplane/core/ui/components/ContainerComboBoxEditor.java
deleted file mode 100644
index e72fead..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/ContainerComboBoxEditor.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.CardLayout;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.swing.Box;
-import javax.swing.ComboBoxEditor;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JComboBox;
-import javax.swing.JPanel;
-
-import org.freeplane.core.resources.NamedObject;
-
-/**
- * @author Dimitry Polivaev
- * Mar 12, 2011
- */
-public class ContainerComboBoxEditor implements ComboBoxEditor {
- final private Map<NamedObject, ComboBoxEditor> editors;
- private ComboBoxEditor editor;
- final private JComboBox editorSelector;
- final private JPanel editorPanel;
- private Box editorComponent;
-
- final private List<ActionListener> actionListeners;
-
- public ContainerComboBoxEditor() {
- editors = new HashMap<NamedObject, ComboBoxEditor>();
- editorComponent = Box.createHorizontalBox();
- editorSelector = new JComboBox();
- editorSelector.setEditable(false);
- editorSelector.setRenderer(NamedObject.getIconRenderer());
- editorSelector.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- final NamedObject key = (NamedObject) editorSelector.getSelectedItem();
- editor = editors.get(key);
- final CardLayout layout = (CardLayout) editorPanel.getLayout();
- layout.show(editorPanel, key.getObject().toString());
- editor.getEditorComponent().requestFocusInWindow();
- final ActionEvent actionEvent = new ActionEvent(editor, 0, null);
- for (final ActionListener l : actionListeners) {
- l.actionPerformed(actionEvent);
- }
- }
- });
- editorComponent.add(editorSelector);
- editorPanel = new JPanel(new CardLayout(0, 0));
- editorComponent.add(editorPanel);
- actionListeners = new LinkedList<ActionListener>();
- }
-
- public boolean put(NamedObject key, ComboBoxEditor editor){
- final ComboBoxEditor oldEditor = editors.put(key, editor);
- if(oldEditor != null){
- editors.put(key, oldEditor);
- return false;
- }
- final DefaultComboBoxModel model = (DefaultComboBoxModel) editorSelector.getModel();
- model.addElement(key);
- if(this.editor == null){
- this.editor = editor;
- }
- editorPanel.add(editor.getEditorComponent(), key.getObject().toString());
- return true;
- }
-
- public Component getEditorComponent() {
- return editorComponent;
- }
-
- public void setItem(Object anObject) {
- if(anObject == null){
- setItem("");
- return;
- }
- for(Entry<NamedObject, ComboBoxEditor> editorEntry: editors.entrySet()){
- final ComboBoxEditor editor = editorEntry.getValue();
- editor.setItem(anObject);
- final Object item = editor.getItem();
- NamedObject key = editorEntry.getKey();
- if(anObject.equals(item) && ! key.equals(editorSelector.getSelectedItem())){
- editorSelector.setSelectedItem(key);
- return;
- }
- }
- }
-
- public Object getItem() {
- return editor.getItem();
- }
-
- public void selectAll() {
- editor.selectAll();
- }
-
- public void addActionListener(ActionListener l) {
- actionListeners.add(l);
- for(ComboBoxEditor e : editors.values())
- e.addActionListener(l);
- }
-
- public void removeActionListener(ActionListener l) {
- actionListeners.remove(l);
- for(ComboBoxEditor e : editors.values())
- e.removeActionListener(l);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/FButtonBar.java b/freeplane/src/org/freeplane/core/ui/components/FButtonBar.java
deleted file mode 100644
index 630e31a..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/FButtonBar.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.KeyEventDispatcher;
-import java.awt.KeyboardFocusManager;
-import java.awt.LayoutManager;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowFocusListener;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.Action;
-import javax.swing.BorderFactory;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.JRootPane;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-import javax.swing.Timer;
-import javax.swing.text.JTextComponent;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.IAcceleratorChangeListener;
-import org.freeplane.core.ui.SetAcceleratorOnNextClickAction;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-/**
- * @author Dimitry Polivaev
- * 03.07.2009
- */
-public class FButtonBar extends JComponent implements IAcceleratorChangeListener, KeyEventDispatcher,
- WindowFocusListener {
- private static final int BUTTON_NUMBER = 12;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private Map<Integer, JButton[]> buttons;
- private int lastModifiers = -1;
- private int nextModifiers = 0;
- private JFrame ownWindowAncestor;
- final private Timer timer = new Timer(500, new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- onModifierChangeImpl();
- }
- });
-
- @SuppressWarnings("serial")
- private class ContentPane extends JPanel{
- @Override
- protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) {
- if (condition == JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
- return processFKey(e);
- return false;
- }
- }
-
- public FButtonBar(JRootPane rootPane) {
- KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
- final Container oldContentPane = rootPane.getContentPane();
- final ContentPane newContentPane = new ContentPane();
- final LayoutManager layoutManager = oldContentPane.getLayout();
- oldContentPane.setLayout(null);
- newContentPane.setLayout(layoutManager);
- for (Component c : oldContentPane.getComponents())
- newContentPane.add(c);
- rootPane.setContentPane(newContentPane);
- buttons = new HashMap<Integer, JButton[]>();
- onModifierChange();
- }
-
- public void acceleratorChanged(final JMenuItem action, final KeyStroke oldStroke, final KeyStroke newStroke) {
- final int oldButtonNumber = oldStroke != null ? oldStroke.getKeyCode() - KeyEvent.VK_F1 : -1;
- final int newButtonNumber = newStroke != null ? newStroke.getKeyCode() - KeyEvent.VK_F1 : -1;
- if (oldButtonNumber >= 0 && oldButtonNumber < BUTTON_NUMBER) {
- final int modifiers = oldStroke.getModifiers()
- & (KeyEvent.CTRL_MASK | KeyEvent.META_MASK | KeyEvent.SHIFT_MASK | KeyEvent.ALT_MASK | KeyEvent.ALT_GRAPH_MASK);
- final JButton[] buttonRow = buttons.get(modifiers);
- final JButton button = buttonRow[oldButtonNumber];
- setAcceleratorAction(button, oldStroke);
- }
- if (newButtonNumber >= 0 && newButtonNumber < BUTTON_NUMBER) {
- final int modifiers = newStroke.getModifiers()
- & (KeyEvent.CTRL_MASK | KeyEvent.META_MASK | KeyEvent.SHIFT_MASK | KeyEvent.ALT_MASK | KeyEvent.ALT_GRAPH_MASK);
- final JButton[] buttonRow = createButtons(modifiers);
- final JButton button = buttonRow[newButtonNumber];
- final String text = action.getActionCommand();
- button.setText(text);
- button.setToolTipText(text);
- button.setAction(action.getAction());
- button.setEnabled(action.isEnabled());
- }
- }
-
- private void setAcceleratorAction(final JButton button, final KeyStroke ks) {
- final SetAcceleratorOnNextClickAction setAcceleratorAction = new SetAcceleratorOnNextClickAction(ks);
- button.setAction(setAcceleratorAction);
- final String text = TextUtils.getText("f_button_unassigned");
- button.setText(text);
- button.setToolTipText(setAcceleratorAction.getValue(Action.NAME).toString());
- }
-
- private void cleanModifiers(final int modifiers) {
- if ((nextModifiers & modifiers) == 0) {
- return;
- }
- nextModifiers &= ~modifiers;
- onModifierChange();
- }
-
- private JButton[] createButtonRow(final int modifiers) {
- final JButton[] buttons = new JButton[BUTTON_NUMBER];
- for (int i = 0; i < BUTTON_NUMBER; i++) {
- final String name = "/images/f" + (i + 1) + ".png";
- final JButton button = buttons[i] = new JButton(new ImageIcon(
- ResourceController.getResourceController().getResource(name))) {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void configurePropertiesFromAction(final Action a) {
- }
- };
- button.setFocusable(false);
- button.setBorder(BorderFactory.createEtchedBorder());
- if (System.getProperty("os.name").startsWith("Mac OS")) {
- button.setBorderPainted(false);
- }
- KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_F1 + i, modifiers);
- setAcceleratorAction(button, ks);
-
- }
- return buttons;
- }
-
- private JButton[] createButtons(final int modifiers) {
- JButton[] buttonRow = buttons.get(modifiers);
- if (buttonRow == null) {
- buttonRow = createButtonRow(modifiers);
- buttons.put(modifiers, buttonRow);
- }
- return buttonRow;
- }
-
- public boolean dispatchKeyEvent(final KeyEvent e) {
- if(! (Controller.getCurrentModeController() instanceof MModeController ))
- return false;
- if (ownWindowAncestor == null) {
- ownWindowAncestor = (JFrame) SwingUtilities.getWindowAncestor(this);
- if (ownWindowAncestor == null) {
- return false;
- }
- ownWindowAncestor.addWindowFocusListener(this);
- }
- final Window windowAncestor = SwingUtilities.getWindowAncestor(e.getComponent());
- if (windowAncestor == ownWindowAncestor && ownWindowAncestor.getJMenuBar().isEnabled()) {
- processDispatchedKeyEvent(e);
- }
- else {
- resetModifiers();
- }
- return false;
- }
-
- private void onModifierChange() {
- if (lastModifiers == nextModifiers) {
- return;
- }
- if (timer.isRunning()) {
- timer.stop();
- }
- if (nextModifiers == 0) {
- onModifierChangeImpl();
- }
- else {
- timer.start();
- }
- }
-
- private void onModifierChangeImpl() {
- if (lastModifiers == nextModifiers) {
- return;
- }
- lastModifiers = nextModifiers;
- removeAll();
- final JButton[] buttonRow = createButtons(nextModifiers);
- for (final JButton button : buttonRow) {
- add(button);
- }
- revalidate();
- repaint();
- }
-
- private void processDispatchedKeyEvent(final KeyEvent e) {
- final int keyCode = e.getKeyCode();
- switch (e.getID()) {
- case KeyEvent.KEY_PRESSED:
- switch (keyCode) {
- case KeyEvent.VK_CONTROL:
- setModifiers(KeyEvent.CTRL_MASK);
- break;
- case KeyEvent.VK_META:
- setModifiers(KeyEvent.META_MASK);
- break;
- case KeyEvent.VK_SHIFT:
- setModifiers(KeyEvent.SHIFT_MASK);
- break;
- case KeyEvent.VK_ALT:
- setModifiers(KeyEvent.ALT_MASK);
- break;
- case KeyEvent.VK_ALT_GRAPH:
- setModifiers(KeyEvent.ALT_GRAPH_MASK);
- break;
- }
- break;
- case KeyEvent.KEY_RELEASED:
- switch (keyCode) {
- case KeyEvent.VK_CONTROL:
- cleanModifiers(KeyEvent.CTRL_MASK);
- break;
- case KeyEvent.VK_META:
- cleanModifiers(KeyEvent.META_MASK);
- break;
- case KeyEvent.VK_SHIFT:
- cleanModifiers(KeyEvent.SHIFT_MASK);
- break;
- case KeyEvent.VK_ALT:
- cleanModifiers(KeyEvent.ALT_MASK);
- case KeyEvent.VK_ALT_GRAPH:
- cleanModifiers(KeyEvent.ALT_GRAPH_MASK);
- break;
- default:
- break;
- }
- break;
- default:
- break;
- }
- }
-
- private boolean processFKey(final KeyEvent e){
- if(e.getID() != KeyEvent.KEY_PRESSED)
- return false;
- final Window windowAncestor = SwingUtilities.getWindowAncestor(e.getComponent());
- if (windowAncestor != ownWindowAncestor || !ownWindowAncestor.getJMenuBar().isEnabled()) {
- resetModifiers();
- return false;
- }
- int keyCode = e.getKeyCode();
- if (keyCode >= KeyEvent.VK_F1 && keyCode <= KeyEvent.VK_F12 ) {
- final JButton btn = createButtons(nextModifiers)[keyCode - KeyEvent.VK_F1];
- if(btn.getAction() instanceof SetAcceleratorOnNextClickAction
- && e.getComponent() instanceof JTextComponent)
- return false;
- if(timer.isRunning()){
- timer.stop();
- onModifierChangeImpl();
- }
- btn.doClick();
- return true;
- }
- return false;
- }
-
- private void resetModifiers() {
- if (nextModifiers == 0) {
- return;
- }
- nextModifiers = 0;
- onModifierChange();
- }
-
- private void setModifiers(final int modifiers) {
- if ((nextModifiers ^ modifiers) == 0) {
- return;
- }
- nextModifiers |= modifiers;
- onModifierChange();
- }
-
- public void windowGainedFocus(final WindowEvent e) {
- }
-
- public void windowLostFocus(final WindowEvent e) {
- resetModifiers();
- }
-
- @Override
- public void layout() {
- final int w = getParent().getWidth();
- final int border = 5;
- final int h = getComponent(1).getPreferredSize().height;
- final int componentCount = getComponentCount();
- final float availableWidth = w - 2 * border + 0f;
- final float dw = availableWidth / componentCount;
- int preferredWidth = 0;
- int narrowComponentPreferredWidth = 0;
- for (int i = 0; i < componentCount; i++) {
- final int cw = getComponent(i).getPreferredSize().width;
- preferredWidth += cw;
- if (cw <= dw) {
- narrowComponentPreferredWidth += cw;
- }
- }
- final float k;
- if (availableWidth < preferredWidth) {
- k = (availableWidth - narrowComponentPreferredWidth) / (preferredWidth - narrowComponentPreferredWidth);
- }
- else {
- k = availableWidth / preferredWidth;
- }
- float x = border;
- for (int i = 0; i < componentCount; i++) {
- float cw = getComponent(i).getPreferredSize().width;
- if (k > 1f || cw > dw) {
- cw *= k;
- }
- getComponent(i).setBounds((int) x, 0, (int) cw, h);
- x += cw;
- }
- }
-
- @Override
- public Dimension getPreferredSize() {
- return new Dimension(getParent().getWidth(), getComponent(1).getPreferredSize().height);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/FreeplaneMenuBar.java b/freeplane/src/org/freeplane/core/ui/components/FreeplaneMenuBar.java
deleted file mode 100644
index 4c5c2cf..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/FreeplaneMenuBar.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.event.KeyEvent;
-
-import javax.swing.JMenuBar;
-import javax.swing.KeyStroke;
-import javax.swing.text.JTextComponent;
-
-/**
- * This is the menu bar for Freeplane. Actions are defined in MenuListener.
- * Moreover, the StructuredMenuHolder of all menus are hold here.
- */
-public class FreeplaneMenuBar extends JMenuBar {
- public static final String EDIT_MENU = FreeplaneMenuBar.MENU_BAR_PREFIX + "/edit";
- public static final String EXTRAS_MENU = FreeplaneMenuBar.MENU_BAR_PREFIX + "/extras";
- public static final String FILE_MENU = FreeplaneMenuBar.MENU_BAR_PREFIX + "/file";
- public static final String FORMAT_MENU = FreeplaneMenuBar.MENU_BAR_PREFIX + "/format";
- public static final String HELP_MENU = FreeplaneMenuBar.MENU_BAR_PREFIX + "/help";
- public static final String INSERT_MENU = FreeplaneMenuBar.MENU_BAR_PREFIX + "/insert";
- public static final String MAP_POPUP_MENU = "/map_popup";
- public static final String MENU_BAR_PREFIX = "/menu_bar";
- public static final String MODES_MENU = "main_menu_modes";
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- public static final String VIEW_MENU = FreeplaneMenuBar.MENU_BAR_PREFIX + "/view";
-
- public FreeplaneMenuBar() {
- getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F10, 0), "none");
- }
-
- static final int KEY_MODIFIERS = KeyEvent.SHIFT_DOWN_MASK | KeyEvent.SHIFT_MASK | KeyEvent.ALT_GRAPH_DOWN_MASK
- | KeyEvent.ALT_GRAPH_MASK;
-
- public static KeyStroke derive(final KeyStroke ks, final Character keyChar) {
- if (ks == null) {
- return ks;
- }
- final int modifiers = ks.getModifiers();
- if (ks.getKeyChar() == KeyEvent.CHAR_UNDEFINED) {
- if (0 != (modifiers & KEY_MODIFIERS)) {
- switch (keyChar) {
- case '<':
- return KeyStroke
- .getKeyStroke(KeyEvent.VK_LESS, modifiers & ~KEY_MODIFIERS, ks.isOnKeyRelease());
- case '>':
- return KeyStroke.getKeyStroke(KeyEvent.VK_GREATER, modifiers & ~KEY_MODIFIERS, ks
- .isOnKeyRelease());
- case '+':
- return KeyStroke
- .getKeyStroke(KeyEvent.VK_PLUS, modifiers & ~KEY_MODIFIERS, ks.isOnKeyRelease());
- case '-':
- return KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, modifiers & ~KEY_MODIFIERS, ks
- .isOnKeyRelease());
- case '=':
- return KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, modifiers & ~KEY_MODIFIERS, ks
- .isOnKeyRelease());
- case '.':
- return KeyStroke.getKeyStroke(KeyEvent.VK_PERIOD, modifiers & ~KEY_MODIFIERS, ks
- .isOnKeyRelease());
- }
- }
- if (keyChar != '\0' && keyChar != KeyEvent.CHAR_UNDEFINED) {
- return KeyStroke.getKeyStroke(keyChar, modifiers);
- }
- }
- return ks;
- }
-
- @Override
- public boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
- // ignore key events without modifiers if text component is a source
- if (e.getKeyChar() != KeyEvent.CHAR_UNDEFINED && e.getKeyChar() != '\0'
- && 0 == (e.getModifiers() & ~KEY_MODIFIERS) && e.getSource() instanceof JTextComponent) {
- return false;
- }
- if (super.processKeyBinding(ks, e, condition, pressed)) {
- return true;
- }
- final KeyStroke derivedKS = FreeplaneMenuBar.derive(ks, e.getKeyChar());
- if (derivedKS == ks) {
- return false;
- }
- return super.processKeyBinding(derivedKS, e, condition, pressed);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/IconSelectionPopupDialog.java b/freeplane/src/org/freeplane/core/ui/components/IconSelectionPopupDialog.java
deleted file mode 100644
index 6f6d1ff..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/IconSelectionPopupDialog.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * @author <a href="mailto:labe at users.sourceforge.net">Lars Berning</a>
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.Frame;
-import java.awt.GridLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.util.List;
-
-import javax.swing.BorderFactory;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.KeyStroke;
-import javax.swing.WindowConstants;
-import javax.swing.border.BevelBorder;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.IIconInformation;
-
-public class IconSelectionPopupDialog extends JDialog implements KeyListener, MouseListener {
- static class Position {
- final private int x, y;
-
- public Position(final int x, final int y) {
- this.x = x;
- this.y = y;
- }
-
- /**
- * @return Returns the x.
- */
- public int getX() {
- return x;
- }
-
- /**
- * @return Returns the y.
- */
- public int getY() {
- return y;
- }
-
- @Override
- public String toString() {
- return ("(" + getX() + "," + getY() + ")");
- }
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private JLabel descriptionLabel;
- final private JLabel[] iconLabels;
- final private JPanel iconPanel = new JPanel();
- final private List<? extends IIconInformation> icons;
- private int mModifiers;
- final private int numOfIcons;
- private int result;
- private Position selected = new Position(0, 0);
- final private int xDimension;
- private int yDimension;
-
- public IconSelectionPopupDialog(final Frame frame, final List<? extends IIconInformation> icons) {
- super(frame, TextUtils.getText("select_icon"));
- getContentPane().setLayout(new BorderLayout());
- this.icons = icons;
- setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(final WindowEvent we) {
- close();
- }
- });
- numOfIcons = icons.size();
- xDimension = (int) Math.ceil(Math.sqrt(numOfIcons));
- if (numOfIcons <= xDimension * (xDimension - 1)) {
- yDimension = xDimension - 1;
- }
- else {
- yDimension = xDimension;
- }
- final GridLayout gridlayout = new GridLayout(0, xDimension);
- gridlayout.setHgap(3);
- gridlayout.setVgap(3);
- iconPanel.setLayout(gridlayout);
- iconLabels = new JLabel[numOfIcons];
- for (int i = 0; i < numOfIcons; ++i) {
- final IIconInformation icon = icons.get(i);
- iconPanel.add(iconLabels[i] = new JLabel(icon.getIcon()));
- iconLabels[i].setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
- iconLabels[i].addMouseListener(this);
- }
- final int perIconSize = 27;
- iconPanel.setPreferredSize(new Dimension(xDimension * perIconSize, yDimension * perIconSize));
- iconPanel.setMinimumSize(new Dimension(xDimension * perIconSize, yDimension * perIconSize));
- iconPanel.setMaximumSize(new Dimension(xDimension * perIconSize, yDimension * perIconSize));
- iconPanel.setSize(new Dimension(xDimension * perIconSize, yDimension * perIconSize));
- getContentPane().add(iconPanel, BorderLayout.CENTER);
- descriptionLabel = new JLabel(" ");
- getContentPane().add(descriptionLabel, BorderLayout.SOUTH);
- setSelectedPosition(new Position(0, 0));
- select(getSelectedPosition());
- addKeyListener(this);
- pack();
- }
-
- private void addIcon(final int pModifiers) {
- result = calculateIndex(getSelectedPosition());
- mModifiers = pModifiers;
- this.dispose();
- }
-
- private int calculateIndex(final Position position) {
- return position.getY() * xDimension + position.getX();
- }
-
- private boolean canSelect(final Position position) {
- return ((position.getX() >= 0) && (position.getX() < xDimension) && (position.getY() >= 0)
- && (position.getY() < yDimension) && (calculateIndex(position) < numOfIcons));
- }
-
- private void close() {
- result = -1;
- mModifiers = 0;
- this.dispose();
- }
-
- private void cursorDown() {
- final Position newPosition = new Position(getSelectedPosition().getX(), getSelectedPosition().getY() + 1);
- if (canSelect(newPosition)) {
- select(newPosition);
- }
- }
-
- private void cursorLeft() {
- final Position newPosition = new Position(getSelectedPosition().getX() - 1, getSelectedPosition().getY());
- if (canSelect(newPosition)) {
- select(newPosition);
- }
- }
-
- private void cursorRight() {
- final Position newPosition = new Position(getSelectedPosition().getX() + 1, getSelectedPosition().getY());
- if (canSelect(newPosition)) {
- select(newPosition);
- }
- }
-
- private void cursorUp() {
- final Position newPosition = new Position(getSelectedPosition().getX(), getSelectedPosition().getY() - 1);
- if (canSelect(newPosition)) {
- select(newPosition);
- }
- }
-
- private int findIndexByKeyEvent(final KeyEvent keyEvent) {
- for (int i = 0; i < icons.size(); i++) {
- final IIconInformation info = icons.get(i);
- final KeyStroke iconKeyStroke = info.getKeyStroke();
- if (iconKeyStroke != null
- && (keyEvent.getKeyCode() == iconKeyStroke.getKeyCode()
- && keyEvent.getKeyCode() != 0
- && (iconKeyStroke.getModifiers() & InputEvent.SHIFT_MASK) == (keyEvent.getModifiers() & InputEvent.SHIFT_MASK) || keyEvent
- .getKeyChar() == iconKeyStroke.getKeyChar()) && keyEvent.getKeyChar() != 0
- && keyEvent.getKeyChar() != KeyEvent.CHAR_UNDEFINED) {
- return i;
- }
- }
- return -1;
- }
-
- /**
- * Transfer shift masks from InputEvent to ActionEvent. But, why don't they
- * use the same constants???? Java miracle.
- */
- public int getModifiers() {
- int m = mModifiers;
- if ((mModifiers & (ActionEvent.SHIFT_MASK | InputEvent.SHIFT_DOWN_MASK)) != 0) {
- m |= ActionEvent.SHIFT_MASK;
- }
- if ((mModifiers & (ActionEvent.CTRL_MASK | InputEvent.CTRL_DOWN_MASK)) != 0) {
- m |= ActionEvent.CTRL_MASK;
- }
- if ((mModifiers & (ActionEvent.META_MASK | InputEvent.META_DOWN_MASK)) != 0) {
- m |= ActionEvent.META_MASK;
- }
- if ((mModifiers & (ActionEvent.ALT_MASK | InputEvent.ALT_DOWN_MASK)) != 0) {
- m |= ActionEvent.ALT_MASK;
- }
- return m;
- }
-
- private Position getPosition(final JLabel caller) {
- int index = 0;
- for (index = 0; index < iconLabels.length; index++) {
- if (caller == iconLabels[index]) {
- break;
- }
- }
- return new Position(index % xDimension, index / xDimension);
- }
-
- public int getResult() {
- return result;
- }
-
- private Position getSelectedPosition() {
- return selected;
- }
-
- private void highlight(final Position position) {
- iconLabels[calculateIndex(position)].setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
- */
- public void keyPressed(final KeyEvent keyEvent) {
- switch (keyEvent.getKeyCode()) {
- case KeyEvent.VK_RIGHT:
- case KeyEvent.VK_KP_RIGHT:
- cursorRight();
- return;
- case KeyEvent.VK_LEFT:
- case KeyEvent.VK_KP_LEFT:
- cursorLeft();
- return;
- case KeyEvent.VK_DOWN:
- case KeyEvent.VK_KP_DOWN:
- cursorDown();
- return;
- case KeyEvent.VK_UP:
- case KeyEvent.VK_KP_UP:
- cursorUp();
- return;
- case KeyEvent.VK_ESCAPE:
- keyEvent.consume();
- close();
- return;
- case KeyEvent.VK_ENTER:
- case KeyEvent.VK_SPACE:
- keyEvent.consume();
- addIcon(keyEvent.getModifiers());
- return;
- }
- final int index = findIndexByKeyEvent(keyEvent);
- if (index != -1) {
- result = index;
- mModifiers = keyEvent.getModifiers();
- keyEvent.consume();
- this.dispose();
- }
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
- */
- public void keyReleased(final KeyEvent arg0) {
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
- */
- public void keyTyped(final KeyEvent arg0) {
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
- */
- public void mouseClicked(final MouseEvent mouseEvent) {
- addIcon(mouseEvent.getModifiers());
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
- */
- public void mouseEntered(final MouseEvent arg0) {
- select(getPosition((JLabel) arg0.getSource()));
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
- */
- public void mouseExited(final MouseEvent arg0) {
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
- */
- public void mousePressed(final MouseEvent arg0) {
- }
-
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
- */
- public void mouseReleased(final MouseEvent arg0) {
- }
-
- private void select(final Position position) {
- unhighlight(getSelectedPosition());
- setSelectedPosition(position);
- highlight(position);
- final int index = calculateIndex(position);
- final IIconInformation iconInformation = icons.get(index);
- final String keyStroke = ResourceController.getResourceController().getProperty(iconInformation.getShortcutKey());
- if (keyStroke != null) {
- descriptionLabel.setText(iconInformation.getDescription() + ", " + keyStroke);
- }
- else {
- descriptionLabel.setText(iconInformation.getDescription());
- }
- }
-
- private void setSelectedPosition(final Position position) {
- selected = position;
- }
-
- private void unhighlight(final Position position) {
- iconLabels[calculateIndex(position)].setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/JAutoCheckBoxMenuItem.java b/freeplane/src/org/freeplane/core/ui/components/JAutoCheckBoxMenuItem.java
deleted file mode 100644
index 199dac7..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/JAutoCheckBoxMenuItem.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.event.KeyEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import javax.swing.Action;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.KeyStroke;
-
-import org.freeplane.core.ui.IFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-
-
-public class JAutoCheckBoxMenuItem extends JCheckBoxMenuItem implements PropertyChangeListener, IKeyBindingManager {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private PropertyChangeListener defaultPropertyChanegListener;
-
- public JAutoCheckBoxMenuItem(final IFreeplaneAction a) {
- super();
- setModel(new ActionToggleButtonModel(a));
- setAction(a);
- }
-
-
-
- @Override
- protected void configurePropertiesFromAction(Action a) {
- super.configurePropertiesFromAction(a);
- setSelected(((IFreeplaneAction)a).isSelected());
- }
-
-
-
- @Override
- protected PropertyChangeListener createActionPropertyChangeListener(final Action a) {
- defaultPropertyChanegListener = super.createActionPropertyChangeListener(a);
- return this;
- };
-
- public void propertyChange(final PropertyChangeEvent e) {
- if (e.getPropertyName().equals(SelectableAction.SELECTION_PROPERTY)) {
- final Boolean isSelected = (Boolean) e.getNewValue();
- setSelected(isSelected.booleanValue());
- }
- else {
- defaultPropertyChanegListener.propertyChange(e);
- }
- }
-
- private boolean isKeyBindingProcessed = false;
-
- @Override
- protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
- try {
- isKeyBindingProcessed = true;
- return super.processKeyBinding(ks, e, condition, pressed);
- }
- finally {
- isKeyBindingProcessed = false;
- }
- }
-
- public boolean isKeyBindingProcessed() {
- return isKeyBindingProcessed;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/JAutoRadioButtonMenuItem.java b/freeplane/src/org/freeplane/core/ui/components/JAutoRadioButtonMenuItem.java
deleted file mode 100644
index 9f69dfe..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/JAutoRadioButtonMenuItem.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.event.KeyEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import javax.swing.Action;
-import javax.swing.JRadioButtonMenuItem;
-import javax.swing.KeyStroke;
-
-import org.freeplane.core.ui.IFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-
-/**
- * @author Dimitry Polivaev
- * Feb 23, 2009
- */
-public class JAutoRadioButtonMenuItem extends JRadioButtonMenuItem implements PropertyChangeListener,
- IKeyBindingManager {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private PropertyChangeListener defaultPropertyChanegListener;
-
- public JAutoRadioButtonMenuItem(final IFreeplaneAction a) {
- super();
- setModel(new ActionToggleButtonModel(a));
- setAction(a);
- }
-
- @Override
- protected void configurePropertiesFromAction(Action a) {
- super.configurePropertiesFromAction(a);
- setSelected(((IFreeplaneAction)a).isSelected());
- }
-
- @Override
- protected PropertyChangeListener createActionPropertyChangeListener(final Action a) {
- defaultPropertyChanegListener = super.createActionPropertyChangeListener(a);
- return this;
- };
-
- public void propertyChange(final PropertyChangeEvent e) {
- if (e.getPropertyName().equals(SelectableAction.SELECTION_PROPERTY)) {
- final Boolean isSelected = (Boolean) e.getNewValue();
- setSelected(isSelected.booleanValue());
- }
- else {
- defaultPropertyChanegListener.propertyChange(e);
- }
- }
-
- private boolean isKeyBindingProcessed = false;
-
- @Override
- protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
- try {
- isKeyBindingProcessed = true;
- return super.processKeyBinding(ks, e, condition, pressed);
- }
- finally {
- isKeyBindingProcessed = false;
- }
- }
-
- public boolean isKeyBindingProcessed() {
- return isKeyBindingProcessed;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/JResizer.java b/freeplane/src/org/freeplane/core/ui/components/JResizer.java
deleted file mode 100644
index 83c3a43..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/JResizer.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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 CONTROL_SIZE of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.Point;
-import java.awt.event.ComponentListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseMotionAdapter;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import javax.swing.JComponent;
-import javax.swing.SwingUtilities;
-
-/**
- * @author Dimitry Polivaev
- * Jan 24, 2011
- */
- at SuppressWarnings("serial")
-public class JResizer extends JComponent{
- private static final int CONTROL_SIZE = 5;
- private Point point;
- private int index;
- public enum Direction {RIGHT, LEFT, UP, DOWN}
- private Set<ResizerListener> resizeListener = new LinkedHashSet<ResizerListener>();
-
- public JResizer(final Direction d) {
- setOpaque(true);
- final int w;
- final int h;
- if(d.equals(Direction.RIGHT)){
- w = CONTROL_SIZE;
- h = 0;
- setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
- }
- else if(d.equals(Direction.LEFT)){
- h = CONTROL_SIZE;
- w = 0;
- setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
- }
- else if(d.equals(Direction.UP)){
- h = 0;
- w = CONTROL_SIZE;
- setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));
- }
- else /*Direction.DOWN*/ {
- h = 0;
- w = CONTROL_SIZE;
- setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
- }
-
- setPreferredSize(new Dimension(w, h));
- addMouseListener(new MouseAdapter() {
-
-
-
- @Override
- public void mousePressed(MouseEvent e) {
- point = null;
- }
-
- @Override
- public void mouseReleased(MouseEvent e) {
- point = null;
- }
-
- });
- addMouseMotionListener(new MouseMotionAdapter() {
-
- private int getIndex() {
- final Container parent = getParent();
- for(int i = 0; i < parent.getComponentCount(); i++ ){
- if(JResizer.this.equals(parent.getComponent(i))){
- if(d.equals(Direction.RIGHT)){
- return i + 1;
- }
- else if(d.equals(Direction.LEFT)){
- return i - 1;
- }
- else if(d.equals(Direction.UP)){
- return i - 1;
- }
- else if(d.equals(Direction.DOWN)){
- return i + 1;
- }
- }
- }
- return -1;
- }
-
-
- public void mouseDragged(MouseEvent e) {
- final Point point2 = e.getPoint();
- SwingUtilities.convertPointToScreen(point2, e.getComponent());
- if(point != null){
- final JComponent parent = (JComponent) getParent();
- final Component resizedComponent = parent.getComponent(index);
- final Dimension size = new Dimension(resizedComponent.getPreferredSize());
- if(d.equals(Direction.RIGHT)){
- size.width -= (point2.x - point.x);
- }
- else if(d.equals(Direction.LEFT)){
- size.width += (point2.x - point.x);
- }
- else if(d.equals(Direction.UP)){
- size.height += (point2.x - point.x);
- }
- else if(d.equals(Direction.DOWN)){
- size.height -= (point2.x - point.x);
- }
- resizedComponent.setPreferredSize(new Dimension(Math.max(size.width, 0), Math.max(size.height, 0)));
- parent.revalidate();
- parent.repaint();
- fireSizeChanged(resizedComponent);
- }
- else{
- index = getIndex();
- }
- point = point2;
- }
- });
- }
-
- public void addResizerListener(ResizerListener listener) {
- if(listener == null) return;
-
- synchronized (resizeListener) {
- resizeListener.add(listener);
- }
-
- }
-
- public void removeResizerListener(ComponentListener listener) {
- if(listener == null) return;
-
- synchronized (resizeListener) {
- resizeListener.remove(listener);
- }
- }
-
- private void fireSizeChanged(Component resizedComponent) {
- ResizeEvent event = new ResizeEvent(resizedComponent);
- synchronized (this.resizeListener) {
- for(ResizerListener listener : resizeListener) {
- listener.componentResized(event);
- }
- }
-
- }
-
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/MultipleImage.java b/freeplane/src/org/freeplane/core/ui/components/MultipleImage.java
deleted file mode 100644
index e334680..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/MultipleImage.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Rectangle;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.Icon;
-
-public class MultipleImage implements Icon {
- final private List<Icon> mIcons = new ArrayList<Icon>();
-
- public MultipleImage() {
- }
-
- public void addImage(final Icon icon) {
- mIcons.add(icon);
- };
-
- public int getIconHeight() {
- int myY = 0;
- for (final Icon icon : mIcons) {
- final int otherHeight = icon.getIconHeight();
- if (otherHeight > myY) {
- myY = otherHeight;
- }
- }
- return myY;
- };
-
- public int getIconWidth() {
- int myX = 0;
- for (final Icon icon : mIcons) {
- myX += icon.getIconWidth();
- }
- return myX;
- }
-
- public int getImageCount() {
- return mIcons.size();
- }
-
- public void paintIcon(final Component c, final Graphics g, final int x, final int y) {
- int myX = x;
- for (final Icon icon : mIcons) {
- icon.paintIcon(c, g, myX, y);
- myX += icon.getIconWidth();
- }
- }
-
-
- //DOCEAR - get a rect relative to this image for a specific icon
- public Rectangle getIconR(Icon icon) {
- int myX = 0;
- for (final Icon ico : mIcons) {
- if(ico.equals(icon)) {
- return new Rectangle(myX, 0, ico.getIconWidth(), ico.getIconHeight());
- }
- myX += ico.getIconWidth();
- }
- return null;
- }
-};
diff --git a/freeplane/src/org/freeplane/core/ui/components/OneTouchCollapseResizer.java b/freeplane/src/org/freeplane/core/ui/components/OneTouchCollapseResizer.java
deleted file mode 100644
index 78a404f..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/OneTouchCollapseResizer.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 29.11.2011
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import javax.swing.JComponent;
-import javax.swing.JPanel;
-
-import org.freeplane.core.util.LogUtils;
-
-/**
- *
- */
-public class OneTouchCollapseResizer extends JResizer {
- private static final long serialVersionUID = 3836146387249880446L;
- public static final String COLLAPSED = OneTouchCollapseResizer.class.getPackage().getName()+".collapsed";
- private static final String ALREADY_IN_PAINT = OneTouchCollapseResizer.class.getPackage().getName()+".ALREADY_PAINTING";
-
- public enum CollapseDirection {COLLAPSE_LEFT, COLLAPSE_RIGHT};
-
- private Dimension lastComponentSize;
- protected boolean expanded = true;
- private JPanel hotspot;
- private CollapseDirection collapseDirection;
- private int inset = 2;
- private final Direction direction;
- private Integer resizeComponentIndex;
-
- private Set<ComponentCollapseListener> collapseListener = new LinkedHashSet<ComponentCollapseListener>();
-
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
- /**
- * @param d
- */
- public OneTouchCollapseResizer(final Direction d, final CollapseDirection collapseDirection) {
- super(d);
- direction = d;
- this.setDividerSize(7);
- this.collapseDirection = collapseDirection;
-
- MouseListener listener = new MouseListener() {
- private void resetCursor() {
- if(d.equals(Direction.RIGHT)){
- setCursor(Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR));
- }
- else if(d.equals(Direction.LEFT)){
- setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
- }
- else if(d.equals(Direction.UP)){
- setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));
- }
- else /*Direction.DOWN*/ {
- setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
- }
- }
-
- public void mouseReleased(MouseEvent e) {
- }
-
- public void mousePressed(MouseEvent e) {
- }
-
- public void mouseExited(MouseEvent e) {
- if(e.getComponent() == getHotSpot()) {
- resetCursor();
- }
- if(isExpanded()) {
- resetCursor();
- }
- }
-
- public void mouseEntered(MouseEvent e) {
- if(e.getComponent() == getHotSpot()) {
- getHotSpot().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
- }
- if(!isExpanded()) {
- e.getComponent().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
- }
- }
-
- public void mouseClicked(MouseEvent e) {
- final JComponent parent = (JComponent) getParent();
- final Component resizedComponent = getResizedParent();
- if(e.getComponent() == getHotSpot()) {
- final Dimension size = new Dimension(resizedComponent.getPreferredSize());
-
- if (isExpanded()) {
- getHotSpot().setEnabled(true);
- lastComponentSize = new Dimension(size);
- setExpanded(false);
- }
- else {
- setExpanded(true);
- }
- parent.revalidate();
- parent.repaint();
- }
- else {
- if (!isExpanded()) {
- setExpanded(true);
- parent.revalidate();
- parent.repaint();
- }
- }
- }
- };
- getHotSpot().addMouseListener(listener);
- addMouseListener(listener);
-
- add(getHotSpot());
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public boolean isExpanded() {
- return this.expanded;
- }
-
- public void setDividerSize(int size) {
- final int w;
- final int h;
- if(direction.equals(Direction.RIGHT)){
- w = size;
- h = 0;
- }
- else if(direction.equals(Direction.LEFT)){
- h = 0;
- w = size;
- }
- else if(direction.equals(Direction.UP)){
- h = size;
- w = 0;
- }
- else /*Direction.DOWN*/ {
- h = size;
- w = 0;
- }
- setPreferredSize(new Dimension(w, h));
- }
-
- public int getDividerSize() {
- if(direction.equals(Direction.RIGHT) || direction.equals(Direction.LEFT)){
- return getPreferredSize().width;
- }
- else /*Direction.DOWN || Direction.UP*/ {
- return getPreferredSize().height;
- }
- }
-
- public void setExpanded(boolean enabled) {
- if(this.expanded != enabled) {
- try {
- Component resizedComponent = getResizedParent();
- if(resizedComponent instanceof JComponent) {
- ((JComponent) resizedComponent).putClientProperty(COLLAPSED, (enabled ? null : "true"));
- }
- if(enabled) {
- if(lastComponentSize != null) {
- resizedComponent.setPreferredSize(lastComponentSize);
- }
- }
- else {
- resizedComponent.setPreferredSize(new Dimension(0,0));
- }
-
- fireCollapseStateChanged(resizedComponent, enabled);
- }
- catch (Exception e) {
- // just ignore
- }
- }
- this.expanded = enabled;
- }
-
- private Component getResizedParent() {
- final JComponent parent = (JComponent) getParent();
- if(parent != null && resizeComponentIndex == null) {
- resizeComponentIndex = getIndex();
- lastComponentSize = new Dimension(parent.getComponent(resizeComponentIndex).getPreferredSize());
- }
- return parent.getComponent(resizeComponentIndex);
- }
-
- public void paint(Graphics g) {
- if(getClientProperty(ALREADY_IN_PAINT) != null) {
- return;
- }
- putClientProperty(ALREADY_IN_PAINT, "true");
- super.paint(g);
- int center_y = getHeight()/2;
- int divSize = getDividerSize();
- getHotSpot().setBounds(0, center_y-15, divSize, 30);
- Dimension size = getResizedParent().getPreferredSize();
- if((direction.equals(Direction.RIGHT) || direction.equals(Direction.LEFT)) && size.width <= getDividerSize()) {
- setExpanded(false);
-
- }
- else if((direction.equals(Direction.UP) || direction.equals(Direction.DOWN)) && size.height <= getDividerSize()){
- setExpanded(false);
- }
- else {
- setExpanded(true);
- //getHotSpot().setBounds(0, 0, getDividerSize(), 24);
- }
- if(getResizedParent() instanceof JComponent) {
- ((JComponent) getResizedParent()).putClientProperty(COLLAPSED, (isExpanded() ? null : "true"));
- }
- getHotSpot().paint(g.create(getHotSpot().getLocation().x, getHotSpot().getLocation().y, getHotSpot().getWidth(), getHotSpot().getHeight()));
- putClientProperty(ALREADY_IN_PAINT, null);
- }
-
- private Component getHotSpot() {
- if(hotspot == null) {
- hotspot = new JPanel() {
- private static final long serialVersionUID = -5321517835206976034L;
-
- public void paint(Graphics g) {
- if (isExpanded()) {
- drawCollapseLabel(g);
- }
- else {
- drawExpandLabel(g);
- }
- }
- };
- }
- return hotspot;
- }
-
- private void drawCollapseLabel(Graphics g) {
- Dimension size = g.getClipBounds().getSize();
- int half_length = Math.round(g.getClipBounds().height*0.2f);
- int center_y = size.height / 2;
-
- g.setColor(getBackground());
- g.fillRect(0, 0, size.width, size.height-0);
-
- //g.setColor();
- if(this.collapseDirection.equals(CollapseDirection.COLLAPSE_LEFT)) {
- arrowLeft(g, size, half_length, center_y);
- }
- else if(this.collapseDirection.equals(CollapseDirection.COLLAPSE_RIGHT)) {
- arrowRight(g, half_length, center_y);
- }
- }
-
-
-
- private void drawExpandLabel(Graphics g) {
- Dimension size = g.getClipBounds().getSize();
- int half_length = (g.getClipBounds().height-(inset*6))/2;
- int center_y = size.height / 2;
-
- g.setColor(getBackground());
- g.fillRect(0, 0, size.width, size.height-0);
-
- if(this.collapseDirection.equals(CollapseDirection.COLLAPSE_LEFT)) {
- arrowRight(g, half_length, center_y);
- }
- else if(this.collapseDirection.equals(CollapseDirection.COLLAPSE_RIGHT)) {
- arrowLeft(g, size, half_length, center_y);
- }
- }
-
-
- /**
- * @param g
- * @param size
- * @param half_length
- * @param center_y
- */
- private void arrowLeft(Graphics g, Dimension size, int half_length, int center_y) {
- int[] x = new int[]{inset, size.width - inset, size.width - inset};
- int[] y = new int[]{center_y, center_y-half_length, center_y + half_length};
- g.setColor(Color.DARK_GRAY);
- g.fillPolygon(x, y, 3);
- g.setColor(Color.DARK_GRAY);
- g.drawLine(inset, center_y, size.width - inset, center_y - half_length);
- g.setColor(Color.GRAY);
- g.drawLine( size.width - inset, center_y + half_length, inset, center_y);
- g.setColor(Color.GRAY);
- g.drawLine( size.width - inset, center_y - half_length, size.width - inset, center_y + half_length);
- }
-
- /**
- * @param g
- * @param half_length
- * @param center_y
- */
- private void arrowRight(Graphics g, int half_length, int center_y) {
- int[] x = new int[]{inset, inset, getSize().width - inset};
- int[] y = new int[]{center_y+half_length, center_y-half_length, center_y};
-
- g.setColor( Color.DARK_GRAY);
- g.fillPolygon(x,y,3);
- g.setColor( Color.DARK_GRAY);
- g.drawLine( inset, center_y + half_length, inset, center_y - half_length);
- g.setColor(Color.GRAY);
- g.drawLine( inset, center_y - half_length, getSize().width - inset, center_y);
- g.setColor( Color.LIGHT_GRAY);
- g.drawLine( getSize().width - inset, center_y, inset, center_y + half_length);
- }
-
- private int getIndex() {
- final Container parent = getParent();
- for(int i = 0; i < parent.getComponentCount(); i++ ){
- if(OneTouchCollapseResizer.this.equals(parent.getComponent(i))){
- if(direction.equals(Direction.RIGHT)){
- return i + 1;
- }
- else if(direction.equals(Direction.LEFT)){
- return i - 1;
- }
- else if(direction.equals(Direction.UP)){
- return i - 1;
- }
- else if(direction.equals(Direction.DOWN)){
- return i + 1;
- }
- }
- }
- return -1;
- }
-
- public void addCollapseListener(ComponentCollapseListener listener) {
- if(listener == null) return;
-
- synchronized (collapseListener) {
- collapseListener.add(listener);
- }
-
- }
-
- public void removeCollapseListener(ComponentCollapseListener listener) {
- if(listener == null) return;
-
- synchronized (collapseListener) {
- collapseListener.remove(listener);
- }
- }
-
- private void fireCollapseStateChanged(Component resizedComponent, boolean expanded) {
- ResizeEvent event = new ResizeEvent(resizedComponent);
- synchronized (this.collapseListener) {
- for(ComponentCollapseListener listener : collapseListener) {
- try {
- if(expanded) {
- listener.componentExpanded(event);
- }
- else {
- listener.componentCollapsed(event);
- }
- }
- catch (Exception e) {
- LogUtils.severe(e);
- }
- }
- }
-
- }
-
- public interface ComponentCollapseListener {
- public void componentCollapsed(ResizeEvent event);
- public void componentExpanded(ResizeEvent event);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/OptionalDontShowMeAgainDialog.java b/freeplane/src/org/freeplane/core/ui/components/OptionalDontShowMeAgainDialog.java
deleted file mode 100644
index 87f0b55..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/OptionalDontShowMeAgainDialog.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.Frame;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-
-import javax.swing.AbstractAction;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.WindowConstants;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-/**
- * Dialog with a decision that can be disabled.
- *
- * @author foltin
- */
-public class OptionalDontShowMeAgainDialog {
- public final static int BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED = 1;
- public final static int ONLY_OK_SELECTION_IS_STORED = 0;
- public final static int ONLY_OK_SELECTION_IS_SHOWN = 2;
-
- static public int show( final String pMessageId, final String pTitleId,
- final String pPropertyName, final int pMessageType) {
- return new OptionalDontShowMeAgainDialog(pMessageId, pTitleId, pPropertyName, pMessageType).show()
- .getResult();
- }
-
-// // private final Controller controller;
- private JDialog mDialog;
- private JCheckBox mDontShowAgainBox;
- final private String mMessageId;
- final private int mMessageType;
- final private NodeModel mNode;
- final private Frame mParent;
- final private String mPropertyName;
- private int mResult = JOptionPane.CANCEL_OPTION;
- final private String mTitleId;
-
- private OptionalDontShowMeAgainDialog( final String pMessageId, final String pTitleId,
- final String pPropertyName, final int pMessageType) {
-// this.controller = controller;
- Controller controller = Controller.getCurrentController();
- mParent = controller.getViewController().getFrame();
- final IMapSelection selection = controller.getSelection();
- if (selection != null) {
- mNode = selection.getSelected();
- }
- else {
- mNode = null;
- }
- mMessageId = pMessageId;
- mTitleId = pTitleId;
- mPropertyName = pPropertyName;
- mMessageType = pMessageType;
- }
-
- private void close(final int pResult) {
- mResult = pResult;
- if (mDontShowAgainBox.isSelected()) {
- if (mMessageType == OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED) {
- if (mResult == JOptionPane.OK_OPTION) {
- setProperty("true");
- }
- }
- else {
- setProperty((mResult == JOptionPane.OK_OPTION) ? "true" : "false");
- }
- }
- else {
- setProperty("");
- }
- mDialog.setVisible(false);
- mDialog.dispose();
- }
-
- private String getProperty() {
- return ResourceController.getResourceController().getProperty(mPropertyName);
- }
-
- /**
- * @return an int from JOptionPane (eg. JOptionPane.OK_OPTION).
- */
- private int getResult() {
- return mResult;
- }
-
- private void setProperty(final String value) {
- ResourceController.getResourceController().setProperty(mPropertyName, value);
- }
-
- private OptionalDontShowMeAgainDialog show() {
- final String property = getProperty();
- if (StringUtils.equals(property, "true")) {
- mResult = JOptionPane.OK_OPTION;
- return this;
- }
- if (mMessageType == BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED && StringUtils.equals(property, "false")) {
- mResult = JOptionPane.CANCEL_OPTION;
- return this;
- }
- mDialog = null;
- mDialog = new JDialog(mParent, TextUtils.getText(mTitleId));
- mDialog.setModal(true);
- mDialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- final AbstractAction cancelAction = new AbstractAction() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent pE) {
- close(JOptionPane.CANCEL_OPTION);
- }
- };
- final AbstractAction okAction = new AbstractAction() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent pE) {
- close(JOptionPane.OK_OPTION);
- }
- };
- UITools.addEscapeActionToDialog(mDialog, cancelAction);
- mDialog.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(final WindowEvent pE) {
- close(JOptionPane.CANCEL_OPTION);
- }
- });
- mDialog.getContentPane().setLayout(new GridBagLayout());
- mDialog.getContentPane().add(
- new JLabel(TextUtils.getText(mMessageId)),
- new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
- 5, 5, 0, 0), 0, 0));
- final ImageIcon questionMark;
- if(mMessageType == ONLY_OK_SELECTION_IS_SHOWN){
- questionMark = new ImageIcon(ResourceController.getResourceController().getResource(
- "/images/icons/messagebox_warning.png"));
- }
- else{
- questionMark = new ImageIcon(ResourceController.getResourceController().getResource(
- "/images/icons/help.png"));
- }
- mDialog.getContentPane().add(
- new JLabel(questionMark),
- new GridBagConstraints(0, 0, 1, 2, 1.0, 2.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
- 5, 5, 0, 0), 0, 0));
- String boxString;
- if (mMessageType != OptionalDontShowMeAgainDialog.BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED) {
- boxString = "OptionalDontShowMeAgainDialog.dontShowAgain";
- }
- else {
- boxString = "OptionalDontShowMeAgainDialog.rememberMyDescision";
- }
- mDontShowAgainBox = new JCheckBox(TextUtils.getRawText(boxString));
- MenuBuilder.setLabelAndMnemonic(mDontShowAgainBox, null);
- mDialog.getContentPane().add(
- mDontShowAgainBox,
- new GridBagConstraints(0, 2, 3, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
- 5, 5, 0, 0), 0, 0));
- final String okText;
- if(mMessageType == ONLY_OK_SELECTION_IS_SHOWN){
- okText = TextUtils.getRawText("ok");
- }
- else{
- okText = TextUtils.getRawText("OptionalDontShowMeAgainDialog.ok");
- }
- final JButton okButton = new JButton(okText);
- MenuBuilder.setLabelAndMnemonic(okButton, null);
- okButton.addActionListener(okAction);
- mDialog.getContentPane().add(
- okButton,
- new GridBagConstraints(2, 3, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
- 5, 5, 0, 0), 0, 0));
- if(mMessageType != ONLY_OK_SELECTION_IS_SHOWN){
- final JButton cancelButton = new JButton(TextUtils.getRawText("OptionalDontShowMeAgainDialog.cancel"));
- MenuBuilder.setLabelAndMnemonic(cancelButton, null);
- cancelButton.addActionListener(cancelAction);
- mDialog.getContentPane().add(
- cancelButton,
- new GridBagConstraints(3, 3, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(
- 5, 5, 0, 0), 0, 0));
- }
- mDialog.getRootPane().setDefaultButton(okButton);
- mDialog.pack();
- if (mNode != null) {
- UITools.setDialogLocationRelativeTo(mDialog, mNode);
- }
- else {
- mDialog.setLocationRelativeTo(null);
- }
- mDialog.setVisible(true);
- return this;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/ResizeEvent.java b/freeplane/src/org/freeplane/core/ui/components/ResizeEvent.java
deleted file mode 100644
index bfb73e2..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/ResizeEvent.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.freeplane.core.ui.components;
-
-import java.util.EventObject;
-
-public class ResizeEvent extends EventObject {
-
- private static final long serialVersionUID = 3131068483469543037L;
-
- public ResizeEvent(Object source) {
- super(source);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/UITools.java b/freeplane/src/org/freeplane/core/ui/components/UITools.java
deleted file mode 100644
index 66ca285..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/UITools.java
+++ /dev/null
@@ -1,627 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.EventQueue;
-import java.awt.Font;
-import java.awt.Frame;
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
-import java.net.URI;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.BorderFactory;
-import javax.swing.FocusManager;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
-import javax.swing.border.Border;
-import javax.swing.border.CompoundBorder;
-import javax.swing.border.TitledBorder;
-import javax.swing.event.AncestorEvent;
-import javax.swing.event.AncestorListener;
-import javax.swing.text.JTextComponent;
-
-import org.freeplane.core.resources.IFreeplanePropertyListener;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.main.application.FreeplaneSplashModern;
-
-/**
- * Utilities for accessing the GUI, creating dialogs etc.: In scripts available as "global variable" <code>ui</code>.
- * <p>
- * In scripts this would be a simple way of opening a info popup:
- * <pre>
- * ui.informationMessage("Hello World!")
- * ui.informationMessage(ui.frame, "Hello World!") // longer version, equivalent
- * </pre>
- *
- * @author Dimitry Polivaev
- * @since 29.12.2008
- */
-public class UITools {
- @SuppressWarnings("serial")
- public static final class InsertEolAction extends AbstractAction {
- public void actionPerformed(ActionEvent e) {
- JTextComponent c = (JTextComponent) e.getSource();
- c.replaceSelection("\n");
- }
- }
-
- public static final String MAIN_FREEPLANE_FRAME = "mainFreeplaneFrame";
-
- public static void addEscapeActionToDialog(final JDialog dialog) {
- class EscapeAction extends AbstractAction {
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
- dialog.dispose();
- };
- }
- UITools.addEscapeActionToDialog(dialog, new EscapeAction());
- }
-
- public static void addEscapeActionToDialog(final JDialog dialog, final Action action) {
- UITools.addKeyActionToDialog(dialog, action, "ESCAPE", "end_dialog");
- }
-
- public static void addKeyActionToDialog(final JDialog dialog, final Action action, final String keyStroke,
- final String actionId) {
- action.putValue(Action.NAME, actionId);
- dialog.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(keyStroke),
- action.getValue(Action.NAME));
- dialog.getRootPane().getActionMap().put(action.getValue(Action.NAME), action);
- }
-
- public static void convertPointFromAncestor(final Component ancestor, final Point p, Component c) {
- int x, y;
- while (c != ancestor && c != null) {
- x = c.getX();
- y = c.getY();
- p.x -= x;
- p.y -= y;
- c = c.getParent();
- };
- }
-
- public static void convertPointToAncestor(final Component source, final Point point, final Class<?> ancestorClass) {
- final Component destination = SwingUtilities.getAncestorOfClass(ancestorClass, source);
- UITools.convertPointToAncestor(source, point, destination);
- }
-
- public static void convertRectangleToAncestor(final Component from, final Rectangle r, final Component destination) {
- Point p = new Point(r.x, r.y);
- UITools.convertPointToAncestor(from, p , destination);
- r.x = p.x;
- r.y = p.y;
- }
-
- public static void convertPointToAncestor(final Component from, final Point p, final Component destination) {
- int x, y;
- for (Component c = from; c != destination && c != null; c = c.getParent()) {
- x = c.getX();
- y = c.getY();
- p.x += x;
- p.y += y;
- };
- }
-
- static public void errorMessage(final Object message) {
- final String myMessage;
- if (message != null) {
- myMessage = message.toString();
- }
- else {
- myMessage = TextUtils.getText("undefined_error");
- }
- LogUtils.warn(myMessage);
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- JOptionPane.showMessageDialog(UITools.getFrame(), myMessage, "Freeplane", JOptionPane.ERROR_MESSAGE);
- }
- });
- }
-
- static public Frame getFrame() {
- final Frame[] frames = Frame.getFrames();
- for (final Frame frame : frames) {
- if (MAIN_FREEPLANE_FRAME.equals(frame.getName())) {
- return frame;
- }
- }
- return frames.length >= 1 ? frames[0] : null;
- }
-
- /** returns a KeyStroke if possible and null otherwise. */
- public static KeyStroke getKeyStroke(final String keyStrokeDescription) {
- if (keyStrokeDescription == null) {
- return null;
- }
- final KeyStroke keyStroke = KeyStroke.getKeyStroke(keyStrokeDescription);
- if (keyStroke != null) {
- return keyStroke;
- }
- final int lastSpacePos = keyStrokeDescription.lastIndexOf(' ') + 1;
- final String modifiedDescription = keyStrokeDescription.substring(0, lastSpacePos) + "typed "
- + keyStrokeDescription.substring(lastSpacePos);
- return KeyStroke.getKeyStroke(modifiedDescription);
- }
-
- /** formats a KeyStroke in a ledgible way, e.g. Control+V. Null is converted to "".
- * Taken from MotifGraphicsUtils.paintMenuItem(). */
- public static String keyStrokeToString(KeyStroke keyStroke) {
- String acceleratorText = "";
- if (keyStroke != null) {
- int modifiers = keyStroke.getModifiers();
- if (modifiers > 0) {
- acceleratorText = KeyEvent.getKeyModifiersText(modifiers);
- acceleratorText += "+";
- }
- acceleratorText += KeyEvent.getKeyText(keyStroke.getKeyCode());
- }
- return acceleratorText;
- }
-
- static public void informationMessage(final String message) {
- UITools.informationMessage(UITools.getFrame(), message);
- }
-
- static public void informationMessage(final Frame frame, final String message) {
- UITools.informationMessage(frame, message, "Freeplane");
- }
-
- static public void informationMessage(final Frame frame, final String message, final String title) {
- JOptionPane.showMessageDialog(frame, message, title, JOptionPane.INFORMATION_MESSAGE);
- }
-
- public static void informationMessage(final Frame frame, final String text, final String string, final int type) {
- JOptionPane.showMessageDialog(frame, text, string, type);
- }
-
- static public void setBounds(final Component frame, int win_x, int win_y, int win_width, int win_height) {
- final Rectangle desktopBounds = getDesktopBounds(frame);
- int screenWidth = desktopBounds.width;
- if(win_width != -1)
- win_width = Math.min(win_width, screenWidth );
- else
- win_width = screenWidth * 4 / 5;
- int screenHeight = desktopBounds.height;
- if(win_height != -1)
- win_height = Math.min(win_height, screenHeight);
- else
- win_height = screenHeight * 4 / 5;
- if(win_x != -1){
- win_x = Math.min(screenWidth + desktopBounds.x - win_width, win_x);
- win_x = Math.max(desktopBounds.x, win_x);
- }
- else
- win_x = desktopBounds.x + (screenWidth - win_width) / 2;
- if(win_y != -1){
- win_y = Math.max(desktopBounds.y, win_y);
- win_y = Math.min(screenHeight + desktopBounds.y - win_height, win_y);
- }
- else
- win_y = desktopBounds.y + (screenHeight - win_height) / 2;
- frame.setBounds(win_x, win_y, win_width, win_height);
- }
-
- public static Rectangle getDesktopBounds(Component frame) {
- final Toolkit defaultToolkit = Toolkit.getDefaultToolkit();
- final Insets screenInsets = defaultToolkit.getScreenInsets(frame.getGraphicsConfiguration());
- final Dimension screenSize = defaultToolkit.getScreenSize();
- final int screenWidth = screenSize.width - screenInsets.left - screenInsets.right;
- final int screenHeight = screenSize.height - screenInsets.top - screenInsets.bottom;
- return new Rectangle(screenInsets.left, screenInsets.top, screenWidth, screenHeight);
- }
-
- public static void setDialogLocationRelativeTo(final JDialog dialog, final Component c) {
- if (c == null || ! c.isShowing()) {
- return;
- }
- final Point compLocation = c.getLocationOnScreen();
- final int cw = c.getWidth();
- final int ch = c.getHeight();
- final Container parent = dialog.getParent();
- final Point parentLocation = parent.getLocationOnScreen();
- final int pw = parent.getWidth();
- final int ph = parent.getHeight();
- final int dw = dialog.getWidth();
- final int dh = dialog.getHeight();
- final Rectangle desktopBounds = getDesktopBounds(c);
- final int minX = Math.max(parentLocation.x, desktopBounds.x);
- final int minY = Math.max(parentLocation.y, desktopBounds.y);
- final int maxX = Math.min(parentLocation.x + pw, desktopBounds.x + desktopBounds.width);
- final int maxY = Math.min(parentLocation.y + ph, desktopBounds.y + desktopBounds.height);
- int dx, dy;
- if (compLocation.x + cw < minX) {
- dx = minX;
- }
- else if (compLocation.x > maxX) {
- dx = maxX - dw;
- }
- else {
- final int leftSpace = compLocation.x - minX;
- final int rightSpace = maxX - (compLocation.x + cw);
- if (leftSpace > rightSpace) {
- if (leftSpace > dw) {
- dx = compLocation.x - dw;
- }
- else {
- dx = minX;
- }
- }
- else {
- if (rightSpace > dw) {
- dx = compLocation.x + cw;
- }
- else {
- dx = maxX - dw;
- }
- }
- }
- if (compLocation.y + ch < minY) {
- dy = minY;
- }
- else if (compLocation.y > maxY) {
- dy = maxY - dh;
- }
- else {
- final int topSpace = compLocation.y - minY;
- final int bottomSpace = maxY - (compLocation.y + ch);
- if (topSpace > bottomSpace) {
- if (topSpace > dh) {
- dy = compLocation.y - dh;
- }
- else {
- dy = minY;
- }
- }
- else {
- if (bottomSpace > dh) {
- dy = compLocation.y + ch;
- }
- else {
- dy = maxY - dh;
- }
- }
- }
- dialog.setLocation(dx, dy);
- }
-
- public static void setDialogLocationRelativeTo(final JDialog dialog,
- final NodeModel node) {
- if (node == null) {
- return;
- }
- final IMapViewManager viewController = Controller.getCurrentController().getMapViewManager();
- viewController.scrollNodeToVisible(node);
- final Component c = viewController.getComponent(node);
- UITools.setDialogLocationRelativeTo(dialog, c);
- }
-
- public static void setDialogLocationUnder(final JDialog dialog, final NodeModel node) {
- final Controller controller = Controller.getCurrentController();
- final IMapViewManager viewController = controller.getMapViewManager();
- final JComponent c = (JComponent) viewController.getComponent(node);
- final int x = 0;
- final int y = c.getHeight();
- final Point location = new Point(x, y);
- SwingUtilities.convertPointToScreen(location, c);
- UITools.setBounds(dialog, location.x, location.y, dialog.getWidth(), dialog.getHeight());
- }
-
- /**
- * Shows the error message "attributes_adding_empty_attribute_error"
- */
- public static void showAttributeEmptyStringErrorMessage() {
- JOptionPane.showMessageDialog(null, TextUtils.getText("attributes_adding_empty_attribute_error"),
- TextUtils.getText("error"), JOptionPane.ERROR_MESSAGE);
- }
-
- static public void showMessage(String message, int messageType) {
- backOtherWindows();
- JTextArea infoPane = new JTextArea();
- infoPane.setEditable(false);
- infoPane.setMargin(new Insets(5,5,5,5));
- infoPane.setLineWrap(true);
- infoPane.setWrapStyleWord(true);
- infoPane.setText(message);
- infoPane.setColumns(60);
- JScrollPane scrollPane = new JScrollPane(infoPane);
- scrollPane.setPreferredSize(new Dimension(400, 200));
- JOptionPane.showMessageDialog(getFrame(), scrollPane, "Freeplane", messageType);
- }
- public static int showConfirmDialog(final NodeModel node, final Object message, final String title,
- final int optionType, final int messageType) {
- final Controller controller = Controller.getCurrentController();
- final IMapViewManager viewController = controller.getMapViewManager();
- final Component parentComponent;
- if (node == null) {
- parentComponent = getFrame();
- }
- else {
- viewController.scrollNodeToVisible(node);
- parentComponent = viewController.getComponent(node);
- }
- return JOptionPane.showConfirmDialog(parentComponent, message, title, optionType, messageType);
- }
-
- public static int showConfirmDialog( final NodeModel node, final Object message,
- final String title, final int optionType) {
- return showConfirmDialog( node, message, title, optionType, JOptionPane.QUESTION_MESSAGE);
- }
-
- public static String showInputDialog( final NodeModel node, final String message,
- final String initialValue) {
- if (node == null) {
- return null;
- }
- final Controller controller = Controller.getCurrentController();
- final IMapViewManager viewController = controller.getMapViewManager();
- viewController.scrollNodeToVisible(node);
- final Component parentComponent = viewController.getComponent(node);
- return JOptionPane.showInputDialog(parentComponent, message, initialValue);
- }
-
- public static String showInputDialog( final NodeModel node, final String text,
- final String title, final int type) {
- if (node == null) {
- return null;
- }
- final Controller controller = Controller.getCurrentController();
- final IMapViewManager viewController = controller.getMapViewManager();
- viewController.scrollNodeToVisible(node);
- final Component parentComponent = viewController.getComponent(node);
- return JOptionPane.showInputDialog(parentComponent, text, title, type);
- }
-
- public static final String SCROLLBAR_INCREMENT = "scrollbar_increment";
-
- public static void setScrollbarIncrement(final JScrollPane scrollPane) {
- final int scrollbarIncrement = ResourceController.getResourceController()
- .getIntProperty(SCROLLBAR_INCREMENT, 1);
- scrollPane.getHorizontalScrollBar().setUnitIncrement(scrollbarIncrement);
- scrollPane.getVerticalScrollBar().setUnitIncrement(scrollbarIncrement);
- }
-
- public static void addScrollbarIncrementPropertyListener(final JScrollPane scrollPane) {
- ResourceController.getResourceController().addPropertyChangeListener(new IFreeplanePropertyListener() {
- public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
- if (!propertyName.equals(SCROLLBAR_INCREMENT)) {
- return;
- }
- final int scrollbarIncrement = Integer.valueOf(newValue);
- scrollPane.getHorizontalScrollBar().setUnitIncrement(scrollbarIncrement);
- scrollPane.getVerticalScrollBar().setUnitIncrement(scrollbarIncrement);
- }
- });
- }
-
- public static Color getTextColorForBackground(final Color color) {
- final int red = color.getRed();
- final int blue = color.getBlue();
- final int green = color.getGreen();
- return red > 0x80 && blue > 0x80 && green > 0x80 ? Color.BLACK : Color.WHITE;
- }
-
- public static final Dimension MAX_BUTTON_DIMENSION = new Dimension(1000, 1000);
-
-// FIXME: not used - can we remove it? -- Volker
-// public static Controller getController(Component c) {
-// if(c == null){
-// return null;
-// }
-// final JRootPane rootPane = SwingUtilities.getRootPane(c);
-// if(rootPane == null){
-// return null;
-// }
-// Controller controller = (Controller) rootPane.getClientProperty(Controller.class);
-// if(controller != null){
-// return controller;
-// }
-// return getController(JOptionPane.getFrameForComponent(rootPane));
-// }
-
- public static void focusOn(JComponent component) {
- component.addAncestorListener(new AncestorListener() {
- public void ancestorRemoved(AncestorEvent event) {
- }
-
- public void ancestorMoved(AncestorEvent event) {
- }
-
- public void ancestorAdded(AncestorEvent event) {
- final JComponent component = event.getComponent();
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- component.requestFocus(); }
- });
- component.removeAncestorListener(this);
- }
- });
- }
-
- public static BasicStroke createStroke(int width, final int[] dash) {
- final float[] fdash;
- if(dash != null){
- fdash = new float[dash.length];
- int i = 0;
- for(float d : dash){
- fdash[i++] = d;
- }
- }
- else{
- fdash = null;
- }
- final BasicStroke stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1f, fdash, 0f);
- return stroke;
- }
-
- public static void repaintAll(Container root) {
- root.repaint();
- for(int i = 0; i < root.getComponentCount(); i++){
- final Component component = root.getComponent(i);
- if(component instanceof Container){
- repaintAll((Container) component);
- }
- else{
- component.repaint();
- }
- }
- }
-
- public static JDialog createCancelDialog(final Component component, final String titel, final String text) {
- final String[] options = { TextUtils.getText("cancel") };
- final JOptionPane infoPane = new JOptionPane(text, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION, null,
- options);
- JDialog dialog = infoPane.createDialog(component, titel);
- dialog.setModal(false);
- return dialog;
- }
-
- public static void addTitledBorder(final JComponent c, final String title, final float size) {
- final TitledBorder titledBorder = BorderFactory.createTitledBorder(title);
- final Font titleFont = UIManager.getFont("TitledBorder.font");
- titledBorder.setTitleFont(titleFont.deriveFont(size));
- final Border btnBorder = c.getBorder();
- if(btnBorder != null){
- final CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(titledBorder, btnBorder);
- c.setBorder(compoundBorder);
- }
- else{
- c.setBorder(titledBorder);
- }
- }
-
- public static void backOtherWindows() {
- Window owner = getFrame();
- if(owner != null){
- final Window[] ownedWindows = owner.getOwnedWindows();
- for(Window w : ownedWindows){
- if(w.isVisible()){
- w.toBack();
- }
- }
- }
- }
-
- public static JButton createHtmlLinkStyleButton(final URI uri, final String title) {
- final JButton button = new JButton("<html><a href='" + uri + "'>" + title);
- button.setBorderPainted(false);
- button.setOpaque(false);
- button.setBackground(Color.lightGray);
- button.setFocusable(false);
- button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
- button.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- final UrlManager urlManager = modeController.getExtension(UrlManager.class);
- urlManager.loadURL(uri);
- }
- });
- return button;
- }
-
- public static final int getComponentIndex(Component component) {
- if (component != null && component.getParent() != null) {
- Container c = component.getParent();
- for (int i = 0; i < c.getComponentCount(); i++) {
- if (c.getComponent(i) == component)
- return i;
- }
- }
-
- return -1;
- }
-
- public static final float FONT_SCALE_FACTOR;
- static {
- float factor = 1f;
- try {
- factor = UITools.getScreenResolution() / 72f;
- }
- catch (Exception e) {
- }
- FONT_SCALE_FACTOR = factor;
- }
-
- public static int getScreenResolution() {
- final int systemScreenResolution = Toolkit.getDefaultToolkit().getScreenResolution();
- if(ResourceController.getResourceController().getBooleanProperty("apply_system_screen_resolution")){
- return systemScreenResolution;
- }
- else
- return ResourceController.getResourceController().getIntProperty("user_defined_screen_resolution", systemScreenResolution);
- }
-
- public static Font scale(Font font) {
- return font.deriveFont(font.getSize2D()*FONT_SCALE_FACTOR);
- }
- public static Font invertScale(Font font) {
- return font.deriveFont(font.getSize2D()/FONT_SCALE_FACTOR);
- }
-
- public static void showFrame() {
- final Frame frame = UITools.getFrame();
- final Window[] ownedWindows = frame.getOwnedWindows();
- for (int i = 0; i < ownedWindows.length; i++) {
- final Window window = ownedWindows[i];
- if (window.getClass().equals(FreeplaneSplashModern.class) && window.isVisible()) {
- window.setVisible(false);
- }
- }
- if(frame != null && ! frame.isVisible()){
- frame.setVisible(true);
- frame.toFront();
- }
- }
-
- public static boolean isEditingText() {
- final Component focusOwner = FocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
- final boolean isTextComponentFocused = focusOwner instanceof JTextComponent;
- return isTextComponentFocused && focusOwner.isShowing() && ((JTextComponent)focusOwner).isEditable();
- }
-
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/calendar/JMonthChooser.java b/freeplane/src/org/freeplane/core/ui/components/calendar/JMonthChooser.java
deleted file mode 100644
index 78efabe..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/calendar/JMonthChooser.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * JMonthChooser.java - A bean for choosing a month Copyright (C) 2004 Kai
- * Toedter kai at toedter.com www.toedter.com This program is free software; you
- * can redistribute it and/or modify it under the terms of the GNU Lesser
- * General Public License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version. This program
- * is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
- * details. You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-package org.freeplane.core.ui.components.calendar;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.text.DateFormatSymbols;
-import java.util.Calendar;
-import java.util.Locale;
-
-import javax.swing.JComboBox;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.JSpinner;
-import javax.swing.JTextField;
-import javax.swing.SpinnerNumberModel;
-import javax.swing.UIManager;
-import javax.swing.border.EmptyBorder;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-/**
- * JMonthChooser is a bean for choosing a month.
- *
- * @author Kai Toedter
- * @version $LastChangedRevision: 100 $
- * @version $LastChangedDate: 2006-06-04 14:36:06 +0200 (So, 04 Jun 2006) $
- */
-public class JMonthChooser extends JPanel implements ItemListener, ChangeListener {
- public static final String MONTH_PROPERTY = "month";
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * Creates a JFrame with a JMonthChooser inside and can be used for testing.
- *
- * @param s
- * The command line arguments
- */
- public static void main(final String[] s) {
- final JFrame frame = new JFrame("MonthChooser");
- frame.getContentPane().add(new JMonthChooser());
- frame.pack();
- frame.setVisible(true);
- }
-
- final private JComboBox comboBox;
- private JDayChooser dayChooser;
- /** true, if the month chooser has a spinner component */
- protected boolean hasSpinner;
- final private boolean initialized;
- private Locale locale;
- private boolean localInitialize;
- private int month;
- private int oldSpinnerValue = 0;
- private JSpinner spinner;
- private JYearChooser yearChooser;
-
- /**
- * Default JMonthChooser constructor.
- */
- public JMonthChooser() {
- this(true);
- }
-
- /**
- * JMonthChooser constructor with month spinner parameter.
- *
- * @param hasSpinner
- * true, if the month chooser should have a spinner component
- */
- public JMonthChooser(final boolean hasSpinner) {
- super();
- setName("JMonthChooser");
- this.hasSpinner = hasSpinner;
- setLayout(new BorderLayout());
- comboBox = new JComboBox();
- comboBox.addItemListener(this);
- locale = Locale.getDefault();
- initNames();
- if (hasSpinner) {
- spinner = new JSpinner() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private JTextField textField = new JTextField();
-
- @Override
- public Dimension getPreferredSize() {
- final Dimension size = super.getPreferredSize();
- return new Dimension(size.width, textField.getPreferredSize().height);
- }
- };
- spinner.addChangeListener(this);
- spinner.setEditor(comboBox);
- comboBox.setBorder(new EmptyBorder(0, 0, 0, 0));
- updateUI();
- add(spinner, BorderLayout.WEST);
- }
- else {
- add(comboBox, BorderLayout.WEST);
- }
- initialized = true;
- setMonth(Calendar.getInstance().get(Calendar.MONTH));
- }
-
- /**
- * Returns the month chooser's comboBox text area (which allow the focus to
- * be set to it).
- *
- * @return the combo box
- */
- public Component getComboBox() {
- return comboBox;
- }
-
- /**
- * Returns the locale.
- *
- * @return the locale value
- * @see #setLocale
- */
- @Override
- public Locale getLocale() {
- return locale;
- }
-
- /**
- * Returns the month.
- *
- * @return the month value
- */
- public int getMonth() {
- return month;
- }
-
- /**
- * Returns the month chooser's comboBox bar (which allow the focus to be set
- * to it).
- *
- * @return Component the spinner or null, if the month chooser has no
- * spinner
- */
- public Component getSpinner() {
- return spinner;
- }
-
- /**
- * Returns the type of spinner the month chooser is using.
- *
- * @return true, if the month chooser has a spinner
- */
- public boolean hasSpinner() {
- return hasSpinner;
- }
-
- /**
- * Initializes the locale specific month names.
- */
- public void initNames() {
- localInitialize = true;
- final DateFormatSymbols dateFormatSymbols = new DateFormatSymbols(locale);
- final String[] monthNames = dateFormatSymbols.getMonths();
- if (comboBox.getItemCount() == 12) {
- comboBox.removeAllItems();
- }
- for (int i = 0; i < 12; i++) {
- comboBox.addItem(monthNames[i]);
- }
- localInitialize = false;
- comboBox.setSelectedIndex(month);
- }
-
- /**
- * The ItemListener for the months.
- *
- * @param e
- * the item event
- */
- public void itemStateChanged(final ItemEvent e) {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- final int index = comboBox.getSelectedIndex();
- if ((index >= 0) && (index != month)) {
- setMonth(index, false);
- }
- }
- }
-
- /**
- * Convenience method set a day chooser.
- *
- * @param dayChooser
- * the day chooser
- */
- public void setDayChooser(final JDayChooser dayChooser) {
- this.dayChooser = dayChooser;
- }
-
- /**
- * Enable or disable the JMonthChooser.
- *
- * @param enabled
- * the new enabled value
- */
- @Override
- public void setEnabled(final boolean enabled) {
- super.setEnabled(enabled);
- comboBox.setEnabled(enabled);
- if (spinner != null) {
- spinner.setEnabled(enabled);
- }
- }
-
- /**
- * Sets the font for this component.
- *
- * @param font
- * the desired <code>Font</code> for this component
- */
- @Override
- public void setFont(final Font font) {
- if (comboBox != null) {
- comboBox.setFont(font);
- }
- super.setFont(font);
- }
-
- /**
- * Set the locale and initializes the new month names.
- *
- * @param l
- * the new locale value
- * @see #getLocale
- */
- @Override
- public void setLocale(final Locale l) {
- if (!initialized) {
- super.setLocale(l);
- }
- else {
- locale = l;
- initNames();
- }
- }
-
- /**
- * Sets the month. This is a bound property. Valuse are valid between 0
- * (January) and 11 (December). A value < 0 will be treated as 0, a value >
- * 11 will be treated as 11.
- *
- * @param newMonth
- * the new month value
- * @see #getMonth
- */
- public void setMonth(final int newMonth) {
- if (newMonth < 0 || newMonth == Integer.MIN_VALUE) {
- setMonth(0, true);
- }
- else if (newMonth > 11) {
- setMonth(11, true);
- }
- else {
- setMonth(newMonth, true);
- }
- }
-
- /**
- * Sets the month attribute of the JMonthChooser object. Fires a property
- * change "month".
- *
- * @param newMonth
- * the new month value
- * @param select
- * true, if the month should be selcted in the combo box.
- */
- private void setMonth(final int newMonth, final boolean select) {
- if (!initialized || localInitialize) {
- return;
- }
- final int oldMonth = month;
- month = newMonth;
- if (select) {
- comboBox.setSelectedIndex(month);
- }
- if (dayChooser != null) {
- dayChooser.setMonth(month);
- }
- firePropertyChange(JMonthChooser.MONTH_PROPERTY, oldMonth, month);
- }
-
- /**
- * Convenience method set a year chooser. If set, the spin for the month
- * buttons will spin the year as well
- *
- * @param yearChooser
- * the new yearChooser value
- */
- public void setYearChooser(final JYearChooser yearChooser) {
- this.yearChooser = yearChooser;
- }
-
- /**
- * Is invoked if the state of the spnner changes.
- *
- * @param e
- * the change event.
- */
- public void stateChanged(final ChangeEvent e) {
- final SpinnerNumberModel model = (SpinnerNumberModel) ((JSpinner) e.getSource()).getModel();
- final int value = model.getNumber().intValue();
- final boolean increase = (value > oldSpinnerValue) ? true : false;
- oldSpinnerValue = value;
- int month = getMonth();
- if (increase) {
- month += 1;
- if (month == 12) {
- month = 0;
- if (yearChooser != null) {
- int year = yearChooser.getYear();
- year += 1;
- yearChooser.setYear(year);
- }
- }
- }
- else {
- month -= 1;
- if (month == -1) {
- month = 11;
- if (yearChooser != null) {
- int year = yearChooser.getYear();
- year -= 1;
- yearChooser.setYear(year);
- }
- }
- }
- setMonth(month);
- }
-
- /**
- * Updates the UI.
- *
- * @see javax.swing.JPanel#updateUI()
- */
- @Override
- public void updateUI() {
- final JSpinner testSpinner = new JSpinner();
- if (spinner != null) {
- if ("Windows".equals(UIManager.getLookAndFeel().getID())) {
- spinner.setBorder(testSpinner.getBorder());
- }
- else {
- spinner.setBorder(new EmptyBorder(0, 0, 0, 0));
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/html/ScaledEditorKit.java b/freeplane/src/org/freeplane/core/ui/components/html/ScaledEditorKit.java
deleted file mode 100644
index 3d6be16..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/html/ScaledEditorKit.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Freeplane team and others
- *
- * this file is created by Dimitry Polivaev in 2012.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components.html;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.io.StringReader;
-
-import javax.swing.text.Document;
-import javax.swing.text.html.HTMLDocument;
-import javax.swing.text.html.HTMLEditorKit;
-import javax.swing.text.html.StyleSheet;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.ColorUtils;
-
- at SuppressWarnings("serial")
-public class ScaledEditorKit extends HTMLEditorKit {
- /** Shared base style for all documents created by us use. */
- private static StyleSheet defaultStyles;
-
- protected ScaledEditorKit() {
- };
-
- /**
- * Overriden to return our own slimmed down style sheet.
- */
- public StyleSheet getStyleSheet() {
- if (defaultStyles == null) {
- defaultStyles = new StyleSheet();
- StringReader r = new StringReader(ScaledHTML.styleChanges);
- try {
- defaultStyles.loadRules(r, null);
- }
- catch (Throwable e) {
- // don't want to die in static initialization...
- // just display things wrong.
- }
- r.close();
- defaultStyles.addStyleSheet(super.getStyleSheet());
- }
- return defaultStyles;
- }
-
- @Override
- public Document createDefaultDocument() {
- StyleSheet styles = getStyleSheet();
- StyleSheet ss = new ScaledStyleSheet();
- ss.addStyleSheet(styles);
- HTMLDocument doc = new HTMLDocument(ss);
- doc.setParser(getParser());
- doc.setAsynchronousLoadPriority(4);
- doc.setTokenThreshold(100);
- return doc;
- }
-
- /**
- * Sets the async policy to flush everything in one chunk, and
- * to not display unknown tags.
- */
- Document createDefaultDocument(Font defaultFont, Color foreground) {
- StyleSheet styles = getStyleSheet();
- StyleSheet ss = new ScaledStyleSheet();
- ss.addStyleSheet(styles);
- HTMLDocument doc = new HTMLDocument(ss);
- doc.setPreservesUnknownTags(false);
- doc.getStyleSheet().addRule(displayPropertiesToCSS(defaultFont, foreground));
- doc.setParser(getParser());
- doc.setAsynchronousLoadPriority(Integer.MAX_VALUE);
- doc.setPreservesUnknownTags(false);
- return doc;
- }
-
- private String displayPropertiesToCSS(Font font, Color fg) {
- StringBuffer rule = new StringBuffer("body {");
- if (font != null) {
- rule.append(" font-family: ");
- rule.append(font.getFamily());
- rule.append(" ; ");
- rule.append(" font-size: ");
- final int fontSize = Math.round(font.getSize() / UITools.FONT_SCALE_FACTOR);
- rule.append(fontSize);
- rule.append("pt ;");
- if (font.isBold()) {
- rule.append(" font-weight: bold ; ");
- }
- if (font.isItalic()) {
- rule.append(" font-style: italic ; ");
- }
- }
- if (fg != null) {
- rule.append(" color: ").append(ColorUtils.colorToString(fg)).append(" ; ");
- }
- rule.append(" }");
- return rule.toString();
- }
-
- static public ScaledEditorKit create() {
- if (kit == null) {
- kit = new ScaledEditorKit();
- }
- return kit;
- }
-
- /**
- * The source of the html renderers
- */
- private static ScaledEditorKit kit;
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/html/ScaledHTML.java b/freeplane/src/org/freeplane/core/ui/components/html/ScaledHTML.java
deleted file mode 100644
index e96bdf3..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/html/ScaledHTML.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Freeplane team and others
- *
- * this file is created by Dimitry Polivaev in 2012.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components.html;
-
-import java.awt.Container;
-import java.awt.Graphics;
-import java.awt.Rectangle;
-import java.awt.Shape;
-import java.io.Reader;
-import java.io.StringReader;
-import java.net.URL;
-
-import javax.swing.JComponent;
-import javax.swing.plaf.basic.BasicHTML;
-import javax.swing.text.AttributeSet;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Document;
-import javax.swing.text.Element;
-import javax.swing.text.Position;
-import javax.swing.text.View;
-import javax.swing.text.ViewFactory;
-import javax.swing.text.html.HTMLDocument;
-
-public class ScaledHTML extends BasicHTML{
-
- /**
- * Create an html renderer for the given component and
- * string of html.
- */
- public static View createHTMLView(JComponent c, String html) {
- ScaledEditorKit kit = ScaledEditorKit.create();
- Document doc = kit.createDefaultDocument(c.getFont(),
- c.getForeground());
- Object base = c.getClientProperty(documentBaseKey);
- if (base instanceof URL) {
- ((HTMLDocument)doc).setBase((URL)base);
- }
- Reader r = new StringReader(html);
- try {
- kit.read(r, doc, 0);
- } catch (Throwable e) {
- }
- ViewFactory f = kit.getViewFactory();
- View hview = f.create(doc.getDefaultRootElement());
- View v = new Renderer(c, f, hview);
- return v;
- }
-
- public static void updateRenderer(JComponent c, String text) {
- View value = null;
- try{
- View oldValue = (View)c.getClientProperty(propertyKey);
- if (isHTMLString(text)) {
- value = ScaledHTML.createHTMLView(c, text);
- }
- if (value != oldValue && oldValue != null) {
- for (int i = 0; i < oldValue.getViewCount(); i++) {
- oldValue.getView(i).setParent(null);
- }
- }
- }
- finally{
- c.putClientProperty(BasicHTML.propertyKey, value);
- }
- }
-
-
- /**
- * Overrides to the default stylesheet. Should consider
- * just creating a completely fresh stylesheet.
- */
- static final String styleChanges =
- "p { margin-top: 0; margin-bottom: 0; margin-left: 0; margin-right: 0 }" +
- "body { margin-top: 0; margin-bottom: 0; margin-left: 0; margin-right: 0 }";
-
- /**
- * Root text view that acts as an HTML renderer.
- */
- public static class Renderer extends View {
-
- Renderer(JComponent c, ViewFactory f, View v) {
- super(null);
- setSizeRunning = true;
- host = c;
- factory = f;
- view = v;
- view.setParent(this);
- // initially layout to the preferred size
- setSize(view.getPreferredSpan(X_AXIS), view.getPreferredSpan(Y_AXIS));
- }
-
- public AttributeSet getAttributes() {
- return null;
- }
-
- public float getPreferredSpan(int axis) {
- if (axis == X_AXIS) {
- // width currently laid out to
- return width;
- }
- return view.getPreferredSpan(axis);
- }
-
- public float getMinimumSpan(int axis) {
- return view.getMinimumSpan(axis);
- }
-
- public float getMaximumSpan(int axis) {
- return Integer.MAX_VALUE;
- }
-
- public void preferenceChanged(View child, boolean width, boolean height) {
- if(! setSizeRunning){
- setSize(view.getPreferredSpan(X_AXIS), view.getPreferredSpan(Y_AXIS));
- host.revalidate();
- host.repaint();
- }
- }
-
- public float getAlignment(int axis) {
- return view.getAlignment(axis);
- }
-
- public void paint(Graphics g, Shape allocation) {
- Rectangle alloc = allocation.getBounds();
- view.setSize(alloc.width, alloc.height);
- view.paint(g, allocation);
- }
-
- public void setParent(View parent) {
- throw new Error("Can't set parent on root view");
- }
-
- public int getViewCount() {
- return 1;
- }
- public View getView(int n) {
- return view;
- }
- public Shape modelToView(int pos, Shape a, Position.Bias b) throws BadLocationException {
- return view.modelToView(pos, a, b);
- }
-
- public Shape modelToView(int p0, Position.Bias b0, int p1,
- Position.Bias b1, Shape a) throws BadLocationException {
- return view.modelToView(p0, b0, p1, b1, a);
- }
-
- public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) {
- return view.viewToModel(x, y, a, bias);
- }
-
- public Document getDocument() {
- return view.getDocument();
- }
-
- public int getStartOffset() {
- return view.getStartOffset();
- }
-
- public int getEndOffset() {
- return view.getEndOffset();
- }
-
- public Element getElement() {
- return view.getElement();
- }
-
- public void setSize(float width, float height) {
- setSizeRunning = true;
- this.width = (int) width;
- view.setSize(width, height);
- setSizeRunning = false;
- }
-
- public void resetSize() {
- setSize(0, 0);
- setSize(view.getPreferredSpan(X_AXIS), view.getPreferredSpan(Y_AXIS));
- }
-
- public Container getContainer() {
- return host;
- }
-
- public ViewFactory getViewFactory() {
- return factory;
- }
-
- private int width;
- private View view;
- private ViewFactory factory;
- private JComponent host;
- private boolean setSizeRunning;
-
- }
-}
diff --git a/freeplane/src/org/freeplane/core/ui/components/html/ScaledStyleSheet.java b/freeplane/src/org/freeplane/core/ui/components/html/ScaledStyleSheet.java
deleted file mode 100644
index a663232..0000000
--- a/freeplane/src/org/freeplane/core/ui/components/html/ScaledStyleSheet.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Freeplane team and others
- *
- * this file is created by Dimitry Polivaev in 2012.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.ui.components.html;
-
-import java.awt.Font;
-import javax.swing.text.AttributeSet;
-import javax.swing.text.html.CSS;
-import javax.swing.text.html.StyleSheet;
-
-import org.freeplane.core.ui.components.UITools;
-
-
-public class ScaledStyleSheet extends StyleSheet{
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- public Font getFont(AttributeSet a) {
- final Font font = super.getFont(a);
- final float fontScaleFactor = getFontScaleFactor(a);
- return super.getFont(font.getFamily(), font.getStyle(), Math.round(font.getSize2D() * fontScaleFactor));
- }
-
- private float getFontScaleFactor(AttributeSet a) {
- final Object attribute = a.getAttribute(CSS.Attribute.FONT_SIZE);
- if(attribute == null)
- return UITools.FONT_SCALE_FACTOR;
- final String fontSize = attribute.toString();
- final int fsLength = fontSize.length();
- if(fsLength <= 1
- || Character.isDigit(fontSize.charAt(fsLength-1))
- || fontSize.endsWith("pt"))
- return UITools.FONT_SCALE_FACTOR;
- if(fontSize.endsWith("px"))
- return 1/1.3f;
- if(fontSize.endsWith("%") || fontSize.endsWith("em") || fontSize.endsWith("ex")
- || fontSize.endsWith("er"))
- return getFontScaleFactor(a.getResolveParent());
- return UITools.FONT_SCALE_FACTOR;
- }
-
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/undo/CompoundActor.java b/freeplane/src/org/freeplane/core/undo/CompoundActor.java
deleted file mode 100644
index 6972a58..0000000
--- a/freeplane/src/org/freeplane/core/undo/CompoundActor.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.undo;
-
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-/**
- * Contains a list of actors and applys act() and undo() in a batch operation.
- *
- * Implements composite design pattern.
- *
- * @author Robert Ladstaetter
- */
-public class CompoundActor implements IActor {
- final private LinkedList<IActor> actors;
-
- public CompoundActor() {
- this(new LinkedList<IActor>());
- }
-
- public CompoundActor(final LinkedList<IActor> actors) {
- this.actors = actors;
- }
-
- public void act() {
- for (final IActor a : actors) {
- a.act();
- }
- }
-
- public void add(final IActor firstActor) {
- actors.add(firstActor);
- }
-
- public String getDescription() {
- if (actors.size() == 0) {
- return "";
- }
- final String firstDescription = actors.getFirst().getDescription();
- if (actors.size() == 1) {
- return firstDescription;
- }
- final String lastDescription = actors.getLast().getDescription();
- if (actors.size() == 2 && !firstDescription.equals("") && !lastDescription.equals("")) {
- return firstDescription + ", " + lastDescription;
- }
- return firstDescription + "... " + lastDescription;
- }
-
- public void undo() {
- final ListIterator<IActor> iterator = actors.listIterator(actors.size());
- while (iterator.hasPrevious()) {
- iterator.previous().undo();
- }
- }
-
- public boolean isEmpty() {
- return actors.size() == 0;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/undo/UndoHandler.java b/freeplane/src/org/freeplane/core/undo/UndoHandler.java
deleted file mode 100644
index c07e8c0..0000000
--- a/freeplane/src/org/freeplane/core/undo/UndoHandler.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.undo;
-
-import java.awt.EventQueue;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.ViewController;
-
-public class UndoHandler implements IUndoHandler {
- final private List<ChangeListener> listeners;
-
- private class RedoAction implements ActionListener {
- public void actionPerformed(final ActionEvent e) {
- redo();
- }
- }
-
- private class UndoAction implements ActionListener {
- public void actionPerformed(final ActionEvent e) {
- undo();
- }
- }
-
- public static final int COMMIT_DELAY = 2;
-
- private static class ActorList extends LinkedList<IActor> {
- private static final long serialVersionUID = 1L;
- int commitDelay = COMMIT_DELAY;
- }
-
- /**
- *
- */
- private static final int MAX_ENTRIES = 100;
- private static final long TIME_TO_BEGIN_NEW_ACTION = 100;
- private boolean actionFrameStarted;
- private ListIterator<IActor> actorIterator;
- private ActorList actorList;
- private boolean isUndoActionRunning = false;
- final private ActionListener redoAction;
- private long timeOfLastAdd;
- final private LinkedList<ActorList> transactionList;
- final private LinkedList<ListIterator<IActor>> transactionIteratorList;
- final private ActionListener undoAction;
- private boolean deactivated;
- private final ChangeEvent event;
-
- public UndoHandler() {
- actionFrameStarted = false;
- deactivated = false;
- listeners = new LinkedList<ChangeListener>();
- actorList = new ActorList();
- transactionList = new LinkedList<ActorList>();
- transactionIteratorList = new LinkedList<ListIterator<IActor>>();
- actorIterator = actorList.listIterator();
- redoAction = new RedoAction();
- timeOfLastAdd = 0;
- undoAction = new UndoAction();
- event = new ChangeEvent(this);
- }
-
- public void deactivate() {
- deactivated = true;
- fireStateChanged();
- startActionFrame();
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.base.undo.UndoHandler#addActor(freeplane.base.undo.UndoableActor
- * )
- */
- public void addActor(final IActor actor) {
- resetRedo();
- actorList.commitDelay = COMMIT_DELAY;
- final long currentTime = System.currentTimeMillis();
- if (deactivated) {
- if (!actionFrameStarted && currentTime - timeOfLastAdd > UndoHandler.TIME_TO_BEGIN_NEW_ACTION) {
- deactivated = false;
- }
- else {
- if (actorList.size() > 0) {
- actorList.clear();
- actorIterator = actorList.listIterator();
- }
- return;
- }
- }
- if ((actorList.size() > 0)
- && (actionFrameStarted || currentTime - timeOfLastAdd < UndoHandler.TIME_TO_BEGIN_NEW_ACTION)) {
- final IActor lastActor = actorIterator.previous();
- CompoundActor compoundActor;
- if (!(lastActor instanceof CompoundActor)) {
- compoundActor = new CompoundActor();
- compoundActor.add(lastActor);
- actorIterator.set(compoundActor);
- }
- else {
- compoundActor = (CompoundActor) lastActor;
- }
- compoundActor.add(actor);
- actorIterator.next();
- }
- else {
- actorIterator.add(actor);
- final int maxEntries = UndoHandler.MAX_ENTRIES;
- while (actorList.size() > maxEntries) {
- actorList.removeFirst();
- actorIterator = actorList.listIterator(actorList.size());
- }
- }
- startActionFrame();
- timeOfLastAdd = currentTime;
- fireStateChanged();
- }
-
- private void fireStateChanged() {
- for (final ChangeListener listener : listeners) {
- listener.stateChanged(event);
- }
- }
-
- public boolean canRedo() {
- return actorIterator.hasNext();
- }
-
- public boolean canUndo() {
- return actorIterator.hasPrevious();
- }
-
- public void commit() {
- resetRedo();
- final CompoundActor compoundActor = new CompoundActor(actorList);
- actionFrameStarted = false;
- timeOfLastAdd = 0;
- if (transactionList.isEmpty()) {
- // FIXME: this happens when new Maps are closed via the scripting API. Fix the basic error instead.
- LogUtils.warn("transactionList is empty on UndoHandler.commit()");
- return;
- }
- actorList = transactionList.removeLast();
- actorIterator = transactionIteratorList.removeLast();
- if (!compoundActor.isEmpty()) {
- addActor(compoundActor);
- actionFrameStarted = false;
- timeOfLastAdd = 0;
- }
- else {
- fireStateChanged();
- }
- }
-
- public void delayedCommit() {
- if (actorList.commitDelay == 0) {
- commit();
- return;
- }
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- actorList.commitDelay--;
- delayedCommit();
- }
- });
- }
-
- public void delayedRollback() {
- if (actorList.commitDelay == 0) {
- rollback();
- return;
- }
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- actorList.commitDelay--;
- delayedRollback();
- }
- });
- }
-
- public String getLastDescription() {
- final String description;
- if (canUndo()) {
- description = actorList.getLast().getDescription();
- }
- else {
- description = null;
- }
- return description;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.base.undo.UndoHandler#getRedoAction()
- */
- public ActionListener getRedoAction() {
- return redoAction;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.base.undo.UndoHandler#getUndoAction()
- */
- public ActionListener getUndoAction() {
- return undoAction;
- }
-
- public boolean isUndoActionRunning() {
- return isUndoActionRunning;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.base.undo.UndoHandler#redo()
- */
- public void redo() {
- if (canRedo()) {
- final IActor redoActor = actorIterator.next();
- isUndoActionRunning = true;
- redoActor.act();
- isUndoActionRunning = false;
- fireStateChanged();
- }
- }
-
- public void resetRedo() {
- while (canRedo()) {
- actorIterator.next();
- actorIterator.remove();
- }
- fireStateChanged();
- }
-
- public void rollback() {
- try {
- isUndoActionRunning = true;
- while (actorIterator.hasPrevious()) {
- final IActor actor = actorIterator.previous();
- actor.undo();
- }
- }
- finally {
- isUndoActionRunning = false;
- }
- if (transactionList.isEmpty()) {
- // FIXME: got here if exceptions occur after opening a map via the scripting API. Fix the basic error instead.
- LogUtils.warn("transactionList is empty on UndoHandler.rollback()");
- return;
- }
- actorList = transactionList.removeLast();
- actorIterator = transactionIteratorList.removeLast();
- fireStateChanged();
- }
-
- private void startActionFrame() {
- if (actionFrameStarted == false) {
- final ViewController viewController = Controller.getCurrentController().getViewController();
- if (viewController.isDispatchThread()) {
- actionFrameStarted = true;
- viewController.invokeLater(new Runnable() {
- public void run() {
- actionFrameStarted = false;
- }
- });
- }
- }
- }
-
- public void forceNewTransaction() {
- timeOfLastAdd = 0;
- actionFrameStarted = false;
- }
-
- public void startTransaction() {
- transactionList.addLast(actorList);
- transactionIteratorList.addLast(actorIterator);
- final ActorList newActorList = new ActorList();
- actorList = newActorList;
- actorIterator = newActorList.listIterator();
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.base.undo.UndoHandler#undo()
- */
- public void undo() {
- if (canUndo()) {
- final IActor actor = actorIterator.previous();
- try {
- isUndoActionRunning = true;
- actor.undo();
- }
- finally {
- isUndoActionRunning = false;
- fireStateChanged();
- }
- }
- }
-
- public void addChangeListener(final ChangeListener listener) {
- listeners.add(listener);
- }
-
- public void removeChangeListener(final ChangeListener listener) {
- listeners.remove(listener);
- }
-
- public int getTransactionLevel() {
- return transactionList.size();
- }
-}
diff --git a/freeplane/src/org/freeplane/core/util/ColorUtils.java b/freeplane/src/org/freeplane/core/util/ColorUtils.java
deleted file mode 100644
index 14db840..0000000
--- a/freeplane/src/org/freeplane/core/util/ColorUtils.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.freeplane.core.util;
-
-import java.awt.Color;
-
-/**
- * Defines a color with some utility methods.
- *
- * @author robert.ladstaetter
- */
-public class ColorUtils {
- public static final String BLACK = "#000000";
-
- public static String colorToString(final Color col) {
- if (col == null) {
- return null;
- }
- return String.format("#%02x%02x%02x", col.getRed(), col.getGreen(), col.getBlue());
- }
-
- public static Color stringToColor(final String str) {
- if (str == null) {
- return null;
- }
- if (str.length() != 7 || str.charAt(0) != '#') {
- throw new NumberFormatException("wrong color format in " + str + ". Expecting #rrggbb");
- }
- return new Color(Integer.parseInt(str.substring(1, 3), 16), Integer.parseInt(str.substring(3, 5), 16), Integer
- .parseInt(str.substring(5, 7), 16));
- }
-
- public static Color createColor(final Color color, final int alpha) {
- if(color.getAlpha() == alpha)
- return color;
- return new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/util/Compat.java b/freeplane/src/org/freeplane/core/util/Compat.java
deleted file mode 100644
index 0a1f528..0000000
--- a/freeplane/src/org/freeplane/core/util/Compat.java
+++ /dev/null
@@ -1,243 +0,0 @@
-package org.freeplane.core.util;
-
-import java.awt.event.InputEvent;
-import java.awt.event.MouseEvent;
-import java.io.File;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.features.mode.Controller;
-
-/**
- * Provides methods and constants which are dependend on the underlying java version
- *
- * @author robert.ladstaetter
- */
-public class Compat {
- public static final String PROPERTY_FREEPLANE_USERDIR = "org.freeplane.userfpdir";
- public static final String JAVA_VERSION = System.getProperty("java.version");
- public static final String VERSION_1_6_0 = "1.6.0";
-
- private static enum OS {
- MAC, WINDOWS, OTHER
- };
-
- private static OS os = null;
- public static final Set<String> executableExtensions = new HashSet<String>(Arrays.asList(new String[] { "exe",
- "com", "vbs", "bat", "lnk", "cmd" }));
-
- public static boolean isWindowsExecutable(final URI link) {
- if (link == null
- || !"file".equalsIgnoreCase(link.getScheme())) {
- return false;
- }
- return isWindowsOS() && executableExtensions.contains(FileUtils.getExtension(link.toString()));
- }
-
- public static URL fileToUrl(final File pFile) throws MalformedURLException {
- return pFile.toURL();
- }
-
- public static boolean isLowerJdk(final String version) {
- return JAVA_VERSION.compareTo(version) < 0;
- }
-
- public static boolean isMacOsX() {
- Compat.initOS();
- return os.equals(OS.MAC);
- }
-
- private static void initOS() {
- if (os == null) {
- String osProperty;
- try {
- osProperty = System.getProperty("os.name");
- }
- catch (final SecurityException e) {
- osProperty = "";
- }
- String debugOsName;
- try {
- debugOsName = System.getProperty("freeplane.debug.os.name", "");
- }
- catch (final SecurityException e) {
- debugOsName = "";
- }
- if (osProperty.startsWith("Mac OS") || debugOsName.startsWith("Mac")) {
- os = OS.MAC;
- return;
- }
- if (osProperty.startsWith("Windows") || debugOsName.startsWith("Windows")) {
- os = OS.WINDOWS;
- return;
- }
- os = OS.OTHER;
- }
- }
-
- public static boolean isWindowsOS() {
- Compat.initOS();
- return os.equals(OS.WINDOWS);
- }
-
- /**
- * This is a correction of a method getFile of a class URL. Namely, on
- * Windows it returned file paths like /C: etc., which are not valid on
- * Windows. This correction is heuristic to a great extend. One of the
- * reasons is that file: something every browser and every system uses
- * slightly differently.
- */
- private static String urlGetFile(final URL url) {
- if( !url.getProtocol().equals("file"))
- return null;
- String fileName = url.toString().replaceFirst("^file:", "");
- final String osNameStart = System.getProperty("os.name").substring(0, 3);
- if (osNameStart.equals("Win") && url.getProtocol().equals("file")) {
- fileName = fileName.replace('/', File.separatorChar);
- return (fileName.indexOf(':') >= 0) ? fileName.replaceFirst("^\\\\*", "") : fileName;
- }
- else {
- return fileName;
- }
- }
-
- public static File urlToFile(final URL pUrl) throws URISyntaxException {
- final String path = Compat.urlGetFile(pUrl);
- if(path != null)
- return new File(path);
- else
- return null;
- }
-
- public static void macAppChanges() {
- if (!Compat.isMacOsX()) {
- return;
- }
- try {
- final Class<?> macChanges = Controller.class.getClassLoader().loadClass(
- "org.freeplane.plugin.macos.MacChanges");
- final Method method = macChanges.getMethod("apply", Controller.class);
- method.invoke(null, Controller.getCurrentController());
- }
- catch (final Exception e) {
- e.printStackTrace();
- }
- }
-
- public static void fixMousePointerForLinux(){
- if (isX11WindowManager()) {
- try {
- Class<?> xwm = Class.forName("sun.awt.X11.XWM");
- Field awt_wmgr = xwm.getDeclaredField("awt_wmgr");
- awt_wmgr.setAccessible(true);
- Field other_wm = xwm.getDeclaredField("OTHER_WM");
- other_wm.setAccessible(true);
- if (awt_wmgr.get(null).equals(other_wm.get(null))) {
- Field metacity_wm = xwm.getDeclaredField("METACITY_WM");
- metacity_wm.setAccessible(true);
- awt_wmgr.set(null, metacity_wm.get(null));
- }
- }
- catch (Exception x) {
- }
- } }
-
- public static boolean isX11WindowManager() {
- return Arrays.asList("gnome-shell", "mate", "other...").contains(System.getenv("DESKTOP_SESSION"));
- }
-
- public static void macMenuChanges() {
- if (!Compat.isMacOsX()) {
- return;
- }
- final Controller controller = Controller.getCurrentController();
- final Set<String> modes = controller .getModes();
- for (final String mode : modes) {
- final MenuBuilder builder = controller.getModeController(mode).getUserInputListenerFactory()
- .getMenuBuilder();
- final String[] keys = {
- "MB_ToggleMenubarAction",
- "MP_ToggleMenubarAction",
- "MB_QuitAction",
- "MB_PropertyAction",
- "MB_AboutAction"
- };
- for (final String key : keys) {
- if (builder.contains(key)) {
- builder.removeElement(key);
- }
- }
- }
- }
- final private static String CURRENT_VERSION_DIR= File.separatorChar + "1.3.x";
-
- /** the directory *including* the version directory. */
- public static String getFreeplaneUserDirectory() {
- String userFpDir = System.getProperty(PROPERTY_FREEPLANE_USERDIR);
- if(userFpDir == null){
- userFpDir = getDefaultFreeplaneUserDirectory();
- }
- return userFpDir + CURRENT_VERSION_DIR;
- }
-
- private static String getDefaultFreeplaneUserDirectory() {
- return System.getProperty("user.home")+ File.separator + ".freeplane";
- }
-
- static public String smbUri2unc(final URI uri) {
- String uriString;
- uriString = ("//" + uri.getHost() + uri.getPath()) .replace('/', '\\');
- final String fragment = uri.getFragment();
- if(fragment != null)
- uriString = uriString + '#' + fragment;
- return uriString;
- }
-
- static public boolean isPlainEvent(final MouseEvent e) {
- final int modifiers = getModifiers(e);
- return modifiers == 0;
- }
-
- private static int getModifiers(final MouseEvent e) {
- return e.getModifiersEx() &
- (InputEvent.CTRL_DOWN_MASK
- | InputEvent.META_DOWN_MASK
- | InputEvent.SHIFT_DOWN_MASK
- | InputEvent.ALT_DOWN_MASK
- );
- }
-
- static public boolean isCtrlEvent(final MouseEvent e) {
- return isExtendedCtrlEvent(e, 0);
- }
-
- public static boolean isCtrlShiftEvent(MouseEvent e) {
- return isExtendedCtrlEvent(e, InputEvent.SHIFT_DOWN_MASK);
- }
-
- public static boolean isCtrlAltEvent(MouseEvent e) {
- return isExtendedCtrlEvent(e, InputEvent.ALT_DOWN_MASK);
- }
-
- static private boolean isExtendedCtrlEvent(final MouseEvent e, int otherModifiers) {
- final int modifiers = getModifiers(e);
- if (isMacOsX())
- return modifiers == (InputEvent.META_DOWN_MASK | otherModifiers);
- return modifiers == (InputEvent.CTRL_DOWN_MASK|otherModifiers);
- }
-
- public static boolean isShiftEvent(MouseEvent e) {
- final int modifiers = getModifiers(e);
- return modifiers == InputEvent.SHIFT_DOWN_MASK;
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/core/util/ConfigurationUtils.java b/freeplane/src/org/freeplane/core/util/ConfigurationUtils.java
deleted file mode 100644
index f252c58..0000000
--- a/freeplane/src/org/freeplane/core/util/ConfigurationUtils.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.freeplane.core.util;
-
-import java.io.File;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.lang.StringUtils;
-
-public class ConfigurationUtils {
- private static final String CONFIG_LIST_VALUE_SEPARATOR_STRICT = File.pathSeparator + File.pathSeparator;
- private static final String CONFIG_LIST_VALUE_SEPARATOR_ONE_OR_MORE = File.pathSeparator + '+';
-
- /** if not requireTwo one pathseparator suffices otherwise two are required. */
- public static List<String> decodeListValue(final String value, boolean requireTwo) {
- if (value.length() == 0)
- return Collections.emptyList();
- final String sep = requireTwo ? CONFIG_LIST_VALUE_SEPARATOR_STRICT : CONFIG_LIST_VALUE_SEPARATOR_ONE_OR_MORE;
- return Arrays.asList(value.split("\\s*" + sep + "\\s*"));
- }
-
- /** if not requireTwo one pathseparator suffices otherwise two are required. */
- public static String encodeListValue(final List<String> list, boolean requireTwo) {
- return StringUtils.join(list.iterator(), requireTwo ? CONFIG_LIST_VALUE_SEPARATOR_STRICT
- : CONFIG_LIST_VALUE_SEPARATOR_ONE_OR_MORE);
- }
-
- public static File getLocalizedFile(final File[] baseDirs, final String document, final String languageCode) {
- final int extPosition = document.lastIndexOf('.');
- final String localizedDocument;
- if (extPosition != -1) {
- localizedDocument = document.substring(0, extPosition) + "_" + languageCode + document.substring(extPosition);
- }
- else{
- localizedDocument = document;
- }
- for(File baseDir : baseDirs){
- if(baseDir != null){
- final File localFile = new File(baseDir, localizedDocument);
- if (localFile.canRead()) {
- return localFile;
- }
- final File file = new File(baseDir, document);
- if (file.canRead()) {
- return file;
- }
- }
- }
- return null;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/util/FileUtils.java b/freeplane/src/org/freeplane/core/util/FileUtils.java
deleted file mode 100644
index 8e9ffa8..0000000
--- a/freeplane/src/org/freeplane/core/util/FileUtils.java
+++ /dev/null
@@ -1,341 +0,0 @@
-package org.freeplane.core.util;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedReader;
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.net.URL;
-import java.nio.channels.FileChannel;
-import java.nio.charset.Charset;
-import java.util.Properties;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.mode.Controller;
-
-public class FileUtils {
- public static void copyFromURL(final URL resource, final File destinationDirectory) {
- final String path = resource.getPath();
- final int index = path.lastIndexOf('/');
- final String fileName = index > -1 ? path.substring(index + 1) : path;
- InputStream in = null;
- OutputStream out = null;
- try {
- in = resource.openStream();
- out = new FileOutputStream(new File(destinationDirectory, fileName));
- FileUtils.copyStream(in, out);
- }
- catch (final Exception e) {
- LogUtils.severe("File not found or could not be copied. " + "Was searching for " + path
- + " and should go to " + destinationDirectory.getAbsolutePath());
- }
- finally {
- FileUtils.silentlyClose(in, out);
- }
- }
-
- public static void copyFromResource(final String path, final String fileName, final File destinationDirectory) {
- final String pathToResource = path + fileName;
- InputStream in = null;
- OutputStream out = null;
- try {
- final URL resource;
- if (pathToResource.startsWith("file:")) {
- resource = new URL(pathToResource);
- }
- else {
- resource = ResourceController.getResourceController().getResource(pathToResource);
- }
- if (resource == null) {
- LogUtils.severe("Cannot find resource: " + pathToResource);
- return;
- }
- in = new BufferedInputStream(resource.openStream());
- out = new FileOutputStream(new File(destinationDirectory, fileName));
- FileUtils.copyStream(in, out);
- }
- catch (final Exception e) {
- LogUtils.severe("File not found or could not be copied. " + "Was searching for " + pathToResource
- + " and should go to " + destinationDirectory.getAbsolutePath());
- }
- finally {
- FileUtils.silentlyClose(in, out);
- }
- }
-
- /** the caller has to close the streams. */
- public static void copyStream(final InputStream in, final OutputStream out) throws IOException {
- final byte[] buf = new byte[1024];
- int len;
- while ((len = in.read(buf)) > 0) {
- out.write(buf, 0, len);
- }
- }
-
- public static void dumpStringToFile(final String string, final File outFile, String encoding) throws IOException {
- FileOutputStream outStream = null;
- OutputStreamWriter out = null;
- try {
- outStream = new FileOutputStream(outFile);
- out = new OutputStreamWriter(outStream, encoding);
- out.write(string);
- }
- finally {
- try {
- if (out != null)
- out.close();
- }
- catch (Exception e) {
- // no rescue
- e.printStackTrace();
- }
- try {
- if (outStream != null)
- outStream.close();
- }
- catch (Exception e) {
- // no rescue
- e.printStackTrace();
- }
- }
- }
-
- /**
- */
- public static boolean createDirectory(final String directoryName) {
- final File dir = new File(directoryName);
- if (!dir.exists()) {
- return dir.mkdirs();
- }
- return true;
- }
-
- public static Properties loadProperties(final String classpathRessource) {
- final Properties props = new Properties();
- InputStream in = null;
- try {
- in = FileUtils.class.getResource(classpathRessource).openStream();
- props.load(in);
- }
- catch (final IOException e) {
- throw new RuntimeException(e);
- }
- finally {
- FileUtils.silentlyClose(in);
- }
- return props;
- }
-
-
- private static String slurp(final Reader reader) throws IOException {
- /* read data into a string */
- final StringBuilder builder = new StringBuilder();
- final char[] buf = new char[1024];
- int len;
- while ((len = reader.read(buf)) > 0) {
- builder.append(buf, 0, len);
- }
- final String result = builder.toString();
- return result;
- }
-
- public static String slurpResource(final URL resource) throws IOException {
- /* read the `resource` into s atring */
- InputStream instream = null;
- try {
- instream = resource.openStream();
- final BufferedReader input = new BufferedReader(new InputStreamReader(instream));
- return slurp(input);
- }
- finally {
- if (instream != null) {
- instream.close();
- }
- }
- }
-
- public static String slurpResource(final String fileName) throws IOException {
- /* read the resource `fileName` into s atring */
- final URL resource = ResourceController.getResourceController().getResource(fileName);
- if (resource == null) {
- LogUtils.severe("Cannot find resource: " + fileName);
- return "";
- }
- return FileUtils.slurpResource(resource);
- }
-
- public static String slurpFile(final File file) throws IOException {
- FileReader in = null;
- try {
- in = new FileReader(file);
- return slurp(in);
- }
- finally {
- if (in != null) {
- in.close();
- }
- }
- }
-
- public static String slurpFile(final String fileName) throws IOException {
- return FileUtils.slurpFile(new File(fileName));
- }
-
- public static Charset defaultCharset() {
- try {
- final String defaultCharsetName = ResourceController.getResourceController().getProperty("default_charset");
- if (defaultCharsetName.equals("JVMdefault")) {
- return Charset.defaultCharset();
- }
- return Charset.forName(defaultCharsetName);
- }
- catch (final Exception e) {
- return Charset.defaultCharset();
- }
- }
-
- /**
- * Returns the lowercase of the extension of a file.
- */
- public static String getExtension(final File f) {
- return FileUtils.getExtension(f.toString());
- }
-
- /**
- * Returns the lowercase of the extension of a file.
- */
- public static String getExtension(final String s) {
- if (s == null) {
- return null;
- }
- for(int i = s.length() - 1; i >= 0; i--){
- final char c = s.charAt(i);
- if(c == File.separatorChar || c == '/' )
- return "";
- if(c == '.'){
- return s.substring(i+1).trim().toLowerCase();
- }
- }
- return "";
- }
-
- public static boolean isAbsolutePath(final String path) {
- final String osNameStart = System.getProperty("os.name").substring(0, 3);
- final String fileSeparator = System.getProperty("file.separator");
- if (osNameStart.equals("Win")) {
- return ((path.length() > 1) && path.substring(1, 2).equals(":")) || path.startsWith(fileSeparator);
- }
- else if (osNameStart.equals("Mac")) {
- return path.startsWith(fileSeparator);
- }
- else {
- return path.startsWith(fileSeparator);
- }
- }
-
- /**
- * In case of trouble, the method returns null.
- *
- * @param pInputFile
- * the file to read.
- * @return the complete content of the file. or null if an exception has
- * occured.
- */
- public static String readFile(final File pInputFile) {
- final StringBuilder lines = new StringBuilder();
- BufferedReader bufferedReader = null;
- try {
- bufferedReader = new BufferedReader(new FileReader(pInputFile));
- final String endLine = System.getProperty("line.separator");
- String line;
- while ((line = bufferedReader.readLine()) != null) {
- lines.append(line).append(endLine);
- }
- bufferedReader.close();
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- if (bufferedReader != null) {
- try {
- bufferedReader.close();
- }
- catch (final Exception ex) {
- LogUtils.severe(ex);
- }
- }
- return null;
- }
- return lines.toString();
- }
-
- public static String removeExtension(final String s) {
- final int i = s.lastIndexOf('.');
- return (i > 0 && i < s.length() - 1) ? s.substring(0, i) : s;
- }
-
- public static void setHidden(final File file, final boolean hidden, final boolean synchronously) {
- final String osNameStart = System.getProperty("os.name").substring(0, 3);
- if (osNameStart.equals("Win")) {
- try {
- Controller.exec("attrib " + (hidden ? "+" : "-") + "H \"" + file.getAbsolutePath() + "\"");
- if (!synchronously) {
- return;
- }
- int timeOut = 10;
- while (file.isHidden() != hidden && timeOut > 0) {
- Thread.sleep(10/* miliseconds */);
- timeOut--;
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
- }
-
- /** to be used in a finally block. This method is null-safe. */
- public static void silentlyClose(Closeable... streams) {
- for (Closeable stream : streams) {
- if (stream != null) {
- try {
- stream.close();
- }
- catch (IOException e) {
- LogUtils.severe(e);
- }
- }
- }
- }
-
- public static void copyFile(File in, File out) throws IOException {
- FileChannel inChannel = new FileInputStream(in).getChannel();
- FileChannel outChannel = new FileOutputStream(out).getChannel();
- try {
- // inChannel.transferTo(0, inChannel.size(), outChannel);
- // original -- apparently has trouble copying large files on Windows
- // magic number for Windows, (64Mb - 32Kb)
- int maxCount = (64 * 1024 * 1024) - (32 * 1024);
- long size = inChannel.size();
- long position = 0;
- while (position < size) {
- position += inChannel.transferTo(position, maxCount, outChannel);
- }
- } finally {
- if (inChannel != null) {
- inChannel.close();
- }
- if (outChannel != null) {
- outChannel.close();
- }
- }
- }
-
-}
diff --git a/freeplane/src/org/freeplane/core/util/FreeplaneVersion.java b/freeplane/src/org/freeplane/core/util/FreeplaneVersion.java
deleted file mode 100644
index d6b7132..0000000
--- a/freeplane/src/org/freeplane/core/util/FreeplaneVersion.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.util;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import org.freeplane.core.resources.ResourceController;
-
-/** provides access to the current Freeplane version. In scripts use <code>c.freeplaneVersion</code>.
- * For usage instructions see {@link #compareTo(FreeplaneVersion)}. */
-public class FreeplaneVersion implements Comparable<FreeplaneVersion> {
- private static final FreeplaneVersion VERSION = FreeplaneVersion.loadVersion();
- public static final String VERSION_KEY = "freeplane_version";
- public static final String VERSION_PROPERTIES = "/version.properties";
- public static final String XML_VERSION = "freeplane 1.3.0";
- /** major version, the 1 in "1.0.38 rc" */
- private final int mMaj;
- /** mid version, the 0 in "1.0.38 rc" */
- private final int mMid;
- /** minor version, the 38 in "1.0.38 rc" */
- private final int mMin;
- /** optional patch level (testversion only). */
- private final int mNum;
- /** release type e.g. "", "rc", "beta", "alpha" or "nightly_build". */
- private String mType;
-
- private final String revision;
-
- public static FreeplaneVersion getVersion() {
- return VERSION;
- }
-
- /**
- * Parses a version string as FreeplaneVersion.
- * Ignores leading 'v' (e.g. "v1.2.6") and accept '.' and ' ' as separator.
- * @throws IllegalArgumentException on parse errors
- */
- public static FreeplaneVersion getVersion(final String pString) throws IllegalArgumentException {
- if (pString == null)
- return null;
- final StringTokenizer t = new StringTokenizer(pString, "v. ", false);
- final String[] info = new String[t.countTokens()];
- int i = 0;
- while (t.hasMoreTokens()) {
- info[i++] = t.nextToken();
- }
- if (info.length < 2 | info.length > 5) {
- throw new IllegalArgumentException("Wrong number of tokens for version information: " + pString);
- }
- try {
- final int maj = Integer.parseInt(info[0]);
- final int mid = Integer.parseInt(info[1]);
- final int min = info.length < 3 ? 0 : Integer.parseInt(info[2]);
- final String type = info.length < 4 ? "" : info[3];
- final int num = info.length < 5 ? 0 : Integer.parseInt(info[4]);
- return new FreeplaneVersion(maj, mid, min, type, num, loadRevision());
- }
- catch (final NumberFormatException e) {
- throw new IllegalArgumentException("Wrong version token: " + pString, e);
- }
- }
-
- private static FreeplaneVersion loadVersion() {
- final Properties versionProperties = FileUtils.loadProperties(VERSION_PROPERTIES);
- final String versionString = versionProperties.getProperty(VERSION_KEY);
- final String versionStatus = versionProperties.getProperty("freeplane_version_status");
- final FreeplaneVersion version = FreeplaneVersion.getVersion(versionString);
- version.mType = versionStatus;
- return version;
- }
-
- public int getMaj() {
- return mMaj;
- }
-
- public int getMid() {
- return mMid;
- }
-
- public int getMin() {
- return mMin;
- }
-
- public int getNum() {
- return mNum;
- }
-
- public String getType() {
- return mType;
- }
-
- public String getRevision(){
- return revision;
- }
-
- public FreeplaneVersion(final int pMaj, final int pMid, final int pMin, final String pType, final int pNum, final String revision) {
- super();
- mMaj = pMaj;
- mMid = pMid;
- mMin = pMin;
- mType = pType;
- mNum = pNum;
- this.revision = revision;
- }
-
- public FreeplaneVersion(final int pMaj, final int pMid, final int pMin) {
- this(pMaj, pMid, pMin, "", 0, "");
- }
-
- /** Use it like this:
- * <pre>
- * import org.freeplane.core.util.FreeplaneVersion
- * def required = FreeplaneVersion.getVersion("1.2.20")
- * if (c.freeplaneVersion < required)
- * ui.errorMessage("Freeplane version ${c.freeplaneVersion}"
- * + " not supported - update to at least ${required}")
- * </pre>
- */
- public int compareTo(final FreeplaneVersion o) {
- if (mMaj < o.mMaj) {
- return -1;
- }
- if (mMaj > o.mMaj) {
- return 1;
- }
- if (mMid < o.mMid) {
- return -1;
- }
- if (mMid > o.mMid) {
- return 1;
- }
- if (mMin < o.mMin) {
- return -1;
- }
- if (mMin > o.mMin) {
- return 1;
- }
- if (mNum < o.mNum) {
- return -1;
- }
- if (mNum > o.mNum) {
- return 1;
- }
- return 0;
- }
-
- /** returns the full version number, e.g. "1.0.38 rc". */
- @Override
- public String toString() {
- final StringBuilder buf = new StringBuilder();
- buf.append(mMaj);
- buf.append('.');
- buf.append(mMid);
- buf.append('.');
- buf.append(mMin);
- if (!mType.equals("")) {
- buf.append(' ');
- buf.append(mType);
- }
- if (mNum != 0) {
- buf.append(' ');
- buf.append(mNum);
- }
- return buf.toString();
- }
-
- /** returns the version number only, e.g. "1.0.38". */
- public String numberToString() {
- final StringBuilder buf = new StringBuilder();
- buf.append(mMaj);
- buf.append('.');
- buf.append(mMid);
- buf.append('.');
- buf.append(mMin);
- return buf.toString();
- }
-
- public boolean isOlderThan(FreeplaneVersion freeplaneVersion) {
- return compareTo(freeplaneVersion) < 0;
- }
-
- public boolean isNewerThan(FreeplaneVersion freeplaneVersion) {
- return compareTo(freeplaneVersion) > 0;
- }
-
- public boolean isFinal(){
- return "".equals(mType);
- }
-
- private static String loadRevision() {
- final URL gitInfo = ResourceController.getResourceController().getResource("/gitinfo.properties");
- final String revision;
- if(gitInfo != null){
- Properties gitProps = new Properties();
- try {
- gitProps.load(gitInfo.openStream());
- }
- catch (IOException e) {
- }
- revision = gitProps.getProperty("git-revision", "");
- }
- else{
- revision = "";
- }
- return revision;
- }
-}
diff --git a/freeplane/src/org/freeplane/core/util/HtmlUtils.java b/freeplane/src/org/freeplane/core/util/HtmlUtils.java
deleted file mode 100644
index 097b47f..0000000
--- a/freeplane/src/org/freeplane/core/util/HtmlUtils.java
+++ /dev/null
@@ -1,785 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.util;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.swing.text.AttributeSet;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Element;
-import javax.swing.text.html.HTML;
-import javax.swing.text.html.HTMLDocument;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.DefaultHandler;
-
-/**
- * Utilities for conversion from/to HTML and XML used in Freeplane: In scripts available
- * as "global variable" <code>htmlUtils</code>.
- */
-public class HtmlUtils {
- public static class IndexPair {
- final public boolean mIsTag;
- final public int originalEnd;
- final public int originalStart;
- final public int pureTextEnd;
- final public int pureTextStart;
-
- public IndexPair(final int pOriginalStart, final int pOriginalEnd, final int pPureTextStart,
- final int pPureTextEnd, final boolean pIsTag) {
- super();
- originalStart = pOriginalStart;
- originalEnd = pOriginalEnd;
- pureTextStart = pPureTextStart;
- pureTextEnd = pPureTextEnd;
- mIsTag = pIsTag;
- }
-
- @Override
- public String toString() {
- final StringBuilder buffer = new StringBuilder();
- buffer.append("[IndexPair:");
- buffer.append(" originalStart: ");
- buffer.append(originalStart);
- buffer.append(" originalEnd: ");
- buffer.append(originalEnd);
- buffer.append(" pureTextStart: ");
- buffer.append(pureTextStart);
- buffer.append(" pureTextEnd: ");
- buffer.append(pureTextEnd);
- buffer.append(" is a tag: ");
- buffer.append(mIsTag);
- buffer.append("]");
- return buffer.toString();
- }
- }
-
- private static final Pattern FIND_TAGS_PATTERN = Pattern.compile("([^<]*)(<[^>]+>)");
- private static final Pattern HTML_PATTERN = Pattern.compile("(?s)^\\s*<\\s*html[^>]*>.*", Pattern.CASE_INSENSITIVE);
- private static Pattern[] PATTERNS;
- private static HtmlUtils sInstance = new HtmlUtils();
- private static final Pattern SLASHED_TAGS_PATTERN = Pattern.compile("<((" + "br|area|base|basefont|"
- + "bgsound|button|col|colgroup|embed|hr" + "|img|input|isindex|keygen|link|meta"
- + "|object|plaintext|spacer|wbr" + ")(\\s[^>]*)?)/>");
- private static final Pattern TAGS_PATTERN = Pattern.compile("(?s)<[^><]*>");
-
- public static HtmlUtils getInstance() {
- return HtmlUtils.sInstance;
- }
-
- /** equivalent to htmlToPlain(text, strictHTMLOnly=true, removeNewLines=true)
- * @see #htmlToPlain(String, boolean, boolean) */
- public static String htmlToPlain(final String text) {
- return HtmlUtils.htmlToPlain(text, /* strictHTMLOnly= */true, /* removeNewLines= */true);
- }
-
- /** equivalent to htmlToPlain(text, strictHTMLOnly, removeNewLines=true)
- * @see #htmlToPlain(String, boolean, boolean) */
- public static String htmlToPlain(final String text, final boolean strictHTMLOnly) {
- return htmlToPlain(text, strictHTMLOnly, /* removeNewLines= */true);
- }
-
- /** removes html markup and entities, partly and where appropriate by replacing it by plaintext equivalents like
- * <li> -> '*'.
- * @param strictHTMLOnly if true does nothing unless the text starts with <html>
- * @param removeNewLines set to false to keep all blank lines. */
- public static String htmlToPlain(final String text, final boolean strictHTMLOnly, final boolean removeNewLines) {
- if (strictHTMLOnly && !HtmlUtils.isHtmlNode(text)) {
- return text;
- }
- if (PATTERNS == null) {
- PATTERNS = new Pattern[] {
- Pattern.compile("(?ims)>[\n\t]+"),
- Pattern.compile("(?ims)[\n\t ]+"),
- Pattern.compile("(?ims)<br[^>]*>"),
- Pattern.compile("(?ims)<p[^>]*>\\s+"),
- Pattern.compile("(?ims)<div[^>]*>\\s+"),
- Pattern.compile("(?ims)<tr[^>]*>\\s+"),
- Pattern.compile("(?ims)<dt[^>]*>"),
- Pattern.compile("(?ims)<dd[^>]*>"),
- Pattern.compile("(?ims)<td[^>]*>"),
- Pattern.compile("(?ims)<[uo]l[^>]*>"),
- Pattern.compile("(?ims)<li[^>]*>"),
- Pattern.compile("(?ims) *</[^>]*>"),
- Pattern.compile("(?ims)<[^/][^>]*> *"),
- Pattern.compile("^\n+"),
- Pattern.compile("(?ims)<"),
- Pattern.compile("(?ims)>"),
- Pattern.compile("(?ims)""),
- Pattern.compile("(?ims) "),
- Pattern.compile("(?ims)&"),
- Pattern.compile("(?ims)[ \t]+\n") };
- }
- String intermediate = text;
- int i = 0;
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(">");
- if (removeNewLines)
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(" ");
- else
- i++;
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n ");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(" ");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n * ");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("");
- if (removeNewLines)
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("");
- else
- i++;
- intermediate = intermediate.trim();
- intermediate = HtmlUtils.unescapeHTMLUnicodeEntity(intermediate);
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("<");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(">");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\"");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll(" ");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("&");
- intermediate = PATTERNS[i++].matcher(intermediate).replaceAll("\n");
- intermediate = intermediate.replace('\u00a0', ' ');
- return intermediate;
- }
-
- public static boolean isHtmlNode(final String text) {
- for (int i = 0; i < text.length(); i++) {
- final char ch = text.charAt(i);
- if (ch == '<') {
- break;
- }
- if (!Character.isWhitespace(ch) || i == text.length()) {
- return false;
- }
- }
- return HtmlUtils.HTML_PATTERN.matcher(text).matches();
- }
-
- /** transforms {@code &, <, >, \n} and whitespace by their HTML counterpart and
- * encloses the whole text in {@code <html><body><p>...</p></body></html>}. */
- public static String plainToHTML(final String text) {
- char myChar;
- final String textTabsExpanded = text.replaceAll("\t", " ");
- final StringBuilder result = new StringBuilder(textTabsExpanded.length());
- final int lengthMinus1 = textTabsExpanded.length() - 1;
- result.append("<html><body><p>");
- for (int i = 0; i < textTabsExpanded.length(); ++i) {
- myChar = textTabsExpanded.charAt(i);
- switch (myChar) {
- case '&':
- result.append("&");
- break;
- case '<':
- result.append("<");
- break;
- case '>':
- result.append(">");
- break;
- case ' ':
- if (i > 0 && i < lengthMinus1 && textTabsExpanded.charAt(i - 1) > 32
- && textTabsExpanded.charAt(i + 1) > 32) {
- result.append(' ');
- }
- else {
- result.append(" ");
- }
- break;
- case '\n':
- result.append("</p>\n<p>");
- break;
- default:
- result.append(myChar);
- }
- }
- result.append("</p></body></html>");
- return result.toString();
- }
-
- public static String removeAllTagsFromString(final String text) {
- return HtmlUtils.TAGS_PATTERN.matcher(text).replaceAll("");
- }
-
- /**
- * Removes all tags (<..>) from a string if it starts with "<html>..." to
- * make it compareable.
- */
- public static String removeHtmlTagsFromString(final String text) {
- if (HtmlUtils.isHtmlNode(text)) {
- return HtmlUtils.removeAllTagsFromString(text);
- }
- else {
- return text;
- }
- }
-
- public static String toXMLEscapedText(final String text) {
- final int len = text.length();
- final StringBuilder result = new StringBuilder(len);
- char myChar;
- for (int i = 0; i < len; ++i) {
- myChar = text.charAt(i);
- switch (myChar) {
- case '&':
- result.append("&");
- break;
- case '<':
- result.append("<");
- break;
- case '>':
- result.append(">");
- break;
- case '"':
- result.append(""");
- break;
- default:
- result.append(myChar);
- }
- }
- return result.toString();
- }
-
- public static String toXMLEscapedTextExpandingWhitespace(String text) {
- text = text.replaceAll("\t", " ");
- final int len = text.length();
- final StringBuilder result = new StringBuilder(len);
- char myChar;
- for (int i = 0; i < len; ++i) {
- myChar = text.charAt(i);
- switch (myChar) {
- case '&':
- result.append("&");
- break;
- case '<':
- result.append("<");
- break;
- case '>':
- result.append(">");
- break;
- case '"':
- result.append(""");
- break;
- case ' ':
- if (i > 0 && i < len - 1 && text.charAt(i - 1) > 32 && text.charAt(i + 1) > 32) {
- result.append(' ');
- }
- else {
- result.append(" ");
- }
- break;
- default:
- result.append(myChar);
- }
- }
- return result.toString();
- }
-
- public static String toXMLUnescapedText(final String text) {
- return text.replaceAll("<", "<").replaceAll(">", ">").replaceAll(""", "\"").replaceAll("&", "&");
- }
-
- public static String unescapeHTMLUnicodeEntity(final String text) {
- final StringBuilder resultBuilder = new StringBuilder(text.length());
- final StringBuilder entity = new StringBuilder();
- boolean readingEntity = false;
- char myChar;
- for (int i = 0; i < text.length(); ++i) {
- myChar = text.charAt(i);
- if (readingEntity) {
- if (myChar == ';') {
- if (entity.charAt(0) == '#') {
- try {
- final char c;
- if (entity.charAt(1) == 'x') {
- c = (char) Integer.parseInt(entity.substring(2), 16);
- }
- else {
- c = (char) Integer.parseInt(entity.substring(1), 10);
- }
- if (c >= ' ' || c == '\t' || c == '\r' || c == '\n') {
- resultBuilder.append(c);
- }
- else {
- resultBuilder.append(' ');
- }
- }
- catch (final NumberFormatException e) {
- resultBuilder.append('&').append(entity).append(';');
- }
- }
- else {
- resultBuilder.append('&').append(entity).append(';');
- }
- entity.setLength(0);
- readingEntity = false;
- }
- else {
- entity.append(myChar);
- }
- }
- else {
- if (myChar == '&') {
- readingEntity = true;
- }
- else {
- resultBuilder.append(myChar);
- }
- }
- }
- if (entity.length() > 0) {
- resultBuilder.append('&').append(entity);
- }
- final String result = resultBuilder.toString();
- return result;
- }
-
- public static String unicodeToHTMLUnicodeEntity(final String text) {
- /*
- * Heuristic reserve for expansion : factor 1.2
- */
- StringBuilder result = null;
- int intValue;
- char myChar;
- for (int i = 0; i < text.length(); ++i) {
- myChar = text.charAt(i);
- intValue = text.charAt(i);
- if (intValue < 32 || intValue > 126) {
- if(result == null){
- result = new StringBuilder((int) (text.length() * 1.2));
- result.append(text.subSequence(0, i));
- }
- result.append("&#x").append(Integer.toString(intValue, 16)).append(';');
- }
- else if(result != null){
- result.append(myChar);
- }
- }
- if(result != null)
- return result.toString();
- return text;
- }
-
- /**
- *
- */
- private HtmlUtils() {
- super();
- }
-
- /**
- * @return the maximal index i such that pI is mapped to i by removing all
- * tags from the original input.
- */
- public static int getMaximalOriginalPosition(final int pI, final ArrayList<IndexPair> pListOfIndices) {
- for (int i = pListOfIndices.size() - 1; i >= 0; --i) {
- final IndexPair pair = pListOfIndices.get(i);
- if (pI >= pair.pureTextStart) {
- if (!pair.mIsTag) {
- return pair.originalStart + pI - pair.pureTextStart;
- }
- else {
- return pair.originalEnd;
- }
- }
- }
- throw new IllegalArgumentException("Position " + pI + " not found.");
- }
-
- public static int getMinimalOriginalPosition(final int pI, final ArrayList<IndexPair> pListOfIndices) {
- for (final IndexPair pair : pListOfIndices) {
- if (pI >= pair.pureTextStart && pI <= pair.pureTextEnd) {
- return pair.originalStart + pI - pair.pureTextStart;
- }
- }
- throw new IllegalArgumentException("Position " + pI + " not found.");
- }
-
- /**
- * Replaces text in node content without replacing tags. fc, 19.12.06: This
- * method is very difficult. If you have a simplier method, please supply
- * it. But look that it complies with FindTextTests!!!
- */
- public static String getReplaceResult(final Pattern pattern, final String text, final String replacement) {
- return new HtmlReplacer().getReplaceResult(pattern, replacement, text);
- }
- static class HtmlReplacer{
- private ArrayList<IndexPair> splittedStringList;
- private String stringWithoutTags;
-
- public String getReplaceResult(final Pattern pattern, final String replacement, final String text) {
- final String unescapedText = unescapeHTMLUnicodeEntity(text);
- initialize(unescapedText);
- final Matcher matcher = pattern.matcher(stringWithoutTags);
- if (! matcher.find()) {
- return unescapedText;
- }
- final StringBuilder sbResult = new StringBuilder();
- int pureTextPosition = 0;
- final Iterator<IndexPair> indexPairs = splittedStringList.iterator();
- IndexPair pair = null;
- for(;;){
- final int mStart = matcher.start();
- final int mEnd = matcher.end();
-
- if(pair == null){
- for(pair = indexPairs.next();pair.pureTextEnd <= mStart;pair = indexPairs.next()){
- if(pair.mIsTag || pureTextPosition <= pair.pureTextStart){
- sbResult.append(unescapedText, pair.originalStart, pair.originalEnd);
- }
- else if(pureTextPosition <= pair.pureTextEnd){
- sbResult.append(unescapedText, pair.originalStart + pureTextPosition - pair.pureTextStart, pair.originalEnd);
- }
- }
- if(pureTextPosition < pair.pureTextStart){
- pureTextPosition = pair.pureTextStart;
- }
- }
-
- sbResult.append(unescapedText,
- pair.originalStart + pureTextPosition - pair.pureTextStart,
- pair.originalStart + mStart - pair.pureTextStart);
- appendReplacement(sbResult, matcher, replacement);
- pureTextPosition = mEnd;
-
- if(matcher.find()){
- if(matcher.start() >= pair.pureTextEnd){
- if(mEnd < pair.pureTextEnd){
- sbResult.append(unescapedText, pair.originalStart + pureTextPosition - pair.pureTextStart, pair.originalEnd);
- pureTextPosition = pair.pureTextEnd;
- }
- pair = null;
- }
- continue;
- }
- for(;;){
- if(pureTextPosition <= pair.pureTextEnd){
- sbResult.append(unescapedText, pair.originalStart + pureTextPosition - pair.pureTextStart, unescapedText.length());
- return sbResult.toString();
- }
- if(pair.mIsTag){
- sbResult.append(unescapedText, pair.originalStart, pair.originalEnd);
- }
- pair = indexPairs.next();
- }
- }
-
- }
-
- private void initialize(final String text) {
- splittedStringList = new ArrayList<IndexPair>();
- stringWithoutTags = null;
- {
- final StringBuffer sb = new StringBuffer();
- final Matcher matcher = FIND_TAGS_PATTERN.matcher(text);
- int lastMatchEnd = 0;
- while (matcher.find()) {
- final String textWithoutTag = matcher.group(1);
- int replStart = sb.length();
- matcher.appendReplacement(sb, "$1");
- IndexPair indexPair;
- if (textWithoutTag.length() > 0) {
- indexPair = new IndexPair(lastMatchEnd, matcher.end(1), replStart, sb.length(), false);
- lastMatchEnd = matcher.end(1);
- splittedStringList.add(indexPair);
- }
- replStart = sb.length();
- indexPair = new IndexPair(lastMatchEnd, matcher.end(2), sb.length(), sb.length(), true);
- lastMatchEnd = matcher.end(2);
- splittedStringList.add(indexPair);
- }
- final int replStart = sb.length();
- matcher.appendTail(sb);
- if (sb.length() != replStart) {
- final IndexPair indexPair = new IndexPair(lastMatchEnd, text.length(), replStart, sb.length(), false);
- splittedStringList.add(indexPair);
- }
- stringWithoutTags = sb.toString();
- }
- }
-
- private void appendReplacement(final StringBuilder sbResult, final Matcher matcher, final String replacement) {
- int cursor = 0;
- while (cursor < replacement.length()) {
- char nextChar = replacement.charAt(cursor);
- if (nextChar == '\\') {
- cursor++;
- nextChar = replacement.charAt(cursor);
- sbResult.append(nextChar);
- cursor++;
- }
- else if (nextChar == '$') {
- // Skip past $
- cursor++;
- // The first number is always a group
- int refNum = (int) replacement.charAt(cursor) - '0';
- if ((refNum < 0) || (refNum > 9))
- throw new IllegalArgumentException("Illegal group reference");
- cursor++;
- // Capture the largest legal group string
- boolean done = false;
- while (!done) {
- if (cursor >= replacement.length()) {
- break;
- }
- int nextDigit = replacement.charAt(cursor) - '0';
- if ((nextDigit < 0) || (nextDigit > 9)) { // not a number
- break;
- }
- int newRefNum = (refNum * 10) + nextDigit;
- if (matcher.groupCount() < newRefNum) {
- done = true;
- }
- else {
- refNum = newRefNum;
- cursor++;
- }
- }
- // Append group
- if (matcher.group(refNum) != null)
- sbResult.append(matcher.group(refNum));
- }
- else {
- sbResult.append(nextChar);
- cursor++;
- }
- }
- }
- }
-
- /**
- * @return true, if well formed XML.
- */
- public static boolean isWellformedXml(final String xml) {
- try {
- final SAXParserFactory factory = SAXParserFactory.newInstance();
- factory.setValidating(false);
- factory.newSAXParser().parse(new InputSource(new StringReader(xml)), new DefaultHandler());
- return true;
- }
- catch (final SAXParseException e) {
- LogUtils.warn("XmlParseError on line " + e.getLineNumber() + " of " + xml, e);
- }
- catch (final Exception e) {
- LogUtils.severe("XmlParseError", e);
- }
- return false;
- }
-
- public static String toHtml(final String xhtmlText) {
- return HtmlUtils.SLASHED_TAGS_PATTERN.matcher(xhtmlText).replaceAll("<$1>");
- }
-
- public static String toXhtml(String htmlText) {
- if (!HtmlUtils.isHtmlNode(htmlText)) {
- return null;
- }
- final StringReader reader = new StringReader(htmlText);
- final StringWriter writer = new StringWriter();
- try {
- XHTMLWriter.html2xhtml(reader, writer);
- final String resultXml = writer.toString();
- if (!HtmlUtils.isWellformedXml(resultXml)) {
- return HtmlUtils.toXMLEscapedText(htmlText);
- }
- return resultXml;
- }
- catch (final IOException e) {
- LogUtils.severe(e);
- }
- catch (final BadLocationException e) {
- LogUtils.severe(e);
- }
- htmlText = htmlText.replaceAll("<", ">");
- htmlText = htmlText.replaceAll(">", "<");
- return htmlText;
- }
-
- public static int endOfText(final String html) {
- int bodyEndPos = html.lastIndexOf("</body>");
- if (bodyEndPos == -1) {
- bodyEndPos = html.lastIndexOf("</BODY>");
- }
- if (bodyEndPos == -1) {
- bodyEndPos = html.lastIndexOf("</html>");
- }
- if (bodyEndPos == -1) {
- bodyEndPos = html.lastIndexOf("</HTML>");
- }
- if (bodyEndPos == -1) {
- bodyEndPos = html.length();
- }
- return bodyEndPos;
- }
-
- static public String combineTextWithExceptionInfo(final String text, final Exception ex) {
- final String escaped = HtmlUtils.toXMLEscapedText(text).replaceAll("\n", "<br>\n");
- final StringBuilder sb = new StringBuilder();
- sb.append("<html><body>");
- sb.append(ex.getClass().getSimpleName());
- sb.append("<br>\n");
- sb.append(ex.getMessage());
- sb.append("<br>\n");
- sb.append(escaped);
- final String string = sb.toString();
- return string;
- }
-
- public static String element(final String name, final String content) {
- return HtmlUtils.element(name, null, content);
- }
-
- public static String element(final String name, final Map<String, String> attributes, final String content) {
- final StringBuilder builder = new StringBuilder();
- builder.append("<").append(name).append(HtmlUtils.toAttributeString(attributes)).append(">");
- if (content != null && content.length() > 0) {
- builder.append(content);
- }
- return builder.append("</").append(name).append(">").toString();
- }
-
- private static String toAttributeString(final Map<String, String> attributes) {
- if (attributes == null || attributes.isEmpty()) {
- return "";
- }
- final StringBuilder builder = new StringBuilder();
- for (final Map.Entry<String, String> entry : attributes.entrySet()) {
- if (builder.length() > 0) {
- builder.append(' ');
- }
- builder.append(entry.getKey());
- builder.append("=\"");
- builder.append(entry.getKey());
- builder.append('"');
- }
- return builder.toString();
- }
-
- public static String extractRawBody(final String text) {
- int start = text.indexOf("<body>");
- final int textBegin;
- if (start != -1)
- textBegin = start + "<body>".length();
- else{
- start = text.indexOf("</head>");
- if (start != -1){
- textBegin = start+ "</head>".length();
- }
- else {
- start = text.indexOf("<html>");
- textBegin = start+ "<html>".length();
- }
- }
- int end = text.indexOf("</body>", textBegin);
- if (end == -1){
- end = text.indexOf("</html>", textBegin);
- if (end == -1){
- end = text.length();
- }
- }
- return text.substring(textBegin, end).trim();
- }
-
- /** Gets the string URL of an existing link, or null if none. */
- public static String getURLOfExistingLink(HTMLDocument doc, int pos) {
- //setIgnoreActions(true);
- final Element linkElement = HtmlUtils.getCurrentLinkElement(doc, pos);
- final boolean foundLink = (linkElement != null);
- if (!foundLink) {
- return null;
- }
- final AttributeSet elemAttrs = linkElement.getAttributes();
- final Object linkAttr = elemAttrs.getAttribute(HTML.Tag.A);
- final Object href = ((AttributeSet) linkAttr).getAttribute(HTML.Attribute.HREF);
- return href != null ? href.toString() : null;
- }
-
- public static Element getCurrentLinkElement(HTMLDocument doc, int pos) {
- Element element2 = null;
- Element element = doc.getCharacterElement(pos);
- Object linkAttribute = null; //elem.getAttributes().getAttribute(HTML.Tag.A);
- Object href = null;
- while (element != null && linkAttribute == null) {
- element2 = element;
- linkAttribute = element.getAttributes().getAttribute(HTML.Tag.A);
- if (linkAttribute != null) {
- href = ((AttributeSet) linkAttribute).getAttribute(HTML.Attribute.HREF);
- }
- element = element.getParentElement();
- }
- if (linkAttribute != null && href != null) {
- return element2;
- }
- else {
- return null;
- }
- }
-
- public static boolean isEmpty(String newText) {
- return ! (newText.contains("<img") || newText.contains("<table"))
- && htmlToPlain(newText).equals("");
- }
-
- public static String toHTMLEscapedText(String s) {
- return toXMLEscapedText(s).replaceAll("\n", "<br>\n");
- }
-
- private static Pattern htmlBodyPattern = Pattern.compile("^\\s*(?:<html>|<body>)+\\s*(.*?)"
- + "\\s*(?:</body>|</html>)+\\s*$", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
-
- /**
- * Join arbitrary texts to html. Plain text arguments will be transformed via
- * {@link #plainToHTML(String)}, i.e. newlines and other special characters will
- * be translated to their HTML counterpart and wrapped in a paragraph (<p></p>).
- * <pre>{@code
- * // plain + html -> <html><body><p>text1</p>text2</body></html>
- * HtmlUtils.join("text1", "", "<html><body>text2</body></html>");
- * // insert an empty paragraph (<p></p>) between two strings:
- * HtmlUtils.join("text1", "", "text2");
- * // this will insert two paragraphs:
- * HtmlUtils.join("text1", "\n", "text2");
- * }</pre>
- * @param texts either html (starting with <HTML> or <html>) or plain text.
- * @return html
- */
- public static String join(String... texts) {
- StringBuilder builder = new StringBuilder();
- builder.append("<html><body>");
- for (int i = 0; i < texts.length; i++) {
- String string = texts[i];
- if (i > 0)
- builder.append('\n');
- if (!isHtmlNode(string))
- string = plainToHTML(string);
- builder.append(htmlBodyPattern.matcher(string).replaceFirst("$1"));
- }
- builder.append("</body></html>");
- return builder.toString();
- }
-}
diff --git a/freeplane/src/org/freeplane/core/util/MenuUtils.java b/freeplane/src/org/freeplane/core/util/MenuUtils.java
deleted file mode 100644
index 43ad78f..0000000
--- a/freeplane/src/org/freeplane/core/util/MenuUtils.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2010 Volker Boerchers
- *
- * This file's author is Volker Boerchers
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.util;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.swing.Action;
-import javax.swing.Icon;
-import javax.swing.JMenuItem;
-import javax.swing.KeyStroke;
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.IFreeplaneAction;
-import org.freeplane.core.ui.IndexedTree;
-import org.freeplane.core.ui.IndexedTree.Node;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-/** Utilities for dealing with the Freeplane menu: In scripts available as "global variable" menuUtils. */
-public class MenuUtils {
- /** The userObject type for createMenuEntryTree(). */
- public static class MenuEntry {
- private final String key;
- private final String label;
- private final String iconKey;
- private final KeyStroke keyStroke;
- private final String toolTipText;
-
- public MenuEntry(final String key, final String label, final String iconKey, final KeyStroke keyStroke,
- final String toolTipText) {
- this.key = key;
- this.label = label;
- this.iconKey = iconKey;
- this.keyStroke = keyStroke;
- this.toolTipText = toolTipText;
- }
-
- public MenuEntry(String key, String label) {
- this(key, label, null, null, null);
- }
-
- public String getKey() {
- return key;
- }
-
- public String getLabel() {
- return label;
- }
-
- public String getIconKey() {
- return iconKey;
- }
-
- public KeyStroke getKeyStroke() {
- return keyStroke;
- }
-
- public String getToolTipText() {
- return toolTipText;
- }
-
- public MindIcon createMindIcon() {
- String resource = ResourceController.getResourceController().getProperty(iconKey, null);
- if (resource == null) {
- // this is the regular case: most MenuEntries (i.e. actions) will have the iconKey set
- // but only for a few of these Icons are available
- return null;
- }
- return new MindIcon(resource.replaceAll("/images/(.*).png", "../$1"));
- }
-
- @Override
- public String toString() {
- return label;
- }
- }
-
- /**
- * returns a tree of all <code>JMenuItem</code> nodes the menu contains (omitting Strings and Separators).
- * The tree is build from <code>DefaultMutableTreeNode</code> nodes having <code>MenuEntry</code> objects as
- * their userObjects.
- *
- * Note that the root node may have null as userObject if the menu item at <code>menuRootKey</code> doesn't
- * contain a <code>JMenuItem</code>!
- *
- * @param menuRootKey the key of the node that should form the root of the output.
- * @param menuBuilder access point for the menu(s).
- */
- public static DefaultMutableTreeNode createMenuEntryTree(final String menuRootKey, final MenuBuilder menuBuilder) {
- final HashMap<String, KeyStroke> menuKeyToKeyStrokeMap = MenuUtils.invertAcceleratorMap(menuBuilder
- .getAcceleratorMap());
- final DefaultMutableTreeNode menuRoot = menuBuilder.get(menuRootKey);
- final DefaultMutableTreeNode treeRoot = new DefaultMutableTreeNode(MenuUtils.menuNode2menuEntryNode(menuRoot,
- menuKeyToKeyStrokeMap));
- MenuUtils.addChildrenRecursively(treeRoot, menuRoot.children(), menuKeyToKeyStrokeMap);
- return treeRoot;
- }
-
- @SuppressWarnings("rawtypes")
- private static void addChildrenRecursively(final DefaultMutableTreeNode treeNode, final Enumeration menuChildren,
- final HashMap<String, KeyStroke> menuKeyToKeyStrokeMap) {
- while (menuChildren.hasMoreElements()) {
- final DefaultMutableTreeNode childMenu = (DefaultMutableTreeNode) menuChildren.nextElement();
- final DefaultMutableTreeNode treeChild = MenuUtils.menuNode2menuEntryNode(childMenu, menuKeyToKeyStrokeMap);
- if (treeChild != null) {
- treeNode.add(treeChild);
- MenuUtils.addChildrenRecursively(treeChild, childMenu.children(), menuKeyToKeyStrokeMap);
- }
- else {
- MenuUtils.addChildrenRecursively(treeNode, childMenu.children(), menuKeyToKeyStrokeMap);
- }
- }
- }
-
- // in: node for JMenu, out: node for MenuEntry
- private static DefaultMutableTreeNode menuNode2menuEntryNode(final DefaultMutableTreeNode menuNode,
- final HashMap<String, KeyStroke> menuKeyToKeyStrokeMap) {
- final IndexedTree.Node node = (Node) menuNode;
- final Object userObject = menuNode.getUserObject();
- if (userObject instanceof JMenuItem) {
- final JMenuItem jMenuItem = (JMenuItem) userObject;
- final IFreeplaneAction action = (IFreeplaneAction) jMenuItem.getAction();
- final String key = String.valueOf(node.getKey());
- final String iconKey = action == null ? null : action.getIconKey();
- return new DefaultMutableTreeNode(new MenuEntry(key, jMenuItem.getText(), iconKey, menuKeyToKeyStrokeMap
- .get(key), jMenuItem.getToolTipText()));
- }
- // the other expected types are String and javax.swing.JPopupMenu.Separator
- // - just omit them
- return null;
- }
-
- /** Used as the basis for dynamic generation of hotkey list.
- * Same as {@link #createMenuEntryTree(String, MenuBuilder)} but all MenuEntries without associated accelerator
- * and (then) empty submenus are removed from the result.
- */
- public static DefaultMutableTreeNode createAcceleratebleMenuEntryTree(final String menuRootKey,
- final MenuBuilder menuBuilder) {
- final DefaultMutableTreeNode menuEntryTreeNode = MenuUtils.createMenuEntryTree(menuRootKey, menuBuilder);
- final DefaultMutableTreeNode result = new DefaultMutableTreeNode(menuEntryTreeNode.getUserObject());
- MenuUtils.addAcceleratableChildrenRecursively(result, menuEntryTreeNode.children());
- return result;
- }
-
- // filters out non-acceleratable menu entries
- @SuppressWarnings("rawtypes")
- private static void addAcceleratableChildrenRecursively(final DefaultMutableTreeNode target,
- final Enumeration sourceChildren) {
- while (sourceChildren.hasMoreElements()) {
- final DefaultMutableTreeNode sourceChild = (DefaultMutableTreeNode) sourceChildren.nextElement();
- final MenuEntry menuEntry = (MenuEntry) sourceChild.getUserObject();
- if (sourceChild.isLeaf()) {
- if (menuEntry.getKeyStroke() != null) {
- target.add(new DefaultMutableTreeNode(menuEntry));
- }
- }
- else {
- final DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(menuEntry);
- target.add(newNode);
- MenuUtils.addAcceleratableChildrenRecursively(newNode, sourceChild.children());
- if (newNode.isLeaf()) {
- target.remove(newNode);
- }
- }
- }
- }
-
- private static HashMap<String, KeyStroke> invertAcceleratorMap(final Map<KeyStroke, Node> acceleratorMap) {
- final HashMap<String, KeyStroke> result = new HashMap<String, KeyStroke>();
- for (final Entry<KeyStroke, Node> entry : acceleratorMap.entrySet()) {
- result.put(String.valueOf(entry.getValue().getKey()), entry.getKey());
- }
- return result;
- }
-
- /** Could be (but currently isn't) used to generate a mindmap representation of the menu.
- * @param children Enumeration of DefaultMutableTreeNode from the menu tree. */
- @SuppressWarnings("rawtypes")
- public static void insertAsNodeModelRecursively(final NodeModel nodeModel, final Enumeration children,
- final MapController mapController) {
- while (children.hasMoreElements()) {
- final DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
- final NodeModel newNodeModel = MenuUtils.insertAsNodeModel(nodeModel, child, mapController);
- if (!child.isLeaf()) {
- MenuUtils.insertAsNodeModelRecursively(newNodeModel, child.children(), mapController);
- }
- }
- }
-
- private static NodeModel insertAsNodeModel(final NodeModel nodeModel, final DefaultMutableTreeNode treeNode,
- final MapController mapController) {
- final MenuEntry menuEntry = (MenuEntry) treeNode.getUserObject();
- final String text = menuEntry.getKeyStroke() == null ? menuEntry.getLabel() : menuEntry.getLabel() + ": "
- + MenuUtils.formatKeyStroke(menuEntry.getKeyStroke());
- final NodeModel newNodeModel = mapController.newNode(text, nodeModel.getMap());
- if (!treeNode.isLeaf()) {
- newNodeModel.setFolded(true);
- }
- if (menuEntry.getIconKey() != null) {
- final MindIcon mindIcon = menuEntry.createMindIcon();
- if (mindIcon != null)
- newNodeModel.addIcon(mindIcon);
- }
- nodeModel.insert(newNodeModel);
- return newNodeModel;
- }
-
- /** pretty print a keystroke. */
- public static String formatKeyStroke(final KeyStroke keyStroke) {
- final String keyModifiersText = KeyEvent.getKeyModifiersText(keyStroke.getModifiers());
- final String keyText = KeyEvent.getKeyText(keyStroke.getKeyCode());
- return keyModifiersText.length() == 0 ? keyText : keyModifiersText + "+" + keyText;
- }
-
- /** there are little reasons to use this in scripts. */
- public static Node findAssignedMenuItemNodeRecursively(final DefaultMutableTreeNode menubarNode,
- final KeyStroke keystroke) {
- final Enumeration<?> children = menubarNode.children();
- while (children.hasMoreElements()) {
- final Node child = (Node) children.nextElement();
- final Object childUserObject = child.getUserObject();
- if (childUserObject instanceof JMenuItem) {
- final JMenuItem childMenuItem = (JMenuItem) childUserObject;
- if (keystroke.equals(childMenuItem.getAccelerator())) {
- return child;
- }
- }
- // recurse
- final Node assignedMenuItemNode = findAssignedMenuItemNodeRecursively(child, keystroke);
- if (assignedMenuItemNode != null)
- return assignedMenuItemNode;
- }
- return null;
- }
-
- /** that's the key that is used to define keyboard accelerators, e.g. found in the auto.properties. */
- public static String makeAcceleratorKey(String menuItemKey) {
- return "acceleratorForMindMap/$" + menuItemKey + "$0";
- }
-
- /** to be used from scripts to execute menu items.
- * Find out the menuItemKey of a menu item with the devtools add-on. It contains a tool for that. */
- public static void executeMenuItems(final List<String> menuItemKeys) {
- LogUtils.info("menu items to execute: " + menuItemKeys);
- final MenuBuilder menuBuilder = getMenuBuilder();
- for (String menuItemKey : menuItemKeys) {
- final DefaultMutableTreeNode treeNode = menuBuilder.get(menuItemKey);
- if (treeNode == null || !treeNode.isLeaf() || !(treeNode.getUserObject() instanceof JMenuItem)) {
- UITools.errorMessage(TextUtils.format("MenuUtils.invalid_menuitem", menuItemKey));
- return;
- }
- final JMenuItem menuItem = (JMenuItem) treeNode.getUserObject();
- final Action action = menuItem.getAction();
- LogUtils.info("executing " + menuItem.getText() + "(" + menuItemKey + ")");
- ActionEvent e = new ActionEvent(menuItem, 0, null);
- action.actionPerformed(e);
- }
- }
-
- private static MenuBuilder getMenuBuilder() {
- final ModeController modeController = Controller.getCurrentModeController();
- final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder();
- return menuBuilder;
- }
-
- /** returns the icon for a menuItemKey or null if it has none. */
- public static Icon getMenuItemIcon(String menuItemKey) {
- final DefaultMutableTreeNode treeNode = getMenuBuilder().get(menuItemKey);
- if (treeNode == null || !treeNode.isLeaf() || !(treeNode.getUserObject() instanceof JMenuItem)) {
- return null;
- }
- final JMenuItem menuItem = (JMenuItem) treeNode.getUserObject();
- return menuItem.getIcon();
- }
-}
diff --git a/freeplane/src/org/freeplane/core/util/TextUtils.java b/freeplane/src/org/freeplane/core/util/TextUtils.java
deleted file mode 100644
index 6c9e7a4..0000000
--- a/freeplane/src/org/freeplane/core/util/TextUtils.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package org.freeplane.core.util;
-
-import java.text.DecimalFormat;
-import java.text.MessageFormat;
-import java.text.SimpleDateFormat;
-import java.util.regex.Pattern;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.resources.ResourceBundles;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.format.FormatController;
-
-/** utilities for translations, conversions to/from number and dates etc.
- * In scripts available as "global variable" <code>textUtils</code>. */
-public class TextUtils {
- // from http://lists.xml.org/archives/xml-dev/200108/msg00891.html
- // but make scheme mandatory
- private static final String URI_REGEXP = "([a-zA-Z][0-9a-zA-Z+\\-\\.]+:" //
- + "/{0,2}[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\\.\\-_!~*'()%]+)?";
- private static Pattern uriPattern = Pattern.compile(URI_REGEXP);
-
- public static String format(final String resourceKey, final Object... messageArguments) {
- final String text = TextUtils.getText(resourceKey);
- if (text == null)
- return null;
- MessageFormat formatter;
- try {
- formatter = new MessageFormat(text);
- }
- catch (IllegalArgumentException e) {
- LogUtils.severe("wrong format " + text + " for property " + resourceKey, e);
- return text;
- }
- final Object[] processedArguments;
- if(text.startsWith("<html>")){
- processedArguments = new String[messageArguments.length];
- int i = 0;
- for(Object s : messageArguments){
- processedArguments[i++] = HtmlUtils.toHTMLEscapedText(s.toString());
- }
- }
- else{
- processedArguments = messageArguments;
- }
- return formatter.format(processedArguments);
- }
-
- public static String getOptionalText(final String string) {
- return string == null ? null : TextUtils.getRawText(string);
- }
-
- public static String removeMnemonic(final String rawLabel) {
- final int pos = rawLabel.indexOf('&');
- if(pos == -1)
- return rawLabel;
- final int length = rawLabel.length();
- StringBuilder sb = new StringBuilder(length);
- sb.append(rawLabel.subSequence(0, pos));
- sb.append(rawLabel.subSequence(pos + 1, length));
- return sb.toString();
-
- }
-
- /** Removes the "TranslateMe" sign from the end of not translated texts. */
- public static String removeTranslateComment(String inputString) {
- if (inputString != null && inputString.endsWith(ResourceBundles.POSTFIX_TRANSLATE_ME)) {
- inputString = inputString
- .substring(0, inputString.length() - ResourceBundles.POSTFIX_TRANSLATE_ME.length());
- }
- return inputString;
- }
-
- public static NamedObject createTranslatedString(final String key) {
- final String fs = TextUtils.getText(key);
- return new NamedObject(key, fs);
- }
-
- public static String getText(final String key) {
- final String text = getRawText(key);
- if(text == null)
- return text;
- return removeMnemonic(text);
- }
-
- public static String getRawText(final String key) {
- if (key == null) {
- return null;
- }
- return ((ResourceBundles) ResourceController.getResourceController().getResources()).getResourceString(key);
- }
-
- public static String getText(final String key, final String defaultString) {
- final String text = getRawText(key, defaultString);
- if(text == null)
- return text;
- return removeMnemonic(text);
- }
- public static String getRawText(final String key, final String defaultString) {
- if (key == null) {
- return defaultString;
- }
- return ((ResourceBundles) ResourceController.getResourceController().getResources()).getResourceString(key,
- defaultString);
- }
-
- public static String getOptionalTranslation(String text) {
- if(text.startsWith("%")){
- return getText(text.substring(1));
- }
- return text;
- }
-
- public static Number toNumber(final String text) throws NumberFormatException {
- try {
- return text == null ? null : Long.decode(text);
- }
- catch (NumberFormatException e) {
- // stupid FloatingDecimal.readJavaFormatString() trims the input string -> care for leading whitespace
- if (text.length() == 0 || Character.isWhitespace(text.charAt(0))) {
- throw new NumberFormatException("number '" + text + "' empty or starts with space");
- }
- return Double.valueOf(text);
- }
- }
-
- public static boolean isNumber(String text) {
- if (isEmpty(text))
- return false;
- final char first = text.charAt(0);
- if (Character.isLetter(first) || Character.isSpaceChar(first))
- return false;
- try {
- Double.parseDouble(text);
- return true;
- }
- catch (NumberFormatException e) {
- return false;
- }
- }
-
- public static boolean isEmpty(final String str) {
- return str == null || str.length() == 0;
- }
-
- /** in opposite to the URI make scheme mandatory. */
- public static boolean matchUriPattern(String text) {
- return text.length() > 0 && uriPattern.matcher(text).matches();
- }
-
- /** accessor for scripts. */
- public DecimalFormat getDefaultNumberFormat() {
- return FormatController.getController().getDefaultNumberFormat();
- }
-
- /** accessor for scripts. */
- public SimpleDateFormat getDefaultDateFormat() {
- return FormatController.getController().getDefaultDateFormat();
- }
-
- /** accessor for scripts. */
- public SimpleDateFormat getDefaultDateTimeFormat() {
- return FormatController.getController().getDefaultDateTimeFormat();
- }
-
- /** Shortcut for scripting: Copies <code>string</code> to the system clipboard. */
- public static void copyToClipboard(String string) {
- ClipboardController.getController().setClipboardContents(string);
- }
-}
diff --git a/freeplane/src/org/freeplane/core/util/TypeReference.java b/freeplane/src/org/freeplane/core/util/TypeReference.java
deleted file mode 100644
index b4b10c0..0000000
--- a/freeplane/src/org/freeplane/core/util/TypeReference.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.util;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-
-import org.freeplane.features.format.FormattedDate;
-import org.freeplane.features.format.FormattedNumber;
-
-
-/**
- * @author Dimitry Polivaev
- * Mar 2, 2011
- */
-public class TypeReference{
-
- static public Object create(final String objSpec) {
- return create(objSpec, true);
- }
-
- static public Object create(final String objSpec, final boolean verbose) {
- try {
- final int sep = objSpec.indexOf('|');
- if (sep == -1)
- return objSpec;
- final String type = objSpec.substring(0, sep);
- final String spec = objSpec.substring(sep + 1);
- final AccessibleObject factory = getFactory(type);
- if (factory instanceof Method)
- return ((Method) factory).invoke(null, spec);
- return ((Constructor<?>) factory).newInstance(spec);
- }
- catch (Exception e) {
- if (verbose)
- LogUtils.warn("cannot create for type reference " + objSpec, e);
- return objSpec;
- }
- }
-
- private static AccessibleObject getFactory(String typeReference) throws ClassNotFoundException, SecurityException,
- NoSuchMethodException {
- // backward compatibility
- if (typeReference.equals("org.freeplane.core.util.FreeplaneDate")
- || typeReference.equals("org.freeplane.features.common.format.FormattedDate"))
- typeReference = FormattedDate.class.getName();
- else if (typeReference.equals("org.freeplane.features.common.format.FormattedNumber"))
- typeReference = FormattedNumber.class.getName();
- final Class<?> clazz = TypeReference.class.getClassLoader().loadClass(typeReference);
- final FactoryMethod factoryAnnotation = clazz.getAnnotation(FactoryMethod.class);
- if (factoryAnnotation != null)
- return clazz.getMethod(factoryAnnotation.value(), String.class);
- else
- return clazz.getConstructor(String.class);
- }
-
- public static String toSpec(Object obj){
- final Class<? extends Object> clazz = obj.getClass();
- if(clazz.equals(String.class)){
- return obj.toString();
- }
- final SerializationMethod method = clazz.getAnnotation(SerializationMethod.class);
- final String type = clazz.getName() + '|';
- if(method == null){
- return type + obj.toString();
- }
- try {
- return type + clazz.getMethod(method.value(), obj.getClass()).invoke(null, obj).toString();
- }
- catch (Exception e) {
- LogUtils.warn(e);
- return obj.toString();
- }
- }
-
- /** copy of HtmlUtils.unicodeToHTMLUnicodeEntity() with the exception that the separator char '|' and the XML
- * special chars '"' and '&' are escaped too. */
- public static String encode(String text) {
- final StringBuilder result = new StringBuilder((int) (text.length() * 1.2));
- int intValue;
- char myChar;
- for (int i = 0; i < text.length(); ++i) {
- myChar = text.charAt(i);
- intValue = text.charAt(i);
- if (intValue < 32 || intValue == 34 || intValue == 38 || intValue == 124 || intValue > 126) {
- result.append("&#x").append(Integer.toString(intValue, 16)).append(';');
- }
- else {
- result.append(myChar);
- }
- }
- return result.toString();
- }
-
- public static String decode(final String spec) {
- return HtmlUtils.unescapeHTMLUnicodeEntity(spec);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/core/util/XsltPipeReaderFactory.java b/freeplane/src/org/freeplane/core/util/XsltPipeReaderFactory.java
deleted file mode 100644
index d23d0b1..0000000
--- a/freeplane/src/org/freeplane/core/util/XsltPipeReaderFactory.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.util;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.net.URL;
-
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.UITools;
-
-/**
- * @author Dimitry Polivaev
- * 29.09.2013
- */
-public class XsltPipeReaderFactory {
-
- /**
- * Creates a reader that pipes the input file through a XSLT-Script that
- * updates the version to the current.
- *
- * @throws IOException
- */
- public Reader getUpdateReader(final File file, final String xsltScript) throws FileNotFoundException,
- IOException {
- try {
- return new StringReader (transformToString(file, xsltScript));
- }
- catch (final Exception ex) {
- final String message = ex.getMessage();
- UITools.errorMessage(TextUtils.format("update_failed", String.valueOf(message)));
- LogUtils.warn(ex);
- final InputStream input = new BufferedInputStream(new FileInputStream(file));
- return getActualReader(input);
- }
- }
-
- public String transformToString(final File file, final String xsltScript) throws InterruptedException, TransformerException {
- final StringWriter writer = new StringWriter();
- final Result result = new StreamResult(writer);
- final TransformerRunnable transformer = transformer(file, xsltScript, result);
- final Thread transformerThread = new Thread(transformer, "XSLT");
- transformerThread.start();
- transformerThread.join();
- final Throwable thrownException = transformer.thrownException();
- if (thrownException != null) {
- throw new TransformerException(thrownException);
- }
- String updatedXml = writer.getBuffer().toString();
- return updatedXml;
- }
-
- static class TransformerRunnable implements Runnable {
- private Throwable thrownException = null;
- final private URL updaterUrl;
- final private File file;
- final private Result result;
-
- public TransformerRunnable(URL updaterUrl, File file, Result result) {
- super();
- this.updaterUrl = updaterUrl;
- this.file = file;
- this.result = result;
- }
-
- public void run() {
- final TransformerFactory transFact = TransformerFactory.newInstance();
- InputStream xsltInputStream = null;
- InputStream input = null;
- try {
- xsltInputStream = new BufferedInputStream(updaterUrl.openStream());
- final Source xsltSource = new StreamSource(xsltInputStream);
- input = new BufferedInputStream(new FileInputStream(file));
- final Transformer trans = transFact.newTransformer(xsltSource);
- trans.transform(new StreamSource(input), result);
- }
- catch (final Exception ex) {
- LogUtils.warn(ex);
- thrownException = ex;
- }
- finally {
- FileUtils.silentlyClose(input, xsltInputStream);
- }
- }
-
- public Throwable thrownException() {
- return thrownException;
- }
- }
- private TransformerRunnable transformer(final File file,
- final String xsltScript, final Result result) {
- final URL updaterUrl = ResourceController.getResourceController().getResource(xsltScript);
- if (updaterUrl == null) {
- throw new IllegalArgumentException(xsltScript + " not found.");
- }
- final TransformerRunnable transformer = new TransformerRunnable(updaterUrl, file, result);
- return transformer;
- }
-
- /**
- * Creates a default reader that just reads the given file.
- *
- * @throws FileNotFoundException
- */
- public Reader getActualReader(final InputStream file) throws FileNotFoundException {
- return new InputStreamReader(file, FileUtils.defaultCharset());
- }
-}
diff --git a/freeplane/src/org/freeplane/core/util/collection/DoubleListModel.java b/freeplane/src/org/freeplane/core/util/collection/DoubleListModel.java
deleted file mode 100644
index 419bd57..0000000
--- a/freeplane/src/org/freeplane/core/util/collection/DoubleListModel.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.core.util.collection;
-
-import javax.swing.AbstractListModel;
-import javax.swing.ListModel;
-import javax.swing.event.ListDataEvent;
-import javax.swing.event.ListDataListener;
-
-/**
- * @author Dimitry Polivaev
- * 21.12.2008
- */
-class DoubleListModel extends AbstractListModel implements ListModel {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private ListModel first;
- final private ListModel second;
-
- public DoubleListModel(final ListModel first, final ListModel second) {
- super();
- this.first = first;
- this.second = second;
- first.addListDataListener(new ListDataListener() {
- public void contentsChanged(final ListDataEvent e) {
- fireContentsChanged(e.getSource(), e.getIndex0(), e.getIndex1());
- }
-
- public void intervalAdded(final ListDataEvent e) {
- fireIntervalAdded(e.getSource(), e.getIndex0(), e.getIndex1());
- }
-
- public void intervalRemoved(final ListDataEvent e) {
- fireIntervalRemoved(e.getSource(), e.getIndex0(), e.getIndex1());
- }
- });
- second.addListDataListener(new ListDataListener() {
- public void contentsChanged(final ListDataEvent e) {
- final int firstSize = first.getSize();
- fireContentsChanged(e.getSource(), firstSize + e.getIndex0(), firstSize + e.getIndex1());
- }
-
- public void intervalAdded(final ListDataEvent e) {
- final int firstSize = first.getSize();
- fireIntervalAdded(e.getSource(), firstSize + e.getIndex0(), firstSize + e.getIndex1());
- }
-
- public void intervalRemoved(final ListDataEvent e) {
- final int firstSize = first.getSize();
- fireIntervalRemoved(e.getSource(), firstSize + e.getIndex0(), firstSize + e.getIndex1());
- }
- });
- }
-
- public Object getElementAt(final int index) {
- final int firstSize = first.getSize();
- return index < firstSize ? first.getElementAt(index) : second.getElementAt(index - firstSize);
- }
-
- public int getSize() {
- return first.getSize() + second.getSize();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeBuilder.java b/freeplane/src/org/freeplane/features/attribute/AttributeBuilder.java
deleted file mode 100644
index c67a369..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeBuilder.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import java.io.IOException;
-import java.util.Vector;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IElementHandler;
-import org.freeplane.core.io.IExtensionElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TypeReference;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapReader;
-import org.freeplane.features.map.MapWriter;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-class AttributeBuilder implements IElementDOMHandler {
- static class AttributeProperties {
- Object parent;
- public AttributeProperties(Object parent) {
- this.parent = parent;
- }
- String attributeName;
- String attributeValue;
- String attributeObject;
- public Object getValue() {
- Object value;
- if(attributeObject == null)
- value = attributeValue;
- else
- try {
- value = TypeReference.create(attributeObject);
- }
- catch (Exception e) {
- LogUtils.warn(e);
- value = attributeValue;
- }
- return value;
- }
- }
-
- static class RegisteredAttributeProperties {
- String attributeName;
- boolean manual = false;
- boolean restricted = false;
- boolean visible = false;
- }
-
- public static final String XML_NODE_ATTRIBUTE = "attribute";
- public static final String XML_NODE_ATTRIBUTE_LAYOUT = "attribute_layout";
- public static final String XML_NODE_ATTRIBUTE_REGISTRY = "attribute_registry";
- public static final String XML_NODE_REGISTERED_ATTRIBUTE_NAME = "attribute_name";
- public static final String XML_NODE_REGISTERED_ATTRIBUTE_VALUE = "attribute_value";
- final private AttributeController attributeController;
-// // final private Controller controller;
- final private MapReader mapReader;
-
- public AttributeBuilder(final AttributeController attributeController, final MapReader mapReader) {
- this.attributeController = attributeController;
- this.mapReader = mapReader;
- }
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (tag.equals(AttributeBuilder.XML_NODE_ATTRIBUTE)
- || tag.equals(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE)) {
- return new AttributeProperties(parent);
- }
- if (tag.equals(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME)) {
- return new RegisteredAttributeProperties();
- }
- if (tag.equals(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY)) {
- return parent;
- }
- return null;
- }
-
- public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
- /* attributes */
- if (tag.equals(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME)) {
- final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
- if (rap.visible) {
- AttributeRegistry.getRegistry(getMap()).getElement(rap.attributeName).setVisibility(true);
- }
- if (rap.restricted) {
- AttributeRegistry.getRegistry(getMap()).getElement(rap.attributeName).setRestriction(true);
- }
- if (rap.manual) {
- AttributeRegistry.getRegistry(getMap()).getElement(rap.attributeName).setManual(true);
- }
- return;
- }
- if (tag.equals(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE)) {
- final AttributeProperties ap = (AttributeProperties) userObject;
- final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) ap.parent;
- final Attribute attribute = new Attribute(rap.attributeName, ap.getValue());
- final AttributeRegistry r = AttributeRegistry.getRegistry(getMap());
- r.registry(attribute);
- }
- if (parent instanceof NodeModel) {
- final NodeModel node = (NodeModel) parent;
- if (tag.equals(AttributeBuilder.XML_NODE_ATTRIBUTE)) {
- final AttributeProperties ap = (AttributeProperties) userObject;
- final Attribute attribute = new Attribute(ap.attributeName, ap.getValue());
- attributeController.createAttributeTableModel(node);
- final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(node);
- model.addRowNoUndo(attribute);
- return;
- }
- return;
- }
- }
-
- private MapModel getMap() {
- return mapReader.getCurrentNodeTreeCreator().getCreatedMap();
- }
-
- private void registerAttributeHandlers(final ReadManager reader) {
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, "NAME",
- new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
- rap.attributeName = value;
- AttributeRegistry.getRegistry(getMap()).registry(value);
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, "VISIBLE",
- new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
- rap.visible = true;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, "RESTRICTED",
- new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
- rap.restricted = true;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, "MANUAL",
- new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final RegisteredAttributeProperties rap = (RegisteredAttributeProperties) userObject;
- rap.manual = true;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE, "VALUE",
- new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final AttributeProperties ap = (AttributeProperties) userObject;
- ap.attributeValue = value;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE, "OBJECT",
- new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final AttributeProperties ap = (AttributeProperties) userObject;
- ap.attributeObject = value;
- }
- });
- reader.addElementHandler(XML_NODE_ATTRIBUTE_LAYOUT, new IElementHandler() {
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- return parent;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_LAYOUT, "NAME_WIDTH", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- attributeController.createAttributeTableModel(node);
- final AttributeTableLayoutModel layout = NodeAttributeTableModel.getModel(node).getLayout();
- layout.setColumnWidth(0, Integer.parseInt(value));;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_LAYOUT, "VALUE_WIDTH", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- attributeController.createAttributeTableModel(node);
- final AttributeTableLayoutModel layout = NodeAttributeTableModel.getModel(node).getLayout();
- layout.setColumnWidth(1, Integer.parseInt(value));;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE, "NAME", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final AttributeProperties ap = (AttributeProperties) userObject;
- ap.attributeName = value;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE, "VALUE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final AttributeProperties ap = (AttributeProperties) userObject;
- ap.attributeValue = value;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE, "OBJECT", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final AttributeProperties ap = (AttributeProperties) userObject;
- ap.attributeObject = value;
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY, "RESTRICTED", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- AttributeRegistry.getRegistry(getMap()).setRestricted(true);
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY, "SHOW_ATTRIBUTES",
- new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final AttributeRegistry attributes = AttributeRegistry.getRegistry(getMap());
- if(attributes != null)
- attributes.setAttributeViewType(value);
- }
- });
- reader.addAttributeHandler(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY, "FONT_SIZE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final int size = Integer.parseInt(value.toString());
- AttributeRegistry.getRegistry(getMap()).setFontSize(size);
- }
- });
- }
-
- /**
- */
- public void registerBy(final ReadManager reader, final WriteManager writer) {
- reader.addElementHandler("attribute_registry", this);
- reader.addElementHandler(AttributeBuilder.XML_NODE_ATTRIBUTE, this);
- reader.addElementHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_NAME, this);
- reader.addElementHandler(AttributeBuilder.XML_NODE_REGISTERED_ATTRIBUTE_VALUE, this);
- writer.addExtensionElementWriter(NodeAttributeTableModel.class, new IExtensionElementWriter() {
- public void writeContent(final ITreeWriter writer, final Object node, final IExtension extension)
- throws IOException {
- final NodeAttributeTableModel attributes = (NodeAttributeTableModel) extension;
- save((NodeModel)node, attributes, writer);
- }
- });
- writer.addExtensionElementWriter(AttributeRegistry.class, new IExtensionElementWriter() {
- public void writeContent(final ITreeWriter writer, final Object node, final IExtension extension)
- throws IOException {
- final AttributeRegistry attributes = (AttributeRegistry) extension;
- attributes.write(writer);
- }
- });
- registerAttributeHandlers(reader);
- }
-
- void save(NodeModel node, NodeAttributeTableModel table, final ITreeWriter writer) throws IOException {
- saveLayout(table.getLayout(), writer);
- if (table.getRowCount() > 0) {
- final Vector<Attribute> attributes = table.getAttributes();
- for (int i = 0; i < attributes.size(); i++) {
- saveAttribute(node, writer, attributes.get(i));
- }
- }
- }
-
- private static final int DEFAULT_COLUMN_WIDTH = 75;
- private void saveLayout(AttributeTableLayoutModel layout, final ITreeWriter writer) throws IOException {
- if (layout != null) {
- XMLElement attributeElement = null;
- if (layout.getColumnWidth(0) != DEFAULT_COLUMN_WIDTH) {
- attributeElement = initializeNodeAttributeLayoutXMLElement(attributeElement);
- attributeElement.setAttribute("NAME_WIDTH", Integer.toString(layout.getColumnWidth(0)));
- }
- if (layout.getColumnWidth(1) != DEFAULT_COLUMN_WIDTH) {
- attributeElement = initializeNodeAttributeLayoutXMLElement(attributeElement);
- attributeElement.setAttribute("VALUE_WIDTH", Integer.toString(layout.getColumnWidth(1)));
- }
- if (attributeElement != null) {
- writer.addElement(layout, attributeElement);
- }
- }
- }
- private XMLElement initializeNodeAttributeLayoutXMLElement(XMLElement attributeElement) {
- if (attributeElement == null) {
- attributeElement = new XMLElement();
- attributeElement.setName(AttributeBuilder.XML_NODE_ATTRIBUTE_LAYOUT);
- }
- return attributeElement;
- }
-
- private void saveAttribute(NodeModel node, final ITreeWriter writer, final Attribute attr) throws IOException {
- final XMLElement attributeElement = new XMLElement();
- attributeElement.setName(AttributeBuilder.XML_NODE_ATTRIBUTE);
- attributeElement.setAttribute("NAME", attr.getName());
- final Object value = attr.getValue();
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (forceFormatting) {
- attributeElement.setAttribute("VALUE", TextController.getController().getTransformedTextNoThrow(value, node, null));
- }
- else{
- attributeElement.setAttribute("VALUE", value.toString());
- if(! (value instanceof String))
- attributeElement.setAttribute("OBJECT", TypeReference.toSpec(value));
- }
- writer.addElement(attr, attributeElement);
- }
-
- public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeCompareCondition.java b/freeplane/src/org/freeplane/features/attribute/AttributeCompareCondition.java
deleted file mode 100644
index 002a3d7..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeCompareCondition.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import org.freeplane.core.io.xml.TreeXmlReader;
-import org.freeplane.core.io.xml.TreeXmlWriter;
-import org.freeplane.core.util.TypeReference;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.CompareConditionAdapter;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- */
-public class AttributeCompareCondition extends CompareConditionAdapter {
- static final String ATTRIBUTE = "ATTRIBUTE";
- static final String COMPARATION_RESULT = "COMPARATION_RESULT";
- static final String NAME = "attribute_compare_condition";
- static final String SUCCEED = "SUCCEED";
-
- static ASelectableCondition load(final XMLElement element) {
- final String attr = element.getAttribute(AttributeCompareCondition.ATTRIBUTE, null);
- Object value = element.getAttribute(CompareConditionAdapter.VALUE, null);
- if(value == null){
- final String spec = element.getAttribute(CompareConditionAdapter.OBJECT, null);
- value = TypeReference.create(spec);
- }
-
- final boolean matchCase = TreeXmlReader.xmlToBoolean(element.getAttribute(
- CompareConditionAdapter.MATCH_CASE, null));
- final int compResult = Integer.parseInt(element.getAttribute(
- AttributeCompareCondition.COMPARATION_RESULT, null));
- final boolean succeed = TreeXmlReader.xmlToBoolean(element.getAttribute(
- AttributeCompareCondition.SUCCEED, null));
- final boolean matchApproximately = TreeXmlReader.xmlToBoolean(element.getAttribute(
- AttributeCompareCondition.MATCH_APPROXIMATELY, null));
- return new AttributeCompareCondition(attr, value, matchCase, compResult, succeed, matchApproximately);
- }
-
- final private String attribute;
- final private int comparationResult;
- final private boolean succeed;
-
- /**
- */
- public AttributeCompareCondition(final String attribute, final Object value, final boolean matchCase,
- final int comparationResult, final boolean succeed, final boolean matchApproximately) {
- super(value, matchCase, matchApproximately);
- this.attribute = attribute;
- this.comparationResult = comparationResult;
- this.succeed = succeed;
-
- }
-
- public boolean isEqualityCondition()
- {
- return comparationResult == 0;
- }
-
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
- * .MindMapNode)
- */
- public boolean checkNode(final NodeModel node) {
- final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
- final TextController textController = TextController.getController();
- for (int i = 0; i < attributes.getRowCount(); i++) {
- try {
- if(! attributes.getValueAt(i, 0).equals(attribute)) {
- continue;
- }
- final Object originalContent = attributes.getValueAt(i, 1);
- final Object text = textController.getTransformedTextNoThrow(originalContent, node, null);
- compareTo(text);
- if (isComparisonOK() && succeed == (getComparisonResult() == comparationResult))
- return true;
- }
- catch (final NumberFormatException fne) {
- }
- }
- return false;
- }
-
- @Override
- protected String createDescription() {
- return super.createDescription(attribute, comparationResult, succeed);
- }
-
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(AttributeCompareCondition.ATTRIBUTE, attribute);
- child.setAttribute(AttributeCompareCondition.COMPARATION_RESULT, Integer.toString(comparationResult));
- child.setAttribute(AttributeCompareCondition.SUCCEED, TreeXmlWriter.BooleanToXml(succeed));
- child.setAttribute(AttributeCompareCondition.MATCH_APPROXIMATELY, TreeXmlWriter.BooleanToXml(matchApproximately));
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeConditionController.java b/freeplane/src/org/freeplane/features/attribute/AttributeConditionController.java
deleted file mode 100644
index b67c8f2..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeConditionController.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import java.util.NoSuchElementException;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.ui.FixedBasicComboBoxEditor;
-import org.freeplane.core.ui.components.TypedListCellRenderer;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.collection.ExtendedComboBoxModel;
-import org.freeplane.core.util.collection.SortedComboBoxModel;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.features.link.LinkTransformer;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.FrameController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * 21.12.2008
- */
-class AttributeConditionController implements IElementaryConditionController {
-// // final private Controller controller;
- private final ExtendedComboBoxModel values = new ExtendedComboBoxModel();
-
- public AttributeConditionController() {
- super();
-// this.controller = controller;
- }
-
- public boolean canEditValues(final Object selectedItem, final NamedObject simpleCond) {
- return canSelectValues(selectedItem, simpleCond);
- }
-
- public boolean canHandle(final Object selectedItem) {
- return selectedItem.getClass().equals(String.class);
- }
-
- public boolean canSelectValues(final Object selectedItem, final NamedObject simpleCond) {
- return !simpleCond.objectEquals(ConditionFactory.FILTER_EXIST)
- && !simpleCond.objectEquals(ConditionFactory.FILTER_DOES_NOT_EXIST);
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCondition,
- final Object value, final boolean matchCase, final boolean matchApproximately) {
- final String attribute = (String) selectedItem;
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_EXIST)) {
- return new AttributeExistsCondition(attribute);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_DOES_NOT_EXIST)) {
- return new AttributeNotExistsCondition(attribute);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
- return new AttributeCompareCondition(attribute, value, matchCase, 0, true, matchApproximately);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
- return new AttributeCompareCondition(attribute, value, matchCase, 0, false, matchApproximately);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
- return new AttributeCompareCondition(attribute, value, matchCase, 1, true, false);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
- return new AttributeCompareCondition(attribute, value, matchCase, -1, false, false);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
- return new AttributeCompareCondition(attribute, value, matchCase, -1, true, false);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
- return new AttributeCompareCondition(attribute, value, matchCase, 1, false, false);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)) {
- return new AttributeContainsCondition(attribute, value.toString(), matchCase, matchApproximately);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_REGEXP)) {
- return new AttributeMatchesCondition(attribute, value.toString(), matchCase);
- }
- return null;
- }
-
- public ComboBoxModel getConditionsForProperty(final Object selectedItem) {
- return new DefaultComboBoxModel(new NamedObject[] {
- TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_REGEXP),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_EXIST),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_DOES_NOT_EXIST),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_NOT_EQUAL_TO),
- NamedObject.literal(ConditionFactory.FILTER_GT), NamedObject.literal(ConditionFactory.FILTER_GE),
- NamedObject.literal(ConditionFactory.FILTER_LE), NamedObject.literal(ConditionFactory.FILTER_LT)
- });
- }
-
- public ListModel getFilteredProperties() {
- final AttributeRegistry registry = AttributeRegistry.getRegistry(Controller.getCurrentController().getMap());
- if (registry != null) {
- return registry.getListBoxModel();
- }
- return new DefaultListModel();
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- if(selectedCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)
- || selectedCondition.objectEquals(ConditionFactory.FILTER_REGEXP) )
- return new FixedBasicComboBoxEditor();
- return FrameController.getTextDateTimeEditor();
- }
-
- public ComboBoxModel getValuesForProperty(final Object selectedItem, NamedObject simpleCond) {
- final MapModel map = Controller.getCurrentController().getMap();
- final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
- try {
- final AttributeRegistryElement element = registry.getElement(selectedItem.toString());
- final SortedComboBoxModel list = element.getValues();
- SortedComboBoxModel linkedList = new SortedComboBoxModel();
- for(int i = 0; i < list.getSize();i++){
- final Object value = list.getElementAt(i);
- final Object transformedValue = new LinkTransformer(Controller.getCurrentModeController(), 1).transformContent(value, map);
- linkedList.add(transformedValue);
- }
- values.setExtensionList(linkedList);
- }
- catch (NoSuchElementException e) {
- values.setExtensionList(null);
- }
- return values;
- }
-
- public boolean isCaseDependent(final Object selectedItem, final NamedObject simpleCond) {
- return true;
- }
-
- public boolean supportsApproximateMatching(final Object property, final NamedObject simpleCond) {
- return true;
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- if (element.getName().equalsIgnoreCase(AttributeCompareCondition.NAME)) {
- return AttributeCompareCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(AttributeExistsCondition.NAME)) {
- return AttributeExistsCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(AttributeNotExistsCondition.NAME)) {
- return AttributeNotExistsCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(AttributeContainsCondition.NAME)) {
- return AttributeContainsCondition.load(element);
- }
- return null;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- if(selectedCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)
- || selectedCondition.objectEquals(ConditionFactory.FILTER_REGEXP) )
- return null;
- return new TypedListCellRenderer();
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeContainsCondition.java b/freeplane/src/org/freeplane/features/attribute/AttributeContainsCondition.java
deleted file mode 100644
index 9601a4c..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeContainsCondition.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.ExactStringMatchingStrategy;
-import org.freeplane.features.filter.StringMatchingStrategy;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- */
-public class AttributeContainsCondition extends ASelectableCondition {
- static final String ATTRIBUTE = "ATTRIBUTE";
- static final String NAME = "attribute_contains_condition";
- static final String VALUE = "VALUE";
- static final String MATCH_CASE = "MATCH_CASE";
- static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
-
-
- static ASelectableCondition load(final XMLElement element) {
- return new AttributeContainsCondition(
- element.getAttribute(AttributeContainsCondition.ATTRIBUTE, null),
- element.getAttribute(AttributeContainsCondition.VALUE, null),
- Boolean.valueOf(element.getAttribute(AttributeContainsCondition.MATCH_CASE, null)),
- Boolean.valueOf(element.getAttribute(AttributeContainsCondition.MATCH_APPROXIMATELY, null))
- );
- }
-
- final private String attribute;
- final private String value;
- final private String comparedValue;
- final private boolean matchCase;
- final private boolean matchApproximately;
- final private StringMatchingStrategy stringMatchingStrategy;
-
- /**
- */
- public AttributeContainsCondition(final String attribute,final String value, final boolean matchCase,
- final boolean matchApproximately) {
- super();
- this.attribute = attribute;
- this.value = value;
- this.matchCase = matchCase;
- //this.comparedValue = matchCase ? value : value.toLowerCase();
- this.comparedValue = value;
- this.matchApproximately = matchApproximately;
- this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
- * .MindMapNode)
- */
- public boolean checkNode(final NodeModel node) {
- final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
- final TextController textController = TextController.getController();
- for (int i = 0; i < attributes.getRowCount(); i++) {
- if(! attributes.getValueAt(i, 0).equals(attribute)) {
- continue;
- }
- final Object originalContent = attributes.getValueAt(i, 1);
- String text = textController.getTransformedTextNoThrow(originalContent, node, null);
- if (stringMatchingStrategy.matches(comparedValue, text, true, matchCase)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- protected String createDescription() {
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
- return ConditionFactory.createDescription(attribute, simpleCondition, value, matchCase, matchApproximately);
- }
-
- @Override
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(AttributeContainsCondition.ATTRIBUTE, attribute);
- child.setAttribute(AttributeContainsCondition.VALUE, value);
- child.setAttribute(AttributeContainsCondition.MATCH_CASE, Boolean.toString(matchCase));
- child.setAttribute(AttributeContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeController.java b/freeplane/src/org/freeplane/features/attribute/AttributeController.java
deleted file mode 100644
index dcd607f..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeController.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import java.awt.Component;
-import java.net.URI;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.IStateIconProvider;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.UIIcon;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.map.ITooltipProvider;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapReader;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.text.TextController;
-
-/**
- * @author Dimitry Polivaev 22.11.2008
- */
-public class AttributeController implements IExtension {
- public static final String SHOW_ICON_FOR_ATTRIBUTES = "show_icon_for_attributes";
- private static final Integer ATTRIBUTE_TOOLTIP = 7;
- static private UIIcon attributeIcon = null;
- public static AttributeController getController() {
- return getController(Controller.getCurrentModeController());
- }
-
- public static AttributeController getController(ModeController modeController) {
- return (AttributeController) modeController.getExtension(AttributeController.class);
- }
-
- public static void install( final AttributeController attributeController) {
- Controller.getCurrentModeController().addExtension(AttributeController.class, attributeController);
- }
-
- final private ModeController modeController;
-
- public AttributeController(final ModeController modeController) {
- this.modeController = modeController;
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- final ReadManager readManager = mapController.getReadManager();
- final WriteManager writeManager = mapController.getWriteManager();
- final MapReader mapReader = mapController.getMapReader();
- final AttributeBuilder attributeBuilder = new AttributeBuilder(this, mapReader);
- attributeBuilder.registerBy(readManager, writeManager);
- registerTooltipProvider();
- registerStateIconProvider();
- }
-
- public NodeAttributeTableModel createAttributeTableModel(final NodeModel node) {
- NodeAttributeTableModel attributeModel = (NodeAttributeTableModel) node
- .getExtension(NodeAttributeTableModel.class);
- if (attributeModel != null) {
- return attributeModel;
- }
- attributeModel = new NodeAttributeTableModel(node);
- node.addExtension(attributeModel);
- if (node.areViewsEmpty()) {
- return attributeModel;
- }
- modeController.getMapController().nodeRefresh(node);
- return attributeModel;
- }
-
- public void performInsertRow(final NodeAttributeTableModel model, final int row, final String name,
- final Object value) {
- throw new UnsupportedOperationException();
- }
-
- public void performRegistryAttribute(final String name) {
- throw new UnsupportedOperationException();
- }
-
- public void performRegistryAttributeValue(final String name, final String value, boolean manual) {
- throw new UnsupportedOperationException();
- }
-
- public void performRegistrySubtreeAttributes(final NodeModel model) {
- throw new UnsupportedOperationException();
- }
-
- public void performRemoveAttribute(final String name) {
- throw new UnsupportedOperationException();
- }
-
- public void performRemoveAttributeValue(final String name, final String value) {
- throw new UnsupportedOperationException();
- }
-
- public Attribute performRemoveRow(final NodeAttributeTableModel model, final int row) {
- throw new UnsupportedOperationException();
- }
-
- public void performReplaceAtributeName(final String oldName, final String newName) {
- throw new UnsupportedOperationException();
- }
-
- public void performReplaceAttributeValue(final String name, final String oldValue, final String newValue) {
- throw new UnsupportedOperationException();
- }
-
- public void performSetColumnWidth(final NodeAttributeTableModel model, final int col, final int width) {
- throw new UnsupportedOperationException();
- }
-
- public void performSetFontSize(final AttributeRegistry registry, final int size) {
- throw new UnsupportedOperationException();
- }
-
- public void performSetRestriction(final int row, final boolean restricted) {
- throw new UnsupportedOperationException();
- }
-
- public void performSetValueAt(final NodeAttributeTableModel model, final Object o, final int row, final int col) {
- throw new UnsupportedOperationException();
- }
-
- public void performSetVisibility(final int index, final boolean isVisible) {
- throw new UnsupportedOperationException();
- }
-
- private void registerTooltipProvider() {
- modeController.addToolTipProvider(ATTRIBUTE_TOOLTIP, new ITooltipProvider() {
- public String getTooltip(ModeController modeController, NodeModel node, Component view) {
- final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
- final int rowCount = attributes.getRowCount();
- if (rowCount == 0) {
- return null;
- }
- final AttributeRegistry registry = AttributeRegistry.getRegistry(node.getMap());
- final TextController textController = TextController.getController(modeController);
- if (registry.getAttributeViewType().equals(AttributeTableLayoutModel.SHOW_ALL)
- && ! textController.isMinimized(node)) {
- return null;
- }
- final StringBuilder tooltip = new StringBuilder();
- final int fontSize = registry.getFontSize();
- tooltip.append("<html><body><table style='border: 1px black solid; background-color: black;");
- tooltip.append(" font-size: "); tooltip.append(fontSize); tooltip.append("pt");
- tooltip.append("' width='100%' cellspacing='1' cellpadding='2' ");
- final int currentRowCount = attributes.getRowCount();
- for (int i = 0; i < currentRowCount; i++) {
- tooltip.append("<tr><td>");
- tooltip.append(attributes.getValueAt(i, 0));
- tooltip.append("</td><td>");
- final Object object = attributes.getValueAt(i, 1);
- final String text = getTransformedValue(node, textController, object);
- if(object instanceof URI){
- tooltip.append("<a");
- tooltip.append(" href=\"");
- tooltip.append(object);
- tooltip.append("\"");
- tooltip.append(">");
- tooltip.append(text);
- tooltip.append("</a>");
- }
- else{
- tooltip.append(text);
- }
- tooltip.append("</td></tr>");
- }
- tooltip.append("</table></body></html>");
- return tooltip.toString();
- }
-
- private String getTransformedValue(NodeModel node, final TextController textController, final Object value) {
- try {
- final String text = textController.getTransformedText(value, node, null);
- final boolean markTransformedText = TextController.isMarkTransformedTextSet();
- final String unicodeText = HtmlUtils.unicodeToHTMLUnicodeEntity(text);
- if (markTransformedText && text != value)
- return colorize(unicodeText, "green");
- else
- return unicodeText;
- }
- catch (Throwable e) {
- LogUtils.warn(e.getMessage(), e);
- return colorize(
- TextUtils.format("MainView.errorUpdateText", String.valueOf(value), e.getLocalizedMessage())
- .replace("\n", "<br>"), "red");
- }
- }
-
- private String colorize(final String text, String color) {
- return "<span style=\"color:" + color + ";font-style:italic;\">" + text + "</span>";
- }
- });
- }
-
- private void registerStateIconProvider() {
- IconController.getController().addStateIconProvider(new IStateIconProvider() {
- public UIIcon getStateIcon(NodeModel node) {
- NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);;
- if (attributes.getRowCount() == 0) {
- return null;
- }
- final String showAttributeIcon = MapStyle.getController(modeController).getPropertySetDefault(node.getMap(), SHOW_ICON_FOR_ATTRIBUTES);
- final boolean showIcon = Boolean.parseBoolean(showAttributeIcon);
- if(showIcon) {
- if (attributeIcon == null) {
- attributeIcon = IconStoreFactory.create().getUIIcon("showAttributes.png");
- }
- return attributeIcon;
- }
- else
- return null;
- }
- });
- }
-
- public boolean canEdit() {
- return false;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeExistsCondition.java b/freeplane/src/org/freeplane/features/attribute/AttributeExistsCondition.java
deleted file mode 100644
index bd4c76d..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeExistsCondition.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- */
-public class AttributeExistsCondition extends ASelectableCondition {
- static final String ATTRIBUTE = "ATTRIBUTE";
- static final String NAME = "attribute_exists_condition";
-
- static ASelectableCondition load(final XMLElement element) {
- return new AttributeExistsCondition(element.getAttribute(AttributeExistsCondition.ATTRIBUTE, null));
- }
-
- final private String attribute;
-
- /**
- */
- public AttributeExistsCondition(final String attribute) {
- super();
- this.attribute = attribute;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
- * .MindMapNode)
- */
- public boolean checkNode(final NodeModel node) {
- final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
- for (int i = 0; i < attributes.getRowCount(); i++) {
- if (attributes.getValueAt(i, 0).equals(attribute)) {
- return true;
- }
- }
- return false;
- }
-
- @Override
- protected String createDescription() {
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_EXIST);
- return ConditionFactory.createDescription(attribute, simpleCondition, null, false, false);
- }
-
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(AttributeExistsCondition.ATTRIBUTE, attribute);
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeMatchesCondition.java b/freeplane/src/org/freeplane/features/attribute/AttributeMatchesCondition.java
deleted file mode 100644
index e30e4dd..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeMatchesCondition.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import java.util.regex.Pattern;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * Condition for matching a regexp against an attribute.
- * Approximate matching setting is ignored here.
- *
- * @author Dimitry Polivaev
- */
-public class AttributeMatchesCondition extends ASelectableCondition {
- static final String ATTRIBUTE = "ATTRIBUTE";
- static final String NAME = "attribute_matches_condition";
- static final String VALUE = "VALUE";
- static final String MATCH_CASE = "MATCH_CASE";
-
- static ASelectableCondition load(final XMLElement element) {
- return new AttributeMatchesCondition(
- element.getAttribute(AttributeMatchesCondition.ATTRIBUTE, null),
- element.getAttribute(AttributeMatchesCondition.VALUE, null),
- Boolean.valueOf(element.getAttribute(AttributeMatchesCondition.MATCH_CASE, null))
- );
- }
-
- final private String attribute;
- final private String value;
- final private Pattern searchPattern;
- /**
- */
- public AttributeMatchesCondition(final String attribute,final String value, final boolean matchCase) {
- super();
- this.attribute = attribute;
- this.value = value;
- int flags = Pattern.DOTALL;
- if (!matchCase) {
- flags |= Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE;
- }
- this.searchPattern = Pattern.compile(value, flags);
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
- * .MindMapNode)
- */
- public boolean checkNode(final NodeModel node) {
- final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
- final TextController textController = TextController.getController();
- for (int i = 0; i < attributes.getRowCount(); i++) {
- if(! attributes.getValueAt(i, 0).equals(attribute)) {
- continue;
- }
- final Object originalContent = attributes.getValueAt(i, 1);
- String text = textController.getTransformedTextNoThrow(originalContent, node, null);
- if(searchPattern.matcher(text).find())
- return true;
- }
- return false;
- }
-
- @Override
- protected String createDescription() {
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_REGEXP);
- return ConditionFactory.createDescription(attribute, simpleCondition, null, isMatchCase(), false);
- }
-
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(AttributeMatchesCondition.ATTRIBUTE, attribute);
- child.setAttribute(AttributeMatchesCondition.VALUE, value);
- child.setAttribute(AttributeMatchesCondition.MATCH_CASE, Boolean.toString(isMatchCase()));
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
- private boolean isMatchCase() {
- return (searchPattern.flags() & Pattern.CASE_INSENSITIVE) == 0;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeNotExistsCondition.java b/freeplane/src/org/freeplane/features/attribute/AttributeNotExistsCondition.java
deleted file mode 100644
index 897cb42..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeNotExistsCondition.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- */
-public class AttributeNotExistsCondition extends ASelectableCondition {
- static final String ATTRIBUTE = "ATTRIBUTE";
- static final String NAME = "attribute_not_exists_condition";
-
- static ASelectableCondition load(final XMLElement element) {
- return new AttributeNotExistsCondition(element.getAttribute(AttributeNotExistsCondition.ATTRIBUTE, null));
- }
-
- final private String attribute;
-
- /**
- */
- public AttributeNotExistsCondition(final String attribute) {
- super();
- this.attribute = attribute;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.controller.filter.condition.Condition#checkNode(freeplane.modes
- * .MindMapNode)
- */
- public boolean checkNode(final NodeModel node) {
- final IAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
- for (int i = 0; i < attributes.getRowCount(); i++) {
- if (attributes.getValueAt(i, 0).equals(attribute)) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- protected String createDescription() {
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_DOES_NOT_EXIST);
- return ConditionFactory.createDescription(attribute, simpleCondition, null, false, false);
- }
-
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(AttributeNotExistsCondition.ATTRIBUTE, attribute);
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeRegistry.java b/freeplane/src/org/freeplane/features/attribute/AttributeRegistry.java
deleted file mode 100644
index 858c14f..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeRegistry.java
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import java.io.IOException;
-import java.util.NoSuchElementException;
-
-import javax.swing.ComboBoxModel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.EventListenerList;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.util.collection.IListModel;
-import org.freeplane.core.util.collection.SortedComboBoxModel;
-import org.freeplane.core.util.collection.SortedMapVector;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- */
-public class AttributeRegistry implements IExtension {
- static public final int GLOBAL = -1;
- private static final int TABLE_FONT_SIZE = 9;
-
- public static AttributeRegistry getRegistry(final MapModel map) {
- AttributeRegistry registry = (AttributeRegistry) map.getExtension(AttributeRegistry.class);
- if (registry == null) {
- final AttributeController attributeController = AttributeController.getController();
- registry = new AttributeRegistry(attributeController);
- map.addExtension(AttributeRegistry.class, registry);
- final NodeModel rootNode = map.getRootNode();
- if(rootNode != null)
- registry.registryAttributes(Controller.getCurrentModeController().getMapController(), rootNode);
- }
- return registry;
- }
-
- private AttributeController attributeController;
- private ChangeEvent attributesEvent;
- private String attributeViewType;
- private ChangeEvent changeEvent;
- protected SortedMapVector elements;
- private int fontSize = AttributeRegistry.TABLE_FONT_SIZE;
- protected boolean isAttributeLayoutChanged;
- private boolean isRestricted;
- private EventListenerList listenerList = null;
- private AttributeRegistryComboBoxColumnModel myComboBoxColumnModel = null;
- private AttributeRegistryTableModel myTableModel = null;
- private Boolean restrictionModel;
- protected int visibleElementsNumber;
-
- /**
- *
- */
- public AttributeRegistry() {
- super();
- }
-
- public AttributeRegistry(final AttributeController attributeController) {
- super();
- listenerList = new EventListenerList();
- isAttributeLayoutChanged = false;
- this.attributeController = attributeController;
- visibleElementsNumber = 0;
- elements = new SortedMapVector();
- myTableModel = new AttributeRegistryTableModel(this);
- isRestricted = false;
- restrictionModel = Boolean.FALSE;
- attributeViewType = AttributeTableLayoutModel.SHOW_ALL;
- }
-
- public void addAttributesListener(final IAttributesListener l) {
- listenerList.add(IAttributesListener.class, l);
- }
-
- public void addChangeListener(final ChangeListener l) {
- listenerList.add(ChangeListener.class, l);
- }
-
- public void applyChanges() {
- if (isAttributeLayoutChanged == false) {
- return;
- }
- getAttributeController().performSetRestriction(AttributeRegistry.GLOBAL, restrictionModel.booleanValue());
- for (int i = 0; i < elements.size(); i++) {
- final AttributeRegistryElement element = getElement(i);
- getAttributeController().performSetVisibility(i, element.getVisibilityModel().booleanValue());
- getAttributeController().performSetRestriction(i, element.getRestriction().booleanValue());
- }
- isAttributeLayoutChanged = false;
- }
-
- public boolean containsElement(final String name) {
- return elements.containsKey(name);
- }
-
- public void decrementVisibleElementsNumber() {
- visibleElementsNumber--;
- }
-
- public boolean exist(final String attributeName, final Object element) {
- final int index = indexOf(attributeName);
- if (index == -1) {
- return false;
- }
- final SortedComboBoxModel values = getElement(index).getValues();
- for (int i = 0; i < values.getSize(); i++) {
- if (element.equals(values.getElementAt(i))) {
- return true;
- }
- }
- return false;
- }
-
- public void fireAttributeLayoutChanged() {
- fireStateChanged();
- }
-
- protected void fireAttributesChanged() {
- final Object[] listeners = listenerList.getListenerList();
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IAttributesListener.class) {
- if (attributesEvent == null) {
- attributesEvent = new ChangeEvent(this);
- }
- ((IAttributesListener) listeners[i + 1]).attributesChanged(changeEvent);
- }
- }
- }
-
- public void fireStateChanged() {
- final Object[] listeners = listenerList.getListenerList();
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == ChangeListener.class) {
- if (changeEvent == null) {
- changeEvent = new ChangeEvent(this);
- }
- ((ChangeListener) listeners[i + 1]).stateChanged(changeEvent);
- }
- }
- }
-
- public AttributeController getAttributeController() {
- return attributeController;
- }
-
- public String getAttributeViewType() {
- return attributeViewType;
- }
-
- private AttributeRegistryComboBoxColumnModel getCombinedModel() {
- if (myComboBoxColumnModel == null) {
- myComboBoxColumnModel = new AttributeRegistryComboBoxColumnModel(this);
- }
- return myComboBoxColumnModel;
- }
-
- public ComboBoxModel getComboBoxModel() {
- return getCombinedModel();
- }
-
- public ComboBoxModel getDefaultComboBoxModel(final Comparable<?> attrName) {
- try {
- final AttributeRegistryElement elem = getElement(attrName);
- return elem.getValues();
- }
- catch (final NoSuchElementException ex) {
- return getComboBoxModel();
- }
- }
-
- public AttributeRegistryElement getElement(final Comparable<?> attrName) {
- final AttributeRegistryElement elem = (AttributeRegistryElement) elements.getValue(attrName);
- return elem;
- }
-
- public AttributeRegistryElement getElement(final int index) {
- return (AttributeRegistryElement) elements.getValue(index);
- }
-
- public SortedMapVector getElements() {
- return elements;
- }
-
- /**
- * @return Returns the fontSize.
- */
- public int getFontSize() {
- return fontSize;
- }
-
- public Comparable<?> getKey(final int index) {
- return elements.getKey(index);
- }
-
- public IListModel getListBoxModel() {
- return getCombinedModel();
- }
-
- Boolean getRestriction(final int row) {
- if (row == AttributeRegistry.GLOBAL) {
- return restrictionModel;
- }
- else {
- return getElement(row).getRestriction();
- }
- }
-
- /**
- */
- public AttributeRegistryTableModel getTableModel() {
- return myTableModel;
- }
-
- /**
- */
- public IListModel getValues(final int row) {
- if (row == AttributeRegistry.GLOBAL) {
- return getListBoxModel();
- }
- return getElement(row).getValues();
- }
-
- public int getVisibleElementsNumber() {
- return visibleElementsNumber;
- }
-
- public void incrementVisibleElementsNumber() {
- visibleElementsNumber++;
- }
-
- /**
- */
- public int indexOf(final String string) {
- return elements.indexOf(string);
- }
-
- /**
- */
- public boolean isRestricted() {
- return isRestricted;
- }
-
- public boolean isRestricted(final String s) {
- return getRestriction(indexOf(s)).booleanValue();
- }
-
- public void registry(final Attribute newAttribute) {
- final String name = newAttribute.getName();
- if (name.equals("")) {
- return;
- }
- final Object value = newAttribute.getValue();
- try {
- final AttributeRegistryElement elem = getElement(name);
- elem.addValue(value);
- }
- catch (final NoSuchElementException ex) {
- final AttributeRegistryElement attributeRegistryElement = new AttributeRegistryElement(this, name);
- attributeRegistryElement.addValue(value);
- final int index = getElements().add(name, attributeRegistryElement);
- getTableModel().fireTableRowsInserted(index, index);
- };
- fireAttributesChanged();
- }
-
- public void registry(final String name) {
- final AttributeRegistryElement attributeRegistryElement = new AttributeRegistryElement(this, name);
- final int index = getElements().add(name, attributeRegistryElement);
- getTableModel().fireTableRowsInserted(index, index);
- }
-
- private void registryAttributes(final MapController mapController, final NodeModel node) {
- final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(node);
- if (model == null) {
- return;
- }
- for (int i = 0; i < model.getRowCount(); i++) {
- registry(model.getAttribute(i));
- }
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- registryAttributes(mapController, child);
- }
- }
-
- /**
- */
- void removeAtribute(final Object o) {
- getAttributeController().performRemoveAttribute(o.toString());
- }
-
- public void removeAttributesListener(final IAttributesListener l) {
- listenerList.remove(IAttributesListener.class, l);
- }
-
- public void removeChangeListener(final ChangeListener l) {
- listenerList.remove(ChangeListener.class, l);
- }
-
- /**
- */
- public void resetChanges() {
- if (isAttributeLayoutChanged == false) {
- return;
- }
- restrictionModel = Boolean.valueOf(isRestricted);
- for (int i = 0; i < elements.size(); i++) {
- final AttributeRegistryElement element = getElement(i);
- element.setVisibilityModel(Boolean.valueOf(element.isVisible()));
- element.setRestrictionModel(Boolean.valueOf(element.isRestricted()));
- }
- isAttributeLayoutChanged = false;
- }
-
- public void setAttributeLayoutChanged() {
- isAttributeLayoutChanged = true;
- }
-
- public void setAttributeViewType(final String attributeViewType) {
- this.attributeViewType = attributeViewType;
- fireStateChanged();
- }
-
- public void setFontSize(final int size) {
- if (fontSize != size) {
- fontSize = size;
- fireAttributeLayoutChanged();
- }
- }
-
- /**
- */
- public void setRestricted(final boolean b) {
- isRestricted = b;
- restrictionModel = Boolean.valueOf(isRestricted);
- fireAttributesChanged();
- }
-
- /**
- */
- private void setRestricted(final int row, final boolean b) {
- getElement(row).setRestriction(b);
- }
-
- public void setRestricted(final String s, final boolean b) {
- setRestricted(indexOf(s), b);
- }
-
- /**
- */
- public void setRestrictionModel(final int row, final Boolean value) {
- if (row == AttributeRegistry.GLOBAL) {
- restrictionModel = value;
- }
- else {
- getElement(row).setRestrictionModel(value);
- }
- setAttributeLayoutChanged();
- myTableModel.fireRestrictionsUpdated(row);
- }
-
- public void setVisibilityModel(final int row, final Boolean visible) {
- final AttributeRegistryElement element = getElement(row);
- if (!element.getVisibilityModel().equals(visible)) {
- element.setVisibilityModel(visible);
- setAttributeLayoutChanged();
- myTableModel.fireVisibilityUpdated(row);
- }
- }
-
- public int size() {
- return elements.size();
- }
-
- public void unregistry(final String name) {
- final int index = elements.indexOf(name);
- if (getElement(index).isVisible()) {
- decrementVisibleElementsNumber();
- }
- elements.remove(index);
- getTableModel().fireTableRowsDeleted(index, index);
- fireAttributesChanged();
- }
-
- /**
- * @throws IOException
- */
- public void write(final ITreeWriter writer) throws IOException {
- final XMLElement attributeRegistry = new XMLElement();
- boolean toBeSaved = false;
- if (isRestricted()) {
- attributeRegistry.setAttribute("RESTRICTED", "true");
- toBeSaved = true;
- }
- if (!attributeViewType.equals(AttributeTableLayoutModel.SHOW_ALL)) {
- attributeRegistry.setAttribute("SHOW_ATTRIBUTES", attributeViewType);
- toBeSaved = true;
- }
- if (getFontSize() != AttributeRegistry.TABLE_FONT_SIZE) {
- attributeRegistry.setAttribute("FONT_SIZE", Integer.toString(getFontSize()));
- toBeSaved = true;
- }
- for (int i = 0; i < size(); i++) {
- final AttributeRegistryElement element = getElement(i);
- if (element.isRestricted() || element.isVisible() || element.isManual()) {
- final XMLElement attributeData = element.save();
- attributeRegistry.addChild(attributeData);
- toBeSaved = true;
- }
- }
- if (toBeSaved) {
- attributeRegistry.setName(AttributeBuilder.XML_NODE_ATTRIBUTE_REGISTRY);
- writer.addElement(this, attributeRegistry);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/AttributeTableLayoutModel.java b/freeplane/src/org/freeplane/features/attribute/AttributeTableLayoutModel.java
deleted file mode 100644
index c1b24d3..0000000
--- a/freeplane/src/org/freeplane/features/attribute/AttributeTableLayoutModel.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import javax.swing.event.EventListenerList;
-
-import org.freeplane.core.resources.ResourceController;
-
-/**
- * @author Dimitry Polivaev
- */
-public class AttributeTableLayoutModel {
- public static final String HIDE_ALL = "hide";
- public static final String SHOW_ALL = "extended";
- public static final String SHOW_SELECTED = "selected";
- ColumnWidthChangeEvent[] layoutChangeEvent = { null, null };
- private EventListenerList listenerList = null;
- final private int[] width = {
- ResourceController.getResourceController().getIntProperty("default_attribute_key_column_width"),
- ResourceController.getResourceController().getIntProperty("default_attribute_value_column_width")
- };
-
- public AttributeTableLayoutModel() {
- super();
- }
-
- public void addColumnWidthChangeListener(final IColumnWidthChangeListener l) {
- getListenerList().add(IColumnWidthChangeListener.class, l);
- }
-
- protected void fireColumnWidthChanged(final int col) {
- final Object[] listeners = getListenerList().getListenerList();
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IColumnWidthChangeListener.class) {
- if (layoutChangeEvent[col] == null) {
- layoutChangeEvent[col] = new ColumnWidthChangeEvent(this, col);
- }
- ((IColumnWidthChangeListener) listeners[i + 1]).columnWidthChanged(layoutChangeEvent[col]);
- }
- }
- }
-
- public int getColumnWidth(final int col) {
- return width[col];
- }
-
- /**
- * @return Returns the listenerList.
- */
- private EventListenerList getListenerList() {
- if (listenerList == null) {
- listenerList = new EventListenerList();
- }
- return listenerList;
- }
-
- public void removeColumnWidthChangeListener(final IColumnWidthChangeListener l) {
- getListenerList().remove(IColumnWidthChangeListener.class, l);
- }
-
- public void setColumnWidth(final int col, final int width) {
- if (this.width[col] != width) {
- this.width[col] = width;
- fireColumnWidthChanged(col);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/IAttributeTableModel.java b/freeplane/src/org/freeplane/features/attribute/IAttributeTableModel.java
deleted file mode 100644
index 55bee2c..0000000
--- a/freeplane/src/org/freeplane/features/attribute/IAttributeTableModel.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- */
-public interface IAttributeTableModel {
- int getColumnWidth(int col);
-
- NodeModel getNode();
-
- int getRowCount();
-
- Object getValueAt(int row, int col);
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/NodeAttributeTableModel.java b/freeplane/src/org/freeplane/features/attribute/NodeAttributeTableModel.java
deleted file mode 100644
index eac4da5..0000000
--- a/freeplane/src/org/freeplane/features/attribute/NodeAttributeTableModel.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.event.TableModelEvent;
-import javax.swing.event.TableModelListener;
-import javax.swing.table.TableModel;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- */
-public class NodeAttributeTableModel implements IExtension, IAttributeTableModel, TableModel {
- private static final int CAPACITY_INCREMENT = 10;
- public static final NodeAttributeTableModel EMTPY_ATTRIBUTES = new NodeAttributeTableModel(null);
-
- public static NodeAttributeTableModel getModel(final NodeModel node) {
- final NodeAttributeTableModel attributes = (NodeAttributeTableModel) node
- .getExtension(NodeAttributeTableModel.class);
- return attributes != null ? attributes : NodeAttributeTableModel.EMTPY_ATTRIBUTES;
- }
-
- private Vector<Attribute> attributes;
- private AttributeTableLayoutModel layout;
- private HashSet<TableModelListener> listeners;
- final private NodeModel node;
-
- public NodeAttributeTableModel(final NodeModel node) {
- this(node, 0);
- }
-
- public NodeAttributeTableModel(final NodeModel node, final int size) {
- super();
- allocateAttributes(size);
- this.node = node;
- }
-
- public void addRowNoUndo(final Attribute newAttribute) {
- allocateAttributes(NodeAttributeTableModel.CAPACITY_INCREMENT);
- final int index = getRowCount();
- final AttributeRegistry registry = AttributeRegistry.getRegistry(node.getMap());
- registry.registry(newAttribute);
- attributes.add(newAttribute);
- fireTableRowsInserted(index, index);
- }
-
- public void addTableModelListener(final TableModelListener listener) {
- if (listeners == null) {
- listeners = new HashSet<TableModelListener>();
- }
- listeners.add(listener);
- }
-
- private void allocateAttributes(final int size) {
- if (attributes == null && size > 0) {
- attributes = new Vector<Attribute>(size, NodeAttributeTableModel.CAPACITY_INCREMENT);
- }
- }
-
- public void fireTableCellUpdated(final int row, final int column) {
- if (listeners == null) {
- return;
- }
- fireTableChanged(new TableModelEvent(this, row, row, column));
- }
-
- private void fireTableChanged(final TableModelEvent e) {
- if (listeners == null) {
- return;
- }
- final ArrayList<TableModelListener> arrayList = new ArrayList<TableModelListener>(listeners);
- for (final TableModelListener listener : arrayList) {
- listener.tableChanged(e);
- }
- }
-
- public void fireTableRowsDeleted(final int firstRow, final int lastRow) {
- if (listeners == null) {
- return;
- }
- fireTableChanged(new TableModelEvent(this, firstRow, lastRow, TableModelEvent.ALL_COLUMNS,
- TableModelEvent.DELETE));
- }
-
- public void fireTableRowsInserted(final int firstRow, final int lastRow) {
- if (listeners == null) {
- return;
- }
- fireTableChanged(new TableModelEvent(this, firstRow, lastRow, TableModelEvent.ALL_COLUMNS,
- TableModelEvent.INSERT));
- }
-
- public void fireTableRowsUpdated(final int firstRow, final int lastRow) {
- if (listeners == null) {
- return;
- }
- fireTableChanged(new TableModelEvent(this, firstRow, lastRow, TableModelEvent.ALL_COLUMNS,
- TableModelEvent.UPDATE));
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.modes.attributes.AttributeTableModel#get(int)
- */
- public Attribute getAttribute(final int row) {
- return attributes.get(row);
- }
-
- public List<String> getAttributeKeyList() {
- final Vector<String> returnValue = new Vector<String>();
- for (final Attribute attr : getAttributes()) {
- returnValue.add(attr.getName());
- }
- return returnValue;
- }
-
- public int getAttributePosition(final String pKey) {
- if (pKey == null) {
- return -1;
- }
- int pos = 0;
- for (final Attribute attr : getAttributes()) {
- if (pKey.equals(attr.getName())) {
- return pos;
- }
- pos++;
- }
- return -1;
- }
-
- /**
- * @return a list of Attribute elements.
- */
- public Vector<Attribute> getAttributes() {
- allocateAttributes(NodeAttributeTableModel.CAPACITY_INCREMENT);
- return attributes;
- }
-
- public int getAttributeTableLength() {
- return getRowCount();
- }
-
- public Class<Object> getColumnClass(final int col) {
- return Object.class;
- }
-
- /*
- * (non-Javadoc)
- * @see javax.swing.table.TableModel#getColumnCount()
- */
- public int getColumnCount() {
- return 2;
- }
-
- public String getColumnName(final int col) {
- return " ";
- }
-
- public int getColumnWidth(final int col) {
- return getLayout().getColumnWidth(col);
- }
-
- public AttributeTableLayoutModel getLayout() {
- if (layout == null) {
- layout = new AttributeTableLayoutModel();
- }
- return layout;
- }
-
- public Object getName(final int row) {
- final Attribute attr = attributes.get(row);
- return attr.getName();
- }
-
- public NodeModel getNode() {
- return node;
- }
-
- /*
- * (non-Javadoc)
- * @see javax.swing.table.TableModel#getRowCount()
- */
- public int getRowCount() {
- return attributes == null ? 0 : attributes.size();
- }
-
- public Object getValue(final int row) {
- final Attribute attr = attributes.get(row);
- return attr.getValue();
- }
-
- /*
- * (non-Javadoc)
- * @see javax.swing.table.TableModel#getValueAt(int, int)
- */
- public Object getValueAt(final int row, final int col) {
- if (attributes != null) {
- switch (col) {
- case 0:
- return getName(row);
- case 1:
- return getValue(row);
- }
- }
- return null;
- }
-
- public boolean isCellEditable(final int arg0, final int arg1) {
- return false;
- }
-
- public void removeTableModelListener(final TableModelListener listener) {
- if (listeners == null) {
- return;
- }
- listeners.remove(listener);
- }
-
- public void setName(final int row, final Object newName) {
- final Attribute attr = attributes.get(row);
- attr.setName(newName.toString());
- fireTableRowsUpdated(row, row);
- }
-
- public void setValue(final int row, final Object newValue) {
- final Attribute attr = attributes.get(row);
- attr.setValue(newValue);
- fireTableRowsUpdated(row, row);
- }
-
- public void setValueAt(final Object value, final int rowIndex, final int columnIndex) {
- switch (columnIndex) {
- case 0:
- setName(rowIndex, value);
- return;
- case 1:
- setValue(rowIndex, value);
- return;
- default:
- throw new ArrayIndexOutOfBoundsException(columnIndex + " >= 2");
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AddAttributeAction.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AddAttributeAction.java
deleted file mode 100644
index a2e5f5d..0000000
--- a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AddAttributeAction.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2010 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Stefan Ott in 2011.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute.mindmapmode;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.HierarchyEvent;
-import java.awt.event.HierarchyListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.util.Collection;
-import java.util.NoSuchElementException;
-
-import javax.swing.ComboBoxModel;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.border.EtchedBorder;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.core.ui.components.TypedListCellRenderer;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.AttributeRegistry;
-import org.freeplane.features.attribute.AttributeRegistryElement;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.attribute.mindmapmode.AssignAttributeDialog.ClonedComboBoxModel;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
- at EnabledAction(checkOnNodeChange = true)
-public class AddAttributeAction extends AFreeplaneAction {
- /**
- * @author Stefan Ott
- *
- * This action adds an attribute to all selected nodes
- */
- private static final long serialVersionUID = 1L;
- private JComboBox attributeNames = null;
- private JComboBox attributeValues = null;
- private final AttributeController attrContr = AttributeController.getController();
-
- public AddAttributeAction() {
- super("attributes_AddAttributeAction");
- };
-
- public void actionPerformed(final ActionEvent arg0) {
- final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
- final int selection = UITools.showConfirmDialog(Controller.getCurrentController().getSelection().getSelected(),
- getPanel(), TextUtils.getText("attributes_AddAttributeAction.text"),
- JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
- //OK button pressed
- if (selection == JOptionPane.OK_OPTION) {
- if (attributeNames.getSelectedItem() == null) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- final String name = attributeNames.getSelectedItem().toString();
- if (name.equals("")) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- final Object valueSelectedItem = attributeValues.getSelectedItem();
- final String value = valueSelectedItem != null ? valueSelectedItem.toString() : "";
- //Add attributes to nodes
- for (final NodeModel node : nodes) {
- final NodeAttributeTableModel attributes = attrContr.createAttributeTableModel(node);
- attrContr.performInsertRow(attributes, attributes.getRowCount(), name, value);
- }
- }
- }
-
- /**
- * This method creates the input dialog
- *
- * @return : the input dialog
- */
- private JPanel getPanel() {
- final JPanel panel = new JPanel();
- panel.setLayout(new GridBagLayout());
- panel.setBorder(new EtchedBorder());
- final GridBagConstraints gridBagConstraints = new GridBagConstraints();
- gridBagConstraints.gridx = 0;
- gridBagConstraints.gridy = 0;
- gridBagConstraints.anchor = GridBagConstraints.CENTER;
- gridBagConstraints.insets = new Insets(20, 10, 2, 10);
- // Size of JComboBoxes
- final String pattern = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
- final JLabel patternLabel = new JLabel(pattern);
- final Dimension comboBoxMaximumSize = patternLabel.getPreferredSize();
- comboBoxMaximumSize.width += 4;
- comboBoxMaximumSize.height += 10;
- //Label: name
- final JLabel nameLabel = new JLabel(TextUtils.getText("attribute_name"));
- panel.add(nameLabel, gridBagConstraints);
- gridBagConstraints.gridx++;
- //Label: value
- final JLabel valueLabel = new JLabel(TextUtils.getText("attribute_value"));
- panel.add(valueLabel, gridBagConstraints);
- gridBagConstraints.gridx = 0;
- gridBagConstraints.gridy++;
- //Attribute name combo-box
- gridBagConstraints.insets = new Insets(2, 10, 20, 10);
- attributeNames = new JComboBox();
- final MapModel map = Controller.getCurrentController().getMap();
- final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
- final ComboBoxModel names = attributes.getComboBoxModel();
- attributeNames.setModel(new ClonedComboBoxModel(names));
- attributeNames.setEditable(true);
- attributeNames.setMaximumSize(comboBoxMaximumSize);
- attributeNames.setPreferredSize(comboBoxMaximumSize);
- attributeNames.addItemListener(new ItemListener() {
- public void itemStateChanged(final ItemEvent e) {
- selectedAttributeChanged(e.getItem(), attributeValues);
- }
- });
- panel.add(attributeNames, gridBagConstraints);
- //Attribute value combo-box
- attributeValues = new JComboBox();
- attributeValues.setRenderer(new TypedListCellRenderer());
- attributeValues.setMaximumSize(comboBoxMaximumSize);
- attributeValues.setPreferredSize(comboBoxMaximumSize);
- gridBagConstraints.gridx++;
- panel.add(attributeValues, gridBagConstraints);
- //set focus to attributeNames
- panel.addHierarchyListener(new HierarchyListener() {
- public void hierarchyChanged(HierarchyEvent e) {
- final Component component = e.getComponent();
- if(component.isShowing()){
- attributeNames.requestFocus();
- component.removeHierarchyListener(this);
- }
- }
- });
- return panel;
- }
-
- protected void selectedAttributeChanged(final Object selectedAttributeName, final JComboBox values) {
- final MapModel map = Controller.getCurrentController().getMap();
- final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
- try {
- final AttributeRegistryElement element = attributes.getElement(selectedAttributeName.toString());
- final ComboBoxModel selectedValues = element.getValues();
- values.setModel(new ClonedComboBoxModel(selectedValues));
- try {
- final Object firstValue = selectedValues.getElementAt(0);
- values.setSelectedItem(firstValue);
- }
- catch (final ArrayIndexOutOfBoundsException ex) {
- }
- values.setEditable(!element.isRestricted());
- }
- catch (final NoSuchElementException ex) {
- values.setEditable(!selectedAttributeName.toString().equals(""));
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AssignAttributeDialog.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AssignAttributeDialog.java
deleted file mode 100644
index 3f69e91..0000000
--- a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AssignAttributeDialog.java
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.Frame;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import javax.swing.AbstractListModel;
-import javax.swing.Box;
-import javax.swing.ButtonGroup;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JRadioButton;
-import javax.swing.border.Border;
-import javax.swing.border.CompoundBorder;
-import javax.swing.border.EmptyBorder;
-import javax.swing.border.EtchedBorder;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ListDataListener;
-
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.TypedListCellRenderer;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.attribute.Attribute;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.AttributeRegistry;
-import org.freeplane.features.attribute.AttributeRegistryElement;
-import org.freeplane.features.attribute.IAttributesListener;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-class AssignAttributeDialog extends JDialog implements IAttributesListener, IMapSelectionListener {
- private class AddAction extends IteratingAction {
- private String name;
- private String value;
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- if (attributeNames.getSelectedItem() == null) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- name = attributeNames.getSelectedItem().toString();
- if (name.equals("")) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- final Object valueSelectedItem = attributeValues.getSelectedItem();
- value = valueSelectedItem != null ? valueSelectedItem.toString() : "";
- super.actionPerformed(e);
- if (valueSelectedItem == null) {
- selectedAttributeChanged(name, attributeValues);
- }
- }
-
- @Override
- protected void performAction(final NodeModel model) {
- attributeController.createAttributeTableModel(model);
- final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(model);
- attributeController.performInsertRow(attributes, attributes.getRowCount(), name, value);
- }
- }
-
- protected static class ClonedComboBoxModel extends AbstractListModel implements ComboBoxModel {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Object selectedItem;
- final private AbstractListModel sharedListModel;
-
- public ClonedComboBoxModel(final ComboBoxModel sharedListModel) {
- super();
- this.sharedListModel = (AbstractListModel) sharedListModel;
- }
-
- @Override
- public void addListDataListener(final ListDataListener l) {
- super.addListDataListener(l);
- sharedListModel.addListDataListener(l);
- }
-
- public Object getElementAt(final int index) {
- return sharedListModel.getElementAt(index);
- }
-
- public Object getSelectedItem() {
- return selectedItem;
- }
-
- public int getSize() {
- return sharedListModel.getSize();
- }
-
- @Override
- public void removeListDataListener(final ListDataListener l) {
- super.removeListDataListener(l);
- sharedListModel.removeListDataListener(l);
- }
-
- public void setSelectedItem(final Object anItem) {
- selectedItem = anItem;
- fireContentsChanged(this, -1, -1);
- }
- }
-
- private class DeleteAttributeAction extends IteratingAction {
- private String name;
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- final Object selectedItem = attributeNames.getSelectedItem();
- if (selectedItem == null) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- name = selectedItem.toString();
- if (name.equals("")) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- super.actionPerformed(e);
- }
-
- @Override
- protected void performAction(final NodeModel model) {
- final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(model);
- for (int i = attributes.getRowCount() - 1; i >= 0; i--) {
- if (attributes.getAttribute(i).getName().equals(name)) {
- attributeController.performRemoveRow(attributes, i);
- }
- }
- }
- }
-
- private class DeleteValueAction extends IteratingAction {
- private String name;
- private String value;
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- if (attributeNames.getSelectedItem() == null) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- name = attributeNames.getSelectedItem().toString();
- if (name.equals("")) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- final Object valueSelectedItem = attributeValues.getSelectedItem();
- value = valueSelectedItem != null ? valueSelectedItem.toString() : "";
- super.actionPerformed(e);
- }
-
- @Override
- protected void performAction(final NodeModel model) {
- final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(model);
- for (int i = attributes.getRowCount() - 1; i >= 0; i--) {
- final Attribute attribute = attributes.getAttribute(i);
- if (attribute.getName().equals(name) && attribute.getValue().equals(value)) {
- attributeController.performRemoveRow(attributes, i);
- }
- }
- }
- }
-
- private abstract class IteratingAction implements ActionListener {
- public void actionPerformed(final ActionEvent e) {
- try {
- if (selectedBtn.getModel().isSelected()) {
- final Collection<NodeModel> selecteds = mapSelection.getSelection();
- final Iterator<NodeModel> iterator = selecteds.iterator();
- while (iterator.hasNext()) {
- final NodeModel selectedNodeView = iterator.next();
- performAction(selectedNodeView);
- }
- return;
- }
- final NodeModel nodeView = Controller.getCurrentController().getMap().getRootNode();
- iterate(nodeView);
- }
- catch (final NullPointerException ex) {
- }
- }
-
- private void iterate(final NodeModel node) {
- if (node.isVisible()) {
- if (!node.isRoot() || !skipRootBtn.isSelected()) {
- performAction(node);
- }
- }
- if (node.isFolded()) {
- return;
- }
- final Iterator<NodeModel> iterator = node.getChildren().iterator();
- while (iterator.hasNext()) {
- iterate(iterator.next());
- }
- }
-
- abstract protected void performAction(NodeModel model);
-
- }
-
- private class ReplaceValueAction extends IteratingAction {
- private String name;
- private String replacingName;
- private String replacingValue;
- private String value;
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- if (attributeNames.getSelectedItem() == null) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- if (replacingAttributeNames.getSelectedItem() == null) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- name = attributeNames.getSelectedItem().toString();
- if (name.equals("")) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- replacingName = replacingAttributeNames.getSelectedItem().toString();
- if (replacingName.equals("")) {
- UITools.showAttributeEmptyStringErrorMessage();
- return;
- }
- final Object valueSelectedItem = attributeValues.getSelectedItem();
- value = valueSelectedItem != null ? valueSelectedItem.toString() : "";
- final Object replacingValueSelectedItem = replacingAttributeValues.getSelectedItem();
- replacingValue = replacingValueSelectedItem != null ? replacingValueSelectedItem.toString() : "";
- super.actionPerformed(e);
- }
-
- @Override
- protected void performAction(final NodeModel model) {
- final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(model);
- for (int i = attributes.getRowCount() - 1; i >= 0; i--) {
- final Attribute attribute = attributes.getAttribute(i);
- if (attribute.getName().equals(name) && attribute.getValue().equals(value)) {
- attributeController.performRemoveRow(attributes, i);
- attributeController.performInsertRow(attributes, i, replacingName, replacingValue);
- }
- }
- }
- }
-
- private static final Dimension maxButtonDimension = new Dimension(1000, 1000);
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private AttributeController attributeController;
- final private JComboBox attributeNames;
- final private JComboBox attributeValues;
- private IMapSelection mapSelection;
- final private JComboBox replacingAttributeNames;
- final private JComboBox replacingAttributeValues;
- final private JRadioButton selectedBtn;
- final private JCheckBox skipRootBtn;
- final private JRadioButton visibleBtn;
-
- public AssignAttributeDialog(final AttributeController attributeController, final Frame frame) {
- super(frame, TextUtils.getText("attributes_assign_dialog"), false);
- this.attributeController = attributeController;
- mapSelection = Controller.getCurrentController().getSelection();
- final Border actionBorder = new CompoundBorder(new EmptyBorder(5, 10, 0, 10), new CompoundBorder(
- new EtchedBorder(), new EmptyBorder(5, 5, 5, 5)));
- final Border emptyBorder = new EmptyBorder(5, 5, 5, 5);
- final Border btnBorder = new EmptyBorder(2, 2, 2, 2);
- selectedBtn = new JRadioButton();
- MenuBuilder.setLabelAndMnemonic(selectedBtn, TextUtils.getRawText("attributes_for_selected"));
- selectedBtn.setSelected(true);
- visibleBtn = new JRadioButton();
- MenuBuilder.setLabelAndMnemonic(visibleBtn, TextUtils.getRawText("attributes_for_visible"));
- final ButtonGroup group = new ButtonGroup();
- group.add(selectedBtn);
- group.add(visibleBtn);
- skipRootBtn = new JCheckBox();
- MenuBuilder.setLabelAndMnemonic(skipRootBtn, TextUtils.getRawText("attributes_skip_root"));
- skipRootBtn.setSelected(true);
- final Box selectionBox = Box.createHorizontalBox();
- selectionBox.setBorder(emptyBorder);
- selectionBox.add(Box.createHorizontalGlue());
- selectionBox.add(selectedBtn);
- selectionBox.add(Box.createHorizontalGlue());
- selectionBox.add(visibleBtn);
- selectionBox.add(Box.createHorizontalGlue());
- selectionBox.add(skipRootBtn);
- selectionBox.add(Box.createHorizontalGlue());
- getContentPane().add(selectionBox, BorderLayout.NORTH);
- final JButton addBtn = new JButton();
- MenuBuilder.setLabelAndMnemonic(addBtn, TextUtils.getRawText("filter_add"));
- addBtn.addActionListener(new AddAction());
- addBtn.setMaximumSize(AssignAttributeDialog.maxButtonDimension);
- final JButton deleteAttributeBtn = new JButton();
- MenuBuilder.setLabelAndMnemonic(deleteAttributeBtn, TextUtils.getRawText("attribute_delete"));
- deleteAttributeBtn.addActionListener(new DeleteAttributeAction());
- deleteAttributeBtn.setMaximumSize(AssignAttributeDialog.maxButtonDimension);
- final JButton deleteAttributeValueBtn = new JButton();
- MenuBuilder.setLabelAndMnemonic(deleteAttributeValueBtn, TextUtils.getRawText("attribute_delete_value"));
- deleteAttributeValueBtn.addActionListener(new DeleteValueAction());
- deleteAttributeValueBtn.setMaximumSize(AssignAttributeDialog.maxButtonDimension);
- final JButton replaceBtn = new JButton();
- MenuBuilder.setLabelAndMnemonic(replaceBtn, TextUtils.getRawText("attribute_replace"));
- replaceBtn.addActionListener(new ReplaceValueAction());
- replaceBtn.setMaximumSize(AssignAttributeDialog.maxButtonDimension);
- UITools.addEscapeActionToDialog(this);
- // Size of JComboBoxes (30 chars)
- final String pattern = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
- final JLabel patternLabel = new JLabel(pattern);
- final Dimension comboBoxMaximumSize = patternLabel.getPreferredSize();
- comboBoxMaximumSize.width += 4;
- comboBoxMaximumSize.height += 10;
- attributeNames = new JComboBox();
- attributeNames.setMaximumSize(comboBoxMaximumSize);
- attributeNames.setPreferredSize(comboBoxMaximumSize);
- attributeNames.addItemListener(new ItemListener() {
- public void itemStateChanged(final ItemEvent e) {
- selectedAttributeChanged(e.getItem(), attributeValues);
- }
- });
- attributeValues = new JComboBox();
- attributeValues.setRenderer(new TypedListCellRenderer());
- attributeValues.setMaximumSize(comboBoxMaximumSize);
- attributeValues.setPreferredSize(comboBoxMaximumSize);
- replacingAttributeNames = new JComboBox();
- replacingAttributeNames.setMaximumSize(comboBoxMaximumSize);
- replacingAttributeNames.setPreferredSize(comboBoxMaximumSize);
- replacingAttributeNames.addItemListener(new ItemListener() {
- public void itemStateChanged(final ItemEvent e) {
- selectedAttributeChanged(e.getItem(), replacingAttributeValues);
- }
- });
- replacingAttributeValues = new JComboBox();
- replacingAttributeValues.setRenderer(new TypedListCellRenderer());
- replacingAttributeValues.setMaximumSize(comboBoxMaximumSize);
- replacingAttributeValues.setPreferredSize(comboBoxMaximumSize);
- final Box addDeleteBtnBox = Box.createVerticalBox();
- addDeleteBtnBox.setBorder(btnBorder);
- addDeleteBtnBox.add(Box.createVerticalGlue());
- addDeleteBtnBox.add(addBtn);
- addDeleteBtnBox.add(deleteAttributeBtn);
- addDeleteBtnBox.add(deleteAttributeValueBtn);
- addDeleteBtnBox.add(Box.createVerticalGlue());
- final Box addDeleteBox = Box.createHorizontalBox();
- addDeleteBox.setBorder(actionBorder);
- addDeleteBox.add(Box.createHorizontalGlue());
- addDeleteBox.add(addDeleteBtnBox);
- addDeleteBox.add(Box.createHorizontalStrut(5));
- addDeleteBox.add(attributeNames);
- addDeleteBox.add(Box.createHorizontalStrut(5));
- addDeleteBox.add(attributeValues);
- addDeleteBox.add(Box.createHorizontalStrut(5));
- final Box outerReplaceBox = Box.createVerticalBox();
- outerReplaceBox.setBorder(actionBorder);
- final Box replaceBox = Box.createHorizontalBox();
- replaceBox.setBorder(btnBorder);
- replaceBox.add(Box.createHorizontalGlue());
- replaceBox.add(replaceBtn);
- replaceBox.add(Box.createHorizontalStrut(5));
- replaceBox.add(replacingAttributeNames);
- replaceBox.add(Box.createHorizontalStrut(5));
- replaceBox.add(replacingAttributeValues);
- replaceBox.add(Box.createHorizontalStrut(5));
- outerReplaceBox.add(Box.createVerticalGlue());
- outerReplaceBox.add(replaceBox);
- outerReplaceBox.add(Box.createVerticalGlue());
- final Box actionBox = Box.createVerticalBox();
- actionBox.add(Box.createVerticalGlue());
- actionBox.add(addDeleteBox);
- actionBox.add(Box.createVerticalStrut(5));
- actionBox.add(outerReplaceBox);
- actionBox.add(Box.createVerticalGlue());
- getContentPane().add(actionBox, BorderLayout.CENTER);
- final JButton closeBtn = new JButton();
- MenuBuilder.setLabelAndMnemonic(closeBtn, TextUtils.getRawText("simplyhtml.closeBtnName"));
- closeBtn.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- dispose();
- }
- });
- final Box bottomBox = Box.createHorizontalBox();
- bottomBox.setBorder(emptyBorder);
- bottomBox.add(Box.createHorizontalGlue());
- bottomBox.add(closeBtn);
- bottomBox.add(Box.createHorizontalGlue());
- getContentPane().add(bottomBox, BorderLayout.SOUTH);
- pack();
- comboBoxMaximumSize.width = 1000;
- attributeNames.setMaximumSize(comboBoxMaximumSize);
- attributeValues.setMaximumSize(comboBoxMaximumSize);
- replacingAttributeNames.setMaximumSize(comboBoxMaximumSize);
- replacingAttributeValues.setMaximumSize(comboBoxMaximumSize);
- afterMapChange(null, Controller.getCurrentController().getMap());
- Controller.getCurrentController().getMapViewManager().addMapSelectionListener(this);
- }
-
- public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
- if (oldMap != null) {
- final AttributeRegistry attributes = AttributeRegistry.getRegistry(oldMap);
- if (attributes != null) {
- attributes.removeAttributesListener(this);
- }
- }
- if (newMap == null) {
- setVisible(false);
- return;
- }
- mapSelection = Controller.getCurrentController().getSelection();
- final AttributeRegistry attributes = AttributeRegistry.getRegistry(newMap);
- if (attributes == null) {
- setVisible(false);
- return;
- }
- attributes.addAttributesListener(this);
- attributesChanged();
- }
-
- private void attributesChanged() {
- final MapModel map = Controller.getCurrentController().getMap();
- final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
- final ComboBoxModel names = attributes.getComboBoxModel();
- attributeNames.setModel(new ClonedComboBoxModel(names));
- attributeNames.setEditable(!attributes.isRestricted());
- replacingAttributeNames.setModel(new ClonedComboBoxModel(names));
- replacingAttributeNames.setEditable(!attributes.isRestricted());
- if (attributes.size() > 0) {
- final Object first = names.getElementAt(0);
- attributeNames.setSelectedItem(first);
- replacingAttributeNames.setSelectedItem(first);
- selectedAttributeChanged(attributeNames.getSelectedItem(), attributeValues);
- selectedAttributeChanged(replacingAttributeNames.getSelectedItem(), replacingAttributeValues);
- }
- else {
- attributeValues.setModel(new DefaultComboBoxModel());
- attributeValues.setEditable(false);
- replacingAttributeValues.setModel(new DefaultComboBoxModel());
- replacingAttributeValues.setEditable(false);
- }
- }
-
- public void attributesChanged(final ChangeEvent e) {
- attributesChanged();
- }
-
- public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
- }
-
- private void selectedAttributeChanged(final Object selectedAttributeName, final JComboBox values) {
- final MapModel map = Controller.getCurrentController().getMap();
- final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
- try {
- final AttributeRegistryElement element = attributes.getElement(selectedAttributeName.toString());
- final ComboBoxModel selectedValues = element.getValues();
- values.setModel(new ClonedComboBoxModel(selectedValues));
- try {
- final Object firstValue = selectedValues.getElementAt(0);
- values.setSelectedItem(firstValue);
- }
- catch (final ArrayIndexOutOfBoundsException ex) {
- }
- values.setEditable(!element.isRestricted());
- }
- catch (final NoSuchElementException ex) {
- values.setEditable(!selectedAttributeName.toString().equals(""));
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AssignAttributesAction.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AssignAttributesAction.java
deleted file mode 100644
index efe7bf5..0000000
--- a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AssignAttributesAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.mode.Controller;
-
-class AssignAttributesAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private AssignAttributeDialog assignAttributeDialog;
-
- public AssignAttributesAction() {
- super("AssignAttributesAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final Controller controller = Controller.getCurrentController();
- if (assignAttributeDialog == null) {
- assignAttributeDialog = new AssignAttributeDialog(AttributeController.getController(),
- controller.getViewController().getFrame());
- }
- assignAttributeDialog.setVisible(true);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeManagerDialog.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeManagerDialog.java
deleted file mode 100644
index 612070b..0000000
--- a/freeplane/src/org/freeplane/features/attribute/mindmapmode/AttributeManagerDialog.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Frame;
-import java.awt.event.ActionEvent;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-
-import javax.swing.AbstractAction;
-import javax.swing.Box;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-import javax.swing.WindowConstants;
-import javax.swing.border.EmptyBorder;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.collection.IListModel;
-import org.freeplane.features.attribute.AttributeRegistry;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-/**
- * @author Dimitry Polivaev
- */
-public class AttributeManagerDialog extends JDialog implements IMapSelectionListener {
- private class ApplyAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- ApplyAction() {
- super("ApplyAction");
- }
-
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- public void actionPerformed(final ActionEvent e) {
- applyChanges();
- Controller.getCurrentModeController().startTransaction();
- }
- }
-
- private class CancelAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- CancelAction() {
- super("CancelAction");
- }
-
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- public void actionPerformed(final ActionEvent e) {
- resetChanges();
- AttributeManagerDialog.this.setVisible(false);
- }
- }
-
- private class ClosingListener extends WindowAdapter {
- @Override
- public void windowClosing(final WindowEvent e) {
- resetChanges();
- super.windowClosing(e);
- setVisible(false);
- }
- }
-
- class EditListAction extends AbstractAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String labelText;
- private IListModel listBoxModel;
- private int row = 0;
- private String title;
-
- public EditListAction() {
- super(null, AttributeManagerDialog.editButtonImage);
- }
-
- public void actionPerformed(final ActionEvent e) {
- ListDialog.showDialog((Component) e.getSource(), AttributeManagerDialog.this, labelText, title,
- listBoxModel, "xxxxxxxxxxxxxxxxxxxxx");
- }
-
- public int getRow() {
- return row;
- }
-
- public void setListBoxModel(final String title, final String labelText, final IListModel listBoxModel) {
- this.title = title;
- this.labelText = labelText;
- this.listBoxModel = listBoxModel;
- }
-
- public void setRow(final int row) {
- this.row = row;
- }
- }
-
- private class ImportAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- ImportAction() {
- super("ImportAction");
- }
-
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- public void actionPerformed(final ActionEvent e) {
- if (importDialog == null) {
- importDialog = new ImportAttributesDialog(AttributeManagerDialog.this);
- }
- importDialog.show();
- }
- }
-
- private class OKAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- OKAction() {
- super("OKAction");
- }
-
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- public void actionPerformed(final ActionEvent e) {
- applyChanges();
- AttributeManagerDialog.this.setVisible(false);
- }
- }
-
- static final Icon editButtonImage = new ImageIcon(ResourceController.getResourceController().getResource(
- "/images/edit12.png"));
- private static final String[] fontSizes = { "6", "8", "10", "12", "14", "16", "18", "20", "24" };
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-// // final private Controller controller;
- private ImportAttributesDialog importDialog = null;
- private AttributeRegistry model;
- final private JComboBox size;
- final private JTable view;
-
- public AttributeManagerDialog( final Frame frame) {
- super(frame, TextUtils.getText("attributes_dialog_title"), true);
- Controller controller = Controller.getCurrentController();
-// this.controller = controller;
- view = new AttributeRegistryTable(new EditListAction());
- model = AttributeRegistry.getRegistry(controller.getMap());
- view.setModel(model.getTableModel());
- view.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- view.getTableHeader().setReorderingAllowed(false);
- final JScrollPane scrollPane = new JScrollPane(view);
- getContentPane().add(scrollPane, BorderLayout.CENTER);
- final Box southButtons = Box.createHorizontalBox();
- southButtons.setBorder(new EmptyBorder(5, 5, 5, 5));
- getContentPane().add(southButtons, BorderLayout.SOUTH);
- southButtons.add(Box.createHorizontalGlue());
- final JButton ok = new JButton(new OKAction());
- southButtons.add(ok);
- southButtons.add(Box.createHorizontalGlue());
- final JButton apply = new JButton(new ApplyAction());
- southButtons.add(apply);
- southButtons.add(Box.createHorizontalGlue());
- final JButton cancel = new JButton(new CancelAction());
- southButtons.add(cancel);
- southButtons.add(Box.createHorizontalGlue());
- size = new JComboBox(AttributeManagerDialog.fontSizes);
- size.addItemListener(new ItemListener() {
- public void itemStateChanged(final ItemEvent e) {
- model.setAttributeLayoutChanged();
- }
- });
- size.setToolTipText(TextUtils.getText("attribute_font_size_tooltip"));
- southButtons.add(size);
- southButtons.add(Box.createHorizontalGlue());
- final JButton importBtn = new JButton(new ImportAction());
- importBtn.setToolTipText(TextUtils.getText("attributes_import_tooltip"));
- southButtons.add(importBtn);
- southButtons.add(Box.createHorizontalGlue());
- UITools.addEscapeActionToDialog(this);
- setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- addWindowListener(new ClosingListener());
- controller.getMapViewManager().addMapSelectionListener(this);
- addComponentListener(new ComponentAdapter() {
- @Override
- public void componentShown(final ComponentEvent e) {
- size.setSelectedItem(Integer.toString(model.getFontSize()));
- }
- });
- }
-
- public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
- if (newMap != null) {
- model = AttributeRegistry.getRegistry(newMap);
- if (model != null) {
- view.setModel(model.getTableModel());
- }
- else {
- setVisible(false);
- }
- }
- }
-
- private void applyChanges() {
- final Object size = this.size.getSelectedItem();
- final int iSize = Integer.parseInt(size.toString());
- model.getAttributeController().performSetFontSize(model, iSize);
- model.applyChanges();
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- modeController.delayedCommit();
- final MapController mapController = modeController.getMapController();
- final MapModel map = Controller.getCurrentController().getMap();
- assert(AttributeRegistry.getRegistry(map) == model);
- mapController.setSaved(map, false);
- }
-
- public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
- }
-
- private void resetChanges() {
- final int iSize = model.getFontSize();
- size.setSelectedItem(Integer.toString(iSize));
- model.resetChanges();
- Controller.getCurrentModeController().rollback();
- }
-
- @Override
- public void show() {
- Controller.getCurrentModeController().startTransaction();
- super.show();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/CopyAttributes.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/CopyAttributes.java
deleted file mode 100644
index 2591ddb..0000000
--- a/freeplane/src/org/freeplane/features/attribute/mindmapmode/CopyAttributes.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.attribute.Attribute;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyleModel;
-
- at EnabledAction(checkOnNodeChange=true)
-class CopyAttributes extends AFreeplaneAction {
- private static Object[] attributes = null;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public static Object[] getAttributes() {
- return attributes;
- }
-
- public CopyAttributes() {
- super("CopyAttributes");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
- copyAttributes(node);
- }
-
- /**
- */
- private void copyAttributes(final NodeModel node) {
- final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(node);
- if(model == null){
- attributes = null;
- return;
- }
- final int attributeTableLength = model.getAttributeTableLength();
- attributes = new Object[attributeTableLength * 2];
- for(int i = 0; i < attributeTableLength; i++){
- final Attribute attribute = model.getAttribute(i);
- attributes[2 * i] = attribute.getName();
- attributes[2 * i+1] = attribute.getValue();
- }
- }
- @Override
- public void setEnabled() {
- final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
- if(node != null){
- final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(node);
- setEnabled(model != null && model.getAttributeTableLength() > 0);
- }
- else
- setEnabled(false);
- }
-}
-
- at EnabledAction(checkOnNodeChange = true)
-class PasteAttributes extends AMultipleNodeAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public PasteAttributes() {
- super("PasteAttributes");
- }
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- pasteAttributes(node);
- }
-
- /**
- */
- private void pasteAttributes(final NodeModel node) {
- Object[] attributes = CopyAttributes.getAttributes();
- if (attributes == null) {
- JOptionPane.showMessageDialog(Controller.getCurrentController().getViewController().getContentPane(), TextUtils
- .getText("no_copy_attributes_before_paste_attributes"), "" /*=Title*/, JOptionPane.ERROR_MESSAGE);
- return;
- }
- final MAttributeController controller = MAttributeController.getController();
- for(int i = 0; i < attributes.length;){
- final String name = attributes[i++].toString();
- final Object value = attributes[i++];
- controller.addAttribute(node, new Attribute(name, value));
- }
- }
-
- @Override
- public void setEnabled() {
- setEnabled(CopyAttributes.getAttributes() != null);
- }
-}
-
- at EnabledAction(checkOnNodeChange = true)
-class AddStyleAttributes extends AMultipleNodeAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public AddStyleAttributes() {
- super("AddStyleAttributes");
- }
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- pasteAttributes(node);
- }
-
- /**
- */
- private void pasteAttributes(final NodeModel node) {
- final NodeModel model = getAttributes(node);
- if(model == null){
- return;
- }
- final MAttributeController controller = MAttributeController.getController();
- controller.copyAttributesToNode(model, node);
- }
-
- private NodeModel getAttributes(final NodeModel node) {
- final IStyle style = LogicalStyleController.getController().getFirstStyle(node);
- final MapStyleModel extension = MapStyleModel.getExtension(node.getMap());
- final NodeModel styleNode = extension.getStyleNode(style);
- return styleNode;
- }
-
- @Override
- public void setEnabled() {
- for (final NodeModel selected : Controller.getCurrentModeController().getMapController().getSelectedNodes()) {
- if(getAttributes(selected) != null){
- setEnabled(true);
- return;
- }
- }
- setEnabled(false);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/ImportAttributesDialog.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/ImportAttributesDialog.java
deleted file mode 100644
index a394537..0000000
--- a/freeplane/src/org/freeplane/features/attribute/mindmapmode/ImportAttributesDialog.java
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Iterator;
-import java.util.Map.Entry;
-
-import javax.swing.Box;
-import javax.swing.Icon;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.JTree;
-import javax.swing.border.EmptyBorder;
-import javax.swing.event.TreeSelectionEvent;
-import javax.swing.event.TreeSelectionListener;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.DefaultTreeModel;
-import javax.swing.tree.TreeNode;
-import javax.swing.tree.TreeSelectionModel;
-
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.collection.SortedComboBoxModel;
-import org.freeplane.features.attribute.AttributeRegistry;
-import org.freeplane.features.attribute.AttributeRegistryElement;
-import org.freeplane.features.icon.IconStore;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.IMapViewManager;
-
-class ImportAttributesDialog extends JDialog implements TreeSelectionListener {
- private static final IconStore STORE = IconStoreFactory.create();
-
- static private class AttributeTreeNodeInfo extends TreeNodeInfo {
- final private boolean restricted;
-
- public AttributeTreeNodeInfo(final String info, final boolean restricted) {
- super(info);
- this.restricted = restricted;
- }
-
- boolean isRestricted() {
- return restricted;
- }
- }
-
- static private class MyRenderer extends DefaultTreeCellRenderer {
- static final Icon iconFull = STORE.getUIIcon("ok_button.png").getIcon();
- static final Icon iconNotSelected = STORE.getUIIcon("cancel_button.png").getIcon();
- static final Icon iconPartial = STORE.getUIIcon("forward.png").getIcon();
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public MyRenderer() {
- }
-
- @Override
- public Component getTreeCellRendererComponent(final JTree tree, final Object value, final boolean sel,
- final boolean expanded, final boolean leaf, final int row,
- final boolean hasFocus) {
- super.getTreeCellRendererComponent(tree, value, false, expanded, leaf, row, false);
- final DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
- final TreeNodeInfo info = (TreeNodeInfo) node.getUserObject();
- switch (info.getSelected()) {
- case TreeNodeInfo.FULL_SELECTED:
- setIcon(MyRenderer.iconFull);
- break;
- case TreeNodeInfo.PARTIAL_SELECTED:
- setIcon(MyRenderer.iconPartial);
- break;
- case TreeNodeInfo.NOT_SELECTED:
- setIcon(MyRenderer.iconNotSelected);
- break;
- }
- return this;
- }
- }
-
- static private class TreeNodeInfo {
- static final private int FULL_SELECTED = 0;
- static final private int NOT_SELECTED = 2;
- static final private int PARTIAL_SELECTED = 1;
- final private String info;
- private int selected;
-
- public TreeNodeInfo(final String info) {
- this.info = info;
- selected = TreeNodeInfo.NOT_SELECTED;
- }
-
- String getInfo() {
- return info;
- }
-
- int getSelected() {
- return selected;
- }
-
- void setSelected(final int selected) {
- this.selected = selected;
- }
-
- @Override
- public String toString() {
- return info;
- }
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-// // final private Controller controller;
- private AttributeRegistry currentAttributes;
- final private Component parentComponent;
- MyRenderer renderer = null;
- final private JScrollPane scrollPane;
- final private DefaultMutableTreeNode topNode;
- final private JTree tree;
- final private DefaultTreeModel treeModel;
-
- public ImportAttributesDialog( final Component parentComponent) {
- super(Controller.getCurrentController().getViewController().getFrame(), TextUtils
- .getText("attributes_import"), true);
-// this.controller = controller;
- this.parentComponent = parentComponent;
- final TreeNodeInfo nodeInfo = new TreeNodeInfo(TextUtils.getText("attribute_top"));
- topNode = new DefaultMutableTreeNode(nodeInfo);
- treeModel = new DefaultTreeModel(topNode);
- tree = new JTree(treeModel);
- tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
- tree.addTreeSelectionListener(this);
- scrollPane = new JScrollPane();
- scrollPane.setViewportView(tree);
- scrollPane.setPreferredSize(new Dimension(600, 300));
- getContentPane().add(scrollPane, BorderLayout.CENTER);
- final Box buttons = Box.createHorizontalBox();
- buttons.setBorder(new EmptyBorder(5, 5, 5, 5));
- final JButton okBtn = new JButton();
- MenuBuilder.setLabelAndMnemonic(okBtn, TextUtils.getRawText("ok"));
- okBtn.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- performImport(topNode);
- dispose();
- }
- });
- final JButton cancelBtn = new JButton();
- MenuBuilder.setLabelAndMnemonic(cancelBtn, TextUtils.getRawText("cancel"));
- cancelBtn.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- dispose();
- }
- });
- buttons.add(Box.createHorizontalGlue());
- buttons.add(okBtn);
- buttons.add(Box.createHorizontalGlue());
- buttons.add(cancelBtn);
- buttons.add(Box.createHorizontalGlue());
- getContentPane().add(buttons, BorderLayout.SOUTH);
- UITools.addEscapeActionToDialog(this);
- }
-
- private void createAttributeSubTrees(final DefaultMutableTreeNode mapInfo, final AttributeRegistry attributes) {
- if (attributes == null) {
- return;
- }
- for (int i = 0; i < attributes.size(); i++) {
- final AttributeRegistryElement element = attributes.getElement(i);
- final TreeNodeInfo treeNodeInfo = new AttributeTreeNodeInfo(element.getKey().toString(), element
- .isRestricted());
- final DefaultMutableTreeNode attributeInfo = new DefaultMutableTreeNode(treeNodeInfo);
- createValueSubTrees(attributeInfo, element, currentAttributes);
- if (attributeInfo.getChildCount() != 0) {
- mapInfo.add(attributeInfo);
- }
- }
- }
-
- private void createMapSubTrees(final DefaultMutableTreeNode top) {
- top.removeAllChildren();
- final TreeNodeInfo topInfo = (TreeNodeInfo) top.getUserObject();
- topInfo.setSelected(TreeNodeInfo.NOT_SELECTED);
- Controller controller = Controller.getCurrentController();
- final IMapViewManager mapViewManager = controller.getMapViewManager();
- final MapModel currentMap = controller.getMap();
- currentAttributes = AttributeRegistry.getRegistry(currentMap);
- final Iterator<Entry<String, MapModel>> iterator = mapViewManager.getMaps().entrySet().iterator();
- while (iterator.hasNext()) {
- final Entry<String, MapModel> entry = iterator.next();
- final String nextmapName = entry.getKey();
- final MapModel nextMap = entry.getValue();
- if (nextMap == currentMap) {
- continue;
- }
- final TreeNodeInfo treeNodeInfo = new TreeNodeInfo(nextmapName);
- final DefaultMutableTreeNode mapInfo = new DefaultMutableTreeNode(treeNodeInfo);
- createAttributeSubTrees(mapInfo, AttributeRegistry.getRegistry(nextMap));
- if (mapInfo.getChildCount() != 0) {
- top.add(mapInfo);
- }
- }
- }
-
- private void createValueSubTrees(final DefaultMutableTreeNode attributeInfo,
- final AttributeRegistryElement element, final AttributeRegistry currentAttributes) {
- final String attributeName = element.getKey().toString();
- final SortedComboBoxModel values = element.getValues();
- for (int i = 0; i < values.getSize(); i++) {
- final Object nextElement = values.getElementAt(i);
- if (!currentAttributes.exist(attributeName, nextElement)) {
- final TreeNodeInfo treeNodeInfo = new TreeNodeInfo(nextElement.toString());
- final DefaultMutableTreeNode valueInfo = new DefaultMutableTreeNode(treeNodeInfo);
- attributeInfo.add(valueInfo);
- }
- }
- }
-
- private void performImport(final DefaultMutableTreeNode node) {
- final TreeNodeInfo info = (TreeNodeInfo) node.getUserObject();
- if (info.getSelected() == TreeNodeInfo.NOT_SELECTED) {
- return;
- }
- final String name = info.getInfo();
- boolean attributeNameRegistered = false;
- for (int i = 0; i < node.getChildCount(); i++) {
- final DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i);
- if (childNode.isLeaf()) {
- if (attributeNameRegistered == false) {
- attributeNameRegistered = true;
- if (-1 == currentAttributes.indexOf(name)) {
- currentAttributes.getAttributeController().performRegistryAttribute(name);
- final int index = currentAttributes.indexOf(name);
- currentAttributes.getAttributeController().performSetRestriction(index,
- ((AttributeTreeNodeInfo) info).isRestricted());
- }
- }
- final TreeNodeInfo childInfo = (TreeNodeInfo) childNode.getUserObject();
- if (childInfo.getSelected() == TreeNodeInfo.FULL_SELECTED) {
- final String value = childInfo.getInfo();
- currentAttributes.getAttributeController().performRegistryAttributeValue(name, value, true);
- }
- }
- else {
- performImport(childNode);
- }
- }
- }
-
- private void setParentSelectionType(final DefaultMutableTreeNode selectedNode, final int newSelectionType) {
- final TreeNode parentNode = selectedNode.getParent();
- if (parentNode == null) {
- return;
- }
- final DefaultMutableTreeNode defaultMutableParentNode = (DefaultMutableTreeNode) parentNode;
- final TreeNodeInfo info = (TreeNodeInfo) (defaultMutableParentNode).getUserObject();
- if (newSelectionType == TreeNodeInfo.PARTIAL_SELECTED) {
- if (info.getSelected() != TreeNodeInfo.PARTIAL_SELECTED) {
- info.setSelected(TreeNodeInfo.PARTIAL_SELECTED);
- treeModel.nodeChanged(defaultMutableParentNode);
- }
- setParentSelectionType(defaultMutableParentNode, TreeNodeInfo.PARTIAL_SELECTED);
- return;
- }
- for (int i = 0; i < defaultMutableParentNode.getChildCount(); i++) {
- final TreeNodeInfo childInfo = (TreeNodeInfo) ((DefaultMutableTreeNode) defaultMutableParentNode
- .getChildAt(i)).getUserObject();
- if (childInfo.getSelected() != newSelectionType) {
- if (info.getSelected() != TreeNodeInfo.PARTIAL_SELECTED) {
- info.setSelected(TreeNodeInfo.PARTIAL_SELECTED);
- treeModel.nodeChanged(defaultMutableParentNode);
- }
- setParentSelectionType(defaultMutableParentNode, TreeNodeInfo.PARTIAL_SELECTED);
- return;
- }
- }
- if (info.getSelected() != newSelectionType) {
- info.setSelected(newSelectionType);
- treeModel.nodeChanged(defaultMutableParentNode);
- }
- setParentSelectionType(defaultMutableParentNode, newSelectionType);
- }
-
- private void setSelectionType(final TreeNode selectedNode, final int newSelectionType) {
- final TreeNodeInfo info = (TreeNodeInfo) ((DefaultMutableTreeNode) selectedNode).getUserObject();
- if (info.getSelected() != newSelectionType) {
- info.setSelected(newSelectionType);
- treeModel.nodeChanged(selectedNode);
- }
- for (int i = 0; i < selectedNode.getChildCount(); i++) {
- setSelectionType(selectedNode.getChildAt(i), newSelectionType);
- }
- }
-
- @Override
- public void show() {
- createMapSubTrees(topNode);
- if (topNode.getChildCount() == 0) {
- JOptionPane.showMessageDialog(parentComponent, TextUtils.getText("attributes_no_import_candidates_found"),
- getTitle(), JOptionPane.INFORMATION_MESSAGE);
- return;
- }
- treeModel.reload();
- if (renderer == null) {
- renderer = new MyRenderer();
- }
- tree.setCellRenderer(renderer);
- setLocationRelativeTo(parentComponent);
- pack();
- super.show();
- }
-
- public void valueChanged(final TreeSelectionEvent e) {
- final DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
- if (selectedNode == null) {
- return;
- }
- final TreeNodeInfo info = (TreeNodeInfo) selectedNode.getUserObject();
- int newSelectionType;
- switch (info.getSelected()) {
- case TreeNodeInfo.FULL_SELECTED:
- newSelectionType = TreeNodeInfo.NOT_SELECTED;
- break;
- default:
- newSelectionType = TreeNodeInfo.FULL_SELECTED;
- break;
- }
- setSelectionType(selectedNode, newSelectionType);
- setParentSelectionType(selectedNode, newSelectionType);
- tree.clearSelection();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/ListDialog.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/ListDialog.java
deleted file mode 100644
index f0954bf..0000000
--- a/freeplane/src/org/freeplane/features/attribute/mindmapmode/ListDialog.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dialog;
-import java.awt.Dimension;
-import java.awt.Frame;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextField;
-import javax.swing.ListSelectionModel;
-import javax.swing.SwingConstants;
-import javax.swing.SwingUtilities;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Document;
-
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.TypedListCellRenderer;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.collection.IListModel;
-
-class ListDialog extends JDialog {
- private class AddAction implements ActionListener {
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- public void actionPerformed(final ActionEvent e) {
- data.add(getCurrentText());
- addButton.setEnabled(false);
- selectText();
- }
- }
-
- private class CloseAction implements ActionListener {
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- public void actionPerformed(final ActionEvent e) {
- ListDialog.dialog.dispose();
- }
- }
-
- private class DeleteAction implements ActionListener {
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- public void actionPerformed(final ActionEvent e) {
- final Object[] selectedValues = list.getSelectedValues();
- for (int i = 0; i < selectedValues.length; i++) {
- data.remove(selectedValues[i]);
- }
- if (data.getSize() == 0) {
- data.add("");
- }
- list.clearSelection();
- }
- }
-
- final private class ListSelectionChangeListener implements ListSelectionListener {
- /*
- * (non-Javadoc)
- * @see
- * javax.swing.event.ListSelectionListener#valueChanged(javax.swing.
- * event.ListSelectionEvent)
- */
- public void valueChanged(final ListSelectionEvent e) {
- final int minIndex = list.getMinSelectionIndex();
- final int maxIndex = list.getMaxSelectionIndex();
- if (minIndex == maxIndex && minIndex != -1) {
- textField.setText(data.getElementAt(minIndex).toString());
- selectText();
- }
- updateButtons();
- }
- }
-
- private class RenameAction implements ActionListener {
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- public void actionPerformed(final ActionEvent e) {
- final Object[] selectedValues = list.getSelectedValues();
- for (int i = 0; i < selectedValues.length; i++) {
- if (!selectedValues[i].equals(getCurrentText())) {
- data.replace(selectedValues[i], getCurrentText());
- }
- }
- renameButton.setEnabled(false);
- list.clearSelection();
- selectText();
- }
- }
-
- final private class TextChangeListener implements DocumentListener {
- public void changedUpdate(final DocumentEvent e) {
- update();
- }
-
- public void insertUpdate(final DocumentEvent e) {
- update();
- }
-
- public void removeUpdate(final DocumentEvent e) {
- update();
- }
-
- private void update() {
- updateButtons();
- }
- }
-
- private static ListDialog dialog;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public static void showDialog(final Component frameComp, final Component locationComp, final String labelText,
- final String title, final IListModel possibleValues, final String longValue) {
- final Window window = SwingUtilities.getWindowAncestor(frameComp);
- if(window instanceof Frame)
- ListDialog.dialog = new ListDialog((Frame)window, locationComp, labelText, title, possibleValues, longValue);
- else if(window instanceof Dialog)
- ListDialog.dialog = new ListDialog((Dialog )window, locationComp, labelText, title, possibleValues, longValue);
- else{
- final Frame frame = JOptionPane.getFrameForComponent(frameComp);
- ListDialog.dialog = new ListDialog(frame, locationComp, labelText, title, possibleValues, longValue);
- }
- UITools.addEscapeActionToDialog(ListDialog.dialog);
- ListDialog.dialog.show();
- }
-
- private JButton addButton;
- private IListModel data = null;
- private JButton deleteButton;
- private JList list;
- private JButton renameButton;
- private JTextField textField;
-
- private ListDialog(final Frame frame, final Component locationComp, final String labelText, final String title,
- final IListModel data, final String longValue) {
- super(frame, title, true);
- init(locationComp, labelText, data, longValue);
- }
-
- private ListDialog(final Dialog frame, final Component locationComp, final String labelText, final String title,
- final IListModel data, final String longValue) {
- super(frame, title, true);
- init(locationComp, labelText, data, longValue);
- }
-
- public void init(final Component locationComp, final String labelText, final IListModel data, final String longValue) {
- this.data = data;
- final JButton closeButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(closeButton, TextUtils.getRawText("simplyhtml.closeBtnName"));
- closeButton.addActionListener(new CloseAction());
- getRootPane().setDefaultButton(closeButton);
- addButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(addButton, TextUtils.getRawText("add"));
- final AddAction addAction = new AddAction();
- addButton.addActionListener(addAction);
- renameButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(renameButton, TextUtils.getRawText("rename"));
- renameButton.addActionListener(new RenameAction());
- deleteButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(deleteButton, TextUtils.getRawText("delete"));
- deleteButton.addActionListener(new DeleteAction());
- textField = new JTextField(20);
- textField.getDocument().addDocumentListener(new TextChangeListener());
- list = new JList(data) {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Override
- public int getScrollableUnitIncrement(final Rectangle visibleRect, final int orientation,
- final int direction) {
- int row;
- if (orientation == SwingConstants.VERTICAL && direction < 0 && (row = getFirstVisibleIndex()) != -1) {
- final Rectangle r = getCellBounds(row, row);
- if ((r.y == visibleRect.y) && (row != 0)) {
- final Point loc = r.getLocation();
- loc.y--;
- final int prevIndex = locationToIndex(loc);
- final Rectangle prevR = getCellBounds(prevIndex, prevIndex);
- if (prevR == null || prevR.y >= r.y) {
- return 0;
- }
- return prevR.height;
- }
- }
- return super.getScrollableUnitIncrement(visibleRect, orientation, direction);
- }
- };
- list.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
- if (longValue != null) {
- list.setPrototypeCellValue(longValue);
- }
- list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
- list.setVisibleRowCount(-1);
- list.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(final MouseEvent e) {
- if (e.getClickCount() == 2) {
- addButton.doClick();
- }
- }
- });
- list.setCellRenderer(new TypedListCellRenderer());
- list.setModel(data);
- list.addListSelectionListener(new ListSelectionChangeListener());
- final JScrollPane listScroller = new JScrollPane(list);
- listScroller.setPreferredSize(new Dimension(250, 80));
- listScroller.setAlignmentX(Component.LEFT_ALIGNMENT);
- final JPanel listPane = new JPanel();
- listPane.setLayout(new BoxLayout(listPane, BoxLayout.PAGE_AXIS));
- final JLabel label = new JLabel(labelText);
- label.setLabelFor(list);
- listPane.add(label);
- listPane.add(Box.createRigidArea(new Dimension(0, 5)));
- listPane.add(listScroller);
- listPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
- final JPanel buttonPane = new JPanel();
- buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
- buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
- buttonPane.add(Box.createHorizontalGlue());
- buttonPane.add(closeButton);
- buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
- buttonPane.add(addButton);
- buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
- buttonPane.add(renameButton);
- buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
- buttonPane.add(deleteButton);
- final JPanel textPane = new JPanel();
- textPane.setLayout(new BoxLayout(textPane, BoxLayout.LINE_AXIS));
- textPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
- textPane.add(textField);
- final Container contentPane = getContentPane();
- contentPane.add(textPane, BorderLayout.PAGE_START);
- contentPane.add(listPane, BorderLayout.CENTER);
- contentPane.add(buttonPane, BorderLayout.PAGE_END);
- updateButtons();
- pack();
- setLocationRelativeTo(locationComp);
- }
-
- private String getCurrentText() {
- final Document document = textField.getDocument();
- try {
- final String text = document.getText(0, document.getLength());
- return text;
- }
- catch (final BadLocationException e) {
- LogUtils.severe(e);
- return "";
- }
- }
-
- private int getIndexOf(final String text) {
- for (int i = 0; i < data.getSize(); i++) {
- if (data.getElementAt(i).toString().equals(text)) {
- return i;
- }
- }
- return -1;
- }
-
- private void selectText() {
- textField.requestFocusInWindow();
- textField.select(0, textField.getDocument().getLength());
- }
-
- /**
- *
- */
- private void updateButtons() {
- final String text = getCurrentText();
- final boolean isNewText = -1 == getIndexOf(text);
- addButton.setEnabled(isNewText);
- final int minSelectionIndex = list.getMinSelectionIndex();
- renameButton.setEnabled(minSelectionIndex != -1);
- deleteButton.setEnabled(minSelectionIndex != -1);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/MAttributeController.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/MAttributeController.java
deleted file mode 100644
index 9439500..0000000
--- a/freeplane/src/org/freeplane/features/attribute/mindmapmode/MAttributeController.java
+++ /dev/null
@@ -1,870 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute.mindmapmode;
-
-import java.util.NoSuchElementException;
-import java.util.Vector;
-
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.collection.SortedComboBoxModel;
-import org.freeplane.features.attribute.Attribute;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.AttributeRegistry;
-import org.freeplane.features.attribute.AttributeRegistryElement;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.mindmapmode.SetBooleanMapPropertyAction;
-
-public class MAttributeController extends AttributeController {
-
- static public MAttributeController getController(){
- return (MAttributeController) AttributeController.getController();
- }
- private class AttributeChanger implements IVisitor {
- final private Object name;
- final private Object newValue;
- final private Object oldValue;
-
- public AttributeChanger(final Object name, final Object oldValue, final Object newValue) {
- super();
- this.name = name;
- this.oldValue = oldValue;
- this.newValue = newValue;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.modes.attributes.AttributeRegistry.Visitor#visit(freeplane
- * .modes.attributes.ConcreteAttributeTableModel)
- */
- public void visit(final NodeAttributeTableModel model) {
- for (int i = 0; i < model.getRowCount(); i++) {
- if (model.getName(i).equals(name) && model.getValue(i).equals(oldValue)) {
- final int row = i;
- final IActor actor = new SetAttributeValueActor(model, row, newValue);
- Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
- }
- }
- }
- }
-
- private class AttributeRemover implements IVisitor {
- final private Object name;
-
- public AttributeRemover(final Object name) {
- super();
- this.name = name;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.modes.attributes.AttributeRegistry.Visitor#visit(freeplane
- * .modes.attributes.ConcreteAttributeTableModel)
- */
- public void visit(final NodeAttributeTableModel model) {
- for (int i = 0; i < model.getRowCount(); i++) {
- if (model.getName(i).equals(name)) {
- final int row = i;
- final IActor actor = new RemoveAttributeActor(model, row);
- Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
- }
- }
- }
- }
-
- private class AttributeRenamer implements IVisitor {
- final private Object newName;
- final private Object oldName;
-
- public AttributeRenamer(final Object oldName, final Object newName) {
- super();
- this.newName = newName;
- this.oldName = oldName;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.modes.attributes.AttributeRegistry.Visitor#visit(freeplane
- * .modes.attributes.ConcreteAttributeTableModel)
- */
- public void visit(final NodeAttributeTableModel model) {
- for (int i = 0; i < model.getRowCount(); i++) {
- if (model.getName(i).equals(oldName)) {
- final int row = i;
- final String name = newName.toString();
- final String oldName = this.oldName.toString();
- final IActor actor = new SetAttributeNameActor(model, name, oldName, row);
- Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
- }
- }
- }
- }
-
- private class AttributeValueRemover implements IVisitor {
- final private Object name;
- final private Object value;
-
- public AttributeValueRemover(final Object name, final Object value) {
- super();
- this.name = name;
- this.value = value;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.modes.attributes.AttributeRegistry.Visitor#visit(freeplane
- * .modes.attributes.ConcreteAttributeTableModel)
- */
- public void visit(final NodeAttributeTableModel model) {
- for (int i = 0; i < model.getRowCount(); i++) {
- if (model.getName(i).equals(name) && model.getValue(i).equals(value)) {
- final IActor actor = new RemoveAttributeActor(model, i);
- Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
- }
- }
- }
- }
-
- private class InsertAttributeActor implements IActor {
- private final NodeAttributeTableModel model;
- private final String name;
- private final int row;
- private final Object value;
-
- private InsertAttributeActor(final NodeAttributeTableModel model, final int row, final String name,
- final Object value) {
- this.row = row;
- this.name = name;
- this.model = model;
- this.value = value;
- }
-
- public void act() {
- final Attribute newAttribute = new Attribute(name, value);
- model.getAttributes().add(row, newAttribute);
- model.fireTableRowsInserted(row, row);
- }
-
- public String getDescription() {
- return "InsertAttributeActor";
- }
-
- public void undo() {
- model.getAttributes().remove(row);
- model.fireTableRowsDeleted(row, row);
- }
- }
-
- private class Iterator {
- final private IVisitor visitor;
-
- Iterator(final IVisitor v) {
- visitor = v;
- }
-
- /**
- */
- void iterate(final NodeModel node) {
- visitor.visit(NodeAttributeTableModel.getModel(node));
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- iterate(child);
- }
- }
- }
-
- private static interface IVisitor {
- void visit(NodeAttributeTableModel model);
- }
-
- private static class RegistryAttributeActor implements IActor {
- private final boolean manual;
- private final MapModel map;
- private final String name;
- private final AttributeRegistry registry;
- private final boolean visible;
-
- private RegistryAttributeActor(final String name, final boolean manual, final boolean visible,
- final AttributeRegistry registry, final MapModel map) {
- this.name = name;
- this.registry = registry;
- this.manual = manual;
- this.visible = visible;
- this.map = map;
- }
-
- public void act() {
- final AttributeRegistryElement attributeRegistryElement = new AttributeRegistryElement(registry, name);
- attributeRegistryElement.setManual(manual);
- attributeRegistryElement.setVisibility(visible);
- final int index = registry.getElements().add(name, attributeRegistryElement);
- registry.getTableModel().fireTableRowsInserted(index, index);
- if (manual || visible) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.getMapController().setSaved(map, false);
- }
- }
-
- public String getDescription() {
- return "RegistryAttributeActor";
- }
-
- public void undo() {
- registry.unregistry(name);
- if (manual) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.getMapController().setSaved(map, false);
- }
- }
- }
-
- private static class RegistryAttributeValueActor implements IActor {
- private final AttributeRegistryElement element;
- private final Object newValue;
- private final boolean setManual;
- private final boolean wasManual;
-
- private RegistryAttributeValueActor(final AttributeRegistryElement element, final Object newValue, boolean setManual) {
- this.element = element;
- this.newValue = newValue;
- this.setManual = setManual;
- this.wasManual = element.isManual();
- }
-
- public void act() {
- if (newValue != null){
- element.addValue(newValue);
- if(setManual)
- element.setManual(true);
- }
- }
-
- public String getDescription() {
- return "RegistryAttributeValueActor";
- }
-
- public void undo() {
- if (newValue != null){
- element.removeValue(newValue);
- if(setManual & ! wasManual)
- element.setManual(false);
- }
- }
- }
-
- private class RemoveAttributeActor implements IActor {
- final private InsertAttributeActor insertActor;
-
- private RemoveAttributeActor(final NodeAttributeTableModel model, final int row) {
- final Attribute attribute = model.getAttribute(row);
- final String name = attribute.getName();
- final Object value = attribute.getValue();
- insertActor = new InsertAttributeActor(model, row, name, value);
- }
-
- public void act() {
- insertActor.undo();
- }
-
- public String getDescription() {
- return "RemoveAttributeActor";
- }
-
- public void undo() {
- insertActor.act();
- }
- }
-
- private static class ReplaceAttributeValueActor implements IActor {
- private final String name;
- private final String newValue;
- private final String oldValue;
- private final AttributeRegistry registry;
-
- private ReplaceAttributeValueActor(final AttributeRegistry registry, final String name, final String oldValue,
- final String newValue) {
- this.registry = registry;
- this.name = name;
- this.oldValue = oldValue;
- this.newValue = newValue;
- }
-
- public void act() {
- registry.getElement(name).replaceValue(oldValue, newValue);
- }
-
- public String getDescription() {
- return "ReplaceAttributeValueActor";
- }
-
- public void undo() {
- registry.getElement(name).replaceValue(newValue, oldValue);
- }
- }
-
- private static class SetAttributeColumnWidthActor implements IActor {
- private final int col;
- private final NodeAttributeTableModel model;
- private final int oldWidth;
- private final int width;
-
- private SetAttributeColumnWidthActor(final int col, final int oldWidth, final int width,
- final NodeAttributeTableModel model) {
- this.col = col;
- this.oldWidth = oldWidth;
- this.width = width;
- this.model = model;
- }
-
- public void act() {
- model.getLayout().setColumnWidth(col, width);
- }
-
- public String getDescription() {
- return "SetAttributeColumnWidthActor";
- }
-
- public void undo() {
- model.getLayout().setColumnWidth(col, oldWidth);
- }
- }
-
- private static class SetAttributeNameActor implements IActor {
- private final NodeAttributeTableModel model;
- private final String name;
- private final String oldName;
- private final int row;
-
- private SetAttributeNameActor(final NodeAttributeTableModel model, final String name, final String oldName,
- final int row) {
- this.model = model;
- this.name = name;
- this.oldName = oldName;
- this.row = row;
- }
-
- public void act() {
- model.getAttribute(row).setName(name);
- model.fireTableCellUpdated(row, 0);
- }
-
- public String getDescription() {
- return "setAttributeName";
- }
-
- public void undo() {
- model.getAttribute(row).setName(oldName);
- model.fireTableCellUpdated(row, 0);
- }
- }
-
- private static class SetAttributeRestrictedActor implements IActor {
- private final int index;
- private final boolean isRestricted;
- private final AttributeRegistry registry;
-
- private SetAttributeRestrictedActor(final AttributeRegistry registry, final int index,
- final boolean isRestricted) {
- this.registry = registry;
- this.index = index;
- this.isRestricted = isRestricted;
- }
-
- public void act() {
- act(isRestricted);
- }
-
- public void act(final boolean isRestricted) {
- if (index == AttributeRegistry.GLOBAL) {
- registry.setRestricted(isRestricted);
- }
- else {
- registry.getElement(index).setRestriction(isRestricted);
- }
- }
-
- public String getDescription() {
- return "SetAttributeRestrictedActor";
- }
-
- public void undo() {
- act(!isRestricted);
- }
- }
-
- private static final class SetAttributeValueActor implements IActor {
- private final NodeAttributeTableModel model;
- private final Object newValue;
- private final Object oldValue;
- private final int row;
-
- private SetAttributeValueActor(final NodeAttributeTableModel model, final int row, final Object newValue) {
- this.row = row;
- oldValue = model.getAttribute(row).getValue();
- this.newValue = newValue;
- this.model = model;
- }
-
- public void act() {
- model.getAttribute(row).setValue(newValue);
- model.fireTableCellUpdated(row, 1);
- }
-
- public String getDescription() {
- return "SetAttributeValue";
- }
-
- public void undo() {
- model.getAttribute(row).setValue(oldValue);
- model.fireTableCellUpdated(row, 1);
- }
- }
-
- private static class SetAttributeVisibleActor implements IActor {
- private final AttributeRegistry attributeRegistry;
- private final int index;
- private final boolean isVisible;
-
- private SetAttributeVisibleActor(final AttributeRegistry attributeRegistry, final int index,
- final boolean isVisible) {
- this.attributeRegistry = attributeRegistry;
- this.index = index;
- this.isVisible = isVisible;
- }
-
- public void act() {
- act(isVisible);
- }
-
- private void act(final boolean isVisible) {
- attributeRegistry.getElement(index).setVisibility(isVisible);
- attributeRegistry.fireStateChanged();
- }
-
- public String getDescription() {
- return "SetAttributeVisibleActor";
- }
-
- public void undo() {
- act(!isVisible);
- }
- }
-
- private static class UnregistryAttributeActor implements IActor {
- final private RegistryAttributeActor registryActor;
-
- private UnregistryAttributeActor(final String name, final AttributeRegistry registry, final MapModel map) {
- registryActor = new RegistryAttributeActor(name, registry.getElement(name).isManual(), registry.getElement(
- name).isVisible(), registry, map);
- }
-
- public void act() {
- registryActor.undo();
- }
-
- public String getDescription() {
- return "UnregistryAttributeActor";
- }
-
- public void undo() {
- registryActor.act();
- }
- }
-
- private static class UnregistryAttributeValueActor implements IActor {
- final private RegistryAttributeValueActor registryActor;
-
- private UnregistryAttributeValueActor(final AttributeRegistryElement element, final String newValue) {
- registryActor = new RegistryAttributeValueActor(element, newValue, element.isManual());
- }
-
- public void act() {
- registryActor.undo();
- }
-
- public String getDescription() {
- return "UnregistryAttributeValueActor";
- }
-
- public void undo() {
- registryActor.act();
- }
- }
-
- InsertAttributeActor insertAttributeActor;
-
- public MAttributeController(final ModeController modeController) {
- super(modeController);
- createActions();
- }
-
- public int addAttribute(final NodeModel node, final Attribute pAttribute) {
- createAttributeTableModel(node);
- final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
- final int rowCount = attributes.getRowCount();
- performInsertRow(attributes, rowCount, pAttribute.getName(), pAttribute.getValue());
- return rowCount;
- }
-
- /**
- *
- */
- private void createActions() {
- ModeController modeController = Controller.getCurrentModeController();
- modeController.addAction(new AssignAttributesAction());
- modeController.addAction(new ShowAttributeDialogAction());
- modeController.addAction(new CopyAttributes());
- modeController.addAction(new PasteAttributes());
- modeController.addAction(new AddStyleAttributes());
- modeController.addAction(new SetBooleanMapPropertyAction(SHOW_ICON_FOR_ATTRIBUTES));
- }
-
- public int editAttribute(final NodeModel pNode, final String pName, final String pNewValue) {
- createAttributeTableModel(pNode);
- final Attribute newAttribute = new Attribute(pName, pNewValue);
- final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(pNode);
- for (int i = 0; i < attributes.getRowCount(); i++) {
- if (pName.equals(attributes.getAttribute(i).getName())) {
- if (pNewValue != null) {
- setAttribute(pNode, i, newAttribute);
- }
- else {
- removeAttribute(pNode, i);
- }
- return i;
- }
- }
- if (pNewValue == null) {
- return -1;
- }
- return addAttribute(pNode, newAttribute);
- }
-
- @Override
- public void performInsertRow(final NodeAttributeTableModel model, final int row, final String name, Object value) {
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry attributes = AttributeRegistry.getRegistry(map);
- if (name.equals("")) {
- return;
- }
- try {
- final AttributeRegistryElement element = attributes.getElement(name);
- final int index = element.getValues().getIndexOf(value);
- if (index == -1) {
- if (element.isRestricted()) {
- value = element.getValues().firstElement().toString();
- }
- else {
- final IActor actor = new RegistryAttributeValueActor(element, value, false);
- Controller.getCurrentModeController().execute(actor, map);
- }
- }
- }
- catch (final NoSuchElementException ex) {
- final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
- final IActor nameActor = new RegistryAttributeActor(name, false, false, registry, map);
- Controller.getCurrentModeController().execute(nameActor, map);
- final AttributeRegistryElement element = registry.getElement(name);
- final IActor valueActor = new RegistryAttributeValueActor(element, value, false);
- Controller.getCurrentModeController().execute(valueActor, map);
- }
- final Object newValue = value;
- final IActor actor = new InsertAttributeActor(model, row, name, newValue);
- Controller.getCurrentModeController().execute(actor, map);
- }
-
- @Override
- public void performRegistryAttribute(final String name) {
- if (name.equals("")) {
- return;
- }
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
- try {
- attributeRegistry.getElement(name);
- }
- catch (final NoSuchElementException ex) {
- final IActor actor = new RegistryAttributeActor(name, true, false, attributeRegistry, map);
- Controller.getCurrentModeController().execute(actor, map);
- return;
- }
- }
-
- @Override
- public void performRegistryAttributeValue(final String name, final String value, boolean manual) {
- if (name.equals("")) {
- return;
- }
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
- try {
- final AttributeRegistryElement element = attributeRegistry.getElement(name);
- if (element.getValues().contains(value)) {
- return;
- }
- final IActor actor = new RegistryAttributeValueActor(element, value, manual);
- Controller.getCurrentModeController().execute(actor, map);
- return;
- }
- catch (final NoSuchElementException ex) {
- final IActor nameActor = new RegistryAttributeActor(name, true, false, attributeRegistry, map);
- Controller.getCurrentModeController().execute(nameActor, map);
- final AttributeRegistryElement element = attributeRegistry.getElement(name);
- final IActor valueActor = new RegistryAttributeValueActor(element, value, false);
- Controller.getCurrentModeController().execute(valueActor, map);
- }
- }
-
- @Override
- public void performRegistrySubtreeAttributes(final NodeModel node) {
- final NodeAttributeTableModel nodeAttributeTableModel = NodeAttributeTableModel.getModel(node);
- for (int i = 0; i < nodeAttributeTableModel.getRowCount(); i++) {
- final String name = nodeAttributeTableModel.getValueAt(i, 0).toString();
- final String value = nodeAttributeTableModel.getValueAt(i, 1).toString();
- performRegistryAttributeValue(name, value, false);
- }
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- performRegistrySubtreeAttributes(child);
- }
- }
-
- @Override
- public void performRemoveAttribute(final String name) {
- final IVisitor remover = new AttributeRemover(name);
- final Iterator iterator = new Iterator(remover);
- ModeController modeController = Controller.getCurrentModeController();
- final NodeModel root = modeController.getMapController().getRootNode();
- iterator.iterate(root);
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
- final IActor actor = new UnregistryAttributeActor(name, attributeRegistry, map);
- Controller.getCurrentModeController().execute(actor, map);
- }
-
- @Override
- public void performRemoveAttributeValue(final String name, final String value) {
- final IVisitor remover = new AttributeValueRemover(name, value);
- final Iterator iterator = new Iterator(remover);
- ModeController modeController = Controller.getCurrentModeController();
- final NodeModel root = modeController.getMapController().getRootNode();
- iterator.iterate(root);
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
- final IActor unregistryActor = new UnregistryAttributeValueActor(attributeRegistry.getElement(name), value);
- Controller.getCurrentModeController().execute(unregistryActor, map);
- }
-
- @Override
- public Attribute performRemoveRow(final NodeAttributeTableModel model, final int row) {
- final Vector<Attribute> attributes = model.getAttributes();
- final Object o = attributes.elementAt(row);
- final IActor actor = new RemoveAttributeActor(model, row);
- Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
- return (Attribute) o;
- }
-
- @Override
- public void performReplaceAtributeName(final String oldName, final String newName) {
- if (oldName.equals("") || newName.equals("") || oldName.equals(newName)) {
- return;
- }
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
- final int iOld = registry.getElements().indexOf(oldName);
- final AttributeRegistryElement oldElement = registry.getElement(iOld);
- final SortedComboBoxModel values = oldElement.getValues();
- final IActor registryActor = new RegistryAttributeActor(newName, oldElement.isManual(), oldElement.isVisible(),
- registry, map);
- Controller.getCurrentModeController().execute(registryActor, map);
- final AttributeRegistryElement newElement = registry.getElement(newName);
- for (int i = 0; i < values.getSize(); i++) {
- final IActor registryValueActor = new RegistryAttributeValueActor(newElement, values.getElementAt(i)
- .toString(), false);
- Controller.getCurrentModeController().execute(registryValueActor, map);
- }
- final IVisitor replacer = new AttributeRenamer(oldName, newName);
- final Iterator iterator = new Iterator(replacer);
- ModeController modeController = Controller.getCurrentModeController();
- final NodeModel root = modeController.getMapController().getRootNode();
- iterator.iterate(root);
- final IActor unregistryActor = new UnregistryAttributeActor(oldName, registry, map);
- Controller.getCurrentModeController().execute(unregistryActor, map);
- }
-
- @Override
- public void performReplaceAttributeValue(final String name, final String oldValue, final String newValue) {
- Controller controller = Controller.getCurrentController();
- final MapModel map = controller.getMap();
- ModeController modeController = controller.getModeController();
- final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
- final IActor actor = new ReplaceAttributeValueActor(registry, name, oldValue, newValue);
- Controller.getCurrentModeController().execute(actor, map);
- final IVisitor replacer = new AttributeChanger(name, oldValue, newValue);
- final Iterator iterator = new Iterator(replacer);
- final NodeModel root = modeController.getMapController().getRootNode();
- iterator.iterate(root);
- }
-
- @Override
- public void performSetColumnWidth(final NodeAttributeTableModel model, final int col, final int width) {
- final int oldWidth = model.getLayout().getColumnWidth(col);
- if (width == oldWidth) {
- return;
- }
- final IActor actor = new SetAttributeColumnWidthActor(col, oldWidth, width, model);
- Controller.getCurrentModeController().execute(actor, model.getNode().getMap());
- }
-
- @Override
- public void performSetFontSize(final AttributeRegistry registry, final int size) {
- final int oldSize = registry.getFontSize();
- if (size == oldSize) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
- attributeRegistry.setFontSize(size);
- }
-
- public String getDescription() {
- return "SetAttributeFontSizeActor";
- }
-
- public void undo() {
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
- attributeRegistry.setFontSize(oldSize);
- }
- };
- Controller.getCurrentModeController().execute(actor, Controller.getCurrentModeController().getController().getMap());
- }
-
- @Override
- public void performSetRestriction(final int index, final boolean isRestricted) {
- boolean currentValue;
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
- if (index == AttributeRegistry.GLOBAL) {
- currentValue = registry.isRestricted();
- }
- else {
- currentValue = registry.getElement(index).isRestricted();
- }
- if (currentValue == isRestricted) {
- return;
- }
- final IActor actor = new SetAttributeRestrictedActor(registry, index, isRestricted);
- Controller.getCurrentModeController().execute(actor, map);
- }
-
- @Override
- public void performSetValueAt(final NodeAttributeTableModel model, final Object o, final int row, final int col) {
- final Attribute attribute = model.getAttribute(row);
- final MapModel map = model.getNode().getMap();
- final AttributeRegistry registry = AttributeRegistry.getRegistry(map);
- switch (col) {
- case 0: {
- final String name = o.toString().trim();
- final String oldName = attribute.getName();
- if (oldName.equals(name)) {
- return;
- }
- final IActor nameActor = new SetAttributeNameActor(model, name, oldName, row);
- Controller.getCurrentModeController().execute(nameActor, map);
- try {
- final AttributeRegistryElement element = registry.getElement(name);
- final String value = model.getValueAt(row, 1).toString();
- final int index = element.getValues().getIndexOf(value);
- if (index == -1) {
- final IActor valueActor = new SetAttributeValueActor(model, row, element.getValues().firstElement());
- Controller.getCurrentModeController().execute(valueActor, map);
- }
- }
- catch (final NoSuchElementException ex) {
- final IActor registryActor = new RegistryAttributeActor(name, false, false, registry, map);
- Controller.getCurrentModeController().execute(registryActor, map);
- }
- break;
- }
- case 1: {
- if (attribute.getValue().equals(o)) {
- return;
- }
- final IActor actor = new SetAttributeValueActor(model, row, o);
- Controller.getCurrentModeController().execute(actor, map);
- final String name = model.getValueAt(row, 0).toString();
- final AttributeRegistryElement element = registry.getElement(name);
- final int index = element.getValues().getIndexOf(o);
- if (index == -1) {
- final IActor registryActor = new RegistryAttributeValueActor(element, o, false);
- Controller.getCurrentModeController().execute(registryActor, map);
- }
- break;
- }
- }
- }
-
- @Override
- public void performSetVisibility(final int index, final boolean isVisible) {
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- final AttributeRegistry attributeRegistry = AttributeRegistry.getRegistry(map);
- if (attributeRegistry.getElement(index).isVisible() == isVisible) {
- return;
- }
- final IActor actor = new SetAttributeVisibleActor(attributeRegistry, index, isVisible);
- Controller.getCurrentModeController().execute(actor, map);
- }
-
- public void removeAttribute(final NodeModel pNode, final int pPosition) {
- createAttributeTableModel(pNode);
- performRemoveRow(NodeAttributeTableModel.getModel(pNode), pPosition);
- }
-
- public void setAttribute(final NodeModel pNode, final int pPosition, final Attribute pAttribute) {
- createAttributeTableModel(pNode);
- final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(pNode);
- performSetValueAt(model, pAttribute.getName(), pPosition, 0);
- performSetValueAt(model, pAttribute.getValue(), pPosition, 1);
- }
-
- public void copyAttributesToNode(NodeModel source, NodeModel target) {
- if (source == null)
- return;
- final NodeAttributeTableModel model = NodeAttributeTableModel.getModel(source);
- if (model.getRowCount() == 0)
- return;
- final int attributeTableLength = model.getAttributeTableLength();
- for(int i = 0; i < attributeTableLength; i++){
- final Attribute attribute = model.getAttribute(i);
- addAttribute(target, new Attribute(attribute.getName(), attribute.getValue()));
- }
- }
- public boolean canEdit() {
- return true;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/attribute/mindmapmode/ShowAttributeDialogAction.java b/freeplane/src/org/freeplane/features/attribute/mindmapmode/ShowAttributeDialogAction.java
deleted file mode 100644
index c2542cf..0000000
--- a/freeplane/src/org/freeplane/features/attribute/mindmapmode/ShowAttributeDialogAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.attribute.mindmapmode;
-
-import java.awt.Frame;
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.mode.Controller;
-
-class ShowAttributeDialogAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private AttributeManagerDialog attributeDialog = null;
- private Frame frame;
-
- /**
- *
- */
- ShowAttributeDialogAction() {
- super("ShowAttributeDialogAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- if (frame == null) {
- frame = Controller.getCurrentController().getViewController().getFrame();
- }
- if (getAttributeDialog().isVisible() == false && Controller.getCurrentController().getMap() != null) {
- getAttributeDialog().pack();
- getAttributeDialog().show();
- }
- }
-
- private AttributeManagerDialog getAttributeDialog() {
- if (attributeDialog == null) {
- attributeDialog = new AttributeManagerDialog(frame);
- }
- return attributeDialog;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/clipboard/ClipboardController.java b/freeplane/src/org/freeplane/features/clipboard/ClipboardController.java
deleted file mode 100644
index 3d32de9..0000000
--- a/freeplane/src/org/freeplane/features/clipboard/ClipboardController.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.clipboard;
-
-import java.awt.Color;
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.StringSelection;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Vector;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.features.text.TextController;
-
-/**
- * @author Dimitry Polivaev
- */
-public class ClipboardController implements IExtension {
- public static final String NODESEPARATOR = "<nodeseparator>";
-
- public static ClipboardController getController() {
- return (ClipboardController) Controller.getCurrentModeController().getExtension(ClipboardController.class);
- }
-
- public static void install( final ClipboardController clipboardController) {
- Controller.getCurrentModeController().addExtension(ClipboardController.class, clipboardController);
- }
-
- final private Clipboard clipboard;
-// final private ModeController modeController;
- final private Clipboard selection;
-
- public ClipboardController() {
- super();
-// this.modeController = modeController;
- final Toolkit toolkit = Toolkit.getDefaultToolkit();
- selection = toolkit.getSystemSelection();
- clipboard = toolkit.getSystemClipboard();
- createActions();
- }
-
- private void collectColors(final NodeModel node, final HashSet<Color> colors) {
- final Color color = NodeStyleModel.getColor(node);
- if (color != null) {
- colors.add(color);
- }
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- collectColors(child, colors);
- }
- }
-
- public Transferable copy(final Collection<NodeModel> selectedNodes, final boolean copyInvisible) {
- try {
- final String forNodesFlavor = createForNodesFlavor(selectedNodes, copyInvisible);
- final String plainText = getAsPlainText(selectedNodes);
- return new MindMapNodesSelection(forNodesFlavor, plainText, getAsRTF(selectedNodes),
- getAsHTML(selectedNodes), null, null);
- }
- catch (final UnsupportedFlavorException ex) {
- LogUtils.severe(ex);
- }
- catch (final IOException ex) {
- LogUtils.severe(ex);
- }
- return null;
- }
-
- public Transferable copy(final IMapSelection selection) {
- return copy(selection.getSortedSelection(true), false);
- }
-
- public Transferable copy(final NodeModel node, final boolean saveInvisible) {
- final StringWriter stringWriter = new StringWriter();
- try {
- Controller.getCurrentModeController().getMapController().getMapWriter().writeNodeAsXml(stringWriter, node, Mode.CLIPBOARD,
- saveInvisible, true, false);
- }
- catch (final IOException e) {
- LogUtils.severe(e);
- }
- return new MindMapNodesSelection(stringWriter.toString(), null, null, null, null, null);
- }
-
- public Transferable copySingle(final Collection<NodeModel> source) {
- final int size = source.size();
- final Vector<NodeModel> target = new Vector<NodeModel>(size);
- target.setSize(size);
- int i = 0;
- for (NodeModel node : source) {
- target.set(i, new SingleCopySource(node));
- i++;
- }
- return copy(target, false);
- }
-
- /**
- *
- */
- private void createActions() {
- final Controller controller = Controller.getCurrentController();
- ModeController modeController = controller.getModeController();
- modeController.addAction(new CopyAction());
- modeController.addAction(new CopySingleAction());
- modeController.addAction(new CopyIDAction());
- modeController.addAction(new CopyNodeURIAction());
- }
-
- public String createForNodesFlavor(final Collection<NodeModel> selectedNodes, final boolean copyInvisible)
- throws UnsupportedFlavorException, IOException {
- String forNodesFlavor = "";
- boolean firstLoop = true;
- for (final NodeModel tmpNode : selectedNodes) {
- if (firstLoop) {
- firstLoop = false;
- }
- else {
- forNodesFlavor += "<nodeseparator>";
- }
- forNodesFlavor += copy(tmpNode, copyInvisible).getTransferData(MindMapNodesSelection.mindMapNodesFlavor);
- }
- return forNodesFlavor;
- }
-
- public String getAsHTML(final Collection<NodeModel> selectedNodes) {
- try {
- final StringWriter stringWriter = new StringWriter();
- final BufferedWriter fileout = new BufferedWriter(stringWriter);
- writeHTML(selectedNodes, fileout);
- fileout.close();
- return stringWriter.toString();
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- return null;
- }
- }
-
- public String getAsPlainText(final Collection<NodeModel> selectedNodes) {
- try {
- final StringWriter stringWriter = new StringWriter();
- final BufferedWriter fileout = new BufferedWriter(stringWriter);
- for (final Iterator<NodeModel> it = selectedNodes.iterator(); it.hasNext();) {
- writeTXT(it.next(), fileout,/* depth= */0);
- }
- fileout.close();
- return stringWriter.toString();
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- return null;
- }
- }
-
- public String getAsRTF(final Collection<NodeModel> selectedNodes) {
- try {
- final StringWriter stringWriter = new StringWriter();
- final BufferedWriter fileout = new BufferedWriter(stringWriter);
- writeRTF(selectedNodes, fileout);
- fileout.close();
- return stringWriter.toString();
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- return null;
- }
- }
-
- /**
- */
- public Transferable getClipboardContents() {
- return clipboard.getContents(this);
- }
-
- private String rtfEscapeUnicodeAndSpecialCharacters(final String text) {
- final int len = text.length();
- final StringBuilder result = new StringBuilder(len);
- int intValue;
- char myChar;
- for (int i = 0; i < len; ++i) {
- myChar = text.charAt(i);
- intValue = text.charAt(i);
- if (intValue > 128) {
- result.append("\\u").append(intValue).append("?");
- }
- else {
- switch (myChar) {
- case '\\':
- result.append("\\\\");
- break;
- case '{':
- result.append("\\{");
- break;
- case '}':
- result.append("\\}");
- break;
- case '\n':
- result.append(" \\line ");
- break;
- default:
- result.append(myChar);
- }
- }
- }
- return result.toString();
- }
-
- public void saveHTML(final NodeModel rootNodeOfBranch, final File file) throws IOException {
- final BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
- final MindMapHTMLWriter htmlWriter = new MindMapHTMLWriter(Controller.getCurrentModeController().getMapController(), fileout);
- htmlWriter.writeHTML(rootNodeOfBranch);
- }
-
- public boolean saveTXT(final NodeModel rootNodeOfBranch, final File file) {
- try {
- final BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
- writeTXT(rootNodeOfBranch, fileout,/* depth= */
- 0);
- fileout.close();
- return true;
- }
- catch (final Exception e) {
- LogUtils.severe("Error in MindMapMapModel.saveTXT(): ", e);
- return false;
- }
- }
-
- /**
- */
- public void setClipboardContents(final Transferable t) {
- clipboard.setContents(t, null);
- if (selection != null) {
- selection.setContents(t, null);
- }
- }
-
- /** copies a string to the system clipboard. */
- public void setClipboardContents(final String string) {
- setClipboardContents(new StringSelection(string));
- }
-
- public NodeModel duplicate(final NodeModel source, boolean withChildren) {
- try {
- final StringWriter writer = new StringWriter();
- ModeController modeController = Controller.getCurrentModeController();
- modeController.getMapController().getMapWriter()
- .writeNodeAsXml(writer, source, Mode.CLIPBOARD, true, withChildren, false);
- final String result = writer.toString();
- final NodeModel copy = modeController.getMapController().getMapReader().createNodeTreeFromXml(
- source.getMap(), new StringReader(result), Mode.CLIPBOARD);
- copy.setFolded(false);
- return copy;
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- return null;
- }
- }
-
- private void writeChildrenRTF(final NodeModel node, final Writer fileout, final int depth,
- final HashMap<Color, Integer> colorTable) throws IOException {
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- if (child.isVisible()) {
- writeRTF(child, fileout, depth + 1, colorTable);
- }
- else {
- writeChildrenRTF(child, fileout, depth, colorTable);
- }
- }
- }
-
- private void writeChildrenText(final NodeModel node, final Writer fileout, final int depth)
- throws IOException {
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- if (child.isVisible()) {
- writeTXT(child, fileout, depth + 1);
- }
- else {
- writeChildrenText(child, fileout, depth);
- }
- }
- }
-
- public void writeHTML(final Collection<NodeModel> selectedNodes, final Writer fileout) throws IOException {
- final MindMapHTMLWriter htmlWriter = new MindMapHTMLWriter(Controller.getCurrentModeController().getMapController(), fileout);
- htmlWriter.writeHTML(selectedNodes);
- }
-
- public boolean writeRTF(final Collection<NodeModel> selectedNodes, final BufferedWriter fileout) {
- try {
- final HashSet<Color> colors = new HashSet<Color>();
- for (final Iterator<NodeModel> it = selectedNodes.iterator(); it.hasNext();) {
- collectColors(it.next(), colors);
- }
- String colorTableString = "{\\colortbl;\\red0\\green0\\blue255;";
- final HashMap<Color, Integer> colorTable = new HashMap<Color, Integer>();
- int colorPosition = 2;
- for (final Color color : colors) {
- colorTableString += "\\red" + color.getRed() + "\\green" + color.getGreen() + "\\blue"
- + color.getBlue() + ";";
- colorTable.put(color, new Integer(colorPosition));
- }
- colorTableString += "}";
- fileout.write("{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fswiss\\fcharset0 Arial;}"
- + colorTableString + "}" + "\\viewkind4\\uc1\\pard\\f0\\fs20{}");
- for (final Iterator<NodeModel> it = selectedNodes.iterator(); it.hasNext();) {
- writeRTF(it.next(), fileout,/* depth= */0, colorTable);
- }
- fileout.write("}");
- return true;
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- return false;
- }
- }
-
- public void writeRTF(final NodeModel mindMapNodeModel, final Writer fileout, final int depth,
- final HashMap<Color, Integer> colorTable) throws IOException {
- String pre = "{" + "\\li" + depth * 350;
- String level;
- if (depth <= 8) {
- level = "\\outlinelevel" + depth;
- }
- else {
- level = "";
- }
- String fontsize = "";
- if (NodeStyleModel.getColor(mindMapNodeModel) != null) {
- pre += "\\cf" + colorTable.get(NodeStyleModel.getColor(mindMapNodeModel)).intValue();
- }
- final NodeStyleModel font = NodeStyleModel.getModel(mindMapNodeModel);
- if (font != null) {
- if (Boolean.TRUE.equals(font.isItalic())) {
- pre += "\\i ";
- }
- if (Boolean.TRUE.equals(font.isBold())) {
- pre += "\\b ";
- }
- if (font.getFontSize() != null) {
- fontsize = "\\fs" + Math.round(1.5 * font.getFontSize());
- pre += fontsize;
- }
- }
- pre += "{}";
- fileout.write("\\li" + depth * 350 + level + "{}");
- final String nodeText = TextController.getController().getPlainTextContent(mindMapNodeModel);
- if (nodeText.matches(" *")) {
- fileout.write("o");
- }
- else {
- final String text = rtfEscapeUnicodeAndSpecialCharacters(nodeText);
- if (NodeLinks.getValidLink(mindMapNodeModel) != null) {
- final String link = rtfEscapeUnicodeAndSpecialCharacters(NodeLinks.getLinkAsString(mindMapNodeModel));
- if (link.equals(nodeText)) {
- fileout.write(pre + "<{\\ul\\cf1 " + link + "}>" + "}");
- }
- else {
- fileout.write("{" + fontsize + pre + text + "} ");
- fileout.write("<{\\ul\\cf1 " + link + "}}>");
- }
- }
- else {
- fileout.write(pre + text + "}");
- }
- }
- fileout.write("\\par");
- fileout.write("\n");
- writeChildrenRTF(mindMapNodeModel, fileout, depth, colorTable);
- }
-
- public void writeTXT(final NodeModel mindMapNodeModel, final Writer fileout, final int depth) throws IOException {
- final String plainTextContent = TextController.getController().getPlainTextContent(mindMapNodeModel).replace('\n', ' ');
- for (int i = 0; i < depth; ++i) {
- fileout.write(" ");
- }
- if (plainTextContent.matches(" *")) {
- fileout.write("o");
- }
- else {
- if (NodeLinks.getValidLink(mindMapNodeModel) != null) {
- final String link = NodeLinks.getLinkAsString(mindMapNodeModel);
- if (!link.equals(plainTextContent)) {
- fileout.write(plainTextContent + " ");
- }
- fileout.write("<" + link + ">");
- }
- else {
- fileout.write(plainTextContent);
- }
- }
- fileout.write("\n");
- writeChildrenText(mindMapNodeModel, fileout, depth);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/clipboard/MindMapHTMLWriter.java b/freeplane/src/org/freeplane/features/clipboard/MindMapHTMLWriter.java
deleted file mode 100644
index 0d43c2f..0000000
--- a/freeplane/src/org/freeplane/features/clipboard/MindMapHTMLWriter.java
+++ /dev/null
@@ -1,430 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.clipboard;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Collection;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.text.DetailTextModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.url.UrlManager;
-
-
-class MindMapHTMLWriter {
- private static String el = System.getProperty("line.separator");
-
- private static String convertSpecialChar(final char c) {
- String cvt;
- switch ((int) c) {
- case 0xe4:
- cvt = "ä";
- break;
- case 0xf6:
- cvt = "ö";
- break;
- case 0xfc:
- cvt = "ü";
- break;
- case 0xc4:
- cvt = "Ä";
- break;
- case 0xd6:
- cvt = "Ö";
- break;
- case 0xdc:
- cvt = "Ü";
- break;
- case 0xdf:
- cvt = "ß";
- break;
- default:
- cvt = "&#" + Integer.toString((int) c) + ";";
- break;
- }
- return cvt;
- }
-
- private static String writeHTML_escapeUnicodeAndSpecialCharacters(final String text) {
- final int len = text.length();
- final StringBuilder result = new StringBuilder(len);
- int intValue;
- char myChar;
- boolean previousSpace = false;
- boolean spaceOccured = false;
- for (int i = 0; i < len; ++i) {
- myChar = text.charAt(i);
- intValue = (int) text.charAt(i);
- if (intValue >= 128) {
- result.append(MindMapHTMLWriter.convertSpecialChar(myChar));
- }
- else {
- spaceOccured = false;
- switch (myChar) {
- case '&':
- result.append("&");
- break;
- case '<':
- result.append("<");
- break;
- case '>':
- result.append(">");
- break;
- case ' ':
- spaceOccured = true;
- if (previousSpace) {
- result.append(" ");
- }
- else {
- result.append(" ");
- }
- break;
- case '\n':
- result.append("\n<br>\n");
- break;
- default:
- result.append(myChar);
- }
- previousSpace = spaceOccured;
- }
- }
- return result.toString();
- }
-
- final private boolean basedOnHeadings;
- final private Writer fileout;
- final private MapController mapController;
- private boolean writeFoldingCode;
- private final NodeStyleController nodeStyleController;
- private Font defaultFont;
- private Color defaultColor;
-
- MindMapHTMLWriter(final MapController mapController, final Writer fileout) {
- this.mapController = mapController;
- nodeStyleController = NodeStyleController.getController();
- this.fileout = fileout;
- writeFoldingCode = false;
- basedOnHeadings = (getProperty("html_export_folding").equals("html_export_based_on_headings"));
- }
-
- private String fontStyle(Color color, Font font) throws IOException {
- StringBuilder fontStyle = new StringBuilder();
- if(color != null && (defaultColor == null || ! color.equals(defaultColor)))
- fontStyle.append("color: ").append(ColorUtils.colorToString(color)).append( "; ");
- if(font != null){
- final int fontSize = font.getSize();
- if (defaultFont == null || fontSize != defaultFont.getSize())
- fontStyle.append("font-size: ").append(fontSize).append( "pt; ");
- final String fontFamily = font.getFamily();
- if (defaultFont == null || ! fontFamily.equals(defaultFont.getFamily()))
- fontStyle.append("font-family: ").append(fontFamily).append( ", sans-serif; ");
- if ((defaultFont == null || ! defaultFont.isItalic()) && font.isItalic()) {
- fontStyle.append("font-style: italic; ");
- }
- if ((defaultFont == null || ! defaultFont.isBold()) && font.isBold()) {
- fontStyle.append("font-weight: bold; ");
- }
- }
- return fontStyle.toString();
- }
-
- private String getProperty(final String key) {
- return ResourceController.getResourceController().getProperty(key);
- }
-
- private void writeBodyWithFolding(final NodeModel rootNodeOfBranch) throws IOException {
- writeJavaScript();
- fileout.write("<SPAN class=\"foldspecial\" onclick=\"fold_document()\">All +</SPAN>" + MindMapHTMLWriter.el);
- fileout.write("<SPAN class=\"foldspecial\" onclick=\"unfold_document()\">All -</SPAN>" + MindMapHTMLWriter.el);
- writeHTML(rootNodeOfBranch, "1", 0, /* isRoot */true, true, /* depth */
- 1);
- fileout.write("<SCRIPT type=\"text/javascript\">" + MindMapHTMLWriter.el);
- fileout.write("fold_document();" + MindMapHTMLWriter.el);
- fileout.write("</SCRIPT>" + MindMapHTMLWriter.el);
- }
-
- private void writeFoldingButtons(final String localParentID) throws IOException {
- fileout.write("<span id=\"show" + localParentID + "\" class=\"foldclosed\" onClick=\"show_folder('"
- + localParentID + "')\" style=\"POSITION: absolute\">+</span> " + "<span id=\"hide" + localParentID
- + "\" class=\"foldopened\" onClick=\"hide_folder('" + localParentID + "')\">-</span>");
- fileout.write("\n");
- }
-
- void writeHTML(final Collection<NodeModel> selectedNodes) throws IOException {
- fileout.write("<html>" + MindMapHTMLWriter.el + "<head>" + MindMapHTMLWriter.el);
- if(! selectedNodes.isEmpty()){
- final MapModel map = selectedNodes.iterator().next().getMap();
- setDefaultsFrom(map);
- writeStyle();
- }
- fileout.write(MindMapHTMLWriter.el + "</head>" + MindMapHTMLWriter.el + "<body>" + MindMapHTMLWriter.el);
- for (NodeModel node : selectedNodes) {
- writeHTML(node, "1", 0, /* isRoot */true, true, /* depth */1);
- }
- fileout.write("</body>" + MindMapHTMLWriter.el);
- fileout.write("</html>" + MindMapHTMLWriter.el);
- fileout.close();
- resetDefaults();
- }
-
- private void resetDefaults() {
- defaultFont = null;
- defaultColor = null;
- }
-
- private void setDefaultsFrom(MapModel map) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- final NodeModel styleNode = model.getStyleNodeSafe(MapStyleModel.DEFAULT_STYLE);
- defaultFont = nodeStyleController.getFont(styleNode);
- defaultColor = nodeStyleController.getColor(styleNode);
- }
-
- void writeHTML(final NodeModel rootNodeOfBranch) throws IOException {
- setDefaultsFrom(rootNodeOfBranch.getMap());
- final String htmlExportFoldingOption = getProperty("html_export_folding");
- writeFoldingCode = (htmlExportFoldingOption.equals("html_export_fold_currently_folded") && mapController
- .hasFoldedStrictDescendant(rootNodeOfBranch))
- || htmlExportFoldingOption.equals("html_export_fold_all");
- ResourceController.getResourceController().getBooleanProperty("export_icons_in_html");
- fileout
- .write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">"
- + MindMapHTMLWriter.el + "<html>" + MindMapHTMLWriter.el + "<head>" + MindMapHTMLWriter.el);
- fileout.write("<title>"
- + MindMapHTMLWriter.writeHTML_escapeUnicodeAndSpecialCharacters(TextController.getController().getPlainTextContent(rootNodeOfBranch)
- .replace('\n', ' ')) + "</title>" + MindMapHTMLWriter.el);
- writeStyle();
- fileout.write(MindMapHTMLWriter.el + "</head>" + MindMapHTMLWriter.el + "<body");
- final MapStyleModel style = MapStyleModel.getExtension(rootNodeOfBranch.getMap());
- final Color background = style != null ? style.getBackgroundColor() : null;
- if (background != null) {
- fileout.write(" bgcolor=" + ColorUtils.colorToString(background));
- }
- fileout.write(">" + MindMapHTMLWriter.el);
- if (writeFoldingCode) {
- writeBodyWithFolding(rootNodeOfBranch);
- }
- else {
- writeHTML(rootNodeOfBranch, "1", 0, /* isRoot */true, true, /* depth */
- 1);
- }
- fileout.write("</body>" + MindMapHTMLWriter.el);
- fileout.write("</html>" + MindMapHTMLWriter.el);
- fileout.close();
- resetDefaults();
- }
-
- private int writeHTML(final NodeModel model, final String parentID, int lastChildNumber, final boolean isRoot,
- final boolean treatAsParagraph, final int depth) throws IOException {
- boolean createFolding = false;
- if(writeFoldingCode){
- createFolding = mapController.isFolded(model);
- if (getProperty("html_export_folding").equals("html_export_fold_all")) {
- createFolding = mapController.hasChildren(model);
- }
- if (getProperty("html_export_folding").equals("html_export_no_folding") || basedOnHeadings || isRoot) {
- createFolding = false;
- }
- }
- final TextController textController = TextController.getController();
- final Object userObject = model.getUserObject();
- final String text = textController.getTransformedTextNoThrow(userObject, model, userObject);
- final boolean hasHtml = text.startsWith("<html>");
- final boolean heading = basedOnHeadings && !hasHtml && mapController.hasChildren(model) && depth <= 6;
- if (!treatAsParagraph && !basedOnHeadings) {
- fileout.write("<li>");
- }
- else {
- if (heading) {
- fileout.write("<h" + depth + ">");
- }
- else if (!hasHtml) {
- fileout.write("<p>");
- }
- }
- String localParentID = parentID;
- if (createFolding) {
- lastChildNumber++;
- localParentID = parentID + "_" + lastChildNumber;
- writeFoldingButtons(localParentID);
- }
- String link = NodeLinks.getLinkAsString(model);
- if (link != null) {
- if (link.endsWith(UrlManager.FREEPLANE_FILE_EXTENSION)) {
- link += ".html";
- }
- fileout.write("<a href=\"" + link + "\" target=\"_blank\"><span class=l>~</span> ");
- }
- final String fontStyle = fontStyle(nodeStyleController.getColor(model), nodeStyleController.getFont(model));
- if (!fontStyle.equals("")) {
- fileout.write("<span style=\"" + fontStyle + "\">");
- }
- if (ResourceController.getResourceController().getBooleanProperty("export_icons_in_html")) {
- writeIcons(model);
- }
- writeModelContent(text);
- final String detailText = DetailTextModel.getDetailTextText(model);
- if(detailText != null){
- writeModelContent(detailText);
- }
- if (fontStyle != "") {
- fileout.write("</span>");
- }
- final String noteContent = NoteModel.getNoteText(model);
- if(noteContent != null){
- writeModelContent(noteContent);
- }
- fileout.write(MindMapHTMLWriter.el);
- if (link != null) {
- fileout.write("</a>" + MindMapHTMLWriter.el);
- }
- if (heading) {
- fileout.write("</h" + depth + ">" + MindMapHTMLWriter.el);
- }
- boolean treatChildrenAsParagraph = false;
- for (final NodeModel child : mapController.childrenUnfolded(model)) {
- if (child.toString().length() > 100) {
- treatChildrenAsParagraph = true;
- break;
- }
- }
- if (getProperty("html_export_folding").equals("html_export_based_on_headings")) {
- for (final NodeModel child : mapController.childrenUnfolded(model)) {
- lastChildNumber = writeHTML(child, parentID, lastChildNumber,/*isRoot=*/false,
- treatChildrenAsParagraph, depth + 1);
- }
- return lastChildNumber;
- }
- if (mapController.hasChildren(model)) {
- if (getProperty("html_export_folding").equals("html_export_based_on_headings")) {
- for (final NodeModel child : mapController.childrenUnfolded(model)) {
- lastChildNumber = writeHTML(child, parentID, lastChildNumber,
- /*isRoot=*/false, treatChildrenAsParagraph, depth + 1);
- }
- }
- else if (createFolding) {
- fileout.write("<ul id=\"fold" + localParentID
- + "\" style=\"POSITION: relative; VISIBILITY: visible;\">");
- if (treatChildrenAsParagraph) {
- fileout.write("<li>");
- }
- int localLastChildNumber = 0;
- for (final NodeModel child : mapController.childrenUnfolded(model)) {
- localLastChildNumber = writeHTML(child, localParentID, localLastChildNumber,
- /* isRoot=*/false, treatChildrenAsParagraph, depth + 1);
- }
- }
- else {
- fileout.write("<ul>");
- if (treatChildrenAsParagraph) {
- fileout.write("<li>");
- }
- for (final NodeModel child : mapController.childrenUnfolded(model)) {
- lastChildNumber = writeHTML(child, parentID, lastChildNumber,
- /* isRoot= */false, treatChildrenAsParagraph, depth + 1);
- }
- }
- if (treatChildrenAsParagraph) {
- fileout.write("</li>");
- }
- fileout.write(MindMapHTMLWriter.el);
- fileout.write("</ul>");
- }
- if (!treatAsParagraph) {
- fileout.write(MindMapHTMLWriter.el + "</li>" + MindMapHTMLWriter.el);
- }
- return lastChildNumber;
- }
-
- private void writeIcons(final NodeModel model) throws IOException {
- final Collection<MindIcon> icons = IconController.getController().getIcons(model);
- for (MindIcon icon : icons) {
- final String iconFileName = icon.getFileName();
- fileout.write("<img src=\"" + iconFileName + "\" alt=\"" + icon.getDescription() + "\">");
- }
- }
-
- private void writeJavaScript() throws IOException {
- fileout.write("<script type=\"text/javascript\">" + MindMapHTMLWriter.el);
- fileout.write(FileUtils.slurpResource("/html/folding.js"));
- fileout.write(MindMapHTMLWriter.el + "</script>" + MindMapHTMLWriter.el);
- }
-
- private void writeModelContent(final String string) throws IOException {
- if (string.matches(" +")) {
- fileout.write(" ");
- }
- else if (string.startsWith("<html")) {
- String output = string.substring(6);
- int start = output.indexOf("<body");
- if (start == -1) {
- start = output.indexOf('>') + 1;
- }
- else {
- start = output.indexOf('>', start + 5) + 1;
- }
- int end = output.indexOf("</body>");
- if (end == -1) {
- end = output.indexOf("</html>");
- }
- if (end == -1) {
- end = output.length();
- }
- output = output.substring(start, end);
- fileout.write(output);
- }
- else {
- fileout.write(HtmlUtils.unicodeToHTMLUnicodeEntity(string));
- }
- }
- private void writeStyle() throws IOException {
- fileout.write("<style type=\"text/css\">" + MindMapHTMLWriter.el);
- fileout.write(" body {");
- writeDefaultFontStyle();
- fileout.write("}" + MindMapHTMLWriter.el);
- fileout.write(FileUtils.slurpResource("/html/folding.css"));
- fileout.write(MindMapHTMLWriter.el + MindMapHTMLWriter.el + "</style>" + MindMapHTMLWriter.el
- + "<!-- ^ Position is not set to relative / absolute here because of Mozilla -->");
- }
-
- private void writeDefaultFontStyle() throws IOException {
- Font font = defaultFont;
- defaultFont = null;
- Color color = defaultColor;
- defaultColor = null;
- fontStyle(color, font);
- defaultFont = font;
- defaultColor = color;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/clipboard/MindMapNodesSelection.java b/freeplane/src/org/freeplane/features/clipboard/MindMapNodesSelection.java
deleted file mode 100644
index cb79264..0000000
--- a/freeplane/src/org/freeplane/features/clipboard/MindMapNodesSelection.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.clipboard;
-
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.ClipboardOwner;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.io.ByteArrayInputStream;
-import java.util.List;
-
-import org.freeplane.core.util.LogUtils;
-
-public class MindMapNodesSelection implements Transferable, ClipboardOwner {
- /**
- * fc, 7.8.2004: This is a quite interisting flavor, but how does it
- * works???
- */
- public static DataFlavor dropActionFlavor = null;
- public static DataFlavor fileListFlavor = null;
- public static DataFlavor htmlFlavor = null;
- public static DataFlavor mindMapNodesFlavor = null;
- public static DataFlavor rtfFlavor = null;
- static {
- try {
- MindMapNodesSelection.mindMapNodesFlavor = new DataFlavor("text/freeplane-nodes; class=java.lang.String");
- MindMapNodesSelection.rtfFlavor = new DataFlavor("text/rtf; class=java.io.InputStream");
- MindMapNodesSelection.htmlFlavor = new DataFlavor("text/html; class=java.lang.String");
- MindMapNodesSelection.fileListFlavor = new DataFlavor("application/x-java-file-list; class=java.util.List");
- MindMapNodesSelection.dropActionFlavor = new DataFlavor("text/drop-action; class=java.lang.String");
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
- private String dropActionContent;
- final private List<?> fileList;
- final private String htmlContent;
- final private String nodesContent;
- final private String rtfContent;
- final private String stringContent;
-
- // FIXME: dropActionContent, fileList are never set to something else than null
- public MindMapNodesSelection(final String nodesContent, final String stringContent, final String rtfContent,
- final String htmlContent, final String dropActionContent, final List<?> fileList) {
- this.nodesContent = nodesContent;
- this.rtfContent = rtfContent;
- this.stringContent = stringContent;
- this.dropActionContent = dropActionContent;
- this.htmlContent = htmlContent;
- this.fileList = fileList;
- }
-
- public Object getTransferData(final DataFlavor flavor) throws UnsupportedFlavorException {
- if (flavor.equals(DataFlavor.stringFlavor)) {
- return stringContent;
- }
- if (flavor.equals(MindMapNodesSelection.mindMapNodesFlavor)) {
- return nodesContent;
- }
- if (flavor.equals(MindMapNodesSelection.dropActionFlavor)) {
- return dropActionContent;
- }
- if (flavor.equals(MindMapNodesSelection.rtfFlavor)) {
- final byte[] byteArray = rtfContent.getBytes();
- return new ByteArrayInputStream(byteArray);
- }
- if (flavor.equals(MindMapNodesSelection.htmlFlavor) && htmlContent != null) {
- return htmlContent;
- }
- if (flavor.equals(MindMapNodesSelection.fileListFlavor)) {
- return fileList;
- }
- throw new UnsupportedFlavorException(flavor);
- }
-
- public DataFlavor[] getTransferDataFlavors() {
- return new DataFlavor[] { DataFlavor.stringFlavor, MindMapNodesSelection.mindMapNodesFlavor,
- MindMapNodesSelection.rtfFlavor, MindMapNodesSelection.htmlFlavor,
- MindMapNodesSelection.dropActionFlavor };
- }
-
- public boolean isDataFlavorSupported(final DataFlavor flavor) {
- if (flavor.equals(DataFlavor.stringFlavor) && stringContent != null) {
- return true;
- }
- if (flavor.equals(MindMapNodesSelection.mindMapNodesFlavor) && nodesContent != null) {
- return true;
- }
- if (flavor.equals(MindMapNodesSelection.rtfFlavor) && rtfContent != null) {
- return true;
- }
- if (flavor.equals(MindMapNodesSelection.dropActionFlavor) && dropActionContent != null) {
- return true;
- }
- if (flavor.equals(MindMapNodesSelection.htmlFlavor) && htmlContent != null) {
- return true;
- }
- if (flavor.equals(MindMapNodesSelection.fileListFlavor) && (fileList != null) && fileList.size() > 0) {
- return true;
- }
- return false;
- }
-
- public void lostOwnership(final Clipboard clipboard, final Transferable contents) {
- }
-
- public void setDropAction(final String dropActionContent) {
- this.dropActionContent = dropActionContent;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/clipboard/SingleCopySource.java b/freeplane/src/org/freeplane/features/clipboard/SingleCopySource.java
deleted file mode 100644
index e8b1500..0000000
--- a/freeplane/src/org/freeplane/features/clipboard/SingleCopySource.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.clipboard;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.tree.MutableTreeNode;
-import javax.swing.tree.TreeNode;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.filter.FilterInfo;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.map.HistoryInformationModel;
-import org.freeplane.features.map.INodeView;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.ui.INodeViewVisitor;
-
-/**
- * @author Dimitry Polivaev
- * 03.02.2013
- */
-class SingleCopySource extends NodeModel {
-
- private static final String METHOD_NOT_SUPPORTED = "method not supported";
- private final NodeModel delegate;
-
- protected List<NodeModel> getChildrenInternal() {
- return Collections.emptyList();
- }
-
- protected void init(final Object userObject) {
- }
-
- public SingleCopySource(NodeModel delegate) {
- super(null);
- this.delegate =delegate;
- }
-
- public int hashCode() {
- return super.hashCode();
- }
-
- public Object getUserObject() {
- return delegate.getUserObject();
- }
-
- public boolean equals(Object obj) {
- return super.equals(obj);
- }
-
- public void acceptViewVisitor(INodeViewVisitor visitor) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void addExtension(IExtension extension) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public IExtension putExtension(IExtension extension) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void addIcon(MindIcon icon) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void addIcon(MindIcon icon, int position) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void addViewer(INodeView viewer) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public boolean areViewsEmpty() {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public Enumeration<NodeModel> children() {
- return super.children();
- }
-
- public boolean containsExtension(Class<? extends IExtension> clazz) {
- return delegate.containsExtension(clazz);
- }
-
- public String createID() {
- return delegate.createID();
- }
-
- public void fireNodeChanged(NodeChangeEvent nodeChangeEvent) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public boolean getAllowsChildren() {
- return delegate.getAllowsChildren();
- }
-
- public TreeNode getChildAt(int childIndex) {
- return super.getChildAt(childIndex);
- }
-
- public int getChildCount() {
- return super.getChildCount();
- }
-
- public int getChildPosition(NodeModel childNode) {
- return super.getChildPosition(childNode);
- }
-
- public List<NodeModel> getChildren() {
- return super.getChildren();
- }
-
- public <T extends IExtension> T getExtension(Class<T> clazz) {
- return delegate.getExtension(clazz);
- }
-
- public Map<Class<? extends IExtension>, IExtension> getExtensions() {
- return delegate.getExtensions();
- }
-
- public FilterInfo getFilterInfo() {
- return delegate.getFilterInfo();
- }
-
- public HistoryInformationModel getHistoryInformation() {
- return delegate.getHistoryInformation();
- }
-
- public MindIcon getIcon(int position) {
- return delegate.getIcon(position);
- }
-
- public List<MindIcon> getIcons() {
- return delegate.getIcons();
- }
-
- public String getID() {
- return delegate.getID();
- }
-
- public int getIndex(TreeNode node) {
- return super.getIndex(node);
- }
-
- public MapModel getMap() {
- return delegate.getMap();
- }
-
- public int getNodeLevel(boolean countHidden) {
- return delegate.getNodeLevel(countHidden);
- }
-
- public TreeNode getParent() {
- return delegate.getParent();
- }
-
- public NodeModel getParentNode() {
- return delegate.getParentNode();
- }
-
- public NodeModel[] getPathToRoot() {
- return delegate.getPathToRoot();
- }
-
- public String getText() {
- return delegate.getText();
- }
-
- public Collection<INodeView> getViewers() {
- return delegate.getViewers();
- }
-
- public boolean hasChildren() {
- return false;
- }
-
- public boolean hasID() {
- return delegate.hasID();
- }
-
- public void insert(MutableTreeNode child, int index) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public boolean isDescendantOf(NodeModel node) {
- return delegate.isDescendantOf(node);
- }
-
- public boolean isFolded() {
- return false;
- }
-
- public boolean isLeaf() {
- return delegate.isLeaf();
- }
-
- public boolean isLeft() {
- return delegate.isLeft();
- }
-
- public boolean isNewChildLeft() {
- return delegate.isNewChildLeft();
- }
-
- public boolean isRoot() {
- return delegate.isRoot();
- }
-
- public boolean isVisible() {
- return delegate.isVisible();
- }
-
- public void remove(int index) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void remove(MutableTreeNode node) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public <T extends IExtension> T removeExtension(Class<T> clazz) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public boolean removeExtension(IExtension extension) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void removeFromParent() {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public int removeIcon() {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public int removeIcon(int position) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void removeViewer(INodeView viewer) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void setFolded(boolean folded) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void setHistoryInformation(HistoryInformationModel historyInformation) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void setID(String value) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void setLeft(boolean isLeft) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void setMap(MapModel map) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void setParent(MutableTreeNode newParent) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public void setParent(NodeModel newParent) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public String toString() {
- return delegate.toString();
- }
-
- public int depth() {
- return delegate.depth();
- }
-
- public void insert(NodeModel newNodeModel) {
- throw new RuntimeException(METHOD_NOT_SUPPORTED);
- }
-
- public NodeModel getVisibleAncestorOrSelf() {
- return delegate.getVisibleAncestorOrSelf();
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/features/clipboard/mindmapmode/MClipboardController.java b/freeplane/src/org/freeplane/features/clipboard/mindmapmode/MClipboardController.java
deleted file mode 100644
index 684e7ca..0000000
--- a/freeplane/src/org/freeplane/features/clipboard/mindmapmode/MClipboardController.java
+++ /dev/null
@@ -1,788 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.clipboard.mindmapmode;
-
-import java.awt.Graphics2D;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.awt.dnd.DnDConstants;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.imageio.ImageIO;
-import javax.swing.JFileChooser;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Element;
-import javax.swing.text.ElementIterator;
-import javax.swing.text.html.HTMLDocument;
-import javax.swing.text.html.HTMLEditorKit;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.ExampleFileFilter;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.FixedHTMLWriter;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.clipboard.MindMapNodesSelection;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapReader;
-import org.freeplane.features.map.MapReader.NodeTreeCreator;
-import org.freeplane.features.map.MapWriter.Hint;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.n3.nanoxml.XMLException;
-import org.freeplane.view.swing.features.filepreview.ExternalResource;
-import org.freeplane.view.swing.features.filepreview.ViewerController;
-import org.freeplane.view.swing.features.filepreview.ViewerController.PasteMode;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MClipboardController extends ClipboardController {
- public static final String RESOURCES_REMIND_USE_RICH_TEXT_IN_NEW_NODES = "remind_use_rich_text_in_new_nodes";
- private class DirectHtmlFlavorHandler implements IDataFlavorHandler {
- private String textFromClipboard;
-
- public DirectHtmlFlavorHandler(final String textFromClipboard) {
- this.textFromClipboard = textFromClipboard;
- }
-
- void paste(final NodeModel target) {
- textFromClipboard = cleanHtml(textFromClipboard);
- final NodeModel node = Controller.getCurrentModeController().getMapController().newNode(textFromClipboard,
- Controller.getCurrentController().getMap());
- final String text = textFromClipboard;
- final Matcher m = HREF_PATTERN.matcher(text);
- if (m.matches()) {
- final String body = m.group(2);
- if (!body.matches(".*<\\s*a.*")) {
- final String href = m.group(1);
- ((MLinkController) LinkController.getController()).setLinkTypeDependantLink(node, href);
- }
- }
- ((MMapController) Controller.getCurrentModeController().getMapController()).insertNode(node, target);
- }
-
- public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
- paste(target);
- }
- }
-
- private class FileListFlavorHandler implements IDataFlavorHandler {
- final List<File> fileList;
-
- public FileListFlavorHandler(final List<File> fileList) {
- super();
- this.fileList = fileList;
- }
-
- public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
- boolean pasteImages = dropAction == DnDConstants.ACTION_COPY;
- ViewerController viewerController = ((ViewerController)Controller.getCurrentModeController().getExtension(ViewerController.class));
- for (final File file : fileList) {
- if(pasteImages && viewerController.paste(file, target, PasteMode.valueOf(asSibling), isLeft)){
- continue;
- }
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- final NodeModel node = mapController.newNode(file.getName(), target.getMap());
- ((MLinkController) LinkController.getController()).setLinkTypeDependantLink(node, file);
- mapController.insertNode(node, target, asSibling, isLeft, isLeft);
- }
- }
- }
-
- interface IDataFlavorHandler {
- void paste(Transferable t, NodeModel target, boolean asSibling, boolean isLeft, int dropAction);
- }
-
- private class MindMapNodesFlavorHandler implements IDataFlavorHandler {
- private final String textFromClipboard;
-
- public MindMapNodesFlavorHandler(final String textFromClipboard) {
- this.textFromClipboard = textFromClipboard;
- }
-
- public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
- if (textFromClipboard != null) {
- paste(textFromClipboard, target, asSibling, isLeft);
- }
- }
-
- private void paste(final String text, final NodeModel target, final boolean asSibling, final boolean isLeft) {
- final String[] textLines = text.split(ClipboardController.NODESEPARATOR);
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- final MapReader mapReader = mapController.getMapReader();
- final NodeTreeCreator nodeTreeCreator = mapReader.nodeTreeCreator(target.getMap());
- nodeTreeCreator.setHint(Hint.MODE, Mode.CLIPBOARD);
- for (int i = 0; i < textLines.length; ++i) {
- try {
- final NodeModel newModel = nodeTreeCreator.create(new StringReader(textLines[i]));
- newModel.removeExtension(FreeNode.class);
- final boolean wasLeft = newModel.isLeft();
- mapController.insertNode(newModel, target, asSibling, isLeft, wasLeft != isLeft);
- }
- catch (final XMLException e) {
- LogUtils.severe("error on paste", e);
- }
- }
- nodeTreeCreator.finish(target);
- }
- }
-
- private static class PasteHtmlWriter extends FixedHTMLWriter {
- private final Element element;
-
- public PasteHtmlWriter(final Writer writer, final Element element, final HTMLDocument doc, final int pos,
- final int len) {
- super(writer, doc, pos, len);
- this.element = getStandAloneElement(element);
- }
-
- @Override
- protected ElementIterator getElementIterator() {
- return new ElementIterator(element);
- }
-
- private Element getStandAloneElement(final Element element) {
- final String name = element.getName();
- if (name.equals("ul") || name.equals("ol") || name.equals("table") || name.equals("html")) {
- return element;
- }
- return getStandAloneElement(element.getParentElement());
- }
-
- @Override
- public void write() throws IOException, BadLocationException {
- if (element.getName().equals("html")) {
- super.write();
- return;
- }
- write("<html>");
- super.write();
- write("</html>");
- }
- }
-
- private class StringFlavorHandler implements IDataFlavorHandler {
- private final String textFromClipboard;
-
- public StringFlavorHandler(final String textFromClipboard) {
- this.textFromClipboard = textFromClipboard;
- }
-
- public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
- final TextFragment[] textFragments = split(textFromClipboard);
- pasteStringWithoutRedisplay(textFragments, target, asSibling, isLeft);
- }
-
- private TextFragment[] split(final String textFromClipboard) {
- final LinkedList<TextFragment> textFragments = new LinkedList<TextFragment>();
- final String[] textLines = textFromClipboard.split("\n");
- for (int i = 0; i < textLines.length; ++i) {
- String text = textLines[i];
- text = text.replaceAll("\t", " ");
- if (text.matches(" *")) {
- continue;
- }
- int depth = 0;
- while (depth < text.length() && text.charAt(depth) == ' ') {
- ++depth;
- }
- final String visibleText = text.trim();
- final String link = LinkController.findLink(text);
- if (!visibleText.equals("")) {
- textFragments.add(new TextFragment(visibleText, link, depth));
- }
- }
- return textFragments.toArray(new TextFragment[textFragments.size()]);
- }
- }
-
- private class StructuredHtmlFlavorHandler implements IDataFlavorHandler {
- private final String textFromClipboard;
-
- public StructuredHtmlFlavorHandler(final String textFromClipboard) {
- this.textFromClipboard = textFromClipboard;
- }
-
- private String addFragment(final HTMLDocument doc, final Element element, final int depth, final int start,
- final int end, final LinkedList<TextFragment> htmlFragments)
- throws BadLocationException, IOException {
- final String paragraphText = doc.getText(start, end - start).trim();
- if (paragraphText.length() > 0) {
- final StringWriter out = new StringWriter();
- new PasteHtmlWriter(out, element, doc, start, end - start).write();
- final String string = out.toString();
- if (!string.equals("")) {
- final String link = LinkController.findLink(string);
- final TextFragment htmlFragment = new TextFragment(string, link, depth);
- htmlFragments.add(htmlFragment);
- }
- }
- return paragraphText;
- }
-
- private Element getParentElement(final HTMLDocument doc) {
- final Element htmlRoot = doc.getDefaultRootElement();
- final Element bodyElement = htmlRoot.getElement(htmlRoot.getElementCount() - 1);
- Element parentCandidate = bodyElement;
- do {
- if (parentCandidate.getElementCount() > 1) {
- return parentCandidate;
- }
- parentCandidate = parentCandidate.getElement(0);
- } while (!(parentCandidate.isLeaf() || parentCandidate.getName().equalsIgnoreCase("p-implied")));
- return bodyElement;
- }
-
- private boolean isSeparateElement(final Element current) {
- return !current.isLeaf();
- }
-
- public void paste(Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
- pasteHtmlWithoutRedisplay(textFromClipboard, target, asSibling, isLeft);
- }
-
- private void pasteHtmlWithoutRedisplay(final Object t, final NodeModel parent, final boolean asSibling,
- final boolean isLeft) {
- String textFromClipboard = (String) t;
- textFromClipboard = cleanHtml(textFromClipboard);
- final TextFragment[] htmlFragments = split(textFromClipboard);
- pasteStringWithoutRedisplay(htmlFragments, parent, asSibling, isLeft);
- }
-
- private void split(final HTMLDocument doc, final Element parent, final LinkedList<TextFragment> htmlFragments,
- int depth) throws BadLocationException, IOException {
- final int elementCount = parent.getElementCount();
- int headerDepth = 0;
- boolean headerFound = false;
- int start = -1;
- int end = -1;
- Element last = null;
- for (int i = 0; i < elementCount; i++) {
- final Element current = parent.getElement(i);
- final String name = current.getName();
- final Matcher matcher = HEADER_REGEX.matcher(name);
- if (matcher.matches()) {
- try {
- if (!headerFound) {
- depth--;
- }
- final int newHeaderDepth = Integer.parseInt(matcher.group(1));
- depth += newHeaderDepth - headerDepth;
- headerDepth = newHeaderDepth;
- headerFound = true;
- }
- catch (final NumberFormatException e) {
- LogUtils.severe(e);
- }
- }
- else {
- if (headerFound) {
- headerFound = false;
- depth++;
- }
- }
- final boolean separateElement = isSeparateElement(current);
- if (separateElement && current.getElementCount() != 0) {
- start = -1;
- last = null;
- split(doc, current, htmlFragments, depth + 1);
- continue;
- }
- if (separateElement && start != -1) {
- addFragment(doc, last, depth, start, end, htmlFragments);
- }
- if (start == -1 || separateElement) {
- start = current.getStartOffset();
- last = current;
- }
- end = current.getEndOffset();
- if (separateElement) {
- addFragment(doc, current, depth, start, end, htmlFragments);
- }
- }
- if (start != -1) {
- addFragment(doc, last, depth, start, end, htmlFragments);
- }
- }
-
- private TextFragment[] split(final String text) {
- final LinkedList<TextFragment> htmlFragments = new LinkedList<TextFragment>();
- final HTMLEditorKit kit = new HTMLEditorKit();
- final HTMLDocument doc = new HTMLDocument();
- final StringReader buf = new StringReader(text);
- try {
- kit.read(buf, doc, 0);
- final Element parent = getParentElement(doc);
- split(doc, parent, htmlFragments, 0);
- }
- catch (final IOException e) {
- LogUtils.severe(e);
- }
- catch (final BadLocationException e) {
- LogUtils.severe(e);
- }
- return htmlFragments.toArray(new TextFragment[htmlFragments.size()]);
- }
- }
-
- private static class TextFragment {
- int depth;
- String link;
- String text;
-
- public TextFragment(final String text, final String link, final int depth) {
- super();
- this.text = text;
- this.depth = depth;
- this.link = link;
- }
- }
-
- private class ImageFlavorHandler implements IDataFlavorHandler {
- private static final String IMAGE_FORMAT = "png";
- final private BufferedImage image;
-
- public ImageFlavorHandler(BufferedImage img) {
- super();
- BufferedImage fixedImg = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
- Graphics2D fig = fixedImg.createGraphics();
- fig.drawImage(img, 0, 0, null);
- fig.dispose();
- fixedImg.flush();
- this.image = fixedImg;
- }
-
- public void paste(Transferable t, NodeModel target, boolean asSibling, boolean isLeft, int dropAction) {
- final ModeController modeController = Controller.getCurrentModeController();
- final MMapController mapController = (MMapController) modeController.getMapController();
- File mindmapFile = target.getMap().getFile();
- if(mindmapFile == null) {
- UITools.errorMessage(TextUtils.getRawText("map_not_saved"));
- return;
- }
- final String mmFileName = mindmapFile.getName();
- String fileNameTemplate = mmFileName.substring(0, mmFileName.lastIndexOf('.')) + "_";
- while (fileNameTemplate.length() < 3)
- fileNameTemplate = fileNameTemplate + '_';
- //file that we'll save to disk.
- File file;
- try {
- final File dir = mindmapFile.getParentFile();
- file = File.createTempFile(fileNameTemplate, "."+IMAGE_FORMAT, dir);
- String imgfilepath=file.getAbsolutePath();
- File tempFile = file = new File(imgfilepath);
- final JFileChooser fileChooser = new JFileChooser(file);
- final ExampleFileFilter filter = new ExampleFileFilter();
- filter.addExtension(IMAGE_FORMAT);
- fileChooser.setAcceptAllFileFilterUsed(false);
- fileChooser.setFileFilter(filter);
- fileChooser.setSelectedFile(file);
- int returnVal = fileChooser.showSaveDialog(UITools.getFrame());
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- tempFile.delete();
- return;
- }
- file = fileChooser.getSelectedFile();
- if(tempFile.exists() && ! file.getAbsoluteFile().equals(tempFile)){
- tempFile.delete();
- }
- if(file.isDirectory())
- return;
- if(! FileUtils.getExtension(file.getName()).equals(IMAGE_FORMAT))
- file = new File(file.getPath() + '.' + IMAGE_FORMAT);
- final URI uri = LinkController.toLinkTypeDependantURI(mindmapFile, file);
- ImageIO.write(image, IMAGE_FORMAT, file);
- final NodeModel node = mapController.newNode(file.getName(), target.getMap());
- final ExternalResource extension = new ExternalResource(uri);
- node.addExtension(extension);
- mapController.insertNode(node, target, asSibling, isLeft, isLeft);
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- private static final Pattern HEADER_REGEX = Pattern.compile("h(\\d)", Pattern.CASE_INSENSITIVE);
- private static final Pattern HREF_PATTERN = Pattern
- .compile("<html>\\s*<body>\\s*<a\\s+href=\"([^>]+)\">(.*)</a>\\s*</body>\\s*</html>");
- private static final String RESOURCE_UNFOLD_ON_PASTE = "unfold_on_paste";
- public static final String RESOURCES_CUT_NODES_WITHOUT_QUESTION = "cut_nodes_without_question";
-
- public static String firstLetterCapitalized(final String text) {
- if (text == null || text.length() == 0) {
- return text;
- }
- return text.substring(0, 1).toUpperCase() + text.substring(1, text.length());
- }
-
- private List<NodeModel> newNodes;
-
- /**
- * @param modeController
- */
- public MClipboardController() {
- super();
- createActions();
- }
-
- private String cleanHtml(String in) {
- in = in.replaceFirst("(?i)(?s)<head>.*</head>", "").replaceFirst("(?i)(?s)^.*<html[^>]*>", "<html>")
- .replaceFirst("(?i)(?s)<body [^>]*>", "<body>").replaceAll("(?i)(?s)<script.*?>.*?</script>", "")
- .replaceAll("(?i)(?s)</?tbody.*?>", "").replaceAll("(?i)(?s)<!--.*?-->", "").replaceAll(
- "(?i)(?s)</?o[^>]*>", "");
- if (StringUtils.equals(ResourceController.getResourceController().getProperty(
- "cut_out_pictures_when_pasting_html"), "true")) {
- in = in.replaceAll("(?i)(?s)<img[^>]*>", "");
- }
- in = HtmlUtils.unescapeHTMLUnicodeEntity(in);
- return in;
- }
-
- /**
- * @param modeController
- */
- private void createActions() {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addAction(new CutAction());
- modeController.addAction(new PasteAction());
- modeController.addAction(new SelectedPasteAction());
- }
-
- Transferable cut(final List<NodeModel> collection) {
- Controller.getCurrentModeController().getMapController().sortNodesByDepth(collection);
- final Transferable totalCopy = ((ClipboardController) Controller.getCurrentModeController().getExtension(
- ClipboardController.class)).copy(collection, true);
- for (final NodeModel node : collection) {
- if (node.getParentNode() != null) {
- ((MMapController) Controller.getCurrentModeController().getMapController()).deleteNode(node);
- }
- }
- setClipboardContents(totalCopy);
- return totalCopy;
- }
-
- private IDataFlavorHandler getFlavorHandler(final Transferable t) {
- if (t.isDataFlavorSupported(MindMapNodesSelection.mindMapNodesFlavor)) {
- try {
- final String textFromClipboard = t.getTransferData(MindMapNodesSelection.mindMapNodesFlavor).toString();
- return new MindMapNodesFlavorHandler(textFromClipboard);
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- if (t.isDataFlavorSupported(MindMapNodesSelection.fileListFlavor)) {
- try {
- final List<File> fileList = castToFileList(t.getTransferData(MindMapNodesSelection.fileListFlavor));
- if (!shouldIgnoreFileListFlavor(fileList))
- return new FileListFlavorHandler(fileList);
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- final ResourceController resourceController = ResourceController.getResourceController();
- if (t.isDataFlavorSupported(MindMapNodesSelection.htmlFlavor)) {
- try {
- final String textFromClipboard = t.getTransferData(MindMapNodesSelection.htmlFlavor).toString();
- if (textFromClipboard.charAt(0) != 65533) {
- if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
- final MTextController textController = (MTextController) TextController
- .getController();
- final boolean richText = textController.useRichTextInEditor(RESOURCES_REMIND_USE_RICH_TEXT_IN_NEW_NODES);
- if (richText) {
- final boolean structuredHtmlImport = resourceController
- .getBooleanProperty("structured_html_import");
- final IDataFlavorHandler htmlFlavorHandler;
- if (structuredHtmlImport) {
- htmlFlavorHandler = new StructuredHtmlFlavorHandler(textFromClipboard);
- }
- else {
- htmlFlavorHandler = new DirectHtmlFlavorHandler(textFromClipboard);
- }
- return htmlFlavorHandler;
- }
- }
- }
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
- try {
- final String plainTextFromClipboard = t.getTransferData(DataFlavor.stringFlavor).toString();
- return new StringFlavorHandler(plainTextFromClipboard);
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
- try {
- BufferedImage image = (BufferedImage) t.getTransferData(DataFlavor.imageFlavor);
- return new ImageFlavorHandler(image);
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- return null;
- }
-
- private boolean shouldIgnoreFileListFlavor(final List<File> fileList) {
- if(fileList.isEmpty())
- return true;
- final File file = fileList.get(0);
- if(file.isDirectory())
- return false;
- final String name = file.getName();
- return name.endsWith(".URL") || name.endsWith(".url");
- }
-
- @SuppressWarnings("unchecked")
- private List<File> castToFileList(Object transferData) {
- return (List<File>) transferData;
- }
-
- Collection<IDataFlavorHandler> getFlavorHandlers() {
- final Transferable t = getClipboardContents();
- final Collection<IDataFlavorHandler> handlerList = new LinkedList<IDataFlavorHandler>();
- if (t.isDataFlavorSupported(MindMapNodesSelection.mindMapNodesFlavor)) {
- try {
- final String textFromClipboard = t.getTransferData(MindMapNodesSelection.mindMapNodesFlavor).toString();
- handlerList.add(new MindMapNodesFlavorHandler(textFromClipboard));
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- if (t.isDataFlavorSupported(MindMapNodesSelection.htmlFlavor)) {
- try {
- final String textFromClipboard = t.getTransferData(MindMapNodesSelection.htmlFlavor).toString();
- if (textFromClipboard.charAt(0) != 65533) {
- if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
- handlerList.add(new StructuredHtmlFlavorHandler(textFromClipboard));
- handlerList.add(new DirectHtmlFlavorHandler(textFromClipboard));
- }
- }
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
- try {
- final String plainTextFromClipboard = t.getTransferData(DataFlavor.stringFlavor).toString();
- handlerList.add(new StringFlavorHandler(plainTextFromClipboard));
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- if (t.isDataFlavorSupported(MindMapNodesSelection.fileListFlavor)) {
- try {
- final List<File> fileList = castToFileList(t.getTransferData(MindMapNodesSelection.fileListFlavor));
- handlerList.add(new FileListFlavorHandler(fileList));
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- if (t.isDataFlavorSupported(DataFlavor.imageFlavor)) {
- try {
- BufferedImage image = (BufferedImage) t.getTransferData(DataFlavor.imageFlavor);
- handlerList.add(new ImageFlavorHandler(image));
- }
- catch (final UnsupportedFlavorException e) {
- }
- catch (final IOException e) {
- }
- }
- return handlerList;
- }
- public void paste(final Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft) {
- paste(t, target, asSibling, isLeft, DnDConstants.ACTION_NONE);
- }
-
- public void paste(final Transferable t, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
- if (t == null) {
- return;
- }
- /*
- * DataFlavor[] fl = t.getTransferDataFlavors(); for (int i = 0; i <
- * fl.length; i++) { System.out.println(fl[i]); }
- */
- final IDataFlavorHandler handler = getFlavorHandler(t);
- paste(t, handler, target, asSibling, isLeft, dropAction);
- }
-
- void paste(final Transferable t, final IDataFlavorHandler handler, final NodeModel target, final boolean asSibling, final boolean isLeft) {
- paste(t, handler, target, asSibling, isLeft, DnDConstants.ACTION_NONE);
- }
-
- void paste(final Transferable t, final IDataFlavorHandler handler, final NodeModel target, final boolean asSibling, final boolean isLeft, int dropAction) {
- if (handler == null) {
- return;
- }
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- if (asSibling && !mapController.isWriteable(target.getParentNode()) || !asSibling
- && !mapController.isWriteable(target)) {
- final String message = TextUtils.getText("node_is_write_protected");
- UITools.errorMessage(message);
- return;
- }
- try {
- Controller.getCurrentController().getViewController().setWaitingCursor(true);
- if (newNodes == null) {
- newNodes = new LinkedList<NodeModel>();
- }
- newNodes.clear();
- handler.paste(t, target, asSibling, isLeft, dropAction);
- final ModeController modeController = Controller.getCurrentModeController();
- if (!asSibling && modeController.getMapController().isFolded(target)
- && ResourceController.getResourceController().getBooleanProperty(RESOURCE_UNFOLD_ON_PASTE)) {
- modeController.getMapController().setFolded(target, false);
- }
- for (final NodeModel child : newNodes) {
- AttributeController.getController().performRegistrySubtreeAttributes(child);
- }
- }
- finally {
- Controller.getCurrentController().getViewController().setWaitingCursor(false);
- }
- }
-
- private void pasteStringWithoutRedisplay(final TextFragment[] textFragments, NodeModel parent,
- final boolean asSibling, final boolean isLeft) {
- final MapModel map = parent.getMap();
- int insertionIndex;
- if (asSibling) {
- NodeModel target = parent;
- parent = parent.getParentNode();
- insertionIndex = parent.getChildPosition(target);
- }
- else{
- insertionIndex = parent.getChildCount();
- }
- final ArrayList<NodeModel> parentNodes = new ArrayList<NodeModel>();
- final ArrayList<Integer> parentNodesDepths = new ArrayList<Integer>();
- parentNodes.add(parent);
- parentNodesDepths.add(new Integer(-1));
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- for (int i = 0; i < textFragments.length; ++i) {
- final TextFragment textFragment = textFragments[i];
- String text = textFragment.text;
- final String link = textFragment.link;
- URI uri = null;
- if (link != null) {
- try {
- URI linkUri = new URI(link);
- uri = linkUri;
-
- File absoluteFile = UrlManager.getController().getAbsoluteFile(map, uri);
- if(absoluteFile != null) {
- //if ("file".equals(linkUri.getScheme())) {
- final File mapFile = map.getFile();
- uri = LinkController.toLinkTypeDependantURI(mapFile, absoluteFile);
- if(link.equals(text)){
- text = uri.toString();
- }
- }
-
- }
- catch (Exception e) {
- }
- }
- final NodeModel node = mapController.newNode(text, map);
- if(uri != null){
- NodeLinks.createLinkExtension(node).setHyperLink(uri);
- }
- for (int j = parentNodes.size() - 1; j >= 0; --j) {
- if (textFragment.depth > ((Integer) parentNodesDepths.get(j)).intValue()) {
- for (int k = j + 1; k < parentNodes.size(); ++k) {
- final NodeModel n = (NodeModel) parentNodes.get(k);
- if (n.getParentNode() == null) {
- mapController.insertNode(n, parent, insertionIndex++);
- }
- parentNodes.remove(k);
- parentNodesDepths.remove(k);
- }
- final NodeModel target = (NodeModel) parentNodes.get(j);
- node.setLeft(isLeft);
- if (target != parent) {
- target.setFolded(true);
- target.insert(node, target.getChildCount());
- }
- parentNodes.add(node);
- parentNodesDepths.add(new Integer(textFragment.depth));
- break;
- }
- }
- }
- {
- for (int k = 0; k < parentNodes.size(); ++k) {
- final NodeModel n = (NodeModel) parentNodes.get(k);
- if (map.getRootNode() != n && n.getParentNode() == null) {
- mapController.insertNode(n, parent, insertionIndex++);
- }
- }
- }
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/cloud/CloudBuilder.java b/freeplane/src/org/freeplane/features/cloud/CloudBuilder.java
deleted file mode 100644
index bc4d008..0000000
--- a/freeplane/src/org/freeplane/features/cloud/CloudBuilder.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.cloud;
-
-import java.awt.Color;
-import java.io.IOException;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IElementWriter;
-import org.freeplane.core.io.IExtensionElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapWriter;
-import org.freeplane.features.map.NodeBuilder;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-class CloudBuilder implements IElementDOMHandler, IExtensionElementWriter, IElementWriter {
-// private final MapController mapController;
- private final CloudController cc;
-
- public CloudBuilder(final MapController mapController, final CloudController cc) {
-// this.mapController = mapController;
- this.cc = cc;
- }
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (tag.equals("cloud")) {
- final CloudModel oldCloud = CloudModel.getModel((NodeModel) parent);
- return oldCloud != null ? oldCloud : new CloudModel();
- }
- return null;
- }
-
- public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
- if (parent instanceof NodeModel) {
- final NodeModel node = (NodeModel) parent;
- if (userObject instanceof CloudModel) {
- final CloudModel cloud = (CloudModel) userObject;
- CloudModel.setModel(node, cloud);
- }
- }
- }
-
- private void registerAttributeHandlers(final ReadManager reader) {
- reader.addAttributeHandler("cloud", "STYLE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- // final CloudModel cloud = (CloudModel) userObject;
- // cloud.setStyle(value.toString());
- }
- });
- reader.addAttributeHandler("cloud", "COLOR", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final CloudModel cloud = (CloudModel) userObject;
- cloud.setColor(ColorUtils.stringToColor(value.toString()));
- }
- });
- reader.addAttributeHandler("cloud", "SHAPE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final CloudModel cloud = (CloudModel) userObject;
- cloud.setShape(CloudModel.Shape.valueOf(value));
- }
- });
- reader.addAttributeHandler("cloud", "WIDTH", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- // final CloudModel cloud = (CloudModel) userObject;
- // cloud.setWidth(Integer.parseInt(value.toString()));
- }
- });
- }
-
- /**
- */
- public void registerBy(final ReadManager reader, final WriteManager writer) {
- reader.addElementHandler("cloud", this);
- registerAttributeHandlers(reader);
- writer.addExtensionElementWriter(CloudModel.class, this);
- writer.addElementWriter(NodeBuilder.XML_NODE, this);
- writer.addElementWriter(NodeBuilder.XML_STYLENODE, this);
- }
-
- public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
- }
-
- public void writeContent(final ITreeWriter writer, final Object userObject, final String tag) throws IOException {
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (!forceFormatting) {
- return;
- }
- writeContentImpl(writer, (NodeModel) userObject, null);
- }
-
- public void writeContent(final ITreeWriter writer, final Object userObject, final IExtension extension)
- throws IOException {
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (forceFormatting) {
- return;
- }
- writeContentImpl(writer, null, extension);
- }
-
- private void writeContentImpl(final ITreeWriter writer, final NodeModel node, final IExtension extension)
- throws IOException {
- final CloudModel model = extension != null ? (CloudModel) extension : cc.getCloud(node);
- if (model == null) {
- return;
- }
- final XMLElement cloud = new XMLElement();
- cloud.setName("cloud");
- // final String style = model.getStyle();
- // if (style != null) {
- // cloud.setAttribute("STYLE", style);
- // }
- final Color color = model.getColor();
- if (color != null) {
- cloud.setAttribute("COLOR", ColorUtils.colorToString(color));
- }
- final CloudModel.Shape shape = model.getShape();
- if (shape != null) {
- cloud.setAttribute("SHAPE", shape.toString());
- }
- // final int width = model.getWidth();
- // if (width != CloudController.DEFAULT_WIDTH) {
- // cloud.setAttribute("WIDTH", Integer.toString(width));
- // }
- writer.addElement(model, cloud);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/edge/EdgeBuilder.java b/freeplane/src/org/freeplane/features/edge/EdgeBuilder.java
deleted file mode 100644
index 9420440..0000000
--- a/freeplane/src/org/freeplane/features/edge/EdgeBuilder.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.edge;
-
-import java.awt.Color;
-import java.io.IOException;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IElementWriter;
-import org.freeplane.core.io.IExtensionElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.features.map.MapWriter;
-import org.freeplane.features.map.NodeBuilder;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-class EdgeBuilder implements IElementDOMHandler, IExtensionElementWriter, IElementWriter {
- private final EdgeController ec;
-
- public EdgeBuilder(final EdgeController ec) {
- this.ec = ec;
- }
-
- protected EdgeModel createEdge(final NodeModel node) {
- return EdgeModel.createEdgeModel(node);
- }
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (tag.equals("edge")) {
- return createEdge((NodeModel) parent);
- }
- return null;
- }
-
- public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
- /* attributes */
- if (parent instanceof NodeModel) {
- final NodeModel node = (NodeModel) parent;
- if (userObject instanceof EdgeModel) {
- final EdgeModel edge = (EdgeModel) userObject;
- EdgeModel.setModel(node, edge);
- }
- return;
- }
- }
-
- private void registerAttributeHandlers(final ReadManager reader) {
- reader.addAttributeHandler("edge", "STYLE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final EdgeModel edge = (EdgeModel) userObject;
- edge.setStyle(EdgeStyle.getStyle(value));
- }
- });
- reader.addAttributeHandler("edge", "HIDE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final EdgeModel edge = (EdgeModel) userObject;
- edge.setStyle(EdgeStyle.EDGESTYLE_HIDDEN);
- }
- });
- reader.addAttributeHandler("edge", "COLOR", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final EdgeModel edge = (EdgeModel) userObject;
- edge.setColor(ColorUtils.stringToColor(value.toString()));
- }
- });
- reader.addAttributeHandler("edge", "WIDTH", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final EdgeModel edge = (EdgeModel) userObject;
- if (value.equals(EdgeModel.EDGEWIDTH_THIN)) {
- edge.setWidth(EdgeModel.WIDTH_THIN);
- }
- else {
- edge.setWidth(Integer.parseInt(value.toString()));
- }
- }
- });
- }
-
- /**
- */
- public void registerBy(final ReadManager reader, final WriteManager writer) {
- reader.addElementHandler("edge", this);
- registerAttributeHandlers(reader);
- writer.addExtensionElementWriter(EdgeModel.class, this);
- writer.addElementWriter(NodeBuilder.XML_NODE, this);
- writer.addElementWriter(NodeBuilder.XML_STYLENODE, this);
- }
-
- public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
- }
-
- public void writeContent(final ITreeWriter writer, final Object element, final String tag) throws IOException {
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (!forceFormatting) {
- return;
- }
- final NodeModel node = (NodeModel) element;
- writeContent(writer, node, null, forceFormatting);
- }
-
- public void writeContent(final ITreeWriter writer, final Object userObject, final IExtension extension)
- throws IOException {
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (forceFormatting) {
- return;
- }
- final EdgeModel model = (EdgeModel) extension;
- writeContent(writer, null, model, forceFormatting);
- }
-
- private void writeContent(final ITreeWriter writer, final NodeModel node, final EdgeModel model,
- final boolean forceFormatting) throws IOException {
- final EdgeStyle styleObj = forceFormatting ? ec.getStyle(node) : model.getStyle();
- final String style = EdgeStyle.toString(styleObj);
- final Color color = forceFormatting ? ec.getColor(node) : model.getColor();
- final int width = forceFormatting ? ec.getWidth(node) : model.getWidth();
- if (forceFormatting || style != null || color != null || width != EdgeModel.DEFAULT_WIDTH) {
- final XMLElement edge = new XMLElement();
- edge.setName("edge");
- boolean relevant = false;
- if (style != null) {
- if (style.equals(EdgeStyle.EDGESTYLE_HIDDEN)) {
- edge.setAttribute("HIDE", "true");
- relevant = true;
- }
- edge.setAttribute("STYLE", style);
- relevant = true;
- }
- if (color != null) {
- edge.setAttribute("COLOR", ColorUtils.colorToString(color));
- relevant = true;
- }
- if (width != EdgeModel.WIDTH_PARENT) {
- if (width == EdgeModel.WIDTH_THIN) {
- edge.setAttribute("WIDTH", EdgeModel.EDGEWIDTH_THIN);
- }
- else {
- edge.setAttribute("WIDTH", Integer.toString(width));
- }
- relevant = true;
- }
- if (relevant) {
- writer.addElement(model, edge);
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/edge/EdgeController.java b/freeplane/src/org/freeplane/features/edge/EdgeController.java
deleted file mode 100644
index a51ab0d..0000000
--- a/freeplane/src/org/freeplane/features/edge/EdgeController.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.edge;
-
-import java.awt.Color;
-import java.util.Collection;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ExclusivePropertyChain;
-import org.freeplane.features.mode.IPropertyHandler;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyleModel;
-
-/**
- * @author Dimitry Polivaev
- */
-public class EdgeController implements IExtension {
- public static final EdgeStyle STANDARD_EDGE_STYLE = EdgeStyle.EDGESTYLE_BEZIER;
- public static final Color STANDARD_EDGE_COLOR = Color.GRAY;
-
- public static EdgeController getController() {
- return getController(Controller.getCurrentModeController());
- }
-
- public static EdgeController getController(ModeController modeController) {
- return (EdgeController) modeController.getExtension(EdgeController.class);
- }
- public static void install( final EdgeController edgeController) {
- Controller.getCurrentModeController().addExtension(EdgeController.class, edgeController);
- }
-
- final private ExclusivePropertyChain<Color, NodeModel> colorHandlers;
-// private final ModeController modeController;
- final private ExclusivePropertyChain<EdgeStyle, NodeModel> styleHandlers;
- final private ExclusivePropertyChain<Integer, NodeModel> widthHandlers;
-
- public EdgeController(final ModeController modeController) {
-// this.modeController = modeController;
- colorHandlers = new ExclusivePropertyChain<Color, NodeModel>();
- styleHandlers = new ExclusivePropertyChain<EdgeStyle, NodeModel>();
- widthHandlers = new ExclusivePropertyChain<Integer, NodeModel>();
- addColorGetter(IPropertyHandler.STYLE, new IPropertyHandler<Color, NodeModel>() {
- public Color getProperty(final NodeModel node, final Color currentValue) {
- return getStyleEdgeColor(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
- }
- });
- addColorGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Color, NodeModel>() {
- public Color getProperty(NodeModel node, final Color currentValue) {
- if(node.getParentNode() != null){
- return null;
- }
- return STANDARD_EDGE_COLOR;
- }
- });
- addStyleGetter(IPropertyHandler.STYLE, new IPropertyHandler<EdgeStyle, NodeModel>() {
- public EdgeStyle getProperty(final NodeModel node, final EdgeStyle currentValu) {
- return getStyleStyle(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
- }
- });
- addStyleGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<EdgeStyle, NodeModel>() {
- public EdgeStyle getProperty(NodeModel node, final EdgeStyle currentValue) {
- if(node.getParentNode() != null){
- return null;
- }
- return STANDARD_EDGE_STYLE;
- }
- });
- addWidthGetter(IPropertyHandler.STYLE, new IPropertyHandler<Integer, NodeModel>() {
- public Integer getProperty(final NodeModel node, final Integer currentValue) {
- return getStyleWidth(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
- }
- });
-
- addWidthGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Integer, NodeModel>() {
- public Integer getProperty(NodeModel node, final Integer currentValue) {
- if(node.getParentNode() != null){
- return null;
- }
- return new Integer(EdgeModel.WIDTH_THIN);
- }
- });
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- final ReadManager readManager = mapController.getReadManager();
- final WriteManager writeManager = mapController.getWriteManager();
- final EdgeBuilder edgeBuilder = new EdgeBuilder(this);
- edgeBuilder.registerBy(readManager, writeManager);
- }
-
- public IPropertyHandler<Color, NodeModel> addColorGetter(final Integer key,
- final IPropertyHandler<Color, NodeModel> getter) {
- return colorHandlers.addGetter(key, getter);
- }
-
- public IPropertyHandler<EdgeStyle, NodeModel> addStyleGetter(final Integer key,
- final IPropertyHandler<EdgeStyle, NodeModel> getter) {
- return styleHandlers.addGetter(key, getter);
- }
-
- public IPropertyHandler<Integer, NodeModel> addWidthGetter(final Integer key,
- final IPropertyHandler<Integer, NodeModel> getter) {
- return widthHandlers.addGetter(key, getter);
- }
-
- public Color getColor(final NodeModel node) {
- return getColor(node, true);
- }
-
- public Color getColor(final NodeModel node, final boolean resolveParent) {
- final Color color = colorHandlers.getProperty(node);
- if(color == null && resolveParent)
- return getColor(node.getParentNode());
- return color;
- }
-
- public EdgeStyle getStyle(final NodeModel node) {
- return getStyle(node, true);
- }
-
- public EdgeStyle getStyle(final NodeModel node, final boolean resolveParent) {
- final EdgeStyle style = styleHandlers.getProperty(node);
- if(style == null && resolveParent)
- return getStyle(node.getParentNode());
- return style;
- }
-
- public int getWidth(final NodeModel node) {
- return getWidth(node, true);
- }
-
- public Integer getWidth(final NodeModel node, final boolean resolveParent) {
- final Integer width = widthHandlers.getProperty(node);
- if(width == null && resolveParent)
- return getWidth(node.getParentNode());
- return width;
- }
-
- public IPropertyHandler<Color, NodeModel> removeColorGetter(final Integer key) {
- return colorHandlers.removeGetter(key);
- }
-
- public IPropertyHandler<EdgeStyle, NodeModel> removeStyleGetter(final Integer key) {
- return styleHandlers.removeGetter(key);
- }
-
- public IPropertyHandler<Integer, NodeModel> removeWidthGetter(final Integer key) {
- return widthHandlers.removeGetter(key);
- }
-
- private Color getStyleEdgeColor(final MapModel map, final Collection<IStyle> collection) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- for(IStyle styleKey : collection){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final EdgeModel styleModel = EdgeModel.getModel(styleNode);
- if (styleModel == null) {
- continue;
- }
- final Color styleColor = styleModel.getColor();
- if (styleColor == null) {
- continue;
- }
- return styleColor;
- }
- return null;
- }
-
- private Integer getStyleWidth(final MapModel map, final Collection<IStyle> collection) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- for(IStyle styleKey : collection){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final EdgeModel styleModel = EdgeModel.getModel(styleNode);
- if (styleModel == null) {
- continue;
- }
- final int width = styleModel.getWidth();
- if (width == EdgeModel.DEFAULT_WIDTH ) {
- continue;
- }
- return width;
- }
- return null;
- }
-
- private EdgeStyle getStyleStyle(final MapModel map, final Collection<IStyle> collection) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- for(IStyle styleKey : collection){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final EdgeModel styleModel = EdgeModel.getModel(styleNode);
- if (styleModel == null) {
- continue;
- }
- final EdgeStyle style = styleModel.getStyle();
- if (style == null) {
- continue;
- }
- return style;
- }
- return null;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/AutomaticEdgeColorHook.java b/freeplane/src/org/freeplane/features/edge/mindmapmode/AutomaticEdgeColorHook.java
deleted file mode 100644
index 11ee1f8..0000000
--- a/freeplane/src/org/freeplane/features/edge/mindmapmode/AutomaticEdgeColorHook.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2010 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.edge.mindmapmode;
-
-import java.awt.Color;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
-import org.freeplane.features.edge.EdgeController;
-import org.freeplane.features.edge.EdgeModel;
-import org.freeplane.features.map.AMapChangeListenerAdapter;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.styles.LogicalStyleModel;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Nov 28, 2010
- */
-
- at NodeHookDescriptor(hookName = "AutomaticEdgeColor")
-public class AutomaticEdgeColorHook extends PersistentNodeHook implements IExtension{
- private ModeController modeController;
-
- private class Listener extends AMapChangeListenerAdapter{
- @Override
- public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
- if(!isActive(child) || modeController.isUndoAction()){
- return;
- }
- if(MapStyleModel.FLOATING_STYLE.equals(LogicalStyleModel.getStyle(child)))
- return;
- if(parent.isRoot()){
- final EdgeModel edgeModel = EdgeModel.createEdgeModel(child);
- if(null == edgeModel.getColor()){
- final MEdgeController controller = (MEdgeController) EdgeController.getController();
- final AutomaticEdgeColor model = (AutomaticEdgeColor) getMapHook();
- controller.setColor(child, model.nextColor());
- }
- }
- else{
- final MEdgeController controller = (MEdgeController) EdgeController.getController();
- controller.setColor(child, null);
- final boolean edgeStylesEquals = controller.getColor(child).equals(controller.getColor(parent));
- if(! edgeStylesEquals){
- OptionalDontShowMeAgainDialog.show("edge_is_formatted_by_style", "confirmation",
- "ignore_edge_format_by_style", OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_SHOWN);
- }
- }
- }
-
- @Override
- public void onNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- onNodeInserted(newParent, child, newIndex);
- }
- }
-
- public AutomaticEdgeColorHook() {
- super();
- final Listener listener = new Listener();
- modeController = Controller.getCurrentModeController();
- modeController.addExtension(AutomaticEdgeColorHook.class, this);
- final MapController mapController = modeController.getMapController();
- mapController.addMapChangeListener(listener);
- }
-
- @Override
- protected Class<? extends IExtension> getExtensionClass() {
- return AutomaticEdgeColor.class;
- }
-
- @Override
- protected IExtension createExtension(final NodeModel node, final XMLElement element) {
- final int colorCount;
- if(element == null){
- colorCount = 0;
- }
- else{
- colorCount = element.getAttribute("COUNTER", 0);
- }
-
- return new AutomaticEdgeColor(colorCount);
- }
-
- @Override
- protected void saveExtension(IExtension extension, XMLElement element) {
- super.saveExtension(extension, element);
- final int colorCount = ((AutomaticEdgeColor)extension).getColorCount();
- element.setAttribute("COUNTER", Integer.toString(colorCount));
- }
-}
-
-class AutomaticEdgeColor implements IExtension{
- private int colorCount;
- int getColorCount() {
- return colorCount;
- }
- public AutomaticEdgeColor(int colorCount) {
- super();
- this.colorCount = colorCount;
- }
- private static final Color[] COLORS = new Color[]{
- Color.RED, Color.BLUE, Color.GREEN, Color.MAGENTA, Color.CYAN, Color.YELLOW,
- Color.RED.darker().darker(), Color.BLUE.darker().darker(), Color.GREEN.darker().darker(), Color.MAGENTA.darker().darker(), Color.CYAN.darker().darker(), Color.YELLOW.darker().darker()};
- Color nextColor() {
- if(colorCount >= COLORS.length){
- colorCount = 0;
- }
- return COLORS[colorCount++];
- }
-}
-
diff --git a/freeplane/src/org/freeplane/features/edge/mindmapmode/MEdgeController.java b/freeplane/src/org/freeplane/features/edge/mindmapmode/MEdgeController.java
deleted file mode 100644
index 02a26dc..0000000
--- a/freeplane/src/org/freeplane/features/edge/mindmapmode/MEdgeController.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.edge.mindmapmode;
-
-import java.awt.Color;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.edge.EdgeController;
-import org.freeplane.features.edge.EdgeModel;
-import org.freeplane.features.edge.EdgeStyle;
-import org.freeplane.features.map.IExtensionCopier;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.LogicalStyleKeys;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MEdgeController extends EdgeController {
- private static class ExtensionCopier implements IExtensionCopier {
- final private ModeController modeController;
-
- public ExtensionCopier(ModeController modeController) {
- this.modeController = modeController;
- }
-
- public void copy(final Object key, final NodeModel from, final NodeModel to) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- copy(from, to);
- }
-
- public void copy(final NodeModel from, final NodeModel to) {
- final EdgeModel fromStyle = (EdgeModel) from.getExtension(EdgeModel.class);
- if (fromStyle == null) {
- return;
- }
- final EdgeModel toStyle = EdgeModel.createEdgeModel(to);
- final Color color = fromStyle.getColor();
- if(color != null)
- toStyle.setColor(color);
- final EdgeStyle style = fromStyle.getStyle();
- if(style != null)
- toStyle.setStyle(style);
- final int width = fromStyle.getWidth();
- if(width != EdgeModel.DEFAULT_WIDTH)
- toStyle.setWidth(width);
- }
-
- public void remove(final Object key, final NodeModel from) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- from.removeExtension(EdgeModel.class);
- }
-
- public void remove(final Object key, final NodeModel from, final NodeModel which) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- final EdgeModel whichStyle = (EdgeModel) which.getExtension(EdgeModel.class);
- if (whichStyle == null) {
- return;
- }
- final EdgeModel fromStyle = (EdgeModel) from.getExtension(EdgeModel.class);
- if (fromStyle == null) {
- return;
- }
- from.removeExtension(fromStyle);
- EdgeModel delta = new EdgeModel();
- final Color color = fromStyle.getColor();
- boolean deltaFound = false;
- if(color != null && whichStyle.getColor() == null){
- delta.setColor(color);
- deltaFound = true;
- }
- final EdgeStyle style = fromStyle.getStyle();
- if(style != null && whichStyle.getStyle() == null){
- delta.setStyle(style);
- deltaFound = true;
- }
- final int width = fromStyle.getWidth();
- if(width != EdgeModel.DEFAULT_WIDTH && whichStyle.getWidth() == EdgeModel.DEFAULT_WIDTH){
- delta.setWidth(width);
- deltaFound = true;
- }
- if(deltaFound)
- from.addExtension(delta);
- }
-
- public void resolveParentExtensions(Object key, NodeModel to) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- resolveColor(to);
- resolveWidth(to);
- resolveStyle(to);
- }
-
- private void resolveColor(NodeModel to) {
- if (null != getColor(to))
- return;
- for(NodeModel source = to.getParentNode(); source != null; source = source.getParentNode() ){
- final Color color = getColor(source);
- if(color != null){
- EdgeModel.createEdgeModel(to).setColor(color);
- return;
- }
- }
- }
-
- private Color getColor(NodeModel node) {
- return modeController.getExtension(EdgeController.class).getColor(node, false);
- }
-
- private void resolveWidth(NodeModel to) {
- if (null != getWidth(to))
- return;
- for(NodeModel source = to.getParentNode(); source != null; source = source.getParentNode() ){
- final Integer width = getWidth(source);
- if(width != null){
- EdgeModel.createEdgeModel(to).setWidth(width);
- return;
- }
- }
- }
-
- private Integer getWidth(NodeModel node) {
- return modeController.getExtension(EdgeController.class).getWidth(node, false);
- }
-
- private void resolveStyle(NodeModel to) {
- if (null != getStyle(to))
- return;
- for(NodeModel source = to.getParentNode(); source != null; source = source.getParentNode() ){
- final EdgeStyle style = getStyle(source);
- if(style != null){
- EdgeModel.createEdgeModel(to).setStyle(style);
- return;
- }
- }
- }
- private EdgeStyle getStyle(NodeModel node) {
- return modeController.getExtension(EdgeController.class).getStyle(node, false);
- }
-
- }
-
- public MEdgeController(final ModeController modeController) {
- super(modeController);
- modeController.registerExtensionCopier(new ExtensionCopier(modeController));
- modeController.addAction(new EdgeColorAction());
- modeController.addAction(new EdgeWidthAction(EdgeModel.WIDTH_PARENT));
- modeController.addAction(new EdgeWidthAction(EdgeModel.WIDTH_THIN));
- modeController.addAction(new EdgeWidthAction(1));
- modeController.addAction(new EdgeWidthAction(2));
- modeController.addAction(new EdgeWidthAction(4));
- modeController.addAction(new EdgeWidthAction(8));
- modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_LINEAR));
- modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_BEZIER));
- modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_SHARP_LINEAR));
- modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_SHARP_BEZIER));
- modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_HORIZONTAL));
- modeController.addAction(new EdgeStyleAction(EdgeStyle.EDGESTYLE_HIDDEN));
- modeController.addAction(new EdgeStyleAsParentAction());
- }
-
- public void setColor(final NodeModel node, final Color color) {
- final ModeController modeController = Controller.getCurrentModeController();
- final Color oldColor = EdgeModel.createEdgeModel(node).getColor();
- if (color == oldColor || color != null && color.equals(oldColor)) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- EdgeModel.createEdgeModel(node).setColor(color);
- modeController.getMapController().nodeChanged(node);
- }
-
- public String getDescription() {
- return "setColor";
- }
-
- public void undo() {
- EdgeModel.createEdgeModel(node).setColor(oldColor);
- modeController.getMapController().nodeChanged(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- public void setStyle(final NodeModel node, final EdgeStyle style) {
- final ModeController modeController = Controller.getCurrentModeController();
- final EdgeStyle oldStyle;
- if (style != null) {
- oldStyle = EdgeModel.createEdgeModel(node).getStyle();
- if (style.equals(oldStyle)) {
- return;
- }
- }
- else {
- oldStyle = EdgeModel.createEdgeModel(node).getStyle();
- if (oldStyle == null) {
- return;
- }
- }
- final IActor actor = new IActor() {
- public void act() {
- EdgeModel.createEdgeModel(node).setStyle(style);
- modeController.getMapController().nodeChanged(node);
- edgeStyleRefresh(node);
- }
-
- private void edgeStyleRefresh(final NodeModel node) {
- for (final NodeModel child : modeController.getMapController().childrenFolded(node)) {
- final EdgeModel edge = EdgeModel.getModel(child);
- if (edge == null || edge.getStyle() == null) {
- modeController.getMapController().nodeRefresh(child);
- edgeStyleRefresh(child);
- }
- }
- }
-
- public String getDescription() {
- return "setStyle";
- }
-
- public void undo() {
- EdgeModel.createEdgeModel(node).setStyle(oldStyle);
- modeController.getMapController().nodeChanged(node);
- edgeStyleRefresh(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- public void setWidth(final NodeModel node, final int width) {
- final ModeController modeController = Controller.getCurrentModeController();
- final int oldWidth = EdgeModel.createEdgeModel(node).getWidth();
- if (width == oldWidth) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- EdgeModel.createEdgeModel(node).setWidth(width);
- modeController.getMapController().nodeChanged(node);
- edgeWidthRefresh(node);
- }
-
- private void edgeWidthRefresh(final NodeModel node) {
- for (final NodeModel child : modeController.getMapController().childrenFolded(node)) {
- final EdgeModel edge = EdgeModel.getModel(child);
- if (edge == null || edge.getWidth() == EdgeModel.WIDTH_PARENT) {
- modeController.getMapController().nodeRefresh(child);
- edgeWidthRefresh(child);
- }
- }
- }
-
- public String getDescription() {
- return "setWidth";
- }
-
- public void undo() {
- EdgeModel.createEdgeModel(node).setWidth(oldWidth);
- modeController.getMapController().nodeChanged(node);
- edgeWidthRefresh(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-}
diff --git a/freeplane/src/org/freeplane/features/encrypt/EncryptionController.java b/freeplane/src/org/freeplane/features/encrypt/EncryptionController.java
deleted file mode 100644
index e98a152..0000000
--- a/freeplane/src/org/freeplane/features/encrypt/EncryptionController.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.encrypt;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.icon.IStateIconProvider;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.IconStore;
-import org.freeplane.features.icon.UIIcon;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.map.EncryptionModel;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-/**
- * @author Dimitry Polivaev
- * Feb 13, 2011
- */
-public class EncryptionController implements IExtension {
- private static final IconStore STORE = IconStoreFactory.create();
- private static UIIcon decryptedIcon = STORE.getUIIcon("unlock.png");
- private static UIIcon encryptedIcon = STORE.getUIIcon("lock.png");
-
- public static void install(EncryptionController encryptionController){
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addExtension(EncryptionController.class, encryptionController);
- final EnterPassword pwdAction = new EnterPassword(encryptionController);
- modeController.addAction(pwdAction);
- }
-
-
- public EncryptionController(final ModeController modeController) {
- registerStateIconProvider(modeController);
- }
-
- private void registerStateIconProvider(final ModeController modeController) {
- IconController.getController(modeController).addStateIconProvider(new IStateIconProvider() {
- public UIIcon getStateIcon(NodeModel node) {
- final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
- if (encryptionModel != null) {
- if(encryptionModel.isAccessible())
- return decryptedIcon;
- else
- return encryptedIcon;
- }
- return null;
- }
- });
- }
-
- public void toggleCryptState(final NodeModel node, PasswordStrategy passwordStrategy) {
- final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
- if (encryptionModel != null) {
- final boolean wasAccessible = encryptionModel.isAccessible();
- final boolean wasFolded = node.isFolded();
- if (wasAccessible) {
- encryptionModel.setAccessible(false);
- encryptionModel.getEncryptedContent(Controller.getCurrentModeController().getMapController());
- node.setFolded(true);
- }
- else {
- if (doPasswordCheckAndDecryptNode(encryptionModel, passwordStrategy)) {
- node.setFolded(false);
- }
- else {
- return;
- }
- }
- Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(node);
- final IActor actor = new IActor() {
- public void act() {
- encryptionModel.setAccessible(!wasAccessible);
- if (wasAccessible) {
- node.setFolded(true);
- }
- Controller.getCurrentModeController().getMapController().nodeRefresh(node);
- }
-
- public String getDescription() {
- return "toggleCryptState";
- }
-
- public void undo() {
- encryptionModel.setAccessible(wasAccessible);
- if (wasAccessible) {
- node.setFolded(wasFolded);
- }
- Controller.getCurrentModeController().getMapController().nodeRefresh(node);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
- else {
- encrypt(node, passwordStrategy);
- }
- }
-
- private boolean doPasswordCheckAndDecryptNode(final EncryptionModel encryptionModel, PasswordStrategy passwordStrategy) {
- while (true) {
- final StringBuilder password = passwordStrategy.getPassword();
- if (passwordStrategy.isCancelled())
- return false;
- if (!decrypt(encryptionModel, password)) {
- passwordStrategy.onWrongPassword();
- return false;
- }
- else {
- return true;
- }
- }
- }
-
- private boolean decrypt(final EncryptionModel encryptionModel, final StringBuilder password) {
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- return encryptionModel.decrypt(mapController, new SingleDesEncrypter(password));
- }
-
- private void encrypt(final NodeModel node, PasswordStrategy passwordStrategy) {
- final StringBuilder password = passwordStrategy.getPasswordWithConfirmation();
- if (passwordStrategy.isCancelled()) {
- return;
- }
- final EncryptionModel encryptionModel = new EncryptionModel(node);
- encryptionModel.setEncrypter(new SingleDesEncrypter(password));
- final IActor actor = new IActor() {
- public void act() {
- node.addExtension(encryptionModel);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- public String getDescription() {
- return "encrypt";
- }
-
- public void undo() {
- node.removeExtension(encryptionModel);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-}
diff --git a/freeplane/src/org/freeplane/features/encrypt/SwingPasswordStrategy.java b/freeplane/src/org/freeplane/features/encrypt/SwingPasswordStrategy.java
deleted file mode 100644
index 2001391..0000000
--- a/freeplane/src/org/freeplane/features/encrypt/SwingPasswordStrategy.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.freeplane.features.encrypt;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.components.EnterPasswordDialog;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-
-public class SwingPasswordStrategy implements PasswordStrategy {
-
- private boolean isCancelled;
-
- public StringBuilder getPassword() {
- return getPasswordImpl(false);
- }
-
- public StringBuilder getPasswordWithConfirmation() {
- return getPasswordImpl(true);
- }
-
- private StringBuilder getPasswordImpl(boolean withConfirmation) {
- final EnterPasswordDialog pwdDialog = new EnterPasswordDialog(Controller.getCurrentController()
- .getViewController().getFrame(), withConfirmation);
- pwdDialog.setModal(true);
- pwdDialog.setVisible(true);
- if (pwdDialog.getResult() == EnterPasswordDialog.CANCEL) {
- isCancelled = true;
- return null;
- }
- return pwdDialog.getPassword();
- }
-
- public void onWrongPassword() {
- final Controller controller = Controller.getCurrentController();
- JOptionPane.showMessageDialog(controller.getViewController().getContentPane(), TextUtils
- .getText("accessories/plugins/EncryptNode.properties_wrong_password"), "Freeplane",
- JOptionPane.ERROR_MESSAGE);
- }
-
- public boolean isCancelled() {
- return isCancelled;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/encrypt/mindmapmode/EncryptedMap.java b/freeplane/src/org/freeplane/features/encrypt/mindmapmode/EncryptedMap.java
deleted file mode 100644
index 4ae2e8a..0000000
--- a/freeplane/src/org/freeplane/features/encrypt/mindmapmode/EncryptedMap.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.encrypt.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.EnterPasswordDialog;
-import org.freeplane.features.encrypt.SingleDesEncrypter;
-import org.freeplane.features.map.EncryptionModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-
-class EncryptedMap extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- EncryptedMap() {
- super("EncryptedMap");
- }
-
- public void actionPerformed(final ActionEvent e) {
- newEncryptedMap();
- }
-
- /**
- * @param e
- */
- private StringBuilder getUsersPassword() {
- final EnterPasswordDialog pwdDialog = new EnterPasswordDialog(Controller.getCurrentController().getViewController().getFrame(),
- true);
- pwdDialog.setModal(true);
- pwdDialog.show();
- if (pwdDialog.getResult() == EnterPasswordDialog.CANCEL) {
- return null;
- }
- final StringBuilder password = pwdDialog.getPassword();
- return password;
- }
-
- /**
- * @param e
- *
- */
- private void newEncryptedMap() {
- final StringBuilder password = getUsersPassword();
- if (password == null) {
- return;
- }
- final ModeController modeController = Controller.getCurrentModeController();
- MFileManager.getController(modeController).newMapFromDefaultTemplate();
- NodeModel node = Controller.getCurrentController().getMap().getRootNode();
- final EncryptionModel encryptedMindMapNode = new EncryptionModel(node);
- encryptedMindMapNode.setEncrypter(new SingleDesEncrypter(password));
- node.addExtension(encryptedMindMapNode);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- @Override
- public void afterMapChange(final Object newMap) {
- }
-}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportAction.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportAction.java
deleted file mode 100644
index afee5ff..0000000
--- a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.export.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author foltin To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-class ExportAction extends AFreeplaneAction {
- private ExportDialog exp = null;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ExportAction() {
- super("ExportAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- if(exp == null){
- exp = new ExportDialog();
- }
- final MapModel model = Controller.getCurrentController().getMap();
- if (model == null) {
- return;
- }
- export(model);
- }
-
- private void export(final MapModel model) {
- final Controller controller = Controller.getCurrentController();
- exp.export(controller.getViewController().getFrame(), model);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportDialog.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportDialog.java
deleted file mode 100644
index fd0a339..0000000
--- a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportDialog.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Eric Lavarde, Freeplane admins
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.export.mindmapmode;
-
-import java.awt.Component;
-import java.awt.EventQueue;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.io.File;
-import java.text.MessageFormat;
-
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.filechooser.FileFilter;
-
-import org.freeplane.core.ui.ExampleFileFilter;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-
-/**
- * This class uses the JFileChooser dialog to allow users to choose a file name to
- * export to. The filter selection is created by gathering all the *.xsl files
- * present in the user-specific and system-specific Export-directories of Freeplane.
- * Those files are recognised by their extension (.xsl) but also by the fact that they
- * contain within the 5 first lines a string of the form:
- * <pre>MINDMAPEXPORT <i>extensions</i> <i>description</i></pre>
- * where the fields in italic are relative to the file format to which the mindmap will
- * be exported to using this specific XSLT sheet:
- * <ul>
- * <li><i>extensions</i> is a semi-column separated list of acceptable file extensions
- * without asterisk or dot, e.g. "jpg;jpeg".</li>
- * <li><i>description</i> is a description of the file format, e.g. "JPEG image".</li>
- * </ul>
- * Only the first unique combination of extensions and description will be kept, in such
- * a way that users can "overwrite" an already existing XSLT sheet with their own
- * version.
- * @author Eric Lavarde
- * @see javax.swing.JFileChooser
- *
- */
-public class ExportDialog {
- /** the JFileChooser dialog used to choose filter and the file to export to. */
- final private JFileChooser fileChooser = new JFileChooser();
-
- /**
- * This constructor does <i>not</i> the export per itself.
- * It populates the {@link #fileChooser} field
- * (especially the {@link JFileChooser#getChoosableFileFilters() choosable
- * file filters}).
- */
- public ExportDialog() {
- super();
- fileChooser.setAcceptAllFileFilterUsed(false); // the user can't select an "All Files filter"
- fileChooser.setDialogTitle(TextUtils.getText("export_using_xslt"));
- fileChooser.setToolTipText(TextUtils.getText("select_file_export_to"));
- final ExportController exportEngineRegistry = ExportController.getContoller();
- for (FileFilter filter : exportEngineRegistry.getFileFilters()) {
- fileChooser.addChoosableFileFilter(filter);
- }
- final FileFilter fileFilter = fileChooser.getChoosableFileFilters()[0];
- fileChooser.setFileFilter(fileFilter);
- }
-
- /**
- * A function to call again and again in order to export the same XML source file.
- * @see #export(Component)
- */
- /**
- * A function to call again and again in order to export the same XML source file.
- * @param parentframe a parent component for the dialogs to appear (can be null).
- * @param streamSource
- */
- void export(final Component parentframe, final MapModel map) {
- final ExportController exportEngineRegistry = ExportController.getContoller();
- if (exportEngineRegistry.getFilterMap().isEmpty()) {
- JOptionPane.showMessageDialog(parentframe, TextUtils.getText("xslt_export_not_possible"));
- return;
- }
- // Finish to setup the File Chooser...
- // And then use it
- final String absolutePathWithoutExtension;
- final File xmlSourceFile = map.getFile();
- if (xmlSourceFile != null) {
- absolutePathWithoutExtension = FileUtils.removeExtension(xmlSourceFile.getAbsolutePath());
- }
- else {
- absolutePathWithoutExtension = null;
- }
- final PropertyChangeListener filterChangeListener = new PropertyChangeListener() {
- final private File selectedFile = absolutePathWithoutExtension == null ? null : new File(
- absolutePathWithoutExtension);
-
- public void propertyChange(final PropertyChangeEvent evt) {
- if (evt.getPropertyName().equals(JFileChooser.FILE_FILTER_CHANGED_PROPERTY)) {
- final FileFilter filter = fileChooser.getFileFilter();
- if(! (filter instanceof ExampleFileFilter)){
- return;
- }
- final File acceptableFile = getAcceptableFile(selectedFile, (ExampleFileFilter) filter);
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- fileChooser.setSelectedFile(acceptableFile);
- }
- });
- return;
- }
- if (selectedFile != null && evt.getPropertyName().equals(JFileChooser.DIRECTORY_CHANGED_PROPERTY)) {
- final FileFilter filter = fileChooser.getFileFilter();
- if(! (filter instanceof ExampleFileFilter)){
- return;
- }
- final File acceptableFile = getAcceptableFile(selectedFile, (ExampleFileFilter) filter);
- final File currentDirectory = fileChooser.getCurrentDirectory();
- if(currentDirectory != null){
- final File file = new File (currentDirectory, acceptableFile.getName());
- fileChooser.setSelectedFile(file);
- }
- else
- fileChooser.setSelectedFile(acceptableFile);
- return;
- }
- }
- };
- filterChangeListener.propertyChange(new PropertyChangeEvent(fileChooser,
- JFileChooser.FILE_FILTER_CHANGED_PROPERTY, null, fileChooser.getFileFilter()));
- try {
- fileChooser.addPropertyChangeListener(filterChangeListener);
- final int returnVal = fileChooser.showSaveDialog(parentframe);
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- // we check which filter has been selected by the user and use its
- // description as key for the map to get the corresponding XSLT file
- if(! (fileChooser.getFileFilter() instanceof ExampleFileFilter)){
- UITools.errorMessage(TextUtils.getText("invalid_export_file"));
- return;
- }
- final ExampleFileFilter fileFilter = (ExampleFileFilter) fileChooser.getFileFilter();
- final File selectedFile = getAcceptableFile(fileChooser.getSelectedFile(), fileFilter);
- if (selectedFile == null) {
- return;
- }
- if (selectedFile.isDirectory()) {
- return;
- }
- if (selectedFile.exists()) {
- final String overwriteText = MessageFormat.format(TextUtils.getText("file_already_exists"),
- new Object[] { selectedFile.toString() });
- final int overwriteMap = JOptionPane.showConfirmDialog(UITools.getFrame(), overwriteText,
- overwriteText, JOptionPane.YES_NO_OPTION);
- if (overwriteMap != JOptionPane.YES_OPTION) {
- return;
- }
- }
- final IExportEngine exportEngine = exportEngineRegistry.getFilterMap().get(fileFilter);
- exportEngine.export(map, selectedFile);
- }
- }
- finally {
- fileChooser.removePropertyChangeListener(filterChangeListener);
- }
- }
-
- private File getAcceptableFile(File selectedFile, final ExampleFileFilter fileFilter) {
- if (selectedFile == null) {
- return null;
- }
- if (!fileFilter.accept(selectedFile)) {
- selectedFile = new File(selectedFile.getAbsolutePath() + '.' + fileFilter.getExtensionProposal());
- }
- return selectedFile;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToOoWriter.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToOoWriter.java
deleted file mode 100644
index f13ec88..0000000
--- a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportToOoWriter.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.export.mindmapmode;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import javax.swing.filechooser.FileFilter;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.ExampleFileFilter;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-/**
- * @author foltin
- */
-public class ExportToOoWriter implements IExportEngine {
- public ExportToOoWriter() {
- }
-
-
- public FileFilter getFileFilter(){
- return new ExampleFileFilter("odt", TextUtils.getText("ExportToOoWriter.text"));
- }
-
- public void export(MapModel map, File chosenFile) {
- Controller.getCurrentController().getViewController().setWaitingCursor(true);
- try {
- exportToOoWriter(map, chosenFile);
- }
- catch (final Exception ex) {
- LogUtils.warn(ex);
- UITools.errorMessage(TextUtils.getText("export_failed"));
- }
- finally{
- Controller.getCurrentController().getViewController().setWaitingCursor(false);
- }
- }
-
- /**
- * @return true, if successful.
- */
- private void applyXsltFile(final String xsltFileName, final StringWriter writer, final Result result)
- throws IOException {
- final URL xsltUrl = ResourceController.getResourceController().getResource(xsltFileName);
- if (xsltUrl == null) {
- LogUtils.severe("Can't find " + xsltFileName + " as resource.");
- throw new IllegalArgumentException("Can't find " + xsltFileName + " as resource.");
- }
- final InputStream xsltStream = new BufferedInputStream(xsltUrl.openStream());
- final Source xsltSource = new StreamSource(xsltStream);
- try {
- final StringReader reader = new StringReader(writer.getBuffer().toString());
- final TransformerFactory transFact = TransformerFactory.newInstance();
- final Transformer trans = transFact.newTransformer(xsltSource);
- trans.transform(new StreamSource(reader), result);
- return;
- }
- catch (final Exception e) {
- UITools.errorMessage(e.getMessage());
- LogUtils.warn(e);
- return;
- }
- finally {
- FileUtils.silentlyClose(xsltStream);
- }
- }
-
-
- public void exportToOoWriter(MapModel map, final File file) throws IOException {
- final ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(file));
- try {
- final StringWriter writer = new StringWriter();
- final ModeController controller = Controller.getCurrentModeController();
- controller.getMapController().getFilteredXml(map, writer, Mode.EXPORT, true);
- final Result result = new StreamResult(zipout);
-
- ZipEntry entry = new ZipEntry("content.xml");
- zipout.putNextEntry(entry);
- applyXsltFile("/xslt/export2oowriter.xsl", writer, result);
- zipout.closeEntry();
-
- entry = new ZipEntry("META-INF/manifest.xml");
- zipout.putNextEntry(entry);
- applyXsltFile("/xslt/export2oowriter.manifest.xsl", writer, result);
- zipout.closeEntry();
-
- entry = new ZipEntry("styles.xml");
- zipout.putNextEntry(entry);
- applyXsltFile("/xslt/export2oowriter.styles.xsl", writer, result);
- zipout.closeEntry();
- }
- finally {
- zipout.close();
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportWithXSLT.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ExportWithXSLT.java
deleted file mode 100644
index 223f147..0000000
--- a/freeplane/src/org/freeplane/features/export/mindmapmode/ExportWithXSLT.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.export.mindmapmode;
-
-import java.awt.image.RenderedImage;
-import java.io.BufferedInputStream;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.Properties;
-import java.util.StringTokenizer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.imageio.ImageIO;
-import javax.swing.JOptionPane;
-import javax.swing.ListModel;
-import javax.swing.filechooser.FileFilter;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.ExampleFileFilter;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.UIIcon;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.url.UrlManager;
-
-/**
- * @author foltin To change the template for this generated type comment go to
- * Window>Preferences>Java>Code Generation>Code and Comments
- */
-public class ExportWithXSLT implements IExportEngine {
-
- private static final Pattern propertyReferenceEpression = Pattern.compile("\\$\\{[^}]+\\}");
-
- /**
- * @param map
- */
- static void copyIconsToDirectory(final MapModel map, final String directoryName) {
- final ListModel icons = map.getIconRegistry().getIconsAsListModel();
- for (int i = 0; i < icons.getSize(); i++) {
- final UIIcon icon = (UIIcon) icons.getElementAt(i);
- final String iconName = icon.getName();
- final StringBuilder sb = new StringBuilder(directoryName);
- final int lastIndexOfSeparator = iconName.lastIndexOf('/');
- if (lastIndexOfSeparator != -1) {
- sb.append(File.separatorChar);
- sb.append(iconName.substring(0, lastIndexOfSeparator));
- }
- final File destinationDirectory = new File(sb.toString());
- destinationDirectory.mkdirs();
- FileUtils.copyFromURL(icon.getUrl(), destinationDirectory);
- }
- }
-
- /**
- * For test purposes. True=no error
- */
- private boolean mTransformResultWithoutError = false;
- final private Properties properties;
- private final String name;
-
- public ExportWithXSLT(final String name, final Properties properties) {
- this.name = name;
- this.properties = properties;
- }
-
- /**
- */
- private void copyFilesFromResourcesToDirectory(final String targetDirectoryName, final String sourceDirectoryPath,
- final String files) {
- final StringTokenizer tokenizer = new StringTokenizer(files, ",");
- final File destinationDirectory = new File(targetDirectoryName);
- while (tokenizer.hasMoreTokens()) {
- final String sourceFile = tokenizer.nextToken();
- int nameStartPosition = sourceFile.lastIndexOf('/') + 1;
- String sourceFileDirectory = nameStartPosition > 0 ? sourceFile.substring(0, nameStartPosition) : "";
- String sourceFileName = nameStartPosition > 0 ? sourceFile.substring(nameStartPosition) : sourceFile;
- FileUtils.copyFromResource(sourceDirectoryPath + sourceFileDirectory, sourceFileName, destinationDirectory);
- }
- }
-
- /**
- * @param map
- */
- private boolean copyIcons(final MapModel map, final String directoryName) {
- boolean success;
- final String iconDirectoryName = directoryName + File.separatorChar + "icons";
- success = FileUtils.createDirectory(iconDirectoryName);
- if (success) {
- ExportWithXSLT.copyIconsToDirectory(map, iconDirectoryName);
- }
- return success;
- }
-
- private boolean copyMap(final MapModel map, final String pDirectoryName) {
- boolean success = true;
- try {
- final BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
- pDirectoryName + File.separator + "map" + UrlManager.FREEPLANE_FILE_EXTENSION)));
- final Mode mode = Mode.valueOf(getProperty("copymode", Mode.EXPORT.name()));
- Controller.getCurrentModeController().getMapController().getFilteredXml(map, fileout, mode, Mode.EXPORT.equals(mode));
- }
- catch (final IOException e) {
- success = false;
- }
- return success;
- }
-
- private int getImageResolutionDPI() {
- return ResourceController.getResourceController().getIntProperty("exported_image_resolution_dpi", 300);
- }
- /**
- * @param map
- */
- private boolean createImageFromMap(MapModel map, final String directoryName) {
- if (Controller.getCurrentController().getMapViewManager().getMapViewComponent() == null) {
- return false;
- }
- final RenderedImage image = new ImageCreator(getImageResolutionDPI()).createBufferedImage(map);
- if(image == null){
- return false;
- }
- try {
- final FileOutputStream out = new FileOutputStream(directoryName + File.separator + "image.png");
- ImageIO.write(image, "png", out);
- out.close();
- return true;
- }
- catch (final IOException e1) {
- LogUtils.severe(e1);
- return false;
- }
- }
-
- /**
- * @param create_image
- */
- private String getAreaCode(final boolean create_image) {
- String areaCode = "";
- if (create_image) {
- areaCode = Controller.getCurrentController().getMapViewManager().createHtmlMap();
- }
- return areaCode;
- }
-
- /**
- * @param mode
- * @throws IOException
- */
- private String getMapXml(final Mode mode) throws IOException {
- final StringWriter writer = new StringWriter();
- final ModeController modeController = Controller.getCurrentModeController();
- final Controller controller = modeController.getController();
- final MapModel map = controller.getMap();
- modeController.getMapController().getFilteredXml(map, writer, mode, Mode.EXPORT.equals(mode));
- return writer.getBuffer().toString();
- }
-
- String getProperty(final String key) {
- final String property = getProperty(key, null);
- if (property == null)
- return property;
- Matcher r = propertyReferenceEpression.matcher(property);
- r.reset();
- boolean result = r.find();
- if (result) {
- StringBuffer sb = new StringBuffer();
- do {
- String propertyReference = r.group();
- String propertyName = propertyReference.substring(2, propertyReference.length() - 1);
- r.appendReplacement(sb, System.getProperty(propertyName, propertyReference));
- result = r.find();
- } while (result);
- r.appendTail(sb);
- return sb.toString();
- }
- return property;
- }
-
- String getProperty(final String key, final String value) {
- return properties.getProperty(key, value);
- }
-
- public boolean isTransformResultWithoutError() {
- return mTransformResultWithoutError;
- }
-
- /**
- * @param saveFile
- */
- public void export(final MapModel map, final File saveFile) {
- try {
- mTransformResultWithoutError = true;
- final boolean create_image = StringUtils.equals(getProperty("create_html_linked_image"), "true");
- final String areaCode = getAreaCode(create_image);
- final String xsltFileName = getProperty("xslt_file");
- final Mode mode = Mode.valueOf(getProperty("mode", Mode.EXPORT.name()));
- String[] parameters = getProperty("set_properties", "").split(",\\s*");
- boolean success = transformMapWithXslt(xsltFileName, saveFile, areaCode, mode, parameters);
- if (!success) {
- JOptionPane.showMessageDialog(UITools.getFrame(), getProperty("error_applying_template"), "Freeplane",
- JOptionPane.ERROR_MESSAGE);
- return;
- }
- if (success && StringUtils.equals(getProperty("create_dir"), "true")) {
- final String directoryName = saveFile.getAbsolutePath() + "_files";
- success = FileUtils.createDirectory(directoryName);
- if (success) {
- final String files = getProperty("files_to_copy");
- final String filePrefix = getProperty("file_prefix");
- copyFilesFromResourcesToDirectory(directoryName, filePrefix, files);
- }
- if (success && StringUtils.equals(getProperty("copy_icons"), "true")) {
- success = copyIcons(map, directoryName);
- }
- if (success && StringUtils.equals(getProperty("copy_map"), "true")) {
- String copyМapХsltFile = getProperty("copy_map_xslt_file");
- if (copyМapХsltFile != null)
- success = transformMapWithXslt(copyМapХsltFile, new File(directoryName, "map.mm"), "", Mode.EXPORT, new String[]{});
- else
- success = copyMap(map, directoryName);
- }
- if (success && create_image) {
- success = createImageFromMap(map, directoryName);
- }
- }
- if (!success) {
- JOptionPane.showMessageDialog(UITools.getFrame(), getProperty("error_creating_directory"), "Freeplane",
- JOptionPane.ERROR_MESSAGE);
- return;
- }
- if (StringUtils.equals(getProperty("load_file"), "true")) {
- Controller.getCurrentController().getViewController().openDocument(Compat.fileToUrl(saveFile));
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- mTransformResultWithoutError = false;
- }
- }
-
- private boolean transformMapWithXslt(final String xsltFileName, final File saveFile, final String areaCode,
- final Mode mode, String[] parameters) throws IOException,
- TransformerFactoryConfigurationError {
- final String map = getMapXml(mode);
- final StringReader reader = new StringReader(map);
- ResourceController resourceController = ResourceController.getResourceController();
- final URL xsltUrl = resourceController.getResource(xsltFileName);
- if (xsltUrl == null) {
- LogUtils.severe("Can't find " + xsltFileName + " as resource.");
- throw new IllegalArgumentException("Can't find " + xsltFileName + " as resource.");
- }
- final InputStream xsltFile = new BufferedInputStream(xsltUrl.openStream());
- final Source xsltSource = new StreamSource(xsltFile);
- final Result result = new StreamResult(saveFile);
- try {
- final TransformerFactory transFact = TransformerFactory.newInstance();
- final Transformer trans = transFact.newTransformer(xsltSource);
- trans.setParameter("destination_dir", saveFile.getName() + "_files/");
- trans.setParameter("area_code", areaCode);
- trans.setParameter("folding_type", resourceController.getProperty(
- "html_export_folding"));
- StringBuilder sb = new StringBuilder();
- for(String p : parameters){
- String value = resourceController.getProperty(p, null);
- if(value != null && ! value.equals(resourceController.getDefaultProperty(p))){
- sb.append(p);
- sb.append('=');
- sb.append(value);
- sb.append("$$$");
- }
-
- }
- trans.setParameter("propertyList", sb.toString());
- trans.transform(new StreamSource(reader), result);
- }
- catch (final Exception e) {
- LogUtils.warn(e);
- return false;
- }
- finally {
- FileUtils.silentlyClose(xsltFile);
- }
- return true;
- }
-
- public FileFilter getFileFilter() {
- return new ExampleFileFilter(getProperty("file_type"), TextUtils.getText(name + ".text"));
- }
-}
diff --git a/freeplane/src/org/freeplane/features/export/mindmapmode/ImportMindmanagerFiles.java b/freeplane/src/org/freeplane/features/export/mindmapmode/ImportMindmanagerFiles.java
deleted file mode 100644
index d0532d0..0000000
--- a/freeplane/src/org/freeplane/features/export/mindmapmode/ImportMindmanagerFiles.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.export.mindmapmode;
-
-import java.awt.Container;
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.InputStream;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-import javax.swing.JFileChooser;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.ExampleFileFilter;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.Controller;
-
-/**
- * Applies an XSLT to the Document.xml file of MindManager(c) files.
- */
-public class ImportMindmanagerFiles extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ImportMindmanagerFiles() {
- super("ImportMindmanagerFiles");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final String type = "mmap";
- final Container component = Controller.getCurrentController().getViewController().getContentPane();
- final JFileChooser chooser = new JFileChooser();
- chooser.addChoosableFileFilter(new ExampleFileFilter(type, null));
- final File mmFile = Controller.getCurrentController().getMap().getFile();
- if (mmFile != null && mmFile.getParentFile() != null) {
- chooser.setSelectedFile(mmFile.getParentFile());
- }
- final int returnVal = chooser.showOpenDialog(component);
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- return;
- }
- final File chosenFile = chooser.getSelectedFile();
- importMindmanagerFile(chosenFile);
- }
-
- private void importMindmanagerFile(final File file) {
- ZipInputStream in = null;
- try {
- in = new ZipInputStream(new FileInputStream(file));
- while (in.available() != 0) {
- final ZipEntry entry = in.getNextEntry();
- if (entry == null) {
- break;
- }
- if (!entry.getName().equals("Document.xml")) {
- continue;
- }
- final String xsltFileName = "/xslt/mindmanager2mm.xsl";
- final URL xsltUrl = ResourceController.getResourceController().getResource(xsltFileName);
- if (xsltUrl == null) {
- LogUtils.severe("Can't find " + xsltFileName + " as resource.");
- throw new IllegalArgumentException("Can't find " + xsltFileName + " as resource.");
- }
- final InputStream xsltFile = xsltUrl.openStream();
- final String xml = transForm(new StreamSource(in), xsltFile);
- xsltFile.close();
- if (xml != null) {
- final File tempFile = File.createTempFile(file.getName(),
- org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION, file.getParentFile());
- final FileWriter fw = new FileWriter(tempFile);
- fw.write(xml);
- fw.close();
- Controller.getCurrentModeController().getMapController().newMap(Compat.fileToUrl(tempFile));
- }
- break;
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- finally {
- FileUtils.silentlyClose(in);
- }
- }
-
- public String transForm(final Source xmlSource, final InputStream xsltStream) {
- final Source xsltSource = new StreamSource(xsltStream);
- final StringWriter writer = new StringWriter();
- final Result result = new StreamResult(writer);
- try {
- final TransformerFactory transFact = TransformerFactory.newInstance();
- final Transformer trans = transFact.newTransformer(xsltSource);
- trans.transform(xmlSource, result);
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- return null;
- }
- return writer.toString();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/AFilterComposerDialog.java b/freeplane/src/org/freeplane/features/filter/AFilterComposerDialog.java
deleted file mode 100644
index f5f0d15..0000000
--- a/freeplane/src/org/freeplane/features/filter/AFilterComposerDialog.java
+++ /dev/null
@@ -1,661 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.EventQueue;
-import java.awt.Rectangle;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.io.File;
-import java.util.Collection;
-
-import javax.swing.Action;
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JFileChooser;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.ListSelectionModel;
-import javax.swing.SwingConstants;
-import javax.swing.border.EmptyBorder;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.filechooser.FileFilter;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionNotSatisfiedDecorator;
-import org.freeplane.features.filter.condition.ConjunctConditions;
-import org.freeplane.features.filter.condition.DisjunctConditions;
-import org.freeplane.features.filter.condition.ICombinedCondition;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- */
-public abstract class AFilterComposerDialog extends JDialog implements IMapSelectionListener {
- /**
- * @author Dimitry Polivaev
- */
- private class AddElementaryConditionAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- AddElementaryConditionAction() {
- super("AddElementaryConditionAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- ASelectableCondition newCond;
- newCond = editor.getCondition();
- if (newCond != null) {
- final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
- model.addElement(newCond);
- }
- validate();
- }
- }
-
- private class CloseAction implements ActionListener {
- public void actionPerformed(final ActionEvent e) {
- final Object source = e.getSource();
- final boolean success;
- if (source == btnOK || source == btnApply) {
- success = applyChanges();
- }
- else {
- success = true;
- }
- if (!success) {
- return;
- }
- internalConditionsModel = null;
- if (source == btnOK) {
- dispose(true);
- }
- else if (source == btnCancel) {
- dispose(false);
- }
- else {
- initInternalConditionModel();
- }
- }
-
- }
-
- private boolean success;
-
- public boolean isSuccess() {
- return success;
- }
-
- private void dispose(boolean b) {
- this.success = b;
- dispose();
- }
- private class ConditionListMouseListener extends MouseAdapter {
- @Override
- public void mouseClicked(final MouseEvent e) {
- if (e.getClickCount() == 2) {
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- if (selectCondition()) {
- dispose(true);
- }
- }
- });
- }
- }
- }
-
- private class ConditionListSelectionListener implements ListSelectionListener {
- public void valueChanged(final ListSelectionEvent e) {
- final int minSelectionIndex = elementaryConditionList.getMinSelectionIndex();
- if (minSelectionIndex == -1) {
- btnNot.setEnabled(false);
- btnSplit.setEnabled(false);
- btnAnd.setEnabled(false);
- btnOr.setEnabled(false);
- btnDelete.setEnabled(false);
- btnName.setEnabled(false);
- btnUp.setEnabled(false);
- btnDown.setEnabled(false);
- }
- else {
- btnUp.setEnabled(true);
- btnDown.setEnabled(true);
- btnDelete.setEnabled(true);
- final int maxSelectionIndex = elementaryConditionList.getMaxSelectionIndex();
- final boolean oneElementChosen = minSelectionIndex == maxSelectionIndex;
- btnNot.setEnabled(oneElementChosen);
- btnName.setEnabled(oneElementChosen);
- btnAnd.setEnabled(! oneElementChosen);
- btnOr.setEnabled(! oneElementChosen);
- btnSplit.setEnabled(oneElementChosen && elementaryConditionList.getSelectedValue() instanceof ICombinedCondition);
- }
- }
- }
-
- private class CreateConjunctConditionAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- CreateConjunctConditionAction() {
- super("CreateConjunctConditionAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ASelectableCondition[] selectedValues = toConditionsArray(elementaryConditionList.getSelectedValues());
- if (selectedValues.length < 2) {
- return;
- }
- final ASelectableCondition newCond = new ConjunctConditions(selectedValues);
- final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
- model.addElement(newCond);
- validate();
- }
- }
-
- private class CreateDisjunctConditionAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- CreateDisjunctConditionAction() {
- super("CreateDisjunctConditionAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ASelectableCondition[] selectedValues = toConditionsArray(elementaryConditionList.getSelectedValues());
- if (selectedValues.length < 2) {
- return;
- }
- final ASelectableCondition newCond = new DisjunctConditions(selectedValues);
- final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
- model.addElement(newCond);
- validate();
- }
- }
-
- private ASelectableCondition[] toConditionsArray(final Object[] objects) {
- final ASelectableCondition[] conditions = new ASelectableCondition[objects.length];
- for (int i = 0; i < objects.length; i++) {
- conditions[i] = (ASelectableCondition) objects[i];
- }
- return conditions;
- }
-
- private class CreateNotSatisfiedConditionAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- *
- */
- CreateNotSatisfiedConditionAction() {
- super("CreateNotSatisfiedConditionAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final int min = elementaryConditionList.getMinSelectionIndex();
- if (min >= 0) {
- final int max = elementaryConditionList.getMinSelectionIndex();
- if (min == max) {
- final ASelectableCondition oldCond = (ASelectableCondition) elementaryConditionList
- .getSelectedValue();
- final ASelectableCondition newCond = new ConditionNotSatisfiedDecorator(oldCond);
- final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
- model.addElement(newCond);
- validate();
- }
- }
- }
- }
-
- private class SplitConditionAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- *
- */
- SplitConditionAction() {
- super("SplitConditionAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final int min = elementaryConditionList.getMinSelectionIndex();
- if (min >= 0) {
- final int max = elementaryConditionList.getMinSelectionIndex();
- if (min == max) {
- final ASelectableCondition oldCond = (ASelectableCondition) elementaryConditionList
- .getSelectedValue();
- if (!(oldCond instanceof ICombinedCondition)) {
- return;
- }
- final Collection<ASelectableCondition> newConditions = ((ICombinedCondition) oldCond).split();
- final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
- for (ASelectableCondition newCond : newConditions) {
- final int index = model.getIndexOf(newCond);
- if (-1 == index) {
- model.addElement(newCond);
- final int newIndex = model.getSize() - 1;
- elementaryConditionList.addSelectionInterval(newIndex, newIndex);
- }
- else {
- elementaryConditionList.addSelectionInterval(index, index);
- }
- }
- elementaryConditionList.removeSelectionInterval(min, min);
- validate();
- }
- }
- }
- }
-
- private class DeleteConditionAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- DeleteConditionAction() {
- super("DeleteConditionAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
- final int minSelectionIndex = elementaryConditionList.getMinSelectionIndex();
- int selectedIndex;
- while (0 <= (selectedIndex = elementaryConditionList.getSelectedIndex())) {
- model.removeElementAt(selectedIndex);
- }
- final int size = elementaryConditionList.getModel().getSize();
- if (size > 0) {
- elementaryConditionList.setSelectedIndex(minSelectionIndex < size ? minSelectionIndex : size - 1);
- }
- validate();
- }
- }
-
- private class NameConditionAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- NameConditionAction() {
- super("NameConditionAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final DefaultComboBoxModel model = (DefaultComboBoxModel) elementaryConditionList.getModel();
- final int minSelectionIndex = elementaryConditionList.getMinSelectionIndex();
- if (minSelectionIndex == -1) {
- return;
- }
- final ASelectableCondition condition = (ASelectableCondition) model.getElementAt(minSelectionIndex);
- final String userName = condition.getUserName();
- final String newUserName = JOptionPane.showInputDialog(AFilterComposerDialog.this,
- TextUtils.getText("enter_condition_name"), userName == null ? "" : userName);
- if(newUserName == null)
- return;
- XMLElement xmlCondition = new XMLElement();
- condition.toXml(xmlCondition);
- ASelectableCondition newCondition = filterController.getConditionFactory().loadCondition(xmlCondition.getChildAtIndex(0));
- if(newCondition== null)
- return;
- if (newUserName.equals("")) {
- if(userName == null)
- return;
- newCondition.setUserName(null);
- }
- else {
- if(newUserName.equals(userName))
- return;
- newCondition.setUserName(newUserName);
- }
- model.removeElementAt(minSelectionIndex);
- model.insertElementAt(newCondition, minSelectionIndex);
- }
- }
-
- private class MoveConditionAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private int positionChange;
- private DefaultComboBoxModel model;
- private int[] selectedIndices;
-
- MoveConditionAction(String key, boolean up) {
- super(key);
- this.positionChange = up ? -1 : 1;
- }
-
- public void actionPerformed(final ActionEvent e) {
- model = (DefaultComboBoxModel) elementaryConditionList.getModel();
- selectedIndices = elementaryConditionList.getSelectedIndices();
- if(positionChange < 1)
- for (int selectedIndexPosition = 0; selectedIndexPosition < selectedIndices.length; selectedIndexPosition++){
- moveIndex(selectedIndexPosition);
- }
- else
- for (int selectedIndexPosition = selectedIndices.length - 1; selectedIndexPosition >= 0; selectedIndexPosition--){
- moveIndex(selectedIndexPosition);
- }
- elementaryConditionList.setSelectedIndices(selectedIndices);
- }
-
- protected void moveIndex(int selectedIndexPosition) {
- int index = selectedIndices[selectedIndexPosition];
- final ASelectableCondition condition = (ASelectableCondition) model.getElementAt(index);
- final int newPosition = index + positionChange;
- if(newPosition >= 0 && newPosition < model.getSize() && ! elementaryConditionList.isSelectedIndex(newPosition)){
- model.removeElementAt(index);
- model.insertElementAt(condition, newPosition);
- selectedIndices[selectedIndexPosition] = newPosition;
- }
- }
- }
- private class LoadAction implements ActionListener {
- public void actionPerformed(final ActionEvent e) {
- final JFileChooser chooser = getFileChooser();
- final int returnVal = chooser.showOpenDialog(AFilterComposerDialog.this);
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- try {
- final File theFile = chooser.getSelectedFile();
- internalConditionsModel.removeAllElements();
- filterController.loadConditions(internalConditionsModel, theFile.getCanonicalPath(), true);
- }
- catch (final Exception ex) {
- LogUtils.severe(ex);
- }
- }
- }
- }
-
- static private class MindMapFilterFileFilter extends FileFilter {
- static FileFilter filter = new MindMapFilterFileFilter();
-
- @Override
- public boolean accept(final File f) {
- if (f.isDirectory()) {
- return true;
- }
- final String extension = FileUtils.getExtension(f.getName());
- if (extension != null) {
- if (extension.equals(FilterController.FREEPLANE_FILTER_EXTENSION_WITHOUT_DOT)) {
- return true;
- }
- else {
- return false;
- }
- }
- return false;
- }
-
- @Override
- public String getDescription() {
- return TextUtils.getText("mindmaps_filter_desc");
- }
- }
-
- private class SaveAction implements ActionListener {
- public void actionPerformed(final ActionEvent e) {
- final JFileChooser chooser = getFileChooser();
- chooser.setDialogTitle(TextUtils.getText("SaveAsAction.text"));
- final int returnVal = chooser.showSaveDialog(AFilterComposerDialog.this);
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- return;
- }
- try {
- final File f = chooser.getSelectedFile();
- String canonicalPath = f.getCanonicalPath();
- final String suffix = '.' + FilterController.FREEPLANE_FILTER_EXTENSION_WITHOUT_DOT;
- if (!canonicalPath.endsWith(suffix)) {
- canonicalPath = canonicalPath + suffix;
- }
- filterController.saveConditions(internalConditionsModel, canonicalPath);
- }
- catch (final Exception ex) {
- LogUtils.severe(ex);
- }
- }
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private static final int GAP_BETWEEN_BUTTONS = 10;
- final private JButton btnAnd;
- final private JButton btnApply;
- final private JButton btnCancel;
- final private JButton btnDelete;
- final private JButton btnName;
- final private JButton btnUp;
- final private JButton btnDown;
- private JButton btnLoad;
- final private JButton btnNot;
- final private JButton btnSplit;
- final private JButton btnOK;
- final private JButton btnOr;
- private JButton btnSave;
- final private ConditionListSelectionListener conditionListListener;
- // // final private Controller controller;
- final private FilterConditionEditor editor;
- final private JList elementaryConditionList;
- final private FilterController filterController;
- private DefaultComboBoxModel internalConditionsModel;
- private Box conditionButtonBox;
-
- public AFilterComposerDialog(String title, boolean modal) {
- super(Controller.getCurrentController().getViewController().getFrame(), title, modal);
- filterController = FilterController.getCurrentFilterController();
- editor = new FilterConditionEditor(filterController);
- editor.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(),
- BorderFactory.createEmptyBorder(5, 0, 5, 0)));
- // this.controller = controller;
- getContentPane().add(editor, BorderLayout.NORTH);
- conditionButtonBox = Box.createVerticalBox();
- conditionButtonBox.setBorder(new EmptyBorder(0, 10, 0, 10));
- getContentPane().add(conditionButtonBox, BorderLayout.EAST);
- addAction(new AddElementaryConditionAction(), true);
- btnNot = addAction(new CreateNotSatisfiedConditionAction(), false);
- btnAnd = addAction(new CreateConjunctConditionAction(), false);
- btnOr = addAction(new CreateDisjunctConditionAction(), false);
- btnSplit = addAction(new SplitConditionAction(), false);
- btnDelete = addAction(new DeleteConditionAction(), false);
- btnName = addAction(new NameConditionAction(), false);
- btnUp = addAction(new MoveConditionAction("UpConditionAction", true), false);
- btnDown = addAction(new MoveConditionAction("DownConditionAction", false), false);
- conditionButtonBox.add(Box.createVerticalGlue());
- final Box controllerBox = Box.createHorizontalBox();
- controllerBox.setBorder(new EmptyBorder(5, 0, 5, 0));
- getContentPane().add(controllerBox, BorderLayout.SOUTH);
- final CloseAction closeAction = new CloseAction();
- btnOK = new JButton();
- MenuBuilder.setLabelAndMnemonic(btnOK, TextUtils.getRawText("ok"));
- btnOK.addActionListener(closeAction);
- btnOK.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- controllerBox.add(Box.createHorizontalGlue());
- controllerBox.add(btnOK);
- if (!isModal()) {
- btnApply = new JButton();
- MenuBuilder.setLabelAndMnemonic(btnApply, TextUtils.getRawText("apply"));
- btnApply.addActionListener(closeAction);
- btnApply.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- controllerBox.add(Box.createHorizontalGlue());
- controllerBox.add(btnApply);
- }
- else {
- btnApply = null;
- }
- btnCancel = new JButton();
- MenuBuilder.setLabelAndMnemonic(btnCancel, TextUtils.getRawText("cancel"));
- btnCancel.addActionListener(closeAction);
- btnCancel.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- controllerBox.add(Box.createHorizontalGlue());
- controllerBox.add(btnCancel);
- controllerBox.add(Box.createHorizontalGlue());
- Controller controller = Controller.getCurrentController();
- if (!controller.getViewController().isApplet()) {
- final ActionListener saveAction = new SaveAction();
- btnSave = new JButton();
- MenuBuilder.setLabelAndMnemonic(btnSave, TextUtils.getRawText("FilterComposerDialog.save"));
- btnSave.addActionListener(saveAction);
- btnSave.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- final ActionListener loadAction = new LoadAction();
- btnLoad = new JButton();
- MenuBuilder.setLabelAndMnemonic(btnLoad, TextUtils.getRawText("load"));
- btnLoad.addActionListener(loadAction);
- btnLoad.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- controllerBox.add(btnSave);
- controllerBox.add(Box.createHorizontalGlue());
- controllerBox.add(btnLoad);
- controllerBox.add(Box.createHorizontalGlue());
- }
- elementaryConditionList = new JList();
- elementaryConditionList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
- elementaryConditionList.setCellRenderer(filterController.getConditionRenderer());
- elementaryConditionList.setLayoutOrientation(JList.VERTICAL);
- elementaryConditionList.setAlignmentX(Component.LEFT_ALIGNMENT);
- conditionListListener = new ConditionListSelectionListener();
- elementaryConditionList.addListSelectionListener(conditionListListener);
- elementaryConditionList.addMouseListener(new ConditionListMouseListener());
- final JScrollPane conditionScrollPane = new JScrollPane(elementaryConditionList);
- UITools.setScrollbarIncrement(conditionScrollPane);
- UITools.addScrollbarIncrementPropertyListener(conditionScrollPane);
- final JLabel conditionColumnHeader = new JLabel(TextUtils.getText("filter_conditions"));
- conditionColumnHeader.setHorizontalAlignment(SwingConstants.CENTER);
- conditionScrollPane.setColumnHeaderView(conditionColumnHeader);
- final Rectangle desktopBounds = UITools.getDesktopBounds(this);
- Dimension preferredSize = new Dimension(desktopBounds.width * 2 / 3, desktopBounds.height * 2 / 3);
- conditionScrollPane.setPreferredSize(preferredSize);
- getContentPane().add(conditionScrollPane, BorderLayout.CENTER);
- UITools.addEscapeActionToDialog(this);
- pack();
- }
-
- private JButton addAction(Action action, boolean enabled) {
- JButton button = new JButton(action);
- button.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- conditionButtonBox.add(Box.createVerticalStrut(GAP_BETWEEN_BUTTONS));
- conditionButtonBox.add(button);
- if(! enabled)
- button.setEnabled(false);
- return button;
- }
-
- public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
- editor.mapChanged(newMap);
- }
-
- private boolean applyChanges() {
- internalConditionsModel.setSelectedItem(elementaryConditionList.getSelectedValue());
- final int[] selectedIndices = elementaryConditionList.getSelectedIndices();
- if (applyModel(internalConditionsModel, selectedIndices)) {
- internalConditionsModel = null;
- return true;
- }
- else {
- return false;
- }
- }
-
- abstract protected boolean applyModel(DefaultComboBoxModel model, int[] selectedIndices);
-
- public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
- }
-
- protected JFileChooser getFileChooser() {
- final JFileChooser chooser = UrlManager.getController().getFileChooser(MindMapFilterFileFilter.filter, false);
- return chooser;
- }
-
- private void initInternalConditionModel() {
- internalConditionsModel = createModel();
- elementaryConditionList.setModel(internalConditionsModel);
- Object selectedItem = internalConditionsModel.getSelectedItem();
- if (selectedItem != null) {
- int selectedIndex = internalConditionsModel.getIndexOf(selectedItem);
- if (selectedIndex >= 0) {
- elementaryConditionList.setSelectedIndex(selectedIndex);
- return;
- }
- }
- }
-
- abstract protected DefaultComboBoxModel createModel();
-
- private boolean selectCondition() {
- final int min = elementaryConditionList.getMinSelectionIndex();
- if (min >= 0) {
- final int max = elementaryConditionList.getMinSelectionIndex();
- if (min == max) {
- return applyChanges();
- }
- }
- return false;
- }
-
- /**
- */
- public void setSelectedItem(final Object selectedItem) {
- elementaryConditionList.setSelectedValue(selectedItem, true);
- }
-
- @Override
- public void show() {
- initInternalConditionModel();
- success = false;
- super.show();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/EditFilterAction.java b/freeplane/src/org/freeplane/features/filter/EditFilterAction.java
deleted file mode 100644
index 8b26442..0000000
--- a/freeplane/src/org/freeplane/features/filter/EditFilterAction.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- * Mar 28, 2009
- */
-class EditFilterAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- /**
- *
- */
- private final FilterController filterController;
- private AFilterComposerDialog filterDialog = null;
-
- EditFilterAction(final FilterController filterController) {
- super("EditFilterAction");
- this.filterController = filterController;
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- final Object selectedItem = filterController.getFilterConditions().getSelectedItem();
- if (selectedItem != null) {
- getFilterDialog().setSelectedItem(selectedItem);
- }
- getFilterDialog().show();
- }
-
- private class FilterComposerDialog extends AFilterComposerDialog{
-
- public FilterComposerDialog() {
- super(TextUtils.getText("filter_dialog"), false);
- }
-
- protected DefaultComboBoxModel createModel() {
- DefaultComboBoxModel model = new DefaultComboBoxModel();
- ComboBoxModel externalConditionsModel = filterController.getFilterConditions();
- for (int i = 2; i < externalConditionsModel.getSize(); i++) {
- final Object element = externalConditionsModel.getElementAt(i);
- model.addElement(element);
- }
- Object selectedItem = externalConditionsModel.getSelectedItem();
- if(model.getIndexOf(selectedItem) != -1){
- model.setSelectedItem(selectedItem);
- }
- else{
- model.setSelectedItem(null);
- }
- return model;
- }
-
- protected boolean applyModel(DefaultComboBoxModel model, int[] selectedIndices) {
- filterController.setFilterConditions(model);
- return true;
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- }
-
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- private AFilterComposerDialog getFilterDialog() {
- if (filterDialog == null) {
- filterDialog = new FilterComposerDialog();
- getFilterDialog().setLocationRelativeTo(filterController.getFilterToolbar());
- Controller.getCurrentController().getMapViewManager().addMapSelectionListener(filterDialog);
- }
- return filterDialog;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/Filter.java b/freeplane/src/org/freeplane/features/filter/Filter.java
deleted file mode 100644
index 9fe3472..0000000
--- a/freeplane/src/org/freeplane/features/filter/Filter.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import java.util.Collection;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.filter.condition.ICondition;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- */
-public class Filter {
- static Filter createTransparentFilter() {
- return new Filter(null, true, false, false);
- }
-
- final private boolean appliesToVisibleNodesOnly;
- final private ICondition condition;
- final private int options;
-
- public Filter(final ICondition condition, final boolean areAncestorsShown,
- final boolean areDescendantsShown, final boolean applyToVisibleNodesOnly) {
- super();
- this.condition = condition;
- int options = FilterInfo.FILTER_INITIAL_VALUE | FilterInfo.FILTER_SHOW_MATCHED;
- if (areAncestorsShown) {
- options += FilterInfo.FILTER_SHOW_ANCESTOR;
- }
- options += FilterInfo.FILTER_SHOW_ECLIPSED;
- if (areDescendantsShown) {
- options += FilterInfo.FILTER_SHOW_DESCENDANT;
- }
- this.options = options;
- appliesToVisibleNodesOnly = condition != null && applyToVisibleNodesOnly;
- }
-
- void addFilterResult(final NodeModel node, final int flag) {
- node.getFilterInfo().add(flag);
- }
-
- protected boolean appliesToVisibleNodesOnly() {
- return appliesToVisibleNodesOnly;
- }
-
- static private Icon filterIcon;
-
- void displayFilterStatus() {
- if (filterIcon == null) {
- filterIcon = new ImageIcon(ResourceController.getResourceController().getResource("/images/filter.png"));
- }
- if (getCondition() != null) {
- Controller.getCurrentController().getViewController().addStatusInfo("filter", null, filterIcon);
- }
- else {
- Controller.getCurrentController().getViewController().removeStatus("filter");
- }
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.controller.filter.Filter#applyFilter(freeplane.modes.MindMap)
- */
- public void applyFilter(Object source, final MapModel map, final boolean force) {
- if (map == null) {
- return;
- }
- try {
- displayFilterStatus();
- Controller.getCurrentController().getViewController().setWaitingCursor(true);
- final Filter oldFilter = map.getFilter();
- map.setFilter(this);
- if (force || !isConditionStronger(oldFilter)) {
- final NodeModel root = map.getRootNode();
- resetFilter(root);
- if (filterChildren(root, checkNode(root), false)) {
- addFilterResult(root, FilterInfo.FILTER_SHOW_ANCESTOR);
- }
- }
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- final NodeModel selected = selection.getSelected();
- final NodeModel selectedVisible = selected.getVisibleAncestorOrSelf();
- selection.keepNodePosition(selectedVisible, 0.5f, 0.5f);
- refreshMap(source, map);
- selectVisibleNode();
- }
- finally {
- Controller.getCurrentController().getViewController().setWaitingCursor(false);
- }
- }
-
- private boolean applyFilter(final NodeModel node,
- final boolean isAncestorSelected, final boolean isAncestorEclipsed,
- boolean isDescendantSelected) {
- final boolean conditionSatisfied = checkNode(node);
- resetFilter(node);
- if (isAncestorSelected) {
- addFilterResult(node, FilterInfo.FILTER_SHOW_DESCENDANT);
- }
- if (conditionSatisfied) {
- isDescendantSelected = true;
- addFilterResult(node, FilterInfo.FILTER_SHOW_MATCHED);
- }
- else {
- addFilterResult(node, FilterInfo.FILTER_SHOW_HIDDEN);
- }
- if (isAncestorEclipsed) {
- addFilterResult(node, FilterInfo.FILTER_SHOW_ECLIPSED);
- }
- if (filterChildren(node, conditionSatisfied || isAncestorSelected, !conditionSatisfied
- || isAncestorEclipsed)) {
- addFilterResult(node, FilterInfo.FILTER_SHOW_ANCESTOR);
- isDescendantSelected = true;
- }
- return isDescendantSelected;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.controller.filter.Filter#areAncestorsShown()
- */
- public boolean areAncestorsShown() {
- return 0 != (options & FilterInfo.FILTER_SHOW_ANCESTOR);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.controller.filter.Filter#areDescendantsShown()
- */
- public boolean areDescendantsShown() {
- return 0 != (options & FilterInfo.FILTER_SHOW_DESCENDANT);
- }
-
- private boolean checkNode(final NodeModel node) {
- if (condition == null) {
- return true;
- }
- if (appliesToVisibleNodesOnly && !node.isVisible()) {
- return false;
- }
- return condition.checkNode(node);
- }
-
- private boolean filterChildren(final NodeModel node,
- final boolean isAncestorSelected, final boolean isAncestorEclipsed) {
- boolean isDescendantSelected = false;
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- isDescendantSelected = applyFilter(child, isAncestorSelected, isAncestorEclipsed,
- isDescendantSelected);
- }
- return isDescendantSelected;
- }
-
- public ICondition getCondition() {
- return condition;
- }
-
- public boolean isConditionStronger(final Filter oldFilter) {
- return (!appliesToVisibleNodesOnly || appliesToVisibleNodesOnly == oldFilter.appliesToVisibleNodesOnly)
- && (condition != null && condition.equals(oldFilter.getCondition()) || condition == null
- && oldFilter.getCondition() == null);
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.controller.filter.Filter#isVisible(freeplane.modes.MindMapNode)
- */
- public boolean isVisible(final NodeModel node) {
- if (condition == null) {
- return true;
- }
- final int filterResult = node.getFilterInfo().get();
- return ((options & FilterInfo.FILTER_SHOW_ANCESTOR) != 0 || (options & FilterInfo.FILTER_SHOW_ECLIPSED) >= (filterResult & FilterInfo.FILTER_SHOW_ECLIPSED))
- && ((options & filterResult & ~FilterInfo.FILTER_SHOW_ECLIPSED) != 0);
- }
-
- private void refreshMap(Object source, MapModel map) {
- Controller.getCurrentModeController().getMapController().fireMapChanged(new MapChangeEvent(source, map, Filter.class, null, this));
- }
-
- private void resetFilter(final NodeModel node) {
- node.getFilterInfo().reset();
- }
-
- private void selectVisibleNode() {
- final IMapSelection mapSelection = Controller.getCurrentController().getSelection();
- final Collection<NodeModel> selectedNodes = mapSelection.getSelection();
- final NodeModel[] array = new NodeModel[selectedNodes.size()];
- boolean next = false;
- for(NodeModel node : selectedNodes.toArray(array)){
- if(next){
- if (!node.isVisible()) {
- mapSelection.toggleSelected(node);
- }
- }
- else
- next = true;
- }
- NodeModel selected = mapSelection.getSelected();
- if (!selected.isVisible()) {
- if(mapSelection.getSelection().size() > 1){
- mapSelection.toggleSelected(selected);
- }
- else
- mapSelection.selectAsTheOnlyOneSelected(selected.getVisibleAncestorOrSelf());
- }
- mapSelection.setSiblingMaxLevel(mapSelection.getSelected().getNodeLevel(false));
- }
-
- public boolean matches(NodeModel nodeModel) {
- return 0 != (nodeModel.getFilterInfo().get() & FilterInfo.FILTER_SHOW_MATCHED);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/FilterConditionEditor.java b/freeplane/src/org/freeplane/features/filter/FilterConditionEditor.java
deleted file mode 100644
index d4b37e5..0000000
--- a/freeplane/src/org/freeplane/features/filter/FilterConditionEditor.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.lang.ref.WeakReference;
-import java.util.Iterator;
-
-import javax.swing.Box;
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JPanel;
-import javax.swing.ListCellRenderer;
-import javax.swing.RootPaneContainer;
-import javax.swing.text.JTextComponent;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.FixedBasicComboBoxEditor;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.collection.ExtendedComboBoxModel;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- * 23.05.2009
- */
-public class FilterConditionEditor extends JComponent {
- private class ElementaryConditionChangeListener implements ItemListener {
- public void itemStateChanged(final ItemEvent e) {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- setValuesEditor();
- }
- }
- }
-
- private class FilteredPropertyChangeListener implements ItemListener {
- public void itemStateChanged(final ItemEvent e) {
- if (e.getStateChange() == ItemEvent.SELECTED) {
- final Object selectedProperty = filteredPropertiesComponent.getSelectedItem();
- final IElementaryConditionController conditionController = filterController.getConditionFactory()
- .getConditionController(selectedProperty);
- final ComboBoxModel simpleConditionComboBoxModel = conditionController
- .getConditionsForProperty(selectedProperty);
- elementaryConditions.setModel(simpleConditionComboBoxModel);
- elementaryConditions.setEnabled(simpleConditionComboBoxModel.getSize() > 0);
- setValuesEditor();
- return;
- }
- }
- }
-
-
- /**
- * Start "Find next" action when pressing enter key in "value" combo box
- */
- private void setValuesEnterKeyListener()
- {
- if (enterKeyActionListener != null)
- {
- values.getEditor().removeActionListener(enterKeyActionListener);
- values.getEditor().addActionListener(enterKeyActionListener);
- }
- }
-
- public void setSearchingBusyCursor()
- {
- RootPaneContainer root = (RootPaneContainer)getTopLevelAncestor();
- root.getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- root.getGlassPane().setVisible(true);
- }
-
- public void setSearchingDefaultCursor()
- {
- RootPaneContainer root = (RootPaneContainer)getTopLevelAncestor();
- root.getGlassPane().setCursor(Cursor.getDefaultCursor());
- root.getGlassPane().setVisible(false);
- }
-
- private void setValuesEditor() {
- final Object selectedProperty = filteredPropertiesComponent.getSelectedItem();
- final IElementaryConditionController conditionController = filterController.getConditionFactory()
- .getConditionController(selectedProperty);
- final NamedObject selectedCondition = (NamedObject) elementaryConditions.getSelectedItem();
- final boolean canSelectValues = conditionController
- .canSelectValues(selectedProperty, selectedCondition);
- values.setEnabled(canSelectValues);
- values.setEditable(false);
- values.setModel(conditionController.getValuesForProperty(selectedProperty, selectedCondition));
-
- final ComboBoxEditor valueEditor = conditionController.getValueEditor(selectedProperty, selectedCondition);
- values.setEditor(valueEditor != null ? valueEditor : new FixedBasicComboBoxEditor());
- setValuesEnterKeyListener();
-
- final ListCellRenderer valueRenderer = conditionController.getValueRenderer(selectedProperty, selectedCondition);
- values.setRenderer(valueRenderer != null ? valueRenderer : filterController.getConditionRenderer());
-
- values.setEditable(conditionController.canEditValues(selectedProperty, selectedCondition));
- if (values.getModel().getSize() > 0) {
- values.setSelectedIndex(0);
- }
- caseSensitive.setEnabled(canSelectValues
- && conditionController.isCaseDependent(selectedProperty, selectedCondition));
- approximateMatching.setEnabled(canSelectValues
- && conditionController.supportsApproximateMatching(selectedProperty, selectedCondition));
- }
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private static final String PROPERTY_FILTER_MATCH_CASE = "filter_match_case";
- private static final String PROPERTY_FILTER_MATCH_CASE_TOOLTIP = "filter_match_case_tooltip";
- private static final String PROPERTY_FILTER_APPROXIMATE_MATCH = "filter_match_approximately";
- private static final String PROPERTY_FILTER_APPROXIMATE_MATCH_TOOLTIP = "filter_match_approximately_tooltip";
- final private JCheckBox caseSensitive;
- final private JCheckBox approximateMatching;
- final private JComboBox elementaryConditions;
- final private FilterController filterController;
- final private JComboBox filteredPropertiesComponent;
- final private ExtendedComboBoxModel filteredPropertiesModel;
- private WeakReference<MapModel> lastMap;
- final private JComboBox values;
- private ActionListener enterKeyActionListener;
- public FilterConditionEditor(final FilterController filterController) {
- this(filterController, 5, false);
- }
- public FilterConditionEditor(final FilterController filterController, final int borderWidth, final boolean horizontal) {
- super();
- setLayout(new GridBagLayout());
- final GridBagConstraints gridBagConstraints = new GridBagConstraints();
- gridBagConstraints.fill = GridBagConstraints.BOTH;
- gridBagConstraints.gridx = 0;
- gridBagConstraints.gridy = 0;
- gridBagConstraints.anchor = GridBagConstraints.NORTH;
- gridBagConstraints.insets = new Insets(0, borderWidth, 0, borderWidth);
- this.filterController = filterController;
- //Basic layout
- //Item to search for
- filteredPropertiesComponent = new JComboBox();
- filteredPropertiesModel = new ExtendedComboBoxModel();
- filteredPropertiesComponent.setModel(filteredPropertiesModel);
- filteredPropertiesComponent.addItemListener(new FilteredPropertyChangeListener());
- add(Box.createHorizontalGlue(), gridBagConstraints);
- gridBagConstraints.gridx++;
- filteredPropertiesComponent.setAlignmentY(Component.TOP_ALIGNMENT);
- add(filteredPropertiesComponent, gridBagConstraints);
- gridBagConstraints.gridx++;
- filteredPropertiesComponent.setRenderer(filterController.getConditionRenderer());
- //Search condition
- elementaryConditions = new JComboBox();
- elementaryConditions.addItemListener(new ElementaryConditionChangeListener());
- elementaryConditions.setAlignmentY(Component.TOP_ALIGNMENT);
- add(elementaryConditions, gridBagConstraints);
- gridBagConstraints.gridx++;
- elementaryConditions.setRenderer(filterController.getConditionRenderer());
- //Search value
- values = new JComboBox();
- values.setPreferredSize(new Dimension(240,20));
- gridBagConstraints.anchor = GridBagConstraints.WEST;
- add(values, gridBagConstraints);
- if(horizontal){
- gridBagConstraints.gridx++;
- }
- else{
- gridBagConstraints.gridy++;
- }
- values.setEditable(true);
- setValuesEnterKeyListener();
-
- JPanel ignoreCaseAndApproximateMatchingPanel = new JPanel();
- ignoreCaseAndApproximateMatchingPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
-
- // Ignore case checkbox
- caseSensitive = new JCheckBox();
- caseSensitive.setModel(filterController.getCaseSensitiveButtonModel());
- caseSensitive.setToolTipText(TextUtils.getRawText(PROPERTY_FILTER_MATCH_CASE_TOOLTIP));
- //add(caseSensitive, gridBagConstraints);
- ignoreCaseAndApproximateMatchingPanel.add(caseSensitive);
- //gridBagConstraints.gridx++;
- MenuBuilder.setLabelAndMnemonic(caseSensitive,TextUtils.getRawText(PROPERTY_FILTER_MATCH_CASE));
- caseSensitive.setSelected(ResourceController.getResourceController().getBooleanProperty(
- PROPERTY_FILTER_MATCH_CASE));
-
- // add approximate matching checkbox
- approximateMatching = new JCheckBox();
- approximateMatching.setModel(filterController.getApproximateMatchingButtonModel());
- approximateMatching.setToolTipText(TextUtils.getRawText(PROPERTY_FILTER_APPROXIMATE_MATCH_TOOLTIP));
- MenuBuilder.setLabelAndMnemonic(approximateMatching, TextUtils.getRawText(PROPERTY_FILTER_APPROXIMATE_MATCH));
- //add(approximateMatching, gridBagConstraints);
- ignoreCaseAndApproximateMatchingPanel.add(approximateMatching);
- approximateMatching.setSelected(ResourceController.getResourceController().getBooleanProperty(
- PROPERTY_FILTER_APPROXIMATE_MATCH));
- mapChanged(Controller.getCurrentController().getMap());
-
- add(ignoreCaseAndApproximateMatchingPanel, gridBagConstraints);
-
- }
-
- public void focusInputField(final boolean selectAll) {
- if (values.isEnabled()) {
- values.requestFocusInWindow();
- final Component editorComponent = values.getEditor().getEditorComponent();
- if (selectAll && editorComponent instanceof JTextComponent) {
- ((JTextComponent) editorComponent).selectAll();
- }
- return;
- }
- }
-
- public boolean isInputFieldFocused(){
- if (values.isFocusOwner())
- return true;
- if (values.isPopupVisible() || values.getEditor().getEditorComponent().isFocusOwner())
- return true;
- return false;
- }
-
- public ASelectableCondition getCondition() {
- ASelectableCondition newCond;
- Object value;
- if(values.isEditable()){
- value = values.getEditor().getItem();
- }
- else{
- value = values.getSelectedItem();
- }
- if (value == null) {
- value = "";
- }
- final NamedObject simpleCond = (NamedObject) elementaryConditions.getSelectedItem();
- final boolean matchCase = caseSensitive.isSelected();
- final boolean matchApproximately = approximateMatching.isSelected();
- ResourceController.getResourceController().setProperty(PROPERTY_FILTER_MATCH_CASE, matchCase);
- final Object selectedItem = filteredPropertiesComponent.getSelectedItem();
- newCond = filterController.getConditionFactory().createCondition(selectedItem, simpleCond, value, matchCase, matchApproximately);
- if (values.isEditable()) {
- if (!value.equals("")) {
- DefaultComboBoxModel list = (DefaultComboBoxModel) values.getModel();
- int indexOfValue = list.getIndexOf(value);
- if(indexOfValue > 0)
- list.removeElementAt(indexOfValue);
- if(indexOfValue == -1 || list.getIndexOf(value) != indexOfValue){
- values.insertItemAt(value, 0);
- values.setSelectedIndex(0);
- }
- else if(indexOfValue != -1){
- values.setSelectedIndex(indexOfValue);
- }
- if (values.getItemCount() >= 10) {
- values.removeItemAt(9);
- }
- }
- }
- return newCond;
- }
-
- /**
- */
- public void mapChanged(final MapModel newMap) {
- if (newMap != null) {
- if (lastMap != null && lastMap.get() == newMap) {
- return;
- }
- filteredPropertiesModel.removeAllElements();
- final Iterator<IElementaryConditionController> conditionIterator = filterController.getConditionFactory()
- .conditionIterator();
- while (conditionIterator.hasNext()) {
- final IElementaryConditionController next = conditionIterator.next();
- filteredPropertiesModel.addExtensionList(next.getFilteredProperties());
- filteredPropertiesModel.setSelectedItem(filteredPropertiesModel.getElementAt(0));
- }
- }
- else {
- filteredPropertiesComponent.setSelectedIndex(-1);
- filteredPropertiesModel.setExtensionList(null);
- }
- lastMap = new WeakReference<MapModel>(newMap);
- }
-
- public void setEnterKeyActionListener(ActionListener enterKeyActionListener) {
- if (enterKeyActionListener == null)
- {
- throw new NullPointerException("null value in setEnterKeyActionListener()!");
- }
- if (this.enterKeyActionListener != null)
- {
- values.getEditor().removeActionListener(this.enterKeyActionListener);
- }
- this.enterKeyActionListener = enterKeyActionListener;
- values.getEditor().addActionListener(enterKeyActionListener);
- }
-
- @Override
- public void setEnabled(boolean enabled) {
- super.setEnabled(enabled);
- for(int i = 0; i < getComponentCount(); i++){
- Component c = getComponent(i);
- c.setEnabled(enabled);
- if (c instanceof JComboBox)
- ((JComboBox)c).getEditor().getEditorComponent().setEnabled(enabled);
- }
- }
-
-
-
-}
diff --git a/freeplane/src/org/freeplane/features/filter/FilterController.java b/freeplane/src/org/freeplane/features/filter/FilterController.java
deleted file mode 100644
index d53fb9d..0000000
--- a/freeplane/src/org/freeplane/features/filter/FilterController.java
+++ /dev/null
@@ -1,621 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import java.awt.Component;
-import java.awt.EventQueue;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.security.AccessControlException;
-import java.util.Vector;
-
-import javax.swing.ButtonModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JToggleButton;
-import javax.swing.JToolBar;
-import javax.swing.SwingConstants;
-import javax.swing.event.AncestorEvent;
-import javax.swing.event.AncestorListener;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.ListDataEvent;
-import javax.swing.event.ListDataListener;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.core.ui.components.FreeplaneToolBar;
-import org.freeplane.core.ui.components.JAutoToggleButton;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.filter.condition.DefaultConditionRenderer;
-import org.freeplane.features.filter.condition.ICondition;
-import org.freeplane.features.filter.condition.NoFilteringCondition;
-import org.freeplane.features.filter.condition.SelectedViewCondition;
-import org.freeplane.features.filter.condition.SelectedViewSnapshotCondition;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.MapController.Direction;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapNavigationUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.ui.ToggleToolbarAction;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.n3.nanoxml.IXMLParser;
-import org.freeplane.n3.nanoxml.IXMLReader;
-import org.freeplane.n3.nanoxml.StdXMLReader;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.n3.nanoxml.XMLParserFactory;
-import org.freeplane.n3.nanoxml.XMLWriter;
-
-/**
- * @author Dimitry Polivaev
- */
-public class FilterController implements IMapSelectionListener, IExtension {
- @SuppressWarnings("serial")
- @SelectableAction(checkOnPopup = true)
- private class ToggleFilterToolbarAction extends ToggleToolbarAction {
- private ToggleFilterToolbarAction(String actionName, String toolbarName) {
- super(actionName, toolbarName);
- }
-
- @Override
- public void actionPerformed(ActionEvent event) {
- if(isVisible() && ! quickEditor.isInputFieldFocused() && (EventQueue.getCurrentEvent() instanceof KeyEvent))
- quickEditor.focusInputField(true);
- else
- super.actionPerformed(event);
- }
-
- @Override
- protected void setVisible(final JComponent toolBar, final boolean visible) {
- quickEditor.addAncestorListener(new AncestorListener() {
- public void ancestorAdded(final AncestorEvent event) {
- quickEditor.focusInputField(true);
- quickEditor.removeAncestorListener(this);
- }
- public void ancestorMoved(final AncestorEvent event) {
- }
- public void ancestorRemoved(final AncestorEvent event) {
- final Component selectedComponent = Controller.getCurrentController().getMapViewManager().getSelectedComponent();
- if(selectedComponent != null)
- selectedComponent.requestFocusInWindow();
- quickEditor.removeAncestorListener(this);
- }
- });
- super.setVisible(toolBar, visible);
- }
- }
-
- private class FilterChangeListener implements ListDataListener, ChangeListener {
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent
- * )
- */
- public FilterChangeListener() {
- }
-
- public void contentsChanged(final ListDataEvent e) {
- if (e.getIndex0() == -1) {
- applyFilter(false);
- }
- }
-
- public void intervalAdded(final ListDataEvent e) {
- }
-
- public void intervalRemoved(final ListDataEvent e) {
- }
-
- public void stateChanged(final ChangeEvent e) {
- applyFilter(false);
- }
- }
-
- static final String FREEPLANE_FILTER_EXTENSION_WITHOUT_DOT = "mmfilter";
- private static final ASelectableCondition NO_FILTERING = NoFilteringCondition.createCondition();
-
- public static FilterController getController(Controller controller) {
- return controller.getExtension(FilterController.class);
- }
-
- public static FilterController getCurrentFilterController() {
- return getController(Controller.getCurrentController());
- }
-
- public static void install() {
- Controller.getCurrentController().addExtension(FilterController.class, new FilterController());
- }
-
- private final ButtonModel applyToVisibleNodeOnly;
- private ConditionFactory conditionFactory;
- private DefaultConditionRenderer conditionRenderer = null;
-// // private final Controller controller;
- final private FilterChangeListener filterChangeListener;
- private DefaultComboBoxModel filterConditions;
- private final FilterMenuBuilder filterMenuBuilder;
- private JToolBar filterToolbar;
- private final FilterHistory history;
- private Filter inactiveFilter;
- final private String pathToFilterFile;
- private ASelectableCondition selectedViewCondition;
- private final ButtonModel showAncestors;
- private final ButtonModel approximateMatchingButtonModel;
- private final ButtonModel caseSensitiveButtonModel;
- private final ButtonModel showDescendants;
- private final ButtonModel highlightNodes;
- private ASelectableCondition highlightCondition;
- private JComboBox activeFilterConditionComboBox;
- private final FilterConditionEditor quickEditor;
-
- public FilterController() {
- Controller controller = Controller.getCurrentController();
- filterMenuBuilder = new FilterMenuBuilder(this);
- history = new FilterHistory();
- filterChangeListener = new FilterChangeListener();
- showAncestors = new JToggleButton.ToggleButtonModel();
- showAncestors.setSelected(true);
- showAncestors.addChangeListener(filterChangeListener);
- showDescendants = new JToggleButton.ToggleButtonModel();
- showDescendants.setSelected(false);
- showDescendants.addChangeListener(filterChangeListener);
- highlightNodes = new JToggleButton.ToggleButtonModel();
- highlightNodes.setSelected(false);
- applyToVisibleNodeOnly = new JToggleButton.ToggleButtonModel();
- applyToVisibleNodeOnly.setSelected(false);
- approximateMatchingButtonModel = new JToggleButton.ToggleButtonModel();
- approximateMatchingButtonModel.setSelected(false);
- caseSensitiveButtonModel = new JToggleButton.ToggleButtonModel();
- caseSensitiveButtonModel.setSelected(false);
-
- controller.getMapViewManager().addMapSelectionListener(this);
- final AFreeplaneAction showFilterToolbar = new ToggleFilterToolbarAction("ShowFilterToolbarAction", "/filter_toolbar");
- quickEditor = new FilterConditionEditor(this, 0, true);
- quickEditor.setEnterKeyActionListener( new ActionListener() {
-
- public void actionPerformed(ActionEvent e) {
- ((QuickFindAction)Controller.getCurrentController().getAction("QuickFindAction.FORWARD")).executeAction(true);
- if(getHighlightNodes().isSelected()){
- setHighlightCondition( quickEditor.getCondition());
- }
- }
-
- }
- );
- controller.addAction(showFilterToolbar);
- controller.addAction(new ApplyNoFilteringAction(this));
- controller.addAction(new ApplySelectedViewConditionAction(this));
- controller.addAction(new EditFilterAction(this));
- controller.addAction(new UndoFilterAction(this));
- controller.addAction(new RedoFilterAction(this));
- controller.addAction(new ReapplyFilterAction(this));
- controller.addAction(new ShowAncestorsAction(this));
- controller.addAction(new ShowDescendantsAction(this));
- controller.addAction(new ApplyToVisibleAction(this));
- controller.addAction(new QuickFilterAction(this, quickEditor));
- controller.addAction(new QuickFindAction(this, quickEditor, Direction.BACK));
- controller.addAction(new QuickFindAction(this, quickEditor, Direction.FORWARD));
- controller.addAction(new QuickFindAllAction(this, quickEditor));
- controller.addAction(new QuickHighlightAction(this, quickEditor));
-
- final FindAction find = new FindAction();
- controller.addAction(find);
- pathToFilterFile = ResourceController.getResourceController().getFreeplaneUserDirectory() + File.separator
- + "auto." + FilterController.FREEPLANE_FILTER_EXTENSION_WITHOUT_DOT;
- }
-
- private void addStandardConditions() {
- final ASelectableCondition noFiltering = NO_FILTERING;
- filterConditions.insertElementAt(noFiltering, 0);
- if (selectedViewCondition == null) {
- selectedViewCondition = SelectedViewCondition.CreateCondition();
- }
- filterConditions.insertElementAt(selectedViewCondition, 1);
- if (filterConditions.getSelectedItem() == null) {
- filterConditions.setSelectedItem(noFiltering);
- }
- }
-
- /**
- */
- public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
- if(filterToolbar == null){
- return;
- }
- history.clear();
- if (newMap != null) {
- filterToolbar.setEnabled(true);
- activeFilterConditionComboBox.setEnabled(true);
- quickEditor.setEnabled(true);
- quickEditor.mapChanged(newMap);
- final Filter filter = newMap.getFilter();
- updateSettingsFromFilter(filter);
- }
- else {
- filterConditions.setSelectedItem(filterConditions.getElementAt(0));
- filterToolbar.setEnabled(false);
- quickEditor.setEnabled(false);
- activeFilterConditionComboBox.setEnabled(false);
- }
- }
-
- void applyFilter(final boolean force) {
- final ASelectableCondition selectedCondition = getSelectedCondition();
- final Filter filter = createFilter(selectedCondition);
- final ICondition condition = filter.getCondition();
- if(condition != selectedCondition && condition instanceof ASelectableCondition)
- getFilterConditions().setSelectedItem(condition);
- else
- applyFilter(filter, Controller.getCurrentController().getMap(), force);
- }
-
- public void applyFilter(final Filter filter, MapModel map, final boolean force) {
- filter.applyFilter(this, map, force);
- history.add(filter);
- }
-
- public void applyNoFiltering() {
- getFilterConditions().setSelectedItem(NO_FILTERING);
- }
-
- void applySelectedViewCondition() {
- if (getFilterConditions().getSelectedItem() != selectedViewCondition) {
- getFilterConditions().setSelectedItem(selectedViewCondition);
- }
- else {
- applyFilter(true);
- }
- }
-
- public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
- }
-
- private Filter createFilter(final ASelectableCondition selectedCondition) {
-
- final ASelectableCondition filterCondition;
- if (selectedCondition == null || selectedCondition.equals(NO_FILTERING)) {
- filterCondition = null;
- }
- else if (selectedCondition.equals(selectedViewCondition)) {
- filterCondition = new SelectedViewSnapshotCondition();
- }
- else {
- filterCondition = selectedCondition;
- }
- final Filter filter = new Filter(filterCondition, showAncestors.isSelected(), showDescendants
- .isSelected(), applyToVisibleNodeOnly.isSelected());
- return filter;
- }
-
- private JToolBar createFilterToolbar() {
- final JToolBar filterToolbar = new FreeplaneToolBar("filter_toolbar", SwingConstants.HORIZONTAL);
- filterToolbar.setVisible(ResourceController.getResourceController()
- .getBooleanProperty("filter_toolbar_visible"));
- filterToolbar.putClientProperty(ViewController.VISIBLE_PROPERTY_KEY, "filter_toolbar_visible");
- Controller controller = Controller.getCurrentController();
- final JButton undoBtn = new JButton(controller.getAction("UndoFilterAction"));
- final JButton redoBtn = new JButton(controller.getAction("RedoFilterAction"));
- final JToggleButton showAncestorsBox = new JAutoToggleButton(controller.getAction("ShowAncestorsAction"),
- showAncestors);
- showAncestorsBox.setSelected(showAncestors.isSelected());
- final JToggleButton showDescendantsBox = new JAutoToggleButton(controller.getAction("ShowDescendantsAction"),
- showDescendants);
- final JToggleButton applyToVisibleBox = new JAutoToggleButton(controller.getAction("ApplyToVisibleAction"),
- applyToVisibleNodeOnly);
- final JButton btnEdit = new JButton(controller.getAction("EditFilterAction"));
- activeFilterConditionComboBox = new JComboBox(getFilterConditions());
- final JButton applyBtn = new JButton(controller.getAction("ReapplyFilterAction"));
- final JButton filterSelectedBtn = new JButton(controller.getAction("ApplySelectedViewConditionAction"));
- final JButton noFilteringBtn = new JButton(controller.getAction("ApplyNoFilteringAction"));
- final JButton applyFindPreviousBtn = new JButton(controller.getAction("QuickFindAction.BACK"));
- final JButton applyFindNextBtn = new JButton(controller.getAction("QuickFindAction.FORWARD"));
- final JButton applyQuickFilterBtn = new JButton(controller.getAction("QuickFilterAction"));
- final JButton applyQuickSelectBtn = new JButton(controller.getAction("QuickFindAllAction"));
- final JToggleButton applyQuickHighlightBtn = new JAutoToggleButton(controller.getAction("QuickHighlightAction"));
-
- filterToolbar.addSeparator();
- filterToolbar.add(undoBtn);
- filterToolbar.add(redoBtn);
- filterToolbar.add(showAncestorsBox);
- filterToolbar.add(showDescendantsBox);
- filterToolbar.add(applyToVisibleBox);
- filterToolbar.add(activeFilterConditionComboBox);
- filterToolbar.add(applyBtn);
- filterToolbar.add(filterSelectedBtn);
- filterToolbar.add(noFilteringBtn);
- filterToolbar.add(btnEdit);
- filterToolbar.addSeparator();
- filterToolbar.add(quickEditor);
- filterToolbar.add(applyFindPreviousBtn);
- filterToolbar.add(applyFindNextBtn);
- filterToolbar.add(applyQuickSelectBtn);
- filterToolbar.add(applyQuickFilterBtn);
- filterToolbar.add(applyQuickHighlightBtn);
- final DefaultConditionRenderer toolbarConditionRenderer = new DefaultConditionRenderer(TextUtils.getText("filter_no_filtering"), false);
- activeFilterConditionComboBox.setRenderer(toolbarConditionRenderer);
- return filterToolbar;
- }
-
- public Filter createTransparentFilter() {
- if (inactiveFilter == null) {
- inactiveFilter = Filter.createTransparentFilter();
- }
- return inactiveFilter;
- }
-
- protected ButtonModel getApplyToVisibleNodeOnly() {
- return applyToVisibleNodeOnly;
- }
-
- public ConditionFactory getConditionFactory() {
- if (conditionFactory == null) {
- conditionFactory = new ConditionFactory();
- }
- return conditionFactory;
- }
-
- DefaultConditionRenderer getConditionRenderer() {
- if (conditionRenderer == null) {
- conditionRenderer = new DefaultConditionRenderer(TextUtils.getText("filter_no_filtering"), true);
- }
- return conditionRenderer;
- }
-
- public DefaultComboBoxModel getFilterConditions() {
- if (filterConditions == null) {
- initConditions();
- }
- return filterConditions;
- }
-
- /**
- */
- public JToolBar getFilterToolbar() {
- if (filterToolbar == null) {
- filterToolbar = createFilterToolbar();
- }
- return filterToolbar;
- }
-
- public FilterHistory getHistory() {
- return history;
- }
-
- ASelectableCondition getSelectedCondition() {
- return (ASelectableCondition) getFilterConditions().getSelectedItem();
- }
-
- public ButtonModel getShowAncestors() {
- return showAncestors;
- }
-
- public ButtonModel getShowDescendants() {
- return showDescendants;
- }
-
- public ButtonModel getHighlightNodes() {
- return highlightNodes;
- }
-
- public ASelectableCondition getHighlightCondition() {
- return highlightCondition;
- }
-
- void setHighlightCondition(final ASelectableCondition condition) {
- if(condition != null){
- this.highlightCondition = condition;
- getHighlightNodes().setSelected(true);
- }
- else{
- this.highlightCondition = null;
- }
- final Component mapViewComponent = Controller.getCurrentController().getMapViewManager().getMapViewComponent();
- if(mapViewComponent != null)
- mapViewComponent.repaint();
- }
-
- private void initConditions() {
- filterConditions = new DefaultComboBoxModel();
- addStandardConditions();
- filterConditions.setSelectedItem(filterConditions.getElementAt(0));
- filterConditions.addListDataListener(filterChangeListener);
- }
-
- public void loadDefaultConditions() {
- try {
- loadConditions(getFilterConditions(), pathToFilterFile, false);
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
-
- void loadConditions(final DefaultComboBoxModel filterConditionModel, final String pathToFilterFile,
- final boolean showPopupOnError)
- throws IOException {
- try {
- final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
- File filterFile = new File(pathToFilterFile);
- final IXMLReader reader = new StdXMLReader(new BufferedInputStream(new FileInputStream(filterFile)));
- parser.setReader(reader);
- reader.setSystemID(filterFile.toURL().toString());
- final XMLElement loader = (XMLElement) parser.parse();
- final Vector<XMLElement> conditions = loader.getChildren();
- for (int i = 0; i < conditions.size(); i++) {
- final ASelectableCondition condition = getConditionFactory().loadCondition(conditions.get(i));
- if(condition != null){
- filterConditionModel.addElement(condition);
- }
- }
- }
- catch (final FileNotFoundException e) {
- }
- catch (final AccessControlException e) {
- }
- catch (final Exception e) {
- LogUtils.warn(e);
- if (showPopupOnError) {
- UITools.errorMessage(TextUtils.getText("filters_not_loaded"));
- }
- }
- }
-
- public void saveConditions() {
- try {
- saveConditions(getFilterConditions(), pathToFilterFile);
- }
- catch (final Exception e) {
- LogUtils.warn(e);
- }
- }
-
- void saveConditions(final DefaultComboBoxModel filterConditionModel, final String pathToFilterFile)
- throws IOException {
- final XMLElement saver = new XMLElement();
- saver.setName("filter_conditions");
- final Writer writer = new FileWriter(pathToFilterFile);
- for (int i = 0; i < filterConditionModel.getSize(); i++) {
- final ASelectableCondition cond = (ASelectableCondition) filterConditionModel.getElementAt(i);
- if (cond != null && !(cond instanceof NoFilteringCondition)) {
- cond.toXml(saver);
- }
- }
- final XMLWriter xmlWriter = new XMLWriter(writer);
- xmlWriter.write(saver, true);
- writer.close();
- }
-
- void setFilterConditions(final DefaultComboBoxModel newConditionModel) {
- filterConditions.removeListDataListener(filterChangeListener);
- filterConditions.removeAllElements();
- for (int i = 0; i < newConditionModel.getSize(); i++) {
- filterConditions.addElement(newConditionModel.getElementAt(i));
- }
- filterConditions.setSelectedItem(newConditionModel.getSelectedItem());
- addStandardConditions();
- filterConditions.addListDataListener(filterChangeListener);
- applyFilter(false);
- Controller controller = Controller.getCurrentController();
- final ModeController modeController = controller.getModeController();
- final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder();
- filterMenuBuilder.updateMenus(modeController, menuBuilder);
- }
-
- private void updateSettingsFromFilter(final Filter filter) {
- getFilterConditions().removeListDataListener(filterChangeListener);
- showAncestors.removeChangeListener(filterChangeListener);
- showDescendants.removeChangeListener(filterChangeListener);
- filterConditions.setSelectedItem(filter.getCondition());
- showAncestors.setSelected(filter.areAncestorsShown());
- showDescendants.setSelected(filter.areDescendantsShown());
- applyToVisibleNodeOnly.setSelected(filter.appliesToVisibleNodesOnly());
- filterConditions.addListDataListener(filterChangeListener);
- showAncestors.addChangeListener(filterChangeListener);
- showDescendants.addChangeListener(filterChangeListener);
- }
-
- void updateSettingsFromHistory() {
- final Filter filter = history.getCurrentFilter();
- updateSettingsFromFilter(filter);
- }
-
- NodeModel findNext(final NodeModel from, final NodeModel end, final Direction direction,
- final ASelectableCondition condition) {
- NodeModel next = from;
- for (;;) {
- do {
- switch (direction) {
- case FORWARD:
- case FORWARD_N_FOLD:
- next = MapNavigationUtils.findNext(direction, next, end);
- break;
- case BACK:
- case BACK_N_FOLD:
- next = MapNavigationUtils.findPrevious(direction, next, end);
- break;
- }
- if (next == null) {
- return null;
- }
- } while (!next.isVisible());
- if (next == from) {
- break;
- }
- if (condition == null || condition.checkNode(next)) {
- return next;
- }
- }
- return null;
- }
-
- public void redo() {
- history.redo();
- updateSettingsFromHistory();
- }
-
- public void undo() {
- history.undo();
- updateSettingsFromHistory();
- }
-
- public boolean isNodeHighlighted(NodeModel node) {
- return highlightCondition != null && highlightCondition.checkNode(node);
- }
-
- public ButtonModel getApproximateMatchingButtonModel() {
- return approximateMatchingButtonModel;
- }
-
- public ButtonModel getCaseSensitiveButtonModel() {
- return caseSensitiveButtonModel;
- }
-
- public void apply(ASelectableCondition condition) {
- final DefaultComboBoxModel filterConditions = getFilterConditions();
- if(condition.equals(filterConditions.getSelectedItem()))
- applyFilter(true);
- else
- filterConditions.setSelectedItem(condition);
- }
-
- public IMenuContributor getMenuContributor() {
- return filterMenuBuilder;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/FilterMenuBuilder.java b/freeplane/src/org/freeplane/features/filter/FilterMenuBuilder.java
deleted file mode 100644
index 70e6435..0000000
--- a/freeplane/src/org/freeplane/features/filter/FilterMenuBuilder.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import java.util.HashSet;
-
-import javax.swing.DefaultComboBoxModel;
-
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.UIBuilder;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.mode.ModeController;
-
-/**
- * @author Dimitry Polivaev
- * 23.03.2013
- */
-public class FilterMenuBuilder implements IMenuContributor {
- private static final String MENU_USER_DEFINED_FILTERS = "menu_user_defined_filters";
- private final FilterController filterController;
- FilterMenuBuilder(FilterController filtercontroller){
- this.filterController = filtercontroller;
- }
- public void updateMenus(ModeController modeController, MenuBuilder builder) {
- if(builder.get(MENU_USER_DEFINED_FILTERS) == null)
- return;
- builder.removeChildElements(MENU_USER_DEFINED_FILTERS);
- final DefaultComboBoxModel filterConditions = filterController.getFilterConditions();
- final HashSet<String> usedNames = new HashSet<String>();
- for(int i = 0; i < filterConditions.getSize(); i++){
- final ASelectableCondition condition = (ASelectableCondition) filterConditions.getElementAt(i);
- final String conditionName = condition.getUserName();
- if(conditionName != null && usedNames.add(conditionName)){
- final ApplyNamedFilterAction action = new ApplyNamedFilterAction(filterController, condition);
- builder.addAction(MENU_USER_DEFINED_FILTERS, action,UIBuilder.AS_CHILD );
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/FindAction.java b/freeplane/src/org/freeplane/features/filter/FindAction.java
deleted file mode 100644
index 47842e1..0000000
--- a/freeplane/src/org/freeplane/features/filter/FindAction.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowFocusListener;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import javax.swing.BorderFactory;
-import javax.swing.JOptionPane;
-import javax.swing.SwingUtilities;
-import javax.swing.event.AncestorEvent;
-import javax.swing.event.AncestorListener;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ICondition;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.MapController.Direction;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-class FindAction extends AFreeplaneAction {
- static final String KEY = "FindAction";
- static private class FindNodeList implements IExtension {
- String rootID;
- final LinkedList<String> nodesUnfoldedByDisplay = new LinkedList<String>();
- ASelectableCondition condition;
-
- static FindNodeList create(final MapModel map) {
- FindNodeList list = FindNodeList.get(map);
- if (list == null) {
- list = new FindNodeList();
- map.addExtension(list);
- }
- return list;
- }
-
- private static FindNodeList get(final MapModel map) {
- if (map == null) {
- return null;
- }
- final FindNodeList list = (FindNodeList) map.getExtension(FindNodeList.class);
- return list;
- }
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private FilterConditionEditor editor;
-
- public FindAction() {
- super(KEY);
- }
-
- public void actionPerformed(final ActionEvent e) {
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- if (selection == null) {
- return;
- }
- final NodeModel start = selection.getSelected();
- if (editor == null) {
- editor = new FilterConditionEditor(FilterController.getCurrentFilterController());
- editor.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(), BorderFactory.createEmptyBorder(5, 0, 5, 0)));
-
- }
- else {
- editor.mapChanged(start.getMap());
- }
- editor.addAncestorListener(new AncestorListener() {
- public void ancestorAdded(final AncestorEvent event) {
- final Component component = event.getComponent();
- final Window windowAncestor = SwingUtilities.getWindowAncestor(component);
- if(windowAncestor.isFocused())
- editor.focusInputField(true);
- else{
- windowAncestor.addWindowFocusListener(new WindowFocusListener() {
- public void windowLostFocus(WindowEvent e) {
- }
-
- public void windowGainedFocus(WindowEvent e) {
- windowAncestor.removeWindowFocusListener(this);
- editor.focusInputField(true);
- }
- });
- windowAncestor.toFront();
- }
- editor.removeAncestorListener(this);
- }
-
- public void ancestorMoved(final AncestorEvent event) {
- }
-
- public void ancestorRemoved(final AncestorEvent event) {
- }
- });
- final int run = UITools.showConfirmDialog(start, editor, TextUtils.getText("FindAction.text"),
- JOptionPane.OK_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);
- final Container parent = editor.getParent();
- if (parent != null) {
- parent.remove(editor);
- }
- if (run != JOptionPane.OK_OPTION) {
- return;
- }
- final ASelectableCondition condition = editor.getCondition();
- findFirst(condition);
- }
-
- void findFirst(final ASelectableCondition condition) {
- final FindNodeList info = FindNodeList.create(Controller.getCurrentController().getMap());
- info.condition = condition;
- if (info.condition == null) {
- return;
- }
- info.rootID = Controller.getCurrentController().getSelection().getSelected().createID();
- findNext();
- }
-
- void findNext() {
- final MapModel map = Controller.getCurrentController().getMap();
- final FindNodeList info = FindNodeList.get(map);
- if (info == null || info.condition == null) {
- displayNoPreviousFindMessage();
- return;
- }
- final FilterController filterController = FilterController.getCurrentFilterController();
- final NodeModel start = Controller.getCurrentController().getSelection().getSelected();
- final NodeModel root = map.getNodeForID(info.rootID);
- if (root == null) {
- info.condition = null;
- displayNoPreviousFindMessage();
- return;
- }
- for (NodeModel n = start; !root.equals(n); n = n.getParentNode()) {
- if (n == null) {
- info.condition = null;
- displayNoPreviousFindMessage();
- return;
- }
- }
- final NodeModel next = filterController.findNext(start, null, Direction.FORWARD, info.condition);
- if (next == null) {
- displayNotFoundMessage(root, info.condition);
- return;
- }
- displayNode(info, next);
- }
-
- private void displayNoPreviousFindMessage() {
- UITools.informationMessage(Controller.getCurrentController().getViewController().getFrame(), TextUtils
- .getText("no_previous_find"));
- }
-
- /**
- * Display a node in the display (used by find and the goto action by arrow
- * link actions).
- */
- private void displayNode(final FindNodeList info, final NodeModel node) {
- final MapModel map = node.getMap();
- final LinkedList<String> nodesUnfoldedByDisplay = new LinkedList<String>();
- NodeModel nodeOnPath = null;
- for (nodeOnPath = node; nodeOnPath != null && !info.nodesUnfoldedByDisplay.contains(nodeOnPath.createID()); nodeOnPath = nodeOnPath
- .getParentNode()) {
- if (Controller.getCurrentModeController().getMapController().isFolded(nodeOnPath)) {
- nodesUnfoldedByDisplay.add(nodeOnPath.createID());
- }
- }
- final ListIterator<String> oldPathIterator = info.nodesUnfoldedByDisplay
- .listIterator(info.nodesUnfoldedByDisplay.size());
- while (oldPathIterator.hasPrevious()) {
- final String oldPathNodeID = oldPathIterator.previous();
- final NodeModel oldPathNode = map.getNodeForID(oldPathNodeID);
- if (oldPathNode != null && oldPathNode.equals(nodeOnPath)) {
- break;
- }
- oldPathIterator.remove();
- if (oldPathNode != null) {
- Controller.getCurrentModeController().getMapController().setFolded(oldPathNode, true);
- }
- }
- info.nodesUnfoldedByDisplay.addAll(nodesUnfoldedByDisplay);
- Controller.getCurrentModeController().getMapController().select(node);
- }
-
- private void displayNotFoundMessage(final NodeModel start, final ICondition condition) {
- final String message = TextUtils.format("no_more_found_from", condition.toString(), getFindFromText(start));
- UITools.informationMessage(Controller.getCurrentController().getViewController().getFrame(), message);
- }
-
- public String getFindFromText(final NodeModel node) {
- final String plainNodeText = node.toString().replaceAll("\n", " ");
- return plainNodeText.length() <= 30 ? plainNodeText : plainNodeText.substring(0, 30) + "...";
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/NextPresentationItemAction.java b/freeplane/src/org/freeplane/features/filter/NextPresentationItemAction.java
deleted file mode 100644
index 0cf4510..0000000
--- a/freeplane/src/org/freeplane/features/filter/NextPresentationItemAction.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.freeplane.features.filter;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.map.HideChildSubtree;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.MapController.Direction;
-import org.freeplane.features.mode.Controller;
-
-public class NextPresentationItemAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public NextPresentationItemAction() {
- super("NextPresentationItemAction");
- }
-
- /**
- *
- */
- public void actionPerformed(final ActionEvent e) {
- final FilterController filterController = FilterController.getCurrentFilterController();
- final NodeModel start = Controller.getCurrentController().getSelection().getSelected();
- final NodeModel next = filterController.findNext(start, null, Direction.FORWARD_N_FOLD, null);
- if(next != null){
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- if (!next.isVisible()) {
- next.getFilterInfo().reset();
- mapController.nodeRefresh(next);
- }
- final NodeModel[] path = next.getPathToRoot();
- for (int i = 1; i < path.length; i++) {
- final NodeModel nodeOnPath = path[i];
- final NodeModel parentNode = nodeOnPath.getParentNode();
- while(parentNode.isFolded() || nodeOnPath.containsExtension(HideChildSubtree.class))
- mapController.showNextChild(parentNode);
- }
- Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(next);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/QuickFilterAction.java b/freeplane/src/org/freeplane/features/filter/QuickFilterAction.java
deleted file mode 100644
index 73aaf38..0000000
--- a/freeplane/src/org/freeplane/features/filter/QuickFilterAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-
-/**
- * @author Dimitry Polivaev
- * Mar 30, 2009
- */
-final class QuickFilterAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- /**
- *
- */
- private final FilterController filterController;
- private final FilterConditionEditor filterEditor;
-
- /**
- * @param filterController
- * @param quickEditor
- */
- QuickFilterAction(final FilterController filterController, FilterConditionEditor quickEditor) {
- super("QuickFilterAction");
- this.filterController = filterController;
- this.filterEditor = quickEditor;
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ASelectableCondition condition = filterEditor.getCondition();
- if(condition == null){
- return;
- }
- filterController.apply(condition);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/QuickFindAction.java b/freeplane/src/org/freeplane/features/filter/QuickFindAction.java
deleted file mode 100644
index 415a26e..0000000
--- a/freeplane/src/org/freeplane/features/filter/QuickFindAction.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.MapController.Direction;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- * Mar 30, 2009
- */
-final class QuickFindAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- /**
- *
- */
- private final FilterConditionEditor filterEditor;
- private final FilterController filterController;
- private final Direction direction;
-
-
- /**
- * @param filterController
- * @param quickEditor
- */
- QuickFindAction(final FilterController filterController, FilterConditionEditor quickEditor, final Direction direction) {
- super("QuickFindAction." + direction);
- this.filterController = filterController;
- this.filterEditor = quickEditor;
- this.direction =direction ;
- }
-
- public void executeAction(final boolean reFocusSearchInputField)
- {
- final ASelectableCondition condition = filterEditor.getCondition();
- if(condition == null){
- return;
- }
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- if(selection == null){
- return;
- }
- final NodeModel selected = selection.getSelected();
-
- final NodeModel next;
- try
- {
- filterEditor.setSearchingBusyCursor();
- next = filterController.findNext(selected, null, direction, condition);
- }
- finally
- {
- filterEditor.setSearchingDefaultCursor();
- }
-
- if(next != null){
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- mapController.displayNode(next);
- selection.selectAsTheOnlyOneSelected(next);
- if (reFocusSearchInputField)
- {
- // this is called by Enter key listener in FilterConditionEditor
- // => we want to re-focus the search term input field so that one can hit enter
- // again to find the next search result!
- filterEditor.focusInputField(false);
- }
- }
- }
-
- public void actionPerformed(final ActionEvent e) {
- executeAction(false);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/StringMatchingStrategy.java b/freeplane/src/org/freeplane/features/filter/StringMatchingStrategy.java
deleted file mode 100644
index 1a91e37..0000000
--- a/freeplane/src/org/freeplane/features/filter/StringMatchingStrategy.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry Polivaev
- *
- * This file author is Felix Natter
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter;
-
-import org.freeplane.core.resources.ResourceController;
-
-public interface StringMatchingStrategy {
-
- double APPROXIMATE_MATCHING_MINPROB = ResourceController.getResourceController().getDoubleProperty("approximate_search_threshold");
-
- StringMatchingStrategy DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY = new PseudoDamerauLevenshtein();
-
- /**
- * Check for a match between a search term and a text.
- *
- * @param searchTerm the text to search for
- * @param searchText the text to search in
- * @param subStringMatch whether to for substring instead of equality
- * @param caseSensitive whether to honor case
- * @return whether the configuration results in a match
- */
- boolean matches(final String searchTerm, final String searchText, final boolean subStringMatch,
- final boolean caseSensitive);
-
-}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ASelectableCondition.java b/freeplane/src/org/freeplane/features/filter/condition/ASelectableCondition.java
deleted file mode 100644
index 4f5b541..0000000
--- a/freeplane/src/org/freeplane/features/filter/condition/ASelectableCondition.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package org.freeplane.features.filter.condition;
-
-import java.lang.reflect.Method;
-
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-
-import org.freeplane.n3.nanoxml.XMLElement;
-
-
-public abstract class ASelectableCondition implements ICondition{
- public static final float STRING_MIN_MATCH_PROB = 0.7F;
- transient private String description;
- transient private JComponent renderer;
- private String userName;
- private static Method EQUALS;
- private static Method HASH;
- static{
- try{
- final ClassLoader classLoader = ASelectableCondition.class.getClassLoader();
- EQUALS = classLoader.loadClass("org.apache.commons.lang.builder.EqualsBuilder").getMethod("reflectionEquals", Object.class, Object.class);
- HASH = classLoader.loadClass("org.apache.commons.lang.builder.HashCodeBuilder").getMethod("reflectionHashCode", Object.class);
- }
- catch(Exception e){
-
- }
- }
-
- public ASelectableCondition() {
- super();
- }
-
- @Override
- public int hashCode() {
- if(HASH == null){
- return super.hashCode();
- }
- try {
- return (Integer) HASH.invoke(null, this);
- }
- catch (Exception e) {
- e.printStackTrace();
- return super.hashCode();
- }
- }
-
- @Override
- public boolean equals(Object obj) {
- if(EQUALS == null){
- return super.equals(obj);
- }
- try {
- return (Boolean) EQUALS.invoke(null, this, obj);
- }
- catch (Exception e) {
- e.printStackTrace();
- return super.equals(obj);
- }
- }
- protected abstract String createDescription();
-
- final public JComponent getListCellRendererComponent() {
- if (renderer == null) {
- renderer = createRendererComponent();
- if(userName != null){
- final JCondition jCondition = new JCondition();
- jCondition.add(new JLabel(userName + " : "));
- jCondition.add(renderer);
- renderer = jCondition;
- }
- }
- return renderer;
- }
-
- protected JComponent createRendererComponent() {
- return ConditionFactory.createCellRendererComponent(toString());
- }
-
- @Override
- final public String toString() {
- if (description == null) {
- description = createDescription();
- }
- return description;
- }
-
- public void toXml(final XMLElement element) {
- final XMLElement child = new XMLElement();
- child.setName(getName());
- if(userName != null){
- child.setAttribute("user_name", userName);
- }
- fillXML(child);
- element.addChild(child);
- }
-
- protected void fillXML(XMLElement element){}
-
- abstract protected String getName();
-
-
- public void setUserName(String userName) {
- if(userName == this.userName || userName != null && userName.equals(this.userName))
- return;
- this.userName = userName;
- renderer = null;
- }
-
-
- public String getUserName() {
- return userName;
- }
-
-
- protected JComponent createShortRendererComponent() {
- if(userName == null){
- return createRendererComponent();
- }
- final JLabel label = new JLabel('"' + userName + '"');
- return label;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/CompareConditionAdapter.java b/freeplane/src/org/freeplane/features/filter/condition/CompareConditionAdapter.java
deleted file mode 100644
index e9335c2..0000000
--- a/freeplane/src/org/freeplane/features/filter/condition/CompareConditionAdapter.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter.condition;
-
-import java.util.Date;
-
-
-import org.freeplane.core.io.xml.TreeXmlWriter;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.TypeReference;
-import org.freeplane.features.filter.ExactStringMatchingStrategy;
-import org.freeplane.features.filter.StringMatchingStrategy;
-import org.freeplane.features.format.FormattedDate;
-import org.freeplane.features.format.FormattedNumber;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * Adapter for Conditions which compare values (</<=/>/>=/=/!=)
- *
- * @author ?
- *
- */
-abstract public class CompareConditionAdapter extends ASelectableCondition {
- public static final String OBJECT = "OBJECT";
- public static final String MATCH_CASE = "MATCH_CASE";
- public static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
- public static final String VALUE = "VALUE";
- private Comparable<?> conditionValue;
- final private boolean matchCase;
- final protected boolean matchApproximately;
- final StringMatchingStrategy stringMatchingStrategy;
- private int comparisonResult;
- private boolean error;
-
- abstract public boolean isEqualityCondition();
-
- @SuppressWarnings("deprecation")
- protected CompareConditionAdapter(final Object value, final boolean matchCase, final boolean matchApproximately) {
- super();
- this.matchCase = matchCase;
- this.matchApproximately = matchApproximately;
- stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- final ResourceController resourceController = ResourceController.getResourceController();
- if(value instanceof String && resourceController.getBooleanProperty("compare_as_number") && TextUtils.isNumber((String) value)) {
- Number number = TextUtils.toNumber((String) value);
- if(number instanceof Comparable<?>){
- conditionValue = (Comparable<?>) number;
- }
- return;
- }
- if(value instanceof FormattedNumber){
- conditionValue = (FormattedNumber)value;
- return;
- }
-
- if(value instanceof FormattedDate){
- final FormattedDate date = (FormattedDate) value;
- if(date.containsTime() ||
- date.getHours() == 0 && date.getMinutes() == 0 && date.getSeconds() == 0) {
- conditionValue = date;
- }
- else{
- final Date reducedDate = new Date(date.getYear(), date.getMonth(), date.getDate());
- conditionValue = new FormattedDate(reducedDate.getTime(), date.getDateFormat());
- }
- return;
- }
- conditionValue = value.toString();
-
- }
-
- protected CompareConditionAdapter(final Double value) {
- super();
- this.matchCase = false;
- this.matchApproximately = false;
- conditionValue = value;
- stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- }
-
- protected CompareConditionAdapter(final Long value) {
- super();
- this.matchCase = false;
- this.matchApproximately = false;
- conditionValue = value;
- stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- }
-
- @Override
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- if(conditionValue instanceof IFormattedObject){
- child.setAttribute(OBJECT, TypeReference.toSpec(conditionValue));
- }
- else
- child.setAttribute(CompareConditionAdapter.VALUE, conditionValue.toString());
- child.setAttribute(CompareConditionAdapter.MATCH_CASE, TreeXmlWriter.BooleanToXml(matchCase));
- child.setAttribute(CompareConditionAdapter.MATCH_APPROXIMATELY, TreeXmlWriter.BooleanToXml(matchApproximately));
- }
-
- protected void compareTo(final Object transformedContent) throws NumberFormatException {
- error = false;
- comparisonResult = Integer.signum(compareToData(transformedContent));
- }
-
- private int compareToData(final Object transformedContent) {
- if (conditionValue instanceof FormattedNumber && transformedContent instanceof Number){
- return -((FormattedNumber)conditionValue).compareTo((Number)transformedContent);
- }
- if (conditionValue instanceof Number && transformedContent instanceof String) {
- try {
- Number number = TextUtils.toNumber((String)transformedContent);
- if (conditionValue instanceof FormattedNumber){
- return -((FormattedNumber)conditionValue).compareTo(number);
- }
- if(number instanceof Long)
- return compareTo((Long)number);
- if(number instanceof Double)
- return compareTo((Double)number);
- }
- catch (final NumberFormatException fne) {
- };
- error = true;
- return 0;
- }
- if (conditionValue instanceof FormattedDate) {
- if (transformedContent instanceof FormattedDate) {
- return compareTo((FormattedDate)transformedContent);
- }
- error = true;
- return 0;
- }
-
- final String valueAsString = conditionValue.toString();
- final String text = transformedContent.toString();
- if (isEqualityCondition())
- {
- return stringMatchingStrategy.matches(valueAsString, text, false, matchCase) ? 0 : -1;
- }
- else
- {
- return matchCase ? text.compareTo(valueAsString) : text.compareToIgnoreCase(valueAsString);
- }
- }
-
- protected int getComparisonResult() {
- return comparisonResult;
- }
-
- protected boolean isComparisonOK() {
- return ! error;
- }
-
- private int compareTo(final Double value) {
- return value.compareTo(((Number) conditionValue).doubleValue());
- }
-
- protected int compareTo(final Long value) {
- return value.compareTo((Long) conditionValue);
- }
-
- @SuppressWarnings("deprecation")
- private int compareTo(final Date value) {
- if (((FormattedDate) conditionValue).containsTime() || (value.getHours() == 0 && value.getMinutes() == 0 && value.getSeconds() == 0))
- return value.compareTo((Date) conditionValue);
- return new Date(value.getYear(), value.getMonth(), value.getDate()).compareTo((Date) conditionValue);
- }
-
- public String createDescription(final String attribute, final int comparationResult, final boolean succeed) {
- String simpleCondition;
- switch (comparationResult) {
- case -1:
- simpleCondition = succeed ? ConditionFactory.FILTER_LT : ConditionFactory.FILTER_GE;
- break;
- case 0:
- simpleCondition = TextUtils.getText(succeed ? ConditionFactory.FILTER_IS_EQUAL_TO
- : ConditionFactory.FILTER_IS_NOT_EQUAL_TO);
- break;
- case 1:
- simpleCondition = succeed ? ConditionFactory.FILTER_GT : ConditionFactory.FILTER_LE;
- break;
- default:
- throw new IllegalArgumentException();
- }
- return ConditionFactory.createDescription(attribute, simpleCondition, valueDescription(), matchCase, matchApproximately);
- }
-
- private String valueDescription() {
- return conditionValue.toString();
- }
-
- public Comparable<?> getConditionValue() {
- return conditionValue;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/ConditionFactory.java b/freeplane/src/org/freeplane/features/filter/condition/ConditionFactory.java
deleted file mode 100644
index 5331522..0000000
--- a/freeplane/src/org/freeplane/features/filter/condition/ConditionFactory.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter.condition;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- */
-public class ConditionFactory {
- public static final String FILTER_CONTAINS = "filter_contains";
- public static final String FILTER_DOES_NOT_EXIST = "filter_does_not_exist";
- public static final String FILTER_EXIST = "filter_exist";
- public static final String FILTER_GE = ">=";
- public static final String FILTER_GT = ">";
- public static final String FILTER_MATCH_CASE = "filter_match_case";
- public static final String FILTER_MATCH_APPROX = "filter_match_approximately";
- public static final String FILTER_IS_EQUAL_TO = "filter_is_equal_to";
- public static final String FILTER_IS_NOT_EQUAL_TO = "filter_is_not_equal_to";
- public static final String FILTER_LE = "<=";
- public static final String FILTER_LT = "<";
- public static final String FILTER_REGEXP = "filter_regexp_matches";
-
- static public JComponent createCellRendererComponent(final String description) {
- final JCondition component = new JCondition();
- final JLabel label = new JLabel(description);
- component.add(label);
- return component;
- }
-
- public static String createDescription(final String attribute, final String simpleCondition, final String value,
- final boolean matchCase, final boolean matchApproximately) {
- final String description = attribute + " " + simpleCondition + (value != null ? " \"" + value + "\"" : "")
- + (matchCase && value != null ? ", " + TextUtils.getText(ConditionFactory.FILTER_MATCH_CASE) : "")
- + (matchApproximately && value != null ? ", " + TextUtils.getText(ConditionFactory.FILTER_MATCH_APPROX) : "");
- return description;
- }
-
- final private SortedMap<Integer, IElementaryConditionController> conditionControllers;
-
- public ConditionFactory() {
- conditionControllers = new TreeMap<Integer, IElementaryConditionController>();
- }
-
- public void addConditionController(final int position, final IElementaryConditionController controller) {
- final IElementaryConditionController old = conditionControllers.put(new Integer(position), controller);
- assert old == null;
- }
-
- public Iterator<IElementaryConditionController> conditionIterator() {
- final Iterator<IElementaryConditionController> iterator = conditionControllers.values().iterator();
- return iterator;
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCond,
- final Object value, final boolean matchCase,
- final boolean matchApproximately) {
- return getConditionController(selectedItem).createCondition(selectedItem, simpleCond, value, matchCase,
- matchApproximately);
- }
-
- public IElementaryConditionController getConditionController(final Object item) {
- final Iterator<IElementaryConditionController> iterator = conditionIterator();
- while (iterator.hasNext()) {
- final IElementaryConditionController next = iterator.next();
- if (next.canHandle(item)) {
- return next;
- }
- }
- throw new NoSuchElementException();
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- final ASelectableCondition condition = loadCondition2(element);
- if(condition != null){
- final String userName = element.getAttribute("user_name", null);
- condition.setUserName(userName);
- }
- return condition;
- }
-
- private ASelectableCondition loadCondition2(final XMLElement element) {
- if (element.getName().equalsIgnoreCase(ConditionNotSatisfiedDecorator.NAME)) {
- return ConditionNotSatisfiedDecorator.load(this, element);
- }
- if (element.getName().equalsIgnoreCase(ConjunctConditions.NAME)) {
- return ConjunctConditions.load(this, element);
- }
- if (element.getName().equalsIgnoreCase(DisjunctConditions.NAME)) {
- return DisjunctConditions.load(this, element);
- }
- final Iterator<IElementaryConditionController> conditionIterator = conditionIterator();
- while (conditionIterator.hasNext()) {
- final ASelectableCondition condition = conditionIterator.next().loadCondition(element);
- if (condition != null) {
- return condition;
- }
- }
- return null;
- }
-
- public IElementaryConditionController removeConditionController(final int position,
- final IElementaryConditionController controller) {
- final IElementaryConditionController old = conditionControllers.remove(new Integer(position));
- return old;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/IElementaryConditionController.java b/freeplane/src/org/freeplane/features/filter/condition/IElementaryConditionController.java
deleted file mode 100644
index 7a1caf3..0000000
--- a/freeplane/src/org/freeplane/features/filter/condition/IElementaryConditionController.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter.condition;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * 21.12.2008
- */
-public interface IElementaryConditionController {
- boolean canEditValues(final Object property, final NamedObject simpleCond);
-
- boolean canHandle(final Object selectedItem);
-
- boolean canSelectValues(final Object property, final NamedObject simpleCond);
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCond,
- final Object value, final boolean matchCase,
- final boolean approximateMatching);
-
- ComboBoxModel getConditionsForProperty(final Object property);
-
- ListModel getFilteredProperties();
-
- ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition);
-
- ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition);
-
- ComboBoxModel getValuesForProperty(final Object property, NamedObject simpleCond);
-
- boolean isCaseDependent(final Object property, final NamedObject simpleCond);
-
- boolean supportsApproximateMatching(final Object property, final NamedObject simpleCond);
-
- ASelectableCondition loadCondition(final XMLElement element);
-}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/SelectedViewCondition.java b/freeplane/src/org/freeplane/features/filter/condition/SelectedViewCondition.java
deleted file mode 100644
index b41d829..0000000
--- a/freeplane/src/org/freeplane/features/filter/condition/SelectedViewCondition.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter.condition;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class SelectedViewCondition extends ASelectableCondition {
- private static final String NAME = "selected_view_condition";
- private static String description;
-
- public static ASelectableCondition CreateCondition() {
- return new SelectedViewCondition();
- }
-
-// // private final Controller controller;
-
- public SelectedViewCondition() {
- super();
-// this.controller = controller;
- }
-
- public boolean checkNode(final NodeModel node) {
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- return selection != null && selection.isSelected(node);
- }
-
- @Override
- protected String createDescription() {
- if (SelectedViewCondition.description == null) {
- SelectedViewCondition.description = TextUtils.getText("filter_selected_node_view");
- }
- return SelectedViewCondition.description;
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
- public void toXml(final XMLElement element) {}
-}
diff --git a/freeplane/src/org/freeplane/features/filter/condition/SelectedViewSnapshotCondition.java b/freeplane/src/org/freeplane/features/filter/condition/SelectedViewSnapshotCondition.java
deleted file mode 100644
index 7b46a6b..0000000
--- a/freeplane/src/org/freeplane/features/filter/condition/SelectedViewSnapshotCondition.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.filter.condition;
-
-import java.util.HashSet;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class SelectedViewSnapshotCondition extends ASelectableCondition {
- private static final String NAME = "selected_view_snapshot";
- private static String description;
-
- public static ASelectableCondition CreateCondition() {
- return new SelectedViewSnapshotCondition();
- }
-
- HashSet<NodeModel> selectedNodes;
-
- public SelectedViewSnapshotCondition() {
- super();
- selectedNodes = new HashSet<NodeModel>();
- selectedNodes.addAll(Controller.getCurrentController().getSelection().getSelection());
- }
-
- public boolean checkNode(final NodeModel node) {
- return selectedNodes.contains(node);
- }
-
- @Override
- protected String createDescription() {
- if (SelectedViewSnapshotCondition.description == null) {
- SelectedViewSnapshotCondition.description = TextUtils.getText("filter_selected_node_view_snapshot");
- }
- return SelectedViewSnapshotCondition.description;
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
- public void toXml(final XMLElement element) {}
-}
diff --git a/freeplane/src/org/freeplane/features/format/IdentityPatternFormat.java b/freeplane/src/org/freeplane/features/format/IdentityPatternFormat.java
deleted file mode 100644
index f098416..0000000
--- a/freeplane/src/org/freeplane/features/format/IdentityPatternFormat.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.freeplane.features.format;
-
-import org.freeplane.core.util.TextUtils;
-
-public class IdentityPatternFormat extends PatternFormat {
- public IdentityPatternFormat(String pattern) {
- super(pattern, TYPE_IDENTITY);
- }
-
- IdentityPatternFormat() {
- this(IDENTITY_PATTERN);
- }
-
- @Override
- public String getStyle() {
- return STYLE_FORMATTER;
- }
-
- @Override
- public Object formatObject(Object toFormat) {
- if (toFormat instanceof IFormattedObject)
- return ((IFormattedObject) toFormat).getObject();
- return toFormat;
- }
-
- @Override
- public String toString() {
- return TextUtils.getText(getPattern());
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/format/StandardPatternFormat.java b/freeplane/src/org/freeplane/features/format/StandardPatternFormat.java
deleted file mode 100644
index 5f1b4eb..0000000
--- a/freeplane/src/org/freeplane/features/format/StandardPatternFormat.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.freeplane.features.format;
-
-import org.freeplane.core.util.TextUtils;
-
-class StandardPatternFormat extends PatternFormat {
- public StandardPatternFormat() {
- super(STANDARD_FORMAT_PATTERN, TYPE_STANDARD);
- }
-
- @Override
- public String getStyle() {
- return STYLE_FORMATTER;
- }
-
- @Override
- public Object formatObject(Object toFormat) {
- if (toFormat instanceof IFormattedObject)
- toFormat = ((IFormattedObject) toFormat).getObject();
- return FormatController.formatUsingDefault(toFormat);
- }
-
- @Override
- public String toString() {
- return TextUtils.getText(STANDARD_FORMAT_PATTERN);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/help/AboutAction.java b/freeplane/src/org/freeplane/features/help/AboutAction.java
deleted file mode 100644
index 9d7a4ea..0000000
--- a/freeplane/src/org/freeplane/features/help/AboutAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.help;
-
-import java.awt.KeyboardFocusManager;
-import java.awt.event.ActionEvent;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-
-
-class AboutAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- *
- */
- AboutAction() {
- super("AboutAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- Box box = Box.createVerticalBox();
- String about = TextUtils.getText("about_text") + " " + FreeplaneVersion.getVersion();
- addUri(box, "homepage_url", about);
- addUri(box, "copyright_url", TextUtils.getText("copyright"));
- addMessage(box, FreeplaneVersion.getVersion().getRevision());
- addFormattedMessage(box, "java_version", Compat.JAVA_VERSION);
- addFormattedMessage(box, "main_resource_directory", ResourceController.getResourceController().getResourceBaseDir());
- addUri(box, "license_url", TextUtils.getText("license"));
- addMessage(box, TextUtils.getText("license_text"));
-
- JOptionPane.showMessageDialog(UITools.getFrame(), box, TextUtils
- .getText("AboutAction.text"), JOptionPane.INFORMATION_MESSAGE);
- }
-
- private void addFormattedMessage(Box box, String format, String parameter) {
- box.add(new JLabel(TextUtils.format(format, parameter)));
- }
-
- private void addMessage(Box box, String localMessage) {
- box.add(new JLabel(localMessage));
- }
-
- private void addUri(Box box, String uriProperty, String message) {
- try {
- URI uri;
- uri = new URI( ResourceController.getResourceController().getProperty(uriProperty));
- JButton uriButton = UITools.createHtmlLinkStyleButton(uri, message);
- uriButton.setHorizontalAlignment(SwingConstants.LEADING);
- box.add(uriButton);
- } catch (URISyntaxException e1) {
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/help/DocumentationAction.java b/freeplane/src/org/freeplane/features/help/DocumentationAction.java
deleted file mode 100644
index e033bc6..0000000
--- a/freeplane/src/org/freeplane/features/help/DocumentationAction.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.help;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import javax.swing.Action;
-import javax.swing.SwingUtilities;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-
-import org.freeplane.core.util.ConfigurationUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-
-class DocumentationAction extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
- private final String document;
-
- DocumentationAction( final String actionName, final String document) {
- super(actionName);
- this.document = document;
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ResourceController resourceController = ResourceController.getResourceController();
- final File userDir = new File(resourceController.getFreeplaneUserDirectory());
- final File baseDir = new File(resourceController.getInstallationBaseDir());
- final String languageCode = resourceController.getLanguageCode();
- final File file = ConfigurationUtils.getLocalizedFile(new File[]{userDir, baseDir}, document, languageCode);
- if(file == null){
- String name = (String) getValue(Action.NAME);
- String errorMessage = TextUtils.format("invalid_file_msg", name);
- UITools.errorMessage(errorMessage);
- return;
- }
- try {
- final URL endUrl = file.toURL();
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- try {
- if (endUrl.getFile().endsWith(".mm")) {
- Controller.getCurrentController().selectMode(MModeController.MODENAME);
- ((MMapController)Controller.getCurrentModeController().getMapController()).newDocumentationMap(endUrl);
- }
- else {
- Controller.getCurrentController().getViewController().openDocument(endUrl);
- }
- }
- catch (final Exception e1) {
- LogUtils.severe(e1);
- }
- }
- });
- }
- catch (final MalformedURLException e1) {
- LogUtils.warn(e1);
- }
- }
-
- @Override
- public void afterMapChange(final Object newMap) {
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/help/FilePropertiesAction.java b/freeplane/src/org/freeplane/features/help/FilePropertiesAction.java
deleted file mode 100644
index 43aaac0..0000000
--- a/freeplane/src/org/freeplane/features/help/FilePropertiesAction.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.help;
-
-import java.awt.Dimension;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.KeyboardFocusManager;
-import java.awt.event.ActionEvent;
-import java.net.URL;
-import java.text.DateFormat;
-import java.text.DecimalFormat;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Enumeration;
-import javax.swing.BorderFactory;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JSeparator;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.Filter;
-import org.freeplane.features.filter.condition.ICondition;
-import org.freeplane.features.icon.factory.ImageIconFactory;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Stefan Ott
- */
-class FilePropertiesAction extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
-
- FilePropertiesAction() {
- super("FilePropertiesAction");
- }
-
- /**
- * Gets called when File -> Properties is selected
- */
- public void actionPerformed(final ActionEvent e) {
- //variables for informations to be displayed
- final String fileNamePath, fileSavedDateTime, fileSize;
- final int fileChangesSinceSave;
- //get informations
- //if file has been saved once
- final MapModel map = Controller.getCurrentController().getMap();
- if (map.getFile() != null) {
- //fileNamePath
- fileNamePath = map.getFile().toString();
- //fleSavedDateTime as formatted string
- final Calendar c = Calendar.getInstance();
- c.setTimeInMillis(map.getFile().lastModified());
- final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
- fileSavedDateTime = df.format(c.getTime());
- //fileSize as formatted string
- final DecimalFormat def = new DecimalFormat();
- def.setGroupingUsed(true);
- fileSize = def.format(map.getFile().length()) + " "
- + TextUtils.getText("FileRevisionsDialog.file_size");
- //fileChangesSinceSave
- fileChangesSinceSave = map.getNumberOfChangesSinceLastSave();
- }
- else {
- fileNamePath = TextUtils.getText("FileProperties_NeverSaved");
- fileSavedDateTime = TextUtils.getText("FileProperties_NeverSaved");
- fileSize = TextUtils.getText("FileProperties_NeverSaved");
- fileChangesSinceSave = 0;
- }
- //node statistics
- final NodeModel rootNode = map.getRootNode();
- final int nodeMainBranches = rootNode.getChildCount();
- final ICondition trueCondition = new ICondition() {
- public boolean checkNode(NodeModel node) {
- return true;
- }
- };
- final ICondition isLeafCondition = new ICondition() {
- public boolean checkNode(NodeModel node) {
- return node.isLeaf();
- }
- };
- final int nodeTotalNodeCount = getNodeCount(rootNode, trueCondition);
- final int nodeTotalLeafCount = getNodeCount(rootNode, isLeafCondition);
- final Filter filter = map.getFilter();
- final int nodeTotalFiltered;
- if(filter != null && filter.getCondition() != null){
- final ICondition matchesFilterCondition = new ICondition() {
- public boolean checkNode(NodeModel node) {
- return filter.matches(node);
- }
- };
- nodeTotalFiltered = getNodeCount(rootNode, matchesFilterCondition);
- }
- else{
- nodeTotalFiltered = -1;
- }
- //Multiple nodes may be selected
- final Collection<NodeModel> nodes = Controller.getCurrentController().getSelection().getSelection();
- boolean isDescendant = false;
- int nodeRelativeChildCount = 0;
- int nodeRelativeNodeCount = 0;
- int nodeRelativeLeafCount = 0;
- for (final NodeModel n : nodes) {
- nodeRelativeChildCount += n.getChildCount();
- isDescendant = false;
- //Nodes and leaf nodes are only counted once per branch
- for (NodeModel node : nodes) {
- if (n.isDescendantOf(node)) {
- isDescendant = true;
- break;
- }
- }
- if (!isDescendant) {
- nodeRelativeNodeCount += getNodeCount(n, trueCondition);
- nodeRelativeLeafCount += getNodeCount(n, isLeafCondition);
- }
- }
- final int nodeSelectedNodeCount = Controller.getCurrentController().getSelection().getSelection().size();
- //build component
- final JPanel panel = new JPanel();
- final GridBagLayout gridbag = new GridBagLayout();
- panel.setLayout(gridbag);
- panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(),
- BorderFactory.createEmptyBorder(5, 0, 5, 0)));
- final GridBagConstraints c = new GridBagConstraints();
- c.gridx = 0;
- c.gridy = 0;
- c.gridwidth = 1;
- c.ipady = 5;
- c.ipadx = 0;
- c.insets = new Insets(0, 10, 0, 10);
- c.anchor = GridBagConstraints.FIRST_LINE_START;
- //fileNamePath
- final URL imageURL = ResourceController.getResourceController().getResource("/images/filenew.png");
- final JLabel fileIcon = new JLabel(ImageIconFactory.getInstance().getImageIcon(imageURL));
- gridbag.setConstraints(fileIcon, c);
- panel.add(fileIcon);
- c.gridx = 1;
- final JLabel fileNamePathText = new JLabel(TextUtils.getText("FileProperties_FileName"));
- gridbag.setConstraints(fileNamePathText, c);
- panel.add(fileNamePathText);
- c.gridx = 2;
- final JLabel fileNamePathLabel = new JLabel(fileNamePath);
- gridbag.setConstraints(fileNamePathLabel, c);
- panel.add(fileNamePathLabel);
- //fileSize
- c.gridy++;
- c.gridx = 1;
- final JLabel fileSizeText = new JLabel(TextUtils.getText("FileProperties_FileSize"));
- gridbag.setConstraints(fileSizeText, c);
- panel.add(fileSizeText);
- c.gridx = 2;
- final JLabel fileSizeLabel = new JLabel(fileSize);
- gridbag.setConstraints(fileSizeLabel, c);
- panel.add(fileSizeLabel);
- //fileSavedDateTime
- c.gridy++;
- c.gridx = 1;
- final JLabel fileSavedDateTimeText = new JLabel(TextUtils.getText("FileProperties_FileSaved"));
- gridbag.setConstraints(fileSavedDateTimeText, c);
- panel.add(fileSavedDateTimeText);
- c.gridx = 2;
- final JLabel fileSavedDateTimeLabel = new JLabel(fileSavedDateTime);
- gridbag.setConstraints(fileSavedDateTimeLabel, c);
- panel.add(fileSavedDateTimeLabel);
- //fileChangesSinceSave
- c.gridy++;
- c.gridx = 1;
- final JLabel fileChangesSinceSaveText = new JLabel(TextUtils.getText("FileProperties_ChangesSinceLastSave"));
- gridbag.setConstraints(fileChangesSinceSaveText, c);
- panel.add(fileChangesSinceSaveText);
- c.gridx = 2;
- final JLabel fileChangesSinceSaveLabel = new JLabel(String.valueOf(fileChangesSinceSave));
- gridbag.setConstraints(fileChangesSinceSaveLabel, c);
- panel.add(fileChangesSinceSaveLabel);
- //Separator
- c.gridy++;
- c.gridx = 0;
- c.insets = new Insets(5, 10, 5, 10);
- c.ipady = 2;
- c.gridwidth = 3;
- final JSeparator js = new JSeparator(SwingConstants.HORIZONTAL);
- js.setLayout(gridbag);
- js.setBorder(BorderFactory.createEtchedBorder());
- js.setPreferredSize(new Dimension(0, 0));
- c.fill = GridBagConstraints.HORIZONTAL;
- gridbag.setConstraints(js, c);
- panel.add(js);
- //nodeTotalNodeCount
- c.gridy++;
- c.insets = new Insets(0, 10, 0, 10);
- c.ipady = 5;
- c.gridwidth = 1;
- c.gridx = 0;
- final URL imageURL2 = ResourceController.getResourceController().getResource("/images/MapStats.png");
- final JLabel MapStatsIcon = new JLabel(ImageIconFactory.getInstance().getImageIcon(imageURL2));
- gridbag.setConstraints(MapStatsIcon, c);
- panel.add(MapStatsIcon);
- c.gridx = 1;
- final JLabel nodeTotalNodeCountText = new JLabel(TextUtils.getText("FileProperties_TotalNodeCount"));
- gridbag.setConstraints(nodeTotalNodeCountText, c);
- panel.add(nodeTotalNodeCountText);
- c.gridx = 2;
- final JLabel nodeTotalNodeCountLabel = new JLabel(String.valueOf(nodeTotalNodeCount));
- gridbag.setConstraints(nodeTotalNodeCountLabel, c);
- panel.add(nodeTotalNodeCountLabel);
- //nodeTotalFiltered
- if(nodeTotalFiltered != -1){
- c.gridy++;
- c.gridx = 1;
- final JLabel nodeTotalFilteredLabelText = new JLabel(TextUtils.getText("FileProperties_TotalFilteredCount"));
- gridbag.setConstraints(nodeTotalFilteredLabelText, c);
- panel.add(nodeTotalFilteredLabelText);
- c.gridx = 2;
- final JLabel nodeTotalFilteredLabel = new JLabel(String.valueOf(nodeTotalFiltered));
- gridbag.setConstraints(nodeTotalFilteredLabel, c);
- panel.add(nodeTotalFilteredLabel);
- }
- //nodeTotalLeafCount
- c.gridy++;
-
- c.gridx = 1;
- final JLabel nodeTotalLeafCountText = new JLabel(TextUtils.getText("FileProperties_TotalLeafCount"));
- gridbag.setConstraints(nodeTotalLeafCountText, c);
- panel.add(nodeTotalLeafCountText);
- c.gridx = 2;
- final JLabel nodeTotalLeafCountLabel = new JLabel(String.valueOf(nodeTotalLeafCount));
- gridbag.setConstraints(nodeTotalLeafCountLabel, c);
- panel.add(nodeTotalLeafCountLabel);
- //nodeMainBranches
- c.gridy++;
- c.gridx = 1;
- final JLabel nodeMainBranchesText = new JLabel(TextUtils.getText("FileProperties_MainBranchCount"));
- gridbag.setConstraints(nodeMainBranchesText, c);
- panel.add(nodeMainBranchesText);
- c.gridx = 2;
- final JLabel nodeMainBranchesLabel = new JLabel(String.valueOf(nodeMainBranches));
- gridbag.setConstraints(nodeMainBranchesLabel, c);
- panel.add(nodeMainBranchesLabel);
- //Separator
- c.gridy++;
- c.gridx = 0;
- c.insets = new Insets(5, 10, 5, 10);
- c.ipady = 2;
- c.gridwidth = 3;
- final JSeparator js2 = new JSeparator(SwingConstants.HORIZONTAL);
- js2.setLayout(gridbag);
- js2.setBorder(BorderFactory.createEtchedBorder());
- js2.setPreferredSize(new Dimension(0, 0));
- c.fill = GridBagConstraints.HORIZONTAL;
- gridbag.setConstraints(js2, c);
- panel.add(js2);
- //nodeRelativeNodeCount
- c.gridy++;
- c.insets = new Insets(0, 10, 0, 10);
- c.ipady = 5;
- c.gridwidth = 1;
- c.gridx = 0;
- final URL imageURL3 = ResourceController.getResourceController().getResource("/images/BranchStats.png");
- final JLabel BranchStatsIcon = new JLabel(ImageIconFactory.getInstance().getImageIcon(imageURL3));
- gridbag.setConstraints(BranchStatsIcon, c);
- panel.add(BranchStatsIcon);
- c.gridx = 1;
- final JLabel nodeRelativeNodeCountText = new JLabel(TextUtils.getText("FileProperties_BranchNodeCount"));
- gridbag.setConstraints(nodeRelativeNodeCountText, c);
- panel.add(nodeRelativeNodeCountText);
- c.gridx = 2;
- final JLabel nodeRelativeNodeCountLabel = new JLabel(String.valueOf(nodeRelativeNodeCount));
- gridbag.setConstraints(nodeRelativeNodeCountLabel, c);
- panel.add(nodeRelativeNodeCountLabel);
- //nodeRelativeLeafCount
- c.gridy++;
- c.gridx = 1;
- final JLabel nodeRelativeLeafCountText = new JLabel(TextUtils.getText("FileProperties_BranchLeafCount"));
- gridbag.setConstraints(nodeRelativeLeafCountText, c);
- panel.add(nodeRelativeLeafCountText);
- c.gridx = 2;
- final JLabel nodeRelativeLeafCountLabel = new JLabel(String.valueOf(nodeRelativeLeafCount));
- gridbag.setConstraints(nodeRelativeLeafCountLabel, c);
- panel.add(nodeRelativeLeafCountLabel);
- //nodeRelativeChildCount
- c.gridy++;
- c.gridx = 1;
- final JLabel nodeRelativeChildCountText = new JLabel(TextUtils.getText("FileProperties_NodeChildCount"));
- gridbag.setConstraints(nodeRelativeChildCountText, c);
- panel.add(nodeRelativeChildCountText);
- c.gridx = 2;
- final JLabel nodeRelativeChildCountLabel = new JLabel(String.valueOf(nodeRelativeChildCount));
- gridbag.setConstraints(nodeRelativeChildCountLabel, c);
- panel.add(nodeRelativeChildCountLabel);
- //nodeSelectedNodeCount
- c.gridy++;
- c.gridx = 1;
- final JLabel nodeSelectedNodeCountText = new JLabel(TextUtils.getText("FileProperties_NodeSelectionCount"));
- gridbag.setConstraints(nodeSelectedNodeCountText, c);
- panel.add(nodeSelectedNodeCountText);
- c.gridx = 2;
- final JLabel nodeSelectedNodeCountLabel = new JLabel(String.valueOf(nodeSelectedNodeCount));
- gridbag.setConstraints(nodeSelectedNodeCountLabel, c);
- panel.add(nodeSelectedNodeCountLabel);
- //Show dialog
- JOptionPane.showMessageDialog(UITools.getFrame(), panel,
- TextUtils.getText("FilePropertiesAction.text"), JOptionPane.PLAIN_MESSAGE);
- }
-
- /**
- * Builts an array containing nodes form the given node on downwards.
- *
- * @param NodeModel node: The node from which on to search
- * @param boolean CountLeaves: If true only leave nodes are included in the return list,
- * otherwise all nodes from the selected on are included
- *
- * @return Returns a list of nodes
- */
- private int getNodeCount(final NodeModel node, final ICondition condition) {
- int result = 0;
- final Enumeration<NodeModel> children = node.children();
- if (condition.checkNode(node)) {
- result++;
- }
- while (children.hasMoreElements()) {
- final NodeModel child = children.nextElement();
- result += getNodeCount(child, condition);
- }
- return result;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/help/HelpController.java b/freeplane/src/org/freeplane/features/help/HelpController.java
deleted file mode 100644
index 89947f5..0000000
--- a/freeplane/src/org/freeplane/features/help/HelpController.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.help;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- */
-public class HelpController implements IExtension {
- public static HelpController getController() {
- return (HelpController) Controller.getCurrentController().getExtension(HelpController.class);
- }
-
- public static void install() {
- Controller controller = Controller.getCurrentController();
- controller.addExtension(HelpController.class, new HelpController());
- }
-
- public HelpController() {
- super();
- Controller controller = Controller.getCurrentController();
- final ResourceController resourceController = ResourceController.getResourceController();
- controller.addAction(new AboutAction());
- controller.addAction(new OpenURLAction("OpenFreeplaneSiteAction", resourceController.getProperty("webFreeplaneLocation")));
- if(resourceController.isApplet())
- return;
- controller.addAction(new FilePropertiesAction());
- controller.addAction(new OpenSourceForgeURLAction("ReportBugAction", resourceController.getProperty("bugTrackerLocation")));
- controller.addAction(new OpenSourceForgeURLAction("RequestFeatureAction", resourceController.getProperty("featureTrackerLocation")));
- controller.addAction(new OpenSourceForgeURLAction("AskForHelp", resourceController.getProperty("helpForumLocation")));
- controller.addAction(new OpenURLAction("WebDocuAction", resourceController.getProperty("webDocuLocation")));
- final String defaultMap = resourceController.getProperty("docu_map");
- controller.addAction(new DocumentationAction("DocumentationAction", defaultMap));
- final String tutorialMap = resourceController.getProperty("tutorial_map");
- controller.addAction(new DocumentationAction("GettingStartedAction", tutorialMap));
- controller.addAction(new HotKeyInfoAction());
- controller.addAction(new OnlineDocumentationAction("OnlineReference", "docu-online"));
- }
-
- /**
- * @param e
- */
- public void webDocu(final ActionEvent e) {
- Controller.getCurrentController().getAction("WebDocuAction").actionPerformed(e);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/help/HotKeyInfoAction.java b/freeplane/src/org/freeplane/features/help/HotKeyInfoAction.java
deleted file mode 100644
index 4767be2..0000000
--- a/freeplane/src/org/freeplane/features/help/HotKeyInfoAction.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.help;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.util.ArrayList;
-import java.util.Enumeration;
-
-import javax.swing.JDialog;
-import javax.swing.JEditorPane;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.MenuUtils;
-import org.freeplane.core.util.MenuUtils.MenuEntry;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-/**
- * @author Dimitry Polivaev
- * Sep 27, 2011
- */
-
-public class HotKeyInfoAction extends AFreeplaneAction{
-
- public HotKeyInfoAction() {
- super("HotKeyInfoAction");
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- // ==========================================================================
- // format accelerator map as html text
- // ==========================================================================
- private String formatAsHtml(final Enumeration<DefaultMutableTreeNode> children) {
- final StringBuilder builder = new StringBuilder();
- builder.append("<html><head><style type=\"text/css\">" //
- //doesn't work: + " table { margin: 1px 0px; border-spacing: 0px; }"//
- + " h1 { background-color: #B5C8DB; margin-bottom: 0px; margin-top: 1ex; }"//
- + " h2 { background-color: #B5C8DB; margin-bottom: 0px; margin-top: 1ex; }"//
- + " h3 { background-color: #B5C8DB; margin-bottom: 0px; margin-top: 1ex; }"//
- + "</head><body width=\"600\">");
- appendAsHtml(builder, children, "", 2);
- builder.append("</body></html>");
- return builder.toString();
- }
-
- private void appendAsHtml(final StringBuilder builder, final Enumeration<DefaultMutableTreeNode> children,
- final String title, final int level) {
- if(! title.equals(""))
- builder.append("<h").append(level).append('>').append(title).append("</h").append(level).append('>');
- appendChildrenAsHtml(builder, children, title, level);
- }
-
- @SuppressWarnings("unchecked")
- private void appendChildrenAsHtml(final StringBuilder builder,
- final Enumeration<DefaultMutableTreeNode> children, final String title,
- final int level) {
- final ArrayList<MenuEntry> menuEntries = new ArrayList<MenuEntry>();
- final ArrayList<DefaultMutableTreeNode> submenus = new ArrayList<DefaultMutableTreeNode>();
- // sort and divide
- while (children.hasMoreElements()) {
- final DefaultMutableTreeNode node = children.nextElement();
- if (node.isLeaf()) {
- menuEntries.add((MenuEntry) node.getUserObject());
- }
- else {
- submenus.add(node);
- }
- }
- // actions
- if (!menuEntries.isEmpty()) {
- builder.append("<table cellspacing=\"0\" cellpadding=\"0\">");
- for (final MenuEntry entry : menuEntries) {
- final String keystroke = entry.getKeyStroke() == null ? "" //
- : MenuUtils.formatKeyStroke(entry.getKeyStroke());
- builder.append(el("tr", el("td", entry.getLabel() + " ")
- + el("td", keystroke)
- + el("td", entry.getToolTipText())));
- }
- builder.append("</table>");
- }
- // submenus
- for (final DefaultMutableTreeNode node : submenus) {
- final String subtitle = (level > 2 ? title + "→" : "") + String.valueOf(node.getUserObject());
- appendAsHtml(builder, node.children(), subtitle, level + 1);
- }
- }
-
- private String el(final String name, final String content) {
- return HtmlUtils.element(name, content);
- }
-
- @SuppressWarnings("unchecked")
- public void actionPerformed(ActionEvent e) {
- // use the MModeController for the mindmap mode menu if possible - the browse menu doesn't have much entries!
- final ModeController modeController = ResourceController.getResourceController().isApplet() ? Controller
- .getCurrentModeController() : MModeController.getMModeController();
- final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder();
- final DefaultMutableTreeNode menuEntryTree = MenuUtils.createAcceleratebleMenuEntryTree(
- FreeplaneMenuBar.MENU_BAR_PREFIX, menuBuilder);
- final String title = TextUtils.getText("hot_keys_table");
- final String html = formatAsHtml(menuEntryTree.children());
- JEditorPane refPane = new JEditorPane("text/html", html);
- refPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false);
- refPane.setCaretPosition(0);
- refPane.setEditable(false);
- final Dimension preferredSize = refPane.getPreferredSize();
- JScrollPane scrollPane = new JScrollPane(refPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- scrollPane.setPreferredSize(new Dimension(preferredSize.width, 600));
- JOptionPane pane = new JOptionPane(scrollPane, JOptionPane.INFORMATION_MESSAGE);
- JDialog dialog = pane.createDialog(UITools.getFrame(), title);
- // the line below is added to the example from the docs
- dialog.setModal(false); // this says not to block background components
- dialog.setVisible(true);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/help/OnlineDocumentationAction.java b/freeplane/src/org/freeplane/features/help/OnlineDocumentationAction.java
deleted file mode 100644
index fcfcae7..0000000
--- a/freeplane/src/org/freeplane/features/help/OnlineDocumentationAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.help;
-
-import java.awt.event.ActionEvent;
-import java.net.MalformedURLException;
-import java.net.URL;
-import javax.swing.SwingUtilities;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-
-class OnlineDocumentationAction extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
- private final URL url;
-
- OnlineDocumentationAction( final String actionName, final String urlProperty) {
- super(actionName);
- URL url = null;
- try {
- url = new URL(ResourceController.getResourceController().getProperty(urlProperty));
- }
- catch (MalformedURLException e) {
- e.printStackTrace();
- }
- this.url = url;
- }
-
- public void actionPerformed(final ActionEvent e) {
- if(url == null)
- return;
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- try {
- if (url.getPath().endsWith(".mm")) {
- Controller.getCurrentController().selectMode(MModeController.MODENAME);
- ((MMapController)Controller.getCurrentModeController().getMapController()).newDocumentationMap(url);
- }
- else {
- Controller.getCurrentController().getViewController().openDocument(url);
- }
- }
- catch (final Exception e1) {
- LogUtils.severe(e1);
- }
- }
- });
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/HierarchicalIcons.java b/freeplane/src/org/freeplane/features/icon/HierarchicalIcons.java
deleted file mode 100644
index 746ed63..0000000
--- a/freeplane/src/org/freeplane/features/icon/HierarchicalIcons.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import java.util.Map;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IReadCompletionListener;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Foltin
- */
- at NodeHookDescriptor(hookName = "accessories/plugins/HierarchicalIcons.properties")
-public class HierarchicalIcons extends PersistentNodeHook implements INodeChangeListener, IMapChangeListener,
- IReadCompletionListener, IExtension {
- public static final String ICONS = "hierarchical_icons";
-
- public HierarchicalIcons() {
- this(Mode.OR);
- final ModeController modeController = Controller.getCurrentModeController();
- IconController.getController(modeController).addStateIconProvider(new IStateIconProvider() {
- public UIIcon getStateIcon(NodeModel node) {
- AccumulatedIcons iconSet = node.getExtension(AccumulatedIcons.class);
- if(iconSet != null)
- return new UIIconSet(iconSet.getAccumulatedIcons(), 0.75f);
- else
- return null;
- }
- });
- new HierarchicalIcons2();
- }
- protected HierarchicalIcons(Mode mode) {
- super();
- this.mode = mode;
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.getMapController().getReadManager().addReadCompletionListener(this);
- modeController.getMapController().addNodeChangeListener(this);
- modeController.getMapController().addMapChangeListener(this);
- }
-
- @Override
- protected void add(final NodeModel node, final IExtension extension) {
- if(MapStyleModel.getExtension(node.getMap()) != null){
- gatherLeavesAndSetStyle(node);
- gatherLeavesAndSetParentsStyle(node);
- }
- super.add(node, extension);
- }
-
-
- @Override
- protected IExtension createExtension(final NodeModel node, final XMLElement element) {
- return this;
- }
-
- /**
- */
- private void gatherLeavesAndSetParentsStyle(final NodeModel node) {
- if (node.getChildCount() == 0) {
- for (NodeModel parent = node.getParentNode(); parent != null; parent = parent.getParentNode()) {
- AccumulatedIcons.setStyleCheckForChange(parent, mode);
- }
- return;
- }
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- gatherLeavesAndSetParentsStyle(child);
- }
- }
-
- /**
- */
- private void gatherLeavesAndSetStyle(final NodeModel node) {
- node.removeExtension(AccumulatedIcons.class);
- if (node.getChildCount() == 0) {
- AccumulatedIcons.setStyleCheckForChange(node, mode);
- return;
- }
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- gatherLeavesAndSetStyle(child);
- }
- }
-
- public void mapChanged(final MapChangeEvent event) {
- final MapModel map = event.getMap();
- if(map == null){
- return;
- }
- final NodeModel rootNode = map.getRootNode();
- if (!isActive(rootNode)) {
- return;
- }
- final Object property = event.getProperty();
- if(! property.equals(MapStyle.MAP_STYLES)){
- return;
- }
- gatherLeavesAndSetStyle(rootNode);
- gatherLeavesAndSetParentsStyle(rootNode);
- }
-
- public void nodeChanged(final NodeChangeEvent event) {
- final NodeModel node = event.getNode();
- if (!isActive(node)) {
- return;
- }
- setStyleRecursive(node);
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- if (!isActive(parent)) {
- return;
- }
- setStyleRecursive(parent);
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
- if (!isActive(parent)) {
- return;
- }
- setStyleRecursive(child);
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- if (!isActive(newParent)) {
- return;
- }
- setStyleRecursive(oldParent);
- setStyleRecursive(child);
- }
-
- public void onPreNodeDelete(final NodeModel parent, final NodeModel child, final int index) {
- }
-
- public void readingCompleted(final NodeModel topNode, final Map<String, String> newIds) {
- if (!topNode.containsExtension(getClass()) && !topNode.getMap().getRootNode().containsExtension(getClass())) {
- return;
- }
- gatherLeavesAndSetStyle(topNode);
- gatherLeavesAndSetParentsStyle(topNode);
- }
-
- @Override
- protected void remove(final NodeModel node, final IExtension extension) {
- removeIcons(node);
- super.remove(node, extension);
- }
-
- /**
- */
- private void removeIcons(final NodeModel node) {
- AccumulatedIcons icons = node.removeExtension(AccumulatedIcons.class);
- if(icons != null){
- Controller.getCurrentModeController().getMapController().delayedNodeRefresh(node, HierarchicalIcons.ICONS, null, null);
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- removeIcons(child);
- }
- }
- }
-
- public static enum Mode{AND, OR};
- private Mode mode = Mode.OR;
-
- /**
- */
- private void setStyleRecursive(final NodeModel node) {
- if (AccumulatedIcons.setStyleCheckForChange(node, mode) && node.getParentNode() != null) {
- setStyleRecursive(node.getParentNode());
- }
- }
-
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
-
-}
-
- at NodeHookDescriptor(hookName = "accessories/plugins/HierarchicalIcons2.properties")
-class HierarchicalIcons2 extends HierarchicalIcons{
- public HierarchicalIcons2() {
- super(Mode.AND);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/IIconInformation.java b/freeplane/src/org/freeplane/features/icon/IIconInformation.java
deleted file mode 100644
index f054e87..0000000
--- a/freeplane/src/org/freeplane/features/icon/IIconInformation.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import javax.swing.Icon;
-import javax.swing.KeyStroke;
-
-public interface IIconInformation {
- String getDescription();
-
- Icon getIcon();
-
- KeyStroke getKeyStroke();
-
- String getShortcutKey();
-}
diff --git a/freeplane/src/org/freeplane/features/icon/IconBuilder.java b/freeplane/src/org/freeplane/features/icon/IconBuilder.java
deleted file mode 100644
index 5ad2e69..0000000
--- a/freeplane/src/org/freeplane/features/icon/IconBuilder.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import java.io.IOException;
-import java.util.Collection;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.features.map.MapWriter;
-import org.freeplane.features.map.NodeBuilder;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-class IconBuilder implements IElementDOMHandler, IElementWriter {
- private final IconStore store;
- public IconBuilder(final IconController iconController, final IconStore icons) {
- store = icons;
- }
-
- static class IconProperties {
- String iconName;
- }
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (tag.equals("icon")) {
- return new IconProperties();
- }
- return null;
- }
-
- public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
- if (parent instanceof NodeModel && tag.equals("icon")) {
- final NodeModel node = (NodeModel) parent;
- final IconProperties ip = (IconProperties) userObject;
- node.addIcon(store.getMindIcon(ip.iconName));
- return;
- }
- }
-
- private void registerAttributeHandlers(final ReadManager reader) {
- reader.addAttributeHandler("icon", "BUILTIN", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final IconProperties ip = (IconProperties) userObject;
- ip.iconName = value;
- }
- });
- }
-
- /**
- */
- public void registerBy(final ReadManager reader, final WriteManager writer) {
- reader.addElementHandler("icon", this);
- registerAttributeHandlers(reader);
- writer.addElementWriter(NodeBuilder.XML_NODE, this);
- writer.addElementWriter(NodeBuilder.XML_STYLENODE, this);
- }
-
- public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
- }
-
- public void writeContent(final ITreeWriter writer, final Object element, final String tag) throws IOException {
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- final NodeModel node = (NodeModel) element;
- final Collection<MindIcon> icons = forceFormatting ? IconController.getController().getIcons(node) : node.getIcons();
- for (MindIcon icon : icons) {
- final XMLElement iconElement = new XMLElement();
- iconElement.setName("icon");
- iconElement.setAttribute("BUILTIN", icon.getName());
- writer.addElement(node, iconElement);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/IconConditionController.java b/freeplane/src/org/freeplane/features/icon/IconConditionController.java
deleted file mode 100644
index 60c539a..0000000
--- a/freeplane/src/org/freeplane/features/icon/IconConditionController.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.collection.ExtendedComboBoxModel;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.filter.condition.DefaultConditionRenderer;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * 21.12.2008
- */
-class IconConditionController implements IElementaryConditionController {
- static final String FILTER_ICON = "filter_icon";
-// // final private Controller controller;
-
- public IconConditionController() {
- super();
-// this.controller = controller;
- }
-
- public boolean canEditValues(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean canHandle(final Object selectedItem) {
- if (!(selectedItem instanceof NamedObject)) {
- return false;
- }
- final NamedObject namedObject = (NamedObject) selectedItem;
- return namedObject.objectEquals(IconConditionController.FILTER_ICON);
- }
-
- public boolean canSelectValues(final Object property, final NamedObject simpleCond) {
- return !simpleCond.objectEquals(ConditionFactory.FILTER_EXIST);
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCond,
- final Object value, final boolean matchCase, final boolean approximateMatching) {
- if (simpleCond.objectEquals(ConditionFactory.FILTER_CONTAINS))
- return value instanceof UIIcon ? new IconContainedCondition(((UIIcon) value).getName()) : null;
- if (simpleCond.objectEquals(ConditionFactory.FILTER_EXIST))
- return new IconExistsCondition();
- return null;
- }
-
- public ComboBoxModel getConditionsForProperty(final Object property) {
- return new DefaultComboBoxModel(getIconConditionNames());
- }
-
- public ListModel getFilteredProperties() {
- final DefaultListModel list = new DefaultListModel();
- list.addElement(TextUtils.createTranslatedString(FILTER_ICON));
- return list;
- }
-
- public Object[] getIconConditionNames() {
- return new NamedObject[] {
- TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_EXIST),
- };
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- return null;
- }
-
- public ComboBoxModel getValuesForProperty(final Object property, NamedObject simpleCond) {
- final ListModel icons = Controller.getCurrentController().getMap().getIconRegistry().getIconsAsListModel();
- final ExtendedComboBoxModel extendedComboBoxModel = new ExtendedComboBoxModel();
- extendedComboBoxModel.setExtensionList(icons);
- return extendedComboBoxModel;
- }
-
- public boolean isCaseDependent(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean supportsApproximateMatching(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- if (element.getName().equalsIgnoreCase(IconContainedCondition.NAME)) {
- return IconContainedCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(IconExistsCondition.NAME)) {
- return IconExistsCondition.load(element);
- }
- return null;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- // don't return null as this would make FilterConditionEditor fall back to filterController.getConditionRenderer()
- // (and that would put in a default string like "No Filtering (remove)"!)
- return new DefaultConditionRenderer("", true);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/IconController.java b/freeplane/src/org/freeplane/features/icon/IconController.java
deleted file mode 100644
index 4dc42a1..0000000
--- a/freeplane/src/org/freeplane/features/icon/IconController.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.CombinedPropertyChain;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.IPropertyHandler;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.StyleNode;
-
-/**
- * @author Dimitry Polivaev
- */
-public class IconController implements IExtension {
- final private CombinedPropertyChain<Collection<MindIcon>, NodeModel> iconHandlers;
- public static IconController getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- return getController(modeController);
- }
- public static IconController getController(ModeController modeController) {
- return (IconController) modeController.getExtension(IconController.class);
- }
-
- public static void install() {
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(1,
- new IconConditionController());
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(5,
- new PriorityConditionController());
- }
-
- public static void install( final IconController iconController) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addExtension(IconController.class, iconController);
- }
-
-// final private ModeController modeController;
- final private Collection<IStateIconProvider> stateIconProviders;
-
- public boolean addStateIconProvider(IStateIconProvider o) {
- return stateIconProviders.add(o);
- }
- public boolean removeStateIconProvider(IStateIconProvider o) {
- return stateIconProviders.remove(o);
- }
- public IconController(final ModeController modeController) {
- super();
- stateIconProviders = new LinkedList<IStateIconProvider>();
- iconHandlers = new CombinedPropertyChain<Collection<MindIcon>, NodeModel>(false);
-// this.modeController = modeController;
- final MapController mapController = modeController.getMapController();
- final ReadManager readManager = mapController.getReadManager();
- final WriteManager writeManager = mapController.getWriteManager();
- final IconBuilder textBuilder = new IconBuilder(this, IconStoreFactory.create());
- textBuilder.registerBy(readManager, writeManager);
- addIconGetter(IPropertyHandler.STYLE, new IPropertyHandler<Collection<MindIcon>, NodeModel>() {
- public Collection<MindIcon> getProperty(final NodeModel node, final Collection<MindIcon> currentValue) {
- final MapStyleModel model = MapStyleModel.getExtension(node.getMap());
- final Collection<IStyle> styleKeys = LogicalStyleController.getController(modeController).getStyles(node);
- for(IStyle styleKey : styleKeys){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null || node == styleNode && !(styleKey instanceof StyleNode)) {
- continue;
- }
- final List<MindIcon> styleIcons;
- styleIcons = styleNode.getIcons();
- currentValue.addAll(styleIcons);
- }
- return currentValue;
- }
- });
- }
-
- public IPropertyHandler<Collection<MindIcon>, NodeModel> addIconGetter(
- final Integer key,
- final IPropertyHandler<Collection<MindIcon>, NodeModel> getter) {
- return iconHandlers.addGetter(key, getter);
- }
-
- public IPropertyHandler<Collection<MindIcon>, NodeModel> removeIconGetter(
- final Integer key,
- final IPropertyHandler<Collection<MindIcon>, NodeModel> getter) {
- return iconHandlers.addGetter(key, getter);
- }
-
-
- public Collection<MindIcon> getIcons(final NodeModel node) {
- final Collection<MindIcon> icons = iconHandlers.getProperty(node, new LinkedList<MindIcon>());
- return icons;
- }
-
- public final Collection<UIIcon> getStateIcons(final NodeModel node){
- final LinkedList<UIIcon> icons = new LinkedList<UIIcon>();
- for(IStateIconProvider provider : stateIconProviders){
- final UIIcon stateIcon = provider.getStateIcon(node);
- if(stateIcon != null){
- icons.add(stateIcon);
- final IconRegistry iconRegistry = node.getMap().getIconRegistry();
- iconRegistry.addIcon(stateIcon);
- }
- }
- return icons;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/icon/IconNotFound.java b/freeplane/src/org/freeplane/features/icon/IconNotFound.java
deleted file mode 100644
index a04c731..0000000
--- a/freeplane/src/org/freeplane/features/icon/IconNotFound.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.freeplane.features.icon;
-
-import java.net.URL;
-
-import javax.swing.ImageIcon;
-
-import org.freeplane.core.resources.ResourceController;
-
-public class IconNotFound extends MindIcon {
- private static final String DEFAULT_IMAGE_PATH = "/images";
- private static final IconNotFound ICON_NOT_FOUND = new IconNotFound();
-
- public IconNotFound() {
- super("icon_not_found", "IconNotFound.png", "icon not found");
- }
-
- @Override
- public String getImagePath() {
- return DEFAULT_IMAGE_PATH;
- }
-
- /**
- * creates an ImageIcon from <code>getImagePath()/filename</code>. If this is not possible returns an IconNotFound.
- */
- public static ImageIcon createIconOrReturnNotFoundIcon(final String fileName) {
- final URL resource = ResourceController.getResourceController()
- .getResource(DEFAULT_IMAGE_PATH + "/" + fileName);
- final ImageIcon icon = (resource == null) ? null : new ImageIcon(resource);
- return icon == null ? (ImageIcon) instance().getIcon() : icon;
- }
-
- /**
- * creates an ImageIcon from <code>getImagePath()/filename</code>. If this is not possible returns null.
- */
- public static ImageIcon createIconOrReturnNull(final String fileName) {
- final URL resource = ResourceController.getResourceController()
- .getResource(DEFAULT_IMAGE_PATH + "/" + fileName);
- return (resource == null) ? null : new ImageIcon(resource);
- }
-
- public static IconNotFound instance() {
- return ICON_NOT_FOUND;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/IconRegistry.java b/freeplane/src/org/freeplane/features/icon/IconRegistry.java
deleted file mode 100644
index 2505567..0000000
--- a/freeplane/src/org/freeplane/features/icon/IconRegistry.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import javax.swing.ListModel;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.util.collection.SortedComboBoxModel;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- *
- * maintains a set of icons which currently are or have been
- * used on the map during the last editing session. This information is
- * used in IconConditionController calling IconRegistry.getIcons() to
- * prepare values available in Filter Editor Dialog / find dialog when
- * filter on icons is selected
- *
- * 03.01.2009
- */
-public class IconRegistry implements IExtension {
- final private SortedComboBoxModel mapIcons;
-
- public IconRegistry(final MapController mapController, final MapModel map) {
- super();
- mapIcons = new SortedComboBoxModel();
- final NodeModel rootNode = map.getRootNode();
- if(rootNode != null)
- registryNodeIcons(mapController, rootNode);
- }
-
- public void addIcon(final UIIcon icon) {
- mapIcons.add(icon);
- }
-
- public ListModel getIconsAsListModel() {
- return mapIcons;
- }
-
- private void registryNodeIcons(final MapController mapController, final NodeModel node) {
- for (final MindIcon icon : node.getIcons()) {
- addIcon(icon);
- }
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- registryNodeIcons(mapController, child);
- }
- }
-
- public void addIcons(final MapModel map) {
- final IconRegistry newRegistry = map.getIconRegistry();
- final SortedComboBoxModel newMapIcons = newRegistry.mapIcons;
- for (final Object uiIcon : newMapIcons) {
- mapIcons.add(uiIcon);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/IconStore.java b/freeplane/src/org/freeplane/features/icon/IconStore.java
deleted file mode 100644
index e99f479..0000000
--- a/freeplane/src/org/freeplane/features/icon/IconStore.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Tamas Eppel
- *
- * This file author is Tamas Eppel
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.icon.factory.MindIconFactory;
-
-/**
- *
- * Stores all kinds of icons used in Freeplane.
- *
- * @author Tamas Eppel
- *
- */
-public class IconStore {
- private final Map<String, IconGroup> groups;
- private final Map<String, MindIcon> mindIcons;
- private final Map<String, UIIcon> uiIcons;
-
- public IconStore() {
- groups = new LinkedHashMap<String, IconGroup>();
- mindIcons = new HashMap<String, MindIcon>();
- uiIcons = new HashMap<String, UIIcon>();
- }
-
- /**
- * Adds a new MindIcon group to the store.
- *
- * @param group
- */
- public void addGroup(final IconGroup group) {
- groups.put(group.getName(), group);
- for (final MindIcon icon : group.getIcons()) {
- mindIcons.put(icon.getName(), icon);
- }
- }
-
- /**
- * Adds a new MindIcon to the group with the given name.
- *
- * @param groupName where to add the icon
- * @param icon to add
- */
- public void addMindIcon(final String groupName, final MindIcon icon) {
- if (!groups.containsKey(groupName)) {
- final IconGroup group = new IconGroup(groupName, icon);
- groups.put(groupName, group);
- }
- groups.get(groupName).addIcon(icon);
- mindIcons.put(icon.getName(), icon);
- }
-
- public void addUIIcon(final UIIcon uiIcon) {
- uiIcons.put(uiIcon.getFileName(), uiIcon);
- }
-
- /**
- * @return all groups in the store
- */
- public Collection<IconGroup> getGroups() {
- return groups.values();
- }
-
- /**
- * @return all MindIcons from all groups in the store, including user icons
- */
- public Collection<MindIcon> getMindIcons() {
- final List<MindIcon> icons = new ArrayList<MindIcon>();
- for (final IconGroup group : groups.values()) {
- icons.addAll(group.getIcons());
- }
- return icons;
- }
-
- /**
- * @return all user icons in the store
- */
- public Collection<MindIcon> getUserIcons() {
- return groups.get("user").getIcons();
- }
-
- /**
- * @param name of MindIcon to return
- * @return MindIcon with given name
- */
- public MindIcon getMindIcon(final String name) {
- if(name == null){
- return IconNotFound.instance();
- }
- if (mindIcons.containsKey(name)) {
- return mindIcons.get(name);
- }
- // icons in directory /image are not registered
- final MindIcon mindIcon = MindIconFactory.create(name);
- if (ResourceController.getResourceController().getResource(mindIcon.getPath()) != null) {
- return mindIcon;
- }
- return IconNotFound.instance();
- }
-
- /**
- * Returns a UIIcon with a given name. If one is not found in the store,
- * it will be created and stored.
- *
- * @param name of UIIcon to return
- * @return UIIcon with given name
- */
- public UIIcon getUIIcon(final String name) {
- UIIcon result;
- if (mindIcons.containsKey(name)) {
- result = mindIcons.get(name);
- }
- else if (uiIcons.containsKey(name)) {
- result = uiIcons.get(name);
- }
- else {
- result = new UIIcon(name, name);
- uiIcons.put(name, result);
- }
- return result;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/PriorityConditionController.java b/freeplane/src/org/freeplane/features/icon/PriorityConditionController.java
deleted file mode 100644
index f0c5a30..0000000
--- a/freeplane/src/org/freeplane/features/icon/PriorityConditionController.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * 21.12.2008
- */
-class PriorityConditionController implements IElementaryConditionController {
- static final String FILTER_PRIORITY = "filter_priority";
- private static final IconStore STORE = IconStoreFactory.create();
-
- public PriorityConditionController() {
- super();
- }
-
- public boolean canEditValues(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean canHandle(final Object selectedItem) {
- if (!(selectedItem instanceof NamedObject)) {
- return false;
- }
- final NamedObject namedObject = (NamedObject) selectedItem;
- return namedObject.objectEquals(PriorityConditionController.FILTER_PRIORITY);
- }
-
- public boolean canSelectValues(final Object property, final NamedObject simpleCond) {
- return true;
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCondition,
- final Object valueObj, final boolean matchCase,
- final boolean matchApproximately) {
- final String value = ((MindIcon) valueObj).getName().substring(5, 6);
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
- return new PriorityCompareCondition(value, 0, true);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
- return new PriorityCompareCondition(value, 0, false);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
- return new PriorityCompareCondition(value, 1, true);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
- return new PriorityCompareCondition(value, -1, false);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
- return new PriorityCompareCondition(value, -1, true);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
- return new PriorityCompareCondition(value, 1, false);
- }
- return null;
- }
-
- public ComboBoxModel getConditionsForProperty(final Object selectedItem) {
- return new DefaultComboBoxModel(new NamedObject[] {
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_NOT_EQUAL_TO),
- NamedObject.literal(ConditionFactory.FILTER_GT), NamedObject.literal(ConditionFactory.FILTER_GE),
- NamedObject.literal(ConditionFactory.FILTER_LE), NamedObject.literal(ConditionFactory.FILTER_LT), });
- }
-
- public ListModel getFilteredProperties() {
- final DefaultListModel list = new DefaultListModel();
- list.addElement(TextUtils.createTranslatedString(FILTER_PRIORITY));
- return list;
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- return null;
- }
-
- public ComboBoxModel getValuesForProperty(final Object property, NamedObject simpleCond) {
- final Object[] items = new Object[10];
- for (int i = 1; i < 10; ++i) {
- items[i - 1] = STORE.getMindIcon("full-" + Integer.toString(i));
- }
- final ComboBoxModel box = new DefaultComboBoxModel(items);
- return box;
- }
-
- public boolean isCaseDependent(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean supportsApproximateMatching(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- if (element.getName().equalsIgnoreCase(PriorityCompareCondition.NAME)) {
- return PriorityCompareCondition.load(element);
- }
- return null;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- return null;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/UIIcon.java b/freeplane/src/org/freeplane/features/icon/UIIcon.java
deleted file mode 100644
index b08cf6d..0000000
--- a/freeplane/src/org/freeplane/features/icon/UIIcon.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Tamas Eppel
- *
- * This file author is Tamas Eppel
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import java.net.URL;
-import java.util.regex.Pattern;
-
-import javax.swing.Icon;
-import javax.swing.KeyStroke;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.icon.factory.ImageIconFactory;
-
-/**
- * Base class for all icons used in FreePlane.
- *
- * @author Tamas Eppel
- *
- */
-public class UIIcon implements IIconInformation, Comparable<UIIcon> {
- private static final String DEFAULT_IMAGE_PATH = "/images";
- protected static final String SEPARATOR = "/";
- protected static final String THEME_FOLDER_KEY = "icon.theme.folder";
- protected static final ResourceController RESOURCE_CONTROLLER = ResourceController.getResourceController();
- private static final Pattern parentDirPattern = Pattern.compile(SEPARATOR + "[^" + SEPARATOR + ".]+" + SEPARATOR
- + "\\.\\." + SEPARATOR);
- private final String name;
- private final String fileName;
- private final String description;
- private final String shortcutKey;
- private URL resourceURL;
-
- public UIIcon(final String name, final String fileName) {
- this(name, fileName, "", "?");
- }
-
- public UIIcon(final String name, final String fileName, final String description) {
- this(name, fileName, description, "?");
- }
-
- public UIIcon(final String name, final String fileName, final String description, final String shortcutKey) {
- this.name = name;
- this.fileName = fileName;
- this.description = description;
- this.shortcutKey = shortcutKey;
- }
-
- public String getFileName() {
- return fileName;
- }
-
- /**
- * @return key for the shortcut in the property file
- */
- public String getShortcutKey() {
- return shortcutKey;
- }
-
- /**
- * @return description of icon
- */
- public String getDescription() {
- return description;
- }
-
- /**
- * @return name of icon
- */
- public String getName() {
- return name;
- }
-
- /**
- * @return associated ImageIcon for this icon
- */
- public Icon getIcon() {
- return ImageIconFactory.getInstance().getImageIcon(this);
- }
-
- public KeyStroke getKeyStroke() {
- return null;
- }
-
- public String getImagePath() {
- return DEFAULT_IMAGE_PATH;
- }
-
- public URL getUrl() {
- if (resourceURL != null) {
- return resourceURL;
- }
- final String path = getPath();
- resourceURL = RESOURCE_CONTROLLER.getResource(path);
- return resourceURL;
- }
-
- public String getPath() {
- StringBuilder builder = new StringBuilder();
- builder = new StringBuilder();
- builder.append(this.getImagePath());
- builder.append(SEPARATOR);
- builder.append(fileName);
- final String path = parentDirPattern.matcher(builder.toString()).replaceFirst(SEPARATOR);
- return path;
- }
-
- @Override
- public int hashCode() {
- final int prime = 31;
- int result = 1;
- result = prime * result + ((description == null) ? 0 : description.hashCode());
- result = prime * result + ((fileName == null) ? 0 : fileName.hashCode());
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- result = prime * result + ((shortcutKey == null) ? 0 : shortcutKey.hashCode());
- result = prime * result + this.getClass().hashCode();
- return result;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (this.getClass() != obj.getClass()) {
- return false;
- }
- final UIIcon other = (UIIcon) obj;
- if (description == null) {
- if (other.description != null) {
- return false;
- }
- }
- else if (!description.equals(other.description)) {
- return false;
- }
- if (fileName == null) {
- if (other.fileName != null) {
- return false;
- }
- }
- else if (!fileName.equals(other.fileName)) {
- return false;
- }
- if (name == null) {
- if (other.name != null) {
- return false;
- }
- }
- else if (!name.equals(other.name)) {
- return false;
- }
- if (shortcutKey == null) {
- if (other.shortcutKey != null) {
- return false;
- }
- }
- else if (!shortcutKey.equals(other.shortcutKey)) {
- return false;
- }
- return true;
- }
-
- public int compareTo(final UIIcon uiIcon) {
- return this.getPath().compareTo(uiIcon.getPath());
- }
-
- @Override
- public String toString() {
- return name;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/UIIconSet.java b/freeplane/src/org/freeplane/features/icon/UIIconSet.java
deleted file mode 100644
index 579a523..0000000
--- a/freeplane/src/org/freeplane/features/icon/UIIconSet.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Tamas Eppel
- *
- * This file author is Tamas Eppel
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.swing.Icon;
-
-import org.freeplane.core.ui.components.MultipleImage;
-
-public class UIIconSet extends UIIcon {
- final Collection<UIIcon> uiIcons;
- final float zoom;
-
- public Collection<UIIcon> getIcons() {
- return uiIcons;
- }
-
- List<Icon> imageIcons;
- private MultipleImage compoundIcon;
-
- public UIIconSet(final Collection<UIIcon> uiIcons, final float zoom) {
- super("", "");
- this.zoom = zoom;
- this.uiIcons = Collections.unmodifiableCollection(uiIcons);
- imageIcons = new LinkedList<Icon>();
- for (final UIIcon uiIcon : uiIcons) {
- final Icon icon;
- if (zoom == 1f) {
- icon = uiIcon.getIcon();
- }
- else {
- icon = new ZoomedIcon(uiIcon, zoom).getIcon();
- }
- imageIcons.add(icon);
- }
- }
-
- @Override
- public Icon getIcon() {
- if (compoundIcon == null) {
- compoundIcon = new MultipleImage();
- for (final Icon icon : imageIcons) {
- compoundIcon.addImage(icon);
- }
- }
- return compoundIcon;
- }
-
- @Override
- public int compareTo(final UIIcon uiIcon) {
- return 1;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (this == obj) {
- return true;
- }
- if (obj == null) {
- return false;
- }
- if (this.getClass() != obj.getClass()) {
- return false;
- }
- final UIIconSet uiIconSet = (UIIconSet) obj;
- return zoom == uiIconSet.zoom && uiIcons.equals(uiIconSet.uiIcons);
- }
-
- @Override
- public int hashCode() {
- return 31 * uiIcons.hashCode();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/UserIcon.java b/freeplane/src/org/freeplane/features/icon/UserIcon.java
deleted file mode 100644
index f537725..0000000
--- a/freeplane/src/org/freeplane/features/icon/UserIcon.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Tamas Eppel
- *
- * This file author is Tamas Eppel
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-
-/**
- *
- * Represents all icons used in Freeplane
- *
- * @author Tamas Eppel
- *
- */
-public class UserIcon extends MindIcon {
- public UserIcon(final String name, final String fileName, final String description) {
- super(name, fileName, description);
- }
-
- @Override
- public String getPath() {
- final StringBuilder builder = new StringBuilder();
- builder.append(ResourceController.getResourceController().getFreeplaneUserDirectory());
- builder.append(SEPARATOR);
- builder.append("icons");
- builder.append(SEPARATOR);
- builder.append(this.getFileName());
- final String path = builder.toString().replace(File.separatorChar, '/');
- return path;
- }
-
- @Override
- public URL getUrl() {
- URL result = null;
- final String urlString = getPath();
- try {
- result = new File(urlString).toURI().toURL();
- }
- catch (final MalformedURLException e) {
- LogUtils.warn(String.format("could not create URL from [%s]", urlString));
- }
- return result;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/ZoomedIcon.java b/freeplane/src/org/freeplane/features/icon/ZoomedIcon.java
deleted file mode 100644
index 6315ce7..0000000
--- a/freeplane/src/org/freeplane/features/icon/ZoomedIcon.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Tamas Eppel
- *
- * This file author is Tamas Eppel
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon;
-
-import java.awt.Graphics2D;
-import java.awt.Image;
-import java.awt.image.BufferedImage;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-
-public class ZoomedIcon extends UIIcon {
- final static private Map<UIIcon, Map<Float, ImageIcon>> zoomedIcons = new HashMap<UIIcon, Map<Float, ImageIcon>>();
- private final UIIcon uiIcon;
- private final float zoom;
- private ImageIcon zoomedIcon;
-
- public ZoomedIcon(final UIIcon uiIcon, final float zoom) {
- super(uiIcon.getName(), uiIcon.getFileName(), uiIcon.getDescription(), uiIcon.getShortcutKey());
- this.uiIcon = uiIcon;
- this.zoom = zoom;
- }
-
- @Override
- public Icon getIcon() {
- if (zoomedIcon == null) {
- Map<Float, ImageIcon> icons = zoomedIcons.get(uiIcon);
- if (icons == null) {
- icons = new HashMap<Float, ImageIcon>();
- zoomedIcons.put(uiIcon, icons);
- }
- zoomedIcon = icons.get(zoom);
- if (zoomedIcon != null) {
- return zoomedIcon;
- }
- final Icon icon = uiIcon.getIcon();
- final int width = icon.getIconWidth();
- final int height = icon.getIconHeight();
- final BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
- final Graphics2D g = image.createGraphics();
- icon.paintIcon(null, g, 0, 0);
- final Image scaledImage = image.getScaledInstance((int) (width * zoom), (int) (height * zoom),
- Image.SCALE_SMOOTH);
- zoomedIcon = new ImageIcon(scaledImage);
- icons.put(zoom, zoomedIcon);
- g.dispose();
- }
- return zoomedIcon;
- }
-
- @Override
- public String getPath() {
- return uiIcon.getPath();
- }
-
- @Override
- public URL getUrl() {
- return uiIcon.getUrl();
- }
-
- @Override
- public boolean equals(final Object obj) {
- return super.equals(obj) && zoom == ((ZoomedIcon) obj).zoom;
- }
-
- @Override
- public int hashCode() {
- return 31 * super.hashCode() + Float.valueOf(zoom).hashCode();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/factory/IconStoreFactory.java b/freeplane/src/org/freeplane/features/icon/factory/IconStoreFactory.java
deleted file mode 100644
index 97c8380..0000000
--- a/freeplane/src/org/freeplane/features/icon/factory/IconStoreFactory.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Tamas Eppel
- *
- * This file author is Tamas Eppel
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon.factory;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.IconGroup;
-import org.freeplane.features.icon.IconNotFound;
-import org.freeplane.features.icon.IconStore;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.icon.UIIcon;
-import org.freeplane.features.icon.UserIcon;
-
-/**
- *
- * Factory for IconStore objects.
- *
- * @author Tamas Eppel
- *
- */
-public class IconStoreFactory {
- private static final String SEPARATOR = ";";
- private static final ResourceController RESOURCE_CONTROLLER = ResourceController.getResourceController();
- private static final String GROUP_NAMES_KEY = "icons.groups";
- private static final String GROUP_KEY = "icons.group.%s";
- private static final String GROUP_ICON_KEY = "IconGroupPopupAction.%s.icon";
- private static final String GROUP_DESC_KEY = "IconGroupPopupAction.%s.text";
- private static IconStore groups;
-
- /**
- *
- * Creates an IconStore from the property file. If one was already
- * constructed it will be returned without creating a new one.
- *
- * @return
- */
- public static IconStore create() {
- if (groups != null) {
- return groups;
- }
- groups = new IconStore();
- IconStoreFactory.setIconGroups(groups);
- return groups;
- }
-
- private static void setIconGroups(final IconStore iconStore) {
- final String[] groupNames = RESOURCE_CONTROLLER.getProperty(GROUP_NAMES_KEY).split(SEPARATOR);
- for (final String groupName : groupNames) {
- final String description = TextUtils.getText(String.format(GROUP_DESC_KEY, groupName));
- List<MindIcon> icons;
- UIIcon groupIcon = null;
- if ("user".equals(groupName)) {
- icons = IconStoreFactory.getUserIcons();
- groupIcon = MindIconFactory.create("user_icon");
- }
- else {
- final String groupIconName = RESOURCE_CONTROLLER.getProperty(String.format(GROUP_ICON_KEY, groupName));
- final Map<String, MindIcon> iconMap = IconStoreFactory.getIcons(groupName);
- groupIcon = iconMap.get(groupIconName);
- icons = new ArrayList<MindIcon>(iconMap.values());
- }
- if (groupIcon == null) {
- groupIcon = icons.size() > 0 ? icons.get(0) : IconNotFound.instance();
- }
- iconStore.addGroup(new IconGroup(groupName, groupIcon, description, icons));
- }
- }
-
- private static Map<String, MindIcon> getIcons(final String groupName) {
- final String[] iconNames = RESOURCE_CONTROLLER.getProperty(String.format(GROUP_KEY, groupName))
- .split(SEPARATOR);
- final Map<String, MindIcon> icons = new LinkedHashMap<String, MindIcon>(iconNames.length);
- for (final String iconName : iconNames) {
- final MindIcon icon = MindIconFactory.create(iconName);
- icons.put(iconName, icon);
- }
- return icons;
- }
-
- private static List<MindIcon> getUserIcons() {
- final ResourceController resourceController = ResourceController.getResourceController();
- if (resourceController.isApplet()) {
- return Collections.emptyList();
- }
- final File iconDir = new File(resourceController.getFreeplaneUserDirectory(), "icons");
- if (!iconDir.exists()) {
- LogUtils.info("creating user icons directory " + iconDir);
- iconDir.mkdirs();
- return Collections.emptyList();
- }
- return IconStoreFactory.getUserIcons(iconDir, "");
- }
-
- private static List<MindIcon> getUserIcons(final File iconDir, final String dir) {
- final String[] userIconArray = iconDir.list(new FilenameFilter() {
- public boolean accept(final File dir, final String name) {
- final int nameLength = name.length();
- return nameLength > 4 && name.substring(nameLength - 4).equalsIgnoreCase(".png") || new File(dir, name).isDirectory();
- }
- });
- if (userIconArray == null) {
- return Collections.emptyList();
- }
- final List<MindIcon> icons = new ArrayList<MindIcon>(userIconArray.length);
- for (final String fileName : userIconArray) {
- final File childDir = new File(iconDir, fileName);
- final String fullName = dir + fileName;
- if (childDir.isDirectory()) {
- final List<MindIcon> childUserIcons = IconStoreFactory.getUserIcons(childDir, fullName + '/');
- icons.addAll(childUserIcons);
- }
- }
- for (final String fileName : userIconArray) {
- final File childDir = new File(iconDir, fileName);
- final String fullName = dir + fileName;
- if (childDir.isDirectory()) {
- continue;
- }
- final String iconName = fullName.substring(0, fullName.length() - 4);
- final String iconDescription = fileName.substring(0, fileName.length() - 4);
- if (iconName.equals("")) {
- continue;
- }
- final UserIcon icon = new UserIcon(iconName, fullName, iconDescription);
- icons.add(icon);
- }
- return icons;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/factory/MindIconFactory.java b/freeplane/src/org/freeplane/features/icon/factory/MindIconFactory.java
deleted file mode 100644
index b62d5a6..0000000
--- a/freeplane/src/org/freeplane/features/icon/factory/MindIconFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Tamas Eppel
- *
- * This file author is Tamas Eppel
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon.factory;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.MindIcon;
-
-/**
- *
- * Factory for MindIcons.
- *
- * @author Tamas Eppel
- *
- */
-public class MindIconFactory {
- private static final String DESC_KEY = "icon_%s";
-
- /**
- * Constructs a MindIcon with the given name from the property file.
- * The name of the icon is the file name without the extension.
- *
- * @param name of the icon
- * @return
- */
- public static MindIcon create(final String name) {
- final String description = name.indexOf('/') > 0 ? "" : TextUtils.getText(String.format(DESC_KEY, name), "");
- return new MindIcon(name, name + ".png", description);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/mindmapmode/IconAction.java b/freeplane/src/org/freeplane/features/icon/mindmapmode/IconAction.java
deleted file mode 100644
index c92d2ee..0000000
--- a/freeplane/src/org/freeplane/features/icon/mindmapmode/IconAction.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.Action;
-import javax.swing.Icon;
-import javax.swing.KeyStroke;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.icon.IIconInformation;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.icon.factory.ImageIconFactory;
-import org.freeplane.features.map.NodeModel;
-
-class IconAction extends AMultipleNodeAction implements IIconInformation {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private MindIcon icon;
-
- public IconAction( final MindIcon _icon) {
- super("IconAction." + _icon.getName(), _icon.getDescription(), ImageIconFactory.getInstance()
- .getImageIcon(_icon));
- icon = _icon;
- putValue(Action.SHORT_DESCRIPTION, getDescription());
- }
-
- @Override
- public void actionPerformed(final ActionEvent e, final NodeModel node) {
- ((MIconController) IconController.getController()).addIcon(node, icon);
- }
-
- public String getDescription() {
- return icon.getDescription();
- }
-
- public Icon getIcon() {
- return ImageIconFactory.getInstance().getImageIcon(icon);
- }
-
- public KeyStroke getKeyStroke() {
- final String keystrokeResourceName = icon.getShortcutKey();
- final String keyStrokeDescription = ResourceController.getResourceController().getProperty(keystrokeResourceName);
- return UITools.getKeyStroke(keyStrokeDescription);
- }
-
- public MindIcon getMindIcon() {
- return icon;
- }
-
- public String getShortcutKey() {
- return icon.getShortcutKey();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/mindmapmode/IconSelectionPlugin.java b/freeplane/src/org/freeplane/features/icon/mindmapmode/IconSelectionPlugin.java
deleted file mode 100644
index 93073ba..0000000
--- a/freeplane/src/org/freeplane/features/icon/mindmapmode/IconSelectionPlugin.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.util.ArrayList;
-
-import javax.swing.Action;
-import javax.swing.ListModel;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.IconSelectionPopupDialog;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.icon.IIconInformation;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.IconRegistry;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.ui.ViewController;
-
-/**
- * @author adapted to the plugin mechanism by ganzer
- */
-public class IconSelectionPlugin extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
-
- public IconSelectionPlugin() {
- super("IconSelectionPlugin");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- ArrayList<IIconInformation> actions = new ArrayList<IIconInformation>();
-
- final Controller controller = Controller.getCurrentController();
- final MapModel map = controller.getMap();
- final IconRegistry iconRegistry = map.getIconRegistry();
- final ListModel usedIcons = iconRegistry.getIconsAsListModel();
- for(int i = 0; i < usedIcons.getSize(); i++){
- final Object icon = usedIcons.getElementAt(i);
- if(icon instanceof MindIcon){
- actions.add(new IconAction((MindIcon) icon));
- }
- }
-
- final MIconController mIconController = (MIconController) IconController.getController();
- for (AFreeplaneAction aFreeplaneAction : mIconController.getIconActions())
- actions.add((IIconInformation) aFreeplaneAction);
-
- actions.add((IIconInformation) modeController.getAction("RemoveIcon_0_Action"));
- actions.add((IIconInformation) modeController.getAction("RemoveIconAction"));
- actions.add((IIconInformation) modeController.getAction("RemoveAllIconsAction"));
-
- final ViewController viewController = controller.getViewController();
- final IconSelectionPopupDialog selectionDialog = new IconSelectionPopupDialog(viewController.getJFrame(),
- actions);
- final NodeModel selected = controller.getSelection().getSelected();
- controller.getMapViewManager().scrollNodeToVisible(selected);
- selectionDialog.pack();
- UITools.setDialogLocationRelativeTo(selectionDialog, selected);
- selectionDialog.setModal(true);
- selectionDialog.show();
- final int result = selectionDialog.getResult();
- if (result >= 0) {
- final Action action = (Action) actions.get(result);
- action.actionPerformed(new ActionEvent(action, 0, NodeModel.NODE_ICON, selectionDialog.getModifiers()));
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/mindmapmode/MIconController.java b/freeplane/src/org/freeplane/features/icon/mindmapmode/MIconController.java
deleted file mode 100644
index 1598b3e..0000000
--- a/freeplane/src/org/freeplane/features/icon/mindmapmode/MIconController.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon.mindmapmode;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.GridLayout;
-import java.awt.Insets;
-import java.awt.Point;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.Action;
-import javax.swing.JComponent;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JToolBar;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.IPropertyControl;
-import org.freeplane.core.resources.components.IPropertyControlCreator;
-import org.freeplane.core.resources.components.KeyProperty;
-import org.freeplane.core.resources.components.OptionPanelBuilder;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.IndexedTree;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.MenuSplitter;
-import org.freeplane.core.ui.components.FreeplaneToolBar;
-import org.freeplane.core.ui.components.JAutoScrollBarPane;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.icon.IIconInformation;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.IconGroup;
-import org.freeplane.features.icon.IconStore;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.map.IExtensionCopier;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.ui.ViewController;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MIconController extends IconController {
- public static enum Keys {
- ICONS
- };
-
- private static class ExtensionCopier implements IExtensionCopier {
- public void copy(final Object key, final NodeModel from, final NodeModel to) {
- if (!key.equals(Keys.ICONS)) {
- return;
- }
- copy(from, to);
- }
-
- public void copy(final NodeModel from, final NodeModel to) {
- final List<MindIcon> sourceIcons = from.getIcons();
- final List<MindIcon> targetIcons = to.getIcons();
- for (final MindIcon icon : sourceIcons) {
- if (targetIcons.contains(icon)) {
- continue;
- }
- to.addIcon(icon);
- }
- }
-
- public void remove(final Object key, final NodeModel from) {
- if (!key.equals(Keys.ICONS)) {
- return;
- }
- while (from.removeIcon() > 0) {
- ;
- }
- }
-
- public void remove(final Object key, final NodeModel from, final NodeModel which) {
- if (!key.equals(Keys.ICONS)) {
- return;
- }
- final List<MindIcon> targetIcons = from.getIcons();
- final List<MindIcon> whichIcons = which.getIcons();
- for (final MindIcon icon : targetIcons) {
- if (!whichIcons.contains(icon)) {
- continue;
- }
- final int position = targetIcons.lastIndexOf(icon);
- if (position == -1) {
- continue;
- }
- from.removeIcon(position);
- }
- }
- public void resolveParentExtensions(Object key, NodeModel to) {
- }
- }
-
- private final Map<MindIcon, AFreeplaneAction> iconActions = new LinkedHashMap<MindIcon, AFreeplaneAction>();
- private final IconStore STORE = IconStoreFactory.create();
- private final JToolBar iconToolBar;
- private final JAutoScrollBarPane iconToolBarScrollPane;
-
- /**
- * @param modeController
- */
- public MIconController(final ModeController modeController) {
- super(modeController);
- modeController.registerExtensionCopier(new ExtensionCopier());
- iconToolBar = new FreeplaneToolBar("icon_toolbar", SwingConstants.VERTICAL);
- iconToolBarScrollPane = new JAutoScrollBarPane(iconToolBar);
- UITools.setScrollbarIncrement(iconToolBarScrollPane);
- UITools.addScrollbarIncrementPropertyListener(iconToolBarScrollPane);
- iconToolBarScrollPane.putClientProperty(ViewController.VISIBLE_PROPERTY_KEY, "leftToolbarVisible");
- createIconActions(modeController);
- createPreferences();
- modeController.addMenuContributor(new IMenuContributor() {
- public void updateMenus(final ModeController modeController, MenuBuilder builder) {
- MIconController.this.updateMenus(modeController, builder);
- updateIconToolbar(modeController);
- }
- });
- }
-
- public void addIcon(final NodeModel node, final MindIcon icon) {
- final IActor actor = new IActor() {
- public void act() {
- node.addIcon(icon);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, null, icon);
- }
-
- public String getDescription() {
- return "addIcon";
- }
-
- public void undo() {
- node.removeIcon();
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, icon, null);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- public void addIcon(final NodeModel node, final MindIcon icon, final int position) {
- final IActor actor = new IActor() {
- public void act() {
- node.addIcon(icon, position);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, null, icon);
- }
-
- public String getDescription() {
- return "addIcon";
- }
-
- public void undo() {
- node.removeIcon(position);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, icon, null);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- private void addIconGroupToMenu(final MenuBuilder builder, final String category, final IconGroup group) {
- if (group.getIcons().size() < 1) {
- return;
- }
- final JMenuItem item = new JMenu();
- item.setIcon(group.getGroupIcon().getIcon());
- item.setText(group.getDescription());
- final String itemKey = category + "/" + group;
- builder.addMenuItem(category, item, itemKey, MenuBuilder.AS_CHILD);
- for (final MindIcon icon : group.getIcons()) {
- final String fileName = icon.getFileName();
- addAction(builder, itemKey, icon, fileName);
- }
- }
-
- private void addAction(final MenuBuilder builder, final String itemKey, final MindIcon icon, final String fileName) {
- final int separatorPosition = fileName.indexOf('/');
- if (separatorPosition == -1) {
- builder.addAction(itemKey, iconActions.get(icon), MenuBuilder.AS_CHILD);
- return;
- }
- final String submenuName = fileName.substring(0, separatorPosition);
- final String submenuKey = itemKey + "/" + submenuName;
- if (null == builder.get(submenuKey)) {
- final JMenu submenu = new JMenu(submenuName);
- builder.addMenuItem(itemKey, submenu, submenuKey, MenuBuilder.AS_CHILD);
- }
- addAction(builder, submenuKey, icon, fileName.substring(separatorPosition + 1));
- }
-
- private void addIconsToMenu(final ModeController modeController, final MenuBuilder builder, final String iconMenuString) {
- if(builder.get(iconMenuString) == null)
- return;
- for (final IconGroup iconGroup : STORE.getGroups()) {
- addIconGroupToMenu(builder, iconMenuString, iconGroup);
- }
- }
-
- private void createIconActions(final ModeController modeController) {
- modeController.addAction(new RemoveIconAction(0));
- modeController.addAction(new RemoveIconAction(-1));
- modeController.addAction(new RemoveAllIconsAction());
- for (final MindIcon icon : STORE.getMindIcons()) {
- final IconAction myAction = new IconAction(icon);
- iconActions.put(icon, myAction);
- }
- }
-
- private void createPreferences() {
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- final OptionPanelBuilder optionPanelBuilder = modeController.getOptionPanelBuilder();
- final List<AFreeplaneAction> actions = new ArrayList<AFreeplaneAction>();
- actions.addAll(iconActions.values());
- actions.add(modeController.getAction("RemoveIcon_0_Action"));
- actions.add(modeController.getAction("RemoveIconAction"));
- actions.add(modeController.getAction("RemoveAllIconsAction"));
-
- for (final AFreeplaneAction iconAction : actions) {
- final IIconInformation info = (IIconInformation) iconAction;
- optionPanelBuilder.addCreator("Keystrokes/icons", new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- final KeyProperty keyProperty = new KeyProperty(info.getShortcutKey());
- keyProperty.setLabelText(info.getDescription());
- keyProperty.setImageIcon(info.getIcon());
- keyProperty.disableModifiers();
- return keyProperty;
- }
- }, IndexedTree.AS_CHILD);
- }
- }
-
- public Collection<AFreeplaneAction> getIconActions() {
- return Collections.unmodifiableCollection(iconActions.values());
- }
-
- /**
- * @return
- */
- public JComponent getIconToolBarScrollPane() {
- return iconToolBarScrollPane;
- }
-
- public Collection<MindIcon> getMindIcons() {
- final List<MindIcon> iconInfoList = new ArrayList<MindIcon>();
- final Collection<AFreeplaneAction> iconActions = getIconActions();
- for (final Action action : iconActions) {
- final MindIcon info = ((IconAction) action).getMindIcon();
- iconInfoList.add(info);
- }
- return iconInfoList;
- }
-
- private JMenu getSubmenu( final IconGroup group) {
- final JMenu menu = new JMenu("\u25ba") {
- private static final long serialVersionUID = 1L;
-
- @Override
- protected Point getPopupMenuOrigin() {
- return new Point(getWidth(), 0);
- }
- };
- menu.setFont(menu.getFont().deriveFont(8F));
- menu.setMargin(new Insets(0, 0, 0, 0));
- menu.setIcon(group.getGroupIcon().getIcon());
- for (final MindIcon icon : group.getIcons()) {
- addActionToIconSubmenu(menu, icon, icon.getFileName());
- }
- menu.setToolTipText(group.getDescription());
- return menu;
- }
-
- private void addActionToIconSubmenu(final JMenu menu, final MindIcon icon, final String fileName) {
- final AFreeplaneAction myAction = iconActions.get(icon);
- final int separatorPosition = fileName.indexOf('/');
- if (separatorPosition == -1) {
- new MenuSplitter().addMenuComponent(menu, new JMenuItem(myAction), menu.getItemCount());
- return;
- }
- final String submenuName = fileName.substring(0, separatorPosition);
- final int componentCount = menu.getItemCount();
- if (componentCount != 0) {
- final Component lastComponent = menu.getMenuComponent(componentCount - 1);
- if (lastComponent instanceof JMenu) {
- final JMenu lastSubmenu = (JMenu) lastComponent;
- if (lastSubmenu.getText().equals(submenuName)) {
- addActionToIconSubmenu(lastSubmenu, icon, fileName.substring(separatorPosition + 1));
- return;
- }
- }
- }
- final JMenu submenu = new JMenu(submenuName);
- menu.add(submenu);
- addActionToIconSubmenu(submenu, icon, fileName.substring(separatorPosition + 1));
- }
-
- private void insertSubmenus(final JToolBar iconToolBar) {
- final JMenuBar iconMenuBar = new JMenuBar() {
- private static final long serialVersionUID = 1L;
-
- @Override
- public Dimension getMaximumSize() {
- final Dimension preferredSize = getPreferredSize();
- return new Dimension(Short.MAX_VALUE, preferredSize.height);
- }
- };
- iconMenuBar.setAlignmentX(JComponent.CENTER_ALIGNMENT);
- iconMenuBar.setLayout(new GridLayout(0, 1));
- for (final IconGroup iconGroup : STORE.getGroups()) {
- iconMenuBar.add(getSubmenu(iconGroup));
- }
- iconToolBar.add(iconMenuBar);
- }
-
- public void removeAllIcons(final NodeModel node) {
- final int size = node.getIcons().size();
- final MIconController iconController = (MIconController) IconController.getController();
- for (int i = 0; i < size; i++) {
- iconController.removeIcon(node, 0);
- }
- }
-
- public int removeIcon(final NodeModel node) {
- return removeIcon(node, -1);
- }
-
- public int removeIcon(final NodeModel node, final int position) {
- final int size = node.getIcons().size();
- final int index = position >= 0 ? position : size + position;
- if (size == 0 || size <= index) {
- return size;
- }
- final IActor actor = new IActor() {
- private final MindIcon icon = node.getIcon(index);
-
- public void act() {
- node.removeIcon(index);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, icon, null);
- }
-
- public String getDescription() {
- return "removeIcon";
- }
-
- public void undo() {
- node.addIcon(icon, index);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_ICON, null, icon);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- return node.getIcons().size();
- }
-
- private void updateIconToolbar(ModeController modeController) {
- iconToolBar.removeAll();
- iconToolBar.add(modeController.getAction("RemoveIcon_0_Action"))
- .setAlignmentX(JComponent.CENTER_ALIGNMENT);
- iconToolBar.add(modeController.getAction("RemoveIconAction")).setAlignmentX(JComponent.CENTER_ALIGNMENT);
- iconToolBar.add(modeController.getAction("RemoveAllIconsAction")).setAlignmentX(
- JComponent.CENTER_ALIGNMENT);
- iconToolBar.addSeparator();
- if (ResourceController.getResourceController().getBooleanProperty("structured_icon_toolbar")) {
- insertSubmenus(iconToolBar);
- return;
- }
- final String[] fpIcons = ResourceController.getResourceController().getProperty("icons.list").split(";");
- for (final String icon : fpIcons) {
- final MindIcon mindIcon = STORE.getMindIcon(icon);
- final AFreeplaneAction iconAction = iconActions.get(mindIcon);
- iconToolBar.add(iconAction).setAlignmentX(JComponent.CENTER_ALIGNMENT);
- }
- final Collection<MindIcon> userIcons = STORE.getUserIcons();
- for (final MindIcon icon : userIcons) {
- final AFreeplaneAction iconAction = iconActions.get(icon);
- iconToolBar.add(iconAction).setAlignmentX(JComponent.CENTER_ALIGNMENT);
- }
- }
-
- private void updateMenus(ModeController modeController, final MenuBuilder builder) {
- addIconsToMenu(modeController, builder, "main_menu_icons");
- addIconsToMenu(modeController, builder, "popup_menu_icons");
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/mindmapmode/RemoveAllIconsAction.java b/freeplane/src/org/freeplane/features/icon/mindmapmode/RemoveAllIconsAction.java
deleted file mode 100644
index bb7e9cd..0000000
--- a/freeplane/src/org/freeplane/features/icon/mindmapmode/RemoveAllIconsAction.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.Action;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.KeyStroke;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.icon.IIconInformation;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author foltin
- */
-class RemoveAllIconsAction extends AMultipleNodeAction implements IIconInformation {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- */
- public RemoveAllIconsAction() {
- super("RemoveAllIconsAction");
- putValue(Action.SHORT_DESCRIPTION, getDescription());
- }
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- final MIconController iconController = (MIconController) IconController.getController();
- iconController.removeAllIcons(node);
- }
-
- public String getDescription() {
- return (String) getValue(Action.NAME);
- }
-
- public Icon getIcon() {
- return (ImageIcon) getValue(Action.SMALL_ICON);
- }
-
- public KeyStroke getKeyStroke() {
- return UITools.getKeyStroke(ResourceController.getResourceController().getProperty(getShortcutKey()));
- }
-
- public String getShortcutKey() {
- return getKey() + ".shortcut";
- }
-}
diff --git a/freeplane/src/org/freeplane/features/icon/mindmapmode/RemoveIconAction.java b/freeplane/src/org/freeplane/features/icon/mindmapmode/RemoveIconAction.java
deleted file mode 100644
index 86546d7..0000000
--- a/freeplane/src/org/freeplane/features/icon/mindmapmode/RemoveIconAction.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.icon.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.Action;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.KeyStroke;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.icon.IIconInformation;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author foltin
- */
-class RemoveIconAction extends AMultipleNodeAction implements IIconInformation {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private int position;
-
- /**
- */
- public RemoveIconAction( final int position) {
- super(position == -1 ? "RemoveIconAction" : "RemoveIcon_" + position + "_Action");
- this.position = position;
- putValue(Action.SHORT_DESCRIPTION, getDescription());
- }
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- final MIconController iconController = (MIconController) IconController.getController();
- iconController.removeIcon(node, position);
- return;
- }
-
- public String getDescription() {
- return (String) getValue(Action.NAME);
- }
-
- public Icon getIcon() {
- return (ImageIcon) getValue(Action.SMALL_ICON);
- }
-
- public KeyStroke getKeyStroke() {
- return UITools.getKeyStroke(ResourceController.getResourceController().getProperty(getShortcutKey()));
- }
-
- public String getShortcutKey() {
- return getKey() + ".shortcut";
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/ConnectorLabelCondition.java b/freeplane/src/org/freeplane/features/link/ConnectorLabelCondition.java
deleted file mode 100644
index 70784dc..0000000
--- a/freeplane/src/org/freeplane/features/link/ConnectorLabelCondition.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.util.Set;
-
-import org.freeplane.features.filter.ExactStringMatchingStrategy;
-import org.freeplane.features.filter.StringMatchingStrategy;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Mar 7, 2009
- */
-public abstract class ConnectorLabelCondition extends ASelectableCondition {
- static final String TEXT = "TEXT";
- static final String MATCH_CASE = "MATCH_CASE";
- static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
- final private String text;
- final private boolean matchCase;
- final private boolean matchApproximately;
- final private StringMatchingStrategy stringMatchingStrategy;
-
- protected boolean matchCase() {
- return matchCase;
- }
-
- protected boolean matchApproximately() {
- return matchApproximately;
- }
-
- protected StringMatchingStrategy getStringMatchingStrategy()
- {
- return stringMatchingStrategy;
- }
-
- public ConnectorLabelCondition(final String text, final boolean matchCase,
- final boolean matchApproximately) {
- super();
- this.matchCase = matchCase;
- //this.text = matchCase ? text : text.toLowerCase();
- this.text = text;
- this.matchApproximately = matchApproximately;
- stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- }
-
- public String getText() {
- return text;
- }
-
- abstract protected boolean checkLink(final ConnectorModel connector);
-
- public boolean checkNode(final NodeModel node) {
- final NodeLinks nodeLinks = NodeLinks.getModel(node);
- if (nodeLinks != null) {
- for (final LinkModel l : nodeLinks.getLinks()) {
- if (!(l instanceof ConnectorModel)) {
- continue;
- }
- if (checkLink((ConnectorModel) l)) {
- return true;
- }
- }
- }
- if (!node.hasID()) {
- return false;
- }
- final MapLinks mapLinks = MapLinks.getLinks(node.getMap());
- if (mapLinks == null) {
- return false;
- }
- final Set<LinkModel> targetLinks = mapLinks.get(node.getID());
- if (targetLinks == null) {
- return false;
- }
- for (final LinkModel l : targetLinks) {
- if (!(l instanceof ConnectorModel)) {
- continue;
- }
- if (checkLink((ConnectorModel) l)) {
- return true;
- }
- }
- return false;
- }
-
- abstract protected String createDescription();
-
- protected abstract String getName();
-
- protected void fillXML(final XMLElement child) {
- child.setAttribute(TEXT, text);
- child.setAttribute(MATCH_CASE, Boolean.toString(matchCase));
- child.setAttribute(MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/ConnectorModel.java b/freeplane/src/org/freeplane/features/link/ConnectorModel.java
deleted file mode 100644
index a76abf9..0000000
--- a/freeplane/src/org/freeplane/features/link/ConnectorModel.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.awt.Color;
-import java.awt.Point;
-
-import org.freeplane.features.map.NodeModel;
-
-public class ConnectorModel extends NodeLinkModel {
- public static enum Shape {
- LINE, LINEAR_PATH, CUBIC_CURVE, EDGE_LIKE
- };
-
- private Color color;
- private int alpha;
- private ArrowType endArrow;
- private int[] dash;
- private Point endInclination;
- private String middleLabel;
- private String sourceLabel;
- private ArrowType startArrow;
- private Point startInclination;
- private String targetLabel;
- private int width;
- private Shape shape;
-
- private String labelFontFamily;
- private int labelFontSize;
-
-
- public Shape getShape() {
- return shape;
- }
-
- public void setShape(final Shape shape) {
- assert shape != null;
- this.shape = shape;
- }
-
- public int[] getDash() {
- return dash;
- }
-
- public void setDash(int[] dash) {
- this.dash = dash;
- }
-
- public ConnectorModel(final NodeModel source, final String targetID, final Color color,
- final int alpha, final Shape shape, final int width,
- final String labelFontFamily, final int labelFontSize) {
- super(source, targetID);
- assert source != null;
- assert color != null;
- assert shape != null;
- this.color = color;
- this.setAlpha(alpha);
- this.width = width;
- this.shape = shape;
- this.labelFontFamily = labelFontFamily;
- this.labelFontSize = labelFontSize;
- startArrow = ArrowType.NONE;
- endArrow = ArrowType.DEFAULT;
- }
-
- public void changeInclination(int deltaX, final int deltaY, final NodeModel linkedNodeView,
- final Point changedInclination) {
- if (linkedNodeView.isLeft()) {
- deltaX = -deltaX;
- }
- changedInclination.translate(deltaX, deltaY);
- if (changedInclination.x != 0 && Math.abs((double) changedInclination.y / changedInclination.x) < 0.015) {
- changedInclination.y = 0;
- }
- final double k = changedInclination.distance(0, 0);
- if (k < 10) {
- if (k > 0) {
- changedInclination.x = (int) (changedInclination.x * 10 / k);
- changedInclination.y = (int) (changedInclination.y * 10 / k);
- }
- else {
- changedInclination.x = 10;
- }
- }
- }
-
- private String empty2null(final String label) {
- return "".equals(label) ? null : label;
- }
-
- public Color getColor() {
- return color;
- }
-
- public ArrowType getEndArrow() {
- return endArrow;
- }
-
- public Point getEndInclination() {
- if (endInclination == null) {
- return null;
- }
- return new Point(endInclination);
- }
-
- public String getMiddleLabel() {
- return middleLabel;
- }
-
- public String getSourceLabel() {
- return sourceLabel;
- }
-
- public ArrowType getStartArrow() {
- return startArrow;
- }
-
- public Point getStartInclination() {
- if (startInclination == null) {
- return null;
- }
- return new Point(startInclination);
- }
-
- public String getTargetLabel() {
- return targetLabel;
- }
-
- public int getWidth() {
- return width;
- }
-
- public void setColor(final Color color) {
- assert color != null;
- this.color = color;
- }
-
- public void setEndArrow(final ArrowType endArrow) {
- assert endArrow != null;
- this.endArrow = endArrow;
- }
-
- public void setEndInclination(final Point endInclination) {
- assert endInclination != null;
- this.endInclination = endInclination;
- }
-
- public void setMiddleLabel(final String middleLabel) {
- this.middleLabel = empty2null(middleLabel);
- }
-
- private boolean showControlPointsFlag;
-
- public boolean getShowControlPointsFlag() {
- return showControlPointsFlag;
- }
-
- public void setShowControlPoints(final boolean bShowControlPointsFlag) {
- showControlPointsFlag = bShowControlPointsFlag;
- }
-
- public void setSourceLabel(final String label) {
- sourceLabel = empty2null(label);
- }
-
- public void setStartArrow(final ArrowType startArrow) {
- assert startArrow != null;
- this.startArrow = startArrow;
- }
-
- public void setStartInclination(final Point startInclination) {
- this.startInclination = startInclination;
- }
-
- public void setTargetLabel(final String targetLabel) {
- this.targetLabel = empty2null(targetLabel);
- }
-
- public void setWidth(final int width) {
- this.width = width;
- }
-
- public void setAlpha(int alpha) {
- this.alpha = alpha;
- }
-
- public int getAlpha() {
- return alpha;
- }
- public String getLabelFontFamily() {
- return labelFontFamily;
- }
-
- public void setLabelFontFamily(String labelFontFamily) {
- this.labelFontFamily = labelFontFamily;
- }
-
- public int getLabelFontSize() {
- return labelFontSize;
- }
-
- public void setLabelFontSize(int labelFontSize) {
- this.labelFontSize = labelFontSize;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/link/FollowLinkAction.java b/freeplane/src/org/freeplane/features/link/FollowLinkAction.java
deleted file mode 100644
index 1a16195..0000000
--- a/freeplane/src/org/freeplane/features/link/FollowLinkAction.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
- at EnabledAction(checkOnNodeChange = true)
-class FollowLinkAction extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
-
- public FollowLinkAction() {
- super("FollowLinkAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- final MapController mapController = modeController.getMapController();
- LinkController linkController = null;
- for (final NodeModel selNode : mapController.getSelectedNodes()) {
- if (linkController == null) {
- linkController = LinkController.getController();
- }
- linkController.loadURL(selNode, e);
- }
- }
-
- @Override
- public void setEnabled() {
- setEnabled(isLinkEnabled());
- }
-
- private boolean isLinkEnabled() {
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- for (final NodeModel selNode : mapController.getSelectedNodes()) {
- if (NodeLinks.getValidLink(selNode) != null) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/GotoLinkNodeAction.java b/freeplane/src/org/freeplane/features/link/GotoLinkNodeAction.java
deleted file mode 100644
index 1fbaa0f..0000000
--- a/freeplane/src/org/freeplane/features/link/GotoLinkNodeAction.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.Action;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.text.TextController;
-
-/** Follow a graphical link (AKA connector) action. */
-class GotoLinkNodeAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private final LinkController linkController;
- private final NodeModel target;
-
- public GotoLinkNodeAction(final LinkController linkController, final NodeModel target) {
- super("GotoLinkNodeAction");
- this.target = target;
- this.linkController = linkController;
- if (target != null) {
- final String adaptedText = TextController.getController().getShortText(target);
- putValue(Action.NAME, TextUtils.getText("follow_graphical_link") + adaptedText);
- putValue(Action.SHORT_DESCRIPTION, target.toString());
- }
- }
-
- public void actionPerformed(final ActionEvent e) {
- linkController.onDeselect(Controller.getCurrentModeController().getMapController().getSelectedNode());
- Controller.getCurrentModeController().getMapController().select(target);
- linkController.onSelect(target);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/HyperLinkContainsCondition.java b/freeplane/src/org/freeplane/features/link/HyperLinkContainsCondition.java
deleted file mode 100644
index d13fa39..0000000
--- a/freeplane/src/org/freeplane/features/link/HyperLinkContainsCondition.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.net.URI;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.ExactStringMatchingStrategy;
-import org.freeplane.features.filter.StringMatchingStrategy;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Mar 7, 2009
- */
-public class HyperLinkContainsCondition extends HyperLinkCondition {
- public static final String NAME = "hyper_link_contains";
- public static final String MATCH_CASE = "MATCH_CASE";
- public static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
-
- private final boolean matchCase;
- private final boolean matchApproximately;
- private final StringMatchingStrategy stringMatchingStrategy;
-
- public HyperLinkContainsCondition(final String hyperlink, final boolean matchCase, final boolean matchApproximately) {
- super(hyperlink);
- this.matchCase = matchCase;
- this.matchApproximately = matchApproximately;
- this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- }
-
- @Override
- protected boolean checkLink(final URI nodeLink) {
- return stringMatchingStrategy.matches(getHyperlink(), nodeLink.toString(), true, matchCase);
-// return nodeLink.toString().contains(getHyperlink());
- }
-
- @Override
- protected String createDescription() {
- final String condition = TextUtils.getText(LinkConditionController.FILTER_LINK);
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
- return ConditionFactory.createDescription(condition, simpleCondition, getHyperlink(), matchCase, matchApproximately);
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-
- @Override
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(HyperLinkContainsCondition.MATCH_CASE, Boolean.toString(matchCase));
- child.setAttribute(HyperLinkContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/HyperLinkEqualsCondition.java b/freeplane/src/org/freeplane/features/link/HyperLinkEqualsCondition.java
deleted file mode 100644
index 6c9201b..0000000
--- a/freeplane/src/org/freeplane/features/link/HyperLinkEqualsCondition.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.net.URI;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.ExactStringMatchingStrategy;
-import org.freeplane.features.filter.StringMatchingStrategy;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Mar 7, 2009
- */
-public class HyperLinkEqualsCondition extends HyperLinkCondition {
- public static final String NAME = "hyper_link_equals";
- public static final String MATCH_CASE = "MATCH_CASE";
- public static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
-
- private final boolean matchCase;
- private final boolean matchApproximately;
- private final StringMatchingStrategy stringMatchingStrategy;
-
- public HyperLinkEqualsCondition(final String hyperlink, final boolean matchCase, final boolean matchApproximately) {
- super(hyperlink);
- this.matchCase = matchCase;
- this.matchApproximately = matchApproximately;
- this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- }
-
- @Override
- protected boolean checkLink(final URI nodeLink) {
-// return getHyperlink().equals(nodeLink);
- return stringMatchingStrategy.matches(getHyperlink(), nodeLink.toString(), false, matchCase);
- }
-
- @Override
- protected String createDescription() {
- final String condition = TextUtils.getText(LinkConditionController.FILTER_LINK);
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_IS_EQUAL_TO);
- return ConditionFactory.createDescription(condition, simpleCondition, getHyperlink(), matchCase, matchApproximately);
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-
- @Override
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(HyperLinkContainsCondition.MATCH_CASE, Boolean.toString(matchCase));
- child.setAttribute(HyperLinkContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/link/HyperTextLinkModel.java b/freeplane/src/org/freeplane/features/link/HyperTextLinkModel.java
deleted file mode 100644
index 2248aa0..0000000
--- a/freeplane/src/org/freeplane/features/link/HyperTextLinkModel.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- */
-public class HyperTextLinkModel extends NodeLinkModel {
- /**
- * @param source
- * @param target
- */
- public HyperTextLinkModel(final NodeModel source, final String targetID) {
- super(source, targetID);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/LinkBuilder.java b/freeplane/src/org/freeplane/features/link/LinkBuilder.java
deleted file mode 100644
index 25b82c4..0000000
--- a/freeplane/src/org/freeplane/features/link/LinkBuilder.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.awt.Color;
-import java.awt.Point;
-import java.io.IOException;
-import java.net.URI;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IExtensionAttributeWriter;
-import org.freeplane.core.io.IExtensionElementWriter;
-import org.freeplane.core.io.IReadCompletionListener;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.io.xml.TreeXmlReader;
-import org.freeplane.core.io.xml.TreeXmlWriter;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.features.link.ConnectorModel.Shape;
-import org.freeplane.features.map.NodeBuilder;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.url.MapVersionInterpreter;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-class LinkBuilder implements IElementDOMHandler, IReadCompletionListener, IExtensionElementWriter,
- IExtensionAttributeWriter {
- private static final int FREEPLANE_VERSION_WITH_CURVED_LOOPED_CONNECTORS = 3;
- private static final String FORMAT_AS_HYPERLINK = "FORMAT_AS_HYPERLINK";
- private static final String LINK = "LINK";
- final private HashSet<NodeLinkModel> arrowLinks;
- private final LinkController linkController;
-
- public LinkBuilder(final LinkController linkController) {
- this.linkController = linkController;
- arrowLinks = new HashSet<NodeLinkModel>();
- }
-
- protected NodeLinkModel createArrowLink(final NodeModel source, final String targetID) {
- return new ConnectorModel(source, targetID,
- linkController.getStandardConnectorColor(),
- linkController.getStandardConnectorAlpha(),
- linkController.getStandardConnectorShape(),
- linkController.getStandardConnectorWidth(),
- linkController.getStandardLabelFontFamily(),
- linkController.getStandardLabelFontSize());
- }
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (tag.equals("arrowlink")) {
- return createArrowLink((NodeModel) parent, null);
- }
- return null;
- }
-
- /**
- * Completes the links within the getMap(). They are registered in the
- * registry.
- */
- public void readingCompleted(final NodeModel topNode, final Map<String, String> newIds) {
- final Iterator<NodeLinkModel> iterator = arrowLinks.iterator();
- while (iterator.hasNext()) {
- final NodeLinkModel arrowLink = iterator.next();
- final String id = arrowLink.getTargetID();
- final String newId = newIds.get(id);
- final String targetID = newId != null ? newId : id;
- if (targetID == null) {
- new NullPointerException().printStackTrace();
- continue;
- }
- arrowLink.setTargetID(targetID);
- final NodeModel source = arrowLink.getSource();
- NodeLinks.createLinkExtension(source).addArrowlink(arrowLink);
- }
- arrowLinks.clear();
- }
-
- private void registerAttributeHandlers(final ReadManager reader) {
- reader.addAttributeHandler(NodeBuilder.XML_NODE, LINK, new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- linkController.loadLink(node, value);
- }
- });
-
- final IAttributeHandler hyperlinkHandler = new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- linkController.loadLinkFormat(node, Boolean.parseBoolean(value));
- }
- };
- reader.addAttributeHandler(NodeBuilder.XML_NODE, FORMAT_AS_HYPERLINK, hyperlinkHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, FORMAT_AS_HYPERLINK, hyperlinkHandler);
-
- reader.addAttributeHandler("arrowlink", "EDGE_LIKE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setShape(Shape.EDGE_LIKE);
- }
- });
- reader.addAttributeHandler("arrowlink", "SHAPE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setShape(Shape.valueOf(value));
- }
- });
- reader.addAttributeHandler("arrowlink", "DASH", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- final String[] split = value.split(" ");
- int[] dash = new int[split.length];
- int i = 0;
- for(String s : split){
- dash[i++] = Integer.parseInt(s);
- }
- arrowLink.setDash(dash);
- }
- });
- reader.addAttributeHandler("arrowlink", "DESTINATION", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setTargetID(value);
- arrowLinks.add(arrowLink);
- }
- });
- reader.addAttributeHandler("arrowlink", "SOURCE_LABEL", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setSourceLabel(value.toString());
- }
- });
- reader.addAttributeHandler("arrowlink", "MIDDLE_LABEL", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setMiddleLabel(value.toString());
- }
- });
- reader.addAttributeHandler("arrowlink", "TARGET_LABEL", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setTargetLabel(value.toString());
- }
- });
- reader.addAttributeHandler("arrowlink", "STARTINCLINATION", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setStartInclination(TreeXmlReader.xmlToPoint(value.toString()));
- }
- });
- reader.addAttributeHandler("arrowlink", "ENDINCLINATION", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setEndInclination(TreeXmlReader.xmlToPoint(value.toString()));
- }
- });
- reader.addAttributeHandler("arrowlink", "STARTARROW", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setStartArrow(ArrowType.valueOf(value.toUpperCase(Locale.ENGLISH)));
- }
- });
- reader.addAttributeHandler("arrowlink", "ENDARROW", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setEndArrow(ArrowType.valueOf(value.toUpperCase(Locale.ENGLISH)));
- }
- });
- reader.addAttributeHandler("arrowlink", "WIDTH", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setWidth(Integer.parseInt(value.toString()));
- }
- });
-
- reader.addAttributeHandler("arrowlink", "FONT_FAMILY", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setLabelFontFamily(value.toString());
- }
- });
- reader.addAttributeHandler("arrowlink", "FONT_SIZE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final ConnectorModel arrowLink = (ConnectorModel) userObject;
- arrowLink.setLabelFontSize(Integer.parseInt(value.toString()));
- }
- });
- }
-
- public void endElement(Object parent, String tag, Object element, XMLElement dom) {
- final ConnectorModel arrowLink = (ConnectorModel) element;
- final String color = dom.getAttribute("COLOR", null);
- final String transparency = dom.getAttribute("TRANSPARENCY", null);
- if(color != null){
- arrowLink.setColor(ColorUtils.stringToColor(color));
- if(transparency == null){
- arrowLink.setAlpha(255);
- }
- }
- else{
- arrowLink.setColor(linkController.getStandardConnectorColor());
- }
-
- if(transparency != null){
- arrowLink.setAlpha(Integer.parseInt(transparency));
- }
- else if(color == null){
- arrowLink.setAlpha(linkController.getStandardConnectorAlpha());
- }
- fixSelfLoopedConnectorShape(arrowLink);
- }
-
- private void fixSelfLoopedConnectorShape(ConnectorModel connector) {
- if (connector.isSelfLink()
- && Shape.CUBIC_CURVE.equals(connector.getShape())
- && MapVersionInterpreter.isOlderThan(connector.getSource().getMap(), FREEPLANE_VERSION_WITH_CURVED_LOOPED_CONNECTORS))
- connector.setShape(Shape.LINE);
- }
-
- /**
- */
- public void registerBy(final ReadManager reader, final WriteManager writer) {
- reader.addElementHandler("arrowlink", this);
- registerAttributeHandlers(reader);
- reader.addReadCompletionListener(this);
- writer.addExtensionAttributeWriter(NodeLinks.class, this);
- writer.addExtensionElementWriter(NodeLinks.class, this);
- }
-
- public void save(final ITreeWriter writer, final ConnectorModel model) throws IOException {
- final NodeModel target = model.getTarget();
- if (target == null) {
- return;
- }
- final XMLElement arrowLink = new XMLElement();
- arrowLink.setName("arrowlink");
- final Shape shape = model.getShape();
- arrowLink.setAttribute("SHAPE", shape.toString());
- final Color color = model.getColor();
- arrowLink.setAttribute("COLOR", ColorUtils.colorToString(color));
- final int width = model.getWidth();
- arrowLink.setAttribute("WIDTH", Integer.toString(width));
- final int alpha = model.getAlpha();
- arrowLink.setAttribute("TRANSPARENCY", Integer.toString(alpha));
- final int[]dash = model.getDash();
- if (dash != null) {
- StringBuilder sb = null;
- for(int i : dash){
- if(sb == null){
- sb = new StringBuilder(dash.length * 4);
- }
- else{
- sb.append(' ');
- }
- sb.append(i);
- }
- if(sb != null){
- arrowLink.setAttribute("DASH", sb.toString());
- }
- }
-
- final int fontSize = model.getLabelFontSize();
- arrowLink.setAttribute("FONT_SIZE", Integer.toString(fontSize));
-
- final String fontFamily = model.getLabelFontFamily();
- arrowLink.setAttribute("FONT_FAMILY", fontFamily);
-
- final String destinationLabel = target.createID();
-
- if (destinationLabel != null) {
- arrowLink.setAttribute("DESTINATION", destinationLabel);
- }
- final String sourceLabel = model.getSourceLabel();
- if (sourceLabel != null) {
- arrowLink.setAttribute("SOURCE_LABEL", sourceLabel);
- }
- final String targetLabel = model.getTargetLabel();
- if (targetLabel != null) {
- arrowLink.setAttribute("TARGET_LABEL", targetLabel);
- }
- final String middleLabel = model.getMiddleLabel();
- if (middleLabel != null) {
- arrowLink.setAttribute("MIDDLE_LABEL", middleLabel);
- }
- final Point startInclination = model.getStartInclination();
- if (startInclination != null) {
- arrowLink.setAttribute("STARTINCLINATION", TreeXmlWriter.PointToXml(startInclination));
- }
- final Point endInclination = model.getEndInclination();
- if (endInclination != null) {
- arrowLink.setAttribute("ENDINCLINATION", TreeXmlWriter.PointToXml(endInclination));
- }
- final String startArrow = model.getStartArrow().toString();
- if (startArrow != null) {
- arrowLink.setAttribute("STARTARROW", startArrow);
- }
- final String endArrow = model.getEndArrow().toString();
- if (endArrow != null) {
- arrowLink.setAttribute("ENDARROW", endArrow);
- }
- writer.addElement(model, arrowLink);
- }
-
- public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
- }
-
- public void writeAttributes(final ITreeWriter writer, final Object userObject, final IExtension extension) {
- final NodeLinks links = (NodeLinks) extension;
- final URI link = links.getHyperLink();
- if (link != null) {
- final String string = link.toString();
- if (string.startsWith("#")) {
- if (((NodeModel) userObject).getMap().getNodeForID(string.substring(1)) == null) {
- return;
- }
- }
- writer.addAttribute(LINK, string);
- }
- final Boolean formatNodeAsHyperlink = links.formatNodeAsHyperlink();
- if (formatNodeAsHyperlink != null) {
- writer.addAttribute(FORMAT_AS_HYPERLINK, formatNodeAsHyperlink.toString());
- }
- }
-
- public void writeContent(final ITreeWriter writer, final Object node, final IExtension extension)
- throws IOException {
- final NodeLinks links = (NodeLinks) extension;
- final Iterator<LinkModel> iterator = links.getLinks().iterator();
- while (iterator.hasNext()) {
- final LinkModel linkModel = iterator.next();
- if (linkModel instanceof ConnectorModel) {
- final ConnectorModel arrowLinkModel = (ConnectorModel) linkModel;
- save(writer, arrowLinkModel);
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/LinkConditionController.java b/freeplane/src/org/freeplane/features/link/LinkConditionController.java
deleted file mode 100644
index 49a6351..0000000
--- a/freeplane/src/org/freeplane/features/link/LinkConditionController.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.ui.FixedBasicComboBoxEditor;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.filter.condition.DefaultConditionRenderer;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Mar 7, 2009
- */
-public class LinkConditionController implements IElementaryConditionController {
- static final String FILTER_LINK = "filter_link";
- static final String CONNECTOR_LABEL = "connector_label";
- static final String CONNECTOR = "connector";
- private final ComboBoxModel values = new DefaultComboBoxModel();
-
- public boolean canEditValues(final Object property, final NamedObject simpleCond) {
- return !simpleCond.objectEquals(ConditionFactory.FILTER_EXIST);
- }
-
- public boolean canHandle(final Object selectedItem) {
- if (!(selectedItem instanceof NamedObject)) {
- return false;
- }
- final NamedObject namedObject = (NamedObject) selectedItem;
- return namedObject.objectEquals(FILTER_LINK) || namedObject.objectEquals(CONNECTOR_LABEL)
- || namedObject.objectEquals(CONNECTOR);
- }
-
- public boolean canSelectValues(final Object property, final NamedObject simpleCond) {
- return !simpleCond.objectEquals(ConditionFactory.FILTER_EXIST);
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCond,
- final Object value, final boolean matchCase,
- final boolean matchApproximately) {
- final NamedObject namedObject = (NamedObject) selectedItem;
- if (namedObject.objectEquals(FILTER_LINK)) {
- if (simpleCond.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
- return new HyperLinkEqualsCondition((String) value, matchCase, matchApproximately);
- }
- if (simpleCond.objectEquals(ConditionFactory.FILTER_CONTAINS)) {
- return new HyperLinkContainsCondition((String) value, matchCase, matchApproximately);
- }
- if (simpleCond.objectEquals(ConditionFactory.FILTER_EXIST)) {
- return new HyperLinkExistsCondition();
- }
- return null;
- }
- if (namedObject.objectEquals(CONNECTOR_LABEL)) {
- if (simpleCond.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
- return new ConnectorLabelEqualsCondition((String) value, matchCase, matchApproximately);
- }
- if (simpleCond.objectEquals(ConditionFactory.FILTER_CONTAINS)) {
- return new ConnectorLabelContainsCondition((String) value, matchCase, matchApproximately);
- }
- return null;
- }
- if (namedObject.objectEquals(CONNECTOR)) {
- if (simpleCond.objectEquals(ConditionFactory.FILTER_EXIST)) {
- return new ConnectorExistsCondition();
- }
- }
- return null;
- }
-
- public ComboBoxModel getConditionsForProperty(final Object property) {
- final NamedObject no = (NamedObject) property;
- final Object[] linkConditionNames;
- if (no.getObject().equals(FILTER_LINK)) {
- linkConditionNames = new NamedObject[] {
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_EXIST) };
- }
- else if (no.getObject().equals(CONNECTOR_LABEL)) {
- linkConditionNames = new NamedObject[] {
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS) };
- }
- else {
- linkConditionNames = new NamedObject[] { TextUtils.createTranslatedString(ConditionFactory.FILTER_EXIST) };
- }
- return new DefaultComboBoxModel(linkConditionNames);
- }
-
- public ListModel getFilteredProperties() {
- final DefaultListModel list = new DefaultListModel();
- list.addElement(TextUtils.createTranslatedString(FILTER_LINK));
- list.addElement(TextUtils.createTranslatedString(CONNECTOR_LABEL));
- list.addElement(TextUtils.createTranslatedString(CONNECTOR));
- return list;
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- return new FixedBasicComboBoxEditor();
- }
-
- public ComboBoxModel getValuesForProperty(final Object property, NamedObject simpleCond) {
- return values;
- }
-
- public boolean isCaseDependent(final Object property, final NamedObject simpleCond) {
- return ((NamedObject) property).objectEquals(CONNECTOR_LABEL) ||
- ((NamedObject) property).objectEquals(FILTER_LINK);
- }
-
- public boolean supportsApproximateMatching(final Object property, final NamedObject simpleCond) {
- return ((NamedObject) property).objectEquals(CONNECTOR_LABEL) ||
- ((NamedObject) property).objectEquals(FILTER_LINK);
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- if (element.getName().equalsIgnoreCase(HyperLinkEqualsCondition.NAME)) {
- final String target = element.getAttribute(HyperLinkEqualsCondition.TEXT, null);
- final boolean matchCase = Boolean.toString(true).equals(
- element.getAttribute(HyperLinkEqualsCondition.MATCH_CASE, null));
- final boolean matchApproximately = Boolean.toString(true).equals(
- element.getAttribute(HyperLinkEqualsCondition.MATCH_APPROXIMATELY, null));
- return new HyperLinkEqualsCondition(target, matchCase, matchApproximately);
- }
- if (element.getName().equalsIgnoreCase(HyperLinkContainsCondition.NAME)) {
- final String target = element.getAttribute(HyperLinkContainsCondition.TEXT, null);
- final boolean matchCase = Boolean.toString(true).equals(
- element.getAttribute(HyperLinkContainsCondition.MATCH_CASE, null));
- final boolean matchApproximately = Boolean.toString(true).equals(
- element.getAttribute(HyperLinkContainsCondition.MATCH_APPROXIMATELY, null));
- return new HyperLinkContainsCondition(target, matchCase, matchApproximately);
- }
- if (element.getName().equalsIgnoreCase(HyperLinkExistsCondition.NAME)) {
- return new HyperLinkExistsCondition();
- }
- if (element.getName().equalsIgnoreCase(ConnectorLabelEqualsCondition.NAME)) {
- final String text = element.getAttribute(ConnectorLabelEqualsCondition.TEXT, null);
- final boolean matchCase = Boolean.toString(true).equals(
- element.getAttribute(ConnectorLabelEqualsCondition.MATCH_CASE, null));
- final boolean matchApproximately = Boolean.toString(true).equals(
- element.getAttribute(ConnectorLabelEqualsCondition.MATCH_APPROXIMATELY, null));
- return new ConnectorLabelEqualsCondition(text, matchCase, matchApproximately);
- }
- if (element.getName().equalsIgnoreCase(ConnectorLabelContainsCondition.NAME)) {
- final String text = element.getAttribute(ConnectorLabelContainsCondition.TEXT, null);
- final boolean matchCase = Boolean.toString(true).equals(
- element.getAttribute(ConnectorLabelEqualsCondition.MATCH_CASE, null));
- final boolean matchApproximately = Boolean.toString(true).equals(
- element.getAttribute(ConnectorLabelEqualsCondition.MATCH_APPROXIMATELY, null));
- return new ConnectorLabelContainsCondition(text, matchCase, matchApproximately);
- }
- if (element.getName().equalsIgnoreCase(ConnectorExistsCondition.NAME)) {
- return new ConnectorExistsCondition();
- }
- return null;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- if (((NamedObject)selectedProperty).objectEquals(CONNECTOR) ||
- (((NamedObject)selectedProperty).objectEquals(FILTER_LINK) &&
- selectedCondition.objectEquals(ConditionFactory.FILTER_EXIST)))
- {
- // don't return null as this would make FilterConditionEditor fall back to filterController.getConditionRenderer()
- // (and that would put in a default string like "No Filtering (remove)"!)
- return new DefaultConditionRenderer("", true);
- }
- else
- {
- return null;
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/LinkController.java b/freeplane/src/org/freeplane/features/link/LinkController.java
deleted file mode 100644
index 48d98b5..0000000
--- a/freeplane/src/org/freeplane/features/link/LinkController.java
+++ /dev/null
@@ -1,845 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseEvent;
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.ActionMap;
-import javax.swing.Box;
-import javax.swing.Icon;
-import javax.swing.InputMap;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JMenuItem;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.MenuUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.icon.IconStore;
-import org.freeplane.features.icon.UIIcon;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.link.ConnectorModel.Shape;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.SelectionController;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.url.UrlManager;
-
-/**
- * @author Dimitry Polivaev
- */
-public class LinkController extends SelectionController implements IExtension {
- public static final String MENUITEM_SCHEME = "menuitem";
- public static LinkController getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- return getController(modeController);
- }
-
- public static LinkController getController(ModeController modeController) {
- return modeController.getExtension(LinkController.class);
- }
-
- public static void install() {
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(3, new LinkConditionController());
- }
-
- public static void install( final LinkController linkController) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addExtension(LinkController.class, linkController);
- linkController.init();
- }
-
- public static final String LINK_ICON = ResourceController.getResourceController().getProperty("link_icon");
- private static final String MAIL_ICON = ResourceController.getResourceController().getProperty("mail_icon");
- public static final String LINK_LOCAL_ICON = ResourceController.getResourceController().getProperty("link_local_icon");
-
-// final private ModeController modeController;
-
- public LinkController() {
-// this.modeController = modeController;
- }
-
- protected void init() {
- createActions();
- final ModeController modeController = Controller.getCurrentModeController();
- final MapController mapController = modeController.getMapController();
- final ReadManager readManager = mapController.getReadManager();
- final WriteManager writeManager = mapController.getWriteManager();
- new LinkBuilder(this).registerBy(readManager, writeManager);
- final LinkTransformer textTransformer = new LinkTransformer(modeController, 10);
- TextController.getController(modeController).addTextTransformer(textTransformer);
- textTransformer.registerListeners(modeController);
-
- final INodeSelectionListener listener = new INodeSelectionListener() {
- public void onDeselect(final NodeModel node) {
- }
-
- public void onSelect(final NodeModel node) {
- final URI link = NodeLinks.getValidLink(node);
- final String linkString = (link != null ? link.toString() : null);
- if (linkString != null) {
- Controller.getCurrentController().getViewController().out(linkString);
- }
- }
- };
- Controller.getCurrentModeController().getMapController().addNodeSelectionListener(listener);
- }
-
- private void addLinks(final JComponent arrowLinkPopup, final NodeModel source) {
- final IMapSelection selection = Controller.getCurrentModeController().getController().getSelection();
- if (!selection.isSelected(source)) {
- GotoLinkNodeAction gotoLinkNodeAction = new GotoLinkNodeAction(this, source);
- addAction(arrowLinkPopup, gotoLinkNodeAction);
- }
- }
-
- protected void addPopupComponent(final JComponent arrowLinkPopup, final String label, final JComponent component) {
- final JComponent componentBox;
- if(label != null){
- componentBox = Box.createHorizontalBox();
- componentBox.add(Box.createHorizontalStrut(10));
- final JLabel jlabel = new JLabel(label);
- componentBox.add(jlabel);
- componentBox.add(Box.createHorizontalStrut(10));
- componentBox.add(component);
- }
- else {
- componentBox = component;
- }
- componentBox.setAlignmentX(JComponent.LEFT_ALIGNMENT);
- componentBox.setMinimumSize(new Dimension());
- componentBox.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
- arrowLinkPopup.add(componentBox);
- }
-
- protected void addClosingAction(final JComponent arrowLinkPopup, Action action) {
- JButton comp = addAction(arrowLinkPopup, action);
- comp.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- SwingUtilities.getWindowAncestor(arrowLinkPopup).setVisible(false);
- }
- });
- }
-
- protected JButton addAction(final JComponent arrowLinkPopup, Action action) {
- JButton comp = new JButton(action);
- comp.setHorizontalAlignment(JButton.LEFT);
- addPopupComponent (arrowLinkPopup, null, comp);
- return comp;
- }
-
- /**
- *
- */
- private void createActions() {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addAction(new FollowLinkAction());
- modeController.addMenuContributor(new LinkMenuContributor("menu_navigate", "menu_goto_links"));
- modeController.addMenuContributor(new LinkMenuContributor("popup_navigate", "popup_goto_links"));
- }
-
- private class LinkMenuContributor implements IMenuContributor {
- final String key;
- final String menuKey;
- public LinkMenuContributor(String menuKey, String key) {
- super();
- this.menuKey = menuKey;
- this.key = key;
- }
- public void updateMenus(final ModeController modeController, final MenuBuilder builder) {
- if(builder.contains(key)) {
- builder.addPopupMenuListener(menuKey, new PopupMenuListener(
- ) {
- public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
- final IMapSelection selection = modeController.getController().getSelection();
- if(selection == null)
- return;
- final NodeModel node = selection.getSelected();
- Set<LinkModel> links = new LinkedHashSet<LinkModel>( NodeLinks.getLinks(node));
- links.addAll(getLinksTo(node));
- if(links.isEmpty())
- return;
- builder.addSeparator(key, MenuBuilder.AS_CHILD);
- for(LinkModel link : links){
- final String targetID = link.getTargetID();
- final NodeModel target;
- if(node.getID().equals(targetID)){
- if(link instanceof ConnectorModel){
- ConnectorModel cm = (ConnectorModel) link;
- target = cm.getSource();
- if(node.equals(target))
- continue;
- }
- else
- continue;
- }
- else
- target = node.getMap().getNodeForID(targetID);
- final GotoLinkNodeAction gotoLinkNodeAction = new GotoLinkNodeAction(LinkController.this, target);
- if(!(link instanceof ConnectorModel)){
- gotoLinkNodeAction.putValue(Action.SMALL_ICON, ICON_STORE.getUIIcon(LINK_LOCAL_ICON).getIcon());
- }
- builder.addAction(key, gotoLinkNodeAction, MenuBuilder.AS_CHILD);
- }
- }
-
- public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
- builder.removeChildElements(key);
- }
-
- public void popupMenuCanceled(PopupMenuEvent e) {
- }
- });
- }
- }
- }
- @SuppressWarnings("serial")
- public static final class ClosePopupAction extends AbstractAction {
- final private String reason;
-
- public ClosePopupAction(String reason) {
- this.reason = reason;
- }
-
- public void actionPerformed(ActionEvent e) {
- JComponent src = (JComponent) e.getSource();
- src.putClientProperty(reason, Boolean.TRUE);
- SwingUtilities.getWindowAncestor(src).setVisible(false);
- }
- }
-
- protected static final String CANCEL = "CANCEL";
- protected static final String CLOSE = "CLOSE";
- protected void createArrowLinkPopup(final ConnectorModel link, final JComponent arrowLinkPopup) {
-
- final InputMap inputMap = arrowLinkPopup.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
- final ActionMap actionMap = arrowLinkPopup.getActionMap();
- inputMap.put(KeyStroke.getKeyStroke("ESCAPE"), CANCEL);
- actionMap.put(CANCEL, new ClosePopupAction(CANCEL));
- final boolean enterConfirms = ResourceController.getResourceController().getBooleanProperty("el__enter_confirms_by_default");
- final KeyStroke close = KeyStroke.getKeyStroke(enterConfirms ? "ENTER" : "alt ENTER");
- inputMap.put(close, CLOSE);
- actionMap.put(CLOSE, new ClosePopupAction(CLOSE));
-
- final NodeModel source = link.getSource();
- final NodeModel target = link.getTarget();
- addLinks(arrowLinkPopup, source);
- addLinks(arrowLinkPopup, target);
- }
-
- public Color getColor(final ConnectorModel model) {
- return model.getColor();
- }
-
- public int[] getDash(final ConnectorModel model) {
- return model.getDash();
- }
-
- public String getLinkShortText(final NodeModel node) {
- final URI uri = NodeLinks.getLink(node);
- if (uri == null) {
- return null;
- }
- final String adaptedText = uri.toString();
- if (adaptedText.startsWith("#")) {
- ModeController modeController = Controller.getCurrentModeController();
- final NodeModel dest = modeController.getMapController().getNodeFromID(adaptedText.substring(1));
- if (dest != null) {
- return TextController.getController().getShortText(dest);
- }
- return TextUtils.getText("link_not_available_any_more");
- }
- return adaptedText;
- }
-
- public Collection<LinkModel> getLinksTo(final NodeModel target) {
- if (target.hasID() == false) {
- return Collections.emptySet();
- }
- final MapLinks links = target.getMap().getExtension(MapLinks.class);
- if (links == null) {
- return Collections.emptySet();
- }
- final Set<LinkModel> set = links.get(target.createID());
- if (set == null) {
- return Collections.emptySet();
- }
- return set;
- }
-
- /**
- * Link implementation: If this is a link, we want to make a popup with at
- * least removelink available.
- */
- public Component getPopupForModel(final java.lang.Object obj) {
- if (obj instanceof ConnectorModel) {
- final ConnectorModel link = (ConnectorModel) obj;
- final Box arrowLinkPopup = Box.createVerticalBox();
- arrowLinkPopup.setName(TextUtils.getText("connector"));
- createArrowLinkPopup(link, arrowLinkPopup);
- return arrowLinkPopup;
- }
- return null;
- }
-
- public static final String RESOURCES_LINK_COLOR = "standardlinkcolor";
- private static final String RESOURCES_CONNECTOR_SHAPE = "connector_shape";
- private static final String RESOURCES_CONNECTOR_COLOR_ALPHA = "connector_alpha";
- private static final String RESOURCES_CONNECTOR_WIDTH = "connector_width";
-
- public int getWidth(final ConnectorModel model) {
- return model.getWidth();
- }
-
- void loadLink(final NodeModel node, String link) {
- NodeLinks links = NodeLinks.getLinkExtension(node);
- if (links == null) {
- links = NodeLinks.createLinkExtension(node);
- }
- if (link != null && link.startsWith("#")) {
- links.setLocalHyperlink(node, link.substring(1));
- }
- try {
- if (link.startsWith("\"") && link.endsWith("\"")) {
- link = link.substring(1, link.length() - 1);
- }
- final URI hyperlink = LinkController.createURI(link);
- links.setHyperLink(hyperlink);
- }
- catch (final URISyntaxException e1) {
- LogUtils.warn(e1);
- UITools.errorMessage(TextUtils.format("link_error", link));
- return;
- }
- }
-
- void loadLinkFormat(NodeModel node, boolean enabled) {
- NodeLinks.createLinkExtension(node).setFormatNodeAsHyperlink(enabled);
- }
-
-
- public void loadURL(final NodeModel node, final MouseEvent e) {
- loadURL(node, new ActionEvent(e.getSource(), e.getID(), null));
- }
-
- public void loadURL(final MouseEvent e) {
- ModeController modeController = Controller.getCurrentModeController();
- loadURL(modeController.getMapController().getSelectedNode(), e);
- }
-
- @SuppressWarnings("deprecation")
- public void loadURI(URI uri) {
- UrlManager.getController().loadURL(uri);
- }
-
- protected void loadURL(final NodeModel selectedNode, final ActionEvent e) {
- loadURL(selectedNode, e, NodeLinks.getValidLink(selectedNode));
- }
-
- public void loadURL(final NodeModel selectedNode, final ActionEvent e, final URI link) {
- if (link != null) {
- onDeselect(selectedNode);
- ModeController modeController = Controller.getCurrentModeController();
- if (LinkController.isMenuItemLink(link)) {
- if (e == null) {
- throw new IllegalArgumentException("ActionEvent is needed for menu item links");
- }
- final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder();
- final DefaultMutableTreeNode treeNode = menuBuilder.get(LinkController.parseMenuItemLink(link));
- if (treeNode == null || !treeNode.isLeaf() || !(treeNode.getUserObject() instanceof JMenuItem)) {
- LogUtils.warn("node " + link + " should have been an executable action");
- return;
- }
- final JMenuItem menuItem = (JMenuItem) treeNode.getUserObject();
- final Action action = menuItem.getAction();
-
- if (action != null) {
- action.actionPerformed(e);
- } else {
- LogUtils.warn("Trying to call a menu hyperlink action that doesn't exist.");
- }
- }
- else {
- loadURI(link);
- }
- onSelect(modeController.getController().getSelection().getSelected());
- }
- }
-
- public static int getLinkType() {
- return getController().linkType();
- }
-
- public static final int LINK_ABSOLUTE = 0;
- public static final int LINK_RELATIVE_TO_MINDMAP = 1;
-
- public int linkType() {
- String linkTypeProperty = ResourceController.getResourceController().getProperty("links");
- if ("relative".equals(linkTypeProperty)) {
- return LINK_RELATIVE_TO_MINDMAP;
- }
- return LINK_ABSOLUTE;
- }
-
- public static URI toLinkTypeDependantURI(final File map, final File input) {
- int type = getLinkType();
- if (type == LINK_ABSOLUTE) {
- return input.getAbsoluteFile().toURI();
- }
- return toRelativeURI(map, input, type);
- }
-
- public static URI toLinkTypeDependantURI(final File map, final File input, final int linkType) {
- return toRelativeURI(map, input, linkType);
- }
-
- public static URI toRelativeURI(final File map, final File input, final int linkType) {
- return getController().createRelativeURI(map, input, linkType);
- }
-
- public static URI normalizeURI(URI uri){
- final String UNC_PREFIX = "//";
- URI normalizedUri = uri.normalize();
- //Fix UNC paths that are incorrectly normalized by URI#resolve (see Java bug 4723726)
- String normalizedPath = normalizedUri.getPath();
- if ("file".equalsIgnoreCase(uri.getScheme()) && uri.getPath() != null && uri.getPath().startsWith(UNC_PREFIX) && (normalizedPath == null || !normalizedPath.startsWith(UNC_PREFIX))){
- try {
- normalizedUri = new URI(normalizedUri.getScheme(), ensureUNCPath(normalizedUri.getSchemeSpecificPart()), normalizedUri.getFragment());
- } catch (URISyntaxException e) {
- LogUtils.warn(e);
- }
- }
- return normalizedUri;
- }
-
- private static String ensureUNCPath(String path) {
- int len = path.length();
- StringBuffer result = new StringBuffer(len);
- for (int i = 0; i < 4; i++) {
- // if we have hit the first non-slash character, add another leading slash
- if (i >= len || result.length() > 0 || path.charAt(i) != '/')
- result.append('/');
- }
- result.append(path);
- return result.toString();
- }
-
- public URI createRelativeURI(final File map, final File input, final int linkType) {
- if (linkType == LINK_ABSOLUTE) {
- return null;
- }
- try {
- URI mapUri = null;
- if (map != null) {
- mapUri = map.getAbsoluteFile().toURI();
- }
-
- final URI fileUri = input.getAbsoluteFile().toURI();
- boolean isUNCinput = fileUri.getPath().startsWith("//");
- boolean isUNCmap = mapUri.getPath().startsWith("//");
- if((isUNCinput != isUNCmap)) {
- return fileUri;
- }
- final String filePathAsString = fileUri.getRawPath();
- final String mapPathAsString = mapUri.getRawPath();
- int differencePos;
- final int lastIndexOfSeparatorInMapPath = mapPathAsString.lastIndexOf("/");
- final int lastIndexOfSeparatorInFilePath = filePathAsString.lastIndexOf("/");
- int lastCommonSeparatorPos = -1;
- for (differencePos = 0; differencePos <= lastIndexOfSeparatorInMapPath
- && differencePos <= lastIndexOfSeparatorInFilePath
- && filePathAsString.charAt(differencePos) == mapPathAsString.charAt(differencePos); differencePos++) {
- if (filePathAsString.charAt(differencePos) == '/') {
- lastCommonSeparatorPos = differencePos;
- }
- }
- if (lastCommonSeparatorPos < 0) {
- return fileUri;
- }
- final StringBuilder relativePath = new StringBuilder();
- for (int i = lastCommonSeparatorPos + 1; i <= lastIndexOfSeparatorInMapPath; i++) {
- if (mapPathAsString.charAt(i) == '/') {
- relativePath.append("../");
- }
- }
- relativePath.append(filePathAsString.substring(lastCommonSeparatorPos + 1));
-
- return new URI(relativePath.toString());
- }
- catch (final URISyntaxException e) {
- e.printStackTrace();
- }
- return null;
- }
-
-// public static URI toRelativeURI(final File map, final File input) {
-// try {
-// final URI fileUri = input.getAbsoluteFile().toURI();
-// if (map == null) {
-// return fileUri;
-// }
-// final URI mapUri = map.getAbsoluteFile().toURI();
-// final String filePathAsString = fileUri.getRawPath();
-// final String mapPathAsString = mapUri.getRawPath();
-// int differencePos;
-// final int lastIndexOfSeparatorInMapPath = mapPathAsString.lastIndexOf("/");
-// final int lastIndexOfSeparatorInFilePath = filePathAsString.lastIndexOf("/");
-// int lastCommonSeparatorPos = 0;
-// for (differencePos = 1; differencePos <= lastIndexOfSeparatorInMapPath
-// && differencePos <= lastIndexOfSeparatorInFilePath
-// && filePathAsString.charAt(differencePos) == mapPathAsString.charAt(differencePos); differencePos++) {
-// if (filePathAsString.charAt(differencePos) == '/') {
-// lastCommonSeparatorPos = differencePos;
-// }
-// }
-// if (lastCommonSeparatorPos == 0) {
-// return fileUri;
-// }
-// final StringBuilder relativePath = new StringBuilder();
-// for (int i = lastCommonSeparatorPos + 1; i <= lastIndexOfSeparatorInMapPath; i++) {
-// if (mapPathAsString.charAt(i) == '/') {
-// relativePath.append("../");
-// }
-// }
-// relativePath.append(filePathAsString.substring(lastCommonSeparatorPos + 1));
-// return new URI(relativePath.toString());
-// }
-// catch (final URISyntaxException e) {
-// e.printStackTrace();
-// }
-// return null;
-// }
-
- // patterns only need to be compiled once
- static Pattern patSMB = Pattern.compile( // \\host\path[#fragement]
- "(?:\\\\\\\\([^\\\\]+)\\\\)(.*?)(?:#([^#]*))?");
- static Pattern patFile = Pattern.compile( // [drive:]path[#fragment]
- "((?:\\p{Alpha}:)?([/\\\\])?(?:[^:#?]*))?(?:#([^#]*))?");
- static Pattern patURI = Pattern.compile( // [scheme:]scheme-specific-part[#fragment]
- "(?:(\\p{Alpha}[\\p{Alnum}+.-]+):)?(.*?)(?:#([^#]*))?");
-
- /* Function that tries to transform a not necessarily well-formed
- * string into a valid URI. We use the fact that the single-argument
- * URI constructor doesn't escape invalid characters (especially
- * spaces), whereas the 3-argument constructors does do escape
- * them (e.g. space into %20).
- */
- public static URI createURI(final String inputValue) throws URISyntaxException {
- try { // first, we try if the string can be interpreted as URI
- return new URI(inputValue);
- }
- catch (final URISyntaxException e) {
- // [scheme:]scheme-specific-part[#fragment]
- // we check first if the string matches an SMB
- // of the form \\host\path[#fragment]
- {
- final Matcher mat = patSMB.matcher(inputValue);
- if (mat.matches()) {
- final String scheme = "smb";
- final String ssp = "//" + mat.group(1) + "/" + mat.group(2).replace('\\', '/');
- final String fragment = mat.group(3);
- return new URI(scheme, ssp, fragment);
- }
- }
- {
- final Matcher mat = patFile.matcher(inputValue);
- if (mat.matches()) {
- String ssp = mat.group(1);
- if (File.separatorChar != '/') {
- ssp = ssp.replace(File.separatorChar, '/');
- }
- final String fragment = mat.group(3);
- if (mat.group(2) == null) {
- return new URI(null, null, ssp, fragment);
- }
- final String scheme = "file";
- if (ssp.startsWith("//")) {
- ssp = "//" + ssp;
- }
- else if (!ssp.startsWith("/")) {
- ssp = "/" + ssp;
- }
- return new URI(scheme, null, ssp, fragment);
- }
- }
- // if this doesn't work out, we try to
- // recognize an URI of the form
- // [scheme:]scheme-specific-part[#fragment]
- {
- final Matcher mat = patURI.matcher(inputValue);
- if (mat.matches()) {
- final String scheme = mat.group(1);
- final String ssp = mat.group(2).replace('\\', '/');
- final String fragment = mat.group(3);
- return new URI(scheme, ssp, fragment);
- }
- }
- throw new URISyntaxException(inputValue, "This doesn't look like a valid link (URI, file, SMB or URL).");
- }
- }
-
- private static final Pattern urlPattern = Pattern.compile("file://[^\\s\"'<>]+|(:?https?|ftp)://[^\\s\"|<>{}]+");
- private static final Pattern mailPattern = Pattern.compile("([!+\\-/=~.\\w#]+@[\\w.\\-+?&=%]+)");
- private static final HashMap<String, Icon> menuItemCache = new HashMap<String, Icon>();
-
- static public String findLink(final String text) {
- final Matcher urlMatcher = urlPattern.matcher(text);
- if (urlMatcher.find()) {
- String link = urlMatcher.group();
- try {
- new URL(link).toURI();
- return link;
- }
- catch (final MalformedURLException e) {
- return null;
- }
- catch (final URISyntaxException e) {
- return null;
- }
- }
- final Matcher mailMatcher = mailPattern.matcher(text);
- if (mailMatcher.find()) {
- final String link = "mailto:" + mailMatcher.group();
- return link;
- }
- return null;
- }
-
- /**
- * the syntax of menu item URIs is
- * <pre>
- * "menuitem" + ":" + "_" + <menuItemKey>
- * </pre>
- * Compared to <code>mailto:abc at somewhere.com</code> a "_" is added to prevent the rest being parsed
- * as a regular path. (Menu item keys start with "/").
- */
- public static URI createMenuItemLink(final String menuItemKey) {
- try {
- return new URI(MENUITEM_SCHEME, "_" + menuItemKey, null);
- }
- catch (URISyntaxException e) {
- throw new RuntimeException("huh? URI should have escaped illegal characters", e);
- }
- }
-
- public static boolean isMenuItemLink(final URI uri) {
- final String scheme = uri.getScheme();
- return scheme != null && scheme.equals(MENUITEM_SCHEME);
- }
-
- // this will fail badly for non-menuitem uris!
- public static String parseMenuItemLink(final URI uri) {
- return uri.getSchemeSpecificPart().substring(1);
- }
-
- public int getStandardConnectorWidth() {
- final String standardWidth = ResourceController.getResourceController().getProperty(RESOURCES_CONNECTOR_WIDTH);
- final int width = Integer.valueOf(standardWidth);
- return width;
- }
-
- public void setStandardConnectorWidth(final int width) {
- final String value = Integer.toString(width);
- ResourceController.getResourceController().setProperty(RESOURCES_CONNECTOR_WIDTH, value);
- }
-
- public Color getStandardConnectorColor() {
- final String standardColor = ResourceController.getResourceController().getProperty(RESOURCES_LINK_COLOR);
- final Color color = ColorUtils.stringToColor(standardColor);
- return color;
- }
-
- public void setStandardConnectorColor(final Color color) {
- String value = ColorUtils.colorToString(color);
- ResourceController.getResourceController().setProperty(RESOURCES_LINK_COLOR, value);
- }
-
- public Shape getStandardConnectorShape() {
- final String standardShape = ResourceController.getResourceController().getProperty(RESOURCES_CONNECTOR_SHAPE);
- final Shape shape = Shape.valueOf(standardShape);
- return shape;
- }
-
- public void setStandardConnectorShape(final Shape shape) {
- String value = shape.toString();
- ResourceController.getResourceController().setProperty(RESOURCES_CONNECTOR_SHAPE, value);
- }
-
-
- public int getStandardConnectorAlpha() {
- final String standardAlpha = ResourceController.getResourceController().getProperty(RESOURCES_CONNECTOR_COLOR_ALPHA);
- final int alpha = Integer.valueOf(standardAlpha);
- return alpha;
- }
-
- public void setStandardAlpha(final int alpha) {
- final String value = Integer.toString(alpha);
- ResourceController.getResourceController().setProperty(RESOURCES_CONNECTOR_COLOR_ALPHA, value);
- }
-
- public int getAlpha(ConnectorModel connectorModel) {
- return connectorModel.getAlpha();
- }
-
- public int getStandardLabelFontSize() {
- return ResourceController.getResourceController().getIntProperty("label_font_size", 12);
- }
-
- public String getStandardLabelFontFamily() {
- return ResourceController.getResourceController().getProperty("label_font_family");
- }
-
- private static final String MENUITEM_ICON = "icons/button.png";
- private static final String EXECUTABLE_ICON = ResourceController.getResourceController().getProperty("executable_icon");
- private static final IconStore ICON_STORE = IconStoreFactory.create();
- public static enum LinkType{
- LOCAL(LINK_LOCAL_ICON), MAIL(MAIL_ICON), EXECUTABLE(EXECUTABLE_ICON), MENU(MENUITEM_ICON), DEFAULT(LINK_ICON);
- LinkType(String iconPath){
- final UIIcon uiIcon = ICON_STORE.getUIIcon(iconPath);
- if(uiIcon == null)
- this.icon = null;
- else
- this.icon = uiIcon.getIcon();
- }
- final public Icon icon;
- }
-
- public static Icon getLinkIcon(final URI link, final NodeModel model) {
- final LinkType linkType = getLinkType(link, model);
- if(linkType == null)
- return null;
- if(linkType.equals(LinkType.MENU)){
- final String menuItemKey = parseMenuItemLink(link);
- synchronized (menuItemCache) {
- Icon icon = menuItemCache.get(menuItemKey);
- if (icon == null) {
- final Icon menuItemIcon = MenuUtils.getMenuItemIcon(menuItemKey);
- icon = (menuItemIcon == null) ? ICON_STORE.getUIIcon(MENUITEM_ICON).getIcon() : menuItemIcon;
- menuItemCache.put(menuItemKey, icon);
- }
- return icon;
- }
- }
- return linkType.icon;
-
- }
-
- public static LinkType getLinkType(final URI link, final NodeModel model) {
- if (link == null)
- return null;
- final String linkText = link.toString();
- if (linkText.startsWith("#")) {
- final String id = linkText.substring(1);
- if (model == null || model.getMap().getNodeForID(id) == null) {
- return null;
- }
- else{
- return LinkType.LOCAL;
- }
- }
- else if (linkText.startsWith("mailto:")) {
- return LinkType.MAIL;
- }
- else if (isMenuItemLink(link)) {
- return LinkType.MENU;
- }
- else if (Compat.isWindowsExecutable(link)) {
- return LinkType.EXECUTABLE;
- }
- else{
- return LinkType.DEFAULT;
- }
- }
-
- public boolean formatNodeAsHyperlink(final NodeModel node){
- return formatNodeAsHyperlink(Controller.getCurrentModeController(), node);
- }
-
- public boolean formatNodeAsHyperlink(final ModeController modeController, final NodeModel node){
- final Boolean ownFlag = ownFormatNodeAsHyperlink(node);
- if(ownFlag != null)
- return ownFlag;
- Collection<IStyle> collection = LogicalStyleController.getController(modeController).getStyles(node);
- final MapStyleModel mapStyles = MapStyleModel.getExtension(node.getMap());
- for(IStyle styleKey : collection){
- final NodeModel styleNode = mapStyles.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final Boolean styleFlag = ownFormatNodeAsHyperlink(styleNode);
- if(styleFlag != null)
- return styleFlag;
-
- }
- return false;
- }
-
- private Boolean ownFormatNodeAsHyperlink(final NodeModel node){
- final NodeLinks linkModel = NodeLinks.getModel(node);
- if(linkModel == null){
- return null;
- }
- final Boolean formatNodeAsHyperlink = linkModel.formatNodeAsHyperlink();
- return formatNodeAsHyperlink;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/link/LinkModel.java b/freeplane/src/org/freeplane/features/link/LinkModel.java
deleted file mode 100644
index 7724dcd..0000000
--- a/freeplane/src/org/freeplane/features/link/LinkModel.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-/**
- * @author Dimitry Polivaev
- */
-public class LinkModel {
- private String targetID;
-
- public LinkModel(final String targetID) {
- this.targetID = targetID;
- }
-
- /**
- * @return
- */
- public String getTargetID() {
- return targetID;
- }
-
- void setTargetID(final String targetID) {
- this.targetID = targetID;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/LinkTransformer.java b/freeplane/src/org/freeplane/features/link/LinkTransformer.java
deleted file mode 100644
index 7f76054..0000000
--- a/freeplane/src/org/freeplane/features/link/LinkTransformer.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.net.URI;
-
-import javax.swing.Icon;
-
-import org.freeplane.core.ui.components.ObjectAndIcon;
-import org.freeplane.features.format.PatternFormat;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.text.AbstractContentTransformer;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.ui.FrameController;
-
-/**
- * @author Dimitry Polivaev
- * Mar 3, 2011
- */
-public class LinkTransformer extends AbstractContentTransformer {
- private ModeController modeController;
-
- public LinkTransformer(ModeController modeController, int priority) {
- super(priority);
- this.modeController = modeController;
- }
-
- public void registerListeners(ModeController modeController) {
- final NodeUpdateChangeListener listener = new NodeUpdateChangeListener();
- modeController.getMapController().addNodeChangeListener(listener);
- modeController.getMapController().addMapChangeListener(listener);
- }
-
- public Object transformContent(TextController textController, Object content, NodeModel node, Object transformedExtension) {
- if(PatternFormat.IDENTITY_PATTERN.equals(textController.getNodeFormat(node)))
- return content;
- final MapModel map = node.getMap();
- return transformContent(content, map);
- }
-
- public Object transformContent(Object content, MapModel map) {
- if(! (content instanceof URI))
- return content;
- final String string = content.toString();
- if(! string.startsWith("#"))
- return content;
- final String nodeID=string.substring(1);
- final NodeModel target = map.getNodeForID(nodeID);
- if(target != null){
- final String shortText = TextController.getController(modeController).getShortText(target);
- final Icon icon = FrameController.localLinkIcon;
- return new ObjectAndIcon(shortText, icon);
- }
- else
- return content;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/MapLinks.java b/freeplane/src/org/freeplane/features/link/MapLinks.java
deleted file mode 100644
index b173f67..0000000
--- a/freeplane/src/org/freeplane/features/link/MapLinks.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.map.MapModel;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MapLinks implements IExtension {
- final private HashMap<String, Set<LinkModel>> links = new HashMap<String, Set<LinkModel>>();
-
- public boolean add(final LinkModel link) {
- final String targetID = link.getTargetID();
- Set<LinkModel> set = links.get(targetID);
- if (set == null) {
- set = new HashSet<LinkModel>();
- set.add(link);
- links.put(targetID, set);
- return true;
- }
- if (set.contains(link)) {
- return false;
- }
- set.add(link);
- return true;
- }
-
- public boolean containsTarget(final String targetID) {
- return links.containsKey(targetID);
- }
-
- public Set<LinkModel> get(final String targetID) {
- if (targetID == null) {
- return null;
- }
- final Set<LinkModel> set = links.get(targetID);
- return set == null ? null : Collections.unmodifiableSet(set);
- }
-
- public boolean remove(final LinkModel link) {
- final String targetID = link.getTargetID();
- final Set<LinkModel> set = links.get(targetID);
- if (set == null) {
- return false;
- }
- if (set.remove(link)) {
- if (set.isEmpty()) {
- links.remove(targetID);
- }
- return true;
- }
- return false;
- }
-
- public void set(final String targetID, final Set<LinkModel> set) {
- links.put(targetID, set);
- }
-
- public static MapLinks getLinks(final MapModel map) {
- return (MapLinks) map.getExtension(MapLinks.class);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/NodeLinkModel.java b/freeplane/src/org/freeplane/features/link/NodeLinkModel.java
deleted file mode 100644
index 7abe6ff..0000000
--- a/freeplane/src/org/freeplane/features/link/NodeLinkModel.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- * 08.08.2009
- */
-public class NodeLinkModel extends LinkModel {
- final private NodeModel source;
-
- public NodeLinkModel(final NodeModel source, final String targetID) {
- super(targetID);
- this.source = source;
- }
-
- public NodeModel getSource() {
- return source;
- }
-
- public NodeModel getTarget() {
- return getSource().getMap().getNodeForID(getTargetID());
- }
-
- public boolean isSelfLink() {
- return getSource().createID().equals(getTargetID());
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/link/NodeLinks.java b/freeplane/src/org/freeplane/features/link/NodeLinks.java
deleted file mode 100644
index f97adc6..0000000
--- a/freeplane/src/org/freeplane/features/link/NodeLinks.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link;
-
-import java.net.URI;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedList;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- */
-public class NodeLinks implements IExtension {
- public static final Object CONNECTOR = "connector";
-
- /**
- * @param source2
- * @return
- */
- public static NodeLinks createLinkExtension(final NodeModel node) {
- NodeLinks linkExtension = NodeLinks.getLinkExtension(node);
- if (linkExtension != null) {
- return linkExtension;
- }
- linkExtension = new NodeLinks();
- node.addExtension(linkExtension);
- return linkExtension;
- }
-
- public static URI getLink(final NodeModel node) {
- final NodeLinks links = NodeLinks.getModel(node);
- return links != null ? links.getHyperLink() : null;
- }
-
- public static Boolean formatNodeAsHyperlink(final NodeModel node) {
- final NodeLinks links = NodeLinks.getModel(node);
- return links != null ? links.formatNodeAsHyperlink() : null;
- }
-
- public static String getLinkAsString(final NodeModel selectedNode) {
- final URI link = NodeLinks.getValidLink(selectedNode);
- return link != null ? link.toString() : null;
- }
-
- /**
- * @param node
- * @return
- */
- public static NodeLinks getLinkExtension(final NodeModel node) {
- return (NodeLinks) node.getExtension(NodeLinks.class);
- }
-
- public static Collection<LinkModel> getLinks(final NodeModel node) {
- final NodeLinks links = NodeLinks.getLinkExtension(node);
- return links != null ? links.getLinks() : Collections.<LinkModel> emptyList();
- }
-
- public static NodeLinks getModel(final NodeModel node) {
- final NodeLinks links = (NodeLinks) node.getExtension(NodeLinks.class);
- return links;
- }
-
- private URI hyperlink;
- private Boolean formatNodeAsHyperlink;
- final private LinkedList<LinkModel> links;
- //DOCEAR - fixed: new property type for node link changes
- static public final Object HYPERLINK_CHANGED = "hyperlink_changed";
-
- public NodeLinks() {
- links = new LinkedList<LinkModel>();
- }
-
- public void addArrowlink(final NodeLinkModel newLink) {
- links.add(newLink);
- final MapModel map = newLink.getSource().getMap();
- addLinkToMap(map, newLink);
- }
-
- private void addLinkToMap(final MapModel map, final LinkModel newLink) {
- MapLinks mapLinks = MapLinks.getLinks(map);
- if (mapLinks == null) {
- mapLinks = new MapLinks();
- map.addExtension(mapLinks);
- }
- mapLinks.add(newLink);
- }
-
- /**
- * @return
- */
- public URI getHyperLink() {
- return hyperlink;
- }
-
- public Collection<LinkModel> getLinks() {
- return Collections.unmodifiableCollection(links);
- }
-
- public void removeArrowlink(final NodeLinkModel link) {
- final NodeModel node = link.getSource();
- final Iterator<LinkModel> iterator = NodeLinks.getLinkExtension(node).links.iterator();
- while (iterator.hasNext()) {
- final LinkModel i = iterator.next();
- if (i == link) {
- iterator.remove();
- }
- }
- final MapModel map = link.getSource().getMap();
- removeLinkFromMap(map, link);
- }
-
- private void removeLinkFromMap(final MapModel map, final LinkModel link) {
- final MapLinks mapLinks = MapLinks.getLinks(map);
- mapLinks.remove(link);
- }
-
- public String removeLocalHyperLink(final NodeModel node) {
- final Iterator<LinkModel> iterator = links.iterator();
- while (iterator.hasNext()) {
- final LinkModel link = iterator.next();
- if (link instanceof HyperTextLinkModel) {
- iterator.remove();
- removeLinkFromMap(node.getMap(), link);
- return link.getTargetID();
- }
- }
- return null;
- }
-
- public void setHyperLink(final URI hyperlink) {
- this.hyperlink = hyperlink;
- }
-
- public void setLocalHyperlink(final NodeModel node, final String targetID) {
- removeLocalHyperLink(node);
- if (targetID != null) {
- final HyperTextLinkModel link = new HyperTextLinkModel(node, targetID);
- links.add(link);
- addLinkToMap(node.getMap(), link);
- }
- }
-
- public static URI getValidLink(final NodeModel model) {
- final URI link = NodeLinks.getLink(model);
- if (link == null) {
- return null;
- }
- final String linkString = link.toString();
- if (linkString.startsWith("#")) {
- final String id = linkString.substring(1);
- if (model.getMap().getNodeForID(id) == null) {
- return null;
- }
- }
- return link;
- }
-
- public Boolean formatNodeAsHyperlink() {
- return formatNodeAsHyperlink;
- }
-
- public void setFormatNodeAsHyperlink(Boolean formatNodeAsHyperlink) {
- this.formatNodeAsHyperlink = formatNodeAsHyperlink;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/link/NodeUpdateChangeListener.java b/freeplane/src/org/freeplane/features/link/NodeUpdateChangeListener.java
deleted file mode 100644
index e33c55f..0000000
--- a/freeplane/src/org/freeplane/features/link/NodeUpdateChangeListener.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package org.freeplane.features.link;
-
-import java.util.List;
-
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.text.IContentTransformer;
-
-/** cares for updating formula nodes on change of other nodes. */
-public class NodeUpdateChangeListener implements INodeChangeListener, IMapChangeListener{
- public void nodeChanged(NodeChangeEvent event) {
- Object property = event.getProperty();
- // Note: this doesn't mean that other properties are not interesting here (e.g. links, notes, ...)
- // since all these could be referenced by formulas too. It's restricted to the properties that may
- // contain formulas only to limit the number of updates.
- if (NodeModel.NODE_TEXT.equals(property)) {
- nodeChangedImpl(false, event.getNode());
- }
- }
-
- public void onNodeDeleted(NodeModel parent, NodeModel child, int index) {
- nodeChangedImpl(true, parent);
- }
-
- public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
- // all formulas dependent on the child via getChildren() are also dependent on its parent
- nodeChangedImpl(true, parent);
- }
-
- public void onNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- // - all formulas dependent on the child via getChildren() are also dependent on its parent
- // FIXME: is child updated or do we have to force that here?
- nodeChangedImpl(true, oldParent, newParent);
- }
-
- public void onPreNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- }
-
- public void onPreNodeDelete(NodeModel oldParent, NodeModel selectedNode, int index) {
- }
-
- public void mapChanged(MapChangeEvent event) {
-
- }
-
- /** in case of insert we look for dependencies of the parent. But the parent is not actually changed in this case.
- * So there won't be any updates on the parent, even if it has formula that needs an update due to the
- * changed children count. */
- private void nodeChangedImpl(boolean includeChanged, NodeModel... nodes) {
- final ModeController modeController = Controller.getCurrentModeController();
- //FIXME: needed???
- // if (modeController == null || modeController.isUndoAction()) {
- // return;
- // }
- final List<NodeModel> dependencies = EvaluationDependencies.manageChangeAndReturnDependencies(includeChanged, nodes);
- for (NodeModel dependentNode : dependencies) {
- modeController.getMapController().delayedNodeRefresh(dependentNode, IContentTransformer.class,
- null, null);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/ClearLinkAnchorAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/ClearLinkAnchorAction.java
deleted file mode 100644
index fd60aa9..0000000
--- a/freeplane/src/org/freeplane/features/link/mindmapmode/ClearLinkAnchorAction.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Nnamdi Kohn in 2012.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.freeplane.features.link.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.features.link.LinkController;
-
- at EnabledAction
-public class ClearLinkAnchorAction extends AFreeplaneAction {
- public ClearLinkAnchorAction() {
- super("ClearLinkAnchorAction");
- }
-
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
-
- /**
- * @TODO
- *
- * -# clear tickmark in menu
- * -# clear tooltip for mouse-over ClearLinkAnchorAction in menu
- *
- */
-
- // clear current anchor in LinkModule
- ((MLinkController)(LinkController.getController())).setAnchorID( null );
- }
- @Override
- public void setEnabled() {
- final boolean isAnchored = ((MLinkController)(LinkController.getController())).isAnchored();
- setEnabled( isAnchored );
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/MLinkController.java b/freeplane/src/org/freeplane/features/link/mindmapmode/MLinkController.java
deleted file mode 100644
index 54aa705..0000000
--- a/freeplane/src/org/freeplane/features/link/mindmapmode/MLinkController.java
+++ /dev/null
@@ -1,1162 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link.mindmapmode;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.EventQueue;
-import java.awt.GraphicsEnvironment;
-import java.awt.Point;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.HierarchyEvent;
-import java.awt.event.HierarchyListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-import java.util.Set;
-
-import javax.swing.Action;
-import javax.swing.ActionMap;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.FocusManager;
-import javax.swing.Icon;
-import javax.swing.InputMap;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JList;
-import javax.swing.JPopupMenu;
-import javax.swing.JScrollPane;
-import javax.swing.JSlider;
-import javax.swing.JSpinner;
-import javax.swing.JTextArea;
-import javax.swing.KeyStroke;
-import javax.swing.SpinnerNumberModel;
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.link.ArrowType;
-import org.freeplane.features.link.ConnectorModel;
-import org.freeplane.features.link.ConnectorModel.Shape;
-import org.freeplane.features.link.HyperTextLinkModel;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.LinkModel;
-import org.freeplane.features.link.MapLinks;
-import org.freeplane.features.link.NodeLinkModel;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.map.IExtensionCopier;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.DocuMapAttribute;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
-import org.freeplane.features.styles.LogicalStyleKeys;
-import org.freeplane.features.url.UrlManager;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MLinkController extends LinkController {
- private static class StyleCopier implements IExtensionCopier {
-
- public void copy(Object key, NodeModel from, NodeModel to) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- copy(from, to);
- }
-
- public void copy(NodeModel from, NodeModel to) {
- final Boolean formatNodeAsHyperlink = NodeLinks.formatNodeAsHyperlink(from);
- if(formatNodeAsHyperlink != null)
- NodeLinks.createLinkExtension(to).setFormatNodeAsHyperlink(formatNodeAsHyperlink);
-
- }
-
- public void remove(Object key, NodeModel from) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- final NodeLinks model = NodeLinks.getModel(from);
- if(model != null)
- model.setFormatNodeAsHyperlink(null);
- }
-
- public void remove(Object key, NodeModel from, NodeModel which) {
- if(NodeLinks.formatNodeAsHyperlink(which) != null)
- remove(key, from);
- }
- public void resolveParentExtensions(Object key, NodeModel to) {
- }
- }
- private final class CreateArrowLinkActor implements IActor {
- private final String targetID;
- private final NodeModel source;
- private ConnectorModel arrowLink;
-
- public ConnectorModel getArrowLink() {
- return arrowLink;
- }
-
- private CreateArrowLinkActor(final String targetID, final NodeModel source) {
- this.targetID = targetID;
- this.source = source;
- }
-
- public void act() {
- NodeLinks nodeLinks = source.getExtension(NodeLinks.class);
- if (nodeLinks == null) {
- nodeLinks = new NodeLinks();
- source.addExtension(nodeLinks);
- }
- arrowLink = new ConnectorModel(source, targetID,
- getStandardConnectorColor(), getStandardConnectorAlpha(),
- getStandardConnectorShape(), getStandardConnectorWidth(),
- getStandardLabelFontFamily(), getStandardLabelFontSize());
- nodeLinks.addArrowlink(arrowLink);
- fireNodeConnectorChange(source, arrowLink);
- }
-
- public String getDescription() {
- return "addLink";
- }
-
- public void undo() {
- final NodeLinks nodeLinks = source.getExtension(NodeLinks.class);
- nodeLinks.removeArrowlink(arrowLink);
- fireNodeConnectorChange(source, arrowLink);
- }
- }
-
- private final class TargetLabelSetter implements IActor {
- private final String oldLabel;
- private final String label;
- private final ConnectorModel model;
-
- private TargetLabelSetter(final String oldLabel, final String label, final ConnectorModel model) {
- this.oldLabel = oldLabel;
- this.label = label;
- this.model = model;
- }
-
- public void act() {
- model.setTargetLabel(label);
- fireNodeConnectorChange(model.getSource(), model);
- }
-
- public String getDescription() {
- return "setTargetLabel";
- }
-
- public void undo() {
- model.setTargetLabel(oldLabel);
- fireNodeConnectorChange(model.getSource(), model);
- }
- }
-
- private final class SourceLabelSetter implements IActor {
- private final ConnectorModel model;
- private final String label;
- private final String oldLabel;
-
- private SourceLabelSetter(final ConnectorModel model, final String label, final String oldLabel) {
- this.model = model;
- this.label = label;
- this.oldLabel = oldLabel;
- }
-
- public void act() {
- model.setSourceLabel(label);
- fireNodeConnectorChange(model.getSource(), model);
- }
-
- public String getDescription() {
- return "setSourceLabel";
- }
-
- public void undo() {
- model.setSourceLabel(oldLabel);
- fireNodeConnectorChange(model.getSource(), model);
- }
- }
-
- private final class MiddleLabelSetter implements IActor {
- private final ConnectorModel model;
- private final String oldLabel;
- private final String label;
-
- private MiddleLabelSetter(final ConnectorModel model, final String oldLabel, final String label) {
- this.model = model;
- this.oldLabel = oldLabel;
- this.label = label;
- }
-
- public void act() {
- model.setMiddleLabel(label);
- fireNodeConnectorChange(model.getSource(), model);
- }
-
- public String getDescription() {
- return "setMiddleLabel";
- }
-
- public void undo() {
- model.setMiddleLabel(oldLabel);
- fireNodeConnectorChange(model.getSource(), model);
- }
- }
-
- /**
- * @author Dimitry Polivaev
- */
- private final class NodeDeletionListener implements IMapChangeListener {
- public void mapChanged(final MapChangeEvent event) {
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
- if (((MModeController) Controller.getCurrentModeController()).isUndoAction()) {
- return;
- }
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- onChange(child, false);
- }
- });
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void onPreNodeDelete(final NodeModel oldParent, final NodeModel model, final int oldIndex) {
- onChange(model, true);
- }
-
- private void onChange(final NodeModel model, final boolean delete) {
- if (((MModeController) Controller.getCurrentModeController()).isUndoAction()) {
- return;
- }
- final MapModel map = model.getMap();
- final MapLinks links = map.getExtension(MapLinks.class);
- if (links == null) {
- return;
- }
- removeLinksForDeletedSource(links, model, delete);
- removeLinksForDeletedTarget(links, model);
- }
-
- private void removeLinksForDeletedSource(final MapLinks links, final NodeModel model, final boolean delete) {
- final List<NodeModel> children = model.getChildren();
- for (final NodeModel child : children) {
- removeLinksForDeletedSource(links, child, delete);
- }
- final NodeLinks nodeLinks = NodeLinks.getLinkExtension(model);
- if (nodeLinks == null) {
- return;
- }
- for (final LinkModel link : nodeLinks.getLinks()) {
- if (!(link instanceof NodeLinkModel)) {
- continue;
- }
- final IActor actor = new IActor() {
- public void act() {
- if (delete) {
- delete();
- }
- else {
- insert();
- }
- }
-
- public void undo() {
- if (delete) {
- insert();
- }
- else {
- delete();
- }
- }
-
- private void delete() {
- links.remove(link);
- }
-
- public String getDescription() {
- return null;
- }
-
- private void insert() {
- links.add(link);
- }
- };
- final MapModel map = model.getMap();
- Controller.getCurrentModeController().execute(actor, map);
- }
- }
-
- private void removeLinksForDeletedTarget(final MapLinks links, final NodeModel model) {
- final List<NodeModel> children = model.getChildren();
- for (final NodeModel child : children) {
- removeLinksForDeletedTarget(links, child);
- }
- final String id = model.getID();
- if (id == null) {
- return;
- }
- final Set<LinkModel> linkModels = links.get(id);
- if (linkModels == null || linkModels.isEmpty()) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- refresh();
- }
-
- public void undo() {
- refresh();
- }
-
- private void refresh() {
- for (final LinkModel link : linkModels) {
- if (link instanceof HyperTextLinkModel) {
- final NodeModel source = ((HyperTextLinkModel) link).getSource();
- Controller.getCurrentModeController().getMapController().delayedNodeRefresh(source, NodeModel.NODE_ICON,
- null, null);
- }
- }
- }
-
- public String getDescription() {
- return null;
- }
- };
- final MapModel map = model.getMap();
- Controller.getCurrentModeController().execute(actor, map);
- }
-
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
- }
-
- static private SetLinkByFileChooserAction setLinkByFileChooser;
- static private SetLinkByTextFieldAction setLinkByTextField;
- private String anchorID;
- private final ModeController modeController;
-
- public MLinkController(ModeController modeController) {
- super();
- this.modeController = modeController;
- this.anchorID = "";
- }
-
- @Override
- protected void init() {
- super.init();
- createActions();
- modeController.registerExtensionCopier(new StyleCopier());
- (modeController.getMapController()).addMapChangeListener(new NodeDeletionListener());
- }
-
- public ConnectorModel addConnector(final NodeModel source, final NodeModel target) {
- return addConnector(source, target.createID());
- }
-
- public void changeArrowsOfArrowLink(final ConnectorModel link, final ArrowType startArrow, final ArrowType endArrow) {
- final IActor actor = new IActor() {
- final private ArrowType oldEndArrow = link.getEndArrow();
- final private ArrowType oldStartArrow = link.getStartArrow();
-
- public void act() {
- link.setStartArrow(startArrow);
- link.setEndArrow(endArrow);
- fireNodeConnectorChange(link.getSource(), link);
- }
-
- public String getDescription() {
- return "changeArrowsOfArrowLink";
- }
-
- public void undo() {
- link.setStartArrow(oldStartArrow);
- link.setEndArrow(oldEndArrow);
- fireNodeConnectorChange(link.getSource(), link);
- }
- };
- Controller.getCurrentModeController().execute(actor, link.getSource().getMap());
- }
-
- /**
- *
- */
- private void createActions() {
- setLinkByFileChooser = new SetLinkByFileChooserAction();
- modeController.addAction(setLinkByFileChooser);
- final AddConnectorAction addArrowLinkAction = new AddConnectorAction();
- modeController.addAction(addArrowLinkAction);
- setLinkByTextField = new SetLinkByTextFieldAction();
- modeController.addAction(setLinkByTextField);
- modeController.addAction(new AddLocalLinkAction());
- modeController.addAction(new AddMenuItemLinkAction());
- modeController.addAction(new ExtractLinkFromTextAction());
- modeController.addAction(new SetLinkAnchorAction());
- modeController.addAction(new MakeLinkToAnchorAction());
- modeController.addAction(new MakeLinkFromAnchorAction());
- modeController.addAction(new ClearLinkAnchorAction());
- }
-
- @Override
- protected void createArrowLinkPopup(final ConnectorModel link, final JComponent arrowLinkPopup) {
- super.createArrowLinkPopup(link, arrowLinkPopup);
- addClosingAction(arrowLinkPopup, new RemoveConnectorAction(this, link));
-
- addSeparator(arrowLinkPopup);
- addAction(arrowLinkPopup, new ConnectorColorAction(this, link));
-
- final JSlider transparencySlider = new JSlider(20, 255, link.getAlpha());
- transparencySlider.setMinorTickSpacing(20);
- transparencySlider.setPaintTicks(true);
- transparencySlider.setSnapToTicks(true);
- transparencySlider.setPaintTrack(true);
- addPopupComponent(arrowLinkPopup, TextUtils.getText("edit_transparency_label"), transparencySlider);
-
- addSeparator(arrowLinkPopup);
-
-
- AFreeplaneAction[] arrowActions = new AFreeplaneAction[]{
- new ChangeConnectorArrowsAction(this, "none", link, ArrowType.NONE, ArrowType.NONE),
- new ChangeConnectorArrowsAction(this, "forward", link, ArrowType.NONE, ArrowType.DEFAULT),
- new ChangeConnectorArrowsAction(this, "backward", link, ArrowType.DEFAULT, ArrowType.NONE),
- new ChangeConnectorArrowsAction(this, "both", link, ArrowType.DEFAULT, ArrowType.DEFAULT)
- };
- final JComboBox connectorArrows = createActionBox(arrowActions);
- addPopupComponent(arrowLinkPopup, TextUtils.getText("connector_arrows"), connectorArrows);
-
- final boolean twoNodesConnector = ! link.getSource().equals(link.getTarget());
- AFreeplaneAction[] shapeActions;
- if(twoNodesConnector){
- shapeActions = new AFreeplaneAction[] {
- new ChangeConnectorShapeAction(this, link, Shape.CUBIC_CURVE),
- new ChangeConnectorShapeAction(this, link, Shape.LINE),
- new ChangeConnectorShapeAction(this, link, Shape.LINEAR_PATH),
- new ChangeConnectorShapeAction(this, link, Shape.EDGE_LIKE)
- };
- }
- else {
- shapeActions = new AFreeplaneAction[] {
- new ChangeConnectorShapeAction(this, link, Shape.CUBIC_CURVE),
- new ChangeConnectorShapeAction(this, link, Shape.LINE),
- new ChangeConnectorShapeAction(this, link, Shape.LINEAR_PATH)
- };
- }
- final JComboBox connectorShapes = createActionBox(shapeActions);
- addPopupComponent(arrowLinkPopup, TextUtils.getText("connector_shapes"), connectorShapes);
-
- AFreeplaneAction[] dashActions = new AFreeplaneAction[] {
- new ChangeConnectorDashAction(this, link, null),
- new ChangeConnectorDashAction(this, link, new int[]{3, 3}),
- new ChangeConnectorDashAction(this, link, new int[]{7, 7}),
- new ChangeConnectorDashAction(this, link, new int[]{2, 7}),
- new ChangeConnectorDashAction(this, link, new int[]{2, 7, 7, 7})
- };
- final JComboBox connectorDashes = createActionBox(dashActions);
- addPopupComponent(arrowLinkPopup, TextUtils.getText("connector_lines"), connectorDashes);
-
- final SpinnerNumberModel widthModel = new SpinnerNumberModel(link.getWidth(),1, 32, 1);
- final JSpinner widthSpinner = new JSpinner(widthModel);
- addPopupComponent(arrowLinkPopup, TextUtils.getText("edit_width_label"), widthSpinner);
-
- addSeparator(arrowLinkPopup);
-
- {
- final GraphicsEnvironment gEnv = GraphicsEnvironment.getLocalGraphicsEnvironment();
- final String[] envFonts = gEnv.getAvailableFontFamilyNames();
- DefaultComboBoxModel fonts = new DefaultComboBoxModel(envFonts);
- fonts.setSelectedItem(link.getLabelFontFamily());
- JComboBox fontBox = new JComboBox(fonts);
- fontBox.setEditable(false);
- addPopupComponent(arrowLinkPopup, TextUtils.getText("edit_label_font_family"), fontBox);
- fontBox.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- final Object item = e.getItem();
- if(item != null)
- setLabelFontFamily(link, item.toString());
- }
- });
- }
- {
- final Integer[] sizes = {4, 6, 8, 10, 12, 14, 16, 18, 24, 36};
- DefaultComboBoxModel sizesModel = new DefaultComboBoxModel(sizes);
- sizesModel.setSelectedItem(link.getLabelFontSize());
- JComboBox sizesBox = new JComboBox(sizesModel);
- sizesBox.setEditable(true);
- addPopupComponent(arrowLinkPopup, TextUtils.getText("edit_label_font_size"), sizesBox);
- sizesBox.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- final Object item = e.getItem();
- if(item != null){
- final int size;
- if(item instanceof Integer)
- size = (Integer)item;
- else{
- try{
- size = Integer.valueOf(item.toString());
- if(size <=0)
- return;
- }
- catch (NumberFormatException ex){
- return;
- }
- }
-
- setLabelFontSize(link, size);
- }
- }
- });
- }
- final JTextArea sourceLabelEditor;
- sourceLabelEditor = new JTextArea(link.getSourceLabel());
- addTextEditor(arrowLinkPopup, "edit_source_label", sourceLabelEditor);
-
- final JTextArea middleLabelEditor = new JTextArea(link.getMiddleLabel());
- addTextEditor(arrowLinkPopup, "edit_middle_label" ,middleLabelEditor);
-
- final JTextArea targetLabelEditor ;
- targetLabelEditor = new JTextArea(link.getTargetLabel());
- addTextEditor(arrowLinkPopup, "edit_target_label", targetLabelEditor);
-
- arrowLinkPopup.addHierarchyListener(new HierarchyListener() {
- private Component focusOwner;
- private Window dialog;
- public void hierarchyChanged(HierarchyEvent e) {
- final JComponent component = (JComponent) e.getComponent();
- if(component.isShowing()){
- if(dialog == null){
- dialog = SwingUtilities.getWindowAncestor(component);
- dialog.addWindowListener(new WindowAdapter() {
-
- @Override
- public void windowClosing(WindowEvent e) {
- component.putClientProperty(CANCEL, Boolean.TRUE);
- }
- });
- }
- if(focusOwner == null)
- focusOwner = FocusManager.getCurrentManager().getFocusOwner();
- return;
- }
- if(focusOwner == null || ! focusOwner.isShowing())
- return;
- focusOwner.requestFocus();
- if (Boolean.TRUE.equals(component.getClientProperty(CANCEL))) {
- return;
- }
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- if (selection == null || selection.getSelected() == null)
- return;
- setSourceLabel(link, sourceLabelEditor.getText());
- setTargetLabel(link, targetLabelEditor.getText());
- setMiddleLabel(link, middleLabelEditor.getText());
- setAlpha(link, transparencySlider.getValue());
- setWidth(link, widthModel.getNumber().intValue());
- }
-
- });
-
- }
-
- @SuppressWarnings("serial")
- protected JComboBox createActionBox(AFreeplaneAction[] items) {
- final JComboBox box = new JComboBox();
- box.setEditable(false);
- box.setModel(new DefaultComboBoxModel(items));
- for(AFreeplaneAction item : items){
- if(item.isSelected()){
- box.setSelectedItem(item);
- break;
- }
- }
- box.setRenderer(new DefaultListCellRenderer() {
- @Override
- public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
- boolean cellHasFocus) {
- Action action = (Action) value;
- Icon icon = (Icon)action.getValue(Action.SMALL_ICON);
- String text = (String)action.getValue(Action.NAME);
- Object renderedValue = text == null ? icon : text;
- DefaultListCellRenderer renderer = (DefaultListCellRenderer) super.getListCellRendererComponent(list, renderedValue, index, isSelected, cellHasFocus);
- if(text != null && icon != null)
- renderer.setIcon(icon);
- return renderer;
- }
- });
- box.addItemListener(new ItemListener() {
- public void itemStateChanged(ItemEvent e) {
- AFreeplaneAction item = (AFreeplaneAction)e.getItem();
- final JComboBox box = (JComboBox) e.getSource();
- item.actionPerformed(new ActionEvent(box, ActionEvent.ACTION_PERFORMED, null));
- }
- });
- return box;
- }
-
- private void addSeparator(JComponent arrowLinkPopup) {
- }
-
- private void addTextEditor(final JComponent popup, final String label, final JTextArea editor) {
- final InputMap inputMap = editor.getInputMap();
- final ActionMap actionMap = editor.getActionMap();
- final boolean enterConfirms = ResourceController.getResourceController().getBooleanProperty("el__enter_confirms_by_default");
- final KeyStroke close = KeyStroke.getKeyStroke(enterConfirms ? "ENTER" : "alt ENTER");
- inputMap.put(close, CLOSE);
- actionMap.put(CLOSE, new ClosePopupAction(CLOSE));
-
- final KeyStroke enter = KeyStroke.getKeyStroke(! enterConfirms ? "ENTER" : "alt ENTER");
- final KeyStroke enter2 = KeyStroke.getKeyStroke("shift ENTER");
- inputMap.put(enter, "INSERT_EOL");
- inputMap.put(enter2, "INSERT_EOL");
- actionMap.put("INSERT_EOL", new UITools.InsertEolAction());
- editor.setRows(5);
- editor.setColumns(30);
-
- final JPopupMenu popupMenu = new JPopupMenu();
- SpellCheckerController spellCheckerController = SpellCheckerController.getController();
- spellCheckerController.addSpellCheckerMenu(popupMenu );
- spellCheckerController.enableAutoSpell(editor, true);
- editor.addMouseListener(new MouseAdapter() {
-
- @Override
- public void mousePressed(MouseEvent e) {
- handlePopup(e);
- }
-
- @Override
- public void mouseReleased(MouseEvent e) {
- handlePopup(e);
- }
-
- private void handlePopup(MouseEvent e) {
- if(e.isPopupTrigger()){
- e.consume();
- popupMenu.show(e.getComponent(), e.getX(), e.getY());
- }
-
- }
-
- });
-
-
- final JScrollPane scrollPane = new JScrollPane(editor, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
- addPopupComponent(popup, TextUtils.getText(label), scrollPane);
- }
-
- public void setConnectorColor(final ConnectorModel arrowLink, final Color color) {
- final Color oldColor = arrowLink.getColor();
- if (color == oldColor || color != null && color.equals(oldColor)) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- arrowLink.setColor(color);
- final NodeModel node = arrowLink.getSource();
- fireNodeConnectorChange(node, arrowLink);
- }
-
- public String getDescription() {
- return "setConnectorColor";
- }
-
- public void undo() {
- arrowLink.setColor(oldColor);
- final NodeModel node = arrowLink.getSource();
- fireNodeConnectorChange(node, arrowLink);
- }
- };
- Controller.getCurrentModeController().execute(actor, arrowLink.getSource().getMap());
- }
-
- public void setConnectorDash(final ConnectorModel arrowLink, final int[] dash) {
- final int[] oldDash = arrowLink.getDash();
- if (dash == oldDash || dash != null && dash.equals(oldDash)) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- arrowLink.setDash(dash);
- final NodeModel node = arrowLink.getSource();
- fireNodeConnectorChange(node, arrowLink);
- }
-
- public String getDescription() {
- return "setConnectorDash";
- }
-
- public void undo() {
- arrowLink.setDash(oldDash);
- final NodeModel node = arrowLink.getSource();
- fireNodeConnectorChange(node, arrowLink);
- }
- };
- Controller.getCurrentModeController().execute(actor, arrowLink.getSource().getMap());
- }
-
- public void setArrowLinkEndPoints(final ConnectorModel link, final Point startPoint, final Point endPoint) {
- final IActor actor = new IActor() {
- final private Point oldEndPoint = link.getEndInclination();
- final private Point oldStartPoint = link.getStartInclination();
-
- public void act() {
- link.setStartInclination(startPoint);
- link.setEndInclination(endPoint);
- fireNodeConnectorChange(link.getSource(), link);
- }
-
- public String getDescription() {
- return "setArrowLinkEndPoints";
- }
-
- public void undo() {
- link.setStartInclination(oldStartPoint);
- link.setEndInclination(oldEndPoint);
- fireNodeConnectorChange(link.getSource(), link);
- }
- };
- Controller.getCurrentModeController().execute(actor, link.getSource().getMap());
- }
-
- public void setLink(final NodeModel node, final String link, final int linkType) {
- if (link != null && !"".equals(link)) {
- try {
- final URI uri = new URI(link);
- setLink(node, uri, linkType);
- }
- catch (final URISyntaxException e) {
- e.printStackTrace();
- }
- return;
- }
- setLink(node, (URI) null, LINK_ABSOLUTE);
- }
-
- private URI relativeLink(final URI argUri, final NodeModel node, final int linkType) {
- if (linkType != LINK_ABSOLUTE && "file".equals(argUri.getScheme())) {
- try {
- final File mapFile = node.getMap().getFile();
- return LinkController.toRelativeURI(mapFile, new File(argUri), linkType);
- }
- catch (Exception e) {
- }
- }
- return argUri;
- }
-
- public void setLinkTypeDependantLink(final NodeModel node, final URI argUri) {
- setLink(node, argUri, getLinkType());
- }
-
- public void setLinkTypeDependantLink(final NodeModel node, final File file) {
- setLink(node, file.toURI(), getLinkType());
- }
-
- public void setLinkTypeDependantLink(final NodeModel node, final String link) {
- setLink(node, link, getLinkType());
- }
-
- public void setLink(final NodeModel node, final URI argUri, final int linkType) {
- final URI uri = relativeLink(argUri, node, linkType);
- final IActor actor = new IActor() {
- private URI oldlink;
- private String oldTargetID;
-
- public void act() {
- NodeLinks links = NodeLinks.getLinkExtension(node);
- if (links != null) {
- oldlink = links.getHyperLink();
- oldTargetID = links.removeLocalHyperLink(node);
- }
- else {
- links = NodeLinks.createLinkExtension(node);
- }
- if (uri != null && uri.toString().startsWith("#")) {
- links.setLocalHyperlink(node, uri.toString().substring(1));
- }
-
- //DOCEAR - replaced old nodeChanged event and use new LinkChanged property
- URI oldHyperLink = links.getHyperLink();
- links.setHyperLink(uri);
- //Controller.getCurrentModeController().getMapController().nodeChanged(node);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeLinks.HYPERLINK_CHANGED, oldHyperLink, uri);
-
- }
-
- public String getDescription() {
- return "setLink";
- }
-
- public void undo() {
- final NodeLinks links = NodeLinks.getLinkExtension(node);
- URI undoneLink = links.getHyperLink();
- links.setLocalHyperlink(node, oldTargetID);
- links.setHyperLink(oldlink);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeLinks.HYPERLINK_CHANGED, undoneLink, oldlink);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- public void setLinkByFileChooser() {
- setLinkByFileChooser.setLinkByFileChooser();
- }
-
- public void setMiddleLabel(final ConnectorModel model, String label) {
- if ("".equals(label)) {
- label = null;
- }
- String oldLabel = model.getMiddleLabel();
- if ("".equals(oldLabel)) {
- oldLabel = null;
- }
- if (label == oldLabel || label != null && label.equals(oldLabel)) {
- return;
- }
- final IActor actor = new MiddleLabelSetter(model, oldLabel, label);
- Controller.getCurrentModeController().execute(actor, model.getSource().getMap());
- }
-
- public void setSourceLabel(final ConnectorModel model, String label) {
- if ("".equals(label)) {
- label = null;
- }
- String oldLabel = model.getSourceLabel();
- if ("".equals(oldLabel)) {
- oldLabel = null;
- }
- if (label == oldLabel || label != null && label.equals(oldLabel)) {
- return;
- }
- final IActor actor = new SourceLabelSetter(model, label, oldLabel);
- Controller.getCurrentModeController().execute(actor, model.getSource().getMap());
- }
-
- public void setTargetLabel(final ConnectorModel model, String label) {
- if ("".equals(label)) {
- label = null;
- }
- String oldLabel = model.getTargetLabel();
- if ("".equals(oldLabel)) {
- oldLabel = null;
- }
- if (label == oldLabel || label != null && label.equals(oldLabel)) {
- return;
- }
- final IActor actor = new TargetLabelSetter(oldLabel, label, model);
- Controller.getCurrentModeController().execute(actor, model.getSource().getMap());
- }
-
- public ConnectorModel addConnector(final NodeModel source, final String targetID) {
- final CreateArrowLinkActor actor = new CreateArrowLinkActor(targetID, source);
- Controller.getCurrentModeController().execute(actor, source.getMap());
- return actor.getArrowLink();
- }
-
- public void removeArrowLink(final ConnectorModel arrowLink) {
- final IActor actor = new IActor() {
- public void act() {
- final NodeModel source = arrowLink.getSource();
- final NodeLinks nodeLinks = source.getExtension(NodeLinks.class);
- nodeLinks.removeArrowlink(arrowLink);
- fireNodeConnectorChange(source, arrowLink);
- }
-
- public String getDescription() {
- return "removeArrowLink";
- }
-
- public void undo() {
- final NodeModel source = arrowLink.getSource();
- NodeLinks nodeLinks = source.getExtension(NodeLinks.class);
- if (nodeLinks == null) {
- nodeLinks = new NodeLinks();
- source.addExtension(nodeLinks);
- }
- nodeLinks.addArrowlink(arrowLink);
- fireNodeConnectorChange(source, arrowLink);
- }
- };
- Controller.getCurrentModeController().execute(actor, arrowLink.getSource().getMap());
- }
-
- public void setShape(final ConnectorModel connector, final Shape shape) {
- final Shape oldShape = connector.getShape();
- if (oldShape.equals(shape)) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- connector.setShape(shape);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
-
- public String getDescription() {
- return "setConnectorShape";
- }
-
- public void undo() {
- connector.setShape(oldShape);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
- };
- Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
- }
-
- public void setWidth(final ConnectorModel connector, final int width) {
- final int oldWidth = connector.getWidth();
- if (oldWidth == width) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- connector.setWidth(width);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
-
- public String getDescription() {
- return "setConnectorWidth";
- }
-
- public void undo() {
- connector.setWidth(oldWidth);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
- };
- Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
- }
-
-
- public void setLabelFontSize(final ConnectorModel connector, final int width) {
- final int oldWidth = connector.getLabelFontSize();
- if (oldWidth == width) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- connector.setLabelFontSize(width);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
-
- public String getDescription() {
- return "setConnectorWidth";
- }
-
- public void undo() {
- connector.setLabelFontSize(oldWidth);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
- };
- Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
- }
-
-
- public void setLabelFontFamily(final ConnectorModel connector, final String family) {
- final String oldFamily = connector.getLabelFontFamily();
- if (oldFamily.equals(family)) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- connector.setLabelFontFamily(family);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
-
- public String getDescription() {
- return "setConnectorWidth";
- }
-
- public void undo() {
- connector.setLabelFontFamily(oldFamily);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
- };
- Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
- }
-
- public void setAlpha(final ConnectorModel connector, final int alpha) {
- final int oldAlpha = connector.getAlpha();
- if (oldAlpha == alpha) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- connector.setAlpha(alpha);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
-
- public String getDescription() {
- return "setConnectorAlpha";
- }
-
- public void undo() {
- connector.setAlpha(oldAlpha);
- final NodeModel node = connector.getSource();
- fireNodeConnectorChange(node, connector);
- }
- };
- Controller.getCurrentModeController().execute(actor, connector.getSource().getMap());
- }
-
- @Override
- @SuppressWarnings("deprecation")
- public void loadURI(URI uri) {
- UrlManager.getController().loadURL(uri);
- }
-
- @Override
- protected void loadURL(final NodeModel node, final ActionEvent e) {
- // load as documentation map if the node belongs to a documentation map
- boolean addDocuMapAttribute = node.getMap().containsExtension(DocuMapAttribute.class)
- && ! modeController.containsExtension(DocuMapAttribute.class);
- if(addDocuMapAttribute){
- modeController.addExtension(DocuMapAttribute.class, DocuMapAttribute.instance);
- }
- try{
- super.loadURL(node, e);
- }
- finally{
- if(addDocuMapAttribute){
- modeController.removeExtension(DocuMapAttribute.class);
- }
- }
- }
-
- public String getAnchorID() {
- return anchorID;
- }
-
- public void setAnchorID(final String anchorID) {
- this.anchorID = anchorID;
- final String tooltip;
- AFreeplaneAction setLinkAnchorAction = modeController.getAction("SetLinkAnchorAction");
- final boolean anchored = isAnchored();
- if(anchored)
- tooltip = TextUtils.format(setLinkAnchorAction.getTooltipKey() + "_anchored", anchorID);
- else
- tooltip = TextUtils.getRawText(setLinkAnchorAction.getTooltipKey());
- setLinkAnchorAction.putValue(Action.SHORT_DESCRIPTION, tooltip);
- setLinkAnchorAction.putValue(Action.LONG_DESCRIPTION, tooltip);
- setLinkAnchorAction.setSelected(anchored);
- modeController.getAction("ClearLinkAnchorAction").setEnabled(anchored);
- modeController.getAction("MakeLinkToAnchorAction").setEnabled(anchored);
- modeController.getAction("MakeLinkFromAnchorAction").setEnabled(anchored);
- }
-
- public boolean isAnchored() {
- return anchorID != null && !anchorID.isEmpty();
- }
-
- public String getAnchorIDforNode(final NodeModel node) {
- String targetID = getAnchorID();
- final String link;
- // check if anchorID is valid, then set link in current node
- if (isAnchored() && ! targetID.matches("\\w+://")) {
-
- // extract fileName from target map
- final String targetMapFileName = targetID.substring( targetID.indexOf("/") +1, targetID.indexOf("#") );
-
- // get fileName of selected node (source)
- final File sourceMapFile = node.getMap().getFile();
- if(sourceMapFile == null) {
- UITools.errorMessage(TextUtils.getRawText("map_not_saved"));
- return null;
- }
-
- // check if target and source reside within same map
- final String sourceMapFileNameURI = sourceMapFile.toURI().toString();
- if( sourceMapFileNameURI.substring(sourceMapFileNameURI.indexOf("/")+1).equals(targetMapFileName) ) {
-
- // insert only targetNodeID as link
- link = targetID.substring(targetID.indexOf("#"));
-
- } else {
-
- // insert whole targetPath (including targetNodeID) as link for current node
- link = targetID;
- }
- }
- else{
- link = null;
- }
- return link;
- }
-
- public void setFormatNodeAsHyperlink(final NodeModel node, final Boolean enabled){
- final NodeLinks links = NodeLinks.createLinkExtension(node);
- IActor actor = new IActor() {
- final Boolean old = links.formatNodeAsHyperlink();
- public void act() {
- links.setFormatNodeAsHyperlink(enabled);
- modeController.getMapController().nodeChanged(node);
- }
-
- public void undo() {
- links.setFormatNodeAsHyperlink(old);
- modeController.getMapController().nodeChanged(node);
- }
-
-
- public String getDescription() {
- return "setFormatNodeAsHyperlink";
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- private void fireNodeConnectorChange(NodeModel source, ConnectorModel arrowLink) {
- Controller.getCurrentModeController().getMapController().nodeChanged(source, NodeLinks.CONNECTOR, arrowLink, arrowLink);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/MakeLinkFromAnchorAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/MakeLinkFromAnchorAction.java
deleted file mode 100644
index 2867b2b..0000000
--- a/freeplane/src/org/freeplane/features/link/mindmapmode/MakeLinkFromAnchorAction.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Nnamdi Kohn in 2012.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.freeplane.features.link.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
- at EnabledAction
-public class MakeLinkFromAnchorAction extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
-
- public MakeLinkFromAnchorAction() {
- super("MakeLinkFromAnchorAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
-
- // get reference to current modeController
- final ModeController modeControllerForSelectedMap = Controller.getCurrentModeController();
-
- // get reference of selected node (target)
- final NodeModel targetNode = modeControllerForSelectedMap.getMapController().getSelectedNode();
- // get file path of selected node (target)
- final File targetMapFile = targetNode.getMap().getFile();
- if(targetMapFile == null) {
- UITools.errorMessage(TextUtils.getRawText("map_not_saved"));
- return;
- }
- // extract file name string (URI) for target
- final String targetMapFileNameURI = targetMapFile.toURI().toString();
- // extract file name string for target
- final String targetMapFileName = targetMapFileNameURI.substring(targetMapFileNameURI.indexOf("/")+1);
- // get ID (consisting of fileName and nodeID) of selected node (as targetID)
- final String targetID = targetMapFile.toURI().toString() + '#' + targetNode.createID();
-
- // get anchorID (as sourceID) from MLinkController
- final String sourceID = ((MLinkController)(LinkController.getController())).getAnchorID();
- // check if anchorID valid (should be null when file is closed or anchor is cleared)
- if( sourceID == null) {
- return;
- }
- // extract anchorMapFileName (source)
- final String sourceMapFileName = sourceID.substring( sourceID.indexOf("/") +1, sourceID.indexOf("#") );
-
- // check if target and source reside within same map
- if( targetMapFileName.equals(sourceMapFileName) ) {
-
- // get link controller
- final MLinkController linkController = (MLinkController) MLinkController.getController();
-
- // get nodeID of anchored node (source)
- final String sourceNodeID = sourceID.substring( sourceID.indexOf("#")+1 );
-
- // get reference to node from ID-String (source)
- final NodeModel sourceNode = modeControllerForSelectedMap.getMapController().getNodeFromID(sourceNodeID);
-
- // insert only targetNodeID as link
- linkController.setLink(sourceNode, targetID.substring(targetID.indexOf("#")), LinkController.LINK_ABSOLUTE);
-
- } else {
-
- // navigate to anchored map (source)
- final MLinkController linkController_selected = (MLinkController) MLinkController.getController();
- try {
- final URI linkToAnchorNode = LinkController.createURI(sourceID.trim());
- linkController_selected.loadURI(linkToAnchorNode);
- }
- catch (final URISyntaxException e1) {
- LogUtils.warn(e1);
- // UITools.errorMessage(TextUtils.format("invalid_uri", link));
- return;
- }
-
- // get reference of anchor node within anchor map
- final NodeModel sourceNode = modeControllerForSelectedMap.getMapController().getSelectedNode();
-
- // set link in anchored node within anchored map
- final MLinkController linkController_anchored = (MLinkController) MLinkController.getController();
- try {
- final URI linkToCurrentNode = LinkController.createURI(targetID.trim());
- linkController_anchored.setLink(sourceNode, linkToCurrentNode, LinkController.LINK_ABSOLUTE);
- }
- catch (final URISyntaxException e1) {
- LogUtils.warn(e1);
- // UITools.errorMessage(TextUtils.format("invalid_uri", link));
- return;
- }
-
- // re-navigate to target map
- try {
- final URI linkBackToSelectedNode = LinkController.createURI(targetID.trim());
- linkController_anchored.loadURI(linkBackToSelectedNode);
- }
- catch (final URISyntaxException e1) {
- LogUtils.warn(e1);
- // UITools.errorMessage(TextUtils.format("invalid_uri", link));
- return;
- }
- }
- }
- @Override
- public void setEnabled() {
- final boolean isAnchored = ((MLinkController)(LinkController.getController())).isAnchored();
- setEnabled( isAnchored );
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/MakeLinkToAnchorAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/MakeLinkToAnchorAction.java
deleted file mode 100644
index 74cce04..0000000
--- a/freeplane/src/org/freeplane/features/link/mindmapmode/MakeLinkToAnchorAction.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Nnamdi Kohn in 2012.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package org.freeplane.features.link.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
- at EnabledAction
-public class MakeLinkToAnchorAction extends AFreeplaneAction {
-
- private static final long serialVersionUID = 1L;
-
- public MakeLinkToAnchorAction() {
- super("MakeLinkToAnchorAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
-
- // get reference of selected node
- final ModeController modeController = Controller.getCurrentModeController();
- final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
-
- // get anchorID from MLinkController
- final MLinkController mLinkController = (MLinkController)(LinkController.getController());
- final String link = mLinkController.getAnchorIDforNode(selectedNode);
- if(link != null)
- mLinkController.setLink(selectedNode, link, LinkController.LINK_ABSOLUTE);
- }
-
- @Override
- public void setEnabled() {
- final boolean isAnchored = ((MLinkController)(LinkController.getController())).isAnchored();
- setEnabled( isAnchored );
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/SelectMenuItemDialog.java b/freeplane/src/org/freeplane/features/link/mindmapmode/SelectMenuItemDialog.java
deleted file mode 100644
index 1019c9f..0000000
--- a/freeplane/src/org/freeplane/features/link/mindmapmode/SelectMenuItemDialog.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2010 Volker Boerchers
- *
- * This file author is Volker Boerchers
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JScrollPane;
-import javax.swing.JTree;
-import javax.swing.WindowConstants;
-import javax.swing.border.EmptyBorder;
-import javax.swing.event.TreeSelectionEvent;
-import javax.swing.event.TreeSelectionListener;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.TreeSelectionModel;
-
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.MenuUtils;
-import org.freeplane.core.util.MenuUtils.MenuEntry;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.icon.factory.MindIconFactory;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-/**
- * Presents the menu bar as a tree. Only allows the selection of leaf nodes.
- *
- * @author vboerchers
- */
-public class SelectMenuItemDialog extends JDialog {
- private static final long serialVersionUID = 1L;
- // append "/extras/first/scripting/scripts" for scripts
- private static final String SELECTION_ROOT_KEY = FreeplaneMenuBar.MENU_BAR_PREFIX;
- private static final Dimension DIALOG_DIMENSION = new Dimension(350, 350);
- private JButton btnOK;
- private final JTree tree;
- private MenuEntry menuItem;
-
- private class CloseAction implements ActionListener {
- public void actionPerformed(final ActionEvent e) {
- final Object source = e.getSource();
- if (source == btnOK) {
- final DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree
- .getLastSelectedPathComponent();
- // this condition actually has to be true due to the TreeSelectionListener
- if (selectedNode != null && selectedNode.isLeaf()) {
- menuItem = (MenuEntry) selectedNode.getUserObject();
- dispose();
- }
- }
- else {
- dispose();
- }
- }
- }
-
- private class MenuIconRenderer extends DefaultTreeCellRenderer {
- private static final String DEFAULT_ICON = "button";
- private static final long serialVersionUID = 1L;
-
- public MenuIconRenderer() {
- setOpenIcon(null);
- setClosedIcon(null);
- // set default
- setLeafIcon(MindIconFactory.create(DEFAULT_ICON).getIcon());
- }
-
- @Override
- public Component getTreeCellRendererComponent(final JTree tree, final Object value, final boolean sel,
- final boolean expanded, final boolean leaf, final int row,
- final boolean hasFocus) {
- super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
- if (leaf) {
- final DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
- final MenuEntry menuEntry = (MenuEntry) node.getUserObject();
- if (menuEntry.getIconKey() != null) {
- final MindIcon mindIcon = menuEntry.createMindIcon();
- if (mindIcon != null)
- setIcon(mindIcon.getIcon());
- }
- }
- return this;
- }
- }
-
- public SelectMenuItemDialog(final NodeModel node) {
- super(UITools.getFrame(), TextUtils.getText("select_menu_item_dialog"), true);
- Controller.getCurrentController().getMapViewManager().scrollNodeToVisible(node);
- UITools.setDialogLocationRelativeTo(this, node);
- setSize(DIALOG_DIMENSION);
- setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- UITools.addEscapeActionToDialog(this);
- tree = createTree();
- getContentPane().add(new JScrollPane(tree));
- getContentPane().add(createButtonBar(), BorderLayout.SOUTH);
- getRootPane().setDefaultButton(btnOK);
- setVisible(true);
- }
-
- public MenuEntry getMenuItem() {
- return menuItem;
- }
-
- private Box createButtonBar() {
- final Box controllerBox = Box.createHorizontalBox();
- controllerBox.setBorder(new EmptyBorder(5, 0, 5, 0));
- final CloseAction closeAction = new CloseAction();
- btnOK = createButton("ok", closeAction);
- final JButton btnCancel = createButton("cancel", closeAction);
- controllerBox.add(Box.createHorizontalGlue());
- controllerBox.add(btnOK);
- controllerBox.add(Box.createHorizontalGlue());
- controllerBox.add(btnCancel);
- controllerBox.add(Box.createHorizontalGlue());
- return controllerBox;
- }
-
- private JButton createButton(final String key, final CloseAction closeAction) {
- final JButton button = new JButton();
- MenuBuilder.setLabelAndMnemonic(button, TextUtils.getRawText(key));
- button.addActionListener(closeAction);
- button.setMaximumSize(new Dimension(1000, 1000));
- return button;
- }
-
- private JTree createTree() {
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder();
- final DefaultMutableTreeNode treeRoot = MenuUtils.createMenuEntryTree(SELECTION_ROOT_KEY, menuBuilder);
- if (treeRoot.getUserObject() == null)
- treeRoot.setUserObject(new MenuEntry(null, TextUtils.getText("select_menu_item_root_node")));
- JTree jTree = new JTree(treeRoot);
- jTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
- // replace the standard icons
- jTree.setCellRenderer(new MenuIconRenderer());
- jTree.addTreeSelectionListener(new TreeSelectionListener() {
- public void valueChanged(final TreeSelectionEvent e) {
- final DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
- btnOK.setEnabled(node != null && node.isLeaf());
- }
- });
- jTree.addMouseListener(new MouseAdapter() {
- public void mouseClicked(MouseEvent e) {
- if (e.getClickCount() >= 2) {
- if (btnOK.isEnabled())
- btnOK.doClick();
- }
- }
- });
-
- return jTree;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByTextFieldAction.java b/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByTextFieldAction.java
deleted file mode 100644
index 64e574a..0000000
--- a/freeplane/src/org/freeplane/features/link/mindmapmode/SetLinkByTextFieldAction.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.link.mindmapmode;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.event.ActionEvent;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-class SetLinkByTextFieldAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public SetLinkByTextFieldAction() {
- super("SetLinkByTextFieldAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
- String linkAsString = NodeLinks.getLinkAsString(selectedNode);
- if(Compat.isWindowsOS() && linkAsString != null && linkAsString.startsWith("smb:")){
- final URI link = NodeLinks.getValidLink(selectedNode);
- linkAsString = Compat.smbUri2unc(link);
- }
- if(linkAsString == null || "".equals(linkAsString)){
- linkAsString = "http://";
- // if clipboard contains a valid uri use it
- ClipboardController clipboardController = modeController.getExtension(ClipboardController.class);
- Transferable t = clipboardController.getClipboardContents();
- if (t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
- try {
- final String plainTextFromClipboard = t.getTransferData(DataFlavor.stringFlavor).toString().trim();
- new URI(plainTextFromClipboard);
- linkAsString = plainTextFromClipboard;
- }
- catch (final Exception ex) {
- }
- }
- }
- final String inputValue = UITools.showInputDialog(
- Controller.getCurrentController().getSelection().getSelected(), TextUtils.getText("edit_link_manually"), linkAsString);
- if (inputValue != null && ! inputValue.matches("\\w+://")) {
- final MLinkController linkController = (MLinkController) MLinkController.getController();
- if (inputValue.equals("")) {
- linkController.setLink(selectedNode, (URI) null, LinkController.LINK_ABSOLUTE);
- return;
- }
- try {
- final URI link = LinkController.createURI(inputValue.trim());
- linkController.setLink(selectedNode, link, LinkController.LINK_ABSOLUTE);
- }
- catch (final URISyntaxException e1) {
- LogUtils.warn(e1);
- UITools.errorMessage(TextUtils.format("invalid_uri", inputValue));
- return;
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/AMapChangeListenerAdapter.java b/freeplane/src/org/freeplane/features/map/AMapChangeListenerAdapter.java
deleted file mode 100644
index e524b62..0000000
--- a/freeplane/src/org/freeplane/features/map/AMapChangeListenerAdapter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.freeplane.features.map;
-
-
-abstract public class AMapChangeListenerAdapter implements IMapChangeListener, INodeChangeListener, IMapLifeCycleListener {
- public void mapChanged(MapChangeEvent event) {
- }
-
- public void onNodeDeleted(NodeModel parent, NodeModel child, int index) {
- }
-
- public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
- }
-
- public void onNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- }
-
- public void onPreNodeDelete(NodeModel oldParent, NodeModel selectedNode, int index) {
- }
-
- public void onPreNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- }
-
- public void nodeChanged(NodeChangeEvent event) {
- }
-
- public void onCreate(MapModel map) {
- }
-
- public void onRemove(MapModel map) {
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/features/map/AlwaysUnfoldedNode.java b/freeplane/src/org/freeplane/features/map/AlwaysUnfoldedNode.java
deleted file mode 100644
index 88976bb..0000000
--- a/freeplane/src/org/freeplane/features/map/AlwaysUnfoldedNode.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Apr 9, 2011
- */
- at NodeHookDescriptor(hookName = "AlwaysUnfoldedNode", onceForMap = false)
-public class AlwaysUnfoldedNode extends PersistentNodeHook implements IExtension{
-
- public static void install(){
- new AlwaysUnfoldedNode();
- };
-
- @Override
- protected IExtension createExtension(NodeModel node, XMLElement element) {
- return this;
- }
-
- static public boolean isConnectorNode(final NodeModel nodeModel) {
- return nodeModel.containsExtension(AlwaysUnfoldedNode.class);
- }
-
- @Override
- protected void add(NodeModel node, IExtension extension) {
- super.add(node, extension);
- node.setFolded(false);
- }
-
-
-}
-
diff --git a/freeplane/src/org/freeplane/features/map/EncryptionModel.java b/freeplane/src/org/freeplane/features/map/EncryptionModel.java
deleted file mode 100644
index 3dad18c..0000000
--- a/freeplane/src/org/freeplane/features/map/EncryptionModel.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.Iterator;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.map.MapWriter.Mode;
-
-public class EncryptionModel implements IExtension {
- public static EncryptionModel getModel(final NodeModel node) {
- return (EncryptionModel) node.getExtension(EncryptionModel.class);
- }
-
- private String encryptedContent;
- private boolean isAccessible = true;
- /**
- * is only set to false by the load mechanism. If the node is generated or
- * it is decrypted once, this is always true.
- */
- private boolean isDecrypted = true;
- private IEncrypter mEncrypter;
- /**
- * password have to be stored in a StringBuilder as Strings cannot be deleted
- * or overwritten.
- */
- final private NodeModel node;
-
- public EncryptionModel(final NodeModel node) {
- this.node = node;
- encryptedContent = null;
- setAccessible(true);
- isDecrypted = true;
- }
-
- /**
- * @param encryptedContent
- */
- public EncryptionModel(final NodeModel node, final String encryptedContent) {
- this.node = node;
- this.encryptedContent = encryptedContent;
- setAccessible(false);
- isDecrypted = false;
- }
-
- /**
- */
- public boolean checkPassword(final IEncrypter encrypter) {
- final String decryptedNode = decryptXml(encryptedContent, encrypter);
- if (decryptedNode == null || !decryptedNode.equals("") && !decryptedNode.startsWith("<node ")) {
- LogUtils.warn("Wrong password supplied (stored!=given).");
- return false;
- }
- setEncrypter(encrypter);
- return true;
- }
-
- /**
- * @param mapController
- * @return true, if the password was correct.
- */
- public boolean decrypt(final MapController mapController, final IEncrypter encrypter) {
- if (!checkPassword(encrypter)) {
- return false;
- }
- setAccessible(true);
- if (!isDecrypted) {
- try {
- final String childXml = decryptXml(encryptedContent, encrypter);
- final String[] childs = childXml.split(ClipboardController.NODESEPARATOR);
- for (int i = 0; i < childs.length; i++) {
- final String string = childs[i];
- if (string.length() == 0) {
- continue;
- }
- pasteXML(string, node, mapController);
- }
- isDecrypted = true;
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- setAccessible(false);
- return true;
- }
- }
- return true;
- }
-
- /**
- * @return null if the password is wrong.
- */
- private String decryptXml(final String encryptedString, final IEncrypter encrypter) {
- final String decrypted = encrypter.decrypt(encryptedString);
- return decrypted;
- }
-
- /**
- */
- private String encryptXml(final StringBuffer childXml) {
- try {
- final String encrypted = mEncrypter.encrypt(childXml.toString());
- return encrypted;
- }
- catch (final Exception e) {
- throw new IllegalArgumentException("Can't encrypt the node.", e);
- }
- }
-
- /**
- * @param mapController
- * @param mode
- * @throws IOException
- */
- private void generateEncryptedContent(final MapController mapController) throws IOException {
- final StringWriter sWriter = new StringWriter();
- for (final Iterator<NodeModel> i = node.getChildren().listIterator(); i.hasNext();) {
- final NodeModel child = i.next();
- mapController.getMapWriter().writeNodeAsXml(sWriter, child, MapWriter.Mode.FILE, true, true, false);
- if (i.hasNext()) {
- sWriter.write(ClipboardController.NODESEPARATOR);
- }
- }
- final StringBuffer childXml = sWriter.getBuffer();
- encryptedContent = encryptXml(childXml);
- }
-
- public String getEncryptedContent(final MapController mapController) {
- if (isDecrypted) {
- try {
- generateEncryptedContent(mapController);
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
- return encryptedContent;
- }
-
- /**
- * @return Returns the isAccessible (ie. if the node is decrypted
- * (isAccessible==true) or not).
- */
- public boolean isAccessible() {
- return isAccessible;
- }
-
- private void pasteXML(final String pasted, final NodeModel target, final MapController mapController) {
- try {
- final NodeModel node = mapController.getMapReader().createNodeTreeFromXml(target.getMap(),
- new StringReader(pasted), Mode.FILE);
- mapController.insertNodeIntoWithoutUndo(node, target, target.getChildCount());
- }
- catch (final Exception ee) {
- LogUtils.severe(ee);
- }
- }
-
- /**
- * @param isAccessible
- * The isAccessible to set.
- */
- public void setAccessible(final boolean isAccessible) {
- this.isAccessible = isAccessible;
- }
-
- public void setEncrypter(final IEncrypter encrypter) {
- mEncrypter = encrypter;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/FirstGroupNode.java b/freeplane/src/org/freeplane/features/map/FirstGroupNode.java
deleted file mode 100644
index f97816e..0000000
--- a/freeplane/src/org/freeplane/features/map/FirstGroupNode.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Apr 24, 2011
- */
- at NodeHookDescriptor(hookName = "FirstGroupNode", onceForMap = false)
-public class FirstGroupNode extends PersistentNodeHook implements IExtension{
- @Override
- protected IExtension createExtension(NodeModel node, XMLElement element) {
- return this;
- }
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/map/FoldingController.java b/freeplane/src/org/freeplane/features/map/FoldingController.java
deleted file mode 100644
index b5568e0..0000000
--- a/freeplane/src/org/freeplane/features/map/FoldingController.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.InputEvent;
-import java.awt.event.MouseWheelEvent;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.Action;
-import javax.swing.JButton;
-import javax.swing.JPopupMenu;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.ui.IMouseWheelEventHandler;
-import org.freeplane.core.ui.IUserInputListenerFactory;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-/**
- * @author foltin
- */
-public class FoldingController implements IMouseWheelEventHandler, IExtension {
-
- @SuppressWarnings("serial")
- private class FoldAllAction extends AMultipleNodeAction {
-
-
- public FoldAllAction() {
- super("FoldAllAction");
- }
-
- @Override
- public void actionPerformed(final ActionEvent e, final NodeModel node) {
- foldAll(node);
- }
- }
-
- @SuppressWarnings("serial")
- private class FoldOneLevelAction extends AMultipleNodeAction {
-
-
- public FoldOneLevelAction() {
- super("FoldOneLevelAction");
- }
-
- @Override
- public void actionPerformed(final ActionEvent e, final NodeModel node) {
- foldOneStage(node);
- }
- }
-
- @SuppressWarnings("serial")
- private class UnfoldAllAction extends AMultipleNodeAction {
-
-
- public UnfoldAllAction() {
- super("UnfoldAllAction");
- }
-
- @Override
- public void actionPerformed(final ActionEvent e, final NodeModel node) {
- unfoldAll(node);
- }
- }
-
- @SuppressWarnings("serial")
- private class UnfoldOneLevelAction extends AMultipleNodeAction {
-
- public UnfoldOneLevelAction() {
- super("UnfoldOneLevelAction");
- }
-
- @Override
- public void actionPerformed(final ActionEvent e, final NodeModel node) {
- unfoldOneStage(node);
- }
- }
-
- protected static Insets nullInsets = new Insets(0, 0, 0, 0);
-
- @SuppressWarnings("serial")
- private class FoldingPopupMenu extends JPopupMenu{
- final private NodeModel node;
- FoldingPopupMenu(NodeModel node){
- this.node = node;
- addAction(new UnfoldOneLevelPopupAction());
- addAction(new FoldOneLevelPopupAction());
- addAction(new UnfoldAllPopupAction());
- addAction(new FoldAllPopupAction());
- }
-
- private JButton addAction(Action a) {
- final JButton menuItem = new JButton(a);
- menuItem.setToolTipText(menuItem.getText());
- menuItem.setText(null);
- add(menuItem);
- menuItem.setMargin(nullInsets);
- return menuItem;
- }
-
- @SuppressWarnings("serial")
- private class FoldAllPopupAction extends FoldAllAction{
- @Override
- public void actionPerformed(final ActionEvent e){
- actionPerformed(e, node);
- }
- }
-
- @SuppressWarnings("serial")
- private class FoldOneLevelPopupAction extends FoldOneLevelAction{
- @Override
- public void actionPerformed(final ActionEvent e){
- actionPerformed(e, node);
- }
- }
-
- @SuppressWarnings("serial")
- private class UnfoldAllPopupAction extends UnfoldAllAction{
- @Override
- public void actionPerformed(final ActionEvent e){
- actionPerformed(e, node);
- }
- }
-
- @SuppressWarnings("serial")
- private class UnfoldOneLevelPopupAction extends UnfoldOneLevelAction{
- @Override
- public void actionPerformed(final ActionEvent e){
- actionPerformed(e, node);
- }
- }
- }
-
-
-
-// // final private Controller controller;
-
- public static void install( final FoldingController foldingController) {
- Controller.getCurrentModeController().addExtension(FoldingController.class, foldingController);
- }
- public FoldingController() {
- super();
- final ModeController modeController = Controller.getCurrentModeController();
- if(!modeController.getController().getViewController().isHeadless()){
- final IUserInputListenerFactory userInputListenerFactory = modeController.getUserInputListenerFactory();
- userInputListenerFactory.addMouseWheelEventHandler(this);
- for (final AFreeplaneAction annotatedAction : getAnnotatedActions()) {
- modeController.addAction(annotatedAction);
- }
- }
- }
-
- private List<AMultipleNodeAction> getAnnotatedActions() {
- final ArrayList<AMultipleNodeAction> result = new ArrayList<AMultipleNodeAction>();
- result.add(new UnfoldAllAction());
- result.add(new FoldAllAction());
- result.add(new UnfoldOneLevelAction());
- result.add(new FoldOneLevelAction());
- return result;
- }
-
- protected void foldAll(final NodeModel node) {
- final MapController modeController = Controller.getCurrentModeController().getMapController();
- setFolded(node, true);
- for (NodeModel child : modeController.childrenUnfolded(node)) {
- foldAll(child);
- }
- }
-
- /**
- * Unfolds every node that has only children which themselves have children.
- * As this function is a bit difficult to describe and perhaps not so
- * useful, it is currently not introduced into the menus.
- *
- * @param node
- * node to start from.
- */
- public void foldLastBranches(final NodeModel node) {
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- boolean nodeHasChildWhichIsLeave = false;
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- if (child.getChildCount() == 0) {
- nodeHasChildWhichIsLeave = true;
- }
- }
- setFolded(node, nodeHasChildWhichIsLeave);
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- foldLastBranches(child);
- }
- }
-
- protected void foldOneStage(final NodeModel node) {
- foldStageN(node, getMaxDepth(node) - 1);
- }
-
- public void foldStageN(final NodeModel node, final int stage) {
- final int k = depth(node);
- if (k < stage) {
- setFolded(node, false);
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- foldStageN(child, stage);
- }
- }
- else {
- foldAll(node);
- }
- }
-
- protected int getMaxDepth(final NodeModel node) {
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- if (mapController.isFolded(node) || !mapController.hasChildren(node)) {
- return depth(node);
- }
- int k = 0;
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- final int l = getMaxDepth(child);
- if (l > k) {
- k = l;
- }
- }
- return k;
- }
-
- public int getMinDepth(final NodeModel node) {
- final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
- if (encryptionModel != null && !encryptionModel.isAccessible() ) {
- return Integer.MAX_VALUE;
- }
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- if(node.containsExtension(HideChildSubtree.class))
- return depth(node) - 1;
- if (mapController.isFolded(node)) {
- return depth(node);
- }
- if (!mapController.hasChildren(node)||AlwaysUnfoldedNode.isConnectorNode(node)) {
- return Integer.MAX_VALUE;
- }
- int k = Integer.MAX_VALUE;
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- final int l = getMinDepth(child);
- if (l < k) {
- k = l;
- }
- }
- return k;
- }
-
- public boolean handleMouseWheelEvent(final MouseWheelEvent e) {
- if ((e.getModifiers() & InputEvent.ALT_MASK) != 0) {
- Controller controller = Controller.getCurrentController();
- final NodeModel rootNode = controller.getMap().getRootNode();
- if (e.getWheelRotation() > 0) {
- unfoldOneStage(rootNode);
- }
- else {
- final ModeController modeController = controller.getModeController();
- modeController.getMapController().select(controller.getMap().getRootNode());
- foldOneStage(rootNode);
- }
- return true;
- }
- return false;
- }
-
- private void setFolded(final NodeModel node, final boolean state) {
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- if (! node.isRoot()) {
- mapController.setFolded(node, state);
- }
- }
-
- public void unfoldAll(final NodeModel node) {
- setFolded(node, false);
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- unfoldAll(child);
- }
- }
-
- protected void unfoldOneStage(final NodeModel node) {
- int minDepth = getMinDepth(node);
- if (minDepth < Integer.MAX_VALUE) {
- minDepth++;
- }
- unfoldStageN(node, minDepth);
- }
-
- public void unfoldStageN(final NodeModel node, final int stage) {
- final int k = depth(node);
- if (k < stage) {
- setFolded(node, false);
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- unfoldStageN(child, stage);
- }
- }
- else {
- foldAll(node);
- }
- }
-
- private int depth(NodeModel node) {
- if (node.isRoot())
- return 0;
- final int parentDepth = depth(node.getParentNode());
- if (! node.isVisible() || AlwaysUnfoldedNode.isConnectorNode(node)) {
- return parentDepth;
- }
- else
- return parentDepth + 1;
- }
-
- public JPopupMenu createFoldingPopupMenu(NodeModel node){
- return new FoldingPopupMenu(node);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/FreeNode.java b/freeplane/src/org/freeplane/features/map/FreeNode.java
deleted file mode 100644
index d89df5a..0000000
--- a/freeplane/src/org/freeplane/features/map/FreeNode.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.nodelocation.LocationController;
-import org.freeplane.features.nodelocation.LocationModel;
-import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Apr 9, 2011
- */
- at NodeHookDescriptor(hookName = "FreeNode", onceForMap = false)
-public class FreeNode extends PersistentNodeHook implements IExtension{
-
- public static void install(){
- new FreeNode();
- };
-
-
- @Override
- protected IExtension createExtension(NodeModel node, XMLElement element) {
- return this;
- }
-
- @Override
- public void undoableToggleHook(NodeModel node, IExtension extension) {
- if(node.isRoot())
- return;
- final NodeModel[] selecteds = getSelectedNodes();
- ((MLocationController)LocationController.getController()).moveNodePosition(node, -1, LocationModel.HGAP, 0);
- super.undoableToggleHook(node, extension);
- if(isFreeNode(node)){
- MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- mapController.moveNode(node, 0);
- }
- Controller.getCurrentController().getSelection().replaceSelection(selecteds);
- }
-
-
- static public boolean isFreeNode(final NodeModel nodeModel) {
- return nodeModel.containsExtension(FreeNode.class);
- }
-}
-
diff --git a/freeplane/src/org/freeplane/features/map/IExtensionCopier.java b/freeplane/src/org/freeplane/features/map/IExtensionCopier.java
deleted file mode 100644
index d5d2cb2..0000000
--- a/freeplane/src/org/freeplane/features/map/IExtensionCopier.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.freeplane.features.map;
-
-
-public interface IExtensionCopier {
- void copy(Object key, NodeModel from, NodeModel to);
-
- void copy(NodeModel from, NodeModel to);
-
- void remove(Object key, NodeModel from);
-
- void remove(Object key, NodeModel from, NodeModel which);
-
- void resolveParentExtensions(Object key, NodeModel to);
-}
diff --git a/freeplane/src/org/freeplane/features/map/IMapChangeListener.java b/freeplane/src/org/freeplane/features/map/IMapChangeListener.java
deleted file mode 100644
index fc9e6c0..0000000
--- a/freeplane/src/org/freeplane/features/map/IMapChangeListener.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-/**
- * @author Dimitry Polivaev
- */
-public interface IMapChangeListener {
- public void mapChanged(MapChangeEvent event);
-
- void onNodeDeleted(NodeModel parent, NodeModel child, int index);
-
- void onNodeInserted(NodeModel parent, NodeModel child, int newIndex);
-
- void onNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex);
-
- void onPreNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex);
-
- void onPreNodeDelete(NodeModel oldParent, NodeModel selectedNode, int index);
-}
diff --git a/freeplane/src/org/freeplane/features/map/IMapSelection.java b/freeplane/src/org/freeplane/features/map/IMapSelection.java
deleted file mode 100644
index e95a351..0000000
--- a/freeplane/src/org/freeplane/features/map/IMapSelection.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.util.List;
-import java.util.Set;
-
-
-/**
- * @author Dimitry Polivaev
- * 04.01.2009
- */
-public interface IMapSelection {
- public void centerNode(final NodeModel node);
-
- public NodeModel getSelected();
-
- public Set<NodeModel> getSelection();
-
- public List<NodeModel> getOrderedSelection();
-
- public List<NodeModel> getSortedSelection(boolean differentSubtrees);
-
- public boolean isSelected(final NodeModel node);
-
- public void keepNodePosition(final NodeModel node, float horizontalPoint, float verticalPoint);
-
- public void makeTheSelected(final NodeModel node);
-
- public void scrollNodeToVisible(NodeModel selected);
-
- public void selectAsTheOnlyOneSelected(final NodeModel node);
-
- public void selectBranch(final NodeModel node, final boolean extend);
-
- public void selectContinuous(final NodeModel node);
-
- public void selectRoot();
-
- public void setSiblingMaxLevel(int nodeLevel);
-
- public int size();
-
- public void toggleSelected(final NodeModel node);
-
- public void replaceSelection(NodeModel[] nodes);
-}
diff --git a/freeplane/src/org/freeplane/features/map/MapController.java b/freeplane/src/org/freeplane/features/map/MapController.java
deleted file mode 100644
index b4025c5..0000000
--- a/freeplane/src/org/freeplane/features/map/MapController.java
+++ /dev/null
@@ -1,963 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.awt.EventQueue;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.Writer;
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.swing.Action;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.UnknownElementWriter;
-import org.freeplane.core.io.UnknownElements;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.features.map.NodeModel.NodeChangeType;
-import org.freeplane.features.mode.AController.IActionOnChange;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.SelectionController;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.main.addons.AddOnsController;
-import org.freeplane.n3.nanoxml.XMLException;
-import org.freeplane.n3.nanoxml.XMLParseException;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MapController extends SelectionController implements IExtension{
- public enum Direction {
- BACK, BACK_N_FOLD, FORWARD, FORWARD_N_FOLD
- }
-
- private static class ActionEnablerOnChange implements INodeChangeListener, INodeSelectionListener, IActionOnChange, IMapChangeListener {
- final AFreeplaneAction action;
-
- public ActionEnablerOnChange(final AFreeplaneAction action) {
- super();
- this.action = action;
- }
-
- public AFreeplaneAction getAction() {
- return action;
- }
-
- public void nodeChanged(final NodeChangeEvent event) {
- action.setEnabled();
- }
-
- public void onDeselect(final NodeModel node) {
- }
-
- public void onSelect(final NodeModel node) {
- action.setEnabled();
- }
-
- public void mapChanged(MapChangeEvent event) {
- action.setEnabled();
- }
-
- public void onNodeDeleted(NodeModel parent, NodeModel child, int index) {
- action.setEnabled();
- }
-
- public void onNodeInserted(NodeModel parent, NodeModel child,
- int newIndex) {
- action.setEnabled();
- }
-
- public void onNodeMoved(NodeModel oldParent, int oldIndex,
- NodeModel newParent, NodeModel child, int newIndex) {
- action.setEnabled();
- }
-
- public void onPreNodeMoved(NodeModel oldParent, int oldIndex,
- NodeModel newParent, NodeModel child, int newIndex) {
- }
-
- public void onPreNodeDelete(NodeModel oldParent,
- NodeModel selectedNode, int index) {
- setActionEnabled();
- }
-
- private void setActionEnabled() {
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- if (selection == null || selection.getSelected() == null) {
- return;
- }
- action.setEnabled();
- }
- }
-
- private static class ActionSelectorOnChange implements INodeChangeListener, INodeSelectionListener,
- IActionOnChange, IMapChangeListener {
- final AFreeplaneAction action;
-
- public ActionSelectorOnChange(final AFreeplaneAction action) {
- super();
- this.action = action;
- }
-
- public AFreeplaneAction getAction() {
- return action;
- }
-
- public void nodeChanged(final NodeChangeEvent event) {
- if (NodeChangeType.REFRESH.equals(event.getProperty())) {
- return;
- }
- setActionSelected();
- }
-
- private void setActionSelected() {
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- if (selection == null || selection.getSelected() == null) {
- return;
- }
- action.setSelected();
- }
-
- public void onDeselect(final NodeModel node) {
- }
-
- public void onSelect(final NodeModel node) {
- setActionSelected();
- }
-
- public void mapChanged(final MapChangeEvent event) {
- setActionSelected();
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- setActionSelected();
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
- setActionSelected();
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- setActionSelected();
- }
-
- public void onPreNodeDelete(final NodeModel oldParent, final NodeModel selectedNode, final int index) {
- setActionSelected();
- }
-
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- setActionSelected();
- }
- }
-
- public static void install() {
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(8,
- new NodeLevelConditionController());
- }
-
-
- public void addListenerForAction(final AFreeplaneAction action) {
- if (AFreeplaneAction.checkEnabledOnChange(action)) {
- final ActionEnablerOnChange listener = new ActionEnablerOnChange(action);
- addNodeSelectionListener(listener);
- addNodeChangeListener(listener);
- addMapChangeListener(listener);
- }
- if (AFreeplaneAction.checkSelectionOnChange(action)) {
- final ActionSelectorOnChange listener = new ActionSelectorOnChange(action);
- addNodeSelectionListener(listener);
- addNodeChangeListener(listener);
- addMapChangeListener(listener);
- }
- }
-
- public void removeListenerForAction(final AFreeplaneAction action) {
- if (AFreeplaneAction.checkEnabledOnChange(action)) {
- removeNodeSelectionListener(ActionEnablerOnChange.class, action);
- removeNodeChangeListener(ActionEnablerOnChange.class, action);
- removeMapChangeListener(ActionEnablerOnChange.class, action);
- }
- if (AFreeplaneAction.checkSelectionOnChange(action)) {
- removeNodeSelectionListener(ActionSelectorOnChange.class, action);
- removeNodeChangeListener(ActionSelectorOnChange.class, action);
- removeMapChangeListener(ActionSelectorOnChange.class, action);
- }
- }
-
- /**
- * This class sortes nodes by ascending depth of their paths to root. This
- * is useful to assure that children are cutted <b>before </b> their
- * fathers!!!. Moreover, it sorts nodes with the same depth according to
- * their position relative to each other.
- */
- static private class NodesDepthComparator implements Comparator<NodeModel> {
- public NodesDepthComparator() {
- }
-
- /* the < relation. */
- public int compare(final NodeModel n1, final NodeModel n2) {
- final NodeModel[] path1 = n1.getPathToRoot();
- final NodeModel[] path2 = n2.getPathToRoot();
- final int depth = path1.length - path2.length;
- if (depth > 0) {
- return -1;
- }
- if (depth < 0) {
- return 1;
- }
- if (n1.isRoot()) {
- return 0;
- }
- return n1.getParentNode().getChildPosition(n1) - n2.getParentNode().getChildPosition(n2);
- }
- }
-
-// final private Controller controller;
- protected final Collection<IMapChangeListener> mapChangeListeners;
- final private Collection<IMapLifeCycleListener> mapLifeCycleListeners;
- final private MapReader mapReader;
- final private MapWriter mapWriter;
-// final private ModeController modeController;
- final private LinkedList<INodeChangeListener> nodeChangeListeners;
- final private ReadManager readManager;
- private final WriteManager writeManager;
-
- public MapController(ModeController modeController) {
- super();
- modeController.setMapController(this);
-// this.modeController = modeController;
- mapLifeCycleListeners = new LinkedList<IMapLifeCycleListener>();
- writeManager = new WriteManager();
- mapWriter = new MapWriter(this);
- readManager = new ReadManager();
- mapReader = new MapReader(readManager);
- readManager.addElementHandler("map", mapReader);
- readManager.addAttributeHandler("map", "version", new IAttributeHandler() {
- public void setAttribute(final Object node, final String value) {
- }
- });
- readManager.addAttributeHandler("map", "dialect", new IAttributeHandler() {
- public void setAttribute(final Object node, final String value) {
- }
- });
- writeManager.addElementWriter("map", mapWriter);
- writeManager.addAttributeWriter("map", mapWriter);
- final UnknownElementWriter unknownElementWriter = new UnknownElementWriter();
- writeManager.addExtensionAttributeWriter(UnknownElements.class, unknownElementWriter);
- writeManager.addExtensionElementWriter(UnknownElements.class, unknownElementWriter);
- mapChangeListeners = new LinkedList<IMapChangeListener>();
- nodeChangeListeners = new LinkedList<INodeChangeListener>();
- createActions();
- }
-
- public void setFolded(final NodeModel node, final boolean folded) {
- if (node == null) {
- throw new IllegalArgumentException("setFolded was called with a null node.");
- }
- if (node.getChildCount() == 0)
- return;
- final boolean unfold = ! folded;
- final boolean childShown = unfoldHiddenChildren(node);
- boolean mapChanged = false;
- if (unfold && unfoldInvisibleChildren(node, true))
- mapChanged = true;
- if (node.isFolded() != folded && !(node.isRoot() && folded)){
- node.setFolded(folded);
- mapChanged = true;
- }
- if(mapChanged){
- fireFoldingChanged(node);
- }
- else if(childShown)
- fireNodeUnfold(node);
- }
-
- public boolean showNextChild(final NodeModel node) {
- if (node.getChildCount() == 0)
- return false;
- final boolean unfold = node.isFolded();
- if (unfold){
- for(NodeModel child:childrenUnfolded(node)){
- child.addExtension(HideChildSubtree.instance);
- }
- node.setFolded(false);
- }
- boolean childMadeVisible = false;
- for(NodeModel child:childrenUnfolded(node)){
- if (child.removeExtension(HideChildSubtree.instance) &&
- (child.isVisible() || unfoldInvisibleChildren(child, true))){
- childMadeVisible = true;
- break;
- }
- }
- if(childMadeVisible){
- fireNodeUnfold(node);
- }
- return childMadeVisible;
- }
-
-
- private void fireNodeUnfold(final NodeModel node) {
- node.fireNodeChanged(new NodeChangeEvent(node, NodeChangeType.FOLDING, Boolean.TRUE,
- Boolean.FALSE));
- }
-
- public boolean hasHiddenChildren(final NodeModel node){
- if(! node.hasChildren())
- return false;
- if(node.isFolded())
- return true;
- for(NodeModel child:childrenUnfolded(node)){
- if (child.containsExtension(HideChildSubtree.class)){
- return true;
- }
- }
- return false;
- }
-
- private void fireFoldingChanged(final NodeModel node) {
- final ResourceController resourceController = ResourceController.getResourceController();
- if (resourceController.getProperty(NodeBuilder.RESOURCES_SAVE_FOLDING).equals(
- NodeBuilder.RESOURCES_ALWAYS_SAVE_FOLDING)) {
- final MapModel map = node.getMap();
- setSaved(map, false);
- }
- }
-
-
- private boolean unfoldHiddenChildren(NodeModel node) {
- final List<NodeModel> children = childrenFolded(node);
- boolean changed = false;
- for (NodeModel child : children){
- if(child.removeExtension(HideChildSubtree.class) != null)
- changed = true;
- }
- return changed;
- }
-
-
- private boolean unfoldInvisibleChildren(final NodeModel node, final boolean reportUnfolded) {
- boolean visibleFound = false;
- boolean unfolded = false;
- for(int i = 0; i < node.getChildCount(); i++){
- final NodeModel child = (NodeModel) node.getChildAt(i);
- if(child.isVisible())
- visibleFound = true;
- else if(unfoldInvisibleChildren(child, false) && child.isFolded()){
- visibleFound = unfolded = true;
- child.setFolded(false);
- }
- }
- if(reportUnfolded)
- return unfolded;
- else
- return visibleFound;
- }
-
- public void addMapChangeListener(final IMapChangeListener listener) {
- mapChangeListeners.add(listener);
- }
-
- public void addMapLifeCycleListener(final IMapLifeCycleListener listener) {
- mapLifeCycleListeners.add(listener);
- }
-
- public void addNodeChangeListener(final INodeChangeListener listener) {
- nodeChangeListeners.add(listener);
- }
-
- public void centerNode(final NodeModel node) {
- Controller.getCurrentController().getSelection().centerNode(node);
- }
-
- public List<NodeModel> childrenFolded(final NodeModel node) {
- if (node.isFolded()) {
- final List<NodeModel> empty = Collections.emptyList();
- return empty;
- }
- return childrenUnfolded(node);
- }
-
- public List<NodeModel> childrenUnfolded(final NodeModel node) {
- final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
- if (encryptionModel != null && !encryptionModel.isAccessible()) {
- final List<NodeModel> empty = Collections.emptyList();
- return empty;
- }
- return node.getChildren();
- }
-
- /**
- * Return false if user has canceled.
- */
- public boolean close(final MapModel map, final boolean force) {
- fireMapRemoved(map);
- map.destroy();
- return true;
- }
-
- /**
- * @param modeController
- *
- */
- private void createActions() {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addAction(new ToggleFoldedAction());
- modeController.addAction(new ToggleChildrenFoldedAction());
- modeController.addAction(new ShowNextChildAction());
- modeController.addAction(new GotoNodeAction());
- }
-
- public void displayNode(final NodeModel node) {
- displayNode(node, null);
- }
-
- /**
- * Display a node in the display (used by find and the goto action by arrow
- * link actions).
- */
- public void displayNode(final NodeModel node, final ArrayList<NodeModel> nodesUnfoldedByDisplay) {
- if (!node.isVisible()) {
- node.getFilterInfo().reset();
- nodeRefresh(node);
- }
- final NodeModel[] path = node.getPathToRoot();
- for (int i = 0; i < path.length - 1; i++) {
- final NodeModel nodeOnPath = path[i];
- if (nodesUnfoldedByDisplay != null && isFolded(nodeOnPath)) {
- nodesUnfoldedByDisplay.add(nodeOnPath);
- }
- setFolded(nodeOnPath, false);
- }
- }
-
- public void fireMapChanged(final MapChangeEvent event) {
- final MapModel map = event.getMap();
- if (map != null) {
- setSaved(map, false);
- }
- final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
- for (final IMapChangeListener next : list) {
- next.mapChanged(event);
- }
- if (map != null) {
- map.fireMapChangeEvent(event);
- }
- }
-
- public void fireMapCreated(final MapModel map) {
- final IMapLifeCycleListener[] list = mapLifeCycleListeners.toArray(new IMapLifeCycleListener[]{});
- for (final IMapLifeCycleListener next : list) {
- next.onCreate(map);
- }
- }
-
- protected void fireMapRemoved(final MapModel map) {
- final IMapLifeCycleListener[] list = mapLifeCycleListeners.toArray(new IMapLifeCycleListener[]{});
- for (final IMapLifeCycleListener next : list) {
- next.onRemove(map);
- }
- }
-
- private void fireNodeChanged(final NodeModel node, final NodeChangeEvent nodeChangeEvent) {
- final INodeChangeListener[] list = nodeChangeListeners.toArray(new INodeChangeListener[]{});
- for (final INodeChangeListener next : list) {
- next.nodeChanged(nodeChangeEvent);
- }
- node.fireNodeChanged(nodeChangeEvent);
- }
-
- protected void fireNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
- for (final IMapChangeListener next : list) {
- next.onNodeDeleted(parent, child, index);
- }
- child.getMap().unregistryNodes(child);
- }
-
- protected void fireNodeInserted(final NodeModel parent, final NodeModel child, final int index) {
- parent.getMap().registryNodeRecursive(child);
- final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
- for (final IMapChangeListener next : list) {
- next.onNodeInserted(parent, child, index);
- }
- }
-
- protected void fireNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
- for (final IMapChangeListener next : list) {
- next.onNodeMoved(oldParent, oldIndex, newParent, child, newIndex);
- }
- }
-
- protected void firePreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
- for (final IMapChangeListener next : list) {
- next.onPreNodeMoved(oldParent, oldIndex, newParent, child, newIndex);
- }
- }
-
- protected void firePreNodeDelete(final NodeModel parent, final NodeModel selectedNode, final int index) {
- final IMapChangeListener[] list = mapChangeListeners.toArray(new IMapChangeListener[]{});
- for (final IMapChangeListener next : list) {
- next.onPreNodeDelete(parent, selectedNode, index);
- }
- }
-
- public void getFilteredXml(final MapModel map, final Writer fileout, final Mode mode, final boolean forceFormat)
- throws IOException {
- getMapWriter().writeMapAsXml(map, fileout, mode, false, forceFormat);
- }
-
- private Boolean getCommonFoldingState(final Collection<NodeModel> list) {
- Boolean state = null;
- for(final NodeModel node : list){
- if (node.getChildCount() == 0) {
- continue;
- }
- if (state == null) {
- state = hasHiddenChildren(node);
- }
- else {
- if (hasHiddenChildren(node) != state) {
- // no common state
- return null;
- }
- }
- }
- return state;
- }
-
- public MapReader getMapReader() {
- return mapReader;
- }
-
- public MapWriter getMapWriter() {
- return mapWriter;
- }
-
- /*
- * Helper methods
- */
- public NodeModel getNodeFromID(final String nodeID) {
- final MapModel map = Controller.getCurrentController().getMap();
- final NodeModel node = map.getNodeForID(nodeID);
- return node;
- }
-
- public String getNodeID(final NodeModel selected) {
- return selected.createID();
- }
-
- public ReadManager getReadManager() {
- return readManager;
- }
-
- public NodeModel getRootNode() {
- final MapModel map = Controller.getCurrentController().getMap();
- return map.getRootNode();
- }
-
- public NodeModel getSelectedNode() {
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- if(selection != null)
- return selection.getSelected();
- return null;
- }
-
- /**
- * fc, 24.1.2004: having two methods getSelecteds with different return
- * values (linkedlists of models resp. views) is asking for trouble. @see
- * MapView
- *
- * @return returns a list of MindMapNode s.
- */
- public Collection<NodeModel> getSelectedNodes() {
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- if (selection == null) {
- final List<NodeModel> list = Collections.emptyList();
- return list;
- }
- return selection.getSelection();
- }
-
- public WriteManager getWriteManager() {
- return writeManager;
- }
-
- public boolean hasChildren(final NodeModel node) {
- final EncryptionModel encryptionModel = EncryptionModel.getModel(node);
- if (encryptionModel != null && !encryptionModel.isAccessible()) {
- return false;
- }
- return node.hasChildren();
- }
-
- /**
- * True iff one of node's <i>strict</i> descendants is folded. A node N is
- * not its strict descendant - the fact that node itself is folded is not
- * sufficient to return true.
- */
- public boolean hasFoldedStrictDescendant(final NodeModel node) {
- for (final NodeModel child : childrenUnfolded(node)) {
- if (isFolded(child) || hasFoldedStrictDescendant(child)) {
- return true;
- }
- }
- return false;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.modes.MindMap#insertNodeInto(javax.swing.tree.MutableTreeNode,
- * javax.swing.tree.MutableTreeNode)
- */
- public void insertNodeIntoWithoutUndo(final NodeModel newChild, final NodeModel parent) {
- insertNodeIntoWithoutUndo(newChild, parent, parent.getChildCount());
- }
-
- public void insertNodeIntoWithoutUndo(final NodeModel newNode, final NodeModel parent, final int index) {
- if(parent.getParent() != null){
- newNode.setLeft(parent.isLeft());
- }
- parent.insert(newNode, index);
- fireNodeInserted(parent, newNode, index);
- }
-
- public boolean isFolded(final NodeModel node) {
- return node.isFolded();
- }
-
- /**@throws XMLException
- * @deprecated -- use MapIO*/
- @Deprecated
- public boolean newMap(final URL url) throws FileNotFoundException, XMLParseException,IOException, URISyntaxException, XMLException{
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- if (mapViewManager.tryToChangeToMapView(url))
- return false;
- try {
- if (AddOnsController.getController().installIfAppropriate(url))
- return false;
- Controller.getCurrentController().getViewController().setWaitingCursor(true);
- final MapModel newModel = new MapModel();
- UrlManager.getController().loadCatchExceptions(url, newModel);
- newModel.setReadOnly(true);
- newModel.setSaved(true);
- fireMapCreated(newModel);
- newMapView(newModel);
- return true;
- }
- finally {
- Controller.getCurrentController().getViewController().setWaitingCursor(false);
- }
- }
-
-
- public void openMapSelectReferencedNode(final URL url) throws FileNotFoundException,
- XMLParseException, IOException, URISyntaxException, XMLException, MalformedURLException {
- String nodeReference = url.getRef();
- if(nodeReference != null){
- newMap(new URL(url.getProtocol(), url.getHost(), url.getPort(), url.getPath()));
- select(getNodeFromID(nodeReference));
- }
- else{
- newMap(url);
- }
- }
-
- public void newMapView(final MapModel mapModel) {
- Controller.getCurrentController().getMapViewManager().newMapView(mapModel, Controller.getCurrentModeController());
- }
-
- public MapModel newMap() {
- final MapModel newModel = newModel();
- fireMapCreated(newModel);
- newMapView(newModel);
- return newModel;
- }
-
- public MapModel newModel() {
- final MapModel mindMapMapModel = new MapModel();
- mindMapMapModel.createNewRoot();
- fireMapCreated(mindMapMapModel);
- return mindMapMapModel;
- }
-
- public NodeModel newNode(final Object userObject, final MapModel map) {
- return new NodeModel(userObject, map);
- }
-
- @Deprecated
- public void nodeChanged(final NodeModel node) {
- nodeChanged(node, NodeModel.UNKNOWN_PROPERTY, null, null);
- }
-
- public void nodeChanged(final NodeModel node, final Object property, final Object oldValue, final Object newValue) {
- setSaved(node.getMap(), false);
- nodeRefresh(node, property, oldValue, newValue, true);
- }
-
- @Deprecated
- public void nodeRefresh(final NodeModel node) {
- nodeRefresh(node, NodeModel.UNKNOWN_PROPERTY, null, null);
- }
-
- public void nodeRefresh(final NodeModel node, final Object property, final Object oldValue, final Object newValue) {
- nodeRefresh(node, property, oldValue, newValue, false);
- }
-
- private void nodeRefresh(final NodeModel node, final Object property, final Object oldValue, final Object newValue,
- final boolean isUpdate) {
- if (mapReader.isMapLoadingInProcess()) {
- return;
- }
- if (isUpdate && !Controller.getCurrentModeController().isUndoAction()) {
- final HistoryInformationModel historyInformation = node.getHistoryInformation();
- if (historyInformation != null) {
- final IActor historyActor = new IActor() {
- private final Date lastModifiedAt = historyInformation.getLastModifiedAt();
- private final Date now = new Date();
-
- public void undo() {
- setDate(historyInformation, lastModifiedAt);
- }
-
- private void setDate(final HistoryInformationModel historyInformation, final Date lastModifiedAt) {
- final Date oldLastModifiedAt = historyInformation.getLastModifiedAt();
- historyInformation.setLastModifiedAt(lastModifiedAt);
- final NodeChangeEvent nodeChangeEvent = new NodeChangeEvent(node,
- HistoryInformationModel.class, oldLastModifiedAt, lastModifiedAt);
- fireNodeChanged(node, nodeChangeEvent);
- }
-
- public String getDescription() {
- return null;
- }
-
- public void act() {
- setDate(historyInformation, now);
- }
- };
- Controller.getCurrentModeController().execute(historyActor, node.getMap());
- }
- }
- final NodeChangeEvent nodeChangeEvent = new NodeChangeEvent(node, property, oldValue, newValue);
- fireNodeChanged(node, nodeChangeEvent);
- }
-
- // nodes may only be refreshed by their own ModeController, so we have to store that too
- private final ConcurrentHashMap<NodeRefreshKey, NodeRefreshValue> nodesToRefresh = new ConcurrentHashMap<NodeRefreshKey, NodeRefreshValue>();
-
- private static class NodeRefreshKey{
- final NodeModel node;
- final Object property;
- public NodeRefreshKey(NodeModel node, Object property) {
- super();
- this.node = node;
- this.property = property;
- }
- @Override
- public int hashCode() {
- return node.hashCode() + propertyHash();
- }
- protected int propertyHash() {
- return property != null ? 37 * property.hashCode() : 0;
- }
- @Override
- public boolean equals(Object obj) {
- if (obj == null || ! obj.getClass().equals(getClass()))
- return false;
- NodeRefreshKey key2 = (NodeRefreshKey)obj;
- return node.equals(key2.node) && (property == key2.property || property != null && property.equals(key2.property));
- }
- }
-
- private static class NodeRefreshValue{
- final ModeController controller;
- Object oldValue;
- Object newValue;
- public NodeRefreshValue(ModeController controller,
- Object oldValue, Object newValue) {
- super();
- this.controller = controller;
- this.oldValue = oldValue;
- this.newValue = newValue;
- }
-
- }
-
- /** optimization of nodeRefresh() as it handles multiple nodes in one Runnable, even nodes that weren't on the
- * list when the thread was started.*/
- public void delayedNodeRefresh(final NodeModel node, final Object property, final Object oldValue,
- final Object newValue) {
- final boolean startThread = nodesToRefresh.isEmpty();
- final NodeRefreshValue value = new NodeRefreshValue(Controller.getCurrentModeController(), oldValue, newValue);
- final NodeRefreshKey key = new NodeRefreshKey(node, property);
- final NodeRefreshValue old = nodesToRefresh.put(key, value);
- if(old != null && old.newValue != value.newValue){
- old.newValue = value.newValue;
- nodesToRefresh.put(key, old);
- }
- if (startThread) {
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- final ModeController currentModeController = Controller.getCurrentModeController();
- final Iterator<Entry<NodeRefreshKey, NodeRefreshValue>> it = nodesToRefresh.entrySet().iterator();
- while (it.hasNext()) {
- final Entry<NodeRefreshKey, NodeRefreshValue> entry = it.next();
- final NodeRefreshValue info = entry.getValue();
- if (info.controller == currentModeController){
- final NodeRefreshKey key = entry.getKey();
- currentModeController.getMapController().nodeRefresh(key.node, key.property, info.oldValue, info.newValue);
- }
- it.remove();
- }
- }
- });
- }
- }
-
- public void removeMapChangeListener(final IMapChangeListener listener) {
- mapChangeListeners.remove(listener);
- }
-
- public void removeMapLifeCycleListener(final IMapLifeCycleListener listener) {
- mapLifeCycleListeners.remove(listener);
- }
-
- void removeNodeChangeListener(final Class<? extends IActionOnChange> clazz, final Action action) {
- final Iterator<INodeChangeListener> iterator = nodeChangeListeners.iterator();
- while (iterator.hasNext()) {
- final INodeChangeListener next = iterator.next();
- if (next instanceof IActionOnChange && ((IActionOnChange) next).getAction() == action) {
- iterator.remove();
- return;
- }
- }
- }
-
- void removeMapChangeListener(final Class<? extends IActionOnChange> clazz, final Action action) {
- final Iterator<IMapChangeListener> iterator = mapChangeListeners.iterator();
- while (iterator.hasNext()) {
- final IMapChangeListener next = iterator.next();
- if (next instanceof IActionOnChange && ((IActionOnChange) next).getAction() == action) {
- iterator.remove();
- return;
- }
- }
- }
-
- public void removeNodeChangeListener(final INodeChangeListener listener) {
- nodeChangeListeners.remove(listener);
- }
-
- void removeNodeSelectionListener(final Class<? extends IActionOnChange> clazz, final Action action) {
- final Iterator<INodeSelectionListener> iterator = getNodeSelectionListeners().iterator();
- while (iterator.hasNext()) {
- final INodeSelectionListener next = iterator.next();
- if (next instanceof IActionOnChange && ((IActionOnChange) next).getAction() == action) {
- iterator.remove();
- return;
- }
- }
- }
-
- public Collection<IMapChangeListener> getMapChangeListeners() {
- return Collections.unmodifiableCollection(mapChangeListeners);
- }
-
- public Collection<IMapLifeCycleListener> getMapLifeCycleListeners() {
- return Collections.unmodifiableCollection(mapLifeCycleListeners);
- }
-
- public Collection<INodeChangeListener> getNodeChangeListeners() {
- return Collections.unmodifiableCollection(nodeChangeListeners);
- }
-
- public void select(final NodeModel node) {
- displayNode(node);
- Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(node);
- }
-
- public void selectMultipleNodes(final NodeModel focussed, final Collection<NodeModel> selecteds) {
- for (final NodeModel node : selecteds) {
- displayNode(node);
- }
- select(focussed);
- for (final NodeModel node : selecteds) {
- Controller.getCurrentController().getSelection().makeTheSelected(node);
- }
- }
-
- public void setSaved(final MapModel mapModel, final boolean saved) {
- mapModel.setSaved(saved);
- }
-
-
- public void sortNodesByDepth(final List<NodeModel> collection) {
- Collections.sort(collection, new NodesDepthComparator());
- }
-
- public void toggleFolded() {
- final Collection<NodeModel> selectedNodes = getSelectedNodes();
- toggleFolded(selectedNodes);
- }
-
- public void toggleFolded(final Collection<NodeModel> collection) {
- Boolean isFolded = getCommonFoldingState(collection);
- final boolean shouldBeFolded = isFolded != null ? ! isFolded : true;
- final NodeModel nodes[] = collection.toArray(new NodeModel[]{});
- for (final NodeModel node:nodes) {
- setFolded(node, shouldBeFolded);
- }
- }
-
-
- public void toggleFolded(final NodeModel node) {
- setFolded(node, ! node.isFolded());
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/map/MapModel.java b/freeplane/src/org/freeplane/features/map/MapModel.java
deleted file mode 100644
index 0c21a8a..0000000
--- a/freeplane/src/org/freeplane/features/map/MapModel.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.io.File;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-
-import org.freeplane.core.extension.ExtensionContainer;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.Filter;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.icon.IconRegistry;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-public class MapModel {
- private static Random ran = new Random();
- private static final int UNDEFINED_NODE_ID = 2000000000;
- /**
- * denotes the amount of changes since the last save. The initial value is
- * zero, such that new models are not to be saved.
- */
- protected int changesPerformedSinceLastSave = 0;
- private final ExtensionContainer extensionContainer;
- private Filter filter = null;
- final private IconRegistry iconRegistry;
- final private List<IMapChangeListener> listeners;
- final private Map<String, NodeModel> nodes;
- private boolean readOnly = false;
- private NodeModel root;
- private URL url;
-
- public MapModel() {
- extensionContainer = new ExtensionContainer(new HashMap<Class<? extends IExtension>, IExtension>());
- this.root = null;
- listeners = new LinkedList<IMapChangeListener>();
- nodes = new HashMap<String, NodeModel>();
- final FilterController filterController = FilterController.getCurrentFilterController();
- if (filterController != null) {
- filter = filterController.createTransparentFilter();
- }
- final ModeController modeController = Controller.getCurrentModeController();
- iconRegistry = new IconRegistry(modeController.getMapController(), this);
- }
-
- public void createNewRoot() {
- root = new NodeModel(TextUtils.getText("new_mindmap"), this);
- }
-
- public void addExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
- extensionContainer.addExtension(clazz, extension);
- }
-
- public void addExtension(final IExtension extension) {
- extensionContainer.addExtension(extension);
- }
-
- public IExtension putExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
- return extensionContainer.putExtension(clazz, extension);
- }
-
- public IExtension putExtension(final IExtension extension) {
- return extensionContainer.putExtension(extension);
- }
-
- public boolean containsExtension(Class<? extends IExtension> clazz) {
- return extensionContainer.containsExtension(clazz);
- }
-
- public void addMapChangeListener(final IMapChangeListener listener) {
- listeners.add(listener);
- }
-
- public void destroy() {
- }
-
- public void fireMapChangeEvent(final MapChangeEvent event) {
- for (final IMapChangeListener listener : listeners) {
- listener.mapChanged(event);
- }
- }
-
- public String generateNodeID(final String proposedID) {
- if (proposedID != null && !"".equals(proposedID) && getNodeForID(proposedID) == null) {
- return proposedID;
- }
- String returnValue;
- do {
- final String prefix = "ID_";
- /*
- * The prefix is to enable the id to be an ID in the sense of
- * XML/DTD.
- */
- returnValue = prefix + Integer.toString(ran.nextInt(UNDEFINED_NODE_ID));
- } while (nodes.containsKey(returnValue));
- return returnValue;
- }
-
- public <T extends IExtension> T getExtension(final Class<T> clazz) {
- return extensionContainer.getExtension(clazz);
- }
-
- public Map<Class<? extends IExtension>, IExtension> getExtensions() {
- return extensionContainer.getExtensions();
- }
-
- /**
- * Change this to always return null if your model doesn't support files.
- */
- public File getFile() {
- try {
- return url != null && url.getProtocol().equals("file") ? Compat.urlToFile(url) : null;
- }
- catch (URISyntaxException e) {
- return null;
- }
- }
-
- public Filter getFilter() {
- return filter;
- }
-
- public IconRegistry getIconRegistry() {
- return iconRegistry;
- }
-
- /**
- * @param nodeID
- * @return
- */
- public NodeModel getNodeForID(final String nodeID) {
- final NodeModel node = nodes.get(nodeID);
- return node;
- }
-
- public int getNumberOfChangesSinceLastSave() {
- return changesPerformedSinceLastSave;
- }
-
- public NodeModel getRootNode() {
- return root;
- }
-
- public String getTitle() {
- if (getURL() == null) {
- return null;
- }
- else {
- return getURL().toString();
- }
- }
-
- /**
- * Get the value of url.
- *
- * @return Value of url.
- */
- public URL getURL() {
- return url;
- }
-
- public boolean isReadOnly() {
- return readOnly;
- }
-
- public boolean isSaved() {
- return changesPerformedSinceLastSave == 0;
- }
-
- /**
- * @param value
- * @param nodeModel
- */
- void registryID(final String value, final NodeModel nodeModel) {
- final NodeModel old = nodes.put(value, nodeModel);
- if (null != old && nodeModel != old) {
- throw new RuntimeException("id " + value + " already registered");
- }
- }
-
- /**
- * @param nodeModel
- * @return
- */
- public String registryNode(final NodeModel nodeModel) {
- final String id = generateNodeID(nodeModel.getID());
- registryID(id, nodeModel);
- return id;
- }
-
- public void registryNodeRecursive(final NodeModel nodeModel) {
- registryNodeRecursive(nodeModel, 0);
- }
-
- private void registryNodeRecursive(final NodeModel nodeModel, final int depth) {
- if (depth > 400) {
- throw new StackOverflowError();
- }
- final String id = nodeModel.getID();
- if (id != null) {
- registryID(id, nodeModel);
- }
- final Iterator<NodeModel> iterator = nodeModel.getChildren().iterator();
- while (iterator.hasNext()) {
- final NodeModel next = iterator.next();
- registryNodeRecursive(next, depth + 1);
- }
- }
-
- public IExtension removeExtension(final Class<? extends IExtension> clazz) {
- return extensionContainer.removeExtension(clazz);
- }
-
- public boolean removeExtension(final IExtension extension) {
- return extensionContainer.removeExtension(extension);
- };
-
- public void removeMapChangeListener(final IMapChangeListener listener) {
- listeners.remove(listener);
- };
-
- public void setFilter(final Filter filter) {
- this.filter = filter;
- }
-
- public void setReadOnly(final boolean readOnly) {
- this.readOnly = readOnly;
- }
-
- public void setRoot(final NodeModel root) {
- this.root = root;
- root.setMap(this);
- }
-
- /**
- * Counts the amount of actions performed.
- *
- * @param saved
- * true if the file was saved recently. False otherwise.
- */
- public void setSaved(final boolean saved) {
- if (saved) {
- changesPerformedSinceLastSave = 0;
- }
- else {
- ++changesPerformedSinceLastSave;
- }
- }
-
- /**
- * Set the value of url.
- *
- * @param v
- * Value to assign to url.
- */
- public void setURL(final URL v) {
- url = v;
- }
-
- public void unregistryNodes(final NodeModel node) {
- final List<NodeModel> children = node.getChildren();
- for (final NodeModel child : children) {
- unregistryNodes(child);
- }
- final String id = node.getID();
- if (id != null) {
- nodes.put(id, null);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/MapReader.java b/freeplane/src/org/freeplane/features/map/MapReader.java
deleted file mode 100644
index 9a9444c..0000000
--- a/freeplane/src/org/freeplane/features/map/MapReader.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.UnknownElements;
-import org.freeplane.core.io.xml.TreeXmlReader;
-import org.freeplane.features.map.MapWriter.Hint;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.n3.nanoxml.XMLException;
-
-/**
- * @author Dimitry Polivaev
- * 20.12.2008
- */
-public class MapReader implements IElementDOMHandler {
- public class NodeTreeCreator {
- private MapModel createdMap;
- private final Map<Object, Object> hints;
- private NodeModel mapChild = null;
- private final Map<String, String> newIds;
-
- public NodeTreeCreator() {
- this(new HashMap<Object, Object>());
- }
-
- public NodeTreeCreator(Map<Object, Object> hints) {
- super();
- newIds = new HashMap<String, String>();
- this.hints = hints;
- }
-
- public NodeModel create(final Reader pReader) throws XMLException {
- final NodeTreeCreator oldNodeTreeCreator = nodeTreeCreator;
- final TreeXmlReader reader = new TreeXmlReader(readManager);
- try {
- nodeTreeCreator = this;
- reader.load(createdMap, pReader);
- final NodeModel node = nodeBuilder.getMapChild();
- return node;
- }
- finally {
- nodeBuilder.reset();
- nodeTreeCreator = oldNodeTreeCreator;
- }
- }
-
- public NodeModel createNodeTreeFromXml(final MapModel map, final Reader pReader) throws IOException,
- XMLException {
- start(map);
- final NodeModel node = create(pReader);
- if (node == null)
- throw new RuntimeException("corrupted map, no root node found");
- finish(node);
- return node;
- }
-
- public void finish(final NodeModel node) {
- final NodeTreeCreator oldNodeTreeCreator = nodeTreeCreator;
- try {
- nodeTreeCreator = this;
- readManager.readingCompleted(node, newIds);
- newIds.clear();
- createdMap = null;
- }
- finally {
- nodeTreeCreator = oldNodeTreeCreator;
- }
- }
-
- void start(final MapModel map) {
- createdMap = map;
- }
-
- public MapModel getCreatedMap() {
- return createdMap;
- }
-
- Object getHint(final Object key) {
- return hints.get(key);
- }
-
- public void setHint(final Object key, final Object value) {
- hints.put(key, value);
- }
-
- public void putHints(Map<? extends Object, ? extends Object> m) {
- hints.putAll(m);
- }
-
- NodeModel getMapChild() {
- return mapChild;
- }
-
- public void setMapChild(final NodeModel mapChild) {
- this.mapChild = mapChild;
- if(createdMap.getRootNode() == null && mapChild != null)
- createdMap.setRoot(mapChild);
- }
-
- public void substituteNodeID(final String value, final String realId) {
- newIds.put(value, realId);
- }
- }
-
- private final NodeBuilder nodeBuilder;
- final private ReadManager readManager;
- private NodeTreeCreator nodeTreeCreator;
-
- public NodeTreeCreator getCurrentNodeTreeCreator() {
- return nodeTreeCreator;
- }
-
- public MapReader(final ReadManager readManager) {
- this.readManager = readManager;
- nodeBuilder = new NodeBuilder(this);
- nodeBuilder.registerBy(readManager);
- }
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- return nodeTreeCreator.getCreatedMap();
- }
-
- public NodeModel createNodeTreeFromXml(final MapModel map, final Reader pReader, final Mode mode)
- throws IOException, XMLException {
- final Map<Object, Object> hints = new HashMap<Object, Object>(1);
- hints.put(Hint.MODE, mode);
- return createNodeTreeFromXml(map, pReader, hints);
- }
- public NodeModel createNodeTreeFromXml(final MapModel map, final Reader pReader, final Map<Object, Object> hints)
- throws IOException, XMLException {
- final NodeTreeCreator oldNodeTreeCreator = nodeTreeCreator;
- try {
- nodeTreeCreator = new NodeTreeCreator(hints);
- final NodeModel topNode = nodeTreeCreator.createNodeTreeFromXml(map, pReader);
- return topNode;
- }
- finally {
- nodeTreeCreator = oldNodeTreeCreator;
- }
- }
-
- public void endElement(final Object parent, final String tag, final Object element, final XMLElement dom) {
- final MapModel map = (MapModel) element;
- if (dom.getAttributeCount() != 0 || dom.hasChildren()) {
- map.addExtension(new UnknownElements(dom));
- }
- }
-
- public boolean isMapLoadingInProcess() {
- return nodeTreeCreator != null;
- }
-
- public NodeTreeCreator nodeTreeCreator(final MapModel map) {
- final NodeTreeCreator nodeTreeCreator = new NodeTreeCreator();
- nodeTreeCreator.start(map);
- return nodeTreeCreator;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/MapWriter.java b/freeplane/src/org/freeplane/features/map/MapWriter.java
deleted file mode 100644
index 9918a19..0000000
--- a/freeplane/src/org/freeplane/features/map/MapWriter.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Arrays;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeWriter;
-import org.freeplane.core.io.IElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.io.xml.TreeXmlWriter;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * 07.12.2008
- */
-public class MapWriter implements IElementWriter, IAttributeWriter {
-
- public enum WriterHint {
- FORCE_FORMATTING
- }
- private static final String USAGE_COMMENT = "<!--To view this file,"
- + " download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->"
- + System.getProperty("line.separator");
-
- public enum Hint {
- MODE
- };
-
- public enum Mode {
- CLIPBOARD, FILE, EXPORT, STYLE
- };
-
- private NodeWriter currentNodeWriter;
- final private MapController mapController;
- private boolean saveInvisible;
- final private WriteManager writeManager;
-
- public MapWriter(final MapController mapController) {
- this.mapController = mapController;
- writeManager = mapController.getWriteManager();
- }
-
- public boolean isSaveInvisible() {
- return saveInvisible;
- }
-
- public void setSaveInvisible(final boolean saveInvisible) {
- this.saveInvisible = saveInvisible;
- }
-
- public void writeAttributes(final ITreeWriter writer, final Object userObject, final String tag) {
- final MapModel map = (MapModel) userObject;
- writer.addAttribute("version", FreeplaneVersion.XML_VERSION);
- writer.addExtensionAttributes(map, Arrays.asList(map.getExtensions().values().toArray(new IExtension[] {})));
- }
-
- public void writeContent(final ITreeWriter writer, final Object node, final String tag) throws IOException {
- writer.addElementContent(USAGE_COMMENT);
- final MapModel map = (MapModel) node;
- writer.addExtensionNodes(map, Arrays.asList(map.getExtensions().values().toArray(new IExtension[] {})));
- final NodeModel rootNode = map.getRootNode();
- writeNode(writer, rootNode, saveInvisible, true);
- }
-
- public void writeMapAsXml(final MapModel map, final Writer fileout, final Mode mode, final boolean saveInvisible,
- final boolean forceFormat) throws IOException {
- final TreeXmlWriter xmlWriter = new TreeXmlWriter(writeManager, fileout);
- xmlWriter.setHint(Hint.MODE, mode);
- if (forceFormat) {
- xmlWriter.setHint(WriterHint.FORCE_FORMATTING);
- }
- final XMLElement xmlMap = new XMLElement("map");
- setSaveInvisible(saveInvisible);
- xmlWriter.addElement(map, xmlMap);
- xmlWriter.flush();
- fileout.close();
- }
-
- private void writeNode(final ITreeWriter xmlWriter, final NodeModel node, final boolean writeInvisible,
- final boolean writeChildren) throws IOException {
- final NodeWriter oldNodeWriter = currentNodeWriter;
- final Object mode = xmlWriter.getHint(Hint.MODE);
- final String nodeTag;
- if (Mode.STYLE.equals(mode)) {
- nodeTag = NodeBuilder.XML_STYLENODE;
- }
- else {
- nodeTag = NodeBuilder.XML_NODE;
- }
- if (oldNodeWriter != null) {
- writeManager.removeElementWriter(oldNodeWriter.getNodeTag(), oldNodeWriter);
- writeManager.removeAttributeWriter(oldNodeWriter.getNodeTag(), oldNodeWriter);
- }
- currentNodeWriter = new NodeWriter(mapController, nodeTag, writeChildren, writeInvisible);
- try {
- writeManager.addElementWriter(nodeTag, currentNodeWriter);
- writeManager.addAttributeWriter(nodeTag, currentNodeWriter);
- xmlWriter.addElement(node, nodeTag);
- }
- finally {
- writeManager.removeElementWriter(nodeTag, currentNodeWriter);
- writeManager.removeAttributeWriter(nodeTag, currentNodeWriter);
- if (oldNodeWriter != null) {
- writeManager.addElementWriter(oldNodeWriter.getNodeTag(), oldNodeWriter);
- writeManager.addAttributeWriter(oldNodeWriter.getNodeTag(), oldNodeWriter);
- }
- currentNodeWriter = oldNodeWriter;
- }
- }
-
- public void writeNodeAsXml(final Writer writer, final NodeModel node, final Mode mode,
- final boolean writeInvisible, final boolean writeChildren, boolean forceFormat) throws IOException {
- final TreeXmlWriter xmlWriter = new TreeXmlWriter(writeManager, writer);
- xmlWriter.setHint(Hint.MODE, mode);
- if (forceFormat) {
- xmlWriter.setHint(WriterHint.FORCE_FORMATTING);
- }
- writeNode(xmlWriter, node, writeInvisible, writeChildren);
- xmlWriter.flush();
- }
-}
-
diff --git a/freeplane/src/org/freeplane/features/map/NodeBuilder.java b/freeplane/src/org/freeplane/features/map/NodeBuilder.java
deleted file mode 100644
index 3514d45..0000000
--- a/freeplane/src/org/freeplane/features/map/NodeBuilder.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.util.List;
-import java.util.Map;
-
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IReadCompletionListener;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.UnknownElements;
-import org.freeplane.core.io.xml.TreeXmlReader;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.map.MapWriter.Hint;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class NodeBuilder implements IElementDOMHandler {
- static class IconProperties {
- String iconName;
- }
-
- public static final String FOLDING_LOADED = "folding_loaded";
- public static final String RESOURCES_ALWAYS_FOLD_ALL_AFTER_LOAD = "always_fold_all_after_load";
- public static final String RESOURCES_ALWAYS_SAVE_FOLDING = "always_save_folding";
- public static final String RESOURCES_ALWAYS_UNFOLD_ALL_AFTER_LOAD = "always_unfold_all_after_load";
- public static final String RESOURCES_LOAD_FOLDING = "load_folding";
- public static final String RESOURCES_LOAD_FOLDING_FROM_MAP_DEFAULT_FOLD_ALL = "load_folding_from_map_default_fold_all";
- public static final String RESOURCES_LOAD_FOLDING_FROM_MAP_DEFAULT_UNFOLD_ALL = "load_folding_from_map_default_unfold_all";
- protected static final String MAX_DISPLAYED_NODE_COUNT = "max_displayed_node_count";
- public static final String RESOURCES_NEVER_SAVE_FOLDING = "never_save_folding";
- public static final String RESOURCES_SAVE_FOLDING = "save_folding";
- public static final String RESOURCES_SAVE_FOLDING_IF_MAP_IS_CHANGED = "save_folding_if_map_is_changed";
- public static final String RESOURCES_SAVE_MODIFICATION_TIMES = "save_modification_times";
- public static final String XML_NODE = "node";
- public static final String XML_STYLENODE = "stylenode";
- public static final String XML_NODE_ADDITIONAL_INFO = "ADDITIONAL_INFO";
- public static final String XML_NODE_CLASS = "AA_NODE_CLASS";
- public static final String XML_NODE_ENCRYPTED_CONTENT = "ENCRYPTED_CONTENT";
- public static final String XML_NODE_HISTORY_CREATED_AT = "CREATED";
- public static final String XML_NODE_HISTORY_LAST_MODIFIED_AT = "MODIFIED";
- private final MapReader mapReader;
-
- NodeBuilder(final MapReader mapReader) {
- this.mapReader = mapReader;
- }
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- final NodeModel userObject = createNode();
- if (getMapChild() == null) {
- setMapChild(userObject);
- }
- return userObject;
- }
-
- public NodeModel createNode() {
- return new NodeModel(getMap());
- }
-
- public void endElement(final Object parentObject, final String tag, final Object userObject, final XMLElement dom) {
- final NodeModel node = (NodeModel) userObject;
- if (dom.getAttributeCount() != 0 || dom.hasChildren()) {
- node.addExtension(new UnknownElements(dom));
- }
- if (parentObject instanceof MapModel) {
- setMapChild(node);
- return;
- }
- if (parentObject instanceof NodeModel) {
- final NodeModel parentNode = (NodeModel) parentObject;
- if (userObject instanceof NodeModel) {
- parentNode.insert(node, -1);
- }
- return;
- }
- }
-
- private MapModel getMap() {
- return mapReader.getCurrentNodeTreeCreator().getCreatedMap();
- }
-
- public NodeModel getMapChild() {
- return mapReader.getCurrentNodeTreeCreator().getMapChild();
- }
-
- private void registerAttributeHandlers(final ReadManager reader) {
- reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeBuilder.XML_NODE_ENCRYPTED_CONTENT,
- new IAttributeHandler() {
- private void createEncryptedNode(final NodeModel node, final String additionalInfo) {
- final EncryptionModel encryptionModel = new EncryptionModel(node, additionalInfo);
- node.addExtension(encryptionModel);
- }
-
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- createEncryptedNode(node, value);
- node.setFolded(true);
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeBuilder.XML_NODE_HISTORY_CREATED_AT,
- new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- if (node.getHistoryInformation() == null) {
- node.setHistoryInformation(new HistoryInformationModel());
- }
- node.getHistoryInformation().setCreatedAt(TreeXmlReader.xmlToDate(value));
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeBuilder.XML_NODE_HISTORY_LAST_MODIFIED_AT,
- new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- if (node.getHistoryInformation() == null) {
- node.setHistoryInformation(new HistoryInformationModel());
- }
- node.getHistoryInformation().setLastModifiedAt(TreeXmlReader.xmlToDate(value));
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "FOLDED", new IAttributeHandler() {
- public void setAttribute(Object userObject, String value) {
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "FOLDED", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- final Object mode = mapReader.getCurrentNodeTreeCreator().getHint(Hint.MODE);
- if (mode.equals(Mode.FILE)) {
- final String loadFolding = ResourceController.getResourceController().getProperty(
- NodeBuilder.RESOURCES_LOAD_FOLDING);
- if (loadFolding.equals(NodeBuilder.RESOURCES_ALWAYS_FOLD_ALL_AFTER_LOAD)
- || loadFolding.equals(NodeBuilder.RESOURCES_ALWAYS_UNFOLD_ALL_AFTER_LOAD)) {
- return;
- }
- mapReader.getCurrentNodeTreeCreator().setHint(FOLDING_LOADED, Boolean.TRUE);
- }
- if (value.equals("true")) {
- node.setFolded(true);
- }
- }
- });
- reader.addReadCompletionListener(new IReadCompletionListener() {
- private int foldAll(final NodeModel node, int nodeCount) {
- if (node.getChildCount() == 0) {
- return nodeCount;
- }
- if (nodeCount <= 0) {
- node.setFolded(true);
- }
- else{
- nodeCount -= node.getChildCount();
- }
- for (final NodeModel child : node.getChildren()) {
- nodeCount = foldAll(child, nodeCount);
- }
- return nodeCount;
- }
-
- public void readingCompleted(final NodeModel topNode, final Map<String, String> newIds) {
- if (!Mode.FILE.equals(mapReader.getCurrentNodeTreeCreator().getHint(Hint.MODE))) {
- return;
- }
- if (Boolean.TRUE.equals(mapReader.getCurrentNodeTreeCreator().getHint(NodeBuilder.FOLDING_LOADED))) {
- return;
- }
- final ResourceController resourceController = ResourceController.getResourceController();
- final String loadFolding = resourceController.getProperty(NodeBuilder.RESOURCES_LOAD_FOLDING);
- if (loadFolding.equals(NodeBuilder.RESOURCES_ALWAYS_FOLD_ALL_AFTER_LOAD)
- || loadFolding.equals(NodeBuilder.RESOURCES_LOAD_FOLDING_FROM_MAP_DEFAULT_FOLD_ALL)) {
- int nodeCount = resourceController.getIntProperty(NodeBuilder.MAX_DISPLAYED_NODE_COUNT, 20);
- final List<NodeModel> children = topNode.getChildren();
- nodeCount = nodeCount - 1 - children.size();
- for (final NodeModel child : children) {
- nodeCount = foldAll(child, nodeCount);
- }
- }
- }
- });
- final IAttributeHandler positionHandler = new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- node.setLeft(value.equals("left"));
- }
- };
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "POSITION", positionHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "POSITION", positionHandler);
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "ID", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- final String realId = getMap().generateNodeID(value);
- node.setID(realId);
- if (!realId.equals(value)) {
- mapReader.getCurrentNodeTreeCreator().substituteNodeID(value, realId);
- }
- }
- });
- }
-
- /**
- */
- public void registerBy(final ReadManager reader) {
- registerAttributeHandlers(reader);
- reader.addElementHandler(NodeBuilder.XML_NODE, this);
- reader.addElementHandler(NodeBuilder.XML_STYLENODE, this);
- }
-
- public void reset() {
- setMapChild(null);
- }
-
- public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
- }
-
- private void setMapChild(final NodeModel mapChild) {
- mapReader.getCurrentNodeTreeCreator().setMapChild(mapChild);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/NodeChangeEvent.java b/freeplane/src/org/freeplane/features/map/NodeChangeEvent.java
deleted file mode 100644
index 9aee553..0000000
--- a/freeplane/src/org/freeplane/features/map/NodeChangeEvent.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.awt.AWTEvent;
-
-/**
- * @author Dimitry Polivaev 27.11.2008
- */
-public class NodeChangeEvent extends AWTEvent {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private Object newValue;
- final private Object oldValue;
- final private Object property;
-// final private ModeController modeController;
-
- public NodeChangeEvent(final NodeModel node, final Object property,
- final Object oldValue, final Object newValue) {
- super(node, 0);
-// this.modeController = modeController;
- this.oldValue = oldValue;
- this.newValue = newValue;
- this.property = property;
- }
-
- public Object getNewValue() {
- return newValue;
- }
-
- public NodeModel getNode() {
- return (NodeModel) getSource();
- }
-
- public Object getOldValue() {
- return oldValue;
- }
-
- public Object getProperty() {
- return property;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/NodeLevelConditionController.java b/freeplane/src/org/freeplane/features/map/NodeLevelConditionController.java
deleted file mode 100644
index 9ac9d8a..0000000
--- a/freeplane/src/org/freeplane/features/map/NodeLevelConditionController.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.ui.FixedBasicComboBoxEditor;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * 27.07.2010
- */
-class NodeLevelConditionController implements IElementaryConditionController {
- static final String FILTER_LEVEL = "filter_node_level";
- static final String FILTER_ROOT = "filter_root";
- static final String FILTER_LEAF = "filter_leaf";
- static final String FILTER_PERIODIC_LEVEL = "filter_periodic_level";
- private final ComboBoxEditor levelEditor = new NumberComboBoxEditor();
- private final ComboBoxModel values = new DefaultComboBoxModel();
- private final ComboBoxModel periodicValues = new DefaultComboBoxModel(PeriodicLevelCondition.createConditions(7));
-
-
- public boolean canEditValues(final Object selectedItem, final NamedObject simpleCond) {
- return ! simpleCond.objectEquals(FILTER_PERIODIC_LEVEL);
- }
-
- public boolean canHandle(final Object selectedItem) {
- if (!(selectedItem instanceof NamedObject)) {
- return false;
- }
- final NamedObject namedObject = (NamedObject) selectedItem;
- if (namedObject.objectEquals(NodeLevelConditionController.FILTER_LEVEL))
- return true;
- return false;
- }
-
- public boolean canSelectValues(final Object selectedItem, final NamedObject simpleCondition) {
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
- return true;
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
- return true;
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
- return true;
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
- return true;
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
- return true;
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
- return true;
- }
- if (simpleCondition.objectEquals(FILTER_PERIODIC_LEVEL)) {
- return true;
- }
-
- return false;
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCond,
- final Object value, final boolean matchCase,
- final boolean matchApproximately) {
- if(value instanceof PeriodicLevelCondition){
- return (ASelectableCondition) value;
- }
- return createASelectableCondition(simpleCond, (String) value, matchCase, matchApproximately);
- }
-
- protected ASelectableCondition createASelectableCondition(final NamedObject simpleCondition, final String value,
- final boolean matchCase, final boolean matchApproximately) {
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
- return new NodeLevelCompareCondition(value, matchCase, 0, true);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
- return new NodeLevelCompareCondition(value, matchCase, 0, false);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
- return new NodeLevelCompareCondition(value, matchCase, 1, true);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
- return new NodeLevelCompareCondition(value, matchCase, -1, false);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
- return new NodeLevelCompareCondition(value, matchCase, -1, true);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
- return new NodeLevelCompareCondition(value, matchCase, 1, false);
- }
- if (simpleCondition.objectEquals(NodeLevelConditionController.FILTER_ROOT))
- return new RootCondition();
- if (simpleCondition.objectEquals(NodeLevelConditionController.FILTER_LEAF))
- return new LeafCondition();
- return null;
- }
-
- public ComboBoxModel getConditionsForProperty(final Object selectedItem) {
- return new DefaultComboBoxModel(new NamedObject[] {
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_NOT_EQUAL_TO),
- NamedObject.literal(ConditionFactory.FILTER_GT), NamedObject.literal(ConditionFactory.FILTER_GE),
- NamedObject.literal(ConditionFactory.FILTER_LE), NamedObject.literal(ConditionFactory.FILTER_LT),
- TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_ROOT),
- TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_LEAF),
- TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_PERIODIC_LEVEL),
- });
- }
-
- public ListModel getFilteredProperties() {
- final DefaultListModel list = new DefaultListModel();
- list.addElement(TextUtils.createTranslatedString(NodeLevelConditionController.FILTER_LEVEL));
- return list;
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- if(selectedCondition.objectEquals(FILTER_PERIODIC_LEVEL)){
- return new FixedBasicComboBoxEditor();
- }
- return levelEditor;
- }
-
- public ComboBoxModel getValuesForProperty(final Object property, NamedObject simpleCond) {
- if(simpleCond.objectEquals(FILTER_PERIODIC_LEVEL)){
- return periodicValues;
- }
- return values;
- }
-
- public boolean isCaseDependent(final Object selectedItem, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean supportsApproximateMatching(final Object selectedItem, final NamedObject simpleCond) {
- return false;
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- if (element.getName().equalsIgnoreCase(NodeLevelCompareCondition.NAME)) {
- return NodeLevelCompareCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(RootCondition.NAME)) {
- return RootCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(LeafCondition.NAME)) {
- return LeafCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(PeriodicLevelCondition.NAME)) {
- return PeriodicLevelCondition.load(element);
- }
- return null;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- return null;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/NodeModel.java b/freeplane/src/org/freeplane/features/map/NodeModel.java
deleted file mode 100644
index f5bbe22..0000000
--- a/freeplane/src/org/freeplane/features/map/NodeModel.java
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-
-import javax.swing.tree.MutableTreeNode;
-import javax.swing.tree.TreeNode;
-
-import org.freeplane.core.extension.ExtensionContainer;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.extension.SmallExtensionMap;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.XmlUtils;
-import org.freeplane.features.filter.Filter;
-import org.freeplane.features.filter.FilterInfo;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.ui.INodeViewVisitor;
-
-/**
- * This class represents a single Node of a Tree. It contains direct handles to
- * its parent and children and to its view.
- *
- * Note that this class does not and must not know anything about its extensions,
- * otherwise this class would become too big.
- * Extension methods that add functionality to nodes are in the extension packages
- * and get NodeModel as an argument.
- */
-public class NodeModel implements MutableTreeNode {
- public enum NodeChangeType {
- FOLDING, REFRESH
- }
-
- private static final boolean ALLOWSCHILDREN = true;
- public final static int LEFT_POSITION = -1;
- public static final String NODE_TEXT = "node_text";
- public static final String NOTE_TEXT = "note_text";
- public final static int RIGHT_POSITION = 1;
- public final static int UNKNOWN_POSITION = 0;
- static public final Object UNKNOWN_PROPERTY = new Object();
- public static final String NODE_ICON = "icon";
- //DOCEAR - fixed: new property type for node link changes
- static public final Object HYPERLINK_CHANGED = NodeLinks.HYPERLINK_CHANGED;
- private final List<NodeModel> children = new ArrayList<NodeModel>();
- private final ExtensionContainer extensionContainer;
- final private FilterInfo filterInfo = new FilterInfo();
- private boolean folded;
- private HistoryInformationModel historyInformation = null;
- final private NodeIconSetModel icons;
- private String id;
- private MapModel map = null;
- private NodeModel parent;
- private int position = NodeModel.UNKNOWN_POSITION;
- private NodeModel preferredChild;
- private Object userObject = null;
-
- public Object getUserObject() {
- return userObject;
- }
-
- private Collection<INodeView> views = null;
- private String xmlText = null;
-
- public NodeModel(final MapModel map) {
- this("", map);
- }
-
- public NodeModel(final Object userObject, final MapModel map) {
- extensionContainer = new ExtensionContainer(new SmallExtensionMap());
- init(userObject);
- this.map = map;
- icons = new NodeIconSetModel();
- }
-
- protected void init(final Object userObject) {
- setUserObject(userObject);
- setHistoryInformation(new HistoryInformationModel());
- }
-
- public void acceptViewVisitor(final INodeViewVisitor visitor) {
- if (views == null) {
- return;
- }
- for (final INodeView view : views) {
- visitor.visit(view);
- }
- }
-
- public void addExtension(final IExtension extension) {
- extensionContainer.addExtension(extension);
- }
-
- public IExtension putExtension(final IExtension extension) {
- return extensionContainer.putExtension(extension);
- }
-
- public void addIcon(final MindIcon icon) {
- icons.addIcon(icon);
- if (map != null) {
- map.getIconRegistry().addIcon(icon);
- }
- }
-
- public void addIcon(final MindIcon icon, final int position) {
- icons.addIcon(icon, position);
- getMap().getIconRegistry().addIcon(icon);
- }
-
- public void addViewer(final INodeView viewer) {
- getViewers().add(viewer);
- }
-
- public boolean areViewsEmpty() {
- return views == null || views.isEmpty();
- }
-
- protected List<NodeModel> getChildrenInternal() {
- return children;
- }
-
- public Enumeration<NodeModel> children() {
- final Iterator<NodeModel> i = getChildrenInternal().iterator();
- return new Enumeration<NodeModel>() {
- public boolean hasMoreElements() {
- return i.hasNext();
- }
-
- public NodeModel nextElement() {
- return i.next();
- }
- };
- }
-
- public boolean containsExtension(final Class<? extends IExtension> clazz) {
- return extensionContainer.containsExtension(clazz);
- }
-
- public String createID() {
- if (id == null) {
- id = getMap().registryNode(this);
- }
- return id;
- }
-
- public void fireNodeChanged(final NodeChangeEvent nodeChangeEvent) {
- if (views == null) {
- return;
- }
- final Iterator<INodeView> iterator = views.iterator();
- while (iterator.hasNext()) {
- iterator.next().nodeChanged(nodeChangeEvent);
- }
- }
-
- private void fireNodeInserted(final NodeModel child, final int index) {
- if (views == null) {
- return;
- }
- final Iterator<INodeView> iterator = views.iterator();
- while (iterator.hasNext()) {
- iterator.next().onNodeInserted(this, child, index);
- }
- }
-
- private void fireNodeRemoved(final NodeModel child, final int index) {
- if (views == null) {
- return;
- }
- final Iterator<INodeView> iterator = views.iterator();
- while (iterator.hasNext()) {
- iterator.next().onNodeDeleted(this, child, index);
- }
- }
-
- public boolean getAllowsChildren() {
- return NodeModel.ALLOWSCHILDREN;
- };
-
- public TreeNode getChildAt(final int childIndex) {
- return getChildrenInternal().get(childIndex);
- }
-
- public int getChildCount() {
- if (getChildrenInternal() == null) {
- return 0;
- }
- final EncryptionModel encryptionModel = EncryptionModel.getModel(this);
- return encryptionModel == null || encryptionModel.isAccessible() ? getChildrenInternal().size() : 0;
- }
-
- public int getChildPosition(final NodeModel childNode) {
- int position = 0;
- for (final ListIterator<NodeModel> i = getChildrenInternal().listIterator(); i.hasNext(); ++position) {
- if ((i.next()) == childNode) {
- return position;
- }
- }
- return -1;
- }
-
- public List<NodeModel> getChildren() {
- List<NodeModel> childrenList;
- if (getChildrenInternal() != null) {
- childrenList = getChildrenInternal();
- }
- else {
- childrenList = Collections.emptyList();
- }
- return Collections.unmodifiableList(childrenList);
- }
-
- public <T extends IExtension> T getExtension(final Class<T> clazz) {
- return (T) extensionContainer.getExtension(clazz);
- }
-
- public Map<Class<? extends IExtension>, IExtension> getExtensions() {
- return extensionContainer.getExtensions();
- };
-
- public FilterInfo getFilterInfo() {
- return filterInfo;
- }
-
- public HistoryInformationModel getHistoryInformation() {
- return historyInformation;
- }
-
- public MindIcon getIcon(final int position) {
- return icons.getIcon(position);
- }
-
- public List<MindIcon> getIcons() {
- return icons.getIcons();
- }
-
- public String getID() {
- return id;
- }
-
- public int getIndex(final TreeNode node) {
- return getChildrenInternal().indexOf(node);
- }
-
- public MapModel getMap() {
- return map;
- }
-
- public int getNodeLevel(final boolean countHidden) {
- int level = 0;
- NodeModel parent;
- for (parent = getParentNode(); parent != null; parent = parent.getParentNode()) {
- if (countHidden || parent.isVisible()) {
- level++;
- }
- }
- return level;
- }
-
- public TreeNode getParent() {
- return parent;
- }
-
- public NodeModel getParentNode() {
- return parent;
- }
-
- public NodeModel[] getPathToRoot() {
- int i = getNodeLevel(true);
- final NodeModel[] path = new NodeModel[i + 1];
- NodeModel node = this;
- while (i >= 0) {
- path[i--] = node;
- node = node.getParentNode();
- }
- return path;
- }
-
- public String getText() {
- String string = "";
- if (userObject != null) {
- string = userObject.toString();
- }
- return string;
- }
-
- public Collection<INodeView> getViewers() {
- if (views == null) {
- views = new LinkedList<INodeView>();
- }
- return views;
- }
-
- public final String getXmlText() {
- return xmlText;
- }
-
- public boolean hasChildren() {
- return getChildCount() != 0;
- }
-
- public boolean hasID() {
- return id != null;
- }
-
- public void insert(final MutableTreeNode child, int index) {
- if (!isAccessible()) {
- throw new IllegalArgumentException("Trying to insert nodes into a ciphered node.");
- }
- final NodeModel childNode = (NodeModel) child;
- if (index < 0) {
- index = getChildCount();
- getChildrenInternal().add(index, (NodeModel) child);
- }
- else {
- getChildrenInternal().add(index, (NodeModel) child);
- preferredChild = childNode;
- }
- child.setParent(this);
- fireNodeInserted(childNode, getIndex(child));
- }
-
- private boolean isAccessible() {
- final EncryptionModel encryptionModel = EncryptionModel.getModel(this);
- return encryptionModel == null || encryptionModel.isAccessible();
- }
-
- /**
- * Returns whether the argument is parent or parent of one of the grandpa's
- * of this node. (transitive)
- */
- public boolean isDescendantOf(final NodeModel node) {
- if (parent == null) {
- return false;
- }
- else if (node == parent) {
- return true;
- }
- else {
- return parent.isDescendantOf(node);
- }
- }
-
- public boolean isFolded() {
- return folded;
- }
-
- /*
- * Notes
- */
- public boolean isLeaf() {
- return getChildCount() == 0;
- }
-
- public boolean isLeft() {
- if (position == NodeModel.UNKNOWN_POSITION && getParentNode() != null) {
- setLeft(getParentNode().isLeft());
- }
- return position == NodeModel.LEFT_POSITION;
- }
-
- public boolean isNewChildLeft() {
- if (!isRoot()) {
- return isLeft();
- }
- int rightChildrenCount = 0;
- for (int i = 0; i < getChildCount(); i++) {
- if (!((NodeModel) getChildAt(i)).isLeft()) {
- rightChildrenCount++;
- }
- if (rightChildrenCount > getChildCount() / 2) {
- return true;
- }
- }
- return false;
- }
-
- public boolean isRoot() {
- return getMap().getRootNode() == this;
- }
-
- public boolean isVisible() {
- final Filter filter = getMap().getFilter();
- return filter == null || filter.isVisible(this);
- }
-
- public void remove(final int index) {
- final MutableTreeNode node = getChildrenInternal().get(index);
- remove(node);
- }
-
- public void remove(final MutableTreeNode node) {
- if (node == preferredChild) {
- final int index = getChildrenInternal().indexOf(node);
- if (getChildrenInternal().size() > index + 1) {
- preferredChild = (getChildrenInternal().get(index + 1));
- }
- else {
- preferredChild = (index > 0) ? (NodeModel) (getChildrenInternal().get(index - 1)) : null;
- }
- }
- final int index = getIndex(node);
- node.setParent(null);
- getChildrenInternal().remove(node);
- fireNodeRemoved((NodeModel) node, index);
- }
-
- public <T extends IExtension> T removeExtension(final Class<T> clazz){
- return extensionContainer.removeExtension(clazz);
- }
-
- public boolean removeExtension(final IExtension extension) {
- return extensionContainer.removeExtension(extension);
- }
-
- public void removeFromParent() {
- parent.remove(this);
- }
-
- /**
- * remove last icon
- *
- * @return the number of remaining icons.
- */
- public int removeIcon() {
- return icons.removeIcon();
- }
-
- /**
- * @param remove icons with given position
- *
- * @return the number of remaining icons
- */
- public int removeIcon(final int position) {
- return icons.removeIcon(position);
- }
-
- public void removeViewer(final INodeView viewer) {
- getViewers().remove(viewer);
- }
-
- public void setFolded(boolean folded) {
- if (this.folded == folded) {
- return;
- }
- final EncryptionModel encryptionModel = EncryptionModel.getModel(this);
- if (encryptionModel != null && !encryptionModel.isAccessible() && folded == false) {
- folded = true;
- }
- else if (AlwaysUnfoldedNode.isConnectorNode(this)){
- folded = false;
- }
- if (this.folded == folded) {
- return;
- }
- this.folded = folded;
- fireNodeChanged(new NodeChangeEvent(this, NodeChangeType.FOLDING, Boolean.valueOf(!folded),
- Boolean.valueOf(folded)));
- }
-
- public void setHistoryInformation(final HistoryInformationModel historyInformation) {
- this.historyInformation = historyInformation;
- }
-
- public void setID(final String value) {
- id = value;
- getMap().registryID(value, this);
- }
-
- public void setLeft(final boolean isLeft) {
- position = isLeft ? NodeModel.LEFT_POSITION : NodeModel.RIGHT_POSITION;
- if (!isRoot()) {
- for (int i = 0; i < getChildCount(); i++) {
- final NodeModel child = (NodeModel) getChildAt(i);
- if (child.position != position) {
- child.setLeft(isLeft);
- }
- }
- }
- }
-
- /**
- */
- public void setMap(final MapModel map) {
- this.map = map;
- for (final NodeModel child : getChildrenInternal()) {
- child.setMap(map);
- }
- }
-
- public void setParent(final MutableTreeNode newParent) {
- parent = (NodeModel) newParent;
- }
-
- public void setParent(final NodeModel newParent) {
- parent = newParent;
- }
-
-
- public final void setText(final String text) {
- userObject = XmlUtils.makeValidXml(text);
- xmlText = HtmlUtils.toXhtml(text);
- if (xmlText != null && !xmlText.startsWith("<")) {
- userObject = " " + text;
- xmlText = null;
- }
- }
-
- public final void setUserObject(final Object data) {
- if (data instanceof String) {
- setText(data.toString());
- return;
- }
- userObject = data;
- xmlText = null;
- }
-
- public final void setXmlText(final String pXmlText) {
- xmlText = XmlUtils.makeValidXml(pXmlText);
- userObject = HtmlUtils.toHtml(xmlText);
- }
-
- @Override
- public String toString() {
- return HtmlUtils.htmlToPlain(getText());
- }
-
- public int depth() {
- final NodeModel parentNode = getParentNode();
- if (parentNode == null) {
- return 0;
- }
- return parentNode.depth() + 1;
- }
-
- public void insert(final NodeModel newNodeModel) {
- insert(newNodeModel, getChildCount());
- }
-
- public NodeModel getVisibleAncestorOrSelf() {
- NodeModel node = this;
- while (!node.isVisible()) {
- node = node.getParentNode();
- }
- return node;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/NodeWriter.java b/freeplane/src/org/freeplane/features/map/NodeWriter.java
deleted file mode 100644
index 353b481..0000000
--- a/freeplane/src/org/freeplane/features/map/NodeWriter.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.io.IOException;
-import org.freeplane.core.io.IAttributeWriter;
-import org.freeplane.core.io.IElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.xml.TreeXmlWriter;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.map.MapWriter.Hint;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-class NodeWriter implements IElementWriter, IAttributeWriter {
- private boolean mayWriteChildren;
- final private MapController mapController;
- final private boolean shouldWriteChildren;
- private final boolean writeFolded;
- final private boolean writeInvisible;
- private XMLElement xmlNode;
- final private String nodeTag;
-
- public NodeWriter(final MapController mapController, final String nodeTag, final boolean writeChildren,
- final boolean writeInvisible) {
- this.mapController = mapController;
- this.shouldWriteChildren = writeChildren;
- this.mayWriteChildren = true;
- this.writeInvisible = writeInvisible;
- this.nodeTag = nodeTag;
- final String saveFolding = ResourceController.getResourceController().getProperty(
- NodeBuilder.RESOURCES_SAVE_FOLDING);
- writeFolded = saveFolding.equals(NodeBuilder.RESOURCES_ALWAYS_SAVE_FOLDING)
- || saveFolding.equals(NodeBuilder.RESOURCES_SAVE_FOLDING_IF_MAP_IS_CHANGED);
- }
-
- private void saveChildren(final ITreeWriter writer, final NodeModel node) throws IOException {
- for (final NodeModel child: mapController.childrenUnfolded(node)) {
- if (writeInvisible || child.isVisible()) {
- writer.addElement(child, nodeTag);
- }
- else {
- saveChildren(writer, child);
- }
- }
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.io.IAttributeWriter#saveAttributes(freeplane.io.ITreeWriter,
- * java.lang.Object, java.lang.String)
- */
- public void writeAttributes(final ITreeWriter writer, final Object content, final String tag) {
- if (tag.equals(nodeTag)) {
- final NodeModel node = (NodeModel) content;
- writeAttributesGenerateContent(writer, node);
- return;
- }
- }
-
- private void writeAttributesGenerateContent(final ITreeWriter writer, final NodeModel node) {
- /** fc, 12.6.2005: XML must not contain any zero characters. */
- xmlNode = new XMLElement();
- EncryptionModel encryptionModel = EncryptionModel.getModel(node);
- mayWriteChildren = true;
- final Object mode = writer.getHint(Hint.MODE);
- if (encryptionModel != null && !(encryptionModel.isAccessible() && Mode.EXPORT.equals(mode))) {
- final String enctyptedContent = encryptionModel.getEncryptedContent(mapController);
- if(enctyptedContent != null){
- writer.addAttribute(NodeBuilder.XML_NODE_ENCRYPTED_CONTENT, enctyptedContent);
- mayWriteChildren = false;
- }
- }
- if (mayWriteChildren && (writeFolded || !writer.getHint(Hint.MODE).equals(Mode.FILE))) {
- if(mapController.isFolded(node)){
- writer.addAttribute("FOLDED", "true");
- }
- else if(node.isRoot() && ! Mode.STYLE.equals(mode)){
- writer.addAttribute("FOLDED", "false");
- }
- }
- final NodeModel parentNode = node.getParentNode();
- if (parentNode != null && parentNode.isRoot()) {
- writer.addAttribute("POSITION", node.isLeft() ? "left" : "right");
- }
- final boolean saveID = !mode.equals(Mode.STYLE);
- if (saveID) {
- final String id = node.createID();
- writer.addAttribute("ID", id);
- }
- if (!mode.equals(Mode.STYLE)
- && node.getHistoryInformation() != null
- && ResourceController.getResourceController().getBooleanProperty(
- NodeBuilder.RESOURCES_SAVE_MODIFICATION_TIMES)) {
- writer.addAttribute(NodeBuilder.XML_NODE_HISTORY_CREATED_AT, TreeXmlWriter.dateToString(node
- .getHistoryInformation().getCreatedAt()));
- writer.addAttribute(NodeBuilder.XML_NODE_HISTORY_LAST_MODIFIED_AT, TreeXmlWriter.dateToString(node
- .getHistoryInformation().getLastModifiedAt()));
- }
- writer.addExtensionAttributes(node, node.getExtensions().values());
- }
-
- public void writeContent(final ITreeWriter writer, final Object content, final String tag) throws IOException {
- final NodeModel node = (NodeModel) content;
- writer.addExtensionNodes(node, node.getExtensions().values());
- for (int i = 0; i < xmlNode.getChildrenCount(); i++) {
- writer.addElement(null, xmlNode.getChildAtIndex(i));
- }
- if (mayWriteChildren && shouldWriteChildren && mapController.childrenUnfolded(node).size()>0) {
- saveChildren(writer, node);
- }
- return;
- }
-
- String getNodeTag() {
- return nodeTag;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/ShowNextChildAction.java b/freeplane/src/org/freeplane/features/map/ShowNextChildAction.java
deleted file mode 100644
index 64bae03..0000000
--- a/freeplane/src/org/freeplane/features/map/ShowNextChildAction.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- * 22.04.2012
- */
- at SuppressWarnings("serial")
- at EnabledAction(checkOnNodeChange = true)
-public class ShowNextChildAction extends AFreeplaneAction {
- public ShowNextChildAction() {
- super("ShowNextChildAction");
- }
-
- public void actionPerformed(ActionEvent e) {
- final Controller controller = Controller.getCurrentController();
- final NodeModel selected = controller.getSelection().getSelected();
- final MapController mapController = controller.getModeController().getMapController();
- mapController.showNextChild(selected);
- }
-
- @Override
- public void setEnabled() {
- final Controller controller = Controller.getCurrentController();
- final NodeModel selected = controller.getSelection().getSelected();
- final MapController mapController = controller.getModeController().getMapController();
- super.setEnabled(mapController.hasHiddenChildren(selected));
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/features/map/SummaryNode.java b/freeplane/src/org/freeplane/features/map/SummaryNode.java
deleted file mode 100644
index 00d44d5..0000000
--- a/freeplane/src/org/freeplane/features/map/SummaryNode.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Apr 9, 2011
- */
- at NodeHookDescriptor(hookName = "SummaryNode", onceForMap = false)
-public class SummaryNode extends PersistentNodeHook implements IExtension{
-
- public static void install(){
- new SummaryNode();
- new FirstGroupNode();
- };
-
- static public boolean isFirstGroupNode(final NodeModel nodeModel) {
- return nodeModel.containsExtension(FirstGroupNode.class);
- }
-
- @Override
- protected IExtension createExtension(NodeModel node, XMLElement element) {
- return this;
- }
-
- static public boolean isSummaryNode(final NodeModel nodeModel) {
- return nodeModel.containsExtension(SummaryNode.class);
- }
-
- public static int getSummaryLevel(NodeModel node) {
- if(node.isRoot() || ! isSummaryNode(node))
- return 0;
- final NodeModel parentNode = node.getParentNode();
- final int index = parentNode.getIndex(node);
- final boolean isleft = node.isLeft();
- int level = 1;
- for(int i = index - 1; i > 0; i--){
- final NodeModel child = (NodeModel) parentNode.getChildAt(i);
- if(isleft == child.isLeft()){
- if( isSummaryNode(child))
- level++;
- else
- return level;
- }
- }
- return level;
- }
-
-}
-
diff --git a/freeplane/src/org/freeplane/features/map/ToggleFoldedAction.java b/freeplane/src/org/freeplane/features/map/ToggleFoldedAction.java
deleted file mode 100644
index eca477f..0000000
--- a/freeplane/src/org/freeplane/features/map/ToggleFoldedAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author foltin
- */
-class ToggleFoldedAction extends AFreeplaneAction {
- static final String NAME = "toggleFolded";
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ToggleFoldedAction() {
- super("ToggleFoldedAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- Controller.getCurrentModeController().getMapController().toggleFolded();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/ChangeNodeLevelController.java b/freeplane/src/org/freeplane/features/map/mindmapmode/ChangeNodeLevelController.java
deleted file mode 100644
index 6bc8e0c..0000000
--- a/freeplane/src/org/freeplane/features/map/mindmapmode/ChangeNodeLevelController.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map.mindmapmode;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.util.Collection;
-import java.util.List;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.ui.IMapViewManager;
-
-/**
- * @author foltin
- */
-public class ChangeNodeLevelController {
- private class ChangeNodeLevelLeftsAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ChangeNodeLevelLeftsAction() {
- super("ChangeNodeLevelLeftsAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- final Component mapViewComponent = mapViewManager.getMapViewComponent();
- if (mapViewManager.isLeftTreeSupported(mapViewComponent) && selectedNode.isLeft()) {
- moveDownwards(selectedNode);
- }
- else {
- moveUpwards(selectedNode);
- }
- }
- }
-
- private class ChangeNodeLevelRightsAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ChangeNodeLevelRightsAction() {
- super("ChangeNodeLevelRightsAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- final Component mapViewComponent = mapViewManager.getMapViewComponent();
- if (mapViewManager.isLeftTreeSupported(mapViewComponent) && selectedNode.isLeft()) {
- moveUpwards(selectedNode);
- }
- else {
- moveDownwards(selectedNode);
- }
- }
- };
-
-// // final private Controller controller;;
-
- public ChangeNodeLevelController(MModeController modeController) {
-// this.controller = controller;
- modeController.addAction(new ChangeNodeLevelLeftsAction());
- modeController.addAction(new ChangeNodeLevelRightsAction());
- }
-
- public void addActionsAtMenuBuilder(final MenuBuilder menuBuilder) {
- }
-
- private boolean checkSelection() {
- final ModeController currentModeController = Controller.getCurrentModeController();
- final MapController mapController = currentModeController.getMapController();
- final NodeModel selectedNode = mapController.getSelectedNode();
- final NodeModel selectedParent = selectedNode.getParentNode();
- if (selectedParent == null) {
- UITools.errorMessage(TextUtils.getText("cannot_add_parent_to_root"));
- return false;
- }
- final Collection<NodeModel> selectedNodes = mapController.getSelectedNodes();
- for (final NodeModel node : selectedNodes) {
- if (node.getParentNode() != selectedParent) {
- UITools.errorMessage(TextUtils.getText("cannot_add_parent_diff_parents"));
- return false;
- }
- }
- return true;
- }
-
- private void moveDownwards( final NodeModel selectedNode) {
- if (!checkSelection()) {
- return;
- }
- final NodeModel selectedParent = selectedNode.getParentNode();
- final List<NodeModel> selectedNodes = Controller.getCurrentController().getSelection().getSortedSelection(true);
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- final int ownPosition = selectedParent.getChildPosition(selectedNode);
- NodeModel directSibling = null;
- for (int i = ownPosition - 1; i >= 0; --i) {
- final NodeModel sibling = (NodeModel) selectedParent.getChildAt(i);
- if ((!selectedNodes.contains(sibling)) && selectedNode.isLeft() == sibling.isLeft()) {
- directSibling = sibling;
- break;
- }
- }
- if (directSibling == null) {
- for (int i = ownPosition + 1; i < selectedParent.getChildCount(); ++i) {
- final NodeModel sibling = (NodeModel) selectedParent.getChildAt(i);
- if ((!selectedNodes.contains(sibling)) && selectedNode.isLeft() == sibling.isLeft()) {
- directSibling = sibling;
- break;
- }
- }
- }
- if (directSibling != null) {
- for (final NodeModel node : selectedNodes) {
- ((FreeNode)Controller.getCurrentModeController().getExtension(FreeNode.class)).undoableDeactivateHook(node);
- mapController.moveNode(node, directSibling, directSibling.getChildCount());
- }
- Controller.getCurrentModeController().getMapController().selectMultipleNodes(selectedNode, selectedNodes);
- }
- }
-
- private void moveUpwards( final NodeModel selectedNode) {
- if (!checkSelection()) {
- return;
- }
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- NodeModel selectedParent = selectedNode.getParentNode();
- final List<NodeModel> selectedNodes = Controller.getCurrentController().getSelection().getSortedSelection(true);
- int position;
- final boolean changeSide;
- boolean leftSide = selectedNode.isLeft();
- if (selectedParent.isRoot()) {
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- final Component mapViewComponent = mapViewManager.getMapViewComponent();
- if (!mapViewManager.isLeftTreeSupported(mapViewComponent)) {
- return;
- }
- changeSide = true;
- leftSide = ! leftSide;
- final int childCount = selectedParent.getChildCount();
- for(position = childCount - 1;
- position >= 0 && ((NodeModel)selectedParent.getChildAt(position)).isLeft() != leftSide;
- position--);
- }
- else {
- final NodeModel grandParent = selectedParent.getParentNode();
- position = grandParent.getChildPosition(selectedParent);
- selectedParent = grandParent;
- changeSide = false;
- }
- boolean increasePosition = !changeSide;
- for (final NodeModel node : selectedNodes) {
- ((FreeNode)Controller.getCurrentModeController().getExtension(FreeNode.class)).undoableDeactivateHook(node);
- increasePosition = increasePosition || selectedParent.getIndex(node) > position;
- if (increasePosition) {
- position++;
- }
- mapController.moveNode(node, selectedParent, position, leftSide, changeSide);
- }
- mapController.selectMultipleNodes(selectedNode, selectedNodes);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/DeleteAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/DeleteAction.java
deleted file mode 100644
index 241f7de..0000000
--- a/freeplane/src/org/freeplane/features/map/mindmapmode/DeleteAction.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.util.Iterator;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-class DeleteAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public DeleteAction() {
- super("DeleteAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- for (final NodeModel node : modeController.getMapController().getSelectedNodes()) {
- if (node.isRoot()) {
- return;
- }
- }
- final Controller controller = Controller.getCurrentController();
- final int showResult = OptionalDontShowMeAgainDialog.show("really_remove_node", "confirmation",
- MModeController.RESOURCES_DELETE_NODES_WITHOUT_QUESTION,
- OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED);
- if (showResult != JOptionPane.OK_OPTION) {
- return;
- }
- final MMapController mapController = (MMapController) modeController.getMapController();
- final Iterator<NodeModel> iterator = controller.getSelection().getSortedSelection(true).iterator();
- while (iterator.hasNext()) {
- mapController.deleteNode(iterator.next());
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/MMapController.java b/freeplane/src/org/freeplane/features/map/mindmapmode/MMapController.java
deleted file mode 100644
index 510f5d7..0000000
--- a/freeplane/src/org/freeplane/features/map/mindmapmode/MMapController.java
+++ /dev/null
@@ -1,788 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map.mindmapmode;
-
-import java.awt.Component;
-import java.awt.Point;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.TreeSet;
-import java.util.Vector;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.EncryptionModel;
-import org.freeplane.features.map.FirstGroupNode;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.SummaryNode;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
-import org.freeplane.features.styles.LogicalStyleModel;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.MapViewLayout;
-import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-import org.freeplane.features.url.mindmapmode.MFileManager.AlternativeFileMode;
-import org.freeplane.main.addons.AddOnsController;
-import org.freeplane.n3.nanoxml.XMLException;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MMapController extends MapController {
- public static final int NEW_CHILD = 2;
- public static final int NEW_SIBLING_BEFORE = 4;
- public static final int NEW_SIBLING_BEHIND = 3;
- public static final String RESOURCES_CONVERT_TO_CURRENT_VERSION = "convert_to_current_version";
-
- public MMapController(ModeController modeController) {
- super(modeController);
- createActions();
- addNodeSelectionListener(new INodeSelectionListener() {
- public void onSelect(final NodeModel node) {
- final ViewController viewController = Controller.getCurrentController().getViewController();
- if (ResourceController.getResourceController().getBooleanProperty("display_node_id")) {
- viewController.addStatusInfo("display_node_id", "ID=" + node.createID(), null);
- }
- }
-
- public void onDeselect(final NodeModel node) {
- final ViewController viewController = Controller.getCurrentController().getViewController();
- viewController.addStatusInfo("display_node_id", null, null);
- }
- });
- }
-
- public NodeModel addNewNode(int newNodeMode) {
- stopEditing();
- final NodeModel targetNode = getSelectedNode();
- final NodeModel newNode;
- switch (newNodeMode) {
- case MMapController.NEW_SIBLING_BEFORE:
- case MMapController.NEW_SIBLING_BEHIND: {
- if (!targetNode.isRoot()) {
- final NodeModel parent = targetNode.getParentNode();
- int childPosition = parent.getChildPosition(targetNode);
- if (newNodeMode == MMapController.NEW_SIBLING_BEHIND) {
- childPosition++;
- }
- newNode = addNewNode(parent, childPosition, targetNode.isLeft());
- if (newNode == null) {
- return null;
- }
- startEditingAfterSelect(newNode);
- select(newNode);
- break;
- }
- else {
- newNodeMode = MMapController.NEW_CHILD;
- }
- }
- case MMapController.NEW_CHILD: {
- final boolean parentFolded = isFolded(targetNode);
- if (parentFolded) {
- setFolded(targetNode, false);
- }
- final int position = ResourceController.getResourceController().getProperty("placenewbranches").equals(
- "last") ? targetNode.getChildCount() : 0;
- newNode = addNewNode(targetNode, position, targetNode.isNewChildLeft());
- if (newNode == null) {
- return null;
- }
- startEditingAfterSelect(newNode);
- select(newNode);
- break;
- }
- default:
- newNode = null;
- }
- return newNode;
- }
-
- private void startEditingAfterSelect(final NodeModel newNode) {
- final Component component = Controller.getCurrentController().getMapViewManager().getComponent(newNode);
- if(component == null)
- return;
- component.addFocusListener(new FocusListener() {
- public void focusLost(FocusEvent e) {
- }
-
- public void focusGained(FocusEvent e) {
- e.getComponent().removeFocusListener(this);
- final TextController textController = TextController.getController();
- ((MTextController) textController).edit(newNode, newNode.getParentNode(), true, false, false);
- }
- });
- }
-
- private void stopEditing() {
- final ModeController modeController = Controller.getCurrentModeController();
- final TextController textController = TextController.getController();
- if (textController instanceof MTextController) {
- ((MTextController) textController).stopEditing();
- }
- if (textController instanceof MTextController) {
- modeController.startTransaction();
- try {
- ((MTextController) TextController.getController()).stopEditing();
- }
- finally {
- modeController.commit();
- }
- }
- }
-
- public void addNewSummaryNodeStartEditing(final int summaryLevel, final int start, final int end){
- stopEditing();
- ModeController modeController = getMModeController();
- final IMapSelection selection = modeController.getController().getSelection();
- NodeModel selected = selection.getSelected();
- final NodeModel parentNode = selected.getParentNode();
- final boolean isLeft = selected.isLeft();
- final NodeModel newNode = addNewNode(parentNode, end+1, isLeft);
- final SummaryNode summary = modeController.getExtension(SummaryNode.class);
- summary.undoableActivateHook(newNode, summary);
- final FirstGroupNode firstGroup = modeController.getExtension(FirstGroupNode.class);
- final NodeModel firstNode = (NodeModel) parentNode.getChildAt(start);
- firstGroup.undoableActivateHook(firstNode, firstGroup);
- int level = summaryLevel;
- for(int i = start+1; i < end; i++){
- NodeModel node = (NodeModel) parentNode.getChildAt(i);
- if(isLeft != node.isLeft())
- continue;
- if(SummaryNode.isSummaryNode(node))
- level++;
- else
- level = 0;
- if(level == summaryLevel && SummaryNode.isFirstGroupNode(node))
- firstGroup.undoableActivateHook(node, firstGroup);
- }
- startEditingAfterSelect(newNode);
- select(newNode);
-
- }
-
- public NodeModel addNewNode(final NodeModel parent, final int index, final boolean newNodeIsLeft) {
- if (!isWriteable(parent)) {
- UITools.errorMessage(TextUtils.getText("node_is_write_protected"));
- return null;
- }
- final NodeModel newNode = newNode("", parent.getMap());
- if(addNewNode(newNode, parent, index, newNodeIsLeft))
- return newNode;
- else
- return null;
- }
-
- public boolean addNewNode(final NodeModel newNode, final NodeModel parent, final int index, final boolean newNodeIsLeft) {
- if (!isWriteable(parent)) {
- UITools.errorMessage(TextUtils.getText("node_is_write_protected"));
- return false;
- }
- final MapModel map = parent.getMap();
- newNode.setLeft(newNodeIsLeft);
- final IActor actor = new IActor() {
- public void act() {
- insertNodeIntoWithoutUndo(newNode, parent, index);
- }
-
- public String getDescription() {
- return "addNewNode";
- }
-
- public void undo() {
- deleteWithoutUndo(newNode);
- }
- };
- Controller.getCurrentModeController().execute(actor, map);
- return true;
- }
-
- /**
- * Return false if user has canceled.
- */
- @Override
- public boolean close(final MapModel map, final boolean force) {
- if (!force && !map.isSaved()) {
- final List<Component> views = Controller.getCurrentController().getMapViewManager().getViews(map);
- if (views.size() == 1) {
- final String text = TextUtils.getText("save_unsaved") + "\n" + map.getTitle();
- final String title = TextUtils.getText("SaveAction.text");
- final int returnVal = JOptionPane.showOptionDialog(
- Controller.getCurrentController().getViewController().getContentPane(), text, title,
- JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
- if (returnVal == JOptionPane.YES_OPTION) {
- final boolean savingNotCancelled = ((MFileManager) UrlManager.getController())
- .save(map);
- if (!savingNotCancelled) {
- return false;
- }
- }
- else if ((returnVal == JOptionPane.CANCEL_OPTION) || (returnVal == JOptionPane.CLOSED_OPTION)) {
- return false;
- }
- }
- }
- return super.close(map, force);
- }
-
- private void createActions() {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addAction(new NewMapViewAction());
- modeController.addAction(new NewSiblingAction());
- modeController.addAction(new NewPreviousSiblingAction());
- modeController.addAction(new NewChildAction());
- modeController.addAction(new NewSummaryAction());
- modeController.addAction(new NewFreeNodeAction());
- modeController.addAction(new DeleteAction());
- modeController.addAction(new NodeUpAction());
- modeController.addAction(new NodeDownAction());
- }
-
- public void deleteNode(final NodeModel node) {
- final NodeModel parentNode = node.getParentNode();
- final int index = parentNode.getIndex(node);
- final IActor actor = new IActor() {
- public void act() {
- deleteWithoutUndo(node);
- }
-
- public String getDescription() {
- return "delete";
- }
-
- public void undo() {
- (Controller.getCurrentModeController().getMapController()).insertNodeIntoWithoutUndo(node, parentNode, index);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- /**
- */
- public void deleteWithoutUndo(final NodeModel selectedNode) {
- final NodeModel oldParent = selectedNode.getParentNode();
- firePreNodeDelete(oldParent, selectedNode, oldParent.getIndex(selectedNode));
- final MapModel map = selectedNode.getMap();
- setSaved(map, false);
- oldParent.remove(selectedNode);
- fireNodeDeleted(oldParent, selectedNode, oldParent.getIndex(selectedNode));
- }
-
- public MModeController getMModeController() {
- return (MModeController) Controller.getCurrentModeController();
- }
-
- public void insertNode(final NodeModel node, final NodeModel parent) {
- insertNode(node, parent, parent.getChildCount());
- }
-
- public void insertNode(final NodeModel node, final NodeModel target, final boolean asSibling, final boolean isLeft,
- final boolean changeSide) {
- NodeModel parent;
- if (asSibling) {
- parent = target.getParentNode();
- }
- else {
- parent = target;
- }
- if (changeSide) {
- node.setParent(parent);
- node.setLeft(isLeft);
- }
- if (asSibling) {
- insertNode(node, parent, parent.getChildPosition(target));
- }
- else {
- insertNode(node, parent, parent.getChildCount());
- }
- }
-
- public void insertNode(final NodeModel node, final NodeModel parentNode, final int index) {
- final IActor actor = new IActor() {
- public void act() {
- (Controller.getCurrentModeController().getMapController()).insertNodeIntoWithoutUndo(node, parentNode, index);
- }
-
- public String getDescription() {
- return "insertNode";
- }
-
- public void undo() {
- ((MMapController) Controller.getCurrentModeController().getMapController()).deleteWithoutUndo(node);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- @Override
- public void insertNodeIntoWithoutUndo(final NodeModel newNode, final NodeModel parent, final int index) {
- setSaved(parent.getMap(), false);
- super.insertNodeIntoWithoutUndo(newNode, parent, index);
- }
-
- public boolean isWriteable(final NodeModel targetNode) {
- final EncryptionModel encryptionModel = EncryptionModel.getModel(targetNode);
- if (encryptionModel != null) {
- return encryptionModel.isAccessible();
- }
- return true;
- }
-
- public void moveNode(NodeModel node, int i) {
- moveNode(node, node.getParentNode(), i);
- }
-
- public void moveNode(final NodeModel child, final NodeModel newParent, final int childCount) {
- moveNode(child, newParent, childCount, false, false);
- }
-
- public void moveNode(final NodeModel child, final NodeModel newParent, final int newIndex, final boolean isLeft,
- final boolean changeSide) {
- final NodeModel oldParent = child.getParentNode();
- final int oldIndex = oldParent.getChildPosition(child);
- final boolean wasLeft = child.isLeft();
- if (oldParent == newParent && oldIndex == newIndex && changeSide == false) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- moveNodeToWithoutUndo(child, newParent, newIndex, isLeft, changeSide);
- }
-
- public String getDescription() {
- return "moveNode";
- }
-
- public void undo() {
- moveNodeToWithoutUndo(child, oldParent, oldIndex, wasLeft, changeSide);
- }
- };
- Controller.getCurrentModeController().execute(actor, newParent.getMap());
-
- }
-
- public void moveNodeAsChild(final NodeModel node, final NodeModel selectedParent, final boolean isLeft,
- final boolean changeSide) {
- int position = selectedParent.getChildCount();
- if (node.getParent() == selectedParent) {
- position--;
- }
- FreeNode r = Controller.getCurrentModeController().getExtension(FreeNode.class);
- final IExtension extension = node.getExtension(FreeNode.class);
- if (extension != null) {
- r.undoableToggleHook(node, extension);
- if (MapStyleModel.FLOATING_STYLE.equals(LogicalStyleModel.getStyle(node)))
- ((MLogicalStyleController)MLogicalStyleController.getController(getMModeController())).setStyle(node, null);
- }
- moveNode(node, selectedParent, position, isLeft, changeSide);
- }
-
- public void moveNodeBefore(final NodeModel node, final NodeModel target, final boolean isLeft,
- final boolean changeSide) {
- final NodeModel newParent = target.getParentNode();
- final NodeModel oldParent = node.getParentNode();
- int newIndex = newParent.getChildPosition(target);
- if(newParent.equals(oldParent)){
- final int oldIndex = oldParent.getChildPosition(node);
- if(oldIndex < newIndex)
- newIndex--;
- }
- Controller.getCurrentModeController().getExtension(FreeNode.class).undoableDeactivateHook(node);
- moveNode(node, newParent, newIndex, isLeft, changeSide);
- }
-
- public void moveNodes(NodeModel selected, Collection<NodeModel> movedNodes, final int direction) {
- final List<NodeModel> mySelecteds = new ArrayList<NodeModel>(movedNodes);
- final IActor actor = new IActor() {
- public void act() {
- _moveNodes(mySelecteds, direction);
- }
-
- public String getDescription() {
- return "moveNodes";
- }
-
- public void undo() {
- _moveNodes(mySelecteds, -direction);
- }
- };
- Controller.getCurrentModeController().execute(actor, selected.getMap());
- }
-
- private void _moveNodes(final List<NodeModel> movedNodes, final int direction) {
- final Comparator<Object> comparator = (direction == -1) ? null : new Comparator<Object>() {
- public int compare(final Object o1, final Object o2) {
- final int i1 = ((Integer) o1).intValue();
- final int i2 = ((Integer) o2).intValue();
- return i2 - i1;
- }
- };
- if (movedNodes.size() == 0)
- return;
- NodeModel selected = getSelectedNode();
- Collection<NodeModel> selectedNodes = new ArrayList<NodeModel>(getSelectedNodes());
- final NodeModel parent = movedNodes.get(0).getParentNode();
- if (parent != null) {
- final Vector<NodeModel> sortedChildren = getSortedSiblings(parent);
- final TreeSet<Integer> range = new TreeSet<Integer>(comparator);
- for (final NodeModel node : movedNodes) {
- if (node.getParent() != parent) {
- LogUtils.warn("Not all selected nodes have the same parent.");
- return;
- }
- range.add(new Integer(sortedChildren.indexOf(node)));
- }
- Integer last = range.iterator().next();
- for (final Integer newInt : range) {
- if (Math.abs(newInt.intValue() - last.intValue()) > 1) {
- LogUtils.warn("Not adjacent nodes. Skipped. ");
- return;
- }
- last = newInt;
- }
- for (final Integer position : range) {
- final NodeModel node = sortedChildren.get(position.intValue());
- moveNodeTo(node, direction);
- }
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- selection.selectAsTheOnlyOneSelected(selected);
- for (NodeModel selectedNode : selectedNodes) {
- selection.makeTheSelected(selectedNode);
- }
- }
- }
- private int moveNodeTo(final NodeModel child, final int direction) {
- final NodeModel parent = child.getParentNode();
- final int index = parent.getIndex(child);
- int newIndex = index;
- final int maxIndex = parent.getChildCount();
- final Vector<NodeModel> sortedNodesIndices = getSortedSiblings(parent);
- int newPositionInVector = sortedNodesIndices.indexOf(child) + direction;
- if (newPositionInVector < 0) {
- newPositionInVector = maxIndex - 1;
- }
- if (newPositionInVector >= maxIndex) {
- newPositionInVector = 0;
- }
- final NodeModel destinationNode = sortedNodesIndices.get(newPositionInVector);
- newIndex = parent.getIndex(destinationNode);
- ((MMapController) Controller.getCurrentModeController().getMapController()).moveNodeToWithoutUndo(child, parent, newIndex, false,
- false);
- return newIndex;
- }
- /**
- * Sorts nodes by their left/right status. The left are first.
- */
- private Vector<NodeModel> getSortedSiblings(final NodeModel node) {
- final Vector<NodeModel> nodes = new Vector<NodeModel>();
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- nodes.add(child);
- }
- if(! node.isRoot()){
- return nodes;
- }
- final MapStyleModel mapStyleModel = MapStyleModel.getExtension(node.getMap());
- MapViewLayout layoutType = mapStyleModel.getMapViewLayout();
- if(layoutType.equals(MapViewLayout.OUTLINE)){
- return nodes;
- }
-
- Collections.sort(nodes, new Comparator<Object>() {
- public int compare(final Object o1, final Object o2) {
- if (o1 instanceof NodeModel) {
- final NodeModel n1 = (NodeModel) o1;
- if (o2 instanceof NodeModel) {
- final NodeModel n2 = (NodeModel) o2;
- final int b1 = n1.isLeft() ? 0 : 1;
- final int b2 = n2.isLeft() ? 0 : 1;
- return b1 - b2;
- }
- }
- throw new IllegalArgumentException("Elements in LeftRightComparator are not comparable.");
- }
- });
- return nodes;
- }
-
- /**
- * The direction is used if side left and right are present. then the next
- * suitable place on the same side# is searched. if there is no such place,
- * then the side is changed.
- *
- * @return returns the new index.
- */
- int moveNodeToWithoutUndo(final NodeModel child, final NodeModel newParent, final int newIndex,
- final boolean isLeft, final boolean changeSide) {
- final NodeModel oldParent = child.getParentNode();
- final int oldIndex = oldParent.getIndex(child);
- firePreNodeMoved(oldParent, oldIndex, newParent, child, newIndex);
- oldParent.remove(child);
- if (changeSide) {
- child.setParent(newParent);
- child.setLeft(isLeft);
- }
- newParent.insert(child, newIndex);
- fireNodeMoved(oldParent, oldIndex, newParent, child, newIndex);
- setSaved(newParent.getMap(), false);
- return newIndex;
- }
-
- public MapModel newModel(NodeModel existingNode) {
- // use new MMapModel() instead of calling this method with a null arg
- if(existingNode == null)
- throw new NullPointerException("null node not allowed.");
- final MMapModel mindMapMapModel = new MMapModel();
- mindMapMapModel.setRoot(existingNode);
- mindMapMapModel.registryNodeRecursive(existingNode);
- fireMapCreated(mindMapMapModel);
- return mindMapMapModel;
- }
-
- @Override
- public MapModel newModel() {
- final MMapModel mindMapMapModel = new MMapModel();
- mindMapMapModel.createNewRoot();
- fireMapCreated(mindMapMapModel);
- return mindMapMapModel;
- }
-
-
- @Override
- public void setSaved(final MapModel mapModel, final boolean saved) {
- final boolean setTitle = saved != mapModel.isSaved();
- mapModel.setSaved(saved);
- if (setTitle) {
- final Controller controller = Controller.getCurrentController();
- controller.getMapViewManager().setTitle();
- final AFreeplaneAction saveAction = controller.getModeController().getAction("SaveAction");
- if(saveAction != null)
- saveAction.setEnabled();
- }
- }
-
- public NodeModel addFreeNode(final Point pt, final boolean newNodeIsLeft) {
- final ModeController modeController = Controller.getCurrentModeController();
- final TextController textController = TextController.getController();
- if (textController instanceof MTextController) {
- ((MTextController) textController).stopEditing();
- modeController.forceNewTransaction();
- }
- final NodeModel target = getRootNode();
- final NodeModel targetNode = target;
- final boolean parentFolded = isFolded(targetNode);
- if (parentFolded) {
- setFolded(targetNode, false);
- }
- if (!isWriteable(target)) {
- UITools.errorMessage(TextUtils.getText("node_is_write_protected"));
- return null;
- }
- final NodeModel newNode = newNode("", target.getMap());
- LogicalStyleModel.createExtension(newNode).setStyle(MapStyleModel.FLOATING_STYLE);
- newNode.addExtension(modeController.getExtension(FreeNode.class));
- if(! addNewNode(newNode, target, -1, newNodeIsLeft))
- return null;
- ((MLocationController)MLocationController.getController(modeController)).moveNodePosition(newNode, -1, pt.x, pt.y);
- final Component component = Controller.getCurrentController().getMapViewManager().getComponent(newNode);
- if (component == null)
- return newNode;
- component.addFocusListener(new FocusListener() {
- public void focusLost(FocusEvent e) {
- }
-
- public void focusGained(FocusEvent e) {
- e.getComponent().removeFocusListener(this);
- ((MTextController) textController).edit(newNode, targetNode, true, false, false);
- }
- });
- select(newNode);
- return newNode;
- }
-
- /**@deprecated -- use MMapIO*/
- @Deprecated
- public boolean newUntitledMap(final URL url) throws FileNotFoundException, IOException, URISyntaxException, XMLException{
- try {
- Controller.getCurrentController().getViewController().setWaitingCursor(true);
- final MapModel newModel = new MMapModel();
- UrlManager.getController().load(url, newModel);
- newModel.setURL(null);
- fireMapCreated(newModel);
- newMapView(newModel);
- return true;
- }
- finally {
- Controller.getCurrentController().getViewController().setWaitingCursor(false);
- }
- }
-
- /**@throws XMLException
- * @deprecated -- use MMapIO*/
- @Deprecated
- @Override
- public boolean newMap(URL url) throws FileNotFoundException, IOException, URISyntaxException, XMLException {
- // load as documentation map if necessary
- if(getMModeController().containsExtension(DocuMapAttribute.class)){
- return newDocumentationMap(url);
- }
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- if (mapViewManager.tryToChangeToMapView(url))
- return false;
- if (AddOnsController.getController().installIfAppropriate(url))
- return false;
- URL alternativeURL = null;
- try {
- final File file = Compat.urlToFile(url);
- if(file == null){
- alternativeURL = url;
- }
- else{
- if(file.exists()){
- final MFileManager fileManager = MFileManager.getController(getMModeController());
- File alternativeFile = fileManager.getAlternativeFile(file, AlternativeFileMode.AUTOSAVE);
- if(alternativeFile != null){
- if (alternativeFile.getAbsoluteFile().equals(file.getAbsoluteFile()) )
- alternativeURL = url;
- else
- alternativeURL = Compat.fileToUrl(alternativeFile);
- }
- else
- return false;
- }
- else{
- alternativeURL = url;
- }
- }
- }
- catch (MalformedURLException e) {
- }
- catch (URISyntaxException e) {
- }
-
- if(alternativeURL == null)
- return false;
- Controller.getCurrentController().getViewController().setWaitingCursor(true);
- try{
- final MapModel newModel = new MMapModel();
- final MFileManager fileManager = MFileManager.getController(getMModeController());
- fileManager.loadAndLock(alternativeURL, newModel);
- newModel.setURL(url);
- newModel.setSaved(alternativeURL.equals(url));
- fireMapCreated(newModel);
- newMapView(newModel);
- return true;
- }
- finally {
- Controller.getCurrentController().getViewController().setWaitingCursor(false);
- }
- }
-
- /**@throws XMLException
- * @deprecated -- use MMapIO*/
- @Deprecated
- public boolean newDocumentationMap(final URL url) throws FileNotFoundException, IOException, URISyntaxException, XMLException{
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- if (mapViewManager.tryToChangeToMapView(url))
- return false;
- try {
- Controller.getCurrentController().getViewController().setWaitingCursor(true);
- final MapModel newModel = new MMapModel();
- newModel.addExtension(DocuMapAttribute.instance);
- UrlManager.getController().load(url, newModel);
- newModel.setReadOnly(true);
- fireMapCreated(newModel);
- newMapView(newModel);
- return true;
- }
- finally {
- Controller.getCurrentController().getViewController().setWaitingCursor(false);
- }
- }
-
- /**@throws XMLException
- * @deprecated -- use MMapIO*/
- @Deprecated
- public boolean restoreCurrentMap() throws FileNotFoundException, IOException, URISyntaxException, XMLException {
- final Controller controller = Controller.getCurrentController();
- final MapModel map = controller.getMap();
- final URL url = map.getURL();
- if(url == null){
- UITools.errorMessage(TextUtils.getText("map_not_saved"));
- return false;
- }
-
- if(map.containsExtension(DocuMapAttribute.class)){
- controller.close(true);
- return newDocumentationMap(url);
- }
-
- final URL alternativeURL = MFileManager.getController(getMModeController()).getAlternativeURL(url, AlternativeFileMode.ALL);
- if(alternativeURL == null)
- return false;
- Controller.getCurrentController().getViewController().setWaitingCursor(true);
- try{
- final MapModel newModel = new MMapModel();
- ((MFileManager)MFileManager.getController()).loadAndLock(alternativeURL, newModel);
- newModel.setURL(url);
- newModel.setSaved(alternativeURL.equals(url));
- fireMapCreated(newModel);
- controller.close(true);
- newMapView(newModel);
- return true;
- }
- finally {
- Controller.getCurrentController().getViewController().setWaitingCursor(false);
- }
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/MMapModel.java b/freeplane/src/org/freeplane/features/map/mindmapmode/MMapModel.java
deleted file mode 100644
index 5a93b5a..0000000
--- a/freeplane/src/org/freeplane/features/map/mindmapmode/MMapModel.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map.mindmapmode;
-
-import java.awt.EventQueue;
-import java.io.File;
-import java.net.URL;
-import java.util.Timer;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.core.undo.UndoHandler;
-import org.freeplane.core.util.SysUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.features.url.mindmapmode.DoAutomaticSave;
-import org.freeplane.features.url.mindmapmode.DummyLockManager;
-import org.freeplane.features.url.mindmapmode.LockManager;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-
-public class MMapModel extends MapModel {
- private static int unnamedMapsNumber = 1;
- private LockManager lockManager;
- private Timer timerForAutomaticSaving;
- private int titleNumber = 0;
-
- /**
- * The current version and all other version that don't need XML update for
- * sure.
- */
- public MMapModel() {
- super();
- addExtension(IUndoHandler.class, new UndoHandler());
- this.setLockManager(ResourceController.getResourceController().getBooleanProperty(
- "experimental_file_locking_on") ? new LockManager() : new DummyLockManager());
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- scheduleTimerForAutomaticSaving();
- }
- });
- }
-
- @Override
- public boolean isSaved() {
- return super.isSaved() || containsExtension(DocuMapAttribute.class);
- }
-
- /**
- * When a map is closed, this method is called.
- *
- * @param mindMapMapModel
- */
- @Override
- public void destroy() {
- getLockManager().releaseLock();
- getLockManager().releaseTimer();
- /* cancel the timer, if map is closed. */
- if (getTimerForAutomaticSaving() != null) {
- getTimerForAutomaticSaving().cancel();
- }
- super.destroy();
- }
-
- public LockManager getLockManager() {
- return lockManager;
- }
-
- public Timer getTimerForAutomaticSaving() {
- return timerForAutomaticSaving;
- }
-
- @Override
- public String getTitle() {
- final URL url = getURL();
- if (url != null) {
- final File file = getFile();
- if(file != null) {
- final String fileName = file.getName();
- if(fileName.endsWith(UrlManager.FREEPLANE_FILE_EXTENSION))
- return fileName.substring(0, fileName.length() - UrlManager.FREEPLANE_FILE_EXTENSION.length());
- return fileName;
- }
- else
- return url.toString();
- }
- if (titleNumber == 0) {
- titleNumber = MMapModel.unnamedMapsNumber++;
- }
- return TextUtils.getText("mindmap") + titleNumber;
- }
-
- public void scheduleTimerForAutomaticSaving() {
- if (!(UrlManager.getController() instanceof MFileManager)) {
- return;
- }
- final int numberOfTempFiles = Integer.parseInt(ResourceController.getResourceController().getProperty(
- "number_of_different_files_for_automatic_save"));
- if (numberOfTempFiles == 0) {
- return;
- }
- final boolean filesShouldBeDeletedAfterShutdown = ResourceController.getResourceController()
- .getBooleanProperty("delete_automatic_saves_at_exit");
- final int delay = Integer.parseInt(ResourceController.getResourceController().getProperty(
- "time_for_automatic_save"));
- if (delay == 0) {
- return;
- }
- final boolean useSingleBackupDirectory = ResourceController.getResourceController().getBooleanProperty(
- "single_backup_directory");
- final String singleBackupDirectory = ResourceController.getResourceController()
- .getProperty("single_backup_directory_path");
- final Timer timer = SysUtils.createTimer("TimerForAutomaticSaving");
- timer.schedule(new DoAutomaticSave(this, numberOfTempFiles, filesShouldBeDeletedAfterShutdown,
- useSingleBackupDirectory, singleBackupDirectory), delay, delay);
- this.setTimerForAutomaticSaving(timer);
- }
-
- void setLockManager(final LockManager lockManager) {
- this.lockManager = lockManager;
- }
-
- void setTimerForAutomaticSaving(final Timer timerForAutomaticSaving) {
- this.timerForAutomaticSaving = timerForAutomaticSaving;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewParentNode.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NewParentNode.java
deleted file mode 100644
index c2e6d46..0000000
--- a/freeplane/src/org/freeplane/features/map/mindmapmode/NewParentNode.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map.mindmapmode;
-
-import java.awt.EventQueue;
-import java.awt.event.ActionEvent;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-
-/**
- * @author foltin The original version was sent by Stephen Viles (sviles) https:
- * group_id=7118 Initial Comment: The "New Parent Node" action creates a
- * node as a parent of one or more selected nodes. If more than one node
- * is selected, the selected nodes must all have the same parent -- this
- * restriction is imposed to make the action easier to understand and to
- * undo manually, and could potentially be removed when we get automated
- * undo. The root node must not be one of the selected nodes. I find
- * this action useful when I need to add an extra level of grouping in
- * the middle of an existing hierarchy. It is quicker than adding a new
- * node at the same level and then cutting-and-pasting the child nodes.
- * The code simply performs these actions in sequence, after validating
- * the selected nodes.
- */
-public class NewParentNode extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- *
- */
- public NewParentNode() {
- super("NewParentNode");
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.extensions.NodeHook#invoke(freeplane.modes.MindMapNode,
- * java.util.List)
- */
- public void actionPerformed(final ActionEvent e) {
- final NodeModel selectedNode = Controller.getCurrentModeController().getMapController().getSelectedNode();
- if(selectedNode == null)
- return;
- Collection<NodeModel> unmodifyable = Controller.getCurrentModeController().getMapController().getSelectedNodes();
- final List<NodeModel> selectedNodes = new ArrayList<NodeModel>(unmodifyable.size());
- selectedNodes.addAll(unmodifyable);
- Controller.getCurrentModeController().getMapController().sortNodesByDepth(selectedNodes);
- if (selectedNode.isRoot()) {
- UITools.errorMessage(TextUtils.getText("cannot_add_parent_to_root"));
- return;
- }
- final NodeModel newNode = moveToNewParent(selectedNode, selectedNodes);
- if (newNode == null) {
- return;
- }
- Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(newNode);
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- ((MTextController) TextController.getController()).edit(newNode, selectedNode, true, false, false);
- }
- });
-
- }
-
- private NodeModel moveToNewParent(final NodeModel selectedNode, final List<NodeModel> selectedNodes) {
- final NodeModel oldParent = selectedNode.getParentNode();
- final int childPosition = oldParent.getChildPosition(selectedNode);
- final NodeModel newParent = ((MMapController) Controller.getCurrentModeController().getMapController()).addNewNode(oldParent,
- childPosition, selectedNode.isLeft());
- for (final NodeModel node: selectedNodes) {
- if (node.getParentNode() != oldParent) {
- UITools.errorMessage(TextUtils.getText("cannot_add_parent_diff_parents"));
- return null;
- }
- if (node.isRoot()) {
- UITools.errorMessage(TextUtils.getText("cannot_add_parent_to_root"));
- return null;
- }
- }
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- for (final NodeModel node : selectedNodes) {
- mapController.moveNodeAsChild(node, newParent, false, false);
- }
- return newParent;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NewSummaryAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NewSummaryAction.java
deleted file mode 100644
index 6da3411..0000000
--- a/freeplane/src/org/freeplane/features/map/mindmapmode/NewSummaryAction.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.util.List;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.SummaryNode;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-class NewSummaryAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int start;
- private int end;
- private int summaryLevel;
-
- public NewSummaryAction() {
- super("NewSummaryAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- if(! check()){
- UITools.errorMessage(TextUtils.getText("summary_not_possible"));
- return;
- }
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- mapController.addNewSummaryNodeStartEditing(summaryLevel, start, end);
- }
-
- private boolean check() {
- start = -1;
- end = -1;
- summaryLevel = -1;
- final ModeController modeController = Controller.getCurrentModeController();
- final IMapSelection selection = modeController.getController().getSelection();
-
- final List<NodeModel> sortedSelection = selection.getSortedSelection(false);
-
- final NodeModel firstNode = sortedSelection.get(0);
-
- final NodeModel parentNode = firstNode.getParentNode();
- // root node selected
- if(parentNode == null)
- return false;
-
- final NodeModel lastNode = sortedSelection.get(sortedSelection.size()-1);
- // different parents
- if(! parentNode.equals(lastNode.getParentNode())){
- return false;
- }
- final boolean isLeft = firstNode.isLeft();
- // different sides
- if(isLeft!=lastNode.isLeft()){
- return false;
- }
- start = parentNode.getIndex(firstNode);
- end = parentNode.getIndex(lastNode);
-
- // last node is a group node
- if(firstNode != lastNode && SummaryNode.isFirstGroupNode(lastNode))
- return false;
-
- summaryLevel = SummaryNode.getSummaryLevel(firstNode);
-
- // selected nodes have different summary levels
- if (summaryLevel != SummaryNode.getSummaryLevel(lastNode))
- return false;
- int level = summaryLevel;
- for(int i = start+1; i < end; i++){
- NodeModel node = (NodeModel) parentNode.getChildAt(i);
- if(isLeft != node.isLeft())
- continue;
- if(SummaryNode.isSummaryNode(node))
- level++;
- else
- level = 0;
- // There is a higher summary node between the selected nodes
- if(level > summaryLevel)
- return false;
- }
- return true;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NodeDownAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NodeDownAction.java
deleted file mode 100644
index bdba508..0000000
--- a/freeplane/src/org/freeplane/features/map/mindmapmode/NodeDownAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-class NodeDownAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public NodeDownAction() {
- super("NodeDownAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- ((MMapController) modeController.getMapController()).moveNodes(modeController.getMapController()
- .getSelectedNode(), modeController.getMapController().getSelectedNodes(), 1);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/map/mindmapmode/NodeUpAction.java b/freeplane/src/org/freeplane/features/map/mindmapmode/NodeUpAction.java
deleted file mode 100644
index 0ab2e20..0000000
--- a/freeplane/src/org/freeplane/features/map/mindmapmode/NodeUpAction.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.map.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.mode.Controller;
-
-class NodeUpAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public NodeUpAction() {
- super("NodeUpAction");
- }
-
-
- public void actionPerformed(final ActionEvent e) {
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- mapController.moveNodes(mapController.getSelectedNode(), mapController.getSelectedNodes(), -1);
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/features/mapio/mindmapmode/MMapIO.java b/freeplane/src/org/freeplane/features/mapio/mindmapmode/MMapIO.java
deleted file mode 100644
index c739251..0000000
--- a/freeplane/src/org/freeplane/features/mapio/mindmapmode/MMapIO.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mapio.mindmapmode;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.URISyntaxException;
-import java.net.URL;
-
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mapio.MapIO;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-import org.freeplane.n3.nanoxml.XMLException;
-import org.freeplane.n3.nanoxml.XMLParseException;
-
-/**
- * @author Dimitry Polivaev
- * Jan 14, 2012
- */
- at SuppressWarnings("deprecation")
-public class MMapIO extends MapIO{
- final private MFileManager fileManager;
- final private MMapController mapController;
- private MMapIO(MFileManager urlManager, MMapController mapController) {
- super(urlManager, mapController);
- this.fileManager = urlManager;
- this.mapController = mapController;
- }
- public static void install(MModeController modeController){
- MFileManager urlManager = (MFileManager) modeController.getExtension(UrlManager.class);
- MMapController mapController = (MMapController) modeController.getMapController();
- final MMapIO mapIO = new MMapIO(urlManager, mapController);
- modeController.addExtension(MapIO.class, mapIO);
- }
- public void load(URL url, MapModel map) throws FileNotFoundException, IOException, XMLException, XMLParseException,
- URISyntaxException {
- fileManager.load(url, map);
- }
- public boolean loadCatchExceptions(URL url, MapModel map)
- {
- return fileManager.loadCatchExceptions(url, map);
- }
-
- public void loadSafeAndLock(URL url, MapModel map) throws FileNotFoundException, IOException, XMLParseException,
- URISyntaxException {
- fileManager.loadAndLock(url, map);
- }
- public void open() {
- fileManager.open();
- }
- public void newMapFromTemplate(File startFile) {
- fileManager.newMapFromTemplate(startFile);
- }
- public void saveAsUserTemplate() {
- fileManager.saveAsUserTemplate();
- }
- public boolean save(MapModel map) {
- return fileManager.save(map);
- }
- /**
- * @return false is the action was cancelled
- */
- public boolean save(MapModel map, File file) {
- return fileManager.save(map, file);
- }
- /**
- * @return false is the action was cancelled
- */
- public boolean saveAs(MapModel map) {
- return fileManager.saveAs(map);
- }
- public void writeToFile(MapModel map, File file) throws FileNotFoundException, IOException {
- fileManager.writeToFile(map, file);
- }
- public String tryToLock(MapModel map, File file) throws Exception {
- return fileManager.tryToLock(map, file);
- }
- public NodeModel loadTree(MapModel map, File file) throws XMLParseException, IOException {
- return fileManager.loadTree(map, file);
- }
- public MapModel newMapFromDefaultTemplate() {
- return fileManager.newMapFromDefaultTemplate();
- }
- public boolean newUntitledMap(URL url) throws FileNotFoundException, IOException,
- URISyntaxException, XMLException {
- return mapController.newUntitledMap(url);
- }
- public boolean newMap(URL url) throws FileNotFoundException, IOException, URISyntaxException, XMLException {
- return mapController.newMap(url);
- }
- public boolean newDocumentationMap(URL url) throws FileNotFoundException, IOException,
- URISyntaxException, XMLException {
- return mapController.newDocumentationMap(url);
- }
- public boolean restoreCurrentMap() throws FileNotFoundException, IOException, URISyntaxException, XMLException {
- return mapController.restoreCurrentMap();
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/mode/AController.java b/freeplane/src/org/freeplane/features/mode/AController.java
deleted file mode 100644
index ad085e8..0000000
--- a/freeplane/src/org/freeplane/features/mode/AController.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.freeplane.features.mode;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.freeplane.core.resources.IFreeplanePropertyListener;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-
-/**
- * Place for common controller things.
- *
- * @author robert.ladstaetter
- */
-public class AController {
- private static class ActionSelectorOnPropertyChange implements IFreeplanePropertyListener, IActionOnChange {
- final String propertyName;
- final AFreeplaneAction action;
-
- public ActionSelectorOnPropertyChange(final AFreeplaneAction action) {
- super();
- this.action = action;
- propertyName = action.getClass().getAnnotation(SelectableAction.class).checkOnPropertyChange();
- }
-
- public AFreeplaneAction getAction() {
- return action;
- }
-
- public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
- if (this.propertyName.equals(propertyName)) {
- action.setSelected();
- }
- }
- }
-
- public interface IActionOnChange {
- AFreeplaneAction getAction();
- }
-
- private final Map<String, AFreeplaneAction> actions = new HashMap<String, AFreeplaneAction>();
-
- public AController() {
- }
-
- public void addAction(final AFreeplaneAction value) {
- final String key = value.getKey();
- final AFreeplaneAction old = getActions().put(key, value);
- //String pattern = key.replaceAll("\\.", "\\\\.").replaceAll("/", "\\\\/");
- //System.out.println("key\t\t" + value.getClass().getSimpleName() + "\t\ts/\\\"" + pattern + "\\\"/\\\"" + value.getClass().getSimpleName() + "\\\"/;");
- if (old != null && !old.equals(value)) {
- getActions().put(key, old);
- throw new RuntimeException("action " + key + " already registered");
- }
- if (AFreeplaneAction.checkSelectionOnPropertyChange(value)) {
- final ActionSelectorOnPropertyChange listener = new ActionSelectorOnPropertyChange(value);
- ResourceController.getResourceController().addPropertyChangeListener(listener);
- }
- }
-
- public AFreeplaneAction getAction(final String key) {
- return getActions().get(key);
- }
-
- protected Map<String, AFreeplaneAction> getActions() {
- return actions;
- }
-
- public AFreeplaneAction removeAction(final String key) {
- final AFreeplaneAction action = getActions().remove(key);
- if (AFreeplaneAction.checkSelectionOnPropertyChange(action)) {
- ResourceController.getResourceController().removePropertyChangeListener(
- ActionSelectorOnPropertyChange.class, action);
- }
- return action;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/mode/Controller.java b/freeplane/src/org/freeplane/features/mode/Controller.java
deleted file mode 100644
index 34fd838..0000000
--- a/freeplane/src/org/freeplane/features/mode/Controller.java
+++ /dev/null
@@ -1,280 +0,0 @@
-
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode;
-
-import java.awt.event.ActionEvent;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.io.IOExceptionWithCause;
-import org.freeplane.core.extension.ExtensionContainer;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.OptionPanelController;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.IValidator;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.ui.ViewController;
-
-/**
- * Provides the methods to edit/change a Node. Forwards all messages to
- * MapModel(editing) or MapView(navigation).
- */
-public class Controller extends AController {
- private final ExtensionContainer extensionContainer;
- /**
- * Converts from a local link to the real file URL of the documentation map.
- * (Used to change this behavior under MacOSX).
- */
- private ModeController modeController;
- private ModeController modeController4build;
- final private Map<String, ModeController> modeControllers = new LinkedHashMap<String, ModeController>();
- private ViewController viewController;
- private final ResourceController resourceController;
- private final List<IValidator> optionValidators = new ArrayList<IValidator>();
- private final OptionPanelController optionPanelController;
- private IMapViewManager mapViewManager;
-
- public Controller(ResourceController resourceController) {
- super();
- if(currentController == null){
- currentController = this;
- }
- this.resourceController = resourceController;
- this.optionPanelController = new OptionPanelController();
- extensionContainer = new ExtensionContainer(new HashMap<Class<? extends IExtension>, IExtension>());
- addAction(new MoveToRootAction());
- addAction(new CenterSelectedNodeAction());
- }
-
- public void addExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
- extensionContainer.addExtension(clazz, extension);
- }
-
- public void addModeController(final ModeController modeController) {
- modeControllers.put(modeController.getModeName(), modeController);
- }
-
- /**
- * Closes the actual map.
- *
- * @param withoutSave
- * true= without save.
- */
- public void close(final boolean withoutSave) {
- getMapViewManager().close(withoutSave);
- }
-
- public <T extends IExtension> T getExtension(final Class<T> clazz){
- return extensionContainer.getExtension(clazz);
- }
-
- /**
- * @return
- */
- public MapModel getMap() {
- return getMapViewManager().getModel();
- }
-
- public IMapViewManager getMapViewManager() {
- return mapViewManager;
- }
-
- public void setMapViewManager(IMapViewManager mapViewManager) {
- this.mapViewManager = mapViewManager;
- }
-
- /** @return the current modeController. */
- public ModeController getModeController() {
- return modeController4build != null ? modeController4build : modeController;
- }
-
- public ModeController getModeController(final String modeName) {
- return modeControllers.get(modeName);
- }
-
- public Set<String> getModes() {
- return modeControllers.keySet();
- }
-
- public IMapSelection getSelection() {
- return getMapViewManager().getMapSelection();
- }
-
- /**
- * @return
- */
- public ViewController getViewController() {
- return viewController;
- }
-
- public void quit() {
- if (shutdown()) {
- System.exit(0);
- }
- }
-
- /**
- * @param actionEvent
- */
- public void quit(final ActionEvent actionEvent) {
- getActions().get("QuitAction").actionPerformed(actionEvent);
- }
-
- public void selectMode(ModeController newModeController) {
- modeController4build = null;
- final ModeController oldModeController = modeController;
- if (oldModeController == newModeController) {
- return;
- }
- if (oldModeController != null) {
- oldModeController.shutdown();
- }
- LogUtils.info("requesting mode: " + newModeController.getModeName());
- modeController = newModeController;
- viewController.selectMode(oldModeController, newModeController);
- getMapViewManager().changeToMode(newModeController.getModeName());
- newModeController.startup();
- }
-
- public void selectMode(final String modeName) {
- final ModeController newModeController = modeControllers.get(modeName);
- if (newModeController == null) {
- return;
- }
- if (modeController == newModeController) {
- return;
- }
- selectMode(newModeController);
- }
-
- public void setViewController(final ViewController viewController) {
- this.viewController = viewController;
- }
-
- public boolean shutdown() {
- getViewController().saveProperties();
- ResourceController.getResourceController().saveProperties();
- if (!getViewController().quit()) {
- return false;
- }
- extensionContainer.getExtensions().clear();
- return true;
- }
-
- public static void exec(final String string) throws IOException {
- exec(string, false);
- }
-
- public static void exec(final String string, boolean waitFor) throws IOException {
- IControllerExecuteExtension ext = Controller.getCurrentController().getExtension(IControllerExecuteExtension.class);
- if(ext == null) {
- ext = Controller.getCurrentController().getDefaultExecuter();
- }
-
- ext.exec(string, waitFor);
- }
-
- public static void exec(final String[] command) throws IOException {
- exec(command, false);
- }
-
- public static void exec(final String[] command, boolean waitFor) throws IOException {
- IControllerExecuteExtension ext = Controller.getCurrentController().getExtension(IControllerExecuteExtension.class);
- if(ext == null) {
- ext = Controller.getCurrentController().getDefaultExecuter();
- }
-
- ext.exec(command, waitFor);
- }
-
- private IControllerExecuteExtension getDefaultExecuter() {
- return new IControllerExecuteExtension() {
-
- public void exec(String[] command, boolean waitFor) throws IOException {
- LogUtils.info("execute " + Arrays.toString(command));
- Process proc = Runtime.getRuntime().exec(command);
- waiting(waitFor, proc);
- }
-
- public void exec(String string, boolean waitFor) throws IOException {
- LogUtils.info("execute " + string);
- Process proc = Runtime.getRuntime().exec(string);
- waiting(waitFor, proc);
- }
-
- private void waiting(boolean waitFor, Process proc)
- throws IOExceptionWithCause {
- if(waitFor) {
- try {
- proc.waitFor();
- } catch (InterruptedException e) {
- throw new IOExceptionWithCause(e);
- }
- }
- }
- };
- }
-
- private static ThreadLocal<Controller> threadController = new ThreadLocal<Controller>();
- private static Controller currentController = null;
- public static Controller getCurrentController() {
- final Controller controller = threadController.get();
- return controller != null ? controller : currentController;
- }
-
- public static void setCurrentController(final Controller controller){
- currentController = controller;
- }
-
- public static ModeController getCurrentModeController() {
- return getCurrentController().getModeController();
- }
-
- public void selectModeForBuild(ModeController modeController4build) {
- this.modeController4build = modeController4build;
-
- }
-
- public ResourceController getResourceController() {
- return resourceController;
- }
-
- public void addOptionValidator(IValidator validator) {
- optionValidators.add(validator);
- }
-
- public List<IValidator> getOptionValidators() {
- return optionValidators;
- }
-
- public OptionPanelController getOptionPanelController() {
- return optionPanelController;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/mode/ModeController.java b/freeplane/src/org/freeplane/features/mode/ModeController.java
deleted file mode 100644
index d3eda19..0000000
--- a/freeplane/src/org/freeplane/features/mode/ModeController.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.TreeMap;
-
-import org.freeplane.core.extension.ExtensionContainer;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.IUserInputListenerFactory;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.features.map.IExtensionCopier;
-import org.freeplane.features.map.ITooltipProvider;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.DocuMapAttribute;
-import org.freeplane.features.ui.INodeViewLifeCycleListener;
-
-/**
- * Derive from this class to implement the Controller for your mode. Overload
- * the methods you need for your data model, or use the defaults. There are some
- * default Actions you may want to use for easy editing of your model. Take
- * MindMapController as a sample.
- */
-public class ModeController extends AController {
-// // final private Controller controller;
- private final ExtensionContainer extensionContainer;
- private final Collection<IExtensionCopier> copiers;
- private boolean isBlocked = false;
- private MapController mapController;
- final private Map<Integer, ITooltipProvider> toolTip = new TreeMap<Integer, ITooltipProvider>();
- final private List<IMenuContributor> menuContributors = new LinkedList<IMenuContributor>();
- /**
- * The model, this controller belongs to. It may be null, if it is the
- * default controller that does not show a map.
- */
- final private List<INodeViewLifeCycleListener> nodeViewListeners = new LinkedList<INodeViewLifeCycleListener>();
- /**
- * Take care! This listener is also used for modelpopups (as for graphical
- * links).
- */
- private IUserInputListenerFactory userInputListenerFactory;
- final private Controller controller;
-
- /**
- * Instantiation order: first me and then the model.
- */
- public ModeController(final Controller controller) {
- this.controller = controller;
- extensionContainer = new ExtensionContainer(new HashMap<Class<? extends IExtension>, IExtension>());
- copiers = new LinkedList<IExtensionCopier>();
- }
-
- @Override
- public void addAction(final AFreeplaneAction action) {
- super.addAction(action);
- if (mapController != null) {
- mapController.addListenerForAction(action);
- }
- }
-
- public void addExtension(final Class<? extends IExtension> clazz, final IExtension extension) {
- extensionContainer.addExtension(clazz, extension);
- }
-
- public void registerExtensionCopier(final IExtensionCopier copier) {
- copiers.add(copier);
- }
-
- public void unregisterExtensionCopier(final IExtensionCopier copier) {
- copiers.remove(copier);
- }
-
- public void copyExtensions(final Object key, final NodeModel from, final NodeModel to) {
- for (final IExtensionCopier copier : copiers) {
- copier.copy(key, from, to);
- }
- }
-
- public void undoableCopyExtensions(final Object key, final NodeModel from, final NodeModel to) {
- final MapModel map = to.getMap();
- if (map == null) {
- copyExtensions(key, from, to);
- return;
- }
- final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
- if (undoHandler == null) {
- copyExtensions(key, from, to);
- return;
- }
- final NodeModel backup = new NodeModel(null);
- copyExtensions(key, to, backup);
- final IActor actor = new IActor() {
- public void undo() {
- removeExtensions(key, to);
- copyExtensions(key, backup, to);
- getMapController().nodeChanged(to);
- }
-
- public String getDescription() {
- return "undoableCopyExtensions";
- }
-
- public void act() {
- copyExtensions(key, from, to);
- getMapController().nodeChanged(to);
- }
- };
- execute(actor, map);
- }
-
- void removeExtensions(final Object key, final NodeModel from, final NodeModel which) {
- if (from.equals(which)) {
- for (final IExtensionCopier copier : copiers) {
- copier.remove(key, from);
- }
- return;
- }
- for (final IExtensionCopier copier : copiers) {
- copier.remove(key, from, which);
- }
- }
-
- public void undoableRemoveExtensions(final Object key, final NodeModel from, final NodeModel which) {
- final MapModel map = from.getMap();
- if (map == null) {
- removeExtensions(key, from, which);
- return;
- }
- final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
- if (undoHandler == null) {
- removeExtensions(key, from, which);
- return;
- }
- final NodeModel backup = new NodeModel(null);
- copyExtensions(key, from, backup);
- final IActor actor = new IActor() {
- public void undo() {
- copyExtensions(key, backup, from);
- getMapController().nodeChanged(from);
- }
-
- public String getDescription() {
- return "undoableCopyExtensions";
- }
-
- public void act() {
- removeExtensions(key, from, which);
- getMapController().nodeChanged(from);
- }
- };
- execute(actor, map);
- }
-
- public void resolveParentExtensions(final Object key, final NodeModel to) {
- for (final IExtensionCopier copier : copiers) {
- copier.resolveParentExtensions(key, to);
- }
- }
-
- public void undoableResolveParentExtensions(final Object key, final NodeModel to) {
- final MapModel map = to.getMap();
- if (map == null) {
- resolveParentExtensions(key, to);
- return;
- }
- final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
- if (undoHandler == null) {
- resolveParentExtensions(key, to);
- return;
- }
- final NodeModel backup = new NodeModel(null);
- copyExtensions(key, to, backup);
- final IActor actor = new IActor() {
- public void undo() {
- copyExtensions(key, backup, to);
- getMapController().nodeChanged(to);
- }
-
- public String getDescription() {
- return "undoableCopyExtensions";
- }
-
- public void act() {
- resolveParentExtensions(key, to);
- getMapController().nodeChanged(to);
- }
- };
- execute(actor, map);
- }
-
- void removeExtensions(final Object key, final NodeModel from) {
- for (final IExtensionCopier copier : copiers) {
- copier.remove(key, from, from);
- }
- }
-
- public void addINodeViewLifeCycleListener(final INodeViewLifeCycleListener listener) {
- nodeViewListeners.add(listener);
- }
-
- public void addMenuContributor(final IMenuContributor contributor) {
- menuContributors.add(contributor);
- }
-
- public void commit() {
- }
-
- public boolean isUndoAction() {
- return false;
- }
-
- public void execute(final IActor actor, final MapModel map) {
- actor.act();
- }
-
- @Override
- public AFreeplaneAction getAction(final String key) {
- final AFreeplaneAction action = super.getAction(key);
- if (action != null) {
- return action;
- }
- return getController().getAction(key);
- }
-
- public Controller getController() {
- return controller;
- }
-
- public <T extends IExtension> T getExtension(final Class<T> clazz) {
- return extensionContainer.getExtension(clazz);
- }
-
- public boolean containsExtension(final Class<? extends IExtension> clazz) {
- return extensionContainer.containsExtension(clazz);
- }
-
- public void removeExtension(Class<? extends IExtension> clazz) {
- extensionContainer.removeExtension(clazz);
- }
- public MapController getMapController() {
- return mapController;
- }
-
- public String getModeName() {
- return null;
- }
-
- public IUserInputListenerFactory getUserInputListenerFactory() {
- return userInputListenerFactory;
- }
-
- public boolean hasOneVisibleChild(final NodeModel parent) {
- int count = 0;
- for (final NodeModel child : getMapController().childrenUnfolded(parent)) {
- if (child.isVisible()) {
- count++;
- }
- if (count == 2) {
- return false;
- }
- }
- return count == 1;
- }
-
- public boolean isBlocked() {
- return isBlocked;
- }
-
- public void onViewCreated(final Container node) {
- for (final INodeViewLifeCycleListener hook : nodeViewListeners) {
- hook.onViewCreated(node);
- }
- }
-
- public void onViewRemoved(final Container node) {
- for (final INodeViewLifeCycleListener hook : nodeViewListeners) {
- hook.onViewRemoved(node);
- }
- }
-
- @Override
- public AFreeplaneAction removeAction(final String key) {
- final AFreeplaneAction action = super.removeAction(key);
- if (mapController != null) {
- mapController.removeListenerForAction(action);
- }
- return action;
- }
-
- public void removeINodeViewLifeCycleListener(final INodeViewLifeCycleListener listener) {
- nodeViewListeners.remove(listener);
- }
-
- public void rollback() {
- }
-
- public void setBlocked(final boolean isBlocked) {
- this.isBlocked = isBlocked;
- }
-
- public void setMapController(final MapController mapController) {
- this.mapController = mapController;
- addExtension(MapController.class, mapController);
- }
-
- public void setUserInputListenerFactory(final IUserInputListenerFactory userInputListenerFactory) {
- this.userInputListenerFactory = userInputListenerFactory;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.modes.ModeController#setVisible(boolean)
- */
- public void setVisible(final boolean visible) {
- final NodeModel node = getController().getSelection().getSelected();
- if (visible) {
- mapController.onSelect(node);
- }
- else {
- if (node != null) {
- mapController.onDeselect(node);
- }
- }
- }
-
- public void shutdown() {
- }
-
- public void startTransaction() {
- }
- public void forceNewTransaction() {
- }
-
- /**
- * This method is called after and before a change of the map mapView. Use
- * it to perform the actions that cannot be performed at creation time.
- */
- public void startup() {
- }
-
- public void updateMenus(String menuStructure, final Set<String> plugins) {
- final IUserInputListenerFactory userInputListenerFactory = getUserInputListenerFactory();
- userInputListenerFactory.updateMenus(menuStructure, plugins);
- final MenuBuilder menuBuilder = userInputListenerFactory.getMenuBuilder();
- final Iterator<IMenuContributor> iterator = menuContributors.iterator();
- while (iterator.hasNext()) {
- iterator.next().updateMenus(this, menuBuilder);
- }
- }
-
- public boolean canEdit() {
- return false;
- }
- public String createToolTip(final NodeModel node, Component view) {
- // perhaps we should use the solution presented in the 3rd answer at
- // http://stackoverflow.com/questions/3355469/1-pixel-table-border-in-jtextpane-using-html
- // html/css example: http://www.wer-weiss-was.de/theme35/article3555660.html
- final String style = "<style type='text/css'>" //
- + " body { font-size: 10pt; }" // FIXME: copy from NoteController.setNoteTooltip() ?
- + "</style>";
- final StringBuilder text = new StringBuilder("<html><head>"+style+"</head><body>");
- boolean tooltipSet = false;
- for (final ITooltipProvider provider : toolTip.values()) {
- String value = provider.getTooltip(this, node, view);
- if (value == null) {
- continue;
- }
- value = value.replace("<html>", "<div>");
- value = value.replaceAll("\\s*</?(body|head)>", "");
- value = value.replace("<td>", "<td style='background-color: white'>");
- value = value.replace("</html>", "</div>");
- if (tooltipSet) {
- text.append("<br>");
- }
- text.append(value);
- tooltipSet = true;
- }
- if (tooltipSet) {
- text.append("</body></html>");
-// System.err.println("tooltip=" + text);
- return text.toString();
- }
- return null;
- }
-
- /**
- */
- public void addToolTipProvider(final Integer key, final ITooltipProvider tooltip) {
- if (tooltip == null) {
- if (toolTip.containsKey(key)) {
- toolTip.remove(key);
- }
- }
- else {
- toolTip.put(key, tooltip);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/mode/MoveToRootAction.java b/freeplane/src/org/freeplane/features/mode/MoveToRootAction.java
deleted file mode 100644
index d619ef4..0000000
--- a/freeplane/src/org/freeplane/features/mode/MoveToRootAction.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-
-class MoveToRootAction extends AFreeplaneAction {
- static final String NAME = "moveToRoot";
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- MoveToRootAction() {
- super("MoveToRootAction");
- }
-
- public void actionPerformed(final ActionEvent event) {
- Controller.getCurrentController().getSelection().selectRoot();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/mode/PersistentNodeHook.java b/freeplane/src/org/freeplane/features/mode/PersistentNodeHook.java
deleted file mode 100644
index ff3f2e2..0000000
--- a/freeplane/src/org/freeplane/features/mode/PersistentNodeHook.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode;
-
-import java.awt.event.ActionEvent;
-import java.io.IOException;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IElementHandler;
-import org.freeplane.core.io.IExtensionElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public abstract class PersistentNodeHook {
- static private Set<Class<? extends IExtension>> mapExtensionClasses = new HashSet<Class<? extends IExtension>>();
-
- public static boolean isMapExtension(final Class<? extends IExtension> clazz) {
- return mapExtensionClasses.contains(clazz);
- }
-
- public abstract class HookAction extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
-
- public HookAction(final String key) {
- super(key);
- }
-
- public void actionPerformed(final ActionEvent e) {
- undoableSetHook(!isActiveForSelection());
- }
- }
-
- @SelectableAction(checkOnNodeChange = true)
- protected class SelectableHookAction extends HookAction {
- private static final long serialVersionUID = 1L;
-
- public SelectableHookAction(final String key) {
- super(key);
- // System.out.println("SelectableHookAction " + key);
- }
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- setSelected(!isActiveForSelection());
- super.actionPerformed(e);
- setSelected(isActiveForSelection());
- }
-
- @Override
- public void setSelected() {
- setSelected(isActiveForSelection());
- }
- }
-
-
- @SelectableAction(checkOnNodeChange = true)
- protected class SelectableEnumAction extends HookAction {
- private static final long serialVersionUID = 1L;
- final Enum<?> value;
- public SelectableEnumAction(String key, final Enum<?> value) {
- super(key + "." + String.valueOf(value));
- this.value = value;
- }
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- undoableSetHook(false);
- if(value != null)
- undoableSetHook((IExtension)value);
- setSelected(true);
- }
-
- @Override
- public void setSelected() {
- setSelected(isActiveForSelection(value));
- }
- }
-
- private final class ToggleHookActor implements IActor {
- IExtension extension;
- private final NodeModel node;
-
- private ToggleHookActor(final NodeModel node, final IExtension extension) {
- this.node = node;
- this.extension = extension != null ? extension : node.getExtension(getExtensionClass());
- }
-
- public void act() {
- extension = toggle(node, extension);
- }
-
- public String getDescription() {
- return getHookName();
- }
-
- public void undo() {
- act();
- }
- }
-
- protected class XmlReader implements IElementDOMHandler {
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (attributes == null) {
- return null;
- }
- if (!getHookName().equals(attributes.getAttribute("NAME", null))) {
- return null;
- }
- return parent;
- }
-
- public void endElement(final Object parent, final String tag, final Object userObject,
- final XMLElement lastBuiltElement) {
- if (getHookAnnotation().onceForMap()) {
- final XMLElement parentNodeElement = lastBuiltElement.getParent().getParent();
- if (parentNodeElement == null || !parentNodeElement.getName().equals("map")) {
- return;
- }
- }
- final NodeModel node = (NodeModel) userObject;
- if (node.getExtension(getExtensionClass()) != null) {
- return;
- }
- final IExtension extension = createExtension(node, lastBuiltElement);
- if (extension == null) {
- return;
- }
- add(node, extension);
- }
- }
-
- protected class XmlWriter implements IExtensionElementWriter {
- public void writeContent(final ITreeWriter writer, final Object object, final IExtension extension)
- throws IOException {
- final XMLElement element = new XMLElement("hook");
- try {
- saveExtension(extension, element);
- writer.addElement(null, element);
- }
- catch (final Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- public PersistentNodeHook() {
- super();
- final Class<? extends IExtension> extensionClass = getExtensionClass();
- if (getHookAnnotation().onceForMap()) {
- mapExtensionClasses.add(extensionClass);
- }
- // this.modeController = modeController;
- // controller = modeController.getController();
- final ModeController modeController = Controller.getCurrentModeController();
- if (modeController.getModeName().equals("MindMap")) {
- if(extensionClass.isEnum()){
- Class<Enum> enumClass = (Class<Enum>) (Class<?>)extensionClass;
- EnumSet<? extends Enum<?>> all= EnumSet.allOf(enumClass);
- for(Enum e : all){
- registerAction(new SelectableEnumAction(getClass().getSimpleName() + "Action", e));
- }
- registerAction(new SelectableEnumAction(getClass().getSimpleName() + "Action", null));
- }
- else{
- final HookAction selectableHookAction = createHookAction();
- if (selectableHookAction != null) {
- registerAction(selectableHookAction);
- }
- }
- }
- final MapController mapController = modeController.getMapController();
- mapController.getReadManager().addElementHandler("hook", createXmlReader());
- final IExtensionElementWriter xmlWriter = createXmlWriter();
- if (xmlWriter != null) {
- mapController.getWriteManager().addExtensionElementWriter(extensionClass, xmlWriter);
- }
- if (this instanceof IExtension) {
- // do not use getExtensionClass() here since in several subclasses getExtensionClass() returns a
- // different class than getClass()
- modeController.addExtension((Class<? extends IExtension>) getClass(), (IExtension) this);
- }
- }
-
- protected void add(final NodeModel node, final IExtension extension) {
- assert (getExtensionClass().equals(extension.getClass()));
- node.addExtension(extension);
- }
-
- protected IExtension createExtension(final NodeModel node) {
- return createExtension(node, null);
- }
-
- protected IExtension createExtension(final NodeModel node, final XMLElement element){
- try {
- final Class<? extends IExtension> extensionClass = getExtensionClass();
- if(extensionClass.isEnum()){
- final String value = element.getAttribute("VALUE");
- final Method factory = extensionClass.getMethod("valueOf", String.class);
- return (IExtension)factory.invoke(null, value);
-
- }
- return extensionClass.newInstance();
- }
- catch (SecurityException e) {
- e.printStackTrace();
- }
- catch (Exception e) {
- }
- return null;
- }
-
- protected HookAction createHookAction() {
- return new SelectableHookAction(getClass().getSimpleName() + "Action");
- }
-
- protected IElementHandler createXmlReader() {
- return new XmlReader();
- }
-
- protected IExtensionElementWriter createXmlWriter() {
- return new XmlWriter();
- }
-
- @SuppressWarnings("unchecked")
- protected Class<? extends IExtension> getExtensionClass() {
- return (Class<? extends IExtension>) getClass();
- }
-
- private NodeHookDescriptor getHookAnnotation() {
- final NodeHookDescriptor annotation = getClass().getAnnotation(NodeHookDescriptor.class);
- return annotation;
- }
-
- protected String getHookName() {
- return getHookAnnotation().hookName();
- }
-
- public IExtension getMapHook() {
- final NodeModel rootNode = Controller.getCurrentController().getMap().getRootNode();
- return rootNode.getExtension(getExtensionClass());
- }
-
- protected NodeModel[] getNodes() {
- if (getHookAnnotation().onceForMap()) {
- return getRootNode();
- }
- return getSelectedNodes();
- }
-
- protected NodeModel[] getRootNode() {
- final NodeModel[] nodes = new NodeModel[1];
- nodes[0] = Controller.getCurrentController().getMap().getRootNode();
- return nodes;
- }
-
- protected NodeModel[] getSelectedNodes() {
- final Collection<NodeModel> selection = Controller.getCurrentController().getSelection().getSelection();
- final int size = selection.size();
- final NodeModel[] nodes = new NodeModel[size];
- final Iterator<NodeModel> iterator = selection.iterator();
- int i = 0;
- while (iterator.hasNext()) {
- nodes[i++] = iterator.next();
- }
- return nodes;
- }
-
- public boolean isActive(final NodeModel nodeModel) {
- if (!nodeModel.isRoot() && getHookAnnotation().onceForMap()) {
- return isActive(nodeModel.getMap().getRootNode());
- }
- return nodeModel.containsExtension(getExtensionClass());
- }
-
- public IExtension getExtension(final NodeModel nodeModel) {
- if (!nodeModel.isRoot() && getHookAnnotation().onceForMap()) {
- return getExtension(nodeModel.getMap().getRootNode());
- }
- return nodeModel.getExtension(getExtensionClass());
- }
-
- protected boolean isActiveForSelection() {
- final NodeModel[] nodes = getNodes();
- for (int i = 0; i < nodes.length; i++) {
- final NodeModel nodeModel = nodes[i];
- if (nodeModel.containsExtension(getExtensionClass())) {
- return true;
- }
- }
- return false;
- }
-
-
- private boolean isActiveForSelection(Enum<?> value) {
- final NodeModel[] nodes = getNodes();
- for (int i = 0; i < nodes.length; i++) {
- final NodeModel nodeModel = nodes[i];
- final IExtension nodeValue = nodeModel.getExtension(getExtensionClass());
- if (value == null && nodeValue != null || value != null && !value.equals(nodeValue)) {
- return false;
- }
- }
- return true;
- }
- protected void registerAction(final AFreeplaneAction action) {
- Controller.getCurrentModeController().addAction(action);
- }
-
- protected void remove(final NodeModel node, final IExtension extension) {
- node.removeExtension(extension);
- }
-
- protected void saveExtension(final IExtension extension, final XMLElement element) {
- element.setAttribute("NAME", getHookName());
- if(extension instanceof Enum){
- element.setAttribute("VALUE", extension.toString());
- }
- }
-
- public void undoableActivateHook(final NodeModel node, final IExtension extension) {
- undoableToggleHook(node, extension);
- }
-
- public void undoableDeactivateHook(final NodeModel node) {
- final IExtension extension = node.getExtension(getExtensionClass());
- if (extension != null) {
- undoableToggleHook(node, extension);
- }
- }
-
- public void undoableSetHook(final boolean enable) {
- final NodeModel[] nodes = getNodes();
- for (int i = 0; i < nodes.length; i++) {
- final NodeModel node = nodes[i];
- if (node.containsExtension(getExtensionClass()) != enable) {
- undoableToggleHook(node);
- }
- }
- }
-
- public void undoableSetHook(final IExtension extension) {
- final NodeModel[] nodes = getNodes();
- for (int i = 0; i < nodes.length; i++) {
- final NodeModel node = nodes[i];
- if (extension != null || node.containsExtension(getExtensionClass())) {
- undoableToggleHook(node, extension);
- }
- }
- }
-
- public void undoableToggleHook(final NodeModel node) {
- undoableToggleHook(node, node.getExtension(getExtensionClass()));
- }
-
- public void undoableToggleHook(final NodeModel node, final IExtension extension) {
- final IActor actor = new ToggleHookActor(node, extension);
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- protected IExtension toggle(final NodeModel node, IExtension extension) {
- final IExtension before;
- final IExtension after;
- if (extension != null && node.containsExtension(extension.getClass())) {
- before = extension;
- after = null;
- remove(node, extension);
- }
- else {
- if (extension == null) {
- extension = createExtension(node);
- }
- if (extension != null) {
- add(node, extension);
- }
- before = null;
- after = extension;
- }
- Controller.getCurrentModeController().getMapController()
- .nodeChanged(node, getExtensionClass(), before, after);
- return extension;
- }
-
- public static void removeMapExtensions(NodeModel node) {
- final IExtension[] extensionArray = node.getExtensions().values().toArray(new IExtension[]{});
- for(IExtension extension : extensionArray){
- if(PersistentNodeHook.isMapExtension(extension.getClass())){
- node.removeExtension(extension);
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/mode/SelectionController.java b/freeplane/src/org/freeplane/features/mode/SelectionController.java
deleted file mode 100644
index c028e3c..0000000
--- a/freeplane/src/org/freeplane/features/mode/SelectionController.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode;
-
-import java.util.HashSet;
-import java.util.LinkedList;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- * Mar 12, 2009
- */
-public class SelectionController {
- final private LinkedList<INodeSelectionListener> nodeSelectionListeners;
-
- public SelectionController() {
- super();
- nodeSelectionListeners = new LinkedList<INodeSelectionListener>();
- }
-
- public void addNodeSelectionListener(final INodeSelectionListener listener) {
- nodeSelectionListeners.add(listener);
- }
-
- public LinkedList<INodeSelectionListener> getNodeSelectionListeners() {
- return nodeSelectionListeners;
- }
-
- public void onDeselect(final NodeModel node) {
- try {
- final HashSet<INodeSelectionListener> copy = new HashSet<INodeSelectionListener>(nodeSelectionListeners);
- for (final INodeSelectionListener listener : copy) {
- listener.onDeselect(node);
- }
- }
- catch (final RuntimeException e) {
- LogUtils.severe("Error in node selection listeners", e);
- }
- }
-
- public void onSelect(final NodeModel node) {
- for (final INodeSelectionListener listener : nodeSelectionListeners) {
- listener.onSelect(node);
- }
- }
-
- public void removeNodeSelectionListener(final INodeSelectionListener listener) {
- nodeSelectionListeners.remove(listener);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/LoadAcceleratorPresetsAction.java b/freeplane/src/org/freeplane/features/mode/mindmapmode/LoadAcceleratorPresetsAction.java
deleted file mode 100644
index e61251b..0000000
--- a/freeplane/src/org/freeplane/features/mode/mindmapmode/LoadAcceleratorPresetsAction.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-/**
- * @author Dimitry Polivaev
- * 04.07.2009
- */
-public class LoadAcceleratorPresetsAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * A simple help function to get the directory where to search for XSLT
- * export files distributed with Freeplane.
- * @return The system directory where XSLT export files are supposed to be.
- */
- static private File getAcceleratorsSysDirectory() {
- return new File(ResourceController.getResourceController().getResourceBaseDir(), "accelerators");
- }
-
- /**
- * A simple help function to get the directory where to search for XSLT
- * export files written by the user.
- * @return The user directory where XSLT export files are supposed to be.
- */
- static File getAcceleratorsUserDirectory() {
- return new File(ResourceController.getResourceController().getFreeplaneUserDirectory(), "accelerators");
- }
-
- final static public void install() {
- final File[] dirs = { LoadAcceleratorPresetsAction.getAcceleratorsUserDirectory(),
- LoadAcceleratorPresetsAction.getAcceleratorsSysDirectory() };
- final Controller controller = Controller.getCurrentController();
- ModeController modecontroller = controller.getModeController(MModeController.MODENAME);
- final MenuBuilder menuBuilder = modecontroller.getUserInputListenerFactory().getMenuBuilder();
- for (final File dir : dirs) {
- final File[] fileList = dir.listFiles();
- if (fileList == null) {
- continue;
- }
- for (final File prop : fileList) {
- final String fileName = prop.getName();
- if (prop.isDirectory()) {
- continue;
- }
- if (!fileName.endsWith(".properties")) {
- continue;
- }
- try {
- final int propNameLength = fileName.lastIndexOf('.');
- final String propName = fileName.substring(0, propNameLength);
- final String key = "LoadAcceleratorPresetsAction." + propName;
- if (controller.getAction(key) == null) {
- final String title = TextUtils.getText(key + ".text", propName);
- final LoadAcceleratorPresetsAction loadAcceleratorPresetsAction = new LoadAcceleratorPresetsAction(
- prop.toURL(), key, title);
- controller.addAction(loadAcceleratorPresetsAction);
- menuBuilder.addAction("main_menu_new_load_accelerator_presets", key,
- loadAcceleratorPresetsAction, MenuBuilder.AS_CHILD);
- }
- }
- catch (final Exception e) {
- UITools.errorMessage(TextUtils.format("accelerators_loading_error", prop.getPath()));
- }
- }
- }
- }
-
- final private URL resource;
-
- LoadAcceleratorPresetsAction(final URL resource, final String propFileName, final String title) {
- super("LoadAcceleratorPresetsAction." + propFileName, title, null);
- this.resource = resource;
- }
-
- public void actionPerformed(final ActionEvent e) {
- InputStream in = null;
- try {
- in = resource.openStream();
- MenuBuilder.loadAcceleratorPresets(in);
- }
- catch (final IOException e1) {
- e1.printStackTrace();
- }
- finally {
- FileUtils.silentlyClose(in);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/MModeController.java b/freeplane/src/org/freeplane/features/mode/mindmapmode/MModeController.java
deleted file mode 100644
index 82d1e38..0000000
--- a/freeplane/src/org/freeplane/features/mode/mindmapmode/MModeController.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode.mindmapmode;
-
-import java.net.URL;
-import java.util.Vector;
-
-import javax.swing.UIManager;
-import javax.swing.UIManager.LookAndFeelInfo;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.OptionPanelBuilder;
-import org.freeplane.core.resources.components.PropertyAction;
-import org.freeplane.core.ui.IndexedTree;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.mindmapmode.MMapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.note.mindmapmode.MNoteController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-import org.freeplane.view.swing.ui.MenuXmlCreator;
-
-public class MModeController extends ModeController {
- private static final String LOOKANDFEEL_PROPERTY = "lookandfeel";
- static public final String MODENAME = "MindMap";
- private RedoAction redo;
- public static final String RESOURCES_DELETE_NODES_WITHOUT_QUESTION = "delete_nodes_without_question";
- private static final String PREF_MM2XML = "/xslt/mm2preferences.xsl";
- private UndoAction undo;
-
- static public MModeController getMModeController() {
- Controller controller = Controller.getCurrentController();
- return (MModeController) controller.getModeController(MODENAME);
- }
-
- private OptionPanelBuilder optionPanelBuilder;
-
- public MModeController(final Controller controller) {
- super(controller);
- createActions();
- createOptionPanelControls();
- }
-
- private void addUndoableActor(final IActor actor, final MapModel map) {
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- undoHandler.addActor(actor);
- }
-
- public void deactivateUndo(final MMapModel map) {
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- undoHandler.deactivate();
- }
-
- @Override
- public void commit() {
- final MapModel map = getController().getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- undoHandler.commit();
- }
-
- public void delayedCommit() {
- final MMapModel map = (MMapModel) getController().getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- undoHandler.delayedCommit();
- }
-
- public void delayedRollback() {
- final MMapModel map = (MMapModel) getController().getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- undoHandler.delayedRollback();
- }
-
- private void createActions() {
- undo = new UndoAction();
- redo = new RedoAction();
- undo.setRedo(redo);
- redo.setUndo(undo);
- addAction(undo);
- addAction(redo);
- addAction(new SelectBranchAction());
- addAction(new SelectAllAction());
- addAction(new SaveAcceleratorPresetsAction());
- }
-
- private void createOptionPanelControls() {
- optionPanelBuilder = new OptionPanelBuilder();
- final ResourceController resourceController = ResourceController.getResourceController();
- URL preferences = new MenuXmlCreator(PREF_MM2XML).menuResource("/xml/preferences.xml");
- optionPanelBuilder.load(preferences);
- addAction(createPropertyAction(optionPanelBuilder));
- }
-
- public static PropertyAction createPropertyAction(OptionPanelBuilder optionPanelBuilder) {
- final LookAndFeelInfo[] lafInfo = UIManager.getInstalledLookAndFeels();
- final Vector<String> lafNames = new Vector<String>(lafInfo.length + 1);
- final Vector<String> translatedLafNames = new Vector<String>(lafInfo.length + 1);
- lafNames.add("default");
- translatedLafNames.add(TextUtils.getOptionalText("OptionPanel.default"));
- for (int i = 0; i < lafInfo.length; i++) {
- final LookAndFeelInfo info = lafInfo[i];
- final String className = info.getClassName();
- lafNames.add(className);
- translatedLafNames.add(info.getName());
- }
- addCurrentLookAndFeelIfNecessary(lafNames, translatedLafNames);
- optionPanelBuilder.addComboProperty("Appearance/look_and_feel/lookandfeel", LOOKANDFEEL_PROPERTY, lafNames,
- translatedLafNames, IndexedTree.AS_CHILD);
- return new PropertyAction(optionPanelBuilder.getRoot());
- }
-
- private static void addCurrentLookAndFeelIfNecessary(Vector<String> lafNames, Vector<String> translatedLafNames) {
- final String currentLaf = ResourceController.getResourceController().getProperty(LOOKANDFEEL_PROPERTY);
- if (!lafNames.contains(currentLaf)) {
- lafNames.add(currentLaf);
- translatedLafNames.add(currentLaf.replaceFirst(".*\\.", ""));
- }
- }
-
- @Override
- public void execute(final IActor actor, final MapModel map) {
- actor.act();
- addUndoableActor(actor, map);
- }
-
- @Override
- public String getModeName() {
- return MModeController.MODENAME;
- }
-
- public OptionPanelBuilder getOptionPanelBuilder() {
- return optionPanelBuilder;
- }
-
- @Override
- public boolean isUndoAction() {
- final MapModel model = getController().getMap();
- if (!(model instanceof MMapModel)) {
- return false;
- }
- return ((MMapModel) model).getExtension(IUndoHandler.class).isUndoActionRunning();
- }
-
- @Override
- public void rollback() {
- final MapModel map = getController().getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- undoHandler.rollback();
- }
-
- /**
- *
- */
- public boolean save() {
- return ((MFileManager) UrlManager.getController()).save(getController().getMap());
- }
-
- @Override
- public void shutdown() {
- super.shutdown();
- final MNoteController noteController = (MNoteController) NoteController.getController();
- if (noteController != null) {
- noteController.shutdownController();
- }
- }
-
- @Override
- public void startTransaction() {
- final MapModel map = getController().getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- undoHandler.startTransaction();
- }
-
- @Override
- public void forceNewTransaction() {
- final MapModel map = getController().getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- undoHandler.forceNewTransaction();
- }
-
- /**
- * This method is called after and before a change of the map mapView. Use
- * it to perform the actions that cannot be performed at creation time.
- */
- @Override
- public void startup() {
- super.startup();
- final NoteController noteController = NoteController.getController();
- if (noteController != null) {
- ((MNoteController) noteController).startupController();
- }
- }
-
- public void undo() {
- undo.actionPerformed(null);
- }
-
- public void resetRedo() {
- redo.reset();
- }
-
- @Override
- public boolean canEdit() {
- return true;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/RedoAction.java b/freeplane/src/org/freeplane/features/mode/mindmapmode/RedoAction.java
deleted file mode 100644
index a9e285c..0000000
--- a/freeplane/src/org/freeplane/features/mode/mindmapmode/RedoAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.Action;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-class RedoAction extends AFreeplaneAction implements INodeChangeListener{
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Action undo;
- private NodeModel lastChangedNode;
-
- public RedoAction() {
- super("RedoAction");
- setEnabled(false);
- }
-
- public void actionPerformed(final ActionEvent e) {
- if(UITools.isEditingText())
- return;
- final Controller controller = Controller.getCurrentController();
- final MapModel map = controller.getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- mapController.addNodeChangeListener(this);
- try{
- undoHandler.getRedoAction().actionPerformed(e);
- if(lastChangedNode != null){
- mapController.displayNode(lastChangedNode);
- controller.getSelection().selectAsTheOnlyOneSelected(lastChangedNode);
- lastChangedNode = null;
- }
- undo.setEnabled(undoHandler.canUndo());
- setEnabled(undoHandler.canRedo());
- }
- finally{
- mapController.removeNodeChangeListener(this);
- }
-
- }
-
- public void reset() {
- final MapModel map = Controller.getCurrentController().getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- undoHandler.resetRedo();
- setEnabled(false);
- }
-
- public void setUndo(final Action undo) {
- this.undo = undo;
- }
- @Override
- public void afterMapChange(final Object newMap) {}
-
- public void nodeChanged(NodeChangeEvent event) {
- lastChangedNode = event.getNode();
- };
-}
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/SaveAcceleratorPresetsAction.java b/freeplane/src/org/freeplane/features/mode/mindmapmode/SaveAcceleratorPresetsAction.java
deleted file mode 100644
index 1e4fb7a..0000000
--- a/freeplane/src/org/freeplane/features/mode/mindmapmode/SaveAcceleratorPresetsAction.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Map.Entry;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- * 01.05.2012
- */
-class SaveAcceleratorPresetsAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public SaveAcceleratorPresetsAction() {
- super("SaveAcceleratorPresetsAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final String keyset = JOptionPane.showInputDialog(TextUtils.getText("enter_keyset_name"));
- if (keyset == null || keyset.equals("")) {
- return;
- }
- final File acceleratorsUserDirectory = LoadAcceleratorPresetsAction.getAcceleratorsUserDirectory();
- final File keysetFile = new File(acceleratorsUserDirectory, keyset + ".properties");
- if (keysetFile.exists()) {
- final int confirm = JOptionPane.showConfirmDialog(UITools.getFrame(), TextUtils
- .getText("overwrite_keyset_question"), "Freeplane", JOptionPane.YES_NO_OPTION);
- if (confirm != JOptionPane.YES_OPTION) {
- return;
- }
- }
- final Properties keysetProperties = new Properties();
- final Set<Entry<Object, Object>> allProperties = ResourceController.getResourceController().getProperties()
- .entrySet();
- for (final Entry<Object, Object> p : allProperties) {
- if (!p.getKey().toString().startsWith("acceleratorFor")) {
- continue;
- }
- keysetProperties.put(p.getKey(), p.getValue());
- }
- try {
- acceleratorsUserDirectory.mkdirs();
- final OutputStream output = new BufferedOutputStream(new FileOutputStream(keysetFile));
- keysetProperties.store(output, "");
- output.close();
- final String key = "LoadAcceleratorPresetsAction." + keyset;
- if (Controller.getCurrentController().getAction(key) != null) {
- return;
- }
- final String title = TextUtils.getText(key + ".text", keyset);
- final LoadAcceleratorPresetsAction loadAcceleratorPresetsAction = new LoadAcceleratorPresetsAction(
- keysetFile.toURL(), key, title);
- if (null == Controller.getCurrentController().getAction(loadAcceleratorPresetsAction.getKey())) {
- Controller.getCurrentController().addAction(loadAcceleratorPresetsAction);
- Controller.getCurrentModeController().getUserInputListenerFactory().getMenuBuilder().addAction(
- "main_menu_new_load_accelerator_presets", key, loadAcceleratorPresetsAction,
- MenuBuilder.AS_CHILD);
- }
- }
- catch (final IOException e1) {
- UITools.errorMessage(TextUtils.getText("can_not_save_key_set"));
- }
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/mode/mindmapmode/UndoAction.java b/freeplane/src/org/freeplane/features/mode/mindmapmode/UndoAction.java
deleted file mode 100644
index 94127b0..0000000
--- a/freeplane/src/org/freeplane/features/mode/mindmapmode/UndoAction.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.mode.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.Action;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapModel;
-import org.freeplane.features.mode.Controller;
-
-class UndoAction extends AFreeplaneAction implements IMapSelectionListener, INodeChangeListener {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Action redo;
- private final ChangeListener changeListener;
- private NodeModel lastChangedNode;
-
- public UndoAction() {
- super("UndoAction");
- Controller.getCurrentController().getMapViewManager().addMapSelectionListener(this);
- setEnabled(false);
- changeListener = new ChangeListener() {
- public void stateChanged(final ChangeEvent e) {
- final MapModel map = Controller.getCurrentController().getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- if (undoHandler == null) {
- return;
- }
- final Object eventSource = e.getSource();
- if (!eventSource.equals(undoHandler)) {
- return;
- }
- setEnabled(undoHandler.canUndo());
- redo.setEnabled(undoHandler.canRedo());
- }
- };
- }
-
- public void actionPerformed(final ActionEvent e) {
- if(UITools.isEditingText())
- return;
- final Controller controller = Controller.getCurrentController();
- final MapModel map = controller.getMap();
- final IUndoHandler undoHandler = map.getExtension(IUndoHandler.class);
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- mapController.addNodeChangeListener(this);
- try{
- undoHandler.getUndoAction().actionPerformed(e);
- if(lastChangedNode != null){
- mapController.displayNode(lastChangedNode);
- controller.getSelection().selectAsTheOnlyOneSelected(lastChangedNode);
- lastChangedNode = null;
- }
- }
- finally{
- mapController.removeNodeChangeListener(this);
- }
-
- }
-
- public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
- if (oldMap instanceof MMapModel) {
- final IUndoHandler undoHandler = oldMap.getExtension(IUndoHandler.class);
- undoHandler.removeChangeListener(changeListener);
- }
- if (newMap == null) {
- setEnabled(false);
- redo.setEnabled(false);
- return;
- }
- final IUndoHandler undoHandler = (newMap.getExtension(IUndoHandler.class));
- if (undoHandler != null) {
- setEnabled(undoHandler.canUndo());
- redo.setEnabled(undoHandler.canRedo());
- undoHandler.addChangeListener(changeListener);
- }
- }
- @Override
- public void afterMapChange(final Object newMap) {};
-
- public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
- }
-
- public void setRedo(final Action redo) {
- this.redo = redo;
- }
-
- public void nodeChanged(NodeChangeEvent event) {
- lastChangedNode = event.getNode();
- };
-}
diff --git a/freeplane/src/org/freeplane/features/nodelocation/LocationBuilder.java b/freeplane/src/org/freeplane/features/nodelocation/LocationBuilder.java
deleted file mode 100644
index a702e69..0000000
--- a/freeplane/src/org/freeplane/features/nodelocation/LocationBuilder.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodelocation;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IExtensionAttributeWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.features.map.NodeBuilder;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- * 06.12.2008
- */
-class LocationBuilder implements IExtensionAttributeWriter {
- private void registerAttributeHandlers(final ReadManager reader) {
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "VSHIFT", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- LocationModel.createLocationModel(node).setShiftY(Integer.parseInt(value));
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "VGAP", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- LocationModel.createLocationModel(node).setVGap(Integer.parseInt(value));
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "HGAP", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- LocationModel.createLocationModel(node).setHGap(Integer.parseInt(value));
- }
- });
- }
-
- void registerBy(final ReadManager readManager, final WriteManager writeManager) {
- registerAttributeHandlers(readManager);
- writeManager.addExtensionAttributeWriter(LocationModel.class, this);
- }
-
- public void writeAttributes(final ITreeWriter writer, final Object userObject, final IExtension extension) {
- final LocationModel locationModel = (LocationModel) extension;
- final int vGap = locationModel.getVGap();
- if (vGap != LocationModel.VGAP) {
- writer.addAttribute("VGAP", Integer.toString(vGap));
- }
- final int hGap = locationModel.getHGap();
- if (locationModel.getHGap() != LocationModel.HGAP) {
- writer.addAttribute("HGAP", Integer.toString(hGap));
- }
- final int shiftY = locationModel.getShiftY();
- if (shiftY != 0) {
- writer.addAttribute("VSHIFT", Integer.toString(shiftY));
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodelocation/LocationController.java b/freeplane/src/org/freeplane/features/nodelocation/LocationController.java
deleted file mode 100644
index 47596d0..0000000
--- a/freeplane/src/org/freeplane/features/nodelocation/LocationController.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodelocation;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-/**
- * @author Dimitry Polivaev
- */
-public class LocationController implements IExtension {
- public static LocationController getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- return getController(modeController);
- }
-
- public static LocationController getController(ModeController modeController) {
- return modeController.getExtension(LocationController.class);
- }
-
- public static void install( final LocationController locationController) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addExtension(LocationController.class, locationController);
- }
-
-// final private ModeController modeController;
-
- public LocationController() {
- super();
-// this.modeController = modeController;
- final ModeController modeController = Controller.getCurrentModeController();
- final MapController mapController = modeController.getMapController();
- final ReadManager readManager = mapController.getReadManager();
- final WriteManager writeManager = mapController.getWriteManager();
- final LocationBuilder locationBuilder = new LocationBuilder();
- locationBuilder.registerBy(readManager, writeManager);
- }
-
- public int getHorizontalShift(NodeModel node){
- return LocationModel.getModel(node).getHGap();
- }
-
- public int getVerticalShift(NodeModel node){
- return LocationModel.getModel(node).getShiftY();
- }
-
- public int getMinimalDistanceBetweenChildren(NodeModel node){
- return LocationModel.getModel(node).getVGap();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodelocation/LocationModel.java b/freeplane/src/org/freeplane/features/nodelocation/LocationModel.java
deleted file mode 100644
index 95c5ae4..0000000
--- a/freeplane/src/org/freeplane/features/nodelocation/LocationModel.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodelocation;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- */
-public class LocationModel implements IExtension {
- public final static int HGAP = 20;
- public static final LocationModel NULL_LOCATION = new LocationModel() {
- @Override
- public void setHGap(final int gap) {
- if (gap != getHGap()) {
- throw new NoSuchMethodError();
- }
- }
-
- @Override
- public void setShiftY(final int shiftY) {
- if (shiftY != getShiftY()) {
- throw new NoSuchMethodError();
- }
- }
-
- @Override
- public void setVGap(final int gap) {
- if (gap != getVGap()) {
- throw new NoSuchMethodError();
- }
- }
- };
- public final static int VGAP = 3;
-
- public static LocationModel createLocationModel(final NodeModel node) {
- LocationModel location = (LocationModel) node.getExtension(LocationModel.class);
- if (location == null) {
- location = new LocationModel();
- node.addExtension(location);
- }
- return location;
- }
-
- public static LocationModel getModel(final NodeModel node) {
- final LocationModel location = (LocationModel) node.getExtension(LocationModel.class);
- return location != null ? location : LocationModel.NULL_LOCATION;
- }
-
- private int hGap = LocationModel.HGAP;
- private int shiftY = 0;
- private int vGap = LocationModel.VGAP;
-
- public int getHGap() {
- return hGap;
- }
-
- public int getShiftY() {
- return shiftY;
- }
-
- public int getVGap() {
- return vGap;
- }
-
- public void setHGap(final int gap) {
- hGap = gap;
- }
-
- public void setShiftY(final int shiftY) {
- this.shiftY = shiftY;
- }
-
- public void setVGap(final int gap) {
- vGap = Math.max(gap, 0);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftXActor.java b/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftXActor.java
deleted file mode 100644
index b4e4a13..0000000
--- a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftXActor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2014 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodelocation.mindmapmode;
-
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.nodelocation.LocationModel;
-
-/**
- * @author Dimitry Polivaev
- * 01.03.2014
- */
-final class ChangeShiftXActor implements IActor {
- private final int shiftX;
- private final NodeModel node;
- private final int oldShiftX;
-
- ChangeShiftXActor(final NodeModel node, final int shiftX){
- final LocationModel locationModel = LocationModel.getModel(node);
- oldShiftX = locationModel.getHGap();
- this.node = node;
- this.shiftX = shiftX;
- }
-
- public void act() {
- setShiftX(node, shiftX);
- }
-
- public String getDescription() {
- return "moveNodePosition";
- }
-
- private void setShiftX(final NodeModel node, final int hGap) {
- final LocationModel locationModel = LocationModel.createLocationModel(node);
- locationModel.setHGap(hGap);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- public void undo() {
- setShiftX(node, oldShiftX);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftYActor.java b/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftYActor.java
deleted file mode 100644
index c1590ec..0000000
--- a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ChangeShiftYActor.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2014 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodelocation.mindmapmode;
-
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.nodelocation.LocationModel;
-
-/**
- * @author Dimitry Polivaev
- * 01.03.2014
- */
-final class ChangeShiftYActor implements IActor {
- private final NodeModel node;
- private final int oldShiftY;
- private final int shiftY;
-
- ChangeShiftYActor(final NodeModel node, final int shiftY){
- final LocationModel locationModel = LocationModel.getModel(node);
- oldShiftY = locationModel.getShiftY();
- this.node = node;
- this.shiftY = shiftY;
- }
-
- public void act() {
- setShiftY(node, shiftY);
- }
-
- public String getDescription() {
- return "moveNodePosition";
- }
-
- private void setShiftY(final NodeModel node, final int shiftY) {
- final LocationModel locationModel = LocationModel.createLocationModel(node);
- locationModel.setShiftY(shiftY);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- public void undo() {
- setShiftY(node, oldShiftY);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ChangeVGapActor.java b/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ChangeVGapActor.java
deleted file mode 100644
index 305c9b3..0000000
--- a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ChangeVGapActor.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2014 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodelocation.mindmapmode;
-
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.nodelocation.LocationModel;
-
-/**
- * @author Dimitry Polivaev
- * 01.03.2014
- */
-final class ChangeVGapActor implements IActor {
- private final NodeModel node;
- private final int oldVgap;
- private final int vGap;
-
- ChangeVGapActor(final NodeModel node, final int vGap){
- final LocationModel locationModel = LocationModel.getModel(node);
- oldVgap = locationModel.getVGap();
- this.node = node;
- this.vGap = vGap;
- }
-
- public void act() {
- setVGap(node, vGap);
- }
-
- public String getDescription() {
- return "moveNodePosition";
- }
-
- private void setVGap(final NodeModel node, final int parentVGap) {
- if(node != null){
- if (this.vGap >= 0) {
- LocationModel.createLocationModel(node).setVGap(parentVGap);
- }
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
- }
-
- public void undo() {
- setVGap(node, oldVgap);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/MLocationController.java b/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/MLocationController.java
deleted file mode 100644
index f14539a..0000000
--- a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/MLocationController.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodelocation.mindmapmode;
-
-import java.util.ArrayList;
-
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodelocation.LocationController;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MLocationController extends LocationController {
- public MLocationController() {
- super();
- createActions();
- }
-
- private void createActions() {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addAction(new ResetNodeLocationAction());
- }
-
- public void moveNodePosition(final NodeModel node, final int parentVGap, final int hGap, final int shiftY) {
- ArrayList<IActor> actors = new ArrayList<IActor>(3);
- actors.add(new ChangeShiftXActor(node, hGap));
- actors.add(new ChangeShiftYActor(node, shiftY));
- final NodeModel parentNode = node.getParentNode();
- if(parentNode != null)
- actors.add(new ChangeVGapActor(parentNode, parentVGap));
- for (final IActor actor : actors)
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
-
- public void setHorizontalShift(NodeModel node, final int horizontalShift){
- final IActor actor = new ChangeShiftXActor(node, horizontalShift);
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- public void setVerticalShift(NodeModel node, final int verticalShift){
- final IActor actor = new ChangeShiftYActor(node, verticalShift);
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- public void setMinimalDistanceBetweenChildren(NodeModel node, final int minimalDistanceBetweenChildren){
- final IActor actor = new ChangeVGapActor(node, minimalDistanceBetweenChildren);
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ResetNodeLocationAction.java b/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ResetNodeLocationAction.java
deleted file mode 100644
index c021a19..0000000
--- a/freeplane/src/org/freeplane/features/nodelocation/mindmapmode/ResetNodeLocationAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodelocation.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.nodelocation.LocationController;
-import org.freeplane.features.nodelocation.LocationModel;
-
-/**
- * @author Dimitry Polivaev
- * 07.12.2008
- */
-class ResetNodeLocationAction extends AMultipleNodeAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ResetNodeLocationAction() {
- super("ResetNodeLocationAction");
- }
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- ((MLocationController) LocationController.getController()).moveNodePosition(node,
- LocationModel.NULL_LOCATION.getVGap(), LocationModel.NULL_LOCATION.getHGap(), LocationModel.NULL_LOCATION
- .getShiftY());
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/NodeSizeModel.java b/freeplane/src/org/freeplane/features/nodestyle/NodeSizeModel.java
deleted file mode 100644
index 2060fd7..0000000
--- a/freeplane/src/org/freeplane/features/nodestyle/NodeSizeModel.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodestyle;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- * Nov 13, 2011
- */
-public class NodeSizeModel implements IExtension {
- public static final int NOT_SET = -1;
-
- public static NodeSizeModel getModel(final NodeModel node) {
- return node.getExtension(NodeSizeModel.class);
- }
-
- public static NodeSizeModel createNodeSizeModel(final NodeModel node) {
- NodeSizeModel styleModel = node.getExtension(NodeSizeModel.class);
- if (styleModel == null) {
- styleModel = new NodeSizeModel();
- node.addExtension(styleModel);
- }
- return styleModel;
- }
-
- private int minNodeWidth = NOT_SET;
- private int maxTextWidth = NOT_SET;
-
- public int getMaxNodeWidth() {
- return maxTextWidth;
- }
- public void setMaxNodeWidth(int maxTextWidth) {
- this.maxTextWidth = maxTextWidth;
- }
- public int getMinNodeWidth() {
- return minNodeWidth;
- }
- public void setMinNodeWidth(int minNodeWidth) {
- this.minNodeWidth = minNodeWidth;
- }
-
- public static void setNodeMaxNodeWidth(NodeModel node, int maxTextWidth) {
- createNodeSizeModel(node).setMaxNodeWidth(maxTextWidth);
- }
- public static void setNodeMinWidth(NodeModel node, int minNodeWidth) {
- createNodeSizeModel(node).setMinNodeWidth(minNodeWidth);
- }
-
- public static int getNodeMaxNodeWidth(NodeModel node) {
- final NodeSizeModel extension = node.getExtension(NodeSizeModel.class);
- return extension != null ? extension.getMaxNodeWidth() : NOT_SET;
- }
- public static int getMinNodeWidth(NodeModel node) {
- final NodeSizeModel extension = node.getExtension(NodeSizeModel.class);
- return extension != null ? extension.getMinNodeWidth() : NOT_SET;
- }
-
- public void copyTo(NodeSizeModel to) {
- if(maxTextWidth != NOT_SET)
- to.setMaxNodeWidth(maxTextWidth);
- if(minNodeWidth != NOT_SET)
- to.setMinNodeWidth(minNodeWidth);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/NodeStyleBuilder.java b/freeplane/src/org/freeplane/features/nodestyle/NodeStyleBuilder.java
deleted file mode 100644
index bfecf71..0000000
--- a/freeplane/src/org/freeplane/features/nodestyle/NodeStyleBuilder.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodestyle;
-
-import java.awt.Color;
-import java.io.IOException;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IAttributeWriter;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IElementWriter;
-import org.freeplane.core.io.IExtensionAttributeWriter;
-import org.freeplane.core.io.IExtensionElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.features.map.MapWriter;
-import org.freeplane.features.map.NodeBuilder;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-class NodeStyleBuilder implements IElementDOMHandler, IExtensionElementWriter, IExtensionAttributeWriter,
- IAttributeWriter, IElementWriter {
- static class FontProperties {
- String fontName;
- Integer fontSize;
- Boolean isBold;
- Boolean isItalic;
- }
-
- private final NodeStyleController nsc;
-
- public NodeStyleBuilder(final NodeStyleController nsc) {
- this.nsc = nsc;
- }
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (tag.equals("font")) {
- return new FontProperties();
- }
- return null;
- }
-
- public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement dom) {
- if (parent instanceof NodeModel) {
- final NodeModel node = (NodeModel) parent;
- if (tag.equals("font")) {
- final FontProperties fp = (FontProperties) userObject;
- NodeStyleModel nodeStyleModel = NodeStyleModel.getModel(node);
- if (nodeStyleModel == null) {
- nodeStyleModel = new NodeStyleModel();
- node.addExtension(nodeStyleModel);
- }
- nodeStyleModel.setFontFamilyName(fp.fontName);
- nodeStyleModel.setFontSize(fp.fontSize);
- nodeStyleModel.setItalic(fp.isItalic);
- nodeStyleModel.setBold(fp.isBold);
- return;
- }
- return;
- }
- }
-
- private void registerAttributeHandlers(final ReadManager reader) {
- final IAttributeHandler colorHandler = new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- if (value.length() == 7) {
- final NodeModel node = (NodeModel) userObject;
- NodeStyleModel.setColor(node, ColorUtils.stringToColor(value));
- }
- }
- };
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "COLOR", colorHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "COLOR", colorHandler);
- final IAttributeHandler bgHandler = new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- if (value.length() == 7) {
- final NodeModel node = (NodeModel) userObject;
- NodeStyleModel.setBackgroundColor(node, ColorUtils.stringToColor(value));
- }
- }
- };
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "BACKGROUND_COLOR", bgHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "BACKGROUND_COLOR", bgHandler);
- final IAttributeHandler styleHandler = new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- NodeStyleModel.setShape(node, value);
- }
- };
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "STYLE", styleHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "STYLE", styleHandler);
- reader.addAttributeHandler("font", "SIZE", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final FontProperties fp = (FontProperties) userObject;
- fp.fontSize = Integer.parseInt(value.toString());
- }
- });
- reader.addAttributeHandler("font", "NAME", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final FontProperties fp = (FontProperties) userObject;
- fp.fontName = value;
- }
- });
- reader.addAttributeHandler("font", "BOLD", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final FontProperties fp = (FontProperties) userObject;
- fp.isBold = value.equals("true");
- }
- });
- reader.addAttributeHandler("font", "ITALIC", new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final FontProperties fp = (FontProperties) userObject;
- fp.isItalic = value.equals("true");
- }
- });
- final IAttributeHandler nodenumberingHandler = new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- NodeStyleModel.setNodeNumbering(node, value.equals("true"));
- }
- };
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "NUMBERED", nodenumberingHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "NUMBERED", nodenumberingHandler);
-
- final IAttributeHandler formatHandler = new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- NodeStyleModel.setNodeFormat(node, value);
- }
- };
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "FORMAT", formatHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "FORMAT", formatHandler);
- if (FreeplaneVersion.getVersion().isOlderThan(new FreeplaneVersion(1, 3, 0))) {
- // compatibility for a view 1.2.X preview versions - remove after release 1.3
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "TEMPLATE", formatHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "TEMPLATE", formatHandler);
- }
-
- final IAttributeHandler nodeMaxNodeWidthHandler = new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- NodeSizeModel.setNodeMaxNodeWidth(node, Integer.valueOf(value));
- }
- };
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "MAX_WIDTH", nodeMaxNodeWidthHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "MAX_WIDTH", nodeMaxNodeWidthHandler);
-
- final IAttributeHandler nodeMinWidthHandler = new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = (NodeModel) userObject;
- NodeSizeModel.setNodeMinWidth(node, Integer.valueOf(value));
- }
- };
- reader.addAttributeHandler(NodeBuilder.XML_NODE, "MIN_WIDTH", nodeMinWidthHandler);
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, "MIN_WIDTH", nodeMinWidthHandler);
-
- }
-
- /**
- */
- public void registerBy(final ReadManager reader, final WriteManager writer) {
- reader.addElementHandler("font", this);
- registerAttributeHandlers(reader);
- writer.addAttributeWriter(NodeBuilder.XML_NODE, this);
- writer.addAttributeWriter(NodeBuilder.XML_STYLENODE, this);
- writer.addElementWriter(NodeBuilder.XML_NODE, this);
- writer.addElementWriter(NodeBuilder.XML_STYLENODE, this);
- writer.addExtensionElementWriter(NodeStyleModel.class, this);
- writer.addExtensionAttributeWriter(NodeStyleModel.class, this);
- writer.addExtensionAttributeWriter(NodeSizeModel.class, this);
- }
-
- public void setAttributes(final String tag, final Object node, final XMLElement attributes) {
- }
-
- public void writeAttributes(final ITreeWriter writer, final Object userObject, final String tag) {
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (!forceFormatting) {
- return;
- }
- final NodeModel node = (NodeModel) userObject;
- writeAttributes(writer, node, (NodeStyleModel)null, true);
- writeAttributes(writer, node, (NodeSizeModel)null, true);
- }
-
- public void writeAttributes(final ITreeWriter writer, final Object userObject, final IExtension extension) {
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (forceFormatting) {
- return;
- }
- if(extension instanceof NodeStyleModel){
- final NodeStyleModel style = (NodeStyleModel) extension;
- writeAttributes(writer, null, style, false);
- return;
- }
- if(extension instanceof NodeSizeModel){
- final NodeSizeModel size = (NodeSizeModel) extension;
- writeAttributes(writer, null, size, false);
- return;
- }
-
- }
-
- private void writeAttributes(final ITreeWriter writer, final NodeModel node, final NodeStyleModel style,
- final boolean forceFormatting) {
- final Color color = forceFormatting ? nsc.getColor(node) : style.getColor();
- if (color != null) {
- writer.addAttribute("COLOR", ColorUtils.colorToString(color));
- }
- final Color backgroundColor = forceFormatting ? nsc.getBackgroundColor(node) : style.getBackgroundColor();
- if (backgroundColor != null) {
- writer.addAttribute("BACKGROUND_COLOR", ColorUtils.colorToString(backgroundColor));
- }
- final String shape = forceFormatting ? nsc.getShape(node) : style.getShape();
- if (shape != null) {
- writer.addAttribute("STYLE", shape);
- }
- final Boolean numbered = forceFormatting ? nsc.getNodeNumbering(node) : style.getNodeNumbering();
- if (numbered != null && numbered) {
- writer.addAttribute("NUMBERED", numbered.toString());
- }
- final String format = forceFormatting ? nsc.getNodeFormat(node) : style.getNodeFormat();
- if (format != null) {
- writer.addAttribute("FORMAT", format);
- }
- }
-
- private void writeAttributes(final ITreeWriter writer, final NodeModel node, final NodeSizeModel size,
- final boolean forceFormatting) {
- final int maxTextWidth = forceFormatting ? nsc.getMaxWidth(node) : size.getMaxNodeWidth();
- if (maxTextWidth != NodeSizeModel.NOT_SET) {
- writer.addAttribute("MAX_WIDTH", Integer.toString(maxTextWidth));
- }
-
- final int minTextWidth = forceFormatting ? nsc.getMinWidth(node) : size.getMinNodeWidth();
- if (minTextWidth != NodeSizeModel.NOT_SET) {
- writer.addAttribute("MIN_WIDTH", Integer.toString(minTextWidth));
- }
- }
- public void writeContent(final ITreeWriter writer, final Object userObject, final String tag) throws IOException {
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (!forceFormatting) {
- return;
- }
- final NodeModel node = (NodeModel) userObject;
- writeContent(writer, node, null, true);
- }
-
- public void writeContent(final ITreeWriter writer, final Object userObject, final IExtension extension)
- throws IOException {
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (forceFormatting) {
- return;
- }
- final NodeStyleModel style = (NodeStyleModel) extension;
- writeContent(writer, null, style, false);
- }
-
- private void writeContent(final ITreeWriter writer, final NodeModel node, final NodeStyleModel style,
- final boolean forceFormatting) throws IOException {
- if (forceFormatting || style != null) {
- final XMLElement fontElement = new XMLElement();
- fontElement.setName("font");
- boolean isRelevant = forceFormatting;
- final String fontFamilyName = forceFormatting ? nsc.getFontFamilyName(node) : style.getFontFamilyName();
- if (fontFamilyName != null) {
- fontElement.setAttribute("NAME", fontFamilyName);
- isRelevant = true;
- }
- final Integer fontSize = forceFormatting ? Integer.valueOf(nsc.getFontSize(node)) : style.getFontSize();
- if (fontSize != null) {
- fontElement.setAttribute("SIZE", Integer.toString(fontSize));
- isRelevant = true;
- }
- final Boolean bold = forceFormatting ? Boolean.valueOf(nsc.isBold(node)) : style.isBold();
- if (bold != null) {
- fontElement.setAttribute("BOLD", bold ? "true" : "false");
- isRelevant = true;
- }
- final Boolean italic = forceFormatting ? Boolean.valueOf(nsc.isItalic(node)) : style.isItalic();
- if (italic != null) {
- fontElement.setAttribute("ITALIC", italic ? "true" : "false");
- isRelevant = true;
- }
- if (isRelevant) {
- writer.addElement(style, fontElement);
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/NodeStyleController.java b/freeplane/src/org/freeplane/features/nodestyle/NodeStyleController.java
deleted file mode 100644
index 2c7233b..0000000
--- a/freeplane/src/org/freeplane/features/nodestyle/NodeStyleController.java
+++ /dev/null
@@ -1,408 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodestyle;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.util.Collection;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.CombinedPropertyChain;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ExclusivePropertyChain;
-import org.freeplane.features.mode.IPropertyHandler;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyleModel;
-
-/**
- * @author Dimitry Polivaev
- */
-public class NodeStyleController implements IExtension {
- public static Color standardNodeTextColor = Color.BLACK;
-
- public static NodeStyleController getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- return getController(modeController);
- }
-
- public static NodeStyleController getController(ModeController modeController) {
- return (NodeStyleController) modeController.getExtension(NodeStyleController.class);
- }
- public static void install( final NodeStyleController styleController) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addExtension(NodeStyleController.class, styleController);
- }
-
- final private ExclusivePropertyChain<Color, NodeModel> backgroundColorHandlers;
-// // // final private Controller controller;
- final private CombinedPropertyChain<Font, NodeModel> fontHandlers;
- final private ModeController modeController;
- final private ExclusivePropertyChain<String, NodeModel> shapeHandlers;
- final private ExclusivePropertyChain<Color, NodeModel> textColorHandlers;
- public static final String NODE_NUMBERING = "NodeNumbering";
-
- public NodeStyleController(final ModeController modeController) {
- this.modeController = modeController;
-// controller = modeController.getController();
- fontHandlers = new CombinedPropertyChain<Font, NodeModel>(true);
- textColorHandlers = new ExclusivePropertyChain<Color, NodeModel>();
- backgroundColorHandlers = new ExclusivePropertyChain<Color, NodeModel>();
- shapeHandlers = new ExclusivePropertyChain<String, NodeModel>();
- addFontGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Font, NodeModel>() {
- public Font getProperty(final NodeModel node, final Font currentValue) {
- final Font defaultFont = NodeStyleController.getDefaultFont();
- return defaultFont;
- }
- });
- addFontGetter(IPropertyHandler.STYLE, new IPropertyHandler<Font, NodeModel>() {
- public Font getProperty(final NodeModel node, final Font currentValue) {
- final Font defaultFont = getStyleFont(currentValue, node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
- return defaultFont;
- }
- });
- addColorGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Color, NodeModel>() {
- public Color getProperty(final NodeModel node, final Color currentValue) {
- return standardNodeTextColor;
- }
- });
- addColorGetter(IPropertyHandler.STYLE, new IPropertyHandler<Color, NodeModel>() {
- public Color getProperty(final NodeModel node, final Color currentValue) {
- return getStyleTextColor(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
- }
- });
- addBackgroundColorGetter(IPropertyHandler.STYLE, new IPropertyHandler<Color, NodeModel>() {
- public Color getProperty(final NodeModel node, final Color currentValue) {
- return getStyleBackgroundColor(node.getMap(), LogicalStyleController.getController(modeController).getStyles(node));
- }
- });
- addShapeGetter(IPropertyHandler.STYLE, new IPropertyHandler<String, NodeModel>() {
- public String getProperty(final NodeModel node, final String currentValue) {
- final MapModel map = node.getMap();
- final LogicalStyleController styleController = LogicalStyleController.getController(modeController);
- final Collection<IStyle> style = styleController.getStyles(node);
- final String returnedString = getStyleShape(map, style);
- return returnedString;
- }
- });
- addShapeGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<String, NodeModel>() {
- public String getProperty(final NodeModel node, final String currentValue) {
- return getShape(node);
- }
-
- private String getShape(final NodeModel node) {
- return NodeStyleModel.SHAPE_AS_PARENT;
- }
- });
- final MapController mapController = modeController.getMapController();
- final ReadManager readManager = mapController.getReadManager();
- final WriteManager writeManager = mapController.getWriteManager();
- final NodeStyleBuilder styleBuilder = new NodeStyleBuilder(this);
- styleBuilder.registerBy(readManager, writeManager);
- }
-
- public IPropertyHandler<Color, NodeModel> addBackgroundColorGetter(final Integer key,
- final IPropertyHandler<Color, NodeModel> getter) {
- return backgroundColorHandlers.addGetter(key, getter);
- }
-
- public IPropertyHandler<Color, NodeModel> addColorGetter(final Integer key,
- final IPropertyHandler<Color, NodeModel> getter) {
- return textColorHandlers.addGetter(key, getter);
- }
-
- public IPropertyHandler<Font, NodeModel> addFontGetter(final Integer key,
- final IPropertyHandler<Font, NodeModel> getter) {
- return fontHandlers.addGetter(key, getter);
- }
-
- public IPropertyHandler<String, NodeModel> addShapeGetter(final Integer key,
- final IPropertyHandler<String, NodeModel> getter) {
- return shapeHandlers.addGetter(key, getter);
- }
-
- public Color getBackgroundColor(final NodeModel node) {
- return backgroundColorHandlers.getProperty(node);
- }
-
- public Color getColor(final NodeModel node) {
- return textColorHandlers.getProperty(node);
- }
-
- private Color getStyleBackgroundColor(final MapModel map, final Collection<IStyle> styleKeys) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- for(IStyle styleKey : styleKeys){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final NodeStyleModel styleModel = NodeStyleModel.getModel(styleNode);
- if (styleModel == null) {
- continue;
- }
- final Color styleColor =styleModel.getBackgroundColor();
- if (styleColor == null) {
- continue;
- }
- return styleColor;
- }
- return null;
- }
-
- private int getStyleMaxNodeWidth(final MapModel map, final Collection<IStyle> styleKeys) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- for(IStyle styleKey : styleKeys){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final NodeSizeModel sizeModel = NodeSizeModel.getModel(styleNode);
- if (sizeModel == null) {
- continue;
- }
- final int maxTextWidth = sizeModel.getMaxNodeWidth();
- if (maxTextWidth == NodeSizeModel.NOT_SET) {
- continue;
- }
- return maxTextWidth;
- }
- return 600;
- }
-
- private int getStyleMinWidth(final MapModel map, final Collection<IStyle> styleKeys) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- for(IStyle styleKey : styleKeys){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final NodeSizeModel sizeModel = NodeSizeModel.getModel(styleNode);
- if (sizeModel == null) {
- continue;
- }
- final int minWidth = sizeModel.getMinNodeWidth();
- if (minWidth == NodeSizeModel.NOT_SET) {
- continue;
- }
- return minWidth;
- }
- return 1;
- }
-
- public static Font getDefaultFont() {
- final int fontSize = NodeStyleController.getDefaultFontSize();
- final int fontStyle = NodeStyleController.getDefaultFontStyle();
- final String fontFamily = NodeStyleController.getDefaultFontFamilyName();
- return new Font(fontFamily, fontStyle, fontSize);
- }
-
- /**
- */
- private static String getDefaultFontFamilyName() {
- return ResourceController.getResourceController().getProperty("defaultfont");
- }
-
- private static int getDefaultFontStyle() {
- return ResourceController.getResourceController().getIntProperty("defaultfontstyle", 0);
- }
-
- private static int getDefaultFontSize() {
- return ResourceController.getResourceController().getIntProperty("defaultfontsize", 10);
- }
-
- public Font getDefaultFont(final MapModel map, final IStyle style) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- final NodeModel styleNode = model.getStyleNodeSafe(style);
- return getFont(styleNode);
- }
-
- private Font getStyleFont(final Font baseFont, final MapModel map, final Collection<IStyle> collection) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- Boolean bold = null;
- Boolean italic = null;
- String fontFamilyName = null;
- Integer fontSize = null;
- for(IStyle styleKey : collection){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final NodeStyleModel styleModel = NodeStyleModel.getModel(styleNode);
- if (styleModel == null) {
- continue;
- }
- if (bold == null) bold = styleModel.isBold();
- if (italic == null) italic = styleModel.isItalic();
- if (fontFamilyName == null) fontFamilyName = styleModel.getFontFamilyName();
- if (fontSize == null) fontSize = styleModel.getFontSize();
- if(bold != null && italic != null && fontFamilyName != null && fontSize != null) break;
- }
- return createFont(baseFont, fontFamilyName, fontSize, bold, italic);
- }
-
- private Font createFont(final Font baseFont, String family, Integer size, Boolean bold, Boolean italic) {
- if (family == null && size == null && bold == null && italic == null) {
- return baseFont;
- }
- if (family == null) {
- family = baseFont.getFamily();
- }
- if (size == null) {
- size = baseFont.getSize();
- }
- if (bold == null) {
- bold = baseFont.isBold();
- }
- if (italic == null) {
- italic = baseFont.isItalic();
- }
- int style = 0;
- if (bold) {
- style += Font.BOLD;
- }
- if (italic) {
- style += Font.ITALIC;
- }
- return new Font(family, style, size);
- }
-
- private String getStyleShape(final MapModel map, final Collection<IStyle> style) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- for(IStyle styleKey : style){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final NodeStyleModel styleModel = NodeStyleModel.getModel(styleNode);
- if (styleModel == null) {
- continue;
- }
- final String shape = styleModel.getShape();
- if (shape == null) {
- continue;
- }
- return shape;
- }
- return null;
- }
-
- private Color getStyleTextColor(final MapModel map, final Collection<IStyle> collection) {
- final MapStyleModel model = MapStyleModel.getExtension(map);
- for(IStyle styleKey : collection){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final NodeStyleModel styleModel = NodeStyleModel.getModel(styleNode);
- if (styleModel == null) {
- continue;
- }
- final Color styleColor = styleModel == null ? null : styleModel.getColor();
- if (styleColor == null) {
- continue;
- }
- return styleColor;
- }
- return null;
- }
-
- public Font getFont(final NodeModel node) {
- final Font font = fontHandlers.getProperty(node, null);
- return font;
- }
-
- public String getFontFamilyName(final NodeModel node) {
- final Font font = getFont(node);
- return font.getFamily();
- }
-
- public int getFontSize(final NodeModel node) {
- final Font font = getFont(node);
- return font.getSize();
- }
-
- public String getShape(final NodeModel node) {
- final String returnedString = shapeHandlers.getProperty(node);
- return returnedString;
- }
-
- public boolean isBold(final NodeModel node) {
- return getFont(node).isBold();
- }
-
- public boolean isItalic(final NodeModel node) {
- return getFont(node).isItalic();
- }
-
- public IPropertyHandler<Color, NodeModel> removeBackgroundColorGetter(final Integer key) {
- return backgroundColorHandlers.removeGetter(key);
- }
-
- public IPropertyHandler<Color, NodeModel> removeColorGetter(final Integer key) {
- return textColorHandlers.removeGetter(key);
- }
-
- public IPropertyHandler<Font, NodeModel> removeFontGetter(final Integer key) {
- return fontHandlers.removeGetter(key);
- }
-
- public IPropertyHandler<String, NodeModel> removeShapeGetter(final Integer key) {
- return shapeHandlers.removeGetter(key);
- }
-
- public Boolean getNodeNumbering(NodeModel node) {
- final NodeStyleModel style = (NodeStyleModel) node.getExtension(NodeStyleModel.class);
- if (style == null)
- return false;
- final Boolean nodeNumbering = style.getNodeNumbering();
- return nodeNumbering == null ? false : nodeNumbering.booleanValue();
- }
-
- public String getNodeFormat(NodeModel node) {
- final NodeStyleModel style = (NodeStyleModel) node.getExtension(NodeStyleModel.class);
- return style == null ? null : style.getNodeFormat();
- }
-
- public int getMaxWidth(NodeModel node) {
- final MapModel map = node.getMap();
- final LogicalStyleController styleController = LogicalStyleController.getController(modeController);
- final Collection<IStyle> style = styleController.getStyles(node);
- final int maxTextWidth = getStyleMaxNodeWidth(map, style);
- return maxTextWidth;
- }
-
- public int getMinWidth(NodeModel node) {
- final MapModel map = node.getMap();
- final LogicalStyleController styleController = LogicalStyleController.getController(modeController);
- final Collection<IStyle> style = styleController.getStyles(node);
- final int minWidth = getStyleMinWidth(map, style);
- return minWidth;
- }
-
- public ModeController getModeController() {
- return modeController;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/NodeStyleModel.java b/freeplane/src/org/freeplane/features/nodestyle/NodeStyleModel.java
deleted file mode 100644
index 34c3172..0000000
--- a/freeplane/src/org/freeplane/features/nodestyle/NodeStyleModel.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodestyle;
-
-import java.awt.Color;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev 20.11.2008
- */
-public class NodeStyleModel implements IExtension, Cloneable {
- public static final String[] NODE_STYLES = new String[] { NodeStyleModel.STYLE_FORK, NodeStyleModel.STYLE_BUBBLE,
- NodeStyleModel.SHAPE_AS_PARENT, NodeStyleModel.SHAPE_COMBINED };
- enum Shapes{as_parent, combined, bubble, fork};
- public static final String SHAPE_AS_PARENT = "as_parent";
- public static final String SHAPE_COMBINED = "combined";
- public static final String STYLE_BUBBLE = "bubble";
- public static final String STYLE_FORK = "fork";
-
- public static NodeStyleModel createNodeStyleModel(final NodeModel node) {
- NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- if (styleModel == null) {
- styleModel = new NodeStyleModel();
- node.addExtension(styleModel);
- }
- return styleModel;
- }
-
- public static Color getBackgroundColor(final NodeModel node) {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- return styleModel == null ? null : styleModel.getBackgroundColor();
- }
-
- public static Color getColor(final NodeModel node) {
- final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- return styleModel == null ? null : styleModel.getColor();
- }
-
- public static String getFontFamilyName(final NodeModel node) {
- final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- return styleModel == null ? null : styleModel.getFontFamilyName();
- }
-
- public static Integer getFontSize(final NodeModel node) {
- final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- return styleModel == null ? null : styleModel.getFontSize();
- }
-
- public static NodeStyleModel getModel(final NodeModel node) {
- final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- return styleModel;
- }
-
- public static Boolean getNodeNumbering(NodeModel node) {
- final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- return styleModel == null ? null : styleModel.getNodeNumbering();
- }
-
- public static String getNodeFormat(final NodeModel node) {
- final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- return styleModel == null ? null : styleModel.getNodeFormat();
- }
-
- public static String getShape(final NodeModel node) {
- final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- return styleModel == null ? null : styleModel.getShape();
- }
-
- public static Boolean isBold(final NodeModel node) {
- final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- return styleModel == null ? null : styleModel.isBold();
- }
-
- public static Boolean isItalic(final NodeModel node) {
- final NodeStyleModel styleModel = node.getExtension(NodeStyleModel.class);
- return styleModel == null ? null : styleModel.isItalic();
- }
-
- public static void setBackgroundColor(final NodeModel node, final Color color) {
- final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
- styleModel.setBackgroundColor(color);
- }
-
- public static void setColor(final NodeModel node, final Color color) {
- final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
- styleModel.setColor(color);
- }
-
- public static void setNodeNumbering(NodeModel node, Boolean enableNodeNumbering) {
- final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
- styleModel.setNodeNumbering(enableNodeNumbering);
- }
-
- public static void setNodeFormat(final NodeModel node, final String nodeFormat) {
- final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
- styleModel.setNodeFormat(nodeFormat);
- }
-
- public static void setShape(final NodeModel node, final String shape) {
- final NodeStyleModel styleModel = NodeStyleModel.createNodeStyleModel(node);
- styleModel.setShape(shape);
- }
-
- private Color backgroundColor;
- private Color color;
- private String fontFamilyName = null;
- private Integer fontSize = null;
- private Boolean isBold = null;
- private Boolean isItalic = null;
- private String shape;
- private Boolean nodeNumbering = null;
- private String nodeFormat = null;
-
- @Override
- protected NodeStyleModel clone() {
- return copyTo(new NodeStyleModel());
- }
-
- public NodeStyleModel copyTo(final NodeStyleModel nodeStyleModel) {
- if(color != null)
- nodeStyleModel.setColor(color);
- if(backgroundColor != null)
- nodeStyleModel.setBackgroundColor(backgroundColor);
- if(isBold != null)
- nodeStyleModel.setBold(isBold);
- if(fontFamilyName != null)
- nodeStyleModel.setFontFamilyName(fontFamilyName);
- if(fontSize != null)
- nodeStyleModel.setFontSize(fontSize);
- if(isItalic != null)
- nodeStyleModel.setItalic(isItalic);
- if(shape != null)
- nodeStyleModel.setShape(shape);
- if(nodeFormat != null)
- nodeStyleModel.setNodeFormat(nodeFormat);
- if(nodeNumbering != null)
- nodeStyleModel.setNodeNumbering(nodeNumbering);
- return nodeStyleModel;
- }
-
- public Color getBackgroundColor() {
- return backgroundColor;
- }
-
- public Color getColor() {
- return color;
- }
-
- public String getFontFamilyName() {
- return fontFamilyName;
- };
-
- public Integer getFontSize() {
- return fontSize;
- }
-
- public Boolean getNodeNumbering() {
- return nodeNumbering;
- }
-
- public String getNodeFormat() {
- return nodeFormat;
- }
-
- public String getShape() {
- return shape;
- }
-
- public Boolean isBold() {
- return isBold;
- }
-
- public Boolean isItalic() {
- return isItalic;
- }
-
- public void setBackgroundColor(final Color color) {
- backgroundColor = color;
- }
-
- public void setBold(final Boolean isBold) {
- this.isBold = isBold;
- }
-
- public void setColor(final Color color) {
- this.color = color;
- }
-
- public void setFontFamilyName(final String fontFamilyName) {
- this.fontFamilyName = fontFamilyName;
- }
-
- public void setFontSize(final Integer fontSize) {
- this.fontSize = fontSize;
- }
-
- public void setItalic(final Boolean isItalic) {
- this.isItalic = isItalic;
- }
-
- public void setNodeNumbering(Boolean enableNodeNumbering) {
- this.nodeNumbering = enableNodeNumbering;
- }
-
- public void setNodeFormat(String nodeFormat) {
- this.nodeFormat = nodeFormat;
- }
-
- public void setShape(final String shape) {
- try {
- if(shape != null)
- Shapes.valueOf(shape);
- this.shape = shape;
- } catch (IllegalArgumentException e) {
- LogUtils.warn("unknown shape " + shape, e);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/CopyFormat.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/CopyFormat.java
deleted file mode 100644
index bcf3150..0000000
--- a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/CopyFormat.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodestyle.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.styles.LogicalStyleKeys;
-
-/**
- * @author foltin
- */
-class CopyFormat extends AFreeplaneAction {
- private static NodeModel pattern = null;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public static NodeModel getPattern() {
- return pattern;
- }
-
- public CopyFormat() {
- super("FormatCopy");
- }
-
- public void actionPerformed(final ActionEvent e) {
- copyFormat(Controller.getCurrentModeController().getMapController().getSelectedNode());
- }
-
- /**
- */
- private void copyFormat(final NodeModel node) {
- CopyFormat.pattern = new NodeModel(null);
- Controller.getCurrentModeController().undoableCopyExtensions(LogicalStyleKeys.NODE_STYLE, node, pattern);
- Controller.getCurrentModeController().undoableCopyExtensions(LogicalStyleKeys.LOGICAL_STYLE, node, pattern);
- }
-}
-
-class PasteFormat extends AMultipleNodeAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public PasteFormat() {
- super("FormatPaste");
- }
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- pasteFormat(node);
- }
-
- /**
- */
- private void pasteFormat(final NodeModel node) {
- final NodeModel pattern = CopyFormat.getPattern();
- if (pattern == null) {
- JOptionPane.showMessageDialog(Controller.getCurrentController().getViewController().getContentPane(), TextUtils
- .getText("no_format_copy_before_format_paste"), "" /*=Title*/, JOptionPane.ERROR_MESSAGE);
- return;
- }
- Controller.getCurrentModeController().undoableRemoveExtensions(LogicalStyleKeys.LOGICAL_STYLE, node, node);
- Controller.getCurrentModeController().undoableRemoveExtensions(LogicalStyleKeys.NODE_STYLE, node, node);
- Controller.getCurrentModeController().undoableCopyExtensions(LogicalStyleKeys.NODE_STYLE, pattern, node);
- Controller.getCurrentModeController().undoableCopyExtensions(LogicalStyleKeys.LOGICAL_STYLE, pattern, node);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/MNodeStyleController.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/MNodeStyleController.java
deleted file mode 100644
index 37af539..0000000
--- a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/MNodeStyleController.java
+++ /dev/null
@@ -1,605 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodestyle.mindmapmode;
-
-import java.awt.Color;
-import java.awt.event.ActionEvent;
-import java.util.Collection;
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.map.IExtensionCopier;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeSizeModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.features.styles.LogicalStyleKeys;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MNodeStyleController extends NodeStyleController {
- private static class StyleCopier implements IExtensionCopier {
- final private ModeController modeController;
-
- public StyleCopier(ModeController modeController) {
- this.modeController = modeController;
- }
-
- public void copy(final Object key, final NodeModel from, final NodeModel to) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- copy(from, to);
- }
-
- public void copy(final NodeModel from, final NodeModel to) {
- final NodeStyleModel fromStyle = from.getExtension(NodeStyleModel.class);
- if (fromStyle != null) {
- fromStyle.copyTo(NodeStyleModel.createNodeStyleModel(to));
- }
- final NodeSizeModel fromSize = from.getExtension(NodeSizeModel.class);
- if (fromSize != null) {
- fromSize.copyTo(NodeSizeModel.createNodeSizeModel(to));
- }
-
- }
-
- public void remove(final Object key, final NodeModel from) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- from.removeExtension(NodeStyleModel.class);
- from.removeExtension(NodeSizeModel.class);
- }
-
- public void remove(final Object key, final NodeModel from, final NodeModel which) {
- removeStyleData(key, from, which);
- removeSizeData(key, from, which);
- }
-
- private void removeSizeData(Object key, NodeModel from, NodeModel which) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- final NodeSizeModel whichData = which.getExtension(NodeSizeModel.class);
- if (whichData == null) {
- return;
- }
- final NodeSizeModel fromData = from.getExtension(NodeSizeModel.class);
- if (fromData == null) {
- return;
- }
- if (NodeSizeModel.NOT_SET != whichData.getMaxNodeWidth()) {
- fromData.setMaxNodeWidth(NodeSizeModel.NOT_SET);
- }
- if (NodeSizeModel.NOT_SET != whichData.getMinNodeWidth()) {
- fromData.setMinNodeWidth(NodeSizeModel.NOT_SET);
- }
- }
-
- private void removeStyleData(Object key, NodeModel from, NodeModel which) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- final NodeStyleModel whichStyle = (NodeStyleModel) which.getExtension(NodeStyleModel.class);
- if (whichStyle == null) {
- return;
- }
- final NodeStyleModel fromStyle = (NodeStyleModel) from.getExtension(NodeStyleModel.class);
- if (fromStyle == null) {
- return;
- }
- if (null != whichStyle.isBold()) {
- fromStyle.setBold(null);
- }
- if (null != whichStyle.isItalic()) {
- fromStyle.setItalic(null);
- }
- if (null != whichStyle.getFontFamilyName()) {
- fromStyle.setFontFamilyName(null);
- }
- if (null != whichStyle.getFontSize()) {
- fromStyle.setFontSize(null);
- }
- if (null != whichStyle.getShape()) {
- fromStyle.setShape(null);
- }
- if (null != whichStyle.getColor()) {
- fromStyle.setColor(null);
- }
- if (null != whichStyle.getBackgroundColor()) {
- fromStyle.setBackgroundColor(null);
- }
- if (null != whichStyle.getNodeFormat()) {
- fromStyle.setNodeFormat(null);
- }
- if (null != whichStyle.getNodeNumbering()) {
- fromStyle.setNodeNumbering(null);
- }
- }
-
- public void resolveParentExtensions(Object key, NodeModel to) {
- if (!key.equals(LogicalStyleKeys.NODE_STYLE)) {
- return;
- }
- resolveShape(to);
- }
- private void resolveShape(NodeModel to) {
- if (hasOwnShape(to))
- return;
- for(NodeModel source = to.getParentNode(); source != null; source = source.getParentNode() ){
- if(hasOwnShape(source)){
- final String shape = getShape(source);
- NodeStyleModel.createNodeStyleModel(to).setShape(shape);
- return;
- }
- }
- }
-
- private boolean hasOwnShape(NodeModel to) {
- return ! NodeStyleModel.SHAPE_AS_PARENT.equals(getShape(to));
- }
-
- private String getShape(NodeModel node) {
- return modeController.getExtension(NodeStyleController.class).getShape(node);
- }
-
- }
-
- public MNodeStyleController(final ModeController modeController) {
- super(modeController);
- modeController.registerExtensionCopier(new StyleCopier(modeController));
- modeController.addAction(new BoldAction());
- modeController.addAction(new ItalicAction());
- modeController.addAction(new CopyFormat());
- modeController.addAction(new PasteFormat());
- modeController.addAction(new RemoveFormatAction());
- final AMultipleNodeAction increaseNodeFont = new AMultipleNodeAction("IncreaseNodeFontAction") {
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- increaseFontSize(node, 1);
- }
- };
- modeController.addAction(increaseNodeFont);
- final AMultipleNodeAction decreaseNodeFont = new AMultipleNodeAction("DecreaseNodeFontAction") {
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- increaseFontSize(node, -1);
- }
- };
- modeController.addAction(decreaseNodeFont);
- modeController.addAction(new NodeColorAction());
- modeController.addAction(new NodeColorBlendAction());
- modeController.addAction(new NodeBackgroundColorAction());
- modeController.addAction(new NodeShapeAction(NodeStyleModel.STYLE_FORK));
- modeController.addAction(new NodeShapeAction(NodeStyleModel.STYLE_BUBBLE));
- modeController.addAction(new NodeWidthAction());
- }
-
- public void copyStyle(final NodeModel source, final NodeModel target) {
- copyStyleModel(source, target);
- copySizeModel(source, target);
- }
-
- protected void copyStyleModel(final NodeModel source, final NodeModel target) {
- final NodeStyleModel sourceStyleModel = NodeStyleModel.getModel(source);
- if (sourceStyleModel != null) {
- setColor(target, sourceStyleModel.getColor());
- setBackgroundColor(target, sourceStyleModel.getBackgroundColor());
- setShape(target, sourceStyleModel.getShape());
- setFontFamily(target, sourceStyleModel.getFontFamilyName());
- setFontSize(target, sourceStyleModel.getFontSize());
- setBold(target, sourceStyleModel.isBold());
- setItalic(target, sourceStyleModel.isItalic());
- setNodeFormat(target, sourceStyleModel.getNodeFormat());
- setNodeNumbering(target, sourceStyleModel.getNodeNumbering());
- }
- }
- protected void copySizeModel(final NodeModel source, final NodeModel target) {
- final NodeSizeModel sourceSizeModel = NodeSizeModel.getModel(source);
- if (sourceSizeModel != null) {
- setMaxNodeWidth(target, sourceSizeModel.getMaxNodeWidth());
- setMinNodeWidth(target, sourceSizeModel.getMinNodeWidth());
- }
- }
-
- private NodeStyleModel createOwnStyleModel(final NodeModel node) {
- {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- if (styleModel != null) {
- return styleModel;
- }
- }
- final ModeController modeController = Controller.getCurrentModeController();
- final IActor actor = new IActor() {
- public void act() {
- node.addExtension(new NodeStyleModel());
- }
-
- public String getDescription() {
- return null;
- }
-
- public void undo() {
- node.removeExtension(NodeStyleModel.class);
- }
- };
- modeController.execute(actor, node.getMap());
- return NodeStyleModel.getModel(node);
- }
-
- private NodeSizeModel createOwnSizeModel(final NodeModel node) {
- {
- final NodeSizeModel sizeModel = NodeSizeModel.getModel(node);
- if (sizeModel != null) {
- return sizeModel;
- }
- }
- final ModeController modeController = Controller.getCurrentModeController();
- final IActor actor = new IActor() {
- public void act() {
- node.addExtension(new NodeSizeModel());
- }
-
- public String getDescription() {
- return null;
- }
-
- public void undo() {
- node.removeExtension(NodeSizeModel.class);
- }
- };
- modeController.execute(actor, node.getMap());
- return NodeSizeModel.getModel(node);
- }
-
- /**
- *
- */
- public void increaseFontSize(final NodeModel node, final int increment) {
- final int newSize = getFontSize(node) + increment;
- if (newSize > 0) {
- setFontSize(node, newSize);
- }
- }
-
- public void setBackgroundColor(final NodeModel node, final Color color) {
- final ModeController modeController = Controller.getCurrentModeController();
- final Color oldColor = NodeStyleModel.getBackgroundColor(node);
- if (color == oldColor || color != null && color.equals(oldColor)) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- NodeStyleModel.setBackgroundColor(node, color);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- public String getDescription() {
- return "setBackgroundColor";
- }
-
- public void undo() {
- NodeStyleModel.setBackgroundColor(node, oldColor);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- /**
- * @param bold
- */
- public void setBold(final NodeModel node, final Boolean bold) {
- final Boolean oldBold = NodeStyleModel.isBold(node);
- if (oldBold == bold || oldBold != null && oldBold.equals(bold)) {
- return;
- }
- createOwnStyleModel(node);
- final ModeController modeController = Controller.getCurrentModeController();
- final IActor actor = new IActor() {
- public void act() {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- styleModel.setBold(bold);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- public String getDescription() {
- return "setBold";
- }
-
- public void undo() {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- styleModel.setBold(oldBold);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- public void setColor(final NodeModel node, final Color color) {
- final ModeController modeController = Controller.getCurrentModeController();
- final Color oldColor = NodeStyleModel.getColor(node);
- if (oldColor == color || oldColor != null && oldColor.equals(color)) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- NodeStyleModel.setColor(node, color);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- public String getDescription() {
- return "setColor";
- }
-
- public void undo() {
- NodeStyleModel.setColor(node, oldColor);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- /**
- * @param fontFamily
- */
- public void setFontFamily(final NodeModel node, final String fontFamily) {
- final String oldFontFamily = NodeStyleModel.getFontFamilyName(node);
- if (oldFontFamily == fontFamily || oldFontFamily != null && oldFontFamily.equals(fontFamily)) {
- return;
- }
- createOwnStyleModel(node);
- final ModeController modeController = Controller.getCurrentModeController();
- final IActor actor = new IActor() {
- public void act() {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- styleModel.setFontFamilyName(fontFamily);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- public String getDescription() {
- return "setFontFamily";
- }
-
- public void undo() {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- styleModel.setFontFamilyName(oldFontFamily);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- public void setFontFamily(final String fontFamily) {
- for (final NodeModel selected : Controller.getCurrentModeController().getMapController().getSelectedNodes()) {
- setFontFamily(selected, fontFamily);
- }
- }
-
- public void setFontSize(final int size) {
- final Collection<NodeModel> selectedNodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
- for (final NodeModel selected : selectedNodes) {
- setFontSize(selected, size);
- }
- }
-
- /**
- * @param fontSize
- */
- public void setFontSize(final NodeModel node, final Integer fontSize) {
- final Integer oldFontSize = NodeStyleModel.getFontSize(node);
- if (oldFontSize == fontSize || oldFontSize != null && oldFontSize.equals(fontSize)) {
- return;
- }
- createOwnStyleModel(node);
- final ModeController modeController = Controller.getCurrentModeController();
- final IActor actor = new IActor() {
- public void act() {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- styleModel.setFontSize(fontSize);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- public String getDescription() {
- return "setFontSize";
- }
-
- public void undo() {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- styleModel.setFontSize(oldFontSize);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- /**
- * @param italic
- */
- public void setItalic(final NodeModel node, final Boolean italic) {
- final Boolean oldItalic = NodeStyleModel.isItalic(node);
- if (oldItalic == italic || oldItalic != null && oldItalic.equals(italic)) {
- return;
- }
- createOwnStyleModel(node);
- final ModeController modeController = Controller.getCurrentModeController();
- final IActor actor = new IActor() {
- public void act() {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- styleModel.setItalic(italic);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
-
- public String getDescription() {
- return "setItalic";
- }
-
- public void undo() {
- final NodeStyleModel styleModel = NodeStyleModel.getModel(node);
- styleModel.setItalic(oldItalic);
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- public void setNodeNumbering(final NodeModel node, final Boolean enableNodeNumbering) {
- final ModeController modeController = Controller.getCurrentModeController();
- final Boolean oldValue = NodeStyleModel.getNodeNumbering(node);
- final IActor actor = new IActor() {
- public void act() {
- NodeStyleModel.setNodeNumbering(node, enableNodeNumbering);
- final MapController mapController = modeController.getMapController();
- mapController.setSaved(node.getMap(), false);
- mapController.delayedNodeRefresh(node, NodeStyleController.NODE_NUMBERING, oldValue, enableNodeNumbering);
- }
-
- public String getDescription() {
- return "setNodeNumbering";
- }
-
- public void undo() {
- NodeStyleModel.setNodeNumbering(node, oldValue);
- final MapController mapController = modeController.getMapController();
- mapController.setSaved(node.getMap(), false);
- modeController.getMapController().delayedNodeRefresh(node, NodeStyleController.NODE_NUMBERING, enableNodeNumbering, oldValue);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- public void setNodeFormat(final NodeModel node, final String format) {
- final ModeController modeController = Controller.getCurrentModeController();
- final String oldFormat = NodeStyleModel.getNodeFormat(node);
- final IActor actor = new IActor() {
- public void act() {
- NodeStyleModel.setNodeFormat(node, format);
- modeController.getMapController().nodeChanged(node);
- }
-
- public String getDescription() {
- return "setNodeFormat";
- }
-
- public void undo() {
- NodeStyleModel.setNodeFormat(node, oldFormat);
- modeController.getMapController().nodeChanged(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- public void setShape(final NodeModel node, final String shape) {
- final ModeController modeController = Controller.getCurrentModeController();
- final String oldShape = NodeStyleModel.getShape(node);
- final IActor actor = new IActor() {
- public void act() {
- NodeStyleModel.setShape(node, shape);
- modeController.getMapController().nodeChanged(node);
- childShapeRefresh(node);
- }
-
- public String getDescription() {
- return "setShape";
- }
-
- private void childShapeRefresh(final NodeModel node) {
- for (final NodeModel child : modeController.getMapController().childrenFolded(node)) {
- if(child.getViewers().isEmpty())
- continue;
- final String childShape = NodeStyleModel.getShape(child);
- if (childShape == null || NodeStyleModel.SHAPE_AS_PARENT.equals(childShape)) {
- modeController.getMapController().nodeRefresh(child);
- childShapeRefresh(child);
- }
- }
- }
-
- public void undo() {
- NodeStyleModel.setShape(node, oldShape);
- modeController.getMapController().nodeChanged(node);
- childShapeRefresh(node);
- }
- };
- modeController.execute(actor, node.getMap());
- }
- public void setMinNodeWidth(final NodeModel node, final int minNodeWidth) {
- final NodeSizeModel sizeModel = createOwnSizeModel(node);
- final int oldValue = NodeSizeModel.getMinNodeWidth(node);
- final IActor actor = new IActor() {
- public void act() {
- sizeModel.setMinNodeWidth(minNodeWidth);
- final MapController mapController = getModeController().getMapController();
- mapController.nodeChanged(node);
- }
-
- public String getDescription() {
- return "setMinNodeWidth";
- }
-
- public void undo() {
- sizeModel.setMinNodeWidth(oldValue);
- final MapController mapController = getModeController().getMapController();
- mapController.nodeChanged(node);
- }
- };
- getModeController().execute(actor, node.getMap());
- final int maxWidth = getMaxWidth(node);
- if(maxWidth < minNodeWidth){
- setMaxNodeWidth(node, minNodeWidth);
- }
- }
-
- public void setMaxNodeWidth(final NodeModel node, final int maxNodeWidth) {
- final NodeSizeModel sizeModel = createOwnSizeModel(node);
- final int oldValue = NodeSizeModel.getNodeMaxNodeWidth(node);
- final IActor actor = new IActor() {
- public void act() {
- sizeModel.setMaxNodeWidth(maxNodeWidth);
- final MapController mapController = getModeController().getMapController();
- mapController.nodeChanged(node);
- }
-
- public String getDescription() {
- return "setMaxNodeWidth";
- }
-
- public void undo() {
- sizeModel.setMaxNodeWidth(oldValue);
- final MapController mapController = getModeController().getMapController();
- mapController.nodeChanged(node);
- }
- };
- getModeController().execute(actor, node.getMap());
- final int minNodeWidth = getMinWidth(node);
- if(maxNodeWidth < minNodeWidth){
- setMinNodeWidth(node, maxNodeWidth);
- }
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeShapeAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeShapeAction.java
deleted file mode 100644
index 80c447c..0000000
--- a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeShapeAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodestyle.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-
-class NodeShapeAction extends AMultipleNodeAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private String actionShape;
-
- public NodeShapeAction( final String shape) {
- super("NodeShapeAction." + shape);
- actionShape = shape;
- }
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- ((MNodeStyleController) NodeStyleController.getController()).setShape(node, actionShape);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeSizeDialog.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeSizeDialog.java
deleted file mode 100644
index 13ce5b8..0000000
--- a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeSizeDialog.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.nodestyle.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.KeyboardFocusManager;
-
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.border.EmptyBorder;
-import java.awt.GridBagLayout;
-import javax.swing.JSpinner;
-import java.awt.GridBagConstraints;
-import java.awt.Insets;
-import javax.swing.border.TitledBorder;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.AbstractAction;
-import java.awt.event.ActionEvent;
-import javax.swing.Action;
-
-import org.freeplane.core.util.TextUtils;
-
-import java.awt.Color;
-import javax.swing.SpinnerNumberModel;
-
-/**
- * @author Dimitry Polivaev
- * Nov 12, 2011
- */
-class NodeSizeDialog extends JDialog {
- private static final String ACTION_CANCEL = "Cancel";
- private static final String ACTION_OK = "OK";
- private final JPanel contentPanel = new JPanel();
- private JSpinner spinnerMinimumNodeWidth;
- private JSpinner spinnerMaximumNodeWidth;
- private final Action closeAction = new CloseAction();
- public boolean result;
-
- /**
- * Launch the application.
- */
- public static void main(String[] args) {
- try {
- NodeSizeDialog dialog = new NodeSizeDialog();
- dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- dialog.setVisible(true);
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * Create the dialog.
- */
- public NodeSizeDialog() {
- super(JOptionPane.getFrameForComponent(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()));
- setModal(true);
- setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
- setBounds(100, 100, 267, 173);
- getContentPane().setLayout(new BorderLayout());
- contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
- getContentPane().add(contentPanel, BorderLayout.CENTER);
- GridBagLayout gbl_contentPanel = new GridBagLayout();
- gbl_contentPanel.columnWidths = new int[]{0, 0};
- gbl_contentPanel.rowHeights = new int[]{0, 0, 0};
- gbl_contentPanel.columnWeights = new double[]{1.0, Double.MIN_VALUE};
- gbl_contentPanel.rowWeights = new double[]{0.0, 0.0, Double.MIN_VALUE};
- contentPanel.setLayout(gbl_contentPanel);
- {
- JPanel panel = new JPanel();
- panel.setBorder(new TitledBorder(null, TextUtils.getText("MinNodeWidth.text"), TitledBorder.LEADING, TitledBorder.TOP, null, new Color(59, 59, 59)));
- GridBagConstraints gbc_panel = new GridBagConstraints();
- gbc_panel.fill = GridBagConstraints.BOTH;
- gbc_panel.insets = new Insets(0, 0, 5, 0);
- gbc_panel.gridx = 0;
- gbc_panel.gridy = 0;
- contentPanel.add(panel, gbc_panel);
- GridBagLayout gbl_panel = new GridBagLayout();
- gbl_panel.columnWidths = new int[]{0, 0};
- gbl_panel.rowHeights = new int[]{0, 0};
- gbl_panel.columnWeights = new double[]{1.0, Double.MIN_VALUE};
- gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE};
- panel.setLayout(gbl_panel);
- {
- spinnerMinimumNodeWidth = new JSpinner();
- spinnerMinimumNodeWidth.setModel(new SpinnerNumberModel(new Integer(1), new Integer(1), null, new Integer(1)));
- GridBagConstraints gbc_spinner_1 = new GridBagConstraints();
- gbc_spinner_1.fill = GridBagConstraints.HORIZONTAL;
- gbc_spinner_1.gridx = 0;
- gbc_spinner_1.gridy = 0;
- panel.add(spinnerMinimumNodeWidth, gbc_spinner_1);
- }
- }
- {
- JPanel panel = new JPanel();
- panel.setBorder(new TitledBorder(null, TextUtils.getText("MaxNodeWidth.text"), TitledBorder.LEADING, TitledBorder.TOP, null, null));
- GridBagConstraints gbc_panel = new GridBagConstraints();
- gbc_panel.fill = GridBagConstraints.BOTH;
- gbc_panel.gridx = 0;
- gbc_panel.gridy = 1;
- contentPanel.add(panel, gbc_panel);
- GridBagLayout gbl_panel = new GridBagLayout();
- gbl_panel.columnWidths = new int[]{0, 0};
- gbl_panel.rowHeights = new int[]{0, 0};
- gbl_panel.columnWeights = new double[]{1.0, Double.MIN_VALUE};
- gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE};
- panel.setLayout(gbl_panel);
- {
- spinnerMaximumNodeWidth = new JSpinner();
- spinnerMaximumNodeWidth.setModel(new SpinnerNumberModel(new Integer(1), new Integer(1), null, new Integer(1)));
- GridBagConstraints gbc_spinner = new GridBagConstraints();
- gbc_spinner.fill = GridBagConstraints.HORIZONTAL;
- gbc_spinner.gridx = 0;
- gbc_spinner.gridy = 0;
- panel.add(spinnerMaximumNodeWidth, gbc_spinner);
- }
- }
- {
- JPanel buttonPane = new JPanel();
- buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
- getContentPane().add(buttonPane, BorderLayout.SOUTH);
- {
- JButton okButton = new JButton(TextUtils.getText("ok"));
- okButton.addActionListener(closeAction);
- okButton.setActionCommand(ACTION_OK);
- buttonPane.add(okButton);
- getRootPane().setDefaultButton(okButton);
- }
- {
- JButton cancelButton = new JButton(TextUtils.getText("cancel"));
- cancelButton.addActionListener(closeAction);
- cancelButton.setActionCommand(ACTION_CANCEL);
- buttonPane.add(cancelButton);
- }
- }
-
- spinnerMaximumNodeWidth.addChangeListener(new ChangeListener() {
- public void stateChanged(ChangeEvent e) {
- final Integer value = (Integer)spinnerMaximumNodeWidth.getValue();
- if((Integer)spinnerMinimumNodeWidth.getValue() > value)
- spinnerMinimumNodeWidth.setValue(value);
- }
- });
-
- spinnerMinimumNodeWidth.addChangeListener(new ChangeListener() {
- public void stateChanged(ChangeEvent e) {
- final Integer value = (Integer)spinnerMinimumNodeWidth.getValue();
- if((Integer)spinnerMaximumNodeWidth.getValue() < value)
- spinnerMaximumNodeWidth.setValue(value);
- }
- });
- }
- @SuppressWarnings("serial")
- private class CloseAction extends AbstractAction {
- public CloseAction() {
- }
- public void actionPerformed(ActionEvent e) {
- result = ACTION_OK.equals(e.getActionCommand());
- setVisible(false);
- }
- }
-
- public boolean showDialog(int minNodeWidth, int maxNodeTextWidth){
- spinnerMinimumNodeWidth.setValue(minNodeWidth);
- spinnerMaximumNodeWidth.setValue(maxNodeTextWidth);
- setVisible(true);
- return result;
- }
-
- int getMinWidth(){
- return (Integer) spinnerMinimumNodeWidth.getValue();
- }
-
- int getMaxNodeWidth(){
- return (Integer) spinnerMaximumNodeWidth.getValue();
- }
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeWidthAction.java b/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeWidthAction.java
deleted file mode 100644
index de785d6..0000000
--- a/freeplane/src/org/freeplane/features/nodestyle/mindmapmode/NodeWidthAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.freeplane.features.nodestyle.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.nodestyle.NodeStyleController;
-
-class NodeWidthAction extends AMultipleNodeAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int minNodeWidth;
- private int maxNodeWidth;
- private MNodeStyleController nsc;
-
- public NodeWidthAction() {
- super("NodeWidthAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final NodeModel selected = Controller.getCurrentController().getSelection().getSelected();
- nsc = (MNodeStyleController) NodeStyleController.getController();
- minNodeWidth = nsc.getMinWidth(selected);
- maxNodeWidth = nsc.getMaxWidth(selected);
- final NodeSizeDialog nodeSizeDialog = new NodeSizeDialog();
- nodeSizeDialog.setTitle(TextUtils.getText("NodeWidthAction.text"));
- if(nodeSizeDialog.showDialog(minNodeWidth, maxNodeWidth)){
- minNodeWidth = nodeSizeDialog.getMinWidth();
- maxNodeWidth = nodeSizeDialog.getMaxNodeWidth();
- super.actionPerformed(e);
- }
- nsc = null;
- }
-
- @Override
- protected void actionPerformed(ActionEvent e, NodeModel node) {
- nsc.setMaxNodeWidth(node, maxNodeWidth);
- nsc.setMinNodeWidth(node, minNodeWidth);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/note/NoteController.java b/freeplane/src/org/freeplane/features/note/NoteController.java
deleted file mode 100644
index 927112c..0000000
--- a/freeplane/src/org/freeplane/features/note/NoteController.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.note;
-
-import java.awt.Component;
-import java.awt.Font;
-import java.net.URL;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.icon.IStateIconProvider;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.UIIcon;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.map.ITooltipProvider;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.text.TextController;
-
-/**
- * @author Dimitry Polivaev
- */
-public class NoteController implements IExtension {
- private static boolean firstRun = true;
- /**
- *
- */
- public static final String NODE_NOTE_ICON = "accessories.plugins.NodeNoteIcon";
- private static UIIcon noteIcon;
- public static URL bwNoteIconUrl;
- public static final String SHOW_NOTE_ICONS = "show_note_icons";
- private static final Integer NODE_TOOLTIP = 9;
- public static final String SHOW_NOTES_IN_MAP = "show_notes_in_map";
-
- public static NoteController getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- return getController(modeController);
- }
-
- public static NoteController getController(ModeController modeController) {
- return (NoteController) modeController.getExtension(NoteController.class);
- }
-
- public static void install( final NoteController noteController) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addExtension(NoteController.class, noteController);
- if (firstRun) {
- noteIcon = IconStoreFactory.create().getUIIcon("knotes.png");
- bwNoteIconUrl = ResourceController.getResourceController().getResource("/images/note_black_and_transp.png");
- firstRun = false;
- }
- }
-
- final private ModeController modeController;
-
- public NoteController() {
- super();
- final ModeController modeController = Controller.getCurrentModeController();
- this.modeController = modeController;
- modeController.getMapController().getReadManager().addElementHandler("richcontent", new NoteBuilder(this));
- final NoteWriter noteWriter = new NoteWriter(this);
- final WriteManager writeManager = modeController.getMapController().getWriteManager();
- writeManager.addAttributeWriter("map", noteWriter);
- writeManager.addExtensionElementWriter(NoteModel.class, noteWriter);
- registerNoteTooltipProvider(modeController);
- registerStateIconProvider();
- }
-
- public final String getNoteText(final NodeModel node) {
- final NoteModel extension = (NoteModel) node.getExtension(NoteModel.class);
- return extension != null ? extension.getHtml() : null;
- }
-
- public final String getXmlNoteText(final NodeModel node) {
- final NoteModel extension = (NoteModel) node.getExtension(NoteModel.class);
- return extension != null ? extension.getXml() : null;
- }
-
- /**
- * @param data.node
- */
- protected void onWrite(final MapModel map) {
- }
-
- private void registerNoteTooltipProvider(ModeController modeController) {
- modeController.addToolTipProvider(NODE_TOOLTIP, new ITooltipProvider() {
- public String getTooltip(ModeController modeController, NodeModel node, Component view) {
- if(showNotesInMap(node.getMap()) && ! TextController.getController(modeController).isMinimized(node)){
- return null;
- }
- final String noteText = NoteModel.getNoteText(node);
- if (noteText == null)
- return null;
- final StringBuilder rule = new StringBuilder();
- // set default font for notes:
- final NodeStyleController style = (NodeStyleController) Controller.getCurrentModeController().getExtension(
- NodeStyleController.class);
- MapModel map = modeController.getController().getMap();
- if(map != null){
- final Font defaultFont;
- defaultFont = style.getDefaultFont(map, MapStyleModel.NOTE_STYLE);
- rule.append("font-family: " + defaultFont.getFamily() + ";");
- rule.append("font-size: " + defaultFont.getSize() + "pt;");
- if (defaultFont.isItalic()) {
- rule.append("font-style: italic; ");
- }
- if (defaultFont.isBold()) {
- rule.append("font-weight: bold; ");
- }
- }
- final StringBuilder tooltipBodyBegin = new StringBuilder("<body><div style=\"");
- tooltipBodyBegin.append(rule);
- tooltipBodyBegin.append("\">");
- tooltipBodyBegin.append("<img src =\"");
- tooltipBodyBegin.append(bwNoteIconUrl.toString());
- tooltipBodyBegin.append("\">");
- final String tooltipText = noteText.replaceFirst("<body>",
- tooltipBodyBegin.toString()).replaceFirst("</body>", "</div></body>");
- return tooltipText;
- }
- });
- }
-
- private void registerStateIconProvider() {
- IconController.getController().addStateIconProvider(new IStateIconProvider() {
- public UIIcon getStateIcon(NodeModel node) {
- boolean showIcon;
- if(NoteModel.getNote(node) != null){
- final String showNoteIcon = MapStyle.getController(modeController).getPropertySetDefault(node.getMap(), SHOW_NOTE_ICONS);
- showIcon = Boolean.parseBoolean(showNoteIcon);
- if(showIcon)
- return noteIcon;
- }
- return null;
- }
- });
- }
-
- public boolean showNotesInMap(MapModel model) {
- final String property = MapStyleModel.getExtension(model).getProperty(NoteController.SHOW_NOTES_IN_MAP);
- return Boolean.parseBoolean(property);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/note/NoteWriter.java b/freeplane/src/org/freeplane/features/note/NoteWriter.java
deleted file mode 100644
index 8939ecd..0000000
--- a/freeplane/src/org/freeplane/features/note/NoteWriter.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.note;
-
-import java.io.IOException;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeWriter;
-import org.freeplane.core.io.IExtensionElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.text.NodeTextBuilder;
-import org.freeplane.features.text.RichTextModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- */
-class NoteWriter implements IExtensionElementWriter, IAttributeWriter {
- NoteController noteManager;
-
- public NoteWriter(final NoteController noteManager) {
- super();
- this.noteManager = noteManager;
- }
-
- public void writeAttributes(final ITreeWriter writer, final Object userObject, final String tag) {
- noteManager.onWrite((MapModel) userObject);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.io.INodeWriter#saveContent(freeplane.io.ITreeWriter,
- * java.lang.Object, java.lang.String)
- */
- public void writeContent(final ITreeWriter writer, final Object element, final IExtension note) throws IOException {
- RichTextModel note1 = (RichTextModel) note;
- if (note1.getXml() != null) {
- final XMLElement htmlElement = new XMLElement();
- htmlElement.setName(NodeTextBuilder.XML_NODE_XHTML_CONTENT_TAG);
- if(note instanceof NoteModel){
- htmlElement.setAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, NodeTextBuilder.XML_NODE_XHTML_TYPE_NOTE);
- }
- else{
- htmlElement.setAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, "UNKNOWN");
- }
- final String content = note1.getXml().replace('\0', ' ');
- writer.addElement('\n' + content + '\n', htmlElement);
- }
- return;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/note/mindmapmode/EditNoteInDialogAction.java b/freeplane/src/org/freeplane/features/note/mindmapmode/EditNoteInDialogAction.java
deleted file mode 100644
index e0785ae..0000000
--- a/freeplane/src/org/freeplane/features/note/mindmapmode/EditNoteInDialogAction.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.note.mindmapmode;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.util.regex.Pattern;
-
-import javax.swing.RootPaneContainer;
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.features.text.mindmapmode.EditNodeBase;
-import org.freeplane.features.text.mindmapmode.IEditBaseCreator;
-import org.freeplane.features.text.mindmapmode.EditNodeBase.EditedComponent;
-import org.freeplane.features.ui.IMapViewManager;
-
-class EditNoteInDialogAction extends AFreeplaneAction {
- private static final Pattern HTML_HEAD = Pattern.compile("\\s*<head>.*</head>", Pattern.DOTALL);
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private EditNodeBase mCurrentEditDialog = null;
-
- public EditNoteInDialogAction() {
- super("EditNoteInDialogAction");
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.controller.actions.ActorXml#act(freeplane.controller.actions.
- * generated.instance.XmlAction)
- */
- public void actionPerformed(final ActionEvent arg0) {
- final Controller controller = Controller.getCurrentController();
- final NodeModel nodeModel = controller.getSelection().getSelected();
- final IMapViewManager viewController = controller.getMapViewManager();
- final Component node = viewController.getComponent(nodeModel);
- node.requestFocus();
- edit(nodeModel);
- }
-
- void edit(final NodeModel nodeModel) {
- final Controller controller = Controller.getCurrentController();
- stopEditing();
- Controller.getCurrentModeController().setBlocked(true);
- String text = NoteModel.getNoteText(nodeModel);
- if(text == null){
- text = "";
- }
- final EditNodeBase.IEditControl editControl = new EditNodeBase.IEditControl() {
- public void cancel() {
- Controller.getCurrentModeController().setBlocked(false);
- mCurrentEditDialog = null;
- }
-
- public void ok(final String newText) {
- setHtmlText(nodeModel, newText);
- cancel();
- }
-
- public void split(final String newText, final int position) {
- }
- public boolean canSplit() {
- return false;
- }
-
- public EditedComponent getEditType() {
- return EditedComponent.NOTE;
- }
- };
- final IEditBaseCreator textFieldCreator = (IEditBaseCreator) Controller.getCurrentController().getMapViewManager();
- mCurrentEditDialog = textFieldCreator.createEditor(nodeModel, editControl, text, true);
- final RootPaneContainer frame = (RootPaneContainer) SwingUtilities.getWindowAncestor(controller.getMapViewManager().getMapViewComponent());
- mCurrentEditDialog.show(frame);
-
- }
-
-
- private void setHtmlText(final NodeModel node, final String newText) {
- final String body = EditNoteInDialogAction.HTML_HEAD.matcher(newText).replaceFirst("");
- final MNoteController noteController = (MNoteController) MNoteController.getController();
- final String trimmed = body.replaceFirst("\\s+$", "");
- if(HtmlUtils.isEmpty(trimmed))
- noteController.setNoteText(node, null);
- else
- noteController.setNoteText(node, trimmed);
- }
-
- private void stopEditing() {
- if (mCurrentEditDialog != null) {
- mCurrentEditDialog.closeEdit();
- mCurrentEditDialog = null;
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/note/mindmapmode/MNoteController.java b/freeplane/src/org/freeplane/features/note/mindmapmode/MNoteController.java
deleted file mode 100644
index ec0f566..0000000
--- a/freeplane/src/org/freeplane/features/note/mindmapmode/MNoteController.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.note.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.EventQueue;
-import java.awt.Font;
-import java.awt.KeyboardFocusManager;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.awt.event.KeyEvent;
-import java.net.URI;
-
-import javax.swing.BorderFactory;
-import javax.swing.InputMap;
-import javax.swing.JEditorPane;
-import javax.swing.JPanel;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.text.html.StyleSheet;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.mindmapmode.SetBooleanMapPropertyAction;
-import org.freeplane.features.text.mindmapmode.FreeplaneToSHTMLPropertyChangeAdapter;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.url.UrlManager;
-
-import com.lightdev.app.shtm.SHTMLEditorPane;
-import com.lightdev.app.shtm.SHTMLPanel;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MNoteController extends NoteController {
- final class NoteDocumentListener implements DocumentListener {
- public void changedUpdate(final DocumentEvent arg0) {
- docEvent();
- }
-
- private void docEvent() {
- final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
- if (focusOwner == null || !SwingUtilities.isDescendingFrom(focusOwner, htmlEditorPanel)) {
- return;
- }
- final ModeController modeController = Controller.getCurrentModeController();
- final MapController mapController = modeController.getMapController();
- final MapModel map = modeController.getController().getMap();
- mapController.setSaved(map, false);
- }
-
- public void insertUpdate(final DocumentEvent arg0) {
- docEvent();
- }
-
- public void removeUpdate(final DocumentEvent arg0) {
- docEvent();
- }
- }
-
- private static class SouthPanel extends JPanel {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public SouthPanel() {
- super(new BorderLayout());
- setBorder(BorderFactory.createEmptyBorder(10, 10, 0, 10));
- }
-
- @Override
- protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition,
- final boolean pressed) {
- return super.processKeyBinding(ks, e, condition, pressed) || e.getKeyChar() == KeyEvent.VK_SPACE
- || e.getKeyChar() == KeyEvent.VK_ALT;
- }
- }
-
- private static SHTMLPanel htmlEditorPanel;
- public static final String RESOURCES_REMOVE_NOTES_WITHOUT_QUESTION = "remove_notes_without_question";
- public static final String RESOURCES_USE_DEFAULT_FONT_FOR_NOTES_TOO = "resources_use_default_font_for_notes_too";
- public static final String RESOURCES_USE_MARGIN_TOP_ZERO_FOR_NOTES = "resources_use_margin_top_zero_for_notes";
- static final String RESOURCES_USE_SPLIT_PANE = "use_split_pane";
- /**
- * Indicates, whether or not the main panel has to be refreshed with new
- * content. The typical content will be empty, so this state is saved here.
- */
- private boolean mLastContentEmpty = true;
- private final NoteManager noteManager;
- private SHTMLPanel noteViewerComponent;
-
- /**
- * @param modeController
- */
- public MNoteController(ModeController modeController) {
- super();
- noteManager = new NoteManager(this);
- createActions(modeController);
- }
-
- private void createActions(ModeController modeController) {
- modeController.addAction(new SelectNoteAction(this));
- modeController.addAction(new ShowHideNoteAction(this));
- modeController.addAction(new EditNoteInDialogAction());
- modeController.addAction(new SetNoteWindowPosition("top"));
- modeController.addAction(new SetNoteWindowPosition( "left"));
- modeController.addAction(new SetNoteWindowPosition("right"));
- modeController.addAction(new SetNoteWindowPosition("bottom"));
- modeController.addAction(new RemoveNoteAction(this));
- modeController.addAction(new SetBooleanMapPropertyAction(SHOW_NOTE_ICONS));
- }
-
- SHTMLPanel getHtmlEditorPanel() {
- if (htmlEditorPanel != null) {
- return htmlEditorPanel;
- }
- htmlEditorPanel = MTextController.getController().createSHTMLPanel(NoteModel.EDITING_PURPOSE);
-
- // make sure that SHTML gets notified of relevant config changes!
- ResourceController.getResourceController().addPropertyChangeListener(
- new FreeplaneToSHTMLPropertyChangeAdapter(htmlEditorPanel));
-
- htmlEditorPanel.setMinimumSize(new Dimension(100, 100));
- final SHTMLEditorPane editorPane = (SHTMLEditorPane) htmlEditorPanel.getEditorPane();
-
- for (InputMap inputMap = editorPane.getInputMap(); inputMap != null; inputMap = inputMap.getParent()){
- inputMap.remove(KeyStroke.getKeyStroke("ctrl pressed T"));
- inputMap.remove(KeyStroke.getKeyStroke("ctrl shift pressed T"));
- inputMap.remove(KeyStroke.getKeyStroke("ctrl pressed SPACE"));
- }
-
- editorPane.addFocusListener(new FocusListener() {
- private SpellCheckerController spellCheckerController = null;
- private boolean enabled = false;
- public void focusLost(final FocusEvent e) {
- if(! e.isTemporary()){
- spellCheckerController.enableAutoSpell(editorPane, false);
- enabled = false;
- }
- }
-
- public void focusGained(final FocusEvent e) {
- if(! enabled){
- initSpellChecker();
- spellCheckerController.enableAutoSpell(editorPane, true);
- enabled = true;
- }
- }
-
- private void initSpellChecker() {
- if (spellCheckerController != null) {
- return;
- }
- spellCheckerController = SpellCheckerController.getController();
- spellCheckerController.addSpellCheckerMenu(editorPane.getPopup());
- spellCheckerController.enableShortKey(editorPane, true);
- }
- });
- return htmlEditorPanel;
- }
-
- SHTMLPanel getNoteViewerComponent() {
- return noteViewerComponent;
- }
-
- void hideNotesPanel() {
- noteManager.saveNote();
- noteViewerComponent.setVisible(false);
- Controller.getCurrentModeController().getController().getViewController().removeSplitPane();
- ResourceController.getResourceController().setProperty(MNoteController.RESOURCES_USE_SPLIT_PANE, "false");
- }
-
- boolean isLastContentEmpty() {
- return mLastContentEmpty;
- }
-
- @Override
- protected void onWrite(final MapModel map) {
- final ModeController modeController = Controller.getCurrentModeController();
- final Controller controller = modeController.getController();
- final IMapSelection selection = controller.getSelection();
- if (selection == null) {
- return;
- }
- final NodeModel selected = selection.getSelected();
- noteManager.saveNote(selected);
- }
-
- void setLastContentEmpty(final boolean mLastContentEmpty) {
- this.mLastContentEmpty = mLastContentEmpty;
- }
-
- public void setNoteText(final NodeModel node, final String newText) {
- final String oldText = getNoteText(node);
- if (oldText == newText || null != oldText && oldText.equals(newText)) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- setText(newText);
- }
-
- public String getDescription() {
- return "setNoteText";
- }
-
- private void setText(final String text) {
- final boolean enabled = !(text == null || text.equals(""));
- if (enabled) {
- final NoteModel note = NoteModel.createNote(node);
- note.setHtml(text);
- node.addExtension(note);
- }
- else {
- if (null != node.getExtension(NoteModel.class)) {
- node.removeExtension(NoteModel.class);
- }
- }
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NOTE_TEXT, oldText, text);
- if(noteManager != null)
- noteManager.updateEditor();
- }
-
- public void undo() {
- setText(oldText);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- private boolean shouldUseSplitPane() {
- return "true".equals(ResourceController.getResourceController().getProperty(
- MNoteController.RESOURCES_USE_SPLIT_PANE));
- }
-
- void showNotesPanel(final boolean requestFocus) {
- if (noteViewerComponent == null) {
- noteViewerComponent = getHtmlEditorPanel();
- noteManager.updateEditor();
- }
- final SouthPanel southPanel = new SouthPanel();
- southPanel.add(noteViewerComponent, BorderLayout.CENTER);
-// setDefaultFont();
- noteViewerComponent.setOpenHyperlinkHandler(new ActionListener() {
- public void actionPerformed(final ActionEvent pE) {
- try {
- String uriText = pE.getActionCommand();
- UrlManager.getController().loadURL(new URI(uriText));
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
- });
- noteViewerComponent.setVisible(true);
- ResourceController.getResourceController().setProperty(MNoteController.RESOURCES_USE_SPLIT_PANE, "true");
- Controller.getCurrentModeController().getController().getViewController().insertComponentIntoSplitPane(southPanel);
- if (requestFocus) {
- KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- final SHTMLPanel htmlEditorPanel = getHtmlEditorPanel();
- htmlEditorPanel.getMostRecentFocusOwner().requestFocus();
- if (ResourceController.getResourceController().getBooleanProperty("goto_note_end_on_edit")) {
- final JEditorPane editorPane = htmlEditorPanel.getEditorPane();
- editorPane.setCaretPosition(editorPane.getDocument().getLength());
- }
- }
- });
- }
- southPanel.revalidate();
- }
-
- void setDefaultFont() {
- final StyleSheet styleSheet = noteViewerComponent.getDocument().getStyleSheet();
- styleSheet.removeStyle("body");
- styleSheet.removeStyle("p");
- // set default font for notes:
- final NodeStyleController style = Controller.getCurrentModeController().getExtension(
- NodeStyleController.class);
- MapModel map = Controller.getCurrentModeController().getController().getMap();
- if(map != null){
- final Font defaultFont;
- defaultFont = style.getDefaultFont(map, MapStyleModel.NOTE_STYLE);
- String rule = "body {";
- rule += "font-family: " + defaultFont.getFamily() + ";";
- rule += "font-size: " + defaultFont.getSize() + "pt;";
- if (defaultFont.isItalic()) {
- rule += "font-style: italic; ";
- }
- if (defaultFont.isBold()) {
- rule += "font-weight: bold; ";
- }
- rule += "}\n";
- styleSheet.addRule(rule);
- }
- if (ResourceController.getResourceController().getBooleanProperty(
- MNoteController.RESOURCES_USE_MARGIN_TOP_ZERO_FOR_NOTES)) {
- /* this is used for paragraph spacing. I put it here, too, as
- * the tooltip display uses the same spacing. But it is to be discussed.
- * fc, 23.3.2009.
- */
- String rule = "p {";
- rule += "margin-top:0;";
- rule += "}\n";
- styleSheet.addRule(rule);
- }
- }
-
- boolean isEditing() {
- final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
- return focusOwner != null && noteViewerComponent != null && SwingUtilities.isDescendingFrom(focusOwner, noteViewerComponent);
- }
-
- void setFocusToMap() {
- final Controller controller = Controller.getCurrentModeController().getController();
- final NodeModel node = controller.getSelection().getSelected();
- controller.getMapViewManager().getComponent(node).requestFocusInWindow();
- }
-
- public void shutdownController() {
- Controller.getCurrentModeController().getMapController().removeNodeSelectionListener(noteManager);
- if (noteViewerComponent == null) {
- return;
- }
- noteViewerComponent.getActionMap().remove("jumpToMapAction");
- if (shouldUseSplitPane()) {
- hideNotesPanel();
- noteViewerComponent = null;
- }
- }
-
- public void startupController() {
- final ModeController modeController = Controller.getCurrentModeController();
- if (shouldUseSplitPane()) {
- showNotesPanel(false);
- }
- modeController.getMapController().addNodeSelectionListener(noteManager);
- noteManager.mNoteDocumentListener = new NoteDocumentListener();
- }
-
- boolean isNoteEditorShowing() {
- return ResourceController.getResourceController().getBooleanProperty(
- MNoteController.RESOURCES_USE_SPLIT_PANE);
- }
-
- public void setShowNotesInMap(final MapModel model, final boolean show) {
- MapStyle.getController().setProperty(model, SHOW_NOTES_IN_MAP, Boolean.toString(show));
- }
-}
diff --git a/freeplane/src/org/freeplane/features/note/mindmapmode/NoteManager.java b/freeplane/src/org/freeplane/features/note/mindmapmode/NoteManager.java
deleted file mode 100644
index 6279af3..0000000
--- a/freeplane/src/org/freeplane/features/note/mindmapmode/NoteManager.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.note.mindmapmode;
-
-import java.net.URL;
-import java.util.regex.Pattern;
-
-import javax.swing.text.html.HTMLDocument;
-
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.features.note.mindmapmode.MNoteController.NoteDocumentListener;
-
-import com.lightdev.app.shtm.SHTMLPanel;
-
-final class NoteManager implements INodeSelectionListener {
- public final static Pattern HEAD = Pattern.compile("<head>.*</head>\n", Pattern.DOTALL);
- private boolean ignoreEditorUpdate;
- NoteDocumentListener mNoteDocumentListener;
- private NodeModel node;
- /**
- *
- */
- final private MNoteController noteController;
-
- public NoteManager(final MNoteController noteController) {
- this.noteController = noteController;
- }
-
- public void onDeselect(final NodeModel node) {
- final SHTMLPanel noteViewerComponent = noteController.getNoteViewerComponent();
- if (noteViewerComponent == null) {
- return;
- }
- noteViewerComponent.getDocument().removeDocumentListener(mNoteDocumentListener);
- saveNote(node);
- this.node = null;
- }
-
- public void onSelect(final NodeModel nodeView) {
- node = nodeView;
- updateEditor();
- }
-
- void saveNote() {
- if (node == null) {
- return;
- }
- final SHTMLPanel noteViewerComponent = noteController.getNoteViewerComponent();
- if (noteViewerComponent == null) {
- return;
- }
- boolean editorContentEmpty = true;
- String documentText = noteViewerComponent.getDocumentText();
- documentText = HEAD.matcher(documentText).replaceFirst("");
- editorContentEmpty = HtmlUtils.isEmpty(documentText);
- Controller.getCurrentModeController().getMapController().removeNodeSelectionListener(this);
- if (noteViewerComponent.needsSaving()) {
- try {
- ignoreEditorUpdate = true;
- if (editorContentEmpty) {
- noteController.setNoteText(node, null);
- }
- else {
- noteController.setNoteText(node, documentText);
- }
- }
- finally {
- ignoreEditorUpdate = false;
- }
- noteController.setLastContentEmpty(editorContentEmpty);
- }
- Controller.getCurrentModeController().getMapController().addNodeSelectionListener(this);
- }
-
- void saveNote(final NodeModel node) {
- if (this.node != node) {
- return;
- }
- saveNote();
- }
-
- void updateEditor() {
- if (ignoreEditorUpdate) {
- return;
- }
- final SHTMLPanel noteViewerComponent = noteController.getNoteViewerComponent();
- if (noteViewerComponent == null) {
- return;
- }
- final HTMLDocument document = noteViewerComponent.getDocument();
- document.removeDocumentListener(mNoteDocumentListener);
- try {
- final URL url = node.getMap().getURL();
- if (url != null) {
- document.setBase(url);
- }
- else {
- document.setBase(new URL("file: "));
- }
- }
- catch (final Exception e) {
- }
- noteController.setDefaultFont();
- final String note = node != null ? NoteModel.getNoteText(node) : null;
- if (note != null) {
- noteViewerComponent.setCurrentDocumentContent(note);
- noteController.setLastContentEmpty(false);
- }
- else if (!noteController.isLastContentEmpty()) {
- noteViewerComponent.setCurrentDocumentContent("");
- noteController.setLastContentEmpty(true);
- }
- document.addDocumentListener(mNoteDocumentListener);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/note/mindmapmode/SetNoteWindowPosition.java b/freeplane/src/org/freeplane/features/note/mindmapmode/SetNoteWindowPosition.java
deleted file mode 100644
index 8d7ff12..0000000
--- a/freeplane/src/org/freeplane/features/note/mindmapmode/SetNoteWindowPosition.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.freeplane.features.note.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.ViewController;
-
-/** Select Note Window at the position action */
- at SelectableAction(checkOnPopup = true)
-class SetNoteWindowPosition extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private final String position;
-
- public SetNoteWindowPosition( final String position) {
- super("SetNoteWindowPosition." + position);
- this.position = position;
- };
-
- public void actionPerformed(final ActionEvent e) {
- final ResourceController resourceController = ResourceController.getResourceController();
- resourceController.setProperty("note_location", position);
- final ViewController viewController = Controller.getCurrentModeController().getController().getViewController();
- viewController.changeNoteWindowLocation();
- }
-
- @Override
- public void setSelected() {
- final ResourceController resourceController = ResourceController.getResourceController();
- final boolean isSelected = resourceController.getProperty("note_location").equals(position);
- setSelected(isSelected);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/print/FitMap.java b/freeplane/src/org/freeplane/features/print/FitMap.java
deleted file mode 100644
index eb66576..0000000
--- a/freeplane/src/org/freeplane/features/print/FitMap.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.print;
-
-import org.freeplane.core.resources.ResourceController;
-
-/**
- * @author Dimitry Polivaev
- * 30.08.2009
- */
-public enum FitMap {
- USER_DEFINED, WIDTH, HEIGHT, PAGE;
- public static FitMap valueOf() {
- final String fitMapStr = ResourceController.getResourceController().getProperty("fit_map");
- return FitMap.valueOf(fitMapStr);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/print/PageAction.java b/freeplane/src/org/freeplane/features/print/PageAction.java
deleted file mode 100644
index 856ae10..0000000
--- a/freeplane/src/org/freeplane/features/print/PageAction.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.print;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.ButtonGroup;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
-import javax.swing.JTextField;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-
-class PageAction extends AbstractPrintAction {
- static final String NAME = "page";
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- PageAction(final PrintController controller) {
- super("PageAction", controller);
- }
-
- public void actionPerformed(final ActionEvent e) {
- if (!getPrintController().acquirePrinterJobAndPageFormat(false)) {
- return;
- }
- final FitMap fitMap = FitMap.valueOf();
- //define controls
- //ButtonGroup
- final ButtonGroup fitButtons = new ButtonGroup();
- //Fit to page
- final JRadioButton fitToPage = new JRadioButton();
- MenuBuilder.setLabelAndMnemonic(fitToPage, TextUtils.getRawText("fit_map_to_page"));
- fitToPage.setSelected(fitMap == FitMap.PAGE);
- fitButtons.add(fitToPage);
- //Fit width
- final JRadioButton fitToWidth = new JRadioButton();
- MenuBuilder.setLabelAndMnemonic(fitToWidth, TextUtils.getRawText("fit_map_to_page_width"));
- fitToWidth.setSelected(fitMap == FitMap.WIDTH);
- fitButtons.add(fitToWidth);
- //Fit to heighth
- final JRadioButton fitToHeighth = new JRadioButton();
- MenuBuilder.setLabelAndMnemonic(fitToHeighth, TextUtils.getRawText("fit_map_to_page_height"));
- fitToHeighth.setSelected(fitMap == FitMap.HEIGHT);
- fitButtons.add(fitToHeighth);
- //User defined
- final JRadioButton userDefaultScale = new JRadioButton();
- MenuBuilder.setLabelAndMnemonic(userDefaultScale, TextUtils.getRawText("user_defined_scale"));
- userDefaultScale.setSelected(fitMap == FitMap.USER_DEFINED);
- fitButtons.add(userDefaultScale);
- //User defined label
- final JLabel userZoomL = new JLabel(TextUtils.getText("user_zoom"));
- //User defined input field
- final JTextField userZoom = new JTextField(ResourceController.getResourceController().getProperty("user_zoom"),
- 3);
- userZoom.setPreferredSize(new Dimension(30, 21));
- if (fitMap == FitMap.USER_DEFINED) {
- userZoom.setEditable(true);
- userZoom.setEnabled(true);
- }
- else {
- userZoom.setEnabled(false);
- userZoom.setEditable(false);
- }
- //Set up dialog content
- final JPanel panel = new JPanel();
- final GridBagLayout gridbag = new GridBagLayout();
- panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(),
- BorderFactory.createEmptyBorder(10, 0, 10, 0)));
- //Action listener if user defined zoom is selected/ deselected
- userDefaultScale.addItemListener(new ItemListener() {
- public void itemStateChanged(final ItemEvent e) {
- final boolean selected = e.getStateChange() == ItemEvent.SELECTED;
- userZoom.setEditable(selected);
- userZoom.setEnabled(selected);
- if (selected) {
- userZoom.requestFocusInWindow();
- }
- }
- });
- //GridbagLayout
- final GridBagConstraints c = new GridBagConstraints();
- c.gridx = 0;
- c.gridy = 0;
- c.gridwidth = 3;
- c.ipady = 10;
- c.ipadx = 4;
- c.anchor = GridBagConstraints.LINE_START;
- c.insets = new Insets(0, 10, 0, 10);
- //fit to page
- gridbag.setConstraints(fitToPage, c);
- panel.add(fitToPage);
- c.gridy++;
- //fit to width
- gridbag.setConstraints(fitToWidth, c);
- panel.add(fitToWidth);
- c.gridy++;
- //fit to heigth
- gridbag.setConstraints(fitToHeighth, c);
- panel.add(fitToHeighth);
- c.gridy++;
- //user defined
- gridbag.setConstraints(userDefaultScale, c);
- panel.add(userDefaultScale);
- c.gridy++;
- c.ipady = 1;
- c.gridx = 0;
- c.gridwidth = 1;
- c.insets = new Insets(0, 0, 0, 0);
- //spacer
- final Component b = Box.createRigidArea(new Dimension(25, 1));
- gridbag.setConstraints(b, c);
- panel.add(b);
- c.ipadx = 4;
- c.gridx = 1;
- c.gridwidth = 1;
- //Label
- gridbag.setConstraints(userZoomL, c);
- panel.add(userZoomL);
- c.gridx = 2;
- c.gridwidth = 1;
- c.ipadx = 10;
- c.insets = new Insets(0, 0, 0, 10);
- //input field
- gridbag.setConstraints(userZoom, c);
- panel.add(userZoom);
- panel.setLayout(gridbag);
- //show dialog
- final int result = UITools.showConfirmDialog(null, panel, TextUtils.getText("printing_settings"),
- JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
- //evaluate result
- if (result == JOptionPane.OK_OPTION) {
- ResourceController.getResourceController().setProperty("user_zoom", userZoom.getText());
- final FitMap fitMapDecision;
- if (fitToPage.isSelected()) {
- fitMapDecision = FitMap.PAGE;
- }
- else if (fitToWidth.isSelected()) {
- fitMapDecision = FitMap.WIDTH;
- }
- else if (fitToHeighth.isSelected()) {
- fitMapDecision = FitMap.HEIGHT;
- }
- else {
- fitMapDecision = FitMap.USER_DEFINED;
- }
- ResourceController.getResourceController().setProperty("fit_map", fitMapDecision.toString());
- }
- else {
- return;
- }
- final PrintController printController = getPrintController();
- printController.pageDialog();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/print/Preview.java b/freeplane/src/org/freeplane/features/print/Preview.java
deleted file mode 100644
index be17bae..0000000
--- a/freeplane/src/org/freeplane/features/print/Preview.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Preview Dialog - A Preview Dialog for your Swing Applications Copyright (C)
- * 2003 Jens Kaiser. Written by: 2003 Jens Kaiser <jens.kaiser at web.de> This
- * program is free software; you can redistribute it and/or modify it under the
- * terms of the GNU Library General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option) any
- * later version. This program is distributed in the hope that it will be
- * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
- * General Public License for more details. You should have received a copy of
- * the GNU Library General Public License along with this program; if not, write
- * to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
- * USA.
- */
-package org.freeplane.features.print;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.awt.print.PageFormat;
-import java.awt.print.Printable;
-import java.awt.print.PrinterException;
-
-import javax.swing.JComponent;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.view.swing.map.MapView;
-
-class Preview extends JComponent {
- final private static int DEFAULT_PREVIEW_SIZE = 300;
- final private static double MINIMUM_ZOOM_FACTOR = 0.1;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Graphics2D imageGraphics;
- protected int index = 0;
- private BufferedImage previewPageImage = null;
- private final PrintController printController;
- private final Printable view;
- protected double zoom = 0.0;
-
- public Preview(final PrintController printController, final Printable view, Dimension size) {
- this.printController = printController;
- this.view = view;
- final PageFormat format = getPageFormat();
- this.zoom = Math.min(size.getHeight() / format.getHeight(), size.getWidth() / format.getWidth());
- resize();
- }
-
- public void changeZoom(final double zoom) {
- this.zoom = Math.max(Preview.MINIMUM_ZOOM_FACTOR, this.zoom * zoom);
- resize();
- }
-
- @Override
- public Dimension getMinimumSize() {
- return getPreferredSize();
- }
-
- private PageFormat getPageFormat() {
- return printController.getPageFormat();
- }
-
- private int getPageHeight(final PageFormat format) {
- return (int) (format.getHeight() * zoom);
- }
-
- public int getPageIndex() {
- return index;
- }
-
- private int getPageWidth(final PageFormat format) {
- return (int) (format.getWidth() * zoom);
- }
-
- public void moveIndex(final int indexStep) {
- final int newIndex = index + indexStep;
- if (newIndex >= 0) {
- index = newIndex;
- previewPageImage = null;
- }
- }
-
- @Override
- public void paint(final Graphics g) {
- try {
- final Graphics2D g2d = (Graphics2D) g;
- final PageFormat format = getPageFormat();
- paintPaper(g, format);
- if (previewPageImage == null) {
- previewPageImage = (BufferedImage) createImage(getPageWidth(format) - 1, getPageHeight(format) - 1);
- imageGraphics = previewPageImage.createGraphics();
- imageGraphics.scale(zoom, zoom);
- if(view instanceof MapView)
- ((MapView)view).preparePrinting();
- while (Printable.NO_SUCH_PAGE == view.print(imageGraphics, format, index) && index > 0) {
- index --;
- }
- if(view instanceof MapView)
- ((MapView)view).endPrinting();
- }
- g2d.drawImage(previewPageImage, 0, 0, this);
- }
- catch (final PrinterException e) {
- LogUtils.severe(e);
- }
- }
-
- protected void paintPaper(final Graphics g, final PageFormat format) {
- g.setColor(Color.white);
- g.fillRect(0, 0, getPageWidth(format), getPageHeight(format));
- g.setColor(Color.black);
- g.drawRect(0, 0, getPageWidth(format) - 1, getPageHeight(format) - 1);
- }
-
- public void resize() {
- final PageFormat pageFormat = getPageFormat();
- int width = getPageWidth(pageFormat);
- int height = getPageHeight(pageFormat);
- setPreferredSize(new Dimension(width, height));
- previewPageImage = null;
- revalidate();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/script/IScriptEditorStarter.java b/freeplane/src/org/freeplane/features/script/IScriptEditorStarter.java
deleted file mode 100644
index efbb8e7..0000000
--- a/freeplane/src/org/freeplane/features/script/IScriptEditorStarter.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.script;
-
-import java.awt.Dimension;
-
-import javax.swing.ComboBoxEditor;
-
-import org.freeplane.core.extension.IExtension;
-
-/**
- * @author Dimitry Polivaev
- * Jul 31, 2011
- */
-public interface IScriptEditorStarter extends IExtension {
- String startEditor(String scriptInput);
- ComboBoxEditor createComboBoxEditor(Dimension dim);
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/styles/AutomaticLayout.java b/freeplane/src/org/freeplane/features/styles/AutomaticLayout.java
deleted file mode 100644
index 034656a..0000000
--- a/freeplane/src/org/freeplane/features/styles/AutomaticLayout.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.freeplane.features.styles;
-
-import org.freeplane.core.extension.IExtension;
-
-public enum AutomaticLayout implements IExtension{
- HEADINGS, ALL
-}
diff --git a/freeplane/src/org/freeplane/features/styles/AutomaticLayoutController.java b/freeplane/src/org/freeplane/features/styles/AutomaticLayoutController.java
deleted file mode 100644
index 0c9a5d6..0000000
--- a/freeplane/src/org/freeplane/features/styles/AutomaticLayoutController.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles;
-
-import java.util.Collection;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.IPropertyHandler;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
- at NodeHookDescriptor(hookName = "accessories/plugins/AutomaticLayout.properties")
-public class AutomaticLayoutController extends PersistentNodeHook implements IExtension{
- /**
- *
- */
- public AutomaticLayoutController() {
- super();
- LogicalStyleController.getController().addStyleGetter(IPropertyHandler.AUTO, new IPropertyHandler<Collection<IStyle>, NodeModel>() {
- public Collection<IStyle> getProperty(NodeModel model, Collection<IStyle> currentValue) {
- AutomaticLayout layout = model.getMap().getRootNode().getExtension(AutomaticLayout.class);
- final IStyle autoStyle = getStyle(model, layout);
- if(autoStyle != null){
- LogicalStyleController.getController().add(model, currentValue, autoStyle);
- }
- return currentValue;
- }
- });
- }
-
- @Override
- protected IExtension createExtension(final NodeModel node, final XMLElement element) {
- if(element == null || ! element.hasAttribute("VALUE"))
- return AutomaticLayout.ALL;
- return super.createExtension(node, element);
- }
-
- private IStyle getStyle(final NodeModel node, AutomaticLayout layout) {
- if(layout == null || node.isLeaf() && ! layout.equals(AutomaticLayout.ALL))
- return null;
- final int depth = node.depth();
- final MapModel map = node.getMap();
- final MapStyleModel extension = MapStyleModel.getExtension(map);
- final String name = depth == 0 ? "AutomaticLayout.level.root" : "AutomaticLayout.level," + depth;
- final NamedObject obj = NamedObject.format(name);
- final IStyle style = StyleFactory.create(obj);
- if (extension.getStyleNode(style) != null) {
- return style;
- }
- return null;
- }
-
- @Override
- protected Class<? extends IExtension> getExtensionClass() {
- return AutomaticLayout.class;
- }
-
- @Override
- protected IExtension toggle(NodeModel node, IExtension extension) {
- extension = super.toggle(node, extension);
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- if(modeController.isUndoAction()){
- return extension;
- }
- LogicalStyleController.getController().refreshMap(node.getMap());
- return extension;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/styles/ConditionalStyleModel.java b/freeplane/src/org/freeplane/features/styles/ConditionalStyleModel.java
deleted file mode 100644
index f89fe41..0000000
--- a/freeplane/src/org/freeplane/features/styles/ConditionalStyleModel.java
+++ /dev/null
@@ -1,258 +0,0 @@
-package org.freeplane.features.styles;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import javax.swing.table.AbstractTableModel;
-import javax.swing.table.TableModel;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class ConditionalStyleModel implements IExtension, Iterable<ConditionalStyleModel.Item>{
- public class Item{
- private ASelectableCondition condition;
- private IStyle style;
- private boolean isActive;
- private boolean isLast;
- private Item(boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast) {
- super();
- this.isActive = isActive;
- this.condition = condition;
- this.style = style;
- this.setLast(isLast);
- }
- public void setCondition(ASelectableCondition condition) {
- this.condition = condition;
- }
- public ASelectableCondition getCondition() {
- return condition;
- }
- public void setStyle(IStyle style) {
- this.style = style;
- }
- public IStyle getStyle() {
- return style;
- }
- public void setActive(boolean isActive) {
- this.isActive = isActive;
- }
- public boolean isActive() {
- return isActive;
- }
- public void setLast(boolean isLast) {
- this.isLast = isLast;
- }
- public boolean isLast() {
- return isLast;
- }
-
- public void toXml(XMLElement conditionalStylesRoot)
- {
- final XMLElement itemElement = conditionalStylesRoot.createElement("conditional_style");
- conditionalStylesRoot.addChild(itemElement);
- itemElement.setAttribute("ACTIVE", Boolean.toString(isActive()));
- final IStyle style = getStyle();
- if (style instanceof StyleNamedObject) {
- final String referencedStyle = ((StyleNamedObject)style).getObject().toString();
- itemElement.setAttribute("LOCALIZED_STYLE_REF", referencedStyle);
- }
- else {
- final String referencedStyle = style.toString();
- itemElement.setAttribute("STYLE_REF", referencedStyle);
- }
- itemElement.setAttribute("LAST", Boolean.toString(isLast()));
- if(condition != null)
- condition.toXml(itemElement);
-
- }
-
- }
- private ArrayList<Item> styles;
- public ConditionalStyleModel() {
- super();
- this.styles = new ArrayList<Item>();
- }
- private boolean recursiveCall;
-
- public Collection<IStyle> getStyles(NodeModel node){
- if(recursiveCall){
- return Collections.emptyList();
- }
- try{
- recursiveCall = true;
- Collection<IStyle> matchingStyles = new LinkedHashSet<IStyle>();
- for(Item item : styles){
- final ASelectableCondition condition = item.getCondition();
- if( item.isActive() && (condition == null || condition.checkNode(node))){
- matchingStyles.add(item.style);
- if(item.isLast()){
- break;
- }
- }
- }
- return matchingStyles;
- }
- finally{
- recursiveCall = false;
- }
- }
-
- void addCondition(boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast){
- styles.add(new Item(isActive, condition, style, isLast));
- if(table == null){
- return;
- }
- int index = styles.size() - 1;
- table.fireTableRowsInserted(index, index);
- }
-
- void insertCondition(int index, boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast){
- styles.add(index, new Item(isActive, condition, style, isLast));
- if(table == null){
- return;
- }
- table.fireTableRowsInserted(index, index);
- }
-
- Item removeCondition(int index){
- final Item item = styles.remove(index);
- if(table == null){
- return item;
- }
- table.fireTableRowsDeleted(index, index);
- return item;
- }
-
- void swapConditions(int index1, int index2){
- final Item item1 = styles.get(index1);
- final Item item2 = styles.get(index2);
- styles.set(index1, item2);
- styles.set(index2, item1);
- if(table == null){
- return;
- }
- table.fireTableRowsUpdated(index1, index1);
- table.fireTableRowsUpdated(index2, index2);
- }
-
- void moveUp(int index){
- if(index == 0){
- return;
- }
- swapConditions(index, index - 1);
- }
-
- void moveDown(int index){
- if(index == styles.size() - 1){
- return;
- }
- swapConditions(index, index + 1);
- }
-
- void clear(){
- styles.clear();
- }
-
- public Iterator<Item> iterator() {
- return styles.iterator();
- }
- private AbstractTableModel table;
- public TableModel asTableModel(){
- if(table != null){
- return table;
- }
- table = new AbstractTableModel() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public Object getValueAt(int rowIndex, int columnIndex) {
- Item item = styles.get(rowIndex);
- switch(columnIndex){
- case 0:
- return item.isActive();
- case 1:
- return item.getCondition();
- case 2:
- return item.getStyle();
- case 3:
- return item.isLast();
- default:
- throw new ArrayIndexOutOfBoundsException();
- }
- }
-
- public int getRowCount() {
- return styles.size();
- }
-
- public int getColumnCount() {
- return 4;
- }
-
-
-
- @Override
- public Class<?> getColumnClass(int columnIndex) {
- switch(columnIndex){
- case 0:
- case 3: return Boolean.class;
- case 1: return ASelectableCondition.class;
- }
- return super.getColumnClass(columnIndex);
- }
-
-
-
- @Override
- public String getColumnName(int column) {
- switch(column){
- case 0: return TextUtils.getText("active");
- case 1: return TextUtils.getText("condition");
- case 2: return TextUtils.getText("style");
- case 3: return TextUtils.getText("stop_processing");
- }
- return super.getColumnName(column);
- }
-
- @Override
- public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
- Item item = styles.get(rowIndex);
- switch(columnIndex){
- case 0:
- item.setActive((Boolean) aValue);
- break;
- case 1:
- item.setCondition((ASelectableCondition) aValue);
- break;
- case 2:
- item.setStyle((IStyle) aValue);
- break;
- case 3:
- item.setLast((Boolean) aValue);
- break;
- default:
- throw new ArrayIndexOutOfBoundsException();
- }
- fireTableCellUpdated(rowIndex, columnIndex);
- }
-
- @Override
- public boolean isCellEditable(int rowIndex, int columnIndex) {
- return true;
- }
- };
- return table;
- }
-
- public int getStyleCount() {
- return styles.size();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/LogicalStyleController.java b/freeplane/src/org/freeplane/features/styles/LogicalStyleController.java
deleted file mode 100644
index 3691fc7..0000000
--- a/freeplane/src/org/freeplane/features/styles/LogicalStyleController.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles;
-
-import java.awt.Component;
-import java.awt.EventQueue;
-import java.lang.ref.WeakReference;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.Map;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IAttributeWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.ITooltipProvider;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeBuilder;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.CombinedPropertyChain;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.IPropertyHandler;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.ConditionalStyleModel.Item;
-
-/**
- * @author Dimitry Polivaev
- * 28.09.2009
- */
-public class LogicalStyleController implements IExtension {
-// final private ModeController modeController;
-
- private static final int STYLE_TOOLTIP = 0;
- private WeakReference<NodeModel> cachedNode;
- private Collection<IStyle> cachedStyle;
- final private CombinedPropertyChain<Collection<IStyle>, NodeModel> styleHandlers;
-
- public LogicalStyleController(ModeController modeController) {
-// this.modeController = modeController;
- styleHandlers = new CombinedPropertyChain<Collection<IStyle>, NodeModel>(false);
- createBuilder();
- registerChangeListener();
- addStyleGetter(IPropertyHandler.NODE, new IPropertyHandler<Collection<IStyle>, NodeModel>() {
- public Collection<IStyle> getProperty(NodeModel node, Collection<IStyle> currentValue) {
- final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
- add(node, styleModel, currentValue, new StyleNode(node));
- return currentValue;
- }
- });
- addStyleGetter(IPropertyHandler.STYLE, new IPropertyHandler<Collection<IStyle>, NodeModel>() {
- public Collection<IStyle> getProperty(NodeModel node, Collection<IStyle> currentValue) {
- IStyle style = LogicalStyleModel.getStyle(node);
- if(style != null){
- add(node, currentValue, style);
- }
- final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
- Collection<IStyle> condStyles = styleModel.getConditionalStyleModel().getStyles(node);
- clearCache();
- addAll(node, styleModel, currentValue, condStyles);
- return currentValue;
- }
- });
- addStyleGetter(IPropertyHandler.DEFAULT, new IPropertyHandler<Collection<IStyle>, NodeModel>() {
- public Collection<IStyle> getProperty(NodeModel node, Collection<IStyle> currentValue) {
- add(node, currentValue, MapStyleModel.DEFAULT_STYLE);
- return currentValue;
- }
- });
- modeController.addToolTipProvider(STYLE_TOOLTIP, new ITooltipProvider() {
- public String getTooltip(ModeController modeController, NodeModel node, Component view) {
- if(!ResourceController.getResourceController().getBooleanProperty("show_styles_in_tooltip"))
- return null;
- final Collection<IStyle> styles = getStyles(node);
- if(styles.size() > 0)
- styles.remove(styles.iterator().next());
- final String label = TextUtils.getText("node_styles");
- return HtmlUtils.plainToHTML(label + ": " + getStyleNames(styles, ", "));
- }
- });
- }
-
- protected Collection<IStyle> getResursively(NodeModel node, Collection<IStyle> collection) {
- final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
- Collection<IStyle> set = new LinkedHashSet<IStyle>();
- addAll(node, styleModel, set, collection);
- return set;
- }
-
- protected void addAll(NodeModel node, MapStyleModel styleModel, Collection<IStyle> currentValue, Collection<IStyle> collection) {
- for(IStyle styleKey : collection){
- add(node, styleModel, currentValue, styleKey);
- }
- }
-
- public void add(NodeModel node, Collection<IStyle> currentValue, IStyle style) {
- final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
- add(node, styleModel, currentValue, style);
- }
-
- protected void add(NodeModel node, MapStyleModel styleModel, Collection<IStyle> currentValue, IStyle styleKey) {
- if(!currentValue.add(styleKey)){
- return;
- }
- final NodeModel styleNode = styleModel.getStyleNode(styleKey);
- if (styleNode == null) {
- return;
- }
- if(styleKey instanceof StyleNode){
- IStyle style = LogicalStyleModel.getStyle(styleNode);
- if(style != null){
- add(node, styleModel, currentValue, style);
- }
- }
- final ConditionalStyleModel conditionalStyleModel = (ConditionalStyleModel) styleNode.getExtension(ConditionalStyleModel.class);
- if(conditionalStyleModel == null)
- return;
- Collection<IStyle> styles = conditionalStyleModel.getStyles(node);
- cachedNode = null;
- addAll(node, styleModel, currentValue, styles);
- }
-
- private void registerChangeListener() {
- ModeController modeController = Controller.getCurrentModeController();
- final MapController mapController = modeController.getMapController();
- mapController.addMapChangeListener(new IMapChangeListener() {
- public void onPreNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- clearCache();
- }
-
- public void onPreNodeDelete(NodeModel oldParent, NodeModel selectedNode, int index) {
- clearCache();
- }
-
- public void onNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- clearCache();
- }
-
- public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
- clearCache();
- }
-
- public void onNodeDeleted(NodeModel parent, NodeModel child, int index) {
- clearCache();
- }
-
- public void mapChanged(MapChangeEvent event) {
- clearCache();
- }
- });
- mapController.addNodeChangeListener(new INodeChangeListener() {
- public void nodeChanged(NodeChangeEvent event) {
- clearCache();
- }
- });
-
- }
-
- private void createBuilder() {
- ModeController modeController = Controller.getCurrentModeController();
- final MapController mapController = modeController.getMapController();
- final ReadManager readManager = mapController.getReadManager();
- readManager.addAttributeHandler(NodeBuilder.XML_NODE, "STYLE_REF", new IAttributeHandler() {
- public void setAttribute(final Object node, final String value) {
- final LogicalStyleModel extension = LogicalStyleModel.createExtension((NodeModel) node);
- extension.setStyle(StyleFactory.create(value));
- }
- });
- readManager.addAttributeHandler(NodeBuilder.XML_NODE, "LOCALIZED_STYLE_REF", new IAttributeHandler() {
- public void setAttribute(final Object node, final String value) {
- final LogicalStyleModel extension = LogicalStyleModel.createExtension((NodeModel) node);
- extension.setStyle(StyleFactory.create(NamedObject.format(value)));
- }
- });
- final WriteManager writeManager = mapController.getWriteManager();
- writeManager.addAttributeWriter(NodeBuilder.XML_NODE, new IAttributeWriter() {
- public void writeAttributes(final ITreeWriter writer, final Object node, final String tag) {
- final LogicalStyleModel extension = LogicalStyleModel.getExtension((NodeModel) node);
- if (extension == null) {
- return;
- }
- final IStyle style = extension.getStyle();
- if (style == null) {
- return;
- }
- final String value = StyleNamedObject.toKeyString(style);
- if (style instanceof StyleNamedObject) {
- writer.addAttribute("LOCALIZED_STYLE_REF", value);
- }
- else {
- writer.addAttribute("STYLE_REF", value);
- }
- }
- });
- }
-
- public static void install( final LogicalStyleController logicalStyleController) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addExtension(LogicalStyleController.class, logicalStyleController);
- }
-
- public static LogicalStyleController getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- return getController(modeController);
- }
-
- public static LogicalStyleController getController(ModeController modeController) {
- return (LogicalStyleController) modeController.getExtension(LogicalStyleController.class);
- }
- public void refreshMap(final MapModel map) {
- final IActor actor = new IActor() {
- public void undo() {
- refreshMapLater(map);
- }
-
- public String getDescription() {
- return "refreshMap";
- }
-
- public void act() {
- refreshMapLater(map);
- }
- };
- Controller.getCurrentModeController().execute(actor, map);
- }
-
- private static Map<MapModel, Integer> mapsToRefresh = new HashMap<MapModel, Integer>();
-
- private void refreshMapLater(final MapModel map) {
- final Integer count = mapsToRefresh.get(map);
- if (count == null) {
- mapsToRefresh.put(map, 0);
- }
- else {
- mapsToRefresh.put(map, count + 1);
- }
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- final Integer count = mapsToRefresh.get(map);
- if (count > 0) {
- mapsToRefresh.put(map, count - 1);
- return;
- }
- mapsToRefresh.remove(map);
- final MapStyleModel extension = MapStyleModel.getExtension(map);
- extension.refreshStyles();
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- mapController.fireMapChanged(
- new MapChangeEvent(this, map, MapStyle.MAP_STYLES, null, null));
- }
- });
- }
-
- public IStyle getFirstStyle(final NodeModel node){
- final Collection<IStyle> styles = getStyles(node);
- boolean found = false;
- for(IStyle style:styles){
- if(found){
- return style;
- }
- if((style instanceof StyleNode)){
- found = true;
- }
- }
- return MapStyleModel.DEFAULT_STYLE;
- }
- public Collection<IStyle> getStyles(final NodeModel node) {
- if(cachedNode != null && node.equals(cachedNode.get())){
- return cachedStyle;
- }
- cachedStyle = null;
- cachedStyle = styleHandlers.getProperty(node, new LinkedHashSet<IStyle>());
- cachedNode = new WeakReference<NodeModel>(node);
- return cachedStyle;
- }
-
- public void moveConditionalStyleDown(final ConditionalStyleModel conditionalStyleModel, int index) {
- conditionalStyleModel.moveDown(index);
- }
-
- public void moveConditionalStyleUp(final ConditionalStyleModel conditionalStyleModel, int index) {
- conditionalStyleModel.moveUp(index);
- }
-
- public void addConditionalStyle(final ConditionalStyleModel conditionalStyleModel, boolean isActive,
- ASelectableCondition condition, IStyle style, boolean isLast) {
- conditionalStyleModel.addCondition(isActive, condition, style, isLast);
- }
-
- public void insertConditionalStyle(final ConditionalStyleModel conditionalStyleModel, int index, boolean isActive,
- ASelectableCondition condition, IStyle style, boolean isLast) {
- conditionalStyleModel.insertCondition(index, isActive, condition, style, isLast);
- }
-
- public Item removeConditionalStyle(final ConditionalStyleModel conditionalStyleModel, int index) {
- return conditionalStyleModel.removeCondition(index);
- }
-
- private void clearCache() {
- cachedStyle = null;
- cachedNode = null;
- }
-
- public IPropertyHandler<Collection<IStyle>, NodeModel> addStyleGetter(
- final Integer key,
- final IPropertyHandler<Collection<IStyle>, NodeModel> getter) {
- return styleHandlers.addGetter(key, getter);
- }
-
- public IPropertyHandler<Collection<IStyle>, NodeModel> removeStyleGetter(
- final Integer key,
- final IPropertyHandler<Collection<IStyle>, NodeModel> getter) {
- return styleHandlers.addGetter(key, getter);
- }
-
- public String getStyleNames(final Collection<IStyle> styles, String separator) {
- StringBuilder sb = new StringBuilder();
- int i = 0;
- for(IStyle style :styles){
- if(i > 0)
- sb.append(separator);
- sb.append(style.toString());
- i++;
- }
- return sb.toString();
- }
-
- public Collection<IStyle> getConditionalMapStyles(final NodeModel node) {
- final MapStyleModel styleModel = MapStyleModel.getExtension(node.getMap());
- Collection<IStyle> condStyles = styleModel.getConditionalStyleModel().getStyles(node);
- clearCache();
- return getResursively(node, condStyles);
- }
-
- public Collection<IStyle> getConditionalNodeStyles(final NodeModel node) {
- final Collection<IStyle> condStyles = new LinkedHashSet<IStyle>();
- IStyle style = LogicalStyleModel.getStyle(node);
- if(style != null){
- condStyles.add(style);
- }
-
- final ConditionalStyleModel conditionalStyleModel = (ConditionalStyleModel) node.getExtension(ConditionalStyleModel.class);
- if(conditionalStyleModel != null) {
- Collection<IStyle> styles = conditionalStyleModel.getStyles(node);
- clearCache();
- condStyles.addAll(styles);
- }
- final Collection<IStyle> all = getResursively(node, condStyles);
- if(style != null){
- all.remove(style);
- }
- return all;
- }
-
- public String getNodeStyleNames(NodeModel node, String separator) {
- return getStyleNames(getConditionalNodeStyles(node), separator);
- }
-
- public String getMapStyleNames(NodeModel node, String separator) {
- return getStyleNames(getConditionalMapStyles(node), separator);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/LogicalStyleFilterController.java b/freeplane/src/org/freeplane/features/styles/LogicalStyleFilterController.java
deleted file mode 100644
index a7f1ec1..0000000
--- a/freeplane/src/org/freeplane/features/styles/LogicalStyleFilterController.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.freeplane.features.styles;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class LogicalStyleFilterController implements IElementaryConditionController {
- static final String FILTER_STYLE = "filter_style";
-// // private final Controller controller;
-
- public LogicalStyleFilterController() {
- super();
-// this.controller = controller;
- }
-
- public boolean canEditValues(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean canHandle(final Object selectedItem) {
- if (!(selectedItem instanceof NamedObject)) {
- return false;
- }
- final NamedObject namedObject = (NamedObject) selectedItem;
- return namedObject.objectEquals(LogicalStyleFilterController.FILTER_STYLE);
- }
-
- public boolean canSelectValues(final Object property, final NamedObject simpleCond) {
- return true;
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCond,
- final Object value, final boolean matchCase, final boolean matchApproximately) {
- if(simpleCond.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO))
- return new StyleCondition((IStyle) value);
- if(simpleCond.objectEquals(ConditionFactory.FILTER_CONTAINS))
- return new StyleContainsCondition((IStyle) value);
- return null;
- }
-
- public ComboBoxModel getConditionsForProperty(final Object property) {
- return new DefaultComboBoxModel(getStyleConditionNames());
- }
-
- private Object[] getStyleConditionNames() {
- return new NamedObject[] { TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO) ,
- TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS) };
- }
-
- public ListModel getFilteredProperties() {
- final DefaultListModel list = new DefaultListModel();
- list.addElement(TextUtils.createTranslatedString(FILTER_STYLE));
- return list;
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- return null;
- }
-
- public ComboBoxModel getValuesForProperty(final Object property, NamedObject simpleCond) {
- final MapStyleModel mapStyles = MapStyleModel.getExtension(Controller.getCurrentController().getMap());
- return mapStyles.getStylesAsComboBoxModel();
- }
-
- public boolean isCaseDependent(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean supportsApproximateMatching(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- if (element.getName().equalsIgnoreCase(StyleCondition.NAME)) {
- return StyleCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(StyleContainsCondition.NAME)) {
- return StyleContainsCondition.load(element);
- }
- return null;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- return null;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/MapStyle.java b/freeplane/src/org/freeplane/features/styles/MapStyle.java
deleted file mode 100644
index b06faaa..0000000
--- a/freeplane/src/org/freeplane/features/styles/MapStyle.java
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles;
-
-import java.awt.Color;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.net.URL;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Collections;
-import java.util.Properties;
-import java.util.Vector;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IElementContentHandler;
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.io.IElementHandler;
-import org.freeplane.core.io.IExtensionElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.map.IMapLifeCycleListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapWriter;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.styles.ConditionalStyleModel.Item;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * Mar 9, 2009
- */
- at NodeHookDescriptor(hookName = "MapStyle")
-public class MapStyle extends PersistentNodeHook implements IExtension, IMapLifeCycleListener {
- private static final String NODE_CONDITIONAL_STYLES = "NodeConditionalStyles";
- public static final String RESOURCES_BACKGROUND_COLOR = "standardbackgroundcolor";
- public static final String MAP_STYLES = "MAP_STYLES";
-
- public static void install(boolean persistent){
- new MapStyle(persistent);
- }
-
- protected MapStyle( final boolean persistent) {
- super();
- ModeController modeController = Controller.getCurrentModeController();
- if (persistent) {
- final MapController mapController = modeController.getMapController();
- mapController.getWriteManager().addExtensionElementWriter(getExtensionClass(),
- new XmlWriter());
- mapController.getReadManager().addElementHandler("conditional_styles", new IElementDOMHandler() {
- public Object createElement(Object parent, String tag, XMLElement attributes) {
- return parent;
- }
-
- public void endElement(Object parent, String tag, Object element, XMLElement dom) {
- final NodeModel node = (NodeModel) parent;
- final MapStyleModel mapStyleModel = MapStyleModel.getExtension(node);
- if(mapStyleModel != null)
- loadConditionalStyles(mapStyleModel.getConditionalStyleModel(), dom);
- }
- });
-
- mapController.getWriteManager().addExtensionElementWriter(ConditionalStyleModel.class,
- new IExtensionElementWriter() {
- public void writeContent(ITreeWriter writer, Object element, IExtension extension) throws IOException {
- final ConditionalStyleModel conditionalStyleModel = (ConditionalStyleModel) extension;
- if (conditionalStyleModel.getStyleCount() == 0)
- return;
- final XMLElement hook = new XMLElement("hook");
- hook.setAttribute("NAME", NODE_CONDITIONAL_STYLES);
- saveConditionalStyles(conditionalStyleModel, hook, false);
- writer.addElement(null, hook);
- }
- });
-
- mapController.getReadManager().addElementHandler("hook", new IElementDOMHandler() {
- public Object createElement(Object parent, String tag, XMLElement attributes) {
- if (attributes == null
- || !NODE_CONDITIONAL_STYLES.equals(attributes.getAttribute("NAME", null))) {
- return null;
- }
- final ConditionalStyleModel conditionalStyleModel = new ConditionalStyleModel();
- ((NodeModel)parent).addExtension(conditionalStyleModel);
- return conditionalStyleModel;
- }
-
- public void endElement(Object parent, String tag, Object element, XMLElement dom) {
- loadConditionalStyles((ConditionalStyleModel) element, dom);
- }
- });
- mapController.getReadManager().addElementHandler("map_styles", new IElementContentHandler() {
- public Object createElement(Object parent, String tag, XMLElement attributes) {
- return parent;
- }
- public void endElement(final Object parent, final String tag, final Object userObject,
- final XMLElement attributes, final String content) {
- // bugfix
- if(isContentEmpty(content))
- return;
- final NodeModel node = (NodeModel) userObject;
- final MapStyleModel mapStyleModel = MapStyleModel.getExtension(node);
- if (mapStyleModel == null) {
- return;
- }
- final MapModel map = node.getMap();
- mapStyleModel.createStyleMap(map, mapStyleModel, content);
- map.getIconRegistry().addIcons(mapStyleModel.getStyleMap());
- }
- private boolean isContentEmpty(final String content) {
- return content.indexOf('<') == -1;
- }
-
- }
- );
-
- }
- modeController.getMapController().addMapLifeCycleListener(this);
- final MapController mapController = modeController.getMapController();
- mapController.addMapLifeCycleListener(this);
- }
-
- protected class XmlWriter implements IExtensionElementWriter {
- public void writeContent(final ITreeWriter writer, final Object object, final IExtension extension)
- throws IOException {
- final MapStyleModel mapStyleModel = (MapStyleModel) extension;
- final MapModel styleMap = mapStyleModel.getStyleMap();
- final String el = System.getProperty("line.separator");
- if (styleMap == null) {
- return;
- }
- final MapWriter mapWriter = Controller.getCurrentModeController().getMapController().getMapWriter();
- final StringWriter sw = new StringWriter();
- sw.append(el);
- sw.append("<map_styles>");
- sw.append(el);
- final NodeModel rootNode = styleMap.getRootNode();
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- try {
- mapWriter.writeNodeAsXml(sw, rootNode, Mode.STYLE, true, true, forceFormatting);
- }
- catch (final IOException e) {
- e.printStackTrace();
- }
- sw.append("</map_styles>");
- sw.append(el);
- final XMLElement element = new XMLElement("hook");
- saveExtension(extension, element);
- writer.addElement(sw.toString(), element);
- }
- }
-
- @Override
- protected XmlWriter createXmlWriter() {
- return null;
- }
-
- protected class MyXmlReader extends XmlReader{
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (null == super.createElement(parent, tag, attributes)){
- return null;
- }
- super.endElement(parent, tag, parent, attributes);
- return parent;
- }
-
- @Override
- public void endElement(Object parent, String tag, Object userObject, XMLElement xml) {
- // do nothing for not root nodes
- final XMLElement parentNodeElement = xml.getParent().getParent();
- if (parentNodeElement == null || !parentNodeElement.getName().equals("map")) {
- return;
- }
- NodeModel node = (NodeModel) userObject;
- loadMapStyleProperties(MapStyleModel.getExtension(node), xml);
- }
-
- private void loadMapStyleProperties(MapStyleModel model, XMLElement xml) {
- final Vector<XMLElement> propertyXml = xml.getChildrenNamed("properties");
- if(propertyXml != null && propertyXml.size() >= 1){
- final Map<String, String> properties = model.getProperties();
- final Properties attributes = propertyXml.get(0).getAttributes();
- for(Entry<Object, Object> attribute:attributes.entrySet()){
- properties.put(attribute.getKey().toString(), attribute.getValue().toString());
- }
- }
- }
-
- }
-
- @Override
- protected IElementHandler createXmlReader() {
- return new MyXmlReader();
- }
-
- @Override
- protected IExtension createExtension(final NodeModel node, final XMLElement element) {
- final MapStyleModel model = new MapStyleModel();
- final String colorString = element.getAttribute("background", null);
- final Color bgColor;
- if (colorString != null) {
- bgColor = ColorUtils.stringToColor(colorString);
- }
- else {
- bgColor = null;
- }
- model.setBackgroundColor(bgColor);
- final String zoomString = element.getAttribute("zoom", null);
- if (zoomString != null) {
- final float zoom = Float.valueOf(zoomString);
- model.setZoom(zoom);
- }
- final String layoutString = element.getAttribute("layout", null);
- try {
- if (layoutString != null) {
- final MapViewLayout layout = MapViewLayout.valueOf(layoutString);
- model.setMapViewLayout(layout);
- }
- }
- catch (final Exception e) {
- }
- final String maxNodeWidthString = element.getAttribute("max_node_width", null);
- final String minNodeWidthString = element.getAttribute("min_node_width",null);
- try {
- if (maxNodeWidthString != null) {
- final int maxNodeWidth = Integer.valueOf(maxNodeWidthString);
- model.setMaxNodeWidth(maxNodeWidth);
- }
- if (minNodeWidthString != null) {
- final int minNodeWidth = Integer.valueOf(minNodeWidthString);
- model.setMinNodeWidth(minNodeWidth);
- }
- }
- catch (final Exception e) {
- }
- return model;
- }
-
- private void loadConditionalStyles(ConditionalStyleModel conditionalStyleModel, XMLElement conditionalStylesRoot) {
- final ConditionFactory conditionFactory = FilterController.getCurrentFilterController().getConditionFactory();
- final Vector<XMLElement> styleElements = conditionalStylesRoot.getChildrenNamed("conditional_style");
- for(XMLElement styleElement : styleElements){
- final boolean isActive = Boolean.valueOf(styleElement.getAttribute("ACTIVE", "false"));
- final boolean isLast = Boolean.valueOf(styleElement.getAttribute("LAST", "false"));
- String styleText = styleElement.getAttribute("LOCALIZED_STYLE_REF", null);
- final IStyle style;
- if(styleText != null){
- style = StyleFactory.create(NamedObject.format((String) styleText));
- }
- else {
- style = StyleFactory.create(styleElement.getAttribute("STYLE_REF", null));
- }
- final ASelectableCondition condition;
- if(styleElement.getChildrenCount() == 1){
- final XMLElement conditionElement = styleElement.getChildAtIndex(0);
- try {
- condition = conditionFactory.loadCondition(conditionElement);
- }
- catch (Exception e) {
- e.printStackTrace();
- continue;
- }
- }
- else{
- condition = null;
- }
- conditionalStyleModel.addCondition(isActive, condition, style, isLast);
- }
- }
- private void saveConditionalStyles(ConditionalStyleModel conditionalStyleModel, XMLElement parent, boolean createRoot) {
- final int styleCount = conditionalStyleModel.getStyleCount();
- if(styleCount == 0){
- return;
- }
- final XMLElement conditionalStylesRoot;
- if(createRoot){
- conditionalStylesRoot = parent.createElement("conditional_styles");
- parent.addChild(conditionalStylesRoot);
- }
- else
- conditionalStylesRoot = parent;
- for(final Item item : conditionalStyleModel){
- item.toXml(conditionalStylesRoot);
- }
-
- }
-
- public Color getBackground(final MapModel map) {
- final IExtension extension = map.getRootNode().getExtension(MapStyleModel.class);
- final Color backgroundColor = extension != null ? ((MapStyleModel) extension).getBackgroundColor() : null;
- if (backgroundColor != null) {
- return backgroundColor;
- }
- final String stdcolor = ResourceController.getResourceController().getProperty(
- MapStyle.RESOURCES_BACKGROUND_COLOR);
- final Color standardMapBackgroundColor = ColorUtils.stringToColor(stdcolor);
- return standardMapBackgroundColor;
- }
-
- @Override
- protected Class<MapStyleModel> getExtensionClass() {
- return MapStyleModel.class;
- }
-
- public void onCreate(final MapModel map) {
- final NodeModel rootNode = map.getRootNode();
- final MapStyleModel mapStyleModel = MapStyleModel.getExtension(rootNode);
- if (mapStyleModel != null && mapStyleModel.getStyleMap() != null) {
- return;
- }
- createDefaultStyleMap(map);
- }
-
- private void createDefaultStyleMap(final MapModel map) {
- UrlManager loader = UrlManager.getController();
- final File file = loader.defaultTemplateFile();
- if (file != null) {
- try {
- MapModel styleMapContainer = new MapModel();
- loader.load(Compat.fileToUrl(file), styleMapContainer);
- if (null != MapStyleModel.getExtension(styleMapContainer)){
- moveStyle(styleMapContainer, map, false);
- return;
- }
- }
- catch (Exception e) {
- LogUtils.warn(e);
- UITools.errorMessage(TextUtils.format("error_in_template", file));
- }
- };
- MapModel styleMapContainer = new MapModel();
- try {
- loader.load(ResourceController.getResourceController().getResource("/styles/viewer_standard.mm"), styleMapContainer);
- moveStyle(styleMapContainer, map, false);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
-
- private void moveStyle(final MapModel sourceMap, final MapModel targetMap, boolean overwrite) {
- final MapStyleModel source = (MapStyleModel) sourceMap.getRootNode().removeExtension(MapStyleModel.class);
- if(source == null)
- return;
- final IExtension undoHandler = targetMap.getExtension(IUndoHandler.class);
- source.getStyleMap().putExtension(IUndoHandler.class, undoHandler);
- final NodeModel targetRoot = targetMap.getRootNode();
- final MapStyleModel target = MapStyleModel.getExtension(targetRoot);
- if(target == null){
- targetRoot.addExtension(source);
- }
- else{
- target.copyFrom(source, overwrite);
- }
- }
-
-
- @Override
- protected HookAction createHookAction() {
- return null;
- }
-
- public void copyStyle(final URL source, final MapModel targetMap, boolean undoable) {
- final MapModel styleMapContainer = new MapModel();
- final IExtension oldStyleModel = targetMap.getRootNode().removeExtension(MapStyleModel.class);
- UrlManager.getController().loadCatchExceptions(source, styleMapContainer);
- onCreate(styleMapContainer);
- moveStyle(styleMapContainer, targetMap, true);
- LogicalStyleController.getController().refreshMap(targetMap);
- if(! undoable){
- return;
- }
- final IExtension newStyleModel = targetMap.getRootNode().getExtension(MapStyleModel.class);
- IActor actor = new IActor() {
- public void undo() {
- targetMap.getRootNode().putExtension(oldStyleModel);
- }
-
- public String getDescription() {
- return "moveStyle";
- }
-
- public void act() {
- targetMap.getRootNode().putExtension(newStyleModel);
- }
- };
- Controller.getCurrentModeController().execute(actor, targetMap);
- }
-
- public void onRemove(final MapModel map) {
- }
-
- @Override
- protected void saveExtension(final IExtension extension, final XMLElement element) {
- final MapStyleModel mapStyleModel = (MapStyleModel) extension;
- super.saveExtension(extension, element);
- final Color backgroundColor = mapStyleModel.getBackgroundColor();
- if (backgroundColor != null) {
- element.setAttribute("background", ColorUtils.colorToString(backgroundColor));
- }
- final float zoom = mapStyleModel.getZoom();
- if (zoom != 1f) {
- element.setAttribute("zoom", Float.toString(zoom));
- }
- final MapViewLayout layout = mapStyleModel.getMapViewLayout();
- if (!layout.equals(MapViewLayout.MAP)) {
- element.setAttribute("layout", layout.toString());
- }
- saveConditionalStyles(mapStyleModel.getConditionalStyleModel(), element, true);
- saveProperties(mapStyleModel.getProperties(), element);
- }
-
- private void saveProperties(Map<String, String> properties, XMLElement element) {
- if(properties.isEmpty()){
- return;
- }
- final XMLElement xmlElement = new XMLElement("properties");
- for (Entry<String, String> entry: properties.entrySet()){
- xmlElement.setAttribute(entry.getKey(), entry.getValue());
- }
- element.addChild(xmlElement);
- }
-
- public void setZoom(final MapModel map, final float zoom) {
- final MapStyleModel mapStyleModel = MapStyleModel.getExtension(map);
- if (zoom == mapStyleModel.getZoom()) {
- return;
- }
- mapStyleModel.setZoom(zoom);
- Controller.getCurrentModeController().getMapController().setSaved(map, false);
- }
-
-
- public void setMapViewLayout(final MapModel map, final MapViewLayout layout) {
- final MapStyleModel mapStyleModel = MapStyleModel.getExtension(map);
- if (layout.equals(mapStyleModel.getMapViewLayout())) {
- return;
- }
- mapStyleModel.setMapViewLayout(layout);
- Controller.getCurrentModeController().getMapController().setSaved(map, false);
- }
-
- public void setBackgroundColor(final MapStyleModel model, final Color actionColor) {
- final Color oldColor = model.getBackgroundColor();
- if (actionColor == oldColor || actionColor != null && actionColor.equals(oldColor)) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- model.setBackgroundColor(actionColor);
- Controller.getCurrentModeController().getMapController().fireMapChanged(
- new MapChangeEvent(MapStyle.this, Controller.getCurrentController().getMap(), MapStyle.RESOURCES_BACKGROUND_COLOR,
- oldColor, actionColor));
- }
-
- public String getDescription() {
- return "MapStyle.setBackgroundColor";
- }
-
- public void undo() {
- model.setBackgroundColor(oldColor);
- Controller.getCurrentModeController().getMapController().fireMapChanged(
- new MapChangeEvent(MapStyle.this, Controller.getCurrentController().getMap(), MapStyle.RESOURCES_BACKGROUND_COLOR,
- actionColor, oldColor));
- }
- };
- Controller.getCurrentModeController().execute(actor, Controller.getCurrentController().getMap());
- }
-
- public static MapStyle getController(final ModeController modeController) {
- return (MapStyle) modeController.getExtension(MapStyle.class);
- }
-
- public static MapStyle getController() {
- return (MapStyle) getController(Controller.getCurrentModeController());
- }
-
- public void setProperty(final MapModel model, final String key, final String newValue) {
- final MapStyleModel styleModel = MapStyleModel.getExtension(model);
- final String oldValue = styleModel.getProperty(key);
- if(oldValue == newValue || oldValue != null && oldValue.equals(newValue))
- return;
- IActor actor = new IActor() {
- public void undo() {
- setPropertyWithoutUndo(model, key, oldValue);
- }
-
- public String getDescription() {
- return "set map style property";
- }
-
- public void act() {
- setPropertyWithoutUndo(model, key, newValue);
- }
-
- private void setPropertyWithoutUndo(final MapModel model, final String key, final String newValue) {
- styleModel.setProperty(key, newValue);
- Controller.getCurrentModeController().getMapController().fireMapChanged(
- new MapChangeEvent(MapStyle.this, model, key, oldValue, newValue));
- }
- };
- Controller.getCurrentModeController().execute(actor, model);
- }
-
- public String getPropertySetDefault(final MapModel model, final String key) {
- final MapStyleModel styleModel = MapStyleModel.getExtension(model);
- final String oldValue = styleModel.getProperty(key);
- if(oldValue != null){
- return oldValue;
- }
- final String value = ResourceController.getResourceController().getProperty(key);
- styleModel.setProperty(key, value);
- return value;
- }
-
- public String getProperty(final MapModel model, final String key) {
- return MapStyleModel.getExtension(model).getProperty(key);
- }
-
- public Map<String, String> getPropertiesReadOnly(final MapModel model) {
- return Collections.unmodifiableMap(MapStyleModel.getExtension(model).getProperties());
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/MapStyleModel.java b/freeplane/src/org/freeplane/features/styles/MapStyleModel.java
deleted file mode 100644
index a67e850..0000000
--- a/freeplane/src/org/freeplane/features/styles/MapStyleModel.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles;
-
-import java.awt.Color;
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.event.ListDataListener;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.features.cloud.CloudModel;
-import org.freeplane.features.cloud.CloudModel.Shape;
-import org.freeplane.features.edge.EdgeModel;
-import org.freeplane.features.edge.EdgeStyle;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapReader;
-import org.freeplane.features.map.NodeBuilder;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.MapWriter.Hint;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeSizeModel;
-
-/**
- * @author Dimitry Polivaev
- * Mar 12, 2009
- */
-public class MapStyleModel implements IExtension {
- public static final String STYLES_PREDEFINED = "styles.predefined";
- public static final IStyle DEFAULT_STYLE = new StyleNamedObject("default");
- public static final IStyle DETAILS_STYLE = new StyleNamedObject("defaultstyle.details");
- public static final IStyle NOTE_STYLE = new StyleNamedObject("defaultstyle.note");
- public static final IStyle FLOATING_STYLE = new StyleNamedObject("defaultstyle.floating");
- private Map<IStyle, NodeModel> styleNodes;
- private MapModel styleMap;
- private ConditionalStyleModel conditionalStyleModel;
- final private DefaultComboBoxModel stylesComboBoxModel;
- final private Map<String, String> properties;
-
- Map<String, String> getProperties() {
- return properties;
- }
-
- public static MapStyleModel getExtension(final MapModel map) {
- return MapStyleModel.getExtension(map.getRootNode());
- }
-
- public MapModel getStyleMap() {
- return styleMap;
- }
-
- public static MapStyleModel getExtension(final NodeModel node) {
- return (MapStyleModel) node.getExtension(MapStyleModel.class);
- }
-
- private Color backgroundColor;
-
- public MapStyleModel() {
- conditionalStyleModel = new ConditionalStyleModel();
- styleNodes = new LinkedHashMap<IStyle, NodeModel>();
- properties = new LinkedHashMap<String, String>();
- stylesComboBoxModel = new DefaultComboBoxModel();
- }
-
- public ConditionalStyleModel getConditionalStyleModel() {
- return conditionalStyleModel;
- }
-
-
- private void insertStyleMap(MapModel map, MapModel styleMap) {
- this.styleMap = styleMap;
- final NodeModel rootNode = styleMap.getRootNode();
- createNodeStyleMap(rootNode);
- styleMap.putExtension(IUndoHandler.class, map.getExtension(IUndoHandler.class));
- final MapStyleModel defaultStyleModel = new MapStyleModel();
- defaultStyleModel.styleNodes = styleNodes;
- initStylesComboBoxModel();
- rootNode.putExtension(defaultStyleModel);
- }
-
- public void refreshStyles() {
- final NodeModel rootNode = styleMap.getRootNode();
- styleNodes.clear();
- stylesComboBoxModel.removeAllElements();
- createNodeStyleMap(rootNode);
- }
-
- void createStyleMap(final MapModel parentMap, MapStyleModel mapStyleModel, final String styleMapStr) {
- final ModeController modeController = Controller.getCurrentModeController();
- MapModel styleMap = new StyleMapModel();
- styleMap.createNewRoot();
- final MapReader mapReader = modeController.getMapController().getMapReader();
- final Reader styleReader = new StringReader(styleMapStr);
- NodeModel root;
- try {
- Map<Object, Object> hints = new HashMap<Object, Object>();
- hints.put(Hint.MODE, Mode.FILE);
- hints.put(NodeBuilder.FOLDING_LOADED, Boolean.TRUE);
- root = mapReader.createNodeTreeFromXml(styleMap, styleReader, hints);
- styleMap.setRoot(root);
- insertStyleMap(parentMap, styleMap);
- NodeModel predefinedStyleParentNode = getStyleNodeGroup(styleMap, STYLES_PREDEFINED);
- if(predefinedStyleParentNode == null){
- predefinedStyleParentNode = new NodeModel(styleMap);
- predefinedStyleParentNode.setUserObject(new StyleNamedObject(MapStyleModel.STYLES_PREDEFINED));
- root.insert(predefinedStyleParentNode);
- }
- if(styleNodes.get(DEFAULT_STYLE) == null){
- final NodeModel newNode = new NodeModel(DEFAULT_STYLE, styleMap);
- predefinedStyleParentNode.insert(newNode, 0);
- addStyleNode(newNode);
- }
- NodeModel defaultStyleModel = styleNodes.get(DEFAULT_STYLE);
- if(maxNodeWidth != NodeSizeModel.NOT_SET && NodeSizeModel.NOT_SET == NodeSizeModel.getNodeMaxNodeWidth(defaultStyleModel))
- NodeSizeModel.setNodeMaxNodeWidth(defaultStyleModel, maxNodeWidth);
- if(minNodeWidth != NodeSizeModel.NOT_SET && NodeSizeModel.NOT_SET == NodeSizeModel.getMinNodeWidth(defaultStyleModel))
- NodeSizeModel.setNodeMinWidth(defaultStyleModel, minNodeWidth);
- if(styleNodes.get(DETAILS_STYLE) == null){
- final NodeModel newNode = new NodeModel(DETAILS_STYLE, styleMap);
- predefinedStyleParentNode.insert(newNode, 1);
- addStyleNode(newNode);
- }
- if(styleNodes.get(NOTE_STYLE) == null){
- final NodeModel newNode = new NodeModel(NOTE_STYLE, styleMap);
- predefinedStyleParentNode.insert(newNode, 2);
- addStyleNode(newNode);
- }
- if(styleNodes.get(FLOATING_STYLE) == null){
- final NodeModel newNode = new NodeModel(FLOATING_STYLE, styleMap);
- EdgeModel.createEdgeModel(newNode).setStyle(EdgeStyle.EDGESTYLE_HIDDEN);
- CloudModel.createModel(newNode).setShape(Shape.ROUND_RECT);
- predefinedStyleParentNode.insert(newNode, 3);
- addStyleNode(newNode);
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- private void createNodeStyleMap(final NodeModel node) {
- if (node.hasChildren()) {
- final Enumeration<NodeModel> children = node.children();
- while (children.hasMoreElements()) {
- createNodeStyleMap(children.nextElement());
- }
- return;
- }
- if (node.depth() >= 2) {
- addStyleNode(node);
- }
- }
-
- public void addStyleNode(final NodeModel node) {
- final IStyle userObject = (IStyle) node.getUserObject();
- if(null == styleNodes.put(userObject, node))
- stylesComboBoxModel.addElement(userObject);
- }
-
- private void initStylesComboBoxModel() {
- stylesComboBoxModel.removeAllElements();
- for(IStyle s : getStyles())
- stylesComboBoxModel.addElement(s);
-
- }
-
- public void removeStyleNode(final NodeModel node) {
- final Object userObject = node.getUserObject();
- if(null != styleNodes.remove(userObject))
- stylesComboBoxModel.removeElement(userObject);
- }
-
- public NodeModel getStyleNodeSafe(final IStyle style) {
- final NodeModel node = getStyleNode(style);
- if(node != null)
- return node;
- return getStyleNode(DEFAULT_STYLE);
- }
- public NodeModel getStyleNode(final IStyle style) {
- if(style instanceof StyleNode){
- return ((StyleNode)style).getNode();
- }
- final NodeModel node = styleNodes.get(style);
- return node;
- }
-
- public Color getBackgroundColor() {
- return backgroundColor;
- }
-
- public void setBackgroundColor(final Color backgroundColor) {
- this.backgroundColor = backgroundColor;
- }
-
- public Set<IStyle> getStyles() {
- return styleNodes.keySet();
- }
-
- private float zoom = 1f;
-
- public float getZoom() {
- return zoom;
- }
-
- public MapViewLayout getMapViewLayout() {
- return mapViewLayout;
- }
-
- void setMapViewLayout(final MapViewLayout mapViewLayout) {
- this.mapViewLayout = mapViewLayout;
- }
-
- void setZoom(final float zoom) {
- this.zoom = zoom;
- }
-
- private MapViewLayout mapViewLayout = MapViewLayout.MAP;
- private int maxNodeWidth = NodeSizeModel.NOT_SET;
- private int minNodeWidth = NodeSizeModel.NOT_SET;
- public void setMaxNodeWidth(final int maxNodeWidth) {
- this.maxNodeWidth = maxNodeWidth;
- }
-
- public void setMinNodeWidth(final int minNodeWidth) {
- this.minNodeWidth = minNodeWidth;
- }
-
- void copyFrom(MapStyleModel source, boolean overwrite) {
- if(overwrite && source.styleMap != null || styleMap == null){
- styleMap = source.styleMap;
- styleNodes = source.styleNodes;
- initStylesComboBoxModel();
- conditionalStyleModel = source.conditionalStyleModel;
- }
- if(overwrite && source.backgroundColor != null|| backgroundColor == null){
- backgroundColor = source.backgroundColor;
- }
- }
-
- public void setProperty(String key, String value){
- if (value != null){
- properties.put(key, value);
- }
- else{
- properties.remove(key);
- }
- }
-
- public String getProperty(String key){
- return properties.get(key);
- }
-
- public NodeModel getStyleNodeGroup(NodeModel styleNode){
- final int depth = styleNode.depth();
- if(depth < 1)
- return null;
- NodeModel node = styleNode;
- for(int i = depth; i > 1; i--){
- node = node.getParentNode();
- }
- return node;
- }
-
- public NodeModel getStyleNodeGroup(final MapModel styleMap, final String group) {
- final NodeModel rootNode = styleMap.getRootNode();
- final int childCount = rootNode.getChildCount();
- for(int i = 0; i < childCount; i++){
- final NodeModel childNode = (NodeModel) rootNode.getChildAt(i);
- final StyleNamedObject userObject = (StyleNamedObject) childNode.getUserObject();
- if(userObject.getObject().equals(group)){
- return childNode;
- }
- }
- return null;
- }
-
- ArrayList<ListDataListener> listeners = new ArrayList<ListDataListener>();
- public static final String STYLES_USER_DEFINED = "styles.user-defined";
- ComboBoxModel getStylesAsComboBoxModel() {
- return stylesComboBoxModel;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/StyleCondition.java b/freeplane/src/org/freeplane/features/styles/StyleCondition.java
deleted file mode 100644
index 5c2ac64..0000000
--- a/freeplane/src/org/freeplane/features/styles/StyleCondition.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.freeplane.features.styles;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class StyleCondition extends ASelectableCondition {
- static final String NAME = "style_equals_condition";
- final private Object value;
-
- public StyleCondition(final IStyle value) {
- this.value = value;
- }
-
- public boolean checkNode(final NodeModel node) {
- IStyle firstStyle = LogicalStyleController.getController().getFirstStyle(node);
- return value.equals(firstStyle);
- }
-
- public void fillXML(final XMLElement child) {
- if (value instanceof StyleString) {
- child.setAttribute("TEXT", value.toString());
- }
- else if (value instanceof StyleNamedObject) {
- child.setAttribute("LOCALIZED_TEXT", ((StyleNamedObject) value).getObject().toString());
- }
- }
-
- public static ASelectableCondition load(final XMLElement element) {
- final String text = element.getAttribute("TEXT", null);
- if (text != null) {
- return new StyleCondition(new StyleString(text));
- }
- final String name = element.getAttribute("LOCALIZED_TEXT", null);
- if (name != null) {
- return new StyleCondition(new StyleNamedObject(name));
- }
- return null;
- }
-
- protected String createDescription() {
- final String filterStyle = TextUtils.getText(LogicalStyleFilterController.FILTER_STYLE);
- return filterStyle + " '" + value.toString() + '\'';
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/StyleContainsCondition.java b/freeplane/src/org/freeplane/features/styles/StyleContainsCondition.java
deleted file mode 100644
index eaada7f..0000000
--- a/freeplane/src/org/freeplane/features/styles/StyleContainsCondition.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.freeplane.features.styles;
-
-import java.util.Collection;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class StyleContainsCondition extends ASelectableCondition {
- static final String NAME = "style_contains_condition";
- final private Object value;
-
- public StyleContainsCondition(final IStyle value) {
- this.value = value;
- }
-
- public boolean checkNode(final NodeModel node) {
- final Collection<IStyle> styles = LogicalStyleController.getController().getStyles(node);
- return styles.contains(value);
- }
-
- public void fillXML(final XMLElement child) {
- if (value instanceof StyleString) {
- child.setAttribute("TEXT", value.toString());
- }
- else if (value instanceof StyleNamedObject) {
- child.setAttribute("LOCALIZED_TEXT", ((StyleNamedObject) value).getObject().toString());
- }
- }
-
- public static ASelectableCondition load(final XMLElement element) {
- final String text = element.getAttribute("TEXT", null);
- if (text != null) {
- return new StyleContainsCondition(new StyleString(text));
- }
- final String name = element.getAttribute("LOCALIZED_TEXT", null);
- if (name != null) {
- return new StyleContainsCondition(new StyleNamedObject(name));
- }
- return null;
- }
-
- protected String createDescription() {
- final String style = TextUtils.getText(LogicalStyleFilterController.FILTER_STYLE);
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
- return ConditionFactory.createDescription(style, simpleCondition, value.toString(), false, false);
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/StyleFactory.java b/freeplane/src/org/freeplane/features/styles/StyleFactory.java
deleted file mode 100644
index e9fb7d3..0000000
--- a/freeplane/src/org/freeplane/features/styles/StyleFactory.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.freeplane.features.styles;
-
-import org.freeplane.core.resources.NamedObject;
-
-public class StyleFactory {
- public static IStyle create(String string){
- return new StyleString(string);
- }
-
- public static IStyle create(NamedObject no){
- return new StyleNamedObject(no);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/StyleMapModel.java b/freeplane/src/org/freeplane/features/styles/StyleMapModel.java
deleted file mode 100644
index 12a5db4..0000000
--- a/freeplane/src/org/freeplane/features/styles/StyleMapModel.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-
-/**
- * @author Dimitry Polivaev
- * Feb 6, 2011
- */
-class StyleMapModel extends MapModel {
- private static final String STYLES = "styles";
- StyleMapModel() {
- super();
- }
-
- @Override
- public String getTitle() {
- return TextUtils.getText(STYLES);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/styles/StyleNamedObject.java b/freeplane/src/org/freeplane/features/styles/StyleNamedObject.java
deleted file mode 100644
index 39ebeec..0000000
--- a/freeplane/src/org/freeplane/features/styles/StyleNamedObject.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.freeplane.features.styles;
-
-import org.freeplane.core.resources.NamedObject;
-
-
-public class StyleNamedObject implements IStyle {
- final private NamedObject namedObject;
-
- public StyleNamedObject(NamedObject namedObject) {
- super();
- if(namedObject == null)
- throw new NullPointerException();
- this.namedObject = namedObject;
- }
-
- public StyleNamedObject(String string) {
- if(string == null)
- throw new NullPointerException();
- namedObject = new NamedObject(string);
- }
-
- @Override
- public boolean equals(Object obj) {
- if(this == obj){
- return true;
- }
- if(obj == null){
- return false;
- }
- if(! this.getClass().equals(obj.getClass())){
- return false;
- }
- return namedObject.equals(((StyleNamedObject)obj).namedObject);
- }
-
- @Override
- public int hashCode() {
- return namedObject.hashCode() + 37 * StyleNamedObject.class.hashCode();
- }
-
- @Override
- public String toString() {
- return namedObject.toString();
- }
-
- public Object getObject() {
- return namedObject.getObject();
- }
-
- public static String toKeyString(IStyle style) {
- if(style instanceof StyleNamedObject){
- return ((StyleNamedObject)style).getObject().toString();
- }
- return style.toString();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/AManageConditionalStylesAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/AManageConditionalStylesAction.java
deleted file mode 100644
index 9a11b90..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/AManageConditionalStylesAction.java
+++ /dev/null
@@ -1,144 +0,0 @@
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.table.TableModel;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.styles.ConditionalStyleModel;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyleModel;
-
-abstract public class AManageConditionalStylesAction extends AFreeplaneAction {
- private static final int BUTTON_GAP = 15;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public AManageConditionalStylesAction(final String name) {
- super(name);
- }
-
- abstract public ConditionalStyleModel getConditionalStyleModel();
-
- protected Component createConditionalStylePane(final MapModel map, final ConditionalStyleModel conditionalStyleModel) {
- final JPanel pane = new JPanel(new BorderLayout());
- final MapStyleModel styles = MapStyleModel.getExtension(map);
- final TableModel tableModel = MLogicalStyleController.getController().getConditionalStyleModelAsTableModel(map, conditionalStyleModel);
- final ConditionalStyleTable conditionalStyleTable = new ConditionalStyleTable(styles, tableModel);
- if(conditionalStyleTable.getRowCount() > 0){
- conditionalStyleTable.setRowSelectionInterval(0, 0);
- }
- JScrollPane scrollPane = new JScrollPane(conditionalStyleTable, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
- final int tablePreferredWidth = scrollPane.getViewport().getViewSize().width;
- scrollPane.setPreferredSize(new Dimension(tablePreferredWidth, 400));
- pane.add(scrollPane, BorderLayout.CENTER);
- final Box buttons = Box.createVerticalBox();
-
- JButton create = new JButton();
- MenuBuilder.setLabelAndMnemonic(create, TextUtils.getRawText("new"));
- create.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- create.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int row = conditionalStyleTable.getRowCount();
- final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
- ((MLogicalStyleController)LogicalStyleController.getController()).addConditionalStyle(map, conditionalStyleModel, true, null, MapStyleModel.DEFAULT_STYLE, false);
- conditionalStyleTable.setRowSelectionInterval(row, row);
- }
- });
-
- JButton edit = new JButton();
- MenuBuilder.setLabelAndMnemonic(edit, TextUtils.getRawText("edit"));
- edit.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- edit.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int selectedRow = conditionalStyleTable.getSelectedRow();
- if(selectedRow == -1){
- return;
- }
- final ASelectableCondition value = (ASelectableCondition) conditionalStyleTable.getValueAt(selectedRow, 1);
- final MLogicalStyleController styleController = MLogicalStyleController.getController();
- final ASelectableCondition newCondition = styleController.editCondition(value);
- conditionalStyleTable.setValueAt(newCondition, selectedRow, 1);
- }
- });
-
- JButton delete = new JButton();
- MenuBuilder.setLabelAndMnemonic(delete, TextUtils.getRawText("delete"));
- delete.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- delete.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int selectedRow = conditionalStyleTable.getSelectedRow();
- if(selectedRow == -1){
- return;
- }
- final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
- ((MLogicalStyleController)LogicalStyleController.getController()).removeConditionalStyle(map, conditionalStyleModel, selectedRow);
- if(conditionalStyleTable.getRowCount() == selectedRow){
- selectedRow--;
- }
- if(selectedRow == -1){
- return;
- }
- conditionalStyleTable.setRowSelectionInterval(selectedRow, selectedRow);
- }
- });
- JButton up = new JButton();
- MenuBuilder.setLabelAndMnemonic(up, TextUtils.getRawText("up"));
- up.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- up.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int selectedRow = conditionalStyleTable.getSelectedRow();
- if(selectedRow <= 0){
- return;
- }
- final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
- ((MLogicalStyleController)LogicalStyleController.getController()).moveConditionalStyleUp(map, conditionalStyleModel, selectedRow);
- selectedRow--;
- conditionalStyleTable.setRowSelectionInterval(selectedRow, selectedRow);
- }
- });
- JButton down = new JButton();
- MenuBuilder.setLabelAndMnemonic(down, TextUtils.getRawText("down"));
- down.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- down.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- int selectedRow = conditionalStyleTable.getSelectedRow();
- if(selectedRow == -1 || selectedRow == conditionalStyleTable.getRowCount() - 1){
- return;
- }
- final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
- ((MLogicalStyleController)LogicalStyleController.getController()).moveConditionalStyleDown(map, conditionalStyleModel, selectedRow);
- selectedRow++;
- conditionalStyleTable.setRowSelectionInterval(selectedRow, selectedRow);
- }
- });
- buttons.add(Box.createVerticalStrut(BUTTON_GAP));
- buttons.add(create);
- buttons.add(Box.createVerticalStrut(BUTTON_GAP));
- buttons.add(edit);
- buttons.add(Box.createVerticalStrut(BUTTON_GAP));
- buttons.add(delete);
- buttons.add(Box.createVerticalStrut(BUTTON_GAP));
- buttons.add(up);
- buttons.add(Box.createVerticalStrut(BUTTON_GAP));
- buttons.add(down);
- buttons.add(Box.createVerticalGlue());
- pane.add(buttons, BorderLayout.EAST);
- UITools.focusOn(conditionalStyleTable);
- return pane;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/AssignStyleAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/AssignStyleAction.java
deleted file mode 100644
index 2c40fa0..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/AssignStyleAction.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.LogicalStyleModel;
-import org.freeplane.features.styles.StyleNamedObject;
-
-/**
- * @author Dimitry Polivaev
- * 28.09.2009
- */
- at SelectableAction(checkOnPopup = true)
-public class AssignStyleAction extends AMultipleNodeAction {
- final private IStyle style;
-
- public AssignStyleAction(final IStyle style) {
- super(actionName(style), actionText(style), null);
- this.style = style;
- }
-
- private static String actionText(final IStyle style) {
- if(style != null)
- return style.toString();
- return TextUtils.getRawText("ResetStyleAction.text");
- }
-
- private static String actionName(final IStyle style) {
- if(style != null)
- return "AssignStyleAction." + StyleNamedObject.toKeyString(style);
- return "ResetStyleAction";
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- final MLogicalStyleController controller = (MLogicalStyleController) Controller.getCurrentModeController().getExtension(
- LogicalStyleController.class);
- controller.setStyle(node, style);
- }
-
- @Override
- public void setSelected() {
- IMapSelection selection = Controller.getCurrentController().getSelection();
- if(selection != null){
- NodeModel node= selection.getSelected();
- final IStyle style = LogicalStyleModel.getStyle(node);
- setSelected(this.style == style || this.style != null && this.style.equals(style));
- }
- else
- setSelected(false);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/ComboBoxRendererWithTooltip.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/ComboBoxRendererWithTooltip.java
deleted file mode 100644
index 2596c3d..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/ComboBoxRendererWithTooltip.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.Component;
-import java.awt.Container;
-import javax.swing.JComboBox;
-import javax.swing.JList;
-import javax.swing.plaf.basic.BasicComboBoxRenderer;
-
-/**
- * @author Dimitry Polivaev
- * Dec 31, 2011
- */
- at SuppressWarnings("serial")
-public class ComboBoxRendererWithTooltip extends BasicComboBoxRenderer {
- final private JComboBox box;
- public ComboBoxRendererWithTooltip(JComboBox box){
- this.box = box;
- }
- public Component getListCellRendererComponent(JList list, Object value,
- int index, boolean isSelected, boolean cellHasFocus) {
- super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
- final String text;
- final Container parent = list.getParent();
- if(parent == null){
- text = getText();
- }
- else {
- final int parentWidth = parent.getWidth();
- if(index == -1 || parentWidth > 0 && parentWidth < getPreferredSize().width)
- text = getText();
- else
- text = null;
- }
- if(index == -1){
- box.setToolTipText(text);
- }
- else{
- list.setToolTipText(text);
- }
-
- // FELIXHACK
- //setFont(getFont().deriveFont(8.0F));
- //setPreferredSize(new Dimension(Math.max(40, getPreferredSize().width), 20));
- //setBackground(Color.RED);
-
- return this;
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/ConditionalStyleTable.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/ConditionalStyleTable.java
deleted file mode 100644
index 288cc32..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/ConditionalStyleTable.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseEvent;
-import java.util.Collection;
-import java.util.EventObject;
-import javax.swing.AbstractCellEditor;
-import javax.swing.DefaultCellEditor;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JTable;
-import javax.swing.plaf.basic.BasicButtonUI;
-import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableColumnModel;
-import javax.swing.table.TableModel;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.DefaultConditionRenderer;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.MapStyleModel;
-
-class ConditionalStyleTable extends JTable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private MapStyleModel styleModel;
- private DefaultConditionRenderer conditionRenderer;
-
- @SuppressWarnings("serial")
- private class ConditionEditor extends AbstractCellEditor
- implements TableCellEditor{
-
- private JButton btn;
- public ConditionEditor() {
- super();
- btn = new JButton(){
- {
- setUI(BasicButtonUI.createUI(this));
- }
-
- @Override
- public Color getBackground() {
- return getSelectionBackground();
- }
-
- };
- }
-
- private Object cellEditorValue;
- public Component getTableCellEditorComponent(final JTable table, final Object value, boolean isSelected, int row, int column) {
- btn.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- final MLogicalStyleController styleController = MLogicalStyleController.getController();
- cellEditorValue = styleController.editCondition((ASelectableCondition) value);
- btn.removeActionListener(this);
- fireEditingStopped();
- }
- });
- return btn;
- }
-
- public Object getCellEditorValue() {
- return cellEditorValue;
- }
-
- @Override
- public boolean isCellEditable(EventObject anEvent) {
- if (anEvent instanceof MouseEvent) {
- return ((MouseEvent) anEvent).getClickCount() >= 2;
- }
- return true;
- }
- }
-
- public ConditionalStyleTable(MapStyleModel styleModel, TableModel tableModel) {
- super(tableModel);
- this.styleModel = styleModel;
- setCellSelectionEnabled(false);
- setRowSelectionAllowed(true);
- final TableColumnModel columnModel = getColumnModel();
- setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
-// setSelectionBackground(DefaultConditionRenderer.SELECTED_BACKGROUND);
- setRowHeight(20);
- conditionRenderer = new DefaultConditionRenderer(TextUtils.getText("always"), true);
- columnModel.getColumn(1).setCellRenderer(conditionRenderer);
- columnModel.getColumn(1).setCellEditor(new ConditionEditor());
- final JComboBox styleBox = new JComboBox();
- styleBox.setEditable(false);
- columnModel.getColumn(2).setCellEditor(new DefaultCellEditor(styleBox){
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- {
- setClickCountToStart(2);
- }
-
- @Override
- public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
- int column) {
- final Collection<IStyle> styles = ConditionalStyleTable.this.styleModel.getStyles();
- final DefaultComboBoxModel boxContent = new DefaultComboBoxModel(styles.toArray());
- styleBox.setModel(boxContent);
- return super.getTableCellEditorComponent(table, value, isSelected, row, column);
- }
-
- });
- columnModel.getColumn(1).setPreferredWidth(300);
- columnModel.getColumn(2).setPreferredWidth(180);
- columnModel.getColumn(2).setCellRenderer(new DefaultStyleRenderer());
- }
-
- public MapStyleModel getStyles() {
- return styleModel;
- }
-
-}
-
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/MLogicalStyleController.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/MLogicalStyleController.java
deleted file mode 100644
index bdcdad4..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/MLogicalStyleController.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles.mindmapmode;
-
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.swing.event.TableModelListener;
-import javax.swing.table.TableModel;
-
-import org.freeplane.core.ui.IUserInputListenerFactory;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.attribute.mindmapmode.MAttributeController;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.map.IExtensionCopier;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.features.note.mindmapmode.MNoteController;
-import org.freeplane.features.styles.ConditionalStyleModel;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.LogicalStyleKeys;
-import org.freeplane.features.styles.LogicalStyleModel;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.ConditionalStyleModel.Item;
-import org.freeplane.features.text.DetailTextModel;
-import org.freeplane.features.text.mindmapmode.MTextController;
-
-/**
- * @author Dimitry Polivaev
- * 28.09.2009
- */
-public class MLogicalStyleController extends LogicalStyleController {
- private final class RemoveConditionalStyleActor implements IActor {
- private final int index;
- private final ConditionalStyleModel conditionalStyleModel;
- Item item = null;
-
- private RemoveConditionalStyleActor(ConditionalStyleModel conditionalStyleModel, int index) {
- this.index = index;
- this.conditionalStyleModel = conditionalStyleModel;
- }
-
- public void undo() {
- MLogicalStyleController.super.insertConditionalStyle(conditionalStyleModel, index, item.isActive(), item.getCondition(),
- item.getStyle(), item.isLast());
- }
-
- public String getDescription() {
- return "RemoveConditionalStyle";
- }
-
- public void act() {
- item = MLogicalStyleController.super.removeConditionalStyle(conditionalStyleModel, index);
- }
- }
-
- private final class AddConditionalStyleActor implements IActor {
- private final ConditionalStyleModel conditionalStyleModel;
- private final boolean isActive;
- private final ASelectableCondition condition;
- private final IStyle style;
- private boolean isLast;
-
- public AddConditionalStyleActor(final ConditionalStyleModel conditionalStyleModel, boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast) {
- this.conditionalStyleModel = conditionalStyleModel;
- this.isActive = isActive;
- this.condition = condition;
- this.style = style;
- this.isLast = isLast;
- }
-
- public void undo() {
- int index = conditionalStyleModel.getStyleCount() - 1;
- MLogicalStyleController.super.removeConditionalStyle(conditionalStyleModel, index);
- }
-
- public String getDescription() {
- return "AddConditionalStyle";
- }
-
- public void act() {
- MLogicalStyleController.super.addConditionalStyle(conditionalStyleModel, isActive, condition, style, isLast);
- }
- }
-
- private static class StyleRemover implements INodeChangeListener {
- public StyleRemover() {
- }
-
- public void nodeChanged(final NodeChangeEvent event) {
- final ModeController modeController = Controller.getCurrentModeController();
- if (modeController == null || modeController.isUndoAction()) {
- return;
- }
- if (!event.getProperty().equals(LogicalStyleModel.class)) {
- return;
- }
- final NodeModel node = event.getNode();
- final MapModel map = node.getMap();
- final IStyle styleKey = (IStyle) event.getNewValue();
- final MapStyleModel mapStyles = MapStyleModel.getExtension(map);
- final NodeModel styleNode = mapStyles.getStyleNode(styleKey);
- if (styleNode == null) {
- return;
- }
- modeController.undoableRemoveExtensions(LogicalStyleKeys.NODE_STYLE, node, styleNode);
- }
- };
-
- private static class ExtensionCopier implements IExtensionCopier {
- public void copy(final Object key, final NodeModel from, final NodeModel to) {
- if (!key.equals(LogicalStyleKeys.LOGICAL_STYLE)) {
- return;
- }
- copy(from, to);
- }
-
- public void copy(final NodeModel from, final NodeModel to) {
- final LogicalStyleModel fromStyle = (LogicalStyleModel) from.getExtension(LogicalStyleModel.class);
- if (fromStyle == null) {
- return;
- }
- final LogicalStyleModel toStyle = LogicalStyleModel.createExtension(to);
- toStyle.setStyle(fromStyle.getStyle());
- }
-
- public void remove(final Object key, final NodeModel from) {
- if (!key.equals(LogicalStyleKeys.LOGICAL_STYLE)) {
- return;
- }
- from.removeExtension(LogicalStyleModel.class);
- }
-
- public void remove(final Object key, final NodeModel from, final NodeModel which) {
- if (!key.equals(LogicalStyleKeys.LOGICAL_STYLE)) {
- return;
- }
- final LogicalStyleModel whichStyle = (LogicalStyleModel) which.getExtension(LogicalStyleModel.class);
- if (whichStyle == null) {
- return;
- }
- final LogicalStyleModel fromStyle = (LogicalStyleModel) from.getExtension(LogicalStyleModel.class);
- if (fromStyle == null) {
- return;
- }
- from.removeExtension(fromStyle);
- }
-
- public void resolveParentExtensions(Object key, NodeModel to) {
- }
- }
-
-// private final ModeController modeController;
- final private List<AssignStyleAction> actions;
- private FilterComposerDialog filterComposerDialog;
-
- public MLogicalStyleController(ModeController modeController) {
- super(modeController);
-// this.modeController = modeController;
- actions = new LinkedList<AssignStyleAction>();
- }
-
- public void initS() {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addAction(new ManageNodeConditionalStylesAction());
- }
- public void initM() {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.getMapController().addNodeChangeListener(new StyleRemover());
- modeController.registerExtensionCopier(new ExtensionCopier());
- modeController.addAction(new RedefineStyleAction());
- modeController.addAction(new NewUserStyleAction());
- modeController.addAction(new ManageMapConditionalStylesAction());
- modeController.addAction(new ManageNodeConditionalStylesAction());
- modeController.addAction(new CopyStyleExtensionsAction());
- if (modeController.getModeName().equals("MindMap")) {
- modeController.addAction(new MapBackgroundColorAction());
- modeController.addAction(new CopyMapStylesAction());
- }
- if(! modeController.getController().getViewController().isHeadless()){
- final IUserInputListenerFactory userInputListenerFactory = modeController.getUserInputListenerFactory();
- final MenuBuilder menuBuilder = userInputListenerFactory.getMenuBuilder();
- Controller.getCurrentController().getMapViewManager().addMapSelectionListener(new IMapSelectionListener() {
- public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
- removeStyleMenu(menuBuilder, "main_menu_styles");
- removeStyleMenu(menuBuilder, "node_popup_styles");
- }
-
- public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
- addStyleMenu(menuBuilder, "main_menu_styles", newMap);
- addStyleMenu(menuBuilder, "node_popup_styles", newMap);
- }
- });
- final MapController mapController = modeController.getMapController();
- mapController.addMapChangeListener(new IMapChangeListener() {
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void onPreNodeDelete(final NodeModel oldParent, final NodeModel selectedNode, final int index) {
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- }
-
- public void mapChanged(final MapChangeEvent event) {
- if (event.getProperty().equals(MapStyle.MAP_STYLES)) {
- removeStyleMenu(menuBuilder, "main_menu_styles");
- addStyleMenu(menuBuilder, "main_menu_styles", event.getMap());
- removeStyleMenu(menuBuilder, "node_popup_styles");
- addStyleMenu(menuBuilder, "node_popup_styles", event.getMap());
- }
- }
- });
- mapController.addNodeSelectionListener(new INodeSelectionListener() {
- public void onSelect(final NodeModel node) {
- selectActions();
- }
-
- public void onDeselect(final NodeModel node) {
- }
- });
- }
- }
-
- protected void removeStyleMenu(final MenuBuilder menuBuilder, final String formatMenuString) {
- if(null != menuBuilder.get(formatMenuString))
- menuBuilder.removeChildElements(formatMenuString);
- actions.clear();
- }
-
- protected void addStyleMenu(final MenuBuilder menuBuilder, final String formatMenuString, final MapModel newMap) {
- if (newMap == null) {
- return;
- }
- final MapStyleModel extension = MapStyleModel.getExtension(newMap);
- if (extension == null) {
- return;
- }
- if(null == menuBuilder.get(formatMenuString))
- return;
- final NodeModel rootNode = extension.getStyleMap().getRootNode();
- final AssignStyleAction resetAction = new AssignStyleAction(null);
- actions.add(resetAction);
- menuBuilder.addAction(formatMenuString, resetAction, MenuBuilder.AS_CHILD);
- addStyleMenu(menuBuilder, formatMenuString, rootNode, extension);
- }
-
- private void addStyleMenu(final MenuBuilder menuBuilder, final String category, final NodeModel rootNode, MapStyleModel extension) {
- final List<NodeModel> children = rootNode.getChildren();
- for (final NodeModel child : children) {
- final IStyle style = (IStyle) child.getUserObject();
- if (child.hasChildren()) {
- addStyleMenu(menuBuilder, category, child, extension);
- }
- else if(null != extension.getStyleNode(style)){
- final AssignStyleAction action = new AssignStyleAction(style);
- actions.add(action);
- menuBuilder.addAction(category, action, MenuBuilder.AS_CHILD);
- }
- }
- }
-
- public void setStyle(final NodeModel node, final IStyle style) {
- final ModeController modeController = Controller.getCurrentModeController();
- final IStyle oldStyle = LogicalStyleModel.getStyle(node);
- if (oldStyle != null && oldStyle.equals(style) || oldStyle == style) {
- modeController.getMapController().nodeChanged(node, LogicalStyleModel.class, oldStyle, style);
- return;
- }
- final IActor actor = new IActor() {
- public String getDescription() {
- return "setStyle";
- }
-
- public void act() {
- changeStyle(modeController, node, oldStyle, style);
- }
-
- public void undo() {
- changeStyle(modeController, node, style, oldStyle);
- }
-
- private void changeStyle(final ModeController modeController, final NodeModel node, final IStyle oldStyle,
- final IStyle style) {
- if(style != null){
- final LogicalStyleModel model = LogicalStyleModel.createExtension(node);
- model.setStyle(style);
- }
- else{
- node.removeExtension(LogicalStyleModel.class);
- }
- modeController.getMapController().nodeChanged(node, LogicalStyleModel.class, oldStyle, style);
- selectActions();
- }
- };
- modeController.execute(actor, node.getMap());
- }
-
- public void copyStyleExtensions(final IStyle style, final NodeModel target) {
- final MTextController textController = MTextController.getController();
- final MapStyleModel extension = MapStyleModel.getExtension(target.getMap());
- final NodeModel styleNode = extension.getStyleNode(style);
- if(styleNode != null){
- final MAttributeController attributeController = MAttributeController.getController();
- attributeController.copyAttributesToNode(styleNode, target);
- final String detailTextText = DetailTextModel.getDetailTextText(styleNode);
- if(detailTextText != null)
- textController.setDetails(target, detailTextText);
- final String noteText = NoteModel.getNoteText(styleNode);
- if(noteText != null)
- {
- MNoteController noteController = (MNoteController) NoteController.getController();
- noteController.setNoteText(target, noteText);
- }
- }
- }
-
- void selectActions() {
- for (final AssignStyleAction action : actions) {
- action.setSelected();
- }
- }
-
- public void setStyle(final IStyle style) {
- final ModeController modeController = Controller.getCurrentModeController();
- final Collection<NodeModel> selectedNodes = modeController.getMapController().getSelectedNodes();
- for (final NodeModel selected : selectedNodes) {
- setStyle(selected, style);
- }
- }
-
-
- public void moveConditionalStyleDown(final MapModel map, final ConditionalStyleModel conditionalStyleModel, final int index) {
- int maxIndex = conditionalStyleModel.getStyleCount() - 1;
- if (index < 0 || index >= maxIndex) {
- return;
- }
- IActor actor = new IActor() {
- public String getDescription() {
- return "moveConditionalStyleDown";
- }
-
- public void act() {
- MLogicalStyleController.super.moveConditionalStyleDown(conditionalStyleModel, index);
- }
-
- public void undo() {
- MLogicalStyleController.super.moveConditionalStyleUp(conditionalStyleModel, index + 1);
- }
- };
- Controller.getCurrentModeController().execute(actor, map);
- }
-
-
- public void moveConditionalStyleUp(final MapModel map, final ConditionalStyleModel conditionalStyleModel, final int index) {
- int maxIndex = conditionalStyleModel.getStyleCount() - 1;
- if (index <= 0 || index > maxIndex) {
- return;
- }
- IActor actor = new IActor() {
- public String getDescription() {
- return "moveConditionalStyleUp";
- }
-
- public void act() {
- MLogicalStyleController.super.moveConditionalStyleUp(conditionalStyleModel, index);
- }
-
- public void undo() {
- MLogicalStyleController.super.moveConditionalStyleDown(conditionalStyleModel, index - 1);
- }
- };
- Controller.getCurrentModeController().execute(actor, map);
- }
-
- public static MLogicalStyleController getController() {
- return (MLogicalStyleController) LogicalStyleController.getController();
- }
-
-
- public void addConditionalStyle(final MapModel map, final ConditionalStyleModel conditionalStyleModel, boolean isActive, ASelectableCondition condition, IStyle style, boolean isLast) {
- AddConditionalStyleActor actor = new AddConditionalStyleActor(conditionalStyleModel, isActive, condition, style, isLast);
- Controller.getCurrentModeController().execute(actor, map);
- }
-
-
- public Item removeConditionalStyle(final MapModel map, final ConditionalStyleModel conditionalStyleModel, final int index) {
- RemoveConditionalStyleActor actor = new RemoveConditionalStyleActor(conditionalStyleModel, index);
- Controller.getCurrentModeController().execute(actor, map);
- return actor.item;
- }
-
- public TableModel getConditionalStyleModelAsTableModel(final MapModel map, final ConditionalStyleModel conditionalStyleModel) {
- return new TableModel() {
- private final TableModel tableModel = conditionalStyleModel.asTableModel();
-
- public void addTableModelListener(TableModelListener l) {
- tableModel.addTableModelListener(l);
- }
-
- public Class<?> getColumnClass(int columnIndex) {
- return tableModel.getColumnClass(columnIndex);
- }
-
- public int getColumnCount() {
- return tableModel.getColumnCount();
- }
-
- public String getColumnName(int columnIndex) {
- return tableModel.getColumnName(columnIndex);
- }
-
- public int getRowCount() {
- return tableModel.getRowCount();
- }
-
- public Object getValueAt(int rowIndex, int columnIndex) {
- return tableModel.getValueAt(rowIndex, columnIndex);
- }
-
- public boolean isCellEditable(int rowIndex, int columnIndex) {
- return tableModel.isCellEditable(rowIndex, columnIndex);
- }
-
- public void removeTableModelListener(TableModelListener l) {
- tableModel.removeTableModelListener(l);
- }
-
- public void setValueAt(final Object aValue, final int rowIndex, final int columnIndex) {
- final Object oldValue = tableModel.getValueAt(rowIndex, columnIndex);
- if(aValue == oldValue || aValue != null && aValue.equals(oldValue)){
- return;
- }
- IActor actor = new IActor() {
-
- public String getDescription() {
- return "set conditional style table cell value";
- }
-
- public void act() {
- tableModel.setValueAt(aValue, rowIndex, columnIndex);
- }
-
- public void undo() {
- tableModel.setValueAt(oldValue, rowIndex, columnIndex);
- }
- };
- Controller.getCurrentModeController().execute(actor, map);
- }
- };
- }
-
- public FilterComposerDialog getFilterComposerDialog() {
- if(filterComposerDialog == null){
- filterComposerDialog = new FilterComposerDialog();
- }
- return filterComposerDialog;
- }
-
- public ASelectableCondition editCondition(ASelectableCondition value) {
- final FilterComposerDialog filterComposerDialog = getFilterComposerDialog();
- filterComposerDialog.acceptMultipleConditions(true);
- if(value != null)
- filterComposerDialog.addCondition(value);
- filterComposerDialog.show();
- List<ASelectableCondition> conditions = filterComposerDialog.getConditions();
- if(filterComposerDialog.isSuccess())
- return conditions.isEmpty() ? null : conditions.get(0);
- return value;
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/MUIFactory.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/MUIFactory.java
deleted file mode 100644
index e4fbb04..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/MUIFactory.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.Container;
-import java.awt.GraphicsEnvironment;
-import java.util.Collection;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JComboBox;
-import javax.swing.event.ListDataEvent;
-import javax.swing.event.ListDataListener;
-import org.freeplane.core.ui.FixedBasicComboBoxEditor;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapStyleModel;
-
-public class MUIFactory implements INodeSelectionListener, INodeChangeListener, IMapChangeListener,
- IMapSelectionListener {
-// final private Controller controller;
- private boolean ignoreChangeEvent = false;
- final private DefaultComboBoxModel fonts, size, styles;
-// private final MModeController modeController;
-
- public DefaultComboBoxModel getStyles() {
- return styles;
- }
-
- final static public String[] FONT_SIZES = new String[] { "2", "4", "6", "8", "10", "12", "14", "16", "18", "20", "22", "24",
- "30", "36", "48", "72" };
- public MUIFactory() {
- size = new DefaultComboBoxModel(MUIFactory.FONT_SIZES);
- styles = new DefaultComboBoxModel();
- final ModeController modeController = Controller.getCurrentModeController();
- final MNodeStyleController styleController = (MNodeStyleController) modeController
- .getExtension(NodeStyleController.class);
- final GraphicsEnvironment gEnv = GraphicsEnvironment.getLocalGraphicsEnvironment();
- final String[] envFonts = gEnv.getAvailableFontFamilyNames();
- fonts = new DefaultComboBoxModel(envFonts);
- final ListDataListener fontsListener = new ListDataListener() {
- public void intervalRemoved(final ListDataEvent e) {
- }
-
- public void intervalAdded(final ListDataEvent e) {
- }
-
- public void contentsChanged(final ListDataEvent e) {
- if (e.getIndex0() != -1) {
- return;
- }
- if (ignoreChangeEvent) {
- return;
- }
- ignoreChangeEvent = true;
- final DefaultComboBoxModel source = (DefaultComboBoxModel) e.getSource();
- styleController.setFontFamily((String) source.getSelectedItem());
- ignoreChangeEvent = false;
- }
- };
- fonts.addListDataListener(fontsListener);
- final ListDataListener sizeListener = new ListDataListener() {
- public void intervalRemoved(final ListDataEvent e) {
- }
-
- public void intervalAdded(final ListDataEvent e) {
- }
-
- public void contentsChanged(final ListDataEvent e) {
- if (e.getIndex0() != -1) {
- return;
- }
- if (ignoreChangeEvent) {
- return;
- }
- try {
- final DefaultComboBoxModel source = (DefaultComboBoxModel) e.getSource();
- final int intSize = Integer.parseInt(((String) source.getSelectedItem()));
- styleController.setFontSize(intSize);
- }
- catch (final NumberFormatException nfe) {
- }
- }
- };
- size.addListDataListener(sizeListener);
- final ListDataListener styleListener = new ListDataListener() {
- public void intervalRemoved(final ListDataEvent e) {
- }
-
- public void intervalAdded(final ListDataEvent e) {
- }
-
- public void contentsChanged(final ListDataEvent e) {
- if (e.getIndex0() != -1) {
- return;
- }
- if (ignoreChangeEvent) {
- return;
- }
- final DefaultComboBoxModel source = (DefaultComboBoxModel) e.getSource();
- final IStyle style = (IStyle) source.getSelectedItem();
- final MLogicalStyleController controller = (MLogicalStyleController) modeController
- .getExtension(LogicalStyleController.class);
- controller.setStyle(style);
- }
- };
- styles.addListDataListener(styleListener);
- }
-
- private void changeToolbar(final NodeModel node) {
- final Controller controller = Controller.getCurrentController();
- final MNodeStyleController styleController = (MNodeStyleController) controller.getModeController()
- .getExtension(NodeStyleController.class);
- selectFontSize(Integer.toString(styleController.getFontSize(node)));
- selectFontName(styleController.getFontFamilyName(node));
- final LogicalStyleController logicalStyleController = LogicalStyleController.getController();
- ignoreChangeEvent = true;
- styles.setSelectedItem(logicalStyleController.getFirstStyle(node));
- ignoreChangeEvent = false;
- }
-
- public void nodeChanged(final NodeChangeEvent event) {
- if (event.getNode() != Controller.getCurrentController().getSelection().getSelected()) {
- return;
- }
- changeToolbar(event.getNode());
- }
-
- public void onDeselect(final NodeModel node) {
- }
-
- public void onSelect(final NodeModel node) {
- changeToolbar(node);
- }
-
- private void selectFontName(final String fontName) {
- if (ignoreChangeEvent) {
- return;
- }
- ignoreChangeEvent = true;
- fonts.setSelectedItem(fontName);
- ignoreChangeEvent = false;
- }
-
- private void selectFontSize(final String fontSize) {
- ignoreChangeEvent = true;
- size.setSelectedItem(fontSize);
- ignoreChangeEvent = false;
- }
-
- public Container createStyleBox() {
- final JComboBox stylesBox = new JComboBox(styles);
- stylesBox.setRenderer(new ComboBoxRendererWithTooltip(stylesBox));
- return stylesBox;
- }
-
- public Container createSizeBox() {
- final JComboBox sizeBox = new JComboBox(size);
- sizeBox.setPreferredSize(sizeBox.getPreferredSize());
- sizeBox.setEditor(new FixedBasicComboBoxEditor());
- sizeBox.setEditable(true);
- return sizeBox;
- }
-
- public Container createFontBox() {
- final JComboBox fontsBox = new JComboBox(fonts);
- fontsBox.setMaximumRowCount(9);
- fontsBox.setRenderer(new ComboBoxRendererWithTooltip(fontsBox));
- return fontsBox;
- }
-
- public void mapChanged(final MapChangeEvent event) {
- final Object property = event.getProperty();
- if (property.equals(MapStyle.MAP_STYLES)) {
- updateMapStyles(event.getMap());
- final Controller controller = Controller.getCurrentController();
- changeToolbar(controller.getSelection().getSelected());
- return;
- }
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void onPreNodeDelete(final NodeModel oldParent, final NodeModel selectedNode, final int index) {
- }
-
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
- updateMapStyles(newMap);
- }
-
- private void updateMapStyles(final MapModel newMap) {
- ignoreChangeEvent = true;
- styles.removeAllElements();
- if (newMap == null) {
- return;
- }
- final Collection<IStyle> styleObjects = MapStyleModel.getExtension(newMap).getStyles();
- for (final IStyle style : styleObjects) {
- styles.addElement(style);
- }
- ignoreChangeEvent = false;
- }
-
- public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/ManageNodeConditionalStylesAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/ManageNodeConditionalStylesAction.java
deleted file mode 100644
index 50a4a16..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/ManageNodeConditionalStylesAction.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.ConditionalStyleModel;
-
-/**
- * @author Dimitry Polivaev
- * Jul 21, 2011
- */
-public class ManageNodeConditionalStylesAction extends AManageConditionalStylesAction{
-
- public static final String NAME = "ManageNodeConditionalStylesAction";
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ManageNodeConditionalStylesAction() {
- super(NAME);
- }
-
- public void actionPerformed(ActionEvent e) {
- final Controller controller = Controller.getCurrentController();
- final MapModel map = controller.getMap();
- final ConditionalStyleModel conditionalStyleModel = getConditionalStyleModel();
- Component pane = createConditionalStylePane(map, conditionalStyleModel);
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.startTransaction();
- try{
- final int confirmed = JOptionPane.showConfirmDialog(controller.getMapViewManager().getMapViewComponent(), pane, TextUtils.getText(TextUtils.removeMnemonic("ManageNodeConditionalStylesAction.text")), JOptionPane.OK_CANCEL_OPTION,JOptionPane.PLAIN_MESSAGE);
- if(JOptionPane.OK_OPTION == confirmed){
- modeController.commit();
- modeController.getMapController().nodeChanged(controller.getSelection().getSelected(),NodeModel.UNKNOWN_PROPERTY,null,null);
- }
- else{
- modeController.rollback();
-
- }
- }
- catch(RuntimeException ex){
- ex.printStackTrace();
- modeController.rollback();
- }
- }
-
- @Override
- public ConditionalStyleModel getConditionalStyleModel() {
- final Controller controller = Controller.getCurrentController();
- final NodeModel node = controller.getSelection().getSelected();
- ConditionalStyleModel conditionalStyleModel = (ConditionalStyleModel) node.getExtension(ConditionalStyleModel.class);
- if(conditionalStyleModel == null){
- conditionalStyleModel = new ConditionalStyleModel();
- node.addExtension(conditionalStyleModel);
- }
- return conditionalStyleModel;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/MapBackgroundColorAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/MapBackgroundColorAction.java
deleted file mode 100644
index 7373d88..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/MapBackgroundColorAction.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.Color;
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.ColorTracker;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapStyleModel;
-
-/**
- * @author Dimitry Polivaev
- * Mar 12, 2009
- */
-class MapBackgroundColorAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * @param mapStyle
- */
- MapBackgroundColorAction() {
- super("MapBackgroundColorAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final Controller controller = Controller.getCurrentController();
- MapStyle mapStyle = (MapStyle) controller.getModeController().getExtension(MapStyle.class);
- final MapStyleModel model = (MapStyleModel) mapStyle.getMapHook();
- final Color oldBackgroundColor;
- final String colorPropertyString = ResourceController.getResourceController().getProperty(
- MapStyle.RESOURCES_BACKGROUND_COLOR);
- final Color defaultBgColor = ColorUtils.stringToColor(colorPropertyString);
- if (model != null) {
- oldBackgroundColor = model.getBackgroundColor();
- }
- else {
- oldBackgroundColor = defaultBgColor;
- }
- final Color actionColor = ColorTracker.showCommonJColorChooserDialog(controller.getSelection()
- .getSelected(), TextUtils.getText("choose_map_background_color"), oldBackgroundColor, defaultBgColor);
- mapStyle.setBackgroundColor(model, actionColor);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/NewUserStyleAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/NewUserStyleAction.java
deleted file mode 100644
index 4018ce8..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/NewUserStyleAction.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.util.ArrayList;
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.mindmapmode.MIconController.Keys;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.LogicalStyleKeys;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.StyleFactory;
-import org.freeplane.features.styles.StyleNamedObject;
-
-/**
- * @author Dimitry Polivaev
- * 02.10.2009
- */
-public class NewUserStyleAction extends AFreeplaneAction {
- public NewUserStyleAction() {
- super("NewUserStyleAction");
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
- final String styleName = JOptionPane.showInputDialog(TextUtils.getText("enter_new_style_name"));
- if (styleName == null) {
- return;
- }
- final Controller controller = Controller.getCurrentController();
- final NodeModel selectedNode = controller.getSelection().getSelected();
-
- final MapModel map = controller.getMap();
- final MapStyleModel styleModel = MapStyleModel.getExtension(map);
- final MapModel styleMap = styleModel.getStyleMap();
- final IStyle newStyle = StyleFactory.create(styleName);
- if (null != styleModel.getStyleNode(newStyle)) {
- UITools.errorMessage(TextUtils.getText("style_already_exists"));
- return;
- }
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- final NodeModel newNode = new NodeModel(styleMap);
- newNode.setUserObject(newStyle);
- final LogicalStyleController styleController = LogicalStyleController.getController();
- final ArrayList<IStyle> styles = new ArrayList<IStyle>(styleController.getStyles(selectedNode));
- for(int i = styles.size() - 1; i >= 0; i--){
- IStyle style = styles.get(i);
- if(MapStyleModel.DEFAULT_STYLE.equals(style)){
- continue;
- }
- final NodeModel styleNode = styleModel.getStyleNode(style);
- if(styleNode == null){
- continue;
- }
- Controller.getCurrentModeController().copyExtensions(LogicalStyleKeys.NODE_STYLE, styleNode, newNode);
- }
- Controller.getCurrentModeController().copyExtensions(LogicalStyleKeys.NODE_STYLE, selectedNode, newNode);
- Controller.getCurrentModeController().copyExtensions(Keys.ICONS, selectedNode, newNode);
- NodeModel userStyleParentNode = styleModel.getStyleNodeGroup(styleMap, MapStyleModel.STYLES_USER_DEFINED);
- if(userStyleParentNode == null){
- userStyleParentNode = new NodeModel(styleMap);
- userStyleParentNode.setUserObject(new StyleNamedObject(MapStyleModel.STYLES_USER_DEFINED));
- mapController.insertNode(userStyleParentNode, styleMap.getRootNode(), false, false, true);
-
- }
- mapController.insertNode(newNode, userStyleParentNode, false, false, true);
- mapController.select(newNode);
- final IActor actor = new IActor() {
- public void undo() {
- styleModel.removeStyleNode(newNode);
- styleController.refreshMap(map);
- }
-
- public String getDescription() {
- return "NewStyle";
- }
-
- public void act() {
- styleModel.addStyleNode(newNode);
- styleController.refreshMap(map);
- }
- };
- Controller.getCurrentModeController().execute(actor, styleMap);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/SetBooleanMapPropertyAction.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/SetBooleanMapPropertyAction.java
deleted file mode 100644
index ee27d7f..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/SetBooleanMapPropertyAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.MapStyle;
-
-/**
- * @author Dimitry Polivaev
- * Mar 2, 2011
- */
- at SuppressWarnings("serial")
- at SelectableAction(checkOnPopup = true)
-public class SetBooleanMapPropertyAction extends AFreeplaneAction{
-
- private String propertyName;
- public SetBooleanMapPropertyAction(String propertyName) {
- super("SetBooleanMapPropertyAction." + propertyName,
- TextUtils.getRawText("OptionPanel." + propertyName),
- null);
- this.propertyName = propertyName;
- }
-
- public void actionPerformed(ActionEvent e) {
- final Controller controller = Controller.getCurrentController();
- final NodeModel node = controller.getSelection().getSelected();
- final ModeController modeController = controller.getModeController();
- final MapStyle mapStyleController = MapStyle.getController(modeController);
- final MapModel map = node.getMap();
- final String value = mapStyleController.getPropertySetDefault(map, propertyName);
- boolean set = ! Boolean.parseBoolean(value);
- mapStyleController.setProperty(map, propertyName, Boolean.toString(set));
- setSelected(set);
- }
- @Override
- public void setSelected() {
- final Controller controller = Controller.getCurrentController();
- final NodeModel node = controller.getSelection().getSelected();
- final ModeController modeController = controller.getModeController();
- final MapStyle mapStyleController = MapStyle.getController(modeController);
- final String value = mapStyleController.getPropertySetDefault(node.getMap(), propertyName);
- boolean isSet = Boolean.parseBoolean(value);
- setSelected(isSet);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/styles/mindmapmode/StyleEditorPanel.java b/freeplane/src/org/freeplane/features/styles/mindmapmode/StyleEditorPanel.java
deleted file mode 100644
index 528c3c4..0000000
--- a/freeplane/src/org/freeplane/features/styles/mindmapmode/StyleEditorPanel.java
+++ /dev/null
@@ -1,1081 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.styles.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.HeadlessException;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.HierarchyEvent;
-import java.awt.event.HierarchyListener;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.SwingConstants;
-import javax.swing.plaf.basic.BasicButtonUI;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.BooleanProperty;
-import org.freeplane.core.resources.components.ColorProperty;
-import org.freeplane.core.resources.components.ComboProperty;
-import org.freeplane.core.resources.components.FontProperty;
-import org.freeplane.core.resources.components.IPropertyControl;
-import org.freeplane.core.resources.components.NextColumnProperty;
-import org.freeplane.core.resources.components.NextLineProperty;
-import org.freeplane.core.resources.components.NumberProperty;
-import org.freeplane.core.resources.components.SeparatorProperty;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.cloud.CloudController;
-import org.freeplane.features.cloud.CloudModel;
-import org.freeplane.features.cloud.mindmapmode.MCloudController;
-import org.freeplane.features.edge.EdgeController;
-import org.freeplane.features.edge.EdgeModel;
-import org.freeplane.features.edge.EdgeStyle;
-import org.freeplane.features.edge.mindmapmode.AutomaticEdgeColorHook;
-import org.freeplane.features.edge.mindmapmode.MEdgeController;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.format.PatternFormat;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.AMapChangeListenerAdapter;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeSizeModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
-import org.freeplane.features.styles.AutomaticLayout;
-import org.freeplane.features.styles.AutomaticLayoutController;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.LogicalStyleModel;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.features.ui.IMapViewManager;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.factories.Borders;
-import com.jgoodies.forms.layout.FormLayout;
-
-public class StyleEditorPanel extends JPanel {
- private static final NamedObject AUTOMATIC_LAYOUT_DISABLED = new NamedObject("automatic_layout_disabled");
-
- private class BgColorChangeListener extends ChangeListener {
- public BgColorChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller
- .getCurrentModeController().getExtension(
- NodeStyleController.class);
- styleController.setBackgroundColor(node, enabled ? mNodeBackgroundColor.getColorValue() : null);
- }
- }
-
- private class NodeShapeChangeListener extends ChangeListener {
- public NodeShapeChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller
- .getCurrentModeController().getExtension(
- NodeStyleController.class);
- styleController.setShape(node, enabled ? mNodeShape.getValue() : null);
- }
- }
-
- private class ColorChangeListener extends ChangeListener {
- public ColorChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller
- .getCurrentModeController().getExtension(
- NodeStyleController.class);
- styleController.setColor(node, enabled ? mNodeColor.getColorValue() : null);
- }
- }
-
- private class FontBoldChangeListener extends ChangeListener {
- public FontBoldChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller
- .getCurrentModeController().getExtension(
- NodeStyleController.class);
- styleController.setBold(node, enabled ? mNodeFontBold.getBooleanValue() : null);
- }
- }
-
- private class FontItalicChangeListener extends ChangeListener {
- public FontItalicChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller
- .getCurrentModeController().getExtension(
- NodeStyleController.class);
- styleController.setItalic(node, enabled ? mNodeFontItalic.getBooleanValue() : null);
- }
- }
-
- private class FontHyperlinkChangeListener extends ChangeListener {
- public FontHyperlinkChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MLinkController styleController = (MLinkController) Controller
- .getCurrentModeController().getExtension(
- LinkController.class);
- styleController.setFormatNodeAsHyperlink(node, enabled ? mNodeFontHyperlink.getBooleanValue() : null);
- }
- }
-
- private class FontSizeChangeListener extends ChangeListener {
- public FontSizeChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller
- .getCurrentModeController().getExtension(
- NodeStyleController.class);
- try {
- styleController.setFontSize(node, enabled ? Integer.valueOf(mNodeFontSize.getValue()) : null);
- }
- catch (NumberFormatException e) {
- }
- }
- }
-
- private class FontNameChangeListener extends ChangeListener {
- public FontNameChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller
- .getCurrentModeController().getExtension(
- NodeStyleController.class);
- styleController.setFontFamily(node, enabled ? mNodeFontName.getValue() : null);
- }
- }
-
- private class EdgeColorChangeListener extends ChangeListener {
- public EdgeColorChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MEdgeController edgeController = (MEdgeController) MEdgeController.getController();
- edgeController.setColor(node, enabled ? mEdgeColor.getColorValue() : null);
- }
- }
-
- private class EdgeStyleChangeListener extends ChangeListener {
- public EdgeStyleChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node,
- final PropertyChangeEvent evt) {
- final MEdgeController styleController = (MEdgeController) Controller
- .getCurrentModeController().getExtension(
- EdgeController.class);
- styleController.setStyle(node, enabled ? EdgeStyle.getStyle(mEdgeStyle.getValue()) : null);
- }
- }
-
- private class EdgeWidthChangeListener extends ChangeListener {
- public EdgeWidthChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MEdgeController styleController = (MEdgeController) Controller
- .getCurrentModeController().getExtension(
- EdgeController.class);
- styleController.setWidth(node, enabled ? Integer.parseInt(mEdgeWidth.getValue()): EdgeModel.DEFAULT_WIDTH);
- }
- }
-
- private class MaxNodeWidthChangeListener extends ChangeListener {
- public MaxNodeWidthChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller
- .getCurrentModeController().getExtension(NodeStyleController.class);
- styleController.setMaxNodeWidth(node, enabled ? Integer.parseInt(mMaxNodeWidth.getValue()): NodeSizeModel.NOT_SET);
- }
- }
-
- private class MinNodeWidthChangeListener extends ChangeListener {
- public MinNodeWidthChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller
- .getCurrentModeController().getExtension(NodeStyleController.class);
- styleController.setMinNodeWidth(node, enabled ? Integer.parseInt(mMinNodeWidth.getValue()): NodeSizeModel.NOT_SET);
- }
- }
-
- private class CloudColorChangeListener extends ChangeListener {
- public CloudColorChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node,
- final PropertyChangeEvent evt) {
- final MCloudController styleController = (MCloudController) Controller
- .getCurrentModeController().getExtension(
- CloudController.class);
- if (enabled) {
- styleController.setColor(node, mCloudColor.getColorValue());
- }
- else {
- styleController.setCloud(node, false);
- }
- }
- }
-
- private class CloudShapeChangeListener extends ChangeListener {
- public CloudShapeChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node,
- final PropertyChangeEvent evt) {
- final MCloudController styleController = (MCloudController) Controller
- .getCurrentModeController().getExtension(
- CloudController.class);
- if (enabled) {
- styleController.setShape(node, CloudModel.Shape.valueOf(mCloudShape.getValue()));
- }
- else {
- styleController.setCloud(node, false);
- }
- }
- }
-
- private class NodeNumberingChangeListener extends ChangeListener {
- public NodeNumberingChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller.getCurrentModeController()
- .getExtension(NodeStyleController.class);
- styleController.setNodeNumbering(node, enabled ? mNodeNumbering.getBooleanValue() : null);
- }
- }
-
- private class NodeFormatChangeListener extends ChangeListener {
- public NodeFormatChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super(mSet, mProperty);
- }
-
- @Override
- void applyValue(final boolean enabled, final NodeModel node, final PropertyChangeEvent evt) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller.getCurrentModeController()
- .getExtension(NodeStyleController.class);
- styleController.setNodeFormat(node, enabled ? mNodeFormat.getSelectedPattern() : null);
- }
- }
-
- private class StyleChangeListener implements PropertyChangeListener{
-
- public StyleChangeListener() {
- }
-
- public void propertyChange(PropertyChangeEvent evt) {
- if(internalChange){
- return;
- }
- BooleanProperty isSet = (BooleanProperty) evt.getSource();
- final MLogicalStyleController styleController = (MLogicalStyleController) LogicalStyleController.getController();
- if(isSet.getBooleanValue()){
- styleController.setStyle((IStyle) uiFactory.getStyles().getSelectedItem());
- }
- else{
- styleController.setStyle(null);
- }
- }
-
- }
- private abstract class ChangeListener implements PropertyChangeListener {
- final private IPropertyControl mProperty;
- final private BooleanProperty mSet;
-
- public ChangeListener(final BooleanProperty mSet, final IPropertyControl mProperty) {
- super();
- this.mSet = mSet;
- this.mProperty = mProperty;
- }
-
- abstract void applyValue(final boolean enabled, NodeModel node, PropertyChangeEvent evt);
-
- public void propertyChange(final PropertyChangeEvent evt) {
- if (internalChange) {
- return;
- }
- final boolean enabled;
- if (evt.getSource().equals(mSet)) {
- enabled = mSet.getBooleanValue();
- }
- else {
- assert evt.getSource().equals(mProperty);
- enabled = true;
- mSet.setValue(true);
- }
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- final Collection<NodeModel> nodes = selection.getSelection();
- if (enabled )
- internalChange = true;
- for (final NodeModel node : nodes) {
- applyValue(enabled, node, evt);
- }
- internalChange = false;
- setStyle(selection.getSelected());
- }
- }
-
- private static final String CLOUD_COLOR = "cloudcolor";
- private static final String EDGE_COLOR = "edgecolor";
- private static final String EDGE_STYLE = "edgestyle";
- private static final String CLOUD_SHAPE = "cloudshape";
- private static final String[] EDGE_STYLES = StyleEditorPanel.initializeEdgeStyles();
- private static final String[] CLOUD_SHAPES = StyleEditorPanel.initializeCloudShapes();
- private static final String EDGE_WIDTH = "edgewidth";
-// private static final String ICON = "icon";
- private static final String NODE_BACKGROUND_COLOR = "nodebackgroundcolor";
- private static final String NODE_COLOR = "nodecolor";
- private static final String NODE_FONT_BOLD = "nodefontbold";
- private static final String NODE_FONT_ITALIC = "nodefontitalic";
- private static final String NODE_FONT_HYPERLINK = "nodefonthyperlink";
- private static final String NODE_FONT_NAME = "nodefontname";
- private static final String NODE_FONT_SIZE = "nodefontsize";
- private static final String NODE_NUMBERING = "nodenumbering";
- private static final String NODE_SHAPE = "nodeshape";
- private static final String NODE_TEXT_COLOR = "standardnodetextcolor";
- private static final String NODE_FORMAT = "nodeformat";
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private static final String SET_RESOURCE = "set_property_text";
- private static final String MAX_TEXT_WIDTH = "max_node_width";
- private static final String MIN_NODE_WIDTH = "min_node_width";
-
- private static String[] initializeEdgeStyles() {
- final EdgeStyle[] enumConstants = EdgeStyle.class.getEnumConstants();
- final String[] strings = new String[enumConstants.length-1];
- for (int i = 0; i < enumConstants.length-1; i++) {
- strings[i] = enumConstants[i].toString();
- }
- return strings;
- }
-
- private static String[] initializeCloudShapes() {
- final CloudModel.Shape[] enumConstants = CloudModel.Shape.class.getEnumConstants();
- final String[] strings = new String[enumConstants.length];
- for (int i = 0; i < enumConstants.length; i++) {
- strings[i] = enumConstants[i].toString();
- }
- return strings;
- }
-
- private boolean internalChange;
- private ColorProperty mCloudColor;
- private ComboProperty mCloudShape;
- private List<IPropertyControl> mControls;
- private ColorProperty mEdgeColor;
- private ComboProperty mEdgeStyle;
- private NumberProperty mEdgeWidth;
-// private final ModeController mMindMapController;
- private ColorProperty mNodeBackgroundColor;
- private ColorProperty mNodeColor;
- private BooleanProperty mNodeFontBold;
- private BooleanProperty mNodeFontItalic;
- private BooleanProperty mNodeFontHyperlink;
- private FontProperty mNodeFontName;
- private ComboProperty mNodeFontSize;
- private BooleanProperty mNodeNumbering;
- private ComboProperty mNodeShape;
- private EditablePatternComboProperty mNodeFormat;
- private NumberProperty mMaxNodeWidth;
- private NumberProperty mMinNodeWidth;
-
-
- private BooleanProperty mSetCloud;
- private BooleanProperty mSetEdgeColor;
- private BooleanProperty mSetEdgeStyle;
- private BooleanProperty mSetEdgeWidth;
- private BooleanProperty mSetNodeBackgroundColor;
- private BooleanProperty mSetNodeColor;
- private BooleanProperty mSetNodeFontBold;
- private BooleanProperty mSetNodeFontItalic;
- private BooleanProperty mSetNodeFontHyperlink;
- private BooleanProperty mSetNodeFontName;
- private BooleanProperty mSetNodeFontSize;
- private BooleanProperty mSetNodeNumbering;
- private BooleanProperty mSetNodeShape;
- private BooleanProperty mSetNodeFormat;
- private BooleanProperty mSetStyle;
- private BooleanProperty mSetMaxNodeWidth;
- private BooleanProperty mSetMinNodeWidth;
-
-
- private final boolean addStyleBox;
- private final MUIFactory uiFactory;
- private final ModeController modeController;
- private JButton mNodeStyleButton;
- private JButton mMapStyleButton;
-
- /**
- * @throws HeadlessException
- */
- public StyleEditorPanel(final ModeController modeController, final MUIFactory uiFactory,
- final boolean addStyleBox) throws HeadlessException {
- super();
- this.modeController = modeController;
- this.addStyleBox = addStyleBox;
- this.uiFactory = uiFactory;
- addHierarchyListener(new HierarchyListener() {
-
- public void hierarchyChanged(HierarchyEvent e) {
- if(isDisplayable()){
- removeHierarchyListener(this);
- init();
- }
- }
- });
- }
-
- private void addBgColorControl(final List<IPropertyControl> controls) {
- mSetNodeBackgroundColor = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeBackgroundColor);
- mNodeBackgroundColor = new ColorProperty(StyleEditorPanel.NODE_BACKGROUND_COLOR, ResourceController
- .getResourceController().getDefaultProperty(NODE_BACKGROUND_COLOR));
- controls.add(mNodeBackgroundColor);
- final BgColorChangeListener listener = new BgColorChangeListener(mSetNodeBackgroundColor, mNodeBackgroundColor);
- mSetNodeBackgroundColor.addPropertyChangeListener(listener);
- mNodeBackgroundColor.addPropertyChangeListener(listener);
- mNodeBackgroundColor.fireOnMouseClick();
- }
-
- private void addFormatControl(final List<IPropertyControl> controls) {
- mSetNodeFormat = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeFormat);
- mNodeFormat = new EditablePatternComboProperty(StyleEditorPanel.NODE_FORMAT,
- PatternFormat.getIdentityPatternFormat(), FormatController.getController().getAllFormats());
- controls.add(mNodeFormat);
- final NodeFormatChangeListener listener = new NodeFormatChangeListener(mSetNodeFormat, mNodeFormat);
- mSetNodeFormat.addPropertyChangeListener(listener);
- mNodeFormat.addPropertyChangeListener(listener);
- mNodeFormat.fireOnMouseClick();
- }
-
- private void addNodeNumberingControl(final List<IPropertyControl> controls) {
- mSetNodeNumbering = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeNumbering);
- mNodeNumbering = new BooleanProperty(StyleEditorPanel.NODE_NUMBERING);
- controls.add(mNodeNumbering);
- final NodeNumberingChangeListener listener = new NodeNumberingChangeListener(mSetNodeNumbering, mNodeNumbering);
- mSetNodeNumbering.addPropertyChangeListener(listener);
- mNodeNumbering.addPropertyChangeListener(listener);
- mNodeNumbering.fireOnMouseClick();
- }
-
- private void addCloudColorControl(final List<IPropertyControl> controls) {
- mSetCloud = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetCloud);
- mCloudColor = new ColorProperty(StyleEditorPanel.CLOUD_COLOR, ResourceController.getResourceController()
- .getDefaultProperty(CloudController.RESOURCES_CLOUD_COLOR));
- controls.add(mCloudColor);
- final CloudColorChangeListener listener = new CloudColorChangeListener(mSetCloud, mCloudColor);
- mSetCloud.addPropertyChangeListener(listener);
- mCloudColor.addPropertyChangeListener(listener);
- mCloudColor.fireOnMouseClick();
- }
-
- private void addColorControl(final List<IPropertyControl> controls) {
- mSetNodeColor = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeColor);
- mNodeColor = new ColorProperty(StyleEditorPanel.NODE_COLOR, ResourceController.getResourceController()
- .getDefaultProperty(NODE_TEXT_COLOR));
- controls.add(mNodeColor);
- final ColorChangeListener listener = new ColorChangeListener(mSetNodeColor, mNodeColor);
- mSetNodeColor.addPropertyChangeListener(listener);
- mNodeColor.addPropertyChangeListener(listener);
- mNodeColor.fireOnMouseClick();
- }
-
- private void addEdgeColorControl(final List<IPropertyControl> controls) {
- mSetEdgeColor = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetEdgeColor);
- mEdgeColor = new ColorProperty(StyleEditorPanel.EDGE_COLOR, ColorUtils.colorToString(EdgeController.STANDARD_EDGE_COLOR));
- controls.add(mEdgeColor);
- final EdgeColorChangeListener listener = new EdgeColorChangeListener(mSetEdgeColor, mEdgeColor);
- mSetEdgeColor.addPropertyChangeListener(listener);
- mEdgeColor.addPropertyChangeListener(listener);
- mEdgeColor.fireOnMouseClick();
- }
-
- private void addEdgeStyleControl(final List<IPropertyControl> controls) {
- mSetEdgeStyle = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetEdgeStyle);
- mEdgeStyle = new ComboProperty(StyleEditorPanel.EDGE_STYLE, EDGE_STYLES);
- controls.add(mEdgeStyle);
- final EdgeStyleChangeListener listener = new EdgeStyleChangeListener(mSetEdgeStyle, mEdgeStyle);
- mSetEdgeStyle.addPropertyChangeListener(listener);
- mEdgeStyle.addPropertyChangeListener(listener);
- mEdgeStyle.fireOnMouseClick();
- }
-
- private void addCloudShapeControl(final List<IPropertyControl> controls) {
- mCloudShape = new ComboProperty(StyleEditorPanel.CLOUD_SHAPE, CLOUD_SHAPES);
- controls.add(mCloudShape);
- final CloudShapeChangeListener listener = new CloudShapeChangeListener(mSetCloud, mCloudShape);
- mSetCloud.addPropertyChangeListener(listener);
- mCloudShape.addPropertyChangeListener(listener);
- mCloudShape.fireOnMouseClick();
- }
-
- private void addEdgeWidthControl(final List<IPropertyControl> controls) {
- mSetEdgeWidth = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetEdgeWidth);
- mEdgeWidth = new NumberProperty(StyleEditorPanel.EDGE_WIDTH, 0, 100, 1);
- controls.add(mEdgeWidth);
- final EdgeWidthChangeListener listener = new EdgeWidthChangeListener(mSetEdgeWidth, mEdgeWidth);
- mSetEdgeWidth.addPropertyChangeListener(listener);
- mEdgeWidth.addPropertyChangeListener(listener);
- mEdgeWidth.fireOnMouseClick();
- }
-
- private void addMaxNodeWidthControl(final List<IPropertyControl> controls) {
- mSetMaxNodeWidth = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetMaxNodeWidth);
- mMaxNodeWidth = new NumberProperty(StyleEditorPanel.MAX_TEXT_WIDTH, 1, Integer.MAX_VALUE, 1);
- controls.add(mMaxNodeWidth);
- final MaxNodeWidthChangeListener listener = new MaxNodeWidthChangeListener(mSetMaxNodeWidth, mMaxNodeWidth);
- mSetMaxNodeWidth.addPropertyChangeListener(listener);
- mMaxNodeWidth.addPropertyChangeListener(listener);
- mMaxNodeWidth.fireOnMouseClick();
- }
-
- private void addMinNodeWidthControl(final List<IPropertyControl> controls) {
- mSetMinNodeWidth = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetMinNodeWidth);
- mMinNodeWidth = new NumberProperty(StyleEditorPanel.MIN_NODE_WIDTH, 1, Integer.MAX_VALUE, 1);
- controls.add(mMinNodeWidth);
- final MinNodeWidthChangeListener listener = new MinNodeWidthChangeListener(mSetMinNodeWidth, mMinNodeWidth);
- mSetMinNodeWidth.addPropertyChangeListener(listener);
- mMinNodeWidth.addPropertyChangeListener(listener);
- mMinNodeWidth.fireOnMouseClick();
- }
-
- private void addFontBoldControl(final List<IPropertyControl> controls) {
- mSetNodeFontBold = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeFontBold);
- mNodeFontBold = new BooleanProperty(StyleEditorPanel.NODE_FONT_BOLD);
- controls.add(mNodeFontBold);
- final FontBoldChangeListener listener = new FontBoldChangeListener(mSetNodeFontBold, mNodeFontBold);
- mSetNodeFontBold.addPropertyChangeListener(listener);
- mNodeFontBold.addPropertyChangeListener(listener);
- mNodeFontBold.fireOnMouseClick();
- }
-
- private void addFontItalicControl(final List<IPropertyControl> controls) {
- mSetNodeFontItalic = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeFontItalic);
- mNodeFontItalic = new BooleanProperty(StyleEditorPanel.NODE_FONT_ITALIC);
- controls.add(mNodeFontItalic);
- final FontItalicChangeListener listener = new FontItalicChangeListener(mSetNodeFontItalic, mNodeFontItalic);
- mSetNodeFontItalic.addPropertyChangeListener(listener);
- mNodeFontItalic.addPropertyChangeListener(listener);
- mNodeFontItalic.fireOnMouseClick();
- }
-
- private void addFontHyperlinkControl(final List<IPropertyControl> controls) {
- mSetNodeFontHyperlink = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeFontHyperlink);
- mNodeFontHyperlink = new BooleanProperty(StyleEditorPanel.NODE_FONT_HYPERLINK);
- controls.add(mNodeFontHyperlink);
- final FontHyperlinkChangeListener listener = new FontHyperlinkChangeListener(mSetNodeFontHyperlink, mNodeFontHyperlink);
- mSetNodeFontHyperlink.addPropertyChangeListener(listener);
- mNodeFontHyperlink.addPropertyChangeListener(listener);
- mNodeFontHyperlink.fireOnMouseClick();
- }
-
- private void addFontNameControl(final List<IPropertyControl> controls) {
- mSetNodeFontName = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeFontName);
- mNodeFontName = new FontProperty(StyleEditorPanel.NODE_FONT_NAME);
- controls.add(mNodeFontName);
- final FontNameChangeListener listener = new FontNameChangeListener(mSetNodeFontName, mNodeFontName);
- mSetNodeFontName.addPropertyChangeListener(listener);
- mNodeFontName.addPropertyChangeListener(listener);
- mNodeFontName.fireOnMouseClick();
- }
-
- private void addFontSizeControl(final List<IPropertyControl> controls) {
- mSetNodeFontSize = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeFontSize);
- final List<String> sizesVector = new ArrayList<String>(Arrays.asList(MUIFactory.FONT_SIZES));
- mNodeFontSize = new ComboProperty(StyleEditorPanel.NODE_FONT_SIZE, sizesVector, sizesVector);
- mNodeFontSize.setEditable(true);
- controls.add(mNodeFontSize);
- final FontSizeChangeListener listener = new FontSizeChangeListener(mSetNodeFontSize, mNodeFontSize);
- mSetNodeFontSize.addPropertyChangeListener(listener);
- mNodeFontSize.addPropertyChangeListener(listener);
- mNodeFontSize.fireOnMouseClick();
- }
-
- private void addNodeShapeControl(final List<IPropertyControl> controls) {
- mSetNodeShape = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- controls.add(mSetNodeShape);
- mNodeShape = new ComboProperty(StyleEditorPanel.NODE_SHAPE, new String[] { "fork", "bubble", "as_parent",
- "combined" });
- controls.add(mNodeShape);
- final NodeShapeChangeListener listener = new NodeShapeChangeListener(mSetNodeShape, mNodeShape);
- mSetNodeShape.addPropertyChangeListener(listener);
- mNodeShape.addPropertyChangeListener(listener);
- mNodeShape.fireOnMouseClick();
- }
-
- private List<IPropertyControl> getControls() {
- final List<IPropertyControl> controls = new ArrayList<IPropertyControl>();
- controls.add(new SeparatorProperty("OptionPanel.separator.NodeColors"));
- addColorControl(controls);
- addBgColorControl(controls);
- controls.add(new SeparatorProperty("OptionPanel.separator.NodeText"));
- addFormatControl(controls);
- addNodeNumberingControl(controls);
- controls.add(new SeparatorProperty("OptionPanel.separator.NodeShape"));
- addNodeShapeControl(controls);
- addMinNodeWidthControl(controls);
- addMaxNodeWidthControl(controls);
- controls.add(new NextLineProperty());
- controls.add(new SeparatorProperty("OptionPanel.separator.NodeFont"));
- addFontNameControl(controls);
- addFontSizeControl(controls);
- addFontBoldControl(controls);
- addFontItalicControl(controls);
- addFontHyperlinkControl(controls);
- controls.add(new NextLineProperty());
- controls.add(new SeparatorProperty("OptionPanel.separator.EdgeControls"));
- addEdgeWidthControl(controls);
- addEdgeStyleControl(controls);
- addEdgeColorControl(controls);
- controls.add(new NextLineProperty());
- controls.add(new SeparatorProperty("OptionPanel.separator.CloudControls"));
- addCloudColorControl(controls);
- controls.add(new NextLineProperty());
- controls.add(new NextColumnProperty(2));
- addCloudShapeControl(controls);
- return controls;
- }
-
-
- /**
- * Creates all controls and adds them to the frame.
- * @param modeController
- */
- private void init() {
- if(mControls != null)
- return;
- final String form = "right:max(20dlu;p), 2dlu, p, 1dlu,right:max(20dlu;p), 4dlu, 80dlu, 7dlu";
- final FormLayout rightLayout = new FormLayout(form, "");
- final DefaultFormBuilder rightBuilder = new DefaultFormBuilder(rightLayout);
- rightBuilder.setBorder(Borders.DLU2_BORDER);
- rightBuilder.appendSeparator(TextUtils.getText("OptionPanel.separator.NodeStyle"));
- if (addStyleBox) {
- addAutomaticLayout(rightBuilder);
- addStyleBox(rightBuilder);
- }
- mNodeStyleButton = addStyleButton(rightBuilder, "actual_node_styles", modeController.getAction(ManageNodeConditionalStylesAction.NAME));
- if (addStyleBox) {
- mMapStyleButton = addStyleButton(rightBuilder, "actual_map_styles", modeController.getAction(ManageMapConditionalStylesAction.NAME));
- }
- mControls = getControls();
- for (final IPropertyControl control : mControls) {
- control.layout(rightBuilder);
- }
- add(rightBuilder.getPanel(), BorderLayout.CENTER);
- addListeners();
- setFont(this, 10);
- }
-
- private JButton addStyleButton(DefaultFormBuilder rightBuilder, String label, AFreeplaneAction action) {
- final JButton button = new JButton(){
- private static final long serialVersionUID = 1L;
- {
- setUI(BasicButtonUI.createUI(this));
-
- }
- };
- button.addActionListener(action);
- button.setHorizontalAlignment(SwingConstants.LEFT);
- final String labelText = TextUtils.getText(label);
- UITools.addTitledBorder(button, labelText, 10);
- rightBuilder.append(button, rightBuilder.getColumnCount());
- rightBuilder.nextLine();
- return button;
- }
-
- private void addStyleBox(final DefaultFormBuilder rightBuilder) {
- mStyleBox = uiFactory.createStyleBox();
- mSetStyle = new BooleanProperty(StyleEditorPanel.SET_RESOURCE);
- final StyleChangeListener listener = new StyleChangeListener();
- mSetStyle.addPropertyChangeListener(listener);
- mSetStyle.layout(rightBuilder);
- rightBuilder.append(new JLabel(TextUtils.getText("style")));
- rightBuilder.append(mStyleBox);
- rightBuilder.nextLine();
- }
-
- private JComboBox mAutomaticLayoutComboBox;
- private JCheckBox mAutomaticEdgeColorCheckBox;
- private Container mStyleBox;
- private void addAutomaticLayout(final DefaultFormBuilder rightBuilder) {
- {
- if(mAutomaticLayoutComboBox == null){
- NamedObject[] automaticLayoutTypes = NamedObject.fromEnum(AutomaticLayout.class);
- mAutomaticLayoutComboBox = new JComboBox(automaticLayoutTypes);
- DefaultComboBoxModel automaticLayoutComboBoxModel = (DefaultComboBoxModel) mAutomaticLayoutComboBox.getModel();
- automaticLayoutComboBoxModel.addElement(AUTOMATIC_LAYOUT_DISABLED);
- automaticLayoutComboBoxModel.setSelectedItem(AUTOMATIC_LAYOUT_DISABLED);
- mAutomaticLayoutComboBox.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if(internalChange)
- return;
- final ModeController modeController = Controller.getCurrentModeController();
- AutomaticLayoutController al = modeController.getExtension(AutomaticLayoutController.class);
- NamedObject selectedItem = (NamedObject)mAutomaticLayoutComboBox.getSelectedItem();
- al.undoableDeactivateHook(Controller.getCurrentController().getMap().getRootNode());
- if(!selectedItem.equals(AUTOMATIC_LAYOUT_DISABLED)){
- al.undoableActivateHook(Controller.getCurrentController().getMap().getRootNode(), (AutomaticLayout) selectedItem.getObject());
- }
- }
- });
- }
- final String label = TextUtils.getText("AutomaticLayoutAction.text");
- rightBuilder.append(new JLabel(label), 5);
- rightBuilder.append(mAutomaticLayoutComboBox);
- rightBuilder.nextLine();
- }
- {
- if(mAutomaticEdgeColorCheckBox == null){
- mAutomaticEdgeColorCheckBox = new JCheckBox();
- mAutomaticEdgeColorCheckBox.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- AutomaticEdgeColorHook al = (AutomaticEdgeColorHook) modeController.getExtension(AutomaticEdgeColorHook.class);
- al.undoableToggleHook(Controller.getCurrentController().getMap().getRootNode());
- }
- });
- }
- final String label = TextUtils.getText("AutomaticEdgeColorHookAction.text");
- rightBuilder.append(new JLabel(label), 5);
- rightBuilder.append(mAutomaticEdgeColorCheckBox);
- rightBuilder.nextLine();
- }
- }
-
- private void setFont(Container c, float size) {
- c.setFont(c.getFont().deriveFont(size));
- for(int i = 0; i < c.getComponentCount(); i++){
- setFont((Container) c.getComponent(i), size);
- }
- }
-
- public void setStyle( final NodeModel node) {
- if (internalChange) {
- return;
- }
- internalChange = true;
- try {
- final LogicalStyleController logicalStyleController = LogicalStyleController.getController();
- if(addStyleBox){
- final boolean isStyleSet = LogicalStyleModel.getStyle(node) != null;
- mSetStyle.setValue(isStyleSet);
- setStyleList(mMapStyleButton, logicalStyleController.getMapStyleNames(node, "\n"));
- }
- setStyleList(mNodeStyleButton, logicalStyleController.getNodeStyleNames(node, "\n"));
- final NodeStyleController styleController = NodeStyleController.getController();
- {
- final Color nodeColor = NodeStyleModel.getColor(node);
- final Color viewNodeColor = styleController.getColor(node);
- mSetNodeColor.setValue(nodeColor != null);
- mNodeColor.setColorValue(viewNodeColor);
- }
- {
- final Color color = NodeStyleModel.getBackgroundColor(node);
- final Color viewColor = styleController.getBackgroundColor(node);
- mSetNodeBackgroundColor.setValue(color != null);
- mNodeBackgroundColor.setColorValue(viewColor != null ? viewColor : Controller.getCurrentController()
- .getMapViewManager().getBackgroundColor(node));
- }
- {
- final String shape = NodeStyleModel.getShape(node);
- final String viewShape = styleController.getShape(node);
- mSetNodeShape.setValue(shape != null);
- mNodeShape.setValue(viewShape);
- }
- final NodeSizeModel nodeSizeModel = NodeSizeModel.getModel(node);
- {
- final int width = nodeSizeModel != null ? nodeSizeModel.getMaxNodeWidth() : NodeSizeModel.NOT_SET;
- final int viewWidth = styleController.getMaxWidth(node);
- mSetMaxNodeWidth.setValue(width != NodeSizeModel.NOT_SET);
- mMaxNodeWidth.setValue(Integer.toString(viewWidth));
- }
- {
- final int width = nodeSizeModel != null ? nodeSizeModel.getMinNodeWidth() : NodeSizeModel.NOT_SET;
- final int viewWidth = styleController.getMinWidth(node);
- mSetMinNodeWidth.setValue(width != NodeSizeModel.NOT_SET);
- mMinNodeWidth.setValue(Integer.toString(viewWidth));
- }
- final EdgeController edgeController = EdgeController.getController();
- final EdgeModel edgeModel = EdgeModel.getModel(node);
- {
- final Color edgeColor = edgeModel != null ? edgeModel.getColor() : null;
- final Color viewColor = edgeController.getColor(node);
- mSetEdgeColor.setValue(edgeColor != null);
- mEdgeColor.setColorValue(viewColor);
- }
- {
- final EdgeStyle style = edgeModel != null ? edgeModel.getStyle() : null;
- final EdgeStyle viewStyle = edgeController.getStyle(node);
- mSetEdgeStyle.setValue(style != null);
- mEdgeStyle.setValue(viewStyle.toString());
- }
- {
- final int width = edgeModel != null ? edgeModel.getWidth() : EdgeModel.DEFAULT_WIDTH;
- final int viewWidth = edgeController.getWidth(node);
- mSetEdgeWidth.setValue(width != EdgeModel.DEFAULT_WIDTH);
- mEdgeWidth.setValue(Integer.toString(viewWidth));
- }
- {
- final CloudController cloudController = CloudController.getController();
- final CloudModel cloudModel = CloudModel.getModel(node);
- final Color viewCloudColor = cloudController.getColor(node);
- mSetCloud.setValue(cloudModel != null);
- mCloudColor.setColorValue(viewCloudColor);
-
- final CloudModel.Shape viewCloudShape = cloudController.getShape(node);
- mCloudShape.setValue(viewCloudShape != null ? viewCloudShape.toString() : CloudModel.Shape.ARC.toString());
- }
- {
- final String fontFamilyName = NodeStyleModel.getFontFamilyName(node);
- final String viewFontFamilyName = styleController.getFontFamilyName(node);
- mSetNodeFontName.setValue(fontFamilyName != null);
- mNodeFontName.setValue(viewFontFamilyName);
- }
- {
- final Integer fontSize = NodeStyleModel.getFontSize(node);
- final Integer viewfontSize = styleController.getFontSize(node);
- mSetNodeFontSize.setValue(fontSize != null);
- mNodeFontSize.setValue(viewfontSize.toString());
- }
- {
- final Boolean bold = NodeStyleModel.isBold(node);
- final Boolean viewbold = styleController.isBold(node);
- mSetNodeFontBold.setValue(bold != null);
- mNodeFontBold.setValue(viewbold);
- }
- {
- final Boolean italic = NodeStyleModel.isItalic(node);
- final Boolean viewitalic = styleController.isItalic(node);
- mSetNodeFontItalic.setValue(italic != null);
- mNodeFontItalic.setValue(viewitalic);
- }
- {
- final Boolean hyperlink = NodeLinks.formatNodeAsHyperlink(node);
- final Boolean viewhyperlink = LinkController.getController().formatNodeAsHyperlink(node);
- mSetNodeFontHyperlink.setValue(hyperlink != null);
- mNodeFontHyperlink.setValue(viewhyperlink);
- }
- {
- final Boolean nodeNumbering = NodeStyleModel.getNodeNumbering(node);
- final Boolean viewNodeNumbering = styleController.getNodeNumbering(node);
- mSetNodeNumbering.setValue(nodeNumbering != null);
- mNodeNumbering.setValue(viewNodeNumbering);
- }
- {
- String nodeFormat = NodeStyleModel.getNodeFormat(node);
- String viewNodeFormat = TextController.getController().getNodeFormat(node);
- mSetNodeFormat.setValue(nodeFormat != null);
- if (viewNodeFormat == null && node.getUserObject() instanceof IFormattedObject)
- viewNodeFormat = ((IFormattedObject)node.getUserObject()).getPattern();
- mNodeFormat.setValue(viewNodeFormat);
- }
- if(mAutomaticLayoutComboBox != null){
- final ModeController modeController = Controller.getCurrentModeController();
- AutomaticLayoutController al = modeController.getExtension(AutomaticLayoutController.class);
- IExtension extension = al.getExtension(node);
- if(extension == null)
- mAutomaticLayoutComboBox.setSelectedItem(AUTOMATIC_LAYOUT_DISABLED);
- else
- mAutomaticLayoutComboBox.setSelectedIndex(((AutomaticLayout)extension).ordinal());
- }
- if(mAutomaticEdgeColorCheckBox != null){
- final ModeController modeController = Controller.getCurrentModeController();
- AutomaticEdgeColorHook al = (AutomaticEdgeColorHook) modeController.getExtension(AutomaticEdgeColorHook.class);
- mAutomaticEdgeColorCheckBox.setSelected(al.isActive(node));
- }
- }
- finally {
- internalChange = false;
- }
- }
-
- private void setStyleList(JButton btn, String styles) {
- if("".equals(styles)){
- btn.setToolTipText(null);
- btn.setText(" ");
- return;
- }
- btn.setToolTipText(HtmlUtils.plainToHTML(styles));
- final String text = styles.replaceAll("\n", ", ");
- btn.setText(text);
- }
-
- private void addListeners() {
- final Controller controller = Controller.getCurrentController();
- final ModeController modeController = Controller.getCurrentModeController();
- final MapController mapController = modeController.getMapController();
- mapController.addNodeSelectionListener(new INodeSelectionListener() {
- public void onSelect(final NodeModel node) {
- final IMapSelection selection = controller.getSelection();
- if (selection == null) {
- return;
- }
- if (selection.size() == 1) {
- setStyle(node);
- }
- }
-
- public void onDeselect(final NodeModel node) {
- }
- });
- mapController.addNodeChangeListener(new INodeChangeListener() {
- public void nodeChanged(final NodeChangeEvent event) {
- final IMapSelection selection = controller.getSelection();
- if (selection == null) {
- return;
- }
- final NodeModel node = event.getNode();
- if (selection.getSelected().equals(node)) {
- setStyle(node);
- }
- }
- });
- mapController.addMapChangeListener(new AMapChangeListenerAdapter() {
-
- @Override
- public void mapChanged(MapChangeEvent event) {
- if(! MapStyle.MAP_STYLES.equals(event.getProperty()))
- return;
- final IMapSelection selection = controller.getSelection();
- if (selection == null) {
- return;
- }
- final NodeModel node = selection.getSelected();
- setStyle(node);
- }
-
- });
- final IMapViewManager mapViewManager = controller.getMapViewManager();
- mapViewManager.addMapViewChangeListener(new IMapViewChangeListener() {
- public void beforeViewChange(final Component oldView, final Component newView) {
- }
-
- public void afterViewCreated(final Component mapView) {
- }
-
- public void afterViewClose(final Component oldView) {
- }
-
- public void afterViewChange(final Component oldView, final Component newView) {
- final Container panel = (Container) getComponent(0);
- for (int i = 0; i < panel.getComponentCount(); i++) {
- panel.getComponent(i).setEnabled(newView != null);
- }
- }
- });
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/DetailTextModel.java b/freeplane/src/org/freeplane/features/text/DetailTextModel.java
deleted file mode 100644
index 3498080..0000000
--- a/freeplane/src/org/freeplane/features/text/DetailTextModel.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- */
-public class DetailTextModel extends RichTextModel implements IExtension {
- public static final String EDITING_PURPOSE = "DetailText";
- private boolean hidden = false;
- public DetailTextModel(boolean hidden) {
- this.hidden = hidden;
- }
-
- public boolean isHidden() {
- return hidden;
- }
-
- public void setHidden(boolean hidden) {
- this.hidden = hidden;
- }
-
- public static DetailTextModel createDetailText(final NodeModel node) {
- DetailTextModel details = DetailTextModel.getDetailText(node);
- if (details == null) {
- details = new DetailTextModel(false);
- node.addExtension(details);
- }
- return details;
- }
-
- public static DetailTextModel getDetailText(final NodeModel node) {
- final DetailTextModel extension = (DetailTextModel) node.getExtension(DetailTextModel.class);
- return extension;
- }
-
- public static String getDetailTextText(final NodeModel node) {
- final DetailTextModel extension = DetailTextModel.getDetailText(node);
- return extension != null ? extension.getHtml() : null;
- }
-
- public static String getXmlDetailTextText(final NodeModel node) {
- final DetailTextModel extension = DetailTextModel.getDetailText(node);
- return extension != null ? extension.getHtml() : null;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/text/FormatContentTransformer.java b/freeplane/src/org/freeplane/features/text/FormatContentTransformer.java
deleted file mode 100644
index 8eca60b..0000000
--- a/freeplane/src/org/freeplane/features/text/FormatContentTransformer.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package org.freeplane.features.text;
-
-import java.util.List;
-
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.PatternFormat;
-import org.freeplane.features.map.NodeModel;
-
-class FormatContentTransformer extends AbstractContentTransformer {
- final private TextController textController;
-
- public FormatContentTransformer(final TextController textController, final int priority) {
- super(priority);
- this.textController = textController;
- }
-
- public Object transformContent(TextController textController, Object obj, final NodeModel node, Object transformedExtension) {
- if (obj == null || node.getUserObject() != transformedExtension)
- return obj;
- final String format = textController.getNodeFormat(node);
- final boolean nodeNumbering = textController.getNodeNumbering(node);
- return expandFormat(obj, node, format, nodeNumbering);
- }
-
- private Object expandFormat(Object obj, final NodeModel node, final String format, boolean nodeNumbering) {
- final boolean hasFormat = format != null && format.length() != 0 && !PatternFormat.IDENTITY_PATTERN.equals(format);
- if (!hasFormat && !nodeNumbering){
- return obj;
- }
- // - if html: strip html header
- // - if number or date format: Scanner.scan
- // - format/expand
- // - if error: use original text
- // - if nodeNumbering add numbering
- // - if html: enclose in html tag
- final boolean isHtml = (obj instanceof String) && HtmlUtils.isHtmlNode((String)obj);
- if (isHtml) {
- obj = HtmlUtils.extractRawBody((String)obj);
- }
- if (hasFormat)
- obj = FormatController.format(obj, format);
- if (nodeNumbering && !node.isRoot()){
- StringBuilder builder = new StringBuilder(node.getNodeLevel(true) * 2);
- getPathToRoot(builder, node);
- builder.append(' ');
- if (isHtml) {
- obj = insertPrefix(obj.toString(), builder.toString());
- }
- else{
- obj = builder.toString() + obj;
- }
- }
- if (isHtml)
- obj = "<html><head></head><body>" + obj + "</body></html>";
- return obj.toString();
- }
-
- private String insertPrefix(String html, String prefix) {
- StringBuilder sb = new StringBuilder(html.length() + prefix.length() + 1);
- int i = 0;
- int level = 0;
- WHILE: while(i < html.length()){
- final char c = html.charAt(i);
- switch(c){
- case '<': level++; break;
- case '>': level--; break;
- default:
- if(level == 0 && ! Character.isWhitespace(c))
- break WHILE;
- }
- i++;
- }
- sb.append(html.subSequence(0, i));
- sb.append(prefix);
- sb.append(html.subSequence(i, html.length()));
- return sb.toString();
- }
-
- private void getPathToRoot(StringBuilder builder, NodeModel node) {
- final NodeModel parentNode = node.getParentNode();
- if(parentNode == null)
- return;
- if( textController.getNodeNumbering(parentNode)){
- getPathToRoot(builder, parentNode);
- if (builder.length() > 0)
- builder.append('.');
- }
- final List<NodeModel> children = parentNode.getChildren();
- int counter = 1;
- for (NodeModel child : children) {
- if(child.createID().equals(node.createID()))
- break;
- if(textController.getNodeNumbering(child))
- counter++;
- }
- builder.append(counter);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/MatchCaseNodeContainsCondition.java b/freeplane/src/org/freeplane/features/text/MatchCaseNodeContainsCondition.java
deleted file mode 100644
index 7575e4b..0000000
--- a/freeplane/src/org/freeplane/features/text/MatchCaseNodeContainsCondition.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.ExactStringMatchingStrategy;
-import org.freeplane.features.filter.StringMatchingStrategy;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class MatchCaseNodeContainsCondition extends ASelectableCondition {
- static final String NAME = "match_case_node_contains_condition";
- static final String VALUE = "VALUE";
- static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
-
- static ASelectableCondition load(final XMLElement element) {
- return new MatchCaseNodeContainsCondition(
- element.getAttribute(NodeTextCompareCondition.ITEM, TextController.FILTER_NODE),
- element.getAttribute(MatchCaseNodeContainsCondition.VALUE, null),
- Boolean.valueOf(element.getAttribute(MatchCaseNodeContainsCondition.MATCH_APPROXIMATELY, null))
-);
- }
-
- final private String value;
- final private String nodeItem;
- final private boolean matchApproximately;
- final private StringMatchingStrategy stringMatchingStrategy;
-
- MatchCaseNodeContainsCondition(String nodeItem, final String value,
- final boolean matchApproximately) {
- super();
- this.value = value;
- this.nodeItem = nodeItem;
- this.matchApproximately = matchApproximately;
- this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- }
-
- public boolean checkNode(final NodeModel node) {
- final Object content[] = NodeTextConditionController.getItemsForComparison(nodeItem, node);
- return checkText(content);
- }
-
- private boolean checkText(Object content[]) {
- for(Object o : content){
- if(checkText(o))
- return true;
- }
- return false;
- }
-
- private boolean checkText(final Object o) {
- //return o != null && o.toString().contains(value);
- return o != null && stringMatchingStrategy.matches(value, o.toString(), true, true);
- }
-
- @Override
- protected String createDescription() {
- final String nodeCondition = TextUtils.getText(nodeItem);
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
- return ConditionFactory.createDescription(nodeCondition, simpleCondition, value, true, matchApproximately);
- }
-
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(MatchCaseNodeContainsCondition.VALUE, value);
- child.setAttribute(NodeTextCompareCondition.ITEM, nodeItem);
- child.setAttribute(MatchCaseNodeContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/MatchCaseNoteContainsCondition.java b/freeplane/src/org/freeplane/features/text/MatchCaseNoteContainsCondition.java
deleted file mode 100644
index 7e29f4d..0000000
--- a/freeplane/src/org/freeplane/features/text/MatchCaseNoteContainsCondition.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.ExactStringMatchingStrategy;
-import org.freeplane.features.filter.StringMatchingStrategy;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class MatchCaseNoteContainsCondition extends ASelectableCondition {
- static final String NAME = "match_case_note_contains_condition";
- static final String VALUE = "VALUE";
- static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
-
- static ASelectableCondition load(final XMLElement element) {
- return new MatchCaseNoteContainsCondition(element.getAttribute(MatchCaseNoteContainsCondition.VALUE, null),
- Boolean.valueOf(element.getAttribute(MatchCaseNoteContainsCondition.MATCH_APPROXIMATELY, null)));
- }
-
- final private String value;
- final boolean matchApproximately;
- final StringMatchingStrategy stringMatchingStrategy;
-
- protected boolean matchCase()
- {
- return true;
- }
-
- MatchCaseNoteContainsCondition(final String value, final boolean matchApproximately) {
- super();
- this.value = value;
- this.matchApproximately = matchApproximately;
- this.stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- }
-
- public boolean checkNode(final NodeModel node) {
- final String text = getText(node);
- if (text == null) {
- return false;
- }
- //return text.indexOf(value) > -1;
- return stringMatchingStrategy.matches(value, text, true, matchCase());
- }
-
- @Override
- protected String createDescription() {
- return createDescription(true);
- }
-
- protected String createDescription(final boolean matchCase) {
- final String nodeCondition = TextUtils.getText(TextController.FILTER_NOTE);
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
- return ConditionFactory.createDescription(nodeCondition, simpleCondition, value, matchCase, matchApproximately);
- }
-
- protected String getText(final NodeModel node) {
- final String noteText = NoteModel.getNoteText(node);
- return noteText == null ? null : HtmlUtils.htmlToPlain(noteText);
- }
-
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(MatchCaseNoteContainsCondition.VALUE, value);
- child.setAttribute(MatchCaseNodeContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/text/NodeContainsCondition.java b/freeplane/src/org/freeplane/features/text/NodeContainsCondition.java
deleted file mode 100644
index ec30bba..0000000
--- a/freeplane/src/org/freeplane/features/text/NodeContainsCondition.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.ExactStringMatchingStrategy;
-import org.freeplane.features.filter.StringMatchingStrategy;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class NodeContainsCondition extends ASelectableCondition {
- static final String NAME = "node_contains_condition";
- static final String VALUE = "VALUE";
- static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
-
- static ASelectableCondition load(final XMLElement element) {
- return new NodeContainsCondition(
- element.getAttribute(NodeTextCompareCondition.ITEM, TextController.FILTER_NODE),
- element.getAttribute(NodeContainsCondition.VALUE, null),
- Boolean.valueOf(element.getAttribute(NodeContainsCondition.MATCH_APPROXIMATELY, null)));
- }
-
- final private String value;
- final private String nodeItem;
- //final private String valueLowerCase;
- final private boolean matchApproximately;
- final StringMatchingStrategy stringMatchingStrategy;
-
- public NodeContainsCondition(String nodeItem, final String value, final boolean matchApproximately) {
- super();
- this.value = value;
- //this.valueLowerCase = value.toLowerCase();
- this.nodeItem = nodeItem;
- this.matchApproximately = matchApproximately;
- stringMatchingStrategy = matchApproximately ? StringMatchingStrategy.DEFAULT_APPROXIMATE_STRING_MATCHING_STRATEGY :
- new ExactStringMatchingStrategy();
- }
-
- public boolean checkNode(final NodeModel node) {
- final Object content[] = NodeTextConditionController.getItemsForComparison(nodeItem, node);
- return checkText(content);
- }
-
- private boolean checkText(Object content[]) {
- for(Object o : content){
- if(checkText(o))
- return true;
- }
- return false;
- }
-
- private boolean checkText(final Object o) {
- //return o != null && o.toString().toLowerCase().indexOf(valueLowerCase) > -1;
- return o != null && stringMatchingStrategy.matches(value, o.toString(), true, false);
- }
-
- @Override
- protected String createDescription() {
- final String nodeCondition = TextUtils.getText(nodeItem);
- final String simpleCondition = TextUtils.getText(ConditionFactory.FILTER_CONTAINS);
- return ConditionFactory.createDescription(nodeCondition, simpleCondition, value, false, matchApproximately);
- }
-
- @Override
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(NodeContainsCondition.VALUE, value);
- child.setAttribute(NodeTextCompareCondition.ITEM, nodeItem);
- child.setAttribute(NodeContainsCondition.MATCH_APPROXIMATELY, Boolean.toString(matchApproximately));
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/NodeTextBuilder.java b/freeplane/src/org/freeplane/features/text/NodeTextBuilder.java
deleted file mode 100644
index 7b2be68..0000000
--- a/freeplane/src/org/freeplane/features/text/NodeTextBuilder.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import java.io.IOException;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IAttributeWriter;
-import org.freeplane.core.io.IElementContentHandler;
-import org.freeplane.core.io.IElementWriter;
-import org.freeplane.core.io.IExtensionAttributeWriter;
-import org.freeplane.core.io.IExtensionElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TypeReference;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.map.MapWriter;
-import org.freeplane.features.map.NodeBuilder;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.styles.StyleFactory;
-import org.freeplane.features.styles.StyleNamedObject;
-import org.freeplane.features.styles.StyleString;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class NodeTextBuilder implements IElementContentHandler, IElementWriter, IAttributeWriter, IExtensionElementWriter, IExtensionAttributeWriter {
- public static final String XML_NODE_TEXT = "TEXT";
- public static final String XML_NODE_LOCALIZED_TEXT = "LOCALIZED_TEXT";
- public static final String XML_NODE_XHTML_CONTENT_TAG = "richcontent";
- public static final String XML_NODE_XHTML_TYPE_NODE = "NODE";
- public static final String XML_NODE_XHTML_TYPE_NOTE = "NOTE";
- public static final String XML_NODE_XHTML_TYPE_DETAILS = "DETAILS";
- public static final String XML_NODE_XHTML_TYPE_TAG = "TYPE";
- public static final String XML_NODE_OBJECT = "OBJECT";
- private static final String XML_NODE_TEXT_SHORTENED = "TEXT_SHORTENED";
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (attributes == null) {
- return null;
- }
- final Object typeAttribute = attributes.getAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, null);
- if (NodeTextBuilder.XML_NODE_XHTML_TYPE_NODE.equals(typeAttribute)
- || NodeTextBuilder.XML_NODE_XHTML_TYPE_DETAILS.equals(typeAttribute)) {
- return parent;
- }
- return null;
- }
-
- public void endElement(final Object parent, final String tag, final Object obj, final XMLElement attributes,
- final String content) {
- assert tag.equals("richcontent");
- final String xmlText = content.trim();
- final Object typeAttribute = attributes.getAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, null);
- final NodeModel nodeModel = (NodeModel) obj;
- if (NodeTextBuilder.XML_NODE_XHTML_TYPE_NODE.equals(typeAttribute)) {
- nodeModel.setXmlText(xmlText);
- }
- else if (NodeTextBuilder.XML_NODE_XHTML_TYPE_DETAILS.equals(typeAttribute)) {
- final DetailTextModel note = new DetailTextModel("true".equals(attributes.getAttribute("HIDDEN", "false")));
- note.setXml(xmlText);
- nodeModel.addExtension((IExtension) note);
- }
- }
-
- private void registerAttributeHandlers(final ReadManager reader) {
- reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeTextBuilder.XML_NODE_TEXT, new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = ((NodeModel) userObject);
- final Object nodeContent = node.getUserObject();
- if(nodeContent == null || nodeContent.equals("")){
- node.setText(value);
- }
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeTextBuilder.XML_NODE_OBJECT, new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = ((NodeModel) userObject);
- final Object newInstance = TypeReference.create(value);
- // work around for old maps :
- // actually we do not need IFormattedObject as user objects
- // because formatting is saved as an extra attribute
- if(newInstance instanceof IFormattedObject)
- node.setUserObject(((IFormattedObject) newInstance).getObject());
- else
- node.setUserObject(newInstance);
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeTextBuilder.XML_NODE_TEXT_SHORTENED, new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = ((NodeModel) userObject);
- try {
- if(Boolean.valueOf(value)){
- node.addExtension(new ShortenedTextModel());
- }
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, NodeTextBuilder.XML_NODE_TEXT, new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = ((NodeModel) userObject);
- node.setUserObject(StyleFactory.create(value));
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_NODE, NodeTextBuilder.XML_NODE_LOCALIZED_TEXT, new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = ((NodeModel) userObject);
- node.setUserObject(StyleFactory.create(NamedObject.format(value)));
- }
- });
- reader.addAttributeHandler(NodeBuilder.XML_STYLENODE, NodeTextBuilder.XML_NODE_LOCALIZED_TEXT, new IAttributeHandler() {
- public void setAttribute(final Object userObject, final String value) {
- final NodeModel node = ((NodeModel) userObject);
- node.setUserObject(StyleFactory.create(NamedObject.format(value)));
- }
- });
- }
-
- /**
- * @param writeManager
- */
- public void registerBy(final ReadManager reader, final WriteManager writeManager) {
- registerAttributeHandlers(reader);
- reader.addElementHandler("richcontent", this);
- writeManager.addElementWriter(NodeBuilder.XML_NODE, this);
- writeManager.addElementWriter(NodeBuilder.XML_STYLENODE, this);
- writeManager.addAttributeWriter(NodeBuilder.XML_NODE, this);
- writeManager.addAttributeWriter(NodeBuilder.XML_STYLENODE, this);
- }
-
- private static class TransformedXMLExtension implements IExtension{
- final String xml;
-
- public TransformedXMLExtension(String html) {
- super();
- this.xml = HtmlUtils.toXhtml(html);
- }
- }
- public void writeAttributes(final ITreeWriter writer, final Object userObject, final String tag) {
- final NodeModel node = (NodeModel) userObject;
- final Object data = node.getUserObject();
- if(data == null)
- return;
- final Class<? extends Object> dataClass = data.getClass();
- if (dataClass.equals(StyleNamedObject.class)) {
- writer.addAttribute(NodeTextBuilder.XML_NODE_LOCALIZED_TEXT, ((StyleNamedObject) data).getObject().toString());
- return;
- }
- if (dataClass.equals(NamedObject.class)) {
- writer.addAttribute(NodeTextBuilder.XML_NODE_LOCALIZED_TEXT, ((NamedObject) data).getObject().toString());
- return;
- }
- final boolean forceFormatting = Boolean.TRUE.equals(writer.getHint(MapWriter.WriterHint.FORCE_FORMATTING));
- if (forceFormatting) {
- final String text = TextController.getController().getTransformedTextNoThrow(data, node, data);
- if (!HtmlUtils.isHtmlNode(text)) {
- writer.addAttribute(NodeTextBuilder.XML_NODE_TEXT, text.replace('\0', ' '));
- }
- else{
- node.addExtension(new TransformedXMLExtension(text));
- }
- }
- else{
- final String text = data.toString();
- if (node.getXmlText() == null) {
- writer.addAttribute(NodeTextBuilder.XML_NODE_TEXT, text.replace('\0', ' '));
- }
- if(! (data instanceof String || data instanceof StyleString)){
- writer.addAttribute(XML_NODE_OBJECT, TypeReference.toSpec(data));
- }
- }
- }
-
- public void writeContent(final ITreeWriter writer, final Object element, final String tag) throws IOException {
- final NodeModel node = (NodeModel) element;
- final TransformedXMLExtension transformedXML = (TransformedXMLExtension) node.getExtension(TransformedXMLExtension.class);
- if (transformedXML != null || node.getXmlText() != null) {
- final XMLElement htmlElement = new XMLElement();
- htmlElement.setName(NodeTextBuilder.XML_NODE_XHTML_CONTENT_TAG);
- htmlElement.setAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, NodeTextBuilder.XML_NODE_XHTML_TYPE_NODE);
- final String xmlText;
- if (transformedXML != null){
- xmlText = transformedXML.xml;
- node.removeExtension(transformedXML);
- }
- else
- xmlText = node.getXmlText();
- final String content = xmlText.replace('\0', ' ');
- writer.addElement('\n' + content + '\n', htmlElement);
- }
- }
- /*
- * (non-Javadoc)
- * @see freeplane.io.INodeWriter#saveContent(freeplane.io.ITreeWriter,
- * java.lang.Object, java.lang.String)
- */
- public void writeContent(final ITreeWriter writer, final Object element, final IExtension note) throws IOException {
- DetailTextModel model = (DetailTextModel) note;
- if (model.getXml() != null) {
- final XMLElement htmlElement = new XMLElement();
- htmlElement.setName(NodeTextBuilder.XML_NODE_XHTML_CONTENT_TAG);
- htmlElement.setAttribute(NodeTextBuilder.XML_NODE_XHTML_TYPE_TAG, NodeTextBuilder.XML_NODE_XHTML_TYPE_DETAILS);
- if(model.isHidden()){
- htmlElement.setAttribute("HIDDEN", "true");
- }
- final String content = model.getXml().replace('\0', ' ');
- writer.addElement('\n' + content + '\n', htmlElement);
- }
- return;
- }
-
- public void writeAttributes(ITreeWriter writer, Object userObject, IExtension extension) {
- writer.addAttribute(XML_NODE_TEXT_SHORTENED, Boolean.TRUE.toString());
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/NodeTextCompareCondition.java b/freeplane/src/org/freeplane/features/text/NodeTextCompareCondition.java
deleted file mode 100644
index 2d05bba..0000000
--- a/freeplane/src/org/freeplane/features/text/NodeTextCompareCondition.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import org.freeplane.core.io.xml.TreeXmlReader;
-import org.freeplane.core.io.xml.TreeXmlWriter;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.TypeReference;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.CompareConditionAdapter;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class NodeTextCompareCondition extends CompareConditionAdapter {
- static final String COMPARATION_RESULT = "COMPARATION_RESULT";
- static final String NAME = "node_compare_condition";
- static final String SUCCEED = "SUCCEED";
- static final String MATCH_APPROXIMATELY = "MATCH_APPROXIMATELY";
- static final String VALUE = "VALUE";
- static final String ITEM = "ITEM";
-
- static ASelectableCondition load(final XMLElement element) {
- final String item = element.getAttribute(NodeTextCompareCondition.ITEM, TextController.FILTER_NODE);
- final String valueString = element.getAttribute(NodeTextCompareCondition.VALUE, null);
- final Object value;
- if(valueString != null)
- value = valueString;
- else{
- final String object = element.getAttribute(NodeTextCompareCondition.OBJECT, null);
- value = TypeReference.create(object);
- }
- final boolean matchCase = TreeXmlReader.xmlToBoolean(element.getAttribute(CompareConditionAdapter.MATCH_CASE, null));
- final int compResult = Integer.parseInt(element.getAttribute(NodeTextCompareCondition.COMPARATION_RESULT, null));
- final boolean succeed = TreeXmlReader.xmlToBoolean(element.getAttribute(NodeTextCompareCondition.SUCCEED, null));
- final boolean matchApproximately = TreeXmlReader.xmlToBoolean(element.getAttribute(NodeTextCompareCondition.MATCH_APPROXIMATELY, null));
- return new NodeTextCompareCondition(
- item,
- value,
- matchCase,
- compResult,
- succeed,
- matchApproximately);
- }
-
- final private int comparationResult;
- final private boolean succeed;
- final private String nodeItem;
-
- NodeTextCompareCondition(String nodeItem, final Object value, final boolean matchCase, final int comparationResult,
- final boolean succeed, final boolean matchApproximately) {
- super(value, matchCase, matchApproximately);
- this.comparationResult = comparationResult;
- this.succeed = succeed;
- this.nodeItem=nodeItem;
- }
-
- public boolean isEqualityCondition()
- {
- return comparationResult == 0;
- }
-
- public boolean checkNode(final NodeModel node) {
- final Object content[] = NodeTextConditionController.getItemsForComparison(nodeItem, node);
- return content != null && checkText(content);
- }
-
- private boolean checkText(Object content[]) {
- for(Object o : content){
- if(o != null && checkText(o.toString()))
- return true;
- }
- return false;
- }
-
- private boolean checkText(final Object plainTextContent) {
- try {
- compareTo(plainTextContent);
- return isComparisonOK() && succeed == (getComparisonResult() == comparationResult);
- }
- catch (final NumberFormatException e) {
- return false;
- }
- }
-
- @Override
- protected String createDescription() {
- final String nodeCondition = TextUtils.getText(nodeItem);
- return super.createDescription(nodeCondition, comparationResult, succeed);
- }
-
- public void fillXML(final XMLElement child) {
- super.fillXML(child);
- child.setAttribute(NodeTextCompareCondition.COMPARATION_RESULT, Integer.toString(comparationResult));
- child.setAttribute(NodeTextCompareCondition.SUCCEED, TreeXmlWriter.BooleanToXml(succeed));
- child.setAttribute(NodeTextCompareCondition.ITEM, nodeItem);
- child.setAttribute(NodeTextCompareCondition.MATCH_APPROXIMATELY, TreeXmlWriter.BooleanToXml(matchApproximately));
- }
-
- @Override
- protected String getName() {
- return NAME;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/NodeTextConditionController.java b/freeplane/src/org/freeplane/features/text/NodeTextConditionController.java
deleted file mode 100644
index 6719db5..0000000
--- a/freeplane/src/org/freeplane/features/text/NodeTextConditionController.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import java.util.regex.PatternSyntaxException;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.ui.FixedBasicComboBoxEditor;
-import org.freeplane.core.ui.components.TypedListCellRenderer;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.ConditionFactory;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.features.ui.FrameController;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * 21.12.2008
- */
-class NodeTextConditionController implements IElementaryConditionController {
- private final ComboBoxModel values = new DefaultComboBoxModel();
-
- public boolean canEditValues(final Object selectedItem, final NamedObject simpleCond) {
- return true;
- }
-
- public boolean canHandle(final Object selectedItem) {
- if (!(selectedItem instanceof NamedObject)) {
- return false;
- }
- final NamedObject namedObject = (NamedObject) selectedItem;
- return namedObject.objectEquals(TextController.FILTER_NODE)
- || namedObject.objectEquals(TextController.FILTER_PARENT)
- || namedObject.objectEquals(TextController.FILTER_DETAILS)
- || namedObject.objectEquals(TextController.FILTER_NOTE)
- || namedObject.objectEquals(TextController.FILTER_ANYTEXT);
- }
-
- public boolean canSelectValues(final Object selectedItem, final NamedObject simpleCond) {
- return true;
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCondition,
- final Object value, final boolean matchCase, final boolean matchApproximately) {
- final String item = (String) ((NamedObject)selectedItem).getObject();
- return createASelectableCondition(item, simpleCondition, value, matchCase, matchApproximately);
- }
-
- private ASelectableCondition createASelectableCondition(final String item, final NamedObject simpleCondition, final Object value,
- final boolean matchCase, final boolean matchApproximately) {
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)) {
- if (value.equals("")) {
- return null;
- }
- return matchCase ? new MatchCaseNodeContainsCondition(item, value.toString(), matchApproximately) :
- new NodeContainsCondition(item, value.toString(), matchApproximately);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_REGEXP)) {
- try {
- return new NodeMatchesRegexpCondition(item, value.toString(), matchCase);
- }
- catch (final PatternSyntaxException e) {
- UITools.errorMessage(TextUtils.format("wrong_regexp", value, e.getMessage()));
- return null;
- }
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_EQUAL_TO)) {
- return new NodeTextCompareCondition(item, value, matchCase, 0, true, matchApproximately);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_IS_NOT_EQUAL_TO)) {
- return new NodeTextCompareCondition(item, value, matchCase, 0, false, matchApproximately);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GT)) {
- return new NodeTextCompareCondition(item, value, matchCase, 1, true, matchApproximately);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_GE)) {
- return new NodeTextCompareCondition(item, value, matchCase, -1, false, matchApproximately);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LT)) {
- return new NodeTextCompareCondition(item, value, matchCase, -1, true, matchApproximately);
- }
- if (simpleCondition.objectEquals(ConditionFactory.FILTER_LE)) {
- return new NodeTextCompareCondition(item, value, matchCase, 1, false, matchApproximately);
- }
- return null;
- }
-
- public ComboBoxModel getConditionsForProperty(final Object selectedItem) {
- return new DefaultComboBoxModel(new NamedObject[] {
- TextUtils.createTranslatedString(ConditionFactory.FILTER_CONTAINS),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_EQUAL_TO),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_IS_NOT_EQUAL_TO),
- NamedObject.literal(ConditionFactory.FILTER_GT), NamedObject.literal(ConditionFactory.FILTER_GE),
- NamedObject.literal(ConditionFactory.FILTER_LE), NamedObject.literal(ConditionFactory.FILTER_LT),
- TextUtils.createTranslatedString(ConditionFactory.FILTER_REGEXP), });
- }
-
- public ListModel getFilteredProperties() {
- final DefaultListModel list = new DefaultListModel();
- list.addElement(TextUtils.createTranslatedString(TextController.FILTER_ANYTEXT));
- list.addElement(TextUtils.createTranslatedString(TextController.FILTER_NODE));
- list.addElement(TextUtils.createTranslatedString(TextController.FILTER_DETAILS));
- list.addElement(TextUtils.createTranslatedString(TextController.FILTER_NOTE));
- list.addElement(TextUtils.createTranslatedString(TextController.FILTER_PARENT));
- return list;
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- if(selectedCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)
- || selectedCondition.objectEquals(ConditionFactory.FILTER_REGEXP) )
- return new FixedBasicComboBoxEditor();
- return FrameController.getTextDateTimeEditor();
- }
-
- public ComboBoxModel getValuesForProperty(final Object selectedItem, NamedObject simpleCond) {
- return values;
- }
-
- public boolean isCaseDependent(final Object selectedItem, final NamedObject simpleCond) {
- return true;
- }
-
- public boolean supportsApproximateMatching(final Object selectedItem, final NamedObject simpleCond) {
- return true;
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- if (element.getName().equalsIgnoreCase(NodeContainsCondition.NAME)) {
- return NodeContainsCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(MatchCaseNodeContainsCondition.NAME)) {
- return MatchCaseNodeContainsCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(NodeTextCompareCondition.NAME)) {
- return NodeTextCompareCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(NodeMatchesRegexpCondition.NAME)) {
- return NodeMatchesRegexpCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(NoteContainsCondition.NAME)) {
- return NoteContainsCondition.load(element);
- }
- if (element.getName().equalsIgnoreCase(MatchCaseNoteContainsCondition.NAME)) {
- return MatchCaseNoteContainsCondition.load(element);
- }
- return null;
- }
-
- public static Object[] getItemsForComparison(Object nodeItem, final NodeModel node) {
- if (nodeItem.equals(TextController.FILTER_ANYTEXT)) {
- return new Object[] {
- getItemForComparison(TextController.FILTER_NODE, node),
- getItemForComparison(TextController.FILTER_DETAILS, node),
- getItemForComparison(TextController.FILTER_NOTE, node) };
- }
- else
- return new Object[] { getItemForComparison(nodeItem, node) };
- }
-
- private static Object getItemForComparison(Object nodeItem, final NodeModel node) {
- final Object result;
- if(nodeItem.equals(TextController.FILTER_NODE)){
- result = TextController.getController().getTransformedObjectNoThrow(node);
- }
- else if(nodeItem.equals(TextController.FILTER_PARENT)){
- final NodeModel parentNode = node.getParentNode();
- if(parentNode == null)
- result = null;
- else
- result = TextController.getController().getTransformedObjectNoThrow(parentNode);
- }
- else if(nodeItem.equals(TextController.FILTER_DETAILS)){
- result = DetailTextModel.getDetailTextText(node);
- }
- else if(nodeItem.equals(TextController.FILTER_NOTE)){
- result = NoteModel.getNoteText(node);
- }
- else
- result = null;
- if(result instanceof String)
- return HtmlUtils.htmlToPlain((String)result);
- return result;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- if(selectedCondition.objectEquals(ConditionFactory.FILTER_CONTAINS)
- || selectedCondition.objectEquals(ConditionFactory.FILTER_REGEXP) )
- return null;
- return new TypedListCellRenderer();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/RichTextModel.java b/freeplane/src/org/freeplane/features/text/RichTextModel.java
deleted file mode 100644
index 9208b32..0000000
--- a/freeplane/src/org/freeplane/features/text/RichTextModel.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.freeplane.features.text;
-
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.XmlUtils;
-
-
-public class RichTextModel {
- private String html = null;
- private String xml = null;
-
- public String getHtml() {
- return html;
- }
-
- public String getXml() {
- return xml;
- }
-
- public final void setHtml(final String pNoteText) {
- if (pNoteText == null) {
- xml = null;
- html = null;
- return;
- }
- html = XmlUtils.makeValidXml(pNoteText);
- xml = HtmlUtils.toXhtml(html);
- if (xml != null && !xml.startsWith("<")) {
- html = xml;
- }
- }
-
- public final void setXml(final String pXmlNoteText) {
- if (pXmlNoteText == null) {
- xml = null;
- html = null;
- return;
- }
- xml = XmlUtils.makeValidXml(pXmlNoteText);
- html = HtmlUtils.toHtml(xml);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/SetShortenerStateAction.java b/freeplane/src/org/freeplane/features/text/SetShortenerStateAction.java
deleted file mode 100644
index 1216401..0000000
--- a/freeplane/src/org/freeplane/features/text/SetShortenerStateAction.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-
- at SelectableAction(checkOnNodeChange=true)
-class SetShortenerStateAction extends AMultipleNodeAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private boolean setShortened;
- public SetShortenerStateAction() {
- super("SetShortenerStateAction");
- }
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- setShortened = !isShortened();
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- selection.keepNodePosition(selection.getSelected(), 0.0f, 0.0f);
- super.actionPerformed(e);
- }
-
- private boolean isShortened() {
- final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
- if(node == null){
- return false;
- }
- final ShortenedTextModel model = ShortenedTextModel.getShortenedTextModel(node);
- return model != null;
- }
-
- @Override
- protected void actionPerformed(ActionEvent e, NodeModel node) {
- TextController controller = TextController.getController();
- controller.setIsMinimized(node, setShortened);
- }
-
- @Override
- public void setSelected() {
- setSelected(isShortened());
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/text/TextController.java b/freeplane/src/org/freeplane/features/text/TextController.java
deleted file mode 100644
index d923f58..0000000
--- a/freeplane/src/org/freeplane/features/text/TextController.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Font;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.swing.Icon;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.format.PatternFormat;
-import org.freeplane.features.map.ITooltipProvider;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyleModel;
-
-
-/**
- * @author Dimitry Polivaev
- */
-public class TextController implements IExtension {
- public static final String DETAILS_HIDDEN = "DETAILS_HIDDEN";
- public static final String FILTER_NODE = "filter_node";
- public static final String FILTER_ANYTEXT = "filter_any_text";
- public static final String FILTER_NOTE = "filter_note";
- public static final String FILTER_PARENT = "filter_parent";
- public static final String FILTER_DETAILS = "filter_details";
- private static final Integer NODE_TOOLTIP = 1;
- private static final Integer DETAILS_TOOLTIP = 2;
- private final List<IContentTransformer> textTransformers;
- protected final ModeController modeController;
- public static final String MARK_TRANSFORMED_TEXT = "highlight_formulas";
-
-
- public static boolean isMarkTransformedTextSet() {
- return Controller.getCurrentController().getResourceController().getBooleanProperty(MARK_TRANSFORMED_TEXT);
- }
-
- public static TextController getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- return getController(modeController);
- }
-
- public static TextController getController(ModeController modeController) {
- return (TextController) modeController.getExtension(TextController.class);
- }
-
- public static void install() {
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(0,
- new NodeTextConditionController());
- }
-
- public static void install( final TextController textController) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addExtension(TextController.class, textController);
- }
-
- public TextController(final ModeController modeController) {
- super();
- textTransformers = new LinkedList<IContentTransformer>();
- this.modeController = modeController;
- final MapController mapController = modeController.getMapController();
- final ReadManager readManager = mapController.getReadManager();
- final WriteManager writeManager = mapController.getWriteManager();
- final NodeTextBuilder textBuilder = new NodeTextBuilder();
- textBuilder.registerBy(readManager, writeManager);
- writeManager.addExtensionElementWriter(DetailTextModel.class, textBuilder);
- writeManager.addExtensionAttributeWriter(ShortenedTextModel.class, textBuilder);
-
- modeController.addAction(new ToggleDetailsAction());
- modeController.addAction(new SetShortenerStateAction());
-// modeController.addAction(new ToggleNodeNumberingAction());
- addTextTransformer(new FormatContentTransformer(this, 50));
- registerDetailsTooltip();
- registerNodeTextTooltip();
- }
-
- public void addTextTransformer(IContentTransformer textTransformer) {
- textTransformers.add(textTransformer);
- Collections.sort(textTransformers);
- }
-
- public List<IContentTransformer> getTextTransformers() {
- return textTransformers;
- }
- public void removeTextTransformer(IContentTransformer textTransformer) {
- textTransformers.remove(textTransformer);
- }
-
- public String getText(NodeModel nodeModel) {
- return nodeModel.getText();
- }
-
- public Object getTransformedObject(Object object, final NodeModel nodeModel, Object extension) throws TransformationException{
- if(object instanceof String && ResourceController.getResourceController().getBooleanProperty("parse_data")){
- String string = (String) object;
- if(string.length() > 0 && string.charAt(0) == '\''){
- if(isTextFormattingDisabled(nodeModel))
- return string;
- else
- return string.substring(1);
- }
- }
- boolean markTransformation = false;
- for (IContentTransformer textTransformer : getTextTransformers()) {
- try {
- Object in = object;
- object = textTransformer.transformContent(this, in, nodeModel, extension);
- markTransformation = markTransformation || textTransformer.markTransformation() && ! in.equals(object);
- }
- catch (RuntimeException e) {
- throw new TransformationException(e);
- }
- }
- if(markTransformation)
- return new HighlightedTransformedObject(object);
- else
- return object;
- }
-
- public Icon getIcon(Object object, final NodeModel nodeModel, Object extension){
- if(object instanceof HighlightedTransformedObject){
- return getIcon(((HighlightedTransformedObject)object).getObject(), nodeModel, extension);
- }
- for (IContentTransformer textTransformer : getTextTransformers()) {
- Icon icon = textTransformer.getIcon(this, object, nodeModel, extension);
- if( icon != null)
- return icon;
- }
- return null;
- }
-
- public boolean isTextFormattingDisabled(final NodeModel nodeModel) {
- return PatternFormat.IDENTITY_PATTERN.equals(getNodeFormat(nodeModel));
- }
-
- /** returns an error message instead of a normal result if something goes wrong. */
- public Object getTransformedObjectNoThrow(Object data, final NodeModel node, Object extension) {
- try {
- return getTransformedObject(data, node, extension);
- }
- catch (Throwable e) {
- LogUtils.warn(e.getMessage(), e);
- return TextUtils.format("MainView.errorUpdateText", data, e.getLocalizedMessage());
- }
- }
-
- public Object getTransformedObject(NodeModel node) throws TransformationException{
- final Object userObject = node.getUserObject();
- return getTransformedObject(userObject, node, userObject);
- }
-
- public Object getTransformedObjectNoThrow(NodeModel node) {
- final Object userObject = node.getUserObject();
- return getTransformedObjectNoThrow(userObject, node, userObject);
- }
-
- /** convenience method for getTransformedText().toString. */
- public String getTransformedText(Object text, final NodeModel nodeModel, Object extension) throws TransformationException{
- text = getTransformedObject(text, nodeModel, extension);
- return text.toString();
- }
-
- public String getTransformedTextNoThrow(Object text, final NodeModel nodeModel, Object extension) {
- text = getTransformedObjectNoThrow(text, nodeModel, extension);
- return text.toString();
- }
-
- public boolean isMinimized(NodeModel node){
- final ShortenedTextModel shortened = ShortenedTextModel.getShortenedTextModel(node);
- return shortened != null;
- }
-
- // FIXME: This should be getPlainTransformedText() since getText() does not transform too
- /** returns transformed text converted to plain text. */
- public String getPlainTextContent(NodeModel nodeModel) {
- final String text = getTransformedTextNoThrow(nodeModel);
- return HtmlUtils.htmlToPlain(text);
- }
-
- public String getTransformedTextNoThrow(NodeModel nodeModel) {
- final Object userObject = nodeModel.getUserObject();
- final Object input;
- if(userObject instanceof String && HtmlUtils.isHtmlNode((String) userObject))
- input = HtmlUtils.htmlToPlain((String) userObject);
- else
- input = userObject;
- final String text = getTransformedTextNoThrow(input, nodeModel, userObject);
- return text;
- }
-
- public String getShortText(NodeModel nodeModel) {
- String adaptedText = getPlainTextContent(nodeModel);
- if (adaptedText.length() > 40) {
- adaptedText = adaptedText.substring(0, 40) + " ...";
- }
- return adaptedText;
- }
-
- public void setDetailsHidden(NodeModel node, boolean isHidden) {
- final DetailTextModel details = DetailTextModel.createDetailText(node);
- if(isHidden == details.isHidden()){
- return;
- }
- details.setHidden(isHidden);
- node.addExtension(details);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, DETAILS_HIDDEN, ! isHidden, isHidden);
- }
-
- private void registerDetailsTooltip() {
- modeController.addToolTipProvider(DETAILS_TOOLTIP, new ITooltipProvider() {
- public String getTooltip(ModeController modeController, NodeModel node, Component view) {
- final DetailTextModel detailText = DetailTextModel.getDetailText(node);
- if (detailText == null || ! (detailText.isHidden() || ShortenedTextModel.isShortened(node)) ){
- return null;
- }
- final NodeStyleController style = (NodeStyleController) modeController.getExtension(NodeStyleController.class);
- final MapStyleModel model = MapStyleModel.getExtension(node.getMap());
- final NodeModel detailStyleNode = model.getStyleNodeSafe(MapStyleModel.DETAILS_STYLE);
- Font detailFont = style.getFont(detailStyleNode);
- Color detailBackground = style.getBackgroundColor(detailStyleNode);
- Color detailForeground = style.getColor(detailStyleNode);
-
- final StringBuilder rule = new StringBuilder();
- rule.append("font-family: " + detailFont.getFamily() + ";");
- rule.append("font-size: " + detailFont.getSize() + "pt;");
- if (detailFont.isItalic()) {
- rule.append("font-style: italic; ");
- }
- if (detailFont.isBold()) {
- rule.append("font-weight: bold; ");
- }
- rule.append("color: ").append(ColorUtils.colorToString(detailForeground)).append(";");
- rule.append("background-color: ").append(ColorUtils.colorToString(detailBackground)).append(";");
-
- String noteText= detailText.getHtml();
- final String tooltipText = noteText.replaceFirst("<body>", "<body><div style=\"" + rule + "\">")
- .replaceFirst("</body>", "</div></body>");
- return tooltipText;
- }
- });
- }
-
- private void registerNodeTextTooltip() {
- modeController.addToolTipProvider(NODE_TOOLTIP, new ITooltipProvider() {
- public String getTooltip(final ModeController modeController, NodeModel node, Component view) {
- if (!ShortenedTextModel.isShortened(node)) {
- return null;
- }
- final NodeStyleController style = (NodeStyleController) modeController.getExtension(NodeStyleController.class);
- final Font font = style.getFont(node);
- final StringBuilder rule = new StringBuilder();
- rule.append("font-family: " + font.getFamily() + ";");
- rule.append("font-size: " + font.getSize() + "pt;");
- rule.append("margin-top:0;");
- if (font.isItalic()) {
- rule.append("font-style: italic; ");
- }
- if (font.isBold()) {
- rule.append("font-weight: bold; ");
- }
- final Color nodeTextColor = view.getForeground();
- rule.append("color: ").append(ColorUtils.colorToString(nodeTextColor)).append(";");
- final Object data = node.getUserObject();
- String text;
- try {
- text = getTransformedText(data, node, data);
- }
- catch (Exception e) {
- text = TextUtils.format("MainView.errorUpdateText", data, e.getLocalizedMessage());
- rule.append("color:red;");
- }
- if (!HtmlUtils.isHtmlNode(text)) {
- text = HtmlUtils.plainToHTML(text);
- }
- final String tooltipText = text.replaceFirst("<body>", "<body><div style=\"" + rule + "\">")
- .replaceFirst("</body>", "</div></body>");
- return tooltipText;
- }
- });
- }
-
- public void setIsMinimized(NodeModel node, boolean shortened) {
- boolean oldState = ShortenedTextModel.getShortenedTextModel(node) != null;
- if(oldState == shortened){
- return;
- }
- if(shortened){
- ShortenedTextModel.createShortenedTextModel(node);
- }
- else{
- node.removeExtension(ShortenedTextModel.class);
- }
- Controller.getCurrentModeController().getMapController().nodeChanged(node, "SHORTENER", oldState, shortened);
- }
-
- public void toggleShortened(NodeModel node) {
- setIsMinimized(node, ! isMinimized(node));
- }
-
- public String getNodeFormat(NodeModel node) {
- Collection<IStyle> collection = LogicalStyleController.getController(modeController).getStyles(node);
- final MapStyleModel model = MapStyleModel.getExtension(node.getMap());
- for(IStyle styleKey : collection){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final String format = NodeStyleModel.getNodeFormat(styleNode);
- if (format != null) {
- return format;
- }
- }
- return parseData() ? PatternFormat.STANDARD_FORMAT_PATTERN : PatternFormat.IDENTITY_PATTERN;
- }
-
- public boolean parseData() {
- return false;
- }
-
- public boolean getNodeNumbering(NodeModel node) {
- Collection<IStyle> collection = LogicalStyleController.getController(modeController).getStyles(node);
- final MapStyleModel model = MapStyleModel.getExtension(node.getMap());
- for(IStyle styleKey : collection){
- final NodeModel styleNode = model.getStyleNode(styleKey);
- if (styleNode == null) {
- continue;
- }
- final Boolean numbering = NodeStyleModel.getNodeNumbering(styleNode);
- if (numbering != null) {
- return numbering;
- }
- }
- return false;
- }
- public ModeController getModeController() {
- return modeController;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/text/ToggleDetailsAction.java b/freeplane/src/org/freeplane/features/text/ToggleDetailsAction.java
deleted file mode 100644
index 21f6a18..0000000
--- a/freeplane/src/org/freeplane/features/text/ToggleDetailsAction.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text;
-
-import java.awt.event.ActionEvent;
-import java.util.Collection;
-
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-class ToggleDetailsAction extends AMultipleNodeAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private boolean foundDetails;
- private boolean isHidden;
-
- public ToggleDetailsAction() {
- super("ToggleDetailsAction");
- }
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- checkDetailsEnabled();
- if(! foundDetails)
- return;
- isHidden = !isHidden;
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- selection.keepNodePosition(selection.getSelected(), 0.0f, 0.0f);
- super.actionPerformed(e);
- }
-
- @Override
- protected void actionPerformed(ActionEvent e, NodeModel node) {
- final DetailTextModel detailText = DetailTextModel.getDetailText(node);
- if(detailText == null){
- return;
- }
- TextController controller = TextController.getController();
- controller.setDetailsHidden(node, isHidden);
- }
-
-
- private void checkDetailsEnabled() {
- foundDetails = false;
- isHidden = false;
- final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
- for (final NodeModel node : nodes) {
- final DetailTextModel detailText = DetailTextModel.getDetailText(node);
- if (detailText != null) {
- foundDetails = true;
- isHidden = detailText.isHidden();
- break;
- }
- }
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/DeleteDetailsAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/DeleteDetailsAction.java
deleted file mode 100644
index c9cb1b0..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/DeleteDetailsAction.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.util.Collection;
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.text.DetailTextModel;
-
- at EnabledAction(checkOnNodeChange = true)
-class DeleteDetailsAction extends AMultipleNodeAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public DeleteDetailsAction() {
- super("DeleteDetailsAction");
- }
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- final DetailTextModel detailText = DetailTextModel.getDetailText(node);
- if (detailText == null) {
- return;
- }
- final MTextController controller = MTextController.getController();
- controller.setDetailsHidden(node, false);
- controller.setDetails(node, null);
- }
-
- @Override
- public void setEnabled() {
- boolean foundDetails = false;
- final Collection<NodeModel> nodes = Controller.getCurrentModeController().getMapController().getSelectedNodes();
- for (final NodeModel node : nodes) {
- if (node != null && DetailTextModel.getDetailText(node) != null) {
- foundDetails = true;
- break;
- }
- }
- setEnabled(foundDetails);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/EditDetailsAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/EditDetailsAction.java
deleted file mode 100644
index 5256e03..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/EditDetailsAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.IMapViewManager;
-
-class EditDetailsAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private boolean useDialog;
-
- public EditDetailsAction(final boolean useDialog) {
- super(useDialog ? "EditDetailsInDialogAction" : "EditDetailsAction");
- this.useDialog = useDialog;
- }
-
- /*
- * (non-Javadoc)
- * @see
- * freeplane.controller.actions.ActorXml#act(freeplane.controller.actions.
- * generated.instance.XmlAction)
- */
- public void actionPerformed(final ActionEvent arg0) {
- final Controller controller = Controller.getCurrentController();
- final NodeModel nodeModel = controller.getSelection().getSelected();
- final IMapViewManager viewController = controller.getMapViewManager();
- final Component node = viewController.getComponent(nodeModel);
- node.requestFocus();
- final MTextController textController = (MTextController) MTextController.getController();
- textController.editDetails(nodeModel, null, useDialog);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeBase.java b/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeBase.java
deleted file mode 100644
index 40dba03..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeBase.java
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Frame;
-import java.awt.Point;
-import java.awt.event.ActionEvent;
-import java.awt.event.FocusListener;
-import java.awt.event.KeyEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.ActionMap;
-import javax.swing.JDialog;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPopupMenu;
-import javax.swing.RootPaneContainer;
-import javax.swing.WindowConstants;
-import javax.swing.text.DefaultEditorKit;
-import javax.swing.text.JTextComponent;
-
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
-
-/**
- * @author foltin
- */
-abstract public class EditNodeBase {
- public static enum EditedComponent{TEXT, DETAIL, NOTE}
- abstract static class EditDialog{
- private final JDialog dialog;
- protected JDialog getDialog() {
- return dialog;
- }
-
- class CancelAction extends AbstractAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
- confirmedCancel();
- }
- }
-
- class DialogWindowListener extends WindowAdapter {
- /*
- * (non-Javadoc)
- * @seejava.awt.event.WindowAdapter#windowLostFocus(java.awt.event.
- * WindowEvent)
- */
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.WindowAdapter#windowClosing(java.awt.event.WindowEvent
- * )
- */
- @Override
- public void windowClosing(final WindowEvent e) {
- if (dialog.isVisible()) {
- confirmedSubmit();
- }
- }
- }
-
- class SplitAction extends AbstractAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
- split();
- }
- }
-
- class SubmitAction extends AbstractAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
- submit();
- }
- }
-
- private EditNodeBase base;
-
- protected EditDialog(final EditNodeBase base, final String title, final RootPaneContainer frame) {
- dialog = frame instanceof Frame ? new JDialog((Frame)frame, title, /*modal=*/true) : new JDialog((JDialog)frame, title, /*modal=*/true);
- dialog.getContentPane().setLayout(new BorderLayout());
- dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- final DialogWindowListener dfl = new DialogWindowListener();
- dialog.addWindowListener(dfl);
- this.base = base;
- }
-
- protected void cancel() {
- dialog.setVisible(false);
- }
-
- protected void confirmedCancel() {
- if (isChanged()) {
- final int action = JOptionPane.showConfirmDialog(dialog, TextUtils.getText("long_node_changed_cancel"), "",
- JOptionPane.OK_CANCEL_OPTION);
- if (action == JOptionPane.CANCEL_OPTION) {
- return;
- }
- }
- cancel();
- }
-
- protected void confirmedSubmit() {
- if (isChanged()) {
- final int action = JOptionPane.showConfirmDialog(dialog, TextUtils.getText("long_node_changed_submit"), "",
- JOptionPane.YES_NO_CANCEL_OPTION);
- if (action == JOptionPane.CANCEL_OPTION) {
- return;
- }
- if (action == JOptionPane.YES_OPTION) {
- submit();
- return;
- }
- }
- cancel();
- }
-
- /**
- * @return Returns the base.
- */
- EditNodeBase getBase() {
- return base;
- }
-
- abstract protected boolean isChanged();
-
- /**
- * @param base
- * The base to set.
- */
- void setBase(final EditNodeBase base) {
- this.base = base;
- }
-
- protected void split() {
- dialog.setVisible(false);
- }
-
- protected void submit() {
- dialog.setVisible(false);
- }
-
- public void show() {
- dialog.show();
- }
-
- public void dispose() {
- dialog.dispose();
- }
-
- public Container getContentPane() {
- return dialog.getContentPane();
- }
-
- public Component getFocusOwner() {
- return dialog.getFocusOwner();
- }
-
- public Component getMostRecentFocusOwner() {
- return dialog.getMostRecentFocusOwner();
- }
-
-
- }
-
- protected JPopupMenu createPopupMenu(Component component){
- JPopupMenu menu = new JPopupMenu();
- if(! (component instanceof JTextComponent)){
- return menu;
- }
- final ActionMap actionMap = ((JTextComponent)component).getActionMap();
- final Action copyAction = actionMap.get(DefaultEditorKit.copyAction);
- addAction(menu, copyAction, "CopyAction.text");
- final Action cutAction = actionMap.get(DefaultEditorKit.cutAction);
- addAction(menu, cutAction, "CutAction.text");
- final Action pasteAction = actionMap.get(DefaultEditorKit.pasteAction);
- addAction(menu, pasteAction, "PasteAction.text");
- SpellCheckerController.getController().addSpellCheckerMenu(menu);
- return menu;
- }
-
- protected void addAction(JPopupMenu menu, final Action action, final String label) {
- if(action == null)
- return;
- final String text = TextUtils.getRawText(label);
- final JMenuItem item = menu.add(new JMenuItem());
- MenuBuilder.setLabelAndMnemonic(item, text);
- item.addActionListener(action);
- }
-
- public interface IEditControl {
- void cancel();
-
- void ok(String newText);
-
- void split(String newText, int position);
-
- boolean canSplit();
-
- EditedComponent getEditType();
- }
-
- protected static final int BUTTON_CANCEL = 1;
- protected static final int BUTTON_OK = 0;
- protected static final int BUTTON_SPLIT = 2;
- final private IEditControl editControl;
-// final private ModeController modeController;
- protected NodeModel node;
- protected String text;
- private Color background;
- protected Color getBackground() {
- return background;
- }
- protected FocusListener textFieldListener = null;
- protected EditNodeBase(final NodeModel node, final String text,
- final IEditControl editControl) {
-// this.modeController = modeController;
- this.editControl = editControl;
- this.node = node;
- this.text = text;
- }
-
- public void closeEdit() {
- if (textFieldListener != null) {
- textFieldListener.focusLost(null);
- }
- }
-
- /**
- */
- public IEditControl getEditControl() {
- return editControl;
- }
-
- /**
- */
- public NodeModel getNode() {
- return node;
- }
-
- /**
- */
- protected String getText() {
- return text;
- }
-
- /**
- */
- public FocusListener getTextFieldListener() {
- return textFieldListener;
- }
-
- protected void redispatchKeyEvents(final JTextComponent textComponent, final KeyEvent firstKeyEvent) {
- final EventBuffer keyEventDispatcher = MTextController.getController().getEventQueue();
- if (textComponent.hasFocus()) {
- keyEventDispatcher.deactivate();
- return;
- }
- keyEventDispatcher.activate();
- keyEventDispatcher.setTextComponent(textComponent);
- if (firstKeyEvent == null) {
- return;
- }
- if (firstKeyEvent.getKeyChar() == KeyEvent.CHAR_UNDEFINED) {
- switch (firstKeyEvent.getKeyCode()) {
- case KeyEvent.VK_HOME:
- final int modelIdx = textComponent.viewToModel(new Point(0, 0));
- if (modelIdx >= 0) // modelIdx is -1 for LaTeX formulas!
- textComponent.setCaretPosition(modelIdx);
- // firstKeyEvent.consume();
- break;
- case KeyEvent.VK_END:
- textComponent.setCaretPosition(textComponent.getDocument().getLength());
- // firstKeyEvent.consume();
- break;
- }
- }
- else {
- textComponent.selectAll();
- }
- }
-
- /**
- */
- public void setTextFieldListener(final FocusListener listener) {
- textFieldListener = listener;
- }
-
- abstract public void show(RootPaneContainer frame);
- public void setBackground(Color background) {
- this.background = background;
-
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeDialog.java b/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeDialog.java
deleted file mode 100644
index 43db089..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeDialog.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ComponentEvent;
-import java.awt.event.ComponentListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JEditorPane;
-import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-import javax.swing.RootPaneContainer;
-import javax.swing.ScrollPaneConstants;
-import javax.swing.SwingUtilities;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.JTextComponent;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
-import org.freeplane.features.ui.IMapViewManager;
-
-/**
- * @author foltin
- */
-public class EditNodeDialog extends EditNodeBase {
- private JTextComponent textComponent;
- private final boolean enableSplit;
-
- private class LongNodeDialog extends EditDialog {
-
- public LongNodeDialog(final RootPaneContainer frame, final String title, final Color background) {
- super(EditNodeDialog.this, title, frame);
- final IMapViewManager viewController = Controller.getCurrentModeController().getController()
- .getMapViewManager();
- final JScrollPane editorScrollPane;
- if (textComponent == null) {
- JTextArea textArea = new JTextArea(getText());
- textArea.setLineWrap(true);
- textArea.setWrapStyleWord(true);
- textComponent = textArea;
- editorScrollPane = new JScrollPane(textComponent);
- final SpellCheckerController spellCheckerController = SpellCheckerController.getController();
- spellCheckerController.enableAutoSpell(textComponent, true);
- final Font nodeFont = viewController.getFont(getNode());
- textComponent.setFont(nodeFont);
- final Color nodeTextColor = viewController.getTextColor(getNode());
- textComponent.setForeground(nodeTextColor);
- textComponent.setBackground(background);
- textComponent.setCaretColor(nodeTextColor);
- editorScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
- int preferredHeight = viewController.getComponent(getNode()).getHeight();
- preferredHeight = Math.max(preferredHeight, Integer.parseInt(ResourceController.getResourceController()
- .getProperty("el__min_default_window_height")));
- preferredHeight = Math.min(preferredHeight, Integer.parseInt(ResourceController.getResourceController()
- .getProperty("el__max_default_window_height")));
- int preferredWidth = viewController.getComponent(getNode()).getWidth();
- preferredWidth = Math.max(preferredWidth, Integer.parseInt(ResourceController.getResourceController()
- .getProperty("el__min_default_window_width")));
- preferredWidth = Math.min(preferredWidth, Integer.parseInt(ResourceController.getResourceController()
- .getProperty("el__max_default_window_width")));
- editorScrollPane.setPreferredSize(new Dimension(preferredWidth, preferredHeight));
- }
- else {
- textComponent.setText(getText());
- final JScrollPane ancestorScrollPane = (JScrollPane) SwingUtilities.getAncestorOfClass(JScrollPane.class, textComponent);
- if (ancestorScrollPane != null) {
- editorScrollPane = ancestorScrollPane;
- }
- else {
- editorScrollPane = new JScrollPane(textComponent);
- }
- }
- final JPanel panel = new JPanel();
- final JButton okButton = new JButton();
- final JButton cancelButton = new JButton();
- final JButton splitButton = new JButton();
- final JCheckBox enterConfirms = new JCheckBox("", ResourceController.getResourceController()
- .getBooleanProperty("el__enter_confirms_by_default"));
- MenuBuilder.setLabelAndMnemonic(okButton, TextUtils.getRawText("ok"));
- MenuBuilder.setLabelAndMnemonic(cancelButton, TextUtils.getRawText("cancel"));
- MenuBuilder.setLabelAndMnemonic(splitButton, TextUtils.getRawText("split"));
- MenuBuilder.setLabelAndMnemonic(enterConfirms, TextUtils.getRawText("enter_confirms"));
- okButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- submit();
- }
- });
- cancelButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- cancel();
- }
- });
- splitButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- split();
- }
- });
- enterConfirms.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- textComponent.requestFocus();
- ResourceController.getResourceController().setProperty("el__enter_confirms_by_default",
- Boolean.toString(enterConfirms.isSelected()));
- }
- });
- textComponent.addKeyListener(new KeyListener() {
- public void keyPressed(final KeyEvent e) {
- switch (e.getKeyCode()) {
- case KeyEvent.VK_ESCAPE:
- e.consume();
- confirmedCancel();
- break;
- case KeyEvent.VK_ENTER:
- e.consume();
- if ((e.getModifiers() & InputEvent.SHIFT_MASK) != 0
- || enterConfirms.isSelected() == ((e.getModifiers() & InputEvent.ALT_MASK) != 0)) {
- insertString("\n");
- break;
- }
- submit();
- break;
- case KeyEvent.VK_TAB:
- e.consume();
- insertString(" ");
- break;
- }
- }
-
- public void insertString(final String text) {
- try {
- textComponent.getDocument().insertString(textComponent.getCaretPosition(), text, null);
- }
- catch (BadLocationException e) {
- e.printStackTrace();
- }
- }
-
- public void keyReleased(final KeyEvent e) {
- }
-
- public void keyTyped(final KeyEvent e) {
- }
- });
- textComponent.addMouseListener(new MouseListener() {
- private void conditionallyShowPopup(final MouseEvent e) {
- if (e.isPopupTrigger()) {
- final Component component = e.getComponent();
- final JPopupMenu popupMenu = createPopupMenu(component);
- popupMenu.show(component, e.getX(), e.getY());
- e.consume();
- }
- }
-
- public void mouseClicked(final MouseEvent e) {
- }
-
- public void mouseEntered(final MouseEvent e) {
- }
-
- public void mouseExited(final MouseEvent e) {
- }
-
- public void mousePressed(final MouseEvent e) {
- conditionallyShowPopup(e);
- }
-
- public void mouseReleased(final MouseEvent e) {
- conditionallyShowPopup(e);
- }
- });
- final JPanel buttonPane = new JPanel();
- buttonPane.add(enterConfirms);
- buttonPane.add(okButton);
- buttonPane.add(cancelButton);
- if (enableSplit)
- buttonPane.add(splitButton);
- buttonPane.setMaximumSize(new Dimension(1000, 20));
- if (ResourceController.getResourceController().getBooleanProperty("el__buttons_above")) {
- panel.add(buttonPane);
- panel.add(editorScrollPane);
- }
- else {
- panel.add(editorScrollPane);
- panel.add(buttonPane);
- }
- panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
- getDialog().setContentPane(panel);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.EditNodeBase.Dialog#cancel()
- */
- @Override
- protected void cancel() {
- super.cancel();
- getEditControl().cancel();
- }
-
- @Override
- public Component getMostRecentFocusOwner() {
- if (getDialog().isFocused()) {
- return getFocusOwner();
- }
- else {
- return textComponent;
- }
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.EditNodeBase.Dialog#isChanged()
- */
- @Override
- protected boolean isChanged() {
- return !getText().equals(textComponent.getText());
- }
-
- @Override
- public void show() {
- textComponent.requestFocus();
- super.show();
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.EditNodeBase.Dialog#split()
- */
- @Override
- protected void split() {
- super.split();
- getEditControl().split(textComponent.getText(), textComponent.getCaretPosition());
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.EditNodeBase.Dialog#submit()
- */
- @Override
- protected void submit() {
- super.submit();
- getEditControl().ok(textComponent.getText());
- }
- }
-
- /** Private variable to hold the last value of the "Enter confirms" state. */
- final private KeyEvent firstEvent;
- private String title;
- private boolean isModal;
-
- public EditNodeDialog(final NodeModel node, final String text, final KeyEvent firstEvent,
- final IEditControl editControl, boolean enableSplit) {
- super(node, text, editControl);
- this.firstEvent = firstEvent;
- this.enableSplit = enableSplit;
- }
-
- public EditNodeDialog(NodeModel nodeModel, String text, KeyEvent firstEvent, IEditControl editControl,
- boolean enableSplit, JEditorPane textEditor) {
- this(nodeModel, text, firstEvent, editControl, enableSplit);
- textComponent = textEditor;
- }
-
- public void show(final RootPaneContainer frame) {
- if (title == null) {
- title = TextUtils.getText("edit_long_node");
- }
- final EditDialog dialog = new LongNodeDialog(frame, title, getBackground());
- redispatchKeyEvents(textComponent, firstEvent);
- if (firstEvent == null) {
- textComponent.setCaretPosition(getText().length());
- }
- dialog.getDialog().setModal(isModal);
- dialog.getDialog().pack();
- Controller.getCurrentModeController().getController().getMapViewManager().scrollNodeToVisible(node);
- if (ResourceController.getResourceController().getBooleanProperty("el__position_window_below_node")) {
- UITools.setDialogLocationUnder(dialog.getDialog(), getNode());
- }
- else {
- UITools.setDialogLocationRelativeTo(dialog.getDialog(), getNode());
- }
- dialog.show();
- dialog.getDialog().addComponentListener(new ComponentListener() {
- public void componentShown(final ComponentEvent e) {
- }
-
- public void componentResized(final ComponentEvent e) {
- }
-
- public void componentMoved(final ComponentEvent e) {
- }
-
- public void componentHidden(final ComponentEvent e) {
- dialog.dispose();
- }
- });
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- protected void setModal(boolean isModal) {
- this.isModal = isModal;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeWYSIWYG.java b/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeWYSIWYG.java
deleted file mode 100644
index 521d989..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/EditNodeWYSIWYG.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
-import java.net.URL;
-
-import javax.swing.JButton;
-import javax.swing.JEditorPane;
-import javax.swing.JPanel;
-import javax.swing.JRootPane;
-import javax.swing.RootPaneContainer;
-import javax.swing.text.JTextComponent;
-import javax.swing.text.html.HTMLDocument;
-import javax.swing.text.html.StyleSheet;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
-
-import com.lightdev.app.shtm.SHTMLEditorPane;
-import com.lightdev.app.shtm.SHTMLPanel;
-
-/**
- * @author Daniel Polansky
- */
-public class EditNodeWYSIWYG extends EditNodeBase {
- private static class HTMLDialog extends EditDialog {
- private SHTMLPanel htmlEditorPanel;
- private JButton splitButton;
-
- HTMLDialog(final EditNodeBase base, final String title, String purpose, final RootPaneContainer frame) throws Exception {
- super(base, title, frame);
- createEditorPanel(purpose);
- getContentPane().add(htmlEditorPanel, BorderLayout.CENTER);
- UITools.addEscapeActionToDialog(getDialog(), new CancelAction());
- final JButton okButton = new JButton();
- final JButton cancelButton = new JButton();
- splitButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(okButton, TextUtils.getRawText("ok"));
- MenuBuilder.setLabelAndMnemonic(cancelButton, TextUtils.getRawText("cancel"));
- MenuBuilder.setLabelAndMnemonic(splitButton, TextUtils.getRawText("split"));
- okButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- submit();
- }
- });
- cancelButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- cancel();
- }
- });
- splitButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- split();
- }
- });
- UITools.addKeyActionToDialog(getDialog(), new SubmitAction(), "alt ENTER", "submit");
- final JPanel buttonPane = new JPanel();
- buttonPane.add(okButton);
- buttonPane.add(cancelButton);
- buttonPane.add(splitButton);
- buttonPane.setMaximumSize(new Dimension(1000, 20));
- if (ResourceController.getResourceController().getBooleanProperty("el__buttons_above")) {
- getContentPane().add(buttonPane, BorderLayout.NORTH);
- }
- else {
- getContentPane().add(buttonPane, BorderLayout.SOUTH);
- }
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.EditNodeBase.Dialog#close()
- */
- @Override
- protected void cancel() {
- super.cancel();
- final StyleSheet styleSheet = htmlEditorPanel.getDocument().getStyleSheet();
- styleSheet.removeStyle("p");
- styleSheet.removeStyle("BODY");
- getBase().getEditControl().cancel();
- }
-
- private SHTMLPanel createEditorPanel(String purpose) throws Exception {
- if (htmlEditorPanel == null) {
- htmlEditorPanel = MTextController.getController().createSHTMLPanel(purpose);
- final SHTMLEditorPane editorPane = (SHTMLEditorPane) htmlEditorPanel.getEditorPane();
- final SpellCheckerController spellCheckerController = SpellCheckerController.getController();
- spellCheckerController.enableAutoSpell(editorPane, true);
- spellCheckerController.addSpellCheckerMenu(editorPane.getPopup());
- spellCheckerController.enableShortKey(editorPane, true);
- }
- return htmlEditorPanel;
- }
-
- /**
- * @return Returns the htmlEditorPanel.
- */
- public SHTMLPanel getHtmlEditorPanel() {
- return htmlEditorPanel;
- }
-
- @Override
- public Component getMostRecentFocusOwner() {
- if (getDialog().isFocused()) {
- return getFocusOwner();
- }
- else {
- return htmlEditorPanel.getMostRecentFocusOwner();
- }
- }
-
- @Override
- protected boolean isChanged() {
- return htmlEditorPanel.needsSaving();
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.EditNodeBase.Dialog#split()
- */
- @Override
- protected void split() {
- super.split();
- final StyleSheet styleSheet = htmlEditorPanel.getDocument().getStyleSheet();
- styleSheet.removeStyle("p");
- styleSheet.removeStyle("body");
- getBase().getEditControl().split(HtmlUtils.unescapeHTMLUnicodeEntity(htmlEditorPanel.getDocumentText()),
- htmlEditorPanel.getCaretPosition());
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.EditNodeBase.Dialog#close()
- */
- @Override
- protected void submit() {
- super.submit();
- htmlEditorPanel.getDocument().getStyleSheet().removeStyle("p");
- htmlEditorPanel.getDocument().getStyleSheet().removeStyle("body");
- if (htmlEditorPanel.needsSaving()) {
- getBase().getEditControl().ok(HtmlUtils.unescapeHTMLUnicodeEntity(htmlEditorPanel.getDocumentText()));
- }
- else {
- getBase().getEditControl().cancel();
- }
- }
-
- public void setSplitEnabled(boolean enableSplit) {
- splitButton.setEnabled(enableSplit);
- splitButton.setVisible(enableSplit);
- }
- }
-
- private static final Dimension PREFERRED_SIZE = new Dimension(600, 400);
-
- private String title;
-
- private Font font;
- private Color textColor = Color.BLACK;
- private Dimension preferredSize = PREFERRED_SIZE;
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String purpose) {
- this.title = purpose;
- }
-
- public Font getFont() {
- return font;
- }
-
- public void setFont(Font font) {
- this.font = font;
- }
-
- public Color getTextColor() {
- return textColor;
- }
-
- public void setTextColor(Color textColor) {
- this.textColor = textColor;
- }
-
- public Dimension getPreferredSize() {
- return preferredSize;
- }
-
- public void setPreferredSize(Dimension preferredSize) {
- this.preferredSize = preferredSize;
- }
-
- public EditNodeWYSIWYG(final NodeModel node, final String text, final IEditControl editControl, boolean enableSplit) {
- super(node, text, editControl);
- }
-
- public void show(final RootPaneContainer frame) {
- try {
- HTMLDialog htmlEditorWindow = createHtmlEditor(frame);
- htmlEditorWindow.setBase(this);
- final String titleText;
- titleText = TextUtils.getText(title);
- htmlEditorWindow.getDialog().setTitle(titleText);
- htmlEditorWindow.setSplitEnabled(getEditControl().canSplit());
- final SHTMLPanel htmlEditorPanel = (htmlEditorWindow).getHtmlEditorPanel();
- final StringBuilder ruleBuilder = new StringBuilder(100);
- ruleBuilder.append("body {");
- if(font != null){
- ruleBuilder.append("font-family: ").append(font.getFamily()).append(";");
- final int fontSize = Math.round(font.getSize() / UITools.FONT_SCALE_FACTOR);
- ruleBuilder.append("font-size: ").append(fontSize).append("pt;");
- if (font.isItalic()) {
- ruleBuilder.append("font-style: italic; ");
- }
- if (font.isBold()) {
- ruleBuilder.append("font-weight: bold; ");
- }
- }
- if(textColor != null)
- ruleBuilder.append("color: ").append(ColorUtils.colorToString(textColor)).append(";");
- final Color bgColor = getBackground();
- ruleBuilder.append("background-color: ").append(ColorUtils.colorToString(bgColor)).append(";");
- ruleBuilder.append("}\n");
- ruleBuilder.append("p {margin-top:0;}\n");
- final HTMLDocument document = htmlEditorPanel.getDocument();
- final JEditorPane editorPane = htmlEditorPanel.getEditorPane();
- if(textColor != null){
- editorPane.setForeground(textColor);
- editorPane.setCaretColor(textColor);
- }
- final StyleSheet styleSheet = document.getStyleSheet();
- styleSheet.removeStyle("p");
- styleSheet.removeStyle("body");
- styleSheet.addRule(ruleBuilder.toString());
- final URL url = node.getMap().getURL();
- if (url != null) {
- document.setBase(url);
- }
- else {
- document.setBase(new URL("file: "));
- }
- htmlEditorPanel.setContentPanePreferredSize(preferredSize);
- htmlEditorWindow.getDialog().pack();
- if (ResourceController.getResourceController().getBooleanProperty("el__position_window_below_node")) {
- UITools.setDialogLocationUnder(htmlEditorWindow.getDialog(), node);
- }
- else {
- UITools.setDialogLocationRelativeTo(htmlEditorWindow.getDialog(), node);
- }
- String content = text;
- if (!HtmlUtils.isHtmlNode(content)) {
- content = HtmlUtils.plainToHTML(content);
- }
- htmlEditorPanel.setCurrentDocumentContent(content);
- final KeyEvent firstKeyEvent = MTextController.getController().getEventQueue().getFirstEvent();
- final JTextComponent currentPane = htmlEditorPanel.getEditorPane();
- if (currentPane == htmlEditorPanel.getMostRecentFocusOwner()) {
- redispatchKeyEvents(currentPane, firstKeyEvent);
- if (firstKeyEvent == null) {
- editorPane.setCaretPosition(htmlEditorPanel.getDocument().getLength());
- }
- }
- else{
- final EventBuffer keyEventDispatcher = MTextController.getController().getEventQueue();
- keyEventDispatcher.deactivate();
- }
- htmlEditorPanel.getMostRecentFocusOwner().requestFocus();
- htmlEditorWindow.show();
- }
- catch (final Exception ex) {
- LogUtils.severe("Loading of WYSIWYG HTML editor failed. Use the other editors instead.", ex);
- }
- }
-
- public HTMLDialog createHtmlEditor(final RootPaneContainer frame) throws Exception {
- final JRootPane rootPane = ((RootPaneContainer)frame).getRootPane();
- HTMLDialog htmlEditorWindow = (HTMLDialog) rootPane.getClientProperty(HTMLDialog.class);
- if (htmlEditorWindow == null) {
- htmlEditorWindow = new HTMLDialog(this, "", "", frame);
- rootPane.putClientProperty(HTMLDialog.class, htmlEditorWindow);
- // make sure that SHTML gets notified of relevant config changes!
- ResourceController.getResourceController().addPropertyChangeListener(
- new FreeplaneToSHTMLPropertyChangeAdapter(htmlEditorWindow.getHtmlEditorPanel()));
- }
- return htmlEditorWindow;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/EventBuffer.java b/freeplane/src/org/freeplane/features/text/mindmapmode/EventBuffer.java
deleted file mode 100644
index 6fabf12..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/EventBuffer.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.Component;
-import java.awt.EventQueue;
-import java.awt.KeyEventDispatcher;
-import java.awt.KeyboardFocusManager;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-
-/**
- * @author Dimitry Polivaev
- * Aug 23, 2011
- */
-public class EventBuffer implements KeyEventDispatcher, FocusListener {
- ArrayList<KeyEvent> events = new ArrayList<KeyEvent>(100);
- private Component textComponent;
- boolean isActive = false;
- private InputEvent firstEvent;
- private KeyEvent dispatchedEvent = null;
-
- public boolean isActive() {
- return isActive;
- }
- EventBuffer(){}
- public Component getTextComponent() {
- return textComponent;
- }
-
- public void setTextComponent(Component c) {
- if(textComponent != null)
- textComponent.removeFocusListener(this);
- this.textComponent = c;
- if(textComponent != null)
- textComponent.addFocusListener(this);
- }
-
- public boolean dispatchKeyEvent(final KeyEvent ke) {
- if(ke.equals(dispatchedEvent)){
- return false;
- }
- if(textComponent != null){
- KeyEvent newEvent = new KeyEvent(textComponent, ke.getID(), ke.getWhen(), ke.getModifiers(), ke.getKeyCode(), ke.getKeyChar(), ke.getKeyLocation());
- events.add(newEvent);
- }
- else {
- events.add(ke);
- }
-
- // Prevent Freeplane freeze
- if(ke.getKeyCode() == KeyEvent.VK_ESCAPE
- && ke.getID() == KeyEvent.KEY_RELEASED){
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(EventBuffer.this);
- }
- });
- }
- ke.consume();
- return true;
- }
-
- public void focusGained(final FocusEvent e) {
- try{
- textComponent.removeFocusListener(this);
- for (int i = 0; i < events.size(); i++) {
- final KeyEvent ke = events.get(i);
- if(ke.getComponent().equals(textComponent))
- dispatchedEvent = ke;
- else{
- dispatchedEvent = new KeyEvent(textComponent, ke.getID(), ke.getWhen(), ke.getModifiers(), ke.getKeyCode(), ke.getKeyChar(), ke.getKeyLocation());
- }
- e.getComponent().dispatchEvent(dispatchedEvent);
- dispatchedEvent = null;
- }
- }
- finally{
- deactivate();
- }
- }
-
- public void focusLost(final FocusEvent e) {
- }
- public void activate() {
- if(isActive)
- return;
- KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
- isActive = true;
- }
- public void deactivate() {
- if(! isActive)
- return;
- KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
- isActive = false;
- if(textComponent != null)
- textComponent.removeFocusListener(this);
- textComponent = null;
- events.clear();
- firstEvent = null;
- dispatchedEvent = null;
- }
- public void activate(InputEvent e) {
- activate();
- if(e instanceof KeyEvent)
- dispatchKeyEvent((KeyEvent) e);
- else if(e instanceof MouseEvent)
- setFirstEvent(e);
- }
- public void setFirstEvent(InputEvent e) {
- firstEvent = e;
- }
-
- public KeyEvent getFirstEvent(){
- if(firstEvent instanceof KeyEvent)
- return (KeyEvent) firstEvent;
- if(events.size() == 0)
- return null;
- return events.get(0);
- }
-
- public MouseEvent getMouseEvent() {
- if(firstEvent instanceof MouseEvent)
- return (MouseEvent) firstEvent;
- else
- return null;
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/JoinNodesAction.java b/freeplane/src/org/freeplane/features/text/mindmapmode/JoinNodesAction.java
deleted file mode 100644
index b25a7b4..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/JoinNodesAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-class JoinNodesAction extends AFreeplaneAction {
- final static Pattern BODY_END = Pattern.compile("</body>", Pattern.CASE_INSENSITIVE);
- final static Pattern BODY_START = Pattern.compile("<body>", Pattern.CASE_INSENSITIVE);
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public JoinNodesAction() {
- super("JoinNodesAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final List<NodeModel> selectedNodes = Controller.getCurrentController().getSelection().getSortedSelection(true);
- MTextController.getController().joinNodes(selectedNodes);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/MTextController.java b/freeplane/src/org/freeplane/features/text/mindmapmode/MTextController.java
deleted file mode 100644
index 2206d8a..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/MTextController.java
+++ /dev/null
@@ -1,954 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.KeyEventDispatcher;
-import java.awt.KeyboardFocusManager;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.io.File;
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Collection;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.swing.JEditorPane;
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JOptionPane;
-import javax.swing.KeyStroke;
-import javax.swing.RootPaneContainer;
-import javax.swing.SwingUtilities;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.html.HTMLDocument;
-import javax.swing.text.html.HTMLEditorKit;
-
-import org.freeplane.core.resources.IFreeplanePropertyListener;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.ExampleFileFilter;
-import org.freeplane.core.ui.IEditHandler.FirstAction;
-import org.freeplane.core.ui.components.BitmapImagePreview;
-import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.FixedHTMLWriter;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.StringMatchingStrategy;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.format.PatternFormat;
-import org.freeplane.features.format.ScannerController;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.icon.mindmapmode.MIconController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
-import org.freeplane.features.text.DetailTextModel;
-import org.freeplane.features.text.IContentTransformer;
-import org.freeplane.features.text.ShortenedTextModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.EditNodeBase.EditedComponent;
-import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.UrlManager;
-
-import com.lightdev.app.shtm.ActionBuilder;
-import com.lightdev.app.shtm.SHTMLPanel;
-import com.lightdev.app.shtm.SHTMLPanelImpl;
-import com.lightdev.app.shtm.TextResources;
-
-
-/**
- * @author Dimitry Polivaev
- */
-public class MTextController extends TextController {
-
- private static final String PARSE_DATA_PROPERTY = "parse_data";
- public static final String NODE_TEXT = "NodeText";
- private static Pattern FORMATTING_PATTERN = null;
- private EditNodeBase mCurrentEditDialog = null;
- private final Collection<IEditorPaneListener> editorPaneListeners;
- private final EventBuffer eventQueue;
-
- public static MTextController getController() {
- return (MTextController) TextController.getController();
- }
-
- public MTextController(ModeController modeController) {
- super(modeController);
- eventQueue = new EventBuffer();
- editorPaneListeners = new LinkedList<IEditorPaneListener>();
- createActions();
- ResourceController.getResourceController().addPropertyChangeListener(new IFreeplanePropertyListener() {
- public void propertyChanged(String propertyName, String newValue, String oldValue) {
- if (PARSE_DATA_PROPERTY.equals(propertyName)) {
- parseData = null;
- @SuppressWarnings("unused")
- boolean dummy = parseData();
- }
- }
- });
- }
-
- private void createActions() {
- ModeController modeController = Controller.getCurrentModeController();
- modeController.addAction(new EditAction());
- modeController.addAction(new UsePlainTextAction());
- modeController.addAction(new JoinNodesAction());
- modeController.addAction(new EditLongAction());
- modeController.addAction(new SetImageByFileChooserAction());
- modeController.addAction(new EditDetailsAction(false));
- modeController.addAction(new EditDetailsAction(true));
- modeController.addAction(new DeleteDetailsAction());
- }
-
- private String[] getContent(final String text, final int pos) {
- if (pos <= 0) {
- return null;
- }
- final String[] strings = new String[2];
- if (text.startsWith("<html>")) {
- final HTMLEditorKit kit = new HTMLEditorKit();
- final HTMLDocument doc = new HTMLDocument();
- final StringReader buf = new StringReader(text);
- try {
- kit.read(buf, doc, 0);
- final char[] firstText = doc.getText(0, pos).toCharArray();
- int firstStart = 0;
- int firstLen = pos;
- while ((firstStart < firstLen) && (firstText[firstStart] <= ' ')) {
- firstStart++;
- }
- while ((firstStart < firstLen) && (firstText[firstLen - 1] <= ' ')) {
- firstLen--;
- }
- int secondStart = 0;
- int secondLen = doc.getLength() - pos;
- if(secondLen <= 0)
- return null;
- final char[] secondText = doc.getText(pos, secondLen).toCharArray();
- while ((secondStart < secondLen) && (secondText[secondStart] <= ' ')) {
- secondStart++;
- }
- while ((secondStart < secondLen) && (secondText[secondLen - 1] <= ' ')) {
- secondLen--;
- }
- if (firstStart == firstLen || secondStart == secondLen) {
- return null;
- }
- StringWriter out = new StringWriter();
- new FixedHTMLWriter(out, doc, firstStart, firstLen - firstStart).write();
- strings[0] = out.toString();
- out = new StringWriter();
- new FixedHTMLWriter(out, doc, pos + secondStart, secondLen - secondStart).write();
- strings[1] = out.toString();
- return strings;
- }
- catch (final IOException e) {
- LogUtils.severe(e);
- }
- catch (final BadLocationException e) {
- LogUtils.severe(e);
- }
- }
- else {
- if (pos >= text.length()) {
- return null;
- }
- strings[0] = text.substring(0, pos);
- strings[1] = text.substring(pos);
- }
- return strings;
- }
-
- private String addContent(String joinedContent, final boolean isHtml, String nodeContent, final boolean isHtmlNode) {
- if (isHtml) {
- final String joinedContentParts[] = JoinNodesAction.BODY_END.split(joinedContent, -2);
- joinedContent = joinedContentParts[0];
- if (!isHtmlNode) {
- final String end[] = JoinNodesAction.BODY_START.split(joinedContent, 2);
- if (end.length == 1) {
- end[0] = "<html>";
- }
- nodeContent = end[0] + "<body><p>" + nodeContent + "</p>";
- }
- }
- if (isHtmlNode & !joinedContent.equals("")) {
- final String nodeContentParts[] = JoinNodesAction.BODY_START.split(nodeContent, 2);
- // if no <body> tag is found
- if (nodeContentParts.length == 1) {
- nodeContent = nodeContent.substring(6);
- nodeContentParts[0] = "<html>";
- }
- else {
- nodeContent = nodeContentParts[1];
- }
- if (!isHtml) {
- joinedContent = nodeContentParts[0] + "<body><p>" + joinedContent + "</p>";
- }
- }
- if (joinedContent.equals("")) {
- return nodeContent;
- }
- joinedContent += '\n';
- joinedContent += nodeContent;
- return joinedContent;
- }
-
- public void joinNodes(final List<NodeModel> selectedNodes) {
- if(selectedNodes.isEmpty())
- return;
- final NodeModel selectedNode = selectedNodes.get(0);
- final NodeModel parentNode = selectedNode.getParentNode();
- for (final NodeModel node: selectedNodes) {
- if(node.getParentNode() != parentNode){
- UITools.errorMessage(TextUtils.getText("cannot_add_parent_diff_parents"));
- return;
- }
- }
- String joinedContent = "";
- final Controller controller = Controller.getCurrentController();
- boolean isHtml = false;
- final LinkedHashSet<MindIcon> icons = new LinkedHashSet<MindIcon>();
- for (final NodeModel node: selectedNodes) {
- final String nodeContent = node.getText();
- icons.addAll(node.getIcons());
- final boolean isHtmlNode = HtmlUtils.isHtmlNode(nodeContent);
- joinedContent = addContent(joinedContent, isHtml, nodeContent, isHtmlNode);
- if (node != selectedNode) {
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- for(final NodeModel child: node.getChildren().toArray(new NodeModel[]{})){
- mapController.moveNode(child, selectedNode, selectedNode.getChildCount());
- }
- mapController.deleteNode(node);
- }
- isHtml = isHtml || isHtmlNode;
- }
- controller.getSelection().selectAsTheOnlyOneSelected(selectedNode);
- setNodeText(selectedNode, joinedContent);
- final MIconController iconController = (MIconController) IconController.getController();
- iconController.removeAllIcons(selectedNode);
- for (final MindIcon icon : icons) {
- iconController.addIcon(selectedNode, icon);
- }
- }
-
- public void setImageByFileChooser() {
- boolean picturesAmongSelecteds = false;
- final ModeController modeController = Controller.getCurrentModeController();
- for (final NodeModel node : modeController.getMapController().getSelectedNodes()) {
- final URI link = NodeLinks.getLink(node);
- if (link != null) {
- final String linkString = link.toString();
- final String lowerCase = linkString.toLowerCase();
- if (lowerCase.endsWith(".png") || lowerCase.endsWith(".jpg") || lowerCase.endsWith(".jpeg")
- || lowerCase.endsWith(".gif")) {
- picturesAmongSelecteds = true;
- final String encodedLinkString = HtmlUtils.unicodeToHTMLUnicodeEntity(linkString);
- final String strText = "<html><img src=\"" + encodedLinkString + "\">";
- ((MLinkController) LinkController.getController()).setLink(node, (URI) null, LinkController.LINK_ABSOLUTE);
- setNodeText(node, strText);
- }
- }
- }
- if (picturesAmongSelecteds) {
- return;
- }
- final Controller controller = modeController.getController();
- final ViewController viewController = controller.getViewController();
- final NodeModel selectedNode = modeController.getMapController().getSelectedNode();
- final MapModel map = selectedNode.getMap();
- final File file = map.getFile();
- if (file == null && LinkController.getLinkType() == LinkController.LINK_RELATIVE_TO_MINDMAP) {
- JOptionPane.showMessageDialog(viewController.getContentPane(), TextUtils
- .getText("not_saved_for_image_error"), "Freeplane", JOptionPane.WARNING_MESSAGE);
- return;
- }
- final ExampleFileFilter filter = new ExampleFileFilter();
- filter.addExtension("jpg");
- filter.addExtension("jpeg");
- filter.addExtension("png");
- filter.addExtension("gif");
- filter.setDescription(TextUtils.getText("bitmaps"));
- final UrlManager urlManager = (UrlManager) modeController.getExtension(UrlManager.class);
- final JFileChooser chooser = urlManager.getFileChooser(null, false);
- chooser.setFileFilter(filter);
- chooser.setAcceptAllFileFilterUsed(false);
- chooser.setAccessory(new BitmapImagePreview(chooser));
- final int returnVal = chooser.showOpenDialog(viewController.getContentPane());
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- return;
- }
- final File input = chooser.getSelectedFile();
- URI uri = input.toURI();
- if (uri == null) {
- return;
- }
- // bad hack: try to interpret file as http link
- if(! input.exists()){
- uri = LinkController.toRelativeURI(map.getFile(), input, LinkController.LINK_RELATIVE_TO_MINDMAP);
- if(uri == null || ! "http".equals(uri.getScheme())){
- UITools.errorMessage(TextUtils.format("file_not_found", input.toString()));
- return;
- }
- }
- else if (LinkController.getLinkType() != LinkController.LINK_ABSOLUTE) {
- uri = LinkController.toLinkTypeDependantURI(map.getFile(), input);
- }
- String uriString = uri.toString();
- if(uriString.startsWith("http:/")){
- uriString = "http://" + uriString.substring("http:/".length());
- }
- final String strText = "<html><img src=\"" + uriString + "\">";
- setNodeText(selectedNode, strText);
- }
-
- private static final Pattern HTML_HEAD = Pattern.compile("\\s*<head>.*</head>", Pattern.DOTALL);
- private EditEventDispatcher keyEventDispatcher;
- private Boolean parseData;
-
- public void setGuessedNodeObject(final NodeModel node, final String newText) {
- if (HtmlUtils.isHtmlNode(newText))
- setNodeObject(node, newText);
- else {
- final Object guessedObject = guessObject(newText, NodeStyleModel.getNodeFormat(node));
- if(guessedObject instanceof IFormattedObject)
- setNodeObject(node, ((IFormattedObject) guessedObject).getObject());
- else
- setNodeObject(node, newText);
- }
- }
-
- public Object guessObject(final Object text, final String oldFormat) {
- if (parseData() && text instanceof String) {
- if (PatternFormat.getIdentityPatternFormat().getPattern().equals(oldFormat))
- return text;
- final Object parseResult = ScannerController.getController().parse((String) text);
- if (oldFormat != null) {
- final Object formatted = FormatController.format(parseResult, oldFormat, null);
- return (formatted == null) ? text : formatted;
- }
- return parseResult;
- }
- return text;
- }
-
- public boolean parseData() {
- if (parseData == null)
- parseData = ResourceController.getResourceController().getBooleanProperty(PARSE_DATA_PROPERTY);
- return parseData;
- }
-
- /** converts strings to date, number or URI if possible. All other data types are left unchanged. */
- public Object guessObjectOrURI(final Object object, final String oldFormat) {
- Object guessedObject = guessObject(object, oldFormat);
- if (guessedObject == object && !(object instanceof URI) && matchUriPattern(object)) {
- try {
- return new URI((String) object);
- }
- catch (URISyntaxException e) {
- LogUtils.warn("URI regular expression does not match URI parser for " + object);
- return object;
- }
- }
- return guessedObject;
- }
-
- private boolean matchUriPattern(Object object) {
- if (!(object instanceof String))
- return false;
- return TextUtils.matchUriPattern((String) object);
- }
-
- public void setNodeText(final NodeModel node, final String newText) {
- setNodeObject(node, newText);
- }
-
- public void setNodeObject(final NodeModel node, final Object newObject) {
- if(newObject == null){
- setNodeObject(node, "");
- return;
- }
-
- final Object oldText = node.getUserObject();
- if (oldText.equals(newObject)) {
- return;
- }
-
- final IActor actor = new IActor() {
- public void act() {
- if (!oldText.equals(newObject)) {
- node.setUserObject(newObject);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_TEXT, oldText, newObject);
- }
- }
-
- public String getDescription() {
- return "setNodeText";
- }
-
- public void undo() {
- if (!oldText.equals(newObject)) {
- node.setUserObject(oldText);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.NODE_TEXT, newObject, oldText);
- }
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- public void splitNode(final NodeModel node, final int caretPosition, final String newText) {
- if (node.isRoot()) {
- return;
- }
- final String futureText = newText != null ? newText : node.getText();
- final String[] strings = getContent(futureText, caretPosition);
- if (strings == null) {
- return;
- }
- final String newUpperContent = makePlainIfNoFormattingFound(strings[0]);
- final String newLowerContent = makePlainIfNoFormattingFound(strings[1]);
- setNodeObject(node, newUpperContent);
- final NodeModel parent = node.getParentNode();
- final ModeController modeController = Controller.getCurrentModeController();
- final NodeModel lowerNode = ((MMapController) modeController.getMapController()).addNewNode(parent, parent
- .getChildPosition(node) + 1, node.isLeft());
- final MNodeStyleController nodeStyleController = (MNodeStyleController) NodeStyleController
- .getController();
- nodeStyleController.copyStyle(node, lowerNode);
- setNodeObject(lowerNode, newLowerContent);
- }
-
- public boolean useRichTextInEditor(String key) {
- final int showResult = OptionalDontShowMeAgainDialog.show(
- "OptionPanel." + key, "edit.decision", key,
- OptionalDontShowMeAgainDialog.BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED);
- return showResult == JOptionPane.OK_OPTION;
- }
-
- public void editDetails(final NodeModel nodeModel, InputEvent e, final boolean editLong) {
- final Controller controller = Controller.getCurrentController();
- stopEditing();
- Controller.getCurrentModeController().setBlocked(true);
- String text = DetailTextModel.getDetailTextText(nodeModel);
- final boolean isNewNode = text == null;
- if(isNewNode){
- final MTextController textController = (MTextController) MTextController.getController();
- textController.setDetails(nodeModel, "<html>");
- text = "";
- }
- final EditNodeBase.IEditControl editControl = new EditNodeBase.IEditControl() {
- public void cancel() {
- if (isNewNode) {
- final String detailText = DetailTextModel.getDetailTextText(nodeModel);
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- if(detailText != null)
- modeController.undo();
- modeController.resetRedo();
- }
- stop();
- }
-
- public void ok(final String newText) {
- if(HtmlUtils.isEmpty(newText))
- if (isNewNode) {
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- modeController.undo();
- modeController.resetRedo();
- }
- else
- setDetailsHtmlText(nodeModel, null);
- else
- setDetailsHtmlText(nodeModel, newText);
- stop();
- }
-
- public void split(final String newText, final int position) {
- }
- private void stop() {
- Controller.getCurrentModeController().setBlocked(false);
- mCurrentEditDialog = null;
- }
- public boolean canSplit() {
- return false;
- }
-
- public EditedComponent getEditType() {
- return EditedComponent.DETAIL;
- }
- };
- mCurrentEditDialog = createEditor(nodeModel, editControl, text, false, editLong, true);
- final RootPaneContainer frame = (RootPaneContainer) SwingUtilities.getWindowAncestor(controller.getMapViewManager().getMapViewComponent());
- mCurrentEditDialog.show(frame);
- }
-
-
- private void setDetailsHtmlText(final NodeModel node, final String newText) {
- if(newText != null){
- final String body = HTML_HEAD.matcher(newText).replaceFirst("");
- setDetails(node, body.replaceFirst("\\s+$", ""));
- }
- else
- setDetails(node, null);
- }
-
- public void setDetails(final NodeModel node, final String newText) {
- final String oldText = DetailTextModel.getDetailTextText(node);
- if (oldText == newText || null != oldText && oldText.equals(newText)) {
- return;
- }
- final IActor actor = new IActor() {
- boolean hidden = false;
- public void act() {
- setText(newText);
- }
-
- public String getDescription() {
- return "setDetailText";
- }
-
- private void setText(final String text) {
- final boolean containsDetails = !(text == null || text.equals(""));
- if (containsDetails) {
- final DetailTextModel details = DetailTextModel.createDetailText(node);
- details.setHtml(text);
- details.setHidden(hidden);
- node.addExtension(details);
- }
- else {
- final DetailTextModel details = (DetailTextModel) node.getExtension(DetailTextModel.class);
- if (null != details ) {
- hidden = details.isHidden();
- node.removeExtension(DetailTextModel.class);
- }
- }
- Controller.getCurrentModeController().getMapController().nodeChanged(node, DetailTextModel.class, oldText, text);
- }
-
- public void undo() {
- setText(oldText);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- public void setDetailsHidden(final NodeModel node, final boolean isHidden) {
- stopEditing();
- DetailTextModel details = (DetailTextModel) node.getExtension(DetailTextModel.class);
- if (details == null || details.isHidden() == isHidden) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- setHidden(isHidden);
- }
-
- public String getDescription() {
- return "setDetailsHidden";
- }
-
- private void setHidden(final boolean isHidden) {
- final DetailTextModel details = DetailTextModel.createDetailText(node);
- details.setHidden(isHidden);
- node.addExtension(details);
- Controller.getCurrentModeController().getMapController().nodeChanged(node, DETAILS_HIDDEN, ! isHidden, isHidden);
- }
-
- public void undo() {
- setHidden(! isHidden);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- public void setIsMinimized(final NodeModel node, final boolean state) {
- ShortenedTextModel details = (ShortenedTextModel) node.getExtension(ShortenedTextModel.class);
- if (details == null && state == false || details != null && state == true) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- setShortener(state);
- }
-
- public String getDescription() {
- return "setShortener";
- }
-
- private void setShortener(final boolean state) {
- if(state){
- final ShortenedTextModel details = ShortenedTextModel.createShortenedTextModel(node);
- node.addExtension(details);
- }
- else{
- node.removeExtension(ShortenedTextModel.class);
- }
- Controller.getCurrentModeController().getMapController().nodeChanged(node, ShortenedTextModel.SHORTENER, ! state, state);
- }
-
- public void undo() {
- setShortener(! state);
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- public void edit(final FirstAction action, final boolean editLong) {
- final Controller controller = Controller.getCurrentController();
- final NodeModel selectedNode = controller.getSelection().getSelected();
- if (selectedNode != null) {
- if (FirstAction.EDIT_CURRENT.equals(action)) {
- edit(selectedNode, selectedNode, false, false, editLong);
- }
- else if (!Controller.getCurrentModeController().isBlocked()) {
- final int mode = FirstAction.ADD_CHILD.equals(action) ? MMapController.NEW_CHILD : MMapController.NEW_SIBLING_BEHIND;
- ((MMapController) Controller.getCurrentModeController().getMapController()).addNewNode(mode);
- }
- }
- }
-
- public boolean containsFormatting(final String text){
- if(FORMATTING_PATTERN == null){
- FORMATTING_PATTERN = Pattern.compile("<(?!/|html>|head|body|p/?>|!--|style type=\"text/css\">)", Pattern.CASE_INSENSITIVE);
- }
- final Matcher matcher = FORMATTING_PATTERN.matcher(text);
- return matcher.find();
- }
-
- private class EditEventDispatcher implements KeyEventDispatcher, INodeChangeListener, INodeSelectionListener{
- private final boolean editLong;
- private final boolean parentFolded;
- private final boolean isNewNode;
- private final NodeModel prevSelectedModel;
- private final NodeModel nodeModel;
- private final ModeController modeController;
-
- private EditEventDispatcher(ModeController modeController, NodeModel nodeModel, NodeModel prevSelectedModel, boolean isNewNode,
- boolean parentFolded, boolean editLong) {
- this.modeController = modeController;
- this.editLong = editLong;
- this.parentFolded = parentFolded;
- this.isNewNode = isNewNode;
- this.prevSelectedModel = prevSelectedModel;
- this.nodeModel = nodeModel;
- }
-
- public boolean dispatchKeyEvent(KeyEvent e) {
- if(e.getID() == KeyEvent.KEY_RELEASED || e.getID() == KeyEvent.KEY_TYPED)
- return false;
- switch(e.getKeyCode()){
- case KeyEvent.VK_SHIFT:
- case KeyEvent.VK_CONTROL:
- case KeyEvent.VK_CAPS_LOCK:
- case KeyEvent.VK_ALT:
- case KeyEvent.VK_ALT_GRAPH:
- return false;
- }
-
- uninstall();
- if (isMenuEvent(e)){
- return false;
- }
- eventQueue.activate(e);
- edit(nodeModel, prevSelectedModel, isNewNode, parentFolded, editLong);
- return true;
- }
-
- private boolean isMenuEvent(KeyEvent e) {
- if(! editLong){
- final String editLongKeyStrokeProperty = ResourceController.getResourceController().getProperty("acceleratorForMindMap/$EditLongAction$0", null);
- if(editLongKeyStrokeProperty != null){
- final KeyStroke editLongKeyStroke = UITools.getKeyStroke(editLongKeyStrokeProperty);
- if(editLongKeyStroke != null){
- final KeyStroke keyStroke = KeyStroke.getKeyStrokeForEvent(e);
- if(editLongKeyStroke.equals(keyStroke)){
- return true;
- }
- }
- }
- }
- return false;
- }
-
- public void uninstall() {
- KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(this);
- MapController mapController = modeController.getMapController();
- mapController.removeNodeChangeListener(this);
- mapController.removeNodeSelectionListener(this);
- keyEventDispatcher = null;
- }
-
- public void install() {
- KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
- MapController mapController = modeController.getMapController();
- mapController.addNodeChangeListener(this);
- mapController.addNodeSelectionListener(this);
- }
-
- public void onDeselect(NodeModel node) {
- uninstall();
- }
-
- public void onSelect(NodeModel node) {
- uninstall();
- }
-
- public void nodeChanged(NodeChangeEvent event) {
- uninstall();
- }
- }
-
- public void edit(final NodeModel nodeModel, final NodeModel prevSelectedModel, final boolean isNewNode,
- final boolean parentFolded, final boolean editLong) {
- if (nodeModel == null || mCurrentEditDialog != null) {
- return;
- }
- final Controller controller = Controller.getCurrentController();
- if (controller.getMap() != nodeModel.getMap()) {
- return;
- }
- final IMapViewManager viewController = controller.getMapViewManager();
- final Component map = viewController.getMapViewComponent();
- map.validate();
- map.invalidate();
- final Component node = viewController.getComponent(nodeModel);
- if (node == null) {
- return;
- }
- node.requestFocus();
- stopEditing();
- if(isNewNode && ! eventQueue.isActive()
- && ! ResourceController.getResourceController().getBooleanProperty("display_inline_editor_for_all_new_nodes")){
- keyEventDispatcher = new EditEventDispatcher(Controller.getCurrentModeController(), nodeModel, prevSelectedModel, isNewNode, parentFolded, editLong);
- keyEventDispatcher.install();
- return;
- };
- final IEditControl editControl = new IEditControl() {
- public void cancel() {
- if (isNewNode && nodeModel.getMap().equals(controller.getMap())) {
- if(nodeModel.getParent() != null){
- controller.getSelection().selectAsTheOnlyOneSelected(nodeModel);
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- modeController.undo();
- modeController.resetRedo();
- }
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- mapController.select(prevSelectedModel);
- if (parentFolded) {
- mapController.setFolded(prevSelectedModel, true);
- }
- }
- stop();
- }
-
- private void stop() {
- Controller.getCurrentModeController().setBlocked(false);
- viewController.obtainFocusForSelected();
- mCurrentEditDialog = null;
- }
-
- public void ok(final String text) {
- String processedText = makePlainIfNoFormattingFound(text);
- setGuessedNodeObject(nodeModel, processedText);
- stop();
- }
-
- public void split(final String newText, final int position) {
- splitNode(nodeModel, position, newText);
- viewController.obtainFocusForSelected();
- stop();
- }
- public boolean canSplit() {
- return true;
- }
-
- public EditedComponent getEditType() {
- return EditedComponent.TEXT;
- }
- };
- mCurrentEditDialog = createEditor(nodeModel, editControl, nodeModel.getText(), isNewNode, editLong, true);
- final JFrame frame = controller.getViewController().getJFrame();
- mCurrentEditDialog.show(frame);
- }
-
- private EditNodeBase createEditor(final NodeModel nodeModel, final IEditControl editControl,
- String text, final boolean isNewNode, final boolean editLong,
- boolean internal) {
- Controller.getCurrentModeController().setBlocked(true);
- EditNodeBase base = getEditNodeBase(nodeModel, text, editControl, editLong);
- if(base != null || ! internal){
- return base;
- }
- final IEditBaseCreator textFieldCreator = (IEditBaseCreator) Controller.getCurrentController().getMapViewManager();
- return textFieldCreator.createEditor(nodeModel, editControl, text, editLong);
- }
-
-
- public EditNodeBase getEditNodeBase(final NodeModel nodeModel, final String text, final IEditControl editControl, final boolean editLong) {
- final List<IContentTransformer> textTransformers = getTextTransformers();
- for(IContentTransformer t : textTransformers){
- if(t instanceof IEditBaseCreator){
- final EditNodeBase base = ((IEditBaseCreator) t).createEditor(nodeModel, editControl, text, editLong);
- if(base != null){
- return base;
- }
- }
- }
- return null;
- }
-
-
- public void stopEditing() {
- if(keyEventDispatcher != null){
- keyEventDispatcher.uninstall();
- }
- if (mCurrentEditDialog != null) {
- // Ensure that setText from the edit and the next action
- // are parts of different transactions
- mCurrentEditDialog.closeEdit();
- modeController.forceNewTransaction();
- mCurrentEditDialog = null;
- }
- }
- public void addEditorPaneListener(IEditorPaneListener l){
- editorPaneListeners.add(l);
- }
-
- public void removeEditorPaneListener(IEditorPaneListener l){
- editorPaneListeners.remove(l);
- }
-
- private void fireEditorPaneCreated(JEditorPane editor, Object purpose){
- for(IEditorPaneListener l :editorPaneListeners){
- l.editorPaneCreated(editor, purpose);
- }
- }
-
- /**
- * Note: when creating an SHTMLPanel using this method, you must make sure to attach
- * a FreeplaneToSHTMLPropertyChangeAdapter to the panel (see for example EditNodeWYSIWYG.HTMLDialog.createEditorPanel(String))
- * @param purpose
- * @return
- */
- public SHTMLPanel createSHTMLPanel(String purpose) {
- SHTMLPanel.setResources(new TextResources() {
- public String getString(String pKey) {
- if (pKey.equals("approximate_search_threshold"))
- {
- return new Double(StringMatchingStrategy.APPROXIMATE_MATCHING_MINPROB).toString();
- }
- pKey = "simplyhtml." + pKey;
- String resourceString = ResourceController.getResourceController().getText(pKey, null);
- if (resourceString == null) {
- resourceString = ResourceController.getResourceController().getProperty(pKey);
- }
- return resourceString;
- }
- });
- com.lightdev.app.shtm.ScaledStyleSheet.FONT_SCALE_FACTOR = UITools.FONT_SCALE_FACTOR;
- SHTMLPanel.setActionBuilder(new ActionBuilder() {
-
- public void initActions(SHTMLPanel panel) {
- panel.addAction("editLink", new SHTMLEditLinkAction((SHTMLPanelImpl) panel));
- panel.addAction("setLinkByFileChooser", new SHTMLSetLinkByFileChooserAction((SHTMLPanelImpl) panel));
- }
- });
- final SHTMLPanel shtmlPanel = SHTMLPanel.createSHTMLPanel();
- shtmlPanel.setOpenHyperlinkHandler(new ActionListener(){
-
- public void actionPerformed(ActionEvent pE) {
- try {
- UrlManager.getController().loadURL(new URI(pE.getActionCommand()));
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- }});
-
- final JEditorPane editorPane = shtmlPanel.getEditorPane();
- editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false);
- fireEditorPaneCreated(editorPane, purpose);
-
- return shtmlPanel;
- }
-
- public JEditorPane createEditorPane(Object purpose) {
- @SuppressWarnings("serial")
- final JEditorPane editorPane = new JEditorPane(){
-
- @Override
- protected void paintComponent(Graphics g) {
- try {
- super.paintComponent(g);
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- }
-
- };
- editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false);
- fireEditorPaneCreated(editorPane, purpose);
- return editorPane;
- }
-
- public EventBuffer getEventQueue() {
- return eventQueue;
- }
-
- private String makePlainIfNoFormattingFound(String text) {
- if(HtmlUtils.isHtmlNode(text)){
- text = HTML_HEAD.matcher(text).replaceFirst("");
- if(! containsFormatting(text)){
- text = HtmlUtils.htmlToPlain(text);
- }
- }
- text = text.replaceFirst("\\s+$", "");
- return text;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/SortNodes.java b/freeplane/src/org/freeplane/features/text/mindmapmode/SortNodes.java
deleted file mode 100644
index fe7942d..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/SortNodes.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Vector;
-
-import org.freeplane.core.ui.AMultipleNodeAction;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.text.TextController;
-
-/**
- * @author foltin
- */
-public class SortNodes extends AMultipleNodeAction {
- final private class NodeTextComparator implements Comparator<Object> {
- public int compare(final Object pArg0, final Object pArg1) {
- if (pArg0 instanceof NodeModel) {
- final NodeModel node1 = (NodeModel) pArg0;
- if (pArg1 instanceof NodeModel) {
- final NodeModel node2 = (NodeModel) pArg1;
- final String nodeText1 = TextController.getController().getPlainTextContent(node1);
- final String nodeText2 = TextController.getController().getPlainTextContent(node2);
- return nodeText1.compareToIgnoreCase(nodeText2);
- }
- }
- return 0;
- }
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- * @param controller
- *
- */
- public SortNodes() {
- super("SortNodes");
- }
-
- @Override
- protected void actionPerformed(final ActionEvent e, final NodeModel node) {
- final Vector<NodeModel> sortVector = new Vector<NodeModel>();
- sortVector.addAll(node.getChildren());
- Collections.sort(sortVector, new NodeTextComparator());
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- int i = 0;
- for (final NodeModel child : sortVector) {
- ((FreeNode)Controller.getCurrentModeController().getExtension(FreeNode.class)).undoableDeactivateHook(child);
- mapController.moveNode(child, node, i++);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/text/mindmapmode/SplitNode.java b/freeplane/src/org/freeplane/features/text/mindmapmode/SplitNode.java
deleted file mode 100644
index f275750..0000000
--- a/freeplane/src/org/freeplane/features/text/mindmapmode/SplitNode.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.text.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.io.IOException;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.Collection;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Element;
-import javax.swing.text.html.HTMLDocument;
-import javax.swing.text.html.HTMLEditorKit;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.FixedHTMLWriter;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
-import org.freeplane.features.text.TextController;
-
-/**
- * @author Dimitry Polivaev
- */
-public class SplitNode extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- *
- */
- public SplitNode() {
- super("SplitNode");
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.extensions.NodeHook#invoke(freeplane.modes.MindMapNode,
- * java.util.List)
- */
- public void actionPerformed(final ActionEvent e) {
- final Collection<NodeModel> list = Controller.getCurrentModeController().getMapController().getSelectedNodes();
- for (NodeModel next : list) {
- splitNode(next);
- }
- }
-
- private Element getParentElement(final HTMLDocument doc) {
- final Element htmlRoot = doc.getDefaultRootElement();
- Element parentCandidate = htmlRoot.getElement(htmlRoot.getElementCount() - 1);
- do {
- if (parentCandidate.getElementCount() > 1) {
- return parentCandidate;
- }
- parentCandidate = parentCandidate.getElement(0);
- } while (!(parentCandidate.isLeaf() || parentCandidate.getName().equalsIgnoreCase("p-implied")));
- return null;
- }
-
- private void splitNode(final NodeModel node) {
- if (node.isRoot()) {
- return;
- }
- final String text = node.getText();
- final String[] parts = splitNode(text);
- if (parts == null || parts.length == 1) {
- return;
- }
- final ModeController c = Controller.getCurrentModeController();
- int firstPartNumber = 0;
- while (parts[firstPartNumber] == null) {
- firstPartNumber++;
- }
- ((MTextController) TextController.getController()).setNodeText(node, parts[firstPartNumber]);
- final NodeModel parent = node.getParentNode();
- final int nodePosition = parent.getChildPosition(node) + 1;
- for (int i = parts.length - 1; i > firstPartNumber; i--) {
- final MMapController mapController = (MMapController) c.getMapController();
- final NodeModel lowerNode = mapController.addNewNode(parent, nodePosition, node.isLeft());
- final String part = parts[i];
- if (part == null) {
- continue;
- }
- ((MTextController) TextController.getController()).setNodeText(lowerNode, part);
- final MNodeStyleController nodeStyleController = (MNodeStyleController) NodeStyleController
- .getController();
- nodeStyleController.copyStyle(node, lowerNode);
- mapController.setFolded(lowerNode, !lowerNode.isFolded());
- }
- }
-
- private String[] splitNode(final String text) {
- if (text.startsWith("<html>")) {
- String[] parts = null;
- final HTMLEditorKit kit = new HTMLEditorKit();
- final HTMLDocument doc = new HTMLDocument();
- final StringReader buf = new StringReader(text);
- try {
- kit.read(buf, doc, 0);
- final Element parent = getParentElement(doc);
- if (parent == null) {
- return null;
- }
- final int elementCount = parent.getElementCount();
- int notEmptyElementCount = 0;
- parts = new String[elementCount];
- for (int i = 0; i < elementCount; i++) {
- final Element current = parent.getElement(i);
- final int start = current.getStartOffset();
- final int end = current.getEndOffset();
- final String paragraphText = doc.getText(start, end - start).trim();
- if (paragraphText.length() > 0) {
- final StringWriter out = new StringWriter();
- new FixedHTMLWriter(out, doc, start, end - start).write();
- final String string = out.toString();
- if (!string.equals("")) {
- parts[i] = string;
- notEmptyElementCount++;
- }
- else {
- parts[i] = null;
- }
- }
- }
- if (notEmptyElementCount <= 1) {
- return null;
- }
- }
- catch (final IOException e) {
- LogUtils.severe(e);
- }
- catch (final BadLocationException e) {
- LogUtils.severe(e);
- }
- return parts;
- }
- return text.split("\n");
- }
-}
diff --git a/freeplane/src/org/freeplane/features/time/TimeCondition.java b/freeplane/src/org/freeplane/features/time/TimeCondition.java
deleted file mode 100644
index 4b0014d..0000000
--- a/freeplane/src/org/freeplane/features/time/TimeCondition.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.time;
-
-import java.util.Date;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.format.FormattedDate;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public abstract class TimeCondition extends ASelectableCondition {
- static final String DATE = "DATE";
- static final String FILTER_CREATED_AFTER = "filter_created_after";
- static final String FILTER_CREATED_BEFORE = "filter_created_before";
- static final String FILTER_MODIFIED_AFTER = "filter_modified_after";
- static final String FILTER_MODIFIED_BEFORE = "filter_modified_before";
-
- public static ASelectableCondition create(final NamedObject simpleCond, final FormattedDate date) {
- if (simpleCond.objectEquals(TimeCondition.FILTER_MODIFIED_AFTER)) {
- return new TimeConditionModifiedAfter(date);
- }
- if (simpleCond.objectEquals(TimeCondition.FILTER_MODIFIED_BEFORE)) {
- return new TimeConditionModifiedBefore(date);
- }
- if (simpleCond.objectEquals(TimeCondition.FILTER_CREATED_AFTER)) {
- return new TimeConditionCreatedAfter(date);
- }
- if (simpleCond.objectEquals(TimeCondition.FILTER_CREATED_BEFORE)) {
- return new TimeConditionCreatedBefore(date);
- }
- return null;
- }
-
- final private FormattedDate date;
- public TimeCondition(final FormattedDate date) {
- this.date = date;
- }
-
- abstract protected String createDescription();
-
- public Date getDate() {
- return date;
- }
-
- abstract protected String getName();
-
-
- public void fillXML(final XMLElement child) {
- child.setAttribute(DATE, Long.toString(getDate().getTime()));
- }
-}
diff --git a/freeplane/src/org/freeplane/features/time/TimeConditionController.java b/freeplane/src/org/freeplane/features/time/TimeConditionController.java
deleted file mode 100644
index b896205..0000000
--- a/freeplane/src/org/freeplane/features/time/TimeConditionController.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.time;
-
-import java.util.Date;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.features.format.FormattedDate;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * 21.12.2008
- */
-public class TimeConditionController implements IElementaryConditionController {
- static final String FILTER_TIME = "filter_time";
-// // // final private Controller controller;
- private final ComboBoxEditor editor = new TimeComboBoxEditor(true);
- private final ComboBoxModel values = new DefaultComboBoxModel();
-
- public TimeConditionController() {
- super();
-// this.controller = controller;
- }
-
- public boolean canEditValues(final Object property, final NamedObject simpleCond) {
- return true;
- }
-
- public boolean canHandle(final Object selectedItem) {
- if (!(selectedItem instanceof NamedObject)) {
- return false;
- }
- final NamedObject namedObject = (NamedObject) selectedItem;
- return namedObject.objectEquals(TimeConditionController.FILTER_TIME);
- }
-
- public boolean canSelectValues(final Object property, final NamedObject simpleCond) {
- return true;
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCond,
- final Object value, final boolean matchCase,
- final boolean matchApproximately) {
- return TimeCondition.create(simpleCond, (FormattedDate) value);
- }
-
- public ComboBoxModel getConditionsForProperty(final Object property) {
- return new DefaultComboBoxModel(getTimeConditionNames());
- }
-
- public ListModel getFilteredProperties() {
- final DefaultListModel list = new DefaultListModel();
- list.addElement(TextUtils.createTranslatedString(FILTER_TIME));
- return list;
- }
-
- public Object[] getTimeConditionNames() {
- return new NamedObject[] { TextUtils.createTranslatedString(TimeCondition.FILTER_MODIFIED_AFTER),
- TextUtils.createTranslatedString(TimeCondition.FILTER_MODIFIED_BEFORE),
- TextUtils.createTranslatedString(TimeCondition.FILTER_CREATED_AFTER),
- TextUtils.createTranslatedString(TimeCondition.FILTER_CREATED_BEFORE) };
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- return editor;
- }
-
- public ComboBoxModel getValuesForProperty(final Object selectedItem, NamedObject simpleCond) {
- values.setSelectedItem(FormattedDate.createDefaultFormattedDate(new Date().getTime(), IFormattedObject.TYPE_DATETIME));
- return values;
- }
-
- public boolean isCaseDependent(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean supportsApproximateMatching(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- try {
- if (element.getName().equalsIgnoreCase(TimeConditionCreatedBefore.NAME)) {
- final String dateString = element.getAttribute(TimeCondition.DATE, null);
- FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
- return new TimeConditionCreatedBefore(date);
- }
- if (element.getName().equalsIgnoreCase(TimeConditionCreatedAfter.NAME)) {
- final String dateString = element.getAttribute(TimeCondition.DATE, null);
- FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
- return new TimeConditionCreatedAfter(date);
- }
- if (element.getName().equalsIgnoreCase(TimeConditionModifiedBefore.NAME)) {
- final String dateString = element.getAttribute(TimeCondition.DATE, null);
- FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
- return new TimeConditionModifiedBefore(date);
- }
- if (element.getName().equalsIgnoreCase(TimeConditionModifiedAfter.NAME)) {
- final String dateString = element.getAttribute(TimeCondition.DATE, null);
- FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
- return new TimeConditionModifiedAfter(date);
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- return null;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- return null;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/time/TimeController.java b/freeplane/src/org/freeplane/features/time/TimeController.java
deleted file mode 100644
index 2c0f878..0000000
--- a/freeplane/src/org/freeplane/features/time/TimeController.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.time;
-
-import org.freeplane.features.filter.FilterController;
-
-/**
- * @author Dimitry Polivaev
- * Mar 5, 2009
- */
-public class TimeController {
- public static void install() {
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(4,
- new TimeConditionController());
- }
-}
diff --git a/freeplane/src/org/freeplane/features/ui/CloseAction.java b/freeplane/src/org/freeplane/features/ui/CloseAction.java
deleted file mode 100644
index 98dd49e..0000000
--- a/freeplane/src/org/freeplane/features/ui/CloseAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.ui;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.mode.Controller;
-
-/** This closes only the current map */
-class CloseAction extends AFreeplaneAction {
- static final String NAME = "close";
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-// // final private Controller controller;
-
- CloseAction() {
- super("CloseAction");
-// this.controller = controller;
- }
-
- public void actionPerformed(final ActionEvent e) {
- Controller.getCurrentController().close(false);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/ui/FrameController.java b/freeplane/src/org/freeplane/features/ui/FrameController.java
deleted file mode 100644
index 6b47459..0000000
--- a/freeplane/src/org/freeplane/features/ui/FrameController.java
+++ /dev/null
@@ -1,676 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.ui;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.EventQueue;
-import java.awt.FlowLayout;
-import java.awt.Frame;
-import java.awt.KeyboardFocusManager;
-import java.awt.LayoutManager;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.awt.Window;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.ComboBoxEditor;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JComponent;
-import javax.swing.JFileChooser;
-import javax.swing.JFrame;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.RootPaneContainer;
-import javax.swing.UIManager;
-import javax.swing.UIManager.LookAndFeelInfo;
-import javax.swing.plaf.basic.BasicComboBoxEditor;
-import javax.swing.plaf.metal.MetalFileChooserUI;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.FixedBasicComboBoxEditor;
-import org.freeplane.core.ui.IUserInputListenerFactory;
-import org.freeplane.core.ui.components.ContainerComboBoxEditor;
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.format.FormattedDate;
-import org.freeplane.features.format.FormattedObject;
-import org.freeplane.features.format.ScannerController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.StyleNamedObject;
-import org.freeplane.features.time.TimeComboBoxEditor;
-
-/**
- * @author Dimitry Polivaev
- */
-abstract public class FrameController implements ViewController {
-
- private final class HorizontalToolbarPanel extends JPanel {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private HorizontalToolbarPanel(final LayoutManager layout) {
- super(layout);
- }
-
- @Override
- public void validateTree() {
- if (!isValid()) {
- super.validateTree();
- resizeToolbarPane();
- }
- }
-
- private void resizeToolbarPane() {
- if (getWidth() == 0) {
- return;
- }
- int lastComponent = getComponentCount() - 1;
- while (lastComponent >= 0 && !getComponent(lastComponent).isVisible()) {
- lastComponent--;
- }
- final Dimension oldPreferredSize = getPreferredSize();
- final Dimension preferredSize;
- if (lastComponent >= 0) {
- final Component component = getComponent(lastComponent);
- preferredSize = new Dimension(getWidth(), component.getY() + component.getHeight());
- }
- else {
- preferredSize = new Dimension(0, 0);
- }
- if (oldPreferredSize.height != preferredSize.height) {
- setPreferredSize(preferredSize);
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- getParent().invalidate();
- ((JComponent) getContentPane()).revalidate();
- }
- });
- }
- }
- }
-
- // // final private Controller controller;
- final private JLabel status;
- final private Map<String, Component> statusInfos;
- final private JPanel statusPanel;
- final private JComponent toolbarPanel[];
- private Rectangle frameSize;
-
- public Rectangle getFrameSize() {
- return frameSize;
- }
-
- public void setFrameSize(final Rectangle frameSize) {
- this.frameSize = frameSize;
- }
-
- private int winState;
- final private String propertyKeyPrefix;
- public static Icon textIcon;
- public static Icon numberIcon;
- public static Icon dateIcon;
- public static Icon dateTimeIcon;
- public static Icon linkIcon;
- public static Icon localLinkIcon;
-
- public FrameController(Controller controller, final IMapViewManager mapViewManager,
- final String propertyKeyPrefix) {
- super();
- final ResourceController resourceController = ResourceController.getResourceController();
- if(textIcon == null){
- FrameController.textIcon = new ImageIcon(resourceController.getResource("/images/text.png"));
- FrameController.numberIcon = new ImageIcon(resourceController.getResource("/images/number.png"));
- FrameController.dateIcon = new ImageIcon(resourceController.getResource("/images/calendar_red.png"));
- FrameController.dateTimeIcon = new ImageIcon(resourceController.getResource("/images/calendar_clock_red.png"));
- FrameController.linkIcon = new ImageIcon(resourceController.getResource("/images/" + resourceController.getProperty("link_icon")));
- FrameController.localLinkIcon = new ImageIcon(resourceController.getResource("/images/" + resourceController.getProperty("link_local_icon")));
- }
- this.propertyKeyPrefix = propertyKeyPrefix;
- statusPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 3, 0));
- statusPanel.putClientProperty(VISIBLE_PROPERTY_KEY, "status_visible");
- status = new JLabel();
- status.setBorder(BorderFactory.createEtchedBorder());
- statusPanel.add(status);
- statusInfos = new HashMap<String, Component>();
- statusInfos.put(STANDARD_STATUS_INFO_KEY, status);
-// this.controller = controller;
- controller.setViewController(this);
- controller.addAction(new ToggleFullScreenAction(this));
- controller.addAction(new CloseAction());
-
- controller.addAction(new ToggleMenubarAction(this));
- controller.addAction(new ToggleScrollbarsAction(this));
- controller.addAction(new ToggleToolbarAction("ToggleToolbarAction", "/main_toolbar"));
- controller.addAction(new ToggleToolbarAction("ToggleStatusAction", "/status"));
- toolbarPanel = new JComponent[4];
-
- toolbarPanel[TOP] = new HorizontalToolbarPanel(new FlowLayout(FlowLayout.LEFT, 0, 0));
- toolbarPanel[BOTTOM] = Box.createHorizontalBox();
- toolbarPanel[LEFT] = Box.createHorizontalBox();
- toolbarPanel[RIGHT] = Box.createVerticalBox();
- }
-
- public void changeNoteWindowLocation() {
- }
-
- public void err(final String msg) {
- status.setText(msg);
- }
-
- /**
- * @return
- */
- abstract public RootPaneContainer getRootPaneContainer();
-
- public Container getContentPane(){
- return getRootPaneContainer().getContentPane();
- }
-
- protected Controller getController() {
- return Controller.getCurrentController();
- }
-
- public Frame getFrame() {
- return JOptionPane.getFrameForComponent(getContentPane());
- }
-
- abstract public FreeplaneMenuBar getFreeplaneMenuBar();
-
- /**
- * @return
- */
- abstract public JFrame getJFrame();
-
- /**
- */
- public JComponent getStatusBar() {
- return statusPanel;
- }
-
- public void init(Controller controller) {
- getContentPane().add(toolbarPanel[TOP], BorderLayout.NORTH);
- getContentPane().add(toolbarPanel[LEFT], BorderLayout.WEST);
- getContentPane().add(toolbarPanel[RIGHT], BorderLayout.EAST);
- getContentPane().add(toolbarPanel[BOTTOM], BorderLayout.SOUTH);
-// status.setPreferredSize(status.getPreferredSize());
- status.setText("");
- getRootPaneContainer().getRootPane().putClientProperty(Controller.class, controller);
- final Frame frame = getFrame();
- frame.addComponentListener(new ComponentAdapter() {
- @Override
- public void componentResized(final ComponentEvent e) {
- final Frame frame = (Frame) e.getComponent();
- if (frame.getExtendedState() != Frame.NORMAL || isFullScreenEnabled()) {
- return;
- }
- frameSize = frame.getBounds();
- }
-
- @Override
- public void componentMoved(final ComponentEvent e) {
- componentResized(e);
- }
- });
- }
-
- abstract public void insertComponentIntoSplitPane(JComponent noteViewerComponent);
-
- abstract public boolean isApplet();
-
- public boolean isMenubarVisible() {
- return isComponentVisible("menubar");
- }
-
- public boolean areScrollbarsVisible() {
- return isComponentVisible("scrollbars");
- }
-
- private boolean isComponentVisible(String component) {
- final String property;
- if (isFullScreenEnabled()) {
- property = component+"Visible.fullscreen";
- }
- else {
- property = component +"Visible";
- }
- final boolean booleanProperty = ResourceController.getResourceController().getBooleanProperty(
- getPropertyKeyPrefix() + property);
- return booleanProperty;
- }
-
- abstract public void openDocument(URI uri) throws IOException;
-
- abstract public void openDocument(URL fileToUrl) throws Exception;
-
- public void out(final String msg) {
- status.setText(msg);
- }
-
- public void addStatusInfo(final String key, final String info) {
- addStatusInfo(key, info, null, null);
- }
-
- public void addStatusInfo(final String key, Icon icon) {
- addStatusInfo(key, null, icon, null);
- }
-
- public void addStatusInfo(final String key, final String info, Icon icon) {
- addStatusInfo(key, info, icon, null);
- }
-
- public void addStatusInfo(final String key, final String info, Icon icon, final String tooltip) {
- JLabel label = (JLabel) statusInfos.get(key);
- if (label == null) {
- label = new JLabel(info);
- label.setBorder(BorderFactory.createEtchedBorder());
- statusInfos.put(key, label);
- statusPanel.add(label, statusPanel.getComponentCount() - 1);
- }
- else {
- label.setText(info);
- label.revalidate();
- label.repaint();
- }
- label.setIcon(icon);
- label.setToolTipText(tooltip);
- label.setVisible(info != null || icon != null);
- }
-
- public void addStatusComponent(final String key, Component component) {
- Component oldComponent = statusInfos.put(key, component);
- if (oldComponent == null) {
- statusPanel.add(component, statusPanel.getComponentCount() - 1);
- }
- else {
- final int index = UITools.getComponentIndex(component);
- statusPanel.remove(index);
- statusPanel.add(component, index);
- }
- }
-
- public void removeStatus(final String key) {
- final Component oldComponent = statusInfos.remove(key);
- if (oldComponent == null) {
- return;
- }
- statusPanel.remove(oldComponent);
- }
-
- /**
- *
- */
- abstract public void removeSplitPane();
-
- public void saveProperties() {
- }
-
- public void selectMode( final ModeController oldModeController, final ModeController newModeController) {
- if (oldModeController == newModeController) {
- return;
- }
- if (oldModeController != null) {
- final IUserInputListenerFactory userInputListenerFactory = oldModeController.getUserInputListenerFactory();
- for (int j = 0; j < 4; j++) {
- final Iterable<JComponent> modeToolBars = userInputListenerFactory.getToolBars(j);
- if (modeToolBars != null) {
- for (final Component toolBar : modeToolBars) {
- toolbarPanel[j].remove(toolBar);
- }
- toolbarPanel[j].revalidate();
- }
- }
- }
- final IUserInputListenerFactory newUserInputListenerFactory = newModeController.getUserInputListenerFactory();
- for (int j = 0; j < 4; j++) {
- final Iterable<JComponent> newToolBars = newUserInputListenerFactory.getToolBars(j);
- if (newToolBars != null) {
- int i = 0;
- for (final JComponent toolBar : newToolBars) {
- toolBar.setVisible(isToolbarVisible(toolBar));
- toolbarPanel[j].add(toolBar, i++);
- }
- toolbarPanel[j].revalidate();
- toolbarPanel[j].repaint();
- }
- }
- setFreeplaneMenuBar(newUserInputListenerFactory.getMenuBar());
- setUIComponentsVisible(newModeController.getController().getMapViewManager());
- }
-
- private void setUIComponentsVisible(IMapViewManager iMapViewManager) {
- getFreeplaneMenuBar().setVisible(isMenubarVisible());
- }
-
- abstract protected void setFreeplaneMenuBar(FreeplaneMenuBar menuBar);
-
- public void setMenubarVisible(final boolean visible) {
- final FreeplaneMenuBar freeplaneMenuBar = getFreeplaneMenuBar();
- setComponentVisibleProperty("menubar", visible);
- freeplaneMenuBar.setVisible(visible);
- }
-
- public void setScrollbarsVisible(final boolean visible) {
- setComponentVisibleProperty("scrollbars", visible);
- }
-
- private void setComponentVisibleProperty(final String componentName, final boolean visible) {
- final String property;
- if (isFullScreenEnabled()) {
- property = componentName+"Visible.fullscreen";
- }
- else {
- property = componentName+"Visible";
- }
- ResourceController.getResourceController().setProperty(getPropertyKeyPrefix() + property, visible);
- }
-
- /**
- * Set the Frame title with mode and file if exist
- */
-
- abstract public void setTitle(String frameTitle);
-
- /**
- * @param b
- */
- abstract public void setWaitingCursor(boolean b);
-
- public void viewNumberChanged(final int number) {
- }
-
- void setFullScreen(final boolean fullScreen) {
- final Frame frame = getFrame();
- final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
- if (fullScreen == isFullScreenEnabled()) {
- return;
- }
- final Controller controller = getController();
- ResourceController.getResourceController().firePropertyChanged(FULLSCREEN_ENABLED_PROPERTY, Boolean.toString(!fullScreen),Boolean.toString(fullScreen));
- Iterable<Window> visibleFrames = collectVisibleFrames(frame);
- if (fullScreen) {
- winState = frame.getExtendedState();
- frame.dispose();
- frame.setExtendedState(Frame.MAXIMIZED_BOTH);
- final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- frame.setBounds(0, 0, screenSize.width, screenSize.height);
- frame.setUndecorated(true);
- frame.setResizable(false);
- setUIComponentsVisible(controller.getMapViewManager());
- for (int j = 0; j < 4; j++) {
- final Iterable<JComponent> toolBars = controller.getModeController().getUserInputListenerFactory()
- .getToolBars(j);
- for (final JComponent toolBar : toolBars) {
- toolBar.setVisible(isToolbarVisible(toolBar));
- }
- }
- showWindows(visibleFrames);
- }
- else {
- frame.dispose();
- frame.setUndecorated(false);
- frame.setResizable(true);
- frame.setBounds(frameSize);
- frame.setExtendedState(winState);
- setUIComponentsVisible(controller.getMapViewManager());
- for (int j = 0; j < 4; j++) {
- final Iterable<JComponent> toolBars = controller.getModeController().getUserInputListenerFactory()
- .getToolBars(j);
- for (final JComponent toolBar : toolBars) {
- toolBar.setVisible(isToolbarVisible(toolBar));
- }
- }
- showWindows(visibleFrames);
- }
- if(focusOwner != null)
- focusOwner.requestFocus();
- }
-
- private Collection<Window> collectVisibleFrames(Window window) {
- if(! window.isVisible())
- return Collections.emptyList();
- Window[] ownedWindows = window.getOwnedWindows();
- ArrayList<Window> visibleWindows = new ArrayList(ownedWindows.length+ 1);
- visibleWindows.add(window);
- for(Window child : ownedWindows){
- visibleWindows.addAll(collectVisibleFrames(child));
- }
- return visibleWindows;
- }
-
- protected void showWindows(final Iterable<Window> windows) {
- for(Window child : windows)
- child.setVisible(true);
- }
-
- boolean isToolbarVisible(final JComponent toolBar) {
- final String completeKeyString = completeVisiblePropertyKey(toolBar);
- if (completeKeyString == null) {
- return true;
- }
- return !"false".equals(ResourceController.getResourceController().getProperty(completeKeyString, "true"));
- }
-
- public String completeVisiblePropertyKey(final JComponent toolBar) {
- final Object key = toolBar.getClientProperty(VISIBLE_PROPERTY_KEY);
- if (key == null) {
- return null;
- }
- final String keyString = key.toString();
- final String completeKeyString;
- if (isFullScreenEnabled()) {
- completeKeyString = keyString + ".fullscreen";
- }
- else {
- completeKeyString = keyString;
- }
- return getPropertyKeyPrefix() + completeKeyString;
- }
-
- public boolean isFullScreenEnabled() {
- return !getFrame().isResizable();
- }
-
- protected String getPropertyKeyPrefix() {
- return propertyKeyPrefix;
- }
-
- public static void setLookAndFeel(final String lookAndFeel) {
- try {
- if (lookAndFeel.equals("default")) {
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- }
- else {
- LookAndFeelInfo[] lafInfos = UIManager.getInstalledLookAndFeels();
- boolean setLnF = false;
- for(LookAndFeelInfo lafInfo : lafInfos){
- if(lafInfo.getName().equalsIgnoreCase(lookAndFeel)){
- UIManager.setLookAndFeel(lafInfo.getClassName());
- Controller.getCurrentController().getResourceController().setProperty("lookandfeel", lafInfo.getClassName());
- setLnF = true;
- break;
- }
- if(lafInfo.getClassName().equals(lookAndFeel)){
- UIManager.setLookAndFeel(lafInfo.getClassName());
- setLnF = true;
- break;
- }
- }
- if(!setLnF){
- UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
- Controller.getCurrentController().getResourceController().setProperty("lookandfeel", "default");
- }
- }
- }
- catch (final Exception ex) {
- LogUtils.warn("Error while setting Look&Feel" + lookAndFeel);
- }
-
- UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
-
- // Workaround for http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7077418
- // NullPointerException in WindowsFileChooserUI when system icons missing/invalid
- // set FileChooserUI to MetalFileChooserUI if no JFileChooser can be created
- try{
- new JFileChooser();
- }
- catch (Throwable t){
- try{
- UIManager.getLookAndFeelDefaults().put("FileChooserUI", MetalFileChooserUI.class.getName());
- }
- catch (Throwable t1){
- }
- }
- }
-
- public void addObjectTypeInfo(Object value) {
- if (value instanceof FormattedObject) {
- value = ((FormattedObject) value).getObject();
- }
- if (value instanceof String || value instanceof StyleNamedObject) {
- addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.textIcon);
- }
- else if (value instanceof FormattedDate) {
- final FormattedDate fd = (FormattedDate) value;
- if (fd.containsTime()) {
- addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.dateTimeIcon);
- }
- else {
- addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.dateIcon);
- }
- }
- else if (value instanceof Number) {
- addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.numberIcon);
- }
- else if (value instanceof URI) {
- addStatusInfo(ResourceController.OBJECT_TYPE, null, FrameController.linkIcon);
- }
- else {
- addStatusInfo(ResourceController.OBJECT_TYPE, null, null);
- }
- }
-
- public static ComboBoxEditor getTextDateTimeEditor() {
- final ContainerComboBoxEditor editor = new ContainerComboBoxEditor();
- final NamedObject keyText = new NamedObject("text", "1Ab");
- final BasicComboBoxEditor textEditor = new FixedBasicComboBoxEditor(){
- private Object oldItem;
-
- @Override
- public void setItem(Object object) {
- oldItem = object;
- if(object instanceof FormattedDate)
- super.setItem("");
- else
- super.setItem(object);
- }
-
- @Override
- public Object getItem() {
- final Object item = super.getItem();
- final Object oldItem = this.oldItem;
- this.oldItem = null;
- if(item != null && oldItem != null && item.toString().equals(oldItem.toString()))
- return oldItem;
- if(ResourceController.getResourceController().getBooleanProperty("parse_data")
- && item instanceof String){
- final Object scannedObject = ScannerController.getController().parse((String)item);
- return scannedObject;
- }
- return item;
- }
-
- };
- editor.put(keyText, textEditor);
-
- final NamedObject keyDate = new NamedObject("date", "");
- keyDate.setIcon(dateIcon);
- final TimeComboBoxEditor dateComboBoxEditor = new TimeComboBoxEditor(false){
- @Override
- public void setItem(Object object) {
- if(object instanceof FormattedDate && !((FormattedDate)object).containsTime())
- super.setItem(object);
- else
- super.setItem(null);
- }
- };
-
- dateComboBoxEditor.setItem();
- editor.put(keyDate, dateComboBoxEditor);
-
- final NamedObject keyDateTime = new NamedObject("date_time", "");
- keyDateTime.setIcon(dateTimeIcon);
- final TimeComboBoxEditor dateTimeComboBoxEditor = new TimeComboBoxEditor(true){
- @Override
- public void setItem(Object object) {
- if(object instanceof FormattedDate && ((FormattedDate)object).containsTime())
- super.setItem(object);
- else
- super.setItem(null);
- }
- };
- dateTimeComboBoxEditor.setItem();
- editor.put(keyDateTime, dateTimeComboBoxEditor);
-
- return editor;
- }
-
- public boolean quit() {
- return getController().getMapViewManager().closeAllMaps();
- }
-
- public boolean isDispatchThread() {
- return EventQueue.isDispatchThread();
- }
-
- public void invokeLater(Runnable runnable) {
- EventQueue.invokeLater(runnable);
- }
-
- public void invokeAndWait(Runnable runnable) throws InterruptedException, InvocationTargetException {
- EventQueue.invokeAndWait(runnable);
- }
-
- public boolean isHeadless() {
- return false;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/ui/IMapViewManager.java b/freeplane/src/org/freeplane/features/ui/IMapViewManager.java
deleted file mode 100644
index d667bd4..0000000
--- a/freeplane/src/org/freeplane/features/ui/IMapViewManager.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.ui;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.image.RenderedImage;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.JScrollPane;
-
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.view.swing.map.MapView;
-
-/**
- * @author Dimitry Polivaev
- * 12.01.2009
- */
-public interface IMapViewManager {
- public void addMapSelectionListener(final IMapSelectionListener pListener);
-
- public void addMapViewChangeListener(final IMapViewChangeListener pListener);
-
- /**
- * is null if the old mode should be closed.
- *
- * @return true if the set command was sucessful.
- */
- public boolean changeToMapView(final Component newMapView);
-
- public boolean changeToMapView(final String mapViewDisplayName);
-
- public boolean changeToMode(final String modeName);
-
- /**
- * Checks, whether or not a given url is already opened. Unlike
- * tryToChangeToMapView, it does not consider the map+extension identifiers
- * nor switches to the mapView.
- *
- * @return null, if not found, the map+extension identifier otherwise.
- */
- public String checkIfFileIsAlreadyOpened(final URL urlToCheck) throws MalformedURLException;
-
- /**
- * Close the currently active map, return false if closing canceled.
- *
- * @param withoutSave
- * forces the closing without any save actions.
- */
- public boolean close(final boolean withoutSave);
- public boolean close(final Component view, final boolean force);
-
- public String createHtmlMap();
-
- public RenderedImage createImage(int dpi);
-
- public Color getBackgroundColor(NodeModel node);
-
- public Component getComponent(NodeModel node);
-
- public Font getFont(NodeModel node);
-
- /** @return an unmodifiable set of all display names of current opened maps. */
- public List<String> getMapKeys();
-
- public Map<String, MapModel> getMaps();
-
- public IMapSelection getMapSelection();
-
- public Component getMapViewComponent();
-
- public List<? extends Component> getMapViewVector();
-
- public ModeController getModeController(Component newMap);
-
- public MapModel getModel();
-
- public MapModel getModel(Component mapView);
-
- public Component getSelectedComponent();
-
- public Color getTextColor(NodeModel node);
-
- public float getZoom();
-
- public void newMapView(final MapModel map, ModeController modeController);
-
- public void nextMapView();
-
- public void previousMapView();
-
- public void removeMapSelectionListener(final IMapSelectionListener pListener);
-
- public void removeMapViewChangeListener(final IMapViewChangeListener pListener);
-
- public void scrollNodeToVisible(NodeModel node);
-
- public void setZoom(float zoom);
-
- /**
- * This is the question whether the map is already opened. If this is the
- * case, the map is automatically opened + returns true. Otherwise does
- * nothing + returns false.
- */
- public boolean tryToChangeToMapView(final String mapView);
- public boolean tryToChangeToMapView(final URL url) throws MalformedURLException;
-
- public void updateMapViewName();
-
- public boolean isLeftTreeSupported(Component mapViewComponent);
-
- public Map<String, MapModel> getMaps(String modename);
-
- public List<Component> getViews(MapModel map);
- public void updateMenus(final MenuBuilder menuBuilder);
- public void obtainFocusForSelected();
- public void setTitle();
- public Object setEdgesRenderingHint(final Graphics2D g);
- public void setTextRenderingHint(final Graphics2D g);
- public boolean closeAllMaps();
-}
diff --git a/freeplane/src/org/freeplane/features/ui/ToggleToolbarAction.java b/freeplane/src/org/freeplane/features/ui/ToggleToolbarAction.java
deleted file mode 100644
index ed50ada..0000000
--- a/freeplane/src/org/freeplane/features/ui/ToggleToolbarAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.ui;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.JComponent;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.features.mode.Controller;
-
- at SelectableAction(checkOnPopup = true)
-public class ToggleToolbarAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- /**
- *
- */
- private final String toolbarName;
-
- public ToggleToolbarAction( final String actionName, final String toolbarName) {
- super(actionName);
- this.toolbarName = toolbarName;
- }
-
- public void actionPerformed(final ActionEvent event) {
- final ResourceController resourceController = ResourceController.getResourceController();
- final JComponent toolBar = getToolbar();
- final String propertyName = Controller.getCurrentController().getViewController().completeVisiblePropertyKey(toolBar);
- final boolean wasVisible = resourceController.getBooleanProperty(propertyName);
- final boolean visible = !wasVisible;
- resourceController.setProperty(propertyName, visible);
- setVisible(toolBar, visible);
- }
-
- protected void setVisible(final JComponent toolBar, final boolean visible) {
- toolBar.setVisible(visible);
- ((JComponent) toolBar.getParent()).revalidate();
- }
-
- private JComponent getToolbar() {
- final JComponent toolBar = Controller.getCurrentModeController().getUserInputListenerFactory().getToolBar(toolbarName);
- return toolBar;
- }
-
- @Override
- public void setSelected() {
- final boolean isVisible = isVisible();
- setSelected(isVisible);
- }
-
- public boolean isVisible() {
- final JComponent toolBar = getToolbar();
- final boolean isVisible = ((FrameController) Controller.getCurrentController().getViewController()).isToolbarVisible(toolBar);
- return isVisible;
- }
-
- @Override
- public void afterMapChange(final Object newMap) {
- }
-}
diff --git a/freeplane/src/org/freeplane/features/ui/ViewController.java b/freeplane/src/org/freeplane/features/ui/ViewController.java
deleted file mode 100644
index 40471b4..0000000
--- a/freeplane/src/org/freeplane/features/ui/ViewController.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.ui;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Frame;
-import java.awt.Rectangle;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.net.URL;
-import java.util.concurrent.ExecutionException;
-
-import javax.swing.Icon;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.RootPaneContainer;
-
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-/**
- * @author Dimitry Polivaev
- * 24.12.2012
- */
-public interface ViewController {
- public static final String FULLSCREEN_ENABLED_PROPERTY = "fullscreen_enabled";
- public static final String STANDARD_STATUS_INFO_KEY = "standard";
- public static final String VISIBLE_PROPERTY_KEY = "VISIBLE_PROPERTY_KEY";
- public static final int BOTTOM = 3;
- public static final int LEFT = 1;
- public static final int RIGHT = 2;
- public static final int TOP = 0;
- public static final String RESOURCE_ANTIALIAS = "antialias";
-
- public Rectangle getFrameSize();
-
- public void setFrameSize(final Rectangle frameSize);
- public boolean isFullScreenEnabled();
-
- public static final String SLOW_SCROLLING = "slowScrolling";
-
- public void changeNoteWindowLocation();
-
- public void err(final String msg);
-
- /**
- * @return
- */
- public RootPaneContainer getRootPaneContainer();
-
- public Container getContentPane();
-
- public Frame getFrame();
-
- public FreeplaneMenuBar getFreeplaneMenuBar();
-
- /**
- * @return
- */
-
- public JFrame getJFrame();
-
- /**
- */
- public JComponent getStatusBar();
-
- public void init(Controller controller);
-
- public void insertComponentIntoSplitPane(JComponent noteViewerComponent);
-
- public boolean isApplet();
-
- public boolean isMenubarVisible();
-
- public void openDocument(URI uri) throws IOException;
-
- public void openDocument(URL fileToUrl) throws Exception;
-
- public void out(final String msg);
-
- public void addStatusInfo(final String key, final String info);
-
- public void addStatusInfo(final String key, Icon icon);
-
- public void addStatusInfo(final String key, final String info, Icon icon);
-
- public void addStatusInfo(final String key, final String info, Icon icon, final String tooltip);
-
- public void addStatusComponent(final String key, Component component);
-
- public void removeStatus(final String key);
-
- /**
- *
- */
- public void removeSplitPane();
-
- public void saveProperties();
-
- public void selectMode(final ModeController oldModeController, final ModeController newModeController);
-
- public void setMenubarVisible(final boolean visible);
-
- /**
- * Set the Frame title with mode and file if exist
- */
- public void setTitle(String frameTitle);
-
- /**
- * @param b
- */
- public void setWaitingCursor(boolean b);
-
- public void viewNumberChanged(final int number);
-
- public String completeVisiblePropertyKey(final JComponent toolBar);
-
- public void addObjectTypeInfo(Object value);
-
- public boolean quit();
-
- public boolean isDispatchThread();
- public void invokeLater(Runnable runnable);
-
- public void invokeAndWait(Runnable runnable) throws InterruptedException, InvocationTargetException, ExecutionException;
-
- public boolean isHeadless();
-
- public boolean areScrollbarsVisible();
-
- public void setScrollbarsVisible(boolean b);
-
-}
diff --git a/freeplane/src/org/freeplane/features/url/FreeplaneUriConverter.java b/freeplane/src/org/freeplane/features/url/FreeplaneUriConverter.java
deleted file mode 100644
index 46995aa..0000000
--- a/freeplane/src/org/freeplane/features/url/FreeplaneUriConverter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2014 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url;
-
-import static org.freeplane.features.url.UrlManager.FREEPLANE_SCHEME;
-
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-
-
-/**
- * @author Dimitry Polivaev
- * 12.01.2014
- */
-public class FreeplaneUriConverter{
- private static final String ENCODED_SPACE = "/%20";
- private static final String ENCODED_FREEPLANE_URI_PREFIX = FREEPLANE_SCHEME + ":" + ENCODED_SPACE;
- private static final String INTERNET_EXPLORER_FREEPLANE_URI_PREFIX = FREEPLANE_SCHEME + ":" + "/ ";
- private static final String MS_OFFICE_FREEPLANE_URI_PREFIX = FREEPLANE_SCHEME + ":" + "// ";
- private static final String[] MICROSOFT_URI_PREFIXES = new String[] {INTERNET_EXPLORER_FREEPLANE_URI_PREFIX, MS_OFFICE_FREEPLANE_URI_PREFIX};
-
- public String freeplaneUriForFile(final String fileBasedUri) {
- return ENCODED_FREEPLANE_URI_PREFIX + fileBasedUri.substring(UrlManager.FILE_SCHEME.length() + 1);
- }
-
- public URL freeplaneUrl(URI uri) throws MalformedURLException {
- final String scheme = uri.getScheme();
- if(FREEPLANE_SCHEME.equals(scheme)){
- return new URL(UrlManager.FILE_SCHEME, uri.getHost(), uri.getPath().substring(2));
- }
- else
- return new URL(scheme, uri.getHost(), uri.getPath());
- }
-
- public String fixPartiallyDecodedFreeplaneUriComingFromInternetExplorer(String uriCandidate) {
- for (String microsoftPrefix : MICROSOFT_URI_PREFIXES)
- if(uriCandidate.startsWith(microsoftPrefix)){
- int referenceStart = uriCandidate.indexOf('#');
- if(referenceStart == -1)
- referenceStart = uriCandidate.length();
- URI uri;
- try {
- String path = uriCandidate.substring(microsoftPrefix.length(), referenceStart);
- uri = new URI(FREEPLANE_SCHEME, path, null);
- String encodedPath = uri.getRawPath();
- return ENCODED_FREEPLANE_URI_PREFIX + encodedPath + uriCandidate.substring(referenceStart);
- }
- catch (URISyntaxException e) {
- return uriCandidate;
- }
- }
- return uriCandidate;
-
- }
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/features/url/MapVersionInterpreter.java b/freeplane/src/org/freeplane/features/url/MapVersionInterpreter.java
deleted file mode 100644
index 086ebf8..0000000
--- a/freeplane/src/org/freeplane/features/url/MapVersionInterpreter.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package org.freeplane.features.url;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.XsltPipeReaderFactory;
-import org.freeplane.features.map.MapModel;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-public class MapVersionInterpreter implements IExtension{
-/*
- FREEPLANE1_2_0("freeplane 1.2.0", false, false, "Freeplane", "freeplane.url"),
- FREEPLANE1_1("0.9.0", false, false, "Freeplane", "freeplane.url"),
- FREEMIND_1("1.", false, true, "FreeMind", "freemind.url"),
- DOCEAR("docear ", false, true, "Docear", "docear.url"),
-
-*/
- static final public IMapInputStreamConverter DEFAULT_INPUTSTREAM_CONVERTER = new IMapInputStreamConverter() {
- private static final String FREEPLANE_VERSION_UPDATER_XSLT = "/xslt/freeplane_version_updater.xslt";
- public Reader getConvertedStream(File f) throws FileNotFoundException, IOException {
- return new XsltPipeReaderFactory().getUpdateReader(f, FREEPLANE_VERSION_UPDATER_XSLT);
- }
- };
- static final public MapVersionInterpreter DEFAULT = new MapVersionInterpreter("", 0, "", true, true, null, null);
- final public String mapBegin;
- final public String name;
- final public int version;
- final public boolean needsConversion;
- final public boolean anotherDialect;
- final public String appName;
- final public String url;
- final public IMapInputStreamConverter inputStreamConverter;
- final public IMapConverter mapConverter;
-
- MapVersionInterpreter(String name, int version, String versionBegin, boolean needsConversion, boolean anotherDialect,
- String appName, String url) {
- this(name, version, versionBegin, needsConversion, anotherDialect, appName, url, DEFAULT_INPUTSTREAM_CONVERTER, null);
- }
-
- public MapVersionInterpreter(String name, int version, String versionBegin, boolean needsConversion, boolean anotherDialect,
- String appName, String url, IMapInputStreamConverter inputStreamConverter, IMapConverter mapConverter) {
-
- this.inputStreamConverter = inputStreamConverter;
- this.mapConverter = mapConverter;
-
- this.name = name;
- this.version = version;
- this.mapBegin = "<map version=\"" + versionBegin;
- this.needsConversion = needsConversion;
- this.anotherDialect = anotherDialect;
- this.appName = appName;
- this.url = url;
- }
-
- public static MapVersionInterpreter getVersionInterpreter(String mapBegin){
- for (MapVersionInterpreter interpreter : MapVersionInterpreter.values()){
- if(interpreter.knows(mapBegin))
- return interpreter;
- }
- return DEFAULT;
- }
-
- private static MapVersionInterpreter[] values = null;
- private static MapVersionInterpreter[] values() {
- if(values == null){
- try {
- DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
- DocumentBuilder documentBuilder = domFactory.newDocumentBuilder();
- InputStream resource = ResourceController.getResourceController().getResource("/xml/mapVersions.xml").openStream();
- Document dom = documentBuilder.parse(resource);
- Element root = dom.getDocumentElement();
- NodeList dialectElements = root.getElementsByTagName("dialect");
- final int dialectNumber = dialectElements.getLength();
- values = new MapVersionInterpreter[dialectNumber];
- for(int i = 0; i < dialectNumber; i++){
- Element dialectElement = (Element) dialectElements.item(i);
- String versionBegin = dialectElement.getAttribute("versionBegin");
- boolean needsConversion = Boolean.parseBoolean(dialectElement.getAttribute("needsConversion"));
- boolean anotherDialect = Boolean.parseBoolean(dialectElement.getAttribute("anotherDialect"));
- String name = dialectElement.getAttribute("name");
- String appName = dialectElement.getAttribute("appName");
- String url = dialectElement.getAttribute("url");
- int version = Integer.parseInt(dialectElement.getAttribute("version"));
- values[i] = new MapVersionInterpreter(name, version, versionBegin, needsConversion, anotherDialect, appName, url);
- }
- resource.close();
- } catch (Exception e) {
- LogUtils.severe(e);
- values = new MapVersionInterpreter[]{};
- }
- }
- return values;
- }
-
- public static void addMapVersionInterpreter(MapVersionInterpreter interpreter) {
- ArrayList<MapVersionInterpreter> list = new ArrayList<MapVersionInterpreter>();
- list.add(interpreter);
- list.addAll(Arrays.asList(values()));
- values = list.toArray(values);
- }
-
- private boolean knows(String mapBegin) {
- return mapBegin.startsWith(this.mapBegin);
- }
-
- public IMapConverter getMapConverter() {
- return this.mapConverter;
- }
-
- public IMapInputStreamConverter getMapInputStreamConverter() {
- return this.inputStreamConverter;
- }
-
- public String getDialectInfo(String path){
- final String appInfo;
- if(appName != null) {
- if("Freeplane".equals(appName))
- appInfo = TextUtils.format("dialect_info.later_version", path);
- else
- appInfo = TextUtils.format("dialect_info.app", path, appName);
- }
- else
- appInfo = TextUtils.format("dialect_info.unknownApp", path);
- final String warning = TextUtils.getText("dialect_info.warning");
- final String urlInfo;
- if(url != null)
- urlInfo = TextUtils.format("dialect_info.url", url);
- else
- urlInfo = TextUtils.getText("dialect_info.unknownURL");
- return appInfo +" "+ warning +" "+ urlInfo;
- }
-
- static public boolean isOlderThan(MapModel map, int version){
- MapVersionInterpreter versionInterpreter = map.getExtension(MapVersionInterpreter.class);
- return versionInterpreter != null && versionInterpreter.version < version;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/UrlManager.java b/freeplane/src/org/freeplane/features/url/UrlManager.java
deleted file mode 100644
index f5e74ea..0000000
--- a/freeplane/src/org/freeplane/features/url/UrlManager.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url;
-
-import static java.util.Arrays.asList;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.HeadlessException;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLConnection;
-
-import javax.swing.AbstractAction;
-import javax.swing.ActionMap;
-import javax.swing.InputMap;
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.KeyStroke;
-import javax.swing.filechooser.FileFilter;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mapio.MapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.n3.nanoxml.XMLException;
-import org.freeplane.n3.nanoxml.XMLParseException;
-
-/**
- * @author Dimitry Polivaev
- */
-public class UrlManager implements IExtension {
- public static final String SMB_SCHEME = "smb";
- public static final String FREEPLANE_SCHEME = "freeplane";
- public static final String FILE_SCHEME = "file";
- public static final String FREEPLANE_FILE_EXTENSION_WITHOUT_DOT = "mm";
- public static final String FREEPLANE_FILE_EXTENSION = "." + FREEPLANE_FILE_EXTENSION_WITHOUT_DOT;
- public static final String FREEPLANE_ADD_ON_FILE_EXTENSION = ".addon." + FREEPLANE_FILE_EXTENSION_WITHOUT_DOT;
- private static File lastCurrentDir = null;
- public static final String MAP_URL = "map_url";
-
- public static UrlManager getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- return modeController.getExtension(UrlManager.class);
- }
-
- public static void install( final UrlManager urlManager) {
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addExtension(UrlManager.class, urlManager);
- urlManager.init();
- }
-
-// // final private Controller controller;
-// final private ModeController modeController;
-
- public UrlManager() {
- super();
- }
-
- protected void init() {
-// this.modeController = modeController;
-// controller = modeController.getController();
- createActions();
- }
-
- /**
- *
- */
- private void createActions() {
- }
-
- public JFileChooser getFileChooser(final FileFilter filter, boolean useDirectorySelector) {
- return getFileChooser(filter, useDirectorySelector, false);
- }
-
- /**
- * Creates a file chooser with the last selected directory as default.
- * @param useDirectorySelector
- */
- @SuppressWarnings("serial")
- public JFileChooser getFileChooser(final FileFilter filter, boolean useDirectorySelector, boolean showHiddenFiles) {
- final File parentFile = getMapsParentFile(Controller.getCurrentController().getMap());
- if (parentFile != null && getLastCurrentDir() == null) {
- setLastCurrentDir(parentFile);
- }
- final JFileChooser chooser = new JFileChooser(){
- @Override
- protected JDialog createDialog(Component parent) throws HeadlessException {
- final JDialog dialog = super.createDialog(parent);
- final JComponent selector = createDirectorySelector(this);
-
- //Close dialog when escape is pressed
- InputMap in = dialog.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
- in.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0), "escape");
- ActionMap aMap = dialog.getRootPane().getActionMap();
- aMap.put("escape", new AbstractAction()
- {
- public void actionPerformed (ActionEvent e)
- {
- dialog.dispose();
- }
- });
- if(selector != null){
- dialog.getContentPane().add(selector, BorderLayout.NORTH);
- dialog.pack();
- }
-
- return dialog;
- }
-
- };
- if (getLastCurrentDir() != null) {
- chooser.setCurrentDirectory(getLastCurrentDir());
- }
- if (showHiddenFiles) {
- chooser.setFileHidingEnabled(false);
- }
- if (filter != null) {
- chooser.addChoosableFileFilter(filter);
- chooser.setFileFilter(filter);
- }
- return chooser;
- }
-
- protected JComponent createDirectorySelector(JFileChooser chooser) {
- return null;
- }
- public File getLastCurrentDir() {
- return lastCurrentDir;
- }
-
- protected File getMapsParentFile(final MapModel map) {
- if ((map != null) && (map.getFile() != null) && (map.getFile().getParentFile() != null)) {
- return map.getFile().getParentFile();
- }
- return null;
- }
-
- public void handleLoadingException(final Exception ex) {
- final String exceptionType = ex.getClass().getName();
- if (exceptionType.equals(XMLParseException.class.getName())) {
- final int showDetail = JOptionPane.showConfirmDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent(),
- TextUtils.getText("map_corrupted"), "Freeplane", JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE);
- if (showDetail == JOptionPane.YES_OPTION) {
- UITools.errorMessage(ex);
- }
- }
- else if (exceptionType.equals(FileNotFoundException.class.getName())) {
- UITools.errorMessage(ex.getMessage());
- }
- else if (exceptionType.equals("org.freeplane.features.url.mindmapmode.SkipException")) {
- return;
- }
- else {
- LogUtils.severe(ex);
- UITools.errorMessage(ex);
- }
- }
-
- /**@deprecated -- use {@link MapIO#loadCatchExceptions(URL url, MapModel map)} */
- @Deprecated
- public boolean loadCatchExceptions(final URL url, final MapModel map){
- InputStreamReader urlStreamReader = null;
- try {
- urlStreamReader = load(url, map);
- return true;
- }
- catch (final XMLException ex) {
- LogUtils.warn(ex);
- }
- catch (final IOException ex) {
- LogUtils.warn(ex);
- }
- catch (final RuntimeException ex) {
- LogUtils.severe(ex);
- }
- finally {
- FileUtils.silentlyClose(urlStreamReader);
- }
- UITools.errorMessage(TextUtils.format("url_open_error", url.toString()));
- return false;
- }
-
- /**@deprecated -- use {@link MapIO#load(URL url, MapModel map)} */
- @Deprecated
- public InputStreamReader load(final URL url, final MapModel map)
- throws IOException, XMLException {
- InputStreamReader urlStreamReader;
- setURL(map, url);
- InputStream inputStream = getLocation(url).openStream();
- urlStreamReader = new InputStreamReader(inputStream);
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.getMapController().getMapReader().createNodeTreeFromXml(map, urlStreamReader, Mode.FILE);
- return urlStreamReader;
- }
-
- private URL getLocation(final URL url) throws IOException {
- URLConnection connection = url.openConnection();
- if(connection instanceof HttpURLConnection){
- int responseCode = ((HttpURLConnection)connection).getResponseCode();
- if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP
- || responseCode == HttpURLConnection.HTTP_MOVED_PERM
- || responseCode == HttpURLConnection.HTTP_SEE_OTHER){
- String redirectUrl = connection.getHeaderField("Location");
- return getLocation(new URL(redirectUrl));
- }
- }
- return url;
- }
-
- /**@deprecated -- use {@link MapIO#load(URL url, MapModel map)} */
- @Deprecated
- public boolean loadImpl(final URL url, final MapModel map){
- return loadCatchExceptions(url, map);
- }
-
- /**@deprecated -- use LinkController*/
- @Deprecated
- public void loadURL(URI uri) {
- final String uriString = uri.toString();
- if (uriString.startsWith("#")) {
- final String target = uri.getFragment();
- try {
- final ModeController modeController = Controller.getCurrentModeController();
- final MapController mapController = modeController.getMapController();
- final NodeModel node = mapController.getNodeFromID(target);
- if (node != null) {
- mapController.select(node);
- }
- }
- catch (final Exception e) {
- LogUtils.warn("link " + target + " not found", e);
- UITools.errorMessage(TextUtils.format("link_not_found", target));
- }
- return;
- }
- try {
- final String extension = FileUtils.getExtension(uri.getRawPath());
- if(! uri.isAbsolute()){
- URI absoluteUri = getAbsoluteUri(uri);
- if (absoluteUri == null) {
- final MapModel map = Controller.getCurrentController().getMap();
- if (map.getURL() == null)
- UITools.errorMessage(TextUtils.getText("map_not_saved"));
- else
- UITools.errorMessage(TextUtils.format("link_not_found", String.valueOf(uri)));
- return;
- }
- uri = absoluteUri;
- }
- //DOCEAR: mindmaps can be linked in a mindmap --> therefore project-relative-paths are possible
- if(! asList(FILE_SCHEME, SMB_SCHEME, FREEPLANE_SCHEME).contains(uri.getScheme())) {
- try {
- uri = uri.toURL().openConnection().getURL().toURI().normalize();
- }
- catch (Exception e) {
- // ignore all exceptions due to unknown protocols
- }
- }
- try {
- if ((extension != null)
- && extension.equals(UrlManager.FREEPLANE_FILE_EXTENSION_WITHOUT_DOT)) {
- FreeplaneUriConverter freeplaneUriConverter = new FreeplaneUriConverter();
- final URL url = freeplaneUriConverter.freeplaneUrl(uri);
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.getMapController().newMap(url);
- final String ref = uri.getFragment();
- if (ref != null) {
- final ModeController newModeController = Controller.getCurrentModeController();
- final MapController newMapController = newModeController.getMapController();
- newMapController.select(newMapController.getNodeFromID(ref));
- }
- return;
- }
- Controller.getCurrentController().getViewController().openDocument(uri);
- }
- catch (final Exception e) {
- LogUtils.warn("link " + uri + " not found", e);
- UITools.errorMessage(TextUtils.format("link_not_found", uri.toString()));
- }
- return;
- }
- catch (final MalformedURLException ex) {
- LogUtils.warn("URL " + uriString + " not found", ex);
- UITools.errorMessage(TextUtils.format("link_not_found", uriString));
- }
- }
-
- private URI getAbsoluteUri(final URI uri) throws MalformedURLException {
- if (uri.isAbsolute()) {
- return uri;
- }
- final MapModel map = Controller.getCurrentController().getMap();
- return getAbsoluteUri(map, uri);
- }
-
-
- public URI getAbsoluteUri(final MapModel map, URI uri) throws MalformedURLException {
-// final URI resolvedURI = resolveProjectUri(uri);
- final URI resolvedURI = uri;
- if (resolvedURI == null || resolvedURI.isAbsolute()) {
- return resolvedURI;
- }
- final String path = resolvedURI.getPath();
- try {
- URL context = map.getURL();
- if(context == null)
- return null;
- final URL url = new URL(context, path);
- return new URI(url.getProtocol(), url.getHost(), url.getPath(), uri.getQuery(), uri.getFragment());
- }
- catch (final URISyntaxException e) {
- LogUtils.severe(e);
- return null;
- }
- }
-
- //DOCEAR - added project relative uri resolution
- @SuppressWarnings("unused")
- private URI resolveWorkspaceRelatedUri(final URI uri) {
- URI resolvedURI;
- try {
- resolvedURI = uri.toURL().openConnection().getURL().toURI();
- } catch (IOException ex) {
- LogUtils.severe(ex);
- return null;
- } catch (URISyntaxException ex) {
- LogUtils.severe(ex);
- return null;
- } catch (IllegalArgumentException ex) {
- resolvedURI = uri;
- }
- return resolvedURI;
- }
-
- public File getAbsoluteFile(final MapModel map, final URI uri) {
- if(uri == null) {
- return null;
- }
- try {
- URLConnection urlConnection;
- // windows drive letters are interpreted as uri schemes -> make a file from the scheme-less uri string and use this to resolve the path
- if(Compat.isWindowsOS() && (uri.getScheme() != null && uri.getScheme().length() == 1)) {
- urlConnection = (new File(uri.toString())).toURI().toURL().openConnection();
- }
- else if(uri.getScheme() == null && !uri.getPath().startsWith(File.separator)) {
- if(map != null) {
- urlConnection = (new File(uri.toString())).toURI().toURL().openConnection();
- }
- else {
- urlConnection = UrlManager.getController().getAbsoluteUri(map, uri).toURL().openConnection();
- }
- }
- else {
- urlConnection = uri.toURL().openConnection();
- }
-
- if (urlConnection == null) {
- return null;
- }
- else {
- URI absoluteUri = urlConnection.getURL().toURI().normalize();
- if("file".equalsIgnoreCase(absoluteUri.getScheme())){
- return new File(absoluteUri);
- }
- }
- }
- catch (URISyntaxException e) {
- LogUtils.warn(e);
- }
- catch (IOException e) {
- LogUtils.warn(e);
- }
- catch (Exception e){
- LogUtils.warn(e);
- }
- return null;
-
- }
-
- public URL getAbsoluteUrl(final MapModel map, final URI uri) throws MalformedURLException {
- final String path = uri.isOpaque() ? uri.getSchemeSpecificPart() : uri.getPath();
- final StringBuilder sb = new StringBuilder(path);
- final String query = uri.getQuery();
- if (query != null) {
- sb.append('?');
- sb.append(query);
- }
- final String fragment = uri.getFragment();
- if (fragment != null) {
- sb.append('#');
- sb.append(fragment);
- }
- if (!uri.isAbsolute() || uri.isOpaque() || uri.getScheme().length()>0) {
- final URL mapUrl = map.getURL();
- final String scheme = uri.getScheme();
- if (scheme == null || mapUrl.getProtocol().equals(scheme)) {
- final URL url = new URL(mapUrl, sb.toString());
- return url;
- }
- }
- final URL url = new URL(uri.getScheme(), uri.getHost(), uri.getPort(), sb.toString());
- return url;
- }
-
- public URL getAbsoluteUrl(final URI base, final URI uri) throws MalformedURLException {
- final String path = uri.isOpaque() ? uri.getSchemeSpecificPart() : uri.getPath();
- final StringBuilder sb = new StringBuilder(path);
- final String query = uri.getQuery();
- if (query != null) {
- sb.append('?');
- sb.append(query);
- }
- final String fragment = uri.getFragment();
- if (fragment != null) {
- sb.append('#');
- sb.append(fragment);
- }
- if (!uri.isAbsolute() || uri.isOpaque() || uri.getScheme().length()>0) {
- final URL baseUrl = base.toURL();
- final String scheme = uri.getScheme();
- if (scheme == null || baseUrl.getProtocol().equals(scheme)) {
- final URL url = new URL(baseUrl, sb.toString());
- return url;
- }
- }
- final URL url = new URL(uri.getScheme(), uri.getHost(), uri.getPort(), sb.toString());
- return url;
- }
-
- public void setLastCurrentDir(final File lastCurrentDir) {
- UrlManager.lastCurrentDir = lastCurrentDir;
- }
-
- protected void setURL(final MapModel map, final URL url) {
- map.setURL(url);
- }
-
- public File defaultTemplateFile() {
- return null;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/DoAutomaticSave.java b/freeplane/src/org/freeplane/features/url/mindmapmode/DoAutomaticSave.java
deleted file mode 100644
index cd7078d..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/DoAutomaticSave.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.EventQueue;
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.TimerTask;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.mindmapmode.MMapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.url.UrlManager;
-
-public class DoAutomaticSave extends TimerTask {
- static final String AUTOSAVE_EXTENSION = "autosave";
- /**
- * This value is compared with the result of
- * getNumberOfChangesSinceLastSave(). If the values coincide, no further
- * automatic saving is performed until the value changes again.
- */
- private int changeState;
- final private boolean filesShouldBeDeletedAfterShutdown;
- final private MapModel model;
- final private int numberOfFiles;
- private final File singleBackupDirectory;
- static final String BACKUP_DIR = ".backup";
-
- public DoAutomaticSave(final MapModel model, final int numberOfTempFiles,
- final boolean filesShouldBeDeletedAfterShutdown, boolean useSingleBackupDirectory,
- final String singleBackupDirectory) {
- this.model = model;
- numberOfFiles = ((numberOfTempFiles > 0) ? numberOfTempFiles : 1);
- this.filesShouldBeDeletedAfterShutdown = filesShouldBeDeletedAfterShutdown;
- this.singleBackupDirectory = useSingleBackupDirectory ? new File(singleBackupDirectory) : null;
- changeState = model.getNumberOfChangesSinceLastSave();
- }
-
- @Override
- public void run() {
- /* Map is dirty enough? */
- if (model.getNumberOfChangesSinceLastSave() == changeState) {
- return;
- }
- changeState = model.getNumberOfChangesSinceLastSave();
- if (changeState == 0) {
- /* map was recently saved. */
- return;
- }
- try {
- cancel();
- Controller.getCurrentController().getViewController().invokeAndWait(new Runnable() {
-
- public void run() {
- /* Now, it is dirty, we save it. */
- try {
- final ModeController currentModeController = Controller.getCurrentModeController();
- if(!(currentModeController instanceof MModeController))
- return;
- MModeController modeController = ((MModeController) currentModeController);
- final File pathToStore;
- final URL url = model.getURL();
- final File file = new File(url != null ? url.getFile() //
- : model.getTitle() + UrlManager.FREEPLANE_FILE_EXTENSION);
- if (url == null) {
- pathToStore = new File(ResourceController.getResourceController()
- .getFreeplaneUserDirectory(), BACKUP_DIR);
- }
- else if (singleBackupDirectory != null) {
- pathToStore = singleBackupDirectory;
- }
- else {
- pathToStore = new File(file.getParent(), BACKUP_DIR);
- }
- pathToStore.mkdirs();
- final File tempFile = MFileManager.renameBackupFiles(pathToStore, file, numberOfFiles,
- AUTOSAVE_EXTENSION);
- if (tempFile == null) {
- return;
- }
- if (filesShouldBeDeletedAfterShutdown) {
- tempFile.deleteOnExit();
- }
- ((MFileManager) UrlManager.getController())
- .saveInternal((MMapModel) model, tempFile, true /*=internal call*/);
- modeController.getController().getViewController()
- .out(TextUtils.format("automatically_save_message", tempFile));
- }
- catch (final Exception e) {
- LogUtils.severe("Error in automatic MapModel.save(): ", e);
- }
- }
- });
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/ExportBranchAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/ExportBranchAction.java
deleted file mode 100644
index 2c3ebd8..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/ExportBranchAction.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.util.Collection;
-
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.styles.LogicalStyleKeys;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.url.UrlManager;
-
-class ExportBranchAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ExportBranchAction() {
- super("ExportBranchAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final NodeModel existingNode = Controller.getCurrentModeController().getMapController().getSelectedNode();
- final Controller controller = Controller.getCurrentController();
- final MapModel parentMap = controller.getMap();
- if (parentMap == null || existingNode == null || existingNode.isRoot()) {
- controller.getViewController().err("Could not export branch.");
- return;
- }
- if (parentMap.getFile() == null) {
- controller.getViewController().out("You must save the current map first!");
- ((MModeController) Controller.getCurrentModeController()).save();
- }
- JFileChooser chooser;
- final File file = parentMap.getFile();
- if (file == null) {
- return;
- }
- chooser = new JFileChooser(file.getParentFile());
- chooser.setSelectedFile(new File(createFileName(TextController.getController().getShortText(existingNode))));
- if (((MFileManager) UrlManager.getController()).getFileFilter() != null) {
- chooser.addChoosableFileFilter(((MFileManager) UrlManager.getController())
- .getFileFilter());
- }
- final int returnVal = chooser.showSaveDialog(controller.getViewController().getContentPane());
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- File chosenFile = chooser.getSelectedFile();
- final String ext = FileUtils.getExtension(chosenFile.getName());
- if (!ext.equals(org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION_WITHOUT_DOT)) {
- chosenFile = new File(chosenFile.getParent(), chosenFile.getName()
- + org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION);
- }
- try {
- Compat.fileToUrl(chosenFile);
- }
- catch (final MalformedURLException ex) {
- UITools.errorMessage(TextUtils.getText("invalid_url"));
- return;
- }
- if (chosenFile.exists()) {
- final int overwriteMap = JOptionPane.showConfirmDialog(controller.getMapViewManager().getMapViewComponent(),
- TextUtils.getText("map_already_exists"), "Freeplane", JOptionPane.YES_NO_OPTION);
- if (overwriteMap != JOptionPane.YES_OPTION) {
- return;
- }
- }
- /*
- * Now make a copy from the node, remove the node from the map and
- * create a new Map with the node as root, store the new Map, add
- * the copy of the node to the parent, and set a link from the copy
- * to the new Map.
- */
- final NodeModel parent = existingNode.getParentNode();
- final File oldFile = parentMap.getFile();
-
- final URI newUri = LinkController.toLinkTypeDependantURI(oldFile, chosenFile);
- final URI oldUri = LinkController.toLinkTypeDependantURI(chosenFile, file);
- ((MLinkController) LinkController.getController()).setLink(existingNode,
- oldUri, LinkController.LINK_ABSOLUTE);
- final int nodePosition = parent.getChildPosition(existingNode);
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.undoableResolveParentExtensions(LogicalStyleKeys.NODE_STYLE, existingNode);
- final MMapController mMapController = (MMapController) modeController.getMapController();
- mMapController.deleteNode(existingNode);
- {
- final IActor actor = new IActor() {
- private final boolean wasFolded = existingNode.isFolded();
-
- public void undo() {
- PersistentNodeHook.removeMapExtensions(existingNode);
- existingNode.setMap(parentMap);
- existingNode.setFolded(wasFolded);
- }
-
- public String getDescription() {
- return "ExportBranchAction";
- }
-
- public void act() {
- existingNode.setParent(null);
- existingNode.setFolded(false);
- mMapController.newModel(existingNode);
- }
- };
- Controller.getCurrentModeController().execute(actor, parentMap);
- }
- final MapModel map = existingNode.getMap();
- IExtension[] oldExtensions = map.getRootNode().getExtensions().values().toArray(new IExtension[]{});
- for(final IExtension extension : oldExtensions){
- final Class<? extends IExtension> clazz = extension.getClass();
- if(PersistentNodeHook.isMapExtension(clazz)){
- existingNode.removeExtension(clazz);
- }
- }
- final Collection<IExtension> newExtensions = parentMap.getRootNode().getExtensions().values();
- for(final IExtension extension : newExtensions){
- final Class<? extends IExtension> clazz = extension.getClass();
- if(PersistentNodeHook.isMapExtension(clazz)){
- existingNode.addExtension(extension);
- }
- }
- ((MFileManager) UrlManager.getController()).save(map, chosenFile);
- final NodeModel newNode = mMapController.addNewNode(parent, nodePosition, existingNode.isLeft());
- ((MTextController) TextController.getController()).setNodeText(newNode, existingNode.getText());
- modeController.undoableCopyExtensions(LogicalStyleKeys.NODE_STYLE, existingNode, newNode);
- map.getFile();
- ((MLinkController) LinkController.getController()).setLink(newNode, newUri, LinkController.LINK_ABSOLUTE);
- map.destroy();
- }
- }
-
- private String createFileName(final String shortText) {
- final StringBuilder builder = new StringBuilder(50);
- final String[] words = shortText.split("\\s");
- for (final String word : words) {
- if ("...".equals(word)) {
- continue;
- }
- builder.append(StringUtils.capitalize(word));
- }
- return builder.toString();
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/FileOpener.java b/freeplane/src/org/freeplane/features/url/mindmapmode/FileOpener.java
deleted file mode 100644
index e022602..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/FileOpener.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.DnDConstants;
-import java.awt.dnd.DropTargetDragEvent;
-import java.awt.dnd.DropTargetDropEvent;
-import java.awt.dnd.DropTargetEvent;
-import java.awt.dnd.DropTargetListener;
-import java.io.File;
-import java.net.URI;
-import java.net.URL;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.clipboard.MindMapNodesSelection;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-public class FileOpener implements DropTargetListener {
- /**
- *
- */
-// final private ModeController modeController;
-
- /**
- * @param modeController
- */
- public FileOpener() {
-// this.modeController = modeController;
- }
-
- public void dragEnter(final DropTargetDragEvent dtde) {
- if (!isDragAcceptable(dtde)) {
- dtde.rejectDrag();
- return;
- }
- }
-
- public void dragExit(final DropTargetEvent e) {
- }
-
- public void dragOver(final DropTargetDragEvent e) {
- }
-
- public void dragScroll(final DropTargetDragEvent e) {
- }
-
- static final private Pattern filePattern = Pattern.compile("file://[^\\s" + File.pathSeparatorChar + "]+");
-
- @SuppressWarnings("unchecked")
- public void drop(final DropTargetDropEvent dtde) {
- if (!isDropAcceptable(dtde)) {
- dtde.rejectDrop();
- return;
- }
- dtde.acceptDrop(DnDConstants.ACTION_COPY);
- try {
- final Transferable transferable = dtde.getTransferable();
- Controller.getCurrentController().selectMode(MModeController.MODENAME);
- ModeController modeController = Controller.getCurrentModeController();
- if (transferable.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
- final List<File> list = (List<File>) transferable.getTransferData(DataFlavor.javaFileListFlavor);
- for (final File file : list) {
- String fileName = file.getName();
- if (file.isDirectory() || !isMindMapUrl(fileName)) {
- continue;
- }
- modeController.getMapController().newMap(Compat.fileToUrl(file));
- }
- }
- if (transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
- final String urls = (String) transferable.getTransferData(DataFlavor.stringFlavor);
- if(urls.startsWith("file:")){
- final Matcher matcher = filePattern.matcher(urls);
- while (matcher.find()) {
- final String urlString = matcher.group();
- if (!isMindMapUrl(urlString)) {
- continue;
- }
- try {
- final URI uri = new URI(urlString);
- final URL url = new URL(uri.getScheme(), uri.getHost(), uri.getPath());
- final File file = Compat.urlToFile(url);
- if(! file.exists() || file.isDirectory())
- continue;
- modeController.getMapController().newMap(url);
- }
- catch (final Exception e) {
- e.printStackTrace();
- continue;
- }
- }
- }
- else if(urls.startsWith("http://") && isMindMapUrl(urls)){
- final URL url = new URL(urls);
- modeController.getMapController().newMap(url);
- }
- }
- }
- catch (final Exception e) {
- UITools.errorMessage(TextUtils.format("dropped_file_error", e.getMessage()));
- dtde.dropComplete(false);
- return;
- }
- dtde.dropComplete(true);
- }
-
- private boolean isMindMapUrl(final String urlString) {
- return urlString.substring(urlString.length() - 3).equalsIgnoreCase(".mm");
- }
-
- public void dropActionChanged(final DropTargetDragEvent e) {
- }
-
- private boolean isDragAcceptable(final DropTargetDragEvent event) {
- return event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
- || !event.isDataFlavorSupported(MindMapNodesSelection.mindMapNodesFlavor)
- && event.isDataFlavorSupported(DataFlavor.stringFlavor);
- }
-
- private boolean isDropAcceptable(final DropTargetDropEvent event) {
- return event.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
- || event.isDataFlavorSupported(DataFlavor.stringFlavor);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/FileRevisionsDialog.java b/freeplane/src/org/freeplane/features/url/mindmapmode/FileRevisionsDialog.java
deleted file mode 100644
index 9b5196d..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/FileRevisionsDialog.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2010 Volker Boerchers
- *
- * This file author is Volker Boerchers
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Toolkit;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.io.File;
-import java.text.NumberFormat;
-import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.TreeSet;
-
-import javax.swing.AbstractAction;
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.KeyStroke;
-import javax.swing.ListSelectionModel;
-import javax.swing.WindowConstants;
-import javax.swing.border.EmptyBorder;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.table.DefaultTableCellRenderer;
-
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.url.mindmapmode.MFileManager.AlternativeFileMode;
-
-/**
- * @author vboerchers
- */
-class FileRevisionsDialog extends JDialog {
- public static class FileWrapper {
- private final File file;
-
- public FileWrapper(final File file) {
- this.file = file;
- }
-
- public File getFile() {
- return file;
- }
-
- @Override
- public String toString() {
- return file.getName();
- }
- }
-
- private class RevisionTable extends JTable {
- private static final long serialVersionUID = 1L;
-
- public RevisionTable(final Object[][] data, int selectedRow) {
- super(data, new Object[] { TextUtils.getText(key("file_name")),
- TextUtils.getText(key("file_size")),
- TextUtils.getText(key("file_last_modified")) });
- int width = Toolkit.getDefaultToolkit().getScreenSize().width * 2 / 3;
- getColumnModel().getColumn(0).setPreferredWidth((int) (width * 0.7));
- getColumnModel().getColumn(1).setPreferredWidth((int) (width * 0.1));
- getColumnModel().getColumn(2).setPreferredWidth((int) (width * 0.2));
- setRowHeight(20);
- setRowSelectionAllowed(true);
- setFocusable(false);
- setDefaultRenderer(Object.class, renderer);
- setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- setRowSelectionInterval(selectedRow, selectedRow);
- getSelectionModel().addListSelectionListener(new ListSelectionListener() {
- public void valueChanged(final ListSelectionEvent event) {
- // Update the word field if a suggestion is click
- if (!event.getValueIsAdjusting()) {
- final ListSelectionModel lsm = (ListSelectionModel) event.getSource();
- final boolean enable = !(lsm.isSelectionEmpty());
- if (enable) {
- final FileWrapper fileWrapper = (FileWrapper) getModel().getValueAt(getSelectedRow(), 0);
- if (file.equals(fileWrapper.getFile())) {
- setButtonOpenDefault();
- }
- else {
- setButtonOpenRestore(fileWrapper);
- }
- setSelectedFile(fileWrapper.getFile());
- }
- else {
- setButtonOpenDefault();
- }
- }
- }
- });
- addMouseListener(new MouseAdapter() {
- public void mouseClicked(MouseEvent e) {
- if (e.getClickCount() >= 2) {
- final FileWrapper fileWrapper = (FileWrapper) getModel().getValueAt(getSelectedRow(), 0);
- setSelectedFile(fileWrapper.getFile());
- if (fileWrapper != null)
- btnRestore.doClick();
- }
- }
- });
- }
-
- private void setButtonOpenDefault() {
- MenuBuilder.setLabelAndMnemonic(btnRestore, TextUtils.getRawText(key("open")));
- btnRestore.setToolTipText(TextUtils.format(key("open.tooltip")));
- }
-
- private void setButtonOpenRestore(final FileWrapper fileWrapper) {
- MenuBuilder.setLabelAndMnemonic(btnRestore, TextUtils.getRawText(key("restore")));
- btnRestore.setToolTipText(TextUtils.format(key("restore.tooltip"),
- file.getName(), fileWrapper.toString()));
- }
- private final DefaultTableCellRenderer renderer = new DefaultTableCellRenderer() {
- private static final long serialVersionUID = 1L;
-
- @Override
- public Component getTableCellRendererComponent(final JTable table, final Object value,
- final boolean isSelected, final boolean hasFocus,
- final int row, final int column) {
- final Component c = super
- .getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
- // change the font of the first line which contains the original file
- if (containsOriginalFile(table, row))
- c.setFont(getFont().deriveFont(Font.BOLD));
- return c;
- }
-
- private boolean containsOriginalFile(JTable table, int row) {
- FileWrapper fileHolder = (FileWrapper) table.getValueAt(row, 0);
- return fileHolder.getFile().equals(file);
- }
- };
-
- @Override
- public boolean isCellEditable(final int row, final int column) {
- return false;
- }
-
- }
-
- private static final long serialVersionUID = 1L;
- private final static String ALL_KEY_BASE = "FileRevisionsDialog";
- private final static String AUTOSAVE_KEY_BASE = "NewerFileRevisionsFoundDialog";
- private String keyBase;
- private JButton btnRestore;
- private JButton btnSkip;
- private boolean cancelled;
- private final File file;
- private File selectedFile;
- private final SimpleDateFormat dateFormat = new SimpleDateFormat();
- private final NumberFormat fileSizeFormat = NumberFormat.getIntegerInstance();
-
- private class CloseAction implements ActionListener {
- public void actionPerformed(final ActionEvent e) {
- final Object source = e.getSource();
- cancelled = (source == btnSkip);
- dispose();
- }
- }
-
- public FileRevisionsDialog(final File file, final File[] revisions, AlternativeFileMode mode) {
- super(UITools.getFrame(), true);
- if(mode == AlternativeFileMode.ALL)
- keyBase = ALL_KEY_BASE;
- else if(mode == AlternativeFileMode.AUTOSAVE)
- keyBase = AUTOSAVE_KEY_BASE;
- setTitle(TextUtils.getText(key("title")));
- UITools.backOtherWindows();
- this.selectedFile = this.file = file;
- setBackground(Color.white);
- setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- UITools.addEscapeActionToDialog(this);
- getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
- final JTable table = createTable(revisions);
- final JScrollPane scrollPane = new JScrollPane(table);
- scrollPane.getViewport().setBackground(Color.white);
- final Dimension tablePreferredSize = table.getPreferredSize();
- int maxHeight = (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight() * 2 / 3;
- scrollPane.getViewport().setPreferredSize(new Dimension(tablePreferredSize.width, Math.min(maxHeight, tablePreferredSize.height)));
- add(scrollPane);
- add(createQuestion());
- add(createButtonBar());
- getRootPane().setDefaultButton(btnRestore);
- getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
- getRootPane().getActionMap().put("up", new AbstractAction() {
-
- public void actionPerformed(ActionEvent e) {
- int newSelectedRow = table.getSelectedRow() - 1;
- if(newSelectedRow >= 0)
- table.setRowSelectionInterval(newSelectedRow, newSelectedRow);
-
- }
- });
- getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down");
- getRootPane().getActionMap().put("down", new AbstractAction() {
-
- public void actionPerformed(ActionEvent e) {
- int newSelectedRow = table.getSelectedRow() + 1;
- if(newSelectedRow < table.getRowCount())
- table.setRowSelectionInterval(newSelectedRow, newSelectedRow);
- }
- });
- pack();
- UITools.showFrame();
- setLocationRelativeTo(UITools.getFrame());
- setVisible(true);
- }
-
- private Component createQuestion() {
- final String text = TextUtils.format(key("question"), file.getName());
- final String html = HtmlUtils.plainToHTML(text);
- final JLabel textArea = new JLabel(html);
- textArea.setAlignmentX(0.5f);
- textArea.setFont(new Font("Dialog", Font.BOLD, 12));
- textArea.setBorder(BorderFactory.createLineBorder(Color.BLACK));
- return textArea;
- }
-
- private String key(final String appendix) {
- return keyBase + "." + appendix;
- }
-
- private JTable createTable(final File[] revisions) {
- final TreeSet<File> sortedRevisions = new TreeSet<File>(new Comparator<File>() {
- public int compare(final File f1, final File f2) {
- final long diff = f1.lastModified() - f2.lastModified();
- if (diff == 0)
- return f1.getName().compareTo(f2.getName());
- return diff < 0 ? -1 : (diff > 0 ? 1 : 0);
- }
- });
- sortedRevisions.add(file);
- sortedRevisions.addAll(Arrays.asList(revisions));
- final Object[][] data = new Object[sortedRevisions.size()][];
- int i = 0;
- int selectedRow = 0;
- for (final File f : sortedRevisions) {
- data[i] = createRow(f);
- if(f == file)
- selectedRow = i;
- i++;
- }
- final RevisionTable revisionTable = new RevisionTable(data, selectedRow);
- return revisionTable;
- }
-
- private Object[] createRow(final File file) {
- return new Object[] { new FileWrapper(file), fileSizeFormat.format(file.length()),
- dateFormat.format(file.lastModified()) };
- }
-
- private Box createButtonBar() {
- final Box controllerBox = Box.createHorizontalBox();
- controllerBox.setBorder(new EmptyBorder(5, 0, 5, 0));
- final CloseAction closeAction = new CloseAction();
- controllerBox.add(Box.createHorizontalGlue());
- btnSkip = createButton(key("cancel"), null, closeAction);
- btnRestore = createButton(key("open"), key("open.tooltip"), closeAction);
- controllerBox.add(btnRestore);
- controllerBox.add(Box.createHorizontalStrut(10));
- controllerBox.add(btnSkip);
- controllerBox.add(Box.createHorizontalStrut(10));
- return controllerBox;
- }
-
- private JButton createButton(final String key, final String tooltipKey, final ActionListener closeAction) {
- final JButton button = new JButton();
- MenuBuilder.setLabelAndMnemonic(button, TextUtils.getRawText(key));
- button.addActionListener(closeAction);
- button.setMaximumSize(new Dimension(1000, 1000));
- final String selectedFileName = getSelectedFile() == null ? null : getSelectedFile().getName();
- // arguments are only used for one button but they don't hurt for the other
- if (tooltipKey != null)
- button.setToolTipText(TextUtils.format(tooltipKey, file.getName(), selectedFileName));
- return button;
- }
-
- /** returns null on cancel */
- public File getSelectedFile() {
- if(cancelled)
- return null;
- return selectedFile;
- }
-
- private void setSelectedFile(final File selectedFile) {
- this.selectedFile = selectedFile;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/ImportBranchAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/ImportBranchAction.java
deleted file mode 100644
index 0f82a3e..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/ImportBranchAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.net.URL;
-
-import javax.swing.JFileChooser;
-import javax.swing.filechooser.FileFilter;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.url.UrlManager;
-
-class ImportBranchAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ImportBranchAction() {
- super("ImportBranchAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final NodeModel parent = Controller.getCurrentModeController().getMapController().getSelectedNode();
- if (parent == null) {
- return;
- }
- final JFileChooser chooser = new JFileChooser();
- final FileFilter fileFilter = ((MFileManager) UrlManager.getController()).getFileFilter();
- if (fileFilter != null) {
- chooser.addChoosableFileFilter(fileFilter);
- }
- final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getViewController().getContentPane());
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- try {
- final MapModel map = parent.getMap();
- final URL url = map.getURL();
- final NodeModel node = ((MFileManager) UrlManager.getController()).loadTree(map, chooser.getSelectedFile());
- map.setURL(url);
- PersistentNodeHook.removeMapExtensions(node);
- ((MMapController) Controller.getCurrentModeController().getMapController()).insertNode(node, parent);
- }
- catch (final Exception ex) {
- UrlManager.getController().handleLoadingException(ex);
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/ImportExplorerFavoritesAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/ImportExplorerFavoritesAction.java
deleted file mode 100644
index e76207f..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/ImportExplorerFavoritesAction.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-
-import javax.swing.JFileChooser;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-
-class ImportExplorerFavoritesAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ImportExplorerFavoritesAction() {
- super("ImportExplorerFavoritesAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final JFileChooser chooser = new JFileChooser();
- chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- chooser.setDialogTitle(TextUtils.getText("select_favorites_folder"));
- final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getViewController().getContentPane());
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- final File folder = chooser.getSelectedFile();
- Controller.getCurrentController().getViewController().out("Importing Favorites ...");
- importExplorerFavorites(folder, Controller.getCurrentModeController().getMapController().getSelectedNode(),
- /*redisplay=*/true);
- Controller.getCurrentController().getViewController().out("Favorites imported.");
- }
- }
-
- /**
- */
- private NodeModel addNode(final NodeModel target, final String nodeContent) {
- final NodeModel node = ((MMapController) Controller.getCurrentModeController().getMapController()).addNewNode(target, target
- .getChildCount(), target.isNewChildLeft());
- ((MTextController) TextController.getController()).setNodeText(node, nodeContent);
- return node;
- }
-
- public boolean importExplorerFavorites(final File folder, final NodeModel target, final boolean redisplay) {
- boolean favoritesFound = false;
- if (folder.isDirectory()) {
- final File[] list = folder.listFiles();
- for (int i = 0; i < list.length; i++) {
- if (list[i].isDirectory()) {
- final String nodeContent = list[i].getName();
- final NodeModel node = addNode(target, nodeContent);
- final boolean favoritesFoundInSubfolder = importExplorerFavorites(list[i], node, false);
- if (favoritesFoundInSubfolder) {
- favoritesFound = true;
- }
- else {
- ((MMapController) Controller.getCurrentModeController().getMapController()).deleteNode(node);
- }
- }
- }
- for (int i = 0; i < list.length; i++) {
- if (!list[i].isDirectory() && FileUtils.getExtension(list[i]).equals("url")) {
- favoritesFound = true;
- BufferedReader in = null;
- try {
- final NodeModel node = addNode(target, FileUtils.removeExtension(list[i].getName()));
- in = new BufferedReader(new FileReader(list[i]));
- String line = null;
- while ((line = in.readLine()) != null) {
- if (line.startsWith("URL=")) {
- final String link = line.substring(4);
- ((MLinkController) LinkController.getController()).setLink(node,LinkController.createURI(link), LinkController.LINK_ABSOLUTE);
- break;
- }
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- finally {
- try {
- if (in != null) {
- in.close();
- }
- }
- catch (final IOException e) {
- LogUtils.warn(e);
- }
- }
- }
- }
- }
- if (redisplay) {
- Controller.getCurrentModeController().getMapController().nodeChanged(target);
- }
- return favoritesFound;
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/ImportFolderStructureAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/ImportFolderStructureAction.java
deleted file mode 100644
index 2682f02..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/ImportFolderStructureAction.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.net.MalformedURLException;
-
-import javax.swing.JFileChooser;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.ui.ViewController;
-
-class ImportFolderStructureAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ImportFolderStructureAction() {
- super("ImportFolderStructureAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final JFileChooser chooser = new JFileChooser();
- chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- chooser.setDialogTitle(TextUtils.getText("select_folder_for_importing"));
- final ViewController viewController = Controller.getCurrentController().getViewController();
- final int returnVal = chooser.showOpenDialog(viewController.getContentPane());
- if (returnVal == JFileChooser.APPROVE_OPTION) {
- final File folder = chooser.getSelectedFile();
- viewController.out("Importing folder structure ...");
- try {
- importFolderStructure(folder, Controller.getCurrentModeController().getMapController().getSelectedNode(),
- /*redisplay=*/true);
- }
- catch (final Exception ex) {
- LogUtils.severe(ex);
- }
- viewController.out("Folder structure imported.");
- }
- }
-
- /**
- */
- private NodeModel addNode(final NodeModel target, final String nodeContent, final String link) {
- final NodeModel node = ((MMapController) Controller.getCurrentModeController().getMapController()).addNewNode(target, target
- .getChildCount(), target.isNewChildLeft());
- ((MTextController) TextController.getController()).setNodeText(node, nodeContent);
- ((MLinkController) LinkController.getController()).setLink(node, link, LinkController.LINK_ABSOLUTE);
- return node;
- }
-
- public void importFolderStructure(final File folder, final NodeModel target, final boolean redisplay)
- throws MalformedURLException {
- final File[] list = folder.listFiles();
- if (list == null) {
- return;
- }
- for (int i = 0; i < list.length; i++) {
- if (list[i].isDirectory()) {
- final NodeModel node = addNode(target, list[i].getName(), list[i].toURI().toString());
- importFolderStructure(list[i], node, false);
- }
- }
- for (int i = 0; i < list.length; i++) {
- if (!list[i].isDirectory()) {
- addNode(target, list[i].getName(), list[i].toURI().toString());
- }
- }
- Controller.getCurrentModeController().getMapController().setFolded(target, true);
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/ImportLinkedBranchAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/ImportLinkedBranchAction.java
deleted file mode 100644
index 7990cfd..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/ImportLinkedBranchAction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.UrlManager;
-
-class ImportLinkedBranchAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public ImportLinkedBranchAction() {
- super("ImportLinkedBranchAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final MapModel map = Controller.getCurrentController().getMap();
- final ModeController modeController = Controller.getCurrentModeController();
- final NodeModel selected = modeController.getMapController().getSelectedNode();
- final IMapViewManager viewController = Controller.getCurrentController().getMapViewManager();
- if (selected == null || NodeLinks.getLink(selected) == null) {
- JOptionPane.showMessageDialog((viewController.getMapViewComponent()), TextUtils
- .getText("import_linked_branch_no_link"));
- return;
- }
- final URI uri = NodeLinks.getLink(selected);
- try {
- final File file = uri.isAbsolute() && !uri.isOpaque() ? new File(uri) : new File(new URL(map.getURL(), uri
- .getPath()).getFile());
- final NodeModel node = ((MFileManager) UrlManager.getController()).loadTree(map, file);
- PersistentNodeHook.removeMapExtensions(node);
- ((MMapController) modeController.getMapController()).insertNode(node, selected);
- ((MLinkController) LinkController.getController()).setLink(selected, (URI) null, LinkController.LINK_ABSOLUTE);
- ((MLinkController) LinkController.getController()).setLink(node, (URI) null, LinkController.LINK_ABSOLUTE);
- }
- catch (final MalformedURLException ex) {
- UITools.errorMessage(TextUtils.format("invalid_url_msg", uri.toString()));
- LogUtils.warn(ex);
- return;
- }
- catch (final IllegalArgumentException ex) {
- UITools.errorMessage(TextUtils.format("invalid_file_msg", uri.toString()));
- LogUtils.warn(ex);
- return;
- }
- catch (final Exception ex) {
- UrlManager.getController().handleLoadingException(ex);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/MFileManager.java b/freeplane/src/org/freeplane/features/url/mindmapmode/MFileManager.java
deleted file mode 100644
index 1d40a6d..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/MFileManager.java
+++ /dev/null
@@ -1,876 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.Component;
-import java.awt.dnd.DropTarget;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.BufferedInputStream;
-import java.io.BufferedWriter;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.SequenceInputStream;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.nio.channels.FileLock;
-import java.nio.charset.Charset;
-import java.util.LinkedList;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JFileChooser;
-import javax.swing.JOptionPane;
-import javax.swing.filechooser.FileFilter;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.ComboProperty;
-import org.freeplane.core.resources.components.IPropertyControl;
-import org.freeplane.core.resources.components.IPropertyControlCreator;
-import org.freeplane.core.resources.components.OptionPanelBuilder;
-import org.freeplane.core.ui.IndexedTree;
-import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.core.util.XsltPipeReaderFactory;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapWriter.Mode;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.map.mindmapmode.MMapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.features.url.IMapInputStreamConverter;
-import org.freeplane.features.url.MapConversionException;
-import org.freeplane.features.url.MapVersionInterpreter;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.n3.nanoxml.XMLException;
-import org.freeplane.n3.nanoxml.XMLParseException;
-
-/**
- * @author Dimitry Polivaev
- */
-public class MFileManager extends UrlManager implements IMapViewChangeListener {
- private static final String BACKUP_EXTENSION = "bak";
- private static final int DEBUG_OFFSET = 0;
-
- static private class BackupFlag implements IExtension {
- }
-
- private class MindMapFilter extends FileFilter {
- @Override
- public boolean accept(final File f) {
- if (f.isDirectory()) {
- return true;
- }
- final String extension = FileUtils.getExtension(f.getName());
- if (extension != null) {
- if (extension.equals(UrlManager.FREEPLANE_FILE_EXTENSION_WITHOUT_DOT)) {
- return true;
- }
- else {
- return false;
- }
- }
- return false;
- }
-
- @Override
- public String getDescription() {
- return TextUtils.getText("mindmaps_desc");
- }
- }
-
- private static final String BACKUP_FILE_NUMBER = "backup_file_number";
- private static final String FREEPLANE_VERSION_UPDATER_XSLT = "/xslt/freeplane_version_updater.xslt";
- private static File singleBackupDirectory;
-
- private File[] findFileRevisions(final File file, final File backupDir, final AlternativeFileMode mode) {
- final String fileExtensionPattern;
- if(mode == AlternativeFileMode.ALL)
- fileExtensionPattern = "(" + BACKUP_EXTENSION + "|"+ DoAutomaticSave.AUTOSAVE_EXTENSION + ")";
- else
- fileExtensionPattern = DoAutomaticSave.AUTOSAVE_EXTENSION;
- final Pattern pattern = Pattern.compile("^" + Pattern.quote(backupFileName(file)) + "\\.+\\d+\\." + fileExtensionPattern);
- if (backupDir.exists()) {
- final File[] fileList = backupDir.listFiles(new java.io.FileFilter() {
- public boolean accept(final File f) {
- final String name = f.getName();
- return pattern.matcher(name).matches() && f.isFile()
- // && (f.lastModified() > (file.lastModified() - DEBUG_OFFSET) || name.endsWith(BACKUP_EXTENSION))
- &&(mode == AlternativeFileMode.ALL || f.lastModified() > (file.lastModified() - DEBUG_OFFSET));
- }
- });
- return fileList;
- }
- return new File[0];
- }
-
- /** prevents name conflicts with singleBackupDirectory in most cases (uses the file's hashcode). */
- private static String backupFileName(final File file) {
- if (singleBackupDirectory == null)
- return file.getName();
- return file.getName() + "." + file.hashCode();
- }
-
- private static void backupFile(final File file, final int backupFileNumber, final String extension) {
- if (backupFileNumber == 0) {
- return;
- }
- final File backupDir = MFileManager.backupDir(file);
- backupDir.mkdir();
- if (backupDir.exists()) {
- final File backupFile = MFileManager.renameBackupFiles(backupDir, file, backupFileNumber, extension);
- if (!backupFile.exists()) {
- performBackup(file, backupFile);
- }
- }
- }
-
- private static void performBackup(final File file, final File backupFile) {
- try {
- FileUtils.copyFile(file, backupFile);
- backupFile.setLastModified(file.lastModified());
- }
- catch (IOException e) {
- }
- }
-
- private static File backupDir(final File file) {
- if (singleBackupDirectory != null)
- return singleBackupDirectory;
- return new File(file.getParentFile(), DoAutomaticSave.BACKUP_DIR);
- }
-
- static File createBackupFile(final File backupDir, final File file, final int number, final String extension) {
- return new File(backupDir, backupFileName(file) + '.' + number + '.' + extension);
- }
-
- static File renameBackupFiles(final File backupDir, final File file, final int backupFileNumber,
- final String extension) {
- if (backupFileNumber == 0) {
- return null;
- }
- for (int i = backupFileNumber + 1;; i++) {
- final File newFile = MFileManager.createBackupFile(backupDir, file, i, extension);
- if (!newFile.exists()) {
- break;
- }
- newFile.delete();
- }
- int i = backupFileNumber;
- for (;;) {
- final File newFile = MFileManager.createBackupFile(backupDir, file, i, extension);
- if (newFile.exists()) {
- break;
- }
- i--;
- if (i == 0) {
- break;
- }
- }
- if (i < backupFileNumber) {
- return MFileManager.createBackupFile(backupDir, file, i + 1, extension);
- }
- for (i = 1; i < backupFileNumber; i++) {
- final File newFile = MFileManager.createBackupFile(backupDir, file, i, extension);
- final File oldFile = MFileManager.createBackupFile(backupDir, file, i + 1, extension);
- newFile.delete();
- if (!oldFile.renameTo(newFile)) {
- return null;
- }
- }
- return MFileManager.createBackupFile(backupDir, file, backupFileNumber, extension);
- }
-
- FileFilter filefilter = new MindMapFilter();
-
- public MFileManager() {
- super();
- }
-
- @Override
- protected void init() {
- super.init();
- createActions();
- createPreferences();
- if (ResourceController.getResourceController().getBooleanProperty("single_backup_directory")) {
- String value = ResourceController.getResourceController().getProperty("single_backup_directory_path");
- // vb, 2010-10-14: I'm not exactly happy with putting this here - if you have a better place move it!
- if (value != null && value.indexOf("{freeplaneuserdir}") >= 0) {
- value = value.replace("{freeplaneuserdir}", ResourceController.getResourceController()
- .getFreeplaneUserDirectory());
- ResourceController.getResourceController().setProperty("single_backup_directory_path", value);
- }
- singleBackupDirectory = new File(value);
- }
- }
-
- private void createPreferences() {
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- final OptionPanelBuilder optionPanelBuilder = modeController.getOptionPanelBuilder();
- optionPanelBuilder.addCreator("Environment/load", new IPropertyControlCreator() {
- public IPropertyControl createControl() {
- final Set<String> charsets = Charset.availableCharsets().keySet();
- final LinkedList<String> charsetList = new LinkedList<String>(charsets);
- charsetList.addFirst("JVMdefault");
- final LinkedList<String> charsetTranslationList = new LinkedList<String>(charsets);
- charsetTranslationList.addFirst(TextUtils.getText("OptionPanel.default"));
- return new ComboProperty("default_charset", charsetList, charsetTranslationList);
- }
- }, IndexedTree.AS_CHILD);
- }
-
- private void backup(final File file) {
- if (file == null) {
- return;
- }
- final int backupFileNumber = ResourceController.getResourceController().getIntProperty(BACKUP_FILE_NUMBER, 0);
- MFileManager.backupFile(file, backupFileNumber, BACKUP_EXTENSION);
- }
-
- private void createActions() {
- final Controller controller = Controller.getCurrentController();
- final ModeController modeController = controller.getModeController();
- controller.addAction(new OpenAction());
- controller.addAction(new OpenURLMapAction());
- controller.addAction(new NewMapAction());
- final File userTemplates = defaultUserTemplateDir();
- userTemplates.mkdir();
- modeController.addAction(new NewMapFromTemplateAction("new_map_from_user_templates", userTemplates));
- modeController.addAction(new SaveAction());
- modeController.addAction(new SaveAsAction());
- modeController.addAction(new ExportBranchAction());
- modeController.addAction(new ImportBranchAction());
- modeController.addAction(new ImportLinkedBranchAction());
- modeController.addAction(new ImportLinkedBranchWithoutRootAction());
- modeController.addAction(new ImportExplorerFavoritesAction());
- modeController.addAction(new ImportFolderStructureAction());
- modeController.addAction(new RevertAction());
- modeController.addAction(new OpenUserDirAction());
- }
-
- public JFileChooser getFileChooser(boolean useDirectorySelector) {
- final JFileChooser fileChooser = getFileChooser(getFileFilter(), useDirectorySelector);
- return fileChooser;
- }
-
- public FileFilter getFileFilter() {
- return filefilter;
- };
-
- @Override
- protected JComponent createDirectorySelector(final JFileChooser chooser) {
- final JComboBox box = new JComboBox();
- box.setEditable(false);
- final File dir = getLastCurrentDir() != null ? getLastCurrentDir() : chooser.getCurrentDirectory();
- final File templateDir = defaultStandardTemplateDir();
- final File userTemplateDir = defaultUserTemplateDir();
- box.addItem(new NamedObject(dir, TextUtils.getText("current_dir")));
- box.addItem(new NamedObject(templateDir, TextUtils.getText("template_dir")));
- box.addItem(new NamedObject(userTemplateDir, TextUtils.getText("user_template_dir")));
- box.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- final JComboBox box = (JComboBox) e.getSource();
- final NamedObject obj = (NamedObject) box.getSelectedItem();
- final File dir = (File) obj.getObject();
- chooser.setCurrentDirectory(dir);
- }
- });
- File selectedDir = chooser.getCurrentDirectory();
- final String selectedPath = selectedDir.getAbsolutePath();
- if (!selectedDir.equals(dir)) {
- for (int i = 0; i < box.getItemCount(); i++) {
- NamedObject item = (NamedObject) box.getItemAt(i);
- File itemDir = (File) item.getObject();
- if (itemDir.getAbsolutePath().equals(selectedPath)) {
- box.setSelectedItem(item);
- break;
- }
- }
- }
- return box;
- }
-
- /**
- * Creates a proposal for a file name to save the map. Removes all illegal
- * characters. Fixed: When creating file names based on the text of the root
- * node, now all the extra unicode characters are replaced with _. This is
- * not very good. For chinese content, you would only get a list of ______
- * as a file name. Only characters special for building file paths shall be
- * removed (rather than replaced with _), like : or /. The exact list of
- * dangeous characters needs to be investigated. 0.8.0RC3. Keywords: suggest
- * file name.
- *
- * @param map
- */
- private String getFileNameProposal(final MapModel map) {
- String rootText = TextController.getController().getPlainTextContent((map.getRootNode()));
- rootText = rootText.replaceAll("[&:/\\\\\0%$#~\\?\\*]+", "");
- return rootText;
- }
-
- public URI getLinkByFileChooser(final MapModel map) {
- JFileChooser chooser = null;
- final File file = map.getFile();
- if (file == null && LinkController.getLinkType() == LinkController.LINK_RELATIVE_TO_MINDMAP) {
- JOptionPane.showMessageDialog(Controller.getCurrentController().getViewController().getContentPane(),
- TextUtils.getText("not_saved_for_link_error"), "Freeplane", JOptionPane.WARNING_MESSAGE);
- return null;
- }
- if (getLastCurrentDir() != null) {
- chooser = new JFileChooser(getLastCurrentDir());
- }
- else {
- chooser = new JFileChooser();
- }
- chooser.setAcceptAllFileFilterUsed(true);
- chooser.setFileFilter(chooser.getAcceptAllFileFilter());
- chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
- final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getViewController()
- .getContentPane());
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- return null;
- }
- final File input = chooser.getSelectedFile();
- setLastCurrentDir(input.getParentFile());
-
- return LinkController.toLinkTypeDependantURI(file, input);
- }
-
- /**@deprecated -- use MapIO*/
- @Deprecated
- public void loadAndLock(final URL url, final MapModel map) throws FileNotFoundException, IOException, XMLParseException,
- URISyntaxException {
- final File file = Compat.urlToFile(url);
- if(file == null){
- super.loadCatchExceptions(url, map);
- return;
- }
- if (!file.exists()) {
- throw new FileNotFoundException(TextUtils.format("file_not_found", file.getPath()));
- }
- if (!file.canWrite()) {
- map.setReadOnly(true);
- }
- try {
- final String lockingUser = tryToLock(map, file);
- if (lockingUser != null) {
- UITools.informationMessage(Controller.getCurrentController().getViewController().getFrame(),
- TextUtils.format("map_locked_by_open", file.getName(), lockingUser));
- map.setReadOnly(true);
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- UITools.informationMessage(Controller.getCurrentController().getViewController().getFrame(),
- TextUtils.format("locking_failed_by_open", file.getName()));
- map.setReadOnly(true);
- }
- if (file.length() != 0) {
- //DOCEAR - fixed: set the file for the map before parsing the xml, necessary for some events
- setFile(map, file);
- NodeModel root = loadTree(map, file);
- assert(map.getRootNode() == root);
-
- }
- if(map.getRootNode() == null)
- map.createNewRoot();
- }
-
- public URL getAlternativeURL(final URL url, AlternativeFileMode mode){
- try {
- final File file = Compat.urlToFile(url);
- if(file == null){
- return url;
- }
- File alternativeFile;
- alternativeFile = getAlternativeFile(file, mode);
- if(alternativeFile != null)
- return Compat.fileToUrl(alternativeFile);
- else
- return null;
- }
- catch (MalformedURLException e) {
- }
- catch (URISyntaxException e) {
- }
- return null;
- }
-
- public enum AlternativeFileMode{ALL, AUTOSAVE};
- public File getAlternativeFile(final File file, AlternativeFileMode mode){
- final File[] revisions = findFileRevisions(file, MFileManager.backupDir(file), mode);
- if(revisions.length == 0 && mode == AlternativeFileMode.AUTOSAVE)
- return file;
- final FileRevisionsDialog newerFileRevisionsFoundDialog = new FileRevisionsDialog(file, revisions, mode);
- final File selectedFile = newerFileRevisionsFoundDialog.getSelectedFile();
- if(file.equals(selectedFile)){
- boolean success = file.setLastModified(System.currentTimeMillis());
- if (!success)
- LogUtils.warn("Unable to set the last modification time for " + file);
- }
- return selectedFile;
- }
-
- /**@deprecated -- use MMapIO*/
- @Deprecated
- public NodeModel loadTree(final MapModel map, final File file) throws XMLParseException, IOException {
- try {
- final NodeModel rootNode = loadTreeImpl(map, file);
- return rootNode;
- }
- catch (final Exception ex) {
- final String errorMessage = "Error while parsing file:" + file;
- LogUtils.warn(errorMessage, ex);
- UITools.errorMessage(errorMessage);
- final NodeModel result = new NodeModel(map);
- result.setText(errorMessage);
- return result;
- }
- }
-
- private NodeModel loadTreeImpl(final MapModel map, final File f) throws FileNotFoundException, IOException,
- XMLException, MapConversionException {
- final BufferedInputStream file = new BufferedInputStream(new FileInputStream(f));
- int versionInfoLength = 1000;
- final byte[] buffer = new byte[versionInfoLength];
- final int readCount = file.read(buffer);
- final String mapStart = new String(buffer, FileUtils.defaultCharset().name());
- final ByteArrayInputStream readBytes = new ByteArrayInputStream(buffer, 0, readCount);
- final InputStream sequencedInput = new SequenceInputStream(readBytes, file);
- Reader reader = null;
- MapVersionInterpreter versionInterpreter = MapVersionInterpreter.getVersionInterpreter(mapStart);
- map.addExtension(versionInterpreter);
- if(versionInterpreter.anotherDialect){
- String message = versionInterpreter.getDialectInfo(f.getAbsolutePath());
- UITools.showMessage(message, JOptionPane.WARNING_MESSAGE);
- }
- if(versionInterpreter.needsConversion){
- final int showResult = OptionalDontShowMeAgainDialog.show("really_convert_to_current_version",
- "confirmation", MMapController.RESOURCES_CONVERT_TO_CURRENT_VERSION,
- OptionalDontShowMeAgainDialog.ONLY_OK_SELECTION_IS_STORED);
- IMapInputStreamConverter isConverter = versionInterpreter.getMapInputStreamConverter();
- if (showResult != JOptionPane.OK_OPTION || isConverter == null) {
- reader = new XsltPipeReaderFactory().getActualReader(sequencedInput);
- }
- else {
- sequencedInput.close();
- //reader = UrlManager.getUpdateReader(f, FREEPLANE_VERSION_UPDATER_XSLT);
- reader = isConverter.getConvertedStream(f);
- }
- }
- else
- reader = new XsltPipeReaderFactory().getActualReader(sequencedInput);
- try {
- return Controller.getCurrentModeController().getMapController().getMapReader()
- .createNodeTreeFromXml(map, reader, Mode.FILE);
- }
- finally {
- FileUtils.silentlyClose(reader);
- }
- }
-
- /**@deprecated -- use LinkController*/
- @Deprecated
- @Override
- public void loadURL(final URI relative) {
- final MapModel map = Controller.getCurrentController().getMap();
- if (map == null || map.getURL() == null) {
- if (!relative.toString().startsWith("#") && !relative.isAbsolute() || relative.isOpaque()) {
- Controller.getCurrentController().getViewController().out("You must save the current map first!");
- final boolean result = ((MFileManager) UrlManager.getController()).save(map);
- if (!result) {
- return;
- }
- }
- }
- super.loadURL(relative);
- }
-
- /**@deprecated -- use MapIO*/
- @Deprecated
- public void open() {
- final JFileChooser chooser = getFileChooser(false);
- chooser.setMultiSelectionEnabled(true);
- final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent());
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- return;
- }
- File[] selectedFiles;
- selectedFiles = chooser.getSelectedFiles();
- for (int i = 0; i < selectedFiles.length; i++) {
- final File theFile = selectedFiles[i];
- try {
- setLastCurrentDir(theFile.getParentFile());
- Controller.getCurrentModeController().getMapController().newMap(Compat.fileToUrl(theFile));
- }
- catch (final Exception ex) {
- handleLoadingException(ex);
- break;
- }
- }
- Controller.getCurrentController().getMapViewManager().setTitle();
- }
-
- /**@deprecated -- use MMapIO*/
- @Deprecated
- public MapModel newMapFromDefaultTemplate() {
- final File file = defaultTemplateFile();
- if (file != null) {
- return newMapFromTemplate(file);
- }
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- final MapModel map = mapController.newMap();
- mapController.setSaved(map, true);
- return map;
- }
-
- @Override
- public File defaultTemplateFile() {
- final String userDefinedTemplateFile = getStandardTemplateName();
- final File absolute = new File(userDefinedTemplateFile);
- if(absolute.isAbsolute() && absolute.exists() && ! absolute.isDirectory()){
- return absolute;
- }
- final File userTemplates = defaultUserTemplateDir();
- final File userStandard = new File(userTemplates, userDefinedTemplateFile);
- if(userStandard.exists() && ! userStandard.isDirectory())
- return userStandard;
- return null;
- }
-
- public File defaultUserTemplateDir() {
- final String userDir = ResourceController.getResourceController().getFreeplaneUserDirectory();
- final File userTemplates = new File(userDir, "templates");
- return userTemplates;
- }
-
- public File defaultStandardTemplateDir() {
- final String resourceBaseDir = ResourceController.getResourceController().getResourceBaseDir();
- final File allUserTemplates = new File(resourceBaseDir, "templates");
- return allUserTemplates;
- }
-
- public String getStandardTemplateName() {
- return ResourceController.getResourceController().getProperty("standard_template");
- }
-
- /**@deprecated -- use MMapIO*/
- @Deprecated
- public MapModel newMapFromTemplate(final File startFile) {
- final File file;
- if (startFile == null) {
- file = getLastCurrentDir();
- }
- else if (startFile.isDirectory()) {
- final JFileChooser chooser = getFileChooser(true);
- chooser.setCurrentDirectory(startFile);
- final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent());
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- return null;
- }
- file = chooser.getSelectedFile();
- }
- else {
- file = startFile;
- }
- try {
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- mapController.newUntitledMap(Compat.fileToUrl(file));
- final Controller controller = Controller.getCurrentController();
- final MapModel map = controller.getMap();
- final Object rootText = map.getRootNode().getUserObject();
- if(rootText instanceof NamedObject){
- map.getRootNode().setText(rootText.toString());
- }
- controller.getModeController().getMapController().setSaved(map, true);
- return map;
- }
- catch (Exception e) {
- handleLoadingException(e);
- }
- return null;
- }
-
- /**@deprecated -- use MMapIO*/
- @Deprecated
- public void saveAsUserTemplate() {
- final JFileChooser chooser = new JFileChooser();
- final FileFilter filter = getFileFilter();
- chooser.addChoosableFileFilter(filter);
- chooser.setFileFilter(filter);
- final File userTemplates = defaultUserTemplateDir();
- chooser.setCurrentDirectory(userTemplates);
- final int returnVal = chooser
- .showOpenDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent());
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- return;
- }
- File file = chooser.getSelectedFile();
- if (file.exists()) {
- final int overwriteMap = JOptionPane.showConfirmDialog(Controller.getCurrentController()
- .getMapViewManager().getMapViewComponent(), TextUtils.getText("map_already_exists"), "Freeplane",
- JOptionPane.YES_NO_OPTION);
- if (overwriteMap != JOptionPane.YES_OPTION) {
- return;
- }
- }
- saveInternal((MMapModel) Controller.getCurrentController().getMap(), file, false);
- }
-
- /**@deprecated -- use MMapIO*/
- @Deprecated
- public boolean save(final MapModel map) {
- if (map == null || map.isSaved()) {
- return true;
- }
- if (map.getURL() == null || map.isReadOnly()) {
- return saveAs(map);
- }
- else {
- return save(map, map.getFile());
- }
- }
-
- /**@deprecated -- use MMapIO*/
- @Deprecated
- public boolean save(final MapModel map, final File file) {
- if(file == null){
- return saveAs(map);
- }
- try {
- if (null == map.getExtension(BackupFlag.class)) {
- map.addExtension(new BackupFlag());
- backup(file);
- }
- final String lockingUser = tryToLock(map, file);
- if (lockingUser != null) {
- UITools.informationMessage(Controller.getCurrentController().getViewController().getFrame(),
- TextUtils.format("map_locked_by_save_as", file.getName(), lockingUser));
- return false;
- }
- }
- catch (final Exception e) {
- UITools.informationMessage(Controller.getCurrentController().getViewController().getFrame(),
- TextUtils.format("locking_failed_by_save_as", file.getName()));
- return false;
- }
- final URL urlBefore = map.getURL();
- final boolean saved = saveInternal((MMapModel) map, file, false);
- if (!saved) {
- return false;
- }
- map.setReadOnly(false);
- final URL urlAfter = map.getURL();
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- mapController.fireMapChanged(new MapChangeEvent(this, map, UrlManager.MAP_URL, urlBefore, urlAfter));
- mapController.setSaved(map, true);
- return true;
- }
-
- /**@deprecated -- use MMapIO*/
- @Deprecated
- public boolean saveAs(final MapModel map) {
- final JFileChooser chooser = getFileChooser(true);
- if (getMapsParentFile(map) == null) {
- chooser.setSelectedFile(new File(getFileNameProposal(map)
- + org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION));
- }
- else {
- chooser.setSelectedFile(map.getFile());
- }
- chooser.setDialogTitle(TextUtils.getText("SaveAsAction.text"));
- final int returnVal = chooser
- .showSaveDialog(Controller.getCurrentController().getMapViewManager().getMapViewComponent());
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- return false;
- }
- File f = chooser.getSelectedFile();
- setLastCurrentDir(f.getParentFile());
- final String ext = FileUtils.getExtension(f.getName());
- if (!ext.equals(org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION_WITHOUT_DOT)) {
- f = new File(f.getParent(), f.getName()
- + org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION);
- }
- if (f.exists()) {
- final int overwriteMap = JOptionPane.showConfirmDialog(Controller.getCurrentController()
- .getMapViewManager().getMapViewComponent(), TextUtils.getText("map_already_exists"), "Freeplane",
- JOptionPane.YES_NO_OPTION);
- if (overwriteMap != JOptionPane.YES_OPTION) {
- return false;
- }
- }
- // extra backup in this case.
- File oldFile = map.getFile();
- if (oldFile != null) {
- oldFile = oldFile.getAbsoluteFile();
- }
- if (!f.getAbsoluteFile().equals(oldFile) && null != map.getExtension(BackupFlag.class)) {
- map.removeExtension(BackupFlag.class);
- }
- if (save(map, f)) {
- Controller.getCurrentController().getMapViewManager().updateMapViewName();
- return true;
- }
- return false;
- }
-
- /**
- * This method is intended to provide both normal save routines and saving
- * of temporary (internal) files.
- */
- boolean saveInternal(final MMapModel map, final File file, final boolean isInternal) {
- if (file.exists() && !file.canWrite()) {
- LogUtils.severe("Attempt to write in read-only file.");
- return false;
- }
- try {
- if (map.getTimerForAutomaticSaving() != null) {
- map.getTimerForAutomaticSaving().cancel();
- }
- if (!isInternal) {
- setFile(map, file);
- map.setSaved(true);
- }
- writeToFile(map, file);
- map.scheduleTimerForAutomaticSaving();
- return true;
- }
- catch (final IOException e) {
- final String message = TextUtils.format("save_failed", file.getName());
- if (!isInternal) {
- UITools.errorMessage(message);
- }
- else {
- Controller.getCurrentController().getViewController().out(message);
- }
- }
- catch (final Exception e) {
- LogUtils.severe("Error in MapModel.save(): ", e);
- }
- map.scheduleTimerForAutomaticSaving();
- return false;
- }
-
- /**@deprecated -- use MMapIO*/
- @Deprecated
- public void writeToFile(final MapModel map, final File file) throws FileNotFoundException, IOException {
- final FileOutputStream out = new FileOutputStream(file);
- FileLock lock = null;
- try{
- boolean lockedByOtherApplication = false;
- try {
- lock = out.getChannel().tryLock();
- lockedByOtherApplication = lock == null;
- }
- catch (Exception e) {
- LogUtils.warn(e.getMessage());
- }
- if (lockedByOtherApplication) {
- throw new IOException("can not obtain file lock for " + file);
- }
- final BufferedWriter fileout = new BufferedWriter(new OutputStreamWriter(out));
- Controller.getCurrentModeController().getMapController().getMapWriter()
- .writeMapAsXml(map, fileout, Mode.FILE, true, false);
- }
- finally{
- if (lock != null && lock.isValid())
- lock.release();
- if(out != null)
- out.close();
- }
- }
-
- public void setFile(final MapModel map, final File file) {
- try {
- final URL url = Compat.fileToUrl(file);
- setURL(map, url);
- }
- catch (final MalformedURLException e) {
- LogUtils.severe(e);
- }
- }
-
- /**
- * Attempts to lock the map using a semaphore file
- *
- * @return If the map is locked, return the name of the locking user,
- * otherwise return null.
- * @throws Exception
- * , when the locking failed for other reasons than that the
- * file is being edited.
- *
- * @deprecated -- use MMapIO
- */
- @Deprecated
- public String tryToLock(final MapModel map, final File file) throws Exception {
- final String lockingUser = ((MMapModel) map).getLockManager().tryToLock(file);
- final String lockingUserOfOldLock = ((MMapModel) map).getLockManager().popLockingUserOfOldLock();
- if (lockingUserOfOldLock != null) {
- UITools.informationMessage(Controller.getCurrentController().getViewController().getFrame(),
- TextUtils.format("locking_old_lock_removed", file.getName(), lockingUserOfOldLock));
- }
- return lockingUser;
- }
-
- public void afterViewChange(final Component oldView, final Component newView) {
- }
-
- public void afterViewClose(final Component oldView) {
- }
-
- public void afterViewCreated(final Component mapView) {
- if (mapView != null) {
- final FileOpener fileOpener = new FileOpener();
- new DropTarget(mapView, fileOpener);
- }
- }
-
- public void beforeViewChange(final Component oldView, final Component newView) {
- }
-
- public static MFileManager getController(ModeController modeController) {
- return (MFileManager) modeController.getExtension(UrlManager.class);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/OpenAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/OpenAction.java
deleted file mode 100644
index 37df253..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/OpenAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-class OpenAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public OpenAction() {
- super("OpenAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentController().getModeController(MModeController.MODENAME);
- MFileManager.getController(modeController).open();
- Controller.getCurrentController().getMapViewManager().setTitle();
- }
-
- @Override
- public void afterMapChange(final Object newMap) {
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAction.java
deleted file mode 100644
index fd53d36..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAction.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
- at EnabledAction(checkOnNodeChange=true)
-
-class SaveAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public SaveAction() {
- super("SaveAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final boolean success = ((MModeController) Controller.getCurrentModeController()).save();
- final Controller controller = Controller.getCurrentController();
- if (success) {
- controller.getViewController().out(TextUtils.getText("saved"));
- }
- else {
- controller.getViewController().out(TextUtils.getText("saving_canceled"));
- }
- controller.getMapViewManager().setTitle();
- }
-
- @Override
- public void setEnabled() {
- final Controller controller = Controller.getCurrentController();
- MapModel map = controller.getMap();
- setEnabled(map != null && ! map.isSaved() && ! map.isReadOnly());
- }
-}
diff --git a/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAsAction.java b/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAsAction.java
deleted file mode 100644
index 1a315f5..0000000
--- a/freeplane/src/org/freeplane/features/url/mindmapmode/SaveAsAction.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.features.url.mindmapmode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.url.UrlManager;
-
-
-class SaveAsAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public SaveAsAction() {
- super("SaveAsAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- ((MFileManager) UrlManager.getController()).saveAs(Controller.getCurrentController().getMap());
- Controller.getCurrentController().getMapViewManager().setTitle();
- }
-}
diff --git a/freeplane/src/org/freeplane/main/addons/AddOnProperties.java b/freeplane/src/org/freeplane/main/addons/AddOnProperties.java
deleted file mode 100644
index 53aea13..0000000
--- a/freeplane/src/org/freeplane/main/addons/AddOnProperties.java
+++ /dev/null
@@ -1,490 +0,0 @@
-package org.freeplane.main.addons;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.StringWriter;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Properties;
-import java.util.Vector;
-
-import org.apache.commons.lang.StringEscapeUtils;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.n3.nanoxml.CdataContentXmlWriter;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public class AddOnProperties {
- public enum AddOnType {
- SCRIPT, PLUGIN
- }
- public static final String OP_CONFIGURE = "configure";
- public static final String OP_DEACTIVATE = "deactivate";
- public static final String OP_ACTIVATE = "activate";
- public static final String OP_DEINSTALL = "deinstall";
-
- private final AddOnType addOnType;
- private boolean active = true;
- private String name;
- private String author;
- // installed version
- private String version;
- // latest known version
- // filled by the updater to use it either in the updater
- // or in the add-on manager
- private String latestVersion;
- private FreeplaneVersion freeplaneVersionFrom;
- private FreeplaneVersion freeplaneVersionTo;
- private URL homepage;
- // the URL source to fetch the latest version
- private URL updateUrl;
- // extra URL where to download the latest version and changelog
- // these are not stored in the xml file, they are only updated dynamically during update check
- private URL latestVersionDownloadUrl;
- private URL latestVersionChangelogUrl;
- private String description;
- private String license;
- private Map<String, Map<String, String>> translations;
- private String preferencesXml;
- private Map<String, String> defaultProperties;
- private List<String[/*action, file*/]> deinstallationRules;
- private List<String> images;
- private File addOnPropertiesFile;
-
- public AddOnProperties(AddOnType addOnType) {
- this.addOnType = addOnType;
- }
-
- public AddOnProperties(AddOnType addOnType, XMLElement addOnElement) {
- this(addOnType);
- this.setName(addOnElement.getAttribute("name", null));
- this.setVersion(addOnElement.getAttribute("version", null));
- this.setLatestVersion(addOnElement.getAttribute("latestVersion", null));
- this.setFreeplaneVersionFrom(FreeplaneVersion.getVersion(addOnElement.getAttribute("freeplaneVersionFrom",
- null)));
- this.setFreeplaneVersionTo(FreeplaneVersion.getVersion(addOnElement.getAttribute("freeplaneVersionTo", null)));
- this.setHomepage(parseUrl(addOnElement.getAttribute("homepage", null)));
- this.setUpdateUrl(parseUrl(addOnElement.getAttribute("updateUrl", null)));
- this.setActive(Boolean.parseBoolean(addOnElement.getAttribute("active", "true")));
- this.setDescription(getContentOfFirstElement(addOnElement.getChildrenNamed("description")));
- this.setLicense(getContentOfFirstElement(addOnElement.getChildrenNamed("license")));
- this.setAuthor(addOnElement.getAttribute("author", null));
- this.setTranslations(parseTranslations(addOnElement.getChildrenNamed("translations")));
- this.setPreferencesXml(getContentOfFirstElement(addOnElement.getChildrenNamed("preferences.xml")));
- this.setDefaultProperties(parseAttributesToProperties(addOnElement.getChildrenNamed("default.properties")));
- this.setImages(parseBinaries(addOnElement.getChildrenNamed("images")));
- this.setDeinstallationRules(parseDeinstallationRules(addOnElement.getChildrenNamed("deinstall")));
- validate();
- }
-
- private URL parseUrl(String url) {
- try {
- return new URL(url);
- }
- catch (Exception e) {
- return null;
- }
- }
-
- private String getContentOfFirstElement(Vector<XMLElement> xmlElements) {
- if (xmlElements == null || xmlElements.isEmpty())
- return null;
- return xmlElements.get(0).getContent();
- }
-
- private Map<String, Map<String, String>> parseTranslations(Vector<XMLElement> xmlElements) {
- final Map<String, Map<String, String>> result = new HashMap<String, Map<String, String>>();
- if (xmlElements != null && !xmlElements.isEmpty()) {
- for (XMLElement xmlElement : xmlElements.get(0).getChildren()) {
- Map<String, String> properties = new LinkedHashMap<String, String>();
- result.put(xmlElement.getAttribute("name", null), properties);
- for (XMLElement entryXmlElement : xmlElement.getChildren()) {
- properties.put(entryXmlElement.getAttribute("key", null), entryXmlElement.getContent());
- }
- }
- }
- return result;
- }
-
- private Map<String, String> parseAttributesToProperties(Vector<XMLElement> xmlElements) {
- if (xmlElements == null || xmlElements.isEmpty())
- return Collections.emptyMap();
- return propertiesToStringMap(xmlElements.get(0).getAttributes());
- }
-
- private Map<String, String> propertiesToStringMap(Properties props) {
- final LinkedHashMap<String, String> result = new LinkedHashMap<String, String>();
- for (Entry<Object, Object> entry : props.entrySet()) {
- result.put((String) entry.getKey(), (String) entry.getValue());
- }
- return result;
- }
-
- protected List<String> parseBinaries(Vector<XMLElement> xmlElements) {
- final List<String> result = new ArrayList<String>();
- if (xmlElements != null && !xmlElements.isEmpty()) {
- for (XMLElement xmlElement : xmlElements.get(0).getChildren()) {
- result.add(xmlElement.getAttribute("name", null));
- }
- }
- return result;
- }
-
- private List<String[]> parseDeinstallationRules(Vector<XMLElement> xmlElements) {
- final List<String[]> result = new ArrayList<String[]>();
- if (xmlElements != null && !xmlElements.isEmpty()) {
- for (XMLElement xmlElement : xmlElements.get(0).getChildren()) {
- result.add(new String[] { xmlElement.getName(), xmlElement.getContent() });
- }
- }
- return result;
- }
-
- private void validate() {
- if (empty(name))
- throw new RuntimeException("while parsing .addon.xml file: name must be set");
- if (empty(version))
- throw new RuntimeException("while parsing .addon.xml file: version must be set");
- if (freeplaneVersionFrom == null)
- throw new RuntimeException("while parsing .addon.xml file: freeplaneVersionFrom must be set");
- if (empty(description))
- throw new RuntimeException("while parsing .addon.xml file: description must be set");
- }
-
- public AddOnType getAddOnType() {
- return addOnType;
- }
-
- /** returns the key that is used to lookup the translated name of the add-on. */
- public String getNameKey() {
- return "addons." + name;
- }
-
- public String getTranslatedName() {
- return TextUtils.getRawText(getNameKey());
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getAuthor() {
- return author;
- }
-
- public void setAuthor(String author) {
- this.author = author;
- }
-
- public boolean isActive() {
- return active;
- }
-
- public void setActive(boolean active) {
- this.active = active;
- }
-
- public String getVersion() {
- return version;
- }
-
- public String getLatestVersion() {
- return latestVersion;
- }
-
- public URL getLatestVersionDownloadUrl() {
- return latestVersionDownloadUrl;
- }
-
- public URL getLatestVersionChangelogUrl() {
- return latestVersionChangelogUrl;
- }
-
- public void setVersion(String version) {
- this.version = version;
- }
-
- public void setLatestVersionDownloadUrl(URL latestVersionDownloadUrl) {
- this.latestVersionDownloadUrl = latestVersionDownloadUrl;
- }
-
- public void setLatestVersionChangelogUrl(URL latestVersionChangelogUrl) {
- this.latestVersionChangelogUrl = latestVersionChangelogUrl;
- }
-
- public void setLatestVersion(String latestVersion) {
- this.latestVersion = latestVersion;
- }
-
- public FreeplaneVersion getFreeplaneVersionFrom() {
- return freeplaneVersionFrom;
- }
-
- public void setFreeplaneVersionFrom(FreeplaneVersion freeplaneVersionFrom) {
- this.freeplaneVersionFrom = freeplaneVersionFrom;
- }
-
- public FreeplaneVersion getFreeplaneVersionTo() {
- return freeplaneVersionTo;
- }
-
- public void setFreeplaneVersionTo(FreeplaneVersion freeplaneVersionTo) {
- this.freeplaneVersionTo = freeplaneVersionTo;
- }
-
- public URL getHomepage() {
- return homepage;
- }
-
- // If the updateUrl is not set, the default is $homepage/version.txt
- // This will help to update old add-ons.
- public URL getUpdateUrl() {
- if (updateUrl != null)
- return updateUrl;
- else if (homepage != null && !homepage.getPath().isEmpty())
- return homepagePlusLatestVersionFile();
- else
- return null;
- }
-
- private URL homepagePlusLatestVersionFile() {
- try {
- final String pathWithForwardSlashes = homepage.getPath() + '/' + AddOnsController.LATEST_VERSION_FILE;
- return new URL(homepage.getProtocol(), homepage.getHost(), homepage.getPort(), pathWithForwardSlashes);
- }
- catch (MalformedURLException e) {
- return null;
- }
- }
-
- public void setHomepage(URL homepage) {
- this.homepage = homepage;
- }
-
- public void setUpdateUrl(URL updateUrl) {
- this.updateUrl = updateUrl;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public String getLicense() {
- return license;
- }
-
- public void setLicense(String license) {
- this.license = license;
- }
-
- public Map<String, Map<String, String>> getTranslations() {
- return translations;
- }
-
- public void setTranslations(Map<String, Map<String, String>> translations) {
- this.translations = translations;
- }
-
- public String getPreferencesXml() {
- return preferencesXml;
- }
-
- public void setPreferencesXml(String preferencesXml) {
- this.preferencesXml = preferencesXml;
- }
-
- public Map<String, String> getDefaultProperties() {
- return defaultProperties;
- }
-
- public void setDefaultProperties(Map<String, String> defaultProperties) {
- this.defaultProperties = defaultProperties;
- }
-
- public List<String[]> getDeinstallationRules() {
- return deinstallationRules;
- }
-
- public void setDeinstallationRules(List<String[]> rules) {
- this.deinstallationRules = rules;
- }
-
- public List<String> getImages() {
- return images;
- }
-
- public void setImages(Collection<String> images) {
- this.images = new ArrayList<String>(images);
- }
-
- /** the persistence location of this AddOnProperties object. */
- public File getAddOnPropertiesFile() {
- return addOnPropertiesFile;
- }
-
- public void setAddOnPropertiesFile(File file) {
- addOnPropertiesFile = file;
- }
-
- public boolean supportsOperation(String opName) {
- if (opName.equals(OP_CONFIGURE))
- return !empty(preferencesXml);
- if (opName.equals(OP_DEACTIVATE))
- return active;
- if (opName.equals(OP_ACTIVATE))
- return !active;
- if (opName.equals(OP_DEINSTALL))
- return deinstallationRules != null && !deinstallationRules.isEmpty();
- return false;
- }
-
- public String toXmlString() {
- try {
- final String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
- final StringWriter writer = new StringWriter();
- final CdataContentXmlWriter xmlWriter = new CdataContentXmlWriter(writer);
- xmlWriter.addRawContent(header);
- xmlWriter.addRawContent(System.getProperty("line.separator"));
- xmlWriter.write(toXml(), true);
- return writer.toString();
- }
- catch (IOException e) {
- // StringWriter does not throw an exception but anyhow...
- throw new RuntimeException(e);
- }
- }
-
- // // this is the Groovy equivalent for all this below - removed from the script to avoid redundancies
- // writer.write('<?xml version="1.0" encoding="UTF-8"?>' + System.getProperty("line.separator"))
- // new MarkupBuilder(writer).addon( configMap['properties'] ) {
- // description('') {
- // writer.write('<![CDATA[' + configMap['description'] + ']]>')
- // }
- // permissions( configMap['permissions'] )
- // translations {
- // configMap['translations'].collect{ loc, translationMap ->
- // locale( name:loc ) {
- // translationMap.collect{ k,v ->
- // entry(key:k, v)
- // }
- // }
- // }
- // }
- // 'preferences.xml'('') {
- // writer.write('<![CDATA[' + configMap['preferences.xml'] + ']]>')
- // }
- // 'default.properties'( configMap['default.properties'] )
- // deinstall {
- // configMap['deinstall'].collect { pair ->
- // "${pair[0]}"(pair[1])
- // }
- // }
- // }
- // writer.close()
- public XMLElement toXml() {
- final XMLElement addonElement = new XMLElement("addon");
- addonElement.setAttribute("name", name);
- addonElement.setAttribute("version", version);
- addonElement.setAttribute("latestVersion", latestVersion == null ? "" : latestVersion);
- addonElement.setAttribute("freeplaneVersionFrom", freeplaneVersionFrom.toString());
- if (freeplaneVersionTo != null)
- addonElement.setAttribute("freeplaneVersionTo", freeplaneVersionTo.toString());
- if (homepage != null)
- addonElement.setAttribute("homepage", homepage.toString());
- if (updateUrl != null)
- addonElement.setAttribute("updateUrl", updateUrl.toString());
- if (author != null)
- addonElement.setAttribute("author", author);
- addonElement.setAttribute("active", Boolean.toString(active));
- addAsChildWithContent(addonElement, "description", description);
- addAsChildWithContent(addonElement, "license", license);
- addAsChildWithContent(addonElement, "preferences.xml", preferencesXml);
- addTranslationsAsChild(addonElement);
- addDefaultPropertiesAsChild(addonElement);
- addImagesAsChild(addonElement);
- addDeinstallationRulesAsChild(addonElement);
- return addonElement;
- }
-
- private void addAsChildWithContent(XMLElement parent, String name, String content) {
- final XMLElement xmlElement = new XMLElement(name);
- xmlElement.setContent(content);
- parent.addChild(xmlElement);
- }
-
- private void addTranslationsAsChild(XMLElement parent) {
- final XMLElement translationsElement = new XMLElement("translations");
- for (Entry<String, Map<String, String>> localeEntry : translations.entrySet()) {
- final XMLElement localeElement = new XMLElement("locale");
- localeElement.setAttribute("name", localeEntry.getKey());
- for (Entry<String, String> translationEntry : localeEntry.getValue().entrySet()) {
- final XMLElement translationElement = new XMLElement("entry");
- translationElement.setAttribute("key", translationEntry.getKey());
- translationElement.setContent(StringEscapeUtils.escapeJava(translationEntry.getValue()));
- localeElement.addChild(translationElement);
- }
- translationsElement.addChild(localeElement);
- }
- parent.addChild(translationsElement);
- }
-
- private void addDefaultPropertiesAsChild(XMLElement parent) {
- final XMLElement xmlElement = new XMLElement("default.properties");
- for (Entry<String, String> entry : defaultProperties.entrySet()) {
- xmlElement.setAttribute(entry.getKey(), entry.getValue());
- }
- parent.addChild(xmlElement);
- }
-
- private void addImagesAsChild(XMLElement parent) {
- final XMLElement xmlElement = new XMLElement("images");
- if (images != null) {
- for (String image : images) {
- final XMLElement imageElement = new XMLElement("image");
- imageElement.setAttribute("name", image);
- xmlElement.addChild(imageElement);
- }
- }
- parent.addChild(xmlElement);
- }
-
- private void addDeinstallationRulesAsChild(XMLElement parent) {
- final XMLElement xmlElement = new XMLElement("deinstall");
- for (String[] rule : deinstallationRules) {
- final XMLElement ruleElement = new XMLElement(rule[0]);
- ruleElement.setContent(rule[1]);
- xmlElement.addChild(ruleElement);
- }
- parent.addChild(xmlElement);
- }
-
- private boolean empty(String string) {
- return string == null || string.length() == 0;
- }
-
- @Override
- public String toString() {
- return "AddOnProperties(addOnType=" + addOnType + ", active=" + active + ", name=" + name + ", version="
- + version + ")";
- }
-
- public boolean isTheme() {
- return name != null && name.toLowerCase().endsWith("theme");
- }
-}
diff --git a/freeplane/src/org/freeplane/main/addons/AddOnsController.java b/freeplane/src/org/freeplane/main/addons/AddOnsController.java
deleted file mode 100644
index aaf89a0..0000000
--- a/freeplane/src/org/freeplane/main/addons/AddOnsController.java
+++ /dev/null
@@ -1,225 +0,0 @@
-package org.freeplane.main.addons;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.StringReader;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.swing.JOptionPane;
-
-import org.apache.commons.lang.StringEscapeUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.main.addons.AddOnProperties.AddOnType;
-import org.freeplane.n3.nanoxml.IXMLParser;
-import org.freeplane.n3.nanoxml.IXMLReader;
-import org.freeplane.n3.nanoxml.StdXMLReader;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.n3.nanoxml.XMLParserFactory;
-
-public class AddOnsController {
- private static final String ADDONS_DIR = "addons";
- private static AddOnsController addOnsController;
- private List<AddOnProperties> installedAddOns = new ArrayList<AddOnProperties>();
- private boolean autoInstall;
- public static final String LATEST_VERSION_FILE = "version.properties";
-
- public AddOnsController() {
- createAddOnsDirIfNecessary();
- registerPlugins();
- autoInstall = true;
- }
-
- private void createAddOnsDirIfNecessary() {
- final File addOnsDir = getAddOnsDir();
- // in applets the addOnsDir will be null
- if (addOnsDir != null && !addOnsDir.exists()) {
- LogUtils.info("creating user add-ons directory " + addOnsDir);
- addOnsDir.mkdirs();
- }
- }
-
- private void registerPlugins() {
- final File addOnsDir = getAddOnsDir();
- // in applets the addOnsDir will be null
- if (addOnsDir == null)
- return;
- File[] addonXmlFiles = addOnsDir.listFiles(new FilenameFilter() {
- public boolean accept(File dir, String name) {
- return name.endsWith(".plugin.xml");
- }
- });
- final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
- for (File file : addonXmlFiles) {
- BufferedInputStream inputStream = null;
- try {
- inputStream = new BufferedInputStream(new FileInputStream(file));
- final IXMLReader reader = new StdXMLReader(inputStream);
- parser.setReader(reader);
- registerInstalledAddOn(new AddOnProperties(AddOnType.PLUGIN, (XMLElement) parser.parse()));
- }
- catch (final Exception e) {
- LogUtils.warn("error parsing " + file, e);
- }
- finally {
- FileUtils.silentlyClose(inputStream);
- }
- }
- }
-
- public static AddOnsController getController() {
- if (addOnsController == null)
- addOnsController = new AddOnsController();
- return addOnsController;
- }
-
- public List<AddOnProperties> getInstalledAddOns() {
- return Collections.unmodifiableList(new ArrayList<AddOnProperties>(installedAddOns));
- }
-
- public void registerInstalledAddOn(final AddOnProperties addOn) {
- installedAddOns.add(addOn);
- final ResourceController resourceController = ResourceController.getResourceController();
- if (addOn.getDefaultProperties() != null)
- resourceController.addDefaults(addOn.getDefaultProperties());
- if (addOn.getPreferencesXml() != null) {
- final ModeController modeController = Controller.getCurrentModeController();
- if (modeController instanceof MModeController) {
- ((MModeController)modeController).getOptionPanelBuilder().load(new StringReader(addOn.getPreferencesXml()));
- }
- }
- if (addOn.getTranslations() != null)
- registerAddOnResources(addOn, resourceController);
- }
-
- /** make the translations of this add-on known system-wide. */
- public static void registerAddOnResources(final AddOnProperties addOn, final ResourceController resourceController) {
- HashSet<String> languages = new HashSet<String>();
- languages.add(resourceController.getLanguageCode());
- languages.add(resourceController.getDefaultLanguageCode());
- for (String language : languages) {
- final Map<String, String> resources = addOn.getTranslations().get(language);
- if (resources != null) {
- for (Entry<String, String> entry : resources.entrySet()) {
- if (entry.getValue().indexOf('\\') != -1) {
- // convert \uFFFF sequences
- entry.setValue(StringEscapeUtils.unescapeJava(entry.getValue()));
- }
- }
- resourceController.addLanguageResources(language, addOptionPanelPrefix(resources, addOn.getName()));
- resourceController.addLanguageResources(language, resources);
- }
- }
- }
-
- /** if the add-on is configurable it's a burden for the add-on-writer that the keys in the configuration are
- * prepended by "OptionPanel.". This code relieves the developer from taking care of that. */
- private static Map<String, String> addOptionPanelPrefix(final Map<String, String> resources, final String addOnName) {
- final HashMap<String, String> result = new HashMap<String, String>(resources.size());
- for (Entry<String, String> entry : resources.entrySet()) {
- result.put("OptionPanel." + entry.getKey(), entry.getValue());
- }
- final String nameKey = "addons." + addOnName;
- result.put("OptionPanel.separator." + nameKey, resources.get(nameKey));
- return result;
- }
-
- public File getAddOnsDir() {
- // in applets the userDir will be null
- final String userDir = ResourceController.getResourceController().getFreeplaneUserDirectory();
- return userDir == null ? null : new File(userDir, ADDONS_DIR);
- }
-
- public void save(final AddOnProperties addOn) throws IOException {
- final File addOnsDir = getAddOnsDir();
- if (addOnsDir != null) {
- File file = addOn.getAddOnPropertiesFile();
- if (file == null) {
- file = new File(addOnsDir, addOn.getName() + "." + addOn.getAddOnType().name().toLowerCase() + ".xml");
- }
- FileUtils.dumpStringToFile(addOn.toXmlString(), file, "UTF-8");
- }
- }
-
- public void deinstall(AddOnProperties addOn) {
- LogUtils.info("deinstalling " + addOn);
- for (String[] rule : addOn.getDeinstallationRules()) {
- if (rule[0].equals("delete")) {
- final File file = new File(expandVariables(rule));
- if (!file.exists()) {
- LogUtils.warn("file " + expandVariables(rule) + " should be deleted but does not exist");
- }
- else {
- if (file.delete())
- LogUtils.info("deleted " + expandVariables(rule));
- else
- LogUtils.warn("could not delete file " + expandVariables(rule));
- }
- }
- }
- installedAddOns.remove(addOn);
- }
-
- private String expandVariables(String[] rule) {
- return rule[1].replace("${installationbase}", ResourceController.getResourceController()
- .getFreeplaneUserDirectory());
- }
-
- /** returns true if the url is an add-on package and the user decided to install it. */
- public boolean installIfAppropriate(final URL url) {
- if(! autoInstall)
- return false;
- if (url.getFile().endsWith(UrlManager.FREEPLANE_ADD_ON_FILE_EXTENSION)) {
- AddOnInstaller installer = (AddOnInstaller) Controller.getCurrentModeController().getExtension(
- AddOnInstaller.class);
- if (installer == null) {
- LogUtils.warn("no AddOnInstaller registered. Cannot install " + url);
- return false;
- }
- UITools.backOtherWindows();
- final int selection = UITools.showConfirmDialog(null,
- TextUtils.format("newmap.install.addon.question", new File(url.getFile()).getName()),
- TextUtils.getText("newmap.install.addon.title"), JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE);
- if (selection == JOptionPane.OK_OPTION) {
- installer.install(url);
- return true;
- }
- }
- return false;
- }
-
- public void setAutoInstallEnabled(boolean autoInstall) {
- this.autoInstall = autoInstall;
-
- }
-
- public boolean isAutoInstallEnabled() {
- return autoInstall;
- }
-
- public AddOnProperties getInstalledAddOn(final String name) {
- // Performance consideration: list is small -> iteration over list is OK.
- for (AddOnProperties addOn : installedAddOns) {
- if (addOn.getName().equals(name))
- return addOn;
- }
- return null;
- }
-}
diff --git a/freeplane/src/org/freeplane/main/applet/AppletViewController.java b/freeplane/src/org/freeplane/main/applet/AppletViewController.java
deleted file mode 100644
index c3627c8..0000000
--- a/freeplane/src/org/freeplane/main/applet/AppletViewController.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.applet;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.EventQueue;
-import java.lang.reflect.InvocationTargetException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.RootPaneContainer;
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.browsemode.BModeController;
-import org.freeplane.features.ui.FrameController;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.view.swing.map.MapViewScrollPane;
-
-/**
- * @author Dimitry Polivaev
- */
-class AppletViewController extends FrameController implements IMapViewChangeListener {
- final private FreeplaneApplet applet;
- private JComponent mComponentInSplitPane;
- private JComponent mapContentBox;
- private JScrollPane scrollPane;
-
- public AppletViewController( final FreeplaneApplet applet, Controller controller,
- final IMapViewManager mapViewController) {
- super(controller, mapViewController, "");
- this.applet = applet;
- mapViewController.addMapViewChangeListener(this);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.controller.views.ViewController#getContentPane()
- */
- @Override
- public RootPaneContainer getRootPaneContainer() {
- return applet;
- }
-
- @Override
- public FreeplaneMenuBar getFreeplaneMenuBar() {
- return (FreeplaneMenuBar) applet.getJMenuBar();
- }
-
- public FreeplaneVersion getFreeplaneVersion() {
- return FreeplaneVersion.getVersion();
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.FreeplaneMain#getJFrame()
- */
- @Override
- public JFrame getJFrame() {
- throw new IllegalArgumentException("The applet has no frames");
- }
-
- @Override
- public void init(Controller controller) {
- mapContentBox = new JPanel(new BorderLayout());
- scrollPane = new MapViewScrollPane();
- mapContentBox.add(scrollPane, BorderLayout.CENTER);
- getContentPane().add(mapContentBox, BorderLayout.CENTER);
- super.init(controller);
- SwingUtilities.updateComponentTreeUI(applet);
- if (!EventQueue.isDispatchThread()) {
- try {
- EventQueue.invokeAndWait(new Runnable() {
- public void run() {
- };
- });
- }
- catch (final InterruptedException e) {
- LogUtils.severe(e);
- }
- catch (final InvocationTargetException e) {
- LogUtils.severe(e);
- }
- }
- getController().selectMode(BModeController.MODENAME);
- String initialMapName = ResourceController.getResourceController().getProperty("browsemode_initial_map");
- if (initialMapName != null && initialMapName.startsWith(".")) {
- final String locationUrl = applet.getParameter("location_href");
- try {
- URI uri = new URI(locationUrl).resolve(new URI(null, null, initialMapName, null));
- URL documentBase = new URL(uri.getScheme(), uri.getHost(), uri.getPort(), uri.getPath());
- initialMapName = documentBase.toString();
- }
- catch (final Exception e) {
- UITools.errorMessage(TextUtils.format("map_load_error", initialMapName));
- System.err.println(e);
- return;
- }
- /* end: new handling for relative urls. fc, 29.10.2003. */
- }
- if (initialMapName != "") {
- try {
- final URL mapUrl = new URL(initialMapName);
- getController().getModeController().getMapController().newMap(mapUrl);
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
- }
-
- @Override
- public void insertComponentIntoSplitPane(final JComponent pMindMapComponent) {
- if (mComponentInSplitPane == pMindMapComponent) {
- return;
- }
- removeSplitPane();
- mComponentInSplitPane = pMindMapComponent;
- mapContentBox.add(pMindMapComponent, BorderLayout.SOUTH);
- mapContentBox.revalidate();
- }
-
- @Override
- public boolean isApplet() {
- return true;
- }
-
- @Override
- public void openDocument(final URI location) {
- try {
- final String scheme = location.getScheme();
- final String host = location.getHost();
- final String path = location.isOpaque() ? location.getSchemeSpecificPart() : location.getPath();
- final int port = location.getPort();
- final String query = location.getQuery();
- final String fragment = location.getFragment();
- final StringBuilder file = new StringBuilder(path);
- if(query != null){
- file.append('?');
- file.append(query);
- }
- if(fragment != null){
- file.append('#');
- file.append(fragment);
- }
- final URL url = new URL(scheme, host, port, file.toString());
- openDocument(url);
- }
- catch (final MalformedURLException e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public void openDocument(final URL doc) {
- applet.getAppletContext().showDocument(doc, "_blank");
- }
-
- @Override
- public void removeSplitPane() {
- if (mComponentInSplitPane != null) {
- mapContentBox.remove(mComponentInSplitPane);
- mapContentBox.revalidate();
- mComponentInSplitPane = null;
- }
- }
-
- @Override
- protected void setFreeplaneMenuBar(final FreeplaneMenuBar menuBar) {
- applet.setJMenuBar(menuBar);
- }
-
- @Override
- public void setTitle(final String frameTitle) {
- }
-
- @Override
- public void setWaitingCursor(final boolean waiting) {
- applet.setWaitingCursor(waiting);
- }
-
- public void start() {
- try {
- final IMapSelection selection = getController().getSelection();
- if (selection != null) {
- selection.selectRoot();
- }
- else {
- System.err.println("View is null.");
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
-
- public void afterViewChange(Component oldView, Component newView) {
- if(scrollPane != null)
- scrollPane.setViewportView(newView);
- }
-
- public void afterViewClose(Component oldView) {
- }
-
- public void afterViewCreated(Component mapView) {
- }
-
- public void beforeViewChange(Component oldView, Component newView) {
- }
-}
diff --git a/freeplane/src/org/freeplane/main/applet/FreeplaneApplet.java b/freeplane/src/org/freeplane/main/applet/FreeplaneApplet.java
deleted file mode 100644
index 6680ccd..0000000
--- a/freeplane/src/org/freeplane/main/applet/FreeplaneApplet.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.applet;
-
-import java.awt.AWTEvent;
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Cursor;
-import java.awt.EventQueue;
-import java.awt.HeadlessException;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.Collections;
-import java.util.Set;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import javax.swing.JApplet;
-import javax.swing.JComponent;
-import javax.swing.JOptionPane;
-import javax.swing.text.html.parser.ParserDelegator;
-
-import org.freeplane.core.ui.ShowSelectionAsRectangleAction;
-import org.freeplane.features.attribute.ModelessAttributeController;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.filter.NextNodeAction;
-import org.freeplane.features.filter.NextPresentationItemAction;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.help.HelpController;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapController.Direction;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.browsemode.BModeController;
-import org.freeplane.features.print.PrintController;
-import org.freeplane.features.styles.LogicalStyleFilterController;
-import org.freeplane.features.styles.MapViewLayout;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.time.TimeController;
-import org.freeplane.features.ui.FrameController;
-import org.freeplane.main.browsemode.BModeControllerFactory;
-import org.freeplane.view.swing.features.nodehistory.NodeHistory;
-import org.freeplane.view.swing.map.MapViewController;
-import org.freeplane.view.swing.map.ViewLayoutTypeAction;
-
-public class FreeplaneApplet extends JApplet {
-
- @SuppressWarnings("serial")
- private class GlassPane extends JComponent{
- public GlassPane() {
- addMouseListener(new MouseAdapter(){});
- }
-
-
- @Override
- protected void processMouseEvent(MouseEvent e) {
- if (e.getID() == MouseEvent.MOUSE_EXITED){
- return;
- }
- Controller currentController = Controller.getCurrentController();
- if( controller != currentController ){
- if(! appletLock.tryLock()){
- return;
- }
- Controller.setCurrentController(controller);
- appletLock.unlock();
- JOptionPane.getFrameForComponent(this).getMostRecentFocusOwner().requestFocus();
- if(currentController != null){
- currentController.getViewController().getRootPaneContainer().getGlassPane().setVisible(true);
- }
- }
- setVisible(false);
- }
- }
-
- private AppletResourceController appletResourceController;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private AppletViewController appletViewController;
- private Controller controller;
-
- final static Lock appletLock = new ReentrantLock();
-
- public FreeplaneApplet() throws HeadlessException {
- super();
- }
-
- @Override
- public void destroy() {
- }
-
- @SuppressWarnings("serial")
- @Override
- public void init() {
- try{
- appletLock.lock();
- appletResourceController = new AppletResourceController(this);
- if (appletResourceController == null) {
- appletResourceController = new AppletResourceController(this);
- }
- new ParserDelegator(){
- {
- setDefaultDTD();
- }
- };
- updateLookAndFeel();
- createRootPane();
- controller = new Controller(appletResourceController);
- appletResourceController.init();
- Controller.setCurrentController(controller);
- final Container contentPane = getContentPane();
- contentPane.setLayout(new BorderLayout());
- MapViewController mapViewController = new MapViewController(controller);
- appletViewController = new AppletViewController(this, controller, mapViewController);
- controller.addAction(new ViewLayoutTypeAction(MapViewLayout.OUTLINE));
- FilterController.install();
- PrintController.install();
- HelpController.install();
- NodeHistory.install(controller);
- FormatController.install(new FormatController());
- ModelessAttributeController.install();
- TextController.install();
- MapController.install();
-
- TimeController.install();
- LinkController.install();
- IconController.install();
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(7,
- new LogicalStyleFilterController());
- final BModeController browseController = BModeControllerFactory.createModeController();
- final Set<String> emptySet = Collections.emptySet();
- FilterController.getController(controller).loadDefaultConditions();
- browseController.updateMenus("/xml/appletMenu.xml", emptySet);
- controller.addAction(new ShowSelectionAsRectangleAction());
- controller.addAction(new NextNodeAction(Direction.FORWARD));
- controller.addAction(new NextNodeAction(Direction.BACK));
- controller.addAction(new NextPresentationItemAction());
- controller.selectMode(browseController);
- appletResourceController.setPropertyByParameter(this, "browsemode_initial_map");
- appletViewController.init(controller);
- final GlassPane glassPane = new GlassPane();
- setGlassPane(glassPane);
- glassPane.setVisible(true);
- controller.getViewController().setMenubarVisible(false);
- }
- catch(RuntimeException e){
- e.printStackTrace();
- throw e;
- }
- finally{
- appletLock.unlock();
- }
- }
-
- @Override
- public void start() {
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- appletViewController.start();
- }
- });
- }
-
- @Override
- public void stop() {
- super.stop();
- }
-
- private void updateLookAndFeel() {
- String lookAndFeel = "";
- appletResourceController.setPropertyByParameter(this, "lookandfeel");
- lookAndFeel = appletResourceController.getProperty("lookandfeel");
- FrameController.setLookAndFeel(lookAndFeel);
- }
-
- @Override
- public Component findComponentAt(int x, int y) {
- final Component c = super.findComponentAt(x, y);
- if(c == null){
- return null;
- }
- final AWTEvent currentEvent = EventQueue.getCurrentEvent();
- if(controller != Controller.getCurrentController()
- && currentEvent instanceof MouseEvent
- && currentEvent.getID() == MouseEvent.MOUSE_MOVED){
- if(appletLock.tryLock()){
- Controller.setCurrentController(controller);
- appletLock.unlock();
- }
- }
- return c;
- }
-
- public void setWaitingCursor(final boolean waiting) {
- Component glassPane = getRootPane().getGlassPane();
- if (waiting) {
- glassPane.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- glassPane.setVisible(true);
- }
- else {
- glassPane.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
- glassPane.setVisible(false);
- }
- }
-
-}
diff --git a/freeplane/src/org/freeplane/main/application/ApplicationResourceController.java b/freeplane/src/org/freeplane/main/application/ApplicationResourceController.java
deleted file mode 100644
index a3dc205..0000000
--- a/freeplane/src/org/freeplane/main/application/ApplicationResourceController.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.Locale;
-import java.util.Properties;
-
-import org.freeplane.core.resources.IFreeplanePropertyListener;
-import org.freeplane.core.resources.ResourceBundles;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.features.filter.FilterController;
-
-/**
- * @author Dimitry Polivaev
- */
-public class ApplicationResourceController extends ResourceController {
- private static final String FREEPLANE_MAC_PROPERTIES = "/freeplane_mac.properties";
- final private File autoPropertiesFile;
- final private Properties defProps;
- private LastOpenedList lastOpened;
- final private Properties props;
- final private ClassLoader urlResourceLoader;
-
- /**
- * @param controller
- */
- public ApplicationResourceController() {
- super();
- defProps = readDefaultPreferences();
- props = readUsersPreferences(defProps);
- final File userDir = createUserDirectory(defProps);
- final ArrayList<URL> urls = new ArrayList<URL>(2);
- final String resourceBaseDir = getResourceBaseDir();
- if (resourceBaseDir != null) {
- try {
- final File userResourceDir = new File(userDir, "resources");
- if (userResourceDir.exists()) {
- final URL userResourceUrl = Compat.fileToUrl(userResourceDir);
- urls.add(userResourceUrl);
- }
- final File resourceDir = new File(resourceBaseDir);
- if (resourceDir.exists()) {
- final URL globalResourceUrl = Compat.fileToUrl(resourceDir);
- urls.add(globalResourceUrl);
- }
- }
- catch (final Exception e) {
- e.printStackTrace();
- }
- }
- if(urls.size() > 0)
- urlResourceLoader = new URLClassLoader(urls.toArray(new URL[]{}), null);
- else
- urlResourceLoader = null;
- setDefaultLocale(props);
- autoPropertiesFile = getUserPreferencesFile();
- addPropertyChangeListener(new IFreeplanePropertyListener() {
- public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
- if (propertyName.equals(ResourceBundles.RESOURCE_LANGUAGE)) {
- loadAnotherLanguage();
- }
- }
- });
- }
-
- private File createUserDirectory(final Properties pDefaultProperties) {
- final File userPropertiesFolder = new File(getFreeplaneUserDirectory());
- try {
- if (!userPropertiesFolder.exists()) {
- userPropertiesFolder.mkdirs();
- }
- return userPropertiesFolder;
- }
- catch (final Exception e) {
- e.printStackTrace();
- System.err.println("Cannot create folder for user properties and logging: '"
- + userPropertiesFolder.getAbsolutePath() + "'");
- return null;
- }
- }
-
- @Override
- public String getDefaultProperty(final String key) {
- return defProps.getProperty(key);
- }
-
- @Override
- public String getFreeplaneUserDirectory() {
- return Compat.getFreeplaneUserDirectory();
- }
-
- public LastOpenedList getLastOpenedList() {
- return lastOpened;
- }
-
- @Override
- public Properties getProperties() {
- return props;
- }
-
- @Override
- public String getProperty(final String key) {
- return props.getProperty(key);
- }
-
- @Override
- public URL getResource(final String name) {
- if (urlResourceLoader == null) {
- return super.getResource(name);
- }
- final String relName;
- if (name.startsWith("/")) {
- relName = name.substring(1);
- }
- else {
- relName = name;
- }
- URL resource = urlResourceLoader.getResource(relName);
- if (resource != null) {
- return resource;
- }
- resource = super.getResource(name);
- if (resource != null) {
- return resource;
- }
- if ("/lib/freeplaneviewer.jar".equals(name)) {
- final String rootDir = new File(getResourceBaseDir()).getAbsoluteFile().getParent();
- try {
- final File try1 = new File(rootDir + "/plugins/org.freeplane.core/lib/freeplaneviewer.jar");
- if (try1.exists()) {
- return try1.toURL();
- }
- final File try2 = new File(rootDir + "/lib/freeplaneviewer.jar");
- if (try2.exists()) {
- return try2.toURL();
- }
- }
- catch (final MalformedURLException e) {
- e.printStackTrace();
- }
- }
- return null;
- }
-
- @Override
- public String getResourceBaseDir() {
- return FreeplaneGUIStarter.getResourceBaseDir();
- }
-
- @Override
- public String getInstallationBaseDir() {
- return new File(getResourceBaseDir()).getAbsoluteFile().getParent();
- }
-
- public static File getUserPreferencesFile() {
- final String freeplaneDirectory = Compat.getFreeplaneUserDirectory();
- final File userPropertiesFolder = new File(freeplaneDirectory);
- final File autoPropertiesFile = new File(userPropertiesFolder, "auto.properties");
- return autoPropertiesFile;
- }
-
- @Override
- public void init() {
- lastOpened = new LastOpenedList();
- super.init();
- }
-
- private Properties readDefaultPreferences() {
- final Properties props = new Properties();
- readDefaultPreferences(props, ResourceController.FREEPLANE_PROPERTIES);
- if (Compat.isMacOsX()) {
- readDefaultPreferences(props, FREEPLANE_MAC_PROPERTIES);
- }
- final String propsLocs = props.getProperty("load_next_properties", "");
- readDefaultPreferences(props, propsLocs.split(";"));
- return props;
- }
-
- private void readDefaultPreferences(final Properties props, final String[] locArray) {
- for (final String loc : locArray) {
- readDefaultPreferences(props, loc);
- }
- }
-
- private void readDefaultPreferences(final Properties props, final String propsLoc) {
- final URL defaultPropsURL = getResource(propsLoc);
- loadProperties(props, defaultPropsURL);
- }
-
- private Properties readUsersPreferences(final Properties defaultPreferences) {
- final Properties auto = new Properties(defaultPreferences);
- InputStream in = null;
- try {
- final File autoPropertiesFile = getUserPreferencesFile();
- in = new FileInputStream(autoPropertiesFile);
- auto.load(in);
- }
- catch (final Exception ex) {
- System.err.println("User properties not found, new file created");
- }
- finally {
- FileUtils.silentlyClose(in);
- }
- return auto;
- }
-
- @Override
- public void saveProperties() {
- lastOpened.saveProperties();
- OutputStream out = null;
- try {
- out = new FileOutputStream(autoPropertiesFile);
- final OutputStreamWriter outputStreamWriter = new OutputStreamWriter(out, "8859_1");
- outputStreamWriter.write("#Freeplane ");
- outputStreamWriter.write(FreeplaneVersion.getVersion().toString());
- outputStreamWriter.write('\n');
- outputStreamWriter.flush();
- props.store(out, null);
- }
- catch (final Exception ex) {
- }
- finally {
- if (out != null) {
- try {
- out.close();
- }
- catch (final IOException e) {
- }
- }
- }
- FilterController.getCurrentFilterController().saveConditions();
- }
-
- /**
- * @param pProperties
- */
- private void setDefaultLocale(final Properties pProperties) {
- final String lang = pProperties.getProperty(ResourceBundles.RESOURCE_LANGUAGE);
- if (lang == null) {
- return;
- }
- Locale localeDef = null;
- switch (lang.length()) {
- case 2:
- localeDef = new Locale(lang);
- break;
- case 5:
- localeDef = new Locale(lang.substring(0, 1), lang.substring(3, 4));
- break;
- default:
- return;
- }
- Locale.setDefault(localeDef);
- }
-
- @Override
- public void setDefaultProperty(final String key, final String value) {
- defProps.setProperty(key, value);
- }
-
- @Override
- public void setProperty(final String key, final String value) {
- final String oldValue = getProperty(key);
- if (oldValue == value) {
- return;
- }
- if (oldValue != null && oldValue.equals(value)) {
- return;
- }
- props.setProperty(key, value);
- firePropertyChanged(key, value, oldValue);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/ApplicationViewController.java b/freeplane/src/org/freeplane/main/application/ApplicationViewController.java
deleted file mode 100644
index 16e5438..0000000
--- a/freeplane/src/org/freeplane/main/application/ApplicationViewController.java
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.EventQueue;
-import java.awt.Frame;
-import java.awt.LayoutManager;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.text.MessageFormat;
-
-import javax.swing.ImageIcon;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.JLayeredPane;
-import javax.swing.JSplitPane;
-import javax.swing.KeyStroke;
-import javax.swing.RootPaneContainer;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.FrameController;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.view.swing.map.MapView;
-
-class ApplicationViewController extends FrameController {
- private static final String SPLIT_PANE_LAST_LEFT_POSITION = "split_pane_last_left_position";
- private static final String SPLIT_PANE_LAST_POSITION = "split_pane_last_position";
- private static final String SPLIT_PANE_LAST_RIGHT_POSITION = "split_pane_last_right_position";
- private static final String SPLIT_PANE_LAST_TOP_POSITION = "split_pane_last_top_position";
- private static final String SPLIT_PANE_LEFT_POSITION = "split_pane_left_position";
- private static final String SPLIT_PANE_POSITION = "split_pane_position";
- private static final String SPLIT_PANE_RIGHT_POSITION = "split_pane_right_position";
- private static final String SPLIT_PANE_TOP_POSITION = "split_pane_top_position";
-// // final private Controller controller;
- final private JFrame frame;
- /** Contains the value where the Note Window should be displayed (right, left, top, bottom) */
- private String mLocationPreferenceValue;
- /** Contains the Note Window Component */
- private JComponent mMindMapComponent;
- final private JSplitPane mSplitPane;
- final private NavigationNextMapAction navigationNextMap;
- final private NavigationPreviousMapAction navigationPreviousMap;
- final private ResourceController resourceController;
- private JComponent mapPane;
- private MapViewDockingWindows mapViewWindows;
- @SuppressWarnings("serial")
- public ApplicationViewController( Controller controller, final IMapViewManager mapViewController,
- final JFrame frame) {
- super(controller, mapViewController, "");
-// this.controller = controller;
- navigationPreviousMap = new NavigationPreviousMapAction();
- controller.addAction(navigationPreviousMap);
- navigationNextMap = new NavigationNextMapAction();
- controller.addAction(navigationNextMap);
- resourceController = ResourceController.getResourceController();
- this.frame = frame;
- getContentPane().setLayout(new BorderLayout());
- // --- Set Note Window Location ---
- mLocationPreferenceValue = resourceController.getProperty("note_location", "bottom");
- // disable all hotkeys for JSplitPane
- mSplitPane = new JSplitPane(){
- @Override
- protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed){
- return false;
- }
- };
- setSplitPaneLayoutManager();
- final Component contentPane;
- mapViewWindows = new MapViewDockingWindows();
- contentPane = mapViewWindows.getMapPane();
- getContentPane().add(contentPane, BorderLayout.CENTER);
- mapPane = mapViewWindows.getMapPane();
- getContentPane().add(mSplitPane, BorderLayout.CENTER);
- mSplitPane.setLeftComponent(mapPane);
- mSplitPane.setRightComponent(null);
- initFrame(frame);
- }
-
- /**
- * Called from the Controller, when the Location of the Note Window is changed on the Menu->View->Note Window Location
- */
- @Override
- public void changeNoteWindowLocation() {
- mLocationPreferenceValue = resourceController.getProperty("note_location");
- if(mMindMapComponent != null){
- insertComponentIntoSplitPane(mMindMapComponent);
- }
- }
-
- public String getAdjustableProperty(final String label) {
- return resourceController.getProperty(label);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.FreeplaneMain#getContentPane()
- */
- @Override
- public RootPaneContainer getRootPaneContainer() {
- return frame;
- }
-
- @Override
- public FreeplaneMenuBar getFreeplaneMenuBar() {
- return (FreeplaneMenuBar) frame.getJMenuBar();
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.FreeplaneMain#getJFrame()
- */
- @Override
- public JFrame getJFrame() {
- return frame;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.FreeplaneMain#getLayeredPane()
- */
- public JLayeredPane getLayeredPane() {
- return frame.getLayeredPane();
- }
-
- @Override
- public void insertComponentIntoSplitPane(final JComponent pMindMapComponent) {
- // --- Save the Component --
- mMindMapComponent = pMindMapComponent;
- // --- Devider position variables --
- int splitPanePosition = -1;
- int lastSplitPanePosition = -1;
- mapPane.setVisible(true);
- mSplitPane.setLeftComponent(null);
- mSplitPane.setRightComponent(null);
- if ("right".equals(mLocationPreferenceValue)) {
- mSplitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
- mSplitPane.setLeftComponent(mapPane);
- mSplitPane.setRightComponent(pMindMapComponent);
- splitPanePosition = resourceController.getIntProperty(SPLIT_PANE_RIGHT_POSITION, -1);
- lastSplitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LAST_RIGHT_POSITION, -1);
- }
- else if ("left".equals(mLocationPreferenceValue)) {
- mSplitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT);
- mSplitPane.setLeftComponent(pMindMapComponent);
- mSplitPane.setRightComponent(mapPane);
- splitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LEFT_POSITION, -1);
- lastSplitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LAST_LEFT_POSITION, -1);
- }
- else if ("top".equals(mLocationPreferenceValue)) {
- mSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
- mSplitPane.setLeftComponent(pMindMapComponent);
- mSplitPane.setRightComponent(mapPane);
- splitPanePosition = resourceController.getIntProperty(SPLIT_PANE_TOP_POSITION, -1);
- lastSplitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LAST_TOP_POSITION, -1);
- }
- else if ("bottom".equals(mLocationPreferenceValue)) {
- mSplitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
- mSplitPane.setLeftComponent(mapPane);
- mSplitPane.setRightComponent(pMindMapComponent);
- splitPanePosition = resourceController.getIntProperty(SPLIT_PANE_POSITION, -1);
- lastSplitPanePosition = resourceController.getIntProperty(SPLIT_PANE_LAST_POSITION, -1);
- }
- mSplitPane.setContinuousLayout(true);
- mSplitPane.setOneTouchExpandable(false);
- setSplitPaneLayoutManager();
- /*
- * This means that the mind map area gets all the space that results
- * from resizing the window.
- */
- mSplitPane.setResizeWeight(1.0d);
- if (splitPanePosition != -1 && lastSplitPanePosition != -1) {
- mSplitPane.setDividerLocation(splitPanePosition);
- mSplitPane.setLastDividerLocation(lastSplitPanePosition);
- }
- else {
- mSplitPane.setDividerLocation(0.5);
- }
- }
-
- @Override
- public boolean isApplet() {
- return false;
- }
-
- @Override
- public void openDocument(final URI uri) throws IOException {
- String uriString = uri.toString();
- final String UNC_PREFIX = "file:////";
- if (uriString.startsWith(UNC_PREFIX)) {
- uriString = "file://" + uriString.substring(UNC_PREFIX.length());
- }
- final String osName = System.getProperty("os.name");
- if (osName.substring(0, 3).equals("Win")) {
- String propertyString = "default_browser_command_windows";
- if (osName.indexOf("9") != -1 || osName.indexOf("Me") != -1) {
- propertyString += "_9x";
- }
- else {
- propertyString += "_nt";
- }
- String[] command = null;
- try {
- final Object[] messageArguments = { uriString };
- final MessageFormat formatter = new MessageFormat(ResourceController.getResourceController()
- .getProperty(propertyString));
- final String browserCommand = formatter.format(messageArguments);
- final String scheme = uri.getScheme();
- if (scheme.equals("file") || scheme.equals("smb")) {
- if(scheme.equals("smb")){
- uriString = Compat.smbUri2unc(uri);
- }
- if (System.getProperty("os.name").startsWith("Windows 2000"))
- command = new String[] { "rundll32", "shell32.dll,ShellExec_RunDLL", uriString };
- else
- command = new String[] { "rundll32", "url.dll,FileProtocolHandler", uriString };
- }
- else if (uriString.startsWith("mailto:")) {
- command = new String[] { "rundll32", "url.dll,FileProtocolHandler", uriString };
- }
- else {
- Controller.exec(browserCommand);
- return;
- }
- Controller.exec(command);
- }
- catch (final IOException x) {
- UITools
- .errorMessage("Could not invoke browser.\n\nFreeplane excecuted the following statement on a command line:\n\""
- + command
- + "\".\n\nYou may look at the user or default property called '"
- + propertyString
- + "'.");
- System.err.println("Caught: " + x);
- }
- }
- else if (osName.startsWith("Mac OS")) {
- String browserCommand = null;
- try {
- final Object[] messageArguments = { uriString, uriString };
- final MessageFormat formatter = new MessageFormat(ResourceController.getResourceController()
- .getProperty("default_browser_command_mac"));
- browserCommand = formatter.format(messageArguments);
- Controller.exec(browserCommand);
- }
- catch (final IOException ex2) {
- UITools
- .errorMessage("Could not invoke browser.\n\nFreeplane excecuted the following statement on a command line:\n\""
- + browserCommand
- + "\".\n\nYou may look at the user or default property called 'default_browser_command_mac'.");
- System.err.println("Caught: " + ex2);
- }
- }
- else {
- String browserCommand = null;
- try {
- final Object[] messageArguments = { uriString, uriString };
- final MessageFormat formatter = new MessageFormat(ResourceController.getResourceController()
- .getProperty("default_browser_command_other_os"));
- browserCommand = formatter.format(messageArguments);
- Controller.exec(browserCommand);
- }
- catch (final IOException ex2) {
- UITools
- .errorMessage("Could not invoke browser.\n\nFreeplane excecuted the following statement on a command line:\n\""
- + browserCommand
- + "\".\n\nYou may look at the user or default property called 'default_browser_command_other_os'.");
- System.err.println("Caught: " + ex2);
- }
- }
- }
-
- /**
- * Open url in WWW browser. This method hides some differences between
- * operating systems.
- */
- @Override
- public void openDocument(final URL url) throws Exception {
- URI uri = null;
- try {
- uri = url.toURI();
- }
- catch (URISyntaxException e) {
- uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), url.getRef());
- }
- openDocument(uri);
- }
-
- @Override
- public boolean quit() {
- if (!super.quit()) {
- return false;
- }
- frame.dispose();
- return true;
- }
-
- @Override
- public void removeSplitPane() {
- saveSplitPanePosition();
- mMindMapComponent = null;
- mSplitPane.setLeftComponent(null);
- mSplitPane.setRightComponent(null);
- mSplitPane.setLeftComponent(mapPane);
- setSplitPaneLayoutManager();
- final Controller controller = Controller.getCurrentModeController().getController();
- final IMapSelection selection = controller.getSelection();
- if(selection == null){
- return;
- }
- final NodeModel node = selection.getSelected();
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- final Component component = controller.getMapViewManager().getComponent(node);
- if (component != null) {
- component.requestFocus();
- }
- }
- });
- }
-
- private void setSplitPaneLayoutManager() {
- final LayoutManager layout = mSplitPane.getLayout();
- if(layout instanceof SplitPaneLayoutManagerDecorator){
- return;
- }
- mSplitPane.setLayout(new SplitPaneLayoutManagerDecorator(layout));
- }
-
- @Override
- public void saveProperties() {
- saveSplitPanePosition();
- if (!isFullScreenEnabled()) {
- final int winState = frame.getExtendedState() & ~Frame.ICONIFIED;
- if (JFrame.MAXIMIZED_BOTH != (winState & JFrame.MAXIMIZED_BOTH)) {
- resourceController.setProperty("appwindow_x", String.valueOf(frame.getX()));
- resourceController.setProperty("appwindow_y", String.valueOf(frame.getY()));
- resourceController.setProperty("appwindow_width", String.valueOf(frame.getWidth()));
- resourceController.setProperty("appwindow_height", String.valueOf(frame.getHeight()));
- }
- resourceController.setProperty("appwindow_state", String.valueOf(winState));
- }
- mapViewWindows.saveLayout();
- }
-
- private void saveSplitPanePosition() {
- if (mSplitPane == null) {
- return;
- }
- if ("right".equals(mLocationPreferenceValue)) {
- resourceController.setProperty(SPLIT_PANE_RIGHT_POSITION, "" + mSplitPane.getDividerLocation());
- resourceController.setProperty(SPLIT_PANE_LAST_RIGHT_POSITION, "" + mSplitPane.getLastDividerLocation());
- }
- else if ("left".equals(mLocationPreferenceValue)) {
- resourceController.setProperty(SPLIT_PANE_LEFT_POSITION, "" + mSplitPane.getDividerLocation());
- resourceController.setProperty(SPLIT_PANE_LAST_LEFT_POSITION, "" + mSplitPane.getLastDividerLocation());
- }
- else if ("top".equals(mLocationPreferenceValue)) {
- resourceController.setProperty(SPLIT_PANE_TOP_POSITION, "" + mSplitPane.getDividerLocation());
- resourceController.setProperty(SPLIT_PANE_LAST_TOP_POSITION, "" + mSplitPane.getLastDividerLocation());
- }
- else { // "bottom".equals(mLocationPreferenceValue) also covered
- resourceController.setProperty(SPLIT_PANE_POSITION, "" + mSplitPane.getDividerLocation());
- resourceController.setProperty(SPLIT_PANE_LAST_POSITION, "" + mSplitPane.getLastDividerLocation());
- }
- }
-
- @Override
- protected void setFreeplaneMenuBar(final FreeplaneMenuBar menuBar) {
- frame.setJMenuBar(menuBar);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.FreeplaneMain#setTitle(java.lang.String)
- */
- @Override
- public void setTitle(final String frameTitle) {
- frame.setTitle(frameTitle);
- mapViewWindows.setTitle();
- }
-
- @Override
- public void setWaitingCursor(final boolean waiting) {
- if (waiting) {
- frame.getRootPane().getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- frame.getRootPane().getGlassPane().setVisible(true);
- }
- else {
- frame.getRootPane().getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
- frame.getRootPane().getGlassPane().setVisible(false);
- }
- }
-
- @Override
- public void viewNumberChanged(final int number) {
- navigationPreviousMap.setEnabled(number > 1);
- navigationNextMap.setEnabled(number > 1);
- }
-
- public void initFrame(final JFrame frame) {
- // Preserve the existing icon image under Mac OS X
- if (!Compat.isMacOsX()) {
- final ImageIcon mWindowIcon;
- if (Compat.isLowerJdk(Compat.VERSION_1_6_0)) {
- mWindowIcon = new ImageIcon(ResourceController.getResourceController().getResource(
- "/images/Freeplane_frame_icon.png"));
- }
- else {
- mWindowIcon = new ImageIcon(ResourceController.getResourceController().getResource(
- "/images/Freeplane_frame_icon_64x64.png"));
- }
- frame.setIconImage(mWindowIcon.getImage());
- }
- frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
- frame.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(final WindowEvent e) {
- Controller.getCurrentController().quit(new ActionEvent(this, 0, "quit"));
- }
- /*
- * fc, 14.3.2008: Completely removed, as it damaged the focus if for
- * example the note window was active.
- */
- });
- frame.setFocusTraversalKeysEnabled(false);
- final int win_width = ResourceController.getResourceController().getIntProperty("appwindow_width", -1);
- final int win_height = ResourceController.getResourceController().getIntProperty("appwindow_height", -1);
- final int win_x = ResourceController.getResourceController().getIntProperty("appwindow_x", -1);
- final int win_y = ResourceController.getResourceController().getIntProperty("appwindow_y", -1);
- UITools.setBounds(frame, win_x, win_y, win_width, win_height);
- setFrameSize(frame.getBounds());
- int win_state = Integer
- .parseInt(ResourceController.getResourceController().getProperty("appwindow_state", "0"));
- win_state = ((win_state & Frame.ICONIFIED) != 0) ? Frame.NORMAL : win_state;
- frame.setExtendedState(win_state);
- }
-
- public void openMapsOnStart() {
- mapViewWindows.loadLayout();
- }
-
- public void focusTo(MapView currentMapView) {
- mapViewWindows.focusMapViewLater(currentMapView);
-
- }
-
-}
diff --git a/freeplane/src/org/freeplane/main/application/CommandLineParser.java b/freeplane/src/org/freeplane/main/application/CommandLineParser.java
deleted file mode 100644
index 389f537..0000000
--- a/freeplane/src/org/freeplane/main/application/CommandLineParser.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package org.freeplane.main.application;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.freeplane.core.util.Compat;
-
-class CommandLineParser {
- static final String QUIT_MENU_ITEM_KEY = "MB_QuitAction";
-
- public static class Options {
- private static final String HELP_MESSAGE = "Use:\n\tfreeplane [options] [file1 [file2 ...]]" //
- + "\n -X<menukey>: execute menu item with key <menukey>. Use devtools add-on to find the menu keys" //
- + "\n -S: stop after executing menu items" //
- + "\n -N: set the 'nonInteractive' system property to 'true'" //
- + "\n -U<userdir>: set the freeplane user config directory (default: "
- + Compat.getFreeplaneUserDirectory() + ")" //
- + "\n -h|--help: print this help";
- private List<String> filesToOpen = new ArrayList<String>();
- private List<String> menuItemsToExecute = new ArrayList<String>();
- private boolean stopAfterLaunch;
- private boolean nonInteractive;
- private boolean helpRequested = false;
-
- public void setFilesToOpen(final String[] filesToOpen) {
- this.filesToOpen = Arrays.asList(filesToOpen);
- }
-
- public void setMenuItemsToExecute(final String[] menuItemsToExecute) {
- this.menuItemsToExecute = Arrays.asList(menuItemsToExecute);
- }
-
- public boolean isStopAfterLaunch() {
- return stopAfterLaunch;
- }
-
- public void setStopAfterLaunch(boolean stopAfterLaunch) {
- this.stopAfterLaunch = stopAfterLaunch;
- }
-
- public List<String> getFilesToOpen() {
- return filesToOpen;
- }
-
- public String[] getFilesToOpenAsArray() {
- return filesToOpen.toArray(new String[filesToOpen.size()]);
- }
-
- public List<String> getMenuItemsToExecute() {
- return menuItemsToExecute;
- }
-
- public String[] getMenuItemsToExecuteAsArray() {
- return menuItemsToExecute.toArray(new String[menuItemsToExecute.size()]);
- }
-
- public boolean hasMenuItemsToExecute() {
- return !menuItemsToExecute.isEmpty();
- }
-
- public void addFilesToOpen(String file) {
- filesToOpen.add(file);
- }
-
- public void addMenuItemToExecute(String item) {
- menuItemsToExecute.add(item);
- }
-
- /** leads to setting of system property 'nonInteractive' - check via
- * <pre>
- * boolean nonInteractive = Boolean.parseBoolean(System.getProperty("nonInteractive"));
- * </pre>
- */
- public void setNonInteractive(boolean b) {
- nonInteractive = b;
- }
-
- public boolean isNonInteractive() {
- return nonInteractive;
- }
-
- public boolean isHelpRequested() {
- return helpRequested;
- }
-
- public void setHelpRequested(boolean helpRequested) {
- this.helpRequested = helpRequested;
- }
-
- @Override
- public String toString() {
- return "Options(files: " + filesToOpen + ", menuItems: " + menuItemsToExecute + ", stopAfterLaunch: "
- + stopAfterLaunch + ", nonInteractive: " + nonInteractive + ")";
- }
-
- public String getHelpMessage() {
- return HELP_MESSAGE;
- }
- }
-
- public static CommandLineParser.Options parse(String[] args) {
-for(String arg:args) System.out.println(arg);
- CommandLineParser.Options result = new CommandLineParser.Options();
- if (args == null || args.length == 0 || !args[0].startsWith("-")) {
- result.setFilesToOpen(args);
- return result;
- }
- int i = 0;
- String[] mutableArgs = new String[args.length];
- System.arraycopy(args, 0, mutableArgs, 0, args.length);
- args = mutableArgs;
- for (; i != args.length; ++i) {
- String arg = args[i];
- if (arg.startsWith("-S")) {
- result.setStopAfterLaunch(true);
- // -SX mymenuitem is allowed
- if (arg.length() > 2) {
- args[i] = "-" + arg.substring(2);
- --i;
- }
- }
- else if (arg.startsWith("-N")) {
- result.setNonInteractive(true);
- // -NX mymenuitem is allowed
- if (arg.length() > 2) {
- args[i] = "-" + arg.substring(2);
- --i;
- }
- }
- else if (arg.startsWith("-X")) {
- if (arg.length() > 2)
- result.addMenuItemToExecute(arg.substring(2));
- else if (args.length >= i)
- result.addMenuItemToExecute(args[++i]);
- }
- else if (arg.startsWith("-U")) {
- String userdir = null;
- if (arg.length() > 2)
- userdir = arg.substring(2);
- else if (args.length >= i)
- userdir = args[++i];
- else
- System.err.println("option -U<userdir> misses its parameter");
- if (userdir != null)
- System.setProperty("org.freeplane.userfpdir", userdir);
- }
- else if (arg.startsWith("-h")) {
- result.setHelpRequested(true);
- // -hX mymenuitem is allowed
- if (arg.length() > 2) {
- args[i] = "-" + arg.substring(2);
- --i;
- }
- }
- else if (arg.equals("--help")) {
- result.setHelpRequested(true);
- }
- else {
- break;
- }
- }
- for (; i != args.length; ++i)
- result.addFilesToOpen(args[i]);
- if (result.stopAfterLaunch && !result.menuItemsToExecute.contains(QUIT_MENU_ITEM_KEY))
- result.addMenuItemToExecute(QUIT_MENU_ITEM_KEY);
- if (result.isHelpRequested()) {
- System.out.println(result.getHelpMessage());
- }
- return result;
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/ConnectedToMenuView.java b/freeplane/src/org/freeplane/main/application/ConnectedToMenuView.java
deleted file mode 100644
index 51af1ea..0000000
--- a/freeplane/src/org/freeplane/main/application/ConnectedToMenuView.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import static java.awt.event.KeyEvent.VK_ALT;
-import static java.awt.event.KeyEvent.VK_CONTROL;
-import static java.awt.event.KeyEvent.VK_META;
-import static java.awt.event.KeyEvent.VK_SHIFT;
-import static java.awt.event.KeyEvent.VK_WINDOWS;
-
-import java.awt.Component;
-import java.awt.event.KeyEvent;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.swing.Icon;
-import javax.swing.JComponent;
-import javax.swing.KeyStroke;
-
-import net.infonode.docking.View;
-
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- * 27.04.2013
- */
-final class ConnectedToMenuView extends View {
- ConnectedToMenuView(String title, Icon icon, Component component) {
- super(title, icon, component);
- }
-
- /*
- * (non-Javadoc)
- * @see javax.swing.JComponent#processKeyBinding(javax.swing.KeyStroke,
- * java.awt.event.KeyEvent, int, boolean)
- */
- @Override
- protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
- if (super.processKeyBinding(ks, e, condition, pressed)) {
- return true;
- }
- if(containsModifierKeyCode(ks))
- return false;
- final FreeplaneMenuBar freeplaneMenuBar = Controller.getCurrentController().getViewController()
- .getFreeplaneMenuBar();
- return freeplaneMenuBar.processKeyBinding(ks, e, JComponent.WHEN_IN_FOCUSED_WINDOW, pressed);
- }
-
- private static final List<Integer> modifierKeyCodes = Arrays.asList(VK_CONTROL, VK_ALT, VK_SHIFT, VK_META, VK_WINDOWS);
- private boolean containsModifierKeyCode(final KeyStroke ks) {
- return modifierKeyCodes.contains(ks.getKeyCode());
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/main/application/FreeplaneGUIStarter.java b/freeplane/src/org/freeplane/main/application/FreeplaneGUIStarter.java
deleted file mode 100644
index cdf46a4..0000000
--- a/freeplane/src/org/freeplane/main/application/FreeplaneGUIStarter.java
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.Container;
-import java.awt.EventQueue;
-import java.awt.Frame;
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Locale;
-import java.util.Set;
-
-import javax.swing.JFrame;
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.ShowSelectionAsRectangleAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.ConfigurationUtils;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.MenuUtils;
-import org.freeplane.features.attribute.ModelessAttributeController;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.filter.NextNodeAction;
-import org.freeplane.features.filter.NextPresentationItemAction;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.ScannerController;
-import org.freeplane.features.help.HelpController;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapController.Direction;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.QuitAction;
-import org.freeplane.features.mode.browsemode.BModeController;
-import org.freeplane.features.mode.filemode.FModeController;
-import org.freeplane.features.mode.mindmapmode.LoadAcceleratorPresetsAction;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.print.PrintController;
-import org.freeplane.features.styles.LogicalStyleFilterController;
-import org.freeplane.features.styles.MapViewLayout;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.time.TimeController;
-import org.freeplane.features.ui.FrameController;
-import org.freeplane.features.url.FreeplaneUriConverter;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-import org.freeplane.main.addons.AddOnsController;
-import org.freeplane.main.application.CommandLineParser.Options;
-import org.freeplane.main.browsemode.BModeControllerFactory;
-import org.freeplane.main.filemode.FModeControllerFactory;
-import org.freeplane.main.mindmapmode.MModeControllerFactory;
-import org.freeplane.view.swing.features.nodehistory.NodeHistory;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.ViewLayoutTypeAction;
-import org.freeplane.view.swing.map.mindmapmode.MMapViewController;
-
-public class FreeplaneGUIStarter implements FreeplaneStarter {
-
- static{
- Compat.fixMousePointerForLinux();
- }
-
- public static String getResourceBaseDir() {
- return System.getProperty(FreeplaneStarter.ORG_FREEPLANE_GLOBALRESOURCEDIR,
- FreeplaneStarter.DEFAULT_ORG_FREEPLANE_GLOBALRESOURCEDIR);
- }
-
- public static void showSysInfo() {
- final StringBuilder info = new StringBuilder();
- info.append("freeplane_version = ");
- info.append(FreeplaneVersion.getVersion());
- String revision = FreeplaneVersion.getVersion().getRevision();
-
- info.append("; freeplane_xml_version = ");
- info.append(FreeplaneVersion.XML_VERSION);
- if(! revision.equals("")){
- info.append("\ngit revision = ");
- info.append(revision);
- }
- info.append("\njava_version = ");
- info.append(System.getProperty("java.version"));
- info.append("; os_name = ");
- info.append(System.getProperty("os.name"));
- info.append("; os_version = ");
- info.append(System.getProperty("os.version"));
- LogUtils.info(info.toString());
- }
-
- private final ApplicationResourceController applicationResourceController;
-// // private Controller controller;
- private FreeplaneSplashModern splash = null;
- private boolean startupFinished = false;
- private ApplicationViewController viewController;
- /** allows to disable loadLastMap(s) if there already is a second instance running. */
- private boolean dontLoadLastMaps;
- final private boolean firstRun;
- private static final String LOAD_LAST_MAPS = "load_last_maps";
- private static final String LOAD_LAST_MAP = "load_last_map";
- public FreeplaneGUIStarter() {
- super();
- final File userPreferencesFile = ApplicationResourceController.getUserPreferencesFile();
- firstRun = !userPreferencesFile.exists();
- new UserPropertiesUpdater().importOldProperties();
- applicationResourceController = new ApplicationResourceController();
- }
-
- public void setDontLoadLastMaps() {
- dontLoadLastMaps = true;
- }
-
- public Controller createController() {
- try {
- Controller controller = new Controller(applicationResourceController);
- Controller.setCurrentController(controller);
- Compat.macAppChanges();
- controller.addAction(new QuitAction());
- applicationResourceController.init();
- LogUtils.createLogger();
- FreeplaneGUIStarter.showSysInfo();
- final String lookandfeel = System.getProperty("lookandfeel", applicationResourceController
- .getProperty("lookandfeel"));
- FrameController.setLookAndFeel(lookandfeel);
- final JFrame frame = new JFrame("Freeplane");
- frame.setName(UITools.MAIN_FREEPLANE_FRAME);
- splash = new FreeplaneSplashModern(frame);
- if (!System.getProperty("org.freeplane.nosplash", "false").equals("true")) {
- splash.setVisible(true);
- }
- final MMapViewController mapViewController = new MMapViewController(controller);
- viewController = new ApplicationViewController(controller, mapViewController, frame);
- System.setSecurityManager(new FreeplaneSecurityManager());
- mapViewController.addMapViewChangeListener(applicationResourceController.getLastOpenedList());
- FilterController.install();
- PrintController.install();
- FormatController.install(new FormatController());
- final ScannerController scannerController = new ScannerController();
- ScannerController.install(scannerController);
- scannerController.addParsersForStandardFormats();
- ModelessAttributeController.install();
- TextController.install();
- TimeController.install();
- LinkController.install();
- IconController.install();
- HelpController.install();
- controller.addAction(new UpdateCheckAction());
- controller.addAction(new NextNodeAction(Direction.FORWARD));
- controller.addAction(new NextNodeAction(Direction.BACK));
- controller.addAction(new NextNodeAction(Direction.FORWARD_N_FOLD));
- controller.addAction(new NextNodeAction(Direction.BACK_N_FOLD));
- controller.addAction(new NextPresentationItemAction());
- controller.addAction(new ShowSelectionAsRectangleAction());
- controller.addAction(new ViewLayoutTypeAction(MapViewLayout.OUTLINE));
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(7,
- new LogicalStyleFilterController());
- MapController.install();
-
- NodeHistory.install(controller);
- return controller;
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- throw new RuntimeException(e);
- }
- }
-
- public void createModeControllers(final Controller controller) {
- MModeControllerFactory.createModeController();
- final ModeController mindMapModeController = controller.getModeController(MModeController.MODENAME);
- mindMapModeController.getMapController().addMapChangeListener(applicationResourceController.getLastOpenedList());
- mindMapModeController.addMenuContributor(FilterController.getController(controller).getMenuContributor());
- BModeControllerFactory.createModeController();
- FModeControllerFactory.createModeController();
- }
-
- public void buildMenus(final Controller controller, final Set<String> plugins) {
- buildMenus(controller, plugins, MModeController.MODENAME, "/xml/mindmapmodemenu.xml");
- LoadAcceleratorPresetsAction.install();
- buildMenus(controller, plugins, BModeController.MODENAME, "/xml/browsemodemenu.xml");
- buildMenus(controller, plugins, FModeController.MODENAME, "/xml/filemodemenu.xml");
- }
-
- private void buildMenus(final Controller controller, final Set<String> plugins, String mode, String xml) {
- ModeController modeController = controller.getModeController(mode);
- controller.selectModeForBuild(modeController);
- modeController.updateMenus(xml, plugins);
- controller.selectModeForBuild(null);
- }
-
- public void createFrame(final String[] args) {
- Controller controller = Controller.getCurrentController();
- ModeController modeController = controller.getModeController(MModeController.MODENAME);
- controller.selectModeForBuild(modeController);
- Compat.macMenuChanges();
- new UserPropertiesUpdater().importOldDefaultStyle();
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- final Options options = CommandLineParser.parse(args);
- viewController.init(Controller.getCurrentController());
- final Frame frame = viewController.getFrame();
- final int extendedState = frame.getExtendedState();
- Container contentPane = viewController.getContentPane();
- contentPane.setVisible(false);
- splash.dispose();
- splash = null;
- frame.setVisible(true);
- if (extendedState != frame.getExtendedState()) {
- frame.setExtendedState(extendedState);
- }
- loadMaps(options.getFilesToOpenAsArray());
- focusCurrentView();
- viewController.getContentPane().setVisible(true);
- frame.toFront();
- startupFinished = true;
- System.setProperty("nonInteractive", Boolean.toString(options.isNonInteractive()));
- try {
- Thread.sleep(1000);
- }
- catch (InterruptedException e) {
- e.printStackTrace();
- }
- MenuUtils.executeMenuItems(options.getMenuItemsToExecute());
- }
-
- private void focusCurrentView() {
- final MapView currentMapView = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
- if(currentMapView != null){
- viewController.focusTo(currentMapView);
- }
- }
- });
- }
-
- private void loadMaps( final String[] args) {
- final Controller controller = Controller.getCurrentController();
- final boolean alwaysLoadLastMaps = ResourceController.getResourceController().getBooleanProperty(
- "always_load_last_maps");
-
- if (alwaysLoadLastMaps && !dontLoadLastMaps) {
- loadLastMaps();
- }
- loadMaps(controller, args);
- if(controller.getMap() != null) {
- return;
- }
- if (!alwaysLoadLastMaps && !dontLoadLastMaps) {
- final AddOnsController addonsController = AddOnsController.getController();
- addonsController.setAutoInstallEnabled(false);
- loadLastMaps();
- addonsController.setAutoInstallEnabled(true);
- }
- if(firstRun && ! dontLoadLastMaps){
- final File baseDir = new File(FreeplaneGUIStarter.getResourceBaseDir()).getAbsoluteFile().getParentFile();
- final String map = ResourceController.getResourceController().getProperty("first_start_map");
- final File absolutFile = ConfigurationUtils.getLocalizedFile(new File[]{baseDir}, map, Locale.getDefault().getLanguage());
- if(absolutFile != null)
- loadMaps(controller, new String[]{absolutFile.getAbsolutePath()});
- }
- if (null != controller.getMap()) {
- return;
- }
- controller.selectMode(MModeController.MODENAME);
- final MModeController modeController = (MModeController) controller.getModeController();
- MFileManager.getController(modeController).newMapFromDefaultTemplate();
- }
-
- private void loadLastMaps() {
- final boolean loadLastMap = ResourceController.getResourceController().getBooleanProperty(LOAD_LAST_MAP);
- final boolean loadLastMaps = ResourceController.getResourceController().getBooleanProperty(LOAD_LAST_MAPS);
- if(loadLastMaps)
- viewController.openMapsOnStart();
- if(loadLastMaps || loadLastMap)
- applicationResourceController.getLastOpenedList().openLastMapOnStart();
- }
-
- public void loadMapsLater(final String[] args){
- EventQueue.invokeLater(new Runnable() {
-
- public void run() {
- if(startupFinished && EventQueue.isDispatchThread()){
- loadMaps(Controller.getCurrentController(), args);
- toFront();
- return;
- }
- EventQueue.invokeLater(this);
- }
- });
- }
-
- private void toFront() {
- final Frame frame = UITools.getFrame();
- if(frame == null)
- return;
- final int state = frame.getExtendedState();
- if ((state & Frame.ICONIFIED) != 0)
- frame.setExtendedState(state & ~Frame.ICONIFIED);
- if (!frame.isVisible())
- frame.setVisible(true);
- frame.toFront();
- frame.requestFocus();
- }
-
-
- private void loadMaps(final Controller controller, final String[] args) {
- controller.selectMode(MModeController.MODENAME);
- for (int i = 0; i < args.length; i++) {
- String fileArgument = args[i];
- try {
- final URL url;
- if(fileArgument.startsWith("http://")) {
- LinkController.getController().loadURI(new URI(fileArgument));
- }
- else if (fileArgument.startsWith(UrlManager.FREEPLANE_SCHEME + ':')) {
- String fixedUri = new FreeplaneUriConverter().fixPartiallyDecodedFreeplaneUriComingFromInternetExplorer(fileArgument);
- LinkController.getController().loadURI(new URI(fixedUri));
- }
- else {
- if (!FileUtils.isAbsolutePath(fileArgument)) {
- fileArgument = System.getProperty("user.dir") + System.getProperty("file.separator") + fileArgument;
- }
- url = Compat.fileToUrl(new File(fileArgument));
- if (url.getPath().toLowerCase().endsWith(
- org.freeplane.features.url.UrlManager.FREEPLANE_FILE_EXTENSION)) {
- final MModeController modeController = (MModeController) controller.getModeController();
- MapController mapController = modeController.getMapController();
- mapController.openMapSelectReferencedNode(url);
- }
- }
- }
- catch (final Exception ex) {
- System.err.println("File " + fileArgument + " not loaded");
- }
- }
- }
-
- /**
- */
- public void run(final String[] args) {
- try {
- if (null == System.getProperty("org.freeplane.core.dir.lib", null)) {
- System.setProperty("org.freeplane.core.dir.lib", "/lib/");
- }
- final Controller controller = createController();
- createModeControllers(controller);
- FilterController.getController(controller).loadDefaultConditions();
- final Set<String> emptySet = Collections.emptySet();
- buildMenus(controller, emptySet);
- createFrame(args);
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- JOptionPane.showMessageDialog(UITools.getFrame(), "freeplane.main.Freeplane can't be started",
- "Startup problem", JOptionPane.ERROR_MESSAGE);
- System.exit(1);
- }
- }
-
- public void stop() {
- try {
- if (EventQueue.isDispatchThread()) {
- Controller.getCurrentController().shutdown();
- return;
- }
- EventQueue.invokeAndWait(new Runnable() {
- public void run() {
- Controller.getCurrentController().shutdown();
- }
- });
- }
- catch (final InterruptedException e) {
- LogUtils.severe(e);
- }
- catch (final InvocationTargetException e) {
- LogUtils.severe(e);
- }
- }
-
- public ResourceController getResourceController() {
- return applicationResourceController;
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/FreeplaneMain.java b/freeplane/src/org/freeplane/main/application/FreeplaneMain.java
deleted file mode 100644
index 5b09a96..0000000
--- a/freeplane/src/org/freeplane/main/application/FreeplaneMain.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import javax.swing.JOptionPane;
-
-public class FreeplaneMain {
- public static void checkJavaVersion() {
- final String JAVA_VERSION = System.getProperty("java.version");
- final String VERSION_1_5_0 = "1.5.0";
- if (JAVA_VERSION.compareTo(VERSION_1_5_0) < 0) {
- final String message = "Warning: Freeplane requires version Java 1.5.0 or higher. The running version: "
- + JAVA_VERSION + " is installed in " + System.getProperty("java.home") + ".";
- System.err.println(message);
- JOptionPane.showMessageDialog(null, message, "error", JOptionPane.ERROR_MESSAGE);
- System.exit(1);
- }
- final String osProperty = System.getProperty("os.name");
- if (osProperty.startsWith("Mac OS")) {
- System.setProperty("apple.laf.useScreenMenuBar", "true");
- }
- }
-
- static public void main(final String[] args) {
- FreeplaneMain.checkJavaVersion();
- final String oldHandler = System.getProperty("java.protocol.handler.pkgs");
- String newHandler = "org.freeplane.main.application.protocols";
- if(oldHandler != null)
- newHandler = oldHandler + '|' + newHandler;
- System.setProperty("java.protocol.handler.pkgs", newHandler);
- final FreeplaneStarter starter = new FreeplaneGUIStarter();
- starter.run(args);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/FreeplaneSecurityManager.java b/freeplane/src/org/freeplane/main/application/FreeplaneSecurityManager.java
deleted file mode 100644
index cc2db1f..0000000
--- a/freeplane/src/org/freeplane/main/application/FreeplaneSecurityManager.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.io.FileDescriptor;
-import java.net.InetAddress;
-import java.security.Permission;
-
-/**
- * By default, everything is allowed. But you can install a different security
- * controller once, until you install it again. Thus, the code executed in
- * between is securely controlled by that different security manager. Moreover,
- * only by double registering the manager is removed. So, no malicious code can
- * remove the active security manager.
- *
- * @author foltin
- */
-public final class FreeplaneSecurityManager extends SecurityManager {
- private SecurityManager finalSecurityManager = null;
-
- public FreeplaneSecurityManager() {
- }
-
- @Override
- public void checkAccept(final String pHost, final int pPort) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkAccept(pHost, pPort);
- }
-
- @Override
- public void checkAccess(final Thread pT) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkAccess(pT);
- }
-
- @Override
- public void checkAccess(final ThreadGroup pG) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkAccess(pG);
- }
-
- @Override
- public void checkAwtEventQueueAccess() {
- if (finalSecurityManager != null)
- finalSecurityManager.checkAwtEventQueueAccess();
- }
-
- @Override
- public void checkConnect(final String pHost, final int pPort) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkConnect(pHost, pPort);
- }
-
- @Override
- public void checkConnect(final String pHost, final int pPort, final Object pContext) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkConnect(pHost, pPort, pContext);
- }
-
- @Override
- public void checkCreateClassLoader() {
- if (finalSecurityManager != null)
- finalSecurityManager.checkCreateClassLoader();
- }
-
- @Override
- public void checkDelete(final String pFile) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkDelete(pFile);
- }
-
- @Override
- public void checkExec(final String pCmd) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkExec(pCmd);
- }
-
- @Override
- public void checkExit(final int pStatus) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkExit(pStatus);
- }
-
- @Override
- public void checkLink(final String pLib) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkLink(pLib);
- }
-
- @Override
- public void checkListen(final int pPort) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkListen(pPort);
- }
-
- @Override
- public void checkMemberAccess(final Class<?> clazz, final int which) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkMemberAccess(clazz, which);
- }
-
- @Override
- public void checkMulticast(final InetAddress pMaddr) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkMulticast(pMaddr);
- }
-
- @SuppressWarnings("deprecation")
- // we have to override it in case it's used by anyone
- @Override
- public void checkMulticast(final InetAddress pMaddr, final byte pTtl) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkMulticast(pMaddr, pTtl);
- }
-
- @Override
- public void checkPackageAccess(final String pPkg) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkPackageAccess(pPkg);
- }
-
- @Override
- public void checkPackageDefinition(final String pPkg) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkPackageDefinition(pPkg);
- }
-
- @Override
- public void checkPermission(final Permission pPerm) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkPermission(pPerm);
- }
-
- @Override
- public void checkPermission(final Permission pPerm, final Object pContext) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkPermission(pPerm, pContext);
- }
-
- @Override
- public void checkPrintJobAccess() {
- if (finalSecurityManager != null)
- finalSecurityManager.checkPrintJobAccess();
- }
-
- @Override
- public void checkPropertiesAccess() {
- if (finalSecurityManager != null)
- finalSecurityManager.checkPropertiesAccess();
- }
-
- @Override
- public void checkPropertyAccess(final String pKey) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkPropertyAccess(pKey);
- }
-
- @Override
- public void checkRead(final FileDescriptor pFd) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkRead(pFd);
- }
-
- @Override
- public void checkRead(final String pFile) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkRead(pFile);
- }
-
- @Override
- public void checkRead(final String pFile, final Object pContext) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkRead(pFile, pContext);
- }
-
- @Override
- public void checkSecurityAccess(final String pTarget) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkSecurityAccess(pTarget);
- }
-
- @Override
- public void checkSetFactory() {
- if (finalSecurityManager != null)
- finalSecurityManager.checkSetFactory();
- }
-
- @Override
- public void checkSystemClipboardAccess() {
- if (finalSecurityManager != null)
- finalSecurityManager.checkSystemClipboardAccess();
- }
-
- @Override
- public boolean checkTopLevelWindow(final Object pWindow) {
- if (finalSecurityManager == null) {
- return true;
- }
- return finalSecurityManager.checkTopLevelWindow(pWindow);
- }
-
- @Override
- public void checkWrite(final FileDescriptor pFd) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkWrite(pFd);
- }
-
- @Override
- public void checkWrite(final String pFile) {
- if (finalSecurityManager != null)
- finalSecurityManager.checkWrite(pFile);
- }
-
- @Override
- public Object getSecurityContext() {
- if (finalSecurityManager == null) {
- return super.getSecurityContext();
- }
- return finalSecurityManager.getSecurityContext();
- }
-
- public void setFinalSecurityManager(final SecurityManager finalSecurityManager) {
- if (hasFinalSecurityManager()) {
- throw new SecurityException("There is a SecurityManager installed already.");
- }
- this.finalSecurityManager = finalSecurityManager;
- }
-
- public boolean hasFinalSecurityManager() {
- return finalSecurityManager != null;
- }
-
- public void removeFinalSecurityManager(final SecurityManager finalSecurityManager) {
- if (this.finalSecurityManager == finalSecurityManager) {
- this.finalSecurityManager = null;
- }
- else {
- throw new SecurityException("Wrong SecurityManager to remove.");
- }
- }
-
- /** needed since scripts may be invoked recursively and the security manager may only be set replaced. */
- public boolean needToSetFinalSecurityManager() {
- return !hasFinalSecurityManager() && isEnabled();
- }
-
- public boolean isEnabled() {
- return !Boolean.valueOf(System.getProperty("org.freeplane.main.application.FreeplaneSecurityManager.disable",
- "false"));
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/FreeplaneSplashModern.java b/freeplane/src/org/freeplane/main/application/FreeplaneSplashModern.java
deleted file mode 100644
index 5ab1b1d..0000000
--- a/freeplane/src/org/freeplane/main/application/FreeplaneSplashModern.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * SimplyHTML, a word processor based on Java, HTML and CSS
- * Copyright (C) 2002 Ulrich Hilger
- * Copyright (C) 2006 Karsten Pawlik
- * Copyright (C) 2006 Dimitri Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-package org.freeplane.main.application;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.Toolkit;
-import java.awt.Window;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.io.InputStream;
-import java.net.URL;
-
-import javax.swing.ImageIcon;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.JRootPane;
-import javax.swing.JWindow;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.features.mode.Controller;
-
-/**
- * Class that displays a splash screen
- * Is run in a separate thread so that the applet continues to load in the background
- * @author Karsten Pawlik
- *
- */
-public class FreeplaneSplashModern extends JWindow {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Font versionTextFont = null;
-
- public FreeplaneSplashModern(final JFrame frame) {
- super(frame);
- splashResource = ResourceController.getResourceController().getResource("/images/Freeplane_splash.png");
- splashImage = new ImageIcon(splashResource);
- setBackground(new Color(0x57, 0xbf, 0x5e));
- final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- final Dimension labelSize = new Dimension(splashImage.getIconWidth(), splashImage.getIconHeight());
- setLocation(screenSize.width / 2 - (labelSize.width / 2), screenSize.height / 2 - (labelSize.height / 2));
- setSize(labelSize);
- RootPane rootPane = new RootPane();
- rootPane.setSize(labelSize);
- setRootPane(rootPane);
- }
-
- private void createVersionTextFont() {
- if(versionTextFont != null){
- return;
- }
- InputStream fontInputStream = null;
- try {
- fontInputStream = ResourceController.getResourceController().getResource("/fonts/intuitive-subset.ttf")
- .openStream();
- versionTextFont = Font.createFont(Font.TRUETYPE_FONT, fontInputStream);
- }
- catch (final Exception e) {
- versionTextFont = new Font("Arial", Font.PLAIN, 12);
- }
- finally {
- FileUtils.silentlyClose(fontInputStream);
- }
- }
-
- private final ImageIcon splashImage;
- private final URL splashResource;
-
- @SuppressWarnings("serial")
- private class RootPane extends JRootPane{
-
- public RootPane() {
- setDoubleBuffered(false);
- }
-
- @Override
- public void paintComponent(final Graphics g) {
- final Graphics2D g2 = (Graphics2D) g;
- splashImage.paintIcon(this, g2, 0, 0);
- if(splashResource.getProtocol().equals("file"))
- return;
- g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
- final FreeplaneVersion version = FreeplaneVersion.getVersion();
- final String versionString = getVersionText(version);
- g2.setColor(Color.WHITE);
- createVersionTextFont();
- final float versionFontSize= 20;
- g2.setFont(versionTextFont.deriveFont(versionFontSize));
- int versionStringWidth = g2.getFontMetrics().stringWidth(versionString);
- final int xCoordinate = splashImage.getIconWidth() - versionStringWidth - 20;
- final int yCoordinate = 20;
- g2.drawString(versionString, xCoordinate, yCoordinate);
- }
-
- @Override
- public void paintChildren(final Graphics g) {
- }
- }
-
- private String getVersionText(final FreeplaneVersion version) {
- final String freeplaneNumber = version.numberToString();
- final String status = version.getType().toLowerCase();
- if("".equals(status))
- return freeplaneNumber;
- else{
- final String versionString = freeplaneNumber + " " + status;
- return versionString;
- }
- }
-
- @Override
- public void setVisible(final boolean b) {
- super.setVisible(b);
- if (b) {
- paintImmediately();
- }
- }
-
- public void paintImmediately() {
- ((JComponent) getRootPane()).paintImmediately(0, 0, getWidth(), getHeight());
- }
-
- static public void main(String[] args){
- ApplicationResourceController applicationResourceController = new ApplicationResourceController();
- Controller controller = new Controller(applicationResourceController);
- Controller.setCurrentController(controller);
- FreeplaneSplashModern freeplaneSplashModern = new FreeplaneSplashModern(null);
- freeplaneSplashModern.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- System.out.println("x = " + e.getX() + " y = " + e.getY());
- if(e.getClickCount() == 2)
- System.exit(0);
- }
- });
- freeplaneSplashModern.setVisible(true);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/FreeplaneStarter.java b/freeplane/src/org/freeplane/main/application/FreeplaneStarter.java
deleted file mode 100644
index 629ea9f..0000000
--- a/freeplane/src/org/freeplane/main/application/FreeplaneStarter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.util.Set;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev
- * 24.12.2012
- */
-public interface FreeplaneStarter {
- public static final String DEFAULT_ORG_FREEPLANE_GLOBALRESOURCEDIR = "resources";
- public static final String ORG_FREEPLANE_GLOBALRESOURCEDIR = "org.freeplane.globalresourcedir";
-
- public void setDontLoadLastMaps();
-
- public Controller createController();
-
- public void createModeControllers(final Controller controller);
-
- public void buildMenus(final Controller controller, final Set<String> plugins);
-
- public void createFrame(final String[] args);
-
- public void loadMapsLater(final String[] args);
-
- /**
- */
- public void run(final String[] args);
-
- public void stop();
-
- public ResourceController getResourceController();
-}
diff --git a/freeplane/src/org/freeplane/main/application/HttpVersionClient.java b/freeplane/src/org/freeplane/main/application/HttpVersionClient.java
deleted file mode 100644
index 0a441c3..0000000
--- a/freeplane/src/org/freeplane/main/application/HttpVersionClient.java
+++ /dev/null
@@ -1,161 +0,0 @@
-package org.freeplane.main.application;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Properties;
-
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.LogUtils;
-
-/**
- * Handles communication with update webservice.
- * @author robert ladstaetter
- */
-class HttpVersionClient {
- private static URL getUrl(final String versionUrl) {
- try {
- return new URL(versionUrl);
- }
- catch (final MalformedURLException e) {
- return null;
- }
- }
-
- private String history;
- private FreeplaneVersion remoteVersion;
- private boolean successful;
- private URL remoteVersionDownloadUrl;
- private URL remoteVersionChangelogUrl;
-
- public HttpVersionClient(final String versionUrl, final FreeplaneVersion currentVersion) {
- this(HttpVersionClient.getUrl(versionUrl), currentVersion);
- }
-
- public HttpVersionClient(final URL url, final FreeplaneVersion currentVersion) {
- remoteVersion = null;
- history = "";
- successful = false;
-
- try {
- if (isPropertyUrl(url))
- parseProperties(url, currentVersion);
- else
- parseHistory(url, currentVersion);
- }
- catch (final NullPointerException e) {
- LogUtils.warn("problem with update check for url (" + url + ")", e);
- }
- catch (final IOException e) {
- LogUtils.warn("Could not read update url (" + url + ") - check your internet connection.");
- }
- catch (final IllegalArgumentException e) {
- LogUtils.warn("Could not read version from " + url + ":" + e.getMessage());
- }
- }
-
- private boolean isPropertyUrl(final URL url) {
- return url.getPath() != null && url.getPath().endsWith(".properties");
- }
-
- private boolean parseProperties(final URL url, final FreeplaneVersion currentVersion) throws IOException {
- Properties versionProperties = new Properties();
- versionProperties.load(new InputStreamReader(url.openConnection().getInputStream()));
-
- // if the 'version' property doesn't exist, an IllegalArgumentException will be raised since it's mandatory
- if (versionProperties.getProperty("version") != null) {
- remoteVersion = FreeplaneVersion.getVersion(versionProperties.getProperty("version"));
- successful = true;
- // optional properties
- remoteVersionDownloadUrl = parseUrl(versionProperties.getProperty("downloadUrl"));
- remoteVersionChangelogUrl = parseUrl(versionProperties.getProperty("changelogUrl"));
- return remoteVersion.compareTo(currentVersion) > 0;
- } else {
- LogUtils.warn("add-on update: no version found in " + url);
- return false;
- }
- }
-
- private void parseHistory(final URL url, final FreeplaneVersion currentVersion) throws IOException {
- BufferedReader in = null;
- try {
- // "version.txt" format
- in = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
- String line = in.readLine();
- while (line != null && !line.startsWith("=====")) {
- line = in.readLine();
- }
- while (line != null && line.startsWith("=====")) {
- line = in.readLine();
- }
- if (line == null) {
- return;
- }
- remoteVersion = FreeplaneVersion.getVersion(line);
- successful = true;
- if (remoteVersion.compareTo(currentVersion) > 0) {
- parseHistory(currentVersion, in, line);
- }
- }
- finally {
- if (in != null) {
- try {
- in.close();
- }
- catch (final IOException e) {
- LogUtils.warn("Couldn't close buffered reader.");
- }
- }
- }
- }
-
- private void parseHistory(FreeplaneVersion currentVersion, BufferedReader in, String firstLine) throws IOException {
- final StringBuilder historyBuffer = new StringBuilder();
- historyBuffer.append(firstLine);
- historyBuffer.append('\n');
- for (String line = in.readLine(); line != null; line = in.readLine()) {
- try {
- final FreeplaneVersion version = FreeplaneVersion.getVersion(line);
- if (version.compareTo(currentVersion) <= 0) {
- break;
- }
- }
- catch (final IllegalArgumentException e) {
- }
- historyBuffer.append(line);
- historyBuffer.append('\n');
- }
- history = historyBuffer.toString();
- }
-
- private URL parseUrl(final String urlString) {
- try {
- return new URL(urlString);
- } catch (final MalformedURLException e) {
- return null;
- }
- }
-
- public String getHistory() {
- return history;
- }
-
- public FreeplaneVersion getRemoteVersion() {
- return remoteVersion;
- }
-
- public URL getRemoteVersionDownloadUrl() {
- return remoteVersionDownloadUrl;
- }
-
- public URL getRemoteVersionChangelogUrl() {
- return remoteVersionChangelogUrl;
- }
-
-
- public boolean isSuccessful() {
- return successful;
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/LastOpenedList.java b/freeplane/src/org/freeplane/main/application/LastOpenedList.java
deleted file mode 100644
index 9cd78f7..0000000
--- a/freeplane/src/org/freeplane/main/application/LastOpenedList.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.Component;
-import java.awt.Frame;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.IFreeplaneAction;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.UIBuilder;
-import org.freeplane.core.ui.components.JFreeplaneMenuItem;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.ConfigurationUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.DocuMapAttribute;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.n3.nanoxml.XMLException;
-
-/**
- * This class manages a list of the maps that were opened last. It aims to
- * provide persistence for the last recent maps. Maps should be shown in the
- * format:"mode\:key",ie."Mindmap\:/home/joerg/freeplane.mm"
- */
-class LastOpenedList implements IMapViewChangeListener, IMapChangeListener {
- private static final String MENU_CATEGORY = "main_menu_most_recent_files";
- private static final String LAST_OPENED_LIST_LENGTH = "last_opened_list_length";
- private static final String LAST_OPENED = "lastOpened_1.0.20";
- // // private final Controller controller;
- private static boolean PORTABLE_APP = System.getProperty("portableapp", "false").equals("true");
- private static String USER_DRIVE = System.getProperty("user.home", "").substring(0, 2);
- /**
- * Contains Restore strings.
- */
- final private List<String> lastOpenedList = new LinkedList<String>();
- /**
- * Contains Restore string => map name (map.toString()).
- */
- final private Map<String, String> mRestorableToMapName = new HashMap<String, String>();
- private String mapSelectedOnStart;
-
- LastOpenedList() {
-// this.controller = controller;
- restoreList(LAST_OPENED);
- }
-
- public void afterViewChange(final Component oldView, final Component newView) {
- if (newView == null) {
- updateMenus();
- return;
- }
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- final MapModel map = mapViewManager.getModel(newView);
- final String restoreString = getRestoreable(map);
- updateList(map, restoreString);
- }
-
- public void afterViewClose(final Component oldView) {
- }
-
- public void afterViewCreated(final Component mapView) {
- }
-
- public void beforeViewChange(final Component oldView, final Component newView) {
- }
-
- private int getMaxMenuEntries() {
- return ResourceController.getResourceController().getIntProperty(LAST_OPENED_LIST_LENGTH, 25);
- }
-
- private String getRestorable(final File file) {
- if (file == null) {
- return null;
- }
- final String absolutePath = file.getAbsolutePath();
- if (!PORTABLE_APP || !USER_DRIVE.endsWith(":")) {
- return "MindMap:" + absolutePath;
- }
- final String diskName = absolutePath.substring(0, 2);
- if (!diskName.equals(USER_DRIVE)) {
- return "MindMap:" + absolutePath;
- }
- return "MindMap::" + absolutePath.substring(2);
- }
-
- public String getRestoreable( final MapModel map) {
- if (map == null) {
- return null;
- }
- //ignore documentation maps loaded using documentation actions
- if(map.containsExtension(DocuMapAttribute.class))
- return null;
- final ModeController modeController = Controller.getCurrentModeController();
- if (!modeController.getModeName().equals(MModeController.MODENAME)) {
- return null;
- }
- final File file = map.getFile();
- return getRestorable(file);
- }
-
- public void mapChanged(final MapChangeEvent event) {
- if (!event.getProperty().equals(UrlManager.MAP_URL)) {
- return;
- }
- final URL after = (URL) event.getNewValue();
- if (after != null) {
- final String fileAfter = after.getFile();
- if (fileAfter != null) {
- final String restorable = getRestorable(new File(fileAfter));
- updateList(event.getMap(), restorable);
- }
- }
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void onPreNodeDelete(final NodeModel oldParent, final NodeModel selectedNode, final int index) {
- }
-
- public void open(final String restoreable) throws FileNotFoundException, MalformedURLException,
- IOException, URISyntaxException, XMLException {
- if (restoreable == null)
- return;
- final StringTokenizer tokens = new StringTokenizer(restoreable, ":");
- if (!tokens.hasMoreTokens())
- return;
- final boolean changedToMapView;
- changedToMapView = tryToChangeToMapView(restoreable);
- if (changedToMapView)
- return;
- final String mode = tokens.nextToken();
- Controller.getCurrentController().selectMode(mode);
- String fileName = tokens.nextToken(";").substring(1);
- if (PORTABLE_APP && fileName.startsWith(":") && USER_DRIVE.endsWith(":")) {
- fileName = USER_DRIVE + fileName.substring(1);
- }
- if(!changedToMapView)
- Controller.getCurrentModeController().getMapController().newMap(Compat.fileToUrl(new File(fileName)));
- else{
- final MapModel map = Controller.getCurrentController().getMap();
- Controller.getCurrentModeController().getMapController().newMapView(map);
- }
- }
-
- void openLastMapOnStart() {
- if (mapSelectedOnStart != null) {
- if(!tryToChangeToMapView(mapSelectedOnStart))
- safeOpen(mapSelectedOnStart);
- }
- }
-
- private void remove(final String restoreable) {
- lastOpenedList.remove(restoreable);
- updateMenus();
- }
-
- private void restoreList(final String key) {
- final String restored = ResourceController.getResourceController().getProperty(key, null);
- if (restored != null && !restored.equals("")) {
- lastOpenedList.addAll(ConfigurationUtils.decodeListValue(restored, true));
- if (!lastOpenedList.isEmpty()) {
- mapSelectedOnStart = lastOpenedList.get(0);
- }
- }
- }
-
- void safeOpen(final List<String> maps) {
- for (final String restoreable : maps) {
- safeOpen(restoreable);
- }
- }
-
- public void safeOpen(final String restoreable) {
- try {
- open(restoreable);
- }
- catch (final Exception ex) {
- LogUtils.warn(ex);
- final String message = TextUtils.format("remove_file_from_list_on_error", restoreable);
- UITools.showFrame();
- final Frame frame = UITools.getFrame();
- final int remove = JOptionPane.showConfirmDialog(frame, message, "Freeplane", JOptionPane.YES_NO_OPTION);
- if (remove == JOptionPane.YES_OPTION) {
- remove(restoreable);
- }
- }
- }
-
- public void saveProperties() {
- ResourceController.getResourceController().setProperty(LAST_OPENED,
- ConfigurationUtils.encodeListValue(lastOpenedList, true));
- }
-
- private boolean tryToChangeToMapView(final String restoreable) {
- return Controller.getCurrentController().getMapViewManager().tryToChangeToMapView(mRestorableToMapName.get(restoreable));
- }
-
- private void updateList(final MapModel map, final String restoreString) {
- //ignore documentation maps loaded using documentation actions
- if(map.containsExtension(DocuMapAttribute.class))
- return;
- if (restoreString != null) {
- if (lastOpenedList.contains(restoreString)) {
- lastOpenedList.remove(restoreString);
- }
- lastOpenedList.add(0, restoreString);
- mRestorableToMapName.put(restoreString, map.getTitle());
- }
- updateMenus();
- }
-
- private void updateMenus() {
- Controller controller = Controller.getCurrentController();
- final ModeController modeController = controller.getModeController();
- final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder();
- menuBuilder.removeChildElements(MENU_CATEGORY);
- int i = 0;
- int maxEntries = getMaxMenuEntries();
- for (final String key : lastOpenedList) {
- if (i == 0
- && (!modeController.getModeName().equals(MModeController.MODENAME) || controller.getMap() == null || controller
- .getMap().getURL() == null)) {
- i++;
- maxEntries++;
- }
- if (i == maxEntries) {
- break;
- }
- final AFreeplaneAction lastOpenedActionListener = new OpenLastOpenedAction(i++, this);
- final IFreeplaneAction decoratedAction = menuBuilder.decorateAction(lastOpenedActionListener);
- final JMenuItem item = new JFreeplaneMenuItem(decoratedAction);
- item.setActionCommand(key);
- String text = createOpenMapItemName(key);
- item.setText(text);
- item.setMnemonic(0);
- menuBuilder.addMenuItem(MENU_CATEGORY, item, MENU_CATEGORY + '/' + lastOpenedActionListener.getKey(),
- UIBuilder.AS_CHILD);
- }
- }
-
- private String createOpenMapItemName(final String restorable) {
- final int separatorIndex = restorable.indexOf(':');
- if(separatorIndex == -1)
- return restorable;
- String key = restorable.substring(0, separatorIndex);
- String fileName = restorable.substring(separatorIndex);
- if(fileName.startsWith("::"))
- return TextUtils.getText("open_as" + key, key) + " " + fileName.substring(2);
- else
- return TextUtils.getText("open_as" + key, key) + " " + fileName.substring(1);
- }
-
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/MapViewDockingWindows.java b/freeplane/src/org/freeplane/main/application/MapViewDockingWindows.java
deleted file mode 100644
index fcf1fe1..0000000
--- a/freeplane/src/org/freeplane/main/application/MapViewDockingWindows.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2013.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Font;
-import java.awt.Frame;
-import java.awt.dnd.DropTarget;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.Vector;
-
-import javax.swing.InputMap;
-import javax.swing.JComponent;
-import javax.swing.JDesktopPane;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.SwingUtilities;
-import javax.swing.Timer;
-import javax.swing.UIManager;
-import javax.swing.event.InternalFrameAdapter;
-import javax.swing.event.InternalFrameEvent;
-
-import net.infonode.docking.DockingWindow;
-import net.infonode.docking.DockingWindowAdapter;
-import net.infonode.docking.OperationAbortedException;
-import net.infonode.docking.RootWindow;
-import net.infonode.docking.TabWindow;
-import net.infonode.docking.View;
-import net.infonode.docking.properties.DockingWindowProperties;
-import net.infonode.docking.properties.RootWindowProperties;
-import net.infonode.docking.theme.BlueHighlightDockingTheme;
-import net.infonode.docking.util.DockingUtil;
-import net.infonode.tabbedpanel.TabAreaProperties;
-import net.infonode.tabbedpanel.TabAreaVisiblePolicy;
-import net.infonode.tabbedpanel.TabDropDownListVisiblePolicy;
-import net.infonode.tabbedpanel.TabLayoutPolicy;
-import net.infonode.tabbedpanel.TabbedPanelProperties;
-import net.infonode.tabbedpanel.titledtab.TitledTabProperties;
-import net.infonode.util.Direction;
-
-import org.apache.commons.codec.binary.Base64;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.features.url.mindmapmode.FileOpener;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.NodeView;
-import org.freeplane.view.swing.ui.DefaultMapMouseListener;
-
-class MapViewDockingWindows implements IMapViewChangeListener {
-
- // // final private Controller controller;
- private static final String OPENED_NOW = "openedNow_1.3.04";
- private RootWindow rootWindow = null;
- final private Vector<Component> mapViews;
- private boolean mPaneSelectionUpdate = true;
- private boolean loadingLayoutFromObjectInpusStream;
- private byte[] emptyConfigurations;
- private final MapViewSerializer viewSerializer;
-
- public MapViewDockingWindows() {
- viewSerializer = new MapViewSerializer();
- rootWindow = new RootWindow(viewSerializer);
- configureDefaultDockingWindowProperties();
-
- rootWindow.getWindowBar(Direction.DOWN).setEnabled(true);
- try {
- ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
- ObjectOutputStream wrapper = new ObjectOutputStream(byteStream);
- rootWindow.write(wrapper);
- wrapper.close();
- emptyConfigurations = byteStream.toByteArray();
- }
- catch (IOException e1) {
- }
- removeDesktopPaneAccelerators();
- mapViews = new Vector<Component>();
- final FileOpener fileOpener = new FileOpener();
- new DropTarget(rootWindow, fileOpener);
- rootWindow.addMouseListener(new DefaultMapMouseListener());
-
- final Controller controller = Controller.getCurrentController();
- controller.getMapViewManager().addMapViewChangeListener(this);
- rootWindow.addListener(new DockingWindowAdapter(){
-
- @Override
- public void viewFocusChanged(View previouslyFocusedView, View focusedView) {
- if(previouslyFocusedView != null && focusedView != null){
- Component containedMapView = getContainedMapView(focusedView);
- viewSelectionChanged(containedMapView);
- }
- }
-
- @Override
- public void windowClosing(DockingWindow window) throws OperationAbortedException {
- for(Component mapViewComponent : mapViews.toArray(new Component[]{}))
- if(SwingUtilities.isDescendingFrom(mapViewComponent, window))
- if (!Controller.getCurrentController().getMapViewManager().close(mapViewComponent, false))
- throw new OperationAbortedException("can not close view");
- }
-
-
-
- @Override
- public void windowAdded(final DockingWindow addedToWindow, final DockingWindow addedWindow) {
- if(addedWindow instanceof TabWindow) {
- final DockingWindowProperties windowProperties = addedWindow.getWindowProperties();
- windowProperties.setDockEnabled(false);
- windowProperties.setUndockEnabled(false);
- final TabAreaProperties tabAreaProperties = ((TabWindow)addedWindow).getTabWindowProperties().getTabbedPanelProperties().getTabAreaProperties();
- if (addedToWindow == rootWindow)
- tabAreaProperties.setTabAreaVisiblePolicy(TabAreaVisiblePolicy.MORE_THAN_ONE_TAB);
- else
- tabAreaProperties.setTabAreaVisiblePolicy(TabAreaVisiblePolicy.ALWAYS);
- }
- setTabPolicies(addedWindow);
- }
-
- private void setTabPolicies(final DockingWindow window) {
- if(window instanceof TabWindow){
- TabbedPanelProperties tabbedPanelProperties = ((TabWindow)window).getTabWindowProperties().getTabbedPanelProperties();
- if(! tabbedPanelProperties.getTabLayoutPolicy().equals(TabLayoutPolicy.COMPRESSION))
- tabbedPanelProperties.setTabLayoutPolicy(TabLayoutPolicy.COMPRESSION);
- if(! tabbedPanelProperties.getTabDropDownListVisiblePolicy().equals(TabDropDownListVisiblePolicy.MORE_THAN_ONE_TAB))
- tabbedPanelProperties.setTabDropDownListVisiblePolicy(TabDropDownListVisiblePolicy.MORE_THAN_ONE_TAB);
- }
- for(int i = 0; i < window.getChildWindowCount(); i++){
- setTabPolicies(window.getChildWindow(i));
- }
- }
-
- @Override
- public void windowRemoved(DockingWindow removedFromWindow, DockingWindow removedWindow) {
- if(removedWindow instanceof TabWindow) {
- if (removedFromWindow == rootWindow) {
- final TabAreaProperties tabAreaProperties = ((TabWindow)removedWindow).getTabWindowProperties().getTabbedPanelProperties().getTabAreaProperties();
- tabAreaProperties.setTabAreaVisiblePolicy(TabAreaVisiblePolicy.ALWAYS);
- }
- }
- }
- });
-
- new InternalFrameAdapter() {
- @Override
- public void internalFrameClosing(InternalFrameEvent e) {
- }
- };
-
-
- }
-
- private void configureDefaultDockingWindowProperties() {
- RootWindowProperties rootWindowProperties = rootWindow.getRootWindowProperties();
- rootWindowProperties.addSuperObject(new BlueHighlightDockingTheme().getRootWindowProperties());
-
- RootWindowProperties overwrittenProperties = new RootWindowProperties();
- overwrittenProperties.getWindowAreaProperties().setBackgroundColor(UIManager.getColor("Panel.background"));
- TabbedPanelProperties tabbedPanelProperties = overwrittenProperties.getTabWindowProperties().getTabbedPanelProperties();
- tabbedPanelProperties.setTabLayoutPolicy(TabLayoutPolicy.COMPRESSION);
- tabbedPanelProperties.setTabDropDownListVisiblePolicy(TabDropDownListVisiblePolicy.MORE_THAN_ONE_TAB);
- Font tabFont = new Font("Dialog", 0, 11);
- TitledTabProperties titledTabProperties = overwrittenProperties.getTabWindowProperties().getTabProperties().getTitledTabProperties();
- titledTabProperties.getHighlightedProperties().getComponentProperties().setFont(tabFont);
- titledTabProperties.getNormalProperties().getComponentProperties().setFont(tabFont);
- rootWindowProperties.addSuperObject(overwrittenProperties);
- }
-
- private void removeDesktopPaneAccelerators() {
- final InputMap map = new InputMap();
- rootWindow.setInputMap(JDesktopPane.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, map);
- }
-
-
- private DockingWindow getLastFocusedChildWindow(DockingWindow parentWindow) {
- DockingWindow lastFocusedChildWindow = parentWindow.getLastFocusedChildWindow();
- if(lastFocusedChildWindow == null)
- return parentWindow;
- else
- return getLastFocusedChildWindow(lastFocusedChildWindow);
- }
-
- public void afterViewChange(final Component pOldMap, final Component pNewMap) {
- if (pNewMap == null) {
- return;
- }
- if(! loadingLayoutFromObjectInpusStream) {
- for (int i = 0; i < mapViews.size(); ++i) {
- if (mapViews.get(i) == pNewMap) {
- View dockedView = getContainingDockedWindow(pNewMap);
- if(dockedView.isMinimized())
- dockedView.restore();
- else
- dockedView.restoreFocus();
- focusMapViewLater((MapView) pNewMap);
- return;
- }
- }
- addDockedWindow(pNewMap);
- }
- else if(mapViews.contains(pNewMap))
- return;
- mapViews.add(pNewMap);
- }
-
- static private View getContainingDockedWindow(final Component pNewMap) {
- return (View) SwingUtilities.getAncestorOfClass(View.class, pNewMap);
- }
-
- protected void addDockedView(View dynamicView) {
- DockingWindow lastFocusedChildWindow = getLastFocusedChildWindow(rootWindow);
- if(lastFocusedChildWindow == null) {
- DockingUtil.addWindow(dynamicView, rootWindow);
- }
- else{
- Container parent = SwingUtilities.getAncestorOfClass(DockingWindow.class, lastFocusedChildWindow);
- if(parent instanceof TabWindow)
- ((TabWindow)parent).addTab(dynamicView);
- else
- DockingUtil.addWindow(dynamicView, lastFocusedChildWindow.getRootWindow());
- }
- }
-
- static Component getContainedMapView(View dockedWindow) {
- JScrollPane scrollPane = (JScrollPane) dockedWindow.getComponent();
- Component view = scrollPane.getViewport().getView();
- return view;
- }
-
- private void addDockedWindow(final Component pNewMap) {
- final View viewFrame = viewSerializer.newDockedView(pNewMap);
- addDockedView(viewFrame);
- }
-
- public void afterViewClose(final Component pOldMapView) {
- for (int i = 0; i < mapViews.size(); ++i) {
- if (mapViews.get(i) == pOldMapView) {
- mPaneSelectionUpdate = false;
- getContainingDockedWindow(pOldMapView).close();
- mapViews.remove(i);
- mPaneSelectionUpdate = true;
- rootWindow.repaint();
- return;
- }
- }
- }
-
- public void afterViewCreated(final Component mapView) {
- }
-
- public void beforeViewChange(final Component pOldMapView, final Component pNewMapView) {
- }
-
- private void viewSelectionChanged(final Component mapView) {
- if (!mPaneSelectionUpdate) {
- return;
- }
- Controller controller = Controller.getCurrentController();
- if (mapView != controller.getMapViewManager().getMapViewComponent()) {
- controller.getMapViewManager().changeToMapView(mapView.getName());
- }
- }
-
- public JComponent getMapPane() {
- return rootWindow;
- }
-
- public void saveLayout(){
- ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
- try {
- ObjectOutputStream objectStream = new ObjectOutputStream(byteStream);
- rootWindow.write(objectStream);
- objectStream.close();
- String encodedBytes = Base64.encodeBase64String(byteStream.toByteArray());
- ResourceController.getResourceController().setProperty(OPENED_NOW, encodedBytes);
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- public void loadLayout(){
- String encodedBytes = ResourceController.getResourceController().getProperty(OPENED_NOW, null);
- if(encodedBytes != null){
- byte[] bytes = Base64.decodeBase64(encodedBytes);
- ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
- try {
- loadingLayoutFromObjectInpusStream = true;
- rootWindow.read(new ObjectInputStream(byteStream));
- }
- catch (Exception e) {
- LogUtils.severe(e);
- try {
- rootWindow.read(new ObjectInputStream(new ByteArrayInputStream(emptyConfigurations)));
- }
- catch (IOException e1) {
- }
- }
- finally{
- viewSerializer.removeDummyViews();
- loadingLayoutFromObjectInpusStream = false;
- }
- }
- }
-
- public void focusMapViewLater(final MapView mapView) {
- Timer timer = new Timer(40, new ActionListener() {
- int retryCount = 5;
- public void actionPerformed(final ActionEvent event) {
- final Timer eventTimer = (Timer)event.getSource();
- focusMapLater(mapView, eventTimer);
- }
- private void focusMapLater(final MapView mapView, final Timer eventTimer) {
- if(mapView.isShowing() && Controller.getCurrentController().getMapViewManager().getMapViewComponent() == mapView){
- final NodeView selected = mapView.getSelected();
- if(selected != null){
- final Frame frame = JOptionPane.getFrameForComponent(mapView);
- if (frame.isFocused())
- selected.requestFocusInWindow();
- else
- frame.addWindowFocusListener(new WindowAdapter() {
- @Override
- public void windowGainedFocus(WindowEvent e) {
- frame.removeWindowFocusListener(this);
- selected.requestFocusInWindow();
- retryCount = 2;
- eventTimer.start();
- }
- });
- }
- }
- if(retryCount > 1){
- retryCount--;
- eventTimer.start();
- }
- }
- });
- timer.setRepeats(false);
- timer.start();
- }
-
- public void setTitle() {
- if(loadingLayoutFromObjectInpusStream)
- return;
- for (Component mapViewComponent: mapViews) {
- if (mapViewComponent instanceof MapView ) {
- MapView mapView = (MapView)mapViewComponent;
- String name = mapView.getName();
- String title;
- if(mapView.getModel().isSaved())
- title = name;
- else
- title = name + " *";
- View containingDockedWindow = getContainingDockedWindow(mapViewComponent);
- containingDockedWindow.getViewProperties().setTitle(title);
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/MapViewSerializer.java b/freeplane/src/org/freeplane/main/application/MapViewSerializer.java
deleted file mode 100644
index 59e5642..0000000
--- a/freeplane/src/org/freeplane/main/application/MapViewSerializer.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.Component;
-import java.awt.event.HierarchyEvent;
-import java.awt.event.HierarchyListener;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-
-import javax.swing.JPanel;
-
-import net.infonode.docking.View;
-import net.infonode.docking.ViewSerializer;
-
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.mindmapmode.DocuMapAttribute;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.MapViewScrollPane;
-
-/**
- * @author Dimitry Polivaev
- * 29.04.2013
- */
-class MapViewSerializer implements ViewSerializer {
- private Collection<View> viewsToBeRemoved = new ArrayList<View>();
-
- public void writeView(View view, ObjectOutputStream out) throws IOException {
- if(view.isDisplayable()) {
- Component component = MapViewDockingWindows.getContainedMapView(view);
- if (component instanceof MapView) {
- MapView mapView = (MapView) component;
- if(mapView.getModeController().getModeName().equals(MModeController.MODENAME)
- && ! mapView.getModel().containsExtension(DocuMapAttribute.class)){
- out.writeBoolean(true);
- out.writeUTF(mapView.getModeController().getModeName());
- out.writeObject(mapView.getModel().getURL());
- return;
- }
- }
- }
- out.writeBoolean(false);
- }
-
- public View readView(ObjectInputStream in) throws IOException {
- try {
- if (in.readBoolean()){
- String modeName = in.readUTF();
- URL mapUrl = (URL) in.readObject();
- if(mapUrl == null)
- return newViewToBeRemoved();
- Controller controller = Controller.getCurrentController();
- controller.selectMode(modeName);
- ModeController modeController = Controller.getCurrentModeController();
- MapController mapController = modeController.getMapController();
- boolean newMapLoaded = mapController.newMap(mapUrl);
- if (!newMapLoaded){
- MapModel map = controller.getMap();
- if(map.getURL().equals(mapUrl)){
- mapController.newMapView(map);
- }
- }
- Component mapViewComponent = controller.getMapViewManager().getMapViewComponent();
- if(mapViewComponent.getParent() == null) {
- return newDockedView(mapViewComponent);
- }
- else
- return newViewToBeRemoved();
- }
- return newViewToBeRemoved();
- }
- catch (Exception e) {
- return newViewToBeRemoved();
- }
- }
-
- private View newViewToBeRemoved() {
- View view = new View("", null, new JPanel());
- viewsToBeRemoved.add(view);
- return view;
- }
-
- protected View newDockedView(final Component pNewMap) {
- if(pNewMap.getParent() != null)
- return null;
- final String title = pNewMap.getName();
- MapViewScrollPane mapViewScrollPane = new MapViewScrollPane();
- mapViewScrollPane.getViewport().setView(pNewMap);
- @SuppressWarnings("serial")
- final View viewFrame = new ConnectedToMenuView(title, null, mapViewScrollPane);
- return viewFrame;
- }
-
- public void removeDummyViews() {
- for(View view : viewsToBeRemoved)
- view.close();
- viewsToBeRemoved.clear();
- }
-
-
-
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/main/application/NavigationNextMapAction.java b/freeplane/src/org/freeplane/main/application/NavigationNextMapAction.java
deleted file mode 100644
index 34d5031..0000000
--- a/freeplane/src/org/freeplane/main/application/NavigationNextMapAction.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.mode.Controller;
-
-class NavigationNextMapAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- NavigationNextMapAction() {
- super("NavigationNextMapAction");
- setEnabled(false);
- }
-
- public void actionPerformed(final ActionEvent event) {
- Controller.getCurrentController().getMapViewManager().nextMapView();
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/NavigationPreviousMapAction.java b/freeplane/src/org/freeplane/main/application/NavigationPreviousMapAction.java
deleted file mode 100644
index 02efab2..0000000
--- a/freeplane/src/org/freeplane/main/application/NavigationPreviousMapAction.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.mode.Controller;
-
-class NavigationPreviousMapAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- NavigationPreviousMapAction() {
- super("NavigationPreviousMapAction");
- setEnabled(false);
- }
-
- public void actionPerformed(final ActionEvent event) {
- Controller.getCurrentController().getMapViewManager().previousMapView();
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/OpenLastOpenedAction.java b/freeplane/src/org/freeplane/main/application/OpenLastOpenedAction.java
deleted file mode 100644
index 1bd66a4..0000000
--- a/freeplane/src/org/freeplane/main/application/OpenLastOpenedAction.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-
-class OpenLastOpenedAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private LastOpenedList list;
-
- public OpenLastOpenedAction(final int i, final LastOpenedList list) {
- super("OpenLastOpenedAction_" + i, null, null);
- this.list = list;
- }
-
- public void actionPerformed(final ActionEvent e) {
- final String restoreable = e.getActionCommand();
- list.safeOpen(restoreable);
- }
-
- @Override
- public void afterMapChange(final Object newMap) {
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/SingleInstanceManager.java b/freeplane/src/org/freeplane/main/application/SingleInstanceManager.java
deleted file mode 100644
index 659fd13..0000000
--- a/freeplane/src/org/freeplane/main/application/SingleInstanceManager.java
+++ /dev/null
@@ -1,206 +0,0 @@
-package org.freeplane.main.application;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-import java.io.RandomAccessFile;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.UnknownHostException;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.main.application.CommandLineParser.Options;
-
-public class SingleInstanceManager {
- private File lockFile = new File(Compat.getFreeplaneUserDirectory(), "single_instance.lock");
- private boolean isSingleInstanceMode;
- private boolean isSingleInstanceForceMode;
- private Integer port;
- private boolean isSlave;
- private boolean isMasterPresent;
- final private FreeplaneStarter starter;
-
- public SingleInstanceManager(FreeplaneStarter starter) {
- this.starter = starter;
- final ResourceController resourceController = starter.getResourceController();
- isSingleInstanceMode = resourceController.getBooleanProperty("single_instance");
- isSingleInstanceForceMode = resourceController.getBooleanProperty("single_instance_force");
- }
-
- public void start(String[] args) {
- final Options options = CommandLineParser.parse(args);
- final String[] filesToLoad = options.getFilesToOpenAsArray();
- if (isSingleInstanceMode && !options.hasMenuItemsToExecute()) {
- initLockFile();
- if (filesToLoad.length == 0 && !isSingleInstanceForceMode && checkIsMasterPresent()) {
- isMasterPresent = true;
- startStandAlone(filesToLoad);
- }
- else if (!startAsSlave(filesToLoad)) {
- if (!startAsMaster(filesToLoad)) {
- startStandAlone(filesToLoad);
- }
- }
- }
- else {
- startStandAlone(filesToLoad);
- }
- }
-
- private boolean checkIsMasterPresent() {
- if (port == null)
- return false;
- try {
- Socket clientSocket = new Socket("localhost", port);
- clientSocket.close();
- LogUtils.info("master is present.");
- return true;
- }
- catch (Exception e) {
- // this is only a check - we'll log later
- return false;
- }
- }
-
- public boolean isSlave() {
- return isSlave;
- }
-
- public boolean isMasterPresent() {
- return isSlave || isMasterPresent;
- }
-
- private boolean startAsSlave(String[] filesToLoad) {
- if (port != null) {
- isSlave = openFilesInMaster(filesToLoad);
- return isSlave;
- }
- return false;
- }
-
- private boolean openFilesInMaster(String[] filesToLoad) {
- if (port == null)
- throw new IllegalArgumentException("port may not be null");
- try {
- Socket clientSocket = new Socket("localhost", port);
- OutputStream out = clientSocket.getOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(out);
- oos.writeObject(filesToLoad);
- oos.close();
- clientSocket.close();
- LogUtils.info("Successfully notified first instance.");
- return true;
- }
- catch (UnknownHostException e) {
- LogUtils.severe(e.getMessage(), e);
- return false;
- }
- catch (IOException e) {
- LogUtils.warn("Error connecting to existing instance (stale lockfiles may cause this).", e);
- return false;
- }
- }
-
- private boolean startAsMaster(String[] filesToLoad) {
- try {
- // port number 0: use any free socket
- final ServerSocket socket = new ServerSocket(0, 10);
- port = socket.getLocalPort();
- LogUtils.info("Listening for application instances on socket " + port);
- createLockFile();
- Thread filesToOpenListenerThread = new Thread(new Runnable() {
- public void run() {
- boolean socketClosed = false;
- while (!socketClosed) {
- if (socket.isClosed()) {
- socketClosed = true;
- }
- else {
- try {
- Socket client = socket.accept();
- ObjectInputStream in = new ObjectInputStream(client.getInputStream());
- String[] filesToLoadForClient = (String[]) in.readObject();
- LogUtils.info("opening '" + StringUtils.join(filesToLoadForClient, "', '")
- + "' for client");
- in.close();
- client.close();
- starter.loadMapsLater(filesToLoadForClient);
- }
- catch (SecurityException e) {
- // this happens when the master is currently executing a script
- LogUtils.warn("master is currently not accepting new files. Try again later", e);
- }
- catch (IOException e) {
- socketClosed = true;
- }
- catch (ClassNotFoundException e) {
- // this should never happen
- throw new RuntimeException("implementation error", e);
- }
- }
- }
- }
- });
- filesToOpenListenerThread.start();
- return true;
- // listen
- }
- catch (UnknownHostException e) {
- LogUtils.severe(e.getMessage(), e);
- return false;
- }
- catch (IOException e) {
- LogUtils.severe(e.getMessage(), e);
- return false;
- }
- }
-
- private void createLockFile() throws IOException {
- final RandomAccessFile randomAccessLockFile = new RandomAccessFile(lockFile, "rwd");
- randomAccessLockFile.writeBytes(port.toString());
- randomAccessLockFile.close();
- Runtime.getRuntime().addShutdownHook(new Thread() {
- public void run() {
- try {
- lockFile.delete();
- }
- catch (Exception e) {
- error("Unable to remove lock file: " + lockFile, e);
- }
- }
- });
- }
-
- private void startStandAlone(String[] filesToLoad) {
- // do nothing - whatever is needed will happen later
- }
-
- /**
- * opens the lock file and tries to get a lock for it.
- * If it is locked already then try to read the port number from it.
- */
- private boolean initLockFile() {
- try {
- if (lockFile.exists()) {
- // slave: read the port from the file
- final RandomAccessFile randomAccessLockFile = new RandomAccessFile(lockFile, "r");
- String portAsString = randomAccessLockFile.readLine().trim();
- randomAccessLockFile.close();
- port = Integer.parseInt(portAsString);
- }
- }
- catch (Exception e) {
- error("Unable to create and/or lock file: " + lockFile, e);
- }
- return false;
- }
-
- private void error(String message, Exception e) {
- LogUtils.severe(message, e);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/application/SplitPaneLayoutManagerDecorator.java b/freeplane/src/org/freeplane/main/application/SplitPaneLayoutManagerDecorator.java
deleted file mode 100644
index d2941d9..0000000
--- a/freeplane/src/org/freeplane/main/application/SplitPaneLayoutManagerDecorator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2010 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.LayoutManager;
-
-import javax.swing.JSplitPane;
-
-/**
- * @author Dimitry Polivaev
- * Dec 26, 2010
- */
-final class SplitPaneLayoutManagerDecorator implements LayoutManager {
- private final LayoutManager lm;
-
- SplitPaneLayoutManagerDecorator(LayoutManager lm) {
- this.lm = lm;
- }
-
- public void removeLayoutComponent(Component comp) {
- lm.removeLayoutComponent(comp);
- }
-
- public Dimension preferredLayoutSize(Container parent) {
- final JSplitPane splitPane = (JSplitPane) parent;
- if(isDividerRequired(splitPane))
- return lm.preferredLayoutSize(parent);
- return splitPane.getLeftComponent().getPreferredSize();
- }
-
- public Dimension minimumLayoutSize(Container parent) {
- final JSplitPane splitPane = (JSplitPane) parent;
- if(isDividerRequired(splitPane))
- return lm.minimumLayoutSize(parent);
- return splitPane.getLeftComponent().getMinimumSize();
- }
-
- public void layoutContainer(Container parent) {
- final JSplitPane splitPane = (JSplitPane) parent;
- if(isDividerRequired(splitPane)){
- lm.layoutContainer(parent);
- return;
- }
- final Component leftComponent = splitPane.getLeftComponent();
- for(int i = 0; i < splitPane.getComponentCount(); i++){
- final Component component = splitPane.getComponent(i);
- if(component.equals(leftComponent)){
- component.setBounds(0, 0, splitPane.getWidth(), splitPane.getHeight());
- }
- else{
- component.setBounds(0, 0, 0, 0);
- }
- }
- }
-
- private boolean isDividerRequired(final JSplitPane splitPane) {
- final Component rightComponent = splitPane.getRightComponent();
- final boolean rightComponentVisible = rightComponent != null&& rightComponent.isVisible();
- return rightComponentVisible;
- }
-
- public void addLayoutComponent(String name, Component comp) {
- lm.addLayoutComponent(name, comp);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/main/application/UpdateCheckAction.java b/freeplane/src/org/freeplane/main/application/UpdateCheckAction.java
deleted file mode 100644
index eafc89c..0000000
--- a/freeplane/src/org/freeplane/main/application/UpdateCheckAction.java
+++ /dev/null
@@ -1,496 +0,0 @@
-package org.freeplane.main.application;
-
-import java.awt.Component;
-import java.awt.Font;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.SwingConstants;
-import javax.swing.Timer;
-import javax.swing.border.Border;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.main.addons.AddOnProperties;
-import org.freeplane.main.addons.AddOnsController;
-
-/**
- * Checks for updates.
- *
- * @author robert ladstaetter
- */
-class UpdateCheckAction extends AFreeplaneAction {
- private static boolean autorunEnabled = true;
- private static Timer autorunTimer = null;
- private static final int CHECK_TIME = 30 * 1000;
- private static final String CHECK_UPDATES_AUTOMATICALLY = "check_updates_automatically";
- private static final String LAST_UPDATE_CHECK_TIME = "last_update_check_time";
- private static final String LAST_UPDATE_VERSION = "last_update_verson";
- /**
- * the sid.
- */
- private static final long serialVersionUID = 1L;
- private static final int TWO_DAYS = 1 * 24 * 60 * 60 * 1000;
- private static final String UPDATE_BUTTON_LOCATION = "main_toolbar_update";
- private static final String UPDATE_BUTTON_PATH = UPDATE_BUTTON_LOCATION + "/checkUpdate";
-// /**
-// * the url where to download the newest version
-// */
-// private static final String WEB_DOWNLOAD_LOCATION_KEY = "webDownloadLocation";
- /**
- * the url to check the local version against
- */
- private static final String WEB_UPDATE_LOCATION_KEY = "webUpdateLocation";
-
- /**
- * the client which asks a remote repository for the current version of the program.
- */
- public UpdateCheckAction() {
- super("UpdateCheckAction");
- final Controller controller = Controller.getCurrentController();
- controller.getMapViewManager().addMapViewChangeListener(new IMapViewChangeListener() {
- public void afterViewChange(final Component oldView, final Component newView) {
- if (newView == null) {
- return;
- }
- controller.getViewController().invokeLater(new Runnable() {
- public void run() {
- removeMe();
- }
- });
- setTimer();
- }
-
- public void afterViewClose(final Component oldView) {
- }
-
- public void afterViewCreated(final Component mapView) {
- }
-
- public void beforeViewChange(final Component oldView, final Component newView) {
- }
-
- private void removeMe() {
- controller.getMapViewManager().removeMapViewChangeListener(this);
- }
- });
- }
-
- public void actionPerformed(final ActionEvent e) {
- final boolean autoRun = e.getSource().equals(autorunTimer);
- if (autorunTimer != null) {
- autorunTimer.stop();
- autorunTimer = null;
- }
- new Thread(new Runnable() {
- public void run() {
- checkForUpdates(autoRun);
- }
- }, "checkForUpdates").start();
- }
-
- private void addUpdateButton(final FreeplaneVersion lastVersion) {
- Controller controller = Controller.getCurrentController();
- final Set<String> modes = controller.getModes();
- for (final String mode : modes) {
- final MenuBuilder menuBuilder = controller.getModeController(mode).getUserInputListenerFactory()
- .getMenuBuilder();
- if (lastVersion == null || lastVersion.compareTo(FreeplaneVersion.getVersion()) <= 0) {
- ResourceController.getResourceController().setProperty(LAST_UPDATE_VERSION, "");
- if (menuBuilder.get(UPDATE_BUTTON_PATH) != null) {
- menuBuilder.removeElement(UPDATE_BUTTON_PATH);
- }
- continue;
- }
- ResourceController.getResourceController().setProperty(LAST_UPDATE_VERSION, lastVersion.toString());
- final String updateAvailable = TextUtils.format("new_version_available", lastVersion.toString());
- controller.getViewController().out(updateAvailable);
- putValue(SHORT_DESCRIPTION, updateAvailable);
- putValue(LONG_DESCRIPTION, updateAvailable);
- if (menuBuilder.get(UPDATE_BUTTON_PATH) == null) {
- menuBuilder.addAction(UPDATE_BUTTON_LOCATION, UPDATE_BUTTON_PATH, UpdateCheckAction.this,
- MenuBuilder.AS_CHILD);
- }
- }
- }
-
- private void checkForUpdates(final boolean autoRun) {
- final Date now = new Date();
- ResourceController.getResourceController().setProperty(LAST_UPDATE_CHECK_TIME, Long.toString(now.getTime()));
- final Locale defaultLocale = Locale.getDefault();
- final String language = defaultLocale.getLanguage();
- final String DEFAULT_LANGUAGE = "en";
- final String translatedWebUpdate = getWebUpdateUrl(language);
- final FreeplaneVersion localVersion = FreeplaneVersion.getVersion();
- final HttpVersionClient translatedVersionClient = new HttpVersionClient(translatedWebUpdate, localVersion);
- FreeplaneVersion lastTranslatedVersion = translatedVersionClient.getRemoteVersion();
- if (lastTranslatedVersion == null) {
- lastTranslatedVersion = localVersion;
- }
- final String history;
- final FreeplaneVersion lastVersion;
- final boolean connectSuccessfull;
- if (!language.equals(DEFAULT_LANGUAGE)) {
- final String defaultWebUpdate = getWebUpdateUrl(DEFAULT_LANGUAGE);
- final HttpVersionClient defaultVersionClient = new HttpVersionClient(defaultWebUpdate,
- lastTranslatedVersion);
- lastVersion = defaultVersionClient.getRemoteVersion();
- history = defaultVersionClient.getHistory() + translatedVersionClient.getHistory();
- connectSuccessfull = defaultVersionClient.isSuccessful();
- }
- else {
- lastVersion = lastTranslatedVersion;
- history = translatedVersionClient.getHistory();
- connectSuccessfull = translatedVersionClient.isSuccessful();
- }
-
- checkForAddonsUpdates();
- Controller.getCurrentController().getViewController().invokeLater(new Runnable() {
- public void run() {
- addUpdateButton(lastVersion);
- if (autoRun) {
- return;
- }
- showUpdateDialog(connectSuccessfull, localVersion, lastVersion, history);
- }
- });
- }
-
-
- // looking for new versions of add-ons
- // and store the latest version as a property
- private void checkForAddonsUpdates() {
- // loop on add-ons
- List<AddOnProperties> installedAddOns = AddOnsController.getController().getInstalledAddOns();
- LogUtils.info("checking for updates of " + installedAddOns.size() + " add-ons");
- for (AddOnProperties addOnProperties : installedAddOns) {
- FreeplaneVersion addOnLocalVersion = toFreeplaneVersion(addOnProperties.getVersion());
- // get the update-url for this add-on
- // append the current add-on version for
- // - statistics (appending a freeplane installation unique id would enable building add-on usage statistics)
- // - handling special cases ? (maybe we could send the freeplane version too)
- final URL updateUrl = addOnProperties.getUpdateUrl();
- if (updateUrl != null) {
- final String addOnUpdateRequest = updateUrl + "?v=" + addOnLocalVersion.toString();
- final HttpVersionClient versionClient = new HttpVersionClient(addOnUpdateRequest, addOnLocalVersion);
- final boolean connectSuccesfull;
- final FreeplaneVersion latestVersion = versionClient.getRemoteVersion();
-
- connectSuccesfull = versionClient.isSuccessful();
- if (connectSuccesfull) {
- addOnProperties.setLatestVersion(latestVersion.toString());
- if (versionClient.getRemoteVersionDownloadUrl() != null) {
- addOnProperties.setLatestVersionDownloadUrl(versionClient.getRemoteVersionDownloadUrl());
- }
- if (versionClient.getRemoteVersionChangelogUrl() != null) {
- addOnProperties.setLatestVersionChangelogUrl(versionClient.getRemoteVersionChangelogUrl());
- }
- }
- }
- }
- }
-
- private String getWebUpdateUrl(final String language) {
- {
- final String webUpdateUrl = ResourceController.getResourceController().getProperty(WEB_UPDATE_LOCATION_KEY);
- final FreeplaneVersion localVersion = FreeplaneVersion.getVersion();
- final StringBuilder sb = new StringBuilder(webUpdateUrl);
- final String type = localVersion.getType();
- if(! type.equals("")){
- sb.append(type);
- sb.append('/');
- }
- sb.append("history_");
- sb.append(language);
- sb.append(".txt");
- return sb.toString();
- }
- }
-
- private FreeplaneVersion getKnownNewVersion() {
- final FreeplaneVersion localVersion = FreeplaneVersion.getVersion();
- final String property = ResourceController.getResourceController().getProperty(LAST_UPDATE_VERSION);
- if (property.equals("")) {
- return null;
- }
-
- FreeplaneVersion lastVersion = FreeplaneVersion.getVersion(property);
- if (lastVersion.compareTo(localVersion) <= 0) {
- lastVersion = null;
- }
- return lastVersion;
- }
-
- private void setTimer() {
- if (autorunEnabled == false) {
- return;
- }
- autorunEnabled = ResourceController.getResourceController().getBooleanProperty(CHECK_UPDATES_AUTOMATICALLY);
- if (autorunEnabled == false) {
- return;
- }
- autorunEnabled = false;
- final Date now = new Date();
- final long nextCheckMillis = ResourceController.getResourceController().getLongProperty(LAST_UPDATE_CHECK_TIME,
- 0)
- + TWO_DAYS;
- final Date nextCheckDate = new Date(nextCheckMillis);
- if (now.before(nextCheckDate)) {
- final FreeplaneVersion knownNewVersion = getKnownNewVersion();
- addUpdateButton(knownNewVersion);
- return;
- }
- autorunTimer = new Timer(CHECK_TIME, this);
- autorunTimer.setRepeats(false);
- autorunTimer.start();
- }
-
-
- private void showUpdateDialog(final boolean connectSuccesfull, final FreeplaneVersion localVersion,
- final FreeplaneVersion newVersion, final String history) {
- if (connectSuccesfull == false) {
- showUpdateDialog("can_not_connect_to_info_server", newVersion, history);
- } else {
- showUpdateDialog("new_version_available", newVersion, history);
- }
-
- return;
- }
-
- private int showUpdateDialog(final String info, final FreeplaneVersion freeplaneLatestVersion, final String history) {
-
- // dialog layout
- // - messagePane (verticalBox)
- // |- gridPane (GridBagLayout)
- // Components | Installed version | Latestversion | Changelog button | Got to download button
- //
- // |- preferences label
- // |- checkbox for automatic update
-
- final Box messagePane = Box.createVerticalBox();
- final JLabel emptyLabel = new JLabel("");
-
- // grid setup
- final JPanel gridPane = new JPanel(new GridBagLayout());
- gridPane.setAlignmentX(JLabel.LEFT_ALIGNMENT);
-
- final Border paddingBorder = BorderFactory.createEmptyBorder(0, 10, 10, 0);
- gridPane.setBorder(BorderFactory.createCompoundBorder(paddingBorder,paddingBorder));
-
- final GridBagConstraints c = new GridBagConstraints();
- c.fill = GridBagConstraints.HORIZONTAL;
- int gridRow = 0;
- c.weightx = 0.5;
-
-
- // table headers
- final JLabel componentHeader = new JLabel(TextUtils.getText("updater.component"), SwingConstants.CENTER);
- final JLabel installedVersionHeader = new JLabel(TextUtils.getText("updater.version.installed"), SwingConstants.CENTER);
- final JLabel latestVersionHeader = new JLabel(TextUtils.getText("updater.version.latest"), SwingConstants.CENTER);
-
- final Font boldFont = new Font(componentHeader.getFont().getName(),Font.BOLD,componentHeader.getFont().getSize());
-
- componentHeader.setFont(boldFont);
- installedVersionHeader.setFont(boldFont);
- latestVersionHeader.setFont(boldFont);
-
- componentHeader.setBorder(paddingBorder);
- installedVersionHeader.setBorder(paddingBorder);
- latestVersionHeader.setBorder(paddingBorder);
-
- // adding headers
- c.gridy = 0;
-
- c.gridx = 0;
- gridPane.add(componentHeader, c);
- c.gridx = 1;
- gridPane.add(installedVersionHeader, c);
- c.gridx = 2;
- gridPane.add(latestVersionHeader, c);
- c.gridx = 3;
- gridPane.add(emptyLabel, c);
- c.gridx = 4;
- gridPane.add(emptyLabel, c);
-
- // first row : freeplane
- c.gridy = 1;
-
- final JLabel freeplaneLabel = new JLabel("Freeplane");
- final FreeplaneVersion freeplaneLocalVersion = FreeplaneVersion.getVersion();
- final JLabel freeplaneInstalledVersionLabel = new JLabel(freeplaneLocalVersion.toString(), SwingConstants.CENTER);
- final JLabel freeplaneLatestVersionLabel;
-
- JButton updateButton;
- JButton changelogButton;
- final Locale defaultLocale = Locale.getDefault();
- final String language = defaultLocale.getLanguage();
- final String translatedWebUpdate = getWebUpdateUrl(language);
-
- changelogButton = new JButton(TextUtils.getText("updater.viewChangelog"));
- changelogButton.addActionListener(openUrlListener);
- changelogButton.setActionCommand(translatedWebUpdate);
-
- updateButton = new JButton(TextUtils.getText("updater.goToDownload"));
- updateButton.addActionListener(openUrlListener);
- updateButton.setActionCommand("http://freeplane.sourceforge.net");
-
- Boolean needsUpdate = Boolean.FALSE;
- if (freeplaneLatestVersion != null) {
- if (freeplaneLocalVersion.compareTo(freeplaneLatestVersion) < 0) {
- needsUpdate = Boolean.TRUE;
- } else {
- needsUpdate = Boolean.FALSE;
- }
- freeplaneLatestVersionLabel = new JLabel(freeplaneLatestVersion.toString(), SwingConstants.CENTER);
- } else {
- freeplaneLatestVersionLabel = new JLabel(TextUtils.getText("updater.version.unknown"), SwingConstants.CENTER);
- freeplaneLatestVersionLabel.setToolTipText(TextUtils.getText(info));
- }
- changelogButton.setEnabled(needsUpdate);
- updateButton.setEnabled(needsUpdate);
-
- c.gridx = 0;
- gridPane.add(freeplaneLabel, c);
- c.gridx = 1;
- gridPane.add(freeplaneInstalledVersionLabel, c);
- c.gridx = 2;
- gridPane.add(freeplaneLatestVersionLabel, c);
- c.gridx = 3;
- gridPane.add(changelogButton, c);
- c.gridx = 4;
- gridPane.add(updateButton, c);
-
-
- final List<AddOnProperties> installedAddOns = AddOnsController.getController().getInstalledAddOns();
- gridRow = 3;
- for (AddOnProperties addOnProperties : installedAddOns) {
- FreeplaneVersion addOnLocalVersion = toFreeplaneVersion(addOnProperties.getVersion());
- FreeplaneVersion addOnLatestVersion = toFreeplaneVersion(addOnProperties.getLatestVersion());
-
- final JLabel addOnInstalledVersionLabel = new JLabel(addOnLocalVersion.toString(), SwingConstants.CENTER);
- final JLabel addOnLatestVersionLabel;
- needsUpdate = Boolean.FALSE;
- if (addOnLatestVersion != null) {
- if (addOnLocalVersion.compareTo(addOnLatestVersion) < 0) {
- needsUpdate = Boolean.TRUE;
- }
- addOnLatestVersionLabel = new JLabel(addOnLatestVersion.toString(), SwingConstants.CENTER);
- } else {
- addOnLatestVersionLabel = new JLabel(TextUtils.getText("updater.version.unknown"), SwingConstants.CENTER);
- if (addOnProperties.getUpdateUrl() != null) {
- addOnLatestVersionLabel.setToolTipText(TextUtils.getText("updater.version.unreachable") + " " + addOnProperties.getUpdateUrl());
- } else {
- addOnLatestVersionLabel.setToolTipText(TextUtils.getText("updater.version.noUpdateUrl"));
- }
- }
-
- final JLabel addOnLabel = new JLabel(TextUtils.getText("addons." + addOnProperties.getName()));
- c.gridx = 0;
- c.gridy = gridRow;
- gridPane.add(addOnLabel, c);
-
- c.gridx = 1;
- c.gridy = gridRow;
- gridPane.add(addOnInstalledVersionLabel, c);
-
- c.gridx = 2;
- c.gridy = gridRow;
- gridPane.add(addOnLatestVersionLabel, c);
-
- c.gridx = 3;
- c.gridy = gridRow;
- changelogButton = new JButton(TextUtils.getText("updater.viewChangelog"));
- changelogButton.addActionListener(openUrlListener);
- if (addOnProperties.getLatestVersionChangelogUrl() != null) {
- changelogButton.setActionCommand(addOnProperties.getLatestVersionChangelogUrl().toString());
- } else if (addOnProperties.getUpdateUrl() != null) {
- changelogButton.setActionCommand(String.valueOf(addOnProperties.getUpdateUrl()));
- }
- gridPane.add(changelogButton,c );
- changelogButton.setEnabled(needsUpdate);
-
- c.gridx = 4;
- c.gridy = gridRow;
- updateButton = new JButton(TextUtils.getText("updater.goToDownload"));
- updateButton.addActionListener(openUrlListener);
- if (addOnProperties.getLatestVersionDownloadUrl() != null) {
- updateButton.setActionCommand(addOnProperties.getLatestVersionDownloadUrl().toString());
- } else if (addOnProperties.getHomepage() != null) {
- updateButton.setActionCommand(addOnProperties.getHomepage().toString());
- }
- gridPane.add(updateButton, c);
- updateButton.setEnabled(needsUpdate);
-
- gridRow++;
- }
- messagePane.add(gridPane);
-
-
- final JLabel confLabel = new JLabel(TextUtils.getText("preferences"));
- confLabel.setFont(boldFont);
- messagePane.add(confLabel);
- final JCheckBox updateAutomatically = new JCheckBox(TextUtils
- .getText("OptionPanel.check_updates_automatically"), ResourceController.getResourceController()
- .getBooleanProperty(CHECK_UPDATES_AUTOMATICALLY));
- updateAutomatically.setAlignmentX(JLabel.LEFT_ALIGNMENT);
- messagePane.add(updateAutomatically);
- final Object[] options;
- options = new Object[] { TextUtils.getText("simplyhtml.closeBtnName") };
-
-
- final int choice = JOptionPane.showOptionDialog(Controller.getCurrentController().getViewController().getFrame(), messagePane,
- TextUtils.getText("updatecheckdialog"), JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null,
- options, options[0]);
- ResourceController.getResourceController().setProperty(CHECK_UPDATES_AUTOMATICALLY,
- Boolean.toString(updateAutomatically.isSelected()));
- return choice;
- }
-
- // note: FreeplaneVersion.getVersion() handles leading 'v' gracefully
- private FreeplaneVersion toFreeplaneVersion(String versionString) {
- try {
- return FreeplaneVersion.getVersion(versionString);
- } catch (Exception e) {
- return FreeplaneVersion.getVersion("0.0.0");
- }
- }
-
-
- private ActionListener openUrlListener = new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- try {
- Controller.getCurrentController().getViewController().openDocument(
- new URL( ((JButton) e.getSource()).getActionCommand()) );
- }
- catch (final MalformedURLException ex) {
- UITools.errorMessage(TextUtils.getText("url_error") + "\n" + ex);
- }
- catch (final Exception ex) {
- UITools.errorMessage(ex);
- }
- }
- };
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/main/application/UserPropertiesUpdater.java b/freeplane/src/org/freeplane/main/application/UserPropertiesUpdater.java
deleted file mode 100644
index 812b661..0000000
--- a/freeplane/src/org/freeplane/main/application/UserPropertiesUpdater.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2010 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application;
-
-import java.awt.Font;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-import javax.swing.JLabel;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.edge.EdgeModel;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.nodestyle.NodeSizeModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.features.note.mindmapmode.MNoteController;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-
-/**
- * @author Dimitry Polivaev
- * Nov 1, 2010
- */
-public class UserPropertiesUpdater {
-
-
- private static final String ORG_FREEPLANE_OLD_USERFPDIR = "org.freeplane.old_userfpdir";
-
- void importOldProperties(){
- final File userPreferencesFile = ApplicationResourceController.getUserPreferencesFile();
- if(userPreferencesFile.exists()){
- return;
- }
- copyUserFilesFromPreviousVersionTo(userPreferencesFile.getParentFile());
- if(userPreferencesFile.exists()){
- removeOpenedMaps(userPreferencesFile);
- return;
- }
- final File oldUserPreferencesFile =new File(System.getProperty("user.home"), ".freeplane/auto.properties");
- if(! oldUserPreferencesFile.exists()){
- return;
- }
- importOldPreferences(userPreferencesFile, oldUserPreferencesFile);
- importOldIcons();
- }
-
- private void copyUserFilesFromPreviousVersionTo(File targetDirectory) {
- final File parentDirectory = targetDirectory.getParentFile();
- final String previousDirName = "1.2.x";
- final File sourceDirectory;
- String old_userfpdir = System.getProperty(ORG_FREEPLANE_OLD_USERFPDIR);
- if (isDefined(old_userfpdir))
- sourceDirectory = new File(old_userfpdir, previousDirName);
- else
- sourceDirectory = new File(parentDirectory, previousDirName);
- if (sourceDirectory.exists() && !sourceDirectory.getAbsolutePath().equals(targetDirectory.getAbsolutePath())) {
- try {
- parentDirectory.mkdirs();
- org.apache.commons.io.FileUtils.copyDirectory(sourceDirectory, targetDirectory);
- }
- catch (IOException e) {
- }
- return;
- }
- }
-
- private boolean isDefined(String old_userfpdir) {
- return old_userfpdir != null;
- }
-
- private void importOldPreferences(final File userPreferencesFile,
- final File oldUserPreferencesFile) {
- try {
- Properties userProp = loadProperties(userPreferencesFile);
- userProp.remove("lastOpened_1.0.20");
- userProp.remove("openedNow_1.0.20");
- userProp.remove("browse_url_storage");
- fixFontSize(userProp, "defaultfontsize");
- fixFontSize(userProp, "label_font_size");
- saveProperties(userProp, userPreferencesFile);
- }
- catch (IOException e) {
- }
- }
-
- private void removeOpenedMaps(File userPreferencesFile) {
- try {
- Properties userProp = loadProperties(userPreferencesFile);
- userProp.remove("lastOpened_1.0.20");
- userProp.remove("openedNow_1.0.20");
- userProp.remove("browse_url_storage");
- userProp.remove("single_backup_directory_path");
- saveProperties(userProp, userPreferencesFile);
- }
- catch (IOException e) {
- }
- }
-
- Properties loadProperties(File userPreferencesFile) throws IOException {
- FileInputStream inputStream = null;
- Properties userProp = new Properties();
- try{
- inputStream = new FileInputStream(userPreferencesFile);
- userProp.load(inputStream);
- }
- finally {
- org.freeplane.core.util.FileUtils.silentlyClose(inputStream);
- }
- return userProp;
- }
-
- void saveProperties(Properties userProp, File userPreferencesFile) throws IOException {
- FileOutputStream outputStream = null;
- try{
- outputStream = new FileOutputStream(userPreferencesFile);
- userProp.store(outputStream, null);
- }
- finally {
- org.freeplane.core.util.FileUtils.silentlyClose(outputStream);
- }
- }
-
- private void fixFontSize(Properties userProp, String name) {
- final Object defaultFontSizeObj = userProp.remove(name);
- if(defaultFontSizeObj == null)
- return;
- try {
- int oldDefaultFontSize = Integer.parseInt(defaultFontSizeObj.toString());
- int newDefaultFontSize = Math.round(oldDefaultFontSize / UITools.FONT_SCALE_FACTOR);
- userProp.put(name, Integer.toString(newDefaultFontSize));
- }
- catch (NumberFormatException e) {
- }
- }
-
- void importOldDefaultStyle() {
- final ModeController modeController = Controller.getCurrentController().getModeController(MModeController.MODENAME);
- MFileManager fm = MFileManager.getController(modeController);
- final String standardTemplateName = fm.getStandardTemplateName();
- final File userDefault;
- final File absolute = new File(standardTemplateName);
- if(absolute.isAbsolute())
- userDefault = absolute;
- else{
- final File userTemplates = fm.defaultUserTemplateDir();
- userDefault= new File(userTemplates, standardTemplateName);
- }
- if(userDefault.exists()){
- return;
- }
- userDefault.getParentFile().mkdirs();
- if(! userDefault.getParentFile().exists()){
- return;
- }
- MapModel defaultStyleMap = new MapModel();
- final File allUserTemplates = fm.defaultStandardTemplateDir();
- final File standardTemplate = new File(allUserTemplates, "standard.mm");
- try {
- fm.loadCatchExceptions(standardTemplate.toURL(), defaultStyleMap);
- }
- catch (Exception e) {
- LogUtils.warn(e);
- try {
- fm.loadCatchExceptions(ResourceController.getResourceController().getResource("/styles/viewer_standard.mm"), defaultStyleMap);
- }
- catch (Exception e2) {
- defaultStyleMap.createNewRoot();
- LogUtils.severe(e);
- }
- }
- final NodeStyleController nodeStyleController = NodeStyleController.getController(modeController);
- updateDefaultStyle(nodeStyleController, defaultStyleMap);
- updateNoteStyle(nodeStyleController, defaultStyleMap);
-
- try {
- fm.writeToFile(defaultStyleMap, userDefault);
- }
- catch (IOException e) {
- }
-
-
- }
- private void updateDefaultStyle(final NodeStyleController nodeStyleController, MapModel defaultStyleMap) {
- NodeModel styleNode1 = MapStyleModel.getExtension(defaultStyleMap).getStyleNode(MapStyleModel.DEFAULT_STYLE);
- NodeModel styleNode = styleNode1;
- styleNode.removeExtension(NodeStyleModel.class);
- styleNode.removeExtension(EdgeModel.class);
-
- final NodeStyleModel nodeStyleModel = new NodeStyleModel();
-
- nodeStyleModel.setBackgroundColor(nodeStyleController.getBackgroundColor(styleNode));
- nodeStyleModel.setBold(nodeStyleController.isBold(styleNode));
- nodeStyleModel.setColor(nodeStyleController.getColor(styleNode));
- nodeStyleModel.setFontFamilyName(nodeStyleController.getFontFamilyName(styleNode));
- nodeStyleModel.setFontSize(nodeStyleController.getFontSize(styleNode));
- nodeStyleModel.setItalic(nodeStyleController.isItalic(styleNode));
- nodeStyleModel.setShape(nodeStyleController.getShape(styleNode));
-
- styleNode.addExtension(nodeStyleModel);
-
- final NodeSizeModel nodeSizeModel = new NodeSizeModel();
- nodeSizeModel.setMaxNodeWidth(nodeStyleController.getMaxWidth(styleNode));
- nodeSizeModel.setMinNodeWidth(nodeStyleController.getMinWidth(styleNode));
-
- final EdgeModel standardEdgeModel = EdgeModel.getModel(styleNode);
- if(standardEdgeModel != null){
- final EdgeModel edgeModel = new EdgeModel();
- edgeModel.setColor(standardEdgeModel.getColor());
- edgeModel.setStyle(standardEdgeModel.getStyle());
- edgeModel.setWidth(standardEdgeModel.getWidth());
- styleNode.addExtension(edgeModel);
- }
- }
-
- private void updateNoteStyle(final NodeStyleController nodeStyleController, MapModel defaultStyleMap) {
- if (ResourceController.getResourceController().getBooleanProperty((MNoteController.RESOURCES_USE_DEFAULT_FONT_FOR_NOTES_TOO)))
- return;
- final NodeModel styleNode = MapStyleModel.getExtension(defaultStyleMap).getStyleNode(MapStyleModel.NOTE_STYLE);
- if(styleNode == null)
- return;
- styleNode.removeExtension(NodeStyleModel.class);
- final Font defaultFont = new JLabel().getFont();
- final NodeStyleModel nodeStyleModel = new NodeStyleModel();
- nodeStyleModel.setFontFamilyName(defaultFont.getFamily());
- nodeStyleModel.setFontSize(defaultFont.getSize());
- styleNode.addExtension(nodeStyleModel);
- }
-
- private void importOldIcons() {
- final File oldUserPreferencesFile =new File(System.getProperty("user.home"), ".freeplane/auto.properties");
- if(! oldUserPreferencesFile.exists()){
- return;
- }
- final File userPreferencesFile = ApplicationResourceController.getUserPreferencesFile();
- final File iconDir = new File(userPreferencesFile.getParentFile(), "icons");
- if (iconDir.exists()) {
- return;
- }
- LogUtils.info("creating user icons directory " + iconDir);
- iconDir.mkdirs();
- final File oldIconDir = new File(oldUserPreferencesFile.getParentFile(), "icons");
- if(oldIconDir.exists()){
- try {
- org.apache.commons.io.FileUtils.copyDirectory(oldIconDir, iconDir);
- } catch (Exception e) {
- }
- }
- }
-}
-
diff --git a/freeplane/src/org/freeplane/main/application/protocols/freeplaneresource/Handler.java b/freeplane/src/org/freeplane/main/application/protocols/freeplaneresource/Handler.java
deleted file mode 100644
index 91de77f..0000000
--- a/freeplane/src/org/freeplane/main/application/protocols/freeplaneresource/Handler.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.application.protocols.freeplaneresource;
-
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLStreamHandler;
-
-import org.freeplane.core.resources.ResourceController;
-
-/** A {@link URLStreamHandler} that handles resources on the classpath. */
-public class Handler extends URLStreamHandler {
-
- public Handler(ClassLoader classLoader) {
- }
-
- @Override
- protected URLConnection openConnection(URL u) throws IOException {
- final URL resourceUrl = ResourceController.getResourceController().getResource(u.getPath());
- return resourceUrl.openConnection();
- }
-}
diff --git a/freeplane/src/org/freeplane/main/browsemode/BModeControllerFactory.java b/freeplane/src/org/freeplane/main/browsemode/BModeControllerFactory.java
deleted file mode 100644
index 6204f47..0000000
--- a/freeplane/src/org/freeplane/main/browsemode/BModeControllerFactory.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.browsemode;
-
-import java.security.AccessControlException;
-
-import javax.swing.JPopupMenu;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.ui.components.FreeplaneToolBar;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.cloud.CloudController;
-import org.freeplane.features.edge.EdgeController;
-import org.freeplane.features.encrypt.EncryptionController;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.SummaryNode;
-import org.freeplane.features.map.FoldingController;
-import org.freeplane.features.mapio.MapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.browsemode.BModeController;
-import org.freeplane.features.nodelocation.LocationController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.styles.AutomaticLayoutController;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.view.swing.features.filepreview.ViewerController;
-import org.freeplane.view.swing.ui.UserInputListenerFactory;
-
-/**
- * @author Dimitry Polivaev 24.11.2008
- */
-public class BModeControllerFactory {
- private static BModeController modeController;
-
- static public BModeController createModeController() {
- final Controller controller = Controller.getCurrentController();
- modeController = new BModeController(controller);
- final UserInputListenerFactory userInputListenerFactory = new UserInputListenerFactory(modeController);
- modeController.setUserInputListenerFactory(userInputListenerFactory);
- controller.addModeController(modeController);
- controller.selectModeForBuild(modeController);
- new MapController(modeController);
- IconController.install(new IconController(modeController));
- UrlManager.install(new UrlManager());
- MapIO.install(modeController);
- AttributeController.install(new AttributeController(modeController));
- NodeStyleController.install(new NodeStyleController(modeController));
- EdgeController.install(new EdgeController(modeController));
- CloudController.install(new CloudController(modeController));
- NoteController.install(new NoteController());
- TextController.install(new TextController(modeController));
- LinkController.install(new LinkController());
- LogicalStyleController.install(new LogicalStyleController(modeController));
- try {
- ClipboardController.install(new ClipboardController());
- }
- catch (final AccessControlException e) {
- LogUtils.warn("can not access system clipboard, clipboard controller disabled");
- }
- LocationController.install(new LocationController());
- SummaryNode.install();
- FreeNode.install();
- MapStyle.install(true);
- final BToolbarContributor toolbarContributor = new BToolbarContributor();
- modeController.addMenuContributor(toolbarContributor);
- controller.getMapViewManager().addMapViewChangeListener(toolbarContributor);
- userInputListenerFactory.setNodePopupMenu(new JPopupMenu());
- final FreeplaneToolBar toolBar = new FreeplaneToolBar("main_toolbar", SwingConstants.HORIZONTAL);
- toolBar.putClientProperty(ViewController.VISIBLE_PROPERTY_KEY, "toolbarVisible");
- userInputListenerFactory.addToolBar("/main_toolbar", ViewController.TOP, toolBar);
- userInputListenerFactory.addToolBar("/filter_toolbar", ViewController.TOP, FilterController.getController(
- controller).getFilterToolbar());
- userInputListenerFactory.addToolBar("/status", ViewController.BOTTOM, controller.getViewController()
- .getStatusBar());
- FoldingController.install(new FoldingController());
- new ViewerController();
- EncryptionController.install(new EncryptionController(modeController));
- new AutomaticLayoutController();
- return modeController;
- }
-}
diff --git a/freeplane/src/org/freeplane/main/browsemode/BToolbarContributor.java b/freeplane/src/org/freeplane/main/browsemode/BToolbarContributor.java
deleted file mode 100644
index 405d8c1..0000000
--- a/freeplane/src/org/freeplane/main/browsemode/BToolbarContributor.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.browsemode;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.net.URL;
-
-import javax.swing.JLabel;
-
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.PersistentEditableComboBox;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.features.ui.IMapViewManager;
-
-class BToolbarContributor implements IMenuContributor, IMapViewChangeListener {
- private static final String BROWSE_URL_STORAGE_KEY = "browse_url_storage";
-// final private ModeController modeController;
- private PersistentEditableComboBox urlfield = null;
-
- public BToolbarContributor() {
- urlfield = new PersistentEditableComboBox(BROWSE_URL_STORAGE_KEY, 20);
- urlfield.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent e) {
- final String urlText = urlfield.getText();
- if ("".equals(urlText) || e.getActionCommand().equals("comboBoxEdited")) {
- return;
- }
- try {
- Controller.getCurrentModeController().getMapController().newMap(new URL(urlText));
- }
- catch (final Exception e1) {
- LogUtils.warn(e1);
- }
- }
- });
- }
-
- public void afterViewChange(final Component oldView, final Component newView) {
- if (newView == null) {
- return;
- }
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- mapViewManager.getModeController(newView);
- final MapModel map = mapViewManager.getModel(newView);
- final URL url = map.getURL();
- if (url == null) {
- return;
- }
- setURLField(url.toString());
- }
-
- public void afterViewClose(final Component oldView) {
- }
-
- public void afterViewCreated(final Component mapView) {
- }
-
- public void beforeViewChange(final Component oldView, final Component newView) {
- }
-
- private void setURLField(final String text) {
- urlfield.setText(text);
- }
-
- public void updateMenus(final ModeController modeController, final MenuBuilder builder) {
- builder.addElement("main_toolbar_url", new JLabel("URL:"), MenuBuilder.AS_CHILD);
- builder.addElement("main_toolbar_url", urlfield, MenuBuilder.AS_CHILD);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/filemode/FModeControllerFactory.java b/freeplane/src/org/freeplane/main/filemode/FModeControllerFactory.java
deleted file mode 100644
index 6fbc8a3..0000000
--- a/freeplane/src/org/freeplane/main/filemode/FModeControllerFactory.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.filemode;
-
-import javax.swing.JPopupMenu;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.ui.components.FreeplaneToolBar;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.cloud.CloudController;
-import org.freeplane.features.edge.EdgeController;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.filemode.CenterAction;
-import org.freeplane.features.map.filemode.FMapController;
-import org.freeplane.features.map.filemode.OpenPathAction;
-import org.freeplane.features.mapio.MapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.IPropertyHandler;
-import org.freeplane.features.mode.filemode.FModeController;
-import org.freeplane.features.nodelocation.LocationController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.view.swing.features.nodehistory.NodeHistory;
-import org.freeplane.view.swing.ui.UserInputListenerFactory;
-
-/**
- * @author Dimitry Polivaev 24.11.2008
- */
-public class FModeControllerFactory {
- static private FModeController modeController;
-
- static public FModeController createModeController() {
- final Controller controller = Controller.getCurrentController();
- modeController = new FModeController(controller);
- final UserInputListenerFactory userInputListenerFactory = new UserInputListenerFactory(modeController);
- modeController.setUserInputListenerFactory(userInputListenerFactory);
- controller.addModeController(modeController);
- controller.selectModeForBuild(modeController);
- new FMapController(modeController);
- UrlManager.install(new UrlManager());
- MapIO.install(modeController);
- IconController.install(new IconController(modeController));
- NodeStyleController.install(new NodeStyleController(modeController));
- EdgeController.install(new EdgeController(modeController));
- TextController.install(new TextController(modeController));
- LinkController.install(new LinkController());
- CloudController.install(new CloudController(modeController));
- ClipboardController.install(new ClipboardController());
- LocationController.install(new LocationController());
- LogicalStyleController.install(new LogicalStyleController(modeController));
- MapStyle.install(true);
- NodeStyleController.getController().addShapeGetter(new Integer(0),
- new IPropertyHandler<String, NodeModel>() {
- public String getProperty(final NodeModel node, final String currentValue) {
- return "fork";
- }
- });
- modeController.addAction(new CenterAction());
- modeController.addAction(new OpenPathAction());
- userInputListenerFactory.setNodePopupMenu(new JPopupMenu());
- final FreeplaneToolBar toolBar = new FreeplaneToolBar("main_toolbar", SwingConstants.HORIZONTAL);
- toolBar.putClientProperty(ViewController.VISIBLE_PROPERTY_KEY, "toolbarVisible");
- userInputListenerFactory.addToolBar("/main_toolbar", ViewController.TOP, toolBar);
- userInputListenerFactory.addToolBar("/filter_toolbar", ViewController.TOP, FilterController.getCurrentFilterController().getFilterToolbar());
- userInputListenerFactory.addToolBar("/status", ViewController.BOTTOM, controller.getViewController().getStatusBar());
- NodeHistory.install(modeController);
- return modeController;
- }
-}
diff --git a/freeplane/src/org/freeplane/main/headlessmode/FreeplaneHeadlessStarter.java b/freeplane/src/org/freeplane/main/headlessmode/FreeplaneHeadlessStarter.java
deleted file mode 100644
index a3622fb..0000000
--- a/freeplane/src/org/freeplane/main/headlessmode/FreeplaneHeadlessStarter.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.headlessmode;
-
-import java.awt.EventQueue;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Collections;
-import java.util.Set;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.attribute.ModelessAttributeController;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.ScannerController;
-import org.freeplane.features.help.HelpController;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.print.PrintController;
-import org.freeplane.features.styles.LogicalStyleFilterController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.time.TimeController;
-import org.freeplane.main.application.ApplicationResourceController;
-import org.freeplane.main.application.FreeplaneGUIStarter;
-import org.freeplane.main.application.FreeplaneSecurityManager;
-import org.freeplane.main.application.FreeplaneStarter;
-import org.freeplane.main.browsemode.BModeControllerFactory;
-import org.freeplane.main.filemode.FModeControllerFactory;
-import org.freeplane.main.mindmapmode.MModeControllerFactory;
-import org.freeplane.view.swing.features.nodehistory.NodeHistory;
-
-public class FreeplaneHeadlessStarter implements FreeplaneStarter {
-
- private ApplicationResourceController applicationResourceController;
-// // private Controller controller;
- /** allows to disable loadLastMap(s) if there already is a second instance running. */
- public FreeplaneHeadlessStarter() {
- super();
- applicationResourceController = new ApplicationResourceController();
- }
-
- public void setDontLoadLastMaps() {
- }
-
- public Controller createController() {
- try {
- Controller controller = new Controller(applicationResourceController);
- Controller.setCurrentController(controller);
- applicationResourceController.init();
- LogUtils.createLogger();
- FreeplaneGUIStarter.showSysInfo();
- final HeadlessMapViewController mapViewController = new HeadlessMapViewController();
- controller.setMapViewManager(mapViewController);
- controller.setViewController(new HeadlessUIController());
- System.setSecurityManager(new FreeplaneSecurityManager());
- FilterController.install();
- FormatController.install(new FormatController());
- final ScannerController scannerController = new ScannerController();
- ScannerController.install(scannerController);
- scannerController.addParsersForStandardFormats();
- ModelessAttributeController.install();
- TextController.install();
- TimeController.install();
- LinkController.install();
- IconController.install();
- HelpController.install();
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(7,
- new LogicalStyleFilterController());
- MapController.install();
-
- NodeHistory.install(controller);
- return controller;
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- throw new RuntimeException(e);
- }
- }
-
- public void createModeControllers(final Controller controller) {
- HeadlessMModeControllerFactory.createModeController();
- controller.getModeController(MModeController.MODENAME).getMapController().addMapChangeListener(
- applicationResourceController.getLastOpenedList());
- }
-
- public void buildMenus(final Controller controller, final Set<String> plugins) {
- }
-
-
- public void createFrame(final String[] args) {
- Controller controller = Controller.getCurrentController();
- ModeController modeController = controller.getModeController(MModeController.MODENAME);
- controller.selectModeForBuild(modeController);
- }
-
- /**
- */
- public void run(final String[] args) {
- try {
- if (null == System.getProperty("org.freeplane.core.dir.lib", null)) {
- System.setProperty("org.freeplane.core.dir.lib", "/lib/");
- }
- final Controller controller = createController();
- createModeControllers(controller);
- FilterController.getController(controller).loadDefaultConditions();
- final Set<String> emptySet = Collections.emptySet();
- buildMenus(controller, emptySet);
- createFrame(args);
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- System.exit(1);
- }
- }
-
- public void stop() {
- }
-
- public ResourceController getResourceController() {
- return applicationResourceController;
- }
-
- public void loadMapsLater(String[] args) {
- // TODO Auto-generated method stub
-
- }
-}
diff --git a/freeplane/src/org/freeplane/main/headlessmode/HeadlessMModeControllerFactory.java b/freeplane/src/org/freeplane/main/headlessmode/HeadlessMModeControllerFactory.java
deleted file mode 100644
index b7ad839..0000000
--- a/freeplane/src/org/freeplane/main/headlessmode/HeadlessMModeControllerFactory.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.headlessmode;
-
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.mindmapmode.MAttributeController;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.clipboard.mindmapmode.MClipboardController;
-import org.freeplane.features.cloud.CloudController;
-import org.freeplane.features.cloud.mindmapmode.MCloudController;
-import org.freeplane.features.edge.EdgeController;
-import org.freeplane.features.edge.mindmapmode.AutomaticEdgeColorHook;
-import org.freeplane.features.edge.mindmapmode.MEdgeController;
-import org.freeplane.features.encrypt.mindmapmode.MEncryptionController;
-import org.freeplane.features.export.mindmapmode.ExportController;
-import org.freeplane.features.export.mindmapmode.ImportMindmanagerFiles;
-import org.freeplane.features.icon.HierarchicalIcons;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.mindmapmode.MIconController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.AlwaysUnfoldedNode;
-import org.freeplane.features.map.FoldingController;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.SummaryNode;
-import org.freeplane.features.map.mindmapmode.ChangeNodeLevelController;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mapio.mindmapmode.MMapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.nodelocation.LocationController;
-import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
-import org.freeplane.features.nodestyle.mindmapmode.RevisionPlugin;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.note.mindmapmode.MNoteController;
-import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
-import org.freeplane.features.styles.AutomaticLayoutController;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.time.CreationModificationPlugin;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-import org.freeplane.view.swing.features.BlinkingNodeHook;
-import org.freeplane.view.swing.features.filepreview.ViewerController;
-import org.freeplane.view.swing.features.nodehistory.NodeHistory;
-import org.freeplane.view.swing.features.progress.mindmapmode.ProgressFactory;
-import org.freeplane.view.swing.map.attribute.EditAttributesAction;
-
-/**
- * @author Dimitry Polivaev 24.11.2008
- */
-public class HeadlessMModeControllerFactory {
- private static HeadlessMModeControllerFactory instance;
-
- public static MModeController createModeController() {
- return HeadlessMModeControllerFactory.getInstance().createModeControllerImpl();
- }
-
- private static HeadlessMModeControllerFactory getInstance() {
- if (instance == null) {
- instance = new HeadlessMModeControllerFactory();
- }
- return instance;
- }
-
-// // private Controller controller;
- private MModeController modeController;
-
- private void createAddIns() {
- new HierarchicalIcons();
- new AutomaticLayoutController();
- new BlinkingNodeHook();
- SummaryNode.install();
- AlwaysUnfoldedNode.install();
- FreeNode.install();
- new CreationModificationPlugin();
- new AutomaticEdgeColorHook();
- new ViewerController();
- MEncryptionController.install(new MEncryptionController(modeController));
- new ChangeNodeLevelController(modeController);
- NodeHistory.install(modeController);
- modeController.addAction(new ImportMindmanagerFiles());
- }
-
- private MModeController createModeControllerImpl() {
-// this.controller = controller;
- createStandardControllers();
- createAddIns();
- return modeController;
- }
-
- private void createStandardControllers() {
- final Controller controller = Controller.getCurrentController();
- modeController = new MModeController(controller);
- controller.addModeController(modeController);
- controller.selectModeForBuild(modeController);
- new MMapController(modeController);
- final MFileManager fileManager = new MFileManager();
- UrlManager.install(fileManager);
- MMapIO.install(modeController);
- controller.getMapViewManager().addMapViewChangeListener(fileManager);
- IconController.install(new MIconController(modeController));
- new ProgressFactory().installActions(modeController);
- EdgeController.install(new MEdgeController(modeController));
- CloudController.install(new MCloudController(modeController));
- NoteController.install(new MNoteController(modeController));
- final MTextController textController = new MTextController(modeController);
- TextController.install(textController);
- LinkController.install(new MLinkController(modeController));
- NodeStyleController.install(new MNodeStyleController(modeController));
- ClipboardController.install(new MClipboardController());
- LocationController.install(new MLocationController());
- final MLogicalStyleController logicalStyleController = new MLogicalStyleController(modeController);
- LogicalStyleController.install(logicalStyleController);
- logicalStyleController.initM();
- AttributeController.install(new MAttributeController(modeController));
- modeController.addAction(new EditAttributesAction());
- SpellCheckerController.install(modeController);
- ExportController.install(new ExportController("/xml/ExportWithXSLT.xml"));
- MapStyle.install(true);
- new RevisionPlugin();
- FoldingController.install(new FoldingController());
- }
-}
diff --git a/freeplane/src/org/freeplane/main/headlessmode/HeadlessMapViewController.java b/freeplane/src/org/freeplane/main/headlessmode/HeadlessMapViewController.java
deleted file mode 100644
index 9751c10..0000000
--- a/freeplane/src/org/freeplane/main/headlessmode/HeadlessMapViewController.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.headlessmode;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.image.RenderedImage;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.JScrollPane;
-
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.view.swing.map.MapView;
-
-/**
- * @author Dimitry Polivaev
- * 24.12.2012
- */
-public class HeadlessMapViewController implements IMapViewManager {
- final private Map<String, MapModel> maps = new HashMap<String, MapModel>();
- Collection<IMapSelectionListener> mapSelectionListeners = new ArrayList<IMapSelectionListener>();
- private MapModel currentMap = null;
- private String currentKey = null;
-
- public void addMapSelectionListener(IMapSelectionListener pListener) {
- mapSelectionListeners.add(pListener);
- }
-
- public void addMapViewChangeListener(IMapViewChangeListener pListener) {
-
- }
-
- public boolean changeToMapView(Component newMapView) {
- throw new RuntimeException("Method not implemented");
- }
-
- public boolean changeToMapView(String mapViewDisplayName) {
- if(mapViewDisplayName != null && maps.containsKey(mapViewDisplayName)) {
- final MapModel nextMap = maps.get(mapViewDisplayName);
- MapModel oldMap = currentMap;
- for(IMapSelectionListener mapSelectionListener : mapSelectionListeners)
- mapSelectionListener.beforeMapChange(oldMap, nextMap);
- currentKey = mapViewDisplayName;
- currentMap = nextMap;
- for(IMapSelectionListener mapSelectionListener : mapSelectionListeners)
- mapSelectionListener.afterMapChange(oldMap, nextMap);
- return true;
- }
- else
- return false;
- }
-
- public boolean changeToMode(String modeName) {
- throw new RuntimeException("Method not implemented");
- }
-
- public String checkIfFileIsAlreadyOpened(URL urlToCheck) throws MalformedURLException {
- final String key = urlToCheck.toString();
- if(maps.containsKey(key))
- return key;
- else
- return null;
- }
-
- public boolean close(boolean withoutSave) {
- if(currentMap == null)
- return false;
- maps.remove(currentKey);
- currentKey = null;
- currentMap = null;
- return true;
- }
-
- public String createHtmlMap() {
- throw new RuntimeException("Method not implemented");
- }
-
- public RenderedImage createImage(int dpi) {
- throw new RuntimeException("Method not implemented");
- }
-
- public Color getBackgroundColor(NodeModel node) {
- throw new RuntimeException("Method not implemented");
- }
-
- public Component getComponent(NodeModel node) {
- throw new RuntimeException("Method not implemented");
- }
-
- public Font getFont(NodeModel node) {
- throw new RuntimeException("Method not implemented");
- }
-
- public List<String> getMapKeys() {
- throw new RuntimeException("Method not implemented");
- }
-
- public Map<String, MapModel> getMaps() {
- return maps;
- }
-
- public IMapSelection getMapSelection() {
- throw new RuntimeException("Method not implemented");
- }
-
- public Component getMapViewComponent() {
- throw new RuntimeException("Method not implemented");
- }
-
- public List<? extends Component> getMapViewVector() {
- return Collections.emptyList();
- }
-
- public ModeController getModeController(Component newMap) {
- throw new RuntimeException("Method not implemented");
- }
-
- public MapModel getModel() {
- return currentMap;
- }
-
- public MapModel getModel(Component mapView) {
- throw new RuntimeException("Method not implemented");
- }
-
- public Component getSelectedComponent() {
- throw new RuntimeException("Method not implemented");
- }
-
- public Color getTextColor(NodeModel node) {
- throw new RuntimeException("Method not implemented");
- }
-
- public float getZoom() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void newMapView(MapModel map, ModeController modeController) {
- final String key = map.getURL().toString();
- if(key.equals(currentKey))
- close(true);
- maps.put(key, map);
- changeToMapView(key);
- }
-
- public void nextMapView() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void previousMapView() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void removeMapSelectionListener(IMapSelectionListener pListener) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void removeMapViewChangeListener(IMapViewChangeListener pListener) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void scrollNodeToVisible(NodeModel node) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void setZoom(float zoom) {
- throw new RuntimeException("Method not implemented");
- }
-
- public boolean tryToChangeToMapView(String mapView) {
- return changeToMapView(mapView);
- }
-
- public boolean tryToChangeToMapView(URL url) throws MalformedURLException {
- if(url == null)
- return false;
- return tryToChangeToMapView(url.toString());
- }
-
- public void updateMapViewName() {
- throw new RuntimeException("Method not implemented");
- }
-
- public boolean isLeftTreeSupported(Component mapViewComponent) {
- throw new RuntimeException("Method not implemented");
- }
-
- public Map<String, MapModel> getMaps(String modename) {
- return maps;
- }
-
- public List<Component> getViews(MapModel map) {
- return Collections.emptyList();
- }
-
- public JScrollPane getScrollPane() {
- throw new RuntimeException("Method not implemented");
- }
-
- public Container getViewport() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void updateMenus(MenuBuilder menuBuilder) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void obtainFocusForSelected() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void setTitle() {
- throw new RuntimeException("Method not implemented");
- }
-
- public Object setEdgesRenderingHint(Graphics2D g) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void setTextRenderingHint(Graphics2D g) {
- throw new RuntimeException("Method not implemented");
- }
-
- public boolean closeAllMaps() {
- maps.clear();
- currentKey = null;
- currentMap = null;
- return true;
- }
-
- public boolean close(Component mapViewComponent, boolean force) {
- throw new RuntimeException("Method not implemented");
- }
-}
diff --git a/freeplane/src/org/freeplane/main/headlessmode/HeadlessUIController.java b/freeplane/src/org/freeplane/main/headlessmode/HeadlessUIController.java
deleted file mode 100644
index a020914..0000000
--- a/freeplane/src/org/freeplane/main/headlessmode/HeadlessUIController.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.headlessmode;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Frame;
-import java.awt.Rectangle;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URI;
-import java.net.URL;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.atomic.AtomicLong;
-
-import javax.swing.Icon;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.RootPaneContainer;
-
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.ui.ViewController;
-
-/**
- * @author Dimitry Polivaev
- * 24.12.2012
- */
-public class HeadlessUIController implements ViewController {
- final private AtomicLong workingThreadId = new AtomicLong();
- final private ExecutorService worker = Executors.newSingleThreadExecutor(new ThreadFactory() {
- public Thread newThread(Runnable r) {
- final Thread thread = Executors.defaultThreadFactory().newThread(r);
- workingThreadId.set(thread.getId());
- return thread;
- }
- }) ;
- public Rectangle getFrameSize() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void setFrameSize(Rectangle frameSize) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void changeNoteWindowLocation() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void err(String msg) {
- throw new RuntimeException("Method not implemented");
- }
-
- public RootPaneContainer getRootPaneContainer() {
- throw new RuntimeException("Method not implemented");
- }
-
- public Container getContentPane() {
- throw new RuntimeException("Method not implemented");
- }
-
- public Frame getFrame() {
- throw new RuntimeException("Method not implemented");
- }
-
- public FreeplaneMenuBar getFreeplaneMenuBar() {
- throw new RuntimeException("Method not implemented");
- }
-
- public JFrame getJFrame() {
- throw new RuntimeException("Method not implemented");
- }
-
- public JComponent getStatusBar() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void init(Controller controller) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void insertComponentIntoSplitPane(JComponent noteViewerComponent) {
- throw new RuntimeException("Method not implemented");
- }
-
- public boolean isApplet() {
- throw new RuntimeException("Method not implemented");
- }
-
- public boolean isMenubarVisible() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void openDocument(URI uri) throws IOException {
- throw new RuntimeException("Method not implemented");
- }
-
- public void openDocument(URL fileToUrl) throws Exception {
- throw new RuntimeException("Method not implemented");
- }
-
- public void out(String msg) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void addStatusInfo(String key, String info) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void addStatusInfo(String key, Icon icon) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void addStatusInfo(String key, String info, Icon icon) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void addStatusInfo(String key, String info, Icon icon, String tooltip) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void addStatusComponent(String key, Component component) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void removeStatus(String key) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void removeSplitPane() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void saveProperties() {
- throw new RuntimeException("Method not implemented");
- }
-
- public void selectMode(ModeController oldModeController, ModeController newModeController) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void setMenubarVisible(boolean visible) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void setTitle(String frameTitle) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void setWaitingCursor(boolean b) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void viewNumberChanged(int number) {
- throw new RuntimeException("Method not implemented");
- }
-
- public String completeVisiblePropertyKey(JComponent toolBar) {
- throw new RuntimeException("Method not implemented");
- }
-
- public void addObjectTypeInfo(Object value) {
- throw new RuntimeException("Method not implemented");
- }
-
- public boolean quit() {
- throw new RuntimeException("Method not implemented");
- }
-
- public boolean isDispatchThread() {
- return workingThreadId.get() == Thread.currentThread().getId();
- }
-
- public void invokeLater(Runnable runnable) {
- worker.execute(runnable);
- }
-
- public void invokeAndWait(Runnable runnable) throws InterruptedException, InvocationTargetException, ExecutionException {
- worker.submit(runnable).get();
-
- }
-
- public boolean isHeadless() {
- return true;
- }
-
- public boolean areScrollbarsVisible() {
- return false;
- }
-
- public void setScrollbarsVisible(boolean b) {
- }
-
- public boolean isFullScreenEnabled() {
- return false;
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/MModeControllerFactory.java b/freeplane/src/org/freeplane/main/mindmapmode/MModeControllerFactory.java
deleted file mode 100644
index 46c1d24..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/MModeControllerFactory.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode;
-
-import java.awt.Dimension;
-import java.awt.event.KeyEvent;
-
-import javax.swing.Box;
-import javax.swing.JComponent;
-import javax.swing.JPopupMenu;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.IEditHandler;
-import org.freeplane.core.ui.IMouseListener;
-import org.freeplane.core.ui.SetAcceleratorOnNextClickAction;
-import org.freeplane.core.ui.components.FButtonBar;
-import org.freeplane.core.ui.components.FreeplaneToolBar;
-import org.freeplane.core.ui.components.JResizer.Direction;
-import org.freeplane.core.ui.components.OneTouchCollapseResizer;
-import org.freeplane.core.ui.components.OneTouchCollapseResizer.CollapseDirection;
-import org.freeplane.core.ui.components.OneTouchCollapseResizer.ComponentCollapseListener;
-import org.freeplane.core.ui.components.ResizeEvent;
-import org.freeplane.core.ui.components.ResizerListener;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.mindmapmode.AddAttributeAction;
-import org.freeplane.features.attribute.mindmapmode.MAttributeController;
-import org.freeplane.features.attribute.mindmapmode.RemoveAllAttributesAction;
-import org.freeplane.features.attribute.mindmapmode.RemoveFirstAttributeAction;
-import org.freeplane.features.attribute.mindmapmode.RemoveLastAttributeAction;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.clipboard.mindmapmode.MClipboardController;
-import org.freeplane.features.cloud.CloudController;
-import org.freeplane.features.cloud.mindmapmode.MCloudController;
-import org.freeplane.features.edge.EdgeController;
-import org.freeplane.features.edge.mindmapmode.AutomaticEdgeColorHook;
-import org.freeplane.features.edge.mindmapmode.MEdgeController;
-import org.freeplane.features.encrypt.mindmapmode.MEncryptionController;
-import org.freeplane.features.export.mindmapmode.ExportController;
-import org.freeplane.features.export.mindmapmode.ImportMindmanagerFiles;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.icon.HierarchicalIcons;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.mindmapmode.IconSelectionPlugin;
-import org.freeplane.features.icon.mindmapmode.MIconController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.AlwaysUnfoldedNode;
-import org.freeplane.features.map.FoldingController;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.SummaryNode;
-import org.freeplane.features.map.mindmapmode.ChangeNodeLevelController;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.map.mindmapmode.NewParentNode;
-import org.freeplane.features.mapio.mindmapmode.MMapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.nodelocation.LocationController;
-import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
-import org.freeplane.features.nodestyle.mindmapmode.RevisionPlugin;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.note.mindmapmode.MNoteController;
-import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
-import org.freeplane.features.styles.AutomaticLayoutController;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
-import org.freeplane.features.styles.mindmapmode.MUIFactory;
-import org.freeplane.features.styles.mindmapmode.ShowFormatPanelAction;
-import org.freeplane.features.styles.mindmapmode.StyleEditorPanel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.text.mindmapmode.SortNodes;
-import org.freeplane.features.text.mindmapmode.SplitNode;
-import org.freeplane.features.time.CreationModificationPlugin;
-import org.freeplane.features.ui.ToggleToolbarAction;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-import org.freeplane.features.url.mindmapmode.SaveAll;
-import org.freeplane.main.mindmapmode.stylemode.SModeControllerFactory;
-import org.freeplane.view.swing.features.BlinkingNodeHook;
-import org.freeplane.view.swing.features.FitToPage;
-import org.freeplane.view.swing.features.filepreview.AddExternalImageAction;
-import org.freeplane.view.swing.features.filepreview.ChangeExternalImageAction;
-import org.freeplane.view.swing.features.filepreview.RemoveExternalImageAction;
-import org.freeplane.view.swing.features.filepreview.ViewerController;
-import org.freeplane.view.swing.features.nodehistory.NodeHistory;
-import org.freeplane.view.swing.features.progress.mindmapmode.ProgressFactory;
-import org.freeplane.view.swing.features.time.mindmapmode.ReminderHook;
-import org.freeplane.view.swing.map.ShowNotesInMapAction;
-import org.freeplane.view.swing.map.attribute.AttributePanelManager;
-import org.freeplane.view.swing.map.attribute.EditAttributesAction;
-import org.freeplane.view.swing.ui.DefaultNodeKeyListener;
-import org.freeplane.view.swing.ui.UserInputListenerFactory;
-import org.freeplane.view.swing.ui.mindmapmode.MMapMouseListener;
-import org.freeplane.view.swing.ui.mindmapmode.MNodeDragListener;
-import org.freeplane.view.swing.ui.mindmapmode.MNodeDropListener;
-import org.freeplane.view.swing.ui.mindmapmode.MNodeMotionListener;
-
-/**
- * @author Dimitry Polivaev 24.11.2008
- */
-public class MModeControllerFactory {
- private static MModeControllerFactory instance;
-
- public static MModeController createModeController() {
- return MModeControllerFactory.getInstance().createModeControllerImpl();
- }
-
- private static MModeControllerFactory getInstance() {
- if (instance == null) {
- instance = new MModeControllerFactory();
- }
- return instance;
- }
-
-// // private Controller controller;
- private MModeController modeController;
- private MUIFactory uiFactory;
-
- private void createAddIns() {
- final StyleEditorPanel panel = new StyleEditorPanel(modeController, uiFactory, true);
- final JScrollPane styleScrollPane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
- JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
- UITools.setScrollbarIncrement(styleScrollPane);
- final JComponent tabs = (JComponent) modeController.getUserInputListenerFactory().getToolBar("/format").getComponent(1);
- tabs.add(TextUtils.getText("format_panel"), styleScrollPane);
- new AttributePanelManager(modeController);
- new HierarchicalIcons();
- new AutomaticLayoutController();
- new BlinkingNodeHook();
- SummaryNode.install();
- AlwaysUnfoldedNode.install();
- FreeNode.install();
- new CreationModificationPlugin();
- modeController.addExtension(ReminderHook.class, new ReminderHook(modeController));
- new AutomaticEdgeColorHook();
- new ViewerController();
- modeController.addAction(new AddAttributeAction());
- modeController.addAction(new RemoveFirstAttributeAction());
- modeController.addAction(new RemoveLastAttributeAction());
- modeController.addAction(new RemoveAllAttributesAction());
- modeController.addAction(new AddExternalImageAction());
- modeController.addAction(new RemoveExternalImageAction());
- modeController.addAction(new ChangeExternalImageAction());
- modeController.addAction(new ShowFormatPanelAction());
- modeController.addAction(new FitToPage());
- MEncryptionController.install(new MEncryptionController(modeController));
- modeController.addAction(new IconSelectionPlugin());
- modeController.addAction(new NewParentNode());
- modeController.addAction(new SaveAll());
- modeController.addAction(new SortNodes());
- modeController.addAction(new SplitNode());
- new ChangeNodeLevelController(modeController);
- NodeHistory.install(modeController);
- modeController.addAction(new ImportMindmanagerFiles());
- }
-
- private MModeController createModeControllerImpl() {
-// this.controller = controller;
- createStandardControllers();
- createAddIns();
- return modeController;
- }
-
- private void createStandardControllers() {
- final Controller controller = Controller.getCurrentController();
- modeController = new MModeController(controller);
- final UserInputListenerFactory userInputListenerFactory = new UserInputListenerFactory(modeController);
-
- final IMouseListener nodeMouseMotionListener = new MNodeMotionListener();
- userInputListenerFactory.setNodeMouseMotionListener(nodeMouseMotionListener);
- final JPopupMenu popupmenu = new JPopupMenu();
- userInputListenerFactory.setNodePopupMenu(popupmenu);
- modeController.setUserInputListenerFactory(userInputListenerFactory);
- controller.addModeController(modeController);
- controller.selectModeForBuild(modeController);
- new MMapController(modeController);
- final MFileManager fileManager = new MFileManager();
- UrlManager.install(fileManager);
- MMapIO.install(modeController);
- controller.getMapViewManager().addMapViewChangeListener(fileManager);
- IconController.install(new MIconController(modeController));
- new ProgressFactory().installActions(modeController);
- final MapController mapController = modeController.getMapController();
- EdgeController.install(new MEdgeController(modeController));
- CloudController.install(new MCloudController(modeController));
- NoteController.install(new MNoteController(modeController));
- userInputListenerFactory.setMapMouseListener(new MMapMouseListener());
- final MTextController textController = new MTextController(modeController);
- TextController.install(textController);
- LinkController.install(new MLinkController(modeController));
- NodeStyleController.install(new MNodeStyleController(modeController));
- ClipboardController.install(new MClipboardController());
- userInputListenerFactory.setNodeDragListener(new MNodeDragListener());
- userInputListenerFactory.setNodeDropTargetListener(new MNodeDropListener());
- LocationController.install(new MLocationController());
- final MLogicalStyleController logicalStyleController = new MLogicalStyleController(modeController);
- LogicalStyleController.install(logicalStyleController);
- logicalStyleController.initM();
- AttributeController.install(new MAttributeController(modeController));
- userInputListenerFactory.setNodeKeyListener(new DefaultNodeKeyListener(new IEditHandler() {
- public void edit(final KeyEvent e, final FirstAction action, final boolean editLong) {
- ((MTextController) MTextController.getController(modeController)).getEventQueue().activate(e);
- textController.edit(action, editLong);
- }
- }));
- userInputListenerFactory.setNodeMotionListener(new MNodeMotionListener());
- modeController.addAction(new EditAttributesAction());
- SpellCheckerController.install(modeController);
- ExportController.install(new ExportController("/xml/ExportWithXSLT.xml"));
- MapStyle.install(true);
- final FreeplaneToolBar toolbar = new FreeplaneToolBar("main_toolbar", SwingConstants.HORIZONTAL);
- toolbar.putClientProperty(ViewController.VISIBLE_PROPERTY_KEY, "toolbarVisible");
- userInputListenerFactory.addToolBar("/main_toolbar", ViewController.TOP, toolbar);
- userInputListenerFactory.addToolBar("/filter_toolbar", ViewController.TOP, FilterController.getController(
- controller).getFilterToolbar());
- userInputListenerFactory.addToolBar("/status", ViewController.BOTTOM, controller.getViewController()
- .getStatusBar());
- final JTabbedPane tabs = new JTabbedPane();
- Box resisableTabs = Box.createHorizontalBox();
- //DOCEAR - new OneTouchCollapseResizer
- final String TABBEDPANE_VIEW_COLLAPSED = "tabbed_pane.collapsed";
- final String TABBEDPANE_VIEW_WIDTH = "tabbed_pane.width";
- boolean expanded = true;
- try {
- expanded = !Boolean.parseBoolean(ResourceController.getResourceController().getProperty(TABBEDPANE_VIEW_COLLAPSED, "false"));
- }
- catch (Exception e) {
- // ignore -> default is true
- }
-
- OneTouchCollapseResizer otcr = new OneTouchCollapseResizer(Direction.RIGHT, CollapseDirection.COLLAPSE_RIGHT);
- resisableTabs.add(otcr);
- //resisableTabs.add(new JResizer(Direction.RIGHT));
- resisableTabs.add(tabs);
- otcr.addResizerListener(new ResizerListener() {
- public void componentResized(ResizeEvent event) {
- if(event.getSource().equals(tabs)) {
- ResourceController.getResourceController().setProperty(TABBEDPANE_VIEW_WIDTH, String.valueOf(((JComponent) event.getSource()).getPreferredSize().width));
- }
- }
- });
- otcr.addCollapseListener(new ComponentCollapseListener() {
- public void componentCollapsed(ResizeEvent event) {
- if(event.getSource().equals(tabs)) {
- ResourceController.getResourceController().setProperty(TABBEDPANE_VIEW_COLLAPSED, "true");
- }
- }
-
- public void componentExpanded(ResizeEvent event) {
- if(event.getSource().equals(tabs)) {
- ResourceController.getResourceController().setProperty(TABBEDPANE_VIEW_COLLAPSED, "false");
- }
- }
- });
- try {
- int width = Integer.parseInt(ResourceController.getResourceController().getProperty(TABBEDPANE_VIEW_WIDTH, "350"));
- tabs.setPreferredSize(new Dimension(width, 40));
- }
- catch (Exception e) {
- // blindly accept
- }
- otcr.setExpanded(expanded);
- resisableTabs.putClientProperty(ViewController.VISIBLE_PROPERTY_KEY, "styleScrollPaneVisible");
- modeController.getUserInputListenerFactory().addToolBar("/format", ViewController.RIGHT, resisableTabs);
- final FButtonBar fButtonToolBar = new FButtonBar(controller.getViewController().getRootPaneContainer().getRootPane());
- fButtonToolBar.putClientProperty(ViewController.VISIBLE_PROPERTY_KEY, "fbarVisible");
- fButtonToolBar.setVisible(ResourceController.getResourceController().getBooleanProperty("fbarVisible"));
- userInputListenerFactory.addToolBar("/fbuttons", ViewController.TOP, fButtonToolBar);
- controller.addAction(new ToggleToolbarAction("ToggleFBarAction", "/fbuttons"));
- SModeControllerFactory.install();
- modeController.addAction(new SetAcceleratorOnNextClickAction());
- modeController.addAction(new ShowNotesInMapAction());
- userInputListenerFactory.getMenuBuilder().setAcceleratorChangeListener(fButtonToolBar);
- userInputListenerFactory.addToolBar("/icon_toolbar", ViewController.LEFT, ((MIconController) IconController
- .getController()).getIconToolBarScrollPane());
- modeController.addAction(new ToggleToolbarAction("ToggleLeftToolbarAction", "/icon_toolbar"));
- new RevisionPlugin();
- FoldingController.install(new FoldingController());
-
- uiFactory = new MUIFactory();
- mapController.addNodeChangeListener(uiFactory);
- mapController.addNodeSelectionListener(uiFactory);
- mapController.addMapChangeListener(uiFactory);
- controller.getMapViewManager().addMapSelectionListener(uiFactory);
- final MToolbarContributor menuContributor = new MToolbarContributor(uiFactory);
- modeController.addMenuContributor(menuContributor);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/MToolbarContributor.java b/freeplane/src/org/freeplane/main/mindmapmode/MToolbarContributor.java
deleted file mode 100644
index 246fe42..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/MToolbarContributor.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode;
-
-import java.awt.Container;
-import java.awt.Dimension;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.mindmapmode.MUIFactory;
-
-class MToolbarContributor implements IMenuContributor {
- private final MUIFactory uiFactory;
-
- public MToolbarContributor( final MUIFactory uiFactory) {
- super();
-// this.modeController = modeController;
- this.uiFactory = uiFactory;
- }
-
-// final private ModeController modeController;
-
- public void updateMenus(final ModeController modeController, final MenuBuilder builder) {
- final AFreeplaneAction action = modeController.getAction("IncreaseNodeFontAction");
- if(builder.contains("main_toolbar_font_name")){
- final Container fontBox = uiFactory.createFontBox();
- final Dimension preferredSize = fontBox.getPreferredSize();
- preferredSize.width = 90;
- fontBox.setPreferredSize(preferredSize);
- builder.addComponent("main_toolbar_font_name", fontBox, action, MenuBuilder.AS_CHILD);
- }
- if(builder.contains("main_toolbar_font_size")){
- final Container sizeBox = uiFactory.createSizeBox();
- builder.addComponent("main_toolbar_font_size", sizeBox, action, MenuBuilder.AS_CHILD);
- }
- if(builder.contains("main_toolbar_style")){
- final Container styleBox = uiFactory.createStyleBox();
- final Dimension preferredSize = styleBox.getPreferredSize();
- preferredSize.width = 90;
- styleBox.setPreferredSize(preferredSize);
- builder.addComponent("main_toolbar_style", styleBox, action, MenuBuilder.AS_CHILD);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/AEditStylesAction.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/AEditStylesAction.java
deleted file mode 100644
index ee3ecc9..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/AEditStylesAction.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.freeplane.main.mindmapmode.stylemode;
-
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-
-import javax.swing.JDialog;
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.resources.WindowConfigurationStorage;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.ui.ViewController;
-
-abstract class AEditStylesAction extends AFreeplaneAction {
- private Controller controller = null;
- private SModeController modeController;
- abstract void commit();
- abstract void rollback();
-
- public AEditStylesAction(String key) {
- super(key);
- }
-
- SModeController getModeController() {
- return modeController;
- }
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- protected JDialog dialog;
-
- protected void init() {
- this.controller = Controller.getCurrentController();
- if (dialog != null) {
- Controller.setCurrentController ((Controller) dialog.getRootPane().getClientProperty(Controller.class));
- return;
- }
- dialog = new JDialog(Controller.getCurrentController().getViewController().getJFrame());
- final WindowConfigurationStorage windowConfigurationStorage = new WindowConfigurationStorage(getKey() + ".dialog");
- windowConfigurationStorage.restoreDialogPositions(dialog);
- dialog.setModal(true);
- dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
- dialog.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(final WindowEvent e) {
- getModeController().tryToCloseDialog();
- }
- });
- Controller controller = SModeControllerFactory.getInstance().createController(dialog);
- modeController = (SModeController) controller.getModeController();
- final ViewController viewController = controller.getViewController();
- viewController.init(controller);
- dialog.addComponentListener(new ComponentAdapter() {
- @Override
- public void componentHidden(final ComponentEvent e) {
- final WindowConfigurationStorage windowConfigurationStorage = new WindowConfigurationStorage(getKey() + ".dialog");
- windowConfigurationStorage.storeDialogPositions(dialog);
- final IMapViewManager mapViewManager = modeController.getController().getMapViewManager();
- final MapModel map = mapViewManager.getModel();
- final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
- mapViewManager.close(true);
- Controller.setCurrentController(AEditStylesAction.this.controller);
- super.componentHidden(e);
- switch (modeController.getStatus()) {
- case JOptionPane.OK_OPTION:
- if (undoHandler.canUndo()) {
- commit();
- break;
- }
- case JOptionPane.CANCEL_OPTION:
- rollback();
- }
- }
-
- });
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DeleteLevelStyleAction.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DeleteLevelStyleAction.java
deleted file mode 100644
index 3c80038..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DeleteLevelStyleAction.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode.stylemode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.StyleFactory;
-
-/**
- * @author Dimitry Polivaev
- * 02.10.2009
- */
-public class DeleteLevelStyleAction extends AFreeplaneAction {
- public DeleteLevelStyleAction() {
- super("DeleteLevelStyleAction");
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- final MapModel map = Controller.getCurrentController().getMap();
- final NodeModel levelStyleParentNode = getLevelStyleParentNode(map);
- final int childNumber = levelStyleParentNode.getChildCount() - 1;
- if (childNumber < 1) {
- UITools.errorMessage(TextUtils.getText("can_not_delete_root_style"));
- return;
- }
- final String styleName = "AutomaticLayout.level," + childNumber;
- final IStyle styleObject = StyleFactory.create(NamedObject.format(styleName));
- final MapStyleModel styleModel = MapStyleModel.getExtension(map);
- final MMapController mapController = (MMapController) modeController.getMapController();
- final NodeModel node = styleModel.getStyleNode(styleObject);
- mapController.deleteNode(node);
- final IActor actor = new IActor() {
- public void undo() {
- styleModel.addStyleNode(node);
- }
-
- public String getDescription() {
- return "DeleteStyle";
- }
-
- public void act() {
- styleModel.removeStyleNode(node);
- }
- };
- Controller.getCurrentModeController().execute(actor, map);
- }
-
- private NodeModel getLevelStyleParentNode(final MapModel map) {
- return (NodeModel) map.getRootNode().getChildAt(1);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DeleteUserStyleAction.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DeleteUserStyleAction.java
deleted file mode 100644
index 3695379..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DeleteUserStyleAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode.stylemode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.StyleNamedObject;
-
-/**
- * @author Dimitry Polivaev
- * 02.10.2009
- */
-public class DeleteUserStyleAction extends AFreeplaneAction {
- public DeleteUserStyleAction() {
- super("DeleteUserStyleAction");
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
- final ModeController modeController = Controller.getCurrentModeController();
- final Controller controller = modeController.getController();
- final NodeModel selected = controller.getSelection().getSelected();
- if (selected.depth() < 2) {
- UITools.errorMessage(TextUtils.getText("can_not_delete_style_group"));
- return;
- }
- final MapModel map = selected.getMap();
- final MapStyleModel styleModel = MapStyleModel.getExtension(map);
- final NodeModel styleNodeGroup = styleModel.getStyleNodeGroup(selected);
- if (! ((StyleNamedObject)styleNodeGroup.getUserObject()).getObject().equals("styles.user-defined")) {
- UITools.errorMessage(TextUtils.getText("can_not_delete_predefined_style"));
- return;
- }
- final MMapController mapController = (MMapController) modeController.getMapController();
- mapController.deleteNode(selected);
- final IActor actor = new IActor() {
- public void undo() {
- styleModel.addStyleNode(selected);
- }
-
- public String getDescription() {
- return "DeleteStyle";
- }
-
- public void act() {
- styleModel.removeStyleNode(selected);
- }
- };
- Controller.getCurrentModeController().execute(actor, map);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DialogController.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DialogController.java
deleted file mode 100644
index e8883fe..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/DialogController.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode.stylemode;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URL;
-
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JFrame;
-import javax.swing.JLayeredPane;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.RootPaneContainer;
-
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.ui.FrameController;
-import org.freeplane.view.swing.map.MapViewScrollPane;
-
-class DialogController extends FrameController {
- final private JDialog dialog;
-
- public JDialog getDialog() {
- return dialog;
- }
-
- private JScrollPane mapViewScrollPane = null;
-
- /** Contains the value where the Note Window should be displayed (right, left, top, bottom) */
- /** Contains the Note Window Component
- * @param controller */
- public DialogController(Controller controller, final IMapViewManager mapViewController, final JDialog dialog) {
- super(controller, mapViewController, "dialog_");
- this.dialog = dialog;
- getContentPane().setLayout(new BorderLayout());
- mapViewScrollPane = new MapViewScrollPane();
- getContentPane().add(mapViewScrollPane, BorderLayout.CENTER);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.FreeplaneMain#getContentPane()
- */
- @Override
- public RootPaneContainer getRootPaneContainer() {
- return dialog;
- }
-
- @Override
- public FreeplaneMenuBar getFreeplaneMenuBar() {
- return (FreeplaneMenuBar) dialog.getJMenuBar();
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.FreeplaneMain#getJFrame()
- */
- @Override
- public JFrame getJFrame() {
- return (JFrame) JOptionPane.getFrameForComponent(dialog);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.FreeplaneMain#getLayeredPane()
- */
- public JLayeredPane getLayeredPane() {
- return dialog.getLayeredPane();
- }
-
- @Override
- public void insertComponentIntoSplitPane(final JComponent pMindMapComponent) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isApplet() {
- return false;
- }
-
- @Override
- public void openDocument(final URI uri) throws IOException {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Open url in WWW browser. This method hides some differences between
- * operating systems.
- */
- @Override
- public void openDocument(final URL url) throws Exception {
- throw new UnsupportedOperationException();
- }
-
- @Override
- protected void setFreeplaneMenuBar(final FreeplaneMenuBar menuBar) {
- dialog.setJMenuBar(menuBar);
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.main.FreeplaneMain#setTitle(java.lang.String)
- */
- @Override
- public void setTitle(final String frameTitle) {
- dialog.setTitle(frameTitle);
- }
-
- @Override
- public void setWaitingCursor(final boolean waiting) {
- if (waiting) {
- dialog.getRootPane().getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
- dialog.getRootPane().getGlassPane().setVisible(true);
- }
- else {
- dialog.getRootPane().getGlassPane().setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
- dialog.getRootPane().getGlassPane().setVisible(false);
- }
- }
-
- @Override
- public void removeSplitPane() {
- throw new UnsupportedOperationException();
- }
-
- public void setMapView(Component mapViewComponent) {
- mapViewScrollPane.getViewport().setView(mapViewComponent);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/EditStylesAction.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/EditStylesAction.java
deleted file mode 100644
index b6b9dfd..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/EditStylesAction.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode.stylemode;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyleModel;
-
-/**
- * @author Dimitry Polivaev
- * 13.09.2009
- */
- at SuppressWarnings("serial")
-public class EditStylesAction extends AEditStylesAction {
- public EditStylesAction() {
- super("EditStylesAction");
- }
-
- public void actionPerformed(final ActionEvent e) {
- final MapModel map = Controller.getCurrentController().getMap();
- final MapStyleModel mapStyleModel = MapStyleModel.getExtension(map);
- final MapModel styleMap = mapStyleModel.getStyleMap();
- if(styleMap == null){
- UITools.errorMessage(TextUtils.getText("no_styles_found_in_map"));
- return;
- }
- final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
- undoHandler.startTransaction();
- init();
- SModeController modeController = getModeController();
- modeController.getMapController().newMapView(styleMap);
- Controller controller = modeController.getController();
- Component mapViewComponent = controller.getMapViewManager().getMapViewComponent();
- ((DialogController) controller.getViewController()).setMapView(mapViewComponent);
- dialog.setLocationRelativeTo(Controller.getCurrentController().getViewController().getJFrame());
- dialog.setVisible(true);
- }
-
- void commit() {
- final MapModel currentMap = Controller.getCurrentController().getMap();
- LogicalStyleController.getController().refreshMap(currentMap);
- final ModeController currentModeController = Controller.getCurrentModeController();
- currentModeController.commit();
- }
-
- void rollback() {
- Controller.getCurrentModeController().rollback();
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/NewLevelStyleAction.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/NewLevelStyleAction.java
deleted file mode 100644
index 70dff10..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/NewLevelStyleAction.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode.stylemode;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.StyleFactory;
-
-/**
- * @author Dimitry Polivaev
- * 02.10.2009
- */
-public class NewLevelStyleAction extends AFreeplaneAction {
- public NewLevelStyleAction() {
- super("NewLevelStyleAction");
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
- final MapModel map = Controller.getCurrentController().getMap();
- final NodeModel levelStyleParentNode = getLevelStyleParentNode(map);
- final String styleName = "AutomaticLayout.level," + levelStyleParentNode.getChildCount();
- final IStyle styleObject = StyleFactory.create(NamedObject.format(styleName));
- final MapStyleModel styleModel = MapStyleModel.getExtension(map);
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- final NodeModel node = new NodeModel(map);
- node.setUserObject(styleObject);
- mapController.insertNode(node, levelStyleParentNode, false, false, true);
- mapController.select(node);
- final IActor actor = new IActor() {
- public void undo() {
- styleModel.removeStyleNode(node);
- }
-
- public String getDescription() {
- return "NewLevelStyle";
- }
-
- public void act() {
- styleModel.addStyleNode(node);
- }
- };
- Controller.getCurrentModeController().execute(actor, map);
- }
-
- private NodeModel getLevelStyleParentNode(final MapModel map) {
- return (NodeModel) map.getRootNode().getChildAt(1);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/NewUserStyleAction.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/NewUserStyleAction.java
deleted file mode 100644
index c5678d3..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/NewUserStyleAction.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode.stylemode;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.mindmapmode.MIconController.Keys;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleKeys;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.StyleFactory;
-import org.freeplane.features.styles.StyleNamedObject;
-
-/**
- * @author Dimitry Polivaev
- * 02.10.2009
- */
-public class NewUserStyleAction extends AFreeplaneAction {
- public NewUserStyleAction() {
- super("NewUserStyleAction");
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent e) {
- final String styleName = JOptionPane.showInputDialog(TextUtils.getText("enter_new_style_name"));
- if (styleName == null) {
- return;
- }
- final Controller controller = Controller.getCurrentController();
- final NodeModel selectedNode = controller.getSelection().getSelected();
- final MapModel map = controller.getMap();
- final MapStyleModel styleModel = MapStyleModel.getExtension(map);
- final IStyle style = StyleFactory.create(styleName);
- if (null != styleModel.getStyleNode(style)) {
- UITools.errorMessage(TextUtils.getText("style_already_exists"));
- return;
- }
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- final NodeModel newNode = new NodeModel(map);
- newNode.setUserObject(style);
- Controller.getCurrentModeController().copyExtensions(LogicalStyleKeys.NODE_STYLE, selectedNode, newNode);
- Controller.getCurrentModeController().copyExtensions(Keys.ICONS, selectedNode, newNode);
- NodeModel userStyleParentNode = styleModel.getStyleNodeGroup(map, MapStyleModel.STYLES_USER_DEFINED);
- if(userStyleParentNode == null){
- userStyleParentNode = new NodeModel(map);
- userStyleParentNode.setUserObject(new StyleNamedObject(MapStyleModel.STYLES_USER_DEFINED));
- mapController.insertNode(userStyleParentNode, map.getRootNode(), false, false, true);
-
- }
- mapController.insertNode(newNode, userStyleParentNode, false, false, true);
- mapController.select(newNode);
- final IActor actor = new IActor() {
- public void undo() {
- styleModel.removeStyleNode(newNode);
- }
-
- public String getDescription() {
- return "NewStyle";
- }
-
- public void act() {
- styleModel.addStyleNode(newNode);
- }
- };
- Controller.getCurrentModeController().execute(actor, map);
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/SModeController.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/SModeController.java
deleted file mode 100644
index ce77e58..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/SModeController.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode.stylemode;
-
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.ui.IMapViewManager;
-
-/**
- * @author Dimitry Polivaev
- * 18.09.2009
- */
-class SModeController extends MModeController {
-
- @SuppressWarnings("serial")
- public SModeController(final Controller controller) {
- super(controller);
- final Window dialog = ((DialogController) controller.getViewController()).getDialog();
- dialog.addComponentListener(new ComponentAdapter() {
- public void componentShown(final ComponentEvent e) {
- status = JOptionPane.DEFAULT_OPTION;
- }
- });
- final String key = "styledialog";
- AFreeplaneAction okAction = new AFreeplaneAction(key + ".ok") {
- public void actionPerformed(final ActionEvent e) {
- status = JOptionPane.OK_OPTION;
- closeDialog();
- }
- };
- controller.addAction(okAction);
- AFreeplaneAction cancelAction = new AFreeplaneAction(key + ".cancel") {
- public void actionPerformed(final ActionEvent e) {
- status = JOptionPane.CANCEL_OPTION;
- closeDialog();
- }
- };
- controller.addAction(cancelAction);
- AFreeplaneAction tryToCloseAction = new AFreeplaneAction("QuitAction") {
- public void actionPerformed(final ActionEvent e) {
- tryToCloseDialog();
- }
- };
- controller.addAction(tryToCloseAction);
- }
-
- private int status = JOptionPane.DEFAULT_OPTION;
-
- public int getStatus() {
- return status;
- }
-
-
- protected void closeDialog() {
- final Window dialog = ((DialogController) getController().getViewController()).getDialog();
- dialog.setVisible(false);
- }
-
- public void setStatus(int status) {
- this.status = status;
- }
-
- void tryToCloseDialog() {
- final IMapViewManager mapViewManager = getController().getMapViewManager();
- final MapModel map = mapViewManager.getModel();
- final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
- final Window dialog = ((DialogController) getController().getViewController()).getDialog();
- if (! undoHandler.canUndo()){
- dialog.setVisible(false);
- return;
- }
- final String text = TextUtils.getText("save_unsaved_styles");
- final String title = TextUtils.getText("SaveAction.text");
- final int returnVal = JOptionPane.showOptionDialog(
- dialog, text, title,
- JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null);
- if ((returnVal == JOptionPane.CANCEL_OPTION) || (returnVal == JOptionPane.CLOSED_OPTION)) {
- return;
- }
- setStatus(returnVal == JOptionPane.YES_OPTION ? JOptionPane.OK_OPTION : JOptionPane.CANCEL_OPTION);
- dialog.setVisible(false);
- }
-
- @Override
- public void startup() {
- }
-}
diff --git a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/SModeControllerFactory.java b/freeplane/src/org/freeplane/main/mindmapmode/stylemode/SModeControllerFactory.java
deleted file mode 100644
index 80a19c1..0000000
--- a/freeplane/src/org/freeplane/main/mindmapmode/stylemode/SModeControllerFactory.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.mindmapmode.stylemode;
-
-import java.awt.EventQueue;
-import java.util.Collections;
-import java.util.Set;
-
-import javax.swing.JDialog;
-import javax.swing.JPopupMenu;
-import javax.swing.JScrollPane;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.ShowSelectionAsRectangleAction;
-import org.freeplane.core.ui.components.FreeplaneToolBar;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.ModelessAttributeController;
-import org.freeplane.features.attribute.mindmapmode.MAttributeController;
-import org.freeplane.features.cloud.CloudController;
-import org.freeplane.features.cloud.mindmapmode.MCloudController;
-import org.freeplane.features.edge.EdgeController;
-import org.freeplane.features.edge.mindmapmode.MEdgeController;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.ScannerController;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.mindmapmode.MIconController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mapio.mindmapmode.MMapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.note.mindmapmode.MNoteController;
-import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.MapViewLayout;
-import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
-import org.freeplane.features.styles.mindmapmode.StyleEditorPanel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.ui.ToggleToolbarAction;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-import org.freeplane.view.swing.map.MapViewController;
-import org.freeplane.view.swing.map.ViewLayoutTypeAction;
-import org.freeplane.view.swing.map.attribute.EditAttributesAction;
-import org.freeplane.view.swing.map.mindmapmode.MMapViewController;
-import org.freeplane.view.swing.ui.DefaultNodeMouseMotionListener;
-import org.freeplane.view.swing.ui.UserInputListenerFactory;
-import org.freeplane.view.swing.ui.mindmapmode.MMapMouseListener;
-
-/**
- * @author Dimitry Polivaev 24.11.2008
- */
-public class SModeControllerFactory {
- private static SModeControllerFactory instance;
-
- static SModeControllerFactory getInstance() {
- if (instance == null) {
- instance = new SModeControllerFactory();
- }
- return instance;
- }
-
- private SModeController modeController;
-
- Controller createController(final JDialog dialog) {
- final Controller controller = new Controller(ResourceController.getResourceController());
- Controller.setCurrentController(controller);
- final MapViewController mapViewController = new MMapViewController(controller);
- final DialogController viewController = new DialogController(controller, mapViewController, dialog);
- controller.setViewController(viewController);
- FilterController.install();
- TextController.install();
- controller.addAction(new ViewLayoutTypeAction(MapViewLayout.OUTLINE));
- controller.addAction(new ShowSelectionAsRectangleAction());
- modeController = new SModeController(controller);
- controller.selectModeForBuild(modeController);
- modeController.addAction(new NewUserStyleAction());
- modeController.addAction(new DeleteUserStyleAction());
- modeController.addAction(new NewLevelStyleAction());
- modeController.addAction(new DeleteLevelStyleAction());
- final UserInputListenerFactory userInputListenerFactory = new UserInputListenerFactory(modeController);
- userInputListenerFactory.setNodeMouseMotionListener(new DefaultNodeMouseMotionListener());
- modeController.setUserInputListenerFactory(userInputListenerFactory);
- controller.addExtension(ModelessAttributeController.class, new ModelessAttributeController());
- new MMapController(modeController);
- TextController.install(new MTextController(modeController));
- SpellCheckerController.install(modeController);
- IconController.install(new MIconController(modeController));
- NodeStyleController.install(new MNodeStyleController(modeController));
- EdgeController.install(new MEdgeController(modeController));
- CloudController.install(new MCloudController(modeController));
- NoteController.install(new MNoteController(modeController));
- LinkController.install(new MLinkController(modeController));
- MFileManager.install(new MFileManager());
- MMapIO.install(modeController);
- final MLogicalStyleController logicalStyleController = new MLogicalStyleController(modeController);
- logicalStyleController.initS();
- LogicalStyleController.install(logicalStyleController);
- AttributeController.install(new MAttributeController(modeController));
- FormatController.install(new FormatController());
- final ScannerController scannerController = new ScannerController();
- ScannerController.install(scannerController);
- scannerController.addParsersForStandardFormats();
- modeController.addAction(new EditAttributesAction());
- userInputListenerFactory.setMapMouseListener(new MMapMouseListener());
- final JPopupMenu popupmenu = new JPopupMenu();
- userInputListenerFactory.setNodePopupMenu(popupmenu);
- final FreeplaneToolBar toolBar = new FreeplaneToolBar("main_toolbar", SwingConstants.HORIZONTAL);
- toolBar.putClientProperty(ViewController.VISIBLE_PROPERTY_KEY, "toolbarVisible");
- userInputListenerFactory.addToolBar("/main_toolbar", ViewController.TOP, toolBar);
- userInputListenerFactory.addToolBar("/icon_toolbar", ViewController.LEFT, ((MIconController) IconController
- .getController()).getIconToolBarScrollPane());
- userInputListenerFactory.addToolBar("/status", ViewController.BOTTOM, controller.getViewController()
- .getStatusBar());
- modeController.addAction(new ToggleToolbarAction("ToggleLeftToolbarAction", "/icon_toolbar"));
- MapStyle.install(false);
- controller.addModeController(modeController);
- controller.selectModeForBuild(modeController);
- final SModeController modeController = this.modeController;
- final StyleEditorPanel styleEditorPanel = new StyleEditorPanel(modeController, null, false);
- final MapController mapController = modeController.getMapController();
- mapController.addNodeSelectionListener(new INodeSelectionListener() {
- public void onSelect(final NodeModel node) {
- final IMapSelection selection = controller.getSelection();
- if (selection == null) {
- return;
- }
- if (selection.size() == 1 && node.depth() >= 2) {
- return;
- }
- final NodeModel nextSelection;
- if (node.depth() < 2) {
- if (node.depth() == 1 && node.hasChildren()) {
- nextSelection = (NodeModel) node.getChildAt(0);
- }
- else {
- nextSelection = (NodeModel) (node.getMap().getRootNode().getChildAt(0).getChildAt(0));
- }
- }
- else {
- nextSelection = node;
- }
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- selection.selectAsTheOnlyOneSelected(nextSelection);
- }
- });
- }
-
-
- public void onDeselect(final NodeModel node) {
- }
- });
-
- mapController.addNodeChangeListener(new INodeChangeListener() {
- public void nodeChanged(NodeChangeEvent event) {
- final NodeModel node = event.getNode();
- if(node.getUserObject().equals(MapStyleModel.DEFAULT_STYLE)){
- mapController.fireMapChanged(new MapChangeEvent(this, node.getMap(), MapStyle.MAP_STYLES, null, null));
- }
- }
- });
-
-
- final JScrollPane styleScrollPane = new JScrollPane(styleEditorPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
- JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- UITools.setScrollbarIncrement(styleScrollPane);
- // styleEditorPanel.setPreferredSize(new Dimension(200, 200));
- userInputListenerFactory.addToolBar("/format", ViewController.RIGHT, styleScrollPane);
- final Set<String> emptySet = Collections.emptySet();
- modeController.updateMenus("/xml/stylemodemenu.xml", emptySet);
- this.modeController = null;
- return controller;
- }
-
- public static void install() {
- ModeController modeController = Controller.getCurrentModeController();
- modeController.addAction(new EditStylesAction());
- }
-}
diff --git a/freeplane/src/org/freeplane/main/osgi/ActivatorImpl.java b/freeplane/src/org/freeplane/main/osgi/ActivatorImpl.java
deleted file mode 100644
index e451b03..0000000
--- a/freeplane/src/org/freeplane/main/osgi/ActivatorImpl.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.osgi;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.jar.Manifest;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.main.application.FreeplaneGUIStarter;
-import org.freeplane.main.application.FreeplaneStarter;
-import org.freeplane.main.application.SingleInstanceManager;
-import org.freeplane.main.headlessmode.FreeplaneHeadlessStarter;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.url.URLConstants;
-import org.osgi.service.url.URLStreamHandlerService;
-
-/**
- * @author Dimitry Polivaev
- * 05.01.2009
- */
-class ActivatorImpl implements BundleActivator {
- private static final String HEADLESS_RUN_PROPERTY_NAME = FreeplaneStarter.class.getName() + ".headless";
- private FreeplaneStarter starter;
-
- private String[] getCallParameters() {
- String param;
- final LinkedList<String> parameters = new LinkedList<String>();
- for (int i = 1;; i++) {
- param = System.getProperty("org.freeplane.param" + i, null);
- if (param == null) {
- break;
- }
- if (param.equals("")) {
- continue;
- }
- parameters.add(param);
- }
- final String[] array = parameters.toArray(new String[parameters.size()]);
- return array;
- }
-
- public void start(final BundleContext context) throws Exception {
- try {
- startFramework(context);
- }
- catch (final Exception e) {
- e.printStackTrace();
- throw e;
- }
- catch (final Error e) {
- e.printStackTrace();
- throw e;
- }
- }
-
- private void loadPlugins(final BundleContext context) {
- final String resourceBaseDir = FreeplaneGUIStarter.getResourceBaseDir();
- final File baseDir = new File(resourceBaseDir).getAbsoluteFile().getParentFile();
- List<Bundle> loadedPlugins = new LinkedList<Bundle>();
- loadPlugins(context, new File(baseDir, "plugins"), loadedPlugins);
- final String freeplaneUserDirectory = Compat.getFreeplaneUserDirectory();
- loadPlugins(context, new File(freeplaneUserDirectory), loadedPlugins);
- for(Bundle plugin:loadedPlugins){
- try{
- plugin.start();
- System.out.println("Started: " + plugin.getLocation() + " (id#" + plugin.getBundleId() + ")");
- }
- catch(Exception e){
- e.printStackTrace();
- }
- }
- }
-
- private void loadPlugins(final BundleContext context, final File file, List<Bundle> loadedPlugins) {
- if (!file.exists() || !file.isDirectory()) {
- return;
- }
- final File manifest = new File(file, "META-INF/MANIFEST.MF");
- if (manifest.exists()) {
- InputStream manifestContent = null;
- try {
- manifestContent = new FileInputStream(manifest);
- final Manifest bundleManifest = new Manifest(manifestContent);
- final String name = bundleManifest.getMainAttributes().getValue("Bundle-SymbolicName");
- if (name == null) {
- return;
- }
- final Bundle[] bundles = context.getBundles();
- for (int i = 0; i < bundles.length; i++) {
- final Bundle installedBundle = bundles[i];
- if (installedBundle.getSymbolicName().equals(name)) {
- System.out.println("Bundle " + name + " already installed");
- return;
- }
- }
- final String location = "reference:file:" + file.getAbsolutePath();
- final Bundle bundle = context.installBundle(location);
- System.out.println("Installed: " + location + " (id#" + bundle.getBundleId() + ")");
- loadedPlugins.add(bundle);
- }
- catch (final Exception e) {
- e.printStackTrace();
- }
- finally {
- FileUtils.silentlyClose(manifestContent);
- }
- return;
- }
- final File[] childFiles = file.listFiles();
- for (int i = 0; i < childFiles.length; i++) {
- final File child = childFiles[i];
- loadPlugins(context, child, loadedPlugins);
- }
- }
-
- private void startFramework(final BundleContext context) {
- registerClasspathUrlHandler(context);
- if (null == System.getProperty("org.freeplane.core.dir.lib", null)) {
- final File root = new File(FreeplaneGUIStarter.getResourceBaseDir()).getAbsoluteFile().getParentFile();
- try {
- String rootUrl = root.toURI().toURL().toString();
- if (!rootUrl.endsWith("/")) {
- rootUrl = rootUrl + "/";
- }
- final String libUrl = rootUrl + "core/org.freeplane.core/lib/";
- System.setProperty("org.freeplane.core.dir.lib", libUrl);
- }
- catch (final MalformedURLException e) {
- }
- }
- // initialize ApplicationController - SingleInstanceManager needs the configuration
- starter = createStarter();
- final SingleInstanceManager singleInstanceManager = new SingleInstanceManager(starter);
- singleInstanceManager.start(getCallParameters());
- if (singleInstanceManager.isSlave()) {
- LogUtils.info("opened files in master - exiting now");
- System.exit(0);
- }
- else if (singleInstanceManager.isMasterPresent()) {
- starter.setDontLoadLastMaps();
- }
- loadPlugins(context);
- final Controller controller = starter.createController();
- starter.createModeControllers(controller);
- try {
- final ServiceReference[] controllerProviders = context.getServiceReferences(
- IControllerExtensionProvider.class.getName(), null);
- if (controllerProviders != null) {
- for (int i = 0; i < controllerProviders.length; i++) {
- final ServiceReference controllerProvider = controllerProviders[i];
- final IControllerExtensionProvider service = (IControllerExtensionProvider) context
- .getService(controllerProvider);
- service.installExtension(controller);
- context.ungetService(controllerProvider);
- }
- }
- }
- catch (final InvalidSyntaxException e) {
- e.printStackTrace();
- }
- try {
- final Set<String> modes = controller.getModes();
- for (final String modeName : modes) {
- final ServiceReference[] modeControllerProviders = context.getServiceReferences(
- IModeControllerExtensionProvider.class.getName(), "(mode=" + modeName + ")");
- if (modeControllerProviders != null) {
- final ModeController modeController = controller.getModeController(modeName);
- Controller.getCurrentController().selectModeForBuild(modeController);
- for (int i = 0; i < modeControllerProviders.length; i++) {
- final ServiceReference modeControllerProvider = modeControllerProviders[i];
- final IModeControllerExtensionProvider service = (IModeControllerExtensionProvider) context
- .getService(modeControllerProvider);
- service.installExtension(modeController);
- context.ungetService(modeControllerProvider);
- }
- }
- }
- }
- catch (final InvalidSyntaxException e) {
- e.printStackTrace();
- }
- if ("true".equals(System.getProperty("org.freeplane.exit_on_start", null))) {
- controller.getViewController().invokeLater(new Runnable() {
- public void run() {
- try {
- Thread.sleep(1000);
- }
- catch (final InterruptedException e) {
- }
- System.exit(0);
- }
- });
- return;
- }
- controller.getViewController().invokeLater(new Runnable() {
- public void run() {
- final Bundle[] bundles = context.getBundles();
- final HashSet<String> plugins = new HashSet<String>();
- for(Bundle bundle:bundles){
- plugins.add(bundle.getSymbolicName());
- }
- FilterController.getController(controller).loadDefaultConditions();
- starter.buildMenus(controller, plugins);
- starter.createFrame(getCallParameters());
- }
- });
- }
-
- public FreeplaneStarter createStarter() {
- if(Boolean.getBoolean(HEADLESS_RUN_PROPERTY_NAME))
- return new FreeplaneHeadlessStarter();
- else
- return new FreeplaneGUIStarter();
- }
-
- private void registerClasspathUrlHandler(final BundleContext context) {
- Hashtable<String, String[]> properties = new Hashtable<String, String[]>();
- properties.put(URLConstants.URL_HANDLER_PROTOCOL, new String[] { ResourceController.FREEPLANE_RESOURCE_URL_PROTOCOL });
- context.registerService(URLStreamHandlerService.class.getName(), new ResourcesUrlHandler(), properties);
- }
-
- public void stop(final BundleContext context) throws Exception {
- starter.stop();
- final Bundle[] bundles = context.getBundles();
- for (int i = 0; i < bundles.length; i++) {
- final Bundle bundle = bundles[i];
- if (bundle.getState() >= Bundle.ACTIVE && bundle.getSymbolicName().startsWith("org.freeplane.plugin.")) {
- try {
- bundle.stop();
- }
- catch (final Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/main/osgi/ResourcesUrlHandler.java b/freeplane/src/org/freeplane/main/osgi/ResourcesUrlHandler.java
deleted file mode 100644
index d0b46a5..0000000
--- a/freeplane/src/org/freeplane/main/osgi/ResourcesUrlHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.main.osgi;
-
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLConnection;
-
-import org.freeplane.core.resources.ResourceController;
-import org.osgi.service.url.AbstractURLStreamHandlerService;
-
-public class ResourcesUrlHandler extends AbstractURLStreamHandlerService{
-
- public URLConnection openConnection(URL url) throws IOException{
- return ResourceController.getResourceController().getResource(url.getPath()).openConnection();
- }
-}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/StdXMLBuilder.java b/freeplane/src/org/freeplane/n3/nanoxml/StdXMLBuilder.java
deleted file mode 100644
index 0e40b10..0000000
--- a/freeplane/src/org/freeplane/n3/nanoxml/StdXMLBuilder.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * StdXMLBuilder.java NanoXML/Java $Revision: 1.3 $ $Date: 2002/01/04 21:03:28 $
- * $Name: RELEASE_2_2_1 $ This file is part of NanoXML 2 for Java. Copyright (C)
- * 2000-2002 Marc De Scheemaecker, All Rights Reserved. This software is
- * provided 'as-is', without any express or implied warranty. In no event will
- * the authors be held liable for any damages arising from the use of this
- * software. Permission is granted to anyone to use this software for any
- * purpose, including commercial applications, and to alter it and redistribute
- * it freely, subject to the following restrictions: 1. The origin of this
- * software must not be misrepresented; you must not claim that you wrote the
- * original software. If you use this software in a product, an acknowledgment
- * in the product documentation would be appreciated but is not required. 2.
- * Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software. 3. This notice may not be
- * removed or altered from any source distribution.
- */
-package org.freeplane.n3.nanoxml;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.util.Stack;
-
-/**
- * StdXMLBuilder is a concrete implementation of IXMLBuilder which creates a
- * tree of IXMLElement from an XML data source.
- *
- * @see org.freeplane.n3.nanoxml.XMLElement
- * @author Marc De Scheemaecker
- * @version $Name: RELEASE_2_2_1 $, $Revision: 1.3 $
- */
-class StdXMLBuilder implements IXMLBuilder {
- /**
- * Prototype element for creating the tree.
- */
- private XMLElement prototype;
- /**
- * The root element of the parsed XML tree.
- */
- private XMLElement root;
- /**
- * This stack contains the current element and its parents.
- */
- private Stack<XMLElement> stack;
-
- /**
- * Creates the builder.
- */
- public StdXMLBuilder() {
- this(new XMLElement());
- }
-
- /**
- * Creates the builder.
- *
- * @param prototype
- * the prototype to use when building the tree.
- */
- public StdXMLBuilder(final XMLElement prototype) {
- stack = null;
- root = null;
- this.prototype = prototype;
- }
-
- /**
- * This method is called when a new attribute of an XML element is
- * encountered.
- *
- * @param key
- * the key (name) of the attribute.
- * @param nsPrefix
- * the prefix used to identify the namespace. If no namespace has
- * been specified, this parameter is null.
- * @param nsURI
- * the URI associated with the namespace. If no namespace has
- * been specified, or no URI is associated with nsPrefix, this
- * parameter is null.
- * @param value
- * the value of the attribute.
- * @param type
- * the type of the attribute. If no type is known, "CDATA" is
- * returned.
- * @throws java.lang.Exception
- * If an exception occurred while processing the event.
- */
- public void addAttribute(final String key, final String nsPrefix, final String nsURI, final String value,
- final String type) throws Exception {
- String fullName = key;
- if (nsPrefix != null) {
- fullName = nsPrefix + ':' + key;
- }
- final XMLElement top = (XMLElement) stack.peek();
- if (top.hasAttribute(fullName)) {
- throw new XMLParseException(top.getSystemID(), top.getLineNr(), "Duplicate attribute: " + key);
- }
- if (nsPrefix != null) {
- top.setAttribute(fullName, nsURI, value);
- }
- else {
- top.setAttribute(fullName, value);
- }
- }
-
- /**
- * This method is called when a PCDATA element is encountered. A Java reader
- * is supplied from which you can read the data. The reader will only read
- * the data of the element. You don't need to check for boundaries. If you
- * don't read the full element, the rest of the data is skipped. You also
- * don't have to care about entities; they are resolved by the parser.
- *
- * @param reader
- * the Java reader from which you can retrieve the data.
- * @param systemID
- * the system ID of the XML data source.
- * @param lineNr
- * the line in the source where the element starts.
- */
- public void addPCData(final Reader reader, final String systemID, final int lineNr)
- throws XMLParseException
- {
- int bufSize = 2048;
- int sizeRead = 0;
- final StringBuilder str = new StringBuilder(bufSize);
- final char[] buf = new char[bufSize];
- for (;;) {
- if (sizeRead >= bufSize) {
- bufSize *= 2;
- str.ensureCapacity(bufSize);
- }
- int size;
- try {
- size = reader.read(buf);
- }
- catch (final IOException e) {
- // was caused by a XML syntax error in the data, e.g "x&;"
- if (e.getCause() instanceof XMLParseException) {
- throw (XMLParseException)e.getCause();
- }
- break;
- }
- if (size < 0) {
- break;
- }
- str.append(buf, 0, size);
- sizeRead += size;
- }
- final XMLElement elt = prototype.createElement(null, systemID, lineNr);
- elt.setContent(str.toString());
- if (!stack.empty()) {
- final XMLElement top = (XMLElement) stack.peek();
- top.addChild(elt);
- }
- }
-
- /**
- * This method is called when the attributes of an XML element have been
- * processed.
- *
- * @see #startElement
- * @see #addAttribute
- * @param name
- * the name of the element.
- * @param nsPrefix
- * the prefix used to identify the namespace. If no namespace has
- * been specified, this parameter is null.
- * @param nsURI
- * the URI associated with the namespace. If no namespace has
- * been specified, or no URI is associated with nsPrefix, this
- * parameter is null.
- */
- public void elementAttributesProcessed(final String name, final String nsPrefix, final String nsURI) {
- }
-
- /**
- * This method is called when the end of an XML elemnt is encountered.
- *
- * @see #startElement
- * @param name
- * the name of the element.
- * @param nsPrefix
- * the prefix used to identify the namespace. If no namespace has
- * been specified, this parameter is null.
- * @param nsURI
- * the URI associated with the namespace. If no namespace has
- * been specified, or no URI is associated with nsPrefix, this
- * parameter is null.
- */
- public void endElement(final String name, final String nsPrefix, final String nsURI) {
- final XMLElement elt = (XMLElement) stack.pop();
- if (elt.getChildrenCount() == 1) {
- final XMLElement child = elt.getChildAtIndex(0);
- if (child.getName() == null) {
- elt.setContent(child.getContent());
- elt.removeChildAtIndex(0);
- }
- }
- }
-
- /**
- * Cleans up the object when it's destroyed.
- */
- @Override
- protected void finalize() throws Throwable {
- prototype = null;
- root = null;
- stack.clear();
- stack = null;
- super.finalize();
- }
-
- /**
- * Returns the result of the building process. This method is called just
- * before the <I>parse</I> method of IXMLParser returns.
- *
- * @see org.freeplane.n3.nanoxml.IXMLParser#parse
- * @return the result of the building process.
- */
- public Object getResult() {
- return root;
- }
-
- /**
- * This method is called when a processing instruction is encountered. PIs
- * with target "xml" are handled by the parser.
- *
- * @param target
- * the PI target.
- * @param reader
- * to read the data from the PI.
- */
- public void newProcessingInstruction(final String target, final Reader reader) {
- }
-
- /**
- * This method is called before the parser starts processing its input.
- *
- * @param systemID
- * the system ID of the XML data source.
- * @param lineNr
- * the line on which the parsing starts.
- */
- public void startBuilding(final String systemID, final int lineNr) {
- stack = new Stack<XMLElement>();
- root = null;
- }
-
- /**
- * This method is called when a new XML element is encountered.
- *
- * @see #endElement
- * @param name
- * the name of the element.
- * @param nsPrefix
- * the prefix used to identify the namespace. If no namespace has
- * been specified, this parameter is null.
- * @param nsURI
- * the URI associated with the namespace. If no namespace has
- * been specified, or no URI is associated with nsPrefix, this
- * parameter is null.
- * @param systemID
- * the system ID of the XML data source.
- * @param lineNr
- * the line in the source where the element starts.
- */
- public void startElement(final String name, final String nsPrefix, final String nsURI, final String systemID,
- final int lineNr) {
- String fullName = name;
- if (nsPrefix != null) {
- fullName = nsPrefix + ':' + name;
- }
- final XMLElement elt = new XMLElement(fullName, nsURI, systemID, lineNr);
- if (stack.empty()) {
- root = elt;
- }
- else {
- final XMLElement top = (XMLElement) stack.peek();
- top.addChild(elt);
- }
- stack.push(elt);
- }
-}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLUtil.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLUtil.java
deleted file mode 100644
index b067353..0000000
--- a/freeplane/src/org/freeplane/n3/nanoxml/XMLUtil.java
+++ /dev/null
@@ -1,614 +0,0 @@
-/*
- * XMLUtil.java NanoXML/Java $Revision: 1.5 $ $Date: 2002/02/03 21:19:38 $
- * $Name: RELEASE_2_2_1 $ This file is part of NanoXML 2 for Java. Copyright (C)
- * 2000-2002 Marc De Scheemaecker, All Rights Reserved. This software is
- * provided 'as-is', without any express or implied warranty. In no event will
- * the authors be held liable for any damages arising from the use of this
- * software. Permission is granted to anyone to use this software for any
- * purpose, including commercial applications, and to alter it and redistribute
- * it freely, subject to the following restrictions: 1. The origin of this
- * software must not be misrepresented; you must not claim that you wrote the
- * original software. If you use this software in a product, an acknowledgment
- * in the product documentation would be appreciated but is not required. 2.
- * Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software. 3. This notice may not be
- * removed or altered from any source distribution.
- */
-package org.freeplane.n3.nanoxml;
-
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * Utility methods for NanoXML.
- *
- * @author Marc De Scheemaecker
- * @version $Name: RELEASE_2_2_1 $, $Revision: 1.5 $
- */
-class XMLUtil {
- /**
- * Returns true if the data starts with <I>literal</I>. Enough chars are
- * read to determine this result.
- *
- * @param reader
- * the reader
- * @param literal
- * the literal to check
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static boolean checkLiteral(final IXMLReader reader, final String literal) throws IOException, XMLParseException {
- for (int i = 0; i < literal.length(); i++) {
- if (reader.read() != literal.charAt(i)) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Throws an XMLParseException to indicate that extra data is encountered in
- * a closing tag.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- */
- static void errorClosingTagNotEmpty(final String systemID, final int lineNr) throws XMLParseException {
- throw new XMLParseException(systemID, lineNr, "Closing tag must be empty");
- }
-
- /**
- * Throws an XMLParseException to indicate that an expected string is not
- * encountered.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param expectedString
- * the string that is expected
- */
- static void errorExpectedInput(final String systemID, final int lineNr, final String expectedString)
- throws XMLParseException {
- throw new XMLParseException(systemID, lineNr, "Expected: " + expectedString);
- }
-
- /**
- * Throws an XMLValidationException to indicate that an attribute has an
- * invalid value.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param elementName
- * the name of the element
- * @param attributeName
- * the name of the attribute
- * @param attributeValue
- * the value of that attribute
- */
- static void errorInvalidAttributeValue(final String systemID, final int lineNr, final String elementName,
- final String attributeName, final String attributeValue)
- throws XMLValidationException {
- throw new XMLValidationException(XMLValidationException.ATTRIBUTE_WITH_INVALID_VALUE, systemID, lineNr,
- elementName, attributeName, attributeValue, "Invalid value for attribute " + attributeName);
- }
-
- /**
- * Throws an XMLParseException to indicate that an entity could not be
- * resolved.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param entity
- * the name of the entity
- */
- static void errorInvalidEntity(final String systemID, final int lineNr, final String entity)
- throws XMLParseException {
- throw new XMLParseException(systemID, lineNr, "Invalid entity: `&" + entity + ";'");
- }
-
- /**
- * Throws an XMLParseException to indicate that a string is not expected at
- * this point.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param unexpectedString
- * the string that is unexpected
- */
- static void errorInvalidInput(final String systemID, final int lineNr, final String unexpectedString)
- throws XMLParseException {
- throw new XMLParseException(systemID, lineNr, "Invalid input: " + unexpectedString);
- }
-
- /**
- * Throws an XMLValidationException to indicate that an attribute is
- * missing.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param elementName
- * the name of the element
- * @param attributeName
- * the name of the missing attribute
- */
- static void errorMissingAttribute(final String systemID, final int lineNr, final String elementName,
- final String attributeName) throws XMLValidationException {
- throw new XMLValidationException(XMLValidationException.MISSING_ATTRIBUTE, systemID, lineNr, elementName,
- attributeName,
- /* attributeValue */null, "Element " + elementName + " expects an attribute named " + attributeName);
- }
-
- /**
- * Throws an XMLValidationException to indicate that an element is missing.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param parentElementName
- * the name of the parent element
- * @param missingElementName
- * the name of the missing element
- */
- static void errorMissingElement(final String systemID, final int lineNr, final String parentElementName,
- final String missingElementName) throws XMLValidationException {
- throw new XMLValidationException(XMLValidationException.MISSING_ELEMENT, systemID, lineNr, missingElementName,
- /* attributeName */null,
- /* attributeValue */null, "Element " + parentElementName + " expects to have a " + missingElementName);
- }
-
- /**
- * Throws an XMLValidationException to indicate that a #PCDATA element was
- * missing.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param parentElementName
- * the name of the parent element
- */
- static void errorMissingPCData(final String systemID, final int lineNr, final String parentElementName)
- throws XMLValidationException {
- throw new XMLValidationException(XMLValidationException.MISSING_PCDATA, systemID, lineNr,
- /* elementName */null,
- /* attributeName */null,
- /* attributeValue */null, "Missing #PCDATA in element " + parentElementName);
- }
-
- /**
- * Throws an XMLValidationException to indicate that an attribute is
- * unexpected.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param elementName
- * the name of the element
- * @param attributeName
- * the name of the unexpected attribute
- */
- static void errorUnexpectedAttribute(final String systemID, final int lineNr, final String elementName,
- final String attributeName) throws XMLValidationException {
- throw new XMLValidationException(XMLValidationException.UNEXPECTED_ATTRIBUTE, systemID, lineNr, elementName,
- attributeName,
- /* attributeValue */null, "Element " + elementName + " did not expect an attribute " + "named "
- + attributeName);
- }
-
- /**
- * Throws an XMLParseException to indicate that a CDATA section is
- * unexpected at this point.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- */
- static void errorUnexpectedCDATA(final String systemID, final int lineNr) throws XMLParseException {
- throw new XMLParseException(systemID, lineNr, "No CDATA section is expected here");
- }
-
- /**
- * Throws an XMLValidationException to indicate that an element is
- * unexpected.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param parentElementName
- * the name of the parent element
- * @param unexpectedElementName
- * the name of the unexpected element
- */
- static void errorUnexpectedElement(final String systemID, final int lineNr, final String parentElementName,
- final String unexpectedElementName) throws XMLValidationException {
- throw new XMLValidationException(XMLValidationException.UNEXPECTED_ELEMENT, systemID, lineNr,
- unexpectedElementName,
- /* attributeName */null,
- /* attributeValue */null, "Unexpected " + unexpectedElementName + " in a " + parentElementName);
- }
-
- /**
- * Throws an XMLParseException to indicate that an entity reference is
- * unexpected at this point.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param entity
- * the name of the entity
- */
- static void errorUnexpectedEntity(final String systemID, final int lineNr, final String entity)
- throws XMLParseException {
- throw new XMLParseException(systemID, lineNr, "No entity reference is expected here (" + entity + ")");
- }
-
- /**
- * Throws an XMLValidationException to indicate that a #PCDATA element was
- * unexpected.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param parentElementName
- * the name of the parent element
- */
- static void errorUnexpectedPCData(final String systemID, final int lineNr, final String parentElementName)
- throws XMLValidationException {
- throw new XMLValidationException(XMLValidationException.UNEXPECTED_PCDATA, systemID, lineNr,
- /* elementName */null,
- /* attributeName */null,
- /* attributeValue */null, "Unexpected #PCDATA in element " + parentElementName);
- }
-
- /**
- * Throws an XMLParseException to indicate that the closing tag of an
- * element does not match the opening tag.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param expectedName
- * the name of the opening tag
- * @param wrongName
- * the name of the closing tag
- */
- static void errorWrongClosingTag(final String systemID, final int lineNr, final String expectedName,
- final String wrongName) throws XMLParseException {
- throw new XMLParseException(systemID, lineNr, "Closing tag does not match opening tag: `" + wrongName
- + "' != `" + expectedName + "'");
- }
-
- /**
- * Processes a character literal.
- *
- * @param entity
- * the entity
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static char processCharLiteral(String entity) throws IOException, XMLParseException {
- if (entity.charAt(2) == 'x') {
- entity = entity.substring(3, entity.length() - 1);
- return (char) Integer.parseInt(entity, 16);
- }
- else {
- entity = entity.substring(2, entity.length() - 1);
- return (char) Integer.parseInt(entity, 10);
- }
- }
-
- /**
- * Processes an entity.
- *
- * @param entity
- * the entity
- * @param reader
- * the reader
- * @param entityResolver
- * the entity resolver
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static void processEntity(String entity, final IXMLReader reader, final IXMLEntityResolver entityResolver)
- throws IOException, XMLParseException {
- entity = entity.substring(1, entity.length() - 1);
- final Reader entityReader = entityResolver.getEntity(reader, entity);
- if (entityReader == null) {
- XMLUtil.errorInvalidEntity(reader.getSystemID(), reader.getLineNr(), entity);
- }
- final boolean externalEntity = entityResolver.isExternalEntity(entity);
- reader.startNewStream(entityReader, !externalEntity);
- }
-
- /**
- * Reads a character from the reader.
- *
- * @param reader
- * the reader
- * @param entityChar
- * the escape character (& or %) used to indicate an entity
- * @return the character, or an entity expression (like e.g. <)
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static String read(final IXMLReader reader, final char entityChar) throws IOException, XMLParseException {
- char ch = reader.read();
- final StringBuilder buf = new StringBuilder();
- buf.append(ch);
- if (ch == entityChar) {
- while (ch != ';') {
- ch = reader.read();
- buf.append(ch);
- }
- }
- return buf.toString();
- }
-
- /**
- * Reads a character from the reader disallowing entities.
- *
- * @param reader
- * the reader
- * @param entityChar
- * the escape character (& or %) used to indicate an entity
- */
- static char readChar(final IXMLReader reader, final char entityChar) throws IOException, XMLParseException {
- final String str = XMLUtil.read(reader, entityChar);
- final char ch = str.charAt(0);
- if (ch == entityChar) {
- XMLUtil.errorUnexpectedEntity(reader.getSystemID(), reader.getLineNr(), str);
- }
- return ch;
- }
-
- /**
- * Retrieves an identifier from the data.
- *
- * @param reader
- * the reader
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static String scanIdentifier(final IXMLReader reader) throws IOException, XMLParseException {
- final StringBuilder result = new StringBuilder();
- for (;;) {
- final char ch = reader.read();
- if ((ch == '_') || (ch == ':') || (ch == '-') || (ch == '.') || ((ch >= 'a') && (ch <= 'z'))
- || ((ch >= 'A') && (ch <= 'Z')) || ((ch >= '0') && (ch <= '9')) || (ch > '\u007E')) {
- result.append(ch);
- }
- else {
- reader.unread(ch);
- break;
- }
- }
- return result.toString();
- }
-
- /**
- * Scans a public ID.
- *
- * @param publicID
- * will contain the public ID
- * @param reader
- * the reader
- * @return the system ID
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static String scanPublicID(final StringBuilder publicID, final IXMLReader reader) throws IOException,
- XMLParseException {
- if (!XMLUtil.checkLiteral(reader, "UBLIC")) {
- return null;
- }
- XMLUtil.skipWhitespace(reader, null);
- publicID.append(XMLUtil.scanString(reader, '\0', null));
- XMLUtil.skipWhitespace(reader, null);
- return XMLUtil.scanString(reader, '\0', null);
- }
-
- /**
- * Retrieves a delimited string from the data.
- *
- * @param reader
- * the reader
- * @param entityChar
- * the escape character (& or %)
- * @param entityResolver
- * the entity resolver
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static String scanString(final IXMLReader reader, final char entityChar, final IXMLEntityResolver entityResolver)
- throws IOException, XMLParseException {
- final StringBuilder result = new StringBuilder();
- final int startingLevel = reader.getStreamLevel();
- final char delim = reader.read();
- if ((delim != '\'') && (delim != '"')) {
- XMLUtil.errorExpectedInput(reader.getSystemID(), reader.getLineNr(), "delimited string");
- }
- for (;;) {
- String str = XMLUtil.read(reader, entityChar);
- final char ch = str.charAt(0);
- if (ch == entityChar) {
- if (str.charAt(1) == '#') {
- result.append(XMLUtil.processCharLiteral(str));
- }
- else {
- XMLUtil.processEntity(str, reader, entityResolver);
- }
- }
- else if (ch == '&') {
- reader.unread(ch);
- str = XMLUtil.read(reader, '&');
- if (str.charAt(1) == '#') {
- result.append(XMLUtil.processCharLiteral(str));
- }
- else {
- result.append(str);
- }
- }
- else if (reader.getStreamLevel() == startingLevel) {
- if (ch == delim) {
- break;
- }
- else if ((ch == 9) || (ch == 10) || (ch == 13)) {
- result.append(' ');
- }
- else {
- result.append(ch);
- }
- }
- else {
- result.append(ch);
- }
- }
- return result.toString();
- }
-
- /**
- * Scans a system ID.
- *
- * @param reader
- * the reader
- * @return the system ID
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static String scanSystemID(final IXMLReader reader) throws IOException, XMLParseException {
- if (!XMLUtil.checkLiteral(reader, "YSTEM")) {
- return null;
- }
- XMLUtil.skipWhitespace(reader, null);
- return XMLUtil.scanString(reader, '\0', null);
- }
-
- /**
- * Skips the remainder of a comment. It is assumed that <!- is already
- * read.
- *
- * @param reader
- * the reader
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static void skipComment(final IXMLReader reader) throws IOException, XMLParseException {
- if (reader.read() != '-') {
- XMLUtil.errorExpectedInput(reader.getSystemID(), reader.getLineNr(), "<!--");
- }
- int dashesRead = 0;
- for (;;) {
- final char ch = reader.read();
- switch (ch) {
- case '-':
- dashesRead++;
- break;
- case '>':
- if (dashesRead == 2) {
- return;
- }
- default:
- dashesRead = 0;
- }
- }
- }
-
- /**
- * Skips the remainder of the current XML tag.
- *
- * @param reader
- * the reader
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static void skipTag(final IXMLReader reader) throws IOException, XMLParseException {
- int level = 1;
- while (level > 0) {
- final char ch = reader.read();
- switch (ch) {
- case '<':
- ++level;
- break;
- case '>':
- --level;
- break;
- }
- }
- }
-
- /**
- * Skips whitespace from the reader.
- *
- * @param reader
- * the reader
- * @param buffer
- * where to put the whitespace; null if the whitespace does not
- * have to be stored.
- * @throws java.io.IOException
- * if an error occurred reading the data
- */
- static void skipWhitespace(final IXMLReader reader, final StringBuilder buffer) throws IOException {
- char ch;
- if (buffer == null) {
- do {
- ch = reader.read();
- } while ((ch == ' ') || (ch == '\t') || (ch == '\n'));
- }
- else {
- for (;;) {
- ch = reader.read();
- if ((ch != ' ') && (ch != '\t') && (ch != '\n')) {
- break;
- }
- if (ch == '\n') {
- buffer.append('\n');
- }
- else {
- buffer.append(' ');
- }
- }
- }
- reader.unread(ch);
- }
-
- /**
- * Throws an XMLValidationException.
- *
- * @param systemID
- * the system ID of the data source
- * @param lineNr
- * the line number in the data source
- * @param message
- * the error message
- * @param elementName
- * the name of the element
- * @param attributeName
- * the name of the attribute
- * @param attributeValue
- * the value of that attribute
- */
- static void validationError(final String systemID, final int lineNr, final String message,
- final String elementName, final String attributeName, final String attributeValue)
- throws XMLValidationException {
- throw new XMLValidationException(XMLValidationException.MISC_ERROR, systemID, lineNr, elementName,
- attributeName, attributeValue, message);
- }
-}
diff --git a/freeplane/src/org/freeplane/n3/nanoxml/XMLWriter.java b/freeplane/src/org/freeplane/n3/nanoxml/XMLWriter.java
deleted file mode 100644
index fa637c6..0000000
--- a/freeplane/src/org/freeplane/n3/nanoxml/XMLWriter.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * XMLWriter.java NanoXML/Java $Revision: 1.4 $ $Date: 2002/03/24 11:37:51 $
- * $Name: RELEASE_2_2_1 $ This file is part of NanoXML 2 for Java. Copyright (C)
- * 2000-2002 Marc De Scheemaecker, All Rights Reserved. This software is
- * provided 'as-is', without any express or implied warranty. In no event will
- * the authors be held liable for any damages arising from the use of this
- * software. Permission is granted to anyone to use this software for any
- * purpose, including commercial applications, and to alter it and redistribute
- * it freely, subject to the following restrictions: 1. The origin of this
- * software must not be misrepresented; you must not claim that you wrote the
- * original software. If you use this software in a product, an acknowledgment
- * in the product documentation would be appreciated but is not required. 2.
- * Altered source versions must be plainly marked as such, and must not be
- * misrepresented as being the original software. 3. This notice may not be
- * removed or altered from any source distribution.
- */
-package org.freeplane.n3.nanoxml;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.Writer;
-import java.util.Enumeration;
-import java.util.Vector;
-
-/**
- * An XMLWriter writes XML data to a stream.
- *
- * @see org.freeplane.n3.nanoxml.XMLElement
- * @see java.io.Writer
- * @author Marc De Scheemaecker
- * @version $Name: RELEASE_2_2_1 $, $Revision: 1.4 $
- */
-public class XMLWriter {
- /**
- * Where to write the output to.
- */
- private PrintWriter writer;
- private boolean inContent = false;
-
- /**
- * Creates a new XML writer.
- *
- * @param stream
- * where to write the output to.
- */
- public XMLWriter(final OutputStream stream) {
- writer = new PrintWriter(stream);
- }
-
- /**
- * Creates a new XML writer.
- *
- * @param writer
- * where to write the output to.
- */
- public XMLWriter(final Writer writer) {
- if (writer instanceof PrintWriter) {
- this.writer = (PrintWriter) writer;
- }
- else {
- this.writer = new PrintWriter(writer);
- }
- }
-
- /**
- * Cleans up the object when it's destroyed.
- */
- @Override
- protected void finalize() throws Throwable {
- writer = null;
- super.finalize();
- }
-
- /**
- * Writes an XML element.
- *
- * @param xml
- * the non-null XML element to write.
- */
- public void write(final XMLElement xml) throws IOException {
- this.write(xml, false, 0, true);
- }
-
- /**
- * Writes an XML element.
- *
- * @param xml
- * the non-null XML element to write.
- * @param prettyPrint
- * if spaces need to be inserted to make the output more readable
- */
- public void write(final XMLElement xml, final boolean prettyPrint) throws IOException {
- this.write(xml, prettyPrint, 0, true);
- }
-
- /**
- * Writes an XML element.
- *
- * @param xml
- * the non-null XML element to write.
- * @param prettyPrint
- * if spaces need to be inserted to make the output more readable
- * @param indent
- * how many spaces to indent the element.
- */
- public void write(final XMLElement xml, final boolean prettyPrint, final int indent) throws IOException {
- this.write(xml, prettyPrint, indent, true);
- }
-
- /**
- * Writes an XML element.
- *
- * @param xml
- * the non-null XML element to write.
- * @param prettyPrint
- * if spaces need to be inserted to make the output more readable
- * @param indent
- * how many spaces to indent the element.
- */
- public void write(final XMLElement xml, final boolean prettyPrint, final int indent,
- final boolean collapseEmptyElements) throws IOException {
- if (prettyPrint) {
- for (int i = 0; i < indent; i++) {
- writer.print(' ');
- }
- }
- if (xml.getName() == null) {
- if (xml.getContent() != null) {
- if (prettyPrint) {
- this.writeEncodedContent(xml.getContent().trim());
- writer.println();
- }
- else {
- this.writeEncodedContent(xml.getContent());
- }
- }
- }
- else {
- writer.print('<');
- writer.print(xml.getFullName());
- final Vector<String> nsprefixes = new Vector<String>();
- if (xml.getNamespace() != null) {
- if (xml.getName().equals(xml.getFullName())) {
- writer.print(" xmlns=\"" + xml.getNamespace() + '"');
- }
- else {
- String prefix = xml.getFullName();
- prefix = prefix.substring(0, prefix.indexOf(':'));
- nsprefixes.addElement(prefix);
- writer.print(" xmlns:" + prefix);
- writer.print("=\"" + xml.getNamespace() + "\"");
- }
- }
- Enumeration<String> enumAttributeNames = xml.enumerateAttributeNames();
- while (enumAttributeNames.hasMoreElements()) {
- final String key = enumAttributeNames.nextElement();
- final int index = key.indexOf(':');
- if (index >= 0) {
- final String namespace = xml.getAttributeNamespace(key);
- if (namespace != null) {
- final String prefix = key.substring(0, index);
- if (!nsprefixes.contains(prefix)) {
- writer.print(" xmlns:" + prefix);
- writer.print("=\"" + namespace + '"');
- nsprefixes.addElement(prefix);
- }
- }
- }
- }
- enumAttributeNames = xml.enumerateAttributeNames();
- while (enumAttributeNames.hasMoreElements()) {
- final String key = enumAttributeNames.nextElement();
- final String value = xml.getAttribute(key, null);
- writer.print(" " + key + "=\"");
- this.writeEncoded(value);
- writer.print('"');
- }
- if ((xml.getContent() != null) && (xml.getContent().length() > 0)) {
- writer.print('>');
- this.writeEncodedContent(xml.getContent());
- writer.print("</" + xml.getFullName() + '>');
- if (prettyPrint) {
- writer.println();
- }
- }
- else if (xml.hasChildren() || (!collapseEmptyElements)) {
- writer.print('>');
- if (prettyPrint) {
- writer.println();
- }
- Enumeration<XMLElement> children = xml.enumerateChildren();
- while (children.hasMoreElements()) {
- final XMLElement child = children.nextElement();
- this.write(child, prettyPrint, indent + 4, collapseEmptyElements);
- }
- if (prettyPrint) {
- for (int i = 0; i < indent; i++) {
- writer.print(' ');
- }
- }
- writer.print("</" + xml.getFullName() + ">");
- if (prettyPrint) {
- writer.println();
- }
- }
- else {
- writer.print("/>");
- if (prettyPrint) {
- writer.println();
- }
- }
- }
- writer.flush();
- }
-
- public void addRawContent(final String comment) {
- writer.write(comment);
- }
-
- /**
- * Writes a string encoding reserved characters.
- *
- * @param str
- * the string to write.
- */
- protected void writeEncoded(final String str) {
- for (int i = 0; i < str.length(); i++) {
- final char c = str.charAt(i);
- switch (c) {
- case '<':
- writer.print("<");
- break;
- case '>':
- writer.print(">");
- break;
- case '&':
- writer.print("&");
- break;
- case '\'':
- writer.print("'");
- break;
- case '"':
- writer.print(""");
- break;
- case 0x0A:
- if(inContent){
- writer.print(c);
- break;
- }
- default:
- if ((c < ' ') || (c > 0x7E)) {
- writer.print("&#x");
- writer.print(Integer.toString(c, 16));
- writer.print(';');
- }
- else {
- writer.print(c);
- }
- }
- }
- }
-
- /**
- * Writes a string as encoded content string.
- *
- * @param str
- * the string to write.
- */
- protected void writeEncodedContent(final String str) {
- inContent = true;
- writeEncoded(str);
- inContent = false;
- }
-
- public PrintWriter getWriter() {
- return writer;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/BlinkingNodeHook.java b/freeplane/src/org/freeplane/view/swing/features/BlinkingNodeHook.java
deleted file mode 100644
index b79b754..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/BlinkingNodeHook.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.EventQueue;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.Vector;
-
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.SysUtils;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.IMapLifeCycleListener;
-import org.freeplane.features.map.INodeView;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.ui.INodeViewVisitor;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- */
- at NodeHookDescriptor(hookName = "accessories/plugins/BlinkingNodeHook.properties", onceForMap = false)
-public class BlinkingNodeHook extends PersistentNodeHook {
- protected class TimerColorChanger extends TimerTask implements IExtension, IMapChangeListener,
- IMapLifeCycleListener {
- final private NodeModel node;
- final private Timer timer;
-
- TimerColorChanger(final NodeModel node) {
- this.node = node;
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- mapController.addMapChangeListener(this);
- mapController.addMapLifeCycleListener(this);
- timer = SysUtils.createTimer(getClass().getSimpleName());
- timer.schedule(this, 500, 500);
- BlinkingNodeHook.colors.clear();
- BlinkingNodeHook.colors.add(Color.BLUE);
- BlinkingNodeHook.colors.add(Color.RED);
- BlinkingNodeHook.colors.add(Color.MAGENTA);
- BlinkingNodeHook.colors.add(Color.CYAN);
- }
-
- public NodeModel getNode() {
- return node;
- }
-
- public Timer getTimer() {
- return timer;
- }
-
- /** TimerTask method to enable the selection after a given time. */
- @Override
- public void run() {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- if (getNode() == null || Controller.getCurrentModeController().isBlocked()) {
- return;
- }
- getNode().acceptViewVisitor(new INodeViewVisitor() {
- public void visit(final INodeView nodeView) {
- if(! (nodeView instanceof NodeView)){
- return;
- }
- final Component container = ((NodeView)nodeView).getMainView();
- if (container == null || !container.isVisible()) {
- return;
- }
- final Color col = container.getForeground();
- int index = -1;
- if (col != null && BlinkingNodeHook.colors.contains(col)) {
- index = BlinkingNodeHook.colors.indexOf(col);
- }
- index++;
- if (index >= BlinkingNodeHook.colors.size()) {
- index = 0;
- }
- container.setForeground(BlinkingNodeHook.colors.get(index));
- }
- });
- }
- });
- }
-
- public void mapChanged(final MapChangeEvent event) {
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- if (Controller.getCurrentModeController().isUndoAction() || !(node.equals(child) || node.isDescendantOf(child))) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- remove(node, node.getExtension(TimerColorChanger.class));
- }
- });
- }
-
- public String getDescription() {
- return "BlinkingNodeHook.timer";
- }
-
- public void undo() {
- node.addExtension(new TimerColorChanger(node));
- }
- };
- Controller.getCurrentModeController().execute(actor, node.getMap());
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void onPreNodeDelete(final NodeModel oldParent, final NodeModel selectedNode, final int index) {
- }
-
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void onCreate(final MapModel map) {
- }
-
- public void onRemove(final MapModel map) {
- if (node.getMap().equals(map)) {
- timer.cancel();
- }
- }
- }
-
- static Vector<Color> colors = new Vector<Color>();
-
- public BlinkingNodeHook() {
- super();
- }
-
- @Override
- protected IExtension createExtension(final NodeModel node, final XMLElement element) {
- return new TimerColorChanger(node);
- }
-
- @Override
- protected Class<TimerColorChanger> getExtensionClass() {
- return TimerColorChanger.class;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.extensions.MindMapHook#shutdownMapHook()
- */
- @Override
- public void remove(final NodeModel node, final IExtension extension) {
- final TimerColorChanger timer = ((TimerColorChanger) extension);
- timer.getTimer().cancel();
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- mapController.removeMapChangeListener(timer);
- mapController.removeMapLifeCycleListener(timer);
- super.remove(node, extension);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/BitmapViewerFactory.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/BitmapViewerFactory.java
deleted file mode 100644
index 72cfad0..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/filepreview/BitmapViewerFactory.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.filepreview;
-
-import java.awt.Dimension;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-import javax.imageio.ImageReader;
-import javax.swing.JComponent;
-
-import org.freeplane.core.ui.components.BitmapViewerComponent;
-import org.freeplane.core.util.TextUtils;
-
-/**
- * @author Dimitry Polivaev
- * 22.08.2009
- */
-public class BitmapViewerFactory implements IViewerFactory {
- public boolean accept(final URI uri) {
- final Iterator<ImageReader> readers = getImageReaders(uri);
- return readers.hasNext();
- }
-
- private Iterator<ImageReader> getImageReaders(final URI uri) {
- String path = uri.getRawPath();
- final int suffixPos = path.lastIndexOf('.') + 1;
- if (suffixPos == 0) {
- final List<ImageReader> empty = Collections.emptyList();
- return empty.iterator();
- }
- final String suffix = path.substring(suffixPos);
- final Iterator<ImageReader> readers = ImageIO.getImageReadersBySuffix(suffix);
- return readers;
- }
-
- public JComponent createViewer(final ExternalResource resource, final URI uri, int maximumWidth) throws MalformedURLException,
- IOException {
- final BitmapViewerComponent bitmapViewerComponent = new BitmapViewerComponent(uri);
- final Dimension originalSize = bitmapViewerComponent.getOriginalSize();
- float zoom = resource.getZoom();
- if(zoom == -1){
- zoom = resource.setZoom(originalSize.width, maximumWidth);
- }
- originalSize.width = (int) (originalSize.width * zoom);
- originalSize.height = (int) (originalSize.height * zoom);
- setFinalViewerSize(bitmapViewerComponent, originalSize);
- bitmapViewerComponent.setSize(originalSize);
- bitmapViewerComponent.setLayout(new ViewerLayoutManager(1f));
- return bitmapViewerComponent;
- }
-
- public JComponent createViewer(final URI uri, final Dimension preferredSize) throws MalformedURLException,
- IOException {
- final BitmapViewerComponent bitmapViewerComponent = new BitmapViewerComponent(uri);
- setFinalViewerSize(bitmapViewerComponent, preferredSize);
- bitmapViewerComponent.setSize(preferredSize);
- return bitmapViewerComponent;
- }
-
- public String getDescription() {
- return TextUtils.getText("bitmaps");
- }
-
- public Dimension getOriginalSize(final JComponent viewer) {
- return ((BitmapViewerComponent) viewer).getOriginalSize();
- }
-
- public void setFinalViewerSize(final JComponent viewer, final Dimension size) {
- viewer.setPreferredSize(size);
- ((BitmapViewerComponent) viewer).setScaleEnabled(true);
- }
-
- public void setDraftViewerSize(JComponent viewer, Dimension size) {
- viewer.setPreferredSize(size);
- ((BitmapViewerComponent) viewer).setScaleEnabled(false);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalResource.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalResource.java
deleted file mode 100644
index 33ca56d..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/filepreview/ExternalResource.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.freeplane.view.swing.features.filepreview;
-
-import java.awt.Dimension;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.swing.JComponent;
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.NodeView;
-
-public class ExternalResource implements IExtension {
- final private Set<NodeView> viewers;
-
- public ExternalResource(URI uri) {
- if(uri == null)
- throw new NullPointerException();
- viewers = new HashSet<NodeView>();
- this.uri = uri;
- }
-
- void removeViewers() {
- for (final NodeView nodeView : viewers) {
- nodeView.removeContent(ViewerController.VIEWER_POSITION);
- }
- viewers.clear();
- }
-
- public Set<NodeView> getViewers() {
- return viewers;
- }
-
- public URI getUri() {
- return uri;
- }
-
- public URI getAbsoluteUri(final MapModel map) {
- try {
- final UrlManager urlManager = (UrlManager) Controller.getCurrentModeController().getExtension(UrlManager.class);
- final URI absoluteUri = urlManager.getAbsoluteUri(map, uri);
- return absoluteUri;
- }
- catch (final MalformedURLException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- final private URI uri;
- private float zoom = -1f;
-
- public float getZoom() {
- return zoom;
- }
-
- public void setZoom(final float r) {
- zoom = r;
- for (final NodeView nodeView : viewers) {
- final JComponent viewer = nodeView.getContent(ViewerController.VIEWER_POSITION);
- final IViewerFactory factory = (IViewerFactory) viewer.getClientProperty(IViewerFactory.class);
- final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, viewer);
- final Dimension preferredSize = factory.getOriginalSize(viewer);
- preferredSize.width = (int) (preferredSize.width * r);
- preferredSize.height = (int) (preferredSize.height * r);
- preferredSize.width = mapView.getZoomed(preferredSize.width);
- preferredSize.height = mapView.getZoomed(preferredSize.height);
- factory.setFinalViewerSize(viewer, preferredSize);
- viewer.revalidate();
- }
- }
-
- public float setZoom(final int originalWidth, final int maximumWidth) {
- float zoom;
- final float zoomedWidth;
- if(originalWidth <= maximumWidth){
- zoomedWidth = originalWidth;
- zoom = 1;
- }
- else{
- zoomedWidth = maximumWidth;
- zoom = zoomedWidth /originalWidth;
- }
- setZoom(zoom);
- return zoom;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/IViewerFactory.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/IViewerFactory.java
deleted file mode 100644
index a485534..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/filepreview/IViewerFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.freeplane.view.swing.features.filepreview;
-
-import java.awt.Dimension;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URI;
-
-import javax.swing.JComponent;
-
-public interface IViewerFactory {
- /**
- * Returns true if factory can create viewer component for given URI
- */
- boolean accept(URI uri);
-
- /**
- * Creates viewer component for given URI with given preferred size
- */
- JComponent createViewer(URI uri, final Dimension preferredSize) throws MalformedURLException, IOException;
-
- /**
- * Creates viewer component for given URI calculating its preferred size from the zoom of the resource
- */
- JComponent createViewer(ExternalResource resource, URI absoluteUri, int maximumWidth) throws MalformedURLException, IOException;
-
- /**
- * Returns not scaled size of the displayed component
- */
- Dimension getOriginalSize(JComponent viewer);
-
- /**
- * Adjusts size of the given viewer component after the mouse button is released
- */
- void setFinalViewerSize(JComponent viewer, Dimension size);
- /**
- * Adjusts size of the given viewer component inside resize operation by mouse drag
- */
- void setDraftViewerSize(JComponent viewer, Dimension size);
-
- /**
- * Returns description to be used in a user interface
- */
- String getDescription();
-
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ImagePreview.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/ImagePreview.java
deleted file mode 100644
index d659347..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/filepreview/ImagePreview.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.freeplane.view.swing.features.filepreview;
-
-import java.awt.Dimension;
-import java.awt.Image;
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-
-import javax.swing.JComponent;
-import javax.swing.JFileChooser;
-
-import org.freeplane.core.ui.components.BitmapImagePreview;
-import org.freeplane.core.ui.components.BitmapViewerComponent;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.view.swing.features.filepreview.ViewerController.FactoryFileFilter;
-
-/* ImagePreview.java by FileChooserDemo2.java. */
-public class ImagePreview extends BitmapImagePreview {
- private static final long serialVersionUID = 1L;
-
- public ImagePreview(final JFileChooser fc) {
- super(fc);
- }
-
- @Override
- protected void updateView(final File file) {
- final FactoryFileFilter filter = (FactoryFileFilter) fc.getFileFilter();
- final Dimension size = getSize();
- size.width -= 2 * BORDER_WIDTH;
- size.height -= 2 * BORDER_WIDTH;
- JComponent viewer;
- try {
- viewer = filter.getFactory().createViewer(file.getAbsoluteFile().toURI(), size);
- }
- catch (final MalformedURLException e) {
- LogUtils.warn(e);
- return;
- }
- catch (final IOException e) {
- LogUtils.warn(e);
- return;
- }
- if (viewer == null) {
- return;
- }
- viewer.setLocation(BORDER_WIDTH, BORDER_WIDTH);
- if (viewer instanceof BitmapViewerComponent) {
- ((BitmapViewerComponent) viewer).setHint(Image.SCALE_FAST);
- }
- add(viewer);
- viewer.revalidate();
- viewer.repaint();
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerController.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerController.java
deleted file mode 100644
index 0e0d49c..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerController.java
+++ /dev/null
@@ -1,711 +0,0 @@
-package org.freeplane.view.swing.features.filepreview;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.KeyboardFocusManager;
-import java.awt.dnd.DropTarget;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.swing.JComponent;
-import javax.swing.JFileChooser;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.SwingUtilities;
-import javax.swing.border.MatteBorder;
-import javax.swing.filechooser.FileFilter;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.INodeView;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.ui.INodeViewLifeCycleListener;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.view.swing.features.progress.mindmapmode.ProgressIcons;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.NodeView;
-
- at NodeHookDescriptor(hookName = "ExternalObject", //
-onceForMap = false)
-public class ViewerController extends PersistentNodeHook implements INodeViewLifeCycleListener, IExtension {
- private static final MExternalImageDropListener DTL = new MExternalImageDropListener();
-
- private final class CombiFactory implements IViewerFactory {
- private IViewerFactory factory;
-
- public JComponent createViewer(final URI uri, final Dimension preferredSize) throws MalformedURLException,
- IOException {
- factory = getViewerFactory(uri);
- return factory == null ? null : factory.createViewer(uri, preferredSize);
- }
-
- public JComponent createViewer(final ExternalResource resource, final URI absoluteUri, final int maximumWidth)
- throws MalformedURLException, IOException {
- factory = getViewerFactory(absoluteUri);
- return factory.createViewer(resource, absoluteUri, maximumWidth);
- }
-
- public String getDescription() {
- final StringBuilder sb = new StringBuilder();
- for (final IViewerFactory factory : factories) {
- if (sb.length() != 0) {
- sb.append(", ");
- }
- sb.append(factory.getDescription());
- }
- return sb.toString();
- }
-
- public Dimension getOriginalSize(final JComponent viewer) {
- return factory.getOriginalSize(viewer);
- }
-
- public void setFinalViewerSize(final JComponent viewer, final Dimension size) {
- factory.setFinalViewerSize(viewer, size);
- }
-
- public void setDraftViewerSize(JComponent viewer, Dimension size) {
- factory.setDraftViewerSize(viewer, size);
-
- }
- public boolean accept(final URI uri) {
- return getViewerFactory(uri) != null;
- }
-
- }
-
- static final class FactoryFileFilter extends FileFilter {
- private final IViewerFactory factory;
-
- protected IViewerFactory getFactory() {
- return factory;
- }
-
- private FactoryFileFilter(final IViewerFactory factory) {
- this.factory = factory;
- }
-
- @Override
- public boolean accept(final File f) {
- return f.isDirectory() || factory.accept(f.toURI());
- }
-
- @Override
- public String getDescription() {
- return factory.getDescription();
- }
- }
-
- private class MyMouseListener implements MouseListener, MouseMotionListener {
- private boolean isActive = false;
- private boolean sizeChanged = false;
-
- public void mouseClicked(final MouseEvent e) {
- if (resetSize(e)) {
- return;
- }
- if (showNext(e)) {
- return;
- }
- }
-
- private boolean resetSize(final MouseEvent e) {
- if (e.getClickCount() != 2) {
- return false;
- }
- final JComponent viewer = (JComponent) e.getComponent();
- final int x = e.getX();
- final int width = viewer.getWidth();
- final int y = e.getY();
- final int height = viewer.getHeight();
- if (x < width - 4 * BORDER_SIZE || y < height - 4 * BORDER_SIZE) {
- return false;
- }
- final IViewerFactory factory = (IViewerFactory) viewer.getClientProperty(IViewerFactory.class);
- if (factory == null) {
- return true;
- }
- final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, viewer);
- setZoom(mapView.getModeController(), mapView.getModel(), (ExternalResource) viewer
- .getClientProperty(ExternalResource.class), 1f);
- sizeChanged = false;
- return true;
- }
-
- private boolean showNext(final MouseEvent e) {
- //double left click
- final JComponent component = (JComponent) e.getComponent();
- final int cursorType = component.getCursor().getType();
- if ((e.getClickCount() != 2) || (e.getButton() != MouseEvent.BUTTON1)
- || (cursorType == Cursor.SE_RESIZE_CURSOR)) {
- return false;
- }
- final ExternalResource activeView = getModel(e);
- NodeModel node = null;
- //get node from mouse click
- for (int i = 0; i < e.getComponent().getParent().getComponentCount(); i++) {
- if (e.getComponent().getParent().getComponent(i) instanceof MainView) {
- final MainView mv = (MainView) e.getComponent().getParent().getComponent(i);
- node = mv.getNodeView().getModel();
- break;
- }
- }
- if (node == null) {
- node = Controller.getCurrentModeController().getMapController().getSelectedNode();
- }
- final MapModel map = node.getMap();
- URI absoluteUri = activeView.getAbsoluteUri(map);
- if(absoluteUri == null)
- return false;
- final String sActUri = absoluteUri.toString();
- if (!sActUri.matches(".*_[0-9]{2}\\.[a-zA-Z0-9]*")) {
- return false;
- }
- int i = Integer.parseInt(sActUri.substring(sActUri.lastIndexOf("_") + 1, sActUri.lastIndexOf("_") + 3));
- //show previous with ctrl + double click
- if (e.isControlDown()) {
- if (i > 0) {
- i--;
- }
- else {
- //remove view if 0 and down
- if (activeView.getUri().toString().matches(ProgressIcons.EXTENDED_PROGRESS_ICON_IDENTIFIER)) {
- ProgressIcons.removeProgressIcons(node);
- }
- remove(node, activeView);
- Controller.getCurrentModeController().getMapController().nodeChanged(node,
- NodeModel.UNKNOWN_PROPERTY, null, null);
- return true;
- }
- }
- else {
- i++;
- }
- final String sNextNum;
- if (i < 10) {
- sNextNum = "0" + Integer.toString(i);
- }
- else {
- sNextNum = Integer.toString(i);
- }
- URI nextUri = null;
- try {
- nextUri = new URI(sActUri.replaceFirst("_[0-9]{2}\\.", "_" + sNextNum + "."));
- }
- catch (final URISyntaxException e1) {
- e1.printStackTrace();
- }
- final String sNextURI = nextUri.getPath();
- if ((sNextURI.contains("_tenth_")&& (i > 10))|| ((sNextURI.contains("_quarter_"))&& (i > 4))) {
- return false;
- }
- final ExternalResource nextView = new ExternalResource(nextUri);
- nextView.setZoom(activeView.getZoom());
- remove(node, activeView);
- add(node, nextView);
- ProgressIcons.updateExtendedProgressIcons(node, sNextURI);
- return true;
- }
-
- public void mouseEntered(final MouseEvent e) {
- if (isActive) {
- return;
- }
- final ExternalResource model = getModel(e);
- if (model == null) {
- return;
- }
- Controller.getCurrentController().getViewController().out(model.getUri().toString());
- setCursor(e);
- }
-
- private ExternalResource getModel(final MouseEvent e) {
- final JComponent component = (JComponent) e.getComponent();
- final ExternalResource model = (ExternalResource) component.getClientProperty(ExternalResource.class);
- return model;
- }
-
- public void mouseExited(final MouseEvent e) {
- if (isActive) {
- return;
- }
- setCursor(e);
- }
-
- private void setCursor(final MouseEvent e) {
- final Component component = e.getComponent();
- final int cursorType;
- final int x = e.getX();
- final int width = component.getWidth();
- final int y = e.getY();
- final int height = component.getHeight();
- if (width - 6 * BORDER_SIZE <= x && x <= width && height - 6 * BORDER_SIZE <= y && y <= height) {
- cursorType = Cursor.SE_RESIZE_CURSOR;
- }
- else {
- cursorType = Cursor.DEFAULT_CURSOR;
- }
- final Cursor cursor = component.getCursor();
- if (cursor.getType() != cursorType) {
- final Cursor predefinedCursor = cursorType == Cursor.DEFAULT_CURSOR ? null : Cursor
- .getPredefinedCursor(cursorType);
- component.setCursor(predefinedCursor);
- }
- }
-
- public void mousePressed(final MouseEvent e) {
- final JComponent component = (JComponent) e.getComponent();
- final int cursorType = component.getCursor().getType();
- if (cursorType == Cursor.SE_RESIZE_CURSOR) {
- final IViewerFactory factory = (IViewerFactory) component.getClientProperty(IViewerFactory.class);
- if (factory == null) {
- return;
- }
- isActive = true;
- return;
- }
- else {
- imagePopupMenu.maybeShowPopup(e);
- return;
- }
- }
-
- public void mouseReleased(final MouseEvent e) {
- if (sizeChanged) {
- final JComponent component = (JComponent) e.getComponent();
- final int x = component.getWidth();
- final int y = component.getHeight();
- final IViewerFactory factory = (IViewerFactory) component.getClientProperty(IViewerFactory.class);
- final double r = Math.sqrt(x * x + y * y);
- final Dimension originalSize = factory.getOriginalSize(component);
- final int w = originalSize.width;
- final int h = originalSize.height;
- final double r0 = Math.sqrt(w * w + h * h);
- final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, component);
- final float zoom = mapView.getZoom();
- final float modelSize = (float) (r / r0 / zoom);
- setZoom(mapView.getModeController(), mapView.getModel(), (ExternalResource) component
- .getClientProperty(ExternalResource.class), modelSize);
- sizeChanged = false;
- }
- else {
- imagePopupMenu.maybeShowPopup(e);
- }
- isActive = false;
- setCursor(e);
- }
-
- public void mouseDragged(final MouseEvent e) {
- if (!isActive) {
- return;
- }
- setSize(e);
- }
-
- private boolean setSize(final MouseEvent e) {
- if (!isActive) {
- return false;
- }
- final JComponent component = (JComponent) e.getComponent();
- final int cursorType = component.getCursor().getType();
- final IViewerFactory factory = (IViewerFactory) component.getClientProperty(IViewerFactory.class);
- if (factory == null) {
- return true;
- }
- sizeChanged = true;
- final Dimension size;
- switch (cursorType) {
- case Cursor.SE_RESIZE_CURSOR:
- final Dimension minimumSize = new Dimension(10, 10);
- int x = e.getX() - 4 * BORDER_SIZE;
- int y = e.getY() - 4 * BORDER_SIZE;
- if (x <= 0 || y <= 0) {
- return true;
- }
- final double r = Math.sqrt(x * x + y * y);
- final Dimension preferredSize = factory.getOriginalSize(component);
- final int width = preferredSize.width;
- final int height = preferredSize.height;
- final double r0 = Math.sqrt(width * width + height * height);
- x = (int) (width * r / r0);
- y = (int) (height * r / r0);
- final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, component);
- if (x < mapView.getZoomed(minimumSize.width) || y < mapView.getZoomed(minimumSize.height)) {
- return true;
- }
- size = new Dimension(x, y);
- factory.setDraftViewerSize(component, size);
- component.revalidate();
- break;
- default:
- }
- return true;
- }
-
- public void mouseMoved(final MouseEvent e) {
- if (isActive) {
- return;
- }
- setCursor(e);
- }
- }
-
- static private ExternalImagePopupMenu imagePopupMenu;
- private static final int BORDER_SIZE = 1;
- private static final Color BORDER_COLOR = Color.BLACK;
- static final int VIEWER_POSITION = 5;
- private final MyMouseListener mouseListener = new MyMouseListener();
- final private Set<IViewerFactory> factories;
-
- public ViewerController() {
- super();
- factories = new HashSet<IViewerFactory>();
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addINodeViewLifeCycleListener(this);
- modeController.addExtension(this.getClass(), this);
- factories.add(new BitmapViewerFactory());
- }
-
- public void setZoom(final ModeController modeController, final MapModel map, final ExternalResource model,
- final float size) {
- final float oldSize = model.getZoom();
- if (size == oldSize) {
- return;
- }
- final IActor actor = new IActor() {
- public void act() {
- model.setZoom(size);
- modeController.getMapController().setSaved(map, false);
- }
-
- public String getDescription() {
- return "setModelSize";
- }
-
- public void undo() {
- model.setZoom(oldSize);
- modeController.getMapController().setSaved(map, false);
- }
- };
- modeController.execute(actor, map);
- }
-
- @Override
- protected void add(final NodeModel node, final IExtension extension) {
- final ExternalResource preview = (ExternalResource) extension;
- for (final INodeView iNodeView : node.getViewers()) {
- final NodeView view = (NodeView) iNodeView;
- createViewer(preview, view);
- }
- super.add(node, extension);
- }
-
- @Override
- protected IExtension createExtension(final NodeModel node) {
- final Controller controller = Controller.getCurrentController();
- final ViewController viewController = controller.getViewController();
- final MapModel map = node.getMap();
- final File file = map.getFile();
- final boolean useRelativeUri = ResourceController.getResourceController().getProperty("links").equals(
- "relative");
- if (file == null && useRelativeUri) {
- JOptionPane.showMessageDialog(viewController.getContentPane(), TextUtils
- .getText("not_saved_for_image_error"), "Freeplane", JOptionPane.WARNING_MESSAGE);
- return null;
- }
- final UrlManager urlManager = controller.getModeController().getExtension(UrlManager.class);
- final JFileChooser chooser = urlManager.getFileChooser(null, false);
- chooser.setAcceptAllFileFilterUsed(false);
- if (factories.size() > 1) {
- final FileFilter combiFileFilter = getCombiFileFilter();
- chooser.addChoosableFileFilter(combiFileFilter);
- for (final IViewerFactory factory : factories) {
- chooser.addChoosableFileFilter(new FactoryFileFilter(factory));
- }
- chooser.setFileFilter(combiFileFilter);
- }
- else {
- chooser.setFileFilter(new FactoryFileFilter(factories.iterator().next()));
- }
- chooser.setAccessory(new ImagePreview(chooser));
- final int returnVal = chooser.showOpenDialog(Controller.getCurrentController().getViewController()
- .getContentPane());
- if (returnVal != JFileChooser.APPROVE_OPTION) {
- return null;
- }
- final File input = chooser.getSelectedFile();
- if (input == null) {
- return null;
- }
- URI uri = uriOf(input);
- if (uri == null) {
- return null;
- }
- if (useRelativeUri && uri.getScheme().equals("file")) {
- uri = LinkController.toLinkTypeDependantURI(map.getFile(), input);
- }
- final ExternalResource preview = new ExternalResource(uri);
- ProgressIcons.updateExtendedProgressIcons(node, input.getName());
- return preview;
- }
-
- private URI uriOf(final File input) {
- String path = input.getPath();
- try {
- for (String protocol : new String[]{"http:" + File.separatorChar, "https:" + File.separatorChar}){
- int uriStart = path.indexOf(protocol);
- if(uriStart != -1)
- return new URI(protocol.substring(0, protocol.length() - 1) + "//" + path.substring(uriStart + protocol.length()).replace('\\', '/'));
- }
- }
- catch (URISyntaxException e) {
- LogUtils.warn(e);
- }
- return input.toURI();
- }
-
- private IViewerFactory getViewerFactory(final URI uri) {
- for (final IViewerFactory factory : factories) {
- if (factory.accept(uri)) {
- return factory;
- }
- }
- return null;
- }
-
- @Override
- protected IExtension createExtension(final NodeModel node, final XMLElement element) {
- try {
- final String attrUri = element.getAttribute("URI", null);
- if (attrUri != null) {
- final URI uri = new URI(attrUri);
- final ExternalResource previewUrl = new ExternalResource(uri);
- final String attrSize = element.getAttribute("SIZE", null);
- if (attrSize != null) {
- final float size = Float.parseFloat(attrSize);
- previewUrl.setZoom(size);
- }
- Controller.getCurrentModeController().getMapController().nodeChanged(node);
- return previewUrl;
- }
- }
- catch (final URISyntaxException e) {
- }
- return null;
- }
-
- void createViewer(final ExternalResource model, final NodeView view) {
- final JComponent viewer = createViewer(view.getMap().getModel(), model);
- if (imagePopupMenu == null) {
- imagePopupMenu = new ExternalImagePopupMenu();
- }
- viewer.setBorder(new MatteBorder(BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_SIZE, BORDER_COLOR));
- final Set<NodeView> viewers = model.getViewers();
- viewers.add(view);
- viewer.setBounds(viewer.getX() - 5, viewer.getY() - 5, viewer.getWidth() + 15, viewer.getHeight() + 15);
- view.addContent(viewer, VIEWER_POSITION);
- if(view.getMap().getModeController().canEdit()){
- final DropTarget dropTarget = new DropTarget(viewer, DTL);
- dropTarget.setActive(true);
- }
- if(view.isShortened())
- viewer.setVisible(false);
- else {
- viewer.revalidate();
- viewer.repaint();
- }
- }
-
- void deleteViewer(final ExternalResource model, final NodeView nodeView) {
- final Set<NodeView> viewers = model.getViewers();
- if (!viewers.contains(nodeView)) {
- return;
- }
- nodeView.removeContent(VIEWER_POSITION);
- viewers.remove(nodeView);
- }
-
- @Override
- protected Class<ExternalResource> getExtensionClass() {
- return ExternalResource.class;
- }
-
- public void onViewCreated(final Container container) {
- final NodeView nodeView = (NodeView) container;
- final ExternalResource previewUri = nodeView.getModel().getExtension(ExternalResource.class);
- if (previewUri == null) {
- return;
- }
- createViewer(previewUri, nodeView);
- }
-
- public void onViewRemoved(final Container container) {
- final NodeView nodeView = (NodeView) container;
- final ExternalResource previewUri = nodeView.getModel().getExtension(ExternalResource.class);
- if (previewUri == null) {
- return;
- }
- deleteViewer(previewUri, nodeView);
- }
-
- @Override
- protected void remove(final NodeModel node, final IExtension extension) {
- final ExternalResource latexExtension = (ExternalResource) extension;
- latexExtension.removeViewers();
- super.remove(node, extension);
- }
-
- @Override
- protected void saveExtension(final IExtension extension, final XMLElement element) {
- final ExternalResource previewUri = (ExternalResource) extension;
- final URI uri = previewUri.getUri();
- if (uri != null) {
- element.setAttribute("URI", uri.toString());
- }
- final float size = previewUri.getZoom();
- if (size != -1) {
- element.setAttribute("SIZE", Float.toString(size));
- }
- super.saveExtension(extension, element);
- }
-
- private JComponent createViewer(final MapModel map, final ExternalResource model) {
- final URI uri = model.getUri();
- if (uri == null) {
- return new JLabel("no file set");
- }
- final URI absoluteUri = model.getAbsoluteUri(map);
- if (absoluteUri == null) {
- return new JLabel(uri.toString());
- }
- final IViewerFactory factory = getViewerFactory(absoluteUri);
- if (factory == null) {
- return new JLabel(uri.toString());
- }
- JComponent viewer = null;
- try {
- final int maxWidth = ResourceController.getResourceController().getIntProperty("max_image_width");
- viewer = factory.createViewer(model, absoluteUri, maxWidth);
- }
- catch (final Exception e) {
- final String info = HtmlUtils.combineTextWithExceptionInfo(uri.toString(), e);
- return new JLabel(info);
- }
- if (viewer == null) {
- return new JLabel(uri.toString());
- }
- viewer.putClientProperty(IViewerFactory.class, factory);
- viewer.putClientProperty(ExternalResource.class, model);
- viewer.addMouseListener(mouseListener);
- viewer.addMouseMotionListener(mouseListener);
- return viewer;
- }
-
- private FileFilter getCombiFileFilter() {
- return new FactoryFileFilter(new CombiFactory());
- }
-
- public void addFactory(final IViewerFactory factory) {
- factories.add(factory);
- }
-
- public void removeFactory(final IViewerFactory factory) {
- factories.remove(factory);
- }
-
- /**
- * This method attaches an image to a node, that is referenced with an uri
- * @param uri : The image that is to be attached to a node
- * @param node : The node that is worked upon
- * @return : true if successful, false otherwise
- */
- public boolean paste(final URI uri, final NodeModel node) {
-
- if (uri == null || getViewerFactory(uri) == null) {
- return false;
- }
-
- final ExternalResource preview = new ExternalResource(uri);
- undoableDeactivateHook(node);
- undoableActivateHook(node, preview);
- ProgressIcons.updateExtendedProgressIcons(node, uri.getPath());
- return true;
- }
-
- public static enum PasteMode{
- AS_SIBLING, AS_CHILD, INSIDE;
- public static PasteMode valueOf(boolean asSibling){
- return asSibling ? AS_SIBLING : AS_CHILD;
- }
- }
-
- public boolean paste(URI uri, final NodeModel node, final boolean isLeft) {
- return pasteImage(uri, node, PasteMode.INSIDE, isLeft);
- }
-
- public boolean paste(final File file, final NodeModel targetNode, final PasteMode mode, final boolean isLeft) {
- URI uri = uriOf(file);
- return pasteImage(uri, targetNode, mode, isLeft);
- }
-
- public boolean pasteImage(URI uri, final NodeModel targetNode, final PasteMode mode, final boolean isLeft) {
- if (uri == null || getViewerFactory(uri) == null) {
- return false;
- }
- File file = new File(uri.getPath());
- boolean isFile = uri.getScheme().equals("file");
- if (isFile) {
- if (!file.exists()) {
- return false;
- }
- final File mapFile = targetNode.getMap().getFile();
- if (mapFile == null && LinkController.getLinkType() == LinkController.LINK_RELATIVE_TO_MINDMAP) {
- JOptionPane.showMessageDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(),
- TextUtils.getText("not_saved_for_image_error"), "Freeplane", JOptionPane.WARNING_MESSAGE);
- return false;
- }
- if (LinkController.getLinkType() != LinkController.LINK_ABSOLUTE) {
- uri = LinkController.toLinkTypeDependantURI(mapFile, file);
- }
- }
- final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
- final NodeModel node;
- if (mode.equals(PasteMode.INSIDE)) {
- node = targetNode;
- }
- else {
- node = mapController.newNode(file.getName(), targetNode.getMap());
- mapController.insertNode(node, targetNode, mode.equals(PasteMode.AS_SIBLING), isLeft, isLeft);
- }
- final ExternalResource preview = new ExternalResource(uri);
- undoableDeactivateHook(node);
- undoableActivateHook(node, preview);
- ProgressIcons.updateExtendedProgressIcons(node, file.getName());
- return true;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerLayoutManager.java b/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerLayoutManager.java
deleted file mode 100644
index ba90299..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/filepreview/ViewerLayoutManager.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.filepreview;
-
-/**
- * @author Dimitry Polivaev
- * 22.08.2009
- */
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.LayoutManager;
-
-import javax.swing.SwingUtilities;
-
-import org.freeplane.view.swing.map.MapView;
-
-public class ViewerLayoutManager implements LayoutManager {
- private float zoom;
-
- /**
- *
- */
- public ViewerLayoutManager(final float zoom) {
- super();
- this.zoom = zoom;
- }
-
- public void addLayoutComponent(final String name, final Component comp) {
- }
-
- public void layoutContainer(final Container parent) {
- if (!parent.isPreferredSizeSet()) {
- throw new IllegalStateException("preferred size not set for " + parent);
- }
- final Dimension preferredSize = parent.getPreferredSize();
- final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, parent);
- if (mapView == null) {
- return;
- }
- final float newZoom = mapView.getZoom();
- if (zoom != newZoom) {
- final float ratio = newZoom / zoom;
- preferredSize.width = (int) (Math.rint(preferredSize.width * ratio));
- preferredSize.height = (int) (Math.rint(preferredSize.height * ratio));
- parent.setPreferredSize(preferredSize);
- zoom = newZoom;
- }
- }
-
- public Dimension minimumLayoutSize(final Container parent) {
- return new Dimension(0, 0);
- }
-
- public Dimension preferredLayoutSize(final Container parent) {
- return parent.getPreferredSize();
- }
-
- public void removeLayoutComponent(final Component comp) {
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHolder.java b/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHolder.java
deleted file mode 100644
index 5ef1b49..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/nodehistory/NodeHolder.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.nodehistory;
-
-import java.lang.ref.WeakReference;
-
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.MapViewController;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- * @author Dimitry Polivaev
- * 13.12.2008
- */
-class NodeHolder {
- private final WeakReference<MapView> mMapView;
- private final String mNodeId;
- private boolean reachedByLink;
-
- public NodeHolder(final NodeView pNode) {
- mNodeId = pNode.getModel().createID();
- final MapView mapView = pNode.getMap();
- mMapView = new WeakReference<MapView>(mapView);
- reachedByLink = false;
- }
-
- @Override
- public boolean equals(final Object obj) {
- if (!(obj instanceof NodeHolder)) {
- return false;
- }
- final NodeHolder nodeHolder = (NodeHolder) obj;
- return nodeHolder.mMapView.get() == mMapView.get() && nodeHolder.mNodeId.equals(mNodeId);
- }
-
- public MapView getHoldMapView() {
- return mMapView.get();
- }
-
- MapView getMapView() {
- final MapView mapView = mMapView.get();
- final Controller controller = mapView.getModeController().getController();
- final MapViewController mapViewManager = (MapViewController) controller.getMapViewManager();
- for (final MapView m : mapViewManager.getMapViewVector()) {
- if (m == mapView) {
- return mapView;
- }
- }
- return null;
- }
-
- ModeController getModeController() {
- ModeController modeController = null;
- final MapView mapView = getMapView();
- if (mapView != null) {
- modeController = mapView.getModeController();
- }
- return modeController;
- }
-
- /** @return null, if node not found. */
- public NodeModel getNode() {
- final MapView modeController = mMapView.get();
- if (modeController != null) {
- return modeController.getModel().getNodeForID(mNodeId);
- }
- return null;
- }
-
- @Override
- public int hashCode() {
- final MapView mapView = mMapView.get();
- return mapView != null ? mapView.hashCode() * 37 : 0 + mNodeId.hashCode();
- }
-
- boolean isIdentical(final NodeView pNode) {
- final String id = pNode.getModel().createID();
- final MapView mapView = pNode.getMap();
- return mapView == mMapView.get() && id.equals(mNodeId);
- }
-
- protected boolean isReachedByLink() {
- return reachedByLink;
- }
-
- protected void setReachedByLink(final boolean reachedByLink) {
- this.reachedByLink = reachedByLink;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/PeriodPanel.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/PeriodPanel.java
deleted file mode 100644
index aa2c63b..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/PeriodPanel.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode;
-
-import java.util.Calendar;
-import java.util.Date;
-
-import javax.swing.JComboBox;
-import javax.swing.JPanel;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerNumberModel;
-import org.freeplane.core.resources.NamedObject;
-
-/**
- * @author Dimitry Polivaev
- * Jan 15, 2012
- */
- at SuppressWarnings("serial")
-class PeriodPanel extends JPanel {
- private JSpinner periodComponent;
- private JComboBox periodUnitBox;
- PeriodPanel(){
- SpinnerNumberModel periodModel = new SpinnerNumberModel(1, 1, Integer.MAX_VALUE, 1);
- periodComponent = new JSpinner(periodModel);
- periodUnitBox = new JComboBox(NamedObject.fromEnum(PeriodUnit.class));
- periodUnitBox.setEditable(false);
- periodUnitBox.setSelectedIndex(PeriodUnit.DAY.ordinal());
- add(periodComponent);
- add(periodUnitBox);
- }
-
- PeriodUnit getPeriodUnit(){
- final NamedObject selectedItem = (NamedObject)periodUnitBox.getSelectedItem();
- final PeriodUnit period = (PeriodUnit)selectedItem.getObject();
- return period;
- }
-
- void setPeriodUnit(PeriodUnit unit){
- periodUnitBox.setSelectedIndex(unit.ordinal());
- }
-
-
- int getPeriod(){
- return ((Number)periodComponent.getValue()).intValue();
- }
-
- void setPeriod(int period){
- periodComponent.setValue(period);
- }
-
- Date calculateNextTime(Date time) {
- final PeriodUnit periodUnit = getPeriodUnit();
- int period = getPeriod();
- final long timeInMillis = time.getTime();
- final Calendar calendar = Calendar.getInstance();
- calendar.setTimeInMillis(timeInMillis);
- if(periodUnit.equals(PeriodUnit.WEEK))
- period *= 7;
- calendar.add(periodUnit.calendarField, period);
- return calendar.getTime();
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/PeriodUnit.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/PeriodUnit.java
deleted file mode 100644
index 9d5dc22..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/PeriodUnit.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode;
-
-import java.util.Calendar;
-
-/**
- * @author Dimitry Polivaev
- * Jan 15, 2012
- */
-enum PeriodUnit{
- MINUTE(Calendar.MINUTE),
- HOUR(Calendar.HOUR),
- DAY(Calendar.DATE),
- WEEK(Calendar.DATE),
- MONTH(Calendar.MONTH),
- YEAR(Calendar.YEAR);
- final int calendarField;
- PeriodUnit(int calendarField){
- this.calendarField = calendarField;
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionController.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionController.java
deleted file mode 100644
index 560307d..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderConditionController.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode;
-
-import java.util.Date;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.features.format.FormattedDate;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.time.TimeComboBoxEditor;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-/**
- * @author Dimitry Polivaev
- * 21.12.2008
- */
-public class ReminderConditionController implements IElementaryConditionController {
- static final String FILTER_REMINDER = "filter_reminder";
- private final ComboBoxEditor editor = new TimeComboBoxEditor(true);
- private final ComboBoxModel values = new DefaultComboBoxModel();
-
- public ReminderConditionController() {
- super();
- }
-
- public boolean canEditValues(final Object property, final NamedObject simpleCond) {
- return true;
- }
-
- public boolean canHandle(final Object selectedItem) {
- if (!(selectedItem instanceof NamedObject)) {
- return false;
- }
- final NamedObject namedObject = (NamedObject) selectedItem;
- return namedObject.objectEquals(ReminderConditionController.FILTER_REMINDER);
- }
-
- public boolean canSelectValues(final Object property, final NamedObject simpleCond) {
- if(simpleCond.objectEquals(ReminderConditionLater.FILTER_REMINDER_LATER))
- return false;
- if(simpleCond.objectEquals(ReminderConditionExecuted.FILTER_REMINDER_EXECUTED))
- return false;
- return true;
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCond,
- final Object value, final boolean matchCase,
- final boolean matchApproximately) {
- return ReminderConditionController.create(simpleCond, (FormattedDate) value);
- }
-
- public ComboBoxModel getConditionsForProperty(final Object property) {
- return new DefaultComboBoxModel(getTimeConditionNames());
- }
-
- public ListModel getFilteredProperties() {
- final DefaultListModel list = new DefaultListModel();
- list.addElement(TextUtils.createTranslatedString(FILTER_REMINDER));
- return list;
- }
-
- public Object[] getTimeConditionNames() {
- return new NamedObject[] {
- TextUtils.createTranslatedString(ReminderConditionLater.FILTER_REMINDER_LATER),
- TextUtils.createTranslatedString(ReminderConditionExecuted.FILTER_REMINDER_EXECUTED),
- TextUtils.createTranslatedString(ReminderCondition.FILTER_REMINDER_AFTER),
- TextUtils.createTranslatedString(ReminderCondition.FILTER_REMINDER_BEFORE) };
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- return editor;
- }
-
- public ComboBoxModel getValuesForProperty(final Object selectedItem, NamedObject simpleCond) {
- values.setSelectedItem(FormattedDate.createDefaultFormattedDate(new Date().getTime(), IFormattedObject.TYPE_DATETIME));
- return values;
- }
-
- public boolean isCaseDependent(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean supportsApproximateMatching(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- try {
- if (element.getName().equalsIgnoreCase(ReminderConditionLater.NAME)) {
- return new ReminderConditionLater();
- }
- if (element.getName().equalsIgnoreCase(ReminderConditionExecuted.NAME)) {
- return new ReminderConditionExecuted();
- }
- if (element.getName().equalsIgnoreCase(ReminderConditionBefore.NAME)) {
- final String dateString = element.getAttribute(ReminderCondition.DATE, null);
- final FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
- return new ReminderConditionBefore(date);
- }
- if (element.getName().equalsIgnoreCase(ReminderConditionAfter.NAME)) {
- final String dateString = element.getAttribute(ReminderCondition.DATE, null);
- final FormattedDate date = FormattedDate.createDefaultFormattedDate(Long.parseLong(dateString), IFormattedObject.TYPE_DATETIME);
- return new ReminderConditionAfter(date);
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- return null;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- return null;
- }
-
- public static ASelectableCondition create(final NamedObject simpleCond, final FormattedDate date) {
- if (simpleCond.objectEquals(ReminderConditionLater.FILTER_REMINDER_LATER)) {
- return new ReminderConditionLater();
- }
- if (simpleCond.objectEquals(ReminderConditionExecuted.FILTER_REMINDER_EXECUTED)) {
- return new ReminderConditionExecuted();
- }
- if (simpleCond.objectEquals(ReminderCondition.FILTER_REMINDER_AFTER)) {
- return new ReminderConditionAfter(date);
- }
- if (simpleCond.objectEquals(ReminderCondition.FILTER_REMINDER_BEFORE)) {
- return new ReminderConditionBefore(date);
- }
- return null;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderExtension.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderExtension.java
deleted file mode 100644
index 3a2d002..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderExtension.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode;
-
-import java.util.Date;
-import java.util.Timer;
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.util.SysUtils;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author Dimitry Polivaev 30.11.2008
- */
-public class ReminderExtension implements IExtension, IMapChangeListener {
- static final int BLINKING_PERIOD = 1000;
- /**
- */
- public static ReminderExtension getExtension(final NodeModel node) {
- return (ReminderExtension) node.getExtension(ReminderExtension.class);
- }
-
- private final NodeModel node;
- private long remindUserAt = 0;
- private PeriodUnit periodUnit;
- private int period;
- private Timer timer;
- private String script;
- private TimerBlinkTask task;
-
- public ReminderExtension(final NodeModel node) {
- this.node = node;
- }
-
- public NodeModel getNode() {
- return node;
- }
-
- public long getRemindUserAt() {
- return remindUserAt;
- }
-
- public void setRemindUserAt(final long remindUserAt) {
- this.remindUserAt = remindUserAt;
- }
-
-
- public PeriodUnit getPeriodUnit() {
- return periodUnit;
- }
-
- public void setPeriodUnit(PeriodUnit periodUnit) {
- this.periodUnit = periodUnit;
- }
-
- public String getPeriodUnitAsString() {
- return periodUnit == null ? null : periodUnit.name();
- }
-
- public void setPeriodUnitAsString(String periodUnit) {
- this.periodUnit = PeriodUnit.valueOf(periodUnit);
- }
-
- public int getPeriod() {
- return period;
- }
-
- public void setPeriod(int period) {
- this.period = period;
- }
-
- public String getScript() {
- return script;
- }
-
- public void setScript(String script) {
- this.script = script;
- }
-
- public void scheduleTimer(final TimerBlinkTask task, final Date date) {
- if (timer == null) {
- timer = SysUtils.createTimer(getClass().getSimpleName());
- }
- timer.schedule(task, date, BLINKING_PERIOD);
- this.task = task;
- }
-
- public void deactivateTimer() {
- if (timer == null) {
- return;
- }
- timer.cancel();
- timer = null;
- task = null;
- }
-
- private void displayStateIcon(final NodeModel parent, final ClockState state) {
- if (task != null || ! task.alreadyExecuted() || !isAncestorNode(parent)) {
- return;
- }
- displayState(state, parent, true);
- }
-
- private boolean isAncestorNode(final NodeModel parent) {
- for (NodeModel n = node; n != null; n = n.getParentNode()) {
- if (n.equals(parent)) {
- return true;
- }
- }
- return false;
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
- displayStateIcon(parent, ClockState.CLOCK_VISIBLE);
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- displayStateIcon(newParent, ClockState.CLOCK_VISIBLE);
- }
-
- public void onPreNodeDelete(final NodeModel oldParent, final NodeModel selectedNode, final int index) {
- displayStateIcon(oldParent, null);
- }
-
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- displayStateIcon(oldParent, null);
- }
-
- public void mapChanged(final MapChangeEvent event) {
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- }
-
- public void displayState(final ClockState stateAdded, final NodeModel pNode,
- final boolean recurse) {
- if(stateAdded != null)
- pNode.putExtension(stateAdded);
- else
- pNode.removeExtension(ClockState.class);
- Controller.getCurrentModeController().getMapController().nodeRefresh(pNode);
- if (!recurse) {
- return;
- }
- final NodeModel parentNode = pNode.getParentNode();
- if (parentNode == null) {
- return;
- }
- displayState(stateAdded, parentNode, recurse);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderHook.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderHook.java
deleted file mode 100644
index d992227..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/ReminderHook.java
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.text.MessageFormat;
-import java.util.Date;
-
-import javax.swing.BorderFactory;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.icon.IStateIconProvider;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.IconStore;
-import org.freeplane.features.icon.UIIcon;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.ITooltipProvider;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.script.IScriptStarter;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.view.swing.features.time.mindmapmode.TimeManagement.JTimePanel;
-import org.freeplane.view.swing.features.time.mindmapmode.nodelist.AllMapsNodeListAction;
-import org.freeplane.view.swing.features.time.mindmapmode.nodelist.NodeList;
-import org.freeplane.view.swing.features.time.mindmapmode.nodelist.NodeListAction;
-import org.freeplane.view.swing.map.attribute.AttributePanelManager;
-
-/**
- * @author foltin
- */
- at NodeHookDescriptor(hookName = "plugins/TimeManagementReminder.xml", onceForMap = false)
-public class ReminderHook extends PersistentNodeHook implements IExtension {
-
- //******************************************
- @EnabledAction(checkOnNodeChange = true)
- private class ReminderHookAction extends HookAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- *
- */
- public ReminderHookAction() {
- super("ReminderHookAction");
- }
-
- @Override
- public void setEnabled() {
- setEnabled(isActiveForSelection());
- }
- }
-
- static private class TimeListAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- /**
- *
- */
- private final NodeList timeList;
-
- public TimeListAction() {
- super("TimeListAction");
- timeList = new NodeList(false, false);
- }
-
- public void actionPerformed(final ActionEvent e) {
- timeList.startup();
- }
- }
-
- static private class TimeManagementAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- /**
- *
- */
- private final TimeManagement timeManagement;
-
- public TimeManagementAction( final ReminderHook reminderHook) {
- super("TimeManagementAction");
- timeManagement = new TimeManagement(reminderHook);
- }
-
- public void actionPerformed(final ActionEvent e) {
- timeManagement.showDialog();
- }
- }
-
- //******************************************
- static final String PLUGIN_LABEL = "plugins/TimeManagementReminder.xml";
- static final String REMINDUSERAT = "REMINDUSERAT";
- static final String PERIOD = "PERIOD";
- static final String UNIT = "UNIT";
- static final String SCRIPT = "SCRIPT";
- private static final Integer REMINDER_TOOLTIP = 12;
- private ModeController modeController;
-
- /**
- *
- */
- public ReminderHook(ModeController modeController){
- super();
- this.modeController = modeController;
- modeController.addMenuContributor(new IMenuContributor() {
- public void updateMenus(ModeController modeController, MenuBuilder builder) {
- createTimePanel();
- }
- });
- registerAction(new TimeManagementAction(this));
- registerAction(new TimeListAction());
- registerAction(new NodeListAction());
- registerAction(new AllMapsNodeListAction());
- registerTooltipProvider();
- registerStateIconProvider();
-
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(9,
- new ReminderConditionController());
- }
- private static final IconStore STORE = IconStoreFactory.create();
- private static UIIcon bellIcon;
- private static UIIcon clockIcon;
- private static UIIcon flagIcon;
- void registerStateIconProvider(){
- IconController.getController(modeController).addStateIconProvider(new IStateIconProvider() {
- public UIIcon getStateIcon(NodeModel node) {
- UIIcon icon = null;
- ClockState stateAdded = node.getExtension(ClockState.class);
- ReminderExtension reminder = node.getExtension(ReminderExtension.class);
- if (stateAdded == ClockState.CLOCK_VISIBLE) {
- icon = getClockIcon();
- }
- else if (stateAdded == ClockState.CLOCK_INVISIBLE) {
- if (reminder != null && node == reminder.getNode()) {
- icon = getBellIcon();
- }
- else {
- icon = getFlagIcon();
- }
- }
- if (stateAdded != null || reminder != null && node == reminder.getNode()
- || ReminderExtension.getExtension(node) == null) {
- return icon;
- }
- return null;
- }
- });
- }
- private UIIcon getBellIcon() {
- if (bellIcon == null) {
- bellIcon = STORE.getUIIcon("bell.png");
- }
- return bellIcon;
- }
-
- private UIIcon getClockIcon() {
- if (clockIcon == null) {
- clockIcon = STORE.getUIIcon("clock.png");
- }
- return clockIcon;
- }
-
- private UIIcon getFlagIcon() {
- if (flagIcon == null) {
- flagIcon = STORE.getUIIcon("flag.png");
- }
- return flagIcon;
- }
- private void registerTooltipProvider() {
- modeController.addToolTipProvider(REMINDER_TOOLTIP, new ITooltipProvider() {
- public String getTooltip(ModeController modeController, NodeModel node, Component view) {
- final ReminderExtension model = ReminderExtension.getExtension(node);
- if(model == null)
- return null;
- final Date date = new Date(model.getRemindUserAt());
- final Object[] messageArguments = { date };
- final MessageFormat formatter = new MessageFormat(TextUtils
- .getText("plugins/TimeManagement.xml_reminderNode_tooltip"));
- final String message = formatter.format(messageArguments);
- return message;
- }
- });
-
- }
-
- private void createTimePanel() {
- final TimeManagement timeManagement = new TimeManagement(this);
- final int axis = BoxLayout.Y_AXIS;
- final JTimePanel timePanel = timeManagement.createTimePanel(null, false, 1);
- modeController.getMapController().addNodeSelectionListener(new INodeSelectionListener() {
- public void onSelect(NodeModel node) {
- timePanel.update(node);
- }
-
- public void onDeselect(NodeModel node) {
- }
- });
- modeController.getMapController().addNodeChangeListener(new INodeChangeListener() {
- public void nodeChanged(NodeChangeEvent event) {
- final NodeModel node = event.getNode();
- if(event.getProperty().equals(getExtensionClass()) && node.equals(modeController.getMapController().getSelectedNode()))
- timePanel.update(node);
- }
- });
- timePanel.setBorder(BorderFactory.createTitledBorder(TextUtils.getText("calendar_panel")));
- final JPanel tablePanel = new AttributePanelManager(modeController).getTablePanel();
- tablePanel.setBorder(BorderFactory.createTitledBorder(TextUtils.getText("attributes_attribute")));
- final Box panel = new Box(axis);
- panel.add(timePanel);
- panel.add(tablePanel);
- final JTabbedPane tabs = (JTabbedPane) modeController.getUserInputListenerFactory().getToolBar("/format").getComponent(1);
- final JScrollPane timeScrollPane = new JScrollPane(panel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
- UITools.setScrollbarIncrement(timeScrollPane);
- tabs.add(TextUtils.getText("calendar_attributes_panel"), timeScrollPane);
- }
-
- @Override
- public void add(final NodeModel node, final IExtension extension) {
- final ReminderExtension reminderExtension = (ReminderExtension) extension;
- scheduleTimer(reminderExtension);
- modeController.getMapController().addMapChangeListener(reminderExtension);
- super.add(node, extension);
- }
-
- void blink(final ReminderExtension model, final boolean stateAdded) {
- if (model.getNode().getMap() != Controller.getCurrentController().getMap()) {
- return;
- }
- model.displayState((stateAdded) ? ClockState.CLOCK_VISIBLE : ClockState.CLOCK_INVISIBLE, model.getNode(), true);
- }
-
- @Override
- protected IExtension createExtension(final NodeModel node, final XMLElement element) {
- final ReminderExtension reminderExtension = new ReminderExtension(node);
- final XMLElement parameters = element.getFirstChildNamed("Parameters");
- final String time = parameters.getAttribute(REMINDUSERAT, "0");
- final String unit = parameters.getAttribute(UNIT, "DAY");
- final String period = parameters.getAttribute(PERIOD, "1");
- reminderExtension.setRemindUserAt(Long.parseLong(time));
- reminderExtension.setPeriodUnit(PeriodUnit.valueOf(unit));
- reminderExtension.setPeriod(Integer.parseInt(period));
- final String script = parameters.getAttribute(SCRIPT, null);
- reminderExtension.setScript(script);
- return reminderExtension;
- }
-
- @Override
- protected HookAction createHookAction() {
- return new ReminderHookAction();
- }
-
- @Override
- protected Class<? extends IExtension> getExtensionClass() {
- return ReminderExtension.class;
- }
-
- @Override
- public void remove(final NodeModel node, final IExtension extension) {
- final ReminderExtension reminderExtension = (ReminderExtension) extension;
- reminderExtension.deactivateTimer();
- reminderExtension.displayState(null, reminderExtension.getNode(), true);
- modeController.getMapController().removeMapChangeListener(reminderExtension);
- super.remove(node, extension);
- }
-
- @Override
- protected void saveExtension(final IExtension extension, final XMLElement element) {
- super.saveExtension(extension, element);
- final ReminderExtension reminderExtension = (ReminderExtension) extension;
- final XMLElement parameters = element.createElement("Parameters");
- parameters.setAttribute(REMINDUSERAT, Long.toString(reminderExtension.getRemindUserAt()));
- parameters.setAttribute(PERIOD, Integer.toString(reminderExtension.getPeriod()));
- parameters.setAttribute(UNIT, reminderExtension.getPeriodUnit().toString());
- final String script = reminderExtension.getScript();
- if(script != null){
- parameters.setAttribute(SCRIPT, script);
- }
-
- element.addChild(parameters);
- }
-
- private void scheduleTimer(final ReminderExtension model) {
- final Date date = new Date(model.getRemindUserAt());
- scheduleTimer(model, new TimerBlinkTask(this, model, false, System.currentTimeMillis() < date.getTime() + ReminderExtension.BLINKING_PERIOD));
- model.displayState(ClockState.CLOCK_VISIBLE, model.getNode(), false);
- }
-
- private void scheduleTimer(final ReminderExtension model, final TimerBlinkTask task) {
- final Date date = new Date(model.getRemindUserAt());
- model.scheduleTimer(task, date);
- }
-
- ModeController getModeController() {
- return modeController;
- }
- public void runScript(ReminderExtension reminderExtension) {
- final String script = reminderExtension.getScript();
- if(script == null || script.equals(""))
- return;
- final IScriptStarter starter = (IScriptStarter) modeController.getExtension(IScriptStarter.class);
- if(starter == null)
- return;
- final NodeModel node = reminderExtension.getNode();
- final MapModel map = node.getMap();
- final Controller controller = modeController.getController();
- if(! controller.getMapViewManager().getMaps(modeController.getModeName()).containsValue(map))
- return;
- starter.executeScript(node, script);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimeManagement.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimeManagement.java
deleted file mode 100644
index 810c2c3..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimeManagement.java
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode;
-
-import java.awt.Component;
-import java.awt.Dialog;
-import java.awt.Dimension;
-import java.awt.KeyboardFocusManager;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.text.MessageFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.ComboBoxEditor;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JTable;
-import javax.swing.SwingUtilities;
-import javax.swing.WindowConstants;
-import javax.swing.text.JTextComponent;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.ui.components.calendar.JCalendar;
-import org.freeplane.core.ui.components.calendar.JDayChooser;
-import org.freeplane.core.ui.components.calendar.JTripleCalendar;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.FormattedDate;
-import org.freeplane.features.format.PatternFormat;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.script.IScriptEditorStarter;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-import com.jgoodies.forms.factories.FormFactory;
-import com.jgoodies.forms.layout.FormLayout;
-
-/**
- * @author foltin
- */
-class TimeManagement implements PropertyChangeListener, IMapSelectionListener {
-
- class JTimePanel extends JPanel
- {
- private static final long serialVersionUID = 1L;
- private JButton setReminderButton;
- private JButton removeReminderButton;
- private JButton remindLaterButton;
- private PeriodPanel periodPanel;
- private ComboBoxEditor scriptEditor;
- private JCalendar calendarComponent;
- private JComboBox dateFormatChooser;
-
- public JTimePanel(boolean useTriple, int colCount) {
- super();
- init(useTriple, colCount);
- final NodeModel selected = reminderHook.getModeController().getMapController().getSelectedNode();
- update(selected);
- }
-
- public void update(NodeModel node){
- if(node == null)
- return;
- final ReminderExtension reminder = ReminderExtension.getExtension(node);
- final boolean reminderIsSet = reminder != null;
- removeReminderButton.setEnabled(reminderIsSet);
- if(reminderIsSet){
- final long reminderTime = reminder.getRemindUserAt();
- updateCalendar(reminderTime);
- periodPanel.setPeriod(reminder.getPeriod());
- periodPanel.setPeriodUnit(reminder.getPeriodUnit());
- if(scriptEditor != null)
- scriptEditor.setItem(reminder.getScript());
- }
- else{
- if(scriptEditor != null)
- scriptEditor.setItem(null);
- }
- }
-
- private void updateCalendar(final long reminderTime) {
- TimeManagement.this.calendar.setTimeInMillis(reminderTime);
- calendarComponent.setCalendar(TimeManagement.this.calendar);
- dateFormatChooser.repaint();
- }
-
- private void init(boolean useTriple, int colCount) {
- final JComponent calendarContainer;
- if (useTriple) {
- final JTripleCalendar trippleCalendar = new JTripleCalendar();
- calendarComponent = trippleCalendar.getCalendar();
- calendarContainer = trippleCalendar;
- }
- else {
- calendarComponent = new JCalendar();
- calendarContainer = calendarComponent;
- }
- calendarComponent.setCalendar(TimeManagement.this.calendar);
- if (dialog != null) {
- dialog.addWindowFocusListener(new WindowAdapter() {
- @Override
- public void windowGainedFocus(WindowEvent e) {
- calendarComponent.getDayChooser().setFocus();
- }
- });
- }
- calendarComponent.setMaximumSize(calendarComponent.getPreferredSize());
- setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
- add(Box.createHorizontalGlue());
- calendarComponent.getDayChooser().addPropertyChangeListener(TimeManagement.this);
- calendarContainer.setAlignmentX(0.5f);
- add(calendarContainer);
-
- DefaultFormBuilder btnBuilder = new DefaultFormBuilder(new FormLayout(FormFactory.GROWING_BUTTON_COLSPEC.toString(), ""));
- btnBuilder.getLayout().addGroupedColumn(btnBuilder.getColumnCount());
- for(int i = 1; i< colCount; i++){
- btnBuilder.appendRelatedComponentsGapColumn();
- btnBuilder.appendColumn(FormFactory.GROWING_BUTTON_COLSPEC);
- btnBuilder.getLayout().addGroupedColumn(btnBuilder.getColumnCount());
- }
-
- {
- final JButton todayButton = new JButton(getResourceString("plugins/TimeManagement.xml_todayButton"));
- todayButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent arg0) {
- final Calendar currentTime = Calendar.getInstance();
- currentTime.set(Calendar.SECOND, 0);
- TimeManagement.this.calendar.setTimeInMillis(currentTime.getTimeInMillis());
- calendarComponent.setCalendar(TimeManagement.this.calendar);
- }
- });
- btnBuilder.append(todayButton);
- }
- {
- dateFormatChooser = createDateFormatChooser();
- btnBuilder.append(dateFormatChooser);
- }
- {
- final JButton appendButton = new JButton(getResourceString("plugins/TimeManagement.xml_appendButton"));
- if (dialog == null) {
- appendButton.setFocusable(false);
- }
- appendButton.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- insertTime(dialog, appendButton);
- }
- });
- btnBuilder.append(appendButton);
- }
- {
- scriptEditor = null;
- IScriptEditorStarter editor = (IScriptEditorStarter) reminderHook.getModeController().getExtension(IScriptEditorStarter.class);
- if(editor != null){
- scriptEditor = editor.createComboBoxEditor(new Dimension(600, 400));
- Component scriptButton = scriptEditor.getEditorComponent();
- btnBuilder.append(scriptButton);
- }
- }
- {
- setReminderButton = new JButton(getResourceString("plugins/TimeManagement.xml_reminderButton"));
- setReminderButton.setToolTipText(getResourceString("plugins/TimeManagement.xml_reminderButton_tooltip"));
- setReminderButton.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- addReminder();
- }
- });
- btnBuilder.append(setReminderButton);
- }
- {
- remindLaterButton = new JButton(
- getResourceString("plugins/TimeManagement.xml_remindLaterButton"));
- remindLaterButton.setToolTipText(getResourceString("plugins/TimeManagement.xml_remindLaterButton_tooltip"));
- remindLaterButton.addMouseListener(new MouseAdapter() {
-
- @Override
- public void mouseClicked(MouseEvent e) {
- remindLaterReminder();
- }
-
- });
- btnBuilder.append(remindLaterButton);
- }
- {
- periodPanel = new PeriodPanel();
- btnBuilder.append(periodPanel);
- }
- {
- removeReminderButton = new JButton(
- getResourceString("plugins/TimeManagement.xml_removeReminderButton"));
- removeReminderButton.setToolTipText(getResourceString("plugins/TimeManagement.xml_removeReminderButton_tooltip"));
- removeReminderButton.addMouseListener(new MouseAdapter() {
-
- @Override
- public void mouseClicked(MouseEvent e) {
- removeReminder();
- }
-
- });
- btnBuilder.append(removeReminderButton);
- }
- if (dialog != null) {
- final JButton cancelButton = new JButton(getResourceString("plugins/TimeManagement.xml_closeButton"));
- cancelButton.addMouseListener(new MouseAdapter() {
-
- @Override
- public void mouseClicked(MouseEvent e) {
- disposeDialog();
- }
- });
- btnBuilder.append(cancelButton);
- }
- final JPanel btnPanel = btnBuilder.getPanel();
- btnPanel.setAlignmentX(CENTER_ALIGNMENT);
- add(btnPanel);
- }
-
- private void addReminder() {
- final Date date = getCalendarDate();
- String script = null;
- if(scriptEditor != null){
- script = (String) scriptEditor.getItem();
- if(script != null && "".equals(script.trim()))
- script = null;
- }
- Controller controller = Controller.getCurrentController();
- for (final NodeModel node : controller.getModeController().getMapController().getSelectedNodes()) {
- final ReminderExtension alreadyPresentHook = ReminderExtension.getExtension(node);
- if (alreadyPresentHook != null) {
- final long oldReminderTime = alreadyPresentHook.getRemindUserAt();
- if(oldReminderTime > System.currentTimeMillis()){
- final Object[] messageArguments = { new Date(oldReminderTime), date };
- final MessageFormat formatter = new MessageFormat(
- getResourceString("plugins/TimeManagement.xml_reminderNode_onlyOneDate"));
- final String message = formatter.format(messageArguments);
- final int result = JOptionPane.showConfirmDialog(controller.getViewController().getFrame(), message,
- "Freeplane", JOptionPane.YES_NO_OPTION);
- if (result == JOptionPane.NO_OPTION) {
- return;
- }
- }
- reminderHook.undoableToggleHook(node);
- }
- final ReminderExtension reminderExtension = new ReminderExtension(node);
- reminderExtension.setRemindUserAt(date.getTime());
- reminderExtension.setPeriodUnit(periodPanel.getPeriodUnit());
- reminderExtension.setPeriod(periodPanel.getPeriod());
- reminderExtension.setScript(script);
- reminderHook.undoableActivateHook(node, reminderExtension);
- }
- }
-
- private void removeReminder() {
- for (final NodeModel node : getMindMapController().getMapController().getSelectedNodes()) {
- final ReminderExtension alreadyPresentHook = ReminderExtension.getExtension(node);
- if (alreadyPresentHook != null) {
- reminderHook.undoableToggleHook(node);
- }
- }
- }
- private void remindLaterReminder(){
- Date nextTime = periodPanel.calculateNextTime(calendar.getTime());
- updateCalendar(nextTime.getTime());
- addReminder();
- }
- }
- private Calendar calendar;
- public final static String REMINDER_HOOK_NAME = "plugins/TimeManagementReminder.xml";
- private static TimeManagement sCurrentlyOpenTimeManagement = null;
- private JDialog dialog;
- private final ReminderHook reminderHook;
- private PatternFormat dateFormat;
- private INodeChangeListener nodeChangeListener;
- private INodeSelectionListener nodeSelectionListener;
-
- public TimeManagement( final ReminderHook reminderHook) {
- this.reminderHook = reminderHook;
- Controller.getCurrentController().getMapViewManager().addMapSelectionListener(this);
- }
-
-
- public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
- }
-
- public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
- disposeDialog();
- }
-
- /**
- *
- */
- private void disposeDialog() {
- if (dialog == null) {
- return;
- }
- getMindMapController().getMapController().removeNodeSelectionListener(nodeSelectionListener);
- nodeSelectionListener = null;
- getMindMapController().getMapController().removeNodeChangeListener(nodeChangeListener);
- nodeChangeListener = null;
- dialog.setVisible(false);
- dialog.dispose();
- dialog = null;
- TimeManagement.sCurrentlyOpenTimeManagement = null;
- }
-
- private FormattedDate getCalendarDate() {
- return new FormattedDate(calendar.getTime(), dateFormat.getPattern());
- }
-
- private ModeController getMindMapController() {
- return Controller.getCurrentModeController();
- }
-
- private String getResourceString(final String string) {
- return TextUtils.getText(string);
- }
-
-
- public void propertyChange(final PropertyChangeEvent event) {
- if (event.getPropertyName().equals(JDayChooser.DAY_PROPERTY)) {
- }
- }
-
- void showDialog() {
- if (TimeManagement.sCurrentlyOpenTimeManagement != null) {
- TimeManagement.sCurrentlyOpenTimeManagement.dialog.getContentPane().setVisible(true);
- return;
- }
- TimeManagement.sCurrentlyOpenTimeManagement = this;
- dialog = new JDialog(Controller.getCurrentController().getViewController().getFrame(), false /*not modal*/);
- final JTimePanel timePanel =createTimePanel(dialog, true, 4);
- nodeSelectionListener = new INodeSelectionListener() {
- public void onSelect(NodeModel node) {
- timePanel.update(node);
- }
-
- public void onDeselect(NodeModel node) {
- }
- };
- getMindMapController().getMapController().addNodeSelectionListener(nodeSelectionListener);
- nodeChangeListener = new INodeChangeListener() {
- public void nodeChanged(NodeChangeEvent event) {
- final NodeModel node = event.getNode();
- if(event.getProperty().equals(ReminderExtension.class) && node.equals(getMindMapController().getMapController().getSelectedNode()))
- timePanel.update(node);
- }
- };
- getMindMapController().getMapController().addNodeChangeListener(nodeChangeListener);
-
- dialog.setTitle(getResourceString("plugins/TimeManagement.xml_WindowTitle"));
- dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- dialog.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(final WindowEvent event) {
- disposeDialog();
- }
- });
- final Action action = new AbstractAction() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent arg0) {
- disposeDialog();
- }
- };
- UITools.addEscapeActionToDialog(dialog, action);
- dialog.setContentPane(timePanel);
- dialog.pack();
- UITools.setBounds(dialog, -1, -1, dialog.getWidth(), dialog.getHeight());
- dialog.setVisible(true);
- }
-
- public JTimePanel createTimePanel(final Dialog dialog, boolean useTriple, int colCount) {
- if (this.calendar == null) {
- this.calendar = Calendar.getInstance();
- this.calendar.set(Calendar.SECOND, 0);
- this.calendar.set(Calendar.MILLISECOND, 0);
- }
- JTimePanel contentPane = new JTimePanel(useTriple, colCount);
- return contentPane;
- }
-
- private JComboBox createDateFormatChooser() {
- class DateFormatComboBoxElement {
- private final PatternFormat dateFormat;
-
- DateFormatComboBoxElement(PatternFormat dateFormat) {
- this.dateFormat = dateFormat;
- }
-
- PatternFormat getDateFormat() {
- return dateFormat;
- }
-
- public String toString() {
- return dateFormat.formatObject(getCalendarDate()).toString();
- }
- }
- final String dateFormatPattern = ResourceController.getResourceController().getProperty(
- "date_format");
- final Vector<DateFormatComboBoxElement> values = new Vector<DateFormatComboBoxElement>();
- final List<PatternFormat> datePatterns = FormatController.getController().getDateFormats();
- int selectedIndex = 0;
- for (int i = 0; i < datePatterns.size(); ++i) {
- final PatternFormat patternFormat = datePatterns.get(i);
- values.add(new DateFormatComboBoxElement(patternFormat));
- if (patternFormat.getPattern().equals(dateFormatPattern)) {
- dateFormat = patternFormat;
- selectedIndex = i;
- }
- }
- final JComboBox dateFormatChooser = new JComboBox(values);
- dateFormatChooser.setFocusable(false);
- if (!datePatterns.isEmpty()){
- dateFormatChooser.setSelectedIndex(selectedIndex);
- dateFormat = ((DateFormatComboBoxElement) (dateFormatChooser.getSelectedItem())).getDateFormat();
- }
- dateFormatChooser.addItemListener(new ItemListener() {
- public void itemStateChanged(final ItemEvent e) {
- dateFormat = ((DateFormatComboBoxElement) e.getItem()).getDateFormat();
- final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
- if(focusOwner instanceof JTable){
- JTable table = (JTable) focusOwner;
- final int[] selectedRows = table.getSelectedRows();
- final int[] selectedColumns = table.getSelectedColumns();
- for(int r : selectedRows)
- for(int c : selectedColumns){
- Object date = table.getValueAt(r, c);
- if(date instanceof FormattedDate){
- final FormattedDate fd = (FormattedDate) date;
- if(! fd.getDateFormat().equals(dateFormat)){
- table.setValueAt(new FormattedDate(fd, dateFormat.getPattern()), r, c);
- }
- }
- }
- }
- else{
- ModeController mController = Controller.getCurrentModeController();
- for (final NodeModel node : mController.getMapController().getSelectedNodes()) {
- final MTextController textController = (MTextController) TextController.getController();
- Object date = node.getUserObject();
- if(date instanceof FormattedDate){
- final FormattedDate fd = (FormattedDate) date;
- if(! fd.getDateFormat().equals(dateFormat)){
- textController.setNodeObject(node, new FormattedDate(fd, dateFormat.getPattern()));
- }
- }
- }
- }
-
- }
- });
- dateFormatChooser.setAlignmentX(Component.LEFT_ALIGNMENT);
- return dateFormatChooser;
- }
-
- void insertTime(final Dialog dialog, final JButton appendButton) {
- FormattedDate date = getCalendarDate();
- final String dateAsString = dateFormat.formatObject(date).toString();
- final Window parentWindow;
- if (dialog != null) {
- parentWindow = (Window) dialog.getParent();
- }
- else {
- parentWindow = SwingUtilities.getWindowAncestor(appendButton);
- }
- final Component mostRecentFocusOwner = parentWindow.getMostRecentFocusOwner();
- if (mostRecentFocusOwner instanceof JTextComponent
- && !(mostRecentFocusOwner.getClass().getName().contains("JSpinField"))) {
- final JTextComponent textComponent = (JTextComponent) mostRecentFocusOwner;
- textComponent.replaceSelection(dateAsString);
- return;
- }
- if(mostRecentFocusOwner instanceof JTable){
- JTable table = (JTable) mostRecentFocusOwner;
- final int[] selectedRows = table.getSelectedRows();
- final int[] selectedColumns = table.getSelectedColumns();
- for(int r : selectedRows)
- for(int c : selectedColumns)
- table.setValueAt(date, r, c);
- }
- else{
- ModeController mController = Controller.getCurrentModeController();
- for (final NodeModel node : mController.getMapController().getSelectedNodes()) {
- final MTextController textController = (MTextController) TextController.getController();
- textController.setNodeObject(node, date);
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimerBlinkTask.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimerBlinkTask.java
deleted file mode 100644
index 1ee2f71..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/TimerBlinkTask.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode;
-
-import java.util.TimerTask;
-
-import javax.swing.SwingUtilities;
-
-
-/**
- * @author Dimitry Polivaev
- * Feb 20, 2009
- */
-class TimerBlinkTask extends TimerTask {
- private final ReminderHook reminderController;
- /**
- *
- */
- private final ReminderExtension reminderExtension;
- private boolean stateAdded = false;
- private boolean runScript;
- private boolean alreadyExecuted;
-
- /**
- * @param b
- */
- public TimerBlinkTask(final ReminderHook reminderController, final ReminderExtension reminderExtension,
- final boolean stateAdded, boolean runScript) {
- super();
- this.reminderController = reminderController;
- this.reminderExtension = reminderExtension;
- this.stateAdded = stateAdded;
- this.runScript = runScript;
- alreadyExecuted = false;
- }
-
- @Override
- public void run() {
- SwingUtilities.invokeLater(new Runnable() {
-
- public void run() {
- if(runScript){
- runScript = false;
- reminderController.runScript(reminderExtension);
- }
- alreadyExecuted = true;
- stateAdded = !stateAdded;
- reminderController.blink(reminderExtension, stateAdded);
- }
- });
- }
-
- public boolean alreadyExecuted(){
- return alreadyExecuted;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/AllMapsNodeListAction.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/AllMapsNodeListAction.java
deleted file mode 100644
index a883417..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/AllMapsNodeListAction.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-
-/**
- * @author Dimitry Polivaev
- * 01.09.2009
- */
-public class AllMapsNodeListAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private final NodeList nodeList;
-
- public AllMapsNodeListAction() {
- super("AllMapsNodeListAction");
- nodeList = new NodeList(true, true);
- }
-
- public void actionPerformed(final ActionEvent e) {
- nodeList.startup();
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/CoreTextAccessor.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/CoreTextAccessor.java
deleted file mode 100644
index 7866492..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/CoreTextAccessor.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-
-/**
- * @author Dimitry Polivaev 03.10.2013
- */
-class CoreTextAccessor implements TextAccessor {
- final private NodeModel node;
-
- public CoreTextAccessor(NodeModel node) {
- this.node = node;
- }
-
- public String getText() {
- return node.getText();
- }
-
- public void setText(String newText) {
- ((MTextController) TextController.getController()).setNodeText(node, newText);
- }
-
- public NodeModel getNode() {
- return node;
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DateRenderer.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DateRenderer.java
deleted file mode 100644
index 738409f..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DateRenderer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import java.text.DateFormat;
-
-import javax.swing.table.DefaultTableCellRenderer;
-
-/**
- * @author Dimitry Polivaev
- * 03.10.2013
- */
-class DateRenderer extends DefaultTableCellRenderer {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- DateFormat formatter;
-
- public DateRenderer() {
- super();
- }
-
- @Override
- public void setValue(final Object value) {
- if (formatter == null) {
- formatter = DateFormat.getDateTimeInstance();
- }
- setText((value == null) ? "" : formatter.format(value));
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DetailTextAccessor.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DetailTextAccessor.java
deleted file mode 100644
index d1a4adf..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/DetailTextAccessor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.text.DetailTextModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-
-/**
- * @author Dimitry Polivaev 03.10.2013
- */
-class DetailTextAccessor implements TextAccessor {
- final private NodeModel node;
-
- public DetailTextAccessor(NodeModel node) {
- this.node = node;
- }
-
- public String getText() {
- String details = DetailTextModel.getDetailTextText(node);
- return details != null ? details : "";
- }
-
- public void setText(String newText) {
- ((MTextController) TextController.getController()).setDetails(node, newText);
- }
-
- public NodeModel getNode() {
- return node;
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsHolder.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsHolder.java
deleted file mode 100644
index 14e1b5c..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsHolder.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.map.NodeModel;
-/**
- * @author Dimitry Polivaev
- * 03.10.2013
- */
-class IconsHolder implements Comparable<IconsHolder> {
- final private String iconNames;
- List<MindIcon> icons = new ArrayList<MindIcon>();
-
- public IconsHolder(final NodeModel node) {
- icons.addAll(IconController.getController().getIcons(node));
- if (icons.size() > 0) {
- final List<MindIcon> toSort = new ArrayList<MindIcon>(icons);
- Collections.sort(toSort);
- final StringBuilder builder = new StringBuilder();
- for (final MindIcon icon : toSort) {
- builder.append(icon.getName()).append(" ");
- }
- iconNames = builder.toString();
- }
- else {
- iconNames = "";
- }
- }
-
- public int compareTo(final IconsHolder compareToObject) {
- return toString().compareTo(compareToObject.toString());
- }
-
- public List<MindIcon> getIcons() {
- return icons;
- }
-
- /** Returns a sorted list of icon names. */
- @Override
- public String toString() {
- return iconNames;
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsRenderer.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsRenderer.java
deleted file mode 100644
index c7aa5b1..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/IconsRenderer.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import javax.swing.table.DefaultTableCellRenderer;
-
-import org.freeplane.core.ui.components.MultipleImage;
-import org.freeplane.features.icon.MindIcon;
-
-/**
- * @author Dimitry Polivaev
- * 03.10.2013
- */
-class IconsRenderer extends DefaultTableCellRenderer {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public IconsRenderer() {
- super();
- }
-
- @Override
- public void setValue(final Object value) {
- if (value instanceof IconsHolder) {
- final IconsHolder iconsHolder = (IconsHolder) value;
- final MultipleImage iconImages = new MultipleImage();
- for (final MindIcon icon : iconsHolder.getIcons()) {
- iconImages.addImage(icon.getIcon());
- }
- if (iconImages.getImageCount() > 0) {
- setIcon(iconImages);
- }
- else {
- setIcon(null);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeList.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeList.java
deleted file mode 100644
index e56e6d9..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeList.java
+++ /dev/null
@@ -1,858 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import java.awt.Container;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Point;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.EventListener;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
-import javax.swing.AbstractAction;
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JDialog;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-import javax.swing.Timer;
-import javax.swing.WindowConstants;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.table.DefaultTableModel;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.text.JTextComponent;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.WindowConfigurationStorage;
-import org.freeplane.core.ui.UIBuilder;
-import org.freeplane.core.ui.components.BlindIcon;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-import org.freeplane.view.swing.features.time.mindmapmode.ReminderExtension;
-
-/**
- * @author foltin
- */
-public class NodeList {
- private final class MapChangeListener implements IMapChangeListener, INodeChangeListener, IMapSelectionListener {
- public void onPreNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- disposeDialog();
- }
-
- public void onPreNodeDelete(NodeModel oldParent, NodeModel selectedNode, int index) {
- disposeDialog();
- }
-
- public void onNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- disposeDialog();
- }
-
- public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
- disposeDialog();
- }
-
- public void onNodeDeleted(NodeModel parent, NodeModel child, int index) {
- disposeDialog();
- }
-
- public void mapChanged(MapChangeEvent event) {
- disposeDialog();
- }
-
- public void nodeChanged(NodeChangeEvent event) {
- if(event.getProperty().equals(NodeModel.NODE_TEXT)){
- disposeDialog();
- }
- }
-
- public void afterMapChange(MapModel oldMap, MapModel newMap) {
- }
-
- public void beforeMapChange(MapModel oldMap, MapModel newMap) {
- disposeDialog();
- }
- }
-
- final private class FilterTextDocumentListener implements DocumentListener, ChangeListener, ActionListener {
- private Timer mTypeDelayTimer = null;
-
- private synchronized void delayedChange() {
- stopTimer();
- mTypeDelayTimer = new Timer(500, new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- change();
- }
- });
- mTypeDelayTimer.start();
- }
- public void stopTimer() {
- if (mTypeDelayTimer != null) {
- mTypeDelayTimer.stop();
- mTypeDelayTimer = null;
- }
- }
- public void changedUpdate(final DocumentEvent event) {
- delayedChange();
- }
-
- public void insertUpdate(final DocumentEvent event) {
- delayedChange();
- }
-
- public void removeUpdate(final DocumentEvent event) {
- delayedChange();
- }
-
- private synchronized void change() {
- stopTimer();
- final Object selectedItem = mFilterTextSearchField.getEditor().getItem();
- mFlatNodeTableFilterModel.setFilter((String) selectedItem, matchCase.isSelected(),
- useRegexInFind.isSelected());
- }
-
- public void stateChanged(ChangeEvent e) {
- change();
- }
-
- public void actionPerformed(ActionEvent e) {
- change();
- }
- }
-
- final private class FlatNodeTable extends JTable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Override
- public TableCellRenderer getCellRenderer(final int row, final int column) {
- final Object object = getModel().getValueAt(row, column);
- if (object instanceof Date) {
- return dateRenderer;
- }
- if (object instanceof TextHolder) {
- return textRenderer;
- }
- if (object instanceof IconsHolder) {
- return iconsRenderer;
- }
- return super.getCellRenderer(row, column);
- }
-
- @Override
- public boolean isCellEditable(final int rowIndex, final int vColIndex) {
- return false;
- }
-
- @Override
- protected void processKeyEvent(final KeyEvent e) {
- if (e.getKeyCode() == KeyEvent.VK_ENTER) {
- final EventListener[] el = super.getListeners(KeyListener.class);
- if (e.getID() != KeyEvent.KEY_RELEASED) {
- return;
- }
- for (int i = 0; i < el.length; i++) {
- final KeyListener kl = (KeyListener) el[i];
- kl.keyReleased(e);
- }
- return;
- }
- super.processKeyEvent(e);
- }
- }
-
- final private class FlatNodeTableKeyListener implements KeyListener {
- public void keyPressed(final KeyEvent arg0) {
- }
-
- public void keyReleased(final KeyEvent arg0) {
- if (arg0.getKeyCode() == KeyEvent.VK_ESCAPE) {
- disposeDialog();
- }
- if (arg0.getKeyCode() == KeyEvent.VK_ENTER) {
- selectSelectedRows();
- disposeDialog();
- }
- }
-
- public void keyTyped(final KeyEvent arg0) {
- }
- }
-
- final private class FlatNodeTableMouseAdapter extends MouseAdapter {
- @Override
- public void mouseClicked(final MouseEvent e) {
- if (e.getClickCount() == 2) {
- final Point p = e.getPoint();
- final int row = tableView.rowAtPoint(p);
- gotoNodesAndClose(row, new int[] { row });
- }
- }
- }
-
- private class HolderAccessor{
- final private boolean selectedOnly;
- private HolderAccessor(boolean selectedOnly) {
- super();
- this.selectedOnly = selectedOnly;
- }
-
- public void changeString(final TextHolder textHolder, final String newText) {
- textHolder.setText(newText);
- }
-
- public int getLength() {
- return mFlatNodeTableFilterModel.getRowCount();
- }
-
- public TextHolder[] getNodeHoldersAt(final int row) {
- return selectedOnly ? getSelectedNodeHoldersAt(row):getAnyNodeHoldersAt(row);
- }
- public TextHolder[] getAnyNodeHoldersAt(final int i) {
- return new TextHolder[]{
- (TextHolder) mFlatNodeTableFilterModel.getValueAt(i, NodeList.NODE_TEXT_COLUMN),
- (TextHolder) mFlatNodeTableFilterModel.getValueAt(i, NodeList.NODE_DETAILS_COLUMN),
- (TextHolder) mFlatNodeTableFilterModel.getValueAt(i, NodeList.NODE_NOTES_COLUMN)
- };
- }
- public TextHolder[] getSelectedNodeHoldersAt(final int i) {
- return new TextHolder[]{(TextHolder) sorter.getValueAt(tableView.getSelectedRows()[i], NodeList.NODE_TEXT_COLUMN)};
- }
-
- }
-
- private static String COLUMN_CREATED = "Created";
- private static String COLUMN_DATE = "Date";
- private static String COLUMN_ICONS = "Icons";
- private static String COLUMN_MODIFIED = "Modified";
- private static String COLUMN_NOTES = "Notes";
- private static String COLUMN_TEXT = "Text";
- private static String COLUMN_DETAILS = "Details";
- private static final int DATE_COLUMN = 0;
- protected static final int NODE_CREATED_COLUMN = 3;
- protected static final int NODE_ICON_COLUMN = 2;
- protected static final int NODE_MODIFIED_COLUMN = 4;
- protected static final int NODE_DETAILS_COLUMN = 5;
- protected static final int NODE_NOTES_COLUMN = 6;
- public static final int NODE_TEXT_COLUMN = 1;
- private static final String PLUGINS_TIME_LIST_XML_CREATED = "plugins/TimeList.xml_Created";
- private static final String PLUGINS_TIME_LIST_XML_DATE = "plugins/TimeList.xml_Date";
- private static final String PLUGINS_TIME_LIST_XML_ICONS = "plugins/TimeList.xml_Icons";
- private static final String PLUGINS_TIME_LIST_XML_MODIFIED = "plugins/TimeList.xml_Modified";
- private static final String PLUGINS_TIME_LIST_XML_NOTES = "plugins/TimeList.xml_Notes";
- private static final String PLUGINS_TIME_LIST_XML_DETAILS = "plugins/TimeList.xml_Details";
-
- private static final String PLUGINS_TIME_LIST_XML_TEXT = "plugins/TimeList.xml_Text";
- private static final String PLUGINS_TIME_MANAGEMENT_XML_CLOSE = "plugins/TimeManagement.xml_closeButton";
- private static final String PLUGINS_TIME_MANAGEMENT_XML_FIND = "plugins/TimeManagement.xml_Find";
- private static final String PLUGINS_TIME_MANAGEMENT_XML_REPLACE = "plugins/TimeManagement.xml_Replace";
-// private static final String PLUGINS_TIME_MANAGEMENT_XML_SELECT = "plugins/TimeManagement.xml_Select";
- private static final String PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE = "plugins/TimeManagement.xml_WindowTitle";
- private static final String PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE_ALL_NODES = "plugins/TimeManagement.xml_WindowTitle_All_Nodes";
- private static final String WINDOW_PREFERENCE_STORAGE_PROPERTY = NodeList.class.getName() + "_properties";
-
- private static String replace(final Pattern p, String input, final String replacement) {
- final String result = HtmlUtils.getReplaceResult(p, input, replacement);
- return result;
- }
-
-// // final private Controller controller;
- private DateRenderer dateRenderer;
- private JDialog dialog;
- private IconsRenderer iconsRenderer;
- final private JComboBox mFilterTextReplaceField;
- final private JComboBox mFilterTextSearchField;
- private FlatNodeTableFilterModel mFlatNodeTableFilterModel;
-// final private ModeController modeController;
- private JLabel mTreeLabel;
- private TextRenderer textRenderer;
- private boolean showAllNodes = false;
- private org.freeplane.view.swing.features.time.mindmapmode.nodelist.TableSorter sorter;
- private JTable tableView;
- private DefaultTableModel tableModel;
- private final boolean searchInAllMaps;
- private final JCheckBox useRegexInReplace;
- private final JCheckBox useRegexInFind;
- private final JCheckBox matchCase;
- final private boolean modal;
-
- public NodeList( final boolean showAllNodes, final boolean searchInAllMaps) {
- this(false, showAllNodes, searchInAllMaps);
- }
-
- public NodeList( final boolean modal, final boolean showAllNodes, final boolean searchInAllMaps) {
-// this.modeController = modeController;
-// controller = modeController.getController();
- this.modal = modal;
- this.showAllNodes = showAllNodes;
- this.searchInAllMaps = searchInAllMaps;
- mFilterTextSearchField = new JComboBox();
- mFilterTextSearchField.setEditable(true);
- final FilterTextDocumentListener listener = new FilterTextDocumentListener();
- mFilterTextSearchField.addActionListener(listener);
- final JTextComponent editorComponent = (JTextComponent) mFilterTextSearchField.getEditor().getEditorComponent();
- editorComponent.getDocument().addDocumentListener(listener);
- mFilterTextSearchField.addKeyListener(new KeyAdapter() {
- @Override
- public void keyPressed(final KeyEvent pEvent) {
- if (pEvent.getKeyCode() == KeyEvent.VK_DOWN) {
- mFilterTextReplaceField.requestFocusInWindow();
- }
- }
- });
- mFilterTextReplaceField = new JComboBox();
- mFilterTextReplaceField.setEditable(true);
- mFilterTextReplaceField.addKeyListener(new KeyAdapter() {
- @Override
- public void keyPressed(final KeyEvent pEvent) {
- if (pEvent.getKeyCode() == KeyEvent.VK_DOWN) {
- tableView.requestFocusInWindow();
- }
- else if (pEvent.getKeyCode() == KeyEvent.VK_UP) {
- mFilterTextSearchField.requestFocusInWindow();
- }
- }
- });
- useRegexInReplace = new JCheckBox();
- useRegexInFind = new JCheckBox();
- useRegexInFind.addChangeListener(listener);
- matchCase = new JCheckBox();
- matchCase.addChangeListener(listener);
- final MapChangeListener mapChangeListener = new MapChangeListener();
- final ModeController modeController = Controller.getCurrentModeController();
- final MapController mapController = modeController.getMapController();
- mapController.addMapChangeListener(mapChangeListener);
- mapController.addNodeChangeListener(mapChangeListener);
- Controller.getCurrentController().getMapViewManager().addMapSelectionListener(mapChangeListener);
-
- }
-
- /**
- *
- */
- private void disposeDialog() {
- if(dialog == null || !dialog.isVisible()){
- return;
- }
- final TimeWindowConfigurationStorage storage = new TimeWindowConfigurationStorage();
- for (int i = 0; i < tableView.getColumnCount(); i++) {
- final TimeWindowColumnSetting setting = new TimeWindowColumnSetting();
- setting.setColumnWidth(tableView.getColumnModel().getColumn(i).getWidth());
- setting.setColumnSorting(sorter.getSortingStatus(i));
- storage.addTimeWindowColumnSetting(setting);
- }
- storage.storeDialogPositions(dialog, NodeList.WINDOW_PREFERENCE_STORAGE_PROPERTY);
- dialog.setVisible(false);
- dialog.dispose();
- dialog = null;
- }
-
- protected void exportSelectedRowsAndClose() {
- final int[] selectedRows = tableView.getSelectedRows();
- final List<NodeModel> selectedNodes = new ArrayList<NodeModel>();
- for (int i = 0; i < selectedRows.length; i++) {
- final int row = selectedRows[i];
- selectedNodes.add(getMindMapNode(row));
- }
- final ModeController mindMapController = Controller.getCurrentModeController();
- MFileManager.getController(mindMapController).newMapFromDefaultTemplate();
- final MapModel newMap = Controller.getCurrentController().getMap();
- for (final NodeModel node : selectedNodes) {
- final NodeModel copy = ClipboardController.getController().duplicate(node, false);
- if (copy != null) {
- mindMapController.getMapController().insertNodeIntoWithoutUndo(copy, newMap.getRootNode());
- }
- }
- disposeDialog();
- }
-
- /**
- */
- private NodeModel getMindMapNode(final int focussedRow) {
- final NodeModel selectedNode = ((TextHolder) tableView.getModel().getValueAt(focussedRow,
- NodeList.NODE_TEXT_COLUMN)).getNode();
- return selectedNode;
- }
-
- private void gotoNodesAndClose(final int focussedRow, final int[] selectedRows) {
- selectNodes(focussedRow, selectedRows);
- disposeDialog();
- }
-
- private void replace(final HolderAccessor holderAccessor) {
- final String searchString = (String) mFilterTextSearchField.getSelectedItem();
- if(searchString == null)
- return;
- final String replaceString = (String) mFilterTextReplaceField.getSelectedItem();
- Pattern p;
- try {
- p = Pattern.compile(useRegexInFind.isSelected() ? searchString : Pattern.quote(searchString),
- matchCase.isSelected() ? 0 : Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);
- }
- catch (final PatternSyntaxException e) {
- UITools.errorMessage(TextUtils.format("wrong_regexp", searchString, e.getMessage()));
- return;
- }
- final String replacement = replaceString == null ? "" : replaceString;
- final int length = holderAccessor.getLength();
- for (int i = 0; i < length; i++) {
- TextHolder[] textHolders = holderAccessor.getNodeHoldersAt(i);
- for(final TextHolder textHolder:textHolders){
- final String text = textHolder.getText();
- final String replaceResult;
- final String literalReplacement = useRegexInReplace.isSelected() ? replacement : Matcher.quoteReplacement(replacement);
- try {
- if (HtmlUtils.isHtmlNode(text)) {
- replaceResult = NodeList.replace(p, text,literalReplacement);
- }
- else {
- replaceResult = p.matcher(text).replaceAll(literalReplacement);
- }
- }
- catch (Exception e) {
- UITools.errorMessage(TextUtils.format("wrong_regexp", replacement, e.getMessage()));
- return;
- }
- if (!StringUtils.equals(text, replaceResult)) {
- holderAccessor.changeString(textHolder, replaceResult);
- }
- }
- }
- tableModel.fireTableDataChanged();
- mFlatNodeTableFilterModel.resetFilter();
- mFilterTextSearchField.insertItemAt(mFilterTextSearchField.getSelectedItem(), 0);
- mFilterTextReplaceField.insertItemAt(mFilterTextReplaceField.getSelectedItem(), 0);
- mFilterTextSearchField.setSelectedItem("");
- }
-
- private void selectNodes(final int focussedRow, final int[] selectedRows) {
- if (focussedRow >= 0) {
- final NodeModel focussedNode = getMindMapNode(focussedRow);
- final MapModel map = focussedNode.getMap();
- final List<NodeModel> selectedNodes = new ArrayList<NodeModel>();
- for (final int row : selectedRows) {
- final NodeModel node = getMindMapNode(row);
- if (!node.getMap().equals(map)) {
- continue;
- }
- selectedNodes.add(node);
- }
- selectMap(map);
- Controller.getCurrentModeController().getMapController().selectMultipleNodes(focussedNode, selectedNodes);
- }
- }
-
- private void selectMap(final MapModel map) {
- if (map.equals(Controller.getCurrentController().getMap())) {
- return;
- }
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- final Map<String, MapModel> maps = mapViewManager.getMaps(MModeController.MODENAME);
- for (final Map.Entry<String, MapModel> entry : maps.entrySet()) {
- if (map.equals(entry.getValue())) {
- mapViewManager.tryToChangeToMapView(entry.getKey());
- }
- }
- }
-
- private void selectSelectedRows() {
- selectNodes(tableView.getSelectedRow(), tableView.getSelectedRows());
- }
-
- public void startup() {
- if(dialog != null){
- dialog.toFront();
- return;
- }
- NodeList.COLUMN_MODIFIED = TextUtils.getText(PLUGINS_TIME_LIST_XML_MODIFIED);
- NodeList.COLUMN_CREATED = TextUtils.getText(PLUGINS_TIME_LIST_XML_CREATED);
- NodeList.COLUMN_ICONS = TextUtils.getText(PLUGINS_TIME_LIST_XML_ICONS);
- NodeList.COLUMN_TEXT = TextUtils.getText(PLUGINS_TIME_LIST_XML_TEXT);
- NodeList.COLUMN_DETAILS= TextUtils.getText(PLUGINS_TIME_LIST_XML_DETAILS);
- NodeList.COLUMN_DATE = TextUtils.getText(PLUGINS_TIME_LIST_XML_DATE);
- NodeList.COLUMN_NOTES = TextUtils.getText(PLUGINS_TIME_LIST_XML_NOTES);
- dialog = new JDialog(Controller.getCurrentController().getViewController().getFrame(), modal /* modal */);
- String windowTitle;
- if (showAllNodes) {
- windowTitle = PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE_ALL_NODES;
- }
- else {
- windowTitle = PLUGINS_TIME_MANAGEMENT_XML_WINDOW_TITLE;
- }
- dialog.setTitle(TextUtils.getText(windowTitle));
- dialog.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- final WindowAdapter windowListener = new WindowAdapter() {
-
- @Override
- public void windowGainedFocus(WindowEvent e) {
- mFilterTextSearchField.getEditor().selectAll();
- }
-
- @Override
- public void windowClosing(final WindowEvent event) {
- disposeDialog();
- }
- };
- dialog.addWindowListener(windowListener);
- dialog.addWindowFocusListener(windowListener);
- UITools.addEscapeActionToDialog(dialog, new AbstractAction() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent arg0) {
- disposeDialog();
- }
- });
- final Container contentPane = dialog.getContentPane();
- final GridBagLayout gbl = new GridBagLayout();
- contentPane.setLayout(gbl);
- final GridBagConstraints layoutConstraints = new GridBagConstraints();
- layoutConstraints.gridx = 0;
- layoutConstraints.gridy = 0;
- layoutConstraints.gridwidth = 1;
- layoutConstraints.gridheight = 1;
- layoutConstraints.weightx = 0.0;
- layoutConstraints.weighty = 0.0;
- layoutConstraints.anchor = GridBagConstraints.WEST;
- layoutConstraints.fill = GridBagConstraints.HORIZONTAL;
- contentPane.add(new JLabel(TextUtils.getText(PLUGINS_TIME_MANAGEMENT_XML_FIND)), layoutConstraints);
- layoutConstraints.gridwidth = 1;
- layoutConstraints.gridx++;
- contentPane.add(Box.createHorizontalStrut(40), layoutConstraints);
- layoutConstraints.gridx++;
- contentPane.add(new JLabel(TextUtils.getText("filter_match_case")), layoutConstraints);
- layoutConstraints.gridx++;
- contentPane.add(matchCase, layoutConstraints);
- layoutConstraints.gridx++;
- contentPane.add(Box.createHorizontalStrut(40), layoutConstraints);
- layoutConstraints.gridx++;
- contentPane.add(new JLabel(TextUtils.getText("regular_expressions")), layoutConstraints);
- layoutConstraints.gridx++;
- contentPane.add(useRegexInFind, layoutConstraints);
- layoutConstraints.gridx = 0;
- layoutConstraints.weightx = 1.0;
- layoutConstraints.gridwidth = GridBagConstraints.REMAINDER;
- layoutConstraints.gridy++;
- contentPane.add(/* new JScrollPane */(mFilterTextSearchField), layoutConstraints);
- layoutConstraints.gridy++;
- layoutConstraints.weightx = 0.0;
- layoutConstraints.gridwidth = 1;
- contentPane.add(new JLabel(TextUtils.getText(PLUGINS_TIME_MANAGEMENT_XML_REPLACE)), layoutConstraints);
- layoutConstraints.gridx = 5;
- contentPane.add(new JLabel(TextUtils.getText("regular_expressions")), layoutConstraints);
- layoutConstraints.gridx++;
- contentPane.add(useRegexInReplace, layoutConstraints);
- layoutConstraints.gridx = 0;
- layoutConstraints.weightx = 1.0;
- layoutConstraints.gridwidth = GridBagConstraints.REMAINDER;
- layoutConstraints.gridy++;
- contentPane.add(/* new JScrollPane */(mFilterTextReplaceField), layoutConstraints);
- dateRenderer = new DateRenderer();
- textRenderer = new TextRenderer();
- iconsRenderer = new IconsRenderer();
- tableView = new FlatNodeTable();
- tableView.addKeyListener(new FlatNodeTableKeyListener());
- tableView.addMouseListener(new FlatNodeTableMouseAdapter());
- tableView.getTableHeader().setReorderingAllowed(false);
- tableModel = updateModel();
- mFlatNodeTableFilterModel = new FlatNodeTableFilterModel(tableModel,
- new int[]{NodeList.NODE_TEXT_COLUMN, NodeList.NODE_DETAILS_COLUMN, NodeList.NODE_NOTES_COLUMN}
- );
- sorter = new TableSorter(mFlatNodeTableFilterModel);
- tableView.setModel(sorter);
- sorter.setTableHeader(tableView.getTableHeader());
- sorter.setColumnComparator(Date.class, TableSorter.COMPARABLE_COMPARATOR);
- sorter.setColumnComparator(NodeModel.class, TableSorter.LEXICAL_COMPARATOR);
- sorter.setColumnComparator(IconsHolder.class, TableSorter.COMPARABLE_COMPARATOR);
- sorter.setSortingStatus(NodeList.DATE_COLUMN, TableSorter.ASCENDING);
- final JScrollPane pane = new JScrollPane(tableView);
- UITools.setScrollbarIncrement(pane);
- layoutConstraints.gridy++;
- GridBagConstraints tableConstraints = (GridBagConstraints) layoutConstraints.clone();
- tableConstraints.weightx = 1;
- tableConstraints.weighty = 10;
- tableConstraints.fill = GridBagConstraints.BOTH;
- contentPane.add(pane, tableConstraints);
- mTreeLabel = new JLabel();
- layoutConstraints.gridy++;
- GridBagConstraints treeConstraints = (GridBagConstraints) layoutConstraints.clone();
- treeConstraints.fill = GridBagConstraints.BOTH;
- @SuppressWarnings("serial")
- JScrollPane scrollPane = new JScrollPane(mTreeLabel){
- @Override
- public boolean isValidateRoot() {
- return false;
- }
- };
- contentPane.add(scrollPane, treeConstraints);
- final AbstractAction exportAction = new AbstractAction(TextUtils.getText("plugins/TimeManagement.xml_Export")) {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent arg0) {
- exportSelectedRowsAndClose();
- }
- };
- final JButton exportButton = new JButton(exportAction);
- final AbstractAction replaceAllAction = new AbstractAction(TextUtils
- .getText("plugins/TimeManagement.xml_Replace_All")) {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent arg0) {
- replace(new HolderAccessor(false));
- }
- };
- final JButton replaceAllButton = new JButton(replaceAllAction);
- final AbstractAction replaceSelectedAction = new AbstractAction(TextUtils
- .getText("plugins/TimeManagement.xml_Replace_Selected")) {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent arg0) {
- replace(new HolderAccessor(true));
- }
- };
- final JButton replaceSelectedButton = new JButton(replaceSelectedAction);
- final AbstractAction gotoAction = new AbstractAction(TextUtils.getText("plugins/TimeManagement.xml_Goto")) {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent arg0) {
- selectSelectedRows();
- }
- };
- final JButton gotoButton = new JButton(gotoAction);
- final AbstractAction disposeAction = new AbstractAction(TextUtils.getText(PLUGINS_TIME_MANAGEMENT_XML_CLOSE)) {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent arg0) {
- disposeDialog();
- }
- };
- final JButton cancelButton = new JButton(disposeAction);
- /* Initial State */
- gotoAction.setEnabled(false);
- exportAction.setEnabled(false);
- replaceSelectedAction.setEnabled(false);
- final Box bar = Box.createHorizontalBox();
- bar.add(Box.createHorizontalGlue());
- bar.add(cancelButton);
- bar.add(exportButton);
- bar.add(replaceAllButton);
- bar.add(replaceSelectedButton);
- bar.add(gotoButton);
- bar.add(Box.createHorizontalGlue());
- layoutConstraints.gridy++;
- contentPane.add(/* new JScrollPane */(bar), layoutConstraints);
- final JMenuBar menuBar = new JMenuBar();
- final JMenu menu = new JMenu(TextUtils.getText("plugins/TimeManagement.xml_menu_actions"));
- final AbstractAction[] actionList = new AbstractAction[] { gotoAction, replaceSelectedAction,
- replaceAllAction, exportAction, disposeAction };
- for (int i = 0; i < actionList.length; i++) {
- final AbstractAction action = actionList[i];
- final JMenuItem item = menu.add(action);
- item.setIcon(new BlindIcon(UIBuilder.ICON_SIZE));
- }
- menuBar.add(menu);
- dialog.setJMenuBar(menuBar);
- final ListSelectionModel rowSM = tableView.getSelectionModel();
- rowSM.addListSelectionListener(new ListSelectionListener() {
- public void valueChanged(final ListSelectionEvent e) {
- if (e.getValueIsAdjusting()) {
- return;
- }
- final ListSelectionModel lsm = (ListSelectionModel) e.getSource();
- final boolean enable = !(lsm.isSelectionEmpty());
- replaceSelectedAction.setEnabled(enable);
- gotoAction.setEnabled(enable);
- exportAction.setEnabled(enable);
- }
- });
- rowSM.addListSelectionListener(new ListSelectionListener() {
- String getNodeText(final NodeModel node) {
- return TextController.getController().getShortText(node) + ((node.isRoot()) ? "" : (" <- " + getNodeText(node.getParentNode())));
- }
-
- public void valueChanged(final ListSelectionEvent e) {
- if (e.getValueIsAdjusting()) {
- return;
- }
- final ListSelectionModel lsm = (ListSelectionModel) e.getSource();
- if (lsm.isSelectionEmpty()) {
- mTreeLabel.setText("");
- return;
- }
- final int selectedRow = lsm.getLeadSelectionIndex();
- final NodeModel mindMapNode = getMindMapNode(selectedRow);
- mTreeLabel.setText(getNodeText(mindMapNode));
- }
- });
- final String marshalled = ResourceController.getResourceController().getProperty(
- NodeList.WINDOW_PREFERENCE_STORAGE_PROPERTY);
- final WindowConfigurationStorage result = TimeWindowConfigurationStorage.decorateDialog(marshalled, dialog);
- final WindowConfigurationStorage storage = result;
- if (storage != null) {
- tableView.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
- int column = 0;
- for (final TimeWindowColumnSetting setting : ((TimeWindowConfigurationStorage) storage)
- .getListTimeWindowColumnSettingList()) {
- tableView.getColumnModel().getColumn(column).setPreferredWidth(setting.getColumnWidth());
- sorter.setSortingStatus(column, setting.getColumnSorting());
- column++;
- }
- }
- mFlatNodeTableFilterModel.setFilter((String)mFilterTextSearchField.getSelectedItem(),
- matchCase.isSelected(), useRegexInFind.isSelected());
- dialog.setVisible(true);
- }
-
- /**
- * Creates a table model for the new table and returns it.
- */
- private DefaultTableModel updateModel() {
- final DefaultTableModel model = new DefaultTableModel() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /*
- * (non-Javadoc)
- * @see javax.swing.table.AbstractTableModel#getColumnClass(int)
- */
- @Override
- public Class<?> getColumnClass(final int arg0) {
- switch (arg0) {
- case DATE_COLUMN:
- case NODE_CREATED_COLUMN:
- case NODE_MODIFIED_COLUMN:
- return Date.class;
- case NODE_TEXT_COLUMN:
- case NODE_NOTES_COLUMN:
- case NODE_DETAILS_COLUMN:
- return TextHolder.class;
- case NODE_ICON_COLUMN:
- return IconsHolder.class;
- default:
- return Object.class;
- }
- }
- };
- model.addColumn(NodeList.COLUMN_DATE);
- model.addColumn(NodeList.COLUMN_TEXT);
- model.addColumn(NodeList.COLUMN_ICONS);
- model.addColumn(NodeList.COLUMN_CREATED);
- model.addColumn(NodeList.COLUMN_MODIFIED);
- model.addColumn(NodeList.COLUMN_DETAILS);
- model.addColumn(NodeList.COLUMN_NOTES);
- if (searchInAllMaps == false) {
- final NodeModel node = Controller.getCurrentController().getMap().getRootNode();
- updateModel(model, node);
- }
- else {
- final Map<String, MapModel> maps = Controller.getCurrentController().getMapViewManager().getMaps(MModeController.MODENAME);
- for (final MapModel map : maps.values()) {
- final NodeModel node = map.getRootNode();
- updateModel(model, node);
- }
- }
- return model;
- }
-
- private void updateModel(final DefaultTableModel model, final NodeModel node) {
- final ReminderExtension hook = ReminderExtension.getExtension(node);
- Date date = null;
- if (hook != null) {
- date = new Date(hook.getRemindUserAt());
- }
- if (showAllNodes && node.isVisible() || hook != null) {
- model.addRow(new Object[] {
- date,
- new TextHolder(new CoreTextAccessor(node)),
- new IconsHolder(node),
- node.getHistoryInformation().getCreatedAt(),
- node.getHistoryInformation().getLastModifiedAt(),
- new TextHolder(new DetailTextAccessor(node)) ,
- new TextHolder(new NoteTextAccessor(node)) });
- }
- for (final NodeModel child : Controller.getCurrentModeController().getMapController().childrenUnfolded(node)) {
- updateModel(model, child);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeListAction.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeListAction.java
deleted file mode 100644
index bdbf368..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NodeListAction.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-
-/**
- * @author Dimitry Polivaev
- * 01.09.2009
- */
-public class NodeListAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private final NodeList nodeList;
-
- public NodeListAction() {
- super("NodeListAction");
- nodeList = new NodeList(true, false);
- }
-
- public void actionPerformed(final ActionEvent e) {
- nodeList.startup();
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NoteTextAccessor.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NoteTextAccessor.java
deleted file mode 100644
index 0e258f5..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/NoteTextAccessor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.features.note.mindmapmode.MNoteController;
-
-/**
- * @author Dimitry Polivaev 03.10.2013
- */
-class NoteTextAccessor implements TextAccessor {
- final private NodeModel node;
-
- public NoteTextAccessor(NodeModel node) {
- this.node = node;
- }
-
- public String getText() {
- final String notesText = NoteModel.getNoteText(node);
- return notesText != null ? notesText : "";
- }
-
- public void setText(String newText) {
- ((MNoteController) Controller.getCurrentModeController().getExtension(NoteController.class)).setNoteText(node, newText);
- }
-
- public NodeModel getNode() {
- return node;
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextHolder.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextHolder.java
deleted file mode 100644
index 29b7d33..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextHolder.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- * 03.10.2013
- */
-/** removes html in notes before comparison. */
-public class TextHolder implements Comparable<TextHolder> {
- final private TextAccessor textAccessor;
- private String originalNotesText = null;
- private String untaggedNotesText = null;
-
-
- public TextHolder(final TextAccessor textAccessor) {
- this.textAccessor = textAccessor;
- }
-
- public int compareTo(final TextHolder compareToObject) {
- return toString().compareTo(compareToObject.toString());
- }
-
- public String getUntaggedNotesText() {
- final String notesText = textAccessor.getText();
- if (notesText == null) {
- return "";
- }
- if (untaggedNotesText == null || (originalNotesText != null && !originalNotesText.equals(notesText))) {
- originalNotesText = notesText;
- untaggedNotesText = HtmlUtils.htmlToPlain(notesText).replaceAll("\\s+", " ");
- }
- return untaggedNotesText;
- }
-
- @Override
- public String toString() {
- return getUntaggedNotesText();
- }
-
- public void setText(String newText) {
- textAccessor.setText(newText);
-
- }
-
- public NodeModel getNode() {
- return textAccessor.getNode();
- }
-
- public String getText() {
- return textAccessor.getText();
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextRenderer.java b/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextRenderer.java
deleted file mode 100644
index 4b6bfef..0000000
--- a/freeplane/src/org/freeplane/view/swing/features/time/mindmapmode/nodelist/TextRenderer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.features.time.mindmapmode.nodelist;
-
-import javax.swing.table.DefaultTableCellRenderer;
-
-/**
- * @author Dimitry Polivaev
- * 03.10.2013
- */
-class TextRenderer extends DefaultTableCellRenderer {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public TextRenderer() {
- super();
- }
-
- @Override
- public void setValue(final Object value) {
- setText((value == null) ? "" : ((TextHolder) value).getUntaggedNotesText());
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/ArrowIcon.java b/freeplane/src/org/freeplane/view/swing/map/ArrowIcon.java
deleted file mode 100644
index 86cdb9f..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/ArrowIcon.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-
-import javax.swing.Icon;
-
-import org.freeplane.features.mode.ModeController;
-
-/**
- * @author Dimitry Polivaev
- * Mar 5, 2011
- */
-class ArrowIcon implements Icon{
- /**
- *
- */
- private final NodeView nodeView;
- final private boolean down;
- final private static int ARROW_HEIGTH = 5;
- final private static int ARROW_HALF_WIDTH = 4;
- final private static int ICON_HEIGTH = ARROW_HEIGTH + 2;
- final private static int ICON_WIDTH = 1 + ARROW_HALF_WIDTH * 2 + 1;
-
-
- public ArrowIcon(NodeView nodeView, boolean down) {
- super();
- this.nodeView = nodeView;
- this.down = down;
- }
-
- public int getIconHeight() {
- return ICON_HEIGTH;
- }
-
- public int getIconWidth() {
- return ICON_WIDTH;
- }
-
- public void paintIcon(Component c, Graphics g, int x, int y) {
- int[] xs = new int[3];
- int[] ys = new int[3];
-
- xs[0] = 1 + ARROW_HALF_WIDTH;
- xs[1] = 1;
- xs[2] = xs[0] + ARROW_HALF_WIDTH;
- if(down){
- ys[0] = 1 + ARROW_HEIGTH;
- ys[1] = ys[2] = 1;
- }
- else{
- ys[0] = 1;
- ys[1] = ys[2] = 1 + ARROW_HEIGTH;
- }
- final Color oldColor = g.getColor();
- final Color color = nodeView.getEdgeColor();
- g.setColor(color);
- Graphics2D g2= (Graphics2D) g;
- final Object renderingHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
- ModeController modeController = this.nodeView.getMap().getModeController();
- modeController.getController().getMapViewManager().setEdgesRenderingHint(g2);
- g.drawPolygon(xs, ys, 3);
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
- g.setColor(oldColor);
- }
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/BubbleMainView.java b/freeplane/src/org/freeplane/view/swing/map/BubbleMainView.java
deleted file mode 100644
index 6f3fa04..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/BubbleMainView.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.RenderingHints;
-import java.awt.Stroke;
-
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-
-class BubbleMainView extends MainView {
-
- final static Stroke DEF_STROKE = new BasicStroke();
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Override
- public
- Point getLeftPoint() {
- final Point in = new Point(0, getHeight() / 2);
- return in;
- }
-
- @Override
- public
- Point getRightPoint() {
- final Point in = getLeftPoint();
- in.x = getWidth() - 1;
- return in;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.NodeView#getStyle()
- */
- @Override
- public
- String getShape() {
- return NodeStyleModel.STYLE_BUBBLE;
- }
-
- @Override
- public void paintComponent(final Graphics graphics) {
- final Graphics2D g = (Graphics2D) graphics;
- final NodeView nodeView = getNodeView();
- final NodeModel model = nodeView.getModel();
- if (model == null) {
- return;
- }
- final ModeController modeController = getNodeView().getMap().getModeController();
- final Object renderingHint = modeController.getController().getMapViewManager().setEdgesRenderingHint(g);
- paintBackgound(g);
- paintDragOver(g);
- final Color edgeColor = nodeView.getEdgeColor();
- g.setColor(edgeColor);
- g.setStroke(BubbleMainView.DEF_STROKE);
- g.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 10, 10);
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
- super.paintComponent(g);
- }
-
- @Override
- protected void paintBackground(final Graphics2D graphics, final Color color) {
- graphics.setColor(color);
- graphics.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, 10, 10);
- }
- private static Insets insets = new Insets(3, 3, 3, 3);
-
- @Override
- public Insets getInsets() {
- return BubbleMainView.insets;
- }
-
- @Override
- public Insets getInsets(Insets insets) {
- return BubbleMainView.insets;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/ClickableImageCreator.java b/freeplane/src/org/freeplane/view/swing/map/ClickableImageCreator.java
deleted file mode 100644
index f80cfa1..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/ClickableImageCreator.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.util.Vector;
-
-import javax.swing.JComponent;
-
-import org.apache.commons.lang.StringEscapeUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.text.TextController;
-
-/** */
-class ClickableImageCreator {
- public static class AreaHolder {
- String alt;
- Rectangle coordinates = new Rectangle();
- String href;
- String shape = "rect";
- String title;
- }
-
- Vector<AreaHolder> area = new Vector<AreaHolder>();
- private Rectangle innerBounds;
- final private MapView mapView;
- final private String regExpLinkReplacement;
- final private NodeModel root;
-
- /**
- * @param regExpLinkReplacement
- * if for example the link abc must be replaced with FMabcFM,
- * then this string has to be FM$1FM.
- */
- ClickableImageCreator(final NodeModel root, final ModeController modeController, final String regExpLinkReplacement) {
- super();
- this.root = root;
- this.regExpLinkReplacement = regExpLinkReplacement;
- mapView = ((MapView) modeController.getController().getMapViewManager().getMapViewComponent());
- if (mapView != null) {
- innerBounds = mapView.getInnerBounds();
- }
- else {
- innerBounds = new Rectangle(0, 0, 100, 100);
- }
-// this.modeController = modeController;
- createArea();
- }
-
- private void createArea() {
- createArea(root);
- }
-
- private void createArea(final NodeModel node) {
- final NodeView nodeView = mapView.getNodeView(node);
- if (nodeView != null) {
- final AreaHolder holder = new AreaHolder();
- holder.title = TextController.getController().getShortText(node);
- holder.alt = TextController.getController().getShortText(node);
- holder.href = node.createID();
- final Point contentXY = mapView.getNodeContentLocation(nodeView);
- final JComponent content = nodeView.getContent();
- holder.coordinates.x = (int) (contentXY.x - innerBounds.getMinX());
- holder.coordinates.y = (int) (contentXY.y - innerBounds.getMinY());
- holder.coordinates.width = content.getWidth();
- holder.coordinates.height = content.getHeight();
- area.add(holder);
- for (final NodeModel child: mapView.getModeController().getMapController().childrenUnfolded(node)) {
- createArea(child);
- }
- }
- }
-
- public String generateHtml() {
- final StringBuilder htmlArea = new StringBuilder();
- for (final AreaHolder holder : area) {
- htmlArea.append("<area shape=\"" + holder.shape + "\" href=\"#"
- + holder.href.replaceFirst("^(.*)$", regExpLinkReplacement) + "\" alt=\""
- + StringEscapeUtils.escapeHtml(holder.alt) + "\" title=\""
- + StringEscapeUtils.escapeHtml(holder.title) + "\" coords=\"" + holder.coordinates.x + ","
- + holder.coordinates.y + "," + (holder.coordinates.width + holder.coordinates.x) + ","
- + +(holder.coordinates.height + holder.coordinates.y) + "\" />");
- }
- return htmlArea.toString();
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/ContentPane.java b/freeplane/src/org/freeplane/view/swing/map/ContentPane.java
deleted file mode 100644
index 0fdef16..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/ContentPane.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.freeplane.view.swing.map;
-
-import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.LayoutManager;
-
-import javax.swing.JComponent;
-
-
-class ContentPane extends JComponent {
- static private LayoutManager layoutManager = new ContentPaneLayout();
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- ContentPane() {
- setLayout(ContentPane.layoutManager);
- }
-
- @Override
- final public void paint(final Graphics g) {
- final NodeView parent = (NodeView) getParent();
- final PaintingMode paintingMode = parent.getMap().getPaintingMode();
- if(paintingMode.equals(PaintingMode.CLOUDS))
- return;
- final boolean selected = parent.isSelected();
- if(paintingMode.equals(PaintingMode.SELECTED_NODES) == selected)
- super.paint(g);
- }
-
- @Override
- public boolean contains(final int x, final int y) {
- if (super.contains(x, y))
- return true;
- for(int i = 0; i < getComponentCount(); i++){
- final Component comp = getComponent(i);
- if(comp.isVisible() && comp.contains(x-comp.getX(), y-comp.getY()))
- return true;
- }
- return false;
- }
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/ContentPaneLayout.java b/freeplane/src/org/freeplane/view/swing/map/ContentPaneLayout.java
deleted file mode 100644
index 676f129..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/ContentPaneLayout.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.freeplane.view.swing.map;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.LayoutManager;
-
-import org.freeplane.features.nodestyle.NodeStyleController;
-
-class ContentPaneLayout implements LayoutManager {
- public void addLayoutComponent(final String name, final Component comp) {
- }
-
- public void layoutContainer(final Container parent) {
- final int componentCount = parent.getComponentCount();
- final int width = parent.getWidth();
- NodeView view = (NodeView) parent.getParent();
- final MapView map = view.getMap();
- final NodeStyleController ncs = NodeStyleController.getController(map.getModeController());
- final int maxWidth = ncs.getMaxWidth(view.getModel());
- int y = 0;
- for (int i = 0; i < componentCount; i++) {
- final Component component = parent.getComponent(i);
- if (component.isVisible()) {
- component.validate();
- final Dimension preferredCompSize;
- if( width == 0)
- preferredCompSize = new Dimension();
- else if (component instanceof ZoomableLabel){
- preferredCompSize= ((ZoomableLabel)component).getPreferredSize(maxWidth);
- }
- else{
- preferredCompSize= component.getPreferredSize();
- }
-
- if (component instanceof MainView) {
- component.setBounds(0, y, width, preferredCompSize.height);
- }
- else {
- if(width > preferredCompSize.width){
- final int x = (int) (component.getAlignmentX() * (width - preferredCompSize.width));
- component.setBounds(x, y, preferredCompSize.width, preferredCompSize.height);
- }
- else{
- component.setBounds(0, y, width, preferredCompSize.height);
- }
- }
- y += preferredCompSize.height;
- }
- else{
- component.setBounds(0, y, 0, 0);
- }
- }
- }
-
- public Dimension minimumLayoutSize(final Container parent) {
- return preferredLayoutSize(parent);
- }
-
- public Dimension preferredLayoutSize(final Container parent) {
- NodeView view = (NodeView) parent.getParent();
- final MapView map = view.getMap();
- final NodeStyleController ncs = NodeStyleController.getController(map.getModeController());
- final int width = ncs.getMaxWidth(view.getModel());
- final Dimension prefSize = new Dimension(0, 0);
- final int componentCount = parent.getComponentCount();
- for (int i = 0; i < componentCount; i++) {
- final Component component = parent.getComponent(i);
- if (component.isVisible()) {
- component.validate();
- final Dimension preferredCompSize;
- if(component instanceof ZoomableLabel)
- preferredCompSize = ((ZoomableLabel)component).getPreferredSize(width);
- else
- preferredCompSize = component.getPreferredSize();
-
- prefSize.height += preferredCompSize.height;
- prefSize.width = Math.max(prefSize.width, preferredCompSize.width);
- }
- }
- return prefSize;
- }
-
- public void removeLayoutComponent(final Component comp) {
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/DetailsView.java b/freeplane/src/org/freeplane/view/swing/map/DetailsView.java
deleted file mode 100644
index e021e2f..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/DetailsView.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Color;
-import java.awt.Graphics;
-
-/**
- * @author Dimitry Polivaev
- * Mar 5, 2011
- */
- at SuppressWarnings("serial")
-public
-final class DetailsView extends ZoomableLabel {
- public DetailsView() {
- super();
- }
-
- @Override
- protected void paintComponent(Graphics g) {
- if(isBackgroundSet()){
- final Color background = getBackground();
- final Color oldColor = g.getColor();
- g.setColor(background);
- final int iconWidth = getIconWidth() + getIconTextGap();
- g.fillRect(iconWidth, 0, getWidth() - iconWidth, getHeight());
- g.setColor(oldColor);
- }
- super.paintComponent(g);
- }
-
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/FoldingMark.java b/freeplane/src/org/freeplane/view/swing/map/FoldingMark.java
deleted file mode 100644
index 8c52377..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/FoldingMark.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package org.freeplane.view.swing.map;
-
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.Polygon;
-import java.awt.Rectangle;
-import java.awt.Shape;
-import java.awt.geom.Ellipse2D;
-
-interface Drawable{
- void draw(Graphics2D g, NodeView nodeView, Rectangle r);
-}
-
-class DrawableNothing implements Drawable{
- public void draw(Graphics2D g, NodeView nodeView, Rectangle r) {
- }
-}
-abstract class DrawableShape implements Drawable{
- private final Color fillColor;
-
- public DrawableShape(Color fillColor) {
- this.fillColor = fillColor;
- }
- public void draw(Graphics2D g, NodeView nodeView, Rectangle r) {
- final Color color = g.getColor();
- final Color edgeColor = nodeView.getEdgeColor();
- final Shape shape = getShape(r);
- g.setColor(getFillColor(nodeView));
- g.fill(shape);
- g.setColor(edgeColor);
- drawShape(g, shape, r, nodeView);
- g.setColor(color);
- }
- protected void drawShape(Graphics2D g, final Shape shape, Rectangle r, NodeView nodeView) {
- g.draw(shape);
- }
- abstract Shape getShape(Rectangle r);
- protected Color getFillColor(NodeView nodeView) {
- return fillColor;
- }
-}
-
-class DrawableEllipse extends DrawableShape{
- public DrawableEllipse(Color fillColor) {
- super(fillColor);
- }
- Shape getShape(Rectangle r){
- return new Ellipse2D.Float(r.x, r.y, r.width, r.height);
- }
-}
-
-class FoldingCircle extends DrawableEllipse{
- final private boolean folded;
- final private boolean hiddenChild;
-
- public FoldingCircle(Color fillColor, boolean folded, boolean hiddenChild) {
- super(fillColor);
- this.folded = folded;
- this.hiddenChild =hiddenChild;
- }
-
- @Override
- protected void drawShape(Graphics2D g, Shape shape, Rectangle r, NodeView nodeView) {
- super.drawShape(g, shape, r, nodeView);
- if(nodeView.isRoot() & ! folded)
- return;
- if(! nodeView.getMainView().getMouseArea().equals(MouseArea.FOLDING))
- g.setColor(nodeView.getEdgeColor());
- else
- g.setColor(super.getFillColor(nodeView));
- if(! hiddenChild)
- g.drawLine(r.x + r.width / 4, r.y + r.height / 2, r.x + r.width * 3/ 4, r.y + r.height / 2);
- if(folded || hiddenChild)
- g.drawLine(r.x + r.width / 2, r.y + r.height / 4, r.x + r.width / 2, r.y + r.height * 3 / 4);
- }
-
- @Override
- protected Color getFillColor(NodeView nodeView) {
- if(nodeView.getMainView().getMouseArea().equals(MouseArea.FOLDING)){
- return Color.GRAY;
- }
- return super.getFillColor(nodeView);
- }
-
-}
-
-class DrawableTriangle extends DrawableShape{
- public DrawableTriangle(Color fillColor) {
- super(fillColor);
- }
- Shape getShape(Rectangle r){
- final Polygon polygon = new Polygon();
- polygon.addPoint(r.x, r.y);
- polygon.addPoint(r.x + r.width, r.y);
- polygon.addPoint(r.x + (r.width + 1) / 2, r.y + r.height);
- polygon.addPoint(r.x + r.width / 2, r.y + r.height);
- polygon.addPoint(r.x, r.y);
- return polygon;
- }
-}
-
-public enum FoldingMark implements Drawable{
- UNFOLDED(new DrawableNothing()), ITSELF_FOLDED(new DrawableEllipse(Color.WHITE)), UNVISIBLE_CHILDREN_FOLDED(new DrawableEllipse(Color.GRAY)),
- SHORTENED(new DrawableTriangle(Color.WHITE)),
- FOLDING_CIRCLE_FOLDED(new FoldingCircle(Color.WHITE, true, false)), FOLDING_CIRCLE_UNFOLDED(new FoldingCircle(Color.WHITE, false, false)),
- FOLDING_CIRCLE_HIDDEN_CHILD(new FoldingCircle(Color.WHITE, false, true));
- final Drawable drawable;
-
- FoldingMark(Drawable drawable){
- this.drawable = drawable;
- }
-
- public void draw(Graphics2D g, NodeView nodeView, Rectangle r) {
- drawable.draw(g, nodeView, r);
- }
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/ForkMainView.java b/freeplane/src/org/freeplane/view/swing/map/ForkMainView.java
deleted file mode 100644
index 939d492..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/ForkMainView.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.Stroke;
-
-import org.freeplane.features.edge.EdgeStyle;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-
-class ForkMainView extends MainView {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-
- @Override
- public
- Point getLeftPoint() {
- int edgeWidth = getEdgeWidth();
- final Point in = new Point(0, getHeight() - edgeWidth / 2);
- return in;
- }
-
- public int getEdgeWidth() {
- final NodeView nodeView = getNodeView();
- final int edgeWidth = nodeView.getEdgeWidth();
- final EdgeStyle style = nodeView.getEdgeStyle();
- final int nodeLineWidth = style.getNodeLineWidth(edgeWidth);
- if(edgeWidth == 0)
- return nodeLineWidth;
- else{
- final int zoomedLineWidth = nodeView.getMap().getZoomed(nodeLineWidth);
- return zoomedLineWidth;
- }
- }
-
- @Override
- protected int getMainViewHeightWithFoldingMark() {
- int height = getHeight();
- final NodeView nodeView = getNodeView();
- final NodeModel model = nodeView.getModel();
- if (nodeView.getMap().getModeController().getMapController().isFolded(model)) {
- height += getZoomedFoldingSymbolHalfWidth();
- }
- return height;
- }
-
- @Override
- public
- Point getRightPoint() {
- int edgeWidth = getEdgeWidth();
- final Point in = new Point(getWidth() - 1, getHeight() - edgeWidth / 2);
- return in;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.NodeView#getStyle()
- */
- @Override
- public
- String getShape() {
- return NodeStyleModel.STYLE_FORK;
- }
-
- @Override
- public void paintComponent(final Graphics graphics) {
- final Graphics2D g = (Graphics2D) graphics;
- final NodeView nodeView = getNodeView();
- final NodeModel model = nodeView.getModel();
- if (model == null) {
- return;
- }
- paintBackgound(g);
- paintDragOver(g);
- super.paintComponent(g);
- }
-
- @Override
- protected void paintBackground(final Graphics2D graphics, final Color color) {
- graphics.setColor(color);
- graphics.fillRect(0, 0, getWidth(), getHeight() - getEdgeWidth());
- }
-
- @Override
- void paintDecoration(final NodeView nodeView, final Graphics2D g) {
- final Stroke oldStroke = g.getStroke();
- float edgeWidth = getEdgeWidth();
- g.setStroke(new BasicStroke(edgeWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
- final Color oldColor = g.getColor();
- g.setColor(nodeView.getEdgeColor());
- Point leftLinePoint = getLeftPoint();
- g.drawLine(leftLinePoint.x, leftLinePoint.y, leftLinePoint.x + getWidth(), leftLinePoint.y);
- g.setColor(oldColor);
- g.setStroke(oldStroke);
- super.paintDecoration(nodeView, g);
- }
-
- @Override
- public Insets getInsets() {
- return getInsets(null);
- }
-
- @Override
- public Insets getInsets(Insets insets) {
- final NodeView nodeView = getNodeView();
- int edgeWidth = nodeView.getEdgeWidth();
- final EdgeStyle style = nodeView.getEdgeStyle();
- edgeWidth = style.getNodeLineWidth(edgeWidth);
- if(insets == null)
- insets = new Insets(0, 2, edgeWidth, 2);
- else
- insets.set(0, 2, edgeWidth, 2);
- return insets;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/INodeViewLayout.java b/freeplane/src/org/freeplane/view/swing/map/INodeViewLayout.java
deleted file mode 100644
index c5fa874..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/INodeViewLayout.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.LayoutManager;
-
-public interface INodeViewLayout extends LayoutManager {
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/LeftNodeViewLayout.java b/freeplane/src/org/freeplane/view/swing/map/LeftNodeViewLayout.java
deleted file mode 100644
index 284de15..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/LeftNodeViewLayout.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-/**
- * @author Dimitry Polivaev
- */
-public class LeftNodeViewLayout extends NodeViewLayoutAdapter {
- static private LeftNodeViewLayout instance = null;
-
- static LeftNodeViewLayout getInstance() {
- if (LeftNodeViewLayout.instance == null) {
- LeftNodeViewLayout.instance = new LeftNodeViewLayout();
- }
- return LeftNodeViewLayout.instance;
- }
-
- @Override
- protected void layout() {
- final LayoutData layoutData = new LayoutData(getChildCount());
- calcLayout(true, layoutData);
- placeChildren(layoutData);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MainView.java b/freeplane/src/org/freeplane/view/swing/map/MainView.java
deleted file mode 100644
index 35f6ef4..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/MainView.java
+++ /dev/null
@@ -1,740 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.GradientPaint;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseEvent;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-import java.util.Collection;
-
-import javax.swing.Icon;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JToolTip;
-import javax.swing.KeyStroke;
-import javax.swing.SwingConstants;
-import javax.swing.SwingUtilities;
-import javax.swing.border.Border;
-import javax.swing.text.JTextComponent;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.core.ui.components.MultipleImage;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.icon.UIIcon;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.map.HideChildSubtree;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodelocation.LocationModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.styles.MapViewLayout;
-import org.freeplane.features.text.HighlightedTransformedObject;
-import org.freeplane.features.text.TextController;
-
-
-/**
- * Base class for all node views.
- */
-public abstract class MainView extends ZoomableLabel {
- private static final int FOLDING_CIRCLE_WIDTH = 16;
- private static final String USE_COMMON_OUT_POINT_FOR_ROOT_NODE_STRING = "use_common_out_point_for_root_node";
- public static boolean USE_COMMON_OUT_POINT_FOR_ROOT_NODE = ResourceController.getResourceController().getBooleanProperty(USE_COMMON_OUT_POINT_FOR_ROOT_NODE_STRING);
-
- static Dimension maximumSize = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
- static Dimension minimumSize = new Dimension(0,0);
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- protected int isDraggedOver = NodeView.DRAGGED_OVER_NO;
- private boolean isShortened;
- private TextModificationState textModified = TextModificationState.NONE;
- private MouseArea mouseArea = MouseArea.OUT;
- private static final int DRAG_OVAL_WIDTH = 10;
-
- boolean isShortened() {
- return isShortened;
- }
-
- MainView() {
- setAlignmentX(Component.CENTER_ALIGNMENT);
- setHorizontalAlignment(SwingConstants.LEFT);
- setVerticalAlignment(SwingConstants.CENTER);
- setHorizontalTextPosition(SwingConstants.TRAILING);
- setVerticalTextPosition(JLabel.TOP);
- }
-
- protected void convertPointFromMap(final Point p) {
- UITools.convertPointFromAncestor(getMap(), p, this);
- }
-
- protected void convertPointToMap(final Point p) {
- UITools.convertPointToAncestor(this, p, getMap());
- }
-
- public boolean dropAsSibling(final double xCoord) {
- if(dropLeft(xCoord))
- return ! isInVerticalRegion(xCoord, 2. / 3);
- else
- return isInVerticalRegion(xCoord, 1. / 3);
- }
-
- /** @return true if should be on the left, false otherwise. */
- public boolean dropLeft(final double xCoord) {
- /* here it is the same as me. */
- return getNodeView().isLeft();
- }
-
- public int getDeltaX() {
- final NodeView nodeView = getNodeView();
- final NodeModel model = nodeView.getModel();
- if (nodeView.getMap().getModeController().getMapController().isFolded(model) && nodeView.isLeft()) {
- return getZoomedFoldingSymbolHalfWidth() * 3;
- }
- else
- return 0;
- }
-
- /** get y coordinate including folding symbol */
- public int getDeltaY() {
- return 0;
- }
-
- public int getDraggedOver() {
- return isDraggedOver;
- }
-
- public abstract Point getLeftPoint();
-
- /** get height including folding symbol */
- protected int getMainViewHeightWithFoldingMark() {
- return getHeight();
- }
-
- /** get width including folding symbol */
- protected int getMainViewWidthWithFoldingMark() {
- int width = getWidth();
- final NodeView nodeView = getNodeView();
- final NodeModel model = nodeView.getModel();
- if (nodeView.getMap().getModeController().getMapController().isFolded(model)) {
- width += getZoomedFoldingSymbolHalfWidth() * 3;
- }
- return width;
- }
-
-
- @Override
- public Dimension getMaximumSize() {
- return MainView.maximumSize;
- }
-
- @Override
- public Dimension getMinimumSize() {
- return MainView.minimumSize;
- }
-
- public abstract Point getRightPoint();
-
- public abstract String getShape();
-
- int getZoomedFoldingSymbolHalfWidth() {
- return getNodeView().getZoomedFoldingSymbolHalfWidth();
- }
-
- public boolean isInFollowLinkRegion(final double xCoord) {
- final NodeView nodeView = getNodeView();
- final NodeModel model = nodeView.getModel();
- if (NodeLinks.getValidLink(model) == null)
- return false;
- Rectangle iconR = ((ZoomableLabelUI)getUI()).getIconR(this);
- return xCoord >= iconR.x && xCoord < iconR.x + iconR.width;
- }
-
- /**
- * Determines whether or not the xCoord is in the part p of the node: if
- * node is on the left: part [1-p,1] if node is on the right: part[ 0,p] of
- * the total width.
- */
- public boolean isInVerticalRegion(final double xCoord, final double p) {
- return xCoord < getSize().width * p;
- }
-
- @Override
- final public void paint(Graphics g){
- final PaintingMode paintingMode = getMap().getPaintingMode();
- if(!paintingMode.equals(PaintingMode.SELECTED_NODES)
- && !paintingMode.equals(PaintingMode.NODES))
- return;
- final NodeView nodeView = getNodeView();
- final boolean selected = nodeView.isSelected();
- if(paintingMode.equals(PaintingMode.SELECTED_NODES) == selected)
- super.paint(g);
- }
-
- protected void paintBackground(final Graphics2D graphics, final Color color) {
- graphics.setColor(color);
- graphics.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
- }
-
- public void paintDragOver(final Graphics2D graphics) {
- if (isDraggedOver == NodeView.DRAGGED_OVER_SON) {
- paintDragOverSon(graphics);
- }
- if (isDraggedOver == NodeView.DRAGGED_OVER_SIBLING) {
- paintDragOverSibling(graphics);
- }
- }
-
- private void paintDragOverSibling(final Graphics2D graphics) {
- graphics.setPaint(new GradientPaint(0, getHeight() * 3 / 5, getMap().getBackground(), 0, getHeight() / 5,
- NodeView.dragColor));
- graphics.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
- }
-
- private void paintDragOverSon(final Graphics2D graphics) {
- if (getNodeView().isLeft()) {
- graphics.setPaint(new GradientPaint(getWidth() * 3 / 4, 0, getMap().getBackground(), getWidth() / 4, 0,
- NodeView.dragColor));
- graphics.fillRect(0, 0, getWidth() * 3 / 4, getHeight() - 1);
- }
- else {
- graphics.setPaint(new GradientPaint(getWidth() / 4, 0, getMap().getBackground(), getWidth() * 3 / 4, 0,
- NodeView.dragColor));
- graphics.fillRect(getWidth() / 4, 0, getWidth() - 1, getHeight() - 1);
- }
- }
-
- public FoldingMark foldingMarkType(MapController mapController, NodeModel node) {
- if (mapController.isFolded(node) && (node.isVisible() || node.getFilterInfo().isAncestor())) {
- return FoldingMark.ITSELF_FOLDED;
- }
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- if (child.isVisible() && child.containsExtension(HideChildSubtree.class)) {
- return FoldingMark.ITSELF_FOLDED;
- }
- }
- for (final NodeModel child : mapController.childrenUnfolded(node)) {
- if (!child.isVisible() && !FoldingMark.UNFOLDED.equals(foldingMarkType(mapController, child))) {
- return FoldingMark.UNVISIBLE_CHILDREN_FOLDED;
- }
- }
- return FoldingMark.UNFOLDED;
- }
-
- void paintDecoration(final NodeView nodeView, final Graphics2D g) {
- drawModificationRect(g);
- paintDragRectangle(g);
- paintFoldingMark(nodeView, g);
- if (isShortened()) {
- final int size = getZoomedFoldingSymbolHalfWidth();
- int width = size * 7 / 3;
- int x = nodeView.isLeft() ? getWidth() : 0 - width;
- int height = size * 5 / 3;
- int y = (getHeight() - height) / 2;
- FoldingMark.SHORTENED.draw(g, nodeView, new Rectangle(x, y, width, height));
- }
- }
-
- protected void paintFoldingMark(final NodeView nodeView, final Graphics2D g) {
- if (! hasChildren())
- return;
- final MapView map = getMap();
- final MapController mapController = map.getModeController().getMapController();
- final NodeModel node = nodeView.getModel();
- final FoldingMark markType = foldingMarkType(mapController, node);
- Point mousePosition = null;
- try {
- mousePosition = getMousePosition();
- }
- catch (Exception e) {
- }
- if(mousePosition != null && ! map.isPrinting()){
- final int width = Math.max(FOLDING_CIRCLE_WIDTH, getZoomedFoldingSymbolHalfWidth() * 2);
- final Point p = getNodeView().isLeft() ? getLeftPoint() : getRightPoint();
- if(p.y + width/2 > getHeight())
- p.y = getHeight() - width;
- else
- p.y -= width/2;
- if(nodeView.isLeft())
- p.x -= width;
- final FoldingMark foldingCircle;
- if(markType.equals(FoldingMark.UNFOLDED)) {
- if(mapController.hasHiddenChildren(node))
- foldingCircle = FoldingMark.FOLDING_CIRCLE_HIDDEN_CHILD;
- else
- foldingCircle = FoldingMark.FOLDING_CIRCLE_UNFOLDED;
- }
- else{
- foldingCircle = FoldingMark.FOLDING_CIRCLE_FOLDED;
- }
- foldingCircle.draw(g, nodeView, new Rectangle(p.x, p.y, width, width));
- }
- else{
- final int halfWidth = getZoomedFoldingSymbolHalfWidth();
- final Point p = getNodeView().isLeft() ? getLeftPoint() : getRightPoint();
- if (p.x <= 0) {
- p.x -= halfWidth;
- }
- else {
- p.x += halfWidth;
- }
- markType.draw(g, nodeView, new Rectangle(p.x - halfWidth, p.y-halfWidth, halfWidth*2, halfWidth*2));
- }
- }
-
-
- private void paintDragRectangle(final Graphics g) {
- if (! MouseArea.MOTION.equals(mouseArea))
- return;
- final Graphics2D g2 = (Graphics2D) g;
- final Object renderingHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
- final MapView parent = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, this);
- parent.getModeController().getController().getMapViewManager().setEdgesRenderingHint(g2);
- final Color color = g2.getColor();
- NodeView movedView = getNodeView();
- Rectangle r = getDragRectangle();
- if (movedView .isFree()) {
- g2.setColor(Color.BLUE);
- g.fillOval(r.x, r.y, r.width - 1, r.height - 1);
- }
- else if (LocationModel.getModel(movedView.getModel()).getHGap() <= 0) {
- g2.setColor(Color.RED);
- g.fillOval(r.x, r.y, r.width- 1, r.height- 1);
- }
- g2.setColor(Color.BLACK);
- g.drawOval(r.x, r.y, r.width- 1, r.height- 1);
- g2.setColor(color);
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
- }
-
- public Rectangle getDragRectangle() {
- final int size = getDraggingWidth();
- Rectangle r;
- if(getNodeView().isLeft())
- r = new Rectangle(getWidth(), -size, size, getHeight() + size * 2);
- else
- r = new Rectangle(-size, -size, size, getHeight() + size * 2);
- return r;
- }
-
- private void drawModificationRect(Graphics g) {
- final Color color = g.getColor();
- if(TextModificationState.HIGHLIGHT.equals(textModified)){
- final boolean markTransformedText = TextController.isMarkTransformedTextSet();
- if(! markTransformedText)
- return;
- g.setColor(Color.GREEN);
- }
- else if(TextModificationState.FAILURE.equals(textModified)){
- g.setColor(Color.RED);
- }
- else{
- return;
- }
- g.drawRect(-1, -1, getWidth() + 2, getHeight() + 2);
- g.setColor(color);
- }
-
- public void paintBackgound(final Graphics2D g) {
- final Color color;
- if (getNodeView().useSelectionColors()) {
- color = getNodeView().getSelectedColor();
- paintBackground(g, color);
- }
- else {
- color = getNodeView().getTextBackground();
- }
- paintBackground(g, color);
- }
-
- /*
- * (non-Javadoc)
- * @see javax.swing.JComponent#processKeyBinding(javax.swing.KeyStroke,
- * java.awt.event.KeyEvent, int, boolean)
- */
- @Override
- protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
- if (super.processKeyBinding(ks, e, condition, pressed)) {
- return true;
- }
- final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, this);
- final FreeplaneMenuBar freeplaneMenuBar = mapView.getModeController().getController().getViewController()
- .getFreeplaneMenuBar();
- return !freeplaneMenuBar.isVisible()
- && freeplaneMenuBar.processKeyBinding(ks, e, JComponent.WHEN_IN_FOCUSED_WINDOW, pressed);
- }
-
- public void setDraggedOver(final int draggedOver) {
- isDraggedOver = draggedOver;
- }
-
- public void setDraggedOver(final Point p) {
- setDraggedOver((dropAsSibling(p.getX())) ? NodeView.DRAGGED_OVER_SIBLING : NodeView.DRAGGED_OVER_SON);
- }
-
- public void updateFont(final NodeView node) {
- final Font font = NodeStyleController.getController(node.getMap().getModeController()).getFont(node.getModel());
- setFont(UITools.scale(font));
- }
-
- void updateIcons(final NodeView node) {
-// setHorizontalTextPosition(node.isLeft() ? SwingConstants.LEADING : SwingConstants.TRAILING);
- final MultipleImage iconImages = new MultipleImage();
- /* fc, 06.10.2003: images? */
- final NodeModel model = node.getModel();
- for (final UIIcon icon : IconController.getController().getStateIcons(model)) {
- iconImages.addImage(icon.getIcon());
- }
- final ModeController modeController = getNodeView().getMap().getModeController();
- final Collection<MindIcon> icons = IconController.getController(modeController).getIcons(model);
- for (final MindIcon myIcon : icons) {
- iconImages.addImage(myIcon.getIcon());
- }
- addOwnIcons(iconImages, model);
- setIcon((iconImages.getImageCount() > 0 ? iconImages : null));
- }
-
- private void addOwnIcons(final MultipleImage iconImages, final NodeModel model) {
- final URI link = NodeLinks.getLink(model);
- final Icon icon = LinkController.getLinkIcon(link, model);
- if(icon != null)
- iconImages.addImage(icon);
- }
-
- void updateTextColor(final NodeView node) {
- final Color color = NodeStyleController.getController(node.getMap().getModeController()).getColor(
- node.getModel());
- setForeground(color);
- }
-
- public boolean isEdited() {
- return getComponentCount() == 1 && getComponent(0) instanceof JTextComponent;
- }
-
- static enum TextModificationState{NONE, HIGHLIGHT, FAILURE};
-
- public void updateText(NodeModel nodeModel) {
- final NodeView nodeView = getNodeView();
- if(nodeView == null)
- return;
- final ModeController modeController = nodeView.getMap().getModeController();
- final TextController textController = TextController.getController(modeController);
- isShortened = textController.isMinimized(nodeModel);
- final Object userObject = nodeModel.getUserObject();
- Object content = userObject;
- String text;
- try {
- if(isShortened && (content instanceof String))
- content = HtmlUtils.htmlToPlain((String) content);
- final Object transformedContent = textController.getTransformedObject(content, nodeModel, userObject);
- if(nodeView.isSelected()){
- nodeView.getMap().getModeController().getController().getViewController().addObjectTypeInfo(transformedContent);
- }
- Icon icon = textController.getIcon(transformedContent, nodeModel, content);
- putClientProperty(TEXT_RENDERING_ICON, icon);
- text = transformedContent.toString();
- textModified = transformedContent instanceof HighlightedTransformedObject ? TextModificationState.HIGHLIGHT : TextModificationState.NONE;
- }
- catch (Throwable e) {
- LogUtils.warn(e.getMessage(), e);
- text = TextUtils.format("MainView.errorUpdateText", String.valueOf(content), e.getLocalizedMessage());
- textModified = TextModificationState.FAILURE;
- }
- if(isShortened){
- text = shortenText(text);
- }
- text = convertTextToHtmlLink(text, nodeModel);
- updateText(text);
- }
-
- private String convertTextToHtmlLink(String text, NodeModel node) {
- URI link = NodeLinks.getLink(node);
- if(link == null || "menuitem".equals(link.getScheme()) || ! LinkController.getController().formatNodeAsHyperlink(node))
- return text;
- if (HtmlUtils.isHtmlNode(text))
- text = HtmlUtils.htmlToPlain(text);
- StringBuilder sb = new StringBuilder("<html><body><a href=\"");
- sb.append(link.toString());
- sb.append("\">");
- final String xmlEscapedText = HtmlUtils.toHTMLEscapedText(text);
- sb.append(xmlEscapedText);
- sb.append("</a></body></html>");
- return sb.toString();
- }
-
- private String shortenText(String longText) {
- String text;
- if(HtmlUtils.isHtmlNode(longText)){
- text = HtmlUtils.htmlToPlain(longText).trim();
- }
- else{
- text = longText;
- }
- int length = text.length();
- final int eolPosition = text.indexOf('\n');
- final int maxShortenedNodeWidth = ResourceController.getResourceController().getIntProperty("max_shortened_text_length");
- if(eolPosition == -1 || eolPosition >= length || eolPosition >= maxShortenedNodeWidth){
- if(length <= maxShortenedNodeWidth){
- return text;
- }
- length = maxShortenedNodeWidth;
- }
- else{
- length = eolPosition;
- }
- text = text.substring(0, length);
- return text;
- }
-
- @Override
- public JToolTip createToolTip() {
- NodeTooltip tip = new NodeTooltip();
- tip.setComponent(this);
- final URL url = getMap().getModel().getURL();
- if (url != null) {
- tip.setBase(url);
- }
- else {
- try {
- tip.setBase(new URL("file: "));
- }
- catch (MalformedURLException e) {
- }
- }
- return tip;
- }
-
- @Override
- public void setBorder(Border border) {
- }
-
- static public enum ConnectorLocation{LEFT, RIGHT, TOP, BOTTOM, CENTER};
-
- public ConnectorLocation getConnectorLocation(Point relativeLocation) {
- if(relativeLocation.x > getWidth())
- return ConnectorLocation.RIGHT;
- if(relativeLocation.x < 0)
- return ConnectorLocation.LEFT;
- if(relativeLocation.y > getHeight())
- return ConnectorLocation.BOTTOM;
- if(relativeLocation.y <0)
- return ConnectorLocation.TOP;
- return ConnectorLocation.CENTER;
- }
- public Point getConnectorPoint(Point relativeLocation) {
- if(relativeLocation.x > getWidth())
- return getRightPoint();
- if(relativeLocation.x < 0)
- return getLeftPoint();
- if(relativeLocation.y > getHeight()){
- final Point bottomPoint = getBottomPoint();
- bottomPoint.y = getNodeView().getContent().getHeight();
- return bottomPoint;
- }
- if(relativeLocation.y <0)
- return getTopPoint();
- return getCenterPoint();
- }
-
- private Point getCenterPoint() {
- return new Point(getWidth()/2, getHeight()/2);
- }
-
- public Point getTopPoint() {
- return new Point(getWidth()/2, 0);
- }
-
- public Point getBottomPoint() {
- return new Point(getWidth()/2, getHeight());
- }
-
- @Override
- public String getToolTipText() {
- final String toolTipText = super.getToolTipText();
- if(toolTipText != null)
- return toolTipText;
- return createToolTipText();
- }
-
- private String createToolTipText() {
- final NodeView nodeView = getNodeView();
- if (nodeView == null)
- return "";
- final ModeController modeController = nodeView.getMap().getModeController();
- final NodeModel node = nodeView.getModel();
- return modeController.createToolTip(node, this);
- }
-
- @Override
- public String getToolTipText(MouseEvent event) {
- final String toolTipText = super.getToolTipText(event);
- if(toolTipText != null)
- return toolTipText;
- return createToolTipText();
- }
-
- @Override
- public boolean contains(int x, int y) {
- final Point p = new Point(x, y);
- return isInFoldingRegion(p) || isInDragRegion(p)|| super.contains(x, y);
- }
-
- public boolean isInDragRegion(Point p) {
- if (p.y >= 0 && p.y < getHeight()){
- final NodeView nodeView = getNodeView();
- if (MapViewLayout.OUTLINE.equals(nodeView.getMap().getLayoutType()))
- return false;
- final int draggingWidth = getDraggingWidth();
- if(nodeView.isLeft()){
- final int width = getWidth();
- return p.x >= width && p.x < width + draggingWidth;
- }
- else
- return p.x >= -draggingWidth && p.x < 0;
- }
- return false;
-
- }
-
- public boolean isInFoldingRegion(Point p) {
- if (hasChildren() && p.y >= 0 && p.y < getHeight()) {
- final boolean isLeft = getNodeView().isLeft();
- final int width = Math.max(FOLDING_CIRCLE_WIDTH, getZoomedFoldingSymbolHalfWidth() * 2);
- if (isLeft) {
- final int maxX = 0;
- return p.x >= -width && p.x < maxX;
- }
- else {
- final int minX = getWidth();
- return p.x >= minX && p.x < (getWidth() + width);
- }
- }
- else
- return false;
- }
-
- private boolean hasChildren() {
- return getNodeView().getModel().hasChildren();
- }
-
- public MouseArea getMouseArea() {
- return mouseArea;
- }
- public MouseArea whichMouseArea(Point point) {
- final int x = point.x;
- if(isInDragRegion(point))
- return MouseArea.MOTION;
- if(isInFoldingRegion(point))
- return MouseArea.FOLDING;
- if(isInFollowLinkRegion(x))
- return MouseArea.LINK;
- return MouseArea.DEFAULT;
- }
-
-
- public void setMouseArea(MouseArea mouseArea) {
- if(mouseArea.equals(this.mouseArea))
- return;
- final boolean repaintDraggingRectangle = isVisible()
- && (mouseArea.equals(MouseArea.MOTION)
- || this.mouseArea.equals(MouseArea.MOTION)
- );
- final boolean repaintFoldingRectangle = isVisible()
- && (mouseArea.equals(MouseArea.OUT)
- || mouseArea.equals(MouseArea.FOLDING)
- || this.mouseArea.equals(MouseArea.OUT)
- || this.mouseArea.equals(MouseArea.FOLDING));
- this.mouseArea = mouseArea;
- if(repaintDraggingRectangle)
- paintDraggingRectangleImmediately();
- if(repaintFoldingRectangle)
- paintFoldingRectangleImmediately();
- }
-
- private void paintFoldingRectangleImmediately() {
- final int zoomedFoldingSymbolHalfWidth = getZoomedFoldingSymbolHalfWidth();
- final int width = Math.max(FOLDING_CIRCLE_WIDTH, zoomedFoldingSymbolHalfWidth * 2);
- final NodeView nodeView = getNodeView();
- int height;
- final int x, y;
- if (nodeView.isLeft()){
- x = -width;
- }
- else{
- x = getWidth();
- }
- if(FOLDING_CIRCLE_WIDTH >= getHeight()){
- height = FOLDING_CIRCLE_WIDTH;
- y = getHeight() - FOLDING_CIRCLE_WIDTH;
- }
- else{
- height = getHeight();
- y = 0;
- }
- height += zoomedFoldingSymbolHalfWidth;
- final Rectangle foldingRectangle = new Rectangle(x-4, y-4, width+8, height+8);
- final MapView map = nodeView.getMap();
- UITools.convertRectangleToAncestor(this, foldingRectangle, map);
- map.paintImmediately(foldingRectangle);
- }
-
- private void paintDraggingRectangleImmediately() {
- final Rectangle dragRectangle = getDragRectangle();
- paintDecorationImmediately(dragRectangle);
- }
-
- private void paintDecorationImmediately(final Rectangle rectangle) {
- final MapView map = getMap();
- UITools.convertRectangleToAncestor(this, rectangle, map);
- map.paintImmediately(rectangle);
- }
-
- @Override
- public void setVisible(boolean visible) {
- super.setVisible(visible);
- if(! visible)
- setMouseArea(MouseArea.DEFAULT);
- }
-
- private int getDraggingWidth() {
- return getNodeView().getZoomed(DRAG_OVAL_WIDTH);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MapView.java b/freeplane/src/org/freeplane/view/swing/map/MapView.java
deleted file mode 100644
index d78c736..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/MapView.java
+++ /dev/null
@@ -1,1892 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.AWTKeyStroke;
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.EventQueue;
-import java.awt.Font;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Insets;
-import java.awt.KeyboardFocusManager;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.Stroke;
-import java.awt.dnd.Autoscroll;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.RoundRectangle2D;
-import java.awt.print.PageFormat;
-import java.awt.print.Printable;
-import java.util.AbstractList;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeMap;
-import java.util.Vector;
-
-import javax.swing.JComponent;
-import javax.swing.JPanel;
-import javax.swing.JViewport;
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.io.xml.TreeXmlReader;
-import org.freeplane.core.resources.IFreeplanePropertyListener;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.IUserInputListenerFactory;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.ModelessAttributeController;
-import org.freeplane.features.filter.Filter;
-import org.freeplane.features.link.ConnectorModel;
-import org.freeplane.features.link.ConnectorModel.Shape;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.LinkModel;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.INodeView;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.SummaryNode;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.print.FitMap;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.MapViewLayout;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.view.swing.map.link.ConnectorView;
-import org.freeplane.view.swing.map.link.EdgeLinkView;
-import org.freeplane.view.swing.map.link.ILinkView;
-
-/**
- * This class represents the view of a whole MindMap (in analogy to class
- * JTree).
- */
-public class MapView extends JPanel implements Printable, Autoscroll, IMapChangeListener, IFreeplanePropertyListener {
-
- private MapViewLayout layoutType;
-
- public MapViewLayout getLayoutType() {
- return layoutType;
- }
-
- protected void setLayoutType(final MapViewLayout layoutType) {
- this.layoutType = layoutType;
- }
-
- private boolean showNotes;
-
- boolean showNotes() {
- return showNotes;
- }
-
- private void setShowNotes() {
- final boolean showNotes= NoteController.getController(getModeController()).showNotesInMap(getModel());
- if(this.showNotes == showNotes){
- return;
- }
- this.showNotes = showNotes;
- getRoot().updateAll();
- }
-
- private PaintingMode paintingMode = null;
-
- private class MapSelection implements IMapSelection {
- public void centerNode(final NodeModel node) {
- final NodeView nodeView = getNodeView(node);
- if (nodeView != null) {
- MapView.this.centerNode(nodeView, false);
- }
- }
-
- public NodeModel getSelected() {
- final NodeView selected = MapView.this.getSelected();
- return selected.getModel();
- }
-
- public Set<NodeModel> getSelection() {
- return MapView.this.getSelectedNodes();
- }
-
-
- public List<NodeModel> getOrderedSelection() {
- return MapView.this.getOrderedSelectedNodes();
- }
- public List<NodeModel> getSortedSelection(final boolean differentSubtrees) {
- return MapView.this.getSelectedNodesSortedByY(differentSubtrees);
- }
-
- public boolean isSelected(final NodeModel node) {
- final NodeView nodeView = getNodeView(node);
- return nodeView != null && MapView.this.isSelected(nodeView);
- }
-
- public void keepNodePosition(final NodeModel node, final float horizontalPoint, final float verticalPoint) {
- anchorToSelected(node, horizontalPoint, verticalPoint);
- }
-
- public void makeTheSelected(final NodeModel node) {
- final NodeView nodeView = getNodeView(node);
- if (nodeView != null) {
- MapView.this.addSelected(nodeView, false);
- }
- }
-
- public void scrollNodeToVisible(final NodeModel node) {
- MapView.this.scrollNodeToVisible(getNodeView(node));
- }
-
- public void selectAsTheOnlyOneSelected(final NodeModel node) {
- final NodeView nodeView = getNodeView(node);
- if (nodeView != null) {
- MapView.this.selectAsTheOnlyOneSelected(nodeView);
- }
- }
-
- public void selectBranch(final NodeModel node, final boolean extend) {
- if(! extend)
- selectAsTheOnlyOneSelected(node);
- MapView.this.addBranchToSelection(getNodeView(node));
- }
-
- public void selectContinuous(final NodeModel node) {
- MapView.this.selectContinuous(getNodeView(node));
- }
-
- public void selectRoot() {
- final NodeModel rootNode = getModel().getRootNode();
- selectAsTheOnlyOneSelected(rootNode);
- centerNode(rootNode);
- }
-
- public void setSiblingMaxLevel(final int nodeLevel) {
- MapView.this.setSiblingMaxLevel(nodeLevel);
- }
-
- public int size() {
- return getSelection().size();
- }
-
- public void toggleSelected(final NodeModel node) {
- MapView.this.toggleSelected(getNodeView(node));
- }
-
- public void replaceSelection(NodeModel[] nodes) {
- if(nodes.length == 0)
- return;
- NodeView views[] = new NodeView[nodes.length];
- int i = 0;
- for(NodeModel node : nodes)
- views[i++] = getNodeView(node);
- MapView.this.replaceSelection(views);
- }
-
- }
-
- private class Selection {
- final private Set<NodeView> selectedSet = new LinkedHashSet<NodeView>();
- final private List<NodeView> selectedList = new ArrayList<NodeView>();
- private NodeView selectedNode = null;
-
- public Selection() {
- };
-
- private void select(final NodeView node) {
- clear();
- selectedSet.add(node);
- selectedList.add(node);
- selectedNode = node;
- addSelectionForHooks(node);
- node.repaintSelected();
- }
-
- private boolean add(final NodeView node) {
- if(selectedNode == null){
- select(node);
- return true;
- }
- else{
- if(selectedSet.add(node)){
- selectedList.add(node);
- node.repaintSelected();
- return true;
- }
- return false;
- }
- }
-
- private void addSelectionForHooks(final NodeView node) {
- if(! isSelected())
- return;
- final ModeController modeController = getModeController();
- final MapController mapController = modeController.getMapController();
- final NodeModel model = node.getModel();
- mapController.onSelect(model);
- }
-
- private void clear() {
- if (selectedNode != null) {
- removeSelectionForHooks(selectedNode);
- selectedNode = null;
- selectedSet.clear();
- selectedList.clear();
- }
- }
-
- private boolean contains(final NodeView node) {
- return selectedSet.contains(node);
- }
-
- /**
- * @return
- */
- public Set<NodeView> getSelection() {
- return Collections.unmodifiableSet(selectedSet);
- }
-
-
- private boolean deselect(final NodeView node) {
- final boolean selectedChanged = selectedNode != null && selectedNode.equals(node);
- if (selectedChanged) {
- removeSelectionForHooks(node);
- }
- if (selectedSet.remove(node)){
- final int last = selectedList.size() - 1;
- if(selectedList.get(last) .equals(node))
- selectedList.remove(last);
- else
- selectedList.remove(node);
- node.repaintSelected();
- if(selectedChanged) {
- if (size() > 0) {
- selectedNode = selectedSet.iterator().next();
- addSelectionForHooks(selectedNode);
- }
- else{
- selectedNode = null;
- }
- }
- return true;
- }
- return false;
- }
-
- private void removeSelectionForHooks(final NodeView node) {
- if (node.getModel() == null || ! isSelected()) {
- return;
- }
- getModeController().getMapController().onDeselect(node.getModel());
- }
-
- private int size() {
- return selectedSet.size();
- }
-
- private void replace(NodeView[] newSelection) {
- if(newSelection.length == 0)
- return;
- final boolean selectedChanges = ! newSelection[0].equals(selectedNode);
- if (selectedChanges) {
- if(selectedNode != null)
- removeSelectionForHooks(selectedNode);
- selectedNode = newSelection[0];
- }
- for(NodeView view : newSelection)
- if (!selectedSet.contains(view))
- view.repaintSelected();
- final NodeView[] oldSelection = selectedSet.toArray(new NodeView[selectedSet.size()]);
- selectedSet.clear();
- selectedList.clear();
- for(NodeView view : newSelection)
- if (selectedSet.add(view))
- selectedList.add(view);
- if (selectedChanges) {
- addSelectionForHooks(selectedNode);
- }
- for(NodeView view : oldSelection)
- if (!selectedSet.contains(view))
- view.repaintSelected();
- }
-
- public NodeView[] toArray() {
- return selectedList.toArray(new NodeView[selectedList.size()]);
- }
-
- private List<NodeView> getSelectedList() {
- return selectedList;
- }
-
- private Set<NodeView> getSelectedSet() {
- return selectedSet;
- }
- }
-
- private static final int margin = 20;
- static boolean printOnWhiteBackground;
- static private IFreeplanePropertyListener propertyChangeListener;
- public static final String RESOURCES_SELECTED_NODE_COLOR = "standardselectednodecolor";
- public static final String RESOURCES_SELECTED_NODE_RECTANGLE_COLOR = "standardselectednoderectanglecolor";
- private static final String PRESENTATION_DIMMER_TRANSPARENCY = "presentation_dimmer_transparency";
- private static final String PRESENTATION_MODE_ENABLED = "presentation_mode";
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- static boolean standardDrawRectangleForSelection;
- static Color standardSelectColor;
- private static Stroke standardSelectionStroke;
- static Color standardSelectRectangleColor;
- private NodeView anchor;
- private Point anchorContentLocation;
- /** Used to identify a right click onto a link curve. */
- private Vector<ILinkView> arrowLinkViews;
- private Color background = null;
- private Rectangle boundingRectangle = null;
- private boolean disableMoveCursor = true;
- private int extraWidth;
- private FitMap fitMap = FitMap.USER_DEFINED;
- private boolean isPreparedForPrinting = false;
- private boolean isPrinting = false;
- private final ModeController modeController;
- final private MapModel model;
- private NodeView nodeToBeVisible = null;
- private NodeView rootView = null;
- private boolean selectedsValid = true;
- final private Selection selection = new Selection();
- private int siblingMaxLevel;
- private float zoom = 1F;
- private float anchorHorizontalPoint;
- private float anchorVerticalPoint;
- private NodeView nodeToBeCentered;
- private Font noteFont;
- private Font detailFont;
- private Color detailForeground;
- private Color detailBackground;
- private boolean slowScroll;
- private static boolean presentationModeEnabled;
- private static int transparency;
- private INodeChangeListener connectorChangeListener;
-
- public MapView(final MapModel model, final ModeController modeController) {
- super();
- this.model = model;
- this.modeController = modeController;
- final String name = model.getTitle();
- setName(name);
- if (MapView.standardSelectColor == null) {
- final String stdcolor = ResourceController.getResourceController().getProperty(
- MapView.RESOURCES_SELECTED_NODE_COLOR);
- MapView.standardSelectColor = ColorUtils.stringToColor(stdcolor);
- final String stdtextcolor = ResourceController.getResourceController().getProperty(
- MapView.RESOURCES_SELECTED_NODE_RECTANGLE_COLOR);
- MapView.standardSelectRectangleColor = ColorUtils.stringToColor(stdtextcolor);
- final String drawCircle = ResourceController.getResourceController().getProperty(
- ResourceController.RESOURCE_DRAW_RECTANGLE_FOR_SELECTION);
- MapView.standardDrawRectangleForSelection = TreeXmlReader.xmlToBoolean(drawCircle);
- final String printOnWhite = ResourceController.getResourceController()
- .getProperty("printonwhitebackground");
- MapView.printOnWhiteBackground = TreeXmlReader.xmlToBoolean(printOnWhite);
- MapView.transparency = 255 - ResourceController.getResourceController().getIntProperty(PRESENTATION_DIMMER_TRANSPARENCY, 0x70);
- MapView.presentationModeEnabled = ResourceController.getResourceController().getBooleanProperty(PRESENTATION_MODE_ENABLED);
-
- createPropertyChangeListener();
- }
- this.setAutoscrolls(true);
- this.setLayout(new MindMapLayout());
- final NoteController noteController = NoteController.getController(getModeController());
- showNotes= noteController != null && noteController.showNotesInMap(getModel());
- updateContentStyle();
- initRoot();
- setBackground(requiredBackground());
- final MapStyleModel mapStyleModel = MapStyleModel.getExtension(model);
- zoom = mapStyleModel.getZoom();
- layoutType = mapStyleModel.getMapViewLayout();
- final IUserInputListenerFactory userInputListenerFactory = getModeController().getUserInputListenerFactory();
- addMouseListener(userInputListenerFactory.getMapMouseListener());
- addMouseMotionListener(userInputListenerFactory.getMapMouseListener());
- addMouseWheelListener(userInputListenerFactory.getMapMouseWheelListener());
- setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, emptyNodeViewSet());
- setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, emptyNodeViewSet());
- setFocusTraversalKeys(KeyboardFocusManager.UP_CYCLE_TRAVERSAL_KEYS, emptyNodeViewSet());
- disableMoveCursor = ResourceController.getResourceController().getBooleanProperty("disable_cursor_move_paper");
- connectorChangeListener = new INodeChangeListener() {
- public void nodeChanged(NodeChangeEvent event) {
- if(NodeLinks.CONNECTOR.equals(event.getProperty()) &&
- event.getNode().getMap().equals(getModel()))
- repaint();
- }
- };
- }
-
- @Override
- public void addNotify() {
- super.addNotify();
- modeController.getMapController().addNodeChangeListener(connectorChangeListener);
- }
-
- @Override
- public void removeNotify() {
- modeController.getMapController().removeNodeChangeListener(connectorChangeListener);
- super.removeNotify();
- }
-
- public void replaceSelection(NodeView[] views) {
- selection.replace(views);
- if(views.length > 0)
- views[0].requestFocusInWindow();
- }
-
- // generics trickery
- private Set<AWTKeyStroke> emptyNodeViewSet() {
- return Collections.emptySet();
- }
-
- private void anchorToSelected(final NodeModel node, final float horizontalPoint, final float verticalPoint) {
- final NodeView view = getNodeView(node);
- anchorToSelected(view, horizontalPoint, verticalPoint);
- }
-
- void anchorToSelected(final NodeView view, final float horizontalPoint, final float verticalPoint) {
- if (view != null && view.getMainView() != null) {
- anchor = view;
- anchorHorizontalPoint = horizontalPoint;
- anchorVerticalPoint = verticalPoint;
- this.anchorContentLocation = getAnchorCenterPoint();
- if (nodeToBeVisible == null) {
- nodeToBeVisible = anchor;
- extraWidth = 0;
- }
- }
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.dnd.Autoscroll#autoscroll(java.awt.Point)
- */
- public void autoscroll(final Point cursorLocn) {
- final Rectangle r = new Rectangle((int) cursorLocn.getX() - MapView.margin, (int) cursorLocn.getY()
- - MapView.margin, 1 + 2 * MapView.margin, 1 + 2 * MapView.margin);
- scrollRectToVisible(r);
- }
-
- public void centerNode(final NodeView node, boolean slowScroll) {
- if (node != null) {
- this.slowScroll = slowScroll;
- nodeToBeVisible = null;
- nodeToBeCentered = node;
- if (isDisplayable())
- centerNodeNow(slowScroll);
- }
- }
-
- private void centerNodeNow(boolean slowScroll) {
- final JViewport viewPort = (JViewport) getParent();
- if(slowScroll)
- viewPort.putClientProperty(ViewController.SLOW_SCROLLING, Boolean.TRUE);
- final Dimension d = viewPort.getExtentSize();
- final JComponent content = nodeToBeCentered.getContent();
- final Rectangle rect = new Rectangle(content.getWidth() / 2 - d.width / 2, content.getHeight() / 2 - d.height
- / 2, d.width, d.height);
- content.scrollRectToVisible(rect);
- nodeToBeCentered = null;
- this.slowScroll = false;
- this.anchorContentLocation = getAnchorCenterPoint();
- }
-
- boolean isLayoutCompleted() {
- final JViewport viewPort = (JViewport) getParent();
- final Dimension visibleDimension = viewPort.getExtentSize();
- return visibleDimension.width > 0;
- }
-
- static private void createPropertyChangeListener() {
- MapView.propertyChangeListener = new IFreeplanePropertyListener() {
- public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
- final Component mapView = Controller.getCurrentController().getMapViewManager().getMapViewComponent();
- if (!(mapView instanceof MapView)) {
- return;
- }
- if (propertyName.equals(MapView.RESOURCES_SELECTED_NODE_COLOR)) {
- MapView.standardSelectColor = ColorUtils.stringToColor(newValue);
- ((MapView) mapView).repaintSelecteds();
- return;
- }
- if (propertyName.equals(MapView.RESOURCES_SELECTED_NODE_RECTANGLE_COLOR)) {
- MapView.standardSelectRectangleColor = ColorUtils.stringToColor(newValue);
- ((MapView) mapView).repaintSelecteds();
- return;
- }
- if (propertyName.equals(ResourceController.RESOURCE_DRAW_RECTANGLE_FOR_SELECTION)) {
- MapView.standardDrawRectangleForSelection = TreeXmlReader.xmlToBoolean(newValue);
- ((MapView) mapView).repaintSelecteds();
- return;
- }
- if (propertyName.equals("printonwhitebackground")) {
- MapView.printOnWhiteBackground = TreeXmlReader.xmlToBoolean(newValue);
- return;
- }
- if (propertyName.equals(PRESENTATION_DIMMER_TRANSPARENCY)) {
- MapView.transparency = 255 - ResourceController.getResourceController().getIntProperty(PRESENTATION_DIMMER_TRANSPARENCY, 0x70);
- ((MapView) mapView).repaint();
- return;
- }
- if (propertyName.equals(PRESENTATION_MODE_ENABLED)) {
- MapView.presentationModeEnabled = ResourceController.getResourceController().getBooleanProperty(PRESENTATION_MODE_ENABLED);
- ((MapView) mapView).repaint();
- return;
- }
-
- }
- };
- ResourceController.getResourceController().addPropertyChangeListener(MapView.propertyChangeListener);
- }
-
- public void deselect(final NodeView newSelected) {
- if (selection.contains(newSelected) && selection.deselect(newSelected)) {
- newSelected.repaintSelected();
- }
- }
-
- public Object detectCollision(final Point p) {
- if (arrowLinkViews == null) {
- return null;
- }
- for (int i = 0; i < arrowLinkViews.size(); ++i) {
- final ILinkView arrowView = arrowLinkViews.get(i);
- if (arrowView.detectCollision(p, true)) {
- return arrowView.getModel();
- }
- }
- for (int i = 0; i < arrowLinkViews.size(); ++i) {
- final ILinkView arrowView = arrowLinkViews.get(i);
- if (arrowView.detectCollision(p, false)) {
- return arrowView.getModel();
- }
- }
- return null;
- }
-
- /**
- * Call preparePrinting() before printing and endPrinting() after printing
- * to minimize calculation efforts
- */
- public void endPrinting() {
- if (isPreparedForPrinting == false)
- return;
- isPreparedForPrinting = false;
- isPrinting = false;
- if (zoom == 1f) {
- getRoot().updateAll();
- synchronized (getTreeLock()) {
- validateTree();
- }
- }
- if (MapView.printOnWhiteBackground) {
- setBackground(background);
- }
- }
-
- private Point getAnchorCenterPoint() {
- if (! isDisplayable()) {
- return new Point();
- }
- final MainView mainView = anchor.getMainView();
- final int mainViewWidth = mainView.getWidth();
- final int mainViewHeight = mainView.getHeight();
- final Point anchorCenterPoint = new Point((int) (mainViewWidth * anchorHorizontalPoint), (int) (mainViewHeight * anchorVerticalPoint));
- final JViewport parent = (JViewport) getParent();
- UITools.convertPointToAncestor(mainView, anchorCenterPoint, this);
- anchorCenterPoint.x += - parent.getWidth() / 2;
- anchorCenterPoint.y += - parent.getHeight() / 2;
- return anchorCenterPoint;
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.dnd.Autoscroll#getAutoscrollInsets()
- */
- public Insets getAutoscrollInsets() {
- final Container parent = getParent();
- if (parent == null) {
- return new Insets(0, 0, 0, 0);
- }
- final Rectangle outer = getBounds();
- final Rectangle inner = parent.getBounds();
- return new Insets(inner.y - outer.y + MapView.margin, inner.x - outer.x + MapView.margin, outer.height
- - inner.height - inner.y + outer.y + MapView.margin, outer.width - inner.width - inner.x + outer.x
- + MapView.margin);
- }
-
- public Rectangle getInnerBounds() {
- final Rectangle innerBounds = rootView.getBounds();
- final Rectangle maxBounds = new Rectangle(0, 0, getWidth(), getHeight());
- for (int i = 0; i < arrowLinkViews.size(); ++i) {
- final ILinkView arrowView = arrowLinkViews.get(i);
- arrowView.increaseBounds(innerBounds);
- }
- return innerBounds.intersection(maxBounds);
- }
-
- public IMapSelection getMapSelection() {
- return new MapSelection();
- }
-
- public ModeController getModeController() {
- return modeController;
- }
-
- public MapModel getModel() {
- return model;
- }
-
- public Point getNodeContentLocation(final NodeView nodeView) {
- final Point contentXY = new Point(0, 0);
- UITools.convertPointToAncestor(nodeView.getContent(), contentXY, this);
- return contentXY;
- }
-
- private NodeView getNodeView(Object o) {
- if(! (o instanceof NodeModel))
- return null;
- final NodeView nodeView = getNodeView((NodeModel)o);
- return nodeView;
- }
-
- public NodeView getNodeView(final NodeModel node) {
- if (node == null) {
- return null;
- }
- for (INodeView iNodeView : node.getViewers()) {
- if(! (iNodeView instanceof NodeView)){
- continue;
- }
- final NodeView candidateView = (NodeView) iNodeView;
- if (candidateView.getMap() == this) {
- return candidateView;
- }
- }
- NodeView root = getRoot();
- if(root.getModel().equals(node))
- return root;
- else
- return null;
- }
-
- /*
- * (non-Javadoc)
- * @see javax.swing.JComponent#getPreferredSize()
- */
- @Override
- public Dimension getPreferredSize() {
- return getLayout().preferredLayoutSize(this);
- }
-
- public NodeView getRoot() {
- return rootView;
- }
-
- public NodeView getSelected() {
- if(! selectedsValid) {
- NodeView node = selection.selectedNode;
- if (node == null || ! SwingUtilities.isDescendingFrom(node, this))
- validateSelecteds();
- else {
- final JComponent content = node.getContent();
- if (content == null || ! content.isVisible())
- validateSelecteds();
- }
- }
- return selection.selectedNode;
- }
-
- public Set<NodeModel> getSelectedNodes() {
- validateSelecteds();
- return new AbstractSet<NodeModel>() {
-
- @Override
- public int size() {
- return selection.size();
- }
-
- @Override
- public boolean contains(Object o) {
- final NodeView nodeView = getNodeView(o);
- if(nodeView == null)
- return false;
- return selection.contains(nodeView);
- }
-
- @Override
- public boolean add(NodeModel o) {
- final NodeView nodeView = getNodeView(o);
- if(nodeView == null)
- return false;
- return selection.add(nodeView);
- }
-
- @Override
- public boolean remove(Object o) {
- final NodeView nodeView = getNodeView(o);
- if(nodeView == null)
- return false;
- return selection.deselect(nodeView);
- }
-
- @Override
- public Iterator<NodeModel> iterator() {
- return new Iterator<NodeModel>() {
- final Iterator<NodeView> i = selection.getSelectedSet().iterator();
-
- public boolean hasNext() {
- return i.hasNext();
- }
-
- public NodeModel next() {
- return i.next().getModel();
- }
-
- public void remove() {
- i.remove();
- }
-
- };
- }
- };
- }
-
- public List<NodeModel> getOrderedSelectedNodes() {
- validateSelecteds();
- return new AbstractList<NodeModel>(){
-
- @Override
- public boolean add(NodeModel o) {
- final NodeView nodeView = getNodeView(o);
- if(nodeView == null)
- return false;
- return selection.add(nodeView);
- }
-
-
-
- @Override
- public boolean contains(Object o) {
- final NodeView nodeView = getNodeView(o);
- if(nodeView == null)
- return false;
- return selection.contains(nodeView);
- }
-
-
-
- @Override
- public boolean remove(Object o) {
- final NodeView nodeView = getNodeView(o);
- if(nodeView == null)
- return false;
- return selection.deselect(nodeView);
- }
-
- @Override
- public NodeModel get(int index) {
- return selection.getSelectedList().get(index).getModel();
- }
-
- @Override
- public int size() {
- return selection.size();
- }
- };
- }
-
- /**
- * @param differentSubtrees
- * @return an ArrayList of MindMapNode objects. If both ancestor and
- * descandant node are selected, only the ancestor ist returned
- */
- ArrayList<NodeModel> getSelectedNodesSortedByY(final boolean differentSubtrees) {
- validateSelecteds();
- final TreeMap<Integer, LinkedList<NodeModel>> sortedNodes = new TreeMap<Integer, LinkedList<NodeModel>>();
- iteration: for (final NodeView view : selection.getSelectedSet()) {
- if (differentSubtrees) {
- for (Component parent = view.getParent(); parent != null; parent = parent.getParent()) {
- if (selection.getSelectedSet().contains(parent)) {
- continue iteration;
- }
- }
- }
- final Point point = new Point();
- UITools.convertPointToAncestor(view.getParent(), point, this);
- final NodeModel node = view.getModel();
- if(node.getParentNode() != null){
- point.y += node.getParentNode().getIndex(node);
- }
- LinkedList<NodeModel> nodeList = sortedNodes.get(point.y);
- if (nodeList == null) {
- nodeList = new LinkedList<NodeModel>();
- sortedNodes.put(point.y, nodeList);
- }
- nodeList.add(node);
- }
- final ArrayList<NodeModel> selectedNodes = new ArrayList<NodeModel>();
- for (final LinkedList<NodeModel> nodeList : sortedNodes.values()) {
- for (final NodeModel nodeModel : nodeList) {
- selectedNodes.add(nodeModel);
- }
- }
- return selectedNodes;
- }
-
- /**
- * @return
- */
- public Collection<NodeView> getSelection() {
- validateSelecteds();
- return selection.getSelection();
- }
-
- public int getSiblingMaxLevel() {
- return siblingMaxLevel;
- }
-
- /**
- * Returns the size of the visible part of the view in view coordinates.
- */
- public Dimension getViewportSize() {
- final JViewport mapViewport = (JViewport) getParent();
- return mapViewport == null ? null : mapViewport.getSize();
- }
-
- private NodeView getVisibleLeft(final NodeView oldSelected) {
- NodeView newSelected = oldSelected;
- final NodeModel oldModel = oldSelected.getModel();
- if (oldModel.isRoot()) {
- newSelected = oldSelected.getPreferredVisibleChild(layoutType.equals(MapViewLayout.OUTLINE), true);
- }
- else if (!oldSelected.isLeft()) {
- newSelected = oldSelected.getVisibleParentView();
- }
- else {
- if (getModeController().getMapController().isFolded(oldModel)) {
- getModeController().getMapController().setFolded(oldModel, false);
- return oldSelected;
- }
- newSelected = oldSelected.getPreferredVisibleChild(layoutType.equals(MapViewLayout.OUTLINE), true);
- while (newSelected != null && !newSelected.isContentVisible()) {
- newSelected = newSelected.getPreferredVisibleChild(layoutType.equals(MapViewLayout.OUTLINE), true);
- }
- if(newSelected == null)
- newSelected = getVisibleSummaryView(oldSelected);
- }
- return newSelected;
- }
-
- private NodeView getVisibleSummaryView(NodeView node) {
- if(node.isRoot())
- return null;
- final int currentSummaryLevel = SummaryNode.getSummaryLevel(node.getModel());
- int level = currentSummaryLevel;
- final int requiredSummaryLevel = level + 1;
- final NodeView parent = node.getParentView();
- for (int i = 1 + getIndex(node);i < parent.getComponentCount();i++){
- final Component component = parent.getComponent(i);
- if(! (component instanceof NodeView))
- break;
- NodeView next = (NodeView) component;
- if(next.isLeft() != node.isLeft())
- continue;
- if(next.isSummary())
- level++;
- else
- level = 0;
- if(level == requiredSummaryLevel){
- if(next.getModel().isVisible())
- return next;
- break;
- }
- if(level == currentSummaryLevel && SummaryNode.isFirstGroupNode(next.getModel()))
- break;
- }
- return getVisibleSummaryView(parent);
- }
-
- int getIndex(NodeView node) {
- final NodeView parent = node.getParentView();
- for(int i = 0; i < parent.getComponentCount(); i++){
- if(parent.getComponent(i).equals(node))
- return i;
- }
- return -1;
- }
-
- private NodeView getVisibleRight(final NodeView oldSelected) {
- NodeView newSelected = oldSelected;
- final NodeModel oldModel = oldSelected.getModel();
- if (oldModel.isRoot()) {
- newSelected = oldSelected.getPreferredVisibleChild(layoutType.equals(MapViewLayout.OUTLINE), false);
- }
- else if (oldSelected.isLeft()) {
- newSelected = oldSelected.getVisibleParentView();
- }
- else {
- if (getModeController().getMapController().isFolded(oldModel)) {
- getModeController().getMapController().setFolded(oldModel, false);
- return oldSelected;
- }
- newSelected = oldSelected.getPreferredVisibleChild(layoutType.equals(MapViewLayout.OUTLINE), false);
- while (newSelected != null && !newSelected.isContentVisible()) {
- newSelected = newSelected.getPreferredVisibleChild(layoutType.equals(MapViewLayout.OUTLINE), false);
- }
- if(newSelected == null)
- newSelected = getVisibleSummaryView(oldSelected);
- }
- return newSelected;
- }
-
- public float getZoom() {
- return zoom;
- }
-
- public int getZoomed(final int number) {
- return (int) Math.ceil(number * zoom);
- }
-
- private void initRoot() {
- this.anchorContentLocation = new Point();
- rootView = NodeViewFactory.getInstance().newNodeView(getModel().getRootNode(), this, this, 0);
- anchor = rootView;
- }
-
- public boolean isPrinting() {
- return isPrinting;
- }
-
- public boolean isSelected(final NodeView n) {
- if(isPrinting || (! selectedsValid &&
- (selection.selectedNode == null || ! SwingUtilities.isDescendingFrom(selection.selectedNode, this) || ! selection.selectedNode.getContent().isVisible())))
- return false;
- return selection.contains(n);
- }
-
- /**
- * Add the node to the selection if it is not yet there, making it the
- * focused selected node.
- */
- void addSelected(final NodeView newSelected, boolean scroll) {
- selection.add(newSelected);
- if(scroll)
- scrollNodeToVisible(newSelected);
- }
-
- public void mapChanged(final MapChangeEvent event) {
- final Object property = event.getProperty();
- if (property.equals(MapStyle.RESOURCES_BACKGROUND_COLOR)) {
- setBackground(requiredBackground());
- return;
- }
- if (property.equals(MapStyle.MAP_STYLES)){
- // set default font for notes:
- updateContentStyle();
- }
- if (property.equals(MapStyle.MAP_STYLES) && event.getMap().equals(model)
- || property.equals(ModelessAttributeController.ATTRIBUTE_VIEW_TYPE)
- || property.equals(Filter.class)
- || property.equals(UrlManager.MAP_URL)) {
- setBackground(requiredBackground());
- getRoot().updateAll();
- return;
- }
- if(property.equals(AttributeController.SHOW_ICON_FOR_ATTRIBUTES)
- ||property.equals(NoteController.SHOW_NOTE_ICONS))
- updateStateIconsRecursively(getRoot());
- if(property.equals(NoteController.SHOW_NOTES_IN_MAP))
- setShowNotes();
- }
-
- private void updateStateIconsRecursively(NodeView node) {
- final MainView mainView = node.getMainView();
- if(mainView == null)
- return;
- mainView.updateIcons(node);
- for(int i = 0; i < node.getComponentCount(); i++){
- final Component component = node.getComponent(i);
- if(component instanceof NodeView)
- updateStateIconsRecursively((NodeView) component);
- }
- }
-
- private void updateContentStyle() {
- final NodeStyleController style = Controller.getCurrentModeController().getExtension(NodeStyleController.class);
- MapModel map = getModel();
- noteFont = UITools.scale(style.getDefaultFont(map, MapStyleModel.NOTE_STYLE));
- final MapStyleModel model = MapStyleModel.getExtension(map);
- final NodeModel detailStyleNode = model.getStyleNodeSafe(MapStyleModel.DETAILS_STYLE);
- detailFont = UITools.scale(style.getFont(detailStyleNode));
- detailBackground = style.getBackgroundColor(detailStyleNode);
- detailForeground = style.getColor(detailStyleNode);
- }
-
- public boolean selectLeft(boolean continious) {
- NodeView selected = getSelected();
- NodeView newSelected = getVisibleLeft(selected);
- return selectRightOrLeft(newSelected, continious);
- }
-
- private boolean selectRightOrLeft(NodeView newSelected, boolean continious) {
- if (newSelected == null) {
- return false;
- }
- if(continious){
- if(newSelected.isParentOf(getSelected())){
- selectAsTheOnlyOneSelected(newSelected);
- addBranchToSelection(newSelected);
- }
- else{
- addBranchToSelection(getSelected());
- }
- }
- else
- selectAsTheOnlyOneSelected(newSelected);
- return true;
- }
-
- public boolean selectRight(boolean continious) {
- NodeView selected = getSelected();
- NodeView newSelected = getVisibleRight(selected);
- return selectRightOrLeft(newSelected, continious);
- }
-
-
- public boolean selectUp(boolean continious) {
- return selectSibling(continious, false, false);
- }
-
- private boolean selectSibling(boolean continious, boolean page, boolean down) {
- NodeView nextSelected = getSelected();
- do {
- final NodeView nextVisibleSibling = getNextVisibleSibling(nextSelected, down);
- if(nextSelected == null || nextSelected == nextVisibleSibling)
- return false;
- nextSelected = nextVisibleSibling;
- } while (nextSelected.isSelected());
- if(page){
- NodeView sibling = nextSelected;
- for(;;) {
- sibling = getNextVisibleSibling(sibling, down);
- if(sibling == nextSelected || sibling.getParentView() != nextSelected.getParentView())
- break;
- nextSelected = sibling;
- }
- }
- if(continious){
- selectAsTheOnlyOneSelected(getSelected());
- NodeView node = getSelected();
- do{
- node = getNextVisibleSibling(node, down);
- addSelected(node, false);
- }while(node != nextSelected);
- scrollNodeToVisible(nextSelected);
- }
- else
- selectAsTheOnlyOneSelected(nextSelected);
- return true;
- }
-
- public NodeView getNextVisibleSibling(NodeView node, boolean down) {
- return down ? node.getNextVisibleSibling() : node.getPreviousVisibleSibling();
- }
-
- public boolean selectDown(boolean continious) {
- return selectSibling(continious, false, true);
- }
-
- public boolean selectPageDown(boolean continious) {
- return selectSibling(continious, true, true);
- }
-
- public boolean selectPageUp(boolean continious) {
- return selectSibling(continious, true, false);
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int newIndex) {
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void onPreNodeDelete(final NodeModel oldParent, final NodeModel selectedNode, final int index) {
- }
-
- /*****************************************************************
- ** P A I N T I N G **
- *****************************************************************/
- /*
- * (non-Javadoc)
- * @see javax.swing.JComponent#paint(java.awt.Graphics)
- */
- @Override
- public void paint(final Graphics g) {
- if(isPrinting == false && isPreparedForPrinting == true){
- isPreparedForPrinting = false;
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- endPrinting();
- repaint();
- }
- });
- return;
- }
-
- final Graphics2D g2 = (Graphics2D) g.create();
- try {
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
- Controller.getCurrentController().getMapViewManager().setTextRenderingHint(g2);
- super.paint(g2);
- }
- finally {
- this.paintingMode = null;
- g2.dispose();
- }
- }
-
- @Override
- protected void paintChildren(final Graphics g) {
- final boolean paintLinksBehind = ResourceController.getResourceController().getBooleanProperty(
- "paint_connectors_behind");
- final PaintingMode paintModes[];
- if(paintLinksBehind)
- paintModes = new PaintingMode[]{
- PaintingMode.CLOUDS,
- PaintingMode.LINKS, PaintingMode.NODES, PaintingMode.SELECTED_NODES
- };
- else
- paintModes = new PaintingMode[]{
- PaintingMode.CLOUDS,
- PaintingMode.NODES,PaintingMode.SELECTED_NODES, PaintingMode.LINKS
- };
- Graphics2D g2 = (Graphics2D) g;
- paintChildren(g2, paintModes);
- if(presentationModeEnabled)
- paintDimmer(g2, paintModes);
- paintSelecteds(g2);
- highlightEditor(g2);
- }
-
- private void paintChildren(Graphics2D g2, final PaintingMode[] paintModes) {
- for(PaintingMode paintingMode : paintModes){
- this.paintingMode = paintingMode;
- switch(paintingMode){
- case LINKS:
- paintLinks(g2);
- break;
- default:
- super.paintChildren(g2);
- }
- }
- };
-
-
- private void paintDimmer(Graphics2D g2, PaintingMode[] paintModes) {
- final Color color = g2.getColor();
- try{
- Color dimmer = new Color(0, 0, 0, transparency);
- g2.setColor(dimmer);
- g2.fillRect(0, 0, getWidth(), getHeight());
- }
- finally{
- g2.setColor(color);
- }
- for (final NodeView selected : getSelection()) {
- highlightSelected(g2, selected, paintModes);
- }
- }
-
- private void highlightEditor(Graphics2D g2) {
- final Component editor = getComponent(0);
- if(editor instanceof NodeView)
- return;
- final java.awt.Shape oldClip = g2.getClip();
- try{
- g2.setClip(editor.getX(), editor.getY(), editor.getWidth(), editor.getHeight());
- super.paintChildren(g2);
- }
- finally{
- g2.setClip(oldClip);
- }
-
- }
-
- protected PaintingMode getPaintingMode() {
- return paintingMode;
- }
-
- private void paintLinks(final Collection<LinkModel> links, final Graphics2D graphics,
- final HashSet<ConnectorModel> alreadyPaintedLinks) {
- final Font font = graphics.getFont();
- try {
- final Iterator<LinkModel> linkIterator = links.iterator();
- while (linkIterator.hasNext()) {
- final LinkModel next = linkIterator.next();
- if (!(next instanceof ConnectorModel)) {
- continue;
- }
- final ConnectorModel ref = (ConnectorModel) next;
- if (alreadyPaintedLinks.add(ref)) {
- final NodeModel target = ref.getTarget();
- if (target == null) {
- continue;
- }
- final NodeModel source = ref.getSource();
- final NodeView sourceView = getNodeView(source);
- final NodeView targetView = getNodeView(target);
- final ILinkView arrowLink;
- if (sourceView != null && targetView != null
- && (Shape.EDGE_LIKE.equals(ref.getShape()) || sourceView.getMap().getLayoutType() == MapViewLayout.OUTLINE)
- && source.isVisible() && target.isVisible()) {
- arrowLink = new EdgeLinkView(ref, getModeController(), sourceView, targetView);
- }
- else {
- arrowLink = new ConnectorView(ref, sourceView, targetView, getBackground());
- }
- arrowLink.paint(graphics);
- arrowLinkViews.add(arrowLink);
- }
- }
- }
- finally {
- graphics.setFont(font);
- }
- }
-
- private void paintLinks(final Graphics2D graphics) {
- arrowLinkViews = new Vector<ILinkView>();
- final Object renderingHint = getModeController().getController().getMapViewManager().setEdgesRenderingHint(
- graphics);
- paintLinks(rootView, graphics, new HashSet<ConnectorModel>());
- graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
- }
-
- private void paintLinks(final NodeView source, final Graphics2D graphics,
- final HashSet<ConnectorModel> alreadyPaintedLinks) {
- final NodeModel node = source.getModel();
- final Collection<LinkModel> outLinks = NodeLinks.getLinks(node);
- paintLinks(outLinks, graphics, alreadyPaintedLinks);
- final Collection<LinkModel> inLinks = LinkController.getController(getModeController()).getLinksTo(node);
- paintLinks(inLinks, graphics, alreadyPaintedLinks);
- final int nodeViewCount = source.getComponentCount();
- for (int i = 0; i < nodeViewCount; i++) {
- final Component component = source.getComponent(i);
- if (!(component instanceof NodeView)) {
- continue;
- }
- final NodeView child = (NodeView) component;
- if (!isPrinting) {
- final Rectangle bounds = SwingUtilities.convertRectangle(source, child.getBounds(), this);
- final JViewport vp = (JViewport) getParent();
- final Rectangle viewRect = vp.getViewRect();
- viewRect.x -= viewRect.width;
- viewRect.y -= viewRect.height;
- viewRect.width *= 3;
- viewRect.height *= 3;
- if (!viewRect.intersects(bounds)) {
- continue;
- }
- }
- paintLinks(child, graphics, alreadyPaintedLinks);
- }
- }
-
- private void paintSelecteds(final Graphics2D g) {
- if (!MapView.standardDrawRectangleForSelection || isPrinting()) {
- return;
- }
- final Color c = g.getColor();
- final Stroke s = g.getStroke();
- g.setColor(MapView.standardSelectRectangleColor);
- final Stroke standardSelectionStroke = getStandardSelectionStroke();
- g.setStroke(standardSelectionStroke);
- final Object renderingHint = getModeController().getController().getMapViewManager().setEdgesRenderingHint(g);
- for (final NodeView selected : getSelection()) {
- paintSelectionRectangle(g, selected);
- }
- g.setColor(c);
- g.setStroke(s);
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
- }
-
- private RoundRectangle2D.Float getRoundRectangleAround(NodeView selected, int gap, int arcw) {
- final JComponent content = selected.getContent();
- final Point contentLocation = new Point();
- UITools.convertPointToAncestor(content, contentLocation, this);
- gap -= 1;
- final RoundRectangle2D.Float roundRectClip = new RoundRectangle2D.Float(
- contentLocation.x - gap, contentLocation.y - gap,
- content.getWidth() + 2 * gap, content.getHeight() + 2 * gap, arcw, arcw);
- return roundRectClip;
- }
-
- private void paintSelectionRectangle(final Graphics2D g, final NodeView selected) {
- if (selected.getMainView().isEdited()) {
- return;
- }
- final RoundRectangle2D.Float roundRectClip = getRoundRectangleAround(selected, 4, 15);
- g.draw(roundRectClip);
- }
-
- private void highlightSelected(Graphics2D g, NodeView selected, PaintingMode[] paintedModes) {
- final java.awt.Shape highlightClip;
- if (MapView.standardDrawRectangleForSelection)
- highlightClip = getRoundRectangleAround(selected, 4, 15);
- else
- highlightClip = getRoundRectangleAround(selected, 4, 2);
- final java.awt.Shape oldClip = g.getClip();
- final Rectangle oldClipBounds = g.getClipBounds();
- try{
- g.setClip(highlightClip);
- if(oldClipBounds != null)
- g.clipRect(oldClipBounds.x, oldClipBounds.y, oldClipBounds.width, oldClipBounds.height);
- final Rectangle clipBounds = highlightClip.getBounds();
- final Color color = g.getColor();
- g.setColor(getBackground());
- g.fillRect(clipBounds.x, clipBounds.y, clipBounds.width, clipBounds.height);
- g.setColor(color);
- paintChildren(g, paintedModes);
- }
- finally{
- g.setClip(oldClip);
- }
- }
-
- Stroke getStandardSelectionStroke() {
- if (MapView.standardSelectionStroke == null) {
- MapView.standardSelectionStroke = new BasicStroke(2.0f);
- }
- final Stroke standardSelectionStroke = MapView.standardSelectionStroke;
- return standardSelectionStroke;
- }
-
- /**
- * Call preparePrinting() before printing and endPrinting() after printing
- * to minimize calculation efforts
- */
- public void preparePrinting() {
- isPrinting = true;
- if (isPreparedForPrinting == false) {
- if (zoom == 1f) {
- getRoot().updateAll();
- synchronized (getTreeLock()) {
- validateTree();
- }
- }
- if (MapView.printOnWhiteBackground) {
- background = getBackground();
- setBackground(Color.WHITE);
- }
- boundingRectangle = getInnerBounds();
- fitMap = FitMap.valueOf();
- isPreparedForPrinting = true;
- }
- }
-
- @Override
- public void print(final Graphics g) {
- try {
- preparePrinting();
- super.print(g);
- }
- finally {
- isPrinting = false;
- }
- }
-
- public void render(Graphics g1, final Rectangle source, final Rectangle target) {
- Graphics2D g = (Graphics2D) g1;
- AffineTransform old = g.getTransform();
- final double scaleX = (0.0 + target.width) / source.width;
- final double scaleY = (0.0 + target.height) / source.height;
- final double zoom;
- if(scaleX < scaleY){
- zoom = scaleX;
- }
- else{
- zoom = scaleY;
- }
- AffineTransform tr2 = new AffineTransform(old);
- tr2.translate(target.getWidth() / 2, target.getHeight() / 2);
- tr2.scale(zoom, zoom);
- tr2.translate(-source.getX()- (source.getWidth() ) / 2, -source.getY()- (source.getHeight()) / 2);
- g.setTransform(tr2);
- final Rectangle clipBounds = g1.getClipBounds();
- g1.clipRect(source.x, source.y, source.width, source.height);
- print(g1);
- g.setTransform(old);
- g1.setClip(clipBounds.x, clipBounds.y, clipBounds.width, clipBounds.height);
- }
-
- public int print(final Graphics graphics, final PageFormat pageFormat, final int pageIndex) {
- double userZoomFactor = ResourceController.getResourceController().getDoubleProperty("user_zoom", 1);
- userZoomFactor = Math.max(0, userZoomFactor);
- userZoomFactor = Math.min(2, userZoomFactor);
- if (fitMap == FitMap.PAGE && pageIndex > 0) {
- return Printable.NO_SUCH_PAGE;
- }
- final Graphics2D g2 = (Graphics2D) graphics.create();
- preparePrinting();
- final double zoomFactor;
- final double imageableX = pageFormat.getImageableX();
- final double imageableY = pageFormat.getImageableY();
- final double imageableWidth = pageFormat.getImageableWidth();
- final double imageableHeight = pageFormat.getImageableHeight();
- g2.clipRect((int)imageableX, (int)imageableY, (int)imageableWidth, (int)imageableHeight);
- final double mapWidth = boundingRectangle.getWidth();
- final double mapHeight = boundingRectangle.getHeight();
- if (fitMap == FitMap.PAGE) {
- final double zoomFactorX = imageableWidth / mapWidth;
- final double zoomFactorY = imageableHeight / mapHeight;
- zoomFactor = Math.min(zoomFactorX, zoomFactorY) * 0.99;
- }
- else {
- if (fitMap == FitMap.WIDTH) {
- zoomFactor = imageableWidth / mapWidth * 0.99;
- }
- else if (fitMap == FitMap.HEIGHT) {
- zoomFactor = imageableHeight / mapHeight * 0.99;
- }
- else {
- zoomFactor = userZoomFactor / UITools.FONT_SCALE_FACTOR;
- }
- final int nrPagesInWidth = (int) Math.ceil(zoomFactor * mapWidth
- / imageableWidth);
- final int nrPagesInHeight = (int) Math.ceil(zoomFactor * mapHeight
- / imageableHeight);
- if (pageIndex >= nrPagesInWidth * nrPagesInHeight) {
- return Printable.NO_SUCH_PAGE;
- }
- final int yPageCoord = (int) Math.floor(pageIndex / nrPagesInWidth);
- final int xPageCoord = pageIndex - yPageCoord * nrPagesInWidth;
- g2.translate(-imageableWidth * xPageCoord, -imageableHeight * yPageCoord);
- }
- g2.translate(imageableX, imageableY);
- g2.scale(zoomFactor, zoomFactor);
- final double mapX = boundingRectangle.getX();
- final double mapY = boundingRectangle.getY();
- g2.translate(-mapX, -mapY);
- print(g2);
- g2.dispose();
- return Printable.PAGE_EXISTS;
- }
-
- private void repaintSelecteds() {
- for (final NodeView selected : getSelection()) {
- selected.repaintSelected();
- }
- }
-
- private Color requiredBackground() {
- final MapStyle mapStyle = getModeController().getExtension(MapStyle.class);
- final Color mapBackground = mapStyle.getBackground(model);
- return mapBackground;
- }
-
- void revalidateSelecteds() {
- selectedsValid = false;
- }
-
- /**
- * Scroll the viewport of the map to the south-west, i.e. scroll the map
- * itself to the north-east.
- */
- public void scrollBy(final int x, final int y) {
- final JViewport mapViewport = (JViewport) getParent();
- if (mapViewport != null) {
- final Point currentPoint = mapViewport.getViewPosition();
- currentPoint.translate(x, y);
- if (currentPoint.getX() < 0) {
- currentPoint.setLocation(0, currentPoint.getY());
- }
- if (currentPoint.getY() < 0) {
- currentPoint.setLocation(currentPoint.getX(), 0);
- }
- final double maxX = getSize().getWidth() - mapViewport.getExtentSize().getWidth();
- final double maxY = getSize().getHeight() - mapViewport.getExtentSize().getHeight();
- if (currentPoint.getX() > maxX) {
- currentPoint.setLocation(maxX, currentPoint.getY());
- }
- if (currentPoint.getY() > maxY) {
- currentPoint.setLocation(currentPoint.getX(), maxY);
- }
- mapViewport.setViewPosition(currentPoint);
- }
- }
-
- public void scrollNodeToVisible(final NodeView node) {
- scrollNodeToVisible(node, 0);
- }
-
- public void scrollNodeToVisible(final NodeView node, final int extraWidth) {
- if (nodeToBeCentered != null) {
- if (node != nodeToBeCentered) {
- centerNode(node, false);
- }
- return;
- }
- if (!isValid()) {
- nodeToBeVisible = node;
- this.extraWidth = extraWidth;
- return;
- }
- final int HORIZ_SPACE = 10;
- final int HORIZ_SPACE2 = 20;
- final int VERT_SPACE = 5;
- final int VERT_SPACE2 = 10;
- final JComponent nodeContent = node.getContent();
- int width = nodeContent.getWidth();
- if (extraWidth < 0) {
- width -= extraWidth;
- nodeContent.scrollRectToVisible(new Rectangle(-HORIZ_SPACE + extraWidth, -VERT_SPACE, width + HORIZ_SPACE2,
- nodeContent.getHeight() + VERT_SPACE2));
- }
- else {
- width += extraWidth;
- nodeContent.scrollRectToVisible(new Rectangle(-HORIZ_SPACE, -VERT_SPACE, width + HORIZ_SPACE2, nodeContent
- .getHeight()
- + VERT_SPACE2));
- }
- }
-
- /**
- * Select the node, resulting in only that one being selected.
- */
- public void selectAsTheOnlyOneSelected(final NodeView newSelected) {
- if(! newSelected.getModel().isVisible())
- throw new AssertionError("select invisible node");
- if (ResourceController.getResourceController().getBooleanProperty("center_selected_node")) {
- centerNode(newSelected, ResourceController.getResourceController().getBooleanProperty("slow_scroll_selected_node"));
- }
- else {
- scrollNodeToVisible(newSelected);
- }
- selectAsTheOnlyOneSelected(newSelected, true);
- setSiblingMaxLevel(newSelected.getModel().getNodeLevel(false));
- }
-
- public void selectAsTheOnlyOneSelected(final NodeView newSelected, final boolean requestFocus) {
- if (requestFocus) {
- newSelected.requestFocusInWindow();
- }
- scrollNodeToVisible(newSelected);
- if(selection.size() == 1 && getSelected().equals(newSelected)){
- return;
- }
- final NodeView[] oldSelecteds = selection.toArray();
- selection.select(newSelected);
- if (newSelected.getModel().getParentNode() != null) {
- ((NodeView) newSelected.getParent()).setPreferredChild(newSelected);
- }
- newSelected.repaintSelected();
- for (final NodeView oldSelected : oldSelecteds) {
- if (oldSelected != null) {
- oldSelected.repaintSelected();
- }
- }
- }
-
- /**
- * Select the node and his descendants. On extend = false clear up the
- * previous selection. if extend is false, the past selection will be empty.
- * if yes, the selection will extended with this node and its children
- */
- private void addBranchToSelection(final NodeView newlySelectedNodeView) {
- if (newlySelectedNodeView.isContentVisible()) {
- addSelected(newlySelectedNodeView, false);
- }
- for (final NodeView target : newlySelectedNodeView.getChildrenViews()) {
- addBranchToSelection(target);
- }
- }
-
- void selectContinuous(final NodeView newSelected) {
- if(newSelected.isRoot()){
- selection.add(newSelected);
- scrollNodeToVisible(newSelected);
- return;
- }
- final NodeView parentView = newSelected.getParentView();
- final boolean isLeft = newSelected.isLeft();
- final NodeModel parent = parentView.getModel();
- final int newIndex = parent.getIndex(newSelected.getModel());
- int indexGapAbove = Integer.MAX_VALUE;
- int indexGapBelow = Integer.MIN_VALUE;
- final LinkedList<NodeView> childrenViews = parentView.getChildrenViews();
- for(NodeView sibling : childrenViews){
- if(newSelected == sibling || sibling.isLeft() != isLeft || ! sibling.isSelected())
- continue;
- final int index2 = parent.getIndex(sibling.getModel());
- final int indexGap = newIndex - index2;
- if(indexGap > 0){
- if(indexGap < indexGapAbove){
- indexGapAbove = indexGap;
- }
- }
- else if(indexGapAbove == Integer.MAX_VALUE){
- if(indexGap > indexGapBelow){
- indexGapBelow = indexGap;
- }
- }
- }
- if(indexGapAbove == Integer.MAX_VALUE && indexGapBelow == Integer.MIN_VALUE){
- selection.add(newSelected);
- scrollNodeToVisible(newSelected);
- return;
- }
- NodeView lastSelected = newSelected;
- for(NodeView sibling : childrenViews){
- if(sibling.isLeft() != isLeft)
- continue;
- final int index2 = parent.getIndex(sibling.getModel());
- final int indexGap = newIndex - index2;
- if(indexGap >= 0 && indexGapAbove < Integer.MAX_VALUE && indexGap < indexGapAbove
- || indexGap <= 0 && indexGapAbove == Integer.MAX_VALUE && indexGapBelow > Integer.MIN_VALUE && indexGap > indexGapBelow){
- selection.add(sibling);
- lastSelected = sibling;
- }
- }
- scrollNodeToVisible(lastSelected);
- }
-
- public void setMoveCursor(final boolean isHand) {
- final int requiredCursor = (isHand && !disableMoveCursor) ? Cursor.MOVE_CURSOR : Cursor.DEFAULT_CURSOR;
- if (getCursor().getType() != requiredCursor) {
- setCursor(requiredCursor != Cursor.DEFAULT_CURSOR ? new Cursor(requiredCursor) : null);
- }
- }
-
- void setSiblingMaxLevel(final int level) {
- siblingMaxLevel = level;
- }
-
- private void scrollView() {
- if(nodeToBeCentered != null){
- centerNode(nodeToBeCentered, slowScroll);
- return;
- }
- if (anchorContentLocation.getX() == 0 && anchorContentLocation.getY() == 0) {
- return;
- }
- final JViewport vp = (JViewport) getParent();
- final Point viewPosition = vp.getViewPosition();
- final Point oldAnchorContentLocation = anchorContentLocation;
- final Point newAnchorContentLocation = getAnchorCenterPoint();
- final int deltaX = newAnchorContentLocation.x - oldAnchorContentLocation.x;
- final int deltaY = newAnchorContentLocation.y - oldAnchorContentLocation.y;
- if (deltaX != 0 || deltaY != 0) {
- viewPosition.x += deltaX;
- viewPosition.y += deltaY;
- final int scrollMode = vp.getScrollMode();
- vp.setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
- vp.setViewPosition(viewPosition);
- vp.setScrollMode(scrollMode);
- }
- else {
- repaintVisible();
- }
- if (nodeToBeVisible != null) {
- final int scrollMode = vp.getScrollMode();
- vp.setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
- scrollNodeToVisible(nodeToBeVisible, extraWidth);
- vp.setScrollMode(scrollMode);
- nodeToBeVisible = null;
- }
- anchor = getRoot();
- anchorHorizontalPoint = anchorVerticalPoint = 0;
- this.anchorContentLocation = getAnchorCenterPoint();
- }
-
- public void setZoom(final float zoom) {
- this.zoom = zoom;
- anchorToSelected(getSelected(), CENTER_ALIGNMENT, CENTER_ALIGNMENT);
- getRoot().updateAll();
- revalidate();
- }
-
- /**
- * Add the node to the selection if it is not yet there, remove it
- * otherwise.
- * @param requestFocus
- */
- private void toggleSelected(final NodeView nodeView) {
- if (isSelected(nodeView)) {
- if(selection.size() > 1)
- selection.deselect(nodeView);
- }
- else {
- selection.add(nodeView);
- scrollNodeToVisible(nodeView);
- }
- }
-
- private void validateSelecteds() {
- if (selectedsValid) {
- return;
- }
- selectedsValid = true;
- final NodeView selectedView = getSelected();
- if(selectedView == null){
- final NodeView root = getRoot();
- selectAsTheOnlyOneSelected(root);
- centerNode(root, false);
- return;
- }
- final NodeModel selectedNode = selectedView.getModel();
- final ArrayList<NodeView> selectedNodes = new ArrayList<NodeView>(getSelection().size());
- for (final NodeView nodeView : getSelection()) {
- if (nodeView != null) {
- selectedNodes.add(nodeView);
- }
- }
- selection.clear();
- for (final NodeView nodeView : selectedNodes) {
- if (nodeView.isContentVisible()) {
- selection.add(nodeView);
- }
- }
- if (getSelected() != null) {
- return;
- }
- for(NodeModel node = selectedNode.getParentNode(); node != null; node = node.getParentNode()){
- final NodeView newNodeView = getNodeView(node);
- if(newNodeView != null && newNodeView.isContentVisible() ){
- selectAsTheOnlyOneSelected(newNodeView);
- return;
- }
- }
- selectAsTheOnlyOneSelected(getRoot());
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.Container#validateTree()
- */
- @Override
- protected void validateTree() {
- validateSelecteds();
- getRoot().validateTree();
- super.validateTree();
- }
-
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void repaintVisible() {
- final JViewport vp = (JViewport) getParent();
- repaint(vp.getViewRect());
- }
-
- public void propertyChanged(String propertyName, String newValue, String oldValue) {
- if(propertyName.equals(TextController.MARK_TRANSFORMED_TEXT))
- UITools.repaintAll(getRoot());
- }
-
- public void selectVisibleAncestorOrSelf(NodeView preferred) {
- while(! preferred.getModel().isVisible())
- preferred = preferred.getParentView();
- selectAsTheOnlyOneSelected(preferred);
- }
-
- public Font getDefaultNoteFont() {
- return noteFont;
- }
-
- public Font getDetailFont() {
- return detailFont;
- }
-
- public Color getDetailForeground() {
- return detailForeground;
- }
-
- public Color getDetailBackground() {
- return detailBackground;
- }
-
- private boolean isSelected() {
- return Controller.getCurrentController().getMapViewManager().getMapViewComponent() == MapView.this;
- }
-
- void selectIfSelectionIsEmpty(NodeView nodeView) {
- if(selection.selectedNode == null)
- selectAsTheOnlyOneSelected(nodeView);
- }
-
- public static MapView getMapView(final Component component) {
- if(component instanceof MapView)
- return (MapView) component;
- return (MapView) SwingUtilities.getAncestorOfClass(MapView.class, component);
- }
-
- public void select() {
- getModeController().getController().getMapViewManager().changeToMapView(this);
- }
-
- @Override
- public void setSize(int width, int height) {
- super.setSize(width, height);
- validate();
- if(isDisplayable())
- scrollView();
- }
-
- @Override
- public void setLocation(int x, int y) {
- if(isValid()){
- super.setLocation(x, y);
- this.anchorContentLocation = getAnchorCenterPoint();
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MapViewController.java b/freeplane/src/org/freeplane/view/swing/map/MapViewController.java
deleted file mode 100644
index bc87a57..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/MapViewController.java
+++ /dev/null
@@ -1,871 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.EventQueue;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.KeyboardFocusManager;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.image.BufferedImage;
-import java.awt.image.RenderedImage;
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.text.MessageFormat;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JComboBox;
-import javax.swing.JOptionPane;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerNumberModel;
-import javax.swing.SwingUtilities;
-import javax.swing.event.ListDataEvent;
-import javax.swing.event.ListDataListener;
-
-import org.freeplane.core.resources.IFreeplanePropertyListener;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapViewLayout;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.ui.ViewController;
-
-/**
- * Manages the list of MapViews. As this task is very complex, I exported it
- * from Controller to this class to keep Controller simple. The information
- * exchange between controller and this class is managed by observer pattern
- * (the controller observes changes to the map mapViews here).
- */
-public class MapViewController implements IMapViewManager , IMapViewChangeListener, IFreeplanePropertyListener {
- private String lastModeName;
- /** reference to the current mapmapView; null is allowed, too. */
- private MapView selectedMapView;
- MapViewChangeObserverCompound mapViewChangeListeners = new MapViewChangeObserverCompound();
- /**
- * A vector of MapView instances. They are ordered according to their screen
- * order.
- */
- final private Vector<MapView> mapViewVector = new Vector<MapView>();
- private float zoom;
- private boolean setZoomComboBoxRun;
- private final Controller controller;
-
- /**
- * Reference to the current mode as the mapView may be null.
- */
- public MapViewController(Controller controller){
- this.controller =controller;
- controller.setMapViewManager(this);
- addMapViewChangeListener(this);
- zoomIn = new ZoomInAction(this);
- controller.addAction(zoomIn);
- zoomOut = new ZoomOutAction(this);
- controller.addAction(zoomOut);
- userDefinedZoom = TextUtils.getText("user_defined_zoom");
- zoomModel = new DefaultComboBoxModel(getZooms());
- zoomModel.addElement(userDefinedZoom);
- ResourceController resourceController = ResourceController.getResourceController();
- resourceController.addPropertyChangeListener(this);
- zoomModel.setSelectedItem("100%");
- zoomModel.addListDataListener(new ListDataListener() {
- public void intervalRemoved(ListDataEvent e) {
- }
-
- public void intervalAdded(ListDataEvent e) {
- }
-
- public void contentsChanged(ListDataEvent e) {
- if (!setZoomComboBoxRun && e.getIndex0() == -1) {
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- setZoomByItem(zoomModel.getSelectedItem());
- }
- });
- }
- }
- }) ;
- final String antialiasProperty = resourceController.getProperty(ViewController.RESOURCE_ANTIALIAS);
- changeAntialias(antialiasProperty);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#addMapChangeListener(org.freeplane.core.frame.IMapChangeListener)
- */
- public void addMapSelectionListener(final IMapSelectionListener pListener) {
- mapViewChangeListeners.addListener(pListener);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#addMapViewChangeListener(org.freeplane.core.frame.IMapViewChangeListener)
- */
- public void addMapViewChangeListener(final IMapViewChangeListener pListener) {
- mapViewChangeListeners.addListener(pListener);
- }
-
- private void addToOrChangeInMapViews(final String key, final MapView newOrChangedMapView) {
- String extension = "";
- int count = 1;
- final List<String> mapKeys = getMapKeys();
- while (mapKeys.contains(key + extension)) {
- extension = "<" + (++count) + ">";
- }
- newOrChangedMapView.setName((key + extension));
- newOrChangedMapView.setName((key + extension));
- if (!mapViewVector.contains(newOrChangedMapView)) {
- mapViewVector.add(newOrChangedMapView);
- }
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#changeToMapView(org.freeplane.view.swing.map.MapView)
- */
- public boolean changeToMapView(final Component newMapViewComponent) {
- final MapView newMapView = (MapView) newMapViewComponent;
- final MapView oldMapView = selectedMapView;
- if (newMapView == oldMapView) {
- return true;
- }
- mapViewChangeListeners.beforeMapViewChange(oldMapView, newMapView);
- selectedMapView = newMapView;
- if (selectedMapView != null) {
- selectedMapView.revalidateSelecteds();
- final ModeController modeController = selectedMapView.getModeController();
- lastModeName = modeController.getModeName();
- final float mapViewZoom = selectedMapView.getZoom();
- if (zoom != mapViewZoom) {
- setZoom(mapViewZoom);
- }
- modeController.getController().selectMode(modeController);
- }
- mapViewChangeListeners.afterMapViewChange(oldMapView, newMapView);
- return true;
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#changeToMapView(java.lang.String)
- */
- public boolean changeToMapView(final String mapViewDisplayName) {
- MapView mapViewCandidate = null;
- for (final MapView mapView : mapViewVector) {
- final String mapViewName = mapView.getName();
- if (mapViewDisplayName == mapViewName || mapViewDisplayName != null && mapViewDisplayName.equals(mapViewName)) {
- mapViewCandidate = mapView;
- break;
- }
- }
- if (mapViewCandidate == null) {
- throw new IllegalArgumentException("Map mapView " + mapViewDisplayName + " not found.");
- }
- return changeToMapView(mapViewCandidate);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#changeToMode(java.lang.String)
- */
- public boolean changeToMode(final String modeName) {
- if (modeName.equals(lastModeName)) {
- return true;
- }
- MapView mapViewCandidate = null;
- for (final MapView mapView : mapViewVector) {
- if (modeName.equals(mapView.getModeController().getModeName())) {
- mapViewCandidate = mapView;
- break;
- }
- }
- final MapView oldMapView = selectedMapView;
- final boolean changed = changeToMapView(mapViewCandidate);
- if (changed) {
- lastModeName = modeName;
- if (oldMapView == selectedMapView) {
- // if the same map remains selected post event for menu updates.
- mapViewChangeListeners.afterMapViewChange(oldMapView, selectedMapView);
- }
- }
- return changed;
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#checkIfFileIsAlreadyOpened(java.net.URL)
- */
- public String checkIfFileIsAlreadyOpened(final URL urlToCheck) throws MalformedURLException {
- for (final MapView mapView : mapViewVector) {
- if (getModel(mapView) != null) {
- final URL mapViewUrl = getModel(mapView).getURL();
- if (sameFile(urlToCheck, mapViewUrl)) {
- return mapView.getName();
- }
- }
- }
- return null;
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#close(boolean)
- */
- public boolean close(final boolean force) {
- final MapView mapView = getMapView();
- return close(mapView, force);
- }
-
- public boolean close(final Component mapViewComponent, final boolean force) {
- if (mapViewComponent == null) {
- return false;
- }
- MapView mapView = (MapView) mapViewComponent;
- final MapController mapController = mapView.getModeController().getMapController();
- final boolean closingNotCancelled = mapController.close(mapView.getModel(), force);
- if (!closingNotCancelled) {
- return false;
- }
- int index = mapViewVector.indexOf(mapView);
- mapController.removeMapChangeListener(mapView);
- ResourceController.getResourceController().removePropertyChangeListener(mapView);
- mapViewVector.remove(mapView);
- if (mapViewVector.isEmpty()) {
- /* Keep the current running mode */
- changeToMapView((MapView) null);
- }
- else if(mapView == selectedMapView){
- if (index >= mapViewVector.size() || index < 0) {
- index = mapViewVector.size() - 1;
- }
- changeToMapView((mapViewVector.get(index)));
- }
- mapViewChangeListeners.afterMapViewClose(mapView);
- mapView.getRoot().remove();
- return true;
- }
-
- public String createHtmlMap() {
- final MapModel model = getModel();
- final ClickableImageCreator creator = new ClickableImageCreator(model.getRootNode(), getMapView()
- .getModeController(), "FM$1FM");
- return creator.generateHtml();
- }
-
- public RenderedImage createImage(int dpi) {
- final MapView view = getMapView();
- if (view == null) {
- return null;
- }
- view.preparePrinting();
- final Rectangle innerBounds = view.getInnerBounds();
- final int BOUND = 1;
- innerBounds.x -= BOUND;
- innerBounds.y -= BOUND;
- innerBounds.width += 2 * BOUND;
- innerBounds.height += 2 * BOUND;
-
- double scaleFactor = (double) dpi / (double) UITools.getScreenResolution();
-
- int imageWidth = (int) Math.ceil(innerBounds.width * scaleFactor);
- int imageHeight = (int) Math.ceil(innerBounds.height * scaleFactor);
-
- final BufferedImage myImage = (BufferedImage) view.createImage(imageWidth, imageHeight);
- final Graphics2D g = (Graphics2D) myImage.getGraphics();
- g.scale(scaleFactor, scaleFactor);
- g.translate(-innerBounds.x, -innerBounds.y);
- view.print(g);
- view.endPrinting();
- return myImage;
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getBackgroundColor(org.freeplane.core.model.NodeModel)
- */
- public Color getBackgroundColor(final NodeModel node) {
- final MapView mapView = getMapView();
- if (mapView == null) {
- return null;
- }
- final NodeView nodeView = mapView.getNodeView(node);
- if (nodeView == null) {
- return null;
- }
- return nodeView.getTextBackground();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getComponent(org.freeplane.core.model.NodeModel)
- */
- public Component getComponent(final NodeModel node) {
- if(selectedMapView == null)
- return null;
- final NodeView nodeView = selectedMapView.getNodeView(node);
- if(nodeView == null)
- return null;
- return nodeView.getMainView();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getFont(org.freeplane.core.model.NodeModel)
- */
- public Font getFont(final NodeModel node) {
- final MapView mapView = getMapView();
- if (mapView == null) {
- return null;
- }
- final NodeView nodeView = mapView.getNodeView(node);
- if (nodeView == null) {
- return null;
- }
- return nodeView.getMainView().getFont();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getMapKeys()
- */
- public List<String> getMapKeys() {
- final LinkedList<String> returnValue = new LinkedList<String>();
- for (final MapView mapView : mapViewVector) {
- returnValue.add(mapView.getName());
- }
- return Collections.unmodifiableList(returnValue);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getMaps()
- */
- public Map<String, MapModel> getMaps() {
- final HashMap<String, MapModel> returnValue = new HashMap<String, MapModel>(mapViewVector.size());
- for (final MapView mapView : mapViewVector) {
- returnValue.put(mapView.getName(), getModel(mapView));
- }
- return Collections.unmodifiableMap(returnValue);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getMapSelection()
- */
- public IMapSelection getMapSelection() {
- final MapView mapView = getMapView();
- return mapView == null ? null : mapView.getMapSelection();
- }
-
- public MapView getMapView() {
- return selectedMapView;
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getMapViewComponent()
- */
- public Component getMapViewComponent() {
- return getMapView();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getMapViewVector()
- */
- public List<MapView> getMapViewVector() {
- return Collections.unmodifiableList(mapViewVector);
- }
-
- public ModeController getModeController(final Component mapView) {
- return ((MapView) mapView).getModeController();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getModel()
- */
- public MapModel getModel() {
- final MapView mapView = getMapView();
- return mapView == null ? null : getModel(mapView);
- }
-
- public MapModel getModel(final Component mapView) {
- return ((MapView) mapView).getModel();
- }
-
- private MapModel getModel(final MapView mapView) {
- return mapView == null ? null : mapView.getModel();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getSelectedComponent()
- */
- public Component getSelectedComponent() {
- final MapView mapView = getMapView();
- return mapView == null ? null : mapView.getSelected();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getTextColor(org.freeplane.core.model.NodeModel)
- */
- public Color getTextColor(final NodeModel node) {
- final MapView mapView = getMapView();
- if (mapView == null) {
- return null;
- }
- final NodeView nodeView = mapView.getNodeView(node);
- if (nodeView == null) {
- return null;
- }
- return nodeView.getTextColor();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getViewNumber()
- */
- public int getViewNumber() {
- return mapViewVector.size();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#getZoom()
- */
- public float getZoom() {
- return zoom;
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#newMapView(org.freeplane.core.model.MapModel, org.freeplane.core.modecontroller.ModeController)
- */
- public void newMapView(final MapModel map, final ModeController modeController) {
- final MapView mapView = new MapView(map, modeController);
- addToOrChangeInMapViews(mapView.getName(), mapView);
- modeController.getMapController().addMapChangeListener(mapView);
- ResourceController.getResourceController().addPropertyChangeListener(mapView);
- mapViewChangeListeners.mapViewCreated(mapView);
- changeToMapView(mapView);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#nextMapView()
- */
- public void nextMapView() {
- int index;
- final int size = mapViewVector.size();
- if (getMapView() != null) {
- index = mapViewVector.indexOf(getMapView());
- }
- else {
- index = size - 1;
- }
- if (index + 1 < size && index >= 0) {
- changeToMapView((mapViewVector.get(index + 1)));
- }
- else if (size > 0) {
- changeToMapView((mapViewVector.get(0)));
- }
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#previousMapView()
- */
- public void previousMapView() {
- int index;
- final int size = mapViewVector.size();
- if (getMapView() != null) {
- index = mapViewVector.indexOf(getMapView());
- }
- else {
- index = 0;
- }
- if (index > 0) {
- changeToMapView((mapViewVector.get(index - 1)));
- }
- else {
- if (size > 0) {
- changeToMapView((mapViewVector.get(size - 1)));
- }
- }
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#removeIMapViewChangeListener(org.freeplane.core.frame.IMapChangeListener)
- */
- public void removeMapSelectionListener(final IMapSelectionListener pListener) {
- mapViewChangeListeners.removeListener(pListener);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#removeMapViewChangeListener(org.freeplane.core.frame.IMapViewChangeListener)
- */
- public void removeMapViewChangeListener(final IMapViewChangeListener pListener) {
- mapViewChangeListeners.removeListener(pListener);
- }
-
- private boolean sameFile(final URL urlToCheck, final URL mapViewUrl) {
- if (mapViewUrl == null) {
- return false;
- }
- if (urlToCheck.getProtocol().equals("file") && mapViewUrl.getProtocol().equals("file")) {
- return (new File(urlToCheck.getFile())).equals(new File(mapViewUrl.getFile()));
- }
- return urlToCheck.sameFile(mapViewUrl);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#scrollNodeToVisible(org.freeplane.core.model.NodeModel)
- */
- public void scrollNodeToVisible(final NodeModel node) {
- final NodeView nodeView = selectedMapView.getNodeView(node);
- if (nodeView != null) {
- selectedMapView.scrollNodeToVisible(nodeView);
- }
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#setZoom(float)
- */
- public void setZoom(final float zoom) {
- this.zoom = zoom;
- final MapView mapView = getMapView();
- if (mapView == null) {
- return;
- }
- final MapModel map = mapView.getModel();
- final MapStyle mapStyle = mapView.getModeController().getExtension(MapStyle.class);
- if(mapView.getZoom() == zoom){
- return;
- }
- mapStyle.setZoom(map, zoom);
- mapView.setZoom(zoom);
- setZoomComboBox(zoom);
- final Object[] messageArguments = { String.valueOf(zoom * 100f) };
- final String stringResult = TextUtils.format("user_defined_zoom_status_bar", messageArguments);
- controller.getViewController().out(stringResult);
- }
-
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#tryToChangeToMapView(java.lang.String)
- */
- public boolean tryToChangeToMapView(final String mapView) {
- if (mapView != null && getMapKeys().contains(mapView)) {
- changeToMapView(mapView);
- return true;
- }
- else {
- return false;
- }
- }
-
- public boolean tryToChangeToMapView(URL url) throws MalformedURLException {
- final String mapExtensionKey = checkIfFileIsAlreadyOpened(url);
- if (mapExtensionKey != null) {
- tryToChangeToMapView(mapExtensionKey);
- return true;
- }
- return false;
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.core.frame.IMapViewController#updateMapViewName()
- */
- public void updateMapViewName() {
- final MapView r = getMapView();
- final String name = r.getModel().getTitle();
- addToOrChangeInMapViews(name, getMapView());
- changeToMapView(getMapView());
- }
-
- public boolean isLeftTreeSupported(final Component mapViewComponent) {
- return ((MapView) mapViewComponent).getLayoutType() != MapViewLayout.OUTLINE;
- }
-
- public Map<String, MapModel> getMaps(final String modename) {
- final HashMap<String, MapModel> returnValue = new HashMap<String, MapModel>(mapViewVector.size());
- for (final MapView mapView : mapViewVector) {
- if (mapView.getModeController().getModeName().equals(modename)) {
- returnValue.put(mapView.getName(), getModel(mapView));
- }
- }
- return Collections.unmodifiableMap(returnValue);
- }
-
- public List<Component> getViews(final MapModel map) {
- final LinkedList<Component> list = new LinkedList<Component>();
- for (final MapView view : mapViewVector) {
- if (view.getModel().equals(map)) {
- list.add(view);
- }
- }
- return list;
- }
- public void afterViewChange(final Component oldMap, final Component pNewMap) {
- Controller controller = Controller.getCurrentController();
- final ModeController oldModeController = controller.getModeController();
- ModeController newModeController = oldModeController;
- if (pNewMap != null) {
- final IMapSelection mapSelection = getMapSelection();
- final NodeModel selected = mapSelection.getSelected();
- mapSelection.scrollNodeToVisible(selected);
- setZoomComboBox(getZoom());
- obtainFocusForSelected();
- newModeController = getModeController(pNewMap);
- if (newModeController != oldModeController) {
- controller.selectMode(newModeController);
- }
- }
- setTitle();
- controller.getViewController().viewNumberChanged(getViewNumber());
- newModeController.getUserInputListenerFactory().updateMapList();
- if (pNewMap != null) {
- newModeController.setVisible(true);
- }
- }
-
- public void afterViewClose(final Component oldView) {
- ModeController newModeController = getModeController(oldView);
- newModeController.getUserInputListenerFactory().updateMapList();
- }
-
- public void afterViewCreated(final Component mapView) {
- }
-
- public void beforeViewChange(final Component oldMap, final Component newMap) {
- Controller controller = Controller.getCurrentController();
- final ModeController modeController = controller.getModeController();
- if (oldMap != null) {
- modeController.setVisible(false);
- }
- }
-
- private void setZoomByItem(final Object item) {
- final float zoomValue;
- if (((String) item).equals(userDefinedZoom)) {
- final float zoom =getZoom();
- final int zoomInt = Math.round(100 * zoom);
- final SpinnerNumberModel spinnerNumberModel = new SpinnerNumberModel(zoomInt, 1, 3200, 1);
- JSpinner spinner = new JSpinner(spinnerNumberModel);
- final int option = JOptionPane.showConfirmDialog(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(), spinner, TextUtils.getText("enter_zoom"), JOptionPane.OK_CANCEL_OPTION);
- if(option == JOptionPane.OK_OPTION)
- zoomValue = spinnerNumberModel.getNumber().floatValue() / 100;
- else
- zoomValue = zoom;
- }
- else
- zoomValue = getZoomValue(item);
- setZoom(zoomValue);
- }
-
- final private String userDefinedZoom;
- final private ZoomInAction zoomIn;
- private final DefaultComboBoxModel zoomModel;
- final private ZoomOutAction zoomOut;
-
- private float getCurrentZoomIndex() {
- final int selectedIndex = zoomModel.getIndexOf(zoomModel.getSelectedItem());
- final int itemCount = zoomModel.getSize();
- if (selectedIndex != - 1) {
- return selectedIndex;
- }
- final float userZoom = getZoom();
- for (int i = 0; i < itemCount - 1; i++) {
- if (userZoom < getZoomValue(zoomModel.getElementAt(i))) {
- return i - 0.5f;
- }
- }
- return itemCount - 1.5f;
- }
-
- public String getItemForZoom(final float f) {
- return (int) (f * 100F) + "%";
- }
-
- private void setZoomComboBox(final float f) {
- setZoomComboBoxRun = true;
- try {
- final String toBeFound = getItemForZoom(f);
- zoomModel.setSelectedItem(toBeFound);
- }
- finally {
- setZoomComboBoxRun = false;
- }
- }
-
- public void zoomIn() {
- final float currentZoomIndex = getCurrentZoomIndex();
- if (currentZoomIndex < zoomModel.getSize() - 2) {
- setZoomByItem(zoomModel.getElementAt((int) (currentZoomIndex + 1f)));
- }
- }
-
- public void zoomOut() {
- final float currentZoomIndex = getCurrentZoomIndex();
- if (currentZoomIndex > 0) {
- setZoomByItem(zoomModel.getElementAt((int) (currentZoomIndex - 0.5f)));
- }
- }
-
- public void updateMenus(final MenuBuilder menuBuilder) {
- if (menuBuilder.contains("main_toolbar_zoom")) {
- final JComboBox zoomBox = new JComboBox(zoomModel);
- menuBuilder.addElement("main_toolbar_zoom", zoomBox, MenuBuilder.AS_CHILD);
- // FELIXHACK
- //zoomBox.setRenderer(new ComboBoxRendererWithTooltip(zoomBox));
- }
- }
-
- public String[] getZooms() {
- return zooms;
- }
-
- private float getZoomValue(final Object item) {
- final String dirty = (String) item;
- final String cleaned = dirty.substring(0, dirty.length() - 1);
- final float zoomValue = Integer.parseInt(cleaned, 10) / 100F;
- return zoomValue;
- }
-
- private static final String[] zooms = { "25%", "50%", "75%", "100%", "150%", "200%", "300%", "400%" };
- public void obtainFocusForSelected() {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- if (getMapView() != null) {
- final Component selectedComponent = getSelectedComponent();
- if(selectedComponent != null){
- selectedComponent.requestFocus();
- }
- }
- }
- });
- }
-
- public boolean closeAllMaps() {
- while (getMapViewVector().size() > 0) {
- if (getMapView() != null) {
- final boolean closingNotCancelled = close(false);
- if (!closingNotCancelled) {
- return false;
- }
- }
- else {
- nextMapView();
- }
- }
- ResourceController.getResourceController().setProperty("antialiasEdges", (antialiasEdges ? "true" : "false"));
- ResourceController.getResourceController().setProperty("antialiasAll", (antialiasAll ? "true" : "false"));
- return true;
- }
- private boolean antialiasAll = false;
- private boolean antialiasEdges = false;
- private boolean getAntialiasAll() {
- return antialiasAll;
- }
-
- private boolean getAntialiasEdges() {
- return antialiasEdges;
- }
-
- public void setAntialiasAll(final boolean antialiasAll) {
- this.antialiasAll = antialiasAll;
- }
-
- public void setAntialiasEdges(final boolean antialiasEdges) {
- this.antialiasEdges = antialiasEdges;
- }
-
- public Object setEdgesRenderingHint(final Graphics2D g) {
- final Object renderingHint = g.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
- if (getAntialiasEdges()) {
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- }
- else {
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
- }
- return renderingHint;
- }
-
-
- public void setTextRenderingHint(final Graphics2D g) {
- if (getAntialiasAll()) {
- g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
- }
- else {
- g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
- }
- }
- /**
- */
- private void changeAntialias(final String command) {
- if (command == null) {
- return;
- }
- if (command.equals("antialias_none")) {
- setAntialiasEdges(false);
- setAntialiasAll(false);
- }
- if (command.equals("antialias_edges")) {
- setAntialiasEdges(true);
- setAntialiasAll(false);
- }
- if (command.equals("antialias_all")) {
- setAntialiasEdges(true);
- setAntialiasAll(true);
- }
- final Component mapView = getMapViewComponent();
- if (mapView != null) {
- mapView.repaint();
- }
- }
-
-
- public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
- if (propertyName.equals(ViewController.RESOURCE_ANTIALIAS)) {
- changeAntialias(newValue);
- }
- }
- public void setTitle() {
- final ModeController modeController = Controller.getCurrentModeController();
- if (modeController == null) {
- controller.getViewController().setTitle("");
- return;
- }
- final Object[] messageArguments = { TextUtils.getText(("mode_" + modeController.getModeName())) };
- final MessageFormat formatter = new MessageFormat(TextUtils.getText("mode_title"));
- String frameTitle = formatter.format(messageArguments);
- String viewName = "";
- final MapModel model = getModel();
- if (model != null) {
- viewName = getMapViewComponent().getName();
- frameTitle = viewName + (model.isSaved() ? "" : "*") + " - " + frameTitle
- + (model.isReadOnly() ? " (" + TextUtils.getText("read_only") + ")" : "");
- final File file = model.getFile();
- if (file != null) {
- frameTitle += " " + file.getAbsolutePath();
- }
- }
- controller.getViewController().setTitle(frameTitle);
- modeController.getUserInputListenerFactory().updateMapList();
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/MapViewScrollPane.java b/freeplane/src/org/freeplane/view/swing/map/MapViewScrollPane.java
deleted file mode 100644
index 9e9bc25..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/MapViewScrollPane.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Point;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JScrollPane;
-import javax.swing.JViewport;
-import javax.swing.Timer;
-
-import org.freeplane.core.resources.IFreeplanePropertyListener;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.ViewController;
-
-/**
- * @author Dimitry Polivaev
- * 10.01.2009
- */
-public class MapViewScrollPane extends JScrollPane implements IFreeplanePropertyListener {
- @SuppressWarnings("serial")
- static class MapViewPort extends JViewport{
-
- @Override
- public void doLayout() {
- final Component view = getView();
- if(view != null)
- view.invalidate();
- super.doLayout();
- }
-
- private Timer timer;
-
- @Override
- public void setViewPosition(Point p) {
- boolean scrollingToVisible = Boolean.TRUE.equals(getClientProperty(ViewController.SLOW_SCROLLING)) ;
- if(scrollingToVisible){
- putClientProperty(ViewController.SLOW_SCROLLING, null);
- slowSetViewPosition(p);
- }
- else
- super.setViewPosition(p);
- }
-
- @Override
- public void setViewSize(Dimension newSize) {
- Component view = getView();
- if (view != null) {
- Dimension oldSize = view.getSize();
- if (newSize.equals(oldSize)) {
- view.setSize(newSize);
- }
- else
- super.setViewSize(newSize);
- }
- }
-
- private void slowSetViewPosition(final Point p) {
- if(timer != null) {
- timer.stop();
- timer = null;
- }
- final Point viewPosition = getViewPosition();
- int dx = p.x - viewPosition.x;
- int dy = p.y - viewPosition.y;
- int slowDx = calcScrollIncrement(dx);
- int slowDy = calcScrollIncrement(dy);
- viewPosition.translate(slowDx, slowDy);
- super.setViewPosition(viewPosition);
- if(slowDx == dx && slowDy == dy)
- return;
- timer = new Timer(20, new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- timer = null;
- MapViewPort.this.slowSetViewPosition(p);
- }
- });
- timer.setRepeats(false);
- timer.start();
- }
-
- private int calcScrollIncrement(int dx) {
- int v = ResourceController.getResourceController().getIntProperty("scrolling_speed");
- final int slowDX = (int) (v / 5.0 * Math.sqrt(Math.abs(dx)));
- if (Math.abs(dx) > 2 && slowDX < Math.abs(dx)) {
- dx = slowDX * Integer.signum(dx);
- }
- return dx;
- }
- }
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public MapViewScrollPane() {
- super();
- setViewport(new MapViewPort());
- }
-
- @Override
- public void addNotify() {
- super.addNotify();
- setScrollbarsVisiblilty();
- UITools.setScrollbarIncrement(this);
- ResourceController.getResourceController().addPropertyChangeListener(MapViewScrollPane.this);
- }
-
- @Override
- public void removeNotify() {
- super.removeNotify();
- ResourceController.getResourceController().removePropertyChangeListener(MapViewScrollPane.this);
- }
-
- public void propertyChanged(String propertyName, String newValue, String oldValue) {
- if(ViewController.FULLSCREEN_ENABLED_PROPERTY.equals(propertyName)
- || propertyName.startsWith("scrollbarsVisible")){
- setScrollbarsVisiblilty();
- }
- else if (propertyName.equals(UITools.SCROLLBAR_INCREMENT)) {
- final int scrollbarIncrement = Integer.valueOf(newValue);
- getHorizontalScrollBar().setUnitIncrement(scrollbarIncrement);
- getVerticalScrollBar().setUnitIncrement(scrollbarIncrement);
- }
-
- }
-
- private void setScrollbarsVisiblilty() {
- boolean areScrollbarsVisible = Controller.getCurrentController().getViewController().areScrollbarsVisible();
- setHorizontalScrollBarPolicy(areScrollbarsVisible ? JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS : JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- setVerticalScrollBarPolicy(areScrollbarsVisible ? JScrollPane.VERTICAL_SCROLLBAR_ALWAYS : JScrollPane.VERTICAL_SCROLLBAR_NEVER);
- }
-
- @Override
- public void doLayout() {
- if(viewport != null){
- final Component view = viewport.getView();
- if(view != null)
- view.invalidate();
- }
- super.doLayout();
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/NodeTooltip.java b/freeplane/src/org/freeplane/view/swing/map/NodeTooltip.java
deleted file mode 100644
index 013131c..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/NodeTooltip.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package org.freeplane.view.swing.map;
-
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.Insets;
-import java.awt.Rectangle;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseMotionListener;
-import java.net.URI;
-import java.net.URL;
-import java.security.AccessControlException;
-
-import javax.swing.JEditorPane;
-import javax.swing.JScrollPane;
-import javax.swing.JToolTip;
-import javax.swing.text.html.HTMLDocument;
-import javax.swing.text.html.HTMLEditorKit;
-import javax.swing.text.html.StyleSheet;
-
-import org.freeplane.core.ui.MouseInsideListener;
-import org.freeplane.core.ui.components.JRestrictedSizeScrollPane;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.ui.components.html.ScaledEditorKit;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.url.UrlManager;
-
- at SuppressWarnings("serial")
-public class NodeTooltip extends JToolTip {
- class LinkMouseListener extends MouseAdapter implements MouseMotionListener{
- public void mouseMoved(final MouseEvent ev) {
- final String link = HtmlUtils.getURLOfExistingLink((HTMLDocument) tip.getDocument(), tip.viewToModel(ev.getPoint()));
- boolean followLink = link != null;
- Controller currentController = Controller.getCurrentController();
- final int requiredCursor;
- if(followLink){
- currentController.getViewController().out(link);
- requiredCursor = Cursor.HAND_CURSOR;
- }
- else{
- requiredCursor = Cursor.DEFAULT_CURSOR;
- }
- if (tip.getCursor().getType() != requiredCursor) {
- tip.setCursor(requiredCursor != Cursor.DEFAULT_CURSOR ? new Cursor(requiredCursor) : null);
- }
- }
-
- public void mouseClicked(final MouseEvent ev) {
- if (Compat.isPlainEvent(ev)) {
- final String linkURL = HtmlUtils.getURLOfExistingLink((HTMLDocument) tip.getDocument(), tip.viewToModel(ev.getPoint()));
- if (linkURL != null) {
- try {
- UrlManager.getController().loadURL(new URI(linkURL));
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- }
- }
- }
-
- public void mouseDragged(MouseEvent e) {
- }
- }
-
- final private JEditorPane tip;
-
- public NodeTooltip(){
- tip = new JEditorPane();
- tip.setContentType("text/html");
- tip.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, false);
- final HTMLEditorKit kit = ScaledEditorKit.create();
- tip.setEditorKit(kit);
- tip.setEditable(false);
- tip.setMargin(new Insets(0, 0, 0, 0));
- final LinkMouseListener linkMouseListener = new LinkMouseListener();
- tip.addMouseListener(linkMouseListener);
- tip.addMouseMotionListener(linkMouseListener);
- final HTMLDocument document = (HTMLDocument) tip.getDocument();
- final StyleSheet styleSheet = document.getStyleSheet();
- styleSheet.removeStyle("p");
- styleSheet.removeStyle("body");
- styleSheet.addRule("p {margin-top:0;}\n");
-
- final JRestrictedSizeScrollPane scrollPane = new JRestrictedSizeScrollPane(tip);
- scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
- scrollPane.setMaximumSize(new Dimension(Integer.MAX_VALUE, maximumWidth / 2));
- scrollPane.addComponentListener(new ComponentAdapter() {
- @Override
- public void componentResized(ComponentEvent e) {
- revalidate();
- }
- });
- UITools.setScrollbarIncrement(scrollPane);
- add(scrollPane);
- tip.setOpaque(false);
-// scrollPane.setOpaque(false);
-// scrollPane.getViewport().setOpaque(false);
- }
-
- private static int maximumWidth = Integer.MAX_VALUE;
- /**
- * set maximum width
- * 0 = no maximum width
- */
- public static void setMaximumWidth(final int width) {
- maximumWidth = width;
- }
-
- @Override
- public void setTipText(String tipText) {
- try{
- setTipTextUnsafe(tipText);
- }
- catch (Exception e1) {
- if(e1 instanceof AccessControlException)
- LogUtils.warn(e1.getMessage());
- else
- LogUtils.severe(e1);
- final String localizedMessage = e1.getLocalizedMessage();
- final String htmlEscapedText = HtmlUtils.plainToHTML(localizedMessage + '\n' + tipText);
- try{
- setTipTextUnsafe(htmlEscapedText);
- }
- catch (Exception e2){
- }
- }
- }
-
- private void setTipTextUnsafe(String tipText) throws Exception{
- tip.setSize(0, 0);
- tip.setPreferredSize(null);
- tip.setText(tipText);
- Dimension preferredSize = tip.getPreferredSize();
- if (preferredSize.width < maximumWidth) {
- tip.setPreferredSize(preferredSize);
- return ;
- }
- final HTMLDocument document = (HTMLDocument) tip.getDocument();
- document.getStyleSheet().addRule("body { width: " + maximumWidth + "}");
- // bad hack: call "setEditable" only to update view
- tip.setEditable(true);
- tip.setEditable(false);
- tip.setPreferredSize(tip.getPreferredSize());
- }
-
- @Override
- public Dimension getPreferredSize() {
- final Component scrollPane = getComponent(0);
- return scrollPane.getPreferredSize();
- }
-
- @Override
- public void layout() {
- final Component scrollPane = getComponent(0);
- scrollPane.setSize(getPreferredSize());
- super.layout();
- }
-
- void scrollUp() {
- tip.scrollRectToVisible(new Rectangle(1, 1));
- }
-
- public void setBase(URL url){
- ((HTMLDocument)tip.getDocument()).setBase(url);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/NodeTooltipManager.java b/freeplane/src/org/freeplane/view/swing/map/NodeTooltipManager.java
deleted file mode 100644
index 97198b5..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/NodeTooltipManager.java
+++ /dev/null
@@ -1,336 +0,0 @@
-package org.freeplane.view.swing.map;
-
-
-import java.awt.Component;
-import java.awt.GridLayout;
-import java.awt.KeyboardFocusManager;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseMotionListener;
-import java.lang.ref.WeakReference;
-
-import javax.swing.FocusManager;
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JPopupMenu;
-import javax.swing.JToolTip;
-import javax.swing.SwingUtilities;
-import javax.swing.Timer;
-import javax.swing.UIManager;
-import javax.swing.text.JTextComponent;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.IFreeplanePropertyListener;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MouseInsideListener;
-import org.freeplane.features.map.AMapChangeListenerAdapter;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-public class NodeTooltipManager implements IExtension{
- private static final String TOOL_TIP_MANAGER = "toolTipManager.";
- private static final String TOOL_TIP_MANAGER_INITIAL_DELAY = "toolTipManager.initialDelay";
- private static final String RESOURCES_SHOW_NODE_TOOLTIPS = "show_node_tooltips";
- private final Timer enterTimer;
- private final Timer exitTimer;
- private String toolTipText;
- private JComponent insideComponent;
- private MouseEvent mouseEvent;
-
- private JPopupMenu tipPopup;
- /** The Window tip is being displayed in. This will be non-null if
- * the Window tip is in differs from that of insideComponent's Window.
- */
- private JToolTip tip;
- final private ComponentMouseListener componentMouseListener;
- private WeakReference<Component> focusOwnerRef;
- private boolean mouseOverComponent;
- private MouseInsideListener mouseInsideTooltipListener;
-
- public static NodeTooltipManager getSharedInstance(ModeController modeController){
- {
- final NodeTooltipManager instance = modeController.getExtension(NodeTooltipManager.class);
- if(instance != null){
- return instance;
- }
- }
- final NodeTooltipManager instance = new NodeTooltipManager();
- final int maxWidth = ResourceController.getResourceController().getIntProperty(
- "toolTipManager.max_tooltip_width", Integer.MAX_VALUE);
- NodeTooltip.setMaximumWidth(maxWidth);
- setTooltipDelays(instance);
- UIManager.put("PopupMenu.consumeEventOnClose", Boolean.FALSE);
- ResourceController.getResourceController().addPropertyChangeListener(new IFreeplanePropertyListener() {
- public void propertyChanged(final String propertyName, final String newValue, final String oldValue) {
- if (propertyName.startsWith(TOOL_TIP_MANAGER)) {
- setTooltipDelays(instance);
- }
- }
- });
- IMapChangeListener mapChangeListener = new AMapChangeListenerAdapter() {
-
- @Override
- public void onNodeDeleted(NodeModel parent, NodeModel child, int index) {
- instance.hideTipWindow();
- }
-
- @Override
- public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
- instance.hideTipWindow();
- }
-
- @Override
- public void onNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child,
- int newIndex) {
- instance.hideTipWindow();
- }
-
- };
- MapController mapController = modeController.getMapController();
- mapController.addMapChangeListener(mapChangeListener);
- INodeSelectionListener nodeSelectionListener = new INodeSelectionListener() {
-
- public void onSelect(NodeModel node) {
- NodeView view = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, instance.insideComponent);
- if(view != null && node.equals(view.getModel()))
- return;
- instance.hideTipWindow();
- }
-
- public void onDeselect(NodeModel node) {
- }
- };
- mapController.addNodeSelectionListener(nodeSelectionListener);
- modeController.addExtension(NodeTooltipManager.class, instance);
- return instance;
- }
- private static void setTooltipDelays(NodeTooltipManager instance) {
- final int initialDelay = ResourceController.getResourceController().getIntProperty(
- TOOL_TIP_MANAGER_INITIAL_DELAY, 0);
- instance.setInitialDelay(initialDelay);
- }
- private NodeTooltipManager() {
- enterTimer = new Timer(750, new insideTimerAction());
- enterTimer.setRepeats(false);
- exitTimer = new Timer(150, new exitTimerAction());
- exitTimer.setRepeats(false);
- componentMouseListener = new ComponentMouseListener();
- mouseOverComponent = false;
- }
-
- /**
- * Specifies the initial delay value.
- *
- * @param milliseconds the number of milliseconds to delay
- * (after the cursor has paused) before displaying the
- * tooltip
- * @see #getInitialDelay
- */
- public void setInitialDelay(int milliseconds) {
- enterTimer.setInitialDelay(milliseconds);
- }
-
- /**
- * Returns the initial delay value.
- *
- * @return an integer representing the initial delay value,
- * in milliseconds
- * @see #setInitialDelay
- */
- public int getInitialDelay() {
- return enterTimer.getInitialDelay();
- }
-
-
- private void showTipWindow() {
- Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
- if (insideComponent == null || !insideComponent.isShowing() || focusOwner == null)
- return;
- tip = insideComponent.createToolTip();
- tip.addComponentListener(new ComponentAdapter() {
-
- @Override
- public void componentResized(ComponentEvent e) {
- final NodeTooltip component = (NodeTooltip) e.getComponent();
- component.scrollUp();
- component.removeComponentListener(this);
- }
-
- });
-
- tip.setTipText(toolTipText);
- final JComponent nearComponent = insideComponent;
- focusOwnerRef = new WeakReference<Component>(focusOwner);
- tipPopup = new JPopupMenu();
- tipPopup.setLayout(new GridLayout(1, 1));
- tipPopup.add(tip);
- mouseInsideTooltipListener = new MouseInsideListener(tipPopup);
- tipPopup.show(nearComponent, 0, nearComponent.getHeight());
- focusOwner.requestFocusInWindow();
- exitTimer.start();
- }
-
- private void hideTipWindow() {
- insideComponent = null;
- toolTipText = null;
- mouseEvent = null;
- if (tipPopup != null && tip != null) {
- final Component component;
- final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
- if(focusOwner != null && SwingUtilities.isDescendingFrom(focusOwner, tip)){
- component = focusOwnerRef.get();
- }
- else
- component = null;
- tipPopup.setVisible(false);
- if(component != null)
- component.requestFocusInWindow();
- tipPopup = null;
- mouseInsideTooltipListener = null;
- tip = null;
- focusOwnerRef = null;
- enterTimer.stop();
- exitTimer.stop();
- }
- }
-
- /**
- * Registers a component for tooltip management.
- * <p>
- * This will register key bindings to show and hide the tooltip text
- * only if <code>component</code> has focus bindings. This is done
- * so that components that are not normally focus traversable, such
- * as <code>JLabel</code>, are not made focus traversable as a result
- * of invoking this method.
- *
- * @param component a <code>JComponent</code> object to add
- * @see JComponent#isFocusTraversable
- */
- public void registerComponent(JComponent component) {
- component.removeMouseListener(componentMouseListener);
- component.removeMouseMotionListener(componentMouseListener);
- component.addMouseListener(componentMouseListener);
- component.addMouseMotionListener(componentMouseListener);
- }
-
- /**
- * Removes a component from tooltip control.
- *
- * @param component a <code>JComponent</code> object to remove
- */
- public void unregisterComponent(JComponent component) {
- component.removeMouseListener(componentMouseListener);
- }
-
-
- private class ComponentMouseListener extends MouseAdapter implements MouseMotionListener{
-
- @Override
- public void mouseEntered(MouseEvent event) {
- initiateToolTip(event);
- }
- @Override
- public void mouseMoved(MouseEvent event) {
- initiateToolTip(event);
- }
- @Override
- public void mouseExited(MouseEvent event) {
- if(insideComponent == event.getComponent())
- mouseOverComponent = false;
- }
-
- @Override
- public void mouseDragged(MouseEvent e) {
- }
- @Override
- public void mousePressed(MouseEvent e) {
- hideTipWindow();
- }
- }
-
- private void initiateToolTip(MouseEvent event) {
- JComponent component = (JComponent) event.getSource();
- Window focusedWindow = FocusManager.getCurrentManager().getFocusedWindow();
- if (focusedWindow == null) {
- return;
- }
- if(insideComponent == component){
- mouseOverComponent = true;
- return;
- }
- hideTipWindow();
- insideComponent = component;
- mouseEvent = event;
- if(ResourceController.getResourceController().getBooleanProperty(RESOURCES_SHOW_NODE_TOOLTIPS))
- enterTimer.restart();
- }
-
- protected boolean isMouseOverComponent() {
- return mouseOverComponent;
- }
-
-
- private class insideTimerAction implements ActionListener {
- public void actionPerformed(ActionEvent e) {
- if (insideComponent != null){
- if (isMouseOverComponent() && !editorActive()) {
- // Lazy lookup
- if (toolTipText == null && mouseEvent != null) {
- toolTipText = insideComponent.getToolTipText(mouseEvent);
- }
- if (toolTipText != null) {
- showTipWindow();
- return;
- }
- }
- hideTipWindow();
- }
- }
-
- private boolean editorActive() {
- return KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() instanceof JTextComponent;
- }
- }
-
- private class exitTimerAction implements ActionListener {
- public void actionPerformed(ActionEvent e) {
- if(tip == null || insideComponent == null){
- return;
- }
- final KeyboardFocusManager currentKeyboardFocusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
- final Window activeWindow = currentKeyboardFocusManager.getActiveWindow();
- if(activeWindow instanceof JDialog && ((JDialog) activeWindow).isModal()
- && ! SwingUtilities.isDescendingFrom(Controller.getCurrentController().getMapViewManager().getMapViewComponent(), activeWindow)){
- hideTipWindow();
- return;
- }
-
- if(isMouseOverTip() || isMouseOverComponent()){
- exitTimer.restart();
- return;
- }
- final Component focusOwner = currentKeyboardFocusManager.getFocusOwner();
- if(focusOwner != null){
- if(SwingUtilities.isDescendingFrom(focusOwner, tip)){
- exitTimer.restart();
- return;
- }
- }
- hideTipWindow();
- }
-
- protected boolean isMouseOverTip() {
- return mouseInsideTooltipListener.isMouseInside();
- }
- }
-
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/NodeView.java b/freeplane/src/org/freeplane/view/swing/map/NodeView.java
deleted file mode 100644
index 6130f9b..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/NodeView.java
+++ /dev/null
@@ -1,1512 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.Stroke;
-import java.awt.Window;
-import java.awt.dnd.DnDConstants;
-import java.awt.dnd.DragGestureListener;
-import java.awt.dnd.DragSource;
-import java.awt.dnd.DropTarget;
-import java.awt.dnd.DropTargetListener;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowFocusListener;
-import java.util.LinkedList;
-import java.util.ListIterator;
-
-import javax.swing.JComponent;
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.IUserInputListenerFactory;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.cloud.CloudController;
-import org.freeplane.features.cloud.CloudModel;
-import org.freeplane.features.edge.EdgeController;
-import org.freeplane.features.edge.EdgeStyle;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.icon.HierarchicalIcons;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.HideChildSubtree;
-import org.freeplane.features.map.HistoryInformationModel;
-import org.freeplane.features.map.INodeView;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.NodeModel.NodeChangeType;
-import org.freeplane.features.map.SummaryNode;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodelocation.LocationModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.features.styles.MapViewLayout;
-import org.freeplane.features.text.ShortenedTextModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.view.swing.map.attribute.AttributeView;
-import org.freeplane.view.swing.map.cloud.CloudView;
-import org.freeplane.view.swing.map.cloud.CloudViewFactory;
-import org.freeplane.view.swing.map.edge.EdgeView;
-import org.freeplane.view.swing.map.edge.EdgeViewFactory;
-
-/**
- * This class represents a single Node of a MindMap (in analogy to
- * TreeCellRenderer).
- */
-public class NodeView extends JComponent implements INodeView {
- final static int ALIGN_BOTTOM = -1;
- final static int ALIGN_CENTER = 0;
- final static int ALIGN_TOP = 1;
- protected final static Color dragColor = Color.lightGray;
- public final static int DRAGGED_OVER_NO = 0;
- public final static int DRAGGED_OVER_SIBLING = 2;
- public final static int DRAGGED_OVER_SON = 1;
- /** For RootNodeView. */
- public final static int DRAGGED_OVER_SON_LEFT = 3;
- static private int FOLDING_SYMBOL_WIDTH = -1;
- private static final long serialVersionUID = 1L;
- public final static int SHIFT = -2;
- static final int SPACE_AROUND = 50;
- public static final int MAIN_VIEWER_POSITION = 1;
- public static final int NOTE_VIEWER_POSITION = 10;
- final static boolean PAINT_DEBUG_BORDER;
- static{
- boolean paintDebugBorder = false;
- try{
- paintDebugBorder = Boolean.getBoolean("org.freeplane.view.swing.map.NodeView.PAINT_DEBUG_BORDER");
- }
- catch(Exception e){
- }
- PAINT_DEBUG_BORDER = paintDebugBorder;
- };
- static private int maxToolTipWidth;
- private AttributeView attributeView;
- private JComponent contentPane;
- private MainView mainView;
- private final MapView map;
- private NodeModel model;
- private NodeView preferredChild;
- private EdgeStyle edgeStyle = EdgeStyle.EDGESTYLE_HIDDEN;
- private Integer edgeWidth = 1;
- private Color edgeColor = Color.BLACK;
- private Color modelBackgroundColor;
-
- private int topOverlap;
- private int bottomOverlap;
-
- public static final int DETAIL_VIEWER_POSITION = 2;
-
- protected NodeView(final NodeModel model, final MapView map, final Container parent) {
- setFocusCycleRoot(true);
- this.model = model;
- this.map = map;
- }
-
- void addDragListener(final DragGestureListener dgl) {
- if (dgl == null) {
- return;
- }
- final DragSource dragSource = DragSource.getDefaultDragSource();
- dragSource.createDefaultDragGestureRecognizer(getMainView(), DnDConstants.ACTION_COPY
- | DnDConstants.ACTION_MOVE | DnDConstants.ACTION_LINK, dgl);
- }
-
- void addDropListener(final DropTargetListener dtl) {
- if (dtl == null) {
- return;
- }
- final DropTarget dropTarget = new DropTarget(getMainView(), dtl);
- dropTarget.setActive(true);
- }
-
- private int calcShiftY(final LocationModel locationModel) {
- try {
- final NodeModel parent = model.getParentNode();
- return locationModel.getShiftY() + (getMap().getModeController().hasOneVisibleChild(parent) ? SHIFT : 0);
- }
- catch (final NullPointerException e) {
- return 0;
- }
- }
-
- public static int ADDITIONAL_MOUSE_SENSITIVE_AREA = 50;
- @Override
- public boolean contains(final int x, final int y) {
- final int space = getMap().getZoomed(NodeView.SPACE_AROUND);
- final int reducedSpace = space - ADDITIONAL_MOUSE_SENSITIVE_AREA;
- if (x >= reducedSpace && x < getWidth() - reducedSpace && y >= reducedSpace && y < getHeight() - reducedSpace){
- for(int i = getComponentCount()-1; i >= 0; i--){
- final Component comp = getComponent(i);
- if(comp.isVisible() && comp.contains(x-comp.getX(), y-comp.getY()))
- return true;
- }
- }
- return false;
- }
-
- protected void convertPointToMap(final Point p) {
- UITools.convertPointToAncestor(this, p, getMap());
- }
-
- public void createAttributeView() {
- if (attributeView == null && NodeAttributeTableModel.getModel(model).getNode() != null) {
- attributeView = new AttributeView(this, true);
- }
- syncronizeAttributeView();
- }
-
- public boolean focused() {
- return mainView.hasFocus();
- }
-
- /**
- */
- public AttributeView getAttributeView() {
- if (attributeView == null) {
- AttributeController.getController(getMap().getModeController()).createAttributeTableModel(model);
- attributeView = new AttributeView(this, true);
- }
- return attributeView;
- }
-
- public Color getBackgroundColor() {
- final Color cloudColor = getCloudColor();
- if (cloudColor != null) {
- return cloudColor;
- }
- if (isRoot()) {
- return getMap().getBackground();
- }
- return getParentView().getBackgroundColor();
- }
-
- public Color getCloudColor() {
- final CloudModel cloudModel = getCloudModel();
- if(cloudModel != null){
- final Color cloudColor = cloudModel.getColor();
- return cloudColor;
- }
- return null;
- }
-
- /**
- * This method returns the NodeViews that are children of this node.
- */
- public LinkedList<NodeView> getChildrenViews() {
- final LinkedList<NodeView> childrenViews = new LinkedList<NodeView>();
- final Component[] components = getComponents();
- for (int i = 0; i < components.length; i++) {
- if (!(components[i] instanceof NodeView)) {
- continue;
- }
- final NodeView view = (NodeView) components[i];
- childrenViews.add(view);
- }
- return childrenViews;
- }
-
- public JComponent getContent() {
- final JComponent c = contentPane == null ? mainView : contentPane;
- assert (c == null || c.getParent() == this);
- return c;
- }
-
- private Container getContentPane() {
- if (contentPane == null) {
- Window windowAncestor = SwingUtilities.getWindowAncestor(mainView);
- boolean hasFocus = windowAncestor != null && windowAncestor.getMostRecentFocusOwner() == mainView;
- contentPane = NodeViewFactory.getInstance().newContentPane(this);
- final int index = getComponentCount() - 1;
- remove(index);
- contentPane.add(mainView);
- mainView.putClientProperty("NODE_VIEW_CONTENT_POSITION", MAIN_VIEWER_POSITION);
- if(! mainView.isVisible())
- mainView.setVisible(true);
- add(contentPane, index);
- if(hasFocus)
- restoreFocusToMainView();
- }
- return contentPane;
- }
-
- private void restoreFocusToMainView() {
- final Window windowAncestor = SwingUtilities.getWindowAncestor(mainView);
- if(windowAncestor.isFocused())
- mainView.requestFocusInWindow();
- else
- windowAncestor.addWindowFocusListener(new WindowFocusListener() {
- public void windowLostFocus(WindowEvent e) {
- }
-
- public void windowGainedFocus(WindowEvent e) {
- mainView.requestFocusInWindow();
- windowAncestor.removeWindowFocusListener(this);
- }
- });
- }
-
- /**
- * Returns the coordinates occupied by the node and its children as a vector
- * of four point per node.
- */
- public void getCoordinates(final LinkedList<Point> inList) {
- getCoordinates(inList, 0, false, 0, 0);
- }
-
- private void getCoordinates(final LinkedList<Point> inList, int additionalDistanceForConvexHull,
- final boolean byChildren, final int transX, final int transY) {
- if (!isVisible()) {
- return;
- }
- if (isContentVisible()) {
- if (byChildren) {
- final ModeController modeController = getMap().getModeController();
- final CloudController cloudController = CloudController.getController(modeController);
- final CloudModel cloud = cloudController.getCloud(getModel());
- if (cloud != null) {
- additionalDistanceForConvexHull += CloudView.getAdditionalHeigth(cloud, this) / 5;
- }
- }
- final int x = transX + getContent().getX() - getDeltaX();
- final int y = transY + getContent().getY() - getDeltaY();
- final int width = mainView.getMainViewWidthWithFoldingMark();
- final int heightWithFoldingMark = mainView.getMainViewHeightWithFoldingMark();
- final int height = Math.max(heightWithFoldingMark, getContent().getHeight());
- inList.addLast(new Point(-additionalDistanceForConvexHull + x, -additionalDistanceForConvexHull + y));
- inList
- .addLast(new Point(-additionalDistanceForConvexHull + x, additionalDistanceForConvexHull + y + height));
- inList.addLast(new Point(additionalDistanceForConvexHull + x + width, additionalDistanceForConvexHull + y
- + height));
- inList
- .addLast(new Point(additionalDistanceForConvexHull + x + width, -additionalDistanceForConvexHull + y));
- }
- for (final NodeView child : getChildrenViews()) {
- child.getCoordinates(inList, additionalDistanceForConvexHull, true, transX + child.getX(),
- transY + child.getY());
- }
- }
-
- /** get x coordinate including folding symbol */
- public int getDeltaX() {
- return mainView.getDeltaX();
- }
-
- /** get y coordinate including folding symbol */
- public int getDeltaY() {
- return mainView.getDeltaY();
- }
-
- /**
- * @param startAfter
- */
- NodeView getFirst(Component startAfter, final boolean leftOnly, final boolean rightOnly) {
- final Component[] components = getComponents();
- for (int i = 0; i < components.length; i++) {
- if (startAfter != null) {
- if (components[i] == startAfter) {
- startAfter = null;
- }
- continue;
- }
- if (!(components[i] instanceof NodeView)) {
- continue;
- }
- final NodeView view = (NodeView) components[i];
- if (leftOnly && !view.isLeft() || rightOnly && view.isLeft()) {
- continue;
- }
- if (view.isContentVisible()) {
- return view;
- }
- final NodeView child = view.getFirst(null, leftOnly, rightOnly);
- if (child != null) {
- return child;
- }
- }
- return null;
- }
-
- public int getHGap() {
- return map.getZoomed(LocationModel.getModel(model).getHGap());
- }
-
- private NodeView getLast(Component startBefore, final boolean leftOnly, final boolean rightOnly) {
- final Component[] components = getComponents();
- for (int i = components.length - 1; i >= 0; i--) {
- if (startBefore != null) {
- if (components[i] == startBefore) {
- startBefore = null;
- }
- continue;
- }
- if (!(components[i] instanceof NodeView)) {
- continue;
- }
- final NodeView view = (NodeView) components[i];
- if (leftOnly && !view.isLeft() || rightOnly && view.isLeft()) {
- continue;
- }
- if (view.isContentVisible()) {
- return view;
- }
- final NodeView child = view.getLast(null, leftOnly, rightOnly);
- if (child != null) {
- return child;
- }
- }
- return null;
- }
-
- LinkedList<NodeView> getLeft(final boolean onlyVisible) {
- final LinkedList<NodeView> left = new LinkedList<NodeView>();
- for (final NodeView node : getChildrenViews()) {
- if (node == null) {
- continue;
- }
- if (node.isLeft()) {
- left.add(node);
- }
- }
- return left;
- }
-
- /**
- * Returns the Point where the Links should arrive the Node.
- */
- public Point getLinkPoint(final Point declination) {
- int x, y;
- Point linkPoint;
- if (declination != null) {
- x = getMap().getZoomed(declination.x);
- y = getMap().getZoomed(declination.y);
- }
- else {
- x = 1;
- y = 0;
- }
- if (isLeft()) {
- x = -x;
- }
- if (y != 0) {
- final double ctgRect = Math.abs((double) getContent().getWidth() / getContent().getHeight());
- final double ctgLine = Math.abs((double) x / y);
- int absLinkX, absLinkY;
- if (ctgRect > ctgLine) {
- absLinkX = Math.abs(x * getContent().getHeight() / (2 * y));
- absLinkY = getContent().getHeight() / 2;
- }
- else {
- absLinkX = getContent().getWidth() / 2;
- absLinkY = Math.abs(y * getContent().getWidth() / (2 * x));
- }
- linkPoint = new Point(getContent().getWidth() / 2 + (x > 0 ? absLinkX : -absLinkX), getContent()
- .getHeight() / 2 + (y > 0 ? absLinkY : -absLinkY));
- }
- else {
- linkPoint = new Point((x > 0 ? getContent().getWidth() : 0), (getContent().getHeight() / 2));
- }
- linkPoint.translate(getContent().getX(), getContent().getY());
- convertPointToMap(linkPoint);
- return linkPoint;
- }
-
- public MainView getMainView() {
- return mainView;
- }
-
- public Point getMainViewConnectorPoint(NodeView target) {
- final Point relativeLocation = getRelativeLocation(target);
- relativeLocation.x += target.getMainView().getWidth()/2;
- relativeLocation.y += target.getMainView().getHeight()/2;
- return mainView.getConnectorPoint(relativeLocation);
- }
-
- public Point getRelativeLocation(NodeView target) {
- Component component;
- int targetX = 0;
- int targetY = 0;
- for(component = target.getMainView();
- !(this.equals(component) || component.getClass().equals(MapView.class));
- component = component.getParent()){
- targetX += component.getX();
- targetY += component.getY();
- }
- Point relativeLocation = new Point();
- UITools.convertPointToAncestor(mainView, relativeLocation, component);
- relativeLocation.x = targetX - relativeLocation.x;
- relativeLocation.y = targetY - relativeLocation.y;
- return relativeLocation;
- }
-
- public MapView getMap() {
- return map;
- }
-
- public int getMaxToolTipWidth() {
- if (maxToolTipWidth == 0) {
- try {
- maxToolTipWidth = ResourceController.getResourceController().getIntProperty(
- "toolTipManager.max_tooltip_width", 600);
- }
- catch (final NumberFormatException e) {
- maxToolTipWidth = 600;
- }
- }
- return maxToolTipWidth;
- }
-
- public NodeModel getModel() {
- return model;
- }
-
- protected NodeView getNextSiblingSingle() {
- LinkedList<NodeView> v = null;
- if (getParentView().getModel().isRoot()) {
- if (this.isLeft()) {
- v = (getParentView()).getLeft(true);
- }
- else {
- v = (getParentView()).getRight(true);
- }
- }
- else {
- v = getParentView().getChildrenViews();
- }
- final int index = v.indexOf(this);
- for (int i = index + 1; i < v.size(); i++) {
- final NodeView nextView = v.get(i);
- if (nextView.isContentVisible()) {
- return nextView;
- }
- else {
- final NodeView first = nextView.getFirst(null, false, false);
- if (first != null) {
- return first;
- }
- }
- }
- return this;
- }
-
- protected NodeView getNextVisibleSibling() {
- NodeView sibling;
- NodeView lastSibling = this;
- for (sibling = this; !sibling.getModel().isRoot(); sibling = sibling.getParentView()) {
- lastSibling = sibling;
- sibling = sibling.getNextSiblingSingle();
- if (sibling != lastSibling) {
- break;
- }
- }
- while (sibling.getModel().getNodeLevel(false) < getMap().getSiblingMaxLevel()) {
- final NodeView first = sibling.getFirst(sibling.isRoot() ? lastSibling : null, this.isLeft(),
- !this.isLeft());
- if (first == null) {
- break;
- }
- sibling = first;
- }
- if (sibling.isRoot()) {
- return this;
- }
- return sibling;
- }
-
- public NodeView getParentView() {
- final Container parent = getParent();
- if (parent instanceof NodeView) {
- return (NodeView) parent;
- }
- return null;
- }
-
- public NodeView getPreferredVisibleChild(final boolean getUpper, final boolean left) {
- if (getModel().isLeaf()) {
- return null;
- }
- if (getUpper) {
- preferredChild = null;
- }
- if (preferredChild != null && (left == preferredChild.isLeft()) && preferredChild.getParent() == this) {
- if (preferredChild.isContentVisible()) {
- return preferredChild;
- }
- else {
- final NodeView newSelected = preferredChild.getPreferredVisibleChild(getUpper, left);
- if (newSelected != null) {
- return newSelected;
- }
- }
- }
- int yGap = Integer.MAX_VALUE;
- final NodeView baseComponent;
- if (isContentVisible()) {
- baseComponent = this;
- }
- else {
- baseComponent = getVisibleParentView();
- }
- final int ownX = baseComponent.getContent().getX() + baseComponent.getContent().getWidth() / 2;
- final int ownY = baseComponent.getContent().getY() + baseComponent.getContent().getHeight() / 2;
- NodeView newSelected = null;
- for (int i = 0; i < getComponentCount(); i++) {
- final Component c = getComponent(i);
- if (!(c instanceof NodeView)) {
- continue;
- }
- NodeView childView = (NodeView) c;
- if (!(childView.isLeft() == left)) {
- continue;
- }
- if (!childView.isContentVisible()) {
- childView = childView.getPreferredVisibleChild(getUpper, left);
- if (childView == null) {
- continue;
- }
- }
- if (getUpper) {
- return childView;
- }
- final JComponent childContent = childView.getContent();
- if(childContent == null)
- continue;
- final Point childPoint = new Point(left ? childContent.getWidth() : 0, childContent.getHeight() / 2);
- UITools.convertPointToAncestor(childContent, childPoint, baseComponent);
- final int dy = childPoint.y - ownY;
- final int dx = childPoint.x - ownX;
- final int gapToChild = dy*dy + dx*dx;
- if (gapToChild < yGap) {
- newSelected = childView;
- preferredChild = (NodeView) c;
- yGap = gapToChild;
- }
- else {
- break;
- }
- }
- return newSelected;
- }
-
- protected NodeView getPreviousSiblingSingle() {
- LinkedList<NodeView> v = null;
- if (getParentView().getModel().isRoot()) {
- if (this.isLeft()) {
- v = (getParentView()).getLeft(true);
- }
- else {
- v = (getParentView()).getRight(true);
- }
- }
- else {
- v = getParentView().getChildrenViews();
- }
- final int index = v.indexOf(this);
- for (int i = index - 1; i >= 0; i--) {
- final NodeView nextView = v.get(i);
- if (nextView.isContentVisible()) {
- return nextView;
- }
- else {
- final NodeView last = nextView.getLast(null, false, false);
- if (last != null) {
- return last;
- }
- }
- }
- return this;
- }
-
- protected NodeView getPreviousVisibleSibling() {
- NodeView sibling;
- NodeView previousSibling = this;
- for (sibling = this; !sibling.getModel().isRoot(); sibling = sibling.getParentView()) {
- previousSibling = sibling;
- sibling = sibling.getPreviousSiblingSingle();
- if (sibling != previousSibling) {
- break;
- }
- }
- while (sibling.getModel().getNodeLevel(false) < getMap().getSiblingMaxLevel()) {
- final NodeView last = sibling.getLast(sibling.isRoot() ? previousSibling : null, this.isLeft(),
- !this.isLeft());
- if (last == null) {
- break;
- }
- sibling = last;
- }
- if (sibling.isRoot()) {
- return this;
- }
- return sibling;
- }
-
- LinkedList<NodeView> getRight(final boolean onlyVisible) {
- final LinkedList<NodeView> right = new LinkedList<NodeView>();
- for (final NodeView node : getChildrenViews()) {
- if (node == null) {
- continue;
- }
- if (!node.isLeft()) {
- right.add(node);
- }
- }
- return right;
- }
-
- /**
- * @return returns the color that should used to select the node.
- */
- public Color getSelectedColor() {
- return MapView.standardSelectColor;
- }
-
- /**
- * @return Returns the sHIFT.s
- */
- public int getShift() {
- final LocationModel locationModel = LocationModel.getModel(model);
- return map.getZoomed(calcShiftY(locationModel));
- }
-
- protected LinkedList<NodeView> getSiblingViews() {
- return getParentView().getChildrenViews();
- }
-
- public Color getTextBackground() {
- if (modelBackgroundColor != null) {
- return modelBackgroundColor;
- }
- return getBackgroundColor();
- }
-
- public Color getTextColor() {
- final Color color = NodeStyleController.getController(getMap().getModeController()).getColor(model);
- return color;
- }
-
- /**
- * @return Returns the VGAP.
- */
- public int getVGap() {
- return map.getZoomed(LocationModel.getModel(model).getVGap());
- }
-
- public NodeView getVisibleParentView() {
- final Container parent = getParent();
- if (!(parent instanceof NodeView)) {
- return null;
- }
- final NodeView parentView = (NodeView) parent;
- if (parentView.isContentVisible()) {
- return parentView;
- }
- return parentView.getVisibleParentView();
- }
-
- public int getZoomedFoldingSymbolHalfWidth() {
- if (NodeView.FOLDING_SYMBOL_WIDTH == -1) {
- NodeView.FOLDING_SYMBOL_WIDTH = ResourceController.getResourceController().getIntProperty(
- "foldingsymbolwidth", 8);
- }
- final int preferredFoldingSymbolHalfWidth = (int) ((NodeView.FOLDING_SYMBOL_WIDTH * map.getZoom()) / 2);
- return preferredFoldingSymbolHalfWidth;
- }
-
- void addChildViews() {
- int index = 0;
- for (NodeModel child : getMap().getModeController().getMapController().childrenFolded(getModel())) {
- if(child.containsExtension(HideChildSubtree.class))
- return;
- if(getComponentCount() <= index
- || ! (getComponent(index) instanceof NodeView))
- addChildView(child, index++);
- }
- }
-
- /**
- * Create views for the newNode and all his descendants, set their isLeft
- * attribute according to this view.
- * @param index2
- */
- void addChildView(final NodeModel newNode, int index) {
- NodeViewFactory.getInstance().newNodeView(newNode, getMap(), this, index);
- }
-
- /* fc, 25.1.2004: Refactoring necessary: should call the model. */
- public boolean isChildOf(final NodeView myNodeView) {
- return getParentView() == myNodeView;
- }
-
- /**
- */
- public boolean isContentVisible() {
- return getModel().isVisible();
- }
-
- public boolean isLeft() {
- if (getMap().getLayoutType() == MapViewLayout.OUTLINE) {
- return false;
- }
- return getModel().isLeft();
- }
-
- public boolean isParentHidden() {
- final Container parent = getParent();
- if (!(parent instanceof NodeView)) {
- return false;
- }
- final NodeView parentView = (NodeView) parent;
- return !parentView.isContentVisible();
- }
-
- /* fc, 25.1.2004: Refactoring necessary: should call the model. */
- public boolean isParentOf(final NodeView myNodeView) {
- return (this == myNodeView.getParentView());
- }
-
- public boolean isRoot() {
- return getModel().isRoot();
- }
-
- public boolean isSelected() {
- return (getMap().isSelected(this));
- }
-
- /* fc, 25.1.2004: Refactoring necessary: should call the model. */
- public boolean isSiblingOf(final NodeView myNodeView) {
- return getParentView() == myNodeView.getParentView();
- }
-
- public void mapChanged(final MapChangeEvent event) {
- }
-
- public void nodeChanged(final NodeChangeEvent event) {
- final NodeModel node = event.getNode();
- // is node is deleted, skip the rest.
- if (!node.isRoot() && node.getParent() == null) {
- return;
- }
- final Object property = event.getProperty();
- if (property == NodeChangeType.FOLDING) {
- treeStructureChanged();
- getMap().selectIfSelectionIsEmpty(this);
- String shape = NodeStyleController.getController(getMap().getModeController()).getShape(model);
- if (shape.equals(NodeStyleModel.SHAPE_COMBINED))
- update();
- return;
- }
- // is node is not fully initialized, skip the rest.
- if (mainView == null) {
- return;
- }
- if (property.equals(NodeModel.NODE_ICON) || property.equals(HierarchicalIcons.ICONS)) {
- mainView.updateIcons(this);
- revalidate();
- return;
- }
- if (property.equals(NodeModel.NOTE_TEXT)) {
- NodeViewFactory.getInstance().updateNoteViewer(this);
- mainView.updateIcons(this);
- return;
- }
- if (property.equals(ShortenedTextModel.SHORTENER)) {
- NodeViewFactory.getInstance().updateNoteViewer(this);
- }
-
- if (property.equals(HistoryInformationModel.class)) {
- return;
- }
- update();
- if (!isRoot())
- getParentView().numberingChanged(node.getParent().getIndex(node) + 1);
- }
-
- public void onNodeDeleted(final NodeModel parent, final NodeModel child, final int index) {
- if (getMap().getModeController().getMapController().isFolded(model)) {
- return;
- }
- final boolean preferredChildIsLeft = preferredChild != null && preferredChild.isLeft();
- final NodeView node = (NodeView) getComponent(index);
- if (node == preferredChild) {
- preferredChild = null;
- for (int j = index + 1; j < getComponentCount(); j++) {
- final Component c = getComponent(j);
- if (!(c instanceof NodeView)) {
- break;
- }
- final NodeView candidate = (NodeView) c;
- if (candidate.isVisible() && node.isLeft() == candidate.isLeft()) {
- preferredChild = candidate;
- break;
- }
- }
- if (preferredChild == null) {
- for (int j = index - 1; j >= 0; j--) {
- final Component c = getComponent(j);
- if (!(c instanceof NodeView)) {
- break;
- }
- final NodeView candidate = (NodeView) c;
- if (candidate.isVisible() && node.isLeft() == candidate.isLeft()) {
- preferredChild = candidate;
- break;
- }
- }
- }
- }
- numberingChanged(index+1);
- node.remove();
- NodeView preferred = getPreferredVisibleChild(false, preferredChildIsLeft);
- if (preferred == null) {
- preferred = this;
- }
- if(getMap().getSelected() == null)
- getMap().selectVisibleAncestorOrSelf(preferred);
- revalidate();
- }
-
- public void onNodeInserted(final NodeModel parent, final NodeModel child, final int index) {
- assert parent == model;
- if (getMap().getModeController().getMapController().isFolded(model)) {
- return;
- }
- addChildView(child, index);
- numberingChanged(index + 1);
- revalidate();
- }
-
- public void onNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- public void onPreNodeDelete(final NodeModel oldParent, final NodeModel child, final int oldIndex) {
- }
-
- // updates children, starting from firstChangedIndex, if necessary.
- private void numberingChanged(int firstChangedIndex) {
- final TextController textController = TextController.getController(getMap().getModeController());
- if (firstChangedIndex > 0 || textController.getNodeNumbering(getModel())) {
- final Component[] components = getComponents();
- for (int i = firstChangedIndex; i < components.length; i++) {
- if (components[i] instanceof NodeView) {
- final NodeView view = (NodeView) components[i];
- final MainView childMainView = view.getMainView();
- if(childMainView != null){
- childMainView.updateText(view.getModel());
- view.numberingChanged(0);
- }
- }
- }
- }
- }
-
- /*
- * (non-Javadoc)
- * @see javax.swing.JComponent#paint(java.awt.Graphics)
- */
- @Override
- public void paintComponent(final Graphics g) {
- if(getMainView() == null)
- return;
- final PaintingMode paintingMode = map.getPaintingMode();
- if (isContentVisible()) {
- final Graphics2D g2 = (Graphics2D) g;
- final ModeController modeController = map.getModeController();
- final Object renderingHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
- switch (paintingMode) {
- case CLOUDS:
- modeController.getController().getMapViewManager().setEdgesRenderingHint(g2);
- final boolean isRoot = isRoot();
- if (isRoot) {
- paintCloud(g);
- }
- paintClouds(g2);
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
- }
- switch (paintingMode) {
- case NODES:
- g2.setStroke(BubbleMainView.DEF_STROKE);
- modeController.getController().getMapViewManager().setEdgesRenderingHint(g2);
- paintEdges(g2, this);
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
- }
- }
- if (PAINT_DEBUG_BORDER && isSelected()&& paintingMode.equals(PaintingMode.SELECTED_NODES)){
- final int spaceAround = getZoomed(SPACE_AROUND);
- g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
- g.drawRect(spaceAround - 1, spaceAround - 1, getWidth() - 2 * spaceAround, getHeight() - 2 * spaceAround);
- }
- }
-
- @Override
- public void paint(Graphics g) {
- super.paint(g);
- paintDecoration((Graphics2D) g);
- }
-
- private void paintCloud(final Graphics g) {
- if (!isContentVisible()) {
- return;
- }
- final CloudModel cloudModel = getCloudModel();
- if (cloudModel == null) {
- return;
- }
- final CloudView cloud = new CloudViewFactory().createCloudView(cloudModel, this);
- cloud.paint(g);
- }
-
- private void paintClouds(final Graphics2D g) {
- for (int i = getComponentCount() - 1; i >= 0; i--) {
- final Component component = getComponent(i);
- if (!(component instanceof NodeView)) {
- continue;
- }
- final NodeView nodeView = (NodeView) component;
- final Point p = new Point();
- UITools.convertPointToAncestor(nodeView, p, this);
- g.translate(p.x, p.y);
- if (nodeView.isContentVisible()) {
- nodeView.paintCloud(g);
- }
- else {
- nodeView.paintClouds(g);
- }
- g.translate(-p.x, -p.y);
- }
- }
-
- private void paintEdges(final Graphics2D g, NodeView source) {
- SummaryEdgePainter summaryEdgePainter = new SummaryEdgePainter(this, isRoot() ? true : isLeft());
- SummaryEdgePainter rightSummaryEdgePainter = isRoot() ? new SummaryEdgePainter(this, false) : null;
- final int start;
- final int end;
- final int step;
- if (getMap().getLayoutType() == MapViewLayout.OUTLINE){
- start = getComponentCount() - 1;
- end = -1;
- step = -1;
- }
- else{
- start = 0;
- end = getComponentCount();
- step = 1;
- }
- for (int i = start; i != end; i+=step) {
- final Component component = getComponent(i);
- if (!(component instanceof NodeView)) {
- continue;
- }
- final NodeView nodeView = (NodeView) component;
- if (getMap().getLayoutType() != MapViewLayout.OUTLINE) {
- SummaryEdgePainter activePainter = nodeView.isLeft() || !isRoot() ? summaryEdgePainter : rightSummaryEdgePainter;
- activePainter.addChild(nodeView);
- if(activePainter.paintSummaryEdge(g, source, nodeView)){
- if(! nodeView.isContentVisible()){
- final Rectangle bounds = SwingUtilities.convertRectangle(this, nodeView.getBounds(), source);
- final Graphics cg = g.create(bounds.x, bounds.y, bounds.width, bounds.height);
- try{
- nodeView.paintEdges((Graphics2D) cg, nodeView);
- }
- finally{
- cg.dispose();
- }
-
- }
- continue;
- }
- }
- if (nodeView.isContentVisible()) {
- final EdgeView edge = EdgeViewFactory.getInstance().getEdge(source, nodeView, source);
- edge.paint(g);
- }
- else {
- nodeView.paintEdges(g, source);
- }
- }
- }
-
-
- int getSpaceAround() {
- return getZoomed(NodeView.SPACE_AROUND);
- }
-
- public int getZoomed(int x) {
- return getMap().getZoomed(x);
- }
-
- private void paintDecoration(final Graphics2D g) {
- final PaintingMode paintingMode = map.getPaintingMode();
- if(! (getMainView() != null &&
- ( paintingMode.equals(PaintingMode.NODES) && !isSelected() || paintingMode.equals(PaintingMode.SELECTED_NODES) && isSelected())
- && isContentVisible()))
- return;
- final Graphics2D g2 = g;
- final ModeController modeController = map.getModeController();
- final Object renderingHint = g2.getRenderingHint(RenderingHints.KEY_ANTIALIASING);
- g2.setStroke(BubbleMainView.DEF_STROKE);
- modeController.getController().getMapViewManager().setEdgesRenderingHint(g2);
- final Point origin = new Point();
- UITools.convertPointToAncestor(mainView, origin, this);
- g.translate(origin.x, origin.y);
- mainView.paintDecoration(this, g);
- g.translate(-origin.x, -origin.y);
- final FilterController filterController = FilterController.getController(getMap().getModeController().getController());
- if(filterController.isNodeHighlighted(getModel())){
- final Color oldColor = g.getColor();
- final Stroke oldStroke = g.getStroke();
- g.setColor(Color.MAGENTA);
- g.setStroke(getMap().getStandardSelectionStroke());
- final JComponent content = getContent();
- Point contentLocation = content.getLocation();
- final int arcWidth = 8;
- g.drawRoundRect(contentLocation.x - arcWidth, contentLocation.y - arcWidth, content.getWidth() + 2 * arcWidth,
- content.getHeight() + 2 * arcWidth, 15, 15);
- g.setColor(oldColor);
- g.setStroke(oldStroke);
- }
- g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
- }
-
- /**
- * This is a bit problematic, because getChildrenViews() only works if model
- * is not yet removed. (So do not _really_ delete the model before the view
- * removed (it needs to stay in memory)
- */
- void remove() {
- for (final ListIterator<NodeView> e = getChildrenViews().listIterator(); e.hasNext();) {
- e.next().remove();
- }
- getMap().deselect(this);
- getMap().getModeController().onViewRemoved(this);
- removeFromMap();
- if (attributeView != null) {
- attributeView.viewRemoved();
- }
- getModel().removeViewer(this);
- }
-
- protected void removeFromMap() {
- setFocusCycleRoot(false);
- Container parent = getParent();
- parent.remove(this);
- }
-
- private void repaintEdge(final NodeView target) {
- if (target.getMap().getLayoutType() == MapViewLayout.OUTLINE){
- target.getVisibleParentView().repaint();
- return;
- }
- final Point relativeLocation = getRelativeLocation(target);
- final MainView targetMainView = target.getMainView();
- relativeLocation.x += targetMainView.getWidth()/2;
- relativeLocation.y += targetMainView.getHeight()/2;
- final Point inPoint = mainView.getConnectorPoint(relativeLocation);
- UITools.convertPointToAncestor(targetMainView, inPoint, this);
-
- relativeLocation.x -= targetMainView.getWidth()/2;
- relativeLocation.y -= targetMainView.getHeight()/2;
- relativeLocation.x = - relativeLocation.x + mainView.getWidth()/2;
- relativeLocation.y = - relativeLocation.y + mainView.getHeight()/2;
- final Point outPoint = targetMainView.getConnectorPoint(relativeLocation);
- UITools.convertPointToAncestor(getMainView(), outPoint, this);
-
- final int x = Math.min(inPoint.x, outPoint.x);
- final int y = Math.min(inPoint.y, outPoint.y);
- final int w = Math.abs(inPoint.x - outPoint.x);
- final int h = Math.abs(inPoint.y - outPoint.y);
- final int EXTRA = 50;
- repaint(x - EXTRA, y - EXTRA, w + EXTRA * 2, h + EXTRA * 2);
- }
-
- void repaintSelected() {
- // return if main view was not set
- if (mainView == null) {
- return;
- }
- // do not repaint removed nodes
- if (model.getParentNode() == null && !model.isRoot()) {
- return;
- }
- if (getEdgeStyle().equals(EdgeStyle.EDGESTYLE_HIDDEN)) {
- final NodeView visibleParentView = getVisibleParentView();
- if (visibleParentView != null) {
- visibleParentView.repaintEdge(this);
- }
- }
- final JComponent content = getContent();
- final int EXTRA = 20;
- final int x = content.getX() - EXTRA;
- final int y = content.getY() - EXTRA;
- repaint(x, y, content.getWidth() + EXTRA * 2, content.getHeight() + EXTRA * 2);
- }
-
- @Override
- public boolean requestFocusInWindow() {
- if (mainView == null) {
- return false;
- }
- if (mainView.requestFocusInWindow()) {
- getMap().scrollNodeToVisible(this);
- Controller.getCurrentController().getViewController().addObjectTypeInfo(getModel().getUserObject());
- return true;
- }
- return false;
- }
-
- @Override
- public void requestFocus() {
- if (mainView == null) {
- return;
- }
- getMap().scrollNodeToVisible(this);
- Controller.getCurrentController().getViewController().addObjectTypeInfo(getModel().getUserObject());
- mainView.requestFocus();
- }
-
- void setMainView(final MainView newMainView) {
- if (contentPane != null) {
- assert (contentPane.getParent() == this);
- if (mainView != null)
- removeContent(MAIN_VIEWER_POSITION);
- addContent(newMainView, MAIN_VIEWER_POSITION);
- assert (contentPane.getParent() == this);
- }
- else if (mainView != null) {
- final Container c = mainView.getParent();
- int i;
- for (i = c.getComponentCount() - 1; i >= 0 && mainView != c.getComponent(i); i--) {
- ;
- }
- c.remove(i);
- c.add(newMainView, i);
- }
- else {
- add(newMainView);
- }
- mainView = newMainView;
- final IUserInputListenerFactory userInputListenerFactory = getMap().getModeController()
- .getUserInputListenerFactory();
- mainView.addMouseListener(userInputListenerFactory.getNodeMouseMotionListener());
- mainView.addMouseMotionListener(userInputListenerFactory.getNodeMouseMotionListener());
- mainView.addKeyListener(userInputListenerFactory.getNodeKeyListener());
- addDragListener(userInputListenerFactory.getNodeDragListener());
- addDropListener(userInputListenerFactory.getNodeDropTargetListener());
- }
-
- protected void setModel(final NodeModel model) {
- this.model = model;
- }
-
- public void setPreferredChild(final NodeView view) {
- if(view != null && ! SummaryNode.isSummaryNode(view.getModel()))
- preferredChild = view;
- final Container parent = this.getParent();
- if (view == null) {
- return;
- }
- else if (parent instanceof NodeView) {
- ((NodeView) parent).setPreferredChild(this);
- }
- }
-
- /**
- */
- public void setText(final String string) {
- mainView.setText(string);
- }
-
-
- void syncronizeAttributeView() {
- if (attributeView != null) {
- attributeView.syncronizeAttributeView();
- }
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.Component#toString()
- */
- @Override
- public String toString() {
- return getModel().toString() + ", " + super.toString();
- }
-
- /*
- * (non-Javadoc)
- * @see
- * javax.swing.event.TreeModelListener#treeStructureChanged(javax.swing.
- * event.TreeModelEvent)
- */
- private void treeStructureChanged() {
- for (final ListIterator<NodeView> i = getChildrenViews().listIterator(); i.hasNext();) {
- i.next().remove();
- }
- addChildViews();
- map.revalidateSelecteds();
- revalidate();
- }
-
- public void update() {
- updateShape();
- updateEdge();
- if (!isContentVisible()) {
- mainView.setVisible(false);
- return;
- }
- mainView.setVisible(true);
- mainView.updateTextColor(this);
- mainView.updateFont(this);
- createAttributeView();
- if (attributeView != null) {
- attributeView.update();
- }
- final boolean textShortened = isShortened();
-
- if(! textShortened){
- NodeViewFactory.getInstance().updateDetails(this);
- if (contentPane != null) {
- final int componentCount = contentPane.getComponentCount();
- for (int i = 1; i < componentCount; i++) {
- final Component component = contentPane.getComponent(i);
- if (component instanceof JComponent) {
- ((JComponent) component).revalidate();
- }
- }
- }
- }
- updateShortener(getModel(), textShortened);
- mainView.updateIcons(this);
- mainView.updateText(getModel());
- updateCloud();
- modelBackgroundColor = NodeStyleController.getController(getMap().getModeController()).getBackgroundColor(model);
- revalidate();
- }
-
- public boolean isShortened() {
- final ModeController modeController = getMap().getModeController();
- final TextController textController = TextController.getController(modeController);
- final boolean textShortened = textController.isMinimized(getModel());
- return textShortened;
- }
-
- private void updateEdge() {
- final EdgeController edgeController = EdgeController.getController(getMap().getModeController());
- this.edgeStyle = edgeController.getStyle(model, false);
- this.edgeWidth = edgeController.getWidth(model, false);
- this.edgeColor = edgeController.getColor(model, false);
- }
-
- public EdgeStyle getEdgeStyle() {
- if(edgeStyle != null)
- return edgeStyle;
- final NodeView parentView = getParentView();
- if(parentView != null)
- return parentView.getEdgeStyle();
- return EdgeStyle.values()[0];
- }
-
- public int getEdgeWidth() {
- if(edgeWidth != null)
- return edgeWidth;
- final NodeView parentView = getParentView();
- if(parentView != null)
- return parentView.getEdgeWidth();
- return 1;
- }
- public Color getEdgeColor() {
- if(edgeColor != null)
- return edgeColor;
- final NodeView parentView = getParentView();
- if(parentView != null)
- return parentView.getEdgeColor();
- return Color.GRAY;
- }
-
- private void updateCloud() {
- final CloudModel cloudModel = CloudController.getController(getMap().getModeController()).getCloud(model);
- putClientProperty(CloudModel.class, cloudModel);
- }
-
- public CloudModel getCloudModel() {
- return (CloudModel) getClientProperty(CloudModel.class);
- }
-
- private void updateShortener(NodeModel nodeModel, boolean textShortened) {
- final boolean componentsVisible = !textShortened;
- setContentComponentVisible(componentsVisible);
- }
-
- private void setContentComponentVisible(final boolean componentsVisible) {
- if(contentPane == null)
- return;
- final Component[] components = getContentPane().getComponents();
- int index;
- for (index = 0; index < components.length; index++) {
- final Component component = components[index];
- if (component == getMainView()) {
- continue;
- }
- if (component.isVisible() != componentsVisible) {
- component.setVisible(componentsVisible);
- }
- }
- }
-
- public void updateAll() {
- NodeViewFactory.getInstance().updateNoteViewer(this);
- update();
- invalidate();
- for (final NodeView child : getChildrenViews()) {
- child.updateAll();
- }
- }
-
- private void updateShape() {
- final String newShape = NodeStyleController.getController(getMap().getModeController()).getShape(model);
- final String oldShape;
- if(mainView != null)
- oldShape = mainView.getShape();
- else
- oldShape = null;
- if (mainView != null){
- if(oldShape.equals(newShape))
- return;
- if(model.isRoot()) {
- if(newShape != null)
- ((RootMainView)mainView).setShape(newShape);
- return;
- }
- }
- final MainView newMainView = NodeViewFactory.getInstance().newMainView(this);
- if(newMainView.getShape().equals(oldShape))
- return;
- setMainView(newMainView);
- if (map.getSelected() == this) {
- requestFocusInWindow();
- }
- }
-
- boolean useSelectionColors() {
- return isSelected() && !MapView.standardDrawRectangleForSelection && !map.isPrinting();
- }
-
- public void onPreNodeMoved(final NodeModel oldParent, final int oldIndex, final NodeModel newParent,
- final NodeModel child, final int newIndex) {
- }
-
- @Override
- protected void validateTree() {
- super.validateTree();
- }
-
- public void addContent(JComponent component, int pos) {
- component.putClientProperty("NODE_VIEW_CONTENT_POSITION", pos);
- final Container contentPane = getContentPane();
- for (int i = 0; i < contentPane.getComponentCount(); i++) {
- JComponent content = (JComponent) contentPane.getComponent(i);
- if (content == null)
- throw new RuntimeException("component " + i + "is null");
- final Object clientProperty = content.getClientProperty("NODE_VIEW_CONTENT_POSITION");
- if (clientProperty == null)
- throw new RuntimeException("NODE_VIEW_CONTENT_POSITION not set on component " + content.toString() + i
- + "/" + contentPane.getComponentCount());
- if (pos < (Integer) clientProperty) {
- contentPane.add(component, i);
- return;
- }
- }
- contentPane.add(component);
- }
-
- public JComponent removeContent(int pos) {
- return removeContent(pos, true);
- }
-
- private JComponent removeContent(int pos, boolean remove) {
- if (contentPane == null)
- return null;
- for (int i = 0; i < contentPane.getComponentCount(); i++) {
- JComponent component = (JComponent) contentPane.getComponent(i);
- Integer contentPos = (Integer) component.getClientProperty("NODE_VIEW_CONTENT_POSITION");
- if (contentPos == null) {
- continue;
- }
- if (contentPos == pos) {
- if (remove) {
- component.putClientProperty("NODE_VIEW_CONTENT_POSITION", null);
- contentPane.remove(i);
- }
- return component;
- }
- if (contentPos > pos) {
- return null;
- }
- }
- return null;
- }
-
- public JComponent getContent(int pos) {
- return removeContent(pos, false);
- }
-
- public boolean isSummary() {
- return SummaryNode.isSummaryNode(getModel());
- }
-
- public boolean isFirstGroupNode() {
- return SummaryNode.isFirstGroupNode(getModel());
- }
-
- public boolean isFree() {
- return FreeNode.isFreeNode(getModel());
- }
-
- public Color getDetailBackground() {
- final Color detailBackground = getMap().getDetailBackground();
- return detailBackground;
- }
-
- int getTopOverlap() {
- return topOverlap;
- }
-
- void setTopOverlap(int topOverlap) {
- this.topOverlap = topOverlap;
- }
-
- int getBottomOverlap() {
- return bottomOverlap;
- }
-
- void setBottomOverlap(int bottomOverlap) {
- this.bottomOverlap = bottomOverlap;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/NodeViewFactory.java b/freeplane/src/org/freeplane/view/swing/map/NodeViewFactory.java
deleted file mode 100644
index 1c7f931..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/NodeViewFactory.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.event.HierarchyEvent;
-import java.awt.event.HierarchyListener;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.imageio.ImageIO;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.ui.IMouseListener;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.features.text.DetailTextModel;
-import org.freeplane.view.swing.ui.DefaultMapMouseListener;
-import org.freeplane.view.swing.ui.DetailsViewMouseListener;
-import org.freeplane.view.swing.ui.LinkNavigatorMouseListener;
-
-class NodeViewFactory {
- private static NodeViewFactory factory;
-
- static NodeViewFactory getInstance() {
- if (NodeViewFactory.factory == null) {
- NodeViewFactory.factory = new NodeViewFactory();
- }
- return NodeViewFactory.factory;
- }
-
- private NodeViewFactory() {
- }
-
- private void fireNodeViewCreated(final NodeView newView) {
- newView.getMap().getModeController().onViewCreated(newView);
- }
-
- JComponent newContentPane(final NodeView view) {
- return new ContentPane();
- }
-
- MainView newMainView(final NodeView node) {
- String shape = shape(node);
- final MainView oldView = node.getMainView();
- if(oldView != null && oldView.getShape().equals(shape))
- return oldView;
- final ModeController modeController = node.getMap().getModeController();
- final NodeModel model = node.getModel();
- final MainView view;
- if (shape.equals(NodeStyleModel.STYLE_BUBBLE)) {
- if (model.isRoot())
- view = new RootMainView(NodeStyleModel.STYLE_BUBBLE);
- else
- view = new BubbleMainView();
- }
- else {
- if (shape != null && ! shape.equals(NodeStyleModel.STYLE_FORK))
- System.err.println("Tried to create a NodeView of unknown Style " + String.valueOf(shape));
- if (model.isRoot())
- view = new RootMainView(NodeStyleModel.STYLE_FORK);
- else
- view = new ForkMainView();
- }
- NodeTooltipManager toolTipManager = NodeTooltipManager.getSharedInstance(modeController);
- toolTipManager.registerComponent(view);
- return view;
- }
-
- private String shape(NodeView node) {
- final ModeController modeController = node.getMap().getModeController();
- final NodeModel model = node.getModel();
- String shape = NodeStyleController.getController(modeController).getShape(model);
- if (shape.equals(NodeStyleModel.SHAPE_COMBINED)) {
- if (Controller.getCurrentModeController().getMapController().isFolded(model)) {
- shape= NodeStyleModel.STYLE_BUBBLE;
- }
- else {
- shape = NodeStyleModel.STYLE_FORK;
- }
- }
- else while(shape.equals(NodeStyleModel.SHAPE_AS_PARENT)){
- node = node.getParentView();
- if (node == null)
- shape = NodeStyleModel.STYLE_FORK;
- else
- shape = node.getMainView().getShape();
- }
- return shape;
- }
-
- /**
- * Factory method which creates the right NodeView for the model.
- */
- NodeView newNodeView(final NodeModel model, final MapView map, final Container parent, final int index) {
- final NodeView newView = new NodeView(model, map, parent);
- parent.add(newView, index);
- newView.setMainView(newMainView(newView));
- if(map.isDisplayable())
- updateNewView(newView);
- else
- newView.addHierarchyListener(new HierarchyListener() {
- public void hierarchyChanged(HierarchyEvent e) {
- NodeView view = (NodeView) e.getComponent();
- if(displayed(view, e)){
- view.removeHierarchyListener(this);
- updateNewView(view);
- }
- else if(removed(view, e)){
- view.removeHierarchyListener(this);
- }
- }
-
- private boolean removed(NodeView view, HierarchyEvent e) {
- return 0 != (e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) && view.getParent() == null;
- }
-
- private boolean displayed(NodeView view, HierarchyEvent e) {
- return 0 != (e.getChangeFlags() & HierarchyEvent.DISPLAYABILITY_CHANGED) && view.isDisplayable();
- }
- });
- return newView;
- }
-
- private void updateNewView(final NodeView newView) {
- newView.getModel().addViewer(newView);
- newView.setLayout(SelectableLayout.getInstance());
- updateNoteViewer(newView);
- newView.update();
- fireNodeViewCreated(newView);
- newView.addChildViews();
- }
-
- private static Map<Color, Icon> coloredNoteIcons = new HashMap<Color, Icon>();
- private final Icon coloredIcon = createColoredIcon();
- private static final IMouseListener DETAILS_MOUSE_LISTENER = new DetailsViewMouseListener();
- private static final LinkNavigatorMouseListener LINK_MOUSE_LISTENER = new LinkNavigatorMouseListener();
-
- public ZoomableLabel createNoteViewer() {
- final ZoomableLabel label = new ZoomableLabel();
- label.addMouseListener(LINK_MOUSE_LISTENER);
- label.addMouseMotionListener(LINK_MOUSE_LISTENER);
- label.setIcon(coloredIcon);
- label.setVerticalTextPosition(JLabel.TOP);
- return label;
- }
-
- private Icon createColoredIcon() {
- return new Icon() {
- public void paintIcon(Component c, Graphics g, int x, int y) {
- NodeView nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, c);
- if(nodeView == null)
- return;
- final Color iconColor = nodeView.getEdgeColor();
- createColoredIcon(iconColor).paintIcon(c, g, x, y);
- }
-
- public int getIconWidth() {
- return createColoredIcon(Color.BLACK).getIconWidth();
- }
-
- public int getIconHeight() {
- return createColoredIcon(Color.BLACK).getIconHeight();
- }
- };
- }
-
- private Icon createColoredIcon(Color iconColor) {
- Icon icon = coloredNoteIcons.get(iconColor);
- if(icon == null){
- final BufferedImage img;
- try {
- img = ImageIO.read(NoteController.bwNoteIconUrl);
- final int oldRGB = 0xffffff & Color.BLACK.getRGB();
- final int newRGB = 0xffffff & iconColor.getRGB();
- if(oldRGB != newRGB){
- for (int x = 0; x < img.getWidth(); x++) {
- for (int y = 0; y < img.getHeight(); y++) {
- final int rgb = img.getRGB(x, y);
- if ((0xffffff &rgb) == oldRGB)
- img.setRGB(x, y, 0xff000000 & rgb| newRGB);
- }
- }
- }
- icon = new ImageIcon(img);
- coloredNoteIcons.put(iconColor, icon);
- }
- catch (IOException e) {
- }
- }
- return icon;
- }
-
- void updateNoteViewer(NodeView nodeView) {
- ZoomableLabel note = (ZoomableLabel) nodeView.getContent(NodeView.NOTE_VIEWER_POSITION);
- String oldText = note != null ? note.getText() : null;
- String newText = null;
- if (nodeView.getMap().showNotes()) {
- final NodeModel model = nodeView.getModel();
- final NoteModel extension = NoteModel.getNote(model);
- if (extension != null)
- newText = extension.getHtml();
- }
- if (oldText == null && newText == null) {
- return;
- }
- final ZoomableLabel view;
- if (oldText != null && newText != null) {
- view = (ZoomableLabel) nodeView.getContent(NodeView.NOTE_VIEWER_POSITION);
- }
- else if (oldText == null && newText != null) {
- view = NodeViewFactory.getInstance().createNoteViewer();
- nodeView.addContent(view, NodeView.NOTE_VIEWER_POSITION);
- }
- else {
- assert (oldText != null && newText == null);
- nodeView.removeContent(NodeView.NOTE_VIEWER_POSITION);
- return;
- }
- view.setFont(nodeView.getMap().getDefaultNoteFont());
- view.updateText(newText);
-
- }
-
- void updateDetails(NodeView nodeView) {
- final DetailTextModel detailText = DetailTextModel.getDetailText(nodeView.getModel());
- if (detailText == null) {
- nodeView.removeContent(NodeView.DETAIL_VIEWER_POSITION);
- return;
- }
- DetailsView detailContent = (DetailsView) nodeView.getContent(NodeView.DETAIL_VIEWER_POSITION);
- if (detailContent == null) {
- detailContent = createDetailView();
- nodeView.addContent(detailContent, NodeView.DETAIL_VIEWER_POSITION);
- }
- final MapView map = nodeView.getMap();
- if (detailText.isHidden()) {
- final ArrowIcon icon = new ArrowIcon(nodeView, true);
- detailContent.setIcon(icon);
- detailContent.setBackground(null);
- detailContent.updateText("");
- detailContent.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
- }
- else {
- detailContent.setFont(map.getDetailFont());
- detailContent.setIcon(new ArrowIcon(nodeView, false));
- detailContent.updateText(detailText.getHtml());
- detailContent.setForeground(map.getDetailForeground());
- detailContent.setBackground(nodeView.getDetailBackground());
- detailContent.setPreferredSize(null);
- }
- detailContent.revalidate();
- map.repaint();
- }
-
- private DetailsView createDetailView() {
- DetailsView detailContent = new DetailsView();
- final DefaultMapMouseListener mouseListener = new DefaultMapMouseListener();
- detailContent.addMouseMotionListener(mouseListener);
- detailContent.addMouseMotionListener(DETAILS_MOUSE_LISTENER);
- detailContent.addMouseListener(DETAILS_MOUSE_LISTENER);
- return detailContent;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/NodeViewLayoutAdapter.java b/freeplane/src/org/freeplane/view/swing/map/NodeViewLayoutAdapter.java
deleted file mode 100644
index d2a61df..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/NodeViewLayoutAdapter.java
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.Point;
-
-import javax.swing.JComponent;
-
-import org.freeplane.features.cloud.CloudModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodelocation.LocationModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.view.swing.map.cloud.CloudView;
-
-abstract public class NodeViewLayoutAdapter implements INodeViewLayout {
- protected static class LayoutData{
- final int[] lx;
- final int[] ly;
- final boolean[] free;
- final boolean[] summary;
- int left;
- int childContentHeight;
- int top;
- boolean rightDataSet;
- boolean leftDataSet;
- public LayoutData(int childCount) {
- super();
- this.lx = new int[childCount];
- this.ly = new int[childCount];
- this.free = new boolean[childCount];
- this.summary = new boolean[childCount];
- this.left = 0;
- this.childContentHeight = 0;
- this.top = 0;
- rightDataSet = false;
- leftDataSet = false;
- }
- }
-
- private static Dimension minDimension;
- private int childCount;
- private JComponent content;
- protected Point location = new Point();
- private NodeModel model;
- private int spaceAround;
- private int vGap;
- private NodeView view;
- private int contentWidth;
- private int contentHeight;
- private int cloudHeight;
-
- public void addLayoutComponent(final String arg0, final Component arg1) {
- }
- /**
- * @return Returns the childCount.
- */
- protected int getChildCount() {
- return childCount;
- }
-
- /**
- * @return Returns the content.
- */
- protected JComponent getContent() {
- return content;
- }
-
- /**
- * @return Returns the model.
- */
- protected NodeModel getModel() {
- return model;
- }
-
- /**
- * @return Returns the spaceAround.
- */
- int getSpaceAround() {
- return spaceAround;
- }
-
- /**
- * @return Returns the vGap.
- */
- int getVGap() {
- return vGap;
- }
-
- /**
- * @return Returns the view.
- */
- protected NodeView getView() {
- return view;
- }
-
- abstract protected void layout();
-
- public void layoutContainer(final Container c) {
- if(setUp(c)){
- layout();
- }
- shutDown();
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.LayoutManager#minimumLayoutSize(java.awt.Container)
- */
- public Dimension minimumLayoutSize(final Container arg0) {
- if (NodeViewLayoutAdapter.minDimension == null) {
- NodeViewLayoutAdapter.minDimension = new Dimension(0, 0);
- }
- return NodeViewLayoutAdapter.minDimension;
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.LayoutManager#preferredLayoutSize(java.awt.Container)
- */
- public Dimension preferredLayoutSize(final Container c) {
- if (!c.isValid()) {
- c.validate();
- }
- return c.getSize();
- }
-
- /*
- * (non-Javadoc)
- * @see java.awt.LayoutManager#removeLayoutComponent(java.awt.Component)
- */
- public void removeLayoutComponent(final Component arg0) {
- }
-
- protected boolean setUp(final Container c) {
- final NodeView localView = (NodeView) c;
- JComponent content = localView.getContent();
- if(content == null)
- return false;
- final int localChildCount = localView.getComponentCount() - 1;
- for (int i = 0; i < localChildCount; i++) {
- final Component component = localView.getComponent(i);
- ((NodeView) component).validateTree();
- }
- this.content = content;
- view = localView;
- model = localView.getModel();
- childCount = localChildCount;
- if (getModel().isVisible()) {
- setVGap(getView().getVGap());
- }
- else {
- setVGap(getView().getVisibleParentView().getVGap());
- }
- spaceAround = view.getSpaceAround();
- if (view.isContentVisible()) {
- final Dimension contentSize = calculateContentSize(view);
- contentWidth = contentSize.width;
- contentHeight = contentSize.height;
- cloudHeight = getAdditionalCloudHeigth(view);
- }
- else {
- contentHeight = 0;
- contentWidth = 0;
- cloudHeight = 0;
- }
- return true;
- }
-
- protected Dimension calculateContentSize(final NodeView view) {
- final JComponent content = view.getContent();
- final ModeController modeController = view.getMap().getModeController();
- final NodeStyleController nsc = NodeStyleController.getController(modeController);
- Dimension contentSize;
- if (content instanceof ZoomableLabel){
- int maxNodeWidth = nsc.getMaxWidth(view.getModel());
- contentSize= ((ZoomableLabel)content).getPreferredSize(maxNodeWidth);
- }
- else{
- contentSize= content.getPreferredSize();
- }
- int minNodeWidth = nsc.getMinWidth(view.getModel());
- int contentWidth = Math.max(view.getZoomed(minNodeWidth),contentSize.width);
- int contentHeight = contentSize.height;
- final Dimension contentProfSize = new Dimension(contentWidth, contentHeight);
- return contentProfSize;
- }
-
- protected void shutDown() {
- view = null;
- model = null;
- content = null;
- childCount = 0;
- setVGap(0);
- spaceAround = 0;
- }
-
- public void setVGap(final int vGap) {
- this.vGap = vGap;
- }
-
- /**
- * Calculates the tree height increment because of the clouds.
- */
- public int getAdditionalCloudHeigth(final NodeView node) {
- if (!node.isContentVisible()) {
- return 0;
- }
- final CloudModel cloud = node.getCloudModel();
- if (cloud != null) {
- return CloudView.getAdditionalHeigth(cloud, node);
- }
- else {
- return 0;
- }
- }
-
- protected void calcLayout(final boolean isLeft, final LayoutData data) {
- int highestSummaryLevel = 1;
- int level = 1;
- for (int i = 0; i < getChildCount(); i++) {
- final NodeView child = (NodeView) getView().getComponent(i);
- if (child.isLeft() != isLeft) {
- continue;
- }
- if(child.isSummary()){
- level++;
- highestSummaryLevel = Math.max(highestSummaryLevel, level);
- }
- else{
- level = 1;
- }
- }
- int left = 0;
- int y = 0;
-
- int childContentHeightSum = 0;
- int visibleChildCounter = 0;
- boolean useSummaryAsItem = true;
- int top = 0;
-
- final int[] groupStart = new int[highestSummaryLevel];
- final int[] groupStartContentHeightSum = new int[highestSummaryLevel];
- final int[] groupStartY = new int[highestSummaryLevel];
- final int[] groupEndY = new int[highestSummaryLevel];
-
- final int summaryBaseX[] = new int[highestSummaryLevel];
-
- level = highestSummaryLevel;
- for (int i = 0; i < getChildCount(); i++) {
- final NodeView child = (NodeView) getView().getComponent(i);
- if (child.isLeft() != isLeft) {
- continue;
- }
-
- final boolean isSummary = child.isSummary();
- final boolean isItem = !isSummary || useSummaryAsItem;
- final int oldLevel = level;
- if(isItem){
- if(level > 0)
- useSummaryAsItem = true;
- level = 0;
- }
- else{
- level++;
- }
-
-
- final int childCloudHeigth = getAdditionalCloudHeigth(child);
- final int childContentHeight = child.getContent().getHeight() + childCloudHeigth;
- final int childShiftY = child.isContentVisible() ? child.getShift() : 0;
- final int childContentShift = child.getContent().getY() -childCloudHeigth/2 - getSpaceAround();
- int childHGap;
- if(child.isContentVisible())
- childHGap = child.getHGap();
- else if(child.isSummary())
- childHGap = child.getZoomed(LocationModel.HGAP);
- else
- childHGap = 0;
- final int childHeight = child.getHeight() - 2 * getSpaceAround();
-
- boolean isFreeNode = child.isFree();
- data.free[i] = isFreeNode;
- data.summary[i] = ! isItem;
- if(isItem) {
- if (isFreeNode){
- data.ly[i] = childShiftY - childContentShift-childCloudHeigth/2 - getSpaceAround();
- }
- else{
- if (childShiftY < 0 || visibleChildCounter == 0) {
- top += childShiftY;
- }
- top -= childContentShift;
-
- top += child.getTopOverlap();
- y -= child.getTopOverlap();
- if (childShiftY < 0) {
- data.ly[i] = y;
- y -= childShiftY;
- }
- else {
- if(visibleChildCounter > 0)
- y += childShiftY;
- data.ly[i] = y;
- }
- if (childHeight != 0) {
- y += childHeight + getVGap();
- y -= child.getBottomOverlap();
- }
-
- childContentHeightSum += childContentHeight;
- if(oldLevel > 0){
- summaryBaseX[0] = 0;
- for(int j = 0; j < oldLevel; j++){
- groupStart[j] = i;
- groupStartY[j] = Integer.MAX_VALUE;
- groupEndY[j] = Integer.MIN_VALUE;
- groupStartContentHeightSum[j] = childContentHeightSum;
- }
- }
- else if(child.isFirstGroupNode()){
- groupStartContentHeightSum[0] = childContentHeightSum;
- summaryBaseX[0] = 0;
- groupStart[0] = i;
- }
- if (childHeight != 0) {
- if (visibleChildCounter > 0)
- childContentHeightSum += getVGap();
- }
- }
- if (childHeight != 0) {
- visibleChildCounter++;
- useSummaryAsItem = false;
- }
- }
- else{
- final int itemLevel = level - 1;
- if(child.isFirstGroupNode()){
- groupStartContentHeightSum[level] = groupStartContentHeightSum[itemLevel];
- summaryBaseX[level] = 0;
- groupStart[level] = groupStart[itemLevel];
- }
- int summaryY = (groupStartY[itemLevel] + groupEndY[itemLevel] ) / 2 - childContentHeight / 2 + childShiftY - (child.getContent().getY() - childCloudHeigth/2 - getSpaceAround());
- data.ly[i] = summaryY;
- if(!isFreeNode ){
- final int deltaY = summaryY - groupStartY[itemLevel] + child.getTopOverlap();
- if(deltaY < 0){
- top += deltaY;
- y -= deltaY;
- summaryY -= deltaY;
- for(int j = groupStart[itemLevel]; j <= i; j++){
- NodeView groupItem = (NodeView) getView().getComponent(j);
- if(groupItem.isLeft() == isLeft && (data.summary[j] || !data.free[j]))
- data.ly[j]-=deltaY;
- }
- }
- if (childHeight != 0) {
- summaryY += childHeight + getVGap() - child.getBottomOverlap();
- }
- y = Math.max(y, summaryY);
- final int summaryContentHeight = groupStartContentHeightSum[itemLevel] + childContentHeight;
- if(childContentHeightSum < summaryContentHeight){
- childContentHeightSum = summaryContentHeight;
- }
- }
- }
- if(! isItem || ! isFreeNode){
- if(child.isFirstGroupNode()){
- groupStartY[level] = data.ly[i] + child.getTopOverlap();
- groupEndY[level] = data.ly[i] + childHeight - child.getBottomOverlap();
- }
- else{
- groupStartY[level] = Math.min(groupStartY[level],data.ly[i] + child.getTopOverlap());
- groupEndY[level] = Math.max(data.ly[i] + childHeight - child.getBottomOverlap(), groupEndY[level]);
- }
- }
- final int x;
- final int baseX;
- if(level > 0)
- baseX = summaryBaseX[level - 1];
- else{
- if(child.isLeft() != (isItem && isFreeNode)){
- baseX = 0;
- }
- else{
- baseX = contentWidth;
- }
- }
- if(child.isLeft()){
- x = baseX - childHGap - child.getContent().getX() - child.getContent().getWidth();
- summaryBaseX[level] = Math.min(summaryBaseX[level], x + getSpaceAround());
- }
- else{
- x = baseX + childHGap - child.getContent().getX();
- summaryBaseX[level] = Math.max(summaryBaseX[level], x + child.getWidth() - getSpaceAround());
- }
- left = Math.min(left, x);
- data.lx[i] = x;
- }
-
- top += (contentHeight - childContentHeightSum) / 2;
- setData(data, isLeft, left, childContentHeightSum, top);
- }
-
- private void setData(final LayoutData data, boolean isLeft, int left, int childContentHeight, int top) {
- if(!isLeft && data.leftDataSet || isLeft && data.rightDataSet){
- data.left = Math.min(data.left, left);
- data.childContentHeight = Math.max(data.childContentHeight, childContentHeight);
- int deltaTop = top - data.top;
- final boolean changeLeft;
- if(deltaTop < 0){
- data.top = top;
- changeLeft = !isLeft;
- deltaTop = - deltaTop;
- }
- else{
- changeLeft = isLeft;
- }
- for(int i = 0; i < getChildCount(); i++){
- NodeView child = (NodeView) getView().getComponent(i);
- if(child.isLeft() == changeLeft && (data.summary[i] || !data.free[i])){
- data.ly[i] += deltaTop;
- }
- }
- }
- else{
- data.left = left;
- data.childContentHeight = childContentHeight;
- data.top = top;
- }
- if(isLeft)
- data.leftDataSet = true;
- else
- data.rightDataSet = true;
- }
-
-
- protected void placeChildren(final LayoutData data) {
- final int contentX = Math.max(getSpaceAround(), -data.left);
- int contentY= getSpaceAround() + cloudHeight/2 - Math.min(0, data.top);
-
- if (getView().isContentVisible()) {
- getContent().setVisible(true);
- }
- else {
- getContent().setVisible(false);
- }
-
- int baseY = contentY - getSpaceAround() + data.top;
- int minY = 0;
- for (int i = 0; i < getChildCount(); i++) {
- if(!data.summary[i] && data.free[i]){
- minY = Math.min(minY, contentY + data.ly[i]);
- }
- else
- minY = Math.min(minY, baseY + data.ly[i]);
- }
- if(minY < 0){
- contentY -= minY;
- baseY -= minY;
- }
- int width = contentX + contentWidth + getSpaceAround();
- int height = contentY + contentHeight+ cloudHeight/2 + getSpaceAround();
- getContent().setBounds(contentX, contentY, contentWidth, contentHeight);
- int topOverlap = -minY;
- int heigthWithoutOverlap = height;
- for (int i = 0; i < getChildCount(); i++) {
- NodeView child = (NodeView) getView().getComponent(i);
- final int y;
- if(!data.summary[i] && data.free[i]){
- y = contentY + data.ly[i];
- }
- else{
- y = baseY + data.ly[i];
- if(! data.free[i])
- heigthWithoutOverlap = Math.max(heigthWithoutOverlap, y + child.getHeight()+ cloudHeight/2 - child.getBottomOverlap());
- }
- final int x = contentX + data.lx[i];
- child.setLocation(x, y);
- width = Math.max(width, child.getX() + child.getWidth());
- height = Math.max(height, y + child.getHeight()+ cloudHeight/2);
- }
-
- view.setSize(width, height);
- view.setTopOverlap(topOverlap);
- view.setBottomOverlap(height - heigthWithoutOverlap);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/OutlineLayout.java b/freeplane/src/org/freeplane/view/swing/map/OutlineLayout.java
deleted file mode 100644
index c7d202d..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/OutlineLayout.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Container;
-import java.awt.Dimension;
-
-import javax.swing.JComponent;
-
-import org.freeplane.core.resources.ResourceController;
-
-/**
- * @author Dimitry Polivaev
- * 29.08.2009
- */
-public class OutlineLayout extends NodeViewLayoutAdapter {
- private int hGap;
-
- protected int getHGap() {
- return hGap;
- }
-
- static private final NodeViewLayoutAdapter instance = new OutlineLayout();
-
- static NodeViewLayoutAdapter getInstance() {
- return OutlineLayout.instance;
- }
-
- @Override
- protected void layout() {
- final int x = getSpaceAround();
- final int y = x;
- final JComponent content = getContent();
- final NodeView view = getView();
- if (view.isContentVisible()) {
- getContent().setVisible(true);
- final Dimension contentProfSize = calculateContentSize(view);
- content.setBounds(x, y, contentProfSize.width, contentProfSize.height);
- }
- else {
- content.setVisible(false);
- content.setBounds(x, y, 0, 0);
- }
- placeChildren();
- }
-
- private void placeChildren() {
- int baseX = getContent().getX();
- int y = getContent().getY() + getContent().getHeight() - getSpaceAround();
- if (getContent().isVisible()) {
- baseX += getHGap();
- y += getVGap();
- }
- int right = baseX + getContent().getWidth() + getSpaceAround();
- NodeView child = null;
- for (int i = 0; i < getChildCount(); i++) {
- final NodeView component = (NodeView) getView().getComponent(i);
- child = component;
- final int additionalCloudHeigth = getAdditionalCloudHeigth(child) / 2;
- y += additionalCloudHeigth;
- final int childHGap = child.getContent().isVisible() ? getHGap() : 0;
- final int x = baseX + childHGap - child.getContent().getX();
- child.setLocation(x, y);
- final int childHeight = child.getHeight() - 2 * getSpaceAround();
- if (childHeight != 0) {
- y += childHeight + getVGap() + additionalCloudHeigth;
- }
- right = Math.max(right, x + child.getWidth() + additionalCloudHeigth);
- }
- final int bottom = getContent().getY() + getContent().getHeight() + getSpaceAround();
- if (child != null) {
- getView().setSize(right,
- Math.max(bottom, child.getY() + child.getHeight() + getAdditionalCloudHeigth(child) / 2));
- }
- else {
- getView().setSize(right, bottom);
- }
- }
-
- @Override
- protected boolean setUp(final Container c) {
- if (! super.setUp(c)){
- return false;
- }
- final int vgap = ResourceController.getResourceController().getIntProperty("outline_vgap", 0);
- final int hgap = ResourceController.getResourceController().getIntProperty("outline_hgap", 0);
- setVGap(getView().getMap().getZoomed(vgap));
- hGap = getView().getMap().getZoomed(hgap);
- return true;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/PaintingMode.java b/freeplane/src/org/freeplane/view/swing/map/PaintingMode.java
deleted file mode 100644
index bed0601..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/PaintingMode.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-/**
- * @author Dimitry Polivaev
- * 21.04.2012
- */
-enum PaintingMode {
- CLOUDS, NODES, SELECTED_NODES, LINKS, SELECTORS
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/RightNodeViewLayout.java b/freeplane/src/org/freeplane/view/swing/map/RightNodeViewLayout.java
deleted file mode 100644
index 314ed9c..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/RightNodeViewLayout.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-/**
- * @author Dimitry Polivaev
- */
-public class RightNodeViewLayout extends NodeViewLayoutAdapter {
- static private final RightNodeViewLayout instance = new RightNodeViewLayout();
-
- static RightNodeViewLayout getInstance() {
- return RightNodeViewLayout.instance;
- }
-
- @Override
- protected void layout() {
- final LayoutData layoutData = new LayoutData(getChildCount());
- calcLayout(false, layoutData);
- placeChildren(layoutData);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/RootMainView.java b/freeplane/src/org/freeplane/view/swing/map/RootMainView.java
deleted file mode 100644
index 77606a3..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/RootMainView.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.GradientPaint;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.RenderingHints;
-
-import javax.swing.SwingConstants;
-
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodelocation.LocationModel;
-
-class RootMainView extends MainView {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String shape;
-
-
- public RootMainView(String shape) {
- super();
- setHorizontalAlignment(SwingConstants.CENTER);
- this.shape = shape;
- }
-
- @Override
- public boolean dropAsSibling(final double xCoord) {
- return false;
- }
-
- /** @return true if should be on the left, false otherwise. */
- @Override
- public boolean dropLeft(final double xCoord) {
- return xCoord < getSize().width * 1 / 2;
- }
-
-
- @Override
- public
- Point getLeftPoint() {
- final Point in = new Point(0, getHeight() / 2);
- return in;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.NodeView.MainView#getPreferredSize()
- */
- @Override
- public Dimension getPreferredSize(int width) {
- final Dimension prefSize = super.getPreferredSize(width);
- if (isPreferredSizeSet()) {
- return prefSize;
- }
- prefSize.width *= 1.1;
- prefSize.height *= 2;
- return prefSize;
- }
-
- @Override
- public
- Point getRightPoint() {
- final Point in = getLeftPoint();
- in.x = getWidth() - 1;
- return in;
- }
-
- /*
- * (non-Javadoc)
- * @see freeplane.view.mindmapview.NodeView#getStyle()
- */
- @Override
- public
- String getShape() {
- return shape;
- }
-
- void setShape(String shape) {
- this.shape = shape;
- }
-
- @Override
- public void paintComponent(final Graphics graphics) {
- final Graphics2D g = (Graphics2D) graphics;
- if (getNodeView().getModel() == null) {
- return;
- }
- final ModeController modeController = getNodeView().getMap().getModeController();
- final Object renderingHint = modeController.getController().getMapViewManager().setEdgesRenderingHint(g);
- paintBackgound(g);
- paintDragOver(g);
- g.setColor(Color.gray);
- g.setStroke(new BasicStroke(1.0f));
- g.drawOval(0, 0, getWidth() - 1, getHeight() - 1);
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, renderingHint);
- super.paintComponent(g);
- }
-
- @Override
- protected void paintBackground(final Graphics2D graphics, final Color color) {
- graphics.setColor(color);
- graphics.fillOval(1, 1, getWidth() - 2, getHeight() - 2);
- }
-
- @Override
- public void paintDragOver(final Graphics2D graphics) {
- final int draggedOver = getDraggedOver();
- if (draggedOver == NodeView.DRAGGED_OVER_SON) {
- graphics.setPaint(new GradientPaint(getWidth() / 4, 0, getNodeView().getMap().getBackground(),
- getWidth() * 3 / 4, 0, NodeView.dragColor));
- graphics.fillRect(getWidth() / 4, 0, getWidth() - 1, getHeight() - 1);
- }
- else if (draggedOver == NodeView.DRAGGED_OVER_SON_LEFT) {
- graphics.setPaint(new GradientPaint(getWidth() * 3 / 4, 0, getNodeView().getMap().getBackground(),
- getWidth() / 4, 0, NodeView.dragColor));
- graphics.fillRect(0, 0, getWidth() * 3 / 4, getHeight() - 1);
- }
- }
-
- @Override
- public void setDraggedOver(final Point p) {
- setDraggedOver((dropLeft(p.getX())) ? NodeView.DRAGGED_OVER_SON_LEFT : NodeView.DRAGGED_OVER_SON);
- }
-
- private static Insets insets = new Insets(4, 4, 4, 4);
-
- @Override
- public Insets getInsets() {
- return RootMainView.insets;
- }
-
- @Override
- public Insets getInsets(Insets insets) {
- return RootMainView.insets;
- }
- @Override
- public Point getConnectorPoint(Point p) {
- final MainView mainView = this;
- if (USE_COMMON_OUT_POINT_FOR_ROOT_NODE) {
- return super.getConnectorPoint(p);
- }
- final double nWidth = mainView.getWidth() / 2f;
- final double nHeight = mainView.getHeight() / 2f;
- int dx = Math.max(Math.abs(p.x - mainView.getWidth()/2), getNodeView().getZoomed(LocationModel.HGAP));
- if(p.x < mainView.getWidth()/2)
- dx = -dx;
- double angle = Math.atan((p.y - nHeight) / dx);
- if (dx < 0) {
- angle += Math.PI;
- }
- final Point out = new Point((int) ((1f + Math.cos(angle)) * nWidth), (int) ((1f + Math.sin(angle)) * nHeight));
- return out;
- }
-
- @Override
- public boolean isInDragRegion(Point p) {
- return false;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/SelectableLayout.java b/freeplane/src/org/freeplane/view/swing/map/SelectableLayout.java
deleted file mode 100644
index ebdce9c..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/SelectableLayout.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.LayoutManager;
-
-import org.freeplane.features.styles.MapViewLayout;
-
-/**
- * @author Dimitry Polivaev
- * 29.08.2009
- */
-public class SelectableLayout implements INodeViewLayout {
- static final SelectableLayout selectableLayoutInstance = new SelectableLayout();
-
- public void addLayoutComponent(final String name, final Component comp) {
- }
-
- public void layoutContainer(final Container parent) {
- getLayout(parent).layoutContainer(parent);
- }
-
- public Dimension minimumLayoutSize(final Container parent) {
- return getLayout(parent).minimumLayoutSize(parent);
- }
-
- public Dimension preferredLayoutSize(final Container parent) {
- return getLayout(parent).preferredLayoutSize(parent);
- }
-
- public void removeLayoutComponent(final Component comp) {
- }
-
- private INodeViewLayout getLayout(final Container parent) {
- final NodeView view = (NodeView) parent;
- MapView map = view.getMap();
- final MapViewLayout layoutType = map.getLayoutType();
- if (layoutType == MapViewLayout.OUTLINE) {
- return OutlineLayout.getInstance();
- }
- final NodeViewLayoutAdapter layout;
- if (view.isRoot()) {
- layout = VerticalRootNodeViewLayout.getInstance();
- }
- else {
- if (view.isLeft()) {
- layout = LeftNodeViewLayout.getInstance();
- }
- else {
- layout = RightNodeViewLayout.getInstance();
- }
- }
- return layout;
- }
-
- static LayoutManager getInstance() {
- return selectableLayoutInstance;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/VerticalRootNodeViewLayout.java b/freeplane/src/org/freeplane/view/swing/map/VerticalRootNodeViewLayout.java
deleted file mode 100644
index 4a29207..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/VerticalRootNodeViewLayout.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-/**
- * @author Dimitry Polivaev
- */
-public class VerticalRootNodeViewLayout extends NodeViewLayoutAdapter {
- static private VerticalRootNodeViewLayout instance = null;
-
- static VerticalRootNodeViewLayout getInstance() {
- if (VerticalRootNodeViewLayout.instance == null) {
- VerticalRootNodeViewLayout.instance = new VerticalRootNodeViewLayout();
- }
- return VerticalRootNodeViewLayout.instance;
- }
-
- @Override
- protected void layout() {
- final LayoutData layoutData = new LayoutData(getChildCount());
- calcLayout(true, layoutData);
- calcLayout(false, layoutData);
- placeChildren(layoutData);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/ViewLayoutTypeAction.java b/freeplane/src/org/freeplane/view/swing/map/ViewLayoutTypeAction.java
deleted file mode 100644
index 7ece93a..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/ViewLayoutTypeAction.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapViewLayout;
-
-/**
- * @author Dimitry Polivaev
- * 29.08.2009
- */
- at SelectableAction(checkOnPopup = true)
-public class ViewLayoutTypeAction extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- /**
- *
- */
- private final MapViewLayout layoutType;
-
- public ViewLayoutTypeAction(final MapViewLayout layoutType) {
- super("ViewLayoutTypeAction." + layoutType.toString());
- this.layoutType = layoutType;
- }
-
- public void actionPerformed(final ActionEvent e) {
- final MapView map = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
- if (isSelected()) {
- map.setLayoutType(MapViewLayout.MAP);
- setSelected(false);
- }
- else {
- map.setLayoutType(layoutType);
- setSelected(true);
- }
- final MapStyle mapStyle = (MapStyle) map.getModeController().getExtension(MapStyle.class);
- mapStyle.setMapViewLayout(map.getModel(), map.getLayoutType());
- map.anchorToSelected(map.getSelected(), 0.5f, 0.5f);
- final NodeView root = map.getRoot();
- invalidate(root);
- root.revalidate();
- }
-
- private void invalidate(final Component c) {
- c.invalidate();
- if(! (c instanceof Container))
- return;
- Container c2 = (Container) c;
- for(int i = 0; i < c2.getComponentCount(); i++)
- invalidate(c2.getComponent(i));
- }
-
- @Override
- public void setSelected() {
- final MapView map = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
- setSelected(map != null && map.getLayoutType() == layoutType);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/ZoomableLabel.java b/freeplane/src/org/freeplane/view/swing/map/ZoomableLabel.java
deleted file mode 100644
index 723e411..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/ZoomableLabel.java
+++ /dev/null
@@ -1,213 +0,0 @@
-package org.freeplane.view.swing.map;
-
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.image.BufferedImage;
-import java.security.AccessControlException;
-
-import javax.swing.Icon;
-import javax.swing.JLabel;
-import javax.swing.SwingUtilities;
-import javax.swing.plaf.basic.BasicHTML;
-import javax.swing.text.View;
-import javax.swing.text.html.HTMLDocument;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-
- at SuppressWarnings("serial")
-public class ZoomableLabel extends JLabel {
- public static final String TEXT_RENDERING_ICON = "TextRenderingIcon";
-
- protected static final Graphics2D fmg;
- static {
- fmg = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB).createGraphics();
- fmg.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
- }
-
- public int getIconWidth() {
- final Icon icon = getIcon();
- if (icon == null) {
- return 0;
- }
- return getMap().getZoomed(icon.getIconWidth());
- }
-
- public NodeView getNodeView() {
- return (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, this);
- }
-
-
- final public Dimension getPreferredSize() {
- return getPreferredSize(Integer.MAX_VALUE);
- }
-
- public Dimension getPreferredSize(int maximumWidth) {
- if (isPreferredSizeSet()) {
- Dimension preferredSize = super.getPreferredSize();
- return preferredSize;
- }
- return ((ZoomableLabelUI)getUI()).getPreferredSize(this, maximumWidth);
- }
-
- protected float getZoom() {
- final float zoom = getMap().getZoom();
- return zoom;
- }
-
- protected MapView getMap() {
- return getNodeView().getMap();
- }
-
- @Override
- public void paint(final Graphics g) {
- switch (getMap().getPaintingMode()) {
- case CLOUDS:
- return;
- }
- super.paint(g);
- }
-
- protected void updateText(String text) {
- try{
- updateTextUnsafe(text);
- }
- catch (Exception e1) {
- if(e1 instanceof AccessControlException)
- LogUtils.warn(e1.getMessage());
- else
- LogUtils.severe(e1);
- final String localizedMessage = e1.getLocalizedMessage();
- if(text.length() > 603)
- text = text.substring(0, 600) + "...";
- try{
- updateTextUnsafe(localizedMessage + '\n' + text);
- }
- catch (Exception e2){
- }
- }
- }
-
- private void updateTextUnsafe(String nodeText) throws Exception{
- final NodeView node = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, this);
- final MapView map = node.getMap();
- if (map == null || nodeText == null) {
- return;
- }
- final boolean isHtml = nodeText.startsWith("<html>");
- boolean widthMustBeRestricted = false;
- boolean isLong = false;
- final ModeController modeController = map.getModeController();
- final NodeStyleController nsc = NodeStyleController.getController(modeController);
- final int maxNodeWidth = nsc.getMaxWidth(node.getModel());
- if (!isHtml) {
- final String[] lines = nodeText.split("\n");
- for (int line = 0; line < lines.length; line++) {
- setText(lines[line]);
- widthMustBeRestricted = getPreferredSize().width > map.getZoomed(maxNodeWidth);
- if (widthMustBeRestricted) {
- break;
- }
- }
- isLong = widthMustBeRestricted || lines.length > 1;
- }
- if (isHtml) {
- if (nodeText.indexOf("<img") >= 0 && nodeText.indexOf("<base ") < 0) {
- nodeText = "<html><base href=\"" + map.getModel().getURL() + "\">" + nodeText.substring(6);
- }
- final String htmlLongNodeHead = ResourceController.getResourceController().getProperty(
- "html_long_node_head");
- if (htmlLongNodeHead != null && !htmlLongNodeHead.equals("")) {
- if (nodeText.matches("(?ims).*<head>.*")) {
- nodeText = nodeText.replaceFirst("(?ims).*<head>.*", "<head>" + htmlLongNodeHead);
- }
- else {
- nodeText = nodeText.replaceFirst("(?ims)<html>", "<html><head>" + htmlLongNodeHead + "</head>");
- }
- }
- setText(nodeText);
- }
- else if (nodeText.startsWith("<table>")) {
- final String[] lines = nodeText.split("\n");
- lines[0] = lines[0].substring(7);
- final int startingLine = lines[0].matches("\\s*") ? 1 : 0;
- String text = "<html><table border=1 style=\"border-color: white\">";
- for (int line = startingLine; line < lines.length; line++) {
- text += "<tr><td style=\"border-color: white;\">"
- + HtmlUtils.toXMLEscapedText(lines[line])
- .replaceAll("\t", "<td style=\"border-color: white\">");
- }
- setText(text);
- }
- else if (isLong) {
- String text = HtmlUtils.plainToHTML(nodeText);
- setText(text);
- }
- else {
- setText(nodeText);
- }
- }
-
- public ZoomableLabel() {
- setUI(ZoomableLabelUI.createUI(this));
- }
-
- @Override
- public void updateUI() {
- }
-
- @Override
- public FontMetrics getFontMetrics(final Font font) {
- if (!useFractionalMetrics()) {
- return super.getFontMetrics(font);
- }
- fmg.setFont(font);
- final FontMetrics fontMetrics = fmg.getFontMetrics();
- return fontMetrics;
- }
-
- protected boolean useFractionalMetrics() {
- final MapView map = getMap();
- if (map.isPrinting()) {
- return true;
- }
- final float zoom = map.getZoom();
- return 1f != zoom;
- }
-
- protected FontMetrics getFontMetrics() {
- if (!useFractionalMetrics()) {
- return super.getFontMetrics(getFont());
- }
- fmg.setFont(getFont());
- final FontMetrics fontMetrics = fmg.getFontMetrics();
- return fontMetrics;
- }
-
- public String getLink(Point p){
- View view = (View)getClientProperty(BasicHTML.propertyKey);
- if(view == null)
- return null;
- Rectangle textR = ((ZoomableLabelUI)getUI()).getTextR(this);
- if(textR == null)
- return null;
- if(!textR.contains(p))
- return null;
- int x = (int) (p.x / getZoom());
- int y = (int) (p.y / getZoom());
- final int pos = view.viewToModel(x, y, textR);
- final HTMLDocument document = (HTMLDocument) view.getDocument();
- final String linkURL = HtmlUtils.getURLOfExistingLink(document, pos);
- return linkURL;
- }
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/ZoomableLabelUI.java b/freeplane/src/org/freeplane/view/swing/map/ZoomableLabelUI.java
deleted file mode 100644
index 628ee3c..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/ZoomableLabelUI.java
+++ /dev/null
@@ -1,464 +0,0 @@
-package org.freeplane.view.swing.map;
-
-import java.awt.Dimension;
-import java.awt.FontMetrics;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Insets;
-import java.awt.Rectangle;
-import java.awt.RenderingHints;
-import java.awt.geom.AffineTransform;
-import java.beans.PropertyChangeEvent;
-import javax.swing.Icon;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.SwingUtilities;
-import javax.swing.plaf.ComponentUI;
-import javax.swing.plaf.basic.BasicHTML;
-import javax.swing.plaf.basic.BasicLabelUI;
-import javax.swing.text.View;
-
-import org.freeplane.core.ui.components.html.ScaledHTML;
-import org.freeplane.core.util.TextUtils;
-
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-/**
- * @author Dimitry Polivaev
- * 23.08.2009
- */
-public class ZoomableLabelUI extends BasicLabelUI {
- private boolean isPainting = false;
-
- static ZoomableLabelUI labelUI = new ZoomableLabelUI();
- private Rectangle iconR = new Rectangle();
- private Rectangle textR = new Rectangle();
- private Rectangle viewR = new Rectangle();
-
- private int maximumWidth = Integer.MAX_VALUE;
-
-
- public Dimension getPreferredSize(final ZoomableLabel c, int maximumWidth) {
- try{
- this.maximumWidth = maximumWidth;
- final Dimension preferredSize = getPreferredSize(c);
- return preferredSize;
- }
- finally{
- this.maximumWidth = Integer.MAX_VALUE;
- }
-
- }
-
- @Override
- public Dimension getPreferredSize(final JComponent c) {
- final Dimension preferredSize = super.getPreferredSize(c);
- final int fontHeight = ((ZoomableLabel) c).getFontMetrics().getHeight();
- final Insets insets = c.getInsets();
- preferredSize.width = Math.max(preferredSize.width, fontHeight/2 + insets.left + insets.right);
- preferredSize.height = Math.max(preferredSize.height, fontHeight + insets.top + insets.bottom);
- final float zoom = ((ZoomableLabel) c).getZoom();
- if (zoom != 1f) {
- preferredSize.width = (int) (Math.ceil(zoom * preferredSize.width));
- preferredSize.height = (int) (Math.ceil(zoom * preferredSize.height));
- }
- return preferredSize;
- }
-
- public static ComponentUI createUI(final JComponent c) {
- return labelUI;
- }
-
- @Override
- protected String layoutCL(final JLabel label, final FontMetrics fontMetrics, final String text, final Icon icon,
- final Rectangle viewR, final Rectangle iconR, final Rectangle textR) {
- final ZoomableLabel zLabel = (ZoomableLabel) label;
- if (isPainting) {
- final Insets insets = zLabel.getInsets();
- final int width = zLabel.getWidth();
- final int height = zLabel.getHeight();
- final float zoom = zLabel.getZoom();
- viewR.x = insets.left;
- viewR.y = insets.top;
- viewR.width = (int) (width / zoom) - (insets.left + insets.right);
- viewR.height = (int)(height / zoom) - (insets.top + insets.bottom);
- if(viewR.width < 0)
- viewR.width = 0;
- ScaledHTML.Renderer v = (ScaledHTML.Renderer) label.getClientProperty(BasicHTML.propertyKey);
- if (v != null) {
- float preferredWidth = v.getPreferredSpan(View.X_AXIS);
- int textWidth = viewR.width;
- if(icon != null)
- textWidth -= icon.getIconWidth() + label.getIconTextGap();
- if(preferredWidth < textWidth){
- v.setSize(textWidth, 1);
- super.layoutCL(zLabel, zLabel.getFontMetrics(), text, icon, viewR, iconR, textR);
- v.setSize(textR.width, textR.height);
- return text;
- }
- }
- }
- else if(maximumWidth != Integer.MAX_VALUE){
- final Insets insets = label.getInsets();
- viewR.width = maximumWidth - insets.left - insets.right;
- if(viewR.width < 0)
- viewR.width = 0;
- ScaledHTML.Renderer v = (ScaledHTML.Renderer) label.getClientProperty(BasicHTML.propertyKey);
- if (v != null) {
- v.resetSize();
- float preferredWidth = v.getPreferredSpan(View.X_AXIS);
- float minimumWidth = v.getMinimumSpan(View.X_AXIS);
- int textWidth = viewR.width;
- if(icon != null)
- textWidth -= icon.getIconWidth() + label.getIconTextGap();
- if(preferredWidth > textWidth){
- if(minimumWidth > textWidth){
- viewR.width += minimumWidth - textWidth;
- textWidth = (int) minimumWidth;
- }
- v.setSize(textWidth, 1);
- super.layoutCL(zLabel, zLabel.getFontMetrics(), text, icon, viewR, iconR, textR);
- v.setSize(textR.width, textR.height);
- return text;
- }
- }
- }
- Icon textRenderingIcon = getTextRenderingIcon(zLabel);
- if(textRenderingIcon != null){
- layoutLabelWithTextIcon(textRenderingIcon, icon, viewR, iconR, textR, zLabel);
- }
- else
- super.layoutCL(zLabel, zLabel.getFontMetrics(), text, icon, viewR, iconR, textR);
- return text;
- }
-
- static private void layoutLabelWithTextIcon(final Icon textRenderingIcon, final Icon icon,
- final Rectangle viewR, final Rectangle iconR,
- final Rectangle textR, final ZoomableLabel zLabel) {
- JComponent c = (JComponent) zLabel;
- int horizontalAlignment = zLabel.getHorizontalAlignment();
- int horizontalTextPosition = zLabel.getHorizontalTextPosition();
- boolean orientationIsLeftToRight = true;
- int hAlign = horizontalAlignment;
- int hTextPos = horizontalTextPosition;
-
- if (c != null) {
- if (!(c.getComponentOrientation().isLeftToRight())) {
- orientationIsLeftToRight = false;
- }
- }
-
- // Translate LEADING/TRAILING values in horizontalAlignment
- // to LEFT/RIGHT values depending on the components orientation
- switch (horizontalAlignment) {
- case SwingUtilities.LEADING:
- hAlign = (orientationIsLeftToRight) ? SwingUtilities.LEFT : SwingUtilities.RIGHT;
- break;
- case SwingUtilities.TRAILING:
- hAlign = (orientationIsLeftToRight) ? SwingUtilities.RIGHT : SwingUtilities.LEFT;
- break;
- }
-
- // Translate LEADING/TRAILING values in horizontalTextPosition
- // to LEFT/RIGHT values depending on the components orientation
- switch (horizontalTextPosition) {
- case SwingUtilities.LEADING:
- hTextPos = (orientationIsLeftToRight) ? SwingUtilities.LEFT : SwingUtilities.RIGHT;
- break;
- case SwingUtilities.TRAILING:
- hTextPos = (orientationIsLeftToRight) ? SwingUtilities.RIGHT : SwingUtilities.LEFT;
- break;
- }
- int verticalAlignment = zLabel.getVerticalAlignment();
- int verticalTextPosition = zLabel.getVerticalTextPosition();
- if (icon != null) {
- iconR.width = icon.getIconWidth();
- iconR.height = icon.getIconHeight();
- }
- else {
- iconR.width = iconR.height = 0;
- }
-
- /* Initialize the text bounds rectangle textR. If a null
- * or and empty String was specified we substitute "" here
- * and use 0,0,0,0 for textR.
- */
-
- int lsb = 0;
- int rsb = 0;
- /* Unless both text and icon are non-null, we effectively ignore
- * the value of textIconGap.
- */
- int gap;
-
- int availTextWidth;
- gap = (icon == null) ? 0 : zLabel.getIconTextGap();
-
- if (hTextPos == SwingUtilities.CENTER) {
- availTextWidth = viewR.width;
- }
- else {
- availTextWidth = viewR.width - (iconR.width + gap);
- }
- textR.width = Math.min(availTextWidth, textRenderingIcon.getIconWidth());
- textR.height = textRenderingIcon.getIconHeight();
-
-
- /* Compute textR.x,y given the verticalTextPosition and
- * horizontalTextPosition properties
- */
-
- if (verticalTextPosition == SwingUtilities.TOP) {
- if (hTextPos != SwingUtilities.CENTER) {
- textR.y = 0;
- }
- else {
- textR.y = -(textR.height + gap);
- }
- }
- else if (verticalTextPosition == SwingUtilities.CENTER) {
- textR.y = (iconR.height / 2) - (textR.height / 2);
- }
- else { // (verticalTextPosition == BOTTOM)
- if (hTextPos != SwingUtilities.CENTER) {
- textR.y = iconR.height - textR.height;
- }
- else {
- textR.y = (iconR.height + gap);
- }
- }
-
- if (hTextPos == SwingUtilities.LEFT) {
- textR.x = -(textR.width + gap);
- }
- else if (hTextPos == SwingUtilities.CENTER) {
- textR.x = (iconR.width / 2) - (textR.width / 2);
- }
- else { // (horizontalTextPosition == RIGHT)
- textR.x = (iconR.width + gap);
- }
-
- /* labelR is the rectangle that contains iconR and textR.
- * Move it to its proper position given the labelAlignment
- * properties.
- *
- * To avoid actually allocating a Rectangle, Rectangle.union
- * has been inlined below.
- */
- int labelR_x = Math.min(iconR.x, textR.x);
- int labelR_width = Math.max(iconR.x + iconR.width,
- textR.x + textR.width) - labelR_x;
- int labelR_y = Math.min(iconR.y, textR.y);
- int labelR_height = Math.max(iconR.y + iconR.height,
- textR.y + textR.height) - labelR_y;
-
- int dx, dy;
-
- if (verticalAlignment == SwingUtilities.TOP) {
- dy = viewR.y - labelR_y;
- }
- else if (verticalAlignment == SwingUtilities.CENTER) {
- dy = (viewR.y + (viewR.height / 2)) - (labelR_y + (labelR_height / 2));
- }
- else { // (verticalAlignment == BOTTOM)
- dy = (viewR.y + viewR.height) - (labelR_y + labelR_height);
- }
-
- if (hAlign == SwingUtilities.LEFT) {
- dx = viewR.x - labelR_x;
- }
- else if (hAlign == SwingUtilities.RIGHT) {
- dx = (viewR.x + viewR.width) - (labelR_x + labelR_width);
- }
- else { // (horizontalAlignment == CENTER)
- dx = (viewR.x + (viewR.width / 2)) -
- (labelR_x + (labelR_width / 2));
- }
-
- /* Translate textR and glypyR by dx,dy.
- */
-
- textR.x += dx;
- textR.y += dy;
-
- iconR.x += dx;
- iconR.y += dy;
-
- if (lsb < 0) {
- // lsb is negative. Shift the x location so that the text is
- // visually drawn at the right location.
- textR.x -= lsb;
-
- textR.width += lsb;
- }
- if (rsb > 0) {
- textR.width -= rsb;
- }
- }
-
- @Override
- public void paint(final Graphics g, final JComponent label) {
- final ZoomableLabel mainView = (ZoomableLabel) label;
- if (!mainView.useFractionalMetrics()) {
- try {
- isPainting = true;
- superPaintSafe(g, mainView);
- }
- finally {
- isPainting = false;
- }
- return;
- }
- final Graphics2D g2 = (Graphics2D) g;
- final Object oldRenderingHintFM = g2.getRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS);
- final Object newRenderingHintFM = RenderingHints.VALUE_FRACTIONALMETRICS_ON;
- if (oldRenderingHintFM != newRenderingHintFM) {
- g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, newRenderingHintFM);
- }
- final AffineTransform transform = g2.getTransform();
- final float zoom = mainView.getZoom() * 0.97f;
- g2.scale(zoom, zoom);
- final boolean htmlViewSet = null != label.getClientProperty(BasicHTML.propertyKey);
- try {
- isPainting = true;
- if(htmlViewSet){
- GlyphPainterMetricResetter.resetPainter();
- }
- superPaintSafe(g, mainView);
- }
- finally {
- isPainting = false;
- if(htmlViewSet){
- GlyphPainterMetricResetter.resetPainter();
- }
- }
- g2.setTransform(transform);
- if (oldRenderingHintFM != newRenderingHintFM) {
- g2.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, oldRenderingHintFM != null ? oldRenderingHintFM
- : RenderingHints.VALUE_FRACTIONALMETRICS_DEFAULT);
- }
- }
-
- // Workaround for http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7126361
- private void superPaintSafe(final Graphics g, final ZoomableLabel label) {
- try {
- Icon textRenderingIcon = getTextRenderingIcon(label);
- if(textRenderingIcon != null)
- paintIcons(g, label, textRenderingIcon);
- else
- super.paint(g, label);
- } catch (ClassCastException e) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- label.setText(TextUtils.format("html_problem", label.getText()));
- }
- });
- }
- }
-
- private void paintIcons(Graphics g, ZoomableLabel label, Icon textRenderingIcon) {
- Icon icon = (label.isEnabled()) ? label.getIcon() : label.getDisabledIcon();
- Rectangle paintViewR = new Rectangle();
- Rectangle paintIconR = new Rectangle();
- Rectangle paintTextR = new Rectangle();
- layoutCL(label, null, null, icon, paintViewR, paintIconR, paintTextR);
- if (icon != null) {
- icon.paintIcon(label, g, paintIconR.x, paintIconR.y);
- }
- textRenderingIcon.paintIcon(label, g, paintTextR.x, paintTextR.y);
- }
-
- @Override
- public void propertyChange(PropertyChangeEvent e) {
- String name = e.getPropertyName();
- if (name == "text" || "font" == name || "foreground" == name) {
- JLabel lbl = ((JLabel) e.getSource());
- if(getTextRenderingIcon(lbl) != null){
- ScaledHTML.updateRenderer(lbl, "");
- }
- else{
- String text = lbl.getText();
- GlyphPainterMetricResetter.resetPainter();
- try {
- ScaledHTML.updateRenderer(lbl, text);
- }
- finally{
- GlyphPainterMetricResetter.resetPainter();
- }
- View v = (View) lbl.getClientProperty(BasicHTML.propertyKey);
- if (v != null) {
- lbl.putClientProperty("preferredWidth", v.getPreferredSpan(View.X_AXIS));
- }
- }
- }
- else
- super.propertyChange(e);
-
- }
-
- private Icon getTextRenderingIcon(JLabel lbl) {
- return (Icon) lbl.getClientProperty(ZoomableLabel.TEXT_RENDERING_ICON);
- }
-
- @Override
- protected void installComponents(JLabel c) {
- ScaledHTML.updateRenderer(c, c.getText());
- c.setInheritsPopupMenu(true);
- }
-
- public Rectangle getIconR(ZoomableLabel label) {
- layout(label);
- return iconR;
- }
-
- public Rectangle getTextR(ZoomableLabel label) {
- layout(label);
- return textR;
- }
-
- private void layout(ZoomableLabel label) {
- String text = label.getText();
- if(text == null || text.equals(""))
- text = "!";
- Icon icon = (label.isEnabled()) ? label.getIcon() :
- label.getDisabledIcon();
- boolean wasPainting = isPainting;
- try{
- isPainting = true;
- iconR.x = iconR.y = iconR.width = iconR.height = 0;
- textR.x = textR.y = textR.width = textR.height = 0;
- layoutCL(label, label.getFontMetrics(), text, icon, viewR, iconR,textR);
- final float zoom = label.getZoom();
- iconR.x = (int)(iconR.x * zoom);
- iconR.y = (int)(iconR.y * zoom);
- iconR.width = (int)(iconR.width * zoom);
- iconR.height = (int)(iconR.height * zoom);
- textR.x = (int)(textR.x * zoom);
- textR.y = (int)(textR.y * zoom);
- textR.width = (int)(textR.width * zoom);
- textR.height = (int)(textR.height * zoom);
- }
- finally{
- isPainting = wasPainting;
- }
- }
-
-
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributePanelManager.java b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributePanelManager.java
deleted file mode 100644
index c4485c7..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributePanelManager.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.attribute;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JPanel;
-import javax.swing.border.TitledBorder;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.FormattedFormula;
-import org.freeplane.features.format.FormattedObject;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.format.PatternFormat;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.INodeSelectionListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- * @author Dimitry Polivaev
- * Jan 9, 2011
- */
-public class AttributePanelManager{
- final private JPanel tablePanel;
- private ModeController modeController;
- private int axis = BoxLayout.Y_AXIS;
- private class TableCreator implements INodeSelectionListener, INodeChangeListener{
-
- private AttributeView attributeView;
- private JComboBox formatChooser;
-
- public void onDeselect(NodeModel node) {
- removeOldView();
- }
-
- private void removeOldView() {
- if(attributeView != null){
- tablePanel.removeAll();
- tablePanel.revalidate();
- tablePanel.repaint();
- attributeView.viewRemoved();
- attributeView = null;
- }
- }
-
- public void onSelect(NodeModel node) {
- removeOldView();
- final NodeView nodeView = (NodeView) Controller.getCurrentController()
- .getMapViewManager().getSelectedComponent();
- if (nodeView == null)
- return;
- AttributeController.getController(modeController).createAttributeTableModel(node);
- attributeView = new AttributeView(nodeView, false);
- Box buttonBox = new Box(axis);
- buttonBox.setAlignmentX(0.5f);
- tablePanel.add(buttonBox);
- Dimension btnSize = new Dimension();
- {
- final JButton newAttributeButton = new JButton(TextUtils.getText("attributes_popup_new"));
- newAttributeButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent arg0) {
- attributeView.addRow();
- }
- });
- increaseSize(btnSize, newAttributeButton);
- buttonBox.add(newAttributeButton);
- }
- {
- final JButton optimalWidthButton = new JButton(TextUtils.getText("attributes_popup_optimal_width"));
- optimalWidthButton.addActionListener(new ActionListener() {
- public void actionPerformed(final ActionEvent arg0) {
- attributeView.setOptimalColumnWidths();
- }
- });
- increaseSize(btnSize, optimalWidthButton);
- buttonBox.add(optimalWidthButton);
- }
- {
- formatChooser = createFormatChooser();
- formatChooser.setEnabled(false);
- increaseSize(btnSize, formatChooser);
- buttonBox.add(formatChooser);
- }
- for (int i = 0; i < buttonBox.getComponentCount(); i++) {
- buttonBox.getComponent(i).setMaximumSize(btnSize);
- }
- formatChooser.addItemListener(new ItemListener() {
- boolean handlingEvent = false;
-
- public void itemStateChanged(final ItemEvent e) {
- if (handlingEvent || !formatChooser.isEnabled() || e.getStateChange() != ItemEvent.SELECTED)
- return;
- handlingEvent = true;
- final PatternFormat newFormat = toPatternFormat(e.getItem());
- final AttributeTable table = attributeView.getAttributeTable();
- if (table.getSelectedColumn() == 1 && table.getSelectedRow() != -1) {
- final Object value = table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
- LogUtils.info("value geändert: " + value + " of class "
- + (value == null ? null : value.getClass()) + ", format='" + newFormat + "'");
- try {
- final Object newValue = formatValue(newFormat, table, value);
- if (newValue != null)
- table.setValueAt(newValue, table.getSelectedRow(), table.getSelectedColumn());
- }
- catch (Exception e2) {
- Controller.getCurrentController().getViewController()
- .out("Pattern is not applicable: " + e2.getMessage());
- LogUtils.warn("pattern is not applicable", e2);
- }
- }
- handlingEvent = false;
- }
-
- public PatternFormat toPatternFormat(Object value) {
- if (value instanceof PatternFormat)
- return (PatternFormat) value;
- final PatternFormat patternFormat = PatternFormat.guessPatternFormat(value.toString());
- return (patternFormat == null) ? PatternFormat.getIdentityPatternFormat() : patternFormat;
- }
-
- private Object formatValue(final PatternFormat newFormat, final AttributeTable table,
- final Object objectToBeFormatted) {
- if (formatChooser.getSelectedItem() == null)
- return null;
- if (objectToBeFormatted instanceof IFormattedObject) {
- final Object actualObject = ((IFormattedObject) objectToBeFormatted).getObject();
- if(actualObject != objectToBeFormatted)
- return formatValue(newFormat, table, actualObject);
- }
- if (newFormat == PatternFormat.getIdentityPatternFormat())
- return makeFormattedObjectForIdentityFormat(objectToBeFormatted);
- if (objectToBeFormatted instanceof String && ((String) objectToBeFormatted).startsWith("="))
- return new FormattedFormula((String) objectToBeFormatted, newFormat.getPattern());
- return newFormat.formatObject(objectToBeFormatted);
- }
-
- private FormattedObject makeFormattedObjectForIdentityFormat(final Object objectToBeFormatted) {
- return new FormattedObject(String.valueOf(objectToBeFormatted), PatternFormat.IDENTITY_PATTERN);
- }
- });
-
- attributeView.addTableSelectionListener(new ListSelectionListener() {
- public void valueChanged(final ListSelectionEvent event) {
- // update format chooser
- if (!event.getValueIsAdjusting()) {
- setSelectedFormatItem();
- }
- }
- });
- tablePanel.add(Box.createVerticalStrut(5));
- JComponent c = attributeView.getContainer();
- c.setAlignmentX(0.5f);
- tablePanel.add(c);
- tablePanel.add(Box.createGlue());
- tablePanel.revalidate();
- tablePanel.repaint();
- }
-
- private void setSelectedFormatItem() {
- final AttributeTable table = attributeView.getAttributeTable();
- if (table.getSelectedColumn() == 1 && table.getSelectedRow() != -1) {
- formatChooser.setEnabled(true);
- final Object value = table.getValueAt(table.getSelectedRow(), table.getSelectedColumn());
- if (value instanceof IFormattedObject) {
- final String format = ((IFormattedObject) value).getPattern();
- formatChooser.setSelectedItem(PatternFormat.guessPatternFormat(format));
- }
- else {
- formatChooser.setSelectedItem(null);
- }
- }
- else {
- formatChooser.setEnabled(false);
- }
- }
-
- private JComboBox createFormatChooser() {
- final List<PatternFormat> formats = FormatController.getController().getAllFormats();
- Vector<PatternFormat> items = new Vector<PatternFormat>(formats);
- for(int i = items.size()-1; i >= 0; i--){
- if(! items.get(i).canFormat(NodeAttributeTableModel.class))
- items.remove(i);
- }
- final JComboBox formatChooser = new JComboBox(items);
- formatChooser.setEditable(true);
- formatChooser.setSelectedItem(null);
- final String NODE_FORMAT = "OptionPanel.nodeformat"; // duplicated from StyleEditorPanel
- formatChooser.setToolTipText(TextUtils.getRawText(NODE_FORMAT + ".tooltip"));
- formatChooser.setAlignmentX(Component.LEFT_ALIGNMENT);
- formatChooser.setBorder(new TitledBorder(TextUtils.getText("value_format")));
- return formatChooser;
- }
-
- private void increaseSize(final Dimension btnSize, final JComponent comp) {
- final Dimension preferredSize = comp.getPreferredSize();
- btnSize.width = Math.max(btnSize.width, preferredSize.width);
- btnSize.height = Math.max(btnSize.height, preferredSize.height);
- }
-
- public void nodeChanged(NodeChangeEvent event) {
- if(attributeView != null && event.getProperty().equals(NodeAttributeTableModel.class)){
- setSelectedFormatItem();
- attributeView.update();
- }
- }
- }
-
- public AttributePanelManager(final ModeController modeController){
- this.modeController = modeController;
- tablePanel = new JPanel();
- tablePanel.setMinimumSize(new Dimension(0, 0));
- tablePanel.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
- tablePanel.setAlignmentX(JComponent.CENTER_ALIGNMENT);
- tablePanel.setLayout(new BoxLayout(tablePanel, axis));
- final TableCreator tableCreator = new TableCreator();
- final MapController mapController = modeController.getMapController();
- mapController.addNodeSelectionListener(tableCreator);
- mapController.addNodeChangeListener(tableCreator);
- }
- public JPanel getTablePanel() {
- return tablePanel;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTable.java b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTable.java
deleted file mode 100644
index 1964337..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTable.java
+++ /dev/null
@@ -1,900 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.attribute;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.EventQueue;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.KeyboardFocusManager;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.awt.event.HierarchyEvent;
-import java.awt.event.HierarchyListener;
-import java.awt.event.InputEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.net.URI;
-import java.util.EventObject;
-
-import javax.swing.AbstractCellEditor;
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultCellEditor;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.Icon;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JFrame;
-import javax.swing.JOptionPane;
-import javax.swing.JTable;
-import javax.swing.KeyStroke;
-import javax.swing.SwingUtilities;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.TableModelEvent;
-import javax.swing.table.JTableHeader;
-import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.table.TableColumnModel;
-import javax.swing.table.TableModel;
-
-import org.freeplane.core.ui.components.TypedListCellRenderer;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.attribute.AttributeRegistry;
-import org.freeplane.features.attribute.AttributeTableLayoutModel;
-import org.freeplane.features.attribute.ColumnWidthChangeEvent;
-import org.freeplane.features.attribute.IAttributeTableModel;
-import org.freeplane.features.attribute.IColumnWidthChangeListener;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.format.FormattedObject;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.format.PatternFormat;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.EditNodeBase;
-import org.freeplane.features.text.mindmapmode.EditNodeBase.EditedComponent;
-import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.NodeView;
-
-
-/**
- * @author Dimitry Polivaev
- */
-class AttributeTable extends JTable implements IColumnWidthChangeListener {
- private static final String EDITING_STOPPED = AttributeTable.class.getName() + ".editingStopped";
- private static int CLICK_COUNT_TO_START = 2;
-
- private static final class TableHeaderRendererImpl implements TableCellRenderer {
- final private TableCellRenderer delegate;
- TableHeaderRendererImpl(TableCellRenderer renderer){
- this.delegate = renderer;
- }
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
- int row, int column) {
- final Component c = delegate.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
- final int height = (int) (((AttributeTable)table).getZoom() * 6);
- final Dimension preferredSize = new Dimension(1, height);
- c.setPreferredSize(preferredSize);
- return c;
- }
- }
- @SuppressWarnings("serial")
- private static final class TableHeader extends JTableHeader {
- private TableHeader(TableColumnModel cm) {
- super(cm);
- }
- @Override
- protected TableCellRenderer createDefaultRenderer() {
- return new TableHeaderRendererImpl(super.createDefaultRenderer());
- }
- }
-
- static private class HeaderMouseListener extends MouseAdapter {
- @Override
- public void mouseReleased(final MouseEvent e) {
- final JTableHeader header = (JTableHeader) e.getSource();
- final AttributeTable table = (AttributeTable) header.getTable();
- final float zoom = table.attributeView.getMapView().getZoom();
- final AttributeTableModelDecoratorAdapter model = (AttributeTableModelDecoratorAdapter) table
- .getModel();
- for (int col = 0; col < table.getColumnCount(); col++) {
- final int modelColumnWidth = model.getColumnWidth(col);
- final int currentColumnWidth = (int) (table.getColumnModel().getColumn(col).getWidth() / zoom);
- if (modelColumnWidth != currentColumnWidth) {
- model.setColumnWidth(col, currentColumnWidth);
- }
- }
- }
- }
-
- static private class MyFocusListener implements FocusListener {
- private AttributeTable focusedTable;
-
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.FocusListener#focusGained(java.awt.event.FocusEvent)
- */
- public void focusGained(final FocusEvent event) {
- final Component source = (Component) event.getSource();
- event.getOppositeComponent();
- if (source instanceof AttributeTable) {
- focusedTable = (AttributeTable) source;
- }
- else {
- focusedTable = (AttributeTable) SwingUtilities.getAncestorOfClass(AttributeTable.class, source);
- }
- if(focusedTable != null){
- focusedTable.setSelectedCellTypeInfo();
- }
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- if (focusedTable != null) {
- final Component newNodeViewInFocus = SwingUtilities.getAncestorOfClass(NodeView.class,
- focusedTable);
- if (newNodeViewInFocus != null) {
- final NodeView viewer = (NodeView) newNodeViewInFocus;
- if (viewer != viewer.getMap().getSelected()) {
- viewer.getMap().selectAsTheOnlyOneSelected(viewer, false);
- }
- }
- }
- }
- });
- }
-
- /*
- * (non-Javadoc)
- * @see
- * java.awt.event.FocusListener#focusLost(java.awt.event.FocusEvent)
- */
- public void focusLost(final FocusEvent event) {
- if (event.isTemporary()) {
- return;
- }
- final Component oppositeComponent = event.getOppositeComponent();
- if (oppositeComponent == null) {
- return;
- }
- final Component newTable;
- if (oppositeComponent instanceof AttributeTable) {
- newTable = oppositeComponent;
- }
- else {
- newTable = SwingUtilities.getAncestorOfClass(AttributeTable.class, oppositeComponent);
- }
- if (focusedTable == null) {
- return;
- }
- if (focusedTable != newTable) {
- if (focusedTable.isEditing()) {
- focusedTable.clearSelection();
- focusedTable.getCellEditor().stopCellEditing();
- }
- if (!focusedTable.attributeView.isPopupShown()) {
- final AttributeView attributeView = focusedTable.getAttributeView();
- final String currentAttributeViewType = AttributeRegistry.getRegistry(
- attributeView.getNode().getMap()).getAttributeViewType();
- if (attributeView.getViewType() != currentAttributeViewType) {
- attributeView.stateChanged(null);
- }
- }
- focusedTable = null;
- return;
- }
- }
- }
-
- static private MouseListener componentListener = new HeaderMouseListener();
- static private ComboBoxModel defaultComboBoxModel = null;
- static private AttributeTableCellRenderer dtcr = new AttributeTableCellRenderer();
- private static final int EXTRA_HEIGHT = 4;
- static private MyFocusListener focusListener = new MyFocusListener();
- static private CursorUpdater cursorUpdater = new CursorUpdater();
- private static final int MAX_HEIGTH = 300;
- private static final int MAX_WIDTH = 300;
- private static final long serialVersionUID = 1L;
- private static final float TABLE_ROW_HEIGHT = 4;
-
- static ComboBoxModel getDefaultComboBoxModel() {
- if (AttributeTable.defaultComboBoxModel == null) {
- AttributeTable.defaultComboBoxModel = new DefaultComboBoxModel();
- }
- return AttributeTable.defaultComboBoxModel;
- }
-
- final private AttributeView attributeView;
- private int highRowIndex = 0;
- private static DefaultCellEditor dce;
-
- AttributeTable(final AttributeView attributeView) {
- super();
- this.attributeView = attributeView;
- addFocusListener(AttributeTable.focusListener);
- addMouseListener(AttributeTable.cursorUpdater);
- addMouseMotionListener(AttributeTable.cursorUpdater);
- if (attributeView.getMapView().getModeController().canEdit()) {
- tableHeader.addMouseListener(AttributeTable.componentListener);
- }
- else {
- tableHeader.setResizingAllowed(false);
- }
- setModel(attributeView.getCurrentAttributeTableModel());
- updateFontSize(this, 1F);
- updateColumnWidths();
- setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
- getTableHeader().setReorderingAllowed(false);
- setRowSelectionAllowed(false);
- putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);
- updateRowHeights();
- updateColumnWidths();
- }
-
- @Override
- protected JTableHeader createDefaultTableHeader() {
- return new TableHeader(columnModel);
- }
-
- private void changeSelectedRowHeight(final int rowIndex) {
- if (highRowIndex != rowIndex) {
- if (highRowIndex < getRowCount()) {
- final int h = getRowHeight(highRowIndex);
- setRowHeight(highRowIndex, h - AttributeTable.EXTRA_HEIGHT);
- }
- final int h = getRowHeight(rowIndex);
- setRowHeight(rowIndex, h + AttributeTable.EXTRA_HEIGHT);
- highRowIndex = rowIndex;
- assert highRowIndex >= 0;
- }
- }
-
- @Override
- public void changeSelection(int rowIndex, int columnIndex, final boolean toggle, final boolean extend) {
- final int rowCount = getRowCount();
- if (rowCount == 0) {
- return;
- }
- if (rowIndex >= rowCount) {
- rowIndex = 0;
- columnIndex = 0;
- }
- changeSelectedRowHeight(rowIndex);
- super.changeSelection(rowIndex, columnIndex, toggle, extend);
- }
-
- public void columnWidthChanged(final ColumnWidthChangeEvent event) {
- final float zoom = getZoom();
- final int col = event.getColumnNumber();
- final AttributeTableLayoutModel layoutModel = (AttributeTableLayoutModel) event.getSource();
- final int width = layoutModel.getColumnWidth(col);
- getColumnModel().getColumn(col).setPreferredWidth((int) (width * zoom));
- final MapView map = attributeView.getMapView();
- final NodeModel node = attributeView.getNode();
- map.getModeController().getMapController().nodeChanged(node);
- }
-
- /**
- * @return Returns the currentModel.
- */
- public AttributeTableModelDecoratorAdapter getAttributeTableModel() {
- return (AttributeTableModelDecoratorAdapter) getModel();
- }
-
- public AttributeView getAttributeView() {
- return attributeView;
- }
-
-
-
- @Override
- public boolean editCellAt(int row, int column, EventObject e) {
- if(isEditing() && getCellEditor() instanceof DialogTableCellEditor){
- return false;
- }
- if(column == 1 && e instanceof MouseEvent){
- final MouseEvent me = (MouseEvent) e;
- final Object value = getValueAt(row, column);
- if(value instanceof URI){
- final URI uri = (URI) value;
- final Icon linkIcon = getLinkIcon(uri);
- final int xmax = linkIcon != null ? linkIcon.getIconWidth() : 0;
- final int x = me.getX() - getColumnModel().getColumn(0).getWidth();
- if(x < xmax){
- LinkController.getController().loadURL(attributeView.getNode(), new ActionEvent(me.getSource(), me.getID(), null), uri);
- return false;
- }
- }
- }
- putClientProperty("AttributeTable.EditEvent", e);
- try{
- if(super.editCellAt(row, column, e)){
- final TableCellEditor cellEditor = getCellEditor();
- if(isEditing() && cellEditor instanceof DialogTableCellEditor){
- ((JComponent)editorComp).paintImmediately(0, 0, editorComp.getWidth(), editorComp.getHeight());
- ((DialogTableCellEditor)cellEditor).startEditing();
- return false;
- }
- return true;
- }
- return false;
- }
- finally{
- putClientProperty("AttributeTable.EditEvent", null);
- }
- }
-
- Icon getLinkIcon(final URI uri) {
- NodeModel nodeModel = ((IAttributeTableModel)getModel()).getNode();
- final Icon linkIcon = LinkController.getLinkIcon(uri, nodeModel);
- return linkIcon;
- }
-
- @SuppressWarnings("serial")
- private class DialogTableCellEditor extends AbstractCellEditor implements TableCellEditor{
-
- final private IEditControl editControl;
- private Object value;
- private EditNodeBase editBase;
- public DialogTableCellEditor() {
- super();
- editControl = new IEditControl() {
- public void split(String newText, int position) {
- }
-
- public void ok(String newText) {
- value = newText;
- stopCellEditing();
- }
-
- public void cancel() {
- stopCellEditing();
- }
-
- public boolean canSplit() {
- return false;
- }
-
- public EditedComponent getEditType() {
- return EditedComponent.TEXT;
- }
- };
- }
-
- public IEditControl getEditControl() {
- return editControl;
- }
-
- public void setEditBase(EditNodeBase editBase) {
- this.editBase = editBase;
- }
-
- public Object getCellEditorValue() {
- return value;
- }
-
- public void startEditing(){
- if(editBase == null){
- return;
- }
- final JFrame frame = (JFrame) JOptionPane.getFrameForComponent(AttributeTable.this);
- editBase.show(frame);
- }
-
- public boolean isCellEditable(EventObject anEvent) {
- if (anEvent instanceof MouseEvent) {
- return ((MouseEvent)anEvent).getClickCount() >= CLICK_COUNT_TO_START;
- }
- return true;
- }
- public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
- return new AttributeTableCellRenderer().getTableCellRendererComponent(table, value, true, true, row, column);
- }
- };
-
- @Override
- public TableCellEditor getCellEditor(final int row, final int col) {
- return getCellEditor(row, col, (EventObject) getClientProperty("AttributeTable.EditEvent"));
- }
-
- @SuppressWarnings("serial")
- public TableCellEditor getCellEditor(final int row, final int col, EventObject e) {
- if (dce != null) {
- dce.stopCellEditing();
- }
- if(col == 1){
- final MTextController textController = (MTextController) TextController.getController();
- if(e instanceof KeyEvent){
- final KeyEvent kev = (KeyEvent) e;
- textController.getEventQueue().setFirstEvent(kev);
- }
- final IAttributeTableModel model = (IAttributeTableModel) getModel();
- final String text = getValueForEdit(row, col);
- final DialogTableCellEditor dialogTableCellEditor = new DialogTableCellEditor();
- EditNodeBase base = textController.getEditNodeBase(model.getNode(), text, dialogTableCellEditor.getEditControl(), false);
- if(base != null){
- dialogTableCellEditor.setEditBase(base);
- return dialogTableCellEditor;
- }
- }
- final JComboBox comboBox;
- if (dce == null) {
- comboBox = new JComboBox(){
-
- // Workaround for bug introduced in Java 8: they use wrong component in DefaultCellEditor.EditorDelegate
- @Override
- public void actionPerformed(ActionEvent e) {
- if(e != null && e.getSource() == dce){
- super.actionPerformed(new ActionEvent(getEditor(), e.getID(), e.getActionCommand(),e.getWhen(),e.getModifiers()));
- }
- else
- super.actionPerformed(e);
- }
-
- };
- comboBox.addFocusListener(AttributeTable.focusListener);
- comboBox.getEditor().getEditorComponent().addFocusListener(AttributeTable.focusListener);
- comboBox.setRenderer(new TypedListCellRenderer());
- dce = new DefaultCellEditor(comboBox) {
- public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int col) {
- return super.getTableCellEditorComponent(table, ((AttributeTable)table).getValueForEdit(row, col), isSelected, row, col);
- }
- };
- dce.setClickCountToStart(CLICK_COUNT_TO_START);
- }
- return dce;
- }
-
- private String getValueForEdit(final int row, final int col) {
- final Object value = getValueAt(row, col);
- return (value instanceof IFormattedObject ? ((IFormattedObject) value).getObject() : value).toString();
- }
-
-
- @Override
- public TableCellRenderer getCellRenderer(final int row, final int column) {
- return AttributeTable.dtcr;
- }
-
- private float getFontSize() {
- return UITools.FONT_SCALE_FACTOR * AttributeRegistry.getRegistry(attributeView.getNode().getMap()).getFontSize();
- }
-
- @Override
- public Dimension getPreferredScrollableViewportSize() {
- if (!isValid()) {
- validate();
- }
- final Dimension dimension = super.getPreferredSize();
- NodeView nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, this);
- if(nodeView != null){
- final MapView map = nodeView.getMap();
- final ModeController modeController = map.getModeController();
- final NodeStyleController nsc = NodeStyleController.getController(modeController);
- dimension.width = Math.min(map.getZoomed(nsc.getMaxWidth(nodeView.getModel())), dimension.width);
- dimension.height = Math.min(map.getZoomed(AttributeTable.MAX_HEIGTH) - getTableHeaderHeight(), dimension.height);
- }
- else{
- dimension.width = Math.min(MAX_WIDTH, dimension.width);
- dimension.height = Math.min(MAX_HEIGTH, dimension.height);
- }
- return dimension;
- }
-
- int getTableHeaderHeight() {
- final JTableHeader tableHeader = getTableHeader();
- return tableHeader != null ? tableHeader.getPreferredSize().height : 0;
- }
-
- float getZoom() {
- final MapView mapView = attributeView.getMapView();
- if(SwingUtilities.isDescendingFrom(this, mapView)) {
- return mapView.getZoom();
- }
- return 1f;
- }
-
- /**
- */
- public void insertRow(final int row) {
- if (getModel() instanceof ExtendedAttributeTableModelDecorator) {
- final ExtendedAttributeTableModelDecorator model = (ExtendedAttributeTableModelDecorator) getModel();
- if (isEditing() && getCellEditor() != null && !getCellEditor().stopCellEditing()) {
- return;
- }
- model.insertRow(row);
- changeSelection(row, 0, false, false);
- if (editCellAt(row, 0)) {
- getEditorComponent().requestFocusInWindow();
- }
- }
- }
-
- @Override
- public boolean isVisible() {
- return super.isVisible() && attributeView.areAttributesVisible();
- }
-
- /**
- */
- public void moveRowDown(final int row) {
- if (getModel() instanceof ExtendedAttributeTableModelDecorator && row < getRowCount() - 1) {
- final ExtendedAttributeTableModelDecorator model = (ExtendedAttributeTableModelDecorator) getModel();
- model.moveRowDown(row);
- changeSelection(row + 1, getSelectedColumn(), false, false);
- }
- }
-
- /**
- */
- public void moveRowUp(final int row) {
- if (getModel() instanceof ExtendedAttributeTableModelDecorator && row > 0) {
- final ExtendedAttributeTableModelDecorator model = (ExtendedAttributeTableModelDecorator) getModel();
- model.moveRowUp(row);
- changeSelection(row - 1, getSelectedColumn(), false, false);
- }
- }
-
- @Override
- public Component prepareEditor(final TableCellEditor tce, final int row, final int col) {
- if(tce instanceof DialogTableCellEditor){
- return super.prepareEditor(tce, row, col);
- }
- final JComboBox comboBox = (JComboBox) ((DefaultCellEditor) tce).getComponent();
- final NodeModel node = getAttributeTableModel().getNode();
- final AttributeRegistry attributes = AttributeRegistry.getRegistry(node.getMap());
- final ComboBoxModel model;
- switch (col) {
- case 0:
- model = attributes.getComboBoxModel();
- comboBox.setEditable(!attributes.isRestricted());
- break;
- case 1:
- final String attrName = getAttributeTableModel().getValueAt(row, 0).toString();
- model = attributes.getDefaultComboBoxModel(attrName);
- comboBox.setEditable(!attributes.isRestricted(attrName));
- break;
- default:
- model = AttributeTable.getDefaultComboBoxModel();
- }
- final Object[] items = new Object[model.getSize()];
- for (int i = 0; i < items.length; i++) {
- items[i] = model.getElementAt(i);
- }
- final DefaultComboBoxModel currentModel = new DefaultComboBoxModel(items);
- comboBox.setModel(currentModel);
- updateFontSize(comboBox, getZoom());
- return super.prepareEditor(tce, row, col);
- }
-
- @Override
- public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
- Object value = getValueAt(row, column);
-
- boolean isSelected = false;
- boolean hasFocus = false;
-
- // Only indicate the selection and focused cell if not printing
- MapView map = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, this);
- if (map == null || ! map.isPrinting()) {
- isSelected = isCellSelected(row, column);
-
- boolean rowIsLead =
- (selectionModel.getLeadSelectionIndex() == row);
- boolean colIsLead =
- (columnModel.getSelectionModel().getLeadSelectionIndex() == column);
-
- final Window windowAncestor = SwingUtilities.getWindowAncestor(this);
- hasFocus = (rowIsLead && colIsLead) && windowAncestor != null && equals(windowAncestor.getMostRecentFocusOwner());
- }
-
- return renderer.getTableCellRendererComponent(this, value,
- isSelected, hasFocus,
- row, column);
- }
-
- @Override
- protected boolean processKeyBinding(final KeyStroke ks, final KeyEvent e, final int condition, final boolean pressed) {
- if (ks.getKeyCode() == KeyEvent.VK_TAB && e.getModifiers() == 0 && pressed && getSelectedColumn() == 1
- && getSelectedRow() == getRowCount() - 1 && getModel() instanceof ExtendedAttributeTableModelDecorator) {
- insertRow(getRowCount());
- return true;
- }
- if (ks.getKeyCode() == KeyEvent.VK_ESCAPE && e.getModifiers() == 0 && pressed) {
- if (! isEditing()){
- attributeView.getNodeView().requestFocusInWindow();
- return true;
- }
- else
- return super.processKeyBinding(ks, e, condition, pressed);
-
- }
- boolean retValue = super.processKeyBinding(ks, e, condition, pressed);
- if (!retValue && condition == JComponent.WHEN_FOCUSED && isFocusOwner() && ks.getKeyCode() != KeyEvent.VK_TAB
- && e != null && e.getID() == KeyEvent.KEY_PRESSED && !e.isActionKey()
- && e.getKeyChar() != KeyEvent.CHAR_UNDEFINED
- && 0 == (e.getModifiers() & (InputEvent.CTRL_MASK | InputEvent.ALT_MASK))) {
- final int leadRow = getSelectionModel().getLeadSelectionIndex();
- final int leadColumn = getColumnModel().getSelectionModel().getLeadSelectionIndex();
- if (leadRow != -1 && leadColumn != -1 && !isEditing()) {
- if (!editCellAt(leadRow, leadColumn, e)) {
- return false;
- }
- }
- final Component editorComponent = getEditorComponent();
- if (editorComponent instanceof JComboBox) {
- final JComboBox comboBox = (JComboBox) editorComponent;
- if (comboBox.isEditable()) {
- final ComboBoxEditor editor = comboBox.getEditor();
- editor.selectAll();
- KeyEvent keyEv;
- keyEv = new KeyEvent(editor.getEditorComponent(), KeyEvent.KEY_TYPED, e.getWhen(),
- e.getModifiers(), KeyEvent.VK_UNDEFINED, e.getKeyChar(), KeyEvent.KEY_LOCATION_UNKNOWN);
- retValue = SwingUtilities.processKeyBindings(keyEv);
- }
- else {
- editorComponent.requestFocusInWindow();
- retValue = true;
- }
- }
- }
- if (ks.getKeyCode() == KeyEvent.VK_SPACE) {
- return true;
- }
- return retValue;
- }
-
- @Override
- public void removeEditor() {
- final Component editorComponent = getEditorComponent();
- final Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
- boolean requestFocus = editorComponent != null && focusOwner != null &&
- (focusOwner == editorComponent || SwingUtilities.isDescendingFrom(focusOwner, editorComponent));
- getAttributeTableModel().editingCanceled();
- final boolean focusCycleRoot = isFocusCycleRoot();
- setFocusCycleRoot(true);
- super.removeEditor();
- setFocusCycleRoot(focusCycleRoot);
- if(requestFocus)
- requestFocusInWindow();
- }
-
- /**
- */
- public void removeRow(final int row) {
- if (getModel() instanceof ExtendedAttributeTableModelDecorator) {
- final ExtendedAttributeTableModelDecorator model = (ExtendedAttributeTableModelDecorator) getModel();
- model.removeRow(row);
- final int rowCount = getRowCount();
- if (row <= rowCount - 1) {
- changeSelection(row, getSelectedColumn(), false, false);
- }
- else if (rowCount >= 1) {
- changeSelection(row - 1, getSelectedColumn(), false, false);
- }
- }
- }
-
- @Override
- public void setModel(final TableModel dataModel) {
- super.setModel(dataModel);
- }
-
- /**
- *
- */
- public void setOptimalColumnWidths() {
- Component comp = null;
- int cellWidth = 0;
- int maxCellWidth = 2 * (int) (Math.ceil(getFontSize() + AttributeTable.TABLE_ROW_HEIGHT));
- for (int col = 0; col < 2; col++) {
- for (int row = 0; row < getRowCount(); row++) {
- comp = AttributeTable.dtcr.getTableCellRendererComponent(this, getValueAt(row, col), false, false, row,
- col);
- cellWidth = comp.getPreferredSize().width;
- maxCellWidth = Math.max(cellWidth, maxCellWidth);
- }
- getAttributeTableModel().setColumnWidth(col, maxCellWidth + 1);
- }
- }
-
- @Override
- public void tableChanged(final TableModelEvent e) {
- if(isEditing() && null == getClientProperty(EDITING_STOPPED) ){
- removeEditor();
- }
- int selectedRow = getSelectedRow();
- super.tableChanged(e);
- if (getParent() == null) {
- return;
- }
- switch(e.getType())
- {
- case TableModelEvent.DELETE:
- if(selectedRow != -1 ){
- if(e.getFirstRow() <= selectedRow){
- if( e.getLastRow() >= selectedRow && e.getFirstRow() != 0) {
- changeSelection(e.getFirstRow() - 1, 0, false, false);
- }
- else if(e.getLastRow() < selectedRow){
- int rowIndex = selectedRow - (e.getLastRow() - e.getFirstRow() + 1);
- if(rowIndex < 0){
- rowIndex = 0;
- }
- if(rowIndex < getRowCount()){
- changeSelection(rowIndex , getSelectedColumn(), false, false);
- }
- }
- }
- }
- break;
- case TableModelEvent.INSERT:
- changeSelection(e.getFirstRow() , getSelectedColumn(), false, false);
- break;
- default:
- if(selectedRow > getRowCount() && getRowCount() > 0){
- changeSelection(getRowCount() - 1 , getSelectedColumn(), false, false);
- }
- }
- getParent().getParent().invalidate();
- final NodeModel node = attributeView.getNode();
- MapController mapController = attributeView.getMapView().getModeController().getMapController();
- mapController.nodeChanged(node, NodeAttributeTableModel.class, null, null);
- }
-
- void updateAttributeTable() {
- updateFontSize(this, 1F);
- updateRowHeights();
- updateColumnWidths();
- }
-
- private void updateColumnWidths() {
- final float zoom = getZoom();
- for (int i = 0; i < 2; i++) {
- final int width = (int) (getAttributeTableModel().getColumnWidth(i) * zoom);
- getColumnModel().getColumn(i).setPreferredWidth(width);
- }
- }
-
- private void updateFontSize(final Component c, final float zoom) {
- Font font = c.getFont();
- if (font != null) {
- final float oldFontSize = font.getSize2D();
- final float newFontSize = getFontSize() * zoom;
- if (Float.compare(oldFontSize, newFontSize) != 0) {
- font = font.deriveFont(newFontSize);
- c.setFont(font);
- }
- }
- }
-
- private void updateRowHeights() {
- if(! isDisplayable()){
- addHierarchyListener(new HierarchyListener() {
- public void hierarchyChanged(HierarchyEvent e) {
- if(isDisplayable()){
- updateRowHeights();
- removeHierarchyListener(this);
- }
- }
- });
- return;
- }
- final int rowCount = getRowCount();
- if (rowCount == 0) {
- return;
- }
- final int constHeight = getTableHeaderHeight() + AttributeTable.EXTRA_HEIGHT;
- final float zoom = getZoom();
- final float fontSize = (float) getFont().getMaxCharBounds(((Graphics2D)getGraphics()).getFontRenderContext()).getHeight();
- final float tableRowHeight = fontSize + zoom * AttributeTable.TABLE_ROW_HEIGHT;
- int newHeight = (int) ((tableRowHeight * rowCount + (zoom - 1) * constHeight) / rowCount);
- if (newHeight < 1) {
- newHeight = 1;
- }
- final int highRowsNumber = (int) ((tableRowHeight - newHeight) * rowCount);
- for (int i = 0; i < highRowsNumber; i++) {
- setRowHeight(i, 1 + newHeight + (i == highRowIndex ? AttributeTable.EXTRA_HEIGHT : 0));
- }
- for (int i = highRowsNumber; i < rowCount; i++) {
- setRowHeight(i, newHeight + (i == highRowIndex ? AttributeTable.EXTRA_HEIGHT : 0));
- }
- }
-
- public void viewRemoved(NodeView nodeView) {
- getModel().removeTableModelListener(this);
- }
-
- @Override
- public void editingStopped(ChangeEvent e) {
- try{
- putClientProperty(EDITING_STOPPED, Boolean.TRUE);
- // Take in the new value
- TableCellEditor editor = getCellEditor();
- if (editor != null) {
- final Object value = editor.getCellEditorValue();
- if (value != null) {
- final String pattern = extractPatternIfAvailable(getValueAt(editingRow, editingColumn));
- final Object newValue = enforceFormattedObjectForIdentityPattern(value, pattern);
- setValueAt(newValue, editingRow, editingColumn);
- }
- removeEditor();
- }
- }
- finally{
- putClientProperty(EDITING_STOPPED, null);
- }
- }
-
- private String extractPatternIfAvailable(final Object oldValue) {
- return oldValue instanceof IFormattedObject ? ((IFormattedObject) oldValue).getPattern() : null;
- }
-
- // unfortunately we have to handle IDENTITY_PATTERN explicitely since (only) attributes
- // have no place for the format except for the value itself - so we need a FormattedObject here
- private Object enforceFormattedObjectForIdentityPattern(Object value, final String pattern) {
- final MTextController textController = (MTextController) TextController.getController();
- return PatternFormat.IDENTITY_PATTERN.equals(pattern) ? new FormattedObject(value, pattern) : textController
- .guessObjectOrURI(value, pattern);
- }
-
- @Override
- public void setValueAt(Object aValue, int row, int column) {
- super.setValueAt(column == 0 ? aValue.toString() : aValue, row, column);
- setSelectedCellTypeInfo();
- }
-
- @Override
- public void valueChanged(ListSelectionEvent e) {
- super.valueChanged(e);
- setSelectedCellTypeInfo();
- }
-
-
-
- @Override
- public void columnSelectionChanged(ListSelectionEvent e) {
- super.columnSelectionChanged(e);
- setSelectedCellTypeInfo();
- }
-
- private void setSelectedCellTypeInfo() {
- final int r = getSelectedRow();
- final int c = getSelectedColumn();
- if(r >= 0 && c >= 0){
- final Object value = getValueAt(r, c);
- final ViewController viewController = Controller.getCurrentController().getViewController();
- viewController.addObjectTypeInfo(value);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTableCellRenderer.java b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTableCellRenderer.java
deleted file mode 100644
index fb54c36..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTableCellRenderer.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.attribute;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.geom.AffineTransform;
-import java.net.URI;
-import javax.swing.Icon;
-import javax.swing.JTable;
-import javax.swing.UIManager;
-import javax.swing.table.DefaultTableCellRenderer;
-
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.attribute.IAttributeTableModel;
-import org.freeplane.features.text.HighlightedTransformedObject;
-import org.freeplane.features.text.TextController;
-
-class AttributeTableCellRenderer extends DefaultTableCellRenderer {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- static final float ZOOM_CORRECTION_FACTOR = 0.97F;
- private boolean isPainting;
- private float zoom;
- private Color borderColor;
-
- /*
- * (non-Javadoc)
- * @see javax.swing.JComponent#getHeight()
- */
- @Override
- public int getHeight() {
- if (isPainting) {
- if (zoom != 1F) {
- return (int) (super.getHeight() / zoom);
- }
- }
- return super.getHeight();
- }
-
- @Override
- public Component getTableCellRendererComponent(final JTable table, final Object value, final boolean isSelected,
- final boolean hasFocus, final int row, final int column) {
- final Component rendererComponent = super.getTableCellRendererComponent(table, value, hasFocus, isSelected, row,
- column);
- if (hasFocus) {
- setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
- }
- zoom = ((AttributeTable) table).getZoom();
- final IAttributeTableModel attributeTableModel = (IAttributeTableModel) table.getModel();
- final String originalText = value == null ? null : value.toString();
- String text = originalText;
- borderColor = null;
- Icon icon;
- if (column == 1 && value != null) {
- try {
- // evaluate values only
- final TextController textController = TextController.getController();
- Object transformedObject = textController.getTransformedObject(value, attributeTableModel.getNode(), null);
- text = transformedObject.toString();
- if (transformedObject instanceof HighlightedTransformedObject && TextController.isMarkTransformedTextSet()) {
- borderColor = Color.GREEN;
- }
- }
- catch (Exception e) {
- text = TextUtils.format("MainView.errorUpdateText", originalText, e.getLocalizedMessage());
- borderColor = Color.RED;
- }
- if(value instanceof URI){
- icon = ((AttributeTable)table).getLinkIcon((URI) value);
- }
- else{
- icon = null;
- }
- }
- else{
- icon = null;
- }
- if(icon != getIcon()){
- setIcon(icon);
- }
- setText(text);
- if(text != originalText){
- final String toolTip = HtmlUtils.isHtmlNode(originalText) ? text : HtmlUtils.plainToHTML(originalText);
- setToolTipText(toolTip);
- }
- else{
- final int prefWidth = getPreferredSize().width;
- final int width = table.getColumnModel().getColumn(column).getWidth();
- if (prefWidth > width) {
- final String toolTip = HtmlUtils.isHtmlNode(text) ? text : HtmlUtils.plainToHTML(text);
- setToolTipText(toolTip);
- }
- else {
- setToolTipText(null);
- }
- }
- return rendererComponent;
- }
-
- /*
- * (non-Javadoc)
- * @see javax.swing.JComponent#getWidth()
- */
- @Override
- public int getWidth() {
- if (isPainting) {
- if (zoom != 1F) {
- return (int) (0.99f + super.getWidth() / zoom);
- }
- }
- return super.getWidth();
- }
-
- @Override
- public void paint(final Graphics g) {
- final Graphics2D g2 = (Graphics2D) g;
- if (zoom != 1F) {
- zoom *= AttributeTableCellRenderer.ZOOM_CORRECTION_FACTOR;
- final AffineTransform transform = g2.getTransform();
- g2.scale(zoom, zoom);
- isPainting = true;
- super.paint(g);
- isPainting = false;
- g2.setTransform(transform);
- }
- else {
- super.paint(g);
- }
- if(borderColor != null){
- final Color color = g.getColor();
- g.setColor(borderColor);
- g.drawRect(0, 0, getWidth()-1, getHeight()-1);
- g.setColor(color);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTableModelDecoratorAdapter.java b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTableModelDecoratorAdapter.java
deleted file mode 100644
index bec5caf..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeTableModelDecoratorAdapter.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.attribute;
-
-import javax.swing.event.ChangeListener;
-import javax.swing.event.TableModelEvent;
-import javax.swing.event.TableModelListener;
-import javax.swing.table.AbstractTableModel;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.AttributeRegistry;
-import org.freeplane.features.attribute.IAttributeTableModel;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- * @author Dimitry Polivaev
- */
-abstract class AttributeTableModelDecoratorAdapter extends AbstractTableModel
- implements IAttributeTableModel,
- TableModelListener, ChangeListener{
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- final private AttributeController attributeController;
- private AttributeRegistry attributeRegistry;
- private NodeAttributeTableModel nodeAttributeModel;
- final private TextController textController;
-
- public AttributeTableModelDecoratorAdapter(final AttributeView attrView) {
- super();
- final ModeController modeController = attrView.getMapView().getModeController();
- attributeController = AttributeController.getController(modeController);
- textController = TextController.getController(modeController);
- setNodeAttributeModel(attrView.getAttributes());
- setAttributeRegistry(attrView.getAttributeRegistry());
- getNodeAttributeModel().getNode();
- addListeners();
- }
-
- private void addListeners() {
- getNodeAttributeModel().addTableModelListener(this);
- getAttributeRegistry().addChangeListener(this);
- }
-
- /**
- * @param view
- */
- public abstract boolean areAttributesVisible();
-
- public void editingCanceled() {
- }
-
- public AttributeController getAttributeController() {
- return attributeController;
- }
-
- public AttributeRegistry getAttributeRegistry() {
- return attributeRegistry;
- }
-
- @Override
- public Class<?> getColumnClass(final int columnIndex) {
- return getNodeAttributeModel().getColumnClass(columnIndex);
- }
-
- public int getColumnCount() {
- return 2;
- }
-
- @Override
- public String getColumnName(final int columnIndex) {
- return getNodeAttributeModel().getColumnName(columnIndex);
- }
-
- public int getColumnWidth(final int col) {
- return getNodeAttributeModel().getColumnWidth(col);
- }
-
- public NodeModel getNode() {
- return getNodeAttributeModel().getNode();
- }
-
- public NodeAttributeTableModel getNodeAttributeModel() {
- return nodeAttributeModel;
- }
-
- private void removeListeners() {
- getNodeAttributeModel().removeTableModelListener(this);
- getAttributeRegistry().removeChangeListener(this);
- }
-
- public void setAttributeRegistry(final AttributeRegistry attributeRegistry) {
- this.attributeRegistry = attributeRegistry;
- }
-
- public void setColumnWidth(final int col, final int width) {
- getAttributeController().performSetColumnWidth(getNodeAttributeModel(), col, width);
- }
-
- public void setNodeAttributeModel(final NodeAttributeTableModel nodeAttributeModel) {
- this.nodeAttributeModel = nodeAttributeModel;
- int rowCount = nodeAttributeModel.getRowCount();
- cacheTransformedValues(0, (rowCount-1));
- }
-
- private void cacheTransformedValue(int row) {
- try {
- final Object value = nodeAttributeModel.getValueAt(row, 1);
- if (value != null)
- textController.getTransformedText(value.toString(), getNode(), null);
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- }
-
- public void viewRemoved(NodeView nodeView) {
- removeListeners();
- }
- public void tableChanged(final TableModelEvent e) {
- switch(e.getType()){
- case TableModelEvent.INSERT:
- case TableModelEvent.UPDATE:
- cacheTransformedValues(e.getFirstRow(), e.getLastRow());
- }
-
- }
- private void cacheTransformedValues(int firstRow, int lastRow) {
- for(int row = firstRow; row <= lastRow; row++){
- cacheTransformedValue(row);
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeViewScrollPane.java b/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeViewScrollPane.java
deleted file mode 100644
index 0d0754a..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/attribute/AttributeViewScrollPane.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.attribute;
-
-import java.awt.Component;
-import java.awt.Dimension;
-
-import javax.swing.JScrollPane;
-
-class AttributeViewScrollPane extends JScrollPane {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- /**
- */
- AttributeViewScrollPane(final AttributeTable attributeTable) {
- super(attributeTable);
- setAlignmentX(Component.CENTER_ALIGNMENT);
- }
-
- @Override
- public Dimension getMaximumSize() {
- return getPreferredSize();
- }
-
- @Override
- public Dimension getPreferredSize() {
- validate();
- return super.getPreferredSize();
- }
-
- @Override
- public boolean isVisible() {
- final Component view = getViewport().getView();
- return super.isVisible() && view != null && view.isVisible();
- }
-
- @Override
- public boolean isValidateRoot() {
- return false;
- }
-
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/HorizontalEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/HorizontalEdgeView.java
deleted file mode 100644
index dc712e9..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/edge/HorizontalEdgeView.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.edge;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Stroke;
-import java.awt.geom.Line2D;
-
-import org.freeplane.features.nodelocation.LocationModel;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.NodeView;
-import org.freeplane.view.swing.map.link.CollisionDetector;
-
-/**
- * This class represents a single Edge of a MindMap.
- */
-public class HorizontalEdgeView extends EdgeView {
- private int xs[];
- private int ys[];
-
- public HorizontalEdgeView(NodeView source, NodeView target, Component paintedComponent) {
- super(source, target, paintedComponent);
- }
-
- @Override
- protected void createStart() {
- if(getSource().isRoot() && ! MainView.USE_COMMON_OUT_POINT_FOR_ROOT_NODE){
- super.createStart();
- }
- else{
- if(getTarget().isLeft()){
- start = getSource().getMainView().getLeftPoint();
- }
- else{
- start = getSource().getMainView().getRightPoint();
- }
- }
- if(getTarget().isLeft()){
- end = getTarget().getMainView().getRightPoint();
- }
- else{
- end = getTarget().getMainView().getLeftPoint();
- }
- }
-
- @Override
- protected void draw(final Graphics2D g) {
- final Color color = getColor();
- g.setColor(color);
- final Stroke stroke = getStroke();
- g.setStroke(stroke);
- getWidth();
- int xMiddle = getTarget().getMap().getZoomed(LocationModel.HGAP) / 2;
- final boolean left = getTarget().isLeft()
- || ! MainView.USE_COMMON_OUT_POINT_FOR_ROOT_NODE && getSource().isRoot()&& start.x > end.x;
- if (left) {
- xMiddle = -xMiddle;
- }
- xMiddle += start.x;
- xs = new int[] { start.x, xMiddle, xMiddle, end.x };
- ys = new int[] { start.y, start.y, end.y, end.y };
- g.drawPolyline(xs, ys, 4);
- if (isTargetEclipsed()) {
- g.setColor(g.getBackground());
- g.setStroke(EdgeView.getEclipsedStroke());
- g.drawPolyline(xs, ys, 4);
- g.setColor(color);
- g.setStroke(stroke);
- }
- }
-
- @Override
- public boolean detectCollision(final Point p) {
- final CollisionDetector collisionDetector = new CollisionDetector();
- for (int i = 1; i < xs.length; i++) {
- if (collisionDetector.detectCollision(p, new Line2D.Float(xs[i - 1], ys[i - 1], xs[i], ys[i]))) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/OutlineEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/OutlineEdgeView.java
deleted file mode 100644
index 24ac21f..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/edge/OutlineEdgeView.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.edge;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Stroke;
-
-import org.freeplane.features.edge.EdgeStyle;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- * @author Dimitry Polivaev
- * 29.08.2009
- */
-public class OutlineEdgeView extends EdgeView {
- public OutlineEdgeView(NodeView source, NodeView target, Component paintedComponent) {
- super(source, target, paintedComponent);
- }
-
- @Override
- public boolean detectCollision(final Point p) {
- return false;
- }
-
- @Override
- protected void createStart() {
- start = getSource().getMainView().getLeftPoint();
- end = getTarget().getMainView().getLeftPoint();
- }
-
- @Override
- protected void draw(final Graphics2D g) {
- final Color color = getColor();
- g.setColor(color);
- final Stroke stroke = getStroke();
- g.setStroke(stroke);
- g.drawLine(start.x, start.y, start.x, end.y);
- g.drawLine(start.x, end.y, end.x, end.y);
- if(getTarget().isSummary()){
- final int gap = getWidth();
- final int y1 = end.y + gap * 13/8;
- g.drawLine(start.x, start.y, start.x, y1);
- int x2 = end.x;
- if(NodeStyleModel.STYLE_FORK.equals(getTarget().getMainView().getShape()))
- x2 += getTarget().getContent().getWidth();
- g.drawLine(start.x, y1, x2, y1);
- }
- }
-
- @Override
- protected Stroke getStroke() {
- final NodeView target = getTarget();
- int edgeWidth = target.getEdgeWidth();
- final EdgeStyle style = target.getEdgeStyle();
- final int nodeLineWidth = style.getNodeLineWidth(edgeWidth);
- final int zoomedWidth;
- if(edgeWidth != 0)
- zoomedWidth = getTarget().getZoomed(nodeLineWidth);
- else
- zoomedWidth = nodeLineWidth;
- return new BasicStroke(zoomedWidth);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/edge/SummaryEdgeView.java b/freeplane/src/org/freeplane/view/swing/map/edge/SummaryEdgeView.java
deleted file mode 100644
index c7823ca..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/edge/SummaryEdgeView.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.edge;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Shape;
-import java.awt.Stroke;
-import java.awt.geom.GeneralPath;
-
-import org.freeplane.view.swing.map.NodeView;
-import org.freeplane.view.swing.map.link.CollisionDetector;
-
-/**
- * This class represents a single Edge of a MindMap.
- */
-public class SummaryEdgeView extends EdgeView {
- private static final int CHILD_XCTRL = 20;
- private static final int XCTRL = 6;
-
- public SummaryEdgeView(NodeView source, NodeView target, Component paintedComponent) {
- super(source, target, paintedComponent);
- }
-
- @Override
- protected void draw(final Graphics2D g) {
- final Shape graph = update();
- final Color color = getColor();
- g.setColor(color);
- final Stroke stroke = getStroke();
- g.setStroke(stroke);
- g.draw(graph);
- }
-
- private Shape update() {
- final boolean isLeft = getTarget().isLeft();
- final int sign = isLeft ? -1 : 1;
- final int xctrl = getMap().getZoomed(sign * SummaryEdgeView.XCTRL);
- final int childXctrl = getMap().getZoomed(sign * SummaryEdgeView.CHILD_XCTRL);
- final GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD, 5);
- final int startX;
- if(isLeft)
- startX = Math.min(start.x, end.x - childXctrl);
- else
- startX = Math.max(start.x, end.x - childXctrl);
- path.moveTo(startX + xctrl, start.y);
- path.lineTo(startX + 2 *xctrl, start.y);
- path.curveTo(startX + 3 * xctrl, start.y, startX, end.y, end.x, end.y);
- return path;
- }
-
- @Override
- public boolean detectCollision(final Point p) {
- final Shape graph = update();
- return new CollisionDetector().detectCollision(p, graph);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/ConnectorView.java b/freeplane/src/org/freeplane/view/swing/map/link/ConnectorView.java
deleted file mode 100644
index 97cf73f..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/link/ConnectorView.java
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.link;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Shape;
-import java.awt.Stroke;
-import java.awt.geom.AffineTransform;
-import java.awt.geom.CubicCurve2D;
-import java.awt.geom.GeneralPath;
-import java.awt.geom.Line2D;
-import java.awt.geom.PathIterator;
-import java.awt.geom.Point2D;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.features.link.ArrowType;
-import org.freeplane.features.link.ConnectorModel;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.NodeLinkModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- * This class represents a ArrowLink around a node.
- */
-public class ConnectorView extends AConnectorView{
- private static final int LOOP_INCLINE_OFFSET = 45;
- private static final int NORMAL_LENGTH = 50;
- private static final float[] DOTTED_DASH = new float[] { 4, 7};
- static final Stroke DEF_STROKE = new BasicStroke(1);
- private static final int LABEL_GAP = 4;
- private static final double PRECISION = 2;
- private Shape arrowLinkCurve;
- private Rectangle sourceTextRectangle;
- private Rectangle middleTextRectangle;
- private Rectangle targetTextRectangle;
- final private Color textColor;
- final private Color color;
- final private BasicStroke stroke;
- final private Color bgColor;
- /* Note, that source and target are nodeviews and not nodemodels!. */
- public ConnectorView(final ConnectorModel connectorModel, final NodeView source, final NodeView target, Color bgColor) {
- super(connectorModel, source, target);
- final LinkController linkController = LinkController.getController(getModeController());
- textColor = linkController.getColor(connectorModel);
- this.bgColor =bgColor;
- final int alpha = linkController.getAlpha(connectorModel);
- color = ColorUtils.createColor(textColor, alpha);
-
- final int width = linkController.getWidth(connectorModel);
- if (!isSourceVisible() || !isTargetVisible()) {
- stroke = new BasicStroke(width);
- }
- else{
- stroke = UITools.createStroke(width, linkController.getDash(connectorModel));
- }
-
- }
-
- public float[] zoomDash(float[] dash) {
- float[] result = dash.clone();
- final double zoom = getZoom();
- for(float f : result){
- f *= zoom;
- }
- return result;
- }
-
- /**
- */
- private Point calcInclination(final NodeView node, final int dellength) {
- return new Point(dellength, 0);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.view.swing.map.link.ILinkView#detectCollision(java.awt.Point, boolean)
- */
- public boolean detectCollision(final Point p, final boolean selectedOnly) {
- if (selectedOnly && (source == null || !source.isSelected()) && (target == null || !target.isSelected())) {
- return false;
- }
- if (arrowLinkCurve == null) {
- return false;
- }
- return new CollisionDetector().detectCollision(p, arrowLinkCurve);
- }
-
- private Rectangle drawEndPointText(final Graphics2D g, final String text, final Point endPoint, final Point controlPoint) {
- if (text == null || text.equals("")) {
- return null;
- }
- final TextPainter textPainter = new TextPainter(g, text);
- final int textWidth = textPainter.getTextWidth();
- final int textHeight = textPainter.getTextHeight();
- final int x;
- if (controlPoint.x > endPoint.x) {
- x = endPoint.x - textWidth - LABEL_GAP;
- }
- else {
- x = endPoint.x + LABEL_GAP;
- }
- final int y;
- if (controlPoint.y > endPoint.y) {
- y = endPoint.y + LABEL_GAP;
- }
- else {
- y = endPoint.y - textHeight - LABEL_GAP;
- }
- textPainter.draw(x, y, textColor, bgColor);
- return new Rectangle(x, y, textWidth, textHeight);
- }
-
- private Rectangle drawMiddleLabel(final Graphics2D g, final String text, final Point centerPoint) {
- if (text == null || text.equals("")) {
- return null;
- }
- final TextPainter textPainter = new TextPainter(g, text);
- final int textWidth = textPainter.getTextWidth();
- final int x = centerPoint.x - textWidth / 2;
- final int textHeight = textPainter.getTextHeight();
- int y = centerPoint.y - textHeight/2;
- textPainter.draw(x, y, textColor, bgColor);
- return new Rectangle(x, y, textWidth, textHeight);
- }
-
- Shape getArrowLinkCurve() {
- return arrowLinkCurve;
- }
-
- NodeLinkModel getArrowLinkModel() {
- return connectorModel;
- }
-
- private Point getCenterPoint() {
- if (arrowLinkCurve == null) {
- return null;
- }
- final double halfLength = getHalfLength();
- final PathIterator pathIterator = arrowLinkCurve.getPathIterator(new AffineTransform(), PRECISION);
- double lastCoords[] = new double[6];
- pathIterator.currentSegment(lastCoords);
- double length = 0;
- for (;;) {
- pathIterator.next();
- final double nextCoords[] = new double[6];
- if (pathIterator.isDone() || PathIterator.SEG_CLOSE == pathIterator.currentSegment(nextCoords)) {
- break;
- }
- final double dx = nextCoords[0] - lastCoords[0];
- final double dy = nextCoords[1] - lastCoords[1];
- final double dr = Math.sqrt(dx * dx + dy * dy);
- length += dr;
- if (length >= halfLength) {
- final double k;
- if (dr < 1) {
- k = 0.5;
- }
- else {
- k = (length - halfLength) / dr;
- }
- return new Point((int) Math.rint(nextCoords[0] - k * dx), (int) Math.rint(nextCoords[1] - k * dy));
- }
- lastCoords = nextCoords;
- }
- throw new RuntimeException("center point not found");
- }
-
- private double getHalfLength() {
- final PathIterator pathIterator = arrowLinkCurve.getPathIterator(new AffineTransform(), PRECISION);
- double lastCoords[] = new double[6];
- pathIterator.currentSegment(lastCoords);
- double length = 0;
- for (;;) {
- pathIterator.next();
- final double nextCoords[] = new double[6];
- if (pathIterator.isDone() || PathIterator.SEG_CLOSE == pathIterator.currentSegment(nextCoords)) {
- break;
- }
- final double dx = nextCoords[0] - lastCoords[0];
- final double dy = nextCoords[1] - lastCoords[1];
- length += Math.sqrt(dx * dx + dy * dy);
- lastCoords = nextCoords;
- }
- return length / 2;
- }
-
- private ModeController getModeController() {
- NodeView nodeView = source;
- if (source == null) {
- nodeView = target;
- }
- final MapView mapView = nodeView.getMap();
- return mapView.getModeController();
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.view.swing.map.link.ILinkView#getModel()
- */
- public ConnectorModel getModel() {
- return connectorModel;
- }
-
-
- /**
- * Computes the intersection between two lines. The calculated point is approximate,
- * since integers are used. If you need a more precise result, use doubles
- * everywhere.
- * (c) 2007 Alexander Hristov. Use Freely (LGPL license). http://www.ahristov.com
- *
- * @param x1 Point 1 of Line 1
- * @param y1 Point 1 of Line 1
- * @param x2 Point 2 of Line 1
- * @param y2 Point 2 of Line 1
- * @param x3 Point 1 of Line 2
- * @param y3 Point 1 of Line 2
- * @param x4 Point 2 of Line 2
- * @param y4 Point 2 of Line 2
- * @return Point where the segments intersect, or null if they don't
- */
- Point intersection(final double x1, final double y1, final double x2, final double y2, final double x3,
- final double y3, final double x4, final double y4) {
- final double d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
- if (d == 0) {
- return null;
- }
- final int xi = (int) (((x3 - x4) * (x1 * y2 - y1 * x2) - (x1 - x2) * (x3 * y4 - y3 * x4)) / d);
- final int yi = (int) (((y3 - y4) * (x1 * y2 - y1 * x2) - (y1 - y2) * (x3 * y4 - y3 * x4)) / d);
- if (xi + 2 < Math.min(x1, x2) || xi - 2 > Math.max(x1, x2)) {
- return null;
- }
- return new Point(xi, yi);
- }
-
- /**
- * Computes the unitary normal vector of a segment
- * @param x1 Starting point of the segment
- * @param y1 Starting point of the segment
- * @param x2 Ending point of the segment
- * @param y2 Ending point of the segment
- * @return
- */
- Point2D.Double normal(final double x1, final double y1, final double x2, final double y2) {
- double nx, ny;
- if (x1 == x2) {
- nx = Math.signum(y2 - y1);
- ny = 0;
- }
- else {
- final double f = (y2 - y1) / (x2 - x1);
- nx = f * Math.signum(x2 - x1) / Math.sqrt(1 + f * f);
- ny = -1 * Math.signum(x2 - x1) / Math.sqrt(1 + f * f);
- }
- return new Point2D.Double(nx, ny);
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.view.swing.map.link.ILinkView#paint(java.awt.Graphics)
- */
- public void paint(final Graphics graphics) {
- final boolean selfLink = getSource() == getTarget();
- if (!isSourceVisible() && !isTargetVisible()) {
- return;
- }
- Point startPoint = null, endPoint = null, startPoint2 = null, endPoint2 = null;
- boolean targetIsLeft = false;
- boolean sourceIsLeft = false;
- final Graphics2D g = (Graphics2D) graphics.create();
- final Color oldColor = g.getColor();
- g.setColor(color);
- /* set stroke. */
- g.setStroke(stroke);
- if (isSourceVisible()) {
- startPoint = source.getLinkPoint(connectorModel.getStartInclination());
- sourceIsLeft = source.isLeft();
- }
- if (isTargetVisible()) {
- endPoint = target.getLinkPoint(connectorModel.getEndInclination());
- targetIsLeft = target.isLeft();
- }
- if (connectorModel.getEndInclination() == null || connectorModel.getStartInclination() == null) {
- final int dellength = isSourceVisible() && isTargetVisible() ? Math.max(40, (int)(startPoint.distance(endPoint) / getZoom())) : 40;
- if (isSourceVisible() && connectorModel.getStartInclination() == null) {
- final Point incl = calcInclination(source, dellength);
- connectorModel.setStartInclination(incl);
- startPoint = source.getLinkPoint(connectorModel.getStartInclination());
- }
- if (isTargetVisible() && connectorModel.getEndInclination() == null) {
- final Point incl = calcInclination(target, dellength);
- incl.y = -incl.y;
- if (selfLink) {
- fixInclineIfLoopNode(incl);
- }
- connectorModel.setEndInclination(incl);
- endPoint = target.getLinkPoint(connectorModel.getEndInclination());
- }
- }
- if (startPoint != null) {
- startPoint2 = new Point(startPoint);
- Point startInclination = connectorModel.getStartInclination();
- if(endPoint == null){
- normalizeLength(NORMAL_LENGTH, startInclination);
- }
- startPoint2.translate(((sourceIsLeft) ? -1 : 1) * getMap().getZoomed(startInclination.x),
- getMap().getZoomed(startInclination.y));
-
- }
- if (endPoint != null) {
- endPoint2 = new Point(endPoint);
- Point endInclination = connectorModel.getEndInclination();
- if(startPoint == null){
- normalizeLength(NORMAL_LENGTH, endInclination);
- }
- endPoint2.translate(((targetIsLeft) ? -1 : 1) * getMap().getZoomed(endInclination.x), getMap()
- .getZoomed(endInclination.y));
- }
- paintCurve(g, startPoint, startPoint2, endPoint2, endPoint);
- drawLabels(g, startPoint, startPoint2, endPoint2, endPoint);
- g.setColor(oldColor);
- }
-
- private void normalizeLength(int normalLength, Point startInclination) {
- double k = normalLength / Math.sqrt(startInclination.x * startInclination.x + startInclination.y * startInclination.y);
- startInclination.x *= k;
- startInclination.y *= k;
- }
-
- private Shape createLine(Point p1, Point p2) {
- return new Line2D.Float(p1, p2);
- }
-
- private Shape createLinearPath(Point startPoint, Point startPoint2, Point endPoint2, Point endPoint) {
- final GeneralPath generalPath = new GeneralPath(GeneralPath.WIND_NON_ZERO, 4);
- generalPath.moveTo(startPoint.x, startPoint.y);
- generalPath.lineTo(startPoint2.x, startPoint2.y);
- generalPath.lineTo(endPoint2.x, endPoint2.y);
- generalPath.lineTo(endPoint.x, endPoint.y);
- return generalPath;
- }
-
- private void paintCurve(final Graphics2D g, Point startPoint, Point startPoint2, Point endPoint2, Point endPoint) {
- final boolean selfLink = getSource() == getTarget();
- final boolean isLine = ConnectorModel.Shape.LINE.equals(connectorModel.getShape());
- if (startPoint != null && endPoint != null) {
- if(isLine) {
- if (selfLink) {
- arrowLinkCurve = createLine(startPoint, startPoint2);
- }
- else {
- arrowLinkCurve = createLine(startPoint, endPoint);
- }
- }
- else if (ConnectorModel.Shape.LINEAR_PATH.equals(connectorModel.getShape()))
- arrowLinkCurve = createLinearPath(startPoint, startPoint2, endPoint2, endPoint);
- else
- arrowLinkCurve = createCubicCurve2D(startPoint, startPoint2, endPoint2, endPoint);
- }
- else
- arrowLinkCurve = null;
- if (arrowLinkCurve != null) {
- g.draw(arrowLinkCurve);
- }
- if (isSourceVisible() && !connectorModel.getStartArrow().equals(ArrowType.NONE)) {
- if(!selfLink && isLine && endPoint != null)
- paintArrow(g, endPoint, startPoint);
- else
- paintArrow(g, startPoint2, startPoint);
- }
- if (isTargetVisible() && !connectorModel.getEndArrow().equals(ArrowType.NONE)) {
- if(isLine && startPoint != null) {
- if (selfLink)
- paintArrow(g, startPoint, startPoint2);
- else
- paintArrow(g, startPoint, endPoint);
- }
- else
- paintArrow(g, endPoint2, endPoint);
- }
- if (connectorModel.getShowControlPointsFlag()) {
- g.setColor(textColor);
- g.setStroke(new BasicStroke(stroke.getLineWidth(), BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 0, DOTTED_DASH, 0));
- }
- if (connectorModel.getShowControlPointsFlag() || !isSourceVisible() || !isTargetVisible()) {
- if (startPoint != null) {
- g.drawLine(startPoint.x, startPoint.y, startPoint2.x, startPoint2.y);
- drawCircle(g, startPoint2, source.getZoomedFoldingSymbolHalfWidth());
- if (arrowLinkCurve == null) {
- arrowLinkCurve = createLine(startPoint, startPoint2);
- }
- }
- if (endPoint != null && !(selfLink && isLine)) {
- g.drawLine(endPoint.x, endPoint.y, endPoint2.x, endPoint2.y);
- drawCircle(g, endPoint2, target.getZoomedFoldingSymbolHalfWidth());
- if (arrowLinkCurve == null) {
- arrowLinkCurve = createLine(endPoint, endPoint2);
- }
- }
- }
- }
-
- private void drawCircle(Graphics2D g, Point p, int hw) {
- g.setStroke(DEF_STROKE);
- g.fillOval(p.x - hw, p.y - hw, hw*2, hw*2);
- }
-
- private void paintArrow(final Graphics2D g, Point from, Point to) {
- paintArrow(from, to, g, getZoom() * 10);
- }
-
- private void drawLabels(final Graphics2D g, Point startPoint, Point startPoint2, Point endPoint2, Point endPoint) {
- final String sourceLabel = connectorModel.getSourceLabel();
- final String middleLabel = connectorModel.getMiddleLabel();
- final String targetLabel = connectorModel.getTargetLabel();
- if (sourceLabel == null && middleLabel == null && targetLabel == null) {
- return;
- }
-
- final Font oldFont = g.getFont();
- final String fontFamily = connectorModel.getLabelFontFamily();
- final int fontSize = Math.round (connectorModel.getLabelFontSize() * UITools.FONT_SCALE_FACTOR);
- final Font linksFont = new Font(fontFamily, 0, getZoomed(fontSize));
- g.setFont(linksFont);
-
- if (startPoint != null) {
- sourceTextRectangle = drawEndPointText(g, sourceLabel, startPoint, startPoint2);
- if (endPoint == null) {
- middleTextRectangle = drawEndPointText(g, middleLabel, startPoint2, startPoint);
- }
- }
- if (endPoint != null) {
- targetTextRectangle = drawEndPointText(g, targetLabel, endPoint, endPoint2);
- if (startPoint == null) {
- middleTextRectangle = drawEndPointText(g, middleLabel, endPoint2, endPoint);
- }
- }
- if (startPoint != null && endPoint != null) {
- middleTextRectangle = drawMiddleLabel(g, middleLabel, getCenterPoint());
- }
- g.setFont(oldFont);
- }
-
- private CubicCurve2D createCubicCurve2D(Point startPoint, Point startPoint2, Point endPoint2, Point endPoint) {
- final CubicCurve2D arrowLinkCurve = new CubicCurve2D.Double();
- if (startPoint != null && endPoint != null) {
- arrowLinkCurve.setCurve(startPoint, startPoint2, endPoint2, endPoint);
- }
- else if (startPoint != null) {
- arrowLinkCurve.setCurve(startPoint, startPoint2, startPoint, startPoint2);
- }
- else if (endPoint != null) {
- arrowLinkCurve.setCurve(endPoint, endPoint2, endPoint, endPoint2);
- }
- return arrowLinkCurve;
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.view.swing.map.link.ILinkView#increaseBounds(java.awt.Rectangle)
- */
- public void increaseBounds(final Rectangle innerBounds) {
- final Shape arrowLinkCurve = getArrowLinkCurve();
- if (arrowLinkCurve == null) {
- return;
- }
- final Rectangle arrowViewBigBounds = arrowLinkCurve.getBounds();
- if (!innerBounds.contains(arrowViewBigBounds)) {
- final Rectangle arrowViewBounds = PathBBox.getBBox(arrowLinkCurve).getBounds();
- innerBounds.add(arrowViewBounds);
- }
- increaseBounds(innerBounds, sourceTextRectangle);
- increaseBounds(innerBounds, middleTextRectangle);
- increaseBounds(innerBounds, targetTextRectangle);
- }
-
- private void increaseBounds(Rectangle innerBounds, Rectangle rect) {
- if (rect != null)
- innerBounds.add(rect);
- }
-
- private void fixInclineIfLoopNode(Point endIncline) {
- if (endIncline.y < 0) {
- endIncline.y -= LOOP_INCLINE_OFFSET;
- }
- else {
- endIncline.y += LOOP_INCLINE_OFFSET;
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/EdgeLinkView.java b/freeplane/src/org/freeplane/view/swing/map/link/EdgeLinkView.java
deleted file mode 100644
index 59b4370..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/link/EdgeLinkView.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.link;
-
-import java.awt.Color;
-import java.awt.Graphics;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Rectangle;
-
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.features.link.ArrowType;
-import org.freeplane.features.link.ConnectorModel;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.ConnectorModel.Shape;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.MapViewLayout;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.NodeView;
-import org.freeplane.view.swing.map.edge.EdgeView;
-import org.freeplane.view.swing.map.edge.EdgeViewFactory;
-
-/**
- * @author Dimitry Polivaev
- * 09.08.2009
- */
-public class EdgeLinkView extends AConnectorView {
- private final EdgeView edgeView;
-
- public EdgeLinkView(final ConnectorModel model, final ModeController modeController, final NodeView source,
- final NodeView target) {
- super(model, source, target);
- final MapView map = source.getMap();
- if (map.getLayoutType() == MapViewLayout.OUTLINE) {
- edgeView = new OutlineLinkView(source, target, map);
- }
- else{
- edgeView = EdgeViewFactory.getInstance().getEdge(source, target, map);
- }
- Color color;
- if (Shape.EDGE_LIKE.equals(model.getShape())) {
- color = edgeView.getColor().darker();
- }
- else {
- final LinkController linkController = LinkController.getController(modeController);
- color = linkController.getColor(connectorModel);
- final int alpha = linkController.getAlpha(connectorModel);
- color = ColorUtils.createColor(color, alpha);
- final int width = linkController.getWidth(model);
- edgeView.setWidth(width);
- }
- edgeView.setColor(color);
- }
-
- public boolean detectCollision(final Point p, final boolean selectedOnly) {
- if (selectedOnly) {
- final NodeView source = edgeView.getSource();
- if ((source == null || !source.isSelected())) {
- final NodeView target = edgeView.getTarget();
- if ((target == null || !target.isSelected())) {
- return false;
- }
- }
- }
- return edgeView.detectCollision(p);
- }
-
- public ConnectorModel getModel() {
- return connectorModel;
- }
-
- public void increaseBounds(final Rectangle innerBounds) {
- //edge link does not increase inner bounds
- }
-
- public void paint(final Graphics graphics) {
- edgeView.paint((Graphics2D) graphics);
- if(Shape.EDGE_LIKE.equals(connectorModel.getShape())){
- return;
- }
- if (isSourceVisible() && !connectorModel.getStartArrow().equals(ArrowType.NONE)) {
- Point p1 = edgeView.getStart();
- Point p2 = new Point(p1);
- p2.translate(5, 0);
- paintArrow(graphics, p2, p1);
- }
- if (isTargetVisible() && !connectorModel.getEndArrow().equals(ArrowType.NONE)) {
- Point p1 = edgeView.getEnd();
- Point p2 = new Point(p1);
- p2.translate(5, 0);
- paintArrow(graphics, p2, p1);
- }
-
- }
-
- private void paintArrow(final Graphics graphics, Point from, Point to) {
- paintArrow(from, to, (Graphics2D)graphics, getZoom() * 10);
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/link/TextPainter.java b/freeplane/src/org/freeplane/view/swing/map/link/TextPainter.java
deleted file mode 100644
index b42b451..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/link/TextPainter.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.link;
-
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.FontMetrics;
-import java.awt.Graphics2D;
-import java.awt.Stroke;
-
-/**
- * @author Dimitry Polivaev
- * Apr 22, 2011
- */
-public class TextPainter{
- private final int lineHeight;
- private final int textHeight;
- public int getLineHeight() {
- return lineHeight;
- }
-
- public int getTextHeight() {
- return textHeight;
- }
-
- public int getTextWidth() {
- return textWidth;
- }
-
- private final int textWidth;
- private final String[] lines;
- private final Graphics2D g;
-
- public TextPainter(final Graphics2D g, final String text){
- this.g = g;
- lines = text.split("\n");
- final FontMetrics fontMetrics = g.getFontMetrics();
- lineHeight = fontMetrics.getHeight();
- textHeight = lineHeight * lines.length + fontMetrics.getDescent();
- int textWidth = 0;
- for(final String line : lines){
- final int w = fontMetrics.stringWidth(line);
- textWidth = Math.max(textWidth, w);
- }
- this.textWidth = textWidth;
- }
-
- public void draw(int x, int y, Color textColor, Color bgColor){
- final Color oldColor = g.getColor();
- final Stroke oldStroke = g.getStroke();
- g.setColor(bgColor);
- g.setStroke(new BasicStroke(0.5f));
- g.fillRect(x, y, textWidth, textHeight);
- g.setColor(textColor);
- for(final String line : lines){
- y+=lineHeight;
- g.drawString(line, x, y);
- }
- g.setColor(oldColor);
- g.setStroke(oldStroke);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeTextField.java b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeTextField.java
deleted file mode 100644
index e971072..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/mindmapmode/EditNodeTextField.java
+++ /dev/null
@@ -1,748 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.mindmapmode;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.EventQueue;
-import java.awt.Font;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.event.ActionEvent;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.awt.event.InputMethodEvent;
-import java.awt.event.InputMethodListener;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.io.IOException;
-import java.io.Writer;
-import java.net.URI;
-import java.text.AttributedCharacterIterator;
-
-import javax.swing.Action;
-import javax.swing.ActionMap;
-import javax.swing.Icon;
-import javax.swing.InputMap;
-import javax.swing.JEditorPane;
-import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JPopupMenu;
-import javax.swing.KeyStroke;
-import javax.swing.RootPaneContainer;
-import javax.swing.SwingUtilities;
-import javax.swing.border.MatteBorder;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.DefaultEditorKit;
-import javax.swing.text.DefaultEditorKit.PasteAction;
-import javax.swing.text.Document;
-import javax.swing.text.JTextComponent;
-import javax.swing.text.NavigationFilter;
-import javax.swing.text.Position.Bias;
-import javax.swing.text.StyleConstants;
-import javax.swing.text.StyledEditorKit;
-import javax.swing.text.StyledEditorKit.BoldAction;
-import javax.swing.text.StyledEditorKit.ForegroundAction;
-import javax.swing.text.StyledEditorKit.ItalicAction;
-import javax.swing.text.StyledEditorKit.StyledTextAction;
-import javax.swing.text.StyledEditorKit.UnderlineAction;
-import javax.swing.text.html.HTMLDocument;
-import javax.swing.text.html.HTMLEditorKit;
-import javax.swing.text.html.HTMLWriter;
-import javax.swing.text.html.StyleSheet;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.ui.components.html.ScaledEditorKit;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.spellchecker.mindmapmode.SpellCheckerController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.EditNodeBase;
-import org.freeplane.features.text.mindmapmode.EventBuffer;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.ui.IMapViewChangeListener;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.NodeView;
-import org.freeplane.view.swing.map.ZoomableLabel;
-import org.freeplane.view.swing.map.ZoomableLabelUI;
-
-import com.lightdev.app.shtm.SHTMLWriter;
-
-
-/**
- * @author foltin
- */
-public class EditNodeTextField extends EditNodeBase {
- private class MyNavigationFilter extends NavigationFilter {
- private final JEditorPane textfield;
- public MyNavigationFilter(JEditorPane textfield) {
- this.textfield = textfield;
- }
-
- /* (non-Javadoc)
- * @see javax.swing.text.NavigationFilter#moveDot(javax.swing.text.NavigationFilter.FilterBypass, int, javax.swing.text.Position.Bias)
- */
- public void moveDot(final FilterBypass fb, int dot, final Bias bias) {
- dot = getValidPosition(dot);
- super.moveDot(fb, dot, bias);
- }
-
- /* (non-Javadoc)
- * @see javax.swing.text.NavigationFilter#setDot(javax.swing.text.NavigationFilter.FilterBypass, int, javax.swing.text.Position.Bias)
- */
- public void setDot(final FilterBypass fb, int dot, final Bias bias) {
- dot = getValidPosition(dot);
- super.setDot(fb, dot, bias);
- }
-
- private int getValidPosition(int position) {
- final HTMLDocument doc = (HTMLDocument) textfield.getDocument();
- if (doc.getDefaultRootElement().getElementCount() > 1) {
- final int startPos = doc.getDefaultRootElement().getElement(1).getStartOffset();
- final int validPosition = Math.max(position, startPos);
- return validPosition;
- }
- return position;
- }
- }
-
- private static class InputMethodInUseListener implements InputMethodListener {
- private boolean imeInUse = false;
-
- public void inputMethodTextChanged(InputMethodEvent event) {
- updateImeInUseState(event);
- }
-
- public void caretPositionChanged(InputMethodEvent event) {
- updateImeInUseState(event);
- }
-
- public boolean isIMEInUse(){
- return imeInUse;
- }
-
- private void updateImeInUseState(InputMethodEvent event) {
- AttributedCharacterIterator aci = event.getText();
- if(aci != null) {
- int inputLen = aci.getEndIndex() - aci.getBeginIndex();
- int committedLen = event.getCommittedCharacterCount();
- imeInUse = inputLen > 0 && inputLen != committedLen;
- }
- else
- imeInUse = false;
- }
-
- }
-
- private int extraWidth;
- final private boolean layoutMapOnTextChange;
-
- private final class MyDocumentListener implements DocumentListener {
- private boolean updateRunning = false;
- public void changedUpdate(final DocumentEvent e) {
- onUpdate();
- }
-
- private void onUpdate() {
- if(updateRunning){
- return;
- }
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- updateRunning = true;
- layout();
- updateRunning = false;
- }
- });
- }
-
- public void insertUpdate(final DocumentEvent e) {
- onUpdate();
- }
-
- public void removeUpdate(final DocumentEvent e) {
- onUpdate();
- }
- }
-
- private void layout() {
- if (textfield == null) {
- return;
- }
- final int lastWidth = textfield.getWidth();
- final int lastHeight = textfield.getHeight();
- final boolean lineWrap = lastWidth == maxWidth;
- Dimension preferredSize = textfield.getPreferredSize();
- if (!lineWrap) {
- preferredSize.width ++;
- if (preferredSize.width > maxWidth) {
- setLineWrap();
- preferredSize = textfield.getPreferredSize();
- }
- else {
- if (preferredSize.width < lastWidth) {
- preferredSize.width = lastWidth;
- }
- else {
- preferredSize.width = Math.min(preferredSize.width + extraWidth, maxWidth);
- if (preferredSize.width == maxWidth) {
- setLineWrap();
- }
- }
- }
- }
- else {
- preferredSize.width = Math.max(maxWidth, preferredSize.width);
- }
- if(preferredSize.width != lastWidth){
- preferredSize.height = lastHeight;
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- layout();
- }
- });
- }
- else{
- preferredSize.height = Math.max(preferredSize.height, lastHeight);
- }
- if (preferredSize.width == lastWidth && preferredSize.height == lastHeight) {
- textfield.repaint();
- return;
- }
- textfield.setSize(preferredSize);
- if(layoutMapOnTextChange)
- parent.setPreferredSize(new Dimension(preferredSize.width + horizontalSpace , preferredSize.height + verticalSpace));
- textfield.revalidate();
- final NodeView nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, parent);
- final MapView mapView = (MapView) SwingUtilities.getAncestorOfClass(MapView.class, nodeView);
- if(mapView == null)
- return;
- if(layoutMapOnTextChange)
- mapView.scrollNodeToVisible(nodeView);
- else
- mapView.scrollRectToVisible(textfield.getBounds());
- }
-
- private void setLineWrap() {
- if(null != textfield.getClientProperty("EditNodeTextField.linewrap") || inputMethodInUseListener.isIMEInUse()){
- return;
- }
-
- final HTMLDocument document = (HTMLDocument) textfield.getDocument();
- document.getStyleSheet().addRule("body { width: " + (maxWidth - 1) + "}");
- // bad hack: call "setEditable" only to update view
- textfield.setEditable(false);
- textfield.setEditable(true);
- textfield.putClientProperty("EditNodeTextField.linewrap", true);
- }
-
- private static final int SPLIT_KEY_CODE;
- static {
- String rawLabel = TextUtils.getRawText("split");
- final int mnemoSignIndex = rawLabel.indexOf('&');
- if (mnemoSignIndex >= 0 && mnemoSignIndex + 1 < rawLabel.length()) {
- final char charAfterMnemoSign = rawLabel.charAt(mnemoSignIndex + 1);
- if (charAfterMnemoSign != ' ') {
- SPLIT_KEY_CODE = charAfterMnemoSign;
- }
- else SPLIT_KEY_CODE = -1;
- }
- else SPLIT_KEY_CODE = -1;
- }
- private class TextFieldListener implements KeyListener, FocusListener, MouseListener {
- final int CANCEL = 2;
- final int EDIT = 1;
- Integer eventSource = EDIT;
- private boolean popupShown;
-
- public TextFieldListener() {
- }
-
- private void conditionallyShowPopup(final MouseEvent e) {
- if (e.isPopupTrigger()) {
- final Component component = e.getComponent();
- final JPopupMenu popupMenu = createPopupMenu(component);
- popupShown = true;
- popupMenu.show(component, e.getX(), e.getY());
- e.consume();
- }
- }
-
-
-
- public void focusGained(final FocusEvent e) {
- popupShown = false;
- }
-
- public void focusLost(final FocusEvent e) {
- if (textfield == null || !textfield.isVisible() || eventSource == CANCEL || popupShown) {
- return;
- }
- if (e == null) {
- submitText();
- hideMe();
- eventSource = CANCEL;
- return;
- }
- if (e.isTemporary() && e.getOppositeComponent() == null) {
- return;
- }
- submitText();
- hideMe();
- }
-
- private void submitText() {
- submitText(getNewText());
- }
-
- private void submitText(final String output) {
- getEditControl().ok(output);
- }
-
- public void keyPressed(final KeyEvent e) {
- if (e.isControlDown() || e.isMetaDown() || eventSource == CANCEL||textfield==null) {
- return;
- }
- final int keyCode = e.getKeyCode();
- switch (keyCode) {
- case KeyEvent.VK_ESCAPE:
- eventSource = CANCEL;
- hideMe();
- getEditControl().cancel();
- nodeView.requestFocusInWindow();
- e.consume();
- break;
- case KeyEvent.VK_ENTER: {
- final boolean enterConfirms = ResourceController.getResourceController().getBooleanProperty("el__enter_confirms_by_default");
- if (enterConfirms == e.isAltDown() || e.isShiftDown()) {
- e.consume();
- final Component component = e.getComponent();
- final KeyEvent keyEvent = new KeyEvent(component, e.getID(), e.getWhen(), 0, keyCode, e
- .getKeyChar(), e.getKeyLocation());
- SwingUtilities.processKeyBindings(keyEvent);
- break;
- }
- final String output = getNewText();
- e.consume();
- eventSource = CANCEL;
- hideMe();
- submitText(output);
- nodeView.requestFocusInWindow();
- }
- break;
- case KeyEvent.VK_TAB:
- textfield.replaceSelection(" ");
- case KeyEvent.VK_SPACE:
- e.consume();
- break;
- default:
- if(keyCode == SPLIT_KEY_CODE && keyCode != -1 && e.isAltDown() && getEditControl().canSplit()){
- eventSource = CANCEL;
- final String output = getNewText();
- final int caretPosition = textfield.getCaretPosition();
- hideMe();
- getEditControl().split(output, caretPosition);
- nodeView.requestFocusInWindow();
- e.consume();
- }
- break;
- }
- }
-
- public void keyReleased(final KeyEvent e) {
- }
-
- public void keyTyped(final KeyEvent e) {
- }
-
- public void mouseClicked(final MouseEvent ev) {
- if (textfield != null && (ev.getModifiers() & MouseEvent.CTRL_MASK) != 0) {
- final String linkURL = HtmlUtils.getURLOfExistingLink((HTMLDocument) textfield.getDocument(), textfield.viewToModel(ev.getPoint()));
- if (linkURL != null) {
- try {
- UrlManager.getController().loadURL(new URI(linkURL));
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- }
- }
- }
-
- public void mouseEntered(final MouseEvent e) {
- }
-
- public void mouseExited(final MouseEvent e) {
- }
-
- public void mousePressed(final MouseEvent e) {
- conditionallyShowPopup(e);
- }
-
- public void mouseReleased(final MouseEvent e) {
- conditionallyShowPopup(e);
- }
- }
-
- private class MapViewChangeListener implements IMapViewChangeListener{
- public void afterViewChange(Component oldView, Component newView) {
- }
-
- public void afterViewClose(Component oldView) {
- }
-
- public void afterViewCreated(Component mapView) {
- }
-
- public void beforeViewChange(Component oldView, Component newView) {
- final String output = getNewText();
- hideMe();
- getEditControl().ok(output);
- }
- }
-
- private JEditorPane textfield;
- final private InputMethodInUseListener inputMethodInUseListener;
- private final DocumentListener documentListener;
- private int maxWidth;
-
- @SuppressWarnings("serial")
- public EditNodeTextField(final NodeModel node, final ZoomableLabel parent, final String text, final IEditControl editControl) {
- super(node, text, editControl);
- this.parent = parent;
- this.layoutMapOnTextChange = ResourceController.getResourceController().getBooleanProperty("layout_map_on_text_change");
- documentListener = new MyDocumentListener();
-
- pasteAction = new DefaultEditorKit.PasteAction(){
-
- @Override
- public void actionPerformed(ActionEvent e) {
- JTextComponent target = getTextComponent(e);
- if (target == null) {
- return;
- }
- final Transferable contents = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this);
- if(contents.isDataFlavorSupported(DataFlavor.stringFlavor)){
- try {
- String text = (String) contents.getTransferData(DataFlavor.stringFlavor);
- target.replaceSelection(text);
- }
- catch (Exception ex) {
- }
- }
- }
- };
-
- boldAction = new StyledEditorKit.BoldAction();
- boldAction.putValue(Action.NAME, TextUtils.getText("BoldAction.text"));
- boldAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control B"));
-
- italicAction = new StyledEditorKit.ItalicAction();
- italicAction.putValue(Action.NAME, TextUtils.getText("ItalicAction.text"));
- italicAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control I"));
-
- underlineAction = new StyledEditorKit.UnderlineAction();
- underlineAction.putValue(Action.NAME, TextUtils.getText("UnderlineAction.text"));
- underlineAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control U"));
-
- redAction = new ForegroundAction(TextUtils.getText("red"), Color.RED);
- redAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control R"));
-
- greenAction = new ForegroundAction(TextUtils.getText("green"), Color.GREEN);
- greenAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control G"));
-
- blueAction = new ForegroundAction(TextUtils.getText("blue"), Color.BLUE);
- blueAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control E"));
-
- blackAction = new ForegroundAction(TextUtils.getText("black"), Color.BLACK);
- blackAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control K"));
-
- defaultColorAction = new ExtendedEditorKit.RemoveStyleAttributeAction(StyleConstants.Foreground, TextUtils.getText("DefaultColorAction.text"));
- defaultColorAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control D"));
-
- removeFormattingAction = new ExtendedEditorKit.RemoveStyleAttributeAction(null, TextUtils.getText("simplyhtml.clearFormatLabel"));
- removeFormattingAction.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke("control T"));
-
- inputMethodInUseListener = new InputMethodInUseListener();
- if(editControl != null ){
- final ModeController modeController = Controller.getCurrentModeController();
- final MTextController textController = (MTextController) TextController.getController(modeController);
- textfield = textController.createEditorPane(MTextController.NODE_TEXT);
- textfield.setNavigationFilter(new MyNavigationFilter(textfield));
- textfield.addInputMethodListener(inputMethodInUseListener);
- }
- }
-
- public String getNewText() {
- final SHTMLWriter shtmlWriter = new SHTMLWriter((HTMLDocument) textfield.getDocument());
- try {
- shtmlWriter.write();
- }
- catch (Exception e) {
- LogUtils.severe(e);
- }
- return shtmlWriter.toString();
- }
-
- private void hideMe() {
- if (textfield == null) {
- return;
- }
- textfield.getDocument().removeDocumentListener(documentListener);
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- mapViewManager.removeMapViewChangeListener(mapViewChangeListener);
- mapViewChangeListener = null;
- parent.setPreferredSize(null);
- if(SwingUtilities.getAncestorOfClass(MapView.class, nodeView) != null)
- nodeView.update();
- if(nodeView.isRoot() && parent instanceof MainView)
- parent.setHorizontalAlignment(JLabel.CENTER);
- final Dimension textFieldSize = textfield.getSize();
- final Point textFieldCoordinate = new Point();
- final MapView mapView = nodeView.getMap();
- UITools.convertPointToAncestor(textfield, textFieldCoordinate, mapView);
- textfield.getParent().remove(textfield);
- parent.revalidate();
- parent.repaint();
- mapView.repaint(textFieldCoordinate.x, textFieldCoordinate.y, textFieldSize.width, textFieldSize.height);
- textfield = null;
- }
-
- private final ZoomableLabel parent;
- private NodeView nodeView;
- private Font font;
- private float zoom;
- private final PasteAction pasteAction;
- private final BoldAction boldAction;
- private final ItalicAction italicAction;
- private final UnderlineAction underlineAction;
- private final ForegroundAction redAction;
- private final ForegroundAction greenAction;
- private final ForegroundAction blueAction;
- private final ForegroundAction blackAction;
- private StyledTextAction defaultColorAction;
- private StyledTextAction removeFormattingAction;
- private int horizontalSpace;
- private int verticalSpace;
- private MapViewChangeListener mapViewChangeListener;
-
- @Override
- protected JPopupMenu createPopupMenu(Component component) {
- JPopupMenu menu = super.createPopupMenu(component);
- JMenu formatMenu = new JMenu(TextUtils.getText("simplyhtml.formatLabel"));
- menu.add(formatMenu);
- if (textfield.getSelectionStart() == textfield.getSelectionEnd()){
- formatMenu.setEnabled(false);
- return menu;
- }
- formatMenu.add(boldAction);
- formatMenu.add(italicAction);
- formatMenu.add(underlineAction);
- formatMenu.add(redAction);
- formatMenu.add(greenAction);
- formatMenu.add(blueAction);
- formatMenu.add(blackAction);
- formatMenu.add(defaultColorAction);
- formatMenu.add(removeFormattingAction);
- return menu;
- }
-
- /* (non-Javadoc)
- * @see org.freeplane.view.swing.map.INodeTextField#show()
- */
- @SuppressWarnings("serial")
- @Override
- public void show(final RootPaneContainer frame) {
- final ModeController modeController = Controller.getCurrentModeController();
- final IMapViewManager viewController = modeController.getController().getMapViewManager();
- final MTextController textController = (MTextController) TextController.getController(modeController);
- nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, parent);
- font = parent.getFont();
- zoom = viewController.getZoom();
- if (zoom != 1F) {
- final float fontSize = (int) (Math.rint(font.getSize() * zoom));
- font = font.deriveFont(fontSize);
- }
- final HTMLEditorKit kit = new ScaledEditorKit(){
- @Override
- public void write(Writer out, Document doc, int pos, int len) throws IOException, BadLocationException {
- if (doc instanceof HTMLDocument) {
- HTMLWriter w = new SHTMLWriter(out, (HTMLDocument) doc, pos, len);
- w.write();
- }
- else {
- super.write(out, doc, pos, len);
- }
- }
- };
- textfield.setEditorKit(kit);
-
- final InputMap inputMap = textfield.getInputMap();
- final ActionMap actionMap = textfield.getActionMap();
- actionMap.put(DefaultEditorKit.pasteAction, pasteAction);
-
- inputMap.put((KeyStroke) boldAction.getValue(Action.ACCELERATOR_KEY), "boldAction");
- actionMap.put("boldAction",boldAction);
-
- inputMap.put((KeyStroke) italicAction.getValue(Action.ACCELERATOR_KEY), "italicAction");
- actionMap.put("italicAction", italicAction);
-
- inputMap.put((KeyStroke) underlineAction.getValue(Action.ACCELERATOR_KEY), "underlineAction");
- actionMap.put("underlineAction", underlineAction);
-
- inputMap.put((KeyStroke) redAction.getValue(Action.ACCELERATOR_KEY), "redAction");
- actionMap.put("redAction", redAction);
-
- inputMap.put((KeyStroke) greenAction.getValue(Action.ACCELERATOR_KEY), "greenAction");
- actionMap.put("greenAction", greenAction);
-
- inputMap.put((KeyStroke) blueAction.getValue(Action.ACCELERATOR_KEY), "blueAction");
- actionMap.put("blueAction", blueAction);
-
- inputMap.put((KeyStroke) blackAction.getValue(Action.ACCELERATOR_KEY), "blackAction");
- actionMap.put("blackAction", blackAction);
-
- inputMap.put((KeyStroke) defaultColorAction.getValue(Action.ACCELERATOR_KEY), "defaultColorAction");
- actionMap.put("defaultColorAction", defaultColorAction);
-
- inputMap.put((KeyStroke) removeFormattingAction.getValue(Action.ACCELERATOR_KEY), "removeFormattingAction");
- actionMap.put("removeFormattingAction", removeFormattingAction);
-
- final Color nodeTextColor = parent.getForeground();
- textfield.setCaretColor(nodeTextColor);
- final StringBuilder ruleBuilder = new StringBuilder(100);
- ruleBuilder.append("body {");
- ruleBuilder.append("font-family: ").append(font.getFamily()).append(";");
- final int fontSize = Math.round(font.getSize() / UITools.FONT_SCALE_FACTOR);
- ruleBuilder.append("font-size: ").append(fontSize).append("pt;");
- if (font.isItalic()) {
- ruleBuilder.append("font-style: italic; ");
- }
- if (font.isBold()) {
- ruleBuilder.append("font-weight: bold; ");
- }
- ruleBuilder.append("color: ").append(ColorUtils.colorToString(nodeTextColor)).append(";");
- final Color bgColor = getBackground();
- ruleBuilder.append("background-color: ").append(ColorUtils.colorToString(bgColor)).append(";");
- ruleBuilder.append("}\n");
- final HTMLDocument document = (HTMLDocument) textfield.getDocument();
- final StyleSheet styleSheet = document.getStyleSheet();
- styleSheet.addRule(ruleBuilder.toString());
- textfield.setText(text);
- final MapView mapView = (MapView) viewController.getMapViewComponent();
- if(! mapView.isValid())
- mapView.validate();
- final NodeStyleController nsc = NodeStyleController.getController(modeController);
- maxWidth = nsc.getMaxWidth(node);
- final Icon icon = parent.getIcon();
- if(icon != null){
- maxWidth -= icon.getIconWidth();
- maxWidth -= parent.getIconTextGap();
- }
- maxWidth = mapView.getZoomed(maxWidth);
- extraWidth = ResourceController.getResourceController().getIntProperty("editor_extra_width", 80);
- extraWidth = mapView.getZoomed(extraWidth);
- final TextFieldListener textFieldListener = new TextFieldListener();
- this.textFieldListener = textFieldListener;
- textfield.addFocusListener(textFieldListener);
- textfield.addKeyListener(textFieldListener);
- textfield.addMouseListener(textFieldListener);
- mapViewChangeListener = new MapViewChangeListener();
- Controller.getCurrentController().getMapViewManager().addMapViewChangeListener(mapViewChangeListener);
- SpellCheckerController.getController().enableAutoSpell(textfield, true);
- mapView.scrollNodeToVisible(nodeView);
- assert( parent.isValid());
- final int nodeWidth = parent.getWidth();
- final int nodeHeight = parent.getHeight();
- final Dimension textFieldSize;
- textfield.setBorder(new MatteBorder(2, 2, 2, 2, nodeView.getSelectedColor()));
- textFieldSize = textfield.getPreferredSize();
- textFieldSize.width += 1;
- if(textFieldSize.width < extraWidth)
- textFieldSize.width = extraWidth;
- if(textFieldSize.width < 10)
- textFieldSize.width = 10;
- if (textFieldSize.width > maxWidth) {
- textFieldSize.width = maxWidth;
- setLineWrap();
- textFieldSize.height = textfield.getPreferredSize().height;
- }
- final Rectangle textR = ((ZoomableLabelUI)parent.getUI()).getTextR(parent);
- textFieldSize.width = Math.max(textFieldSize.width, textR.width);
- textFieldSize.height = Math.max(textFieldSize.height, textR.height);
- textfield.setSize(textFieldSize.width, textFieldSize.height);
- horizontalSpace = Math.max(nodeWidth - textFieldSize.width, textR.x);
- verticalSpace = Math.max(nodeHeight - textFieldSize.height, textR.y);
- final Dimension newParentSize = new Dimension(horizontalSpace + textFieldSize.width, verticalSpace + textFieldSize.height);
- parent.setPreferredSize(newParentSize);
-
- final Point location = new Point(textR.x - 2, textR.y);
- if(! layoutMapOnTextChange)
- UITools.convertPointToAncestor(parent, location, mapView);
- textfield.setBounds(location.x, location.y, textFieldSize.width, textFieldSize.height);
- parent.setText("");
- if(nodeView.isRoot() && parent instanceof MainView)
- parent.setHorizontalAlignment(JLabel.LEFT);
- if(layoutMapOnTextChange)
- parent.add(textfield, 0);
- else
- mapView.add(textfield, 0);
- final EventBuffer eventQueue = MTextController.getController().getEventQueue();
- KeyEvent firstEvent = eventQueue.getFirstEvent();
- redispatchKeyEvents(textfield, firstEvent);
- if (firstEvent == null) {
- MouseEvent currentEvent = eventQueue.getMouseEvent();
- int pos = document.getLength();
- if(currentEvent != null){
- MouseEvent mouseEvent = (MouseEvent) currentEvent;
- if(mouseEvent.getComponent().equals(parent)){
- final Point point = mouseEvent.getPoint();
- point.x -= textR.x;
- point.y -= textR.y;
- pos = textfield.viewToModel(point);
- }
- }
- textfield.setCaretPosition(pos);
- }
- document.addDocumentListener(documentListener);
- if(textController.isMinimized(node)){
- layout();
- }
- textfield.repaint();
- textfield.requestFocusInWindow();
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/map/mindmapmode/MMapViewController.java b/freeplane/src/org/freeplane/view/swing/map/mindmapmode/MMapViewController.java
deleted file mode 100644
index 28ed273..0000000
--- a/freeplane/src/org/freeplane/view/swing/map/mindmapmode/MMapViewController.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.map.mindmapmode;
-
-import java.awt.Color;
-import java.awt.Dimension;
-import java.awt.Font;
-import javax.swing.JComponent;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.text.mindmapmode.EditNodeBase;
-import org.freeplane.features.text.mindmapmode.EditNodeBase.EditedComponent;
-import org.freeplane.features.text.mindmapmode.EditNodeWYSIWYG;
-import org.freeplane.features.text.mindmapmode.IEditBaseCreator;
-import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.MapViewController;
-import org.freeplane.view.swing.map.NodeView;
-import org.freeplane.view.swing.map.ZoomableLabel;
-
-/**
- * @author Dimitry Polivaev
- * Jan 31, 2009
- */
-public class MMapViewController extends MapViewController implements IEditBaseCreator {
- public EditNodeBase createEditor(final NodeModel node, final EditNodeBase.IEditControl editControl,
- String text, final boolean editLong) {
- final String htmlEditingOption = ResourceController.getResourceController().getProperty("html_editing_option");
- final boolean editInternalWysiwyg = editLong && StringUtils.equals(htmlEditingOption, "internal-wysiwyg");
- final boolean editExternal = editLong && StringUtils.equals(htmlEditingOption, "external");
- if(! HtmlUtils.isHtmlNode(text)){
- text = HtmlUtils.plainToHTML(text);
- }
- if (editInternalWysiwyg) {
- final EditNodeWYSIWYG editNodeWYSIWYG = new EditNodeWYSIWYG(node, text, editControl, true);
- final ViewController viewController = Controller.getCurrentModeController().getController().getViewController();
- if(EditedComponent.TEXT.equals(editControl.getEditType())){
- int preferredHeight = (int) (getComponent(node).getHeight() * 1.2);
- preferredHeight = Math.max(preferredHeight, Integer.parseInt(ResourceController.getResourceController()
- .getProperty("el__min_default_window_height")));
- preferredHeight = Math.min(preferredHeight, Integer.parseInt(ResourceController.getResourceController()
- .getProperty("el__max_default_window_height")));
- int preferredWidth = (int) (getComponent(node).getWidth() * 1.2);
- preferredWidth = Math.max(preferredWidth, Integer.parseInt(ResourceController.getResourceController()
- .getProperty("el__min_default_window_width")));
- preferredWidth = Math.min(preferredWidth, Integer.parseInt(ResourceController.getResourceController()
- .getProperty("el__max_default_window_width")));
- final Dimension preferredSize = new Dimension(preferredWidth, preferredHeight);
- editNodeWYSIWYG.setPreferredSize(preferredSize);
- }
- final MainView mainView = (MainView) getComponent(node);
- final NodeView nodeView = mainView.getNodeView();
- if(EditedComponent.TEXT.equals(editControl.getEditType())){
- final Font font = getFont(node);
- editNodeWYSIWYG.setTitle("edit_long_node");
- editNodeWYSIWYG.setFont(font);
- final Color nodeTextColor = getTextColor(node);
- editNodeWYSIWYG.setTextColor(nodeTextColor);
- editNodeWYSIWYG.setBackground (nodeView.getTextBackground());
- }
- else if(EditedComponent.DETAIL.equals(editControl.getEditType())){
- final MapView map = nodeView.getMap();
- editNodeWYSIWYG.setTitle("edit_details");
- editNodeWYSIWYG.setFont(map.getDetailFont());
- editNodeWYSIWYG.setTextColor(map.getDetailForeground());
- editNodeWYSIWYG.setBackground (nodeView.getDetailBackground());
- }
- else if(EditedComponent.NOTE.equals(editControl.getEditType())){
- final MapView map = nodeView.getMap();
- editNodeWYSIWYG.setTitle("edit_note");
- editNodeWYSIWYG.setFont(map.getDefaultNoteFont());
- editNodeWYSIWYG.setBackground (Color.WHITE);
- }
- return editNodeWYSIWYG;
- }
- else if (editExternal) {
- return new EditNodeExternalApplication(node, text, editControl);
- }
- else {
- final EditNodeBase textfield = createEditor(node, editControl.getEditType(), text, editControl);
- if(textfield != null)
- return textfield;
- }
- return createEditor(node, editControl, text, true);
- }
-
- private EditNodeBase createEditor(final NodeModel node, final EditedComponent parent, final String text,
- final IEditControl editControl) {
- final ZoomableLabel parentComponent;
- final MainView mainView = (MainView) getComponent(node);
- final NodeView nodeView = mainView.getNodeView();
- if(EditedComponent.TEXT.equals(parent))
- parentComponent = mainView;
- else if(EditedComponent.DETAIL.equals(parent)) {
- final JComponent component = nodeView.getContent(NodeView.DETAIL_VIEWER_POSITION);
- if(component instanceof ZoomableLabel)
- parentComponent = (ZoomableLabel) component;
- else
- parentComponent = null;
- }
- else
- parentComponent = null;
- if(parentComponent == null || ! parentComponent.isVisible()){
- return null;
- }
- final EditNodeTextField textField = new EditNodeTextField(node, (ZoomableLabel) parentComponent, text, editControl);
- if(EditedComponent.TEXT.equals(parent))
- textField.setBackground (nodeView.getTextBackground());
- else if(EditedComponent.DETAIL.equals(parent))
- textField.setBackground (nodeView.getDetailBackground());
- return textField;
- }
-
- public MMapViewController(Controller controller) {
- super(controller);
- new EditNodeTextField(null, null, null, null);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/DefaultMapMouseListener.java b/freeplane/src/org/freeplane/view/swing/ui/DefaultMapMouseListener.java
deleted file mode 100644
index 5031e25..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/DefaultMapMouseListener.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui;
-
-import java.awt.Component;
-import java.awt.Frame;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.Window;
-import java.awt.event.MouseEvent;
-import java.awt.event.WindowEvent;
-import java.awt.event.WindowFocusListener;
-
-import javax.swing.JComponent;
-import javax.swing.JDialog;
-import javax.swing.JPopupMenu;
-
-import org.freeplane.core.ui.ControllerPopupMenuListener;
-import org.freeplane.core.ui.IMouseListener;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.view.swing.map.MapView;
-
-/**
- * @author Dimitry Polivaev
- * 06.01.2009
- */
-/**
- * The MouseListener which belongs to MapView
- */
-public class DefaultMapMouseListener implements IMouseListener {
-
- public DefaultMapMouseListener() {
- }
-
- protected void handlePopup(final MouseEvent e) {
- if (e.isPopupTrigger()) {
- Component popup = null;
- final Component popupForModel;
- final MapView mapView = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
- final ModeController modeController = Controller.getCurrentController().getModeController();
- if(mapView != null){
- final java.lang.Object obj = mapView.detectCollision(e.getPoint());
- popupForModel= LinkController.getController(modeController).getPopupForModel(obj);
- }
- else{
- popupForModel = null;
- }
- if (popupForModel != null) {
- final ControllerPopupMenuListener popupListener = new ControllerPopupMenuListener();
- popupForModel.addHierarchyListener(popupListener);
- popup = popupForModel;
- }
- else {
- popup = modeController.getUserInputListenerFactory().getMapPopup();
- }
- Component component = e.getComponent();
- if(popup instanceof JPopupMenu) {
- ((JPopupMenu)popup).show(component, e.getX(), e.getY());
- }
- else {
- Point locationOnScreen = component.getLocationOnScreen();
- final Component window;
- if(popup instanceof Window){
- window= popup;
- }
- else{
- final Frame frame = UITools.getFrame();
- final JDialog d = new JDialog(frame, popup.getName());
- d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
- d.setModal(false);
- d.add(popup);
- d.pack();
- d.addWindowFocusListener(new WindowFocusListener() {
- public void windowLostFocus(WindowEvent e) {
- }
-
- public void windowGainedFocus(WindowEvent e) {
- frame.addWindowFocusListener(new WindowFocusListener() {
- public void windowLostFocus(WindowEvent e) {
- }
-
- public void windowGainedFocus(WindowEvent e) {
- d.setVisible(false);
- frame.removeWindowFocusListener(this);
- }
- });
- d.removeWindowFocusListener(this);
- }
- });
- window = d;
- }
- window.setLocation(locationOnScreen.x+e.getX(), locationOnScreen.y + e.getY());
- window.setVisible(true);
- }
-
- }
- }
-
- public void mouseClicked(final MouseEvent e) {
- final Object source = e.getSource();
- if(! (source instanceof MapView))
- return;
- final MapView map = (MapView) source;
- final Controller controller = map.getModeController().getController();
- final IMapSelection selection = controller.getSelection();
- if(selection != null){
- final NodeModel selected = selection.getSelected();
- if(selected != null)
- controller.getMapViewManager().getComponent(selected).requestFocusInWindow();
- }
- }
-
- public void mouseEntered(final MouseEvent e) {
- }
-
- public void mouseExited(final MouseEvent e) {
- }
-
- public void mouseMoved(final MouseEvent e) {
- }
-
- public void mousePressed(final MouseEvent e) {
- final MapView mapView = MapView.getMapView(e.getComponent());
- if(mapView != null)
- mapView.select();
- if (e.isPopupTrigger()) {
- handlePopup(e);
- }
- else if (e.getButton() == MouseEvent.BUTTON1){
- if(mapView != null){
- mapView.setMoveCursor(true);
- originX = e.getX();
- originY = e.getY();
- }
- }
- e.consume();
- }
-
- public void mouseReleased(final MouseEvent e) {
- final MapView mapView = MapView.getMapView(e.getComponent());
- if(mapView != null)
- mapView.setMoveCursor(false);
- originX = -1;
- originY = -1;
- handlePopup(e);
- e.consume();
- }
- // // final private Controller controller;
- protected int originX = -1;
- protected int originY = -1;
-
- /**
- *
- */
- public void mouseDragged(final MouseEvent e) {
- final JComponent component = (JComponent) e.getComponent();
- final MapView mapView = MapView.getMapView(component);
- if(mapView == null)
- return;
- if (originX >= 0) {
- final int dx = originX - e.getX();
- final int dy = originY - e.getY();
- final Rectangle visibleRect = component.getVisibleRect();
- final Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1);
- final boolean isEventPointVisible = visibleRect.contains(r);
- if (isEventPointVisible)
- mapView.scrollBy(dx, dy);
- else {
- mapView.scrollBy(dx/3, dy/3);
- originX += dx/3;
- originY += dy/3;
- }
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeKeyListener.java b/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeKeyListener.java
deleted file mode 100644
index d6df640..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeKeyListener.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package org.freeplane.view.swing.ui;
-
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-
-import javax.swing.JPopupMenu;
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.ControllerPopupMenuListener;
-import org.freeplane.core.ui.IEditHandler;
-import org.freeplane.core.ui.IEditHandler.FirstAction;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- * The KeyListener which belongs to the node and cares for Events like C-D
- * (Delete Node). It forwards the requests to NodeController.
- */
-public class DefaultNodeKeyListener implements KeyListener {
- final private IEditHandler editHandler;
-
- public DefaultNodeKeyListener(final IEditHandler editHandler) {
- this.editHandler = editHandler;
- }
-
- public void keyPressed(final KeyEvent e) {
- final boolean checkForScrollMap = e.isShiftDown() && e.isControlDown()&& e.isAltDown();
- final MapView mapView = (MapView) Controller.getCurrentController().getMapViewManager().getMapViewComponent();
- if (mapView == null || SwingUtilities.isDescendingFrom(mapView, e.getComponent()))
- return;
- if(checkForScrollMap){
- switch (e.getKeyCode()) {
- case KeyEvent.VK_UP:
- mapView.scrollBy(0, -10);
- e.consume();
- return;
- case KeyEvent.VK_DOWN:
- mapView.scrollBy(0, 10);
- e.consume();
- return;
- case KeyEvent.VK_LEFT:
- mapView.scrollBy(-10, 0);
- e.consume();
- return;
- case KeyEvent.VK_RIGHT:
- mapView.scrollBy(10, 0);
- e.consume();
- }
- return;
- }
- if ((e.isAltDown() || e.isControlDown() || e.isMetaDown())) {
- return;
- }
- switch (e.getKeyCode()) {
- case KeyEvent.VK_ENTER:
- case KeyEvent.VK_ESCAPE:
- case KeyEvent.VK_SHIFT:
- case KeyEvent.VK_DELETE:
- case KeyEvent.VK_SPACE:
- case KeyEvent.VK_INSERT:
- case KeyEvent.VK_TAB:
- return;
- }
- final boolean continious = e.isShiftDown();
- switch (e.getKeyCode()) {
- case KeyEvent.VK_UP:
- if (mapView.selectUp(continious))
- e.consume();
- return;
- case KeyEvent.VK_DOWN:
- if (mapView.selectDown(continious))
- e.consume();
- return;
- case KeyEvent.VK_LEFT:
- if (mapView.selectLeft(continious))
- e.consume();
- return;
- case KeyEvent.VK_RIGHT:
- if (mapView.selectRight(continious))
- e.consume();
- return;
- case KeyEvent.VK_PAGE_UP:
- if (mapView.selectPageUp(continious))
- e.consume();
- return;
- case KeyEvent.VK_PAGE_DOWN:
- if (mapView.selectPageDown(continious))
- e.consume();
- return;
- case KeyEvent.VK_HOME:
- case KeyEvent.VK_END:
- case KeyEvent.VK_BACK_SPACE:
- if (editHandler != null) {
- editHandler.edit(e, FirstAction.EDIT_CURRENT, false);
- }
- return;
- case KeyEvent.VK_CONTEXT_MENU:
- final ModeController modeController = Controller.getCurrentModeController();
- final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
- final NodeView nodeView = mapView.getNodeView(node);
- final JPopupMenu popupmenu = modeController.getUserInputListenerFactory().getNodePopupMenu();
- if (popupmenu != null) {
- popupmenu.addHierarchyListener(new ControllerPopupMenuListener());
- final MainView mainView = nodeView.getMainView();
- popupmenu.show(mainView, mainView.getX(), mainView.getY());
- }
- }
- }
-
- public void keyReleased(final KeyEvent e) {
- }
-
- public void keyTyped(final KeyEvent e) {
- if ((e.isAltDown() || e.isControlDown() || e.isMetaDown())) {
- return;
- }
- final String keyTypeActionString = ResourceController.getResourceController().getProperty("key_type_action",
- FirstAction.EDIT_CURRENT.toString());
- final FirstAction keyTypeAction = FirstAction.valueOf(keyTypeActionString);
- if (!FirstAction.IGNORE.equals(keyTypeAction)) {
- if (! isActionEvent(e)) {
- if (editHandler != null) {
- editHandler.edit(e, keyTypeAction, false);
- }
- return;
- }
- }
- }
-
- private boolean isActionEvent(final KeyEvent e) {
- return e.isActionKey() || isControlCharacter(e.getKeyChar());
- }
-
- private boolean isControlCharacter(char keyChar) {
- return keyChar == KeyEvent.CHAR_UNDEFINED || keyChar <= KeyEvent.VK_SPACE|| keyChar == KeyEvent.VK_DELETE;
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeMouseMotionListener.java b/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeMouseMotionListener.java
deleted file mode 100644
index 33ab49d..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/DefaultNodeMouseMotionListener.java
+++ /dev/null
@@ -1,230 +0,0 @@
-package org.freeplane.view.swing.ui;
-
-import java.awt.Cursor;
-import java.awt.event.MouseEvent;
-import java.net.URI;
-
-import javax.swing.JPopupMenu;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.DoubleClickTimer;
-import org.freeplane.core.ui.IMouseListener;
-import org.freeplane.core.ui.components.AutoHide;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.map.FoldingController;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.view.swing.map.FoldingMark;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.MouseArea;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- * The MouseMotionListener which belongs to every NodeView
- */
-public class DefaultNodeMouseMotionListener implements IMouseListener {
- protected final NodeSelector nodeSelector;
- private static final String FOLD_ON_CLICK_INSIDE = "fold_on_click_inside";
- /**
- * The mouse has to stay in this region to enable the selection after a
- * given time.
- */
- protected final DoubleClickTimer doubleClickTimer;
-
- public DefaultNodeMouseMotionListener() {
-// mc = modeController;
- doubleClickTimer = new DoubleClickTimer();
- nodeSelector = new NodeSelector();
- }
-
-
- protected boolean isInFoldingRegion(MouseEvent e) {
- return ((MainView)e.getComponent()).isInFoldingRegion(e.getPoint());
- }
-
- protected boolean isInDragRegion(MouseEvent e) {
- return ((MainView)e.getComponent()).isInDragRegion(e.getPoint());
- }
-
- public void mouseClicked(final MouseEvent e) {
- final ModeController mc = Controller.getCurrentController().getModeController();
- if(Compat.isMacOsX()){
- final JPopupMenu popupmenu = mc.getUserInputListenerFactory().getNodePopupMenu();
- if(popupmenu.isShowing()){
- return;
- }
- }
- final MainView component = (MainView) e.getComponent();
- NodeView nodeView = component.getNodeView();
- if (nodeView == null)
- return;
-
- final NodeModel node = nodeView.getModel();
- final boolean plainEvent = Compat.isPlainEvent(e);
- final boolean inside = nodeSelector.isInside(e);
- final MapController mapController = mc.getMapController();
- if(e.getButton() == 1){
- if(plainEvent){
- if (component.isInFollowLinkRegion(e.getX())) {
- LinkController.getController(mc).loadURL(node, e);
- e.consume();
- return;
- }
-
- final String link = component.getLink(e.getPoint());
- if (link != null) {
- doubleClickTimer.start(new Runnable() {
- public void run() {
- loadLink(link);
- }
- });
- e.consume();
- return;
- }
-
- if(inside && e.getClickCount() == 1 && ResourceController.getResourceController().getBooleanProperty(FOLD_ON_CLICK_INSIDE)){
- final boolean fold = FoldingMark.UNFOLDED.equals(component.foldingMarkType(mapController, node)) && ! mapController.hasHiddenChildren(node);
- if (!nodeSelector.shouldSelectOnClick(e)) {
- doubleClickTimer.start(new Runnable() {
- public void run() {
- mapController.setFolded(node, fold);
- }
- });
- }
- }
- }
- else if(Compat.isShiftEvent(e)){
- if (isInFoldingRegion(e)) {
- if (! mapController.showNextChild(node))
- mapController.setFolded(node, true);
- e.consume();
- }
- }
- }
- final boolean inFoldingRegion = isInFoldingRegion(e);
- if ((plainEvent && inFoldingRegion
- || (inFoldingRegion || inside) && Compat.isCtrlShiftEvent(e))
- && !nodeSelector.shouldSelectOnClick(e)) {
- boolean fold = FoldingMark.UNFOLDED.equals(component.foldingMarkType(mapController, node)) && ! mapController.hasHiddenChildren(node);
- doubleClickTimer.cancel();
- mapController.setFolded(node, fold);
- e.consume();
- return;
- }
- if(inside && e.getButton() == 1 && ! e.isAltDown())
- nodeSelector.extendSelection(e);
- }
-
-
- protected void loadLink(final String link) {
- try {
- UrlManager.getController().loadURL(new URI(link));
- } catch (Exception ex) {
- LogUtils.warn(ex);
- }
- }
-
- /**
- * Invoked when a mouse button is pressed on a component and then
- * dragged.
- */
- public void mouseDragged(final MouseEvent e) {
- if (!nodeSelector.isInside(e))
- return;
- nodeSelector.stopTimerForDelayedSelection();
- nodeSelector.selectSingleNode(e);
- }
-
- public void mouseEntered(final MouseEvent e) {
- if (nodeSelector.isRelevant(e)) {
- nodeSelector.createTimer(e);
- mouseMoved(e);
- }
- }
-
- public void mouseExited(final MouseEvent e) {
- nodeSelector.stopTimerForDelayedSelection();
- final MainView v = (MainView) e.getSource();
- v.setMouseArea(MouseArea.OUT);
- nodeSelector.trackWindowForComponent(v);
- }
-
- public void mouseMoved(final MouseEvent e) {
- if (!nodeSelector.isRelevant(e))
- return;
- final MainView node = ((MainView) e.getComponent());
- String link = node.getLink(e.getPoint());
- boolean followLink = link != null;
- Controller currentController = Controller.getCurrentController();
- if(! followLink){
- followLink = node.isInFollowLinkRegion(e.getX());
- if(followLink){
- link = LinkController.getController(currentController.getModeController()).getLinkShortText(node.getNodeView().getModel());
- }
- }
- final Cursor requiredCursor;
- if(followLink){
- currentController.getViewController().out(link);
- requiredCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
- node.setMouseArea(MouseArea.LINK);
- }
- else if (isInFoldingRegion(e)){
- requiredCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
- node.setMouseArea(MouseArea.FOLDING);
- }
- else{
- requiredCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
- node.setMouseArea(MouseArea.DEFAULT);
- }
- if (node.getCursor().getType() != requiredCursor.getType() || requiredCursor.getType() == Cursor.CUSTOM_CURSOR && node.getCursor() != requiredCursor) {
- node.setCursor(requiredCursor);
- }
- nodeSelector.createTimer(e);
- }
-
- public void mousePressed(final MouseEvent e) {
- final MapView mapView = MapView.getMapView(e.getComponent());
- mapView.select();
- doubleClickTimer.cancel();
- showPopupMenu(e);
- }
-
- public void mouseReleased(final MouseEvent e) {
- nodeSelector.stopTimerForDelayedSelection();
- showPopupMenu(e);
- }
-
- public void showPopupMenu(final MouseEvent e) {
- if (! e.isPopupTrigger())
- return;
- final boolean inside = nodeSelector.isInside(e);
- final boolean inFoldingRegion = ! inside && isInFoldingRegion(e);
- if (inside || inFoldingRegion) {
- if(inside){
- nodeSelector.stopTimerForDelayedSelection();
- new NodePopupMenuDisplayer().showNodePopupMenu(e);
- }
- else if(inFoldingRegion){
- showFoldingPopup(e);
- }
- }
- }
-
- private void showFoldingPopup(MouseEvent e) {
- ModeController mc = Controller.getCurrentController().getModeController();
- final FoldingController foldingController = mc.getExtension(FoldingController.class);
- if(foldingController == null)
- return;
- final NodeView nodeView = nodeSelector.getRelatedNodeView(e);
- final JPopupMenu popupmenu = foldingController.createFoldingPopupMenu(nodeView.getModel());
- AutoHide.start(popupmenu);
- new NodePopupMenuDisplayer().showMenuAndConsumeEvent(popupmenu, e);
- }
-
-}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/DetailsViewMouseListener.java b/freeplane/src/org/freeplane/view/swing/ui/DetailsViewMouseListener.java
deleted file mode 100644
index 326100d..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/DetailsViewMouseListener.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui;
-
-import java.awt.event.MouseEvent;
-
-import javax.swing.JPopupMenu;
-
-import org.freeplane.core.util.Compat;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.text.DetailTextModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.view.swing.map.NodeView;
-import org.freeplane.view.swing.map.ZoomableLabel;
-
-/**
- * @author Dimitry Polivaev
- * Oct 1, 2011
- */
-public class DetailsViewMouseListener extends LinkNavigatorMouseListener {
- protected final NodeSelector nodeSelector;
-
- public DetailsViewMouseListener() {
- nodeSelector = new NodeSelector();
- }
-
- @Override
- public void mouseClicked(MouseEvent e) {
- final ModeController mc = Controller.getCurrentController().getModeController();
- if (Compat.isMacOsX()) {
- final JPopupMenu popupmenu = mc.getUserInputListenerFactory().getNodePopupMenu();
- if (popupmenu.isShowing()) {
- return;
- }
- }
- final NodeView nodeView = nodeSelector.getRelatedNodeView(e);
- if (nodeView == null)
- return;
- final NodeModel model = nodeView.getModel();
- TextController controller = TextController.getController();
- if (eventFromHideDisplayArea(e)){
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- selection.keepNodePosition(model, 0.0f, 0.0f);
- controller.setDetailsHidden(model, ! DetailTextModel.getDetailText(model).isHidden());
- }
- else {
- nodeSelector.extendSelection(e);
- if (canEdit(controller) && isEditingStartEvent(e)) {
- ((MTextController) controller).editDetails(model, e, e.isAltDown());
- }
- else
- super.mouseClicked(e);
- }
- }
-
- protected boolean eventFromHideDisplayArea(MouseEvent e) {
- final ZoomableLabel component = (ZoomableLabel) e.getComponent();
- return e.getX() < component.getIconWidth();
- }
-
- private boolean canEdit(TextController controller) {
- try {
- return controller instanceof MTextController;
- } catch (Throwable e) {
- return false;
- }
- }
-
- private boolean isEditingStartEvent(MouseEvent e) {
- return e.getClickCount() == 2;
- }
-
- @Override
- public void mousePressed(MouseEvent e) {
- new NodePopupMenuDisplayer().showNodePopupMenu(e);
- }
-
- @Override
- public void mouseReleased(MouseEvent e) {
- new NodePopupMenuDisplayer().showNodePopupMenu(e);
- }
-
- @Override
- public void mouseMoved(MouseEvent e) {
- super.mouseMoved(e);
- if (!eventFromHideDisplayArea(e) && nodeSelector.isRelevant(e))
- nodeSelector.createTimer(e);
- else
- nodeSelector.stopTimerForDelayedSelection();
- }
-
- /**
- * Invoked when a mouse button is pressed on a component and then
- * dragged.
- */
- @Override
- public void mouseDragged(final MouseEvent e) {
- nodeSelector.stopTimerForDelayedSelection();
- nodeSelector.selectSingleNode(e);
- }
-
- @Override
- public void mouseEntered(final MouseEvent e) {
- if (!eventFromHideDisplayArea(e) && nodeSelector.isRelevant(e)) {
- mouseMoved(e);
- }
- else
- nodeSelector.stopTimerForDelayedSelection();
- }
-
- @Override
- public void mouseExited(final MouseEvent e) {
- nodeSelector.stopTimerForDelayedSelection();
- nodeSelector.trackWindowForComponent(e.getComponent());
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/ui/MapsMenuActionListener.java b/freeplane/src/org/freeplane/view/swing/ui/MapsMenuActionListener.java
deleted file mode 100644
index e44e21a..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/MapsMenuActionListener.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.SwingUtilities;
-
-import org.freeplane.features.mode.Controller;
-
-class MapsMenuActionListener implements ActionListener {
-// // final private Controller controller;
-
- public MapsMenuActionListener(final Controller controller) {
-// this.controller = controller;
- }
-
- public void actionPerformed(final ActionEvent e) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- Controller.getCurrentController().getMapViewManager().changeToMapView(e.getActionCommand());
- }
- });
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/MenuXmlCreator.java b/freeplane/src/org/freeplane/view/swing/ui/MenuXmlCreator.java
deleted file mode 100644
index b913b33..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/MenuXmlCreator.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.net.URL;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.XsltPipeReaderFactory;
-
-/**
- * @author Dimitry Polivaev
- * 29.09.2013
- */
-public class MenuXmlCreator {
-
- private static final String MM = "mm";
- private static final String XML = "xml";
- private final String xslt;
-
- public MenuXmlCreator(String xslt) {
- super();
- this.xslt = xslt;
- }
-
- public URL menuResource(String menuStructureXmlPath) {
- try {
- updateXml(menuStructureXmlPath);
- }
- catch (IOException e) {
- LogUtils.warn(e);
- }
- URL xmlResource = ResourceController.getResourceController().getResource(menuStructureXmlPath);
- return xmlResource;
- }
-
- private void updateXml(String menuStructureXmlPath) throws IOException{
- ResourceController resourceController = ResourceController.getResourceController();
- URL xmlResource = resourceController.getResource(menuStructureXmlPath);
- String menuStructureMapPath = menuStructureXmlPath.subSequence(0, menuStructureXmlPath.length() - XML.length()) + MM;
- URL mmResource = resourceController.getResource(menuStructureMapPath);
- if (isFile(mmResource)) {
- File mmFile = toFile(mmResource);
- if (!isFile(xmlResource) || toFile(xmlResource).lastModified() <= mmFile.lastModified()) {
- transformMindMapToXml(mmFile);
- }
- }
- }
-
- private void transformMindMapToXml(File mmFile) throws IOException {
- Writer out = null;
- try {
- String xml = new XsltPipeReaderFactory().transformToString(mmFile, xslt);
- String mmPath = mmFile.getPath();
- String xmlPath = mmPath.substring(0, mmPath.length() - MM.length()) + XML;
- out = new BufferedWriter(new OutputStreamWriter(
- new FileOutputStream(xmlPath), "UTF-8"));
- out.write(xml);
- }
- catch(Exception ex){
- LogUtils.warn(ex);
- }
- finally {
- try {
- if (out != null )out.close();
- }
- catch (Exception e) {
- }
- }
- }
-
- private File toFile(URL url) {
- return new File (url.getFile());
- }
-
- private boolean isFile(URL url) {
- return url != null && "file".equals(url.getProtocol());
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/ModesMenuActionListener.java b/freeplane/src/org/freeplane/view/swing/ui/ModesMenuActionListener.java
deleted file mode 100644
index 85e7e7b..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/ModesMenuActionListener.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.features.mode.Controller;
-
-class ModesMenuActionListener extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
- private final String mode;
-
- public ModesMenuActionListener(final String mode, final Controller controller) {
- super("ModesMenuAction." + mode);
- this.mode = mode;
- }
-
- public void actionPerformed(final ActionEvent e) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- Controller.getCurrentController().selectMode(mode);
- }
- });
- }
-
- @Override
- public void afterMapChange(final Object newMap) {
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/NodeSelector.java b/freeplane/src/org/freeplane/view/swing/ui/NodeSelector.java
deleted file mode 100644
index 4aa9adf..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/NodeSelector.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui;
-
-import java.awt.Component;
-import java.awt.KeyboardFocusManager;
-import java.awt.Rectangle;
-import java.awt.Window;
-import java.awt.event.MouseEvent;
-import java.awt.geom.Point2D;
-import java.util.Timer;
-import java.util.TimerTask;
-
-import javax.swing.FocusManager;
-import javax.swing.SwingUtilities;
-import javax.swing.text.JTextComponent;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.SysUtils;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- * @author Dimitry Polivaev
- * 19.06.2013
- */
-public class NodeSelector {
- private static final String SELECTION_METHOD_DIRECT = "selection_method_direct";
- private static final String SELECTION_METHOD_BY_CLICK = "selection_method_by_click";
- private static final String TIME_FOR_DELAYED_SELECTION = "time_for_delayed_selection";
- private static final String SELECTION_METHOD = "selection_method";
- private final MovedMouseEventFilter windowMouseTracker = new MovedMouseEventFilter();
-
- protected class TimeDelayedSelection extends TimerTask {
- final private MouseEvent e;
-
- TimeDelayedSelection(final MouseEvent e) {
- this.e = e;
- }
-
- /** TimerTask method to enable the selection after a given time. */
- @Override
- public void run() {
- /*
- * formerly in ControllerAdapter. To guarantee, that
- * point-to-select does not change selection if any meta key is
- * pressed.
- */
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- if (e.getModifiers() != 0) {
- return;
- }
- try {
- Controller controller = Controller.getCurrentController();
- if (!controller.getModeController().isBlocked() && controller.getSelection().size() <= 1) {
- final NodeView nodeV = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class,
- e.getComponent());
- if (nodeV.isDisplayable() && nodeV.getModel().isVisible()) {
- nodeV.getMap().select();
- controller.getSelection().selectAsTheOnlyOneSelected(nodeV.getModel());
- }
- }
- }
- catch (NullPointerException e) {
- }
- }
- });
- }
- }
-
- private Rectangle controlRegionForDelayedSelection;
- private Timer timerForDelayedSelection;
-
- public void createTimer(final MouseEvent e) {
- if (controlRegionForDelayedSelection != null && controlRegionForDelayedSelection.contains(e.getPoint())) {
- return;
- }
- if (!isInside(e))
- return;
- stopTimerForDelayedSelection();
- Window focusedWindow = FocusManager.getCurrentManager().getFocusedWindow();
- if (focusedWindow == null) {
- return;
- }
- if (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() instanceof JTextComponent) {
- return;
- }
- /* Region to check for in the sequel. */
- controlRegionForDelayedSelection = getControlRegion(e.getPoint());
- final String selectionMethod = ResourceController.getResourceController().getProperty(SELECTION_METHOD);
- if (selectionMethod.equals(SELECTION_METHOD_BY_CLICK)) {
- return;
- }
- if (selectionMethod.equals(SELECTION_METHOD_DIRECT)) {
- new TimeDelayedSelection(e).run();
- return;
- }
- final int timeForDelayedSelection = ResourceController.getResourceController().getIntProperty(
- TIME_FOR_DELAYED_SELECTION, 0);
- timerForDelayedSelection = SysUtils.createTimer(getClass().getSimpleName());
- timerForDelayedSelection.schedule(new TimeDelayedSelection(e), timeForDelayedSelection);
- }
-
- protected boolean isInside(final MouseEvent e) {
- return new Rectangle(0, 0, e.getComponent().getWidth(), e.getComponent().getHeight())
- .contains(e.getPoint());
- }
-
- public void stopTimerForDelayedSelection() {
- if (timerForDelayedSelection != null) {
- timerForDelayedSelection.cancel();
- }
- timerForDelayedSelection = null;
- controlRegionForDelayedSelection = null;
- }
-
- protected Rectangle getControlRegion(final Point2D p) {
- final int side = 8;
- return new Rectangle((int) (p.getX() - side / 2), (int) (p.getY() - side / 2), side, side);
- }
-
- public boolean shouldSelectOnClick(MouseEvent e) {
- if (isInside(e)) {
- final NodeView nodeView = getRelatedNodeView(e);
- return !nodeView.isSelected() || Controller.getCurrentController().getSelection().size() != 1;
- }
- return false;
- }
-
- public void extendSelection(final MouseEvent e) {
- final Controller controller = Controller.getCurrentController();
- final NodeView nodeView = getRelatedNodeView(e);
- final NodeModel newlySelectedNode = nodeView.getModel();
- final boolean extend = Compat.isMacOsX() ? e.isMetaDown() : e.isControlDown();
- final boolean range = e.isShiftDown();
- final IMapSelection selection = controller.getSelection();
- if (range && !extend) {
- selection.selectContinuous(newlySelectedNode);
- }
- else if (extend && !range) {
- selection.toggleSelected(newlySelectedNode);
- }
- if (extend == range) {
- if (selection.isSelected(newlySelectedNode) && selection.size() == 1
- && FocusManager.getCurrentManager().getFocusOwner() instanceof MainView)
- return;
- else {
- selection.selectAsTheOnlyOneSelected(newlySelectedNode);
- }
- e.consume();
- }
- }
-
- public void selectSingleNode(MouseEvent e) {
- final NodeView nodeV = getRelatedNodeView(e);
- final Controller controller = Controller.getCurrentController();
- if (!((MapView) controller.getMapViewManager().getMapViewComponent()).isSelected(nodeV)) {
- controller.getSelection().selectAsTheOnlyOneSelected(nodeV.getModel());
- }
- }
-
- public NodeView getRelatedNodeView(MouseEvent e) {
- return (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, e.getComponent());
- }
-
- public boolean isRelevant(MouseEvent e) {
- return windowMouseTracker.isRelevant(e);
- }
-
- public void trackWindowForComponent(Component c) {
- windowMouseTracker.trackWindowForComponent(c);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/ui/UserInputListenerFactory.java b/freeplane/src/org/freeplane/view/swing/ui/UserInputListenerFactory.java
deleted file mode 100644
index bdbace6..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/UserInputListenerFactory.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui;
-
-import java.awt.Component;
-import java.awt.dnd.DragGestureListener;
-import java.awt.dnd.DropTargetListener;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseWheelListener;
-import java.net.URL;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.swing.ButtonGroup;
-import javax.swing.JComponent;
-import javax.swing.JOptionPane;
-import javax.swing.JPopupMenu;
-import javax.swing.JRadioButtonMenuItem;
-import javax.swing.JToolBar;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.IMouseListener;
-import org.freeplane.core.ui.IMouseWheelEventHandler;
-import org.freeplane.core.ui.IUserInputListenerFactory;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.UIBuilder;
-import org.freeplane.core.ui.components.FreeplaneMenuBar;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.IMapSelectionListener;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.view.swing.map.MapView;
-
-public class UserInputListenerFactory implements IUserInputListenerFactory {
- public static final String NODE_POPUP = "/node_popup";
- private static final String MENU_MM2XML = "/xslt/mm2menu.xsl";
-// // final private Controller controller;
- private IMouseListener mapMouseListener;
- private MouseWheelListener mapMouseWheelListener;
- final private ActionListener mapsMenuActionListener;
- private JPopupMenu mapsPopupMenu;
- private FreeplaneMenuBar menuBar;
- private final MenuBuilder menuBuilder;
- final private HashSet<IMouseWheelEventHandler> mRegisteredMouseWheelEventHandler = new HashSet<IMouseWheelEventHandler>();
- private DragGestureListener nodeDragListener;
- private DropTargetListener nodeDropTargetListener;
- private KeyListener nodeKeyListener;
- private IMouseListener nodeMotionListener;
- private IMouseListener nodeMouseMotionListener;
- private JPopupMenu nodePopupMenu;
- private final Map<String, JComponent> toolBars;
- private final List<JComponent>[] toolbarLists;
- private final MenuXmlCreator menuXmlCreator;
-
- public UserInputListenerFactory(final ModeController modeController) {
- menuXmlCreator = new MenuXmlCreator(MENU_MM2XML);
- Controller controller = Controller.getCurrentController();
- mapsMenuActionListener = new MapsMenuActionListener(controller);
- menuBuilder = new MenuBuilder(modeController);
- controller.getMapViewManager().addMapSelectionListener(new IMapSelectionListener() {
- public void afterMapChange(final MapModel oldMap, final MapModel newMap) {
- if(modeController.equals(Controller.getCurrentModeController()))
- menuBuilder.afterMapChange(newMap);
- }
-
- public void beforeMapChange(final MapModel oldMap, final MapModel newMap) {
- }
- });
- toolBars = new LinkedHashMap<String, JComponent>();
- toolbarLists = newListArray();
- for (int j = 0; j < 4; j++) {
- toolbarLists[j] = new LinkedList<JComponent>();
- }
- }
-
- // isolate unchecked stuff in this method
- @SuppressWarnings("unchecked")
- private List<JComponent>[] newListArray() {
- return new List[4];
- }
-
- public void addToolBar(final String name, final int position, final JComponent toolBar) {
- toolBars.put(name, toolBar);
- toolbarLists[position].add(toolBar);
- }
-
- public void addMouseWheelEventHandler(final IMouseWheelEventHandler handler) {
- mRegisteredMouseWheelEventHandler.add(handler);
- }
-
- public IMouseListener getMapMouseListener() {
- if (mapMouseListener == null) {
- mapMouseListener = new DefaultMapMouseListener();
- }
- return mapMouseListener;
- }
-
- public MouseWheelListener getMapMouseWheelListener() {
- if (mapMouseWheelListener == null) {
- mapMouseWheelListener = new DefaultMouseWheelListener();
- }
- return mapMouseWheelListener;
- }
-
- public JPopupMenu getMapPopup() {
- return mapsPopupMenu;
- }
-
- public FreeplaneMenuBar getMenuBar() {
- if (menuBar == null) {
- menuBar = new FreeplaneMenuBar();
- }
- return menuBar;
- }
-
- public MenuBuilder getMenuBuilder() {
- return menuBuilder;
- }
-
- public Set<IMouseWheelEventHandler> getMouseWheelEventHandlers() {
- return Collections.unmodifiableSet(mRegisteredMouseWheelEventHandler);
- }
-
- public DragGestureListener getNodeDragListener() {
- return nodeDragListener;
- }
-
- public DropTargetListener getNodeDropTargetListener() {
- return nodeDropTargetListener;
- }
-
- public KeyListener getNodeKeyListener() {
- if (nodeKeyListener == null) {
- nodeKeyListener = new DefaultNodeKeyListener(null);
- }
- return nodeKeyListener;
- }
-
- public IMouseListener getNodeMotionListener() {
- return nodeMotionListener;
- }
-
- public IMouseListener getNodeMouseMotionListener() {
- if (nodeMouseMotionListener == null) {
- nodeMouseMotionListener = new DefaultNodeMouseMotionListener();
- }
- return nodeMouseMotionListener;
- }
-
- public JPopupMenu getNodePopupMenu() {
- return nodePopupMenu;
- }
-
- public JComponent getToolBar(final String name) {
- return toolBars.get(name);
- }
-
- public Iterable<JComponent> getToolBars(final int position) {
- return toolbarLists[position];
- }
-
- public void removeMouseWheelEventHandler(final IMouseWheelEventHandler handler) {
- mRegisteredMouseWheelEventHandler.remove(handler);
- }
-
- public void setMapMouseListener(final IMouseListener mapMouseMotionListener) {
- if (mapMouseListener != null) {
- throw new RuntimeException("already set");
- }
- mapMouseListener = mapMouseMotionListener;
- }
-
- public void setMapMouseWheelListener(final MouseWheelListener mouseWheelListener) {
- if (mapMouseWheelListener != null) {
- throw new RuntimeException("already set");
- }
- mapMouseWheelListener = mouseWheelListener;
- }
-
- public void setMenuBar(final FreeplaneMenuBar menuBar) {
- if (mapMouseWheelListener != null) {
- throw new RuntimeException("already set");
- }
- this.menuBar = menuBar;
- }
-
-
- public void setNodeDragListener(DragGestureListener nodeDragListener) {
- if (this.nodeDragListener != null) {
- throw new RuntimeException("already set");
- }
- this.nodeDragListener = nodeDragListener;
- }
-
- public void setNodeDropTargetListener(final DropTargetListener nodeDropTargetListener) {
- if (this.nodeDropTargetListener != null) {
- throw new RuntimeException("already set");
- }
- this.nodeDropTargetListener = nodeDropTargetListener;
- }
-
- public void setNodeKeyListener(final KeyListener nodeKeyListener) {
- if (this.nodeKeyListener != null) {
- throw new RuntimeException("already set");
- }
- this.nodeKeyListener = nodeKeyListener;
- }
-
- public void setNodeMotionListener(final IMouseListener nodeMotionListener) {
- if (this.nodeMotionListener != null) {
- throw new RuntimeException("already set");
- }
- this.nodeMotionListener = nodeMotionListener;
- }
-
- public void setNodeMouseMotionListener(final IMouseListener nodeMouseMotionListener) {
- if (this.nodeMouseMotionListener != null) {
- throw new RuntimeException("already set");
- }
- this.nodeMouseMotionListener = nodeMouseMotionListener;
- }
-
- public void setNodePopupMenu(final JPopupMenu nodePopupMenu) {
- if (this.nodePopupMenu != null) {
- throw new RuntimeException("already set");
- }
- this.nodePopupMenu = nodePopupMenu;
- }
-
- public void updateMapList() {
- updateModeMenu();
- updateMapList("main_menu_mindmaps");
- updateMapList("popup_menu_mindmaps");
- }
-
- private void updateMapList(final String mapsMenuPosition) {
- if(! menuBuilder.contains(mapsMenuPosition))
- return;
- menuBuilder.removeChildElements(mapsMenuPosition);
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- final List<? extends Component> mapViewVector = mapViewManager.getMapViewVector();
- if (mapViewVector == null) {
- return;
- }
- final ButtonGroup group = new ButtonGroup();
- int i = 0;
- for (final Component mapView : mapViewVector) {
- final String displayName = mapView.getName();
- final JRadioButtonMenuItem newItem = new JRadioButtonMenuItem(displayName);
- newItem.setSelected(false);
- group.add(newItem);
- newItem.addActionListener(mapsMenuActionListener);
- if (displayName.length() > 0) {
- newItem.setMnemonic(displayName.charAt(0));
- }
- final MapView currentMapView = (MapView) mapViewManager.getMapViewComponent();
- if (currentMapView != null) {
- if (mapView == currentMapView) {
- newItem.setSelected(true);
- }
- }
- menuBuilder.addMenuItem(mapsMenuPosition, newItem, mapsMenuPosition + '-' + i++, UIBuilder.AS_CHILD);
- }
- }
-
- public void updateMenus(String menuStructureResource, Set<String> plugins) {
- final FreeplaneMenuBar menuBar = getMenuBar();
- menuBuilder.addMenuBar(menuBar, FreeplaneMenuBar.MENU_BAR_PREFIX);
- mapsPopupMenu = new JPopupMenu();
- menuBuilder.addPopupMenu(mapsPopupMenu, FreeplaneMenuBar.MAP_POPUP_MENU);
- menuBuilder.addPopupMenu(getNodePopupMenu(), UserInputListenerFactory.NODE_POPUP);
- menuBuilder.addToolbar((JToolBar) getToolBar("/main_toolbar"), "/main_toolbar");
- mapsPopupMenu.setName(TextUtils.getText("mindmaps"));
- final URL menuStructure = menuXmlCreator.menuResource(menuStructureResource);
- if (menuStructure != null) {
- final boolean isUserDefined = menuStructure.getProtocol().equalsIgnoreCase("file");
- try{
- menuBuilder.processMenuCategory(menuStructure, plugins);
- }
- catch (RuntimeException e){
- if(isUserDefined){
- LogUtils.warn(e);
- String myMessage = TextUtils.format("menu_error", menuStructure.getPath(), e.getMessage());
- UITools.backOtherWindows();
- JOptionPane.showMessageDialog(UITools.getFrame(), myMessage, "Freeplane", JOptionPane.ERROR_MESSAGE);
- System.exit(-1);
- }
- throw e;
- }
- }
- final IMapViewManager viewController = Controller.getCurrentController().getMapViewManager();
- viewController.updateMenus(menuBuilder);
- }
-
- private void updateModeMenu() {
- menuBuilder.removeChildElements(FreeplaneMenuBar.MODES_MENU);
- Controller controller = Controller.getCurrentController();
- for (final String key : new LinkedList<String>(controller.getModes())) {
- final AFreeplaneAction modesMenuActionListener = new ModesMenuActionListener(key, controller);
- final ModeController modeController = controller.getModeController();
- final boolean isSelected;
- if (modeController != null) {
- isSelected = modeController.getModeName().equals(key);
- }
- else {
- isSelected = false;
- }
- menuBuilder.addRadioItem(FreeplaneMenuBar.MODES_MENU, modesMenuActionListener, isSelected);
- ResourceController.getResourceController().getProperty(("keystroke_mode_" + key));
- }
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/GlassPaneManager.java b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/GlassPaneManager.java
deleted file mode 100644
index 859e43e..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/GlassPaneManager.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui.mindmapmode;
-
-import java.awt.Component;
-
-import javax.swing.JRootPane;
-import javax.swing.SwingUtilities;
-import javax.swing.event.AncestorEvent;
-import javax.swing.event.AncestorListener;
-
-import org.freeplane.core.ui.DelayedMouseListener;
-import org.freeplane.core.ui.IMouseListener;
-
-
-/**
- * @author Dimitry Polivaev
- * Mar 3, 2011
- */
-public class GlassPaneManager implements AncestorListener {
- private final IMouseListener mouseListener;
- private final JRootPane rootPane;
- public GlassPaneManager(JRootPane jframe, INodeSelector nodeSelector) {
- this.mouseListener = new DelayedMouseListener(new GlassPaneNodeSelector(nodeSelector), 2, 1);
- this.rootPane = jframe;
- }
-
- public void ancestorRemoved(AncestorEvent event) {
- rootPane.getJMenuBar().setEnabled(true);
- final Component glassPane = rootPane.getRootPane().getGlassPane();
- glassPane.removeMouseListener(mouseListener);
- glassPane.removeMouseMotionListener(mouseListener);
- glassPane.setVisible(false);
- SwingUtilities.getWindowAncestor(rootPane).setFocusableWindowState(true);
- }
-
- public void ancestorMoved(AncestorEvent event) {
- }
-
- public void ancestorAdded(AncestorEvent event) {
- rootPane.getJMenuBar().setEnabled(false);
- final Component glassPane = rootPane.getRootPane().getGlassPane();
- glassPane.addMouseListener(mouseListener);
- glassPane.addMouseMotionListener(mouseListener);
- glassPane.setVisible(true);
- SwingUtilities.getWindowAncestor(rootPane).setFocusableWindowState(false);
- }
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/GlassPaneNodeSelector.java b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/GlassPaneNodeSelector.java
deleted file mode 100644
index c7d0b27..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/GlassPaneNodeSelector.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui.mindmapmode;
-
-import java.awt.Component;
-import java.awt.Container;
-import java.awt.Point;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
-import javax.swing.JScrollBar;
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.ui.IMouseListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.MapView;
-
-/**
- * @author Dimitry Polivaev
- * Mar 3, 2011
- */
-class GlassPaneNodeSelector extends MouseAdapter implements IMouseListener{
-
- /**
- *
- */
- private final INodeSelector nodeSelector;
- private Component activeComponent;
- /**
- * @param nodeSelector
- */
- GlassPaneNodeSelector(INodeSelector nodeSelector) {
- this.nodeSelector = nodeSelector;
- }
-
- public void mouseMoved(MouseEvent e) {
- }
-
- public void mouseDragged(MouseEvent e) {
- final Component component = findMapComponent(e);
- if(canRedispatchEventFor(component)){
- redispatchMouseEvent(e, component);
- }
- }
-
- public void mouseClicked(MouseEvent e) {
- if(e.getButton() != 1){
- return;
- }
- final Component component = findMapComponent(e);
- if(! (component instanceof MainView)){
- return;
- }
- MainView mainView = (MainView) component;
- final NodeModel model = mainView.getNodeView().getModel();
- switch(e.getClickCount()){
- case 1:
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- mapController.setFolded(model, ! model.isFolded());
- break;
- case 2:
- nodeSelector.nodeSelected(model);
- break;
- }
- }
-
- public boolean canRedispatchEventFor(final Component component) {
- if (component instanceof MapView)
- return true;
- if (component instanceof JScrollBar || SwingUtilities.getAncestorOfClass(JScrollBar.class, component) != null)
- return true;
- return false;
- }
-
- public void mouseEntered(MouseEvent e) {
- }
-
- public void mouseExited(MouseEvent e) {
- }
-
- public void mousePressed(MouseEvent e) {
- if(e.getButton() != 1){
- return;
- }
- final Component component = findMapComponent(e);
- if(canRedispatchEventFor(component)){
- redispatchMouseEvent(e, component);
- activeComponent = component;
- }
- }
-
- public void mouseReleased(MouseEvent e) {
- if(e.getButton() != 1){
- return;
- }
- if(activeComponent != null){
- redispatchMouseEvent(e, activeComponent);
- activeComponent = null;
- }
- }
-
- //A basic implementation of redispatching events.
- private Component findMapComponent(MouseEvent e) {
- final Component glassPane = e.getComponent();
- final Point glassPanePoint = e.getPoint();
- final Container container = SwingUtilities.getRootPane(glassPane).getContentPane();
- Point containerPoint = SwingUtilities.convertPoint(
- glassPane,
- glassPanePoint,
- container);
- Component component =
- SwingUtilities.getDeepestComponentAt(
- container,
- containerPoint.x,
- containerPoint.y);
- if(component instanceof MainView || component instanceof MapView || component instanceof JScrollBar){
- return component;
- }
- return SwingUtilities.getAncestorOfClass(MapView.class, component);
- }
- public void redispatchMouseEvent(MouseEvent e, final Component component) {
- final Component glassPane = e.getComponent();
- final Point glassPanePoint = e.getPoint();
- Point componentPoint = SwingUtilities.convertPoint(
- glassPane,
- glassPanePoint,
- component);
- component.dispatchEvent(new MouseEvent(component,
- e.getID(),
- e.getWhen(),
- e.getModifiers(),
- componentPoint.x,
- componentPoint.y,
- e.getClickCount(),
- e.isPopupTrigger()));
- }
-
-}
\ No newline at end of file
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDropListener.java b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDropListener.java
deleted file mode 100644
index c6d0501..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeDropListener.java
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui.mindmapmode;
-
-import java.awt.Component;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.DnDConstants;
-import java.awt.dnd.DropTargetDragEvent;
-import java.awt.dnd.DropTargetDropEvent;
-import java.awt.dnd.DropTargetEvent;
-import java.awt.dnd.DropTargetListener;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.swing.JOptionPane;
-import javax.swing.Timer;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.clipboard.MindMapNodesSelection;
-import org.freeplane.features.clipboard.mindmapmode.MClipboardController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.MouseArea;
-import org.freeplane.view.swing.map.NodeView;
-
-public class MNodeDropListener implements DropTargetListener {
-private static final int UNFOLD_DELAY_MILLISECONDS = 500;
-private Timer timer;
-
-// final private ModeController modeController;
-
- public MNodeDropListener() {
- }
-
- /**
- * The method is called when the cursor carrying the dragged item enteres
- * the area of the node. The name "dragEnter" seems to be confusing to me. I
- * think the difference between dragAcceptable and dropAcceptable is that in
- * dragAcceptable, you tell if the type of the thing being dragged is OK,
- * where in dropAcceptable, you tell if your really willing to accept the
- * item.
- */
- public void dragEnter(final DropTargetDragEvent dtde) {
- supportFolding(dtde);
- if (isDragAcceptable(dtde)) {
- dtde.acceptDrag(DnDConstants.ACTION_MOVE);
- }
- else {
- dtde.rejectDrag();
- }
- }
-
- private void supportFolding(final DropTargetDragEvent dtde) {
- final MainView node = getNode(dtde);
- if(isInFoldingRegion(dtde)){
- node.setMouseArea(MouseArea.FOLDING);
- startUnfoldTimer(node);
- }
- else{
- node.setMouseArea(MouseArea.DEFAULT);
- stopUnfoldTimer();
- }
- }
-
- private boolean isInFoldingRegion(DropTargetDragEvent dtde) {
- final MainView node = getNode(dtde);
- return node.isInFoldingRegion(dtde.getLocation());
- }
-
- public void dragExit(final DropTargetEvent e) {
- getNode(e).setMouseArea(MouseArea.OUT);
- stopUnfoldTimer();
- final MainView mainView = getNode(e);
- mainView.setDraggedOver(NodeView.DRAGGED_OVER_NO);
- mainView.repaint();
- }
-
- private MainView getNode(final DropTargetEvent e) {
- final Component draggedNode = e.getDropTargetContext().getComponent();
- final MainView mainView = (MainView) draggedNode;
- return mainView;
- }
-
- public void dragOver(final DropTargetDragEvent dtde) {
- supportFolding(dtde);
-
- final MainView draggedNode = (MainView) dtde.getDropTargetContext().getComponent();
- final int oldDraggedOver = draggedNode.getDraggedOver();
- draggedNode.setDraggedOver(dtde.getLocation());
- final int newDraggedOver = draggedNode.getDraggedOver();
- final boolean repaint = newDraggedOver != oldDraggedOver;
- if (repaint) {
- draggedNode.repaint();
- }
- }
-
- private void startUnfoldTimer(final MainView mainView) {
- if(timer == null){
- timer = new Timer(UNFOLD_DELAY_MILLISECONDS, new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- if(mainView.isDisplayable()){
- final NodeModel node = mainView.getNodeView().getModel();
- Controller.getCurrentModeController().getMapController().setFolded(node, !node.isFolded());
- }
- }
- });
- timer.setRepeats(false);
- timer.start();
- }
- }
-
- private void stopUnfoldTimer() {
- if(timer != null){
- timer.stop();
- timer = null;
- }
-
- }
-
- public void dragScroll(final DropTargetDragEvent e) {
- }
-
- public void drop(final DropTargetDropEvent dtde) {
- try {
- int dropAction = dtde.getDropAction();
- final Transferable t = dtde.getTransferable();
- final MainView mainView = (MainView) dtde.getDropTargetContext().getComponent();
- final NodeView targetNodeView = mainView.getNodeView();
- final MapView mapView = targetNodeView.getMap();
- mapView.select();
- final NodeModel targetNode = targetNodeView.getModel();
- final Controller controller = Controller.getCurrentController();
- if (dtde.isLocalTransfer() && t.isDataFlavorSupported(MindMapNodesSelection.dropActionFlavor)) {
- final String sourceAction = (String) t.getTransferData(MindMapNodesSelection.dropActionFlavor);
- if (sourceAction.equals("LINK")) {
- dropAction = DnDConstants.ACTION_LINK;
- }
- if (sourceAction.equals("COPY")) {
- dropAction = DnDConstants.ACTION_COPY;
- }
- }
- mainView.setDraggedOver(NodeView.DRAGGED_OVER_NO);
- mainView.repaint();
- if (dtde.isLocalTransfer() && (dropAction == DnDConstants.ACTION_MOVE) && !isDropAcceptable(dtde)) {
- dtde.rejectDrop();
- return;
- }
- final boolean dropAsSibling = mainView.dropAsSibling(dtde.getLocation().getX());
- ModeController modeController = controller.getModeController();
- final MMapController mapController = (MMapController) modeController.getMapController();
- if ((dropAction == DnDConstants.ACTION_MOVE || dropAction == DnDConstants.ACTION_COPY)) {
- final NodeModel parent = dropAsSibling ? targetNode.getParentNode() : targetNode;
- if (!mapController.isWriteable(parent)) {
- dtde.rejectDrop();
- final String message = TextUtils.getText("node_is_write_protected");
- UITools.errorMessage(message);
- return;
- }
- }
- final boolean isLeft = mainView.dropLeft(dtde.getLocation().getX());
- if (!dtde.isLocalTransfer()) {
- dtde.acceptDrop(DnDConstants.ACTION_COPY);
- ((MClipboardController) ClipboardController.getController()).paste(t, targetNode, dropAsSibling, isLeft, dropAction);
- dtde.dropComplete(true);
- return;
- }
- dtde.acceptDrop(dropAction);
- if (dropAction == DnDConstants.ACTION_LINK) {
- int yesorno = JOptionPane.YES_OPTION;
- if (controller.getSelection().size() >= 5) {
- yesorno = JOptionPane.showConfirmDialog(controller.getViewController().getContentPane(), TextUtils
- .getText("lots_of_links_warning"), Integer.toString(controller.getSelection().size())
- + " links to the same node", JOptionPane.YES_NO_OPTION);
- }
- if (yesorno == JOptionPane.YES_OPTION) {
- for (final Iterator<NodeModel> it = controller.getSelection().getSelection().iterator(); it
- .hasNext();) {
- final NodeModel selectedNodeModel = (it.next());
- ((MLinkController) LinkController.getController(modeController)).addConnector(
- selectedNodeModel, targetNode);
- }
- }
- }
- else {
- Transferable trans = null;
- final Collection<NodeModel> selecteds = mapController.getSelectedNodes();
- if (DnDConstants.ACTION_MOVE == dropAction) {
- NodeModel actualNode = targetNode;
- do {
- if (selecteds.contains(actualNode)) {
- final String message = TextUtils.getText("cannot_move_to_child");
- JOptionPane.showMessageDialog(controller.getViewController().getContentPane(), message,
- "Freeplane", JOptionPane.WARNING_MESSAGE);
- dtde.dropComplete(true);
- return;
- }
- actualNode = (actualNode.isRoot()) ? null : actualNode.getParentNode();
- } while (actualNode != null);
- final NodeModel[] array = selecteds.toArray(new NodeModel[selecteds.size()]);
- final List<NodeModel> sortedSelection = controller.getSelection().getSortedSelection(true);
- for (final NodeModel node : sortedSelection) {
- boolean changeSide = isLeft != node.isLeft();
- if (dropAsSibling) {
- mapController.moveNodeBefore(node, targetNode, isLeft, changeSide);
- }
- else {
- mapController.moveNodeAsChild(node, targetNode, isLeft, changeSide);
- }
- }
- if(dropAsSibling || ! targetNode.isFolded())
- controller.getSelection().replaceSelection(array);
- else
- controller.getSelection().selectAsTheOnlyOneSelected(targetNode);
- }
- else {
- trans = ClipboardController.getController().copy(controller.getSelection());
- ((MClipboardController) ClipboardController.getController()).paste(trans, targetNode, dropAsSibling, isLeft);
- controller.getSelection().selectAsTheOnlyOneSelected(targetNode);
- }
- }
- }
- catch (final Exception e) {
- LogUtils.severe("Drop exception:", e);
- dtde.dropComplete(false);
- return;
- }
- dtde.dropComplete(true);
- }
-
- public void dropActionChanged(final DropTargetDragEvent e) {
- }
-
- private boolean isDragAcceptable(final DropTargetDragEvent ev) {
- if (ev.isDataFlavorSupported(DataFlavor.stringFlavor)) {
- return true;
- }
- if (ev.isDataFlavorSupported(MindMapNodesSelection.fileListFlavor)) {
- return true;
- }
- return false;
- }
-
- private boolean isDropAcceptable(final DropTargetDropEvent event) {
- final NodeModel node = ((MainView) event.getDropTargetContext().getComponent()).getNodeView().getModel();
- final ModeController modeController = Controller.getCurrentController().getModeController();
- final NodeModel selected = modeController.getMapController().getSelectedNode();
- return ((node != selected) && !node.isDescendantOf(selected));
- }
-}
diff --git a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeMotionListener.java b/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeMotionListener.java
deleted file mode 100644
index 66e2160..0000000
--- a/freeplane/src/org/freeplane/view/swing/ui/mindmapmode/MNodeMotionListener.java
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.view.swing.ui.mindmapmode;
-
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.EventQueue;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.event.InputEvent;
-import java.awt.event.MouseEvent;
-import java.util.Collection;
-
-import javax.swing.JScrollPane;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.DoubleClickTimer;
-import org.freeplane.core.ui.IEditHandler.FirstAction;
-import org.freeplane.core.ui.IMouseListener;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.SummaryNode;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.nodelocation.LocationController;
-import org.freeplane.features.nodelocation.LocationModel;
-import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.MapView;
-import org.freeplane.view.swing.map.MouseArea;
-import org.freeplane.view.swing.map.NodeView;
-import org.freeplane.view.swing.ui.DefaultNodeMouseMotionListener;
-
-/**
- * The MouseMotionListener which belongs to every NodeView
- */
-public class MNodeMotionListener extends DefaultNodeMouseMotionListener implements IMouseListener {
- private Point dragStartingPoint = null;
- private int originalHGap;
- private int originalParentVGap;
- private int originalShiftY;
- private static final String EDIT_ON_DOUBLE_CLICK = "edit_on_double_click";
-
- public MNodeMotionListener() {
- }
-
- Point getDragStartingPoint() {
- return dragStartingPoint;
- }
-
- /**
- */
- private int getHGapChange(final Point dragNextPoint, final NodeModel node) {
- final Controller controller = Controller.getCurrentController();
- final MapView mapView = ((MapView) controller.getMapViewManager().getMapViewComponent());
- int hGapChange = (int) ((dragNextPoint.x - dragStartingPoint.x) / mapView.getZoom());
- if (node.isLeft()) {
- hGapChange = -hGapChange;
- }
- return hGapChange;
- }
-
- /**
- */
- private int getNodeShiftYChange(final Point dragNextPoint, final NodeModel node) {
- final Controller controller = Controller.getCurrentController();
- final MapView mapView = ((MapView) controller.getMapViewManager().getMapViewComponent());
- final int shiftYChange = (int) ((dragNextPoint.y - dragStartingPoint.y) / mapView.getZoom());
- return shiftYChange;
- }
-
- /**
- */
- private NodeView getNodeView(final MouseEvent e) {
- return ((MainView) e.getSource()).getNodeView();
- }
-
- /**
- */
- private int getVGapChange(final Point dragNextPoint, final NodeModel node) {
- final Controller controller = Controller.getCurrentController();
- final MapView mapView = ((MapView) controller.getMapViewManager().getMapViewComponent());
- final int vGapChange = (int) ((dragNextPoint.y - dragStartingPoint.y) / mapView.getZoom());
- return vGapChange;
- }
-
- public boolean isDragActive() {
- return dragStartingPoint != null;
- }
-
- @Override
- public void mouseClicked(final MouseEvent e) {
- if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2
- && doubleClickTimer.getDelay() > 0) {
- final MainView mainView = (MainView) e.getComponent();
- if (mainView.getMouseArea().equals(MouseArea.MOTION)) {
- final Controller controller = Controller.getCurrentController();
- MLocationController locationController = (MLocationController) LocationController
- .getController(controller.getModeController());
- if (e.getModifiersEx() == 0) {
- final NodeView nodeV = getNodeView(e);
- final NodeModel node = nodeV.getModel();
- locationController.moveNodePosition(node, LocationModel.getModel(node).getVGap(),
- LocationModel.HGAP, 0);
- return;
- }
- if (Compat.isCtrlEvent(e)) {
- final NodeView nodeV = getNodeView(e);
- final NodeModel node = nodeV.getModel();
- locationController.moveNodePosition(node, LocationModel.VGAP, LocationModel.getModel(node)
- .getHGap(), LocationModel.getModel(node).getShiftY());
- return;
- }
- }
- else {
- if (Compat.isPlainEvent(e) && !isInFoldingRegion(e)) {
- final MTextController textController = MTextController.getController();
- textController.getEventQueue().activate(e);
- textController.edit(FirstAction.EDIT_CURRENT, false);
- }
- }
- }
- super.mouseClicked(e);
- }
-
- @Override
- public void mouseMoved(final MouseEvent e) {
- if (isDragActive())
- return;
- final MainView v = (MainView) e.getSource();
- if (v.isInDragRegion(e.getPoint())) {
- v.setMouseArea(MouseArea.MOTION);
- v.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
- return;
- }
- super.mouseMoved(e);
- }
-
- @Override
- public void mouseExited(MouseEvent e) {
- if (!isDragActive())
- super.mouseExited(e);
- }
-
- @Override
- public void mousePressed(MouseEvent e) {
- final MapView mapView = MapView.getMapView(e.getComponent());
- mapView.select();
- doubleClickTimer.cancel();
- setClickDelay();
- if (isInDragRegion(e)) {
- if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == (InputEvent.BUTTON1_DOWN_MASK)) {
- nodeSelector.stopTimerForDelayedSelection();
- final NodeView nodeV = getNodeView(e);
- final Point point = e.getPoint();
- findGridPoint(point);
- UITools.convertPointToAncestor(nodeV, point, JScrollPane.class);
- setDragStartingPoint(point, nodeV.getModel());
- }
- }
- else
- super.mousePressed(e);
- }
-
- @Override
- public void mouseDragged(final MouseEvent e) {
- if (!isDragActive())
- return;
- if ((e.getModifiersEx() & InputEvent.BUTTON1_DOWN_MASK) == (InputEvent.BUTTON1_DOWN_MASK)) {
- final MainView mainView = (MainView) e.getSource();
- final NodeView nodeV = getNodeView(e);
- final MapView mapView = nodeV.getMap();
- final Point point = e.getPoint();
- findGridPoint(point);
- UITools.convertPointToAncestor(nodeV, point, JScrollPane.class);
- ModeController c = Controller.getCurrentController().getModeController();
- final Point dragNextPoint = point;
- if (!Compat.isCtrlEvent(e)) {
- final NodeModel node = nodeV.getModel();
- final LocationModel locationModel = LocationModel.createLocationModel(node);
- final int hGapChange = getHGapChange(dragNextPoint, node);
- if(hGapChange != 0){
- locationModel.setHGap(originalHGap + hGapChange);
- }
- final int shiftYChange = getNodeShiftYChange(dragNextPoint, node);
- if(shiftYChange != 0){
- locationModel.setShiftY(originalShiftY + shiftYChange);
- }
- if(hGapChange != 0 || shiftYChange != 0)
- c.getMapController().nodeRefresh(node);
- else
- return;
- }
- else {
- final NodeModel parentNode = nodeV.getVisibleParentView().getModel();
- final int vGapChange = getVGapChange(dragNextPoint, parentNode);
- if(vGapChange != 0){
- LocationModel.createLocationModel(parentNode).setVGap(Math.max(0, originalParentVGap - vGapChange));
- final MapController mapController = c.getMapController();
- mapController.nodeRefresh(parentNode);
- mapController.nodeRefresh(nodeV.getModel());
- }
- else
- return;
- }
- EventQueue.invokeLater(new Runnable() {
- public void run() {
- final Rectangle r = mainView.getBounds();
- UITools.convertRectangleToAncestor(mainView.getParent(), r, mapView);
- final boolean isEventPointVisible = mapView.getVisibleRect().contains(r);
- if (!isEventPointVisible) {
- mapView.scrollRectToVisible(r);
- }
- }
- });
- }
- }
-
- private void findGridPoint(Point point) {
- final int gridSize = ResourceController.getResourceController().getIntProperty("grid_size");
- if (gridSize <= 2) {
- return;
- }
- point.x -= point.x % gridSize;
- point.y -= point.y % gridSize;
- }
-
- @Override
- public void mouseReleased(final MouseEvent e) {
- final MainView v = (MainView) e.getSource();
- if (!v.contains(e.getX(), e.getY())) {
- v.setMouseArea(MouseArea.OUT);
- }
- if (!isDragActive()) {
- super.mouseReleased(e);
- return;
- }
- final NodeView nodeV = getNodeView(e);
- final NodeModel node = nodeV.getModel();
- final ModeController modeController = nodeV.getMap().getModeController();
- final NodeModel parentNode = nodeV.getModel().getParentNode();
- final int parentVGap = LocationModel.getModel(parentNode).getVGap();
- int hgap = LocationModel.getModel(node).getHGap();
- final int shiftY = LocationModel.getModel(node).getShiftY();
- adjustNodeIndices(nodeV);
- resetPositions(node);
- final Controller controller = modeController.getController();
- MLocationController locationController = (MLocationController) LocationController.getController(controller
- .getModeController());
- locationController.moveNodePosition(node, parentVGap, hgap, shiftY);
- stopDrag();
- }
-
- private void adjustNodeIndices(final NodeView nodeV) {
- NodeModel[] selectedsBackup = null;
- final NodeModel node = nodeV.getModel();
- if (FreeNode.isFreeNode(node)) {
- selectedsBackup = adjustNodeIndexBackupSelection(nodeV, selectedsBackup);
- }
- else {
- final MapView map = nodeV.getMap();
- final NodeModel[] siblingNodes = node.getParentNode().getChildren().toArray(new NodeModel[] {});
- for (NodeModel sibling : siblingNodes) {
- if (FreeNode.isFreeNode(sibling)) {
- final NodeView siblingV = map.getNodeView(sibling);
- selectedsBackup = adjustNodeIndexBackupSelection(siblingV, selectedsBackup);
- }
- }
- }
- if (selectedsBackup != null) {
- final ModeController modeController = nodeV.getMap().getModeController();
- final Controller controller = modeController.getController();
- controller.getSelection().replaceSelection(selectedsBackup);
- }
- }
-
- private NodeModel[] adjustNodeIndexBackupSelection(final NodeView nodeV, NodeModel[] selectedsBackup) {
- final NodeModel node = nodeV.getModel();
- boolean isLeft = nodeV.isLeft();
- final int newIndex = calculateNewNodeIndex(nodeV, isLeft, 0, node.getParentNode().getChildCount());
- if (newIndex != -1) {
- final ModeController modeController = nodeV.getMap().getModeController();
- MMapController mapController = (MMapController) modeController.getMapController();
- if (selectedsBackup == null) {
- final Collection<NodeModel> selecteds = mapController.getSelectedNodes();
- selectedsBackup = selecteds.toArray(new NodeModel[selecteds.size()]);
- }
- mapController.moveNode(node, node.getParentNode(), newIndex, isLeft, false);
- }
- return selectedsBackup;
- }
-
- public int getRefX(final NodeView node) {
- return node.getContent().getX() + node.getContent().getWidth() / 2;
- }
-
- private int calculateNewNodeIndex(final NodeView nodeV, final boolean left, final int start, final int end) {
- final NodeModel node = nodeV.getModel();
- if (SummaryNode.isSummaryNode(node))
- return -1;
- final int nodeY = getRefY(nodeV);
- final NodeView parent = nodeV.getParentView();
- int newIndex = 0;
- int oldIndex = -1;
- int wrondSideCount = 0;
- for (int i = start; i < end; i++) {
- final Component component = parent.getComponent(i);
- if (!(component instanceof NodeView))
- continue;
- NodeView sibling = (NodeView) component;
- if (sibling.isLeft() == left && !SummaryNode.isSummaryNode(sibling.getModel()) && getRefY(sibling) > nodeY)
- break;
- else {
- if (sibling != nodeV) {
- newIndex++;
- if (sibling.isLeft() != left)
- wrondSideCount++;
- else
- wrondSideCount = 0;
- }
- else {
- oldIndex = i;
- }
- }
- }
- final int result = newIndex - wrondSideCount;
- if (result == oldIndex)
- return -1;
- return result;
- }
-
- private int getRefY(NodeView sibling) {
- return sibling.getY() + sibling.getContent().getY();
- }
-
- /**
- */
- private void resetPositions(final NodeModel node) {
- final LocationModel locationModel = LocationModel.getModel(node.getParentNode());
- locationModel.setVGap(originalParentVGap);
- LocationModel.getModel(node).setHGap(originalHGap);
- LocationModel.getModel(node).setShiftY(originalShiftY);
- }
-
- void setDragStartingPoint(final Point point, final NodeModel node) {
- dragStartingPoint = point;
- if (point != null) {
- originalParentVGap = LocationModel.getModel(node.getParentNode()).getVGap();
- originalHGap = LocationModel.getModel(node).getHGap();
- originalShiftY = LocationModel.getModel(node).getShiftY();
- }
- else {
- originalParentVGap = originalHGap = originalShiftY = 0;
- }
- }
-
- private void stopDrag() {
- setDragStartingPoint(null, null);
- }
-
- private void setClickDelay() {
- if (ResourceController.getResourceController().getBooleanProperty(EDIT_ON_DOUBLE_CLICK))
- doubleClickTimer.setDelay(DoubleClickTimer.MAX_TIME_BETWEEN_CLICKS);
- else {
- doubleClickTimer.setDelay(0);
- }
- }
-}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/components/html/CssRuleBuilderShould.java b/freeplane/src/test/java/org/freeplane/core/ui/components/html/CssRuleBuilderShould.java
new file mode 100644
index 0000000..c28cbd6
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/components/html/CssRuleBuilderShould.java
@@ -0,0 +1,128 @@
+package org.freeplane.core.ui.components.html;
+
+import static org.junit.Assert.assertEquals;
+
+import java.awt.Color;
+import java.awt.Font;
+
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.util.Convertible;
+import org.freeplane.core.util.Quantity;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CssRuleBuilderShould {
+ private CssRuleBuilder cssRuleBuilder;
+ @Before
+ public void setup() {
+ cssRuleBuilder = new CssRuleBuilder();
+ }
+ private void assertRule(String ruleContent) {
+ String rule = cssRuleBuilder.buildRule();
+ assertEquals(ruleContent, rule);
+ }
+
+ @Test
+ public void returnEmptyRule() throws Exception {
+ assertRule("");
+ }
+
+ @Test
+ public void ignoreNullFont() throws Exception {
+ cssRuleBuilder.withFont(null);
+ assertRule("");
+ }
+
+ @Test
+ public void addFont() throws Exception {
+ final Font font = new Font("arial", Font.BOLD | Font.ITALIC, 10);
+ cssRuleBuilder.withFont(font);
+ assertRule(" font-family: " + font.getFamily() + "; font-size: 10pt; font-weight: bold; font-style: italic;");
+ }
+
+
+ @Test
+ public void addFontScaleSize() throws Exception {
+ final float fontScaleFactor = 2f;
+ final Font font = new Font("arial", Font.BOLD | Font.ITALIC, 10);
+ cssRuleBuilder.withFont(font, fontScaleFactor);
+ assertRule(" font-family: " + font.getFamily() + "; font-size: 5pt; font-weight: bold; font-style: italic;");
+ }
+
+
+ @Test
+ public void ignoreNullColor() throws Exception {
+ cssRuleBuilder.withColor(null);
+ assertRule("");
+ }
+
+ @Test
+ public void addColor() throws Exception {
+ cssRuleBuilder.withColor(Color.WHITE);
+ assertRule("color: #ffffff;");
+ }
+
+ @Test
+ public void ignoreNullBackgroundColor() throws Exception {
+ cssRuleBuilder.withBackground(null);
+ assertRule("");
+ }
+
+ @Test
+ public void addBackgroundColor() throws Exception {
+ cssRuleBuilder.withBackground(Color.WHITE);
+ assertRule("background-color: #ffffff;");
+ }
+
+
+ @Test
+ public void addCenterAlignment() throws Exception {
+ cssRuleBuilder.withAlignment(SwingConstants.CENTER);
+ assertRule("text-align: center;");
+ }
+
+ @Test
+ public void addLeftAlignment() throws Exception {
+ cssRuleBuilder.withAlignment(SwingConstants.LEFT);
+ assertRule("text-align: left;");
+ }
+
+ @Test
+ public void addRightAlignment() throws Exception {
+ cssRuleBuilder.withAlignment(SwingConstants.RIGHT);
+ assertRule("text-align: right;");
+ }
+
+ enum Metrics implements Convertible{
+ m(1d), cm(0.01d);
+
+ Metrics(double factor){
+ this.factor = factor;
+ }
+
+ final private double factor;
+ @Override
+ public double factor() {
+ return factor;
+ }
+ }
+
+ @Test
+ public void addWidth() throws Exception {
+ cssRuleBuilder.withMaxWidthAsPt(new Quantity<Metrics>(1000, Metrics.cm));
+ assertRule("width: 10pt;");
+ }
+
+ @Test
+ public void addMaxWidth() throws Exception {
+ cssRuleBuilder.withMaxWidthAsPt(new Quantity<Metrics>(2, Metrics.m), new Quantity<Metrics>(1, Metrics.m));
+ assertRule("width: 2pt;");
+ }
+
+ @Test
+ public void ignoreNullWidth() throws Exception {
+ cssRuleBuilder.withMaxWidthAsPt((Quantity<Metrics>) null);
+ assertRule("");
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/HeadlessFreeplaneRunner.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/HeadlessFreeplaneRunner.java
new file mode 100644
index 0000000..a16ea1e
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/HeadlessFreeplaneRunner.java
@@ -0,0 +1,9 @@
+package org.freeplane.core.ui.menubuilders;
+
+import org.freeplane.main.headlessmode.FreeplaneHeadlessStarter;
+
+public class HeadlessFreeplaneRunner {
+ static {
+ new FreeplaneHeadlessStarter().run(new String[]{});
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/MenuBuilderAcceptanceTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/MenuBuilderAcceptanceTest.java
new file mode 100644
index 0000000..e099ee0
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/MenuBuilderAcceptanceTest.java
@@ -0,0 +1,57 @@
+package org.freeplane.core.ui.menubuilders;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Collections;
+
+import javax.swing.JPopupMenu;
+import javax.swing.JToolBar;
+
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.menubuilders.action.EntriesForAction;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.ui.menubuilders.generic.BuildPhaseListener;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor;
+import org.freeplane.core.ui.menubuilders.menu.MenuBuildProcessFactory;
+import org.freeplane.core.ui.menubuilders.menu.TestMenuBarFactory;
+import org.freeplane.features.mode.Controller;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class MenuBuilderAcceptanceTest {
+ private static Entry menuStructure;
+
+ static{
+ new HeadlessFreeplaneRunner();
+ }
+
+ @BeforeClass
+ static public void setup() {
+ final IUserInputListenerFactory userInputListenerFactory = mock(IUserInputListenerFactory.class);
+ when(userInputListenerFactory.getToolBar("/main_toolbar")).thenReturn(new JToolBar());
+ when(userInputListenerFactory.getNodePopupMenu()).thenReturn(new JPopupMenu());
+ when(userInputListenerFactory.getMapPopup()).thenReturn(new JPopupMenu());
+ when(userInputListenerFactory.getMenuBar()).thenReturn(TestMenuBarFactory.createFreeplaneMenuBar());
+ final PhaseProcessor buildProcessor = new MenuBuildProcessFactory(
+ userInputListenerFactory, Controller.getCurrentModeController(), new FreeplaneResourceAccessor(),
+ mock(IAcceleratorMap.class),
+ new EntriesForAction(), Collections.<BuildPhaseListener>emptyList()).getBuildProcessor();
+ final String menuResource = "/xml/mindmapmodemenu.xml";
+ final InputStream resource = MenuBuilderAcceptanceTest.class.getResourceAsStream(menuResource);
+ final BufferedReader reader = new BufferedReader(new InputStreamReader(resource));
+ menuStructure = XmlEntryStructureBuilder.buildMenuStructure(reader);
+ buildProcessor.build(menuStructure);
+ }
+
+
+ @Test
+ public void test() {
+ }
+
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/MenuBuilderIntegrationTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/MenuBuilderIntegrationTest.java
new file mode 100644
index 0000000..51f9cad
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/MenuBuilderIntegrationTest.java
@@ -0,0 +1,102 @@
+package org.freeplane.core.ui.menubuilders;
+
+import static org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase.ACTIONS;
+import static org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase.UI;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.awt.Container;
+
+import javax.swing.Action;
+import javax.swing.JButton;
+import javax.swing.JToolBar;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.menubuilders.action.ActionFinder;
+import org.freeplane.core.ui.menubuilders.generic.BuilderDestroyerPair;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor;
+import org.freeplane.core.ui.menubuilders.generic.RecursiveMenuStructureProcessor;
+import org.freeplane.core.ui.menubuilders.menu.JToolbarComponentBuilder;
+import org.freeplane.core.ui.menubuilders.menu.JToolbarBuilder;
+import org.freeplane.features.mode.FreeplaneActions;
+import org.hamcrest.CoreMatchers;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class MenuBuilderIntegrationTest {
+ RecursiveMenuStructureProcessor recursiveMenuStructureBuilder;
+ FreeplaneActions freeplaneActions;
+ private JToolBar toolbar;
+
+ private Entry buildJMenu(String content) {
+ final Entry buildMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(content);
+ final RecursiveMenuStructureProcessor actionBuilder = new RecursiveMenuStructureProcessor();
+ actionBuilder.setDefaultBuilder(new ActionFinder(freeplaneActions));
+ new PhaseProcessor().withPhase(ACTIONS, actionBuilder).withPhase(UI, recursiveMenuStructureBuilder)
+ .build(buildMenuStructure);
+ return buildMenuStructure;
+ }
+
+ @Before
+ public void setup() {
+ freeplaneActions = mock(FreeplaneActions.class);
+ recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ recursiveMenuStructureBuilder.setDefaultBuilderPair(EntryVisitor.EMTPY, EntryVisitor.EMTPY);
+ final IUserInputListenerFactory userInputListenerFactory = mock(IUserInputListenerFactory.class);
+ toolbar = new JToolBar();
+ when(userInputListenerFactory.getToolBar("/main_toolbar")).thenReturn(toolbar);
+ recursiveMenuStructureBuilder.addBuilder("toolbar", new JToolbarBuilder(userInputListenerFactory));
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("toolbar", "toolbar.action");
+ recursiveMenuStructureBuilder.addBuilderPair("toolbar.action", new BuilderDestroyerPair(new JToolbarComponentBuilder(), null));
+ }
+
+ @Test
+ public void createsEmptyToolbarComponent() {
+ String content = "<FreeplaneUIEntries>"
+ + "<Entry name='home' builder='toolbar'/>"
+ + "</FreeplaneUIEntries>";
+
+ Entry builtMenuStructure = buildJMenu(content);
+ assertThat(new EntryAccessor().getComponent(builtMenuStructure.getChild(0)), CoreMatchers.<Object> is(toolbar));
+ }
+
+ @Test
+ public void createsToolbarButtonWithAction() {
+ String content = "<FreeplaneUIEntries>"
+ + "<Entry name='home' builder='toolbar'>"
+ + "<Entry name='action'/>"
+ + "</Entry>"
+ + "</FreeplaneUIEntries>";
+
+ final AFreeplaneAction someAction = Mockito.mock(AFreeplaneAction.class);
+ when(freeplaneActions.getAction("action")).thenReturn(someAction);
+
+ Entry builtMenuStructure = buildJMenu(content);
+
+ assertThat(((JButton)new EntryAccessor().getComponent(builtMenuStructure.getChild(0).getChild(0))).getAction(), CoreMatchers.<Action>equalTo(someAction));
+ }
+
+ @Test
+ public void givengroupWithAction_addsActionButtonToToolbar() {
+ String content = "<FreeplaneUIEntries>"
+ + "<Entry name='home' builder='toolbar'>"
+ + "<Entry name='action'/>"
+ + "</Entry>"
+ + "</FreeplaneUIEntries>";
+
+ final AFreeplaneAction someAction = Mockito.mock(AFreeplaneAction.class);
+ when(freeplaneActions.getAction("action")).thenReturn(someAction);
+
+ Entry builtMenuStructure = buildJMenu(content);
+
+ final JToolBar toolbar = (JToolBar)new EntryAccessor().getComponent(builtMenuStructure.getChild(0));
+ final JButton button = (JButton)new EntryAccessor().getComponent(builtMenuStructure.getChild(0).getChild(0));
+ assertThat(button.getParent(), CoreMatchers.equalTo((Container)toolbar));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/XmlEntryStructureBuilderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/XmlEntryStructureBuilderTest.java
new file mode 100644
index 0000000..c665b24
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/XmlEntryStructureBuilderTest.java
@@ -0,0 +1,146 @@
+package org.freeplane.core.ui.menubuilders;
+
+import static java.util.Arrays.asList;
+import static org.hamcrest.CoreMatchers.*;
+import static org.junit.Assert.*;
+
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.junit.Test;
+
+public class XmlEntryStructureBuilderTest {
+ @Test
+ public void givenXmlWithourContent_createsEmptyStructure() {
+ String xmlWithoutContent = "<FreeplaneUIEntries/>";
+
+ Entry builtMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(xmlWithoutContent);
+
+ Entry menuStructureWithChildEntry = new Entry();
+ assertThat(builtMenuStructure, equalTo(menuStructureWithChildEntry));
+ }
+
+ @Test
+ public void givenXmlWithChildEntryWithBuilderSpecificAttribute_createsStructureWithChildEntry() {
+ String xmlWithoutContent = "<FreeplaneUIEntries><Entry builderSpecificAttribute='Value'/></FreeplaneUIEntries>";
+
+ Entry builtMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(xmlWithoutContent);
+
+ Entry menuStructureWithChildEntry = new Entry();
+ final Entry childEntry = new Entry();
+ childEntry.setAttribute("builderSpecificAttribute", "Value");
+ menuStructureWithChildEntry.addChild(childEntry);
+
+ assertThat(builtMenuStructure, equalTo(menuStructureWithChildEntry));
+ }
+
+ @Test
+ public void givenXmlWithChildEntryWithOneBuilder_createsStructureWithChildEntry() {
+ String xmlWithoutContent = "<FreeplaneUIEntries><Entry builder='builder'/></FreeplaneUIEntries>";
+
+ Entry builtMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(xmlWithoutContent);
+
+ Entry menuStructureWithChildEntry = new Entry();
+ final Entry childEntry = new Entry();
+ childEntry.setBuilders(asList("builder"));
+ menuStructureWithChildEntry.addChild(childEntry);
+
+ assertThat(builtMenuStructure, equalTo(menuStructureWithChildEntry));
+ }
+
+ @Test
+ public void givenXmlWithChildEntryWithTwoBuilders_createsStructureWithChildEntry() {
+ String xmlWithoutContent = "<FreeplaneUIEntries><Entry builder='builder1, builder2'/></FreeplaneUIEntries>";
+
+ Entry builtMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(xmlWithoutContent);
+
+ Entry menuStructureWithChildEntry = new Entry();
+ final Entry childEntry = new Entry();
+ childEntry.setBuilders(asList("builder1", "builder2"));
+ menuStructureWithChildEntry.addChild(childEntry);
+
+ assertThat(builtMenuStructure, equalTo(menuStructureWithChildEntry));
+ }
+
+ @Test
+ public void givenXmlWithChildEntryWithName_createsStructureWithNamedChildEntry() {
+ String xmlWithoutContent = "<FreeplaneUIEntries><Entry name='entry'/></FreeplaneUIEntries>";
+
+ Entry builtMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(xmlWithoutContent);
+
+ Entry menuStructureWithChildEntry = new Entry();
+ final Entry childEntry = new Entry();
+ childEntry.setName("entry");
+ menuStructureWithChildEntry.addChild(childEntry);
+
+ assertThat(builtMenuStructure, equalTo(menuStructureWithChildEntry));
+ }
+
+ @Test
+ public void givenXmlWithDifferentChildLevels_createsStructure() {
+ String xmlWithoutContent = "<FreeplaneUIEntries><Entry name='level1'>"
+ + "<Entry name='level2'/>"
+ + "</Entry></FreeplaneUIEntries>";
+
+ Entry builtMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(xmlWithoutContent);
+
+ Entry menuStructureWithChildEntry = new Entry();
+ final Entry childEntry = new Entry();
+ childEntry.setName("level1");
+ menuStructureWithChildEntry.addChild(childEntry);
+
+ final Entry child2Entry = new Entry();
+ child2Entry.setName("level2");
+ childEntry.addChild(child2Entry);
+
+ assertThat(builtMenuStructure, equalTo(menuStructureWithChildEntry));
+ }
+
+ @Test
+ public void givenXmlWithSameChildLevels_createsStructure() {
+ String xmlWithoutContent = "<FreeplaneUIEntries><Entry name='level1'/>"
+ + "<Entry name='level2'/>"
+ + "</FreeplaneUIEntries>";
+
+ Entry builtMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(xmlWithoutContent);
+
+ Entry menuStructureWithChildEntry = new Entry();
+ final Entry childEntry = new Entry();
+ childEntry.setName("level1");
+ menuStructureWithChildEntry.addChild(childEntry);
+
+ final Entry child2Entry = new Entry();
+ child2Entry.setName("level2");
+ menuStructureWithChildEntry.addChild(child2Entry);
+
+ assertThat(builtMenuStructure, equalTo(menuStructureWithChildEntry));
+ }
+
+ @Test
+ public void givenXmlWithChildEntryWithFalse_createsBooleanObject() {
+ String xmlWithoutContent = "<FreeplaneUIEntries><Entry builderSpecificAttribute='FAlse'/></FreeplaneUIEntries>";
+
+ Entry builtMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(xmlWithoutContent);
+
+ Entry menuStructureWithChildEntry = new Entry();
+ final Entry childEntry = new Entry();
+ childEntry.setAttribute("builderSpecificAttribute", false);
+ menuStructureWithChildEntry.addChild(childEntry);
+
+ assertThat(builtMenuStructure, equalTo(menuStructureWithChildEntry));
+ }
+
+ @Test
+ public void givenXmlWithChildEntryWithTrue_createsBooleanObject() {
+ String xmlWithoutContent = "<FreeplaneUIEntries><Entry builderSpecificAttribute='true'/></FreeplaneUIEntries>";
+
+ Entry builtMenuStructure = XmlEntryStructureBuilder.buildMenuStructure(xmlWithoutContent);
+
+ Entry menuStructureWithChildEntry = new Entry();
+ final Entry childEntry = new Entry();
+ childEntry.setAttribute("builderSpecificAttribute", true);
+ menuStructureWithChildEntry.addChild(childEntry);
+
+ assertThat(builtMenuStructure, equalTo(menuStructureWithChildEntry));
+ }
+
+
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/AcceleratorBuilderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/AcceleratorBuilderTest.java
new file mode 100644
index 0000000..01b3c83
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/AcceleratorBuilderTest.java
@@ -0,0 +1,96 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+
+import java.awt.event.InputEvent;
+
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class AcceleratorBuilderTest {
+
+ @Test
+ public void setsDefaultAcceleratorForAction() {
+ Entry actionEntry = new Entry();
+ String actionKey = "actionKey";
+ actionEntry.setName(actionKey);
+ String keyStroke = KeyStroke.getKeyStroke('A', InputEvent.CTRL_MASK).toString();
+ actionEntry.setAttribute("accelerator", keyStroke);
+ final AFreeplaneAction action = mock(AFreeplaneAction.class);
+ new EntryAccessor().setAction(actionEntry, action);
+
+ IAcceleratorMap map = mock(IAcceleratorMap.class);
+ final AcceleratorBuilder acceleratorBuilder = new AcceleratorBuilder(map, mock(IEntriesForAction.class));
+ acceleratorBuilder.visit(actionEntry);
+
+ Mockito.verify(map).setDefaultAccelerator(action, keyStroke);
+
+ }
+
+ @Test
+ public void ignoresEntryWithoutAction() {
+ Entry actionEntry = new Entry();
+ String actionKey = "actionKey";
+ actionEntry.setName(actionKey);
+ String keyStroke = "CONTROL A";
+ actionEntry.setAttribute("accelerator", keyStroke);
+
+ IAcceleratorMap map = mock(IAcceleratorMap.class);
+ final AcceleratorBuilder acceleratorBuilder = new AcceleratorBuilder(map, mock(IEntriesForAction.class));
+ acceleratorBuilder.visit(actionEntry);
+
+ Mockito.verify(map, never()).setDefaultAccelerator(Mockito.<AFreeplaneAction> any(), Mockito.<String> any());
+
+ }
+
+ @Test
+ public void givenEntryWithoutAccelerator_doesNotSetOwnDefaultAccelerator() {
+ Entry actionEntry = new Entry();
+ final AFreeplaneAction action = mock(AFreeplaneAction.class);
+ new EntryAccessor().setAction(actionEntry, action);
+
+ IAcceleratorMap map = mock(IAcceleratorMap.class);
+ final AcceleratorBuilder acceleratorBuilder = new AcceleratorBuilder(map, mock(IEntriesForAction.class));
+ acceleratorBuilder.visit(actionEntry);
+
+ Mockito.verify(map, never()).setDefaultAccelerator(Mockito.<AFreeplaneAction> any(), anyString());
+
+ }
+
+ @Test
+ public void givenEntryWithoutAccelerator_setsUserDefinedAccelerator() {
+ Entry actionEntry = new Entry();
+ final AFreeplaneAction action = mock(AFreeplaneAction.class);
+ new EntryAccessor().setAction(actionEntry, action);
+
+ IAcceleratorMap map = mock(IAcceleratorMap.class);
+ final AcceleratorBuilder acceleratorBuilder = new AcceleratorBuilder(map, mock(IEntriesForAction.class));
+ acceleratorBuilder.visit(actionEntry);
+
+ Mockito.verify(map).setUserDefinedAccelerator(action);
+
+ }
+
+
+ @Test
+ public void registersEntryWithAction() {
+ Entry actionEntry = new Entry();
+ final AFreeplaneAction action = mock(AFreeplaneAction.class);
+ new EntryAccessor().setAction(actionEntry, action);
+
+ IAcceleratorMap map = mock(IAcceleratorMap.class);
+ IEntriesForAction entries = mock(IEntriesForAction.class);
+ final AcceleratorBuilder acceleratorBuilder = new AcceleratorBuilder(map, entries);
+ acceleratorBuilder.visit(actionEntry);
+
+ Mockito.verify(entries).registerEntry(action, actionEntry);
+
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/AcceleratorDestroyerTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/AcceleratorDestroyerTest.java
new file mode 100644
index 0000000..2b47d20
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/AcceleratorDestroyerTest.java
@@ -0,0 +1,22 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import static org.mockito.Mockito.mock;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class AcceleratorDestroyerTest {
+ @Test
+ public void unregistersEntryWithAction() {
+ Entry actionEntry = new Entry();
+ final AFreeplaneAction action = mock(AFreeplaneAction.class);
+ new EntryAccessor().setAction(actionEntry, action);
+ IEntriesForAction entries = mock(IEntriesForAction.class);
+ final AcceleratorDestroyer acceleratorDestroyer = new AcceleratorDestroyer(entries);
+ acceleratorDestroyer.visit(actionEntry);
+ Mockito.verify(entries).unregisterEntry(action, actionEntry);
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/ActionFinderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/ActionFinderTest.java
new file mode 100644
index 0000000..b2e53cf
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/ActionFinderTest.java
@@ -0,0 +1,55 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.freeplane.core.resources.SetBooleanPropertyAction;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.features.mode.FreeplaneActions;
+import org.hamcrest.CoreMatchers;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class ActionFinderTest {
+
+ @Test
+ public void attachesExistingFreeplaneAction() {
+ FreeplaneActions freeplaneActions = mock(FreeplaneActions.class);
+ Entry entry = new Entry();
+ entry.setName("action");
+ final AFreeplaneAction someAction = Mockito.mock(AFreeplaneAction.class);
+ when(freeplaneActions.getAction("action")).thenReturn(someAction);
+
+ final ActionFinder actionFinder = new ActionFinder(freeplaneActions);
+ actionFinder.visit(entry);
+
+ assertThat((AFreeplaneAction) new EntryAccessor().getAction(entry), CoreMatchers.equalTo(someAction));
+ }
+
+ @Test
+ public void attachesSetBooleanPropertyAction() {
+ FreeplaneActions freeplaneActions = mock(FreeplaneActions.class);
+ final SetBooleanPropertyAction setBooleanPropertyAction = Mockito.mock(SetBooleanPropertyAction.class);
+ Entry entry = new Entry();
+ final String propertyActionName = "SetBooleanPropertyAction.property";
+ entry.setName(propertyActionName);
+ when(freeplaneActions.getAction(propertyActionName)).thenReturn(null);
+
+ final ActionFinder actionFinder = new ActionFinder(freeplaneActions){
+ @Override
+ protected AFreeplaneAction createSetBooleanPropertyAction(Class<? extends AFreeplaneAction> actionClass,
+ String propertyName) {
+ return setBooleanPropertyAction;
+ }
+
+ };
+ actionFinder.visit(entry);
+
+ Mockito.verify(freeplaneActions).addAction(setBooleanPropertyAction);
+ assertThat(new EntryAccessor().getAction(entry), CoreMatchers.<Object> equalTo(setBooleanPropertyAction));
+ }
+
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/ActionSelectListenerTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/ActionSelectListenerTest.java
new file mode 100644
index 0000000..b01e705
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/ActionSelectListenerTest.java
@@ -0,0 +1,54 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryPopupListenerCollection;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+
+public class ActionSelectListenerTest {
+
+ @Test
+ public void activatesSelectOnPopup_forCheckSelectionOnPopup() {
+ Entry menuEntry = new Entry();
+ Entry actionEntry = new Entry();
+ menuEntry.addChild(actionEntry);
+ final AFreeplaneAction someAction = Mockito.mock(AFreeplaneAction.class);
+ when(someAction.checkSelectionOnPopup()).thenReturn(true);
+ when(someAction.isEnabled()).thenReturn(true);
+ new EntryAccessor().setAction(actionEntry, someAction);
+
+ final EntryPopupListenerCollection entryPopupListenerCollection = new EntryPopupListenerCollection();
+ final ActionSelectListener actionSelectListener = new ActionSelectListener();
+ entryPopupListenerCollection.addEntryPopupListener(actionSelectListener);
+ entryPopupListenerCollection.childEntriesWillBecomeVisible(menuEntry);
+
+ verify(someAction).setSelected();
+ }
+
+ @Test
+ public void dontActivateSelectOnPopup_forNotCheckSelectionOnPopup() {
+ Entry menuEntry = new Entry();
+ Entry actionEntry = new Entry();
+ menuEntry.addChild(actionEntry);
+ final AFreeplaneAction someAction = Mockito.mock(AFreeplaneAction.class);
+ when(someAction.checkSelectionOnPopup()).thenReturn(false);
+ when(someAction.isEnabled()).thenReturn(true);
+ new EntryAccessor().setAction(actionEntry, someAction);
+
+ final EntryPopupListenerCollection entryPopupListenerCollection = new EntryPopupListenerCollection();
+ final ActionSelectListener actionSelectListener = new ActionSelectListener();
+ entryPopupListenerCollection.addEntryPopupListener(actionSelectListener);
+ entryPopupListenerCollection.childEntriesWillBecomeVisible(menuEntry);
+
+ verify(someAction, never()).setSelected();
+ }
+
+
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/ComponentBuilderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/ComponentBuilderTest.java
new file mode 100644
index 0000000..f9aa41f
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/ComponentBuilderTest.java
@@ -0,0 +1,28 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import java.awt.Component;
+
+import javax.swing.JPanel;
+
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.menu.ComponentProvider;
+import org.hamcrest.CoreMatchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ComponentBuilderTest {
+ @Test
+ public void testName() throws Exception {
+ final Entry entry = new Entry();
+ final Component testComponent = new JPanel();
+ final ComponentBuilder builder = new ComponentBuilder(new ComponentProvider() {
+ @Override
+ public Component createComponent(Entry entry) {
+ return testComponent;
+ }
+ });
+ builder.visit(entry);
+ Assert.assertThat(new EntryAccessor().getComponent(entry), CoreMatchers.<Object> equalTo(testComponent));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/EntriesForActionTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/EntriesForActionTest.java
new file mode 100644
index 0000000..e14a051
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/action/EntriesForActionTest.java
@@ -0,0 +1,55 @@
+package org.freeplane.core.ui.menubuilders.action;
+
+import static java.util.Arrays.asList;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+
+import java.util.Collection;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.junit.Test;
+
+public class EntriesForActionTest {
+ @Test
+ public void returnsEmptyListIfNoActionWasRegistered() throws Exception {
+ final EntriesForAction entriesForAction = new EntriesForAction();
+ AFreeplaneAction action = mock(AFreeplaneAction.class);
+ Collection<Entry> entries = entriesForAction.entries(action);
+ assertThat(entries.isEmpty(), equalTo(true));
+ }
+
+ @Test
+ public void returnsListWithRegisteredAction() throws Exception {
+ final EntriesForAction entriesForAction = new EntriesForAction();
+ AFreeplaneAction action = mock(AFreeplaneAction.class);
+ final Entry actionEntry = new Entry();
+ entriesForAction.registerEntry(action, actionEntry);
+ Collection<Entry> entries = entriesForAction.entries(action);
+ assertThat(entries, equalTo((Collection<Entry>) asList(actionEntry)));
+ }
+
+ @Test
+ public void returnsListWithTwoRegisteredActions() throws Exception {
+ final EntriesForAction entriesForAction = new EntriesForAction();
+ AFreeplaneAction action = mock(AFreeplaneAction.class);
+ final Entry actionEntry1 = new Entry();
+ final Entry actionEntry2 = new Entry();
+ entriesForAction.registerEntry(action, actionEntry1);
+ entriesForAction.registerEntry(action, actionEntry2);
+ Collection<Entry> entries = entriesForAction.entries(action);
+ assertThat(entries, equalTo((Collection<Entry>) asList(actionEntry1, actionEntry2)));
+ }
+
+ @Test
+ public void returnsEmptyListIfNoActionWasUnregistered() throws Exception {
+ final EntriesForAction entriesForAction = new EntriesForAction();
+ AFreeplaneAction action = mock(AFreeplaneAction.class);
+ final Entry actionEntry = new Entry();
+ entriesForAction.registerEntry(action, actionEntry);
+ entriesForAction.unregisterEntry(action, actionEntry);
+ Collection<Entry> entries = entriesForAction.entries(action);
+ assertThat(entries.isEmpty(), equalTo(true));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/BuilderDestroyerPairTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/BuilderDestroyerPairTest.java
new file mode 100644
index 0000000..b23c394
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/BuilderDestroyerPairTest.java
@@ -0,0 +1,14 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import static org.mockito.Mockito.mock;
+
+import org.junit.Test;
+
+public class BuilderDestroyerPairTest {
+ @Test
+ public void test() {
+ EntryVisitor builder = mock(EntryVisitor.class);
+ EntryVisitor destroyer = mock(EntryVisitor.class);
+ new BuilderDestroyerPair(builder, destroyer);
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryAccessorTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryAccessorTest.java
new file mode 100644
index 0000000..523dda0
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryAccessorTest.java
@@ -0,0 +1,116 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JSeparator;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EntryAccessorTest {
+ Entry entry;
+ EntryAccessor entryAccessor;
+ ResourceAccessor resourceAccessor;
+
+ @Before
+ public void setup(){
+ resourceAccessor = mock(ResourceAccessor.class);
+ entry = new Entry();
+ entryAccessor = new EntryAccessor(resourceAccessor);
+ }
+
+ @Test
+ public void getsTextFromEntryAttributeText() throws Exception {
+ entry.setAttribute("text", "entry text");
+ final String entryText = entryAccessor.getText(entry);
+ Assert.assertThat(entryText, equalTo("entry text"));
+ }
+
+ @Test
+ public void getsTextFromEntryAttributeTextKey() throws Exception {
+ entry.setAttribute("textKey", "entry text key");
+ when(resourceAccessor.getRawText("entry text key")).thenReturn("entry text");
+ final String entryText = entryAccessor.getText(entry);
+ Assert.assertThat(entryText, equalTo("entry text"));
+ }
+
+ @Test
+ public void getsIconFromEntryAttributeIcon() throws Exception {
+ final Icon icon = new ImageIcon();
+ entry.setAttribute(EntryAccessor.ICON, icon);
+ final Icon entryIcon = entryAccessor.getIcon(entry);
+ Assert.assertThat(entryIcon, equalTo(icon));
+ }
+
+ @Test
+ public void setsTextToEntryAttributeText() throws Exception {
+ entryAccessor.setText(entry, "entry text");
+ final String entryText = entryAccessor.getText(entry);
+ Assert.assertThat(entryText, equalTo("entry text"));
+ }
+
+ @Test
+ public void setsIconToEntryAttributeIcon() throws Exception {
+ final Icon icon = new ImageIcon();
+ entryAccessor.setIcon(entry, icon);
+ final Icon entryIcon = entryAccessor.getIcon(entry);
+ Assert.assertThat(entryIcon, equalTo(icon));
+ }
+
+ @Test
+ public void setsAction() throws Exception {
+ final AFreeplaneAction action = mock(AFreeplaneAction.class);
+ entryAccessor.setAction(entry, action);
+ final AFreeplaneAction entryAction = entryAccessor.getAction(entry);
+ Assert.assertThat(entryAction, equalTo(action));
+ }
+
+ @Test
+ public void addsChildAction() throws Exception {
+ final AFreeplaneAction action = mock(AFreeplaneAction.class);
+ when(action.getKey()).thenReturn("key");
+ entryAccessor.addChildAction(entry, action);
+ final Entry actionEntry = entry.getChild(0);
+ final AFreeplaneAction entryAction = entryAccessor.getAction(actionEntry);
+ Assert.assertThat(actionEntry.getName(), equalTo("key"));
+ Assert.assertThat(entryAction, equalTo(action));
+ }
+
+ @Test
+ public void givenEntryWithoutText_returnsEmtpyLocationDescription() throws Exception {
+ entryAccessor.setComponent(entry, new JSeparator());
+
+ final String entryText = entryAccessor.getLocationDescription(entry);
+ Assert.assertThat(entryText, equalTo(""));
+ }
+
+ @Test
+ public void givenEntryWithTextAndComponent_returnsNonEmtpyLocationDescription() throws Exception {
+ String text = "entry text";
+ entryAccessor.setText(entry, text);
+ entryAccessor.setComponent(entry, new JSeparator());
+
+ final String entryText = entryAccessor.getLocationDescription(entry);
+ Assert.assertThat(entryText, equalTo(text));
+ }
+
+ @Test
+ public void givenEntryWithParent_joinesTheirDescritionsSeparatedByArrow() throws Exception {
+ entryAccessor.setText(entry, "entry");
+ entryAccessor.setComponent(entry, new JSeparator());
+
+ Entry parent = new Entry();
+ parent.addChild(entry);
+ entryAccessor.setText(parent, "parent");
+ entryAccessor.setComponent(parent, new JSeparator());
+
+ final String entryText = entryAccessor.getLocationDescription(entry);
+ Assert.assertThat(entryText, equalTo("parent -> entry"));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryNavigatorTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryNavigatorTest.java
new file mode 100644
index 0000000..8fe1944
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryNavigatorTest.java
@@ -0,0 +1,36 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Test;
+
+
+public class EntryNavigatorTest {
+ @Test
+ public void findsChildByPath() throws Exception {
+ final EntryNavigator entryNavigator = new EntryNavigator();
+ Entry top = new Entry();
+ Entry middle = new Entry();
+ top.addChild(middle);
+ middle.setName("middle");
+ Entry down = new Entry();
+ middle.addChild(down);
+ down.setName("down");
+ assertThat(entryNavigator.findChildByPath(top, "middle/down"), equalTo(down));
+ }
+
+ @Test
+ public void findsChildByPathAlias() throws Exception {
+ final EntryNavigator entryNavigator = new EntryNavigator();
+ entryNavigator.addAlias("medium", "middle");
+ Entry top = new Entry();
+ Entry middle = new Entry();
+ top.addChild(middle);
+ middle.setName("middle");
+ Entry down = new Entry();
+ middle.addChild(down);
+ down.setName("down");
+ assertThat(entryNavigator.findChildByPath(top, "medium/down"), equalTo(down));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryPopupListenerCollectionTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryPopupListenerCollectionTest.java
new file mode 100644
index 0000000..c484c3c
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryPopupListenerCollectionTest.java
@@ -0,0 +1,60 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import org.junit.Test;
+
+public class EntryPopupListenerCollectionTest {
+
+
+ @Test
+ public void forwardsPopupMenuWillBecomeVisibleToRegisteredEntryPopupListener() {
+ final Entry entry = new Entry();
+ final EntryPopupListenerCollection entryEntryPopupListenerAccessor = new EntryPopupListenerCollection();
+ EntryPopupListener popupMenuListener = mock(EntryPopupListener.class);
+ entryEntryPopupListenerAccessor.addEntryPopupListener(popupMenuListener);
+
+ entryEntryPopupListenerAccessor.childEntriesWillBecomeVisible(entry);
+ verify(popupMenuListener).childEntriesWillBecomeVisible(entry);
+ }
+
+ @Test
+ public void forwardsPopupMenuWillBecomeInvisibleToRegisteredEntryPopupListener() {
+ final Entry entry = new Entry();
+ final EntryPopupListenerCollection entryEntryPopupListenerAccessor = new EntryPopupListenerCollection();
+ EntryPopupListener popupMenuListener = mock(EntryPopupListener.class);
+ entryEntryPopupListenerAccessor.addEntryPopupListener(popupMenuListener);
+
+ entryEntryPopupListenerAccessor.childEntriesHidden(entry);
+ verify(popupMenuListener).childEntriesHidden(entry);
+ }
+
+
+ @Test
+ public void supportsMoreThanOneListener() {
+ final Entry entry = new Entry();
+ final EntryPopupListenerCollection entryEntryPopupListenerAccessor = new EntryPopupListenerCollection();
+ EntryPopupListener popupMenuListener1 = mock(EntryPopupListener.class);
+ entryEntryPopupListenerAccessor.addEntryPopupListener(popupMenuListener1);
+ EntryPopupListener popupMenuListener2 = mock(EntryPopupListener.class);
+ entryEntryPopupListenerAccessor.addEntryPopupListener(popupMenuListener2);
+
+ entryEntryPopupListenerAccessor.childEntriesWillBecomeVisible(entry);
+ verify(popupMenuListener1).childEntriesWillBecomeVisible(entry);
+ }
+
+ @Test
+ public void doNotCallsUnregisteredEntryPopupListener() {
+ final Entry entry = new Entry();
+ final EntryPopupListenerCollection entryEntryPopupListenerAccessor = new EntryPopupListenerCollection();
+ EntryPopupListener popupMenuListener = mock(EntryPopupListener.class);
+ entryEntryPopupListenerAccessor.addEntryPopupListener(popupMenuListener);
+ entryEntryPopupListenerAccessor.removeEntryPopupListener(popupMenuListener);
+
+ entryEntryPopupListenerAccessor.childEntriesWillBecomeVisible(entry);
+ verify(popupMenuListener, never()).childEntriesWillBecomeVisible(entry);
+ }
+
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryTest.java
new file mode 100644
index 0000000..c94cbb7
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/EntryTest.java
@@ -0,0 +1,296 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.hamcrest.CoreMatchers;
+import org.junit.Test;
+
+public class EntryTest {
+
+ private Entry entryWithName(String name) {
+ Entry entry = new Entry();
+ entry.setName(name);
+ return entry;
+ }
+
+ @Test
+ public void equalEntriesWithChild() {
+ Entry firstStructureWithEntry = new Entry();
+ final Entry firstEntry = new Entry();
+ firstStructureWithEntry.addChild(firstEntry);
+
+ Entry otherStructureWithEntry = new Entry();
+ final Entry otherEntry = new Entry();
+ otherStructureWithEntry.addChild(otherEntry);
+
+ assertThat(firstStructureWithEntry, equalTo(otherStructureWithEntry));
+ }
+
+ @Test
+ public void equalEntriesWithDifferentBuilders() {
+ Entry firstStructureWithEntry = new Entry();
+ firstStructureWithEntry.setBuilders(Arrays.asList("builder"));
+
+ Entry otherStructureWithEntry = new Entry();
+ assertThat(firstStructureWithEntry, CoreMatchers.not(otherStructureWithEntry));
+ }
+
+ @Test
+ public void knowsParent() {
+ Entry structureWithEntry = new Entry();
+ final Entry child = new Entry();
+ structureWithEntry.addChild(child);
+
+ assertThat(child.getParent(), equalTo(structureWithEntry));
+ }
+
+
+ @Test
+ public void selfIsRoot() {
+ final Entry entry = new Entry();
+ assertThat(entry.getRoot(), equalTo(entry));
+ }
+
+ @Test
+ public void parentIsRoot() {
+ Entry structureWithEntry = new Entry();
+ final Entry child = new Entry();
+ structureWithEntry.addChild(child);
+ assertThat(child.getRoot(), equalTo(structureWithEntry));
+ }
+
+ @Test
+ public void parentIsNotRoot() {
+ Entry root = new Entry();
+ final Entry parent = new Entry();
+ root.addChild(parent);
+ final Entry child = new Entry();
+ parent.addChild(child);
+ assertThat(child.getRoot(), equalTo(root));
+ }
+
+ @Test
+ public void rootEntryPathIsSlashifiedName() {
+ Entry entry = new Entry();
+ entry.setName("name");
+ assertThat(entry.getPath(), equalTo("/name"));
+ }
+
+
+ @Test
+ public void childEntryPathIsSlashifiedNameAfterParentName() {
+ Entry entry = new Entry();
+ entry.setName("parent");
+ Entry child = new Entry();
+ child.setName("child");
+ entry.addChild(child);
+ assertThat(child.getPath(), equalTo("/parent/child"));
+ }
+
+ @Test
+ public void iteratesOverSingleChild() {
+ Entry firstStructureWithEntry = new Entry();
+ final Entry firstEntry = new Entry();
+ firstStructureWithEntry.addChild(firstEntry);
+ Entry child = null;
+ for(Entry childInLoop : firstStructureWithEntry.children())
+ child = childInLoop;
+ assertThat(firstEntry, equalTo(child));
+ }
+
+ @Test
+ public void findsParentComponent(){
+ Object component = mock(Object.class);
+ Entry structureWithEntry = new Entry();
+ new EntryAccessor().setComponent(structureWithEntry, component);
+ final Entry child = new Entry();
+ structureWithEntry.addChild(child);
+
+ assertThat(new EntryAccessor().getAncestorComponent(child), equalTo(component));
+ }
+
+ @Test
+ public void returnsNullIfAncestorComponentIsNotAvailable(){
+ Entry structureWithEntry = new Entry();
+ final Entry child = new Entry();
+ structureWithEntry.addChild(child);
+
+ assertThat(new EntryAccessor().getAncestorComponent(child), CoreMatchers.nullValue());
+ }
+
+ @Test
+ public void findsAncestorComponent(){
+ Object component = mock(Object.class);
+ Entry structureWithEntry = new Entry();
+ new EntryAccessor().setComponent(structureWithEntry, component);
+ final Entry level1child = new Entry();
+ structureWithEntry.addChild(level1child);
+
+ final Entry level2child = new Entry();
+ level1child.addChild(level2child);
+
+ assertThat(new EntryAccessor().getAncestorComponent(level2child), equalTo(component));
+ }
+
+ @Test
+ public void removesChildEntries(){
+ Entry structureWithEntry = new Entry();
+ final Entry child = new Entry();
+ structureWithEntry.addChild(child);
+ structureWithEntry.removeChildren();
+
+ assertThat(structureWithEntry, is(new Entry()));
+ }
+
+ @Test(expected=AttributeAlreadySetException.class)
+ public void cannotSetDifferentAttributeValue() {
+ Entry entry = new Entry();
+ entry.setAttribute("key", "value");
+ entry.setAttribute("key", "value2");
+ }
+
+ @Test(expected=AttributeAlreadySetException.class)
+ public void cannotSetDifferentClassAttributeValue() {
+ Entry entry = new Entry();
+ entry.setAttribute(String.class, "value");
+ entry.setAttribute(String.class, "value2");
+ }
+
+ @Test
+ public void canRemoveAttribute() {
+ Entry entry = new Entry();
+ entry.setAttribute("key", "value1");
+ entry.removeAttribute("key");
+ entry.setAttribute("key", "value2");
+ assertThat(entry.getAttribute("key"), CoreMatchers.<Object>equalTo("value2"));
+ }
+
+ @Test
+ public void canRemoveClassAttribute() {
+ Entry entry = new Entry();
+ entry.setAttribute(String.class, "value1");
+ entry.removeAttribute(String.class);
+ entry.setAttribute(String.class, "value2");
+ String value = entry.getAttribute(String.class);
+ assertThat(value, CoreMatchers.<Object>equalTo("value2"));
+ }
+
+ @Test
+ public void hasChildren() {
+ Entry firstStructureWithEntry = new Entry();
+ final Entry firstEntry = new Entry();
+ firstStructureWithEntry.addChild(firstEntry);
+
+ assertThat(firstStructureWithEntry.hasChildren(), equalTo(true));
+ }
+
+
+ @Test
+ public void getsChildrenWithNoIndices() {
+ Entry top = entryWithName("top");
+
+ assertThat(top.getChild(), equalTo(top));
+ }
+
+ @Test
+ public void getsChildrenWithOneIndex() {
+ Entry top = new Entry();
+ Entry middle = entryWithName("middle");
+ top.addChild(middle);
+
+ assertThat(top.getChild(0), equalTo(middle));
+ }
+
+ @Test
+ public void getsChildrenWithTwoIndices() {
+ Entry top = new Entry();
+ Entry middle = new Entry();
+ top.addChild(middle);
+ Entry down = entryWithName("down");
+ middle.addChild(down);
+
+ assertThat(top.getChild(0, 0), equalTo(down));
+ }
+
+ @Test
+ public void returnsChildWithName() throws Exception {
+ Entry top = new Entry();
+ Entry middle = entryWithName("child");
+ top.addChild(middle);
+ assertThat(top.getChild("child"), equalTo(middle));
+ }
+
+ @Test
+ public void recursiveSearchReturnsChildWithName() throws Exception {
+ Entry top = new Entry();
+ Entry middle = entryWithName("child");
+ top.addChild(middle);
+ Entry leaf = entryWithName("grandchild");
+ middle.addChild(leaf);
+ assertThat(top.findEntry("grandchild"), equalTo(leaf));
+ }
+
+ @Test
+ public void recursiveSearchReturnsChildsWithName() throws Exception {
+ Entry top = new Entry();
+ Entry middle = entryWithName("child");
+ top.addChild(middle);
+ Entry leaf1 = entryWithName("grandchild");
+ middle.addChild(leaf1);
+ Entry leaf2 = entryWithName("grandchild");
+ middle.addChild(leaf2);
+ assertThat(top.findEntries("grandchild"), CoreMatchers.<Collection<?>> equalTo(Arrays.asList(leaf1, leaf2)));
+ }
+
+ @Test
+ public void returnsChildWithNameDeeply() throws Exception {
+ Entry top = new Entry();
+ Entry middle = new Entry();
+ top.addChild(middle);
+ Entry down = new Entry();
+ middle.addChild(down);
+ down.setName("name");
+ assertThat(top.getChild("name"), equalTo(down));
+ }
+
+ @Test
+ public void getsChildByPath() {
+ Entry top = new Entry();
+ Entry middle = new Entry();
+ top.addChild(middle);
+ middle.setName("middle");
+ Entry down = new Entry();
+ middle.addChild(down);
+ down.setName("down");
+ assertThat(top.getChildByPath("middle", "down"), equalTo(down));
+ }
+
+ @Test
+ public void ignoresEmptyStringsInPath() {
+ Entry top = new Entry();
+ Entry middle = new Entry();
+ top.addChild(middle);
+ middle.setName("middle");
+ Entry down = new Entry();
+ middle.addChild(down);
+ down.setName("down");
+ assertThat(top.getChildByPath("middle", "", "down"), equalTo(down));
+ }
+
+ @Test
+ public void childrenWithTwoNamesNotFound() {
+ Entry top = new Entry();
+ Entry middle = new Entry();
+ top.addChild(middle);
+ Entry down = new Entry();
+ middle.addChild(down);
+ down.setName("down");
+ assertThat(top.getChildByPath("middle", "down"), equalTo(null));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/PhaseProcessorTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/PhaseProcessorTest.java
new file mode 100644
index 0000000..eccb6e9
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/PhaseProcessorTest.java
@@ -0,0 +1,98 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import static org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase.ACCELERATORS;
+import static org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase.ACTIONS;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.mockito.InOrder;
+
+
+public class PhaseProcessorTest {
+ @Test
+ public void onePhaseBuilder() throws Exception {
+ RecursiveMenuStructureProcessor builder = mock(RecursiveMenuStructureProcessor.class);
+ final PhaseProcessor phasedBuilder = new PhaseProcessor().withPhase(ACTIONS, builder);
+ final Entry entry = new Entry();
+ phasedBuilder.build(entry);
+ verify(builder).build(entry);
+ }
+ @Test
+ public void twoPhaseBuilder() throws Exception {
+ RecursiveMenuStructureProcessor first = mock(RecursiveMenuStructureProcessor.class);
+ RecursiveMenuStructureProcessor second = mock(RecursiveMenuStructureProcessor.class);
+ final PhaseProcessor phasedBuilder = new PhaseProcessor().withPhase(ACTIONS, first).withPhase(ACCELERATORS,
+ second);
+ final Entry entry = new Entry();
+ phasedBuilder.build(entry);
+ verify(second).build(entry);
+ }
+
+ @Test
+ public void subtreeBuilder() throws Exception {
+ RecursiveMenuStructureProcessor builder = mock(RecursiveMenuStructureProcessor.class);
+ RecursiveMenuStructureProcessor childrenBuilder = mock(RecursiveMenuStructureProcessor.class);
+ final PhaseProcessor phasedBuilder = new PhaseProcessor().withPhase(ACTIONS, builder);
+ final Entry entry = new Entry();
+ when(builder.forChildren(entry, entry)).thenReturn(childrenBuilder);
+ phasedBuilder.forChildren(entry, entry).build(entry);
+ verify(childrenBuilder).build(entry);
+ }
+
+ @Test
+ public void onePhaseDestroy() throws Exception {
+ RecursiveMenuStructureProcessor builder = mock(RecursiveMenuStructureProcessor.class);
+ final PhaseProcessor phasedBuilder = new PhaseProcessor().withPhase(ACTIONS, builder);
+ final Entry entry = new Entry();
+ phasedBuilder.destroy(entry);
+ verify(builder).destroy(entry);
+ }
+
+ @Test
+ public void returnsPhase() throws Exception {
+ RecursiveMenuStructureProcessor builder = mock(RecursiveMenuStructureProcessor.class);
+ final PhaseProcessor phasedBuilder = new PhaseProcessor().withPhase(ACTIONS, builder);
+ Assert.assertThat(phasedBuilder.phase(ACTIONS), equalTo(builder));
+ }
+
+ @Test
+ public void twoPhaseDestroyInOppositeOrder() throws Exception {
+ RecursiveMenuStructureProcessor first = mock(RecursiveMenuStructureProcessor.class);
+ RecursiveMenuStructureProcessor second = mock(RecursiveMenuStructureProcessor.class);
+ final PhaseProcessor phasedBuilder = new PhaseProcessor().withPhase(ACTIONS, first).withPhase(ACCELERATORS,
+ second);
+ final Entry entry = new Entry();
+ phasedBuilder.destroy(entry);
+ final InOrder inOrder = inOrder(first, second);
+ inOrder.verify(second).destroy(entry);
+ inOrder.verify(first).destroy(entry);
+ }
+
+ @Test
+ public void notifyListener() throws Exception {
+ RecursiveMenuStructureProcessor builder = mock(RecursiveMenuStructureProcessor.class);
+ BuildPhaseListener listener = mock(BuildPhaseListener.class);
+ final PhaseProcessor phasedBuilder = new PhaseProcessor(Arrays.asList(listener)).withPhase(ACTIONS, builder);
+ final Entry entry = new Entry();
+ phasedBuilder.build(entry);
+ verify(listener).buildPhaseFinished(ACTIONS, entry);
+ }
+
+ @Test
+ public void childBuilder() throws Exception {
+ RecursiveMenuStructureProcessor builder = mock(RecursiveMenuStructureProcessor.class);
+ final PhaseProcessor phasedBuilder = new PhaseProcessor().withPhase(ACTIONS, builder);
+ final Entry entry = new Entry();
+ final Entry child = new Entry();
+ entry.addChild(child);
+ phasedBuilder.buildChildren(entry);
+ verify(builder).build(child);
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/RecursiveMenuStructureProcessorTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/RecursiveMenuStructureProcessorTest.java
new file mode 100644
index 0000000..b3ae14d
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/RecursiveMenuStructureProcessorTest.java
@@ -0,0 +1,271 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import static java.util.Arrays.asList;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Arrays;
+
+import org.freeplane.core.ui.menubuilders.generic.BuilderDestroyerPair.VisitorType;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class RecursiveMenuStructureProcessorTest {
+
+ private RecursiveMenuStructureProcessor recursiveMenuStructureBuilder;
+ private EntryVisitor builder;
+ private EntryVisitor defaultBuilder;
+ private EntryVisitor emptyBuilder;
+ private EntryVisitor destroyer;
+
+ @Before
+ public void setup(){
+ recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ defaultBuilder = Mockito.mock(EntryVisitor.class);
+ builder = Mockito.mock(EntryVisitor.class);
+ destroyer = Mockito.mock(EntryVisitor.class);
+ recursiveMenuStructureBuilder.addBuilderPair("builder", builder, destroyer);
+ emptyBuilder = EntryVisitor.EMTPY;
+ recursiveMenuStructureBuilder.addBuilderPair("emptyBuilder", emptyBuilder, null);
+ recursiveMenuStructureBuilder.addBuilderPair("defaultBuilder", defaultBuilder, null);
+ }
+
+
+ @Test
+ public void explicitBuilderIsCalled() {
+ final RecursiveMenuStructureProcessor recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ EntryVisitor builder = Mockito.mock(EntryVisitor.class);
+ recursiveMenuStructureBuilder.addBuilder("builder", builder);
+ final Entry entry = new Entry();
+ entry.setBuilders(asList("builder"));
+ recursiveMenuStructureBuilder.build(entry);
+
+ verify(builder).visit(entry);
+ }
+
+ @Test
+ public void defaultBuilderIsCalled() {
+ final RecursiveMenuStructureProcessor recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ EntryVisitor builder = Mockito.mock(EntryVisitor.class);
+ recursiveMenuStructureBuilder.setDefaultBuilder(builder);
+ final Entry entry = new Entry();
+ recursiveMenuStructureBuilder.build(entry);
+ verify(builder).visit(entry);
+ }
+
+
+ @Test
+ public void defaultBuilderIsCalledForChild() {
+ recursiveMenuStructureBuilder.addBuilderPair("builder", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("builder", "defaultBuilder");
+ final Entry entry = new Entry();
+ entry.setBuilders(asList("builder"));
+ final Entry childEntry = new Entry();
+ entry.addChild(childEntry);
+
+ recursiveMenuStructureBuilder.build(entry);
+
+ verify(defaultBuilder).visit(childEntry);
+ }
+
+ @Test
+ public void defaultBuilderIsRestoredAfterChildCall() {
+ final RecursiveMenuStructureProcessor recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ recursiveMenuStructureBuilder.addBuilderPair("builder1", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.addBuilderPair("builder2", EntryVisitor.EMTPY, null);
+ EntryVisitor defaultBuilder = Mockito.mock(EntryVisitor.class);
+ recursiveMenuStructureBuilder.addBuilderPair("builder3", defaultBuilder, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("builder1", "builder3");
+ recursiveMenuStructureBuilder.addBuilderPair("builder2", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("builder2", "builder2");
+
+ final Entry entry = new Entry();
+ entry.setBuilders(asList("builder1"));
+ final Entry childEntry1 = new Entry();
+ childEntry1.setBuilders(asList("builder2"));
+ entry.addChild(childEntry1);
+
+ final Entry childEntry2 = new Entry();
+ entry.addChild(childEntry2);
+
+ recursiveMenuStructureBuilder.build(entry);
+
+ Mockito.verify(defaultBuilder).visit(childEntry2);
+ }
+
+
+ @Test
+ public void defaultBuilderIsCalledForChildUsingDefaultBuilder() {
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("emptyBuilder", "defaultBuilder");
+ recursiveMenuStructureBuilder.addBuilderPair("emptyBuilder2", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("emptyBuilder2", "emptyBuilder");
+ final Entry entry = new Entry();
+ entry.setBuilders(asList("emptyBuilder2"));
+ final Entry childEntry = new Entry();
+ entry.addChild(childEntry);
+ final Entry subChildEntry = new Entry();
+ childEntry.addChild(subChildEntry);
+
+ recursiveMenuStructureBuilder.build(entry);
+
+ Mockito.verify(defaultBuilder).visit(subChildEntry);
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void defaultBuilderIsNotSetException() {
+ final RecursiveMenuStructureProcessor recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ final Entry childEntry = new Entry();
+ recursiveMenuStructureBuilder.build(childEntry);
+
+ }
+ @Test
+ public void defaultBuilderIsNotCalledForChildIfChildProcessingIsSkipped() {
+ recursiveMenuStructureBuilder.setDefaultBuilder(defaultBuilder);
+ final Entry entry = new Entry();
+ when(builder.shouldSkipChildren(entry)).thenReturn(true);
+ entry.setBuilders(asList("builder"));
+ final Entry childEntry = new Entry();
+ entry.addChild(childEntry);
+
+
+ recursiveMenuStructureBuilder.build(entry);
+
+ Mockito.verify(defaultBuilder, never()).visit(childEntry);
+ }
+
+ @Test
+ public void explicitRootBuilderExplicitSubtreeDefaultBuilderForRoot() {
+ recursiveMenuStructureBuilder.addBuilderPair("builder", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("builder", "defaultBuilder");
+ final Entry entry = new Entry();
+ entry.setBuilders(asList("builder"));
+ BuilderDestroyerPair subtreeDefaultBuilder = recursiveMenuStructureBuilder.findSubtreeChildrenDefaultBuilder(
+ entry, entry);
+ assertThat(subtreeDefaultBuilder.get(VisitorType.BUILDER), equalTo(this.defaultBuilder));
+ }
+
+ @Test
+ public void explicitRootBuilderImplicitSubtreeDefaultBuilderForRoot() {
+ recursiveMenuStructureBuilder.addBuilderPair("builder", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setDefaultBuilder(defaultBuilder);
+ final Entry entry = new Entry();
+ entry.setBuilders(asList("builder"));
+ BuilderDestroyerPair subtreeDefaultBuilder = recursiveMenuStructureBuilder.findSubtreeChildrenDefaultBuilder(
+ entry, entry);
+ assertThat(subtreeDefaultBuilder.get(VisitorType.BUILDER), equalTo(this.defaultBuilder));
+ }
+
+ @Test
+ public void explicitRootBuilderExplicitSubtreeDefaultBuilderForChild() {
+ recursiveMenuStructureBuilder.addBuilderPair("builder", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("builder", "defaultBuilder");
+ final Entry root = new Entry();
+ root.setBuilders(asList("builder"));
+ final Entry childEntry = new Entry();
+ root.addChild(childEntry);
+ BuilderDestroyerPair subtreeDefaultBuilder = recursiveMenuStructureBuilder.findSubtreeChildrenDefaultBuilder(
+ root, childEntry);
+ assertThat(subtreeDefaultBuilder.get(VisitorType.BUILDER), equalTo(this.defaultBuilder));
+ }
+
+ @Test
+ public void explicitRootBuilderImplicitBuilderForParentExplicitSubtreeDefaultBuilderForChild() {
+ recursiveMenuStructureBuilder.addBuilderPair("builder", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("builder", "emptyBuilder");
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("emptyBuilder", "defaultBuilder");
+ final Entry root = new Entry();
+ root.setBuilders(asList("builder"));
+ final Entry parentEntry = new Entry();
+ root.addChild(parentEntry);
+ final Entry childEntry = new Entry();
+ parentEntry.addChild(childEntry);
+ BuilderDestroyerPair subtreeDefaultBuilder = recursiveMenuStructureBuilder.findSubtreeChildrenDefaultBuilder(
+ root, childEntry);
+ assertThat(subtreeDefaultBuilder.get(VisitorType.BUILDER), equalTo(this.defaultBuilder));
+ }
+
+ @Test
+ public void defaultBuilderWithoutDefaultBuilderChange() {
+ recursiveMenuStructureBuilder.addBuilderPair("builder", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("builder", "emptyBuilder");
+ final Entry root = new Entry();
+ root.setBuilders(asList("builder"));
+ final Entry parentEntry = new Entry();
+ root.addChild(parentEntry);
+ final Entry childEntry = new Entry();
+ parentEntry.addChild(childEntry);
+ BuilderDestroyerPair subtreeDefaultBuilder = recursiveMenuStructureBuilder.findSubtreeChildrenDefaultBuilder(
+ root, childEntry);
+ assertThat(subtreeDefaultBuilder.get(VisitorType.BUILDER), equalTo(this.emptyBuilder));
+ }
+
+ @Test
+ public void explicitBuilderWithoutDefaultBuilderChange() {
+ recursiveMenuStructureBuilder.addBuilderPair("builder", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.addBuilderPair("parent", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("builder", "emptyBuilder");
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("emptyBuilder", "defaultBuilder");
+ final Entry root = new Entry();
+ root.setBuilders(asList("builder"));
+ final Entry parentEntry = new Entry();
+ parentEntry.setBuilders(asList("parent"));
+ root.addChild(parentEntry);
+ final Entry childEntry = new Entry();
+ parentEntry.addChild(childEntry);
+ BuilderDestroyerPair subtreeDefaultBuilder = recursiveMenuStructureBuilder.findSubtreeChildrenDefaultBuilder(
+ root, childEntry);
+ assertThat(subtreeDefaultBuilder.get(VisitorType.BUILDER), equalTo(this.emptyBuilder));
+ }
+
+ @Test
+ public void defaultBuilderIsSetForSubtreeProcessor() {
+ recursiveMenuStructureBuilder.addBuilderPair("builder", EntryVisitor.EMTPY, null);
+ recursiveMenuStructureBuilder.setSubtreeDefaultBuilderPair("builder", "defaultBuilder");
+ final Entry entry = new Entry();
+ entry.setBuilders(asList("builder"));
+ final Entry childEntry = new Entry();
+ entry.addChild(childEntry);
+ RecursiveMenuStructureProcessor subtreeProcessor = recursiveMenuStructureBuilder.forChildren(entry, childEntry);
+ subtreeProcessor.build(childEntry);
+ verify(defaultBuilder).visit(childEntry);
+ }
+
+ @Test
+ public void explicitDestroyerIsCalled() {
+ final RecursiveMenuStructureProcessor recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ EntryVisitor destroyer = Mockito.mock(EntryVisitor.class);
+ recursiveMenuStructureBuilder.addBuilderPair("builder", null, destroyer);
+ final Entry entry = new Entry();
+ entry.setBuilders(asList("builder"));
+ recursiveMenuStructureBuilder.destroy(entry);
+ verify(destroyer).visit(entry);
+ }
+
+
+ @Test
+ public void processorWithoutBuilder_containsNoBuilder() {
+ final RecursiveMenuStructureProcessor recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ assertThat(recursiveMenuStructureBuilder.containsOneOf(Arrays.asList("builder")), equalTo(false));
+ }
+
+ @Test
+ public void processorWithBuilder_containsBuilder() {
+ final RecursiveMenuStructureProcessor recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ EntryVisitor builder = Mockito.mock(EntryVisitor.class);
+ recursiveMenuStructureBuilder.addBuilder("builder", builder);
+ assertThat(recursiveMenuStructureBuilder.containsOneOf(Arrays.asList("builder")), equalTo(true));
+ }
+
+
+ @Test
+ public void processorWithBuilder_containsOneOfBuilders() {
+ final RecursiveMenuStructureProcessor recursiveMenuStructureBuilder = new RecursiveMenuStructureProcessor();
+ EntryVisitor builder = Mockito.mock(EntryVisitor.class);
+ recursiveMenuStructureBuilder.addBuilder("builder", builder);
+ assertThat(recursiveMenuStructureBuilder.containsOneOf(Arrays.asList("builder", "builder2")), equalTo(true));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/SubtreeProcessorTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/SubtreeProcessorTest.java
new file mode 100644
index 0000000..60aad66
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/generic/SubtreeProcessorTest.java
@@ -0,0 +1,68 @@
+package org.freeplane.core.ui.menubuilders.generic;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.freeplane.core.ui.menubuilders.generic.SubtreeProcessor;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor;
+import org.freeplane.core.ui.menubuilders.generic.RecursiveMenuStructureProcessor;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+
+public class SubtreeProcessorTest {
+ @Test
+ public void doesNotBuildEntriesWithoutDelay() throws Exception {
+ final SubtreeProcessor childProcessor = new SubtreeProcessor();
+ final PhaseProcessor processor = mock(PhaseProcessor.class);
+ when(processor.forChildren(Mockito.<Entry> any(), Mockito.<Entry> any())).thenReturn(processor);
+ childProcessor.setProcessor(processor);
+ final Entry entry = new Entry();
+ final Entry child = new Entry();
+ entry.addChild(child);
+ childProcessor.childEntriesWillBecomeVisible(entry);
+ verify(processor, never()).build(child);
+ }
+
+ @Test
+ public void buildsEntriesWithDelay() throws Exception {
+ final SubtreeProcessor childProcessor = new SubtreeProcessor();
+ final PhaseProcessor processor = mock(PhaseProcessor.class);
+ when(processor.forChildren(Mockito.<Entry> any(), Mockito.<Entry> any())).thenReturn(processor);
+ childProcessor.setProcessor(processor);
+ final Entry entry = new Entry();
+ entry.setAttribute(RecursiveMenuStructureProcessor.PROCESS_ON_POPUP, true);
+ childProcessor.childEntriesWillBecomeVisible(entry);
+ verify(processor).buildChildren(entry);
+ }
+
+ @Test
+ public void doesNotDestroyEntriesWithoutDelay() throws Exception {
+ final SubtreeProcessor childProcessor = new SubtreeProcessor();
+ final PhaseProcessor processor = mock(PhaseProcessor.class);
+ when(processor.forChildren(Mockito.<Entry> any(), Mockito.<Entry> any())).thenReturn(processor);
+ childProcessor.setProcessor(processor);
+ final Entry entry = new Entry();
+ final Entry child = new Entry();
+ entry.addChild(child);
+ childProcessor.childEntriesHidden(entry);
+ verify(processor, never()).destroy(child);
+ }
+
+ @Test
+ public void destroysEntriesWithDelay() throws Exception {
+ final SubtreeProcessor childProcessor = new SubtreeProcessor();
+ final PhaseProcessor processor = mock(PhaseProcessor.class);
+ when(processor.forChildren(Mockito.<Entry> any(), Mockito.<Entry> any())).thenReturn(processor);
+ childProcessor.setProcessor(processor);
+ final Entry entry = new Entry();
+ entry.setAttribute(RecursiveMenuStructureProcessor.PROCESS_ON_POPUP, true);
+ final Entry child = new Entry();
+ entry.addChild(child);
+ childProcessor.childEntriesHidden(entry);
+ verify(processor).destroy(child);
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JComponentRemoverTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JComponentRemoverTest.java
new file mode 100644
index 0000000..d7abd00
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JComponentRemoverTest.java
@@ -0,0 +1,53 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.nullValue;
+
+import java.awt.Container;
+
+import javax.swing.JComponent;
+import javax.swing.JMenu;
+import javax.swing.JPanel;
+
+import org.freeplane.core.ui.MenuSplitter;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class JComponentRemoverTest {
+ @Test
+ public void removesComponentsFromParents() throws Exception {
+ final JComponentRemover componentRemover = new JComponentRemover();
+ final Entry entry = new Entry();
+ JComponent parent = new JPanel();
+ JComponent entryComponent = new JPanel();
+ parent.add(entryComponent);
+ new EntryAccessor().setComponent(entry, entryComponent);
+ componentRemover.visit(entry);
+
+ Assert.assertThat(entryComponent.getParent(), nullValue(Container.class));
+ }
+
+ @Test
+ public void ignoresEntriesWithoutComponents() throws Exception {
+ final JComponentRemover componentRemover = new JComponentRemover();
+ final Entry entry = new Entry();
+ componentRemover.visit(entry);
+ }
+
+ @Test
+ public void removesExtraSubmenusFromParents() throws Exception {
+ final JComponentRemover componentRemover = new JComponentRemover();
+ final Entry entry = new Entry();
+ JMenu parent = new JMenu();
+ JComponent entryComponent = new JMenu();
+ final MenuSplitter menuSplitter = new MenuSplitter(1);
+ menuSplitter.addMenuComponent(parent, new JMenu());
+ menuSplitter.addMenuComponent(parent, entryComponent);
+ new EntryAccessor().setComponent(entry, entryComponent);
+ componentRemover.visit(entry);
+ Assert.assertThat(parent.getPopupMenu().getComponentCount(), equalTo(1));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JMenuItemBuilderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JMenuItemBuilderTest.java
new file mode 100644
index 0000000..7ca3287
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JMenuItemBuilderTest.java
@@ -0,0 +1,248 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static java.util.Arrays.asList;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.awt.Container;
+
+import javax.swing.Action;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.AccelerateableAction;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.components.JAutoCheckBoxMenuItem;
+import org.freeplane.core.ui.menubuilders.action.AcceleratebleActionProvider;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryPopupListener;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+import org.hamcrest.CoreMatchers;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class JMenuItemBuilderTest {
+
+ private Entry actionEntry;
+ private AFreeplaneAction action;
+ private Entry menuEntry;
+ private JMenu menu;
+ private JMenuItemBuilder menuActionGroupBuilder;
+ private EntryPopupListener popupListener;
+ private Entry groupEntry;
+ private ResourceAccessor resourceAccessorMock;
+ private IAcceleratorMap accelerators;
+ private AcceleratebleActionProvider acceleratebleActionProvider;
+
+ private JMenuItem getFirstSubMenuItem(Entry entry) {
+ JMenu menu = (JMenu) new EntryAccessor().getComponent(entry);
+ final JMenuItem menuItem = (JMenuItem) menu.getPopupMenu().getComponent(0);
+ return menuItem;
+ }
+
+ @Before
+ public void setup() {
+ actionEntry = new Entry();
+ action = Mockito.mock(AFreeplaneAction.class);
+ actionEntry.setName("action");
+ when(action.getKey()).thenReturn("action");
+ when(action.getRawText()).thenReturn("action");
+ new EntryAccessor().setAction(actionEntry, action);
+
+ menuEntry = new Entry();
+ menuEntry.setName("menu");
+ groupEntry = new Entry();
+ menu = new JMenu();
+ popupListener = mock(EntryPopupListener.class);
+ resourceAccessorMock = mock(ResourceAccessor.class);
+ when(resourceAccessorMock.getRawText(anyString())).thenReturn("");
+ when(resourceAccessorMock.getRawText("menu")).thenReturn("menu");
+ accelerators = mock(IAcceleratorMap.class);
+ acceleratebleActionProvider = new AcceleratebleActionProvider() {
+ @Override
+ protected boolean isApplet() {
+ return false;
+ }
+ };
+ menuActionGroupBuilder = new JMenuItemBuilder(popupListener, accelerators, acceleratebleActionProvider,
+ resourceAccessorMock);
+ }
+
+ @Test
+ public void createsMenuButtonWithAction() {
+ new EntryAccessor().setComponent(menuEntry, menu);
+ menuEntry.addChild(actionEntry);
+ menuActionGroupBuilder.visit(actionEntry);
+
+ JMenuItem item = (JMenuItem)new EntryAccessor().getComponent(actionEntry);
+
+ assertThatMenuItemHasCorrectAction(item);
+ assertThat(item.getParent(), CoreMatchers.<Container>equalTo(menu.getPopupMenu()));
+ }
+
+ @Test
+ public void createsMenuButtonWithAcceleratedAction() {
+ final EntryAccessor entryAccessor = new EntryAccessor();
+ entryAccessor.setComponent(menuEntry, menu);
+ menuEntry.addChild(actionEntry);
+ final KeyStroke keyStroke = KeyStroke.getKeyStroke('A');
+ when(accelerators.getAccelerator(action)).thenReturn(keyStroke);
+ menuActionGroupBuilder.visit(actionEntry);
+ JMenuItem item = (JMenuItem) new EntryAccessor().getComponent(actionEntry);
+ Assert.assertThat(item.getAccelerator(), equalTo(keyStroke));
+ }
+
+ @Test
+ public void createsMenuItemWithSelectableAction() {
+ menuEntry.addChild(actionEntry);
+ when(action.isSelectable()).thenReturn(true);
+ new EntryAccessor().setComponent(menuEntry, menu);
+ menuActionGroupBuilder.visit(actionEntry);
+
+ JAutoCheckBoxMenuItem item = (JAutoCheckBoxMenuItem)new EntryAccessor().getComponent(actionEntry);
+
+ final AccelerateableAction itemAction = (AccelerateableAction) item.getAction();
+ assertThat(itemAction.getOriginalAction(), CoreMatchers.<Action> equalTo(action));
+ assertThat(item.getParent(), CoreMatchers.<Container>equalTo(menu.getPopupMenu()));
+ }
+
+ @Test
+ public void createsMenuSeparator() {
+ new EntryAccessor().setComponent(menuEntry, menu);
+ Entry separatorEntry = new Entry();
+ separatorEntry.setBuilders(asList("separator"));
+ menuEntry.addChild(separatorEntry);
+
+ menuActionGroupBuilder.visit(separatorEntry);
+
+ JPopupMenu.Separator separator = (JPopupMenu.Separator)new EntryAccessor().getComponent(separatorEntry);
+
+ assertThat(separator.getParent(), CoreMatchers.<Container>equalTo(menu.getPopupMenu()));
+ }
+
+ @Test
+ public void createsSubmenuWithoutAction() {
+ Entry parentMenuEntry = new Entry();
+ final JMenu parentMenu = new JMenu();
+ new EntryAccessor().setComponent(parentMenuEntry, parentMenu);
+ parentMenuEntry.addChild(menuEntry);
+ menuEntry.addChild(actionEntry);
+
+ menuActionGroupBuilder.visit(menuEntry);
+
+ JMenu item = (JMenu)new EntryAccessor().getComponent(menuEntry);
+ assertThat(item.getParent(), CoreMatchers.<Container>equalTo(parentMenu.getPopupMenu()));
+ }
+
+ @Test
+ public void createsMainMenuWithoutAction() {
+ Entry parentMenuEntry = new Entry();
+ final FreeplaneMenuBar parentMenu = TestMenuBarFactory.createFreeplaneMenuBar();
+ new EntryAccessor().setComponent(parentMenuEntry, parentMenu);
+ parentMenuEntry.addChild(menuEntry);
+ menuEntry.addChild(actionEntry);
+
+ menuActionGroupBuilder.visit(menuEntry);
+
+ JMenu item = (JMenu)new EntryAccessor().getComponent(menuEntry);
+ assertThat(item.getParent(), CoreMatchers.<Container>equalTo(parentMenu));
+ }
+
+ @Test
+ public void createsSubmenuWithAction() {
+
+ Entry parentMenuEntry = new Entry();
+ final JMenu parentMenu = new JMenu();
+ new EntryAccessor().setComponent(parentMenuEntry, parentMenu);
+ parentMenuEntry.addChild(menuEntry);
+ menuEntry.addChild(actionEntry);
+ new EntryAccessor().setAction(menuEntry, action);
+
+ menuActionGroupBuilder.visit(menuEntry);
+
+ final JMenuItem menuItem = getFirstSubMenuItem(menuEntry);
+ assertThatMenuItemHasCorrectAction(menuItem);
+ }
+
+ @Test
+ public void createsGroupWithAction() {
+ Entry parentMenuEntry = new Entry();
+ final JMenu parentMenu = new JMenu();
+ new EntryAccessor().setComponent(parentMenuEntry, parentMenu);
+ parentMenuEntry.addChild(groupEntry);
+ groupEntry.addChild(actionEntry);
+ new EntryAccessor().setAction(groupEntry, action);
+ menuActionGroupBuilder.visit(groupEntry);
+ final JMenuItem menuItem = getFirstSubMenuItem(groupEntry);
+ assertThatMenuItemHasCorrectAction(menuItem);
+ }
+
+ private void assertThatMenuItemHasCorrectAction(final JMenuItem menuItem) {
+ final AccelerateableAction itemAction = (AccelerateableAction) menuItem.getAction();
+ assertThat(itemAction.getOriginalAction(), CoreMatchers.<Action> equalTo(action));
+ }
+
+ @Test
+ public void whenPopupMenuBecomesVisible_itsOwnPopupListenerIsCalled() {
+ menuEntry.addChild(actionEntry);
+
+ menuActionGroupBuilder.visit(menuEntry);
+
+ JMenu item = (JMenu)new EntryAccessor().getComponent(menuEntry);
+ item.getPopupMenu().setVisible(true);
+ verify(popupListener).childEntriesWillBecomeVisible(menuEntry);
+ }
+
+
+ @Test
+ public void whenPopupMenuBecomesVisible_itsChildActionPopupListenerIsCalled() {
+ menuEntry.addChild(actionEntry);
+ menuActionGroupBuilder.visit(menuEntry);
+ JMenu item = (JMenu) new EntryAccessor().getComponent(menuEntry);
+ item.getPopupMenu().setVisible(true);
+ verify(popupListener).childEntriesWillBecomeVisible(actionEntry);
+ }
+
+ @Test
+ public void whenNoPopupMenuBecomesVisible_PopupListenerIsNotCalled() {
+ menuActionGroupBuilder.visit(menuEntry);
+ verify(popupListener, never()).childEntriesWillBecomeVisible(Mockito.<Entry> anyObject());
+ }
+
+ @Test
+ public void whenPopupMenuBecomesVisible_itsChildGroupPopupListenerIsCalled() {
+ menuEntry.addChild(groupEntry);
+ menuActionGroupBuilder.visit(menuEntry);
+ JMenu menu = (JMenu) new EntryAccessor().getComponent(menuEntry);
+ menu.getPopupMenu().setVisible(true);
+ verify(popupListener).childEntriesWillBecomeVisible(groupEntry);
+ }
+
+ @Test
+ public void whenPopupMenuBecomesInvisible_popupListenerIsCalled() {
+ Entry parentMenuEntry = new Entry();
+ final JMenu parentMenu = new JMenu();
+ new EntryAccessor().setComponent(parentMenuEntry, parentMenu);
+ parentMenuEntry.addChild(menuEntry);
+ menuEntry.addChild(actionEntry);
+
+ menuActionGroupBuilder.visit(menuEntry);
+
+ JMenu item = (JMenu)new EntryAccessor().getComponent(menuEntry);
+ item.getPopupMenu().setVisible(true);
+ item.getPopupMenu().setVisible(false);
+ verify(popupListener).childEntriesHidden(menuEntry);
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JMenuRadioGroupBuilderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JMenuRadioGroupBuilderTest.java
new file mode 100644
index 0000000..6abfa95
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JMenuRadioGroupBuilderTest.java
@@ -0,0 +1,62 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import javax.swing.JMenu;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.action.AcceleratebleActionProvider;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryPopupListener;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class JMenuRadioGroupBuilderTest {
+ private Entry actionEntry;
+ private AFreeplaneAction action;
+ private Entry menuEntry;
+ private Entry groupEntry;
+ private JMenu menu;
+ private EntryPopupListener popupListener;
+ private ResourceAccessor resourceAccessorMock;
+ private IAcceleratorMap accelerators;
+ private AcceleratebleActionProvider acceleratebleActionProvider;
+ private JMenuRadioGroupBuilder radioGroupBuilder;
+
+ @Before
+ public void setup() {
+ actionEntry = new Entry();
+ action = Mockito.mock(AFreeplaneAction.class);
+ actionEntry.setName("action");
+ new EntryAccessor().setAction(actionEntry, action);
+ menuEntry = new Entry();
+ menuEntry.setName("menu");
+ groupEntry = new Entry();
+ menu = new JMenu();
+ popupListener = mock(EntryPopupListener.class);
+ resourceAccessorMock = mock(ResourceAccessor.class);
+ when(resourceAccessorMock.getRawText(anyString())).thenReturn("");
+ when(resourceAccessorMock.getRawText("menu")).thenReturn("menu");
+ accelerators = mock(IAcceleratorMap.class);
+ acceleratebleActionProvider = new AcceleratebleActionProvider() {
+ @Override
+ protected boolean isApplet() {
+ return false;
+ }
+ };
+ radioGroupBuilder = new JMenuRadioGroupBuilder(popupListener, accelerators, acceleratebleActionProvider,
+ resourceAccessorMock);
+ }
+ @Test
+ public void buildsWholeSubtree() throws Exception {
+ Assert.assertThat(radioGroupBuilder.shouldSkipChildren(null), equalTo(true));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JMenubarBuilderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JMenubarBuilderTest.java
new file mode 100644
index 0000000..c61ddce
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JMenubarBuilderTest.java
@@ -0,0 +1,28 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.hamcrest.CoreMatchers;
+import org.junit.Test;
+
+public class JMenubarBuilderTest {
+
+
+ @Test
+ public void createsEmptyToolbarComponent() {
+ Entry toolbarEntry = new Entry();
+ final IUserInputListenerFactory userInputListenerFactory = mock(IUserInputListenerFactory.class);
+ final FreeplaneMenuBar menubar = TestMenuBarFactory.createFreeplaneMenuBar();
+ when(userInputListenerFactory.getMenuBar()).thenReturn(menubar);
+ final JMenubarBuilder toolbarBuilder = new JMenubarBuilder(userInputListenerFactory);
+ toolbarBuilder.visit(toolbarEntry);
+
+ assertThat(new EntryAccessor().getComponent(toolbarEntry), CoreMatchers.<Object> is(menubar));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JToolbarBuilderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JToolbarBuilderTest.java
new file mode 100644
index 0000000..ca73adf
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JToolbarBuilderTest.java
@@ -0,0 +1,30 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import javax.swing.JToolBar;
+
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.hamcrest.CoreMatchers;
+import org.junit.Test;
+
+public class JToolbarBuilderTest {
+
+
+ @Test
+ public void createsEmptyToolbarComponent() {
+ Entry toolbarEntry = new Entry();
+
+ final IUserInputListenerFactory userInputListenerFactory = mock(IUserInputListenerFactory.class);
+ JToolBar toolbar = new JToolBar();
+ when(userInputListenerFactory.getToolBar("/main_toolbar")).thenReturn(toolbar);
+ final JToolbarBuilder toolbarBuilder = new JToolbarBuilder(userInputListenerFactory);
+ toolbarBuilder.visit(toolbarEntry);
+
+ assertThat(new EntryAccessor().getComponent(toolbarEntry), CoreMatchers.<Object>is(toolbar));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JToolbarComponentBuilderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JToolbarComponentBuilderTest.java
new file mode 100644
index 0000000..af8aed3
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/JToolbarComponentBuilderTest.java
@@ -0,0 +1,84 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.when;
+
+import java.awt.Container;
+
+import javax.swing.Action;
+import javax.swing.JButton;
+import javax.swing.JToolBar;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.components.FreeplaneToolBar;
+import org.freeplane.core.ui.components.JAutoToggleButton;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.menu.JToolbarComponentBuilder;
+import org.hamcrest.CoreMatchers;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class JToolbarComponentBuilderTest {
+ @Test
+ public void createsToolbarButtonWithAction() {
+ Entry actionEntry = new Entry();
+ final AFreeplaneAction action = Mockito.mock(AFreeplaneAction.class);
+ new EntryAccessor().setAction(actionEntry, action);
+
+ Entry toolbarEntry = new Entry();
+ final FreeplaneToolBar toolbar = new FreeplaneToolBar("toolbar", SwingConstants.HORIZONTAL);
+ new EntryAccessor().setComponent(toolbarEntry, toolbar);
+ toolbarEntry.addChild(actionEntry);
+
+ final JToolbarComponentBuilder toolbarActionGroupBuilder = new JToolbarComponentBuilder();
+ toolbarActionGroupBuilder.visit(actionEntry);
+
+ JButton button = (JButton)new EntryAccessor().getComponent(actionEntry);
+
+ assertThat(button.getAction(), CoreMatchers.<Action>equalTo(action));
+ assertThat(button.getParent(), CoreMatchers.equalTo((Container)toolbar));
+ }
+
+ @Test
+ public void createsToolbarButtonWithSelectableAction() {
+ Entry actionEntry = new Entry();
+ final AFreeplaneAction action = Mockito.mock(AFreeplaneAction.class);
+ when(action.isSelectable()).thenReturn(true);
+ new EntryAccessor().setAction(actionEntry, action);
+
+ Entry toolbarEntry = new Entry();
+ final FreeplaneToolBar toolbar = new FreeplaneToolBar("toolbar", SwingConstants.HORIZONTAL);
+ new EntryAccessor().setComponent(toolbarEntry, toolbar);
+ toolbarEntry.addChild(actionEntry);
+
+ final JToolbarComponentBuilder toolbarActionGroupBuilder = new JToolbarComponentBuilder();
+ toolbarActionGroupBuilder.visit(actionEntry);
+
+ JAutoToggleButton button = (JAutoToggleButton)new EntryAccessor().getComponent(actionEntry);
+
+ assertThat(button.getAction(), CoreMatchers.<Action>equalTo(action));
+ assertThat(button.getParent(), CoreMatchers.equalTo((Container)toolbar));
+ }
+
+ @Test
+ public void createsVerticalToolbarSeparator() {
+ Entry separatorEntry = new Entry();
+ separatorEntry.setBuilders(asList("separator"));
+
+ Entry toolbarEntry = new Entry();
+ final FreeplaneToolBar toolbar = new FreeplaneToolBar("toolbar", SwingConstants.HORIZONTAL);
+ new EntryAccessor().setComponent(toolbarEntry, toolbar);
+ toolbarEntry.addChild(separatorEntry);
+
+ final JToolbarComponentBuilder toolbarActionGroupBuilder = new JToolbarComponentBuilder();
+ toolbarActionGroupBuilder.visit(separatorEntry);
+
+ JToolBar.Separator separator = (JToolBar.Separator)new EntryAccessor().getComponent(separatorEntry);
+
+ assertThat(separator.getParent(), CoreMatchers.equalTo((Container)toolbar));
+ assertThat(separator.getOrientation(), CoreMatchers.equalTo(SwingConstants.VERTICAL));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/MenuAcceleratorChangeListenerTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/MenuAcceleratorChangeListenerTest.java
new file mode 100644
index 0000000..5c74bea
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/MenuAcceleratorChangeListenerTest.java
@@ -0,0 +1,33 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.mockito.Mockito.mock;
+
+import java.awt.event.KeyEvent;
+
+import javax.swing.JMenuItem;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.action.EntriesForAction;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MenuAcceleratorChangeListenerTest {
+ @Test
+ public void setsKeystroke() throws Exception {
+ final EntriesForAction entriesForAction = new EntriesForAction();
+ final MenuAcceleratorChangeListener menuAcceleratorChangeListener = new MenuAcceleratorChangeListener(entriesForAction);
+ final AFreeplaneAction action = mock(AFreeplaneAction.class);
+ Entry actionEntry = new Entry();
+ final JMenuItem menu = new JMenuItem();
+ new EntryAccessor().setComponent(actionEntry, menu);
+ entriesForAction.registerEntry(action, actionEntry);
+
+ final KeyStroke keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, 0);
+ menuAcceleratorChangeListener.acceleratorChanged(action, null, keyStroke);
+ Assert.assertThat(menu.getAccelerator(), equalTo(keyStroke));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/MenuBuildProcessFactoryTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/MenuBuildProcessFactoryTest.java
new file mode 100644
index 0000000..4d9703c
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/MenuBuildProcessFactoryTest.java
@@ -0,0 +1,75 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.Collections;
+
+import javax.swing.JMenu;
+
+import org.freeplane.core.ui.IUserInputListenerFactory;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+import org.freeplane.core.ui.menubuilders.XmlEntryStructureBuilder;
+import org.freeplane.core.ui.menubuilders.action.EntriesForAction;
+import org.freeplane.core.ui.menubuilders.action.IAcceleratorMap;
+import org.freeplane.core.ui.menubuilders.generic.BuildPhaseListener;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor;
+import org.freeplane.core.ui.menubuilders.generic.ResourceAccessor;
+import org.freeplane.features.mode.FreeplaneActions;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Matchers;
+
+
+public class MenuBuildProcessFactoryTest {
+ private PhaseProcessor phaseProcessor;
+ private FreeplaneActions freeplaneActions;
+
+ @Before
+ public void setup() {
+ freeplaneActions = mock(FreeplaneActions.class);
+ final ResourceAccessor resourceAccessorMock = mock(ResourceAccessor.class);
+ when(resourceAccessorMock.getRawText(Matchers.anyString())).thenReturn("text");
+ final IUserInputListenerFactory userInputListenerFactory = mock(IUserInputListenerFactory.class);
+ final FreeplaneMenuBar menubar = TestMenuBarFactory.createFreeplaneMenuBar();
+ when(userInputListenerFactory.getMenuBar()).thenReturn(menubar);
+ phaseProcessor = new MenuBuildProcessFactory(userInputListenerFactory, freeplaneActions,
+ resourceAccessorMock, mock(IAcceleratorMap.class), new EntriesForAction(), Collections.<BuildPhaseListener>emptyList()).getBuildProcessor();
+ }
+
+ @Test
+ public void ifProcessOnPopupIsSet_delayesActionProcessing() throws Exception {
+ final Entry menuStructure = XmlEntryStructureBuilder.buildMenuStructure(
+ "<Entry builder='main_menu'>"
+ + "<Entry name='submenu'>"
+ + "<Entry name='submenu' processOnPopup='true'>"
+ + "<Entry name='action'/>"
+ + "</Entry>"
+ + "</Entry>"
+ + "</Entry>");
+ phaseProcessor.build(menuStructure);
+ verify(freeplaneActions, never()).getAction("action");
+ }
+
+ @Test
+ public void ifProcessOnPopupIsSet_buildsWhenItBecomesVisible() throws Exception {
+ final Entry menuStructure = XmlEntryStructureBuilder.buildMenuStructure(
+ "<Entry builder='main_menu'>"
+ + "<Entry name='submenu'>"
+ + "<Entry name='submenu' processOnPopup='true'>"
+ + "<Entry name='action'/>"
+ + "</Entry>"
+ + "</Entry>"
+ + "</Entry>");
+ phaseProcessor.build(menuStructure);
+ final Entry openedEntry = menuStructure.getChild(0,0,0);
+ JMenu menu = (JMenu) new EntryAccessor().getComponent(openedEntry);
+ menu.getPopupMenu().setVisible(true);
+ verify(freeplaneActions).getAction("action");
+ }
+
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/TestMenuBarFactory.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/TestMenuBarFactory.java
new file mode 100644
index 0000000..511872d
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/TestMenuBarFactory.java
@@ -0,0 +1,22 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import java.awt.event.KeyEvent;
+
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.IKeyStrokeProcessor;
+import org.freeplane.core.ui.components.FreeplaneMenuBar;
+
+public class TestMenuBarFactory {
+
+ public static FreeplaneMenuBar createFreeplaneMenuBar() {
+ return new FreeplaneMenuBar(new IKeyStrokeProcessor() {
+
+ @Override
+ public boolean processKeyBinding(KeyStroke ks, KeyEvent e) {
+ return false;
+ }
+ });
+ }
+
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/ToolbarComponentProviderTest.java b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/ToolbarComponentProviderTest.java
new file mode 100644
index 0000000..ba20901
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/ui/menubuilders/menu/ToolbarComponentProviderTest.java
@@ -0,0 +1,22 @@
+package org.freeplane.core.ui.menubuilders.menu;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+
+import javax.swing.JPanel;
+
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ToolbarComponentProviderTest {
+ @Test
+ public void testName() throws Exception {
+ final ToolbarComponentProvider toolbarComponentProvider = new ToolbarComponentProvider();
+ final Entry entry = new Entry();
+ final EntryAccessor entryAccessor = new EntryAccessor();
+ final Object testComponent = new JPanel();
+ entryAccessor.setComponent(entry, testComponent);
+ Assert.assertThat(toolbarComponentProvider.createComponent(entry), equalTo(testComponent));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/util/ConstantObjectShould.java b/freeplane/src/test/java/org/freeplane/core/util/ConstantObjectShould.java
new file mode 100644
index 0000000..c86e3b6
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/util/ConstantObjectShould.java
@@ -0,0 +1,30 @@
+package org.freeplane.core.util;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.freeplane.core.util.ConstantObject;
+import org.freeplane.core.util.ObjectRule;
+import org.junit.Test;
+
+public class ConstantObjectShould {
+ enum Rules {RULE}
+ @Test
+ public void returnItsObject() throws Exception {
+ ObjectRule <String, Rules> objectReference = new ConstantObject<String, Rules>("string");
+ assertThat(objectReference.getValue(), equalTo("string"));
+ }
+
+ @Test
+ public void containItsObject() throws Exception {
+ ObjectRule <String, Rules> objectReference = new ConstantObject<String, Rules>("string");
+ assertThat(objectReference.hasValue(), equalTo(true));
+ }
+
+ @Test
+ public void ignoreReset() throws Exception {
+ ObjectRule <String, Rules> objectReference = new ConstantObject<String, Rules>("string");
+ objectReference.resetCache();
+ assertThat(objectReference.hasValue(), equalTo(true));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/util/QuantityShould.java b/freeplane/src/test/java/org/freeplane/core/util/QuantityShould.java
new file mode 100644
index 0000000..579898b
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/util/QuantityShould.java
@@ -0,0 +1,120 @@
+package org.freeplane.core.util;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class QuantityShould {
+
+ enum Metrics implements Convertible{
+ m(1d), cm(0.01d);
+
+ Metrics(double factor){
+ this.factor = factor;
+ }
+
+ final private double factor;
+ @Override
+ public double factor() {
+ return factor;
+ }
+ }
+
+ @Test
+ public void calculateValueInBaseUnits() throws Exception {
+ Quantity<Metrics> quantity = new Quantity<Metrics>(1, Metrics.cm);
+ assertThat(quantity.toBaseUnits(), equalTo(0.01));
+ }
+
+
+ @Test
+ public void returnNumericValue() throws Exception {
+ Quantity<Metrics> quantity = new Quantity<Metrics>(1, Metrics.cm);
+ assertThat(quantity.value, equalTo(1d));
+ }
+
+
+ @Test
+ public void returnUnit() throws Exception {
+ Quantity<Metrics> quantity = new Quantity<Metrics>(1, Metrics.cm);
+ assertThat(quantity.unit, equalTo(Metrics.cm));
+ }
+
+
+ @Test
+ public void calculateRoundedDownValueInBaseUnits() throws Exception {
+ Quantity<Metrics> quantity = new Quantity<Metrics>(49, Metrics.cm);
+ assertThat(quantity.toBaseUnitsRounded(), equalTo(0));
+ }
+
+
+ @Test
+ public void calculateRoundedUpValueInBaseUnits() throws Exception {
+ Quantity<Metrics> quantity = new Quantity<Metrics>(51, Metrics.cm);
+ assertThat(quantity.toBaseUnitsRounded(), equalTo(1));
+ }
+
+ @Test
+ public void convertToString() throws Exception {
+ Quantity<Metrics> quantity = new Quantity<Metrics>(51, Metrics.cm);
+ assertEquals("51.0 cm", quantity.toString());
+ }
+
+ @Test
+ public void fromNullString() throws Exception {
+ Quantity<Metrics> quantity = Quantity.fromString(null, Metrics.cm);
+ assertNull(quantity);
+ }
+
+ @Test
+ public void fromString_0_cm() throws Exception {
+ Quantity<Metrics> quantity = Quantity.fromString("0 cm", Metrics.cm);
+ assertEquals("0.0 cm", quantity.toString());
+ }
+
+ @Test
+ public void fromString_1_cm() throws Exception {
+ Quantity<Metrics> quantity = Quantity.fromString("1 cm", Metrics.cm);
+ assertEquals("1.0 cm", quantity.toString());
+ }
+
+ @Test
+ public void fromString_2_m() throws Exception {
+ Quantity<Metrics> quantity = Quantity.fromString("1 m", Metrics.cm);
+ assertEquals("1.0 m", quantity.toString());
+ }
+
+ @Test
+ public void useDefaultUnit_fromString_1() throws Exception {
+ Quantity<Metrics> quantity = Quantity.fromString("1", Metrics.cm);
+ assertEquals("1.0 cm", quantity.toString());
+ }
+
+ @Test
+ public void convertUnits() throws Exception {
+ Quantity<Metrics> quantityInMeters = new Quantity<Metrics>(1, Metrics.m);
+ Quantity<Metrics> quantityInCm = quantityInMeters.in(Metrics.cm);
+ assertThat(quantityInCm, equalTo(new Quantity<Metrics>(100, Metrics.cm)));
+ }
+
+ @Test
+ public void addQuantitiesInSameUnits() throws Exception {
+ Quantity<Metrics> first = new Quantity<Metrics>(1, Metrics.m);
+ Quantity<Metrics> second = new Quantity<Metrics>(2, Metrics.m);
+ assertThat(first.add(second), equalTo(new Quantity<Metrics>(3, Metrics.m)));
+ }
+
+ @Test
+ public void addQuantitiesInDifferentUnits() throws Exception {
+ Quantity<Metrics> first = new Quantity<Metrics>(100, Metrics.cm);
+ Quantity<Metrics> second = new Quantity<Metrics>(2, Metrics.m);
+ assertThat(first.add(second), equalTo(new Quantity<Metrics>(300, Metrics.cm)));
+ }
+
+ @Test
+ public void addQuantitiesGivenAsPrimitives() throws Exception {
+ Quantity<Metrics> first = new Quantity<Metrics>(100, Metrics.cm);
+ assertThat(first.add(2, Metrics.m), equalTo(new Quantity<Metrics>(300, Metrics.cm)));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/core/util/RuleReferenceShould.java b/freeplane/src/test/java/org/freeplane/core/util/RuleReferenceShould.java
new file mode 100644
index 0000000..1c988ce
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/core/util/RuleReferenceShould.java
@@ -0,0 +1,54 @@
+package org.freeplane.core.util;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.freeplane.core.util.ObjectRule;
+import org.freeplane.core.util.RuleReference;
+import org.junit.Test;
+
+public class RuleReferenceShould {
+ enum Rules {RULE}
+ @Test
+ public void returnRule() throws Exception {
+ ObjectRule <String, Rules> objectReference = new RuleReference<String, Rules>(Rules.RULE);
+ assertThat(objectReference.getRule(), equalTo(Rules.RULE));
+ }
+
+ @Test
+ public void containsNoObjectAfterInitialization() throws Exception {
+ ObjectRule <String, Rules> objectReference = new RuleReference<String, Rules>(Rules.RULE);
+ assertThat(objectReference.hasValue(), equalTo(false));
+ }
+
+
+ @Test
+ public void returnSetObject() throws Exception {
+ ObjectRule <String, Rules> objectReference = new RuleReference<String, Rules>(Rules.RULE);
+ objectReference.setCache("string");
+ assertThat(objectReference.getValue(), equalTo("string"));
+ }
+
+ @Test
+ public void containObjectAfterItIsSet() throws Exception {
+ ObjectRule <String, Rules> objectReference = new RuleReference<String, Rules>(Rules.RULE);
+ objectReference.setCache("string");
+ assertThat(objectReference.hasValue(), equalTo(true));
+ }
+
+ @Test
+ public void removeValueAfterReset() throws Exception {
+ ObjectRule <String, Rules> objectReference = new RuleReference<String, Rules>(Rules.RULE);
+ objectReference.setCache("string");
+ objectReference.resetCache();
+ assertThat(objectReference.hasValue(), equalTo(false));
+ }
+
+//
+// @Test
+// public void ignoreReset() throws Exception {
+// ObjectReference <String, Rules> objectReference = new RuleReference<String, Rules>(Rules.RULE);
+// objectReference.reset();
+// assertThat(objectReference.hasValue(), equalTo(true));
+// }
+}
diff --git a/freeplane/src/test/java/org/freeplane/features/map/ClonesTest.java b/freeplane/src/test/java/org/freeplane/features/map/ClonesTest.java
new file mode 100644
index 0000000..53e153a
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/features/map/ClonesTest.java
@@ -0,0 +1,132 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import static org.freeplane.features.map.NodeModel.CloneType.TREE;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.not;
+import static org.junit.Assert.assertThat;
+
+import org.hamcrest.collection.IsEmptyIterable;
+import org.junit.Test;
+
+/**
+ * @author Dimitry Polivaev
+ * 16.02.2014
+ */
+public class ClonesTest {
+ MapModel map = null;
+
+ private NodeModel root() {
+ final NodeModel parent = new NodeModel("parent", map);
+ parent.setClones(new SingleNodeList(parent, TREE));
+ return parent;
+ }
+
+ @Test
+ public void clonesContainsNothingBeforeAddingToTree() {
+ final NodeModel node = new NodeModel("node", map);
+ assertThat(node.subtreeClones(), IsEmptyIterable.<NodeModel>emptyIterable());
+
+ }
+
+ @Test
+ public void clonesContainsNodeNothingAfterAddingToDetachedParent() {
+ final NodeModel parent = new NodeModel("parent", map);
+ final NodeModel node = new NodeModel("node", map);
+ parent.insert(node);
+ assertThat(node.subtreeClones(), IsEmptyIterable.<NodeModel>emptyIterable());
+ }
+
+ @Test
+ public void clonesContainsNodeItselfAfterAddingToAttachedParent() {
+ final NodeModel parent = root();
+ final NodeModel node = new NodeModel("node", map);
+ parent.insert(node);
+ assertThat(node.subtreeClones(), contains(node));
+ }
+
+ @Test
+ public void clonesOfChildContainsNodeItselfAfterAddingToAttachedParent() {
+ final NodeModel parent = root();
+ final NodeModel node = new NodeModel("node", map);
+ final NodeModel child = new NodeModel("child", map);
+ node.insert(child);
+ parent.insert(node);
+ assertThat(child.subtreeClones(), contains(child));
+ }
+
+ @Test
+ public void clonesContainsNodeNothingAfterRemovingFromParent() {
+ final NodeModel parent = root();
+ final NodeModel node = new NodeModel("node", map);
+ parent.insert(node);
+ parent.remove(parent.getIndex(node));
+ assertThat(node.subtreeClones(), IsEmptyIterable.<NodeModel>emptyIterable());
+ }
+
+ @Test
+ public void clonesOfChildContainsNothingAfterRemovingFromParent() {
+ final NodeModel parent = root();
+ final NodeModel node = new NodeModel("node", map);
+ parent.insert(node);
+ final NodeModel child = new NodeModel("child", map);
+ node.insert(child);
+ parent.remove(parent.getIndex(node));
+ assertThat(child.subtreeClones(), IsEmptyIterable.<NodeModel>emptyIterable());
+ }
+
+ @Test
+ public void multipleClonesAfterAddingToAttachedParent() {
+ final NodeModel parent = root();
+ final NodeModel node = new NodeModel("node", map);
+ parent.insert(node);
+ final NodeModel clone = node.cloneTree();
+ parent.insert(clone);
+ assertThat(node.subtreeClones(), contains(node, clone));
+ assertThat(node.allClones(), contains(node, clone));
+ }
+
+ @Test
+ public void removedClone() {
+ final NodeModel parent = root();
+ final NodeModel node = new NodeModel("node", map);
+ parent.insert(node);
+ final NodeModel clone = node.cloneTree();
+ parent.insert(clone);
+ parent.remove(parent.getIndex(clone));
+ assertThat(node.subtreeClones(), contains(node));
+ assertThat(node.allClones(), not(contains(clone)));
+ }
+ @Test
+ public void subtreeContainsClone() {
+ final NodeModel parent = root();
+ final NodeModel node = new NodeModel("node", map);
+ parent.insert(node);
+ final NodeModel clone = node.cloneTree();
+ parent.insert(clone);
+ final NodeModel child = new NodeModel("child", map);
+ node.insert(child);
+ clone.insert(child.cloneTree());
+ assertThat(clone.subtreeContainsCloneOf(child), is(true));
+ }
+
+}
diff --git a/freeplane/src/test/java/org/freeplane/features/map/MapFake.java b/freeplane/src/test/java/org/freeplane/features/map/MapFake.java
new file mode 100644
index 0000000..d19ced8
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/features/map/MapFake.java
@@ -0,0 +1,75 @@
+package org.freeplane.features.map;
+
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.mockito.Mockito;
+
+public class MapFake {
+ final private NodeModel root;
+ final private MapModel map;
+
+
+ public MapFake() {
+ super();
+ map = Mockito.mock(MapModel.class);
+ this.root = createNode("root");
+ Mockito.when(map.getRootNode()).thenReturn(root);
+ }
+
+
+ public NodeModel addSummaryNode() {
+ final NodeModel summaryNode = createSummaryNode();
+ root.insert(summaryNode);
+ return summaryNode;
+ }
+
+
+ public NodeModel createSummaryNode() {
+ final NodeModel summaryNode = createNode();
+ summaryNode.addExtension(SummaryNodeFlag.SUMMARY);
+ return summaryNode;
+ }
+
+
+ public NodeModel createNode(String string) {
+ final NodeModel node = createNode();
+ node.setText(string);
+ return node;
+ }
+
+ private NodeModel createNode() {
+ return new NodeModel(map);
+ }
+ public NodeModel addNode(String text) {
+ final NodeModel summarized = createNode(text);
+ root.insert(summarized);
+ return summarized;
+ }
+
+ public NodeModel addGroupBeginNode() {
+ final NodeModel firstEdge = createGroupBeginNode();
+ root.insert(firstEdge);
+ return firstEdge;
+ }
+
+
+ public NodeModel createGroupBeginNode() {
+ final NodeModel firstEdge = createNode();
+ firstEdge.addExtension(FirstGroupNodeFlag.FIRST_GROUP);
+ return firstEdge;
+ }
+
+
+ public NodeModel getRoot() {
+ return root;
+ }
+
+
+ public NodeModel addSummaryGroupBeginNode() {
+ final NodeModel summaryNode = addSummaryNode();
+ summaryNode.addExtension(FirstGroupNodeFlag.FIRST_GROUP);
+ return summaryNode;
+
+ }
+
+}
diff --git a/freeplane/src/test/java/org/freeplane/features/map/NodeRelativePathTest.java b/freeplane/src/test/java/org/freeplane/features/map/NodeRelativePathTest.java
new file mode 100644
index 0000000..4839374
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/features/map/NodeRelativePathTest.java
@@ -0,0 +1,137 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2014 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.features.map;
+
+import static org.freeplane.features.map.NodeModel.CloneType.TREE;
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * @author Dimitry Polivaev
+ * 22.03.2014
+ */
+public class NodeRelativePathTest {
+ MapModel map = null;
+
+ private NodeModel root() {
+ final NodeModel parent = new NodeModel("parent", map);
+ parent.setClones(new SingleNodeList(parent, TREE));
+ return parent;
+ }
+
+ @Test
+ public void zeroLevelAncestor(){
+ final NodeModel parent = root();
+ NodeModel commonAncestor = new NodeRelativePath(parent, parent).commonAncestor();
+ assertThat(commonAncestor, equalTo(parent));
+ }
+
+ @Test
+ public void zeroLevelAncestorPahLength(){
+ final NodeModel parent = root();
+ final NodeRelativePath nodeRelativePath = new NodeRelativePath(parent, parent);
+ assertThat(nodeRelativePath.getPathLength(), equalTo(0));
+ }
+
+ @Test
+ public void zeroLevelBegin(){
+ final NodeModel parent = root();
+ final NodeRelativePath nodeRelativePath = new NodeRelativePath(parent, parent);
+ final NodeModel startingPoint = new NodeModel("startingPoint", map);
+ assertThat(nodeRelativePath.pathBegin(startingPoint), equalTo(startingPoint));
+ }
+
+ @Test
+ public void childLevelBegin(){
+ final NodeModel parent = root();
+ final NodeModel node = new NodeModel("node", map);
+ parent.insert(node);
+ final NodeRelativePath nodeRelativePath = new NodeRelativePath(node, parent);
+ final NodeModel startingPoint = new NodeModel("startingPoint", map);
+ final NodeModel child = new NodeModel("child", map);
+ startingPoint.insert(child);
+ assertThat(nodeRelativePath.pathBegin(startingPoint), equalTo(child));
+ }
+ @Test
+ public void zeroLevelEnd(){
+ final NodeModel parent = root();
+ final NodeRelativePath nodeRelativePath = new NodeRelativePath(parent, parent);
+ final NodeModel startingPoint = new NodeModel("startingPoint", map);
+ assertThat(nodeRelativePath.pathEnd(startingPoint), equalTo(startingPoint));
+ }
+
+ @Test
+ public void oneLevelAncestor(){
+ final NodeModel parent = root();
+ final NodeModel node1 = new NodeModel("node1", map);
+ parent.insert(node1);
+ final NodeModel node2 = new NodeModel("node2", map);
+ parent.insert(node2);
+ NodeModel commonAncestor = new NodeRelativePath(node1, node2).commonAncestor();
+ assertThat(commonAncestor, equalTo(parent));
+ }
+
+ @Test
+ public void oneLevelAncestorPathLength(){
+ final NodeModel parent = root();
+ final NodeModel node1 = new NodeModel("node1", map);
+ parent.insert(node1);
+ final NodeModel node2 = new NodeModel("node2", map);
+ parent.insert(node2);
+ final NodeRelativePath nodeRelativePath = new NodeRelativePath(node1, node2);
+ assertThat(nodeRelativePath.getPathLength(), equalTo(2));
+ }
+
+ @Test
+ public void equalPaths(){
+ final NodeModel parent = root();
+ final NodeModel node1 = new NodeModel("node1", map);
+ parent.insert(node1);
+ final NodeModel node2 = new NodeModel("node2", map);
+ parent.insert(node2);
+ final NodeRelativePath nodeRelativePath1 = new NodeRelativePath(node1, node2);
+ final NodeRelativePath nodeRelativePath2 = new NodeRelativePath(node1, node2);
+ assertTrue(nodeRelativePath1.equalPathsTo(nodeRelativePath2));
+ }
+
+ @Test
+ public void beginPathElement(){
+ final NodeModel parent = root();
+ final NodeModel node1 = new NodeModel("node1", map);
+ parent.insert(node1);
+ final NodeModel node2 = new NodeModel("node2", map);
+ parent.insert(node2);
+ final NodeRelativePath nodeRelativePath = new NodeRelativePath(node1, node2);
+ assertThat(nodeRelativePath.beginPathElement(1), equalTo(node1));
+ }
+ @Test
+ public void endPathElement(){
+ final NodeModel parent = root();
+ final NodeModel node1 = new NodeModel("node1", map);
+ parent.insert(node1);
+ final NodeModel node2 = new NodeModel("node2", map);
+ parent.insert(node2);
+ final NodeRelativePath nodeRelativePath = new NodeRelativePath(node1, node2);
+ assertThat(nodeRelativePath.endPathElement(1), equalTo(node2));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/features/map/SummaryLevelsShould.java b/freeplane/src/test/java/org/freeplane/features/map/SummaryLevelsShould.java
new file mode 100644
index 0000000..4a273bc
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/features/map/SummaryLevelsShould.java
@@ -0,0 +1,184 @@
+package org.freeplane.features.map;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class SummaryLevelsShould {
+ protected MapFake mapFake;
+ @Before
+ public void setup(){
+ mapFake = new MapFake();
+ }
+
+ public static class FindSummaryNodeIndex extends SummaryLevelsShould{
+
+ @Test
+ public void returnNull_IfSummaryNodeDoesNotExist() throws Exception {
+ mapFake.addNode("1");
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findSummaryNodeIndex(0), equalTo(-1));
+
+ }
+
+ @Test
+ public void returnSummaryNodeLevel1AfterItem() throws Exception {
+ mapFake.addNode("1");
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findSummaryNodeIndex(0), equalTo(summaryNode.getIndex()));
+
+ }
+ }
+ public static class FindSummaryNode extends SummaryLevelsShould{
+
+ @Test
+ public void returnNull_IfSummaryNodeDoesNotExist() throws Exception {
+ mapFake.addNode("1");
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findSummaryNode(0), equalTo((NodeModel)null));
+
+ }
+
+ @Test
+ public void returnSummaryNodeLevel1AfterItem() throws Exception {
+ mapFake.addNode("1");
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findSummaryNode(0), equalTo(summaryNode));
+
+ }
+
+ @Test
+ public void returnSummaryNodeLevel1AfterTwoItems() throws Exception {
+ mapFake.addNode("1");
+ mapFake.addNode("2");
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findSummaryNode(0), equalTo(summaryNode));
+ }
+ @Test
+ public void returnSummaryOfSummaryNodeLevel1AfterTwoItems() throws Exception {
+ mapFake.addGroupBeginNode();
+ mapFake.addNode("1");
+ mapFake.addSummaryNode();
+ mapFake.addGroupBeginNode();
+ mapFake.addNode("2");
+ mapFake.addSummaryNode();
+ NodeModel summaryNode = mapFake.addSummaryNode();
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findSummaryNode(2), equalTo(summaryNode));
+ }
+
+ @Test
+ public void ignoreNodesOnDifferentSides() throws Exception {
+ mapFake.addNode("1").setLeft(true);
+ mapFake.addNode("2");
+ mapFake.addSummaryNode();
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findSummaryNode(0), equalTo((NodeModel)null));
+
+ }
+
+ @Test
+ public void returnNull_IfGroupBefinNodeIsFound() throws Exception {
+ mapFake.addNode("1");
+ mapFake.addGroupBeginNode();
+ mapFake.addNode("2");
+ mapFake.addSummaryNode();
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findSummaryNode(0), equalTo((NodeModel)null));
+
+ }
+ }
+ public static class FindGroupBeginNodeIndex extends SummaryLevelsShould{
+
+ @Test
+ public void returnNull_IfGroupBeginNodeDoesNotExist() throws Exception {
+ final NodeModel node = mapFake.addNode("1");
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findGroupBeginNodeIndex(node.getIndex()), equalTo(node.getIndex()));
+ }
+
+ @Test
+ public void returnGroupBeginNodeLevel0_itself() throws Exception {
+ mapFake.addNode("1");
+ final NodeModel groupBeginNode = mapFake.addGroupBeginNode();
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findGroupBeginNodeIndex(groupBeginNode.getIndex()), equalTo(groupBeginNode.getIndex()));
+ }
+
+ @Test
+ public void returnGroupBeginNodeLevel0AfterItem() throws Exception {
+ final NodeModel groupBeginNode = mapFake.addGroupBeginNode();
+ final NodeModel node = mapFake.addNode("1");
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findGroupBeginNodeIndex(node.getIndex()), equalTo(groupBeginNode.getIndex()));
+ }
+ }
+ public static class FindGroupBeginNode extends SummaryLevelsShould{
+
+ @Test
+ public void returnFirstNode_IfGroupBeginNodeDoesNotExist() throws Exception {
+ final NodeModel node = mapFake.addNode("1");
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findGroupBeginNode(node.getIndex()), equalTo(node));
+ }
+
+ @Test
+ public void returnGroupBeginNodeLevel0AfterItem() throws Exception {
+ final NodeModel groupBeginNode = mapFake.addGroupBeginNode();
+ final NodeModel node = mapFake.addNode("1");
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findGroupBeginNode(node.getIndex()), equalTo(groupBeginNode));
+
+ }
+
+ @Test
+ public void returnGroupBeginNodeLevel0AfterTwoItems() throws Exception {
+ final NodeModel groupBeginNode = mapFake.addGroupBeginNode();
+ mapFake.addNode("1");
+ final NodeModel node = mapFake.addNode("2");
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findGroupBeginNode(node.getIndex()), equalTo(groupBeginNode));
+ }
+
+ @Test
+ public void returnSummaryOfSummaryNodeLevel1AfterTwoItems() throws Exception {
+ mapFake.addGroupBeginNode();
+ mapFake.addNode("1");
+ final NodeModel summaryGroupBeginNode = mapFake.addSummaryGroupBeginNode();
+ mapFake.addGroupBeginNode();
+ mapFake.addNode("2");
+ final NodeModel secondSummaryNode = mapFake.addSummaryNode();
+ mapFake.addSummaryNode();
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findGroupBeginNode(secondSummaryNode.getIndex()), equalTo(summaryGroupBeginNode));
+ }
+
+
+ @Test
+ public void ignoreNodesOnDifferentSides() throws Exception {
+ mapFake.addGroupBeginNode();
+ final NodeModel leftNode = mapFake.addNode("1");
+ leftNode.setLeft(true);
+ mapFake.addNode("2");
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findGroupBeginNode(leftNode.getIndex()), equalTo(leftNode));
+
+ }
+
+
+ @Test
+ public void returnNull_IfSummaryNodeIsFound() throws Exception {
+ mapFake.addGroupBeginNode();
+ mapFake.addNode("1");
+ mapFake.addSummaryNode();
+ final NodeModel node = mapFake.addNode("2");
+ final SummaryLevels summaryLevels = new SummaryLevels(mapFake.getRoot());
+ assertThat(summaryLevels.findGroupBeginNode(node.getIndex()), equalTo(node));
+ }
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/features/map/mindmapmode/SummaryGroupEdgeListAdderShould.java b/freeplane/src/test/java/org/freeplane/features/map/mindmapmode/SummaryGroupEdgeListAdderShould.java
new file mode 100644
index 0000000..74f4f83
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/features/map/mindmapmode/SummaryGroupEdgeListAdderShould.java
@@ -0,0 +1,172 @@
+package org.freeplane.features.map.mindmapmode;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.freeplane.features.map.FirstGroupNodeFlag;
+import org.freeplane.features.map.MapFake;
+import org.freeplane.features.map.NodeModel;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SummaryGroupEdgeListAdderShould {
+ private MapFake mapFake;
+ @Before
+ public void setup(){
+ mapFake = new MapFake();
+ }
+
+ @Test
+ public void forEmptyList_returnEmptyList() throws Exception {
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Collections.<NodeModel>emptyList());
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Collections.<NodeModel>emptyList()));
+ }
+
+ @Test
+ public void forGroupBeginNode_returnsGroupBeginNode() throws Exception {
+ final NodeModel node = mapFake.addGroupBeginNode();
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(node));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(node)));
+ }
+
+ @Test
+ public void forSummaryNode_returnSummaryNode() throws Exception {
+ final NodeModel node = mapFake.addSummaryNode();
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(node));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(node)));
+ }
+
+ @Test
+ public void forListWithoutSummaryNodes_returnSameList() throws Exception {
+ final NodeModel node = mapFake.addNode("1");
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(node));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(node)));
+ }
+
+ @Test
+ public void forRootNode_returnSameList() throws Exception {
+ final NodeModel root = mapFake.getRoot();
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(root));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(root)));
+ }
+
+ @Test
+ public void forListWithSingleSummarizedNode_returnListWithEdgeNodes() throws Exception {
+ final NodeModel firstEdge = mapFake.addGroupBeginNode();
+ final NodeModel summarized = mapFake.addNode("1");
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(summarized));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(firstEdge, summarized, summaryNode)));
+ }
+
+
+ @Test
+ public void forListWithSingleSummarizedNodeWithEdgeNodes_returnListWithEdgeNodes() throws Exception {
+ final NodeModel firstEdge = mapFake.addGroupBeginNode();
+ final NodeModel summarized = mapFake.addNode("1");
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(firstEdge, summarized, summaryNode));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(firstEdge, summarized, summaryNode)));
+ }
+
+ @Test
+ public void forListWithTwoSummarizedNodes_returnListWithEdgeNodes() throws Exception {
+ final NodeModel firstEdge = mapFake.addGroupBeginNode();
+ final NodeModel summarized1 = mapFake.addNode("1");
+ final NodeModel summarized2 = mapFake.addNode("2");
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(summarized1, summarized2));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(firstEdge, summarized1, summarized2, summaryNode)));
+ }
+
+ @Test
+ public void forListWithThreeSummarizedNodes_returnListWithEdgeNodes() throws Exception {
+ final NodeModel firstEdge = mapFake.addGroupBeginNode();
+ final NodeModel summarized1 = mapFake.addNode("1");
+ final NodeModel summarized2 = mapFake.addNode("2");
+ final NodeModel summarized3 = mapFake.addNode("3");
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(summarized1, summarized2, summarized3));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(firstEdge, summarized1, summarized2, summarized3, summaryNode)));
+ }
+
+ @Test
+ public void forPartialListWith_returnListWithoutEdgeNodes() throws Exception {
+ mapFake.addGroupBeginNode();
+ final NodeModel summarized1 = mapFake.addNode("1");
+ mapFake.addNode("2");
+ mapFake.addSummaryNode();
+
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(summarized1));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(summarized1)));
+ }
+
+ @Test
+ public void forListWithSingleSummarizedNodeAndTwoSummaryLevels_returnListWithEdgeNodes() throws Exception {
+ final NodeModel firstEdge = mapFake.addGroupBeginNode();
+ final NodeModel summarized = mapFake.addNode("1");
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+ summaryNode.addExtension(FirstGroupNodeFlag.FIRST_GROUP);
+ final NodeModel secondLevelSummaryNode = mapFake.addSummaryNode();
+
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(summarized));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(firstEdge, summarized, summaryNode, secondLevelSummaryNode)));
+ }
+
+
+ @Test
+ public void forListWithSingleSummarizedNodeAndThreeSummaryLevels_returnListWithEdgeNodes() throws Exception {
+ final NodeModel firstEdge = mapFake.addGroupBeginNode();
+ final NodeModel summarized = mapFake.addNode("1");
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+ summaryNode.addExtension(FirstGroupNodeFlag.FIRST_GROUP);
+ final NodeModel secondLevelSummaryNode = mapFake.addSummaryNode();
+ secondLevelSummaryNode.addExtension(FirstGroupNodeFlag.FIRST_GROUP);
+ final NodeModel thirdLevelSummaryNode = mapFake.addSummaryNode();
+
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(summarized));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(firstEdge, summarized, summaryNode, secondLevelSummaryNode, thirdLevelSummaryNode)));
+ }
+
+ @Test
+ public void ignoreNodesOnWrongSide() throws Exception {
+ final NodeModel firstEdge = mapFake.addGroupBeginNode();
+ final NodeModel summarized1 = mapFake.addNode("1");
+ final NodeModel leftNode = mapFake.addNode("2");
+ leftNode.setLeft(true);
+ final NodeModel summaryNode = mapFake.addSummaryNode();
+
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(summarized1));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(firstEdge, summarized1, summaryNode)));
+ }
+
+
+ @Test
+ public void multipleParents() throws Exception {
+ final NodeModel parent1 = mapFake.addNode("parent1");
+ final NodeModel begin1 = mapFake.createGroupBeginNode();
+ parent1.insert(begin1);
+ final NodeModel summarized1 = mapFake.createNode("1");
+ parent1.insert(summarized1);
+ final NodeModel summary1 = mapFake.createSummaryNode();
+ parent1.insert(summary1);
+
+ final NodeModel parent2 = mapFake.addNode("parent2");
+ final NodeModel begin2 = mapFake.createGroupBeginNode();
+ parent2.insert(begin2);
+ final NodeModel summarized2 = mapFake.createNode("2");
+ parent2.insert(summarized2);
+ final NodeModel summary2 = mapFake.createSummaryNode();
+ parent2.insert(summary2);
+
+ final SummaryGroupEdgeListAdder summaryEdgeFinder = new SummaryGroupEdgeListAdder(Arrays.asList(summarized1, summarized2));
+ assertThat(summaryEdgeFinder.addSummaryEdgeNodes(), equalTo(Arrays.asList(begin1, summarized1, summary1, begin2, summarized2, summary2)));
+ }
+}
diff --git a/freeplane/src/test/java/org/freeplane/features/text/mindmapmode/SplitToWordsActionShould.java b/freeplane/src/test/java/org/freeplane/features/text/mindmapmode/SplitToWordsActionShould.java
new file mode 100644
index 0000000..fe5d587
--- /dev/null
+++ b/freeplane/src/test/java/org/freeplane/features/text/mindmapmode/SplitToWordsActionShould.java
@@ -0,0 +1,16 @@
+package org.freeplane.features.text.mindmapmode;
+
+import static org.freeplane.features.text.mindmapmode.SplitToWordsAction.PatternMaker.escape;
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class SplitToWordsActionShould {
+ at Test
+public void testEscape() throws Exception {
+ assertTrue("&-^\\[]".matches("[\\[\\]\\-\\&\\\\\\^]+"));
+ assertEquals(",\\-", escape(", -"));
+ assertEquals("\\]", escape("]"));
+ assertEquals("\\^", escape("^"));
+}
+}
diff --git a/freeplane/viewer-resources/freeplane.properties b/freeplane/viewer-resources/freeplane.properties
index c5dec7f..3b83bb7 100644
--- a/freeplane/viewer-resources/freeplane.properties
+++ b/freeplane/viewer-resources/freeplane.properties
@@ -1,408 +1,47 @@
-#/*$Id$*/ -*- mode:sh -*-
-ApplicationName=Freeplane
-
-#This is the language that should be used in the program. "automatic" tries to load the current user's language.
-language = automatic
-antialias = antialias_edges
-html_export_folding = html_export_fold_currently_folded
-
-#should node be unfolded if child node is pasted ?
-#fc, 10.4.2008: set to false as default like in version 0.8.1
-unfold_on_paste=false
-
-# Experimental features, "true" / "false"
-experimental_file_locking_on = false
-
-#If dnd is enabled. "true" or "false"
-draganddrop = true
-#The Modes which Freeplane will load on startup, full Class names, comma, identifier, separated by a comma.
-#modes = freeplane.modes.browsemode.BrowseMode,Browse,org.freeplane.modes.mindmapmode.MindMapMode,MindMap,freeplane.modes.filemode.FileMode,File
-modes_since_0_8_0 = freeplane.modes.browsemode.BrowseMode,Browse,org.freeplane.modes.mindmapmode.MindMapMode,MindMap,freeplane.modes.filemode.FileMode,File
-
-#The initial mode that is loaded on startup
-initial_mode = MindMap
-
-#The default new node style. "fork", "bubble" "as_parent" and "combined" are supported
-
-# standardnodeshape = fork
-# standardnodeshape = bubble
-standardnodeshape = as_parent
-
-#The root node style if no other is specified. "fork" and "bubble" and "combined" are supported
-
-standardrootnodeshape = fork
-
-#The standard background color in html notation
-standardbackgroundcolor = #ffffff
-
-#Use white as background for printing
-printonwhitebackground = true
-
-#The standard node color if selected. In html notation (#RRGGBB in hex values)
-standardselectednodecolor = #d2d2d2
-
-#The selected nodes backgrounds are not changed and oval is written if true
-standarddrawrectangleforselection = true
-
-#The standard node text color if selected. In html notation (#RRGGBB in hex values)
-standardselectednoderectanglecolor = #002080
-
-#The default node font. This will only work if the font (TrueTypeFont) is available on the system
-defaultfont = SansSerif
-defaultfontstyle = 0
-defaultfontsize = 10
-
-#The standard edge color in html notation
-standardedgecolor = #808080
-# old: #2540b4
-
-#The standard edge style. "linear" and "bezier" are supported
-standardedgestyle = bezier
-
-#The standard cloud color in html notation
-standardcloudcolor = #f0f0f0
-
-#The standard cloud style. currently, only "bezier" is supported
-standardcloudestyle = bezier
-
-#The standard link color in html notation
-standardlinkcolor = #000000
-
-#The standard link style. currently, only "bezier" is supported
-standardlinkestyle = bezier
-
-#The Look&Feel to use. "metal","windows","motif", "gtk" are supported, "mac" is available only on MacOS
-# default means, that the default look and feel is used.
-# If you want to put your own L&F, please, enter the class name here and
-# assure that the corresponding jar file(s) are loaded.
-# If there are problems with the look and feel, then choose "nothing" here.
-#It work for applets
-lookandfeel = default
-
-#The initial size of every map
-mapxsize = 1000
-mapysize = 3200
-
-#Where to place new branches. Valid values are "first" and "last"
-placenewbranches = last
-
-#Set Links either relative or absolute
-links = relative
-
-#The URL of the documentation mindmap (.mm)
-
-
-
-#This is a hash that maps endings of files to programs which should be used to open them.
-#It is only used by the application,not by the applet.
-#Special keywords: "default" instead of file and "execute" instead of program
-#Examples: Unix: "default:netscape,sh:bash,txt:emacs,mp3:freeamp,jpg:xv"
-#Windows: "default:explorer,exe:execute,com:execute,bat:execute,mp3:winamp,doc:word"
-#filetypes = default:netscape
-# filetypes is obsolete
-preferred_browsers = explorer;konqueror;netscape # Not yet implemented !!!
-last_opened_list_length = 25
-
-# {{{ Edit Long node
-# above / below
-el__buttons_above = false
-el__position_window_below_node = true
-el__min_default_window_height = 150
-el__max_default_window_height = 600
-el__min_default_window_width = 400
-el__max_default_window_width = 900
-el__enter_confirms_by_default = true
-show_icon_for_attributes = true
-# }}}
-
-# Icons in Select Icon...
-RemoveAllIconsAction.shortcut=DELETE
-RemoveLastIconAction.shortcut=BACK_SPACE
-IconAction.attach.shortcut=\:
-IconAction.back.shortcut=<
-IconAction.button_cancel.shortcut=-
-IconAction.button_ok.shortcut=+
-IconAction.forward.shortcut=>
-IconAction.full-1.shortcut=1
-IconAction.full-2.shortcut=2
-IconAction.full-3.shortcut=3
-IconAction.full-4.shortcut=4
-IconAction.full-5.shortcut=5
-IconAction.full-6.shortcut=6
-IconAction.full-7.shortcut=7
-IconAction.full-8.shortcut=8
-IconAction.full-9.shortcut=9
-IconAction.full-0.shortcut=0
-IconAction.help.shortcut=?
-IconAction.idea.shortcut=*
-IconAction.ksmiletris.shortcut=)
-IconAction.messagebox_warning.shortcut=\!
-IconAction.smily_bad.shortcut=(
-
-#Don't display "move" cursor during paper dragging
-disable_cursor_move_paper = false
-
-#Key typing: if enabled enters node editing
-disable_key_type = false
-
-key_type_action=EDIT_CURRENT
-
-# Tell if HTML exported from Freeplane should contain icons.
-# The trouble with icons is that quite often the links to
-# icons will not be found in the exported HTML.
-export_icons_in_html = false
-
-
-#Import HTML as node structure if true or as a signle node if false
-#
-structured_html_import = true
-#
-# The Browse Mode
-#
-#The help map
-docu_map = doc/freeplane.mm
-tutorial_map = doc/freeplaneTutorial.mm
-first_start_map=doc/freeplaneApplications.mm
-#
-# The default browser setting
-#
-# For Windows (the \"\" signs are necessary due to links, that have "=" in their URL).
-# default_browser_command_windows_nt = explorer "{0}"
-#
-# # For "Windows NT":
-# default_browser_command_windows_nt = C:\Program Files\Internet Explorer\iexplore.exe "{0}"
-#
-# The next setting works for the default browser, but eventually starts programs without questions, so be careful!
-#
-# default_browser_command_windows_nt = rundll32 url.dll,FileProtocolHandler {0}
-default_browser_command_windows_nt = cmd.exe /c start "" "{0}"
-default_browser_command_windows_9x = command.com /c start "{0}"
-
-# Dimitri proposed:
-# default_browser_command_windows_9x = explorer "{0}"
-#
-# Here the default browser for other operating systems goes:
-#
-# other is typically Linux:
-default_browser_command_other_os = xdg-open {0}
-#
-# and MAC: (thanks to Nick!)
-#default_browser_command_mac = open -a /Applications/Safari.app {0}
-# due to https://sourceforge.net/tracker/?func=detail&atid=357118&aid=1940334&group_id=7118
-default_browser_command_mac = open {0}
-#
-# Selection time delay of nodes when mouse is over (in msec)
-#
-# Change this value to 1 if you want direct selection on mouse over.
-#
-time_for_delayed_selection=200
-#
-# with the following switch you can enable/disable the delayed selection scheme
-#
-# Auto options. Do not modify these as they will be saved to auto.properties anyway.
-selection_method = selection_method_delayed
-# time between two consecutive automatic saving actions (in msec):
-# ==============================================================
-# To disable automatic saving set this number to 2000000000.
-time_for_automatic_save=60000
-#
-# If the files should be deleted automatically on a normal shutdown of Freeplane set the following variable to true
-delete_automatic_saves_at_exit=true
-# If all backups should be kept in a single directory
-single_backup_directory = true
-single_backup_directory_path = {freeplaneuserdir}/.backup
-# number n of different files to store the maps into.
-# The first automatic save is done in the first file, and so on
-# up to the n+1-save which is again stored in the first file (cyclic)
-number_of_different_files_for_automatic_save=10
-#
-backup_file_number=2
-
-# Single instance
-single_instance = false
-single_instance_force = false
-
-# Dimitri, 01.09.04
-# width of the folding marking circle
-foldingsymbolwidth = 6
-
-# Fc, 10.7.2005.
-# Levels of undo
-undo_levels=100
-
-# wysiwyg
-# html_editing_options are external, internal-plain, and internal-wysiwyg.
-# If external option is chosen, the path for the external editor is taken from html_editing_command.
-html_editing_option=internal-wysiwyg
-html_editing_command=C:\\Program Files\\Microsoft Office\\Office\\FRONTPG.EXE "{0}"
-html_long_node_head=
-cut_out_pictures_when_pasting_html=true
-
-# fc, 12.10.06: all tooltips have the following width in pixels:
-toolTipManager.max_tooltip_width=600
-
-# fc, 11.11.2006: don't remove this comment as it is needed for mac osx:
-#freeplane.base.dir=.
-webFreeplaneLocation=http://freeplane.sourceforge.net/
-webFAQLocation=http://freeplane.sourceforge.net/faq.html
-webDocuLocation=http://freeplane.sourceforge.net/docu.html
-
-# simplyhtml
-simplyhtml.menubar=edit format table help
-# toolbar definition
-#
-# each word (delimited by blanks) is a key for
-# an action in the tool bar (- = separator)
-simplyhtml.toolBar=print undo redo - cut copy paste - findReplace
-
-# format toolbar definition
-#
-# each word (delimited by blanks) is a key for
-# an action in the tool bar (- = separator)
-simplyhtml.formatToolBar=fontFamily fontSize - fontBold fontItalic fontUnderline fontColor clearFormat
-
-# para toolbar definition
-#
-# each word (delimited by blanks) is a key for
-# an action in the tool bar (- = separator)
-simplyhtml.paraToolBar=paraAlignLeft paraAlignCenter paraAlignRight - toggleBullets toggleNumbers
-
-# edit menu definition
-simplyhtml.edit=undo redo - selectAll cut copy paste pasteOther - findReplace editLink setLinkByFileChooser - print
-simplyhtml.popup=undo redo - cut copy paste pasteOther
-
-# edit menu items
-simplyhtml.undoImage=/images/undo.png
-simplyhtml.redoImage=/images/redo.png
-simplyhtml.cutImage=/images/editcut.png
-simplyhtml.copyImage=/images/editcopy.png
-simplyhtml.pasteImage=/images/editpaste.png
-simplyhtml.pasteOtherImage=/images/editpaste.png
-simplyhtml.findReplaceImage=/images/filefind.png
-simplyhtml.printImage=/images/fileprint.png
-simplyhtml.editLinkImage=resources/link.gif
-simplyhtml.simpleLinkDialog = true
-simplyhtml.linkType2=http
-
-#insert menu items
-simplyhtml.insertTableImage=resources/table.gif
-simplyhtml.insertImageImage=resources/image.gif
-
-# format menu definition
-simplyhtml.format=font - formatPara fontBold fontItalic fontUnderline fontColor clearFormat - paraAlignLeft paraAlignCenter paraAlignRight - formatList toggleBullets toggleNumbers
-
-# format menu items
-simplyhtml.fontImage=resources/font.gif
-simplyhtml.clearFormatImage=/images/clearFormat.png
-simplyhtml.fontColorSelectedIcon=resources/fontColor.gif
-simplyhtml.formatTableImage=resources/fmtTab.gif
-simplyhtml.toggleBulletsImage=resources/ul.gif
-simplyhtml.toggleNumbersImage=resources/ol.gif
-simplyhtml.formatParaImage=resources/fmtPara.gif
-simplyhtml.paraAlignLeftImage=resources/algnLft.gif
-simplyhtml.paraAlignLeftSelectedIcon=resources/algnLft_on.gif
-simplyhtml.paraAlignCenterImage=resources/algnCtr.gif
-simplyhtml.paraAlignCenterSelectedIcon=resources/algnCtr_on.gif
-simplyhtml.paraAlignRightImage=resources/algnRt.gif
-simplyhtml.paraAlignRightSelectedIcon=resources/algnRt_on.gif
-simplyhtml.fontBoldImage=/images/Bold16.png
-simplyhtml.fontBoldSelectedIcon=/images/Bold_on16.png
-simplyhtml.fontItalicImage=/images/Italic16.png
-simplyhtml.fontItalicSelectedIcon=/images/Italic_on16.png
-simplyhtml.fontUnderlineImage=/images/uline.png
-simplyhtml.fontUnderlineSelectedIcon=/images/uline_on.png
-simplyhtml.fontColorImage=resources/fontColor.gif
-
-# table menu definition
-simplyhtml.table=insertTable - nextTableCell prevTableCell - appendTableRow appendTableCol - insertTableRow insertTableCol - deleteTableRow deleteTableCol
-
-# table menu items
-simplyhtml.deleteTableColImage=resources/delCol.gif
-simplyhtml.insertTableRowImage=resources/insRow.gif
-simplyhtml.insertTableColImage=resources/insCol.gif
-simplyhtml.deleteTableRowImage=resources/delRow.gif
-
-# help menu definition
-simplyhtml.help = about
-
-# About frame
-simplyhtml.appImage=resources/appImage.jpg
-simplyhtml.appIcon=resources/icon_trans.gif
-
-# Splah screen
-simplyhtml.splashImage=resources/splashImage.jpg
-
-# Miscellaneous text
-simplyhtml.okBtnName=OK
-simplyhtml.standardStyleName=standard
-
-# not use shtml standard style for new documents
-simplyhtml.use_std_styles=false
-
-# default paste mode for Paste action in simplyhtml
-simplyhtml.default_paste_mode = PASTE_HTML
-
-# fc, 2.3.07, mouse wheel speed
-wheel_velocity=80
-
-# fc, 31.7.07
-delete_nodes_without_question=false
-
-# Dimitry, 30.08.07
-remind_use_rich_text_in_new_nodes=
-
-#dimitry, 25.10.07
-use_common_out_point_for_root_node=false
-
-#fc, 11.9.07:
-use_split_pane=false
-
-#fc, 19.10.2007: standard is true as this is correct for almost every user...
-convert_to_current_version=true
-
-#fc, 8.1.2008:
-cut_nodes_without_question=false
-
-#fc, 10.4.2008:
-show_note_icons=true
-remove_notes_without_question=false
-
-# not added: encrypted;decrypted;redo;
-
-note_location=bottom
-
-save_folding=never_save_folding
-load_folding=load_folding_from_map_default_fold_all
-max_displayed_node_count=20
-
-save_modification_times=true
-
-revision_color= #ffff00
-
-center_selected_node=false
-
-resources_use_default_font_for_notes_too=true
-resources_use_margin_top_zero_for_notes=true
-
-
AddConnectorAction.icon=/images/designer.png
AddLocalLinkAction.icon=/images/LinkLocal.png
+ApplicationName=Freeplane
+ApplyNoFilteringAction.icon=/images/remove_filtering.png
+ApplySelectedViewConditionAction.icon=/images/filter_selected_nodes.png
+ApplyToVisibleAction.icon=/images/applies_to_filtered_nodes.png
+AutomaticEdgeColorHookAction.icon=/images/AutomaticEdgeColorHookAction.png
BackAction.icon=/images/MoveTo_PrevNode.png
+BlinkingNodeHookAction.icon=/images/xeyes.png
BoldAction.icon=/images/Bold16.png
CenterSelectedNodeAction.icon=/images/CenterSelectedNodeAction.png
+ChangeConnectorArrowsAction.backward.icon=/images/arrow-mode-backward.png
+ChangeConnectorArrowsAction.both.icon=/images/arrow-mode-both.png
+ChangeConnectorArrowsAction.forward.icon=/images/arrow-mode-forward.png
+ChangeConnectorArrowsAction.none.icon=/images/arrow-mode-none.png
+CloseAction.icon=/images/close.png
CloudAction.icon=/images/Cloud24.png
CloudColorAction.icon=/images/Colors24.png
ConnectorColorAction.icon=/images/connector_color.png
CopyAction.icon=/images/editcopy.png
+CopyIDAction.icon=/images/copy_id.png
+CopySingleAction.icon=/images/copy_single.png
+CreationModificationPluginAction.icon=/images/kword.png
CutAction.icon=/images/editcut.png
+DecreaseNodeFontAction.icon=/images/DecreaseNodeFontAction.png
DeleteAction.icon=/images/editdelete.png
-DeleteDetailsAction.icon =/images/DeleteDetailsAction.png
-EditDetailsInDialogAction.icon =/images/EditDetailsInDialogAction.png
-EditFilterAction.icon=/images/Btn_edit.gif
+DeleteDetailsAction.icon=/images/DeleteDetailsAction.png
+EditAction.icon=/images/edit_node.png
+EditAttributesAction.icon=/images/EditAttributesAction.png
+EditDetailsAction.icon=/images/edit_details.png
+EditDetailsInDialogAction.icon=/images/EditDetailsInDialogAction.png
+EditFilterAction.icon=/images/edit_filtering_condition.png
+EditLongAction.icon=/images/edit_long_node.png
+EditNoteInDialogAction.icon=/images/EditNoteInDialogAction.png
EncryptedMap.icon=/images/lock.png
EnterPassword.icon=/images/unlock.png
-ExternalImageAddAction.icon =/images/ExternalImageAddAction.png
+ExecuteScriptForAllNodes.icon=/images/ExecuteScriptForAllNodes.png
+ExecuteScriptForSelectionAction.icon=/images/ExecuteScriptForSelectionAction.png
+ExecuteScripts.icon=/images/ExecuteScripts.png
+ExportAction.icon=/images/export.png
+ExternalImageAddAction.icon=/images/ExternalImageAddAction.png
+ExtractLinkFromTextAction.icon=/images/ExtractLinkFromTextAction.png
FaqOpenURLAction.icon=/images/Link.png
+FilePropertiesAction.icon=/images/MapStats.png
FindAction.icon=/images/filefind.png
FitToPage.icon=/images/FitToPage.png
FoldAllAction.icon=/images/fold_all.png
@@ -411,91 +50,228 @@ FormatCopy.icon=/images/colorpicker.png
FormatPaste.icon=/images/color_fill.png
ForwardAction.icon=/images/MoveTo_NextNode.png
GotoLinkNodeAction.icon=/images/Link.png
+HierarchicalIconsAction.icon=/images/HierarchicalIconsAction.png
+IconAction.attach.shortcut=\:
+IconAction.back.shortcut=<
+IconAction.button_cancel.shortcut=-
+IconAction.button_ok.shortcut=+
+IconAction.forward.shortcut=>
+IconAction.full-0.shortcut=0
+IconAction.full-1.shortcut=1
+IconAction.full-2.shortcut=2
+IconAction.full-3.shortcut=3
+IconAction.full-4.shortcut=4
+IconAction.full-5.shortcut=5
+IconAction.full-6.shortcut=6
+IconAction.full-7.shortcut=7
+IconAction.full-8.shortcut=8
+IconAction.full-9.shortcut=9
+IconAction.help.shortcut=?
+IconAction.idea.shortcut=*
+IconAction.ksmiletris.shortcut=)
+IconAction.messagebox_warning.shortcut=\!
+IconAction.smily_bad.shortcut=(
+IconGroupPopupAction.arrows.icon=forward
+IconGroupPopupAction.flags.icon=flag-orange
+IconGroupPopupAction.math.icon=addition
+IconGroupPopupAction.miscellaneous.icon=wizard
+IconGroupPopupAction.nature.icon=licq
+IconGroupPopupAction.numbers.icon=full-1
+IconGroupPopupAction.office.icon=attach
+IconGroupPopupAction.people.icon=family
+IconGroupPopupAction.rating.icon=positive
+IconGroupPopupAction.signs.icon=idea
+IconGroupPopupAction.smiley.icon=ksmiletris
+IconGroupPopupAction.time.icon=clock
+IconGroupPopupAction.user.icon=user_icon
IconSelectionPlugin.icon=/images/kalzium.png
+IncreaseNodeFontAction.icon=/images/IncreaseNodeFontAction.png
ItalicAction.icon=/images/Italic16.png
+JoinNodesAction.icon=/images/JoinNodesAction.png
+LaTeX_in_freeplane_url=http\://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane
+ManageAddOnsAction.icon=/images/addons.png
+MapBackgroundClearAction.icon=/images/MapBackgroundClearAction.png
+MapBackgroundColorAction.icon=/images/MapBackgroundColorAction.png
+MapBackgroundImageAction.icon=/images/MapBackgroundImageAction.png
NavigationNextMapAction.icon=/images/MoveTo_NextMM.png
NavigationPreviousMapAction.icon=/images/MoveTo_PrevMM.png
NewChildAction.icon=/images/idea.png
NewMapAction.icon=/images/filenew.png
-FilePropertiesAction.icon=/images/MapStats.png
NewParentNode.icon=/images/stock_text_indent.png
+NewSiblingAction.icon=/images/NewSiblingAction.png
+NodeBackgroundColorAction.icon=/images/NodeBackgroundColorAction.png
+NodeColorAction.icon=/images/NodeColorAction.png
+NodeColorBlendAction.icon=/images/NodeColorBlendAction.png
+NodeListAction.icon=/images/NodeListAction.png
OpenAction.icon=/images/fileopen.png
OpenURLAction.icon=/images/Link.png
+OpenUserDirAction.icon=/images/OpenUserDirAction.png
+OptionPanel.display_inline_editor_for_all_new_nodes=false
PasteAction.icon=/images/editpaste.png
PrintAction.icon=/images/fileprint.png
PrintDirectAction.icon=/images/fileprint.png
+PrintPreviewAction.icon=/images/print_preview.png
+PropertyAction.icon=/images/PropertyAction.png
+QuickFilterAction.icon=/images/apply_quick_filter.png
+FindNextAction.icon=/images/find_next.png
+QuickFindAction.FORWARD.icon=/images/find_next.png
+FindPreviousAction.icon=/images/find_previous.png
+QuickFindAction.BACK.icon=/images/find_previous.png
+QuickFindAllAction.icon=/images/select_all_found_nodes.png
+QuickHighlightAction.icon=/images/highlight_matching_nodes.png
+QuitAction.icon=/images/quit.png
+ReapplyFilterAction.icon=/images/reapply_filter.png
RedoAction.icon=/images/redo.png
+RedoFilterAction.icon=/images/redo_filter.png
+ReminderHookAction.icon=/images/ReminderHookAction.png
RemoveAllIconsAction.icon=/images/icon_trash.png
+RemoveAllIconsAction.shortcut=DELETE
RemoveConnectorAction.icon=/images/remove_connector.png
-RemoveIcon_0_Action.icon=/images/remove_first_icon.png
+RemoveEncryption.icon=/images/RemoveEncryption.png
RemoveIconAction.icon=/images/remove_last_icon.png
+RemoveIcon_0_Action.icon=/images/remove_first_icon.png
+RemoveLastIconAction.shortcut=BACK_SPACE
+RemoveNoteAction.icon=/images/RemoveNoteAction.png
+RevisionPluginAction.icon=/images/RevisionPluginAction.png
SaveAction.icon=/images/filesave.png
SaveAsAction.icon=/images/filesaveas.png
-SetShortenerStateAction.icon =/images/SetShortenerStateAction.png
+ScriptEditor.icon=/images/ScriptEditor.png
+SetAcceleratorOnNextClickAction.icon=/images/SetAcceleratorOnNextClickAction.png
+SetLinkByFileChooserAction.icon=/images/SetLinkByFileChooserAction.png
+SetLinkByTextFieldAction.icon=/images/SetLinkByTextFieldAction.png
+SetShortenerStateAction.icon=/images/SetShortenerStateAction.png
ShowAncestorsAction.icon=/images/show_ancestors.png
-ShowDescendantsAction.icon=/images/show_descendants.png
-ApplyToVisibleAction.icon=/images/applies_to_filtered_nodes.png
-CreationModificationPluginAction.icon=/images/kword.png
-BlinkingNodeHookAction.icon=/images/xeyes.png
ShowAttributeDialogAction.icon=/images/showAttributes.png
-ShowSelectionAsRectangleAction.icon=/images/ShowSelectionAsRectangleAction.png
+ShowDescendantsAction.icon=/images/show_descendants.png
ShowFilterToolbarAction.icon=/images/filter.png
+ShowSelectionAsRectangleAction.icon=/images/ShowSelectionAsRectangleAction.png
+SortNodes.icon=/images/SortNodes.png
SplitNode.icon=/images/split_node.png
+TextAlignAction.CENTER.icon=/images/algnCtr16.gif
+TextAlignAction.LEFT.icon=/images/algnLft16.gif
+TextAlignAction.RIGHT.icon=/images/algnRt16.gif
+TimeListAction.icon=/images/TimeListAction.png
+TimeManagementAction.icon=/images/TimeManagementAction.png
UndoAction.icon=/images/undo.png
+UndoFilterAction.icon=/images/undo_filter.png
UnfoldAllAction.icon=/images/unfold_all.png
UnfoldOneLevelAction.icon=/images/unfold_one_level.png
+UpdateCheckAction.icon=/images/update.png
ViewLayoutTypeAction.OUTLINE.icon=/images/outline_view.png
-ZoomInAction.icon= /images/ZoomIn24.png
-ZoomOutAction.icon= /images/ZoomOut24.png
WebDocuAction.icon=/images/Link.png
-
-ShowFilterToolbarAction.icon=/images/filter.png
-
-ApplyNoFilteringAction.icon=/images/remove_filtering.png
-ApplySelectedViewConditionAction.icon=/images/filter_selected_nodes.png
-EditFilterAction.icon=/images/edit_filtering_condition.png
-UndoFilterAction.icon=/images/undo_filter.png
-RedoFilterAction.icon=/images/redo_filter.png
-ReapplyFilterAction.icon=/images/reapply_filter.png
-
-ChangeConnectorArrowsAction.none.icon=/images/arrow-mode-none.png
-ChangeConnectorArrowsAction.forward.icon=/images/arrow-mode-forward.png
-ChangeConnectorArrowsAction.backward.icon=/images/arrow-mode-backward.png
-ChangeConnectorArrowsAction.both.icon=/images/arrow-mode-both.png
-
-acceleratorForMindMap/$ModesMenuAction.MindMap$0=alt 1
-acceleratorForMindMap/$ModesMenuAction.Browse$0=alt 2
-acceleratorForMindMap/$ModesMenuAction.File$0=alt 3
-acceleratorForMindMap/main_menu_most_recent_files/OpenLastOpenedAction_1=control 1
-
-acceleratorForBrowse/$ModesMenuAction.MindMap$0=alt 1
-acceleratorForBrowse/$ModesMenuAction.Browse$0=alt 2
-acceleratorForBrowse/$ModesMenuAction.File$0=alt 3
-
-acceleratorForFile/$ModesMenuAction.MindMap$0=alt 1
-acceleratorForFile/main_menu_modes/$ModesMenuAction.Browse$0=alt 2
-acceleratorForFile/$ModesMenuAction.File$0=alt 3
-
-show_node_tooltips=true
-paint_connectors_behind=true
-label_font_size=9
-label_font_family=SansSerif
-
+ZoomInAction.icon=/images/ZoomIn24.png
+ZoomOutAction.icon=/images/ZoomOut24.png
+acceleratorFor.Browse/ModesMenuAction.Browse=alt 2
+acceleratorFor.Browse/ModesMenuAction.MindMap=alt 1
+acceleratorFor.File/ModesMenuAction.File=alt 3
+acceleratorFor.File/ModesMenuAction.MindMap=alt 1
+acceleratorFor.File/main_menu_modes/ModesMenuAction.Browse=alt 2
+acceleratorFor.MindMap/ModesMenuAction.Browse=alt 2
+acceleratorFor.MindMap/ModesMenuAction.File=alt 3
+acceleratorFor.MindMap/ModesMenuAction.MindMap=alt 1
+acceleratorFor.MindMap/OpenLastOpenedAction_1=control 1
+acceleratorForBrowse/ModesMenuAction.File=alt 3
+acceleratorPresets.icon=/images/acceleratorPresets.png
+always_load_last_maps=false
+antialias=antialias_all
+apply_system_screen_resolution=true
+approximate_search_threshold=0.65
+backup_file_number=2
+browsemode_initial_map=map.mm
+bugTrackerLocation=http\://www.freeplane.org/bugs
+center_selected_node=false
check_updates_automatically=true
-
-webUpdateLocation=http://freeplane.sourceforge.net/info/history/
-webDownloadLocation=http://sourceforge.net/project/showfiles.php?group_id=211069
-UpdateCheckAction.icon=/images/update.png
-last_update_verson=
-bugTrackerLocation=http://www.freeplane.org/bugs
-featureTrackerLocation=http://www.freeplane.org/requests
-helpForumLocation=http://www.freeplane.org/discussion
-
-toolTipManager.initialDelay = 750
-toolTipManager.dismissDelay = 4000
-toolTipManager.reshowDelay = 500
-
-# fc, 28.4.2008: used and displayed icons as a list with divider ';':
+compare_as_number=true
+connector_alpha=200
+connector_shape=CUBIC_CURVE
+connector_width=2
+convert_to_current_version=true
+copyright_url=http\://freeplane.sourceforge.net/wiki/index.php/Contributors
+cut_nodes_without_question=true
+cut_out_pictures_when_pasting_html=true
+date_format=SHORT
+datetime_format=SHORT,SHORT
+default_attribute_key_column_width=60 pt
+default_attribute_value_column_width=60 pt
+default_browser_command_mac=open {0}
+default_browser_command_other_os=xdg-open {0}
+default_browser_command_windows_9x=command.com /c start "{0}"
+default_browser_command_windows_nt=cmd.exe /c start "" "{0}"
+default_charset=JVMdefault
+default_save_dir={user.home}
+defaultfont=SansSerif
+defaultfontsize=10
+defaultfontstyle=0
+delete_automatic_saves_at_exit=true
+delete_nodes_without_question=true
+dialog_leftToolbarVisible=false
+dialog_leftToolbarVisible.fullscreen=false
+dialog_menubarVisible=true
+dialog_menubarVisible.fullscreen=true
+dialog_scrollbarsVisible=true
+disable_cursor_move_paper=false
+disable_key_type=false
+display_inline_editor_for_all_new_nodes=false
+display_node_id=false
+docu-online=http\://freeplane.sourceforge.net/mapsOnline/IndexFreeplaneGuides.mm
+docu_map=doc/freeplane.mm
+draganddrop=true
+edit_on_double_click=true
+editor_extra_width=80
+el__buttons_above=false
+el__enter_confirms_by_default=true
+el__max_default_window_height=600
+el__max_default_window_width=500
+el__min_default_window_height=150
+el__min_default_window_width=500
+el__position_window_below_node=true
+executable_icon=Executable.png
+experimental_file_locking_on=false
+export_icons_in_html=false
+exported_image_resolution_dpi=300
+fbarVisible=false
+fbarVisible.fullscreen=false
+featureTrackerLocation=http\://www.freeplane.org/requests
+filter_match_case=false
+filter_toolbar_visible=false
+filter_toolbar_visible.fullscreen=false
+whatsnew_map=doc/whatsNew-1.5.x.mm
+fit_map=USER_DEFINED
+fit_to_viewport=false;
+fold_on_click_inside=true
+foldingsymbolwidth=10
+statesymbolwidth=10
+format_locale=automatic
+freeplane_copyright=(C)2000-2016
+freeplane_description=Free mind mapping and knowledge management software
+fullscreen_enabled=true
+goto_note_end_on_edit=true
+grid_size=0 px
+groovy_editor_font=Monospaced
+groovy_editor_font_size=12
+helpForumLocation=http\://www.freeplane.org/discussion
+highlight_formulas=true
+homepage_url=http\://www.freeplane.org
+html_editing_command=C\:\\Program Files\\Microsoft Office\\Office\\FRONTPG.EXE "{0}"
+html_editing_option=internal-wysiwyg
+html_export_folding=html_export_fold_currently_folded
+html_long_node_head=
+icon.theme.folder=test
+icons.group.arrows=forward;back;up;down
+icons.group.flags=flag-black;flag-blue;flag-green;flag-orange;flag-pink;flag;flag-yellow
+icons.group.math=addition;subtraction;multiplication;division
+icons.group.media=video;audio;executable;image;internet;internet_warning;mindmap;narrative
+icons.group.miscellaneous=wizard;gohome;knotify;password;pencil;xmag;bell;bookmark;launch;broken-line;stop;prepare;go
+icons.group.nature=licq;penguin;freemind_butterfly;bee
+icons.group.numbers=full-1;full-2;full-3;full-4;full-5;full-6;full-7;full-8;full-9;full-0;0%;25%;50%;75%;100%
+icons.group.office=attach;desktop_new;list;edit;kaddressbook;pencil;folder;kmail;Mail;revision
+icons.group.people=family;female1;female2;females;male1;male2;males;fema;group
+icons.group.rating=very_negative;negative;neutral;positive;very_positive
+icons.group.signs=help;yes;button_ok;button_cancel;bookmark;idea;messagebox_warning;stop-sign;closed;info;clanbomber;checked;unchecked
+icons.group.smiley=ksmiletris;smiley-neutral;smiley-oh;smiley-angry;smily_bad
+icons.group.time=clock;clock2;hourglass;calendar
+icons.group.user=
+icons.groups=signs;miscellaneous;rating;numbers;smiley;people;nature;time;office;media;flags;arrows;math;user
icons.list=help;yes;button_ok;button_cancel;bookmark;idea;messagebox_warning;stop-sign;closed;info;clanbomber;checked;unchecked;\
wizard;gohome;knotify;password;pencil;xmag;bell;bookmark;launch;broken-line;stop;prepare;go;\
very_negative;negative;neutral;positive;very_positive;\
@@ -509,199 +285,202 @@ ksmiletris;smiley-neutral;smiley-oh;smiley-angry;smily_bad;\
licq;penguin;freemind_butterfly;bee;\
forward;back;up;down;\
addition;subtraction;multiplication;division
-
-icons.groups=signs;miscellaneous;rating;numbers;smiley;people;nature;time;office;media;flags;arrows;math;user
-
-icons.group.signs=help;yes;button_ok;button_cancel;bookmark;idea;messagebox_warning;stop-sign;closed;info;clanbomber;checked;unchecked
-icons.group.miscellaneous=wizard;gohome;knotify;password;pencil;xmag;bell;bookmark;launch;broken-line;stop;prepare;go
-icons.group.numbers=full-1;full-2;full-3;full-4;full-5;full-6;full-7;full-8;full-9;full-0;0%;25%;50%;75%;100%
-icons.group.office=attach;desktop_new;list;edit;kaddressbook;pencil;folder;kmail;Mail;revision
-icons.group.media=video;audio;executable;image;internet;internet_warning;mindmap;narrative
-icons.group.flags=flag-black;flag-blue;flag-green;flag-orange;flag-pink;flag;flag-yellow
-icons.group.time=clock;clock2;hourglass;calendar
-icons.group.people=family;female1;female2;females;male1;male2;males;fema;group
-icons.group.smiley=ksmiletris;smiley-neutral;smiley-oh;smiley-angry;smily_bad
-icons.group.nature=licq;penguin;freemind_butterfly;bee
-icons.group.arrows=forward;back;up;down
-icons.group.math=addition;subtraction;multiplication;division
-icons.group.rating=very_negative;negative;neutral;positive;very_positive
-icons.group.user=
-
-IconGroupPopupAction.office.icon=attach
-IconGroupPopupAction.flags.icon=flag-orange
-IconGroupPopupAction.numbers.icon=full-1
-IconGroupPopupAction.math.icon=addition
-IconGroupPopupAction.time.icon=clock
-IconGroupPopupAction.people.icon=family
-IconGroupPopupAction.signs.icon=idea
-IconGroupPopupAction.smiley.icon=ksmiletris
-IconGroupPopupAction.nature.icon=licq
-IconGroupPopupAction.miscellaneous.icon=wizard
-IconGroupPopupAction.arrows.icon=forward
-IconGroupPopupAction.rating.icon=positive
-IconGroupPopupAction.user.icon=user_icon
-
-structured_icon_toolbar=false
-
-load_last_maps=true
-load_last_map=false
-user_zoom=1
-menubarVisible=true
-scrollbarsVisible=true
-fbarVisible=false
-leftToolbarVisible=true
-
-load_next_properties=
-filter_toolbar_visible=false
-editor_extra_width=80
-
-menubarVisible.fullscreen=false
-scrollbarsVisible.fullscreen=false
-filter_toolbar_visible.fullscreen=false
-leftToolbarVisible.fullscreen=false
-toolbarVisible=true
-toolbarVisible.fullscreen=false
-fbarVisible.fullscreen=false
-outline_vgap=5
-outline_hgap=15
-fit_map=USER_DEFINED
+ignore_edge_format_by_style=true
il__enter_confirms_by_default=true
-
-icon.theme.folder=test
-styleScrollPaneVisible=false
-styleScrollPaneVisible.fullscreen=false
-scrollbar_increment=20
-styledialog.ok.icon=/images/ok_button.png
-styledialog.cancel.icon=/images/cancel_button.png
-spelling_language=disabled
-spelling_opt_case_sensitive=true
-spelling_opt_ignore_all_caps_words=false
-spelling_opt_ignore_capitalization=false
-spelling_opt_ignore_words_with_numbers=true
-spelling_opt_suggestions_limit_dialog = 15
-spelling_opt_suggestions_limit_menu = 15
-display_node_id=false
-goto_note_end_on_edit=true
-default_charset=JVMdefault
-
+image_cache=ic_file
+initial_mode=MindMap
+key_type_action=EDIT_CURRENT
+label_font_family=SansSerif
+label_font_size=9
+language=automatic
+last_opened_list_length=25
+last_update_verson=
+latex_disable_editor=false
+latex_editor_font=Monospaced
+latex_editor_font_size=12
+latex_macros=
+layout_map_on_text_change=false
+leftToolbarVisible=false
+leftToolbarVisible.fullscreen=false
+license_url=http\://www.gnu.org/licenses/gpl-2.0.html
link_icon=Link.png
link_local_icon=LinkLocal.png
+links=relative
+load_folding=load_folding_from_map_default_fold_all
+load_last_map=false
+load_last_maps=true
+load_next_properties=
+lock_expiration_time_in_minutes=5
+lookandfeel=default
mail_icon=Mail.png
-executable_icon=Executable.png
-always_load_last_maps=false
-browsemode_initial_map = map.mm
-standard_template=standard.mm
+mapxsize=1000
+mapysize=3200
+max_displayed_node_count=20
+max_image_width=600
+max_menu_item_count=32
max_shortened_text_length=100
-
-CopySingleAction.icon=/images/copy_single.png
-CopyIDAction.icon=/images/copy_id.png
-EditAction.icon=/images/edit_node.png
-EditLongAction.icon=/images/edit_long_node.png
-EditDetailsAction.icon=/images/edit_details.png
-MaxNodeWidthAction.icon=/images/max_text_width.png
-MinNodeWidthAction.icon=/images/min_node_width.png
-new_map_from_user_templates.icon=/images/new_map_.png
-PrintPreviewAction.icon=/images/print_preview.png
-QuickFilterAction.icon=/images/apply_quick_filter.png
-QuickFindAction.FORWARD.icon=/images/find_next.png
-QuickFindAction.BACK.icon=/images/find_previous.png
-QuickFindAllAction.icon=/images/select_all_found_nodes.png
-QuickHighlightAction.icon=/images/highlight_matching_nodes.png
-
menu_file_import.icon=/images/import.png
-ExportAction.icon=/images/export.png
-CloseAction.icon=/images/close.png
-QuitAction.icon=/images/quit.png
-grid_size=10
-dialog_menubarVisible=true
-dialog_scrollbarsVisible=true
-connector_shape=CUBIC_CURVE
-connector_alpha=80
-connector_width=2
-
-EditAttributesAction.icon=/images/EditAttributesAction.png
-NodeListAction.icon=/images/NodeListAction.png
-IncreaseNodeFontAction.icon=/images/IncreaseNodeFontAction.png
-DecreaseNodeFontAction.icon=/images/DecreaseNodeFontAction.png
-NodeColorAction.icon=/images/NodeColorAction.png
-NodeColorBlendAction.icon=/images/NodeColorBlendAction.png
-JoinNodesAction.icon=/images/JoinNodesAction.png
-NodeBackgroundColorAction.icon=/images/NodeBackgroundColorAction.png
-MapBackgroundColorAction.icon=/images/MapBackgroundColorAction.png
-HierarchicalIconsAction.icon=/images/HierarchicalIconsAction.png
-AutomaticEdgeColorHookAction.icon=/images/AutomaticEdgeColorHookAction.png
-NewSiblingAction.icon=/images/NewSiblingAction.png
-SetLinkByFileChooserAction.icon=/images/SetLinkByFileChooserAction.png
-SetLinkByTextFieldAction.icon=/images/SetLinkByTextFieldAction.png
-
-parse_data=true
-# either SHORT, MEDIUM, LONG or FULL or a pattern
-date_format=SHORT
-# either <datestyle>,<timestyle> (with style in SHORT, MEDIUM, LONG or FULL) or a full pattern like "m/d/yyyy hh:mm"
-datetime_format=SHORT,SHORT
-number_format=#0.####
-compare_as_number=true
-
-approximate_search_threshold = 0.65
-
-latex_macros=
-latex_editor_font=Monospaced
-latex_editor_font_size=12
-latex_disable_editor=false
-
-groovy_editor_font=Monospaced
-groovy_editor_font_size=12
-
-format_locale=automatic
-
-status_visible=true
-status_visible.fullscreen=true
-
-EditAttributesAction.icon=/images/EditAttributesAction.png
-RemoveNoteAction.icon=/images/RemoveNoteAction.png
-TimeManagementAction.icon=/images/TimeManagementAction.png
-RemoveEncryption.icon=/images/RemoveEncryption.png
-ReminderHookAction.icon=/images/ReminderHookAction.png
-TimeListAction.icon=/images/TimeListAction.png
-EditNoteInDialogAction.icon=/images/EditNoteInDialogAction.png
-PropertyAction.icon=/images/PropertyAction.png
-OpenUserDirAction.icon=/images/OpenUserDirAction.png
-ScriptEditor.icon=/images/ScriptEditor.png
-ExecuteScriptForAllNodes.icon=/images/ExecuteScriptForAllNodes.png
-ExecuteScriptForSelectionAction.icon=/images/ExecuteScriptForSelectionAction.png
-ExecuteScripts.icon=/images/ExecuteScripts.png
-ManageAddOnsAction.icon=/images/addons.png
-ExtractLinkFromTextAction.icon=/images/ExtractLinkFromTextAction.png
-SetAcceleratorOnNextClickAction.icon=/images/SetAcceleratorOnNextClickAction.png
-acceleratorPresets.icon=/images/acceleratorPresets.png
-SortNodes.icon=/images/SortNodes.png
-RevisionPluginAction.icon=/images/RevisionPluginAction.png
-OptionPanel.display_inline_editor_for_all_new_nodes=false
-layout_map_on_text_change=true
-show_styles_in_tooltip=false
-highlight_formulas = true
-docu-online=http://freeplane.sourceforge.net/mapsOnline/IndexFreeplaneGuides.mm
-default_attribute_key_column_width=75
-default_attribute_value_column_width=75
-max_menu_item_count=32
-freeplane_copyright=\u00a9 2000-2014
-freeplane_description=Free mind mapping and knowledge management software
-copyright_url=http://freeplane.sourceforge.net/wiki/index.php/Contributors
-license_url=http://www.gnu.org/licenses/gpl-2.0.html
-homepage_url = http://www.freeplane.org
-LaTeX_in_freeplane_url = http://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane
-image_cache=ic_file
-edit_on_double_click=true
-fold_on_click_inside=true
-apply_system_screen_resolution = true
-user_defined_screen_resolution = 96
+menubarVisible=true
+menubarVisible.fullscreen=false
+modes_since_0_8_0=freeplane.modes.browsemode.BrowseMode,Browse,org.freeplane.modes.mindmapmode.MindMapMode,MindMap,freeplane.modes.filemode.FileMode,File
+new_map_from_user_templates.icon=/images/new_map_.png
+note_location=bottom
+number_format=\#0.\#\#\#\#
+number_of_different_files_for_automatic_save=10
+org.freeplane.plugin.bugreport=org.freeplane.plugin.bugreport.ask
org.freeplane.plugin.bugreport.userid=
+outline_hgap=10.0 pt
+outline_vgap=3.0 pt
+paint_connectors_behind=true
+parse_data=true
+parse_formulas=true
+parse_latex=true
+placenewbranches=last
+preferred_browsers=explorer;konqueror;netscape \# Not yet implemented \!\!\!
+presentation_dimmer_transparency=144
presentation_mode=false
-presentation_dimmer_transparency = 144
-scrolling_speed = 10
-max_image_width = 600
-lock_expiration_time_in_minutes = 5
-org.freeplane.plugin.bugreport=org.freeplane.plugin.bugreport.ask
-#org.freeplane.plugin.bugreport=org.freeplane.plugin.bugreport.denied
-exported_image_resolution_dpi = 300
+printonwhitebackground=true
+remind_use_rich_text_in_new_nodes=true
+remove_notes_without_question=true
+resources_use_default_font_for_notes_too=true
+resources_use_margin_top_zero_for_notes=true
+revision_color=\#ffff00
+save_folding=always_save_folding
+save_last_position_in_map=true
+save_modification_times=true
+scrollbar_increment=20
+scrollbarsVisible=false
+scrollbarsVisible.fullscreen=false
+scrolling_speed=10
+selection_method=selection_method_delayed
+show_icon_for_attributes=true
+show_node_tooltips=true
+show_note_icons=true
+show_styles_in_tooltip=false
+simplyhtml.appIcon=resources/icon_trans.gif
+simplyhtml.appImage=resources/appImage.jpg
+simplyhtml.clearFormatImage=/images/clearFormat.png
+simplyhtml.copyImage=/images/editcopy.png
+simplyhtml.cutImage=/images/editcut.png
+simplyhtml.default_paste_mode=PASTE_HTML
+simplyhtml.deleteTableColImage=resources/delCol.gif
+simplyhtml.deleteTableRowImage=resources/delRow.gif
+simplyhtml.edit=undo redo - selectAll cut copy paste pasteOther - findReplace editLink setLinkByFileChooser - print
+simplyhtml.editLinkImage=resources/link.gif
+simplyhtml.findReplaceImage=/images/filefind.png
+simplyhtml.fontBoldImage=/images/Bold16.png
+simplyhtml.fontBoldSelectedIcon=/images/Bold_on16.png
+simplyhtml.fontColorImage=resources/fontColor.gif
+simplyhtml.fontColorSelectedIcon=resources/fontColor.gif
+simplyhtml.fontImage=resources/font.gif
+simplyhtml.fontItalicImage=/images/Italic16.png
+simplyhtml.fontItalicSelectedIcon=/images/Italic_on16.png
+simplyhtml.fontUnderlineImage=/images/uline.png
+simplyhtml.fontUnderlineSelectedIcon=/images/uline_on.png
+simplyhtml.format=font - formatPara fontBold fontItalic fontUnderline fontColor clearFormat - paraAlignLeft paraAlignCenter paraAlignRight - formatList toggleBullets toggleNumbers
+simplyhtml.formatParaImage=resources/fmtPara.gif
+simplyhtml.formatTableImage=resources/fmtTab.gif
+simplyhtml.formatToolBar=fontFamily fontSize - fontBold fontItalic fontUnderline fontColor clearFormat
+simplyhtml.help=about
+simplyhtml.insertImageImage=resources/image.gif
+simplyhtml.insertTableColImage=resources/insCol.gif
+simplyhtml.insertTableImage=resources/table.gif
+simplyhtml.insertTableRowImage=resources/insRow.gif
+simplyhtml.linkType2=http
+simplyhtml.menubar=edit format table help
+simplyhtml.okBtnName=OK
+simplyhtml.paraAlignCenterImage=resources/algnCtr.gif
+simplyhtml.paraAlignCenterSelectedIcon=resources/algnCtr_on.gif
+simplyhtml.paraAlignLeftImage=resources/algnLft.gif
+simplyhtml.paraAlignLeftSelectedIcon=resources/algnLft_on.gif
+simplyhtml.paraAlignRightImage=resources/algnRt.gif
+simplyhtml.paraAlignRightSelectedIcon=resources/algnRt_on.gif
+simplyhtml.paraToolBar=paraAlignLeft paraAlignCenter paraAlignRight - toggleBullets toggleNumbers
+simplyhtml.pasteImage=/images/editpaste.png
+simplyhtml.pasteOtherImage=/images/editpaste.png
+simplyhtml.popup=undo redo - cut copy paste pasteOther
+simplyhtml.printImage=/images/fileprint.png
+simplyhtml.redoImage=/images/redo.png
+simplyhtml.simpleLinkDialog=true
+simplyhtml.splashImage=resources/splashImage.jpg
+simplyhtml.standardStyleName=standard
+simplyhtml.table=insertTable - nextTableCell prevTableCell - appendTableRow appendTableCol - insertTableRow insertTableCol - deleteTableRow deleteTableCol
+simplyhtml.toggleBulletsImage=resources/ul.gif
+simplyhtml.toggleNumbersImage=resources/ol.gif
+simplyhtml.toolBar=print undo redo - cut copy paste - findReplace
+simplyhtml.undoImage=/images/undo.png
+simplyhtml.use_std_styles=false
+single_backup_directory=true
+single_backup_directory_path={freeplaneuserdir}/.backup
+single_instance=true
+single_instance_force=false
slow_scroll_selected_node=true
+spelling_language=en
+spelling_opt_case_sensitive=true
+spelling_opt_ignore_all_caps_words=false
+spelling_opt_ignore_capitalization=true
+spelling_opt_ignore_words_with_numbers=false
+spelling_opt_suggestions_limit_dialog=15
+spelling_opt_suggestions_limit_menu=15
+standard_template=standard.mm
+standardbackgroundcolor=\#ffffff
+standardcloudcolor=\#f0f0f0
+standardcloudestyle=bezier
+standarddrawrectangleforselection=false
+standardedgecolor=\#808080
+standardedgestyle=bezier
+standardlinkcolor=\#000000
+standardlinkestyle=bezier
+standardnodeshape=as_parent
+standardrootnodeshape=fork
+standardselectednodecolor=\#ccffff
+standardselectednoderectanglecolor=\#002080
+status_visible=true
+status_visible.fullscreen=false
+structured_html_import=true
+structured_icon_toolbar=false
+styleScrollPaneVisible=false
+styleScrollPaneVisible.fullscreen=false
+style_block_gap=24 pt
+styledialog.cancel.icon=/images/cancel_button.png
+styledialog.ok.icon=/images/ok_button.png
+tabbed_pane.collapsed=false
+time_for_automatic_save=60 seconds
+time_for_delayed_selection=60
+toolTipManager.dismissDelay=4000
+toolTipManager.initialDelay=750
+toolTipManager.max_tooltip_width=10000
+toolTipManager.max_tooltip_height=10000
+toolTipManager.reshowDelay=500
+toolbarVisible=true
+toolbarVisible.fullscreen=false
+tutorial_map=doc/freeplaneTutorial.mm
+undo_levels=100
+unfold_on_paste=false
+use_common_out_point_for_root_node=false
+use_split_pane=false
+user_defined_screen_resolution=96
+user_zoom=1
+webDocuLocation=http\://freeplane.sourceforge.net/docu.html
+webDownloadLocation=http\://sourceforge.net/project/showfiles.php?group_id\=211069
+webFAQLocation=http\://freeplane.sourceforge.net/faq.html
+webFreeplaneLocation=http\://freeplane.sourceforge.net/
+webUpdateLocation=http\://freeplane.sourceforge.net/info/history/
+wheel_velocity=80
+SplitToWordsAction.nodeNumbersInLine=1, 2, 6, 12
+SplitToWordsAction.leaveOriginalNodeEmpty=true
+SplitToWordsAction.saveOriginalTextAsDetails=true
+copyFormatToNewSibling=false
+copyFormatToNewSiblingIncludesIcons=false
+scrollOnUnfold=false
+remindersBlink=true
+remindersShowNotifications=true
+remindersStandardDelay=5 minutes
+SplitToWordsAction.charactersAcceptedInWord=-
+shouldCenterSmallMaps=true
+indentationUsesTabsInTextOutput=false
+JoinNodesAction.textSeparators={{\\n}} {{ }} {{, }}
+filter.showAncestors=true
+filter.showDescendants=false
+locales=ar,ca,cs,da,de,el,es,et,eu,fr,gl,hr,hu,id,it,ja,ko,lt,nb,nl,nn,pl,pt_BR,pt_PT,ru,sk,sl,sr,sv,tr,uk_UA,zh_CN,zh_TW,en
+org.freeplane.plugin.bugreport.dialog.disabled=false
diff --git a/freeplane/viewer-resources/html/freeplane.css b/freeplane/viewer-resources/html/freeplane.css
new file mode 100644
index 0000000..17e8aa6
--- /dev/null
+++ b/freeplane/viewer-resources/html/freeplane.css
@@ -0,0 +1,12 @@
+li { list-style: none; margin: 0; }
+p { margin: 0; }
+
+span.l { color: red; font-weight: bold; }
+
+a.mapnode:link,
+a.mapnode:visited,
+a.mapnode:active,
+a.mapnode:hover {
+ text-decoration: none; color: black;
+}
+a.mapnode:hover { background: #eeeee0; }
diff --git a/freeplane/resources/images/SetShortenerStateAction.png b/freeplane/viewer-resources/images/SetShortenerStateAction.png
similarity index 100%
rename from freeplane/resources/images/SetShortenerStateAction.png
rename to freeplane/viewer-resources/images/SetShortenerStateAction.png
diff --git a/freeplane/viewer-resources/special_applet.properties b/freeplane/viewer-resources/special_applet.properties
index 4969f64..59deb1b 100644
--- a/freeplane/viewer-resources/special_applet.properties
+++ b/freeplane/viewer-resources/special_applet.properties
@@ -1,3 +1,3 @@
highlight_formulas = false
image_cache=disable
-filter_toolbar_visible=true
\ No newline at end of file
+filter_toolbar_visible=true
diff --git a/freeplane/viewer-resources/translations/Resources_en.properties b/freeplane/viewer-resources/translations/Resources_en.properties
index 3df9c20..e5d6a06 100644
--- a/freeplane/viewer-resources/translations/Resources_en.properties
+++ b/freeplane/viewer-resources/translations/Resources_en.properties
@@ -35,6 +35,7 @@ actual_node_styles=Node conditional styles applied to node
add=&Add
AddConnectorAction.text=Connect
AddElementaryConditionAction.text=Add
+AddExecutionLinkAction.text=Add hyperlink to executing an OS command...
AddLocalLinkAction.text=Add local hyperlink
AddMenuItemLinkAction.text=Add hyperlink to menu item...
AddOnDetailsPanel.authored.by=By {0}
@@ -82,8 +83,8 @@ antialias_all=Antialias all
antialias_edges=Antialias edges
antialias_none=Antialias none
apply=&Apply
-ApplyAction.text=&Apply
-ApplyFormatPlugin.text=&Change format ...
+ApplyAction.text=Apply
+ApplyFormatPlugin.text=Change format ...
ApplyFormatPlugin.tooltip=Presents a dialog in which node and edge attributes can be changed at once.
ApplyNoFilteringAction.text=No filtering
ApplySelectedViewConditionAction.text=Filter selected nodes
@@ -96,6 +97,7 @@ attribute_delete_value=Delete this value
attribute_font_size_tooltip=Attribute font size
attribute_list_box_label_text=Existing values
attribute_name=Attribute Name
+attribute_name_or_value=Attribute name or value
attribute_replace=Replace with
attribute_top=All known attributes for the loaded Maps
attribute_value=Attribute Value
@@ -137,14 +139,19 @@ attributes_visible_tooltip=Selected visible
automatic_layout=Automatic layout
automatic_layout_disabled=disabled
automatically_save_message=Map was automatically saved (using the file name {0}) ...
+AutomaticEdgeColor.FOR_BRANCHES=for branches
+AutomaticEdgeColor.FOR_COLUMNS=for columns
+AutomaticEdgeColor.FOR_LEVELS=for levels
+AutomaticEdgeColor.ON_BRANCH_CREATION=on branch creation
AutomaticEdgeColorHookAction.text=Automatic edge color
AutomaticLayout.ALL=for all nodes
AutomaticLayout.HEADINGS=for non leave nodes
AutomaticLayout.level=Level {0}
AutomaticLayout.level.root=Root
-AutomaticLayoutAction.text=&Apply level styles
+AutomaticLayoutAction.text=Apply level styles
AutomaticLayoutAction.tooltip=<html>Fixes the layout of the map. <br>The first level is black, the second blue, etc.</html>
AutomaticLayoutControllerAction.ALL.text=for all nodes
+AutomaticLayoutControllerAction.COLUMNS.text=for columns
AutomaticLayoutControllerAction.HEADINGS.text=for non leave nodes
AutomaticLayoutControllerAction.null.text=disabled
BackAction.text=Go backward
@@ -161,17 +168,20 @@ branch=Branch
browse=Browse...
calendar_attributes_panel=Calendar and attributes
calendar_panel=Calendar
+can_not_clone_encrypted_node=Can not clone encrypted nodes
can_not_connect_to_info_server=Can not connect to information server
can_not_delete_predefined_style=Can not delete predefined style
can_not_delete_root_style=Can not delete root style
can_not_delete_style_group=Can not delete style group
+can_not_encrypt_cloned_node=Can not encrypt cloned nodes
can_not_save_key_set=Can not save hot key set
cancel=&Cancel
-CancelAction.text=&Cancel
+CancelAction.text=Cancel
cannot_add_parent_diff_parents=All nodes must have the same parent to use this function.
cannot_add_parent_to_root=The root node can't be added to a new parent.
cannot_delete_root=The root node can't be deleted or cut.
cannot_join_nodes_with_children=Cannot join nodes with children
+cannot_move_into_child_node=Can not move into child node
cannot_move_to_child=Can't move a node to one of its children.
CenterAction.text=Center
CenterSelectedNodeAction.text=Center selected node
@@ -196,8 +206,10 @@ choose_node_background_color=Choose node background color:
choose_node_color=Choose node color:
ClearLinkAnchorAction.text=Clear link anchor
ClearLinkAnchorAction.tooltip=<html>clear previously set node anchor</html>
+CloneAction.text=Paste Clone
close_btn=&Close
-CloseAction.text=&Close current map
+CloseAction.text=Close current map
+cloud_shapes=Cloud shapes
CloudAction.text=Add / remove cloud (default)
CloudColorAction.text=Cloud color...
CloudShapeAction.ARC.text=Arc
@@ -214,34 +226,37 @@ connector_label=Connector label
connector_lines=Connector lines
connector_shapes=Connector shapes
ConnectorColorAction.text=Connector color...
-CopyAction.text=&Copy
+ConvertCloneToIndependentNodeAction.text=Unclone
+CopyAction.text=Copy
CopyAction.tooltip=Copy selected branch
-CopyAttributes.text=Copy &attributes
-CopyIDAction.text=Copy node I&D
+CopyAttributes.text=Copy attributes
+CopyIDAction.text=Copy node ID
CopyMapStylesAction.text=Copy map style from...
CopyNodeURIAction.text=Copy node URI
-copyright=Copyright \u00a9 2000-2014 Freeplane team and others
-CopySingleAction.text=Copy node (&single)
+copyright=Copyright \u00A9 2000-2016 Freeplane team and others
+CopySingleAction.text=Copy node (single)
CopySingleAction.tooltip=Copy only the selected node
CopyStyleExtensionsAction.text=Copy extensions from style node
corrupt_map=Map content is corrupted
CreateConjunctConditionAction.text=And
CreateDisjunctConditionAction.text=Or
CreateNotSatisfiedConditionAction.text=Not
-CreationModificationPluginAction.text=Display &modification times
+CreationModificationPluginAction.text=Display modification times
CreationModificationPluginAction.tooltip=<html>This function keeps track of node creation and modification times.</html>
current_dir=Maps
-CutAction.text=Cu&t
+CutAction.text=Cut
decrease_branch_font_size=Smaller font
DecreaseNodeFontAction.text=Smaller font
default=Default
+defaultAuxiliaryWordList=a, the, of
DefaultColorAction.text=Default color
+defaultstyle.attributes=Attributes
defaultstyle.details=Details
defaultstyle.floating=Floating node
defaultstyle.note=Note
delete=&Delete
delete_child=Delete node
-DeleteAction.text=Remove n&ode
+DeleteAction.text=Remove node
DeleteConditionAction.text=Delete
DeleteDetailsAction.text=Remove node details
DeleteLevelStyleAction.text=Remove level style
@@ -263,7 +278,9 @@ edge=Edge
edge_is_formatted_by_style=Edge format is controlled by style. Edit related styles if required.
edge_style=Edge style
edge_width=Edge width
+edge_widths=Edge Widths
EdgeColorAction.text=Edge color...
+EdgeProperties=Edge properties
EdgeStyleAction.bezier.text=Smoothly curved (bezier)
EdgeStyleAction.bezier.tooltip=<html>Display the edge as a smooth curve.</html>
EdgeStyleAction.hide_edge.text=Hide edge
@@ -304,9 +321,11 @@ EditLongAction.text=Edit node core in dialog
EditNoteInDialogAction.text=Edit note in dialog
EditScript=Edit Script...
EditStylesAction.text=Edit styles
-EncryptedMap.text=New protected (encr&ypted) map ...
+EncryptedMap.text=New protected (encrypted) map ...
EncryptedMap.tooltip=New protected map
+encryption=Encryption
enter_base_url=I am going to paste relative links. Enter please base URL.
+enter_command=Enter command
enter_condition_name=Enter new condition name
enter_confirms=&Enter confirms
enter_keyset_name=Enter hot key set name
@@ -320,6 +339,8 @@ error_applying_template=Error applying XSL template.
error_creating_directory=Cannot create directory for export.
error_in_template=Errors in default map template {0}. Try to remove this file.
errornumber={0} errors
+ExecuteScript.available_modes_tooltip={0} is available for
+ExecuteScript.script=Script
ExecuteScriptError.text=Error executing the script:\n{0}
ExecuteScriptForAllNodes.text=Execute all scripts
ExecuteScriptForSelectionAction.text=Execute selected node scripts
@@ -333,7 +354,7 @@ export_failed=Export failed
export_pdf_text=Portable Document Format (PDF)
export_svg_text=Scalable Vector Graphic (SVG)
export_using_xslt=Freeplane Export
-ExportAction.text=&Export map...
+ExportAction.text=Export map...
ExportBranchAction.text=Move branch to new map...
ExportBranchToHTMLAction.text=Branch as HTML
exported_file={0} file
@@ -353,6 +374,7 @@ ExternalImageChangeAction.text=Change image...
ExternalImageRemoveAction.text=Remove image
ExtractLinkFromTextAction.text=Convert link from within text
ExtractLinkFromTextAction.tooltip=Set hyper link from address n node text
+extras=&Tools
f_button_unassigned=<no action>
FaqOpenURLAction.text=FAQ
file=&File
@@ -372,7 +394,7 @@ FileProperties_NodeSelectionCount=Number of selected nodes:
FileProperties_TotalFilteredCount=Number of nodes satisfying filter:
FileProperties_TotalLeafCount=Total number of leaf nodes:
FileProperties_TotalNodeCount=Total number of nodes:
-FilePropertiesAction.text=Map stat&istics...
+FilePropertiesAction.text=Map statistics...
FileRevisionsDialog.cancel=&Cancel
FileRevisionsDialog.file_last_modified=Timestamp
FileRevisionsDialog.file_name=File
@@ -383,10 +405,12 @@ FileRevisionsDialog.question=Found revisions of {0}
FileRevisionsDialog.restore=Rest&ore
FileRevisionsDialog.restore.tooltip=Replace {0} by {1}
FileRevisionsDialog.title=File revisions
-filter=Filter
+filter=F&ilter
filter_add=&Add
filter_and=A&nd
filter_any_text=Core, details or note
+filter_clone_snapshot=Saved clones of selection
+filter_clones=Clones of selection
filter_conditions=Filters
filter_contains=Contains
filter_created_after=Created after
@@ -433,26 +457,33 @@ filter_selected_node_view=Currently selected nodes
filter_selected_node_view_snapshot=Saved selection
filter_style=Style
filter_time=Date filter
-FilterComposerDialog.save=&Save
+FilterCondition=Filter conditions
+filterConditions=User-defined filters
+filterConditions.noActions=No named filters
filters_not_loaded=Filter could not be loaded, file corrupted
+find=Find
find_what=Find what
-FindAction.text=Find...
-FirstGroupNodeAction.text=Summary node (begin of group)
+FindAction.text=&Find...
+FindNextAction.text=Find next
+FindPreviousAction.text=Find previous
+fit_background_to_page=Fit background image to one page
fit_map_to_page=&Fit to one page
fit_map_to_page_height=Fit &height to one page
fit_map_to_page_width=Fit &width to one page
-FitToPage.text=Zoom to &fit to page
+FitToPage.text=Zoom to fit to page
FitToPage.tooltip=Adjusts the zoom such that the entire map fits into the current window.
fold=Fold
FoldAllAction.text=Fold all
FoldAllAction.tooltip=<html>Folds the selected nodes and all their children.</html>
FoldOneLevelAction.text=Fold one level
FoldOneLevelAction.tooltip=<html>Folds the selected nodes by one level.</html>
-follow_graphical_link=Goto:
+follow_clone=Inside ''{0}''
+follow_graphical_link=Goto ''{0}''
FollowLinkAction.text=Follow link
font=Font
FontFamilyAction.text=Font family
FontSizeAction.text=Font size
+format=F&ormat
format_invalid_pattern=Not a valid pattern
format_menu_cloud_shapes=Add cloud or change style
format_menu_edge_styles=&Edge styles
@@ -487,6 +518,8 @@ freeplane_reverted=Freeplane_Reverted_
FreeplaneHelpStarter.text=Help...
FreeplaneHelpStarter.tooltip=Freeplane extended Help
GettingStartedAction.text=Tutorial
+goto=Goto
+goto.noActions=No target nodes
GotoLinkNodeAction.text=Goto Link
GotoNodeAction.text=Goto node with ID...
GrabKeyDialog.common.cancel=Cancel
@@ -502,7 +535,7 @@ help=&Help
HideableAction.tooltip=<html>Marks the background of each changed node.</html>
HideAllAttributesAction.text=Hide all attributes
HierarchicalIcons2Action.text=Show intersection of child icons
-HierarchicalIconsAction.text=Show icons &hierarchically
+HierarchicalIconsAction.text=Show icons hierarchically
HierarchicalIconsAction.tooltip=If one of the (grand)children of me has an icon, I will show this icon in little format, too.
hot_keys=Hot keys
hot_keys_table=Hot keys table
@@ -642,19 +675,21 @@ IconProgressIconUpAction.text=Progress up
IconProgressIconUpAction.tooltip=Increases/ inserts the progress icons (0% -> 25% -> 50% -> 75% -> 100% + OK).
IconProgressRemoveAction.text=Remove progress
IconProgressRemoveAction.tooltip=Removes progress icons and extended progress icon.
+icons=Icons
IconSelectionPlugin.text=Icon from table...
IconSelectionPlugin.tooltip=<html>Here you can select an icon using a subwindow.</html>
image_covertLink=Convert link to image
ImageFlavorHandler=Image (use separate file)
-import=Import
+import=I&mport
import_linked_branch_no_link=The selected node has no link to import from.
-ImportAction.text=&Import map
-ImportBranchAction.text=&Branch...
-ImportExplorerFavoritesAction.text=&Explorer favorites...
-ImportFolderStructureAction.text=&Folder structure...
-ImportLinkedBranchAction.text=&Linked branch
-ImportLinkedBranchWithoutRootAction.text=Linked branch &without root...
-ImportMindmanagerFiles.text=&MindManager X5 map...
+ImportAction.text=Import map
+ImportBranchAction.text=Branch...
+ImportExplorerFavoritesAction.text=Explorer favorites...
+ImportFolderStructureAction.text=Folder structure...
+ImportLinkedBranchAction.text=Linked branch
+ImportLinkedBranchWithoutRootAction.text=Linked branch without root...
+ImportMindmanagerFiles.text=MindManager X5 map...
+ImportXmlFile.text=Import xml file
increase_branch_font_size=Larger font
IncreaseNodeFontAction.text=Larger font
internal_error_tooltip=Internal errors occurred. Click to open the latest log file log.0 for more info.
@@ -666,22 +701,31 @@ invalid_url_msg=Couldn''t create valid URL for {0}
ItalicAction.text=Italic
italicise_branch=Italicise
java_version=Java version: {0}
-JoinNodesAction.text=Join nodes
+JoinNodesAction.separator.format=Join nodes with "{0}"
+lastOpenedMaps=Most recent maps
+lastOpenedMaps.noActions=No maps in history
latex_editor=Edit LaTeX Formula
-LatexDeleteLatexAction.text=Remove LaTe&X formula
-LatexEditLatexAction.text=Edit &LaTeX formula...
+LatexDeleteLatexAction.text=Remove LaTeX formula
+LatexEditLatexAction.text=Edit LaTeX formula...
LatexInsertLatexAction.msg1=<html>You are trying to insert a <i>legacy</i> LaTeX formula.<br/>The new way to create LaTeX text/formulae is described on this page:</html>
LatexInsertLatexAction.msg2=<html>In short: <ul><li>use a "\\latex " prefix in node text or</li><li><i>View->Properties panel</i>, then <i>Core text->Format->Latex</i></li></ul></html>
-LatexInsertLatexAction.text=Add &LaTeX formula...
+LatexInsertLatexAction.text=Add LaTeX formula...
latexPatternFormat=LaTeX
+LengthUnits.cm=cm
+LengthUnits.in=in
+LengthUnits.mm=mm
+LengthUnits.pt=pt
+LengthUnits.px=px
less_than_two_selected_nodes=You have to select at least two nodes to get links.
license=License: GPL 2 or later
license_text=<html>This program is free software; you can redistribute it and/or<br>modify it under the terms of the GNU General Public License<br>as published by the Free Software Foundation; either version 2<br>of the License, or (at your option) any later version.<br><br>This program is distributed in the hope that it will be useful,<br>but WITHOUT ANY WARRANTY; without even the implied warranty of<br>MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>GNU General Public [...]
link_error=Incorrect link "{0}" not loaded
link_not_available_any_more=The link is not valid anymore. The node was deleted in between.
link_not_found=Link {0} not found.
+links=Link
load=&Load
load_accelerator_presets=Load
+load_accelerator_presets.noActions=No presets
LoadAcceleratorPresetsAction.textPatterns.text=Text Patterns
locking_failed_by_open=Locking of the map {0} failed. Opening as read-only.
locking_failed_by_save_as=Locking of the map {0} failed. Action Save As aborted.
@@ -689,6 +733,7 @@ locking_old_lock_removed=The map {0} was locked by the user {1}. The lock has be
long_node_changed_cancel=You have changed the node. Do you want to discard changes?
long_node_changed_submit=You have changed the node. Do you want to save changes?
lots_of_links_warning=You are going to create a lot of links to the same node. Do you really want to create these links?
+main_menu=Menu
main_resource_directory=Installation resources: {0}
MainView.errorUpdateText=Error setting the text for the following input: {0}.
MakeLinkFromAnchorAction.text=Make link from anchor
@@ -727,15 +772,20 @@ ManageAddOnsDialog.tab.manage.themes=Themes
ManageAddOnsDialog.tab.manage.themes.tooltip=Manage installed themes
ManageAddOnsDialog.tab.manage.tooltip=Manage installed add-ons
ManageAddOnsDialog.visit.addon.page=Visit add-on page...
-ManageConditionalStylesAction.text=&Manage conditional styles for map
-ManageNodeConditionalStylesAction.text=M&anage conditional styles for node
+ManageConditionalStylesAction.text=Manage conditional styles for map
+ManageNodeConditionalStylesAction.text=Manage conditional styles for node
map_already_exists=The map already exists. Do you want to overwrite it?
+map_background=Map background
+map_background_image=Background image
map_corrupted=Map corrupted. View detail?
map_load_error=Could not load map {0}
map_locked_by_open=The map {0} is already being edited by the user {1}. Opening as read-only.
map_locked_by_save_as=The map {0} is being edited by the user {1}. Action Save As aborted.
map_not_saved=The map was not saved before.
-MapBackgroundColorAction.text=Map background color
+MapBackgroundClearAction.text=Clear
+MapBackgroundColorAction.text=Background color
+MapBackgroundImageAction.text=Background Image...
+maps=Maps
MaxNodeWidth.text=Set maximum node width
menu_applyStyle=Apply style
menu_attributes=&Attribute
@@ -747,10 +797,6 @@ menu_displayAttributes=Node attributes
menu_encryption=Password protection
menu_error=Error in user defined menu structure {0}:\n{1}\nAborting
menu_extensions=Node extensions
-menu_extras=&Tools
-menu_file_import=I&mport
-menu_filter=F&ilter
-menu_format=F&ormat
menu_group=Node group
menu_hoverView=Tool tips
menu_iconByCategory=Icon by category...
@@ -758,26 +804,20 @@ menu_iconView=Icons
menu_image=Image
menu_insert=In&sert
menu_latex_formula=LaTeX formula
-menu_links=Link
menu_manageStyles=&Manage Styles
menu_moveNode=Move and sort
-menu_navigate=&Navigate
menu_newNode=New node
menu_node=Node
menu_node_features=Node Feat&ures
menu_nodes=&Nodes
menu_nodeView=Node core
-menu_notes=Note
menu_noteView=Notes
menu_openmaps=Maps
-menu_progress=Progress icon (%)
menu_remove_icons=Remove icons
menu_removeAttribute=Remove attribute
menu_select=Select
menu_time=Time management
menu_title=Node core
-menu_toolbars=Toolbars
-menu_view=&View
menu_viewmode=View settings
MenuUtils.invalid_menuitem={0} is not a valid menu item key.
mindmap=Map
@@ -791,18 +831,21 @@ mode_File=File mode
mode_MindMap=Mind map mode
mode_na=Mode not available
mode_status=Mode changed to {0}
+mode_StyleMap=Style editing
mode_title=Freeplane - {0}
modes=Modes
ModesMenuAction.Browse.text=Map browser
ModesMenuAction.File.text=File explorer
ModesMenuAction.MindMap.text=Mind map editor
most_recent_files=Most recent maps
+MoveAction.text=Move
MoveToRootAction.text=Goto root
NameConditionAction.text=Set name
+navigate=&Navigate
NavigationNextMapAction.text=Next map
NavigationPreviousMapAction.text=Previous map
new=&New
-new_map_from_user_templates.text=New map from &template...
+new_map_from_user_templates.text=New map from template...
new_mindmap=New Mindmap
new_node=New Node
new_node_as_sibling_not_possible_for_the_root=New node as sibling is not possible for the root
@@ -819,11 +862,11 @@ NewerFileRevisionsFoundDialog.question=Found newer revisions of {0}!
NewerFileRevisionsFoundDialog.restore=Rest&ore
NewerFileRevisionsFoundDialog.restore.tooltip=Replace {0} by {1}
NewerFileRevisionsFoundDialog.title=Newer file revisions found!
-NewFreeNodeAction.text=New free node
+NewFreeNodeAction.text=New floating node
NewLevelStyleAction.text=Add level style
newmap.install.addon.question={0} seems to be an add-on package\nDo you want to install it?\n(Select "No" for normal open.)
newmap.install.addon.title=Install add-on?
-NewMapAction.text=&New map
+NewMapAction.text=New map
NewMapViewAction.text=New map view
NewParentNode.text=New parent node
NewParentNode.tooltip=<html>All selected are sent to a new parent.</html>
@@ -848,10 +891,11 @@ node=Node
node_changed_discard_changes=You have changed the node. Do you want to discard changes?
node_is_write_protected=Target node is write protected.
node_location_help=Dragging changes node location, ctrl+dragging changes distances, double click and ctrl+double click reset them.
+node_popup_scripting=Scripts
node_selector=Node Selection
node_selector_message=Double Click to select Node
node_styles=Node styles
-NodeBackgroundColorAction.text=&Node background color...
+NodeBackgroundColorAction.text=Node background color...
NodeColorAction.text=Node color...
NodeColorBlendAction.text=Blend color
NodeDownAction.text=Move node (Sibling down)
@@ -859,21 +903,29 @@ NodeExtensions.EditNodeExtensions=Edit node extensions
NodeExtensions.RemoveNodeExtensions=Remove node extensions
NodeListAction.text=Find and replace...
NodeListAction.tooltip=Shows all nodes as a searchable list with filter properties.
-NodeShapeAction.bubble.text=&Bubble
-NodeShapeAction.fork.text=&Fork
+NodeShapeAction.bubble.text=Bubble
+NodeShapeAction.fork.text=Fork
+NodeShapeAction.narrow_hexagon.text=Narrow hexagon
+NodeShapeAction.oval.text=Oval
+NodeShapeAction.rectangle.text=Rectangle
+NodeShapeAction.wide_hexagon.text=Wide hexagon
NodeUpAction.text=Move node (Sibling up)
-NodeWidthAction.text=Set node width limits
nonboldify_branch=Unboldify
nonitalicise_branch=Unitalicise
normal=Normal
not_saved_for_image_error=The map must be saved before you can set an image by file chooser
not_saved_for_link_error=The map must be saved before you can set a link by file chooser
note_window_location=Note panel position
+notes=Note
+NotificationOptions.CLOSE=Close
+NotificationOptions.REMIND_ME_LATER=Remind me later
+NotificationOptions.REMOVE_REMINDER=Remove reminder
+NotificationOptions.SELECT_NODE=Go to reminder
ok=&OK
-OKAction.text=&OK
+OKAction.text=OK
OnlineReference.text=Documentation Maps Online
open_asMindMap=Mind Map
-OpenAction.text=&Open saved map...
+OpenAction.text=Open saved map...
OpenFreeplaneSiteAction.text=Freeplane's Homepage
OpenMapsAddLocation.text=Add OpenMaps Location...
OpenMapsRemoveLocation.text=Remove OpenMaps Location
@@ -897,6 +949,7 @@ OptionPanel.always_load_last_maps.tooltip=Open last files set by above options,
OptionPanel.always_save_folding=Always
OptionPanel.always_save_folding_state=Always save folding state changes
OptionPanel.always_save_folding_state.tooltip=If checked, each folding action makes the map dirty and reminds you to save it.
+OptionPanel.always_show_less_than_N_nodes_after_load=Unfold some nodes
OptionPanel.always_unfold_all_after_load=Unfold all
OptionPanel.antialias=Antialias
OptionPanel.antialias.tooltip=<html>Determines the quality of the map. More antialias needs more time.</html>
@@ -907,7 +960,7 @@ OptionPanel.Appearance=Appearance
OptionPanel.apply_system_screen_resolution=Apply system screen resolution default
OptionPanel.approximate_search_threshold=Threshold for approximate matching
OptionPanel.approximate_search_threshold.tooltip=<html>Threshold for approximate matching<br/><font size="2">see http://freeplane.sf.net/wiki/index.php/Approximate_search</font><br/>(the higher the fewer variations<br/>of the search term will be found)</html>
-OptionPanel.ar=Arabic / \u0627\u0644\u0639\u0631\u0628\u064a\u0629
+OptionPanel.ar=Arabic / \u0627\u0644\u0639\u0631\u0628\u064A\u0629
OptionPanel.ARC=Arc
OptionPanel.as_parent=As parent
OptionPanel.ask=Ask
@@ -919,7 +972,7 @@ OptionPanel.backup_file_number=Number of kept backup files
OptionPanel.Behaviour=Behaviour
OptionPanel.bezier=Smoothly curved (bezier)
OptionPanel.bubble=Bubble
-OptionPanel.ca=Catalan, Valencian / Catal\u00e0
+OptionPanel.ca=Catalan, Valencian / Catal\u00E0
OptionPanel.Cancel=Cancel
OptionPanel.center_selected_node=Center selected node automatically
OptionPanel.check_updates_automatically=Check for updates on program start
@@ -934,7 +987,9 @@ OptionPanel.combined=Combined
OptionPanel.compare_as_number=Compare as numbers
OptionPanel.convert_to_current_version=<html>Automatically convert maps of older Freeplane versions <br>to the current version?</html>
OptionPanel.convert_to_current_version.tooltip=<html>Only for very big maps that don't need to be converted <br>(this is expert knowledge) you can open the maps without conversion.</html>
-OptionPanel.cs=Czech / \u010desky
+OptionPanel.copyFormatToNewSibling=Copy format to new siblings
+OptionPanel.copyFormatToNewSiblingIncludesIcons=Copy format with icons
+OptionPanel.cs=Czech / \u010Desky
OptionPanel.cut_nodes_without_question=Cut nodes without confirmation?
OptionPanel.cut_nodes_without_question.tooltip=If this check box is set the nodes are cut without confirmation. This can cause loss of information if pressed without intention.
OptionPanel.da=Danish / dansk
@@ -955,6 +1010,7 @@ OptionPanel.default_browser_command_windows_9x.tooltip=<html>For Windows (the ""
OptionPanel.default_browser_command_windows_nt=Default browser command Windows Nt
OptionPanel.default_browser_command_windows_nt.tooltip=<html>For Windows (the "" signs are necessary due to links, that have "=" in their URL).</html>
OptionPanel.default_charset=Charset
+OptionPanel.default_save_dir=Default save directory
OptionPanel.Defaults=Defaults
OptionPanel.delete_automatic_saves_at_exit=Delete automatic saves at exit
OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> If the files should be deleted automatically on a normal shutdown of Freeplane set the following variable to true</html>
@@ -974,7 +1030,7 @@ OptionPanel.EDIT_CURRENT=Overwrite content
OptionPanel.edit_on_double_click=Edit on double click
OptionPanel.editor_extra_width=Extra width step
OptionPanel.editor_extra_width.tooltip=<html>Determines the number of pixels to increase the width of a node if the text extends the current width.</html>
-OptionPanel.el=Greek / \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+OptionPanel.el=Greek / \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC
OptionPanel.el__buttons_above=Buttons at the top
OptionPanel.el__enter_confirms_by_default=Enter confirms by default
OptionPanel.el__max_default_window_height=Max default window height
@@ -984,8 +1040,9 @@ OptionPanel.el__min_default_window_width=Min default window width
OptionPanel.el__position_window_below_node=Position window below node
OptionPanel.en=English / English
OptionPanel.Environment=Environment
-OptionPanel.es=Spanish, Castilian / espa\u00f1ol, castellano
+OptionPanel.es=Spanish, Castilian / espa\u00F1ol, castellano
OptionPanel.et=Estonian / eesti, eesti keel
+OptionPanel.eu=Basque
OptionPanel.execute_scripts_without_asking=Script execution enabled
OptionPanel.execute_scripts_without_asking.tooltip=<html>Freeplane scripts are principally able to perform any action on your computer. <br>Thus, you shouldn't execute scripts you don't know to be safe.</html>
OptionPanel.execute_scripts_without_exec_restriction=Permit to execute other applications (NOT recommended)
@@ -1003,6 +1060,7 @@ OptionPanel.export_icons_in_html.tooltip=<html> Tell if HTML exported from Freep
OptionPanel.exported_image_resolution_dpi=Exported image resolution (in DPI)
OptionPanel.Files=Files
OptionPanel.first=First
+OptionPanel.fit_to_viewport=Fit background image to Window
OptionPanel.fold_on_click_inside=Fold on click inside
OptionPanel.foldingsymbolwidth=Folding symbol width
OptionPanel.foldingsymbolwidth.tooltip=<html>Width of the folding marking circle</html>
@@ -1011,7 +1069,7 @@ OptionPanel.format_locale=Locale for formats
OptionPanel.format_locale.tooltip=Localization setting for formatting and data parsing
OptionPanel.formula_disable_caching=Disable formula evaluation cache
OptionPanel.formula_disable_plugin=Disable formula evaluation
-OptionPanel.fr=French / Fran\u00e7ais
+OptionPanel.fr=French / Fran\u00E7ais
OptionPanel.gl=Galician / Galego
OptionPanel.goto_note_end_on_edit=Move note cursor to the end
OptionPanel.grid_size=Grid gap size
@@ -1041,11 +1099,13 @@ OptionPanel.id=Indonesian / Bahasa Indonesia
OptionPanel.IGNORE=Do nothing
OptionPanel.il__enter_confirms_by_default=Enter confirms by default
OptionPanel.image_cache=for images
+OptionPanel.indentationUsesTabsInTextOutput=Use tabs in text output
OptionPanel.it=Italian / Italiano
-OptionPanel.ja=Japanese / \u65e5\u672c\u8a9e
+OptionPanel.ja=Japanese / \u65E5\u672C\u8A9E
+OptionPanel.JoinNodesAction.textSeparators=Text separator
OptionPanel.key_type_action=On key type
OptionPanel.Keystrokes=Keystrokes
-OptionPanel.ko=Korean / \ud55c\uad6d\uc5b4 (\u97d3\u570b\u8a9e), \uc870\uc120\ub9d0 (\u671d\u9bae\u8a9e)
+OptionPanel.ko=Korean / \uD55C\uAD6D\uC5B4 (\u97D3\u570B\u8A9E), \uC870\uC120\uB9D0 (\u671D\u9BAE\u8A9E)
OptionPanel.label_font_family=Font family
OptionPanel.label_font_size=Font size
OptionPanel.language=Language
@@ -1082,7 +1142,8 @@ OptionPanel.max_shortened_text_length=Maximum shortened text width
OptionPanel.metal=Metal
OptionPanel.min_node_width=Min node width
OptionPanel.motif=Motif
-OptionPanel.nb=Norwegian Bokm\u00e5l / Norsk bokm\u00e5l
+OptionPanel.narrow_hexagon=Narrow hexagon
+OptionPanel.nb=Norwegian Bokm\u00E5l / Norsk bokm\u00E5l
OptionPanel.never_save_folding=Never
OptionPanel.nl=Dutch, Flemish / Nederlands, Vlaams
OptionPanel.nn=Norwegian Nynorsk / Norsk nynorsk
@@ -1099,8 +1160,7 @@ OptionPanel.nodeformat=Format
OptionPanel.nodeformat.tooltip=<html>Text replacement and/or formatting:<ul><li><em>Template expansion</em> (<tt>%s</tt> is the original text), e.g. <tt>BEWARE: %s</tt><li><em>Formatting of dates and numbers</em> - see the examples in the selection box</ul></html>
OptionPanel.nodenumbering=Node numbering
OptionPanel.nodenumbering.tooltip=Adds serial number (e.g. 1.3.1) to the node text.
-OptionPanel.nodeshape=Node style
-OptionPanel.nodeshape.tooltip=<html>The style describes the outer form of a node. <br>Possible values:<br><table border="1"><tr><td>fork: </td><td> without surrounding box,</td></tr><tr><td>bubble: </td><td> node with a surrounding rectangle,</td></tr><tr><td>As parent: </td><td> take the style from the parent node <br>or the default root node style for the root node,</td></tr><tr><td>Combined: </td><td> Bubble when node is folded, fork otherwise.</td></tr></table></html>
+OptionPanel.nodeshape=Node shape
OptionPanel.nodetext=Core text
OptionPanel.nodetext.tooltip=Here, you can define the node's text. The former text is discarded when such a pattern is applied.
OptionPanel.nothing=Nothing
@@ -1116,9 +1176,14 @@ OptionPanel.org.freeplane.plugin.bugreport.denied=Never send
OptionPanel.org.freeplane.plugin.bugreport.userid=Optional identifier to be sent
OptionPanel.outline_hgap=Horizontal distance
OptionPanel.outline_vgap=Vertical distance
+OptionPanel.oval=Oval
OptionPanel.paint_connectors_behind=Paint connectors behind nodes
OptionPanel.parse_data=Recognize input of numbers and date-time
OptionPanel.parse_data.tooltip=Try to parse date, date-time and number input and apply standard formats. Examples: 100,000.00, 12/31, 12/31/99, 1999-12-31 and 1999-12-31 23:59
+OptionPanel.parse_formulas=Recognize formulas
+OptionPanel.parse_formulas.tooltip=Parse formulas on nodes starting with '=': See http://www.freeplane.org/wiki/index.php/Formulas.
+OptionPanel.parse_latex=Recognize LaTeX
+OptionPanel.parse_latex.tooltip=Recognize LaTeX formulas by format or prefix: See http://www.freeplane.org/wiki/index.php/LaTeX_in_Freeplane.
OptionPanel.PASTE_HTML=Paste as HTML
OptionPanel.PASTE_PLAIN_TEXT=Paste as plain-text
OptionPanel.path_property_may_not_be_empty=Path property may not be empty! Change has been reverted.
@@ -1133,12 +1198,16 @@ OptionPanel.presentation_dimmer_transparency=Presentation dimmer transparenty
OptionPanel.presentation_mode=Presentation mode
OptionPanel.printonwhitebackground=<html>White background for printing</html>
OptionPanel.printonwhitebackground.tooltip=<html>Always use white background for printing</html>
-OptionPanel.pt_BR=Portuguese (Brasil) / Portugu\u00eas (Brasil)
-OptionPanel.pt_PT=Portuguese (Portugal) / Portugu\u00eas (Portugal)
+OptionPanel.pt_BR=Portuguese (Brasil) / Portugu\u00EAs (Brasil)
+OptionPanel.pt_PT=Portuguese (Portugal) / Portugu\u00EAs (Portugal)
OptionPanel.RECT=Rectangle
+OptionPanel.rectangle=Rectangle
OptionPanel.relative=Relative
OptionPanel.remind_type_of_new_nodes.tooltip=<html>"Ask" will ask you (use in doubt).<br>"Yes" displays the rich text editor.<br>"No" displays the plain text editor.</html>
OptionPanel.remind_use_rich_text_in_new_nodes=Use rich text for pasted nodes
+OptionPanel.remindersBlink=Reminders blink
+OptionPanel.remindersShowNotifications=Reminders show notification popups
+OptionPanel.remindersStandardDelay=Reminder delay
OptionPanel.remove_notes_without_question=Remove notes without question?
OptionPanel.remove_notes_without_question.tooltip=If this check box is set the notes belonging to the selected nodes are removed without confirmation. This can cause loss of information if pressed without intention.
OptionPanel.resources_use_default_font_for_notes_too=Use default font for notes too
@@ -1146,9 +1215,10 @@ OptionPanel.resources_use_margin_top_zero_for_notes=Remove top margin for notes
OptionPanel.revision_color=Revision color
OptionPanel.revision_color.tooltip=Background color for the changed nodes.
OptionPanel.ROUND_RECT=Round Rectangle
-OptionPanel.ru=Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439
+OptionPanel.ru=Russian / \u0420\u0443\u0441\u0441\u043A\u0438\u0439
OptionPanel.save_folding=Save folding
OptionPanel.save_folding_if_map_is_changed=If map is changed
+OptionPanel.save_last_visited_node=Save last position in map
OptionPanel.save_modification_times=Save modification times
OptionPanel.script_classpath=Script classpath: Additional directories containing classes and/or JARs (see tooltip)
OptionPanel.script_classpath.tooltip=<html>A list of JARs and/or directories to add to the classpath of scripts and formulas.<br>Use ; (Windows) or : (Linux, Mac) to separate entries.<br>Directories will be scanned for JARs and for .class files.<br>Paths that are not absolute are considered relative to the Freeplane user directory.<br>If you set the classpath you have to permit read access too!</html>
@@ -1160,6 +1230,7 @@ OptionPanel.script_user_key_name_for_signing=Optional user key alias for signing
OptionPanel.script_user_key_name_for_signing.tooltip=<html>If you want to sign your scripts, enter the alias of the key here. <br>The key is expected to reside in the default keystore. <br>The password of the key's secret key must coincide with the keystore password (this is the default).</html>
OptionPanel.scrollbar_increment=Speed
OptionPanel.scrolling_speed=Automatic map scrolling speed
+OptionPanel.scrollOnUnfold=Scroll map after unfolding a node
OptionPanel.selection_method=Selection method
OptionPanel.selection_method.tooltip=<html> with the following switch you can enable/disable the delayed selection scheme. Auto options. Do not modify these as they will be saved to auto.properties anyway.</html>
OptionPanel.selection_method_by_click=By click
@@ -1193,6 +1264,7 @@ OptionPanel.separator.icon_properties=Icons
OptionPanel.separator.icons=Icons in "Select icon..."
OptionPanel.separator.initial_map_size=Initial map size
OptionPanel.separator.inline_editor=In-line node editor
+OptionPanel.separator.JoinNodesAction=Joining nodes
OptionPanel.separator.key_typing=Key typing
OptionPanel.separator.language=Language
OptionPanel.separator.latex=LaTeX
@@ -1213,6 +1285,7 @@ OptionPanel.separator.other_defaults=Other Defaults
OptionPanel.separator.others=Other key bindings
OptionPanel.separator.outline_view=Outline view
OptionPanel.separator.patterns=Patterns
+OptionPanel.separator.reminderOptions=Reminder options
OptionPanel.separator.RichTextEditor=Rich-Text Editor
OptionPanel.separator.root_node_appearance=Root node appearance
OptionPanel.separator.save=Save
@@ -1224,6 +1297,7 @@ OptionPanel.separator.selection_method=Selection method
OptionPanel.separator.single_instance_mode=Single program instance
OptionPanel.separator.size_limits=Size limits
OptionPanel.separator.spelling=Spell checker options
+OptionPanel.separator.SplitToWordsAction=Splitting node to words
OptionPanel.separator.status=Status line
OptionPanel.separator.tooltip=Tooltip times
OptionPanel.separator.undo=Undo
@@ -1232,9 +1306,13 @@ OptionPanel.set_property_text=Change
OptionPanel.set_property_text.tooltip=Check to change this style property
OptionPanel.setscript=Change?
OptionPanel.setscript.tooltip=A script can be associated to the style.
+OptionPanel.shape_horizontal_margin=Horizontal margin
+OptionPanel.shape_vertical_margin=Vertical margin
OptionPanel.sharp_bezier=Sharply curved (bezier)
OptionPanel.sharp_linear=Sharp linear
+OptionPanel.shouldCenterSmallMaps=Center small maps
OptionPanel.show_icon_for_attributes=Show icon for attributes
+OptionPanel.show_less_than_N_nodes_by_default_after_load=Load from map or unfold some nodes
OptionPanel.show_node_tooltips=Display tool tips
OptionPanel.show_note_icons=Show note icons
OptionPanel.show_styles_in_tooltip=Display node styles in tool tips
@@ -1248,8 +1326,8 @@ OptionPanel.single_backup_directory_path.tooltip=<html>Overrides default <fre
OptionPanel.single_instance=Open files in a running instance
OptionPanel.single_instance_force=Avoid a second instance in any case
OptionPanel.single_instance_force.tooltip=Avoid a second instance even if there is no file to load
-OptionPanel.sk=Slovak / sloven\u010dina
-OptionPanel.sl=Slovene / sloven\u0161\u010dina
+OptionPanel.sk=Slovak / sloven\u010Dina
+OptionPanel.sl=Slovene / sloven\u0161\u010Dina
OptionPanel.slow_scroll_selected_node=Slow scrolling to selected node
OptionPanel.spelling_opt_case_sensitive=Case sensitive
OptionPanel.spelling_opt_ignore_all_caps_words=Ignore all upper case words.
@@ -1257,7 +1335,12 @@ OptionPanel.spelling_opt_ignore_capitalization=Ignore capital letters at word be
OptionPanel.spelling_opt_ignore_words_with_numbers=Ignore words with numbers
OptionPanel.spelling_opt_suggestions_limit_dialog=Maximum count of suggestions in the dialog
OptionPanel.spelling_opt_suggestions_limit_menu=Maximum count of suggestions in the menu
-OptionPanel.sr=Serbian / \u0441\u0440\u043f\u0441\u043a\u0438
+OptionPanel.SplitToWordsAction.auxiliaryWordList=auxiliary word list
+OptionPanel.SplitToWordsAction.charactersAcceptedInWord=characters in words
+OptionPanel.SplitToWordsAction.leaveOriginalNodeEmpty=leave original node empty
+OptionPanel.SplitToWordsAction.nodeNumbersInLine=node number in row
+OptionPanel.SplitToWordsAction.saveOriginalTextAsDetails=save original text as details
+OptionPanel.sr=Serbian / \u0441\u0440\u043F\u0441\u043A\u0438
OptionPanel.standard_template=Standard template file
OptionPanel.standardbackgroundcolor=Standard Background color
OptionPanel.standardbackgroundcolor.tooltip=<html>The standard background color in html notation </html>
@@ -1276,27 +1359,32 @@ OptionPanel.standardselectednodecolor.tooltip=<html>The standard node color if s
OptionPanel.standardselectednoderectanglecolor=Selected node bubble color
OptionPanel.standardselectednoderectanglecolor.tooltip=<html>The color of buble marking selected nodes. In html notation (#RRGGBB in hex values) </html>
OptionPanel.STAR=Star
+OptionPanel.statesymbolwidth=State symbol width
OptionPanel.structured_html_import=Import HTML as node structure
OptionPanel.structured_icon_toolbar=Structured icon toolbar
OptionPanel.summary=Summary
OptionPanel.sv=Swedish / svenska
OptionPanel.text.use_ctrl_key=Use 'Assign short cut' from the Tools menu
+OptionPanel.textalignment=Text Alignment
OptionPanel.time_for_automatic_save=Time for automatic save
OptionPanel.time_for_automatic_save.tooltip=<html> time between two consecutive automatic saving actions (in msec): To disable automatic saving set this number to 2000000000.</html>
OptionPanel.time_for_delayed_selection=Time for delayed selection
OptionPanel.time_for_delayed_selection.tooltip=<html> Selection time delay of nodes when mouse is over (in msec). Change this value to 1 if you want direct selection on mouse over.</html>
OptionPanel.toolTipManager.dismissDelay=Dismiss delay, ms
OptionPanel.toolTipManager.initialDelay=Initial delay, ms
-OptionPanel.toolTipManager.max_tooltip_width=Node tool tip width
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>The default tooltip width in pixels.</html>
+OptionPanel.toolTipManager.max_tooltip_height=Maximal node tool tip height
+OptionPanel.toolTipManager.max_tooltip_height.tooltip=The maximal tool tip height in pixels.
+OptionPanel.toolTipManager.max_tooltip_width=Maximal node tool tip width
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=The maximal tool tip width in pixels.
OptionPanel.toolTipManager.reshowDelay=Reshow delay, ms
OptionPanel.tr=Turkish / T\u00FCrk\u00E7e
-OptionPanel.uk_UA=Ukrainian / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430
+OptionPanel.uk_UA=Ukrainian / \u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430
OptionPanel.undefined_font=Undefined font
OptionPanel.undo_levels=Undo levels
OptionPanel.undo_levels.tooltip=<html>Determines how many steps are stored that can be undone via "Undo".</html>
OptionPanel.unfold_on_paste=Unfold node on paste
OptionPanel.unfold_on_paste.tooltip=Unfold node on paste or Drag-And-Drop
+OptionPanel.uniform_shape=Uniform
OptionPanel.use_common_out_point_for_root_node=Edges start from one point at root node
OptionPanel.use_common_out_point_for_root_node.tooltip=Edges start from one point at root node
OptionPanel.use_tabbed_pane=Use Tabs
@@ -1309,12 +1397,15 @@ OptionPanel.validate_invalid_number_format=Invalid standard number format
OptionPanel.validate_write_without_read=Scripting: consider to add Read/File to Write/File.
OptionPanel.validation_error=<html><body>Validation error(s):<p><em>{0}</em><p>Please change the preferences to fix the error(s).</body></html>
OptionPanel.validation_warning=<html><body>Validation warning(s):<p><em>{0}</em></body></html>
-OptionPanel.vi=Vietnamese / Ti\u1ebfng Vi\u1ec7t
+OptionPanel.vertical_child_gap=Child gap
+OptionPanel.vertical_child_gap.tooltip=Vertical distance between child nodes
+OptionPanel.vi=Vietnamese / Ti\u1EBFng Vi\u1EC7t
OptionPanel.wheel_velocity=Speed
OptionPanel.wheel_velocity.tooltip=A higher value results in fast mouse wheel move effects on the map.
+OptionPanel.wide_hexagon=Wide hexagon
OptionPanel.windows=Windows
-OptionPanel.zh_CN=Chinese, simplified / \u7b80\u4f53\u5b57
-OptionPanel.zh_TW=Chinese, traditional / \u7e41\u9ad4\u5b57
+OptionPanel.zh_CN=Chinese, simplified / \u7B80\u4F53\u5B57
+OptionPanel.zh_TW=Chinese, traditional / \u7E41\u9AD4\u5B57
org.freeplane.plugin.bugreport.agree=Send
org.freeplane.plugin.bugreport.always_agree=Always send
org.freeplane.plugin.bugreport.always_deny=Never send
@@ -1331,8 +1422,8 @@ out_of_memory=Out of memory.
overwrite_keyset_question=Overwrite existing key set?
PageAction.text=Print setup...
password_is_not_ascii=Password is not ASCII
-PasteAction.text=&Paste
-PasteAttributes.text=Paste att&ributes
+PasteAction.text=Paste
+PasteAttributes.text=Paste attributes
PatternNewNameProperty=New Pattern
PatternToString.backgroundColor=Background color
PatternToString.Child=Child node style
@@ -1400,10 +1491,11 @@ plugins/TimeManagement.xml_WindowTitle=Manage time
plugins/TimeManagement.xml_WindowTitle_All_Nodes=Search & replace
preferences=Preferences
print_preview_title=Print preview
-PrintAction.text=&Print map...
+PrintAction.text=Print map...
PrintDirectAction.text=Print
printing_settings=Print scaling
-PrintPreviewAction.text=Print pre&view...
+PrintPreviewAction.text=Print preview...
+progress=Progress icon (%)
PropertyAction.dialog=Preferences
PropertyAction.text=Preferences ...
QuickFilterAction.text=Quick filter
@@ -1411,7 +1503,7 @@ QuickFindAction.BACK.text=Find previous
QuickFindAction.FORWARD.text=Find next
QuickFindAllAction.text=Select all matching nodes
QuickHighlightAction.text=Highlight all matching nodes
-QuitAction.text=&Quit Freeplane
+QuitAction.text=Quit Freeplane
read_only=Read Only
ReadScriptError.text=Error reading the script
really_convert_to_current_version=<html>This map was created with an older version of Freeplane. <br>Should it be converted (recommended)? <br>(Otherwise it is taken as it is without guarantee.) </html>
@@ -1422,13 +1514,16 @@ really_remove_notes=Really remove the note(s)?
ReapplyFilterAction.text=Reapply filter action
red=Red
RedefineStyleAction.text=Redefine style
-RedoAction.text=&Redo
+RedoAction.text=Redo
RedoFilterAction.text=Redo filter action
regular_expressions=Regular expressions
ReminderHookAction.text=Remove reminder
ReminderHookAction.tooltip=Removes a reminder from a node.
+reminderNotification=Reminder notification
remove_file_from_list_on_error=File {0} not opened. Remove it from the last opened file list?
remove_shortcut_question=Replace shortcut?
+RemoveAllAlwaysUnfoldedNodeFlagsAction.text=Reset unfolded nodes
+RemoveAllAlwaysUnfoldedNodeFlagsAction.tooltip=Allows folding for every node
RemoveAllIconsAction.text=Remove all icons
RemoveConnectorAction.text=Remove Connector
RemoveEncryption.text=Remove password
@@ -1446,40 +1541,49 @@ replace_shortcut_title=Replace shortcut?
ReportBugAction.text=Report a bug
RequestFeatureAction.text=Request a feature
reset_to_default=Use default
-ResetNodeLocationAction.text=Reset node &position
+ResetNodeLocationAction.text=Reset node position
ResetStyleAction.text=Reset node style
-RevertAction.text=&Restore from local history
-RevisionPluginAction.text=Change &revisions background color
+RevertAction.text=Restore from local history
+RevisionPluginAction.text=Change revisions background color
+save=&Save
save_failed=Attempt to save the map {0} failed.
save_unsaved=Save the following mindmap?
save_unsaved_styles=Save styles?
SaveAcceleratorPresetsAction.text=Save hot key set...
SaveAction.text=&Save map
-SaveAll.text=Save a&ll opened maps
+SaveAction_readonlyMsg=This map is read-only. Please use 'File->Save map as...' to save this map.
+SaveAction_readonlyTitle=Attempt to save read-only map
+SaveAll.text=Save &all opened maps
SaveAll.tooltip=Saves all opened maps
-SaveAsAction.text=Save map &as...
+SaveAs_toReadonlyMsg={0} is read-only. Please save to a different file.
+SaveAs_toReadonlyTitle=Attempt to save to read-only file
+SaveAsAction.text=Save map as...
saved=Saved
saving_canceled=Saving canceled
scanners_not_loaded=Scanners could not be loaded, file corrupted
scheme_evaluate=Evaluate!
script_execution_disabled=Script execution disabled, see Tools/Preferences/Plugins
-ScriptEditor.text=Edit s&cript...
+ScriptEditor.text=Edit script...
ScriptEditor.tooltip=Enables to write larger scripts within Freeplane.
ScriptEditorPanel.changed_cancel=The scripts were changed. Do you really want to abandon those changes?
+scripting=Scripts
scripting_api_generator_legend=Legend
scripting_api_generator_proxy=Proxy
scripting_api_generator_title=Scripting API
scripting_api_generator_utilities=Utilities
scripting_api_generator_web=Web Resources
+ScriptsRunToggleAction.ON_SELECTED_NODE.text=Execute scripts on all selected nodes
+ScriptsRunToggleAction.ON_SELECTED_NODE_RECURSIVELY.text=Execute scripts on selected nodes, recursively
+ScriptsRunToggleAction.ON_SINGLE_NODE.text=Execute scripts on one selected node
select_favorites_folder=Select the folder, in which your favorites reside
select_file_export_to=Select the file to export to
select_folder_for_importing=Select the folder to import
select_icon=Select an Icon
select_menu_item_dialog=Select a menu item
select_menu_item_root_node=Menu
-SelectAllAction.text=Select all &visible nodes
-SelectBranchAction.text=Select visible &branch
-SelectedPasteAction.text=P&aste as...
+SelectAllAction.text=Select all visible nodes
+SelectBranchAction.text=Select visible branch
+SelectedPasteAction.text=Paste as...
selection_method_by_click=Single-click to Select
selection_method_delayed=Delayed Automatic selection
selection_method_direct=Point to Select
@@ -1489,6 +1593,8 @@ set_accelerator_on_next_click_action=To create a new keyboard shortcut: press 'C
SetAccelerator.dialogTitle=Hot key assignment
SetAccelerator.keystrokeDetected=Keystroke ''{0}'' is not assigned to any menu item.
SetAcceleratorOnNextClickAction.text=Assign hot key...
+SetAlwaysUnfoldedNodeFlagsAction.text=Keep unfolded nodes
+SetAlwaysUnfoldedNodeFlagsAction.tooltip=Prevents folding for currently unfolded nodes
SetImageByFileChooserAction.text=Image by choice or link...
SetLinkAnchorAction.text=Set link anchor
SetLinkAnchorAction.tooltip=<html>set selected node as anchor for future<br/>creation of local or global links.
@@ -1693,12 +1799,13 @@ simplyhtml.valignMiddle=middle
simplyhtml.valignTop=top
simplyhtml.wholeWordsOnly=Whole words only
simplyhtml.wholeWordsOnly.tooltip=Restrict matches to whole words.
-SortNodes.text=&Sort children
+SortNodes.text=Sort children
SortNodes.tooltip=Sorts all children of a node alphabetically.
split=&Split
SplitConditionAction.text=Split
-SplitNode.text=&Split node
+SplitNode.text=Split node
SplitNode.tooltip=<html>Node is splitted</html>
+SplitToWordsAction.text=Split with {0} words in line
STANDARD_FORMAT=Standard
stop_processing=Stop
StringFlavorHandler=Plain text as node hierarchy
@@ -1731,32 +1838,77 @@ styles.subtopic=Subtopic
styles.topic=Topic
styles.user-defined=User defined styles
styles.website=Website
+styles_background_html=\n \
+<html>\n \
+ <head>\n \
+ </head>\n \
+ <body>\n \
+ <table width="800" style="text-align: left; vertical-align: top">\n \
+ <tr valign="top">\n \
+ <th>\n \
+ <div style="margin-top: 0pt; margin-right: 0pt; margin-bottom: 0pt; margin-left: 0pt; text-align: center; font-weight: bold">\n \
+ About this style set\n \
+ </div>\n \
+ <div style="text-align: left; font-weight: normal">\n \
+ <div style="margin: 3pt">\n \
+ This standard was developed after 11 years pedagogy research about how to make the process of knowledge easier and faster.\n \
+ </div>\n \
+ <div style="margin: 3pt">\n \
+ It aims to make the process of assimilating, processing, absorbing, understanding domain and mastering knowledge, information and ideas as fast and easy as possible.\n \
+ </div>\n \
+ <div style="margin: 3pt">\n \
+ It has been developed by Jonas Batista (Brazil).\n \
+ You can find more information at: <a href="http://www.jonasbatista.com.br/">www.jonasbatista.com.br/ </a>\n \
+ </div>\n \
+ </div>\n \
+ </th>\n \
+ <th>\n \
+ <img src="freeplaneresource:/images/JonasBatista.jpg"/>\n \
+ <div style="text-align: center">\n \
+ Jonas Batista<br/>\n \
+ </div>\n \
+ </th>\n \
+ </tr>\n \
+ </table>\n \
+ </body>\n \
+</html>
styles_menu=Available styles
submenu_keystroke_in_use_error=Keystroke {0} can not be used for submenu {1}. Keystroke removed.
summary_nodes=Summary nodes
summary_not_possible=Can not create summary node for current selection
-SummaryNodeAction.text=Summary node (set/reset)
svg=SVG
template_dir=Standard templates
+TextAlignAction.CENTER.text=Centered text
+TextAlignAction.DEFAULT.text=Default
+TextAlignAction.LEFT.text=Left aligned text
+TextAlignAction.RIGHT.text=Right aligned text
+textalignment=Text alignment
TimeListAction.text=Manage tasks ...
TimeListAction.tooltip=Shows all scheduled times and the corresponding nodes.
TimeManagementAction.text=Manage time...
TimeManagementAction.tooltip=<html>Shows the calendar module by Kai Toedter.</html>
+TimePeriodUnits.days=days
+TimePeriodUnits.hours=hours
+TimePeriodUnits.minutes=minutes
+TimePeriodUnits.ms=ms
+TimePeriodUnits.seconds=seconds
+TimePeriodUnits.weeks=weeks
ToggleChildrenFoldedAction.text=(Un)fold children
ToggleDetailsAction.text=Hide details
ToggleFBarAction.text=F-Bar
ToggleFoldedAction.text=(Un)fold
ToggleFullScreenAction.text=Full screen mode
-ToggleLeftToolbarAction.text=&Icons toolbar
+ToggleLeftToolbarAction.text=Icons toolbar
ToggleMenubarAction.text=Menubar
ToggleScrollbarsAction.text=Scrollbars
ToggleStatusAction.text=Display status line
-ToggleToolbarAction.text=&Toolbar
+ToggleToolbarAction.text=Toolbar
+toolbars=Toolbars
undefined_error=An unexpected error occured. Please try to make a bug report.
underline=Underline
UnderlineAction.text=Underline
underlined=Underlined
-UndoAction.text=&Undo
+UndoAction.text=Undo
UndoFilterAction.text=Undo filter action
unfold=Unfold
UnfoldAllAction.text=Unfold all
@@ -1789,11 +1941,14 @@ user_defined_zoom_status_bar=Changing the zoom to the user defined zoom value of
user_icon=User icon "{0}"
user_template_dir=User Templates
user_zoom=Print zoom factor (0.0 - 2.0):
+userScripts=Scripts
value_format=Value format
version_up_to_date=You already use the latest program version
-ViewerControllerAction.text=External object...
+view=&View
ViewLayoutTypeAction.OUTLINE.text=Outline view
+web_resources=Web resources
WebDocuAction.text=Web Documentation
+WhatsNewAction.text=What's new in Freeplane 1.5.x
width=Width
wrong_regexp=Wrong regular expression "{0}", error {1}
xslt_export.html=Html document
@@ -1806,5 +1961,6 @@ xslt_export.ms_word=Microsoft Word 2003 XML
xslt_export.text=Plain text
xslt_export_not_possible=Freeplane XSLT export not possible
yes=Yes
+zoom=Zoom
ZoomInAction.text=Zoom in
ZoomOutAction.text=Zoom out
diff --git a/freeplane/viewer-resources/version.properties b/freeplane/viewer-resources/version.properties
index b37d786..aaacbcf 100644
--- a/freeplane/viewer-resources/version.properties
+++ b/freeplane/viewer-resources/version.properties
@@ -1,2 +1,2 @@
-freeplane_version=1.3.15
+freeplane_version=1.5.11
freeplane_version_status=
diff --git a/freeplane/viewer-resources/xml/appletMenu.mm b/freeplane/viewer-resources/xml/appletMenu.mm
deleted file mode 100644
index b0701cf..0000000
--- a/freeplane/viewer-resources/xml/appletMenu.mm
+++ /dev/null
@@ -1,632 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<attribute_registry SHOW_ATTRIBUTES="hide"/>
-<node TEXT="Applet Menu Structure" FOLDED="false" ID="ID_1106295222" CREATED="1370289583583" MODIFIED="1370291073656"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="category" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="category" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="radio_action" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="radio_action" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="submenu" LAST="true">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="submenu" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false" show_note_icons="true"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default" MAX_WIDTH="600" COLOR="#000000" STYLE="as_parent">
-<font NAME="SansSerif" SIZE="10" BOLD="false" ITALIC="false"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode LOCALIZED_TEXT="styles.topic" COLOR="#18898b" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subtopic" COLOR="#cc3300" STYLE="fork">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.subsubtopic" COLOR="#669900">
-<font NAME="Liberation Sans" SIZE="10" BOLD="true"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.important">
-<icon BUILTIN="yes"/>
-</stylenode>
-<stylenode TEXT="separator" COLOR="#999999"/>
-<stylenode TEXT="action"/>
-<stylenode TEXT="radio_action">
-<icon BUILTIN="unchecked"/>
-</stylenode>
-<stylenode TEXT="category" COLOR="#000000" BACKGROUND_COLOR="#ccffcc">
-<font ITALIC="true"/>
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="submenu">
-<font ITALIC="true"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.AutomaticLayout" POSITION="right">
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level.root" COLOR="#000000">
-<font SIZE="18"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,1" COLOR="#0033ff">
-<font SIZE="16"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,2" COLOR="#00b439">
-<font SIZE="14"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,3" COLOR="#990000">
-<font SIZE="12"/>
-</stylenode>
-<stylenode LOCALIZED_TEXT="AutomaticLayout.level,4" COLOR="#111111">
-<font SIZE="10"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="menu_bar" POSITION="right" ID="ID_759195298" CREATED="1370289583583" MODIFIED="1370289583583">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="menu_bar"/>
-<node TEXT="File" ID="ID_1648832089" CREATED="1370289583583" MODIFIED="1370333888232">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="file"/>
-<attribute NAME="name_ref" VALUE="file"/>
-<node TEXT="Most recent maps" ID="ID_626198496" CREATED="1370289583584" MODIFIED="1370336935508">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="menu_key" VALUE="main_menu_most_recent_files"/>
-<attribute NAME="name" VALUE="last"/>
-<attribute NAME="name_ref" VALUE="most_recent_files"/>
-</node>
-<node TEXT="Print setup ..." ID="ID_1968870430" CREATED="1370289583585" MODIFIED="1370333934054">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PageAction"/>
-</node>
-<node TEXT="Print Preview ..." ID="ID_56086467" CREATED="1370289583585" MODIFIED="1370291281038">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintPreviewAction"/>
-</node>
-<node TEXT="Print map ..." ID="ID_1129839241" CREATED="1370289583585" MODIFIED="1370291290343">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control P"/>
-<attribute NAME="action" VALUE="PrintAction"/>
-</node>
-<node TEXT="Map statistics ..." ID="ID_494684784" CREATED="1370289583586" MODIFIED="1370333528006">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FilePropertiesAction"/>
-</node>
-</node>
-<node TEXT="Edit" FOLDED="true" ID="ID_1462659131" CREATED="1370289583586" MODIFIED="1370333890040">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="edit"/>
-<attribute NAME="name_ref" VALUE="edit"/>
-<node TEXT="Node extensions" FOLDED="true" ID="ID_887328759" CREATED="1370289583586" MODIFIED="1370333973733">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_extensions"/>
-<attribute NAME="name_ref" VALUE="menu_extensions"/>
-<node TEXT="Minimize node" ID="ID_1168314005" CREATED="1370289583587" MODIFIED="1370334139419">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetShortenerStateAction"/>
-</node>
-</node>
-<node TEXT="Copy" FOLDED="true" ID="ID_902816050" CREATED="1370289583587" MODIFIED="1370333985493">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_copy"/>
-<attribute NAME="name_ref" VALUE="menu_copy"/>
-<node TEXT="Copy" ID="ID_1198325064" CREATED="1370289583587" MODIFIED="1370334075604">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control C"/>
-<attribute NAME="action" VALUE="CopyAction"/>
-</node>
-<node TEXT="Copy node (single)" ID="ID_478872572" CREATED="1370289583588" MODIFIED="1370334071436">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control shift C"/>
-<attribute NAME="action" VALUE="CopySingleAction"/>
-</node>
-</node>
-<node TEXT="Find" FOLDED="true" ID="ID_1276327828" CREATED="1370289583588" MODIFIED="1370333987149">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="find"/>
-<node TEXT="Find ..." ID="ID_193336124" CREATED="1370289583588" MODIFIED="1370334035117">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control F"/>
-<attribute NAME="action" VALUE="FindAction"/>
-</node>
-<node TEXT="Find next" ID="ID_1275209872" CREATED="1370289583589" MODIFIED="1370334038108">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control G"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-<node TEXT="Find Previous" ID="ID_1310362676" CREATED="1370289583589" MODIFIED="1370334042364">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-</node>
-</node>
-<node TEXT="View" FOLDED="true" ID="ID_1415081604" CREATED="1370289583590" MODIFIED="1370333892623">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="view"/>
-<attribute NAME="name_ref" VALUE="menu_view"/>
-<node TEXT="Menu_Toolbar_Panel" FOLDED="true" ID="ID_1602418376" CREATED="1370289583590" MODIFIED="1370289583590">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Menu_Toolbar_Panel"/>
-<node TEXT="toolbars" FOLDED="true" ID="ID_441424651" CREATED="1370289583590" MODIFIED="1370289583590">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<node TEXT="Toolbars" FOLDED="true" ID="ID_1247347160" CREATED="1370289583590" MODIFIED="1370334647998">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="toolbars"/>
-<attribute NAME="name_ref" VALUE="menu_toolbars"/>
-<node TEXT="Menubar" ID="ID_1874551934" CREATED="1370289583591" MODIFIED="1370334222427">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MB_ToggleMenubarAction"/>
-</node>
-<node TEXT="Toolbar" ID="ID_1201269776" CREATED="1370289583591" MODIFIED="1370334225090">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="Filter toolbar" ID="ID_723905548" CREATED="1370289583592" MODIFIED="1370334228562">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFilterToolbarAction"/>
-</node>
-<node TEXT="Scrollbars" ID="ID_741413210" CREATED="1370289583592" MODIFIED="1370334251426">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleScrollbarsAction"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Zoom" FOLDED="true" ID="ID_116766092" CREATED="1370289583592" MODIFIED="1370334442184">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="zoom"/>
-<node TEXT="Zoom in" ID="ID_724096960" CREATED="1370289583592" MODIFIED="1370334260954">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt UP"/>
-<attribute NAME="action" VALUE="ZoomInAction"/>
-</node>
-<node TEXT="Zoom out" ID="ID_837409072" CREATED="1370289583593" MODIFIED="1370334265242">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt DOWN"/>
-<attribute NAME="action" VALUE="ZoomOutAction"/>
-</node>
-<node TEXT="Center selected node" ID="ID_858490021" CREATED="1370289583593" MODIFIED="1370334297242">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control alt C"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-</node>
-</node>
-<node TEXT="View settings" ID="ID_1616554070" CREATED="1370289583594" MODIFIED="1370334389161">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_viewmode"/>
-<attribute NAME="name_ref" VALUE="menu_viewmode"/>
-<node TEXT="Outline view" ID="ID_350704036" CREATED="1370289583594" MODIFIED="1370334433776">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Rectangular selection" ID="ID_1595795715" CREATED="1370289583594" MODIFIED="1370334418883">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowSelectionAsRectangleAction"/>
-</node>
-</node>
-<node TEXT="Tool tips" FOLDED="true" ID="ID_1285587072" CREATED="1370289583595" MODIFIED="1370334461440">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_hoverView"/>
-<attribute NAME="name_ref" VALUE="menu_hoverView"/>
-<node TEXT="Hide Details" ID="ID_703894102" CREATED="1370289583595" MODIFIED="1370334508935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt F2"/>
-<attribute NAME="action" VALUE="ToggleDetailsAction"/>
-</node>
-<node TEXT="Display tool tips" ID="ID_1675277738" CREATED="1370289583595" MODIFIED="1370334540039">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetBooleanPropertyAction.show_node_tooltips"/>
-</node>
-</node>
-<node TEXT="AttributeView" FOLDED="true" ID="ID_780572515" CREATED="1370289583596" MODIFIED="1370289583596">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="AttributeView"/>
-<node TEXT="Node attributes" FOLDED="true" ID="ID_24466809" CREATED="1370289583596" MODIFIED="1370334574174">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="menu_displayAttributes"/>
-<attribute NAME="name_ref" VALUE="menu_displayAttributes"/>
-<node TEXT="ShowSelectedAttributesAction" ID="ID_1788644027" CREATED="1370289583596" MODIFIED="1370289583596">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="ShowSelectedAttributesAction"/>
-</node>
-<node TEXT="ShowAllAttributesAction" ID="ID_544285560" CREATED="1370289583597" MODIFIED="1370289583597">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="ShowAllAttributesAction"/>
-</node>
-<node TEXT="HideAllAttributesAction" ID="ID_275579352" CREATED="1370289583597" MODIFIED="1370289583597">
-<attribute NAME="type" VALUE="radio_action"/>
-<attribute NAME="action" VALUE="HideAllAttributesAction"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Navigate" ID="ID_1728425430" CREATED="1370289583597" MODIFIED="1370333896167">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="navigate"/>
-<attribute NAME="name_ref" VALUE="menu_navigate"/>
-<node TEXT="navigate" FOLDED="true" ID="ID_1995616024" CREATED="1370289583598" MODIFIED="1370289583598">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="navigate"/>
-<node TEXT="folding" FOLDED="true" ID="ID_337305814" CREATED="1370289583598" MODIFIED="1370289583598">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="folding"/>
-<node TEXT="(Un) Fold" ID="ID_1726399366" CREATED="1370289583598" MODIFIED="1370335973102">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="SPACE"/>
-<attribute NAME="action" VALUE="ToggleFoldedAction"/>
-</node>
-<node TEXT="Show next child" ID="ID_1016509477" CREATED="1370289583598" MODIFIED="1370335905967">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowNextChildAction"/>
-<attribute NAME="accelerator" VALUE="shift SPACE"/>
-</node>
-<node TEXT="(Un)fold children" ID="ID_1901778256" CREATED="1370289583599" MODIFIED="1370335997526">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control SPACE"/>
-<attribute NAME="action" VALUE="ToggleChildrenFoldedAction"/>
-</node>
-<node TEXT="Unfold one level" ID="ID_308066099" CREATED="1370289583599" MODIFIED="1370335912431">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt PAGE_DOWN"/>
-<attribute NAME="action" VALUE="UnfoldOneLevelAction"/>
-</node>
-<node TEXT="Fold one level" ID="ID_954150012" CREATED="1370289583600" MODIFIED="1370335917671">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt PAGE_UP"/>
-<attribute NAME="action" VALUE="FoldOneLevelAction"/>
-</node>
-<node TEXT="Unfold all" ID="ID_304617920" CREATED="1370289583600" MODIFIED="1370335945495">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt END"/>
-<attribute NAME="action" VALUE="UnfoldAllAction"/>
-</node>
-<node TEXT="Fold all" ID="ID_1487740142" CREATED="1370289583600" MODIFIED="1370335942998">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="alt HOME"/>
-<attribute NAME="action" VALUE="FoldAllAction"/>
-</node>
-</node>
-</node>
-<node TEXT="Goto root" ID="ID_1147280816" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MoveToRootAction"/>
-<attribute NAME="accelerator" VALUE="ESCAPE"/>
-</node>
-<node TEXT="Goto node with ID..." ID="ID_1043132007" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="GotoNodeAction"/>
-</node>
-<node TEXT="Goto previous node" ID="ID_543681743" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextNodeAction.BACK"/>
-<attribute NAME="accelerator" VALUE="control alt LEFT"/>
-</node>
-<node TEXT="Goto next node" ID="ID_235562851" CREATED="1370194798848" MODIFIED="1370194798848">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextNodeAction.FORWARD"/>
-<attribute NAME="accelerator" VALUE="control alt RIGHT"/>
-</node>
-<node TEXT="Goto previous node (fold)" ID="ID_1575528067" CREATED="1370194798856" MODIFIED="1370194798856">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextNodeAction.BACK_N_FOLD"/>
-<attribute NAME="accelerator" VALUE="control shift LEFT"/>
-</node>
-<node TEXT="Goto next node (fold)" ID="ID_1170003934" CREATED="1370194798856" MODIFIED="1370194798856">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextNodeAction.FORWARD_N_FOLD"/>
-<attribute NAME="accelerator" VALUE="control shift RIGHT"/>
-</node>
-<node TEXT="Unfold next presentation item" ID="ID_1396867085" CREATED="1370194798856" MODIFIED="1370194798856">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="NextPresentationItemAction"/>
-<attribute NAME="accelerator" VALUE="control shift SPACE"/>
-</node>
-<node TEXT="links" ID="ID_910745337" CREATED="1370289583602" MODIFIED="1370289583602">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="links"/>
-<node TEXT="Follow" ID="ID_66928144" CREATED="1370289583602" MODIFIED="1370333644546">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="accelerator" VALUE="control ENTER"/>
-<attribute NAME="action" VALUE="FollowLinkAction"/>
-</node>
-</node>
-</node>
-<node TEXT="Filter" FOLDED="true" ID="ID_1362111096" CREATED="1370289583602" MODIFIED="1370333900246">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="filter"/>
-<attribute NAME="name_ref" VALUE="menu_filter"/>
-<node TEXT="Filter" FOLDED="true" ID="ID_977479815" CREATED="1370289583603" MODIFIED="1370289583603">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Filter"/>
-<node TEXT="DoFilter" FOLDED="true" ID="ID_486634156" CREATED="1370289583603" MODIFIED="1370289583603">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="DoFilter"/>
-<node TEXT="Undo filter action" ID="ID_1060614745" CREATED="1370194798869" MODIFIED="1370194798869">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UndoFilterAction"/>
-</node>
-<node TEXT="Redo filter action" ID="ID_647411361" CREATED="1370194798869" MODIFIED="1370194798869">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="RedoFilterAction"/>
-</node>
-<node TEXT="Reapply filter action" ID="ID_1390558533" CREATED="1370194798870" MODIFIED="1370194798870">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ReapplyFilterAction"/>
-</node>
-<node TEXT="Quick filter" ID="ID_1967496761" CREATED="1370194798870" MODIFIED="1370194798870">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFilterAction"/>
-</node>
-<node TEXT="Filter selected nodes" ID="ID_630413645" CREATED="1370194798870" MODIFIED="1370194798870">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplySelectedViewConditionAction"/>
-</node>
-<node TEXT="Select all matching nodes" ID="ID_1321944413" CREATED="1370194798870" MODIFIED="1370194798870">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAllAction"/>
-</node>
-<node TEXT="No filtering" ID="ID_851198975" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplyNoFilteringAction"/>
-</node>
-<node TEXT="Compose filter" ID="ID_1388523208" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EditFilterAction"/>
-</node>
-</node>
-<node TEXT="FilterCondition" FOLDED="true" ID="ID_1499552466" CREATED="1370289583605" MODIFIED="1370289583605">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="FilterCondition"/>
-<node TEXT="Applies to filtered nodes" ID="ID_969015686" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ApplyToVisibleAction"/>
-</node>
-<node TEXT="Show ancestors" ID="ID_1702252453" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowAncestorsAction"/>
-</node>
-<node TEXT="Show descendants" ID="ID_1364556615" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowDescendantsAction"/>
-</node>
-</node>
-<node TEXT="Find" ID="ID_1686011100" CREATED="1370289583605" MODIFIED="1370289583605">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Find"/>
-<node TEXT="Find previous" ID="ID_1368935799" CREATED="1370194798874" MODIFIED="1370194798874">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-<node TEXT="Find next" ID="ID_1001632153" CREATED="1370194798882" MODIFIED="1370194798882">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="Extras" FOLDED="true" ID="ID_1413123056" CREATED="1370289583606" MODIFIED="1370333902382">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="extras"/>
-<attribute NAME="name_ref" VALUE="menu_extras"/>
-<node TEXT="Encryption" FOLDED="true" ID="ID_87412073" CREATED="1370289583606" MODIFIED="1370336311883">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="encryption"/>
-<attribute NAME="name_ref" VALUE="menu_encryption"/>
-<node TEXT="EnterPassword" ID="ID_868800887" CREATED="1370289583606" MODIFIED="1370289583606">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EnterPassword"/>
-</node>
-</node>
-</node>
-<node TEXT="Mindmaps" FOLDED="true" ID="ID_1538052925" CREATED="1370289583607" MODIFIED="1370333904990">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="name_ref" VALUE="mindmaps"/>
-<node TEXT="modes" ID="ID_248381967" CREATED="1370289583607" MODIFIED="1370289583607">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_modes"/>
-<attribute NAME="name" VALUE="modes"/>
-</node>
-<node TEXT="navigate" ID="ID_539139568" CREATED="1370289583607" MODIFIED="1370289583607">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_navigate_maps"/>
-<attribute NAME="name" VALUE="navigate"/>
-</node>
-<node TEXT="mindmaps" ID="ID_402320404" CREATED="1370289583607" MODIFIED="1370289583607">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_menu_mindmaps"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-</node>
-</node>
-<node TEXT="Help" FOLDED="true" ID="ID_1648885962" CREATED="1370289583608" MODIFIED="1370333907014">
-<attribute NAME="type" VALUE="submenu"/>
-<attribute NAME="name" VALUE="help"/>
-<attribute NAME="name_ref" VALUE="help"/>
-<node TEXT="Web resources" ID="ID_791086589" CREATED="1370289583608" MODIFIED="1370289583608">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="Web resources"/>
-<node TEXT="Freeplane's Homepage" ID="ID_369316306" CREATED="1370194798906" MODIFIED="1370194798906">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="OpenFreeplaneSiteAction"/>
-</node>
-</node>
-<node TEXT="legacy" ID="ID_914632314" CREATED="1370289583608" MODIFIED="1370289583608">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="legacy"/>
-<node TEXT="About" ID="ID_1821331741" CREATED="1370289583608" MODIFIED="1370336344850">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="AboutAction"/>
-<attribute NAME="menu_key" VALUE="MB_AboutAction"/>
-</node>
-</node>
-</node>
-</node>
-<node TEXT="map_popup" FOLDED="true" POSITION="right" ID="ID_483779417" CREATED="1370289583609" MODIFIED="1370289583609">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="map_popup"/>
-<node TEXT="mindmaps" ID="ID_1996950727" CREATED="1370289583609" MODIFIED="1370289583609">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="mindmaps"/>
-<attribute NAME="menu_key" VALUE="popup_menu_mindmaps"/>
-</node>
-<node TEXT="---" ID="ID_230028625" CREATED="1370289583609" MODIFIED="1370289583609">
-<attribute NAME="type" VALUE="separator"/>
-</node>
-<node TEXT="Menubar" ID="ID_1384686201" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleMenubarAction"/>
-<attribute NAME="menu_key" VALUE="MP_ToggleMenubarAction"/>
-</node>
-<node TEXT="Toolbar" ID="ID_1888013842" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleToolbarAction"/>
-</node>
-<node TEXT="Filter toolbar" ID="ID_1317991825" CREATED="1370194798915" MODIFIED="1370194798915">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ShowFilterToolbarAction"/>
-</node>
-<node TEXT="Scrollbars" ID="ID_601963475" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ToggleScrollbarsAction"/>
-</node>
-<node TEXT="Outline view" ID="ID_349914674" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="ViewLayoutTypeAction.OUTLINE"/>
-</node>
-<node TEXT="Center selected node" ID="ID_223012438" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CenterSelectedNodeAction"/>
-</node>
-<node TEXT="Goto root" ID="ID_698685529" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="MoveToRootAction"/>
-<attribute NAME="accelerator" VALUE="ESCAPE"/>
-</node>
-<node TEXT="Goto node with ID..." ID="ID_250613370" CREATED="1370194798919" MODIFIED="1370194798919">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="GotoNodeAction"/>
-</node>
-</node>
-<node TEXT="node_popup" FOLDED="true" POSITION="right" ID="ID_1432012321" CREATED="1370289583611" MODIFIED="1370289583611">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="node_popup"/>
-<node TEXT="Minimize node" ID="ID_1916528420" CREATED="1370289583611" MODIFIED="1370336573232">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="SetShortenerStateAction"/>
-</node>
-<node TEXT="Enter Password" ID="ID_129053134" CREATED="1370289583611" MODIFIED="1370336510664">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EnterPassword"/>
-</node>
-<node TEXT="Copy" ID="ID_1488306063" CREATED="1370194798933" MODIFIED="1370194798933">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyAction"/>
-<attribute NAME="accelerator" VALUE="control C"/>
-</node>
-<node TEXT="Copy node (single)" ID="ID_1131152129" CREATED="1370194798934" MODIFIED="1370194798934">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopySingleAction"/>
-<attribute NAME="accelerator" VALUE="control shift C"/>
-</node>
-</node>
-<node TEXT="main_toolbar" FOLDED="true" POSITION="right" ID="ID_1205690152" CREATED="1370289583612" MODIFIED="1370289583612">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="main_toolbar"/>
-<node TEXT="zoom" ID="ID_1599643298" CREATED="1370289583612" MODIFIED="1370289583612">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_zoom"/>
-<attribute NAME="name" VALUE="zoom"/>
-</node>
-<node TEXT="open" FOLDED="true" ID="ID_1362981179" CREATED="1370289583612" MODIFIED="1370289583612">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="open"/>
-<node TEXT="Print map..." ID="ID_58065896" CREATED="1370194798935" MODIFIED="1370194798935">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintAction"/>
-</node>
-<node TEXT="Print" ID="ID_387336595" CREATED="1370289583613" MODIFIED="1370336640535">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="PrintDirectAction"/>
-</node>
-</node>
-<node TEXT="paste" FOLDED="true" ID="ID_637995384" CREATED="1370289583613" MODIFIED="1370289583613">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="paste"/>
-<node TEXT="Copy" ID="ID_891714808" CREATED="1370289583613" MODIFIED="1370336644183">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="CopyAction"/>
-</node>
-</node>
-<node TEXT="update" ID="ID_1479842637" CREATED="1370289583613" MODIFIED="1370289583613">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="update"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_update"/>
-</node>
-<node TEXT="zoom" ID="ID_361514422" CREATED="1370289583614" MODIFIED="1370289583614">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="zoom"/>
-<attribute NAME="menu_key" VALUE="main_toolbar_zoom"/>
-</node>
-<node TEXT="folding" FOLDED="true" ID="ID_67493551" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="folding"/>
-<node TEXT="Unfold one level" ID="ID_1227777430" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UnfoldOneLevelAction"/>
-</node>
-<node TEXT="Fold one level" ID="ID_1181360534" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FoldOneLevelAction"/>
-</node>
-<node TEXT="Unfold all" ID="ID_1631347354" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="UnfoldAllAction"/>
-</node>
-<node TEXT="Fold all" ID="ID_1172630625" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FoldAllAction"/>
-</node>
-</node>
-<node TEXT="find" FOLDED="true" ID="ID_1981407568" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="category"/>
-<attribute NAME="name" VALUE="find"/>
-<node TEXT="Find..." ID="ID_496291044" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="FindAction"/>
-</node>
-<node TEXT="Find next" ID="ID_244700007" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.FORWARD"/>
-</node>
-<node TEXT="Find previous" ID="ID_1464814215" CREATED="1370194798943" MODIFIED="1370194798943">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="QuickFindAction.BACK"/>
-</node>
-</node>
-<node TEXT="EnterPassword" ID="ID_400764611" CREATED="1370289583615" MODIFIED="1370289583615">
-<attribute NAME="type" VALUE="action"/>
-<attribute NAME="action" VALUE="EnterPassword"/>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane/viewer-resources/xml/appletmenu.xml b/freeplane/viewer-resources/xml/appletmenu.xml
new file mode 100644
index 0000000..6974b55
--- /dev/null
+++ b/freeplane/viewer-resources/xml/appletmenu.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<FreeplaneUIEntries>
+ <Entry builder="main_menu">
+ <Entry name="file">
+ <Entry name="PageAction" />
+ <Entry name="PrintPreviewAction" />
+ <Entry accelerator="control P" name="PrintAction" />
+ </Entry>
+ <Entry name="edit">
+ <Entry name="SetShortenerStateAction" />
+ <Entry accelerator="control C" name="CopyAction" />
+ <Entry accelerator="control shift C" name="CopySingleAction" />
+ <Entry accelerator="control G" name="FindAction" />
+ <Entry name="FindNextAction" accelerator="control shift G" />
+ <Entry name="FindPreviousAction" />
+ </Entry>
+ <Entry name="view">
+ <Entry name="toolbars">
+ <Entry name="ToggleMenubarAction" builder="MB_ToggleMenubarAction" />
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ShowFilterToolbarAction" accelerator="control F" />
+ <Entry name="ToggleScrollbarsAction" />
+ </Entry>
+ <Entry name="zoom">
+ <Entry accelerator="alt UP" name="ZoomInAction" />
+ <Entry accelerator="alt DOWN" name="ZoomOutAction" />
+ <Entry accelerator="control PERIOD" name="CenterSelectedNodeAction" />
+ </Entry>
+ <Entry name="menu_viewmode">
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="ShowSelectionAsRectangleAction" />
+ </Entry>
+ <Entry name="menu_hoverView">
+ <Entry accelerator="alt F2" name="ToggleDetailsAction" />
+ <Entry name="SetBooleanPropertyAction.show_node_tooltips" />
+ </Entry>
+ <Entry builder="radio_button_group" name="menu_displayAttributes">
+ <Entry name="ShowSelectedAttributesAction" />
+ <Entry name="ShowAllAttributesAction" />
+ <Entry name="HideAllAttributesAction" />
+ <Entry name="SetBooleanMapPropertyAction.show_icon_for_attributes" />
+ </Entry>
+ </Entry>
+ <Entry name="navigate">
+ <Entry name="navigate">
+ <Entry accelerator="SPACE" name="ToggleFoldedAction" />
+ <Entry name="ShowNextChildAction" accelerator="shift SPACE" />
+ <Entry accelerator="control SPACE" name="ToggleChildrenFoldedAction" />
+ <Entry accelerator="alt PAGE_DOWN" name="UnfoldOneLevelAction" />
+ <Entry accelerator="alt PAGE_UP" name="FoldOneLevelAction" />
+ <Entry accelerator="alt END" name="UnfoldAllAction" />
+ <Entry accelerator="alt HOME" name="FoldAllAction" />
+ </Entry>
+ <Entry accelerator="ESCAPE" name="MoveToRootAction" />
+ <Entry name="GotoNodeAction" />
+ <Entry accelerator="control alt LEFT" name="NextNodeAction.BACK" />
+ <Entry accelerator="control alt RIGHT" name="NextNodeAction.FORWARD" />
+ <Entry accelerator="control alt shift LEFT" name="NextNodeAction.BACK_N_FOLD" />
+ <Entry accelerator="control alt shift RIGHT" name="NextNodeAction.FORWARD_N_FOLD" />
+ <Entry name="NextPresentationItemAction" />
+ <Entry name="links">
+ <Entry accelerator="control ENTER" name="FollowLinkAction" />
+ </Entry>
+ </Entry>
+ <Entry name="filter">
+ <Entry name="UndoFilterAction" />
+ <Entry name="RedoFilterAction" />
+ <Entry name="ReapplyFilterAction" />
+ <Entry name="QuickFilterAction" />
+ <Entry name="ApplySelectedViewConditionAction" />
+ <Entry name="QuickFindAllAction" />
+ <Entry name="ApplyNoFilteringAction" />
+ <Entry name="EditFilterAction" />
+ <Entry builder="separator" />
+ <Entry name="ShowAncestorsAction" />
+ <Entry name="ShowDescendantsAction" />
+ <Entry name="ApplyToVisibleAction" />
+ <Entry builder="separator" />
+ <Entry name="QuickHighlightAction" />
+ <Entry name="QuickFindAction.BACK" />
+ <Entry name="QuickFindAction.FORWARD" />
+ </Entry>
+ <Entry name="extras">
+ <Entry name="EnterPassword" />
+ </Entry>
+ </Entry>
+ <Entry name="help">
+ <Entry name="OpenFreeplaneSiteAction" />
+ <Entry name="AboutAction"/>
+ </Entry>
+ <Entry name="map_popup" builder="map_popup">
+ <Entry name="ToggleMenubarAction"/>
+ <Entry name="ToggleToolbarAction" />
+ <Entry name="ShowFilterToolbarAction" />
+ <Entry name="ToggleScrollbarsAction" />
+ <Entry name="ViewLayoutTypeAction.OUTLINE" />
+ <Entry name="CenterSelectedNodeAction" />
+ <Entry name="MoveToRootAction" accelerator="ESCAPE" />
+ <Entry name="GotoNodeAction" />
+ </Entry>
+ <Entry name="node_popup" builder="node_popup">
+ <Entry name="SetShortenerStateAction" />
+ <Entry name="EnterPassword" />
+ <Entry name="CopyAction" accelerator="control C" />
+ <Entry name="CopySingleAction" accelerator="control shift C" />
+ </Entry>
+ <Entry name="main_toolbar" builder="toolbar,ignore">
+ <Entry builder="main_toolbar_zoom" name="zoom" />
+ <Entry name="open">
+ <Entry name="PrintAction" />
+ <Entry name="PrintDirectAction" />
+ </Entry>
+ <Entry name="paste">
+ <Entry name="CopyAction" />
+ </Entry>
+ <Entry name="folding">
+ <Entry name="UnfoldOneLevelAction" />
+ <Entry name="FoldOneLevelAction" />
+ <Entry name="UnfoldAllAction" />
+ <Entry name="FoldAllAction" />
+ </Entry>
+ <Entry name="find">
+ <Entry name="FindAction" />
+ <Entry name="FindNextAction" />
+ <Entry name="FindPreviousAction" />
+ </Entry>
+ <Entry name="EnterPassword" />
+ </Entry>
+</FreeplaneUIEntries>
diff --git a/freeplane_ant/.classpath b/freeplane_ant/.classpath
deleted file mode 100644
index e7b5e15..0000000
--- a/freeplane_ant/.classpath
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="src" path="test/src"/>
- <classpathentry kind="src" path="template"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
- <classpathentry kind="var" path="ECLIPSE_HOME/plugins/org.apache.ant_1.8.2.v20120109-1030/lib/ant.jar"/>
- <classpathentry combineaccessrules="false" kind="src" path="/freeplane"/>
- <classpathentry kind="lib" path="/freeplane_framework/lib/knopflerfish/framework.jar"/>
- <classpathentry kind="output" path="build"/>
-</classpath>
diff --git a/freeplane_ant/.project b/freeplane_ant/.project
deleted file mode 100644
index d2dd62b..0000000
--- a/freeplane_ant/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_ant</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_ant/.settings/org.eclipse.core.resources.prefs b/freeplane_ant/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 4824b80..0000000
--- a/freeplane_ant/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/freeplane_ant/README.txt b/freeplane_ant/README.txt
index a4a39ef..543b18b 100644
--- a/freeplane_ant/README.txt
+++ b/freeplane_ant/README.txt
@@ -1,12 +1,12 @@
Custom Ant tasks for use in freeplane.
======================================
- - target "jar" builds build/freeplaneant.jar
+ - target "jar" builds build/libs/freeplaneant-<version>.jar
- target "test" performs some tests
- - See test/build.xml for examples of their use
Task FormatTranslation
----------------------
+(e.g. "gradle format_translation")
formats a translation file and writes the result to another file.
The following transformations are made:
@@ -29,6 +29,7 @@ Attributes:
Task FormatTranslationCheck
---------------------------
+(e.g. "gradle check_translation")
Does the same thing as FormatTranslation with the following exceptions:
- no files are written or changed.
diff --git a/freeplane_ant/build.gradle b/freeplane_ant/build.gradle
new file mode 100644
index 0000000..1fda260
--- /dev/null
+++ b/freeplane_ant/build.gradle
@@ -0,0 +1,7 @@
+dependencies {
+ compile group: 'org.apache.ant', name: 'ant', version: '1.9.3'
+}
+
+jar {
+ baseName "freeplaneant"
+}
diff --git a/freeplane_ant/build.xml b/freeplane_ant/build.xml
deleted file mode 100644
index 5e0c99b..0000000
--- a/freeplane_ant/build.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<project name="freeplane_ant" default="compile" basedir=".">
- <property name="src" location="src" />
- <property name="lib" location="lib" />
- <property name="bin" location="bin" />
- <property name="template" location="template" />
- <property name="dist" location="dist" />
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="jar" value="${dist}/freeplaneant.jar" />
-
- <target name="compile">
- <mkdir dir="${bin}" />
- <javac srcdir="${src}" destdir="${bin}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" />
- </target>
-
- <target name="jar" depends="compile">
- <mkdir dir="${dist}" />
- <jar jarfile="${jar}">
- <fileset dir="${bin}">
- <exclude name="**/*.jar" />
- <exclude name="**/*Test.class" />
- </fileset>
- <fileset dir="${template}"/>
- </jar>
- </target>
-
- <target name="test" depends="jar">
- <ant dir="test" target="test" />
- </target>
-
- <target name="clean">
- <!-- would fail unless freeplaneant.jar exists:
- <ant dir="test" target="clean" />
- -->
- <delete dir="test/sorted" quiet="true" />
- <delete dir="test/bin" quiet="true" />
- <delete dir="test/log" quiet="true" />
- <delete dir="test/freeplane_plugin_latex" quiet="true" />
- <delete dir="test/freeplane_plugin_helloworld" quiet="true" />
- <delete dir="${bin}" quiet="true" />
- <delete dir="${dist}" quiet="true" />
- </target>
-</project>
diff --git a/freeplane_ant/src/main/java/org/freeplane/ant/FormatTranslation.java b/freeplane_ant/src/main/java/org/freeplane/ant/FormatTranslation.java
new file mode 100644
index 0000000..1da91c2
--- /dev/null
+++ b/freeplane_ant/src/main/java/org/freeplane/ant/FormatTranslation.java
@@ -0,0 +1,407 @@
+/**
+ * FormatTranslation.java
+ *
+ * Copyright (C) 2010, Volker Boerchers
+ *
+ * FormatTranslation.java 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 3 of the License, or (at your
+ * option) any later version.
+ *
+ * FormatTranslation.java is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+package org.freeplane.ant;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+/** formats a translation file and writes the result to another file.
+ * The following transformations are made:
+ * <ol>
+ * <li> sort lines (case insensitive)
+ * <li> remove duplicates
+ * <li> if a key is present multiple times entries marked as [translate me]
+ * and [auto] are removed in favor of normal entries.
+ * <li> newline style is changed to <eolStyle>.
+ * </ol>
+ *
+ * Attributes:
+ * <ul>
+ * <li> dir: the input directory (default: ".")
+ * <li> outputDir: the output directory. Overwrites existing files if outputDir
+ * equals the input directory (default: the input directory)
+ * <li> includes: wildcard pattern (default: all regular files).
+ * <li> excludes: wildcard pattern, overrules includes (default: no excludes).
+ * <li> eolStyle: unix|mac|windows (default: platform default).
+ * </ul>
+ *
+ * Build messages:
+ * <table border=1>
+ * <tr><th>Message</th><th>Action</th><th>Description</th></tr>
+ * <tr><td><file>: no key/val: <line></td><td>drop line</td><td>broken line with an empty key or without an '=' sign</td></tr>
+ * <tr><td><file>: drop duplicate: <line></td><td>drop line</td><td>two completely identical lines</td></tr>
+ * <tr><td><file>: drop: <line></td><td>drop line</td>
+ * <td>this translation is dropped since a better one was found
+ * (quality: [translate me] -> [auto] -> manually translated)
+ * </td>
+ * </tr>
+ * <tr><td><file>: drop one of two of equal quality (revisit!):keep: <line></td><td>keep line</td>
+ * <td>for one key two manual translations were found. This one (arbitrarily chosen) will be kept.
+ * Printout of the complete line allows to correct an action of FormatTranslation via Copy and Past
+ * if it chose the wrong tranlation.
+ * </td>
+ * </tr>
+ * <tr><td><file>: drop one of two of equal quality (revisit!):drop: <line></td><td>drop line</td>
+ * <td>accompanies the :keep: line: This is the line that is dropped.
+ * </td>
+ * </tr>
+ * </table>
+ * Note that CheckTranslation does not remove anything but produces the same messages!
+ */
+public class FormatTranslation extends Task {
+ static Comparator<String> KEY_COMPARATOR = new Comparator<String>() {
+ @Override
+ public int compare(String s1, String s2) {
+ int n1 = s1.length(), n2 = s2.length();
+ for (int i1 = 0, i2 = 0; i1 < n1 && i2 < n2; i1++, i2++) {
+ char c1 = s1.charAt(i1);
+ char c2 = s2.charAt(i2);
+ boolean c1Terminated = c1 == ' ' || c1 == '\t' || c1 == '=';
+ boolean c2Terminated = c2 == ' ' || c2 == '\t' || c2 == '=';
+ if (c1Terminated && c2Terminated)
+ return 0;
+ if (c1Terminated && !c2Terminated)
+ return -1;
+ if (c2Terminated && !c1Terminated)
+ return 1;
+ if (c1 != c2) {
+ c1 = Character.toUpperCase(c1);
+ c2 = Character.toUpperCase(c2);
+ if (c1 != c2) {
+ c1 = Character.toLowerCase(c1);
+ c2 = Character.toLowerCase(c2);
+ if (c1 != c2) {
+ return c1 - c2;
+ }
+ }
+ }
+ }
+ return n1 - n2;
+ }
+ };
+ private final static int QUALITY_NULL = 0; // for empty values
+ private final static int QUALITY_TRANSLATE_ME = 1;
+ private final static int QUALITY_AUTO_TRANSLATED = 2;
+ private final static int QUALITY_MANUALLY_TRANSLATED = 3;
+ private File outputDir;
+ private boolean writeIfUnchanged = false;
+ private File inputDir = new File(".");
+ private final ArrayList<Pattern> includePatterns = new ArrayList<Pattern>();
+ private final ArrayList<Pattern> excludePatterns = new ArrayList<Pattern>();
+ private String lineSeparator = System.getProperty("line.separator");
+
+ @Override
+ public void execute() {
+ final int countFormatted = executeImpl(false);
+ log(inputDir + ": formatted " + countFormatted + " file" + (countFormatted == 1 ? "" : "s"));
+ }
+
+ public int checkOnly() {
+ return executeImpl(true);
+ }
+
+ /** returns the number of unformatted files. */
+ private int executeImpl(boolean checkOnly) {
+ validate();
+ File[] inputFiles = inputDir.listFiles(new TaskUtils.IncludeFileFilter(includePatterns, excludePatterns));
+ return process(inputFiles, checkOnly);
+ }
+
+ static public void main(final String argc[]) {
+ File[] inputFiles = new File[argc.length];
+ int i = 0;
+ for (String arg : argc) {
+ inputFiles[i++] = new File(arg);
+ }
+ new FormatTranslation().configureFromDefines().process(inputFiles, false);
+ }
+
+ private FormatTranslation configureFromDefines() {
+ final String eolStyle = getConfigurationProperty("eolStyle");
+ if(eolStyle != null)
+ setEolStyle(eolStyle);
+ final String dir = getConfigurationProperty("dir");
+ if(dir != null)
+ setDir(dir);
+ final String includes = getConfigurationProperty("includes");
+ if(includes != null)
+ setIncludes(includes);
+ final String excludes = getConfigurationProperty("excludes");
+ if(excludes != null)
+ setExcludes(excludes);
+ final String outputDir = getConfigurationProperty("outputdir");
+ if(outputDir != null)
+ setOutputDir(outputDir);
+ final String writeIfUnchanged = getConfigurationProperty("writeIfUnchanged");
+ if(writeIfUnchanged != null)
+ setWriteIfUnchanged(Boolean.parseBoolean(writeIfUnchanged));
+ return this;
+ }
+
+ protected String getConfigurationProperty(String key) {
+ String propertyName = getClass().getName() + "." + key;
+ return System.getProperty(propertyName, null);
+ }
+
+ private int process(File[] inputFiles, boolean checkOnly) {
+ try {
+ int countFormattingRequired = 0;
+ for (int i = 0; i < inputFiles.length; i++) {
+ File inputFile = inputFiles[i];
+ log("processing " + inputFile + "...", Project.MSG_DEBUG);
+ final String input = TaskUtils.readFile(inputFile);
+ final ArrayList<String> lines = new ArrayList<String>(2048);
+ boolean eolStyleMatches = TaskUtils.checkEolStyleAndReadLines(input, lines, lineSeparator);
+ final ArrayList<String> sortedLines = processLines(inputFile.getName(), new ArrayList<String>(lines));
+ final boolean contentChanged = !lines.equals(sortedLines);
+ final boolean formattingRequired = !eolStyleMatches || contentChanged;
+ if (formattingRequired) {
+ ++countFormattingRequired;
+ if (checkOnly)
+ warn(inputFile + " requires formatting - " + formatCause(contentChanged, eolStyleMatches));
+ else
+ log(inputFile + "formatted - " + formatCause(contentChanged, eolStyleMatches),
+ Project.MSG_DEBUG);
+ }
+ if (!checkOnly && (formattingRequired || writeIfUnchanged)) {
+ File outputFile;
+ if (outputDir != null)
+ outputFile = new File(outputDir, inputFile.getName());
+ else
+ outputFile = inputFile;
+ TaskUtils.writeFile(outputFile, sortedLines, lineSeparator);
+ }
+ }
+ return countFormattingRequired;
+ }
+ catch (IOException e) {
+ throw new BuildException(e);
+ }
+ }
+
+ private String formatCause(boolean contentChanged, boolean eolStyleMatches) {
+ final String string1 = eolStyleMatches ? "" : "wrong eol style";
+ final String string2 = contentChanged ? "content changed" : "";
+ return string1 + (string1.length() > 0 && string2.length() > 0 ? ", " : "") + string2;
+ }
+
+ private void validate() {
+ if (inputDir == null)
+ throw new BuildException("missing attribute 'dir'");
+ if (outputDir == null)
+ outputDir = inputDir;
+ if (!inputDir.isDirectory())
+ throw new BuildException("input directory '" + inputDir + "' does not exist");
+ if (!outputDir.isDirectory() && !outputDir.mkdirs())
+ throw new BuildException("cannot create output directory '" + outputDir + "'");
+ }
+
+ ArrayList<String> processLines(final String filename, ArrayList<String> lines) {
+ Collections.sort(lines, KEY_COMPARATOR);
+ ArrayList<String> result = new ArrayList<String>(lines.size());
+ String lastKey = null;
+ String lastValue = null;
+ for (final String line : lines) {
+ if (line.indexOf('#') == 0 || line.matches("\\s*"))
+ continue;
+ final String standardUnicodeLine = convertUnicodeCharacterRepresentation(line);
+ final String[] keyValue = standardUnicodeLine.split("\\s*=\\s*", 2);
+ if (keyValue.length != 2 || keyValue[0].length() == 0) {
+ // broken line: no '=' sign or empty key (we had " = ======")
+ warn(filename + ": no key/val: " + line);
+ continue;
+ }
+ final String thisKey = keyValue[0];
+ String thisValue = keyValue[1].trim();
+ if (thisValue.matches("(\\[auto\\]|\\[translate me\\])?")) {
+ warn(filename + ": drop empty translation: " + line);
+ continue;
+ }
+ if (thisValue.indexOf("{1}") != -1 && keyValue[1].indexOf("{0}") == -1) {
+ warn(filename + ": errorneous placeholders usage: {1} used without {0}: " + line);
+ }
+ if (thisValue.matches(".*\\$\\d.*")) {
+ warn(filename + ": use '{0}' instead of '$1' as placeholder! (likewise for $2...): " + line);
+ thisValue = thisValue.replaceAll("\\$1", "{0}").replaceAll("\\$2", "{1}");
+ }
+ if (thisValue.matches(".*\\{\\d[^},]*")) {
+ warn(filename + ": mismatched braces in placeholder: '{' not closed by '}': " + line);
+ }
+ if (thisValue.matches(".*[^']'[^'].*\\{\\d\\}.*") || thisValue.matches(".*\\{\\d\\}.*[^']'[^'].*")) {
+ warn(filename + ": replaced single quotes in strings containing placeholders by two: "
+ + "\"'{0}' n'a\" -> \"''{0}'' n''a\": " + line);
+ thisValue = thisValue.replaceAll("([^'])'([^'])", "$1''$2");
+ }
+ if (lastKey != null && thisKey.equals(lastKey)) {
+ if (quality(thisValue) < quality(lastValue)) {
+ log(filename + ": drop " + TaskUtils.toLine(lastKey, thisValue));
+ continue;
+ }
+ else if (quality(thisValue) == quality(lastValue)) {
+ if (thisValue.equals(lastValue)) {
+ log(filename + ": drop duplicate " + TaskUtils.toLine(lastKey, thisValue));
+ }
+ else if (quality(thisValue) == QUALITY_MANUALLY_TRANSLATED) {
+ warn(filename //
+ + ": drop one of two of equal quality (revisit!):keep: "
+ + TaskUtils.toLine(lastKey, lastValue));
+ warn(filename //
+ + ": drop one of two of equal quality (revisit!):drop: "
+ + TaskUtils.toLine(thisKey, thisValue));
+ }
+ else {
+ log(filename + ": drop " + TaskUtils.toLine(lastKey, thisValue));
+ }
+ continue;
+ }
+ else {
+ log(filename + ": drop " + TaskUtils.toLine(lastKey, lastValue));
+ }
+ lastValue = thisValue;
+ }
+ else {
+ if (lastKey != null)
+ result.add(TaskUtils.toLine(lastKey, lastValue));
+ lastKey = thisKey;
+ lastValue = thisValue;
+ }
+ }
+ if (lastKey != null)
+ result.add(TaskUtils.toLine(lastKey, lastValue));
+ return result;
+ }
+
+ private int quality(String value) {
+ if (value.length() == 0)
+ return QUALITY_NULL;
+ if (value.indexOf("[translate me]") > 0)
+ return QUALITY_TRANSLATE_ME;
+ if (value.indexOf("[auto]") > 0)
+ return QUALITY_AUTO_TRANSLATED;
+ return QUALITY_MANUALLY_TRANSLATED;
+ }
+
+ private void warn(String msg) {
+ log(msg, Project.MSG_WARN);
+ }
+
+ /** per default output files will only be created if the output would
+ * differ from the input file. Set attribute <code>writeIfUnchanged</code>
+ * to "true" to enforce file creation. */
+ public void setWriteIfUnchanged(boolean writeIfUnchanged) {
+ this.writeIfUnchanged = writeIfUnchanged;
+ }
+
+ public void setDir(String inputDir) {
+ setDir(new File(inputDir));
+ }
+
+ public void setDir(File inputDir) {
+ this.inputDir = inputDir;
+ }
+
+ public void setIncludes(String pattern) {
+ includePatterns.add(Pattern.compile(TaskUtils.wildcardToRegex(pattern)));
+ }
+
+ public void setExcludes(String pattern) {
+ excludePatterns.add(Pattern.compile(TaskUtils.wildcardToRegex(pattern)));
+ }
+
+ /** parameter is set in the build file via the attribute "outputDir" */
+ public void setOutputDir(String outputDir) {
+ setOutputDir(new File(outputDir));
+ }
+
+ /** parameter is set in the build file via the attribute "outputDir" */
+ public void setOutputDir(File outputDir) {
+ this.outputDir = outputDir;
+ }
+
+ /** parameter is set in the build file via the attribute "eolStyle" */
+ public void setEolStyle(String eolStyle) {
+ if (eolStyle.toLowerCase().startsWith("unix"))
+ lineSeparator = "\n";
+ else if (eolStyle.toLowerCase().startsWith("win"))
+ lineSeparator = "\r\n";
+ else if (eolStyle.toLowerCase().startsWith("mac"))
+ lineSeparator = "\r";
+ else
+ throw new BuildException("unknown eolStyle, known: unix|win|mac");
+ }
+
+ public String convertUnicodeCharacterRepresentation(String input) {
+ final char[] chars = input.toCharArray();
+ int nonAsciiCharCount = countNonAsciiCharacters(chars);
+ if(! (input.contains("\\u") || input.contains("\\U")) && nonAsciiCharCount == 0)
+ return input;
+ int replacedNonAsciiCharacterCount = 0;
+ final char[] result = nonAsciiCharCount == 0 ? chars : new char[chars.length + 5 * nonAsciiCharCount];
+ for (int offset = 0; offset < chars.length; offset++) {
+ int resultOffset = offset + 5 * replacedNonAsciiCharacterCount;
+ final char c = chars[offset];
+ if (c == '\\' && (chars[offset+1] == 'u' || chars[offset+1] == 'U')) {
+ putFormattedUnicodeRepresentation(chars, offset, result, resultOffset);
+ offset+=5;
+ } else if(c <= 127) {
+ if(resultOffset >= result.length ) {
+ throw new AssertionError(input + "//" + new String(result));
+ }
+ result[resultOffset] = c;
+ } else {
+ putEncodedNonAsciiCharacter(c, result, resultOffset);
+ replacedNonAsciiCharacterCount++;
+ }
+
+ }
+ return new String(result);
+ }
+
+ private void putFormattedUnicodeRepresentation(final char[] input, int inputOffset, final char[] target,
+ int targetOffset) {
+ target[targetOffset+1] = 'u';
+ for(int i = 2; i < 6; i++){
+ target[targetOffset+i] = Character.toUpperCase(input[inputOffset+i]);
+ }
+ }
+
+ private void putEncodedNonAsciiCharacter(final char c, final char[] result, int offset) {
+ result[offset++] = '\\';
+ result[offset++] = 'u';
+ final String hex = String.format("%04X", (int)c);
+ for(char digit : hex.toCharArray()){
+ result[offset++] = digit;
+ }
+ }
+
+ private int countNonAsciiCharacters(final char[] chars) {
+ int nonAsciiCharCount = 0;
+ for (int offset = 0; offset < chars.length; offset++) {
+ if (chars[offset] > 127) {
+ nonAsciiCharCount++;
+ }
+ }
+ return nonAsciiCharCount;
+ }
+}
diff --git a/freeplane_ant/src/main/java/org/freeplane/ant/FormatTranslationCheck.java b/freeplane_ant/src/main/java/org/freeplane/ant/FormatTranslationCheck.java
new file mode 100644
index 0000000..60389bd
--- /dev/null
+++ b/freeplane_ant/src/main/java/org/freeplane/ant/FormatTranslationCheck.java
@@ -0,0 +1,75 @@
+/**
+ * FormatTranslationCheck.java
+ *
+ * Copyright (C) 2010, Volker Boerchers
+ *
+ * FormatTranslationCheck.java 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 3 of the License, or (at your
+ * option) any later version.
+ *
+ * FormatTranslationCheck.java is distributed in the hope that it will be
+ * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+ * Public License for more details.
+ */
+package org.freeplane.ant;
+
+import java.io.File;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+/** checks if the input files are sorted. */
+public class FormatTranslationCheck extends Task {
+ private FormatTranslation formatTranslation = new FormatTranslation();
+ private boolean failOnError = true;
+
+ public void execute() {
+ int countUnformatted = formatTranslation.checkOnly();
+ final String message = countUnformatted + " files require proper formatting - run format_translation to fix";
+ if (countUnformatted == 0)
+ formatTranslation.log("all files are properly formatted", Project.MSG_DEBUG);
+ else if (failOnError)
+ throw new BuildException(message);
+ else
+ formatTranslation.log(message, Project.MSG_ERR);
+ }
+
+ public void setDir(String inputDir) {
+ formatTranslation.setDir(inputDir);
+ }
+
+ public void setDir(File inputDir) {
+ formatTranslation.setDir(inputDir);
+ }
+
+ public void setIncludes(String pattern) {
+ formatTranslation.setIncludes(pattern);
+ }
+
+ public void setExcludes(String pattern) {
+ formatTranslation.setExcludes(pattern);
+ }
+
+ public void setFailOnError(boolean failOnError) {
+ this.failOnError = failOnError;
+ }
+
+ public void setEolStyle(String eolStyle) {
+ formatTranslation.setEolStyle(eolStyle);
+ }
+
+ public static void main(String[] args) {
+ final FormatTranslationCheck formatTranslationCheck = new FormatTranslationCheck();
+ final Project project = TaskUtils.createProject(formatTranslationCheck);
+ formatTranslationCheck.setTaskName("check-translation");
+ formatTranslationCheck.formatTranslation.setProject(project);
+ formatTranslationCheck.formatTranslation.setTaskName("check-translation");
+ formatTranslationCheck.setDir("/devel/freeplane-bazaar-repo/1_0_x_plain/freeplane/resources/translations");
+ formatTranslationCheck.setIncludes("Resources_*.properties");
+ formatTranslationCheck.execute();
+ System.out.println("done");
+ }
+}
diff --git a/freeplane_ant/src/main/java/org/freeplane/ant/TaskUtils.java b/freeplane_ant/src/main/java/org/freeplane/ant/TaskUtils.java
new file mode 100644
index 0000000..90e9dd5
--- /dev/null
+++ b/freeplane_ant/src/main/java/org/freeplane/ant/TaskUtils.java
@@ -0,0 +1,229 @@
+/**
+ * TaskUtils.java
+ *
+ * Copyright (C) 2010, Volker Boerchers
+ *
+ * Translator.java 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Translator.java is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+package org.freeplane.ant;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.input.InputHandler;
+import org.apache.tools.ant.input.InputRequest;
+import org.apache.tools.ant.input.MultipleChoiceInputRequest;
+import org.apache.tools.ant.util.StringUtils;
+
+public class TaskUtils {
+ static class IncludeFileFilter implements FileFilter {
+ private ArrayList<Pattern> includePatterns = new ArrayList<Pattern>();
+ private ArrayList<Pattern> excludePatterns = new ArrayList<Pattern>();
+
+ IncludeFileFilter(ArrayList<Pattern> includePatterns, ArrayList<Pattern> excludePatterns) {
+ this.includePatterns = includePatterns;
+ this.excludePatterns = excludePatterns;
+ }
+
+ public boolean accept(File pathname) {
+ if (pathname.isDirectory())
+ return false;
+ for (Pattern pattern : excludePatterns) {
+ if (pattern.matcher(pathname.getName()).matches())
+ return false;
+ }
+ if (includePatterns.isEmpty())
+ return true;
+ for (Pattern pattern : includePatterns) {
+ if (pattern.matcher(pathname.getName()).matches())
+ return true;
+ }
+ return false;
+ }
+ }
+
+ static void writeFile(File outputFile, ArrayList<String> sortedLines, String lineSeparator) throws IOException {
+ BufferedWriter out = null;
+ try {
+ out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "US-ASCII"));
+ for (String line : sortedLines) {
+ out.write(line.replaceAll("\\\\[\n\r]+", "\\\\" + lineSeparator));
+ // change this to write(<sep>) to enforce Unix or Dos or Mac newlines
+ out.write(lineSeparator);
+ }
+ }
+ finally {
+ if (out != null) {
+ try {
+ out.close();
+ }
+ catch (IOException e) {
+ // can't help it
+ }
+ }
+ }
+ }
+
+ // adapted from http://www.rgagnon.com/javadetails/java-0515.html, Real Gagnon
+ public static String wildcardToRegex(String wildcard) {
+ StringBuilder s = new StringBuilder(wildcard.length());
+ s.append('^');
+ for (int i = 0, is = wildcard.length(); i < is; i++) {
+ char c = wildcard.charAt(i);
+ switch (c) {
+ case '*':
+ s.append(".*");
+ break;
+ case '?':
+ s.append(".");
+ break;
+ // escape special regexp-characters
+ case '(':
+ case ')':
+ case '$':
+ case '^':
+ case '.':
+ case '{':
+ case '}':
+ case '|':
+ case '\\':
+ s.append("\\");
+ s.append(c);
+ break;
+ default:
+ s.append(c);
+ break;
+ }
+ }
+ s.append('$');
+ return (s.toString());
+ }
+
+ static String readFile(final File inputFile) throws IOException {
+ InputStreamReader in = null;
+ try {
+ in = new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1");
+ StringBuilder builder = new StringBuilder();
+ final char[] buf = new char[1024];
+ int len;
+ while ((len = in.read(buf)) > 0) {
+ builder.append(buf, 0, len);
+ }
+ return builder.toString();
+ }
+ finally {
+ if (in != null) {
+ try {
+ in.close();
+ }
+ catch (IOException e) {
+ // can't help it
+ }
+ }
+ }
+ }
+
+ /** returns true if all eols match <code>lineSep</code>. */
+ /*package*/static boolean checkEolStyleAndReadLines(String input, ArrayList<String> resultList, String lineSep) {
+ resultList.clear();
+ boolean eolStyleMatches = true;
+ final Matcher matcher = Pattern.compile("(?<!\\\\)(\r\n?|\n)").matcher(input);
+ int index = 0;
+ while (matcher.find()) {
+ final String match = input.subSequence(index, matcher.start()).toString();
+ final String separator = matcher.group(1);
+ if (separator.equals("\n") && match.endsWith("\\\r")) {
+ // only windows: catch escaped CRLF (\\r\n) which will be parsed as \\r<split>\n
+ // not setting index will simply skip this match
+ }
+ else {
+ if (!matchEolStyle(separator, lineSep)) {
+ eolStyleMatches = false;
+ }
+ resultList.add(match);
+ index = matcher.end();
+ }
+ }
+ // Add remaining segment
+ if (input.length() > index)
+ resultList.add(input.subSequence(index, input.length()).toString());
+ return eolStyleMatches;
+ }
+
+ /*package*/static boolean matchEolStyle(String eol, String lineSep) {
+ // quick success in the normal case
+ if (lineSep.equals(eol))
+ return true;
+ int i = 0;
+ for (; i < eol.length(); i += lineSep.length()) {
+ if (eol.indexOf(lineSep, i) != i)
+ return false;
+ }
+ return i == eol.length();
+ }
+
+ static String toLine(String key, String value) {
+ return key + "=" + value;
+ }
+
+ static Project createProject(final Task task) {
+ final Project project = new Project();
+ final DefaultLogger logger = new DefaultLogger();
+ logger.setMessageOutputLevel(Project.MSG_INFO);
+ logger.setOutputPrintStream(System.out);
+ logger.setErrorPrintStream(System.err);
+ project.addBuildListener(logger);
+ task.setProject(project);
+ return project;
+ }
+
+ static String firstToUpper(String string) {
+ if (string == null || string.length() < 2)
+ return string;
+ return string.substring(0, 1).toUpperCase() + string.substring(1);
+ }
+
+ @SuppressWarnings("unchecked")
+ static String multipleChoice(Project project, String message, String validValues, String defaultValue) {
+ InputRequest request = null;
+ if (validValues != null) {
+ Vector<String> accept = StringUtils.split(validValues, ',');
+ request = new MultipleChoiceInputRequest(message, accept);
+ }
+ else {
+ request = new InputRequest(message);
+ }
+ InputHandler handler = project.getInputHandler();
+ handler.handleInput(request);
+ final String value = request.getInput();
+ if ((value == null || value.trim().length() == 0) && defaultValue != null) {
+ return defaultValue;
+ }
+ return value;
+ }
+
+ static String ask(Project project, String message, String defaultValue) {
+ return multipleChoice(project, message, defaultValue, null);
+ }
+}
diff --git a/freeplane_ant/src/org/freeplane/ant/CreatePlugin.java b/freeplane_ant/src/org/freeplane/ant/CreatePlugin.java
deleted file mode 100644
index 8e5789c..0000000
--- a/freeplane_ant/src/org/freeplane/ant/CreatePlugin.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * CreatePlugin.java
- *
- * Copyright (C) 2010, Volker Boerchers
- *
- * CreatePlugin.java 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 3 of the License, or (at your
- * option) any later version.
- *
- * FormatTranslation.java is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-package org.freeplane.ant;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Scanner;
-import java.util.regex.Pattern;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Task;
-
-/** creates a skeleton of a new Freeplane plugin. */
-public class CreatePlugin extends Task {
- private static final String FREEPLANE_PLUGIN_PREFIX = "freeplane_plugin_";
- private String pluginName;
- private File newPluginDir;
- private File pluginTemplateDir;
- private File baseDir;
-
- @Override
- public void execute() {
- // Freeplane has no build.xml on root level but only in projects -> use parentDir
- baseDir = (baseDir == null) ? getProject().getBaseDir().getParentFile() : baseDir;
- readAndValidateParameters();
- newPluginDir = new File(baseDir, FREEPLANE_PLUGIN_PREFIX + pluginName);
- if (newPluginDir.exists())
- fatal("won't overwrite output directory " + newPluginDir + " - please remove it first");
- createDirs();
- try {
- createSources();
- createOtherFiles();
- }
- catch (IOException e) {
- throw new BuildException("error creating files: " + e.getMessage(), e);
- }
- finalWords();
- }
-
- private void readAndValidateParameters() {
- pluginTemplateDir = getPluginTemplateDir();
- if (!pluginTemplateDir.isDirectory())
- fatal("cannot find Freeplane source directory: " + pluginTemplateDir + " does not exist");
- if (pluginName == null) {
- pluginName = TaskUtils.ask(getProject(), "=> Please enter required plugin name:", null);
- assertNotNull(pluginName, "property 'pluginName' is required");
- }
- pluginName = pluginName.replaceAll(FREEPLANE_PLUGIN_PREFIX, "").toLowerCase();
- if (!pluginName.matches("[a-z]+"))
- fatal("plugin name may only contain letters from the range [a-z]");
- }
-
- private void createDirs() {
- String[] subdirs = { ".settings" //
- , "ant" //
- , "lib" //
- , "META-INF" //
- , "src" //
- , "src/org" //
- , "src/org/freeplane" //
- , "src/org/freeplane/plugin" //
- , "src/org/freeplane/plugin/" + pluginName //
- };
- mkdir(newPluginDir);
- for (String dir : subdirs) {
- mkdir(new File(newPluginDir, dir));
- }
- }
-
- private void createSources() throws IOException {
- createAction();
- createActivator();
- }
-
- private void createAction() throws IOException {
- final String capPluginName = TaskUtils.firstToUpper(pluginName);
- String source = "package " + packageName() + ";\n"
- + new Scanner(getClass().getResourceAsStream("/$$$$Action.java"), "UTF-8").useDelimiter("\\A").next().replaceAll(Pattern.quote("$$$$"), TaskUtils.firstToUpper(pluginName));
- write(new File(sourceDir(), capPluginName + "Action.java"), source);
- }
-
- private void createActivator() throws IOException {
- String source = "package " + packageName() + ";\n"
- + new Scanner(getClass().getResourceAsStream("/Activator.java"), "UTF-8").useDelimiter("\\A").next().replaceAll(Pattern.quote("$$$$"), TaskUtils.firstToUpper(pluginName));
- write(new File(sourceDir(), "Activator.java"), source);
- }
-
- private void createOtherFiles() throws IOException {
- String[] files = { //
- ".classpath" //
- , ".project" //
- , ".settings/org.eclipse.core.resources.prefs" //
- , ".settings/org.eclipse.core.runtime.prefs" //
- , ".settings/org.eclipse.jdt.core.prefs" //
- , ".settings/org.eclipse.pde.core.prefs" //
- , "ant/ant.properties" //
- , "ant/build.xml" //
- , "META-INF/MANIFEST.MF" //
- };
- for (String fileName : files) {
- final String content = TaskUtils.readFile(new File(pluginTemplateDir, fileName));
- final File newFile = new File(newPluginDir, fileName);
- write(newFile, transform(content));
- }
- // build.properties were missing in 1_0_x so don't try to copy them
- write(new File(newPluginDir, "build.properties"), "source.lib/plugin.jar = src/\n");
- }
-
- private String transform(String content) {
- return content //
- .replaceAll("<classpathentry kind=\"lib\"[^>]*>\\s*", "") // .classpath special
- .replaceAll("(jlatexmath.jar = )", "# $1") // ant.properties special
- .replaceAll("lib/jlatexmath.jar,\\s*(lib/plugin.jar)", "$1") // MANIFEST.MF special
- .replace("${commons-lang.jar}:${forms.jar}:${SimplyHTML.jar}:${jlatexmath.jar}", "") // build.xml special
- .replaceAll("latex", pluginName) //
- .replaceAll("Latex", TaskUtils.firstToUpper(pluginName)) //
- .replaceAll("LATEX", pluginName.toUpperCase()) //
- ;
- }
-
- private void write(File file, String content) throws IOException {
- Writer output = new BufferedWriter(new FileWriter(file));
- try {
- // assuming that default encoding is OK!
- output.write(content);
- }
- finally {
- output.close();
- }
- }
-
- private void finalWords() {
- String buildFragment = " <antcall target=\"makePlugin\" inheritall=\"false\">\n" //
- + " <param name=\"anttarget\" value=\"dist\"/>\n" //
- + " <param name=\"targetdir\" value=\"plugins\"/>\n" //
- + " <param name=\"plugindir\" value=\"freeplane_plugin_" + pluginName + "\"/>\n" //
- + " <param name=\"pluginname\" value=\"org.freeplane.plugin." + pluginName + "\"/>\n" //
- + " </antcall>\n";
- log("New plugin created in " + newPluginDir);
- log("What next?");
- log("* import plugin into Eclipse via Import... -> Existing Projects into Workspace");
- log("* add required external jars to " + new File(newPluginDir, "lib"));
- log("* add required external jars and required Freeplane projects to classpath");
- log("* search for \"TODO\" in the project and fill the gaps");
- log("* add the following element to freeplane_framework/ant/build.xml:\n" + buildFragment);
- }
-
- private File sourceDir() {
- return new File(newPluginDir, "src/org/freeplane/plugin/" + pluginName);
- }
-
- private String packageName() {
- return "org.freeplane.plugin." + pluginName;
- }
-
- private File getPluginTemplateDir() {
- return new File(baseDir, "freeplane_plugin_latex");
- }
-
- private void mkdir(File dir) {
- if (!dir.mkdir())
- fatal(("cannot create directory " + dir));
- }
-
- private void assertNotNull(Object property, String message) {
- if (property == null)
- fatal(message);
- }
-
- private void fatal(String message) {
- log(message, Project.MSG_ERR);
- throw new BuildException(message);
- }
-
- // == properties
- public String getPluginName() {
- return pluginName;
- }
-
- public void setPluginName(String pluginName) {
- this.pluginName = pluginName;
- }
-
- public File getBaseDir() {
- return baseDir;
- }
-
- public void setBaseDir(File baseDir) {
- this.baseDir = baseDir;
- }
-
- public void setBaseDir(String baseDir) {
- setBaseDir(new File(baseDir));
- }
-}
diff --git a/freeplane_ant/src/org/freeplane/ant/FormatTranslation.java b/freeplane_ant/src/org/freeplane/ant/FormatTranslation.java
deleted file mode 100644
index 408a548..0000000
--- a/freeplane_ant/src/org/freeplane/ant/FormatTranslation.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/**
- * FormatTranslation.java
- *
- * Copyright (C) 2010, Volker Boerchers
- *
- * FormatTranslation.java 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 3 of the License, or (at your
- * option) any later version.
- *
- * FormatTranslation.java is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-package org.freeplane.ant;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.regex.Pattern;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Task;
-
-/** formats a translation file and writes the result to another file.
- * The following transformations are made:
- * <ol>
- * <li> sort lines (case insensitive)
- * <li> remove duplicates
- * <li> if a key is present multiple times entries marked as [translate me]
- * and [auto] are removed in favor of normal entries.
- * <li> newline style is changed to <eolStyle>.
- * </ol>
- *
- * Attributes:
- * <ul>
- * <li> dir: the input directory (default: ".")
- * <li> outputDir: the output directory. Overwrites existing files if outputDir
- * equals the input directory (default: the input directory)
- * <li> includes: wildcard pattern (default: all regular files).
- * <li> excludes: wildcard pattern, overrules includes (default: no excludes).
- * <li> eolStyle: unix|mac|windows (default: platform default).
- * </ul>
- *
- * Build messages:
- * <table border=1>
- * <tr><th>Message</th><th>Action</th><th>Description</th></tr>
- * <tr><td><file>: no key/val: <line></td><td>drop line</td><td>broken line with an empty key or without an '=' sign</td></tr>
- * <tr><td><file>: drop duplicate: <line></td><td>drop line</td><td>two completely identical lines</td></tr>
- * <tr><td><file>: drop: <line></td><td>drop line</td>
- * <td>this translation is dropped since a better one was found
- * (quality: [translate me] -> [auto] -> manually translated)
- * </td>
- * </tr>
- * <tr><td><file>: drop one of two of equal quality (revisit!):keep: <line></td><td>keep line</td>
- * <td>for one key two manual translations were found. This one (arbitrarily chosen) will be kept.
- * Printout of the complete line allows to correct an action of FormatTranslation via Copy and Past
- * if it chose the wrong tranlation.
- * </td>
- * </tr>
- * <tr><td><file>: drop one of two of equal quality (revisit!):drop: <line></td><td>drop line</td>
- * <td>accompanies the :keep: line: This is the line that is dropped.
- * </td>
- * </tr>
- * </table>
- * Note that CheckTranslation does not remove anything but produces the same messages!
- */
-public class FormatTranslation extends Task {
- static Comparator<String> KEY_COMPARATOR = new Comparator<String>() {
- @Override
- public int compare(String s1, String s2) {
- int n1 = s1.length(), n2 = s2.length();
- for (int i1 = 0, i2 = 0; i1 < n1 && i2 < n2; i1++, i2++) {
- char c1 = s1.charAt(i1);
- char c2 = s2.charAt(i2);
- boolean c1Terminated = c1 == ' ' || c1 == '\t' || c1 == '=';
- boolean c2Terminated = c2 == ' ' || c2 == '\t' || c2 == '=';
- if (c1Terminated && c2Terminated)
- return 0;
- if (c1Terminated && !c2Terminated)
- return -1;
- if (c2Terminated && !c1Terminated)
- return 1;
- if (c1 != c2) {
- c1 = Character.toUpperCase(c1);
- c2 = Character.toUpperCase(c2);
- if (c1 != c2) {
- c1 = Character.toLowerCase(c1);
- c2 = Character.toLowerCase(c2);
- if (c1 != c2) {
- return c1 - c2;
- }
- }
- }
- }
- return n1 - n2;
- }
- };
- private final static int QUALITY_NULL = 0; // for empty values
- private final static int QUALITY_TRANSLATE_ME = 1;
- private final static int QUALITY_AUTO_TRANSLATED = 2;
- private final static int QUALITY_MANUALLY_TRANSLATED = 3;
- private File outputDir;
- private boolean writeIfUnchanged = false;
- private File inputDir = new File(".");
- private final ArrayList<Pattern> includePatterns = new ArrayList<Pattern>();
- private final ArrayList<Pattern> excludePatterns = new ArrayList<Pattern>();
- private String lineSeparator = System.getProperty("line.separator");
-
- @Override
- public void execute() {
- final int countFormatted = executeImpl(false);
- log(inputDir + ": formatted " + countFormatted + " file" + (countFormatted == 1 ? "" : "s"));
- }
-
- public int checkOnly() {
- return executeImpl(true);
- }
-
- /** returns the number of unformatted files. */
- private int executeImpl(boolean checkOnly) {
- validate();
- File[] inputFiles = inputDir.listFiles(new TaskUtils.IncludeFileFilter(includePatterns, excludePatterns));
- return process(inputFiles, checkOnly);
- }
-
- static public void main(final String argc[]) {
- File[] inputFiles = new File[argc.length];
- int i = 0;
- for (String arg : argc) {
- inputFiles[i++] = new File(arg);
- }
- new FormatTranslation().configureFromDefines().process(inputFiles, false);
- }
-
- private FormatTranslation configureFromDefines() {
- final String eolStyle = getConfigurationProperty("eolStyle");
- if(eolStyle != null)
- setEolStyle(eolStyle);
- final String dir = getConfigurationProperty("dir");
- if(dir != null)
- setDir(dir);
- final String includes = getConfigurationProperty("includes");
- if(includes != null)
- setIncludes(includes);
- final String excludes = getConfigurationProperty("excludes");
- if(excludes != null)
- setExcludes(excludes);
- final String outputDir = getConfigurationProperty("outputdir");
- if(outputDir != null)
- setOutputDir(outputDir);
- final String writeIfUnchanged = getConfigurationProperty("writeIfUnchanged");
- if(writeIfUnchanged != null)
- setWriteIfUnchanged(Boolean.parseBoolean(writeIfUnchanged));
- return this;
- }
-
- protected String getConfigurationProperty(String key) {
- String propertyName = getClass().getName() + "." + key;
- return System.getProperty(propertyName, null);
- }
-
- private int process(File[] inputFiles, boolean checkOnly) {
- try {
- int countFormattingRequired = 0;
- for (int i = 0; i < inputFiles.length; i++) {
- File inputFile = inputFiles[i];
- log("processing " + inputFile + "...", Project.MSG_DEBUG);
- final String input = TaskUtils.readFile(inputFile);
- final ArrayList<String> lines = new ArrayList<String>(2048);
- boolean eolStyleMatches = TaskUtils.checkEolStyleAndReadLines(input, lines, lineSeparator);
- final ArrayList<String> sortedLines = processLines(inputFile.getName(), new ArrayList<String>(lines));
- final boolean contentChanged = !lines.equals(sortedLines);
- final boolean formattingRequired = !eolStyleMatches || contentChanged;
- if (formattingRequired) {
- ++countFormattingRequired;
- if (checkOnly)
- warn(inputFile + " requires formatting - " + formatCause(contentChanged, eolStyleMatches));
- else
- log(inputFile + "formatted - " + formatCause(contentChanged, eolStyleMatches),
- Project.MSG_DEBUG);
- }
- if (!checkOnly && (formattingRequired || writeIfUnchanged)) {
- File outputFile;
- if (outputDir != null)
- outputFile = new File(outputDir, inputFile.getName());
- else
- outputFile = inputFile;
- TaskUtils.writeFile(outputFile, sortedLines, lineSeparator);
- }
- }
- return countFormattingRequired;
- }
- catch (IOException e) {
- throw new BuildException(e);
- }
- }
-
- private String formatCause(boolean contentChanged, boolean eolStyleMatches) {
- final String string1 = eolStyleMatches ? "" : "wrong eol style";
- final String string2 = contentChanged ? "content changed" : "";
- return string1 + (string1.length() > 0 && string2.length() > 0 ? ", " : "") + string2;
- }
-
- private void validate() {
- if (inputDir == null)
- throw new BuildException("missing attribute 'dir'");
- if (outputDir == null)
- outputDir = inputDir;
- if (!inputDir.isDirectory())
- throw new BuildException("input directory '" + inputDir + "' does not exist");
- if (!outputDir.isDirectory() && !outputDir.mkdirs())
- throw new BuildException("cannot create output directory '" + outputDir + "'");
- }
-
- ArrayList<String> processLines(final String filename, ArrayList<String> lines) {
- Collections.sort(lines, KEY_COMPARATOR);
- ArrayList<String> result = new ArrayList<String>(lines.size());
- String lastKey = null;
- String lastValue = null;
- for (final String line : lines) {
- if (line.indexOf('#') == 0 || line.matches("\\s*"))
- continue;
- final String standardUnicodeLine = convertUnicodeCharacterRepresentation(line);
- final String[] keyValue = standardUnicodeLine.split("\\s*=\\s*", 2);
- if (keyValue.length != 2 || keyValue[0].length() == 0) {
- // broken line: no '=' sign or empty key (we had " = ======")
- warn(filename + ": no key/val: " + line);
- continue;
- }
- final String thisKey = keyValue[0];
- String thisValue = keyValue[1];
- if (thisValue.matches("(\\[auto\\]|\\[translate me\\])?")) {
- warn(filename + ": drop empty translation: " + line);
- continue;
- }
- if (thisValue.indexOf("{1}") != -1 && keyValue[1].indexOf("{0}") == -1) {
- warn(filename + ": errorneous placeholders usage: {1} used without {0}: " + line);
- }
- if (thisValue.matches(".*\\$\\d.*")) {
- warn(filename + ": use '{0}' instead of '$1' as placeholder! (likewise for $2...): " + line);
- thisValue = thisValue.replaceAll("\\$1", "{0}").replaceAll("\\$2", "{1}");
- }
- if (thisValue.matches(".*\\{\\d[^},]*")) {
- warn(filename + ": mismatched braces in placeholder: '{' not closed by '}': " + line);
- }
- if (thisValue.matches(".*[^']'[^'].*\\{\\d\\}.*") || thisValue.matches(".*\\{\\d\\}.*[^']'[^'].*")) {
- warn(filename + ": replaced single quotes in strings containing placeholders by two: "
- + "\"'{0}' n'a\" -> \"''{0}'' n''a\": " + line);
- thisValue = thisValue.replaceAll("([^'])'([^'])", "$1''$2");
- }
- if (lastKey != null && thisKey.equals(lastKey)) {
- if (quality(thisValue) < quality(lastValue)) {
- log(filename + ": drop " + TaskUtils.toLine(lastKey, thisValue));
- continue;
- }
- else if (quality(thisValue) == quality(lastValue)) {
- if (thisValue.equals(lastValue)) {
- log(filename + ": drop duplicate " + TaskUtils.toLine(lastKey, thisValue));
- }
- else if (quality(thisValue) == QUALITY_MANUALLY_TRANSLATED) {
- warn(filename //
- + ": drop one of two of equal quality (revisit!):keep: "
- + TaskUtils.toLine(lastKey, lastValue));
- warn(filename //
- + ": drop one of two of equal quality (revisit!):drop: "
- + TaskUtils.toLine(thisKey, thisValue));
- }
- else {
- log(filename + ": drop " + TaskUtils.toLine(lastKey, thisValue));
- }
- continue;
- }
- else {
- log(filename + ": drop " + TaskUtils.toLine(lastKey, lastValue));
- }
- lastValue = thisValue;
- }
- else {
- if (lastKey != null)
- result.add(TaskUtils.toLine(lastKey, lastValue));
- lastKey = thisKey;
- lastValue = thisValue;
- }
- }
- if (lastKey != null)
- result.add(TaskUtils.toLine(lastKey, lastValue));
- return result;
- }
-
- private int quality(String value) {
- if (value.length() == 0)
- return QUALITY_NULL;
- if (value.indexOf("[translate me]") > 0)
- return QUALITY_TRANSLATE_ME;
- if (value.indexOf("[auto]") > 0)
- return QUALITY_AUTO_TRANSLATED;
- return QUALITY_MANUALLY_TRANSLATED;
- }
-
- private void warn(String msg) {
- log(msg, Project.MSG_WARN);
- }
-
- /** per default output files will only be created if the output would
- * differ from the input file. Set attribute <code>writeIfUnchanged</code>
- * to "true" to enforce file creation. */
- public void setWriteIfUnchanged(boolean writeIfUnchanged) {
- this.writeIfUnchanged = writeIfUnchanged;
- }
-
- public void setDir(String inputDir) {
- setDir(new File(inputDir));
- }
-
- public void setDir(File inputDir) {
- this.inputDir = inputDir;
- }
-
- public void setIncludes(String pattern) {
- includePatterns.add(Pattern.compile(TaskUtils.wildcardToRegex(pattern)));
- }
-
- public void setExcludes(String pattern) {
- excludePatterns.add(Pattern.compile(TaskUtils.wildcardToRegex(pattern)));
- }
-
- /** parameter is set in the build file via the attribute "outputDir" */
- public void setOutputDir(String outputDir) {
- setOutputDir(new File(outputDir));
- }
-
- /** parameter is set in the build file via the attribute "outputDir" */
- public void setOutputDir(File outputDir) {
- this.outputDir = outputDir;
- }
-
- /** parameter is set in the build file via the attribute "eolStyle" */
- public void setEolStyle(String eolStyle) {
- if (eolStyle.toLowerCase().startsWith("unix"))
- lineSeparator = "\n";
- else if (eolStyle.toLowerCase().startsWith("win"))
- lineSeparator = "\r\n";
- else if (eolStyle.toLowerCase().startsWith("mac"))
- lineSeparator = "\r";
- else
- throw new BuildException("unknown eolStyle, known: unix|win|mac");
- }
-
- public String convertUnicodeCharacterRepresentation(String input) {
- if(! (input.contains("\\\\u") || input.contains("\\\\U")))
- return input;
- final char[] chars = input.toCharArray();
- for (int offset = 0; 6 + offset < chars.length; offset++) {
- if (chars[offset] == '\\' && (chars[offset+1] == 'u' || chars[offset+1] == 'U')) {
- chars[offset+1] = 'u';
- for(int i = 2; i < 6; i++){
- chars[offset+i] = Character.toUpperCase(chars[offset+i]);
- }
- offset+=5;
- }
- }
- return new String(chars);
- }
-}
diff --git a/freeplane_ant/src/org/freeplane/ant/FormatTranslationCheck.java b/freeplane_ant/src/org/freeplane/ant/FormatTranslationCheck.java
deleted file mode 100644
index e70b2c9..0000000
--- a/freeplane_ant/src/org/freeplane/ant/FormatTranslationCheck.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * FormatTranslationCheck.java
- *
- * Copyright (C) 2010, Volker Boerchers
- *
- * FormatTranslationCheck.java 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 3 of the License, or (at your
- * option) any later version.
- *
- * FormatTranslationCheck.java is distributed in the hope that it will be
- * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
- * Public License for more details.
- */
-package org.freeplane.ant;
-
-import java.io.File;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Task;
-
-/** checks if the input files are sorted. */
-public class FormatTranslationCheck extends Task {
- private FormatTranslation formatTranslation = new FormatTranslation();
- private boolean failOnError = true;
-
- public void execute() {
- int countUnformatted = formatTranslation.checkOnly();
- final String message = countUnformatted + " files require proper formatting - run format-translation to fix";
- if (countUnformatted == 0)
- formatTranslation.log("all files are properly formatted", Project.MSG_DEBUG);
- else if (failOnError)
- throw new BuildException(message);
- else
- formatTranslation.log(message, Project.MSG_ERR);
- }
-
- public void setDir(String inputDir) {
- formatTranslation.setDir(inputDir);
- }
-
- public void setDir(File inputDir) {
- formatTranslation.setDir(inputDir);
- }
-
- public void setIncludes(String pattern) {
- formatTranslation.setIncludes(pattern);
- }
-
- public void setExcludes(String pattern) {
- formatTranslation.setExcludes(pattern);
- }
-
- public void setFailOnError(boolean failOnError) {
- this.failOnError = failOnError;
- }
-
- public void setEolStyle(String eolStyle) {
- formatTranslation.setEolStyle(eolStyle);
- }
-
- public static void main(String[] args) {
- final FormatTranslationCheck formatTranslationCheck = new FormatTranslationCheck();
- final Project project = TaskUtils.createProject(formatTranslationCheck);
- formatTranslationCheck.setTaskName("check-translation");
- formatTranslationCheck.formatTranslation.setProject(project);
- formatTranslationCheck.formatTranslation.setTaskName("check-translation");
- formatTranslationCheck.setDir("/devel/freeplane-bazaar-repo/1_0_x_plain/freeplane/resources/translations");
- formatTranslationCheck.setIncludes("Resources_*.properties");
- formatTranslationCheck.execute();
- System.out.println("done");
- }
-}
diff --git a/freeplane_ant/src/org/freeplane/ant/TaskUtils.java b/freeplane_ant/src/org/freeplane/ant/TaskUtils.java
deleted file mode 100644
index 5370c21..0000000
--- a/freeplane_ant/src/org/freeplane/ant/TaskUtils.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/**
- * TaskUtils.java
- *
- * Copyright (C) 2010, Volker Boerchers
- *
- * Translator.java 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 3 of the License, or
- * (at your option) any later version.
- *
- * Translator.java is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-package org.freeplane.ant;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileFilter;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.Vector;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.tools.ant.DefaultLogger;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.input.InputHandler;
-import org.apache.tools.ant.input.InputRequest;
-import org.apache.tools.ant.input.MultipleChoiceInputRequest;
-import org.apache.tools.ant.util.StringUtils;
-
-public class TaskUtils {
- static class IncludeFileFilter implements FileFilter {
- private ArrayList<Pattern> includePatterns = new ArrayList<Pattern>();
- private ArrayList<Pattern> excludePatterns = new ArrayList<Pattern>();
-
- IncludeFileFilter(ArrayList<Pattern> includePatterns, ArrayList<Pattern> excludePatterns) {
- this.includePatterns = includePatterns;
- this.excludePatterns = excludePatterns;
- }
-
- public boolean accept(File pathname) {
- if (pathname.isDirectory())
- return false;
- for (Pattern pattern : excludePatterns) {
- if (pattern.matcher(pathname.getName()).matches())
- return false;
- }
- if (includePatterns.isEmpty())
- return true;
- for (Pattern pattern : includePatterns) {
- if (pattern.matcher(pathname.getName()).matches())
- return true;
- }
- return false;
- }
- }
-
- static void writeFile(File outputFile, ArrayList<String> sortedLines, String lineSeparator) throws IOException {
- BufferedWriter out = null;
- try {
- out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile), "US-ASCII"));
- for (String line : sortedLines) {
- out.write(line.replaceAll("\\\\[\n\r]+", "\\\\" + lineSeparator));
- // change this to write(<sep>) to enforce Unix or Dos or Mac newlines
- out.write(lineSeparator);
- }
- }
- finally {
- if (out != null) {
- try {
- out.close();
- }
- catch (IOException e) {
- // can't help it
- }
- }
- }
- }
-
- // adapted from http://www.rgagnon.com/javadetails/java-0515.html, Real Gagnon
- public static String wildcardToRegex(String wildcard) {
- StringBuilder s = new StringBuilder(wildcard.length());
- s.append('^');
- for (int i = 0, is = wildcard.length(); i < is; i++) {
- char c = wildcard.charAt(i);
- switch (c) {
- case '*':
- s.append(".*");
- break;
- case '?':
- s.append(".");
- break;
- // escape special regexp-characters
- case '(':
- case ')':
- case '$':
- case '^':
- case '.':
- case '{':
- case '}':
- case '|':
- case '\\':
- s.append("\\");
- s.append(c);
- break;
- default:
- s.append(c);
- break;
- }
- }
- s.append('$');
- return (s.toString());
- }
-
- static String readFile(final File inputFile) throws IOException {
- InputStreamReader in = null;
- try {
- in = new InputStreamReader(new FileInputStream(inputFile), "US-ASCII");
- StringBuilder builder = new StringBuilder();
- final char[] buf = new char[1024];
- int len;
- while ((len = in.read(buf)) > 0) {
- builder.append(buf, 0, len);
- }
- return builder.toString();
- }
- finally {
- if (in != null) {
- try {
- in.close();
- }
- catch (IOException e) {
- // can't help it
- }
- }
- }
- }
-
- /** returns true if all eols match <code>lineSep</code>. */
- /*package*/static boolean checkEolStyleAndReadLines(String input, ArrayList<String> resultList, String lineSep) {
- resultList.clear();
- boolean eolStyleMatches = true;
- final Matcher matcher = Pattern.compile("(?<!\\\\)(\r\n?|\n)").matcher(input);
- int index = 0;
- while (matcher.find()) {
- final String match = input.subSequence(index, matcher.start()).toString();
- final String separator = matcher.group(1);
- if (separator.equals("\n") && match.endsWith("\\\r")) {
- // only windows: catch escaped CRLF (\\r\n) which will be parsed as \\r<split>\n
- // not setting index will simply skip this match
- }
- else {
- if (!matchEolStyle(separator, lineSep)) {
- eolStyleMatches = false;
- }
- resultList.add(match);
- index = matcher.end();
- }
- }
- // Add remaining segment
- if (input.length() > index)
- resultList.add(input.subSequence(index, input.length()).toString());
- return eolStyleMatches;
- }
-
- /*package*/static boolean matchEolStyle(String eol, String lineSep) {
- // quick success in the normal case
- if (lineSep.equals(eol))
- return true;
- int i = 0;
- for (; i < eol.length(); i += lineSep.length()) {
- if (eol.indexOf(lineSep, i) != i)
- return false;
- }
- return i == eol.length();
- }
-
- static String toLine(String key, String value) {
- return key + "=" + value;
- }
-
- static Project createProject(final Task task) {
- final Project project = new Project();
- final DefaultLogger logger = new DefaultLogger();
- logger.setMessageOutputLevel(Project.MSG_INFO);
- logger.setOutputPrintStream(System.out);
- logger.setErrorPrintStream(System.err);
- project.addBuildListener(logger);
- task.setProject(project);
- return project;
- }
-
- static String firstToUpper(String string) {
- if (string == null || string.length() < 2)
- return string;
- return string.substring(0, 1).toUpperCase() + string.substring(1);
- }
-
- @SuppressWarnings("unchecked")
- static String multipleChoice(Project project, String message, String validValues, String defaultValue) {
- InputRequest request = null;
- if (validValues != null) {
- Vector<String> accept = StringUtils.split(validValues, ',');
- request = new MultipleChoiceInputRequest(message, accept);
- }
- else {
- request = new InputRequest(message);
- }
- InputHandler handler = project.getInputHandler();
- handler.handleInput(request);
- final String value = request.getInput();
- if ((value == null || value.trim().length() == 0) && defaultValue != null) {
- return defaultValue;
- }
- return value;
- }
-
- static String ask(Project project, String message, String defaultValue) {
- return multipleChoice(project, message, defaultValue, null);
- }
-}
diff --git a/freeplane_ant/src/test/java/org/freeplane/ant/FormatTranslationTest.java b/freeplane_ant/src/test/java/org/freeplane/ant/FormatTranslationTest.java
new file mode 100644
index 0000000..4ddc7ac
--- /dev/null
+++ b/freeplane_ant/src/test/java/org/freeplane/ant/FormatTranslationTest.java
@@ -0,0 +1,187 @@
+/**
+ * FormatTranslationTest.java
+ *
+ * Copyright (C) 2010, Volker Boerchers
+ *
+ * Translator.java 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 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Translator.java is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+package org.freeplane.ant;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.apache.tools.ant.Project;
+import org.hamcrest.CoreMatchers;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class FormatTranslationTest {
+ private static final String TRANSLATIONS_SOURCE_DIR = System.getProperty("TRANSLATIONS_SOURCE_DIR");
+ private static String unix = "\n";
+ private static String mac = "\r";
+ private static String win = "\r\n";
+
+ @Test
+ public void testComparator() {
+ String[] strings = { "a.b = z", "a.b.c= y", "a.b= x", "a.b = x" };
+ Arrays.sort(strings, FormatTranslation.KEY_COMPARATOR);
+ assertEquals("stable sort, only by key", "a.b = z", strings[0]);
+ assertEquals("stable sort, only by key", "a.b= x", strings[1]);
+ assertEquals("stable sort, only by key", "a.b = x", strings[2]);
+ assertEquals("stable sort, only by key", "a.b.c= y", strings[3]);
+ }
+
+ @Test
+ public void testCheckForEmptyValues() {
+ final String regex = "\\s*(\\[auto\\]|\\[translate me\\])*\\s*";
+ assertTrue(" [auto]\r".matches(regex));
+ assertTrue("[translate me]\r".matches(regex));
+ assertTrue("\r".matches(regex));
+ assertTrue("".matches(regex));
+ assertFalse(" [nix]\r".matches(regex));
+ }
+
+ @Test
+ public void testMatchEolStyle() {
+ assertTrue(TaskUtils.matchEolStyle("", unix));
+ assertTrue(TaskUtils.matchEolStyle("\n", unix));
+ assertTrue(TaskUtils.matchEolStyle("\n\n", unix));
+ assertFalse(TaskUtils.matchEolStyle("\r", unix));
+ assertFalse(TaskUtils.matchEolStyle("\r\n", unix));
+ //
+ assertTrue(TaskUtils.matchEolStyle("", win));
+ assertTrue(TaskUtils.matchEolStyle("\r\n", win));
+ assertTrue(TaskUtils.matchEolStyle("\r\n\r\n", win));
+ assertFalse(TaskUtils.matchEolStyle("\r", win));
+ assertFalse(TaskUtils.matchEolStyle("\n\r", win));
+ assertFalse(TaskUtils.matchEolStyle("\n", win));
+ }
+
+ @Test
+ public void testCheckEolStyleAndReadLines() throws Exception {
+ final String input = "one\r\ntwo\n\rthree\\\nthree.one\n\nfour";
+ ArrayList<String> resultList = new ArrayList<String>();
+ assertFalse("not unique unix", TaskUtils.checkEolStyleAndReadLines(input, resultList, unix));
+ assertEquals("a trailing backslash escapes a new line", 6, resultList.size());
+ assertFalse("not unique mac", TaskUtils.checkEolStyleAndReadLines(input, resultList, mac));
+ assertEquals(6, resultList.size());
+ assertFalse("not unique win", TaskUtils.checkEolStyleAndReadLines(input, resultList, win));
+ assertEquals(6, resultList.size());
+ //
+ String unixInput = input.replaceAll("\r\n|\n|\r", unix);
+ System.out.println("unixInput='" + f(unixInput) + "'");
+ assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(unixInput, resultList, unix));
+ assertFalse("not mac", TaskUtils.checkEolStyleAndReadLines(unixInput, resultList, mac));
+ assertFalse("not win", TaskUtils.checkEolStyleAndReadLines(unixInput, resultList, win));
+ assertEquals("a trailing backslash escapes a new line", 6, resultList.size());
+ //
+ String macInput = input.replaceAll("\r\n|\n|\r", mac);
+ System.out.println("macInput='" + f(macInput) + "'");
+ assertTrue("unique mac", TaskUtils.checkEolStyleAndReadLines(macInput, resultList, mac));
+ assertFalse("not unix", TaskUtils.checkEolStyleAndReadLines(macInput, resultList, unix));
+ assertFalse("not win", TaskUtils.checkEolStyleAndReadLines(macInput, resultList, win));
+ assertEquals("a trailing backslash escapes a new line", 6, resultList.size());
+ //
+ String winInput = input.replaceAll("\r\n|\n|\r", win);
+ System.out.println("winInput='" + f(winInput) + "'");
+ assertTrue("unique win", TaskUtils.checkEolStyleAndReadLines(winInput, resultList, win));
+ assertFalse("not unix", TaskUtils.checkEolStyleAndReadLines(winInput, resultList, unix));
+ assertFalse("not mac", TaskUtils.checkEolStyleAndReadLines(winInput, resultList, mac));
+ assertEquals("a trailing backslash escapes a new line", 6, resultList.size());
+ String resource = TaskUtils.readFile(new File(new File("./src/test/resources/unsorted"), "Test_de.properties"));
+ assertTrue("not unix", TaskUtils.checkEolStyleAndReadLines(resource, resultList, unix));
+ }
+
+ @Test
+ public void testRemoveEmptyLines() throws Exception {
+ final String msgConserved = "empty lines should be conserved";
+ final String msgRemoved = "empty lines should be removed";
+ final FormatTranslation formatTranslation = new FormatTranslation();
+ String input;
+ ArrayList<String> lines = new ArrayList<String>();
+ //
+ input = "\n \nx=y\n\n";
+ assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(input, lines, unix));
+ assertEquals(msgConserved, 4, lines.size());
+ assertEquals(msgRemoved, 1, formatTranslation.processLines("a_file", new ArrayList<String>(lines)).size());
+ //
+ input = "\n";
+ assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(input, lines, unix));
+ assertEquals(msgConserved, 1, lines.size());
+ assertEquals(msgRemoved, 0, formatTranslation.processLines("a_file", new ArrayList<String>(lines)).size());
+ //
+ input = " \n";
+ assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(input, lines, unix));
+ assertEquals(msgConserved, 1, lines.size());
+ assertEquals(msgRemoved, 0, formatTranslation.processLines("a_file", new ArrayList<String>(lines)).size());
+ //
+ input = "x=y";
+ assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(input, lines, unix));
+ assertEquals(msgConserved, 1, lines.size());
+ assertEquals(msgRemoved, 1, formatTranslation.processLines("a_file", new ArrayList<String>(lines)).size());
+ //
+ }
+
+ private String f(String input) {
+ return input.replace("\n", "\\n").replace("\r", "\\r");
+ }
+
+ @Test
+ public void testPlaceholderCheck() throws Exception {
+ final FormatTranslation formatTranslation = new FormatTranslation();
+ String input;
+ ArrayList<String> lines = new ArrayList<String>();
+ //
+ input = "x = a {1} without a 0\n" //
+ + "y = a $1 instead of a {0}";
+ // no actual test as long as those tests are not treated as failures
+ TaskUtils.checkEolStyleAndReadLines(input, lines, unix);
+ formatTranslation.processLines("a_file", new ArrayList<String>(lines));
+ }
+
+ @Ignore // this tests causes a lot of modified files...
+ @Test
+ public void testFormatTranslation() {
+ final FormatTranslation formatTranslation = new FormatTranslation();
+ final Project project = TaskUtils.createProject(formatTranslation);
+ formatTranslation.setTaskName("format-translation");
+ formatTranslation.setProject(project);
+ formatTranslation.setEolStyle("unix");
+ formatTranslation.setDir(new File("./src/test/resources/unsorted"));
+ formatTranslation.setIncludes("Test_*.properties");
+ formatTranslation.execute();
+ System.out.println("done");
+ }
+
+ @Test
+ public void convertsUnicodeToUpperCase(){
+ final FormatTranslation formatTranslation = new FormatTranslation();
+ Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("u"), CoreMatchers.equalTo("u"));
+ Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("\\Uabcde"), CoreMatchers.equalTo("\\uABCDe"));
+ Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("\\uabcde"), CoreMatchers.equalTo("\\uABCDe"));
+ Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("1\\Uabcde"), CoreMatchers.equalTo("1\\uABCDe"));
+ }
+
+ @Test
+ public void convertsLatin1toUnicode() {
+ final FormatTranslation formatTranslation = new FormatTranslation();
+ Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("ä"),
+ CoreMatchers.equalTo("\\u00E4"));
+ Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("ä1"),
+ CoreMatchers.equalTo("\\u00E41"));
+ }
+}
diff --git a/freeplane_ant/src/test/resources/unsorted/Test_de.properties b/freeplane_ant/src/test/resources/unsorted/Test_de.properties
new file mode 100644
index 0000000..9c7b754
--- /dev/null
+++ b/freeplane_ant/src/test/resources/unsorted/Test_de.properties
@@ -0,0 +1,1433 @@
+about_text = Joerg Mueller's Freeplane\nTaking the Concept-Mapping approach to Human-Computer Interface design.\nCopyright (C) 2000-2008 Joerg Mueller and others.\nThis program is free software (GPL)\nHome: http://freeplane.sourceforge.net/\nHave fun!\nVersion:
+AboutAction.text= Info
+accessories/plugins/ApplyFormatPlugin.dialog.title=
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=Stil \u00c4ndern
+accessories/plugins/EncryptNode.properties_0 = Bitte w\u00e4hlen Sie ein Passwort f\u00fcr den verschl\u00fcsselten Knoten
+accessories/plugins/EncryptNode.properties_1 = Die Passw\u00f6rter stimmen nicht \u00fcberein oder sind zu kurz.
+accessories/plugins/EncryptNode.properties_2 = Passwort eingeben:
+accessories/plugins/EncryptNode.properties_3 = Passwort wiederholen:
+accessories/plugins/EncryptNode.properties_4 = Bitte geben Sie das Passwort ein.
+accessories/plugins/EncryptNode.properties_5 = <html>Bitte beachten Sie, da\u00df die Qualit\u00e4t der Verschl\u00fcsselung<br> fast vollst\u00e4ndig von der Qualit\u00e4t Ihres Passwortes abh\u00e4ngt.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Abbrechen
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = <html>Sie k\u00f6nnen diese Funktion nur auf bereits eingef\u00fcgte verschl\u00fcsselte Knoten anwenden.<br> Bitte, f\u00fcgen Sie solchen einen Knoten mittels des Extra-Men\u00fcs ein.
+accessories/plugins/EncryptNode.properties_select_me = Klick mich an.
+accessories/plugins/EncryptNode.properties_wrong_password = Das Passwort stimmt nicht.
+
+accessories/plugins/ExportWithTWiki.text=Als TWiki...
+accessories/plugins/ExportWithTWiki.tooltip=Exportiert die Mindmap als TWiki Dokument.
+
+accessories/plugins/ExportWithXSLT.tooltip= Eine allgemeine Exportmethode, die XSLT Skripte verwendet.
+
+
+accessories/plugins/ExportWithXSLT_Applet.text=Als Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip=Exportiert die MindMap als Java Browser Applet.
+accessories/plugins/ExportWithXSLT_Flash.text=Als Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip=Exportiert die MindMap als Flash Anwendung.
+accessories/plugins/ExportWithXSLT_HTML.text= Als XHTML (JavaScript Version)...
+
+accessories/plugins/ExportWithXSLT_HTML3.text= Als XHTML (Mit verlinktem Bild der MindMap)...
+
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=Ressourcen nach Taskjuggler...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>Exportiert Ressourcen vom RESOURCES Knoten zu Taskjuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text=Aufgaben nach Taskjuggler...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>Exportiert Aufgaben vom TASKS Knoten zu Taskjuggler. </html>
+accessories/plugins/SaveAll.properties_save_all_cancelled=Die Ausf\u00fchrung von "Alle Speichern" wurde nicht erfolgreich zu Ende gef\u00fchrt.
+add=&Hinzuf\u00fcgen
+
+AddLocalLinkAction.text= Lokalen Hyperlink Hinzuf\u00fcgen
+antialias_all = Antialias Alles
+antialias_edges = Antialias Kanten
+antialias_none = Antialias Aus
+apply=&\u00dcbernehmen
+ApplyFormatPlugin.text=&Format \u00e4ndern...
+ApplyFormatPlugin.tooltip=Dialog, in dem Knoten- und Kantenformate auf einmal ge\u00e4ndert werden k\u00f6nnen.
+ApplyNoFilteringAction.text=Kein Filter
+as_parent = Wie Vater
+AssignAttributesAction.text=Attribute &Zuweisen...
+attribute_delete_value=Diesen Wert L\u00f6schen
+attribute_delete=Alle Werte L\u00f6schen
+attribute_font_size_tooltip=Schriftgr\u00f6\u00dfe f\u00fcr Attribute
+attribute_list_box_label_text=Vorhandene Werte
+attribute_replace=Ersetzen durch
+attribute_top=Alle bekannten Attribute f\u00fcr geladene Maps
+attributes_adding_empty_attribute_error=Leere Zeichenketten sind als Attributenamen nicht erlaubt
+attributes_all=Alle Attribute
+attributes_attribute=Attribute
+attributes_close=Schliessen
+attributes_deselect_all=Nichts
+attributes_dialog_title=Attribute Verwalten
+attributes_edit_tooltip=Menge Editieren
+attributes_edit=Editieren
+attributes_for_selected=Ausgew\u00e4hlte Knoten
+attributes_for_visible=Alle Sichtbare Knoten
+attributes_import_tooltip=Attribute aus anderen geladenen Maps Importieren
+attributes_import=&Importieren
+attributes_no_import_candidates_found=Keine neue Attribute gefunden
+attributes_popup_delete=Entfernen
+attributes_popup_down=Nach Unten
+attributes_popup_edit=Editieren
+attributes_popup_hide=Verstecken
+attributes_popup_new=Neues Attribut
+attributes_popup_optimal_width=Optimale Breite
+attributes_popup_up=Nach Oben
+attributes_refresh=Aktualisieren
+attributes_restricted_attributes_tooltip=M\u00f6gliche Attribute Beschr\u00e4nken
+attributes_restricted_values_tooltip=M\u00f6gliche Werte f\u00fcr dieses Attribut Beschr\u00e4nken
+attributes_restriction=Beschr\u00e4nkte Menge
+attributes_select_all_tooltip=Alle Ausw\u00e4hlen / Auswahl L\u00f6schen
+attributes_select_all=Alles
+attributes_show=Zeigen
+attributes_skip_root=Ohne Wurzelknoten
+attributes_visible_tooltip=Auswahl f\u00fcr View->Attribute->Ausgew\u00e4hlte Attribute Anzeigen
+attributes_visible=Auswahl f\u00fcr View->Attribute->Ausgew\u00e4hlte Attribute Anzeigen
+automatically_save_message=Map wurde automatisch unter dem Filenamen {0} gespeichert ...
+AutomaticLayoutAction.text= &Automatisches Layout
+AutomaticLayoutAction.tooltip= <html>Fixiert das Aussehen der Mindmap. <br>Die erste Ebene wird in schwarz, die zweite in blau, etc. gezeichnet.</html>
+BackAction.text=Zur\u00fcck
+BackAction.tooltip=Springt in der Liste der selektierten Knoten zur\u00fcck
+background = Hintergrund
+BlinkingNodeHookAction.text= Blinkender Knoten
+BlinkingNodeHookAction.tooltip= <html>Der Knoten beginnt zu blinken. Aber Vorsicht. Diese Funktionalit\u00e4t sollte nicht bei vielen Knoten angewendet werden und <strong> nicht zusammen mit anderen Formatierungseigenschaften bei einem Knoten.</strong></html>
+BoldAction.text= Fett
+boldify_branch = Zweig Fett
+branch = Zweig
+
+cancel = &Abbrechen
+cannot_add_parent_diff_parents = Alle Knoten m\u00fcssen vom selben Vater stammen, um in dieser Funktion verwendet zu werden.
+cannot_add_parent_to_root = Der Ursprungsknoten kann nicht ver\u00e4ndert werden.
+cannot_delete_root = Der Ursprungsknoten kann nicht gel\u00f6scht oder ausgeschnitten werden.
+cannot_join_nodes_with_children = Knoten, die Kinder haben, k\u00f6nnen nicht verbunden werden.
+cannot_move_to_child = Ein Knoten kann nicht an einen seiner Nachkommen verschoben werden.
+CenterAction.text= Zentrieren
+change_link_arrows=change_link_arrows
+
+ChangeNodeLevelLeftsAction.text=Knoten nach links schieben
+ChangeNodeLevelLeftsAction.tooltip=Links des Wurzelknotes werden die Knoten zu Kindern ihres benachbarten Geschwisterknotens. Rechts vom Wurzelknoten werden Knoten eine Stufe heraufgehoben. Direkt am Wurzelknoten tauschen die Knoten die Seite.
+ChangeNodeLevelRightsAction.text=Knoten nach rechts schieben
+ChangeNodeLevelRightsAction.tooltip=Rechts des Wurzelknotes werden die Knoten zu Kindern ihres benachbarten Geschwisterknotens. Links vom Wurzelknoten werden Knoten eine Stufe heraufgehoben. Direkt am Wurzelknoten tauschen die Knoten die Seite.
+choose_background_color = Bitte w\u00e4hlen Sie die Hintergrundfarbe
+choose_cloud_color = Bitte w\u00e4hlen Sie die Wolkenfarbe
+choose_edge_color = Bitte Kantenfarbe W\u00e4hlen
+choose_map_background_color=Map Hintergrundfarbe w\u00e4hlen
+choose_node_background_color = Bitte w\u00e4hlen Sie die Knotenhintergrundfarbe
+choose_node_color = Bitte w\u00e4hlen Sie die Knotenfarbe
+CloseAction.text= Schl&ie\u00dfen
+CloudAction.text= Wolke
+CloudColorAction.text= Wolkenfarbe ...
+
+ColorProperty.ResetColor=Farbe zur\u00fccksetzen
+combined = Kombiniert
+confirmation=Sicherheitsbest\u00e4tigung
+CopyAction.text= Kopieren
+CopySingleAction.text= Einfach Kopieren
+CreationModificationPluginAction.text= \u00c4nderungs&zeiten Anzeigen
+CreationModificationPluginAction.tooltip=<html>Diese Funktion speichert Erzeugungs- und \u00c4nderungsdatum jedes Knotens.</html>
+CutAction.text= Ausschneiden
+decrease_branch_font_size = Zweigschrift Verkleinern
+DecreaseNodeFontAction.text= Zweigschrift Verkleinern
+delete_child = Knoten L\u00f6schen
+delete=&Entfernen
+DeleteAction.text= Knoten L\u00f6schen
+DeleteConditionAction.text=Entfernen
+DocumentationAction.text= Dokumentation
+edge = Linie
+edge_style = Kantenform
+edge_width = Kantenbreite
+EdgeColorAction.text= Kantenfarbe...
+EdgeStyleAction.bezier.text= Geschwungen
+EdgeStyleAction.hide_edge.text=Kante ausblenden
+EdgeStyleAction.linear.text= Linear
+EdgeStyleAction.sharp_bezier.text= Scharfe Bezierkurve
+EdgeStyleAction.sharp_linear.text= Scharfe Linie
+EdgeStyleAsParentAction.text=Wie Vater
+EdgeWidthAction_width_parent.text= Geerbt
+EdgeWidthAction_width_thin.text= D\u00fcnn
+edit = &Bearbeiten
+edit.decision=HTML Editor
+edit.edit_rich_text=Wollen Sie Formatierungen (fett, kursiv, etc.) benutzen?
+edit_link_manually = Link Manuell Bearbeiten...
+EditAction.text= Knoten Bearbeiten
+EditAttributesAction.text=Attribute editieren
+EditFilterAction.text=Editieren
+EditLongAction.text= Knoten in einem separaten Editor bearbeiten...
+EncryptedMap.text= Verschl\u00fcsselte MindMap Erzeugen ...
+EncryptedMap.tooltip= Erzeugt eine neue MindMap die als ganzes verschl\u00fcsselt gespeichert wird.
+enter_base_url = Freeplane wird realtive Links einf\u00fcgen. Bitte geben sie die Basis-URL an.
+enter_confirms = &Eingabetaste Schlie\u00dft das Fenster.
+EnterPassword.text= &Umschalten Ver- / Entschl\u00fcsselt
+
+error = Fehler
+error_applying_template=Es gab einen Fehler im XSL template.
+error_creating_directory = Es gab Probleme, ein Verzeichnis f\u00fcr den Export zu erstellen.
+export_pdf_text = Portables Dokumentenformat (PDF)
+export_svg_text = Skalierbare Vektorgraphik (SVG)
+export_using_xslt=Freeplane Export mittels XSLT
+ExportBranchAction.text= Zweig als neue MindMap ...
+ExportBranchToHTMLAction.text= HTML des Zweiges
+ExportPdf.text= Als PDF...
+ExportPdf.tooltip = Export als PDF
+ExportSvg.text= Als SVG...
+ExportSvg.tooltip = Export als SVG
+ExportToHTMLAction.text= Als HTML
+ExportToImage.jpg.text= Als JPEG...
+ExportToImage.png.text= Als PNG...
+ExportToOoWriter.text= Als Open Office Writer Dokument...
+ExportToOoWriter.tooltip=Entfaltete Knoten geh\u00f6ren zur Struktur, gefaltete Knoten bilden den Inhalt des Dokuments.
+extension_menu = &Stile
+extract_link_from_text.tooltip=Hyperlink aus Knotentext zuweisen
+ExtractLinkFromTextAction.text=Hyperlink aus Knotentext
+FaqOpenURLAction.text= FAQ (H\u00e4ufig gestellte Fragen)
+file = &Datei
+file_already_exists = Die Datei {0} existiert bereits. Wollen Sie sie \u00fcberschreiben?
+filter_add=&Hinzuf\u00fcgen
+filter_and=&Und
+filter_conditions = Filter
+filter_contains=Beinhaltet
+filter_created_after=Erzeugt nach dem
+filter_created_before=Erzeugt vor dem
+filter_delete=&Entfernen
+filter_dialog=Filter Definieren
+filter_does_not_exist=Fehlt
+filter_edit_description=Filterliste Editieren
+filter_enter_value=Enter Value
+filter_exist=Existiert
+filter_icon=Icon
+filter_ignore_case=Gro\u00df-/Klein- Ignorieren
+filter_is_equal_to=Ist Gleich
+filter_is_not_equal_to=Ist Ungleich
+filter_link=Hyperlink
+filter_modified_after=Ver\u00e4ndert nach dem
+filter_modified_before=Ver\u00e4ndert vor dem
+filter_no_filtering=Kein Filter
+filter_node=Knotentext
+filter_not=&Nicht
+filter_or=O&r
+filter_select=&Select
+filter_selected_node_view=Selektierte Knoten
+filter_time=\u00c4nderungstag
+filter=Filter Aktivieren
+find_what = Suchbegriff
+FindAction.text= Suchen...
+FindNextAction.text= Weitersuchen
+fit_map_to_page = Auf Seitengr\u00f6\u00dfe Skalieren
+FitToPage.text= Ansichtsgr\u00f6\u00dfe "Gesamte Seite"
+FitToPage.tooltip= Stellt die Vergr\u00f6\u00dferung so ein, da\u00df die gesamte MindMap in das aktuellen Fenster pa\u00dft.
+fold = Falten
+FoldAllAction.text= Alles Zuklappen
+FoldAllAction.tooltip= <html>Klappt die selektierten Knoten und alle Kinder zu.</html>
+FoldOneLevelAction.text= Eine Ebene Zuklappen
+FoldOneLevelAction.tooltip= <html>Klappt die selektierten Knoten um eine Ebene zu.</html>
+follow_graphical_link=Zu ''{0}''
+FollowLinkAction.text= Hyperlink \u00d6ffnen
+font = Schriftart
+FontFamilyAction.text= Schriftart
+FontSizeAction.text= Schriftgr\u00f6\u00dfe
+format_menu_edge_styles=Kantenf&ormen
+format_menu_edge_widths=&Kantenbreiten
+FormatCopy.text= Formatierung Kopieren
+FormatCopy.tooltip= <html>Kopiert die Formatierung des Knotens</html>
+FormatPaste.text= Formatierung Einf\u00fcgen
+FormatPaste.tooltip= <html>F\u00fcgt die Formatierung des Knotes ein</html>
+ForwardAction.text=Vorw\u00e4rts
+ForwardAction.tooltip=Springt in der Liste der selektierten Knoten vorw\u00e4rts
+Freeplane.progress.buildScreen=Bildschirm aufbauen...
+Freeplane.progress.createController=Controller erzeugen...
+Freeplane.progress.createInitialMode=Initialen Modus erzeugen...
+Freeplane.progress.endStartup=Start beendet.
+Freeplane.progress.gettingPreferenceDirectories=Ermittle Verzeichnisse...
+Freeplane.progress.gettingPreferences=Lese Voreinstellungen...
+Freeplane.progress.loadMaps=Maps laden...
+Freeplane.progress.propagateLookAndFeel=Look And Feel \u00fcbernehmen...
+Freeplane.progress.settingPreferences=Voreinstellungen setzen...
+Freeplane.progress.startCreateController=Controller starten...
+Freeplane.progress.updateLookAndFeel=Aktualisieren des Look And Feel...
+FreeplaneHelpStarter.text= Hilfeseiten ...
+FreeplaneHelpStarter.tooltip= Freeplane Hilfe
+GotoLinkNodeAction.text= Folge Link
+GrabKeyDialog.common.cancel=Abbrechen
+GrabKeyDialog.common.ok=OK
+GrabKeyDialog.grab-key.assigned-to.none=Nicht zugewiesen
+GrabKeyDialog.grab-key.assigned-to=Zugewiesen zu
+GrabKeyDialog.grab-key.clear=L\u00f6schen
+GrabKeyDialog.grab-key.remove-ask=Sind Sie sicher, da\u00df Sie diese Tastenzuweisung entfernen m\u00f6chten?
+GrabKeyDialog.grab-key.remove=Entfernen
+GrabKeyDialog.grab-key.title=Neue Taste eingeben
+help = Hilfe
+HideableAction.tooltip= <html>Die Hintergrundfarbe jedes ge\u00e4nderten Knotens \u00e4ndern.</html>
+HideAllAttributesAction.text= Alle Attribute Verbergen
+HierarchicalIconsAction.text=Hierarchische &Icons
+HierarchicalIconsAction.tooltip=Zeigt Icons auch von den Kindern an.
+hot_keys = Tastaturk\u00fcrzel
+hot_keys_table = Tastaturk\u00fcrzeltabelle
+html_export_based_on_headings = HTML Export - \u00dcberschriftenbasiert
+html_export_fold_all = HTML-Export Alles Eingeklappt
+html_export_fold_currently_folded = HTML-Export mit Aktueller Faltung
+html_export_no_folding = HTML-Export Ohne Faltung
+icon_attach = Hier hin sehen
+icon_back = Zur\u00fcck
+icon_bell = Erinnerung
+icon_bookmark = Hervorragend
+icon_broken-line = Unterbrochen
+icon_button_cancel = Nicht OK
+icon_button_ok = OK
+icon_calendar = Termin
+icon_clanbomber = Gef\u00e4hrlich
+icon_clock = Zeit
+icon_closed = Kein Eingang
+icon_decrypted = Offen
+icon_desktop_new = Nicht vergessen
+icon_down = Nach Unten
+icon_edit = Verfeinern
+icon_encrypted = Verschlossen
+icon_family=Familie
+icon_fema=Frauen
+icon_female1=Frau1
+icon_female2=Frau2
+icon_flag-black = Schwarze Flagge
+icon_flag-blue = Blaue Flagge
+icon_flag-green = Gr\u00fcne Flagge
+icon_flag-orange = Orangefarbene Flagge
+icon_flag-pink = Pinkfarbene Flagge
+icon_flag-yellow = Gelbe Flagge
+icon_flag = Rote Flagge
+icon_folder = Ordner
+icon_forward = Vorw\u00e4rts
+icon_freemind_butterfly = FreeMind
+icon_full-0=Priorit\u00e4t 0
+icon_full-1 = Priorit\u00e4t 1
+icon_full-2 = Priorit\u00e4t 2
+icon_full-3 = Priorit\u00e4t 3
+icon_full-4 = Priorit\u00e4t 4
+icon_full-5 = Priorit\u00e4t 5
+icon_full-6 = Priorit\u00e4t 6
+icon_full-7 = Priorit\u00e4t 7
+icon_full-8 = Priorit\u00e4t 8
+icon_full-9 = Priorit\u00e4t 9
+icon_go=Gr\u00fcne Ampel
+icon_gohome = Home
+icon_group=Gruppe
+icon_help = Frage
+icon_hourglass = Warten
+icon_idea = Idee
+icon_info=Info
+icon_kaddressbook = Telefon
+icon_kmail = E-Mail
+icon_knotify = Musik
+icon_korn = Postkasten
+icon_ksmiletris = Ich bin zufrieden
+icon_launch=Abflug
+icon_licq = S\u00fc\u00df
+icon_list=Liste
+icon_Mail = Post
+icon_male1=Mann1
+icon_male2=Mann2
+icon_menu = I&cons
+icon_messagebox_warning = Wichtig
+icon_password = Passwort
+icon_pencil = Noch zu verfeinern
+icon_penguin = Linux
+icon_prepare=Gelbe Ampel
+icon_smiley-angry = W\u00fctend
+icon_smiley-neutral = Keine Meinung
+icon_smiley-oh = \u00fcberaschung
+icon_smily_bad = Nicht gut
+icon_stop-sign = Stop
+icon_stop = Rote Ampel
+icon_up = Nach Oben
+icon_wizard = Magisch
+icon_xmag = Noch zu diskutieren
+icon_yes = Wichtig
+IconSelectionPlugin.text= Icon W\u00e4hlen...
+IconSelectionPlugin.tooltip= <html>Ein Fenster erscheint, indem ein Icon ausgew\u00e4hlt werden kann.</html>
+import = Importieren
+import_linked_branch_no_link = Der ausgew\u00e4hlte Knoten ist mit keiner anderen Freeplane Datei verkn\u00fcpft, die importiert werden k\u00f6nnte.
+ImportBranchAction.text= Zweig Von (mm-) Datei...
+ImportExplorerFavoritesAction.text= Explorer-Favoriten...
+ImportFolderStructureAction.text= Ordnerstruktur...
+ImportLinkedBranchAction.text= Von Link
+ImportLinkedBranchWithoutRootAction.text= Von Link Ohne Wurzelknoten
+ImportMindmanagerFiles.text=MindManager X5 Map...
+increase_branch_font_size = Zweigschrift Vergr\u00f6ssern
+IncreaseNodeFontAction.text= Zweigschrift Vergr\u00f6ssern
+ItalicAction.text= Kursiv
+italicise_branch = Zweig kursiv
+JoinNodesAction.text= Knoten verbinden
+
+LatexNodeHookAction.text= &Latex
+LatexNodeHookAction.tooltip= <html>Latex Formel Editor</html>
+less_than_two_selected_nodes = Bitte mindestens zwei Knoten ausw\u00e4hlen, zwischen denen Verbindungen gezeichnet werden sollen.
+license_text = Freeplane - A Program for creating and viewing Mindmaps\nCopyright (C) 2000 Joerg Mueller <joergmueller at bigfoot.com>\nSee COPYING for Details\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License\nas published by the Free Software Foundation; either version 2\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARR [...]
+LicenseAction.text= Lizenz
+link_not_available_any_more = Die Verkn\u00fcpfung ist nicht mehr g\u00fcltig, da der Zielknoten in der Zwischenzeit gel\u00f6scht wurde.
+
+load = &Laden
+long_node_changed_cancel =Knoten wurde ver\u00e4ndert. Wollen Sie diese \u00c4nderungen verwerfen?
+long_node_changed_submit =Knoten wurde ver\u00e4ndert. Wollen Sie diese \u00c4nderungen speichern?
+lots_of_links_warning = Durch diesen Befehl w\u00fcrden sehr viele graphische Links erzeugt. Sollen diese Links wirklich erzeugt werden?
+ManagePatterns.text=Stile Verwalten
+ManagePatterns.tooltip=Verwaltung der Stilvorgaben...
+ManagePatternsPopupDialog.Actions=&Aktionen
+ManagePatternsPopupDialog.add=&Neuen Stil Hinzuf\u00fcgen
+ManagePatternsPopupDialog.apply=&Anwenden
+ManagePatternsPopupDialog.duplicate=Stil &Duplizieren
+ManagePatternsPopupDialog.DuplicateNameMessage=Der Name kommt doppelt vor. Bitte ver\u00e4ndern Sie die Namen, bevor Sie den Dialog verlassen.
+ManagePatternsPopupDialog.from_nodes=Stil Aus Ausgew\u00e4hlten Knoten Er&zeugen
+ManagePatternsPopupDialog.remove=Stil &Entfernen
+ManagePatternsPopupDialog.Save=Speichern und Zur\u00fcck
+map_already_exists = Die Mindmap existiert bereits. Soll sie \u00fcberschrieben werden?
+map_corrupted = Die Mindmap ist nicht lesbar. M\u00f6chten Sie die Details sehen?
+map_not_saved=Die Map wurde noch nicht gespeichert.
+MapBackgroundColorAction.text=Map Hintergrundfarbe
+menu_attributes = Attribute
+menu_extras = E&xtras
+ExportAction.text = E&xport
+menu_file_import = I&mport
+menu_format = &Format
+menu_insert = &Einf\u00fcgen
+menu_navigate = &Navigieren
+menu_view = &Ansicht
+mindmap = Map
+mindmaps = Maps
+mindmaps_desc = Maps (*.mm)
+mindmaps_filter_desc = Filter (*.mmfilter)
+mode_Browse=Ansichtsmodus
+mode_File=Dateimodus
+mode_MindMap=Mindmapmodus
+mode_na = Modus nicht vorhanden
+mode_status = Modus ge\u00e4ndert zu {0}
+mode_title =Freeplane - {0}
+modes = Modi
+most_recent_files = &Zuletzt Ge\u00f6ffnete Dateien
+MoveToRootAction.text= Wurzel Zentrieren
+NavigationNextMapAction.text= N\u00e4chste Map
+NavigationPreviousMapAction.text= Vorherige Map
+new_mindmap = Neue Mindmap
+new_node = Neuer Knoten
+new_node_as_sibling_not_possible_for_the_root = Der Wurzelknoten kann keine neuen Geschwister haben.
+NewChildAction.text= Neuer Unterknoten
+NewMapAction.text= Neu
+NewParentNode.text= Einr\u00fcckung Erh\u00f6hen
+NewParentNode.tooltip= <html>Alle selektierten Knoten bekommen einen neuen Vaterknoten.</html>
+NewPreviousSiblingAction.text= Neuer Geschwisterknoten davor
+NewSiblingAction.text= Neuer Geschwisterknoten danach
+no = Nein
+no_format_copy_before_format_paste = Sie k\u00f6nnen ein Format erst dann einf\u00fcgen, wenn Sie ein anderes kopiert haben.
+no_previous_find = Keine vorherigen Fundstellen.
+node = Knoten
+node_changed_discard_changes = Knoten wurde ver\u00e4ndert. Wollen Sie diese \u00c4nderungen verwerfen?
+node_is_write_protected=Zielknoten ist schreibgesch\u00fctzt.
+node_location_help=Ziehen \u00e4ndert die Knotenlage, Strg+Ziehen \u00e4ndert die Knotenabst\u00e4nde, Doppelklick und Strg+Doppelklick setzt sie zur\u00fcck.
+NodeBackgroundColorAction.text= Knoten&hintergrundfarbe...
+NodeColorAction.text= Knotenfarbe \u00c4ndern...
+NodeColorBlendAction.text= Knotenfarbe Aufhellen
+NodeDownAction.text= Knoten nach unten schieben
+NodeListAction.text=Suchen und Ersetzen...
+NodeListAction.tooltip=Zeigt alle Knoten in einer filterbaren Liste an.
+NodeShapeAction.bubble.text= Knotentyp &Blase
+NodeShapeAction.fork.text= Knotentyp &Linie
+NodeUpAction.text= Knoten nach oben schieben
+nonboldify_branch = Zweig normal
+nonitalicise_branch = Zweig nichtkursiv
+normal = Normal
+not_saved_for_link_error = Die Mindmap muss abgespeichert werden, bevor ein Link per Dateiauswahl gesetzt werden kann.
+note_window_location = Notizfenster Position
+ok = &OK
+OpenAction.text= \u00d6ffnen...
+OpenFreeplaneSiteAction.text=Freeplane Webseite
+option_changes_may_require_restart=Die meisten Eigenschafts\u00e4nderungen werden erst bei einem Neustart von Freeplane aktiv.
+OptionalDontShowMeAgainDialog.cancel=&Nein
+OptionalDontShowMeAgainDialog.dontShowAgain=Nicht wieder &fragen.
+OptionalDontShowMeAgainDialog.ok=&Ja
+OptionalDontShowMeAgainDialog.rememberMyDescision=&Entscheidung merken.
+OptionPanel.absolute=Absolut
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=Stile des Automatischen Layouts
+OptionPanel.always_fold_all_after_load=Alle Knoten falten
+OptionPanel.always_save_folding_state.tooltip=Wenn das H\u00e4kchen gesetzt ist, wird beim Schlie\u00dfen der Map nach \u00c4nderungen des Faltungszustandes nachgefragt, ob sie gespeichert werden soll.
+OptionPanel.always_save_folding_state=Faltungszustands\u00e4nderungen immer Speichern
+OptionPanel.always_save_folding=immer
+OptionPanel.always_unfold_all_after_load=Keine Knoten falten
+OptionPanel.antialias.tooltip=<html>Bestimmt die Qualit\u00e4t der Graphik. H\u00f6here Qualit\u00e4t ben\u00f6tigt allerdings mehr Darstellungszeit.</html>
+OptionPanel.antialias_all=Antialias Alles
+OptionPanel.antialias_edges=Antialias Kanten
+OptionPanel.antialias_none=Kein Abrunden
+OptionPanel.antialias=Kandenrundung
+OptionPanel.Appearance=Erscheinung
+OptionPanel.ar=Ar
+OptionPanel.as_parent=Wie der Vater
+OptionPanel.ask=Nachfragen
+OptionPanel.automatic=Automatisch
+OptionPanel.automaticFormat_level=Stile des Automatischen Layouts
+OptionPanel.automaticFormat_level2=Format der Ebene 1
+OptionPanel.Behaviour=Verhalten
+OptionPanel.
+OptionPanel.
+OptionPanel.bubble=Blase
+OptionPanel.Cancel=Abbrechen
+OptionPanel.childpattern.tooltip=Dieser Stil wird auf die Kinder des Knotens angewendet. Damit lassen sich mehrere Ebenen gleichzeitig ver\u00e4ndern.
+OptionPanel.childpattern=Stil der Unterknoten
+OptionPanel.clear_all_setters.tooltip=Alle Schalter gleichzeitig ver\u00e4ndern
+OptionPanel.clear_all_setters=Alle umschalten
+OptionPanel.combined=Kombiniert
+OptionPanel.convert_to_current_version.tooltip=<html>Nur f\u00fcr sehr gro\u00dfe Mindmaps von denen Sie wissen, dass sie nicht konvertiert werden m\u00fcssen <br>(dies wissen allerdings nur Experten!) k\u00f6nnen Sie auf eine Konvertierung verzichten.</html>
+OptionPanel.convert_to_current_version=<html>Sollen Mindmaps von \u00e4lteren Freeplane Versionen <br>automatisch zur aktuellen Version konvertiert werden?</html>
+OptionPanel.cs=Cs
+OptionPanel.cut_nodes_without_question.tooltip=Wenn dieses H\u00e4kchen gesetzt ist, werden Knoten ohne Nachfrage ausgeschnitten. Dies kann bei unbeabsichtigtem Ausschneiden zu Datenverlust f\u00fchren.
+OptionPanel.cut_nodes_without_question=Knoten ohne Best\u00e4tigung ausschneiden?
+OptionPanel.de=De
+OptionPanel.default_browser_command_mac.tooltip=<html> and MAC: (thanks to Nick!)</html>
+OptionPanel.default_browser_command_mac=Standard Browser Befehl Mac
+OptionPanel.default_browser_command_other_os.tooltip=<html> Das ist typischerweise Linux:</html>
+OptionPanel.default_browser_command_other_os=Standard Browser Befehl f\u00fcr andere Betriebssysteme
+OptionPanel.default_browser_command_windows_9x.tooltip=<html>F\u00fcr Windows (die Anf\u00fchrungszeichen sind notwendig, da Links Gleichheitszeichen enthalten k\u00f6nnen).</html>
+OptionPanel.default_browser_command_windows_9x=Standard Browser Befehl Windows 9x
+OptionPanel.default_browser_command_windows_nt.tooltip=<html>F\u00fcr Windows (die Anf\u00fchrungszeichen sind notwendig, da Links Gleichheitszeichen enthalten k\u00f6nnen).</html>
+OptionPanel.default_browser_command_windows_nt=Standard Browser Befehl Windows NT
+OptionPanel.default=Standard
+OptionPanel.defaultfont.tooltip=<html>Dies funktioniert nur, wenn TrueType-Schriftarten vorhanden sind.</html>
+OptionPanel.defaultfont=Standard Schriftart
+OptionPanel.defaultfontsize=Standard Schriftart Gr\u00f6\u00dfe
+OptionPanel.defaultfontstyle=Standard Schriftart Stil
+OptionPanel.Defaults=Standards
+OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Wenn die automatischen Zwischenspeicherungen beim normalen Verlassen von Freeplane gel\u00f6scht werden sollen, sollten Sie ein H\u00e4kchen setzen.</html>
+OptionPanel.delete_automatic_saves_at_exit=Sollen die automatisch gespeicherten Maps beim Verlassen gel\u00f6scht werden
+OptionPanel.delete_nodes_without_question.tooltip=Wenn dieses H\u00e4kchen gesetzt ist, werden Knoten ohne Nachfrage gel\u00f6scht. Dies kann bei unbeabsichtigtem L\u00f6schen zu Datenverlust f\u00fchren.
+OptionPanel.delete_nodes_without_question=Knoten ohne Best\u00e4tigung l\u00f6schen?
+OptionPanel.disable_cursor_move_paper=Kein Cursor beim Bewegen der Map
+
+OptionPanel.dk=Dk
+
+OptionPanel.draganddrop=Drag And Drop
+OptionPanel.edgecolor.tooltip=Kanteneigenschaft der Verbindung zum Vaterknoten (wird auch auf alle Unterknoten angewendet)
+OptionPanel.edgecolor=Kantenfarbe
+OptionPanel.edgestyle.tooltip=Kanteneigenschaft der Verbindung zum Vaterknoten (wird auch auf alle Unterknoten angewendet)
+OptionPanel.edgestyle=Kantentyp
+OptionPanel.edgewidth.tooltip=Kanteneigenschaft der Verbindung zum Vaterknoten (wird auch auf alle Unterknoten angewendet)
+OptionPanel.EdgeWidth_1=1
+OptionPanel.EdgeWidth_2=2
+OptionPanel.EdgeWidth_4=4
+OptionPanel.EdgeWidth_8=8
+OptionPanel.EdgeWidth_parent=Wie der Vater
+OptionPanel.EdgeWidth_thin=D\u00fcnn
+OptionPanel.edgewidth=Kantenbreite
+
+OptionPanel.el__buttons_above=Kn\u00f6pfe oben
+OptionPanel.el__enter_confirms_by_default=<EINGABE> beendet den Dialog
+OptionPanel.el__max_default_window_height=Max Standard Fensterh\u00f6he
+OptionPanel.el__max_default_window_width=Max Standard Fensterbreite
+OptionPanel.el__min_default_window_height=Min Standard Fensterh\u00f6he
+OptionPanel.el__min_default_window_width=Min Standard Fensterbreite
+OptionPanel.el__position_window_below_node=Position Fenster unter dem Knoten
+OptionPanel.show_icon_for_attributes=Attribut Icons Zeigen
+OptionPanel.el=El
+OptionPanel.en=En
+
+
+OptionPanel.Environment=Umgebung
+OptionPanel.es=Es
+OptionPanel.et=Et
+OptionPanel.execute_scripts_without_asking.tooltip=<html>Wenn das H\u00e4kchen gesetzt ist, werden Skripte ohne Best\u00e4tigung ausgef\u00fchrt. <br>Freeplane Skripte sind prinzipiell in der Lage, beliebige Aktionen auf Ihrem Rechner auszuf\u00fchren. <br>Daher sollten Sie keinen Skripten vertrauen, die Sie nicht kennen.</html>
+OptionPanel.execute_scripts_without_asking=Skripte ohne Nachfragen ausf\u00fchren?
+OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>Wenn Ihre Groovyskripte fremde Programme (wie z.B. einen Browser) ausf\u00fchren k\u00f6nnen sollen ohne nachzufragen(!),<br>m\u00fcssen Sie dieses H\u00e4kchen setzen.<br>Allerdings sollten Sie vorsichtig sein, da nun b\u00f6swillige Skripte Ihren Computer verw\u00fcsten k\u00f6nnten!</body></html>
+OptionPanel.execute_scripts_without_exec_restriction=Ausf\u00fchren anderer Applikationen erlauben (NICHT empfohlen)
+OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>Wenn Ihre Groovyskripte Dateioperationen (wie \u00d6ffnen/Schreiben/L\u00f6schen) ausf\u00fchren k\u00f6nnen sollen,<br>m\u00fcssen Sie dieses H\u00e4kchen setzen.<br>Allerdings sollten Sie vorsichtig sein, da nun b\u00f6swillige Skripte Ihren Computer verw\u00fcsten k\u00f6nnten!</body></html>
+OptionPanel.execute_scripts_without_file_restriction=Dateioperation erlauben (NICHT empfohlen)
+OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>Wenn Ihre Groovyskripte Netzwerkoperationen ausf\u00fchren k\u00f6nnen sollen,<br>m\u00fcssen Sie dieses H\u00e4kchen setzen.<br>Allerdings sollten Sie vorsichtig sein, da nun b\u00f6swillige Skripte Daten aus Ihrem Computer ausspionieren k\u00f6nnten!</body></html>
+OptionPanel.execute_scripts_without_network_restriction=Netzwerkoperationen erlauben (NICHT empfohlen)
+OptionPanel.experimental_file_locking_on.tooltip=<html> Experimentelles Feature</html>
+OptionPanel.experimental_file_locking_on=Experimentelles sperren der ge\u00f6ffneten Dateien
+OptionPanel.export_icons_in_html.tooltip=<html> Gibt an, ob die Icons auch nach HTML exportiert werden sollen. <br>Allerdings m\u00fcssen die Icons dann auch immer mit dem HTML kopiert werden, damit sie gefunden werden.</html>
+OptionPanel.export_icons_in_html=Export Icons nach Html
+OptionPanel.Files=Dateien
+OptionPanel.first=Erster
+OptionPanel.foldingsymbolwidth.tooltip=<html> Gr\u00f6\u00dfe des Kreises, der die Faltung symbolisiert<html>
+OptionPanel.foldingsymbolwidth=Faltungskreisgr\u00f6\u00dfe
+OptionPanel.fork=Linie
+OptionPanel.fr=Fr
+OptionPanel.gl=Gl
+OptionPanel.gtk=Gtk
+OptionPanel.hr=Hr
+OptionPanel.html_export_based_on_headings=\u00dcberschriftenbasiert
+OptionPanel.html_export_fold_all=Alles Zuklappen
+OptionPanel.html_export_fold_currently_folded=Aktuelle Faltung
+OptionPanel.html_export_folding=Html Export Faltung
+OptionPanel.html_export_no_folding=Ohne Faltung
+OptionPanel.HTML=HTML
+OptionPanel.hu=Hu
+OptionPanel.icon.tooltip=Wenn Sie ein Icon ausw\u00e4hlen, werden alle anderen Icons des Knotens entfernt und das ausgew\u00e4hlte Icon zugewiesen.
+OptionPanel.icons.list.tooltip=Hier ist es m\u00f6glich, die Reihenfolge der Standardicons zu ver\u00e4ndern, bzw. einige auszublenden. Die Icons sind mit Semikola getrennt.
+OptionPanel.icon=Icon
+OptionPanel.icons.list=Liste der angezeigten Standardicons
+OptionPanel.id=Id
+OptionPanel.it=It
+OptionPanel.ja=Ja
+
+
+OptionPanel.Keystrokes=Tasten
+OptionPanel.kr=Kr
+OptionPanel.language.tooltip=<html>Dies ist die Sprache, die im Programm verwendet wird. 'Automatisch' bedeutet, dass die Sprache des Benutzers geladen wird, soweit vorhanden. </html>
+OptionPanel.language=Sprache
+OptionPanel.last_opened_list_length=Anzahl der Liste der zuletzt ge\u00f6ffneten Dateien
+OptionPanel.last=Letzter
+OptionPanel.level=Level
+OptionPanel.level1=Wurzelknotenformat
+OptionPanel.level2=Format der Ebene 1
+OptionPanel.level3=Format der Ebene 2
+OptionPanel.level4=Format der Ebene 3
+OptionPanel.level5=Formate der restlichen Ebenen
+OptionPanel.links=Links
+OptionPanel.load_folding_from_map_default_fold_all=Faltung laden oder falten Alles
+OptionPanel.load_folding_from_map_default_unfold_all=Faltung laden oder falten nichts
+OptionPanel.load_folding=Faltung laden
+OptionPanel.load_last_map.tooltip=<html>Wenn Freeplane started, wird automatisch die zuletzt geladene Map geladen, wenn angeschaltet.</html>
+OptionPanel.load_last_map=Automatisch letzte Map laden
+OptionPanel.lookandfeel.tooltip=<html>Bei Problemen w\u00e4hlen Sie 'nothing'.</html>
+OptionPanel.lookandfeel=Look and Feel
+OptionPanel.lt=Lt
+OptionPanel.mapxsize=Map-X-Gr\u00f6\u00dfe
+OptionPanel.mapysize=Map-Y-Gr\u00f6\u00dfe
+OptionPanel.max_node_width.tooltip=<html>TAngabe in pixeln</html>
+OptionPanel.max_node_width=Maximale Knotenbreite
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>Die Breite der Tooltips in Pixeln.</html>
+OptionPanel.toolTipManager.max_tooltip_width=ToolTip Breite
+OptionPanel.metal=Metall
+OptionPanel.motif=Motif
+OptionPanel.nb=Nb
+OptionPanel.never_save_folding=nie
+OptionPanel.nl=Nl
+OptionPanel.nn=Nn
+OptionPanel.nodebackgroundcolor.tooltip=Hier wird die Knotenhintergrundfarbe eingestellt, die erscheint, wenn der Knoten nicht selektiert ist.
+OptionPanel.nodebackgroundcolor=Knotenhintergrundfarbe
+OptionPanel.nodecolor.tooltip=Hier wird die Knotenvordergrundfarbe eingestellt, die erscheint, wenn der Knoten nicht selektiert ist.
+OptionPanel.nodecolor=Knotenfarbe
+
+OptionPanel.nodefontbold=Fett
+
+OptionPanel.nodefontitalic=Kursiv
+
+OptionPanel.nodefontname=Knotenschrift
+
+OptionPanel.nodefontsize=Schriftgr\u00f6\u00dfe
+OptionPanel.nodeshape.tooltip=<html>Der Stil beschreibt die \u00e4ussere Form eines Knotens.<br>M\u00f6gliche Werte sind:<br><table border="1"><tr><td>Linie:</td><td>Der Knoten wird nur unterstrichen,</td></tr><tr><td>Blase:</td><td>Der Knoten wird von einem geschwungenen Rechteck umfa\u00dft,</td></tr><tr><td>Wie Vater:</td><td> Der Stil wird vom Vater (oder vom Wurzelknotenstil f\u00fcr den Wurzelknoten) \u00fcbernommen,</td></tr><tr><td>Kombiniert:</td><td>Gefaltete Knoten erhalten de [...]
+OptionPanel.nodeshape=Knotenstil
+OptionPanel.nodetext=Knotentext
+OptionPanel.nothing=Nichts
+OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> Die automatische Speicherung speichert nur soviele unterschiedlichen Versionen, wie angegeben. Danach werden die Dateien zyklisch \u00fcberschrieben. </html>
+OptionPanel.number_of_different_files_for_automatic_save=Anzahl von automatischen Speicherungen
+OptionPanel.OK=Speichern
+
+
+OptionPanel.patternname.tooltip=Eindeutiger Name des Stils
+OptionPanel.patternname=Name
+
+OptionPanel.pl=Pl
+OptionPanel.placenewbranches=Ort neuer Knoten
+OptionPanel.plugins/scripting/tab_name=Skripte
+OptionPanel.printonwhitebackground=Immer auf wei\u00dfem Hintergrund drucken
+OptionPanel.pt_BR=Pt BR
+OptionPanel.pt_PT=Pt PT
+OptionPanel.relative=Relativ
+OptionPanel.remind_type_of_new_nodes.tooltip=<html>Wenn "Nachfragen", wird jedesmal gefragt, wenn ein Knoten zum Editieren ge\u00f6ffnet wird. <br>Bei "Nein" wird ein reiner Texteditor ge\u00f6ffnet, w\u00e4hrend <br>bei "Ja" ein Texteditor, der Formatierungen unterst\u00fctzt, ge\u00f6ffnet wird.</html>
+OptionPanel.remind_use_rich_text_in_new_long_nodes=Formatierungen f\u00fcr alle Knoten benutzen
+OptionPanel.remove_notes_without_question.tooltip=Wenn dieses H\u00e4kchen gesetzt ist, werden Notizen ohne Nachfrage gel\u00f6scht. Dies kann bei unbeabsichtigtem L\u00f6schen zu Datenverlust f\u00fchren.
+OptionPanel.remove_notes_without_question=Notizen ohne Nachfrage l\u00f6schen
+OptionPanel.revision_color.tooltip=Hintergrundfarbe f\u00fcr ge\u00e4nderte Knoten.
+OptionPanel.revision_color=Revisionfarbe
+OptionPanel.ru=Ru
+OptionPanel.save_folding_if_map_is_changed=if Map ist ver\u00e4ndert
+OptionPanel.save_folding= Faltung speichern
+OptionPanel.save_modification_times=\u00c4nderungszeiten speichern
+OptionPanel.save_only_intrisically_needed_ids.tooltip=<html>Wenn ausgew\u00e4hlt, werden nur solche IDs gespeichert, die irgendwo in der gleichen Map gebraucht werden. <br>Dies verhindert allerdings, von au\u00dfen zu speziellen Knoten dieser Map zu verlinken.</html>
+OptionPanel.save_only_intrisically_needed_ids=Nur gebrauchte Knoten-IDs speichern
+OptionPanel.script.tooltip=Das Skript selbst.
+OptionPanel.script_directories=Suchpfad f\u00fcr Skripte (Eintr\u00e4ge trennen durch ;;)
+OptionPanel.script_user_key_name_for_signing.tooltip=<html>Wenn Sie Ihre Scripte selbst signieren wollen, geben Sie hier den Alias des Schl\u00fcssels an. <br>Der Schl\u00fcssel wird im Standard keystore erwartet. <br>Das Passwort des Schl\u00fcssels mu\u00df mit dem des Keystores \u00fcereinstimmen (dies ist die Standardeinstellung).</html>
+OptionPanel.script_user_key_name_for_signing=Optionaler Aliasname eines private Schl\u00fcssels, um Scripte zu signieren
+OptionPanel.script=Skript
+OptionPanel.se=Se
+OptionPanel.selection_method_by_click=Durch Mausklick
+OptionPanel.selection_method_delayed=Verz\u00f6gert
+OptionPanel.selection_method_direct=Direkt
+OptionPanel.selection_method=Auswahlmodus
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName=Stile
+OptionPanel.separator.anti_alias=Kandenrundung
+OptionPanel.separator.attributes=Attribute
+OptionPanel.separator.automatic_save=Automatisches Speichern
+OptionPanel.separator.behaviour=Verhalten
+OptionPanel.separator.browser=Browser
+OptionPanel.separator.commands_for_the_program=Programm
+OptionPanel.separator.default_colors=Standard Farben
+OptionPanel.separator.default_fonts=Standard Schriftarten
+OptionPanel.separator.default_styles=Standard Stile
+OptionPanel.separator.EdgeControls=Kanteneigenschaften
+OptionPanel.separator.edit_long_node_window=Fenster f\u00fcr lange Knoten
+OptionPanel.separator.files=Dateien
+OptionPanel.separator.General=Allgemein
+OptionPanel.separator.html_export=Html Export
+OptionPanel.separator.html_import=Html Import
+OptionPanel.separator.hyperlink_types=Hyperlink Typen
+OptionPanel.separator.icon_properties=Icons
+OptionPanel.separator.icons=Piktogramme in "Icon W\u00e4hlen..."
+OptionPanel.separator.initial_map_size=Initiale Mapgr\u00f6\u00dfe
+OptionPanel.separator.key_typing=Tastatureingabe
+OptionPanel.separator.language=Sprache
+OptionPanel.separator.load=Laden
+OptionPanel.separator.look_and_feel=Look and Feel
+OptionPanel.separator.mouse_wheel=Mausrad
+OptionPanel.separator.new_node_commands=Knotenerzeugung
+OptionPanel.separator.node_editing_commands=Knotenver\u00e4nderung
+OptionPanel.separator.node_navigation_commands=Knotennavigation
+OptionPanel.separator.NodeColors=Knotenfarben
+OptionPanel.separator.NodeStyles=Knoteneigenschaften
+OptionPanel.separator.notifications=Nachfragen
+OptionPanel.separator.other_defaults=Andere Standards
+OptionPanel.separator.others=Andere Tastenkombinationen
+OptionPanel.separator.patterns=Stile
+OptionPanel.separator.plugins/scripting/separatorPropertyName=Berechtigungen
+OptionPanel.separator.root_node_appearance=Erscheinung des Wurzel-Knotens
+OptionPanel.separator.save=Speichern
+OptionPanel.separator.ScriptingControl=Skripte
+OptionPanel.separator.selection_colors=Selektion Farben
+OptionPanel.separator.selection_method=Auswahlmodus
+OptionPanel.separator.undo=R\u00fcckg\u00e4ngig
+OptionPanel.set_property_text.tooltip=Leer=Nicht \u00e4ndern; Minus=Eigenschaft l\u00f6schen (also auf den Standard zur\u00fccksetzen); Plus=Eigenschaft setzen.
+OptionPanel.set_property_text=Ver\u00e4ndern?
+OptionPanel.setscript.tooltip=Schaltet die M\u00f6glichkeit zu, ein Skript zu dem Stil hinzuzuf\u00fcgen, dass ausgef\u00fchrt wird, wenn der Stil angewendet wird.
+OptionPanel.setscript=Ver\u00e4ndern?
+OptionPanel.sharp_bezier=Scharfe Bezierkurve
+OptionPanel.sharp_linear=Scharfe Linie
+OptionPanel.signed_script_are_trusted.tooltip=Wenn Skripte von einer vertrauensw\u00fcrdigen Quelle stammen (d.h. von den Programmautoren bzw. von Ihnen selbst) wird es ohne Einschr\u00e4nkungen ausgef\u00fchrt.
+OptionPanel.signed_script_are_trusted=Signierten Skripts vertrauen (empfohlen)
+OptionPanel.sk=Sk
+OptionPanel.sl=Sl
+OptionPanel.standardbackgroundcolor=Standard Hintergrundfarbe
+OptionPanel.standardcloudcolor=Standard Wolkenfarbe
+OptionPanel.standardcloudestyle=Standard Wolkenstil
+OptionPanel.standarddrawrectangleforselection.tooltip=Markiere Auswahl durch ein Rechteck um den Knoten
+OptionPanel.standarddrawrectangleforselection=Zeige Auswahl als Rechteck
+OptionPanel.standardedgecolor=Standard Kanten Farbe
+OptionPanel.standardedgestyle=Standard Kanten Stil
+OptionPanel.standardlinkcolor=Standard Link Farbe
+OptionPanel.standardlinkestyle=Standard Link Stil
+OptionPanel.standardnodeshape=Standard Knoten Stil
+OptionPanel.standardnodetextcolor=Standard Knoten Farbe
+OptionPanel.standardrootnodeshape=Standard Wurzelknoten Stil
+OptionPanel.standardselectednodecolor=Standard Farbe f\u00fcr ausgew\u00e4hlte Knoten
+OptionPanel.standardselectednoderectanglecolor=Farbe f\u00fcr das Rechteck rund um ausgew\u00e4hlten Knoten
+
+OptionPanel.structured_html_import=Import HTML als Knotenhierarchie
+OptionPanel.time_for_automatic_save.tooltip=<html> Zeit zwischen zwei aufeinanderfolgenden automatischen Speicherungen in Millisekunden. Wenn dies sehr gro\u00df ist, wird nicht automatisch gespeichert.</html>
+OptionPanel.time_for_automatic_save=Zeitabstand f\u00fcr automatisches Speichern
+OptionPanel.time_for_delayed_selection.tooltip=<html> (in msec). Ein Wert von 1 bedeutet direkte Auswahl mit der Maus (ohne Klick).</html>
+OptionPanel.time_for_delayed_selection=Zeit f\u00fcr die verz\u00f6gerte Auswahl
+OptionPanel.tr=Tr
+OptionPanel.uk_UA=Uk UA
+OptionPanel.undefined_font=Unbekannte Schriftart
+OptionPanel.undo_levels.tooltip=<html>Bestimmt die Anzahl an Aktionen, die mittels "R\u00fcckg\u00e4ngig" widerrufen werden k\u00f6nnen.</html>
+OptionPanel.undo_levels=Anzahl widerrufbarer Schritte
+OptionPanel.unfold_on_paste.tooltip=Knoten beim Einf\u00fcgen und Drag-And-Drop Entfalten
+OptionPanel.unfold_on_paste=Knoten beim Einf\u00fcgen Entfalten
+OptionPanel.use_common_out_point_for_root_node.tooltip=Alle Kanten am Wurzelknoten starten aus einem Punkt.
+OptionPanel.use_common_out_point_for_root_node=Alle Kanten am Wurzelknoten starten aus einem Punkt
+OptionPanel.use_tabbed_pane.tooltip=Wenn selektiert, werden die ge\u00f6ffneten Maps als einzelne Karteireiter angezeigt.
+OptionPanel.use_tabbed_pane=Karteireiter verwenden
+OptionPanel.userproperties=Benutzereinstellungen
+OptionPanel.vi=Vi
+OptionPanel.wheel_velocity.tooltip=Ein gr\u00f6\u00dferer Wert resultiert in schnelleren Bewegungen der Map bei Bet\u00e4tigung des Mausrades.
+OptionPanel.wheel_velocity=Geschwindigkeit
+OptionPanel.windows=Windows
+OptionPanel.zh_CN=Zh CN
+OptionPanel.zh_TW=Zh
+PageAction.text= &Seiteneinrichtung...
+PasteAction.text= Einf\u00fcgen
+PatternNewNameProperty=Neuer Stil
+PatternToString.backgroundColor=Hintergrundfarbe
+PatternToString.Child=Unterknotenstil
+PatternToString.color=Farbe
+PatternToString.EdgeColor=Kantenfarbe
+PatternToString.EdgeStyle=Kantenform
+PatternToString.EdgeWidth=Kantenbreite
+PatternToString.FontBold=Fett
+PatternToString.FontItalic=Kursiv
+PatternToString.FontName=Schrift
+PatternToString.Icon=Icon
+PatternToString.NodeFontSize=Schriftgr\u00f6\u00dfe
+plugins/latex/LatexNodeHook.editorTitle = Edit Latex
+plugins/ScriptEditor.cancel=\u00c4nderungen Verwerfen und &Abbrechen
+plugins/ScriptEditor.exit=\u00c4nderungen &Speichern und Schlie\u00dfen
+plugins/ScriptEditor.FORBIDDEN_ACTION=Freeplane Groovy Skripte sind eingeschr\u00e4nkt. Die folgende {0,choice,0#Datei|1#Netzwerk|2#Ausf\u00fchr}-Operation ist nicht gegeben: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. Sie k\u00f6nnen dies in den Einstellungen \u00e4ndern.
+plugins/ScriptEditor.menu_actions=&Aktionen
+plugins/ScriptEditor.new_script=Neues Script
+plugins/ScriptEditor.run=Sta&rten
+plugins/ScriptEditor.sign=Skript Signieren...
+plugins/ScriptEditor/window.Result=Ergebnis:
+plugins/ScriptEditor/window.title=Skripteditor
+plugins/TimeList.xml_Created=Erzeugt
+plugins/TimeList.xml_Date=Termin
+plugins/TimeList.xml_Icons=Icons
+plugins/TimeList.xml_Modified=Ver\u00e4ndert
+plugins/TimeList.xml_Notes=Notizen
+plugins/TimeList.xml_Text=Text
+plugins/TimeManagement.xml_appendButton= Datum an selektierte Knoten anh\u00e4ngen
+plugins/TimeManagement.xml_Cancel=Abbrechen
+plugins/TimeManagement.xml_cancelButton=Abbrechen
+plugins/TimeManagement.xml_closeButton=Schliessen
+plugins/TimeManagement.xml_Export=Markierte Knoten Exportieren
+plugins/TimeManagement.xml_Find=Suchen
+plugins/TimeManagement.xml_Goto=Selektieren und Schlie\u00dfen
+plugins/TimeManagement.xml_hour= Stunde:
+plugins/TimeManagement.xml_menu_actions=Aktionen
+plugins/TimeManagement.xml_minute= Minute:
+plugins/TimeManagement.xml_reminderButton_tooltip=<html>Zur gegebenen Zeit werden Sie durch blinkende Icons benachrichtigt - allerdings nur, wenn Freeplane l\u00e4uft.<br>Wenn Sie Freeplane beenden, wird der Timer beim n\u00e4chsten \u00d6ffnen dieser MindMap erneut gestartet.</html>
+plugins/TimeManagement.xml_reminderButton= Wiedervorlage
+plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>Zur Zeit kann nur ein Datum pro Knoten gespeichert werden.<br>Das aktuell eingestellte Datum ist {0,date} {0,time}, Sie wollten allerdings {1,date} {1,time}. <br><br>Wollen Sie das Datum \u00e4ndern (JA), <br>oder m\u00f6chten Sie das eingestellte Datum beibehalten (NEIN)?</html>
+
+plugins/TimeManagement.xml_reminderNode_tooltip=Wiedervorlage am {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Wiedervorlage entfernen
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Entfernt alle Wiedervorlagen der ausgew\u00e4hlten Knoten.
+plugins/TimeManagement.xml_Replace_All=Alle Ersetzen
+plugins/TimeManagement.xml_Replace_Selected=Markierte Ersetzen
+plugins/TimeManagement.xml_Replace=Ersetzen
+plugins/TimeManagement.xml_Select=Selektieren
+plugins/TimeManagement.xml_todayButton=Heute
+plugins/TimeManagement.xml_WindowTitle_All_Nodes=Suchen & Ersetzen
+plugins/TimeManagement.xml_WindowTitle=Zeit Management
+preferences = Einstellungen
+print_preview_title = Vorschau
+PrintAction.text= Drucken...
+PrintDirectAction.text= Drucken
+printing_settings = Druckskalierung
+PrintPreviewAction.text= &Vorschau...
+PropertyAction.text=Einstellungen ...
+QuitAction.text= Beenden
+read_only = Schreibgesch\u00fctzt
+really_convert_to_current_version=<html>Diese Mindmap wurde mit einer \u00e4lteren Version von Freeplane erzeugt. <br>Soll sie konvertiert werden (dies ist unsere Empfehlung)? <br>(Anderenfalls wird ohne Garantie versucht, die Map ohne Konvertierung zu laden.) </html>
+really_cut_node=Knoten wirklich ausschneiden?
+really_execute_script=Wollen Sie wirklich die Skripte in dieser Mindmap ausf\u00fchren? Es ist m\u00f6glich, dass diese Skripte Ihren Rechner besch\u00e4digen.
+really_remove_node=Knoten wirklich l\u00f6schen?
+really_remove_notes=Wollen Sie wirklich die Notizen l\u00f6schen?
+RedoAction.text= Wiederherstellen
+RedoFilterAction.text=Wiederherstellen
+ReminderHookAction.text=Wiedervorlage entfernen
+ReminderHookAction.tooltip=Entfernt eine Wiedervorlage.
+RemoveAllIconsAction.text= Entferne alle Icons
+
+RemoveIconAction.text= Entferne letztes Icon
+RemoveNoteAction.text= Notizen l\u00f6schen
+RemoveNoteAction.tooltip = <html>Entfernt Notizen von evtl. mehreren Knoten.</html>
+rename=&Umbenennen
+repair_link = Link reparieren?
+repair_link_question = Die Map konnte nicht gefunden werden. Link von Hand reparieren?
+replace=Ersetzen
+reset_to_default=Default benutzen
+ResetNodeLocationAction.text=&Position Zur\u00fccksetzen
+RevertAction.text=Auf Gespeicherte Version Zur\u00fcckg&reifen
+RevisionPluginAction.text= &\u00c4nderungen Markieren
+save_unsaved = Soll die folgende Mindmap gespeichert werden? :
+SaveAction.text= &Speichern
+SaveAll.text=&Alle Speichern
+SaveAll.tooltip=Speichert alle ge\u00f6ffneten Maps.
+SaveAsAction.text= Speichern Unter...
+saved = Mindmap wurde gespeichert.
+scheme_evaluate = Evaluate!
+ScriptEditor.text=Skript&editor...
+ScriptEditor.tooltip=Erm\u00f6glicht die Erstellung anspruchsvoller Skripte f\u00fcr Freeplane.
+ScriptEditorPanel.changed_cancel=Die Skripte wurden ver\u00e4ndert. Wollen Sie wirklich abbrechen?
+
+
+select_favorites_folder = Suchen Sie den Ordner aus, in dem Ihre Favoriten sich befinden.
+select_file_export_to=Die Datei, zu der exportiert werden soll, selektieren
+select_folder_for_importing = W\u00e4hlen Sie den Ordner aus, der importiert werden soll
+select_icon=Iconauswahl
+SelectAllAction.text=Alles Markieren
+SelectBranchAction.text=Zweig Markieren
+selection_method_by_click = Einfacher Mausklick Selektiert
+selection_method_delayed=Verz\u00f6gerte Automatische Selektion
+selection_method_direct = Mausber\u00fchrung Selektiert
+SelectNoteAction.text=Wechsel Notiz<->Knoten
+SelectNoteAction.tooltip=Wechselt vom bzw. zum Notizenfenster
+SetImageByFileChooserAction.text= Bild (Dateiauswahl)...
+SetLinkByFileChooserAction.text= Hyperlink (Dateiauswahl)...
+SetLinkByTextFieldAction.text= Hyperlink (Textfeld)...
+SetNoteWindowPosition.bottom.text= Unten
+SetNoteWindowPosition.left.text= Links
+SetNoteWindowPosition.right.text= Rechts
+SetNoteWindowPosition.top.text= Oben
+ShowAllAttributesAction.text= Alle Attribute Anzeigen
+ShowAncestorsAction.text=Zeige Vorg\u00e4nger
+ShowAttributeDialogAction.text=&Attribute Verwalten...
+ShowDescendantsAction.text=Zeige Nachfolger
+ShowFilterToolbarAction.text=Filter Aktivieren
+ShowHideNoteAction.text=Notizfenster
+ShowHideNoteAction.tooltip=Damit kann man das Notizfenster verbergen bzw. wieder anzeigen.
+ShowSelectedAttributesAction.text= Ausgew\u00e4hlte Attribute Anzeigen
+ShowSelectionAsRectangleAction.text=Auswahl als Rechteck
+simplyhtml.aboutFrameTitle=\u00dcber dieses Programm
+simplyhtml.aboutLabel=\u00dcber SimplyHTML...
+simplyhtml.alignCenter=zentriert
+simplyhtml.alignLabel=Ausrichtung:
+simplyhtml.alignLeft=links
+simplyhtml.alignRight=rechts
+simplyhtml.allCellsRangeLabel=alle Zellen
+simplyhtml.allOccurrencesReplaced=alle ersetzt
+simplyhtml.appendTableColLabel=Spalte anh\u00e4ngen
+simplyhtml.appendTableRowLabel=Zeile anh\u00e4ngen
+simplyhtml.applyCellAttrLabel=Anwenden auf
+simplyhtml.backgroundLabel=Hintergrund:
+simplyhtml.boldItalicName=fett kursiv
+simplyhtml.boldName=fett
+simplyhtml.borderColorLabel=Farbe:
+simplyhtml.borderWidthLabel=Breite
+simplyhtml.bottomLabel=unten:
+simplyhtml.cancelBtnName=Abbrechen
+simplyhtml.cellBorderTabLabel=Rahmen
+simplyhtml.cellGenTabLabel=Allgemein
+simplyhtml.cellMarginTabLabel=Abstand
+simplyhtml.cellPanelTitle=Zellenformat
+simplyhtml.clearFormatLabel=Formattierung l\u00f6schen
+simplyhtml.clearFormatTip=Formattierung l\u00f6schen
+simplyhtml.close=Schliessen
+simplyhtml.closeBtnName=Schliessen
+simplyhtml.colorLabel=Farbe
+simplyhtml.copyLabel=Kopieren
+simplyhtml.copyTip=Kopieren
+simplyhtml.cTagNameHead1=\u00dcberschrift 1
+simplyhtml.cTagNameHead2=\u00dcberschrift 2
+simplyhtml.cTagNameHead3=\u00dcberschrift 3
+simplyhtml.cTagNameHead4=\u00dcberschrift 4
+simplyhtml.cTagNameHead5=\u00dcberschrift 5
+simplyhtml.cTagNameHead6=\u00dcberschrift 6
+simplyhtml.cTagNameLink=Verkn\u00fcpfung
+simplyhtml.cTagNameOL=nummerierte Liste
+simplyhtml.cTagNamePara=Absatz
+simplyhtml.cTagNameUL=Bullet-Liste
+simplyhtml.cutLabel=Ausschneiden
+simplyhtml.cutTip=Ausschneiden
+simplyhtml.defaultDocName=Ohne Titel
+simplyhtml.deleteTableColLabel=Spalte l\u00f6schen
+simplyhtml.deleteTableRowLabel=Zeile l\u00f6schen
+simplyhtml.docTitleQuery=Neuer Titel:
+simplyhtml.docTitleTitle=Dokumenttitel bearbeiten
+simplyhtml.editLabel=Editieren
+simplyhtml.effectLabel=Effekt
+simplyhtml.familyLabel=Familie
+simplyhtml.findNext=Suchen...
+simplyhtml.findReplaceDialogTitle=Suchen & Ersetzen
+simplyhtml.findReplaceLabel=Suchen & Ersetzen
+simplyhtml.findReplaceTip=Suchen & Ersetzen
+
+simplyhtml.fontBoldLabel=Fett
+
+simplyhtml.fontBoldTip=fett an- und ausschalten
+
+simplyhtml.fontColorLabel=Textfarbe
+simplyhtml.fontColorTip=Textfarbe
+simplyhtml.fontDialogTitle=Zeichen formatieren
+
+simplyhtml.fontItalicLabel=Kursiv
+
+simplyhtml.fontItalicTip=kursiv an- und ausschalten
+simplyhtml.fontLabel=Zeichen...
+simplyhtml.fontTabLabel=Schriftart
+simplyhtml.fontTip=Zeichen formatieren...
+
+simplyhtml.fontUnderlineLabel=Unterstrichen
+simplyhtml.fontUnderlineTip=unterstreichen an- und ausschalten
+simplyhtml.foregroundLabel=Vordergrund:
+simplyhtml.formatLabel=Format
+simplyhtml.formatListLabel=Liste...
+simplyhtml.formatListTip=Listenformat \u00e4ndern
+simplyhtml.formatParaLabel=Absatz...
+simplyhtml.formatParaTip=Absatzformat \u00e4ndern
+simplyhtml.formatTableLabel=Tabelle...
+simplyhtml.formatTableTip=Tabelle formatieren...
+simplyhtml.helpLabel=Hilfe
+simplyhtml.htmlTabTitle=HTML Code Ansicht
+simplyhtml.imageFileDesc=Bilddateien
+simplyhtml.insertTableColLabel=Spalte einf\u00fcgen
+simplyhtml.insertTableLabel=Tabelle...
+simplyhtml.insertTableMsg=Wieviele Spalten?
+simplyhtml.insertTableRowLabel=Zeile einf\u00fcgen
+simplyhtml.insertTableTitle=Tabelle einf\u00fcgen
+simplyhtml.italicName=kursiv
+simplyhtml.layoutTabTitle=Layout Ansicht
+simplyhtml.leftLabel=links:
+simplyhtml.listDialogTitle=Liste formatieren
+simplyhtml.listIndentTitle=Einr\u00fcckung:
+simplyhtml.listPosInside=einger\u00fcckt
+simplyhtml.listPositionLabel=Position:
+simplyhtml.listPosOutside=ausger\u00fcckt
+simplyhtml.listTypeCircle=leerer Kreis Bulletzeichen
+simplyhtml.listTypeDecimal=1.,2.,3.,4.
+simplyhtml.listTypeDisc=ausgef\u00fcllter Kreis als Bulletzeichen
+simplyhtml.listTypeLabel=Typ:
+simplyhtml.listTypeLowerAlpha=a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman=i.,ii.,iii.,iv.
+simplyhtml.listTypeNone=keine
+simplyhtml.listTypeSquare=rechteckiges Bulletzeichen
+simplyhtml.listTypeUpperAlpha=A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman=I.,II.,III.,IV.
+simplyhtml.marginLabel=Au\u00dfen
+simplyhtml.matchCase=Gro\u00df- und Kleinschreibung beachten
+simplyhtml.newStyleDefaultName=neue Formatvorlage
+simplyhtml.nextTableCellLabel=N\u00e4chste Zelle
+simplyhtml.noLineLabel=keine
+simplyhtml.noMoreOccurrencesFound=keine (weiteren) gefunden
+simplyhtml.okBtnName=OK
+simplyhtml.paddingLabel=Innen
+simplyhtml.paraAlignCenterLabel=Zentriert
+simplyhtml.paraAlignCenterTip=Paragraph zentriert ausrichten
+simplyhtml.paraAlignLeftLabel=Linksb\u00fcndig
+simplyhtml.paraAlignLeftTip=Paragraph linksb\u00fcndig ausrichten
+simplyhtml.paraAlignRightLabel=Rechtsb\u00fcndig
+simplyhtml.paraAlignRightTip=Paragraph rechtsb\u00fcndig ausrichten
+simplyhtml.paraStyleDialogTitle=Absatzformat
+simplyhtml.paraTabLabel=Absatz
+simplyhtml.pasteLabel=Einf\u00fcgen
+simplyhtml.pasteTip=Einsetzen
+simplyhtml.plainName=Standard
+simplyhtml.previewLabel=&Vorschau
+simplyhtml.previewText=Dies ist ein Test
+simplyhtml.prevTableCellLabel=Vorige Zelle
+simplyhtml.redoLabel=Wiederherstellen
+simplyhtml.redoTip=Wiederholen
+simplyhtml.replace=Ersetzen...
+simplyhtml.replaceAll=Alles
+simplyhtml.replaceDone=Fertig
+simplyhtml.replaceNo=Nein
+simplyhtml.replaceThisQuery=ersetze dieses Vorkommnis von
+simplyhtml.replaceWith=Ersetzen mit:
+simplyhtml.replaceYes=Ja
+simplyhtml.rightLabel=rechts:
+simplyhtml.searchDown=nach unten suchen
+simplyhtml.searchFromStart=vom Anfang aus suchen
+simplyhtml.searchUp=nach oben suchen
+simplyhtml.selectAllLabel=Alles Ausw\u00e4hlen
+simplyhtml.sizeLabel=Gr\u00f6\u00dfe
+simplyhtml.standardStyleName=standard
+simplyhtml.strikeLabel=Durchgestrichen
+simplyhtml.styleLabel=Stil
+simplyhtml.styleNameInputText=Name der Formatvorlage?
+simplyhtml.styleNameInputTitle=Formatvorlage speichern
+simplyhtml.tableBgColLabel=Hintergrundfarbe:
+simplyhtml.tableDialogTitle=Tabelle formatieren
+simplyhtml.tableLabel=Tabelle
+simplyhtml.tablePanelTitle=Tabellenformat
+simplyhtml.tableWidthLabel=Breite:
+simplyhtml.textIndentLabel=Einr\u00fcckung:
+simplyhtml.textToFind=Suche Text:
+simplyhtml.thisCellRangeLabel=diese Zelle
+simplyhtml.thisColRangeLabel=diese Spalte
+simplyhtml.thisRowRangeLabel=diese Zeile
+simplyhtml.toggleBulletsLabel=Aufz\u00e4hlung ein/aus
+simplyhtml.toggleBulletsTip=Aufz\u00e4hlung ein/aus
+simplyhtml.toggleNumbersLabel=Numerierung ein/aus
+simplyhtml.toggleNumbersTip=Numerierung ein/aus
+simplyhtml.topLabel=oben:
+simplyhtml.uLineLabel=Unterstrichen
+simplyhtml.unableToOpenFileError=Datei kann nicht ge\u00f6ffnet werden
+simplyhtml.unableToRedoError=Wiederholen nicht m\u00f6glich:
+simplyhtml.unableToUndoError=R\u00fcckg\u00e4ngig nicht m\u00f6glich:
+simplyhtml.undoLabel=R\u00fcckg\u00e4ngig
+simplyhtml.undoTip=R\u00fcckg\u00e4ngig
+simplyhtml.valignBaseline=an Basislinie
+simplyhtml.valignBottom=unten
+simplyhtml.valignLabel=Vert. Ausrichtung:
+simplyhtml.valignMiddle=mittig
+simplyhtml.valignTop=oben
+simplyhtml.wholeWordsOnly=nur ganze Worte
+SortNodes.text=Kinder &Sortieren
+SortNodes.tooltip=Sortiert alle Kinder eines Knotens nach dem Alphabet.
+split = &Teilen
+SplitNode.text= &Knoten Aufteilen
+SplitNode.tooltip= <html>Knoteninhalt wird in mehrere Knoten verteilt.</html>
+style = Stil
+TimeListAction.text=Zeit&plan...
+TimeListAction.tooltip=Zeigt alle Wiedervorlagezeiten und die dazugeh\u00f6rigen Knoten.
+TimeManagementAction.text= Kalender Anzeigen ...
+TimeManagementAction.tooltip= <html>Zeigt das Kalender Modul von Kai Toedter.</html>
+ToggleChildrenFoldedAction.text= Unterknoten (ent)falten
+ToggleFoldedAction.text= Knoten falten/entfalten
+ToggleLeftToolbarAction.text= Zweites Werkzeugmen\u00fc
+ToggleMenubarAction.text= Men\u00fc
+ToggleToolbarAction.text= Werkzeugmen\u00fc
+undefined_error = Ein unerwarteter Fehler ist aufgetreten. Eine Fehlernachricht im Forum w\u00e4re sch\u00f6n.
+underline = Unterstrichen
+underlined = Unterstrichen
+UndoAction.text= R\u00fcckg\u00e4ngig
+UndoFilterAction.text=R\u00fcckg\u00e4ngig
+unfold = Entfalten
+UnfoldAllAction.text= Alles Aufklappen
+UnfoldAllAction.tooltip= <html>Klappt die selektierten Knoten und alle Kinder auf.</html>
+
+UnfoldOneLevelAction.text= Eine Ebene Aufklappen
+UnfoldOneLevelAction.tooltip= <html>Klappt die selektierten Knoten um eine Ebene auf.</html>
+url_error = Fehler: Diese URL ist fehlerhaft.
+UsePlainTextAction.text= Benutze Reinen Text
+user_defined_zoom = Benutzerdefiniert.
+user_defined_zoom_status_bar = Der Zoom wurde ge\u00e4ndert und steht nun auf dem benutzerdefinierten Wert von {0}%.
+user_zoom = Druckvergr\u00f6\u00dferung (0.0 - 2.0):
+
+WebDocuAction.text= Web Documentation
+width = Breite
+
+xslt_export_not_possible=Freeplane XSLT Export nicht m\u00f6glich
+yes = Ja
+ZoomInAction.text= Zoom +
+ZoomOutAction.text= Zoom -
+
+ChangeConnectorArrowsAction.forward.text=Vorw\u00e4rts
+ChangeConnectorArrowsAction.backward.text=Zur\u00fcck
+
+
+OptionPanel.label_font_size=Schriftgr\u00f6\u00dfe
+OKAction.text=&OK
+ApplyAction.text=&\u00dcbernehmen
+CancelAction.text=&Abbrechen
+ImportAction.text=&Importieren
+
+
+
+# Add
+AddElementaryConditionAction.text=Hinzu\u00dcgen
+
+# Filter selected nodes
+ApplySelectedViewConditionAction.text=Ausgew\u00e4hlte Knoten filtern
+
+# You already use the latest program version
+version_up_to_date=Sie ben\u00dctzen bereits die aktuellste Version.
+
+
+# Applies to filtered nodes
+ApplyToVisibleAction.text=Anwendung auf gefilterte Knoten
+# Ask for Help
+AskForHelp.text=Hilfe anfordern
+# Center selected node
+CenterSelectedNodeAction.text=Selektierten Knoten zentrieren
+# Both
+ChangeConnectorArrowsAction.both.text=Beide
+# None
+ChangeConnectorArrowsAction.none.text=Keinen
+# And
+CreateConjunctConditionAction.text=Und
+# Or
+CreateDisjunctConditionAction.text=Oder
+# Not
+CreateNotSatisfiedConditionAction.text=Not
+# Horizontal
+EdgeStyleAction.horizontal.text=Horizontal
+# Exports the map in the current folding to a JPEG image.
+ExportToImage.jpg.tooltip=Exportiere derzeitigen Zustand der Map als JPEG
+# Exports the map in the current folding to a PNG image.
+ExportToImage.png.tooltip=Exportiere derzeitigen Zustand der Map als PNG
+# Arrows
+IconGroupPopupAction.arrows.text=Pfeile
+# Docs & Folders
+IconGroupPopupAction.docs_folders.text=Dokumente und Ordner
+# Flags
+IconGroupPopupAction.flags.text=Flags
+# Miscallaneous
+IconGroupPopupAction.miscallaneous.text=Verschiedenes
+# Nature
+IconGroupPopupAction.nature.text=Natur
+# Numbers
+IconGroupPopupAction.numbers.text=Nummern
+# Office
+IconGroupPopupAction.office.text=B\u00fcro
+# People
+IconGroupPopupAction.people.text=Personen
+# Signs
+IconGroupPopupAction.signs.text=Zeichen
+# Smiley
+IconGroupPopupAction.smiley.text=Smiley
+# Time
+IconGroupPopupAction.time.text=Zeit
+# User icons
+IconGroupPopupAction.user.text=User Icons
+# Text Patterns
+LoadAcceleratorPresetsAction.textPatterns.text=Text Muster
+# Open File
+OpenPathAction.text=Datei \u00f6ffnen
+# Root Node Format
+OptionPanel.automaticFormat_level1=Formattierung des Wurzelknotens
+# Number of kept backup files
+OptionPanel.backup_file_number=Anzahl der Backup Dateien
+# bezier
+OptionPanel.bezier=Bezier
+# Center selected nodes
+OptionPanel.center_selected_node=Selektierte Knoten zentrieren
+# Check for updates on program start
+OptionPanel.check_updates_automatically=Automatisch nach Updates suchen
+# Cloud
+OptionPanel.cloud=Wolke
+# Cloud and Color
+OptionPanel.cloudcolor=Wolke und Farbe
+# Don't display 'move' cursor during paper dragging
+OptionPanel.disable_cursor_move_paper.tooltip=Keinen 'Bewegungs' Cursor w\u00e4hrend des Drag Vorgangs anzeigen
+# Key typing: if enabled enters node editing
+
+# If dnd is enabled.
+OptionPanel.draganddrop.tooltip=Wenn Drag'n drop aktiviert ist
+# horizontal
+OptionPanel.horizontal=Horizontal
+# Font Family
+OptionPanel.label_font_family=Zeichensatz
+# linear
+OptionPanel.linear=Linear
+# Note
+filter_note=Anmerkung
+# Priority
+filter_priority=Priorit\u00e4t
+# Saved selection
+filter_selected_node_view_snapshot=Gespeicherte Auswahl
+# Filter could not be loaded, file corrupted
+filters_not_loaded=Filter kann nicht geladen werden, die Datei ist besch\u00e4digt.
+# Freeplane_Reverted_
+freeplane_reverted=Freeplane_Reverted_
+# Freeplane
+icon_bee=Freeplane
+# F&ilter
+menu_filter=F&ilter
+# Send
+org.freeplane.plugin.bugreport.agree=Senden
+# Always send
+org.freeplane.plugin.bugreport.always_agree=Immer senden.
+# Never send
+org.freeplane.plugin.bugreport.always_deny=Niemals senden.
+# Don't send
+org.freeplane.plugin.bugreport.deny=Nicht senden.
+# Automatic bug report
+org.freeplane.plugin.bugreport.dialog.title=Automatischer Fehlerreport
+# Freeplane has an automatic bug tracking engine.
+#No personal data or map content will ever be transmitted.
+#Bug reports will help us improve the software.
+org.freeplane.plugin.bugreport.question=Freeplane hat eine automatische Fehlerbehandlungsroutine die sich mit einem zentralen Server verbindet. Fehlerreports helfen, die Qualit\u00e4t der Software zu verbessern. Keine pers\u00f6nlichen Daten werden ausgewertet.
+# Current report
+org.freeplane.plugin.bugreport.report=Derzeitiger Report
+# Out of memory.
+out_of_memory=Zuwenig Speicher.
+# Overwrite existing key set?
+overwrite_keyset_question=Soll existierendes Keyset \u00fcberschrieben werden?
+# /doc/FM_Key_Mappings_Quick_Guide.pdf
+
+# Are you sure to remove this keystroke from another item?
+remove_shortcut_question=Tastaturk\u00fcrzel ersetzen?
+# Saving canceled
+saving_canceled= Speicher Vorgang abgebrochen
+# Source Forge Login required. Continue?
+sf_login_required= Source forge login ben\u00f6tigt. Weitermachen?
+# Update Check Dialog
+updatecheckdialog= Update Check Dialog
+# Could not load map at URL:
+url_load_error= Kann MindMap nicht laden mit der Url:
+# This shortcut can not be set, it is used as a menu shortcut.
+used_in_menu=Dieser Shortcut darf nicht gesetzt werden, da er bereits als Men\u00fc Shortcut verwendet wird.
+
+# hide edge
+OptionPanel.hide_edge=Kanten verstecken
+
+# Set Links either relative or absolute
+OptionPanel.links.tooltip=Links entweder relativ oder absolut setzen.
+
+# Load all last maps
+OptionPanel.load_last_maps=Alle zuletzt ge\u00f6ffneten Mindmaps laden
+
+# The initial size of every map
+OptionPanel.mapxsize.tooltip=Anfangsgr\u00f6\u00dfe jeder Map
+
+
+
+# Always send
+OptionPanel.org.freeplane.plugin.bugreport.allowed=Immer senden
+
+# Show report dialog
+OptionPanel.org.freeplane.plugin.bugreport.ask=Report Dialog zeigen
+
+# Never send
+OptionPanel.org.freeplane.plugin.bugreport.denied=Nie senden
+
+# Always use white background for printing
+OptionPanel.printonwhitebackground.tooltip=Immer Weiss als Hintergrund beim Drucken verwenden
+
+# Use default font for notes too
+OptionPanel.resources_use_default_font_for_notes_too=Standard Font f\u00fcr Notizen verwenden
+
+# Remove top margin for notes
+OptionPanel.resources_use_margin_top_zero_for_notes=Oberen Rand f\u00fcr Notizen entfernen
+
+# Clouds
+OptionPanel.separator.CloudControls=Wolken
+# Graphical Links
+
+
+# Automatic bug report
+OptionPanel.separator.org.freeplane.plugin.bugreport=Automatischer Fehler Bericht
+
+# Program Updates
+OptionPanel.separator.updates=Program Aktualisierungen
+
+# The standard background color in html notation
+OptionPanel.standardbackgroundcolor.tooltip=Standard Hintergrundfarbe
+
+# The standard cloud color in html notation
+OptionPanel.standardcloudcolor.tooltip=Standard Wolkenfarbe
+
+# The standard edge color in html notation
+OptionPanel.standardedgecolor.tooltip=Standard Kanten Farbe
+
+# Structured icon toolbar
+OptionPanel.structured_icon_toolbar=Strukturierter Icon Toolbar
+
+# Click on menu items holding a control key for assigning hot keys
+OptionPanel.text.use_ctrl_key=Strg Taste gedr\u00fcckt halten und Men\u00fc Eintr\u00e4ge anklicken um Hot Keys zuzuweisen.
+
+# Reapply
+ReapplyFilterAction.text=Nochmal anwenden
+
+# Report a Bug
+ReportBugAction.text=Einen Programfehler berichten
+
+# Request a Feature
+RequestFeatureAction.text=Einen Verbesserungsvorschlag einbringen
+
+# Save hot key set
+SaveAcceleratorPresetsAction.text=Hot Key Set speichern
+
+# F-Bar
+ToggleFBarAction.text=F-Bar
+
+# Check for Updates
+UpdateCheckAction.text=Auf Updates pr\u00fcfen.
+
+# Hot Key Presets
+acceleratorPresets=Hot Key Voreinstellungen
+
+# Assign Attributes
+attributes_assign_dialog=Attribute zuweisn
+
+# Can not connect to information server
+can_not_connect_to_info_server=Kann nicht zu Informations - Server verbinden.
+
+# Can not save hot key set
+can_not_save_key_set=Kann leider Hot Key Set nicht speichern
+
+# Map content is corrupted
+corrupt_map=Der Inhalt der Map ist leider besch\u00e4digt.
+
+# Download
+download=Download
+
+# Edit Long Node
+edit_long_node=Knoten mit Fliesstext bearbeiten
+
+# Edit Middle Label
+edit_middle_label=Middle Label editieren
+
+# Edit Source Label
+edit_source_label=Source Label editieren
+
+# Edit Target Label
+edit_target_label=Ziel Label editieren
+
+# Enter hot key set name
+enter_keyset_name=Bitte Hot Key Set Name eingeben
+
+# Export failed
+export_failed=Export ist fehlgeschlagen.
+
+
+# Scripts
+ExecuteScriptForAllNodes.text=Alle Skripte in der Map ausf\u00fchren
+ExecuteScriptForSelectionAction.text=Alle Skripte des selektierten Knotens ausf\u00fchren
+userScripts=Skripte
+ExecuteScriptOnSingleNode.text={0} f\u00fcr einen ausgew\u00e4hlten Knoten ausf\u00fchren
+ExecuteScriptOnSelectedNode.text={0} f\u00fcr alle ausgew\u00e4hlten Knoten ausf\u00fchren
+ExecuteScriptOnSelectedNodeRecursively.text={0} rekursiv f\u00fcr ausgew\u00e4hlte Knoten ausf\u00fchren
+ExecuteScriptError.text=Fehler beim Ausf\u00fchren des Skripts.\nSiehe Logfile zu Details.
+ReadScriptError.text=Fehler beim Lesen des Skripts.\nSiehe Logfile zu Details.
+
+#automatic translated values
+#Wed Oct 28 00:16:35 CET 2009
+OptionPanel.outline_hgap=horizontalen Abstand[auto]
+OptionPanel.separator.NodeFont=Font-Knoten[auto]
+OptionPanel.separator.connectors=Steckverbinder[auto]
+RemoveConnectorAction.text=Entfernen Connector[auto]
+user_defined_scale=Benutzer definierten Skala[auto]
+OptionPanel.org.freeplane.plugin.bugreport=Politik[auto]
+OptionPanel.standardnodetextcolor.tooltip=<html> Die Standard-Knoten Farbe. Im HTML-Notation (\# RRGGBB in Hex-Werte) </html>[auto]
+StringFlavorHandler=Plain Text Knotenhierarchie[auto]
+bitmaps=Bitmaps[auto]
+NextNodeAction.FORWARD.text=N\u00e4chster Knoten[auto]
+FileListFlavorHandler=Links zu Dateien[auto]
+OptionPanel.standardlinkestyle.tooltip=<html> Die Standard-Link-Stil. derzeit nur "Bezier" wird unterst\u00fctzt </html>[auto]
+OptionPanel.outline_vgap=senkrechte Abstand[auto]
+ToggleFullScreenAction.text=Vollbildmodus[auto]
+NextNodeAction.FORWARD_N_FOLD.text=N\u00e4chster Knoten fach ()[auto]
+OptionPanel.show_node_tooltips=Display Tool-Tipps f\u00fcr Knoten[auto]
+OptionPanel.il__enter_confirms_by_default=Geben Sie best\u00e4tigt per Default[auto]
+ChangeConnectorArrowsAction.text=\u00c4ndern Arrows von Connector[auto]
+OptionPanel.standardselectednoderectanglecolor.tooltip=<html> Die Farbe des buble Kennzeichnung ausgew\u00e4hlten Knoten. Im HTML-Notation (\# RRGGBB in Hex-Werte) </html>[auto]
+NextNodeAction.BACK_N_FOLD.text=Zur\u00fcck Knoten fach ()[auto]
+fit_map_to_page_height=Fit H\u00f6he auf einer Seite[auto]
+OptionPanel.standardselectednodecolor.tooltip=<html> Die Standard-Farbe, wenn Knoten ausgew\u00e4hlt. Im HTML-Notation (\# RRGGBB in Hex-Werte) </html>[auto]
+AddConnectorAction.text=Connector hinzuf\u00fcgen[auto]
+ViewerControllerAction.text=Externes Objekt ...[auto]
+OptionPanel.standardlinkcolor.tooltip=<html> Die Standard-Link-Farbe in HTML-Notation </html>[auto]
+icon_user_icon=User Icons[auto]
+OptionPanel.toolTipManager.dismissDelay=Entlassen Verz\u00f6gerung ms[auto]
+OptionPanel.standardcloudestyle.tooltip=<html> Die Standard-Wolke Stil. derzeit nur "Bezier" wird unterst\u00fctzt </html>[auto]
+OptionPanel.paint_connectors_behind=Knoten verstecken Anschl\u00fcsse[auto]
+NextNodeAction.BACK.text=Zur\u00fcck Knoten[auto]
+ConnectorColorAction.text=Connector Color ...[auto]
+OptionPanel.selection_method.tooltip=<html> mit den folgenden Schalter k\u00f6nnen Sie aktivieren bzw. deaktivieren Sie die Auswahl Regelung verz\u00f6gert. Auto-Optionen. \u00c4ndern Sie diese nicht, da sie ohnehin zu auto.properties gespeichert werden. </html>[auto]
+SelectedPasteAction.text=Einf\u00fcgen als ...[auto]
+ViewLayoutTypeAction.OUTLINE.text=Gliederungsansicht[auto]
+OptionPanel.separator.outline_view=Gliederungsansicht[auto]
+EdgeLikeLinkAction.text=Simulieren Rand[auto]
+OptionPanel.separator.inline_editor=In-line-Knoten-Editor[auto]
+OptionPanel.standardedgestyle.tooltip=<html> Die Standard-Rand-Stil. "lineare" und "Bezier" unterst\u00fctzt werden </html>[auto]
+OptionPanel.standardrootnodeshape.tooltip=<html> Der Wurzelknoten Stil, wenn kein anderes angegeben ist. "Gabel" und "Blase" und "kombinierte" unterst\u00fctzt werden </html>[auto]
+OptionPanel.placenewbranches.tooltip=<html> Wo setzen Sie neue Zweige. G\u00fcltige Werte sind 'first' und 'last' </html>[auto]
+OptionPanel.editor_extra_width=Extrabreite Schritt[auto]
+OptionPanel.nodetext.tooltip=Hier k\u00f6nnen Sie festlegen, den Knoten der Text. Die alte Fassung wird verworfen, wenn ein solches Muster angewandt wird.[auto]
+fit_map_to_page_width=Breite an einer Seite[auto]
+OptionPanel.separator.editing=Editor-Einstellungen[auto]
+OptionPanel.toolTipManager.initialDelay=Anf\u00e4nglichen Verz\u00f6gerung ms[auto]
+DirectHtmlFlavorHandler=HTML als einzigen Knoten[auto]
+StructuredHtmlFlavorHandler=HTML als Knotenhierarchie[auto]
+AllMapsNodeListAction.text=Suchen und Ersetzen in allen Karten[auto]
+MindMapNodesFlavorHandler=Knoten-Hierarchie[auto]
+OptionPanel.toolTipManager.reshowDelay=ReshowDelay Verz\u00f6gerung ms[auto]
+OptionPanel.standardnodeshape.tooltip=<html> Der Standardwert neuen Knoten Stil. "Gabel", "Blase" "as_parent" und "kombinierte" unterst\u00fctzt werden </html>[auto]
+OptionPanel.separator.tooltip=Tooltip mal[auto]
+
+#automatic translated values
+#Sat Oct 31 21:30:34 CET 2009
+really_convert_to_current_version=<html>This map was created with an older version of Freeplane. <br>Should it be converted (recommended)? <br>(Otherwise it is taken as it is without guarantee.) </html>[translate me]
+ModesMenuAction.File.text=Datei-Explorer[auto]
+ModesMenuAction.MindMap.text=Mind-Map-Editor[auto]
+
+
+#automatic translated values
+#Mon Dec 28 18:44:31 CET 2009
+MaxNodeWidthAction.text=Set Knoten maximale Breite[auto]
+OptionPanel.separator.spelling=Rechtschreibpr\u00fcfung Optionen[auto]
+OptionPanel.spelling_opt_case_sensitive=Gro\u00df-und Kleinschreibung[auto]
+OptionPanel.spelling_opt_ignore_all_caps_words=Ignorieren Sie alle W\u00f6rter in Gro\u00dfbuchstaben.[auto]
+icon_females=Frauen[auto]
+OptionPanel.spelling_opt_suggestions_limit_menu=Die maximale Anzahl der Vorschl\u00e4ge in das Men\u00fc[auto]
+
+OptionPanel.spelling_opt_suggestions_limit_dialog=Die maximale Anzahl der Vorschl\u00e4ge in den Dialog[auto]
+OptionPanel.spelling_opt_ignore_capitalization=Ignorieren Gro\u00dfbuchstaben am Wort beginnen[auto]
+OptionPanel.spelling_opt_ignore_words_with_numbers=W\u00f6rter mit Zahlen ignorieren[auto]
+icon_males=M\u00e4nner[auto]
+
+#automatic translated values
+#Fri Feb 05 12:54:18 CET 2010
+OptionPanel.display_node_id=Display-Node-ID[auto]
+OptionPanel.load_folding_start_level=Fold Knoten aus Ebene[auto]
+update_failed=Update nicht mit der Meldung $ 1[auto]
+OptionPanel.goto_note_end_on_edit=Bewegen Sie beachten Cursor an das Ende[auto]
+not_saved_for_image_error=Die Karte muss gerettet werden, bevor Sie ein Bild von Dateiauswahl gesetzt[auto]
+link_error=Falscher Link "$ 1" nicht geladen[auto]
+RemoveIcon_0_Action.text=Entfernen erste Symbol[auto]
diff --git a/freeplane_ant/src/test/resources/unsorted/Test_en.properties b/freeplane_ant/src/test/resources/unsorted/Test_en.properties
new file mode 100644
index 0000000..416e724
--- /dev/null
+++ b/freeplane_ant/src/test/resources/unsorted/Test_en.properties
@@ -0,0 +1,1255 @@
+about_text = Freeplane - free mind mapping and knowledge building software\nCopyright \u00a9 2000-2010 Joerg Mueller, Dimitry Polivaev, Predrag Cuklin, Christian Foltin, Daniel Polansky and others.\nThis program is free software, licenced under GNU General Public Licence.\n\nHome: http://freeplane.sourceforge.net/\nVersion:
+AboutAction.text = About
+acceleratorPresets = Hot Key Presets
+accessories/plugins/ApplyFormatPlugin.dialog.title = Change format of nodes
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Change pattern
+accessories/plugins/EncryptNode.properties_0 = Choose password for encrypted node
+accessories/plugins/EncryptNode.properties_1 = Passwords are not equal or to short.
+accessories/plugins/EncryptNode.properties_2 = Enter Password:
+accessories/plugins/EncryptNode.properties_3 = Re-enter Password:
+accessories/plugins/EncryptNode.properties_4 = Enter your password.
+accessories/plugins/EncryptNode.properties_5 = <html>Remember, that the strength of the encryption<br> depends almost completely on the quality of your password.
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = Cancel
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = You can only toggle the encryption state of an encrypted node. Please insert such a node using the tools menu.
+accessories/plugins/EncryptNode.properties_select_me = Select me to continue!
+accessories/plugins/EncryptNode.properties_wrong_password = The password is not correct.
+
+accessories/plugins/ExportWithTWiki.text = As TWiki...
+accessories/plugins/ExportWithTWiki.tooltip = Exports the map as a TWiki document.
+accessories/plugins/ExportWithXSLT.tooltip = This is an uniform export method using XSLT scripts.
+
+
+accessories/plugins/ExportWithXSLT_Applet.text = As Java Applet...
+accessories/plugins/ExportWithXSLT_Applet.tooltip = Exports the map as a java browser applet.
+accessories/plugins/ExportWithXSLT_Flash.text = As Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip = Exports the map as a flash application.
+accessories/plugins/ExportWithXSLT_HTML.text = As XHTML (JavaScript version)...
+accessories/plugins/ExportWithXSLT_HTML3.text = As XHTML (Clickable map image version)...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Resources from RESOURCES node to TaskJuggler file...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Exports resources from RESOURCES node to Taskjuggler module. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text = Tasks from TASKS node to TaskJuggler file...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Exports tasks from TASKS node to Taskjuggler module. </html>
+accessories/plugins/ManagePatterns.dialog.title = Manage Patterns...
+accessories/plugins/ManagePatterns.not_found = Pattern file can't be loaded.
+accessories/plugins/SaveAll.properties_save_all_cancelled = Operation was not completed successfully.
+add = &Add
+AddConnectorAction.text = Add Connector
+AddElementaryConditionAction.text = Add
+AddLocalLinkAction.text = Add Local Hyperlink
+AllMapsNodeListAction.text = Find and Replace in all maps
+antialias_all = Antialias All
+antialias_edges = Antialias Edges
+antialias_none = Antialias None
+apply = &Apply
+ApplyAction.text = &Apply
+ApplyFormatPlugin.text = &Change format ...
+ApplyFormatPlugin.tooltip = Presents a dialog in which node and edge attributes can be changed at once.
+ApplyNoFilteringAction.text = No Filtering
+ApplySelectedViewConditionAction.text = Filter selected nodes
+ApplyToVisibleAction.text = Applies to filtered nodes
+as_parent = As Parent
+AskForHelp.text = Ask for Help
+AssignAttributesAction.text = Assi&gn Attributes...
+attribute_delete = Delete all Values
+attribute_delete_value = Delete this Value
+attribute_font_size_tooltip = Attribute Font Size
+attribute_list_box_label_text = Existing Values
+attribute_replace = Replace with
+attribute_top = All known Attributes for the loaded Maps
+attributes_adding_empty_attribute_error = Can not use an empty string as attribute name
+attributes_all = All Attributes
+attributes_assign_dialog = Assign Attributes
+attributes_attribute = Attributes
+attributes_close = Close
+attributes_deselect_all = Nothing
+attributes_dialog_title = Attribute Manager
+attributes_edit = Edit
+attributes_edit_tooltip = Edit Set
+attributes_for_selected = Selected Nodes
+attributes_for_visible = All Visible Nodes
+attributes_import = &Import
+attributes_import_tooltip = Import attributes from the other loaded maps
+attributes_no_import_candidates_found = No new attributes found
+attributes_popup_delete = Delete
+attributes_popup_down = Down
+attributes_popup_edit = Edit
+attributes_popup_hide = Hide
+attributes_popup_new = New Attribute
+attributes_popup_optimal_width = Optimal Width
+attributes_popup_up = Up
+attributes_refresh = Refresh
+attributes_restricted_attributes_tooltip = Restrict Set of Attributes
+attributes_restricted_values_tooltip = Restrict Set of Values for Current Attribute
+attributes_restriction = Restricted Set
+attributes_select_all = All
+attributes_select_all_tooltip = Select / Deselect all
+attributes_show = Show
+attributes_skip_root = Skip Root Node
+attributes_visible = Selected Visible
+attributes_visible_tooltip = Selected Visible
+automatically_save_message = Map was automatically saved (using the file name {0}) ...
+AutomaticLayoutAction.text = &Automatic Layout
+AutomaticLayoutAction.tooltip = <html>Fixes the layout of the map. <br>The first level is black, the second blue, etc.</html>
+BackAction.text = Back
+BackAction.tooltip = Jumps back in the select chain
+background = Background
+bitmaps = bitmaps
+BlinkingNodeHookAction.text = Blinking Node
+BlinkingNodeHookAction.tooltip = <html>This makes the node blinking. But be careful. Do not associate it to many nodes, and <strong> not with other automatic formattings to the same node</strong></html>
+BoldAction.text = Bold
+boldify_branch = Boldify
+branch = Branch
+can_not_connect_to_info_server = Can not connect to information server
+can_not_save_key_set = Can not save hot key set
+cancel = &Cancel
+CancelAction.text = &Cancel
+cannot_add_parent_diff_parents = All nodes must have the same parent to use this function.
+cannot_add_parent_to_root = The root node can't be added to a new parent.
+cannot_delete_root = The root node can't be deleted or cut.
+cannot_join_nodes_with_children = Cannot join nodes with children
+cannot_move_to_child = Can't move a node to one of its children.
+CenterAction.text = Center
+CenterSelectedNodeAction.text = Center selected node
+change_link_arrows = change_link_arrows
+ChangeConnectorArrowsAction.backward.text = Back
+ChangeConnectorArrowsAction.both.text = Both
+ChangeConnectorArrowsAction.forward.text = Forward
+ChangeConnectorArrowsAction.none.text = None
+ChangeConnectorArrowsAction.text = Change Arrows of Connector
+ChangeNodeLevelLeftsAction.text = Node left
+ChangeNodeLevelLeftsAction.tooltip = On the left of root the node(s) is/are shifted downwards. It/they become children of its above sibling. On the right of root the node(s) are shifted upwards. Directly at root, the node(s) change sides.
+ChangeNodeLevelRightsAction.text = Node right
+ChangeNodeLevelRightsAction.tooltip = On the right of root the node(s) is/are shifted downwards. It/they become children of its above sibling. On the left of root the node(s) are shifted upwards. Directly at root, the node(s) change sides.
+choose_background_color = Choose Background Color:
+choose_cloud_color = Choose Cloud Color:
+choose_edge_color = Choose Edge Color
+choose_map_background_color = Choose Map Background Color
+choose_node_background_color = Choose Node Background Color:
+choose_node_color = Choose Node Color:
+CloseAction.text = &Close
+CloudAction.text = Cloud
+CloudColorAction.text = Cloud Color...
+ColorProperty.ResetColor = Reset Color
+combined = Combined
+confirmation = Confirmation
+connector = Connector
+connector_label = Connector Label
+ConnectorColorAction.text = Connector Color...
+CopyAction.text = Copy
+CopyIDAction.text = Copy Node ID
+CopySingleAction.text = Copy Single
+corrupt_map = Map content is corrupted
+CreateConjunctConditionAction.text = And
+CreateDisjunctConditionAction.text = Or
+CreateNotSatisfiedConditionAction.text = Not
+CreationModificationPluginAction.text = Show &Modification Times
+CreationModificationPluginAction.tooltip = <html>This function keeps track of node creation and modification times.</html>
+CutAction.text = Cut
+decrease_branch_font_size = Smaller Font
+DecreaseNodeFontAction.text = Smaller Font
+delete = &Delete
+delete_child = Delete Node
+DeleteAction.text = Remove Node
+DeleteConditionAction.text = Delete
+DirectHtmlFlavorHandler = HTML as single node
+DocumentationAction.text = Documentation
+doubled_patterns_ignored = Patterns with the same names not added to menu:
+download = Download
+edge = Edge
+edge_style = Edge Style
+edge_width = Edge Width
+EdgeColorAction.text = Edge Color...
+EdgeLikeLinkAction.text = Simulate edge
+EdgeStyleAction.bezier.text = Bezier
+EdgeStyleAction.hide_edge.text = Hide Edge
+EdgeStyleAction.horizontal.text = Horizontal
+EdgeStyleAction.linear.text = Linear
+EdgeStyleAction.sharp_bezier.text = Sharp Bezier
+EdgeStyleAction.sharp_linear.text = Sharp Linear
+EdgeStyleAsParentAction.text = As Parent
+EdgeWidthAction_width_parent.text = Parent
+EdgeWidthAction_width_thin.text = Thin
+edit = &Edit
+edit.decision = HTML Editor
+edit.edit_rich_text = Do you want to use formattings like bold or italics?
+edit_link_manually = Edit Hyperlink Manually...
+edit_long_node = Edit Long Node
+edit_middle_label = Edit Middle Label
+edit_source_label = Edit Source Label
+edit_target_label = Edit Target Label
+EditAction.text = Edit Node
+EditAttributesAction.text = Edit Attributes
+EditFilterAction.text = Edit
+EditLongAction.text = Edit Long Node...
+EncryptedMap.text = Create Encrypted Map ...
+EncryptedMap.tooltip = Create a new encrypted map
+enter_base_url = I am going to paste relative links. Enter please base URL.
+enter_confirms = &Enter Confirms
+enter_keyset_name = Enter hot key set name
+EnterPassword.text = &Toggle Encrypted / Decrypted
+error = Error
+error_applying_template = Error applying XSL template.
+error_creating_directory = Cannot create directory for export.
+ExecuteScriptError.text = Error executing the script.\nCheck the log file for details.
+ExecuteScriptForAllNodes.text = Execute all scripts
+ExecuteScriptForSelectionAction.text = Execute selected node scripts
+ExecuteScriptOnSelectedNode.text = Execute {0} on all selected nodes
+ExecuteScriptOnSelectedNodeRecursively.text = Execute {0} on selected nodes, recursively
+ExecuteScriptOnSingleNode.text = Execute {0} on one selected node
+userScripts = Scripts
+export_failed = Export failed
+export_pdf_text = Portable Document Format (PDF)
+export_svg_text = Scalable Vector Graphic (SVG)
+export_using_xslt = Freeplane Export using XSLT
+ExportBranchAction.text = Branch as new Map ...
+ExportBranchToHTMLAction.text = Branch as HTML
+ExportPdf.text = As PDF...
+ExportPdf.tooltip = Export to PDF
+ExportSvg.text = As SVG...
+ExportSvg.tooltip = Export to SVG
+ExportToHTMLAction.text = As HTML
+ExportToImage.jpg.text = As JPEG...
+ExportToImage.jpg.tooltip = Exports the map in the current folding to a JPEG image.
+ExportToImage.png.text = As PNG...
+ExportToImage.png.tooltip = Exports the map in the current folding to a PNG image.
+ExportToOoWriter.text = As Open Office Writer Document...
+ExportToOoWriter.tooltip = Unfolded nodes form the structure, folded nodes the content of the document.
+
+extension_menu = Physical &Style
+extract_link_from_text.tooltip = Set hyper link found in node text
+ExtractLinkFromTextAction.text = Hyper link from text
+f_button_unassigned = <no action>
+FaqOpenURLAction.text = FAQ
+file = &File
+file_already_exists = The file {0} already exists. Do you want to overwrite it?
+file_not_found = File $1 not found
+FileListFlavorHandler = Links to files
+filter = Filter
+filter_add = &Add
+filter_and = A&nd
+filter_conditions = Filters
+filter_contains = Contains
+filter_created_after = Created after
+filter_created_before = Created before
+filter_delete = &Delete
+filter_dialog = Filter Composer
+filter_does_not_exist = Not Exist
+filter_edit_description = Edit Filter List
+filter_enter_value = Enter Value
+filter_exist = Exists
+filter_icon = Icon
+filter_ignore_case = Ignore Case
+filter_is_equal_to = Is equal to
+filter_is_not_equal_to = Is not equal to
+filter_link = Hyperlink
+filter_modified_after = Modified after
+filter_modified_before = Modified before
+filter_no_filtering = No Filtering
+filter_node = Node Text
+filter_not = &Not
+filter_note = Note
+filter_or = O&r
+filter_priority = Priority
+filter_regexp_matches = Matches regexp
+filter_select = &Select
+filter_selected_node_view = Currently Selected Nodes
+filter_selected_node_view_snapshot = Saved selection
+filter_time = Date filter
+filters_not_loaded = Filter could not be loaded, file corrupted
+find_what = Find what
+FindAction.text = Find...
+FindNextAction.text = Find Next
+fit_map_to_page = Fit to One Page
+fit_map_to_page_height = Fit height to one page
+fit_map_to_page_width = Fit width to one page
+FitToPage.text = Zoom to &Fit to Page
+FitToPage.tooltip = Adjusts the zoom such that the entire map fits into the current window.
+fold = Fold
+FoldAllAction.text = Fold All
+FoldAllAction.tooltip = <html>Folds the selected nodes and all their children.</html>
+FoldOneLevelAction.text = Fold One Level
+FoldOneLevelAction.tooltip = <html>Folds the selected nodes by one level.</html>
+follow_graphical_link = Go to ''{0}''
+FollowLinkAction.text = Follow Link
+font = Font
+FontFamilyAction.text = font family
+FontSizeAction.text = font size
+format_menu_edge_styles = &Edge Styles
+format_menu_edge_widths = Edge &Widths
+FormatCopy.text = Copy Format
+FormatCopy.tooltip = <html>Copies the format of a node.</html>
+FormatPaste.text = Paste Format
+FormatPaste.tooltip = <html>Pastes the format of a node.</html>
+ForwardAction.text = Forward
+ForwardAction.tooltip = Jumps forward in the select chain
+Freeplane.progress.buildScreen = Build Screen...
+Freeplane.progress.createController = Create Controller...
+Freeplane.progress.createInitialMode = Create Initial Mode...
+Freeplane.progress.endStartup = Finish Startup.
+Freeplane.progress.gettingPreferenceDirectories = Getting Preference Directories...
+Freeplane.progress.gettingPreferences = Getting Preferences...
+Freeplane.progress.loadMaps = Load Maps...
+Freeplane.progress.propagateLookAndFeel = Propagete Look And Feel...
+Freeplane.progress.settingPreferences = Setting Preferences...
+Freeplane.progress.startCreateController = Start Create Controller...
+Freeplane.progress.updateLookAndFeel = Update Look And Feel...
+freeplane_reverted = Freeplane_Reverted_
+FreeplaneHelpStarter.text = Help...
+FreeplaneHelpStarter.tooltip = Freeplane Extended Help
+GotoLinkNodeAction.text = Goto Link
+GrabKeyDialog.common.cancel = Cancel
+GrabKeyDialog.common.ok = OK
+GrabKeyDialog.grab-key.assigned-to.none = Currently not assigned
+GrabKeyDialog.grab-key.assigned-to = Assigned to
+GrabKeyDialog.grab-key.caption =
+GrabKeyDialog.grab-key.clear = Clear
+GrabKeyDialog.grab-key.remove-ask = Are you sure to remove this keystroke?
+GrabKeyDialog.grab-key.remove = Remove
+GrabKeyDialog.grab-key.title = Enter new key
+help = &Help
+HideableAction.tooltip = <html>Marks the background of each changed node.</html>
+HideAllAttributesAction.text = Hide All Attributes
+HierarchicalIconsAction.text = Show icons &hierarchically
+HierarchicalIconsAction.tooltip = If one of the (grand)children of me has an icon, I will show this icon in little format, too.
+HotKeyInfoAction.text = Key Reference
+html_export_based_on_headings = HTML Export - Based on Headings
+html_export_fold_all = HTML Export - Fold All
+html_export_fold_currently_folded = HTML Export - Fold Currently Folded
+html_export_no_folding = HTML Export - No Folding
+icon_0% = 0%
+icon_100% = 100%
+icon_25% = 25%
+icon_50% = 50%
+icon_75% = 75%
+icon_attach = Look here
+icon_back = Back
+icon_bee = Freeplane
+icon_bell = Remember
+icon_bookmark = Excellent
+icon_broken-line = Broken
+icon_button_cancel = Not OK
+icon_button_ok = OK
+icon_calendar = Date
+icon_clanbomber = Dangerous
+icon_clock = Time
+icon_clock2 = Reminder
+icon_closed = No Entry
+icon_decrypted = Unlocked
+icon_desktop_new = Do not forget
+icon_down = Down
+icon_edit = Refine
+icon_encrypted = Locked
+icon_family = Family
+icon_fema = Male & Female
+icon_female1 = Female1
+icon_female2 = Female2
+icon_females = Females
+icon_flag = Red Flag
+icon_flag-black = Black Flag
+icon_flag-blue = Blue Flag
+icon_flag-green = Green Flag
+icon_flag-orange = Orange Flag
+icon_flag-pink = Pink Flag
+icon_flag-yellow = Yellow Flag
+icon_folder = Folder
+icon_forward = Forward
+icon_freemind_butterfly = FreeMind
+icon_full-0 = Priority 0
+icon_full-1 = Priority 1
+icon_full-2 = Priority 2
+icon_full-3 = Priority 3
+icon_full-4 = Priority 4
+icon_full-5 = Priority 5
+icon_full-6 = Priority 6
+icon_full-7 = Priority 7
+icon_full-8 = Priority 8
+icon_full-9 = Priority 9
+icon_go = Green Traffic Light
+icon_gohome = Home
+icon_group = Group
+icon_help = Question
+icon_hourglass = Waiting
+icon_idea = Idea
+icon_info = Info
+icon_kaddressbook = Phone
+icon_kmail = E-Mail
+icon_knotify = Music
+icon_korn = Mailbox
+icon_ksmiletris = I am happy
+icon_launch = Launch
+icon_licq = Nice
+icon_list = List
+icon_Mail = Mail
+icon_male1 = Male1
+icon_male2 = Male2
+icon_males = Males
+icon_menu = I&cons
+icon_messagebox_warning = Important
+icon_password = Key
+icon_pencil = To be refined
+icon_penguin = Linux
+icon_prepare = Yellow Traffic Light
+icon_smiley-angry = Angry
+icon_smiley-neutral = No Mind
+icon_smiley-oh = Surprising
+icon_smily_bad = I'm not amused
+icon_stop = Red Traffic Light
+icon_stop-sign = Stop
+icon_up = Up
+icon_user_icon = User icons
+icon_wizard = Magic
+icon_xmag = To be discussed
+icon_yes = Important
+IconGroupPopupAction.arrows.text = Arrows
+IconGroupPopupAction.docs_folders.text = Docs & Folders
+IconGroupPopupAction.flags.text = Flags
+IconGroupPopupAction.miscallaneous.text = Miscellaneous
+IconGroupPopupAction.nature.text = Nature
+IconGroupPopupAction.numbers.text = Numbers
+IconGroupPopupAction.office.text = Office
+IconGroupPopupAction.people.text = People
+IconGroupPopupAction.signs.text = Signs
+IconGroupPopupAction.smiley.text = Smiley
+IconGroupPopupAction.time.text = Time
+IconGroupPopupAction.user.text = User icons
+IconSelectionPlugin.text = Select Icon...
+IconSelectionPlugin.tooltip = <html>Here you can select an icon using a subwindow.</html>
+import = Import
+import_linked_branch_no_link = The selected node has no link to import from.
+ImportAction.text = &Import
+ImportBranchAction.text = Branch...
+ImportExplorerFavoritesAction.text = Explorer Favorites...
+ImportFolderStructureAction.text = Folder Structure...
+ImportLinkedBranchAction.text = Linked Branch
+ImportLinkedBranchWithoutRootAction.text = (Linked Branch) Without Root...
+ImportMindmanagerFiles.text = MindManager X5 Map...
+increase_branch_font_size = Larger Font
+IncreaseNodeFontAction.text = Larger Font
+ItalicAction.text = Italic
+italicise_branch = Italicise
+java_version = Java version: {0}
+JoinNodesAction.text = Join Nodes
+
+LatexNodeHookAction.text = &Latex
+LatexNodeHookAction.tooltip = <html>Latex formula</html>
+less_than_two_selected_nodes = You have to select at least two nodes to get links.
+license = License
+license_text = Freeplane - A Program for creating and viewing Mindmaps\nCopyright (C) 2000-2010 Joerg Mueller <joergmueller at bigfoot.com>\nSee COPYING for Details\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License\nas published by the Free Software Foundation; either version 2\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY [...]
+LicenseAction.text = License
+link_not_available_any_more = The link is not valid anymore. The node was deleted in between.
+load = &Load
+LoadAcceleratorPresetsAction.textPatterns.text = Text Patterns
+long_node_changed_cancel = You have changed the node. Do you want to discard changes?
+long_node_changed_submit = You have changed the node. Do you want to save changes?
+lots_of_links_warning = You are going to create a lot of links to the same node. Do you really want to create these links?
+main_resource_directory = Installation resources: {0}
+map_already_exists = The map already exists. Do you want to overwrite it?
+map_corrupted = Map corrupted. View detail?
+map_not_saved = The map was not saved before.
+MapBackgroundColorAction.text = Map Background
+MaxNodeWidthAction.text = Set maximum node width
+menu_attributes = &Attributes
+menu_extras = &Tools
+ExportAction.text = &Export
+menu_file_import = I&mport
+menu_filter = F&ilter
+menu_format = F&ormat
+menu_insert = In&sert
+menu_navigate = &Navigate
+menu_view = &View
+mindmap = Map
+MindMapNodesFlavorHandler = Node hierarchy
+mindmaps = &Maps
+mindmaps_desc = Maps (*.mm)
+mindmaps_filter_desc = Filters (*.mmfilter)
+mode_Browse = Browse Mode
+mode_File = File Mode
+mode_MindMap = MindMap Mode
+mode_na = Mode not available
+mode_status = Mode changed to {0}
+mode_title = Freeplane - {0}
+modes = Modes
+ModesMenuAction.Browse.text = Map Browser
+ModesMenuAction.File.text = File Explorer
+ModesMenuAction.MindMap.text = Mind Map Editor
+most_recent_files = &Most Recent Files
+MoveToRootAction.text = Move to Root
+NavigationNextMapAction.text = Next Map
+NavigationPreviousMapAction.text = Previous Map
+new_mindmap = New Mindmap
+new_node = New Node
+new_node_as_sibling_not_possible_for_the_root = New node as sibling is not possible for the root
+NewChildAction.text = New Child Node
+NewMapAction.text = New
+NewParentNode.text = New Parent Node
+NewParentNode.tooltip = <html>All selected are sent to a new parent.</html>
+NewPreviousSiblingAction.text = New Previous Sibling Node
+NewSiblingAction.text = New Sibling Node
+NextNodeAction.BACK.text = Previous node
+NextNodeAction.BACK_N_FOLD.text = Previous node (fold)
+NextNodeAction.FORWARD.text = Next node
+NextNodeAction.FORWARD_N_FOLD.text = Next node (fold)
+no = No
+no_format_copy_before_format_paste = You can't paste a format until you've copied one.
+no_previous_find = No previous find.
+node = Node
+node_changed_discard_changes = You have changed the node. Do you want to discard changes?
+node_is_write_protected = Target node is write protected.
+node_location_help = Dragging changes node location, ctrl+dragging changes distances, double click and ctrl+double click reset them.
+NodeBackgroundColorAction.text = &Node Background Color...
+NodeColorAction.text = Node Color...
+NodeColorBlendAction.text = Blend Color
+NodeDownAction.text = Node Down
+NodeListAction.text = Find and Replace...
+NodeListAction.tooltip = Shows all nodes as a searchable list with filter properties.
+NodeShapeAction.bubble.text = &Bubble
+NodeShapeAction.fork.text = &Fork
+NodeUpAction.text = Node Up
+nonboldify_branch = Unboldify
+nonitalicise_branch = Unitalicise
+normal = Normal
+not_saved_for_image_error = The map must be saved before you can set an image by file chooser
+not_saved_for_link_error = The map must be saved before you can set a link by file chooser
+note_window_location = Note Position
+ok = &OK
+OKAction.text = &OK
+OpenAction.text = Open...
+OpenFreeplaneSiteAction.text = Freeplane's Homepage
+OpenPathAction.text = Open File
+option_changes_may_require_restart = To see the effect of the changed settings, you probably have to restart Freeplane.
+OptionalDontShowMeAgainDialog.cancel = &No
+OptionalDontShowMeAgainDialog.dontShowAgain = &Don't ask me again.
+OptionalDontShowMeAgainDialog.ok = &Yes
+OptionalDontShowMeAgainDialog.rememberMyDescision = &Remember my decision.
+OptionPanel.absolute = Absolute
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Automatic layout patterns
+OptionPanel.always_fold_all_after_load = Fold all
+OptionPanel.always_save_folding = always
+OptionPanel.always_save_folding_state.tooltip = If checked, each folding action makes the map dirty and reminds you to save it.
+OptionPanel.always_save_folding_state = Always save folding state changes
+OptionPanel.always_unfold_all_after_load = Unfold all
+OptionPanel.antialias.tooltip = <html>Determines the quality of the map. More antialias needs more time.</html>
+OptionPanel.antialias = Antialias
+OptionPanel.antialias_all = Antialias All
+OptionPanel.antialias_edges = Antialias Edges
+OptionPanel.antialias_none = No Antialias
+OptionPanel.Appearance = Appearance
+OptionPanel.ar = Arabic / \u0627\u0644\u0639\u0631\u0628\u064a\u0629
+OptionPanel.as_parent = As parent
+OptionPanel.ask = Ask
+OptionPanel.automatic = Automatic
+OptionPanel.automaticFormat_level1 = Root Node Format
+OptionPanel.automaticFormat_level2 = 1. Level Node Format
+OptionPanel.automaticFormat_level = Automatic Layout Styles
+OptionPanel.backup_file_number = Number of kept backup files
+OptionPanel.Behaviour = Behaviour
+OptionPanel.bezier = bezier
+OptionPanel.bubble = Bubble
+OptionPanel.ca = Catalan, Valencian / Catal\u00e0
+OptionPanel.Cancel = Cancel
+OptionPanel.center_selected_node = Center selected nodes
+OptionPanel.check_updates_automatically = Check for updates on program start
+OptionPanel.childpattern.tooltip = The selected pattern is applied to all children.
+OptionPanel.childpattern = Child Pattern
+OptionPanel.clear_all_setters.tooltip = Enables or disables all change indications.
+OptionPanel.clear_all_setters = Switch all
+OptionPanel.cloud = Cloud
+OptionPanel.cloudcolor = Cloud and Color
+OptionPanel.combined = Combined
+OptionPanel.convert_to_current_version.tooltip = <html>Only for very big maps that don't need to be converted <br>(this is expert knowledge) you can open the maps without conversion.</html>
+OptionPanel.convert_to_current_version = <html>Automatically convert maps of older Freeplane versions <br>to the current version?</html>
+OptionPanel.cs = Czech / \u010desky
+OptionPanel.cut_nodes_without_question.tooltip = If this check box is set the nodes are cut without confirmation. This can cause loss of information if pressed without intention.
+OptionPanel.cut_nodes_without_question = Cut nodes without confirmation?
+OptionPanel.da = Danish / dansk
+OptionPanel.de = German / Deutsch
+OptionPanel.default = Default
+OptionPanel.default_browser_command_mac.tooltip = <html> and MAC: (thanks to Nick!)</html>
+OptionPanel.default_browser_command_mac = Default Browser Command Mac
+OptionPanel.default_browser_command_other_os.tooltip = <html> This is typically Linux:</html>
+OptionPanel.default_browser_command_other_os = Default Browser Command Other Os
+OptionPanel.default_browser_command_windows_9x.tooltip = <html>For Windows (the "" signs are necessary due to links, that have "=" in their URL).</html>
+OptionPanel.default_browser_command_windows_9x = Default Browser Command Windows 9x
+OptionPanel.default_browser_command_windows_nt.tooltip = <html>For Windows (the "" signs are necessary due to links, that have "=" in their URL).</html>
+OptionPanel.default_browser_command_windows_nt = Default Browser Command Windows Nt
+OptionPanel.default_charset = Charset
+OptionPanel.defaultfont.tooltip = <html>The default node font. This will only work if the font (TrueType Font) is available on the system </html>
+OptionPanel.defaultfont = Default Font
+OptionPanel.defaultfontsize = Default Font Size
+OptionPanel.defaultfontstyle = Default Font Style
+OptionPanel.Defaults = Defaults
+OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> If the files should be deleted automatically on a normal shutdown of Freeplane set the following variable to true</html>
+OptionPanel.delete_automatic_saves_at_exit = Delete Automatic Saves At Exit
+OptionPanel.delete_nodes_without_question.tooltip = If this check box is set the nodes are deleted without confirmation. This can cause loss of information if pressed without intention.
+OptionPanel.delete_nodes_without_question = Delete nodes without confirmation?
+OptionPanel.disable_cursor_move_paper.tooltip = <html>Don't display 'move' cursor during paper dragging</html>
+OptionPanel.disable_cursor_move_paper = Disable Cursor Move Paper
+
+
+OptionPanel.display_node_id = Display node ID
+
+OptionPanel.draganddrop.tooltip = <html>If dnd is enabled. </html>
+OptionPanel.draganddrop = Drag And Drop
+OptionPanel.edgecolor.tooltip = Property of the edge to the parent node (is also applied to all child nodes)
+OptionPanel.edgecolor = Edge color
+OptionPanel.edgestyle.tooltip = Property of the edge to the parent node (is also applied to all child nodes)
+OptionPanel.edgestyle = Edge style
+OptionPanel.edgewidth.tooltip = Property of the edge to the parent node (is also applied to all child nodes)
+OptionPanel.edgewidth = Edge width
+OptionPanel.EdgeWidth_1 = 1
+OptionPanel.EdgeWidth_2 = 2
+OptionPanel.EdgeWidth_4 = 4
+OptionPanel.EdgeWidth_8 = 8
+OptionPanel.EdgeWidth_parent = As parent
+OptionPanel.EdgeWidth_thin = thin
+OptionPanel.editor_extra_width = extra width step
+OptionPanel.el = Greek / \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
+OptionPanel.el__buttons_above = Buttons at the top
+OptionPanel.el__enter_confirms_by_default = Enter Confirms By Default
+OptionPanel.el__max_default_window_height = Max Default Window Height
+OptionPanel.el__max_default_window_width = Max Default Window Width
+OptionPanel.el__min_default_window_height = Min Default Window Height
+OptionPanel.el__min_default_window_width = Min Default Window Width
+OptionPanel.el__position_window_below_node = Position Window Below Node
+OptionPanel.en = English / English
+
+
+OptionPanel.Environment = Environment
+OptionPanel.es = Spanish, Castilian / espa\u00f1ol, castellano
+OptionPanel.et = Estonian / eesti, eesti keel
+OptionPanel.execute_scripts_without_asking.tooltip = <html>Freeplane scripts are principally able to perform any action on your computer. <br>Thus, you shouldn't execute scripts you don't know to be safe.</html>
+OptionPanel.execute_scripts_without_asking = Scripts should be carried out without confirmation?
+OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html><body>If your Groovy Scripts need to execute special other applications (like a browser) without asking(!),<br>you have to enable this option. <br>But use it with care, as now malicious scripts can hurt your computer!</body></html>
+OptionPanel.execute_scripts_without_exec_restriction = Permit to Execute other Applications (NOT recommended)
+OptionPanel.execute_scripts_without_file_restriction.tooltip = <html><body>If your Groovy Scripts need to execute special file actions (open, close, read, write, delete(!)),<br>you have to enable this option. <br>But use it with care, as now malicious scripts can hurt your computer!</body></html>
+OptionPanel.execute_scripts_without_file_restriction = Permit File Operations (NOT recommended)
+OptionPanel.execute_scripts_without_network_restriction.tooltip = <html><body>If your Groovy Scripts need to execute special network actions,<br>you have to enable this option. <br>But use it with care, as now malicious scripts can disclosure your secrets!</body></html>
+OptionPanel.execute_scripts_without_network_restriction = Permit Network Operations (NOT recommended)
+OptionPanel.experimental_file_locking_on.tooltip = <html> Experimental feature</html>
+OptionPanel.experimental_file_locking_on = Experimental File Locking
+OptionPanel.export_icons_in_html.tooltip = <html> Tell if HTML exported from Freeplane should contain icons. The trouble with icons is that quite often the links to icons will not be found in the exported HTML.</html>
+OptionPanel.export_icons_in_html = Export Icons In Html
+OptionPanel.Files = Files
+OptionPanel.first = First
+OptionPanel.foldingsymbolwidth.tooltip = <html>Width of the folding marking circle</html>
+OptionPanel.foldingsymbolwidth = Folding Symbol Width
+OptionPanel.fork = Fork
+OptionPanel.fr = French / Fran\u00e7ais
+OptionPanel.gl = Galician / Galego
+OptionPanel.goto_note_end_on_edit = Move note cursor to the end
+OptionPanel.gtk = Gtk
+OptionPanel.hide_edge = hide edge
+OptionPanel.horizontal = horizontal
+OptionPanel.hr = Croatian / hrvatski
+OptionPanel.HTML = HTML
+OptionPanel.html_export_based_on_headings = Based On Headings
+OptionPanel.html_export_fold_all = Fold All
+OptionPanel.html_export_fold_currently_folded = Fold Currently Folded
+OptionPanel.html_export_folding = Html Export Folding
+OptionPanel.html_export_no_folding = No Folding
+OptionPanel.hu = Hungarian / Magyar
+OptionPanel.icon.tooltip = If applied, the node will have exactly this icon.
+OptionPanel.icon = Icon
+OptionPanel.icons.list.tooltip = Here, you can order or disable the standard icons. The icons have to be separated by ';'.
+OptionPanel.icons.list = List of Displayed Standard Icons
+OptionPanel.id = Indonesian / Bahasa Indonesia
+OptionPanel.il__enter_confirms_by_default = Enter Confirms By Default
+OptionPanel.it = Italian / Italiano
+OptionPanel.ja = Japanese / \u65e5\u672c\u8a9e
+
+
+OptionPanel.Keystrokes = Keystrokes
+OptionPanel.ko = Korean / \ud55c\uad6d\uc5b4 (\u97d3\u570b\u8a9e), \uc870\uc120\ub9d0 (\u671d\u9bae\u8a9e)
+OptionPanel.label_font_family = Font Family
+OptionPanel.label_font_size = Font Size
+OptionPanel.language.tooltip = <html>This is the language that should be used in the program. 'automatic' tries to load the current user's language. </html>
+OptionPanel.language = Language
+OptionPanel.last = Last
+OptionPanel.last_opened_list_length = Last Opened List Length
+OptionPanel.level1 = Format of the Root Node
+OptionPanel.level2 = 1. Level Node Format
+OptionPanel.level3 = 2. Level Node Format
+OptionPanel.level4 = 3. Level Node Format
+OptionPanel.level5 = Other's Node Format
+OptionPanel.level = Level
+OptionPanel.linear = linear
+OptionPanel.links.tooltip = <html>Set Links either relative or absolute </html>
+OptionPanel.links = Links
+OptionPanel.load_folding = On Load
+OptionPanel.load_folding_from_map_default_fold_all = Load from map or fold all
+OptionPanel.load_folding_from_map_default_unfold_all = Load from map or unfold all
+OptionPanel.load_folding_start_level = Fold nodes from level
+OptionPanel.load_last_map.tooltip = <html>When Freeplane starts, it fetches the last opened map automatically if checked.</html>
+OptionPanel.load_last_map = Automatically open last map
+OptionPanel.load_last_maps = Load all last maps
+OptionPanel.lookandfeel.tooltip = <html>The Look&Feel to use. 'metal','windows','motif', 'gtk' are supported, 'mac' is available only on MacOS. Default means, that the default look and feel is used. If you want to put your own L&F, please, enter the class name here and assure that the corresponding jar file(s) are loaded. If there are problems with the look and feel, then choose 'nothing' here. It works for applets.</html>
+OptionPanel.lookandfeel = Look and Feel
+OptionPanel.lt = Lithuanian / kalba
+OptionPanel.mapxsize.tooltip = <html>The initial size of every map </html>
+OptionPanel.mapxsize = Map-X-size
+OptionPanel.mapysize = Map-Y-size
+OptionPanel.max_node_width.tooltip = <html>The default maximal node width in pixels</html>
+OptionPanel.max_node_width = Max Node Width
+OptionPanel.metal = Metal
+OptionPanel.motif = Motif
+OptionPanel.nb = Norwegian Bokm\u00e5l / Norsk bokm\u00e5l
+OptionPanel.never_save_folding = never
+OptionPanel.nl = Dutch, Flemish / Nederlands, Vlaams
+OptionPanel.nn = Norwegian Nynorsk / Norsk nynorsk
+OptionPanel.nodebackgroundcolor.tooltip = The node's background when not selected.
+OptionPanel.nodebackgroundcolor = Node background color
+OptionPanel.nodecolor.tooltip = The node's foreground color when not selected.
+OptionPanel.nodecolor = Node color
+OptionPanel.nodefontbold = Bold font
+OptionPanel.nodefontitalic = Italic font
+OptionPanel.nodefontname = Node's font name
+OptionPanel.nodefontsize = Node's font size
+OptionPanel.nodeshape.tooltip = <html>The style describes the outer form of a node. <br>Possible values:<br><table border="1"><tr><td>fork: </td><td> without surrounding box,</td></tr><tr><td>bubble: </td><td> node with a surrounding rectangle,</td></tr><tr><td>As parent: </td><td> take the style from the parent node <br>or the default root node style for the root node,</td></tr><tr><td>Combined: </td><td> Bubble when node is folded, fork otherwise.</td></tr></table></html>
+OptionPanel.nodeshape = Node style
+OptionPanel.nodetext.tooltip = Here, you can define the node's text. The former text is discarded when such a pattern is applied.
+OptionPanel.nodetext = Node text
+OptionPanel.nothing = Nothing
+OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> number n of different files to store the maps into. The first automatic save is done in the first file, and so on up to the n+1-save which is again stored in the first file (cyclic)</html>
+OptionPanel.number_of_different_files_for_automatic_save = Number Of Different Files For Automatic Save
+OptionPanel.OK = Save
+OptionPanel.org.freeplane.plugin.bugreport.allowed = Always send
+OptionPanel.org.freeplane.plugin.bugreport.ask = Show report dialog
+OptionPanel.org.freeplane.plugin.bugreport.denied = Never send
+OptionPanel.org.freeplane.plugin.bugreport = Policy
+OptionPanel.outline_hgap = horizontal distance
+OptionPanel.outline_vgap = vertical distance
+OptionPanel.paint_connectors_behind = Nodes hide connectors
+OptionPanel.patternname.tooltip = Unique pattern name
+OptionPanel.patternname = Name
+
+OptionPanel.pl = Polish / polski
+OptionPanel.placenewbranches.tooltip = <html>Where to place new branches. Valid values are 'first' and 'last' </html>
+OptionPanel.placenewbranches = Place New Branches
+OptionPanel.plugins/scripting/tab_name = Scripting
+OptionPanel.printonwhitebackground.tooltip = <html>Always use white background for printing</html>
+OptionPanel.printonwhitebackground = <html>White background for printing</html>
+OptionPanel.pt_BR = Portuguese (Brasil) / Portugu\u00eas (Brasil)
+OptionPanel.pt_PT = Portuguese (Portugal) / Portugu\u00eas (Portugal)
+OptionPanel.relative = Relative
+OptionPanel.remind_type_of_new_nodes.tooltip = <html>"Ask" will ask you (use in doubt).<br>"Yes" displays the rich text editor.<br>"No" displays the plain text editor.</html>
+OptionPanel.remind_use_rich_text_in_new_long_nodes = Use formatting for all nodes
+OptionPanel.remove_notes_without_question.tooltip = If this check box is set the notes belonging to the selected nodes are removed without confirmation. This can cause loss of information if pressed without intention.
+OptionPanel.remove_notes_without_question = Remove Notes without Question?
+OptionPanel.resources_use_default_font_for_notes_too = Use default font for notes too
+OptionPanel.resources_use_margin_top_zero_for_notes = Remove top margin for notes
+OptionPanel.revision_color.tooltip = Background color for the changed nodes.
+OptionPanel.revision_color = Revision Color
+OptionPanel.ru = Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a
+OptionPanel.save_folding = Save folding
+OptionPanel.save_folding_if_map_is_changed = if map is changed
+OptionPanel.save_modification_times = Save modification times
+OptionPanel.save_only_intrisically_needed_ids.tooltip = When checked, node IDs are omitted that are not used inside the map. Observe, that you can't link external map to specific nodes inside the map without node ID.
+OptionPanel.save_only_intrisically_needed_ids = Save used Node IDs only
+OptionPanel.script.tooltip = The script as groovy source code.
+OptionPanel.script = Script
+OptionPanel.script_directories = Script search path (separate entries by ;;)
+OptionPanel.script_user_key_name_for_signing.tooltip = <html>If you want to sign your scripts, enter the alias of the key here. <br>The key is expected to reside in the default keystore. <br>The password of the key's secret key must coincide with the keystore password (this is the default).</html>
+OptionPanel.script_user_key_name_for_signing = Optional User Key Alias for Signing
+OptionPanel.scrollbar_increment = Speed
+OptionPanel.selection_method.tooltip = <html> with the following switch you can enable/disable the delayed selection scheme. Auto options. Do not modify these as they will be saved to auto.properties anyway.</html>
+OptionPanel.selection_method = Selection Method
+OptionPanel.selection_method_by_click = By Click
+OptionPanel.selection_method_delayed = Delayed
+OptionPanel.selection_method_direct = Direct
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Patterns
+OptionPanel.separator.anti_alias = Antialias
+OptionPanel.separator.attributes = Attributes
+OptionPanel.separator.automatic_save = Automatic Save
+OptionPanel.separator.behaviour = Behaviour
+OptionPanel.separator.browser = Browser
+OptionPanel.separator.CloudControls = Clouds
+OptionPanel.separator.commands_for_the_program = Commands for the program
+OptionPanel.separator.connectors = Connectors
+OptionPanel.separator.default_colors = Default Colors
+OptionPanel.separator.default_fonts = Default Fonts
+OptionPanel.separator.default_styles = Default Styles
+OptionPanel.separator.EdgeControls = Edges
+OptionPanel.separator.edit_long_node_window = Edit Long Node Window
+OptionPanel.separator.editing = Editor settings
+OptionPanel.separator.files = Files
+OptionPanel.separator.General = General
+OptionPanel.separator.html_export = Html Export
+OptionPanel.separator.html_import = Html Import
+OptionPanel.separator.hyperlink_types = Hyperlink Types
+OptionPanel.separator.icon_properties = Icons
+OptionPanel.separator.icons = Icons in "Select Icon..."
+OptionPanel.separator.initial_map_size = Initial Map Size
+OptionPanel.separator.inline_editor = In-line node editor
+OptionPanel.separator.key_typing = Key Typing
+OptionPanel.separator.language = Language
+OptionPanel.separator.load = Load
+OptionPanel.separator.look_and_feel = Look and Feel
+OptionPanel.separator.mouse_wheel = Mouse Wheel
+OptionPanel.separator.new_node_commands = New node commands
+OptionPanel.separator.node_editing_commands = Node editing commands
+OptionPanel.separator.node_navigation_commands = Node navigation commands
+OptionPanel.separator.NodeColors = Node colors
+OptionPanel.separator.NodeFont = Node Font
+OptionPanel.separator.NodeStyles = Node styles
+OptionPanel.separator.notifications = Confirmations
+OptionPanel.separator.org.freeplane.plugin.bugreport = Automatic bug report
+OptionPanel.separator.other_defaults = Other Defaults
+OptionPanel.separator.others = Other key bindings
+OptionPanel.separator.outline_view = Outline view
+OptionPanel.separator.patterns = Patterns
+OptionPanel.separator.plugins/scripting/separatorPropertyName = Permissions
+OptionPanel.separator.root_node_appearance = Root node appearance
+OptionPanel.separator.save = Save
+OptionPanel.separator.ScriptingControl = Scripting
+OptionPanel.separator.scrollbar = Scrollbar
+OptionPanel.separator.selection_colors = Selection Colors
+OptionPanel.separator.selection_method = Selection Method
+OptionPanel.separator.spelling = Spell checker options
+OptionPanel.separator.tooltip = Tooltip times
+OptionPanel.separator.undo = Undo
+OptionPanel.separator.updates = Program Updates
+OptionPanel.set_property_text.tooltip = Empty: Don't touch; Minus=Remove property (set default values); Plus=Change property
+OptionPanel.set_property_text = Change
+OptionPanel.setscript.tooltip = A script can be associated to the style.
+OptionPanel.setscript = Change?
+OptionPanel.sharp_bezier = sharp bezier
+OptionPanel.sharp_linear = sharp linear
+OptionPanel.show_icon_for_attributes = Show Icon For Attributes
+OptionPanel.show_node_tooltips = Display Tool Tips for Nodes
+OptionPanel.signed_script_are_trusted.tooltip = If scripts are signed by a trusted party (ie. from the Freeplane's authors or by yourself), it is executed without restrictions.
+OptionPanel.signed_script_are_trusted = Trust signed scripts (recommended).
+OptionPanel.sk = Slovak / sloven\u010dina
+OptionPanel.sl = Slovene / sloven\u0161\u010dina
+OptionPanel.spelling_opt_case_sensitive = Case sensitive
+OptionPanel.spelling_opt_ignore_all_caps_words = Ignore all upper case words.
+OptionPanel.spelling_opt_ignore_capitalization = Ignore capital letters at word begin
+OptionPanel.spelling_opt_ignore_words_with_numbers = Ignore words with numbers
+OptionPanel.spelling_opt_suggestions_limit_dialog = Maximum count of suggestions in the dialog
+OptionPanel.spelling_opt_suggestions_limit_menu = Maximum count of suggestions in the menu
+OptionPanel.standardbackgroundcolor.tooltip = <html>The standard background color in html notation </html>
+OptionPanel.standardbackgroundcolor = Standard Background Color
+OptionPanel.standardcloudcolor.tooltip = <html>The standard cloud color in html notation </html>
+OptionPanel.standardcloudcolor = Standard Cloud Color
+OptionPanel.standardcloudestyle.tooltip = <html>The standard cloud style. currently, only 'bezier' is supported</html>
+OptionPanel.standardcloudestyle = Standard Cloud Style
+OptionPanel.standarddrawrectangleforselection.tooltip = <html>Mark selected nodes by bubble around.</html>
+OptionPanel.standarddrawrectangleforselection = Display Selected Nodes in Bubbles
+OptionPanel.standardedgecolor.tooltip = <html>The standard edge color in html notation </html>
+OptionPanel.standardedgecolor = Standard Edge Color
+OptionPanel.standardedgestyle.tooltip = <html>The standard edge style. 'linear' and 'bezier' are supported </html>
+OptionPanel.standardedgestyle = Standard Edge Style
+OptionPanel.standardlinkcolor.tooltip = <html>The standard link color in html notation </html>
+OptionPanel.standardlinkcolor = Standard Link Color
+OptionPanel.standardlinkestyle.tooltip = <html>The standard link style. currently, only 'bezier' is supported</html>
+OptionPanel.standardlinkestyle = Standard Link Style
+OptionPanel.standardnodeshape.tooltip = <html>The default new node style. 'fork', 'bubble' 'as_parent' and 'combined' are supported </html>
+OptionPanel.standardnodeshape = Standard Node Style
+OptionPanel.standardnodetextcolor.tooltip = <html>The standard node color. In html notation (#RRGGBB in hex values) </html>
+OptionPanel.standardnodetextcolor = Standard Node Color
+OptionPanel.standardrootnodeshape.tooltip = <html>The root node style if no other is specified. 'fork' and 'bubble' and 'combined' are supported </html>
+OptionPanel.standardrootnodeshape = Standard Root Node Style
+OptionPanel.standardselectednodecolor.tooltip = <html>The standard node color if selected. In html notation (#RRGGBB in hex values) </html>
+OptionPanel.standardselectednodecolor = Standard Selected Node Color
+OptionPanel.standardselectednoderectanglecolor.tooltip = <html>The color of buble marking selected nodes. In html notation (#RRGGBB in hex values) </html>
+OptionPanel.standardselectednoderectanglecolor = Selected Node Bubble Color
+OptionPanel.structured_html_import = Import HTML as node structure
+OptionPanel.structured_icon_toolbar = Structured icon toolbar
+OptionPanel.sv = Swedish / svenska
+OptionPanel.text.use_ctrl_key = Use 'Assign short cut' from the Tools menu
+OptionPanel.time_for_automatic_save.tooltip = <html> time between two consecutive automatic saving actions (in msec): To disable automatic saving set this number to 2000000000.</html>
+OptionPanel.time_for_automatic_save = Time For Automatic Save
+OptionPanel.time_for_delayed_selection.tooltip = <html> Selection time delay of nodes when mouse is over (in msec). Change this value to 1 if you want direct selection on mouse over.</html>
+OptionPanel.time_for_delayed_selection = Time For Delayed Selection
+OptionPanel.toolTipManager.dismissDelay = Dismiss delay, ms
+OptionPanel.toolTipManager.initialDelay = Initial delay, ms
+OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>The default tooltip width in pixels.</html>
+OptionPanel.toolTipManager.max_tooltip_width = ToolTip Width
+OptionPanel.toolTipManager.reshowDelay = ReshowDelay delay, ms
+OptionPanel.tr = Turkmen / T\u00fcrkmen, \u0422\u04af\u0440\u043a\u043c\u0435\u043d
+OptionPanel.uk_UA = Ukrainian / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430
+OptionPanel.undefined_font = Undefined font
+OptionPanel.undo_levels.tooltip = <html>Determines how many steps are stored that can be undone via "Undo".</html>
+OptionPanel.undo_levels = Undo Levels
+OptionPanel.unfold_on_paste.tooltip = Unfold node on paste or Drag-And-Drop
+OptionPanel.unfold_on_paste = Unfold node on paste
+OptionPanel.use_common_out_point_for_root_node.tooltip = Edges start from one point at root node
+OptionPanel.use_common_out_point_for_root_node = Edges start from one point at root node
+OptionPanel.use_tabbed_pane.tooltip = If selected the maps are displayed in tabs (like in FireFox :-) ).
+OptionPanel.use_tabbed_pane = Use Tabs
+OptionPanel.userproperties = Userproperties
+OptionPanel.vi = Vietnamese / Ti\u1ebfng Vi\u1ec7t
+OptionPanel.wheel_velocity.tooltip = A higher value results in fast mouse wheel move effects on the map.
+OptionPanel.wheel_velocity = Speed
+OptionPanel.windows = Windows
+OptionPanel.zh_CN = Chinese, simplified / \u7b80\u4f53\u5b57
+OptionPanel.zh_TW = Chinese, traditional / \u7e41\u9ad4\u5b57
+org.freeplane.plugin.bugreport.agree = Send
+org.freeplane.plugin.bugreport.always_agree = Always send
+org.freeplane.plugin.bugreport.always_deny = Never send
+org.freeplane.plugin.bugreport.deny = Don't send
+org.freeplane.plugin.bugreport.dialog.title = Automatic bug report
+org.freeplane.plugin.bugreport.freeplane_team = Freeplane team message
+org.freeplane.plugin.bugreport.lastreport = The received report
+org.freeplane.plugin.bugreport.never = Never ask me for help
+org.freeplane.plugin.bugreport.question = Freeplane has an automatic bug tracking engine.\nNo personal data or map content will ever be transmitted.\nBug reports will help us improve the software.
+org.freeplane.plugin.bugreport.report = Current report
+org.freeplane.plugin.bugreport.wanted_bug = An internal error occurred and was automatically reported.\nWe would like more information in order to reproduce the unexpected behavior.\nPlease help us by submitting a Bug Report to our Mantis bug tracker:\nexplain what you were doing at the time, so that we may reproduce the bug.\n\nPress OK to open the bug tracker page in your web browser.\n\nThank you for your help in making a bug fix possible.\nYour Freeplane Team
+out_of_memory = Out of memory.
+overwrite_keyset_question = Overwrite existing key set?
+PageAction.text = Page &Setup...
+PasteAction.text = Paste
+PatternNewNameProperty = New Pattern
+PatternToString.backgroundColor = Background Color
+PatternToString.Child = Child Node Style
+PatternToString.color = Color
+PatternToString.EdgeColor = Edge Color
+PatternToString.EdgeStyle = Edge Style
+PatternToString.EdgeWidth = Edge Width
+PatternToString.FontBold = Bold
+PatternToString.FontItalic = Italics
+PatternToString.FontName = Font Name
+PatternToString.Icon = Icon
+PatternToString.NodeFontSize = Font Size
+
+plugins/latex/LatexNodeHook.editorTitle = Edit Latex
+plugins/ScriptEditor.cancel = &Dismiss Changes and Exit
+plugins/ScriptEditor.exit = &Save and Exit
+plugins/ScriptEditor.FORBIDDEN_ACTION = Freeplane groovy scripts are restricted. The following {0,choice,0#File|1#Network|2#Exec} operation is forbidden: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. You can change this in the program settings.
+plugins/ScriptEditor.menu_actions = &Actions
+plugins/ScriptEditor.new_script = New Script
+plugins/ScriptEditor.run = &Run
+plugins/ScriptEditor.sign = Sign Script...
+plugins/ScriptEditor/window.Result = Result:
+plugins/ScriptEditor/window.title = Script Editor
+plugins/TimeList.xml_Created = Created
+plugins/TimeList.xml_Date = Date
+plugins/TimeList.xml_Icons = Icons
+plugins/TimeList.xml_Modified = Modified
+plugins/TimeList.xml_Notes = Notes
+plugins/TimeList.xml_Text = Text
+plugins/TimeManagement.xml_appendButton = Append Date To Selected Nodes
+plugins/TimeManagement.xml_Cancel = Cancel
+plugins/TimeManagement.xml_cancelButton = Cancel
+plugins/TimeManagement.xml_closeButton = Close
+plugins/TimeManagement.xml_Export = Export Selected Nodes
+plugins/TimeManagement.xml_Find = Find
+plugins/TimeManagement.xml_Goto = Goto
+plugins/TimeManagement.xml_hour = Hour:
+plugins/TimeManagement.xml_menu_actions = Actions
+plugins/TimeManagement.xml_minute = Minute:
+plugins/TimeManagement.xml_reminderButton = Remind Me At This Date
+plugins/TimeManagement.xml_reminderButton_tooltip = <html>When pressed a timer is scheduled to the date given. Then blinking icons calls your attention.<br> If you close the map, the timers are reactivated the next time, the map is opened.</html>
+plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Currently, there may only be one reminder per node. <br>The current reminder is scheduled at {0,date} {0,time}, your choice was {1,date} {1,time}. <br><br>Do you want to change the node's reminder time (YES) <br>or do you want to keep the old one (NO)?</html>
+plugins/TimeManagement.xml_reminderNode_tooltip = Reminder scheduled at {0,date} {0,time}.
+plugins/TimeManagement.xml_removeReminderButton = Remove Reminder
+plugins/TimeManagement.xml_removeReminderButton_tooltip = Remove all reminders associated with the selected nodes.
+plugins/TimeManagement.xml_Replace = Replace
+plugins/TimeManagement.xml_Replace_All = Replace All
+plugins/TimeManagement.xml_Replace_Selected = Replace Selected
+plugins/TimeManagement.xml_Select = Select
+plugins/TimeManagement.xml_todayButton = Today
+plugins/TimeManagement.xml_WindowTitle = Time Management
+plugins/TimeManagement.xml_WindowTitle_All_Nodes = Search & Replace
+preferences = Preferences
+print_preview_title = Print Preview
+PrintAction.text = Print...
+PrintDirectAction.text = Print
+printing_settings = Print Scaling
+PrintPreviewAction.text = &Print Preview...
+PropertyAction.text = Preferences ...
+QuitAction.text = Quit
+read_only = Read Only
+ReadScriptError.text = Error reading the script\nCheck the log file for details.
+really_convert_to_current_version = <html>This map was created with an older version of Freeplane. <br>Should it be converted (recommended)? <br>(Otherwise it is taken as it is without guarantee.) </html>
+really_cut_node = Really cut node(s)?
+really_execute_script = Do you really want to execute the scripts included in this map? It is possible that they hurt your computer.
+really_remove_node = Really delete node(s)?
+really_remove_notes = Really remove the note(s)?
+ReapplyFilterAction.text = Reapply
+RedoAction.text = Redo
+RedoFilterAction.text = Redo
+ReminderHookAction.text = Remove Reminder
+ReminderHookAction.tooltip = Removes a reminder from a node.
+remove_shortcut_question = Replace keystroke?
+RemoveAllIconsAction.text = Remove All Icons
+RemoveConnectorAction.text = Remove Connector
+RemoveIcon_0_Action.text = Remove first icon
+RemoveIconAction.text = Remove Last Icon
+RemoveNoteAction.text = Remove Notes
+RemoveNoteAction.tooltip = <html>Removes note content of possibly several notes.</html>
+rename = &Rename
+repair_link = Repair Link
+repair_link_question = Couldn't load the linked map. Repair the link manually?
+replace = Replace
+ReportBugAction.text = Report a Bug
+RequestFeatureAction.text = Request a Feature
+reset_to_default = Use default
+ResetNodeLocationAction.text = Reset &Position
+RevertAction.text = &Revert
+RevisionPluginAction.text = Change &Revisions background color
+save_unsaved = Save the following mindmap? :
+SaveAcceleratorPresetsAction.text = Save hot key set
+SaveAction.text = &Save
+SaveAll.text = S&ave All
+SaveAll.tooltip = Saves all open maps.
+SaveAsAction.text = Save As...
+saved = Saved
+saving_canceled = Saving canceled
+scheme_evaluate = Evaluate!
+ScriptEditor.text = S&cript Editor...
+ScriptEditor.tooltip = Enables to write larger scripts within Freeplane.
+ScriptEditorPanel.changed_cancel = The scripts were changed. Do you really want to abandon those changes?
+select_favorites_folder = Select the folder, in which your favorites reside
+select_file_export_to = Select the file to export to
+select_folder_for_importing = Select the folder to import
+select_icon = Select an Icon
+SelectAllAction.text = Select All Visible
+SelectBranchAction.text = Select Visible Branch
+SelectedPasteAction.text = Paste as...
+selection_method_by_click = Single-click to Select
+selection_method_delayed = Delayed Automatic Selection
+selection_method_direct = Point to Select
+SelectNoteAction.text = Note Edit Switch
+SelectNoteAction.tooltip = Switch to resp. from note window
+set_accelerator_on_next_click_action = Click on any menu item to assign a new short cut
+SetAcceleratorOnNextClickAction.text = Assign short cut
+SetImageByFileChooserAction.text = Image (File Chooser or Link)...
+SetLinkByFileChooserAction.text = Hyperlink (File Chooser)...
+SetLinkByTextFieldAction.text = Hyperlink (Text Field)...
+SetNoteWindowPosition.bottom.text = Bottom
+SetNoteWindowPosition.left.text = Left
+SetNoteWindowPosition.right.text = Right
+SetNoteWindowPosition.top.text = Top
+sf_login_required = Source Forge Login required. Continue?
+ShowAllAttributesAction.text = Show All Attributes
+ShowAncestorsAction.text = Show Ancestors
+ShowAttributeDialogAction.text = &Attribute Manager...
+ShowDescendantsAction.text = Show Descendants
+ShowFilterToolbarAction.text = Filter Toolbar
+ShowHideNoteAction.text = Note Window
+ShowHideNoteAction.tooltip = =Lets the note window appear resp. disappear.
+ShowSelectedAttributesAction.text = Show Selected Attributes
+ShowSelectionAsRectangleAction.text = Rectangular Selection
+simplyhtml.aboutFrameTitle = About this application
+simplyhtml.aboutLabel = About SimplyHTML...
+simplyhtml.alignCenter = center
+simplyhtml.alignLabel = Alignment:
+simplyhtml.alignLeft = left
+simplyhtml.alignRight = right
+simplyhtml.allCellsRangeLabel = all cells
+simplyhtml.allOccurrencesReplaced = All occurrences replaced
+simplyhtml.appendTableColLabel = Append col
+simplyhtml.appendTableRowLabel = Append row
+simplyhtml.applyCellAttrLabel = Apply to
+simplyhtml.backgroundLabel = Background:
+simplyhtml.boldItalicName = bold italic
+simplyhtml.boldName = bold
+simplyhtml.borderColorLabel = Color:
+simplyhtml.borderWidthLabel = Width
+simplyhtml.bottomLabel = bottom:
+simplyhtml.cancelBtnName = Cancel
+simplyhtml.cellBorderTabLabel = Borders
+simplyhtml.cellGenTabLabel = General
+simplyhtml.cellMarginTabLabel = Margin
+simplyhtml.cellPanelTitle = Cell format
+simplyhtml.clearFormatLabel = Remove Formatting
+simplyhtml.clearFormatTip = Remove Formatting
+simplyhtml.close = Close
+simplyhtml.closeBtnName = Close
+simplyhtml.colorLabel = Color
+simplyhtml.copyLabel = Copy
+simplyhtml.copyTip = copy
+simplyhtml.cTagNameHead1 = Heading 1
+simplyhtml.cTagNameHead2 = Heading 2
+simplyhtml.cTagNameHead3 = Heading 3
+simplyhtml.cTagNameHead4 = Heading 4
+simplyhtml.cTagNameHead5 = Heading 5
+simplyhtml.cTagNameHead6 = Heading 6
+simplyhtml.cTagNameLink = Link
+simplyhtml.cTagNameOL = Ordered List
+simplyhtml.cTagNamePara = Paragraph
+simplyhtml.cTagNameUL = Unordered List
+simplyhtml.cutLabel = Cut
+simplyhtml.cutTip = cut
+simplyhtml.defaultDocName = Untitled
+simplyhtml.deleteTableColLabel = Delete column
+simplyhtml.deleteTableRowLabel = Delete row
+simplyhtml.docTitleQuery = Set title to:
+simplyhtml.docTitleTitle = Edit Document Title
+simplyhtml.editLabel = Edit
+simplyhtml.effectLabel = Effect
+simplyhtml.familyLabel = Family
+simplyhtml.findNext = Find next...
+simplyhtml.findReplaceDialogTitle = Find & Replace
+simplyhtml.findReplaceLabel = Find & Replace
+simplyhtml.findReplaceTip = find & replace
+simplyhtml.fontBoldLabel = Bold
+simplyhtml.fontBoldTip = switch bold on/off
+simplyhtml.fontColorLabel = Text Color
+simplyhtml.fontColorTip = Text Color
+simplyhtml.fontDialogTitle = Format Font
+simplyhtml.fontItalicLabel = Italic
+simplyhtml.fontItalicTip = switch italic on/off
+simplyhtml.fontLabel = Font...
+simplyhtml.fontTabLabel = Font
+simplyhtml.fontTip = Format font...
+simplyhtml.fontUnderlineLabel = Underline
+simplyhtml.fontUnderlineTip = switch underline on/off
+simplyhtml.foregroundLabel = Foreground:
+simplyhtml.formatLabel = Format
+simplyhtml.formatListLabel = List...
+simplyhtml.formatListTip = change list format
+simplyhtml.formatParaLabel = Paragraph...
+simplyhtml.formatParaTip = Change paragraph format
+simplyhtml.formatTableLabel = Table...
+simplyhtml.formatTableTip = Format table
+simplyhtml.helpLabel = Help
+simplyhtml.htmlTabTitle = HTML Code view
+simplyhtml.imageFileDesc = Image files
+simplyhtml.insertTableColLabel = Insert column
+simplyhtml.insertTableLabel = Table...
+simplyhtml.insertTableMsg = How many columns?
+simplyhtml.insertTableRowLabel = Insert row
+simplyhtml.insertTableTitle = insertTable
+simplyhtml.italicName = italic
+simplyhtml.layoutTabTitle = Layout view
+simplyhtml.leftLabel = left:
+simplyhtml.listDialogTitle = Format List
+simplyhtml.listIndentTitle = Indent:
+simplyhtml.listPosInside = inside
+simplyhtml.listPositionLabel = Position:
+simplyhtml.listPosOutside = outside
+simplyhtml.listTypeCircle = round bulled
+simplyhtml.listTypeDecimal = 1.,2.,3.,4.
+simplyhtml.listTypeDisc = file symbol as bullet
+simplyhtml.listTypeLabel = Type:
+simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
+simplyhtml.listTypeNone = none
+simplyhtml.listTypeSquare = square bullet
+simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
+simplyhtml.marginLabel = Outer
+simplyhtml.matchCase = Match case
+simplyhtml.newStyleDefaultName = new style
+simplyhtml.nextTableCellLabel = Next cell
+simplyhtml.noLineLabel = none
+simplyhtml.noMoreOccurrencesFound = no (more) occurrences found
+simplyhtml.okBtnName = OK
+simplyhtml.paddingLabel = Inner
+simplyhtml.paraAlignCenterLabel = Align center
+simplyhtml.paraAlignCenterTip = Set paragraph center alignment
+simplyhtml.paraAlignLeftLabel = Align left
+simplyhtml.paraAlignLeftTip = Set paragraph left alignment
+simplyhtml.paraAlignRightLabel = Align right
+simplyhtml.paraAlignRightTip = Set paragraph right alignment
+simplyhtml.paraStyleDialogTitle = Paragraph Style
+simplyhtml.paraTabLabel = Paragraph
+simplyhtml.pasteLabel = Paste
+simplyhtml.pasteTip = paste
+simplyhtml.plainName = plain
+simplyhtml.previewLabel = Preview
+simplyhtml.previewText = Preview text
+simplyhtml.prevTableCellLabel = Previous cell
+simplyhtml.redoLabel = Redo
+simplyhtml.redoTip = redo
+simplyhtml.replace = Replace...
+simplyhtml.replaceAll = All
+simplyhtml.replaceDone = Done
+simplyhtml.replaceNo = No
+simplyhtml.replaceThisQuery = replace this occurrence of
+simplyhtml.replaceWith = Replace with:
+simplyhtml.replaceYes = Yes
+simplyhtml.rightLabel = right:
+simplyhtml.searchDown = Search down
+simplyhtml.searchFromStart = Search from start
+simplyhtml.searchUp = Search up
+simplyhtml.selectAllLabel = Select all
+simplyhtml.sizeLabel = Size
+simplyhtml.standardStyleName = standard
+simplyhtml.strikeLabel = Strikethrough
+simplyhtml.styleLabel = Style
+simplyhtml.styleNameInputText = Name of new style?
+simplyhtml.styleNameInputTitle = Save style
+simplyhtml.tableBgColLabel = Background color:
+simplyhtml.tableDialogTitle = Format Table
+simplyhtml.tableLabel = Table
+simplyhtml.tablePanelTitle = Table format
+simplyhtml.tableWidthLabel = Width:
+simplyhtml.textIndentLabel = Indent:
+simplyhtml.textToFind = Text to find:
+simplyhtml.thisCellRangeLabel = this cell
+simplyhtml.thisColRangeLabel = this column
+simplyhtml.thisRowRangeLabel = this row
+simplyhtml.toggleBulletsLabel = Bulleted list on/off
+simplyhtml.toggleBulletsTip = bulleted list on/off
+simplyhtml.toggleNumbersLabel = Numbered list on/off
+simplyhtml.toggleNumbersTip = numbered list on/off
+simplyhtml.topLabel = top:
+simplyhtml.uLineLabel = Underline
+simplyhtml.unableToOpenFileError = File can not be opened
+simplyhtml.unableToRedoError = Unable to redo:
+simplyhtml.unableToUndoError = Unable to undo:
+simplyhtml.undoLabel = Undo
+simplyhtml.undoTip = undo
+simplyhtml.valignBaseline = baseline
+simplyhtml.valignBottom = bottom
+simplyhtml.valignLabel = Vert. Alignment:
+simplyhtml.valignMiddle = middle
+simplyhtml.valignTop = top
+simplyhtml.wholeWordsOnly = Whole words only
+SortNodes.text = &Sort Children
+SortNodes.tooltip = Sorts all children of a node alphabetically.
+split = &Split
+SplitNode.text = &Split Node
+SplitNode.tooltip = <html>Node is splitted</html>
+StringFlavorHandler = Plain text as node hierarchy
+StructuredHtmlFlavorHandler = HTML as node hierarchy
+style = Style
+svg = SVG
+TimeListAction.text = Show Time Scheduler &List ...
+TimeListAction.tooltip = Shows all scheduled times and the corresponding nodes.
+TimeManagementAction.text = Show Calendar...
+TimeManagementAction.tooltip = <html>Shows the calendar module by Kai Toedter.</html>
+ToggleChildrenFoldedAction.text = (Un)fold Children
+ToggleFBarAction.text = F-Bar
+ToggleFoldedAction.text = Toggle Folded
+ToggleFullScreenAction.text = Full screen mode
+ToggleLeftToolbarAction.text = &Secondary Toolbar
+ToggleMenubarAction.text = Menubar
+ToggleToolbarAction.text = &Toolbar
+undefined_error = An unexpected error occured. Please try to make a bug report.
+underline = Underline
+underlined = Underlined
+UndoAction.text = Undo
+UndoFilterAction.text = Undo
+unfold = Unfold
+UnfoldAllAction.text = Unfold All
+UnfoldAllAction.tooltip = <html>Unfolds the selected nodes and all their children.</html>
+
+UnfoldOneLevelAction.text = Unfold One Level
+UnfoldOneLevelAction.tooltip = <html>Unfolds the selected nodes by one level.</html>
+UpdateCheckAction.text = Check for Updates
+updatecheckdialog = Update Check Dialog
+url_error = This URL is malformed!
+url_load_error = Could not load map at URL:
+used_in_menu = This shortcut can not be set, it is used as a menu shortcut.
+UsePlainTextAction.text = Use Plain Text
+user_config_folder = User configuration folder: {0}
+user_defined_scale = User defined scale
+user_defined_zoom = User defined.
+user_defined_zoom_status_bar = Changing the zoom to the user defined zoom value of {0}%.
+user_zoom = Print Zoom Factor (0.0 - 2.0):
+
+version_up_to_date = You already use the latest program version
+ViewerControllerAction.text = External object...
+ViewLayoutTypeAction.OUTLINE.text = Outline view
+WebDocuAction.text = Web Documentation
+width = Width
+wrong_regexp = Wrong regular expression "{0}", error {1}
+
+xslt_export_not_possible = Freeplane XSLT export not possible
+yes = Yes
+ZoomInAction.text = Zoom In
+ZoomOutAction.text = Zoom Out
diff --git a/freeplane_ant/src/test/resources/unsorted/Test_ru.properties b/freeplane_ant/src/test/resources/unsorted/Test_ru.properties
new file mode 100644
index 0000000..bf5fa57
--- /dev/null
+++ b/freeplane_ant/src/test/resources/unsorted/Test_ru.properties
@@ -0,0 +1,1284 @@
+#!
+#! created/edited by Popeye version 0.54 (popeye.sourceforge.net)
+#! encoding:ISO-8859-1
+about_text = Freeplane - \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043a\u0430\u0440\u0442 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0437 \u0437\u043d\u0430\u043d\u0438\u0439\nCopyright \u00a9 2000-2008 Joerg Mueller, Daniel [...]
+AboutAction.text= \u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435...
+accessories/plugins/ApplyFormatPlugin.dialog.title=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u043e\u0432
+accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c
+accessories/plugins/EncryptNode.properties_0 = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+accessories/plugins/EncryptNode.properties_1 = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c
+accessories/plugins/EncryptNode.properties_2 = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c:
+accessories/plugins/EncryptNode.properties_3 = \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c:
+accessories/plugins/EncryptNode.properties_4 = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c.
+accessories/plugins/EncryptNode.properties_5 = <html>\u0423\u0447\u0442\u0438\u0442\u0435 \u0447\u0442\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f<br> \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u043e\u043b\u044f
+accessories/plugins/EncryptNode.properties_6 = OK
+accessories/plugins/EncryptNode.properties_7 = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = <html>\u042d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0443\u0437\u043b\u0443<b [...]
+accessories/plugins/EncryptNode.properties_select_me = \u0412\u044b\u0431\u0435\u0440\u0438 \u043c\u0435\u043d\u044f.
+accessories/plugins/EncryptNode.properties_wrong_password = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c
+
+accessories/plugins/ExportWithTWiki.text=\u041a\u0430\u043a TWiki...
+accessories/plugins/ExportWithTWiki.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u043a\u0430\u043a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 TWiki.
+
+accessories/plugins/ExportWithXSLT.tooltip= \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 XSLT - \u0441\u043a\u0440\u0438\u043f\u0442
+
+
+accessories/plugins/ExportWithXSLT_Applet.text=\u041a\u0430\u043a java-\u0430\u043f\u043f\u043b\u0435\u0442...
+accessories/plugins/ExportWithXSLT_Applet.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a java-\u0430\u043f\u043f\u043b\u0435\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.
+accessories/plugins/ExportWithXSLT_Flash.text=\u041a\u0430\u043a Flash...
+accessories/plugins/ExportWithXSLT_Flash.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a flash \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443.
+accessories/plugins/ExportWithXSLT_HTML.text= \u041a\u0430\u043a XHTML (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c JavaScript)...
+
+accessories/plugins/ExportWithXSLT_HTML3.text= \u041a\u0430\u043a XHTML (\u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439)...
+
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u0437 \u0443\u0437\u043b\u0430 RESOURCES \u0432 \u0444\u0430\u0439\u043b \u0434\u043b\u044f Taskjuggler...
+accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u0437 \u0443\u0437\u043b\u0430 RESOURCES \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f Taskjuggler. </html>
+accessories/plugins/ExportWithXSLT_TASKSTJI.text=\u0417\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u0443\u0437\u043b\u0430 TASKS \u0432 \u0444\u0430\u0439\u043b \u0434\u043b\u044f Taskjuggler...
+accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u0443\u0437\u043b\u0430 TASKS \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f Taskjuggler. </html>
+accessories/plugins/ManagePatterns.dialog.title=\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0442\u0438\u043b\u0435\u0439
+accessories/plugins/ManagePatterns.not_found=\u0424\u0430\u0439\u043b \u0441\u043e \u0441\u0442\u0438\u043b\u044f\u043c\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d.
+accessories/plugins/SaveAll.properties_save_all_cancelled=\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430.
+add=&\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c
+AddConnectorAction.text=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c
+AddElementaryConditionAction.text=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c
+
+AddLocalLinkAction.text=\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b
+antialias_all = \u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0451
+antialias_edges = \u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0451\u0431\u0440\u0430
+antialias_none = \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c
+apply=&\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c
+ApplyFormatPlugin.text=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 ...
+ApplyFormatPlugin.tooltip=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432 \u0438 \u043b\u0438\u043d\u0438\u0439
+ApplyNoFilteringAction.text=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440
+ApplySelectedViewConditionAction.text=\u0424\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
+ApplyToVisibleAction.text=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c
+as_parent = \u041a\u0430\u043a \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f
+AssignAttributesAction.text=&\u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b...
+attribute_delete_value=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435
+attribute_delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f
+attribute_font_size_tooltip=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0434\u043b\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432
+attribute_list_box_label_text=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f
+attribute_replace=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430
+attribute_top=\u0412\u0441\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0441\u043e \u0432\u0441\u0435\u0445 \u043a\u0430\u0440\u0442
+attributes_adding_empty_attribute_error=\u041f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043c\u0435\u043d\u0435\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attributes_all=\u0412\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+attributes_attribute=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+attributes_close=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
+attributes_deselect_all=\u041d\u0438\u0447\u0435\u0433\u043e
+attributes_dialog_title=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438
+attributes_edit_tooltip=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e
+attributes_edit=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+attributes_for_selected=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
+attributes_for_visible=\u0412\u0441\u0435 \u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0443\u0437\u043b\u044b
+attributes_import_tooltip=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442
+attributes_import=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+attributes_no_import_candidates_found=\u041d\u043e\u0432\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e
+attributes_popup_delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+attributes_popup_down=\u0412\u043d\u0438\u0437
+attributes_popup_edit=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+attributes_popup_hide=\u0421\u043f\u0440\u044f\u0442\u0430\u0442\u044c
+attributes_popup_new=\u041d\u043e\u0432\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
+attributes_popup_optimal_width=\u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430
+attributes_popup_up=\u0412\u0432\u0435\u0440\u0445
+attributes_refresh=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c
+attributes_restricted_attributes_tooltip=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432
+attributes_restricted_values_tooltip=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
+attributes_restriction=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c
+attributes_select_all_tooltip=\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c / \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435
+attributes_select_all=\u0412\u0441\u0435
+attributes_show=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c
+attributes_skip_root=\u041a\u0440\u043e\u043c\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+attributes_visible_tooltip=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435
+attributes_visible=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435
+automatically_save_message=\u041a\u0430\u0440\u0442\u0430 \u0431\u044b\u043b\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 (\u0432 \u0444\u0430\u0439\u043b {0}) ...
+AutomaticLayoutAction.text= &\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
+AutomaticLayoutAction.tooltip= <html>\u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0432\u0438\u0434 \u043a\u0430\u0440\u0442\u044b <br>\u0423\u0437\u043b\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0442\u0430\u043d\u0443\u0442 \u0447\u0435\u0440\u043d\u044b\u043c\u0438, \u0432\u0442\u043e\u0440\u043e\u0433\u043e - \u0441\u0438\u043d\u0438\u043c\u0438 \u0438 \u0442.\u0434.</html>
+BackAction.text=\u041d\u0430\u0437\u0430\u0434
+BackAction.tooltip=\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443 \u0443\u0437\u043b\u0443 \u0432 \u0446\u0435\u043f\u0438
+background = \u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430
+BlinkingNodeHookAction.text= \u041c\u0438\u0433\u0430\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b
+BlinkingNodeHookAction.tooltip= <html>\u0423\u0437\u0435\u043b \u0431\u0443\u0434\u0435\u0442 \u043c\u0438\u0433\u0430\u0442\u044c. \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u042d\u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 \u0443\ [...]
+BoldAction.text= \u0416\u0438\u0440\u043d\u044b\u0439
+boldify_branch = \u0412\u0441\u044e \u0432\u0435\u0442\u0432\u044c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0436\u0438\u0440\u043d\u044b\u043c
+branch = \u0412\u0435\u0442\u0432\u044c
+cancel = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+cannot_add_parent_diff_parents = \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f
+cannot_add_parent_to_root = \u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c
+cannot_delete_root = \u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043b\u0438 \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c
+cannot_join_nodes_with_children = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u0441 \u0438\u0445 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438
+cannot_move_to_child = \u0423\u0437\u0435\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d \u0432 \u0441\u0432\u043e\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b
+CenterAction.text= \u0426\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+CenterSelectedNodeAction.text=\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
+change_link_arrows=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u0438
+ChangeConnectorArrowsAction.text=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u0438
+
+ChangeNodeLevelLeftsAction.text=\u0423\u0437\u0435\u043b \u0432\u043b\u0435\u0432\u043e
+ChangeNodeLevelLeftsAction.tooltip=\u0421 \u043b\u0435\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0443\u0437\u043b\u044b \u0441\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0438\u0437 \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u0432\u044b\u0448\u0435\u043b\u0435\u0436\u0430\ [...]
+ChangeNodeLevelRightsAction.text=\u0423\u0437\u0435\u043b \u0432\u043f\u0440\u0430\u0432\u043e
+ChangeNodeLevelRightsAction.tooltip=\u0421 \u043f\u0440\u0430\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0443\u0437\u043b\u044b \u0441\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0438\u0437 \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u0432\u044b\u0448\u0435\u043b\u0435\u0436 [...]
+choose_background_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442
+choose_cloud_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u0430
+choose_edge_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
+choose_map_background_color=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0446\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u044b
+choose_node_background_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u0443\u0437\u043b\u0430
+choose_node_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430 \u0443\u0437\u043b\u0430
+CloseAction.text= \u0417\u0430\u043a\u0440\u044b\u0442\u044c
+CloudAction.text= \u041e\u0431\u043b\u0430\u043a\u043e
+CloudColorAction.text= \u0426\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u0430 ...
+ConnectorColorAction.text=\u0426\u0432\u0435\u0442 \u0441\u0432\u044f\u0437\u0438...
+
+ColorProperty.ResetColor=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0432\u0435\u0442
+combined = \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439
+confirmation=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435
+CopyAction.text= \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+CopySingleAction.text= \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b
+CreateConjunctConditionAction.text=\u0438
+CreateDisjunctConditionAction.text=\u0438\u043b\u0438
+CreateNotSatisfiedConditionAction.text=\u043d\u0435
+CreationModificationPluginAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c &\u0432\u0440\u0435\u043c\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f
+CreationModificationPluginAction.tooltip=<html>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432</html>
+CutAction.text= \u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c
+decrease_branch_font_size = \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438
+DecreaseNodeFontAction.text= \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438
+delete_child = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b
+delete=&\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+DeleteAction.text= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b
+DeleteConditionAction.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+DocumentationAction.text= \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f
+edge = \u0420\u0435\u0431\u0440\u043e
+edge_style = \u0422\u0438\u043f \u043b\u0438\u043d\u0438\u0438 \u0440\u0435\u0431\u0440\u0430
+edge_width = \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430
+EdgeColorAction.text= \u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430...
+EdgeStyleAction.bezier.text= \u041a\u0440\u0438\u0432\u0430\u044f
+EdgeStyleAction.hide_edge.text=\u0421\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0440\u0435\u0431\u0440\u043e
+EdgeStyleAction.horizontal.text=\u041b\u043e\u043c\u0430\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f
+EdgeStyleAction.linear.text= \u041f\u0440\u044f\u043c\u0430\u044f
+EdgeStyleAction.sharp_bezier.text= \u0417\u0430\u043e\u0441\u0442\u0440\u0451\u043d\u043d\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f
+EdgeStyleAction.sharp_linear.text= \u0417\u0430\u043e\u0441\u0442\u0440\u0451\u043d\u043d\u0430\u044f \u043f\u0440\u044f\u043c\u0430\u044f
+EdgeStyleAsParentAction.text=\u041a\u0430\u043a \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f
+EdgeWidthAction_width_parent.text= \u041a\u0430\u043a \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+EdgeWidthAction_width_thin.text= \u0422\u043e\u043d\u043a\u043e\u0435 \u0440\u0435\u0431\u0440\u043e
+edit = &\u041f\u0440\u0430\u0432\u043a\u0430
+edit.decision=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 HTML
+edit.edit_rich_text=\u0425\u043e\u0442\u0438\u0442\u0435 \u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 \u0438\u043b\u0438 \u043d\u0430\u043a\u043b\u043e\u043d\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442\u044b?
+edit_link_manually = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e...
+edit_long_node=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0443\u0437\u043b\u0430
+EditAction.text= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+EditAttributesAction.text=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+EditFilterAction.text=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+EditLongAction.text= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435...
+EncryptedMap.text= \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443...
+EncryptedMap.tooltip= \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d
+enter_base_url = \u0411\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 URL...
+enter_confirms = \u041a\u043b\u0430\u0432\u0438\u0448\u0430 Enter \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.
+EnterPassword.text= &\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e / \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e
+
+error =\u041e\u0448\u0438\u0431\u043a\u0430
+error_applying_template=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 XSLT \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.
+error_creating_directory = \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0430\u043f\u043a\u0438
+export_pdf_text = \u0444\u043e\u0440\u043c\u0430\u0442 PDF
+export_svg_text = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0413\u0440\u0430\u0444\u0438\u043a\u0430 (SVG)
+export_using_xslt=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0441 XSLT
+ExportBranchAction.text= \u0412\u0435\u0442\u0432\u044c \u043a\u0430\u043a \u043d\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443 ...
+ExportBranchToHTMLAction.text= \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0442\u0432\u044c \u0432 HTML
+ExportPdf.text= \u041a\u0430\u043a PDF...
+ExportPdf.tooltip = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a PDF
+ExportSvg.text= \u041a\u0430\u043a SVG...
+ExportSvg.tooltip = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a SVG
+ExportToHTMLAction.text= \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 HTML
+ExportToImage.jpg.text= \u041a\u0430\u043a JPEG...
+ExportToImage.png.text= \u041a\u0430\u043a PNG...
+ExportToImage.jpg.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0432 JPEG-\u0444\u043e\u0440\u043c\u0430\u0442
+ExportToImage.png.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0432 PNG-\u0444\u043e\u0440\u043c\u0430\u0442
+ExportToOoWriter.text= \u041a\u0430\u043a Open Office Writer Document...
+ExportToOoWriter.tooltip=\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u0443\u0437\u043b\u044b \u0437\u0430\u0434\u0430\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u0443\u0437\u043b\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430.
+extension_menu = &\u0421\u0442\u0438\u043b\u044c
+extract_link_from_text.tooltip=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u0433\u0438\u043f\u0435\u0440\u0441\u0441\u044b\u043b\u043a\u0443
+ExtractLinkFromTextAction.text=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0438\u043f\u0435\u0440\u0441\u0441\u044b\u043b\u043a\u0443 \u0432 \u0442\u0435\u043a\u0441\u0442
+FaqOpenURLAction.text= \u0427\u0430\u0441\u0442\u043e \u0417\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0412\u043e\u043f\u0440\u043e\u0441\u044b
+file = &\u0424\u0430\u0439\u043b
+file_already_exists = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 {0} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c?
+file_not_found = \u041e\u0448\u0438\u0431\u043a\u0430: \u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.
+filter_add=&\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c
+filter_and=\u0418
+filter_conditions = \u0424\u0438\u043b\u044c\u0442\u0440\u044b
+filter_contains=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442
+filter_created_after=\u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435
+filter_created_before=\u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e
+filter_delete=&\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+filter_dialog=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0424\u0438\u043b\u044c\u0442\u0440
+filter_does_not_exist=\u041d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442
+filter_edit_description=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b
+filter_enter_value=\u0412\u0432\u0435\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435
+filter_exist=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442
+filter_icon=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430
+filter_ignore_case=\u0411\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430
+filter_is_equal_to=\u0420\u0430\u0432\u0435\u043d
+filter_is_not_equal_to=\u041d\u0435\u0440\u0430\u0432\u0435\u043d
+filter_link=\u0413\u0438\u043f\u0435\u0440\u0441\u0441\u044b\u043b\u043a\u0430
+filter_modified_after=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u043f\u043e\u0441\u043b\u0435
+filter_modified_before=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0434\u043e
+filter_no_filtering=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440
+filter_node=\u0422\u0435\u043a\u0441\u0442 \u0443\u0437\u043b\u0430
+filter_not=\u041a\u0440\u043e\u043c\u0435
+filter_or=\u0418\u043b\u0438
+filter_select=\u0412\u044b\u0431\u0440\u0430\u0442\u044c
+filter_selected_node_view_snapshot=\u0421\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440
+filter_selected_node_view=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
+filter_time=\u0424\u0438\u043b\u044c\u0442\u0440 \u0434\u0430\u0442\u044b
+filter=\u0424\u0438\u043b\u044c\u0442\u0440
+find_what = \u0418\u0441\u043a\u043e\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442
+FindAction.text= \u0418\u0441\u043a\u0430\u0442\u044c...
+FindNextAction.text= \u0418\u0441\u043a\u0430\u0442\u044c \u0434\u0430\u043b\u0435\u0435
+fit_map_to_page = \u0423\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435
+FitToPage.text= \u0423\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u044e \u043a\u0430\u0440\u0442\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d
+FitToPage.tooltip= \u041f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u044e \u043a\u0430\u0440\u0442\u0443 \u0432 \u043e\u043a\u043d\u0435
+fold = \u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c
+FoldAllAction.text= \u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0451
+FoldAllAction.tooltip= <html>\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0437\u043b\u044b</html>
+FoldOneLevelAction.text= \u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c
+FoldOneLevelAction.tooltip= <html>\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u043d\u0430 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c</html>
+follow_graphical_link=\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a ''{0}''
+FollowLinkAction.text= \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435
+font = \u0428\u0440\u0438\u0444\u0442
+FontFamilyAction.text= \u0428\u0440\u0438\u0444\u0442
+FontSizeAction.text= \u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
+format_menu_edge_styles=&\u0422\u0438\u043f \u0440\u0435\u0431\u0440\u0430
+format_menu_edge_widths=\u0422&\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430
+FormatCopy.text= \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442
+FormatCopy.tooltip= <html>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430</html>
+FormatPaste.text= \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442
+FormatPaste.tooltip= <html>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a \u0443\u0437\u043b\u0443 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442</html>
+ForwardAction.text=\u0412\u043f\u0435\u0440\u0451\u0434
+ForwardAction.tooltip=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u0443\u0437\u043b\u0443
+Freeplane.progress.buildScreen=\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d...
+Freeplane.progress.createController=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430...
+Freeplane.progress.createInitialMode=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430
+Freeplane.progress.endStartup=\u0417\u0430\u043f\u0443\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d.
+Freeplane.progress.gettingPreferenceDirectories=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0430\u043f\u043e\u043a \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439...
+Freeplane.progress.gettingPreferences=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438...
+Freeplane.progress.loadMaps=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u0430\u0440\u0442\u044b...
+Freeplane.progress.propagateLookAndFeel=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430...
+Freeplane.progress.settingPreferences=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438...
+Freeplane.progress.startCreateController=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430...
+Freeplane.progress.updateLookAndFeel=\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430...
+freeplane_reverted=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 Freeplane
+FreeplaneHelpStarter.text= \u041f\u043e\u043c\u043e\u0449\u044c ...
+FreeplaneHelpStarter.tooltip= \u041f\u043e\u043c\u043e\u0449\u044c...
+GotoLinkNodeAction.text= \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0432\u044f\u0437\u0438
+GrabKeyDialog.common.cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+GrabKeyDialog.common.ok=OK
+GrabKeyDialog.grab-key.assigned-to.none=\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442
+GrabKeyDialog.grab-key.assigned-to=\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e
+GrabKeyDialog.grab-key.caption=\u041a\u043b\u0430\u0432\u0438\u0448\u0430
+GrabKeyDialog.grab-key.clear=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+GrabKeyDialog.grab-key.remove-ask=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438?
+GrabKeyDialog.grab-key.remove=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
+GrabKeyDialog.grab-key.title=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0443
+help = \u041f\u043e&\u043c\u043e\u0449\u044c
+HideableAction.tooltip= <html>\u041e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0444\u043e\u043d \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430.</html>
+HideAllAttributesAction.text= \u0421\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+HierarchicalIconsAction.text=\u0414\u043e\u0447\u0435\u0440\u043d\u0438\u0435 &\u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
+HierarchicalIconsAction.tooltip=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
+html_export_based_on_headings = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML - \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432
+html_export_fold_all = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML - \u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435
+html_export_fold_currently_folded = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML - \u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441
+html_export_no_folding = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML - \u0411\u0435\u0437 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f
+icon_0%=0%
+icon_25%=25%
+icon_50%=50%
+icon_75%=75%
+icon_100%=100%
+icon_attach = \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435
+icon_back = \u041d\u0430\u0437\u0430\u0434
+icon_bell = \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c
+icon_bookmark = \u041e\u0442\u043b\u0438\u0447\u043d\u043e
+icon_broken-line = \u0421\u043b\u043e\u043c\u0430\u043d\u044b\u0439
+icon_button_cancel = \u041d\u0435 OK
+icon_button_ok = OK
+icon_calendar = \u0414\u0430\u0442\u0430
+icon_clanbomber = \u041e\u043f\u0430\u0441\u043d\u043e
+icon_clock =\u0412\u0440\u0435\u043c\u044f
+icon_closed = \u0412\u0445\u043e\u0434\u0430 \u043d\u0435\u0442
+icon_decrypted =\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439
+icon_desktop_new = \u041d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c
+icon_down = \u0412\u043d\u0438\u0437
+icon_edit =\u0423\u0442\u043e\u0447\u043d\u0438\u0442\u044c
+icon_encrypted = \u0417\u0430\u043a\u0440\u044b\u0442\u044b\u0439
+icon_family=\u0421\u0435\u043c\u044c\u044f
+icon_fema=\u0416\u0435\u043d\u0449\u0438\u043d\u044b
+icon_female1=\u0416\u0435\u043d\u0449\u0438\u043d\u04301
+icon_female2=\u0416\u0435\u043d\u0449\u0438\u043d\u04302
+icon_females=\u0416\u0435\u043d\u0449\u0438\u043d\u044b
+icon_flag-black = \u0427\u0435\u0440\u043d\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
+icon_flag-blue = \u0421\u0438\u043d\u0438\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
+icon_flag-green = \u0417\u0435\u043b\u0435\u043d\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
+icon_flag-orange = \u041e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
+icon_flag-pink = \u0420\u043e\u0437\u043e\u0432\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
+icon_flag-yellow = \u0416\u0435\u043b\u0442\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
+icon_flag = \u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
+icon_folder = \u041f\u0430\u043f\u043a\u0430
+icon_forward =\u0412\u043f\u0435\u0440\u0451\u0434
+icon_freemind_butterfly = FreeMind
+icon_full-0=\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 0
+icon_full-1 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 1
+icon_full-2 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 2
+icon_full-3 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 3
+icon_full-4 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 4
+icon_full-5 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 5
+icon_full-6 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 6
+icon_full-7 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 7
+icon_full-8 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 8
+icon_full-9 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 9
+icon_go=\u0417\u0435\u043b\u0435\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430
+icon_gohome = \u0414\u043e\u043c
+icon_group=\u0413\u0440\u0443\u043f\u043f\u0430
+icon_help = \u0412\u043e\u043f\u0440\u043e\u0441
+icon_hourglass = \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435
+icon_idea = \u0418\u0434\u0435\u044f
+icon_info=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f
+icon_kaddressbook = \u0422\u0435\u043b\u0435\u0444\u043e\u043d
+icon_kmail = E-Mail
+icon_knotify = \u041c\u0443\u0437\u044b\u043a\u0430
+icon_korn = \u041f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u044f\u0449\u0438\u043a
+icon_ksmiletris = \u042f \u0434\u043e\u0432\u043e\u043b\u0435\u043d
+icon_launch=\u0417\u0430\u043f\u0443\u0441\u043a
+icon_licq = \u041c\u0438\u043b\u043e
+icon_list=\u0421\u043f\u0438\u0441\u043e\u043a
+icon_Mail = \u041f\u0438\u0441\u044c\u043c\u043e
+icon_male1=\u041c\u0443\u0436\u0447\u0438\u043d\u04301
+icon_male2=\u041c\u0443\u0436\u0447\u0438\u043d\u04302
+icon_males=\u041c\u0443\u0436\u0447\u0438\u043d\u044b
+icon_menu = &\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
+icon_messagebox_warning = \u0412\u0430\u0436\u043d\u043e
+icon_password = \u041a\u043b\u044e\u0447
+icon_pencil = \u0423\u0442\u043e\u0447\u043d\u0438\u0442\u044c
+icon_penguin =\u041b\u0438\u043d\u0443\u043a\u0441
+icon_prepare=\u0416\u0435\u043b\u0442\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430
+icon_smiley-angry = \u0421\u0435\u0440\u0434\u0438\u0442\u044b\u0439
+icon_smiley-neutral = \u041d\u0435 \u0432\u0430\u0436\u043d\u043e
+icon_smiley-oh = \u0423\u0434\u0438\u0432\u043b\u0435\u043d\u043d\u044b\u0439
+icon_smily_bad = \u041c\u043d\u0435 \u043d\u0435 \u0434\u043e \u0432\u0435\u0441\u0435\u043b\u044c\u044f
+icon_stop-sign = \u0421\u0442\u043e\u043f
+icon_stop = \u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430
+icon_up = \u0412\u0432\u0435\u0440\u0445
+icon_wizard = \u041c\u0430\u0433\u0438\u044f
+icon_xmag = \u041e\u0431\u0441\u0443\u0434\u0438\u0442\u044c
+icon_yes = \u0412\u0430\u0436\u043d\u043e
+icon_user_icon =\u0418\u043a\u043e\u043d\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
+IconSelectionPlugin.text= \u0412\u044b\u0431\u043e\u0440 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b...
+IconSelectionPlugin.tooltip= <html>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b</html>
+import = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+import_linked_branch_no_link = \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0443, \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u0443\u044e \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430
+ImportBranchAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0442\u0432\u044c \u0438\u0437 (mm-) \u0444\u0430\u0439\u043b\u0430...
+ImportExplorerFavoritesAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0438 \u0438\u0437 IE...
+ImportFolderStructureAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432...
+ImportLinkedBranchAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0442\u0432\u044c \u0438\u0437 \u0441\u0441\u044b\u043b\u043a\u0438
+ImportLinkedBranchWithoutRootAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u0441\u0441\u044b\u043b\u043a\u0438 \u0431\u0435\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+ImportMindmanagerFiles.text=\u041a\u0430\u0440\u0442\u0430 \u0434\u043b\u044f MindManager X5 ...
+increase_branch_font_size = \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438
+IncreaseNodeFontAction.text= \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438
+ItalicAction.text= \u041a\u0443\u0440\u0441\u0438\u0432
+italicise_branch = \u0428\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438 \u043a\u0443\u0440\u0441\u0438\u0432
+JoinNodesAction.text= \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0443\u0437\u043b\u044b
+
+LatexNodeHookAction.text= \u0424\u043e\u0440\u043c\u0443\u043b\u0443 &Latex
+LatexNodeHookAction.tooltip= <html>\u0424\u043e\u0440\u043c\u0443\u043b\u0430 Latex</html>
+less_than_two_selected_nodes = \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430
+license_text = Freeplane - \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\nCopyright (C) 2000-2008 Joerg Mueller <joergmueller at bigfoot.com>\n\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b COPYING \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u [...]
+LicenseAction.text= \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f
+link_not_available_any_more = \u0421\u0432\u044f\u0437\u044c \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430, \u0443\u0437\u0435\u043b \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0435\u043d
+load = &\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
+
+long_node_changed_cancel =\u0412\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0443\u0437\u0435\u043b. \u0425\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439?
+long_node_changed_submit =\u0412\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0443\u0437\u0435\u043b. \u0425\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f?
+lots_of_links_warning = \u0412\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u0432\u044f\u0437\u0435\u0439 \u0441\u0440\u0430\u0437\u0443. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0442\u0438\u0442\u0435?
+map_already_exists = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e?
+map_corrupted = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d. \u0421\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438?
+map_not_saved=\u042d\u0442\u0430 \u043a\u0430\u0440\u0442\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0440\u0430\u043d\u0435\u0435
+MapBackgroundColorAction.text=\u0424\u043e\u043d \u043a\u0430\u0440\u0442\u044b
+menu_attributes = \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+menu_extras = &\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e
+ExportAction.text = &\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+menu_file_import = &\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+menu_filter=\u0424&\u0438\u043b\u044c\u0442\u0440
+menu_format = \u0424&\u043e\u0440\u043c\u0430\u0442
+menu_insert = \u0412\u0441\u0442&\u0430\u0432\u043a\u0430
+menu_navigate = &\u0423\u0437\u0435\u043b
+menu_view = &\u0412\u0438\u0434
+mindmap = \u0410\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430
+mindmaps = &\u041a\u0430\u0440\u0442\u044b
+mindmaps_desc = \u041a\u0430\u0440\u0442\u044b (*.mm)
+mindmaps_filter_desc = \u0424\u0438\u043b\u044c\u0442\u0440\u044b (*.mmfilter)
+mode_Browse=\u0420\u0435\u0436\u0438\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430
+mode_File=\u0424\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c
+mode_MindMap=\u0420\u0435\u0436\u0438\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442-\u043a\u0430\u0440\u0442\u044b
+mode_na = \u0420\u0435\u0436\u0438\u043c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d
+mode_status = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0440\u0435\u0436\u0438\u043c {0}
+mode_title =Freeplane - {0}
+modes = \u0420\u0435\u0436\u0438\u043c\u044b
+most_recent_files = &\u041d\u0435\u0434\u0430\u0432\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u044b
+MoveToRootAction.text= \u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b
+NavigationNextMapAction.text= \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u0430\u0440\u0442\u0430
+NavigationPreviousMapAction.text= \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043a\u0430\u0440\u0442\u0430
+new_mindmap = \u041d\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430
+new_node = \u041d\u043e\u0432\u044b\u0439 \u0443\u0437\u0435\u043b
+new_node_as_sibling_not_possible_for_the_root = \u0423 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+NewChildAction.text= \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
+NewMapAction.text= \u0421\u043e\u0437\u0434&\u0430\u0442\u044c
+NewParentNode.text= \u041e\u0431\u0449\u0438\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0443\u0437\u0435\u043b
+NewParentNode.tooltip= <html>\u0412\u0441\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u043e\u0431\u0449\u0438\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0443\u0437\u0435\u043b</html>
+NewPreviousSiblingAction.text= \u041d\u043e\u0432\u044b\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043a\u0443\u0449\u0438\u043c
+NewSiblingAction.text= \u041d\u043e\u0432\u044b\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e
+no = \u041d\u0435\u0442
+no_format_copy_before_format_paste = \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442, \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+no_previous_find = \u0411\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0438\u0445 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043d\u0435\u0442.
+node = \u0423\u0437\u0435\u043b
+node_changed_discard_changes = \u0412\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0443\u0437\u0435\u043b. \u0425\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439?
+node_is_write_protected=\u0423\u0437\u0435\u043b-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0437\u0430\u0449\u0438\u0449\u0435\u043d \u043e\u0442 \u0437\u0430\u043f\u0438\u0441\u0438
+node_location_help=\u041f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430, <ctrl>+\u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\ [...]
+NodeBackgroundColorAction.text= &\u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u0443\u0437\u043b\u0430
+NodeColorAction.text= \u0426\u0432\u0435\u0442 \u0443\u0437\u043b\u0430...
+NodeColorBlendAction.text= \u0412\u044b\u0441\u0432\u0435\u0442\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b
+NodeDownAction.text= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u0437
+NodeListAction.text=\u041d\u0430\u0439\u0442\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c...
+NodeListAction.tooltip=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u043a\u0430\u043a \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c.
+NodeShapeAction.bubble.text= \u0422\u0438\u043f \u0443\u0437\u043b\u0430 "&\u041e\u0432\u0430\u043b"
+NodeShapeAction.fork.text= \u0422\u0438\u043f \u0443\u0437\u043b\u0430 "&\u041a\u0440\u0438\u0432\u0430\u044f"
+NodeUpAction.text= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0432\u0435\u0440\u0445
+nonboldify_branch = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u043e\u0435 \u043d\u0430\u0447\u0435\u0440\u0442\u0430\u043d\u0438\u0435
+nonitalicise_branch = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u043d\u0430\u0447\u0435\u0440\u0442\u0430\u043d\u0438\u0435
+normal = \u041e\u0431\u044b\u0447\u043d\u044b\u0439
+not_saved_for_link_error = \u041a\u0430\u0440\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438
+note_window_location =\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0439
+ok = OK
+OpenAction.text= \u041e\u0442\u043a\u0440\u044b\u0442\u044c
+OpenFreeplaneSiteAction.text=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Freeplane
+UpdateCheckAction.text=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f
+option_changes_may_require_restart=\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432\u0441\u0442\u0443\u043f\u0438\u0442 \u0432 \u0441\u0438\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.
+OptionalDontShowMeAgainDialog.cancel=&\u041d\u0435\u0442
+OptionalDontShowMeAgainDialog.dontShowAgain=&\u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c.
+OptionalDontShowMeAgainDialog.ok=&\u0414\u0430
+OptionalDontShowMeAgainDialog.rememberMyDescision=&\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043c\u043e\u0439 \u0432\u044b\u0431\u043e\u0440.
+OptionPanel.absolute=\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e
+OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=\u0410\u0432\u0442\u043e\u0444\u043e\u0440\u043c\u0430\u0442
+OptionPanel.always_fold_all_after_load=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
+OptionPanel.always_save_folding_state.tooltip=\u0415\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e, \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435/\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0438 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043e \u043d\u0435\u043e\u0431\u0445\u0 [...]
+OptionPanel.always_save_folding_state=\u0412\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f
+OptionPanel.always_save_folding=\u0432\u0441\u0435\u0433\u0434\u0430
+OptionPanel.always_unfold_all_after_load=\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
+OptionPanel.antialias.tooltip=<html>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.</html>
+OptionPanel.antialias_all=\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0451
+OptionPanel.antialias_edges=\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0451\u0431\u0440\u0430
+OptionPanel.antialias_none=\u041d\u0435 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c
+OptionPanel.antialias=\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435
+OptionPanel.Appearance=\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434
+OptionPanel.ar=\u0410\u0440\u0430\u0431\u0441\u043a\u0438\u0439
+OptionPanel.as_parent=\u041a\u0430\u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c
+OptionPanel.ask=\u0421\u043f\u0440\u043e\u0441\u0438\u0442\u044c
+OptionPanel.automatic=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438
+OptionPanel.automaticFormat_level=\u0421\u0442\u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
+OptionPanel.automaticFormat_level1=\u0424\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+OptionPanel.automaticFormat_level2=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f
+OptionPanel.Behaviour=\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435
+OptionPanel.bezier=\u041a\u0440\u0438\u0432\u0430\u044f
+OptionPanel.bubble=\u041e\u0432\u0430\u043b
+OptionPanel.Cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+OptionPanel.center_selected_node=\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0437\u043b\u044b
+OptionPanel.childpattern.tooltip=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c.
+OptionPanel.childpattern=\u041e\u0431\u0440\u0430\u0437\u0435\u0446 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+OptionPanel.clear_all_setters.tooltip=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b
+OptionPanel.clear_all_setters=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435
+OptionPanel.combined=\u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439
+OptionPanel.convert_to_current_version.tooltip=<html>\u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u0430\u0440\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c <br>(\u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0 [...]
+OptionPanel.convert_to_current_version=<html>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Freeplane <br>\u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438</html>
+OptionPanel.cs=\u0427\u0435\u0448\u0441\u043a\u0438\u0439
+OptionPanel.cut_nodes_without_question.tooltip=\u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0443\u0437\u043b\u044b \u0432\u044b\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u0435\u0440\ [...]
+OptionPanel.cut_nodes_without_question=\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0443\u0437\u043b\u044b \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f
+OptionPanel.de=\u041d\u0435\u043c\u0435\u0446\u043a\u0438\u0439
+OptionPanel.default_browser_command_mac.tooltip=<html> \u0438 MAC: (\u0441\u043f\u0430\u0441\u0438\u0431\u043e \u041d\u0438\u043a\u0443)</html>
+OptionPanel.default_browser_command_mac=\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f Mac
+OptionPanel.default_browser_command_other_os.tooltip=<html> \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e Linux:</html>
+OptionPanel.default_browser_command_other_os=\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u043f\u0440\u043e\u0447\u0438\u0445 \u041e\u0421
+OptionPanel.default_browser_command_windows_9x.tooltip=<html>\u0414\u043b\u044f Windows (\u043a\u0430\u0432\u044b\u0447\u043a\u0438 "" \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0438\u0437-\u0437\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 (URL), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 "=").</html>
+OptionPanel.default_browser_command_windows_9x=\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f Windows 9x
+OptionPanel.default_browser_command_windows_nt.tooltip=<html>\u0414\u043b\u044f Windows (\u043a\u0430\u0432\u044b\u0447\u043a\u0438 "" \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0438\u0437-\u0437\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 (URL), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 "=").</html>
+OptionPanel.default_browser_command_windows_nt=\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f Windows NT
+OptionPanel.default=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442
+OptionPanel.defaultfont.tooltip=<html>\u0428\u0440\u0438\u0444\u0442 \u0443\u0437\u043b\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0448\u0440\u0438\u0444\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0443 [...]
+OptionPanel.defaultfont=\u0428\u0440\u0438\u0444\u0442
+OptionPanel.defaultfontsize=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
+OptionPanel.defaultfontstyle=\u0421\u0442\u0438\u043b\u044c \u0448\u0440\u0438\u0444\u0442\u0430
+OptionPanel.Defaults=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b
+OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> \u041f\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0433\u0430\u043b\u043e\u0447\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0431\u044b\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u04 [...]
+OptionPanel.delete_automatic_saves_at_exit=\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439?
+OptionPanel.delete_nodes_without_question.tooltip=\u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0436\u043e\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0443\u0437\u043b\u044b \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u [...]
+OptionPanel.delete_nodes_without_question=\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f
+OptionPanel.disable_cursor_move_paper.tooltip=<html>\u041d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u0443\u0440\u0441\u043e\u0440 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b</html>
+OptionPanel.disable_cursor_move_paper=\u0421\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043a\u0443\u0440\u0441\u043e\u0440 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043a\u0430\u0440\u0442\u044b
+
+
+OptionPanel.dk=\u0414\u0430\u0442\u0441\u043a\u0438\u0439
+
+OptionPanel.draganddrop.tooltip=<html>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u044b</html>
+OptionPanel.draganddrop=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Drag && Drop
+OptionPanel.edgecolor.tooltip=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430 \u0434\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 (\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c)
+OptionPanel.edgecolor=\u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
+OptionPanel.edgestyle.tooltip=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430 \u0434\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 (\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c)
+OptionPanel.edgestyle=\u0421\u0442\u0438\u043b\u044c \u0440\u0435\u0431\u0440\u0430
+OptionPanel.edgewidth.tooltip=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430 \u0434\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 (\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c)
+OptionPanel.EdgeWidth_1=1
+OptionPanel.EdgeWidth_2=2
+OptionPanel.EdgeWidth_4=4
+OptionPanel.EdgeWidth_8=8
+OptionPanel.EdgeWidth_parent=\u041a\u0430\u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c
+OptionPanel.EdgeWidth_thin=\u0442\u043e\u043d\u043a\u0438\u0439
+OptionPanel.edgewidth=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430
+OptionPanel.el__buttons_above=\u041a\u043d\u043e\u043f\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443
+
+OptionPanel.el__enter_confirms_by_default=<\u0412\u0412\u041e\u0414> \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0430\u043b\u043e\u0433
+OptionPanel.el__max_default_window_height=\u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043a\u043d\u0430
+OptionPanel.el__max_default_window_width=\u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u043a\u043d\u0430
+OptionPanel.el__min_default_window_height=\u041d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043a\u043d\u0430
+OptionPanel.el__min_default_window_width=\u041d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u043a\u043d\u0430
+OptionPanel.el__position_window_below_node=\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438
+OptionPanel.show_icon_for_attributes=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432
+OptionPanel.el=\u0413\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439
+OptionPanel.en=\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439
+
+
+OptionPanel.Environment=\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435
+OptionPanel.es=\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439
+OptionPanel.et=\u042d\u0441\u0442\u043e\u043d\u0441\u043a\u0438\u0439
+OptionPanel.execute_scripts_without_asking.tooltip=<html>\u0421\u043a\u0440\u0438\u043f\u0442\u044b Freeplane \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u041f\u041a. <br>\u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u0432\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u04 [...]
+OptionPanel.execute_scripts_without_asking=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0431\u0435\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430
+OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u043e\u0441\u043e\u0431\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0445\u043e\u0442\u044f\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440) \u0431\u043 [...]
+OptionPanel.execute_scripts_without_exec_restriction=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u041d\u0415 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)
+OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u043e\u0442\u043a\u0440\u044b\u0442\u044c, \u0437\u0430\u043a\u0440 [...]
+OptionPanel.execute_scripts_without_file_restriction=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 (\u041d\u0415 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)
+OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f,<br>\u0432\u043a\u043b\u044e\u0447\u [...]
+OptionPanel.execute_scripts_without_network_restriction=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0435\u0442\u044c\u044e (\u041d\u0415 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)
+OptionPanel.experimental_file_locking_on.tooltip=<html> \u041f\u0440\u043e\u0431\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f</html>
+OptionPanel.experimental_file_locking_on=(\u041f\u0440\u043e\u0431\u043d\u0430\u044f) \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432
+OptionPanel.export_icons_in_html.tooltip=<html> \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 HTML \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u042d\u0442\u0438 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u [...]
+OptionPanel.export_icons_in_html=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c \u0432 HTML
+OptionPanel.Files=\u0424\u0430\u0439\u043b\u044b
+OptionPanel.first=\u041f\u0435\u0440\u0432\u044b\u0439
+OptionPanel.foldingsymbolwidth.tooltip=<html> \u0420\u0430\u0437\u043c\u0435\u0440 \u0437\u043d\u0430\u043a\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u0443\u0437\u0435\u043b<html>
+OptionPanel.foldingsymbolwidth=\u0420\u0430\u0437\u043c\u0435\u0440 \u0437\u043d\u0430\u043a\u0430 \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.fork=\u0412\u0435\u0442\u043a\u0430
+OptionPanel.fr=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439
+OptionPanel.gl=\u0413\u0430\u043b\u0438\u0441\u0438\u0439\u0441\u043a\u0438\u0439
+OptionPanel.gtk=Gtk
+OptionPanel.hr=\u0425\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439
+OptionPanel.html_export_based_on_headings=\u041f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c
+OptionPanel.html_export_fold_all=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0451
+OptionPanel.html_export_fold_currently_folded=\u041a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435
+OptionPanel.html_export_folding=\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435 \u0432 HTML
+OptionPanel.html_export_no_folding=\u0411\u0435\u0437 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f
+OptionPanel.HTML=HTML
+OptionPanel.hu=\u0412\u0435\u043d\u0433\u0435\u0440\u0441\u043a\u0438\u0439
+OptionPanel.icon.tooltip=\u0423 \u0443\u0437\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0430 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430
+OptionPanel.icons.list.tooltip=\u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438. \u0418\u043a\u043e\u043d\u043a\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b [...]
+OptionPanel.icon=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430
+OptionPanel.icons.list=\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c
+OptionPanel.id=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438\u0439
+OptionPanel.it=\u0418\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0438\u0439
+OptionPanel.ja=\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0439
+
+
+OptionPanel.Keystrokes=\u041a\u043b\u0430\u0432\u0438\u0448\u0438
+OptionPanel.kr=\u041a\u043e\u0440\u0435\u0439\u0441\u043a\u0438\u0439
+OptionPanel.language.tooltip=<html>\u042f\u0437\u044b\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439. '\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438' \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u044b</html>
+OptionPanel.language=\u042f\u0437\u044b\u043a
+OptionPanel.last_opened_list_length=\u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0447\u043d\u044f \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432
+OptionPanel.last=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439
+OptionPanel.level=\u0423\u0440\u043e\u0432\u0435\u043d\u044c
+OptionPanel.level1=\u0424\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+OptionPanel.level2=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f
+OptionPanel.level3=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f
+OptionPanel.level4=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f
+OptionPanel.level5=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439
+OptionPanel.linear=\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439
+OptionPanel.links.tooltip=<html>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043b\u0438\u0431\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438, \u043b\u0438\u0431\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c\u0438</html>
+OptionPanel.links=\u0421\u0441\u044b\u043b\u043a\u0438
+OptionPanel.load_folding_from_map_default_fold_all=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437 \u043a\u0430\u0440\u0442\u044b \u0438\u043b\u0438 \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
+OptionPanel.load_folding_from_map_default_unfold_all=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437 \u0444\u043e\u0440\u043c\u044b \u0438\u043b\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
+OptionPanel.load_folding=\u041f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435
+OptionPanel.load_last_map.tooltip=<html>\u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u0430\u0440\u0442\u0443.</html>
+OptionPanel.load_last_map=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u0430\u0440\u0442\u0443
+OptionPanel.lookandfeel.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'metal','windows','motif', 'gtk'.<br>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 'mac' \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0442\u043e\u043b\u044c\u043a\ [...]
+OptionPanel.lookandfeel=\u0421\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f
+OptionPanel.lt=\u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438\u0439
+OptionPanel.mapxsize.tooltip=<html>\u0428\u0438\u0440\u0438\u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b</html>
+OptionPanel.mapxsize=\u0428\u0438\u0440\u0438\u043d\u0430 \u043a\u0430\u0440\u0442\u044b
+OptionPanel.mapysize=\u0412\u044b\u0441\u043e\u0442\u0430 \u043a\u0430\u0440\u0442\u044b
+OptionPanel.max_node_width.tooltip=<html>\u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445</html>
+OptionPanel.max_node_width=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445.</html>
+OptionPanel.toolTipManager.max_tooltip_width=\u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438
+OptionPanel.metal=\u041c\u0435\u0442\u0430\u043b\u043b
+OptionPanel.motif=Motif
+OptionPanel.nb=\u041d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 Bokm\u00e5l
+OptionPanel.never_save_folding=\u043d\u0438\u043a\u043e\u0433\u0434\u0430
+OptionPanel.nl=\u0413\u043e\u043b\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
+OptionPanel.nn=\u041d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 Nynorsk
+OptionPanel.nodebackgroundcolor.tooltip=\u0424\u043e\u043d \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+OptionPanel.nodebackgroundcolor=\u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u0443\u0437\u043b\u0430
+OptionPanel.nodecolor.tooltip=\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+OptionPanel.nodecolor=\u0426\u0432\u0435\u0442 \u0443\u0437\u043b\u0430
+
+OptionPanel.nodefontbold=\u0416\u0438\u0440\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442
+
+OptionPanel.nodefontitalic=\u041a\u0443\u0440\u0441\u0438\u0432
+
+OptionPanel.nodefontname=\u0428\u0440\u0438\u0444\u0442 \u0443\u0437\u043b\u0430
+
+OptionPanel.nodefontsize=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0443\u0437\u043b\u0430
+OptionPanel.nodeshape.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0444\u043e\u0440\u043c\u0443 \u0443\u0437\u043b\u0430. <br>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\:<br><table border\="1"><tr><td>fork\: </td><td>\u0431\u0435\u0437 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0440\u0430\u043c\u043a\u0438,</t [...]
+OptionPanel.nodeshape=\u0421\u0442\u0438\u043b\u044c \u0443\u0437\u043b\u0430
+OptionPanel.nodetext.tooltip=\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u043a\u0441\u0442 \u0443\u0437\u043b\u0430. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0451\u043d \u043d\u0430 \u043d\u043e\u0432\u044b\u0439.
+OptionPanel.nodetext=\u0422\u0435\u043a\u0441\u0442 \u0443\u0437\u043b\u0430
+OptionPanel.nothing=\u041d\u0438\u0447\u0435\u0433\u043e
+OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> \u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0441\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b, \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\ [...]
+OptionPanel.number_of_different_files_for_automatic_save=\u0427\u0438\u0441\u043b\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439
+OptionPanel.OK=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
+
+
+OptionPanel.patternname.tooltip=\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043e\u0431\u0440\u0430\u0437\u0446\u0430
+OptionPanel.patternname=\u0418\u043c\u044f
+
+OptionPanel.pl=\u041f\u043e\u043b\u044c\u0441\u043a\u0438\u0439
+OptionPanel.placenewbranches.tooltip=<html>\u0413\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0443\u0437\u043b\u044b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f "\u043f\u0435\u0440\u0432\u044b\u0439" \u0438 "\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439" </html>
+OptionPanel.placenewbranches=\u041f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.plugins/scripting/tab_name=\u0421\u043a\u0440\u0438\u043f\u0442\u044b
+OptionPanel.printonwhitebackground.tooltip=<html>\u0412\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u0438 \u0431\u0435\u043b\u044b\u0439 \u0444\u043e\u043d</html>
+OptionPanel.printonwhitebackground=<html>\u041f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u043d\u0430 \u0431\u0435\u043b\u043e\u043c \u0444\u043e\u043d\u0435</html>
+OptionPanel.pt_BR=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439 (\u0411\u0440\u0430\u0437\u0438\u043b\u0438\u044f)
+OptionPanel.pt_PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439 (\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u044f)
+OptionPanel.relative=\u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e
+OptionPanel.remind_type_of_new_nodes.tooltip=<html>"\u0421\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c" \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0432\u0430\u0441 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0441\u043b\u0438 \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u0435\u0442\u0435\u0441\u044c).<br>"\u0414\u0430" \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u [...]
+OptionPanel.remind_use_rich_text_in_new_long_nodes=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.remove_notes_without_question.tooltip=\u0415\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u042d\u0442\u04 [...]
+OptionPanel.remove_notes_without_question=\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f
+OptionPanel.resources_use_default_font_for_notes_too=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f\u043c \u0448\u0440\u0438\u0444\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
+OptionPanel.resources_use_margin_top_zero_for_notes=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0435\u0435 \u043f\u043e\u043b\u0435 \u0443 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0439
+OptionPanel.revision_color.tooltip=\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432.
+OptionPanel.revision_color=\u0426\u0432\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439
+OptionPanel.ru=\u0420\u0443\u0441\u0441\u043a\u0438\u0439
+OptionPanel.save_folding_if_map_is_changed=\u0435\u0441\u043b\u0438 \u043a\u0430\u0440\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430
+OptionPanel.save_folding=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0432\u0451\u0440\u0442\u043a\u0443
+OptionPanel.save_modification_times=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439
+OptionPanel.save_only_intrisically_needed_ids.tooltip=\u041a\u043e\u0433\u0434\u0430 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e, ID \u0443\u0437\u043b\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u043a\u0430\u0440\u0442\u0435. \u0422\u0430\u043a \u0436\u0435, \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 [...]
+OptionPanel.save_only_intrisically_needed_ids=\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0443\u0437\u043b\u043e\u0432
+OptionPanel.script.tooltip=\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 Groovy-\u0441\u043a\u0440\u0438\u043f\u0442\u0430.
+OptionPanel.script_user_key_name_for_signing.tooltip=<html>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043a\u043b\u044e\u0447\u0430 \u0437\u0434\u0435\u0441\u044c. <br>\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e [...]
+OptionPanel.script_user_key_name_for_signing=\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043a\u043b\u044e\u0447\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438
+OptionPanel.script=\u0421\u043a\u0440\u0438\u043f\u0442
+OptionPanel.se=\u0428\u0432\u0435\u0434\u0441\u043a\u0438\u0439
+OptionPanel.selection_method.tooltip=<html> \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c/\u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0443\u0437\u043b\u0430 \u0441 \u0437\u0430\u0434\u0435\u0440\u043 [...]
+OptionPanel.selection_method_by_click=\u0429\u0435\u043b\u0447\u043a\u043e\u043c
+OptionPanel.selection_method_delayed=\u0421 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439
+OptionPanel.selection_method_direct=\u0421\u0440\u0430\u0437\u0443
+OptionPanel.selection_method=\u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0431\u043e\u0440\u0430 \u0443\u0437\u043b\u0430
+OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName=\u041e\u0431\u0440\u0430\u0437\u0446\u044b
+OptionPanel.separator.anti_alias=\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435
+OptionPanel.separator.attributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+OptionPanel.separator.automatic_save=\u0410\u0432\u0442\u043e\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435
+OptionPanel.separator.behaviour=\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435
+OptionPanel.separator.browser=\u041d\u0430\u0432\u0438\u0433\u0430\u0442\u043e\u0440
+OptionPanel.separator.commands_for_the_program=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439
+OptionPanel.separator.default_colors=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0446\u0432\u0435\u0442
+OptionPanel.separator.default_fonts=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442
+OptionPanel.separator.default_styles=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c
+OptionPanel.separator.EdgeControls=\u0420\u0451\u0431\u0440\u0430
+OptionPanel.separator.edit_long_node_window=\u041e\u043a\u043d\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.separator.files=\u0424\u0430\u0439\u043b\u044b
+OptionPanel.separator.General=\u041e\u0431\u0449\u0438\u0435
+OptionPanel.separator.html_export=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML
+OptionPanel.separator.html_import=\u0418\u043c\u043f\u043e\u0440\u0442 HTML
+OptionPanel.separator.hyperlink_types=\u0422\u0438\u043f\u044b \u0441\u0441\u044b\u043b\u043e\u043a
+OptionPanel.separator.icon_properties=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
+OptionPanel.separator.icons=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 "\u0412\u044b\u0431\u043e\u0440 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b..."
+OptionPanel.separator.initial_map_size=\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b
+OptionPanel.separator.key_typing=\u0412\u0432\u043e\u0434 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b
+OptionPanel.separator.language=\u042f\u0437\u044b\u043a
+OptionPanel.separator.load=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
+OptionPanel.separator.look_and_feel=\u0421\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f
+OptionPanel.separator.mouse_wheel=\u041a\u043e\u043b\u0435\u0441\u043e \u043c\u044b\u0448\u0438
+OptionPanel.separator.new_node_commands=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.separator.node_editing_commands=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.separator.node_navigation_commands=\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f
+OptionPanel.separator.NodeColors=\u0426\u0432\u0435\u0442\u0430 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.separator.NodeFont=\u0428\u0440\u0438\u0444\u0442 \u0443\u0437\u043b\u0430
+OptionPanel.separator.NodeStyles=\u0421\u0442\u0438\u043b\u0438 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.separator.notifications=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f
+OptionPanel.separator.other_defaults=\u041f\u0440\u043e\u0447\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b
+OptionPanel.separator.others=\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
+OptionPanel.separator.patterns=\u041e\u0431\u0440\u0430\u0437\u0446\u044b
+OptionPanel.separator.plugins/scripting/separatorPropertyName=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f
+OptionPanel.separator.root_node_appearance=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+OptionPanel.separator.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
+OptionPanel.separator.ScriptingControl=\u0421\u043a\u0440\u0438\u043f\u0442\u044b
+OptionPanel.separator.selection_colors=\u0426\u0432\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f
+OptionPanel.separator.selection_method=\u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0431\u043e\u0440\u0430 \u0443\u0437\u043b\u0430
+OptionPanel.separator.undo=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+OptionPanel.set_property_text.tooltip=\u041f\u0443\u0441\u0442\u043e:\u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c; \u041c\u0438\u043d\u0443\u0441=\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435); \u041f\u043b\u044e\u0441=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c
+OptionPanel.set_property_text=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c
+OptionPanel.setscript.tooltip=\u0421\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u0441\u0442\u0438\u043b\u044e.
+OptionPanel.setscript=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c
+OptionPanel.sharp_bezier=\u043e\u0441\u0442\u0440\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f
+OptionPanel.sharp_linear=\u043e\u0441\u0442\u0440\u0430\u044f \u043f\u0440\u044f\u043c\u0430\u044f
+OptionPanel.show_node_tooltips=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432
+OptionPanel.signed_script_are_trusted.tooltip=\u0415\u0441\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438 \u043b\u0438\u0446\u0430\u043c\u0438 (\u0442.\u0435. \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438 Freeplane \u0438\u043b\u0438 \u0432\u0430\u043c\u0438), \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0435 [...]
+OptionPanel.signed_script_are_trusted=\u0414\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f).
+OptionPanel.sk=\u0421\u043b\u043e\u0432\u0430\u0446\u043a\u0438\u0439
+OptionPanel.sl=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438\u0439
+OptionPanel.standardbackgroundcolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u044f (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 #RRGGBB)</html>
+OptionPanel.standardbackgroundcolor=\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430
+OptionPanel.standardcloudcolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u044f (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 #RRG [...]
+OptionPanel.standardcloudcolor=\u0426\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u043e\u0432
+OptionPanel.standardcloudestyle.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u043e\u0431\u043b\u0430\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e "\u0411\u0435\u0437\u044c\u0435"</html>
+OptionPanel.standardcloudestyle=\u0422\u0438\u043f \u043e\u0431\u043b\u0430\u043a\u043e\u0432
+OptionPanel.standarddrawrectangleforselection.tooltip=<html>\u0420\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438.</html>
+OptionPanel.standarddrawrectangleforselection=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\u0445
+OptionPanel.standardedgecolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0426\u0432\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u04 [...]
+OptionPanel.standardedgecolor=\u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
+OptionPanel.standardedgestyle.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u0440\u0435\u0431\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f "\u043f\u0440\u044f\u043c\u0430\u044f" \u0438 "\u043a\u0440\u0438\u0432\u0430\u044f" - \u043a\u0440\u0438\u0432\u0430\u044f \u0411\u0435\u0437\u044c\u0435</html>
+OptionPanel.standardedgestyle=\u0421\u0442\u0438\u043b\u044c \u0440\u0435\u0431\u0440\u0430
+OptionPanel.standardlinkcolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u043b\u0438\u043d\u0438\u0438, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u044f (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e [...]
+OptionPanel.standardlinkcolor=\u0426\u0432\u0435\u0442 \u0441\u0432\u044f\u0437\u0438
+OptionPanel.standardlinkestyle.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u0441\u0432\u044f\u0437\u0435\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0438\u0432\u0430\u044f \u0411\u0435\u0437\u044c\u0435</html>
+OptionPanel.standardlinkestyle=\u0421\u0442\u0438\u043b\u044c \u0441\u0432\u044f\u0437\u0438
+OptionPanel.standardnodeshape.tooltip=<html>\u0422\u0438\u043f \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f "\u041a\u0440\u0438\u0432\u0430\u044f", "\u041e\u0432\u0430\u043b", "\u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439" \u0438 "\u041a\u0430\u043a \u0440\u043e [...]
+OptionPanel.standardnodeshape=\u0422\u0438\u043f \u0443\u0437\u043b\u043e\u0432
+OptionPanel.standardnodetextcolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u0443\u0437\u043b\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412 HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 #RRGGBB)</html>
+OptionPanel.standardnodetextcolor=\u0426\u0432\u0435\u0442 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.standardrootnodeshape.tooltip=<html>\u0422\u0438\u043f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f "\u041a\u0440\u0438\u0432\u0430\u044f", "\u041e\u0432\u0430\u043b" \u0438 "\u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439"</html>
+OptionPanel.standardrootnodeshape=\u0422\u0438\u043f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+OptionPanel.standardselectednodecolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412 HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 #RRGGBB)</html>
+OptionPanel.standardselectednodecolor=\u0426\u0432\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+OptionPanel.standardselectednoderectanglecolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u043e\u0442\u043c\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b. \u0426\u0432\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 (\u0448\u0435\u0441\u0442 [...]
+OptionPanel.standardselectednoderectanglecolor=\u0426\u0432\u0435\u0442 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
+OptionPanel.structured_html_import=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c HTML \u043a\u0430\u043a \u0441\u0445\u0435\u043c\u0443 \u0443\u0437\u043b\u043e\u0432
+
+OptionPanel.time_for_automatic_save.tooltip=<html> \u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0438\u043b\u0438\u0441\u0435\u043a\ [...]
+OptionPanel.time_for_automatic_save=\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0443\u043d\u0442\u043e\u0432
+OptionPanel.time_for_delayed_selection.tooltip=<html> \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0443\u0437\u0435\u043b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c, \u043a\u043e\u0433\u0434\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043c\u044b\u0448\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441 [...]
+OptionPanel.time_for_delayed_selection=\u0412\u0440\u0435\u043c\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438
+OptionPanel.tr=\u0422\u0443\u0440\u0435\u0446\u043a\u0438\u0439
+OptionPanel.uk_UA=\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438\u0439
+OptionPanel.undefined_font=\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u043e
+OptionPanel.undo_levels.tooltip=<html>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c.</html>
+OptionPanel.undo_levels=\u0427\u0438\u0441\u043b\u043e \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439
+OptionPanel.unfold_on_paste.tooltip=\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0443\u0437\u0435\u043b \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0438
+OptionPanel.unfold_on_paste=\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0443\u0437\u0435\u043b \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435
+OptionPanel.use_common_out_point_for_root_node.tooltip=<html>\u0412\u0435\u0442\u0432\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u043e\u0447\u0435\u043a, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u043b\u0435\u0432\u043e\u043c \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043a\u0440\u0430\u044e \u044d\u043b\u043b\u0438\u043f\u0441\u0430, \u043e\u0431\u [...]
+OptionPanel.use_common_out_point_for_root_node=\u0412\u0435\u0442\u0432\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+OptionPanel.use_tabbed_pane.tooltip=\u0415\u0441\u043b\u0438 \u043e\u043f\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430, \u043a\u0430\u0440\u0442\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0432\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0430\u0445 (\u043a\u0430\u043a \u0432 FireFox).
+OptionPanel.use_tabbed_pane=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438
+OptionPanel.userproperties=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
+OptionPanel.vi=\u0412\u044c\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438\u0439
+OptionPanel.wheel_velocity.tooltip=\u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043b\u0435\u0441\u0438\u043a\u0430.
+OptionPanel.wheel_velocity=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c
+OptionPanel.windows=Windows
+OptionPanel.zh_CN=\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439
+OptionPanel.zh_TW=\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439
+PageAction.text= \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b &\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b...
+PasteAction.text= \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c
+PatternNewNameProperty=\u041d\u043e\u0432\u044b\u0439 \u0441\u0442\u0438\u043b\u044c
+PatternToString.backgroundColor=\u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442
+PatternToString.Child=\u0421\u0442\u0438\u043b\u044c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+PatternToString.color=\u0426\u0432\u0435\u0442
+PatternToString.EdgeColor=\u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
+PatternToString.EdgeStyle=\u0422\u0438\u043f \u043b\u0438\u043d\u0438\u0438 \u0440\u0435\u0431\u0440\u0430
+PatternToString.EdgeWidth=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430
+PatternToString.FontBold=\u0416\u0438\u0440\u043d\u044b\u0439
+PatternToString.FontItalic=\u041d\u0430\u043a\u043b\u043e\u043d\u043d\u044b\u0439
+PatternToString.FontName=\u0418\u043c\u044f \u0448\u0440\u0438\u0444\u0442\u0430
+PatternToString.Icon=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430
+PatternToString.NodeFontSize=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
+
+plugins/latex/LatexNodeHook.editorTitle = Latex \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440.
+plugins/ScriptEditor.cancel=&\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438
+plugins/ScriptEditor.exit=&\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u044b\u0439\u0442\u0438
+plugins/ScriptEditor.FORBIDDEN_ACTION=\u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432 Freeplane \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b. \u0421\u043b\u0435\u0434\u0443\u0449\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f {0,choice,0\#File|1\#Network|2\#Exec} \: {1,choice,0\#Accept|1\#Connect|2\#Listen|3\#Multicast|4\#SetFactory|5\#Exec|6\#Link [...]
+plugins/ScriptEditor.menu_actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
+plugins/ScriptEditor.new_script=\u041d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442
+plugins/ScriptEditor.run=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c
+plugins/ScriptEditor.sign=\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442...
+plugins/ScriptEditor/window.Result=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:
+plugins/ScriptEditor/window.title=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432
+plugins/TimeList.xml_Created=\u0421\u043e\u0437\u0434\u0430\u043d
+plugins/TimeList.xml_Date=\u0414\u0430\u0442\u0430
+plugins/TimeList.xml_Icons=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
+plugins/TimeList.xml_Modified=\u0418\u0437\u043c\u0435\u043d\u0435\u043d
+plugins/TimeList.xml_Notes=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f
+plugins/TimeList.xml_Text=\u0422\u0435\u043a\u0441\u0442
+plugins/TimeManagement.xml_appendButton= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0442\u0443 \u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c
+plugins/TimeManagement.xml_Cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+plugins/TimeManagement.xml_cancelButton=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+plugins/TimeManagement.xml_closeButton=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
+plugins/TimeManagement.xml_Export=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
+plugins/TimeManagement.xml_Find=\u041d\u0430\u0439\u0442\u0438
+plugins/TimeManagement.xml_Goto=\u041f\u0435\u0440\u0435\u0439\u0442\u0438
+plugins/TimeManagement.xml_hour= \u0427\u0430\u0441:
+plugins/TimeManagement.xml_menu_actions=\u041a\u043e\u043c\u0430\u043d\u0434\u044b
+plugins/TimeManagement.xml_minute= \u041c\u0438\u043d\u0443\u0442\u0430:
+plugins/TimeManagement.xml_reminderButton_tooltip=<html>\u0412 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u0438\u0433\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u0442 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435\u043c, - \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u0430 \u043f\u0440\u043e\u0433\ [...]
+plugins/TimeManagement.xml_reminderButton= \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c
+plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441 \u0443\u0437\u043b\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0434\u0430\u0442\u0443<br>\u0423\u0436\u0435 \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043e {0,date} {0,time}, \u0412\u044b \u0432\u0432\u043e\u0434\u0438\u0442\u0435 {1,date} {1,time}. <br><br>\u0418\u0437\u043c\u0435\u043d\u0438\ [...]
+
+plugins/TimeManagement.xml_reminderNode_tooltip=\u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u043d\u0430 {0,date} \u0432 {0,time}
+plugins/TimeManagement.xml_removeReminderButton = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
+plugins/TimeManagement.xml_removeReminderButton_tooltip = \u041e\u0442\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+plugins/TimeManagement.xml_Replace_All=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435
+plugins/TimeManagement.xml_Replace_Selected=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0435
+plugins/TimeManagement.xml_Replace=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c
+plugins/TimeManagement.xml_Select=\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c
+plugins/TimeManagement.xml_todayButton=\u0421\u0435\u0433\u043e\u0434\u043d\u044f
+plugins/TimeManagement.xml_WindowTitle_All_Nodes=\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430
+plugins/TimeManagement.xml_WindowTitle=\u0412\u0440\u0435\u043c\u044f
+preferences = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
+print_preview_title = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440
+PrintAction.text= &\u041f\u0435\u0447\u0430\u0442\u044c...
+PrintDirectAction.text= \u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c
+printing_settings = \u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u043f\u0435\u0447\u0430\u0442\u0438
+PrintPreviewAction.text= \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440...
+PropertyAction.text=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 ...
+QuitAction.text= \u0412&\u044b\u0445\u043e\u0434
+read_only = \u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f
+
+#automatic translated values
+#Sat Oct 31 21:30:34 CET 2009
+really_convert_to_current_version=<html>\u042d\u0442\u0430 \u043a\u0430\u0440\u0442\u044b \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Freeplane. <br>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0435 (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)? <br>(\u0418\u043d\u0430\u0447\u0435 \u043e\u043d\u0430 \u04 [...]
+really_cut_node=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0443\u0437\u0435\u043b(\u0443\u0437\u043b\u044b)?
+really_execute_script=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0443? \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430 [...]
+really_remove_node=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b(\u0443\u0437\u043b\u044b)?
+really_remove_notes=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f?
+ReapplyFilterAction.text=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e
+RedoAction.text= \u0412\u0435\u0440\u043d\u0443\u0442\u044c
+RedoFilterAction.text=\u0412\u0435\u0440\u043d\u0443\u0442\u044c
+ReminderHookAction.text=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
+ReminderHookAction.tooltip=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
+RemoveAllIconsAction.text= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
+RemoveConnectorAction.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c
+
+RemoveIconAction.text= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443
+RemoveNoteAction.text= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f
+RemoveNoteAction.tooltip = <html>\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0443 \u0432\u0441\u0435\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432.</html>
+rename=\u041f\u0435&\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c
+repair_link = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443
+repair_link_question = \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443. \u0412\u0432\u0435\u0441\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e?
+replace=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c
+reset_to_default=\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
+ResetNodeLocationAction.text=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c &\u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e
+RevertAction.text=&\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c
+RevisionPluginAction.text=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0446\u0432\u0435\u0442 &\u0444\u043e\u043d\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439
+save_unsaved = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0443? :
+SaveAction.text= \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
+SaveAll.text=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c &\u0432\u0441\u0435
+SaveAll.tooltip=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u044b.
+SaveAsAction.text= \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a...
+saved = \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e
+scheme_evaluate = \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c!
+ScriptEditor.text=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432...
+ScriptEditor.tooltip=\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u043e Freeplane.
+ScriptEditorPanel.changed_cancel=\u0421\u043a\u0440\u0438\u043f\u0442 \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439?
+
+
+select_favorites_folder = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0438
+select_file_export_to=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430
+select_folder_for_importing = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430
+select_icon=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443
+SelectAllAction.text=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435
+SelectBranchAction.text=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u044e \u0432\u0435\u0442\u0432\u044c
+selection_method_by_click = \u0412\u044b\u0431\u043e\u0440 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u043c \u0449\u0435\u043b\u0447\u043a\u043e\u043c
+selection_method_delayed=\u0412\u044b\u0431\u043e\u0440 \u043d\u0430\u0435\u0437\u0434\u043e\u043c \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439
+selection_method_direct = \u0412\u044b\u0431\u043e\u0440 \u043d\u0430\u0435\u0437\u0434\u043e\u043c
+SelectNoteAction.text=\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044e \u0443\u0437\u043b\u0430
+SelectNoteAction.tooltip=\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043e\u0442 \u0443\u0437\u043b\u0430 \u043a \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044e \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442
+SetImageByFileChooserAction.text= \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430
+SetLinkByFileChooserAction.text= \u0421\u0441\u044b\u043b\u043a\u0430 (\u0432\u044b\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u0430)
+SetLinkByTextFieldAction.text= \u0421\u0441\u044b\u043b\u043a\u0430 (\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435)
+SetNoteWindowPosition.bottom.text=\u0432\u043d\u0438\u0437\u0443
+SetNoteWindowPosition.left.text=\u0441\u043b\u0435\u0432\u0430
+SetNoteWindowPosition.right.text=\u0441\u043f\u0440\u0430\u0432\u0430
+SetNoteWindowPosition.top.text=\u0432\u0432\u0435\u0440\u0445\u0443
+ShowAllAttributesAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+ShowAncestorsAction.text=\u0421 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438
+ShowAttributeDialogAction.text=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 &\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438...
+ShowDescendantsAction.text=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0434\u0447\u0438\u043d\u0451\u043d\u043d\u044b\u0435
+ShowFilterToolbarAction.text=\u0424\u0438\u043b\u044c\u0442\u0440
+ShowHideNoteAction.text=\u041e\u043a\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0439
+ShowHideNoteAction.tooltip=\u042d\u0442\u043e \u0433\u043e\u0440\u044f\u0447\u0430\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u0435\u043a \u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0439 \u043b\u0438\u043d\u0438\u0438.
+ShowSelectedAttributesAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+ShowSelectionAsRectangleAction.text=\u041f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c
+simplyhtml.aboutFrameTitle=\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435...
+simplyhtml.aboutLabel=\u041e SimplyHTML...
+simplyhtml.alignCenter=\u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443
+simplyhtml.alignLabel=\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0440.:
+simplyhtml.alignLeft=\u0441\u043b\u0435\u0432\u0430
+simplyhtml.alignRight=\u0441\u043f\u0440\u0430\u0432\u0430
+simplyhtml.allCellsRangeLabel=\u0432\u0441\u0435\u043c \u043a\u043b\u0435\u0442\u043a\u0430\u043c
+simplyhtml.allOccurrencesReplaced=\u0412\u0441\u0435 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u043e
+simplyhtml.appendTableColLabel=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446
+simplyhtml.appendTableRowLabel=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443
+simplyhtml.applyCellAttrLabel=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a
+simplyhtml.backgroundLabel=\u0424\u043e\u043d:
+simplyhtml.boldItalicName=\u0416\u0438\u0440\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u0438\u0432
+simplyhtml.boldName=\u0416\u0438\u0440\u043d\u044b\u0439
+simplyhtml.borderColorLabel=\u0426\u0432\u0435\u0442:
+simplyhtml.borderWidthLabel=\u0428\u0438\u0440\u0438\u043d\u0430
+simplyhtml.bottomLabel=\u043d\u0438\u0437:
+simplyhtml.cancelBtnName=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+simplyhtml.cellBorderTabLabel=\u041b\u0438\u043d\u0438\u0438
+simplyhtml.cellGenTabLabel=\u041e\u0431\u0449\u0438\u0435
+simplyhtml.cellMarginTabLabel=\u041f\u043e\u043b\u044f
+simplyhtml.cellPanelTitle=\u0424\u043e\u0440\u043c\u0430\u0442 \u044f\u0447\u0435\u0439\u043a\u0438
+simplyhtml.clearFormatLabel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
+simplyhtml.clearFormatTip=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
+simplyhtml.close=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
+simplyhtml.closeBtnName=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
+simplyhtml.colorLabel=\u0426\u0432\u0435\u0442
+simplyhtml.copyLabel=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+simplyhtml.copyTip=\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+simplyhtml.cTagNameHead1=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 1
+simplyhtml.cTagNameHead2=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 2
+simplyhtml.cTagNameHead3=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 3
+simplyhtml.cTagNameHead4=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 4
+simplyhtml.cTagNameHead5=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 5
+simplyhtml.cTagNameHead6=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 6
+simplyhtml.cTagNameLink=\u0421\u0441\u044b\u043b\u043a\u0430
+simplyhtml.cTagNameOL=\u041d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a
+simplyhtml.cTagNamePara=\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444
+simplyhtml.cTagNameUL=\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a
+simplyhtml.cutLabel=\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c
+simplyhtml.cutTip=\u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c
+simplyhtml.defaultDocName=\u0411\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439
+simplyhtml.deleteTableColLabel=\u0423\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446
+simplyhtml.deleteTableRowLabel=\u0423\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443
+simplyhtml.docTitleQuery=\u041d\u043e\u0432\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:
+simplyhtml.docTitleTitle=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430
+simplyhtml.editLabel=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+simplyhtml.effectLabel=\u042d\u0444\u0444\u0435\u043a\u0442
+simplyhtml.familyLabel=\u0421\u0435\u043c\u044c\u044f
+simplyhtml.findNext=\u041d\u0430\u0439\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439...
+simplyhtml.findReplaceDialogTitle=\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430
+simplyhtml.findReplaceLabel=\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430
+simplyhtml.findReplaceTip=\u043f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430
+
+simplyhtml.fontBoldLabel=\u0416\u0438\u0440\u043d\u044b\u0439
+
+simplyhtml.fontBoldTip=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c/\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0436\u0438\u0440\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442
+
+simplyhtml.fontColorLabel=\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430
+simplyhtml.fontColorTip=\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430
+simplyhtml.fontDialogTitle=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0440\u0438\u0444\u0442
+
+simplyhtml.fontItalicLabel=\u041a\u0443\u0440\u0441\u0438\u0432
+
+simplyhtml.fontItalicTip=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c/\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u041a\u0443\u0440\u0441\u0438\u0432
+simplyhtml.fontLabel=\u0428\u0440\u0438\u0444\u0442...
+simplyhtml.fontTabLabel=\u0428\u0440\u0438\u0444\u0442
+simplyhtml.fontTip=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0440\u0438\u0444\u0442...
+
+simplyhtml.fontUnderlineLabel=\u041f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435
+simplyhtml.fontUnderlineTip=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c/\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435
+simplyhtml.foregroundLabel=\u0422\u0435\u043a\u0441\u0442:
+simplyhtml.formatLabel=\u0424\u043e\u0440\u043c\u0430\u0442
+simplyhtml.formatListLabel=\u0421\u043f\u0438\u0441\u043e\u043a...
+simplyhtml.formatListTip=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043f\u0438\u0441\u043a\u0430
+simplyhtml.formatParaLabel=\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444...
+simplyhtml.formatParaTip=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444
+simplyhtml.formatTableLabel=\u0422\u0430\u0431\u043b\u0438\u0446\u0430...
+simplyhtml.formatTableTip=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443
+simplyhtml.helpLabel=\u041f\u043e&\u043c\u043e\u0449\u044c
+simplyhtml.htmlTabTitle=HTML \u041a\u043e\u0434
+simplyhtml.imageFileDesc=\u0424\u0430\u0439\u043b \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c
+simplyhtml.insertTableColLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446
+simplyhtml.insertTableLabel=\u0422\u0430\u0431\u043b\u0438\u0446\u0430...
+simplyhtml.insertTableMsg=\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432?
+simplyhtml.insertTableRowLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443
+simplyhtml.insertTableTitle=\u0412\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443
+simplyhtml.italicName=\u041a\u0443\u0440\u0441\u0438\u0432
+simplyhtml.layoutTabTitle=\u0422\u0435\u043a\u0441\u0442
+simplyhtml.leftLabel=\u043b\u0435\u0432\u043e:
+simplyhtml.listDialogTitle=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430
+simplyhtml.listIndentTitle=\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435:
+simplyhtml.listPosInside=\u0432\u043d\u0443\u0442\u0440\u0438
+simplyhtml.listPositionLabel=\u041f\u043e\u0437\u0438\u0446\u0438\u044f:
+simplyhtml.listPosOutside=\u0441\u043d\u0430\u0440\u0443\u0436\u0438
+simplyhtml.listTypeCircle=\u041a\u0440\u0443\u0433
+simplyhtml.listTypeDecimal=1.,2.,3.,4.
+simplyhtml.listTypeDisc=\u0414\u0438\u0441\u043a
+simplyhtml.listTypeLabel=\u0422\u0438\u043f:
+simplyhtml.listTypeLowerAlpha=a.,b.,c.,d.
+simplyhtml.listTypeLowerRoman=i.,ii.,iii.,iv.
+simplyhtml.listTypeNone=\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442
+simplyhtml.listTypeSquare=\u041a\u0432\u0430\u0434\u0440\u0430\u0442
+simplyhtml.listTypeUpperAlpha=A.,B.,C.,D.
+simplyhtml.listTypeUpperRoman=I.,II.,III.,IV.
+simplyhtml.marginLabel=\u0421\u043d\u0430\u0440\u0443\u0436\u0438
+simplyhtml.matchCase=\u0421 \u0443\u0447\u0451\u0442\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430
+simplyhtml.newStyleDefaultName=\u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0438\u043b\u044c
+simplyhtml.nextTableCellLabel=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430
+simplyhtml.noLineLabel=\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442
+simplyhtml.noMoreOccurrencesFound=(\u0431\u043e\u043b\u044c\u0448\u0435) \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e
+simplyhtml.okBtnName=OK
+simplyhtml.paddingLabel=\u0412\u043d\u0443\u0442\u0440\u0438
+simplyhtml.paraAlignCenterLabel=\u0426\u0435\u043d\u0442\u0440
+simplyhtml.paraAlignCenterTip=\u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0446\u0435\u043d\u0442\u0440\u0435
+simplyhtml.paraAlignLeftLabel=\u0421\u043b\u0435\u0432\u0430
+simplyhtml.paraAlignLeftTip=\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e
+simplyhtml.paraAlignRightLabel=\u0421\u043f\u0440\u0430\u0432\u0430
+simplyhtml.paraAlignRightTip=\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e
+simplyhtml.paraStyleDialogTitle=\u0421\u0442\u0438\u043b\u0438
+simplyhtml.paraTabLabel=\u0410\u0431\u0437\u0430\u0446
+simplyhtml.pasteLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c
+simplyhtml.pasteTip=\u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c
+simplyhtml.plainName=\u041e\u0431\u044b\u0447\u043d\u044b\u0439
+simplyhtml.previewLabel=\u041f&\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c
+simplyhtml.previewText=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0435\u043a\u0441\u0442
+simplyhtml.prevTableCellLabel=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043a\u043b\u0435\u0442\u043a\u0430
+simplyhtml.redoLabel=\u0412\u0435\u0440\u043d\u0443\u0442\u044c
+simplyhtml.redoTip=\u043f\u043e\u0432\u0442\u043e\u0440
+simplyhtml.replace=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c...
+simplyhtml.replaceAll=\u0412\u0441\u0435
+simplyhtml.replaceDone=\u0413\u043e\u0442\u043e\u0432\u043e
+simplyhtml.replaceNo=\u041d\u0435\u0442
+simplyhtml.replaceThisQuery=\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442
+simplyhtml.replaceWith=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430:
+simplyhtml.replaceYes=\u0414\u0430
+simplyhtml.rightLabel=\u043f\u0440\u0430\u0432\u043e:
+simplyhtml.searchDown=\u0418\u0441\u043a\u0430\u0442\u044c \u0432\u043d\u0438\u0437
+simplyhtml.searchFromStart=\u0418\u0441\u043a\u0430\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430
+simplyhtml.searchUp=\u0418\u0441\u043a\u0430\u0442\u044c \u0432\u0432\u0435\u0440\u0445
+simplyhtml.selectAllLabel=\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435
+simplyhtml.sizeLabel=\u0420\u0430\u0437\u043c\u0435\u0440
+simplyhtml.standardStyleName=\u043e\u0431\u044b\u0447\u043d\u044b\u0439
+simplyhtml.strikeLabel=\u0417\u0430\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u043e
+simplyhtml.styleLabel=\u0421\u0442\u0438\u043b\u044c
+simplyhtml.styleNameInputText=\u0418\u043c\u044f \u0441\u0442\u0438\u043b\u044f?
+simplyhtml.styleNameInputTitle=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c
+simplyhtml.tableBgColLabel=\u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442:
+simplyhtml.tableDialogTitle=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443
+simplyhtml.tableLabel=\u0422\u0430\u0431\u043b\u0438\u0446\u0430
+simplyhtml.tablePanelTitle=\u0442\u0430\u0431\u043b\u0438\u0446\u0430
+simplyhtml.tableWidthLabel=\u0428\u0438\u0440\u0438\u043d\u0430:
+simplyhtml.textIndentLabel=\u041e\u0442\u0441\u0442\u0443\u043f:
+simplyhtml.textToFind=\u0418\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442:
+simplyhtml.thisCellRangeLabel=\u044f\u0447\u0435\u0439\u043a\u0435
+simplyhtml.thisColRangeLabel=\u0441\u0442\u043e\u043b\u0431\u0446\u0443
+simplyhtml.thisRowRangeLabel=\u0441\u0442\u0440\u043e\u043a\u0435
+simplyhtml.toggleBulletsLabel=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a
+simplyhtml.toggleBulletsTip=\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a
+simplyhtml.toggleNumbersLabel=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e
+simplyhtml.toggleNumbersTip=\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e
+simplyhtml.topLabel=\u0432\u0435\u0440\u0445:
+simplyhtml.uLineLabel=\u041f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435
+simplyhtml.unableToOpenFileError=\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d
+simplyhtml.unableToRedoError=\u041f\u043e\u0432\u0442\u043e\u0440 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d:
+simplyhtml.unableToUndoError=\u041e\u0442\u043c\u0435\u043d\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430:
+simplyhtml.undoLabel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+simplyhtml.undoTip=\u043e\u0442\u043c\u0435\u043d\u0430
+simplyhtml.valignBaseline=\u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044e
+simplyhtml.valignBottom=\u0441\u043d\u0438\u0437\u0443
+simplyhtml.valignLabel=\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0440\u0442.:
+simplyhtml.valignMiddle=\u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435
+simplyhtml.valignTop=\u0441\u0432\u0435\u0440\u0445\u0443
+simplyhtml.wholeWordsOnly=\u0422\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432\u0430
+SortNodes.text=\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0443\u0437\u043b\u044b
+SortNodes.tooltip=\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u043f\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0443.
+split = \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c
+SplitNode.text= &\u0420\u0430\u0437\u0431\u0438\u0442\u044c \u0443\u0437\u0435\u043b
+SplitNode.tooltip= <html>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0437\u043b\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u0437\u0435\u043b</html>
+style = \u0421\u0442\u0438\u043b\u044c
+TimeListAction.text=&\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435...
+TimeListAction.tooltip=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439 \u0441\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438
+TimeManagementAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c...
+TimeManagementAction.tooltip= <html>\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c \u043e\u0442 \u041a\u0430\u044f \u0422\u043e\u0434\u0442\u0435\u0440\u0430.</html>
+ToggleChildrenFoldedAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c / \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
+ToggleFoldedAction.text= \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c / \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c
+ToggleLeftToolbarAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c/\u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438
+ToggleMenubarAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c/\u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u043c\u0435\u043d\u044e
+ToggleToolbarAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c/\u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432
+undefined_error = \u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0447\u0435\u0440\u0435\u0437 \u0444\u043e\u0440\u0443\u043c
+underline = \u041f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435
+underlined = \u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u043e
+UndoAction.text= \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+UndoFilterAction.text=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+unfold = \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c
+UnfoldAllAction.text= \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0451
+UnfoldAllAction.tooltip= <html>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0437\u043b\u044b</html>
+
+UnfoldOneLevelAction.text= \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c
+UnfoldOneLevelAction.tooltip= <html>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u043d\u0430 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c</html>
+url_error = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0430\u0434\u0440\u0435\u0441\u0435 URL
+url_load_error = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 URL:
+used_in_menu=\u0422\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u0435\u043d\u044e.
+UsePlainTextAction.text= \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442
+user_defined_zoom = \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c..
+user_defined_zoom_status_bar = \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043f\u043e \u0432\u044b\u0431\u043e\u0440\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 {0}%.
+user_zoom = \u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u043f\u0435\u0447\u0430\u0442\u0438 (0.0 - 2.0):
+
+WebDocuAction.text= \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435
+width = \u0428\u0438\u0440\u0438\u043d\u0430
+
+xslt_export_not_possible=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 XSLT \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d
+yes = \u0414\u0430
+ZoomInAction.text= \u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c
+ZoomOutAction.text= \u041e\u0442\u0434\u0430\u043b\u0438\u0442\u044c
+OptionPanel.text.use_ctrl_key=\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0433\u043e\u0440\u044f\u0447\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0443, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043c\u0435\u043d\u044e, \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044f Ctrl
+ChangeConnectorArrowsAction.none.text=\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442
+ChangeConnectorArrowsAction.forward.text=\u0412\u043f\u0435\u0440\u0451\u0434
+
+ChangeConnectorArrowsAction.backward.text=\u041d\u0430\u0437\u0430\u0434
+ChangeConnectorArrowsAction.both.text=\u041d\u0430 \u043e\u0431\u043e\u0438\u0445 \u043a\u043e\u043d\u0446\u0430\u0445
+edit_source_label=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0434\u043f\u0438\u0441\u044c
+edit_middle_label=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u043d\u0430\u0434\u043f\u0438\u0441\u044c
+edit_target_label=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u043d\u0430\u0434\u043f\u0438\u0441\u044c
+OptionPanel.separator.connectors=\u0421\u0432\u044f\u0437\u0438
+OptionPanel.label_font_family=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u0430
+
+
+OptionPanel.label_font_size=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
+OptionPanel.paint_connectors_behind=\u0423\u0437\u043b\u044b \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u043b\u0438\u043d\u0438\u0438 \u0441\u0432\u044f\u0437\u0435\u0439
+OpenPathAction.text=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b
+OKAction.text=OK
+ApplyAction.text=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c
+CancelAction.text=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
+ImportAction.text=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
+filter_priority=\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442
+download=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
+updatecheckdialog=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433
+version_up_to_date=\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e
+OptionPanel.separator.updates=\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f
+OptionPanel.check_updates_automatically=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435
+can_not_connect_to_info_server=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443
+ReportBugAction.text=\u0421\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435
+RequestFeatureAction.text=\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u043e\u0432\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432
+AskForHelp.text=\u0417\u0430\u043f\u0440\u043e\u0441 \u043e \u043f\u043e\u043c\u043e\u0449\u0438
+sf_login_required=\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0430 Sourceforge. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?
+OptionPanel.horizontal=\u043b\u043e\u043c\u0430\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f
+OptionPanel.hide_edge=\u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0440\u0435\u0431\u0440\u043e
+corrupt_map=\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u043e
+OptionPanel.separator.tooltip =\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438
+OptionPanel.toolTipManager.initialDelay =\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430, \u043c\u0441
+OptionPanel.toolTipManager.dismissDelay =\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430, \u043c\u0441
+OptionPanel.toolTipManager.reshowDelay =\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0430, \u043c\u0441
+IconGroupPopupAction.office.text=\u041e\u0444\u0438\u0441
+IconGroupPopupAction.flags.text=\u0424\u043b\u0430\u0433\u0438
+IconGroupPopupAction.docs_folders.text=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043f\u0430\u043f\u043a\u0438
+IconGroupPopupAction.numbers.text=\u0427\u0438\u0441\u043b\u0430
+IconGroupPopupAction.time.text=\u0412\u0440\u0435\u043c\u044f
+IconGroupPopupAction.people.text=\u041b\u044e\u0434\u0438
+IconGroupPopupAction.signs.text=\u0417\u043d\u0430\u043a\u0438
+IconGroupPopupAction.smiley.text=\u0420\u043e\u0436\u0438\u0446\u044b
+IconGroupPopupAction.nature.text=\u041f\u0440\u0438\u0440\u043e\u0434\u0430
+IconGroupPopupAction.miscallaneous.text=\u0420\u0430\u0437\u043d\u044b\u0435
+IconGroupPopupAction.arrows.text=\u0421\u0442\u0440\u0435\u043b\u043a\u0438
+IconGroupPopupAction.user.text=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435
+OptionPanel.structured_icon_toolbar=\u041f\u0430\u043d\u0435\u043b\u044c \u0433\u0440\u0443\u043f \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c
+icon_bee=Freeplane
+saving_canceled=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e
+attributes_assign_dialog=\u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
+OptionPanel.separator.CloudControls=\u041e\u0431\u043b\u0430\u043a\u0430
+OptionPanel.cloud=\u041e\u0431\u043b\u0430\u043a\u043e
+OptionPanel.cloudcolor=\u041e\u0431\u043b\u0430\u043a\u043e \u0438 \u0446\u0432\u0435\u0442
+OptionPanel.load_last_maps=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b
+filter_note=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f
+org.freeplane.plugin.bugreport.question=<html>Freeplane \u0438\u043c\u0435\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a.<br>\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0 [...]
+org.freeplane.plugin.bugreport.report=\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0442\u0447\u0451\u0442
+org.freeplane.plugin.bugreport.always_agree=\u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
+org.freeplane.plugin.bugreport.agree=\u041f\u043e\u0441\u043b\u0430\u0442\u044c
+org.freeplane.plugin.bugreport.deny=\u041d\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
+org.freeplane.plugin.bugreport.always_deny=\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
+org.freeplane.plugin.bugreport.dialog.title=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u0442\u0447\u0451\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435
+OptionPanel.org.freeplane.plugin.bugreport.allowed=\u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
+OptionPanel.org.freeplane.plugin.bugreport.denied=\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
+OptionPanel.org.freeplane.plugin.bugreport.ask=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u043e\u0442\u0447\u0451\u0442\u0430
+OptionPanel.backup_file_number=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432
+OptionPanel.separator.org.freeplane.plugin.bugreport=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u0442\u0447\u0451\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435
+OptionPanel.org.freeplane.plugin.bugreport=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430
+export_failed=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043d\u0435 \u0443\u0434\u0430\u043b\u0441\u044f
+filters_not_loaded=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440, \u0444\u0430\u0439\u043b \u043d\u0430\u0440\u0443\u0448\u0435\u043d
+f_button_unassigned=<\u043f\u0443\u0441\u0442\u043e>
+ToggleFBarAction.text=\u041f\u0430\u043d\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0432\u0438\u0448
+LoadAcceleratorPresetsAction.textPatterns.text=\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0442\u0435\u043a\u0441\u0442\u0430
+acceleratorPresets=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
+out_of_memory=\u041d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u0438
+SaveAcceleratorPresetsAction.text=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448
+can_not_save_key_set=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
+enter_keyset_name=\u0418\u043c\u044f \u0434\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448
+overwrite_keyset_question=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440?
+OptionPanel.separator.editing=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430
+OptionPanel.editor_extra_width=\u0428\u0430\u0433 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0448\u0438\u0440\u0438\u043d\u044b
+EdgeLikeLinkAction.text=\u0421\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0431\u0440\u043e
+connector_label=\u041d\u0430\u0434\u043f\u0438\u0441\u044c \u0441\u0432\u044f\u0437\u0438
+ToggleFullScreenAction.text=\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c
+SelectedPasteAction.text=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a...
+StructuredHtmlFlavorHandler=HTML \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u043e\u0432
+DirectHtmlFlavorHandler=HTML \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0443\u0437\u0435\u043b
+StringFlavorHandler=\u0422\u0435\u043a\u0441\u0442 \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u043e\u0432
+MindMapNodesFlavorHandler=\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u043e\u0432
+FileListFlavorHandler=\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0444\u0430\u0439\u043b\u044b
+ViewerControllerAction.text=\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442...
+NextNodeAction.FORWARD.text=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b
+NextNodeAction.BACK.text=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b
+NextNodeAction.FORWARD_N_FOLD.text=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b (\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c)
+NextNodeAction.BACK_N_FOLD.text=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b (\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c)
+svg=SVG
+bitmaps=\u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438
+ViewLayoutTypeAction.OUTLINE.text=\u0412\u0438\u0434 \u0441\u0445\u0435\u043c\u044b
+OptionPanel.separator.outline_view=\u0412\u0438\u0434 \u0441\u0445\u0435\u043c\u044b
+OptionPanel.outline_vgap=\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438
+
+#automatic translated values
+#Wed Oct 28 00:16:35 CET 2009
+OptionPanel.outline_hgap=\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438
+fit_map_to_page_width=\u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u0448\u0438\u0440\u0438\u043d\u0443 \u0434\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b
+fit_map_to_page_height=\u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0434\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b
+user_defined_scale=\u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c
+AllMapsNodeListAction.text=\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u043a\u0430\u0440\u0442\u0430\u0445
+OptionPanel.separator.inline_editor=\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0443\u0437\u043b\u0430
+OptionPanel.il__enter_confirms_by_default=Enter \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
+ModesMenuAction.MindMap.text=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u0430\u0440\u0442 \u0441\u043e\u0437\u043d\u0430\u043d\u0438\u044f
+ModesMenuAction.Browse.text=\u041e\u0431\u0437\u043e\u0440 \u043a\u0430\u0440\u0442
+ModesMenuAction.File.text=\u041e\u0431\u0437\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432
+not_saved_for_image_error=\u041a\u0430\u0440\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0444\u0430\u0439\u043b\u0430
+
+#automatic translated values
+#Mon Dec 28 18:44:31 CET 2009
+MaxNodeWidthAction.text=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u0443\u0437\u043b\u0430
+OptionPanel.separator.scrollbar=\u041f\u043e\u043b\u043e\u0441\u0430 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438
+OptionPanel.scrollbar_increment=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c
+ExecuteScriptForAllNodes.text=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b
+ExecuteScriptForSelectionAction.text=\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
+userScripts=\u0421\u043a\u0440\u0438\u043f\u0442\u044b
+ExecuteScriptOnSingleNode.text={0}: \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0443\u0437\u043b\u0435 [auto]
+ExecuteScriptOnSelectedNode.text={0}: \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u0432\u0441\u0435\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445 [auto]
+ExecuteScriptOnSelectedNodeRecursively.text={0}: \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e [auto]
+ExecuteScriptError.text=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430
+ReadScriptError.text=\u041e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430
+OptionPanel.script_directories=\u041f\u0443\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430
+OptionPanel.separator.spelling=\u041e\u043f\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u0438
+OptionPanel.spelling_opt_case_sensitive=\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440
+OptionPanel.spelling_opt_ignore_all_caps_words=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435.
+OptionPanel.spelling_opt_ignore_capitalization=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0431\u0443\u043a\u0432\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043b\u043e\u0432\u0430.
+OptionPanel.spelling_opt_ignore_words_with_numbers=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430 \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438
+OptionPanel.spelling_opt_suggestions_limit_dialog=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u0435
+OptionPanel.spelling_opt_suggestions_limit_menu=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043c\u0435\u043d\u044e
+RemoveIcon_0_Action.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0438\u043a\u043e\u043d\u043a\u0443
+icon_clock = \u0412\u0440\u0435\u043c\u044f
+icon_clock2=\u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
+icon_user_icon=\u0418\u043a\u043e\u043d\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
+connector=\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044c
+
+#automatic translated values
+#Fri Feb 05 12:54:18 CET 2010
+OptionPanel.display_node_id=\u0414\u0438\u0441\u043F\u043B\u0435\u0439 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0443\u0437\u043B\u0430[auto]
+remove_shortcut_question=\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448?[auto]
+HotKeyInfoAction.text=\u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u043D\u043E\u043C\u0435\u0440[auto]
+OptionPanel.load_folding_start_level=\u0421\u043B\u043E\u0436\u0438\u0442\u0435 \u0443\u0437\u043B\u044B \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C[auto]
+OptionPanel.goto_note_end_on_edit=\u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043A \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044E \u0434\u043E \u043A\u043E\u043D\u0446\u0430[auto]
diff --git a/freeplane_ant/template/$$$$Action.java b/freeplane_ant/template/$$$$Action.java
deleted file mode 100644
index f93fc7d..0000000
--- a/freeplane_ant/template/$$$$Action.java
+++ /dev/null
@@ -1,18 +0,0 @@
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.components.UITools;
-
-public class $$$$Action extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
-
- public $$$$Action() {
- super("$$$$","$$$$", null);
- }
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- /*TODO: enter your GUI code here*/
- UITools.informationMessage("Hi!\n\tThis is plugin $$$$");
- }
-}
diff --git a/freeplane_ant/template/Activator.java b/freeplane_ant/template/Activator.java
deleted file mode 100644
index 43405da..0000000
--- a/freeplane_ant/template/Activator.java
+++ /dev/null
@@ -1,44 +0,0 @@
-import java.util.Hashtable;
-
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.main.osgi.IModeControllerExtensionProvider;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class Activator implements BundleActivator {
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- @Override
- public void start(final BundleContext context) throws Exception {
- final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
- props.put("mode", new String[] { MModeController.MODENAME /*TODO: other modes too?*/});
- context.registerService(IModeControllerExtensionProvider.class.getName(),
- new IModeControllerExtensionProvider() {
- @Override
- public void installExtension(ModeController modeController) {
- final MenuBuilder menuBuilder = modeController.getUserInputListenerFactory().getMenuBuilder();
- final $$$$Action action = new $$$$Action();
- modeController.addAction(action);
- modeController.addMenuContributor(new IMenuContributor() {
- @Override
- public void updateMenus(ModeController modeController, MenuBuilder builder) {
- menuBuilder.addAction("/menu_bar/file", action, MenuBuilder.AS_CHILD);
- }
- });
- }
- /*TODO: further initializations*/}, props);
- }
-
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- @Override
- public void stop(final BundleContext context) throws Exception {
- }
-}
diff --git a/freeplane_ant/test/build.xml b/freeplane_ant/test/build.xml
deleted file mode 100644
index 0e11f11..0000000
--- a/freeplane_ant/test/build.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<project name="freeplane_ant" default="test" basedir=".">
- <property name="root" location=".." />
- <property name="freeplane.dir" location="../.." />
- <property name="src" location="src" />
- <property name="bin" location="bin" />
- <property name="test.logdir" location="log" />
- <property name="jar" value="${root}/dist/freeplaneant.jar" />
- <property name="junit.jar" value="${root}/lib/junit.jar" />
- <property name="classpath" value="${junit.jar}:${jar}" />
-
- <taskdef name="format-translation" classname="org.freeplane.ant.FormatTranslation" classpath="${jar}"/>
- <taskdef name="check-translation" classname="org.freeplane.ant.FormatTranslationCheck" classpath="${jar}"/>
- <taskdef name="create-plugin" classname="org.freeplane.ant.CreatePlugin" classpath="${jar}"/>
-
- <target name="compile-junit">
- <mkdir dir="${bin}" />
- <javac srcdir="${src}" destdir="${bin}" debug="${debug}" classpath="${classpath}" />
- </target>
-
- <target name="run-junit" depends="compile-junit">
- <delete dir="${test.logdir}"/>
- <mkdir dir="${test.logdir}" />
- <junit printsummary="yes" haltonfailure="off">
- <classpath>
- <pathelement path="${classpath}:bin"/>
- </classpath>
- <formatter type="xml"/>
- <batchtest todir="${test.logdir}">
- <fileset dir="${bin}">
- <include name="**/*Test.class"/>
- </fileset>
- </batchtest>
- </junit>
- </target>
-
- <target name="check">
- <check-translation dir="unsorted" includes="*.properties" />
- </target>
-
- <target name="format">
- <format-translation dir="unsorted" includes="*.properties" outputDir="sorted" />
- </target>
-
- <target name="check-sorted">
- <check-translation dir="sorted" includes="*.properties" />
- </target>
-
- <target name="create-plugin">
- <create-plugin />
- </target>
-
- <target name="create-plugin-batch">
- <copy todir="./freeplane_plugin_latex">
- <fileset dir="${freeplane.dir}/freeplane_plugin_latex">
- <exclude name="**/dist/**" />
- <exclude name="**/build/**" />
- <exclude name="**/lib/**" />
- </fileset>
- </copy>
- <create-plugin baseDir="." pluginname="helloworld" hasAction="true" />
- </target>
-
- <target name="clean">
- <delete dir="sorted" quiet="true" />
- <delete dir="${bin}" quiet="true" />
- <delete dir="${test.log}" quiet="true" />
- <delete dir="freeplane_plugin_latex" quiet="true" />
- <delete dir="freeplane_plugin_helloworld" quiet="true" />
- </target>
-
- <target name="test" depends="run-junit">
- <antcall target="format" />
- <antcall target="check-sorted" />
- <delete dir="freeplane_plugin_helloworld" quiet="true" />
- <antcall target="create-plugin-batch" />
- </target>
-</project>
diff --git a/freeplane_ant/test/src/org/freeplane/ant/FormatTranslationTest.java b/freeplane_ant/test/src/org/freeplane/ant/FormatTranslationTest.java
deleted file mode 100644
index 3d397a5..0000000
--- a/freeplane_ant/test/src/org/freeplane/ant/FormatTranslationTest.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/**
- * FormatTranslationTest.java
- *
- * Copyright (C) 2010, Volker Boerchers
- *
- * Translator.java 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 3 of the License, or
- * (at your option) any later version.
- *
- * Translator.java is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-package org.freeplane.ant;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-
-import org.apache.tools.ant.Project;
-import org.hamcrest.CoreMatchers;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class FormatTranslationTest {
- private static final String TRANSLATIONS_SOURCE_DIR = System.getProperty("TRANSLATIONS_SOURCE_DIR");
- private static String unix = "\n";
- private static String mac = "\r";
- private static String win = "\r\n";
-
- @Test
- public void testComparator() {
- String[] strings = { "a.b = z", "a.b.c= y", "a.b= x", "a.b = x" };
- Arrays.sort(strings, FormatTranslation.KEY_COMPARATOR);
- assertEquals("stable sort, only by key", "a.b = z", strings[0]);
- assertEquals("stable sort, only by key", "a.b= x", strings[1]);
- assertEquals("stable sort, only by key", "a.b = x", strings[2]);
- assertEquals("stable sort, only by key", "a.b.c= y", strings[3]);
- }
-
- @Test
- public void testCheckForEmptyValues() {
- final String regex = "\\s*(\\[auto\\]|\\[translate me\\])*\\s*";
- assertTrue(" [auto]\r".matches(regex));
- assertTrue("[translate me]\r".matches(regex));
- assertTrue("\r".matches(regex));
- assertTrue("".matches(regex));
- assertFalse(" [nix]\r".matches(regex));
- }
-
- @Test
- public void testMatchEolStyle() {
- assertTrue(TaskUtils.matchEolStyle("", unix));
- assertTrue(TaskUtils.matchEolStyle("\n", unix));
- assertTrue(TaskUtils.matchEolStyle("\n\n", unix));
- assertFalse(TaskUtils.matchEolStyle("\r", unix));
- assertFalse(TaskUtils.matchEolStyle("\r\n", unix));
- //
- assertTrue(TaskUtils.matchEolStyle("", win));
- assertTrue(TaskUtils.matchEolStyle("\r\n", win));
- assertTrue(TaskUtils.matchEolStyle("\r\n\r\n", win));
- assertFalse(TaskUtils.matchEolStyle("\r", win));
- assertFalse(TaskUtils.matchEolStyle("\n\r", win));
- assertFalse(TaskUtils.matchEolStyle("\n", win));
- }
-
- @Test
- public void testCheckEolStyleAndReadLines() throws Exception {
- final String input = "one\r\ntwo\n\rthree\\\nthree.one\n\nfour";
- ArrayList<String> resultList = new ArrayList<String>();
- assertFalse("not unique unix", TaskUtils.checkEolStyleAndReadLines(input, resultList, unix));
- assertEquals("a trailing backslash escapes a new line", 6, resultList.size());
- assertFalse("not unique mac", TaskUtils.checkEolStyleAndReadLines(input, resultList, mac));
- assertEquals(6, resultList.size());
- assertFalse("not unique win", TaskUtils.checkEolStyleAndReadLines(input, resultList, win));
- assertEquals(6, resultList.size());
- //
- String unixInput = input.replaceAll("\r\n|\n|\r", unix);
- System.out.println("unixInput='" + f(unixInput) + "'");
- assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(unixInput, resultList, unix));
- assertFalse("not mac", TaskUtils.checkEolStyleAndReadLines(unixInput, resultList, mac));
- assertFalse("not win", TaskUtils.checkEolStyleAndReadLines(unixInput, resultList, win));
- assertEquals("a trailing backslash escapes a new line", 6, resultList.size());
- //
- String macInput = input.replaceAll("\r\n|\n|\r", mac);
- System.out.println("macInput='" + f(macInput) + "'");
- assertTrue("unique mac", TaskUtils.checkEolStyleAndReadLines(macInput, resultList, mac));
- assertFalse("not unix", TaskUtils.checkEolStyleAndReadLines(macInput, resultList, unix));
- assertFalse("not win", TaskUtils.checkEolStyleAndReadLines(macInput, resultList, win));
- assertEquals("a trailing backslash escapes a new line", 6, resultList.size());
- //
- String winInput = input.replaceAll("\r\n|\n|\r", win);
- System.out.println("winInput='" + f(winInput) + "'");
- assertTrue("unique win", TaskUtils.checkEolStyleAndReadLines(winInput, resultList, win));
- assertFalse("not unix", TaskUtils.checkEolStyleAndReadLines(winInput, resultList, unix));
- assertFalse("not mac", TaskUtils.checkEolStyleAndReadLines(winInput, resultList, mac));
- assertEquals("a trailing backslash escapes a new line", 6, resultList.size());
- //
- String resource = TaskUtils.readFile(new File(TRANSLATIONS_SOURCE_DIR, "Resources_de.properties"));
- assertTrue("not unix", TaskUtils.checkEolStyleAndReadLines(resource, resultList, unix));
- }
-
- @Test
- public void testRemoveEmptyLines() throws Exception {
- final String msgConserved = "empty lines should be conserved";
- final String msgRemoved = "empty lines should be removed";
- final FormatTranslation formatTranslation = new FormatTranslation();
- String input;
- ArrayList<String> lines = new ArrayList<String>();
- //
- input = "\n \nx=y\n\n";
- assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(input, lines, unix));
- assertEquals(msgConserved, 4, lines.size());
- assertEquals(msgRemoved, 1, formatTranslation.processLines("a_file", new ArrayList<String>(lines)).size());
- //
- input = "\n";
- assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(input, lines, unix));
- assertEquals(msgConserved, 1, lines.size());
- assertEquals(msgRemoved, 0, formatTranslation.processLines("a_file", new ArrayList<String>(lines)).size());
- //
- input = " \n";
- assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(input, lines, unix));
- assertEquals(msgConserved, 1, lines.size());
- assertEquals(msgRemoved, 0, formatTranslation.processLines("a_file", new ArrayList<String>(lines)).size());
- //
- input = "x=y";
- assertTrue("unique unix", TaskUtils.checkEolStyleAndReadLines(input, lines, unix));
- assertEquals(msgConserved, 1, lines.size());
- assertEquals(msgRemoved, 1, formatTranslation.processLines("a_file", new ArrayList<String>(lines)).size());
- //
- }
-
- private String f(String input) {
- return input.replace("\n", "\\n").replace("\r", "\\r");
- }
-
- @Test
- public void testPlaceholderCheck() throws Exception {
- final FormatTranslation formatTranslation = new FormatTranslation();
- String input;
- ArrayList<String> lines = new ArrayList<String>();
- //
- input = "x = a {1} without a 0\n" //
- + "y = a $1 instead of a {0}";
- // no actual test as long as those tests are not treated as failures
- TaskUtils.checkEolStyleAndReadLines(input, lines, unix);
- formatTranslation.processLines("a_file", new ArrayList<String>(lines));
- }
-
- @Test
- public void testFormatTranslation() {
- final FormatTranslation formatTranslation = new FormatTranslation();
- final Project project = TaskUtils.createProject(formatTranslation);
- formatTranslation.setTaskName("format-translation");
- formatTranslation.setProject(project);
- formatTranslation.setEolStyle("unix");
- assertNotNull("system property TRANSLATIONS_SOURCE_DIR not set", TRANSLATIONS_SOURCE_DIR);
- formatTranslation.setDir(TRANSLATIONS_SOURCE_DIR);
- formatTranslation.setIncludes("Resources_*.properties");
- formatTranslation.execute();
- System.out.println("done");
- }
-
- @Test
- public void convertsUnicodeToLowerCase(){
- final FormatTranslation formatTranslation = new FormatTranslation();
- Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("u"), CoreMatchers.equalTo("u"));
- Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("\\\\u"), CoreMatchers.equalTo("\\\\u"));
- Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("\\Uabcde"), CoreMatchers.equalTo("\\uABCDe"));
- Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("\\uabcde"), CoreMatchers.equalTo("\\uABCDe"));
- Assert.assertThat(formatTranslation.convertUnicodeCharacterRepresentation("1\\Uabcde"), CoreMatchers.equalTo("1\\uABCDe"));
- }
-}
diff --git a/freeplane_ant/test/unsorted/Test_de.properties b/freeplane_ant/test/unsorted/Test_de.properties
deleted file mode 100644
index 04bdf26..0000000
--- a/freeplane_ant/test/unsorted/Test_de.properties
+++ /dev/null
@@ -1,1433 +0,0 @@
-about_text = Joerg Mueller's Freeplane\nTaking the Concept-Mapping approach to Human-Computer Interface design.\nCopyright (C) 2000-2008 Joerg Mueller and others.\nThis program is free software (GPL)\nHome: http://freeplane.sourceforge.net/\nHave fun!\nVersion:
-AboutAction.text= Info
-accessories/plugins/ApplyFormatPlugin.dialog.title=
-accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=Stil \u00c4ndern
-accessories/plugins/EncryptNode.properties_0 = Bitte w\u00e4hlen Sie ein Passwort f\u00fcr den verschl\u00fcsselten Knoten
-accessories/plugins/EncryptNode.properties_1 = Die Passw\u00f6rter stimmen nicht \u00fcberein oder sind zu kurz.
-accessories/plugins/EncryptNode.properties_2 = Passwort eingeben:
-accessories/plugins/EncryptNode.properties_3 = Passwort wiederholen:
-accessories/plugins/EncryptNode.properties_4 = Bitte geben Sie das Passwort ein.
-accessories/plugins/EncryptNode.properties_5 = <html>Bitte beachten Sie, da\u00df die Qualit\u00e4t der Verschl\u00fcsselung<br> fast vollst\u00e4ndig von der Qualit\u00e4t Ihres Passwortes abh\u00e4ngt.
-accessories/plugins/EncryptNode.properties_6 = OK
-accessories/plugins/EncryptNode.properties_7 = Abbrechen
-accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = <html>Sie k\u00f6nnen diese Funktion nur auf bereits eingef\u00fcgte verschl\u00fcsselte Knoten anwenden.<br> Bitte, f\u00fcgen Sie solchen einen Knoten mittels des Extra-Men\u00fcs ein.
-accessories/plugins/EncryptNode.properties_select_me = Klick mich an.
-accessories/plugins/EncryptNode.properties_wrong_password = Das Passwort stimmt nicht.
-
-accessories/plugins/ExportWithTWiki.text=Als TWiki...
-accessories/plugins/ExportWithTWiki.tooltip=Exportiert die Mindmap als TWiki Dokument.
-
-accessories/plugins/ExportWithXSLT.tooltip= Eine allgemeine Exportmethode, die XSLT Skripte verwendet.
-
-
-accessories/plugins/ExportWithXSLT_Applet.text=Als Java Applet...
-accessories/plugins/ExportWithXSLT_Applet.tooltip=Exportiert die MindMap als Java Browser Applet.
-accessories/plugins/ExportWithXSLT_Flash.text=Als Flash...
-accessories/plugins/ExportWithXSLT_Flash.tooltip=Exportiert die MindMap als Flash Anwendung.
-accessories/plugins/ExportWithXSLT_HTML.text= Als XHTML (JavaScript Version)...
-
-accessories/plugins/ExportWithXSLT_HTML3.text= Als XHTML (Mit verlinktem Bild der MindMap)...
-
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=Ressourcen nach Taskjuggler...
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>Exportiert Ressourcen vom RESOURCES Knoten zu Taskjuggler. </html>
-accessories/plugins/ExportWithXSLT_TASKSTJI.text=Aufgaben nach Taskjuggler...
-accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>Exportiert Aufgaben vom TASKS Knoten zu Taskjuggler. </html>
-accessories/plugins/SaveAll.properties_save_all_cancelled=Die Ausf\u00fchrung von "Alle Speichern" wurde nicht erfolgreich zu Ende gef\u00fchrt.
-add=&Hinzuf\u00fcgen
-
-AddLocalLinkAction.text= Lokalen Hyperlink Hinzuf\u00fcgen
-antialias_all = Antialias Alles
-antialias_edges = Antialias Kanten
-antialias_none = Antialias Aus
-apply=&\u00dcbernehmen
-ApplyFormatPlugin.text=&Format \u00e4ndern...
-ApplyFormatPlugin.tooltip=Dialog, in dem Knoten- und Kantenformate auf einmal ge\u00e4ndert werden k\u00f6nnen.
-ApplyNoFilteringAction.text=Kein Filter
-as_parent = Wie Vater
-AssignAttributesAction.text=Attribute &Zuweisen...
-attribute_delete_value=Diesen Wert L\u00f6schen
-attribute_delete=Alle Werte L\u00f6schen
-attribute_font_size_tooltip=Schriftgr\u00f6\u00dfe f\u00fcr Attribute
-attribute_list_box_label_text=Vorhandene Werte
-attribute_replace=Ersetzen durch
-attribute_top=Alle bekannten Attribute f\u00fcr geladene Maps
-attributes_adding_empty_attribute_error=Leere Zeichenketten sind als Attributenamen nicht erlaubt
-attributes_all=Alle Attribute
-attributes_attribute=Attribute
-attributes_close=Schliessen
-attributes_deselect_all=Nichts
-attributes_dialog_title=Attribute Verwalten
-attributes_edit_tooltip=Menge Editieren
-attributes_edit=Editieren
-attributes_for_selected=Ausgew\u00e4hlte Knoten
-attributes_for_visible=Alle Sichtbare Knoten
-attributes_import_tooltip=Attribute aus anderen geladenen Maps Importieren
-attributes_import=&Importieren
-attributes_no_import_candidates_found=Keine neue Attribute gefunden
-attributes_popup_delete=Entfernen
-attributes_popup_down=Nach Unten
-attributes_popup_edit=Editieren
-attributes_popup_hide=Verstecken
-attributes_popup_new=Neues Attribut
-attributes_popup_optimal_width=Optimale Breite
-attributes_popup_up=Nach Oben
-attributes_refresh=Aktualisieren
-attributes_restricted_attributes_tooltip=M\u00f6gliche Attribute Beschr\u00e4nken
-attributes_restricted_values_tooltip=M\u00f6gliche Werte f\u00fcr dieses Attribut Beschr\u00e4nken
-attributes_restriction=Beschr\u00e4nkte Menge
-attributes_select_all_tooltip=Alle Ausw\u00e4hlen / Auswahl L\u00f6schen
-attributes_select_all=Alles
-attributes_show=Zeigen
-attributes_skip_root=Ohne Wurzelknoten
-attributes_visible_tooltip=Auswahl f\u00fcr View->Attribute->Ausgew\u00e4hlte Attribute Anzeigen
-attributes_visible=Auswahl f\u00fcr View->Attribute->Ausgew\u00e4hlte Attribute Anzeigen
-automatically_save_message=Map wurde automatisch unter dem Filenamen {0} gespeichert ...
-AutomaticLayoutAction.text= &Automatisches Layout
-AutomaticLayoutAction.tooltip= <html>Fixiert das Aussehen der Mindmap. <br>Die erste Ebene wird in schwarz, die zweite in blau, etc. gezeichnet.</html>
-BackAction.text=Zur\u00fcck
-BackAction.tooltip=Springt in der Liste der selektierten Knoten zur\u00fcck
-background = Hintergrund
-BlinkingNodeHookAction.text= Blinkender Knoten
-BlinkingNodeHookAction.tooltip= <html>Der Knoten beginnt zu blinken. Aber Vorsicht. Diese Funktionalit\u00e4t sollte nicht bei vielen Knoten angewendet werden und <strong> nicht zusammen mit anderen Formatierungseigenschaften bei einem Knoten.</strong></html>
-BoldAction.text= Fett
-boldify_branch = Zweig Fett
-branch = Zweig
-
-cancel = &Abbrechen
-cannot_add_parent_diff_parents = Alle Knoten m\u00fcssen vom selben Vater stammen, um in dieser Funktion verwendet zu werden.
-cannot_add_parent_to_root = Der Ursprungsknoten kann nicht ver\u00e4ndert werden.
-cannot_delete_root = Der Ursprungsknoten kann nicht gel\u00f6scht oder ausgeschnitten werden.
-cannot_join_nodes_with_children = Knoten, die Kinder haben, k\u00f6nnen nicht verbunden werden.
-cannot_move_to_child = Ein Knoten kann nicht an einen seiner Nachkommen verschoben werden.
-CenterAction.text= Zentrieren
-change_link_arrows=change_link_arrows
-
-ChangeNodeLevelLeftsAction.text=Knoten nach links schieben
-ChangeNodeLevelLeftsAction.tooltip=Links des Wurzelknotes werden die Knoten zu Kindern ihres benachbarten Geschwisterknotens. Rechts vom Wurzelknoten werden Knoten eine Stufe heraufgehoben. Direkt am Wurzelknoten tauschen die Knoten die Seite.
-ChangeNodeLevelRightsAction.text=Knoten nach rechts schieben
-ChangeNodeLevelRightsAction.tooltip=Rechts des Wurzelknotes werden die Knoten zu Kindern ihres benachbarten Geschwisterknotens. Links vom Wurzelknoten werden Knoten eine Stufe heraufgehoben. Direkt am Wurzelknoten tauschen die Knoten die Seite.
-choose_background_color = Bitte w\u00e4hlen Sie die Hintergrundfarbe
-choose_cloud_color = Bitte w\u00e4hlen Sie die Wolkenfarbe
-choose_edge_color = Bitte Kantenfarbe W\u00e4hlen
-choose_map_background_color=Map Hintergrundfarbe w\u00e4hlen
-choose_node_background_color = Bitte w\u00e4hlen Sie die Knotenhintergrundfarbe
-choose_node_color = Bitte w\u00e4hlen Sie die Knotenfarbe
-CloseAction.text= Schl&ie\u00dfen
-CloudAction.text= Wolke
-CloudColorAction.text= Wolkenfarbe ...
-
-ColorProperty.ResetColor=Farbe zur\u00fccksetzen
-combined = Kombiniert
-confirmation=Sicherheitsbest\u00e4tigung
-CopyAction.text= Kopieren
-CopySingleAction.text= Einfach Kopieren
-CreationModificationPluginAction.text= \u00c4nderungs&zeiten Anzeigen
-CreationModificationPluginAction.tooltip=<html>Diese Funktion speichert Erzeugungs- und \u00c4nderungsdatum jedes Knotens.</html>
-CutAction.text= Ausschneiden
-decrease_branch_font_size = Zweigschrift Verkleinern
-DecreaseNodeFontAction.text= Zweigschrift Verkleinern
-delete_child = Knoten L\u00f6schen
-delete=&Entfernen
-DeleteAction.text= Knoten L\u00f6schen
-DeleteConditionAction.text=Entfernen
-DocumentationAction.text= Dokumentation
-edge = Linie
-edge_style = Kantenform
-edge_width = Kantenbreite
-EdgeColorAction.text= Kantenfarbe...
-EdgeStyleAction.bezier.text= Geschwungen
-EdgeStyleAction.hide_edge.text=Kante ausblenden
-EdgeStyleAction.linear.text= Linear
-EdgeStyleAction.sharp_bezier.text= Scharfe Bezierkurve
-EdgeStyleAction.sharp_linear.text= Scharfe Linie
-EdgeStyleAsParentAction.text=Wie Vater
-EdgeWidthAction_width_parent.text= Geerbt
-EdgeWidthAction_width_thin.text= D\u00fcnn
-edit = &Bearbeiten
-edit.decision=HTML Editor
-edit.edit_rich_text=Wollen Sie Formatierungen (fett, kursiv, etc.) benutzen?
-edit_link_manually = Link Manuell Bearbeiten...
-EditAction.text= Knoten Bearbeiten
-EditAttributesAction.text=Attribute editieren
-EditFilterAction.text=Editieren
-EditLongAction.text= Knoten in einem separaten Editor bearbeiten...
-EncryptedMap.text= Verschl\u00fcsselte MindMap Erzeugen ...
-EncryptedMap.tooltip= Erzeugt eine neue MindMap die als ganzes verschl\u00fcsselt gespeichert wird.
-enter_base_url = Freeplane wird realtive Links einf\u00fcgen. Bitte geben sie die Basis-URL an.
-enter_confirms = &Eingabetaste Schlie\u00dft das Fenster.
-EnterPassword.text= &Umschalten Ver- / Entschl\u00fcsselt
-
-error = Fehler
-error_applying_template=Es gab einen Fehler im XSL template.
-error_creating_directory = Es gab Probleme, ein Verzeichnis f\u00fcr den Export zu erstellen.
-export_pdf_text = Portables Dokumentenformat (PDF)
-export_svg_text = Skalierbare Vektorgraphik (SVG)
-export_using_xslt=Freeplane Export mittels XSLT
-ExportBranchAction.text= Zweig als neue MindMap ...
-ExportBranchToHTMLAction.text= HTML des Zweiges
-ExportPdf.text= Als PDF...
-ExportPdf.tooltip = Export als PDF
-ExportSvg.text= Als SVG...
-ExportSvg.tooltip = Export als SVG
-ExportToHTMLAction.text= Als HTML
-ExportToImage.jpg.text= Als JPEG...
-ExportToImage.png.text= Als PNG...
-ExportToOoWriter.text= Als Open Office Writer Dokument...
-ExportToOoWriter.tooltip=Entfaltete Knoten geh\u00f6ren zur Struktur, gefaltete Knoten bilden den Inhalt des Dokuments.
-extension_menu = &Stile
-extract_link_from_text.tooltip=Hyperlink aus Knotentext zuweisen
-ExtractLinkFromTextAction.text=Hyperlink aus Knotentext
-FaqOpenURLAction.text= FAQ (H\u00e4ufig gestellte Fragen)
-file = &Datei
-file_already_exists = Die Datei {0} existiert bereits. Wollen Sie sie \u00fcberschreiben?
-filter_add=&Hinzuf\u00fcgen
-filter_and=&Und
-filter_conditions = Filter
-filter_contains=Beinhaltet
-filter_created_after=Erzeugt nach dem
-filter_created_before=Erzeugt vor dem
-filter_delete=&Entfernen
-filter_dialog=Filter Definieren
-filter_does_not_exist=Fehlt
-filter_edit_description=Filterliste Editieren
-filter_enter_value=Enter Value
-filter_exist=Existiert
-filter_icon=Icon
-filter_ignore_case=Gro\u00df-/Klein- Ignorieren
-filter_is_equal_to=Ist Gleich
-filter_is_not_equal_to=Ist Ungleich
-filter_link=Hyperlink
-filter_modified_after=Ver\u00e4ndert nach dem
-filter_modified_before=Ver\u00e4ndert vor dem
-filter_no_filtering=Kein Filter
-filter_node=Knotentext
-filter_not=&Nicht
-filter_or=O&r
-filter_select=&Select
-filter_selected_node_view=Selektierte Knoten
-filter_time=\u00c4nderungstag
-filter=Filter Aktivieren
-find_what = Suchbegriff
-FindAction.text= Suchen...
-FindNextAction.text= Weitersuchen
-fit_map_to_page = Auf Seitengr\u00f6\u00dfe Skalieren
-FitToPage.text= Ansichtsgr\u00f6\u00dfe "Gesamte Seite"
-FitToPage.tooltip= Stellt die Vergr\u00f6\u00dferung so ein, da\u00df die gesamte MindMap in das aktuellen Fenster pa\u00dft.
-fold = Falten
-FoldAllAction.text= Alles Zuklappen
-FoldAllAction.tooltip= <html>Klappt die selektierten Knoten und alle Kinder zu.</html>
-FoldOneLevelAction.text= Eine Ebene Zuklappen
-FoldOneLevelAction.tooltip= <html>Klappt die selektierten Knoten um eine Ebene zu.</html>
-follow_graphical_link=Zu:
-FollowLinkAction.text= Hyperlink \u00d6ffnen
-font = Schriftart
-FontFamilyAction.text= Schriftart
-FontSizeAction.text= Schriftgr\u00f6\u00dfe
-format_menu_edge_styles=Kantenf&ormen
-format_menu_edge_widths=&Kantenbreiten
-FormatCopy.text= Formatierung Kopieren
-FormatCopy.tooltip= <html>Kopiert die Formatierung des Knotens</html>
-FormatPaste.text= Formatierung Einf\u00fcgen
-FormatPaste.tooltip= <html>F\u00fcgt die Formatierung des Knotes ein</html>
-ForwardAction.text=Vorw\u00e4rts
-ForwardAction.tooltip=Springt in der Liste der selektierten Knoten vorw\u00e4rts
-Freeplane.progress.buildScreen=Bildschirm aufbauen...
-Freeplane.progress.createController=Controller erzeugen...
-Freeplane.progress.createInitialMode=Initialen Modus erzeugen...
-Freeplane.progress.endStartup=Start beendet.
-Freeplane.progress.gettingPreferenceDirectories=Ermittle Verzeichnisse...
-Freeplane.progress.gettingPreferences=Lese Voreinstellungen...
-Freeplane.progress.loadMaps=Maps laden...
-Freeplane.progress.propagateLookAndFeel=Look And Feel \u00fcbernehmen...
-Freeplane.progress.settingPreferences=Voreinstellungen setzen...
-Freeplane.progress.startCreateController=Controller starten...
-Freeplane.progress.updateLookAndFeel=Aktualisieren des Look And Feel...
-FreeplaneHelpStarter.text= Hilfeseiten ...
-FreeplaneHelpStarter.tooltip= Freeplane Hilfe
-GotoLinkNodeAction.text= Folge Link
-GrabKeyDialog.common.cancel=Abbrechen
-GrabKeyDialog.common.ok=OK
-GrabKeyDialog.grab-key.assigned-to.none=Nicht zugewiesen
-GrabKeyDialog.grab-key.assigned-to=Zugewiesen zu
-GrabKeyDialog.grab-key.clear=L\u00f6schen
-GrabKeyDialog.grab-key.remove-ask=Sind Sie sicher, da\u00df Sie diese Tastenzuweisung entfernen m\u00f6chten?
-GrabKeyDialog.grab-key.remove=Entfernen
-GrabKeyDialog.grab-key.title=Neue Taste eingeben
-help = Hilfe
-HideableAction.tooltip= <html>Die Hintergrundfarbe jedes ge\u00e4nderten Knotens \u00e4ndern.</html>
-HideAllAttributesAction.text= Alle Attribute Verbergen
-HierarchicalIconsAction.text=Hierarchische &Icons
-HierarchicalIconsAction.tooltip=Zeigt Icons auch von den Kindern an.
-hot_keys = Tastaturk\u00fcrzel
-hot_keys_table = Tastaturk\u00fcrzeltabelle
-html_export_based_on_headings = HTML Export - \u00dcberschriftenbasiert
-html_export_fold_all = HTML-Export Alles Eingeklappt
-html_export_fold_currently_folded = HTML-Export mit Aktueller Faltung
-html_export_no_folding = HTML-Export Ohne Faltung
-icon_attach = Hier hin sehen
-icon_back = Zur\u00fcck
-icon_bell = Erinnerung
-icon_bookmark = Hervorragend
-icon_broken-line = Unterbrochen
-icon_button_cancel = Nicht OK
-icon_button_ok = OK
-icon_calendar = Termin
-icon_clanbomber = Gef\u00e4hrlich
-icon_clock = Zeit
-icon_closed = Kein Eingang
-icon_decrypted = Offen
-icon_desktop_new = Nicht vergessen
-icon_down = Nach Unten
-icon_edit = Verfeinern
-icon_encrypted = Verschlossen
-icon_family=Familie
-icon_fema=Frauen
-icon_female1=Frau1
-icon_female2=Frau2
-icon_flag-black = Schwarze Flagge
-icon_flag-blue = Blaue Flagge
-icon_flag-green = Gr\u00fcne Flagge
-icon_flag-orange = Orangefarbene Flagge
-icon_flag-pink = Pinkfarbene Flagge
-icon_flag-yellow = Gelbe Flagge
-icon_flag = Rote Flagge
-icon_folder = Ordner
-icon_forward = Vorw\u00e4rts
-icon_freemind_butterfly = FreeMind
-icon_full-0=Priorit\u00e4t 0
-icon_full-1 = Priorit\u00e4t 1
-icon_full-2 = Priorit\u00e4t 2
-icon_full-3 = Priorit\u00e4t 3
-icon_full-4 = Priorit\u00e4t 4
-icon_full-5 = Priorit\u00e4t 5
-icon_full-6 = Priorit\u00e4t 6
-icon_full-7 = Priorit\u00e4t 7
-icon_full-8 = Priorit\u00e4t 8
-icon_full-9 = Priorit\u00e4t 9
-icon_go=Gr\u00fcne Ampel
-icon_gohome = Home
-icon_group=Gruppe
-icon_help = Frage
-icon_hourglass = Warten
-icon_idea = Idee
-icon_info=Info
-icon_kaddressbook = Telefon
-icon_kmail = E-Mail
-icon_knotify = Musik
-icon_korn = Postkasten
-icon_ksmiletris = Ich bin zufrieden
-icon_launch=Abflug
-icon_licq = S\u00fc\u00df
-icon_list=Liste
-icon_Mail = Post
-icon_male1=Mann1
-icon_male2=Mann2
-icon_menu = I&cons
-icon_messagebox_warning = Wichtig
-icon_password = Passwort
-icon_pencil = Noch zu verfeinern
-icon_penguin = Linux
-icon_prepare=Gelbe Ampel
-icon_smiley-angry = W\u00fctend
-icon_smiley-neutral = Keine Meinung
-icon_smiley-oh = \u00fcberaschung
-icon_smily_bad = Nicht gut
-icon_stop-sign = Stop
-icon_stop = Rote Ampel
-icon_up = Nach Oben
-icon_wizard = Magisch
-icon_xmag = Noch zu diskutieren
-icon_yes = Wichtig
-IconSelectionPlugin.text= Icon W\u00e4hlen...
-IconSelectionPlugin.tooltip= <html>Ein Fenster erscheint, indem ein Icon ausgew\u00e4hlt werden kann.</html>
-import = Importieren
-import_linked_branch_no_link = Der ausgew\u00e4hlte Knoten ist mit keiner anderen Freeplane Datei verkn\u00fcpft, die importiert werden k\u00f6nnte.
-ImportBranchAction.text= Zweig Von (mm-) Datei...
-ImportExplorerFavoritesAction.text= Explorer-Favoriten...
-ImportFolderStructureAction.text= Ordnerstruktur...
-ImportLinkedBranchAction.text= Von Link
-ImportLinkedBranchWithoutRootAction.text= Von Link Ohne Wurzelknoten
-ImportMindmanagerFiles.text=MindManager X5 Map...
-increase_branch_font_size = Zweigschrift Vergr\u00f6ssern
-IncreaseNodeFontAction.text= Zweigschrift Vergr\u00f6ssern
-ItalicAction.text= Kursiv
-italicise_branch = Zweig kursiv
-JoinNodesAction.text= Knoten verbinden
-
-LatexNodeHookAction.text= &Latex
-LatexNodeHookAction.tooltip= <html>Latex Formel Editor</html>
-less_than_two_selected_nodes = Bitte mindestens zwei Knoten ausw\u00e4hlen, zwischen denen Verbindungen gezeichnet werden sollen.
-license_text = Freeplane - A Program for creating and viewing Mindmaps\nCopyright (C) 2000 Joerg Mueller <joergmueller at bigfoot.com>\nSee COPYING for Details\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License\nas published by the Free Software Foundation; either version 2\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARR [...]
-LicenseAction.text= Lizenz
-link_not_available_any_more = Die Verkn\u00fcpfung ist nicht mehr g\u00fcltig, da der Zielknoten in der Zwischenzeit gel\u00f6scht wurde.
-
-load = &Laden
-long_node_changed_cancel =Knoten wurde ver\u00e4ndert. Wollen Sie diese \u00c4nderungen verwerfen?
-long_node_changed_submit =Knoten wurde ver\u00e4ndert. Wollen Sie diese \u00c4nderungen speichern?
-lots_of_links_warning = Durch diesen Befehl w\u00fcrden sehr viele graphische Links erzeugt. Sollen diese Links wirklich erzeugt werden?
-ManagePatterns.text=Stile Verwalten
-ManagePatterns.tooltip=Verwaltung der Stilvorgaben...
-ManagePatternsPopupDialog.Actions=&Aktionen
-ManagePatternsPopupDialog.add=&Neuen Stil Hinzuf\u00fcgen
-ManagePatternsPopupDialog.apply=&Anwenden
-ManagePatternsPopupDialog.duplicate=Stil &Duplizieren
-ManagePatternsPopupDialog.DuplicateNameMessage=Der Name kommt doppelt vor. Bitte ver\u00e4ndern Sie die Namen, bevor Sie den Dialog verlassen.
-ManagePatternsPopupDialog.from_nodes=Stil Aus Ausgew\u00e4hlten Knoten Er&zeugen
-ManagePatternsPopupDialog.remove=Stil &Entfernen
-ManagePatternsPopupDialog.Save=Speichern und Zur\u00fcck
-map_already_exists = Die Mindmap existiert bereits. Soll sie \u00fcberschrieben werden?
-map_corrupted = Die Mindmap ist nicht lesbar. M\u00f6chten Sie die Details sehen?
-map_not_saved=Die Map wurde noch nicht gespeichert.
-MapBackgroundColorAction.text=Map Hintergrundfarbe
-menu_attributes = Attribute
-menu_extras = E&xtras
-ExportAction.text = E&xport
-menu_file_import = I&mport
-menu_format = &Format
-menu_insert = &Einf\u00fcgen
-menu_navigate = &Navigieren
-menu_view = &Ansicht
-mindmap = Map
-mindmaps = Maps
-mindmaps_desc = Maps (*.mm)
-mindmaps_filter_desc = Filter (*.mmfilter)
-mode_Browse=Ansichtsmodus
-mode_File=Dateimodus
-mode_MindMap=Mindmapmodus
-mode_na = Modus nicht vorhanden
-mode_status = Modus ge\u00e4ndert zu {0}
-mode_title =Freeplane - {0}
-modes = Modi
-most_recent_files = &Zuletzt Ge\u00f6ffnete Dateien
-MoveToRootAction.text= Wurzel Zentrieren
-NavigationNextMapAction.text= N\u00e4chste Map
-NavigationPreviousMapAction.text= Vorherige Map
-new_mindmap = Neue Mindmap
-new_node = Neuer Knoten
-new_node_as_sibling_not_possible_for_the_root = Der Wurzelknoten kann keine neuen Geschwister haben.
-NewChildAction.text= Neuer Unterknoten
-NewMapAction.text= Neu
-NewParentNode.text= Einr\u00fcckung Erh\u00f6hen
-NewParentNode.tooltip= <html>Alle selektierten Knoten bekommen einen neuen Vaterknoten.</html>
-NewPreviousSiblingAction.text= Neuer Geschwisterknoten davor
-NewSiblingAction.text= Neuer Geschwisterknoten danach
-no = Nein
-no_format_copy_before_format_paste = Sie k\u00f6nnen ein Format erst dann einf\u00fcgen, wenn Sie ein anderes kopiert haben.
-no_previous_find = Keine vorherigen Fundstellen.
-node = Knoten
-node_changed_discard_changes = Knoten wurde ver\u00e4ndert. Wollen Sie diese \u00c4nderungen verwerfen?
-node_is_write_protected=Zielknoten ist schreibgesch\u00fctzt.
-node_location_help=Ziehen \u00e4ndert die Knotenlage, Strg+Ziehen \u00e4ndert die Knotenabst\u00e4nde, Doppelklick und Strg+Doppelklick setzt sie zur\u00fcck.
-NodeBackgroundColorAction.text= Knoten&hintergrundfarbe...
-NodeColorAction.text= Knotenfarbe \u00c4ndern...
-NodeColorBlendAction.text= Knotenfarbe Aufhellen
-NodeDownAction.text= Knoten nach unten schieben
-NodeListAction.text=Suchen und Ersetzen...
-NodeListAction.tooltip=Zeigt alle Knoten in einer filterbaren Liste an.
-NodeShapeAction.bubble.text= Knotentyp &Blase
-NodeShapeAction.fork.text= Knotentyp &Linie
-NodeUpAction.text= Knoten nach oben schieben
-nonboldify_branch = Zweig normal
-nonitalicise_branch = Zweig nichtkursiv
-normal = Normal
-not_saved_for_link_error = Die Mindmap muss abgespeichert werden, bevor ein Link per Dateiauswahl gesetzt werden kann.
-note_window_location = Notizfenster Position
-ok = &OK
-OpenAction.text= \u00d6ffnen...
-OpenFreeplaneSiteAction.text=Freeplane Webseite
-option_changes_may_require_restart=Die meisten Eigenschafts\u00e4nderungen werden erst bei einem Neustart von Freeplane aktiv.
-OptionalDontShowMeAgainDialog.cancel=&Nein
-OptionalDontShowMeAgainDialog.dontShowAgain=Nicht wieder &fragen.
-OptionalDontShowMeAgainDialog.ok=&Ja
-OptionalDontShowMeAgainDialog.rememberMyDescision=&Entscheidung merken.
-OptionPanel.absolute=Absolut
-OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=Stile des Automatischen Layouts
-OptionPanel.always_fold_all_after_load=Alle Knoten falten
-OptionPanel.always_save_folding_state.tooltip=Wenn das H\u00e4kchen gesetzt ist, wird beim Schlie\u00dfen der Map nach \u00c4nderungen des Faltungszustandes nachgefragt, ob sie gespeichert werden soll.
-OptionPanel.always_save_folding_state=Faltungszustands\u00e4nderungen immer Speichern
-OptionPanel.always_save_folding=immer
-OptionPanel.always_unfold_all_after_load=Keine Knoten falten
-OptionPanel.antialias.tooltip=<html>Bestimmt die Qualit\u00e4t der Graphik. H\u00f6here Qualit\u00e4t ben\u00f6tigt allerdings mehr Darstellungszeit.</html>
-OptionPanel.antialias_all=Antialias Alles
-OptionPanel.antialias_edges=Antialias Kanten
-OptionPanel.antialias_none=Kein Abrunden
-OptionPanel.antialias=Kandenrundung
-OptionPanel.Appearance=Erscheinung
-OptionPanel.ar=Ar
-OptionPanel.as_parent=Wie der Vater
-OptionPanel.ask=Nachfragen
-OptionPanel.automatic=Automatisch
-OptionPanel.automaticFormat_level=Stile des Automatischen Layouts
-OptionPanel.automaticFormat_level2=Format der Ebene 1
-OptionPanel.Behaviour=Verhalten
-OptionPanel.
-OptionPanel.
-OptionPanel.bubble=Blase
-OptionPanel.Cancel=Abbrechen
-OptionPanel.childpattern.tooltip=Dieser Stil wird auf die Kinder des Knotens angewendet. Damit lassen sich mehrere Ebenen gleichzeitig ver\u00e4ndern.
-OptionPanel.childpattern=Stil der Unterknoten
-OptionPanel.clear_all_setters.tooltip=Alle Schalter gleichzeitig ver\u00e4ndern
-OptionPanel.clear_all_setters=Alle umschalten
-OptionPanel.combined=Kombiniert
-OptionPanel.convert_to_current_version.tooltip=<html>Nur f\u00fcr sehr gro\u00dfe Mindmaps von denen Sie wissen, dass sie nicht konvertiert werden m\u00fcssen <br>(dies wissen allerdings nur Experten!) k\u00f6nnen Sie auf eine Konvertierung verzichten.</html>
-OptionPanel.convert_to_current_version=<html>Sollen Mindmaps von \u00e4lteren Freeplane Versionen <br>automatisch zur aktuellen Version konvertiert werden?</html>
-OptionPanel.cs=Cs
-OptionPanel.cut_nodes_without_question.tooltip=Wenn dieses H\u00e4kchen gesetzt ist, werden Knoten ohne Nachfrage ausgeschnitten. Dies kann bei unbeabsichtigtem Ausschneiden zu Datenverlust f\u00fchren.
-OptionPanel.cut_nodes_without_question=Knoten ohne Best\u00e4tigung ausschneiden?
-OptionPanel.de=De
-OptionPanel.default_browser_command_mac.tooltip=<html> and MAC: (thanks to Nick!)</html>
-OptionPanel.default_browser_command_mac=Standard Browser Befehl Mac
-OptionPanel.default_browser_command_other_os.tooltip=<html> Das ist typischerweise Linux:</html>
-OptionPanel.default_browser_command_other_os=Standard Browser Befehl f\u00fcr andere Betriebssysteme
-OptionPanel.default_browser_command_windows_9x.tooltip=<html>F\u00fcr Windows (die Anf\u00fchrungszeichen sind notwendig, da Links Gleichheitszeichen enthalten k\u00f6nnen).</html>
-OptionPanel.default_browser_command_windows_9x=Standard Browser Befehl Windows 9x
-OptionPanel.default_browser_command_windows_nt.tooltip=<html>F\u00fcr Windows (die Anf\u00fchrungszeichen sind notwendig, da Links Gleichheitszeichen enthalten k\u00f6nnen).</html>
-OptionPanel.default_browser_command_windows_nt=Standard Browser Befehl Windows NT
-OptionPanel.default=Standard
-OptionPanel.defaultfont.tooltip=<html>Dies funktioniert nur, wenn TrueType-Schriftarten vorhanden sind.</html>
-OptionPanel.defaultfont=Standard Schriftart
-OptionPanel.defaultfontsize=Standard Schriftart Gr\u00f6\u00dfe
-OptionPanel.defaultfontstyle=Standard Schriftart Stil
-OptionPanel.Defaults=Standards
-OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> Wenn die automatischen Zwischenspeicherungen beim normalen Verlassen von Freeplane gel\u00f6scht werden sollen, sollten Sie ein H\u00e4kchen setzen.</html>
-OptionPanel.delete_automatic_saves_at_exit=Sollen die automatisch gespeicherten Maps beim Verlassen gel\u00f6scht werden
-OptionPanel.delete_nodes_without_question.tooltip=Wenn dieses H\u00e4kchen gesetzt ist, werden Knoten ohne Nachfrage gel\u00f6scht. Dies kann bei unbeabsichtigtem L\u00f6schen zu Datenverlust f\u00fchren.
-OptionPanel.delete_nodes_without_question=Knoten ohne Best\u00e4tigung l\u00f6schen?
-OptionPanel.disable_cursor_move_paper=Kein Cursor beim Bewegen der Map
-
-OptionPanel.dk=Dk
-
-OptionPanel.draganddrop=Drag And Drop
-OptionPanel.edgecolor.tooltip=Kanteneigenschaft der Verbindung zum Vaterknoten (wird auch auf alle Unterknoten angewendet)
-OptionPanel.edgecolor=Kantenfarbe
-OptionPanel.edgestyle.tooltip=Kanteneigenschaft der Verbindung zum Vaterknoten (wird auch auf alle Unterknoten angewendet)
-OptionPanel.edgestyle=Kantentyp
-OptionPanel.edgewidth.tooltip=Kanteneigenschaft der Verbindung zum Vaterknoten (wird auch auf alle Unterknoten angewendet)
-OptionPanel.EdgeWidth_1=1
-OptionPanel.EdgeWidth_2=2
-OptionPanel.EdgeWidth_4=4
-OptionPanel.EdgeWidth_8=8
-OptionPanel.EdgeWidth_parent=Wie der Vater
-OptionPanel.EdgeWidth_thin=D\u00fcnn
-OptionPanel.edgewidth=Kantenbreite
-
-OptionPanel.el__buttons_above=Kn\u00f6pfe oben
-OptionPanel.el__enter_confirms_by_default=<EINGABE> beendet den Dialog
-OptionPanel.el__max_default_window_height=Max Standard Fensterh\u00f6he
-OptionPanel.el__max_default_window_width=Max Standard Fensterbreite
-OptionPanel.el__min_default_window_height=Min Standard Fensterh\u00f6he
-OptionPanel.el__min_default_window_width=Min Standard Fensterbreite
-OptionPanel.el__position_window_below_node=Position Fenster unter dem Knoten
-OptionPanel.show_icon_for_attributes=Attribut Icons Zeigen
-OptionPanel.el=El
-OptionPanel.en=En
-
-
-OptionPanel.Environment=Umgebung
-OptionPanel.es=Es
-OptionPanel.et=Et
-OptionPanel.execute_scripts_without_asking.tooltip=<html>Wenn das H\u00e4kchen gesetzt ist, werden Skripte ohne Best\u00e4tigung ausgef\u00fchrt. <br>Freeplane Skripte sind prinzipiell in der Lage, beliebige Aktionen auf Ihrem Rechner auszuf\u00fchren. <br>Daher sollten Sie keinen Skripten vertrauen, die Sie nicht kennen.</html>
-OptionPanel.execute_scripts_without_asking=Skripte ohne Nachfragen ausf\u00fchren?
-OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>Wenn Ihre Groovyskripte fremde Programme (wie z.B. einen Browser) ausf\u00fchren k\u00f6nnen sollen ohne nachzufragen(!),<br>m\u00fcssen Sie dieses H\u00e4kchen setzen.<br>Allerdings sollten Sie vorsichtig sein, da nun b\u00f6swillige Skripte Ihren Computer verw\u00fcsten k\u00f6nnten!</body></html>
-OptionPanel.execute_scripts_without_exec_restriction=Ausf\u00fchren anderer Applikationen erlauben (NICHT empfohlen)
-OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>Wenn Ihre Groovyskripte Dateioperationen (wie \u00d6ffnen/Schreiben/L\u00f6schen) ausf\u00fchren k\u00f6nnen sollen,<br>m\u00fcssen Sie dieses H\u00e4kchen setzen.<br>Allerdings sollten Sie vorsichtig sein, da nun b\u00f6swillige Skripte Ihren Computer verw\u00fcsten k\u00f6nnten!</body></html>
-OptionPanel.execute_scripts_without_file_restriction=Dateioperation erlauben (NICHT empfohlen)
-OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>Wenn Ihre Groovyskripte Netzwerkoperationen ausf\u00fchren k\u00f6nnen sollen,<br>m\u00fcssen Sie dieses H\u00e4kchen setzen.<br>Allerdings sollten Sie vorsichtig sein, da nun b\u00f6swillige Skripte Daten aus Ihrem Computer ausspionieren k\u00f6nnten!</body></html>
-OptionPanel.execute_scripts_without_network_restriction=Netzwerkoperationen erlauben (NICHT empfohlen)
-OptionPanel.experimental_file_locking_on.tooltip=<html> Experimentelles Feature</html>
-OptionPanel.experimental_file_locking_on=Experimentelles sperren der ge\u00f6ffneten Dateien
-OptionPanel.export_icons_in_html.tooltip=<html> Gibt an, ob die Icons auch nach HTML exportiert werden sollen. <br>Allerdings m\u00fcssen die Icons dann auch immer mit dem HTML kopiert werden, damit sie gefunden werden.</html>
-OptionPanel.export_icons_in_html=Export Icons nach Html
-OptionPanel.Files=Dateien
-OptionPanel.first=Erster
-OptionPanel.foldingsymbolwidth.tooltip=<html> Gr\u00f6\u00dfe des Kreises, der die Faltung symbolisiert<html>
-OptionPanel.foldingsymbolwidth=Faltungskreisgr\u00f6\u00dfe
-OptionPanel.fork=Linie
-OptionPanel.fr=Fr
-OptionPanel.gl=Gl
-OptionPanel.gtk=Gtk
-OptionPanel.hr=Hr
-OptionPanel.html_export_based_on_headings=\u00dcberschriftenbasiert
-OptionPanel.html_export_fold_all=Alles Zuklappen
-OptionPanel.html_export_fold_currently_folded=Aktuelle Faltung
-OptionPanel.html_export_folding=Html Export Faltung
-OptionPanel.html_export_no_folding=Ohne Faltung
-OptionPanel.HTML=HTML
-OptionPanel.hu=Hu
-OptionPanel.icon.tooltip=Wenn Sie ein Icon ausw\u00e4hlen, werden alle anderen Icons des Knotens entfernt und das ausgew\u00e4hlte Icon zugewiesen.
-OptionPanel.icons.list.tooltip=Hier ist es m\u00f6glich, die Reihenfolge der Standardicons zu ver\u00e4ndern, bzw. einige auszublenden. Die Icons sind mit Semikola getrennt.
-OptionPanel.icon=Icon
-OptionPanel.icons.list=Liste der angezeigten Standardicons
-OptionPanel.id=Id
-OptionPanel.it=It
-OptionPanel.ja=Ja
-
-
-OptionPanel.Keystrokes=Tasten
-OptionPanel.kr=Kr
-OptionPanel.language.tooltip=<html>Dies ist die Sprache, die im Programm verwendet wird. 'Automatisch' bedeutet, dass die Sprache des Benutzers geladen wird, soweit vorhanden. </html>
-OptionPanel.language=Sprache
-OptionPanel.last_opened_list_length=Anzahl der Liste der zuletzt ge\u00f6ffneten Dateien
-OptionPanel.last=Letzter
-OptionPanel.level=Level
-OptionPanel.level1=Wurzelknotenformat
-OptionPanel.level2=Format der Ebene 1
-OptionPanel.level3=Format der Ebene 2
-OptionPanel.level4=Format der Ebene 3
-OptionPanel.level5=Formate der restlichen Ebenen
-OptionPanel.links=Links
-OptionPanel.load_folding_from_map_default_fold_all=Faltung laden oder falten Alles
-OptionPanel.load_folding_from_map_default_unfold_all=Faltung laden oder falten nichts
-OptionPanel.load_folding=Faltung laden
-OptionPanel.load_last_map.tooltip=<html>Wenn Freeplane started, wird automatisch die zuletzt geladene Map geladen, wenn angeschaltet.</html>
-OptionPanel.load_last_map=Automatisch letzte Map laden
-OptionPanel.lookandfeel.tooltip=<html>Bei Problemen w\u00e4hlen Sie 'nothing'.</html>
-OptionPanel.lookandfeel=Look and Feel
-OptionPanel.lt=Lt
-OptionPanel.mapxsize=Map-X-Gr\u00f6\u00dfe
-OptionPanel.mapysize=Map-Y-Gr\u00f6\u00dfe
-OptionPanel.max_node_width.tooltip=<html>TAngabe in pixeln</html>
-OptionPanel.max_node_width=Maximale Knotenbreite
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>Die Breite der Tooltips in Pixeln.</html>
-OptionPanel.toolTipManager.max_tooltip_width=ToolTip Breite
-OptionPanel.metal=Metall
-OptionPanel.motif=Motif
-OptionPanel.nb=Nb
-OptionPanel.never_save_folding=nie
-OptionPanel.nl=Nl
-OptionPanel.nn=Nn
-OptionPanel.nodebackgroundcolor.tooltip=Hier wird die Knotenhintergrundfarbe eingestellt, die erscheint, wenn der Knoten nicht selektiert ist.
-OptionPanel.nodebackgroundcolor=Knotenhintergrundfarbe
-OptionPanel.nodecolor.tooltip=Hier wird die Knotenvordergrundfarbe eingestellt, die erscheint, wenn der Knoten nicht selektiert ist.
-OptionPanel.nodecolor=Knotenfarbe
-
-OptionPanel.nodefontbold=Fett
-
-OptionPanel.nodefontitalic=Kursiv
-
-OptionPanel.nodefontname=Knotenschrift
-
-OptionPanel.nodefontsize=Schriftgr\u00f6\u00dfe
-OptionPanel.nodeshape.tooltip=<html>Der Stil beschreibt die \u00e4ussere Form eines Knotens.<br>M\u00f6gliche Werte sind:<br><table border="1"><tr><td>Linie:</td><td>Der Knoten wird nur unterstrichen,</td></tr><tr><td>Blase:</td><td>Der Knoten wird von einem geschwungenen Rechteck umfa\u00dft,</td></tr><tr><td>Wie Vater:</td><td> Der Stil wird vom Vater (oder vom Wurzelknotenstil f\u00fcr den Wurzelknoten) \u00fcbernommen,</td></tr><tr><td>Kombiniert:</td><td>Gefaltete Knoten erhalten de [...]
-OptionPanel.nodeshape=Knotenstil
-OptionPanel.nodetext=Knotentext
-OptionPanel.nothing=Nichts
-OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> Die automatische Speicherung speichert nur soviele unterschiedlichen Versionen, wie angegeben. Danach werden die Dateien zyklisch \u00fcberschrieben. </html>
-OptionPanel.number_of_different_files_for_automatic_save=Anzahl von automatischen Speicherungen
-OptionPanel.OK=Speichern
-
-
-OptionPanel.patternname.tooltip=Eindeutiger Name des Stils
-OptionPanel.patternname=Name
-
-OptionPanel.pl=Pl
-OptionPanel.placenewbranches=Ort neuer Knoten
-OptionPanel.plugins/scripting/tab_name=Skripte
-OptionPanel.printonwhitebackground=Immer auf wei\u00dfem Hintergrund drucken
-OptionPanel.pt_BR=Pt BR
-OptionPanel.pt_PT=Pt PT
-OptionPanel.relative=Relativ
-OptionPanel.remind_type_of_new_nodes.tooltip=<html>Wenn "Nachfragen", wird jedesmal gefragt, wenn ein Knoten zum Editieren ge\u00f6ffnet wird. <br>Bei "Nein" wird ein reiner Texteditor ge\u00f6ffnet, w\u00e4hrend <br>bei "Ja" ein Texteditor, der Formatierungen unterst\u00fctzt, ge\u00f6ffnet wird.</html>
-OptionPanel.remind_use_rich_text_in_new_long_nodes=Formatierungen f\u00fcr alle Knoten benutzen
-OptionPanel.remove_notes_without_question.tooltip=Wenn dieses H\u00e4kchen gesetzt ist, werden Notizen ohne Nachfrage gel\u00f6scht. Dies kann bei unbeabsichtigtem L\u00f6schen zu Datenverlust f\u00fchren.
-OptionPanel.remove_notes_without_question=Notizen ohne Nachfrage l\u00f6schen
-OptionPanel.revision_color.tooltip=Hintergrundfarbe f\u00fcr ge\u00e4nderte Knoten.
-OptionPanel.revision_color=Revisionfarbe
-OptionPanel.ru=Ru
-OptionPanel.save_folding_if_map_is_changed=if Map ist ver\u00e4ndert
-OptionPanel.save_folding= Faltung speichern
-OptionPanel.save_modification_times=\u00c4nderungszeiten speichern
-OptionPanel.save_only_intrisically_needed_ids.tooltip=<html>Wenn ausgew\u00e4hlt, werden nur solche IDs gespeichert, die irgendwo in der gleichen Map gebraucht werden. <br>Dies verhindert allerdings, von au\u00dfen zu speziellen Knoten dieser Map zu verlinken.</html>
-OptionPanel.save_only_intrisically_needed_ids=Nur gebrauchte Knoten-IDs speichern
-OptionPanel.script.tooltip=Das Skript selbst.
-OptionPanel.script_directories=Suchpfad f\u00fcr Skripte (Eintr\u00e4ge trennen durch ;;)
-OptionPanel.script_user_key_name_for_signing.tooltip=<html>Wenn Sie Ihre Scripte selbst signieren wollen, geben Sie hier den Alias des Schl\u00fcssels an. <br>Der Schl\u00fcssel wird im Standard keystore erwartet. <br>Das Passwort des Schl\u00fcssels mu\u00df mit dem des Keystores \u00fcereinstimmen (dies ist die Standardeinstellung).</html>
-OptionPanel.script_user_key_name_for_signing=Optionaler Aliasname eines private Schl\u00fcssels, um Scripte zu signieren
-OptionPanel.script=Skript
-OptionPanel.se=Se
-OptionPanel.selection_method_by_click=Durch Mausklick
-OptionPanel.selection_method_delayed=Verz\u00f6gert
-OptionPanel.selection_method_direct=Direkt
-OptionPanel.selection_method=Auswahlmodus
-OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName=Stile
-OptionPanel.separator.anti_alias=Kandenrundung
-OptionPanel.separator.attributes=Attribute
-OptionPanel.separator.automatic_save=Automatisches Speichern
-OptionPanel.separator.behaviour=Verhalten
-OptionPanel.separator.browser=Browser
-OptionPanel.separator.commands_for_the_program=Programm
-OptionPanel.separator.default_colors=Standard Farben
-OptionPanel.separator.default_fonts=Standard Schriftarten
-OptionPanel.separator.default_styles=Standard Stile
-OptionPanel.separator.EdgeControls=Kanteneigenschaften
-OptionPanel.separator.edit_long_node_window=Fenster f\u00fcr lange Knoten
-OptionPanel.separator.files=Dateien
-OptionPanel.separator.General=Allgemein
-OptionPanel.separator.html_export=Html Export
-OptionPanel.separator.html_import=Html Import
-OptionPanel.separator.hyperlink_types=Hyperlink Typen
-OptionPanel.separator.icon_properties=Icons
-OptionPanel.separator.icons=Piktogramme in "Icon W\u00e4hlen..."
-OptionPanel.separator.initial_map_size=Initiale Mapgr\u00f6\u00dfe
-OptionPanel.separator.key_typing=Tastatureingabe
-OptionPanel.separator.language=Sprache
-OptionPanel.separator.load=Laden
-OptionPanel.separator.look_and_feel=Look and Feel
-OptionPanel.separator.mouse_wheel=Mausrad
-OptionPanel.separator.new_node_commands=Knotenerzeugung
-OptionPanel.separator.node_editing_commands=Knotenver\u00e4nderung
-OptionPanel.separator.node_navigation_commands=Knotennavigation
-OptionPanel.separator.NodeColors=Knotenfarben
-OptionPanel.separator.NodeStyles=Knoteneigenschaften
-OptionPanel.separator.notifications=Nachfragen
-OptionPanel.separator.other_defaults=Andere Standards
-OptionPanel.separator.others=Andere Tastenkombinationen
-OptionPanel.separator.patterns=Stile
-OptionPanel.separator.plugins/scripting/separatorPropertyName=Berechtigungen
-OptionPanel.separator.root_node_appearance=Erscheinung des Wurzel-Knotens
-OptionPanel.separator.save=Speichern
-OptionPanel.separator.ScriptingControl=Skripte
-OptionPanel.separator.selection_colors=Selektion Farben
-OptionPanel.separator.selection_method=Auswahlmodus
-OptionPanel.separator.undo=R\u00fcckg\u00e4ngig
-OptionPanel.set_property_text.tooltip=Leer=Nicht \u00e4ndern; Minus=Eigenschaft l\u00f6schen (also auf den Standard zur\u00fccksetzen); Plus=Eigenschaft setzen.
-OptionPanel.set_property_text=Ver\u00e4ndern?
-OptionPanel.setscript.tooltip=Schaltet die M\u00f6glichkeit zu, ein Skript zu dem Stil hinzuzuf\u00fcgen, dass ausgef\u00fchrt wird, wenn der Stil angewendet wird.
-OptionPanel.setscript=Ver\u00e4ndern?
-OptionPanel.sharp_bezier=Scharfe Bezierkurve
-OptionPanel.sharp_linear=Scharfe Linie
-OptionPanel.signed_script_are_trusted.tooltip=Wenn Skripte von einer vertrauensw\u00fcrdigen Quelle stammen (d.h. von den Programmautoren bzw. von Ihnen selbst) wird es ohne Einschr\u00e4nkungen ausgef\u00fchrt.
-OptionPanel.signed_script_are_trusted=Signierten Skripts vertrauen (empfohlen)
-OptionPanel.sk=Sk
-OptionPanel.sl=Sl
-OptionPanel.standardbackgroundcolor=Standard Hintergrundfarbe
-OptionPanel.standardcloudcolor=Standard Wolkenfarbe
-OptionPanel.standardcloudestyle=Standard Wolkenstil
-OptionPanel.standarddrawrectangleforselection.tooltip=Markiere Auswahl durch ein Rechteck um den Knoten
-OptionPanel.standarddrawrectangleforselection=Zeige Auswahl als Rechteck
-OptionPanel.standardedgecolor=Standard Kanten Farbe
-OptionPanel.standardedgestyle=Standard Kanten Stil
-OptionPanel.standardlinkcolor=Standard Link Farbe
-OptionPanel.standardlinkestyle=Standard Link Stil
-OptionPanel.standardnodeshape=Standard Knoten Stil
-OptionPanel.standardnodetextcolor=Standard Knoten Farbe
-OptionPanel.standardrootnodeshape=Standard Wurzelknoten Stil
-OptionPanel.standardselectednodecolor=Standard Farbe f\u00fcr ausgew\u00e4hlte Knoten
-OptionPanel.standardselectednoderectanglecolor=Farbe f\u00fcr das Rechteck rund um ausgew\u00e4hlten Knoten
-
-OptionPanel.structured_html_import=Import HTML als Knotenhierarchie
-OptionPanel.time_for_automatic_save.tooltip=<html> Zeit zwischen zwei aufeinanderfolgenden automatischen Speicherungen in Millisekunden. Wenn dies sehr gro\u00df ist, wird nicht automatisch gespeichert.</html>
-OptionPanel.time_for_automatic_save=Zeitabstand f\u00fcr automatisches Speichern
-OptionPanel.time_for_delayed_selection.tooltip=<html> (in msec). Ein Wert von 1 bedeutet direkte Auswahl mit der Maus (ohne Klick).</html>
-OptionPanel.time_for_delayed_selection=Zeit f\u00fcr die verz\u00f6gerte Auswahl
-OptionPanel.tr=Tr
-OptionPanel.uk_UA=Uk UA
-OptionPanel.undefined_font=Unbekannte Schriftart
-OptionPanel.undo_levels.tooltip=<html>Bestimmt die Anzahl an Aktionen, die mittels "R\u00fcckg\u00e4ngig" widerrufen werden k\u00f6nnen.</html>
-OptionPanel.undo_levels=Anzahl widerrufbarer Schritte
-OptionPanel.unfold_on_paste.tooltip=Knoten beim Einf\u00fcgen und Drag-And-Drop Entfalten
-OptionPanel.unfold_on_paste=Knoten beim Einf\u00fcgen Entfalten
-OptionPanel.use_common_out_point_for_root_node.tooltip=Alle Kanten am Wurzelknoten starten aus einem Punkt.
-OptionPanel.use_common_out_point_for_root_node=Alle Kanten am Wurzelknoten starten aus einem Punkt
-OptionPanel.use_tabbed_pane.tooltip=Wenn selektiert, werden die ge\u00f6ffneten Maps als einzelne Karteireiter angezeigt.
-OptionPanel.use_tabbed_pane=Karteireiter verwenden
-OptionPanel.userproperties=Benutzereinstellungen
-OptionPanel.vi=Vi
-OptionPanel.wheel_velocity.tooltip=Ein gr\u00f6\u00dferer Wert resultiert in schnelleren Bewegungen der Map bei Bet\u00e4tigung des Mausrades.
-OptionPanel.wheel_velocity=Geschwindigkeit
-OptionPanel.windows=Windows
-OptionPanel.zh_CN=Zh CN
-OptionPanel.zh_TW=Zh
-PageAction.text= &Seiteneinrichtung...
-PasteAction.text= Einf\u00fcgen
-PatternNewNameProperty=Neuer Stil
-PatternToString.backgroundColor=Hintergrundfarbe
-PatternToString.Child=Unterknotenstil
-PatternToString.color=Farbe
-PatternToString.EdgeColor=Kantenfarbe
-PatternToString.EdgeStyle=Kantenform
-PatternToString.EdgeWidth=Kantenbreite
-PatternToString.FontBold=Fett
-PatternToString.FontItalic=Kursiv
-PatternToString.FontName=Schrift
-PatternToString.Icon=Icon
-PatternToString.NodeFontSize=Schriftgr\u00f6\u00dfe
-plugins/latex/LatexNodeHook.editorTitle = Edit Latex
-plugins/ScriptEditor.cancel=\u00c4nderungen Verwerfen und &Abbrechen
-plugins/ScriptEditor.exit=\u00c4nderungen &Speichern und Schlie\u00dfen
-plugins/ScriptEditor.FORBIDDEN_ACTION=Freeplane Groovy Skripte sind eingeschr\u00e4nkt. Die folgende {0,choice,0#Datei|1#Netzwerk|2#Ausf\u00fchr}-Operation ist nicht gegeben: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. Sie k\u00f6nnen dies in den Einstellungen \u00e4ndern.
-plugins/ScriptEditor.menu_actions=&Aktionen
-plugins/ScriptEditor.new_script=Neues Script
-plugins/ScriptEditor.run=Sta&rten
-plugins/ScriptEditor.sign=Skript Signieren...
-plugins/ScriptEditor/window.Result=Ergebnis:
-plugins/ScriptEditor/window.title=Skripteditor
-plugins/TimeList.xml_Created=Erzeugt
-plugins/TimeList.xml_Date=Termin
-plugins/TimeList.xml_Icons=Icons
-plugins/TimeList.xml_Modified=Ver\u00e4ndert
-plugins/TimeList.xml_Notes=Notizen
-plugins/TimeList.xml_Text=Text
-plugins/TimeManagement.xml_appendButton= Datum an selektierte Knoten anh\u00e4ngen
-plugins/TimeManagement.xml_Cancel=Abbrechen
-plugins/TimeManagement.xml_cancelButton=Abbrechen
-plugins/TimeManagement.xml_closeButton=Schliessen
-plugins/TimeManagement.xml_Export=Markierte Knoten Exportieren
-plugins/TimeManagement.xml_Find=Suchen
-plugins/TimeManagement.xml_Goto=Selektieren und Schlie\u00dfen
-plugins/TimeManagement.xml_hour= Stunde:
-plugins/TimeManagement.xml_menu_actions=Aktionen
-plugins/TimeManagement.xml_minute= Minute:
-plugins/TimeManagement.xml_reminderButton_tooltip=<html>Zur gegebenen Zeit werden Sie durch blinkende Icons benachrichtigt - allerdings nur, wenn Freeplane l\u00e4uft.<br>Wenn Sie Freeplane beenden, wird der Timer beim n\u00e4chsten \u00d6ffnen dieser MindMap erneut gestartet.</html>
-plugins/TimeManagement.xml_reminderButton= Wiedervorlage
-plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>Zur Zeit kann nur ein Datum pro Knoten gespeichert werden.<br>Das aktuell eingestellte Datum ist {0,date} {0,time}, Sie wollten allerdings {1,date} {1,time}. <br><br>Wollen Sie das Datum \u00e4ndern (JA), <br>oder m\u00f6chten Sie das eingestellte Datum beibehalten (NEIN)?</html>
-
-plugins/TimeManagement.xml_reminderNode_tooltip=Wiedervorlage am {0,date} {0,time}.
-plugins/TimeManagement.xml_removeReminderButton = Wiedervorlage entfernen
-plugins/TimeManagement.xml_removeReminderButton_tooltip = Entfernt alle Wiedervorlagen der ausgew\u00e4hlten Knoten.
-plugins/TimeManagement.xml_Replace_All=Alle Ersetzen
-plugins/TimeManagement.xml_Replace_Selected=Markierte Ersetzen
-plugins/TimeManagement.xml_Replace=Ersetzen
-plugins/TimeManagement.xml_Select=Selektieren
-plugins/TimeManagement.xml_todayButton=Heute
-plugins/TimeManagement.xml_WindowTitle_All_Nodes=Suchen & Ersetzen
-plugins/TimeManagement.xml_WindowTitle=Zeit Management
-preferences = Einstellungen
-print_preview_title = Vorschau
-PrintAction.text= Drucken...
-PrintDirectAction.text= Drucken
-printing_settings = Druckskalierung
-PrintPreviewAction.text= &Vorschau...
-PropertyAction.text=Einstellungen ...
-QuitAction.text= Beenden
-read_only = Schreibgesch\u00fctzt
-really_convert_to_current_version=<html>Diese Mindmap wurde mit einer \u00e4lteren Version von Freeplane erzeugt. <br>Soll sie konvertiert werden (dies ist unsere Empfehlung)? <br>(Anderenfalls wird ohne Garantie versucht, die Map ohne Konvertierung zu laden.) </html>
-really_cut_node=Knoten wirklich ausschneiden?
-really_execute_script=Wollen Sie wirklich die Skripte in dieser Mindmap ausf\u00fchren? Es ist m\u00f6glich, dass diese Skripte Ihren Rechner besch\u00e4digen.
-really_remove_node=Knoten wirklich l\u00f6schen?
-really_remove_notes=Wollen Sie wirklich die Notizen l\u00f6schen?
-RedoAction.text= Wiederherstellen
-RedoFilterAction.text=Wiederherstellen
-ReminderHookAction.text=Wiedervorlage entfernen
-ReminderHookAction.tooltip=Entfernt eine Wiedervorlage.
-RemoveAllIconsAction.text= Entferne alle Icons
-
-RemoveIconAction.text= Entferne letztes Icon
-RemoveNoteAction.text= Notizen l\u00f6schen
-RemoveNoteAction.tooltip = <html>Entfernt Notizen von evtl. mehreren Knoten.</html>
-rename=&Umbenennen
-repair_link = Link reparieren?
-repair_link_question = Die Map konnte nicht gefunden werden. Link von Hand reparieren?
-replace=Ersetzen
-reset_to_default=Default benutzen
-ResetNodeLocationAction.text=&Position Zur\u00fccksetzen
-RevertAction.text=Auf Gespeicherte Version Zur\u00fcckg&reifen
-RevisionPluginAction.text= &\u00c4nderungen Markieren
-save_unsaved = Soll die folgende Mindmap gespeichert werden? :
-SaveAction.text= &Speichern
-SaveAll.text=&Alle Speichern
-SaveAll.tooltip=Speichert alle ge\u00f6ffneten Maps.
-SaveAsAction.text= Speichern Unter...
-saved = Mindmap wurde gespeichert.
-scheme_evaluate = Evaluate!
-ScriptEditor.text=Skript&editor...
-ScriptEditor.tooltip=Erm\u00f6glicht die Erstellung anspruchsvoller Skripte f\u00fcr Freeplane.
-ScriptEditorPanel.changed_cancel=Die Skripte wurden ver\u00e4ndert. Wollen Sie wirklich abbrechen?
-
-
-select_favorites_folder = Suchen Sie den Ordner aus, in dem Ihre Favoriten sich befinden.
-select_file_export_to=Die Datei, zu der exportiert werden soll, selektieren
-select_folder_for_importing = W\u00e4hlen Sie den Ordner aus, der importiert werden soll
-select_icon=Iconauswahl
-SelectAllAction.text=Alles Markieren
-SelectBranchAction.text=Zweig Markieren
-selection_method_by_click = Einfacher Mausklick Selektiert
-selection_method_delayed=Verz\u00f6gerte Automatische Selektion
-selection_method_direct = Mausber\u00fchrung Selektiert
-SelectNoteAction.text=Wechsel Notiz<->Knoten
-SelectNoteAction.tooltip=Wechselt vom bzw. zum Notizenfenster
-SetImageByFileChooserAction.text= Bild (Dateiauswahl)...
-SetLinkByFileChooserAction.text= Hyperlink (Dateiauswahl)...
-SetLinkByTextFieldAction.text= Hyperlink (Textfeld)...
-SetNoteWindowPosition.bottom.text= Unten
-SetNoteWindowPosition.left.text= Links
-SetNoteWindowPosition.right.text= Rechts
-SetNoteWindowPosition.top.text= Oben
-ShowAllAttributesAction.text= Alle Attribute Anzeigen
-ShowAncestorsAction.text=Zeige Vorg\u00e4nger
-ShowAttributeDialogAction.text=&Attribute Verwalten...
-ShowDescendantsAction.text=Zeige Nachfolger
-ShowFilterToolbarAction.text=Filter Aktivieren
-ShowHideNoteAction.text=Notizfenster
-ShowHideNoteAction.tooltip=Damit kann man das Notizfenster verbergen bzw. wieder anzeigen.
-ShowSelectedAttributesAction.text= Ausgew\u00e4hlte Attribute Anzeigen
-ShowSelectionAsRectangleAction.text=Auswahl als Rechteck
-simplyhtml.aboutFrameTitle=\u00dcber dieses Programm
-simplyhtml.aboutLabel=\u00dcber SimplyHTML...
-simplyhtml.alignCenter=zentriert
-simplyhtml.alignLabel=Ausrichtung:
-simplyhtml.alignLeft=links
-simplyhtml.alignRight=rechts
-simplyhtml.allCellsRangeLabel=alle Zellen
-simplyhtml.allOccurrencesReplaced=alle ersetzt
-simplyhtml.appendTableColLabel=Spalte anh\u00e4ngen
-simplyhtml.appendTableRowLabel=Zeile anh\u00e4ngen
-simplyhtml.applyCellAttrLabel=Anwenden auf
-simplyhtml.backgroundLabel=Hintergrund:
-simplyhtml.boldItalicName=fett kursiv
-simplyhtml.boldName=fett
-simplyhtml.borderColorLabel=Farbe:
-simplyhtml.borderWidthLabel=Breite
-simplyhtml.bottomLabel=unten:
-simplyhtml.cancelBtnName=Abbrechen
-simplyhtml.cellBorderTabLabel=Rahmen
-simplyhtml.cellGenTabLabel=Allgemein
-simplyhtml.cellMarginTabLabel=Abstand
-simplyhtml.cellPanelTitle=Zellenformat
-simplyhtml.clearFormatLabel=Formattierung l\u00f6schen
-simplyhtml.clearFormatTip=Formattierung l\u00f6schen
-simplyhtml.close=Schliessen
-simplyhtml.closeBtnName=Schliessen
-simplyhtml.colorLabel=Farbe
-simplyhtml.copyLabel=Kopieren
-simplyhtml.copyTip=Kopieren
-simplyhtml.cTagNameHead1=\u00dcberschrift 1
-simplyhtml.cTagNameHead2=\u00dcberschrift 2
-simplyhtml.cTagNameHead3=\u00dcberschrift 3
-simplyhtml.cTagNameHead4=\u00dcberschrift 4
-simplyhtml.cTagNameHead5=\u00dcberschrift 5
-simplyhtml.cTagNameHead6=\u00dcberschrift 6
-simplyhtml.cTagNameLink=Verkn\u00fcpfung
-simplyhtml.cTagNameOL=nummerierte Liste
-simplyhtml.cTagNamePara=Absatz
-simplyhtml.cTagNameUL=Bullet-Liste
-simplyhtml.cutLabel=Ausschneiden
-simplyhtml.cutTip=Ausschneiden
-simplyhtml.defaultDocName=Ohne Titel
-simplyhtml.deleteTableColLabel=Spalte l\u00f6schen
-simplyhtml.deleteTableRowLabel=Zeile l\u00f6schen
-simplyhtml.docTitleQuery=Neuer Titel:
-simplyhtml.docTitleTitle=Dokumenttitel bearbeiten
-simplyhtml.editLabel=Editieren
-simplyhtml.effectLabel=Effekt
-simplyhtml.familyLabel=Familie
-simplyhtml.findNext=Suchen...
-simplyhtml.findReplaceDialogTitle=Suchen & Ersetzen
-simplyhtml.findReplaceLabel=Suchen & Ersetzen
-simplyhtml.findReplaceTip=Suchen & Ersetzen
-
-simplyhtml.fontBoldLabel=Fett
-
-simplyhtml.fontBoldTip=fett an- und ausschalten
-
-simplyhtml.fontColorLabel=Textfarbe
-simplyhtml.fontColorTip=Textfarbe
-simplyhtml.fontDialogTitle=Zeichen formatieren
-
-simplyhtml.fontItalicLabel=Kursiv
-
-simplyhtml.fontItalicTip=kursiv an- und ausschalten
-simplyhtml.fontLabel=Zeichen...
-simplyhtml.fontTabLabel=Schriftart
-simplyhtml.fontTip=Zeichen formatieren...
-
-simplyhtml.fontUnderlineLabel=Unterstrichen
-simplyhtml.fontUnderlineTip=unterstreichen an- und ausschalten
-simplyhtml.foregroundLabel=Vordergrund:
-simplyhtml.formatLabel=Format
-simplyhtml.formatListLabel=Liste...
-simplyhtml.formatListTip=Listenformat \u00e4ndern
-simplyhtml.formatParaLabel=Absatz...
-simplyhtml.formatParaTip=Absatzformat \u00e4ndern
-simplyhtml.formatTableLabel=Tabelle...
-simplyhtml.formatTableTip=Tabelle formatieren...
-simplyhtml.helpLabel=Hilfe
-simplyhtml.htmlTabTitle=HTML Code Ansicht
-simplyhtml.imageFileDesc=Bilddateien
-simplyhtml.insertTableColLabel=Spalte einf\u00fcgen
-simplyhtml.insertTableLabel=Tabelle...
-simplyhtml.insertTableMsg=Wieviele Spalten?
-simplyhtml.insertTableRowLabel=Zeile einf\u00fcgen
-simplyhtml.insertTableTitle=Tabelle einf\u00fcgen
-simplyhtml.italicName=kursiv
-simplyhtml.layoutTabTitle=Layout Ansicht
-simplyhtml.leftLabel=links:
-simplyhtml.listDialogTitle=Liste formatieren
-simplyhtml.listIndentTitle=Einr\u00fcckung:
-simplyhtml.listPosInside=einger\u00fcckt
-simplyhtml.listPositionLabel=Position:
-simplyhtml.listPosOutside=ausger\u00fcckt
-simplyhtml.listTypeCircle=leerer Kreis Bulletzeichen
-simplyhtml.listTypeDecimal=1.,2.,3.,4.
-simplyhtml.listTypeDisc=ausgef\u00fcllter Kreis als Bulletzeichen
-simplyhtml.listTypeLabel=Typ:
-simplyhtml.listTypeLowerAlpha=a.,b.,c.,d.
-simplyhtml.listTypeLowerRoman=i.,ii.,iii.,iv.
-simplyhtml.listTypeNone=keine
-simplyhtml.listTypeSquare=rechteckiges Bulletzeichen
-simplyhtml.listTypeUpperAlpha=A.,B.,C.,D.
-simplyhtml.listTypeUpperRoman=I.,II.,III.,IV.
-simplyhtml.marginLabel=Au\u00dfen
-simplyhtml.matchCase=Gro\u00df- und Kleinschreibung beachten
-simplyhtml.newStyleDefaultName=neue Formatvorlage
-simplyhtml.nextTableCellLabel=N\u00e4chste Zelle
-simplyhtml.noLineLabel=keine
-simplyhtml.noMoreOccurrencesFound=keine (weiteren) gefunden
-simplyhtml.okBtnName=OK
-simplyhtml.paddingLabel=Innen
-simplyhtml.paraAlignCenterLabel=Zentriert
-simplyhtml.paraAlignCenterTip=Paragraph zentriert ausrichten
-simplyhtml.paraAlignLeftLabel=Linksb\u00fcndig
-simplyhtml.paraAlignLeftTip=Paragraph linksb\u00fcndig ausrichten
-simplyhtml.paraAlignRightLabel=Rechtsb\u00fcndig
-simplyhtml.paraAlignRightTip=Paragraph rechtsb\u00fcndig ausrichten
-simplyhtml.paraStyleDialogTitle=Absatzformat
-simplyhtml.paraTabLabel=Absatz
-simplyhtml.pasteLabel=Einf\u00fcgen
-simplyhtml.pasteTip=Einsetzen
-simplyhtml.plainName=Standard
-simplyhtml.previewLabel=&Vorschau
-simplyhtml.previewText=Dies ist ein Test
-simplyhtml.prevTableCellLabel=Vorige Zelle
-simplyhtml.redoLabel=Wiederherstellen
-simplyhtml.redoTip=Wiederholen
-simplyhtml.replace=Ersetzen...
-simplyhtml.replaceAll=Alles
-simplyhtml.replaceDone=Fertig
-simplyhtml.replaceNo=Nein
-simplyhtml.replaceThisQuery=ersetze dieses Vorkommnis von
-simplyhtml.replaceWith=Ersetzen mit:
-simplyhtml.replaceYes=Ja
-simplyhtml.rightLabel=rechts:
-simplyhtml.searchDown=nach unten suchen
-simplyhtml.searchFromStart=vom Anfang aus suchen
-simplyhtml.searchUp=nach oben suchen
-simplyhtml.selectAllLabel=Alles Ausw\u00e4hlen
-simplyhtml.sizeLabel=Gr\u00f6\u00dfe
-simplyhtml.standardStyleName=standard
-simplyhtml.strikeLabel=Durchgestrichen
-simplyhtml.styleLabel=Stil
-simplyhtml.styleNameInputText=Name der Formatvorlage?
-simplyhtml.styleNameInputTitle=Formatvorlage speichern
-simplyhtml.tableBgColLabel=Hintergrundfarbe:
-simplyhtml.tableDialogTitle=Tabelle formatieren
-simplyhtml.tableLabel=Tabelle
-simplyhtml.tablePanelTitle=Tabellenformat
-simplyhtml.tableWidthLabel=Breite:
-simplyhtml.textIndentLabel=Einr\u00fcckung:
-simplyhtml.textToFind=Suche Text:
-simplyhtml.thisCellRangeLabel=diese Zelle
-simplyhtml.thisColRangeLabel=diese Spalte
-simplyhtml.thisRowRangeLabel=diese Zeile
-simplyhtml.toggleBulletsLabel=Aufz\u00e4hlung ein/aus
-simplyhtml.toggleBulletsTip=Aufz\u00e4hlung ein/aus
-simplyhtml.toggleNumbersLabel=Numerierung ein/aus
-simplyhtml.toggleNumbersTip=Numerierung ein/aus
-simplyhtml.topLabel=oben:
-simplyhtml.uLineLabel=Unterstrichen
-simplyhtml.unableToOpenFileError=Datei kann nicht ge\u00f6ffnet werden
-simplyhtml.unableToRedoError=Wiederholen nicht m\u00f6glich:
-simplyhtml.unableToUndoError=R\u00fcckg\u00e4ngig nicht m\u00f6glich:
-simplyhtml.undoLabel=R\u00fcckg\u00e4ngig
-simplyhtml.undoTip=R\u00fcckg\u00e4ngig
-simplyhtml.valignBaseline=an Basislinie
-simplyhtml.valignBottom=unten
-simplyhtml.valignLabel=Vert. Ausrichtung:
-simplyhtml.valignMiddle=mittig
-simplyhtml.valignTop=oben
-simplyhtml.wholeWordsOnly=nur ganze Worte
-SortNodes.text=Kinder &Sortieren
-SortNodes.tooltip=Sortiert alle Kinder eines Knotens nach dem Alphabet.
-split = &Teilen
-SplitNode.text= &Knoten Aufteilen
-SplitNode.tooltip= <html>Knoteninhalt wird in mehrere Knoten verteilt.</html>
-style = Stil
-TimeListAction.text=Zeit&plan...
-TimeListAction.tooltip=Zeigt alle Wiedervorlagezeiten und die dazugeh\u00f6rigen Knoten.
-TimeManagementAction.text= Kalender Anzeigen ...
-TimeManagementAction.tooltip= <html>Zeigt das Kalender Modul von Kai Toedter.</html>
-ToggleChildrenFoldedAction.text= Unterknoten (ent)falten
-ToggleFoldedAction.text= Knoten falten/entfalten
-ToggleLeftToolbarAction.text= Zweites Werkzeugmen\u00fc
-ToggleMenubarAction.text= Men\u00fc
-ToggleToolbarAction.text= Werkzeugmen\u00fc
-undefined_error = Ein unerwarteter Fehler ist aufgetreten. Eine Fehlernachricht im Forum w\u00e4re sch\u00f6n.
-underline = Unterstrichen
-underlined = Unterstrichen
-UndoAction.text= R\u00fcckg\u00e4ngig
-UndoFilterAction.text=R\u00fcckg\u00e4ngig
-unfold = Entfalten
-UnfoldAllAction.text= Alles Aufklappen
-UnfoldAllAction.tooltip= <html>Klappt die selektierten Knoten und alle Kinder auf.</html>
-
-UnfoldOneLevelAction.text= Eine Ebene Aufklappen
-UnfoldOneLevelAction.tooltip= <html>Klappt die selektierten Knoten um eine Ebene auf.</html>
-url_error = Fehler: Diese URL ist fehlerhaft.
-UsePlainTextAction.text= Benutze Reinen Text
-user_defined_zoom = Benutzerdefiniert.
-user_defined_zoom_status_bar = Der Zoom wurde ge\u00e4ndert und steht nun auf dem benutzerdefinierten Wert von {0}%.
-user_zoom = Druckvergr\u00f6\u00dferung (0.0 - 2.0):
-
-WebDocuAction.text= Web Documentation
-width = Breite
-
-xslt_export_not_possible=Freeplane XSLT Export nicht m\u00f6glich
-yes = Ja
-ZoomInAction.text= Zoom +
-ZoomOutAction.text= Zoom -
-
-ChangeConnectorArrowsAction.forward.text=Vorw\u00e4rts
-ChangeConnectorArrowsAction.backward.text=Zur\u00fcck
-
-
-OptionPanel.label_font_size=Schriftgr\u00f6\u00dfe
-OKAction.text=&OK
-ApplyAction.text=&\u00dcbernehmen
-CancelAction.text=&Abbrechen
-ImportAction.text=&Importieren
-
-
-
-# Add
-AddElementaryConditionAction.text=Hinzu\u00dcgen
-
-# Filter selected nodes
-ApplySelectedViewConditionAction.text=Ausgew\u00e4hlte Knoten filtern
-
-# You already use the latest program version
-version_up_to_date=Sie ben\u00dctzen bereits die aktuellste Version.
-
-
-# Applies to filtered nodes
-ApplyToVisibleAction.text=Anwendung auf gefilterte Knoten
-# Ask for Help
-AskForHelp.text=Hilfe anfordern
-# Center selected node
-CenterSelectedNodeAction.text=Selektierten Knoten zentrieren
-# Both
-ChangeConnectorArrowsAction.both.text=Beide
-# None
-ChangeConnectorArrowsAction.none.text=Keinen
-# And
-CreateConjunctConditionAction.text=Und
-# Or
-CreateDisjunctConditionAction.text=Oder
-# Not
-CreateNotSatisfiedConditionAction.text=Not
-# Horizontal
-EdgeStyleAction.horizontal.text=Horizontal
-# Exports the map in the current folding to a JPEG image.
-ExportToImage.jpg.tooltip=Exportiere derzeitigen Zustand der Map als JPEG
-# Exports the map in the current folding to a PNG image.
-ExportToImage.png.tooltip=Exportiere derzeitigen Zustand der Map als PNG
-# Arrows
-IconGroupPopupAction.arrows.text=Pfeile
-# Docs & Folders
-IconGroupPopupAction.docs_folders.text=Dokumente und Ordner
-# Flags
-IconGroupPopupAction.flags.text=Flags
-# Miscallaneous
-IconGroupPopupAction.miscallaneous.text=Verschiedenes
-# Nature
-IconGroupPopupAction.nature.text=Natur
-# Numbers
-IconGroupPopupAction.numbers.text=Nummern
-# Office
-IconGroupPopupAction.office.text=B\u00fcro
-# People
-IconGroupPopupAction.people.text=Personen
-# Signs
-IconGroupPopupAction.signs.text=Zeichen
-# Smiley
-IconGroupPopupAction.smiley.text=Smiley
-# Time
-IconGroupPopupAction.time.text=Zeit
-# User icons
-IconGroupPopupAction.user.text=User Icons
-# Text Patterns
-LoadAcceleratorPresetsAction.textPatterns.text=Text Muster
-# Open File
-OpenPathAction.text=Datei \u00f6ffnen
-# Root Node Format
-OptionPanel.automaticFormat_level1=Formattierung des Wurzelknotens
-# Number of kept backup files
-OptionPanel.backup_file_number=Anzahl der Backup Dateien
-# bezier
-OptionPanel.bezier=Bezier
-# Center selected nodes
-OptionPanel.center_selected_node=Selektierte Knoten zentrieren
-# Check for updates on program start
-OptionPanel.check_updates_automatically=Automatisch nach Updates suchen
-# Cloud
-OptionPanel.cloud=Wolke
-# Cloud and Color
-OptionPanel.cloudcolor=Wolke und Farbe
-# Don't display 'move' cursor during paper dragging
-OptionPanel.disable_cursor_move_paper.tooltip=Keinen 'Bewegungs' Cursor w\u00e4hrend des Drag Vorgangs anzeigen
-# Key typing: if enabled enters node editing
-
-# If dnd is enabled.
-OptionPanel.draganddrop.tooltip=Wenn Drag'n drop aktiviert ist
-# horizontal
-OptionPanel.horizontal=Horizontal
-# Font Family
-OptionPanel.label_font_family=Zeichensatz
-# linear
-OptionPanel.linear=Linear
-# Note
-filter_note=Anmerkung
-# Priority
-filter_priority=Priorit\u00e4t
-# Saved selection
-filter_selected_node_view_snapshot=Gespeicherte Auswahl
-# Filter could not be loaded, file corrupted
-filters_not_loaded=Filter kann nicht geladen werden, die Datei ist besch\u00e4digt.
-# Freeplane_Reverted_
-freeplane_reverted=Freeplane_Reverted_
-# Freeplane
-icon_bee=Freeplane
-# F&ilter
-menu_filter=F&ilter
-# Send
-org.freeplane.plugin.bugreport.agree=Senden
-# Always send
-org.freeplane.plugin.bugreport.always_agree=Immer senden.
-# Never send
-org.freeplane.plugin.bugreport.always_deny=Niemals senden.
-# Don't send
-org.freeplane.plugin.bugreport.deny=Nicht senden.
-# Automatic bug report
-org.freeplane.plugin.bugreport.dialog.title=Automatischer Fehlerreport
-# Freeplane has an automatic bug tracking engine.
-#No personal data or map content will ever be transmitted.
-#Bug reports will help us improve the software.
-org.freeplane.plugin.bugreport.question=Freeplane hat eine automatische Fehlerbehandlungsroutine die sich mit einem zentralen Server verbindet. Fehlerreports helfen, die Qualit\u00e4t der Software zu verbessern. Keine pers\u00f6nlichen Daten werden ausgewertet.
-# Current report
-org.freeplane.plugin.bugreport.report=Derzeitiger Report
-# Out of memory.
-out_of_memory=Zuwenig Speicher.
-# Overwrite existing key set?
-overwrite_keyset_question=Soll existierendes Keyset \u00fcberschrieben werden?
-# /doc/FM_Key_Mappings_Quick_Guide.pdf
-
-# Are you sure to remove this keystroke from another item?
-remove_shortcut_question=Tastaturk\u00fcrzel ersetzen?
-# Saving canceled
-saving_canceled= Speicher Vorgang abgebrochen
-# Source Forge Login required. Continue?
-sf_login_required= Source forge login ben\u00f6tigt. Weitermachen?
-# Update Check Dialog
-updatecheckdialog= Update Check Dialog
-# Could not load map at URL:
-url_load_error= Kann MindMap nicht laden mit der Url:
-# This shortcut can not be set, it is used as a menu shortcut.
-used_in_menu=Dieser Shortcut darf nicht gesetzt werden, da er bereits als Men\u00fc Shortcut verwendet wird.
-
-# hide edge
-OptionPanel.hide_edge=Kanten verstecken
-
-# Set Links either relative or absolute
-OptionPanel.links.tooltip=Links entweder relativ oder absolut setzen.
-
-# Load all last maps
-OptionPanel.load_last_maps=Alle zuletzt ge\u00f6ffneten Mindmaps laden
-
-# The initial size of every map
-OptionPanel.mapxsize.tooltip=Anfangsgr\u00f6\u00dfe jeder Map
-
-
-
-# Always send
-OptionPanel.org.freeplane.plugin.bugreport.allowed=Immer senden
-
-# Show report dialog
-OptionPanel.org.freeplane.plugin.bugreport.ask=Report Dialog zeigen
-
-# Never send
-OptionPanel.org.freeplane.plugin.bugreport.denied=Nie senden
-
-# Always use white background for printing
-OptionPanel.printonwhitebackground.tooltip=Immer Weiss als Hintergrund beim Drucken verwenden
-
-# Use default font for notes too
-OptionPanel.resources_use_default_font_for_notes_too=Standard Font f\u00fcr Notizen verwenden
-
-# Remove top margin for notes
-OptionPanel.resources_use_margin_top_zero_for_notes=Oberen Rand f\u00fcr Notizen entfernen
-
-# Clouds
-OptionPanel.separator.CloudControls=Wolken
-# Graphical Links
-
-
-# Automatic bug report
-OptionPanel.separator.org.freeplane.plugin.bugreport=Automatischer Fehler Bericht
-
-# Program Updates
-OptionPanel.separator.updates=Program Aktualisierungen
-
-# The standard background color in html notation
-OptionPanel.standardbackgroundcolor.tooltip=Standard Hintergrundfarbe
-
-# The standard cloud color in html notation
-OptionPanel.standardcloudcolor.tooltip=Standard Wolkenfarbe
-
-# The standard edge color in html notation
-OptionPanel.standardedgecolor.tooltip=Standard Kanten Farbe
-
-# Structured icon toolbar
-OptionPanel.structured_icon_toolbar=Strukturierter Icon Toolbar
-
-# Click on menu items holding a control key for assigning hot keys
-OptionPanel.text.use_ctrl_key=Strg Taste gedr\u00fcckt halten und Men\u00fc Eintr\u00e4ge anklicken um Hot Keys zuzuweisen.
-
-# Reapply
-ReapplyFilterAction.text=Nochmal anwenden
-
-# Report a Bug
-ReportBugAction.text=Einen Programfehler berichten
-
-# Request a Feature
-RequestFeatureAction.text=Einen Verbesserungsvorschlag einbringen
-
-# Save hot key set
-SaveAcceleratorPresetsAction.text=Hot Key Set speichern
-
-# F-Bar
-ToggleFBarAction.text=F-Bar
-
-# Check for Updates
-UpdateCheckAction.text=Auf Updates pr\u00fcfen.
-
-# Hot Key Presets
-acceleratorPresets=Hot Key Voreinstellungen
-
-# Assign Attributes
-attributes_assign_dialog=Attribute zuweisn
-
-# Can not connect to information server
-can_not_connect_to_info_server=Kann nicht zu Informations - Server verbinden.
-
-# Can not save hot key set
-can_not_save_key_set=Kann leider Hot Key Set nicht speichern
-
-# Map content is corrupted
-corrupt_map=Der Inhalt der Map ist leider besch\u00e4digt.
-
-# Download
-download=Download
-
-# Edit Long Node
-edit_long_node=Knoten mit Fliesstext bearbeiten
-
-# Edit Middle Label
-edit_middle_label=Middle Label editieren
-
-# Edit Source Label
-edit_source_label=Source Label editieren
-
-# Edit Target Label
-edit_target_label=Ziel Label editieren
-
-# Enter hot key set name
-enter_keyset_name=Bitte Hot Key Set Name eingeben
-
-# Export failed
-export_failed=Export ist fehlgeschlagen.
-
-
-# Scripts
-ExecuteScriptForAllNodes.text=Alle Skripte in der Map ausf\u00fchren
-ExecuteScriptForSelectionAction.text=Alle Skripte des selektierten Knotens ausf\u00fchren
-ExecuteScripts.text=Skripte
-ExecuteScriptOnSingleNode.text={0} f\u00fcr einen ausgew\u00e4hlten Knoten ausf\u00fchren
-ExecuteScriptOnSelectedNode.text={0} f\u00fcr alle ausgew\u00e4hlten Knoten ausf\u00fchren
-ExecuteScriptOnSelectedNodeRecursively.text={0} rekursiv f\u00fcr ausgew\u00e4hlte Knoten ausf\u00fchren
-ExecuteScriptError.text=Fehler beim Ausf\u00fchren des Skripts.\nSiehe Logfile zu Details.
-ReadScriptError.text=Fehler beim Lesen des Skripts.\nSiehe Logfile zu Details.
-
-#automatic translated values
-#Wed Oct 28 00:16:35 CET 2009
-OptionPanel.outline_hgap=horizontalen Abstand[auto]
-OptionPanel.separator.NodeFont=Font-Knoten[auto]
-OptionPanel.separator.connectors=Steckverbinder[auto]
-RemoveConnectorAction.text=Entfernen Connector[auto]
-user_defined_scale=Benutzer definierten Skala[auto]
-OptionPanel.org.freeplane.plugin.bugreport=Politik[auto]
-OptionPanel.standardnodetextcolor.tooltip=<html> Die Standard-Knoten Farbe. Im HTML-Notation (\# RRGGBB in Hex-Werte) </html>[auto]
-StringFlavorHandler=Plain Text Knotenhierarchie[auto]
-bitmaps=Bitmaps[auto]
-NextNodeAction.FORWARD.text=N\u00e4chster Knoten[auto]
-FileListFlavorHandler=Links zu Dateien[auto]
-OptionPanel.standardlinkestyle.tooltip=<html> Die Standard-Link-Stil. derzeit nur "Bezier" wird unterst\u00fctzt </html>[auto]
-OptionPanel.outline_vgap=senkrechte Abstand[auto]
-ToggleFullScreenAction.text=Vollbildmodus[auto]
-NextNodeAction.FORWARD_N_FOLD.text=N\u00e4chster Knoten fach ()[auto]
-OptionPanel.show_node_tooltips=Display Tool-Tipps f\u00fcr Knoten[auto]
-OptionPanel.il__enter_confirms_by_default=Geben Sie best\u00e4tigt per Default[auto]
-ChangeConnectorArrowsAction.text=\u00c4ndern Arrows von Connector[auto]
-OptionPanel.standardselectednoderectanglecolor.tooltip=<html> Die Farbe des buble Kennzeichnung ausgew\u00e4hlten Knoten. Im HTML-Notation (\# RRGGBB in Hex-Werte) </html>[auto]
-NextNodeAction.BACK_N_FOLD.text=Zur\u00fcck Knoten fach ()[auto]
-fit_map_to_page_height=Fit H\u00f6he auf einer Seite[auto]
-OptionPanel.standardselectednodecolor.tooltip=<html> Die Standard-Farbe, wenn Knoten ausgew\u00e4hlt. Im HTML-Notation (\# RRGGBB in Hex-Werte) </html>[auto]
-AddConnectorAction.text=Connector hinzuf\u00fcgen[auto]
-ViewerControllerAction.text=Externes Objekt ...[auto]
-OptionPanel.standardlinkcolor.tooltip=<html> Die Standard-Link-Farbe in HTML-Notation </html>[auto]
-icon_user_icon=User Icons[auto]
-OptionPanel.toolTipManager.dismissDelay=Entlassen Verz\u00f6gerung ms[auto]
-OptionPanel.standardcloudestyle.tooltip=<html> Die Standard-Wolke Stil. derzeit nur "Bezier" wird unterst\u00fctzt </html>[auto]
-OptionPanel.paint_connectors_behind=Knoten verstecken Anschl\u00fcsse[auto]
-NextNodeAction.BACK.text=Zur\u00fcck Knoten[auto]
-ConnectorColorAction.text=Connector Color ...[auto]
-OptionPanel.selection_method.tooltip=<html> mit den folgenden Schalter k\u00f6nnen Sie aktivieren bzw. deaktivieren Sie die Auswahl Regelung verz\u00f6gert. Auto-Optionen. \u00c4ndern Sie diese nicht, da sie ohnehin zu auto.properties gespeichert werden. </html>[auto]
-SelectedPasteAction.text=Einf\u00fcgen als ...[auto]
-ViewLayoutTypeAction.OUTLINE.text=Gliederungsansicht[auto]
-OptionPanel.separator.outline_view=Gliederungsansicht[auto]
-EdgeLikeLinkAction.text=Simulieren Rand[auto]
-OptionPanel.separator.inline_editor=In-line-Knoten-Editor[auto]
-OptionPanel.standardedgestyle.tooltip=<html> Die Standard-Rand-Stil. "lineare" und "Bezier" unterst\u00fctzt werden </html>[auto]
-OptionPanel.standardrootnodeshape.tooltip=<html> Der Wurzelknoten Stil, wenn kein anderes angegeben ist. "Gabel" und "Blase" und "kombinierte" unterst\u00fctzt werden </html>[auto]
-OptionPanel.placenewbranches.tooltip=<html> Wo setzen Sie neue Zweige. G\u00fcltige Werte sind 'first' und 'last' </html>[auto]
-OptionPanel.editor_extra_width=Extrabreite Schritt[auto]
-OptionPanel.nodetext.tooltip=Hier k\u00f6nnen Sie festlegen, den Knoten der Text. Die alte Fassung wird verworfen, wenn ein solches Muster angewandt wird.[auto]
-fit_map_to_page_width=Breite an einer Seite[auto]
-OptionPanel.separator.editing=Editor-Einstellungen[auto]
-OptionPanel.toolTipManager.initialDelay=Anf\u00e4nglichen Verz\u00f6gerung ms[auto]
-DirectHtmlFlavorHandler=HTML als einzigen Knoten[auto]
-StructuredHtmlFlavorHandler=HTML als Knotenhierarchie[auto]
-AllMapsNodeListAction.text=Suchen und Ersetzen in allen Karten[auto]
-MindMapNodesFlavorHandler=Knoten-Hierarchie[auto]
-OptionPanel.toolTipManager.reshowDelay=ReshowDelay Verz\u00f6gerung ms[auto]
-OptionPanel.standardnodeshape.tooltip=<html> Der Standardwert neuen Knoten Stil. "Gabel", "Blase" "as_parent" und "kombinierte" unterst\u00fctzt werden </html>[auto]
-OptionPanel.separator.tooltip=Tooltip mal[auto]
-
-#automatic translated values
-#Sat Oct 31 21:30:34 CET 2009
-really_convert_to_current_version=<html>This map was created with an older version of Freeplane. <br>Should it be converted (recommended)? <br>(Otherwise it is taken as it is without guarantee.) </html>[translate me]
-ModesMenuAction.File.text=Datei-Explorer[auto]
-ModesMenuAction.MindMap.text=Mind-Map-Editor[auto]
-
-
-#automatic translated values
-#Mon Dec 28 18:44:31 CET 2009
-MaxNodeWidthAction.text=Set Knoten maximale Breite[auto]
-OptionPanel.separator.spelling=Rechtschreibpr\u00fcfung Optionen[auto]
-OptionPanel.spelling_opt_case_sensitive=Gro\u00df-und Kleinschreibung[auto]
-OptionPanel.spelling_opt_ignore_all_caps_words=Ignorieren Sie alle W\u00f6rter in Gro\u00dfbuchstaben.[auto]
-icon_females=Frauen[auto]
-OptionPanel.spelling_opt_suggestions_limit_menu=Die maximale Anzahl der Vorschl\u00e4ge in das Men\u00fc[auto]
-
-OptionPanel.spelling_opt_suggestions_limit_dialog=Die maximale Anzahl der Vorschl\u00e4ge in den Dialog[auto]
-OptionPanel.spelling_opt_ignore_capitalization=Ignorieren Gro\u00dfbuchstaben am Wort beginnen[auto]
-OptionPanel.spelling_opt_ignore_words_with_numbers=W\u00f6rter mit Zahlen ignorieren[auto]
-icon_males=M\u00e4nner[auto]
-
-#automatic translated values
-#Fri Feb 05 12:54:18 CET 2010
-OptionPanel.display_node_id=Display-Node-ID[auto]
-OptionPanel.load_folding_start_level=Fold Knoten aus Ebene[auto]
-update_failed=Update nicht mit der Meldung $ 1[auto]
-OptionPanel.goto_note_end_on_edit=Bewegen Sie beachten Cursor an das Ende[auto]
-not_saved_for_image_error=Die Karte muss gerettet werden, bevor Sie ein Bild von Dateiauswahl gesetzt[auto]
-link_error=Falscher Link "$ 1" nicht geladen[auto]
-RemoveIcon_0_Action.text=Entfernen erste Symbol[auto]
diff --git a/freeplane_ant/test/unsorted/Test_en.properties b/freeplane_ant/test/unsorted/Test_en.properties
deleted file mode 100644
index 54e4c7a..0000000
--- a/freeplane_ant/test/unsorted/Test_en.properties
+++ /dev/null
@@ -1,1255 +0,0 @@
-about_text = Freeplane - free mind mapping and knowledge building software\nCopyright \u00a9 2000-2010 Joerg Mueller, Dimitry Polivaev, Predrag Cuklin, Christian Foltin, Daniel Polansky and others.\nThis program is free software, licenced under GNU General Public Licence.\n\nHome: http://freeplane.sourceforge.net/\nVersion:
-AboutAction.text = About
-acceleratorPresets = Hot Key Presets
-accessories/plugins/ApplyFormatPlugin.dialog.title = Change format of nodes
-accessories/plugins/AutomaticLayout.properties_StyleDialogTitle = Change pattern
-accessories/plugins/EncryptNode.properties_0 = Choose password for encrypted node
-accessories/plugins/EncryptNode.properties_1 = Passwords are not equal or to short.
-accessories/plugins/EncryptNode.properties_2 = Enter Password:
-accessories/plugins/EncryptNode.properties_3 = Re-enter Password:
-accessories/plugins/EncryptNode.properties_4 = Enter your password.
-accessories/plugins/EncryptNode.properties_5 = <html>Remember, that the strength of the encryption<br> depends almost completely on the quality of your password.
-accessories/plugins/EncryptNode.properties_6 = OK
-accessories/plugins/EncryptNode.properties_7 = Cancel
-accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = You can only toggle the encryption state of an encrypted node. Please insert such a node using the tools menu.
-accessories/plugins/EncryptNode.properties_select_me = Select me to continue!
-accessories/plugins/EncryptNode.properties_wrong_password = The password is not correct.
-
-accessories/plugins/ExportWithTWiki.text = As TWiki...
-accessories/plugins/ExportWithTWiki.tooltip = Exports the map as a TWiki document.
-accessories/plugins/ExportWithXSLT.tooltip = This is an uniform export method using XSLT scripts.
-
-
-accessories/plugins/ExportWithXSLT_Applet.text = As Java Applet...
-accessories/plugins/ExportWithXSLT_Applet.tooltip = Exports the map as a java browser applet.
-accessories/plugins/ExportWithXSLT_Flash.text = As Flash...
-accessories/plugins/ExportWithXSLT_Flash.tooltip = Exports the map as a flash application.
-accessories/plugins/ExportWithXSLT_HTML.text = As XHTML (JavaScript version)...
-accessories/plugins/ExportWithXSLT_HTML3.text = As XHTML (Clickable map image version)...
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.text = Resources from RESOURCES node to TaskJuggler file...
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip = <html>Exports resources from RESOURCES node to Taskjuggler module. </html>
-accessories/plugins/ExportWithXSLT_TASKSTJI.text = Tasks from TASKS node to TaskJuggler file...
-accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip = <html>Exports tasks from TASKS node to Taskjuggler module. </html>
-accessories/plugins/ManagePatterns.dialog.title = Manage Patterns...
-accessories/plugins/ManagePatterns.not_found = Pattern file can't be loaded.
-accessories/plugins/SaveAll.properties_save_all_cancelled = Operation was not completed successfully.
-add = &Add
-AddConnectorAction.text = Add Connector
-AddElementaryConditionAction.text = Add
-AddLocalLinkAction.text = Add Local Hyperlink
-AllMapsNodeListAction.text = Find and Replace in all maps
-antialias_all = Antialias All
-antialias_edges = Antialias Edges
-antialias_none = Antialias None
-apply = &Apply
-ApplyAction.text = &Apply
-ApplyFormatPlugin.text = &Change format ...
-ApplyFormatPlugin.tooltip = Presents a dialog in which node and edge attributes can be changed at once.
-ApplyNoFilteringAction.text = No Filtering
-ApplySelectedViewConditionAction.text = Filter selected nodes
-ApplyToVisibleAction.text = Applies to filtered nodes
-as_parent = As Parent
-AskForHelp.text = Ask for Help
-AssignAttributesAction.text = Assi&gn Attributes...
-attribute_delete = Delete all Values
-attribute_delete_value = Delete this Value
-attribute_font_size_tooltip = Attribute Font Size
-attribute_list_box_label_text = Existing Values
-attribute_replace = Replace with
-attribute_top = All known Attributes for the loaded Maps
-attributes_adding_empty_attribute_error = Can not use an empty string as attribute name
-attributes_all = All Attributes
-attributes_assign_dialog = Assign Attributes
-attributes_attribute = Attributes
-attributes_close = Close
-attributes_deselect_all = Nothing
-attributes_dialog_title = Attribute Manager
-attributes_edit = Edit
-attributes_edit_tooltip = Edit Set
-attributes_for_selected = Selected Nodes
-attributes_for_visible = All Visible Nodes
-attributes_import = &Import
-attributes_import_tooltip = Import attributes from the other loaded maps
-attributes_no_import_candidates_found = No new attributes found
-attributes_popup_delete = Delete
-attributes_popup_down = Down
-attributes_popup_edit = Edit
-attributes_popup_hide = Hide
-attributes_popup_new = New Attribute
-attributes_popup_optimal_width = Optimal Width
-attributes_popup_up = Up
-attributes_refresh = Refresh
-attributes_restricted_attributes_tooltip = Restrict Set of Attributes
-attributes_restricted_values_tooltip = Restrict Set of Values for Current Attribute
-attributes_restriction = Restricted Set
-attributes_select_all = All
-attributes_select_all_tooltip = Select / Deselect all
-attributes_show = Show
-attributes_skip_root = Skip Root Node
-attributes_visible = Selected Visible
-attributes_visible_tooltip = Selected Visible
-automatically_save_message = Map was automatically saved (using the file name {0}) ...
-AutomaticLayoutAction.text = &Automatic Layout
-AutomaticLayoutAction.tooltip = <html>Fixes the layout of the map. <br>The first level is black, the second blue, etc.</html>
-BackAction.text = Back
-BackAction.tooltip = Jumps back in the select chain
-background = Background
-bitmaps = bitmaps
-BlinkingNodeHookAction.text = Blinking Node
-BlinkingNodeHookAction.tooltip = <html>This makes the node blinking. But be careful. Do not associate it to many nodes, and <strong> not with other automatic formattings to the same node</strong></html>
-BoldAction.text = Bold
-boldify_branch = Boldify
-branch = Branch
-can_not_connect_to_info_server = Can not connect to information server
-can_not_save_key_set = Can not save hot key set
-cancel = &Cancel
-CancelAction.text = &Cancel
-cannot_add_parent_diff_parents = All nodes must have the same parent to use this function.
-cannot_add_parent_to_root = The root node can't be added to a new parent.
-cannot_delete_root = The root node can't be deleted or cut.
-cannot_join_nodes_with_children = Cannot join nodes with children
-cannot_move_to_child = Can't move a node to one of its children.
-CenterAction.text = Center
-CenterSelectedNodeAction.text = Center selected node
-change_link_arrows = change_link_arrows
-ChangeConnectorArrowsAction.backward.text = Back
-ChangeConnectorArrowsAction.both.text = Both
-ChangeConnectorArrowsAction.forward.text = Forward
-ChangeConnectorArrowsAction.none.text = None
-ChangeConnectorArrowsAction.text = Change Arrows of Connector
-ChangeNodeLevelLeftsAction.text = Node left
-ChangeNodeLevelLeftsAction.tooltip = On the left of root the node(s) is/are shifted downwards. It/they become children of its above sibling. On the right of root the node(s) are shifted upwards. Directly at root, the node(s) change sides.
-ChangeNodeLevelRightsAction.text = Node right
-ChangeNodeLevelRightsAction.tooltip = On the right of root the node(s) is/are shifted downwards. It/they become children of its above sibling. On the left of root the node(s) are shifted upwards. Directly at root, the node(s) change sides.
-choose_background_color = Choose Background Color:
-choose_cloud_color = Choose Cloud Color:
-choose_edge_color = Choose Edge Color
-choose_map_background_color = Choose Map Background Color
-choose_node_background_color = Choose Node Background Color:
-choose_node_color = Choose Node Color:
-CloseAction.text = &Close
-CloudAction.text = Cloud
-CloudColorAction.text = Cloud Color...
-ColorProperty.ResetColor = Reset Color
-combined = Combined
-confirmation = Confirmation
-connector = Connector
-connector_label = Connector Label
-ConnectorColorAction.text = Connector Color...
-CopyAction.text = Copy
-CopyIDAction.text = Copy Node ID
-CopySingleAction.text = Copy Single
-corrupt_map = Map content is corrupted
-CreateConjunctConditionAction.text = And
-CreateDisjunctConditionAction.text = Or
-CreateNotSatisfiedConditionAction.text = Not
-CreationModificationPluginAction.text = Show &Modification Times
-CreationModificationPluginAction.tooltip = <html>This function keeps track of node creation and modification times.</html>
-CutAction.text = Cut
-decrease_branch_font_size = Smaller Font
-DecreaseNodeFontAction.text = Smaller Font
-delete = &Delete
-delete_child = Delete Node
-DeleteAction.text = Remove Node
-DeleteConditionAction.text = Delete
-DirectHtmlFlavorHandler = HTML as single node
-DocumentationAction.text = Documentation
-doubled_patterns_ignored = Patterns with the same names not added to menu:
-download = Download
-edge = Edge
-edge_style = Edge Style
-edge_width = Edge Width
-EdgeColorAction.text = Edge Color...
-EdgeLikeLinkAction.text = Simulate edge
-EdgeStyleAction.bezier.text = Bezier
-EdgeStyleAction.hide_edge.text = Hide Edge
-EdgeStyleAction.horizontal.text = Horizontal
-EdgeStyleAction.linear.text = Linear
-EdgeStyleAction.sharp_bezier.text = Sharp Bezier
-EdgeStyleAction.sharp_linear.text = Sharp Linear
-EdgeStyleAsParentAction.text = As Parent
-EdgeWidthAction_width_parent.text = Parent
-EdgeWidthAction_width_thin.text = Thin
-edit = &Edit
-edit.decision = HTML Editor
-edit.edit_rich_text = Do you want to use formattings like bold or italics?
-edit_link_manually = Edit Hyperlink Manually...
-edit_long_node = Edit Long Node
-edit_middle_label = Edit Middle Label
-edit_source_label = Edit Source Label
-edit_target_label = Edit Target Label
-EditAction.text = Edit Node
-EditAttributesAction.text = Edit Attributes
-EditFilterAction.text = Edit
-EditLongAction.text = Edit Long Node...
-EncryptedMap.text = Create Encrypted Map ...
-EncryptedMap.tooltip = Create a new encrypted map
-enter_base_url = I am going to paste relative links. Enter please base URL.
-enter_confirms = &Enter Confirms
-enter_keyset_name = Enter hot key set name
-EnterPassword.text = &Toggle Encrypted / Decrypted
-error = Error
-error_applying_template = Error applying XSL template.
-error_creating_directory = Cannot create directory for export.
-ExecuteScriptError.text = Error executing the script.\nCheck the log file for details.
-ExecuteScriptForAllNodes.text = Execute all scripts
-ExecuteScriptForSelectionAction.text = Execute selected node scripts
-ExecuteScriptOnSelectedNode.text = Execute {0} on all selected nodes
-ExecuteScriptOnSelectedNodeRecursively.text = Execute {0} on selected nodes, recursively
-ExecuteScriptOnSingleNode.text = Execute {0} on one selected node
-ExecuteScripts.text = Scripts
-export_failed = Export failed
-export_pdf_text = Portable Document Format (PDF)
-export_svg_text = Scalable Vector Graphic (SVG)
-export_using_xslt = Freeplane Export using XSLT
-ExportBranchAction.text = Branch as new Map ...
-ExportBranchToHTMLAction.text = Branch as HTML
-ExportPdf.text = As PDF...
-ExportPdf.tooltip = Export to PDF
-ExportSvg.text = As SVG...
-ExportSvg.tooltip = Export to SVG
-ExportToHTMLAction.text = As HTML
-ExportToImage.jpg.text = As JPEG...
-ExportToImage.jpg.tooltip = Exports the map in the current folding to a JPEG image.
-ExportToImage.png.text = As PNG...
-ExportToImage.png.tooltip = Exports the map in the current folding to a PNG image.
-ExportToOoWriter.text = As Open Office Writer Document...
-ExportToOoWriter.tooltip = Unfolded nodes form the structure, folded nodes the content of the document.
-
-extension_menu = Physical &Style
-extract_link_from_text.tooltip = Set hyper link found in node text
-ExtractLinkFromTextAction.text = Hyper link from text
-f_button_unassigned = <no action>
-FaqOpenURLAction.text = FAQ
-file = &File
-file_already_exists = The file {0} already exists. Do you want to overwrite it?
-file_not_found = File $1 not found
-FileListFlavorHandler = Links to files
-filter = Filter
-filter_add = &Add
-filter_and = A&nd
-filter_conditions = Filters
-filter_contains = Contains
-filter_created_after = Created after
-filter_created_before = Created before
-filter_delete = &Delete
-filter_dialog = Filter Composer
-filter_does_not_exist = Not Exist
-filter_edit_description = Edit Filter List
-filter_enter_value = Enter Value
-filter_exist = Exists
-filter_icon = Icon
-filter_ignore_case = Ignore Case
-filter_is_equal_to = Is equal to
-filter_is_not_equal_to = Is not equal to
-filter_link = Hyperlink
-filter_modified_after = Modified after
-filter_modified_before = Modified before
-filter_no_filtering = No Filtering
-filter_node = Node Text
-filter_not = &Not
-filter_note = Note
-filter_or = O&r
-filter_priority = Priority
-filter_regexp_matches = Matches regexp
-filter_select = &Select
-filter_selected_node_view = Currently Selected Nodes
-filter_selected_node_view_snapshot = Saved selection
-filter_time = Date filter
-filters_not_loaded = Filter could not be loaded, file corrupted
-find_what = Find what
-FindAction.text = Find...
-FindNextAction.text = Find Next
-fit_map_to_page = Fit to One Page
-fit_map_to_page_height = Fit height to one page
-fit_map_to_page_width = Fit width to one page
-FitToPage.text = Zoom to &Fit to Page
-FitToPage.tooltip = Adjusts the zoom such that the entire map fits into the current window.
-fold = Fold
-FoldAllAction.text = Fold All
-FoldAllAction.tooltip = <html>Folds the selected nodes and all their children.</html>
-FoldOneLevelAction.text = Fold One Level
-FoldOneLevelAction.tooltip = <html>Folds the selected nodes by one level.</html>
-follow_graphical_link = Go to:
-FollowLinkAction.text = Follow Link
-font = Font
-FontFamilyAction.text = font family
-FontSizeAction.text = font size
-format_menu_edge_styles = &Edge Styles
-format_menu_edge_widths = Edge &Widths
-FormatCopy.text = Copy Format
-FormatCopy.tooltip = <html>Copies the format of a node.</html>
-FormatPaste.text = Paste Format
-FormatPaste.tooltip = <html>Pastes the format of a node.</html>
-ForwardAction.text = Forward
-ForwardAction.tooltip = Jumps forward in the select chain
-Freeplane.progress.buildScreen = Build Screen...
-Freeplane.progress.createController = Create Controller...
-Freeplane.progress.createInitialMode = Create Initial Mode...
-Freeplane.progress.endStartup = Finish Startup.
-Freeplane.progress.gettingPreferenceDirectories = Getting Preference Directories...
-Freeplane.progress.gettingPreferences = Getting Preferences...
-Freeplane.progress.loadMaps = Load Maps...
-Freeplane.progress.propagateLookAndFeel = Propagete Look And Feel...
-Freeplane.progress.settingPreferences = Setting Preferences...
-Freeplane.progress.startCreateController = Start Create Controller...
-Freeplane.progress.updateLookAndFeel = Update Look And Feel...
-freeplane_reverted = Freeplane_Reverted_
-FreeplaneHelpStarter.text = Help...
-FreeplaneHelpStarter.tooltip = Freeplane Extended Help
-GotoLinkNodeAction.text = Goto Link
-GrabKeyDialog.common.cancel = Cancel
-GrabKeyDialog.common.ok = OK
-GrabKeyDialog.grab-key.assigned-to.none = Currently not assigned
-GrabKeyDialog.grab-key.assigned-to = Assigned to
-GrabKeyDialog.grab-key.caption =
-GrabKeyDialog.grab-key.clear = Clear
-GrabKeyDialog.grab-key.remove-ask = Are you sure to remove this keystroke?
-GrabKeyDialog.grab-key.remove = Remove
-GrabKeyDialog.grab-key.title = Enter new key
-help = &Help
-HideableAction.tooltip = <html>Marks the background of each changed node.</html>
-HideAllAttributesAction.text = Hide All Attributes
-HierarchicalIconsAction.text = Show icons &hierarchically
-HierarchicalIconsAction.tooltip = If one of the (grand)children of me has an icon, I will show this icon in little format, too.
-HotKeyInfoAction.text = Key Reference
-html_export_based_on_headings = HTML Export - Based on Headings
-html_export_fold_all = HTML Export - Fold All
-html_export_fold_currently_folded = HTML Export - Fold Currently Folded
-html_export_no_folding = HTML Export - No Folding
-icon_0% = 0%
-icon_100% = 100%
-icon_25% = 25%
-icon_50% = 50%
-icon_75% = 75%
-icon_attach = Look here
-icon_back = Back
-icon_bee = Freeplane
-icon_bell = Remember
-icon_bookmark = Excellent
-icon_broken-line = Broken
-icon_button_cancel = Not OK
-icon_button_ok = OK
-icon_calendar = Date
-icon_clanbomber = Dangerous
-icon_clock = Time
-icon_clock2 = Reminder
-icon_closed = No Entry
-icon_decrypted = Unlocked
-icon_desktop_new = Do not forget
-icon_down = Down
-icon_edit = Refine
-icon_encrypted = Locked
-icon_family = Family
-icon_fema = Male & Female
-icon_female1 = Female1
-icon_female2 = Female2
-icon_females = Females
-icon_flag = Red Flag
-icon_flag-black = Black Flag
-icon_flag-blue = Blue Flag
-icon_flag-green = Green Flag
-icon_flag-orange = Orange Flag
-icon_flag-pink = Pink Flag
-icon_flag-yellow = Yellow Flag
-icon_folder = Folder
-icon_forward = Forward
-icon_freemind_butterfly = FreeMind
-icon_full-0 = Priority 0
-icon_full-1 = Priority 1
-icon_full-2 = Priority 2
-icon_full-3 = Priority 3
-icon_full-4 = Priority 4
-icon_full-5 = Priority 5
-icon_full-6 = Priority 6
-icon_full-7 = Priority 7
-icon_full-8 = Priority 8
-icon_full-9 = Priority 9
-icon_go = Green Traffic Light
-icon_gohome = Home
-icon_group = Group
-icon_help = Question
-icon_hourglass = Waiting
-icon_idea = Idea
-icon_info = Info
-icon_kaddressbook = Phone
-icon_kmail = E-Mail
-icon_knotify = Music
-icon_korn = Mailbox
-icon_ksmiletris = I am happy
-icon_launch = Launch
-icon_licq = Nice
-icon_list = List
-icon_Mail = Mail
-icon_male1 = Male1
-icon_male2 = Male2
-icon_males = Males
-icon_menu = I&cons
-icon_messagebox_warning = Important
-icon_password = Key
-icon_pencil = To be refined
-icon_penguin = Linux
-icon_prepare = Yellow Traffic Light
-icon_smiley-angry = Angry
-icon_smiley-neutral = No Mind
-icon_smiley-oh = Surprising
-icon_smily_bad = I'm not amused
-icon_stop = Red Traffic Light
-icon_stop-sign = Stop
-icon_up = Up
-icon_user_icon = User icons
-icon_wizard = Magic
-icon_xmag = To be discussed
-icon_yes = Important
-IconGroupPopupAction.arrows.text = Arrows
-IconGroupPopupAction.docs_folders.text = Docs & Folders
-IconGroupPopupAction.flags.text = Flags
-IconGroupPopupAction.miscallaneous.text = Miscellaneous
-IconGroupPopupAction.nature.text = Nature
-IconGroupPopupAction.numbers.text = Numbers
-IconGroupPopupAction.office.text = Office
-IconGroupPopupAction.people.text = People
-IconGroupPopupAction.signs.text = Signs
-IconGroupPopupAction.smiley.text = Smiley
-IconGroupPopupAction.time.text = Time
-IconGroupPopupAction.user.text = User icons
-IconSelectionPlugin.text = Select Icon...
-IconSelectionPlugin.tooltip = <html>Here you can select an icon using a subwindow.</html>
-import = Import
-import_linked_branch_no_link = The selected node has no link to import from.
-ImportAction.text = &Import
-ImportBranchAction.text = Branch...
-ImportExplorerFavoritesAction.text = Explorer Favorites...
-ImportFolderStructureAction.text = Folder Structure...
-ImportLinkedBranchAction.text = Linked Branch
-ImportLinkedBranchWithoutRootAction.text = (Linked Branch) Without Root...
-ImportMindmanagerFiles.text = MindManager X5 Map...
-increase_branch_font_size = Larger Font
-IncreaseNodeFontAction.text = Larger Font
-ItalicAction.text = Italic
-italicise_branch = Italicise
-java_version = Java version: {0}
-JoinNodesAction.text = Join Nodes
-
-LatexNodeHookAction.text = &Latex
-LatexNodeHookAction.tooltip = <html>Latex formula</html>
-less_than_two_selected_nodes = You have to select at least two nodes to get links.
-license = License
-license_text = Freeplane - A Program for creating and viewing Mindmaps\nCopyright (C) 2000-2010 Joerg Mueller <joergmueller at bigfoot.com>\nSee COPYING for Details\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License\nas published by the Free Software Foundation; either version 2\nof the License, or (at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY [...]
-LicenseAction.text = License
-link_not_available_any_more = The link is not valid anymore. The node was deleted in between.
-load = &Load
-LoadAcceleratorPresetsAction.textPatterns.text = Text Patterns
-long_node_changed_cancel = You have changed the node. Do you want to discard changes?
-long_node_changed_submit = You have changed the node. Do you want to save changes?
-lots_of_links_warning = You are going to create a lot of links to the same node. Do you really want to create these links?
-main_resource_directory = Installation resources: {0}
-map_already_exists = The map already exists. Do you want to overwrite it?
-map_corrupted = Map corrupted. View detail?
-map_not_saved = The map was not saved before.
-MapBackgroundColorAction.text = Map Background
-MaxNodeWidthAction.text = Set maximum node width
-menu_attributes = &Attributes
-menu_extras = &Tools
-ExportAction.text = &Export
-menu_file_import = I&mport
-menu_filter = F&ilter
-menu_format = F&ormat
-menu_insert = In&sert
-menu_navigate = &Navigate
-menu_view = &View
-mindmap = Map
-MindMapNodesFlavorHandler = Node hierarchy
-mindmaps = &Maps
-mindmaps_desc = Maps (*.mm)
-mindmaps_filter_desc = Filters (*.mmfilter)
-mode_Browse = Browse Mode
-mode_File = File Mode
-mode_MindMap = MindMap Mode
-mode_na = Mode not available
-mode_status = Mode changed to {0}
-mode_title = Freeplane - {0}
-modes = Modes
-ModesMenuAction.Browse.text = Map Browser
-ModesMenuAction.File.text = File Explorer
-ModesMenuAction.MindMap.text = Mind Map Editor
-most_recent_files = &Most Recent Files
-MoveToRootAction.text = Move to Root
-NavigationNextMapAction.text = Next Map
-NavigationPreviousMapAction.text = Previous Map
-new_mindmap = New Mindmap
-new_node = New Node
-new_node_as_sibling_not_possible_for_the_root = New node as sibling is not possible for the root
-NewChildAction.text = New Child Node
-NewMapAction.text = New
-NewParentNode.text = New Parent Node
-NewParentNode.tooltip = <html>All selected are sent to a new parent.</html>
-NewPreviousSiblingAction.text = New Previous Sibling Node
-NewSiblingAction.text = New Sibling Node
-NextNodeAction.BACK.text = Previous node
-NextNodeAction.BACK_N_FOLD.text = Previous node (fold)
-NextNodeAction.FORWARD.text = Next node
-NextNodeAction.FORWARD_N_FOLD.text = Next node (fold)
-no = No
-no_format_copy_before_format_paste = You can't paste a format until you've copied one.
-no_previous_find = No previous find.
-node = Node
-node_changed_discard_changes = You have changed the node. Do you want to discard changes?
-node_is_write_protected = Target node is write protected.
-node_location_help = Dragging changes node location, ctrl+dragging changes distances, double click and ctrl+double click reset them.
-NodeBackgroundColorAction.text = &Node Background Color...
-NodeColorAction.text = Node Color...
-NodeColorBlendAction.text = Blend Color
-NodeDownAction.text = Node Down
-NodeListAction.text = Find and Replace...
-NodeListAction.tooltip = Shows all nodes as a searchable list with filter properties.
-NodeShapeAction.bubble.text = &Bubble
-NodeShapeAction.fork.text = &Fork
-NodeUpAction.text = Node Up
-nonboldify_branch = Unboldify
-nonitalicise_branch = Unitalicise
-normal = Normal
-not_saved_for_image_error = The map must be saved before you can set an image by file chooser
-not_saved_for_link_error = The map must be saved before you can set a link by file chooser
-note_window_location = Note Position
-ok = &OK
-OKAction.text = &OK
-OpenAction.text = Open...
-OpenFreeplaneSiteAction.text = Freeplane's Homepage
-OpenPathAction.text = Open File
-option_changes_may_require_restart = To see the effect of the changed settings, you probably have to restart Freeplane.
-OptionalDontShowMeAgainDialog.cancel = &No
-OptionalDontShowMeAgainDialog.dontShowAgain = &Don't ask me again.
-OptionalDontShowMeAgainDialog.ok = &Yes
-OptionalDontShowMeAgainDialog.rememberMyDescision = &Remember my decision.
-OptionPanel.absolute = Absolute
-OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName = Automatic layout patterns
-OptionPanel.always_fold_all_after_load = Fold all
-OptionPanel.always_save_folding = always
-OptionPanel.always_save_folding_state.tooltip = If checked, each folding action makes the map dirty and reminds you to save it.
-OptionPanel.always_save_folding_state = Always save folding state changes
-OptionPanel.always_unfold_all_after_load = Unfold all
-OptionPanel.antialias.tooltip = <html>Determines the quality of the map. More antialias needs more time.</html>
-OptionPanel.antialias = Antialias
-OptionPanel.antialias_all = Antialias All
-OptionPanel.antialias_edges = Antialias Edges
-OptionPanel.antialias_none = No Antialias
-OptionPanel.Appearance = Appearance
-OptionPanel.ar = Arabic / \u0627\u0644\u0639\u0631\u0628\u064a\u0629
-OptionPanel.as_parent = As parent
-OptionPanel.ask = Ask
-OptionPanel.automatic = Automatic
-OptionPanel.automaticFormat_level1 = Root Node Format
-OptionPanel.automaticFormat_level2 = 1. Level Node Format
-OptionPanel.automaticFormat_level = Automatic Layout Styles
-OptionPanel.backup_file_number = Number of kept backup files
-OptionPanel.Behaviour = Behaviour
-OptionPanel.bezier = bezier
-OptionPanel.bubble = Bubble
-OptionPanel.ca = Catalan, Valencian / Catal\u00e0
-OptionPanel.Cancel = Cancel
-OptionPanel.center_selected_node = Center selected nodes
-OptionPanel.check_updates_automatically = Check for updates on program start
-OptionPanel.childpattern.tooltip = The selected pattern is applied to all children.
-OptionPanel.childpattern = Child Pattern
-OptionPanel.clear_all_setters.tooltip = Enables or disables all change indications.
-OptionPanel.clear_all_setters = Switch all
-OptionPanel.cloud = Cloud
-OptionPanel.cloudcolor = Cloud and Color
-OptionPanel.combined = Combined
-OptionPanel.convert_to_current_version.tooltip = <html>Only for very big maps that don't need to be converted <br>(this is expert knowledge) you can open the maps without conversion.</html>
-OptionPanel.convert_to_current_version = <html>Automatically convert maps of older Freeplane versions <br>to the current version?</html>
-OptionPanel.cs = Czech / \u010desky
-OptionPanel.cut_nodes_without_question.tooltip = If this check box is set the nodes are cut without confirmation. This can cause loss of information if pressed without intention.
-OptionPanel.cut_nodes_without_question = Cut nodes without confirmation?
-OptionPanel.da = Danish / dansk
-OptionPanel.de = German / Deutsch
-OptionPanel.default = Default
-OptionPanel.default_browser_command_mac.tooltip = <html> and MAC: (thanks to Nick!)</html>
-OptionPanel.default_browser_command_mac = Default Browser Command Mac
-OptionPanel.default_browser_command_other_os.tooltip = <html> This is typically Linux:</html>
-OptionPanel.default_browser_command_other_os = Default Browser Command Other Os
-OptionPanel.default_browser_command_windows_9x.tooltip = <html>For Windows (the "" signs are necessary due to links, that have "=" in their URL).</html>
-OptionPanel.default_browser_command_windows_9x = Default Browser Command Windows 9x
-OptionPanel.default_browser_command_windows_nt.tooltip = <html>For Windows (the "" signs are necessary due to links, that have "=" in their URL).</html>
-OptionPanel.default_browser_command_windows_nt = Default Browser Command Windows Nt
-OptionPanel.default_charset = Charset
-OptionPanel.defaultfont.tooltip = <html>The default node font. This will only work if the font (TrueType Font) is available on the system </html>
-OptionPanel.defaultfont = Default Font
-OptionPanel.defaultfontsize = Default Font Size
-OptionPanel.defaultfontstyle = Default Font Style
-OptionPanel.Defaults = Defaults
-OptionPanel.delete_automatic_saves_at_exit.tooltip = <html> If the files should be deleted automatically on a normal shutdown of Freeplane set the following variable to true</html>
-OptionPanel.delete_automatic_saves_at_exit = Delete Automatic Saves At Exit
-OptionPanel.delete_nodes_without_question.tooltip = If this check box is set the nodes are deleted without confirmation. This can cause loss of information if pressed without intention.
-OptionPanel.delete_nodes_without_question = Delete nodes without confirmation?
-OptionPanel.disable_cursor_move_paper.tooltip = <html>Don't display 'move' cursor during paper dragging</html>
-OptionPanel.disable_cursor_move_paper = Disable Cursor Move Paper
-
-
-OptionPanel.display_node_id = Display node ID
-
-OptionPanel.draganddrop.tooltip = <html>If dnd is enabled. </html>
-OptionPanel.draganddrop = Drag And Drop
-OptionPanel.edgecolor.tooltip = Property of the edge to the parent node (is also applied to all child nodes)
-OptionPanel.edgecolor = Edge color
-OptionPanel.edgestyle.tooltip = Property of the edge to the parent node (is also applied to all child nodes)
-OptionPanel.edgestyle = Edge style
-OptionPanel.edgewidth.tooltip = Property of the edge to the parent node (is also applied to all child nodes)
-OptionPanel.edgewidth = Edge width
-OptionPanel.EdgeWidth_1 = 1
-OptionPanel.EdgeWidth_2 = 2
-OptionPanel.EdgeWidth_4 = 4
-OptionPanel.EdgeWidth_8 = 8
-OptionPanel.EdgeWidth_parent = As parent
-OptionPanel.EdgeWidth_thin = thin
-OptionPanel.editor_extra_width = extra width step
-OptionPanel.el = Greek / \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac
-OptionPanel.el__buttons_above = Buttons at the top
-OptionPanel.el__enter_confirms_by_default = Enter Confirms By Default
-OptionPanel.el__max_default_window_height = Max Default Window Height
-OptionPanel.el__max_default_window_width = Max Default Window Width
-OptionPanel.el__min_default_window_height = Min Default Window Height
-OptionPanel.el__min_default_window_width = Min Default Window Width
-OptionPanel.el__position_window_below_node = Position Window Below Node
-OptionPanel.en = English / English
-
-
-OptionPanel.Environment = Environment
-OptionPanel.es = Spanish, Castilian / espa\u00f1ol, castellano
-OptionPanel.et = Estonian / eesti, eesti keel
-OptionPanel.execute_scripts_without_asking.tooltip = <html>Freeplane scripts are principally able to perform any action on your computer. <br>Thus, you shouldn't execute scripts you don't know to be safe.</html>
-OptionPanel.execute_scripts_without_asking = Scripts should be carried out without confirmation?
-OptionPanel.execute_scripts_without_exec_restriction.tooltip = <html><body>If your Groovy Scripts need to execute special other applications (like a browser) without asking(!),<br>you have to enable this option. <br>But use it with care, as now malicious scripts can hurt your computer!</body></html>
-OptionPanel.execute_scripts_without_exec_restriction = Permit to Execute other Applications (NOT recommended)
-OptionPanel.execute_scripts_without_file_restriction.tooltip = <html><body>If your Groovy Scripts need to execute special file actions (open, close, read, write, delete(!)),<br>you have to enable this option. <br>But use it with care, as now malicious scripts can hurt your computer!</body></html>
-OptionPanel.execute_scripts_without_file_restriction = Permit File Operations (NOT recommended)
-OptionPanel.execute_scripts_without_network_restriction.tooltip = <html><body>If your Groovy Scripts need to execute special network actions,<br>you have to enable this option. <br>But use it with care, as now malicious scripts can disclosure your secrets!</body></html>
-OptionPanel.execute_scripts_without_network_restriction = Permit Network Operations (NOT recommended)
-OptionPanel.experimental_file_locking_on.tooltip = <html> Experimental feature</html>
-OptionPanel.experimental_file_locking_on = Experimental File Locking
-OptionPanel.export_icons_in_html.tooltip = <html> Tell if HTML exported from Freeplane should contain icons. The trouble with icons is that quite often the links to icons will not be found in the exported HTML.</html>
-OptionPanel.export_icons_in_html = Export Icons In Html
-OptionPanel.Files = Files
-OptionPanel.first = First
-OptionPanel.foldingsymbolwidth.tooltip = <html>Width of the folding marking circle</html>
-OptionPanel.foldingsymbolwidth = Folding Symbol Width
-OptionPanel.fork = Fork
-OptionPanel.fr = French / Fran\u00e7ais
-OptionPanel.gl = Galician / Galego
-OptionPanel.goto_note_end_on_edit = Move note cursor to the end
-OptionPanel.gtk = Gtk
-OptionPanel.hide_edge = hide edge
-OptionPanel.horizontal = horizontal
-OptionPanel.hr = Croatian / hrvatski
-OptionPanel.HTML = HTML
-OptionPanel.html_export_based_on_headings = Based On Headings
-OptionPanel.html_export_fold_all = Fold All
-OptionPanel.html_export_fold_currently_folded = Fold Currently Folded
-OptionPanel.html_export_folding = Html Export Folding
-OptionPanel.html_export_no_folding = No Folding
-OptionPanel.hu = Hungarian / Magyar
-OptionPanel.icon.tooltip = If applied, the node will have exactly this icon.
-OptionPanel.icon = Icon
-OptionPanel.icons.list.tooltip = Here, you can order or disable the standard icons. The icons have to be separated by ';'.
-OptionPanel.icons.list = List of Displayed Standard Icons
-OptionPanel.id = Indonesian / Bahasa Indonesia
-OptionPanel.il__enter_confirms_by_default = Enter Confirms By Default
-OptionPanel.it = Italian / Italiano
-OptionPanel.ja = Japanese / \u65e5\u672c\u8a9e
-
-
-OptionPanel.Keystrokes = Keystrokes
-OptionPanel.ko = Korean / \ud55c\uad6d\uc5b4 (\u97d3\u570b\u8a9e), \uc870\uc120\ub9d0 (\u671d\u9bae\u8a9e)
-OptionPanel.label_font_family = Font Family
-OptionPanel.label_font_size = Font Size
-OptionPanel.language.tooltip = <html>This is the language that should be used in the program. 'automatic' tries to load the current user's language. </html>
-OptionPanel.language = Language
-OptionPanel.last = Last
-OptionPanel.last_opened_list_length = Last Opened List Length
-OptionPanel.level1 = Format of the Root Node
-OptionPanel.level2 = 1. Level Node Format
-OptionPanel.level3 = 2. Level Node Format
-OptionPanel.level4 = 3. Level Node Format
-OptionPanel.level5 = Other's Node Format
-OptionPanel.level = Level
-OptionPanel.linear = linear
-OptionPanel.links.tooltip = <html>Set Links either relative or absolute </html>
-OptionPanel.links = Links
-OptionPanel.load_folding = On Load
-OptionPanel.load_folding_from_map_default_fold_all = Load from map or fold all
-OptionPanel.load_folding_from_map_default_unfold_all = Load from map or unfold all
-OptionPanel.load_folding_start_level = Fold nodes from level
-OptionPanel.load_last_map.tooltip = <html>When Freeplane starts, it fetches the last opened map automatically if checked.</html>
-OptionPanel.load_last_map = Automatically open last map
-OptionPanel.load_last_maps = Load all last maps
-OptionPanel.lookandfeel.tooltip = <html>The Look&Feel to use. 'metal','windows','motif', 'gtk' are supported, 'mac' is available only on MacOS. Default means, that the default look and feel is used. If you want to put your own L&F, please, enter the class name here and assure that the corresponding jar file(s) are loaded. If there are problems with the look and feel, then choose 'nothing' here. It works for applets.</html>
-OptionPanel.lookandfeel = Look and Feel
-OptionPanel.lt = Lithuanian / kalba
-OptionPanel.mapxsize.tooltip = <html>The initial size of every map </html>
-OptionPanel.mapxsize = Map-X-size
-OptionPanel.mapysize = Map-Y-size
-OptionPanel.max_node_width.tooltip = <html>The default maximal node width in pixels</html>
-OptionPanel.max_node_width = Max Node Width
-OptionPanel.metal = Metal
-OptionPanel.motif = Motif
-OptionPanel.nb = Norwegian Bokm\u00e5l / Norsk bokm\u00e5l
-OptionPanel.never_save_folding = never
-OptionPanel.nl = Dutch, Flemish / Nederlands, Vlaams
-OptionPanel.nn = Norwegian Nynorsk / Norsk nynorsk
-OptionPanel.nodebackgroundcolor.tooltip = The node's background when not selected.
-OptionPanel.nodebackgroundcolor = Node background color
-OptionPanel.nodecolor.tooltip = The node's foreground color when not selected.
-OptionPanel.nodecolor = Node color
-OptionPanel.nodefontbold = Bold font
-OptionPanel.nodefontitalic = Italic font
-OptionPanel.nodefontname = Node's font name
-OptionPanel.nodefontsize = Node's font size
-OptionPanel.nodeshape.tooltip = <html>The style describes the outer form of a node. <br>Possible values:<br><table border="1"><tr><td>fork: </td><td> without surrounding box,</td></tr><tr><td>bubble: </td><td> node with a surrounding rectangle,</td></tr><tr><td>As parent: </td><td> take the style from the parent node <br>or the default root node style for the root node,</td></tr><tr><td>Combined: </td><td> Bubble when node is folded, fork otherwise.</td></tr></table></html>
-OptionPanel.nodeshape = Node style
-OptionPanel.nodetext.tooltip = Here, you can define the node's text. The former text is discarded when such a pattern is applied.
-OptionPanel.nodetext = Node text
-OptionPanel.nothing = Nothing
-OptionPanel.number_of_different_files_for_automatic_save.tooltip = <html> number n of different files to store the maps into. The first automatic save is done in the first file, and so on up to the n+1-save which is again stored in the first file (cyclic)</html>
-OptionPanel.number_of_different_files_for_automatic_save = Number Of Different Files For Automatic Save
-OptionPanel.OK = Save
-OptionPanel.org.freeplane.plugin.bugreport.allowed = Always send
-OptionPanel.org.freeplane.plugin.bugreport.ask = Show report dialog
-OptionPanel.org.freeplane.plugin.bugreport.denied = Never send
-OptionPanel.org.freeplane.plugin.bugreport = Policy
-OptionPanel.outline_hgap = horizontal distance
-OptionPanel.outline_vgap = vertical distance
-OptionPanel.paint_connectors_behind = Nodes hide connectors
-OptionPanel.patternname.tooltip = Unique pattern name
-OptionPanel.patternname = Name
-
-OptionPanel.pl = Polish / polski
-OptionPanel.placenewbranches.tooltip = <html>Where to place new branches. Valid values are 'first' and 'last' </html>
-OptionPanel.placenewbranches = Place New Branches
-OptionPanel.plugins/scripting/tab_name = Scripting
-OptionPanel.printonwhitebackground.tooltip = <html>Always use white background for printing</html>
-OptionPanel.printonwhitebackground = <html>White background for printing</html>
-OptionPanel.pt_BR = Portuguese (Brasil) / Portugu\u00eas (Brasil)
-OptionPanel.pt_PT = Portuguese (Portugal) / Portugu\u00eas (Portugal)
-OptionPanel.relative = Relative
-OptionPanel.remind_type_of_new_nodes.tooltip = <html>"Ask" will ask you (use in doubt).<br>"Yes" displays the rich text editor.<br>"No" displays the plain text editor.</html>
-OptionPanel.remind_use_rich_text_in_new_long_nodes = Use formatting for all nodes
-OptionPanel.remove_notes_without_question.tooltip = If this check box is set the notes belonging to the selected nodes are removed without confirmation. This can cause loss of information if pressed without intention.
-OptionPanel.remove_notes_without_question = Remove Notes without Question?
-OptionPanel.resources_use_default_font_for_notes_too = Use default font for notes too
-OptionPanel.resources_use_margin_top_zero_for_notes = Remove top margin for notes
-OptionPanel.revision_color.tooltip = Background color for the changed nodes.
-OptionPanel.revision_color = Revision Color
-OptionPanel.ru = Russian / \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a
-OptionPanel.save_folding = Save folding
-OptionPanel.save_folding_if_map_is_changed = if map is changed
-OptionPanel.save_modification_times = Save modification times
-OptionPanel.save_only_intrisically_needed_ids.tooltip = When checked, node IDs are omitted that are not used inside the map. Observe, that you can't link external map to specific nodes inside the map without node ID.
-OptionPanel.save_only_intrisically_needed_ids = Save used Node IDs only
-OptionPanel.script.tooltip = The script as groovy source code.
-OptionPanel.script = Script
-OptionPanel.script_directories = Script search path (separate entries by ;;)
-OptionPanel.script_user_key_name_for_signing.tooltip = <html>If you want to sign your scripts, enter the alias of the key here. <br>The key is expected to reside in the default keystore. <br>The password of the key's secret key must coincide with the keystore password (this is the default).</html>
-OptionPanel.script_user_key_name_for_signing = Optional User Key Alias for Signing
-OptionPanel.scrollbar_increment = Speed
-OptionPanel.selection_method.tooltip = <html> with the following switch you can enable/disable the delayed selection scheme. Auto options. Do not modify these as they will be saved to auto.properties anyway.</html>
-OptionPanel.selection_method = Selection Method
-OptionPanel.selection_method_by_click = By Click
-OptionPanel.selection_method_delayed = Delayed
-OptionPanel.selection_method_direct = Direct
-OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName = Patterns
-OptionPanel.separator.anti_alias = Antialias
-OptionPanel.separator.attributes = Attributes
-OptionPanel.separator.automatic_save = Automatic Save
-OptionPanel.separator.behaviour = Behaviour
-OptionPanel.separator.browser = Browser
-OptionPanel.separator.CloudControls = Clouds
-OptionPanel.separator.commands_for_the_program = Commands for the program
-OptionPanel.separator.connectors = Connectors
-OptionPanel.separator.default_colors = Default Colors
-OptionPanel.separator.default_fonts = Default Fonts
-OptionPanel.separator.default_styles = Default Styles
-OptionPanel.separator.EdgeControls = Edges
-OptionPanel.separator.edit_long_node_window = Edit Long Node Window
-OptionPanel.separator.editing = Editor settings
-OptionPanel.separator.files = Files
-OptionPanel.separator.General = General
-OptionPanel.separator.html_export = Html Export
-OptionPanel.separator.html_import = Html Import
-OptionPanel.separator.hyperlink_types = Hyperlink Types
-OptionPanel.separator.icon_properties = Icons
-OptionPanel.separator.icons = Icons in "Select Icon..."
-OptionPanel.separator.initial_map_size = Initial Map Size
-OptionPanel.separator.inline_editor = In-line node editor
-OptionPanel.separator.key_typing = Key Typing
-OptionPanel.separator.language = Language
-OptionPanel.separator.load = Load
-OptionPanel.separator.look_and_feel = Look and Feel
-OptionPanel.separator.mouse_wheel = Mouse Wheel
-OptionPanel.separator.new_node_commands = New node commands
-OptionPanel.separator.node_editing_commands = Node editing commands
-OptionPanel.separator.node_navigation_commands = Node navigation commands
-OptionPanel.separator.NodeColors = Node colors
-OptionPanel.separator.NodeFont = Node Font
-OptionPanel.separator.NodeStyles = Node styles
-OptionPanel.separator.notifications = Confirmations
-OptionPanel.separator.org.freeplane.plugin.bugreport = Automatic bug report
-OptionPanel.separator.other_defaults = Other Defaults
-OptionPanel.separator.others = Other key bindings
-OptionPanel.separator.outline_view = Outline view
-OptionPanel.separator.patterns = Patterns
-OptionPanel.separator.plugins/scripting/separatorPropertyName = Permissions
-OptionPanel.separator.root_node_appearance = Root node appearance
-OptionPanel.separator.save = Save
-OptionPanel.separator.ScriptingControl = Scripting
-OptionPanel.separator.scrollbar = Scrollbar
-OptionPanel.separator.selection_colors = Selection Colors
-OptionPanel.separator.selection_method = Selection Method
-OptionPanel.separator.spelling = Spell checker options
-OptionPanel.separator.tooltip = Tooltip times
-OptionPanel.separator.undo = Undo
-OptionPanel.separator.updates = Program Updates
-OptionPanel.set_property_text.tooltip = Empty: Don't touch; Minus=Remove property (set default values); Plus=Change property
-OptionPanel.set_property_text = Change
-OptionPanel.setscript.tooltip = A script can be associated to the style.
-OptionPanel.setscript = Change?
-OptionPanel.sharp_bezier = sharp bezier
-OptionPanel.sharp_linear = sharp linear
-OptionPanel.show_icon_for_attributes = Show Icon For Attributes
-OptionPanel.show_node_tooltips = Display Tool Tips for Nodes
-OptionPanel.signed_script_are_trusted.tooltip = If scripts are signed by a trusted party (ie. from the Freeplane's authors or by yourself), it is executed without restrictions.
-OptionPanel.signed_script_are_trusted = Trust signed scripts (recommended).
-OptionPanel.sk = Slovak / sloven\u010dina
-OptionPanel.sl = Slovene / sloven\u0161\u010dina
-OptionPanel.spelling_opt_case_sensitive = Case sensitive
-OptionPanel.spelling_opt_ignore_all_caps_words = Ignore all upper case words.
-OptionPanel.spelling_opt_ignore_capitalization = Ignore capital letters at word begin
-OptionPanel.spelling_opt_ignore_words_with_numbers = Ignore words with numbers
-OptionPanel.spelling_opt_suggestions_limit_dialog = Maximum count of suggestions in the dialog
-OptionPanel.spelling_opt_suggestions_limit_menu = Maximum count of suggestions in the menu
-OptionPanel.standardbackgroundcolor.tooltip = <html>The standard background color in html notation </html>
-OptionPanel.standardbackgroundcolor = Standard Background Color
-OptionPanel.standardcloudcolor.tooltip = <html>The standard cloud color in html notation </html>
-OptionPanel.standardcloudcolor = Standard Cloud Color
-OptionPanel.standardcloudestyle.tooltip = <html>The standard cloud style. currently, only 'bezier' is supported</html>
-OptionPanel.standardcloudestyle = Standard Cloud Style
-OptionPanel.standarddrawrectangleforselection.tooltip = <html>Mark selected nodes by bubble around.</html>
-OptionPanel.standarddrawrectangleforselection = Display Selected Nodes in Bubbles
-OptionPanel.standardedgecolor.tooltip = <html>The standard edge color in html notation </html>
-OptionPanel.standardedgecolor = Standard Edge Color
-OptionPanel.standardedgestyle.tooltip = <html>The standard edge style. 'linear' and 'bezier' are supported </html>
-OptionPanel.standardedgestyle = Standard Edge Style
-OptionPanel.standardlinkcolor.tooltip = <html>The standard link color in html notation </html>
-OptionPanel.standardlinkcolor = Standard Link Color
-OptionPanel.standardlinkestyle.tooltip = <html>The standard link style. currently, only 'bezier' is supported</html>
-OptionPanel.standardlinkestyle = Standard Link Style
-OptionPanel.standardnodeshape.tooltip = <html>The default new node style. 'fork', 'bubble' 'as_parent' and 'combined' are supported </html>
-OptionPanel.standardnodeshape = Standard Node Style
-OptionPanel.standardnodetextcolor.tooltip = <html>The standard node color. In html notation (#RRGGBB in hex values) </html>
-OptionPanel.standardnodetextcolor = Standard Node Color
-OptionPanel.standardrootnodeshape.tooltip = <html>The root node style if no other is specified. 'fork' and 'bubble' and 'combined' are supported </html>
-OptionPanel.standardrootnodeshape = Standard Root Node Style
-OptionPanel.standardselectednodecolor.tooltip = <html>The standard node color if selected. In html notation (#RRGGBB in hex values) </html>
-OptionPanel.standardselectednodecolor = Standard Selected Node Color
-OptionPanel.standardselectednoderectanglecolor.tooltip = <html>The color of buble marking selected nodes. In html notation (#RRGGBB in hex values) </html>
-OptionPanel.standardselectednoderectanglecolor = Selected Node Bubble Color
-OptionPanel.structured_html_import = Import HTML as node structure
-OptionPanel.structured_icon_toolbar = Structured icon toolbar
-OptionPanel.sv = Swedish / svenska
-OptionPanel.text.use_ctrl_key = Use 'Assign short cut' from the Tools menu
-OptionPanel.time_for_automatic_save.tooltip = <html> time between two consecutive automatic saving actions (in msec): To disable automatic saving set this number to 2000000000.</html>
-OptionPanel.time_for_automatic_save = Time For Automatic Save
-OptionPanel.time_for_delayed_selection.tooltip = <html> Selection time delay of nodes when mouse is over (in msec). Change this value to 1 if you want direct selection on mouse over.</html>
-OptionPanel.time_for_delayed_selection = Time For Delayed Selection
-OptionPanel.toolTipManager.dismissDelay = Dismiss delay, ms
-OptionPanel.toolTipManager.initialDelay = Initial delay, ms
-OptionPanel.toolTipManager.max_tooltip_width.tooltip = <html>The default tooltip width in pixels.</html>
-OptionPanel.toolTipManager.max_tooltip_width = ToolTip Width
-OptionPanel.toolTipManager.reshowDelay = ReshowDelay delay, ms
-OptionPanel.tr = Turkmen / T\u00fcrkmen, \u0422\u04af\u0440\u043a\u043c\u0435\u043d
-OptionPanel.uk_UA = Ukrainian / \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430
-OptionPanel.undefined_font = Undefined font
-OptionPanel.undo_levels.tooltip = <html>Determines how many steps are stored that can be undone via "Undo".</html>
-OptionPanel.undo_levels = Undo Levels
-OptionPanel.unfold_on_paste.tooltip = Unfold node on paste or Drag-And-Drop
-OptionPanel.unfold_on_paste = Unfold node on paste
-OptionPanel.use_common_out_point_for_root_node.tooltip = Edges start from one point at root node
-OptionPanel.use_common_out_point_for_root_node = Edges start from one point at root node
-OptionPanel.use_tabbed_pane.tooltip = If selected the maps are displayed in tabs (like in FireFox :-) ).
-OptionPanel.use_tabbed_pane = Use Tabs
-OptionPanel.userproperties = Userproperties
-OptionPanel.vi = Vietnamese / Ti\u1ebfng Vi\u1ec7t
-OptionPanel.wheel_velocity.tooltip = A higher value results in fast mouse wheel move effects on the map.
-OptionPanel.wheel_velocity = Speed
-OptionPanel.windows = Windows
-OptionPanel.zh_CN = Chinese, simplified / \u7b80\u4f53\u5b57
-OptionPanel.zh_TW = Chinese, traditional / \u7e41\u9ad4\u5b57
-org.freeplane.plugin.bugreport.agree = Send
-org.freeplane.plugin.bugreport.always_agree = Always send
-org.freeplane.plugin.bugreport.always_deny = Never send
-org.freeplane.plugin.bugreport.deny = Don't send
-org.freeplane.plugin.bugreport.dialog.title = Automatic bug report
-org.freeplane.plugin.bugreport.freeplane_team = Freeplane team message
-org.freeplane.plugin.bugreport.lastreport = The received report
-org.freeplane.plugin.bugreport.never = Never ask me for help
-org.freeplane.plugin.bugreport.question = Freeplane has an automatic bug tracking engine.\nNo personal data or map content will ever be transmitted.\nBug reports will help us improve the software.
-org.freeplane.plugin.bugreport.report = Current report
-org.freeplane.plugin.bugreport.wanted_bug = An internal error occurred and was automatically reported.\nWe would like more information in order to reproduce the unexpected behavior.\nPlease help us by submitting a Bug Report to our Mantis bug tracker:\nexplain what you were doing at the time, so that we may reproduce the bug.\n\nPress OK to open the bug tracker page in your web browser.\n\nThank you for your help in making a bug fix possible.\nYour Freeplane Team
-out_of_memory = Out of memory.
-overwrite_keyset_question = Overwrite existing key set?
-PageAction.text = Page &Setup...
-PasteAction.text = Paste
-PatternNewNameProperty = New Pattern
-PatternToString.backgroundColor = Background Color
-PatternToString.Child = Child Node Style
-PatternToString.color = Color
-PatternToString.EdgeColor = Edge Color
-PatternToString.EdgeStyle = Edge Style
-PatternToString.EdgeWidth = Edge Width
-PatternToString.FontBold = Bold
-PatternToString.FontItalic = Italics
-PatternToString.FontName = Font Name
-PatternToString.Icon = Icon
-PatternToString.NodeFontSize = Font Size
-
-plugins/latex/LatexNodeHook.editorTitle = Edit Latex
-plugins/ScriptEditor.cancel = &Dismiss Changes and Exit
-plugins/ScriptEditor.exit = &Save and Exit
-plugins/ScriptEditor.FORBIDDEN_ACTION = Freeplane groovy scripts are restricted. The following {0,choice,0#File|1#Network|2#Exec} operation is forbidden: {1,choice,0#Accept|1#Connect|2#Listen|3#Multicast|4#SetFactory|5#Exec|6#Link|7#Delete|8#Read|9#Write}. You can change this in the program settings.
-plugins/ScriptEditor.menu_actions = &Actions
-plugins/ScriptEditor.new_script = New Script
-plugins/ScriptEditor.run = &Run
-plugins/ScriptEditor.sign = Sign Script...
-plugins/ScriptEditor/window.Result = Result:
-plugins/ScriptEditor/window.title = Script Editor
-plugins/TimeList.xml_Created = Created
-plugins/TimeList.xml_Date = Date
-plugins/TimeList.xml_Icons = Icons
-plugins/TimeList.xml_Modified = Modified
-plugins/TimeList.xml_Notes = Notes
-plugins/TimeList.xml_Text = Text
-plugins/TimeManagement.xml_appendButton = Append Date To Selected Nodes
-plugins/TimeManagement.xml_Cancel = Cancel
-plugins/TimeManagement.xml_cancelButton = Cancel
-plugins/TimeManagement.xml_closeButton = Close
-plugins/TimeManagement.xml_Export = Export Selected Nodes
-plugins/TimeManagement.xml_Find = Find
-plugins/TimeManagement.xml_Goto = Goto
-plugins/TimeManagement.xml_hour = Hour:
-plugins/TimeManagement.xml_menu_actions = Actions
-plugins/TimeManagement.xml_minute = Minute:
-plugins/TimeManagement.xml_reminderButton = Remind Me At This Date
-plugins/TimeManagement.xml_reminderButton_tooltip = <html>When pressed a timer is scheduled to the date given. Then blinking icons calls your attention.<br> If you close the map, the timers are reactivated the next time, the map is opened.</html>
-plugins/TimeManagement.xml_reminderNode_onlyOneDate = <html>Currently, there may only be one reminder per node. <br>The current reminder is scheduled at {0,date} {0,time}, your choice was {1,date} {1,time}. <br><br>Do you want to change the node's reminder time (YES) <br>or do you want to keep the old one (NO)?</html>
-plugins/TimeManagement.xml_reminderNode_tooltip = Reminder scheduled at {0,date} {0,time}.
-plugins/TimeManagement.xml_removeReminderButton = Remove Reminder
-plugins/TimeManagement.xml_removeReminderButton_tooltip = Remove all reminders associated with the selected nodes.
-plugins/TimeManagement.xml_Replace = Replace
-plugins/TimeManagement.xml_Replace_All = Replace All
-plugins/TimeManagement.xml_Replace_Selected = Replace Selected
-plugins/TimeManagement.xml_Select = Select
-plugins/TimeManagement.xml_todayButton = Today
-plugins/TimeManagement.xml_WindowTitle = Time Management
-plugins/TimeManagement.xml_WindowTitle_All_Nodes = Search & Replace
-preferences = Preferences
-print_preview_title = Print Preview
-PrintAction.text = Print...
-PrintDirectAction.text = Print
-printing_settings = Print Scaling
-PrintPreviewAction.text = &Print Preview...
-PropertyAction.text = Preferences ...
-QuitAction.text = Quit
-read_only = Read Only
-ReadScriptError.text = Error reading the script\nCheck the log file for details.
-really_convert_to_current_version = <html>This map was created with an older version of Freeplane. <br>Should it be converted (recommended)? <br>(Otherwise it is taken as it is without guarantee.) </html>
-really_cut_node = Really cut node(s)?
-really_execute_script = Do you really want to execute the scripts included in this map? It is possible that they hurt your computer.
-really_remove_node = Really delete node(s)?
-really_remove_notes = Really remove the note(s)?
-ReapplyFilterAction.text = Reapply
-RedoAction.text = Redo
-RedoFilterAction.text = Redo
-ReminderHookAction.text = Remove Reminder
-ReminderHookAction.tooltip = Removes a reminder from a node.
-remove_shortcut_question = Replace keystroke?
-RemoveAllIconsAction.text = Remove All Icons
-RemoveConnectorAction.text = Remove Connector
-RemoveIcon_0_Action.text = Remove first icon
-RemoveIconAction.text = Remove Last Icon
-RemoveNoteAction.text = Remove Notes
-RemoveNoteAction.tooltip = <html>Removes note content of possibly several notes.</html>
-rename = &Rename
-repair_link = Repair Link
-repair_link_question = Couldn't load the linked map. Repair the link manually?
-replace = Replace
-ReportBugAction.text = Report a Bug
-RequestFeatureAction.text = Request a Feature
-reset_to_default = Use default
-ResetNodeLocationAction.text = Reset &Position
-RevertAction.text = &Revert
-RevisionPluginAction.text = Change &Revisions background color
-save_unsaved = Save the following mindmap? :
-SaveAcceleratorPresetsAction.text = Save hot key set
-SaveAction.text = &Save
-SaveAll.text = S&ave All
-SaveAll.tooltip = Saves all open maps.
-SaveAsAction.text = Save As...
-saved = Saved
-saving_canceled = Saving canceled
-scheme_evaluate = Evaluate!
-ScriptEditor.text = S&cript Editor...
-ScriptEditor.tooltip = Enables to write larger scripts within Freeplane.
-ScriptEditorPanel.changed_cancel = The scripts were changed. Do you really want to abandon those changes?
-select_favorites_folder = Select the folder, in which your favorites reside
-select_file_export_to = Select the file to export to
-select_folder_for_importing = Select the folder to import
-select_icon = Select an Icon
-SelectAllAction.text = Select All Visible
-SelectBranchAction.text = Select Visible Branch
-SelectedPasteAction.text = Paste as...
-selection_method_by_click = Single-click to Select
-selection_method_delayed = Delayed Automatic Selection
-selection_method_direct = Point to Select
-SelectNoteAction.text = Note Edit Switch
-SelectNoteAction.tooltip = Switch to resp. from note window
-set_accelerator_on_next_click_action = Click on any menu item to assign a new short cut
-SetAcceleratorOnNextClickAction.text = Assign short cut
-SetImageByFileChooserAction.text = Image (File Chooser or Link)...
-SetLinkByFileChooserAction.text = Hyperlink (File Chooser)...
-SetLinkByTextFieldAction.text = Hyperlink (Text Field)...
-SetNoteWindowPosition.bottom.text = Bottom
-SetNoteWindowPosition.left.text = Left
-SetNoteWindowPosition.right.text = Right
-SetNoteWindowPosition.top.text = Top
-sf_login_required = Source Forge Login required. Continue?
-ShowAllAttributesAction.text = Show All Attributes
-ShowAncestorsAction.text = Show Ancestors
-ShowAttributeDialogAction.text = &Attribute Manager...
-ShowDescendantsAction.text = Show Descendants
-ShowFilterToolbarAction.text = Filter Toolbar
-ShowHideNoteAction.text = Note Window
-ShowHideNoteAction.tooltip = =Lets the note window appear resp. disappear.
-ShowSelectedAttributesAction.text = Show Selected Attributes
-ShowSelectionAsRectangleAction.text = Rectangular Selection
-simplyhtml.aboutFrameTitle = About this application
-simplyhtml.aboutLabel = About SimplyHTML...
-simplyhtml.alignCenter = center
-simplyhtml.alignLabel = Alignment:
-simplyhtml.alignLeft = left
-simplyhtml.alignRight = right
-simplyhtml.allCellsRangeLabel = all cells
-simplyhtml.allOccurrencesReplaced = All occurrences replaced
-simplyhtml.appendTableColLabel = Append col
-simplyhtml.appendTableRowLabel = Append row
-simplyhtml.applyCellAttrLabel = Apply to
-simplyhtml.backgroundLabel = Background:
-simplyhtml.boldItalicName = bold italic
-simplyhtml.boldName = bold
-simplyhtml.borderColorLabel = Color:
-simplyhtml.borderWidthLabel = Width
-simplyhtml.bottomLabel = bottom:
-simplyhtml.cancelBtnName = Cancel
-simplyhtml.cellBorderTabLabel = Borders
-simplyhtml.cellGenTabLabel = General
-simplyhtml.cellMarginTabLabel = Margin
-simplyhtml.cellPanelTitle = Cell format
-simplyhtml.clearFormatLabel = Remove Formatting
-simplyhtml.clearFormatTip = Remove Formatting
-simplyhtml.close = Close
-simplyhtml.closeBtnName = Close
-simplyhtml.colorLabel = Color
-simplyhtml.copyLabel = Copy
-simplyhtml.copyTip = copy
-simplyhtml.cTagNameHead1 = Heading 1
-simplyhtml.cTagNameHead2 = Heading 2
-simplyhtml.cTagNameHead3 = Heading 3
-simplyhtml.cTagNameHead4 = Heading 4
-simplyhtml.cTagNameHead5 = Heading 5
-simplyhtml.cTagNameHead6 = Heading 6
-simplyhtml.cTagNameLink = Link
-simplyhtml.cTagNameOL = Ordered List
-simplyhtml.cTagNamePara = Paragraph
-simplyhtml.cTagNameUL = Unordered List
-simplyhtml.cutLabel = Cut
-simplyhtml.cutTip = cut
-simplyhtml.defaultDocName = Untitled
-simplyhtml.deleteTableColLabel = Delete column
-simplyhtml.deleteTableRowLabel = Delete row
-simplyhtml.docTitleQuery = Set title to:
-simplyhtml.docTitleTitle = Edit Document Title
-simplyhtml.editLabel = Edit
-simplyhtml.effectLabel = Effect
-simplyhtml.familyLabel = Family
-simplyhtml.findNext = Find next...
-simplyhtml.findReplaceDialogTitle = Find & Replace
-simplyhtml.findReplaceLabel = Find & Replace
-simplyhtml.findReplaceTip = find & replace
-simplyhtml.fontBoldLabel = Bold
-simplyhtml.fontBoldTip = switch bold on/off
-simplyhtml.fontColorLabel = Text Color
-simplyhtml.fontColorTip = Text Color
-simplyhtml.fontDialogTitle = Format Font
-simplyhtml.fontItalicLabel = Italic
-simplyhtml.fontItalicTip = switch italic on/off
-simplyhtml.fontLabel = Font...
-simplyhtml.fontTabLabel = Font
-simplyhtml.fontTip = Format font...
-simplyhtml.fontUnderlineLabel = Underline
-simplyhtml.fontUnderlineTip = switch underline on/off
-simplyhtml.foregroundLabel = Foreground:
-simplyhtml.formatLabel = Format
-simplyhtml.formatListLabel = List...
-simplyhtml.formatListTip = change list format
-simplyhtml.formatParaLabel = Paragraph...
-simplyhtml.formatParaTip = Change paragraph format
-simplyhtml.formatTableLabel = Table...
-simplyhtml.formatTableTip = Format table
-simplyhtml.helpLabel = Help
-simplyhtml.htmlTabTitle = HTML Code view
-simplyhtml.imageFileDesc = Image files
-simplyhtml.insertTableColLabel = Insert column
-simplyhtml.insertTableLabel = Table...
-simplyhtml.insertTableMsg = How many columns?
-simplyhtml.insertTableRowLabel = Insert row
-simplyhtml.insertTableTitle = insertTable
-simplyhtml.italicName = italic
-simplyhtml.layoutTabTitle = Layout view
-simplyhtml.leftLabel = left:
-simplyhtml.listDialogTitle = Format List
-simplyhtml.listIndentTitle = Indent:
-simplyhtml.listPosInside = inside
-simplyhtml.listPositionLabel = Position:
-simplyhtml.listPosOutside = outside
-simplyhtml.listTypeCircle = round bulled
-simplyhtml.listTypeDecimal = 1.,2.,3.,4.
-simplyhtml.listTypeDisc = file symbol as bullet
-simplyhtml.listTypeLabel = Type:
-simplyhtml.listTypeLowerAlpha = a.,b.,c.,d.
-simplyhtml.listTypeLowerRoman = i.,ii.,iii.,iv.
-simplyhtml.listTypeNone = none
-simplyhtml.listTypeSquare = square bullet
-simplyhtml.listTypeUpperAlpha = A.,B.,C.,D.
-simplyhtml.listTypeUpperRoman = I.,II.,III.,IV.
-simplyhtml.marginLabel = Outer
-simplyhtml.matchCase = Match case
-simplyhtml.newStyleDefaultName = new style
-simplyhtml.nextTableCellLabel = Next cell
-simplyhtml.noLineLabel = none
-simplyhtml.noMoreOccurrencesFound = no (more) occurrences found
-simplyhtml.okBtnName = OK
-simplyhtml.paddingLabel = Inner
-simplyhtml.paraAlignCenterLabel = Align center
-simplyhtml.paraAlignCenterTip = Set paragraph center alignment
-simplyhtml.paraAlignLeftLabel = Align left
-simplyhtml.paraAlignLeftTip = Set paragraph left alignment
-simplyhtml.paraAlignRightLabel = Align right
-simplyhtml.paraAlignRightTip = Set paragraph right alignment
-simplyhtml.paraStyleDialogTitle = Paragraph Style
-simplyhtml.paraTabLabel = Paragraph
-simplyhtml.pasteLabel = Paste
-simplyhtml.pasteTip = paste
-simplyhtml.plainName = plain
-simplyhtml.previewLabel = Preview
-simplyhtml.previewText = Preview text
-simplyhtml.prevTableCellLabel = Previous cell
-simplyhtml.redoLabel = Redo
-simplyhtml.redoTip = redo
-simplyhtml.replace = Replace...
-simplyhtml.replaceAll = All
-simplyhtml.replaceDone = Done
-simplyhtml.replaceNo = No
-simplyhtml.replaceThisQuery = replace this occurrence of
-simplyhtml.replaceWith = Replace with:
-simplyhtml.replaceYes = Yes
-simplyhtml.rightLabel = right:
-simplyhtml.searchDown = Search down
-simplyhtml.searchFromStart = Search from start
-simplyhtml.searchUp = Search up
-simplyhtml.selectAllLabel = Select all
-simplyhtml.sizeLabel = Size
-simplyhtml.standardStyleName = standard
-simplyhtml.strikeLabel = Strikethrough
-simplyhtml.styleLabel = Style
-simplyhtml.styleNameInputText = Name of new style?
-simplyhtml.styleNameInputTitle = Save style
-simplyhtml.tableBgColLabel = Background color:
-simplyhtml.tableDialogTitle = Format Table
-simplyhtml.tableLabel = Table
-simplyhtml.tablePanelTitle = Table format
-simplyhtml.tableWidthLabel = Width:
-simplyhtml.textIndentLabel = Indent:
-simplyhtml.textToFind = Text to find:
-simplyhtml.thisCellRangeLabel = this cell
-simplyhtml.thisColRangeLabel = this column
-simplyhtml.thisRowRangeLabel = this row
-simplyhtml.toggleBulletsLabel = Bulleted list on/off
-simplyhtml.toggleBulletsTip = bulleted list on/off
-simplyhtml.toggleNumbersLabel = Numbered list on/off
-simplyhtml.toggleNumbersTip = numbered list on/off
-simplyhtml.topLabel = top:
-simplyhtml.uLineLabel = Underline
-simplyhtml.unableToOpenFileError = File can not be opened
-simplyhtml.unableToRedoError = Unable to redo:
-simplyhtml.unableToUndoError = Unable to undo:
-simplyhtml.undoLabel = Undo
-simplyhtml.undoTip = undo
-simplyhtml.valignBaseline = baseline
-simplyhtml.valignBottom = bottom
-simplyhtml.valignLabel = Vert. Alignment:
-simplyhtml.valignMiddle = middle
-simplyhtml.valignTop = top
-simplyhtml.wholeWordsOnly = Whole words only
-SortNodes.text = &Sort Children
-SortNodes.tooltip = Sorts all children of a node alphabetically.
-split = &Split
-SplitNode.text = &Split Node
-SplitNode.tooltip = <html>Node is splitted</html>
-StringFlavorHandler = Plain text as node hierarchy
-StructuredHtmlFlavorHandler = HTML as node hierarchy
-style = Style
-svg = SVG
-TimeListAction.text = Show Time Scheduler &List ...
-TimeListAction.tooltip = Shows all scheduled times and the corresponding nodes.
-TimeManagementAction.text = Show Calendar...
-TimeManagementAction.tooltip = <html>Shows the calendar module by Kai Toedter.</html>
-ToggleChildrenFoldedAction.text = (Un)fold Children
-ToggleFBarAction.text = F-Bar
-ToggleFoldedAction.text = Toggle Folded
-ToggleFullScreenAction.text = Full screen mode
-ToggleLeftToolbarAction.text = &Secondary Toolbar
-ToggleMenubarAction.text = Menubar
-ToggleToolbarAction.text = &Toolbar
-undefined_error = An unexpected error occured. Please try to make a bug report.
-underline = Underline
-underlined = Underlined
-UndoAction.text = Undo
-UndoFilterAction.text = Undo
-unfold = Unfold
-UnfoldAllAction.text = Unfold All
-UnfoldAllAction.tooltip = <html>Unfolds the selected nodes and all their children.</html>
-
-UnfoldOneLevelAction.text = Unfold One Level
-UnfoldOneLevelAction.tooltip = <html>Unfolds the selected nodes by one level.</html>
-UpdateCheckAction.text = Check for Updates
-updatecheckdialog = Update Check Dialog
-url_error = This URL is malformed!
-url_load_error = Could not load map at URL:
-used_in_menu = This shortcut can not be set, it is used as a menu shortcut.
-UsePlainTextAction.text = Use Plain Text
-user_config_folder = User configuration folder: {0}
-user_defined_scale = User defined scale
-user_defined_zoom = User defined.
-user_defined_zoom_status_bar = Changing the zoom to the user defined zoom value of {0}%.
-user_zoom = Print Zoom Factor (0.0 - 2.0):
-
-version_up_to_date = You already use the latest program version
-ViewerControllerAction.text = External object...
-ViewLayoutTypeAction.OUTLINE.text = Outline view
-WebDocuAction.text = Web Documentation
-width = Width
-wrong_regexp = Wrong regular expression "{0}", error {1}
-
-xslt_export_not_possible = Freeplane XSLT export not possible
-yes = Yes
-ZoomInAction.text = Zoom In
-ZoomOutAction.text = Zoom Out
diff --git a/freeplane_ant/test/unsorted/Test_ru.properties b/freeplane_ant/test/unsorted/Test_ru.properties
deleted file mode 100644
index e74be51..0000000
--- a/freeplane_ant/test/unsorted/Test_ru.properties
+++ /dev/null
@@ -1,1284 +0,0 @@
-#!
-#! created/edited by Popeye version 0.54 (popeye.sourceforge.net)
-#! encoding:ISO-8859-1
-about_text = Freeplane - \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043a\u0430\u0440\u0442 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0437 \u0437\u043d\u0430\u043d\u0438\u0439\nCopyright \u00a9 2000-2008 Joerg Mueller, Daniel [...]
-AboutAction.text= \u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435...
-accessories/plugins/ApplyFormatPlugin.dialog.title=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u043e\u0432
-accessories/plugins/AutomaticLayout.properties_StyleDialogTitle=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c
-accessories/plugins/EncryptNode.properties_0 = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-accessories/plugins/EncryptNode.properties_1 = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c
-accessories/plugins/EncryptNode.properties_2 = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c:
-accessories/plugins/EncryptNode.properties_3 = \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c:
-accessories/plugins/EncryptNode.properties_4 = \u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c.
-accessories/plugins/EncryptNode.properties_5 = <html>\u0423\u0447\u0442\u0438\u0442\u0435 \u0447\u0442\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f<br> \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u043f\u0430\u0440\u043e\u043b\u044f
-accessories/plugins/EncryptNode.properties_6 = OK
-accessories/plugins/EncryptNode.properties_7 = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-accessories/plugins/EncryptNode.properties_insert_encrypted_node_first = <html>\u042d\u0442\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0443\u0437\u043b\u0443<b [...]
-accessories/plugins/EncryptNode.properties_select_me = \u0412\u044b\u0431\u0435\u0440\u0438 \u043c\u0435\u043d\u044f.
-accessories/plugins/EncryptNode.properties_wrong_password = \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c
-
-accessories/plugins/ExportWithTWiki.text=\u041a\u0430\u043a TWiki...
-accessories/plugins/ExportWithTWiki.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u043a\u0430\u043a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 TWiki.
-
-accessories/plugins/ExportWithXSLT.tooltip= \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 XSLT - \u0441\u043a\u0440\u0438\u043f\u0442
-
-
-accessories/plugins/ExportWithXSLT_Applet.text=\u041a\u0430\u043a java-\u0430\u043f\u043f\u043b\u0435\u0442...
-accessories/plugins/ExportWithXSLT_Applet.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a java-\u0430\u043f\u043f\u043b\u0435\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.
-accessories/plugins/ExportWithXSLT_Flash.text=\u041a\u0430\u043a Flash...
-accessories/plugins/ExportWithXSLT_Flash.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a flash \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443.
-accessories/plugins/ExportWithXSLT_HTML.text= \u041a\u0430\u043a XHTML (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c JavaScript)...
-
-accessories/plugins/ExportWithXSLT_HTML3.text= \u041a\u0430\u043a XHTML (\u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439)...
-
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.text=\u0420\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u0437 \u0443\u0437\u043b\u0430 RESOURCES \u0432 \u0444\u0430\u0439\u043b \u0434\u043b\u044f Taskjuggler...
-accessories/plugins/ExportWithXSLT_RESOURCESTJI.tooltip=<html>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0438\u0437 \u0443\u0437\u043b\u0430 RESOURCES \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f Taskjuggler. </html>
-accessories/plugins/ExportWithXSLT_TASKSTJI.text=\u0417\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u0443\u0437\u043b\u0430 TASKS \u0432 \u0444\u0430\u0439\u043b \u0434\u043b\u044f Taskjuggler...
-accessories/plugins/ExportWithXSLT_TASKSTJI.tooltip=<html>\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438\u0437 \u0443\u0437\u043b\u0430 TASKS \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044f Taskjuggler. </html>
-accessories/plugins/ManagePatterns.dialog.title=\u041c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0442\u0438\u043b\u0435\u0439
-accessories/plugins/ManagePatterns.not_found=\u0424\u0430\u0439\u043b \u0441\u043e \u0441\u0442\u0438\u043b\u044f\u043c\u0438 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d.
-accessories/plugins/SaveAll.properties_save_all_cancelled=\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430.
-add=&\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c
-AddConnectorAction.text=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c
-AddElementaryConditionAction.text=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c
-
-AddLocalLinkAction.text=\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b
-antialias_all = \u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0451
-antialias_edges = \u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0451\u0431\u0440\u0430
-antialias_none = \u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c
-apply=&\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c
-ApplyFormatPlugin.text=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 ...
-ApplyFormatPlugin.tooltip=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432 \u0438 \u043b\u0438\u043d\u0438\u0439
-ApplyNoFilteringAction.text=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440
-ApplySelectedViewConditionAction.text=\u0424\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
-ApplyToVisibleAction.text=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c
-as_parent = \u041a\u0430\u043a \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f
-AssignAttributesAction.text=&\u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b...
-attribute_delete_value=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435
-attribute_delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f
-attribute_font_size_tooltip=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0434\u043b\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432
-attribute_list_box_label_text=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f
-attribute_replace=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430
-attribute_top=\u0412\u0441\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0441\u043e \u0432\u0441\u0435\u0445 \u043a\u0430\u0440\u0442
-attributes_adding_empty_attribute_error=\u041f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043c\u0435\u043d\u0435\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
-attributes_all=\u0412\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
-attributes_attribute=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b
-attributes_close=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
-attributes_deselect_all=\u041d\u0438\u0447\u0435\u0433\u043e
-attributes_dialog_title=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438
-attributes_edit_tooltip=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e
-attributes_edit=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-attributes_for_selected=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
-attributes_for_visible=\u0412\u0441\u0435 \u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0443\u0437\u043b\u044b
-attributes_import_tooltip=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u0440\u0442
-attributes_import=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-attributes_no_import_candidates_found=\u041d\u043e\u0432\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e
-attributes_popup_delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
-attributes_popup_down=\u0412\u043d\u0438\u0437
-attributes_popup_edit=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-attributes_popup_hide=\u0421\u043f\u0440\u044f\u0442\u0430\u0442\u044c
-attributes_popup_new=\u041d\u043e\u0432\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442
-attributes_popup_optimal_width=\u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430
-attributes_popup_up=\u0412\u0432\u0435\u0440\u0445
-attributes_refresh=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c
-attributes_restricted_attributes_tooltip=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432
-attributes_restricted_values_tooltip=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430
-attributes_restriction=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c
-attributes_select_all_tooltip=\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c / \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435
-attributes_select_all=\u0412\u0441\u0435
-attributes_show=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c
-attributes_skip_root=\u041a\u0440\u043e\u043c\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-attributes_visible_tooltip=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435
-attributes_visible=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435
-automatically_save_message=\u041a\u0430\u0440\u0442\u0430 \u0431\u044b\u043b\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 (\u0432 \u0444\u0430\u0439\u043b {0}) ...
-AutomaticLayoutAction.text= &\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
-AutomaticLayoutAction.tooltip= <html>\u0424\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u0442 \u0432\u0438\u0434 \u043a\u0430\u0440\u0442\u044b <br>\u0423\u0437\u043b\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0441\u0442\u0430\u043d\u0443\u0442 \u0447\u0435\u0440\u043d\u044b\u043c\u0438, \u0432\u0442\u043e\u0440\u043e\u0433\u043e - \u0441\u0438\u043d\u0438\u043c\u0438 \u0438 \u0442.\u0434.</html>
-BackAction.text=\u041d\u0430\u0437\u0430\u0434
-BackAction.tooltip=\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443 \u0443\u0437\u043b\u0443 \u0432 \u0446\u0435\u043f\u0438
-background = \u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430
-BlinkingNodeHookAction.text= \u041c\u0438\u0433\u0430\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b
-BlinkingNodeHookAction.tooltip= <html>\u0423\u0437\u0435\u043b \u0431\u0443\u0434\u0435\u0442 \u043c\u0438\u0433\u0430\u0442\u044c. \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u042d\u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0447\u0438\u0441\u043b\u0443 \u0443\ [...]
-BoldAction.text= \u0416\u0438\u0440\u043d\u044b\u0439
-boldify_branch = \u0412\u0441\u044e \u0432\u0435\u0442\u0432\u044c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0436\u0438\u0440\u043d\u044b\u043c
-branch = \u0412\u0435\u0442\u0432\u044c
-cancel = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-cannot_add_parent_diff_parents = \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f
-cannot_add_parent_to_root = \u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c
-cannot_delete_root = \u041a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043b\u0438 \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c
-cannot_join_nodes_with_children = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u0441 \u0438\u0445 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438
-cannot_move_to_child = \u0423\u0437\u0435\u043b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d \u0432 \u0441\u0432\u043e\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0439 \u0443\u0437\u0435\u043b
-CenterAction.text= \u0426\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-CenterSelectedNodeAction.text=\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
-change_link_arrows=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u0438
-ChangeConnectorArrowsAction.text=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043d\u0430 \u0441\u0432\u044f\u0437\u0438
-
-ChangeNodeLevelLeftsAction.text=\u0423\u0437\u0435\u043b \u0432\u043b\u0435\u0432\u043e
-ChangeNodeLevelLeftsAction.tooltip=\u0421 \u043b\u0435\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0443\u0437\u043b\u044b \u0441\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0438\u0437 \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u0432\u044b\u0448\u0435\u043b\u0435\u0436\u0430\ [...]
-ChangeNodeLevelRightsAction.text=\u0423\u0437\u0435\u043b \u0432\u043f\u0440\u0430\u0432\u043e
-ChangeNodeLevelRightsAction.tooltip=\u0421 \u043f\u0440\u0430\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0442 \u043a\u043e\u0440\u043d\u044f \u0443\u0437\u043b\u044b \u0441\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0438\u0437 \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438 \u0432\u044b\u0448\u0435\u043b\u0435\u0436 [...]
-choose_background_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442
-choose_cloud_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u0430
-choose_edge_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
-choose_map_background_color=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0446\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u044b
-choose_node_background_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u0443\u0437\u043b\u0430
-choose_node_color = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430 \u0443\u0437\u043b\u0430
-CloseAction.text= \u0417\u0430\u043a\u0440\u044b\u0442\u044c
-CloudAction.text= \u041e\u0431\u043b\u0430\u043a\u043e
-CloudColorAction.text= \u0426\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u0430 ...
-ConnectorColorAction.text=\u0426\u0432\u0435\u0442 \u0441\u0432\u044f\u0437\u0438...
-
-ColorProperty.ResetColor=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0446\u0432\u0435\u0442
-combined = \u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439
-confirmation=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435
-CopyAction.text= \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-CopySingleAction.text= \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b
-CreateConjunctConditionAction.text=\u0438
-CreateDisjunctConditionAction.text=\u0438\u043b\u0438
-CreateNotSatisfiedConditionAction.text=\u043d\u0435
-CreationModificationPluginAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c &\u0432\u0440\u0435\u043c\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f
-CreationModificationPluginAction.tooltip=<html>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432</html>
-CutAction.text= \u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c
-decrease_branch_font_size = \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438
-DecreaseNodeFontAction.text= \u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438
-delete_child = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b
-delete=&\u0423\u0434\u0430\u043b\u0438\u0442\u044c
-DeleteAction.text= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b
-DeleteConditionAction.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
-DocumentationAction.text= \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f
-edge = \u0420\u0435\u0431\u0440\u043e
-edge_style = \u0422\u0438\u043f \u043b\u0438\u043d\u0438\u0438 \u0440\u0435\u0431\u0440\u0430
-edge_width = \u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430
-EdgeColorAction.text= \u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430...
-EdgeStyleAction.bezier.text= \u041a\u0440\u0438\u0432\u0430\u044f
-EdgeStyleAction.hide_edge.text=\u0421\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0440\u0435\u0431\u0440\u043e
-EdgeStyleAction.horizontal.text=\u041b\u043e\u043c\u0430\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f
-EdgeStyleAction.linear.text= \u041f\u0440\u044f\u043c\u0430\u044f
-EdgeStyleAction.sharp_bezier.text= \u0417\u0430\u043e\u0441\u0442\u0440\u0451\u043d\u043d\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f
-EdgeStyleAction.sharp_linear.text= \u0417\u0430\u043e\u0441\u0442\u0440\u0451\u043d\u043d\u0430\u044f \u043f\u0440\u044f\u043c\u0430\u044f
-EdgeStyleAsParentAction.text=\u041a\u0430\u043a \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f
-EdgeWidthAction_width_parent.text= \u041a\u0430\u043a \u0443 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-EdgeWidthAction_width_thin.text= \u0422\u043e\u043d\u043a\u043e\u0435 \u0440\u0435\u0431\u0440\u043e
-edit = &\u041f\u0440\u0430\u0432\u043a\u0430
-edit.decision=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 HTML
-edit.edit_rich_text=\u0425\u043e\u0442\u0438\u0442\u0435 \u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u044b\u0439 \u0438\u043b\u0438 \u043d\u0430\u043a\u043b\u043e\u043d\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442\u044b?
-edit_link_manually = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0432\u0440\u0443\u0447\u043d\u0443\u044e...
-edit_long_node=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0443\u0437\u043b\u0430
-EditAction.text= \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-EditAttributesAction.text=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
-EditFilterAction.text=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-EditLongAction.text= \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435...
-EncryptedMap.text= \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0443...
-EncryptedMap.tooltip= \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d
-enter_base_url = \u0411\u0443\u0434\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0441\u0441\u044b\u043b\u043a\u0430. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 URL...
-enter_confirms = \u041a\u043b\u0430\u0432\u0438\u0448\u0430 Enter \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.
-EnterPassword.text= &\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e / \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e
-
-error =\u041e\u0448\u0438\u0431\u043a\u0430
-error_applying_template=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 XSLT \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.
-error_creating_directory = \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0430\u043f\u043a\u0438
-export_pdf_text = \u0444\u043e\u0440\u043c\u0430\u0442 PDF
-export_svg_text = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u0430\u044f \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0413\u0440\u0430\u0444\u0438\u043a\u0430 (SVG)
-export_using_xslt=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0441 XSLT
-ExportBranchAction.text= \u0412\u0435\u0442\u0432\u044c \u043a\u0430\u043a \u043d\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443 ...
-ExportBranchToHTMLAction.text= \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0442\u0432\u044c \u0432 HTML
-ExportPdf.text= \u041a\u0430\u043a PDF...
-ExportPdf.tooltip = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a PDF
-ExportSvg.text= \u041a\u0430\u043a SVG...
-ExportSvg.tooltip = \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a SVG
-ExportToHTMLAction.text= \u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 HTML
-ExportToImage.jpg.text= \u041a\u0430\u043a JPEG...
-ExportToImage.png.text= \u041a\u0430\u043a PNG...
-ExportToImage.jpg.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0432 JPEG-\u0444\u043e\u0440\u043c\u0430\u0442
-ExportToImage.png.tooltip=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0432 PNG-\u0444\u043e\u0440\u043c\u0430\u0442
-ExportToOoWriter.text= \u041a\u0430\u043a Open Office Writer Document...
-ExportToOoWriter.tooltip=\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u0443\u0437\u043b\u044b \u0437\u0430\u0434\u0430\u044e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0435 \u0443\u0437\u043b\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430.
-extension_menu = &\u0421\u0442\u0438\u043b\u044c
-extract_link_from_text.tooltip=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u0432 \u0433\u0438\u043f\u0435\u0440\u0441\u0441\u044b\u043b\u043a\u0443
-ExtractLinkFromTextAction.text=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u0438\u043f\u0435\u0440\u0441\u0441\u044b\u043b\u043a\u0443 \u0432 \u0442\u0435\u043a\u0441\u0442
-FaqOpenURLAction.text= \u0427\u0430\u0441\u0442\u043e \u0417\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0412\u043e\u043f\u0440\u043e\u0441\u044b
-file = &\u0424\u0430\u0439\u043b
-file_already_exists = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 {0} \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c?
-file_not_found = \u041e\u0448\u0438\u0431\u043a\u0430: \u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.
-filter_add=&\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c
-filter_and=\u0418
-filter_conditions = \u0424\u0438\u043b\u044c\u0442\u0440\u044b
-filter_contains=\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442
-filter_created_after=\u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u043b\u0435
-filter_created_before=\u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e
-filter_delete=&\u0423\u0434\u0430\u043b\u0438\u0442\u044c
-filter_dialog=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0424\u0438\u043b\u044c\u0442\u0440
-filter_does_not_exist=\u041d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442
-filter_edit_description=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b
-filter_enter_value=\u0412\u0432\u0435\u0441\u0442\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435
-filter_exist=\u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442
-filter_icon=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430
-filter_ignore_case=\u0411\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430
-filter_is_equal_to=\u0420\u0430\u0432\u0435\u043d
-filter_is_not_equal_to=\u041d\u0435\u0440\u0430\u0432\u0435\u043d
-filter_link=\u0413\u0438\u043f\u0435\u0440\u0441\u0441\u044b\u043b\u043a\u0430
-filter_modified_after=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u043f\u043e\u0441\u043b\u0435
-filter_modified_before=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u043e \u0434\u043e
-filter_no_filtering=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440
-filter_node=\u0422\u0435\u043a\u0441\u0442 \u0443\u0437\u043b\u0430
-filter_not=\u041a\u0440\u043e\u043c\u0435
-filter_or=\u0418\u043b\u0438
-filter_select=\u0412\u044b\u0431\u0440\u0430\u0442\u044c
-filter_selected_node_view_snapshot=\u0421\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440
-filter_selected_node_view=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
-filter_time=\u0424\u0438\u043b\u044c\u0442\u0440 \u0434\u0430\u0442\u044b
-filter=\u0424\u0438\u043b\u044c\u0442\u0440
-find_what = \u0418\u0441\u043a\u043e\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442
-FindAction.text= \u0418\u0441\u043a\u0430\u0442\u044c...
-FindNextAction.text= \u0418\u0441\u043a\u0430\u0442\u044c \u0434\u0430\u043b\u0435\u0435
-fit_map_to_page = \u0423\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435
-FitToPage.text= \u0423\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u044e \u043a\u0430\u0440\u0442\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d
-FitToPage.tooltip= \u041f\u043e\u0434\u0431\u0438\u0440\u0430\u0435\u0442 \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u044e \u043a\u0430\u0440\u0442\u0443 \u0432 \u043e\u043a\u043d\u0435
-fold = \u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c
-FoldAllAction.text= \u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0451
-FoldAllAction.tooltip= <html>\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0437\u043b\u044b</html>
-FoldOneLevelAction.text= \u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c
-FoldOneLevelAction.tooltip= <html>\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u043d\u0430 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c</html>
-follow_graphical_link=\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a:
-FollowLinkAction.text= \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435
-font = \u0428\u0440\u0438\u0444\u0442
-FontFamilyAction.text= \u0428\u0440\u0438\u0444\u0442
-FontSizeAction.text= \u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
-format_menu_edge_styles=&\u0422\u0438\u043f \u0440\u0435\u0431\u0440\u0430
-format_menu_edge_widths=\u0422&\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430
-FormatCopy.text= \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442
-FormatCopy.tooltip= <html>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430</html>
-FormatPaste.text= \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442
-FormatPaste.tooltip= <html>\u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a \u0443\u0437\u043b\u0443 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442</html>
-ForwardAction.text=\u0412\u043f\u0435\u0440\u0451\u0434
-ForwardAction.tooltip=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u0443\u0437\u043b\u0443
-Freeplane.progress.buildScreen=\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d...
-Freeplane.progress.createController=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430...
-Freeplane.progress.createInitialMode=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430
-Freeplane.progress.endStartup=\u0417\u0430\u043f\u0443\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d.
-Freeplane.progress.gettingPreferenceDirectories=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0430\u043f\u043e\u043a \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439...
-Freeplane.progress.gettingPreferences=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438...
-Freeplane.progress.loadMaps=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u0430\u0440\u0442\u044b...
-Freeplane.progress.propagateLookAndFeel=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430...
-Freeplane.progress.settingPreferences=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438...
-Freeplane.progress.startCreateController=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430...
-Freeplane.progress.updateLookAndFeel=\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0432\u0438\u0434\u0430...
-freeplane_reverted=\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 Freeplane
-FreeplaneHelpStarter.text= \u041f\u043e\u043c\u043e\u0449\u044c ...
-FreeplaneHelpStarter.tooltip= \u041f\u043e\u043c\u043e\u0449\u044c...
-GotoLinkNodeAction.text= \u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0432\u044f\u0437\u0438
-GrabKeyDialog.common.cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-GrabKeyDialog.common.ok=OK
-GrabKeyDialog.grab-key.assigned-to.none=\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442
-GrabKeyDialog.grab-key.assigned-to=\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e
-GrabKeyDialog.grab-key.caption=\u041a\u043b\u0430\u0432\u0438\u0448\u0430
-GrabKeyDialog.grab-key.clear=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
-GrabKeyDialog.grab-key.remove-ask=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438?
-GrabKeyDialog.grab-key.remove=\u0423\u0434\u0430\u043b\u0438\u0442\u044c
-GrabKeyDialog.grab-key.title=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0443
-help = \u041f\u043e&\u043c\u043e\u0449\u044c
-HideableAction.tooltip= <html>\u041e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0444\u043e\u043d \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430.</html>
-HideAllAttributesAction.text= \u0421\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
-HierarchicalIconsAction.text=\u0414\u043e\u0447\u0435\u0440\u043d\u0438\u0435 &\u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
-HierarchicalIconsAction.tooltip=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
-html_export_based_on_headings = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML - \u041d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432
-html_export_fold_all = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML - \u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435
-html_export_fold_currently_folded = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML - \u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441
-html_export_no_folding = \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML - \u0411\u0435\u0437 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f
-icon_0%=0%
-icon_25%=25%
-icon_50%=50%
-icon_75%=75%
-icon_100%=100%
-icon_attach = \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435
-icon_back = \u041d\u0430\u0437\u0430\u0434
-icon_bell = \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c
-icon_bookmark = \u041e\u0442\u043b\u0438\u0447\u043d\u043e
-icon_broken-line = \u0421\u043b\u043e\u043c\u0430\u043d\u044b\u0439
-icon_button_cancel = \u041d\u0435 OK
-icon_button_ok = OK
-icon_calendar = \u0414\u0430\u0442\u0430
-icon_clanbomber = \u041e\u043f\u0430\u0441\u043d\u043e
-icon_clock =\u0412\u0440\u0435\u043c\u044f
-icon_closed = \u0412\u0445\u043e\u0434\u0430 \u043d\u0435\u0442
-icon_decrypted =\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439
-icon_desktop_new = \u041d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c
-icon_down = \u0412\u043d\u0438\u0437
-icon_edit =\u0423\u0442\u043e\u0447\u043d\u0438\u0442\u044c
-icon_encrypted = \u0417\u0430\u043a\u0440\u044b\u0442\u044b\u0439
-icon_family=\u0421\u0435\u043c\u044c\u044f
-icon_fema=\u0416\u0435\u043d\u0449\u0438\u043d\u044b
-icon_female1=\u0416\u0435\u043d\u0449\u0438\u043d\u04301
-icon_female2=\u0416\u0435\u043d\u0449\u0438\u043d\u04302
-icon_females=\u0416\u0435\u043d\u0449\u0438\u043d\u044b
-icon_flag-black = \u0427\u0435\u0440\u043d\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
-icon_flag-blue = \u0421\u0438\u043d\u0438\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
-icon_flag-green = \u0417\u0435\u043b\u0435\u043d\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
-icon_flag-orange = \u041e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
-icon_flag-pink = \u0420\u043e\u0437\u043e\u0432\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
-icon_flag-yellow = \u0416\u0435\u043b\u0442\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
-icon_flag = \u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u0444\u043b\u0430\u0436\u043e\u043a
-icon_folder = \u041f\u0430\u043f\u043a\u0430
-icon_forward =\u0412\u043f\u0435\u0440\u0451\u0434
-icon_freemind_butterfly = FreeMind
-icon_full-0=\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 0
-icon_full-1 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 1
-icon_full-2 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 2
-icon_full-3 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 3
-icon_full-4 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 4
-icon_full-5 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 5
-icon_full-6 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 6
-icon_full-7 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 7
-icon_full-8 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 8
-icon_full-9 = \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 9
-icon_go=\u0417\u0435\u043b\u0435\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430
-icon_gohome = \u0414\u043e\u043c
-icon_group=\u0413\u0440\u0443\u043f\u043f\u0430
-icon_help = \u0412\u043e\u043f\u0440\u043e\u0441
-icon_hourglass = \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435
-icon_idea = \u0418\u0434\u0435\u044f
-icon_info=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f
-icon_kaddressbook = \u0422\u0435\u043b\u0435\u0444\u043e\u043d
-icon_kmail = E-Mail
-icon_knotify = \u041c\u0443\u0437\u044b\u043a\u0430
-icon_korn = \u041f\u043e\u0447\u0442\u043e\u0432\u044b\u0439 \u044f\u0449\u0438\u043a
-icon_ksmiletris = \u042f \u0434\u043e\u0432\u043e\u043b\u0435\u043d
-icon_launch=\u0417\u0430\u043f\u0443\u0441\u043a
-icon_licq = \u041c\u0438\u043b\u043e
-icon_list=\u0421\u043f\u0438\u0441\u043e\u043a
-icon_Mail = \u041f\u0438\u0441\u044c\u043c\u043e
-icon_male1=\u041c\u0443\u0436\u0447\u0438\u043d\u04301
-icon_male2=\u041c\u0443\u0436\u0447\u0438\u043d\u04302
-icon_males=\u041c\u0443\u0436\u0447\u0438\u043d\u044b
-icon_menu = &\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
-icon_messagebox_warning = \u0412\u0430\u0436\u043d\u043e
-icon_password = \u041a\u043b\u044e\u0447
-icon_pencil = \u0423\u0442\u043e\u0447\u043d\u0438\u0442\u044c
-icon_penguin =\u041b\u0438\u043d\u0443\u043a\u0441
-icon_prepare=\u0416\u0435\u043b\u0442\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430
-icon_smiley-angry = \u0421\u0435\u0440\u0434\u0438\u0442\u044b\u0439
-icon_smiley-neutral = \u041d\u0435 \u0432\u0430\u0436\u043d\u043e
-icon_smiley-oh = \u0423\u0434\u0438\u0432\u043b\u0435\u043d\u043d\u044b\u0439
-icon_smily_bad = \u041c\u043d\u0435 \u043d\u0435 \u0434\u043e \u0432\u0435\u0441\u0435\u043b\u044c\u044f
-icon_stop-sign = \u0421\u0442\u043e\u043f
-icon_stop = \u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0441\u0432\u0435\u0442\u043e\u0444\u043e\u0440\u0430
-icon_up = \u0412\u0432\u0435\u0440\u0445
-icon_wizard = \u041c\u0430\u0433\u0438\u044f
-icon_xmag = \u041e\u0431\u0441\u0443\u0434\u0438\u0442\u044c
-icon_yes = \u0412\u0430\u0436\u043d\u043e
-icon_user_icon =\u0418\u043a\u043e\u043d\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
-IconSelectionPlugin.text= \u0412\u044b\u0431\u043e\u0440 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b...
-IconSelectionPlugin.tooltip= <html>\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b</html>
-import = \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-import_linked_branch_no_link = \u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0443, \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u0443\u044e \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430
-ImportBranchAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0442\u0432\u044c \u0438\u0437 (mm-) \u0444\u0430\u0439\u043b\u0430...
-ImportExplorerFavoritesAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0438 \u0438\u0437 IE...
-ImportFolderStructureAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432...
-ImportLinkedBranchAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0435\u0442\u0432\u044c \u0438\u0437 \u0441\u0441\u044b\u043b\u043a\u0438
-ImportLinkedBranchWithoutRootAction.text= \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u0441\u0441\u044b\u043b\u043a\u0438 \u0431\u0435\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-ImportMindmanagerFiles.text=\u041a\u0430\u0440\u0442\u0430 \u0434\u043b\u044f MindManager X5 ...
-increase_branch_font_size = \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438
-IncreaseNodeFontAction.text= \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438
-ItalicAction.text= \u041a\u0443\u0440\u0441\u0438\u0432
-italicise_branch = \u0428\u0440\u0438\u0444\u0442 \u0432\u0441\u0435\u0439 \u0432\u0435\u0442\u0432\u0438 \u043a\u0443\u0440\u0441\u0438\u0432
-JoinNodesAction.text= \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0443\u0437\u043b\u044b
-
-LatexNodeHookAction.text= \u0424\u043e\u0440\u043c\u0443\u043b\u0443 &Latex
-LatexNodeHookAction.tooltip= <html>\u0424\u043e\u0440\u043c\u0443\u043b\u0430 Latex</html>
-less_than_two_selected_nodes = \u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0430 \u0443\u0437\u043b\u0430
-license_text = Freeplane - \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043a\u0430\u0440\u0442\nCopyright (C) 2000-2008 Joerg Mueller <joergmueller at bigfoot.com>\n\u0427\u0438\u0442\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b COPYING \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u [...]
-LicenseAction.text= \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f
-link_not_available_any_more = \u0421\u0432\u044f\u0437\u044c \u043d\u0435\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430, \u0443\u0437\u0435\u043b \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0435\u043d
-load = &\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
-
-long_node_changed_cancel =\u0412\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0443\u0437\u0435\u043b. \u0425\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439?
-long_node_changed_submit =\u0412\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0443\u0437\u0435\u043b. \u0425\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f?
-lots_of_links_warning = \u0412\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u0432\u044f\u0437\u0435\u0439 \u0441\u0440\u0430\u0437\u0443. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0445\u043e\u0442\u0438\u0442\u0435?
-map_already_exists = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e?
-map_corrupted = \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d. \u0421\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438?
-map_not_saved=\u042d\u0442\u0430 \u043a\u0430\u0440\u0442\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0440\u0430\u043d\u0435\u0435
-MapBackgroundColorAction.text=\u0424\u043e\u043d \u043a\u0430\u0440\u0442\u044b
-menu_attributes = \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b
-menu_extras = &\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e
-ExportAction.text = &\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-menu_file_import = &\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-menu_filter=\u0424&\u0438\u043b\u044c\u0442\u0440
-menu_format = \u0424&\u043e\u0440\u043c\u0430\u0442
-menu_insert = \u0412\u0441\u0442&\u0430\u0432\u043a\u0430
-menu_navigate = &\u0423\u0437\u0435\u043b
-menu_view = &\u0412\u0438\u0434
-mindmap = \u0410\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u0430\u0440\u0442\u0430
-mindmaps = &\u041a\u0430\u0440\u0442\u044b
-mindmaps_desc = \u041a\u0430\u0440\u0442\u044b (*.mm)
-mindmaps_filter_desc = \u0424\u0438\u043b\u044c\u0442\u0440\u044b (*.mmfilter)
-mode_Browse=\u0420\u0435\u0436\u0438\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430
-mode_File=\u0424\u0430\u0439\u043b\u043e\u0432\u044b\u0439 \u0440\u0435\u0436\u0438\u043c
-mode_MindMap=\u0420\u0435\u0436\u0438\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442-\u043a\u0430\u0440\u0442\u044b
-mode_na = \u0420\u0435\u0436\u0438\u043c \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d
-mode_status = \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0440\u0435\u0436\u0438\u043c {0}
-mode_title =Freeplane - {0}
-modes = \u0420\u0435\u0436\u0438\u043c\u044b
-most_recent_files = &\u041d\u0435\u0434\u0430\u0432\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u044b
-MoveToRootAction.text= \u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0443\u0437\u0435\u043b
-NavigationNextMapAction.text= \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u0430\u0440\u0442\u0430
-NavigationPreviousMapAction.text= \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043a\u0430\u0440\u0442\u0430
-new_mindmap = \u041d\u043e\u0432\u0430\u044f \u043a\u0430\u0440\u0442\u0430
-new_node = \u041d\u043e\u0432\u044b\u0439 \u0443\u0437\u0435\u043b
-new_node_as_sibling_not_possible_for_the_root = \u0423 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043c\u0435\u0436\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-NewChildAction.text= \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b
-NewMapAction.text= \u0421\u043e\u0437\u0434&\u0430\u0442\u044c
-NewParentNode.text= \u041e\u0431\u0449\u0438\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0443\u0437\u0435\u043b
-NewParentNode.tooltip= <html>\u0412\u0441\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u043e\u0431\u0449\u0438\u0439 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0443\u0437\u0435\u043b</html>
-NewPreviousSiblingAction.text= \u041d\u043e\u0432\u044b\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043a\u0443\u0449\u0438\u043c
-NewSiblingAction.text= \u041d\u043e\u0432\u044b\u0439 \u0441\u043c\u0435\u0436\u043d\u044b\u0439 \u0443\u0437\u0435\u043b \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e
-no = \u041d\u0435\u0442
-no_format_copy_before_format_paste = \u041f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442, \u043d\u0443\u0436\u043d\u043e \u0435\u0433\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-no_previous_find = \u0411\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0438\u0445 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u043d\u0435\u0442.
-node = \u0423\u0437\u0435\u043b
-node_changed_discard_changes = \u0412\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0443\u0437\u0435\u043b. \u0425\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439?
-node_is_write_protected=\u0423\u0437\u0435\u043b-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a \u0437\u0430\u0449\u0438\u0449\u0435\u043d \u043e\u0442 \u0437\u0430\u043f\u0438\u0441\u0438
-node_location_help=\u041f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430, <ctrl>+\u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\ [...]
-NodeBackgroundColorAction.text= &\u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u0443\u0437\u043b\u0430
-NodeColorAction.text= \u0426\u0432\u0435\u0442 \u0443\u0437\u043b\u0430...
-NodeColorBlendAction.text= \u0412\u044b\u0441\u0432\u0435\u0442\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b
-NodeDownAction.text= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u0437
-NodeListAction.text=\u041d\u0430\u0439\u0442\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c...
-NodeListAction.tooltip=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0443\u0437\u043b\u044b \u043a\u0430\u043a \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u043c.
-NodeShapeAction.bubble.text= \u0422\u0438\u043f \u0443\u0437\u043b\u0430 "&\u041e\u0432\u0430\u043b"
-NodeShapeAction.fork.text= \u0422\u0438\u043f \u0443\u0437\u043b\u0430 "&\u041a\u0440\u0438\u0432\u0430\u044f"
-NodeUpAction.text= \u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0432\u0435\u0440\u0445
-nonboldify_branch = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0436\u0438\u0440\u043d\u043e\u0435 \u043d\u0430\u0447\u0435\u0440\u0442\u0430\u043d\u0438\u0435
-nonitalicise_branch = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0435 \u043d\u0430\u0447\u0435\u0440\u0442\u0430\u043d\u0438\u0435
-normal = \u041e\u0431\u044b\u0447\u043d\u044b\u0439
-not_saved_for_link_error = \u041a\u0430\u0440\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0438
-note_window_location =\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0439
-ok = OK
-OpenAction.text= \u041e\u0442\u043a\u0440\u044b\u0442\u044c
-OpenFreeplaneSiteAction.text=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Freeplane
-UpdateCheckAction.text=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f
-option_changes_may_require_restart=\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432\u0441\u0442\u0443\u043f\u0438\u0442 \u0432 \u0441\u0438\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.
-OptionalDontShowMeAgainDialog.cancel=&\u041d\u0435\u0442
-OptionalDontShowMeAgainDialog.dontShowAgain=&\u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c.
-OptionalDontShowMeAgainDialog.ok=&\u0414\u0430
-OptionalDontShowMeAgainDialog.rememberMyDescision=&\u0417\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043c\u043e\u0439 \u0432\u044b\u0431\u043e\u0440.
-OptionPanel.absolute=\u0410\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e
-OptionPanel.accessories/plugins/AutomaticLayout.properties_PatternTabName=\u0410\u0432\u0442\u043e\u0444\u043e\u0440\u043c\u0430\u0442
-OptionPanel.always_fold_all_after_load=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
-OptionPanel.always_save_folding_state.tooltip=\u0415\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e, \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435/\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0438 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043e \u043d\u0435\u043e\u0431\u0445\u0 [...]
-OptionPanel.always_save_folding_state=\u0412\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f
-OptionPanel.always_save_folding=\u0432\u0441\u0435\u0433\u0434\u0430
-OptionPanel.always_unfold_all_after_load=\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
-OptionPanel.antialias.tooltip=<html>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.</html>
-OptionPanel.antialias_all=\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0451
-OptionPanel.antialias_edges=\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0451\u0431\u0440\u0430
-OptionPanel.antialias_none=\u041d\u0435 \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c
-OptionPanel.antialias=\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435
-OptionPanel.Appearance=\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u0432\u0438\u0434
-OptionPanel.ar=\u0410\u0440\u0430\u0431\u0441\u043a\u0438\u0439
-OptionPanel.as_parent=\u041a\u0430\u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c
-OptionPanel.ask=\u0421\u043f\u0440\u043e\u0441\u0438\u0442\u044c
-OptionPanel.automatic=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438
-OptionPanel.automaticFormat_level=\u0421\u0442\u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
-OptionPanel.automaticFormat_level1=\u0424\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-OptionPanel.automaticFormat_level2=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f
-OptionPanel.Behaviour=\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435
-OptionPanel.bezier=\u041a\u0440\u0438\u0432\u0430\u044f
-OptionPanel.bubble=\u041e\u0432\u0430\u043b
-OptionPanel.Cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-OptionPanel.center_selected_node=\u0426\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0437\u043b\u044b
-OptionPanel.childpattern.tooltip=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437\u0435\u0446 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c.
-OptionPanel.childpattern=\u041e\u0431\u0440\u0430\u0437\u0435\u0446 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-OptionPanel.clear_all_setters.tooltip=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u043b\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u044b
-OptionPanel.clear_all_setters=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0441\u0435
-OptionPanel.combined=\u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439
-OptionPanel.convert_to_current_version.tooltip=<html>\u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u0430\u0440\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c <br>(\u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0 [...]
-OptionPanel.convert_to_current_version=<html>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u044b \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Freeplane <br>\u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u044d\u0442\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438</html>
-OptionPanel.cs=\u0427\u0435\u0448\u0441\u043a\u0438\u0439
-OptionPanel.cut_nodes_without_question.tooltip=\u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0443\u0437\u043b\u044b \u0432\u044b\u0440\u0435\u0437\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u043e\u0442\u0435\u0440\ [...]
-OptionPanel.cut_nodes_without_question=\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0443\u0437\u043b\u044b \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f
-OptionPanel.de=\u041d\u0435\u043c\u0435\u0446\u043a\u0438\u0439
-OptionPanel.default_browser_command_mac.tooltip=<html> \u0438 MAC: (\u0441\u043f\u0430\u0441\u0438\u0431\u043e \u041d\u0438\u043a\u0443)</html>
-OptionPanel.default_browser_command_mac=\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f Mac
-OptionPanel.default_browser_command_other_os.tooltip=<html> \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e Linux:</html>
-OptionPanel.default_browser_command_other_os=\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f \u043f\u0440\u043e\u0447\u0438\u0445 \u041e\u0421
-OptionPanel.default_browser_command_windows_9x.tooltip=<html>\u0414\u043b\u044f Windows (\u043a\u0430\u0432\u044b\u0447\u043a\u0438 "" \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0438\u0437-\u0437\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 (URL), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 "=").</html>
-OptionPanel.default_browser_command_windows_9x=\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f Windows 9x
-OptionPanel.default_browser_command_windows_nt.tooltip=<html>\u0414\u043b\u044f Windows (\u043a\u0430\u0432\u044b\u0447\u043a\u0438 "" \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0438\u0437-\u0437\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 (URL), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 "=").</html>
-OptionPanel.default_browser_command_windows_nt=\u0411\u0440\u0430\u0443\u0437\u0435\u0440 \u0434\u043b\u044f Windows NT
-OptionPanel.default=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442
-OptionPanel.defaultfont.tooltip=<html>\u0428\u0440\u0438\u0444\u0442 \u0443\u0437\u043b\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0448\u0440\u0438\u0444\u0442 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0443 [...]
-OptionPanel.defaultfont=\u0428\u0440\u0438\u0444\u0442
-OptionPanel.defaultfontsize=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
-OptionPanel.defaultfontstyle=\u0421\u0442\u0438\u043b\u044c \u0448\u0440\u0438\u0444\u0442\u0430
-OptionPanel.Defaults=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b
-OptionPanel.delete_automatic_saves_at_exit.tooltip=<html> \u041f\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0433\u0430\u043b\u043e\u0447\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0431\u044b\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b \u043f\u043e\u0441\u043b\u0435 \u04 [...]
-OptionPanel.delete_automatic_saves_at_exit=\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u0438 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439?
-OptionPanel.delete_nodes_without_question.tooltip=\u0415\u0441\u043b\u0438 \u044d\u0442\u043e\u0442 \u0444\u043b\u0430\u0436\u043e\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0443\u0437\u043b\u044b \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043f\u [...]
-OptionPanel.delete_nodes_without_question=\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u0443\u0437\u043b\u044b \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f
-OptionPanel.disable_cursor_move_paper.tooltip=<html>\u041d\u0435 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u0443\u0440\u0441\u043e\u0440 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b</html>
-OptionPanel.disable_cursor_move_paper=\u0421\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u043a\u0443\u0440\u0441\u043e\u0440 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0438 \u043a\u0430\u0440\u0442\u044b
-
-
-OptionPanel.dk=\u0414\u0430\u0442\u0441\u043a\u0438\u0439
-
-OptionPanel.draganddrop.tooltip=<html>\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e \u043b\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u044b</html>
-OptionPanel.draganddrop=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Drag && Drop
-OptionPanel.edgecolor.tooltip=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430 \u0434\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 (\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c)
-OptionPanel.edgecolor=\u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
-OptionPanel.edgestyle.tooltip=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430 \u0434\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 (\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c)
-OptionPanel.edgestyle=\u0421\u0442\u0438\u043b\u044c \u0440\u0435\u0431\u0440\u0430
-OptionPanel.edgewidth.tooltip=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430 \u0434\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0443\u0437\u043b\u0430 (\u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0438 \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c)
-OptionPanel.EdgeWidth_1=1
-OptionPanel.EdgeWidth_2=2
-OptionPanel.EdgeWidth_4=4
-OptionPanel.EdgeWidth_8=8
-OptionPanel.EdgeWidth_parent=\u041a\u0430\u043a \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c
-OptionPanel.EdgeWidth_thin=\u0442\u043e\u043d\u043a\u0438\u0439
-OptionPanel.edgewidth=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430
-OptionPanel.el__buttons_above=\u041a\u043d\u043e\u043f\u043a\u0438 \u0441\u0432\u0435\u0440\u0445\u0443
-
-OptionPanel.el__enter_confirms_by_default=<\u0412\u0412\u041e\u0414> \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0430\u043b\u043e\u0433
-OptionPanel.el__max_default_window_height=\u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043a\u043d\u0430
-OptionPanel.el__max_default_window_width=\u041d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u043a\u043d\u0430
-OptionPanel.el__min_default_window_height=\u041d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u043a\u043d\u0430
-OptionPanel.el__min_default_window_width=\u041d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u043a\u043d\u0430
-OptionPanel.el__position_window_below_node=\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438
-OptionPanel.show_icon_for_attributes=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0434\u043b\u044f \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432
-OptionPanel.el=\u0413\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0439
-OptionPanel.en=\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439
-
-
-OptionPanel.Environment=\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435
-OptionPanel.es=\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439
-OptionPanel.et=\u042d\u0441\u0442\u043e\u043d\u0441\u043a\u0438\u0439
-OptionPanel.execute_scripts_without_asking.tooltip=<html>\u0421\u043a\u0440\u0438\u043f\u0442\u044b Freeplane \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u041f\u041a. <br>\u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u0432\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u04 [...]
-OptionPanel.execute_scripts_without_asking=\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0431\u0435\u0437 \u0437\u0430\u043f\u0440\u043e\u0441\u0430
-OptionPanel.execute_scripts_without_exec_restriction.tooltip=<html><body>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u043e\u0441\u043e\u0431\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0445\u043e\u0442\u044f\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440) \u0431\u043 [...]
-OptionPanel.execute_scripts_without_exec_restriction=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u041d\u0415 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)
-OptionPanel.execute_scripts_without_file_restriction.tooltip=<html><body>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 (\u043e\u0442\u043a\u0440\u044b\u0442\u044c, \u0437\u0430\u043a\u0440 [...]
-OptionPanel.execute_scripts_without_file_restriction=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 (\u041d\u0415 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)
-OptionPanel.execute_scripts_without_network_restriction.tooltip=<html><body>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f,<br>\u0432\u043a\u043b\u044e\u0447\u [...]
-OptionPanel.execute_scripts_without_network_restriction=\u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0435\u0442\u044c\u044e (\u041d\u0415 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)
-OptionPanel.experimental_file_locking_on.tooltip=<html> \u041f\u0440\u043e\u0431\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f</html>
-OptionPanel.experimental_file_locking_on=(\u041f\u0440\u043e\u0431\u043d\u0430\u044f) \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432
-OptionPanel.export_icons_in_html.tooltip=<html> \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 HTML \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u042d\u0442\u0438 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u [...]
-OptionPanel.export_icons_in_html=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c \u0432 HTML
-OptionPanel.Files=\u0424\u0430\u0439\u043b\u044b
-OptionPanel.first=\u041f\u0435\u0440\u0432\u044b\u0439
-OptionPanel.foldingsymbolwidth.tooltip=<html> \u0420\u0430\u0437\u043c\u0435\u0440 \u0437\u043d\u0430\u043a\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0439 \u0443\u0437\u0435\u043b<html>
-OptionPanel.foldingsymbolwidth=\u0420\u0430\u0437\u043c\u0435\u0440 \u0437\u043d\u0430\u043a\u0430 \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.fork=\u0412\u0435\u0442\u043a\u0430
-OptionPanel.fr=\u0424\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u0438\u0439
-OptionPanel.gl=\u0413\u0430\u043b\u0438\u0441\u0438\u0439\u0441\u043a\u0438\u0439
-OptionPanel.gtk=Gtk
-OptionPanel.hr=\u0425\u043e\u0440\u0432\u0430\u0442\u0441\u043a\u0438\u0439
-OptionPanel.html_export_based_on_headings=\u041f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u043c
-OptionPanel.html_export_fold_all=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0451
-OptionPanel.html_export_fold_currently_folded=\u041a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0435
-OptionPanel.html_export_folding=\u0421\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435 \u0432 HTML
-OptionPanel.html_export_no_folding=\u0411\u0435\u0437 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f
-OptionPanel.HTML=HTML
-OptionPanel.hu=\u0412\u0435\u043d\u0433\u0435\u0440\u0441\u043a\u0438\u0439
-OptionPanel.icon.tooltip=\u0423 \u0443\u0437\u043b\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0430 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430
-OptionPanel.icons.list.tooltip=\u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438\u043b\u0438 \u0443\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0438\u043a\u043e\u043d\u043a\u0438. \u0418\u043a\u043e\u043d\u043a\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b [...]
-OptionPanel.icon=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430
-OptionPanel.icons.list=\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c
-OptionPanel.id=\u0418\u043d\u0434\u043e\u043d\u0435\u0437\u0438\u0439\u0441\u043a\u0438\u0439
-OptionPanel.it=\u0418\u0442\u0430\u043b\u044c\u044f\u043d\u0441\u043a\u0438\u0439
-OptionPanel.ja=\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0439
-
-
-OptionPanel.Keystrokes=\u041a\u043b\u0430\u0432\u0438\u0448\u0438
-OptionPanel.kr=\u041a\u043e\u0440\u0435\u0439\u0441\u043a\u0438\u0439
-OptionPanel.language.tooltip=<html>\u042f\u0437\u044b\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439. '\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438' \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u044b</html>
-OptionPanel.language=\u042f\u0437\u044b\u043a
-OptionPanel.last_opened_list_length=\u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0447\u043d\u044f \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432
-OptionPanel.last=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439
-OptionPanel.level=\u0423\u0440\u043e\u0432\u0435\u043d\u044c
-OptionPanel.level1=\u0424\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-OptionPanel.level2=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f
-OptionPanel.level3=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f
-OptionPanel.level4=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f
-OptionPanel.level5=\u0424\u043e\u0440\u043c\u0430\u0442 \u0443\u0437\u043b\u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0440\u043e\u0432\u043d\u0435\u0439
-OptionPanel.linear=\u043b\u0438\u043d\u0435\u0439\u043d\u044b\u0439
-OptionPanel.links.tooltip=<html>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043b\u0438\u0431\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438, \u043b\u0438\u0431\u043e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c\u0438</html>
-OptionPanel.links=\u0421\u0441\u044b\u043b\u043a\u0438
-OptionPanel.load_folding_from_map_default_fold_all=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437 \u043a\u0430\u0440\u0442\u044b \u0438\u043b\u0438 \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
-OptionPanel.load_folding_from_map_default_unfold_all=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0438\u0437 \u0444\u043e\u0440\u043c\u044b \u0438\u043b\u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0435
-OptionPanel.load_folding=\u041f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435
-OptionPanel.load_last_map.tooltip=<html>\u041f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u0430\u0440\u0442\u0443.</html>
-OptionPanel.load_last_map=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043a\u0430\u0440\u0442\u0443
-OptionPanel.lookandfeel.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f 'metal','windows','motif', 'gtk'.<br>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 'mac' \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0442\u043e\u043b\u044c\u043a\ [...]
-OptionPanel.lookandfeel=\u0421\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f
-OptionPanel.lt=\u041b\u0438\u0442\u043e\u0432\u0441\u043a\u0438\u0439
-OptionPanel.mapxsize.tooltip=<html>\u0428\u0438\u0440\u0438\u043d\u0430 \u043d\u043e\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b</html>
-OptionPanel.mapxsize=\u0428\u0438\u0440\u0438\u043d\u0430 \u043a\u0430\u0440\u0442\u044b
-OptionPanel.mapysize=\u0412\u044b\u0441\u043e\u0442\u0430 \u043a\u0430\u0440\u0442\u044b
-OptionPanel.max_node_width.tooltip=<html>\u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445</html>
-OptionPanel.max_node_width=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.toolTipManager.max_tooltip_width.tooltip=<html>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445.</html>
-OptionPanel.toolTipManager.max_tooltip_width=\u0420\u0430\u0437\u043c\u0435\u0440 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438
-OptionPanel.metal=\u041c\u0435\u0442\u0430\u043b\u043b
-OptionPanel.motif=Motif
-OptionPanel.nb=\u041d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 Bokm\u00e5l
-OptionPanel.never_save_folding=\u043d\u0438\u043a\u043e\u0433\u0434\u0430
-OptionPanel.nl=\u0413\u043e\u043b\u043b\u0430\u043d\u0434\u0441\u043a\u0438\u0439
-OptionPanel.nn=\u041d\u043e\u0440\u0432\u0435\u0436\u0441\u043a\u0438\u0439 Nynorsk
-OptionPanel.nodebackgroundcolor.tooltip=\u0424\u043e\u043d \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-OptionPanel.nodebackgroundcolor=\u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u0443\u0437\u043b\u0430
-OptionPanel.nodecolor.tooltip=\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-OptionPanel.nodecolor=\u0426\u0432\u0435\u0442 \u0443\u0437\u043b\u0430
-
-OptionPanel.nodefontbold=\u0416\u0438\u0440\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442
-
-OptionPanel.nodefontitalic=\u041a\u0443\u0440\u0441\u0438\u0432
-
-OptionPanel.nodefontname=\u0428\u0440\u0438\u0444\u0442 \u0443\u0437\u043b\u0430
-
-OptionPanel.nodefontsize=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0443\u0437\u043b\u0430
-OptionPanel.nodeshape.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u0444\u043e\u0440\u043c\u0443 \u0443\u0437\u043b\u0430. <br>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\:<br><table border\="1"><tr><td>fork\: </td><td>\u0431\u0435\u0437 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0435\u0439 \u0440\u0430\u043c\u043a\u0438,</t [...]
-OptionPanel.nodeshape=\u0421\u0442\u0438\u043b\u044c \u0443\u0437\u043b\u0430
-OptionPanel.nodetext.tooltip=\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0432\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u043a\u0441\u0442 \u0443\u0437\u043b\u0430. \u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0451\u043d \u043d\u0430 \u043d\u043e\u0432\u044b\u0439.
-OptionPanel.nodetext=\u0422\u0435\u043a\u0441\u0442 \u0443\u0437\u043b\u0430
-OptionPanel.nothing=\u041d\u0438\u0447\u0435\u0433\u043e
-OptionPanel.number_of_different_files_for_automatic_save.tooltip=<html> \u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432\u0435\u0440\u0441\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b, \u0432\u0441\u0435 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0443\ [...]
-OptionPanel.number_of_different_files_for_automatic_save=\u0427\u0438\u0441\u043b\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439
-OptionPanel.OK=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
-
-
-OptionPanel.patternname.tooltip=\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043e\u0431\u0440\u0430\u0437\u0446\u0430
-OptionPanel.patternname=\u0418\u043c\u044f
-
-OptionPanel.pl=\u041f\u043e\u043b\u044c\u0441\u043a\u0438\u0439
-OptionPanel.placenewbranches.tooltip=<html>\u0413\u0434\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0443\u0437\u043b\u044b. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f "\u043f\u0435\u0440\u0432\u044b\u0439" \u0438 "\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439" </html>
-OptionPanel.placenewbranches=\u041f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.plugins/scripting/tab_name=\u0421\u043a\u0440\u0438\u043f\u0442\u044b
-OptionPanel.printonwhitebackground.tooltip=<html>\u0412\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u0438 \u0431\u0435\u043b\u044b\u0439 \u0444\u043e\u043d</html>
-OptionPanel.printonwhitebackground=<html>\u041f\u0435\u0447\u0430\u0442\u0430\u0442\u044c \u043d\u0430 \u0431\u0435\u043b\u043e\u043c \u0444\u043e\u043d\u0435</html>
-OptionPanel.pt_BR=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439 (\u0411\u0440\u0430\u0437\u0438\u043b\u0438\u044f)
-OptionPanel.pt_PT=\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u044c\u0441\u043a\u0438\u0439 (\u041f\u043e\u0440\u0442\u0443\u0433\u0430\u043b\u0438\u044f)
-OptionPanel.relative=\u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e
-OptionPanel.remind_type_of_new_nodes.tooltip=<html>"\u0421\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c" \u0431\u0443\u0434\u0435\u0442 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0432\u0430\u0441 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0441\u043b\u0438 \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u0435\u0442\u0435\u0441\u044c).<br>"\u0414\u0430" \u043f\u043e\u043a\u0430\u0436\u0435\u0442 \u0440\u0435\u0434\u0430\u043a\u0442\u [...]
-OptionPanel.remind_use_rich_text_in_new_long_nodes=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.remove_notes_without_question.tooltip=\u0415\u0441\u043b\u0438 \u0444\u043b\u0430\u0433 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d, \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u0431\u0443\u0434\u0443\u0442 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f. \u042d\u0442\u04 [...]
-OptionPanel.remove_notes_without_question=\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0431\u0435\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f
-OptionPanel.resources_use_default_font_for_notes_too=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f\u043c \u0448\u0440\u0438\u0444\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
-OptionPanel.resources_use_margin_top_zero_for_notes=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u0435\u0435 \u043f\u043e\u043b\u0435 \u0443 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0439
-OptionPanel.revision_color.tooltip=\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432.
-OptionPanel.revision_color=\u0426\u0432\u0435\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439
-OptionPanel.ru=\u0420\u0443\u0441\u0441\u043a\u0438\u0439
-OptionPanel.save_folding_if_map_is_changed=\u0435\u0441\u043b\u0438 \u043a\u0430\u0440\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0430
-OptionPanel.save_folding=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0432\u0451\u0440\u0442\u043a\u0443
-OptionPanel.save_modification_times=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439
-OptionPanel.save_only_intrisically_needed_ids.tooltip=\u041a\u043e\u0433\u0434\u0430 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043e, ID \u0443\u0437\u043b\u0430 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0432 \u043a\u0430\u0440\u0442\u0435. \u0422\u0430\u043a \u0436\u0435, \u0432\u044b \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 [...]
-OptionPanel.save_only_intrisically_needed_ids=\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0443\u0437\u043b\u043e\u0432
-OptionPanel.script.tooltip=\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 Groovy-\u0441\u043a\u0440\u0438\u043f\u0442\u0430.
-OptionPanel.script_user_key_name_for_signing.tooltip=<html>\u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043a\u043b\u044e\u0447\u0430 \u0437\u0434\u0435\u0441\u044c. <br>\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e [...]
-OptionPanel.script_user_key_name_for_signing=\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c \u043a\u043b\u044e\u0447\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438
-OptionPanel.script=\u0421\u043a\u0440\u0438\u043f\u0442
-OptionPanel.se=\u0428\u0432\u0435\u0434\u0441\u043a\u0438\u0439
-OptionPanel.selection_method.tooltip=<html> \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u0435\u043b\u044f \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c/\u0437\u0430\u043f\u0440\u0435\u0442\u0438\u0442\u044c \u0432\u044b\u0431\u043e\u0440 \u0443\u0437\u043b\u0430 \u0441 \u0437\u0430\u0434\u0435\u0440\u043 [...]
-OptionPanel.selection_method_by_click=\u0429\u0435\u043b\u0447\u043a\u043e\u043c
-OptionPanel.selection_method_delayed=\u0421 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439
-OptionPanel.selection_method_direct=\u0421\u0440\u0430\u0437\u0443
-OptionPanel.selection_method=\u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0431\u043e\u0440\u0430 \u0443\u0437\u043b\u0430
-OptionPanel.separator.accessories/plugins/AutomaticLayout.properties_PatternSeparatorName=\u041e\u0431\u0440\u0430\u0437\u0446\u044b
-OptionPanel.separator.anti_alias=\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435
-OptionPanel.separator.attributes=\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b
-OptionPanel.separator.automatic_save=\u0410\u0432\u0442\u043e\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435
-OptionPanel.separator.behaviour=\u041f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435
-OptionPanel.separator.browser=\u041d\u0430\u0432\u0438\u0433\u0430\u0442\u043e\u0440
-OptionPanel.separator.commands_for_the_program=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439
-OptionPanel.separator.default_colors=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0446\u0432\u0435\u0442
-OptionPanel.separator.default_fonts=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442
-OptionPanel.separator.default_styles=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0441\u0442\u0438\u043b\u044c
-OptionPanel.separator.EdgeControls=\u0420\u0451\u0431\u0440\u0430
-OptionPanel.separator.edit_long_node_window=\u041e\u043a\u043d\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.separator.files=\u0424\u0430\u0439\u043b\u044b
-OptionPanel.separator.General=\u041e\u0431\u0449\u0438\u0435
-OptionPanel.separator.html_export=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 HTML
-OptionPanel.separator.html_import=\u0418\u043c\u043f\u043e\u0440\u0442 HTML
-OptionPanel.separator.hyperlink_types=\u0422\u0438\u043f\u044b \u0441\u0441\u044b\u043b\u043e\u043a
-OptionPanel.separator.icon_properties=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
-OptionPanel.separator.icons=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0432 "\u0412\u044b\u0431\u043e\u0440 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b..."
-OptionPanel.separator.initial_map_size=\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u044b
-OptionPanel.separator.key_typing=\u0412\u0432\u043e\u0434 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b
-OptionPanel.separator.language=\u042f\u0437\u044b\u043a
-OptionPanel.separator.load=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
-OptionPanel.separator.look_and_feel=\u0421\u0442\u0438\u043b\u044c \u043e\u0444\u043e\u0440\u043c\u043b\u0435\u043d\u0438\u044f
-OptionPanel.separator.mouse_wheel=\u041a\u043e\u043b\u0435\u0441\u043e \u043c\u044b\u0448\u0438
-OptionPanel.separator.new_node_commands=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.separator.node_editing_commands=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.separator.node_navigation_commands=\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f
-OptionPanel.separator.NodeColors=\u0426\u0432\u0435\u0442\u0430 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.separator.NodeFont=\u0428\u0440\u0438\u0444\u0442 \u0443\u0437\u043b\u0430
-OptionPanel.separator.NodeStyles=\u0421\u0442\u0438\u043b\u0438 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.separator.notifications=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f
-OptionPanel.separator.other_defaults=\u041f\u0440\u043e\u0447\u0438\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b
-OptionPanel.separator.others=\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
-OptionPanel.separator.patterns=\u041e\u0431\u0440\u0430\u0437\u0446\u044b
-OptionPanel.separator.plugins/scripting/separatorPropertyName=\u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f
-OptionPanel.separator.root_node_appearance=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-OptionPanel.separator.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
-OptionPanel.separator.ScriptingControl=\u0421\u043a\u0440\u0438\u043f\u0442\u044b
-OptionPanel.separator.selection_colors=\u0426\u0432\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f
-OptionPanel.separator.selection_method=\u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0431\u043e\u0440\u0430 \u0443\u0437\u043b\u0430
-OptionPanel.separator.undo=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-OptionPanel.set_property_text.tooltip=\u041f\u0443\u0441\u0442\u043e:\u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c; \u041c\u0438\u043d\u0443\u0441=\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c (\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435); \u041f\u043b\u044e\u0441=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c
-OptionPanel.set_property_text=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c
-OptionPanel.setscript.tooltip=\u0421\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u0441\u0442\u0438\u043b\u044e.
-OptionPanel.setscript=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c
-OptionPanel.sharp_bezier=\u043e\u0441\u0442\u0440\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f
-OptionPanel.sharp_linear=\u043e\u0441\u0442\u0440\u0430\u044f \u043f\u0440\u044f\u043c\u0430\u044f
-OptionPanel.show_node_tooltips=\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432
-OptionPanel.signed_script_are_trusted.tooltip=\u0415\u0441\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438 \u043b\u0438\u0446\u0430\u043c\u0438 (\u0442.\u0435. \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438 Freeplane \u0438\u043b\u0438 \u0432\u0430\u043c\u0438), \u043e\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0431\u0435 [...]
-OptionPanel.signed_script_are_trusted=\u0414\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f).
-OptionPanel.sk=\u0421\u043b\u043e\u0432\u0430\u0446\u043a\u0438\u0439
-OptionPanel.sl=\u0421\u043b\u043e\u0432\u0435\u043d\u0441\u043a\u0438\u0439
-OptionPanel.standardbackgroundcolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u044f (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 #RRGGBB)</html>
-OptionPanel.standardbackgroundcolor=\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430
-OptionPanel.standardcloudcolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u044f (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u0434\u0435 #RRG [...]
-OptionPanel.standardcloudcolor=\u0426\u0432\u0435\u0442 \u043e\u0431\u043b\u0430\u043a\u043e\u0432
-OptionPanel.standardcloudestyle.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u043e\u0431\u043b\u0430\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e "\u0411\u0435\u0437\u044c\u0435"</html>
-OptionPanel.standardcloudestyle=\u0422\u0438\u043f \u043e\u0431\u043b\u0430\u043a\u043e\u0432
-OptionPanel.standarddrawrectangleforselection.tooltip=<html>\u0420\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u043e\u043a\u0440\u0443\u0433 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0438.</html>
-OptionPanel.standarddrawrectangleforselection=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u0432 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430\u0445
-OptionPanel.standardedgecolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0426\u0432\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0432\u0438\u04 [...]
-OptionPanel.standardedgecolor=\u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
-OptionPanel.standardedgestyle.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u0440\u0435\u0431\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f "\u043f\u0440\u044f\u043c\u0430\u044f" \u0438 "\u043a\u0440\u0438\u0432\u0430\u044f" - \u043a\u0440\u0438\u0432\u0430\u044f \u0411\u0435\u0437\u044c\u0435</html>
-OptionPanel.standardedgestyle=\u0421\u0442\u0438\u043b\u044c \u0440\u0435\u0431\u0440\u0430
-OptionPanel.standardlinkcolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u043b\u0438\u043d\u0438\u0438, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0443\u0437\u043b\u0430\u043c\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u044f (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e [...]
-OptionPanel.standardlinkcolor=\u0426\u0432\u0435\u0442 \u0441\u0432\u044f\u0437\u0438
-OptionPanel.standardlinkestyle.tooltip=<html>\u0421\u0442\u0438\u043b\u044c \u0441\u0432\u044f\u0437\u0435\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0440\u0438\u0432\u0430\u044f \u0411\u0435\u0437\u044c\u0435</html>
-OptionPanel.standardlinkestyle=\u0421\u0442\u0438\u043b\u044c \u0441\u0432\u044f\u0437\u0438
-OptionPanel.standardnodeshape.tooltip=<html>\u0422\u0438\u043f \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f "\u041a\u0440\u0438\u0432\u0430\u044f", "\u041e\u0432\u0430\u043b", "\u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439" \u0438 "\u041a\u0430\u043a \u0440\u043e [...]
-OptionPanel.standardnodeshape=\u0422\u0438\u043f \u0443\u0437\u043b\u043e\u0432
-OptionPanel.standardnodetextcolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u0443\u0437\u043b\u043e\u0432 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412 HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 #RRGGBB)</html>
-OptionPanel.standardnodetextcolor=\u0426\u0432\u0435\u0442 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.standardrootnodeshape.tooltip=<html>\u0422\u0438\u043f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f "\u041a\u0440\u0438\u0432\u0430\u044f", "\u041e\u0432\u0430\u043b" \u0438 "\u041a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439"</html>
-OptionPanel.standardrootnodeshape=\u0422\u0438\u043f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-OptionPanel.standardselectednodecolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u0412 HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 (\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0435 #RRGGBB)</html>
-OptionPanel.standardselectednodecolor=\u0426\u0432\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-OptionPanel.standardselectednoderectanglecolor.tooltip=<html>\u0426\u0432\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u043e\u0442\u043c\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b. \u0426\u0432\u0435\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 HTML-\u043d\u043e\u0442\u0430\u0446\u0438\u0438 (\u0448\u0435\u0441\u0442 [...]
-OptionPanel.standardselectednoderectanglecolor=\u0426\u0432\u0435\u0442 \u043e\u0431\u0432\u043e\u0434\u043a\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432
-OptionPanel.structured_html_import=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c HTML \u043a\u0430\u043a \u0441\u0445\u0435\u043c\u0443 \u0443\u0437\u043b\u043e\u0432
-
-OptionPanel.time_for_automatic_save.tooltip=<html> \u041f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043c\u0438\u043b\u0438\u0441\u0435\u043a\ [...]
-OptionPanel.time_for_automatic_save=\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0443\u043d\u0442\u043e\u0432
-OptionPanel.time_for_delayed_selection.tooltip=<html> \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u0443\u0437\u0435\u043b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c, \u043a\u043e\u0433\u0434\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043c\u044b\u0448\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441 [...]
-OptionPanel.time_for_delayed_selection=\u0412\u0440\u0435\u043c\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438
-OptionPanel.tr=\u0422\u0443\u0440\u0435\u0446\u043a\u0438\u0439
-OptionPanel.uk_UA=\u0423\u043a\u0440\u0430\u0438\u043d\u0441\u043a\u0438\u0439
-OptionPanel.undefined_font=\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u043e
-OptionPanel.undo_levels.tooltip=<html>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c.</html>
-OptionPanel.undo_levels=\u0427\u0438\u0441\u043b\u043e \u043e\u0442\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439
-OptionPanel.unfold_on_paste.tooltip=\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0443\u0437\u0435\u043b \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u0438
-OptionPanel.unfold_on_paste=\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0443\u0437\u0435\u043b \u043f\u0440\u0438 \u0432\u0441\u0442\u0430\u0432\u043a\u0435
-OptionPanel.use_common_out_point_for_root_node.tooltip=<html>\u0412\u0435\u0442\u0432\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0442\u043e\u0447\u0435\u043a, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043d\u0430 \u043b\u0435\u0432\u043e\u043c \u0438\u043b\u0438 \u043f\u0440\u0430\u0432\u043e\u043c \u043a\u0440\u0430\u044e \u044d\u043b\u043b\u0438\u043f\u0441\u0430, \u043e\u0431\u [...]
-OptionPanel.use_common_out_point_for_root_node=\u0412\u0435\u0442\u0432\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-OptionPanel.use_tabbed_pane.tooltip=\u0415\u0441\u043b\u0438 \u043e\u043f\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430, \u043a\u0430\u0440\u0442\u044b \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f \u0432\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0430\u0445 (\u043a\u0430\u043a \u0432 FireFox).
-OptionPanel.use_tabbed_pane=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438
-OptionPanel.userproperties=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
-OptionPanel.vi=\u0412\u044c\u0435\u0442\u043d\u0430\u043c\u0441\u043a\u0438\u0439
-OptionPanel.wheel_velocity.tooltip=\u0411\u043e\u043b\u044c\u0448\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u0440\u0442\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043b\u0435\u0441\u0438\u043a\u0430.
-OptionPanel.wheel_velocity=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c
-OptionPanel.windows=Windows
-OptionPanel.zh_CN=\u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u044b\u0439 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439
-OptionPanel.zh_TW=\u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439
-PageAction.text= \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b &\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b...
-PasteAction.text= \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c
-PatternNewNameProperty=\u041d\u043e\u0432\u044b\u0439 \u0441\u0442\u0438\u043b\u044c
-PatternToString.backgroundColor=\u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442
-PatternToString.Child=\u0421\u0442\u0438\u043b\u044c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-PatternToString.color=\u0426\u0432\u0435\u0442
-PatternToString.EdgeColor=\u0426\u0432\u0435\u0442 \u0440\u0435\u0431\u0440\u0430
-PatternToString.EdgeStyle=\u0422\u0438\u043f \u043b\u0438\u043d\u0438\u0438 \u0440\u0435\u0431\u0440\u0430
-PatternToString.EdgeWidth=\u0422\u043e\u043b\u0449\u0438\u043d\u0430 \u0440\u0435\u0431\u0440\u0430
-PatternToString.FontBold=\u0416\u0438\u0440\u043d\u044b\u0439
-PatternToString.FontItalic=\u041d\u0430\u043a\u043b\u043e\u043d\u043d\u044b\u0439
-PatternToString.FontName=\u0418\u043c\u044f \u0448\u0440\u0438\u0444\u0442\u0430
-PatternToString.Icon=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430
-PatternToString.NodeFontSize=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
-
-plugins/latex/LatexNodeHook.editorTitle = Latex \u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440.
-plugins/ScriptEditor.cancel=&\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u044b\u0439\u0442\u0438
-plugins/ScriptEditor.exit=&\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0432\u044b\u0439\u0442\u0438
-plugins/ScriptEditor.FORBIDDEN_ACTION=\u041e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432 Freeplane \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b. \u0421\u043b\u0435\u0434\u0443\u0449\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f {0,choice,0\#File|1\#Network|2\#Exec} \: {1,choice,0\#Accept|1\#Connect|2\#Listen|3\#Multicast|4\#SetFactory|5\#Exec|6\#Link [...]
-plugins/ScriptEditor.menu_actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f
-plugins/ScriptEditor.new_script=\u041d\u043e\u0432\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442
-plugins/ScriptEditor.run=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c
-plugins/ScriptEditor.sign=\u041f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442...
-plugins/ScriptEditor/window.Result=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:
-plugins/ScriptEditor/window.title=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432
-plugins/TimeList.xml_Created=\u0421\u043e\u0437\u0434\u0430\u043d
-plugins/TimeList.xml_Date=\u0414\u0430\u0442\u0430
-plugins/TimeList.xml_Icons=\u041f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
-plugins/TimeList.xml_Modified=\u0418\u0437\u043c\u0435\u043d\u0435\u043d
-plugins/TimeList.xml_Notes=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f
-plugins/TimeList.xml_Text=\u0422\u0435\u043a\u0441\u0442
-plugins/TimeManagement.xml_appendButton= \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0442\u0443 \u043a \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0443\u0437\u043b\u0430\u043c
-plugins/TimeManagement.xml_Cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-plugins/TimeManagement.xml_cancelButton=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-plugins/TimeManagement.xml_closeButton=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
-plugins/TimeManagement.xml_Export=\u042d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
-plugins/TimeManagement.xml_Find=\u041d\u0430\u0439\u0442\u0438
-plugins/TimeManagement.xml_Goto=\u041f\u0435\u0440\u0435\u0439\u0442\u0438
-plugins/TimeManagement.xml_hour= \u0427\u0430\u0441:
-plugins/TimeManagement.xml_menu_actions=\u041a\u043e\u043c\u0430\u043d\u0434\u044b
-plugins/TimeManagement.xml_minute= \u041c\u0438\u043d\u0443\u0442\u0430:
-plugins/TimeManagement.xml_reminderButton_tooltip=<html>\u0412 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u0438\u0433\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u0442 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435\u043c, - \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u044d\u0442\u0430 \u043f\u0440\u043e\u0433\ [...]
-plugins/TimeManagement.xml_reminderButton= \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c
-plugins/TimeManagement.xml_reminderNode_onlyOneDate=<html>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u0441 \u0443\u0437\u043b\u043e\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0434\u0430\u0442\u0443<br>\u0423\u0436\u0435 \u0437\u0430\u043f\u043e\u043c\u043d\u0435\u043d\u043e {0,date} {0,time}, \u0412\u044b \u0432\u0432\u043e\u0434\u0438\u0442\u0435 {1,date} {1,time}. <br><br>\u0418\u0437\u043c\u0435\u043d\u0438\ [...]
-
-plugins/TimeManagement.xml_reminderNode_tooltip=\u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u043d\u0430 {0,date} \u0432 {0,time}
-plugins/TimeManagement.xml_removeReminderButton = \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
-plugins/TimeManagement.xml_removeReminderButton_tooltip = \u041e\u0442\u043c\u0435\u043d\u0430 \u0432\u0441\u0435\u0445 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-plugins/TimeManagement.xml_Replace_All=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435
-plugins/TimeManagement.xml_Replace_Selected=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0435
-plugins/TimeManagement.xml_Replace=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c
-plugins/TimeManagement.xml_Select=\u041e\u0442\u043c\u0435\u0442\u0438\u0442\u044c
-plugins/TimeManagement.xml_todayButton=\u0421\u0435\u0433\u043e\u0434\u043d\u044f
-plugins/TimeManagement.xml_WindowTitle_All_Nodes=\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430
-plugins/TimeManagement.xml_WindowTitle=\u0412\u0440\u0435\u043c\u044f
-preferences = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
-print_preview_title = \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440
-PrintAction.text= &\u041f\u0435\u0447\u0430\u0442\u044c...
-PrintDirectAction.text= \u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c
-printing_settings = \u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u043f\u0435\u0447\u0430\u0442\u0438
-PrintPreviewAction.text= \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440...
-PropertyAction.text=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 ...
-QuitAction.text= \u0412&\u044b\u0445\u043e\u0434
-read_only = \u0422\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f
-
-#automatic translated values
-#Sat Oct 31 21:30:34 CET 2009
-really_convert_to_current_version=<html>\u042d\u0442\u0430 \u043a\u0430\u0440\u0442\u044b \u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 Freeplane. <br>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0435 (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)? <br>(\u0418\u043d\u0430\u0447\u0435 \u043e\u043d\u0430 \u04 [...]
-really_cut_node=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0443\u0437\u0435\u043b(\u0443\u0437\u043b\u044b)?
-really_execute_script=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 \u0432 \u044d\u0442\u0443 \u043a\u0430\u0440\u0442\u0443? \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430 [...]
-really_remove_node=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b(\u0443\u0437\u043b\u044b)?
-really_remove_notes=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f?
-ReapplyFilterAction.text=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e
-RedoAction.text= \u0412\u0435\u0440\u043d\u0443\u0442\u044c
-RedoFilterAction.text=\u0412\u0435\u0440\u043d\u0443\u0442\u044c
-ReminderHookAction.text=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
-ReminderHookAction.tooltip=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
-RemoveAllIconsAction.text= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u044b
-RemoveConnectorAction.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u044f\u0437\u044c
-
-RemoveIconAction.text= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443
-RemoveNoteAction.text= \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f
-RemoveNoteAction.tooltip = <html>\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0443 \u0432\u0441\u0435\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432.</html>
-rename=\u041f\u0435&\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c
-repair_link = \u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443
-repair_link_question = \u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443. \u0412\u0432\u0435\u0441\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e?
-replace=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c
-reset_to_default=\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
-ResetNodeLocationAction.text=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c &\u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e
-RevertAction.text=&\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c
-RevisionPluginAction.text=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0446\u0432\u0435\u0442 &\u0444\u043e\u043d\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439
-save_unsaved = \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u0430\u0440\u0442\u0443? :
-SaveAction.text= \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c
-SaveAll.text=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c &\u0432\u0441\u0435
-SaveAll.tooltip=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043a\u0430\u0440\u0442\u044b.
-SaveAsAction.text= \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a...
-saved = \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e
-scheme_evaluate = \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c!
-ScriptEditor.text=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432...
-ScriptEditor.tooltip=\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u043e Freeplane.
-ScriptEditorPanel.changed_cancel=\u0421\u043a\u0440\u0438\u043f\u0442 \u0431\u044b\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439?
-
-
-select_favorites_folder = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0438
-select_file_export_to=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430
-select_folder_for_importing = \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0430
-select_icon=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443
-SelectAllAction.text=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435
-SelectBranchAction.text=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u044e \u0432\u0435\u0442\u0432\u044c
-selection_method_by_click = \u0412\u044b\u0431\u043e\u0440 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u043c \u0449\u0435\u043b\u0447\u043a\u043e\u043c
-selection_method_delayed=\u0412\u044b\u0431\u043e\u0440 \u043d\u0430\u0435\u0437\u0434\u043e\u043c \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439
-selection_method_direct = \u0412\u044b\u0431\u043e\u0440 \u043d\u0430\u0435\u0437\u0434\u043e\u043c
-SelectNoteAction.text=\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044e \u0443\u0437\u043b\u0430
-SelectNoteAction.tooltip=\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043e\u0442 \u0443\u0437\u043b\u0430 \u043a \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044e \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442
-SetImageByFileChooserAction.text= \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430
-SetLinkByFileChooserAction.text= \u0421\u0441\u044b\u043b\u043a\u0430 (\u0432\u044b\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u0430)
-SetLinkByTextFieldAction.text= \u0421\u0441\u044b\u043b\u043a\u0430 (\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435)
-SetNoteWindowPosition.bottom.text=\u0432\u043d\u0438\u0437\u0443
-SetNoteWindowPosition.left.text=\u0441\u043b\u0435\u0432\u0430
-SetNoteWindowPosition.right.text=\u0441\u043f\u0440\u0430\u0432\u0430
-SetNoteWindowPosition.top.text=\u0432\u0432\u0435\u0440\u0445\u0443
-ShowAllAttributesAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
-ShowAncestorsAction.text=\u0421 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438
-ShowAttributeDialogAction.text=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 &\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430\u043c\u0438...
-ShowDescendantsAction.text=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0434\u0447\u0438\u043d\u0451\u043d\u043d\u044b\u0435
-ShowFilterToolbarAction.text=\u0424\u0438\u043b\u044c\u0442\u0440
-ShowHideNoteAction.text=\u041e\u043a\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0439
-ShowHideNoteAction.tooltip=\u042d\u0442\u043e \u0433\u043e\u0440\u044f\u0447\u0430\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u0435\u043a \u043d\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0449\u0435\u0439 \u043b\u0438\u043d\u0438\u0438.
-ShowSelectedAttributesAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0437\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
-ShowSelectionAsRectangleAction.text=\u041f\u043e\u0434\u0441\u0432\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u043c
-simplyhtml.aboutFrameTitle=\u041e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435...
-simplyhtml.aboutLabel=\u041e SimplyHTML...
-simplyhtml.alignCenter=\u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443
-simplyhtml.alignLabel=\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0433\u043e\u0440.:
-simplyhtml.alignLeft=\u0441\u043b\u0435\u0432\u0430
-simplyhtml.alignRight=\u0441\u043f\u0440\u0430\u0432\u0430
-simplyhtml.allCellsRangeLabel=\u0432\u0441\u0435\u043c \u043a\u043b\u0435\u0442\u043a\u0430\u043c
-simplyhtml.allOccurrencesReplaced=\u0412\u0441\u0435 \u0437\u0430\u043c\u0435\u043d\u0435\u043d\u043e
-simplyhtml.appendTableColLabel=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446
-simplyhtml.appendTableRowLabel=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443
-simplyhtml.applyCellAttrLabel=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043a
-simplyhtml.backgroundLabel=\u0424\u043e\u043d:
-simplyhtml.boldItalicName=\u0416\u0438\u0440\u043d\u044b\u0439 \u043a\u0443\u0440\u0441\u0438\u0432
-simplyhtml.boldName=\u0416\u0438\u0440\u043d\u044b\u0439
-simplyhtml.borderColorLabel=\u0426\u0432\u0435\u0442:
-simplyhtml.borderWidthLabel=\u0428\u0438\u0440\u0438\u043d\u0430
-simplyhtml.bottomLabel=\u043d\u0438\u0437:
-simplyhtml.cancelBtnName=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-simplyhtml.cellBorderTabLabel=\u041b\u0438\u043d\u0438\u0438
-simplyhtml.cellGenTabLabel=\u041e\u0431\u0449\u0438\u0435
-simplyhtml.cellMarginTabLabel=\u041f\u043e\u043b\u044f
-simplyhtml.cellPanelTitle=\u0424\u043e\u0440\u043c\u0430\u0442 \u044f\u0447\u0435\u0439\u043a\u0438
-simplyhtml.clearFormatLabel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
-simplyhtml.clearFormatTip=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435
-simplyhtml.close=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
-simplyhtml.closeBtnName=\u0417\u0430\u043a\u0440\u044b\u0442\u044c
-simplyhtml.colorLabel=\u0426\u0432\u0435\u0442
-simplyhtml.copyLabel=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-simplyhtml.copyTip=\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-simplyhtml.cTagNameHead1=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 1
-simplyhtml.cTagNameHead2=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 2
-simplyhtml.cTagNameHead3=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 3
-simplyhtml.cTagNameHead4=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 4
-simplyhtml.cTagNameHead5=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 5
-simplyhtml.cTagNameHead6=\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 6
-simplyhtml.cTagNameLink=\u0421\u0441\u044b\u043b\u043a\u0430
-simplyhtml.cTagNameOL=\u041d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a
-simplyhtml.cTagNamePara=\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444
-simplyhtml.cTagNameUL=\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a
-simplyhtml.cutLabel=\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c
-simplyhtml.cutTip=\u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c
-simplyhtml.defaultDocName=\u0411\u0435\u0437\u044b\u043c\u044f\u043d\u043d\u044b\u0439
-simplyhtml.deleteTableColLabel=\u0423\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446
-simplyhtml.deleteTableRowLabel=\u0423\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443
-simplyhtml.docTitleQuery=\u041d\u043e\u0432\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435:
-simplyhtml.docTitleTitle=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430
-simplyhtml.editLabel=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-simplyhtml.effectLabel=\u042d\u0444\u0444\u0435\u043a\u0442
-simplyhtml.familyLabel=\u0421\u0435\u043c\u044c\u044f
-simplyhtml.findNext=\u041d\u0430\u0439\u0442\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439...
-simplyhtml.findReplaceDialogTitle=\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430
-simplyhtml.findReplaceLabel=\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430
-simplyhtml.findReplaceTip=\u043f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430
-
-simplyhtml.fontBoldLabel=\u0416\u0438\u0440\u043d\u044b\u0439
-
-simplyhtml.fontBoldTip=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c/\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0436\u0438\u0440\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442
-
-simplyhtml.fontColorLabel=\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430
-simplyhtml.fontColorTip=\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430
-simplyhtml.fontDialogTitle=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0440\u0438\u0444\u0442
-
-simplyhtml.fontItalicLabel=\u041a\u0443\u0440\u0441\u0438\u0432
-
-simplyhtml.fontItalicTip=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c/\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u041a\u0443\u0440\u0441\u0438\u0432
-simplyhtml.fontLabel=\u0428\u0440\u0438\u0444\u0442...
-simplyhtml.fontTabLabel=\u0428\u0440\u0438\u0444\u0442
-simplyhtml.fontTip=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0440\u0438\u0444\u0442...
-
-simplyhtml.fontUnderlineLabel=\u041f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435
-simplyhtml.fontUnderlineTip=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c/\u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435
-simplyhtml.foregroundLabel=\u0422\u0435\u043a\u0441\u0442:
-simplyhtml.formatLabel=\u0424\u043e\u0440\u043c\u0430\u0442
-simplyhtml.formatListLabel=\u0421\u043f\u0438\u0441\u043e\u043a...
-simplyhtml.formatListTip=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043f\u0438\u0441\u043a\u0430
-simplyhtml.formatParaLabel=\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444...
-simplyhtml.formatParaTip=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u0433\u0440\u0430\u0444
-simplyhtml.formatTableLabel=\u0422\u0430\u0431\u043b\u0438\u0446\u0430...
-simplyhtml.formatTableTip=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443
-simplyhtml.helpLabel=\u041f\u043e&\u043c\u043e\u0449\u044c
-simplyhtml.htmlTabTitle=HTML \u041a\u043e\u0434
-simplyhtml.imageFileDesc=\u0424\u0430\u0439\u043b \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c
-simplyhtml.insertTableColLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446
-simplyhtml.insertTableLabel=\u0422\u0430\u0431\u043b\u0438\u0446\u0430...
-simplyhtml.insertTableMsg=\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432?
-simplyhtml.insertTableRowLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443
-simplyhtml.insertTableTitle=\u0412\u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443
-simplyhtml.italicName=\u041a\u0443\u0440\u0441\u0438\u0432
-simplyhtml.layoutTabTitle=\u0422\u0435\u043a\u0441\u0442
-simplyhtml.leftLabel=\u043b\u0435\u0432\u043e:
-simplyhtml.listDialogTitle=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430
-simplyhtml.listIndentTitle=\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435:
-simplyhtml.listPosInside=\u0432\u043d\u0443\u0442\u0440\u0438
-simplyhtml.listPositionLabel=\u041f\u043e\u0437\u0438\u0446\u0438\u044f:
-simplyhtml.listPosOutside=\u0441\u043d\u0430\u0440\u0443\u0436\u0438
-simplyhtml.listTypeCircle=\u041a\u0440\u0443\u0433
-simplyhtml.listTypeDecimal=1.,2.,3.,4.
-simplyhtml.listTypeDisc=\u0414\u0438\u0441\u043a
-simplyhtml.listTypeLabel=\u0422\u0438\u043f:
-simplyhtml.listTypeLowerAlpha=a.,b.,c.,d.
-simplyhtml.listTypeLowerRoman=i.,ii.,iii.,iv.
-simplyhtml.listTypeNone=\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442
-simplyhtml.listTypeSquare=\u041a\u0432\u0430\u0434\u0440\u0430\u0442
-simplyhtml.listTypeUpperAlpha=A.,B.,C.,D.
-simplyhtml.listTypeUpperRoman=I.,II.,III.,IV.
-simplyhtml.marginLabel=\u0421\u043d\u0430\u0440\u0443\u0436\u0438
-simplyhtml.matchCase=\u0421 \u0443\u0447\u0451\u0442\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430
-simplyhtml.newStyleDefaultName=\u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0438\u043b\u044c
-simplyhtml.nextTableCellLabel=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430
-simplyhtml.noLineLabel=\u041e\u0431\u044b\u0447\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442
-simplyhtml.noMoreOccurrencesFound=(\u0431\u043e\u043b\u044c\u0448\u0435) \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e
-simplyhtml.okBtnName=OK
-simplyhtml.paddingLabel=\u0412\u043d\u0443\u0442\u0440\u0438
-simplyhtml.paraAlignCenterLabel=\u0426\u0435\u043d\u0442\u0440
-simplyhtml.paraAlignCenterTip=\u0420\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0446\u0435\u043d\u0442\u0440\u0435
-simplyhtml.paraAlignLeftLabel=\u0421\u043b\u0435\u0432\u0430
-simplyhtml.paraAlignLeftTip=\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e
-simplyhtml.paraAlignRightLabel=\u0421\u043f\u0440\u0430\u0432\u0430
-simplyhtml.paraAlignRightTip=\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e
-simplyhtml.paraStyleDialogTitle=\u0421\u0442\u0438\u043b\u0438
-simplyhtml.paraTabLabel=\u0410\u0431\u0437\u0430\u0446
-simplyhtml.pasteLabel=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c
-simplyhtml.pasteTip=\u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c
-simplyhtml.plainName=\u041e\u0431\u044b\u0447\u043d\u044b\u0439
-simplyhtml.previewLabel=\u041f&\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c
-simplyhtml.previewText=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0435\u043a\u0441\u0442
-simplyhtml.prevTableCellLabel=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0430\u044f \u043a\u043b\u0435\u0442\u043a\u0430
-simplyhtml.redoLabel=\u0412\u0435\u0440\u043d\u0443\u0442\u044c
-simplyhtml.redoTip=\u043f\u043e\u0432\u0442\u043e\u0440
-simplyhtml.replace=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c...
-simplyhtml.replaceAll=\u0412\u0441\u0435
-simplyhtml.replaceDone=\u0413\u043e\u0442\u043e\u0432\u043e
-simplyhtml.replaceNo=\u041d\u0435\u0442
-simplyhtml.replaceThisQuery=\u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442
-simplyhtml.replaceWith=\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430:
-simplyhtml.replaceYes=\u0414\u0430
-simplyhtml.rightLabel=\u043f\u0440\u0430\u0432\u043e:
-simplyhtml.searchDown=\u0418\u0441\u043a\u0430\u0442\u044c \u0432\u043d\u0438\u0437
-simplyhtml.searchFromStart=\u0418\u0441\u043a\u0430\u0442\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430
-simplyhtml.searchUp=\u0418\u0441\u043a\u0430\u0442\u044c \u0432\u0432\u0435\u0440\u0445
-simplyhtml.selectAllLabel=\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435
-simplyhtml.sizeLabel=\u0420\u0430\u0437\u043c\u0435\u0440
-simplyhtml.standardStyleName=\u043e\u0431\u044b\u0447\u043d\u044b\u0439
-simplyhtml.strikeLabel=\u0417\u0430\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u043e
-simplyhtml.styleLabel=\u0421\u0442\u0438\u043b\u044c
-simplyhtml.styleNameInputText=\u0418\u043c\u044f \u0441\u0442\u0438\u043b\u044f?
-simplyhtml.styleNameInputTitle=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0442\u0438\u043b\u044c
-simplyhtml.tableBgColLabel=\u0424\u043e\u043d\u043e\u0432\u044b\u0439 \u0446\u0432\u0435\u0442:
-simplyhtml.tableDialogTitle=\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443
-simplyhtml.tableLabel=\u0422\u0430\u0431\u043b\u0438\u0446\u0430
-simplyhtml.tablePanelTitle=\u0442\u0430\u0431\u043b\u0438\u0446\u0430
-simplyhtml.tableWidthLabel=\u0428\u0438\u0440\u0438\u043d\u0430:
-simplyhtml.textIndentLabel=\u041e\u0442\u0441\u0442\u0443\u043f:
-simplyhtml.textToFind=\u0418\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442:
-simplyhtml.thisCellRangeLabel=\u044f\u0447\u0435\u0439\u043a\u0435
-simplyhtml.thisColRangeLabel=\u0441\u0442\u043e\u043b\u0431\u0446\u0443
-simplyhtml.thisRowRangeLabel=\u0441\u0442\u0440\u043e\u043a\u0435
-simplyhtml.toggleBulletsLabel=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a
-simplyhtml.toggleBulletsTip=\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a
-simplyhtml.toggleNumbersLabel=\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e
-simplyhtml.toggleNumbersTip=\u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e
-simplyhtml.topLabel=\u0432\u0435\u0440\u0445:
-simplyhtml.uLineLabel=\u041f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435
-simplyhtml.unableToOpenFileError=\u0424\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d
-simplyhtml.unableToRedoError=\u041f\u043e\u0432\u0442\u043e\u0440 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d:
-simplyhtml.unableToUndoError=\u041e\u0442\u043c\u0435\u043d\u0430 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430:
-simplyhtml.undoLabel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-simplyhtml.undoTip=\u043e\u0442\u043c\u0435\u043d\u0430
-simplyhtml.valignBaseline=\u043f\u043e \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044e
-simplyhtml.valignBottom=\u0441\u043d\u0438\u0437\u0443
-simplyhtml.valignLabel=\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0440\u0442.:
-simplyhtml.valignMiddle=\u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435
-simplyhtml.valignTop=\u0441\u0432\u0435\u0440\u0445\u0443
-simplyhtml.wholeWordsOnly=\u0422\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432\u0430
-SortNodes.text=\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0443\u0437\u043b\u044b
-SortNodes.tooltip=\u0423\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u043f\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0443.
-split = \u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c
-SplitNode.text= &\u0420\u0430\u0437\u0431\u0438\u0442\u044c \u0443\u0437\u0435\u043b
-SplitNode.tooltip= <html>\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0443\u0437\u043b\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0443\u0437\u0435\u043b</html>
-style = \u0421\u0442\u0438\u043b\u044c
-TimeListAction.text=&\u0420\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435...
-TimeListAction.tooltip=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439 \u0441\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438
-TimeManagementAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c...
-TimeManagementAction.tooltip= <html>\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u044c \u043e\u0442 \u041a\u0430\u044f \u0422\u043e\u0434\u0442\u0435\u0440\u0430.</html>
-ToggleChildrenFoldedAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c / \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b
-ToggleFoldedAction.text= \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c / \u0441\u0432\u0435\u0440\u043d\u0443\u0442\u044c
-ToggleLeftToolbarAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c/\u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438
-ToggleMenubarAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c/\u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u043c\u0435\u043d\u044e
-ToggleToolbarAction.text= \u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c/\u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0432\u0435\u0440\u0445\u043d\u044e\u044e \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432
-undefined_error = \u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0447\u0435\u0440\u0435\u0437 \u0444\u043e\u0440\u0443\u043c
-underline = \u041f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435
-underlined = \u041f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u043e
-UndoAction.text= \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-UndoFilterAction.text=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-unfold = \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c
-UnfoldAllAction.text= \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0451
-UnfoldAllAction.tooltip= <html>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u0438 \u0432\u0441\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0443\u0437\u043b\u044b</html>
-
-UnfoldOneLevelAction.text= \u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c
-UnfoldOneLevelAction.tooltip= <html>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0443\u0437\u043b\u044b \u043d\u0430 \u043e\u0434\u0438\u043d \u0443\u0440\u043e\u0432\u0435\u043d\u044c</html>
-url_error = \u041e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0430\u0434\u0440\u0435\u0441\u0435 URL
-url_load_error = \u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0443 \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 URL:
-used_in_menu=\u0422\u0430\u043a\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448 \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043c\u0435\u043d\u044e.
-UsePlainTextAction.text= \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0435\u043a\u0441\u0442
-user_defined_zoom = \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c..
-user_defined_zoom_status_bar = \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0430 \u043f\u043e \u0432\u044b\u0431\u043e\u0440\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 {0}%.
-user_zoom = \u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u043f\u0435\u0447\u0430\u0442\u0438 (0.0 - 2.0):
-
-WebDocuAction.text= \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435
-width = \u0428\u0438\u0440\u0438\u043d\u0430
-
-xslt_export_not_possible=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 XSLT \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d
-yes = \u0414\u0430
-ZoomInAction.text= \u041f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c
-ZoomOutAction.text= \u041e\u0442\u0434\u0430\u043b\u0438\u0442\u044c
-OptionPanel.text.use_ctrl_key=\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0437\u043d\u0430\u0447\u0438\u0442\u044c \u0433\u043e\u0440\u044f\u0447\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0443, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043c\u0435\u043d\u044e, \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044f Ctrl
-ChangeConnectorArrowsAction.none.text=\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442
-ChangeConnectorArrowsAction.forward.text=\u0412\u043f\u0435\u0440\u0451\u0434
-
-ChangeConnectorArrowsAction.backward.text=\u041d\u0430\u0437\u0430\u0434
-ChangeConnectorArrowsAction.both.text=\u041d\u0430 \u043e\u0431\u043e\u0438\u0445 \u043a\u043e\u043d\u0446\u0430\u0445
-edit_source_label=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u043d\u0430\u0434\u043f\u0438\u0441\u044c
-edit_middle_label=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u0443\u044e \u043d\u0430\u0434\u043f\u0438\u0441\u044c
-edit_target_label=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u0443\u044e \u043d\u0430\u0434\u043f\u0438\u0441\u044c
-OptionPanel.separator.connectors=\u0421\u0432\u044f\u0437\u0438
-OptionPanel.label_font_family=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u0430
-
-
-OptionPanel.label_font_size=\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430
-OptionPanel.paint_connectors_behind=\u0423\u0437\u043b\u044b \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u043b\u0438\u043d\u0438\u0438 \u0441\u0432\u044f\u0437\u0435\u0439
-OpenPathAction.text=\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0444\u0430\u0439\u043b
-OKAction.text=OK
-ApplyAction.text=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c
-CancelAction.text=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c
-ImportAction.text=\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c
-filter_priority=\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442
-download=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
-updatecheckdialog=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433
-version_up_to_date=\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u0432\u0435\u0440\u0441\u0438\u044e
-OptionPanel.separator.updates=\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f
-OptionPanel.check_updates_automatically=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435
-can_not_connect_to_info_server=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443
-ReportBugAction.text=\u0421\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435
-RequestFeatureAction.text=\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u043e\u0432\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432
-AskForHelp.text=\u0417\u0430\u043f\u0440\u043e\u0441 \u043e \u043f\u043e\u043c\u043e\u0449\u0438
-sf_login_required=\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0430 Sourceforge. \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?
-OptionPanel.horizontal=\u043b\u043e\u043c\u0430\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f
-OptionPanel.hide_edge=\u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0440\u0435\u0431\u0440\u043e
-corrupt_map=\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u043e
-OptionPanel.separator.tooltip =\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438
-OptionPanel.toolTipManager.initialDelay =\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430, \u043c\u0441
-OptionPanel.toolTipManager.dismissDelay =\u0414\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430, \u043c\u0441
-OptionPanel.toolTipManager.reshowDelay =\u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0430, \u043c\u0441
-IconGroupPopupAction.office.text=\u041e\u0444\u0438\u0441
-IconGroupPopupAction.flags.text=\u0424\u043b\u0430\u0433\u0438
-IconGroupPopupAction.docs_folders.text=\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b \u0438 \u043f\u0430\u043f\u043a\u0438
-IconGroupPopupAction.numbers.text=\u0427\u0438\u0441\u043b\u0430
-IconGroupPopupAction.time.text=\u0412\u0440\u0435\u043c\u044f
-IconGroupPopupAction.people.text=\u041b\u044e\u0434\u0438
-IconGroupPopupAction.signs.text=\u0417\u043d\u0430\u043a\u0438
-IconGroupPopupAction.smiley.text=\u0420\u043e\u0436\u0438\u0446\u044b
-IconGroupPopupAction.nature.text=\u041f\u0440\u0438\u0440\u043e\u0434\u0430
-IconGroupPopupAction.miscallaneous.text=\u0420\u0430\u0437\u043d\u044b\u0435
-IconGroupPopupAction.arrows.text=\u0421\u0442\u0440\u0435\u043b\u043a\u0438
-IconGroupPopupAction.user.text=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435
-OptionPanel.structured_icon_toolbar=\u041f\u0430\u043d\u0435\u043b\u044c \u0433\u0440\u0443\u043f \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c
-icon_bee=Freeplane
-saving_canceled=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u043e
-attributes_assign_dialog=\u041f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b
-OptionPanel.separator.CloudControls=\u041e\u0431\u043b\u0430\u043a\u0430
-OptionPanel.cloud=\u041e\u0431\u043b\u0430\u043a\u043e
-OptionPanel.cloudcolor=\u041e\u0431\u043b\u0430\u043a\u043e \u0438 \u0446\u0432\u0435\u0442
-OptionPanel.load_last_maps=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u044b
-filter_note=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u044f
-org.freeplane.plugin.bugreport.question=<html>Freeplane \u0438\u043c\u0435\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0448\u0438\u0431\u043e\u043a.<br>\u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0 [...]
-org.freeplane.plugin.bugreport.report=\u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u043e\u0442\u0447\u0451\u0442
-org.freeplane.plugin.bugreport.always_agree=\u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
-org.freeplane.plugin.bugreport.agree=\u041f\u043e\u0441\u043b\u0430\u0442\u044c
-org.freeplane.plugin.bugreport.deny=\u041d\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
-org.freeplane.plugin.bugreport.always_deny=\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
-org.freeplane.plugin.bugreport.dialog.title=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u0442\u0447\u0451\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435
-OptionPanel.org.freeplane.plugin.bugreport.allowed=\u0412\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
-OptionPanel.org.freeplane.plugin.bugreport.denied=\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0442\u044c
-OptionPanel.org.freeplane.plugin.bugreport.ask=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u043e\u0442\u0447\u0451\u0442\u0430
-OptionPanel.backup_file_number=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432
-OptionPanel.separator.org.freeplane.plugin.bugreport=\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u0442\u0447\u0451\u0442 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435
-OptionPanel.org.freeplane.plugin.bugreport=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430
-export_failed=\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043d\u0435 \u0443\u0434\u0430\u043b\u0441\u044f
-filters_not_loaded=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440, \u0444\u0430\u0439\u043b \u043d\u0430\u0440\u0443\u0448\u0435\u043d
-f_button_unassigned=<\u043f\u0443\u0441\u0442\u043e>
-ToggleFBarAction.text=\u041f\u0430\u043d\u0435\u043b\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0432\u0438\u0448
-LoadAcceleratorPresetsAction.textPatterns.text=\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0442\u0435\u043a\u0441\u0442\u0430
-acceleratorPresets=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
-out_of_memory=\u041d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u0438
-SaveAcceleratorPresetsAction.text=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448
-can_not_save_key_set=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438
-enter_keyset_name=\u0418\u043c\u044f \u0434\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u0433\u043e\u0440\u044f\u0447\u0438\u0445 \u043a\u043b\u0430\u0432\u0438\u0448
-overwrite_keyset_question=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0431\u043e\u0440?
-OptionPanel.separator.editing=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430
-OptionPanel.editor_extra_width=\u0428\u0430\u0433 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0448\u0438\u0440\u0438\u043d\u044b
-EdgeLikeLinkAction.text=\u0421\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0431\u0440\u043e
-connector_label=\u041d\u0430\u0434\u043f\u0438\u0441\u044c \u0441\u0432\u044f\u0437\u0438
-ToggleFullScreenAction.text=\u041f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c
-SelectedPasteAction.text=\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a...
-StructuredHtmlFlavorHandler=HTML \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u043e\u0432
-DirectHtmlFlavorHandler=HTML \u043a\u0430\u043a \u043e\u0434\u0438\u043d \u0443\u0437\u0435\u043b
-StringFlavorHandler=\u0422\u0435\u043a\u0441\u0442 \u043a\u0430\u043a \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u043e\u0432
-MindMapNodesFlavorHandler=\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u0437\u043b\u043e\u0432
-FileListFlavorHandler=\u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0444\u0430\u0439\u043b\u044b
-ViewerControllerAction.text=\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442...
-NextNodeAction.FORWARD.text=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b
-NextNodeAction.BACK.text=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b
-NextNodeAction.FORWARD_N_FOLD.text=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0443\u0437\u0435\u043b (\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c)
-NextNodeAction.BACK_N_FOLD.text=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0443\u0437\u0435\u043b (\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c)
-svg=SVG
-bitmaps=\u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0435 \u0440\u0438\u0441\u0443\u043d\u043a\u0438
-ViewLayoutTypeAction.OUTLINE.text=\u0412\u0438\u0434 \u0441\u0445\u0435\u043c\u044b
-OptionPanel.separator.outline_view=\u0412\u0438\u0434 \u0441\u0445\u0435\u043c\u044b
-OptionPanel.outline_vgap=\u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438
-
-#automatic translated values
-#Wed Oct 28 00:16:35 CET 2009
-OptionPanel.outline_hgap=\u0420\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438
-fit_map_to_page_width=\u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u0448\u0438\u0440\u0438\u043d\u0443 \u0434\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b
-fit_map_to_page_height=\u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u0434\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b
-user_defined_scale=\u041c\u0430\u0441\u0448\u0442\u0430\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c
-AllMapsNodeListAction.text=\u041f\u043e\u0438\u0441\u043a \u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u0432\u043e \u0432\u0441\u0435\u0445 \u043a\u0430\u0440\u0442\u0430\u0445
-OptionPanel.separator.inline_editor=\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0443\u0437\u043b\u0430
-OptionPanel.il__enter_confirms_by_default=Enter \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u043e-\u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e
-ModesMenuAction.MindMap.text=\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u0430\u0440\u0442 \u0441\u043e\u0437\u043d\u0430\u043d\u0438\u044f
-ModesMenuAction.Browse.text=\u041e\u0431\u0437\u043e\u0440 \u043a\u0430\u0440\u0442
-ModesMenuAction.File.text=\u041e\u0431\u0437\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432
-not_saved_for_image_error=\u041a\u0430\u0440\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0434\u043e \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u0444\u0430\u0439\u043b\u0430
-
-#automatic translated values
-#Mon Dec 28 18:44:31 CET 2009
-MaxNodeWidthAction.text=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443 \u0443\u0437\u043b\u0430
-OptionPanel.separator.scrollbar=\u041f\u043e\u043b\u043e\u0441\u0430 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438
-OptionPanel.scrollbar_increment=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c
-ExecuteScriptForAllNodes.text=\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b
-ExecuteScriptForSelectionAction.text=\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430
-ExecuteScripts.text=\u0421\u043a\u0440\u0438\u043f\u0442\u044b
-ExecuteScriptOnSingleNode.text={0}: \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0443\u0437\u043b\u0435 [auto]
-ExecuteScriptOnSelectedNode.text={0}: \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u0432\u0441\u0435\u0445 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445 [auto]
-ExecuteScriptOnSelectedNodeRecursively.text={0}: \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u0443\u0437\u043b\u0430\u0445, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e [auto]
-ExecuteScriptError.text=\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430
-ReadScriptError.text=\u041e\u0448\u0438\u0431\u043a\u0430 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u0430
-OptionPanel.script_directories=\u041f\u0443\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430
-OptionPanel.separator.spelling=\u041e\u043f\u0446\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u0438
-OptionPanel.spelling_opt_case_sensitive=\u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440
-OptionPanel.spelling_opt_ignore_all_caps_words=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043b\u043e\u0432\u0430 \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435.
-OptionPanel.spelling_opt_ignore_capitalization=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u0431\u0443\u043a\u0432\u044b \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u043b\u043e\u0432\u0430.
-OptionPanel.spelling_opt_ignore_words_with_numbers=\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0432\u0430 \u0441 \u0447\u0438\u0441\u043b\u0430\u043c\u0438
-OptionPanel.spelling_opt_suggestions_limit_dialog=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u0435
-OptionPanel.spelling_opt_suggestions_limit_menu=\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u043c\u0435\u043d\u044e
-RemoveIcon_0_Action.text=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0438\u043a\u043e\u043d\u043a\u0443
-icon_clock = \u0412\u0440\u0435\u043c\u044f
-icon_clock2=\u041d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0435
-icon_user_icon=\u0418\u043a\u043e\u043d\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
-connector=\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u0435\u043b\u044c
-
-#automatic translated values
-#Fri Feb 05 12:54:18 CET 2010
-OptionPanel.display_node_id=\u0414\u0438\u0441\u043F\u043B\u0435\u0439 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0443\u0437\u043B\u0430[auto]
-remove_shortcut_question=\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u0435 \u043A\u043B\u0430\u0432\u0438\u0448?[auto]
-HotKeyInfoAction.text=\u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u043D\u043E\u043C\u0435\u0440[auto]
-OptionPanel.load_folding_start_level=\u0421\u043B\u043E\u0436\u0438\u0442\u0435 \u0443\u0437\u043B\u044B \u0441 \u0443\u0440\u043E\u0432\u043D\u0435\u043C[auto]
-OptionPanel.goto_note_end_on_edit=\u041F\u0435\u0440\u0435\u043C\u0435\u0449\u0435\u043D\u0438\u0435 \u043A\u0443\u0440\u0441\u043E\u0440\u0430 \u043A \u0441\u0432\u0435\u0434\u0435\u043D\u0438\u044E \u0434\u043E \u043A\u043E\u043D\u0446\u0430[auto]
diff --git a/freeplane_devresources/.project b/freeplane_devresources/.project
deleted file mode 100644
index b9648b8..0000000
--- a/freeplane_devresources/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_devresources</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- </buildSpec>
- <natures>
- </natures>
-</projectDescription>
diff --git a/freeplane_devresources/.settings/org.eclipse.core.resources.prefs b/freeplane_devresources/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 752228f..0000000
--- a/freeplane_devresources/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:56:35 CET 2010
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/freeplane_devresources/.settings/org.eclipse.core.runtime.prefs b/freeplane_devresources/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index b6f459b..0000000
--- a/freeplane_devresources/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:56:26 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/freeplane_devresources/CodeStyle/codetemplates.xml b/freeplane_devresources/CodeStyle/codetemplates.xml
deleted file mode 100644
index 39837ec..0000000
--- a/freeplane_devresources/CodeStyle/codetemplates.xml
+++ /dev/null
@@ -1,52 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><templates><template autoinsert="true" context="gettercomment_context" deleted="false" description="Comment for getter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/**
- * @return the ${bare_field_name}
- */</template><template autoinsert="true" context="settercomment_context" deleted="false" description="Comment for setter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/**
- * @param ${param} the ${bare_field_name} to set
- */</template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="Comment for created constructors" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/**
- * ${tags}
- */</template><template autoinsert="false" context="filecomment_context" deleted="false" description="Comment for created Java files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment"/><template autoinsert="true" context="typecomment_context" deleted="false" description="Comment for created types" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/**
- * @author ${user}
- *
- * ${tags}
- */</template><template autoinsert="true" context="fieldcomment_context" deleted="false" description="Comment for fields" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/**
- *
- */</template><template autoinsert="true" context="methodcomment_context" deleted="false" description="Comment for non-overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/**
- * ${tags}
- */</template><template autoinsert="true" context="overridecomment_context" deleted="false" description="Comment for overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment">/* (non-Javadoc)
- * ${see_to_overridden}
- */</template><template autoinsert="true" context="delegatecomment_context" deleted="false" description="Comment for delegate methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/**
- * ${tags}
- * ${see_to_target}
- */</template><template autoinsert="false" context="newtype_context" deleted="false" description="Newly created files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.newtype" name="newtype">/*
- * Freeplane - mind map editor
- * Copyright (C) ${year} ${user}
- *
- * This file author is ${user}
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-${package_declaration}
-
-/**
- * @author Dimitry Polivaev
- * ${date}
- */
-${type_declaration}</template><template autoinsert="true" context="classbody_context" deleted="false" description="Code in new class type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.classbody" name="classbody">
-</template><template autoinsert="true" context="interfacebody_context" deleted="false" description="Code in new interface type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name="interfacebody">
-</template><template autoinsert="true" context="enumbody_context" deleted="false" description="Code in new enum type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.enumbody" name="enumbody">
-</template><template autoinsert="true" context="annotationbody_context" deleted="false" description="Code in new annotation type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name="annotationbody">
-</template><template autoinsert="true" context="catchblock_context" deleted="false" description="Code in new catch blocks" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.catchblock" name="catchblock">// ${todo} Auto-generated catch block
-${exception_var}.printStackTrace();</template><template autoinsert="true" context="methodbody_context" deleted="false" description="Code in created method stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodbody" name="methodbody">// ${todo} Auto-generated method stub
-${body_statement}</template><template autoinsert="true" context="constructorbody_context" deleted="false" description="Code in created constructor stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name="constructorbody">${body_statement}
-// ${todo} Auto-generated constructor stub</template><template autoinsert="true" context="getterbody_context" deleted="false" description="Code in created getters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.getterbody" name="getterbody">return ${field};</template><template autoinsert="true" context="setterbody_context" deleted="false" description="Code in created setters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.setterbody" name="setterbody">${field} = ${par [...]
\ No newline at end of file
diff --git a/freeplane_devresources/eclipse/freeplane core.launch b/freeplane_devresources/eclipse/freeplane core.launch
deleted file mode 100644
index 3b1ff13..0000000
--- a/freeplane_devresources/eclipse/freeplane core.launch
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/freeplane/src/org/freeplane/main/application/FreeplaneMain.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
-<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<sourceLookupDirector>
<sourceContainers duplicates="false">
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane&am [...]
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.freeplane.main.application.FreeplaneMain"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="freeplane"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea "-Dorg.freeplane.globalresourcedir=${workspace_loc:freeplane/external-resources}" -Dorg.freeplane.nosplash=true -Dorg.freeplane.main.application.FreeplaneSecurityManager.disable=true"/>
-<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:freeplane_framework/build}"/>
-<stringAttribute key="yk-options" value="
snapshots-dir=
additional-options2=onexit\=snapshot
startup=0
"/>
-</launchConfiguration>
diff --git a/freeplane_devresources/eclipse/freeplane knopflerfish mac.launch b/freeplane_devresources/eclipse/freeplane knopflerfish mac.launch
deleted file mode 100644
index 1d7af54..0000000
--- a/freeplane_devresources/eclipse/freeplane knopflerfish mac.launch
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/freeplane"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="4"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
-<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<sourceLookupDirector>
<sourceContainers duplicates="false">
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <directory nest="false" path="/Users/ [...]
-<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
-<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
-<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER" javaProject="freeplane" path="1" type="4"/>
"/>
-<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<runtimeClasspathEntry internalArchive="/freeplane_framework/build4mac/Freeplane.app/Contents/Resources/Java/freeplanelauncher.jar" path="3" type="2"/>
"/>
-<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<runtimeClasspathEntry internalArchive="/freeplane_framework/build4mac/Freeplane.app/Contents/Resources/Java/framework.jar" path="3" type="2"/>
"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jdk1.8.0_25.jdk"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.knopflerfish.framework.Main"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="freeplane"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdock:icon=${workspace_loc:/freeplane_framework/mac-jarbundler/freeplane.icns} -Xdock:name=Freeplane -Xmx512m"/>
-<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:freeplane_framework/build4mac/Freeplane.app/Contents/Resources/Java}"/>
-<stringAttribute key="yk-options" value="
snapshots-dir=
additional-options2=onexit\=snapshot
startup=0
"/>
-</launchConfiguration>
diff --git a/freeplane_devresources/eclipse/freeplane knopflerfish.launch b/freeplane_devresources/eclipse/freeplane knopflerfish.launch
deleted file mode 100644
index 949eba5..0000000
--- a/freeplane_devresources/eclipse/freeplane knopflerfish.launch
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/freeplane_framework/src/org/freeplane/launcher/Launcher.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
-<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<sourceLookupDirector>
<sourceContainers duplicates="false">
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane&am [...]
-<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
-<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6" javaProject="freeplane_framework" path="1" type="4"/>
"/>
-<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<runtimeClasspathEntry internalArchive="/freeplane_framework/build/freeplanelauncher.jar" path="3" type="2"/>
"/>
-<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<runtimeClasspathEntry internalArchive="/freeplane_framework/build/framework.jar" path="3" type="2"/>
"/>
-</listAttribute>
-<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.freeplane.launcher.Launcher"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="freeplane_framework"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512m"/>
-<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:freeplane_framework/build}"/>
-<stringAttribute key="yk-options" value="
snapshots-dir=
additional-options2=onexit\=snapshot
startup=0
"/>
-</launchConfiguration>
diff --git a/freeplane_devresources/eclipse/freeplane-osgi-mac.launch b/freeplane_devresources/eclipse/freeplane-osgi-mac.launch
deleted file mode 100644
index f5e0d9e..0000000
--- a/freeplane_devresources/eclipse/freeplane-osgi-mac.launch
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
-<booleanAttribute key="append.args" value="true"/>
-<booleanAttribute key="automaticAdd" value="false"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="false"/>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/freeplane-osgi-mac"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="default_auto_start" value="true"/>
-<intAttribute key="default_start_level" value="1"/>
-<booleanAttribute key="includeOptional" value="false"/>
-<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console -nosplash"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdock:icon=${workspace_loc:/freeplane_framework/mac-jarbundler/freeplane.icns} -Xdock:name=Freeplane -Xmx512m -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dosgi.debug=debug.properties -ea "-Dorg.freeplane.globalresourcedir=${workspace_loc:freeplane/external-resources}" -Dorg.freeplane.nosplash=true -Dorg.freeplane.main.application.FreeplaneSecurityManager.disable=true -Dosgi.classloader.lock=classname"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="target_bundles" value="org.apache.felix.gogo.runtime at default:default,org.apache.felix.gogo.shell at default:default,org.eclipse.equinox.console at default:default,org.eclipse.osgi at -1:true"/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useCustomFeatures" value="false"/>
-<booleanAttribute key="useDefaultConfigArea" value="true"/>
-<stringAttribute key="workspace_bundles" value="org.freeplane.core at 2:default,org.freeplane.plugin.bugreport at default:default,org.freeplane.plugin.formula at default:default,org.freeplane.plugin.help at default:default,org.freeplane.plugin.latex at default:default,org.freeplane.plugin.script at default:default,org.freeplane.plugin.svg at default:default"/>
-</launchConfiguration>
diff --git a/freeplane_devresources/eclipse/freeplane-osgi.launch b/freeplane_devresources/eclipse/freeplane-osgi.launch
deleted file mode 100644
index fc35cd6..0000000
--- a/freeplane_devresources/eclipse/freeplane-osgi.launch
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
-<booleanAttribute key="append.args" value="true"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bad_container_name" value="/freeplane_devresources/eclipse/o"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/freeplane-osgi"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="default_auto_start" value="true"/>
-<intAttribute key="default_start_level" value="1"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="org.eclipse.jdt.launching.JAVA_COMMAND" value="java"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -console"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512m -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dosgi.debug=debug.properties -ea "-Dorg.freeplane.globalresourcedir=${workspace_loc:freeplane/external-resources}" -Dorg.freeplane.nosplash=true -Dorg.freeplane.main.application.FreeplaneSecurityManager.disable=true"/>
-<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:freeplane/..}"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<booleanAttribute key="show_selected_only" value="true"/>
-<stringAttribute key="target_bundles" value="org.eclipse.osgi at -1:true"/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useCustomFeatures" value="false"/>
-<booleanAttribute key="useDefaultConfigArea" value="true"/>
-<stringAttribute key="workspace_bundles" value="freeplane_plugin_openmaps at default:default,freeplane_plugin_script_test at default:false,freeplane_uitest at default:false,org.freeplane.core at 2:default,org.freeplane.plugin.bugreport at default:default,org.freeplane.plugin.formula at default:default,org.freeplane.plugin.help at default:default,org.freeplane.plugin.latex at default:default,org.freeplane.plugin.script at default:default,org.freeplane.plugin.svg at default:default,org.freeplane.uispec4j at default:default"/>
-<stringAttribute key="yk-options" value="
snapshots-dir=
additional-options2=onexit\=snapshot
startup=0
"/>
-</launchConfiguration>
diff --git a/freeplane_devresources/eclipse/freeplaneDebugJDK.bat b/freeplane_devresources/eclipse/freeplaneDebugJDK.bat
deleted file mode 100644
index d167cea..0000000
--- a/freeplane_devresources/eclipse/freeplaneDebugJDK.bat
+++ /dev/null
@@ -1,8 +0,0 @@
- at echo off
-cd ..\..\freeplane_framework\build
-set freeplanedir=%cd%\
-set xargs=init.xargs
-set defines= "-Dorg.freeplane.param1=%~1" "-Dorg.freeplane.param2=%~2" "-Dorg.freeplane.param3=%~3" "-Dorg.freeplane.param4=%~4" "-Dorg.freeplane.param4=%~5" "-Dorg.freeplane.param4=%~6" "-Dorg.freeplane.param4=%~7" "-Dorg.freeplane.param4=%~8" "-Dorg.freeplane.userfpdir=%appdata%\Freeplane"
-set resdir="-Dorg.freeplane.globalresourcedir=%freeplanedir%resources/"
- at echo on
-"C:\Program Files\Java\jdk1.7.0_02\bin\java" -Xdebug -Xrunjdwp:transport=dt_socket,address=1044,server=y,suspend=y -Xmx512m "-Dorg.knopflerfish.framework.bundlestorage=memory" "-Dorg.knopflerfish.gosg.jars=reference:file:%freeplanedir%core/" %resdir% %defines% -jar "%freeplanedir%framework.jar" -xargs "%freeplanedir%props.xargs" -xargs "%freeplanedir%%xargs%"
diff --git a/freeplane_devresources/test/map_10000-7-7-0-0-0.mm b/freeplane_devresources/test/map_10000-7-7-0-0-0.mm
deleted file mode 100644
index 85d9b98..0000000
--- a/freeplane_devresources/test/map_10000-7-7-0-0-0.mm
+++ /dev/null
@@ -1,40024 +0,0 @@
-<map version="0.9.0">
-<!-- To view this file, download free mind mapping software FreeMind from
-http://freemind.sourceforge.net -->
-<node TEXT="our $max_node_number = 10000; # approximate
-number of nodes to generate
our $max_level = 7; # number of node levels, root node
-has level 0
our $max_number = 7; # number of child nodes for each
-node
our $attributeNumber = 0; # number of attributes
-added to each node
our $linkNumber = 0; #number of links added to each
-node
our $richcontent = 0; # 0 - use plain text, 1 - use
-rich content">
- <node ID="Freemind_Link_1" TEXT="testnode 1 1 1" FOLDED = "true">
- <icon BUILTIN="full-2"/>
- <icon BUILTIN="full-3"/>
- <node ID="Freemind_Link_2" TEXT="testnode 2 1 2" FOLDED = "true">
- <icon BUILTIN="full-3"/>
- <icon BUILTIN="full-4"/>
- <node ID="Freemind_Link_3" TEXT="testnode 3 1 3" FOLDED = "true">
- <icon BUILTIN="full-4"/>
- <icon BUILTIN="full-5"/>
- <node ID="Freemind_Link_4" TEXT="testnode 4 1 4" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_5" TEXT="testnode 5 1 5" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6" TEXT="testnode 6 1 6" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7" TEXT="testnode 7 1 7" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8" TEXT="testnode 7 2 8" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9" TEXT="testnode 7 3 9" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_10" TEXT="testnode 7 4 10" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_11" TEXT="testnode 7 5 11" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_12" TEXT="testnode 7 6 12" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_13" TEXT="testnode 7 7 13" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_14" TEXT="testnode 6 2 14" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_15" TEXT="testnode 7 1 15" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_16" TEXT="testnode 7 2 16" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_17" TEXT="testnode 7 3 17" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_18" TEXT="testnode 7 4 18" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_19" TEXT="testnode 7 5 19" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_20" TEXT="testnode 7 6 20" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_21" TEXT="testnode 7 7 21" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_22" TEXT="testnode 6 3 22" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_23" TEXT="testnode 7 1 23" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_24" TEXT="testnode 7 2 24" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_25" TEXT="testnode 7 3 25" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_26" TEXT="testnode 7 4 26" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_27" TEXT="testnode 7 5 27" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_28" TEXT="testnode 7 6 28" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_29" TEXT="testnode 7 7 29" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_30" TEXT="testnode 6 4 30" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_31" TEXT="testnode 7 1 31" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_32" TEXT="testnode 7 2 32" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_33" TEXT="testnode 7 3 33" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_34" TEXT="testnode 7 4 34" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_35" TEXT="testnode 7 5 35" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_36" TEXT="testnode 7 6 36" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_37" TEXT="testnode 7 7 37" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_38" TEXT="testnode 6 5 38" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_39" TEXT="testnode 7 1 39" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_40" TEXT="testnode 7 2 40" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_41" TEXT="testnode 7 3 41" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_42" TEXT="testnode 7 4 42" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_43" TEXT="testnode 7 5 43" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_44" TEXT="testnode 7 6 44" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_45" TEXT="testnode 7 7 45" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_46" TEXT="testnode 6 6 46" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_47" TEXT="testnode 7 1 47" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_48" TEXT="testnode 7 2 48" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_49" TEXT="testnode 7 3 49" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_50" TEXT="testnode 7 4 50" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_51" TEXT="testnode 7 5 51" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_52" TEXT="testnode 7 6 52" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_53" TEXT="testnode 7 7 53" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_54" TEXT="testnode 6 7 54" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_55" TEXT="testnode 7 1 55" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_56" TEXT="testnode 7 2 56" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_57" TEXT="testnode 7 3 57" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_58" TEXT="testnode 7 4 58" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_59" TEXT="testnode 7 5 59" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_60" TEXT="testnode 7 6 60" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_61" TEXT="testnode 7 7 61" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_62" TEXT="testnode 5 2 62" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_63" TEXT="testnode 6 1 63" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_64" TEXT="testnode 7 1 64" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_65" TEXT="testnode 7 2 65" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_66" TEXT="testnode 7 3 66" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_67" TEXT="testnode 7 4 67" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_68" TEXT="testnode 7 5 68" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_69" TEXT="testnode 7 6 69" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_70" TEXT="testnode 7 7 70" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_71" TEXT="testnode 6 2 71" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_72" TEXT="testnode 7 1 72" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_73" TEXT="testnode 7 2 73" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_74" TEXT="testnode 7 3 74" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_75" TEXT="testnode 7 4 75" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_76" TEXT="testnode 7 5 76" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_77" TEXT="testnode 7 6 77" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_78" TEXT="testnode 7 7 78" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_79" TEXT="testnode 6 3 79" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_80" TEXT="testnode 7 1 80" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_81" TEXT="testnode 7 2 81" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_82" TEXT="testnode 7 3 82" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_83" TEXT="testnode 7 4 83" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_84" TEXT="testnode 7 5 84" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_85" TEXT="testnode 7 6 85" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_86" TEXT="testnode 7 7 86" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_87" TEXT="testnode 6 4 87" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_88" TEXT="testnode 7 1 88" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_89" TEXT="testnode 7 2 89" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_90" TEXT="testnode 7 3 90" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_91" TEXT="testnode 7 4 91" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_92" TEXT="testnode 7 5 92" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_93" TEXT="testnode 7 6 93" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_94" TEXT="testnode 7 7 94" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_95" TEXT="testnode 6 5 95" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_96" TEXT="testnode 7 1 96" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_97" TEXT="testnode 7 2 97" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_98" TEXT="testnode 7 3 98" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_99" TEXT="testnode 7 4 99" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_100" TEXT="testnode 7 5 100" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_101" TEXT="testnode 7 6 101" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_102" TEXT="testnode 7 7 102" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_103" TEXT="testnode 6 6 103" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_104" TEXT="testnode 7 1 104" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_105" TEXT="testnode 7 2 105" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_106" TEXT="testnode 7 3 106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_107" TEXT="testnode 7 4 107" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_108" TEXT="testnode 7 5 108" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_109" TEXT="testnode 7 6 109" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_110" TEXT="testnode 7 7 110" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_111" TEXT="testnode 6 7 111" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_112" TEXT="testnode 7 1 112" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_113" TEXT="testnode 7 2 113" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_114" TEXT="testnode 7 3 114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_115" TEXT="testnode 7 4 115" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_116" TEXT="testnode 7 5 116" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_117" TEXT="testnode 7 6 117" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_118" TEXT="testnode 7 7 118" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_119" TEXT="testnode 5 3 119" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_120" TEXT="testnode 6 1 120" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_121" TEXT="testnode 7 1 121" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_122" TEXT="testnode 7 2 122" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_123" TEXT="testnode 7 3 123" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_124" TEXT="testnode 7 4 124" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_125" TEXT="testnode 7 5 125" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_126" TEXT="testnode 7 6 126" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_127" TEXT="testnode 7 7 127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_128" TEXT="testnode 6 2 128" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_129" TEXT="testnode 7 1 129" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_130" TEXT="testnode 7 2 130" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_131" TEXT="testnode 7 3 131" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_132" TEXT="testnode 7 4 132" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_133" TEXT="testnode 7 5 133" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_134" TEXT="testnode 7 6 134" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_135" TEXT="testnode 7 7 135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_136" TEXT="testnode 6 3 136" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_137" TEXT="testnode 7 1 137" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_138" TEXT="testnode 7 2 138" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_139" TEXT="testnode 7 3 139" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_140" TEXT="testnode 7 4 140" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_141" TEXT="testnode 7 5 141" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_142" TEXT="testnode 7 6 142" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_143" TEXT="testnode 7 7 143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_144" TEXT="testnode 6 4 144" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_145" TEXT="testnode 7 1 145" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_146" TEXT="testnode 7 2 146" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_147" TEXT="testnode 7 3 147" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_148" TEXT="testnode 7 4 148" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_149" TEXT="testnode 7 5 149" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_150" TEXT="testnode 7 6 150" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_151" TEXT="testnode 7 7 151" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_152" TEXT="testnode 6 5 152" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_153" TEXT="testnode 7 1 153" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_154" TEXT="testnode 7 2 154" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_155" TEXT="testnode 7 3 155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_156" TEXT="testnode 7 4 156" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_157" TEXT="testnode 7 5 157" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_158" TEXT="testnode 7 6 158" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_159" TEXT="testnode 7 7 159" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_160" TEXT="testnode 6 6 160" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_161" TEXT="testnode 7 1 161" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_162" TEXT="testnode 7 2 162" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_163" TEXT="testnode 7 3 163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_164" TEXT="testnode 7 4 164" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_165" TEXT="testnode 7 5 165" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_166" TEXT="testnode 7 6 166" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_167" TEXT="testnode 7 7 167" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_168" TEXT="testnode 6 7 168" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_169" TEXT="testnode 7 1 169" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_170" TEXT="testnode 7 2 170" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_171" TEXT="testnode 7 3 171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_172" TEXT="testnode 7 4 172" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_173" TEXT="testnode 7 5 173" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_174" TEXT="testnode 7 6 174" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_175" TEXT="testnode 7 7 175" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_176" TEXT="testnode 5 4 176" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_177" TEXT="testnode 6 1 177" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_178" TEXT="testnode 7 1 178" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_179" TEXT="testnode 7 2 179" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_180" TEXT="testnode 7 3 180" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_181" TEXT="testnode 7 4 181" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_182" TEXT="testnode 7 5 182" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_183" TEXT="testnode 7 6 183" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_184" TEXT="testnode 7 7 184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_185" TEXT="testnode 6 2 185" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_186" TEXT="testnode 7 1 186" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_187" TEXT="testnode 7 2 187" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_188" TEXT="testnode 7 3 188" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_189" TEXT="testnode 7 4 189" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_190" TEXT="testnode 7 5 190" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_191" TEXT="testnode 7 6 191" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_192" TEXT="testnode 7 7 192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_193" TEXT="testnode 6 3 193" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_194" TEXT="testnode 7 1 194" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_195" TEXT="testnode 7 2 195" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_196" TEXT="testnode 7 3 196" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_197" TEXT="testnode 7 4 197" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_198" TEXT="testnode 7 5 198" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_199" TEXT="testnode 7 6 199" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_200" TEXT="testnode 7 7 200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_201" TEXT="testnode 6 4 201" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_202" TEXT="testnode 7 1 202" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_203" TEXT="testnode 7 2 203" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_204" TEXT="testnode 7 3 204" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_205" TEXT="testnode 7 4 205" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_206" TEXT="testnode 7 5 206" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_207" TEXT="testnode 7 6 207" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_208" TEXT="testnode 7 7 208" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_209" TEXT="testnode 6 5 209" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_210" TEXT="testnode 7 1 210" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_211" TEXT="testnode 7 2 211" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_212" TEXT="testnode 7 3 212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_213" TEXT="testnode 7 4 213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_214" TEXT="testnode 7 5 214" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_215" TEXT="testnode 7 6 215" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_216" TEXT="testnode 7 7 216" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_217" TEXT="testnode 6 6 217" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_218" TEXT="testnode 7 1 218" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_219" TEXT="testnode 7 2 219" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_220" TEXT="testnode 7 3 220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_221" TEXT="testnode 7 4 221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_222" TEXT="testnode 7 5 222" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_223" TEXT="testnode 7 6 223" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_224" TEXT="testnode 7 7 224" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_225" TEXT="testnode 6 7 225" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_226" TEXT="testnode 7 1 226" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_227" TEXT="testnode 7 2 227" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_228" TEXT="testnode 7 3 228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_229" TEXT="testnode 7 4 229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_230" TEXT="testnode 7 5 230" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_231" TEXT="testnode 7 6 231" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_232" TEXT="testnode 7 7 232" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_233" TEXT="testnode 5 5 233" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_234" TEXT="testnode 6 1 234" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_235" TEXT="testnode 7 1 235" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_236" TEXT="testnode 7 2 236" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_237" TEXT="testnode 7 3 237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_238" TEXT="testnode 7 4 238" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_239" TEXT="testnode 7 5 239" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_240" TEXT="testnode 7 6 240" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_241" TEXT="testnode 7 7 241" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_242" TEXT="testnode 6 2 242" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_243" TEXT="testnode 7 1 243" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_244" TEXT="testnode 7 2 244" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_245" TEXT="testnode 7 3 245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_246" TEXT="testnode 7 4 246" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_247" TEXT="testnode 7 5 247" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_248" TEXT="testnode 7 6 248" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_249" TEXT="testnode 7 7 249" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_250" TEXT="testnode 6 3 250" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_251" TEXT="testnode 7 1 251" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_252" TEXT="testnode 7 2 252" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_253" TEXT="testnode 7 3 253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_254" TEXT="testnode 7 4 254" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_255" TEXT="testnode 7 5 255" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_256" TEXT="testnode 7 6 256" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_257" TEXT="testnode 7 7 257" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_258" TEXT="testnode 6 4 258" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_259" TEXT="testnode 7 1 259" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_260" TEXT="testnode 7 2 260" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_261" TEXT="testnode 7 3 261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_262" TEXT="testnode 7 4 262" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_263" TEXT="testnode 7 5 263" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_264" TEXT="testnode 7 6 264" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_265" TEXT="testnode 7 7 265" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_266" TEXT="testnode 6 5 266" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_267" TEXT="testnode 7 1 267" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_268" TEXT="testnode 7 2 268" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_269" TEXT="testnode 7 3 269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_270" TEXT="testnode 7 4 270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_271" TEXT="testnode 7 5 271" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_272" TEXT="testnode 7 6 272" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_273" TEXT="testnode 7 7 273" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_274" TEXT="testnode 6 6 274" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_275" TEXT="testnode 7 1 275" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_276" TEXT="testnode 7 2 276" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_277" TEXT="testnode 7 3 277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_278" TEXT="testnode 7 4 278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_279" TEXT="testnode 7 5 279" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_280" TEXT="testnode 7 6 280" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_281" TEXT="testnode 7 7 281" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_282" TEXT="testnode 6 7 282" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_283" TEXT="testnode 7 1 283" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_284" TEXT="testnode 7 2 284" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_285" TEXT="testnode 7 3 285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_286" TEXT="testnode 7 4 286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_287" TEXT="testnode 7 5 287" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_288" TEXT="testnode 7 6 288" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_289" TEXT="testnode 7 7 289" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_290" TEXT="testnode 5 6 290" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_291" TEXT="testnode 6 1 291" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_292" TEXT="testnode 7 1 292" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_293" TEXT="testnode 7 2 293" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_294" TEXT="testnode 7 3 294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_295" TEXT="testnode 7 4 295" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_296" TEXT="testnode 7 5 296" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_297" TEXT="testnode 7 6 297" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_298" TEXT="testnode 7 7 298" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_299" TEXT="testnode 6 2 299" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_300" TEXT="testnode 7 1 300" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_301" TEXT="testnode 7 2 301" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_302" TEXT="testnode 7 3 302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_303" TEXT="testnode 7 4 303" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_304" TEXT="testnode 7 5 304" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_305" TEXT="testnode 7 6 305" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_306" TEXT="testnode 7 7 306" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_307" TEXT="testnode 6 3 307" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_308" TEXT="testnode 7 1 308" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_309" TEXT="testnode 7 2 309" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_310" TEXT="testnode 7 3 310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_311" TEXT="testnode 7 4 311" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_312" TEXT="testnode 7 5 312" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_313" TEXT="testnode 7 6 313" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_314" TEXT="testnode 7 7 314" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_315" TEXT="testnode 6 4 315" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_316" TEXT="testnode 7 1 316" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_317" TEXT="testnode 7 2 317" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_318" TEXT="testnode 7 3 318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_319" TEXT="testnode 7 4 319" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_320" TEXT="testnode 7 5 320" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_321" TEXT="testnode 7 6 321" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_322" TEXT="testnode 7 7 322" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_323" TEXT="testnode 6 5 323" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_324" TEXT="testnode 7 1 324" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_325" TEXT="testnode 7 2 325" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_326" TEXT="testnode 7 3 326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_327" TEXT="testnode 7 4 327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_328" TEXT="testnode 7 5 328" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_329" TEXT="testnode 7 6 329" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_330" TEXT="testnode 7 7 330" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_331" TEXT="testnode 6 6 331" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_332" TEXT="testnode 7 1 332" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_333" TEXT="testnode 7 2 333" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_334" TEXT="testnode 7 3 334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_335" TEXT="testnode 7 4 335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_336" TEXT="testnode 7 5 336" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_337" TEXT="testnode 7 6 337" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_338" TEXT="testnode 7 7 338" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_339" TEXT="testnode 6 7 339" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_340" TEXT="testnode 7 1 340" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_341" TEXT="testnode 7 2 341" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_342" TEXT="testnode 7 3 342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_343" TEXT="testnode 7 4 343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_344" TEXT="testnode 7 5 344" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_345" TEXT="testnode 7 6 345" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_346" TEXT="testnode 7 7 346" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_347" TEXT="testnode 5 7 347" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_348" TEXT="testnode 6 1 348" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_349" TEXT="testnode 7 1 349" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_350" TEXT="testnode 7 2 350" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_351" TEXT="testnode 7 3 351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_352" TEXT="testnode 7 4 352" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_353" TEXT="testnode 7 5 353" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_354" TEXT="testnode 7 6 354" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_355" TEXT="testnode 7 7 355" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_356" TEXT="testnode 6 2 356" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_357" TEXT="testnode 7 1 357" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_358" TEXT="testnode 7 2 358" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_359" TEXT="testnode 7 3 359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_360" TEXT="testnode 7 4 360" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_361" TEXT="testnode 7 5 361" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_362" TEXT="testnode 7 6 362" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_363" TEXT="testnode 7 7 363" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_364" TEXT="testnode 6 3 364" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_365" TEXT="testnode 7 1 365" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_366" TEXT="testnode 7 2 366" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_367" TEXT="testnode 7 3 367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_368" TEXT="testnode 7 4 368" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_369" TEXT="testnode 7 5 369" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_370" TEXT="testnode 7 6 370" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_371" TEXT="testnode 7 7 371" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_372" TEXT="testnode 6 4 372" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_373" TEXT="testnode 7 1 373" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_374" TEXT="testnode 7 2 374" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_375" TEXT="testnode 7 3 375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_376" TEXT="testnode 7 4 376" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_377" TEXT="testnode 7 5 377" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_378" TEXT="testnode 7 6 378" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_379" TEXT="testnode 7 7 379" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_380" TEXT="testnode 6 5 380" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_381" TEXT="testnode 7 1 381" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_382" TEXT="testnode 7 2 382" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_383" TEXT="testnode 7 3 383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_384" TEXT="testnode 7 4 384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_385" TEXT="testnode 7 5 385" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_386" TEXT="testnode 7 6 386" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_387" TEXT="testnode 7 7 387" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_388" TEXT="testnode 6 6 388" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_389" TEXT="testnode 7 1 389" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_390" TEXT="testnode 7 2 390" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_391" TEXT="testnode 7 3 391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_392" TEXT="testnode 7 4 392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_393" TEXT="testnode 7 5 393" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_394" TEXT="testnode 7 6 394" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_395" TEXT="testnode 7 7 395" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_396" TEXT="testnode 6 7 396" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_397" TEXT="testnode 7 1 397" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_398" TEXT="testnode 7 2 398" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_399" TEXT="testnode 7 3 399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_400" TEXT="testnode 7 4 400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_401" TEXT="testnode 7 5 401" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_402" TEXT="testnode 7 6 402" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_403" TEXT="testnode 7 7 403" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_404" TEXT="testnode 4 2 404" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_405" TEXT="testnode 5 1 405" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_406" TEXT="testnode 6 1 406" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_407" TEXT="testnode 7 1 407" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_408" TEXT="testnode 7 2 408" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_409" TEXT="testnode 7 3 409" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_410" TEXT="testnode 7 4 410" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_411" TEXT="testnode 7 5 411" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_412" TEXT="testnode 7 6 412" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_413" TEXT="testnode 7 7 413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_414" TEXT="testnode 6 2 414" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_415" TEXT="testnode 7 1 415" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_416" TEXT="testnode 7 2 416" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_417" TEXT="testnode 7 3 417" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_418" TEXT="testnode 7 4 418" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_419" TEXT="testnode 7 5 419" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_420" TEXT="testnode 7 6 420" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_421" TEXT="testnode 7 7 421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_422" TEXT="testnode 6 3 422" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_423" TEXT="testnode 7 1 423" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_424" TEXT="testnode 7 2 424" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_425" TEXT="testnode 7 3 425" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_426" TEXT="testnode 7 4 426" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_427" TEXT="testnode 7 5 427" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_428" TEXT="testnode 7 6 428" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_429" TEXT="testnode 7 7 429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_430" TEXT="testnode 6 4 430" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_431" TEXT="testnode 7 1 431" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_432" TEXT="testnode 7 2 432" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_433" TEXT="testnode 7 3 433" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_434" TEXT="testnode 7 4 434" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_435" TEXT="testnode 7 5 435" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_436" TEXT="testnode 7 6 436" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_437" TEXT="testnode 7 7 437" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_438" TEXT="testnode 6 5 438" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_439" TEXT="testnode 7 1 439" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_440" TEXT="testnode 7 2 440" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_441" TEXT="testnode 7 3 441" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_442" TEXT="testnode 7 4 442" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_443" TEXT="testnode 7 5 443" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_444" TEXT="testnode 7 6 444" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_445" TEXT="testnode 7 7 445" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_446" TEXT="testnode 6 6 446" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_447" TEXT="testnode 7 1 447" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_448" TEXT="testnode 7 2 448" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_449" TEXT="testnode 7 3 449" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_450" TEXT="testnode 7 4 450" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_451" TEXT="testnode 7 5 451" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_452" TEXT="testnode 7 6 452" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_453" TEXT="testnode 7 7 453" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_454" TEXT="testnode 6 7 454" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_455" TEXT="testnode 7 1 455" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_456" TEXT="testnode 7 2 456" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_457" TEXT="testnode 7 3 457" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_458" TEXT="testnode 7 4 458" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_459" TEXT="testnode 7 5 459" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_460" TEXT="testnode 7 6 460" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_461" TEXT="testnode 7 7 461" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_462" TEXT="testnode 5 2 462" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_463" TEXT="testnode 6 1 463" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_464" TEXT="testnode 7 1 464" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_465" TEXT="testnode 7 2 465" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_466" TEXT="testnode 7 3 466" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_467" TEXT="testnode 7 4 467" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_468" TEXT="testnode 7 5 468" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_469" TEXT="testnode 7 6 469" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_470" TEXT="testnode 7 7 470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_471" TEXT="testnode 6 2 471" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_472" TEXT="testnode 7 1 472" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_473" TEXT="testnode 7 2 473" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_474" TEXT="testnode 7 3 474" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_475" TEXT="testnode 7 4 475" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_476" TEXT="testnode 7 5 476" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_477" TEXT="testnode 7 6 477" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_478" TEXT="testnode 7 7 478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_479" TEXT="testnode 6 3 479" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_480" TEXT="testnode 7 1 480" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_481" TEXT="testnode 7 2 481" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_482" TEXT="testnode 7 3 482" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_483" TEXT="testnode 7 4 483" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_484" TEXT="testnode 7 5 484" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_485" TEXT="testnode 7 6 485" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_486" TEXT="testnode 7 7 486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_487" TEXT="testnode 6 4 487" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_488" TEXT="testnode 7 1 488" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_489" TEXT="testnode 7 2 489" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_490" TEXT="testnode 7 3 490" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_491" TEXT="testnode 7 4 491" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_492" TEXT="testnode 7 5 492" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_493" TEXT="testnode 7 6 493" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_494" TEXT="testnode 7 7 494" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_495" TEXT="testnode 6 5 495" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_496" TEXT="testnode 7 1 496" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_497" TEXT="testnode 7 2 497" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_498" TEXT="testnode 7 3 498" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_499" TEXT="testnode 7 4 499" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_500" TEXT="testnode 7 5 500" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_501" TEXT="testnode 7 6 501" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_502" TEXT="testnode 7 7 502" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_503" TEXT="testnode 6 6 503" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_504" TEXT="testnode 7 1 504" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_505" TEXT="testnode 7 2 505" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_506" TEXT="testnode 7 3 506" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_507" TEXT="testnode 7 4 507" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_508" TEXT="testnode 7 5 508" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_509" TEXT="testnode 7 6 509" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_510" TEXT="testnode 7 7 510" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_511" TEXT="testnode 6 7 511" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_512" TEXT="testnode 7 1 512" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_513" TEXT="testnode 7 2 513" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_514" TEXT="testnode 7 3 514" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_515" TEXT="testnode 7 4 515" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_516" TEXT="testnode 7 5 516" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_517" TEXT="testnode 7 6 517" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_518" TEXT="testnode 7 7 518" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_519" TEXT="testnode 5 3 519" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_520" TEXT="testnode 6 1 520" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_521" TEXT="testnode 7 1 521" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_522" TEXT="testnode 7 2 522" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_523" TEXT="testnode 7 3 523" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_524" TEXT="testnode 7 4 524" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_525" TEXT="testnode 7 5 525" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_526" TEXT="testnode 7 6 526" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_527" TEXT="testnode 7 7 527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_528" TEXT="testnode 6 2 528" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_529" TEXT="testnode 7 1 529" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_530" TEXT="testnode 7 2 530" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_531" TEXT="testnode 7 3 531" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_532" TEXT="testnode 7 4 532" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_533" TEXT="testnode 7 5 533" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_534" TEXT="testnode 7 6 534" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_535" TEXT="testnode 7 7 535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_536" TEXT="testnode 6 3 536" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_537" TEXT="testnode 7 1 537" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_538" TEXT="testnode 7 2 538" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_539" TEXT="testnode 7 3 539" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_540" TEXT="testnode 7 4 540" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_541" TEXT="testnode 7 5 541" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_542" TEXT="testnode 7 6 542" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_543" TEXT="testnode 7 7 543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_544" TEXT="testnode 6 4 544" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_545" TEXT="testnode 7 1 545" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_546" TEXT="testnode 7 2 546" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_547" TEXT="testnode 7 3 547" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_548" TEXT="testnode 7 4 548" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_549" TEXT="testnode 7 5 549" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_550" TEXT="testnode 7 6 550" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_551" TEXT="testnode 7 7 551" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_552" TEXT="testnode 6 5 552" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_553" TEXT="testnode 7 1 553" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_554" TEXT="testnode 7 2 554" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_555" TEXT="testnode 7 3 555" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_556" TEXT="testnode 7 4 556" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_557" TEXT="testnode 7 5 557" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_558" TEXT="testnode 7 6 558" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_559" TEXT="testnode 7 7 559" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_560" TEXT="testnode 6 6 560" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_561" TEXT="testnode 7 1 561" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_562" TEXT="testnode 7 2 562" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_563" TEXT="testnode 7 3 563" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_564" TEXT="testnode 7 4 564" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_565" TEXT="testnode 7 5 565" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_566" TEXT="testnode 7 6 566" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_567" TEXT="testnode 7 7 567" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_568" TEXT="testnode 6 7 568" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_569" TEXT="testnode 7 1 569" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_570" TEXT="testnode 7 2 570" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_571" TEXT="testnode 7 3 571" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_572" TEXT="testnode 7 4 572" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_573" TEXT="testnode 7 5 573" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_574" TEXT="testnode 7 6 574" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_575" TEXT="testnode 7 7 575" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_576" TEXT="testnode 5 4 576" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_577" TEXT="testnode 6 1 577" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_578" TEXT="testnode 7 1 578" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_579" TEXT="testnode 7 2 579" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_580" TEXT="testnode 7 3 580" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_581" TEXT="testnode 7 4 581" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_582" TEXT="testnode 7 5 582" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_583" TEXT="testnode 7 6 583" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_584" TEXT="testnode 7 7 584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_585" TEXT="testnode 6 2 585" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_586" TEXT="testnode 7 1 586" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_587" TEXT="testnode 7 2 587" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_588" TEXT="testnode 7 3 588" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_589" TEXT="testnode 7 4 589" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_590" TEXT="testnode 7 5 590" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_591" TEXT="testnode 7 6 591" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_592" TEXT="testnode 7 7 592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_593" TEXT="testnode 6 3 593" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_594" TEXT="testnode 7 1 594" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_595" TEXT="testnode 7 2 595" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_596" TEXT="testnode 7 3 596" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_597" TEXT="testnode 7 4 597" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_598" TEXT="testnode 7 5 598" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_599" TEXT="testnode 7 6 599" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_600" TEXT="testnode 7 7 600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_601" TEXT="testnode 6 4 601" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_602" TEXT="testnode 7 1 602" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_603" TEXT="testnode 7 2 603" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_604" TEXT="testnode 7 3 604" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_605" TEXT="testnode 7 4 605" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_606" TEXT="testnode 7 5 606" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_607" TEXT="testnode 7 6 607" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_608" TEXT="testnode 7 7 608" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_609" TEXT="testnode 6 5 609" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_610" TEXT="testnode 7 1 610" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_611" TEXT="testnode 7 2 611" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_612" TEXT="testnode 7 3 612" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_613" TEXT="testnode 7 4 613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_614" TEXT="testnode 7 5 614" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_615" TEXT="testnode 7 6 615" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_616" TEXT="testnode 7 7 616" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_617" TEXT="testnode 6 6 617" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_618" TEXT="testnode 7 1 618" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_619" TEXT="testnode 7 2 619" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_620" TEXT="testnode 7 3 620" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_621" TEXT="testnode 7 4 621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_622" TEXT="testnode 7 5 622" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_623" TEXT="testnode 7 6 623" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_624" TEXT="testnode 7 7 624" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_625" TEXT="testnode 6 7 625" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_626" TEXT="testnode 7 1 626" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_627" TEXT="testnode 7 2 627" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_628" TEXT="testnode 7 3 628" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_629" TEXT="testnode 7 4 629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_630" TEXT="testnode 7 5 630" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_631" TEXT="testnode 7 6 631" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_632" TEXT="testnode 7 7 632" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_633" TEXT="testnode 5 5 633" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_634" TEXT="testnode 6 1 634" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_635" TEXT="testnode 7 1 635" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_636" TEXT="testnode 7 2 636" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_637" TEXT="testnode 7 3 637" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_638" TEXT="testnode 7 4 638" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_639" TEXT="testnode 7 5 639" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_640" TEXT="testnode 7 6 640" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_641" TEXT="testnode 7 7 641" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_642" TEXT="testnode 6 2 642" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_643" TEXT="testnode 7 1 643" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_644" TEXT="testnode 7 2 644" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_645" TEXT="testnode 7 3 645" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_646" TEXT="testnode 7 4 646" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_647" TEXT="testnode 7 5 647" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_648" TEXT="testnode 7 6 648" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_649" TEXT="testnode 7 7 649" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_650" TEXT="testnode 6 3 650" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_651" TEXT="testnode 7 1 651" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_652" TEXT="testnode 7 2 652" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_653" TEXT="testnode 7 3 653" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_654" TEXT="testnode 7 4 654" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_655" TEXT="testnode 7 5 655" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_656" TEXT="testnode 7 6 656" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_657" TEXT="testnode 7 7 657" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_658" TEXT="testnode 6 4 658" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_659" TEXT="testnode 7 1 659" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_660" TEXT="testnode 7 2 660" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_661" TEXT="testnode 7 3 661" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_662" TEXT="testnode 7 4 662" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_663" TEXT="testnode 7 5 663" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_664" TEXT="testnode 7 6 664" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_665" TEXT="testnode 7 7 665" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_666" TEXT="testnode 6 5 666" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_667" TEXT="testnode 7 1 667" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_668" TEXT="testnode 7 2 668" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_669" TEXT="testnode 7 3 669" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_670" TEXT="testnode 7 4 670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_671" TEXT="testnode 7 5 671" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_672" TEXT="testnode 7 6 672" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_673" TEXT="testnode 7 7 673" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_674" TEXT="testnode 6 6 674" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_675" TEXT="testnode 7 1 675" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_676" TEXT="testnode 7 2 676" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_677" TEXT="testnode 7 3 677" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_678" TEXT="testnode 7 4 678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_679" TEXT="testnode 7 5 679" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_680" TEXT="testnode 7 6 680" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_681" TEXT="testnode 7 7 681" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_682" TEXT="testnode 6 7 682" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_683" TEXT="testnode 7 1 683" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_684" TEXT="testnode 7 2 684" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_685" TEXT="testnode 7 3 685" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_686" TEXT="testnode 7 4 686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_687" TEXT="testnode 7 5 687" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_688" TEXT="testnode 7 6 688" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_689" TEXT="testnode 7 7 689" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_690" TEXT="testnode 5 6 690" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_691" TEXT="testnode 6 1 691" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_692" TEXT="testnode 7 1 692" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_693" TEXT="testnode 7 2 693" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_694" TEXT="testnode 7 3 694" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_695" TEXT="testnode 7 4 695" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_696" TEXT="testnode 7 5 696" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_697" TEXT="testnode 7 6 697" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_698" TEXT="testnode 7 7 698" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_699" TEXT="testnode 6 2 699" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_700" TEXT="testnode 7 1 700" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_701" TEXT="testnode 7 2 701" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_702" TEXT="testnode 7 3 702" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_703" TEXT="testnode 7 4 703" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_704" TEXT="testnode 7 5 704" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_705" TEXT="testnode 7 6 705" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_706" TEXT="testnode 7 7 706" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_707" TEXT="testnode 6 3 707" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_708" TEXT="testnode 7 1 708" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_709" TEXT="testnode 7 2 709" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_710" TEXT="testnode 7 3 710" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_711" TEXT="testnode 7 4 711" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_712" TEXT="testnode 7 5 712" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_713" TEXT="testnode 7 6 713" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_714" TEXT="testnode 7 7 714" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_715" TEXT="testnode 6 4 715" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_716" TEXT="testnode 7 1 716" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_717" TEXT="testnode 7 2 717" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_718" TEXT="testnode 7 3 718" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_719" TEXT="testnode 7 4 719" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_720" TEXT="testnode 7 5 720" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_721" TEXT="testnode 7 6 721" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_722" TEXT="testnode 7 7 722" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_723" TEXT="testnode 6 5 723" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_724" TEXT="testnode 7 1 724" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_725" TEXT="testnode 7 2 725" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_726" TEXT="testnode 7 3 726" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_727" TEXT="testnode 7 4 727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_728" TEXT="testnode 7 5 728" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_729" TEXT="testnode 7 6 729" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_730" TEXT="testnode 7 7 730" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_731" TEXT="testnode 6 6 731" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_732" TEXT="testnode 7 1 732" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_733" TEXT="testnode 7 2 733" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_734" TEXT="testnode 7 3 734" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_735" TEXT="testnode 7 4 735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_736" TEXT="testnode 7 5 736" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_737" TEXT="testnode 7 6 737" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_738" TEXT="testnode 7 7 738" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_739" TEXT="testnode 6 7 739" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_740" TEXT="testnode 7 1 740" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_741" TEXT="testnode 7 2 741" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_742" TEXT="testnode 7 3 742" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_743" TEXT="testnode 7 4 743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_744" TEXT="testnode 7 5 744" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_745" TEXT="testnode 7 6 745" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_746" TEXT="testnode 7 7 746" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_747" TEXT="testnode 5 7 747" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_748" TEXT="testnode 6 1 748" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_749" TEXT="testnode 7 1 749" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_750" TEXT="testnode 7 2 750" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_751" TEXT="testnode 7 3 751" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_752" TEXT="testnode 7 4 752" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_753" TEXT="testnode 7 5 753" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_754" TEXT="testnode 7 6 754" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_755" TEXT="testnode 7 7 755" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_756" TEXT="testnode 6 2 756" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_757" TEXT="testnode 7 1 757" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_758" TEXT="testnode 7 2 758" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_759" TEXT="testnode 7 3 759" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_760" TEXT="testnode 7 4 760" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_761" TEXT="testnode 7 5 761" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_762" TEXT="testnode 7 6 762" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_763" TEXT="testnode 7 7 763" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_764" TEXT="testnode 6 3 764" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_765" TEXT="testnode 7 1 765" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_766" TEXT="testnode 7 2 766" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_767" TEXT="testnode 7 3 767" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_768" TEXT="testnode 7 4 768" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_769" TEXT="testnode 7 5 769" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_770" TEXT="testnode 7 6 770" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_771" TEXT="testnode 7 7 771" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_772" TEXT="testnode 6 4 772" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_773" TEXT="testnode 7 1 773" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_774" TEXT="testnode 7 2 774" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_775" TEXT="testnode 7 3 775" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_776" TEXT="testnode 7 4 776" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_777" TEXT="testnode 7 5 777" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_778" TEXT="testnode 7 6 778" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_779" TEXT="testnode 7 7 779" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_780" TEXT="testnode 6 5 780" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_781" TEXT="testnode 7 1 781" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_782" TEXT="testnode 7 2 782" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_783" TEXT="testnode 7 3 783" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_784" TEXT="testnode 7 4 784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_785" TEXT="testnode 7 5 785" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_786" TEXT="testnode 7 6 786" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_787" TEXT="testnode 7 7 787" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_788" TEXT="testnode 6 6 788" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_789" TEXT="testnode 7 1 789" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_790" TEXT="testnode 7 2 790" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_791" TEXT="testnode 7 3 791" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_792" TEXT="testnode 7 4 792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_793" TEXT="testnode 7 5 793" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_794" TEXT="testnode 7 6 794" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_795" TEXT="testnode 7 7 795" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_796" TEXT="testnode 6 7 796" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_797" TEXT="testnode 7 1 797" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_798" TEXT="testnode 7 2 798" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_799" TEXT="testnode 7 3 799" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_800" TEXT="testnode 7 4 800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_801" TEXT="testnode 7 5 801" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_802" TEXT="testnode 7 6 802" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_803" TEXT="testnode 7 7 803" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_804" TEXT="testnode 4 3 804" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_805" TEXT="testnode 5 1 805" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_806" TEXT="testnode 6 1 806" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_807" TEXT="testnode 7 1 807" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_808" TEXT="testnode 7 2 808" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_809" TEXT="testnode 7 3 809" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_810" TEXT="testnode 7 4 810" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_811" TEXT="testnode 7 5 811" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_812" TEXT="testnode 7 6 812" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_813" TEXT="testnode 7 7 813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_814" TEXT="testnode 6 2 814" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_815" TEXT="testnode 7 1 815" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_816" TEXT="testnode 7 2 816" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_817" TEXT="testnode 7 3 817" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_818" TEXT="testnode 7 4 818" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_819" TEXT="testnode 7 5 819" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_820" TEXT="testnode 7 6 820" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_821" TEXT="testnode 7 7 821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_822" TEXT="testnode 6 3 822" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_823" TEXT="testnode 7 1 823" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_824" TEXT="testnode 7 2 824" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_825" TEXT="testnode 7 3 825" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_826" TEXT="testnode 7 4 826" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_827" TEXT="testnode 7 5 827" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_828" TEXT="testnode 7 6 828" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_829" TEXT="testnode 7 7 829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_830" TEXT="testnode 6 4 830" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_831" TEXT="testnode 7 1 831" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_832" TEXT="testnode 7 2 832" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_833" TEXT="testnode 7 3 833" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_834" TEXT="testnode 7 4 834" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_835" TEXT="testnode 7 5 835" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_836" TEXT="testnode 7 6 836" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_837" TEXT="testnode 7 7 837" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_838" TEXT="testnode 6 5 838" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_839" TEXT="testnode 7 1 839" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_840" TEXT="testnode 7 2 840" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_841" TEXT="testnode 7 3 841" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_842" TEXT="testnode 7 4 842" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_843" TEXT="testnode 7 5 843" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_844" TEXT="testnode 7 6 844" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_845" TEXT="testnode 7 7 845" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_846" TEXT="testnode 6 6 846" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_847" TEXT="testnode 7 1 847" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_848" TEXT="testnode 7 2 848" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_849" TEXT="testnode 7 3 849" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_850" TEXT="testnode 7 4 850" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_851" TEXT="testnode 7 5 851" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_852" TEXT="testnode 7 6 852" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_853" TEXT="testnode 7 7 853" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_854" TEXT="testnode 6 7 854" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_855" TEXT="testnode 7 1 855" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_856" TEXT="testnode 7 2 856" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_857" TEXT="testnode 7 3 857" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_858" TEXT="testnode 7 4 858" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_859" TEXT="testnode 7 5 859" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_860" TEXT="testnode 7 6 860" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_861" TEXT="testnode 7 7 861" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_862" TEXT="testnode 5 2 862" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_863" TEXT="testnode 6 1 863" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_864" TEXT="testnode 7 1 864" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_865" TEXT="testnode 7 2 865" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_866" TEXT="testnode 7 3 866" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_867" TEXT="testnode 7 4 867" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_868" TEXT="testnode 7 5 868" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_869" TEXT="testnode 7 6 869" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_870" TEXT="testnode 7 7 870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_871" TEXT="testnode 6 2 871" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_872" TEXT="testnode 7 1 872" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_873" TEXT="testnode 7 2 873" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_874" TEXT="testnode 7 3 874" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_875" TEXT="testnode 7 4 875" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_876" TEXT="testnode 7 5 876" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_877" TEXT="testnode 7 6 877" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_878" TEXT="testnode 7 7 878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_879" TEXT="testnode 6 3 879" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_880" TEXT="testnode 7 1 880" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_881" TEXT="testnode 7 2 881" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_882" TEXT="testnode 7 3 882" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_883" TEXT="testnode 7 4 883" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_884" TEXT="testnode 7 5 884" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_885" TEXT="testnode 7 6 885" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_886" TEXT="testnode 7 7 886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_887" TEXT="testnode 6 4 887" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_888" TEXT="testnode 7 1 888" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_889" TEXT="testnode 7 2 889" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_890" TEXT="testnode 7 3 890" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_891" TEXT="testnode 7 4 891" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_892" TEXT="testnode 7 5 892" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_893" TEXT="testnode 7 6 893" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_894" TEXT="testnode 7 7 894" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_895" TEXT="testnode 6 5 895" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_896" TEXT="testnode 7 1 896" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_897" TEXT="testnode 7 2 897" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_898" TEXT="testnode 7 3 898" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_899" TEXT="testnode 7 4 899" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_900" TEXT="testnode 7 5 900" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_901" TEXT="testnode 7 6 901" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_902" TEXT="testnode 7 7 902" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_903" TEXT="testnode 6 6 903" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_904" TEXT="testnode 7 1 904" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_905" TEXT="testnode 7 2 905" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_906" TEXT="testnode 7 3 906" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_907" TEXT="testnode 7 4 907" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_908" TEXT="testnode 7 5 908" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_909" TEXT="testnode 7 6 909" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_910" TEXT="testnode 7 7 910" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_911" TEXT="testnode 6 7 911" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_912" TEXT="testnode 7 1 912" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_913" TEXT="testnode 7 2 913" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_914" TEXT="testnode 7 3 914" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_915" TEXT="testnode 7 4 915" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_916" TEXT="testnode 7 5 916" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_917" TEXT="testnode 7 6 917" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_918" TEXT="testnode 7 7 918" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_919" TEXT="testnode 5 3 919" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_920" TEXT="testnode 6 1 920" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_921" TEXT="testnode 7 1 921" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_922" TEXT="testnode 7 2 922" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_923" TEXT="testnode 7 3 923" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_924" TEXT="testnode 7 4 924" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_925" TEXT="testnode 7 5 925" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_926" TEXT="testnode 7 6 926" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_927" TEXT="testnode 7 7 927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_928" TEXT="testnode 6 2 928" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_929" TEXT="testnode 7 1 929" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_930" TEXT="testnode 7 2 930" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_931" TEXT="testnode 7 3 931" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_932" TEXT="testnode 7 4 932" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_933" TEXT="testnode 7 5 933" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_934" TEXT="testnode 7 6 934" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_935" TEXT="testnode 7 7 935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_936" TEXT="testnode 6 3 936" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_937" TEXT="testnode 7 1 937" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_938" TEXT="testnode 7 2 938" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_939" TEXT="testnode 7 3 939" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_940" TEXT="testnode 7 4 940" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_941" TEXT="testnode 7 5 941" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_942" TEXT="testnode 7 6 942" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_943" TEXT="testnode 7 7 943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_944" TEXT="testnode 6 4 944" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_945" TEXT="testnode 7 1 945" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_946" TEXT="testnode 7 2 946" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_947" TEXT="testnode 7 3 947" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_948" TEXT="testnode 7 4 948" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_949" TEXT="testnode 7 5 949" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_950" TEXT="testnode 7 6 950" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_951" TEXT="testnode 7 7 951" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_952" TEXT="testnode 6 5 952" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_953" TEXT="testnode 7 1 953" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_954" TEXT="testnode 7 2 954" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_955" TEXT="testnode 7 3 955" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_956" TEXT="testnode 7 4 956" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_957" TEXT="testnode 7 5 957" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_958" TEXT="testnode 7 6 958" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_959" TEXT="testnode 7 7 959" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_960" TEXT="testnode 6 6 960" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_961" TEXT="testnode 7 1 961" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_962" TEXT="testnode 7 2 962" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_963" TEXT="testnode 7 3 963" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_964" TEXT="testnode 7 4 964" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_965" TEXT="testnode 7 5 965" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_966" TEXT="testnode 7 6 966" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_967" TEXT="testnode 7 7 967" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_968" TEXT="testnode 6 7 968" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_969" TEXT="testnode 7 1 969" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_970" TEXT="testnode 7 2 970" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_971" TEXT="testnode 7 3 971" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_972" TEXT="testnode 7 4 972" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_973" TEXT="testnode 7 5 973" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_974" TEXT="testnode 7 6 974" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_975" TEXT="testnode 7 7 975" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_976" TEXT="testnode 5 4 976" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_977" TEXT="testnode 6 1 977" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_978" TEXT="testnode 7 1 978" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_979" TEXT="testnode 7 2 979" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_980" TEXT="testnode 7 3 980" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_981" TEXT="testnode 7 4 981" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_982" TEXT="testnode 7 5 982" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_983" TEXT="testnode 7 6 983" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_984" TEXT="testnode 7 7 984" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_985" TEXT="testnode 6 2 985" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_986" TEXT="testnode 7 1 986" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_987" TEXT="testnode 7 2 987" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_988" TEXT="testnode 7 3 988" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_989" TEXT="testnode 7 4 989" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_990" TEXT="testnode 7 5 990" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_991" TEXT="testnode 7 6 991" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_992" TEXT="testnode 7 7 992" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_993" TEXT="testnode 6 3 993" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_994" TEXT="testnode 7 1 994" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_995" TEXT="testnode 7 2 995" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_996" TEXT="testnode 7 3 996" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_997" TEXT="testnode 7 4 997" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_998" TEXT="testnode 7 5 998" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_999" TEXT="testnode 7 6 999" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1000" TEXT="testnode 7 7 1000" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1001" TEXT="testnode 6 4 1001" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1002" TEXT="testnode 7 1 1002" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1003" TEXT="testnode 7 2 1003" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1004" TEXT="testnode 7 3 1004" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1005" TEXT="testnode 7 4 1005" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1006" TEXT="testnode 7 5 1006" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1007" TEXT="testnode 7 6 1007" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1008" TEXT="testnode 7 7 1008" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1009" TEXT="testnode 6 5 1009" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1010" TEXT="testnode 7 1 1010" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1011" TEXT="testnode 7 2 1011" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1012" TEXT="testnode 7 3 1012" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1013" TEXT="testnode 7 4 1013" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1014" TEXT="testnode 7 5 1014" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1015" TEXT="testnode 7 6 1015" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1016" TEXT="testnode 7 7 1016" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1017" TEXT="testnode 6 6 1017" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1018" TEXT="testnode 7 1 1018" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1019" TEXT="testnode 7 2 1019" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1020" TEXT="testnode 7 3 1020" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1021" TEXT="testnode 7 4 1021" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1022" TEXT="testnode 7 5 1022" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1023" TEXT="testnode 7 6 1023" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1024" TEXT="testnode 7 7 1024" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1025" TEXT="testnode 6 7 1025" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1026" TEXT="testnode 7 1 1026" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1027" TEXT="testnode 7 2 1027" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1028" TEXT="testnode 7 3 1028" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1029" TEXT="testnode 7 4 1029" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1030" TEXT="testnode 7 5 1030" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1031" TEXT="testnode 7 6 1031" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1032" TEXT="testnode 7 7 1032" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1033" TEXT="testnode 5 5 1033" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1034" TEXT="testnode 6 1 1034" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1035" TEXT="testnode 7 1 1035" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1036" TEXT="testnode 7 2 1036" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1037" TEXT="testnode 7 3 1037" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1038" TEXT="testnode 7 4 1038" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1039" TEXT="testnode 7 5 1039" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1040" TEXT="testnode 7 6 1040" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1041" TEXT="testnode 7 7 1041" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1042" TEXT="testnode 6 2 1042" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1043" TEXT="testnode 7 1 1043" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1044" TEXT="testnode 7 2 1044" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1045" TEXT="testnode 7 3 1045" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1046" TEXT="testnode 7 4 1046" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1047" TEXT="testnode 7 5 1047" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1048" TEXT="testnode 7 6 1048" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1049" TEXT="testnode 7 7 1049" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1050" TEXT="testnode 6 3 1050" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1051" TEXT="testnode 7 1 1051" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1052" TEXT="testnode 7 2 1052" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1053" TEXT="testnode 7 3 1053" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1054" TEXT="testnode 7 4 1054" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1055" TEXT="testnode 7 5 1055" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1056" TEXT="testnode 7 6 1056" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1057" TEXT="testnode 7 7 1057" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1058" TEXT="testnode 6 4 1058" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1059" TEXT="testnode 7 1 1059" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1060" TEXT="testnode 7 2 1060" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1061" TEXT="testnode 7 3 1061" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1062" TEXT="testnode 7 4 1062" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1063" TEXT="testnode 7 5 1063" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1064" TEXT="testnode 7 6 1064" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1065" TEXT="testnode 7 7 1065" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1066" TEXT="testnode 6 5 1066" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1067" TEXT="testnode 7 1 1067" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1068" TEXT="testnode 7 2 1068" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1069" TEXT="testnode 7 3 1069" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1070" TEXT="testnode 7 4 1070" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1071" TEXT="testnode 7 5 1071" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1072" TEXT="testnode 7 6 1072" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1073" TEXT="testnode 7 7 1073" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1074" TEXT="testnode 6 6 1074" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1075" TEXT="testnode 7 1 1075" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1076" TEXT="testnode 7 2 1076" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1077" TEXT="testnode 7 3 1077" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1078" TEXT="testnode 7 4 1078" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1079" TEXT="testnode 7 5 1079" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1080" TEXT="testnode 7 6 1080" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1081" TEXT="testnode 7 7 1081" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1082" TEXT="testnode 6 7 1082" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1083" TEXT="testnode 7 1 1083" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1084" TEXT="testnode 7 2 1084" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1085" TEXT="testnode 7 3 1085" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1086" TEXT="testnode 7 4 1086" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1087" TEXT="testnode 7 5 1087" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1088" TEXT="testnode 7 6 1088" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1089" TEXT="testnode 7 7 1089" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1090" TEXT="testnode 5 6 1090" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1091" TEXT="testnode 6 1 1091" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1092" TEXT="testnode 7 1 1092" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1093" TEXT="testnode 7 2 1093" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1094" TEXT="testnode 7 3 1094" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1095" TEXT="testnode 7 4 1095" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1096" TEXT="testnode 7 5 1096" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1097" TEXT="testnode 7 6 1097" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1098" TEXT="testnode 7 7 1098" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1099" TEXT="testnode 6 2 1099" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1100" TEXT="testnode 7 1 1100" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1101" TEXT="testnode 7 2 1101" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1102" TEXT="testnode 7 3 1102" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1103" TEXT="testnode 7 4 1103" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1104" TEXT="testnode 7 5 1104" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1105" TEXT="testnode 7 6 1105" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1106" TEXT="testnode 7 7 1106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1107" TEXT="testnode 6 3 1107" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1108" TEXT="testnode 7 1 1108" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1109" TEXT="testnode 7 2 1109" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1110" TEXT="testnode 7 3 1110" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1111" TEXT="testnode 7 4 1111" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1112" TEXT="testnode 7 5 1112" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1113" TEXT="testnode 7 6 1113" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1114" TEXT="testnode 7 7 1114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1115" TEXT="testnode 6 4 1115" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1116" TEXT="testnode 7 1 1116" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1117" TEXT="testnode 7 2 1117" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1118" TEXT="testnode 7 3 1118" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1119" TEXT="testnode 7 4 1119" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1120" TEXT="testnode 7 5 1120" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1121" TEXT="testnode 7 6 1121" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1122" TEXT="testnode 7 7 1122" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1123" TEXT="testnode 6 5 1123" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1124" TEXT="testnode 7 1 1124" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1125" TEXT="testnode 7 2 1125" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1126" TEXT="testnode 7 3 1126" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1127" TEXT="testnode 7 4 1127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1128" TEXT="testnode 7 5 1128" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1129" TEXT="testnode 7 6 1129" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1130" TEXT="testnode 7 7 1130" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1131" TEXT="testnode 6 6 1131" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1132" TEXT="testnode 7 1 1132" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1133" TEXT="testnode 7 2 1133" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1134" TEXT="testnode 7 3 1134" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1135" TEXT="testnode 7 4 1135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1136" TEXT="testnode 7 5 1136" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1137" TEXT="testnode 7 6 1137" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1138" TEXT="testnode 7 7 1138" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1139" TEXT="testnode 6 7 1139" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1140" TEXT="testnode 7 1 1140" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1141" TEXT="testnode 7 2 1141" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1142" TEXT="testnode 7 3 1142" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1143" TEXT="testnode 7 4 1143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1144" TEXT="testnode 7 5 1144" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1145" TEXT="testnode 7 6 1145" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1146" TEXT="testnode 7 7 1146" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1147" TEXT="testnode 5 7 1147" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1148" TEXT="testnode 6 1 1148" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1149" TEXT="testnode 7 1 1149" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1150" TEXT="testnode 7 2 1150" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1151" TEXT="testnode 7 3 1151" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1152" TEXT="testnode 7 4 1152" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1153" TEXT="testnode 7 5 1153" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1154" TEXT="testnode 7 6 1154" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1155" TEXT="testnode 7 7 1155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1156" TEXT="testnode 6 2 1156" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1157" TEXT="testnode 7 1 1157" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1158" TEXT="testnode 7 2 1158" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1159" TEXT="testnode 7 3 1159" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1160" TEXT="testnode 7 4 1160" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1161" TEXT="testnode 7 5 1161" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1162" TEXT="testnode 7 6 1162" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1163" TEXT="testnode 7 7 1163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1164" TEXT="testnode 6 3 1164" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1165" TEXT="testnode 7 1 1165" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1166" TEXT="testnode 7 2 1166" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1167" TEXT="testnode 7 3 1167" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1168" TEXT="testnode 7 4 1168" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1169" TEXT="testnode 7 5 1169" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1170" TEXT="testnode 7 6 1170" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1171" TEXT="testnode 7 7 1171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1172" TEXT="testnode 6 4 1172" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1173" TEXT="testnode 7 1 1173" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1174" TEXT="testnode 7 2 1174" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1175" TEXT="testnode 7 3 1175" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1176" TEXT="testnode 7 4 1176" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1177" TEXT="testnode 7 5 1177" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1178" TEXT="testnode 7 6 1178" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1179" TEXT="testnode 7 7 1179" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1180" TEXT="testnode 6 5 1180" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1181" TEXT="testnode 7 1 1181" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1182" TEXT="testnode 7 2 1182" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1183" TEXT="testnode 7 3 1183" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1184" TEXT="testnode 7 4 1184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1185" TEXT="testnode 7 5 1185" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1186" TEXT="testnode 7 6 1186" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1187" TEXT="testnode 7 7 1187" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1188" TEXT="testnode 6 6 1188" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1189" TEXT="testnode 7 1 1189" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1190" TEXT="testnode 7 2 1190" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1191" TEXT="testnode 7 3 1191" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1192" TEXT="testnode 7 4 1192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1193" TEXT="testnode 7 5 1193" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1194" TEXT="testnode 7 6 1194" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1195" TEXT="testnode 7 7 1195" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1196" TEXT="testnode 6 7 1196" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1197" TEXT="testnode 7 1 1197" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1198" TEXT="testnode 7 2 1198" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1199" TEXT="testnode 7 3 1199" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1200" TEXT="testnode 7 4 1200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1201" TEXT="testnode 7 5 1201" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1202" TEXT="testnode 7 6 1202" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1203" TEXT="testnode 7 7 1203" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1204" TEXT="testnode 4 4 1204" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_1205" TEXT="testnode 5 1 1205" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1206" TEXT="testnode 6 1 1206" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1207" TEXT="testnode 7 1 1207" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1208" TEXT="testnode 7 2 1208" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1209" TEXT="testnode 7 3 1209" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1210" TEXT="testnode 7 4 1210" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1211" TEXT="testnode 7 5 1211" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1212" TEXT="testnode 7 6 1212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1213" TEXT="testnode 7 7 1213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1214" TEXT="testnode 6 2 1214" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1215" TEXT="testnode 7 1 1215" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1216" TEXT="testnode 7 2 1216" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1217" TEXT="testnode 7 3 1217" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1218" TEXT="testnode 7 4 1218" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1219" TEXT="testnode 7 5 1219" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1220" TEXT="testnode 7 6 1220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1221" TEXT="testnode 7 7 1221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1222" TEXT="testnode 6 3 1222" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1223" TEXT="testnode 7 1 1223" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1224" TEXT="testnode 7 2 1224" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1225" TEXT="testnode 7 3 1225" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1226" TEXT="testnode 7 4 1226" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1227" TEXT="testnode 7 5 1227" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1228" TEXT="testnode 7 6 1228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1229" TEXT="testnode 7 7 1229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1230" TEXT="testnode 6 4 1230" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1231" TEXT="testnode 7 1 1231" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1232" TEXT="testnode 7 2 1232" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1233" TEXT="testnode 7 3 1233" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1234" TEXT="testnode 7 4 1234" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1235" TEXT="testnode 7 5 1235" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1236" TEXT="testnode 7 6 1236" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1237" TEXT="testnode 7 7 1237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1238" TEXT="testnode 6 5 1238" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1239" TEXT="testnode 7 1 1239" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1240" TEXT="testnode 7 2 1240" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1241" TEXT="testnode 7 3 1241" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1242" TEXT="testnode 7 4 1242" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1243" TEXT="testnode 7 5 1243" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1244" TEXT="testnode 7 6 1244" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1245" TEXT="testnode 7 7 1245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1246" TEXT="testnode 6 6 1246" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1247" TEXT="testnode 7 1 1247" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1248" TEXT="testnode 7 2 1248" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1249" TEXT="testnode 7 3 1249" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1250" TEXT="testnode 7 4 1250" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1251" TEXT="testnode 7 5 1251" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1252" TEXT="testnode 7 6 1252" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1253" TEXT="testnode 7 7 1253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1254" TEXT="testnode 6 7 1254" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1255" TEXT="testnode 7 1 1255" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1256" TEXT="testnode 7 2 1256" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1257" TEXT="testnode 7 3 1257" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1258" TEXT="testnode 7 4 1258" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1259" TEXT="testnode 7 5 1259" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1260" TEXT="testnode 7 6 1260" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1261" TEXT="testnode 7 7 1261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1262" TEXT="testnode 5 2 1262" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1263" TEXT="testnode 6 1 1263" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1264" TEXT="testnode 7 1 1264" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1265" TEXT="testnode 7 2 1265" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1266" TEXT="testnode 7 3 1266" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1267" TEXT="testnode 7 4 1267" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1268" TEXT="testnode 7 5 1268" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1269" TEXT="testnode 7 6 1269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1270" TEXT="testnode 7 7 1270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1271" TEXT="testnode 6 2 1271" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1272" TEXT="testnode 7 1 1272" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1273" TEXT="testnode 7 2 1273" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1274" TEXT="testnode 7 3 1274" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1275" TEXT="testnode 7 4 1275" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1276" TEXT="testnode 7 5 1276" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1277" TEXT="testnode 7 6 1277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1278" TEXT="testnode 7 7 1278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1279" TEXT="testnode 6 3 1279" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1280" TEXT="testnode 7 1 1280" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1281" TEXT="testnode 7 2 1281" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1282" TEXT="testnode 7 3 1282" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1283" TEXT="testnode 7 4 1283" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1284" TEXT="testnode 7 5 1284" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1285" TEXT="testnode 7 6 1285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1286" TEXT="testnode 7 7 1286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1287" TEXT="testnode 6 4 1287" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1288" TEXT="testnode 7 1 1288" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1289" TEXT="testnode 7 2 1289" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1290" TEXT="testnode 7 3 1290" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1291" TEXT="testnode 7 4 1291" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1292" TEXT="testnode 7 5 1292" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1293" TEXT="testnode 7 6 1293" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1294" TEXT="testnode 7 7 1294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1295" TEXT="testnode 6 5 1295" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1296" TEXT="testnode 7 1 1296" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1297" TEXT="testnode 7 2 1297" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1298" TEXT="testnode 7 3 1298" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1299" TEXT="testnode 7 4 1299" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1300" TEXT="testnode 7 5 1300" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1301" TEXT="testnode 7 6 1301" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1302" TEXT="testnode 7 7 1302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1303" TEXT="testnode 6 6 1303" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1304" TEXT="testnode 7 1 1304" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1305" TEXT="testnode 7 2 1305" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1306" TEXT="testnode 7 3 1306" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1307" TEXT="testnode 7 4 1307" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1308" TEXT="testnode 7 5 1308" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1309" TEXT="testnode 7 6 1309" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1310" TEXT="testnode 7 7 1310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1311" TEXT="testnode 6 7 1311" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1312" TEXT="testnode 7 1 1312" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1313" TEXT="testnode 7 2 1313" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1314" TEXT="testnode 7 3 1314" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1315" TEXT="testnode 7 4 1315" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1316" TEXT="testnode 7 5 1316" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1317" TEXT="testnode 7 6 1317" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1318" TEXT="testnode 7 7 1318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1319" TEXT="testnode 5 3 1319" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1320" TEXT="testnode 6 1 1320" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1321" TEXT="testnode 7 1 1321" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1322" TEXT="testnode 7 2 1322" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1323" TEXT="testnode 7 3 1323" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1324" TEXT="testnode 7 4 1324" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1325" TEXT="testnode 7 5 1325" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1326" TEXT="testnode 7 6 1326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1327" TEXT="testnode 7 7 1327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1328" TEXT="testnode 6 2 1328" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1329" TEXT="testnode 7 1 1329" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1330" TEXT="testnode 7 2 1330" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1331" TEXT="testnode 7 3 1331" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1332" TEXT="testnode 7 4 1332" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1333" TEXT="testnode 7 5 1333" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1334" TEXT="testnode 7 6 1334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1335" TEXT="testnode 7 7 1335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1336" TEXT="testnode 6 3 1336" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1337" TEXT="testnode 7 1 1337" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1338" TEXT="testnode 7 2 1338" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1339" TEXT="testnode 7 3 1339" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1340" TEXT="testnode 7 4 1340" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1341" TEXT="testnode 7 5 1341" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1342" TEXT="testnode 7 6 1342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1343" TEXT="testnode 7 7 1343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1344" TEXT="testnode 6 4 1344" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1345" TEXT="testnode 7 1 1345" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1346" TEXT="testnode 7 2 1346" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1347" TEXT="testnode 7 3 1347" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1348" TEXT="testnode 7 4 1348" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1349" TEXT="testnode 7 5 1349" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1350" TEXT="testnode 7 6 1350" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1351" TEXT="testnode 7 7 1351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1352" TEXT="testnode 6 5 1352" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1353" TEXT="testnode 7 1 1353" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1354" TEXT="testnode 7 2 1354" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1355" TEXT="testnode 7 3 1355" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1356" TEXT="testnode 7 4 1356" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1357" TEXT="testnode 7 5 1357" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1358" TEXT="testnode 7 6 1358" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1359" TEXT="testnode 7 7 1359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1360" TEXT="testnode 6 6 1360" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1361" TEXT="testnode 7 1 1361" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1362" TEXT="testnode 7 2 1362" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1363" TEXT="testnode 7 3 1363" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1364" TEXT="testnode 7 4 1364" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1365" TEXT="testnode 7 5 1365" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1366" TEXT="testnode 7 6 1366" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1367" TEXT="testnode 7 7 1367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1368" TEXT="testnode 6 7 1368" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1369" TEXT="testnode 7 1 1369" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1370" TEXT="testnode 7 2 1370" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1371" TEXT="testnode 7 3 1371" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1372" TEXT="testnode 7 4 1372" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1373" TEXT="testnode 7 5 1373" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1374" TEXT="testnode 7 6 1374" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1375" TEXT="testnode 7 7 1375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1376" TEXT="testnode 5 4 1376" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1377" TEXT="testnode 6 1 1377" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1378" TEXT="testnode 7 1 1378" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1379" TEXT="testnode 7 2 1379" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1380" TEXT="testnode 7 3 1380" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1381" TEXT="testnode 7 4 1381" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1382" TEXT="testnode 7 5 1382" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1383" TEXT="testnode 7 6 1383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1384" TEXT="testnode 7 7 1384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1385" TEXT="testnode 6 2 1385" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1386" TEXT="testnode 7 1 1386" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1387" TEXT="testnode 7 2 1387" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1388" TEXT="testnode 7 3 1388" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1389" TEXT="testnode 7 4 1389" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1390" TEXT="testnode 7 5 1390" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1391" TEXT="testnode 7 6 1391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1392" TEXT="testnode 7 7 1392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1393" TEXT="testnode 6 3 1393" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1394" TEXT="testnode 7 1 1394" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1395" TEXT="testnode 7 2 1395" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1396" TEXT="testnode 7 3 1396" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1397" TEXT="testnode 7 4 1397" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1398" TEXT="testnode 7 5 1398" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1399" TEXT="testnode 7 6 1399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1400" TEXT="testnode 7 7 1400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1401" TEXT="testnode 6 4 1401" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1402" TEXT="testnode 7 1 1402" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1403" TEXT="testnode 7 2 1403" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1404" TEXT="testnode 7 3 1404" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1405" TEXT="testnode 7 4 1405" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1406" TEXT="testnode 7 5 1406" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1407" TEXT="testnode 7 6 1407" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1408" TEXT="testnode 7 7 1408" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1409" TEXT="testnode 6 5 1409" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1410" TEXT="testnode 7 1 1410" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1411" TEXT="testnode 7 2 1411" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1412" TEXT="testnode 7 3 1412" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1413" TEXT="testnode 7 4 1413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1414" TEXT="testnode 7 5 1414" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1415" TEXT="testnode 7 6 1415" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1416" TEXT="testnode 7 7 1416" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1417" TEXT="testnode 6 6 1417" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1418" TEXT="testnode 7 1 1418" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1419" TEXT="testnode 7 2 1419" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1420" TEXT="testnode 7 3 1420" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1421" TEXT="testnode 7 4 1421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1422" TEXT="testnode 7 5 1422" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1423" TEXT="testnode 7 6 1423" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1424" TEXT="testnode 7 7 1424" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1425" TEXT="testnode 6 7 1425" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1426" TEXT="testnode 7 1 1426" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1427" TEXT="testnode 7 2 1427" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1428" TEXT="testnode 7 3 1428" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1429" TEXT="testnode 7 4 1429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1430" TEXT="testnode 7 5 1430" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1431" TEXT="testnode 7 6 1431" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1432" TEXT="testnode 7 7 1432" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1433" TEXT="testnode 5 5 1433" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1434" TEXT="testnode 6 1 1434" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1435" TEXT="testnode 7 1 1435" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1436" TEXT="testnode 7 2 1436" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1437" TEXT="testnode 7 3 1437" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1438" TEXT="testnode 7 4 1438" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1439" TEXT="testnode 7 5 1439" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1440" TEXT="testnode 7 6 1440" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1441" TEXT="testnode 7 7 1441" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1442" TEXT="testnode 6 2 1442" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1443" TEXT="testnode 7 1 1443" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1444" TEXT="testnode 7 2 1444" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1445" TEXT="testnode 7 3 1445" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1446" TEXT="testnode 7 4 1446" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1447" TEXT="testnode 7 5 1447" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1448" TEXT="testnode 7 6 1448" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1449" TEXT="testnode 7 7 1449" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1450" TEXT="testnode 6 3 1450" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1451" TEXT="testnode 7 1 1451" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1452" TEXT="testnode 7 2 1452" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1453" TEXT="testnode 7 3 1453" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1454" TEXT="testnode 7 4 1454" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1455" TEXT="testnode 7 5 1455" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1456" TEXT="testnode 7 6 1456" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1457" TEXT="testnode 7 7 1457" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1458" TEXT="testnode 6 4 1458" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1459" TEXT="testnode 7 1 1459" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1460" TEXT="testnode 7 2 1460" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1461" TEXT="testnode 7 3 1461" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1462" TEXT="testnode 7 4 1462" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1463" TEXT="testnode 7 5 1463" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1464" TEXT="testnode 7 6 1464" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1465" TEXT="testnode 7 7 1465" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1466" TEXT="testnode 6 5 1466" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1467" TEXT="testnode 7 1 1467" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1468" TEXT="testnode 7 2 1468" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1469" TEXT="testnode 7 3 1469" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1470" TEXT="testnode 7 4 1470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1471" TEXT="testnode 7 5 1471" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1472" TEXT="testnode 7 6 1472" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1473" TEXT="testnode 7 7 1473" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1474" TEXT="testnode 6 6 1474" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1475" TEXT="testnode 7 1 1475" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1476" TEXT="testnode 7 2 1476" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1477" TEXT="testnode 7 3 1477" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1478" TEXT="testnode 7 4 1478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1479" TEXT="testnode 7 5 1479" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1480" TEXT="testnode 7 6 1480" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1481" TEXT="testnode 7 7 1481" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1482" TEXT="testnode 6 7 1482" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1483" TEXT="testnode 7 1 1483" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1484" TEXT="testnode 7 2 1484" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1485" TEXT="testnode 7 3 1485" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1486" TEXT="testnode 7 4 1486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1487" TEXT="testnode 7 5 1487" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1488" TEXT="testnode 7 6 1488" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1489" TEXT="testnode 7 7 1489" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1490" TEXT="testnode 5 6 1490" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1491" TEXT="testnode 6 1 1491" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1492" TEXT="testnode 7 1 1492" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1493" TEXT="testnode 7 2 1493" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1494" TEXT="testnode 7 3 1494" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1495" TEXT="testnode 7 4 1495" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1496" TEXT="testnode 7 5 1496" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1497" TEXT="testnode 7 6 1497" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1498" TEXT="testnode 7 7 1498" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1499" TEXT="testnode 6 2 1499" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1500" TEXT="testnode 7 1 1500" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1501" TEXT="testnode 7 2 1501" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1502" TEXT="testnode 7 3 1502" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1503" TEXT="testnode 7 4 1503" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1504" TEXT="testnode 7 5 1504" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1505" TEXT="testnode 7 6 1505" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1506" TEXT="testnode 7 7 1506" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1507" TEXT="testnode 6 3 1507" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1508" TEXT="testnode 7 1 1508" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1509" TEXT="testnode 7 2 1509" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1510" TEXT="testnode 7 3 1510" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1511" TEXT="testnode 7 4 1511" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1512" TEXT="testnode 7 5 1512" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1513" TEXT="testnode 7 6 1513" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1514" TEXT="testnode 7 7 1514" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1515" TEXT="testnode 6 4 1515" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1516" TEXT="testnode 7 1 1516" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1517" TEXT="testnode 7 2 1517" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1518" TEXT="testnode 7 3 1518" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1519" TEXT="testnode 7 4 1519" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1520" TEXT="testnode 7 5 1520" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1521" TEXT="testnode 7 6 1521" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1522" TEXT="testnode 7 7 1522" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1523" TEXT="testnode 6 5 1523" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1524" TEXT="testnode 7 1 1524" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1525" TEXT="testnode 7 2 1525" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1526" TEXT="testnode 7 3 1526" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1527" TEXT="testnode 7 4 1527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1528" TEXT="testnode 7 5 1528" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1529" TEXT="testnode 7 6 1529" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1530" TEXT="testnode 7 7 1530" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1531" TEXT="testnode 6 6 1531" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1532" TEXT="testnode 7 1 1532" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1533" TEXT="testnode 7 2 1533" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1534" TEXT="testnode 7 3 1534" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1535" TEXT="testnode 7 4 1535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1536" TEXT="testnode 7 5 1536" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1537" TEXT="testnode 7 6 1537" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1538" TEXT="testnode 7 7 1538" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1539" TEXT="testnode 6 7 1539" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1540" TEXT="testnode 7 1 1540" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1541" TEXT="testnode 7 2 1541" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1542" TEXT="testnode 7 3 1542" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1543" TEXT="testnode 7 4 1543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1544" TEXT="testnode 7 5 1544" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1545" TEXT="testnode 7 6 1545" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1546" TEXT="testnode 7 7 1546" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1547" TEXT="testnode 5 7 1547" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1548" TEXT="testnode 6 1 1548" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1549" TEXT="testnode 7 1 1549" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1550" TEXT="testnode 7 2 1550" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1551" TEXT="testnode 7 3 1551" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1552" TEXT="testnode 7 4 1552" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1553" TEXT="testnode 7 5 1553" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1554" TEXT="testnode 7 6 1554" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1555" TEXT="testnode 7 7 1555" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1556" TEXT="testnode 6 2 1556" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1557" TEXT="testnode 7 1 1557" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1558" TEXT="testnode 7 2 1558" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1559" TEXT="testnode 7 3 1559" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1560" TEXT="testnode 7 4 1560" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1561" TEXT="testnode 7 5 1561" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1562" TEXT="testnode 7 6 1562" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1563" TEXT="testnode 7 7 1563" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1564" TEXT="testnode 6 3 1564" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1565" TEXT="testnode 7 1 1565" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1566" TEXT="testnode 7 2 1566" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1567" TEXT="testnode 7 3 1567" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1568" TEXT="testnode 7 4 1568" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1569" TEXT="testnode 7 5 1569" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1570" TEXT="testnode 7 6 1570" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1571" TEXT="testnode 7 7 1571" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1572" TEXT="testnode 6 4 1572" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1573" TEXT="testnode 7 1 1573" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1574" TEXT="testnode 7 2 1574" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1575" TEXT="testnode 7 3 1575" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1576" TEXT="testnode 7 4 1576" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1577" TEXT="testnode 7 5 1577" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1578" TEXT="testnode 7 6 1578" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1579" TEXT="testnode 7 7 1579" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1580" TEXT="testnode 6 5 1580" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1581" TEXT="testnode 7 1 1581" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1582" TEXT="testnode 7 2 1582" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1583" TEXT="testnode 7 3 1583" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1584" TEXT="testnode 7 4 1584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1585" TEXT="testnode 7 5 1585" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1586" TEXT="testnode 7 6 1586" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1587" TEXT="testnode 7 7 1587" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1588" TEXT="testnode 6 6 1588" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1589" TEXT="testnode 7 1 1589" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1590" TEXT="testnode 7 2 1590" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1591" TEXT="testnode 7 3 1591" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1592" TEXT="testnode 7 4 1592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1593" TEXT="testnode 7 5 1593" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1594" TEXT="testnode 7 6 1594" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1595" TEXT="testnode 7 7 1595" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1596" TEXT="testnode 6 7 1596" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1597" TEXT="testnode 7 1 1597" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1598" TEXT="testnode 7 2 1598" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1599" TEXT="testnode 7 3 1599" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1600" TEXT="testnode 7 4 1600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1601" TEXT="testnode 7 5 1601" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1602" TEXT="testnode 7 6 1602" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1603" TEXT="testnode 7 7 1603" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1604" TEXT="testnode 4 5 1604" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_1605" TEXT="testnode 5 1 1605" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1606" TEXT="testnode 6 1 1606" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1607" TEXT="testnode 7 1 1607" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1608" TEXT="testnode 7 2 1608" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1609" TEXT="testnode 7 3 1609" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1610" TEXT="testnode 7 4 1610" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1611" TEXT="testnode 7 5 1611" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1612" TEXT="testnode 7 6 1612" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1613" TEXT="testnode 7 7 1613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1614" TEXT="testnode 6 2 1614" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1615" TEXT="testnode 7 1 1615" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1616" TEXT="testnode 7 2 1616" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1617" TEXT="testnode 7 3 1617" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1618" TEXT="testnode 7 4 1618" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1619" TEXT="testnode 7 5 1619" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1620" TEXT="testnode 7 6 1620" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1621" TEXT="testnode 7 7 1621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1622" TEXT="testnode 6 3 1622" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1623" TEXT="testnode 7 1 1623" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1624" TEXT="testnode 7 2 1624" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1625" TEXT="testnode 7 3 1625" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1626" TEXT="testnode 7 4 1626" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1627" TEXT="testnode 7 5 1627" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1628" TEXT="testnode 7 6 1628" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1629" TEXT="testnode 7 7 1629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1630" TEXT="testnode 6 4 1630" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1631" TEXT="testnode 7 1 1631" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1632" TEXT="testnode 7 2 1632" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1633" TEXT="testnode 7 3 1633" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1634" TEXT="testnode 7 4 1634" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1635" TEXT="testnode 7 5 1635" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1636" TEXT="testnode 7 6 1636" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1637" TEXT="testnode 7 7 1637" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1638" TEXT="testnode 6 5 1638" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1639" TEXT="testnode 7 1 1639" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1640" TEXT="testnode 7 2 1640" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1641" TEXT="testnode 7 3 1641" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1642" TEXT="testnode 7 4 1642" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1643" TEXT="testnode 7 5 1643" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1644" TEXT="testnode 7 6 1644" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1645" TEXT="testnode 7 7 1645" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1646" TEXT="testnode 6 6 1646" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1647" TEXT="testnode 7 1 1647" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1648" TEXT="testnode 7 2 1648" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1649" TEXT="testnode 7 3 1649" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1650" TEXT="testnode 7 4 1650" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1651" TEXT="testnode 7 5 1651" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1652" TEXT="testnode 7 6 1652" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1653" TEXT="testnode 7 7 1653" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1654" TEXT="testnode 6 7 1654" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1655" TEXT="testnode 7 1 1655" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1656" TEXT="testnode 7 2 1656" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1657" TEXT="testnode 7 3 1657" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1658" TEXT="testnode 7 4 1658" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1659" TEXT="testnode 7 5 1659" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1660" TEXT="testnode 7 6 1660" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1661" TEXT="testnode 7 7 1661" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1662" TEXT="testnode 5 2 1662" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1663" TEXT="testnode 6 1 1663" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1664" TEXT="testnode 7 1 1664" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1665" TEXT="testnode 7 2 1665" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1666" TEXT="testnode 7 3 1666" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1667" TEXT="testnode 7 4 1667" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1668" TEXT="testnode 7 5 1668" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1669" TEXT="testnode 7 6 1669" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1670" TEXT="testnode 7 7 1670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1671" TEXT="testnode 6 2 1671" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1672" TEXT="testnode 7 1 1672" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1673" TEXT="testnode 7 2 1673" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1674" TEXT="testnode 7 3 1674" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1675" TEXT="testnode 7 4 1675" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1676" TEXT="testnode 7 5 1676" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1677" TEXT="testnode 7 6 1677" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1678" TEXT="testnode 7 7 1678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1679" TEXT="testnode 6 3 1679" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1680" TEXT="testnode 7 1 1680" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1681" TEXT="testnode 7 2 1681" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1682" TEXT="testnode 7 3 1682" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1683" TEXT="testnode 7 4 1683" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1684" TEXT="testnode 7 5 1684" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1685" TEXT="testnode 7 6 1685" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1686" TEXT="testnode 7 7 1686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1687" TEXT="testnode 6 4 1687" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1688" TEXT="testnode 7 1 1688" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1689" TEXT="testnode 7 2 1689" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1690" TEXT="testnode 7 3 1690" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1691" TEXT="testnode 7 4 1691" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1692" TEXT="testnode 7 5 1692" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1693" TEXT="testnode 7 6 1693" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1694" TEXT="testnode 7 7 1694" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1695" TEXT="testnode 6 5 1695" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1696" TEXT="testnode 7 1 1696" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1697" TEXT="testnode 7 2 1697" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1698" TEXT="testnode 7 3 1698" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1699" TEXT="testnode 7 4 1699" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1700" TEXT="testnode 7 5 1700" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1701" TEXT="testnode 7 6 1701" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1702" TEXT="testnode 7 7 1702" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1703" TEXT="testnode 6 6 1703" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1704" TEXT="testnode 7 1 1704" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1705" TEXT="testnode 7 2 1705" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1706" TEXT="testnode 7 3 1706" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1707" TEXT="testnode 7 4 1707" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1708" TEXT="testnode 7 5 1708" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1709" TEXT="testnode 7 6 1709" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1710" TEXT="testnode 7 7 1710" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1711" TEXT="testnode 6 7 1711" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1712" TEXT="testnode 7 1 1712" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1713" TEXT="testnode 7 2 1713" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1714" TEXT="testnode 7 3 1714" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1715" TEXT="testnode 7 4 1715" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1716" TEXT="testnode 7 5 1716" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1717" TEXT="testnode 7 6 1717" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1718" TEXT="testnode 7 7 1718" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1719" TEXT="testnode 5 3 1719" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1720" TEXT="testnode 6 1 1720" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1721" TEXT="testnode 7 1 1721" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1722" TEXT="testnode 7 2 1722" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1723" TEXT="testnode 7 3 1723" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1724" TEXT="testnode 7 4 1724" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1725" TEXT="testnode 7 5 1725" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1726" TEXT="testnode 7 6 1726" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1727" TEXT="testnode 7 7 1727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1728" TEXT="testnode 6 2 1728" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1729" TEXT="testnode 7 1 1729" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1730" TEXT="testnode 7 2 1730" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1731" TEXT="testnode 7 3 1731" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1732" TEXT="testnode 7 4 1732" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1733" TEXT="testnode 7 5 1733" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1734" TEXT="testnode 7 6 1734" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1735" TEXT="testnode 7 7 1735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1736" TEXT="testnode 6 3 1736" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1737" TEXT="testnode 7 1 1737" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1738" TEXT="testnode 7 2 1738" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1739" TEXT="testnode 7 3 1739" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1740" TEXT="testnode 7 4 1740" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1741" TEXT="testnode 7 5 1741" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1742" TEXT="testnode 7 6 1742" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1743" TEXT="testnode 7 7 1743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1744" TEXT="testnode 6 4 1744" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1745" TEXT="testnode 7 1 1745" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1746" TEXT="testnode 7 2 1746" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1747" TEXT="testnode 7 3 1747" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1748" TEXT="testnode 7 4 1748" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1749" TEXT="testnode 7 5 1749" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1750" TEXT="testnode 7 6 1750" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1751" TEXT="testnode 7 7 1751" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1752" TEXT="testnode 6 5 1752" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1753" TEXT="testnode 7 1 1753" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1754" TEXT="testnode 7 2 1754" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1755" TEXT="testnode 7 3 1755" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1756" TEXT="testnode 7 4 1756" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1757" TEXT="testnode 7 5 1757" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1758" TEXT="testnode 7 6 1758" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1759" TEXT="testnode 7 7 1759" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1760" TEXT="testnode 6 6 1760" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1761" TEXT="testnode 7 1 1761" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1762" TEXT="testnode 7 2 1762" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1763" TEXT="testnode 7 3 1763" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1764" TEXT="testnode 7 4 1764" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1765" TEXT="testnode 7 5 1765" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1766" TEXT="testnode 7 6 1766" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1767" TEXT="testnode 7 7 1767" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1768" TEXT="testnode 6 7 1768" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1769" TEXT="testnode 7 1 1769" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1770" TEXT="testnode 7 2 1770" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1771" TEXT="testnode 7 3 1771" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1772" TEXT="testnode 7 4 1772" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1773" TEXT="testnode 7 5 1773" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1774" TEXT="testnode 7 6 1774" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1775" TEXT="testnode 7 7 1775" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1776" TEXT="testnode 5 4 1776" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1777" TEXT="testnode 6 1 1777" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1778" TEXT="testnode 7 1 1778" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1779" TEXT="testnode 7 2 1779" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1780" TEXT="testnode 7 3 1780" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1781" TEXT="testnode 7 4 1781" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1782" TEXT="testnode 7 5 1782" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1783" TEXT="testnode 7 6 1783" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1784" TEXT="testnode 7 7 1784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1785" TEXT="testnode 6 2 1785" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1786" TEXT="testnode 7 1 1786" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1787" TEXT="testnode 7 2 1787" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1788" TEXT="testnode 7 3 1788" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1789" TEXT="testnode 7 4 1789" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1790" TEXT="testnode 7 5 1790" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1791" TEXT="testnode 7 6 1791" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1792" TEXT="testnode 7 7 1792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1793" TEXT="testnode 6 3 1793" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1794" TEXT="testnode 7 1 1794" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1795" TEXT="testnode 7 2 1795" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1796" TEXT="testnode 7 3 1796" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1797" TEXT="testnode 7 4 1797" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1798" TEXT="testnode 7 5 1798" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1799" TEXT="testnode 7 6 1799" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1800" TEXT="testnode 7 7 1800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1801" TEXT="testnode 6 4 1801" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1802" TEXT="testnode 7 1 1802" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1803" TEXT="testnode 7 2 1803" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1804" TEXT="testnode 7 3 1804" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1805" TEXT="testnode 7 4 1805" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1806" TEXT="testnode 7 5 1806" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1807" TEXT="testnode 7 6 1807" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1808" TEXT="testnode 7 7 1808" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1809" TEXT="testnode 6 5 1809" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1810" TEXT="testnode 7 1 1810" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1811" TEXT="testnode 7 2 1811" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1812" TEXT="testnode 7 3 1812" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1813" TEXT="testnode 7 4 1813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1814" TEXT="testnode 7 5 1814" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1815" TEXT="testnode 7 6 1815" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1816" TEXT="testnode 7 7 1816" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1817" TEXT="testnode 6 6 1817" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1818" TEXT="testnode 7 1 1818" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1819" TEXT="testnode 7 2 1819" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1820" TEXT="testnode 7 3 1820" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1821" TEXT="testnode 7 4 1821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1822" TEXT="testnode 7 5 1822" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1823" TEXT="testnode 7 6 1823" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1824" TEXT="testnode 7 7 1824" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1825" TEXT="testnode 6 7 1825" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1826" TEXT="testnode 7 1 1826" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1827" TEXT="testnode 7 2 1827" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1828" TEXT="testnode 7 3 1828" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1829" TEXT="testnode 7 4 1829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1830" TEXT="testnode 7 5 1830" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1831" TEXT="testnode 7 6 1831" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1832" TEXT="testnode 7 7 1832" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1833" TEXT="testnode 5 5 1833" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1834" TEXT="testnode 6 1 1834" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1835" TEXT="testnode 7 1 1835" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1836" TEXT="testnode 7 2 1836" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1837" TEXT="testnode 7 3 1837" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1838" TEXT="testnode 7 4 1838" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1839" TEXT="testnode 7 5 1839" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1840" TEXT="testnode 7 6 1840" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1841" TEXT="testnode 7 7 1841" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1842" TEXT="testnode 6 2 1842" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1843" TEXT="testnode 7 1 1843" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1844" TEXT="testnode 7 2 1844" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1845" TEXT="testnode 7 3 1845" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1846" TEXT="testnode 7 4 1846" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1847" TEXT="testnode 7 5 1847" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1848" TEXT="testnode 7 6 1848" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1849" TEXT="testnode 7 7 1849" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1850" TEXT="testnode 6 3 1850" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1851" TEXT="testnode 7 1 1851" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1852" TEXT="testnode 7 2 1852" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1853" TEXT="testnode 7 3 1853" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1854" TEXT="testnode 7 4 1854" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1855" TEXT="testnode 7 5 1855" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1856" TEXT="testnode 7 6 1856" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1857" TEXT="testnode 7 7 1857" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1858" TEXT="testnode 6 4 1858" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1859" TEXT="testnode 7 1 1859" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1860" TEXT="testnode 7 2 1860" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1861" TEXT="testnode 7 3 1861" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1862" TEXT="testnode 7 4 1862" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1863" TEXT="testnode 7 5 1863" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1864" TEXT="testnode 7 6 1864" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1865" TEXT="testnode 7 7 1865" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1866" TEXT="testnode 6 5 1866" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1867" TEXT="testnode 7 1 1867" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1868" TEXT="testnode 7 2 1868" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1869" TEXT="testnode 7 3 1869" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1870" TEXT="testnode 7 4 1870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1871" TEXT="testnode 7 5 1871" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1872" TEXT="testnode 7 6 1872" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1873" TEXT="testnode 7 7 1873" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1874" TEXT="testnode 6 6 1874" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1875" TEXT="testnode 7 1 1875" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1876" TEXT="testnode 7 2 1876" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1877" TEXT="testnode 7 3 1877" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1878" TEXT="testnode 7 4 1878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1879" TEXT="testnode 7 5 1879" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1880" TEXT="testnode 7 6 1880" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1881" TEXT="testnode 7 7 1881" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1882" TEXT="testnode 6 7 1882" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1883" TEXT="testnode 7 1 1883" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1884" TEXT="testnode 7 2 1884" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1885" TEXT="testnode 7 3 1885" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1886" TEXT="testnode 7 4 1886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1887" TEXT="testnode 7 5 1887" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1888" TEXT="testnode 7 6 1888" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1889" TEXT="testnode 7 7 1889" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1890" TEXT="testnode 5 6 1890" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1891" TEXT="testnode 6 1 1891" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1892" TEXT="testnode 7 1 1892" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1893" TEXT="testnode 7 2 1893" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1894" TEXT="testnode 7 3 1894" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1895" TEXT="testnode 7 4 1895" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1896" TEXT="testnode 7 5 1896" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1897" TEXT="testnode 7 6 1897" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1898" TEXT="testnode 7 7 1898" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1899" TEXT="testnode 6 2 1899" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1900" TEXT="testnode 7 1 1900" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1901" TEXT="testnode 7 2 1901" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1902" TEXT="testnode 7 3 1902" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1903" TEXT="testnode 7 4 1903" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1904" TEXT="testnode 7 5 1904" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1905" TEXT="testnode 7 6 1905" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1906" TEXT="testnode 7 7 1906" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1907" TEXT="testnode 6 3 1907" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1908" TEXT="testnode 7 1 1908" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1909" TEXT="testnode 7 2 1909" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1910" TEXT="testnode 7 3 1910" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1911" TEXT="testnode 7 4 1911" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1912" TEXT="testnode 7 5 1912" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1913" TEXT="testnode 7 6 1913" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1914" TEXT="testnode 7 7 1914" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1915" TEXT="testnode 6 4 1915" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1916" TEXT="testnode 7 1 1916" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1917" TEXT="testnode 7 2 1917" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1918" TEXT="testnode 7 3 1918" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1919" TEXT="testnode 7 4 1919" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1920" TEXT="testnode 7 5 1920" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1921" TEXT="testnode 7 6 1921" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1922" TEXT="testnode 7 7 1922" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1923" TEXT="testnode 6 5 1923" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1924" TEXT="testnode 7 1 1924" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1925" TEXT="testnode 7 2 1925" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1926" TEXT="testnode 7 3 1926" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1927" TEXT="testnode 7 4 1927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1928" TEXT="testnode 7 5 1928" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1929" TEXT="testnode 7 6 1929" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1930" TEXT="testnode 7 7 1930" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1931" TEXT="testnode 6 6 1931" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1932" TEXT="testnode 7 1 1932" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1933" TEXT="testnode 7 2 1933" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1934" TEXT="testnode 7 3 1934" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1935" TEXT="testnode 7 4 1935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1936" TEXT="testnode 7 5 1936" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1937" TEXT="testnode 7 6 1937" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1938" TEXT="testnode 7 7 1938" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1939" TEXT="testnode 6 7 1939" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1940" TEXT="testnode 7 1 1940" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1941" TEXT="testnode 7 2 1941" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1942" TEXT="testnode 7 3 1942" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1943" TEXT="testnode 7 4 1943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1944" TEXT="testnode 7 5 1944" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1945" TEXT="testnode 7 6 1945" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1946" TEXT="testnode 7 7 1946" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_1947" TEXT="testnode 5 7 1947" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_1948" TEXT="testnode 6 1 1948" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1949" TEXT="testnode 7 1 1949" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1950" TEXT="testnode 7 2 1950" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1951" TEXT="testnode 7 3 1951" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1952" TEXT="testnode 7 4 1952" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1953" TEXT="testnode 7 5 1953" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1954" TEXT="testnode 7 6 1954" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1955" TEXT="testnode 7 7 1955" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1956" TEXT="testnode 6 2 1956" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1957" TEXT="testnode 7 1 1957" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1958" TEXT="testnode 7 2 1958" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1959" TEXT="testnode 7 3 1959" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1960" TEXT="testnode 7 4 1960" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1961" TEXT="testnode 7 5 1961" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1962" TEXT="testnode 7 6 1962" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1963" TEXT="testnode 7 7 1963" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1964" TEXT="testnode 6 3 1964" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1965" TEXT="testnode 7 1 1965" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1966" TEXT="testnode 7 2 1966" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1967" TEXT="testnode 7 3 1967" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1968" TEXT="testnode 7 4 1968" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1969" TEXT="testnode 7 5 1969" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1970" TEXT="testnode 7 6 1970" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1971" TEXT="testnode 7 7 1971" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1972" TEXT="testnode 6 4 1972" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1973" TEXT="testnode 7 1 1973" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1974" TEXT="testnode 7 2 1974" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1975" TEXT="testnode 7 3 1975" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1976" TEXT="testnode 7 4 1976" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1977" TEXT="testnode 7 5 1977" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1978" TEXT="testnode 7 6 1978" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1979" TEXT="testnode 7 7 1979" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1980" TEXT="testnode 6 5 1980" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1981" TEXT="testnode 7 1 1981" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1982" TEXT="testnode 7 2 1982" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1983" TEXT="testnode 7 3 1983" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1984" TEXT="testnode 7 4 1984" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1985" TEXT="testnode 7 5 1985" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1986" TEXT="testnode 7 6 1986" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1987" TEXT="testnode 7 7 1987" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1988" TEXT="testnode 6 6 1988" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1989" TEXT="testnode 7 1 1989" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1990" TEXT="testnode 7 2 1990" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1991" TEXT="testnode 7 3 1991" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1992" TEXT="testnode 7 4 1992" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1993" TEXT="testnode 7 5 1993" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1994" TEXT="testnode 7 6 1994" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1995" TEXT="testnode 7 7 1995" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_1996" TEXT="testnode 6 7 1996" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_1997" TEXT="testnode 7 1 1997" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1998" TEXT="testnode 7 2 1998" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_1999" TEXT="testnode 7 3 1999" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2000" TEXT="testnode 7 4 2000" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2001" TEXT="testnode 7 5 2001" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2002" TEXT="testnode 7 6 2002" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2003" TEXT="testnode 7 7 2003" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2004" TEXT="testnode 4 6 2004" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_2005" TEXT="testnode 5 1 2005" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2006" TEXT="testnode 6 1 2006" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2007" TEXT="testnode 7 1 2007" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2008" TEXT="testnode 7 2 2008" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2009" TEXT="testnode 7 3 2009" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2010" TEXT="testnode 7 4 2010" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2011" TEXT="testnode 7 5 2011" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2012" TEXT="testnode 7 6 2012" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2013" TEXT="testnode 7 7 2013" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2014" TEXT="testnode 6 2 2014" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2015" TEXT="testnode 7 1 2015" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2016" TEXT="testnode 7 2 2016" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2017" TEXT="testnode 7 3 2017" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2018" TEXT="testnode 7 4 2018" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2019" TEXT="testnode 7 5 2019" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2020" TEXT="testnode 7 6 2020" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2021" TEXT="testnode 7 7 2021" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2022" TEXT="testnode 6 3 2022" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2023" TEXT="testnode 7 1 2023" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2024" TEXT="testnode 7 2 2024" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2025" TEXT="testnode 7 3 2025" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2026" TEXT="testnode 7 4 2026" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2027" TEXT="testnode 7 5 2027" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2028" TEXT="testnode 7 6 2028" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2029" TEXT="testnode 7 7 2029" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2030" TEXT="testnode 6 4 2030" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2031" TEXT="testnode 7 1 2031" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2032" TEXT="testnode 7 2 2032" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2033" TEXT="testnode 7 3 2033" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2034" TEXT="testnode 7 4 2034" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2035" TEXT="testnode 7 5 2035" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2036" TEXT="testnode 7 6 2036" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2037" TEXT="testnode 7 7 2037" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2038" TEXT="testnode 6 5 2038" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2039" TEXT="testnode 7 1 2039" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2040" TEXT="testnode 7 2 2040" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2041" TEXT="testnode 7 3 2041" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2042" TEXT="testnode 7 4 2042" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2043" TEXT="testnode 7 5 2043" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2044" TEXT="testnode 7 6 2044" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2045" TEXT="testnode 7 7 2045" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2046" TEXT="testnode 6 6 2046" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2047" TEXT="testnode 7 1 2047" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2048" TEXT="testnode 7 2 2048" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2049" TEXT="testnode 7 3 2049" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2050" TEXT="testnode 7 4 2050" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2051" TEXT="testnode 7 5 2051" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2052" TEXT="testnode 7 6 2052" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2053" TEXT="testnode 7 7 2053" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2054" TEXT="testnode 6 7 2054" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2055" TEXT="testnode 7 1 2055" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2056" TEXT="testnode 7 2 2056" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2057" TEXT="testnode 7 3 2057" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2058" TEXT="testnode 7 4 2058" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2059" TEXT="testnode 7 5 2059" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2060" TEXT="testnode 7 6 2060" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2061" TEXT="testnode 7 7 2061" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2062" TEXT="testnode 5 2 2062" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2063" TEXT="testnode 6 1 2063" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2064" TEXT="testnode 7 1 2064" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2065" TEXT="testnode 7 2 2065" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2066" TEXT="testnode 7 3 2066" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2067" TEXT="testnode 7 4 2067" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2068" TEXT="testnode 7 5 2068" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2069" TEXT="testnode 7 6 2069" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2070" TEXT="testnode 7 7 2070" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2071" TEXT="testnode 6 2 2071" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2072" TEXT="testnode 7 1 2072" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2073" TEXT="testnode 7 2 2073" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2074" TEXT="testnode 7 3 2074" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2075" TEXT="testnode 7 4 2075" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2076" TEXT="testnode 7 5 2076" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2077" TEXT="testnode 7 6 2077" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2078" TEXT="testnode 7 7 2078" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2079" TEXT="testnode 6 3 2079" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2080" TEXT="testnode 7 1 2080" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2081" TEXT="testnode 7 2 2081" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2082" TEXT="testnode 7 3 2082" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2083" TEXT="testnode 7 4 2083" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2084" TEXT="testnode 7 5 2084" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2085" TEXT="testnode 7 6 2085" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2086" TEXT="testnode 7 7 2086" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2087" TEXT="testnode 6 4 2087" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2088" TEXT="testnode 7 1 2088" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2089" TEXT="testnode 7 2 2089" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2090" TEXT="testnode 7 3 2090" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2091" TEXT="testnode 7 4 2091" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2092" TEXT="testnode 7 5 2092" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2093" TEXT="testnode 7 6 2093" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2094" TEXT="testnode 7 7 2094" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2095" TEXT="testnode 6 5 2095" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2096" TEXT="testnode 7 1 2096" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2097" TEXT="testnode 7 2 2097" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2098" TEXT="testnode 7 3 2098" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2099" TEXT="testnode 7 4 2099" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2100" TEXT="testnode 7 5 2100" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2101" TEXT="testnode 7 6 2101" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2102" TEXT="testnode 7 7 2102" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2103" TEXT="testnode 6 6 2103" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2104" TEXT="testnode 7 1 2104" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2105" TEXT="testnode 7 2 2105" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2106" TEXT="testnode 7 3 2106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2107" TEXT="testnode 7 4 2107" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2108" TEXT="testnode 7 5 2108" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2109" TEXT="testnode 7 6 2109" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2110" TEXT="testnode 7 7 2110" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2111" TEXT="testnode 6 7 2111" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2112" TEXT="testnode 7 1 2112" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2113" TEXT="testnode 7 2 2113" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2114" TEXT="testnode 7 3 2114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2115" TEXT="testnode 7 4 2115" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2116" TEXT="testnode 7 5 2116" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2117" TEXT="testnode 7 6 2117" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2118" TEXT="testnode 7 7 2118" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2119" TEXT="testnode 5 3 2119" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2120" TEXT="testnode 6 1 2120" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2121" TEXT="testnode 7 1 2121" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2122" TEXT="testnode 7 2 2122" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2123" TEXT="testnode 7 3 2123" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2124" TEXT="testnode 7 4 2124" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2125" TEXT="testnode 7 5 2125" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2126" TEXT="testnode 7 6 2126" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2127" TEXT="testnode 7 7 2127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2128" TEXT="testnode 6 2 2128" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2129" TEXT="testnode 7 1 2129" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2130" TEXT="testnode 7 2 2130" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2131" TEXT="testnode 7 3 2131" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2132" TEXT="testnode 7 4 2132" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2133" TEXT="testnode 7 5 2133" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2134" TEXT="testnode 7 6 2134" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2135" TEXT="testnode 7 7 2135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2136" TEXT="testnode 6 3 2136" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2137" TEXT="testnode 7 1 2137" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2138" TEXT="testnode 7 2 2138" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2139" TEXT="testnode 7 3 2139" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2140" TEXT="testnode 7 4 2140" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2141" TEXT="testnode 7 5 2141" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2142" TEXT="testnode 7 6 2142" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2143" TEXT="testnode 7 7 2143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2144" TEXT="testnode 6 4 2144" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2145" TEXT="testnode 7 1 2145" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2146" TEXT="testnode 7 2 2146" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2147" TEXT="testnode 7 3 2147" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2148" TEXT="testnode 7 4 2148" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2149" TEXT="testnode 7 5 2149" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2150" TEXT="testnode 7 6 2150" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2151" TEXT="testnode 7 7 2151" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2152" TEXT="testnode 6 5 2152" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2153" TEXT="testnode 7 1 2153" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2154" TEXT="testnode 7 2 2154" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2155" TEXT="testnode 7 3 2155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2156" TEXT="testnode 7 4 2156" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2157" TEXT="testnode 7 5 2157" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2158" TEXT="testnode 7 6 2158" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2159" TEXT="testnode 7 7 2159" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2160" TEXT="testnode 6 6 2160" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2161" TEXT="testnode 7 1 2161" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2162" TEXT="testnode 7 2 2162" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2163" TEXT="testnode 7 3 2163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2164" TEXT="testnode 7 4 2164" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2165" TEXT="testnode 7 5 2165" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2166" TEXT="testnode 7 6 2166" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2167" TEXT="testnode 7 7 2167" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2168" TEXT="testnode 6 7 2168" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2169" TEXT="testnode 7 1 2169" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2170" TEXT="testnode 7 2 2170" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2171" TEXT="testnode 7 3 2171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2172" TEXT="testnode 7 4 2172" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2173" TEXT="testnode 7 5 2173" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2174" TEXT="testnode 7 6 2174" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2175" TEXT="testnode 7 7 2175" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2176" TEXT="testnode 5 4 2176" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2177" TEXT="testnode 6 1 2177" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2178" TEXT="testnode 7 1 2178" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2179" TEXT="testnode 7 2 2179" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2180" TEXT="testnode 7 3 2180" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2181" TEXT="testnode 7 4 2181" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2182" TEXT="testnode 7 5 2182" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2183" TEXT="testnode 7 6 2183" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2184" TEXT="testnode 7 7 2184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2185" TEXT="testnode 6 2 2185" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2186" TEXT="testnode 7 1 2186" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2187" TEXT="testnode 7 2 2187" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2188" TEXT="testnode 7 3 2188" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2189" TEXT="testnode 7 4 2189" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2190" TEXT="testnode 7 5 2190" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2191" TEXT="testnode 7 6 2191" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2192" TEXT="testnode 7 7 2192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2193" TEXT="testnode 6 3 2193" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2194" TEXT="testnode 7 1 2194" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2195" TEXT="testnode 7 2 2195" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2196" TEXT="testnode 7 3 2196" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2197" TEXT="testnode 7 4 2197" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2198" TEXT="testnode 7 5 2198" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2199" TEXT="testnode 7 6 2199" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2200" TEXT="testnode 7 7 2200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2201" TEXT="testnode 6 4 2201" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2202" TEXT="testnode 7 1 2202" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2203" TEXT="testnode 7 2 2203" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2204" TEXT="testnode 7 3 2204" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2205" TEXT="testnode 7 4 2205" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2206" TEXT="testnode 7 5 2206" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2207" TEXT="testnode 7 6 2207" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2208" TEXT="testnode 7 7 2208" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2209" TEXT="testnode 6 5 2209" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2210" TEXT="testnode 7 1 2210" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2211" TEXT="testnode 7 2 2211" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2212" TEXT="testnode 7 3 2212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2213" TEXT="testnode 7 4 2213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2214" TEXT="testnode 7 5 2214" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2215" TEXT="testnode 7 6 2215" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2216" TEXT="testnode 7 7 2216" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2217" TEXT="testnode 6 6 2217" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2218" TEXT="testnode 7 1 2218" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2219" TEXT="testnode 7 2 2219" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2220" TEXT="testnode 7 3 2220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2221" TEXT="testnode 7 4 2221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2222" TEXT="testnode 7 5 2222" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2223" TEXT="testnode 7 6 2223" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2224" TEXT="testnode 7 7 2224" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2225" TEXT="testnode 6 7 2225" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2226" TEXT="testnode 7 1 2226" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2227" TEXT="testnode 7 2 2227" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2228" TEXT="testnode 7 3 2228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2229" TEXT="testnode 7 4 2229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2230" TEXT="testnode 7 5 2230" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2231" TEXT="testnode 7 6 2231" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2232" TEXT="testnode 7 7 2232" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2233" TEXT="testnode 5 5 2233" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2234" TEXT="testnode 6 1 2234" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2235" TEXT="testnode 7 1 2235" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2236" TEXT="testnode 7 2 2236" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2237" TEXT="testnode 7 3 2237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2238" TEXT="testnode 7 4 2238" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2239" TEXT="testnode 7 5 2239" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2240" TEXT="testnode 7 6 2240" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2241" TEXT="testnode 7 7 2241" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2242" TEXT="testnode 6 2 2242" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2243" TEXT="testnode 7 1 2243" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2244" TEXT="testnode 7 2 2244" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2245" TEXT="testnode 7 3 2245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2246" TEXT="testnode 7 4 2246" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2247" TEXT="testnode 7 5 2247" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2248" TEXT="testnode 7 6 2248" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2249" TEXT="testnode 7 7 2249" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2250" TEXT="testnode 6 3 2250" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2251" TEXT="testnode 7 1 2251" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2252" TEXT="testnode 7 2 2252" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2253" TEXT="testnode 7 3 2253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2254" TEXT="testnode 7 4 2254" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2255" TEXT="testnode 7 5 2255" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2256" TEXT="testnode 7 6 2256" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2257" TEXT="testnode 7 7 2257" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2258" TEXT="testnode 6 4 2258" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2259" TEXT="testnode 7 1 2259" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2260" TEXT="testnode 7 2 2260" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2261" TEXT="testnode 7 3 2261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2262" TEXT="testnode 7 4 2262" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2263" TEXT="testnode 7 5 2263" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2264" TEXT="testnode 7 6 2264" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2265" TEXT="testnode 7 7 2265" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2266" TEXT="testnode 6 5 2266" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2267" TEXT="testnode 7 1 2267" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2268" TEXT="testnode 7 2 2268" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2269" TEXT="testnode 7 3 2269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2270" TEXT="testnode 7 4 2270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2271" TEXT="testnode 7 5 2271" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2272" TEXT="testnode 7 6 2272" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2273" TEXT="testnode 7 7 2273" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2274" TEXT="testnode 6 6 2274" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2275" TEXT="testnode 7 1 2275" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2276" TEXT="testnode 7 2 2276" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2277" TEXT="testnode 7 3 2277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2278" TEXT="testnode 7 4 2278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2279" TEXT="testnode 7 5 2279" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2280" TEXT="testnode 7 6 2280" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2281" TEXT="testnode 7 7 2281" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2282" TEXT="testnode 6 7 2282" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2283" TEXT="testnode 7 1 2283" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2284" TEXT="testnode 7 2 2284" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2285" TEXT="testnode 7 3 2285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2286" TEXT="testnode 7 4 2286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2287" TEXT="testnode 7 5 2287" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2288" TEXT="testnode 7 6 2288" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2289" TEXT="testnode 7 7 2289" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2290" TEXT="testnode 5 6 2290" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2291" TEXT="testnode 6 1 2291" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2292" TEXT="testnode 7 1 2292" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2293" TEXT="testnode 7 2 2293" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2294" TEXT="testnode 7 3 2294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2295" TEXT="testnode 7 4 2295" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2296" TEXT="testnode 7 5 2296" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2297" TEXT="testnode 7 6 2297" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2298" TEXT="testnode 7 7 2298" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2299" TEXT="testnode 6 2 2299" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2300" TEXT="testnode 7 1 2300" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2301" TEXT="testnode 7 2 2301" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2302" TEXT="testnode 7 3 2302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2303" TEXT="testnode 7 4 2303" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2304" TEXT="testnode 7 5 2304" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2305" TEXT="testnode 7 6 2305" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2306" TEXT="testnode 7 7 2306" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2307" TEXT="testnode 6 3 2307" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2308" TEXT="testnode 7 1 2308" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2309" TEXT="testnode 7 2 2309" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2310" TEXT="testnode 7 3 2310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2311" TEXT="testnode 7 4 2311" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2312" TEXT="testnode 7 5 2312" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2313" TEXT="testnode 7 6 2313" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2314" TEXT="testnode 7 7 2314" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2315" TEXT="testnode 6 4 2315" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2316" TEXT="testnode 7 1 2316" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2317" TEXT="testnode 7 2 2317" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2318" TEXT="testnode 7 3 2318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2319" TEXT="testnode 7 4 2319" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2320" TEXT="testnode 7 5 2320" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2321" TEXT="testnode 7 6 2321" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2322" TEXT="testnode 7 7 2322" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2323" TEXT="testnode 6 5 2323" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2324" TEXT="testnode 7 1 2324" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2325" TEXT="testnode 7 2 2325" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2326" TEXT="testnode 7 3 2326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2327" TEXT="testnode 7 4 2327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2328" TEXT="testnode 7 5 2328" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2329" TEXT="testnode 7 6 2329" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2330" TEXT="testnode 7 7 2330" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2331" TEXT="testnode 6 6 2331" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2332" TEXT="testnode 7 1 2332" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2333" TEXT="testnode 7 2 2333" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2334" TEXT="testnode 7 3 2334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2335" TEXT="testnode 7 4 2335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2336" TEXT="testnode 7 5 2336" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2337" TEXT="testnode 7 6 2337" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2338" TEXT="testnode 7 7 2338" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2339" TEXT="testnode 6 7 2339" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2340" TEXT="testnode 7 1 2340" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2341" TEXT="testnode 7 2 2341" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2342" TEXT="testnode 7 3 2342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2343" TEXT="testnode 7 4 2343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2344" TEXT="testnode 7 5 2344" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2345" TEXT="testnode 7 6 2345" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2346" TEXT="testnode 7 7 2346" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2347" TEXT="testnode 5 7 2347" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2348" TEXT="testnode 6 1 2348" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2349" TEXT="testnode 7 1 2349" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2350" TEXT="testnode 7 2 2350" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2351" TEXT="testnode 7 3 2351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2352" TEXT="testnode 7 4 2352" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2353" TEXT="testnode 7 5 2353" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2354" TEXT="testnode 7 6 2354" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2355" TEXT="testnode 7 7 2355" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2356" TEXT="testnode 6 2 2356" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2357" TEXT="testnode 7 1 2357" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2358" TEXT="testnode 7 2 2358" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2359" TEXT="testnode 7 3 2359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2360" TEXT="testnode 7 4 2360" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2361" TEXT="testnode 7 5 2361" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2362" TEXT="testnode 7 6 2362" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2363" TEXT="testnode 7 7 2363" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2364" TEXT="testnode 6 3 2364" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2365" TEXT="testnode 7 1 2365" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2366" TEXT="testnode 7 2 2366" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2367" TEXT="testnode 7 3 2367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2368" TEXT="testnode 7 4 2368" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2369" TEXT="testnode 7 5 2369" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2370" TEXT="testnode 7 6 2370" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2371" TEXT="testnode 7 7 2371" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2372" TEXT="testnode 6 4 2372" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2373" TEXT="testnode 7 1 2373" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2374" TEXT="testnode 7 2 2374" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2375" TEXT="testnode 7 3 2375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2376" TEXT="testnode 7 4 2376" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2377" TEXT="testnode 7 5 2377" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2378" TEXT="testnode 7 6 2378" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2379" TEXT="testnode 7 7 2379" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2380" TEXT="testnode 6 5 2380" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2381" TEXT="testnode 7 1 2381" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2382" TEXT="testnode 7 2 2382" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2383" TEXT="testnode 7 3 2383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2384" TEXT="testnode 7 4 2384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2385" TEXT="testnode 7 5 2385" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2386" TEXT="testnode 7 6 2386" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2387" TEXT="testnode 7 7 2387" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2388" TEXT="testnode 6 6 2388" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2389" TEXT="testnode 7 1 2389" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2390" TEXT="testnode 7 2 2390" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2391" TEXT="testnode 7 3 2391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2392" TEXT="testnode 7 4 2392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2393" TEXT="testnode 7 5 2393" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2394" TEXT="testnode 7 6 2394" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2395" TEXT="testnode 7 7 2395" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2396" TEXT="testnode 6 7 2396" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2397" TEXT="testnode 7 1 2397" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2398" TEXT="testnode 7 2 2398" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2399" TEXT="testnode 7 3 2399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2400" TEXT="testnode 7 4 2400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2401" TEXT="testnode 7 5 2401" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2402" TEXT="testnode 7 6 2402" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2403" TEXT="testnode 7 7 2403" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2404" TEXT="testnode 4 7 2404" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_2405" TEXT="testnode 5 1 2405" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2406" TEXT="testnode 6 1 2406" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2407" TEXT="testnode 7 1 2407" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2408" TEXT="testnode 7 2 2408" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2409" TEXT="testnode 7 3 2409" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2410" TEXT="testnode 7 4 2410" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2411" TEXT="testnode 7 5 2411" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2412" TEXT="testnode 7 6 2412" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2413" TEXT="testnode 7 7 2413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2414" TEXT="testnode 6 2 2414" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2415" TEXT="testnode 7 1 2415" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2416" TEXT="testnode 7 2 2416" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2417" TEXT="testnode 7 3 2417" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2418" TEXT="testnode 7 4 2418" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2419" TEXT="testnode 7 5 2419" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2420" TEXT="testnode 7 6 2420" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2421" TEXT="testnode 7 7 2421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2422" TEXT="testnode 6 3 2422" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2423" TEXT="testnode 7 1 2423" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2424" TEXT="testnode 7 2 2424" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2425" TEXT="testnode 7 3 2425" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2426" TEXT="testnode 7 4 2426" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2427" TEXT="testnode 7 5 2427" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2428" TEXT="testnode 7 6 2428" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2429" TEXT="testnode 7 7 2429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2430" TEXT="testnode 6 4 2430" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2431" TEXT="testnode 7 1 2431" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2432" TEXT="testnode 7 2 2432" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2433" TEXT="testnode 7 3 2433" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2434" TEXT="testnode 7 4 2434" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2435" TEXT="testnode 7 5 2435" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2436" TEXT="testnode 7 6 2436" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2437" TEXT="testnode 7 7 2437" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2438" TEXT="testnode 6 5 2438" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2439" TEXT="testnode 7 1 2439" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2440" TEXT="testnode 7 2 2440" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2441" TEXT="testnode 7 3 2441" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2442" TEXT="testnode 7 4 2442" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2443" TEXT="testnode 7 5 2443" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2444" TEXT="testnode 7 6 2444" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2445" TEXT="testnode 7 7 2445" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2446" TEXT="testnode 6 6 2446" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2447" TEXT="testnode 7 1 2447" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2448" TEXT="testnode 7 2 2448" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2449" TEXT="testnode 7 3 2449" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2450" TEXT="testnode 7 4 2450" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2451" TEXT="testnode 7 5 2451" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2452" TEXT="testnode 7 6 2452" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2453" TEXT="testnode 7 7 2453" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2454" TEXT="testnode 6 7 2454" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2455" TEXT="testnode 7 1 2455" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2456" TEXT="testnode 7 2 2456" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2457" TEXT="testnode 7 3 2457" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2458" TEXT="testnode 7 4 2458" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2459" TEXT="testnode 7 5 2459" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2460" TEXT="testnode 7 6 2460" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2461" TEXT="testnode 7 7 2461" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2462" TEXT="testnode 5 2 2462" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2463" TEXT="testnode 6 1 2463" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2464" TEXT="testnode 7 1 2464" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2465" TEXT="testnode 7 2 2465" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2466" TEXT="testnode 7 3 2466" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2467" TEXT="testnode 7 4 2467" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2468" TEXT="testnode 7 5 2468" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2469" TEXT="testnode 7 6 2469" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2470" TEXT="testnode 7 7 2470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2471" TEXT="testnode 6 2 2471" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2472" TEXT="testnode 7 1 2472" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2473" TEXT="testnode 7 2 2473" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2474" TEXT="testnode 7 3 2474" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2475" TEXT="testnode 7 4 2475" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2476" TEXT="testnode 7 5 2476" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2477" TEXT="testnode 7 6 2477" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2478" TEXT="testnode 7 7 2478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2479" TEXT="testnode 6 3 2479" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2480" TEXT="testnode 7 1 2480" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2481" TEXT="testnode 7 2 2481" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2482" TEXT="testnode 7 3 2482" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2483" TEXT="testnode 7 4 2483" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2484" TEXT="testnode 7 5 2484" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2485" TEXT="testnode 7 6 2485" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2486" TEXT="testnode 7 7 2486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2487" TEXT="testnode 6 4 2487" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2488" TEXT="testnode 7 1 2488" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2489" TEXT="testnode 7 2 2489" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2490" TEXT="testnode 7 3 2490" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2491" TEXT="testnode 7 4 2491" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2492" TEXT="testnode 7 5 2492" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2493" TEXT="testnode 7 6 2493" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2494" TEXT="testnode 7 7 2494" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2495" TEXT="testnode 6 5 2495" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2496" TEXT="testnode 7 1 2496" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2497" TEXT="testnode 7 2 2497" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2498" TEXT="testnode 7 3 2498" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2499" TEXT="testnode 7 4 2499" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2500" TEXT="testnode 7 5 2500" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2501" TEXT="testnode 7 6 2501" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2502" TEXT="testnode 7 7 2502" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2503" TEXT="testnode 6 6 2503" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2504" TEXT="testnode 7 1 2504" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2505" TEXT="testnode 7 2 2505" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2506" TEXT="testnode 7 3 2506" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2507" TEXT="testnode 7 4 2507" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2508" TEXT="testnode 7 5 2508" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2509" TEXT="testnode 7 6 2509" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2510" TEXT="testnode 7 7 2510" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2511" TEXT="testnode 6 7 2511" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2512" TEXT="testnode 7 1 2512" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2513" TEXT="testnode 7 2 2513" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2514" TEXT="testnode 7 3 2514" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2515" TEXT="testnode 7 4 2515" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2516" TEXT="testnode 7 5 2516" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2517" TEXT="testnode 7 6 2517" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2518" TEXT="testnode 7 7 2518" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2519" TEXT="testnode 5 3 2519" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2520" TEXT="testnode 6 1 2520" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2521" TEXT="testnode 7 1 2521" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2522" TEXT="testnode 7 2 2522" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2523" TEXT="testnode 7 3 2523" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2524" TEXT="testnode 7 4 2524" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2525" TEXT="testnode 7 5 2525" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2526" TEXT="testnode 7 6 2526" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2527" TEXT="testnode 7 7 2527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2528" TEXT="testnode 6 2 2528" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2529" TEXT="testnode 7 1 2529" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2530" TEXT="testnode 7 2 2530" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2531" TEXT="testnode 7 3 2531" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2532" TEXT="testnode 7 4 2532" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2533" TEXT="testnode 7 5 2533" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2534" TEXT="testnode 7 6 2534" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2535" TEXT="testnode 7 7 2535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2536" TEXT="testnode 6 3 2536" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2537" TEXT="testnode 7 1 2537" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2538" TEXT="testnode 7 2 2538" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2539" TEXT="testnode 7 3 2539" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2540" TEXT="testnode 7 4 2540" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2541" TEXT="testnode 7 5 2541" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2542" TEXT="testnode 7 6 2542" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2543" TEXT="testnode 7 7 2543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2544" TEXT="testnode 6 4 2544" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2545" TEXT="testnode 7 1 2545" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2546" TEXT="testnode 7 2 2546" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2547" TEXT="testnode 7 3 2547" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2548" TEXT="testnode 7 4 2548" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2549" TEXT="testnode 7 5 2549" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2550" TEXT="testnode 7 6 2550" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2551" TEXT="testnode 7 7 2551" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2552" TEXT="testnode 6 5 2552" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2553" TEXT="testnode 7 1 2553" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2554" TEXT="testnode 7 2 2554" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2555" TEXT="testnode 7 3 2555" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2556" TEXT="testnode 7 4 2556" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2557" TEXT="testnode 7 5 2557" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2558" TEXT="testnode 7 6 2558" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2559" TEXT="testnode 7 7 2559" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2560" TEXT="testnode 6 6 2560" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2561" TEXT="testnode 7 1 2561" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2562" TEXT="testnode 7 2 2562" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2563" TEXT="testnode 7 3 2563" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2564" TEXT="testnode 7 4 2564" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2565" TEXT="testnode 7 5 2565" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2566" TEXT="testnode 7 6 2566" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2567" TEXT="testnode 7 7 2567" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2568" TEXT="testnode 6 7 2568" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2569" TEXT="testnode 7 1 2569" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2570" TEXT="testnode 7 2 2570" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2571" TEXT="testnode 7 3 2571" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2572" TEXT="testnode 7 4 2572" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2573" TEXT="testnode 7 5 2573" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2574" TEXT="testnode 7 6 2574" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2575" TEXT="testnode 7 7 2575" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2576" TEXT="testnode 5 4 2576" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2577" TEXT="testnode 6 1 2577" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2578" TEXT="testnode 7 1 2578" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2579" TEXT="testnode 7 2 2579" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2580" TEXT="testnode 7 3 2580" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2581" TEXT="testnode 7 4 2581" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2582" TEXT="testnode 7 5 2582" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2583" TEXT="testnode 7 6 2583" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2584" TEXT="testnode 7 7 2584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2585" TEXT="testnode 6 2 2585" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2586" TEXT="testnode 7 1 2586" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2587" TEXT="testnode 7 2 2587" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2588" TEXT="testnode 7 3 2588" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2589" TEXT="testnode 7 4 2589" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2590" TEXT="testnode 7 5 2590" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2591" TEXT="testnode 7 6 2591" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2592" TEXT="testnode 7 7 2592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2593" TEXT="testnode 6 3 2593" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2594" TEXT="testnode 7 1 2594" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2595" TEXT="testnode 7 2 2595" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2596" TEXT="testnode 7 3 2596" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2597" TEXT="testnode 7 4 2597" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2598" TEXT="testnode 7 5 2598" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2599" TEXT="testnode 7 6 2599" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2600" TEXT="testnode 7 7 2600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2601" TEXT="testnode 6 4 2601" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2602" TEXT="testnode 7 1 2602" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2603" TEXT="testnode 7 2 2603" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2604" TEXT="testnode 7 3 2604" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2605" TEXT="testnode 7 4 2605" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2606" TEXT="testnode 7 5 2606" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2607" TEXT="testnode 7 6 2607" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2608" TEXT="testnode 7 7 2608" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2609" TEXT="testnode 6 5 2609" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2610" TEXT="testnode 7 1 2610" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2611" TEXT="testnode 7 2 2611" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2612" TEXT="testnode 7 3 2612" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2613" TEXT="testnode 7 4 2613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2614" TEXT="testnode 7 5 2614" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2615" TEXT="testnode 7 6 2615" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2616" TEXT="testnode 7 7 2616" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2617" TEXT="testnode 6 6 2617" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2618" TEXT="testnode 7 1 2618" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2619" TEXT="testnode 7 2 2619" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2620" TEXT="testnode 7 3 2620" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2621" TEXT="testnode 7 4 2621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2622" TEXT="testnode 7 5 2622" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2623" TEXT="testnode 7 6 2623" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2624" TEXT="testnode 7 7 2624" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2625" TEXT="testnode 6 7 2625" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2626" TEXT="testnode 7 1 2626" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2627" TEXT="testnode 7 2 2627" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2628" TEXT="testnode 7 3 2628" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2629" TEXT="testnode 7 4 2629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2630" TEXT="testnode 7 5 2630" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2631" TEXT="testnode 7 6 2631" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2632" TEXT="testnode 7 7 2632" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2633" TEXT="testnode 5 5 2633" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2634" TEXT="testnode 6 1 2634" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2635" TEXT="testnode 7 1 2635" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2636" TEXT="testnode 7 2 2636" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2637" TEXT="testnode 7 3 2637" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2638" TEXT="testnode 7 4 2638" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2639" TEXT="testnode 7 5 2639" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2640" TEXT="testnode 7 6 2640" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2641" TEXT="testnode 7 7 2641" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2642" TEXT="testnode 6 2 2642" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2643" TEXT="testnode 7 1 2643" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2644" TEXT="testnode 7 2 2644" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2645" TEXT="testnode 7 3 2645" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2646" TEXT="testnode 7 4 2646" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2647" TEXT="testnode 7 5 2647" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2648" TEXT="testnode 7 6 2648" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2649" TEXT="testnode 7 7 2649" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2650" TEXT="testnode 6 3 2650" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2651" TEXT="testnode 7 1 2651" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2652" TEXT="testnode 7 2 2652" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2653" TEXT="testnode 7 3 2653" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2654" TEXT="testnode 7 4 2654" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2655" TEXT="testnode 7 5 2655" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2656" TEXT="testnode 7 6 2656" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2657" TEXT="testnode 7 7 2657" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2658" TEXT="testnode 6 4 2658" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2659" TEXT="testnode 7 1 2659" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2660" TEXT="testnode 7 2 2660" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2661" TEXT="testnode 7 3 2661" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2662" TEXT="testnode 7 4 2662" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2663" TEXT="testnode 7 5 2663" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2664" TEXT="testnode 7 6 2664" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2665" TEXT="testnode 7 7 2665" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2666" TEXT="testnode 6 5 2666" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2667" TEXT="testnode 7 1 2667" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2668" TEXT="testnode 7 2 2668" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2669" TEXT="testnode 7 3 2669" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2670" TEXT="testnode 7 4 2670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2671" TEXT="testnode 7 5 2671" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2672" TEXT="testnode 7 6 2672" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2673" TEXT="testnode 7 7 2673" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2674" TEXT="testnode 6 6 2674" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2675" TEXT="testnode 7 1 2675" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2676" TEXT="testnode 7 2 2676" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2677" TEXT="testnode 7 3 2677" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2678" TEXT="testnode 7 4 2678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2679" TEXT="testnode 7 5 2679" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2680" TEXT="testnode 7 6 2680" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2681" TEXT="testnode 7 7 2681" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2682" TEXT="testnode 6 7 2682" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2683" TEXT="testnode 7 1 2683" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2684" TEXT="testnode 7 2 2684" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2685" TEXT="testnode 7 3 2685" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2686" TEXT="testnode 7 4 2686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2687" TEXT="testnode 7 5 2687" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2688" TEXT="testnode 7 6 2688" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2689" TEXT="testnode 7 7 2689" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2690" TEXT="testnode 5 6 2690" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2691" TEXT="testnode 6 1 2691" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2692" TEXT="testnode 7 1 2692" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2693" TEXT="testnode 7 2 2693" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2694" TEXT="testnode 7 3 2694" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2695" TEXT="testnode 7 4 2695" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2696" TEXT="testnode 7 5 2696" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2697" TEXT="testnode 7 6 2697" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2698" TEXT="testnode 7 7 2698" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2699" TEXT="testnode 6 2 2699" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2700" TEXT="testnode 7 1 2700" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2701" TEXT="testnode 7 2 2701" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2702" TEXT="testnode 7 3 2702" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2703" TEXT="testnode 7 4 2703" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2704" TEXT="testnode 7 5 2704" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2705" TEXT="testnode 7 6 2705" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2706" TEXT="testnode 7 7 2706" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2707" TEXT="testnode 6 3 2707" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2708" TEXT="testnode 7 1 2708" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2709" TEXT="testnode 7 2 2709" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2710" TEXT="testnode 7 3 2710" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2711" TEXT="testnode 7 4 2711" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2712" TEXT="testnode 7 5 2712" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2713" TEXT="testnode 7 6 2713" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2714" TEXT="testnode 7 7 2714" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2715" TEXT="testnode 6 4 2715" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2716" TEXT="testnode 7 1 2716" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2717" TEXT="testnode 7 2 2717" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2718" TEXT="testnode 7 3 2718" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2719" TEXT="testnode 7 4 2719" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2720" TEXT="testnode 7 5 2720" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2721" TEXT="testnode 7 6 2721" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2722" TEXT="testnode 7 7 2722" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2723" TEXT="testnode 6 5 2723" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2724" TEXT="testnode 7 1 2724" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2725" TEXT="testnode 7 2 2725" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2726" TEXT="testnode 7 3 2726" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2727" TEXT="testnode 7 4 2727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2728" TEXT="testnode 7 5 2728" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2729" TEXT="testnode 7 6 2729" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2730" TEXT="testnode 7 7 2730" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2731" TEXT="testnode 6 6 2731" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2732" TEXT="testnode 7 1 2732" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2733" TEXT="testnode 7 2 2733" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2734" TEXT="testnode 7 3 2734" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2735" TEXT="testnode 7 4 2735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2736" TEXT="testnode 7 5 2736" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2737" TEXT="testnode 7 6 2737" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2738" TEXT="testnode 7 7 2738" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2739" TEXT="testnode 6 7 2739" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2740" TEXT="testnode 7 1 2740" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2741" TEXT="testnode 7 2 2741" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2742" TEXT="testnode 7 3 2742" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2743" TEXT="testnode 7 4 2743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2744" TEXT="testnode 7 5 2744" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2745" TEXT="testnode 7 6 2745" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2746" TEXT="testnode 7 7 2746" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2747" TEXT="testnode 5 7 2747" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2748" TEXT="testnode 6 1 2748" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2749" TEXT="testnode 7 1 2749" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2750" TEXT="testnode 7 2 2750" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2751" TEXT="testnode 7 3 2751" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2752" TEXT="testnode 7 4 2752" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2753" TEXT="testnode 7 5 2753" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2754" TEXT="testnode 7 6 2754" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2755" TEXT="testnode 7 7 2755" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2756" TEXT="testnode 6 2 2756" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2757" TEXT="testnode 7 1 2757" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2758" TEXT="testnode 7 2 2758" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2759" TEXT="testnode 7 3 2759" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2760" TEXT="testnode 7 4 2760" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2761" TEXT="testnode 7 5 2761" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2762" TEXT="testnode 7 6 2762" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2763" TEXT="testnode 7 7 2763" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2764" TEXT="testnode 6 3 2764" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2765" TEXT="testnode 7 1 2765" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2766" TEXT="testnode 7 2 2766" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2767" TEXT="testnode 7 3 2767" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2768" TEXT="testnode 7 4 2768" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2769" TEXT="testnode 7 5 2769" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2770" TEXT="testnode 7 6 2770" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2771" TEXT="testnode 7 7 2771" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2772" TEXT="testnode 6 4 2772" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2773" TEXT="testnode 7 1 2773" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2774" TEXT="testnode 7 2 2774" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2775" TEXT="testnode 7 3 2775" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2776" TEXT="testnode 7 4 2776" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2777" TEXT="testnode 7 5 2777" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2778" TEXT="testnode 7 6 2778" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2779" TEXT="testnode 7 7 2779" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2780" TEXT="testnode 6 5 2780" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2781" TEXT="testnode 7 1 2781" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2782" TEXT="testnode 7 2 2782" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2783" TEXT="testnode 7 3 2783" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2784" TEXT="testnode 7 4 2784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2785" TEXT="testnode 7 5 2785" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2786" TEXT="testnode 7 6 2786" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2787" TEXT="testnode 7 7 2787" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2788" TEXT="testnode 6 6 2788" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2789" TEXT="testnode 7 1 2789" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2790" TEXT="testnode 7 2 2790" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2791" TEXT="testnode 7 3 2791" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2792" TEXT="testnode 7 4 2792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2793" TEXT="testnode 7 5 2793" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2794" TEXT="testnode 7 6 2794" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2795" TEXT="testnode 7 7 2795" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2796" TEXT="testnode 6 7 2796" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2797" TEXT="testnode 7 1 2797" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2798" TEXT="testnode 7 2 2798" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2799" TEXT="testnode 7 3 2799" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2800" TEXT="testnode 7 4 2800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2801" TEXT="testnode 7 5 2801" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2802" TEXT="testnode 7 6 2802" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2803" TEXT="testnode 7 7 2803" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2804" TEXT="testnode 3 2 2804" FOLDED = "true">
- <icon BUILTIN="full-4"/>
- <icon BUILTIN="full-5"/>
- <node ID="Freemind_Link_2805" TEXT="testnode 4 1 2805" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_2806" TEXT="testnode 5 1 2806" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2807" TEXT="testnode 6 1 2807" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2808" TEXT="testnode 7 1 2808" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2809" TEXT="testnode 7 2 2809" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2810" TEXT="testnode 7 3 2810" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2811" TEXT="testnode 7 4 2811" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2812" TEXT="testnode 7 5 2812" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2813" TEXT="testnode 7 6 2813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2814" TEXT="testnode 7 7 2814" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2815" TEXT="testnode 6 2 2815" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2816" TEXT="testnode 7 1 2816" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2817" TEXT="testnode 7 2 2817" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2818" TEXT="testnode 7 3 2818" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2819" TEXT="testnode 7 4 2819" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2820" TEXT="testnode 7 5 2820" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2821" TEXT="testnode 7 6 2821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2822" TEXT="testnode 7 7 2822" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2823" TEXT="testnode 6 3 2823" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2824" TEXT="testnode 7 1 2824" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2825" TEXT="testnode 7 2 2825" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2826" TEXT="testnode 7 3 2826" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2827" TEXT="testnode 7 4 2827" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2828" TEXT="testnode 7 5 2828" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2829" TEXT="testnode 7 6 2829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2830" TEXT="testnode 7 7 2830" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2831" TEXT="testnode 6 4 2831" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2832" TEXT="testnode 7 1 2832" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2833" TEXT="testnode 7 2 2833" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2834" TEXT="testnode 7 3 2834" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2835" TEXT="testnode 7 4 2835" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2836" TEXT="testnode 7 5 2836" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2837" TEXT="testnode 7 6 2837" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2838" TEXT="testnode 7 7 2838" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2839" TEXT="testnode 6 5 2839" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2840" TEXT="testnode 7 1 2840" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2841" TEXT="testnode 7 2 2841" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2842" TEXT="testnode 7 3 2842" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2843" TEXT="testnode 7 4 2843" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2844" TEXT="testnode 7 5 2844" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2845" TEXT="testnode 7 6 2845" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2846" TEXT="testnode 7 7 2846" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2847" TEXT="testnode 6 6 2847" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2848" TEXT="testnode 7 1 2848" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2849" TEXT="testnode 7 2 2849" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2850" TEXT="testnode 7 3 2850" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2851" TEXT="testnode 7 4 2851" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2852" TEXT="testnode 7 5 2852" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2853" TEXT="testnode 7 6 2853" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2854" TEXT="testnode 7 7 2854" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2855" TEXT="testnode 6 7 2855" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2856" TEXT="testnode 7 1 2856" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2857" TEXT="testnode 7 2 2857" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2858" TEXT="testnode 7 3 2858" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2859" TEXT="testnode 7 4 2859" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2860" TEXT="testnode 7 5 2860" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2861" TEXT="testnode 7 6 2861" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2862" TEXT="testnode 7 7 2862" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2863" TEXT="testnode 5 2 2863" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2864" TEXT="testnode 6 1 2864" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2865" TEXT="testnode 7 1 2865" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2866" TEXT="testnode 7 2 2866" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2867" TEXT="testnode 7 3 2867" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2868" TEXT="testnode 7 4 2868" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2869" TEXT="testnode 7 5 2869" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2870" TEXT="testnode 7 6 2870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2871" TEXT="testnode 7 7 2871" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2872" TEXT="testnode 6 2 2872" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2873" TEXT="testnode 7 1 2873" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2874" TEXT="testnode 7 2 2874" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2875" TEXT="testnode 7 3 2875" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2876" TEXT="testnode 7 4 2876" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2877" TEXT="testnode 7 5 2877" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2878" TEXT="testnode 7 6 2878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2879" TEXT="testnode 7 7 2879" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2880" TEXT="testnode 6 3 2880" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2881" TEXT="testnode 7 1 2881" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2882" TEXT="testnode 7 2 2882" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2883" TEXT="testnode 7 3 2883" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2884" TEXT="testnode 7 4 2884" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2885" TEXT="testnode 7 5 2885" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2886" TEXT="testnode 7 6 2886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2887" TEXT="testnode 7 7 2887" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2888" TEXT="testnode 6 4 2888" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2889" TEXT="testnode 7 1 2889" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2890" TEXT="testnode 7 2 2890" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2891" TEXT="testnode 7 3 2891" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2892" TEXT="testnode 7 4 2892" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2893" TEXT="testnode 7 5 2893" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2894" TEXT="testnode 7 6 2894" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2895" TEXT="testnode 7 7 2895" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2896" TEXT="testnode 6 5 2896" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2897" TEXT="testnode 7 1 2897" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2898" TEXT="testnode 7 2 2898" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2899" TEXT="testnode 7 3 2899" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2900" TEXT="testnode 7 4 2900" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2901" TEXT="testnode 7 5 2901" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2902" TEXT="testnode 7 6 2902" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2903" TEXT="testnode 7 7 2903" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2904" TEXT="testnode 6 6 2904" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2905" TEXT="testnode 7 1 2905" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2906" TEXT="testnode 7 2 2906" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2907" TEXT="testnode 7 3 2907" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2908" TEXT="testnode 7 4 2908" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2909" TEXT="testnode 7 5 2909" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2910" TEXT="testnode 7 6 2910" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2911" TEXT="testnode 7 7 2911" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2912" TEXT="testnode 6 7 2912" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2913" TEXT="testnode 7 1 2913" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2914" TEXT="testnode 7 2 2914" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2915" TEXT="testnode 7 3 2915" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2916" TEXT="testnode 7 4 2916" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2917" TEXT="testnode 7 5 2917" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2918" TEXT="testnode 7 6 2918" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2919" TEXT="testnode 7 7 2919" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2920" TEXT="testnode 5 3 2920" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2921" TEXT="testnode 6 1 2921" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2922" TEXT="testnode 7 1 2922" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2923" TEXT="testnode 7 2 2923" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2924" TEXT="testnode 7 3 2924" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2925" TEXT="testnode 7 4 2925" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2926" TEXT="testnode 7 5 2926" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2927" TEXT="testnode 7 6 2927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2928" TEXT="testnode 7 7 2928" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2929" TEXT="testnode 6 2 2929" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2930" TEXT="testnode 7 1 2930" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2931" TEXT="testnode 7 2 2931" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2932" TEXT="testnode 7 3 2932" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2933" TEXT="testnode 7 4 2933" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2934" TEXT="testnode 7 5 2934" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2935" TEXT="testnode 7 6 2935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2936" TEXT="testnode 7 7 2936" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2937" TEXT="testnode 6 3 2937" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2938" TEXT="testnode 7 1 2938" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2939" TEXT="testnode 7 2 2939" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2940" TEXT="testnode 7 3 2940" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2941" TEXT="testnode 7 4 2941" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2942" TEXT="testnode 7 5 2942" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2943" TEXT="testnode 7 6 2943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2944" TEXT="testnode 7 7 2944" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2945" TEXT="testnode 6 4 2945" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2946" TEXT="testnode 7 1 2946" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2947" TEXT="testnode 7 2 2947" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2948" TEXT="testnode 7 3 2948" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2949" TEXT="testnode 7 4 2949" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2950" TEXT="testnode 7 5 2950" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2951" TEXT="testnode 7 6 2951" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2952" TEXT="testnode 7 7 2952" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2953" TEXT="testnode 6 5 2953" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2954" TEXT="testnode 7 1 2954" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2955" TEXT="testnode 7 2 2955" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2956" TEXT="testnode 7 3 2956" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2957" TEXT="testnode 7 4 2957" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2958" TEXT="testnode 7 5 2958" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2959" TEXT="testnode 7 6 2959" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2960" TEXT="testnode 7 7 2960" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2961" TEXT="testnode 6 6 2961" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2962" TEXT="testnode 7 1 2962" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2963" TEXT="testnode 7 2 2963" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2964" TEXT="testnode 7 3 2964" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2965" TEXT="testnode 7 4 2965" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2966" TEXT="testnode 7 5 2966" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2967" TEXT="testnode 7 6 2967" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2968" TEXT="testnode 7 7 2968" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2969" TEXT="testnode 6 7 2969" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2970" TEXT="testnode 7 1 2970" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2971" TEXT="testnode 7 2 2971" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2972" TEXT="testnode 7 3 2972" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2973" TEXT="testnode 7 4 2973" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2974" TEXT="testnode 7 5 2974" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2975" TEXT="testnode 7 6 2975" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2976" TEXT="testnode 7 7 2976" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_2977" TEXT="testnode 5 4 2977" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_2978" TEXT="testnode 6 1 2978" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2979" TEXT="testnode 7 1 2979" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2980" TEXT="testnode 7 2 2980" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2981" TEXT="testnode 7 3 2981" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2982" TEXT="testnode 7 4 2982" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2983" TEXT="testnode 7 5 2983" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2984" TEXT="testnode 7 6 2984" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2985" TEXT="testnode 7 7 2985" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2986" TEXT="testnode 6 2 2986" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2987" TEXT="testnode 7 1 2987" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2988" TEXT="testnode 7 2 2988" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2989" TEXT="testnode 7 3 2989" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2990" TEXT="testnode 7 4 2990" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2991" TEXT="testnode 7 5 2991" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2992" TEXT="testnode 7 6 2992" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2993" TEXT="testnode 7 7 2993" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_2994" TEXT="testnode 6 3 2994" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_2995" TEXT="testnode 7 1 2995" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2996" TEXT="testnode 7 2 2996" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2997" TEXT="testnode 7 3 2997" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2998" TEXT="testnode 7 4 2998" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_2999" TEXT="testnode 7 5 2999" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3000" TEXT="testnode 7 6 3000" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3001" TEXT="testnode 7 7 3001" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3002" TEXT="testnode 6 4 3002" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3003" TEXT="testnode 7 1 3003" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3004" TEXT="testnode 7 2 3004" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3005" TEXT="testnode 7 3 3005" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3006" TEXT="testnode 7 4 3006" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3007" TEXT="testnode 7 5 3007" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3008" TEXT="testnode 7 6 3008" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3009" TEXT="testnode 7 7 3009" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3010" TEXT="testnode 6 5 3010" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3011" TEXT="testnode 7 1 3011" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3012" TEXT="testnode 7 2 3012" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3013" TEXT="testnode 7 3 3013" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3014" TEXT="testnode 7 4 3014" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3015" TEXT="testnode 7 5 3015" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3016" TEXT="testnode 7 6 3016" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3017" TEXT="testnode 7 7 3017" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3018" TEXT="testnode 6 6 3018" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3019" TEXT="testnode 7 1 3019" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3020" TEXT="testnode 7 2 3020" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3021" TEXT="testnode 7 3 3021" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3022" TEXT="testnode 7 4 3022" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3023" TEXT="testnode 7 5 3023" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3024" TEXT="testnode 7 6 3024" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3025" TEXT="testnode 7 7 3025" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3026" TEXT="testnode 6 7 3026" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3027" TEXT="testnode 7 1 3027" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3028" TEXT="testnode 7 2 3028" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3029" TEXT="testnode 7 3 3029" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3030" TEXT="testnode 7 4 3030" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3031" TEXT="testnode 7 5 3031" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3032" TEXT="testnode 7 6 3032" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3033" TEXT="testnode 7 7 3033" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3034" TEXT="testnode 5 5 3034" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3035" TEXT="testnode 6 1 3035" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3036" TEXT="testnode 7 1 3036" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3037" TEXT="testnode 7 2 3037" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3038" TEXT="testnode 7 3 3038" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3039" TEXT="testnode 7 4 3039" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3040" TEXT="testnode 7 5 3040" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3041" TEXT="testnode 7 6 3041" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3042" TEXT="testnode 7 7 3042" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3043" TEXT="testnode 6 2 3043" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3044" TEXT="testnode 7 1 3044" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3045" TEXT="testnode 7 2 3045" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3046" TEXT="testnode 7 3 3046" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3047" TEXT="testnode 7 4 3047" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3048" TEXT="testnode 7 5 3048" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3049" TEXT="testnode 7 6 3049" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3050" TEXT="testnode 7 7 3050" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3051" TEXT="testnode 6 3 3051" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3052" TEXT="testnode 7 1 3052" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3053" TEXT="testnode 7 2 3053" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3054" TEXT="testnode 7 3 3054" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3055" TEXT="testnode 7 4 3055" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3056" TEXT="testnode 7 5 3056" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3057" TEXT="testnode 7 6 3057" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3058" TEXT="testnode 7 7 3058" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3059" TEXT="testnode 6 4 3059" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3060" TEXT="testnode 7 1 3060" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3061" TEXT="testnode 7 2 3061" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3062" TEXT="testnode 7 3 3062" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3063" TEXT="testnode 7 4 3063" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3064" TEXT="testnode 7 5 3064" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3065" TEXT="testnode 7 6 3065" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3066" TEXT="testnode 7 7 3066" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3067" TEXT="testnode 6 5 3067" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3068" TEXT="testnode 7 1 3068" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3069" TEXT="testnode 7 2 3069" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3070" TEXT="testnode 7 3 3070" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3071" TEXT="testnode 7 4 3071" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3072" TEXT="testnode 7 5 3072" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3073" TEXT="testnode 7 6 3073" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3074" TEXT="testnode 7 7 3074" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3075" TEXT="testnode 6 6 3075" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3076" TEXT="testnode 7 1 3076" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3077" TEXT="testnode 7 2 3077" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3078" TEXT="testnode 7 3 3078" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3079" TEXT="testnode 7 4 3079" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3080" TEXT="testnode 7 5 3080" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3081" TEXT="testnode 7 6 3081" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3082" TEXT="testnode 7 7 3082" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3083" TEXT="testnode 6 7 3083" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3084" TEXT="testnode 7 1 3084" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3085" TEXT="testnode 7 2 3085" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3086" TEXT="testnode 7 3 3086" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3087" TEXT="testnode 7 4 3087" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3088" TEXT="testnode 7 5 3088" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3089" TEXT="testnode 7 6 3089" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3090" TEXT="testnode 7 7 3090" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3091" TEXT="testnode 5 6 3091" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3092" TEXT="testnode 6 1 3092" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3093" TEXT="testnode 7 1 3093" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3094" TEXT="testnode 7 2 3094" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3095" TEXT="testnode 7 3 3095" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3096" TEXT="testnode 7 4 3096" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3097" TEXT="testnode 7 5 3097" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3098" TEXT="testnode 7 6 3098" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3099" TEXT="testnode 7 7 3099" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3100" TEXT="testnode 6 2 3100" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3101" TEXT="testnode 7 1 3101" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3102" TEXT="testnode 7 2 3102" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3103" TEXT="testnode 7 3 3103" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3104" TEXT="testnode 7 4 3104" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3105" TEXT="testnode 7 5 3105" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3106" TEXT="testnode 7 6 3106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3107" TEXT="testnode 7 7 3107" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3108" TEXT="testnode 6 3 3108" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3109" TEXT="testnode 7 1 3109" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3110" TEXT="testnode 7 2 3110" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3111" TEXT="testnode 7 3 3111" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3112" TEXT="testnode 7 4 3112" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3113" TEXT="testnode 7 5 3113" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3114" TEXT="testnode 7 6 3114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3115" TEXT="testnode 7 7 3115" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3116" TEXT="testnode 6 4 3116" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3117" TEXT="testnode 7 1 3117" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3118" TEXT="testnode 7 2 3118" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3119" TEXT="testnode 7 3 3119" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3120" TEXT="testnode 7 4 3120" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3121" TEXT="testnode 7 5 3121" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3122" TEXT="testnode 7 6 3122" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3123" TEXT="testnode 7 7 3123" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3124" TEXT="testnode 6 5 3124" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3125" TEXT="testnode 7 1 3125" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3126" TEXT="testnode 7 2 3126" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3127" TEXT="testnode 7 3 3127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3128" TEXT="testnode 7 4 3128" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3129" TEXT="testnode 7 5 3129" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3130" TEXT="testnode 7 6 3130" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3131" TEXT="testnode 7 7 3131" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3132" TEXT="testnode 6 6 3132" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3133" TEXT="testnode 7 1 3133" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3134" TEXT="testnode 7 2 3134" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3135" TEXT="testnode 7 3 3135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3136" TEXT="testnode 7 4 3136" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3137" TEXT="testnode 7 5 3137" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3138" TEXT="testnode 7 6 3138" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3139" TEXT="testnode 7 7 3139" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3140" TEXT="testnode 6 7 3140" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3141" TEXT="testnode 7 1 3141" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3142" TEXT="testnode 7 2 3142" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3143" TEXT="testnode 7 3 3143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3144" TEXT="testnode 7 4 3144" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3145" TEXT="testnode 7 5 3145" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3146" TEXT="testnode 7 6 3146" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3147" TEXT="testnode 7 7 3147" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3148" TEXT="testnode 5 7 3148" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3149" TEXT="testnode 6 1 3149" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3150" TEXT="testnode 7 1 3150" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3151" TEXT="testnode 7 2 3151" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3152" TEXT="testnode 7 3 3152" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3153" TEXT="testnode 7 4 3153" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3154" TEXT="testnode 7 5 3154" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3155" TEXT="testnode 7 6 3155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3156" TEXT="testnode 7 7 3156" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3157" TEXT="testnode 6 2 3157" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3158" TEXT="testnode 7 1 3158" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3159" TEXT="testnode 7 2 3159" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3160" TEXT="testnode 7 3 3160" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3161" TEXT="testnode 7 4 3161" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3162" TEXT="testnode 7 5 3162" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3163" TEXT="testnode 7 6 3163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3164" TEXT="testnode 7 7 3164" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3165" TEXT="testnode 6 3 3165" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3166" TEXT="testnode 7 1 3166" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3167" TEXT="testnode 7 2 3167" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3168" TEXT="testnode 7 3 3168" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3169" TEXT="testnode 7 4 3169" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3170" TEXT="testnode 7 5 3170" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3171" TEXT="testnode 7 6 3171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3172" TEXT="testnode 7 7 3172" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3173" TEXT="testnode 6 4 3173" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3174" TEXT="testnode 7 1 3174" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3175" TEXT="testnode 7 2 3175" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3176" TEXT="testnode 7 3 3176" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3177" TEXT="testnode 7 4 3177" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3178" TEXT="testnode 7 5 3178" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3179" TEXT="testnode 7 6 3179" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3180" TEXT="testnode 7 7 3180" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3181" TEXT="testnode 6 5 3181" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3182" TEXT="testnode 7 1 3182" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3183" TEXT="testnode 7 2 3183" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3184" TEXT="testnode 7 3 3184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3185" TEXT="testnode 7 4 3185" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3186" TEXT="testnode 7 5 3186" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3187" TEXT="testnode 7 6 3187" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3188" TEXT="testnode 7 7 3188" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3189" TEXT="testnode 6 6 3189" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3190" TEXT="testnode 7 1 3190" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3191" TEXT="testnode 7 2 3191" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3192" TEXT="testnode 7 3 3192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3193" TEXT="testnode 7 4 3193" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3194" TEXT="testnode 7 5 3194" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3195" TEXT="testnode 7 6 3195" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3196" TEXT="testnode 7 7 3196" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3197" TEXT="testnode 6 7 3197" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3198" TEXT="testnode 7 1 3198" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3199" TEXT="testnode 7 2 3199" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3200" TEXT="testnode 7 3 3200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3201" TEXT="testnode 7 4 3201" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3202" TEXT="testnode 7 5 3202" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3203" TEXT="testnode 7 6 3203" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3204" TEXT="testnode 7 7 3204" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3205" TEXT="testnode 4 2 3205" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_3206" TEXT="testnode 5 1 3206" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3207" TEXT="testnode 6 1 3207" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3208" TEXT="testnode 7 1 3208" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3209" TEXT="testnode 7 2 3209" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3210" TEXT="testnode 7 3 3210" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3211" TEXT="testnode 7 4 3211" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3212" TEXT="testnode 7 5 3212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3213" TEXT="testnode 7 6 3213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3214" TEXT="testnode 7 7 3214" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3215" TEXT="testnode 6 2 3215" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3216" TEXT="testnode 7 1 3216" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3217" TEXT="testnode 7 2 3217" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3218" TEXT="testnode 7 3 3218" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3219" TEXT="testnode 7 4 3219" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3220" TEXT="testnode 7 5 3220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3221" TEXT="testnode 7 6 3221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3222" TEXT="testnode 7 7 3222" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3223" TEXT="testnode 6 3 3223" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3224" TEXT="testnode 7 1 3224" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3225" TEXT="testnode 7 2 3225" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3226" TEXT="testnode 7 3 3226" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3227" TEXT="testnode 7 4 3227" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3228" TEXT="testnode 7 5 3228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3229" TEXT="testnode 7 6 3229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3230" TEXT="testnode 7 7 3230" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3231" TEXT="testnode 6 4 3231" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3232" TEXT="testnode 7 1 3232" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3233" TEXT="testnode 7 2 3233" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3234" TEXT="testnode 7 3 3234" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3235" TEXT="testnode 7 4 3235" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3236" TEXT="testnode 7 5 3236" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3237" TEXT="testnode 7 6 3237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3238" TEXT="testnode 7 7 3238" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3239" TEXT="testnode 6 5 3239" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3240" TEXT="testnode 7 1 3240" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3241" TEXT="testnode 7 2 3241" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3242" TEXT="testnode 7 3 3242" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3243" TEXT="testnode 7 4 3243" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3244" TEXT="testnode 7 5 3244" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3245" TEXT="testnode 7 6 3245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3246" TEXT="testnode 7 7 3246" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3247" TEXT="testnode 6 6 3247" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3248" TEXT="testnode 7 1 3248" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3249" TEXT="testnode 7 2 3249" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3250" TEXT="testnode 7 3 3250" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3251" TEXT="testnode 7 4 3251" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3252" TEXT="testnode 7 5 3252" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3253" TEXT="testnode 7 6 3253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3254" TEXT="testnode 7 7 3254" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3255" TEXT="testnode 6 7 3255" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3256" TEXT="testnode 7 1 3256" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3257" TEXT="testnode 7 2 3257" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3258" TEXT="testnode 7 3 3258" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3259" TEXT="testnode 7 4 3259" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3260" TEXT="testnode 7 5 3260" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3261" TEXT="testnode 7 6 3261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3262" TEXT="testnode 7 7 3262" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3263" TEXT="testnode 5 2 3263" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3264" TEXT="testnode 6 1 3264" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3265" TEXT="testnode 7 1 3265" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3266" TEXT="testnode 7 2 3266" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3267" TEXT="testnode 7 3 3267" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3268" TEXT="testnode 7 4 3268" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3269" TEXT="testnode 7 5 3269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3270" TEXT="testnode 7 6 3270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3271" TEXT="testnode 7 7 3271" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3272" TEXT="testnode 6 2 3272" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3273" TEXT="testnode 7 1 3273" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3274" TEXT="testnode 7 2 3274" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3275" TEXT="testnode 7 3 3275" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3276" TEXT="testnode 7 4 3276" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3277" TEXT="testnode 7 5 3277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3278" TEXT="testnode 7 6 3278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3279" TEXT="testnode 7 7 3279" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3280" TEXT="testnode 6 3 3280" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3281" TEXT="testnode 7 1 3281" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3282" TEXT="testnode 7 2 3282" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3283" TEXT="testnode 7 3 3283" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3284" TEXT="testnode 7 4 3284" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3285" TEXT="testnode 7 5 3285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3286" TEXT="testnode 7 6 3286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3287" TEXT="testnode 7 7 3287" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3288" TEXT="testnode 6 4 3288" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3289" TEXT="testnode 7 1 3289" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3290" TEXT="testnode 7 2 3290" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3291" TEXT="testnode 7 3 3291" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3292" TEXT="testnode 7 4 3292" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3293" TEXT="testnode 7 5 3293" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3294" TEXT="testnode 7 6 3294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3295" TEXT="testnode 7 7 3295" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3296" TEXT="testnode 6 5 3296" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3297" TEXT="testnode 7 1 3297" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3298" TEXT="testnode 7 2 3298" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3299" TEXT="testnode 7 3 3299" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3300" TEXT="testnode 7 4 3300" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3301" TEXT="testnode 7 5 3301" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3302" TEXT="testnode 7 6 3302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3303" TEXT="testnode 7 7 3303" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3304" TEXT="testnode 6 6 3304" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3305" TEXT="testnode 7 1 3305" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3306" TEXT="testnode 7 2 3306" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3307" TEXT="testnode 7 3 3307" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3308" TEXT="testnode 7 4 3308" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3309" TEXT="testnode 7 5 3309" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3310" TEXT="testnode 7 6 3310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3311" TEXT="testnode 7 7 3311" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3312" TEXT="testnode 6 7 3312" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3313" TEXT="testnode 7 1 3313" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3314" TEXT="testnode 7 2 3314" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3315" TEXT="testnode 7 3 3315" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3316" TEXT="testnode 7 4 3316" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3317" TEXT="testnode 7 5 3317" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3318" TEXT="testnode 7 6 3318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3319" TEXT="testnode 7 7 3319" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3320" TEXT="testnode 5 3 3320" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3321" TEXT="testnode 6 1 3321" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3322" TEXT="testnode 7 1 3322" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3323" TEXT="testnode 7 2 3323" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3324" TEXT="testnode 7 3 3324" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3325" TEXT="testnode 7 4 3325" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3326" TEXT="testnode 7 5 3326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3327" TEXT="testnode 7 6 3327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3328" TEXT="testnode 7 7 3328" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3329" TEXT="testnode 6 2 3329" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3330" TEXT="testnode 7 1 3330" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3331" TEXT="testnode 7 2 3331" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3332" TEXT="testnode 7 3 3332" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3333" TEXT="testnode 7 4 3333" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3334" TEXT="testnode 7 5 3334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3335" TEXT="testnode 7 6 3335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3336" TEXT="testnode 7 7 3336" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3337" TEXT="testnode 6 3 3337" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3338" TEXT="testnode 7 1 3338" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3339" TEXT="testnode 7 2 3339" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3340" TEXT="testnode 7 3 3340" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3341" TEXT="testnode 7 4 3341" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3342" TEXT="testnode 7 5 3342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3343" TEXT="testnode 7 6 3343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3344" TEXT="testnode 7 7 3344" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3345" TEXT="testnode 6 4 3345" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3346" TEXT="testnode 7 1 3346" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3347" TEXT="testnode 7 2 3347" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3348" TEXT="testnode 7 3 3348" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3349" TEXT="testnode 7 4 3349" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3350" TEXT="testnode 7 5 3350" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3351" TEXT="testnode 7 6 3351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3352" TEXT="testnode 7 7 3352" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3353" TEXT="testnode 6 5 3353" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3354" TEXT="testnode 7 1 3354" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3355" TEXT="testnode 7 2 3355" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3356" TEXT="testnode 7 3 3356" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3357" TEXT="testnode 7 4 3357" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3358" TEXT="testnode 7 5 3358" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3359" TEXT="testnode 7 6 3359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3360" TEXT="testnode 7 7 3360" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3361" TEXT="testnode 6 6 3361" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3362" TEXT="testnode 7 1 3362" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3363" TEXT="testnode 7 2 3363" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3364" TEXT="testnode 7 3 3364" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3365" TEXT="testnode 7 4 3365" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3366" TEXT="testnode 7 5 3366" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3367" TEXT="testnode 7 6 3367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3368" TEXT="testnode 7 7 3368" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3369" TEXT="testnode 6 7 3369" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3370" TEXT="testnode 7 1 3370" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3371" TEXT="testnode 7 2 3371" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3372" TEXT="testnode 7 3 3372" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3373" TEXT="testnode 7 4 3373" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3374" TEXT="testnode 7 5 3374" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3375" TEXT="testnode 7 6 3375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3376" TEXT="testnode 7 7 3376" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3377" TEXT="testnode 5 4 3377" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3378" TEXT="testnode 6 1 3378" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3379" TEXT="testnode 7 1 3379" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3380" TEXT="testnode 7 2 3380" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3381" TEXT="testnode 7 3 3381" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3382" TEXT="testnode 7 4 3382" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3383" TEXT="testnode 7 5 3383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3384" TEXT="testnode 7 6 3384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3385" TEXT="testnode 7 7 3385" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3386" TEXT="testnode 6 2 3386" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3387" TEXT="testnode 7 1 3387" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3388" TEXT="testnode 7 2 3388" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3389" TEXT="testnode 7 3 3389" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3390" TEXT="testnode 7 4 3390" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3391" TEXT="testnode 7 5 3391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3392" TEXT="testnode 7 6 3392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3393" TEXT="testnode 7 7 3393" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3394" TEXT="testnode 6 3 3394" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3395" TEXT="testnode 7 1 3395" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3396" TEXT="testnode 7 2 3396" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3397" TEXT="testnode 7 3 3397" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3398" TEXT="testnode 7 4 3398" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3399" TEXT="testnode 7 5 3399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3400" TEXT="testnode 7 6 3400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3401" TEXT="testnode 7 7 3401" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3402" TEXT="testnode 6 4 3402" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3403" TEXT="testnode 7 1 3403" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3404" TEXT="testnode 7 2 3404" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3405" TEXT="testnode 7 3 3405" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3406" TEXT="testnode 7 4 3406" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3407" TEXT="testnode 7 5 3407" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3408" TEXT="testnode 7 6 3408" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3409" TEXT="testnode 7 7 3409" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3410" TEXT="testnode 6 5 3410" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3411" TEXT="testnode 7 1 3411" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3412" TEXT="testnode 7 2 3412" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3413" TEXT="testnode 7 3 3413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3414" TEXT="testnode 7 4 3414" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3415" TEXT="testnode 7 5 3415" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3416" TEXT="testnode 7 6 3416" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3417" TEXT="testnode 7 7 3417" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3418" TEXT="testnode 6 6 3418" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3419" TEXT="testnode 7 1 3419" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3420" TEXT="testnode 7 2 3420" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3421" TEXT="testnode 7 3 3421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3422" TEXT="testnode 7 4 3422" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3423" TEXT="testnode 7 5 3423" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3424" TEXT="testnode 7 6 3424" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3425" TEXT="testnode 7 7 3425" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3426" TEXT="testnode 6 7 3426" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3427" TEXT="testnode 7 1 3427" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3428" TEXT="testnode 7 2 3428" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3429" TEXT="testnode 7 3 3429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3430" TEXT="testnode 7 4 3430" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3431" TEXT="testnode 7 5 3431" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3432" TEXT="testnode 7 6 3432" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3433" TEXT="testnode 7 7 3433" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3434" TEXT="testnode 5 5 3434" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3435" TEXT="testnode 6 1 3435" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3436" TEXT="testnode 7 1 3436" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3437" TEXT="testnode 7 2 3437" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3438" TEXT="testnode 7 3 3438" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3439" TEXT="testnode 7 4 3439" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3440" TEXT="testnode 7 5 3440" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3441" TEXT="testnode 7 6 3441" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3442" TEXT="testnode 7 7 3442" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3443" TEXT="testnode 6 2 3443" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3444" TEXT="testnode 7 1 3444" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3445" TEXT="testnode 7 2 3445" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3446" TEXT="testnode 7 3 3446" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3447" TEXT="testnode 7 4 3447" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3448" TEXT="testnode 7 5 3448" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3449" TEXT="testnode 7 6 3449" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3450" TEXT="testnode 7 7 3450" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3451" TEXT="testnode 6 3 3451" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3452" TEXT="testnode 7 1 3452" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3453" TEXT="testnode 7 2 3453" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3454" TEXT="testnode 7 3 3454" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3455" TEXT="testnode 7 4 3455" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3456" TEXT="testnode 7 5 3456" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3457" TEXT="testnode 7 6 3457" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3458" TEXT="testnode 7 7 3458" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3459" TEXT="testnode 6 4 3459" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3460" TEXT="testnode 7 1 3460" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3461" TEXT="testnode 7 2 3461" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3462" TEXT="testnode 7 3 3462" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3463" TEXT="testnode 7 4 3463" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3464" TEXT="testnode 7 5 3464" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3465" TEXT="testnode 7 6 3465" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3466" TEXT="testnode 7 7 3466" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3467" TEXT="testnode 6 5 3467" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3468" TEXT="testnode 7 1 3468" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3469" TEXT="testnode 7 2 3469" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3470" TEXT="testnode 7 3 3470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3471" TEXT="testnode 7 4 3471" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3472" TEXT="testnode 7 5 3472" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3473" TEXT="testnode 7 6 3473" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3474" TEXT="testnode 7 7 3474" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3475" TEXT="testnode 6 6 3475" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3476" TEXT="testnode 7 1 3476" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3477" TEXT="testnode 7 2 3477" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3478" TEXT="testnode 7 3 3478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3479" TEXT="testnode 7 4 3479" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3480" TEXT="testnode 7 5 3480" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3481" TEXT="testnode 7 6 3481" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3482" TEXT="testnode 7 7 3482" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3483" TEXT="testnode 6 7 3483" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3484" TEXT="testnode 7 1 3484" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3485" TEXT="testnode 7 2 3485" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3486" TEXT="testnode 7 3 3486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3487" TEXT="testnode 7 4 3487" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3488" TEXT="testnode 7 5 3488" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3489" TEXT="testnode 7 6 3489" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3490" TEXT="testnode 7 7 3490" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3491" TEXT="testnode 5 6 3491" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3492" TEXT="testnode 6 1 3492" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3493" TEXT="testnode 7 1 3493" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3494" TEXT="testnode 7 2 3494" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3495" TEXT="testnode 7 3 3495" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3496" TEXT="testnode 7 4 3496" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3497" TEXT="testnode 7 5 3497" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3498" TEXT="testnode 7 6 3498" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3499" TEXT="testnode 7 7 3499" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3500" TEXT="testnode 6 2 3500" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3501" TEXT="testnode 7 1 3501" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3502" TEXT="testnode 7 2 3502" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3503" TEXT="testnode 7 3 3503" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3504" TEXT="testnode 7 4 3504" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3505" TEXT="testnode 7 5 3505" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3506" TEXT="testnode 7 6 3506" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3507" TEXT="testnode 7 7 3507" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3508" TEXT="testnode 6 3 3508" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3509" TEXT="testnode 7 1 3509" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3510" TEXT="testnode 7 2 3510" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3511" TEXT="testnode 7 3 3511" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3512" TEXT="testnode 7 4 3512" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3513" TEXT="testnode 7 5 3513" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3514" TEXT="testnode 7 6 3514" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3515" TEXT="testnode 7 7 3515" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3516" TEXT="testnode 6 4 3516" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3517" TEXT="testnode 7 1 3517" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3518" TEXT="testnode 7 2 3518" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3519" TEXT="testnode 7 3 3519" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3520" TEXT="testnode 7 4 3520" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3521" TEXT="testnode 7 5 3521" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3522" TEXT="testnode 7 6 3522" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3523" TEXT="testnode 7 7 3523" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3524" TEXT="testnode 6 5 3524" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3525" TEXT="testnode 7 1 3525" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3526" TEXT="testnode 7 2 3526" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3527" TEXT="testnode 7 3 3527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3528" TEXT="testnode 7 4 3528" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3529" TEXT="testnode 7 5 3529" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3530" TEXT="testnode 7 6 3530" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3531" TEXT="testnode 7 7 3531" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3532" TEXT="testnode 6 6 3532" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3533" TEXT="testnode 7 1 3533" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3534" TEXT="testnode 7 2 3534" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3535" TEXT="testnode 7 3 3535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3536" TEXT="testnode 7 4 3536" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3537" TEXT="testnode 7 5 3537" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3538" TEXT="testnode 7 6 3538" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3539" TEXT="testnode 7 7 3539" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3540" TEXT="testnode 6 7 3540" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3541" TEXT="testnode 7 1 3541" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3542" TEXT="testnode 7 2 3542" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3543" TEXT="testnode 7 3 3543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3544" TEXT="testnode 7 4 3544" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3545" TEXT="testnode 7 5 3545" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3546" TEXT="testnode 7 6 3546" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3547" TEXT="testnode 7 7 3547" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3548" TEXT="testnode 5 7 3548" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3549" TEXT="testnode 6 1 3549" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3550" TEXT="testnode 7 1 3550" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3551" TEXT="testnode 7 2 3551" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3552" TEXT="testnode 7 3 3552" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3553" TEXT="testnode 7 4 3553" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3554" TEXT="testnode 7 5 3554" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3555" TEXT="testnode 7 6 3555" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3556" TEXT="testnode 7 7 3556" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3557" TEXT="testnode 6 2 3557" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3558" TEXT="testnode 7 1 3558" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3559" TEXT="testnode 7 2 3559" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3560" TEXT="testnode 7 3 3560" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3561" TEXT="testnode 7 4 3561" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3562" TEXT="testnode 7 5 3562" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3563" TEXT="testnode 7 6 3563" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3564" TEXT="testnode 7 7 3564" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3565" TEXT="testnode 6 3 3565" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3566" TEXT="testnode 7 1 3566" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3567" TEXT="testnode 7 2 3567" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3568" TEXT="testnode 7 3 3568" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3569" TEXT="testnode 7 4 3569" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3570" TEXT="testnode 7 5 3570" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3571" TEXT="testnode 7 6 3571" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3572" TEXT="testnode 7 7 3572" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3573" TEXT="testnode 6 4 3573" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3574" TEXT="testnode 7 1 3574" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3575" TEXT="testnode 7 2 3575" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3576" TEXT="testnode 7 3 3576" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3577" TEXT="testnode 7 4 3577" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3578" TEXT="testnode 7 5 3578" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3579" TEXT="testnode 7 6 3579" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3580" TEXT="testnode 7 7 3580" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3581" TEXT="testnode 6 5 3581" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3582" TEXT="testnode 7 1 3582" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3583" TEXT="testnode 7 2 3583" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3584" TEXT="testnode 7 3 3584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3585" TEXT="testnode 7 4 3585" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3586" TEXT="testnode 7 5 3586" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3587" TEXT="testnode 7 6 3587" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3588" TEXT="testnode 7 7 3588" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3589" TEXT="testnode 6 6 3589" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3590" TEXT="testnode 7 1 3590" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3591" TEXT="testnode 7 2 3591" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3592" TEXT="testnode 7 3 3592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3593" TEXT="testnode 7 4 3593" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3594" TEXT="testnode 7 5 3594" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3595" TEXT="testnode 7 6 3595" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3596" TEXT="testnode 7 7 3596" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3597" TEXT="testnode 6 7 3597" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3598" TEXT="testnode 7 1 3598" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3599" TEXT="testnode 7 2 3599" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3600" TEXT="testnode 7 3 3600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3601" TEXT="testnode 7 4 3601" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3602" TEXT="testnode 7 5 3602" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3603" TEXT="testnode 7 6 3603" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3604" TEXT="testnode 7 7 3604" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3605" TEXT="testnode 4 3 3605" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_3606" TEXT="testnode 5 1 3606" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3607" TEXT="testnode 6 1 3607" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3608" TEXT="testnode 7 1 3608" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3609" TEXT="testnode 7 2 3609" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3610" TEXT="testnode 7 3 3610" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3611" TEXT="testnode 7 4 3611" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3612" TEXT="testnode 7 5 3612" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3613" TEXT="testnode 7 6 3613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3614" TEXT="testnode 7 7 3614" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3615" TEXT="testnode 6 2 3615" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3616" TEXT="testnode 7 1 3616" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3617" TEXT="testnode 7 2 3617" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3618" TEXT="testnode 7 3 3618" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3619" TEXT="testnode 7 4 3619" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3620" TEXT="testnode 7 5 3620" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3621" TEXT="testnode 7 6 3621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3622" TEXT="testnode 7 7 3622" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3623" TEXT="testnode 6 3 3623" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3624" TEXT="testnode 7 1 3624" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3625" TEXT="testnode 7 2 3625" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3626" TEXT="testnode 7 3 3626" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3627" TEXT="testnode 7 4 3627" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3628" TEXT="testnode 7 5 3628" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3629" TEXT="testnode 7 6 3629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3630" TEXT="testnode 7 7 3630" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3631" TEXT="testnode 6 4 3631" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3632" TEXT="testnode 7 1 3632" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3633" TEXT="testnode 7 2 3633" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3634" TEXT="testnode 7 3 3634" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3635" TEXT="testnode 7 4 3635" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3636" TEXT="testnode 7 5 3636" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3637" TEXT="testnode 7 6 3637" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3638" TEXT="testnode 7 7 3638" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3639" TEXT="testnode 6 5 3639" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3640" TEXT="testnode 7 1 3640" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3641" TEXT="testnode 7 2 3641" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3642" TEXT="testnode 7 3 3642" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3643" TEXT="testnode 7 4 3643" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3644" TEXT="testnode 7 5 3644" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3645" TEXT="testnode 7 6 3645" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3646" TEXT="testnode 7 7 3646" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3647" TEXT="testnode 6 6 3647" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3648" TEXT="testnode 7 1 3648" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3649" TEXT="testnode 7 2 3649" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3650" TEXT="testnode 7 3 3650" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3651" TEXT="testnode 7 4 3651" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3652" TEXT="testnode 7 5 3652" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3653" TEXT="testnode 7 6 3653" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3654" TEXT="testnode 7 7 3654" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3655" TEXT="testnode 6 7 3655" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3656" TEXT="testnode 7 1 3656" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3657" TEXT="testnode 7 2 3657" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3658" TEXT="testnode 7 3 3658" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3659" TEXT="testnode 7 4 3659" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3660" TEXT="testnode 7 5 3660" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3661" TEXT="testnode 7 6 3661" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3662" TEXT="testnode 7 7 3662" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3663" TEXT="testnode 5 2 3663" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3664" TEXT="testnode 6 1 3664" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3665" TEXT="testnode 7 1 3665" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3666" TEXT="testnode 7 2 3666" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3667" TEXT="testnode 7 3 3667" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3668" TEXT="testnode 7 4 3668" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3669" TEXT="testnode 7 5 3669" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3670" TEXT="testnode 7 6 3670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3671" TEXT="testnode 7 7 3671" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3672" TEXT="testnode 6 2 3672" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3673" TEXT="testnode 7 1 3673" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3674" TEXT="testnode 7 2 3674" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3675" TEXT="testnode 7 3 3675" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3676" TEXT="testnode 7 4 3676" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3677" TEXT="testnode 7 5 3677" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3678" TEXT="testnode 7 6 3678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3679" TEXT="testnode 7 7 3679" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3680" TEXT="testnode 6 3 3680" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3681" TEXT="testnode 7 1 3681" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3682" TEXT="testnode 7 2 3682" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3683" TEXT="testnode 7 3 3683" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3684" TEXT="testnode 7 4 3684" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3685" TEXT="testnode 7 5 3685" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3686" TEXT="testnode 7 6 3686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3687" TEXT="testnode 7 7 3687" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3688" TEXT="testnode 6 4 3688" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3689" TEXT="testnode 7 1 3689" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3690" TEXT="testnode 7 2 3690" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3691" TEXT="testnode 7 3 3691" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3692" TEXT="testnode 7 4 3692" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3693" TEXT="testnode 7 5 3693" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3694" TEXT="testnode 7 6 3694" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3695" TEXT="testnode 7 7 3695" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3696" TEXT="testnode 6 5 3696" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3697" TEXT="testnode 7 1 3697" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3698" TEXT="testnode 7 2 3698" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3699" TEXT="testnode 7 3 3699" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3700" TEXT="testnode 7 4 3700" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3701" TEXT="testnode 7 5 3701" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3702" TEXT="testnode 7 6 3702" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3703" TEXT="testnode 7 7 3703" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3704" TEXT="testnode 6 6 3704" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3705" TEXT="testnode 7 1 3705" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3706" TEXT="testnode 7 2 3706" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3707" TEXT="testnode 7 3 3707" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3708" TEXT="testnode 7 4 3708" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3709" TEXT="testnode 7 5 3709" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3710" TEXT="testnode 7 6 3710" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3711" TEXT="testnode 7 7 3711" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3712" TEXT="testnode 6 7 3712" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3713" TEXT="testnode 7 1 3713" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3714" TEXT="testnode 7 2 3714" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3715" TEXT="testnode 7 3 3715" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3716" TEXT="testnode 7 4 3716" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3717" TEXT="testnode 7 5 3717" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3718" TEXT="testnode 7 6 3718" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3719" TEXT="testnode 7 7 3719" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3720" TEXT="testnode 5 3 3720" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3721" TEXT="testnode 6 1 3721" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3722" TEXT="testnode 7 1 3722" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3723" TEXT="testnode 7 2 3723" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3724" TEXT="testnode 7 3 3724" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3725" TEXT="testnode 7 4 3725" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3726" TEXT="testnode 7 5 3726" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3727" TEXT="testnode 7 6 3727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3728" TEXT="testnode 7 7 3728" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3729" TEXT="testnode 6 2 3729" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3730" TEXT="testnode 7 1 3730" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3731" TEXT="testnode 7 2 3731" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3732" TEXT="testnode 7 3 3732" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3733" TEXT="testnode 7 4 3733" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3734" TEXT="testnode 7 5 3734" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3735" TEXT="testnode 7 6 3735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3736" TEXT="testnode 7 7 3736" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3737" TEXT="testnode 6 3 3737" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3738" TEXT="testnode 7 1 3738" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3739" TEXT="testnode 7 2 3739" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3740" TEXT="testnode 7 3 3740" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3741" TEXT="testnode 7 4 3741" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3742" TEXT="testnode 7 5 3742" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3743" TEXT="testnode 7 6 3743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3744" TEXT="testnode 7 7 3744" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3745" TEXT="testnode 6 4 3745" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3746" TEXT="testnode 7 1 3746" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3747" TEXT="testnode 7 2 3747" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3748" TEXT="testnode 7 3 3748" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3749" TEXT="testnode 7 4 3749" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3750" TEXT="testnode 7 5 3750" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3751" TEXT="testnode 7 6 3751" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3752" TEXT="testnode 7 7 3752" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3753" TEXT="testnode 6 5 3753" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3754" TEXT="testnode 7 1 3754" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3755" TEXT="testnode 7 2 3755" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3756" TEXT="testnode 7 3 3756" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3757" TEXT="testnode 7 4 3757" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3758" TEXT="testnode 7 5 3758" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3759" TEXT="testnode 7 6 3759" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3760" TEXT="testnode 7 7 3760" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3761" TEXT="testnode 6 6 3761" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3762" TEXT="testnode 7 1 3762" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3763" TEXT="testnode 7 2 3763" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3764" TEXT="testnode 7 3 3764" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3765" TEXT="testnode 7 4 3765" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3766" TEXT="testnode 7 5 3766" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3767" TEXT="testnode 7 6 3767" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3768" TEXT="testnode 7 7 3768" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3769" TEXT="testnode 6 7 3769" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3770" TEXT="testnode 7 1 3770" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3771" TEXT="testnode 7 2 3771" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3772" TEXT="testnode 7 3 3772" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3773" TEXT="testnode 7 4 3773" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3774" TEXT="testnode 7 5 3774" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3775" TEXT="testnode 7 6 3775" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3776" TEXT="testnode 7 7 3776" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3777" TEXT="testnode 5 4 3777" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3778" TEXT="testnode 6 1 3778" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3779" TEXT="testnode 7 1 3779" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3780" TEXT="testnode 7 2 3780" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3781" TEXT="testnode 7 3 3781" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3782" TEXT="testnode 7 4 3782" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3783" TEXT="testnode 7 5 3783" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3784" TEXT="testnode 7 6 3784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3785" TEXT="testnode 7 7 3785" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3786" TEXT="testnode 6 2 3786" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3787" TEXT="testnode 7 1 3787" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3788" TEXT="testnode 7 2 3788" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3789" TEXT="testnode 7 3 3789" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3790" TEXT="testnode 7 4 3790" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3791" TEXT="testnode 7 5 3791" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3792" TEXT="testnode 7 6 3792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3793" TEXT="testnode 7 7 3793" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3794" TEXT="testnode 6 3 3794" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3795" TEXT="testnode 7 1 3795" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3796" TEXT="testnode 7 2 3796" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3797" TEXT="testnode 7 3 3797" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3798" TEXT="testnode 7 4 3798" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3799" TEXT="testnode 7 5 3799" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3800" TEXT="testnode 7 6 3800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3801" TEXT="testnode 7 7 3801" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3802" TEXT="testnode 6 4 3802" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3803" TEXT="testnode 7 1 3803" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3804" TEXT="testnode 7 2 3804" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3805" TEXT="testnode 7 3 3805" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3806" TEXT="testnode 7 4 3806" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3807" TEXT="testnode 7 5 3807" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3808" TEXT="testnode 7 6 3808" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3809" TEXT="testnode 7 7 3809" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3810" TEXT="testnode 6 5 3810" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3811" TEXT="testnode 7 1 3811" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3812" TEXT="testnode 7 2 3812" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3813" TEXT="testnode 7 3 3813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3814" TEXT="testnode 7 4 3814" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3815" TEXT="testnode 7 5 3815" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3816" TEXT="testnode 7 6 3816" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3817" TEXT="testnode 7 7 3817" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3818" TEXT="testnode 6 6 3818" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3819" TEXT="testnode 7 1 3819" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3820" TEXT="testnode 7 2 3820" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3821" TEXT="testnode 7 3 3821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3822" TEXT="testnode 7 4 3822" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3823" TEXT="testnode 7 5 3823" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3824" TEXT="testnode 7 6 3824" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3825" TEXT="testnode 7 7 3825" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3826" TEXT="testnode 6 7 3826" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3827" TEXT="testnode 7 1 3827" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3828" TEXT="testnode 7 2 3828" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3829" TEXT="testnode 7 3 3829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3830" TEXT="testnode 7 4 3830" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3831" TEXT="testnode 7 5 3831" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3832" TEXT="testnode 7 6 3832" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3833" TEXT="testnode 7 7 3833" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3834" TEXT="testnode 5 5 3834" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3835" TEXT="testnode 6 1 3835" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3836" TEXT="testnode 7 1 3836" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3837" TEXT="testnode 7 2 3837" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3838" TEXT="testnode 7 3 3838" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3839" TEXT="testnode 7 4 3839" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3840" TEXT="testnode 7 5 3840" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3841" TEXT="testnode 7 6 3841" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3842" TEXT="testnode 7 7 3842" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3843" TEXT="testnode 6 2 3843" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3844" TEXT="testnode 7 1 3844" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3845" TEXT="testnode 7 2 3845" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3846" TEXT="testnode 7 3 3846" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3847" TEXT="testnode 7 4 3847" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3848" TEXT="testnode 7 5 3848" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3849" TEXT="testnode 7 6 3849" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3850" TEXT="testnode 7 7 3850" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3851" TEXT="testnode 6 3 3851" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3852" TEXT="testnode 7 1 3852" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3853" TEXT="testnode 7 2 3853" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3854" TEXT="testnode 7 3 3854" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3855" TEXT="testnode 7 4 3855" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3856" TEXT="testnode 7 5 3856" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3857" TEXT="testnode 7 6 3857" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3858" TEXT="testnode 7 7 3858" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3859" TEXT="testnode 6 4 3859" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3860" TEXT="testnode 7 1 3860" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3861" TEXT="testnode 7 2 3861" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3862" TEXT="testnode 7 3 3862" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3863" TEXT="testnode 7 4 3863" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3864" TEXT="testnode 7 5 3864" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3865" TEXT="testnode 7 6 3865" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3866" TEXT="testnode 7 7 3866" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3867" TEXT="testnode 6 5 3867" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3868" TEXT="testnode 7 1 3868" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3869" TEXT="testnode 7 2 3869" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3870" TEXT="testnode 7 3 3870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3871" TEXT="testnode 7 4 3871" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3872" TEXT="testnode 7 5 3872" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3873" TEXT="testnode 7 6 3873" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3874" TEXT="testnode 7 7 3874" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3875" TEXT="testnode 6 6 3875" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3876" TEXT="testnode 7 1 3876" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3877" TEXT="testnode 7 2 3877" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3878" TEXT="testnode 7 3 3878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3879" TEXT="testnode 7 4 3879" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3880" TEXT="testnode 7 5 3880" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3881" TEXT="testnode 7 6 3881" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3882" TEXT="testnode 7 7 3882" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3883" TEXT="testnode 6 7 3883" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3884" TEXT="testnode 7 1 3884" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3885" TEXT="testnode 7 2 3885" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3886" TEXT="testnode 7 3 3886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3887" TEXT="testnode 7 4 3887" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3888" TEXT="testnode 7 5 3888" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3889" TEXT="testnode 7 6 3889" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3890" TEXT="testnode 7 7 3890" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3891" TEXT="testnode 5 6 3891" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3892" TEXT="testnode 6 1 3892" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3893" TEXT="testnode 7 1 3893" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3894" TEXT="testnode 7 2 3894" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3895" TEXT="testnode 7 3 3895" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3896" TEXT="testnode 7 4 3896" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3897" TEXT="testnode 7 5 3897" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3898" TEXT="testnode 7 6 3898" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3899" TEXT="testnode 7 7 3899" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3900" TEXT="testnode 6 2 3900" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3901" TEXT="testnode 7 1 3901" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3902" TEXT="testnode 7 2 3902" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3903" TEXT="testnode 7 3 3903" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3904" TEXT="testnode 7 4 3904" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3905" TEXT="testnode 7 5 3905" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3906" TEXT="testnode 7 6 3906" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3907" TEXT="testnode 7 7 3907" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3908" TEXT="testnode 6 3 3908" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3909" TEXT="testnode 7 1 3909" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3910" TEXT="testnode 7 2 3910" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3911" TEXT="testnode 7 3 3911" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3912" TEXT="testnode 7 4 3912" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3913" TEXT="testnode 7 5 3913" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3914" TEXT="testnode 7 6 3914" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3915" TEXT="testnode 7 7 3915" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3916" TEXT="testnode 6 4 3916" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3917" TEXT="testnode 7 1 3917" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3918" TEXT="testnode 7 2 3918" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3919" TEXT="testnode 7 3 3919" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3920" TEXT="testnode 7 4 3920" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3921" TEXT="testnode 7 5 3921" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3922" TEXT="testnode 7 6 3922" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3923" TEXT="testnode 7 7 3923" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3924" TEXT="testnode 6 5 3924" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3925" TEXT="testnode 7 1 3925" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3926" TEXT="testnode 7 2 3926" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3927" TEXT="testnode 7 3 3927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3928" TEXT="testnode 7 4 3928" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3929" TEXT="testnode 7 5 3929" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3930" TEXT="testnode 7 6 3930" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3931" TEXT="testnode 7 7 3931" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3932" TEXT="testnode 6 6 3932" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3933" TEXT="testnode 7 1 3933" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3934" TEXT="testnode 7 2 3934" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3935" TEXT="testnode 7 3 3935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3936" TEXT="testnode 7 4 3936" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3937" TEXT="testnode 7 5 3937" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3938" TEXT="testnode 7 6 3938" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3939" TEXT="testnode 7 7 3939" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3940" TEXT="testnode 6 7 3940" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3941" TEXT="testnode 7 1 3941" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3942" TEXT="testnode 7 2 3942" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3943" TEXT="testnode 7 3 3943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3944" TEXT="testnode 7 4 3944" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3945" TEXT="testnode 7 5 3945" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3946" TEXT="testnode 7 6 3946" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3947" TEXT="testnode 7 7 3947" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_3948" TEXT="testnode 5 7 3948" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_3949" TEXT="testnode 6 1 3949" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3950" TEXT="testnode 7 1 3950" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3951" TEXT="testnode 7 2 3951" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3952" TEXT="testnode 7 3 3952" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3953" TEXT="testnode 7 4 3953" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3954" TEXT="testnode 7 5 3954" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3955" TEXT="testnode 7 6 3955" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3956" TEXT="testnode 7 7 3956" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3957" TEXT="testnode 6 2 3957" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3958" TEXT="testnode 7 1 3958" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3959" TEXT="testnode 7 2 3959" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3960" TEXT="testnode 7 3 3960" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3961" TEXT="testnode 7 4 3961" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3962" TEXT="testnode 7 5 3962" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3963" TEXT="testnode 7 6 3963" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3964" TEXT="testnode 7 7 3964" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3965" TEXT="testnode 6 3 3965" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3966" TEXT="testnode 7 1 3966" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3967" TEXT="testnode 7 2 3967" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3968" TEXT="testnode 7 3 3968" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3969" TEXT="testnode 7 4 3969" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3970" TEXT="testnode 7 5 3970" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3971" TEXT="testnode 7 6 3971" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3972" TEXT="testnode 7 7 3972" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3973" TEXT="testnode 6 4 3973" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3974" TEXT="testnode 7 1 3974" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3975" TEXT="testnode 7 2 3975" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3976" TEXT="testnode 7 3 3976" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3977" TEXT="testnode 7 4 3977" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3978" TEXT="testnode 7 5 3978" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3979" TEXT="testnode 7 6 3979" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3980" TEXT="testnode 7 7 3980" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3981" TEXT="testnode 6 5 3981" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3982" TEXT="testnode 7 1 3982" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3983" TEXT="testnode 7 2 3983" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3984" TEXT="testnode 7 3 3984" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3985" TEXT="testnode 7 4 3985" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3986" TEXT="testnode 7 5 3986" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3987" TEXT="testnode 7 6 3987" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3988" TEXT="testnode 7 7 3988" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3989" TEXT="testnode 6 6 3989" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3990" TEXT="testnode 7 1 3990" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3991" TEXT="testnode 7 2 3991" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3992" TEXT="testnode 7 3 3992" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3993" TEXT="testnode 7 4 3993" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3994" TEXT="testnode 7 5 3994" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3995" TEXT="testnode 7 6 3995" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3996" TEXT="testnode 7 7 3996" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_3997" TEXT="testnode 6 7 3997" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_3998" TEXT="testnode 7 1 3998" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_3999" TEXT="testnode 7 2 3999" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4000" TEXT="testnode 7 3 4000" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4001" TEXT="testnode 7 4 4001" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4002" TEXT="testnode 7 5 4002" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4003" TEXT="testnode 7 6 4003" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4004" TEXT="testnode 7 7 4004" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4005" TEXT="testnode 4 4 4005" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_4006" TEXT="testnode 5 1 4006" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4007" TEXT="testnode 6 1 4007" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4008" TEXT="testnode 7 1 4008" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4009" TEXT="testnode 7 2 4009" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4010" TEXT="testnode 7 3 4010" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4011" TEXT="testnode 7 4 4011" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4012" TEXT="testnode 7 5 4012" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4013" TEXT="testnode 7 6 4013" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4014" TEXT="testnode 7 7 4014" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4015" TEXT="testnode 6 2 4015" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4016" TEXT="testnode 7 1 4016" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4017" TEXT="testnode 7 2 4017" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4018" TEXT="testnode 7 3 4018" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4019" TEXT="testnode 7 4 4019" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4020" TEXT="testnode 7 5 4020" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4021" TEXT="testnode 7 6 4021" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4022" TEXT="testnode 7 7 4022" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4023" TEXT="testnode 6 3 4023" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4024" TEXT="testnode 7 1 4024" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4025" TEXT="testnode 7 2 4025" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4026" TEXT="testnode 7 3 4026" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4027" TEXT="testnode 7 4 4027" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4028" TEXT="testnode 7 5 4028" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4029" TEXT="testnode 7 6 4029" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4030" TEXT="testnode 7 7 4030" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4031" TEXT="testnode 6 4 4031" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4032" TEXT="testnode 7 1 4032" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4033" TEXT="testnode 7 2 4033" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4034" TEXT="testnode 7 3 4034" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4035" TEXT="testnode 7 4 4035" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4036" TEXT="testnode 7 5 4036" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4037" TEXT="testnode 7 6 4037" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4038" TEXT="testnode 7 7 4038" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4039" TEXT="testnode 6 5 4039" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4040" TEXT="testnode 7 1 4040" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4041" TEXT="testnode 7 2 4041" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4042" TEXT="testnode 7 3 4042" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4043" TEXT="testnode 7 4 4043" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4044" TEXT="testnode 7 5 4044" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4045" TEXT="testnode 7 6 4045" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4046" TEXT="testnode 7 7 4046" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4047" TEXT="testnode 6 6 4047" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4048" TEXT="testnode 7 1 4048" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4049" TEXT="testnode 7 2 4049" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4050" TEXT="testnode 7 3 4050" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4051" TEXT="testnode 7 4 4051" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4052" TEXT="testnode 7 5 4052" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4053" TEXT="testnode 7 6 4053" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4054" TEXT="testnode 7 7 4054" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4055" TEXT="testnode 6 7 4055" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4056" TEXT="testnode 7 1 4056" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4057" TEXT="testnode 7 2 4057" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4058" TEXT="testnode 7 3 4058" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4059" TEXT="testnode 7 4 4059" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4060" TEXT="testnode 7 5 4060" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4061" TEXT="testnode 7 6 4061" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4062" TEXT="testnode 7 7 4062" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4063" TEXT="testnode 5 2 4063" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4064" TEXT="testnode 6 1 4064" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4065" TEXT="testnode 7 1 4065" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4066" TEXT="testnode 7 2 4066" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4067" TEXT="testnode 7 3 4067" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4068" TEXT="testnode 7 4 4068" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4069" TEXT="testnode 7 5 4069" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4070" TEXT="testnode 7 6 4070" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4071" TEXT="testnode 7 7 4071" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4072" TEXT="testnode 6 2 4072" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4073" TEXT="testnode 7 1 4073" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4074" TEXT="testnode 7 2 4074" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4075" TEXT="testnode 7 3 4075" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4076" TEXT="testnode 7 4 4076" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4077" TEXT="testnode 7 5 4077" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4078" TEXT="testnode 7 6 4078" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4079" TEXT="testnode 7 7 4079" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4080" TEXT="testnode 6 3 4080" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4081" TEXT="testnode 7 1 4081" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4082" TEXT="testnode 7 2 4082" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4083" TEXT="testnode 7 3 4083" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4084" TEXT="testnode 7 4 4084" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4085" TEXT="testnode 7 5 4085" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4086" TEXT="testnode 7 6 4086" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4087" TEXT="testnode 7 7 4087" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4088" TEXT="testnode 6 4 4088" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4089" TEXT="testnode 7 1 4089" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4090" TEXT="testnode 7 2 4090" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4091" TEXT="testnode 7 3 4091" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4092" TEXT="testnode 7 4 4092" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4093" TEXT="testnode 7 5 4093" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4094" TEXT="testnode 7 6 4094" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4095" TEXT="testnode 7 7 4095" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4096" TEXT="testnode 6 5 4096" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4097" TEXT="testnode 7 1 4097" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4098" TEXT="testnode 7 2 4098" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4099" TEXT="testnode 7 3 4099" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4100" TEXT="testnode 7 4 4100" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4101" TEXT="testnode 7 5 4101" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4102" TEXT="testnode 7 6 4102" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4103" TEXT="testnode 7 7 4103" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4104" TEXT="testnode 6 6 4104" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4105" TEXT="testnode 7 1 4105" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4106" TEXT="testnode 7 2 4106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4107" TEXT="testnode 7 3 4107" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4108" TEXT="testnode 7 4 4108" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4109" TEXT="testnode 7 5 4109" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4110" TEXT="testnode 7 6 4110" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4111" TEXT="testnode 7 7 4111" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4112" TEXT="testnode 6 7 4112" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4113" TEXT="testnode 7 1 4113" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4114" TEXT="testnode 7 2 4114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4115" TEXT="testnode 7 3 4115" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4116" TEXT="testnode 7 4 4116" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4117" TEXT="testnode 7 5 4117" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4118" TEXT="testnode 7 6 4118" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4119" TEXT="testnode 7 7 4119" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4120" TEXT="testnode 5 3 4120" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4121" TEXT="testnode 6 1 4121" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4122" TEXT="testnode 7 1 4122" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4123" TEXT="testnode 7 2 4123" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4124" TEXT="testnode 7 3 4124" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4125" TEXT="testnode 7 4 4125" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4126" TEXT="testnode 7 5 4126" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4127" TEXT="testnode 7 6 4127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4128" TEXT="testnode 7 7 4128" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4129" TEXT="testnode 6 2 4129" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4130" TEXT="testnode 7 1 4130" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4131" TEXT="testnode 7 2 4131" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4132" TEXT="testnode 7 3 4132" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4133" TEXT="testnode 7 4 4133" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4134" TEXT="testnode 7 5 4134" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4135" TEXT="testnode 7 6 4135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4136" TEXT="testnode 7 7 4136" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4137" TEXT="testnode 6 3 4137" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4138" TEXT="testnode 7 1 4138" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4139" TEXT="testnode 7 2 4139" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4140" TEXT="testnode 7 3 4140" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4141" TEXT="testnode 7 4 4141" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4142" TEXT="testnode 7 5 4142" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4143" TEXT="testnode 7 6 4143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4144" TEXT="testnode 7 7 4144" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4145" TEXT="testnode 6 4 4145" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4146" TEXT="testnode 7 1 4146" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4147" TEXT="testnode 7 2 4147" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4148" TEXT="testnode 7 3 4148" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4149" TEXT="testnode 7 4 4149" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4150" TEXT="testnode 7 5 4150" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4151" TEXT="testnode 7 6 4151" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4152" TEXT="testnode 7 7 4152" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4153" TEXT="testnode 6 5 4153" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4154" TEXT="testnode 7 1 4154" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4155" TEXT="testnode 7 2 4155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4156" TEXT="testnode 7 3 4156" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4157" TEXT="testnode 7 4 4157" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4158" TEXT="testnode 7 5 4158" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4159" TEXT="testnode 7 6 4159" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4160" TEXT="testnode 7 7 4160" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4161" TEXT="testnode 6 6 4161" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4162" TEXT="testnode 7 1 4162" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4163" TEXT="testnode 7 2 4163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4164" TEXT="testnode 7 3 4164" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4165" TEXT="testnode 7 4 4165" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4166" TEXT="testnode 7 5 4166" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4167" TEXT="testnode 7 6 4167" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4168" TEXT="testnode 7 7 4168" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4169" TEXT="testnode 6 7 4169" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4170" TEXT="testnode 7 1 4170" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4171" TEXT="testnode 7 2 4171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4172" TEXT="testnode 7 3 4172" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4173" TEXT="testnode 7 4 4173" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4174" TEXT="testnode 7 5 4174" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4175" TEXT="testnode 7 6 4175" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4176" TEXT="testnode 7 7 4176" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4177" TEXT="testnode 5 4 4177" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4178" TEXT="testnode 6 1 4178" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4179" TEXT="testnode 7 1 4179" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4180" TEXT="testnode 7 2 4180" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4181" TEXT="testnode 7 3 4181" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4182" TEXT="testnode 7 4 4182" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4183" TEXT="testnode 7 5 4183" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4184" TEXT="testnode 7 6 4184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4185" TEXT="testnode 7 7 4185" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4186" TEXT="testnode 6 2 4186" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4187" TEXT="testnode 7 1 4187" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4188" TEXT="testnode 7 2 4188" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4189" TEXT="testnode 7 3 4189" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4190" TEXT="testnode 7 4 4190" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4191" TEXT="testnode 7 5 4191" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4192" TEXT="testnode 7 6 4192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4193" TEXT="testnode 7 7 4193" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4194" TEXT="testnode 6 3 4194" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4195" TEXT="testnode 7 1 4195" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4196" TEXT="testnode 7 2 4196" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4197" TEXT="testnode 7 3 4197" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4198" TEXT="testnode 7 4 4198" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4199" TEXT="testnode 7 5 4199" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4200" TEXT="testnode 7 6 4200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4201" TEXT="testnode 7 7 4201" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4202" TEXT="testnode 6 4 4202" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4203" TEXT="testnode 7 1 4203" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4204" TEXT="testnode 7 2 4204" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4205" TEXT="testnode 7 3 4205" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4206" TEXT="testnode 7 4 4206" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4207" TEXT="testnode 7 5 4207" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4208" TEXT="testnode 7 6 4208" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4209" TEXT="testnode 7 7 4209" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4210" TEXT="testnode 6 5 4210" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4211" TEXT="testnode 7 1 4211" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4212" TEXT="testnode 7 2 4212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4213" TEXT="testnode 7 3 4213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4214" TEXT="testnode 7 4 4214" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4215" TEXT="testnode 7 5 4215" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4216" TEXT="testnode 7 6 4216" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4217" TEXT="testnode 7 7 4217" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4218" TEXT="testnode 6 6 4218" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4219" TEXT="testnode 7 1 4219" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4220" TEXT="testnode 7 2 4220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4221" TEXT="testnode 7 3 4221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4222" TEXT="testnode 7 4 4222" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4223" TEXT="testnode 7 5 4223" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4224" TEXT="testnode 7 6 4224" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4225" TEXT="testnode 7 7 4225" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4226" TEXT="testnode 6 7 4226" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4227" TEXT="testnode 7 1 4227" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4228" TEXT="testnode 7 2 4228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4229" TEXT="testnode 7 3 4229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4230" TEXT="testnode 7 4 4230" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4231" TEXT="testnode 7 5 4231" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4232" TEXT="testnode 7 6 4232" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4233" TEXT="testnode 7 7 4233" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4234" TEXT="testnode 5 5 4234" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4235" TEXT="testnode 6 1 4235" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4236" TEXT="testnode 7 1 4236" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4237" TEXT="testnode 7 2 4237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4238" TEXT="testnode 7 3 4238" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4239" TEXT="testnode 7 4 4239" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4240" TEXT="testnode 7 5 4240" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4241" TEXT="testnode 7 6 4241" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4242" TEXT="testnode 7 7 4242" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4243" TEXT="testnode 6 2 4243" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4244" TEXT="testnode 7 1 4244" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4245" TEXT="testnode 7 2 4245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4246" TEXT="testnode 7 3 4246" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4247" TEXT="testnode 7 4 4247" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4248" TEXT="testnode 7 5 4248" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4249" TEXT="testnode 7 6 4249" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4250" TEXT="testnode 7 7 4250" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4251" TEXT="testnode 6 3 4251" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4252" TEXT="testnode 7 1 4252" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4253" TEXT="testnode 7 2 4253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4254" TEXT="testnode 7 3 4254" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4255" TEXT="testnode 7 4 4255" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4256" TEXT="testnode 7 5 4256" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4257" TEXT="testnode 7 6 4257" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4258" TEXT="testnode 7 7 4258" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4259" TEXT="testnode 6 4 4259" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4260" TEXT="testnode 7 1 4260" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4261" TEXT="testnode 7 2 4261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4262" TEXT="testnode 7 3 4262" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4263" TEXT="testnode 7 4 4263" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4264" TEXT="testnode 7 5 4264" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4265" TEXT="testnode 7 6 4265" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4266" TEXT="testnode 7 7 4266" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4267" TEXT="testnode 6 5 4267" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4268" TEXT="testnode 7 1 4268" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4269" TEXT="testnode 7 2 4269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4270" TEXT="testnode 7 3 4270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4271" TEXT="testnode 7 4 4271" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4272" TEXT="testnode 7 5 4272" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4273" TEXT="testnode 7 6 4273" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4274" TEXT="testnode 7 7 4274" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4275" TEXT="testnode 6 6 4275" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4276" TEXT="testnode 7 1 4276" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4277" TEXT="testnode 7 2 4277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4278" TEXT="testnode 7 3 4278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4279" TEXT="testnode 7 4 4279" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4280" TEXT="testnode 7 5 4280" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4281" TEXT="testnode 7 6 4281" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4282" TEXT="testnode 7 7 4282" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4283" TEXT="testnode 6 7 4283" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4284" TEXT="testnode 7 1 4284" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4285" TEXT="testnode 7 2 4285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4286" TEXT="testnode 7 3 4286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4287" TEXT="testnode 7 4 4287" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4288" TEXT="testnode 7 5 4288" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4289" TEXT="testnode 7 6 4289" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4290" TEXT="testnode 7 7 4290" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4291" TEXT="testnode 5 6 4291" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4292" TEXT="testnode 6 1 4292" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4293" TEXT="testnode 7 1 4293" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4294" TEXT="testnode 7 2 4294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4295" TEXT="testnode 7 3 4295" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4296" TEXT="testnode 7 4 4296" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4297" TEXT="testnode 7 5 4297" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4298" TEXT="testnode 7 6 4298" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4299" TEXT="testnode 7 7 4299" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4300" TEXT="testnode 6 2 4300" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4301" TEXT="testnode 7 1 4301" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4302" TEXT="testnode 7 2 4302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4303" TEXT="testnode 7 3 4303" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4304" TEXT="testnode 7 4 4304" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4305" TEXT="testnode 7 5 4305" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4306" TEXT="testnode 7 6 4306" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4307" TEXT="testnode 7 7 4307" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4308" TEXT="testnode 6 3 4308" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4309" TEXT="testnode 7 1 4309" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4310" TEXT="testnode 7 2 4310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4311" TEXT="testnode 7 3 4311" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4312" TEXT="testnode 7 4 4312" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4313" TEXT="testnode 7 5 4313" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4314" TEXT="testnode 7 6 4314" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4315" TEXT="testnode 7 7 4315" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4316" TEXT="testnode 6 4 4316" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4317" TEXT="testnode 7 1 4317" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4318" TEXT="testnode 7 2 4318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4319" TEXT="testnode 7 3 4319" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4320" TEXT="testnode 7 4 4320" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4321" TEXT="testnode 7 5 4321" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4322" TEXT="testnode 7 6 4322" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4323" TEXT="testnode 7 7 4323" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4324" TEXT="testnode 6 5 4324" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4325" TEXT="testnode 7 1 4325" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4326" TEXT="testnode 7 2 4326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4327" TEXT="testnode 7 3 4327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4328" TEXT="testnode 7 4 4328" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4329" TEXT="testnode 7 5 4329" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4330" TEXT="testnode 7 6 4330" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4331" TEXT="testnode 7 7 4331" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4332" TEXT="testnode 6 6 4332" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4333" TEXT="testnode 7 1 4333" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4334" TEXT="testnode 7 2 4334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4335" TEXT="testnode 7 3 4335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4336" TEXT="testnode 7 4 4336" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4337" TEXT="testnode 7 5 4337" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4338" TEXT="testnode 7 6 4338" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4339" TEXT="testnode 7 7 4339" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4340" TEXT="testnode 6 7 4340" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4341" TEXT="testnode 7 1 4341" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4342" TEXT="testnode 7 2 4342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4343" TEXT="testnode 7 3 4343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4344" TEXT="testnode 7 4 4344" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4345" TEXT="testnode 7 5 4345" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4346" TEXT="testnode 7 6 4346" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4347" TEXT="testnode 7 7 4347" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4348" TEXT="testnode 5 7 4348" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4349" TEXT="testnode 6 1 4349" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4350" TEXT="testnode 7 1 4350" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4351" TEXT="testnode 7 2 4351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4352" TEXT="testnode 7 3 4352" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4353" TEXT="testnode 7 4 4353" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4354" TEXT="testnode 7 5 4354" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4355" TEXT="testnode 7 6 4355" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4356" TEXT="testnode 7 7 4356" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4357" TEXT="testnode 6 2 4357" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4358" TEXT="testnode 7 1 4358" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4359" TEXT="testnode 7 2 4359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4360" TEXT="testnode 7 3 4360" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4361" TEXT="testnode 7 4 4361" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4362" TEXT="testnode 7 5 4362" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4363" TEXT="testnode 7 6 4363" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4364" TEXT="testnode 7 7 4364" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4365" TEXT="testnode 6 3 4365" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4366" TEXT="testnode 7 1 4366" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4367" TEXT="testnode 7 2 4367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4368" TEXT="testnode 7 3 4368" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4369" TEXT="testnode 7 4 4369" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4370" TEXT="testnode 7 5 4370" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4371" TEXT="testnode 7 6 4371" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4372" TEXT="testnode 7 7 4372" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4373" TEXT="testnode 6 4 4373" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4374" TEXT="testnode 7 1 4374" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4375" TEXT="testnode 7 2 4375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4376" TEXT="testnode 7 3 4376" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4377" TEXT="testnode 7 4 4377" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4378" TEXT="testnode 7 5 4378" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4379" TEXT="testnode 7 6 4379" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4380" TEXT="testnode 7 7 4380" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4381" TEXT="testnode 6 5 4381" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4382" TEXT="testnode 7 1 4382" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4383" TEXT="testnode 7 2 4383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4384" TEXT="testnode 7 3 4384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4385" TEXT="testnode 7 4 4385" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4386" TEXT="testnode 7 5 4386" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4387" TEXT="testnode 7 6 4387" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4388" TEXT="testnode 7 7 4388" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4389" TEXT="testnode 6 6 4389" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4390" TEXT="testnode 7 1 4390" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4391" TEXT="testnode 7 2 4391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4392" TEXT="testnode 7 3 4392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4393" TEXT="testnode 7 4 4393" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4394" TEXT="testnode 7 5 4394" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4395" TEXT="testnode 7 6 4395" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4396" TEXT="testnode 7 7 4396" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4397" TEXT="testnode 6 7 4397" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4398" TEXT="testnode 7 1 4398" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4399" TEXT="testnode 7 2 4399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4400" TEXT="testnode 7 3 4400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4401" TEXT="testnode 7 4 4401" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4402" TEXT="testnode 7 5 4402" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4403" TEXT="testnode 7 6 4403" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4404" TEXT="testnode 7 7 4404" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4405" TEXT="testnode 4 5 4405" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_4406" TEXT="testnode 5 1 4406" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4407" TEXT="testnode 6 1 4407" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4408" TEXT="testnode 7 1 4408" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4409" TEXT="testnode 7 2 4409" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4410" TEXT="testnode 7 3 4410" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4411" TEXT="testnode 7 4 4411" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4412" TEXT="testnode 7 5 4412" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4413" TEXT="testnode 7 6 4413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4414" TEXT="testnode 7 7 4414" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4415" TEXT="testnode 6 2 4415" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4416" TEXT="testnode 7 1 4416" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4417" TEXT="testnode 7 2 4417" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4418" TEXT="testnode 7 3 4418" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4419" TEXT="testnode 7 4 4419" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4420" TEXT="testnode 7 5 4420" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4421" TEXT="testnode 7 6 4421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4422" TEXT="testnode 7 7 4422" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4423" TEXT="testnode 6 3 4423" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4424" TEXT="testnode 7 1 4424" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4425" TEXT="testnode 7 2 4425" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4426" TEXT="testnode 7 3 4426" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4427" TEXT="testnode 7 4 4427" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4428" TEXT="testnode 7 5 4428" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4429" TEXT="testnode 7 6 4429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4430" TEXT="testnode 7 7 4430" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4431" TEXT="testnode 6 4 4431" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4432" TEXT="testnode 7 1 4432" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4433" TEXT="testnode 7 2 4433" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4434" TEXT="testnode 7 3 4434" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4435" TEXT="testnode 7 4 4435" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4436" TEXT="testnode 7 5 4436" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4437" TEXT="testnode 7 6 4437" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4438" TEXT="testnode 7 7 4438" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4439" TEXT="testnode 6 5 4439" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4440" TEXT="testnode 7 1 4440" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4441" TEXT="testnode 7 2 4441" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4442" TEXT="testnode 7 3 4442" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4443" TEXT="testnode 7 4 4443" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4444" TEXT="testnode 7 5 4444" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4445" TEXT="testnode 7 6 4445" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4446" TEXT="testnode 7 7 4446" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4447" TEXT="testnode 6 6 4447" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4448" TEXT="testnode 7 1 4448" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4449" TEXT="testnode 7 2 4449" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4450" TEXT="testnode 7 3 4450" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4451" TEXT="testnode 7 4 4451" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4452" TEXT="testnode 7 5 4452" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4453" TEXT="testnode 7 6 4453" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4454" TEXT="testnode 7 7 4454" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4455" TEXT="testnode 6 7 4455" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4456" TEXT="testnode 7 1 4456" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4457" TEXT="testnode 7 2 4457" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4458" TEXT="testnode 7 3 4458" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4459" TEXT="testnode 7 4 4459" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4460" TEXT="testnode 7 5 4460" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4461" TEXT="testnode 7 6 4461" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4462" TEXT="testnode 7 7 4462" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4463" TEXT="testnode 5 2 4463" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4464" TEXT="testnode 6 1 4464" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4465" TEXT="testnode 7 1 4465" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4466" TEXT="testnode 7 2 4466" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4467" TEXT="testnode 7 3 4467" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4468" TEXT="testnode 7 4 4468" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4469" TEXT="testnode 7 5 4469" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4470" TEXT="testnode 7 6 4470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4471" TEXT="testnode 7 7 4471" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4472" TEXT="testnode 6 2 4472" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4473" TEXT="testnode 7 1 4473" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4474" TEXT="testnode 7 2 4474" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4475" TEXT="testnode 7 3 4475" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4476" TEXT="testnode 7 4 4476" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4477" TEXT="testnode 7 5 4477" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4478" TEXT="testnode 7 6 4478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4479" TEXT="testnode 7 7 4479" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4480" TEXT="testnode 6 3 4480" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4481" TEXT="testnode 7 1 4481" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4482" TEXT="testnode 7 2 4482" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4483" TEXT="testnode 7 3 4483" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4484" TEXT="testnode 7 4 4484" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4485" TEXT="testnode 7 5 4485" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4486" TEXT="testnode 7 6 4486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4487" TEXT="testnode 7 7 4487" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4488" TEXT="testnode 6 4 4488" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4489" TEXT="testnode 7 1 4489" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4490" TEXT="testnode 7 2 4490" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4491" TEXT="testnode 7 3 4491" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4492" TEXT="testnode 7 4 4492" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4493" TEXT="testnode 7 5 4493" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4494" TEXT="testnode 7 6 4494" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4495" TEXT="testnode 7 7 4495" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4496" TEXT="testnode 6 5 4496" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4497" TEXT="testnode 7 1 4497" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4498" TEXT="testnode 7 2 4498" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4499" TEXT="testnode 7 3 4499" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4500" TEXT="testnode 7 4 4500" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4501" TEXT="testnode 7 5 4501" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4502" TEXT="testnode 7 6 4502" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4503" TEXT="testnode 7 7 4503" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4504" TEXT="testnode 6 6 4504" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4505" TEXT="testnode 7 1 4505" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4506" TEXT="testnode 7 2 4506" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4507" TEXT="testnode 7 3 4507" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4508" TEXT="testnode 7 4 4508" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4509" TEXT="testnode 7 5 4509" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4510" TEXT="testnode 7 6 4510" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4511" TEXT="testnode 7 7 4511" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4512" TEXT="testnode 6 7 4512" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4513" TEXT="testnode 7 1 4513" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4514" TEXT="testnode 7 2 4514" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4515" TEXT="testnode 7 3 4515" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4516" TEXT="testnode 7 4 4516" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4517" TEXT="testnode 7 5 4517" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4518" TEXT="testnode 7 6 4518" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4519" TEXT="testnode 7 7 4519" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4520" TEXT="testnode 5 3 4520" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4521" TEXT="testnode 6 1 4521" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4522" TEXT="testnode 7 1 4522" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4523" TEXT="testnode 7 2 4523" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4524" TEXT="testnode 7 3 4524" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4525" TEXT="testnode 7 4 4525" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4526" TEXT="testnode 7 5 4526" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4527" TEXT="testnode 7 6 4527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4528" TEXT="testnode 7 7 4528" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4529" TEXT="testnode 6 2 4529" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4530" TEXT="testnode 7 1 4530" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4531" TEXT="testnode 7 2 4531" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4532" TEXT="testnode 7 3 4532" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4533" TEXT="testnode 7 4 4533" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4534" TEXT="testnode 7 5 4534" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4535" TEXT="testnode 7 6 4535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4536" TEXT="testnode 7 7 4536" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4537" TEXT="testnode 6 3 4537" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4538" TEXT="testnode 7 1 4538" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4539" TEXT="testnode 7 2 4539" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4540" TEXT="testnode 7 3 4540" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4541" TEXT="testnode 7 4 4541" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4542" TEXT="testnode 7 5 4542" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4543" TEXT="testnode 7 6 4543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4544" TEXT="testnode 7 7 4544" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4545" TEXT="testnode 6 4 4545" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4546" TEXT="testnode 7 1 4546" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4547" TEXT="testnode 7 2 4547" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4548" TEXT="testnode 7 3 4548" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4549" TEXT="testnode 7 4 4549" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4550" TEXT="testnode 7 5 4550" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4551" TEXT="testnode 7 6 4551" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4552" TEXT="testnode 7 7 4552" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4553" TEXT="testnode 6 5 4553" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4554" TEXT="testnode 7 1 4554" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4555" TEXT="testnode 7 2 4555" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4556" TEXT="testnode 7 3 4556" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4557" TEXT="testnode 7 4 4557" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4558" TEXT="testnode 7 5 4558" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4559" TEXT="testnode 7 6 4559" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4560" TEXT="testnode 7 7 4560" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4561" TEXT="testnode 6 6 4561" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4562" TEXT="testnode 7 1 4562" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4563" TEXT="testnode 7 2 4563" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4564" TEXT="testnode 7 3 4564" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4565" TEXT="testnode 7 4 4565" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4566" TEXT="testnode 7 5 4566" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4567" TEXT="testnode 7 6 4567" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4568" TEXT="testnode 7 7 4568" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4569" TEXT="testnode 6 7 4569" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4570" TEXT="testnode 7 1 4570" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4571" TEXT="testnode 7 2 4571" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4572" TEXT="testnode 7 3 4572" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4573" TEXT="testnode 7 4 4573" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4574" TEXT="testnode 7 5 4574" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4575" TEXT="testnode 7 6 4575" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4576" TEXT="testnode 7 7 4576" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4577" TEXT="testnode 5 4 4577" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4578" TEXT="testnode 6 1 4578" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4579" TEXT="testnode 7 1 4579" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4580" TEXT="testnode 7 2 4580" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4581" TEXT="testnode 7 3 4581" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4582" TEXT="testnode 7 4 4582" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4583" TEXT="testnode 7 5 4583" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4584" TEXT="testnode 7 6 4584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4585" TEXT="testnode 7 7 4585" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4586" TEXT="testnode 6 2 4586" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4587" TEXT="testnode 7 1 4587" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4588" TEXT="testnode 7 2 4588" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4589" TEXT="testnode 7 3 4589" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4590" TEXT="testnode 7 4 4590" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4591" TEXT="testnode 7 5 4591" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4592" TEXT="testnode 7 6 4592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4593" TEXT="testnode 7 7 4593" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4594" TEXT="testnode 6 3 4594" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4595" TEXT="testnode 7 1 4595" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4596" TEXT="testnode 7 2 4596" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4597" TEXT="testnode 7 3 4597" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4598" TEXT="testnode 7 4 4598" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4599" TEXT="testnode 7 5 4599" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4600" TEXT="testnode 7 6 4600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4601" TEXT="testnode 7 7 4601" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4602" TEXT="testnode 6 4 4602" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4603" TEXT="testnode 7 1 4603" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4604" TEXT="testnode 7 2 4604" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4605" TEXT="testnode 7 3 4605" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4606" TEXT="testnode 7 4 4606" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4607" TEXT="testnode 7 5 4607" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4608" TEXT="testnode 7 6 4608" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4609" TEXT="testnode 7 7 4609" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4610" TEXT="testnode 6 5 4610" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4611" TEXT="testnode 7 1 4611" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4612" TEXT="testnode 7 2 4612" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4613" TEXT="testnode 7 3 4613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4614" TEXT="testnode 7 4 4614" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4615" TEXT="testnode 7 5 4615" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4616" TEXT="testnode 7 6 4616" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4617" TEXT="testnode 7 7 4617" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4618" TEXT="testnode 6 6 4618" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4619" TEXT="testnode 7 1 4619" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4620" TEXT="testnode 7 2 4620" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4621" TEXT="testnode 7 3 4621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4622" TEXT="testnode 7 4 4622" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4623" TEXT="testnode 7 5 4623" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4624" TEXT="testnode 7 6 4624" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4625" TEXT="testnode 7 7 4625" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4626" TEXT="testnode 6 7 4626" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4627" TEXT="testnode 7 1 4627" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4628" TEXT="testnode 7 2 4628" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4629" TEXT="testnode 7 3 4629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4630" TEXT="testnode 7 4 4630" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4631" TEXT="testnode 7 5 4631" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4632" TEXT="testnode 7 6 4632" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4633" TEXT="testnode 7 7 4633" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4634" TEXT="testnode 5 5 4634" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4635" TEXT="testnode 6 1 4635" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4636" TEXT="testnode 7 1 4636" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4637" TEXT="testnode 7 2 4637" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4638" TEXT="testnode 7 3 4638" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4639" TEXT="testnode 7 4 4639" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4640" TEXT="testnode 7 5 4640" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4641" TEXT="testnode 7 6 4641" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4642" TEXT="testnode 7 7 4642" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4643" TEXT="testnode 6 2 4643" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4644" TEXT="testnode 7 1 4644" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4645" TEXT="testnode 7 2 4645" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4646" TEXT="testnode 7 3 4646" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4647" TEXT="testnode 7 4 4647" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4648" TEXT="testnode 7 5 4648" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4649" TEXT="testnode 7 6 4649" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4650" TEXT="testnode 7 7 4650" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4651" TEXT="testnode 6 3 4651" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4652" TEXT="testnode 7 1 4652" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4653" TEXT="testnode 7 2 4653" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4654" TEXT="testnode 7 3 4654" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4655" TEXT="testnode 7 4 4655" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4656" TEXT="testnode 7 5 4656" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4657" TEXT="testnode 7 6 4657" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4658" TEXT="testnode 7 7 4658" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4659" TEXT="testnode 6 4 4659" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4660" TEXT="testnode 7 1 4660" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4661" TEXT="testnode 7 2 4661" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4662" TEXT="testnode 7 3 4662" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4663" TEXT="testnode 7 4 4663" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4664" TEXT="testnode 7 5 4664" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4665" TEXT="testnode 7 6 4665" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4666" TEXT="testnode 7 7 4666" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4667" TEXT="testnode 6 5 4667" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4668" TEXT="testnode 7 1 4668" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4669" TEXT="testnode 7 2 4669" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4670" TEXT="testnode 7 3 4670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4671" TEXT="testnode 7 4 4671" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4672" TEXT="testnode 7 5 4672" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4673" TEXT="testnode 7 6 4673" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4674" TEXT="testnode 7 7 4674" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4675" TEXT="testnode 6 6 4675" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4676" TEXT="testnode 7 1 4676" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4677" TEXT="testnode 7 2 4677" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4678" TEXT="testnode 7 3 4678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4679" TEXT="testnode 7 4 4679" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4680" TEXT="testnode 7 5 4680" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4681" TEXT="testnode 7 6 4681" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4682" TEXT="testnode 7 7 4682" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4683" TEXT="testnode 6 7 4683" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4684" TEXT="testnode 7 1 4684" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4685" TEXT="testnode 7 2 4685" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4686" TEXT="testnode 7 3 4686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4687" TEXT="testnode 7 4 4687" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4688" TEXT="testnode 7 5 4688" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4689" TEXT="testnode 7 6 4689" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4690" TEXT="testnode 7 7 4690" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4691" TEXT="testnode 5 6 4691" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4692" TEXT="testnode 6 1 4692" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4693" TEXT="testnode 7 1 4693" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4694" TEXT="testnode 7 2 4694" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4695" TEXT="testnode 7 3 4695" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4696" TEXT="testnode 7 4 4696" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4697" TEXT="testnode 7 5 4697" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4698" TEXT="testnode 7 6 4698" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4699" TEXT="testnode 7 7 4699" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4700" TEXT="testnode 6 2 4700" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4701" TEXT="testnode 7 1 4701" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4702" TEXT="testnode 7 2 4702" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4703" TEXT="testnode 7 3 4703" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4704" TEXT="testnode 7 4 4704" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4705" TEXT="testnode 7 5 4705" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4706" TEXT="testnode 7 6 4706" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4707" TEXT="testnode 7 7 4707" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4708" TEXT="testnode 6 3 4708" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4709" TEXT="testnode 7 1 4709" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4710" TEXT="testnode 7 2 4710" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4711" TEXT="testnode 7 3 4711" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4712" TEXT="testnode 7 4 4712" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4713" TEXT="testnode 7 5 4713" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4714" TEXT="testnode 7 6 4714" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4715" TEXT="testnode 7 7 4715" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4716" TEXT="testnode 6 4 4716" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4717" TEXT="testnode 7 1 4717" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4718" TEXT="testnode 7 2 4718" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4719" TEXT="testnode 7 3 4719" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4720" TEXT="testnode 7 4 4720" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4721" TEXT="testnode 7 5 4721" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4722" TEXT="testnode 7 6 4722" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4723" TEXT="testnode 7 7 4723" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4724" TEXT="testnode 6 5 4724" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4725" TEXT="testnode 7 1 4725" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4726" TEXT="testnode 7 2 4726" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4727" TEXT="testnode 7 3 4727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4728" TEXT="testnode 7 4 4728" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4729" TEXT="testnode 7 5 4729" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4730" TEXT="testnode 7 6 4730" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4731" TEXT="testnode 7 7 4731" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4732" TEXT="testnode 6 6 4732" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4733" TEXT="testnode 7 1 4733" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4734" TEXT="testnode 7 2 4734" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4735" TEXT="testnode 7 3 4735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4736" TEXT="testnode 7 4 4736" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4737" TEXT="testnode 7 5 4737" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4738" TEXT="testnode 7 6 4738" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4739" TEXT="testnode 7 7 4739" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4740" TEXT="testnode 6 7 4740" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4741" TEXT="testnode 7 1 4741" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4742" TEXT="testnode 7 2 4742" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4743" TEXT="testnode 7 3 4743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4744" TEXT="testnode 7 4 4744" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4745" TEXT="testnode 7 5 4745" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4746" TEXT="testnode 7 6 4746" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4747" TEXT="testnode 7 7 4747" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4748" TEXT="testnode 5 7 4748" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4749" TEXT="testnode 6 1 4749" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4750" TEXT="testnode 7 1 4750" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4751" TEXT="testnode 7 2 4751" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4752" TEXT="testnode 7 3 4752" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4753" TEXT="testnode 7 4 4753" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4754" TEXT="testnode 7 5 4754" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4755" TEXT="testnode 7 6 4755" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4756" TEXT="testnode 7 7 4756" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4757" TEXT="testnode 6 2 4757" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4758" TEXT="testnode 7 1 4758" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4759" TEXT="testnode 7 2 4759" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4760" TEXT="testnode 7 3 4760" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4761" TEXT="testnode 7 4 4761" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4762" TEXT="testnode 7 5 4762" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4763" TEXT="testnode 7 6 4763" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4764" TEXT="testnode 7 7 4764" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4765" TEXT="testnode 6 3 4765" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4766" TEXT="testnode 7 1 4766" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4767" TEXT="testnode 7 2 4767" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4768" TEXT="testnode 7 3 4768" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4769" TEXT="testnode 7 4 4769" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4770" TEXT="testnode 7 5 4770" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4771" TEXT="testnode 7 6 4771" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4772" TEXT="testnode 7 7 4772" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4773" TEXT="testnode 6 4 4773" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4774" TEXT="testnode 7 1 4774" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4775" TEXT="testnode 7 2 4775" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4776" TEXT="testnode 7 3 4776" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4777" TEXT="testnode 7 4 4777" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4778" TEXT="testnode 7 5 4778" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4779" TEXT="testnode 7 6 4779" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4780" TEXT="testnode 7 7 4780" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4781" TEXT="testnode 6 5 4781" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4782" TEXT="testnode 7 1 4782" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4783" TEXT="testnode 7 2 4783" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4784" TEXT="testnode 7 3 4784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4785" TEXT="testnode 7 4 4785" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4786" TEXT="testnode 7 5 4786" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4787" TEXT="testnode 7 6 4787" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4788" TEXT="testnode 7 7 4788" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4789" TEXT="testnode 6 6 4789" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4790" TEXT="testnode 7 1 4790" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4791" TEXT="testnode 7 2 4791" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4792" TEXT="testnode 7 3 4792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4793" TEXT="testnode 7 4 4793" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4794" TEXT="testnode 7 5 4794" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4795" TEXT="testnode 7 6 4795" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4796" TEXT="testnode 7 7 4796" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4797" TEXT="testnode 6 7 4797" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4798" TEXT="testnode 7 1 4798" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4799" TEXT="testnode 7 2 4799" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4800" TEXT="testnode 7 3 4800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4801" TEXT="testnode 7 4 4801" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4802" TEXT="testnode 7 5 4802" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4803" TEXT="testnode 7 6 4803" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4804" TEXT="testnode 7 7 4804" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4805" TEXT="testnode 4 6 4805" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_4806" TEXT="testnode 5 1 4806" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4807" TEXT="testnode 6 1 4807" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4808" TEXT="testnode 7 1 4808" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4809" TEXT="testnode 7 2 4809" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4810" TEXT="testnode 7 3 4810" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4811" TEXT="testnode 7 4 4811" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4812" TEXT="testnode 7 5 4812" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4813" TEXT="testnode 7 6 4813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4814" TEXT="testnode 7 7 4814" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4815" TEXT="testnode 6 2 4815" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4816" TEXT="testnode 7 1 4816" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4817" TEXT="testnode 7 2 4817" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4818" TEXT="testnode 7 3 4818" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4819" TEXT="testnode 7 4 4819" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4820" TEXT="testnode 7 5 4820" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4821" TEXT="testnode 7 6 4821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4822" TEXT="testnode 7 7 4822" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4823" TEXT="testnode 6 3 4823" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4824" TEXT="testnode 7 1 4824" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4825" TEXT="testnode 7 2 4825" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4826" TEXT="testnode 7 3 4826" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4827" TEXT="testnode 7 4 4827" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4828" TEXT="testnode 7 5 4828" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4829" TEXT="testnode 7 6 4829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4830" TEXT="testnode 7 7 4830" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4831" TEXT="testnode 6 4 4831" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4832" TEXT="testnode 7 1 4832" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4833" TEXT="testnode 7 2 4833" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4834" TEXT="testnode 7 3 4834" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4835" TEXT="testnode 7 4 4835" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4836" TEXT="testnode 7 5 4836" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4837" TEXT="testnode 7 6 4837" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4838" TEXT="testnode 7 7 4838" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4839" TEXT="testnode 6 5 4839" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4840" TEXT="testnode 7 1 4840" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4841" TEXT="testnode 7 2 4841" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4842" TEXT="testnode 7 3 4842" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4843" TEXT="testnode 7 4 4843" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4844" TEXT="testnode 7 5 4844" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4845" TEXT="testnode 7 6 4845" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4846" TEXT="testnode 7 7 4846" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4847" TEXT="testnode 6 6 4847" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4848" TEXT="testnode 7 1 4848" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4849" TEXT="testnode 7 2 4849" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4850" TEXT="testnode 7 3 4850" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4851" TEXT="testnode 7 4 4851" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4852" TEXT="testnode 7 5 4852" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4853" TEXT="testnode 7 6 4853" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4854" TEXT="testnode 7 7 4854" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4855" TEXT="testnode 6 7 4855" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4856" TEXT="testnode 7 1 4856" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4857" TEXT="testnode 7 2 4857" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4858" TEXT="testnode 7 3 4858" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4859" TEXT="testnode 7 4 4859" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4860" TEXT="testnode 7 5 4860" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4861" TEXT="testnode 7 6 4861" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4862" TEXT="testnode 7 7 4862" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4863" TEXT="testnode 5 2 4863" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4864" TEXT="testnode 6 1 4864" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4865" TEXT="testnode 7 1 4865" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4866" TEXT="testnode 7 2 4866" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4867" TEXT="testnode 7 3 4867" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4868" TEXT="testnode 7 4 4868" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4869" TEXT="testnode 7 5 4869" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4870" TEXT="testnode 7 6 4870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4871" TEXT="testnode 7 7 4871" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4872" TEXT="testnode 6 2 4872" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4873" TEXT="testnode 7 1 4873" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4874" TEXT="testnode 7 2 4874" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4875" TEXT="testnode 7 3 4875" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4876" TEXT="testnode 7 4 4876" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4877" TEXT="testnode 7 5 4877" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4878" TEXT="testnode 7 6 4878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4879" TEXT="testnode 7 7 4879" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4880" TEXT="testnode 6 3 4880" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4881" TEXT="testnode 7 1 4881" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4882" TEXT="testnode 7 2 4882" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4883" TEXT="testnode 7 3 4883" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4884" TEXT="testnode 7 4 4884" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4885" TEXT="testnode 7 5 4885" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4886" TEXT="testnode 7 6 4886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4887" TEXT="testnode 7 7 4887" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4888" TEXT="testnode 6 4 4888" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4889" TEXT="testnode 7 1 4889" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4890" TEXT="testnode 7 2 4890" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4891" TEXT="testnode 7 3 4891" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4892" TEXT="testnode 7 4 4892" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4893" TEXT="testnode 7 5 4893" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4894" TEXT="testnode 7 6 4894" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4895" TEXT="testnode 7 7 4895" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4896" TEXT="testnode 6 5 4896" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4897" TEXT="testnode 7 1 4897" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4898" TEXT="testnode 7 2 4898" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4899" TEXT="testnode 7 3 4899" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4900" TEXT="testnode 7 4 4900" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4901" TEXT="testnode 7 5 4901" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4902" TEXT="testnode 7 6 4902" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4903" TEXT="testnode 7 7 4903" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4904" TEXT="testnode 6 6 4904" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4905" TEXT="testnode 7 1 4905" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4906" TEXT="testnode 7 2 4906" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4907" TEXT="testnode 7 3 4907" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4908" TEXT="testnode 7 4 4908" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4909" TEXT="testnode 7 5 4909" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4910" TEXT="testnode 7 6 4910" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4911" TEXT="testnode 7 7 4911" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4912" TEXT="testnode 6 7 4912" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4913" TEXT="testnode 7 1 4913" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4914" TEXT="testnode 7 2 4914" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4915" TEXT="testnode 7 3 4915" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4916" TEXT="testnode 7 4 4916" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4917" TEXT="testnode 7 5 4917" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4918" TEXT="testnode 7 6 4918" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4919" TEXT="testnode 7 7 4919" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4920" TEXT="testnode 5 3 4920" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4921" TEXT="testnode 6 1 4921" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4922" TEXT="testnode 7 1 4922" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4923" TEXT="testnode 7 2 4923" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4924" TEXT="testnode 7 3 4924" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4925" TEXT="testnode 7 4 4925" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4926" TEXT="testnode 7 5 4926" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4927" TEXT="testnode 7 6 4927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4928" TEXT="testnode 7 7 4928" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4929" TEXT="testnode 6 2 4929" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4930" TEXT="testnode 7 1 4930" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4931" TEXT="testnode 7 2 4931" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4932" TEXT="testnode 7 3 4932" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4933" TEXT="testnode 7 4 4933" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4934" TEXT="testnode 7 5 4934" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4935" TEXT="testnode 7 6 4935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4936" TEXT="testnode 7 7 4936" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4937" TEXT="testnode 6 3 4937" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4938" TEXT="testnode 7 1 4938" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4939" TEXT="testnode 7 2 4939" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4940" TEXT="testnode 7 3 4940" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4941" TEXT="testnode 7 4 4941" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4942" TEXT="testnode 7 5 4942" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4943" TEXT="testnode 7 6 4943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4944" TEXT="testnode 7 7 4944" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4945" TEXT="testnode 6 4 4945" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4946" TEXT="testnode 7 1 4946" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4947" TEXT="testnode 7 2 4947" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4948" TEXT="testnode 7 3 4948" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4949" TEXT="testnode 7 4 4949" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4950" TEXT="testnode 7 5 4950" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4951" TEXT="testnode 7 6 4951" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4952" TEXT="testnode 7 7 4952" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4953" TEXT="testnode 6 5 4953" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4954" TEXT="testnode 7 1 4954" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4955" TEXT="testnode 7 2 4955" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4956" TEXT="testnode 7 3 4956" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4957" TEXT="testnode 7 4 4957" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4958" TEXT="testnode 7 5 4958" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4959" TEXT="testnode 7 6 4959" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4960" TEXT="testnode 7 7 4960" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4961" TEXT="testnode 6 6 4961" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4962" TEXT="testnode 7 1 4962" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4963" TEXT="testnode 7 2 4963" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4964" TEXT="testnode 7 3 4964" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4965" TEXT="testnode 7 4 4965" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4966" TEXT="testnode 7 5 4966" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4967" TEXT="testnode 7 6 4967" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4968" TEXT="testnode 7 7 4968" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4969" TEXT="testnode 6 7 4969" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4970" TEXT="testnode 7 1 4970" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4971" TEXT="testnode 7 2 4971" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4972" TEXT="testnode 7 3 4972" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4973" TEXT="testnode 7 4 4973" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4974" TEXT="testnode 7 5 4974" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4975" TEXT="testnode 7 6 4975" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4976" TEXT="testnode 7 7 4976" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_4977" TEXT="testnode 5 4 4977" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_4978" TEXT="testnode 6 1 4978" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4979" TEXT="testnode 7 1 4979" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4980" TEXT="testnode 7 2 4980" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4981" TEXT="testnode 7 3 4981" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4982" TEXT="testnode 7 4 4982" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4983" TEXT="testnode 7 5 4983" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4984" TEXT="testnode 7 6 4984" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4985" TEXT="testnode 7 7 4985" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4986" TEXT="testnode 6 2 4986" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4987" TEXT="testnode 7 1 4987" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4988" TEXT="testnode 7 2 4988" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4989" TEXT="testnode 7 3 4989" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4990" TEXT="testnode 7 4 4990" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4991" TEXT="testnode 7 5 4991" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4992" TEXT="testnode 7 6 4992" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4993" TEXT="testnode 7 7 4993" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_4994" TEXT="testnode 6 3 4994" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_4995" TEXT="testnode 7 1 4995" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4996" TEXT="testnode 7 2 4996" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4997" TEXT="testnode 7 3 4997" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4998" TEXT="testnode 7 4 4998" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_4999" TEXT="testnode 7 5 4999" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5000" TEXT="testnode 7 6 5000" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5001" TEXT="testnode 7 7 5001" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5002" TEXT="testnode 6 4 5002" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5003" TEXT="testnode 7 1 5003" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5004" TEXT="testnode 7 2 5004" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5005" TEXT="testnode 7 3 5005" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5006" TEXT="testnode 7 4 5006" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5007" TEXT="testnode 7 5 5007" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5008" TEXT="testnode 7 6 5008" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5009" TEXT="testnode 7 7 5009" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5010" TEXT="testnode 6 5 5010" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5011" TEXT="testnode 7 1 5011" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5012" TEXT="testnode 7 2 5012" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5013" TEXT="testnode 7 3 5013" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5014" TEXT="testnode 7 4 5014" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5015" TEXT="testnode 7 5 5015" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5016" TEXT="testnode 7 6 5016" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5017" TEXT="testnode 7 7 5017" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5018" TEXT="testnode 6 6 5018" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5019" TEXT="testnode 7 1 5019" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5020" TEXT="testnode 7 2 5020" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5021" TEXT="testnode 7 3 5021" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5022" TEXT="testnode 7 4 5022" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5023" TEXT="testnode 7 5 5023" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5024" TEXT="testnode 7 6 5024" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5025" TEXT="testnode 7 7 5025" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5026" TEXT="testnode 6 7 5026" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5027" TEXT="testnode 7 1 5027" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5028" TEXT="testnode 7 2 5028" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5029" TEXT="testnode 7 3 5029" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5030" TEXT="testnode 7 4 5030" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5031" TEXT="testnode 7 5 5031" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5032" TEXT="testnode 7 6 5032" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5033" TEXT="testnode 7 7 5033" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5034" TEXT="testnode 5 5 5034" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5035" TEXT="testnode 6 1 5035" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5036" TEXT="testnode 7 1 5036" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5037" TEXT="testnode 7 2 5037" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5038" TEXT="testnode 7 3 5038" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5039" TEXT="testnode 7 4 5039" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5040" TEXT="testnode 7 5 5040" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5041" TEXT="testnode 7 6 5041" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5042" TEXT="testnode 7 7 5042" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5043" TEXT="testnode 6 2 5043" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5044" TEXT="testnode 7 1 5044" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5045" TEXT="testnode 7 2 5045" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5046" TEXT="testnode 7 3 5046" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5047" TEXT="testnode 7 4 5047" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5048" TEXT="testnode 7 5 5048" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5049" TEXT="testnode 7 6 5049" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5050" TEXT="testnode 7 7 5050" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5051" TEXT="testnode 6 3 5051" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5052" TEXT="testnode 7 1 5052" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5053" TEXT="testnode 7 2 5053" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5054" TEXT="testnode 7 3 5054" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5055" TEXT="testnode 7 4 5055" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5056" TEXT="testnode 7 5 5056" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5057" TEXT="testnode 7 6 5057" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5058" TEXT="testnode 7 7 5058" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5059" TEXT="testnode 6 4 5059" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5060" TEXT="testnode 7 1 5060" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5061" TEXT="testnode 7 2 5061" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5062" TEXT="testnode 7 3 5062" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5063" TEXT="testnode 7 4 5063" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5064" TEXT="testnode 7 5 5064" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5065" TEXT="testnode 7 6 5065" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5066" TEXT="testnode 7 7 5066" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5067" TEXT="testnode 6 5 5067" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5068" TEXT="testnode 7 1 5068" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5069" TEXT="testnode 7 2 5069" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5070" TEXT="testnode 7 3 5070" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5071" TEXT="testnode 7 4 5071" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5072" TEXT="testnode 7 5 5072" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5073" TEXT="testnode 7 6 5073" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5074" TEXT="testnode 7 7 5074" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5075" TEXT="testnode 6 6 5075" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5076" TEXT="testnode 7 1 5076" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5077" TEXT="testnode 7 2 5077" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5078" TEXT="testnode 7 3 5078" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5079" TEXT="testnode 7 4 5079" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5080" TEXT="testnode 7 5 5080" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5081" TEXT="testnode 7 6 5081" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5082" TEXT="testnode 7 7 5082" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5083" TEXT="testnode 6 7 5083" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5084" TEXT="testnode 7 1 5084" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5085" TEXT="testnode 7 2 5085" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5086" TEXT="testnode 7 3 5086" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5087" TEXT="testnode 7 4 5087" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5088" TEXT="testnode 7 5 5088" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5089" TEXT="testnode 7 6 5089" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5090" TEXT="testnode 7 7 5090" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5091" TEXT="testnode 5 6 5091" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5092" TEXT="testnode 6 1 5092" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5093" TEXT="testnode 7 1 5093" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5094" TEXT="testnode 7 2 5094" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5095" TEXT="testnode 7 3 5095" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5096" TEXT="testnode 7 4 5096" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5097" TEXT="testnode 7 5 5097" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5098" TEXT="testnode 7 6 5098" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5099" TEXT="testnode 7 7 5099" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5100" TEXT="testnode 6 2 5100" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5101" TEXT="testnode 7 1 5101" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5102" TEXT="testnode 7 2 5102" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5103" TEXT="testnode 7 3 5103" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5104" TEXT="testnode 7 4 5104" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5105" TEXT="testnode 7 5 5105" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5106" TEXT="testnode 7 6 5106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5107" TEXT="testnode 7 7 5107" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5108" TEXT="testnode 6 3 5108" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5109" TEXT="testnode 7 1 5109" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5110" TEXT="testnode 7 2 5110" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5111" TEXT="testnode 7 3 5111" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5112" TEXT="testnode 7 4 5112" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5113" TEXT="testnode 7 5 5113" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5114" TEXT="testnode 7 6 5114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5115" TEXT="testnode 7 7 5115" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5116" TEXT="testnode 6 4 5116" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5117" TEXT="testnode 7 1 5117" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5118" TEXT="testnode 7 2 5118" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5119" TEXT="testnode 7 3 5119" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5120" TEXT="testnode 7 4 5120" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5121" TEXT="testnode 7 5 5121" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5122" TEXT="testnode 7 6 5122" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5123" TEXT="testnode 7 7 5123" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5124" TEXT="testnode 6 5 5124" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5125" TEXT="testnode 7 1 5125" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5126" TEXT="testnode 7 2 5126" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5127" TEXT="testnode 7 3 5127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5128" TEXT="testnode 7 4 5128" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5129" TEXT="testnode 7 5 5129" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5130" TEXT="testnode 7 6 5130" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5131" TEXT="testnode 7 7 5131" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5132" TEXT="testnode 6 6 5132" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5133" TEXT="testnode 7 1 5133" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5134" TEXT="testnode 7 2 5134" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5135" TEXT="testnode 7 3 5135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5136" TEXT="testnode 7 4 5136" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5137" TEXT="testnode 7 5 5137" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5138" TEXT="testnode 7 6 5138" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5139" TEXT="testnode 7 7 5139" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5140" TEXT="testnode 6 7 5140" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5141" TEXT="testnode 7 1 5141" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5142" TEXT="testnode 7 2 5142" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5143" TEXT="testnode 7 3 5143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5144" TEXT="testnode 7 4 5144" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5145" TEXT="testnode 7 5 5145" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5146" TEXT="testnode 7 6 5146" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5147" TEXT="testnode 7 7 5147" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5148" TEXT="testnode 5 7 5148" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5149" TEXT="testnode 6 1 5149" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5150" TEXT="testnode 7 1 5150" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5151" TEXT="testnode 7 2 5151" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5152" TEXT="testnode 7 3 5152" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5153" TEXT="testnode 7 4 5153" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5154" TEXT="testnode 7 5 5154" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5155" TEXT="testnode 7 6 5155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5156" TEXT="testnode 7 7 5156" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5157" TEXT="testnode 6 2 5157" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5158" TEXT="testnode 7 1 5158" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5159" TEXT="testnode 7 2 5159" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5160" TEXT="testnode 7 3 5160" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5161" TEXT="testnode 7 4 5161" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5162" TEXT="testnode 7 5 5162" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5163" TEXT="testnode 7 6 5163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5164" TEXT="testnode 7 7 5164" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5165" TEXT="testnode 6 3 5165" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5166" TEXT="testnode 7 1 5166" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5167" TEXT="testnode 7 2 5167" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5168" TEXT="testnode 7 3 5168" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5169" TEXT="testnode 7 4 5169" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5170" TEXT="testnode 7 5 5170" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5171" TEXT="testnode 7 6 5171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5172" TEXT="testnode 7 7 5172" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5173" TEXT="testnode 6 4 5173" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5174" TEXT="testnode 7 1 5174" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5175" TEXT="testnode 7 2 5175" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5176" TEXT="testnode 7 3 5176" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5177" TEXT="testnode 7 4 5177" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5178" TEXT="testnode 7 5 5178" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5179" TEXT="testnode 7 6 5179" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5180" TEXT="testnode 7 7 5180" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5181" TEXT="testnode 6 5 5181" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5182" TEXT="testnode 7 1 5182" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5183" TEXT="testnode 7 2 5183" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5184" TEXT="testnode 7 3 5184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5185" TEXT="testnode 7 4 5185" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5186" TEXT="testnode 7 5 5186" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5187" TEXT="testnode 7 6 5187" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5188" TEXT="testnode 7 7 5188" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5189" TEXT="testnode 6 6 5189" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5190" TEXT="testnode 7 1 5190" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5191" TEXT="testnode 7 2 5191" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5192" TEXT="testnode 7 3 5192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5193" TEXT="testnode 7 4 5193" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5194" TEXT="testnode 7 5 5194" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5195" TEXT="testnode 7 6 5195" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5196" TEXT="testnode 7 7 5196" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5197" TEXT="testnode 6 7 5197" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5198" TEXT="testnode 7 1 5198" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5199" TEXT="testnode 7 2 5199" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5200" TEXT="testnode 7 3 5200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5201" TEXT="testnode 7 4 5201" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5202" TEXT="testnode 7 5 5202" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5203" TEXT="testnode 7 6 5203" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5204" TEXT="testnode 7 7 5204" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5205" TEXT="testnode 4 7 5205" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_5206" TEXT="testnode 5 1 5206" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5207" TEXT="testnode 6 1 5207" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5208" TEXT="testnode 7 1 5208" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5209" TEXT="testnode 7 2 5209" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5210" TEXT="testnode 7 3 5210" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5211" TEXT="testnode 7 4 5211" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5212" TEXT="testnode 7 5 5212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5213" TEXT="testnode 7 6 5213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5214" TEXT="testnode 7 7 5214" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5215" TEXT="testnode 6 2 5215" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5216" TEXT="testnode 7 1 5216" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5217" TEXT="testnode 7 2 5217" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5218" TEXT="testnode 7 3 5218" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5219" TEXT="testnode 7 4 5219" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5220" TEXT="testnode 7 5 5220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5221" TEXT="testnode 7 6 5221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5222" TEXT="testnode 7 7 5222" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5223" TEXT="testnode 6 3 5223" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5224" TEXT="testnode 7 1 5224" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5225" TEXT="testnode 7 2 5225" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5226" TEXT="testnode 7 3 5226" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5227" TEXT="testnode 7 4 5227" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5228" TEXT="testnode 7 5 5228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5229" TEXT="testnode 7 6 5229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5230" TEXT="testnode 7 7 5230" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5231" TEXT="testnode 6 4 5231" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5232" TEXT="testnode 7 1 5232" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5233" TEXT="testnode 7 2 5233" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5234" TEXT="testnode 7 3 5234" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5235" TEXT="testnode 7 4 5235" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5236" TEXT="testnode 7 5 5236" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5237" TEXT="testnode 7 6 5237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5238" TEXT="testnode 7 7 5238" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5239" TEXT="testnode 6 5 5239" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5240" TEXT="testnode 7 1 5240" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5241" TEXT="testnode 7 2 5241" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5242" TEXT="testnode 7 3 5242" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5243" TEXT="testnode 7 4 5243" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5244" TEXT="testnode 7 5 5244" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5245" TEXT="testnode 7 6 5245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5246" TEXT="testnode 7 7 5246" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5247" TEXT="testnode 6 6 5247" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5248" TEXT="testnode 7 1 5248" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5249" TEXT="testnode 7 2 5249" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5250" TEXT="testnode 7 3 5250" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5251" TEXT="testnode 7 4 5251" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5252" TEXT="testnode 7 5 5252" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5253" TEXT="testnode 7 6 5253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5254" TEXT="testnode 7 7 5254" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5255" TEXT="testnode 6 7 5255" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5256" TEXT="testnode 7 1 5256" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5257" TEXT="testnode 7 2 5257" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5258" TEXT="testnode 7 3 5258" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5259" TEXT="testnode 7 4 5259" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5260" TEXT="testnode 7 5 5260" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5261" TEXT="testnode 7 6 5261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5262" TEXT="testnode 7 7 5262" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5263" TEXT="testnode 5 2 5263" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5264" TEXT="testnode 6 1 5264" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5265" TEXT="testnode 7 1 5265" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5266" TEXT="testnode 7 2 5266" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5267" TEXT="testnode 7 3 5267" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5268" TEXT="testnode 7 4 5268" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5269" TEXT="testnode 7 5 5269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5270" TEXT="testnode 7 6 5270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5271" TEXT="testnode 7 7 5271" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5272" TEXT="testnode 6 2 5272" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5273" TEXT="testnode 7 1 5273" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5274" TEXT="testnode 7 2 5274" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5275" TEXT="testnode 7 3 5275" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5276" TEXT="testnode 7 4 5276" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5277" TEXT="testnode 7 5 5277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5278" TEXT="testnode 7 6 5278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5279" TEXT="testnode 7 7 5279" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5280" TEXT="testnode 6 3 5280" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5281" TEXT="testnode 7 1 5281" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5282" TEXT="testnode 7 2 5282" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5283" TEXT="testnode 7 3 5283" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5284" TEXT="testnode 7 4 5284" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5285" TEXT="testnode 7 5 5285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5286" TEXT="testnode 7 6 5286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5287" TEXT="testnode 7 7 5287" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5288" TEXT="testnode 6 4 5288" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5289" TEXT="testnode 7 1 5289" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5290" TEXT="testnode 7 2 5290" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5291" TEXT="testnode 7 3 5291" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5292" TEXT="testnode 7 4 5292" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5293" TEXT="testnode 7 5 5293" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5294" TEXT="testnode 7 6 5294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5295" TEXT="testnode 7 7 5295" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5296" TEXT="testnode 6 5 5296" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5297" TEXT="testnode 7 1 5297" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5298" TEXT="testnode 7 2 5298" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5299" TEXT="testnode 7 3 5299" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5300" TEXT="testnode 7 4 5300" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5301" TEXT="testnode 7 5 5301" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5302" TEXT="testnode 7 6 5302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5303" TEXT="testnode 7 7 5303" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5304" TEXT="testnode 6 6 5304" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5305" TEXT="testnode 7 1 5305" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5306" TEXT="testnode 7 2 5306" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5307" TEXT="testnode 7 3 5307" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5308" TEXT="testnode 7 4 5308" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5309" TEXT="testnode 7 5 5309" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5310" TEXT="testnode 7 6 5310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5311" TEXT="testnode 7 7 5311" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5312" TEXT="testnode 6 7 5312" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5313" TEXT="testnode 7 1 5313" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5314" TEXT="testnode 7 2 5314" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5315" TEXT="testnode 7 3 5315" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5316" TEXT="testnode 7 4 5316" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5317" TEXT="testnode 7 5 5317" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5318" TEXT="testnode 7 6 5318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5319" TEXT="testnode 7 7 5319" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5320" TEXT="testnode 5 3 5320" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5321" TEXT="testnode 6 1 5321" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5322" TEXT="testnode 7 1 5322" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5323" TEXT="testnode 7 2 5323" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5324" TEXT="testnode 7 3 5324" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5325" TEXT="testnode 7 4 5325" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5326" TEXT="testnode 7 5 5326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5327" TEXT="testnode 7 6 5327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5328" TEXT="testnode 7 7 5328" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5329" TEXT="testnode 6 2 5329" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5330" TEXT="testnode 7 1 5330" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5331" TEXT="testnode 7 2 5331" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5332" TEXT="testnode 7 3 5332" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5333" TEXT="testnode 7 4 5333" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5334" TEXT="testnode 7 5 5334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5335" TEXT="testnode 7 6 5335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5336" TEXT="testnode 7 7 5336" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5337" TEXT="testnode 6 3 5337" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5338" TEXT="testnode 7 1 5338" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5339" TEXT="testnode 7 2 5339" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5340" TEXT="testnode 7 3 5340" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5341" TEXT="testnode 7 4 5341" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5342" TEXT="testnode 7 5 5342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5343" TEXT="testnode 7 6 5343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5344" TEXT="testnode 7 7 5344" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5345" TEXT="testnode 6 4 5345" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5346" TEXT="testnode 7 1 5346" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5347" TEXT="testnode 7 2 5347" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5348" TEXT="testnode 7 3 5348" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5349" TEXT="testnode 7 4 5349" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5350" TEXT="testnode 7 5 5350" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5351" TEXT="testnode 7 6 5351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5352" TEXT="testnode 7 7 5352" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5353" TEXT="testnode 6 5 5353" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5354" TEXT="testnode 7 1 5354" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5355" TEXT="testnode 7 2 5355" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5356" TEXT="testnode 7 3 5356" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5357" TEXT="testnode 7 4 5357" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5358" TEXT="testnode 7 5 5358" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5359" TEXT="testnode 7 6 5359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5360" TEXT="testnode 7 7 5360" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5361" TEXT="testnode 6 6 5361" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5362" TEXT="testnode 7 1 5362" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5363" TEXT="testnode 7 2 5363" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5364" TEXT="testnode 7 3 5364" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5365" TEXT="testnode 7 4 5365" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5366" TEXT="testnode 7 5 5366" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5367" TEXT="testnode 7 6 5367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5368" TEXT="testnode 7 7 5368" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5369" TEXT="testnode 6 7 5369" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5370" TEXT="testnode 7 1 5370" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5371" TEXT="testnode 7 2 5371" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5372" TEXT="testnode 7 3 5372" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5373" TEXT="testnode 7 4 5373" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5374" TEXT="testnode 7 5 5374" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5375" TEXT="testnode 7 6 5375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5376" TEXT="testnode 7 7 5376" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5377" TEXT="testnode 5 4 5377" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5378" TEXT="testnode 6 1 5378" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5379" TEXT="testnode 7 1 5379" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5380" TEXT="testnode 7 2 5380" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5381" TEXT="testnode 7 3 5381" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5382" TEXT="testnode 7 4 5382" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5383" TEXT="testnode 7 5 5383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5384" TEXT="testnode 7 6 5384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5385" TEXT="testnode 7 7 5385" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5386" TEXT="testnode 6 2 5386" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5387" TEXT="testnode 7 1 5387" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5388" TEXT="testnode 7 2 5388" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5389" TEXT="testnode 7 3 5389" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5390" TEXT="testnode 7 4 5390" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5391" TEXT="testnode 7 5 5391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5392" TEXT="testnode 7 6 5392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5393" TEXT="testnode 7 7 5393" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5394" TEXT="testnode 6 3 5394" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5395" TEXT="testnode 7 1 5395" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5396" TEXT="testnode 7 2 5396" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5397" TEXT="testnode 7 3 5397" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5398" TEXT="testnode 7 4 5398" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5399" TEXT="testnode 7 5 5399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5400" TEXT="testnode 7 6 5400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5401" TEXT="testnode 7 7 5401" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5402" TEXT="testnode 6 4 5402" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5403" TEXT="testnode 7 1 5403" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5404" TEXT="testnode 7 2 5404" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5405" TEXT="testnode 7 3 5405" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5406" TEXT="testnode 7 4 5406" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5407" TEXT="testnode 7 5 5407" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5408" TEXT="testnode 7 6 5408" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5409" TEXT="testnode 7 7 5409" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5410" TEXT="testnode 6 5 5410" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5411" TEXT="testnode 7 1 5411" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5412" TEXT="testnode 7 2 5412" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5413" TEXT="testnode 7 3 5413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5414" TEXT="testnode 7 4 5414" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5415" TEXT="testnode 7 5 5415" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5416" TEXT="testnode 7 6 5416" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5417" TEXT="testnode 7 7 5417" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5418" TEXT="testnode 6 6 5418" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5419" TEXT="testnode 7 1 5419" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5420" TEXT="testnode 7 2 5420" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5421" TEXT="testnode 7 3 5421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5422" TEXT="testnode 7 4 5422" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5423" TEXT="testnode 7 5 5423" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5424" TEXT="testnode 7 6 5424" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5425" TEXT="testnode 7 7 5425" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5426" TEXT="testnode 6 7 5426" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5427" TEXT="testnode 7 1 5427" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5428" TEXT="testnode 7 2 5428" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5429" TEXT="testnode 7 3 5429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5430" TEXT="testnode 7 4 5430" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5431" TEXT="testnode 7 5 5431" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5432" TEXT="testnode 7 6 5432" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5433" TEXT="testnode 7 7 5433" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5434" TEXT="testnode 5 5 5434" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5435" TEXT="testnode 6 1 5435" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5436" TEXT="testnode 7 1 5436" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5437" TEXT="testnode 7 2 5437" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5438" TEXT="testnode 7 3 5438" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5439" TEXT="testnode 7 4 5439" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5440" TEXT="testnode 7 5 5440" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5441" TEXT="testnode 7 6 5441" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5442" TEXT="testnode 7 7 5442" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5443" TEXT="testnode 6 2 5443" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5444" TEXT="testnode 7 1 5444" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5445" TEXT="testnode 7 2 5445" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5446" TEXT="testnode 7 3 5446" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5447" TEXT="testnode 7 4 5447" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5448" TEXT="testnode 7 5 5448" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5449" TEXT="testnode 7 6 5449" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5450" TEXT="testnode 7 7 5450" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5451" TEXT="testnode 6 3 5451" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5452" TEXT="testnode 7 1 5452" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5453" TEXT="testnode 7 2 5453" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5454" TEXT="testnode 7 3 5454" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5455" TEXT="testnode 7 4 5455" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5456" TEXT="testnode 7 5 5456" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5457" TEXT="testnode 7 6 5457" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5458" TEXT="testnode 7 7 5458" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5459" TEXT="testnode 6 4 5459" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5460" TEXT="testnode 7 1 5460" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5461" TEXT="testnode 7 2 5461" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5462" TEXT="testnode 7 3 5462" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5463" TEXT="testnode 7 4 5463" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5464" TEXT="testnode 7 5 5464" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5465" TEXT="testnode 7 6 5465" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5466" TEXT="testnode 7 7 5466" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5467" TEXT="testnode 6 5 5467" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5468" TEXT="testnode 7 1 5468" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5469" TEXT="testnode 7 2 5469" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5470" TEXT="testnode 7 3 5470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5471" TEXT="testnode 7 4 5471" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5472" TEXT="testnode 7 5 5472" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5473" TEXT="testnode 7 6 5473" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5474" TEXT="testnode 7 7 5474" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5475" TEXT="testnode 6 6 5475" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5476" TEXT="testnode 7 1 5476" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5477" TEXT="testnode 7 2 5477" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5478" TEXT="testnode 7 3 5478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5479" TEXT="testnode 7 4 5479" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5480" TEXT="testnode 7 5 5480" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5481" TEXT="testnode 7 6 5481" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5482" TEXT="testnode 7 7 5482" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5483" TEXT="testnode 6 7 5483" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5484" TEXT="testnode 7 1 5484" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5485" TEXT="testnode 7 2 5485" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5486" TEXT="testnode 7 3 5486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5487" TEXT="testnode 7 4 5487" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5488" TEXT="testnode 7 5 5488" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5489" TEXT="testnode 7 6 5489" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5490" TEXT="testnode 7 7 5490" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5491" TEXT="testnode 5 6 5491" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5492" TEXT="testnode 6 1 5492" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5493" TEXT="testnode 7 1 5493" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5494" TEXT="testnode 7 2 5494" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5495" TEXT="testnode 7 3 5495" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5496" TEXT="testnode 7 4 5496" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5497" TEXT="testnode 7 5 5497" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5498" TEXT="testnode 7 6 5498" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5499" TEXT="testnode 7 7 5499" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5500" TEXT="testnode 6 2 5500" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5501" TEXT="testnode 7 1 5501" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5502" TEXT="testnode 7 2 5502" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5503" TEXT="testnode 7 3 5503" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5504" TEXT="testnode 7 4 5504" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5505" TEXT="testnode 7 5 5505" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5506" TEXT="testnode 7 6 5506" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5507" TEXT="testnode 7 7 5507" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5508" TEXT="testnode 6 3 5508" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5509" TEXT="testnode 7 1 5509" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5510" TEXT="testnode 7 2 5510" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5511" TEXT="testnode 7 3 5511" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5512" TEXT="testnode 7 4 5512" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5513" TEXT="testnode 7 5 5513" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5514" TEXT="testnode 7 6 5514" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5515" TEXT="testnode 7 7 5515" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5516" TEXT="testnode 6 4 5516" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5517" TEXT="testnode 7 1 5517" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5518" TEXT="testnode 7 2 5518" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5519" TEXT="testnode 7 3 5519" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5520" TEXT="testnode 7 4 5520" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5521" TEXT="testnode 7 5 5521" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5522" TEXT="testnode 7 6 5522" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5523" TEXT="testnode 7 7 5523" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5524" TEXT="testnode 6 5 5524" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5525" TEXT="testnode 7 1 5525" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5526" TEXT="testnode 7 2 5526" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5527" TEXT="testnode 7 3 5527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5528" TEXT="testnode 7 4 5528" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5529" TEXT="testnode 7 5 5529" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5530" TEXT="testnode 7 6 5530" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5531" TEXT="testnode 7 7 5531" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5532" TEXT="testnode 6 6 5532" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5533" TEXT="testnode 7 1 5533" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5534" TEXT="testnode 7 2 5534" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5535" TEXT="testnode 7 3 5535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5536" TEXT="testnode 7 4 5536" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5537" TEXT="testnode 7 5 5537" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5538" TEXT="testnode 7 6 5538" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5539" TEXT="testnode 7 7 5539" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5540" TEXT="testnode 6 7 5540" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5541" TEXT="testnode 7 1 5541" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5542" TEXT="testnode 7 2 5542" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5543" TEXT="testnode 7 3 5543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5544" TEXT="testnode 7 4 5544" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5545" TEXT="testnode 7 5 5545" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5546" TEXT="testnode 7 6 5546" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5547" TEXT="testnode 7 7 5547" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5548" TEXT="testnode 5 7 5548" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5549" TEXT="testnode 6 1 5549" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5550" TEXT="testnode 7 1 5550" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5551" TEXT="testnode 7 2 5551" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5552" TEXT="testnode 7 3 5552" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5553" TEXT="testnode 7 4 5553" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5554" TEXT="testnode 7 5 5554" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5555" TEXT="testnode 7 6 5555" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5556" TEXT="testnode 7 7 5556" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5557" TEXT="testnode 6 2 5557" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5558" TEXT="testnode 7 1 5558" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5559" TEXT="testnode 7 2 5559" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5560" TEXT="testnode 7 3 5560" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5561" TEXT="testnode 7 4 5561" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5562" TEXT="testnode 7 5 5562" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5563" TEXT="testnode 7 6 5563" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5564" TEXT="testnode 7 7 5564" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5565" TEXT="testnode 6 3 5565" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5566" TEXT="testnode 7 1 5566" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5567" TEXT="testnode 7 2 5567" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5568" TEXT="testnode 7 3 5568" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5569" TEXT="testnode 7 4 5569" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5570" TEXT="testnode 7 5 5570" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5571" TEXT="testnode 7 6 5571" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5572" TEXT="testnode 7 7 5572" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5573" TEXT="testnode 6 4 5573" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5574" TEXT="testnode 7 1 5574" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5575" TEXT="testnode 7 2 5575" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5576" TEXT="testnode 7 3 5576" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5577" TEXT="testnode 7 4 5577" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5578" TEXT="testnode 7 5 5578" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5579" TEXT="testnode 7 6 5579" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5580" TEXT="testnode 7 7 5580" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5581" TEXT="testnode 6 5 5581" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5582" TEXT="testnode 7 1 5582" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5583" TEXT="testnode 7 2 5583" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5584" TEXT="testnode 7 3 5584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5585" TEXT="testnode 7 4 5585" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5586" TEXT="testnode 7 5 5586" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5587" TEXT="testnode 7 6 5587" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5588" TEXT="testnode 7 7 5588" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5589" TEXT="testnode 6 6 5589" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5590" TEXT="testnode 7 1 5590" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5591" TEXT="testnode 7 2 5591" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5592" TEXT="testnode 7 3 5592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5593" TEXT="testnode 7 4 5593" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5594" TEXT="testnode 7 5 5594" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5595" TEXT="testnode 7 6 5595" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5596" TEXT="testnode 7 7 5596" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5597" TEXT="testnode 6 7 5597" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5598" TEXT="testnode 7 1 5598" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5599" TEXT="testnode 7 2 5599" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5600" TEXT="testnode 7 3 5600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5601" TEXT="testnode 7 4 5601" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5602" TEXT="testnode 7 5 5602" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5603" TEXT="testnode 7 6 5603" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5604" TEXT="testnode 7 7 5604" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5605" TEXT="testnode 3 3 5605" FOLDED = "true">
- <icon BUILTIN="full-4"/>
- <icon BUILTIN="full-5"/>
- <node ID="Freemind_Link_5606" TEXT="testnode 4 1 5606" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_5607" TEXT="testnode 5 1 5607" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5608" TEXT="testnode 6 1 5608" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5609" TEXT="testnode 7 1 5609" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5610" TEXT="testnode 7 2 5610" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5611" TEXT="testnode 7 3 5611" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5612" TEXT="testnode 7 4 5612" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5613" TEXT="testnode 7 5 5613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5614" TEXT="testnode 7 6 5614" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5615" TEXT="testnode 7 7 5615" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5616" TEXT="testnode 6 2 5616" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5617" TEXT="testnode 7 1 5617" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5618" TEXT="testnode 7 2 5618" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5619" TEXT="testnode 7 3 5619" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5620" TEXT="testnode 7 4 5620" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5621" TEXT="testnode 7 5 5621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5622" TEXT="testnode 7 6 5622" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5623" TEXT="testnode 7 7 5623" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5624" TEXT="testnode 6 3 5624" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5625" TEXT="testnode 7 1 5625" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5626" TEXT="testnode 7 2 5626" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5627" TEXT="testnode 7 3 5627" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5628" TEXT="testnode 7 4 5628" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5629" TEXT="testnode 7 5 5629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5630" TEXT="testnode 7 6 5630" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5631" TEXT="testnode 7 7 5631" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5632" TEXT="testnode 6 4 5632" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5633" TEXT="testnode 7 1 5633" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5634" TEXT="testnode 7 2 5634" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5635" TEXT="testnode 7 3 5635" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5636" TEXT="testnode 7 4 5636" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5637" TEXT="testnode 7 5 5637" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5638" TEXT="testnode 7 6 5638" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5639" TEXT="testnode 7 7 5639" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5640" TEXT="testnode 6 5 5640" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5641" TEXT="testnode 7 1 5641" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5642" TEXT="testnode 7 2 5642" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5643" TEXT="testnode 7 3 5643" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5644" TEXT="testnode 7 4 5644" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5645" TEXT="testnode 7 5 5645" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5646" TEXT="testnode 7 6 5646" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5647" TEXT="testnode 7 7 5647" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5648" TEXT="testnode 6 6 5648" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5649" TEXT="testnode 7 1 5649" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5650" TEXT="testnode 7 2 5650" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5651" TEXT="testnode 7 3 5651" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5652" TEXT="testnode 7 4 5652" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5653" TEXT="testnode 7 5 5653" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5654" TEXT="testnode 7 6 5654" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5655" TEXT="testnode 7 7 5655" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5656" TEXT="testnode 6 7 5656" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5657" TEXT="testnode 7 1 5657" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5658" TEXT="testnode 7 2 5658" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5659" TEXT="testnode 7 3 5659" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5660" TEXT="testnode 7 4 5660" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5661" TEXT="testnode 7 5 5661" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5662" TEXT="testnode 7 6 5662" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5663" TEXT="testnode 7 7 5663" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5664" TEXT="testnode 5 2 5664" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5665" TEXT="testnode 6 1 5665" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5666" TEXT="testnode 7 1 5666" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5667" TEXT="testnode 7 2 5667" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5668" TEXT="testnode 7 3 5668" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5669" TEXT="testnode 7 4 5669" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5670" TEXT="testnode 7 5 5670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5671" TEXT="testnode 7 6 5671" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5672" TEXT="testnode 7 7 5672" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5673" TEXT="testnode 6 2 5673" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5674" TEXT="testnode 7 1 5674" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5675" TEXT="testnode 7 2 5675" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5676" TEXT="testnode 7 3 5676" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5677" TEXT="testnode 7 4 5677" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5678" TEXT="testnode 7 5 5678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5679" TEXT="testnode 7 6 5679" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5680" TEXT="testnode 7 7 5680" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5681" TEXT="testnode 6 3 5681" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5682" TEXT="testnode 7 1 5682" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5683" TEXT="testnode 7 2 5683" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5684" TEXT="testnode 7 3 5684" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5685" TEXT="testnode 7 4 5685" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5686" TEXT="testnode 7 5 5686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5687" TEXT="testnode 7 6 5687" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5688" TEXT="testnode 7 7 5688" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5689" TEXT="testnode 6 4 5689" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5690" TEXT="testnode 7 1 5690" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5691" TEXT="testnode 7 2 5691" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5692" TEXT="testnode 7 3 5692" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5693" TEXT="testnode 7 4 5693" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5694" TEXT="testnode 7 5 5694" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5695" TEXT="testnode 7 6 5695" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5696" TEXT="testnode 7 7 5696" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5697" TEXT="testnode 6 5 5697" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5698" TEXT="testnode 7 1 5698" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5699" TEXT="testnode 7 2 5699" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5700" TEXT="testnode 7 3 5700" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5701" TEXT="testnode 7 4 5701" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5702" TEXT="testnode 7 5 5702" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5703" TEXT="testnode 7 6 5703" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5704" TEXT="testnode 7 7 5704" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5705" TEXT="testnode 6 6 5705" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5706" TEXT="testnode 7 1 5706" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5707" TEXT="testnode 7 2 5707" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5708" TEXT="testnode 7 3 5708" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5709" TEXT="testnode 7 4 5709" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5710" TEXT="testnode 7 5 5710" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5711" TEXT="testnode 7 6 5711" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5712" TEXT="testnode 7 7 5712" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5713" TEXT="testnode 6 7 5713" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5714" TEXT="testnode 7 1 5714" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5715" TEXT="testnode 7 2 5715" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5716" TEXT="testnode 7 3 5716" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5717" TEXT="testnode 7 4 5717" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5718" TEXT="testnode 7 5 5718" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5719" TEXT="testnode 7 6 5719" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5720" TEXT="testnode 7 7 5720" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5721" TEXT="testnode 5 3 5721" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5722" TEXT="testnode 6 1 5722" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5723" TEXT="testnode 7 1 5723" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5724" TEXT="testnode 7 2 5724" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5725" TEXT="testnode 7 3 5725" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5726" TEXT="testnode 7 4 5726" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5727" TEXT="testnode 7 5 5727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5728" TEXT="testnode 7 6 5728" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5729" TEXT="testnode 7 7 5729" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5730" TEXT="testnode 6 2 5730" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5731" TEXT="testnode 7 1 5731" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5732" TEXT="testnode 7 2 5732" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5733" TEXT="testnode 7 3 5733" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5734" TEXT="testnode 7 4 5734" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5735" TEXT="testnode 7 5 5735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5736" TEXT="testnode 7 6 5736" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5737" TEXT="testnode 7 7 5737" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5738" TEXT="testnode 6 3 5738" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5739" TEXT="testnode 7 1 5739" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5740" TEXT="testnode 7 2 5740" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5741" TEXT="testnode 7 3 5741" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5742" TEXT="testnode 7 4 5742" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5743" TEXT="testnode 7 5 5743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5744" TEXT="testnode 7 6 5744" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5745" TEXT="testnode 7 7 5745" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5746" TEXT="testnode 6 4 5746" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5747" TEXT="testnode 7 1 5747" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5748" TEXT="testnode 7 2 5748" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5749" TEXT="testnode 7 3 5749" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5750" TEXT="testnode 7 4 5750" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5751" TEXT="testnode 7 5 5751" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5752" TEXT="testnode 7 6 5752" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5753" TEXT="testnode 7 7 5753" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5754" TEXT="testnode 6 5 5754" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5755" TEXT="testnode 7 1 5755" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5756" TEXT="testnode 7 2 5756" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5757" TEXT="testnode 7 3 5757" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5758" TEXT="testnode 7 4 5758" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5759" TEXT="testnode 7 5 5759" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5760" TEXT="testnode 7 6 5760" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5761" TEXT="testnode 7 7 5761" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5762" TEXT="testnode 6 6 5762" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5763" TEXT="testnode 7 1 5763" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5764" TEXT="testnode 7 2 5764" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5765" TEXT="testnode 7 3 5765" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5766" TEXT="testnode 7 4 5766" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5767" TEXT="testnode 7 5 5767" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5768" TEXT="testnode 7 6 5768" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5769" TEXT="testnode 7 7 5769" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5770" TEXT="testnode 6 7 5770" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5771" TEXT="testnode 7 1 5771" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5772" TEXT="testnode 7 2 5772" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5773" TEXT="testnode 7 3 5773" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5774" TEXT="testnode 7 4 5774" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5775" TEXT="testnode 7 5 5775" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5776" TEXT="testnode 7 6 5776" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5777" TEXT="testnode 7 7 5777" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5778" TEXT="testnode 5 4 5778" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5779" TEXT="testnode 6 1 5779" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5780" TEXT="testnode 7 1 5780" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5781" TEXT="testnode 7 2 5781" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5782" TEXT="testnode 7 3 5782" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5783" TEXT="testnode 7 4 5783" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5784" TEXT="testnode 7 5 5784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5785" TEXT="testnode 7 6 5785" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5786" TEXT="testnode 7 7 5786" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5787" TEXT="testnode 6 2 5787" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5788" TEXT="testnode 7 1 5788" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5789" TEXT="testnode 7 2 5789" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5790" TEXT="testnode 7 3 5790" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5791" TEXT="testnode 7 4 5791" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5792" TEXT="testnode 7 5 5792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5793" TEXT="testnode 7 6 5793" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5794" TEXT="testnode 7 7 5794" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5795" TEXT="testnode 6 3 5795" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5796" TEXT="testnode 7 1 5796" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5797" TEXT="testnode 7 2 5797" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5798" TEXT="testnode 7 3 5798" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5799" TEXT="testnode 7 4 5799" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5800" TEXT="testnode 7 5 5800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5801" TEXT="testnode 7 6 5801" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5802" TEXT="testnode 7 7 5802" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5803" TEXT="testnode 6 4 5803" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5804" TEXT="testnode 7 1 5804" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5805" TEXT="testnode 7 2 5805" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5806" TEXT="testnode 7 3 5806" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5807" TEXT="testnode 7 4 5807" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5808" TEXT="testnode 7 5 5808" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5809" TEXT="testnode 7 6 5809" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5810" TEXT="testnode 7 7 5810" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5811" TEXT="testnode 6 5 5811" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5812" TEXT="testnode 7 1 5812" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5813" TEXT="testnode 7 2 5813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5814" TEXT="testnode 7 3 5814" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5815" TEXT="testnode 7 4 5815" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5816" TEXT="testnode 7 5 5816" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5817" TEXT="testnode 7 6 5817" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5818" TEXT="testnode 7 7 5818" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5819" TEXT="testnode 6 6 5819" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5820" TEXT="testnode 7 1 5820" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5821" TEXT="testnode 7 2 5821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5822" TEXT="testnode 7 3 5822" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5823" TEXT="testnode 7 4 5823" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5824" TEXT="testnode 7 5 5824" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5825" TEXT="testnode 7 6 5825" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5826" TEXT="testnode 7 7 5826" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5827" TEXT="testnode 6 7 5827" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5828" TEXT="testnode 7 1 5828" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5829" TEXT="testnode 7 2 5829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5830" TEXT="testnode 7 3 5830" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5831" TEXT="testnode 7 4 5831" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5832" TEXT="testnode 7 5 5832" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5833" TEXT="testnode 7 6 5833" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5834" TEXT="testnode 7 7 5834" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5835" TEXT="testnode 5 5 5835" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5836" TEXT="testnode 6 1 5836" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5837" TEXT="testnode 7 1 5837" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5838" TEXT="testnode 7 2 5838" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5839" TEXT="testnode 7 3 5839" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5840" TEXT="testnode 7 4 5840" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5841" TEXT="testnode 7 5 5841" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5842" TEXT="testnode 7 6 5842" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5843" TEXT="testnode 7 7 5843" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5844" TEXT="testnode 6 2 5844" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5845" TEXT="testnode 7 1 5845" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5846" TEXT="testnode 7 2 5846" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5847" TEXT="testnode 7 3 5847" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5848" TEXT="testnode 7 4 5848" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5849" TEXT="testnode 7 5 5849" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5850" TEXT="testnode 7 6 5850" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5851" TEXT="testnode 7 7 5851" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5852" TEXT="testnode 6 3 5852" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5853" TEXT="testnode 7 1 5853" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5854" TEXT="testnode 7 2 5854" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5855" TEXT="testnode 7 3 5855" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5856" TEXT="testnode 7 4 5856" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5857" TEXT="testnode 7 5 5857" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5858" TEXT="testnode 7 6 5858" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5859" TEXT="testnode 7 7 5859" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5860" TEXT="testnode 6 4 5860" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5861" TEXT="testnode 7 1 5861" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5862" TEXT="testnode 7 2 5862" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5863" TEXT="testnode 7 3 5863" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5864" TEXT="testnode 7 4 5864" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5865" TEXT="testnode 7 5 5865" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5866" TEXT="testnode 7 6 5866" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5867" TEXT="testnode 7 7 5867" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5868" TEXT="testnode 6 5 5868" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5869" TEXT="testnode 7 1 5869" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5870" TEXT="testnode 7 2 5870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5871" TEXT="testnode 7 3 5871" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5872" TEXT="testnode 7 4 5872" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5873" TEXT="testnode 7 5 5873" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5874" TEXT="testnode 7 6 5874" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5875" TEXT="testnode 7 7 5875" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5876" TEXT="testnode 6 6 5876" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5877" TEXT="testnode 7 1 5877" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5878" TEXT="testnode 7 2 5878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5879" TEXT="testnode 7 3 5879" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5880" TEXT="testnode 7 4 5880" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5881" TEXT="testnode 7 5 5881" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5882" TEXT="testnode 7 6 5882" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5883" TEXT="testnode 7 7 5883" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5884" TEXT="testnode 6 7 5884" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5885" TEXT="testnode 7 1 5885" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5886" TEXT="testnode 7 2 5886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5887" TEXT="testnode 7 3 5887" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5888" TEXT="testnode 7 4 5888" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5889" TEXT="testnode 7 5 5889" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5890" TEXT="testnode 7 6 5890" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5891" TEXT="testnode 7 7 5891" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5892" TEXT="testnode 5 6 5892" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5893" TEXT="testnode 6 1 5893" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5894" TEXT="testnode 7 1 5894" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5895" TEXT="testnode 7 2 5895" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5896" TEXT="testnode 7 3 5896" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5897" TEXT="testnode 7 4 5897" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5898" TEXT="testnode 7 5 5898" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5899" TEXT="testnode 7 6 5899" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5900" TEXT="testnode 7 7 5900" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5901" TEXT="testnode 6 2 5901" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5902" TEXT="testnode 7 1 5902" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5903" TEXT="testnode 7 2 5903" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5904" TEXT="testnode 7 3 5904" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5905" TEXT="testnode 7 4 5905" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5906" TEXT="testnode 7 5 5906" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5907" TEXT="testnode 7 6 5907" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5908" TEXT="testnode 7 7 5908" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5909" TEXT="testnode 6 3 5909" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5910" TEXT="testnode 7 1 5910" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5911" TEXT="testnode 7 2 5911" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5912" TEXT="testnode 7 3 5912" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5913" TEXT="testnode 7 4 5913" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5914" TEXT="testnode 7 5 5914" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5915" TEXT="testnode 7 6 5915" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5916" TEXT="testnode 7 7 5916" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5917" TEXT="testnode 6 4 5917" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5918" TEXT="testnode 7 1 5918" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5919" TEXT="testnode 7 2 5919" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5920" TEXT="testnode 7 3 5920" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5921" TEXT="testnode 7 4 5921" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5922" TEXT="testnode 7 5 5922" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5923" TEXT="testnode 7 6 5923" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5924" TEXT="testnode 7 7 5924" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5925" TEXT="testnode 6 5 5925" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5926" TEXT="testnode 7 1 5926" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5927" TEXT="testnode 7 2 5927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5928" TEXT="testnode 7 3 5928" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5929" TEXT="testnode 7 4 5929" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5930" TEXT="testnode 7 5 5930" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5931" TEXT="testnode 7 6 5931" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5932" TEXT="testnode 7 7 5932" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5933" TEXT="testnode 6 6 5933" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5934" TEXT="testnode 7 1 5934" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5935" TEXT="testnode 7 2 5935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5936" TEXT="testnode 7 3 5936" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5937" TEXT="testnode 7 4 5937" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5938" TEXT="testnode 7 5 5938" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5939" TEXT="testnode 7 6 5939" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5940" TEXT="testnode 7 7 5940" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5941" TEXT="testnode 6 7 5941" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5942" TEXT="testnode 7 1 5942" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5943" TEXT="testnode 7 2 5943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5944" TEXT="testnode 7 3 5944" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5945" TEXT="testnode 7 4 5945" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5946" TEXT="testnode 7 5 5946" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5947" TEXT="testnode 7 6 5947" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5948" TEXT="testnode 7 7 5948" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_5949" TEXT="testnode 5 7 5949" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_5950" TEXT="testnode 6 1 5950" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5951" TEXT="testnode 7 1 5951" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5952" TEXT="testnode 7 2 5952" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5953" TEXT="testnode 7 3 5953" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5954" TEXT="testnode 7 4 5954" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5955" TEXT="testnode 7 5 5955" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5956" TEXT="testnode 7 6 5956" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5957" TEXT="testnode 7 7 5957" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5958" TEXT="testnode 6 2 5958" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5959" TEXT="testnode 7 1 5959" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5960" TEXT="testnode 7 2 5960" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5961" TEXT="testnode 7 3 5961" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5962" TEXT="testnode 7 4 5962" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5963" TEXT="testnode 7 5 5963" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5964" TEXT="testnode 7 6 5964" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5965" TEXT="testnode 7 7 5965" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5966" TEXT="testnode 6 3 5966" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5967" TEXT="testnode 7 1 5967" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5968" TEXT="testnode 7 2 5968" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5969" TEXT="testnode 7 3 5969" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5970" TEXT="testnode 7 4 5970" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5971" TEXT="testnode 7 5 5971" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5972" TEXT="testnode 7 6 5972" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5973" TEXT="testnode 7 7 5973" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5974" TEXT="testnode 6 4 5974" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5975" TEXT="testnode 7 1 5975" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5976" TEXT="testnode 7 2 5976" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5977" TEXT="testnode 7 3 5977" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5978" TEXT="testnode 7 4 5978" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5979" TEXT="testnode 7 5 5979" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5980" TEXT="testnode 7 6 5980" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5981" TEXT="testnode 7 7 5981" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5982" TEXT="testnode 6 5 5982" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5983" TEXT="testnode 7 1 5983" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5984" TEXT="testnode 7 2 5984" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5985" TEXT="testnode 7 3 5985" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5986" TEXT="testnode 7 4 5986" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5987" TEXT="testnode 7 5 5987" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5988" TEXT="testnode 7 6 5988" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5989" TEXT="testnode 7 7 5989" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5990" TEXT="testnode 6 6 5990" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5991" TEXT="testnode 7 1 5991" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5992" TEXT="testnode 7 2 5992" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5993" TEXT="testnode 7 3 5993" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5994" TEXT="testnode 7 4 5994" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5995" TEXT="testnode 7 5 5995" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5996" TEXT="testnode 7 6 5996" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_5997" TEXT="testnode 7 7 5997" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_5998" TEXT="testnode 6 7 5998" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_5999" TEXT="testnode 7 1 5999" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6000" TEXT="testnode 7 2 6000" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6001" TEXT="testnode 7 3 6001" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6002" TEXT="testnode 7 4 6002" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6003" TEXT="testnode 7 5 6003" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6004" TEXT="testnode 7 6 6004" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6005" TEXT="testnode 7 7 6005" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6006" TEXT="testnode 4 2 6006" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_6007" TEXT="testnode 5 1 6007" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6008" TEXT="testnode 6 1 6008" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6009" TEXT="testnode 7 1 6009" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6010" TEXT="testnode 7 2 6010" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6011" TEXT="testnode 7 3 6011" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6012" TEXT="testnode 7 4 6012" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6013" TEXT="testnode 7 5 6013" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6014" TEXT="testnode 7 6 6014" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6015" TEXT="testnode 7 7 6015" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6016" TEXT="testnode 6 2 6016" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6017" TEXT="testnode 7 1 6017" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6018" TEXT="testnode 7 2 6018" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6019" TEXT="testnode 7 3 6019" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6020" TEXT="testnode 7 4 6020" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6021" TEXT="testnode 7 5 6021" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6022" TEXT="testnode 7 6 6022" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6023" TEXT="testnode 7 7 6023" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6024" TEXT="testnode 6 3 6024" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6025" TEXT="testnode 7 1 6025" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6026" TEXT="testnode 7 2 6026" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6027" TEXT="testnode 7 3 6027" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6028" TEXT="testnode 7 4 6028" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6029" TEXT="testnode 7 5 6029" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6030" TEXT="testnode 7 6 6030" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6031" TEXT="testnode 7 7 6031" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6032" TEXT="testnode 6 4 6032" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6033" TEXT="testnode 7 1 6033" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6034" TEXT="testnode 7 2 6034" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6035" TEXT="testnode 7 3 6035" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6036" TEXT="testnode 7 4 6036" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6037" TEXT="testnode 7 5 6037" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6038" TEXT="testnode 7 6 6038" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6039" TEXT="testnode 7 7 6039" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6040" TEXT="testnode 6 5 6040" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6041" TEXT="testnode 7 1 6041" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6042" TEXT="testnode 7 2 6042" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6043" TEXT="testnode 7 3 6043" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6044" TEXT="testnode 7 4 6044" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6045" TEXT="testnode 7 5 6045" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6046" TEXT="testnode 7 6 6046" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6047" TEXT="testnode 7 7 6047" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6048" TEXT="testnode 6 6 6048" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6049" TEXT="testnode 7 1 6049" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6050" TEXT="testnode 7 2 6050" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6051" TEXT="testnode 7 3 6051" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6052" TEXT="testnode 7 4 6052" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6053" TEXT="testnode 7 5 6053" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6054" TEXT="testnode 7 6 6054" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6055" TEXT="testnode 7 7 6055" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6056" TEXT="testnode 6 7 6056" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6057" TEXT="testnode 7 1 6057" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6058" TEXT="testnode 7 2 6058" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6059" TEXT="testnode 7 3 6059" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6060" TEXT="testnode 7 4 6060" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6061" TEXT="testnode 7 5 6061" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6062" TEXT="testnode 7 6 6062" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6063" TEXT="testnode 7 7 6063" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6064" TEXT="testnode 5 2 6064" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6065" TEXT="testnode 6 1 6065" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6066" TEXT="testnode 7 1 6066" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6067" TEXT="testnode 7 2 6067" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6068" TEXT="testnode 7 3 6068" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6069" TEXT="testnode 7 4 6069" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6070" TEXT="testnode 7 5 6070" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6071" TEXT="testnode 7 6 6071" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6072" TEXT="testnode 7 7 6072" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6073" TEXT="testnode 6 2 6073" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6074" TEXT="testnode 7 1 6074" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6075" TEXT="testnode 7 2 6075" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6076" TEXT="testnode 7 3 6076" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6077" TEXT="testnode 7 4 6077" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6078" TEXT="testnode 7 5 6078" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6079" TEXT="testnode 7 6 6079" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6080" TEXT="testnode 7 7 6080" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6081" TEXT="testnode 6 3 6081" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6082" TEXT="testnode 7 1 6082" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6083" TEXT="testnode 7 2 6083" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6084" TEXT="testnode 7 3 6084" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6085" TEXT="testnode 7 4 6085" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6086" TEXT="testnode 7 5 6086" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6087" TEXT="testnode 7 6 6087" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6088" TEXT="testnode 7 7 6088" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6089" TEXT="testnode 6 4 6089" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6090" TEXT="testnode 7 1 6090" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6091" TEXT="testnode 7 2 6091" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6092" TEXT="testnode 7 3 6092" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6093" TEXT="testnode 7 4 6093" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6094" TEXT="testnode 7 5 6094" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6095" TEXT="testnode 7 6 6095" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6096" TEXT="testnode 7 7 6096" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6097" TEXT="testnode 6 5 6097" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6098" TEXT="testnode 7 1 6098" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6099" TEXT="testnode 7 2 6099" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6100" TEXT="testnode 7 3 6100" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6101" TEXT="testnode 7 4 6101" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6102" TEXT="testnode 7 5 6102" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6103" TEXT="testnode 7 6 6103" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6104" TEXT="testnode 7 7 6104" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6105" TEXT="testnode 6 6 6105" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6106" TEXT="testnode 7 1 6106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6107" TEXT="testnode 7 2 6107" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6108" TEXT="testnode 7 3 6108" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6109" TEXT="testnode 7 4 6109" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6110" TEXT="testnode 7 5 6110" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6111" TEXT="testnode 7 6 6111" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6112" TEXT="testnode 7 7 6112" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6113" TEXT="testnode 6 7 6113" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6114" TEXT="testnode 7 1 6114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6115" TEXT="testnode 7 2 6115" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6116" TEXT="testnode 7 3 6116" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6117" TEXT="testnode 7 4 6117" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6118" TEXT="testnode 7 5 6118" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6119" TEXT="testnode 7 6 6119" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6120" TEXT="testnode 7 7 6120" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6121" TEXT="testnode 5 3 6121" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6122" TEXT="testnode 6 1 6122" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6123" TEXT="testnode 7 1 6123" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6124" TEXT="testnode 7 2 6124" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6125" TEXT="testnode 7 3 6125" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6126" TEXT="testnode 7 4 6126" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6127" TEXT="testnode 7 5 6127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6128" TEXT="testnode 7 6 6128" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6129" TEXT="testnode 7 7 6129" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6130" TEXT="testnode 6 2 6130" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6131" TEXT="testnode 7 1 6131" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6132" TEXT="testnode 7 2 6132" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6133" TEXT="testnode 7 3 6133" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6134" TEXT="testnode 7 4 6134" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6135" TEXT="testnode 7 5 6135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6136" TEXT="testnode 7 6 6136" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6137" TEXT="testnode 7 7 6137" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6138" TEXT="testnode 6 3 6138" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6139" TEXT="testnode 7 1 6139" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6140" TEXT="testnode 7 2 6140" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6141" TEXT="testnode 7 3 6141" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6142" TEXT="testnode 7 4 6142" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6143" TEXT="testnode 7 5 6143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6144" TEXT="testnode 7 6 6144" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6145" TEXT="testnode 7 7 6145" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6146" TEXT="testnode 6 4 6146" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6147" TEXT="testnode 7 1 6147" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6148" TEXT="testnode 7 2 6148" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6149" TEXT="testnode 7 3 6149" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6150" TEXT="testnode 7 4 6150" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6151" TEXT="testnode 7 5 6151" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6152" TEXT="testnode 7 6 6152" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6153" TEXT="testnode 7 7 6153" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6154" TEXT="testnode 6 5 6154" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6155" TEXT="testnode 7 1 6155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6156" TEXT="testnode 7 2 6156" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6157" TEXT="testnode 7 3 6157" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6158" TEXT="testnode 7 4 6158" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6159" TEXT="testnode 7 5 6159" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6160" TEXT="testnode 7 6 6160" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6161" TEXT="testnode 7 7 6161" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6162" TEXT="testnode 6 6 6162" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6163" TEXT="testnode 7 1 6163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6164" TEXT="testnode 7 2 6164" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6165" TEXT="testnode 7 3 6165" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6166" TEXT="testnode 7 4 6166" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6167" TEXT="testnode 7 5 6167" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6168" TEXT="testnode 7 6 6168" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6169" TEXT="testnode 7 7 6169" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6170" TEXT="testnode 6 7 6170" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6171" TEXT="testnode 7 1 6171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6172" TEXT="testnode 7 2 6172" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6173" TEXT="testnode 7 3 6173" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6174" TEXT="testnode 7 4 6174" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6175" TEXT="testnode 7 5 6175" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6176" TEXT="testnode 7 6 6176" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6177" TEXT="testnode 7 7 6177" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6178" TEXT="testnode 5 4 6178" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6179" TEXT="testnode 6 1 6179" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6180" TEXT="testnode 7 1 6180" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6181" TEXT="testnode 7 2 6181" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6182" TEXT="testnode 7 3 6182" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6183" TEXT="testnode 7 4 6183" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6184" TEXT="testnode 7 5 6184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6185" TEXT="testnode 7 6 6185" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6186" TEXT="testnode 7 7 6186" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6187" TEXT="testnode 6 2 6187" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6188" TEXT="testnode 7 1 6188" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6189" TEXT="testnode 7 2 6189" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6190" TEXT="testnode 7 3 6190" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6191" TEXT="testnode 7 4 6191" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6192" TEXT="testnode 7 5 6192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6193" TEXT="testnode 7 6 6193" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6194" TEXT="testnode 7 7 6194" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6195" TEXT="testnode 6 3 6195" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6196" TEXT="testnode 7 1 6196" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6197" TEXT="testnode 7 2 6197" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6198" TEXT="testnode 7 3 6198" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6199" TEXT="testnode 7 4 6199" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6200" TEXT="testnode 7 5 6200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6201" TEXT="testnode 7 6 6201" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6202" TEXT="testnode 7 7 6202" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6203" TEXT="testnode 6 4 6203" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6204" TEXT="testnode 7 1 6204" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6205" TEXT="testnode 7 2 6205" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6206" TEXT="testnode 7 3 6206" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6207" TEXT="testnode 7 4 6207" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6208" TEXT="testnode 7 5 6208" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6209" TEXT="testnode 7 6 6209" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6210" TEXT="testnode 7 7 6210" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6211" TEXT="testnode 6 5 6211" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6212" TEXT="testnode 7 1 6212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6213" TEXT="testnode 7 2 6213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6214" TEXT="testnode 7 3 6214" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6215" TEXT="testnode 7 4 6215" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6216" TEXT="testnode 7 5 6216" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6217" TEXT="testnode 7 6 6217" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6218" TEXT="testnode 7 7 6218" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6219" TEXT="testnode 6 6 6219" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6220" TEXT="testnode 7 1 6220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6221" TEXT="testnode 7 2 6221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6222" TEXT="testnode 7 3 6222" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6223" TEXT="testnode 7 4 6223" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6224" TEXT="testnode 7 5 6224" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6225" TEXT="testnode 7 6 6225" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6226" TEXT="testnode 7 7 6226" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6227" TEXT="testnode 6 7 6227" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6228" TEXT="testnode 7 1 6228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6229" TEXT="testnode 7 2 6229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6230" TEXT="testnode 7 3 6230" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6231" TEXT="testnode 7 4 6231" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6232" TEXT="testnode 7 5 6232" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6233" TEXT="testnode 7 6 6233" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6234" TEXT="testnode 7 7 6234" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6235" TEXT="testnode 5 5 6235" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6236" TEXT="testnode 6 1 6236" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6237" TEXT="testnode 7 1 6237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6238" TEXT="testnode 7 2 6238" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6239" TEXT="testnode 7 3 6239" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6240" TEXT="testnode 7 4 6240" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6241" TEXT="testnode 7 5 6241" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6242" TEXT="testnode 7 6 6242" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6243" TEXT="testnode 7 7 6243" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6244" TEXT="testnode 6 2 6244" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6245" TEXT="testnode 7 1 6245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6246" TEXT="testnode 7 2 6246" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6247" TEXT="testnode 7 3 6247" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6248" TEXT="testnode 7 4 6248" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6249" TEXT="testnode 7 5 6249" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6250" TEXT="testnode 7 6 6250" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6251" TEXT="testnode 7 7 6251" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6252" TEXT="testnode 6 3 6252" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6253" TEXT="testnode 7 1 6253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6254" TEXT="testnode 7 2 6254" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6255" TEXT="testnode 7 3 6255" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6256" TEXT="testnode 7 4 6256" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6257" TEXT="testnode 7 5 6257" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6258" TEXT="testnode 7 6 6258" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6259" TEXT="testnode 7 7 6259" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6260" TEXT="testnode 6 4 6260" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6261" TEXT="testnode 7 1 6261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6262" TEXT="testnode 7 2 6262" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6263" TEXT="testnode 7 3 6263" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6264" TEXT="testnode 7 4 6264" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6265" TEXT="testnode 7 5 6265" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6266" TEXT="testnode 7 6 6266" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6267" TEXT="testnode 7 7 6267" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6268" TEXT="testnode 6 5 6268" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6269" TEXT="testnode 7 1 6269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6270" TEXT="testnode 7 2 6270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6271" TEXT="testnode 7 3 6271" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6272" TEXT="testnode 7 4 6272" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6273" TEXT="testnode 7 5 6273" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6274" TEXT="testnode 7 6 6274" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6275" TEXT="testnode 7 7 6275" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6276" TEXT="testnode 6 6 6276" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6277" TEXT="testnode 7 1 6277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6278" TEXT="testnode 7 2 6278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6279" TEXT="testnode 7 3 6279" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6280" TEXT="testnode 7 4 6280" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6281" TEXT="testnode 7 5 6281" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6282" TEXT="testnode 7 6 6282" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6283" TEXT="testnode 7 7 6283" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6284" TEXT="testnode 6 7 6284" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6285" TEXT="testnode 7 1 6285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6286" TEXT="testnode 7 2 6286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6287" TEXT="testnode 7 3 6287" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6288" TEXT="testnode 7 4 6288" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6289" TEXT="testnode 7 5 6289" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6290" TEXT="testnode 7 6 6290" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6291" TEXT="testnode 7 7 6291" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6292" TEXT="testnode 5 6 6292" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6293" TEXT="testnode 6 1 6293" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6294" TEXT="testnode 7 1 6294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6295" TEXT="testnode 7 2 6295" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6296" TEXT="testnode 7 3 6296" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6297" TEXT="testnode 7 4 6297" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6298" TEXT="testnode 7 5 6298" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6299" TEXT="testnode 7 6 6299" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6300" TEXT="testnode 7 7 6300" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6301" TEXT="testnode 6 2 6301" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6302" TEXT="testnode 7 1 6302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6303" TEXT="testnode 7 2 6303" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6304" TEXT="testnode 7 3 6304" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6305" TEXT="testnode 7 4 6305" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6306" TEXT="testnode 7 5 6306" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6307" TEXT="testnode 7 6 6307" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6308" TEXT="testnode 7 7 6308" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6309" TEXT="testnode 6 3 6309" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6310" TEXT="testnode 7 1 6310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6311" TEXT="testnode 7 2 6311" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6312" TEXT="testnode 7 3 6312" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6313" TEXT="testnode 7 4 6313" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6314" TEXT="testnode 7 5 6314" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6315" TEXT="testnode 7 6 6315" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6316" TEXT="testnode 7 7 6316" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6317" TEXT="testnode 6 4 6317" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6318" TEXT="testnode 7 1 6318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6319" TEXT="testnode 7 2 6319" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6320" TEXT="testnode 7 3 6320" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6321" TEXT="testnode 7 4 6321" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6322" TEXT="testnode 7 5 6322" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6323" TEXT="testnode 7 6 6323" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6324" TEXT="testnode 7 7 6324" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6325" TEXT="testnode 6 5 6325" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6326" TEXT="testnode 7 1 6326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6327" TEXT="testnode 7 2 6327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6328" TEXT="testnode 7 3 6328" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6329" TEXT="testnode 7 4 6329" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6330" TEXT="testnode 7 5 6330" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6331" TEXT="testnode 7 6 6331" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6332" TEXT="testnode 7 7 6332" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6333" TEXT="testnode 6 6 6333" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6334" TEXT="testnode 7 1 6334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6335" TEXT="testnode 7 2 6335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6336" TEXT="testnode 7 3 6336" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6337" TEXT="testnode 7 4 6337" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6338" TEXT="testnode 7 5 6338" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6339" TEXT="testnode 7 6 6339" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6340" TEXT="testnode 7 7 6340" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6341" TEXT="testnode 6 7 6341" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6342" TEXT="testnode 7 1 6342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6343" TEXT="testnode 7 2 6343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6344" TEXT="testnode 7 3 6344" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6345" TEXT="testnode 7 4 6345" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6346" TEXT="testnode 7 5 6346" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6347" TEXT="testnode 7 6 6347" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6348" TEXT="testnode 7 7 6348" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6349" TEXT="testnode 5 7 6349" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6350" TEXT="testnode 6 1 6350" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6351" TEXT="testnode 7 1 6351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6352" TEXT="testnode 7 2 6352" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6353" TEXT="testnode 7 3 6353" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6354" TEXT="testnode 7 4 6354" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6355" TEXT="testnode 7 5 6355" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6356" TEXT="testnode 7 6 6356" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6357" TEXT="testnode 7 7 6357" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6358" TEXT="testnode 6 2 6358" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6359" TEXT="testnode 7 1 6359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6360" TEXT="testnode 7 2 6360" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6361" TEXT="testnode 7 3 6361" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6362" TEXT="testnode 7 4 6362" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6363" TEXT="testnode 7 5 6363" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6364" TEXT="testnode 7 6 6364" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6365" TEXT="testnode 7 7 6365" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6366" TEXT="testnode 6 3 6366" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6367" TEXT="testnode 7 1 6367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6368" TEXT="testnode 7 2 6368" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6369" TEXT="testnode 7 3 6369" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6370" TEXT="testnode 7 4 6370" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6371" TEXT="testnode 7 5 6371" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6372" TEXT="testnode 7 6 6372" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6373" TEXT="testnode 7 7 6373" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6374" TEXT="testnode 6 4 6374" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6375" TEXT="testnode 7 1 6375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6376" TEXT="testnode 7 2 6376" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6377" TEXT="testnode 7 3 6377" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6378" TEXT="testnode 7 4 6378" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6379" TEXT="testnode 7 5 6379" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6380" TEXT="testnode 7 6 6380" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6381" TEXT="testnode 7 7 6381" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6382" TEXT="testnode 6 5 6382" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6383" TEXT="testnode 7 1 6383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6384" TEXT="testnode 7 2 6384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6385" TEXT="testnode 7 3 6385" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6386" TEXT="testnode 7 4 6386" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6387" TEXT="testnode 7 5 6387" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6388" TEXT="testnode 7 6 6388" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6389" TEXT="testnode 7 7 6389" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6390" TEXT="testnode 6 6 6390" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6391" TEXT="testnode 7 1 6391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6392" TEXT="testnode 7 2 6392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6393" TEXT="testnode 7 3 6393" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6394" TEXT="testnode 7 4 6394" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6395" TEXT="testnode 7 5 6395" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6396" TEXT="testnode 7 6 6396" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6397" TEXT="testnode 7 7 6397" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6398" TEXT="testnode 6 7 6398" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6399" TEXT="testnode 7 1 6399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6400" TEXT="testnode 7 2 6400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6401" TEXT="testnode 7 3 6401" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6402" TEXT="testnode 7 4 6402" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6403" TEXT="testnode 7 5 6403" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6404" TEXT="testnode 7 6 6404" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6405" TEXT="testnode 7 7 6405" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6406" TEXT="testnode 4 3 6406" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_6407" TEXT="testnode 5 1 6407" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6408" TEXT="testnode 6 1 6408" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6409" TEXT="testnode 7 1 6409" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6410" TEXT="testnode 7 2 6410" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6411" TEXT="testnode 7 3 6411" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6412" TEXT="testnode 7 4 6412" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6413" TEXT="testnode 7 5 6413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6414" TEXT="testnode 7 6 6414" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6415" TEXT="testnode 7 7 6415" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6416" TEXT="testnode 6 2 6416" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6417" TEXT="testnode 7 1 6417" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6418" TEXT="testnode 7 2 6418" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6419" TEXT="testnode 7 3 6419" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6420" TEXT="testnode 7 4 6420" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6421" TEXT="testnode 7 5 6421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6422" TEXT="testnode 7 6 6422" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6423" TEXT="testnode 7 7 6423" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6424" TEXT="testnode 6 3 6424" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6425" TEXT="testnode 7 1 6425" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6426" TEXT="testnode 7 2 6426" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6427" TEXT="testnode 7 3 6427" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6428" TEXT="testnode 7 4 6428" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6429" TEXT="testnode 7 5 6429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6430" TEXT="testnode 7 6 6430" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6431" TEXT="testnode 7 7 6431" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6432" TEXT="testnode 6 4 6432" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6433" TEXT="testnode 7 1 6433" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6434" TEXT="testnode 7 2 6434" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6435" TEXT="testnode 7 3 6435" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6436" TEXT="testnode 7 4 6436" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6437" TEXT="testnode 7 5 6437" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6438" TEXT="testnode 7 6 6438" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6439" TEXT="testnode 7 7 6439" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6440" TEXT="testnode 6 5 6440" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6441" TEXT="testnode 7 1 6441" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6442" TEXT="testnode 7 2 6442" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6443" TEXT="testnode 7 3 6443" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6444" TEXT="testnode 7 4 6444" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6445" TEXT="testnode 7 5 6445" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6446" TEXT="testnode 7 6 6446" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6447" TEXT="testnode 7 7 6447" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6448" TEXT="testnode 6 6 6448" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6449" TEXT="testnode 7 1 6449" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6450" TEXT="testnode 7 2 6450" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6451" TEXT="testnode 7 3 6451" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6452" TEXT="testnode 7 4 6452" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6453" TEXT="testnode 7 5 6453" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6454" TEXT="testnode 7 6 6454" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6455" TEXT="testnode 7 7 6455" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6456" TEXT="testnode 6 7 6456" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6457" TEXT="testnode 7 1 6457" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6458" TEXT="testnode 7 2 6458" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6459" TEXT="testnode 7 3 6459" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6460" TEXT="testnode 7 4 6460" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6461" TEXT="testnode 7 5 6461" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6462" TEXT="testnode 7 6 6462" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6463" TEXT="testnode 7 7 6463" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6464" TEXT="testnode 5 2 6464" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6465" TEXT="testnode 6 1 6465" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6466" TEXT="testnode 7 1 6466" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6467" TEXT="testnode 7 2 6467" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6468" TEXT="testnode 7 3 6468" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6469" TEXT="testnode 7 4 6469" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6470" TEXT="testnode 7 5 6470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6471" TEXT="testnode 7 6 6471" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6472" TEXT="testnode 7 7 6472" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6473" TEXT="testnode 6 2 6473" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6474" TEXT="testnode 7 1 6474" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6475" TEXT="testnode 7 2 6475" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6476" TEXT="testnode 7 3 6476" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6477" TEXT="testnode 7 4 6477" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6478" TEXT="testnode 7 5 6478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6479" TEXT="testnode 7 6 6479" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6480" TEXT="testnode 7 7 6480" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6481" TEXT="testnode 6 3 6481" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6482" TEXT="testnode 7 1 6482" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6483" TEXT="testnode 7 2 6483" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6484" TEXT="testnode 7 3 6484" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6485" TEXT="testnode 7 4 6485" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6486" TEXT="testnode 7 5 6486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6487" TEXT="testnode 7 6 6487" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6488" TEXT="testnode 7 7 6488" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6489" TEXT="testnode 6 4 6489" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6490" TEXT="testnode 7 1 6490" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6491" TEXT="testnode 7 2 6491" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6492" TEXT="testnode 7 3 6492" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6493" TEXT="testnode 7 4 6493" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6494" TEXT="testnode 7 5 6494" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6495" TEXT="testnode 7 6 6495" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6496" TEXT="testnode 7 7 6496" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6497" TEXT="testnode 6 5 6497" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6498" TEXT="testnode 7 1 6498" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6499" TEXT="testnode 7 2 6499" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6500" TEXT="testnode 7 3 6500" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6501" TEXT="testnode 7 4 6501" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6502" TEXT="testnode 7 5 6502" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6503" TEXT="testnode 7 6 6503" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6504" TEXT="testnode 7 7 6504" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6505" TEXT="testnode 6 6 6505" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6506" TEXT="testnode 7 1 6506" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6507" TEXT="testnode 7 2 6507" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6508" TEXT="testnode 7 3 6508" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6509" TEXT="testnode 7 4 6509" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6510" TEXT="testnode 7 5 6510" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6511" TEXT="testnode 7 6 6511" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6512" TEXT="testnode 7 7 6512" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6513" TEXT="testnode 6 7 6513" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6514" TEXT="testnode 7 1 6514" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6515" TEXT="testnode 7 2 6515" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6516" TEXT="testnode 7 3 6516" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6517" TEXT="testnode 7 4 6517" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6518" TEXT="testnode 7 5 6518" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6519" TEXT="testnode 7 6 6519" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6520" TEXT="testnode 7 7 6520" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6521" TEXT="testnode 5 3 6521" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6522" TEXT="testnode 6 1 6522" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6523" TEXT="testnode 7 1 6523" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6524" TEXT="testnode 7 2 6524" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6525" TEXT="testnode 7 3 6525" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6526" TEXT="testnode 7 4 6526" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6527" TEXT="testnode 7 5 6527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6528" TEXT="testnode 7 6 6528" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6529" TEXT="testnode 7 7 6529" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6530" TEXT="testnode 6 2 6530" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6531" TEXT="testnode 7 1 6531" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6532" TEXT="testnode 7 2 6532" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6533" TEXT="testnode 7 3 6533" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6534" TEXT="testnode 7 4 6534" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6535" TEXT="testnode 7 5 6535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6536" TEXT="testnode 7 6 6536" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6537" TEXT="testnode 7 7 6537" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6538" TEXT="testnode 6 3 6538" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6539" TEXT="testnode 7 1 6539" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6540" TEXT="testnode 7 2 6540" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6541" TEXT="testnode 7 3 6541" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6542" TEXT="testnode 7 4 6542" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6543" TEXT="testnode 7 5 6543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6544" TEXT="testnode 7 6 6544" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6545" TEXT="testnode 7 7 6545" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6546" TEXT="testnode 6 4 6546" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6547" TEXT="testnode 7 1 6547" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6548" TEXT="testnode 7 2 6548" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6549" TEXT="testnode 7 3 6549" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6550" TEXT="testnode 7 4 6550" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6551" TEXT="testnode 7 5 6551" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6552" TEXT="testnode 7 6 6552" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6553" TEXT="testnode 7 7 6553" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6554" TEXT="testnode 6 5 6554" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6555" TEXT="testnode 7 1 6555" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6556" TEXT="testnode 7 2 6556" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6557" TEXT="testnode 7 3 6557" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6558" TEXT="testnode 7 4 6558" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6559" TEXT="testnode 7 5 6559" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6560" TEXT="testnode 7 6 6560" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6561" TEXT="testnode 7 7 6561" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6562" TEXT="testnode 6 6 6562" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6563" TEXT="testnode 7 1 6563" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6564" TEXT="testnode 7 2 6564" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6565" TEXT="testnode 7 3 6565" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6566" TEXT="testnode 7 4 6566" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6567" TEXT="testnode 7 5 6567" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6568" TEXT="testnode 7 6 6568" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6569" TEXT="testnode 7 7 6569" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6570" TEXT="testnode 6 7 6570" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6571" TEXT="testnode 7 1 6571" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6572" TEXT="testnode 7 2 6572" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6573" TEXT="testnode 7 3 6573" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6574" TEXT="testnode 7 4 6574" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6575" TEXT="testnode 7 5 6575" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6576" TEXT="testnode 7 6 6576" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6577" TEXT="testnode 7 7 6577" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6578" TEXT="testnode 5 4 6578" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6579" TEXT="testnode 6 1 6579" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6580" TEXT="testnode 7 1 6580" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6581" TEXT="testnode 7 2 6581" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6582" TEXT="testnode 7 3 6582" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6583" TEXT="testnode 7 4 6583" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6584" TEXT="testnode 7 5 6584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6585" TEXT="testnode 7 6 6585" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6586" TEXT="testnode 7 7 6586" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6587" TEXT="testnode 6 2 6587" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6588" TEXT="testnode 7 1 6588" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6589" TEXT="testnode 7 2 6589" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6590" TEXT="testnode 7 3 6590" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6591" TEXT="testnode 7 4 6591" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6592" TEXT="testnode 7 5 6592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6593" TEXT="testnode 7 6 6593" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6594" TEXT="testnode 7 7 6594" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6595" TEXT="testnode 6 3 6595" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6596" TEXT="testnode 7 1 6596" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6597" TEXT="testnode 7 2 6597" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6598" TEXT="testnode 7 3 6598" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6599" TEXT="testnode 7 4 6599" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6600" TEXT="testnode 7 5 6600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6601" TEXT="testnode 7 6 6601" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6602" TEXT="testnode 7 7 6602" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6603" TEXT="testnode 6 4 6603" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6604" TEXT="testnode 7 1 6604" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6605" TEXT="testnode 7 2 6605" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6606" TEXT="testnode 7 3 6606" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6607" TEXT="testnode 7 4 6607" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6608" TEXT="testnode 7 5 6608" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6609" TEXT="testnode 7 6 6609" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6610" TEXT="testnode 7 7 6610" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6611" TEXT="testnode 6 5 6611" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6612" TEXT="testnode 7 1 6612" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6613" TEXT="testnode 7 2 6613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6614" TEXT="testnode 7 3 6614" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6615" TEXT="testnode 7 4 6615" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6616" TEXT="testnode 7 5 6616" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6617" TEXT="testnode 7 6 6617" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6618" TEXT="testnode 7 7 6618" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6619" TEXT="testnode 6 6 6619" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6620" TEXT="testnode 7 1 6620" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6621" TEXT="testnode 7 2 6621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6622" TEXT="testnode 7 3 6622" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6623" TEXT="testnode 7 4 6623" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6624" TEXT="testnode 7 5 6624" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6625" TEXT="testnode 7 6 6625" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6626" TEXT="testnode 7 7 6626" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6627" TEXT="testnode 6 7 6627" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6628" TEXT="testnode 7 1 6628" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6629" TEXT="testnode 7 2 6629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6630" TEXT="testnode 7 3 6630" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6631" TEXT="testnode 7 4 6631" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6632" TEXT="testnode 7 5 6632" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6633" TEXT="testnode 7 6 6633" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6634" TEXT="testnode 7 7 6634" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6635" TEXT="testnode 5 5 6635" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6636" TEXT="testnode 6 1 6636" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6637" TEXT="testnode 7 1 6637" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6638" TEXT="testnode 7 2 6638" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6639" TEXT="testnode 7 3 6639" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6640" TEXT="testnode 7 4 6640" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6641" TEXT="testnode 7 5 6641" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6642" TEXT="testnode 7 6 6642" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6643" TEXT="testnode 7 7 6643" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6644" TEXT="testnode 6 2 6644" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6645" TEXT="testnode 7 1 6645" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6646" TEXT="testnode 7 2 6646" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6647" TEXT="testnode 7 3 6647" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6648" TEXT="testnode 7 4 6648" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6649" TEXT="testnode 7 5 6649" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6650" TEXT="testnode 7 6 6650" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6651" TEXT="testnode 7 7 6651" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6652" TEXT="testnode 6 3 6652" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6653" TEXT="testnode 7 1 6653" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6654" TEXT="testnode 7 2 6654" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6655" TEXT="testnode 7 3 6655" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6656" TEXT="testnode 7 4 6656" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6657" TEXT="testnode 7 5 6657" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6658" TEXT="testnode 7 6 6658" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6659" TEXT="testnode 7 7 6659" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6660" TEXT="testnode 6 4 6660" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6661" TEXT="testnode 7 1 6661" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6662" TEXT="testnode 7 2 6662" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6663" TEXT="testnode 7 3 6663" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6664" TEXT="testnode 7 4 6664" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6665" TEXT="testnode 7 5 6665" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6666" TEXT="testnode 7 6 6666" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6667" TEXT="testnode 7 7 6667" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6668" TEXT="testnode 6 5 6668" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6669" TEXT="testnode 7 1 6669" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6670" TEXT="testnode 7 2 6670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6671" TEXT="testnode 7 3 6671" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6672" TEXT="testnode 7 4 6672" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6673" TEXT="testnode 7 5 6673" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6674" TEXT="testnode 7 6 6674" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6675" TEXT="testnode 7 7 6675" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6676" TEXT="testnode 6 6 6676" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6677" TEXT="testnode 7 1 6677" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6678" TEXT="testnode 7 2 6678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6679" TEXT="testnode 7 3 6679" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6680" TEXT="testnode 7 4 6680" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6681" TEXT="testnode 7 5 6681" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6682" TEXT="testnode 7 6 6682" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6683" TEXT="testnode 7 7 6683" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6684" TEXT="testnode 6 7 6684" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6685" TEXT="testnode 7 1 6685" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6686" TEXT="testnode 7 2 6686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6687" TEXT="testnode 7 3 6687" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6688" TEXT="testnode 7 4 6688" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6689" TEXT="testnode 7 5 6689" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6690" TEXT="testnode 7 6 6690" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6691" TEXT="testnode 7 7 6691" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6692" TEXT="testnode 5 6 6692" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6693" TEXT="testnode 6 1 6693" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6694" TEXT="testnode 7 1 6694" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6695" TEXT="testnode 7 2 6695" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6696" TEXT="testnode 7 3 6696" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6697" TEXT="testnode 7 4 6697" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6698" TEXT="testnode 7 5 6698" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6699" TEXT="testnode 7 6 6699" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6700" TEXT="testnode 7 7 6700" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6701" TEXT="testnode 6 2 6701" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6702" TEXT="testnode 7 1 6702" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6703" TEXT="testnode 7 2 6703" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6704" TEXT="testnode 7 3 6704" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6705" TEXT="testnode 7 4 6705" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6706" TEXT="testnode 7 5 6706" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6707" TEXT="testnode 7 6 6707" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6708" TEXT="testnode 7 7 6708" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6709" TEXT="testnode 6 3 6709" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6710" TEXT="testnode 7 1 6710" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6711" TEXT="testnode 7 2 6711" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6712" TEXT="testnode 7 3 6712" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6713" TEXT="testnode 7 4 6713" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6714" TEXT="testnode 7 5 6714" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6715" TEXT="testnode 7 6 6715" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6716" TEXT="testnode 7 7 6716" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6717" TEXT="testnode 6 4 6717" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6718" TEXT="testnode 7 1 6718" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6719" TEXT="testnode 7 2 6719" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6720" TEXT="testnode 7 3 6720" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6721" TEXT="testnode 7 4 6721" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6722" TEXT="testnode 7 5 6722" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6723" TEXT="testnode 7 6 6723" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6724" TEXT="testnode 7 7 6724" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6725" TEXT="testnode 6 5 6725" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6726" TEXT="testnode 7 1 6726" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6727" TEXT="testnode 7 2 6727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6728" TEXT="testnode 7 3 6728" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6729" TEXT="testnode 7 4 6729" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6730" TEXT="testnode 7 5 6730" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6731" TEXT="testnode 7 6 6731" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6732" TEXT="testnode 7 7 6732" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6733" TEXT="testnode 6 6 6733" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6734" TEXT="testnode 7 1 6734" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6735" TEXT="testnode 7 2 6735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6736" TEXT="testnode 7 3 6736" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6737" TEXT="testnode 7 4 6737" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6738" TEXT="testnode 7 5 6738" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6739" TEXT="testnode 7 6 6739" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6740" TEXT="testnode 7 7 6740" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6741" TEXT="testnode 6 7 6741" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6742" TEXT="testnode 7 1 6742" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6743" TEXT="testnode 7 2 6743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6744" TEXT="testnode 7 3 6744" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6745" TEXT="testnode 7 4 6745" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6746" TEXT="testnode 7 5 6746" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6747" TEXT="testnode 7 6 6747" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6748" TEXT="testnode 7 7 6748" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6749" TEXT="testnode 5 7 6749" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6750" TEXT="testnode 6 1 6750" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6751" TEXT="testnode 7 1 6751" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6752" TEXT="testnode 7 2 6752" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6753" TEXT="testnode 7 3 6753" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6754" TEXT="testnode 7 4 6754" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6755" TEXT="testnode 7 5 6755" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6756" TEXT="testnode 7 6 6756" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6757" TEXT="testnode 7 7 6757" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6758" TEXT="testnode 6 2 6758" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6759" TEXT="testnode 7 1 6759" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6760" TEXT="testnode 7 2 6760" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6761" TEXT="testnode 7 3 6761" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6762" TEXT="testnode 7 4 6762" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6763" TEXT="testnode 7 5 6763" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6764" TEXT="testnode 7 6 6764" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6765" TEXT="testnode 7 7 6765" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6766" TEXT="testnode 6 3 6766" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6767" TEXT="testnode 7 1 6767" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6768" TEXT="testnode 7 2 6768" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6769" TEXT="testnode 7 3 6769" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6770" TEXT="testnode 7 4 6770" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6771" TEXT="testnode 7 5 6771" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6772" TEXT="testnode 7 6 6772" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6773" TEXT="testnode 7 7 6773" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6774" TEXT="testnode 6 4 6774" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6775" TEXT="testnode 7 1 6775" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6776" TEXT="testnode 7 2 6776" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6777" TEXT="testnode 7 3 6777" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6778" TEXT="testnode 7 4 6778" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6779" TEXT="testnode 7 5 6779" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6780" TEXT="testnode 7 6 6780" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6781" TEXT="testnode 7 7 6781" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6782" TEXT="testnode 6 5 6782" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6783" TEXT="testnode 7 1 6783" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6784" TEXT="testnode 7 2 6784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6785" TEXT="testnode 7 3 6785" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6786" TEXT="testnode 7 4 6786" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6787" TEXT="testnode 7 5 6787" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6788" TEXT="testnode 7 6 6788" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6789" TEXT="testnode 7 7 6789" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6790" TEXT="testnode 6 6 6790" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6791" TEXT="testnode 7 1 6791" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6792" TEXT="testnode 7 2 6792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6793" TEXT="testnode 7 3 6793" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6794" TEXT="testnode 7 4 6794" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6795" TEXT="testnode 7 5 6795" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6796" TEXT="testnode 7 6 6796" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6797" TEXT="testnode 7 7 6797" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6798" TEXT="testnode 6 7 6798" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6799" TEXT="testnode 7 1 6799" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6800" TEXT="testnode 7 2 6800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6801" TEXT="testnode 7 3 6801" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6802" TEXT="testnode 7 4 6802" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6803" TEXT="testnode 7 5 6803" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6804" TEXT="testnode 7 6 6804" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6805" TEXT="testnode 7 7 6805" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6806" TEXT="testnode 4 4 6806" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_6807" TEXT="testnode 5 1 6807" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6808" TEXT="testnode 6 1 6808" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6809" TEXT="testnode 7 1 6809" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6810" TEXT="testnode 7 2 6810" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6811" TEXT="testnode 7 3 6811" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6812" TEXT="testnode 7 4 6812" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6813" TEXT="testnode 7 5 6813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6814" TEXT="testnode 7 6 6814" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6815" TEXT="testnode 7 7 6815" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6816" TEXT="testnode 6 2 6816" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6817" TEXT="testnode 7 1 6817" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6818" TEXT="testnode 7 2 6818" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6819" TEXT="testnode 7 3 6819" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6820" TEXT="testnode 7 4 6820" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6821" TEXT="testnode 7 5 6821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6822" TEXT="testnode 7 6 6822" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6823" TEXT="testnode 7 7 6823" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6824" TEXT="testnode 6 3 6824" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6825" TEXT="testnode 7 1 6825" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6826" TEXT="testnode 7 2 6826" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6827" TEXT="testnode 7 3 6827" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6828" TEXT="testnode 7 4 6828" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6829" TEXT="testnode 7 5 6829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6830" TEXT="testnode 7 6 6830" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6831" TEXT="testnode 7 7 6831" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6832" TEXT="testnode 6 4 6832" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6833" TEXT="testnode 7 1 6833" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6834" TEXT="testnode 7 2 6834" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6835" TEXT="testnode 7 3 6835" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6836" TEXT="testnode 7 4 6836" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6837" TEXT="testnode 7 5 6837" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6838" TEXT="testnode 7 6 6838" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6839" TEXT="testnode 7 7 6839" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6840" TEXT="testnode 6 5 6840" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6841" TEXT="testnode 7 1 6841" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6842" TEXT="testnode 7 2 6842" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6843" TEXT="testnode 7 3 6843" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6844" TEXT="testnode 7 4 6844" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6845" TEXT="testnode 7 5 6845" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6846" TEXT="testnode 7 6 6846" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6847" TEXT="testnode 7 7 6847" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6848" TEXT="testnode 6 6 6848" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6849" TEXT="testnode 7 1 6849" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6850" TEXT="testnode 7 2 6850" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6851" TEXT="testnode 7 3 6851" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6852" TEXT="testnode 7 4 6852" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6853" TEXT="testnode 7 5 6853" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6854" TEXT="testnode 7 6 6854" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6855" TEXT="testnode 7 7 6855" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6856" TEXT="testnode 6 7 6856" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6857" TEXT="testnode 7 1 6857" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6858" TEXT="testnode 7 2 6858" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6859" TEXT="testnode 7 3 6859" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6860" TEXT="testnode 7 4 6860" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6861" TEXT="testnode 7 5 6861" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6862" TEXT="testnode 7 6 6862" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6863" TEXT="testnode 7 7 6863" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6864" TEXT="testnode 5 2 6864" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6865" TEXT="testnode 6 1 6865" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6866" TEXT="testnode 7 1 6866" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6867" TEXT="testnode 7 2 6867" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6868" TEXT="testnode 7 3 6868" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6869" TEXT="testnode 7 4 6869" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6870" TEXT="testnode 7 5 6870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6871" TEXT="testnode 7 6 6871" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6872" TEXT="testnode 7 7 6872" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6873" TEXT="testnode 6 2 6873" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6874" TEXT="testnode 7 1 6874" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6875" TEXT="testnode 7 2 6875" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6876" TEXT="testnode 7 3 6876" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6877" TEXT="testnode 7 4 6877" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6878" TEXT="testnode 7 5 6878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6879" TEXT="testnode 7 6 6879" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6880" TEXT="testnode 7 7 6880" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6881" TEXT="testnode 6 3 6881" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6882" TEXT="testnode 7 1 6882" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6883" TEXT="testnode 7 2 6883" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6884" TEXT="testnode 7 3 6884" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6885" TEXT="testnode 7 4 6885" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6886" TEXT="testnode 7 5 6886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6887" TEXT="testnode 7 6 6887" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6888" TEXT="testnode 7 7 6888" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6889" TEXT="testnode 6 4 6889" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6890" TEXT="testnode 7 1 6890" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6891" TEXT="testnode 7 2 6891" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6892" TEXT="testnode 7 3 6892" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6893" TEXT="testnode 7 4 6893" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6894" TEXT="testnode 7 5 6894" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6895" TEXT="testnode 7 6 6895" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6896" TEXT="testnode 7 7 6896" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6897" TEXT="testnode 6 5 6897" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6898" TEXT="testnode 7 1 6898" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6899" TEXT="testnode 7 2 6899" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6900" TEXT="testnode 7 3 6900" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6901" TEXT="testnode 7 4 6901" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6902" TEXT="testnode 7 5 6902" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6903" TEXT="testnode 7 6 6903" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6904" TEXT="testnode 7 7 6904" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6905" TEXT="testnode 6 6 6905" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6906" TEXT="testnode 7 1 6906" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6907" TEXT="testnode 7 2 6907" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6908" TEXT="testnode 7 3 6908" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6909" TEXT="testnode 7 4 6909" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6910" TEXT="testnode 7 5 6910" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6911" TEXT="testnode 7 6 6911" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6912" TEXT="testnode 7 7 6912" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6913" TEXT="testnode 6 7 6913" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6914" TEXT="testnode 7 1 6914" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6915" TEXT="testnode 7 2 6915" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6916" TEXT="testnode 7 3 6916" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6917" TEXT="testnode 7 4 6917" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6918" TEXT="testnode 7 5 6918" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6919" TEXT="testnode 7 6 6919" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6920" TEXT="testnode 7 7 6920" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6921" TEXT="testnode 5 3 6921" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6922" TEXT="testnode 6 1 6922" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6923" TEXT="testnode 7 1 6923" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6924" TEXT="testnode 7 2 6924" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6925" TEXT="testnode 7 3 6925" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6926" TEXT="testnode 7 4 6926" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6927" TEXT="testnode 7 5 6927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6928" TEXT="testnode 7 6 6928" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6929" TEXT="testnode 7 7 6929" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6930" TEXT="testnode 6 2 6930" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6931" TEXT="testnode 7 1 6931" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6932" TEXT="testnode 7 2 6932" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6933" TEXT="testnode 7 3 6933" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6934" TEXT="testnode 7 4 6934" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6935" TEXT="testnode 7 5 6935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6936" TEXT="testnode 7 6 6936" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6937" TEXT="testnode 7 7 6937" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6938" TEXT="testnode 6 3 6938" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6939" TEXT="testnode 7 1 6939" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6940" TEXT="testnode 7 2 6940" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6941" TEXT="testnode 7 3 6941" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6942" TEXT="testnode 7 4 6942" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6943" TEXT="testnode 7 5 6943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6944" TEXT="testnode 7 6 6944" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6945" TEXT="testnode 7 7 6945" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6946" TEXT="testnode 6 4 6946" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6947" TEXT="testnode 7 1 6947" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6948" TEXT="testnode 7 2 6948" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6949" TEXT="testnode 7 3 6949" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6950" TEXT="testnode 7 4 6950" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6951" TEXT="testnode 7 5 6951" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6952" TEXT="testnode 7 6 6952" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6953" TEXT="testnode 7 7 6953" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6954" TEXT="testnode 6 5 6954" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6955" TEXT="testnode 7 1 6955" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6956" TEXT="testnode 7 2 6956" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6957" TEXT="testnode 7 3 6957" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6958" TEXT="testnode 7 4 6958" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6959" TEXT="testnode 7 5 6959" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6960" TEXT="testnode 7 6 6960" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6961" TEXT="testnode 7 7 6961" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6962" TEXT="testnode 6 6 6962" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6963" TEXT="testnode 7 1 6963" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6964" TEXT="testnode 7 2 6964" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6965" TEXT="testnode 7 3 6965" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6966" TEXT="testnode 7 4 6966" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6967" TEXT="testnode 7 5 6967" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6968" TEXT="testnode 7 6 6968" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6969" TEXT="testnode 7 7 6969" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6970" TEXT="testnode 6 7 6970" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6971" TEXT="testnode 7 1 6971" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6972" TEXT="testnode 7 2 6972" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6973" TEXT="testnode 7 3 6973" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6974" TEXT="testnode 7 4 6974" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6975" TEXT="testnode 7 5 6975" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6976" TEXT="testnode 7 6 6976" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6977" TEXT="testnode 7 7 6977" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_6978" TEXT="testnode 5 4 6978" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_6979" TEXT="testnode 6 1 6979" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6980" TEXT="testnode 7 1 6980" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6981" TEXT="testnode 7 2 6981" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6982" TEXT="testnode 7 3 6982" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6983" TEXT="testnode 7 4 6983" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6984" TEXT="testnode 7 5 6984" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6985" TEXT="testnode 7 6 6985" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6986" TEXT="testnode 7 7 6986" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6987" TEXT="testnode 6 2 6987" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6988" TEXT="testnode 7 1 6988" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6989" TEXT="testnode 7 2 6989" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6990" TEXT="testnode 7 3 6990" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6991" TEXT="testnode 7 4 6991" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6992" TEXT="testnode 7 5 6992" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6993" TEXT="testnode 7 6 6993" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6994" TEXT="testnode 7 7 6994" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_6995" TEXT="testnode 6 3 6995" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_6996" TEXT="testnode 7 1 6996" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6997" TEXT="testnode 7 2 6997" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6998" TEXT="testnode 7 3 6998" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_6999" TEXT="testnode 7 4 6999" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7000" TEXT="testnode 7 5 7000" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7001" TEXT="testnode 7 6 7001" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7002" TEXT="testnode 7 7 7002" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7003" TEXT="testnode 6 4 7003" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7004" TEXT="testnode 7 1 7004" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7005" TEXT="testnode 7 2 7005" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7006" TEXT="testnode 7 3 7006" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7007" TEXT="testnode 7 4 7007" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7008" TEXT="testnode 7 5 7008" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7009" TEXT="testnode 7 6 7009" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7010" TEXT="testnode 7 7 7010" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7011" TEXT="testnode 6 5 7011" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7012" TEXT="testnode 7 1 7012" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7013" TEXT="testnode 7 2 7013" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7014" TEXT="testnode 7 3 7014" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7015" TEXT="testnode 7 4 7015" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7016" TEXT="testnode 7 5 7016" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7017" TEXT="testnode 7 6 7017" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7018" TEXT="testnode 7 7 7018" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7019" TEXT="testnode 6 6 7019" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7020" TEXT="testnode 7 1 7020" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7021" TEXT="testnode 7 2 7021" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7022" TEXT="testnode 7 3 7022" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7023" TEXT="testnode 7 4 7023" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7024" TEXT="testnode 7 5 7024" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7025" TEXT="testnode 7 6 7025" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7026" TEXT="testnode 7 7 7026" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7027" TEXT="testnode 6 7 7027" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7028" TEXT="testnode 7 1 7028" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7029" TEXT="testnode 7 2 7029" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7030" TEXT="testnode 7 3 7030" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7031" TEXT="testnode 7 4 7031" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7032" TEXT="testnode 7 5 7032" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7033" TEXT="testnode 7 6 7033" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7034" TEXT="testnode 7 7 7034" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7035" TEXT="testnode 5 5 7035" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7036" TEXT="testnode 6 1 7036" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7037" TEXT="testnode 7 1 7037" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7038" TEXT="testnode 7 2 7038" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7039" TEXT="testnode 7 3 7039" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7040" TEXT="testnode 7 4 7040" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7041" TEXT="testnode 7 5 7041" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7042" TEXT="testnode 7 6 7042" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7043" TEXT="testnode 7 7 7043" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7044" TEXT="testnode 6 2 7044" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7045" TEXT="testnode 7 1 7045" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7046" TEXT="testnode 7 2 7046" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7047" TEXT="testnode 7 3 7047" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7048" TEXT="testnode 7 4 7048" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7049" TEXT="testnode 7 5 7049" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7050" TEXT="testnode 7 6 7050" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7051" TEXT="testnode 7 7 7051" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7052" TEXT="testnode 6 3 7052" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7053" TEXT="testnode 7 1 7053" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7054" TEXT="testnode 7 2 7054" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7055" TEXT="testnode 7 3 7055" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7056" TEXT="testnode 7 4 7056" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7057" TEXT="testnode 7 5 7057" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7058" TEXT="testnode 7 6 7058" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7059" TEXT="testnode 7 7 7059" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7060" TEXT="testnode 6 4 7060" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7061" TEXT="testnode 7 1 7061" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7062" TEXT="testnode 7 2 7062" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7063" TEXT="testnode 7 3 7063" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7064" TEXT="testnode 7 4 7064" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7065" TEXT="testnode 7 5 7065" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7066" TEXT="testnode 7 6 7066" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7067" TEXT="testnode 7 7 7067" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7068" TEXT="testnode 6 5 7068" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7069" TEXT="testnode 7 1 7069" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7070" TEXT="testnode 7 2 7070" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7071" TEXT="testnode 7 3 7071" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7072" TEXT="testnode 7 4 7072" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7073" TEXT="testnode 7 5 7073" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7074" TEXT="testnode 7 6 7074" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7075" TEXT="testnode 7 7 7075" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7076" TEXT="testnode 6 6 7076" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7077" TEXT="testnode 7 1 7077" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7078" TEXT="testnode 7 2 7078" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7079" TEXT="testnode 7 3 7079" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7080" TEXT="testnode 7 4 7080" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7081" TEXT="testnode 7 5 7081" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7082" TEXT="testnode 7 6 7082" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7083" TEXT="testnode 7 7 7083" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7084" TEXT="testnode 6 7 7084" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7085" TEXT="testnode 7 1 7085" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7086" TEXT="testnode 7 2 7086" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7087" TEXT="testnode 7 3 7087" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7088" TEXT="testnode 7 4 7088" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7089" TEXT="testnode 7 5 7089" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7090" TEXT="testnode 7 6 7090" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7091" TEXT="testnode 7 7 7091" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7092" TEXT="testnode 5 6 7092" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7093" TEXT="testnode 6 1 7093" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7094" TEXT="testnode 7 1 7094" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7095" TEXT="testnode 7 2 7095" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7096" TEXT="testnode 7 3 7096" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7097" TEXT="testnode 7 4 7097" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7098" TEXT="testnode 7 5 7098" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7099" TEXT="testnode 7 6 7099" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7100" TEXT="testnode 7 7 7100" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7101" TEXT="testnode 6 2 7101" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7102" TEXT="testnode 7 1 7102" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7103" TEXT="testnode 7 2 7103" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7104" TEXT="testnode 7 3 7104" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7105" TEXT="testnode 7 4 7105" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7106" TEXT="testnode 7 5 7106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7107" TEXT="testnode 7 6 7107" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7108" TEXT="testnode 7 7 7108" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7109" TEXT="testnode 6 3 7109" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7110" TEXT="testnode 7 1 7110" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7111" TEXT="testnode 7 2 7111" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7112" TEXT="testnode 7 3 7112" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7113" TEXT="testnode 7 4 7113" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7114" TEXT="testnode 7 5 7114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7115" TEXT="testnode 7 6 7115" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7116" TEXT="testnode 7 7 7116" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7117" TEXT="testnode 6 4 7117" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7118" TEXT="testnode 7 1 7118" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7119" TEXT="testnode 7 2 7119" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7120" TEXT="testnode 7 3 7120" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7121" TEXT="testnode 7 4 7121" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7122" TEXT="testnode 7 5 7122" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7123" TEXT="testnode 7 6 7123" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7124" TEXT="testnode 7 7 7124" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7125" TEXT="testnode 6 5 7125" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7126" TEXT="testnode 7 1 7126" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7127" TEXT="testnode 7 2 7127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7128" TEXT="testnode 7 3 7128" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7129" TEXT="testnode 7 4 7129" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7130" TEXT="testnode 7 5 7130" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7131" TEXT="testnode 7 6 7131" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7132" TEXT="testnode 7 7 7132" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7133" TEXT="testnode 6 6 7133" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7134" TEXT="testnode 7 1 7134" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7135" TEXT="testnode 7 2 7135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7136" TEXT="testnode 7 3 7136" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7137" TEXT="testnode 7 4 7137" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7138" TEXT="testnode 7 5 7138" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7139" TEXT="testnode 7 6 7139" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7140" TEXT="testnode 7 7 7140" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7141" TEXT="testnode 6 7 7141" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7142" TEXT="testnode 7 1 7142" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7143" TEXT="testnode 7 2 7143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7144" TEXT="testnode 7 3 7144" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7145" TEXT="testnode 7 4 7145" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7146" TEXT="testnode 7 5 7146" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7147" TEXT="testnode 7 6 7147" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7148" TEXT="testnode 7 7 7148" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7149" TEXT="testnode 5 7 7149" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7150" TEXT="testnode 6 1 7150" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7151" TEXT="testnode 7 1 7151" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7152" TEXT="testnode 7 2 7152" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7153" TEXT="testnode 7 3 7153" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7154" TEXT="testnode 7 4 7154" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7155" TEXT="testnode 7 5 7155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7156" TEXT="testnode 7 6 7156" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7157" TEXT="testnode 7 7 7157" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7158" TEXT="testnode 6 2 7158" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7159" TEXT="testnode 7 1 7159" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7160" TEXT="testnode 7 2 7160" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7161" TEXT="testnode 7 3 7161" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7162" TEXT="testnode 7 4 7162" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7163" TEXT="testnode 7 5 7163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7164" TEXT="testnode 7 6 7164" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7165" TEXT="testnode 7 7 7165" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7166" TEXT="testnode 6 3 7166" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7167" TEXT="testnode 7 1 7167" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7168" TEXT="testnode 7 2 7168" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7169" TEXT="testnode 7 3 7169" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7170" TEXT="testnode 7 4 7170" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7171" TEXT="testnode 7 5 7171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7172" TEXT="testnode 7 6 7172" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7173" TEXT="testnode 7 7 7173" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7174" TEXT="testnode 6 4 7174" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7175" TEXT="testnode 7 1 7175" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7176" TEXT="testnode 7 2 7176" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7177" TEXT="testnode 7 3 7177" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7178" TEXT="testnode 7 4 7178" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7179" TEXT="testnode 7 5 7179" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7180" TEXT="testnode 7 6 7180" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7181" TEXT="testnode 7 7 7181" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7182" TEXT="testnode 6 5 7182" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7183" TEXT="testnode 7 1 7183" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7184" TEXT="testnode 7 2 7184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7185" TEXT="testnode 7 3 7185" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7186" TEXT="testnode 7 4 7186" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7187" TEXT="testnode 7 5 7187" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7188" TEXT="testnode 7 6 7188" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7189" TEXT="testnode 7 7 7189" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7190" TEXT="testnode 6 6 7190" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7191" TEXT="testnode 7 1 7191" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7192" TEXT="testnode 7 2 7192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7193" TEXT="testnode 7 3 7193" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7194" TEXT="testnode 7 4 7194" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7195" TEXT="testnode 7 5 7195" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7196" TEXT="testnode 7 6 7196" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7197" TEXT="testnode 7 7 7197" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7198" TEXT="testnode 6 7 7198" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7199" TEXT="testnode 7 1 7199" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7200" TEXT="testnode 7 2 7200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7201" TEXT="testnode 7 3 7201" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7202" TEXT="testnode 7 4 7202" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7203" TEXT="testnode 7 5 7203" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7204" TEXT="testnode 7 6 7204" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7205" TEXT="testnode 7 7 7205" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7206" TEXT="testnode 4 5 7206" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_7207" TEXT="testnode 5 1 7207" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7208" TEXT="testnode 6 1 7208" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7209" TEXT="testnode 7 1 7209" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7210" TEXT="testnode 7 2 7210" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7211" TEXT="testnode 7 3 7211" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7212" TEXT="testnode 7 4 7212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7213" TEXT="testnode 7 5 7213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7214" TEXT="testnode 7 6 7214" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7215" TEXT="testnode 7 7 7215" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7216" TEXT="testnode 6 2 7216" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7217" TEXT="testnode 7 1 7217" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7218" TEXT="testnode 7 2 7218" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7219" TEXT="testnode 7 3 7219" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7220" TEXT="testnode 7 4 7220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7221" TEXT="testnode 7 5 7221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7222" TEXT="testnode 7 6 7222" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7223" TEXT="testnode 7 7 7223" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7224" TEXT="testnode 6 3 7224" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7225" TEXT="testnode 7 1 7225" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7226" TEXT="testnode 7 2 7226" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7227" TEXT="testnode 7 3 7227" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7228" TEXT="testnode 7 4 7228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7229" TEXT="testnode 7 5 7229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7230" TEXT="testnode 7 6 7230" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7231" TEXT="testnode 7 7 7231" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7232" TEXT="testnode 6 4 7232" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7233" TEXT="testnode 7 1 7233" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7234" TEXT="testnode 7 2 7234" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7235" TEXT="testnode 7 3 7235" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7236" TEXT="testnode 7 4 7236" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7237" TEXT="testnode 7 5 7237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7238" TEXT="testnode 7 6 7238" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7239" TEXT="testnode 7 7 7239" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7240" TEXT="testnode 6 5 7240" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7241" TEXT="testnode 7 1 7241" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7242" TEXT="testnode 7 2 7242" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7243" TEXT="testnode 7 3 7243" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7244" TEXT="testnode 7 4 7244" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7245" TEXT="testnode 7 5 7245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7246" TEXT="testnode 7 6 7246" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7247" TEXT="testnode 7 7 7247" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7248" TEXT="testnode 6 6 7248" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7249" TEXT="testnode 7 1 7249" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7250" TEXT="testnode 7 2 7250" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7251" TEXT="testnode 7 3 7251" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7252" TEXT="testnode 7 4 7252" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7253" TEXT="testnode 7 5 7253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7254" TEXT="testnode 7 6 7254" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7255" TEXT="testnode 7 7 7255" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7256" TEXT="testnode 6 7 7256" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7257" TEXT="testnode 7 1 7257" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7258" TEXT="testnode 7 2 7258" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7259" TEXT="testnode 7 3 7259" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7260" TEXT="testnode 7 4 7260" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7261" TEXT="testnode 7 5 7261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7262" TEXT="testnode 7 6 7262" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7263" TEXT="testnode 7 7 7263" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7264" TEXT="testnode 5 2 7264" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7265" TEXT="testnode 6 1 7265" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7266" TEXT="testnode 7 1 7266" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7267" TEXT="testnode 7 2 7267" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7268" TEXT="testnode 7 3 7268" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7269" TEXT="testnode 7 4 7269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7270" TEXT="testnode 7 5 7270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7271" TEXT="testnode 7 6 7271" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7272" TEXT="testnode 7 7 7272" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7273" TEXT="testnode 6 2 7273" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7274" TEXT="testnode 7 1 7274" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7275" TEXT="testnode 7 2 7275" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7276" TEXT="testnode 7 3 7276" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7277" TEXT="testnode 7 4 7277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7278" TEXT="testnode 7 5 7278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7279" TEXT="testnode 7 6 7279" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7280" TEXT="testnode 7 7 7280" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7281" TEXT="testnode 6 3 7281" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7282" TEXT="testnode 7 1 7282" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7283" TEXT="testnode 7 2 7283" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7284" TEXT="testnode 7 3 7284" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7285" TEXT="testnode 7 4 7285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7286" TEXT="testnode 7 5 7286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7287" TEXT="testnode 7 6 7287" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7288" TEXT="testnode 7 7 7288" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7289" TEXT="testnode 6 4 7289" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7290" TEXT="testnode 7 1 7290" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7291" TEXT="testnode 7 2 7291" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7292" TEXT="testnode 7 3 7292" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7293" TEXT="testnode 7 4 7293" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7294" TEXT="testnode 7 5 7294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7295" TEXT="testnode 7 6 7295" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7296" TEXT="testnode 7 7 7296" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7297" TEXT="testnode 6 5 7297" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7298" TEXT="testnode 7 1 7298" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7299" TEXT="testnode 7 2 7299" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7300" TEXT="testnode 7 3 7300" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7301" TEXT="testnode 7 4 7301" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7302" TEXT="testnode 7 5 7302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7303" TEXT="testnode 7 6 7303" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7304" TEXT="testnode 7 7 7304" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7305" TEXT="testnode 6 6 7305" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7306" TEXT="testnode 7 1 7306" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7307" TEXT="testnode 7 2 7307" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7308" TEXT="testnode 7 3 7308" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7309" TEXT="testnode 7 4 7309" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7310" TEXT="testnode 7 5 7310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7311" TEXT="testnode 7 6 7311" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7312" TEXT="testnode 7 7 7312" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7313" TEXT="testnode 6 7 7313" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7314" TEXT="testnode 7 1 7314" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7315" TEXT="testnode 7 2 7315" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7316" TEXT="testnode 7 3 7316" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7317" TEXT="testnode 7 4 7317" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7318" TEXT="testnode 7 5 7318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7319" TEXT="testnode 7 6 7319" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7320" TEXT="testnode 7 7 7320" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7321" TEXT="testnode 5 3 7321" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7322" TEXT="testnode 6 1 7322" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7323" TEXT="testnode 7 1 7323" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7324" TEXT="testnode 7 2 7324" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7325" TEXT="testnode 7 3 7325" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7326" TEXT="testnode 7 4 7326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7327" TEXT="testnode 7 5 7327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7328" TEXT="testnode 7 6 7328" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7329" TEXT="testnode 7 7 7329" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7330" TEXT="testnode 6 2 7330" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7331" TEXT="testnode 7 1 7331" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7332" TEXT="testnode 7 2 7332" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7333" TEXT="testnode 7 3 7333" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7334" TEXT="testnode 7 4 7334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7335" TEXT="testnode 7 5 7335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7336" TEXT="testnode 7 6 7336" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7337" TEXT="testnode 7 7 7337" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7338" TEXT="testnode 6 3 7338" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7339" TEXT="testnode 7 1 7339" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7340" TEXT="testnode 7 2 7340" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7341" TEXT="testnode 7 3 7341" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7342" TEXT="testnode 7 4 7342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7343" TEXT="testnode 7 5 7343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7344" TEXT="testnode 7 6 7344" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7345" TEXT="testnode 7 7 7345" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7346" TEXT="testnode 6 4 7346" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7347" TEXT="testnode 7 1 7347" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7348" TEXT="testnode 7 2 7348" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7349" TEXT="testnode 7 3 7349" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7350" TEXT="testnode 7 4 7350" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7351" TEXT="testnode 7 5 7351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7352" TEXT="testnode 7 6 7352" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7353" TEXT="testnode 7 7 7353" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7354" TEXT="testnode 6 5 7354" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7355" TEXT="testnode 7 1 7355" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7356" TEXT="testnode 7 2 7356" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7357" TEXT="testnode 7 3 7357" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7358" TEXT="testnode 7 4 7358" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7359" TEXT="testnode 7 5 7359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7360" TEXT="testnode 7 6 7360" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7361" TEXT="testnode 7 7 7361" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7362" TEXT="testnode 6 6 7362" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7363" TEXT="testnode 7 1 7363" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7364" TEXT="testnode 7 2 7364" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7365" TEXT="testnode 7 3 7365" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7366" TEXT="testnode 7 4 7366" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7367" TEXT="testnode 7 5 7367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7368" TEXT="testnode 7 6 7368" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7369" TEXT="testnode 7 7 7369" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7370" TEXT="testnode 6 7 7370" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7371" TEXT="testnode 7 1 7371" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7372" TEXT="testnode 7 2 7372" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7373" TEXT="testnode 7 3 7373" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7374" TEXT="testnode 7 4 7374" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7375" TEXT="testnode 7 5 7375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7376" TEXT="testnode 7 6 7376" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7377" TEXT="testnode 7 7 7377" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7378" TEXT="testnode 5 4 7378" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7379" TEXT="testnode 6 1 7379" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7380" TEXT="testnode 7 1 7380" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7381" TEXT="testnode 7 2 7381" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7382" TEXT="testnode 7 3 7382" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7383" TEXT="testnode 7 4 7383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7384" TEXT="testnode 7 5 7384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7385" TEXT="testnode 7 6 7385" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7386" TEXT="testnode 7 7 7386" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7387" TEXT="testnode 6 2 7387" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7388" TEXT="testnode 7 1 7388" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7389" TEXT="testnode 7 2 7389" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7390" TEXT="testnode 7 3 7390" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7391" TEXT="testnode 7 4 7391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7392" TEXT="testnode 7 5 7392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7393" TEXT="testnode 7 6 7393" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7394" TEXT="testnode 7 7 7394" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7395" TEXT="testnode 6 3 7395" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7396" TEXT="testnode 7 1 7396" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7397" TEXT="testnode 7 2 7397" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7398" TEXT="testnode 7 3 7398" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7399" TEXT="testnode 7 4 7399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7400" TEXT="testnode 7 5 7400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7401" TEXT="testnode 7 6 7401" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7402" TEXT="testnode 7 7 7402" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7403" TEXT="testnode 6 4 7403" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7404" TEXT="testnode 7 1 7404" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7405" TEXT="testnode 7 2 7405" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7406" TEXT="testnode 7 3 7406" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7407" TEXT="testnode 7 4 7407" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7408" TEXT="testnode 7 5 7408" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7409" TEXT="testnode 7 6 7409" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7410" TEXT="testnode 7 7 7410" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7411" TEXT="testnode 6 5 7411" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7412" TEXT="testnode 7 1 7412" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7413" TEXT="testnode 7 2 7413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7414" TEXT="testnode 7 3 7414" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7415" TEXT="testnode 7 4 7415" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7416" TEXT="testnode 7 5 7416" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7417" TEXT="testnode 7 6 7417" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7418" TEXT="testnode 7 7 7418" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7419" TEXT="testnode 6 6 7419" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7420" TEXT="testnode 7 1 7420" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7421" TEXT="testnode 7 2 7421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7422" TEXT="testnode 7 3 7422" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7423" TEXT="testnode 7 4 7423" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7424" TEXT="testnode 7 5 7424" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7425" TEXT="testnode 7 6 7425" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7426" TEXT="testnode 7 7 7426" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7427" TEXT="testnode 6 7 7427" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7428" TEXT="testnode 7 1 7428" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7429" TEXT="testnode 7 2 7429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7430" TEXT="testnode 7 3 7430" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7431" TEXT="testnode 7 4 7431" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7432" TEXT="testnode 7 5 7432" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7433" TEXT="testnode 7 6 7433" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7434" TEXT="testnode 7 7 7434" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7435" TEXT="testnode 5 5 7435" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7436" TEXT="testnode 6 1 7436" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7437" TEXT="testnode 7 1 7437" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7438" TEXT="testnode 7 2 7438" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7439" TEXT="testnode 7 3 7439" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7440" TEXT="testnode 7 4 7440" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7441" TEXT="testnode 7 5 7441" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7442" TEXT="testnode 7 6 7442" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7443" TEXT="testnode 7 7 7443" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7444" TEXT="testnode 6 2 7444" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7445" TEXT="testnode 7 1 7445" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7446" TEXT="testnode 7 2 7446" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7447" TEXT="testnode 7 3 7447" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7448" TEXT="testnode 7 4 7448" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7449" TEXT="testnode 7 5 7449" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7450" TEXT="testnode 7 6 7450" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7451" TEXT="testnode 7 7 7451" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7452" TEXT="testnode 6 3 7452" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7453" TEXT="testnode 7 1 7453" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7454" TEXT="testnode 7 2 7454" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7455" TEXT="testnode 7 3 7455" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7456" TEXT="testnode 7 4 7456" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7457" TEXT="testnode 7 5 7457" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7458" TEXT="testnode 7 6 7458" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7459" TEXT="testnode 7 7 7459" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7460" TEXT="testnode 6 4 7460" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7461" TEXT="testnode 7 1 7461" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7462" TEXT="testnode 7 2 7462" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7463" TEXT="testnode 7 3 7463" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7464" TEXT="testnode 7 4 7464" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7465" TEXT="testnode 7 5 7465" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7466" TEXT="testnode 7 6 7466" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7467" TEXT="testnode 7 7 7467" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7468" TEXT="testnode 6 5 7468" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7469" TEXT="testnode 7 1 7469" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7470" TEXT="testnode 7 2 7470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7471" TEXT="testnode 7 3 7471" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7472" TEXT="testnode 7 4 7472" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7473" TEXT="testnode 7 5 7473" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7474" TEXT="testnode 7 6 7474" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7475" TEXT="testnode 7 7 7475" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7476" TEXT="testnode 6 6 7476" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7477" TEXT="testnode 7 1 7477" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7478" TEXT="testnode 7 2 7478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7479" TEXT="testnode 7 3 7479" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7480" TEXT="testnode 7 4 7480" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7481" TEXT="testnode 7 5 7481" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7482" TEXT="testnode 7 6 7482" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7483" TEXT="testnode 7 7 7483" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7484" TEXT="testnode 6 7 7484" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7485" TEXT="testnode 7 1 7485" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7486" TEXT="testnode 7 2 7486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7487" TEXT="testnode 7 3 7487" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7488" TEXT="testnode 7 4 7488" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7489" TEXT="testnode 7 5 7489" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7490" TEXT="testnode 7 6 7490" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7491" TEXT="testnode 7 7 7491" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7492" TEXT="testnode 5 6 7492" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7493" TEXT="testnode 6 1 7493" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7494" TEXT="testnode 7 1 7494" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7495" TEXT="testnode 7 2 7495" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7496" TEXT="testnode 7 3 7496" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7497" TEXT="testnode 7 4 7497" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7498" TEXT="testnode 7 5 7498" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7499" TEXT="testnode 7 6 7499" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7500" TEXT="testnode 7 7 7500" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7501" TEXT="testnode 6 2 7501" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7502" TEXT="testnode 7 1 7502" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7503" TEXT="testnode 7 2 7503" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7504" TEXT="testnode 7 3 7504" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7505" TEXT="testnode 7 4 7505" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7506" TEXT="testnode 7 5 7506" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7507" TEXT="testnode 7 6 7507" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7508" TEXT="testnode 7 7 7508" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7509" TEXT="testnode 6 3 7509" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7510" TEXT="testnode 7 1 7510" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7511" TEXT="testnode 7 2 7511" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7512" TEXT="testnode 7 3 7512" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7513" TEXT="testnode 7 4 7513" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7514" TEXT="testnode 7 5 7514" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7515" TEXT="testnode 7 6 7515" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7516" TEXT="testnode 7 7 7516" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7517" TEXT="testnode 6 4 7517" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7518" TEXT="testnode 7 1 7518" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7519" TEXT="testnode 7 2 7519" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7520" TEXT="testnode 7 3 7520" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7521" TEXT="testnode 7 4 7521" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7522" TEXT="testnode 7 5 7522" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7523" TEXT="testnode 7 6 7523" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7524" TEXT="testnode 7 7 7524" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7525" TEXT="testnode 6 5 7525" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7526" TEXT="testnode 7 1 7526" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7527" TEXT="testnode 7 2 7527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7528" TEXT="testnode 7 3 7528" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7529" TEXT="testnode 7 4 7529" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7530" TEXT="testnode 7 5 7530" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7531" TEXT="testnode 7 6 7531" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7532" TEXT="testnode 7 7 7532" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7533" TEXT="testnode 6 6 7533" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7534" TEXT="testnode 7 1 7534" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7535" TEXT="testnode 7 2 7535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7536" TEXT="testnode 7 3 7536" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7537" TEXT="testnode 7 4 7537" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7538" TEXT="testnode 7 5 7538" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7539" TEXT="testnode 7 6 7539" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7540" TEXT="testnode 7 7 7540" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7541" TEXT="testnode 6 7 7541" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7542" TEXT="testnode 7 1 7542" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7543" TEXT="testnode 7 2 7543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7544" TEXT="testnode 7 3 7544" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7545" TEXT="testnode 7 4 7545" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7546" TEXT="testnode 7 5 7546" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7547" TEXT="testnode 7 6 7547" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7548" TEXT="testnode 7 7 7548" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7549" TEXT="testnode 5 7 7549" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7550" TEXT="testnode 6 1 7550" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7551" TEXT="testnode 7 1 7551" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7552" TEXT="testnode 7 2 7552" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7553" TEXT="testnode 7 3 7553" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7554" TEXT="testnode 7 4 7554" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7555" TEXT="testnode 7 5 7555" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7556" TEXT="testnode 7 6 7556" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7557" TEXT="testnode 7 7 7557" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7558" TEXT="testnode 6 2 7558" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7559" TEXT="testnode 7 1 7559" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7560" TEXT="testnode 7 2 7560" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7561" TEXT="testnode 7 3 7561" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7562" TEXT="testnode 7 4 7562" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7563" TEXT="testnode 7 5 7563" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7564" TEXT="testnode 7 6 7564" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7565" TEXT="testnode 7 7 7565" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7566" TEXT="testnode 6 3 7566" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7567" TEXT="testnode 7 1 7567" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7568" TEXT="testnode 7 2 7568" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7569" TEXT="testnode 7 3 7569" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7570" TEXT="testnode 7 4 7570" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7571" TEXT="testnode 7 5 7571" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7572" TEXT="testnode 7 6 7572" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7573" TEXT="testnode 7 7 7573" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7574" TEXT="testnode 6 4 7574" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7575" TEXT="testnode 7 1 7575" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7576" TEXT="testnode 7 2 7576" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7577" TEXT="testnode 7 3 7577" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7578" TEXT="testnode 7 4 7578" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7579" TEXT="testnode 7 5 7579" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7580" TEXT="testnode 7 6 7580" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7581" TEXT="testnode 7 7 7581" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7582" TEXT="testnode 6 5 7582" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7583" TEXT="testnode 7 1 7583" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7584" TEXT="testnode 7 2 7584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7585" TEXT="testnode 7 3 7585" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7586" TEXT="testnode 7 4 7586" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7587" TEXT="testnode 7 5 7587" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7588" TEXT="testnode 7 6 7588" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7589" TEXT="testnode 7 7 7589" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7590" TEXT="testnode 6 6 7590" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7591" TEXT="testnode 7 1 7591" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7592" TEXT="testnode 7 2 7592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7593" TEXT="testnode 7 3 7593" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7594" TEXT="testnode 7 4 7594" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7595" TEXT="testnode 7 5 7595" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7596" TEXT="testnode 7 6 7596" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7597" TEXT="testnode 7 7 7597" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7598" TEXT="testnode 6 7 7598" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7599" TEXT="testnode 7 1 7599" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7600" TEXT="testnode 7 2 7600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7601" TEXT="testnode 7 3 7601" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7602" TEXT="testnode 7 4 7602" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7603" TEXT="testnode 7 5 7603" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7604" TEXT="testnode 7 6 7604" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7605" TEXT="testnode 7 7 7605" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7606" TEXT="testnode 4 6 7606" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_7607" TEXT="testnode 5 1 7607" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7608" TEXT="testnode 6 1 7608" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7609" TEXT="testnode 7 1 7609" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7610" TEXT="testnode 7 2 7610" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7611" TEXT="testnode 7 3 7611" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7612" TEXT="testnode 7 4 7612" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7613" TEXT="testnode 7 5 7613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7614" TEXT="testnode 7 6 7614" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7615" TEXT="testnode 7 7 7615" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7616" TEXT="testnode 6 2 7616" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7617" TEXT="testnode 7 1 7617" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7618" TEXT="testnode 7 2 7618" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7619" TEXT="testnode 7 3 7619" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7620" TEXT="testnode 7 4 7620" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7621" TEXT="testnode 7 5 7621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7622" TEXT="testnode 7 6 7622" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7623" TEXT="testnode 7 7 7623" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7624" TEXT="testnode 6 3 7624" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7625" TEXT="testnode 7 1 7625" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7626" TEXT="testnode 7 2 7626" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7627" TEXT="testnode 7 3 7627" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7628" TEXT="testnode 7 4 7628" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7629" TEXT="testnode 7 5 7629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7630" TEXT="testnode 7 6 7630" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7631" TEXT="testnode 7 7 7631" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7632" TEXT="testnode 6 4 7632" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7633" TEXT="testnode 7 1 7633" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7634" TEXT="testnode 7 2 7634" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7635" TEXT="testnode 7 3 7635" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7636" TEXT="testnode 7 4 7636" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7637" TEXT="testnode 7 5 7637" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7638" TEXT="testnode 7 6 7638" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7639" TEXT="testnode 7 7 7639" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7640" TEXT="testnode 6 5 7640" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7641" TEXT="testnode 7 1 7641" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7642" TEXT="testnode 7 2 7642" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7643" TEXT="testnode 7 3 7643" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7644" TEXT="testnode 7 4 7644" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7645" TEXT="testnode 7 5 7645" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7646" TEXT="testnode 7 6 7646" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7647" TEXT="testnode 7 7 7647" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7648" TEXT="testnode 6 6 7648" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7649" TEXT="testnode 7 1 7649" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7650" TEXT="testnode 7 2 7650" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7651" TEXT="testnode 7 3 7651" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7652" TEXT="testnode 7 4 7652" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7653" TEXT="testnode 7 5 7653" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7654" TEXT="testnode 7 6 7654" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7655" TEXT="testnode 7 7 7655" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7656" TEXT="testnode 6 7 7656" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7657" TEXT="testnode 7 1 7657" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7658" TEXT="testnode 7 2 7658" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7659" TEXT="testnode 7 3 7659" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7660" TEXT="testnode 7 4 7660" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7661" TEXT="testnode 7 5 7661" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7662" TEXT="testnode 7 6 7662" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7663" TEXT="testnode 7 7 7663" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7664" TEXT="testnode 5 2 7664" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7665" TEXT="testnode 6 1 7665" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7666" TEXT="testnode 7 1 7666" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7667" TEXT="testnode 7 2 7667" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7668" TEXT="testnode 7 3 7668" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7669" TEXT="testnode 7 4 7669" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7670" TEXT="testnode 7 5 7670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7671" TEXT="testnode 7 6 7671" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7672" TEXT="testnode 7 7 7672" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7673" TEXT="testnode 6 2 7673" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7674" TEXT="testnode 7 1 7674" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7675" TEXT="testnode 7 2 7675" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7676" TEXT="testnode 7 3 7676" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7677" TEXT="testnode 7 4 7677" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7678" TEXT="testnode 7 5 7678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7679" TEXT="testnode 7 6 7679" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7680" TEXT="testnode 7 7 7680" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7681" TEXT="testnode 6 3 7681" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7682" TEXT="testnode 7 1 7682" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7683" TEXT="testnode 7 2 7683" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7684" TEXT="testnode 7 3 7684" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7685" TEXT="testnode 7 4 7685" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7686" TEXT="testnode 7 5 7686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7687" TEXT="testnode 7 6 7687" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7688" TEXT="testnode 7 7 7688" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7689" TEXT="testnode 6 4 7689" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7690" TEXT="testnode 7 1 7690" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7691" TEXT="testnode 7 2 7691" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7692" TEXT="testnode 7 3 7692" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7693" TEXT="testnode 7 4 7693" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7694" TEXT="testnode 7 5 7694" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7695" TEXT="testnode 7 6 7695" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7696" TEXT="testnode 7 7 7696" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7697" TEXT="testnode 6 5 7697" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7698" TEXT="testnode 7 1 7698" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7699" TEXT="testnode 7 2 7699" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7700" TEXT="testnode 7 3 7700" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7701" TEXT="testnode 7 4 7701" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7702" TEXT="testnode 7 5 7702" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7703" TEXT="testnode 7 6 7703" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7704" TEXT="testnode 7 7 7704" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7705" TEXT="testnode 6 6 7705" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7706" TEXT="testnode 7 1 7706" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7707" TEXT="testnode 7 2 7707" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7708" TEXT="testnode 7 3 7708" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7709" TEXT="testnode 7 4 7709" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7710" TEXT="testnode 7 5 7710" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7711" TEXT="testnode 7 6 7711" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7712" TEXT="testnode 7 7 7712" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7713" TEXT="testnode 6 7 7713" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7714" TEXT="testnode 7 1 7714" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7715" TEXT="testnode 7 2 7715" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7716" TEXT="testnode 7 3 7716" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7717" TEXT="testnode 7 4 7717" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7718" TEXT="testnode 7 5 7718" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7719" TEXT="testnode 7 6 7719" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7720" TEXT="testnode 7 7 7720" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7721" TEXT="testnode 5 3 7721" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7722" TEXT="testnode 6 1 7722" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7723" TEXT="testnode 7 1 7723" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7724" TEXT="testnode 7 2 7724" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7725" TEXT="testnode 7 3 7725" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7726" TEXT="testnode 7 4 7726" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7727" TEXT="testnode 7 5 7727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7728" TEXT="testnode 7 6 7728" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7729" TEXT="testnode 7 7 7729" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7730" TEXT="testnode 6 2 7730" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7731" TEXT="testnode 7 1 7731" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7732" TEXT="testnode 7 2 7732" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7733" TEXT="testnode 7 3 7733" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7734" TEXT="testnode 7 4 7734" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7735" TEXT="testnode 7 5 7735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7736" TEXT="testnode 7 6 7736" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7737" TEXT="testnode 7 7 7737" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7738" TEXT="testnode 6 3 7738" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7739" TEXT="testnode 7 1 7739" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7740" TEXT="testnode 7 2 7740" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7741" TEXT="testnode 7 3 7741" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7742" TEXT="testnode 7 4 7742" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7743" TEXT="testnode 7 5 7743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7744" TEXT="testnode 7 6 7744" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7745" TEXT="testnode 7 7 7745" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7746" TEXT="testnode 6 4 7746" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7747" TEXT="testnode 7 1 7747" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7748" TEXT="testnode 7 2 7748" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7749" TEXT="testnode 7 3 7749" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7750" TEXT="testnode 7 4 7750" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7751" TEXT="testnode 7 5 7751" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7752" TEXT="testnode 7 6 7752" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7753" TEXT="testnode 7 7 7753" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7754" TEXT="testnode 6 5 7754" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7755" TEXT="testnode 7 1 7755" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7756" TEXT="testnode 7 2 7756" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7757" TEXT="testnode 7 3 7757" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7758" TEXT="testnode 7 4 7758" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7759" TEXT="testnode 7 5 7759" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7760" TEXT="testnode 7 6 7760" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7761" TEXT="testnode 7 7 7761" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7762" TEXT="testnode 6 6 7762" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7763" TEXT="testnode 7 1 7763" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7764" TEXT="testnode 7 2 7764" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7765" TEXT="testnode 7 3 7765" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7766" TEXT="testnode 7 4 7766" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7767" TEXT="testnode 7 5 7767" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7768" TEXT="testnode 7 6 7768" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7769" TEXT="testnode 7 7 7769" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7770" TEXT="testnode 6 7 7770" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7771" TEXT="testnode 7 1 7771" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7772" TEXT="testnode 7 2 7772" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7773" TEXT="testnode 7 3 7773" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7774" TEXT="testnode 7 4 7774" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7775" TEXT="testnode 7 5 7775" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7776" TEXT="testnode 7 6 7776" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7777" TEXT="testnode 7 7 7777" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7778" TEXT="testnode 5 4 7778" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7779" TEXT="testnode 6 1 7779" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7780" TEXT="testnode 7 1 7780" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7781" TEXT="testnode 7 2 7781" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7782" TEXT="testnode 7 3 7782" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7783" TEXT="testnode 7 4 7783" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7784" TEXT="testnode 7 5 7784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7785" TEXT="testnode 7 6 7785" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7786" TEXT="testnode 7 7 7786" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7787" TEXT="testnode 6 2 7787" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7788" TEXT="testnode 7 1 7788" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7789" TEXT="testnode 7 2 7789" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7790" TEXT="testnode 7 3 7790" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7791" TEXT="testnode 7 4 7791" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7792" TEXT="testnode 7 5 7792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7793" TEXT="testnode 7 6 7793" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7794" TEXT="testnode 7 7 7794" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7795" TEXT="testnode 6 3 7795" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7796" TEXT="testnode 7 1 7796" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7797" TEXT="testnode 7 2 7797" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7798" TEXT="testnode 7 3 7798" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7799" TEXT="testnode 7 4 7799" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7800" TEXT="testnode 7 5 7800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7801" TEXT="testnode 7 6 7801" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7802" TEXT="testnode 7 7 7802" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7803" TEXT="testnode 6 4 7803" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7804" TEXT="testnode 7 1 7804" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7805" TEXT="testnode 7 2 7805" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7806" TEXT="testnode 7 3 7806" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7807" TEXT="testnode 7 4 7807" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7808" TEXT="testnode 7 5 7808" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7809" TEXT="testnode 7 6 7809" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7810" TEXT="testnode 7 7 7810" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7811" TEXT="testnode 6 5 7811" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7812" TEXT="testnode 7 1 7812" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7813" TEXT="testnode 7 2 7813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7814" TEXT="testnode 7 3 7814" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7815" TEXT="testnode 7 4 7815" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7816" TEXT="testnode 7 5 7816" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7817" TEXT="testnode 7 6 7817" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7818" TEXT="testnode 7 7 7818" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7819" TEXT="testnode 6 6 7819" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7820" TEXT="testnode 7 1 7820" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7821" TEXT="testnode 7 2 7821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7822" TEXT="testnode 7 3 7822" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7823" TEXT="testnode 7 4 7823" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7824" TEXT="testnode 7 5 7824" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7825" TEXT="testnode 7 6 7825" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7826" TEXT="testnode 7 7 7826" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7827" TEXT="testnode 6 7 7827" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7828" TEXT="testnode 7 1 7828" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7829" TEXT="testnode 7 2 7829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7830" TEXT="testnode 7 3 7830" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7831" TEXT="testnode 7 4 7831" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7832" TEXT="testnode 7 5 7832" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7833" TEXT="testnode 7 6 7833" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7834" TEXT="testnode 7 7 7834" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7835" TEXT="testnode 5 5 7835" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7836" TEXT="testnode 6 1 7836" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7837" TEXT="testnode 7 1 7837" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7838" TEXT="testnode 7 2 7838" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7839" TEXT="testnode 7 3 7839" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7840" TEXT="testnode 7 4 7840" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7841" TEXT="testnode 7 5 7841" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7842" TEXT="testnode 7 6 7842" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7843" TEXT="testnode 7 7 7843" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7844" TEXT="testnode 6 2 7844" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7845" TEXT="testnode 7 1 7845" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7846" TEXT="testnode 7 2 7846" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7847" TEXT="testnode 7 3 7847" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7848" TEXT="testnode 7 4 7848" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7849" TEXT="testnode 7 5 7849" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7850" TEXT="testnode 7 6 7850" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7851" TEXT="testnode 7 7 7851" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7852" TEXT="testnode 6 3 7852" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7853" TEXT="testnode 7 1 7853" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7854" TEXT="testnode 7 2 7854" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7855" TEXT="testnode 7 3 7855" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7856" TEXT="testnode 7 4 7856" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7857" TEXT="testnode 7 5 7857" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7858" TEXT="testnode 7 6 7858" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7859" TEXT="testnode 7 7 7859" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7860" TEXT="testnode 6 4 7860" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7861" TEXT="testnode 7 1 7861" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7862" TEXT="testnode 7 2 7862" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7863" TEXT="testnode 7 3 7863" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7864" TEXT="testnode 7 4 7864" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7865" TEXT="testnode 7 5 7865" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7866" TEXT="testnode 7 6 7866" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7867" TEXT="testnode 7 7 7867" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7868" TEXT="testnode 6 5 7868" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7869" TEXT="testnode 7 1 7869" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7870" TEXT="testnode 7 2 7870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7871" TEXT="testnode 7 3 7871" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7872" TEXT="testnode 7 4 7872" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7873" TEXT="testnode 7 5 7873" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7874" TEXT="testnode 7 6 7874" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7875" TEXT="testnode 7 7 7875" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7876" TEXT="testnode 6 6 7876" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7877" TEXT="testnode 7 1 7877" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7878" TEXT="testnode 7 2 7878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7879" TEXT="testnode 7 3 7879" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7880" TEXT="testnode 7 4 7880" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7881" TEXT="testnode 7 5 7881" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7882" TEXT="testnode 7 6 7882" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7883" TEXT="testnode 7 7 7883" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7884" TEXT="testnode 6 7 7884" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7885" TEXT="testnode 7 1 7885" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7886" TEXT="testnode 7 2 7886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7887" TEXT="testnode 7 3 7887" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7888" TEXT="testnode 7 4 7888" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7889" TEXT="testnode 7 5 7889" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7890" TEXT="testnode 7 6 7890" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7891" TEXT="testnode 7 7 7891" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7892" TEXT="testnode 5 6 7892" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7893" TEXT="testnode 6 1 7893" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7894" TEXT="testnode 7 1 7894" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7895" TEXT="testnode 7 2 7895" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7896" TEXT="testnode 7 3 7896" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7897" TEXT="testnode 7 4 7897" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7898" TEXT="testnode 7 5 7898" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7899" TEXT="testnode 7 6 7899" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7900" TEXT="testnode 7 7 7900" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7901" TEXT="testnode 6 2 7901" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7902" TEXT="testnode 7 1 7902" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7903" TEXT="testnode 7 2 7903" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7904" TEXT="testnode 7 3 7904" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7905" TEXT="testnode 7 4 7905" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7906" TEXT="testnode 7 5 7906" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7907" TEXT="testnode 7 6 7907" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7908" TEXT="testnode 7 7 7908" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7909" TEXT="testnode 6 3 7909" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7910" TEXT="testnode 7 1 7910" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7911" TEXT="testnode 7 2 7911" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7912" TEXT="testnode 7 3 7912" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7913" TEXT="testnode 7 4 7913" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7914" TEXT="testnode 7 5 7914" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7915" TEXT="testnode 7 6 7915" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7916" TEXT="testnode 7 7 7916" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7917" TEXT="testnode 6 4 7917" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7918" TEXT="testnode 7 1 7918" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7919" TEXT="testnode 7 2 7919" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7920" TEXT="testnode 7 3 7920" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7921" TEXT="testnode 7 4 7921" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7922" TEXT="testnode 7 5 7922" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7923" TEXT="testnode 7 6 7923" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7924" TEXT="testnode 7 7 7924" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7925" TEXT="testnode 6 5 7925" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7926" TEXT="testnode 7 1 7926" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7927" TEXT="testnode 7 2 7927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7928" TEXT="testnode 7 3 7928" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7929" TEXT="testnode 7 4 7929" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7930" TEXT="testnode 7 5 7930" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7931" TEXT="testnode 7 6 7931" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7932" TEXT="testnode 7 7 7932" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7933" TEXT="testnode 6 6 7933" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7934" TEXT="testnode 7 1 7934" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7935" TEXT="testnode 7 2 7935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7936" TEXT="testnode 7 3 7936" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7937" TEXT="testnode 7 4 7937" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7938" TEXT="testnode 7 5 7938" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7939" TEXT="testnode 7 6 7939" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7940" TEXT="testnode 7 7 7940" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7941" TEXT="testnode 6 7 7941" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7942" TEXT="testnode 7 1 7942" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7943" TEXT="testnode 7 2 7943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7944" TEXT="testnode 7 3 7944" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7945" TEXT="testnode 7 4 7945" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7946" TEXT="testnode 7 5 7946" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7947" TEXT="testnode 7 6 7947" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7948" TEXT="testnode 7 7 7948" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_7949" TEXT="testnode 5 7 7949" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_7950" TEXT="testnode 6 1 7950" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7951" TEXT="testnode 7 1 7951" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7952" TEXT="testnode 7 2 7952" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7953" TEXT="testnode 7 3 7953" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7954" TEXT="testnode 7 4 7954" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7955" TEXT="testnode 7 5 7955" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7956" TEXT="testnode 7 6 7956" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7957" TEXT="testnode 7 7 7957" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7958" TEXT="testnode 6 2 7958" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7959" TEXT="testnode 7 1 7959" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7960" TEXT="testnode 7 2 7960" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7961" TEXT="testnode 7 3 7961" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7962" TEXT="testnode 7 4 7962" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7963" TEXT="testnode 7 5 7963" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7964" TEXT="testnode 7 6 7964" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7965" TEXT="testnode 7 7 7965" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7966" TEXT="testnode 6 3 7966" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7967" TEXT="testnode 7 1 7967" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7968" TEXT="testnode 7 2 7968" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7969" TEXT="testnode 7 3 7969" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7970" TEXT="testnode 7 4 7970" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7971" TEXT="testnode 7 5 7971" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7972" TEXT="testnode 7 6 7972" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7973" TEXT="testnode 7 7 7973" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7974" TEXT="testnode 6 4 7974" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7975" TEXT="testnode 7 1 7975" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7976" TEXT="testnode 7 2 7976" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7977" TEXT="testnode 7 3 7977" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7978" TEXT="testnode 7 4 7978" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7979" TEXT="testnode 7 5 7979" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7980" TEXT="testnode 7 6 7980" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7981" TEXT="testnode 7 7 7981" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7982" TEXT="testnode 6 5 7982" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7983" TEXT="testnode 7 1 7983" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7984" TEXT="testnode 7 2 7984" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7985" TEXT="testnode 7 3 7985" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7986" TEXT="testnode 7 4 7986" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7987" TEXT="testnode 7 5 7987" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7988" TEXT="testnode 7 6 7988" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7989" TEXT="testnode 7 7 7989" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7990" TEXT="testnode 6 6 7990" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7991" TEXT="testnode 7 1 7991" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7992" TEXT="testnode 7 2 7992" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7993" TEXT="testnode 7 3 7993" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7994" TEXT="testnode 7 4 7994" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7995" TEXT="testnode 7 5 7995" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7996" TEXT="testnode 7 6 7996" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_7997" TEXT="testnode 7 7 7997" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_7998" TEXT="testnode 6 7 7998" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_7999" TEXT="testnode 7 1 7999" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8000" TEXT="testnode 7 2 8000" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8001" TEXT="testnode 7 3 8001" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8002" TEXT="testnode 7 4 8002" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8003" TEXT="testnode 7 5 8003" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8004" TEXT="testnode 7 6 8004" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8005" TEXT="testnode 7 7 8005" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8006" TEXT="testnode 4 7 8006" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_8007" TEXT="testnode 5 1 8007" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8008" TEXT="testnode 6 1 8008" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8009" TEXT="testnode 7 1 8009" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8010" TEXT="testnode 7 2 8010" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8011" TEXT="testnode 7 3 8011" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8012" TEXT="testnode 7 4 8012" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8013" TEXT="testnode 7 5 8013" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8014" TEXT="testnode 7 6 8014" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8015" TEXT="testnode 7 7 8015" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8016" TEXT="testnode 6 2 8016" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8017" TEXT="testnode 7 1 8017" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8018" TEXT="testnode 7 2 8018" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8019" TEXT="testnode 7 3 8019" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8020" TEXT="testnode 7 4 8020" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8021" TEXT="testnode 7 5 8021" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8022" TEXT="testnode 7 6 8022" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8023" TEXT="testnode 7 7 8023" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8024" TEXT="testnode 6 3 8024" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8025" TEXT="testnode 7 1 8025" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8026" TEXT="testnode 7 2 8026" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8027" TEXT="testnode 7 3 8027" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8028" TEXT="testnode 7 4 8028" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8029" TEXT="testnode 7 5 8029" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8030" TEXT="testnode 7 6 8030" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8031" TEXT="testnode 7 7 8031" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8032" TEXT="testnode 6 4 8032" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8033" TEXT="testnode 7 1 8033" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8034" TEXT="testnode 7 2 8034" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8035" TEXT="testnode 7 3 8035" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8036" TEXT="testnode 7 4 8036" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8037" TEXT="testnode 7 5 8037" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8038" TEXT="testnode 7 6 8038" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8039" TEXT="testnode 7 7 8039" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8040" TEXT="testnode 6 5 8040" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8041" TEXT="testnode 7 1 8041" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8042" TEXT="testnode 7 2 8042" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8043" TEXT="testnode 7 3 8043" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8044" TEXT="testnode 7 4 8044" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8045" TEXT="testnode 7 5 8045" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8046" TEXT="testnode 7 6 8046" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8047" TEXT="testnode 7 7 8047" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8048" TEXT="testnode 6 6 8048" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8049" TEXT="testnode 7 1 8049" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8050" TEXT="testnode 7 2 8050" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8051" TEXT="testnode 7 3 8051" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8052" TEXT="testnode 7 4 8052" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8053" TEXT="testnode 7 5 8053" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8054" TEXT="testnode 7 6 8054" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8055" TEXT="testnode 7 7 8055" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8056" TEXT="testnode 6 7 8056" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8057" TEXT="testnode 7 1 8057" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8058" TEXT="testnode 7 2 8058" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8059" TEXT="testnode 7 3 8059" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8060" TEXT="testnode 7 4 8060" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8061" TEXT="testnode 7 5 8061" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8062" TEXT="testnode 7 6 8062" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8063" TEXT="testnode 7 7 8063" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8064" TEXT="testnode 5 2 8064" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8065" TEXT="testnode 6 1 8065" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8066" TEXT="testnode 7 1 8066" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8067" TEXT="testnode 7 2 8067" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8068" TEXT="testnode 7 3 8068" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8069" TEXT="testnode 7 4 8069" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8070" TEXT="testnode 7 5 8070" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8071" TEXT="testnode 7 6 8071" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8072" TEXT="testnode 7 7 8072" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8073" TEXT="testnode 6 2 8073" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8074" TEXT="testnode 7 1 8074" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8075" TEXT="testnode 7 2 8075" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8076" TEXT="testnode 7 3 8076" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8077" TEXT="testnode 7 4 8077" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8078" TEXT="testnode 7 5 8078" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8079" TEXT="testnode 7 6 8079" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8080" TEXT="testnode 7 7 8080" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8081" TEXT="testnode 6 3 8081" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8082" TEXT="testnode 7 1 8082" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8083" TEXT="testnode 7 2 8083" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8084" TEXT="testnode 7 3 8084" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8085" TEXT="testnode 7 4 8085" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8086" TEXT="testnode 7 5 8086" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8087" TEXT="testnode 7 6 8087" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8088" TEXT="testnode 7 7 8088" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8089" TEXT="testnode 6 4 8089" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8090" TEXT="testnode 7 1 8090" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8091" TEXT="testnode 7 2 8091" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8092" TEXT="testnode 7 3 8092" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8093" TEXT="testnode 7 4 8093" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8094" TEXT="testnode 7 5 8094" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8095" TEXT="testnode 7 6 8095" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8096" TEXT="testnode 7 7 8096" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8097" TEXT="testnode 6 5 8097" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8098" TEXT="testnode 7 1 8098" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8099" TEXT="testnode 7 2 8099" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8100" TEXT="testnode 7 3 8100" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8101" TEXT="testnode 7 4 8101" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8102" TEXT="testnode 7 5 8102" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8103" TEXT="testnode 7 6 8103" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8104" TEXT="testnode 7 7 8104" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8105" TEXT="testnode 6 6 8105" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8106" TEXT="testnode 7 1 8106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8107" TEXT="testnode 7 2 8107" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8108" TEXT="testnode 7 3 8108" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8109" TEXT="testnode 7 4 8109" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8110" TEXT="testnode 7 5 8110" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8111" TEXT="testnode 7 6 8111" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8112" TEXT="testnode 7 7 8112" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8113" TEXT="testnode 6 7 8113" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8114" TEXT="testnode 7 1 8114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8115" TEXT="testnode 7 2 8115" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8116" TEXT="testnode 7 3 8116" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8117" TEXT="testnode 7 4 8117" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8118" TEXT="testnode 7 5 8118" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8119" TEXT="testnode 7 6 8119" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8120" TEXT="testnode 7 7 8120" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8121" TEXT="testnode 5 3 8121" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8122" TEXT="testnode 6 1 8122" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8123" TEXT="testnode 7 1 8123" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8124" TEXT="testnode 7 2 8124" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8125" TEXT="testnode 7 3 8125" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8126" TEXT="testnode 7 4 8126" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8127" TEXT="testnode 7 5 8127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8128" TEXT="testnode 7 6 8128" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8129" TEXT="testnode 7 7 8129" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8130" TEXT="testnode 6 2 8130" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8131" TEXT="testnode 7 1 8131" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8132" TEXT="testnode 7 2 8132" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8133" TEXT="testnode 7 3 8133" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8134" TEXT="testnode 7 4 8134" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8135" TEXT="testnode 7 5 8135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8136" TEXT="testnode 7 6 8136" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8137" TEXT="testnode 7 7 8137" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8138" TEXT="testnode 6 3 8138" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8139" TEXT="testnode 7 1 8139" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8140" TEXT="testnode 7 2 8140" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8141" TEXT="testnode 7 3 8141" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8142" TEXT="testnode 7 4 8142" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8143" TEXT="testnode 7 5 8143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8144" TEXT="testnode 7 6 8144" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8145" TEXT="testnode 7 7 8145" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8146" TEXT="testnode 6 4 8146" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8147" TEXT="testnode 7 1 8147" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8148" TEXT="testnode 7 2 8148" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8149" TEXT="testnode 7 3 8149" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8150" TEXT="testnode 7 4 8150" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8151" TEXT="testnode 7 5 8151" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8152" TEXT="testnode 7 6 8152" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8153" TEXT="testnode 7 7 8153" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8154" TEXT="testnode 6 5 8154" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8155" TEXT="testnode 7 1 8155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8156" TEXT="testnode 7 2 8156" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8157" TEXT="testnode 7 3 8157" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8158" TEXT="testnode 7 4 8158" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8159" TEXT="testnode 7 5 8159" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8160" TEXT="testnode 7 6 8160" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8161" TEXT="testnode 7 7 8161" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8162" TEXT="testnode 6 6 8162" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8163" TEXT="testnode 7 1 8163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8164" TEXT="testnode 7 2 8164" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8165" TEXT="testnode 7 3 8165" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8166" TEXT="testnode 7 4 8166" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8167" TEXT="testnode 7 5 8167" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8168" TEXT="testnode 7 6 8168" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8169" TEXT="testnode 7 7 8169" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8170" TEXT="testnode 6 7 8170" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8171" TEXT="testnode 7 1 8171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8172" TEXT="testnode 7 2 8172" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8173" TEXT="testnode 7 3 8173" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8174" TEXT="testnode 7 4 8174" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8175" TEXT="testnode 7 5 8175" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8176" TEXT="testnode 7 6 8176" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8177" TEXT="testnode 7 7 8177" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8178" TEXT="testnode 5 4 8178" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8179" TEXT="testnode 6 1 8179" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8180" TEXT="testnode 7 1 8180" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8181" TEXT="testnode 7 2 8181" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8182" TEXT="testnode 7 3 8182" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8183" TEXT="testnode 7 4 8183" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8184" TEXT="testnode 7 5 8184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8185" TEXT="testnode 7 6 8185" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8186" TEXT="testnode 7 7 8186" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8187" TEXT="testnode 6 2 8187" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8188" TEXT="testnode 7 1 8188" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8189" TEXT="testnode 7 2 8189" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8190" TEXT="testnode 7 3 8190" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8191" TEXT="testnode 7 4 8191" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8192" TEXT="testnode 7 5 8192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8193" TEXT="testnode 7 6 8193" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8194" TEXT="testnode 7 7 8194" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8195" TEXT="testnode 6 3 8195" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8196" TEXT="testnode 7 1 8196" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8197" TEXT="testnode 7 2 8197" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8198" TEXT="testnode 7 3 8198" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8199" TEXT="testnode 7 4 8199" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8200" TEXT="testnode 7 5 8200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8201" TEXT="testnode 7 6 8201" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8202" TEXT="testnode 7 7 8202" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8203" TEXT="testnode 6 4 8203" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8204" TEXT="testnode 7 1 8204" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8205" TEXT="testnode 7 2 8205" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8206" TEXT="testnode 7 3 8206" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8207" TEXT="testnode 7 4 8207" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8208" TEXT="testnode 7 5 8208" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8209" TEXT="testnode 7 6 8209" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8210" TEXT="testnode 7 7 8210" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8211" TEXT="testnode 6 5 8211" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8212" TEXT="testnode 7 1 8212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8213" TEXT="testnode 7 2 8213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8214" TEXT="testnode 7 3 8214" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8215" TEXT="testnode 7 4 8215" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8216" TEXT="testnode 7 5 8216" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8217" TEXT="testnode 7 6 8217" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8218" TEXT="testnode 7 7 8218" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8219" TEXT="testnode 6 6 8219" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8220" TEXT="testnode 7 1 8220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8221" TEXT="testnode 7 2 8221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8222" TEXT="testnode 7 3 8222" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8223" TEXT="testnode 7 4 8223" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8224" TEXT="testnode 7 5 8224" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8225" TEXT="testnode 7 6 8225" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8226" TEXT="testnode 7 7 8226" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8227" TEXT="testnode 6 7 8227" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8228" TEXT="testnode 7 1 8228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8229" TEXT="testnode 7 2 8229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8230" TEXT="testnode 7 3 8230" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8231" TEXT="testnode 7 4 8231" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8232" TEXT="testnode 7 5 8232" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8233" TEXT="testnode 7 6 8233" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8234" TEXT="testnode 7 7 8234" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8235" TEXT="testnode 5 5 8235" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8236" TEXT="testnode 6 1 8236" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8237" TEXT="testnode 7 1 8237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8238" TEXT="testnode 7 2 8238" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8239" TEXT="testnode 7 3 8239" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8240" TEXT="testnode 7 4 8240" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8241" TEXT="testnode 7 5 8241" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8242" TEXT="testnode 7 6 8242" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8243" TEXT="testnode 7 7 8243" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8244" TEXT="testnode 6 2 8244" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8245" TEXT="testnode 7 1 8245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8246" TEXT="testnode 7 2 8246" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8247" TEXT="testnode 7 3 8247" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8248" TEXT="testnode 7 4 8248" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8249" TEXT="testnode 7 5 8249" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8250" TEXT="testnode 7 6 8250" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8251" TEXT="testnode 7 7 8251" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8252" TEXT="testnode 6 3 8252" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8253" TEXT="testnode 7 1 8253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8254" TEXT="testnode 7 2 8254" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8255" TEXT="testnode 7 3 8255" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8256" TEXT="testnode 7 4 8256" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8257" TEXT="testnode 7 5 8257" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8258" TEXT="testnode 7 6 8258" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8259" TEXT="testnode 7 7 8259" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8260" TEXT="testnode 6 4 8260" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8261" TEXT="testnode 7 1 8261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8262" TEXT="testnode 7 2 8262" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8263" TEXT="testnode 7 3 8263" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8264" TEXT="testnode 7 4 8264" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8265" TEXT="testnode 7 5 8265" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8266" TEXT="testnode 7 6 8266" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8267" TEXT="testnode 7 7 8267" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8268" TEXT="testnode 6 5 8268" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8269" TEXT="testnode 7 1 8269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8270" TEXT="testnode 7 2 8270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8271" TEXT="testnode 7 3 8271" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8272" TEXT="testnode 7 4 8272" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8273" TEXT="testnode 7 5 8273" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8274" TEXT="testnode 7 6 8274" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8275" TEXT="testnode 7 7 8275" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8276" TEXT="testnode 6 6 8276" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8277" TEXT="testnode 7 1 8277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8278" TEXT="testnode 7 2 8278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8279" TEXT="testnode 7 3 8279" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8280" TEXT="testnode 7 4 8280" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8281" TEXT="testnode 7 5 8281" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8282" TEXT="testnode 7 6 8282" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8283" TEXT="testnode 7 7 8283" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8284" TEXT="testnode 6 7 8284" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8285" TEXT="testnode 7 1 8285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8286" TEXT="testnode 7 2 8286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8287" TEXT="testnode 7 3 8287" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8288" TEXT="testnode 7 4 8288" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8289" TEXT="testnode 7 5 8289" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8290" TEXT="testnode 7 6 8290" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8291" TEXT="testnode 7 7 8291" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8292" TEXT="testnode 5 6 8292" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8293" TEXT="testnode 6 1 8293" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8294" TEXT="testnode 7 1 8294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8295" TEXT="testnode 7 2 8295" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8296" TEXT="testnode 7 3 8296" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8297" TEXT="testnode 7 4 8297" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8298" TEXT="testnode 7 5 8298" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8299" TEXT="testnode 7 6 8299" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8300" TEXT="testnode 7 7 8300" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8301" TEXT="testnode 6 2 8301" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8302" TEXT="testnode 7 1 8302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8303" TEXT="testnode 7 2 8303" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8304" TEXT="testnode 7 3 8304" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8305" TEXT="testnode 7 4 8305" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8306" TEXT="testnode 7 5 8306" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8307" TEXT="testnode 7 6 8307" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8308" TEXT="testnode 7 7 8308" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8309" TEXT="testnode 6 3 8309" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8310" TEXT="testnode 7 1 8310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8311" TEXT="testnode 7 2 8311" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8312" TEXT="testnode 7 3 8312" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8313" TEXT="testnode 7 4 8313" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8314" TEXT="testnode 7 5 8314" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8315" TEXT="testnode 7 6 8315" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8316" TEXT="testnode 7 7 8316" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8317" TEXT="testnode 6 4 8317" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8318" TEXT="testnode 7 1 8318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8319" TEXT="testnode 7 2 8319" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8320" TEXT="testnode 7 3 8320" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8321" TEXT="testnode 7 4 8321" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8322" TEXT="testnode 7 5 8322" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8323" TEXT="testnode 7 6 8323" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8324" TEXT="testnode 7 7 8324" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8325" TEXT="testnode 6 5 8325" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8326" TEXT="testnode 7 1 8326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8327" TEXT="testnode 7 2 8327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8328" TEXT="testnode 7 3 8328" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8329" TEXT="testnode 7 4 8329" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8330" TEXT="testnode 7 5 8330" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8331" TEXT="testnode 7 6 8331" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8332" TEXT="testnode 7 7 8332" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8333" TEXT="testnode 6 6 8333" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8334" TEXT="testnode 7 1 8334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8335" TEXT="testnode 7 2 8335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8336" TEXT="testnode 7 3 8336" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8337" TEXT="testnode 7 4 8337" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8338" TEXT="testnode 7 5 8338" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8339" TEXT="testnode 7 6 8339" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8340" TEXT="testnode 7 7 8340" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8341" TEXT="testnode 6 7 8341" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8342" TEXT="testnode 7 1 8342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8343" TEXT="testnode 7 2 8343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8344" TEXT="testnode 7 3 8344" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8345" TEXT="testnode 7 4 8345" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8346" TEXT="testnode 7 5 8346" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8347" TEXT="testnode 7 6 8347" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8348" TEXT="testnode 7 7 8348" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8349" TEXT="testnode 5 7 8349" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8350" TEXT="testnode 6 1 8350" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8351" TEXT="testnode 7 1 8351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8352" TEXT="testnode 7 2 8352" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8353" TEXT="testnode 7 3 8353" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8354" TEXT="testnode 7 4 8354" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8355" TEXT="testnode 7 5 8355" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8356" TEXT="testnode 7 6 8356" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8357" TEXT="testnode 7 7 8357" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8358" TEXT="testnode 6 2 8358" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8359" TEXT="testnode 7 1 8359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8360" TEXT="testnode 7 2 8360" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8361" TEXT="testnode 7 3 8361" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8362" TEXT="testnode 7 4 8362" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8363" TEXT="testnode 7 5 8363" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8364" TEXT="testnode 7 6 8364" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8365" TEXT="testnode 7 7 8365" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8366" TEXT="testnode 6 3 8366" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8367" TEXT="testnode 7 1 8367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8368" TEXT="testnode 7 2 8368" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8369" TEXT="testnode 7 3 8369" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8370" TEXT="testnode 7 4 8370" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8371" TEXT="testnode 7 5 8371" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8372" TEXT="testnode 7 6 8372" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8373" TEXT="testnode 7 7 8373" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8374" TEXT="testnode 6 4 8374" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8375" TEXT="testnode 7 1 8375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8376" TEXT="testnode 7 2 8376" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8377" TEXT="testnode 7 3 8377" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8378" TEXT="testnode 7 4 8378" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8379" TEXT="testnode 7 5 8379" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8380" TEXT="testnode 7 6 8380" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8381" TEXT="testnode 7 7 8381" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8382" TEXT="testnode 6 5 8382" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8383" TEXT="testnode 7 1 8383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8384" TEXT="testnode 7 2 8384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8385" TEXT="testnode 7 3 8385" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8386" TEXT="testnode 7 4 8386" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8387" TEXT="testnode 7 5 8387" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8388" TEXT="testnode 7 6 8388" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8389" TEXT="testnode 7 7 8389" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8390" TEXT="testnode 6 6 8390" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8391" TEXT="testnode 7 1 8391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8392" TEXT="testnode 7 2 8392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8393" TEXT="testnode 7 3 8393" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8394" TEXT="testnode 7 4 8394" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8395" TEXT="testnode 7 5 8395" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8396" TEXT="testnode 7 6 8396" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8397" TEXT="testnode 7 7 8397" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8398" TEXT="testnode 6 7 8398" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8399" TEXT="testnode 7 1 8399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8400" TEXT="testnode 7 2 8400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8401" TEXT="testnode 7 3 8401" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8402" TEXT="testnode 7 4 8402" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8403" TEXT="testnode 7 5 8403" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8404" TEXT="testnode 7 6 8404" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8405" TEXT="testnode 7 7 8405" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8406" TEXT="testnode 3 4 8406" FOLDED = "true">
- <icon BUILTIN="full-4"/>
- <icon BUILTIN="full-5"/>
- <node ID="Freemind_Link_8407" TEXT="testnode 4 1 8407" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_8408" TEXT="testnode 5 1 8408" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8409" TEXT="testnode 6 1 8409" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8410" TEXT="testnode 7 1 8410" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8411" TEXT="testnode 7 2 8411" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8412" TEXT="testnode 7 3 8412" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8413" TEXT="testnode 7 4 8413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8414" TEXT="testnode 7 5 8414" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8415" TEXT="testnode 7 6 8415" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8416" TEXT="testnode 7 7 8416" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8417" TEXT="testnode 6 2 8417" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8418" TEXT="testnode 7 1 8418" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8419" TEXT="testnode 7 2 8419" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8420" TEXT="testnode 7 3 8420" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8421" TEXT="testnode 7 4 8421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8422" TEXT="testnode 7 5 8422" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8423" TEXT="testnode 7 6 8423" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8424" TEXT="testnode 7 7 8424" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8425" TEXT="testnode 6 3 8425" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8426" TEXT="testnode 7 1 8426" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8427" TEXT="testnode 7 2 8427" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8428" TEXT="testnode 7 3 8428" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8429" TEXT="testnode 7 4 8429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8430" TEXT="testnode 7 5 8430" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8431" TEXT="testnode 7 6 8431" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8432" TEXT="testnode 7 7 8432" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8433" TEXT="testnode 6 4 8433" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8434" TEXT="testnode 7 1 8434" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8435" TEXT="testnode 7 2 8435" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8436" TEXT="testnode 7 3 8436" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8437" TEXT="testnode 7 4 8437" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8438" TEXT="testnode 7 5 8438" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8439" TEXT="testnode 7 6 8439" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8440" TEXT="testnode 7 7 8440" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8441" TEXT="testnode 6 5 8441" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8442" TEXT="testnode 7 1 8442" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8443" TEXT="testnode 7 2 8443" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8444" TEXT="testnode 7 3 8444" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8445" TEXT="testnode 7 4 8445" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8446" TEXT="testnode 7 5 8446" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8447" TEXT="testnode 7 6 8447" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8448" TEXT="testnode 7 7 8448" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8449" TEXT="testnode 6 6 8449" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8450" TEXT="testnode 7 1 8450" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8451" TEXT="testnode 7 2 8451" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8452" TEXT="testnode 7 3 8452" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8453" TEXT="testnode 7 4 8453" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8454" TEXT="testnode 7 5 8454" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8455" TEXT="testnode 7 6 8455" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8456" TEXT="testnode 7 7 8456" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8457" TEXT="testnode 6 7 8457" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8458" TEXT="testnode 7 1 8458" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8459" TEXT="testnode 7 2 8459" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8460" TEXT="testnode 7 3 8460" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8461" TEXT="testnode 7 4 8461" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8462" TEXT="testnode 7 5 8462" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8463" TEXT="testnode 7 6 8463" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8464" TEXT="testnode 7 7 8464" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8465" TEXT="testnode 5 2 8465" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8466" TEXT="testnode 6 1 8466" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8467" TEXT="testnode 7 1 8467" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8468" TEXT="testnode 7 2 8468" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8469" TEXT="testnode 7 3 8469" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8470" TEXT="testnode 7 4 8470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8471" TEXT="testnode 7 5 8471" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8472" TEXT="testnode 7 6 8472" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8473" TEXT="testnode 7 7 8473" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8474" TEXT="testnode 6 2 8474" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8475" TEXT="testnode 7 1 8475" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8476" TEXT="testnode 7 2 8476" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8477" TEXT="testnode 7 3 8477" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8478" TEXT="testnode 7 4 8478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8479" TEXT="testnode 7 5 8479" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8480" TEXT="testnode 7 6 8480" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8481" TEXT="testnode 7 7 8481" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8482" TEXT="testnode 6 3 8482" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8483" TEXT="testnode 7 1 8483" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8484" TEXT="testnode 7 2 8484" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8485" TEXT="testnode 7 3 8485" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8486" TEXT="testnode 7 4 8486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8487" TEXT="testnode 7 5 8487" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8488" TEXT="testnode 7 6 8488" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8489" TEXT="testnode 7 7 8489" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8490" TEXT="testnode 6 4 8490" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8491" TEXT="testnode 7 1 8491" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8492" TEXT="testnode 7 2 8492" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8493" TEXT="testnode 7 3 8493" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8494" TEXT="testnode 7 4 8494" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8495" TEXT="testnode 7 5 8495" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8496" TEXT="testnode 7 6 8496" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8497" TEXT="testnode 7 7 8497" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8498" TEXT="testnode 6 5 8498" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8499" TEXT="testnode 7 1 8499" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8500" TEXT="testnode 7 2 8500" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8501" TEXT="testnode 7 3 8501" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8502" TEXT="testnode 7 4 8502" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8503" TEXT="testnode 7 5 8503" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8504" TEXT="testnode 7 6 8504" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8505" TEXT="testnode 7 7 8505" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8506" TEXT="testnode 6 6 8506" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8507" TEXT="testnode 7 1 8507" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8508" TEXT="testnode 7 2 8508" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8509" TEXT="testnode 7 3 8509" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8510" TEXT="testnode 7 4 8510" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8511" TEXT="testnode 7 5 8511" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8512" TEXT="testnode 7 6 8512" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8513" TEXT="testnode 7 7 8513" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8514" TEXT="testnode 6 7 8514" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8515" TEXT="testnode 7 1 8515" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8516" TEXT="testnode 7 2 8516" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8517" TEXT="testnode 7 3 8517" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8518" TEXT="testnode 7 4 8518" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8519" TEXT="testnode 7 5 8519" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8520" TEXT="testnode 7 6 8520" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8521" TEXT="testnode 7 7 8521" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8522" TEXT="testnode 5 3 8522" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8523" TEXT="testnode 6 1 8523" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8524" TEXT="testnode 7 1 8524" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8525" TEXT="testnode 7 2 8525" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8526" TEXT="testnode 7 3 8526" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8527" TEXT="testnode 7 4 8527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8528" TEXT="testnode 7 5 8528" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8529" TEXT="testnode 7 6 8529" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8530" TEXT="testnode 7 7 8530" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8531" TEXT="testnode 6 2 8531" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8532" TEXT="testnode 7 1 8532" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8533" TEXT="testnode 7 2 8533" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8534" TEXT="testnode 7 3 8534" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8535" TEXT="testnode 7 4 8535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8536" TEXT="testnode 7 5 8536" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8537" TEXT="testnode 7 6 8537" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8538" TEXT="testnode 7 7 8538" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8539" TEXT="testnode 6 3 8539" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8540" TEXT="testnode 7 1 8540" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8541" TEXT="testnode 7 2 8541" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8542" TEXT="testnode 7 3 8542" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8543" TEXT="testnode 7 4 8543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8544" TEXT="testnode 7 5 8544" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8545" TEXT="testnode 7 6 8545" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8546" TEXT="testnode 7 7 8546" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8547" TEXT="testnode 6 4 8547" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8548" TEXT="testnode 7 1 8548" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8549" TEXT="testnode 7 2 8549" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8550" TEXT="testnode 7 3 8550" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8551" TEXT="testnode 7 4 8551" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8552" TEXT="testnode 7 5 8552" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8553" TEXT="testnode 7 6 8553" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8554" TEXT="testnode 7 7 8554" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8555" TEXT="testnode 6 5 8555" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8556" TEXT="testnode 7 1 8556" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8557" TEXT="testnode 7 2 8557" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8558" TEXT="testnode 7 3 8558" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8559" TEXT="testnode 7 4 8559" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8560" TEXT="testnode 7 5 8560" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8561" TEXT="testnode 7 6 8561" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8562" TEXT="testnode 7 7 8562" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8563" TEXT="testnode 6 6 8563" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8564" TEXT="testnode 7 1 8564" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8565" TEXT="testnode 7 2 8565" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8566" TEXT="testnode 7 3 8566" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8567" TEXT="testnode 7 4 8567" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8568" TEXT="testnode 7 5 8568" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8569" TEXT="testnode 7 6 8569" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8570" TEXT="testnode 7 7 8570" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8571" TEXT="testnode 6 7 8571" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8572" TEXT="testnode 7 1 8572" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8573" TEXT="testnode 7 2 8573" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8574" TEXT="testnode 7 3 8574" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8575" TEXT="testnode 7 4 8575" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8576" TEXT="testnode 7 5 8576" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8577" TEXT="testnode 7 6 8577" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8578" TEXT="testnode 7 7 8578" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8579" TEXT="testnode 5 4 8579" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8580" TEXT="testnode 6 1 8580" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8581" TEXT="testnode 7 1 8581" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8582" TEXT="testnode 7 2 8582" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8583" TEXT="testnode 7 3 8583" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8584" TEXT="testnode 7 4 8584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8585" TEXT="testnode 7 5 8585" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8586" TEXT="testnode 7 6 8586" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8587" TEXT="testnode 7 7 8587" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8588" TEXT="testnode 6 2 8588" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8589" TEXT="testnode 7 1 8589" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8590" TEXT="testnode 7 2 8590" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8591" TEXT="testnode 7 3 8591" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8592" TEXT="testnode 7 4 8592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8593" TEXT="testnode 7 5 8593" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8594" TEXT="testnode 7 6 8594" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8595" TEXT="testnode 7 7 8595" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8596" TEXT="testnode 6 3 8596" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8597" TEXT="testnode 7 1 8597" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8598" TEXT="testnode 7 2 8598" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8599" TEXT="testnode 7 3 8599" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8600" TEXT="testnode 7 4 8600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8601" TEXT="testnode 7 5 8601" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8602" TEXT="testnode 7 6 8602" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8603" TEXT="testnode 7 7 8603" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8604" TEXT="testnode 6 4 8604" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8605" TEXT="testnode 7 1 8605" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8606" TEXT="testnode 7 2 8606" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8607" TEXT="testnode 7 3 8607" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8608" TEXT="testnode 7 4 8608" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8609" TEXT="testnode 7 5 8609" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8610" TEXT="testnode 7 6 8610" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8611" TEXT="testnode 7 7 8611" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8612" TEXT="testnode 6 5 8612" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8613" TEXT="testnode 7 1 8613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8614" TEXT="testnode 7 2 8614" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8615" TEXT="testnode 7 3 8615" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8616" TEXT="testnode 7 4 8616" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8617" TEXT="testnode 7 5 8617" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8618" TEXT="testnode 7 6 8618" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8619" TEXT="testnode 7 7 8619" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8620" TEXT="testnode 6 6 8620" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8621" TEXT="testnode 7 1 8621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8622" TEXT="testnode 7 2 8622" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8623" TEXT="testnode 7 3 8623" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8624" TEXT="testnode 7 4 8624" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8625" TEXT="testnode 7 5 8625" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8626" TEXT="testnode 7 6 8626" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8627" TEXT="testnode 7 7 8627" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8628" TEXT="testnode 6 7 8628" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8629" TEXT="testnode 7 1 8629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8630" TEXT="testnode 7 2 8630" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8631" TEXT="testnode 7 3 8631" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8632" TEXT="testnode 7 4 8632" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8633" TEXT="testnode 7 5 8633" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8634" TEXT="testnode 7 6 8634" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8635" TEXT="testnode 7 7 8635" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8636" TEXT="testnode 5 5 8636" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8637" TEXT="testnode 6 1 8637" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8638" TEXT="testnode 7 1 8638" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8639" TEXT="testnode 7 2 8639" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8640" TEXT="testnode 7 3 8640" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8641" TEXT="testnode 7 4 8641" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8642" TEXT="testnode 7 5 8642" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8643" TEXT="testnode 7 6 8643" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8644" TEXT="testnode 7 7 8644" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8645" TEXT="testnode 6 2 8645" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8646" TEXT="testnode 7 1 8646" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8647" TEXT="testnode 7 2 8647" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8648" TEXT="testnode 7 3 8648" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8649" TEXT="testnode 7 4 8649" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8650" TEXT="testnode 7 5 8650" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8651" TEXT="testnode 7 6 8651" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8652" TEXT="testnode 7 7 8652" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8653" TEXT="testnode 6 3 8653" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8654" TEXT="testnode 7 1 8654" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8655" TEXT="testnode 7 2 8655" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8656" TEXT="testnode 7 3 8656" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8657" TEXT="testnode 7 4 8657" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8658" TEXT="testnode 7 5 8658" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8659" TEXT="testnode 7 6 8659" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8660" TEXT="testnode 7 7 8660" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8661" TEXT="testnode 6 4 8661" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8662" TEXT="testnode 7 1 8662" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8663" TEXT="testnode 7 2 8663" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8664" TEXT="testnode 7 3 8664" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8665" TEXT="testnode 7 4 8665" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8666" TEXT="testnode 7 5 8666" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8667" TEXT="testnode 7 6 8667" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8668" TEXT="testnode 7 7 8668" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8669" TEXT="testnode 6 5 8669" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8670" TEXT="testnode 7 1 8670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8671" TEXT="testnode 7 2 8671" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8672" TEXT="testnode 7 3 8672" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8673" TEXT="testnode 7 4 8673" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8674" TEXT="testnode 7 5 8674" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8675" TEXT="testnode 7 6 8675" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8676" TEXT="testnode 7 7 8676" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8677" TEXT="testnode 6 6 8677" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8678" TEXT="testnode 7 1 8678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8679" TEXT="testnode 7 2 8679" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8680" TEXT="testnode 7 3 8680" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8681" TEXT="testnode 7 4 8681" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8682" TEXT="testnode 7 5 8682" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8683" TEXT="testnode 7 6 8683" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8684" TEXT="testnode 7 7 8684" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8685" TEXT="testnode 6 7 8685" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8686" TEXT="testnode 7 1 8686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8687" TEXT="testnode 7 2 8687" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8688" TEXT="testnode 7 3 8688" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8689" TEXT="testnode 7 4 8689" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8690" TEXT="testnode 7 5 8690" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8691" TEXT="testnode 7 6 8691" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8692" TEXT="testnode 7 7 8692" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8693" TEXT="testnode 5 6 8693" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8694" TEXT="testnode 6 1 8694" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8695" TEXT="testnode 7 1 8695" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8696" TEXT="testnode 7 2 8696" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8697" TEXT="testnode 7 3 8697" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8698" TEXT="testnode 7 4 8698" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8699" TEXT="testnode 7 5 8699" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8700" TEXT="testnode 7 6 8700" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8701" TEXT="testnode 7 7 8701" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8702" TEXT="testnode 6 2 8702" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8703" TEXT="testnode 7 1 8703" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8704" TEXT="testnode 7 2 8704" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8705" TEXT="testnode 7 3 8705" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8706" TEXT="testnode 7 4 8706" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8707" TEXT="testnode 7 5 8707" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8708" TEXT="testnode 7 6 8708" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8709" TEXT="testnode 7 7 8709" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8710" TEXT="testnode 6 3 8710" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8711" TEXT="testnode 7 1 8711" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8712" TEXT="testnode 7 2 8712" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8713" TEXT="testnode 7 3 8713" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8714" TEXT="testnode 7 4 8714" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8715" TEXT="testnode 7 5 8715" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8716" TEXT="testnode 7 6 8716" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8717" TEXT="testnode 7 7 8717" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8718" TEXT="testnode 6 4 8718" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8719" TEXT="testnode 7 1 8719" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8720" TEXT="testnode 7 2 8720" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8721" TEXT="testnode 7 3 8721" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8722" TEXT="testnode 7 4 8722" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8723" TEXT="testnode 7 5 8723" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8724" TEXT="testnode 7 6 8724" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8725" TEXT="testnode 7 7 8725" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8726" TEXT="testnode 6 5 8726" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8727" TEXT="testnode 7 1 8727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8728" TEXT="testnode 7 2 8728" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8729" TEXT="testnode 7 3 8729" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8730" TEXT="testnode 7 4 8730" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8731" TEXT="testnode 7 5 8731" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8732" TEXT="testnode 7 6 8732" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8733" TEXT="testnode 7 7 8733" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8734" TEXT="testnode 6 6 8734" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8735" TEXT="testnode 7 1 8735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8736" TEXT="testnode 7 2 8736" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8737" TEXT="testnode 7 3 8737" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8738" TEXT="testnode 7 4 8738" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8739" TEXT="testnode 7 5 8739" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8740" TEXT="testnode 7 6 8740" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8741" TEXT="testnode 7 7 8741" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8742" TEXT="testnode 6 7 8742" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8743" TEXT="testnode 7 1 8743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8744" TEXT="testnode 7 2 8744" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8745" TEXT="testnode 7 3 8745" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8746" TEXT="testnode 7 4 8746" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8747" TEXT="testnode 7 5 8747" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8748" TEXT="testnode 7 6 8748" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8749" TEXT="testnode 7 7 8749" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8750" TEXT="testnode 5 7 8750" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8751" TEXT="testnode 6 1 8751" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8752" TEXT="testnode 7 1 8752" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8753" TEXT="testnode 7 2 8753" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8754" TEXT="testnode 7 3 8754" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8755" TEXT="testnode 7 4 8755" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8756" TEXT="testnode 7 5 8756" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8757" TEXT="testnode 7 6 8757" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8758" TEXT="testnode 7 7 8758" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8759" TEXT="testnode 6 2 8759" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8760" TEXT="testnode 7 1 8760" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8761" TEXT="testnode 7 2 8761" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8762" TEXT="testnode 7 3 8762" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8763" TEXT="testnode 7 4 8763" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8764" TEXT="testnode 7 5 8764" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8765" TEXT="testnode 7 6 8765" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8766" TEXT="testnode 7 7 8766" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8767" TEXT="testnode 6 3 8767" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8768" TEXT="testnode 7 1 8768" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8769" TEXT="testnode 7 2 8769" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8770" TEXT="testnode 7 3 8770" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8771" TEXT="testnode 7 4 8771" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8772" TEXT="testnode 7 5 8772" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8773" TEXT="testnode 7 6 8773" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8774" TEXT="testnode 7 7 8774" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8775" TEXT="testnode 6 4 8775" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8776" TEXT="testnode 7 1 8776" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8777" TEXT="testnode 7 2 8777" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8778" TEXT="testnode 7 3 8778" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8779" TEXT="testnode 7 4 8779" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8780" TEXT="testnode 7 5 8780" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8781" TEXT="testnode 7 6 8781" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8782" TEXT="testnode 7 7 8782" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8783" TEXT="testnode 6 5 8783" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8784" TEXT="testnode 7 1 8784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8785" TEXT="testnode 7 2 8785" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8786" TEXT="testnode 7 3 8786" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8787" TEXT="testnode 7 4 8787" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8788" TEXT="testnode 7 5 8788" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8789" TEXT="testnode 7 6 8789" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8790" TEXT="testnode 7 7 8790" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8791" TEXT="testnode 6 6 8791" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8792" TEXT="testnode 7 1 8792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8793" TEXT="testnode 7 2 8793" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8794" TEXT="testnode 7 3 8794" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8795" TEXT="testnode 7 4 8795" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8796" TEXT="testnode 7 5 8796" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8797" TEXT="testnode 7 6 8797" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8798" TEXT="testnode 7 7 8798" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8799" TEXT="testnode 6 7 8799" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8800" TEXT="testnode 7 1 8800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8801" TEXT="testnode 7 2 8801" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8802" TEXT="testnode 7 3 8802" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8803" TEXT="testnode 7 4 8803" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8804" TEXT="testnode 7 5 8804" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8805" TEXT="testnode 7 6 8805" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8806" TEXT="testnode 7 7 8806" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8807" TEXT="testnode 4 2 8807" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_8808" TEXT="testnode 5 1 8808" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8809" TEXT="testnode 6 1 8809" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8810" TEXT="testnode 7 1 8810" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8811" TEXT="testnode 7 2 8811" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8812" TEXT="testnode 7 3 8812" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8813" TEXT="testnode 7 4 8813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8814" TEXT="testnode 7 5 8814" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8815" TEXT="testnode 7 6 8815" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8816" TEXT="testnode 7 7 8816" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8817" TEXT="testnode 6 2 8817" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8818" TEXT="testnode 7 1 8818" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8819" TEXT="testnode 7 2 8819" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8820" TEXT="testnode 7 3 8820" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8821" TEXT="testnode 7 4 8821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8822" TEXT="testnode 7 5 8822" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8823" TEXT="testnode 7 6 8823" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8824" TEXT="testnode 7 7 8824" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8825" TEXT="testnode 6 3 8825" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8826" TEXT="testnode 7 1 8826" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8827" TEXT="testnode 7 2 8827" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8828" TEXT="testnode 7 3 8828" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8829" TEXT="testnode 7 4 8829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8830" TEXT="testnode 7 5 8830" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8831" TEXT="testnode 7 6 8831" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8832" TEXT="testnode 7 7 8832" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8833" TEXT="testnode 6 4 8833" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8834" TEXT="testnode 7 1 8834" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8835" TEXT="testnode 7 2 8835" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8836" TEXT="testnode 7 3 8836" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8837" TEXT="testnode 7 4 8837" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8838" TEXT="testnode 7 5 8838" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8839" TEXT="testnode 7 6 8839" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8840" TEXT="testnode 7 7 8840" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8841" TEXT="testnode 6 5 8841" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8842" TEXT="testnode 7 1 8842" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8843" TEXT="testnode 7 2 8843" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8844" TEXT="testnode 7 3 8844" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8845" TEXT="testnode 7 4 8845" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8846" TEXT="testnode 7 5 8846" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8847" TEXT="testnode 7 6 8847" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8848" TEXT="testnode 7 7 8848" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8849" TEXT="testnode 6 6 8849" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8850" TEXT="testnode 7 1 8850" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8851" TEXT="testnode 7 2 8851" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8852" TEXT="testnode 7 3 8852" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8853" TEXT="testnode 7 4 8853" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8854" TEXT="testnode 7 5 8854" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8855" TEXT="testnode 7 6 8855" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8856" TEXT="testnode 7 7 8856" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8857" TEXT="testnode 6 7 8857" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8858" TEXT="testnode 7 1 8858" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8859" TEXT="testnode 7 2 8859" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8860" TEXT="testnode 7 3 8860" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8861" TEXT="testnode 7 4 8861" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8862" TEXT="testnode 7 5 8862" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8863" TEXT="testnode 7 6 8863" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8864" TEXT="testnode 7 7 8864" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8865" TEXT="testnode 5 2 8865" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8866" TEXT="testnode 6 1 8866" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8867" TEXT="testnode 7 1 8867" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8868" TEXT="testnode 7 2 8868" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8869" TEXT="testnode 7 3 8869" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8870" TEXT="testnode 7 4 8870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8871" TEXT="testnode 7 5 8871" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8872" TEXT="testnode 7 6 8872" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8873" TEXT="testnode 7 7 8873" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8874" TEXT="testnode 6 2 8874" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8875" TEXT="testnode 7 1 8875" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8876" TEXT="testnode 7 2 8876" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8877" TEXT="testnode 7 3 8877" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8878" TEXT="testnode 7 4 8878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8879" TEXT="testnode 7 5 8879" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8880" TEXT="testnode 7 6 8880" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8881" TEXT="testnode 7 7 8881" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8882" TEXT="testnode 6 3 8882" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8883" TEXT="testnode 7 1 8883" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8884" TEXT="testnode 7 2 8884" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8885" TEXT="testnode 7 3 8885" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8886" TEXT="testnode 7 4 8886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8887" TEXT="testnode 7 5 8887" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8888" TEXT="testnode 7 6 8888" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8889" TEXT="testnode 7 7 8889" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8890" TEXT="testnode 6 4 8890" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8891" TEXT="testnode 7 1 8891" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8892" TEXT="testnode 7 2 8892" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8893" TEXT="testnode 7 3 8893" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8894" TEXT="testnode 7 4 8894" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8895" TEXT="testnode 7 5 8895" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8896" TEXT="testnode 7 6 8896" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8897" TEXT="testnode 7 7 8897" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8898" TEXT="testnode 6 5 8898" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8899" TEXT="testnode 7 1 8899" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8900" TEXT="testnode 7 2 8900" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8901" TEXT="testnode 7 3 8901" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8902" TEXT="testnode 7 4 8902" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8903" TEXT="testnode 7 5 8903" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8904" TEXT="testnode 7 6 8904" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8905" TEXT="testnode 7 7 8905" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8906" TEXT="testnode 6 6 8906" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8907" TEXT="testnode 7 1 8907" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8908" TEXT="testnode 7 2 8908" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8909" TEXT="testnode 7 3 8909" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8910" TEXT="testnode 7 4 8910" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8911" TEXT="testnode 7 5 8911" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8912" TEXT="testnode 7 6 8912" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8913" TEXT="testnode 7 7 8913" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8914" TEXT="testnode 6 7 8914" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8915" TEXT="testnode 7 1 8915" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8916" TEXT="testnode 7 2 8916" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8917" TEXT="testnode 7 3 8917" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8918" TEXT="testnode 7 4 8918" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8919" TEXT="testnode 7 5 8919" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8920" TEXT="testnode 7 6 8920" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8921" TEXT="testnode 7 7 8921" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8922" TEXT="testnode 5 3 8922" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8923" TEXT="testnode 6 1 8923" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8924" TEXT="testnode 7 1 8924" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8925" TEXT="testnode 7 2 8925" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8926" TEXT="testnode 7 3 8926" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8927" TEXT="testnode 7 4 8927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8928" TEXT="testnode 7 5 8928" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8929" TEXT="testnode 7 6 8929" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8930" TEXT="testnode 7 7 8930" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8931" TEXT="testnode 6 2 8931" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8932" TEXT="testnode 7 1 8932" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8933" TEXT="testnode 7 2 8933" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8934" TEXT="testnode 7 3 8934" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8935" TEXT="testnode 7 4 8935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8936" TEXT="testnode 7 5 8936" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8937" TEXT="testnode 7 6 8937" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8938" TEXT="testnode 7 7 8938" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8939" TEXT="testnode 6 3 8939" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8940" TEXT="testnode 7 1 8940" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8941" TEXT="testnode 7 2 8941" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8942" TEXT="testnode 7 3 8942" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8943" TEXT="testnode 7 4 8943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8944" TEXT="testnode 7 5 8944" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8945" TEXT="testnode 7 6 8945" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8946" TEXT="testnode 7 7 8946" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8947" TEXT="testnode 6 4 8947" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8948" TEXT="testnode 7 1 8948" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8949" TEXT="testnode 7 2 8949" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8950" TEXT="testnode 7 3 8950" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8951" TEXT="testnode 7 4 8951" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8952" TEXT="testnode 7 5 8952" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8953" TEXT="testnode 7 6 8953" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8954" TEXT="testnode 7 7 8954" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8955" TEXT="testnode 6 5 8955" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8956" TEXT="testnode 7 1 8956" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8957" TEXT="testnode 7 2 8957" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8958" TEXT="testnode 7 3 8958" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8959" TEXT="testnode 7 4 8959" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8960" TEXT="testnode 7 5 8960" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8961" TEXT="testnode 7 6 8961" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8962" TEXT="testnode 7 7 8962" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8963" TEXT="testnode 6 6 8963" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8964" TEXT="testnode 7 1 8964" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8965" TEXT="testnode 7 2 8965" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8966" TEXT="testnode 7 3 8966" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8967" TEXT="testnode 7 4 8967" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8968" TEXT="testnode 7 5 8968" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8969" TEXT="testnode 7 6 8969" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8970" TEXT="testnode 7 7 8970" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8971" TEXT="testnode 6 7 8971" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8972" TEXT="testnode 7 1 8972" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8973" TEXT="testnode 7 2 8973" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8974" TEXT="testnode 7 3 8974" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8975" TEXT="testnode 7 4 8975" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8976" TEXT="testnode 7 5 8976" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8977" TEXT="testnode 7 6 8977" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8978" TEXT="testnode 7 7 8978" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_8979" TEXT="testnode 5 4 8979" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_8980" TEXT="testnode 6 1 8980" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8981" TEXT="testnode 7 1 8981" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8982" TEXT="testnode 7 2 8982" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8983" TEXT="testnode 7 3 8983" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8984" TEXT="testnode 7 4 8984" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8985" TEXT="testnode 7 5 8985" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8986" TEXT="testnode 7 6 8986" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8987" TEXT="testnode 7 7 8987" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8988" TEXT="testnode 6 2 8988" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8989" TEXT="testnode 7 1 8989" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8990" TEXT="testnode 7 2 8990" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8991" TEXT="testnode 7 3 8991" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8992" TEXT="testnode 7 4 8992" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8993" TEXT="testnode 7 5 8993" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8994" TEXT="testnode 7 6 8994" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8995" TEXT="testnode 7 7 8995" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_8996" TEXT="testnode 6 3 8996" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_8997" TEXT="testnode 7 1 8997" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8998" TEXT="testnode 7 2 8998" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_8999" TEXT="testnode 7 3 8999" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9000" TEXT="testnode 7 4 9000" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9001" TEXT="testnode 7 5 9001" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9002" TEXT="testnode 7 6 9002" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9003" TEXT="testnode 7 7 9003" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9004" TEXT="testnode 6 4 9004" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9005" TEXT="testnode 7 1 9005" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9006" TEXT="testnode 7 2 9006" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9007" TEXT="testnode 7 3 9007" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9008" TEXT="testnode 7 4 9008" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9009" TEXT="testnode 7 5 9009" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9010" TEXT="testnode 7 6 9010" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9011" TEXT="testnode 7 7 9011" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9012" TEXT="testnode 6 5 9012" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9013" TEXT="testnode 7 1 9013" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9014" TEXT="testnode 7 2 9014" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9015" TEXT="testnode 7 3 9015" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9016" TEXT="testnode 7 4 9016" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9017" TEXT="testnode 7 5 9017" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9018" TEXT="testnode 7 6 9018" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9019" TEXT="testnode 7 7 9019" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9020" TEXT="testnode 6 6 9020" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9021" TEXT="testnode 7 1 9021" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9022" TEXT="testnode 7 2 9022" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9023" TEXT="testnode 7 3 9023" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9024" TEXT="testnode 7 4 9024" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9025" TEXT="testnode 7 5 9025" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9026" TEXT="testnode 7 6 9026" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9027" TEXT="testnode 7 7 9027" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9028" TEXT="testnode 6 7 9028" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9029" TEXT="testnode 7 1 9029" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9030" TEXT="testnode 7 2 9030" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9031" TEXT="testnode 7 3 9031" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9032" TEXT="testnode 7 4 9032" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9033" TEXT="testnode 7 5 9033" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9034" TEXT="testnode 7 6 9034" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9035" TEXT="testnode 7 7 9035" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9036" TEXT="testnode 5 5 9036" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9037" TEXT="testnode 6 1 9037" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9038" TEXT="testnode 7 1 9038" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9039" TEXT="testnode 7 2 9039" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9040" TEXT="testnode 7 3 9040" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9041" TEXT="testnode 7 4 9041" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9042" TEXT="testnode 7 5 9042" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9043" TEXT="testnode 7 6 9043" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9044" TEXT="testnode 7 7 9044" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9045" TEXT="testnode 6 2 9045" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9046" TEXT="testnode 7 1 9046" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9047" TEXT="testnode 7 2 9047" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9048" TEXT="testnode 7 3 9048" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9049" TEXT="testnode 7 4 9049" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9050" TEXT="testnode 7 5 9050" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9051" TEXT="testnode 7 6 9051" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9052" TEXT="testnode 7 7 9052" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9053" TEXT="testnode 6 3 9053" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9054" TEXT="testnode 7 1 9054" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9055" TEXT="testnode 7 2 9055" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9056" TEXT="testnode 7 3 9056" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9057" TEXT="testnode 7 4 9057" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9058" TEXT="testnode 7 5 9058" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9059" TEXT="testnode 7 6 9059" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9060" TEXT="testnode 7 7 9060" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9061" TEXT="testnode 6 4 9061" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9062" TEXT="testnode 7 1 9062" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9063" TEXT="testnode 7 2 9063" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9064" TEXT="testnode 7 3 9064" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9065" TEXT="testnode 7 4 9065" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9066" TEXT="testnode 7 5 9066" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9067" TEXT="testnode 7 6 9067" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9068" TEXT="testnode 7 7 9068" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9069" TEXT="testnode 6 5 9069" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9070" TEXT="testnode 7 1 9070" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9071" TEXT="testnode 7 2 9071" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9072" TEXT="testnode 7 3 9072" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9073" TEXT="testnode 7 4 9073" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9074" TEXT="testnode 7 5 9074" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9075" TEXT="testnode 7 6 9075" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9076" TEXT="testnode 7 7 9076" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9077" TEXT="testnode 6 6 9077" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9078" TEXT="testnode 7 1 9078" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9079" TEXT="testnode 7 2 9079" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9080" TEXT="testnode 7 3 9080" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9081" TEXT="testnode 7 4 9081" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9082" TEXT="testnode 7 5 9082" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9083" TEXT="testnode 7 6 9083" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9084" TEXT="testnode 7 7 9084" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9085" TEXT="testnode 6 7 9085" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9086" TEXT="testnode 7 1 9086" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9087" TEXT="testnode 7 2 9087" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9088" TEXT="testnode 7 3 9088" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9089" TEXT="testnode 7 4 9089" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9090" TEXT="testnode 7 5 9090" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9091" TEXT="testnode 7 6 9091" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9092" TEXT="testnode 7 7 9092" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9093" TEXT="testnode 5 6 9093" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9094" TEXT="testnode 6 1 9094" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9095" TEXT="testnode 7 1 9095" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9096" TEXT="testnode 7 2 9096" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9097" TEXT="testnode 7 3 9097" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9098" TEXT="testnode 7 4 9098" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9099" TEXT="testnode 7 5 9099" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9100" TEXT="testnode 7 6 9100" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9101" TEXT="testnode 7 7 9101" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9102" TEXT="testnode 6 2 9102" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9103" TEXT="testnode 7 1 9103" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9104" TEXT="testnode 7 2 9104" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9105" TEXT="testnode 7 3 9105" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9106" TEXT="testnode 7 4 9106" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9107" TEXT="testnode 7 5 9107" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9108" TEXT="testnode 7 6 9108" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9109" TEXT="testnode 7 7 9109" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9110" TEXT="testnode 6 3 9110" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9111" TEXT="testnode 7 1 9111" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9112" TEXT="testnode 7 2 9112" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9113" TEXT="testnode 7 3 9113" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9114" TEXT="testnode 7 4 9114" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9115" TEXT="testnode 7 5 9115" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9116" TEXT="testnode 7 6 9116" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9117" TEXT="testnode 7 7 9117" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9118" TEXT="testnode 6 4 9118" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9119" TEXT="testnode 7 1 9119" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9120" TEXT="testnode 7 2 9120" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9121" TEXT="testnode 7 3 9121" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9122" TEXT="testnode 7 4 9122" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9123" TEXT="testnode 7 5 9123" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9124" TEXT="testnode 7 6 9124" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9125" TEXT="testnode 7 7 9125" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9126" TEXT="testnode 6 5 9126" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9127" TEXT="testnode 7 1 9127" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9128" TEXT="testnode 7 2 9128" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9129" TEXT="testnode 7 3 9129" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9130" TEXT="testnode 7 4 9130" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9131" TEXT="testnode 7 5 9131" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9132" TEXT="testnode 7 6 9132" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9133" TEXT="testnode 7 7 9133" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9134" TEXT="testnode 6 6 9134" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9135" TEXT="testnode 7 1 9135" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9136" TEXT="testnode 7 2 9136" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9137" TEXT="testnode 7 3 9137" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9138" TEXT="testnode 7 4 9138" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9139" TEXT="testnode 7 5 9139" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9140" TEXT="testnode 7 6 9140" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9141" TEXT="testnode 7 7 9141" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9142" TEXT="testnode 6 7 9142" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9143" TEXT="testnode 7 1 9143" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9144" TEXT="testnode 7 2 9144" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9145" TEXT="testnode 7 3 9145" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9146" TEXT="testnode 7 4 9146" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9147" TEXT="testnode 7 5 9147" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9148" TEXT="testnode 7 6 9148" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9149" TEXT="testnode 7 7 9149" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9150" TEXT="testnode 5 7 9150" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9151" TEXT="testnode 6 1 9151" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9152" TEXT="testnode 7 1 9152" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9153" TEXT="testnode 7 2 9153" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9154" TEXT="testnode 7 3 9154" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9155" TEXT="testnode 7 4 9155" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9156" TEXT="testnode 7 5 9156" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9157" TEXT="testnode 7 6 9157" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9158" TEXT="testnode 7 7 9158" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9159" TEXT="testnode 6 2 9159" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9160" TEXT="testnode 7 1 9160" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9161" TEXT="testnode 7 2 9161" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9162" TEXT="testnode 7 3 9162" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9163" TEXT="testnode 7 4 9163" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9164" TEXT="testnode 7 5 9164" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9165" TEXT="testnode 7 6 9165" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9166" TEXT="testnode 7 7 9166" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9167" TEXT="testnode 6 3 9167" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9168" TEXT="testnode 7 1 9168" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9169" TEXT="testnode 7 2 9169" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9170" TEXT="testnode 7 3 9170" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9171" TEXT="testnode 7 4 9171" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9172" TEXT="testnode 7 5 9172" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9173" TEXT="testnode 7 6 9173" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9174" TEXT="testnode 7 7 9174" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9175" TEXT="testnode 6 4 9175" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9176" TEXT="testnode 7 1 9176" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9177" TEXT="testnode 7 2 9177" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9178" TEXT="testnode 7 3 9178" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9179" TEXT="testnode 7 4 9179" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9180" TEXT="testnode 7 5 9180" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9181" TEXT="testnode 7 6 9181" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9182" TEXT="testnode 7 7 9182" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9183" TEXT="testnode 6 5 9183" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9184" TEXT="testnode 7 1 9184" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9185" TEXT="testnode 7 2 9185" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9186" TEXT="testnode 7 3 9186" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9187" TEXT="testnode 7 4 9187" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9188" TEXT="testnode 7 5 9188" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9189" TEXT="testnode 7 6 9189" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9190" TEXT="testnode 7 7 9190" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9191" TEXT="testnode 6 6 9191" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9192" TEXT="testnode 7 1 9192" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9193" TEXT="testnode 7 2 9193" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9194" TEXT="testnode 7 3 9194" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9195" TEXT="testnode 7 4 9195" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9196" TEXT="testnode 7 5 9196" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9197" TEXT="testnode 7 6 9197" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9198" TEXT="testnode 7 7 9198" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9199" TEXT="testnode 6 7 9199" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9200" TEXT="testnode 7 1 9200" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9201" TEXT="testnode 7 2 9201" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9202" TEXT="testnode 7 3 9202" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9203" TEXT="testnode 7 4 9203" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9204" TEXT="testnode 7 5 9204" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9205" TEXT="testnode 7 6 9205" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9206" TEXT="testnode 7 7 9206" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9207" TEXT="testnode 4 3 9207" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_9208" TEXT="testnode 5 1 9208" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9209" TEXT="testnode 6 1 9209" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9210" TEXT="testnode 7 1 9210" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9211" TEXT="testnode 7 2 9211" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9212" TEXT="testnode 7 3 9212" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9213" TEXT="testnode 7 4 9213" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9214" TEXT="testnode 7 5 9214" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9215" TEXT="testnode 7 6 9215" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9216" TEXT="testnode 7 7 9216" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9217" TEXT="testnode 6 2 9217" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9218" TEXT="testnode 7 1 9218" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9219" TEXT="testnode 7 2 9219" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9220" TEXT="testnode 7 3 9220" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9221" TEXT="testnode 7 4 9221" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9222" TEXT="testnode 7 5 9222" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9223" TEXT="testnode 7 6 9223" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9224" TEXT="testnode 7 7 9224" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9225" TEXT="testnode 6 3 9225" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9226" TEXT="testnode 7 1 9226" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9227" TEXT="testnode 7 2 9227" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9228" TEXT="testnode 7 3 9228" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9229" TEXT="testnode 7 4 9229" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9230" TEXT="testnode 7 5 9230" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9231" TEXT="testnode 7 6 9231" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9232" TEXT="testnode 7 7 9232" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9233" TEXT="testnode 6 4 9233" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9234" TEXT="testnode 7 1 9234" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9235" TEXT="testnode 7 2 9235" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9236" TEXT="testnode 7 3 9236" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9237" TEXT="testnode 7 4 9237" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9238" TEXT="testnode 7 5 9238" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9239" TEXT="testnode 7 6 9239" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9240" TEXT="testnode 7 7 9240" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9241" TEXT="testnode 6 5 9241" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9242" TEXT="testnode 7 1 9242" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9243" TEXT="testnode 7 2 9243" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9244" TEXT="testnode 7 3 9244" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9245" TEXT="testnode 7 4 9245" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9246" TEXT="testnode 7 5 9246" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9247" TEXT="testnode 7 6 9247" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9248" TEXT="testnode 7 7 9248" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9249" TEXT="testnode 6 6 9249" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9250" TEXT="testnode 7 1 9250" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9251" TEXT="testnode 7 2 9251" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9252" TEXT="testnode 7 3 9252" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9253" TEXT="testnode 7 4 9253" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9254" TEXT="testnode 7 5 9254" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9255" TEXT="testnode 7 6 9255" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9256" TEXT="testnode 7 7 9256" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9257" TEXT="testnode 6 7 9257" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9258" TEXT="testnode 7 1 9258" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9259" TEXT="testnode 7 2 9259" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9260" TEXT="testnode 7 3 9260" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9261" TEXT="testnode 7 4 9261" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9262" TEXT="testnode 7 5 9262" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9263" TEXT="testnode 7 6 9263" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9264" TEXT="testnode 7 7 9264" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9265" TEXT="testnode 5 2 9265" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9266" TEXT="testnode 6 1 9266" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9267" TEXT="testnode 7 1 9267" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9268" TEXT="testnode 7 2 9268" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9269" TEXT="testnode 7 3 9269" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9270" TEXT="testnode 7 4 9270" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9271" TEXT="testnode 7 5 9271" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9272" TEXT="testnode 7 6 9272" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9273" TEXT="testnode 7 7 9273" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9274" TEXT="testnode 6 2 9274" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9275" TEXT="testnode 7 1 9275" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9276" TEXT="testnode 7 2 9276" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9277" TEXT="testnode 7 3 9277" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9278" TEXT="testnode 7 4 9278" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9279" TEXT="testnode 7 5 9279" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9280" TEXT="testnode 7 6 9280" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9281" TEXT="testnode 7 7 9281" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9282" TEXT="testnode 6 3 9282" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9283" TEXT="testnode 7 1 9283" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9284" TEXT="testnode 7 2 9284" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9285" TEXT="testnode 7 3 9285" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9286" TEXT="testnode 7 4 9286" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9287" TEXT="testnode 7 5 9287" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9288" TEXT="testnode 7 6 9288" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9289" TEXT="testnode 7 7 9289" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9290" TEXT="testnode 6 4 9290" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9291" TEXT="testnode 7 1 9291" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9292" TEXT="testnode 7 2 9292" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9293" TEXT="testnode 7 3 9293" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9294" TEXT="testnode 7 4 9294" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9295" TEXT="testnode 7 5 9295" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9296" TEXT="testnode 7 6 9296" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9297" TEXT="testnode 7 7 9297" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9298" TEXT="testnode 6 5 9298" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9299" TEXT="testnode 7 1 9299" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9300" TEXT="testnode 7 2 9300" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9301" TEXT="testnode 7 3 9301" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9302" TEXT="testnode 7 4 9302" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9303" TEXT="testnode 7 5 9303" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9304" TEXT="testnode 7 6 9304" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9305" TEXT="testnode 7 7 9305" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9306" TEXT="testnode 6 6 9306" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9307" TEXT="testnode 7 1 9307" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9308" TEXT="testnode 7 2 9308" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9309" TEXT="testnode 7 3 9309" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9310" TEXT="testnode 7 4 9310" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9311" TEXT="testnode 7 5 9311" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9312" TEXT="testnode 7 6 9312" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9313" TEXT="testnode 7 7 9313" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9314" TEXT="testnode 6 7 9314" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9315" TEXT="testnode 7 1 9315" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9316" TEXT="testnode 7 2 9316" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9317" TEXT="testnode 7 3 9317" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9318" TEXT="testnode 7 4 9318" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9319" TEXT="testnode 7 5 9319" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9320" TEXT="testnode 7 6 9320" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9321" TEXT="testnode 7 7 9321" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9322" TEXT="testnode 5 3 9322" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9323" TEXT="testnode 6 1 9323" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9324" TEXT="testnode 7 1 9324" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9325" TEXT="testnode 7 2 9325" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9326" TEXT="testnode 7 3 9326" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9327" TEXT="testnode 7 4 9327" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9328" TEXT="testnode 7 5 9328" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9329" TEXT="testnode 7 6 9329" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9330" TEXT="testnode 7 7 9330" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9331" TEXT="testnode 6 2 9331" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9332" TEXT="testnode 7 1 9332" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9333" TEXT="testnode 7 2 9333" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9334" TEXT="testnode 7 3 9334" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9335" TEXT="testnode 7 4 9335" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9336" TEXT="testnode 7 5 9336" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9337" TEXT="testnode 7 6 9337" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9338" TEXT="testnode 7 7 9338" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9339" TEXT="testnode 6 3 9339" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9340" TEXT="testnode 7 1 9340" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9341" TEXT="testnode 7 2 9341" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9342" TEXT="testnode 7 3 9342" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9343" TEXT="testnode 7 4 9343" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9344" TEXT="testnode 7 5 9344" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9345" TEXT="testnode 7 6 9345" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9346" TEXT="testnode 7 7 9346" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9347" TEXT="testnode 6 4 9347" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9348" TEXT="testnode 7 1 9348" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9349" TEXT="testnode 7 2 9349" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9350" TEXT="testnode 7 3 9350" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9351" TEXT="testnode 7 4 9351" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9352" TEXT="testnode 7 5 9352" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9353" TEXT="testnode 7 6 9353" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9354" TEXT="testnode 7 7 9354" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9355" TEXT="testnode 6 5 9355" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9356" TEXT="testnode 7 1 9356" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9357" TEXT="testnode 7 2 9357" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9358" TEXT="testnode 7 3 9358" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9359" TEXT="testnode 7 4 9359" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9360" TEXT="testnode 7 5 9360" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9361" TEXT="testnode 7 6 9361" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9362" TEXT="testnode 7 7 9362" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9363" TEXT="testnode 6 6 9363" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9364" TEXT="testnode 7 1 9364" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9365" TEXT="testnode 7 2 9365" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9366" TEXT="testnode 7 3 9366" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9367" TEXT="testnode 7 4 9367" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9368" TEXT="testnode 7 5 9368" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9369" TEXT="testnode 7 6 9369" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9370" TEXT="testnode 7 7 9370" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9371" TEXT="testnode 6 7 9371" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9372" TEXT="testnode 7 1 9372" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9373" TEXT="testnode 7 2 9373" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9374" TEXT="testnode 7 3 9374" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9375" TEXT="testnode 7 4 9375" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9376" TEXT="testnode 7 5 9376" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9377" TEXT="testnode 7 6 9377" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9378" TEXT="testnode 7 7 9378" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9379" TEXT="testnode 5 4 9379" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9380" TEXT="testnode 6 1 9380" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9381" TEXT="testnode 7 1 9381" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9382" TEXT="testnode 7 2 9382" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9383" TEXT="testnode 7 3 9383" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9384" TEXT="testnode 7 4 9384" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9385" TEXT="testnode 7 5 9385" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9386" TEXT="testnode 7 6 9386" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9387" TEXT="testnode 7 7 9387" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9388" TEXT="testnode 6 2 9388" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9389" TEXT="testnode 7 1 9389" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9390" TEXT="testnode 7 2 9390" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9391" TEXT="testnode 7 3 9391" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9392" TEXT="testnode 7 4 9392" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9393" TEXT="testnode 7 5 9393" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9394" TEXT="testnode 7 6 9394" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9395" TEXT="testnode 7 7 9395" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9396" TEXT="testnode 6 3 9396" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9397" TEXT="testnode 7 1 9397" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9398" TEXT="testnode 7 2 9398" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9399" TEXT="testnode 7 3 9399" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9400" TEXT="testnode 7 4 9400" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9401" TEXT="testnode 7 5 9401" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9402" TEXT="testnode 7 6 9402" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9403" TEXT="testnode 7 7 9403" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9404" TEXT="testnode 6 4 9404" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9405" TEXT="testnode 7 1 9405" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9406" TEXT="testnode 7 2 9406" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9407" TEXT="testnode 7 3 9407" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9408" TEXT="testnode 7 4 9408" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9409" TEXT="testnode 7 5 9409" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9410" TEXT="testnode 7 6 9410" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9411" TEXT="testnode 7 7 9411" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9412" TEXT="testnode 6 5 9412" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9413" TEXT="testnode 7 1 9413" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9414" TEXT="testnode 7 2 9414" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9415" TEXT="testnode 7 3 9415" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9416" TEXT="testnode 7 4 9416" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9417" TEXT="testnode 7 5 9417" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9418" TEXT="testnode 7 6 9418" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9419" TEXT="testnode 7 7 9419" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9420" TEXT="testnode 6 6 9420" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9421" TEXT="testnode 7 1 9421" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9422" TEXT="testnode 7 2 9422" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9423" TEXT="testnode 7 3 9423" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9424" TEXT="testnode 7 4 9424" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9425" TEXT="testnode 7 5 9425" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9426" TEXT="testnode 7 6 9426" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9427" TEXT="testnode 7 7 9427" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9428" TEXT="testnode 6 7 9428" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9429" TEXT="testnode 7 1 9429" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9430" TEXT="testnode 7 2 9430" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9431" TEXT="testnode 7 3 9431" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9432" TEXT="testnode 7 4 9432" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9433" TEXT="testnode 7 5 9433" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9434" TEXT="testnode 7 6 9434" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9435" TEXT="testnode 7 7 9435" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9436" TEXT="testnode 5 5 9436" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9437" TEXT="testnode 6 1 9437" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9438" TEXT="testnode 7 1 9438" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9439" TEXT="testnode 7 2 9439" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9440" TEXT="testnode 7 3 9440" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9441" TEXT="testnode 7 4 9441" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9442" TEXT="testnode 7 5 9442" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9443" TEXT="testnode 7 6 9443" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9444" TEXT="testnode 7 7 9444" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9445" TEXT="testnode 6 2 9445" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9446" TEXT="testnode 7 1 9446" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9447" TEXT="testnode 7 2 9447" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9448" TEXT="testnode 7 3 9448" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9449" TEXT="testnode 7 4 9449" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9450" TEXT="testnode 7 5 9450" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9451" TEXT="testnode 7 6 9451" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9452" TEXT="testnode 7 7 9452" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9453" TEXT="testnode 6 3 9453" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9454" TEXT="testnode 7 1 9454" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9455" TEXT="testnode 7 2 9455" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9456" TEXT="testnode 7 3 9456" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9457" TEXT="testnode 7 4 9457" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9458" TEXT="testnode 7 5 9458" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9459" TEXT="testnode 7 6 9459" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9460" TEXT="testnode 7 7 9460" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9461" TEXT="testnode 6 4 9461" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9462" TEXT="testnode 7 1 9462" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9463" TEXT="testnode 7 2 9463" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9464" TEXT="testnode 7 3 9464" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9465" TEXT="testnode 7 4 9465" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9466" TEXT="testnode 7 5 9466" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9467" TEXT="testnode 7 6 9467" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9468" TEXT="testnode 7 7 9468" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9469" TEXT="testnode 6 5 9469" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9470" TEXT="testnode 7 1 9470" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9471" TEXT="testnode 7 2 9471" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9472" TEXT="testnode 7 3 9472" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9473" TEXT="testnode 7 4 9473" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9474" TEXT="testnode 7 5 9474" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9475" TEXT="testnode 7 6 9475" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9476" TEXT="testnode 7 7 9476" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9477" TEXT="testnode 6 6 9477" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9478" TEXT="testnode 7 1 9478" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9479" TEXT="testnode 7 2 9479" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9480" TEXT="testnode 7 3 9480" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9481" TEXT="testnode 7 4 9481" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9482" TEXT="testnode 7 5 9482" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9483" TEXT="testnode 7 6 9483" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9484" TEXT="testnode 7 7 9484" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9485" TEXT="testnode 6 7 9485" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9486" TEXT="testnode 7 1 9486" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9487" TEXT="testnode 7 2 9487" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9488" TEXT="testnode 7 3 9488" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9489" TEXT="testnode 7 4 9489" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9490" TEXT="testnode 7 5 9490" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9491" TEXT="testnode 7 6 9491" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9492" TEXT="testnode 7 7 9492" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9493" TEXT="testnode 5 6 9493" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9494" TEXT="testnode 6 1 9494" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9495" TEXT="testnode 7 1 9495" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9496" TEXT="testnode 7 2 9496" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9497" TEXT="testnode 7 3 9497" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9498" TEXT="testnode 7 4 9498" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9499" TEXT="testnode 7 5 9499" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9500" TEXT="testnode 7 6 9500" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9501" TEXT="testnode 7 7 9501" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9502" TEXT="testnode 6 2 9502" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9503" TEXT="testnode 7 1 9503" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9504" TEXT="testnode 7 2 9504" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9505" TEXT="testnode 7 3 9505" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9506" TEXT="testnode 7 4 9506" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9507" TEXT="testnode 7 5 9507" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9508" TEXT="testnode 7 6 9508" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9509" TEXT="testnode 7 7 9509" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9510" TEXT="testnode 6 3 9510" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9511" TEXT="testnode 7 1 9511" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9512" TEXT="testnode 7 2 9512" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9513" TEXT="testnode 7 3 9513" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9514" TEXT="testnode 7 4 9514" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9515" TEXT="testnode 7 5 9515" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9516" TEXT="testnode 7 6 9516" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9517" TEXT="testnode 7 7 9517" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9518" TEXT="testnode 6 4 9518" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9519" TEXT="testnode 7 1 9519" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9520" TEXT="testnode 7 2 9520" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9521" TEXT="testnode 7 3 9521" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9522" TEXT="testnode 7 4 9522" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9523" TEXT="testnode 7 5 9523" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9524" TEXT="testnode 7 6 9524" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9525" TEXT="testnode 7 7 9525" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9526" TEXT="testnode 6 5 9526" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9527" TEXT="testnode 7 1 9527" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9528" TEXT="testnode 7 2 9528" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9529" TEXT="testnode 7 3 9529" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9530" TEXT="testnode 7 4 9530" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9531" TEXT="testnode 7 5 9531" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9532" TEXT="testnode 7 6 9532" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9533" TEXT="testnode 7 7 9533" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9534" TEXT="testnode 6 6 9534" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9535" TEXT="testnode 7 1 9535" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9536" TEXT="testnode 7 2 9536" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9537" TEXT="testnode 7 3 9537" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9538" TEXT="testnode 7 4 9538" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9539" TEXT="testnode 7 5 9539" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9540" TEXT="testnode 7 6 9540" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9541" TEXT="testnode 7 7 9541" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9542" TEXT="testnode 6 7 9542" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9543" TEXT="testnode 7 1 9543" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9544" TEXT="testnode 7 2 9544" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9545" TEXT="testnode 7 3 9545" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9546" TEXT="testnode 7 4 9546" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9547" TEXT="testnode 7 5 9547" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9548" TEXT="testnode 7 6 9548" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9549" TEXT="testnode 7 7 9549" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9550" TEXT="testnode 5 7 9550" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9551" TEXT="testnode 6 1 9551" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9552" TEXT="testnode 7 1 9552" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9553" TEXT="testnode 7 2 9553" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9554" TEXT="testnode 7 3 9554" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9555" TEXT="testnode 7 4 9555" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9556" TEXT="testnode 7 5 9556" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9557" TEXT="testnode 7 6 9557" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9558" TEXT="testnode 7 7 9558" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9559" TEXT="testnode 6 2 9559" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9560" TEXT="testnode 7 1 9560" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9561" TEXT="testnode 7 2 9561" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9562" TEXT="testnode 7 3 9562" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9563" TEXT="testnode 7 4 9563" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9564" TEXT="testnode 7 5 9564" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9565" TEXT="testnode 7 6 9565" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9566" TEXT="testnode 7 7 9566" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9567" TEXT="testnode 6 3 9567" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9568" TEXT="testnode 7 1 9568" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9569" TEXT="testnode 7 2 9569" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9570" TEXT="testnode 7 3 9570" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9571" TEXT="testnode 7 4 9571" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9572" TEXT="testnode 7 5 9572" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9573" TEXT="testnode 7 6 9573" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9574" TEXT="testnode 7 7 9574" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9575" TEXT="testnode 6 4 9575" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9576" TEXT="testnode 7 1 9576" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9577" TEXT="testnode 7 2 9577" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9578" TEXT="testnode 7 3 9578" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9579" TEXT="testnode 7 4 9579" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9580" TEXT="testnode 7 5 9580" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9581" TEXT="testnode 7 6 9581" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9582" TEXT="testnode 7 7 9582" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9583" TEXT="testnode 6 5 9583" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9584" TEXT="testnode 7 1 9584" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9585" TEXT="testnode 7 2 9585" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9586" TEXT="testnode 7 3 9586" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9587" TEXT="testnode 7 4 9587" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9588" TEXT="testnode 7 5 9588" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9589" TEXT="testnode 7 6 9589" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9590" TEXT="testnode 7 7 9590" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9591" TEXT="testnode 6 6 9591" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9592" TEXT="testnode 7 1 9592" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9593" TEXT="testnode 7 2 9593" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9594" TEXT="testnode 7 3 9594" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9595" TEXT="testnode 7 4 9595" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9596" TEXT="testnode 7 5 9596" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9597" TEXT="testnode 7 6 9597" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9598" TEXT="testnode 7 7 9598" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9599" TEXT="testnode 6 7 9599" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9600" TEXT="testnode 7 1 9600" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9601" TEXT="testnode 7 2 9601" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9602" TEXT="testnode 7 3 9602" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9603" TEXT="testnode 7 4 9603" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9604" TEXT="testnode 7 5 9604" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9605" TEXT="testnode 7 6 9605" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9606" TEXT="testnode 7 7 9606" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9607" TEXT="testnode 4 4 9607" FOLDED = "true">
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- <node ID="Freemind_Link_9608" TEXT="testnode 5 1 9608" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9609" TEXT="testnode 6 1 9609" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9610" TEXT="testnode 7 1 9610" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9611" TEXT="testnode 7 2 9611" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9612" TEXT="testnode 7 3 9612" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9613" TEXT="testnode 7 4 9613" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9614" TEXT="testnode 7 5 9614" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9615" TEXT="testnode 7 6 9615" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9616" TEXT="testnode 7 7 9616" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9617" TEXT="testnode 6 2 9617" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9618" TEXT="testnode 7 1 9618" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9619" TEXT="testnode 7 2 9619" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9620" TEXT="testnode 7 3 9620" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9621" TEXT="testnode 7 4 9621" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9622" TEXT="testnode 7 5 9622" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9623" TEXT="testnode 7 6 9623" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9624" TEXT="testnode 7 7 9624" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9625" TEXT="testnode 6 3 9625" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9626" TEXT="testnode 7 1 9626" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9627" TEXT="testnode 7 2 9627" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9628" TEXT="testnode 7 3 9628" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9629" TEXT="testnode 7 4 9629" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9630" TEXT="testnode 7 5 9630" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9631" TEXT="testnode 7 6 9631" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9632" TEXT="testnode 7 7 9632" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9633" TEXT="testnode 6 4 9633" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9634" TEXT="testnode 7 1 9634" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9635" TEXT="testnode 7 2 9635" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9636" TEXT="testnode 7 3 9636" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9637" TEXT="testnode 7 4 9637" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9638" TEXT="testnode 7 5 9638" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9639" TEXT="testnode 7 6 9639" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9640" TEXT="testnode 7 7 9640" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9641" TEXT="testnode 6 5 9641" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9642" TEXT="testnode 7 1 9642" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9643" TEXT="testnode 7 2 9643" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9644" TEXT="testnode 7 3 9644" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9645" TEXT="testnode 7 4 9645" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9646" TEXT="testnode 7 5 9646" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9647" TEXT="testnode 7 6 9647" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9648" TEXT="testnode 7 7 9648" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9649" TEXT="testnode 6 6 9649" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9650" TEXT="testnode 7 1 9650" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9651" TEXT="testnode 7 2 9651" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9652" TEXT="testnode 7 3 9652" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9653" TEXT="testnode 7 4 9653" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9654" TEXT="testnode 7 5 9654" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9655" TEXT="testnode 7 6 9655" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9656" TEXT="testnode 7 7 9656" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9657" TEXT="testnode 6 7 9657" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9658" TEXT="testnode 7 1 9658" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9659" TEXT="testnode 7 2 9659" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9660" TEXT="testnode 7 3 9660" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9661" TEXT="testnode 7 4 9661" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9662" TEXT="testnode 7 5 9662" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9663" TEXT="testnode 7 6 9663" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9664" TEXT="testnode 7 7 9664" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9665" TEXT="testnode 5 2 9665" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9666" TEXT="testnode 6 1 9666" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9667" TEXT="testnode 7 1 9667" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9668" TEXT="testnode 7 2 9668" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9669" TEXT="testnode 7 3 9669" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9670" TEXT="testnode 7 4 9670" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9671" TEXT="testnode 7 5 9671" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9672" TEXT="testnode 7 6 9672" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9673" TEXT="testnode 7 7 9673" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9674" TEXT="testnode 6 2 9674" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9675" TEXT="testnode 7 1 9675" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9676" TEXT="testnode 7 2 9676" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9677" TEXT="testnode 7 3 9677" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9678" TEXT="testnode 7 4 9678" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9679" TEXT="testnode 7 5 9679" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9680" TEXT="testnode 7 6 9680" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9681" TEXT="testnode 7 7 9681" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9682" TEXT="testnode 6 3 9682" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9683" TEXT="testnode 7 1 9683" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9684" TEXT="testnode 7 2 9684" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9685" TEXT="testnode 7 3 9685" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9686" TEXT="testnode 7 4 9686" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9687" TEXT="testnode 7 5 9687" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9688" TEXT="testnode 7 6 9688" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9689" TEXT="testnode 7 7 9689" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9690" TEXT="testnode 6 4 9690" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9691" TEXT="testnode 7 1 9691" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9692" TEXT="testnode 7 2 9692" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9693" TEXT="testnode 7 3 9693" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9694" TEXT="testnode 7 4 9694" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9695" TEXT="testnode 7 5 9695" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9696" TEXT="testnode 7 6 9696" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9697" TEXT="testnode 7 7 9697" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9698" TEXT="testnode 6 5 9698" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9699" TEXT="testnode 7 1 9699" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9700" TEXT="testnode 7 2 9700" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9701" TEXT="testnode 7 3 9701" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9702" TEXT="testnode 7 4 9702" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9703" TEXT="testnode 7 5 9703" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9704" TEXT="testnode 7 6 9704" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9705" TEXT="testnode 7 7 9705" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9706" TEXT="testnode 6 6 9706" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9707" TEXT="testnode 7 1 9707" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9708" TEXT="testnode 7 2 9708" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9709" TEXT="testnode 7 3 9709" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9710" TEXT="testnode 7 4 9710" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9711" TEXT="testnode 7 5 9711" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9712" TEXT="testnode 7 6 9712" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9713" TEXT="testnode 7 7 9713" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9714" TEXT="testnode 6 7 9714" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9715" TEXT="testnode 7 1 9715" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9716" TEXT="testnode 7 2 9716" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9717" TEXT="testnode 7 3 9717" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9718" TEXT="testnode 7 4 9718" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9719" TEXT="testnode 7 5 9719" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9720" TEXT="testnode 7 6 9720" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9721" TEXT="testnode 7 7 9721" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9722" TEXT="testnode 5 3 9722" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9723" TEXT="testnode 6 1 9723" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9724" TEXT="testnode 7 1 9724" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9725" TEXT="testnode 7 2 9725" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9726" TEXT="testnode 7 3 9726" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9727" TEXT="testnode 7 4 9727" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9728" TEXT="testnode 7 5 9728" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9729" TEXT="testnode 7 6 9729" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9730" TEXT="testnode 7 7 9730" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9731" TEXT="testnode 6 2 9731" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9732" TEXT="testnode 7 1 9732" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9733" TEXT="testnode 7 2 9733" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9734" TEXT="testnode 7 3 9734" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9735" TEXT="testnode 7 4 9735" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9736" TEXT="testnode 7 5 9736" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9737" TEXT="testnode 7 6 9737" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9738" TEXT="testnode 7 7 9738" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9739" TEXT="testnode 6 3 9739" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9740" TEXT="testnode 7 1 9740" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9741" TEXT="testnode 7 2 9741" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9742" TEXT="testnode 7 3 9742" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9743" TEXT="testnode 7 4 9743" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9744" TEXT="testnode 7 5 9744" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9745" TEXT="testnode 7 6 9745" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9746" TEXT="testnode 7 7 9746" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9747" TEXT="testnode 6 4 9747" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9748" TEXT="testnode 7 1 9748" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9749" TEXT="testnode 7 2 9749" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9750" TEXT="testnode 7 3 9750" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9751" TEXT="testnode 7 4 9751" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9752" TEXT="testnode 7 5 9752" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9753" TEXT="testnode 7 6 9753" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9754" TEXT="testnode 7 7 9754" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9755" TEXT="testnode 6 5 9755" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9756" TEXT="testnode 7 1 9756" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9757" TEXT="testnode 7 2 9757" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9758" TEXT="testnode 7 3 9758" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9759" TEXT="testnode 7 4 9759" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9760" TEXT="testnode 7 5 9760" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9761" TEXT="testnode 7 6 9761" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9762" TEXT="testnode 7 7 9762" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9763" TEXT="testnode 6 6 9763" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9764" TEXT="testnode 7 1 9764" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9765" TEXT="testnode 7 2 9765" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9766" TEXT="testnode 7 3 9766" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9767" TEXT="testnode 7 4 9767" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9768" TEXT="testnode 7 5 9768" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9769" TEXT="testnode 7 6 9769" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9770" TEXT="testnode 7 7 9770" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9771" TEXT="testnode 6 7 9771" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9772" TEXT="testnode 7 1 9772" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9773" TEXT="testnode 7 2 9773" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9774" TEXT="testnode 7 3 9774" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9775" TEXT="testnode 7 4 9775" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9776" TEXT="testnode 7 5 9776" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9777" TEXT="testnode 7 6 9777" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9778" TEXT="testnode 7 7 9778" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9779" TEXT="testnode 5 4 9779" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9780" TEXT="testnode 6 1 9780" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9781" TEXT="testnode 7 1 9781" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9782" TEXT="testnode 7 2 9782" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9783" TEXT="testnode 7 3 9783" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9784" TEXT="testnode 7 4 9784" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9785" TEXT="testnode 7 5 9785" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9786" TEXT="testnode 7 6 9786" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9787" TEXT="testnode 7 7 9787" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9788" TEXT="testnode 6 2 9788" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9789" TEXT="testnode 7 1 9789" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9790" TEXT="testnode 7 2 9790" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9791" TEXT="testnode 7 3 9791" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9792" TEXT="testnode 7 4 9792" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9793" TEXT="testnode 7 5 9793" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9794" TEXT="testnode 7 6 9794" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9795" TEXT="testnode 7 7 9795" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9796" TEXT="testnode 6 3 9796" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9797" TEXT="testnode 7 1 9797" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9798" TEXT="testnode 7 2 9798" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9799" TEXT="testnode 7 3 9799" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9800" TEXT="testnode 7 4 9800" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9801" TEXT="testnode 7 5 9801" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9802" TEXT="testnode 7 6 9802" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9803" TEXT="testnode 7 7 9803" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9804" TEXT="testnode 6 4 9804" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9805" TEXT="testnode 7 1 9805" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9806" TEXT="testnode 7 2 9806" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9807" TEXT="testnode 7 3 9807" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9808" TEXT="testnode 7 4 9808" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9809" TEXT="testnode 7 5 9809" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9810" TEXT="testnode 7 6 9810" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9811" TEXT="testnode 7 7 9811" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9812" TEXT="testnode 6 5 9812" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9813" TEXT="testnode 7 1 9813" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9814" TEXT="testnode 7 2 9814" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9815" TEXT="testnode 7 3 9815" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9816" TEXT="testnode 7 4 9816" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9817" TEXT="testnode 7 5 9817" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9818" TEXT="testnode 7 6 9818" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9819" TEXT="testnode 7 7 9819" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9820" TEXT="testnode 6 6 9820" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9821" TEXT="testnode 7 1 9821" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9822" TEXT="testnode 7 2 9822" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9823" TEXT="testnode 7 3 9823" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9824" TEXT="testnode 7 4 9824" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9825" TEXT="testnode 7 5 9825" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9826" TEXT="testnode 7 6 9826" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9827" TEXT="testnode 7 7 9827" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9828" TEXT="testnode 6 7 9828" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9829" TEXT="testnode 7 1 9829" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9830" TEXT="testnode 7 2 9830" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9831" TEXT="testnode 7 3 9831" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9832" TEXT="testnode 7 4 9832" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9833" TEXT="testnode 7 5 9833" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9834" TEXT="testnode 7 6 9834" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9835" TEXT="testnode 7 7 9835" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9836" TEXT="testnode 5 5 9836" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9837" TEXT="testnode 6 1 9837" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9838" TEXT="testnode 7 1 9838" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9839" TEXT="testnode 7 2 9839" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9840" TEXT="testnode 7 3 9840" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9841" TEXT="testnode 7 4 9841" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9842" TEXT="testnode 7 5 9842" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9843" TEXT="testnode 7 6 9843" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9844" TEXT="testnode 7 7 9844" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9845" TEXT="testnode 6 2 9845" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9846" TEXT="testnode 7 1 9846" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9847" TEXT="testnode 7 2 9847" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9848" TEXT="testnode 7 3 9848" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9849" TEXT="testnode 7 4 9849" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9850" TEXT="testnode 7 5 9850" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9851" TEXT="testnode 7 6 9851" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9852" TEXT="testnode 7 7 9852" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9853" TEXT="testnode 6 3 9853" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9854" TEXT="testnode 7 1 9854" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9855" TEXT="testnode 7 2 9855" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9856" TEXT="testnode 7 3 9856" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9857" TEXT="testnode 7 4 9857" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9858" TEXT="testnode 7 5 9858" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9859" TEXT="testnode 7 6 9859" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9860" TEXT="testnode 7 7 9860" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9861" TEXT="testnode 6 4 9861" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9862" TEXT="testnode 7 1 9862" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9863" TEXT="testnode 7 2 9863" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9864" TEXT="testnode 7 3 9864" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9865" TEXT="testnode 7 4 9865" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9866" TEXT="testnode 7 5 9866" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9867" TEXT="testnode 7 6 9867" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9868" TEXT="testnode 7 7 9868" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9869" TEXT="testnode 6 5 9869" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9870" TEXT="testnode 7 1 9870" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9871" TEXT="testnode 7 2 9871" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9872" TEXT="testnode 7 3 9872" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9873" TEXT="testnode 7 4 9873" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9874" TEXT="testnode 7 5 9874" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9875" TEXT="testnode 7 6 9875" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9876" TEXT="testnode 7 7 9876" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9877" TEXT="testnode 6 6 9877" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9878" TEXT="testnode 7 1 9878" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9879" TEXT="testnode 7 2 9879" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9880" TEXT="testnode 7 3 9880" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9881" TEXT="testnode 7 4 9881" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9882" TEXT="testnode 7 5 9882" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9883" TEXT="testnode 7 6 9883" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9884" TEXT="testnode 7 7 9884" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9885" TEXT="testnode 6 7 9885" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9886" TEXT="testnode 7 1 9886" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9887" TEXT="testnode 7 2 9887" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9888" TEXT="testnode 7 3 9888" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9889" TEXT="testnode 7 4 9889" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9890" TEXT="testnode 7 5 9890" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9891" TEXT="testnode 7 6 9891" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9892" TEXT="testnode 7 7 9892" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9893" TEXT="testnode 5 6 9893" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9894" TEXT="testnode 6 1 9894" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9895" TEXT="testnode 7 1 9895" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9896" TEXT="testnode 7 2 9896" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9897" TEXT="testnode 7 3 9897" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9898" TEXT="testnode 7 4 9898" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9899" TEXT="testnode 7 5 9899" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9900" TEXT="testnode 7 6 9900" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9901" TEXT="testnode 7 7 9901" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9902" TEXT="testnode 6 2 9902" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9903" TEXT="testnode 7 1 9903" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9904" TEXT="testnode 7 2 9904" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9905" TEXT="testnode 7 3 9905" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9906" TEXT="testnode 7 4 9906" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9907" TEXT="testnode 7 5 9907" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9908" TEXT="testnode 7 6 9908" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9909" TEXT="testnode 7 7 9909" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9910" TEXT="testnode 6 3 9910" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9911" TEXT="testnode 7 1 9911" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9912" TEXT="testnode 7 2 9912" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9913" TEXT="testnode 7 3 9913" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9914" TEXT="testnode 7 4 9914" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9915" TEXT="testnode 7 5 9915" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9916" TEXT="testnode 7 6 9916" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9917" TEXT="testnode 7 7 9917" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9918" TEXT="testnode 6 4 9918" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9919" TEXT="testnode 7 1 9919" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9920" TEXT="testnode 7 2 9920" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9921" TEXT="testnode 7 3 9921" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9922" TEXT="testnode 7 4 9922" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9923" TEXT="testnode 7 5 9923" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9924" TEXT="testnode 7 6 9924" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9925" TEXT="testnode 7 7 9925" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9926" TEXT="testnode 6 5 9926" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9927" TEXT="testnode 7 1 9927" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9928" TEXT="testnode 7 2 9928" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9929" TEXT="testnode 7 3 9929" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9930" TEXT="testnode 7 4 9930" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9931" TEXT="testnode 7 5 9931" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9932" TEXT="testnode 7 6 9932" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9933" TEXT="testnode 7 7 9933" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9934" TEXT="testnode 6 6 9934" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9935" TEXT="testnode 7 1 9935" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9936" TEXT="testnode 7 2 9936" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9937" TEXT="testnode 7 3 9937" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9938" TEXT="testnode 7 4 9938" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9939" TEXT="testnode 7 5 9939" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9940" TEXT="testnode 7 6 9940" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9941" TEXT="testnode 7 7 9941" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9942" TEXT="testnode 6 7 9942" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9943" TEXT="testnode 7 1 9943" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9944" TEXT="testnode 7 2 9944" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9945" TEXT="testnode 7 3 9945" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9946" TEXT="testnode 7 4 9946" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9947" TEXT="testnode 7 5 9947" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9948" TEXT="testnode 7 6 9948" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9949" TEXT="testnode 7 7 9949" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9950" TEXT="testnode 5 7 9950" FOLDED = "true">
- <icon BUILTIN="full-6"/>
- <icon BUILTIN="full-7"/>
- <node ID="Freemind_Link_9951" TEXT="testnode 6 1 9951" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9952" TEXT="testnode 7 1 9952" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9953" TEXT="testnode 7 2 9953" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9954" TEXT="testnode 7 3 9954" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9955" TEXT="testnode 7 4 9955" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9956" TEXT="testnode 7 5 9956" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9957" TEXT="testnode 7 6 9957" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9958" TEXT="testnode 7 7 9958" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9959" TEXT="testnode 6 2 9959" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9960" TEXT="testnode 7 1 9960" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9961" TEXT="testnode 7 2 9961" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9962" TEXT="testnode 7 3 9962" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9963" TEXT="testnode 7 4 9963" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9964" TEXT="testnode 7 5 9964" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9965" TEXT="testnode 7 6 9965" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9966" TEXT="testnode 7 7 9966" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9967" TEXT="testnode 6 3 9967" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9968" TEXT="testnode 7 1 9968" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9969" TEXT="testnode 7 2 9969" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9970" TEXT="testnode 7 3 9970" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9971" TEXT="testnode 7 4 9971" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9972" TEXT="testnode 7 5 9972" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9973" TEXT="testnode 7 6 9973" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9974" TEXT="testnode 7 7 9974" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9975" TEXT="testnode 6 4 9975" FOLDED = "true">
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- <node ID="Freemind_Link_9976" TEXT="testnode 7 1 9976" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9977" TEXT="testnode 7 2 9977" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9978" TEXT="testnode 7 3 9978" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9979" TEXT="testnode 7 4 9979" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9980" TEXT="testnode 7 5 9980" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9981" TEXT="testnode 7 6 9981" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- <node ID="Freemind_Link_9982" TEXT="testnode 7 7 9982" >
- <icon BUILTIN="full-8"/>
- <icon BUILTIN="full-9"/>
- </node>
- </node>
- <node ID="Freemind_Link_9983" TEXT="testnode 6 5 9983" >
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- </node>
- <node ID="Freemind_Link_9984" TEXT="testnode 6 6 9984" >
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- </node>
- <node ID="Freemind_Link_9985" TEXT="testnode 6 7 9985" >
- <icon BUILTIN="full-7"/>
- <icon BUILTIN="full-8"/>
- </node>
- </node>
- </node>
- <node ID="Freemind_Link_9986" TEXT="testnode 4 5 9986" >
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- </node>
- <node ID="Freemind_Link_9987" TEXT="testnode 4 6 9987" >
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- </node>
- <node ID="Freemind_Link_9988" TEXT="testnode 4 7 9988" >
- <icon BUILTIN="full-5"/>
- <icon BUILTIN="full-6"/>
- </node>
- </node>
- <node ID="Freemind_Link_9989" TEXT="testnode 3 5 9989" >
- <icon BUILTIN="full-4"/>
- <icon BUILTIN="full-5"/>
- </node>
- <node ID="Freemind_Link_9990" TEXT="testnode 3 6 9990" >
- <icon BUILTIN="full-4"/>
- <icon BUILTIN="full-5"/>
- </node>
- <node ID="Freemind_Link_9991" TEXT="testnode 3 7 9991" >
- <icon BUILTIN="full-4"/>
- <icon BUILTIN="full-5"/>
- </node>
- </node>
- <node ID="Freemind_Link_9992" TEXT="testnode 2 2 9992" >
- <icon BUILTIN="full-3"/>
- <icon BUILTIN="full-4"/>
- </node>
- <node ID="Freemind_Link_9993" TEXT="testnode 2 3 9993" >
- <icon BUILTIN="full-3"/>
- <icon BUILTIN="full-4"/>
- </node>
- <node ID="Freemind_Link_9994" TEXT="testnode 2 4 9994" >
- <icon BUILTIN="full-3"/>
- <icon BUILTIN="full-4"/>
- </node>
- <node ID="Freemind_Link_9995" TEXT="testnode 2 5 9995" >
- <icon BUILTIN="full-3"/>
- <icon BUILTIN="full-4"/>
- </node>
- <node ID="Freemind_Link_9996" TEXT="testnode 2 6 9996" >
- <icon BUILTIN="full-3"/>
- <icon BUILTIN="full-4"/>
- </node>
- <node ID="Freemind_Link_9997" TEXT="testnode 2 7 9997" >
- <icon BUILTIN="full-3"/>
- <icon BUILTIN="full-4"/>
- </node>
- </node>
- <node ID="Freemind_Link_9998" TEXT="testnode 1 2 9998" >
- <icon BUILTIN="full-2"/>
- <icon BUILTIN="full-3"/>
- </node>
- <node ID="Freemind_Link_9999" TEXT="testnode 1 3 9999" >
- <icon BUILTIN="full-2"/>
- <icon BUILTIN="full-3"/>
- </node>
- <node ID="Freemind_Link_10000" TEXT="testnode 1 4 10000" >
- <icon BUILTIN="full-2"/>
- <icon BUILTIN="full-3"/>
- </node>
- <node ID="Freemind_Link_10001" TEXT="testnode 1 5 10001" >
- <icon BUILTIN="full-2"/>
- <icon BUILTIN="full-3"/>
- </node>
- <node ID="Freemind_Link_10002" TEXT="testnode 1 6 10002" >
- <icon BUILTIN="full-2"/>
- <icon BUILTIN="full-3"/>
- </node>
- <node ID="Freemind_Link_10003" TEXT="testnode 1 7 10003" >
- <icon BUILTIN="full-2"/>
- <icon BUILTIN="full-3"/>
- </node>
-</node>
-</map>
diff --git a/freeplane_framework/.classpath b/freeplane_framework/.classpath
deleted file mode 100644
index 6c7e8af..0000000
--- a/freeplane_framework/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
- <classpathentry kind="lib" path="lib/knopflerfish/framework.jar"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_framework/.project b/freeplane_framework/.project
deleted file mode 100644
index 67f2a36..0000000
--- a/freeplane_framework/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_framework</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_framework/.settings/org.eclipse.core.resources.prefs b/freeplane_framework/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index b2ba3b2..0000000
--- a/freeplane_framework/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
-encoding/windows-installer=Cp1252
-encoding/windows-portable=Cp1252
diff --git a/freeplane_framework/.settings/org.eclipse.core.runtime.prefs b/freeplane_framework/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index ce3b778..0000000
--- a/freeplane_framework/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:56:52 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/freeplane_framework/.settings/org.eclipse.jdt.core.prefs b/freeplane_framework/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8505da6..0000000
--- a/freeplane_framework/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/freeplane_framework/META-INF/LAUNCHER_MANIFEST.MF b/freeplane_framework/META-INF/LAUNCHER_MANIFEST.MF
deleted file mode 100644
index 6bff87e..0000000
--- a/freeplane_framework/META-INF/LAUNCHER_MANIFEST.MF
+++ /dev/null
@@ -1,4 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: org.freeplane.launcher.Launcher
-Class-Path: freeplaneLauncher.jar
- framework.jar
\ No newline at end of file
diff --git a/freeplane_framework/ant/ant.properties b/freeplane_framework/ant/ant.properties
deleted file mode 100644
index 45dea02..0000000
--- a/freeplane_framework/ant/ant.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-launcher.dist.lib = ${workspace}/freeplane_framework/build
-freeplanelauncher.jar = ${launcher.dist.lib}/freeplanelauncher.jar
-framework.ext.lib = ${workspace}/freeplane_framework/lib
-framework.jar = ${framework.ext.lib}/knopflerfish/framework.jar
diff --git a/freeplane_framework/ant/build.xml b/freeplane_framework/ant/build.xml
deleted file mode 100644
index ce240a8..0000000
--- a/freeplane_framework/ant/build.xml
+++ /dev/null
@@ -1,589 +0,0 @@
-<project name="freeplane" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property file="${workspace}/freeplane/viewer-resources/version.properties" />
- <property file="ant/ant.properties" />
- <property name="freeplaneant.jar" value="${workspace}/freeplane_ant/dist/freeplaneant.jar" />
- <property name="root" value="." />
- <property name="build" value="${root}/build" />
- <property name="build4mac" value="${root}/build4mac" />
- <property name="build.plugins" value="${build}/plugins" />
- <property name="dist" value="${root}/dist" />
- <property name="macappfullpath" value="${build4mac}/Freeplane.app" />
-
- <property name="launcher_src" value="src" />
- <property name="launcher_manifest" value="${root}/META-INF/LAUNCHER_MANIFEST.MF" />
- <property name="launcher_build" value="${root}/launcher_build" />
- <property name="launcher_classpath" value="${framework.jar}" />
-
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
-
- <condition property="freeplane_version_status_suffix" value="" else="-${freeplane_version_status}">
- <equals arg1="${freeplane_version_status}" arg2=""/>
- </condition>
-
- <condition property="ver" value="${freeplane_version}${freeplane_version_status_suffix}_pre${minor}" else="${freeplane_version}${freeplane_version_status_suffix}">
- <isset property="minor" />
- </condition>
-
- <property name="license" value="license.txt" />
- <property name="readme_src" value="readme.txt" />
- <property name="build.resources" value="${build}/resources" />
- <property name="build.doc" value="${build}/doc" />
- <property name="build.scripts" value="${build}/scripts" />
- <property name="script" value="${root}/script" />
-
- <property name="skip_workspace" value="true" />
-
- <!-- Mac OS X -->
- <condition property="isMacOs">
- <os family="mac"/>
- </condition>
-
- <property name="mac-appbundler" value = "${root}/mac-appbundler"/>
- <property name="appbundler.jar" value = "appbundler-1.0.jar"/>
- <taskdef name="appbundler" onerror="report"
- classpath="${mac-appbundler}/${appbundler.jar}"
- classname="com.oracle.appbundler.AppBundlerTask" />
- <taskdef name="create-plugin" onerror="report"
- classpath="${freeplaneant.jar}"
- classname="org.freeplane.ant.CreatePlugin"/>
-
- <target name="makePlugin">
- <ant antfile="ant/build.xml" target="${anttarget}" dir="${workspace}/${plugindir}" inheritall="false" />
- <mkdir dir="${build}/${targetdir}/${pluginname}" />
- <copy todir="${build}/${targetdir}/${pluginname}">
- <fileset dir="${workspace}/${plugindir}/dist/${pluginname}" />
- </copy>
- </target>
-
-
- <target name="build_core">
- <echo>Freeplane Version = ${ver}.</echo>
-
- <mkdir dir="${build}" />
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="osgi_dist"/>
- <param name="targetdir" value="core"/>
- <param name="plugindir" value="freeplane"/>
- <param name="pluginname" value="org.freeplane.core"/>
- </antcall>
- </target>
-
- <target name="build_help" unless="skip_help">
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="dist"/>
- <param name="targetdir" value="plugins"/>
- <param name="plugindir" value="freeplane_plugin_help"/>
- <param name="pluginname" value="org.freeplane.plugin.help"/>
- </antcall>
- </target>
-
- <target name="build_latex" unless="skip_latex">
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="dist"/>
- <param name="targetdir" value="plugins"/>
- <param name="plugindir" value="freeplane_plugin_latex"/>
- <param name="pluginname" value="org.freeplane.plugin.latex"/>
- </antcall>
- </target>
-
- <target name="build_svg" unless="skip_svg">
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="dist"/>
- <param name="targetdir" value="plugins"/>
- <param name="plugindir" value="freeplane_plugin_svg"/>
- <param name="pluginname" value="org.freeplane.plugin.svg"/>
- </antcall>
- </target>
-
- <target name="build_script" unless="skip_script">
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="dist"/>
- <param name="targetdir" value="plugins"/>
- <param name="plugindir" value="freeplane_plugin_script"/>
- <param name="pluginname" value="org.freeplane.plugin.script"/>
- </antcall>
- </target>
-
- <target name="build_script_api" unless="skip_script">
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="api"/>
- <param name="targetdir" value="plugins"/>
- <param name="plugindir" value="freeplane_plugin_script"/>
- <param name="pluginname" value="org.freeplane.plugin.script"/>
- </antcall>
- </target>
-
- <target name="build_formula" unless="skip_formula">
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="dist"/>
- <param name="targetdir" value="plugins"/>
- <param name="plugindir" value="freeplane_plugin_formula"/>
- <param name="pluginname" value="org.freeplane.plugin.formula"/>
- </antcall>
- </target>
-
- <target name="build_bugreport" unless="skip_bugreport">
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="dist"/>
- <param name="targetdir" value="plugins"/>
- <param name="plugindir" value="freeplane_plugin_bugreport"/>
- <param name="pluginname" value="org.freeplane.plugin.bugreport"/>
- </antcall>
- </target>
-
- <target name="build_openmaps" unless="skip_openmaps">
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="dist" />
- <param name="targetdir" value="plugins" />
- <param name="plugindir" value="freeplane_plugin_openmaps" />
- <param name="pluginname" value="org.freeplane.plugin.openmaps"/>
- </antcall>
-</target>
-
- <target name="build_workspace" unless="skip_workspace">
- <antcall target="makePlugin" inheritall="false">
- <param name="anttarget" value="dist"/>
- <param name="targetdir" value="plugins"/>
- <param name="plugindir" value="freeplane_plugin_workspace"/>
- <param name="pluginname" value="org.freeplane.plugin.workspace"/>
- </antcall>
- </target>
-
- <target name="build_launcher" depends="build_core">
- <mkdir dir="${launcher_build}" />
- <javac srcdir="${launcher_src}" destdir="${launcher_build}" classpath="${launcher_classpath}"
- debug="${debug}" source="${java_source_version}" target="${java_target_version}" encoding="utf8"/>
- <jar jarfile="${freeplanelauncher.jar}" manifest="${launcher_manifest}">
- <fileset dir="${launcher_build}">
- <include name="**" />
- </fileset>
- </jar>
-
- <copy todir="${build}">
- <fileset dir="${script}" />
- <fileset file="${framework.jar}" />
- <fileset file="${freeplanelauncher.jar}" />
- <fileset file="windows-icons/freeplaneIcons.dll" />
- <fileset dir="launch4j" includes="*.exe" />
- <fileset dir="launch4j" includes="*.ini" />
- </copy>
- <chmod file="${build}/freeplane.sh" perm="ugo+rx" />
- </target>
-
- <target name="build" depends="build_core, build_latex, build_svg, build_script, build_formula, build_bugreport, build_openmaps, build_workspace, build_launcher, git_version_info">
- <mkdir dir="${build.resources}" />
- <copy todir="${build.resources}">
- <fileset dir="${workspace}/freeplane/dist/resources" />
- <fileset file="${dist}/gitinfo.properties"/>
- </copy>
- <mkdir dir="${build.doc}" />
- <copy todir="${build.doc}">
- <fileset dir="${workspace}/freeplane/dist/doc" />
- </copy>
- <mkdir dir="${build.scripts}" />
- <copy todir="${build.scripts}">
- <fileset dir="${workspace}/freeplane_plugin_script/scripts" />
- </copy>
-
- </target>
-
- <target name="javadoc" depends="build_script_api">
- <mkdir dir="${build.doc}" />
- <copy todir="${build.doc}">
- <fileset dir="${workspace}/freeplane_plugin_script/dist/doc" />
- </copy>
- </target>
-
- <target name="mkdistdir">
- <mkdir dir="${build}" />
- <mkdir dir="${dist}" />
- </target>
-
-
- <target name="rungit" depends="mkdistdir">
- <delete file="${build}/gitinfo.txt" quiet="true"/>
- <delete file="${dist}/git.properties" quiet="true"/>
- <exec dir="${build}" executable="git" output="${build}/gitinfo.txt"
- failifexecutionfails="false" failonerror="false" logError="true"
- resultproperty="gitresult">
- <arg value='log'/>
- <arg value='--pretty=format:git-revision=%h_%an_%ai'/>
- <arg value='-n1'/>
- </exec>
- <condition property="gitok" value="">
- <equals arg1="${gitresult}" arg2="0"/>
- </condition>
- </target>
-
- <target name="git_version_info" depends="rungit" unless="giterror">
- <native2ascii src="${build}" dest="${dist}" includes="gitinfo.txt" ext=".properties"/>
- <replaceregexp file="${dist}/gitinfo.properties" flags="g" byline="false" match="[^\w=-]" replace="" />
- <property file="${dist}/gitinfo.properties"/>
- <exec dir="${build}" executable="git" output="${build}/gitinfo.txt" append="true"
- failifexecutionfails="false" failonerror="false" logError="true">
- <arg value='branch'/>
- </exec>
- </target>
-
- <target name="binzip" depends="build">
- <zip destfile="${dist}/freeplane_bin-${ver}.zip" compress="true">
- <zipfileset dir="${build}" prefix="freeplane-${ver}">
- <exclude name="freeplane.sh"/>
- </zipfileset>
- <zipfileset file="${build}/freeplane.sh" filemode="775" prefix="freeplane-${ver}"/>
- <zipfileset dir="${root}" prefix="freeplane-${ver}">
- <include name="${license}" />
- </zipfileset>
- </zip>
- </target>
-
- <target name="srczip" depends="mkdistdir, git_version_info">
- <tempfile property="src.temp.dir" destDir="${java.io.tmpdir}" prefix="build-src"/>
- <mkdir dir="${src.temp.dir}"/>
- <copy todir="${src.temp.dir}" overwrite="true">
- <fileset dir="${workspace}">
- <include name="build.xml" />
- <include name="freeplane/**" />
- <include name="freeplane_plugin*/**" />
- <include name="freeplane_ant/**" />
- <include name="freeplane_mac/**" />
- <include name="freeplane_framework/**" />
- <include name="freeplane_devresources/**" />
- <include name="JOrtho_0.4_freeplane/**" />
- <include name="build.xml" />
- <exclude name=".*/**" />
- <exclude name="**/~*" />
- <exclude name="**/signjar.properties"/>
- <exclude name="**/backups/**" />
- <exclude name="bin/**" />
- <exclude name="build/**" />
- <exclude name="dist/**" />
- <exclude name="*/bin/**" />
- <exclude name="*/build/**" />
- <exclude name="*/launcher_build/**" />
- <exclude name="*/build-nodehighlighter/**" />
- <exclude name="*/build4mac/**" />
- <exclude name="*/dist/**" />
- <exclude name="**/.backup/**" />
- <exclude name="**/backups/**" />
- <exclude name="JOrtho_0.4_freeplane/src/dictionary_*.ortho" />
- <exclude name="freeplane_framework/windows-icons/Objects/**" />
- <exclude name="freeplane_framework/windows-icons/*.layout" />
- <exclude name="freeplane_framework/windows-icons/Makefile.win" />
- <exclude name="freeplane_framework/windows-icons/build/*"/>
-
- <!-- these are generated using mm2menu.xsl/mm2preferences.xsl! -->
- <exclude name="freeplane/resources/xml/browsemodemenu.xml"/>
- <exclude name="freeplane/resources/xml/filemodemenu.xml"/>
- <exclude name="freeplane/resources/xml/mindmapmodemenu.xml"/>
- <exclude name="freeplane/resources/xml/preferences.xml"/>
- <exclude name="freeplane/resources/xml/stylemodemenu.xml"/>
- <exclude name="freeplane/viewer-resources/xml/appletMenu.xml"/>
- <exclude name="freeplane_plugin_formula/src/org/freeplane/plugin/formula/preferences.xml"/>
- <exclude name="freeplane_plugin_script/src/org/freeplane/plugin/script/preferences.xml"/>
- <exclude name="freeplane_plugin_latex/src/org/freeplane/plugin/latex/preferences.xml"/>
-
- </fileset>
- </copy>
- <!-- fix crlf->lf so that the Linux package patches apply, no matter whether this is
- built on Windows or UNIX -->
- <echo>Normalizing line endings to LF in ${src.temp.dir}</echo>
- <fixcrlf srcDir="${src.temp.dir}" eol="lf" eof="asis" fixlast="false">
- <include name="**/*.java"/>
- <include name="**/*.xml"/>
- <include name="**/*.xsl"/>
- <include name="**/*.mm"/>
- <include name="**/*.MF"/>
- <include name="**/*.properties"/>
- </fixcrlf>
- <tar destfile="${dist}/freeplane_src-${ver}.tar.gz" compression="gzip" longfile="gnu">
- <tarfileset prefix="freeplane-${ver}" dir="${src.temp.dir}" mode="664">
- <include name="**"/>
- </tarfileset>
- <tarfileset prefix="freeplane-${ver}" dir="${root}" mode="664">
- <include name="${license}" />
- <include name="${readme_src}" />
- </tarfileset>
- </tar>
- <!-- build the srcpure tar file with the normalized files
- (this is used for linux packages)
- -->
- <tar destfile="${dist}/freeplane_srcpure-${ver}.tar.gz" compression="gzip" longfile="gnu">
- <tarfileset prefix="freeplane-${ver}" dir="${src.temp.dir}" mode="664">
- <!-- this file is built from latex.flex using jflex! -->
- <exclude name="freeplane_plugin_script/src-jsyntaxpane/jsyntaxpane/lexers/LaTeXLexer.java"/>
- <!-- these license files are in separate packages! -->
- <exclude name="freeplane_plugin_openmaps/lib/Gpl.txt"/>
- <exclude name="freeplane_plugin_latex/lib/COPYING"/>
- <exclude name="freeplane_plugin_latex/lib/LICENSE"/>
- <!-- the flash files don't have a source in the freeplane-distrib,
- which is a problem for Debian,
- see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=736106
- (the source is here: https://github.com/freeplane/misc/tree/master/flash-browser)
- -->
- <exclude name="freeplane/resources/flash/visorFreeplane.swf"/>
- <exclude name="freeplane/resources/flash/flashobject.js"/>
- <!-- windows stuff -->
- <exclude name="**/*.exe" />
- <exclude name="**/*.res" />
- <exclude name="**/*.jar" />
- <exclude name="**/*.dll" />
- <exclude name="**/*JavaApplicationStub*" />
- </tarfileset>
- <tarfileset prefix="freeplane-${ver}" dir="${root}" mode="664">
- <include name="${license}" />
- <include name="${readme_src}" />
- </tarfileset>
- </tar>
- <delete dir="${src.temp.dir}"/>
- </target>
-
-
- <target name="installer" depends="build, mkdistdir">
- <exec osfamily="windows" dir="${workspace}/freeplane_framework/windows-installer" executable="iscc.exe" failifexecutionfails="false" failonerror="true">
- <arg line="/Q Freeplane_without_Java.iss" />
- </exec>
- </target>
-
- <target name="portableinstaller" depends="build, mkdistdir">
- <property name="workingdir" value="${root}/temp/FreeplanePortable" />
- <delete quiet="true" includeemptydirs="false">
- <fileset dir="${workingdir}/.." />
- </delete>
- <mkdir dir="${workingdir}/App/Freeplane" />
- <copy todir="${workingdir}">
- <fileset dir="${root}/windows-portable" />
- </copy>
- <mkdir dir="${workingdir}/Other/Source" />
- <copy tofile="${workingdir}/Other/Source/EULA.txt">
- <fileset file="${workspace}/freeplane/resources/license.txt" />
- </copy>
- <copy tofile="${workingdir}/App/AppInfo/appicon.ico">
- <fileset file="launch4j/Freeplane_app.ico" />
- </copy>
-
- <copy todir="${workingdir}/App/Freeplane">
- <fileset dir="${build}">
- <exclude name="*.bat" />
- <exclude name="*.ini" />
- <exclude name="*.sh" />
- </fileset>
- </copy>
- <copy file="${root}/portableApps/portable.ini"
- tofile="${workingdir}/App/Freeplane/freeplane.l4j.ini"/>
-
- <copy file="${root}/portableApps/portable.ini"
- tofile="${workingdir}/App/Freeplane/freeplaneConsole.l4j.ini"/>
-
- <dirname property="workingdir.path" file="${workingdir}/file" />
- <exec osfamily="windows" executable="PortableApps.comInstaller.exe" failifexecutionfails="false" failonerror="true">
- <arg line="${workingdir.path}" />
- </exec>
- <move todir="${workingdir}/..">
- <fileset dir="${workingdir}/..">
- <include name="*.paf.exe" />
- </fileset>
- <mapper type="regexp" from="^(.*)_(.*)$" to="\1-\2"/>
- </move>
- <move todir="${workingdir}/..">
- <fileset dir="${workingdir}/..">
- <include name="*.paf.exe" />
- </fileset>
- <mapper type="regexp" from="^(.*)_(.*)$" to="\1-\2"/>
- </move>
- <move todir="${dist}">
- <fileset dir="${workingdir}/..">
- <include name="*.paf.exe" />
- </fileset>
- </move>
-
-<!--
- <mkdir dir="${workingdir}/App/Freeplane/resources/images" />
- <copy file="${root}/portableApps/Splash.png"
- tofile="${workingdir}/App/Freeplane/resources/images/Freeplane_splash.png"/>
- <exec osfamily="windows" executable="PortableApps.comInstaller.exe" failifexecutionfails="false" failonerror="true">
- <arg line="${workingdir.path}" />
- </exec>
- <move todir="${dist}">
- <mapper type="glob" from="*.paf.exe" to="*-Test.paf.exe"/>
- <fileset dir="${workingdir}/..">
- <include name="*.paf.exe" />
- </fileset>
- </move>
--->
- <delete quiet="true" includeemptydirs="true">
- <fileset dir="${workingdir}/.." />
- </delete>
-
- </target>
-
- <!-- Mac OS X -->
- <target name="macosxapp" depends="build">
-
- <condition property="debugparams" else="">
- <isset property="debugparams"/>
- </condition>
-
- <!-- Delete any existing Freeplane.app (it's a directory) -->
- <mkdir dir="${build4mac}"/>
- <delete dir="${build4mac}/Freeplane.app"/>
- <appbundler
- outputdirectory="${build4mac}"
- name="Freeplane"
- displayname="Freeplane"
- mainclassname="org.freeplane.launcher.Launcher"
- shortversion="${ver}"
- copyright="Freeplane ${ver}"
- identifier="org.freeplane.core"
- icon="${mac-appbundler}/freeplane.icns"
- signature="????"
- >
- <classpath dir="${build}">
- <include name="*.jar" />
- </classpath>
- <option value="-Xmx512m"/>
- <option value="-Dapple.laf.useScreenMenuBar=true"/>
- <option value="-Xdock:name=Freeplane"/>
- </appbundler>
- <echo message="Adding configuration to Info.plist" />
- <property name="dist_macos_info" location="${macappfullpath}/Contents/Info.plist"/>
- <xslt style="${mac-appbundler}/mac_info_plist.xslt"
- in ="${dist_macos_info}"
- out="${dist_macos_info}2"/>
- <move file="${dist_macos_info}2"
- tofile="${dist_macos_info}"/>
- <!-- Done. -->
-
- <!-- Copy the entire build/ tree except WIndows-related stuff
- Also exclude the OSGI framework.jar which is copied by the appbundler task
- Doing this separately to allow specifying jar=framework.jar in the appbundler task
- appbundler allows either jar= or jarfileset but not both
- Copying after the appbundler task which creates the Freeplane.app directory
- appbundler may erase the directory if it already exists
- This is documented in their change log
- !! TODO: Test restoring the jarfileset inside appbundler
- Comment out this copy task, and delete it if jarfileset works
- -->
- <property name="macjavafullpath" value="${macappfullpath}/Contents/Java"/>
- <copy todir="${macjavafullpath}">
- <fileset dir="${build}">
- <exclude name="**/*.bat" />
- <exclude name="**/*.exe" />
- <exclude name="*.jar" />
- </fileset >
- </copy>
- <property name="macresourcesfullpath" value="${macappfullpath}/Contents/Resources"/>
- <copy todir="${macresourcesfullpath}">
- <fileset dir="${mac-appbundler}">
- <include name="freeplanedoc.icns" />
- </fileset >
- </copy>
- </target>
-
- <target name="zip4mac" depends="git_version_info, macosxapp">
- <zip destfile="${dist}/freeplane_macos_bin-${ver}.zip" compress="true">
- <zipfileset dir="${build4mac}" prefix="freeplane-${ver}">
- <exclude name="**/JavaAppLauncher" />
- </zipfileset>
- <zipfileset file="${macappfullpath}/Contents/MacOS/JavaAppLauncher" filemode="775"
- prefix="freeplane-${ver}/Freeplane.app/Contents/MacOS"/>
- </zip>
- </target>
- <target name="dmg4mac" depends="git_version_info, macosxapp" if="isMacOs" >
- <exec executable="hdiutil">
- <arg line="create -srcfolder ${macappfullpath} ${dist}/freeplane_app-${ver}.dmg"/>
- </exec>
- </target>
-
- <target name="renameDistFiles" if="minor">
- <move todir="${dist}" includeemptydirs="false">
- <fileset dir="${dist}">
- <include name="*${freeplane_version}.*"/>
- </fileset>
- <mapper type="regexp" from="^(.*[-_])${freeplane_version}(\..*)$" to="\1${ver}\2"/>
- </move>
- <move todir="${dist}" includeemptydirs="false">
- <fileset dir="${dist}">
- <include name="*${freeplane_version}${freeplane_version_status_suffix}.*"/>
- </fileset>
- <mapper type="regexp" from="^(.*[-_])${freeplane_version}${freeplane_version_status_suffix}(\..*)$" to="\1${ver}\2"/>
- </move>
- </target>
-
-
- <target name="dist" depends="copyDistFiles, renameDistFiles">
- <checksum>
- <fileset dir="${dist}">
- <include name="*.dmg"/>
- <include name="*.zip"/>
- <include name="*.gz"/>
- <include name="*.exe"/>
- </fileset>
- </checksum>
- </target>
-
- <target name="copyDistFiles" depends="git_version_info, binzip, srczip, installer, portableinstaller, zip4mac, dmg4mac, javadoc">
- <copy file="${workspace}/freeplane/doc/history_en.txt"
- todir="${dist}" />
- <copy file="${build}/gitinfo.txt"
- tofile="${dist}/gitinfo-${ver}.txt"
- failonerror="false"/>
- <copy file="${workspace}/freeplane_plugin_script/dist/script-api.zip"
- tofile="${dist}/script-api-${ver}.zip"
- failonerror="false"/>
- </target>
-
- <target name="cleandist" depends="clean,dist">
- </target>
-
- <target name="check-translation">
- <ant antfile="ant/build.xml" target="check-translation" dir="${workspace}/freeplane" />
- </target>
- <target name="format-translation">
- <ant antfile="ant/build.xml" target="format-translation" dir="${workspace}/freeplane" />
- </target>
- <target name="format-translation-force">
- <ant antfile="ant/build.xml" target="format-translation-force" dir="${workspace}/freeplane" />
- </target>
- <target name="create-plugin">
- <create-plugin />
- </target>
- <target name="test">
- <ant antfile="build.xml" target="test" dir="${workspace}/freeplane_ant" inheritall="false" />
- <ant antfile="ant/build.xml" target="test" dir="${workspace}/freeplane_plugin_script" inheritall="false" />
- <ant antfile="ant/build.xml" target="test" dir="${workspace}/freeplane_uitest" inheritall="false" />
- </target>
-
- <target name="clean">
- <delete quiet="true" includeemptydirs="true">
- <fileset dir="${build}" />
- <fileset dir="${launcher_build}" />
- <fileset dir="${build4mac}" />
- <fileset dir="${dist}" />
- </delete>
- <ant antfile="ant/build.xml" target="clean" inheritall="false"
- dir="${workspace}/freeplane"/>
- <ant antfile="ant/build.xml" target="clean" inheritall="false"
- dir="${workspace}/freeplane_plugin_help"/>
- <ant antfile="ant/build.xml" target="clean" inheritall="false"
- dir="${workspace}/freeplane_plugin_svg"/>
- <ant antfile="ant/build.xml" target="clean" inheritall="false"
- dir="${workspace}/freeplane_plugin_latex"/>
- <ant antfile="ant/build.xml" target="clean" inheritall="false"
- dir="${workspace}/freeplane_plugin_script"/>
- <ant antfile="ant/build.xml" target="clean" inheritall="false"
- dir="${workspace}/freeplane_plugin_formula"/>
- <ant antfile="ant/build.xml" target="clean" inheritall="false"
- dir="${workspace}/freeplane_plugin_bugreport"/>
- <ant antfile="ant/build.xml" target="clean" inheritall="false"
- dir="${workspace}/freeplane_plugin_openmaps"/>
- <ant antfile="ant/build.xml" target="clean" inheritall="false"
- dir="${workspace}/freeplane_plugin_workspace"/>
- </target>
-
-</project>
-
diff --git a/freeplane_framework/build.gradle b/freeplane_framework/build.gradle
new file mode 100644
index 0000000..5d8a11f
--- /dev/null
+++ b/freeplane_framework/build.gradle
@@ -0,0 +1,73 @@
+import org.apache.tools.ant.filters.*
+
+task freeplanelauncherJar(type: Jar) {
+ archiveName = 'freeplanelauncher.jar'
+ destinationDir = new File(globalBuild)
+
+ dependsOn classes
+ from (sourceSets.main.output) {
+ include("**")
+ }
+ includeEmptyDirs = false
+
+ manifest {
+ attributes("Manifest-Version": "1.0",
+ "Main-Class": "org.freeplane.launcher.Launcher",
+ "Class-Path": "framework.jar")
+ }
+}
+
+jar.dependsOn freeplanelauncherJar
+
+task copyFreeplaneShellScript(type: Copy) {
+ from('script/') {
+ include('freeplane.sh')
+ fileMode = 0755
+ }
+ into(globalBuild)
+ filter(FixCrLfFilter.class, eol:FixCrLfFilter.CrLf.newInstance("lf"))
+}
+
+task copyLauncherStuff(type: Copy) {
+ dependsOn 'copyFreeplaneShellScript'
+ from('script/') {
+ include('*')
+ exclude('freeplane.sh')
+ }
+
+ def knopflerfishJarFile = project.configurations.runtime.files.find {
+ isKnopflerfishJar(it.name)
+ }
+ from(knopflerfishJarFile)
+ // rename [knopflerfish-]framework-*.jar to framework.jar
+ rename { String fileName ->
+ if (isKnopflerfishJar(fileName))
+ return "framework.jar"
+ else
+ return fileName
+ }
+
+ from('windows-icons/') {
+ include('freeplaneIcons.dll')
+ }
+ from('launch4j/') {
+ include('*.exe')
+ include('*.ini')
+ }
+ into(globalBuild)
+ dependsOn jar
+}
+
+task makeKnopflerfischPermissionDirs << {
+ new File(globalBuild, 'fwdir/perms').mkdirs()
+ new File(globalBuild, 'fwdir/condperm').mkdirs()
+}
+
+eclipseJdt << {
+ File f = file('.settings/org.eclipse.core.resources.prefs')
+ f.append('encoding/windows-installer=ISO-8859-1\n')
+}
+
+build.dependsOn (copyLauncherStuff, makeKnopflerfischPermissionDirs)
+
+
diff --git a/freeplane_devresources/CodeStyle/clean-up.xml b/freeplane_framework/eclipse/CodeStyle/clean-up.xml
similarity index 100%
rename from freeplane_devresources/CodeStyle/clean-up.xml
rename to freeplane_framework/eclipse/CodeStyle/clean-up.xml
diff --git a/freeplane_framework/eclipse/CodeStyle/codetemplates.xml b/freeplane_framework/eclipse/CodeStyle/codetemplates.xml
new file mode 100644
index 0000000..d4dfb50
--- /dev/null
+++ b/freeplane_framework/eclipse/CodeStyle/codetemplates.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><templates><template autoinsert="true" context="gettercomment_context" deleted="false" description="Comment for getter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/**
+ * @return the ${bare_field_name}
+ */</template><template autoinsert="true" context="settercomment_context" deleted="false" description="Comment for setter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/**
+ * @param ${param} the ${bare_field_name} to set
+ */</template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="Comment for created constructors" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/**
+ * ${tags}
+ */</template><template autoinsert="false" context="filecomment_context" deleted="false" description="Comment for created Java files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment"/><template autoinsert="true" context="typecomment_context" deleted="false" description="Comment for created types" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/**
+ * @author ${user}
+ *
+ * ${tags}
+ */</template><template autoinsert="true" context="fieldcomment_context" deleted="false" description="Comment for fields" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/**
+ *
+ */</template><template autoinsert="true" context="methodcomment_context" deleted="false" description="Comment for non-overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/**
+ * ${tags}
+ */</template><template autoinsert="true" context="overridecomment_context" deleted="false" description="Comment for overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment">/* (non-Javadoc)
+ * ${see_to_overridden}
+ */</template><template autoinsert="true" context="delegatecomment_context" deleted="false" description="Comment for delegate methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/**
+ * ${tags}
+ * ${see_to_target}
+ */</template><template autoinsert="false" context="newtype_context" deleted="false" description="Newly created files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.newtype" name="newtype">/*
+ * Freeplane - mind map editor
+ * Copyright (C) ${year} ${user}
+ *
+ * This file author is ${user}
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+${package_declaration}
+
+/**
+ * @author Dimitry Polivaev
+ * ${date}
+ */
+${type_declaration}</template><template autoinsert="true" context="classbody_context" deleted="false" description="Code in new class type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.classbody" name="classbody">
+</template><template autoinsert="true" context="interfacebody_context" deleted="false" description="Code in new interface type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name="interfacebody">
+</template><template autoinsert="true" context="enumbody_context" deleted="false" description="Code in new enum type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.enumbody" name="enumbody">
+</template><template autoinsert="true" context="annotationbody_context" deleted="false" description="Code in new annotation type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name="annotationbody">
+</template><template autoinsert="true" context="catchblock_context" deleted="false" description="Code in new catch blocks" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.catchblock" name="catchblock">// ${todo} Auto-generated catch block
+${exception_var}.printStackTrace();</template><template autoinsert="true" context="methodbody_context" deleted="false" description="Code in created method stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodbody" name="methodbody">// ${todo} Auto-generated method stub
+${body_statement}</template><template autoinsert="true" context="constructorbody_context" deleted="false" description="Code in created constructor stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name="constructorbody">${body_statement}
+// ${todo} Auto-generated constructor stub</template><template autoinsert="true" context="getterbody_context" deleted="false" description="Code in created getters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.getterbody" name="getterbody">return ${field};</template><template autoinsert="true" context="setterbody_context" deleted="false" description="Code in created setters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.setterbody" name="setterbody">${field} = ${par [...]
diff --git a/freeplane_devresources/CodeStyle/formatter.xml b/freeplane_framework/eclipse/CodeStyle/formatter.xml
similarity index 100%
rename from freeplane_devresources/CodeStyle/formatter.xml
rename to freeplane_framework/eclipse/CodeStyle/formatter.xml
diff --git a/freeplane_framework/eclipse/launchers/freeplane core.launch b/freeplane_framework/eclipse/launchers/freeplane core.launch
new file mode 100644
index 0000000..3f81d62
--- /dev/null
+++ b/freeplane_framework/eclipse/launchers/freeplane core.launch
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/freeplane/src/main/java/org/freeplane/main/application/FreeplaneMain.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<sourceLookupDirector>
<sourceContainers duplicates="false">
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <javaProject name="freeplane&am [...]
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.freeplane.main.application.FreeplaneMain"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="freeplane"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea "-Dorg.freeplane.globalresourcedir=${workspace_loc:freeplane/external-resources}" -Dorg.freeplane.nosplash=true -Dorg.freeplane.main.application.FreeplaneSecurityManager.disable=true"/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:freeplane_framework/build}"/>
+<stringAttribute key="yk-options" value="
snapshots-dir=
additional-options2=onexit\=snapshot
startup=0
"/>
+</launchConfiguration>
diff --git a/freeplane_framework/eclipse/launchers/freeplane knopflerfish mac.launch b/freeplane_framework/eclipse/launchers/freeplane knopflerfish mac.launch
new file mode 100644
index 0000000..a3c88a0
--- /dev/null
+++ b/freeplane_framework/eclipse/launchers/freeplane knopflerfish mac.launch
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/freeplane_framework/src/main/java/org/freeplane/launcher/Launcher.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<sourceLookupDirector>
<sourceContainers duplicates="false">
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <directory nest="false" path="/Users/ [...]
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>
+<listAttribute key="org.eclipse.jdt.launching.CLASSPATH">
+<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER" javaProject="freeplane" path="1" type="4"/>
"/>
+<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath">
<memento exportedEntriesOnly="false" project="freeplane"/>
</runtimeClasspathEntry>
"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.freeplane.launcher.Launcher"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="freeplane_framework"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdock:icon=${workspace_loc:/freeplane_framework/mac-appbundler/freeplane.icns} -Xdock:name=Freeplane -Xmx512m -Dorg.freeplane.basedirectory=${workspace_loc:freeplane}/..""/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:freeplane_framework/build4mac/Freeplane.app/Contents/Resources/Java}"/>
+<stringAttribute key="yk-options" value="
snapshots-dir=
additional-options2=onexit\=snapshot
startup=0
"/>
+</launchConfiguration>
diff --git a/freeplane_framework/eclipse/launchers/freeplane knopflerfish.launch b/freeplane_framework/eclipse/launchers/freeplane knopflerfish.launch
new file mode 100644
index 0000000..d3b9f67
--- /dev/null
+++ b/freeplane_framework/eclipse/launchers/freeplane knopflerfish.launch
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/freeplane_framework/src/main/java/org/freeplane/launcher/Launcher.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.jdt.launching.sourceLocator.JavaSourceLookupDirector"/>
+<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<sourceLookupDirector>
<sourceContainers duplicates="false">
<container memento="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <archive detectRoot="true" path="/hom [...]
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.freeplane.launcher.Launcher"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="freeplane_framework"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512m "-Dorg.freeplane.basedirectory=${workspace_loc:freeplane}/../BUILD" "-Djava.security.policy=${workspace_loc:freeplane_framework/eclipse/launchers/freeplane.policy}" "-Dframework.home=${system_property:user.home}/.gradle/caches/modules-2/files-2.1/org.knopflerfish/framework""/>
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:freeplane_framework}/../BUILD"/>
+<stringAttribute key="yk-options" value="
snapshots-dir=
additional-options2=onexit\=snapshot
startup=0
"/>
+</launchConfiguration>
diff --git a/freeplane_framework/eclipse/launchers/freeplane-osgi-mac.launch b/freeplane_framework/eclipse/launchers/freeplane-osgi-mac.launch
new file mode 100644
index 0000000..12a795e
--- /dev/null
+++ b/freeplane_framework/eclipse/launchers/freeplane-osgi-mac.launch
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/freeplane-osgi-mac"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="1"/>
+<booleanAttribute key="includeOptional" value="false"/>
+<booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console -nosplash"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdock:icon=${workspace_loc:/freeplane_framework/mac-appbundler/freeplane.icns} -Xdock:name=Freeplane -Xmx512m -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dosgi.debug=debug.properties -ea "-Dorg.freeplane.globalresourcedir=${workspace_loc:freeplane/external-resources}" -Dorg.freeplane.nosplash=true -Dorg.freeplane.outputUnusedActions=true -Dorg.freeplane.main.application.FreeplaneSecurityManager.disable=t [...]
+<stringAttribute key="pde.version" value="3.3"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="target_bundles" value="org.apache.felix.gogo.runtime,org.apache.felix.gogo.shell,org.eclipse.equinox.console,org.eclipse.osgi at -1:true"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.freeplane.core at 2:default,org.freeplane.plugin.bugreport at default:default,org.freeplane.plugin.formula at default:default,org.freeplane.plugin.jsyntaxpane at default:default,org.freeplane.plugin.latex at default:default,org.freeplane.plugin.openmaps at default:default,org.freeplane.plugin.script at default:default,org.freeplane.plugin.svg at default:default"/>
+</launchConfiguration>
diff --git a/freeplane_framework/eclipse/launchers/freeplane-osgi.launch b/freeplane_framework/eclipse/launchers/freeplane-osgi.launch
new file mode 100644
index 0000000..79d9721
--- /dev/null
+++ b/freeplane_framework/eclipse/launchers/freeplane-osgi.launch
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bad_container_name" value="/freeplane_devresources/eclipse/o"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/freeplane-osgi"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="default_auto_start" value="true"/>
+<intAttribute key="default_start_level" value="1"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.JAVA_COMMAND" value="java"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -console"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512m -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dosgi.debug=debug.properties -ea "-Dorg.freeplane.globalresourcedir=${workspace_loc:freeplane/external-resources}" -Dorg.freeplane.nosplash=true -Dorg.freeplane.main.application.FreeplaneSecurityManager.disable=false -Dorg.freeplane.outputUnusedActions=true "-Dorg.freeplane.basedirectory=${workspace_loc:freeplane}/.." -Djava.security.manager - [...]
+<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:freeplane/..}"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<booleanAttribute key="show_selected_only" value="true"/>
+<stringAttribute key="target_bundles" value="org.eclipse.osgi at -1:true"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<stringAttribute key="workspace_bundles" value="org.freeplane.core at 2:default,org.freeplane.plugin.bugreport at default:default,org.freeplane.plugin.formula at default:default,org.freeplane.plugin.jsyntaxpane at default:default,org.freeplane.plugin.latex at default:default,org.freeplane.plugin.openmaps at default:default,org.freeplane.plugin.script at default:default,org.freeplane.plugin.svg at default:default"/>
+<stringAttribute key="yk-options" value="
snapshots-dir=
additional-options2=onexit\=snapshot
startup=0
"/>
+</launchConfiguration>
diff --git a/freeplane_framework/eclipse/launchers/freeplane.policy b/freeplane_framework/eclipse/launchers/freeplane.policy
new file mode 100644
index 0000000..066893b
--- /dev/null
+++ b/freeplane_framework/eclipse/launchers/freeplane.policy
@@ -0,0 +1,19 @@
+grant codeBase "file:${org.freeplane.basedirectory}/*" {
+ permission java.security.AllPermission;
+};
+
+grant codeBase "file:${org.freeplane.basedirectory}/../freeplane_framework/bin/*" {
+ permission java.security.AllPermission;
+};
+
+grant codeBase "file:${framework.home}/-" {
+ permission java.security.AllPermission;
+};
+
+grant codeBase "file:${user.home}/.p2/-" {
+ permission java.security.AllPermission;
+};
+
+grant {
+ permission java.lang.RuntimePermission "getClassLoader";
+};
\ No newline at end of file
diff --git a/freeplane_devresources/eclipse/freeplaneDebug.bat b/freeplane_framework/eclipse/launchers/freeplaneDebug.bat
similarity index 100%
rename from freeplane_devresources/eclipse/freeplaneDebug.bat
rename to freeplane_framework/eclipse/launchers/freeplaneDebug.bat
diff --git a/freeplane_framework/eclipse/launchers/freeplaneDebugJDK.bat b/freeplane_framework/eclipse/launchers/freeplaneDebugJDK.bat
new file mode 100644
index 0000000..625a22e
--- /dev/null
+++ b/freeplane_framework/eclipse/launchers/freeplaneDebugJDK.bat
@@ -0,0 +1,8 @@
+ at echo off
+cd ..\..\BUILD
+set freeplanedir=%cd%\
+set xargs=init.xargs
+set defines= "-Dorg.freeplane.param1=%~1" "-Dorg.freeplane.param2=%~2" "-Dorg.freeplane.param3=%~3" "-Dorg.freeplane.param4=%~4" "-Dorg.freeplane.param4=%~5" "-Dorg.freeplane.param4=%~6" "-Dorg.freeplane.param4=%~7" "-Dorg.freeplane.param4=%~8" "-Dorg.freeplane.userfpdir=%appdata%\Freeplane"
+set resdir="-Dorg.freeplane.globalresourcedir=%freeplanedir%resources/"
+ at echo on
+"C:\Program Files\Java\jdk1.8.0_60\bin\java" -Xdebug -Xrunjdwp:transport=dt_socket,address=1044,server=y,suspend=y -Xmx512m -jar freeplanelauncher.jar
diff --git a/freeplane_plugin_script/.settings/org.eclipse.core.resources.prefs b/freeplane_framework/eclipse/settings-templates/org.eclipse.core.resources.prefs
similarity index 100%
rename from freeplane_plugin_script/.settings/org.eclipse.core.resources.prefs
rename to freeplane_framework/eclipse/settings-templates/org.eclipse.core.resources.prefs
diff --git a/freeplane/.settings/org.eclipse.core.runtime.prefs b/freeplane_framework/eclipse/settings-templates/org.eclipse.core.runtime.prefs
similarity index 100%
rename from freeplane/.settings/org.eclipse.core.runtime.prefs
rename to freeplane_framework/eclipse/settings-templates/org.eclipse.core.runtime.prefs
diff --git a/freeplane_plugin_formula/.settings/org.eclipse.pde.core.prefs b/freeplane_framework/eclipse/settings-templates/org.eclipse.pde.core.prefs
similarity index 100%
rename from freeplane_plugin_formula/.settings/org.eclipse.pde.core.prefs
rename to freeplane_framework/eclipse/settings-templates/org.eclipse.pde.core.prefs
diff --git a/freeplane_framework/launch4j/freeplaneConsole.lj4.xml b/freeplane_framework/launch4j/freeplaneConsole.lj4.xml
index 366d930..30718fd 100644
--- a/freeplane_framework/launch4j/freeplaneConsole.lj4.xml
+++ b/freeplane_framework/launch4j/freeplaneConsole.lj4.xml
@@ -15,9 +15,9 @@
<icon></icon>
<jre>
<path>%FREEPLANE_JAVA_HOME%</path>
- <minVersion>1.5.0</minVersion>
+ <minVersion>1.7.0</minVersion>
<maxVersion></maxVersion>
<jdkPreference>preferJre</jdkPreference>
<opt>-Dorg.freeplane.userfpdir="%APPDATA%\\Freeplane"</opt>
</jre>
-</launch4jConfig>
\ No newline at end of file
+</launch4jConfig>
diff --git a/freeplane_framework/launch4j/freeplaneGui.lj4.xml b/freeplane_framework/launch4j/freeplaneGui.lj4.xml
index 2535b46..b38bf40 100644
--- a/freeplane_framework/launch4j/freeplaneGui.lj4.xml
+++ b/freeplane_framework/launch4j/freeplaneGui.lj4.xml
@@ -15,9 +15,9 @@
<icon>Freeplane_app.ico</icon>
<jre>
<path>%FREEPLANE_JAVA_HOME%</path>
- <minVersion>1.5.0</minVersion>
+ <minVersion>1.7.0</minVersion>
<maxVersion></maxVersion>
<jdkPreference>preferJre</jdkPreference>
<opt>-Dorg.freeplane.userfpdir="%APPDATA%\\Freeplane"</opt>
</jre>
-</launch4jConfig>
\ No newline at end of file
+</launch4jConfig>
diff --git a/freeplane_framework/license.txt b/freeplane_framework/license.txt
deleted file mode 100644
index 82fa1da..0000000
--- a/freeplane_framework/license.txt
+++ /dev/null
@@ -1,339 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
diff --git a/freeplane_framework/mac-appbundler/mac_info_plist.xslt b/freeplane_framework/mac-appbundler/mac_info_plist.xslt
index e03e6ae..765f4e5 100644
--- a/freeplane_framework/mac-appbundler/mac_info_plist.xslt
+++ b/freeplane_framework/mac-appbundler/mac_info_plist.xslt
@@ -44,12 +44,8 @@
</xsl:copy>
</xsl:template>
-<xsl:template match="key[text()='JVMVersion']">
- <key>WorkingDirectory</key>
- <string>$JAVAROOT</string>
- <xsl:copy>
- <xsl:apply-templates select="@* | node()"/>
- </xsl:copy>
+<xsl:template match="string[text()='JavaAppLauncher']">
+ <string>universalJavaApplicationStub.sh</string>
</xsl:template>
<xsl:template match="/ | node() | @* | comment() | processing-instruction()">
diff --git a/freeplane_framework/script/freeplane.bat b/freeplane_framework/script/freeplane.bat
index cfa5fd5..70afda5 100644
--- a/freeplane_framework/script/freeplane.bat
+++ b/freeplane_framework/script/freeplane.bat
@@ -1,7 +1 @@
- at echo off
-set freeplanedir=%~dp0
-set xargs=init.xargs
-set defines= "-Dorg.freeplane.param1=%~1" "-Dorg.freeplane.param2=%~2" "-Dorg.freeplane.param3=%~3" "-Dorg.freeplane.param4=%~4" "-Dorg.freeplane.param5=%~5" "-Dorg.freeplane.param6=%~6" "-Dorg.freeplane.param7=%~7" "-Dorg.freeplane.param8=%~8" "-Dorg.freeplane.userfpdir=%appdata%\Freeplane"
-set resdir="-Dorg.freeplane.globalresourcedir=%freeplanedir%resources/"
- at echo on
-java -Xmx512m "-Dorg.knopflerfish.framework.bundlestorage=memory" "-Dorg.knopflerfish.gosg.jars=reference:file:%freeplanedir%core/" %resdir% %defines% -jar "%freeplanedir%framework.jar" -xargs "%freeplanedir%props.xargs" -xargs "%freeplanedir%%xargs%"
+java -Xmx512m -Dorg.freeplane.userfpdir="%APPDATA%\\Freeplane" -jar freeplanelauncher.jar %*
diff --git a/freeplane_framework/script/freeplane.policy b/freeplane_framework/script/freeplane.policy
new file mode 100644
index 0000000..9daaeb1
--- /dev/null
+++ b/freeplane_framework/script/freeplane.policy
@@ -0,0 +1,7 @@
+grant codeBase "file:${org.freeplane.basedirectory}/-" {
+ permission java.security.AllPermission;
+};
+
+grant {
+ permission java.lang.RuntimePermission "getClassLoader";
+};
diff --git a/freeplane_framework/script/freeplane.sh b/freeplane_framework/script/freeplane.sh
index 67ca8dc..e0db923 100644
--- a/freeplane_framework/script/freeplane.sh
+++ b/freeplane_framework/script/freeplane.sh
@@ -178,10 +178,11 @@ _debug "Calling: "\
"-Dorg.freeplane.userfpdir=$userfpdir"\
"-Dorg.freeplane.old_userfpdir=$old_userfpdir"\
"-Dorg.freeplane.globalresourcedir=${freedir}/resources"\
+ "-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel"\
$JAVA_OPTS\
$xdockname\
-jar "${freedir}/freeplanelauncher.jar"\
- $*
+ "$@"
( echo "${DEBUG}" | grep -qe "exit" ) && exit 0 # do not start Freeplane
# now actually launch Freeplane
@@ -189,7 +190,8 @@ _debug "Calling: "\
"-Dorg.freeplane.userfpdir=$userfpdir"\
"-Dorg.freeplane.old_userfpdir=$old_userfpdir"\
"-Dorg.freeplane.globalresourcedir=${freedir}/resources"\
+ "-Dswing.systemlaf=javax.swing.plaf.metal.MetalLookAndFeel"\
$JAVA_OPTS\
$xdockname\
-jar "${freedir}/freeplanelauncher.jar"\
- $*
+ "$@"
diff --git a/freeplane_framework/src/main/java/org/freeplane/launcher/Launcher.java b/freeplane_framework/src/main/java/org/freeplane/launcher/Launcher.java
new file mode 100644
index 0000000..1658f94
--- /dev/null
+++ b/freeplane_framework/src/main/java/org/freeplane/launcher/Launcher.java
@@ -0,0 +1,140 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.launcher;
+
+import java.awt.Toolkit;
+import java.io.File;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import org.knopflerfish.framework.Main;
+
+public class Launcher {
+ private File frameworkDir;
+ private int argCount;
+
+ public Launcher() {
+ if (isDefineNotSet("org.freeplane.basedirectory")) {
+ frameworkDir = getPathToJar();
+ }
+ else {
+ try {
+ frameworkDir = new File(System.getProperty("org.freeplane.basedirectory")).getCanonicalFile();
+ }
+ catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ argCount = 0;
+ }
+
+ private static void fixX11AppName() {
+ try {
+ Toolkit xToolkit = Toolkit.getDefaultToolkit();
+ if (xToolkit.getClass().getName().equals("sun.awt.X11.XToolkit"))
+ {
+ java.lang.reflect.Field awtAppClassNameField = xToolkit.getClass().getDeclaredField("awtAppClassName");
+ awtAppClassNameField.setAccessible(true);
+ awtAppClassNameField.set(xToolkit, "Freeplane");
+ }
+ } catch (NoSuchFieldException | SecurityException
+ | IllegalArgumentException | IllegalAccessException e) {
+ System.err.format("Couldn't set awtAppClassName: %s%n", e.getClass().getSimpleName() + ": " + e.getMessage());
+ }
+ }
+
+ public static void main(String[] args) {
+ fixX11AppName();
+ new Launcher().launch(args);
+ }
+
+
+ private void launch(String[] args) {
+ setDefines();
+ setArgProperties(args);
+ run();
+ }
+
+ private void setDefines() {
+ setDefine("org.knopflerfish.framework.readonly", "true");
+ setDefine("org.knopflerfish.gosg.jars", "reference:file:" + getAbsolutePath("core") + '/');
+ setDefine("org.freeplane.basedirectory", getAbsolutePath());
+ setDefineIfNeeded("org.freeplane.globalresourcedir", getAbsolutePath("resources"));
+ setDefineIfNeeded("java.security.policy", getAbsolutePath("freeplane.policy"));
+ setDefine("org.osgi.framework.storage", getAbsolutePath("fwdir"));
+ System.setSecurityManager(new SecurityManager());
+ }
+
+ private void setDefineIfNeeded(String name, String value) {
+ if (isDefineNotSet(name)) {
+ setDefine(name, value);
+ }
+ }
+
+ private boolean isDefineNotSet(String name) {
+ return System.getProperty(name, null) == null;
+ }
+
+ private String setDefine(String name, String value) {
+ System.out.println(name + "=" + value);
+ return System.setProperty(name, value);
+ }
+
+ private void run() {
+ String[] args = new String[]{
+ "-xargs",
+ getAbsolutePath("props.xargs"),
+ "-xargs",
+ getAbsolutePath("init.xargs")
+ };
+ Main.main(args);
+ }
+
+ private String getAbsolutePath() {
+ return frameworkDir.getAbsolutePath();
+ }
+
+ private String getAbsolutePath(String relativePath) {
+ return new File(frameworkDir, relativePath).getAbsolutePath();
+ }
+
+ private File getPathToJar() {
+ URL frameworkUrl = Main.class.getProtectionDomain().getCodeSource().getLocation();
+ try {
+ return new File(frameworkUrl.toURI()).getCanonicalFile().getParentFile();
+ }
+ catch (URISyntaxException | IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private void setArgProperties(String[] args) {
+ for(String arg:args){
+ setArgumentProperty(arg);
+ }
+ }
+
+ private void setArgumentProperty(String arg) {
+ String propertyName = "org.freeplane.param" + ++argCount;
+ System.setProperty(propertyName, arg);
+ }
+
+}
diff --git a/freeplane_framework/src/org/freeplane/launcher/Launcher.java b/freeplane_framework/src/org/freeplane/launcher/Launcher.java
deleted file mode 100644
index 0480369..0000000
--- a/freeplane_framework/src/org/freeplane/launcher/Launcher.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.launcher;
-
-import java.io.File;
-import java.net.URISyntaxException;
-import java.net.URL;
-
-import org.knopflerfish.framework.Main;
-
-public class Launcher {
- private File frameworkDir;
- private int argCount;
-
- public Launcher() {
- frameworkDir = getPathToJar();
- argCount = 0;
- }
-
- public static void main(String[] args) {
- new Launcher().launch(args);
- }
-
-
- private void launch(String[] args) {
- setDefines();
- setArgProperties(args);
- run();
- }
-
- private void setDefines() {
- setDefine("org.knopflerfish.framework.readonly", "true");
- setDefine("org.knopflerfish.gosg.jars", "reference:file:" + getAbsolutePath("core") + '/');
- if(isDefineNotSet("org.freeplane.globalresourcedir"))
- setDefine("org.freeplane.globalresourcedir", getAbsolutePath("resources"));
-
- }
-
- private boolean isDefineNotSet(String name) {
- return System.getProperty(name, null) == null;
- }
-
- private String setDefine(String name, String value) {
- return System.setProperty(name, value);
- }
-
- private void run() {
- String[] args = new String[]{
- "-xargs",
- getAbsolutePath("props.xargs"),
- "-xargs",
- getAbsolutePath("init.xargs")
- };
- Main.main(args);
- }
-
- private String getAbsolutePath(String relativePath) {
- return new File(frameworkDir, relativePath).getAbsolutePath();
- }
-
- private File getPathToJar() {
- URL frameworkUrl = Main.class.getProtectionDomain().getCodeSource().getLocation();
- try {
- return new File(frameworkUrl.toURI()).getAbsoluteFile().getParentFile();
- } catch (URISyntaxException e) {
- throw new RuntimeException(e);
- }
- }
-
- private void setArgProperties(String[] args) {
- for(String arg:args){
- setArgumentProperty(arg);
- }
- }
-
- private void setArgumentProperty(String arg) {
- String propertyName = "org.freeplane.param" + ++argCount;
- System.setProperty(propertyName, arg);
- }
-
-}
diff --git a/freeplane_devresources/test/ListsTest.mm b/freeplane_framework/test_data/ListsTest.mm
similarity index 100%
rename from freeplane_devresources/test/ListsTest.mm
rename to freeplane_framework/test_data/ListsTest.mm
diff --git a/freeplane_devresources/test/RichtextTests.mm b/freeplane_framework/test_data/RichtextTests.mm
similarity index 100%
rename from freeplane_devresources/test/RichtextTests.mm
rename to freeplane_framework/test_data/RichtextTests.mm
diff --git a/freeplane_devresources/test/StructuredMapTest.mm b/freeplane_framework/test_data/StructuredMapTest.mm
similarity index 100%
rename from freeplane_devresources/test/StructuredMapTest.mm
rename to freeplane_framework/test_data/StructuredMapTest.mm
diff --git a/freeplane_devresources/test/generateTestMap.pl b/freeplane_framework/test_data/generateTestMap.pl
similarity index 100%
rename from freeplane_devresources/test/generateTestMap.pl
rename to freeplane_framework/test_data/generateTestMap.pl
diff --git a/freeplane_framework/windows-icons/Makefile.win b/freeplane_framework/windows-icons/Makefile.win
new file mode 100644
index 0000000..b1f3f65
--- /dev/null
+++ b/freeplane_framework/windows-icons/Makefile.win
@@ -0,0 +1,33 @@
+# Project: freeplaneIcons
+# Makefile created by Dev-C++ 5.5.3
+
+CPP = g++.exe
+CC = gcc.exe
+WINDRES = windres.exe
+RES = freeplaneIcons_private.res
+OBJ = $(RES)
+LINKOBJ = $(RES)
+LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib" -L"C:/Program Files (x86)/Dev-Cpp/MinGW32/mingw32/lib" -static-libstdc++ -static-libgcc --no-export-all-symbols --add-stdcall-alias
+INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include"
+CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW32/lib/gcc/mingw32/4.7.2/include/c++"
+BIN = freeplaneIcons.dll
+CXXFLAGS = $(CXXINCS) -DBUILDING_DLL=1
+CFLAGS = $(INCS) -DBUILDING_DLL=1
+RM = rm -f
+
+.PHONY: all all-before all-after clean clean-custom
+
+all: all-before $(BIN) all-after
+
+clean: clean-custom
+ ${RM} $(OBJ) $(BIN)
+
+DLLWRAP = dllwrap.exe
+DEFFILE = libfreeplaneIcons.def
+STATICLIB = libfreeplaneIcons.a
+
+$(BIN): $(LINKOBJ)
+ $(DLLWRAP) --output-def $(DEFFILE) --driver-name c++ --implib $(STATICLIB) $(LINKOBJ) $(LIBS) -o $(BIN)
+
+freeplaneIcons_private.res: freeplaneIcons_private.rc MMIcon.rc
+ $(WINDRES) -i freeplaneIcons_private.rc --input-format=rc -o freeplaneIcons_private.res -O coff
diff --git a/freeplane_framework/windows-icons/build/libfreeplaneIcons.a b/freeplane_framework/windows-icons/build/libfreeplaneIcons.a
new file mode 100644
index 0000000..8ea4531
Binary files /dev/null and b/freeplane_framework/windows-icons/build/libfreeplaneIcons.a differ
diff --git a/freeplane_framework/windows-icons/build/libfreeplaneIcons.def b/freeplane_framework/windows-icons/build/libfreeplaneIcons.def
new file mode 100644
index 0000000..4bd4d63
--- /dev/null
+++ b/freeplane_framework/windows-icons/build/libfreeplaneIcons.def
@@ -0,0 +1,2 @@
+; c:\Dev-Cpp\MinGW64\bin\dlltool --base-file C:\Users\Dimitry\AppData\Local\Temp\cca07348.base --output-exp freeplaneIcons.exp --dllname freeplaneIcons.dll --output-def build/libfreeplaneIcons.def --exclude-symbol=DllMainCRTStartup --def C:\Users\Dimitry\AppData\Local\Temp\cca07348.def
+EXPORTS
diff --git a/freeplane_framework/windows-icons/freeplaneIcons.layout b/freeplane_framework/windows-icons/freeplaneIcons.layout
new file mode 100644
index 0000000..a3752c9
--- /dev/null
+++ b/freeplane_framework/windows-icons/freeplaneIcons.layout
@@ -0,0 +1,10 @@
+[Editors]
+Focused=0
+Order=
+[Editor_0]
+Open=0
+Top=0
+CursorCol=1
+CursorRow=1
+TopLine=1
+LeftChar=1
diff --git a/freeplane_framework/windows-installer/Freeplane_without_Java.iss b/freeplane_framework/windows-installer/Freeplane_without_Java.iss
index 7dd1f71..e55471e 100644
--- a/freeplane_framework/windows-installer/Freeplane_without_Java.iss
+++ b/freeplane_framework/windows-installer/Freeplane_without_Java.iss
@@ -11,7 +11,7 @@
; Predrag Cuklin 18/06/2009 - Universial Version
;****************************************************************************
-#define MyVersion "1.3.15"
+#define MyVersion "1.5.11"
#define MyStatus ""
#define MyAppName "Freeplane"
#define MyAppPublisher "Open source"
@@ -23,7 +23,7 @@
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{D3941722-C4DD-4509-88C4-0E87F675A859}
-AppCopyright=Copyright � 2000-2014 Freeplane team and others
+AppCopyright=Copyright � 2000-2016 Freeplane team and others
AppName={#MyAppName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
@@ -32,12 +32,8 @@ AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
ArchitecturesInstallIn64BitMode=x64 ia64
-OutputDir=..\dist
-#if MyStatus == ""
- OutputBaseFilename=Freeplane-Setup-{#MyVersion}
-#else
- OutputBaseFilename=Freeplane-Setup-{#MyVersion}-{#MyStatus}
-#endif
+OutputDir=.
+OutputBaseFilename=Freeplane-Setup
SetupIconFile=Setup.ico
VersionInfoDescription=Free mind mapping software. Fast. Simple. Streamlined.
ChangesAssociations=true
@@ -73,9 +69,8 @@ Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:Ad
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}
Name: associate; Description: {cm:AssocFileExtension,Freeplane,.mm}; GroupDescription: {cm:AssocingFileExtension,Freeplane,.mm}
-
[Files]
-Source: ..\build\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Excludes: fwdir\*
+Source: "..\..\BUILD\*"; DestDir: "{app}"; Flags: ignoreversion createallsubdirs recursesubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
diff --git a/freeplane_framework/windows-portable/App/AppInfo/appinfo.ini b/freeplane_framework/windows-portable/App/AppInfo/appinfo.ini
index 718b5a4..ea88435 100644
--- a/freeplane_framework/windows-portable/App/AppInfo/appinfo.ini
+++ b/freeplane_framework/windows-portable/App/AppInfo/appinfo.ini
@@ -21,8 +21,8 @@ CommercialUse=true
EULAVersion=1
[Version]
-PackageVersion=1.3.15.1
-DisplayVersion=1.3.15
+PackageVersion=1.5.11.1
+DisplayVersion=1.5.11
[SpecialPaths]
Plugins=NONE
diff --git a/freeplane_mac/.classpath b/freeplane_mac/.classpath
deleted file mode 100644
index 821639c..0000000
--- a/freeplane_mac/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry combineaccessrules="false" kind="src" path="/freeplane"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_mac/.project b/freeplane_mac/.project
deleted file mode 100644
index e923848..0000000
--- a/freeplane_mac/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_mac</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_mac/ant/build.xml b/freeplane_mac/ant/build.xml
deleted file mode 100644
index 7fc2854..0000000
--- a/freeplane_mac/ant/build.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<project name="freeplane_mac" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property name="src" value="src" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property name="build" value="build" />
- <property name="dist" value="dist" />
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${framework.jar}:${freeplane.jars}"/>
-
- <target name="build">
- <mkdir dir="${build}"/>
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}">
- </javac>
- </target>
-
-
- <target name="dist" depends="build">
- <jar jarfile="${workspace}/freeplane/lib/freeplanemac.jar" update="false" >
- <fileset dir="${build}"/>
- </jar>
- </target>
-
- <target name="clean">
- <delete dir="${build}" quiet="true"/>
- <delete>
- <fileset defaultexcludes="no" dir="${src}" includes="**/*~"/>
- </delete>
- </target>
-
-</project>
-
diff --git a/freeplane_mac/build.gradle b/freeplane_mac/build.gradle
new file mode 100644
index 0000000..3c41073
--- /dev/null
+++ b/freeplane_mac/build.gradle
@@ -0,0 +1,9 @@
+import org.apache.tools.ant.taskdefs.condition.Os;
+
+dependencies {
+ compile (project(':freeplane')) {
+ transitive = false
+ }
+}
+
+compileJava.onlyIf { Os.isFamily(Os.FAMILY_MAC) && Boolean.getBoolean('compileMacChanges')}
diff --git a/freeplane_mac/build.properties b/freeplane_mac/build.properties
index e69de29..8b13789 100644
--- a/freeplane_mac/build.properties
+++ b/freeplane_mac/build.properties
@@ -0,0 +1 @@
+
diff --git a/freeplane_mac/src/main/java/org/freeplane/plugin/macos/MacChanges.java b/freeplane_mac/src/main/java/org/freeplane/plugin/macos/MacChanges.java
new file mode 100644
index 0000000..08a8d68
--- /dev/null
+++ b/freeplane_mac/src/main/java/org/freeplane/plugin/macos/MacChanges.java
@@ -0,0 +1,143 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2010.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.macos;
+
+import java.awt.EventQueue;
+import java.io.File;
+import java.net.URI;
+
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.ui.ViewController;
+
+import com.apple.eawt.*;
+import com.apple.eawt.AppEvent.AboutEvent;
+import com.apple.eawt.AppEvent.OpenFilesEvent;
+import com.apple.eawt.AppEvent.OpenURIEvent;
+import com.apple.eawt.AppEvent.PreferencesEvent;
+import com.apple.eawt.AppEvent.QuitEvent;
+
+public class MacChanges implements AboutHandler, OpenFilesHandler, PreferencesHandler, OpenURIHandler, QuitHandler{
+
+ private static Application fmMacApplication;
+
+ private final Controller controller;
+
+ private int loadedMapCounter = 0;
+
+ static public void apply(Controller controller) {
+ new MacChanges(controller);
+ }
+
+ private MacChanges(Controller controller) {
+ this.controller = controller;
+ if(fmMacApplication==null){
+ // if a handleOpen comes here, directly, we know that FM is currently starting.
+ fmMacApplication = Application.getApplication();
+ fmMacApplication.setAboutHandler(this);
+ fmMacApplication.setPreferencesHandler(this);
+ fmMacApplication.setOpenFileHandler(this);
+ fmMacApplication.setOpenURIHandler(this);
+ fmMacApplication.setQuitHandler(this);
+ // wait until handleOpenFile finishes if it was called in event thread
+ try {
+ EventQueue.invokeAndWait(new Runnable() {
+ public void run() {
+ };
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+
+ private MModeController getModeController() {
+ return (MModeController) controller.getModeController(MModeController.MODENAME);
+ }
+
+
+ public void handleQuitRequestWith(QuitEvent event, QuitResponse response) {
+ try {
+ controller.quit();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ response.cancelQuit();
+ }
+
+
+ public void openURI(OpenURIEvent event) {
+ URI uri = event.getURI();
+
+ try {
+ ViewController viewController = controller.getViewController();
+ if(viewController == null) {
+ // restore at startup:
+ loadedMapCounter++;
+ System.setProperty("org.freeplane.param" + loadedMapCounter, uri.toString());
+ } else {
+ // Direct loading
+ LinkController.getController().loadURI(uri);
+ }
+ } catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+
+
+ public void handlePreferences(PreferencesEvent event) {
+ getModeController().getAction("PropertyAction").actionPerformed(null);
+
+ }
+
+
+ public void openFiles(OpenFilesEvent event) {
+ for(File file : event.getFiles()){
+ String filePath = file.getPath();
+ openFile(filePath);
+ }
+ }
+
+ private void openFile(String filePath) {
+ try {
+ ViewController viewController = controller.getViewController();
+ if(viewController == null) {
+ // restore at startup:
+ loadedMapCounter++;
+ System.setProperty("org.freeplane.param" + loadedMapCounter, filePath);
+ } else {
+ // Direct loading
+ getModeController().getMapController().newMap(Compat.fileToUrl(new File(filePath)));
+ }
+ } catch (Exception e) {
+ LogUtils.warn(e);
+ }
+ }
+
+
+ public void handleAbout(AboutEvent event) {
+ getModeController().getController().getAction("AboutAction").actionPerformed(null);
+
+ }
+}
diff --git a/freeplane_mac/src/org/freeplane/plugin/macos/MacChanges.java b/freeplane_mac/src/org/freeplane/plugin/macos/MacChanges.java
deleted file mode 100644
index 0573774..0000000
--- a/freeplane_mac/src/org/freeplane/plugin/macos/MacChanges.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2010.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.macos;
-
-import java.awt.EventQueue;
-import java.io.File;
-import java.net.URI;
-
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.ui.ViewController;
-
-import com.apple.eawt.*;
-import com.apple.eawt.AppEvent.AboutEvent;
-import com.apple.eawt.AppEvent.OpenFilesEvent;
-import com.apple.eawt.AppEvent.OpenURIEvent;
-import com.apple.eawt.AppEvent.PreferencesEvent;
-import com.apple.eawt.AppEvent.QuitEvent;
-
-public class MacChanges implements AboutHandler, OpenFilesHandler, PreferencesHandler, OpenURIHandler, QuitHandler{
-
- private static Application fmMacApplication;
-
- private final Controller controller;
-
- private int loadedMapCounter = 0;
-
- static public void apply(Controller controller) {
- new MacChanges(controller);
- }
-
- private MacChanges(Controller controller) {
- this.controller = controller;
- if(fmMacApplication==null){
- // if a handleOpen comes here, directly, we know that FM is currently starting.
- fmMacApplication = Application.getApplication();
- fmMacApplication.setAboutHandler(this);
- fmMacApplication.setPreferencesHandler(this);
- fmMacApplication.setOpenFileHandler(this);
- fmMacApplication.setOpenURIHandler(this);
- fmMacApplication.setQuitHandler(this);
- // wait until handleOpenFile finishes if it was called in event thread
- try {
- EventQueue.invokeAndWait(new Runnable() {
- public void run() {
- };
- });
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
-
- private MModeController getModeController() {
- return (MModeController) controller.getModeController(MModeController.MODENAME);
- }
-
- @Override
- public void handleQuitRequestWith(QuitEvent event, QuitResponse response) {
- try {
- controller.quit();
- } catch (Exception e) {
- e.printStackTrace();
- }
- response.cancelQuit();
- }
-
- @Override
- public void openURI(OpenURIEvent event) {
- URI uri = event.getURI();
-
- try {
- ViewController viewController = controller.getViewController();
- if(viewController == null) {
- // restore at startup:
- loadedMapCounter++;
- System.setProperty("org.freeplane.param" + loadedMapCounter, uri.toString());
- } else {
- // Direct loading
- LinkController.getController().loadURI(uri);
- }
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- }
-
- @Override
- public void handlePreferences(PreferencesEvent event) {
- getModeController().getAction("PropertyAction").actionPerformed(null);
-
- }
-
- @Override
- public void openFiles(OpenFilesEvent event) {
- for(File file : event.getFiles()){
- String filePath = file.getPath();
- openFile(filePath);
- }
- }
-
- private void openFile(String filePath) {
- try {
- ViewController viewController = controller.getViewController();
- if(viewController == null) {
- // restore at startup:
- loadedMapCounter++;
- System.setProperty("org.freeplane.param" + loadedMapCounter, filePath);
- } else {
- // Direct loading
- getModeController().getMapController().newMap(Compat.fileToUrl(new File(filePath)));
- }
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- }
-
- @Override
- public void handleAbout(AboutEvent event) {
- getModeController().getController().getAction("AboutAction").actionPerformed(null);
-
- }
-}
\ No newline at end of file
diff --git a/freeplane_plugin_bugreport/.classpath b/freeplane_plugin_bugreport/.classpath
deleted file mode 100644
index 64ed6b3..0000000
--- a/freeplane_plugin_bugreport/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_plugin_bugreport/.project b/freeplane_plugin_bugreport/.project
deleted file mode 100644
index 42c0c53..0000000
--- a/freeplane_plugin_bugreport/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_bugreport</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_bugreport/.settings/org.eclipse.core.resources.prefs b/freeplane_plugin_bugreport/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 9d60dc3..0000000
--- a/freeplane_plugin_bugreport/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:02 CET 2010
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/freeplane_plugin_bugreport/.settings/org.eclipse.core.runtime.prefs b/freeplane_plugin_bugreport/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index 0963ed3..0000000
--- a/freeplane_plugin_bugreport/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:02 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/freeplane_plugin_bugreport/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_bugreport/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 284f0f4..0000000
--- a/freeplane_plugin_bugreport/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Sat Jun 13 12:56:08 CEST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/freeplane_plugin_bugreport/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_bugreport/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 33ef18e..0000000
--- a/freeplane_plugin_bugreport/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Sat Jun 13 12:56:08 CEST 2009
-eclipse.preferences.version=1
-pluginProject.equinox=false
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/freeplane_plugin_bugreport/META-INF/MANIFEST.MF b/freeplane_plugin_bugreport/META-INF/MANIFEST.MF
deleted file mode 100644
index 48952f9..0000000
--- a/freeplane_plugin_bugreport/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.plugin.bugreport
-Bundle-SymbolicName: org.freeplane.plugin.bugreport
-Bundle-Version: 1.0.1
-Bundle-Activator: org.freeplane.plugin.bugreport.Activator
-Import-Package: org.osgi.framework;version="1.3.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.freeplane.core;bundle-version="1.0.1"
-Bundle-ClassPath: lib/plugin.jar
diff --git a/freeplane_plugin_bugreport/ant/ant.properties b/freeplane_plugin_bugreport/ant/ant.properties
deleted file mode 100644
index 4886301..0000000
--- a/freeplane_plugin_bugreport/ant/ant.properties
+++ /dev/null
@@ -1 +0,0 @@
-plugin.ext.lib = lib
diff --git a/freeplane_plugin_bugreport/ant/build.xml b/freeplane_plugin_bugreport/ant/build.xml
deleted file mode 100644
index c4d0445..0000000
--- a/freeplane_plugin_bugreport/ant/build.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<project name="freeplane_script" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property name="src" value="src" />
- <property name = "root" value = "."/>
- <property name="osgimanifest" value="${root}/META-INF/MANIFEST.MF" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="ant/ant.properties" />
- <property name="external.jars" value="${commons-lang.jar}:${forms.jar}:${SimplyHTML.jar}" />
- <property name="build" value="${root}/build" />
- <property name="dist" value="${root}/dist" />
- <property name="dist.osgi.dir" value="${dist}/org.freeplane.plugin.bugreport" />
- <property name="freeplaneplugin.jar" value="${dist}/org.freeplane.plugin.bugreport.jar"/>
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${framework.jar}:${freeplane.jars}:${external.jars}"/>
-
- <target name="build">
- <mkdir dir="${build}" />
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- </javac>
- </target>
-
-
- <target name="dist" depends="build">
- <jar jarfile="lib/plugin.jar">
- <fileset dir="${build}"/>
- </jar>
- <delete dir="${dist.osgi.dir}" quiet="true"/>
- <mkdir dir="${dist.osgi.dir}" />
- <copy todir="${dist.osgi.dir}">
- <fileset dir="${root}">
- <include name="lib/**"/>
- </fileset>
- </copy>
- <mkdir dir="${dist.osgi.dir}/META-INF" />
- <copy tofile="${dist.osgi.dir}/META-INF/MANIFEST.MF" file="${osgimanifest}"/>
- <delete file="lib/plugin.jar" quiet="true"/>
- </target>
-
- <target name="osgi_dist_as_jar" depends="dist">
- <jar jarfile="${freeplaneplugin.jar}">
- <fileset dir="${dist.osgi.dir}">
- <include name="**" />
- </fileset>
- </jar>
- </target>
-
- <target name="clean">
- <delete dir="${build}" quiet="true"/>
- <delete dir="${dist}" quiet="true"/>
- <delete>
- <fileset defaultexcludes="no" dir="${src}" includes="**/*~"/>
- </delete>
- </target>
-
-</project>
-
diff --git a/freeplane_plugin_bugreport/build.gradle b/freeplane_plugin_bugreport/build.gradle
new file mode 100644
index 0000000..528a46c
--- /dev/null
+++ b/freeplane_plugin_bugreport/build.gradle
@@ -0,0 +1,35 @@
+dependencies {
+ compile project(':freeplane')
+}
+
+jar {
+ manifest {
+ name = pluginid
+ symbolicName = pluginid
+
+ configurations.runtime.transitive = false
+ def deps = filterAndExternalizePluginDependencies(configurations.runtime.files)
+ deps.add(0, "lib/plugin-" + project.version + '.jar')
+
+ attributes 'Class-Path': deps.join(', ')
+ attributes 'Bundle-ClassPath': '., ' + deps.join(', ')
+
+ instruction 'Bundle-Vendor', 'Freeplane Project'
+ instruction 'Bundle-Activator', pluginid + ".Activator"
+ instruction 'Bundle-RequiredExecutionEnvironment', 'JavaSE-1.6'
+
+ def imports = """\
+ org.osgi.framework;version="1.3.0",
+ org.freeplane.core.*,
+ org.freeplane.features.*,
+ org.freeplane.main.*,
+ org.freeplane.n3.*,
+ org.freeplane.view.*
+ """
+ instruction 'Import-Package', imports.replaceAll("\\s+", "")
+ instruction 'Export-Package', ''
+
+ // Require-Bundle is ignored by bnd => replaced by Import-Package!
+ //instruction 'Require-Bundle', 'org.freeplane.core;bundle-version="1.0.1"'
+ }
+}
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/Activator.java b/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/Activator.java
similarity index 100%
rename from freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/Activator.java
rename to freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/Activator.java
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugFormatter.java b/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/BugFormatter.java
similarity index 100%
rename from freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugFormatter.java
rename to freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/BugFormatter.java
diff --git a/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/BugReportDialogManager.java b/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/BugReportDialogManager.java
new file mode 100644
index 0000000..3915a94
--- /dev/null
+++ b/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/BugReportDialogManager.java
@@ -0,0 +1,39 @@
+package org.freeplane.plugin.bugreport;
+
+import java.awt.Dimension;
+
+import javax.swing.Box;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+
+import org.freeplane.core.ui.components.UITools;
+
+class BugReportDialogManager {
+ static final String ALLOWED = "org.freeplane.plugin.bugreport.allowed";
+ static final String ASK = "org.freeplane.plugin.bugreport.ask";
+ static final String DENIED = "org.freeplane.plugin.bugreport.denied";
+
+ static int showBugReportDialog(final String title, final String question, final int messageType,
+ final Object[] options, final Object firstChoice, final String reportName,
+ final String log) {
+ final Box messagePane = Box.createVerticalBox();
+ final JLabel messageLabel = new JLabel(question);
+ messageLabel.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+ messagePane.add(messageLabel);
+ messagePane.add(Box.createVerticalStrut(10));
+ final JLabel messageLabel2 = new JLabel(reportName);
+ messageLabel2.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+ messagePane.add(messageLabel2);
+ final JTextArea historyArea = new JTextArea(log);
+ historyArea.setEditable(false);
+ final JScrollPane historyPane = new JScrollPane(historyArea);
+ historyPane.setPreferredSize(new Dimension(500, 300));
+ historyPane.setAlignmentX(JLabel.LEFT_ALIGNMENT);
+ messagePane.add(historyPane);
+ final int choice = JOptionPane.showOptionDialog(UITools.getCurrentRootComponent(), messagePane, title,
+ JOptionPane.DEFAULT_OPTION, messageType, null, options, firstChoice);
+ return choice;
+ }
+}
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/IBugReportListener.java b/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/IBugReportListener.java
similarity index 100%
rename from freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/IBugReportListener.java
rename to freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/IBugReportListener.java
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ManualBugReporter.java b/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/ManualBugReporter.java
similarity index 100%
rename from freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ManualBugReporter.java
rename to freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/ManualBugReporter.java
diff --git a/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/ReportGenerator.java b/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/ReportGenerator.java
new file mode 100644
index 0000000..63fbf77
--- /dev/null
+++ b/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/ReportGenerator.java
@@ -0,0 +1,442 @@
+package org.freeplane.plugin.bugreport;
+
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.security.AccessController;
+import java.security.MessageDigest;
+import java.security.PrivilegedAction;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TimeZone;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+import java.util.logging.StreamHandler;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.ui.ViewController;
+
+public class ReportGenerator extends StreamHandler {
+ private static final String BUGREPORT_USER_ID = "org.freeplane.plugin.bugreport.userid";
+ private static final String REMOTE_LOG = "RemoteLog";
+ private static final String NO_REPORTS_SENT_BEFORE = "no reports sent before";
+ static final String LAST_BUG_REPORT_INFO = "last_bug_report_info";
+
+ private class SubmitRunner implements Runnable {
+
+ public SubmitRunner() {
+ }
+
+ public void run() {
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
+ runSubmit();
+ return null;
+ }
+ });
+ }
+ }
+
+ private class SubmitStarter implements Runnable {
+ SubmitStarter() {
+ if (Controller.getCurrentController().getViewController().isDispatchThread()) {
+ return;
+ }
+ final Thread currentThread = Thread.currentThread();
+ Controller.getCurrentController().getViewController().invokeLater(new Runnable() {
+ public void run() {
+ try {
+ currentThread.join(1000);
+ }
+ catch (final InterruptedException e) {
+ }
+ }
+ });
+ }
+
+ public void run() {
+ startSubmit();
+ }
+ }
+
+ private final static String BUG_TRACKER_REFERENCE_URL = "http://freeplane.sourceforge.net/info/bugtracker.ref.txt";
+ private static String BUG_TRACKER_URL = null;
+ static boolean disabled = false;
+ private static int errorCounter = 0;
+ private static String info;
+ static final private String OPTION = "org.freeplane.plugin.bugreport";
+ private static ByteArrayOutputStream out = null;
+ private static String version;
+ private static String revision;
+
+ private static String toHexString(final byte[] v) {
+ final String HEX_DIGITS = "0123456789abcdef";
+ final StringBuffer sb = new StringBuffer(v.length * 2);
+ for (int i = 0; i < v.length; i++) {
+ final int b = v[i] & 0xFF;
+ sb.append(HEX_DIGITS.charAt(b >>> 4)).append(HEX_DIGITS.charAt(b & 0xF));
+ }
+ return sb.toString();
+ }
+
+ private String hash = null;
+ private boolean isRunning;
+ private String log = null;
+ private MessageDigest md = null;
+ private boolean reportCollected = false;
+ private IBugReportListener bugReportListener;
+
+ public IBugReportListener getBugReportListener() {
+ return bugReportListener;
+ }
+
+ public void setBugReportListener(final IBugReportListener bugReportListener) {
+ this.bugReportListener = bugReportListener;
+ }
+
+ public ReportGenerator() {
+ super();
+ try {
+ setEncoding("UTF-8");
+ }
+ catch (final SecurityException e) {
+ }
+ catch (final UnsupportedEncodingException e) {
+ }
+ setFormatter(new BugFormatter());
+ setLevel(Level.SEVERE);
+ }
+
+ private String calculateHash(final String errorMessage) {
+ final String[] lines = errorMessage.split("\n");
+ final StringBuffer hashInput = new StringBuffer();
+ for (int i = 0; i < lines.length; i++) {
+ final String s = lines[i];
+ if (s.startsWith("\tat org.freeplane.")
+ || s.startsWith("missing key ")
+ ) {
+ hashInput.append(s);
+ }
+ }
+ if (hashInput.length() == 0) {
+ return null;
+ }
+ hashInput.append(version);
+ hashInput.append(revision);
+ try {
+ return calculateHash(hashInput.toString().getBytes(getEncoding()));
+ }
+ catch (final UnsupportedEncodingException e) {
+ return null;
+ }
+ }
+
+ private String calculateHash(final byte[] byteArray) {
+ try {
+ if (md == null) {
+ md = MessageDigest.getInstance("MD5");
+ }
+ final byte[] digest = md.digest(byteArray);
+ return ReportGenerator.toHexString(digest);
+ }
+ catch (final Exception e) {
+ LogUtils.warn(e);
+ return null;
+ }
+ }
+
+ private void createInfo() {
+ if (info == null) {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("freeplane_version = ");
+ version = FreeplaneVersion.getVersion().toString();
+ sb.append(version);
+ sb.append("; freeplane_xml_version = ");
+ sb.append(FreeplaneVersion.XML_VERSION);
+
+ revision = FreeplaneVersion.getVersion().getRevision();
+
+ if(! revision.equals("")){
+ sb.append("\ngit revision = ");
+ sb.append(revision);
+ }
+ sb.append("\njava_version = ");
+ sb.append(System.getProperty("java.version"));
+ sb.append("; os_name = ");
+ sb.append(System.getProperty("os.name"));
+ sb.append("; os_version = ");
+ sb.append(System.getProperty("os.version"));
+ sb.append('\n');
+ info = sb.toString();
+ }
+ }
+
+ private String getBugTrackerUrl() {
+ if (BUG_TRACKER_URL != null) {
+ return BUG_TRACKER_URL;
+ }
+ try {
+ final URL url = new URL(BUG_TRACKER_REFERENCE_URL);
+ final BufferedReader in = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
+ BUG_TRACKER_URL = in.readLine();
+ return BUG_TRACKER_URL;
+ }
+ catch (final Exception e) {
+ disabled = true;
+ return null;
+ }
+ }
+
+ private static class LogOpener implements ActionListener{
+ public void actionPerformed(ActionEvent e) {
+ final String freeplaneLogDirectoryPath = LogUtils.getLogDirectory();
+ final File file = new File(freeplaneLogDirectoryPath);
+ if(file.isDirectory()){
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ try {
+ viewController.openDocument(file.toURL());
+ }
+ catch (Exception ex) {
+ }
+ }
+ }
+ }
+ JButton logButton;
+ @Override
+ public synchronized void publish(final LogRecord record) {
+ final Controller controller = Controller.getCurrentController();
+ if (controller == null) {
+ // ReportGenerator is not available during controller initialization
+ return;
+ }
+ final ViewController viewController = controller.getViewController();
+ if (viewController == null) {
+ // ReportGenerator is not available during controller initialization
+ return;
+ }
+ if (out == null) {
+ out = new ByteArrayOutputStream();
+ AccessController.doPrivileged(new PrivilegedAction<Void>() {
+ @Override
+ public Void run() {
+ setOutputStream(out);
+ return null;
+ }
+ });
+ }
+ if (!isLoggable(record)) {
+ return;
+ }
+ if (!(disabled || isRunning || reportCollected)) {
+ reportCollected = true;
+ viewController.invokeLater(new SubmitStarter());
+ }
+ viewController.invokeLater(new Runnable() {
+ @SuppressWarnings("serial")
+ public void run() {
+ try {
+ errorCounter++;
+ if(TextUtils.getRawText("internal_error_tooltip", null) != null){
+ if(logButton == null){
+ final ImageIcon errorIcon = new ImageIcon(ResourceController.getResourceController().getResource(
+ "/images/icons/messagebox_warning.png"));
+ logButton = new JButton(){
+ @Override public Dimension getPreferredSize(){
+ Dimension preferredSize = super.getPreferredSize();
+ preferredSize.height = getIcon().getIconHeight();
+ return preferredSize;
+ }
+ };
+ logButton.addActionListener(new LogOpener());
+ logButton.setIcon(errorIcon);
+ String tooltip = TextUtils.getText("internal_error_tooltip");
+ logButton.setToolTipText(tooltip);
+ viewController.addStatusComponent("internal_error", logButton);
+ }
+ logButton.setText(TextUtils.format("errornumber", errorCounter));
+ }
+ }
+ catch (Exception e) {
+ }
+ }
+ });
+ super.publish(record);
+ }
+
+ private void runSubmit() {
+ try {
+ close();
+ final String errorMessage = out.toString(getEncoding());
+ if (errorMessage.indexOf(getClass().getPackage().getName()) != -1) {
+ // avoid infinite loops
+ System.err.println("don't send bug reports from bugreport plugin");
+ return;
+ }
+ createInfo();
+ hash = calculateHash(errorMessage);
+ if (hash == null) {
+ return;
+ }
+ final String reportHeader = createReportHeader();
+ StringBuilder sb = new StringBuilder();
+ sb.append(reportHeader).append('\n').append("previous report : ");
+ String lastReportInfo = ResourceController.getResourceController().getProperty(LAST_BUG_REPORT_INFO, NO_REPORTS_SENT_BEFORE);
+ sb.append(lastReportInfo).append('\n');
+ final String userId = ResourceController.getResourceController().getProperty(BUGREPORT_USER_ID);
+ if (userId.length() > 0){
+ sb.append("user : ").append(userId).append('\n');
+ }
+ sb.append(info);
+ sb.append(errorMessage);
+ log = sb.toString();
+
+ if (log.equals("")) {
+ return;
+ }
+ final ReportRegistry register = ReportRegistry.getInstance();
+ if (register.isReportRegistered(hash)) {
+ return;
+ }
+ final String option = showBugReportDialog();
+ if (BugReportDialogManager.ALLOWED.equals(option)) {
+ register.registerReport(hash, reportHeader);
+ final Map<String, String> report = new LinkedHashMap<String, String>();
+ report.put("hash", hash);
+ report.put("log", log);
+ report.put("version", version);
+ report.put("revision", revision);
+ String status = AccessController.doPrivileged(new PrivilegedAction<String>() {
+ @Override
+ public String run() {
+ final String status = sendReport(report);
+ return status;
+ }
+ });
+ if (bugReportListener != null && status != null) {
+ bugReportListener.onReportSent(report, status);
+ }
+
+ }
+ }
+ catch (final UnsupportedEncodingException e) {
+ LogUtils.severe(e);
+ }
+ finally {
+ out = null;
+ reportCollected = false;
+ isRunning = false;
+ }
+ }
+
+
+ private String createReportHeader() {
+ SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
+ String time = dateFormatGmt.format(new Date());
+ final String currentReportInfo = "at " + time + " CMT, hash " + hash;
+ return currentReportInfo;
+ }
+
+ private String showBugReportDialog() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ String option = resourceController.getProperty(OPTION, BugReportDialogManager.ASK);
+ if (option.equals(BugReportDialogManager.ASK)) {
+ if(resourceController.getBooleanProperty("org.freeplane.plugin.bugreport.dialog.disabled"))
+ return BugReportDialogManager.DENIED;
+ String question = TextUtils.getText("org.freeplane.plugin.bugreport.question");
+ if (!question.startsWith("<html>")) {
+ question = HtmlUtils.plainToHTML(question);
+ }
+ final Object[] options = new Object[] { TextUtils.getText("org.freeplane.plugin.bugreport.always_agree"),
+ TextUtils.getText("org.freeplane.plugin.bugreport.agree"),
+ TextUtils.getText("org.freeplane.plugin.bugreport.deny"),
+ TextUtils.getText("org.freeplane.plugin.bugreport.always_deny") };
+ final String title = TextUtils.getText("org.freeplane.plugin.bugreport.dialog.title");
+ final String reportName = TextUtils.getText("org.freeplane.plugin.bugreport.report");
+ final int choice = BugReportDialogManager.showBugReportDialog(title, question,
+ JOptionPane.INFORMATION_MESSAGE, options, options[1], reportName, log);
+ switch (choice) {
+ case 0:
+ option = BugReportDialogManager.ALLOWED;
+ resourceController.setProperty(OPTION, option);
+ break;
+ case 1:
+ option = BugReportDialogManager.ALLOWED;
+ break;
+ case 2:
+ option = BugReportDialogManager.DENIED;
+ break;
+ case 3:
+ option = BugReportDialogManager.DENIED;
+ resourceController.setProperty(OPTION, option);
+ break;
+ default:
+ option = BugReportDialogManager.DENIED;
+ break;
+ }
+ }
+ return option;
+ }
+
+ private String sendReport(final Map<String, String> reportFields) {
+ try {
+ // Construct data
+ final StringBuilder data = new StringBuilder();
+ for (final Entry<String, String> entry : reportFields.entrySet()) {
+ if (data.length() != 0) {
+ data.append('&');
+ }
+ data.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
+ data.append('=');
+ data.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
+ }
+ // Send data
+ final URL url = new URL(getBugTrackerUrl());
+ final URLConnection conn = url.openConnection();
+ conn.setDoOutput(true);
+ final OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
+ wr.write(data.toString());
+ wr.flush();
+ // Get the response
+ final BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+ final String line = rd.readLine();
+ if (line != null) {
+ System.out.println(line);
+ }
+ wr.close();
+ rd.close();
+ return line;
+ }
+ catch (final Exception e) {
+ }
+ return null;
+ }
+
+ private void startSubmit() {
+ isRunning = true;
+ final Thread submitterThread = new Thread(new SubmitRunner(), REMOTE_LOG);
+ submitterThread.start();
+ }
+}
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportRegistry.java b/freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/ReportRegistry.java
similarity index 100%
rename from freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportRegistry.java
rename to freeplane_plugin_bugreport/src/main/java/org/freeplane/plugin/bugreport/ReportRegistry.java
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugReportDialogManager.java b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugReportDialogManager.java
deleted file mode 100644
index 6267cec..0000000
--- a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/BugReportDialogManager.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.freeplane.plugin.bugreport;
-
-import java.awt.Dimension;
-
-import javax.swing.Box;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.JTextArea;
-
-import org.freeplane.core.ui.components.UITools;
-
-class BugReportDialogManager {
- static final String ALLOWED = "org.freeplane.plugin.bugreport.allowed";
- static final String ASK = "org.freeplane.plugin.bugreport.ask";
- static final String DENIED = "org.freeplane.plugin.bugreport.denied";
-
- static int showBugReportDialog(final String title, final String question, final int messageType,
- final Object[] options, final Object firstChoice, final String reportName,
- final String log) {
- final Box messagePane = Box.createVerticalBox();
- final JLabel messageLabel = new JLabel(question);
- messageLabel.setAlignmentX(JLabel.LEFT_ALIGNMENT);
- messagePane.add(messageLabel);
- messagePane.add(Box.createVerticalStrut(10));
- final JLabel messageLabel2 = new JLabel(reportName);
- messageLabel2.setAlignmentX(JLabel.LEFT_ALIGNMENT);
- messagePane.add(messageLabel2);
- final JTextArea historyArea = new JTextArea(log);
- historyArea.setEditable(false);
- final JScrollPane historyPane = new JScrollPane(historyArea);
- historyPane.setPreferredSize(new Dimension(500, 300));
- historyPane.setAlignmentX(JLabel.LEFT_ALIGNMENT);
- messagePane.add(historyPane);
- final int choice = JOptionPane.showOptionDialog(UITools.getFrame(), messagePane, title,
- JOptionPane.DEFAULT_OPTION, messageType, null, options, firstChoice);
- return choice;
- }
-}
diff --git a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportGenerator.java b/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportGenerator.java
deleted file mode 100644
index 54218d8..0000000
--- a/freeplane_plugin_bugreport/src/org/freeplane/plugin/bugreport/ReportGenerator.java
+++ /dev/null
@@ -1,417 +0,0 @@
-package org.freeplane.plugin.bugreport;
-
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.BufferedReader;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.UnsupportedEncodingException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.net.URLEncoder;
-import java.security.MessageDigest;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.TimeZone;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-import java.util.logging.StreamHandler;
-
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.ui.ViewController;
-
-public class ReportGenerator extends StreamHandler {
- private static final String BUGREPORT_USER_ID = "org.freeplane.plugin.bugreport.userid";
- private static final String REMOTE_LOG = "RemoteLog";
- private static final String NO_REPORTS_SENT_BEFORE = "no reports sent before";
- static final String LAST_BUG_REPORT_INFO = "last_bug_report_info";
-
- private class SubmitRunner implements Runnable {
-
- public SubmitRunner() {
- }
-
- public void run() {
- runSubmit();
- }
- }
-
- private class SubmitStarter implements Runnable {
- SubmitStarter() {
- if (Controller.getCurrentController().getViewController().isDispatchThread()) {
- return;
- }
- final Thread currentThread = Thread.currentThread();
- Controller.getCurrentController().getViewController().invokeLater(new Runnable() {
- public void run() {
- try {
- currentThread.join(1000);
- }
- catch (final InterruptedException e) {
- }
- }
- });
- }
-
- public void run() {
- startSubmit();
- }
- }
-
- private final static String BUG_TRACKER_REFERENCE_URL = "http://freeplane.sourceforge.net/info/bugtracker.ref.txt";
- private static String BUG_TRACKER_URL = null;
- static boolean disabled = false;
- private static int errorCounter = 0;
- private static String info;
- static final private String OPTION = "org.freeplane.plugin.bugreport";
- private static ByteArrayOutputStream out = null;
- private static String version;
- private static String revision;
-
- private static String toHexString(final byte[] v) {
- final String HEX_DIGITS = "0123456789abcdef";
- final StringBuffer sb = new StringBuffer(v.length * 2);
- for (int i = 0; i < v.length; i++) {
- final int b = v[i] & 0xFF;
- sb.append(HEX_DIGITS.charAt(b >>> 4)).append(HEX_DIGITS.charAt(b & 0xF));
- }
- return sb.toString();
- }
-
- private String hash = null;
- private boolean isRunning;
- private String log = null;
- private MessageDigest md = null;
- private boolean reportCollected = false;
- private IBugReportListener bugReportListener;
-
- public IBugReportListener getBugReportListener() {
- return bugReportListener;
- }
-
- public void setBugReportListener(final IBugReportListener bugReportListener) {
- this.bugReportListener = bugReportListener;
- }
-
- public ReportGenerator() {
- super();
- try {
- setEncoding("UTF-8");
- }
- catch (final SecurityException e) {
- }
- catch (final UnsupportedEncodingException e) {
- }
- setFormatter(new BugFormatter());
- setLevel(Level.SEVERE);
- }
-
- private String calculateHash(final String errorMessage) {
- final String[] lines = errorMessage.split("\n");
- final StringBuffer hashInput = new StringBuffer();
- for (int i = 0; i < lines.length; i++) {
- final String s = lines[i];
- if (s.startsWith("\tat org.freeplane.")
- || s.startsWith("missing key ")
- ) {
- hashInput.append(s);
- }
- }
- if (hashInput.length() == 0) {
- return null;
- }
- hashInput.append(version);
- hashInput.append(revision);
- try {
- return calculateHash(hashInput.toString().getBytes(getEncoding()));
- }
- catch (final UnsupportedEncodingException e) {
- return null;
- }
- }
-
- private String calculateHash(final byte[] byteArray) {
- try {
- if (md == null) {
- md = MessageDigest.getInstance("MD5");
- }
- final byte[] digest = md.digest(byteArray);
- return ReportGenerator.toHexString(digest);
- }
- catch (final Exception e) {
- LogUtils.warn(e);
- return null;
- }
- }
-
- private void createInfo() {
- if (info == null) {
- final StringBuilder sb = new StringBuilder();
- sb.append("freeplane_version = ");
- version = FreeplaneVersion.getVersion().toString();
- sb.append(version);
- sb.append("; freeplane_xml_version = ");
- sb.append(FreeplaneVersion.XML_VERSION);
-
- revision = FreeplaneVersion.getVersion().getRevision();
-
- if(! revision.equals("")){
- sb.append("\nbzr revision = ");
- sb.append(revision);
- }
- sb.append("\njava_version = ");
- sb.append(System.getProperty("java.version"));
- sb.append("; os_name = ");
- sb.append(System.getProperty("os.name"));
- sb.append("; os_version = ");
- sb.append(System.getProperty("os.version"));
- sb.append('\n');
- info = sb.toString();
- }
- }
-
- private String getBugTrackerUrl() {
- if (BUG_TRACKER_URL != null) {
- return BUG_TRACKER_URL;
- }
- try {
- final URL url = new URL(BUG_TRACKER_REFERENCE_URL);
- final BufferedReader in = new BufferedReader(new InputStreamReader(url.openConnection().getInputStream()));
- BUG_TRACKER_URL = in.readLine();
- return BUG_TRACKER_URL;
- }
- catch (final Exception e) {
- disabled = true;
- return null;
- }
- }
-
- private static class LogOpener implements ActionListener{
- public void actionPerformed(ActionEvent e) {
- final String freeplaneLogDirectoryPath = LogUtils.getLogDirectory();
- final File file = new File(freeplaneLogDirectoryPath);
- if(file.isDirectory()){
- final ViewController viewController = Controller.getCurrentController().getViewController();
- try {
- viewController.openDocument(file.toURL());
- }
- catch (Exception ex) {
- }
- }
- }
- }
- JButton logButton;
- @Override
- public synchronized void publish(final LogRecord record) {
- final Controller controller = Controller.getCurrentController();
- if (controller == null) {
- // ReportGenerator is not available during controller initialization
- return;
- }
- final ViewController viewController = controller.getViewController();
- if (out == null) {
- out = new ByteArrayOutputStream();
- setOutputStream(out);
- }
- if (!isLoggable(record)) {
- return;
- }
- if (!(disabled || isRunning || reportCollected)) {
- reportCollected = true;
- viewController.invokeLater(new SubmitStarter());
- }
- viewController.invokeLater(new Runnable() {
- @SuppressWarnings("serial")
- public void run() {
- try {
- errorCounter++;
- if(TextUtils.getRawText("internal_error_tooltip", null) != null){
- if(logButton == null){
- final ImageIcon errorIcon = new ImageIcon(ResourceController.getResourceController().getResource(
- "/images/icons/messagebox_warning.png"));
- logButton = new JButton(){
- @Override public Dimension getPreferredSize(){
- Dimension preferredSize = super.getPreferredSize();
- preferredSize.height = getIcon().getIconHeight();
- return preferredSize;
- }
- };
- logButton.addActionListener(new LogOpener());
- logButton.setIcon(errorIcon);
- String tooltip = TextUtils.getText("internal_error_tooltip");
- logButton.setToolTipText(tooltip);
- viewController.addStatusComponent("internal_error", logButton);
- }
- logButton.setText(TextUtils.format("errornumber", errorCounter));
- }
- }
- catch (Exception e) {
- }
- }
- });
- super.publish(record);
- }
-
- private void runSubmit() {
- try {
- close();
- final String errorMessage = out.toString(getEncoding());
- if (errorMessage.indexOf(getClass().getPackage().getName()) != -1) {
- // avoid infinite loops
- System.err.println("don't send bug reports from bugreport plugin");
- return;
- }
- createInfo();
- hash = calculateHash(errorMessage);
- if (hash == null) {
- return;
- }
- final String reportHeader = createReportHeader();
- StringBuilder sb = new StringBuilder();
- sb.append(reportHeader).append('\n').append("previous report : ");
- String lastReportInfo = ResourceController.getResourceController().getProperty(LAST_BUG_REPORT_INFO, NO_REPORTS_SENT_BEFORE);
- sb.append(lastReportInfo).append('\n');
- final String userId = ResourceController.getResourceController().getProperty(BUGREPORT_USER_ID);
- if (userId.length() > 0){
- sb.append("user : ").append(userId).append('\n');
- }
- sb.append(info);
- sb.append(errorMessage);
- log = sb.toString();
-
- if (log.equals("")) {
- return;
- }
- final ReportRegistry register = ReportRegistry.getInstance();
- if (register.isReportRegistered(hash)) {
- return;
- }
- final String option = showBugReportDialog();
- if (BugReportDialogManager.ALLOWED.equals(option)) {
- register.registerReport(hash, reportHeader);
- final Map<String, String> report = new LinkedHashMap<String, String>();
- report.put("hash", hash);
- report.put("log", log);
- report.put("version", version);
- report.put("revision", revision);
- final String status = sendReport(report);
- if (bugReportListener == null || status == null) {
- return;
- }
- bugReportListener.onReportSent(report, status);
- }
- }
- catch (final UnsupportedEncodingException e) {
- LogUtils.severe(e);
- }
- finally {
- out = null;
- reportCollected = false;
- isRunning = false;
- }
- }
-
-
- private String createReportHeader() {
- SimpleDateFormat dateFormatGmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- dateFormatGmt.setTimeZone(TimeZone.getTimeZone("GMT"));
- String time = dateFormatGmt.format(new Date());
- final String currentReportInfo = "at " + time + " CMT, hash " + hash;
- return currentReportInfo;
- }
-
- private String showBugReportDialog() {
- String option = ResourceController.getResourceController().getProperty(OPTION, BugReportDialogManager.ASK);
- if (option.equals(BugReportDialogManager.ASK)) {
- if(FreeplaneVersion.getVersion().isFinal())
- return BugReportDialogManager.DENIED;
- String question = TextUtils.getText("org.freeplane.plugin.bugreport.question");
- if (!question.startsWith("<html>")) {
- question = HtmlUtils.plainToHTML(question);
- }
- final Object[] options = new Object[] { TextUtils.getText("org.freeplane.plugin.bugreport.always_agree"),
- TextUtils.getText("org.freeplane.plugin.bugreport.agree"),
- TextUtils.getText("org.freeplane.plugin.bugreport.deny"),
- TextUtils.getText("org.freeplane.plugin.bugreport.always_deny") };
- final String title = TextUtils.getText("org.freeplane.plugin.bugreport.dialog.title");
- final String reportName = TextUtils.getText("org.freeplane.plugin.bugreport.report");
- final int choice = BugReportDialogManager.showBugReportDialog(title, question,
- JOptionPane.INFORMATION_MESSAGE, options, options[1], reportName, log);
- switch (choice) {
- case 0:
- option = BugReportDialogManager.ALLOWED;
- ResourceController.getResourceController().setProperty(OPTION, option);
- break;
- case 1:
- option = BugReportDialogManager.ALLOWED;
- break;
- case 2:
- option = BugReportDialogManager.DENIED;
- break;
- case 3:
- option = BugReportDialogManager.DENIED;
- ResourceController.getResourceController().setProperty(OPTION, option);
- break;
- default:
- option = BugReportDialogManager.DENIED;
- break;
- }
- }
- return option;
- }
-
- private String sendReport(final Map<String, String> reportFields) {
- try {
- // Construct data
- final StringBuilder data = new StringBuilder();
- for (final Entry<String, String> entry : reportFields.entrySet()) {
- if (data.length() != 0) {
- data.append('&');
- }
- data.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
- data.append('=');
- data.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
- }
- // Send data
- final URL url = new URL(getBugTrackerUrl());
- final URLConnection conn = url.openConnection();
- conn.setDoOutput(true);
- final OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
- wr.write(data.toString());
- wr.flush();
- // Get the response
- final BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
- final String line = rd.readLine();
- if (line != null) {
- System.out.println(line);
- }
- wr.close();
- rd.close();
- return line;
- }
- catch (final Exception e) {
- }
- return null;
- }
-
- private void startSubmit() {
- isRunning = true;
- final Thread submitterThread = new Thread(new SubmitRunner(), REMOTE_LOG);
- submitterThread.start();
- }
-}
diff --git a/freeplane_plugin_formula/.classpath b/freeplane_plugin_formula/.classpath
deleted file mode 100644
index 64ed6b3..0000000
--- a/freeplane_plugin_formula/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_plugin_formula/.project b/freeplane_plugin_formula/.project
deleted file mode 100644
index 8d978b4..0000000
--- a/freeplane_plugin_formula/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_formula</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_formula/.settings/org.eclipse.core.resources.prefs b/freeplane_plugin_formula/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 02eaf6f..0000000
--- a/freeplane_plugin_formula/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:23 CET 2010
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/freeplane_plugin_formula/.settings/org.eclipse.core.runtime.prefs b/freeplane_plugin_formula/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index baab3be..0000000
--- a/freeplane_plugin_formula/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:23 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/freeplane_plugin_formula/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_formula/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9ee9dd7..0000000
--- a/freeplane_plugin_formula/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Sun Jan 04 22:58:46 CET 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/freeplane_plugin_formula/META-INF/MANIFEST.MF b/freeplane_plugin_formula/META-INF/MANIFEST.MF
deleted file mode 100644
index 8f2db92..0000000
--- a/freeplane_plugin_formula/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.plugin.formula
-Bundle-SymbolicName: org.freeplane.plugin.formula
-Bundle-Version: 1.0.1
-Bundle-Activator: org.freeplane.plugin.formula.Activator
-Import-Package: org.osgi.framework;version="1.3.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.freeplane.core;bundle-version="1.0.1",
- org.freeplane.plugin.script;bundle-version="1.0.1"
-Bundle-ClassPath: lib/plugin.jar
diff --git a/freeplane_plugin_formula/ant/ant.properties b/freeplane_plugin_formula/ant/ant.properties
deleted file mode 100644
index e3e1a1e..0000000
--- a/freeplane_plugin_formula/ant/ant.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-plugin.ext.lib = lib
-freeplanescript.jar = ${workspace}/freeplane_plugin_script/dist/org.freeplane.plugin.script/lib/plugin.jar
diff --git a/freeplane_plugin_formula/ant/build.xml b/freeplane_plugin_formula/ant/build.xml
deleted file mode 100644
index 3a1f350..0000000
--- a/freeplane_plugin_formula/ant/build.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<project name="freeplane_formula" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property name="src" value="src" />
- <property name="root" value="."/>
- <property name="osgimanifest" value="${root}/META-INF/MANIFEST.MF" />
- <property name="xslt.base" value="${workspace}/freeplane/resources/xslt" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="ant/ant.properties" />
- <property name="external.jars" value="" />
- <property name="build" value="${root}/build" />
- <property name="dist" value="${root}/dist" />
- <property name="dist.osgi.dir" value="${dist}/org.freeplane.plugin.formula" />
- <property name="freeplaneplugin.jar" value="${dist}/org.freeplane.plugin.formula.jar"/>
- <property name="src.pluginclass" value="${src}/org/freeplane/plugin/formula/"/>
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${framework.jar}:${freeplane.jars}:${external.jars}:${freeplanescript.jar}"/>
-
- <target name="build" depends="build-ui-xml">
- <mkdir dir="${build}" />
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- </javac>
- </target>
-
- <target name="build-ui-xml">
- <xslt in="${src.pluginclass}/preferences.mm"
- style="${xslt.base}/mm2preferences.xsl"
- out="${src.pluginclass}/preferences.xml"/>
- </target>
-
-
- <target name="dist" depends="build">
- <jar jarfile="lib/plugin.jar">
- <fileset dir="${build}"/>
- <fileset dir="${src}">
- <include name="**/*.xml"/>
- <include name="**/*.properties"/>
- <exclude name="**/preferences.mm" />
- </fileset>
- </jar>
- <delete dir="${dist.osgi.dir}" quiet="true"/>
- <mkdir dir="${dist.osgi.dir}" />
- <copy todir="${dist.osgi.dir}">
- <fileset dir="${root}">
- <include name="lib/**"/>
- </fileset>
- </copy>
- <mkdir dir="${dist.osgi.dir}/META-INF" />
- <copy tofile="${dist.osgi.dir}/META-INF/MANIFEST.MF" file="${osgimanifest}"/>
- <delete file="lib/plugin.jar" quiet="true"/>
- </target>
-
- <target name="osgi_dist_as_jar" depends="dist">
- <jar jarfile="${freeplaneplugin.jar}">
- <fileset dir="${dist.osgi.dir}">
- <include name="**" />
- </fileset>
- </jar>
- </target>
-
- <target name="clean">
- <delete dir="${build}" quiet="true"/>
- <delete dir="${dist}" quiet="true"/>
- <delete>
- <fileset defaultexcludes="no" dir="${src}" includes="**/*~"/>
- </delete>
- <delete file="${src.pluginclass}/preferences.xml" quiet="true"/>
- </target>
-
-</project>
-
diff --git a/freeplane_plugin_formula/build.gradle b/freeplane_plugin_formula/build.gradle
new file mode 100644
index 0000000..f2c7198
--- /dev/null
+++ b/freeplane_plugin_formula/build.gradle
@@ -0,0 +1,37 @@
+dependencies {
+ compile project(':freeplane')
+ compile project(':freeplane_plugin_script')
+}
+
+jar {
+ manifest {
+ name = pluginid
+ symbolicName = pluginid
+
+ configurations.runtime.transitive = false
+ def deps = filterAndExternalizePluginDependencies(configurations.runtime.files)
+ deps.add(0, "lib/plugin-" + project.version + '.jar')
+
+ attributes 'Class-Path': deps.join(', ')
+ attributes 'Bundle-ClassPath': '., ' + deps.join(', ')
+
+ instruction 'Bundle-Vendor', 'Freeplane Project'
+ instruction 'Bundle-Activator', pluginid + ".Activator"
+ instruction 'Bundle-RequiredExecutionEnvironment', 'JavaSE-1.6'
+
+ def imports = """\
+ org.osgi.framework;version="1.3.0",
+ org.freeplane.plugin.script.*,
+ org.freeplane.core.*,
+ org.freeplane.features.*,
+ org.freeplane.main.*,
+ org.freeplane.n3.*,
+ org.freeplane.view.*
+ """
+ instruction 'Import-Package', imports.replaceAll("\\s+", "")
+ instruction 'Export-Package', ''
+
+ // Require-Bundle is ignored by bnd => replaced by Import-Package!
+ //instruction 'Require-Bundle', 'org.freeplane.core;bundle-version="1.0.1", org.freeplane.plugin.script;bundle-version="1.0.1"'
+ }
+}
diff --git a/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/Activator.java b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/Activator.java
new file mode 100644
index 0000000..48e0d36
--- /dev/null
+++ b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/Activator.java
@@ -0,0 +1,91 @@
+package org.freeplane.plugin.formula;
+
+import java.net.URL;
+import java.util.Hashtable;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.ConditionalContentTransformer;
+import org.freeplane.main.osgi.IModeControllerExtensionProvider;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+ private static final String FORMULA_DISABLE_PLUGIN = "formula_disable_plugin";
+ private static final String FORMULA_DISABLE_CACHING = "formula_disable_caching";
+ private static final String MENU_BAR_PARENT_LOCATION = "/menu_bar/extras/first";
+ static final String MENU_BAR_LOCATION = MENU_BAR_PARENT_LOCATION + "/formula";
+
+ private static final String TOGGLE_PARSE_FORMULAS = "parse_formulas";
+
+ private final class FormulaPluginRegistration implements IModeControllerExtensionProvider {
+ private static final String PREFERENCES_RESOURCE = "preferences.xml";
+
+ public void installExtension(ModeController modeController) {
+ addPluginDefaults();
+ addPreferencesToOptionPanel();
+ final boolean disablePluginProperty = ResourceController.getResourceController().getBooleanProperty(
+ FORMULA_DISABLE_PLUGIN);
+ final EvaluateAllAction evaluateAllAction = new EvaluateAllAction();
+ modeController.addAction(evaluateAllAction);
+ if (!disablePluginProperty) {
+
+ TextController.getController(modeController).addTextTransformer(//
+ new ConditionalContentTransformer(new FormulaTextTransformer(1), TOGGLE_PARSE_FORMULAS));
+
+ // to enable Formulas in text templates:
+ // TextController.getController(modeController).addTextTransformer(new FormulaTextTransformer(100));
+ final FormulaUpdateChangeListener listener = new FormulaUpdateChangeListener();
+ modeController.getMapController().addNodeChangeListener(listener);
+ modeController.getMapController().addMapChangeListener(listener);
+ final boolean disableCacheProperty = ResourceController.getResourceController().getBooleanProperty(
+ FORMULA_DISABLE_CACHING);
+ if (disableCacheProperty) {
+ System.err.println("Formula cache disabled."
+ + " This might severely impair performance when using formulas.");
+ }
+ }
+ else {
+ System.out.println("Formula plugin is disabled");
+ evaluateAllAction.setEnabled(false);
+ }
+ }
+
+ private void addPreferencesToOptionPanel() {
+ final URL preferences = this.getClass().getResource(PREFERENCES_RESOURCE);
+ if (preferences == null)
+ throw new RuntimeException("cannot open preferences");
+ final Controller controller = Controller.getCurrentController();
+ MModeController modeController = (MModeController) controller.getModeController();
+ modeController.getOptionPanelBuilder().load(preferences);
+ }
+
+ private void addPluginDefaults() {
+ final URL defaults = this.getClass().getResource(ResourceController.PLUGIN_DEFAULTS_RESOURCE);
+ if (defaults == null)
+ throw new RuntimeException("cannot open " + ResourceController.PLUGIN_DEFAULTS_RESOURCE);
+ Controller.getCurrentController().getResourceController().addDefaults(defaults);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(final BundleContext context) throws Exception {
+ final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
+ props.put("mode", new String[] { MModeController.MODENAME /*TODO: browse mode too?*/});
+ context.registerService(IModeControllerExtensionProvider.class.getName(), new FormulaPluginRegistration(),
+ props);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(final BundleContext context) throws Exception {
+ }
+}
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/EvaluateAllAction.java b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/EvaluateAllAction.java
similarity index 100%
rename from freeplane_plugin_formula/src/org/freeplane/plugin/formula/EvaluateAllAction.java
rename to freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/EvaluateAllAction.java
diff --git a/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaEditor.java b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaEditor.java
new file mode 100644
index 0000000..47fc252
--- /dev/null
+++ b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaEditor.java
@@ -0,0 +1,61 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.formula;
+
+import java.awt.event.KeyEvent;
+
+import javax.swing.JEditorPane;
+import javax.swing.RootPaneContainer;
+
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.mindmapmode.EditNodeDialog;
+import org.freeplane.view.swing.ui.mindmapmode.GlassPaneManager;
+import org.freeplane.view.swing.ui.mindmapmode.INodeSelector;
+
+/**
+ * @author Dimitry Polivaev
+ * Nov 20, 2010
+ */
+class FormulaEditor extends EditNodeDialog implements INodeSelector {
+
+ static final String GROOVY_EDITOR_FONT = "groovy_editor_font";
+ static final String GROOVY_EDITOR_FONT_SIZE = "groovy_editor_font_size";
+
+ private JEditorPane textEditor;
+
+ FormulaEditor(NodeModel nodeModel, String text, KeyEvent firstEvent, IEditControl editControl,
+ boolean enableSplit, JEditorPane textEditor) {
+ super(nodeModel, text, firstEvent, editControl, enableSplit, textEditor);
+ super.setModal(false);
+ this.textEditor = textEditor;
+ }
+
+ @Override
+ public void show(RootPaneContainer frame) {
+ textEditor.addAncestorListener(new GlassPaneManager(frame.getRootPane(), this));
+ super.show(frame);
+ }
+
+ public void nodeSelected(final NodeModel model) {
+ final String id = model.getID();
+ textEditor.replaceSelection(id);
+ textEditor.requestFocus();
+ }
+}
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaTextTransformer.java b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaTextTransformer.java
similarity index 100%
rename from freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaTextTransformer.java
rename to freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaTextTransformer.java
diff --git a/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaUpdateChangeListener.java b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaUpdateChangeListener.java
new file mode 100644
index 0000000..074dbf1
--- /dev/null
+++ b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaUpdateChangeListener.java
@@ -0,0 +1,76 @@
+package org.freeplane.plugin.formula;
+
+import java.util.List;
+
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.IMapChangeListener;
+import org.freeplane.features.map.INodeChangeListener;
+import org.freeplane.features.map.MapChangeEvent;
+import org.freeplane.features.map.NodeChangeEvent;
+import org.freeplane.features.map.NodeDeletionEvent;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.NodeMoveEvent;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.styles.LogicalStyleModel;
+import org.freeplane.features.text.DetailTextModel;
+import org.freeplane.features.text.IContentTransformer;
+import org.freeplane.features.url.UrlManager;
+import org.freeplane.plugin.script.FormulaUtils;
+
+/** cares for updating formula nodes on change of other nodes. */
+public class FormulaUpdateChangeListener implements INodeChangeListener, IMapChangeListener{
+ public void nodeChanged(NodeChangeEvent event) {
+ Object property = event.getProperty();
+ // Note: this doesn't mean that other properties are not interesting here (e.g. links, edges, ...)
+ // since all these could be referenced by formulas too. It's restricted only to limit the number of updates.
+ // ALTERNATIVE: property.getClass() == Class.class && IExtension.class.isAssignableFrom((Class<?>)property)
+ if (NodeModel.NODE_TEXT.equals(property) || NodeAttributeTableModel.class.equals(property)
+ || NodeModel.NOTE_TEXT.equals(property) || NodeModel.NODE_ICON.equals(property)
+ || LogicalStyleModel.class.equals(property) || DetailTextModel.class.equals(property)) {
+ nodeChangedImpl(false, event.getNode());
+ }
+ }
+
+ public void onNodeDeleted(NodeDeletionEvent nodeDeletionEvent) {
+ nodeChangedImpl(true, nodeDeletionEvent.parent);
+ }
+
+ public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
+ // all formulas dependent on the child via getChildren() are also dependent on its parent
+ nodeChangedImpl(true, parent);
+ }
+
+ public void onNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ // - all formulas dependent on the child via getChildren() are also dependent on its parent
+ // FIXME: is child updated or do we have to force that here?
+ nodeChangedImpl(true, nodeMoveEvent.oldParent, nodeMoveEvent.newParent);
+ }
+
+ public void onPreNodeMoved(NodeMoveEvent nodeMoveEvent) {
+ }
+
+ public void onPreNodeDelete(NodeDeletionEvent nodeDeletionEvent) {
+ }
+
+ public void mapChanged(MapChangeEvent event) {
+ if (UrlManager.MAP_URL.equals(event.getProperty()))
+ FormulaUtils.clearCache(event.getMap());
+ }
+
+ /** in case of insert we look for dependencies of the parent. But the parent is not actually changed in this case.
+ * So there won't be any updates on the parent, even if it has formula that needs an update due to the
+ * changed children count. */
+ private void nodeChangedImpl(boolean includeChanged, NodeModel... nodes) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ //FIXME: needed???
+ // if (modeController == null || modeController.isUndoAction()) {
+ // return;
+ // }
+ final List<NodeModel> dependencies = FormulaUtils.manageChangeAndReturnDependencies(includeChanged, nodes);
+ for (NodeModel dependentNode : dependencies) {
+ modeController.getMapController().delayedNodeRefresh(dependentNode, IContentTransformer.class,
+ null, null);
+ }
+ }
+}
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaUtils.java b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaUtils.java
similarity index 100%
rename from freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaUtils.java
rename to freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/FormulaUtils.java
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/defaults.properties b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/defaults.properties
similarity index 100%
rename from freeplane_plugin_formula/src/org/freeplane/plugin/formula/defaults.properties
rename to freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/defaults.properties
diff --git a/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/preferences.xml b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/preferences.xml
new file mode 100644
index 0000000..b68207e
--- /dev/null
+++ b/freeplane_plugin_formula/src/main/java/org/freeplane/plugin/formula/preferences.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?><preferences_structure xmlns="http://freeplane.sf.net/ui/preferences/1.0">
+<!--
+
+This file was generated automatically from a mindmap.
+Do not edit this file, edit the original mindmap instead.
+
+ -->
+<tabbed_pane>
+<tab name="plugins">
+<separator name="formula">
+<boolean name="formula_disable_plugin"/>
+<boolean name="formula_disable_caching"/>
+<boolean name="highlight_formulas"/>
+</separator>
+</tab>
+</tabbed_pane>
+</preferences_structure>
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/Activator.java b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/Activator.java
deleted file mode 100644
index b73afe6..0000000
--- a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/Activator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.freeplane.plugin.formula;
-
-import java.net.URL;
-import java.util.Hashtable;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.main.osgi.IModeControllerExtensionProvider;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class Activator implements BundleActivator {
- private static final String FORMULA_DISABLE_PLUGIN = "formula_disable_plugin";
- private static final String FORMULA_DISABLE_CACHING = "formula_disable_caching";
- private static final String MENU_BAR_PARENT_LOCATION = "/menu_bar/extras/first";
- static final String MENU_BAR_LOCATION = MENU_BAR_PARENT_LOCATION + "/formula";
-
- private final class FormulaPluginRegistration implements IModeControllerExtensionProvider {
- private static final String PREFERENCES_RESOURCE = "preferences.xml";
-
- public void installExtension(ModeController modeController) {
- addPluginDefaults();
- addPreferencesToOptionPanel();
- final boolean disablePluginProperty = ResourceController.getResourceController().getBooleanProperty(
- FORMULA_DISABLE_PLUGIN);
- final EvaluateAllAction evaluateAllAction = new EvaluateAllAction();
- modeController.addAction(evaluateAllAction);
- if (!disablePluginProperty) {
- TextController.getController(modeController).addTextTransformer(new FormulaTextTransformer(1));
- // to enable Formulas in text templates:
- // TextController.getController(modeController).addTextTransformer(new FormulaTextTransformer(100));
- final FormulaUpdateChangeListener listener = new FormulaUpdateChangeListener();
- modeController.getMapController().addNodeChangeListener(listener);
- modeController.getMapController().addMapChangeListener(listener);
- final boolean disableCacheProperty = ResourceController.getResourceController().getBooleanProperty(
- FORMULA_DISABLE_CACHING);
- if (disableCacheProperty) {
- System.err.println("Formula cache disabled."
- + " This might severely impair performance when using formulas.");
- }
- }
- else {
- System.out.println("Formula plugin is disabled");
- evaluateAllAction.setEnabled(false);
- }
- }
-
- private void addPreferencesToOptionPanel() {
- final URL preferences = this.getClass().getResource(PREFERENCES_RESOURCE);
- if (preferences == null)
- throw new RuntimeException("cannot open preferences");
- final Controller controller = Controller.getCurrentController();
- MModeController modeController = (MModeController) controller.getModeController();
- modeController.getOptionPanelBuilder().load(preferences);
- }
-
- private void addPluginDefaults() {
- final URL defaults = this.getClass().getResource(ResourceController.PLUGIN_DEFAULTS_RESOURCE);
- if (defaults == null)
- throw new RuntimeException("cannot open " + ResourceController.PLUGIN_DEFAULTS_RESOURCE);
- Controller.getCurrentController().getResourceController().addDefaults(defaults);
- }
- }
-
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- public void start(final BundleContext context) throws Exception {
- final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
- props.put("mode", new String[] { MModeController.MODENAME /*TODO: browse mode too?*/});
- context.registerService(IModeControllerExtensionProvider.class.getName(), new FormulaPluginRegistration(),
- props);
- }
-
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- public void stop(final BundleContext context) throws Exception {
- }
-}
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaEditor.java b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaEditor.java
deleted file mode 100644
index b67ba1c..0000000
--- a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaEditor.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2010 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.formula;
-
-import java.awt.event.KeyEvent;
-
-import javax.swing.JEditorPane;
-import javax.swing.RootPaneContainer;
-
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.text.mindmapmode.EditNodeDialog;
-import org.freeplane.view.swing.ui.mindmapmode.GlassPaneManager;
-import org.freeplane.view.swing.ui.mindmapmode.INodeSelector;
-
-/**
- * @author Dimitry Polivaev
- * Nov 20, 2010
- */
-class FormulaEditor extends EditNodeDialog implements INodeSelector {
-
- static final String GROOVY_EDITOR_FONT = "groovy_editor_font";
- static final String GROOVY_EDITOR_FONT_SIZE = "groovy_editor_font_size";
-
- private JEditorPane textEditor;
-
- FormulaEditor(NodeModel nodeModel, String text, KeyEvent firstEvent, IEditControl editControl,
- boolean enableSplit, JEditorPane textEditor) {
- super(nodeModel, text, firstEvent, editControl, enableSplit, textEditor);
- super.setModal(false);
- this.textEditor = textEditor;
- }
-
- @Override
- public void show(RootPaneContainer frame) {
- textEditor.addAncestorListener(new GlassPaneManager(frame.getRootPane(), this));
- super.show(frame);
- }
-
- public void nodeSelected(final NodeModel model) {
- final String id = model.getID();
- textEditor.replaceSelection(id);
- textEditor.requestFocus();
- }
-}
\ No newline at end of file
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaUpdateChangeListener.java b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaUpdateChangeListener.java
deleted file mode 100644
index c2c1691..0000000
--- a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/FormulaUpdateChangeListener.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.freeplane.plugin.formula;
-
-import java.util.List;
-
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.map.IMapChangeListener;
-import org.freeplane.features.map.INodeChangeListener;
-import org.freeplane.features.map.MapChangeEvent;
-import org.freeplane.features.map.NodeChangeEvent;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.styles.LogicalStyleModel;
-import org.freeplane.features.text.DetailTextModel;
-import org.freeplane.features.text.IContentTransformer;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.plugin.script.FormulaUtils;
-
-/** cares for updating formula nodes on change of other nodes. */
-public class FormulaUpdateChangeListener implements INodeChangeListener, IMapChangeListener{
- public void nodeChanged(NodeChangeEvent event) {
- Object property = event.getProperty();
- // Note: this doesn't mean that other properties are not interesting here (e.g. links, edges, ...)
- // since all these could be referenced by formulas too. It's restricted only to limit the number of updates.
- // ALTERNATIVE: property.getClass() == Class.class && IExtension.class.isAssignableFrom((Class<?>)property)
- if (NodeModel.NODE_TEXT.equals(property) || NodeAttributeTableModel.class.equals(property)
- || NodeModel.NOTE_TEXT.equals(property) || NodeModel.NODE_ICON.equals(property)
- || LogicalStyleModel.class.equals(property) || DetailTextModel.class.equals(property)) {
- nodeChangedImpl(false, event.getNode());
- }
- }
-
- public void onNodeDeleted(NodeModel parent, NodeModel child, int index) {
- nodeChangedImpl(true, parent);
- }
-
- public void onNodeInserted(NodeModel parent, NodeModel child, int newIndex) {
- // all formulas dependent on the child via getChildren() are also dependent on its parent
- nodeChangedImpl(true, parent);
- }
-
- public void onNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- // - all formulas dependent on the child via getChildren() are also dependent on its parent
- // FIXME: is child updated or do we have to force that here?
- nodeChangedImpl(true, oldParent, newParent);
- }
-
- public void onPreNodeMoved(NodeModel oldParent, int oldIndex, NodeModel newParent, NodeModel child, int newIndex) {
- }
-
- public void onPreNodeDelete(NodeModel oldParent, NodeModel selectedNode, int index) {
- }
-
- public void mapChanged(MapChangeEvent event) {
- if (UrlManager.MAP_URL.equals(event.getProperty()))
- FormulaUtils.clearCache(event.getMap());
- }
-
- /** in case of insert we look for dependencies of the parent. But the parent is not actually changed in this case.
- * So there won't be any updates on the parent, even if it has formula that needs an update due to the
- * changed children count. */
- private void nodeChangedImpl(boolean includeChanged, NodeModel... nodes) {
- final ModeController modeController = Controller.getCurrentModeController();
- //FIXME: needed???
- // if (modeController == null || modeController.isUndoAction()) {
- // return;
- // }
- final List<NodeModel> dependencies = FormulaUtils.manageChangeAndReturnDependencies(includeChanged, nodes);
- for (NodeModel dependentNode : dependencies) {
- modeController.getMapController().delayedNodeRefresh(dependentNode, IContentTransformer.class,
- null, null);
- }
- }
-}
diff --git a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/preferences.mm b/freeplane_plugin_formula/src/org/freeplane/plugin/formula/preferences.mm
deleted file mode 100644
index 8e258a9..0000000
--- a/freeplane_plugin_formula/src/org/freeplane/plugin/formula/preferences.mm
+++ /dev/null
@@ -1,115 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<attribute_registry SHOW_ATTRIBUTES="hide"/>
-<node TEXT="Formula Preferences" ID="ID_647512264" CREATED="1370289419953" MODIFIED="1370289482022"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="boolean" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="boolean" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="combo" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="combo" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="choice" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="choice" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="font" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="font" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="number" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="number" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="path" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="path" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="remind_value" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="remind_value" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="group" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="group" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="color" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="color" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="string" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="string" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="tab" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="tab" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="text" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="text" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode TEXT="boolean">
-<icon BUILTIN="checked"/>
-</stylenode>
-<stylenode TEXT="combo">
-<icon BUILTIN="list"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-<stylenode TEXT="choice"/>
-<stylenode TEXT="font"/>
-<stylenode TEXT="number"/>
-<stylenode TEXT="path"/>
-<stylenode TEXT="remind_value"/>
-<stylenode TEXT="separator">
-<font BOLD="true"/>
-</stylenode>
-<stylenode TEXT="group">
-<icon BUILTIN="folder"/>
-</stylenode>
-<stylenode TEXT="color">
-<icon BUILTIN="licq"/>
-</stylenode>
-<stylenode TEXT="string">
-<icon BUILTIN="edit"/>
-</stylenode>
-<stylenode TEXT="tab">
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="text">
-<icon BUILTIN="info"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="Plugins" POSITION="right" ID="ID_591627084" CREATED="1370289419953" MODIFIED="1370290599743">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE="plugins"/>
-<node TEXT="Formula" ID="ID_1783515461" CREATED="1370289419958" MODIFIED="1370290595454">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="formula"/>
-<node TEXT="Disable Formula evaluation" ID="ID_1117632012" CREATED="1370289419959" MODIFIED="1370290718637">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="formula_disable_plugin"/>
-</node>
-<node TEXT="Disable Formula evaluation caching" ID="ID_662998133" CREATED="1370289419959" MODIFIED="1370290733060">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="formula_disable_caching"/>
-</node>
-<node TEXT="Highlight Formulas" ID="ID_1584146024" CREATED="1370289419960" MODIFIED="1370290754775">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="highlight_formulas"/>
-</node>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane_plugin_help/.classpath b/freeplane_plugin_help/.classpath
deleted file mode 100644
index 1b281a5..0000000
--- a/freeplane_plugin_help/.classpath
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry exported="true" kind="lib" path="lib/jhall.jar"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="src" path="resources"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_plugin_help/.project b/freeplane_plugin_help/.project
deleted file mode 100644
index 26f48d2..0000000
--- a/freeplane_plugin_help/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_help</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_help/.settings/org.eclipse.core.resources.prefs b/freeplane_plugin_help/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index ef096d0..0000000
--- a/freeplane_plugin_help/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:13 CET 2010
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/freeplane_plugin_help/.settings/org.eclipse.core.runtime.prefs b/freeplane_plugin_help/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index 070af75..0000000
--- a/freeplane_plugin_help/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:13 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/freeplane_plugin_help/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_help/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index ca176e2..0000000
--- a/freeplane_plugin_help/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-#Mon Apr 13 10:15:03 CEST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/freeplane_plugin_help/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_help/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 16a669c..0000000
--- a/freeplane_plugin_help/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Sun Jan 04 22:58:46 CET 2009
-eclipse.preferences.version=1
-pluginProject.equinox=false
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/freeplane_plugin_help/META-INF/MANIFEST.MF b/freeplane_plugin_help/META-INF/MANIFEST.MF
deleted file mode 100644
index b85c57b..0000000
--- a/freeplane_plugin_help/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.plugin.help
-Bundle-SymbolicName: org.freeplane.plugin.help
-Bundle-Version: 1.0.1
-Bundle-Activator: org.freeplane.plugin.help.Activator
-Import-Package: org.osgi.framework;version="1.3.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.freeplane.core;bundle-version="1.0.1"
-Bundle-ClassPath: lib/plugin.jar,
- lib/jhall.jar
-Export-Package: org.freeplane.plugin.help;uses:="org.freeplane.core.ui,org.freeplane.core.controller,org.osgi.framework"
diff --git a/freeplane_plugin_help/ant/ant.properties b/freeplane_plugin_help/ant/ant.properties
deleted file mode 100644
index f1eeec0..0000000
--- a/freeplane_plugin_help/ant/ant.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-plugin.ext.lib = lib
-jhall.jar = ${plugin.ext.lib}/jhall.jar
diff --git a/freeplane_plugin_help/ant/build.xml b/freeplane_plugin_help/ant/build.xml
deleted file mode 100644
index a51721f..0000000
--- a/freeplane_plugin_help/ant/build.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<project name="freeplane_help" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property name="src" value="src" />
- <property name="resources" value="resources" />
- <property name="root" value="."/>
- <property name="osgimanifest" value="${root}/META-INF/MANIFEST.MF" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="ant/ant.properties" />
- <property name="external.jars" value="${commons-lang.jar}:${forms.jar}:${SimplyHTML.jar}" />
- <property name="build" value="${root}/build" />
- <property name="build" value="${root}/build" />
- <property name="dist" value="${build}/dist" />
- <property name="dist.osgi.dir" value="${dist}/org.freeplane.plugin.help" />
- <property name="freeplaneplugin.jar" value="${dist}/org.freeplane.plugin.help.jar"/>
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${framework.jar}:${freeplane.jars}:${external.jars}:${jhall.jar}"/>
-
- <target name="build">
- <mkdir dir="${build}" />
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- </javac>
- </target>
-
-
- <target name="dist" depends="build">
- <jar jarfile="lib/plugin.jar">
- <fileset dir="${build}"/>
- <fileset dir="${resources}"/>
- </jar>
- <delete dir="${dist.osgi.dir}" quiet="true"/>
- <mkdir dir="${dist.osgi.dir}" />
- <copy todir="${dist.osgi.dir}">
- <fileset dir="${root}">
- <include name="lib/**"/>
- </fileset>
- </copy>
- <mkdir dir="${dist.osgi.dir}/META-INF" />
- <copy tofile="${dist.osgi.dir}/META-INF/MANIFEST.MF" file="${osgimanifest}"/>
- <delete file="lib/plugin.jar" quiet="true"/>
- </target>
-
- <target name="osgi_dist_as_jar" depends="dist">
- <jar jarfile="${freeplaneplugin.jar}">
- <fileset dir="${dist.osgi.dir}">
- <include name="**" />
- </fileset>
- </jar>
- </target>
-
- <target name="clean">
- <delete dir="${build}" quiet="true"/>
- <delete dir="${dist}" quiet="true"/>
- <delete>
- <fileset defaultexcludes="no" dir="${src}" includes="**/*~"/>
- </delete>
- </target>
-
-</project>
-
diff --git a/freeplane_plugin_help/infinitest.filters b/freeplane_plugin_help/infinitest.filters
deleted file mode 100644
index 9abb766..0000000
--- a/freeplane_plugin_help/infinitest.filters
+++ /dev/null
@@ -1 +0,0 @@
-.*
\ No newline at end of file
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/Freeplane.map b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/Freeplane.map
deleted file mode 100644
index 20f59a0..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/Freeplane.map
+++ /dev/null
@@ -1,25 +0,0 @@
- <?xml version='1.0' ?>
-
- <map version="1.0">
- <mapID target="welcome" url="welcome.htm" />
- <mapID target="install" url="install.htm" />
- <mapID target="create" url="create.htm" />
- <mapID target="screen" url="screen.html" />
- <mapID target="editnav" url="editnav.htm" />
- <mapID target="edithome" url="edithome.htm" />
- <mapID target="editnode" url="editnode.htm" />
- <mapID target="editcopy" url="editcopy.htm" />
- <mapID target="editdrag" url="editdrag.htm" />
- <mapID target="editsearch" url="editsearch.htm" />
- <mapID target="editkeyboard" url="editkeyboard.htm" />
- <mapID target="editkeychart" url="editkeychart.htm" />
- <mapID target="tips" url="tips.htm" />
- <mapID target="patterns" url="patterns.htm" />
- <mapID target="prefs" url="prefs.htm" />
- <mapID target="customize" url="customize.htm" />
- <mapID target="customuser" url="customuser.htm" />
- <mapID target="exim" url="exim.htm" />
- <mapID target="applet" url="applet.htm" />
- <mapID target="homepage" url="homepage.htm" />
- <mapID target="credits" url="credits.htm" />
- </map>
\ No newline at end of file
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/FreeplaneIndex.xml b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/FreeplaneIndex.xml
deleted file mode 100644
index 350713a..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/FreeplaneIndex.xml
+++ /dev/null
@@ -1,233 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE index PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp Index Version 1.0//EN" "http://java.sun.com/products/javahelp/index_1_0.dtd"><!--generated by JHelpDev Version: 0.27-03/03/04, see jhelpdev.sourceforge.org-->
-
-<index version="1.0">
- <indexitem text="antialiasing" target="prefs"/>
-
- <indexitem text="applet" target="applet"/>
-
- <indexitem text="arrows between nodes" target="tips"/>
-
- <indexitem text="attributes" target="editnode"/>
-
- <indexitem text="authors" target="credits"/>
-
- <indexitem text="autosave" target="edithome">
- <indexitem text="settings" target="customuser"/>
-
- </indexitem>
- <indexitem text="browser" target="applet"/>
-
- <indexitem text="browsing" target="tips"/>
-
- <indexitem text="bubble" target="editnode"/>
-
- <indexitem text="carriage returns" target="editkeyboard"/>
-
- <indexitem text="clouds" target="editnode"/>
-
- <indexitem text="color" target="editnode"/>
-
- <indexitem text="colors, default" target="customuser"/>
-
- <indexitem text="copying" target="editcopy"/>
-
- <indexitem text="copying to other applications" target="editcopy"/>
-
- <indexitem text="creating mindmaps" target="create"/>
-
- <indexitem text="credits" target="credits"/>
-
- <indexitem text="customizing" target="editkeyboard"/>
-
- <indexitem text="customizing" target="customize">
- <indexitem text="user.properties details" target="customuser"/>
-
- </indexitem>
- <indexitem text="download" target="install"/>
-
- <indexitem text="drag and drop" target="editdrag"/>
-
- <indexitem text="editing" target="edithome"/>
-
- <indexitem text="editing nodes" target="editkeyboard"/>
-
- <indexitem text="exporting" target="exim"/>
-
- <indexitem text="exporting (for printing)" target="print"/>
-
- <indexitem text="external data" target="editdrag"/>
-
- <indexitem text="FAQ" target="homepage"/>
-
- <indexitem text="favorites - importing" target="exim"/>
-
- <indexitem text="features" target="welcome"/>
-
- <indexitem text="file links" target="editnode"/>
-
- <indexitem text="file lists" target="editcopy"/>
-
- <indexitem text="file locking" target="tips"/>
-
- <indexitem text="finding text" target="editsearch"/>
-
- <indexitem text="folding" target="editnode"/>
-
- <indexitem text="font color" target="editnode"/>
-
- <indexitem text="font size" target="editnode"/>
-
- <indexitem text="fork" target="editnode"/>
-
- <indexitem text="formatting" target="editnode"/>
-
- <indexitem text="freeplanebrowser" target="applet"/>
-
- <indexitem text="graphical links" target="tips"/>
-
- <indexitem text="home page" target="homepage"/>
-
- <indexitem text="HTML" target="pixhtml"/>
-
- <indexitem text="HTML - copying and pasting" target="editcopy"/>
-
- <indexitem text="HTML export options" target="prefs"/>
-
- <indexitem text="icons" target="edithome"/>
-
- <indexitem text="images" target="pixhtml"/>
-
- <indexitem text="images" target="editnode"/>
-
- <indexitem text="importing" target="exim"/>
-
- <indexitem text="installation" target="install"/>
-
- <indexitem text="interface" target="screen"/>
-
- <indexitem text="Internet links" target="homepage"/>
-
- <indexitem text="Java runtime" target="install"/>
-
- <indexitem text="keyboard" target="editkeyboard"/>
-
- <indexitem text="keyboard shortcuts" target="editkeychart"/>
-
- <indexitem text="keyboard shortcuts (patterns)" target="patterns"/>
-
- <indexitem text="keystrokes - defining" target="customuser"/>
-
- <indexitem text="line breaks" target="editkeyboard"/>
-
- <indexitem text="links">
- <indexitem text="copying and pasting" target="editcopy"/>
-
- <indexitem text="following" target="editnav"/>
-
- <indexitem text="graphical" target="tips"/>
-
- <indexitem text="HTML" target="pixhtml"/>
-
- <indexitem text="in nodes" target="editnode"/>
-
- </indexitem>
- <indexitem text="long nodes" target="edithome">
- <indexitem text="editing with keyboard" target="editkeyboard"/>
-
- </indexitem>
- <indexitem text="Look and Feel" target="customuser"/>
-
- <indexitem text="mail links" target="exim"/>
-
- <indexitem text="Microsoft Word" target="exim"/>
-
- <indexitem text="mindmap defined" target="welcome"/>
-
- <indexitem text="modes" target="tips"/>
-
- <indexitem text="moving nodes" target="editdrag"/>
-
- <indexitem text="multiline nodes" target="edithome"/>
-
- <indexitem text="navigating" target="editnav"/>
-
- <indexitem text="node menu" target="editnode"/>
-
- <indexitem text="options" target="customuser"/>
-
- <indexitem text="pasting" target="editcopy"/>
-
- <indexitem text="patterns" target="patterns"/>
-
- <indexitem text="physical style" target="edithome">
- <indexitem text="setting in patterns" target="patterns"/>
-
- </indexitem>
- <indexitem text="pictures" target="editnode">
- <indexitem text="details" target="pixhtml"/>
-
- </indexitem>
- <indexitem text="PostScript" target="print"/>
-
- <indexitem text="preferences" target="prefs"/>
-
- <indexitem text="printing" target="print"/>
-
- <indexitem text="program links" target="editnode"/>
-
- <indexitem text="recent-files list" target="customuser"/>
-
- <indexitem text="reordering nodes" target="edithome"/>
-
- <indexitem text="root node" target="create"/>
-
- <indexitem text="RTF">
- <indexitem text="copying" target="editcopy"/>
-
- <indexitem text="exporting and importing" target="exim"/>
-
- </indexitem>
- <indexitem text="sample map" target="welcome"/>
-
- <indexitem text="scheme mode" target="tips"/>
-
- <indexitem text="screenshot" target="screen"/>
-
- <indexitem text="scrolling" target="editnav"/>
-
- <indexitem text="searching" target="editsearch"/>
-
- <indexitem text="selecting nodes" target="edithome"/>
-
- <indexitem text="selecting" target="editkeyboard"/>
-
- <indexitem text="shortcuts" target="editkeychart"/>
-
- <indexitem text="size of text" target="editnode"/>
-
- <indexitem text="splitting nodes" target="edithome"/>
-
- <indexitem text="styles" target="editnode"/>
-
- <indexitem text="switching among maps" target="edithome"/>
-
- <indexitem text="switching maps" target="editnav"/>
-
- <indexitem text="typeface" target="editnode"/>
-
- <indexitem text="undo" target="edithome"/>
-
- <indexitem text="user.properties" target="customize">
- <indexitem text="user.properties file details" target="customuser"/>
-
- </indexitem>
- <indexitem text="Web links" target="editnode"/>
-
- <indexitem text="Web viewing of mindmaps" target="applet"/>
-
- <indexitem text="Wiki" target="homepage"/>
-
- <indexitem text="zooming" target="editnav"/>
-
-</index>
\ No newline at end of file
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/FreeplaneTOC.xml b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/FreeplaneTOC.xml
deleted file mode 100644
index 696424e..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/FreeplaneTOC.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE toc PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp TOC Version 1.0//EN" "http://java.sun.com/products/javahelp/toc_1_0.dtd"><!--generated by JHelpDev Version: 0.27-03/03/04, see jhelpdev.sourceforge.org-->
-
-<toc version="1.0">
- <tocitem text="Welcome to Freeplane" target="welcome"/>
-
- <tocitem text="Installation" target="install"/>
-
- <tocitem text="Creating maps" target="create">
- <tocitem text="Freeplane screenshot" target="screen"/>
-
- </tocitem>
- <tocitem text="Navigating through your mindmaps" target="editnav"/>
-
- <tocitem text="Editing your maps" target="edithome">
- <tocitem text="Editing nodes" target="editnode"/>
-
- <tocitem text="Copying and pasting" target="editcopy"/>
-
- <tocitem text="Editing by drag and drop" target="editdrag"/>
-
- </tocitem>
- <tocitem text="Searching" target="editsearch"/>
-
- <tocitem text="Using the keyboard" target="editkeyboard">
- <tocitem text="Keyboard shortcuts" target="editkeychart"/>
-
- </tocitem>
- <tocitem text="Tips for using Freeplane" target="tips"/>
-
- <tocitem text="Physical styles" target="patterns"/>
-
- <tocitem text="Pictures and HTML in nodes" target="pixhtml"/>
-
- <tocitem text="Printing your maps" target="print"/>
-
- <tocitem text="Setting preferences" target="prefs"/>
-
- <tocitem text="Customizing Freeplane" target="customize">
- <tocitem text="user.properties" target="customuser"/>
-
- </tocitem>
- <tocitem text="Exporting and importing data" target="exim"/>
-
- <tocitem text="Installation of Freeplane applet at your web site" target="applet"/>
-
- <tocitem text="Home Page" target="homepage"/>
-
- <tocitem text="Credits" target="credits"/>
-
-</toc>
\ No newline at end of file
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/DOCS b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/DOCS
deleted file mode 100644
index ddc3998..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/DOCS and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/DOCS.TAB b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/DOCS.TAB
deleted file mode 100644
index e4d2a2b..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/DOCS.TAB
+++ /dev/null
@@ -1,17 +0,0 @@
-e����_������������������������������������������������������������������������u����������_�����������������������������������������������������������������������������e����������������_����_����_��������������������������������������_���������_�������_������������������������������������������,��
-��b�+�
����
�+2��/�
-�R�.�r���
-0��*4�
-<�Z+��`Lҫ���R�(�̹����7*�
-�/�ݥ��K3��/6.5�0�
-0����(�2*0������+3�,�̊9
�����K�0�
-��(ʪ.�
-̊�ꪪ�t*�"��Ⱦ0�n(�͊6�:R��r�0��.��
����̊��
-��.���K��
-���ª����*�ª�*ꪪ����*�����,³
-�
-�
-����0���ª�����������
-�0��*�Ҫ꾪ꪨº���̋2,�����������4�¬��0�2+�*�
-ꫪ�0��+�0���ꪪ����ª�ꪺ������2*���
-����������*���������������������������������������������������`
\ No newline at end of file
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/OFFSETS b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/OFFSETS
deleted file mode 100644
index 8688836..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/OFFSETS
+++ /dev/null
@@ -1 +0,0 @@
-�J˂t�ޡ��/�J����cM����F�l�eXO=!�"L_:%ɈKa(�����j�7 ��b�L���j�_�
�d�uy�>C/;�
\ No newline at end of file
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/POSITIONS b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/POSITIONS
deleted file mode 100644
index da2f30e..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/POSITIONS and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/SCHEMA b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/SCHEMA
deleted file mode 100644
index 2995f3c..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/SCHEMA
+++ /dev/null
@@ -1,2 +0,0 @@
-JavaSearch 1.0
-TMAP bs=2048 rt=1 fl=-1 id1=1193 id2=1
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/TMAP b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/TMAP
deleted file mode 100644
index 71791e9..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/JavaHelpSearch/TMAP and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/Map.jhm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/Map.jhm
deleted file mode 100644
index b3cd118..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/Map.jhm
+++ /dev/null
@@ -1,137 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE map PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp Map Version 1.0//EN" "http://java.sun.com/products/javahelp/map_1_0.dtd"><!--generated by JHelpDev Version: 0.27-03/03/04, see jhelpdev.sourceforge.org-->
-
-<map version="1.0">
-<mapID target="top" url="welcome.html"/>
-
-<mapID target="popup_icon" url="images/popup.gif"/>
-
-<mapID target="_vti_cnf.welcome" url="_vti_cnf/welcome.htm"/>
-
-<mapID target="_vti_cnf.exim" url="_vti_cnf/exim.htm"/>
-
-<mapID target="editsearch" url="editsearch.htm"/>
-
-<mapID target="_vti_cnf.applet" url="_vti_cnf/applet.htm"/>
-
-<mapID target="_vti_cnf.editsearch" url="_vti_cnf/editsearch.htm"/>
-
-<mapID target="install" url="install.htm"/>
-
-<mapID target="_vti_cnf.customize" url="_vti_cnf/customize.htm"/>
-
-<mapID target="_vti_cnf.editkeychart" url="_vti_cnf/editkeychart.htm"/>
-
-<mapID target="_vti_cnf.credits" url="_vti_cnf/credits.htm"/>
-
-<mapID target="_vti_cnf.editnav" url="_vti_cnf/editnav.htm"/>
-
-<mapID target="_vti_cnf.print" url="_vti_cnf/print.htm"/>
-
-<mapID target="_vti_cnf.patterns" url="_vti_cnf/patterns.htm"/>
-
-<mapID target="homepage" url="homepage.htm"/>
-
-<mapID target="prefs" url="prefs.htm"/>
-
-<mapID target="screen" url="screen.html"/>
-
-<mapID target="editnav" url="editnav.htm"/>
-
-<mapID target="_vti_cnf.prefs" url="_vti_cnf/prefs.htm"/>
-
-<mapID target="_vti_cnf.edithome" url="_vti_cnf/edithome.htm"/>
-
-<mapID target="credits" url="credits.htm"/>
-
-<mapID target="create" url="create.htm"/>
-
-<mapID target="_vti_cnf.install" url="_vti_cnf/install.htm"/>
-
-<mapID target="editcopy" url="editcopy.htm"/>
-
-<mapID target="_vti_cnf.screen" url="_vti_cnf/screen.html"/>
-
-<mapID target="_vti_cnf.tips" url="_vti_cnf/tips.htm"/>
-
-<mapID target="_vti_cnf.create" url="_vti_cnf/create.htm"/>
-
-<mapID target="edithome" url="edithome.htm"/>
-
-<mapID target="pixhtml" url="pixhtml.htm"/>
-
-<mapID target="welcome" url="welcome.htm"/>
-
-<mapID target="tips" url="tips.htm"/>
-
-<mapID target="_vti_cnf.editdrag" url="_vti_cnf/editdrag.htm"/>
-
-<mapID target="_vti_cnf.homepage" url="_vti_cnf/homepage.htm"/>
-
-<mapID target="_vti_cnf.samplepage" url="_vti_cnf/samplepage.htm"/>
-
-<mapID target="_vti_cnf.editnode" url="_vti_cnf/editnode.htm"/>
-
-<mapID target="editkeyboard" url="editkeyboard.htm"/>
-
-<mapID target="samplepage" url="samplepage.htm"/>
-
-<mapID target="editdrag" url="editdrag.htm"/>
-
-<mapID target="exim" url="exim.htm"/>
-
-<mapID target="patterns" url="patterns.htm"/>
-
-<mapID target="print" url="print.htm"/>
-
-<mapID target="_vti_cnf.editcopy" url="_vti_cnf/editcopy.htm"/>
-
-<mapID target="_vti_cnf.editkeyboard" url="_vti_cnf/editkeyboard.htm"/>
-
-<mapID target="_vti_cnf.pixhtml" url="_vti_cnf/pixhtml.htm"/>
-
-<mapID target="applet" url="applet.htm"/>
-
-<mapID target="_vti_cnf.customuser" url="_vti_cnf/customuser.htm"/>
-
-<mapID target="customize" url="customize.htm"/>
-
-<mapID target="editnode" url="editnode.htm"/>
-
-<mapID target="editkeychart" url="editkeychart.htm"/>
-
-<mapID target="customuser" url="customuser.htm"/>
-
-<mapID target="_vti_cnf.tips.h1" url="_vti_cnf/tips.h1.gif"/>
-
-<mapID target="_vti_cnf.editno5" url="_vti_cnf/editno5.gif"/>
-
-<mapID target="_vti_cnf.editno9" url="_vti_cnf/editno9.gif"/>
-
-<mapID target="_vti_cnf.editco1" url="_vti_cnf/editco1.gif"/>
-
-<mapID target="_vti_cnf.editno2" url="_vti_cnf/editno2.gif"/>
-
-<mapID target="_vti_cnf.editno4" url="_vti_cnf/editno4.gif"/>
-
-<mapID target="images.popup" url="images/popup.gif"/>
-
-<mapID target="_vti_cnf.editco2" url="_vti_cnf/editco2.gif"/>
-
-<mapID target="_vti_cnf.editno8" url="_vti_cnf/editno8.gif"/>
-
-<mapID target="_vti_cnf.exim.h1" url="_vti_cnf/exim.h1.gif"/>
-
-<mapID target="_vti_cnf.editco3" url="_vti_cnf/editco3.gif"/>
-
-<mapID target="_vti_cnf.editno11" url="_vti_cnf/editno11.gif"/>
-
-<mapID target="_vti_cnf.editno7" url="_vti_cnf/editno7.gif"/>
-
-<mapID target="_vti_cnf.editco4" url="_vti_cnf/editco4.gif"/>
-
-<mapID target="_vti_cnf.editno6" url="_vti_cnf/editno6.gif"/>
-
-<mapID target="_vti_cnf.editho1" url="_vti_cnf/editho1.gif"/>
-
-</map>
\ No newline at end of file
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/applet.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/applet.htm
deleted file mode 100644
index eebd069..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/applet.htm
+++ /dev/null
@@ -1,59 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Installation of Freeplane applet at your web site</title>
-<style>
-<!--
- span.l { color: red; font-weight: bold; }
-
--->
-</style>
-</head>
-
-<body>
-
-<h2><font color="#669900" face="Arial">The Freeplane Web applet</font></h2>
-<h3><font color="#669900" face="Arial">Installing the Freeplane applet at your
-Web site</font></h3>
-<p><font face="Arial">You can install the Java applet at your Web site so that
-other users can browse your mind maps through their Internet browsers, if they
-have Java 1.4 or greater installed.</font></p>
-<p><font face="Arial">The Freeplane home page has a sample map and applet
-installed at:</font></p>
-<p><font face="Arial">http://freeplane.sourceforge.net/Freeplane-development.html</font></p>
-<p><font face="Arial">(cut and paste the link to your regular browser)</font></p>
-<p><font face="Arial">To put a map on your own page, you'll first need to
-download the applet called "freeplane-browser", which can be found at the bottom
-of the Freeplane download page:</font></p>
-<p><font face="Arial">
-<a href="https://sourceforge.net/project/showfiles.php?group_id=7118">Download
-page</a><a href="http://sourceforge.net/project/showfiles.php?group_id=7118" target="_blank">.
-</a></font></p>
-<p><font face="Arial">The downloaded archive contains two files,
-freeplanebrowser.jar and freeplanebrowser.html. </font></p>
-<p><font face="Arial">It's a good idea to put both these files, along with the
-map itself, in a directory on your Web site. Create a link from your page
-to freeplanebrowser.html. Edit freeplanebrowser.html, setting the path inside it
-to point to your mind map. (You can locate the files in other ways, but be
-aware that the applet's jar file must be located at the same server as the map
-itself. This is for Java security reasons.)</font></p>
-<p><font face="Arial">------------------------------</font></p>
-<li style="list-style-type: none"><font face="Arial">Robert J. Alexander has
-provided a far more detailed
-<a href="http://freeplane.sourceforge.net/docs/Serving%20Freeplane%20maps%20in%20a%20browser/">
-discussion of installing the applet</a> on a machine running Apache's Web
-server. </li>
-</font>
-<h3><font color="#669900" face="Arial">Using the Freeplane applet </font></h3>
-<p><font face="Arial">Clicking the link to freeplanebrowser.html will display
-your map in browse mode, that is, read-only. Clicking the nodes toggles folding
-or opens links. Dragging the background will move the map. You can also search
-the map, using the node popup menu. </font></li>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/create.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/create.htm
deleted file mode 100644
index 8327b0c..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/create.htm
+++ /dev/null
@@ -1,46 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="keywords" content="creating mind maps,root node,interface">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Creating maps</title>
-</head>
-
-<body>
-
-<h2><font color="#008000" face="Arial">Creating mindmaps</font></h2>
-<p><font face="Arial">You create mindmaps in "mindmap" mode, which is how
-Freeplane starts up.</font></p>
-<p><font face="Arial">Create a new map by opening the File menu and clicking
-New. </font></p>
-<p><font face="Arial">Freeplane will create a new screen, with an oval in the
-center labeled "New mindmap". This is the "root node". You will build your map
-by adding nodes to the root. </font></p>
-<p><font face="Arial">For a look at the screen with a small map, see the
-<a href="screen.html"> Freeplane interface</a>.</font></p>
-<p><font face="Arial">The new root node will be highlighted with gray, which
-means it's currently selected. Clicking on it will open the text for
-editing. Do this and enter a name, such as "My Ideas", and hit Enter.</font></p>
-<p><font face="Arial">When you right-click on a node, you'll see a context menu
-that offers several options, such as "New Child Node". Notice that many of the
-options also have shortcut keys. For example, you can add a child node to
-your root node by selecting it and hitting the Insert key.</font></p>
-<p><font face="Arial">The root node can only have child nodes. With other
-nodes, you can create sibling nodes (at the same level) or child nodes. Nodes
-are connected by lines known as edges.</font></p>
-<p><font face="Arial">As you build your map, you can set colors, sizes, fonts
-and other attributes to emphasize nodes and edges. For example, you might want
-to highlight all "action items" in red. Nodes can be "folded" or "unfolded" by
-clicking on them. Unfolding a node displays the nodes below it. You can also
-insert, delete and rearrange nodes quickly. See <a href="edithome.htm">Editing
-your maps</a> for details.</font></p>
-<p><font face="Arial"><i>Tip: Quickly change to a different already opened mind
-map:<br>
-You can right-click on the background and select a different map from the menu.</i></font></p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/credits.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/credits.htm
deleted file mode 100644
index 4737ebe..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/credits.htm
+++ /dev/null
@@ -1,105 +0,0 @@
-<html>
-
-<head>
-<meta name="keywords" content="authors,credits">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Credits</title>
-<style>
-<!--
- span.l { color: red; font-weight: bold; }
-
--->
-</style>
-</head>
-
-<body>
-
-<h2><font color="#669900" face="Arial">Credits </font></h2>
-<h4><font color="#0000FF" face="Arial">Authors </font></h4>
-<ul>
- <li style="list-style-type: none"><font face="Arial">Joerg Mueller </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">
- <a href="mailto:ponders at t-online.de" target="_blank">ponders at t-online.de </a>
- </font></li>
- <li style="list-style-type: none"><font face="Arial">University of Freiburg,
- Germany </font></li>
- </ul>
- </li>
- <li style="list-style-type: none"><font face="Arial">
- <a href="http://mujweb.cz/www/danielpolansky" target="_blank">Daniel Polansky
- </a></font></li>
- <li style="list-style-type: none"><font face="Arial">Petr Novak </font></li>
- <li style="list-style-type: none"><font face="Arial">Christian Foltin </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">
- <a href="mailto:christian.foltin at gmx.de" target="_blank" ">
- <font face=" Arial"></font>christian.foltin at gmx.de </a></font></li>
- </ul>
- </li>
-</ul>
-<h4><font color="#0000FF" face="Arial">Smaller contributions </font></h4>
-<ul>
- <li style="list-style-type: none"><font face="Arial">David Butt </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">Tutorial flash </font>
- </li>
- </ul>
- </li>
- <li style="list-style-type: none"><font face="Arial">David Low </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">Helpful </font></li>
- </ul>
- </li>
- <li style="list-style-type: none"><font face="Arial">Andrew Iggleden </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">Installer Windows
- </font></li>
- </ul>
- </li>
- <li style="list-style-type: none"><font face="Arial">Dimitri Polivaev </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">Bug removal </font>
- </li>
- </ul>
- </li>
- <li style="list-style-type: none"><font face="Arial">Bob Alexander </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">Eclipse howto </font>
- </li>
- </ul>
- </li>
-</ul>
-<h4><font color="#0000FF" face="Arial">Translations </font></h4>
-<ul>
- <li style="list-style-type: none"><font face="Arial">Bob Alexander </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">Italian translation
- </font></li>
- </ul>
- </li>
- <li style="list-style-type: none"><font face="Arial">Knud Riish�jg�rd </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">Danish translation
- </font></li>
- </ul>
- </li>
- <li style="list-style-type: none"><font face="Arial">Takeshi Kakeda </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">Japanese translation
- </font></li>
- </ul>
- </li>
- <li style="list-style-type: none"><font face="Arial">Alex Dukal </font>
- <ul>
- <li style="list-style-type: none"><font face="Arial">Spanish translation
- </font></li>
- </ul>
- </li>
-</ul>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/customize.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/customize.htm
deleted file mode 100644
index 68172e2..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/customize.htm
+++ /dev/null
@@ -1,39 +0,0 @@
-<html>
- <head>
- <meta content="customizing,user.properties,options" name="keywords">
- <meta content="Microsoft FrontPage 5.0" name="GENERATOR">
- <meta content="FrontPage.Editor.Document" name="ProgId">
- <meta content="text/html; charset=windows-1252" http-equiv="Content-Type">
- <title>Customizing Freeplane </title>
-
- </head>
- <body>
- <h2>
- <b><font color="#669900" size="5" face="Arial">Customizing Freeplane </font></b>
-
- </h2>
- <p>
- <font face="Arial">Ideally, you don't need any customizing at all. But
- if you really want to customize Freeplane, copy the file
- "user.properties" to the folder "freeplane" in your home directory and
- edit the properties in the text file using your favorite text editor,
- e.g. notepad, Vim or Emacs. </font>
- </p>
- <p>
- <font face="Arial">You certainly know your home directory if you're
- working on Linux. On Windows 2000, it's typically "C:\Documents and
- Settings\<UserName>\", on Windows 95, it's "C:\WINDOWS\". Edit
- "user.properties" in the folder "freeplane" of your home directory. </font>
-
- </p>
- <p>
- <font face="Arial">On Windows, you can additionally configure files with
- the extension .mm to open with Freeplane.</font>
- </p>
- <p>
- <font face="Arial">For details on editing options, see <a href="customuser.htm">
-The user.properties file</a>. For details on editing patterns, see <a href="patterns.htm">
-Physical style - patterns</a></font>
- </p>
- </body>
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/customuser.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/customuser.htm
deleted file mode 100644
index fcc9648..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/customuser.htm
+++ /dev/null
@@ -1,211 +0,0 @@
-<html>
-
-<head>
-<meta name="keywords" content="user.properties,language,locking,default font,node color,colors,look and feel,keystrokes,autosave">
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>user.properties</title>
-</head>
-
-<body>
-
-<h3><font color="#669900" face="Arial">The user.properties file </font></h3>
-<p><font face="Arial">The user.properties file has many useful options.
-Unfortunately, it can be scary for novices. Here's a selective look at some of
-the choices you might want to adjust. </font></p>
-<blockquote>
- <p><font face="Arial">To change the options, you'll copy the file "user.properties"
- from Freeplane's program directory to the folder "freeplane" in your home
- directory and edit it using a text editor. You surely know your home directory
- if you're working on Linux. On Windows 2000, it's typically "C:\Documents and
- Settings\<UserName>\", on Windows 95, it's "C:\WINDOWS\". Edit "user.properties"
- in the folder "freeplane" of your home directory. </font></p>
- <p><font face="Arial">When you start out, all of the options are commented out
- with a single "#" symbol. To change an option, remove the "#" and edit the
- line. Then save the file and restart Freeplane. (Comments in the file are
- marked by "##". You should not remove the comment symbols from those lines.)</font></p>
- <p><font face="Arial">These notes apply to version 0.7.1. The file is likely
- to be different in future versions.</font></p>
-</blockquote>
-<p><font face="Arial">The value shown in the examples is the default value, the
-one you'll get if you leave the line commented out.</font></p>
-<p><font face="Arial"><i>Language. Supported are "en", "de" and "fr":<br>
-</i><b>language = en</b></font></p>
-<p><font face="Arial"><i>Experimental file locking ("true" or "false"):<br>
-</i><b>experimental_file_locking_on = false</b></font></p>
-<p><font face="Arial"><i>Default node style -- "fork" or "bubble":<br>
-</i><b>standardnodestyle = fork</b></font></p>
-<p><font face="Arial"><i>Standard node color in HTML #RRGGBB notation:<br>
-</i><b>standardnodecolor = #000000</b></font></p>
-<ul>
- <li><font face="Arial">All color references here are in HTML notation. Many
- references to HTML color codes are on the Internet. A handy chart, and links
- to some color tools, is at <a href="http://www.lissaexplains.com/color.shtml">
- http://www.lissaexplains.com/color.shtml</a>.</font></li>
-</ul>
-<p><i><font face="Arial">Default node font. This will only work if the font (TrueTypeFont)
-is available on the system:</font></i><font face="Arial"><br>
-<b>defaultfont = SansSerif<br>
-defaultfontstyle = 0<br>
-defaultfontsize = 12</b></font></p>
-<p><font face="Arial"><i>Default maximal node width in pixels:<br>
-</i><b>max_node_width = 600</b></font></p>
-<p><font face="Arial"><i>Standard edge color:<br>
-</i><b>standardedgecolor = #808080</b></font></p>
-<p><font face="Arial"><i>Standard edge style -- "linear" or "bezier":<br>
-</i><b>standardedgestyle = bezier</b></font></p>
-<p><font face="Arial"><i>Standard cloud color:<br>
-</i><b>standardcloudcolor = #f0f0f0</b></font></p>
-<p><font face="Arial"><i>Standard link color:<br>
-</i><b>standardlinkcolor = #b0b0b0</b></font></p>
-<p><font face="Arial"><i>Standard background color:<br>
-</i><b>standardbackgroundcolor = #ffffff</b></font></p>
-<p><font face="Arial"><i>Look & Feel to use. "metal", "windows", "motif" are
-supported on all platforms; "mac" is available only on MacOS. default means that
-the default look and feel is used. If there are problems with the look and
-feel, then choose "nothing" here. It work for applets.<br>
-</i><b>lookandfeel = windows</b></font></p>
-<p><font face="Arial"><i>Initial map size:<br>
-</i><b>mapxsize = 1000<br>
-mapysize = 3200</b></font></p>
-<p><font face="Arial"><i>How many items to keep in the recent-files list:</i><b><i><br>
-</i>last_opened_list_length = 25</b></font></p>
-<p><i><font face="Arial">Options for the window that opens up to edit long
-nodes:</font></i><font face="Arial"><br>
-<b>el__buttons_position = above<br>
-el__position_window_below_node = true<br>
-el__min_default_window_height = 150<br>
-el__max_default_window_height = 500<br>
-el__min_default_window_width = 600<br>
-el__max_default_window_width = 600<br>
-el__enter_confirms_by_default = true</b></font></p>
-<p><i><font face="Arial">Next comes a long section of keystroke definitions.
-Valid modifiers are: <br>
- shift | control | alt | meta | button1 | button2 | button3 </font></i></p>
-<blockquote>
- <p><font face="Arial"><i>Menu accelerators:<br>
- </i><b>keystroke_newMap = control N<br>
- keystroke_open = control O<br>
- keystroke_save = control S<br>
- keystroke_saveAs = control A<br>
- keystroke_print = control P<br>
- keystroke_close = control W <br>
- keystroke_quit = control Q<br>
- keystroke_export_to_html = control E <br>
- keystroke_export_branch_to_html = control H<br>
- keystroke_open_first_in_history = control shift W<br>
- </b></font></p>
- <p><font face="Arial"><i>Map and mode switching:<br>
- </i></font><b><font face="Arial">keystroke_previousMap = control LEFT <br>
- keystroke_nextMap = control RIGHT </font></b></p>
- <p><b><font face="Arial">keystroke_mode_MindMap = alt 1<br>
- keystroke_mode_Browse = alt 2 <br>
- keystroke_mode_File = alt 3</font></b></p>
- <p><font face="Arial"><i>Node editing commands:<br>
- </i></font><b><font face="Arial">keystroke_node_toggle_italic = control I<br>
- keystroke_node_toggle_boldface = control B<br>
- keystroke_node_toggle_cloud = control shift B</font></b></p>
- <p><font face="Arial"><b>keystroke_cut = control X<br>
- keystroke_copy = control C<br>
- keystroke_copy_single = control Y<br>
- keystroke_paste = control V </b></font></p>
- <p><font face="Arial"><i>(You can change the following key to DELETE, but it's
- disabled because of the lack of an Undo function:)<br>
- </i><b>keystroke_remove = none</b></font></p>
- <p><font face="Arial"><b>keystroke_edit = F2<br>
- keystroke_edit_long_node = alt ENTER<br>
- keystroke_join_nodes = control J<br>
- keystroke_toggle_folded = SPACE<br>
- keystroke_toggle_children_folded = control SPACE<br>
- keystroke_set_link_by_filechooser = control shift K<br>
- keystroke_set_link_by_textfield = control K<br>
- keystroke_set_image_by_filechooser = alt K<br>
- keystroke_node_up = control UP<br>
- keystroke_node_down = control DOWN<br>
- keystroke_node_increase_font_size = control L<br>
- keystroke_node_decrease_font_size = control M<br>
- keystroke_branch_increase_font_size = control shift L<br>
- keystroke_branch_decrease_font_size = control shift M<br>
- keystroke_export_branch = alt A</b></font></p>
- <p><b><font face="Arial">keystroke_node_color = alt C<br>
- keystroke_node_color_blend = alt B<br>
- keystroke_edge_color = alt E</font></b></p>
- <p><font face="Arial"><i>Node navigation commands:<br>
- </i><b>keystroke_moveToRoot = ESCAPE<br>
- keystroke_move_up = E<br>
- keystroke_move_down = D<br>
- keystroke_move_left = S<br>
- keystroke_move_right = F<br>
- keystroke_follow_link = control ENTER</b></font></p>
- <p><font face="Arial"><i><a name="newnode"></a>New node commands:<br>
- </i><b>keystroke_add = ENTER<br>
- keystroke_add_child = INSERT</b></font></p>
- <p><i>(Mac users may want to edit this to control ENTER. Don't forget to
- remove the # from the beginning of the line.)</i></p>
- <p><font face="Arial"><b><br>
- keystroke_add_sibling_before = shift ENTER</b></font></p>
- <p><font face="Arial"><i>Search:</i></font><b><font face="Arial"><br>
- keystroke_find = ctrl F<br>
- keystroke_find_next = ctrl G</font></b></p>
- <p><font face="Arial"><i>Apply patterns. There is no limiting number of the
- pattern, you can have as many keystrokes for patterns as you want. F10 and
- beyond aren't used in the default because F10 has a special function on
- Windows.<br>
- </i><b>keystroke_apply_pattern_1 = F1<br>
- keystroke_apply_pattern_2 = control shift N<br>
- keystroke_apply_pattern_3 = F3<br>
- keystroke_apply_pattern_4 = F4<br>
- keystroke_apply_pattern_5 = F5<br>
- keystroke_apply_pattern_6 = F6<br>
- keystroke_apply_pattern_7 = F7<br>
- keystroke_apply_pattern_8 = F8<br>
- keystroke_apply_pattern_9 = F9<br>
- keystroke_apply_pattern_10 = control F1<br>
- keystroke_apply_pattern_11 = control F2<br>
- keystroke_apply_pattern_12 = control F3<br>
- keystroke_apply_pattern_13 = control F4<br>
- keystroke_apply_pattern_14 = control F5<br>
- keystroke_apply_pattern_15 = control F6<br>
- keystroke_apply_pattern_16 = control F7<br>
- keystroke_apply_pattern_17 = control F8<br>
- keystroke_apply_pattern_18 = control F9</b></font></p>
- <p><b><font face="Arial">keystroke_zoom_out = alt UP<br>
- keystroke_zoom_in = alt DOWN</font></b></p>
-</blockquote>
-<p><font face="Arial"><i>Key typing: if enabled enters node editing. Default is
-to enable this mode:<br>
-</i><b>disable_key_type = false</b></font></p>
-<p><font face="Arial"><i>Key typing: overwrites content (false) / creates new
-sibling (true). (Requires: disable_key_type = false):<br>
-</i><b>key_type_adds_new = false</b></font></p>
-<p><font face="Arial"><i>Tell if HTML exported from Freeplane should contain
-icons. The trouble with icons is that quite often the links to icons will not be
-found in the exported HTML.<br>
-</i><b>export_icons_in_html = false</b></font></p>
-<p><font face="Arial"><i>Selection time delay of nodes when mouse is over (in
-msec). Change this value to 1 if you want direct selection on mouse over.<br>
-</i><b>time_for_delayed_selection=500</b></font></p>
-<p><font face="Arial"><i>Autosave options:</i></font></p>
-<blockquote>
- <p><font face="Arial"><i>Time between two consecutive automatic saving actions
- (in msec). To disable automatic saving set this number to 2000000000.<br>
- </i><b>time_for_automatic_save=60000</b></font></p>
- <p><font face="Arial"><i>If the autosave files should be deleted automatically
- on a normal shutdown of Freeplane set the following variable to true: <br>
- </i><b>delete_automatic_saves_at_exit=true</b></font></p>
- <p><font face="Arial"><i>Number of different files to store the autosave maps
- into. The first automatic save is done in the first file, and so on, up to the
- n+1 save, which is again stored in the first file (cyclic):<br>
- </i><b>number_of_different_files_for_automatic_save=10</b></font></p>
- <p><font face="Arial"><i>Autosave path. To change the default path (this is "java.io.tmpdir"
- of Java), enter a directory path here. freeplane_home stands for the
- directory where the auto.properties are. ( * default points to java.io.tmpdir):<br>
- </i><b>path_to_automatic_saves=freeplane_home</b></font></p>
- <p> </p>
-</blockquote>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco1.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco1.gif
deleted file mode 100644
index 72a509b..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco1.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco2.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco2.gif
deleted file mode 100644
index 3b95006..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco2.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco3.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco3.gif
deleted file mode 100644
index 7329b0c..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco3.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco4.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco4.gif
deleted file mode 100644
index 091965f..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editco4.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editcopy.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editcopy.htm
deleted file mode 100644
index 9fd39b7..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editcopy.htm
+++ /dev/null
@@ -1,181 +0,0 @@
-<html>
- <head>
- <meta content="copying,pasting,links,HTML,RTF" name="keywords">
- <meta content="en-us" http-equiv="Content-Language">
- <meta content="Microsoft FrontPage 5.0" name="GENERATOR">
- <meta content="FrontPage.Editor.Document" name="ProgId">
- <meta content="text/html; charset=windows-1252" http-equiv="Content-Type">
- <title>Copying and pasting </title>
-
- </head>
- <body>
- <h2>
- <b><font color="#669900" size="5" face="Arial">Copying and pasting</font><font size="5" face="Arial">
- </span><span> </span></font></b>
- </h2>
- <p>
- <font face="Arial">You can copy and paste (multiple) nodes between
- mindmaps, as you might expect.</font>
- </p>
- <p>
- <font face="Arial">You can copy a single node without its children by
- Copy Single </font>
- </p>
- <ul>
- <li>
- <font face="Arial">Ctrl + Y </font>
- </li>
- </ul>
- <h4>
- <font color="#669900" face="Arial">Pasting external data into Freeplane</font>
-
- </h4>
- <font face="Arial">In addition, you can paste normal text or HTML from
- other applications. </font>
-
- <p>
- <i><font face="Arial">Normal text</font></i>
- </p>
- <ul>
- <li>
- <font face="Arial">Multiple lines are pasted as multiple nodes.</font>
- </li>
- <li>
- <font face="Arial">URLs are recognized automatically and links are
- created.</font>
- </li>
- <li>
- <font face="Arial">Lines with different depth are pasted in different
- depth.<br>e.g. </font>
- </li>
- <li>
- <font face="Arial">Source </font>
-
- <ul>
- <li>
- <font color="#996600" face="Arial">Tree</font><font face="Arial"> </font>
-
- </li>
- <li>
- <font color="#996600" face="Arial"> Oak</font>
-
- </li>
- <li>
- <font color="#996600" face="Arial"> Beech</font>
-
- </li>
- </ul>
- </li>
- <li>
- <font face="Arial">.. is pasted as</font>
-
- <ul>
- <li>
- <font face="Arial"><img border="0" width="87" height="59" src="editco1.gif">
- </font>
- </li>
- </ul>
- </li>
- </ul>
- <i><font face="Arial">HTML</font></i>
-
- <ul>
- <li>
- <font face="Arial">HTML is pasted as normal text, but also links
- contained in HTML are separately pasted, e.g.:</font>
- </li>
- </ul>
- <blockquote>
- <p>
- <font face="Arial"> <img border="0" width="201" height="91" src="editco2.gif"></font>
-
- </p>
- </blockquote>
- <p>
- <font face="Arial"> where the red arrows indicate Web links.</font>
-
- </p>
- <p>
- <i><font face="Arial">File list </font></i>
- </p>
- <ul>
- <li>
- <font face="Arial">Paste a set of files selected in Explorer on
- Windows </font>
- </li>
- </ul>
- <h4>
- <font face="Arial" color="#669900">Pasting branches from Freeplane into
- other applications</font>
- </h4>
- <i><font face="Arial">As text </font></i>
-
- <blockquote>
- <font face="Arial">The tree structure is displayed by indent </font>
-
- <p>
- <font face="Arial"><img border="0" width="165" height="69" src="editco4.gif">
- </font>
- </p>
- <p>
- <font face="Arial">is pasted as</font>
- </p>
- <blockquote>
- <p>
- <i><font face="Arial">A node<br> child one<br>
- child two</font></i>
- </p>
- </blockquote>
- </blockquote>
- <p>
- <i><font face="Arial"> Links are pasted, too, in < > brackets:</font></i>
-
- </p>
- <blockquote>
- <font face="Arial">Source<br> <a href="http://www.google.com/" target="_blank">
-~ </a></font><a href="http://www.google.com/" target="_blank"><font face="Arial" color="#996600">
-Google</font><font face="Arial"> </font></a><font face="Arial"><br>... is
- pasted as<br> </font><font face="Arial" color="#996600">
- Google <http://www.google.com/></font><font face="Arial">
- </font>
- </blockquote>
- <p>
- <i><font face="Arial">As RTF</font></i>
- </p>
- <ul>
- <li>
- <font face="Arial">You can paste the branch contents into ... </font>
- </li>
- </ul>
- <blockquote>
- <ul>
- <li>
- <font face="Arial">Word </font>
- </li>
- <li>
- <font face="Arial">an Outlook message </font>
- </li>
- <li>
- <font face="Arial">Wordpad </font>
- </li>
- </ul>
- </blockquote>
- <ul>
- <li>
- <font face="Arial">Text formatting -- color and font -- is preserved
- in RTF applications:</font>
-
- <blockquote>
- <p>
- <font face="Arial" color="#000000">A node<br> child one<br>
- child two</font>
- </p>
- </blockquote>
- </li>
- <li>
- <font face="Arial">Links are pasted in a similar fashion as in pasting
- text</font>
- </li>
- </ul>
- </body>
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editdrag.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editdrag.htm
deleted file mode 100644
index 218e9dc..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editdrag.htm
+++ /dev/null
@@ -1,66 +0,0 @@
-<html>
-
-<head>
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta content="drag and drop,moving nodes,copying nodes,external data" name="keywords" />
-<meta content="en-us" http-equiv="Content-Language" />
-<meta content="FrontPage.Editor.Document" name="ProgId" />
-<meta content="text/html; charset=windows-1252" http-equiv="Content-Type" />
-<title>Editing by drag and drop</title>
-</head>
-
-<body>
-
-<h3><font color="#669900" face="Arial">Editing by Drag and Drop</font></h3>
-<p style="font-family: Arial; font-size: 12pt">You can move nodes around by
-using Drag and Drop.</p>
-<p style="font-family: Arial; font-size: 12pt"><font color="#669900">Drag and
-Drop lets you drop nodes...</font></p>
-<blockquote>
- <p><font face="Arial">...as a child</font></p>
- <ul>
- <li><font face="Arial">Position the cursor so the destination node is
- highlighted to the right. </font></li>
- </ul>
- <p><font face="Arial">...as a sibling</font></p>
- <ul>
- <li><font face="Arial">Position the cursor so the destination node is
- highlighted on top.</font></li>
- </ul>
-</blockquote>
-<p style="font-family: Arial; font-size: 12pt">Hold control while dragging to
-copy nodes instead of moving them, or drag with the middle mouse button held
-down.</p>
-<blockquote style="font-family: helvetica; font-size: 12pt">
- <p><font size="2" face="Arial">Before Version 0.7:</p>
- <blockquote>
- <p>If you hold control and shift while dragging, the color and font of the
- target node is copied to the source node.</p>
- <p>You can achieve the same by dragging with the right mouse, target node to
- source node!! This is contraintuitive!! But it lets you change the color of
- multiple nodes in one Drag and Drop</font></p>
- </blockquote>
-</blockquote>
-<p style="font-family: Arial; font-size: 12pt">If you've selected multiple
-nodes, they will all be moved or copied.</p>
-<p style="font-family: Arial; font-size: 12pt"><font color="#669900">You can
-drop sources from external applications</font></p>
-<ul style="font-family: helvetica; font-size: 12pt">
- <li><font face="Arial">Files
- <ul>
- <li>(on Windows)</li>
- </ul>
- </li>
- <li>Pieces of text
- <ul>
- <li>(works with dropping of text selection in MS Internet Explorer) </font>
- <p></li>
- </ul>
- </li>
-</ul>
-<p><font face="Arial">You can edit a map by dragging and dropping its file into
-the background of Freeplane.</font></p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editho1.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editho1.gif
deleted file mode 100644
index ea02d98..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editho1.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/edithome.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/edithome.htm
deleted file mode 100644
index ac9e1ac..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/edithome.htm
+++ /dev/null
@@ -1,102 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="keywords" content="selecting,editing nodes,splitting nodes,copying,undo,reordering,autosave">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Editing your maps</title>
-<style>
-<!--
- span.l { color: red; font-weight: bold; }
-
--->
-</style>
-</head>
-
-<body>
-
-<h1><font color="#669900" face="Arial">Editing your mindmaps</font></h1>
-<p><font face="Arial">You have many options as you edit your mindmaps.</font></p>
-<h4><font color="#669900" face="Arial">Selecting a node </font></h4>
-<p><font face="Arial">Select a node by either pointing at it with the mouse or
-clicking on it, as governed by your user preferences (Edit / Preferences).</font></p>
-<h4><font color="#669900" face="Arial">Editing a node</font></h4>
-<p><font face="Arial">If you right-click on a node, you'll see a context menu
-with several choices.</font></p>
-<p><font face="Arial"><img border="0" src="editho1.gif" width="165" height="287"></font></p>
-<ul>
- <li><font face="Arial"><b>Edit:</b> Change the text of a node</font></li>
- <li><font face="Arial"><b>Edit a long node: </b>Open a window to edit text.
- </font></li>
- <li><font face="Arial"><b>New Child Node: </b>Create a new linked node, one
- level deeper. [Mac users may want to create an alternative to the Insert key.
- See <a href="customuser.htm#newnode">user.properties</a> page.)</font></li>
- <li><font face="Arial"><b>Cut: </b>Cut the selected node and all of its
- descendants to the clipboard. Note that because there is no Undo function as
- of this writing, Cut may be used to delete text, which can then be recovered
- with Paste. See below.</font></li>
- <li><font face="Arial"><b>Copy:</b> Copy the selected node and all of its
- descendants to the clipboard.</font></li>
- <li><font face="Arial"><b>Copy Single:</b> Copy <i>only</i> the selected node
- to the clipboard.</font></li>
- <li><font face="Arial"><b>Paste: </b>Insert the contents of the clipboard as a
- child of (below) the currently selected node.</font></li>
- <li><font face="Arial"><b>Node:</b> Offers a variety of options for formatting
- and positioning nodes. See <a href="editnode.htm">Editing nodes</a> for
- details.</font></li>
- <li><font face="Arial"><b>Branch:</b> Offers options for importing and
- exporting branches.</font></li>
- <li><font face="Arial"><b>Edge:</b> Offers options for the style, color and
- width of edges (the lines connecting nodes)</font></li>
- <li><font face="Arial"><b>Physical style:</b> Presents a variety of choices
- for preset styles that can combine font, size, color, etc. Styles are defined
- in the file called patterns.xml. See <a href="customize.htm">Customizing
- Freeplane</a> for details.</font></li>
- <li><font face="Arial"><b>Icons:</b> Offers a choice of decorative icons. When
- you choose an icon, it is inserted at the start of the node, but after any
- icons that are already there. You can also insert an icon from the icon
- toolbar at the left hand side of the window. (You can remove this toolbar by
- right-clicking on the background of Freeplane.)</font></li>
-</ul>
-<h4><font color="#669900" face="Arial">Selecting multiple nodes </font></h4>
-<ul>
- <li><font face="Arial">To select multiple nodes hold control or shift while
- clicking. </font></li>
- <li><font face="Arial">Control lets you add single nodes to a set of already
- selected nodes. </font></li>
- <li><font face="Arial">Shift lets you select continuous ranges of nodes or
- whole subtrees of nodes. </font></li>
-</ul>
-<h4><font face="Arial" color="#669900">Reordering nodes</font></h4>
-<p><font face="Arial">Move nodes up and down within a group of siblings (same
-level) by using Ctrl+Up Arrow or Ctrl+Down Arrow.</font></p>
-<h4><font face="Arial" color="#669900">Editing long nodes</font></h4>
-<p><font face="Arial">When you've opened the window to edit a long node
-(Alt-Enter), removing the checkmark from "Enter confirms" allows you to key in
-line breaks with the Enter key; otherwise, use Ctrl-Enter. You can also split a
-long node into two nodes at the point of the cursor, by using the "Split"
-button.</font></p>
-<p><font size="2" face="Arial">Tip: To create a multiline node, insert a new
-node and press Alt-Enter. </font></p>
-<h4><font color="#669900" face="Arial">Is there no undo in Freeplane? </font>
-</h4>
-<p><font face="Arial">There is no undo so far (0.7.1). Help against data loss
-are offered by:</font></p>
-<ul>
- <li><font face="Arial">The autosave feature</font></li>
- <li><font face="Arial">You can install a clipboard manager, which will make
- all elements cut from Freeplane available in its history. A freeware example of
- a clipboard manager for Microsoft Windows is
- <a target="_blank" href="http://www.yankee-clipper.net/">Yankee Clipper</a>.</font></li>
-</ul>
-<h4><font color="#669900" face="Arial">Autosave</font></h4>
-<p><font face="Arial">By default, a backup copy of your map is saved to the home
-directory every minute. To disable this function, or change the time interval or
-the save directory, edit the user.properties file in the home directory.</font></p>
-<p> </p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editkeyboard.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editkeyboard.htm
deleted file mode 100644
index 57dd54a..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editkeyboard.htm
+++ /dev/null
@@ -1,76 +0,0 @@
-<html>
-
-<head>
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Language" content="en-us">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Using the keyboard</title>
-</head>
-
-<body>
-
-<h2><font color="#669900" face="Arial">Using the keyboard </font></h2>
-<p><font face="Arial">You can do most navigation using the keyboard; click on
-link for a <a href="editkeychart.htm">full chart of default keyboard shortcuts</a>.
-You can see the keyboard shortcuts in the popup menu of the node. Some of
-the shortcuts which you do not see that way follow. </font></p>
-<p><font color="#669900" face="Arial">Page Up and Page Down </font></p>
-<ul>
- <li style="list-style-type: none"><font face="Arial">scroll by a large skip up
- and down </font></li>
-</ul>
-<p><font color="#669900" face="Arial">Ctrl+Page Up and Ctrl+Page Down </font>
-</p>
-<ul>
- <li style="list-style-type: none"><font face="Arial">scroll by a large skip
- left and up </font></li>
-</ul>
-<p><font face="Arial"> Nice for having a quick glance above
-and then continuing below again </font></p>
-<p><font color="#669900" face="Arial">Escape </font></p>
-<ul>
- <li style="list-style-type: none"><font face="Arial">Move to root </font></li>
-</ul>
-<p><font color="#669900" face="Arial">Arrows </font></p>
-<ul>
- <li style="list-style-type: none"><font face="Arial">Move around </font></li>
-</ul>
-<p><font face="Arial"></li>
-You can select a range of nodes by holding shift and moving around with the
-cursor arrows or Page Up and Page Down. </font></p>
-<p><font face="Arial">You can replace the text in the current node and start
-editing by typing letters. You can also edit a node by pressing the home or end
-key, as well as F2. </font></p>
-<p><font face="Arial">Technical users can change the keyboard settings in
-<a href="customuser.htm">user.properties</a>. </font></p>
-<p> </p>
-<h4><font color="#669900" face="Arial">Keyboard while editing a long node </font>
-</h4>
-<p><font face="Arial">By default, Enter finishes editing a long node, and
-Ctrl+Enter enters a new line. By unchecking the check box "Enter confirms" you
-can reverse those function, i.e., Enter enters a new line and Ctrl+Enter
-finishes editing. You can set the default value of that check box in
-user.properties. Moreover, the value of the box is saved during a session of
-Freeplane. </font></p>
-<p> </p>
-<h4><font color="#669900" face="Arial">Changes in user interface of recent
-version </font></h4>
-<p><font face="Arial">Some key settings have been redefined to conform with
-shared standards or intuitive use. Some of the new key settings are modeled on
-Microsoft tools. </font></p>
-<p><font face="Arial">New key settings include Enter for creating siblings below
-the node, Insert for creating new children, F2 for editing nodes -- here the
-Microsoft influence is apparent while there is no intuitive reason to have F2
-for node editing. But once you get used to it in all the applications you use,
-you want to have that one in Freeplane too, of course. </font></p>
-<p><font face="Arial">The changes are customizable in user.properties to an
-extent. If you are a technical user and you do not like the changes, change the
-settings in user.properties. </font></p>
-<p><font face="Arial">To copy your selection to the clipboard when you are
-editing a node, press the right mouse button and choose copy.</font></p>
-<p> </p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editkeychart.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editkeychart.htm
deleted file mode 100644
index e26d9eb..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editkeychart.htm
+++ /dev/null
@@ -1,113 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Keyboard shortcuts</title>
-</head>
-
-<body>
-
-<blockquote>
- <h3><font color="#008000" face="Arial">Keyboard reference</font></h3>
- <p><font face="Arial">Default keyboard shortcuts. These may be edited in the
- <a href="customuser.htm">user.properties</a> file.</font></p>
-</blockquote>
-<div align="left">
- <table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="85%" id="AutoNumber1" align="left">
- <tr>
- <td width="50%" align="left" valign="top">
- <blockquote>
- <p><font face="Arial" size="2"><i>Menu accelerators:<br>
- </i><b> new map = Ctrl+N<br>
- open = Ctrl+O<br>
- save = Ctrl+S<br>
- save as = Ctrl+A<br>
- print = Ctrl+P<br>
- close = Ctrl+W <br>
- quit = Ctrl+Q<br>
- export to HTML = Ctrl+E <br>
- export branch to HTML = Ctrl+H<br>
- open first in history = Ctrl+Shift+W<br>
- </b></font></p>
- <p><font face="Arial"><i><font size="2">Map and mode switching:<br>
- </font></i></font><b><font size="2" face="Arial"> previous map =
- Ctrl+LEFT <br>
- next map = Ctrl+RIGHT </font></b></p>
- <p><b><font face="Arial" size="2"> mode MindMap = Alt+1<br>
- mode Browse = Alt+2 <br>
- mode File = Alt+3</font></b></p>
- <p><font face="Arial"><i><font size="2">Node editing commands:<br>
- </font></i></font><b><font size="2" face="Arial"> toggle italic =
- Ctrl+I<br>
- toggle boldface = Ctrl+B<br>
- toggle cloud = Ctrl+shift B</font></b></p>
- <p><font face="Arial" size="2"><b> cut = Ctrl+X<br>
- copy = Ctrl+C<br>
- copy single = Ctrl+Y<br>
- paste = Ctrl+V </b></font></p>
- <p><font face="Arial" size="2"><b> edit = F2<br>
- edit long node = Alt+Enter<br>
- join nodes = Ctrl+J<br>
- toggle folded = SPACE<br>
- toggle children folded = Ctrl+SPACE<br>
- set link by filechooser = Ctrl+shift K<br>
- set link by textfield = Ctrl+K<br>
- set image by filechooser = Alt+K<br>
- node up = Ctrl+UP<br>
- node down = Ctrl+DOWN<br>
- node increase font size = Ctrl+L<br>
- node decrease font size = Ctrl+M<br>
- branch increase font size = Ctrl+Shift+L<br>
- branch decrease font size = Ctrl+Shift+M<br>
- export branch = Alt+A</b></font></p>
- <p><b><font face="Arial" size="2"> node color = Alt+C<br>
- node color blend = Alt+B<br>
- edge color = Alt+E</font></b></p>
- </blockquote>
- <p> </td>
- <td width="50%" valign="top" align="left"> <p><font face="Arial" size="2"><i>Node
- navigation commands:<br>
- </i><b> move to root = ESCAPE<br>
- move up = E<br>
- move down = D<br>
- move left = S<br>
- move right = F<br>
- follow link = Ctrl+Enter</b></font></p>
- <p><font face="Arial" size="2"><i>New
- node commands:<br>
- </i><b> add = Enter<br>
- add child = INSERT<br>
- add sibling before =Shift+Enter</b></font></p>
- <p><font face="Arial"><i><font size="2">Search:</font></i></font><b><font size="2" face="Arial"><br>
- find = Ctrl+F<br>
- find next = Ctrl+G</font></b></p>
- <p><font face="Arial" size="2"><i>Apply patterns.<br>
- </i><b> apply pattern 1 = F1<br>
- apply pattern 2 = Ctrl+Shift+N<br>
- apply pattern 3 = F3<br>
- apply pattern 4 = F4<br>
- apply pattern 5 = F5<br>
- apply pattern 6 = F6<br>
- apply pattern 7 = F7<br>
- apply pattern 8 = F8<br>
- apply pattern 9 = F9<br>
- apply pattern 10 = Ctrl+F1<br>
- apply pattern 11 = Ctrl+F2<br>
- apply pattern 12 = Ctrl+F3<br>
- apply pattern 13 = Ctrl+F4<br>
- apply pattern 14 = Ctrl+F5<br>
- apply pattern 15 = Ctrl+F6<br>
- apply pattern 16 = Ctrl+F7<br>
- apply pattern 17 = Ctrl+F8<br>
- apply pattern 18 = Ctrl+F9</b></font></p>
- <p><b><font face="Arial" size="2"> zoom out = Alt+UP<br>
- zoom in = Alt+DOWN</font></b></p>
- <p> </td>
- </tr>
- </table>
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editnav.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editnav.htm
deleted file mode 100644
index 430f1f9..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editnav.htm
+++ /dev/null
@@ -1,57 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Navigating through your mindmaps</title>
-<style>
-<!--
- span.l { color: red; font-weight: bold; }
-
--->
-</style>
-</head>
-
-<body>
-
-<h2><font color="#669900" face="Arial">Navigating through your mindmaps</font></h2>
-<h4><font color="#669900" face="Arial">Scrolling </font></h4>
-<p><font face="Arial">You can scroll the map:</font></p>
-<ul>
- <li><font face="Arial">By using the standard scroll bars.</font></li>
- <li><font face="Arial">By clicking on the background and dragging it.</font></li>
- <li><font face="Arial">By using mouse wheel. (To scroll horizontally, hold
- shift or one of the mouse buttons.) </font></li>
-</ul>
-<h4><font color="#669900" face="Arial">Zooming </font></h4>
-<p><font face="Arial">Change the zoom from the toolbar, or zoom in / out from
-the Edit menu. </font></p>
-<p><font face="Arial">As of version 0.7 you can change the zoom by holding down
-the control key and moving the mouse wheel. </font></p>
-<h4><font color="#669900" face="Arial">Reordering nodes</font></h4>
-<p><font face="Arial">Move nodes up and down within a group of siblings (same
-level) by using Ctrl+Up Arrow or Ctrl+Down Arrow.</font></p>
-<h4><font color="#669900" face="Arial">Following links</font></h4>
-<p><font face="Arial">You can follow a link by simply clicking the node.</font></p>
-<p><font face="Arial">On a node with a link and children:</font></p>
-<ul>
- <li><font face="Arial">Clicking at the left side opens the link </font></li>
- <li><font face="Arial">Clinking at the right side folds or unfolds the tree.</font></li>
-</ul>
-<h4><font color="#669900" face="Arial">Fast switching among maps </font></h4>
-<p><font face="Arial">There are several ways to switch from one opened map to
-another:</font></p>
-<ul>
- <li><font face="Arial">Right-click on an empty area of the background and pick
- the map name.</font></li>
- <li><font face="Arial">Use the toolbar arrows for previous map and next map.</font></li>
- <li><font face="Arial">Use the Maps menu.</font></li>
- <li><font face="Arial">Use the Edit menu, and choose Previous Map or Next Map.</font></li>
- <li><font face="Arial">Use Ctrl+Left Arrow or Ctrl+Right Arrow.</font></li>
-</ul>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno10.jpg b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno10.jpg
deleted file mode 100644
index 00bce15..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno10.jpg and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno11.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno11.gif
deleted file mode 100644
index bf54518..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno11.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno2.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno2.gif
deleted file mode 100644
index 1a901a0..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno2.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno3.jpg b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno3.jpg
deleted file mode 100644
index 1a6b82c..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno3.jpg and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno4.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno4.gif
deleted file mode 100644
index dc5afab..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno4.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno5.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno5.gif
deleted file mode 100644
index 0493ab6..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno5.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno6.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno6.gif
deleted file mode 100644
index 313f55f..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno6.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno7.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno7.gif
deleted file mode 100644
index 817353c..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno7.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno8.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno8.gif
deleted file mode 100644
index 7a0f497..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno8.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno9.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno9.gif
deleted file mode 100644
index ddad2ac..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editno9.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editnode.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editnode.htm
deleted file mode 100644
index 60b86f5..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editnode.htm
+++ /dev/null
@@ -1,135 +0,0 @@
-<html>
-
-<head>
-<meta content="Microsoft FrontPage 5.0" name="GENERATOR">
-<meta content="FrontPage.Editor.Document" name="ProgId">
-<meta content="text/html; charset=windows-1252" http-equiv="Content-Type">
-<title>Editing nodes</title>
-</head>
-
-<body>
-
-<h3><b><font color="#669900" size="5" face="Arial">Editing nodes</font></b> </h3>
-<p><font face="Arial">There are quite a few choices in the Node menu.
-</font></p>
-<p><font face="Arial"><img border="0" src="editno2.gif" width="267" height="411"> </font></p>
-<p><font face="Arial">Let's look first at the possibilities for changing the
-appearance of a node.</font> </p>
-<h3><font face="Arial" color="#669900">Appearance</font> </h3>
-<p><font face="Arial" color="#338800">Nodes can have different colors. </font>
-</p>
-<ul>
- <li><font face="Arial" color="#FF0000">Red </font></li>
- <li><font face="Arial" color="#009900">Green</font> </li>
- <li><font face="Arial" color="#0000FF">Blue</font> </li>
-</ul>
-<blockquote>
- <p><font face="Arial">To change the color, use the Node Color choice or hit
- Alt-c. Alt-b sets the color to a blend of the current color and the
- background.</font> </p>
-</blockquote>
-<p><font face="Arial" color="#669900">Nodes can have different fonts, sizes and
-styles. </font></p>
-<blockquote>
- <p><font face="Arial"><img border="0" src="editno6.gif" width="211" height="57"> </font></p>
-</blockquote>
-<p><font face="Arial" size="2">small </font></p>
-<p><font face="Arial" size="3">normal </font></p>
-<p><font face="Arial" size="4">bigger </font></p>
-<p><font face="Arial" size="6">Large </font></p>
-<p><font face="Arial" size="7">OOh </font></p>
-<p></p>
-<p><b><font face="Arial" size="4">Bold</font></b> </p>
-<p><i><font face="Arial" size="4">Italics </font></i></p>
-<p><b><i><font face="Arial" size="4">Bold and italics </font></i></b></p>
-<p><font face="Arial">To change the typeface, use the pulldown menus for font
-and size at the top of the screen. To change font styles, or make the type
-larger or smaller, pick Font in the Node menu. </font></p>
-<h3><font face="Arial" color="#669900">Styles</font> </h3>
-<p><font face="Arial"><img border="0" src="editno3.jpg" width="179" height="105"> </font></p>
-<p><font face="Arial">The Style choice in the Node menu lets you pick between
-Fork ...</font> </p>
-<p><font face="Arial"><img border="0" src="editno4.gif" width="325" height="103"> </font></p>
-<p><font face="Arial">or Bubble formatting ...</font> </p>
-<p><font face="Arial"><img border="0" src="editno5.gif" width="343" height="91"> </font></p>
-<p><font face="Arial">or to create a Cloud that spans multiple nodes ... </font>
-</p>
-<p><font face="Arial"><img border="0" src="editno9.gif" width="405" height="165"> </font></p>
-<ul>
- <li><font face="Arial">Clouds are well suited for highlighting a region.</font>
- </li>
- <li><font face="Arial">Highlighted are the node and all its subnodes. </font>
- </li>
- <li><font face="Arial">Clouds can have different background colors. </font>
- </li>
-</ul>
-<h4><font face="Arial" color="#669900">Nodes can be folded or unfolded</font>
-</h4>
-<p><font face="Arial"><img border="0" src="editno7.gif" width="225" height="57"> </font></p>
-<p><font face="Arial">By default, clicking on a node toggles between folded and
-unfolded.</font> </p>
-<h4><font face="Arial" color="#669900">Nodes can contain followable links to ...
-</font></h4>
-<ul>
- <li><font face="Arial" color="#006699">Web pages</font><font face="Arial">:</font>
- </li>
-</ul>
-<p><font face="Arial"><img border="0" src="editno8.gif" width="199" height="45"> </font></p>
-<ul>
- <li><font face="Arial" color="#006699">Local folders</font><font face="Arial">
- :</font> </li>
-</ul>
-<blockquote>
- <p><font face="Arial"><a href="../../../Program%20Files/" target="_blank"> </a></font><a href="../../../Program%20Files/" target="_blank"><font face="Arial" color="black">
- C:/Program Files/</font><font face="Arial"> </font></a></p>
-</blockquote>
-<ul>
- <li><font face="Arial" color="#006699">Executables</font><font face="Arial"> :</font>
- </li>
-</ul>
-<blockquote>
- <p><font face="Arial"><a href="../../../WINNT/regedit.exe" target="_blank"> </a></font><a href="../../../WINNT/regedit.exe" target="_blank"><font face="Arial" color="black">
- C:\WINNT\regedit.exe</font><font face="Arial"> </font></a></p>
-</blockquote>
-<p></p>
-<ul>
- <li><font face="Arial" color="#006699">Any document on your local computer or
- your company </font><font color="#006699"><font face="Arial">network</font>
- </font></li>
-</ul>
-<blockquote>
- <p><u><font face="Arial">C:\Photos\cat.jpg</font> </u></p>
-</blockquote>
-<h5><b><font face="Arial" color="#669900" size="3">To create a link ...</font></b><font size="4">
-</font></h5>
-<p><font face="Arial">Use one of the Set Link choices on the Node menu. Ctrl-k
-lets you type in a link; Ctrl-Shift-k lets you pick an item from a file browser.
-</font></p>
-<h5><font face="Arial" color="#669900" size="3">To follow a link ... </font>
-</h5>
-<p><font face="Arial">Click on it, or highlight it and use Ctrl-Enter.</font>
-</p>
-<p><font face="Arial">On a node with a link and children:</font> </p>
-<ul>
- <li><font face="Arial">Clicking at the left side opens the link </font></li>
- <li><font face="Arial">Clinking at the right side folds or unfolds the tree.</font>
- </li>
-</ul>
-<h5><font face="Arial" color="#669900" size="3">To remove a link</font> </h5>
-<p><font face="Arial">In the popup menu of a node, edit the link by the menu
-item "Node > Set Link (Textfield)" and set the link as an empty string. </font>
-</p>
-<p></p>
-<h4><font face="Arial" color="#338800" size="4">Nodes can contain images ...
-</font></h4>
-<p><font face="Arial"><img border="0" src="editno10.jpg" width="471" height="335"> </font></p>
-<p><font face="Arial">Use Set Image (Alt-k), then pick your file using the file
-chooser.</font> </p>
-<h4><b><font face="Arial">You can emulate labeled edges</font><font face="Arial" color="#338800">
-...</font></b> </h4>
-<p><font face="Arial"><img border="0" src="editno11.gif" width="159" height="123"> </font></p>
-<p><font face="Arial">Just add a node with a small label.</font> </p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editsearch.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editsearch.htm
deleted file mode 100644
index 69e4f23..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/editsearch.htm
+++ /dev/null
@@ -1,38 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Searching</title>
-</head>
-
-<body>
-
-<h2><font color="#669900" face="Arial">Searching </font></h2>
-<ul>
- <li><font face="Arial">Popup > Node > Find, or </font></li>
- <li><font face="Arial">Ctrl + F </font></li>
-</ul>
-<blockquote>
- <blockquote>
- <p><font face="Arial">Find the first occurrence of a string in the subtree
- of active node. </font></p>
- </blockquote>
-</blockquote>
-<ul>
- <li><font face="Arial">Popup > Node > Find Next , or</font></li>
- <li><font face="Arial">Ctrl + G </font></li>
-</ul>
-<blockquote>
- <blockquote>
- <p><font face="Arial">Find the next match of previous search </font></p>
- </blockquote>
-</blockquote>
-<p><font face="Arial">The search is breadth-first search. That corresponds to
-the idea that the deeper the node, the greater the detail described. </font></p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/exim.h1.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/exim.h1.gif
deleted file mode 100644
index e15917a..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/exim.h1.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/exim.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/exim.htm
deleted file mode 100644
index 2014c9f..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/exim.htm
+++ /dev/null
@@ -1,73 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Exporting and importing data</title>
-<style>
-<!--
- span.l { color: red; font-weight: bold; }
-
--->
-</style>
-</head>
-
-<body>
-
-<h2><font color="#008000" face="Arial">Exporting and importing</font></h2>
-<h3><font color="#008000" face="Arial">Exporting into HTML</font></h3>
-<p><font face="Arial">It is possible to export an entire mindmap or just a
-branch to HTML. </font></p>
-<ul>
- <li><font face="Arial">To export the entire map, click on File, then Export to
- HTML.</font></li>
- <li><font face="Arial">To export a single branch, right-click on the node,
- choose Branch, then choose either Export Branch to HTML. </font></li>
-</ul>
-<p><font face="Arial">The HTML page may contain folding, as set in the Edit /
-Preferences menu.</font></p>
-<ul>
- <li><font face="Arial">Folding works in Explorer as well as in Mozilla (both
- Windows and Linux) </font></li>
- <li><font face="Arial">Folding does not work in Netscape 4.7 </font></li>
-</ul>
-<h3><font color="#008000" face="Arial">Importing a folder structure</font></h3>
-<p><font face="Arial">To import a folder structure into Freeplane, use click on
-the node, choose Branch, then choose Import Folder Structure. You will be asked
-for the folder whose structure you want to import. By structure we mean the tree
-of all, and not necessary direct, subfolders with the links to the files in
-these subfolders. An example of inserted structure follows. </font></p>
-<p><font face="Arial"><img border="0" src="exim.h1.gif" width="261" height="63"></font></p>
-<h3><font color="#008000" face="Arial">Importing MS Internet Explorer favorites
-</font></h3>
-<p><font face="Arial">To import MS Explorer favorites into Freeplane, click on
-the node, choose Branch, then choose Import Explorer Favorites. You'll be asked
-to enter the path to the folder where the favorites are stored. The folder's
-name is "Favorites" and you can find it on your disk. On Windows 2000, the path
-is C:\Documents and Settings\<user>\Favorites. </font></p>
-<h3><font color="#008000" face="Arial">Integration with Microsoft tools like
-Word or Outlook </font></h3>
-<p><font face="Arial">You can paste maps or branches into MS Works, MS Wordpad
-or MS Outlook messages. In general, you can paste it into any application that
-understands RTF - rich text format. The text formatting and links are pasted,
-too. </font></p>
-<ul>
- <li><font face="Arial"> Clicking a mail link (mailto:dan.polansky at seznam.cz)
- will open Outlook for creating a new message </font></li>
-</ul>
-<blockquote>
- <p><font face="Arial">(if not set otherwise in Windows)</font></p>
-</blockquote>
-<ul>
- <li><font face="Arial">
- <a href="mailto:dan.polansky at seznam.cz?subject=Thank you for the Freeplane" target="_blank" style="text-decoration: none">
- You can use a subject in the mail link </a><br>
- The format is:<br>
- mailto:user at domain.com?subject:=Your subject here</font></li>
-</ul>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/fmlogosm.JPG b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/fmlogosm.JPG
deleted file mode 100644
index 5e990cc..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/fmlogosm.JPG and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/freeplane.hs b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/freeplane.hs
deleted file mode 100644
index 1e501a8..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/freeplane.hs
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE helpset PUBLIC "-//Sun Microsystems Inc.//DTD JavaHelp HelpSet Version 1.0//EN" "http://java.sun.com/products/javahelp/helpset_1_0.dtd"><!--generated by JHelpDev Version: 0.27-03/03/04, see jhelpdev.sourceforge.org-->
-
-<helpset version="1.0">
- <title>
-Freeplane Help
- </title>
- <maps>
- <homeID>
-top
- </homeID>
- <mapref location="Map.jhm"/>
-
- </maps>
- <view>
- <name>
-TOC
- </name>
- <label>
-TOC
- </label>
- <type>
-javax.help.TOCView
- </type>
- <data>
-FreeplaneTOC.xml
- </data>
- </view>
- <view>
- <name>
-Index
- </name>
- <label>
-Index
- </label>
- <type>
-javax.help.IndexView
- </type>
- <data>
-FreeplaneIndex.xml
- </data>
- </view>
- <view>
- <name>
-Search
- </name>
- <label>
-Search
- </label>
- <type>
-javax.help.SearchView
- </type>
- <data engine="com.sun.java.help.search.DefaultSearchEngine">
-JavaHelpSearch
- </data>
- </view>
-</helpset>
\ No newline at end of file
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/homepage.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/homepage.htm
deleted file mode 100644
index 480fd6c..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/homepage.htm
+++ /dev/null
@@ -1,28 +0,0 @@
-<html>
-
-<head>
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Home Page</title>
-<style>
-<!--
- span.l { color: red; font-weight: bold; }
-
--->
-</style>
-</head>
-
-<body>
-
-<h2><font color="#669900" face="Arial">Home page</font></h2>
-<p><font face="Arial"><a href="http://freeplane.sourceforge.net">Home page of
-Freeplane </a></font></p>
-<p><font face="Arial">There's a
-<a href="http://freeplane.freezope.org/FreeplaneWiki/FrontPage">Wiki</a> for
-Freeplane that offers lots of good tips and discussion. In particular, see
-the <a href="http://freeplane.freezope.org/FreeplaneWiki/WikiFreeplaneFAQ">FAQ</a>.</font></p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/install.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/install.htm
deleted file mode 100644
index 261c728..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/install.htm
+++ /dev/null
@@ -1,37 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<title>Installation</title>
-</head>
-
-<body>
-
-<h2><font face="Arial" color="#008000">Installation</font></h2>
-<p><font face="Arial" color="#008000">Download </font></p>
-<ol>
- <li><font face="Arial"><a href="http://java.sun.com/j2se">Download the Java
- Runtime Environment. </a>You need at least J2RE1.4! </font></li>
- <li><font face="Arial"><a href="http://freeplane.sourceforge.net/#h3_0">
- Download the Application </a></font></li>
-</ol>
-<p><font face="Arial" color="#008000">Installation </font></p>
-<ol>
- <li><font face="Arial">Install Java.</font></li>
- <li><font face="Arial">Unpack Freeplane.</font></li>
- <li><font face="Arial">On Windows, run Freeplane.exe; you'll probably want to
- create a folder called freeplane in "c:\Program Files\" and copy the contents
- of unpacked directory there. If you want, create shortcut of Freeplane.exe on
- your desktop. </font></li>
- <li><font face="Arial">On Unix, run freeplane.sh. </font></li>
-</ol>
-<p><font face="Arial"> On both Windows and Mac OS X, you can
-also simply double click the file freeplane.jar located at the folder lib to
-execute the program. </li>
-</font></p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/manifest.mf b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/manifest.mf
deleted file mode 100644
index 763b061..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/manifest.mf
+++ /dev/null
@@ -1,4 +0,0 @@
-Main-Class: sunw.demo.jhdemo.Runner
-Run-Class: sunw.demo.jhdemo.JHLauncher
-Class-Path: hsviewer.jar jhall.jar doc
-Arguments: -helpset .doc/freemind.hs
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/mapsample.jpg b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/mapsample.jpg
deleted file mode 100644
index 9a8c511..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/mapsample.jpg and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/patterns.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/patterns.htm
deleted file mode 100644
index f5c3835..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/patterns.htm
+++ /dev/null
@@ -1,82 +0,0 @@
-<html>
-
-<head>
-<meta name="VI60_defaultClientScript" content="JavaScript">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Physical style</title>
-</head>
-
-<body>
-
-<h2><b><font color="#008000" face="Arial">Physical style - patterns</font></b>
-</h2>
-<p><font face="Arial">There is a set of physical styles, also called patterns.
-Most patterns encompass typeface variations, such as style, font and size. But
-patterns can also be designed to include links to images, files, programs, etc.</font></p>
-<p><font face="Arial">You can apply a pattern to a node in one of two ways.</font></p>
-<ul>
- <li><font face="Arial">Right-click on the node, pick Physical Style from the
- node menu, then choose the pattern you want.</font></li>
- <li><font face="Arial">Select a node, and use the keyboard shortcut to apply a
- particular pattern.</font></li>
-</ul>
-<blockquote>
- <p><font face="Arial">The default keyboard shortcuts are:<br>
- </font><font face="Arial" size="2"> apply pattern 1 = F1<br>
- apply pattern 2 = Ctrl+Shift+N<br>
- apply pattern 3 = F3<br>
- apply pattern 4 = F4<br>
- apply pattern 5 = F5<br>
- apply pattern 6 = F6<br>
- apply pattern 7 = F7<br>
- apply pattern 8 = F8<br>
- apply pattern 9 = F9<br>
- apply pattern 10 = Ctrl+F1<br>
- apply pattern 11 = Ctrl+F2<br>
- apply pattern 12 = Ctrl+F3<br>
- apply pattern 13 = Ctrl+F4<br>
- apply pattern 14 = Ctrl+F5<br>
- apply pattern 15 = Ctrl+F6<br>
- apply pattern 16 = Ctrl+F7<br>
- apply pattern 17 = Ctrl+F8<br>
- apply pattern 18 = Ctrl+F9</font></p>
- <p><font face="Arial" size="2">The shortcuts may be edited in the
- <a href="customuser.htm">user.properties</a> file.</font></p>
-</blockquote>
-<p><font face="Arial">You can create or change patterns by editing "patterns.xml",
-located in the folder "freeplane" in your home directory. Pattern applies to a
-node, if there is a <node> tag; it applies to an edge, if there is an <edge>
-tag. </font></p>
-<p><font face="Arial">A typical pattern in patterns.xml looks like this:</font></p>
-<pre><font size="3"><pattern name="Folder">
- <node color="#CC9900">
- <font NAME="Arial" size="14" />
- </node>
-</pattern></font></pre>
-<p><font face="Arial">Note that the <node> tag has the <font> tag as a child.
-The <font> tag itself is terminated by the "/" at the end.</font></p>
-<p><font face="Arial">You can have a simple pattern that only changes the color:</font></p>
-<pre><font size="3"><pattern name="Purple">
- <node color="#993399"/>
-</pattern></font></pre>
-<p><font face="Arial">Or, the tag can included imbedded links. In this case,
-it's necessary to use the "&" codes for special HTML characters. The following
-example loads the node with a graphic that has been stored in Freeplane's images
-directory.</font></p>
-<pre><font size="3"><pattern name="Question mark">
- <node TEXT="<html><img src="file:///C:/Program Files/Freeplane/Images/question.gif"></html> ">
- <font NAME="Default" SIZE="14"/>
- </node>
-</pattern></font></pre>
-<p><font face="Arial"><i>Be aware that the use of the "text" attribute, whether
-to insert actual text or HTML code, will completely overwrite any text that was
-already in that node.</i></font></p>
-<p><font face="Arial">If you're using the shortcut keys, remember that the
-patterns are numbered simply according to their sequence in the list. So if you
-add or delete a pattern in the middle, the numbering will change.</font></p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/picture(png).jpg b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/picture(png).jpg
deleted file mode 100644
index 988530e..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/picture(png).jpg and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/pixhtml.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/pixhtml.htm
deleted file mode 100644
index b926acf..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/pixhtml.htm
+++ /dev/null
@@ -1,38 +0,0 @@
-<html>
-
-<head>
-<meta content="Microsoft FrontPage 5.0" name="GENERATOR">
-<meta content="FrontPage.Editor.Document" name="ProgId">
-<meta content="text/html; charset=windows-1252" http-equiv="Content-Type">
-<title>Pictures and HTML in nodes</title>
-</head>
-
-<body>
-
-<h2><font color="#669900" face="Arial">Pictures and HTML in nodes </font></h2>
-<p><font face="Arial">An easy way to insert pictures into Freeplane is by using
-Node / Set Image in the right-click popup menu (or Alt+K). </font></p>
-<p><font face="Arial">However, pictures in Freeplane are a preliminary feature:
-</font></p>
-<ul>
- <li><font face="Arial">You lose all the text you had in the node. </font></li>
- <li><font face="Arial">Pictures may overlap the text of nodes above them.
- </font></li>
- <li><font face="Arial">Images are not correctly pasted outside Freeplane and
- they may not be correctly exported to HTML. </font></li>
-</ul>
-<p><font face="Arial">If a node contains a link to an image, you can replace the
-contents of the node with the image by using the Set Image function. You can
-drag and drop several image files into Freeplane, select them as multiple nodes,
-and them turn them into images in one step by choosing Set Image. </font></p>
-<p><font color="#000000" face="Arial">A more technical and not-so-user-friendly
-way to put pictures in the nodes is by including the HTML. You have to start the
-node content with the tag <html>. </font></p>
-<p><font face="Arial">E.g.: </font></p>
-<ul>
- <li><font face="Arial"><html><img src="linked/Apple.png"> </font></li>
-</ul>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/prefs.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/prefs.htm
deleted file mode 100644
index 7232a0e..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/prefs.htm
+++ /dev/null
@@ -1,28 +0,0 @@
-<html>
-
-<head>
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Setting preferences</title>
-</head>
-
-<body>
-
-<h2><font face="Arial" color="#669900">Preferences</font></h2>
-<p><font face="Arial">Only a small subset of preferences is editable using the
-graphical interface; you can change them in the Edit / Preferences. At this
-time, the following preferences can be changed: </font></p>
-<ul>
- <li><font face="Arial">You can set full antialiasing (smoothing) or
- antialiasing of edges only. Antialiasing of edges is the default option.
- </font></li>
- <li><font face="Arial">You can set a kind of HTML export. </font></li>
-</ul>
-<p><font face="Arial">Other preferences can be changed by more technical users
-in <a href="customuser.htm">user.properties</a>, which you have to copy into the
-folder freeplane in your home folder. </font></p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/print.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/print.htm
deleted file mode 100644
index acbe233..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/print.htm
+++ /dev/null
@@ -1,33 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Printing your maps</title>
-</head>
-
-<body>
-
-<h2><font color="#669900" face="Arial">Printing </font></h2>
-<p><font face="Arial">You can print either by fitting the whole map into one
-page, or by printing the map to several sheets of paper. You can set this choice
-in the File menu, under Page Setup. </font></p>
-<p><font face="Arial">Choosing the landscape option usually looks better and
-makes better use of space.</font></p>
-<p><font face="Arial">If you want to preview your map before you print it and
-have a PostScript printer or generic PostScript driver, you can print the map
-into a file and view the PostScript file view with Ghostview or similar
-software. </font></p>
-<p><font face="Arial">Beware that if you try to print to a file with a printer
-that does not understand PostScript, the resulting file will not be PostsSript
-but probably PCL, which is unusable for you.</font></p>
-<p><font face="Arial">You can also print from your browser after exporting a map
-to HTML, or from Word or Wordpad after copying and pasting the map into it. You
-can also export the map into HTML with headings, copy and paste it into MS Word
-and print it from there. That way you can change styles as you want. </font></p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/screen.html b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/screen.html
deleted file mode 100644
index 873b215..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/screen.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!doctype HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html lang="en">
-
-<head>
-<!--Serif PagePlus 9 HTML Export-->
-<!--Supports HTML 4.0-->
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<meta name="Generator" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<title>Freeplane screenshot</title>
-<style type="text/css">
-<!--
-body {margin: 0px; padding: 0px;}
-.Normal-P
- {
- margin:0.0px 0.0px 0.0px 0.0px; text-align:left;
- }
-.PPStyle0-C
- {
- font-family:Arial, sans-serif; font-size:48.0px; color:#008000;
- }
-.PPStyle1-C
- {
- font-family:Arial, sans-serif; font-size:16.0px;
- }
--->
-</style>
-</head>
-
-<body bgcolor="#ffffff" link="#0000ff" vlink="#800080" text="#000000">
-
-<div style="position:absolute; left:54; top:34; width:565; height:110;">
- <h2><font color="#669900" face="Arial">The Freeplane window</font></h2>
- <p><font face="Arial">Here are key elements of the Freeplane interface. Note
- that the two top toolbars have been undocked to provide a better fit on the
- screen.</font></div>
-<div style="position:absolute; left:52px; top:180px; width:611px; height:458px;">
- <font face="Arial">
- <img src="picture(png).jpg" border="0" title alt="picture(png).jpg" width="611" height="458"></font><p>
- <font color="#669900" face="Arial"></font>
-</div>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/style.css b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/style.css
deleted file mode 100644
index 698d29e..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/style.css
+++ /dev/null
@@ -1,17 +0,0 @@
-p.standard{color:#000000; font-size:12pt; margin-top:6pt; font-family:Arial,Sans-Serif; background-color:#ffffff; }
-p.heading3{margin-bottom:3pt; font-size:12pt; font-family:Arial,Sans-Serif; color:#000000; text-align:left; margin-top:12pt; background-color:#ffffff; font-weight:bold; text-decoration:none; font-style:normal; }
-p.heading2{margin-bottom:3pt; font-size:14pt; font-family:Arial,Sans-Serif; color:#000000; text-align:left; background-color:#ffffff; margin-top:15pt; font-weight:bold; text-decoration:none; font-style:normal; }
-p.heading1{margin-bottom:6pt; font-size:18pt; font-family:Arial,Sans-Serif; color:#000000; text-align:left; background-color:#ffffff; margin-top:18pt; font-weight:bold; text-decoration:none; font-style:normal; }
-tr{}
-p{font-size:12pt; font-family:Arial,Sans-Serif; color:#000000; margin-top:6pt; }
-ul{list-style-position:outside; font-size:12pt; font-family:Arial,Sans-Serif; margin-top:6pt; margin-left:30pt; }
-ol{list-style-position:outside; font-size:12pt; font-family:Arial,Sans-Serif; margin-top:6pt; margin-left:30pt; }
-li{margin-top:0; }
-p.table{font-size:12pt; font-family:Arial,Sans-Serif; margin-top:0pt; margin-bottom:0pt; }
-table{width:80%; }
-td{text-align:left; border-left-width:0pt; border-bottom-width:0pt; padding-right:4pt; margin-right:1pt; background-color:#dcdcdb; padding-bottom:2pt; padding-top:0pt; border-top-width:0pt; border-right-width:0pt; padding-left:4pt; vertical-align:top; margin-left:1pt; border-style:solid; margin-bottom:1pt; margin-top:1pt; }
-p.standard_bold{font-size:12pt; font-family:Arial,Sans-Serif; color:#000000; text-align:left; background-color:#ffffff; font-weight:bold; text-decoration:none; font-style:normal; }
-p.code{font-size:12pt; font-family:Monospaced; color:#000000; text-align:left; margin-top:6pt; background-color:#ffffff; font-weight:normal; text-decoration:none; font-style:normal; }
-a{color:blue; text-decoration:underline; }
-p.image_subtitle{font-size:12pt; font-family:Arial,Sans-Serif; color:#000000; text-align:center; margin-top:6pt; background-color:#ffffff; font-weight:normal; text-decoration:none; font-style:italic; }
-default{}
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/tips.h1.gif b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/tips.h1.gif
deleted file mode 100644
index c813e70..0000000
Binary files a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/tips.h1.gif and /dev/null differ
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/tips.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/tips.htm
deleted file mode 100644
index 5240448..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/tips.htm
+++ /dev/null
@@ -1,82 +0,0 @@
-<html>
-
-<head>
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Tips for using Freeplane</title>
-<style>
-<!--
- span.l { color: red; font-weight: bold; }
-
--->
-</style>
-</head>
-
-<body>
-
-<h2><font color="#669900" face="Arial">Tips</font></h2>
-</li>
-<h3><font color="#669900" face="Arial">Graphical links</font></h3>
-<ul>
- <li><font face="Arial">You can create graphical links between two nodes, like
- this:</font></li>
-</ul>
-<p><font face="Arial"><img border="0" src="tips.h1.gif" width="551" height="113"><br>
-To do so, mark a node and drag to another node holding both shift and control
-keys, and releasing the mouse button first.</li> </font></p>
-<ul>
- <li><font face="Arial">You can edit some properties of this link by
- right-clicking on the line between them. </font></li>
- <li><font face="Arial">You may choose the color and the arrow positions.
- </font></li>
- <li><font face="Arial">Go directly to one of the nodes (even if it's folded)
- by using the link in the right-click menu. </font></li>
-</ul>
-<h4><font color="#669900" face="Arial">File locking</font></h4>
-<p><font face="Arial">The current version of Freeplane has experimental file
-locking, which is disabled by default. The current implementation (0.7.1) does
-not really prevent race conditions, but it should be fine for the most practical
-purposes. What does file locking mean? It makes sure that multiple users do not
-edit the same map at the same time, preventing them from accidentally
-overwriting each other's information. </font></p>
-<p><font face="Arial">You can enable experimental file locking if you are a
-technical user and are willing to edit user.properties, as described in
-<a href="customize.htm">Customizing Freeplane</a>. </font></p>
-<h4><font color="#669900" face="Arial">Browsing mind maps</font></h4>
-<p><font face="Arial">You can browse the mindmaps in browse mode. Why is there a
-separate mode for browsing? That's because browsing is the only thing you can do
-in the Freeplane applet, which can be put to your website. Normally, you would
-not use browse mode in Freeplane. </font></p>
-<h4><font color="#669900" face="Arial">Browsing the files on your computer
-</font></h4>
-<p><font face="Arial">You can browse the files on your computer using file mode.
-To enter file mode, in menu: Modes > File. </font></p>
-<p><font face="Arial">You can then browse the file tree as if it was a mindmap.
-You can make any folder the root of the map by chosing "Center" from the node
-menu. To view or execute a file, follow the link of the node. </font></p>
-<p><font face="Arial">The file mode is currently not very useful; it is a
-demonstration that it's not too difficult to feed data into the tree from other
-source than the mindmap. There is no evidence that people would really use this
-mode. </li>
-</font></p>
-<h4><font color="#669900" face="Arial">There is a concept of mode in Freeplane
-</font></h4>
-<p><font face="Arial">Although Freeplane is primarily a tool for editing mindmaps,
-it is designed to be able to view data coming from different data sources. To
-make a specific data source available for viewing in Freeplane, a programmer has
-to write a so-called mode for that data source. In the standard, there is an
-example of such a mode, namely file mode. We do not know of any other modes
-implemented. It is not clear if anyone would really want to make use of this
-architecture, but it's here to be exploited if someone wants to. </font></p>
-<p><font face="Arial">Furthermore, there is code almost ready for Scheme Mode
-which enables you to edit scheme programs. Again, the usefulness is far from
-clear. While the mindmap mode is clearly a real thing, other modes seem to be
-more a demonstration of what is possible than something really used by people.
-</li>
-</li>
-</font></p>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/welcome.htm b/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/welcome.htm
deleted file mode 100644
index e3a52f3..0000000
--- a/freeplane_plugin_help/resources/org/freeplane/plugin/help/doc/welcome.htm
+++ /dev/null
@@ -1,74 +0,0 @@
-<html>
-
-<head>
-<meta http-equiv="Content-Language" content="en-us">
-<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
-<meta name="ProgId" content="FrontPage.Editor.Document">
-<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
-<title>Welcome to Freeplane</title>
-</head>
-
-<body>
-
-<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111" width="505" id="AutoNumber1">
- <tr>
- <td width="340">
- <h4><font face="Arial" color="#008000"> </font></h4>
- <h1><font face="Arial" color="#008000">Welcome to Freeplane</font></h1>
- </td>
- <td width="165">
- <h1><img border="0" src="fmlogosm.JPG" width="132" height="70"></h1>
- </td>
- </tr>
-</table>
-<p><font face="Arial">Freeplane is a premier, free mind-mapping program written
-in Java.</font></p>
-<p><font face="Arial">Freeplane will let you organize your ideas as a "mindmap,"
-a graphical structure of nodes and branches (or edges) attached to a central
-"root" node.</font></p>
-<p><font face="Arial">For a quick look at a fully developed mindmap, click
-<a href="samplepage.htm">here</a><a href="http://freeplane.sourceforge.net/Freeplane-computer-knowledge.png">.</a></font></p>
-<p><font face="Arial">Want to write a completely new metaphysics? Why don't you
-use Freeplane? You have a tool at hand that remarkably resembles the tray slips
-Robert Pirsig described in "Lila," his sequel to "Zen and the Art of Motorcycle
-Maintenance." Do you want to refactor your essays as you would refactor
-software? Or do you want to keep an easily managed personal knowledge base? Why
-don't you try Freeplane?</font></p>
-<p><font face="Arial">You can easily create, move and format nodes and edges.
-Features include:</font></p>
-<li><font face="Arial">Easy control of <b>folding, </b>or the ability to display
-or hide all information below a selected node. This is the essential property of
-Freeplane. </font></li>
-<li><font face="Arial"><b>Fast one-click navigation</b>, including folding /
-unfolding with one click and following links with one click at the same time
-(you don't have to make choice between fast following of links and fast
-fold/unfold). You can move the map by dragging the map's background as well as
-using mouse wheel. </font></li>
-<li><font face="Arial">Fully functional <b>following of HTML links</b> stored in
-the nodes, be they WWW links or links to local files. </font></li>
-<li><font face="Arial"><b>Smart Drag and Drop</b>, including the ability to copy
-nodes or copy the style of nodes; dragging and dropping of multiple selected
-nodes; dropping of text or lists of files from outside.</font></li>
-<li><font face="Arial"><b>Smart copying and pasting into</b>, including pasting
-of links from HTML or structuring the pasted content on the basis of the number
-of leading spaces in a line; pasting of lists of selected files.</font></li>
-<li><font face="Arial"><b>Smart copying and pasting from</b>, including plain
-text and RTF (MS Wordpad, MS Word, MS Outlook messages). </font></li>
-<li><font face="Arial"><b>Export of your map to HTML</b>, with folding. </font>
-</li>
-<li><font face="Arial"><b>Find</b> facility, where found items are shown one by
-one as you do "find next", and the map is unfolded only for the current item.
-</font></li>
-<li><font face="Arial"><b>Short nodes, </b>or <b>long multiline nodes</b> with
-line breaks. </font></li>
-<li><font face="Arial">The option to decorate nodes with <b>built-in icons</b>,
-colors and different fonts. </font></li>
-<li><font face="Arial"><b>Low cost of switching away</b> to another mind-mapping
-tool, because Freeplane stores maps in <b>XML</b> format. </font></li>
-<li><font face="Arial">File mode enables you to <b>browse the files on your
-computer</b>, <b>seeing</b> the folder structure <b>as a mindmap</b>.</font></li>
-<p><font face="Arial">Read on to learn the details.</font></li>
-
-</body>
-
-</html>
diff --git a/freeplane_plugin_help/src/org/freeplane/plugin/help/Activator.java b/freeplane_plugin_help/src/org/freeplane/plugin/help/Activator.java
deleted file mode 100644
index fd1553b..0000000
--- a/freeplane_plugin_help/src/org/freeplane/plugin/help/Activator.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package org.freeplane.plugin.help;
-
-import java.util.Hashtable;
-
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.main.osgi.IModeControllerExtensionProvider;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class Activator implements BundleActivator {
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- public void start(final BundleContext context) throws Exception {
- final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
- props.put("mode", new String[] { MModeController.MODENAME });
- context.registerService(IModeControllerExtensionProvider.class.getName(),
- new IModeControllerExtensionProvider() {
- public void installExtension(ModeController modeController) {
- modeController.addAction(new FreeplaneHelpStarter());
- }
- }, props);
- }
-
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- public void stop(final BundleContext context) throws Exception {
- }
-}
diff --git a/freeplane_plugin_help/src/org/freeplane/plugin/help/FreeplaneHelpStarter.java b/freeplane_plugin_help/src/org/freeplane/plugin/help/FreeplaneHelpStarter.java
deleted file mode 100644
index 821988d..0000000
--- a/freeplane_plugin_help/src/org/freeplane/plugin/help/FreeplaneHelpStarter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.help;
-
-import java.awt.event.ActionEvent;
-import java.net.URL;
-
-import javax.help.HelpBroker;
-import javax.help.HelpSet;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.LogUtils;
-
-/**
- * @author foltin
- */
-class FreeplaneHelpStarter extends AFreeplaneAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public FreeplaneHelpStarter() {
- super("FreeplaneHelpStarter");
- }
-
- /**
- *
- */
- public void actionPerformed(final ActionEvent e) {
- final String helpHS = "org/freeplane/plugin/help/doc/freeplane.hs";
- try {
- final ClassLoader classLoader = this.getClass().getClassLoader();
- final URL hsURL = HelpSet.findHelpSet(classLoader, helpHS);
- final HelpSet hs = new HelpSet(classLoader, hsURL);
- final HelpBroker hb = hs.createHelpBroker();
- hb.initPresentation();
- hb.setDisplayed(true);
- hb.setViewDisplayed(true);
- }
- catch (final Exception ee) {
- LogUtils.severe("HelpSet " + helpHS + " not found", ee);
- return;
- }
- }
-}
diff --git a/freeplane_plugin_jsyntaxpane/build.gradle b/freeplane_plugin_jsyntaxpane/build.gradle
new file mode 100644
index 0000000..4562f96
--- /dev/null
+++ b/freeplane_plugin_jsyntaxpane/build.gradle
@@ -0,0 +1,54 @@
+dependencies {
+ compile project(':freeplane')
+
+ // from flatDir "localGitDepsRepository":
+ compile ':jsyntaxpane-0.9.6~r156-5' // from the Debian "libjsyntaxpane-java" package
+}
+
+jar {
+ manifest {
+ name = pluginid
+ symbolicName = pluginid
+
+ configurations.runtime.transitive = false
+ def deps = filterAndExternalizePluginDependencies(configurations.runtime.files)
+ deps.add(0, "lib/plugin-" + project.version + '.jar')
+
+ attributes 'Class-Path': deps.join(', ')
+ attributes 'Bundle-ClassPath': '., ' + deps.join(', ')
+
+ instruction 'Bundle-Vendor', 'Freeplane Project'
+ instruction 'Bundle-Activator', pluginid + ".Activator"
+ instruction 'Bundle-RequiredExecutionEnvironment', 'JavaSE-1.6'
+
+ def imports = """\
+ org.osgi.framework;version="1.3.0",
+ org.freeplane.core.*,
+ org.freeplane.features.*,
+ org.freeplane.main.*,
+ org.freeplane.n3.*,
+ org.freeplane.view.*
+ """
+ instruction 'Import-Package', imports.replaceAll("\\s+", "")
+
+ def exports = """\
+ jsyntaxpane,
+ jsyntaxpane.lexers,
+ jsyntaxpane.syntaxkits,
+ jsyntaxpane.actions
+ """
+ // bnd f**cks up the exports, so we bypass it using attributes!
+ attributes 'Export-Package': exports.replaceAll("\\s+", "")
+
+ // Require-Bundle is ignored by bnd => replaced by Import-Package!
+ //instruction 'Require-Bundle', 'org.freeplane.core;bundle-version="1.0.1", org.freeplane.plugin.script;bundle-version="1.0.1"'
+ }
+}
+
+task generateLaTeXLexer(type: Exec) {
+ onlyIf { !file('src/main/java/jsyntaxpane/lexers/LaTeXLexer.java').exists() }
+
+ commandLine 'jflex', '-d', 'src/main/java/jsyntaxpane/lexers/', 'src/main/java/jsyntaxpane/lexers/latex.flex'
+}
+
+compileJava.dependsOn generateLaTeXLexer
diff --git a/freeplane_plugin_script/src-jsyntaxpane/jsyntaxpane/lexers/latex.flex b/freeplane_plugin_jsyntaxpane/src/main/java/jsyntaxpane/lexers/latex.flex
similarity index 100%
rename from freeplane_plugin_script/src-jsyntaxpane/jsyntaxpane/lexers/latex.flex
rename to freeplane_plugin_jsyntaxpane/src/main/java/jsyntaxpane/lexers/latex.flex
diff --git a/freeplane_plugin_script/src-jsyntaxpane/jsyntaxpane/syntaxkits/LaTeXSyntaxKit.java b/freeplane_plugin_jsyntaxpane/src/main/java/jsyntaxpane/syntaxkits/LaTeXSyntaxKit.java
similarity index 100%
rename from freeplane_plugin_script/src-jsyntaxpane/jsyntaxpane/syntaxkits/LaTeXSyntaxKit.java
rename to freeplane_plugin_jsyntaxpane/src/main/java/jsyntaxpane/syntaxkits/LaTeXSyntaxKit.java
diff --git a/freeplane_plugin_jsyntaxpane/src/main/java/org/freeplane/plugin/jsyntaxpane/Activator.java b/freeplane_plugin_jsyntaxpane/src/main/java/org/freeplane/plugin/jsyntaxpane/Activator.java
new file mode 100644
index 0000000..fbdfac6
--- /dev/null
+++ b/freeplane_plugin_jsyntaxpane/src/main/java/org/freeplane/plugin/jsyntaxpane/Activator.java
@@ -0,0 +1,54 @@
+package org.freeplane.plugin.jsyntaxpane;
+
+import java.util.Hashtable;
+
+import jsyntaxpane.DefaultSyntaxKit;
+import jsyntaxpane.syntaxkits.GroovySyntaxKit;
+
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.main.osgi.IModeControllerExtensionProvider;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(final BundleContext context) throws Exception {
+ final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
+ props.put("mode", new String[] { MModeController.MODENAME });
+ context.registerService(IModeControllerExtensionProvider.class.getName(),
+ new IModeControllerExtensionProvider() {
+ public void installExtension(ModeController modeController) {
+ if(! modeController.getController().getViewController().isHeadless())
+ initJSyntaxPane(context);
+ //new ScriptingRegistration(modeController);
+ }
+ }, props);
+ }
+
+ private void initJSyntaxPane(BundleContext context) {
+ final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(DefaultSyntaxKit.class.getClassLoader());
+ DefaultSyntaxKit.initKit();
+ final String components = "jsyntaxpane.components.PairsMarker" //
+ + ", jsyntaxpane.components.LineNumbersRuler" //
+ + ", jsyntaxpane.components.TokenMarker" //
+ + ", org.freeplane.plugin.jsyntaxpane.NodeIdHighLighter";
+ new GroovySyntaxKit().setProperty("Components", components);
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ }
+}
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(final BundleContext context) throws Exception {
+ }
+}
diff --git a/freeplane_plugin_jsyntaxpane/src/main/java/org/freeplane/plugin/jsyntaxpane/NodeIdHighLighter.java b/freeplane_plugin_jsyntaxpane/src/main/java/org/freeplane/plugin/jsyntaxpane/NodeIdHighLighter.java
new file mode 100644
index 0000000..a0375cd
--- /dev/null
+++ b/freeplane_plugin_jsyntaxpane/src/main/java/org/freeplane/plugin/jsyntaxpane/NodeIdHighLighter.java
@@ -0,0 +1,179 @@
+package org.freeplane.plugin.jsyntaxpane;
+
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.beans.PropertyChangeEvent;
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.swing.JEditorPane;
+import javax.swing.SwingUtilities;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+
+import jsyntaxpane.SyntaxDocument;
+import jsyntaxpane.Token;
+import jsyntaxpane.actions.ActionUtils;
+import jsyntaxpane.components.SyntaxComponent;
+import jsyntaxpane.util.Configuration;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+public class NodeIdHighLighter implements SyntaxComponent, CaretListener {
+ private final Pattern nodeIdPattern = Pattern.compile("(ID_\\d+)|(\"ID_\\d+\")");
+ private JEditorPane pane;
+ private Status status;
+ private ArrayList<NodeModel> nodesOriginallyFolded = new ArrayList<NodeModel>(50);
+ private NodeModel originallySelectedNode = null;
+
+ /** remove as soon as SyntaxComponent has it in the JDK5 version. */
+ private static enum Status {
+ INSTALLING,
+ DEINSTALLING
+ }
+
+ public void caretUpdate(CaretEvent e) {
+ handle(e.getDot());
+ }
+
+ public void handle(int pos) {
+ SyntaxDocument doc = ActionUtils.getSyntaxDocument(pane);
+ if (doc != null) {
+ try {
+ doc.readLock();
+ Token token = doc.getTokenAt(pos);
+ if (token == null || !handle(doc, token)) {
+ deHighlight();
+ }
+ }
+ finally {
+ doc.readUnlock();
+ }
+ }
+ }
+
+ private boolean handle(SyntaxDocument doc, Token token) {
+ final Matcher matcher = nodeIdPattern.matcher(token.getText(doc));
+ if (matcher.matches()) {
+ String id = matcher.group(1);
+ final NodeModel node = Controller.getCurrentController().getMap().getNodeForID(id);
+ if (node != null) {
+ final MapController mapController = Controller.getCurrentModeController().getMapController();
+ final NodeModel selectedNode = mapController.getSelectedNode();
+ if(node.equals(selectedNode)){
+ return true;
+ }
+ NodeModel originallySelectedNode = this.originallySelectedNode;
+ if (originallySelectedNode == null)
+ originallySelectedNode = mapController.getSelectedNode();
+ else{
+ deHighlight();
+ }
+ this.originallySelectedNode = originallySelectedNode;
+ mapController.displayNode(node, nodesOriginallyFolded);
+ mapController.select(node);
+ pane.setToolTipText(node.getText());
+ return true;
+ }
+ else {
+ pane.setToolTipText("<html><body bgcolor='#CC0000'>" //
+ + TextUtils.format(getResourceKey("node_is_not_defined"), id) + "</body></html>");
+ }
+ }
+ else{
+ deHighlight();
+ }
+ return false;
+ }
+
+ public void deHighlight() {
+ if (originallySelectedNode == null)
+ return;
+ final Controller controller = Controller.getCurrentController();
+ if (controller == null)
+ return;
+ final MapController mapController = controller.getModeController().getMapController();
+ mapController.displayNode(originallySelectedNode);
+ mapController.select(originallySelectedNode);
+ foldOriginallyFolded(mapController);
+ originallySelectedNode = null;
+ pane.setToolTipText(null);
+ }
+
+ private void foldOriginallyFolded(final MapController mapController) {
+ final int countNodesOriginallyUnfolded = nodesOriginallyFolded.size();
+ if (countNodesOriginallyUnfolded > 0) {
+ for (int i = countNodesOriginallyUnfolded - 1; i >= 0; i--)
+ mapController.setFolded(nodesOriginallyFolded.get(i), true);
+ nodesOriginallyFolded.clear();
+ }
+ }
+
+ public void config(Configuration config) {
+ }
+
+ public void install(JEditorPane editor) {
+ this.pane = editor;
+ pane.addCaretListener(this);
+ handle(editor.getCaretPosition());
+ status = Status.INSTALLING;
+ addWindowListener();
+// addFocusListener();
+ }
+ private void addWindowListener() {
+ pane.addFocusListener(new FocusAdapter() {
+ @Override
+ public void focusGained(FocusEvent e) {
+ e.getComponent().removeFocusListener(this);
+ SwingUtilities.getWindowAncestor(pane).addWindowListener(new WindowAdapter(){
+ @Override
+ public void windowClosed(WindowEvent e) {
+ e.getWindow().removeWindowListener(this);
+ deHighlight();
+ }
+ });
+ }
+ });
+ }
+
+// private void addFocusListener() {
+// class NodeIdHighLightFocusListener extends FocusAdapter {
+// public void focusLost(FocusEvent e) {
+// deHighlight();
+// }
+// }
+// final FocusListener[] focusListeners = pane.getFocusListeners();
+// for (int i = 0; i < focusListeners.length; i++) {
+// if (focusListeners[i] instanceof NodeIdHighLightFocusListener) {
+// return;
+// }
+// }
+// pane.addFocusListener(new NodeIdHighLightFocusListener());
+// }
+
+ public void deinstall(JEditorPane editor) {
+ status = Status.DEINSTALLING;
+ deHighlight();
+ pane.removeCaretListener(this);
+ }
+
+ public void propertyChange(PropertyChangeEvent evt) {
+ if (evt.getPropertyName().equals("document")) {
+ pane.removeCaretListener(this);
+ if (status.equals(Status.INSTALLING)) {
+ pane.addCaretListener(this);
+ deHighlight();
+ }
+ }
+ }
+
+ public String getResourceKey(final String key) {
+ return "org.freeplane.plugin.script.NodeIdHighlighter." + key;
+ }
+}
diff --git a/freeplane_plugin_script/resources-jsyntaxpane/META-INF/services/jsyntaxpane/kitsfortypes.properties b/freeplane_plugin_jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/kitsfortypes.properties
similarity index 100%
rename from freeplane_plugin_script/resources-jsyntaxpane/META-INF/services/jsyntaxpane/kitsfortypes.properties
rename to freeplane_plugin_jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/kitsfortypes.properties
diff --git a/freeplane_plugin_script/resources-jsyntaxpane/META-INF/services/jsyntaxpane/syntaxkits/groovysyntaxkit/combocompletions.txt b/freeplane_plugin_jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/groovysyntaxkit/combocompletions.txt
similarity index 100%
rename from freeplane_plugin_script/resources-jsyntaxpane/META-INF/services/jsyntaxpane/syntaxkits/groovysyntaxkit/combocompletions.txt
rename to freeplane_plugin_jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/groovysyntaxkit/combocompletions.txt
diff --git a/freeplane_plugin_script/resources-jsyntaxpane/META-INF/services/jsyntaxpane/syntaxkits/latexsyntaxkit/config.properties b/freeplane_plugin_jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/latexsyntaxkit/config.properties
similarity index 100%
rename from freeplane_plugin_script/resources-jsyntaxpane/META-INF/services/jsyntaxpane/syntaxkits/latexsyntaxkit/config.properties
rename to freeplane_plugin_jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/latexsyntaxkit/config.properties
diff --git a/freeplane_plugin_latex/.classpath b/freeplane_plugin_latex/.classpath
deleted file mode 100644
index 1b08ac1..0000000
--- a/freeplane_plugin_latex/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="lib" path="lib/jlatexmath.jar"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_plugin_latex/.project b/freeplane_plugin_latex/.project
deleted file mode 100644
index 1ce2bf2..0000000
--- a/freeplane_plugin_latex/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_latex</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_latex/.settings/org.eclipse.core.resources.prefs b/freeplane_plugin_latex/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 02eaf6f..0000000
--- a/freeplane_plugin_latex/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:23 CET 2010
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/freeplane_plugin_latex/.settings/org.eclipse.core.runtime.prefs b/freeplane_plugin_latex/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index baab3be..0000000
--- a/freeplane_plugin_latex/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:23 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/freeplane_plugin_latex/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_latex/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 54e493c..0000000
--- a/freeplane_plugin_latex/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,11 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/freeplane_plugin_latex/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_latex/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 16a669c..0000000
--- a/freeplane_plugin_latex/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Sun Jan 04 22:58:46 CET 2009
-eclipse.preferences.version=1
-pluginProject.equinox=false
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/freeplane_plugin_latex/META-INF/MANIFEST.MF b/freeplane_plugin_latex/META-INF/MANIFEST.MF
deleted file mode 100644
index bafd45f..0000000
--- a/freeplane_plugin_latex/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,13 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.plugin.latex
-Bundle-SymbolicName: org.freeplane.plugin.latex
-Bundle-Version: 1.3.1
-Bundle-Activator: org.freeplane.plugin.latex.Activator
-Import-Package: org.freeplane.plugin.script,
- org.osgi.framework;version="1.3.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Require-Bundle: org.freeplane.core;bundle-version="1.0.1",
- org.freeplane.plugin.script;bundle-version="1.0.1"
-Bundle-ClassPath: lib/plugin.jar,
- lib/jlatexmath.jar
diff --git a/freeplane_plugin_latex/ant/ant.properties b/freeplane_plugin_latex/ant/ant.properties
deleted file mode 100644
index c7d0e39..0000000
--- a/freeplane_plugin_latex/ant/ant.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-plugin.ext.lib = lib
-jlatexmath.jar = ${plugin.ext.lib}/jlatexmath.jar
diff --git a/freeplane_plugin_latex/ant/build.xml b/freeplane_plugin_latex/ant/build.xml
deleted file mode 100644
index f773299..0000000
--- a/freeplane_plugin_latex/ant/build.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<project name="freeplane_latex" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property name="src" value="src" />
- <property name="root" value="."/>
- <property name="osgimanifest" value="${root}/META-INF/MANIFEST.MF" />
- <property name="xslt.base" value="${workspace}/freeplane/resources/xslt" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="ant/ant.properties" />
- <property name="external.jars" value="${commons-lang.jar}:${forms.jar}:${SimplyHTML.jar}:${jlatexmath.jar}" />
- <property name="build" value="${root}/build" />
- <property name="dist" value="${root}/dist" />
- <property name="dist.osgi.dir" value="${dist}/org.freeplane.plugin.latex" />
- <property name="freeplaneplugin.jar" value="${dist}/org.freeplane.plugin.latex.jar"/>
- <property name="src.pluginclass" value="${src}/org/freeplane/plugin/latex/"/>
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${framework.jar}:${freeplane.jars}:${external.jars}"/>
-
- <target name="build" depends="build-ui-xml">
- <mkdir dir="${build}" />
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- </javac>
- </target>
-
- <target name="build-ui-xml">
- <xslt in="${src.pluginclass}/preferences.mm"
- style="${xslt.base}/mm2preferences.xsl"
- out="${src.pluginclass}/preferences.xml"/>
- </target>
-
- <target name="dist" depends="build">
- <jar jarfile="lib/plugin.jar">
- <fileset dir="${build}"/>
- <fileset dir="${src}">
- <include name="**/*.xml"/>
- <include name="**/*.properties"/>
- <exclude name="**/preferences.mm" />
- </fileset>
- </jar>
- <delete dir="${dist.osgi.dir}" quiet="true"/>
- <mkdir dir="${dist.osgi.dir}" />
- <copy todir="${dist.osgi.dir}">
- <fileset dir="${root}">
- <include name="lib/**"/>
- </fileset>
- </copy>
- <mkdir dir="${dist.osgi.dir}/META-INF" />
- <copy tofile="${dist.osgi.dir}/META-INF/MANIFEST.MF" file="${osgimanifest}"/>
- <delete file="lib/plugin.jar" quiet="true"/>
- </target>
-
- <target name="osgi_dist_as_jar" depends="dist">
- <jar jarfile="${freeplaneplugin.jar}">
- <fileset dir="${dist.osgi.dir}">
- <include name="**" />
- </fileset>
- </jar>
- </target>
-
- <target name="clean">
- <delete dir="${build}" quiet="true"/>
- <delete dir="${dist}" quiet="true"/>
- <delete>
- <fileset defaultexcludes="no" dir="${src}" includes="**/*~"/>
- </delete>
- <delete file="${src.pluginclass}/preferences.xml" quiet="true"/>
- </target>
-
-</project>
-
diff --git a/freeplane_plugin_latex/build.gradle b/freeplane_plugin_latex/build.gradle
new file mode 100644
index 0000000..15cecc7
--- /dev/null
+++ b/freeplane_plugin_latex/build.gradle
@@ -0,0 +1,39 @@
+dependencies {
+ compile project(':freeplane')
+ compile project(':freeplane_plugin_jsyntaxpane')
+ compile group: 'org.scilab.forge', name: 'jlatexmath', version:'1.0.2'
+}
+
+jar {
+ manifest {
+ name = pluginid
+ symbolicName = pluginid
+
+ configurations.runtime.transitive = false
+ def deps = filterAndExternalizePluginDependencies(configurations.runtime.files)
+ deps.add(0, "lib/plugin-" + project.version + '.jar')
+
+ attributes 'Class-Path': deps.join(', ')
+ attributes 'Bundle-ClassPath': '., ' + deps.join(', ')
+
+ instruction 'Bundle-Vendor', 'Freeplane Project'
+ instruction 'Bundle-Activator', pluginid + ".Activator"
+ instruction 'Bundle-RequiredExecutionEnvironment', 'JavaSE-1.6'
+
+ def imports = """\
+ org.osgi.framework;version="1.3.0",
+ jsyntaxpane.lexers,
+ jsyntaxpane.syntaxkits,
+ org.freeplane.core.*,
+ org.freeplane.features.*,
+ org.freeplane.main.*,
+ org.freeplane.n3.*,
+ org.freeplane.view.*
+ """
+ instruction 'Import-Package', imports.replaceAll("\\s+", "")
+ instruction 'Export-Package', ''
+
+ // Require-Bundle is ignored by bnd => replaced by Import-Package!
+ //instruction 'Require-Bundle', 'org.freeplane.core;bundle-version="1.0.1", org.freeplane.plugin.script;bundle-version="1.0.1"'
+ }
+}
diff --git a/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/Activator.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/Activator.java
new file mode 100644
index 0000000..6084a59
--- /dev/null
+++ b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/Activator.java
@@ -0,0 +1,66 @@
+package org.freeplane.plugin.latex;
+
+import java.net.URL;
+import java.util.Hashtable;
+
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.browsemode.BModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.main.osgi.IModeControllerExtensionProvider;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+
+ private static final String PREFERENCES_RESOURCE = "preferences.xml";
+ static final String TOGGLE_PARSE_LATEX = "parse_latex";
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(final BundleContext context) throws Exception {
+ registerMindMapModeExtension(context);
+ registerBrowseModeExtension(context);
+ }
+
+ private void registerMindMapModeExtension(final BundleContext context) {
+ final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
+ props.put("mode", new String[] { MModeController.MODENAME });
+ context.registerService(IModeControllerExtensionProvider.class.getName(),
+ new IModeControllerExtensionProvider() {
+ public void installExtension(final ModeController modeController) {
+ new LatexRegistration();
+ addPreferencesToOptionPanel();
+ }
+
+ private void addPreferencesToOptionPanel() {
+ final URL preferences = this.getClass().getResource(PREFERENCES_RESOURCE);
+ if (preferences == null)
+ throw new RuntimeException("cannot open preferences");
+ final Controller controller = Controller.getCurrentController();
+ MModeController modeController = (MModeController) controller.getModeController();
+ modeController.getOptionPanelBuilder().load(preferences);
+ }
+ }, props);
+ }
+
+ private void registerBrowseModeExtension(final BundleContext context) {
+ final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
+ props.put("mode", new String[] { BModeController.MODENAME });
+ context.registerService(IModeControllerExtensionProvider.class.getName(),
+ new IModeControllerExtensionProvider() {
+ public void installExtension(final ModeController modeController) {
+ new LatexRegistration();
+ }
+ }, props);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(final BundleContext context) throws Exception {
+ }
+}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/DeleteLatexAction.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/DeleteLatexAction.java
similarity index 100%
rename from freeplane_plugin_latex/src/org/freeplane/plugin/latex/DeleteLatexAction.java
rename to freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/DeleteLatexAction.java
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/EditLatexAction.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/EditLatexAction.java
similarity index 100%
rename from freeplane_plugin_latex/src/org/freeplane/plugin/latex/EditLatexAction.java
rename to freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/EditLatexAction.java
diff --git a/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/InsertLatexAction.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/InsertLatexAction.java
new file mode 100644
index 0000000..a1a5cb7
--- /dev/null
+++ b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/InsertLatexAction.java
@@ -0,0 +1,88 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2010 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is created by Stefan Ott in 2011.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.latex;
+
+import java.awt.event.ActionEvent;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.SwingConstants;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.EnabledAction;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.Compat;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+
+/**
+ *
+ * @author Stefan Ott
+ *
+ *This class is called when a (legacy!) LaTeX formula is inserted into
+ * (added to) a node
+ * @see http://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane
+ */
+ at EnabledAction(checkOnNodeChange = true)
+public class InsertLatexAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+ private final LatexNodeHook nodeHook;
+
+ public InsertLatexAction(final LatexNodeHook nodeHook) {
+ super("LatexInsertLatexAction");
+ this.nodeHook = nodeHook;
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ Box box = Box.createVerticalBox();
+ final String about1 = TextUtils.getText("LatexInsertLatexAction.msg1");
+ box.add(new JLabel(about1));
+ addUriWithoutTitle(box, "LaTeX_in_freeplane_url");
+ final String about2 = TextUtils.getText("LatexInsertLatexAction.msg2");
+ box.add(new JLabel(about2));
+
+ JOptionPane.showMessageDialog(UITools.getCurrentRootComponent(), box, TextUtils
+ .getText("LatexInsertLatexAction.text"), JOptionPane.INFORMATION_MESSAGE);
+ }
+
+ private void addUriWithoutTitle(Box box, String uriProperty) {
+ try {
+ final String urlText = ResourceController.getResourceController().getProperty(uriProperty);
+ URI uri = new URI(urlText);
+ JButton uriButton = UITools.createHtmlLinkStyleButton(uri, urlText);
+ uriButton.setHorizontalAlignment(SwingConstants.LEADING);
+ box.add(uriButton);
+ } catch (URISyntaxException e1) {
+ }
+ }
+
+ @Override
+ public void setEnabled() {
+ final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
+ setEnabled(node != null && (LatexExtension) node.getExtension(LatexExtension.class) == null);
+ }
+}
diff --git a/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexEditor.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexEditor.java
new file mode 100644
index 0000000..4b5ca05
--- /dev/null
+++ b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexEditor.java
@@ -0,0 +1,39 @@
+package org.freeplane.plugin.latex;
+
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 dimitry
+ *
+ * This file author is Felix Natter (copied from FormulaEditor)
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.awt.event.KeyEvent;
+
+import javax.swing.JEditorPane;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.mindmapmode.EditNodeDialog;
+
+/**
+ * @author Felix Natter (copied from FormulaEditor)
+ */
+class LatexEditor extends EditNodeDialog {
+
+ LatexEditor(NodeModel nodeModel, String text, KeyEvent firstEvent, IEditControl editControl,
+ boolean enableSplit, JEditorPane textEditor) {
+ super(nodeModel, text, firstEvent, editControl, enableSplit, textEditor);
+ super.setModal(false);
+ }
+}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexExtension.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexExtension.java
similarity index 100%
rename from freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexExtension.java
rename to freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexExtension.java
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexFormat.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexFormat.java
similarity index 100%
rename from freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexFormat.java
rename to freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexFormat.java
diff --git a/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexNodeHook.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexNodeHook.java
new file mode 100644
index 0000000..c3844f6
--- /dev/null
+++ b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexNodeHook.java
@@ -0,0 +1,209 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.latex;
+
+import java.awt.Container;
+import java.util.Set;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.features.map.INodeView;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.features.ui.INodeViewLifeCycleListener;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.view.swing.map.NodeView;
+
+/**
+ * @author Dimitry Polivaev
+ * @file LatexNodeHook.java
+ * @package freeplane.modes.mindmapmode
+ */
+ at NodeHookDescriptor(hookName = "plugins/latex/LatexNodeHook.properties", //
+onceForMap = false)
+class LatexNodeHook extends PersistentNodeHook implements INodeViewLifeCycleListener {
+ static final int VIEWER_POSITION = 4;
+
+ /**
+ */
+ public LatexNodeHook() {
+ super();
+ final ModeController modeController = Controller.getCurrentModeController();
+ modeController.addINodeViewLifeCycleListener(this);
+ }
+
+ @Override
+ public void add(final NodeModel node, final IExtension extension) {
+ final LatexExtension latexExtension = (LatexExtension) extension;
+ for(NodeModel nodeClone : node.allClones()){
+ for (final INodeView iNodeView : nodeClone.getViewers()) {
+ final NodeView view = (NodeView) iNodeView;
+ createViewer(latexExtension, view);
+ }
+ }
+ super.add(node, extension);
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ final LatexExtension latexExtension = new LatexExtension();
+ if (element != null) {
+ final String equation = element.getAttribute("EQUATION", null);
+ if (equation == null) {
+ // error: do not create anything
+ return null;
+ }
+ latexExtension.setEquation(equation);
+ Controller.getCurrentModeController().getMapController()
+ .nodeChanged(node, NodeModel.UNKNOWN_PROPERTY, null, null);
+ }
+ return latexExtension;
+ }
+
+ @Override
+ protected HookAction createHookAction() {
+ return null;
+ }
+
+ void createViewer(final LatexExtension model, final NodeView view) {
+ final LatexViewer comp = new LatexViewer(this, model);
+ final Set<NodeView> viewers = model.getViewers();
+ viewers.add(view);
+ view.addContent(comp, VIEWER_POSITION);
+ }
+
+ void deleteViewer(final LatexExtension model, final NodeView nodeView) {
+ final Set<NodeView> viewers = model.getViewers();
+ if (!viewers.contains(nodeView)) {
+ return;
+ }
+ nodeView.removeContent(VIEWER_POSITION);
+ viewers.remove(nodeView);
+ }
+
+ @Override
+ protected Class<LatexExtension> getExtensionClass() {
+ return LatexExtension.class;
+ }
+
+ public void onViewCreated(final Container container) {
+ final NodeView nodeView = (NodeView) container;
+ final LatexExtension latexExtension = (LatexExtension) nodeView.getModel().getExtension(LatexExtension.class);
+ if (latexExtension == null) {
+ return;
+ }
+ createViewer(latexExtension, nodeView);
+ }
+
+ public void onViewRemoved(final Container container) {
+ final NodeView nodeView = (NodeView) container;
+ final LatexExtension latexExtension = (LatexExtension) nodeView.getModel().getExtension(LatexExtension.class);
+ if (latexExtension == null) {
+ return;
+ }
+ deleteViewer(latexExtension, nodeView);
+ }
+
+ @Override
+ protected void remove(final NodeModel node, final IExtension extension) {
+ final LatexExtension latexExtension = (LatexExtension) extension;
+ latexExtension.removeViewers();
+ super.remove(node, extension);
+ }
+
+ @Override
+ protected void saveExtension(final IExtension extension, final XMLElement element) {
+ final LatexExtension latexExtension = (LatexExtension) extension;
+ element.setAttribute("EQUATION", latexExtension.getEquation());
+ super.saveExtension(extension, element);
+ }
+
+ void setEquationUndoable(final LatexExtension model, final String newEquation) {
+ final String equation = model.getEquation();
+ if (equation.equals(newEquation)) {
+ return;
+ }
+ final IActor actor = new IActor() {
+ private final String oldEquation = equation;
+
+ public void act() {
+ model.setEquation(newEquation);
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ Controller.getCurrentModeController().getMapController().setSaved(map, false);
+ }
+
+ public String getDescription() {
+ return "setLatexEquationUndoable";
+ }
+
+ public void undo() {
+ model.setEquation(oldEquation);
+ }
+ };
+ Controller.getCurrentModeController().execute(actor,
+ Controller.getCurrentModeController().getController().getMap());
+ }
+
+ @Override
+ public void undoableToggleHook(final NodeModel node, final IExtension extension) {
+ if (extension != null) {
+ super.undoableToggleHook(node, extension);
+ return;
+ }
+ final String equation = LegacyLatexEditor.editLatex("", node);
+ if (equation == null || "".equals(equation.trim())) {
+ return;
+ }
+ super.undoableToggleHook(node, null);
+ final LatexExtension latexExtension = (LatexExtension) node.getExtension(LatexExtension.class);
+ setEquationUndoable(latexExtension, equation);
+ }
+
+ void editLatexInEditor(final NodeModel node) {
+ LatexExtension latexExtension = (LatexExtension) node.getExtension(LatexExtension.class);
+ final String equation;
+ //if no LaTeX is attached, create one
+ if (latexExtension == null) {
+ equation = LegacyLatexEditor.editLatex("", node);
+ }
+ //if LaTeX is present edit it
+ else {
+ equation = LegacyLatexEditor.editLatex(latexExtension.getEquation(), node);
+ }
+ // return on cancel
+ if (equation == null) {
+ return;
+ }
+ if (!"".equals(equation.trim())) {
+ if (latexExtension == null) {
+ latexExtension = new LatexExtension();
+ undoableActivateHook(node, latexExtension);
+ }
+ setEquationUndoable(latexExtension, equation);
+ }
+ else if (latexExtension != null) {
+ undoableDeactivateHook(node);
+ }
+ }
+}
diff --git a/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexRegistration.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexRegistration.java
new file mode 100644
index 0000000..3272c7a
--- /dev/null
+++ b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexRegistration.java
@@ -0,0 +1,50 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.latex;
+
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.ConditionalContentTransformer;
+
+/**
+ * @author Stefan Ott
+ * @file LatexRegistration.java
+ * @package org.freeplane.plugin.latex
+ *
+ * This class registers the LaTeX plugin in Freeplane
+ */
+class LatexRegistration {
+ public LatexRegistration() {
+ final ModeController modeController = Controller.getCurrentModeController();
+ //LattexNodeHook -> Menu insert
+ final LatexNodeHook nodeHook = new LatexNodeHook();
+ if (modeController.getModeName().equals("MindMap")) {
+ modeController.addAction(new InsertLatexAction(nodeHook));
+ modeController.addAction(new EditLatexAction(nodeHook));
+ modeController.addAction(new DeleteLatexAction(nodeHook));
+ modeController.getExtension(TextController.class).addTextTransformer(//
+ new ConditionalContentTransformer(new LatexRenderer(), Activator.TOGGLE_PARSE_LATEX));
+ modeController.getController().getExtension(FormatController.class).addPatternFormat(new LatexFormat());
+ modeController.getController().getExtension(FormatController.class).addPatternFormat(new UnparsedLatexFormat());
+ }
+ }
+}
diff --git a/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexRenderer.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexRenderer.java
new file mode 100644
index 0000000..0866025
--- /dev/null
+++ b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexRenderer.java
@@ -0,0 +1,126 @@
+package org.freeplane.plugin.latex;
+
+import java.awt.Dimension;
+import java.awt.Font;
+import java.awt.event.KeyEvent;
+
+import javax.swing.Icon;
+import javax.swing.JEditorPane;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.JRestrictedSizeScrollPane;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.format.PatternFormat;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.text.AbstractContentTransformer;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.TransformationException;
+import org.freeplane.features.text.mindmapmode.EditNodeBase;
+import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl;
+import org.freeplane.features.text.mindmapmode.EditNodeDialog;
+import org.freeplane.features.text.mindmapmode.IEditBaseCreator;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.scilab.forge.jlatexmath.TeXConstants;
+import org.scilab.forge.jlatexmath.TeXIcon;
+
+public class LatexRenderer extends AbstractContentTransformer implements IEditBaseCreator {
+
+ private static final String LATEX_EDITOR_FONT_SIZE = "latex_editor_font_size";
+ private static final String LATEX_EDITOR_FONT = "latex_editor_font";
+ private static final String LATEX_EDITOR_DISABLE = "latex_disable_editor";
+ private static final String LATEX = "\\latex";
+ private static final String UNPARSED_LATEX = "\\unparsedlatex";
+
+
+ public LatexRenderer() {
+ super(20);
+ }
+
+ public Object transformContent(TextController textController,
+ Object content, NodeModel node, Object transformedExtension)
+ throws TransformationException {
+ return content;
+ }
+
+ private static boolean checkForLatexPrefix(final String nodeText, final String prefix)
+ {
+ int startLength = prefix.length() + 1;
+ return nodeText.length() > startLength && nodeText.startsWith(prefix) &&
+ Character.isWhitespace(nodeText.charAt(startLength - 1));
+ }
+
+ private static enum TargetMode { FOR_ICON, FOR_EDITOR };
+
+ private String getLatexNode(final String nodeText, final String nodeFormat, final TargetMode mode)
+ {
+ boolean includePrefix = mode == TargetMode.FOR_EDITOR;
+
+ if(checkForLatexPrefix(nodeText, LATEX)){
+ return includePrefix ? nodeText : nodeText.substring(LATEX.length() + 1);
+ }
+ else if(LatexFormat.LATEX_FORMAT.equals(nodeFormat)){
+ return nodeText;
+ } else if(checkForLatexPrefix(nodeText, UNPARSED_LATEX) && mode == TargetMode.FOR_EDITOR) {
+ return nodeText;
+ } else if(UnparsedLatexFormat.UNPARSED_LATEX_FORMAT.equals(nodeFormat) && mode == TargetMode.FOR_EDITOR) {
+ return nodeText;
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public Icon getIcon(TextController textController, Object content,
+ NodeModel node, Object transformedExtension) {
+ if(transformedExtension == node.getUserObject()){
+ String string = content.toString();
+ String nodeFormat = textController.getNodeFormat(node);
+ if (PatternFormat.IDENTITY_PATTERN.equals(nodeFormat))
+ return null;
+
+ final String latext = getLatexNode(string, nodeFormat, TargetMode.FOR_ICON);
+ if (latext == null)
+ return null;
+ final NodeStyleController ncs = NodeStyleController.getController(textController.getModeController());
+ final int maxWidth = ncs.getMaxWidth(node).toBaseUnitsRounded();
+ TeXText teXt = new TeXText(latext);
+ int fontSize = Math.round(ncs.getFontSize(node) * UITools.FONT_SCALE_FACTOR);
+ TeXIcon icon = teXt.createTeXIcon(TeXConstants.STYLE_DISPLAY, fontSize, TeXConstants.ALIGN_LEFT, maxWidth);
+ return icon;
+ }
+ return null;
+ }
+
+ public EditNodeBase createEditor(NodeModel node,
+ IEditControl editControl, String text, boolean editLong) {
+ MTextController textController = MTextController.getController();
+ if (textController.isTextFormattingDisabled(node)) // Format=Text!
+ return null;
+ final KeyEvent firstKeyEvent = textController.getEventQueue().getFirstEvent();
+ String nodeFormat = textController.getNodeFormat(node);
+ final String latexText = getLatexNode(text, nodeFormat, TargetMode.FOR_EDITOR);
+
+ // this option has been added to work around bugs in JSyntaxPane with Chinese characters
+ if (ResourceController.getResourceController().getBooleanProperty(LATEX_EDITOR_DISABLE))
+ return null;
+
+ if(latexText != null){
+ JEditorPane textEditor = new JEditorPane();
+ textEditor.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
+ final JRestrictedSizeScrollPane scrollPane = new JRestrictedSizeScrollPane(textEditor);
+ scrollPane.setMinimumSize(new Dimension(0, 60));
+ final EditNodeDialog editNodeDialog = new LatexEditor(node, latexText, firstKeyEvent, editControl, false, textEditor);
+ editNodeDialog.setTitle(TextUtils.getText("latex_editor"));
+ textEditor.setContentType("text/latex");
+
+ final String fontName = ResourceController.getResourceController().getProperty(LATEX_EDITOR_FONT);
+ final int fontSize = ResourceController.getResourceController().getIntProperty(LATEX_EDITOR_FONT_SIZE);
+ textEditor.setFont(new Font(fontName, Font.PLAIN, fontSize));
+
+ return editNodeDialog;
+ }
+ return null;
+ }
+}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexViewer.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexViewer.java
similarity index 100%
rename from freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexViewer.java
rename to freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LatexViewer.java
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LegacyLatexEditor.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LegacyLatexEditor.java
similarity index 100%
rename from freeplane_plugin_latex/src/org/freeplane/plugin/latex/LegacyLatexEditor.java
rename to freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/LegacyLatexEditor.java
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/TeXText.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/TeXText.java
similarity index 100%
rename from freeplane_plugin_latex/src/org/freeplane/plugin/latex/TeXText.java
rename to freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/TeXText.java
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/UnparsedLatexFormat.java b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/UnparsedLatexFormat.java
similarity index 100%
rename from freeplane_plugin_latex/src/org/freeplane/plugin/latex/UnparsedLatexFormat.java
rename to freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/UnparsedLatexFormat.java
diff --git a/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/preferences.xml b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/preferences.xml
new file mode 100644
index 0000000..6fcbdc6
--- /dev/null
+++ b/freeplane_plugin_latex/src/main/java/org/freeplane/plugin/latex/preferences.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?><preferences_structure xmlns="http://freeplane.sf.net/ui/preferences/1.0">
+<tabbed_pane>
+<tab name="plugins">
+<separator name="latex">
+<textbox name="latex_macros" lines="5"/>
+<font name="latex_editor_font"/>
+<number name="latex_editor_font_size" min="4" max="216"/>
+<boolean name="latex_disable_editor"/>
+</separator>
+</tab>
+</tabbed_pane>
+</preferences_structure>
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/Activator.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/Activator.java
deleted file mode 100644
index 6d11952..0000000
--- a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/Activator.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.freeplane.plugin.latex;
-
-import java.net.URL;
-import java.util.Hashtable;
-
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.browsemode.BModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.main.osgi.IModeControllerExtensionProvider;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class Activator implements BundleActivator {
-
- private static final String PREFERENCES_RESOURCE = "preferences.xml";
-
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- public void start(final BundleContext context) throws Exception {
- registerMindMapModeExtension(context);
- registerBrowseModeExtension(context);
- }
-
- private void registerMindMapModeExtension(final BundleContext context) {
- final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
- props.put("mode", new String[] { MModeController.MODENAME });
- context.registerService(IModeControllerExtensionProvider.class.getName(),
- new IModeControllerExtensionProvider() {
- public void installExtension(final ModeController modeController) {
- new LatexRegistration();
- addPreferencesToOptionPanel();
- }
-
- private void addPreferencesToOptionPanel() {
- final URL preferences = this.getClass().getResource(PREFERENCES_RESOURCE);
- if (preferences == null)
- throw new RuntimeException("cannot open preferences");
- final Controller controller = Controller.getCurrentController();
- MModeController modeController = (MModeController) controller.getModeController();
- modeController.getOptionPanelBuilder().load(preferences);
- }
- }, props);
- }
-
- private void registerBrowseModeExtension(final BundleContext context) {
- final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
- props.put("mode", new String[] { BModeController.MODENAME });
- context.registerService(IModeControllerExtensionProvider.class.getName(),
- new IModeControllerExtensionProvider() {
- public void installExtension(final ModeController modeController) {
- new LatexRegistration();
- }
- }, props);
- }
-
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- public void stop(final BundleContext context) throws Exception {
- }
-}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/InsertLatexAction.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/InsertLatexAction.java
deleted file mode 100644
index 6f8cacf..0000000
--- a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/InsertLatexAction.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2010 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is created by Stefan Ott in 2011.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.latex;
-
-import java.awt.event.ActionEvent;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-/**
- *
- * @author Stefan Ott
- *
- *This class is called when a (legacy!) LaTeX formula is inserted into
- * (added to) a node
- * @see http://freeplane.sourceforge.net/wiki/index.php/LaTeX_in_Freeplane
- */
- at EnabledAction(checkOnNodeChange = true)
-public class InsertLatexAction extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
- private final LatexNodeHook nodeHook;
-
- public InsertLatexAction(final LatexNodeHook nodeHook) {
- super("LatexInsertLatexAction");
- this.nodeHook = nodeHook;
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- Box box = Box.createVerticalBox();
- final String about1 = TextUtils.getText("LatexInsertLatexAction.msg1");
- box.add(new JLabel(about1));
- addUriWithoutTitle(box, "LaTeX_in_freeplane_url");
- final String about2 = TextUtils.getText("LatexInsertLatexAction.msg2");
- box.add(new JLabel(about2));
-
- JOptionPane.showMessageDialog(UITools.getFrame(), box, TextUtils
- .getText("LatexInsertLatexAction.text"), JOptionPane.INFORMATION_MESSAGE);
- }
-
- private void addUriWithoutTitle(Box box, String uriProperty) {
- try {
- final String urlText = ResourceController.getResourceController().getProperty(uriProperty);
- URI uri = new URI(urlText);
- JButton uriButton = UITools.createHtmlLinkStyleButton(uri, urlText);
- uriButton.setHorizontalAlignment(SwingConstants.LEADING);
- box.add(uriButton);
- } catch (URISyntaxException e1) {
- }
- }
-
- @Override
- public void setEnabled() {
- final NodeModel node = Controller.getCurrentModeController().getMapController().getSelectedNode();
- setEnabled(node != null && (LatexExtension) node.getExtension(LatexExtension.class) == null);
- }
-}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexEditor.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexEditor.java
deleted file mode 100644
index ae2face..0000000
--- a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexEditor.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.freeplane.plugin.latex;
-
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 dimitry
- *
- * This file author is Felix Natter (copied from FormulaEditor)
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-import java.awt.event.KeyEvent;
-
-import javax.swing.JEditorPane;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.text.mindmapmode.EditNodeDialog;
-
-/**
- * @author Felix Natter (copied from FormulaEditor)
- */
-class LatexEditor extends EditNodeDialog {
-
- LatexEditor(NodeModel nodeModel, String text, KeyEvent firstEvent, IEditControl editControl,
- boolean enableSplit, JEditorPane textEditor) {
- super(nodeModel, text, firstEvent, editControl, enableSplit, textEditor);
- super.setModal(false);
- }
-}
\ No newline at end of file
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexNodeHook.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexNodeHook.java
deleted file mode 100644
index 8c034f9..0000000
--- a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexNodeHook.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.latex;
-
-import java.awt.Container;
-import java.util.Set;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.map.INodeView;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.features.ui.INodeViewLifeCycleListener;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.view.swing.map.NodeView;
-
-/**
- * @author Dimitry Polivaev
- * @file LatexNodeHook.java
- * @package freeplane.modes.mindmapmode
- */
- at NodeHookDescriptor(hookName = "plugins/latex/LatexNodeHook.properties", //
-onceForMap = false)
-class LatexNodeHook extends PersistentNodeHook implements INodeViewLifeCycleListener {
- static final int VIEWER_POSITION = 4;
-
- /**
- */
- public LatexNodeHook() {
- super();
- final ModeController modeController = Controller.getCurrentModeController();
- modeController.addINodeViewLifeCycleListener(this);
- }
-
- @Override
- public void add(final NodeModel node, final IExtension extension) {
- final LatexExtension latexExtension = (LatexExtension) extension;
- for (final INodeView iNodeView : node.getViewers()) {
- final NodeView view = (NodeView) iNodeView;
- createViewer(latexExtension, view);
- }
- super.add(node, extension);
- }
-
- @Override
- protected IExtension createExtension(final NodeModel node, final XMLElement element) {
- final LatexExtension latexExtension = new LatexExtension();
- if (element != null) {
- final String equation = element.getAttribute("EQUATION", null);
- if (equation == null) {
- // error: do not create anything
- return null;
- }
- latexExtension.setEquation(equation);
- Controller.getCurrentModeController().getMapController()
- .nodeChanged(node, NodeModel.UNKNOWN_PROPERTY, null, null);
- }
- return latexExtension;
- }
-
- @Override
- protected HookAction createHookAction() {
- return null;
- }
-
- void createViewer(final LatexExtension model, final NodeView view) {
- final LatexViewer comp = new LatexViewer(this, model);
- final Set<NodeView> viewers = model.getViewers();
- viewers.add(view);
- view.addContent(comp, VIEWER_POSITION);
- }
-
- void deleteViewer(final LatexExtension model, final NodeView nodeView) {
- final Set<NodeView> viewers = model.getViewers();
- if (!viewers.contains(nodeView)) {
- return;
- }
- nodeView.removeContent(VIEWER_POSITION);
- viewers.remove(nodeView);
- }
-
- @Override
- protected Class<LatexExtension> getExtensionClass() {
- return LatexExtension.class;
- }
-
- public void onViewCreated(final Container container) {
- final NodeView nodeView = (NodeView) container;
- final LatexExtension latexExtension = (LatexExtension) nodeView.getModel().getExtension(LatexExtension.class);
- if (latexExtension == null) {
- return;
- }
- createViewer(latexExtension, nodeView);
- }
-
- public void onViewRemoved(final Container container) {
- final NodeView nodeView = (NodeView) container;
- final LatexExtension latexExtension = (LatexExtension) nodeView.getModel().getExtension(LatexExtension.class);
- if (latexExtension == null) {
- return;
- }
- deleteViewer(latexExtension, nodeView);
- }
-
- @Override
- protected void remove(final NodeModel node, final IExtension extension) {
- final LatexExtension latexExtension = (LatexExtension) extension;
- latexExtension.removeViewers();
- super.remove(node, extension);
- }
-
- @Override
- protected void saveExtension(final IExtension extension, final XMLElement element) {
- final LatexExtension latexExtension = (LatexExtension) extension;
- element.setAttribute("EQUATION", latexExtension.getEquation());
- super.saveExtension(extension, element);
- }
-
- void setEquationUndoable(final LatexExtension model, final String newEquation) {
- final String equation = model.getEquation();
- if (equation.equals(newEquation)) {
- return;
- }
- final IActor actor = new IActor() {
- private final String oldEquation = equation;
-
- public void act() {
- model.setEquation(newEquation);
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- Controller.getCurrentModeController().getMapController().setSaved(map, false);
- }
-
- public String getDescription() {
- return "setLatexEquationUndoable";
- }
-
- public void undo() {
- model.setEquation(oldEquation);
- }
- };
- Controller.getCurrentModeController().execute(actor,
- Controller.getCurrentModeController().getController().getMap());
- }
-
- @Override
- public void undoableToggleHook(final NodeModel node, final IExtension extension) {
- if (extension != null) {
- super.undoableToggleHook(node, extension);
- return;
- }
- final String equation = LegacyLatexEditor.editLatex("", node);
- if (equation == null || "".equals(equation.trim())) {
- return;
- }
- super.undoableToggleHook(node, null);
- final LatexExtension latexExtension = (LatexExtension) node.getExtension(LatexExtension.class);
- setEquationUndoable(latexExtension, equation);
- }
-
- void editLatexInEditor(final NodeModel node) {
- LatexExtension latexExtension = (LatexExtension) node.getExtension(LatexExtension.class);
- final String equation;
- //if no LaTeX is attached, create one
- if (latexExtension == null) {
- equation = LegacyLatexEditor.editLatex("", node);
- }
- //if LaTeX is present edit it
- else {
- equation = LegacyLatexEditor.editLatex(latexExtension.getEquation(), node);
- }
- // return on cancel
- if (equation == null) {
- return;
- }
- if (!"".equals(equation.trim())) {
- if (latexExtension == null) {
- latexExtension = new LatexExtension();
- undoableActivateHook(node, latexExtension);
- }
- setEquationUndoable(latexExtension, equation);
- }
- else if (latexExtension != null) {
- undoableDeactivateHook(node);
- }
- }
-}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexRegistration.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexRegistration.java
deleted file mode 100644
index 804e441..0000000
--- a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexRegistration.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.latex;
-
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.text.TextController;
-
-/**
- * @author Stefan Ott
- * @file LatexRegistration.java
- * @package org.freeplane.plugin.latex
- *
- * This class registers the LaTeX plugin in Freeplane
- */
-class LatexRegistration {
- public LatexRegistration() {
- final ModeController modeController = Controller.getCurrentModeController();
- //LattexNodeHook -> Menu insert
- final LatexNodeHook nodeHook = new LatexNodeHook();
- if (modeController.getModeName().equals("MindMap")) {
- modeController.addAction(new InsertLatexAction(nodeHook));
- modeController.addAction(new EditLatexAction(nodeHook));
- modeController.addAction(new DeleteLatexAction(nodeHook));
- modeController.getExtension(TextController.class).addTextTransformer(new LatexRenderer());
- modeController.getController().getExtension(FormatController.class).addPatternFormat(new LatexFormat());
- modeController.getController().getExtension(FormatController.class).addPatternFormat(new UnparsedLatexFormat());
- }
- }
-}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexRenderer.java b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexRenderer.java
deleted file mode 100644
index 8ce1ce5..0000000
--- a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/LatexRenderer.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package org.freeplane.plugin.latex;
-
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.event.KeyEvent;
-
-import javax.swing.Icon;
-import javax.swing.JEditorPane;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.JRestrictedSizeScrollPane;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.format.PatternFormat;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.text.AbstractContentTransformer;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.TransformationException;
-import org.freeplane.features.text.mindmapmode.EditNodeBase;
-import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl;
-import org.freeplane.features.text.mindmapmode.EditNodeDialog;
-import org.freeplane.features.text.mindmapmode.IEditBaseCreator;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.scilab.forge.jlatexmath.TeXConstants;
-import org.scilab.forge.jlatexmath.TeXIcon;
-
-public class LatexRenderer extends AbstractContentTransformer implements IEditBaseCreator {
-
- private static final String LATEX_EDITOR_FONT_SIZE = "latex_editor_font_size";
- private static final String LATEX_EDITOR_FONT = "latex_editor_font";
- private static final String LATEX_EDITOR_DISABLE = "latex_disable_editor";
- private static final String LATEX = "\\latex";
- private static final String UNPARSED_LATEX = "\\unparsedlatex";
-
-
- public LatexRenderer() {
- super(20);
- }
-
- public Object transformContent(TextController textController,
- Object content, NodeModel node, Object transformedExtension)
- throws TransformationException {
- return content;
- }
-
- private static boolean checkForLatexPrefix(final String nodeText, final String prefix)
- {
- int startLength = prefix.length() + 1;
- return nodeText.length() > startLength && nodeText.startsWith(prefix) &&
- Character.isWhitespace(nodeText.charAt(startLength - 1));
- }
-
- private static enum TargetMode { FOR_ICON, FOR_EDITOR };
-
- private String getLatexNode(final String nodeText, final String nodeFormat, final TargetMode mode)
- {
- boolean includePrefix = mode == TargetMode.FOR_EDITOR;
-
- if(checkForLatexPrefix(nodeText, LATEX)){
- return includePrefix ? nodeText : nodeText.substring(LATEX.length() + 1);
- }
- else if(LatexFormat.LATEX_FORMAT.equals(nodeFormat)){
- return nodeText;
- } else if(checkForLatexPrefix(nodeText, UNPARSED_LATEX) && mode == TargetMode.FOR_EDITOR) {
- return nodeText;
- } else if(UnparsedLatexFormat.UNPARSED_LATEX_FORMAT.equals(nodeFormat) && mode == TargetMode.FOR_EDITOR) {
- return nodeText;
- } else {
- return null;
- }
- }
-
- @Override
- public Icon getIcon(TextController textController, Object content,
- NodeModel node, Object transformedExtension) {
- if(transformedExtension == node.getUserObject()){
- String string = content.toString();
- String nodeFormat = textController.getNodeFormat(node);
- if (PatternFormat.IDENTITY_PATTERN.equals(nodeFormat))
- return null;
-
- final String latext = getLatexNode(string, nodeFormat, TargetMode.FOR_ICON);
- if (latext == null)
- return null;
- final NodeStyleController ncs = NodeStyleController.getController(textController.getModeController());
- final int maxWidth = ncs.getMaxWidth(node);
- TeXText teXt = new TeXText(latext);
- int fontSize = Math.round(ncs.getFontSize(node) * UITools.FONT_SCALE_FACTOR);
- TeXIcon icon = teXt.createTeXIcon(TeXConstants.STYLE_DISPLAY, fontSize, TeXConstants.ALIGN_LEFT, maxWidth);
- return icon;
- }
- return null;
- }
-
- public EditNodeBase createEditor(NodeModel node,
- IEditControl editControl, String text, boolean editLong) {
- MTextController textController = MTextController.getController();
- if (textController.isTextFormattingDisabled(node)) // Format=Text!
- return null;
- final KeyEvent firstKeyEvent = textController.getEventQueue().getFirstEvent();
- String nodeFormat = textController.getNodeFormat(node);
- final String latexText = getLatexNode(text, nodeFormat, TargetMode.FOR_EDITOR);
-
- // this option has been added to work around bugs in JSyntaxPane with Chinese characters
- if (ResourceController.getResourceController().getBooleanProperty(LATEX_EDITOR_DISABLE))
- return null;
-
- if(latexText != null){
- JEditorPane textEditor = new JEditorPane();
- textEditor.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
- final JRestrictedSizeScrollPane scrollPane = new JRestrictedSizeScrollPane(textEditor);
- scrollPane.setMinimumSize(new Dimension(0, 60));
- final EditNodeDialog editNodeDialog = new LatexEditor(node, latexText, firstKeyEvent, editControl, false, textEditor);
- editNodeDialog.setTitle(TextUtils.getText("latex_editor"));
- textEditor.setContentType("text/latex");
-
- final String fontName = ResourceController.getResourceController().getProperty(LATEX_EDITOR_FONT);
- final int fontSize = ResourceController.getResourceController().getIntProperty(LATEX_EDITOR_FONT_SIZE);
- textEditor.setFont(new Font(fontName, Font.PLAIN, fontSize));
-
- return editNodeDialog;
- }
- return null;
- }
-}
diff --git a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/preferences.mm b/freeplane_plugin_latex/src/org/freeplane/plugin/latex/preferences.mm
deleted file mode 100644
index da6d45c..0000000
--- a/freeplane_plugin_latex/src/org/freeplane/plugin/latex/preferences.mm
+++ /dev/null
@@ -1,125 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<node TEXT="LaTeX Preferences" FOLDED="false" ID="ID_647512264"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="boolean" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="boolean" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="combo" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="combo" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="choice" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="choice" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="font" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="font" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="number" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="number" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="path" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="path" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="remind_value" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="remind_value" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="group" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="group" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="color" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="color" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="string" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="string" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="tab" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="tab" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="text" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="text" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode TEXT="boolean">
-<icon BUILTIN="checked"/>
-</stylenode>
-<stylenode TEXT="combo">
-<icon BUILTIN="list"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-<stylenode TEXT="choice"/>
-<stylenode TEXT="font"/>
-<stylenode TEXT="number"/>
-<stylenode TEXT="path"/>
-<stylenode TEXT="remind_value"/>
-<stylenode TEXT="separator">
-<font BOLD="true"/>
-</stylenode>
-<stylenode TEXT="group">
-<icon BUILTIN="folder"/>
-</stylenode>
-<stylenode TEXT="color">
-<icon BUILTIN="licq"/>
-</stylenode>
-<stylenode TEXT="string">
-<icon BUILTIN="edit"/>
-</stylenode>
-<stylenode TEXT="tab">
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="text">
-<icon BUILTIN="info"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="Plugins" POSITION="right" ID="ID_591627084">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE="plugins"/>
-<node TEXT="Latex" ID="ID_1783515461">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="latex"/>
-<node TEXT="Common Macros" ID="ID_11961549">
-<attribute_layout NAME_WIDTH="38" VALUE_WIDTH="85"/>
-<attribute NAME="type" VALUE="textbox"/>
-<attribute NAME="name" VALUE="latex_macros"/>
-<attribute NAME="lines" VALUE="5" OBJECT="org.freeplane.features.format.FormattedNumber|5"/>
-</node>
-<node TEXT="LaTeX Editor Font" ID="ID_121453512">
-<attribute_layout NAME_WIDTH="38" VALUE_WIDTH="107"/>
-<attribute NAME="type" VALUE="font"/>
-<attribute NAME="name" VALUE="latex_editor_font"/>
-</node>
-<node TEXT="LaTeX Editor Font Size" ID="ID_302068721">
-<attribute_layout NAME_WIDTH="38" VALUE_WIDTH="136"/>
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="latex_editor_font_size"/>
-<attribute NAME="min" VALUE="4" OBJECT="org.freeplane.features.format.FormattedNumber|4"/>
-<attribute NAME="max" VALUE="216" OBJECT="org.freeplane.features.format.FormattedNumber|216"/>
-</node>
-<node TEXT="Disable LaTeX Editor" ID="ID_326771379">
-<attribute_layout NAME_WIDTH="38" VALUE_WIDTH="107"/>
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="latex_disable_editor"/>
-</node>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane_plugin_openmaps/.classpath b/freeplane_plugin_openmaps/.classpath
deleted file mode 100644
index 6bf4698..0000000
--- a/freeplane_plugin_openmaps/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry exported="true" kind="lib" path="lib/JMapViewer.jar"/>
- <classpathentry kind="output" path="build"/>
-</classpath>
diff --git a/freeplane_plugin_openmaps/.project b/freeplane_plugin_openmaps/.project
deleted file mode 100644
index 97fc06a..0000000
--- a/freeplane_plugin_openmaps/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_openmaps</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_openmaps/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_openmaps/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 44217f8..0000000
--- a/freeplane_plugin_openmaps/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/freeplane_plugin_openmaps/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_openmaps/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index d711c29..0000000
--- a/freeplane_plugin_openmaps/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-eclipse.preferences.version=1
-pluginProject.equinox=false
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/freeplane_plugin_openmaps/META-INF/MANIFEST.MF b/freeplane_plugin_openmaps/META-INF/MANIFEST.MF
deleted file mode 100644
index 3020905..0000000
--- a/freeplane_plugin_openmaps/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.plugin.openmaps
-Bundle-SymbolicName: org.freeplane.plugin.openmaps
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.freeplane.plugin.openmaps.Activator
-Import-Package: org.osgi.framework;version="1.3.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ClassPath: lib/JMapViewer.jar, lib/plugin.jar
-Require-Bundle: org.freeplane.core;bundle-version="1.0.1"
diff --git a/freeplane_plugin_openmaps/ant/ant.properties b/freeplane_plugin_openmaps/ant/ant.properties
deleted file mode 100644
index 07fb6df..0000000
--- a/freeplane_plugin_openmaps/ant/ant.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-plugin.ext.lib = lib
-JMapViewer.jar = ${plugin.ext.lib}/JMapViewer.jar
\ No newline at end of file
diff --git a/freeplane_plugin_openmaps/ant/build.xml b/freeplane_plugin_openmaps/ant/build.xml
deleted file mode 100644
index 85d7b77..0000000
--- a/freeplane_plugin_openmaps/ant/build.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<project name="freeplane_openmaps" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property name="src" value="src" />
- <property name="root" value="."/>
- <property name="osgimanifest" value="${root}/META-INF/MANIFEST.MF" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="ant/ant.properties" />
- <property name="external.jars" value="${commons-lang.jar}:${forms.jar}:${SimplyHTML.jar}:${JMapViewer.jar}" />
- <property name="build" value="${root}/build" />
- <property name="dist" value="${root}/dist" />
- <property name="dist.osgi.dir" value="${dist}/org.freeplane.plugin.openmaps" />
- <property name="freeplaneplugin.jar" value="${dist}/org.freeplane.plugin.openmaps.jar"/>
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${framework.jar}:${freeplane.jars}:${external.jars}"/>
-
- <target name="build">
- <mkdir dir="${build}" />
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- </javac>
- </target>
-
-
- <target name="dist" depends="build">
- <jar jarfile="lib/plugin.jar">
- <fileset dir="${build}"/>
- </jar>
- <delete dir="${dist.osgi.dir}" quiet="true"/>
- <mkdir dir="${dist.osgi.dir}" />
- <copy todir="${dist.osgi.dir}">
- <fileset dir="${root}">
- <include name="lib/**"/>
- </fileset>
- </copy>
- <mkdir dir="${dist.osgi.dir}/META-INF" />
- <copy tofile="${dist.osgi.dir}/META-INF/MANIFEST.MF" file="${osgimanifest}"/>
- <delete file="lib/plugin.jar" quiet="true"/>
- </target>
-
- <target name="osgi_dist_as_jar" depends="dist">
- <jar jarfile="${freeplaneplugin.jar}">
- <fileset dir="${dist.osgi.dir}">
- <include name="**" />
- </fileset>
- </jar>
- </target>
-
- <target name="clean">
- <delete dir="${build}" quiet="true"/>
- <delete dir="${dist}" quiet="true"/>
- <delete>
- <fileset defaultexcludes="no" dir="${src}" includes="**/*~"/>
- </delete>
- </target>
-
-</project>
-
diff --git a/freeplane_plugin_openmaps/build.gradle b/freeplane_plugin_openmaps/build.gradle
new file mode 100644
index 0000000..b7dc094
--- /dev/null
+++ b/freeplane_plugin_openmaps/build.gradle
@@ -0,0 +1,44 @@
+targetCompatibility='1.7'
+sourceCompatibility='1.7'
+
+repositories {
+ maven { url "https://josm.openstreetmap.de/nexus/content/groups/public/" }
+}
+
+dependencies {
+ compile project(':freeplane')
+
+ compile 'org.openstreetmap.jmapviewer:jmapviewer:1.14'
+}
+
+jar {
+ manifest {
+ name = pluginid
+ symbolicName = pluginid
+
+ configurations.runtime.transitive = false
+ def deps = filterAndExternalizePluginDependencies(configurations.runtime.files)
+ deps.add(0, "lib/plugin-" + project.version + '.jar')
+
+ attributes 'Class-Path': deps.join(', ')
+ attributes 'Bundle-ClassPath': '., ' + deps.join(', ')
+
+ instruction 'Bundle-Vendor', 'Freeplane Project'
+ instruction 'Bundle-Activator', pluginid + ".Activator"
+ instruction 'Bundle-RequiredExecutionEnvironment', 'JavaSE-1.7'
+
+ def imports = """\
+ org.osgi.framework;version="1.3.0",
+ org.freeplane.core.*,
+ org.freeplane.features.*,
+ org.freeplane.main.*,
+ org.freeplane.n3.*,
+ org.freeplane.view.*
+ """
+ instruction 'Import-Package', imports.replaceAll("\\s+", "")
+ instruction 'Export-Package', ''
+
+ // Require-Bundle is ignored by bnd => replaced by Import-Package!
+ //instruction 'Require-Bundle', 'org.freeplane.core;bundle-version="1.0.1"'
+ }
+}
diff --git a/freeplane_plugin_openmaps/lib/Readme.txt b/freeplane_plugin_openmaps/lib/Readme.txt
deleted file mode 100644
index 8ce68aa..0000000
--- a/freeplane_plugin_openmaps/lib/Readme.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-JMapViewer
-
-(c) 2008 Jan Peter Stotz and others
-
-This work bases partly on the JOSM plugin "Slippy Map Chooser" by Tim Haussmann
-
-License: GPL
-
-FAQ:
-
-1. What is JMapViewer?
-
-JMapViewer is a Java Swing component for integrating OSM maps in to your Java
-application. JMapViewer allows you to set markers on the map or zoom to a specific
-location on the map.
-
-2. How does JMapViewer work?
-
-JMapViewer loads bitmap tiles from the OpenStreetmap tile server (Mapnik renderer).
-Therefore any application using JMapViewer requires a working Internet connection.
-
-3. How do I use JMapViewer in my application?
-
-You can just create an instance of the class org.openstreetmap.gui.jmapviewer.JMapViewer
-using the default constructor and add it to your panel/frame/windows.
-For more details please see the Demo class in the same package.
\ No newline at end of file
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/Activator.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/Activator.java
similarity index 100%
rename from freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/Activator.java
rename to freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/Activator.java
diff --git a/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/LocationChoosenListener.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/LocationChoosenListener.java
new file mode 100644
index 0000000..504eb18
--- /dev/null
+++ b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/LocationChoosenListener.java
@@ -0,0 +1,11 @@
+package org.freeplane.plugin.openmaps;
+
+import org.openstreetmap.gui.jmapviewer.Coordinate;
+import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
+
+/**
+ * @author Blair Archibald
+ */
+public interface LocationChoosenListener {
+ public void locationChoosenAction(ICoordinate locationChoosen, int zoom);
+}
diff --git a/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsExtension.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsExtension.java
new file mode 100644
index 0000000..000c9a8
--- /dev/null
+++ b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsExtension.java
@@ -0,0 +1,41 @@
+package org.freeplane.plugin.openmaps;
+
+import org.freeplane.core.extension.IExtension;
+import org.openstreetmap.gui.jmapviewer.Coordinate;
+import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
+
+/**
+ * @author Blair Archibald
+ */
+public class OpenMapsExtension implements IExtension {
+ private Coordinate location;
+ private int zoom;
+
+ public OpenMapsExtension() {
+ //Initialing Coodinate to values not included in lat/lon
+ //measures - This allows undo to work.
+ location = new Coordinate(500,500);
+ zoom = 0;
+ }
+
+ public Coordinate getLocation() {
+ return location;
+ }
+
+ public int getZoom() {
+ return zoom;
+ }
+
+ public void updateZoom(int newZoom) {
+ zoom = newZoom;
+ }
+
+ public void updateLocation(double location_x, double location_y) {
+ location = new Coordinate(location_x, location_y);
+ }
+
+ public void updateLocation(ICoordinate locationChoosen) {
+ location = new Coordinate(locationChoosen.getLat(), locationChoosen.getLon());
+ }
+
+}
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsLocation.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsLocation.java
similarity index 100%
rename from freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsLocation.java
rename to freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsLocation.java
diff --git a/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsNodeHook.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsNodeHook.java
new file mode 100644
index 0000000..c3d0b84
--- /dev/null
+++ b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsNodeHook.java
@@ -0,0 +1,192 @@
+package org.freeplane.plugin.openmaps;
+
+import org.freeplane.core.extension.IExtension;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.features.icon.IStateIconProvider;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.UIIcon;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.NodeHookDescriptor;
+import org.freeplane.features.mode.PersistentNodeHook;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.plugin.openmaps.mapelements.OpenMapsDialog;
+import org.openstreetmap.gui.jmapviewer.Coordinate;
+import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
+import org.freeplane.plugin.openmaps.LocationChoosenListener;
+
+/**
+ * @author Blair Archibald
+ */
+ at NodeHookDescriptor(hookName = "plugins/openmaps/OpenMapsNodeHook.propterties", onceForMap = false)
+public class OpenMapsNodeHook extends PersistentNodeHook implements LocationChoosenListener {
+
+ static final String ICON_NAME = "internet";
+
+ private OpenMapsDialog map;
+
+ public OpenMapsNodeHook() {
+ super();
+ registerStateIconProvider();
+ }
+
+ public void chooseLocation() {
+ map = new OpenMapsDialog();
+ map.getController().addLocationChoosenListener(this);
+ }
+
+ public void removeLocationFromCurrentlySelectedNode() {
+ final NodeModel node = getCurrentlySelectedNode();
+ OpenMapsExtension openMapsExtension = (OpenMapsExtension) node.getExtension(OpenMapsExtension.class);
+
+ if (openMapsExtension != null) {
+ super.undoableToggleHook(node, openMapsExtension);
+ refreshNode(node);
+ }
+
+ final MapModel map = Controller.getCurrentModeController().getController().getMap();
+ Controller.getCurrentModeController().getMapController().setSaved(map, false);
+ }
+
+
+ //Called when a location is chosen in the OpenMapsDialog
+ public void locationChoosenAction(ICoordinate locationChoosen, int zoom) {
+ addChoosenLocationToSelectedNode(locationChoosen, zoom);
+// map.getController().removeLocationChoosenListener(this);
+ }
+
+ public void viewCurrentlySelectedLocation(final NodeModel targetNode) {
+ OpenMapsExtension openMapsExtension;
+ if (targetNode == null)
+ openMapsExtension = (OpenMapsExtension) getCurrentlySelectedNode().getExtension(OpenMapsExtension.class);
+ else
+ openMapsExtension = (OpenMapsExtension) targetNode.getExtension(OpenMapsExtension.class);
+
+ if (openMapsExtension != null) {
+ map = new OpenMapsDialog();
+ map.showZoomToLocation(openMapsExtension.getLocation(), openMapsExtension.getZoom());
+ map.getController().addLocationChoosenListener(this);
+ }
+
+ }
+
+ @Override
+ protected HookAction createHookAction() {
+ return null;
+ }
+
+ @Override
+ protected IExtension createExtension(final NodeModel node, final XMLElement element) {
+ final OpenMapsExtension extension = new OpenMapsExtension();
+ loadLocationFromXML(element, extension);
+ return (IExtension) extension;
+ }
+
+ @Override
+ protected Class<OpenMapsExtension> getExtensionClass() {
+ return OpenMapsExtension.class;
+ }
+
+ @Override
+ protected void saveExtension(final IExtension extension, final XMLElement element) {
+ final OpenMapsExtension openMapsExtension = (OpenMapsExtension) extension;
+ element.setAttribute("LAT", Double.toString(openMapsExtension.getLocation().getLat()));
+ element.setAttribute("LON", Double.toString(openMapsExtension.getLocation().getLon()));
+ element.setAttribute("ZOOM", Integer.toString(openMapsExtension.getZoom()));
+ super.saveExtension(extension, element);
+ }
+
+ private void loadLocationFromXML(final XMLElement element, final OpenMapsExtension extension) {
+ if (element != null) {
+ final double location_x = Double.parseDouble(element.getAttribute("LAT", null));
+ final double location_y = Double.parseDouble(element.getAttribute("LON", null));
+ final int zoom = Integer.parseInt(element.getAttribute("ZOOM",null));
+ extension.updateLocation(location_x, location_y);
+ extension.updateZoom(zoom);
+ }
+ }
+
+ private void addChoosenLocationToSelectedNode(ICoordinate locationChoosen, int zoom) {
+ final NodeModel node = getCurrentlySelectedNode();
+ OpenMapsExtension openMapsExtension = (OpenMapsExtension) node.getExtension(OpenMapsExtension.class);
+
+ if (openMapsExtension == null) {
+ openMapsExtension = new OpenMapsExtension();
+ undoableActivateHook(node, openMapsExtension);
+ }
+ setLocationChoiceUndoable(openMapsExtension, locationChoosen, zoom);
+ refreshNode(node);
+ }
+
+ private void setLocationChoiceUndoable(final OpenMapsExtension extension, final ICoordinate locationChoosen, final int zoomChoosen) {
+ final Coordinate currentLocation = extension.getLocation();
+ final int currentZoom = extension.getZoom();
+
+ if (!currentLocation.equals(locationChoosen)) {
+ final IActor actor = createUndoActor(extension, locationChoosen,
+ currentLocation, zoomChoosen, currentZoom);
+
+ Controller.getCurrentModeController().execute(actor,
+ Controller.getCurrentModeController().getController()
+ .getMap());
+ }
+ }
+
+ private IActor createUndoActor(final OpenMapsExtension extension, final ICoordinate newlyChoosenLocation,
+ final ICoordinate currentlyStoredLocation, final int newlyChoosenZoom , final int currentlyStoredZoom) {
+
+ return new IActor() {
+ private final ICoordinate oldLocation = currentlyStoredLocation;
+ private final int oldZoom = currentlyStoredZoom;
+
+ public void act() {
+ extension.updateLocation(newlyChoosenLocation);
+ extension.updateZoom(newlyChoosenZoom);
+ final MapModel map = Controller.getCurrentModeController()
+ .getController().getMap();
+ Controller.getCurrentModeController().getMapController()
+ .setSaved(map, false);
+ }
+
+ public String getDescription() {
+ return "setOpenMapsLocationChoiceUndoable";
+ }
+
+ public void undo() {
+ if (oldLocation.getLat() == 500 && oldLocation.getLon() == 500)
+ {
+ removeLocationFromCurrentlySelectedNode();
+ }
+ else
+ {
+ extension.updateLocation(oldLocation);
+ extension.updateZoom(oldZoom);
+ }
+ refreshNode(getCurrentlySelectedNode());
+ }
+
+ };
+ }
+
+ private void refreshNode(NodeModel node) {
+ Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.UNKNOWN_PROPERTY, null, null);
+ }
+
+ private NodeModel getCurrentlySelectedNode() {
+ return Controller.getCurrentModeController().getMapController().getSelectedNode();
+ }
+
+ private void registerStateIconProvider() {
+ Controller.getCurrentModeController().getExtension(IconController.class).addStateIconProvider
+ (new IStateIconProvider () {
+ public UIIcon getStateIcon(NodeModel node) {
+ if (node.getExtension(OpenMapsExtension.class) != null)
+ return IconStoreFactory.create().getUIIcon(ICON_NAME);
+ else
+ return null;
+ }
+ });
+ }
+}
diff --git a/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsRegistration.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsRegistration.java
new file mode 100644
index 0000000..51a2307
--- /dev/null
+++ b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/OpenMapsRegistration.java
@@ -0,0 +1,35 @@
+package org.freeplane.plugin.openmaps;
+
+import org.freeplane.features.icon.IconClickedEvent;
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.IconMouseListener;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.plugin.openmaps.actions.InsertOpenMapsAction;
+import org.freeplane.plugin.openmaps.actions.RemoveOpenMapsAction;
+import org.freeplane.plugin.openmaps.actions.ViewOpenMapsAction;
+
+/**
+ * @author Blair Archibald
+ */
+public class OpenMapsRegistration {
+
+ public OpenMapsRegistration(ModeController modeController) {
+ final OpenMapsNodeHook nodeHook = new OpenMapsNodeHook();
+ if (modeController.getModeName() == "MindMap") {
+ modeController.addAction(new InsertOpenMapsAction(nodeHook));
+ modeController.addAction(new RemoveOpenMapsAction(nodeHook));
+ ViewOpenMapsAction viewOpenMapsAction = new ViewOpenMapsAction(nodeHook);
+ modeController.addAction(viewOpenMapsAction);
+ modeController.getExtension(IconController.class).addIconMouseListener(new IconMouseListener() {
+
+ public boolean onIconClicked(IconClickedEvent event) {
+ final boolean canProcess = event.getUIIcon().getName().equals(OpenMapsNodeHook.ICON_NAME);
+ if (canProcess)
+ nodeHook.viewCurrentlySelectedLocation(event.getNode());
+ return canProcess;
+ }
+ });
+ }
+ }
+
+}
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/actions/InsertOpenMapsAction.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/actions/InsertOpenMapsAction.java
similarity index 100%
rename from freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/actions/InsertOpenMapsAction.java
rename to freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/actions/InsertOpenMapsAction.java
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/actions/RemoveOpenMapsAction.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/actions/RemoveOpenMapsAction.java
similarity index 100%
rename from freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/actions/RemoveOpenMapsAction.java
rename to freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/actions/RemoveOpenMapsAction.java
diff --git a/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/actions/ViewOpenMapsAction.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/actions/ViewOpenMapsAction.java
new file mode 100644
index 0000000..7d952b8
--- /dev/null
+++ b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/actions/ViewOpenMapsAction.java
@@ -0,0 +1,29 @@
+package org.freeplane.plugin.openmaps.actions;
+
+import java.awt.event.ActionEvent;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.openmaps.OpenMapsNodeHook;
+
+/**
+ * @author Blair Archibald
+ */
+public class ViewOpenMapsAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+ private static final String actionIdentifier = "OpenMapsViewLocation";
+
+ final OpenMapsNodeHook nodeHookReference;
+
+ public ViewOpenMapsAction(OpenMapsNodeHook nodeHook) {
+ super(actionIdentifier);
+ nodeHookReference = nodeHook;
+ }
+
+ public void actionPerformed(ActionEvent event) {
+ if (event.getSource() == null || !(event.getSource() instanceof NodeModel))
+ nodeHookReference.viewCurrentlySelectedLocation(null); // use currently selected node!
+ else
+ nodeHookReference.viewCurrentlySelectedLocation((NodeModel)(event.getSource())); // use node that was clicked!
+ }
+}
diff --git a/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/mapelements/OpenMapsController.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/mapelements/OpenMapsController.java
new file mode 100644
index 0000000..6bd138b
--- /dev/null
+++ b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/mapelements/OpenMapsController.java
@@ -0,0 +1,86 @@
+package org.freeplane.plugin.openmaps.mapelements;
+
+import java.awt.Point;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.freeplane.plugin.openmaps.LocationChoosenListener;
+import org.openstreetmap.gui.jmapviewer.Coordinate;
+import org.openstreetmap.gui.jmapviewer.DefaultMapController;
+import org.openstreetmap.gui.jmapviewer.JMapViewer;
+import org.openstreetmap.gui.jmapviewer.MapMarkerDot;
+import org.openstreetmap.gui.jmapviewer.OsmMercator;
+import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
+import org.openstreetmap.gui.jmapviewer.interfaces.MapMarker;
+
+/**
+ * @author Blair Archibald
+ */
+public class OpenMapsController extends DefaultMapController implements MouseListener {
+
+ private Set<LocationChoosenListener> Listeners;
+ private MapMarker currentLocation;
+
+ public OpenMapsController(JMapViewer map) {
+ super(map);
+ configureButtons();
+
+ Listeners = new HashSet<LocationChoosenListener>();
+ currentLocation = null;
+ }
+
+ private void configureButtons() {
+ this.setDoubleClickZoomEnabled(false);
+ this.setMovementMouseButton(1);
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
+ final ICoordinate locationChoosen = getSelectedLocation(e.getPoint());
+ setMarkerAtLocation(locationChoosen);
+ sendLocation(locationChoosen, getCurrentZoomLevel());
+ }
+ }
+
+ public void addLocationChoosenListener(LocationChoosenListener listener) {
+ Listeners.add(listener);
+ }
+
+ public void removeLocationChoosenListener(LocationChoosenListener listener) {
+ Listeners.remove(listener);
+ }
+
+ private void sendLocation(ICoordinate locationChoosen, int zoom) {
+ for (LocationChoosenListener l : Listeners) {
+ l.locationChoosenAction(locationChoosen, zoom);
+ }
+ }
+
+ public ICoordinate getSelectedLocation(Point clickedLocation) {
+ return map.getPosition(clickedLocation);
+ }
+
+ public int getCurrentZoomLevel() {
+ return map.getZoom();
+ }
+
+ private void setMarkerAtLocation(final ICoordinate locationChoosen) {
+ if (currentLocation != null)
+ map.removeMapMarker(currentLocation);
+ map.addMapMarker(currentLocation = new MapMarkerDot(locationChoosen.getLat(), locationChoosen.getLon()));
+ }
+
+ public void zoomToLocation(Coordinate location, int zoom) {
+ setMarkerAtLocation(location);
+
+ final OsmMercator osmMercator = new OsmMercator();
+
+ int x = (int)osmMercator.lonToX(location.getLon(), zoom);
+ int y = (int)osmMercator.latToY(location.getLat(), zoom);
+ map.setDisplayPosition(new Point(map.getWidth() / 2, map.getHeight() / 2), x, y, zoom);
+ }
+
+}
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/mapelements/OpenMapsDialog.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/mapelements/OpenMapsDialog.java
similarity index 100%
rename from freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/mapelements/OpenMapsDialog.java
rename to freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/mapelements/OpenMapsDialog.java
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/mapelements/OpenMapsViewer.java b/freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/mapelements/OpenMapsViewer.java
similarity index 100%
rename from freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/mapelements/OpenMapsViewer.java
rename to freeplane_plugin_openmaps/src/main/java/org/freeplane/plugin/openmaps/mapelements/OpenMapsViewer.java
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/LocationChoosenListener.java b/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/LocationChoosenListener.java
deleted file mode 100644
index 58a76ad..0000000
--- a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/LocationChoosenListener.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.freeplane.plugin.openmaps;
-
-import org.openstreetmap.gui.jmapviewer.Coordinate;
-
-/**
- * @author Blair Archibald
- */
-public interface LocationChoosenListener {
- public void locationChoosenAction(Coordinate locationChoosen, int zoom);
-}
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsExtension.java b/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsExtension.java
deleted file mode 100644
index 024e6f7..0000000
--- a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsExtension.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.freeplane.plugin.openmaps;
-
-import org.freeplane.core.extension.IExtension;
-import org.openstreetmap.gui.jmapviewer.Coordinate;
-
-/**
- * @author Blair Archibald
- */
-public class OpenMapsExtension implements IExtension {
- private Coordinate location;
- private int zoom;
-
- public OpenMapsExtension() {
- //Initialing Coodinate to values not included in lat/lon
- //measures - This allows undo to work.
- location = new Coordinate(500,500);
- zoom = 0;
- }
-
- public Coordinate getLocation() {
- return location;
- }
-
- public int getZoom() {
- return zoom;
- }
-
- public void updateZoom(int newZoom) {
- zoom = newZoom;
- }
-
- public void updateLocation(double location_x, double location_y) {
- location = new Coordinate(location_x, location_y);
- }
-
- public void updateLocation(Coordinate locationChoosen) {
- location = new Coordinate(locationChoosen.getLat(), locationChoosen.getLon());
- }
-
-}
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsNodeHook.java b/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsNodeHook.java
deleted file mode 100644
index 02b1c8e..0000000
--- a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsNodeHook.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package org.freeplane.plugin.openmaps;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.features.icon.IStateIconProvider;
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.UIIcon;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.NodeHookDescriptor;
-import org.freeplane.features.mode.PersistentNodeHook;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.openmaps.mapelements.OpenMapsDialog;
-import org.openstreetmap.gui.jmapviewer.Coordinate;
-import org.freeplane.plugin.openmaps.LocationChoosenListener;
-
-/**
- * @author Blair Archibald
- */
- at NodeHookDescriptor(hookName = "plugins/openmaps/OpenMapsNodeHook.propterties", onceForMap = false)
-public class OpenMapsNodeHook extends PersistentNodeHook implements LocationChoosenListener {
-
- private OpenMapsDialog map;
-
- public OpenMapsNodeHook() {
- super();
- registerStateIconProvider();
- }
-
- public void chooseLocation() {
- map = new OpenMapsDialog();
- map.getController().addLocationChoosenListener(this);
- }
-
- public void removeLocationFromCurrentlySelectedNode() {
- final NodeModel node = getCurrentlySelectedNode();
- OpenMapsExtension openMapsExtension = (OpenMapsExtension) node.getExtension(OpenMapsExtension.class);
-
- if (openMapsExtension != null) {
- super.undoableToggleHook(node, openMapsExtension);
- refreshNode(node);
- }
-
- final MapModel map = Controller.getCurrentModeController().getController().getMap();
- Controller.getCurrentModeController().getMapController().setSaved(map, false);
- }
-
-
- //Called when a location is chosen in the OpenMapsDialog - Only one location may be chosen at a time
- public void locationChoosenAction(Coordinate locationChoosen, int zoom) {
- addChoosenLocationToSelectedNode(locationChoosen, zoom);
- map.getController().removeLocationChoosenListener(this);
- }
-
- public void viewCurrentlySelectedLocation() {
- final NodeModel node = getCurrentlySelectedNode();
- OpenMapsExtension openMapsExtension = (OpenMapsExtension) node.getExtension(OpenMapsExtension.class);
-
- if (openMapsExtension != null) {
- map = new OpenMapsDialog();
- map.showZoomToLocation(openMapsExtension.getLocation(), openMapsExtension.getZoom());
- }
-
- }
-
- @Override
- protected HookAction createHookAction() {
- return null;
- }
-
- @Override
- protected IExtension createExtension(final NodeModel node, final XMLElement element) {
- final OpenMapsExtension extension = new OpenMapsExtension();
- loadLocationFromXML(element, extension);
- return (IExtension) extension;
- }
-
- @Override
- protected Class<OpenMapsExtension> getExtensionClass() {
- return OpenMapsExtension.class;
- }
-
- @Override
- protected void saveExtension(final IExtension extension, final XMLElement element) {
- final OpenMapsExtension openMapsExtension = (OpenMapsExtension) extension;
- element.setAttribute("LAT", Double.toString(openMapsExtension.getLocation().getLat()));
- element.setAttribute("LON", Double.toString(openMapsExtension.getLocation().getLon()));
- element.setAttribute("ZOOM", Integer.toString(openMapsExtension.getZoom()));
- super.saveExtension(extension, element);
- }
-
- private void loadLocationFromXML(final XMLElement element, final OpenMapsExtension extension) {
- if (element != null) {
- final double location_x = Double.parseDouble(element.getAttribute("LAT", null));
- final double location_y = Double.parseDouble(element.getAttribute("LON", null));
- final int zoom = Integer.parseInt(element.getAttribute("ZOOM",null));
- extension.updateLocation(location_x, location_y);
- extension.updateZoom(zoom);
- }
- }
-
- private void addChoosenLocationToSelectedNode(Coordinate locationChoosen, int zoom) {
- final NodeModel node = getCurrentlySelectedNode();
- OpenMapsExtension openMapsExtension = (OpenMapsExtension) node.getExtension(OpenMapsExtension.class);
-
- if (openMapsExtension == null) {
- openMapsExtension = new OpenMapsExtension();
- undoableActivateHook(node, openMapsExtension);
- }
- setLocationChoiceUndoable(openMapsExtension, locationChoosen, zoom);
- refreshNode(node);
- }
-
- private void setLocationChoiceUndoable(final OpenMapsExtension extension, final Coordinate locationChoosen, final int zoomChoosen) {
- final Coordinate currentLocation = extension.getLocation();
- final int currentZoom = extension.getZoom();
-
- if (!currentLocation.equals(locationChoosen)) {
- final IActor actor = createUndoActor(extension, locationChoosen,
- currentLocation, zoomChoosen, currentZoom);
-
- Controller.getCurrentModeController().execute(actor,
- Controller.getCurrentModeController().getController()
- .getMap());
- }
- }
-
- private IActor createUndoActor(final OpenMapsExtension extension, final Coordinate newlyChoosenLocation,
- final Coordinate currentlyStoredLocation, final int newlyChoosenZoom , final int currentlyStoredZoom) {
-
- return new IActor() {
- private final Coordinate oldLocation = currentlyStoredLocation;
- private final int oldZoom = currentlyStoredZoom;
-
- public void act() {
- extension.updateLocation(newlyChoosenLocation);
- extension.updateZoom(newlyChoosenZoom);
- final MapModel map = Controller.getCurrentModeController()
- .getController().getMap();
- Controller.getCurrentModeController().getMapController()
- .setSaved(map, false);
- }
-
- public String getDescription() {
- return "setOpenMapsLocationChoiceUndoable";
- }
-
- public void undo() {
- if (oldLocation.getLat() == 500 && oldLocation.getLon() == 500)
- {
- removeLocationFromCurrentlySelectedNode();
- }
- else
- {
- extension.updateLocation(oldLocation);
- extension.updateZoom(oldZoom);
- }
- refreshNode(getCurrentlySelectedNode());
- }
-
- };
- }
-
- private void refreshNode(NodeModel node) {
- Controller.getCurrentModeController().getMapController().nodeChanged(node, NodeModel.UNKNOWN_PROPERTY, null, null);
- }
-
- private NodeModel getCurrentlySelectedNode() {
- return Controller.getCurrentModeController().getMapController().getSelectedNode();
- }
-
- private void registerStateIconProvider() {
- Controller.getCurrentModeController().getExtension(IconController.class).addStateIconProvider
- (new IStateIconProvider () {
- private static final String ICON_NAME = "internet";
-
- public UIIcon getStateIcon(NodeModel node) {
- if (node.getExtension(OpenMapsExtension.class) != null)
- return IconStoreFactory.create().getUIIcon(ICON_NAME);
- else
- return null;
- }
- });
- }
-}
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsRegistration.java b/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsRegistration.java
deleted file mode 100644
index a172d9e..0000000
--- a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/OpenMapsRegistration.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.freeplane.plugin.openmaps;
-
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.plugin.openmaps.actions.InsertOpenMapsAction;
-import org.freeplane.plugin.openmaps.actions.RemoveOpenMapsAction;
-import org.freeplane.plugin.openmaps.actions.ViewOpenMapsAction;
-
-/**
- * @author Blair Archibald
- */
-public class OpenMapsRegistration {
-
- public OpenMapsRegistration(ModeController modeController) {
- final OpenMapsNodeHook nodeHook = new OpenMapsNodeHook();
- if (modeController.getModeName() == "MindMap") {
- modeController.addAction(new InsertOpenMapsAction(nodeHook));
- modeController.addAction(new RemoveOpenMapsAction(nodeHook));
- modeController.addAction(new ViewOpenMapsAction(nodeHook));
- }
- }
-
-}
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/actions/ViewOpenMapsAction.java b/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/actions/ViewOpenMapsAction.java
deleted file mode 100644
index b49c171..0000000
--- a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/actions/ViewOpenMapsAction.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.freeplane.plugin.openmaps.actions;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.plugin.openmaps.OpenMapsNodeHook;
-
-/**
- * @author Blair Archibald
- */
-public class ViewOpenMapsAction extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
- private static final String actionIdentifier = "OpenMapsViewLocation";
-
- final OpenMapsNodeHook nodeHookReference;
-
- public ViewOpenMapsAction(OpenMapsNodeHook nodeHook) {
- super(actionIdentifier);
- nodeHookReference = nodeHook;
- }
-
- public void actionPerformed(ActionEvent event) {
- nodeHookReference.viewCurrentlySelectedLocation();
- }
-}
diff --git a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/mapelements/OpenMapsController.java b/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/mapelements/OpenMapsController.java
deleted file mode 100644
index a3e9cfb..0000000
--- a/freeplane_plugin_openmaps/src/org/freeplane/plugin/openmaps/mapelements/OpenMapsController.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.freeplane.plugin.openmaps.mapelements;
-
-import java.awt.Point;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.freeplane.plugin.openmaps.LocationChoosenListener;
-import org.openstreetmap.gui.jmapviewer.Coordinate;
-import org.openstreetmap.gui.jmapviewer.DefaultMapController;
-import org.openstreetmap.gui.jmapviewer.JMapViewer;
-import org.openstreetmap.gui.jmapviewer.MapMarkerDot;
-import org.openstreetmap.gui.jmapviewer.OsmMercator;
-
-/**
- * @author Blair Archibald
- */
-public class OpenMapsController extends DefaultMapController implements MouseListener {
-
- private Set<LocationChoosenListener> Listeners;
- private int locationCount;
-
- public OpenMapsController(JMapViewer map) {
- super(map);
- configureButtons();
-
- Listeners = new HashSet<LocationChoosenListener>();
- locationCount = 0;
- }
-
- private void configureButtons() {
- this.setDoubleClickZoomEnabled(false);
- this.setMovementMouseButton(1);
- }
-
- @Override
- public void mouseClicked(MouseEvent e) {
- if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
- final Coordinate locationChoosen = getSelectedLocation(e.getPoint());
- if (locationCount < 1) {
- addMarkerToLocation(locationChoosen);
- locationCount++;
- }
- sendLocation(locationChoosen, getCurrentZoomLevel());
- }
- }
-
- public void addLocationChoosenListener(LocationChoosenListener listener) {
- Listeners.add(listener);
- }
-
- public void removeLocationChoosenListener(LocationChoosenListener listener) {
- Listeners.remove(listener);
- }
-
- private void sendLocation(Coordinate locationChoosen, int zoom) {
- for (LocationChoosenListener l : Listeners) {
- l.locationChoosenAction(locationChoosen, zoom);
- }
- }
-
- public Coordinate getSelectedLocation(Point clickedLocation) {
- return map.getPosition(clickedLocation);
- }
-
- public int getCurrentZoomLevel() {
- return map.getZoom();
- }
-
- private void addMarkerToLocation(final Coordinate locationChoosen) {
- map.addMapMarker(new MapMarkerDot(locationChoosen.getLat(), locationChoosen.getLon()));
- }
-
- public void zoomToLocation(Coordinate location, int zoom) {
- if(locationCount == 0) {
- addMarkerToLocation(location);
- locationCount++;
- }
-
- // this method is not available in JMapViewer >= 1.03!
-// map.setDisplayPositionByLatLon(new Point(map.getWidth() / 2, map.getHeight() / 2), location.getLat(), location.getLon(), zoom);
-
- int x = (int)OsmMercator.LonToX(location.getLon(), zoom);
- int y = (int)OsmMercator.LatToY(location.getLat(), zoom);
- map.setDisplayPosition(new Point(map.getWidth() / 2, map.getHeight() / 2), x, y, zoom);
- }
-
-}
diff --git a/freeplane_plugin_script/.classpath b/freeplane_plugin_script/.classpath
deleted file mode 100644
index d4b8973..0000000
--- a/freeplane_plugin_script/.classpath
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry exported="true" kind="lib" path="lib/groovy-all.jar"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="src" path="resources-jsyntaxpane"/>
- <classpathentry kind="src" path="src-jsyntaxpane"/>
- <classpathentry kind="lib" path="/freeplane/lib/forms-1.2.1.jar"/>
- <classpathentry kind="lib" path="lib/jsyntaxpane.jar"/>
- <classpathentry exported="true" kind="lib" path="/freeplane/lib/jortho.jar"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_plugin_script/.project b/freeplane_plugin_script/.project
deleted file mode 100644
index b5f3eee..0000000
--- a/freeplane_plugin_script/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_script</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_script/.settings/org.eclipse.core.runtime.prefs b/freeplane_plugin_script/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index 3a9a089..0000000
--- a/freeplane_plugin_script/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:34 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/freeplane_plugin_script/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_script/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 53d42b7..0000000
--- a/freeplane_plugin_script/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-#Thu Feb 09 21:21:17 CET 2012
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/freeplane_plugin_script/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_script/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 16a669c..0000000
--- a/freeplane_plugin_script/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Sun Jan 04 22:58:46 CET 2009
-eclipse.preferences.version=1
-pluginProject.equinox=false
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/freeplane_plugin_script/META-INF/MANIFEST.MF b/freeplane_plugin_script/META-INF/MANIFEST.MF
deleted file mode 100644
index 97b12b5..0000000
--- a/freeplane_plugin_script/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.plugin.script
-Bundle-SymbolicName: org.freeplane.plugin.script
-Bundle-Version: 1.3.1
-Bundle-Activator: org.freeplane.plugin.script.Activator
-Import-Package: org.osgi.framework;version="1.3.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Require-Bundle: org.freeplane.core;bundle-version="1.0.1"
-Bundle-ClassPath: lib/plugin.jar,
- lib/jsyntaxpane.jar,
- lib/groovy-all.jar
-Export-Package: jsyntaxpane,
- jsyntaxpane.actions,
- jsyntaxpane.actions.gui,
- jsyntaxpane.components,
- jsyntaxpane.lexers,
- jsyntaxpane.syntaxkits,
- jsyntaxpane.util,
- org.freeplane.plugin.script
diff --git a/freeplane_plugin_script/ant/ant.properties b/freeplane_plugin_script/ant/ant.properties
deleted file mode 100644
index 1630f2a..0000000
--- a/freeplane_plugin_script/ant/ant.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-plugin.ext.lib = lib
-groovy.jar = ${plugin.ext.lib}/groovy-all.jar
-jsyntaxpane.jar = ${plugin.ext.lib}/jsyntaxpane.jar
diff --git a/freeplane_plugin_script/ant/build.xml b/freeplane_plugin_script/ant/build.xml
deleted file mode 100644
index 3c04f7a..0000000
--- a/freeplane_plugin_script/ant/build.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<project name="freeplane_script" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property name="src" value="src" />
- <property name="root" value="." />
- <property name="osgimanifest" value="${root}/META-INF/MANIFEST.MF" />
- <property name="xslt.base" value="${workspace}/freeplane/resources/xslt" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="ant/ant.properties" />
- <property name="external.jars" value="${commons-lang.jar}:${commons-io.jar}:${forms.jar}:${SimplyHTML.jar}:${groovy.jar}" />
- <property name="dist.osgi.dir" value="dist/org.freeplane.plugin.script" />
- <property name="freeplaneplugin.jar" value="dist/org.freeplane.plugin.script.jar" />
- <property name="src.pluginclass" value="${src}/org/freeplane/plugin/script/"/>
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${framework.jar}:${freeplane.jars}:${external.jars}:${jsyntaxpane.jar}" />
- <property name="apidocdir" value="dist/doc/api" />
-
- <target name="build" depends="build-ui-xml">
- <mkdir dir="build" />
- <javac srcdir="src" destdir="build" classpath="${classpath}" debug="${debug}" source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- <exclude name="**/*Test.*" />
- </javac>
- <javac srcdir="src-jsyntaxpane" destdir="build" classpath="${classpath}" debug="${debug}" source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- </javac>
- </target>
-
- <target name="build-ui-xml">
- <xslt in="${src.pluginclass}/preferences.mm"
- style="${xslt.base}/mm2preferences.xsl"
- out="${src.pluginclass}/preferences.xml"/>
- </target>
-
- <target name="dist" depends="build">
- <jar jarfile="lib/plugin.jar">
- <fileset dir="build" />
- <fileset dir="resources-jsyntaxpane" />
- <fileset dir="src">
- <include name="**/*.xml" />
- <include name="**/*.properties" />
- <exclude name="**/preferences.mm" />
- </fileset>
- </jar>
- <delete dir="${dist.osgi.dir}" quiet="true" />
- <mkdir dir="${dist.osgi.dir}" />
- <copy todir="${dist.osgi.dir}">
- <fileset dir="${root}">
- <include name="lib/**" />
- </fileset>
- </copy>
- <copy todir="dist/scripts">
- <fileset dir="${root}/scripts">
- <include name="**/*" />
- </fileset>
- </copy>
- <mkdir dir="${dist.osgi.dir}/META-INF" />
- <copy tofile="${dist.osgi.dir}/META-INF/MANIFEST.MF" file="${osgimanifest}" />
- <delete file="lib/plugin.jar" quiet="true" />
- </target>
-
- <target name="api">
- <mkdir dir="${apidocdir}" />
- <javadoc destdir="${apidocdir}" overview="src/overview.html" access="public" classpath="${classpath}:build">
- <sourcefiles>
- <fileset dir="${root}">
- <include name="**/Proxy.java" />
- <include name="**/Convertible.java" />
- <include name="**/FreeplaneScriptBaseClass.java" />
- <include name="**/ScriptUtils.java" />
- </fileset>
- <fileset dir="${workspace}/freeplane">
- <include name="**/UITools.java" />
- <include name="**/TextUtils.java" />
- <include name="**/FreeplaneVersion.java" />
- <include name="**/HtmlUtils.java" />
- <include name="**/LogUtils.java" />
- <include name="**/MenuUtils.java" />
- </fileset>
- </sourcefiles>
- </javadoc>
- <zip destfile="dist/script-api.zip" basedir="dist/doc/api" />
- </target>
-
- <target name="osgi_dist_as_jar" depends="dist">
- <jar jarfile="${freeplaneplugin.jar}">
- <fileset dir="${dist.osgi.dir}">
- <include name="**" />
- </fileset>
- </jar>
- </target>
-
- <target name="test">
- <junit>
- <classpath path="${classpath}:${workspace}/freeplane_ant/lib/junit.jar:${workspace}/freeplane_uitest/bin" />
- <formatter type="brief" usefile="false" />
- <batchtest>
- <fileset dir="${workspace}/freeplane_uitest/bin" includes="**/*Test.class" excludes="**/FreeplaneFirstTest.class" />
- </batchtest>
- </junit>
- <fail message="test failed" if="test.failure" />
- </target>
-
- <target name="clean">
- <delete dir="build" quiet="true" />
- <delete dir="build-nodehighlighter" quiet="true" />
- <delete dir="dist" quiet="true" />
- <delete>
- <fileset defaultexcludes="no" dir="src" includes="**/*~" />
- </delete>
- <delete file="lib/jsyntaxpane/nodehighlighter.jar" quiet="true"/>
- <delete file="${src.pluginclass}/preferences.xml" quiet="true"/>
- </target>
-
-</project>
-
diff --git a/freeplane_plugin_script/build.gradle b/freeplane_plugin_script/build.gradle
new file mode 100644
index 0000000..821c09b
--- /dev/null
+++ b/freeplane_plugin_script/build.gradle
@@ -0,0 +1,90 @@
+dependencies {
+ compile project(':freeplane')
+ compile project(':freeplane_plugin_jsyntaxpane')
+ compile group: 'org.codehaus.groovy', name: 'groovy-all', version:'2.3.1'
+}
+
+jar {
+ manifest {
+ name = pluginid
+ symbolicName = pluginid
+
+ configurations.runtime.transitive = false
+ def deps = filterAndExternalizePluginDependencies(configurations.runtime.files)
+ deps.add(0, "lib/plugin-" + project.version + '.jar')
+
+ attributes 'Class-Path': deps.join(', ')
+ attributes 'Bundle-ClassPath': '., ' + deps.join(', ')
+
+ instruction 'Bundle-Vendor', 'Freeplane Project'
+ instruction 'Bundle-Activator', pluginid + ".Activator"
+ instruction 'Bundle-RequiredExecutionEnvironment', 'JavaSE-1.6'
+
+ def imports = """\
+ org.osgi.framework;version="1.3.0",
+ ${project(':freeplane').jar.manifest.attributes.get('Export-Package')},
+ ${project(':freeplane_plugin_jsyntaxpane').jar.manifest.attributes.get('Export-Package')}
+ """
+ instruction 'Import-Package', imports.replaceAll("\\s+", "")
+ // avoid that bnd creates Private-Package: for org.freeplane.plugin.script.*!
+ instruction 'Private-Package', ''
+
+ def exports = """\
+ org.freeplane.plugin.script,
+ org.freeplane.plugin.script.addons,
+ org.freeplane.plugin.script.filter,
+ org.freeplane.plugin.script.proxy
+ """
+ // bnd f**cks up the exports, so we bypass it using attributes!
+ attributes 'Export-Package': exports.replaceAll("\\s+", "")
+
+ // Require-Bundle is ignored by bnd => replaced by Import-Package!
+ //instruction 'Require-Bundle', 'org.freeplane.core;bundle-version="1.0.1"'
+ }
+}
+
+task copyScripts(type: Copy) {
+ from('scripts/') {
+ include('**')
+ }
+ into(globalBuild + '/scripts')
+}
+
+javadoc {
+ enabled = true
+
+ // we need source from both this and the freeplane project!
+ // source = sourceSets.main.allJava
+
+ ext.javadocInputFromThisProject = fileTree(dir: 'src/main/java')
+ .include('**/Proxy.java')
+ .include('**/Convertible.java')
+ .include('**/FreeplaneScriptBaseClass.java')
+ .include('**/ScriptUtils.java')
+ ext.javadocInputFromFreeplaneProject = fileTree(dir: '../freeplane/src/main/java')
+ .include('**/UITools.java')
+ .include('**/TextUtils.java')
+ .include('**/FreeplaneVersion.java')
+ .include('**/HtmlUtils.java')
+ .include('**/LogUtils.java')
+ .include('**/MenuUtils.java')
+
+ source = ext.javadocInputFromThisProject + ext.javadocInputFromFreeplaneProject
+ destinationDir = new File(globalBuild + '/doc/api/')
+}
+
+// TODO: this doesn't work yet!
+/*
+task zipJavadoc(type: Zip) {
+ baseName = 'scripting-api'
+ from (globalBuild + '/doc/api/') {
+ include('**')
+ }
+ destinationDir = new File(globalBuild)
+ dependsOn javadoc
+}
+*/
+
+build.dependsOn copyScripts
+build.dependsOn javadoc
+//build.dependsOn zipJavadoc
diff --git a/freeplane_plugin_script/lib/groovy-all-LICENSE.txt b/freeplane_plugin_script/lib/groovy-all-LICENSE.txt
deleted file mode 100644
index 2842b02..0000000
--- a/freeplane_plugin_script/lib/groovy-all-LICENSE.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
\ No newline at end of file
diff --git a/freeplane_plugin_script/scripts/apiGenerator.groovy b/freeplane_plugin_script/scripts/apiGenerator.groovy
index fffa1f6..24a9ac8 100644
--- a/freeplane_plugin_script/scripts/apiGenerator.groovy
+++ b/freeplane_plugin_script/scripts/apiGenerator.groovy
@@ -16,7 +16,8 @@ import org.freeplane.core.util.TextUtils
import org.freeplane.plugin.script.FreeplaneScriptBaseClass
import org.freeplane.plugin.script.proxy.Convertible
import org.freeplane.plugin.script.proxy.Proxy
-import org.freeplane.plugin.script.proxy.ScriptUtils;
+import org.freeplane.plugin.script.proxy.ScriptUtils
+import org.freeplane.core.resources.ResourceController
// FIXME: api is installed locally but is there a portable way to find it?
@@ -225,7 +226,10 @@ def UTILITES_NODE = textUtils.getText('scripting_api_generator_utilities')
def WEB_NODE = textUtils.getText('scripting_api_generator_web')
def LEGEND_NODE = textUtils.getText('scripting_api_generator_legend')
c.deactivateUndo()
-Proxy.Map newMap = c.newMap()
+def resourceBaseDir = ResourceController.resourceController.resourceBaseDir;
+def allUserTemplates = new File(resourceBaseDir, 'templates');
+def defaultTemplate = new File(allUserTemplates, 'standard.mm')
+Proxy.Map newMap = defaultTemplate.canRead() ? c.newMapFromTemplate(defaultTemplate) : c.newMap()
def oldName = newMap.name
newMap.name = MAP_NAME
newMap.root.text = MAP_NAME
@@ -264,7 +268,6 @@ makeApi(utils, LogUtils.class)
def web = createChild(newMap.root, WEB_NODE, 'http://freeplane.sourceforge.net/wiki/index.php/Scripting')
initHeading(web)
createChild(web, 'Groovy tutorials (Codehaus)', 'http://groovy.codehaus.org/Beginners+Tutorial')
-createChild(web, 'Groovy presentation (Paul King)', 'http://www.asert.com/pubs/Groovy/Groovy.pdf')
createChild(web, 'Example scripts', 'http://freeplane.sourceforge.net/wiki/index.php/Scripting:_Example_scripts')
createChild(web, 'Scripting API changes', 'http://freeplane.sourceforge.net/wiki/index.php/Scripting:_API_Changes')
diff --git a/freeplane_plugin_script/scripts/installScriptAddOn.groovy b/freeplane_plugin_script/scripts/installScriptAddOn.groovy
index 46bf626..44c1a7a 100644
--- a/freeplane_plugin_script/scripts/installScriptAddOn.groovy
+++ b/freeplane_plugin_script/scripts/installScriptAddOn.groovy
@@ -8,33 +8,26 @@
import groovy.swing.SwingBuilder
-import java.awt.Component;
import java.awt.Dimension
import java.awt.FlowLayout
import java.awt.Toolkit
-import java.awt.event.KeyEvent
+import java.awt.event.ActionEvent;
import java.util.zip.ZipInputStream
import javax.swing.BoxLayout
-import javax.swing.JDialog;
-import javax.swing.JMenuItem
import javax.swing.JOptionPane
import javax.swing.KeyStroke
-import javax.swing.tree.DefaultMutableTreeNode
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.StringUtils
import org.apache.commons.lang.WordUtils
import org.freeplane.core.resources.ResourceController
-import org.freeplane.core.ui.MenuBuilder
+import org.freeplane.core.ui.AFreeplaneAction;
import org.freeplane.core.util.FreeplaneVersion
-import org.freeplane.core.util.MenuUtils
import org.freeplane.core.util.TextUtils
import org.freeplane.features.mode.Controller
import org.freeplane.main.addons.AddOnProperties
import org.freeplane.main.addons.AddOnsController
-import org.freeplane.plugin.script.ExecuteScriptAction
-import org.freeplane.plugin.script.ScriptResources;
-import org.freeplane.plugin.script.ScriptingEngine
+import org.freeplane.plugin.script.ExecuteScriptAction;
import org.freeplane.plugin.script.ScriptingPermissions
import org.freeplane.plugin.script.addons.AddOnDetailsPanel
import org.freeplane.plugin.script.addons.ScriptAddOnProperties
@@ -320,54 +313,12 @@ void createKeyboardShortcut(ScriptAddOnProperties.Script script) {
// check key syntax
KeyStroke newKeyStroke = ui.getKeyStroke(newShortcut)
mapStructureAssert(newKeyStroke, textUtils.format('addons.installer.invalid.keyboard.shortcut', newShortcut))
- // check if key is used (see AccelerateableAction.newAccelerator())
String menuItemKey = ExecuteScriptAction.makeMenuItemKey(script.menuTitleKey, script.executionMode)
- String shortcutKey = MenuUtils.makeAcceleratorKey(menuItemKey)
- String oldShortcut = ResourceController.getResourceController().getProperty(shortcutKey);
- if (oldShortcut) {
- // script had been installed before
- if (oldShortcut.equals(newShortcut) || !askIfNewFunctionWasAssignedToAnotherShortcut(oldShortcut))
- return
- // FIXME: improved message would be:
- // insertInlineImage.groovy currently is assigned the shortcut xy\nReplace this assignment by yz?
- }
- else {
- MenuBuilder menuBuilder = Controller.currentModeController.userInputListenerFactory.menuBuilder
- // it's a long way to the menu item title
- DefaultMutableTreeNode menubarNode = menuBuilder.getMenuBar(menuBuilder.get("main_menu_scripting"));
- assert menubarNode != null : "can't find menubar"
- def priorAssigned = MenuUtils.findAssignedMenuItemNodeRecursively(menubarNode, newKeyStroke);
- if (priorAssigned != null && !priorAssigned.getKey().equals(menuItemKey)) {
- if (askIfNewShortcutWasAssignedToAnotherFunction(((JMenuItem) priorAssigned.getUserObject()).getText())) {
- String priorShortcutKey = menuBuilder.getShortcutKey(priorAssigned.getKey().toString());
- if (priorShortcutKey)
- ResourceController.getResourceController().setProperty(priorShortcutKey, "")
- }
- else {
- return
- }
- }
- }
- debugPrintln "set keyboardShortcut $shortcutKey to $newShortcut"
- ResourceController.getResourceController().setProperty(shortcutKey, newShortcut)
-}
-
-String keyStrokeToString(KeyStroke keyStroke) {
- return keyStroke.toString().replaceFirst("pressed ", "");
-}
-
-private boolean askIfNewShortcutWasAssignedToAnotherFunction(String currentAssignee) {
- int replace = JOptionPane.showConfirmDialog(ui.frame,
- TextUtils.format("replace_shortcut_question", currentAssignee),
- TextUtils.getText("replace_shortcut_title"), JOptionPane.YES_NO_OPTION);
- return replace == JOptionPane.YES_OPTION;
-}
-
-private boolean askIfNewFunctionWasAssignedToAnotherShortcut(String oldShortcut) {
- // this is a irritating dialog but we can't change it before the 1.2 release
- int replace = JOptionPane.showConfirmDialog(ui.frame, oldShortcut,
- TextUtils.getText("remove_shortcut_question"), JOptionPane.YES_NO_OPTION);
- return replace == JOptionPane.YES_OPTION;
+ def action = new AFreeplaneAction(menuItemKey, menuItemKey, null) {
+ public void actionPerformed(ActionEvent e) {}
+ };
+ def acceleratorManager = Controller.currentModeController.userInputListenerFactory.acceleratorManager
+ acceleratorManager.newAccelerator(action, newKeyStroke)
}
ScriptingPermissions parsePermissions(Proxy.Node propertyNode, String scriptName) {
@@ -502,7 +453,7 @@ AddOnProperties parse() {
boolean confirmInstall(ScriptAddOnProperties addOn, ScriptAddOnProperties installedAddOn) {
def screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- def dialogPrefSize = new Dimension((int) screenSize.getWidth() * 3 / 5, (int) screenSize.getHeight() * 1 / 2);
+ def dialogPrefSize = new Dimension((int) (screenSize.getWidth() * 3 / 5), (int) (screenSize.getHeight() * 1 / 2));
def warning = textUtils.removeTranslateComment(textUtils.getText('addons.installer.warning'))
def addOnDetailsPanel = new AddOnDetailsPanel(addOn, warning)
addOnDetailsPanel.maxWidth = 500
diff --git a/freeplane_plugin_script/src/groovy/runtime/metaclass/java/lang/StringMetaClass.java b/freeplane_plugin_script/src/main/java/groovy/runtime/metaclass/java/lang/StringMetaClass.java
similarity index 100%
rename from freeplane_plugin_script/src/groovy/runtime/metaclass/java/lang/StringMetaClass.java
rename to freeplane_plugin_script/src/main/java/groovy/runtime/metaclass/java/lang/StringMetaClass.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/Activator.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/Activator.java
new file mode 100644
index 0000000..eccad0e
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/Activator.java
@@ -0,0 +1,33 @@
+package org.freeplane.plugin.script;
+
+import java.util.Hashtable;
+
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.main.osgi.IModeControllerExtensionProvider;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+public class Activator implements BundleActivator {
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
+ */
+ public void start(final BundleContext context) throws Exception {
+ final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
+ props.put("mode", new String[] { MModeController.MODENAME });
+ context.registerService(IModeControllerExtensionProvider.class.getName(),
+ new IModeControllerExtensionProvider() {
+ public void installExtension(ModeController modeController) {
+ new ScriptingRegistration(modeController);
+ }
+ }, props);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
+ */
+ public void stop(final BundleContext context) throws Exception {
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/CompileTimeStrategy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/CompileTimeStrategy.java
new file mode 100644
index 0000000..110bce7
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/CompileTimeStrategy.java
@@ -0,0 +1,73 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2013 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.File;
+
+/**
+ * @author Dimitry Polivaev
+ * 15.12.2013
+ */
+public class CompileTimeStrategy {
+ private static final long FILE_CHECK_PERIOD = 100;
+ private static final long NEVER = 0;
+ private final File scriptFile;
+ private long compileTime;
+ private long fileModificationTime;
+ private long lastFileStampCheckTime;
+
+ public CompileTimeStrategy(File scriptFile) {
+ this.scriptFile = scriptFile;
+ compileTime = NEVER;
+ fileModificationTime = NEVER;
+ lastFileStampCheckTime = NEVER;
+ }
+
+ /** mark the beginning of a script compile run */
+ public void scriptCompileStart() {
+ compileTime = NEVER;
+ }
+
+ /** mark the end of a successful script compile run */
+ public void scriptCompiled() {
+ assert (compileTime == NEVER);
+ compileTime = now();
+ }
+
+ private long now() {
+ return System.currentTimeMillis();
+ }
+
+ public boolean canUseOldCompiledScript() {
+ if (compileTime == NEVER)
+ return false;
+ if (scriptFile == null)
+ return true;
+ long now = now();
+ if (now - lastFileStampCheckTime < FILE_CHECK_PERIOD)
+ return true;
+ lastFileStampCheckTime = now;
+ if (!scriptFile.canRead())
+ return false;
+ fileModificationTime = scriptFile.lastModified();
+ boolean canUseOldCompiledScript = compileTime >= fileModificationTime;
+ return canUseOldCompiledScript;
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/EvaluationDependencies.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/EvaluationDependencies.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/EvaluationDependencies.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/EvaluationDependencies.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ExecuteScriptAction.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ExecuteScriptAction.java
new file mode 100644
index 0000000..984c642
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ExecuteScriptAction.java
@@ -0,0 +1,147 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Volker Boerchers
+ *
+ * This file author is Volker Boerchers
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.awt.event.ActionEvent;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+
+/**
+ * Action that executes a script defined by filename.
+ *
+ * @author vboerchers
+ */
+public class ExecuteScriptAction extends AFreeplaneAction {
+ private static final long serialVersionUID = 1L;
+
+ /** controls how often a script is executed in case of a multi selection. */
+ public enum ExecutionMode {
+ /** once with <code>node</code> set to one selected (random) node. */
+ ON_SINGLE_NODE,
+ /** n times for n selected nodes, once for each node. */
+ ON_SELECTED_NODE,
+ /** script on every selected node and recursively on all of its children. */
+ ON_SELECTED_NODE_RECURSIVELY
+ }
+
+ private final File scriptFile;
+ private final ExecutionMode mode;
+ private final IScript script;
+
+ public ExecuteScriptAction(final String scriptName, final String menuItemName, final String scriptFile,
+ final ExecutionMode mode, ScriptingPermissions permissions) {
+ super(ExecuteScriptAction.makeMenuItemKey(scriptName, mode), menuItemName, null);
+ this.scriptFile = new File(scriptFile);
+ this.mode = mode;
+ script = ScriptingEngine.createScriptForFile(this.scriptFile, permissions);
+ }
+
+ public static String makeMenuItemKey(final String scriptName, final ExecutionMode mode) {
+ return scriptName + "_" + mode.toString().toLowerCase();
+ }
+
+ @Override
+ public void actionPerformed(final ActionEvent e) {
+ Controller.getCurrentController().getViewController().setWaitingCursor(true);
+ try {
+ final List<NodeModel> nodes = new ArrayList<NodeModel>();
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ if (mode == ExecutionMode.ON_SINGLE_NODE) {
+ nodes.add(selection.getSelected());
+ }
+ else {
+ nodes.addAll(selection.getSelection());
+ }
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ modeController.startTransaction();
+ for (final NodeModel node : nodes) {
+ try {
+ if (mode == ExecutionMode.ON_SELECTED_NODE_RECURSIVELY) {
+ // TODO: ensure that a script is invoked only once on every node?
+ // (might be a problem with recursive actions if parent and child
+ // are selected.)
+ executeScriptRecursive(node);
+ }
+ else {
+ script.execute(node);
+ }
+ }
+ catch (ExecuteScriptException ex) {
+ final String cause;
+ // The ExecuteScriptException should have a cause. Print
+ // that, it is what we want to know.
+ if (ex.getCause() != null) {
+ if (ex.getCause().getCause() != null) {
+ LogUtils.warn("ExecuteScriptAction failed:", ex.getCause().getCause());
+ cause = ex.getCause().getCause().toString();
+ } else {
+ LogUtils.warn("ExecuteScriptAction failed:", ex.getCause());
+ cause = ex.getCause().toString();
+ }
+ }
+ else {
+ LogUtils.warn("ExecuteScriptAction failed:", ex);
+ cause = ex.toString();
+ }
+ LogUtils.warn("error executing script " + scriptFile + " - giving up\n" + cause);
+ modeController.delayedRollback();
+ ScriptingEngine.showScriptExceptionErrorMessage(ex);
+ return;
+ }
+ }
+ modeController.delayedCommit();
+ }
+ finally {
+ Controller.getCurrentController().getViewController().setWaitingCursor(false);
+ }
+ }
+
+ private void executeScriptRecursive(final NodeModel node) {
+ ModeController modeController = Controller.getCurrentModeController();
+ final NodeModel[] children = modeController.getMapController().childrenUnfolded(node)
+ .toArray(new NodeModel[] {});
+ for (final NodeModel child : children) {
+ executeScriptRecursive(child);
+ }
+ script.execute(node);
+ }
+
+ public ExecutionMode getExecutionMode() {
+ return mode;
+ }
+
+ public File getScriptFile() {
+ return scriptFile;
+ }
+
+ @Override
+ public String toString() {
+ return "ExecuteScriptAction(" + scriptFile + ", " + mode + ")";
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptException.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ExecuteScriptException.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptException.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ExecuteScriptException.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForAllNodes.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ExecuteScriptForAllNodes.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForAllNodes.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ExecuteScriptForAllNodes.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForSelectionAction.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ExecuteScriptForSelectionAction.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptForSelectionAction.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ExecuteScriptForSelectionAction.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/FormulaUtils.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/FormulaUtils.java
new file mode 100644
index 0000000..0367401
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/FormulaUtils.java
@@ -0,0 +1,172 @@
+package org.freeplane.plugin.script;
+
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.plugin.script.proxy.FormulaCache;
+
+public class FormulaUtils {
+ // don't let caching use too much memory - but currently there are little means to cope with unavailable
+ // dependency data. It has to be tested but it should "only" lead to some missing updates.
+ private static final boolean ENABLE_CACHING = !Controller.getCurrentController().getResourceController()
+ .getBooleanProperty("formula_disable_caching");
+ static final boolean DEBUG_FORMULA_EVALUATION = false;
+
+ /** evaluate text as a script if it starts with '='.
+ * @return the evaluation result for script and the original text otherwise
+ * @throws ExecuteScriptException */
+ public static Object evalIfScript(final NodeModel nodeModel, ScriptContext scriptContext, final String text){
+ if (containsFormula(text)) {
+ scriptContext = (scriptContext == null) ? new ScriptContext() : scriptContext;
+ return eval(nodeModel, scriptContext, text.substring(1));
+ }
+ else {
+ return text;
+ }
+ }
+
+ public static Object safeEvalIfScript(final NodeModel nodeModel, ScriptContext scriptContext, String text) {
+ try {
+ return evalIfScript(nodeModel, scriptContext, text);
+ }
+ catch (Exception e) {
+ LogUtils.info("could not interpret as a formula (ignored): " + text + " due to " + e.getMessage());
+ return text;
+ }
+ }
+
+ public static boolean containsFormula(final String text) {
+ // ignore == and => since these are often used in text
+ return startsWithEqualSign(text) && secondCharIsntSpecial(text.charAt(1));
+ }
+
+ private static boolean startsWithEqualSign(final String text) {
+ return text != null && text.length() > 2 && text.charAt(0) == '=';
+ }
+
+ private static boolean secondCharIsntSpecial(char secondChar) {
+ return secondChar != '=' && secondChar != '>';
+ }
+
+ public static boolean containsFormulaCheckHTML(String text) {
+ if(HtmlUtils.isHtmlNode(text))
+ return htmlContainsFormula(text);
+ else
+ return containsFormula(text);
+ }
+
+ private static Pattern FIRST_CHARACTER_IN_HTML = Pattern.compile("(?m)>\\s*[^<\\s]");
+ private static boolean htmlContainsFormula(String text) {
+ final Matcher matcher = FIRST_CHARACTER_IN_HTML.matcher(text);
+ return matcher.find() && text.charAt(matcher.end()-1) == '=';
+ }
+
+ /** evaluate text as a script.
+ * @return the evaluation result.
+ * @throws ExecuteScriptException */
+ public static Object eval(final NodeModel nodeModel, final ScriptContext scriptContext, final String text) {
+ if (DEBUG_FORMULA_EVALUATION)
+ System.err.println("eval " + nodeModel.getID() + ": " + text);
+ if (!scriptContext.push(nodeModel, text)) {
+ throw new StackOverflowError(TextUtils.format("formula.error.circularReference",
+ HtmlUtils.htmlToPlain(scriptContext.getStackFront().getText())));
+ }
+ final ScriptingPermissions restrictedPermissions = ScriptingPermissions.getFormulaPermissions();
+ try {
+ if (ENABLE_CACHING) {
+ final FormulaCache formulaCache = getFormulaCache(nodeModel.getMap());
+ Object value = formulaCache.get(nodeModel, text);
+ if (value == null) {
+ try {
+ value = ScriptingEngine.executeScript(nodeModel, text, scriptContext, restrictedPermissions);
+ formulaCache.put(nodeModel, text, value);
+ if (DEBUG_FORMULA_EVALUATION)
+ System.err.println("eval: cache miss: recalculated: " + text);
+ }
+ catch (ExecuteScriptException e) {
+ formulaCache.put(nodeModel, text, e);
+ if (DEBUG_FORMULA_EVALUATION)
+ System.err.println("eval: cache miss: exception for: " + text);
+ throw e;
+ }
+ }
+ else {
+ if (DEBUG_FORMULA_EVALUATION)
+ System.err.println("eval: cache hit for: " + text);
+ scriptContext.accessNode(nodeModel);
+ }
+ return value;
+ }
+ else {
+ return ScriptingEngine.executeScript(nodeModel, text, scriptContext, restrictedPermissions);
+ }
+ }
+ finally {
+ scriptContext.pop();
+ }
+ }
+
+ public static List<NodeModel> manageChangeAndReturnDependencies(boolean includeChanged, final NodeModel... nodes) {
+ final ArrayList<NodeModel> dependencies = new ArrayList<NodeModel>();
+ for (int i = 0; i < nodes.length; i++) {
+ final LinkedHashSet<NodeModel> nodeDependencies = new LinkedHashSet<NodeModel>(0);
+ getEvaluationDependencies(nodes[i].getMap()).getDependencies(nodeDependencies, nodes[i]);
+ if (nodeDependencies != null)
+ dependencies.addAll(nodeDependencies);
+ if (includeChanged)
+ dependencies.add(nodes[i]);
+ }
+ if (ENABLE_CACHING) {
+ for (NodeModel nodeModel : dependencies) {
+ getFormulaCache(nodeModel.getMap()).markAsDirtyIfFormulaNode(nodeModel);
+ }
+ }
+ return dependencies;
+ }
+
+ private static FormulaCache getFormulaCache(MapModel map) {
+ FormulaCache formulaCache = (FormulaCache) map.getExtension(FormulaCache.class);
+ if (formulaCache == null) {
+ formulaCache = new FormulaCache();
+ map.addExtension(formulaCache);
+ }
+ return formulaCache;
+ }
+
+ private static EvaluationDependencies getEvaluationDependencies(MapModel map) {
+ EvaluationDependencies dependencies = (EvaluationDependencies) map.getExtension(EvaluationDependencies.class);
+ if (dependencies == null) {
+ dependencies = new EvaluationDependencies();
+ map.addExtension(dependencies);
+ }
+ return dependencies;
+ }
+
+ public static void accessNode(NodeModel accessingNode, NodeModel accessedNode) {
+ getEvaluationDependencies(accessingNode.getMap()).accessNode(accessingNode, accessedNode);
+ }
+
+ public static void accessBranch(NodeModel accessingNode, NodeModel accessedNode) {
+ getEvaluationDependencies(accessingNode.getMap()).accessBranch(accessingNode, accessingNode);
+ }
+
+ public static void accessAll(NodeModel accessingNode) {
+ getEvaluationDependencies(accessingNode.getMap()).accessAll(accessingNode);
+ }
+
+ public static void clearCache(MapModel map) {
+ if (DEBUG_FORMULA_EVALUATION)
+ System.out.println("clearing formula cache for " + map.getTitle());
+ map.removeExtension(FormulaCache.class);
+ map.removeExtension(EvaluationDependencies.class);
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/FreeplaneScriptBaseClass.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/FreeplaneScriptBaseClass.java
new file mode 100644
index 0000000..2399c48
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/FreeplaneScriptBaseClass.java
@@ -0,0 +1,287 @@
+package org.freeplane.plugin.script;
+
+import groovy.lang.Binding;
+import groovy.lang.MetaClass;
+import groovy.lang.MissingMethodException;
+import groovy.lang.MissingPropertyException;
+import groovy.lang.Script;
+
+import java.net.URI;
+import java.util.Date;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+import java.util.ResourceBundle;
+import java.util.regex.Pattern;
+
+import org.codehaus.groovy.runtime.DefaultGroovyMethods;
+import org.codehaus.groovy.runtime.InvokerHelper;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.MenuUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.format.ScannerController;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.plugin.script.proxy.Convertible;
+import org.freeplane.plugin.script.proxy.Proxy;
+
+/** All methods of this class are available as "global" methods in every script.
+ * Only documented methods are meant to be used in scripts.
+ * <p>The following global objects are provided as shortcuts by the binding of this class:
+ * <ul>
+ * <li><b>ui:</b> see {@link UITools}</li>
+ * <li><b>logger:</b> see {@link LogUtils}</li>
+ * <li><b>htmlUtils:</b> see {@link HtmlUtils}</li>
+ * <li><b>textUtils:</b> see {@link TextUtils}</li>
+ * <li><b>menuUtils:</b> see {@link MenuUtils}</li>
+ * <li><b>config:</b> see {@link ConfigProperties}</li>
+ * </ul>
+ * The following classes may also be useful in scripting:
+ * <ul>
+ * <li>{@link FreeplaneVersion}</li>
+ * </ul>
+ */
+public abstract class FreeplaneScriptBaseClass extends Script {
+ /**
+ * Accessor for Freeplane's configuration: In scripts available
+ * as "global variable" <code>config</code>.
+ */
+ public static class ConfigProperties {
+ public boolean getBooleanProperty(final String name) {
+ return ResourceController.getResourceController().getBooleanProperty(name);
+ }
+
+ public double getDoubleProperty(final String name, final double defaultValue) {
+ return ResourceController.getResourceController().getDoubleProperty(name, defaultValue);
+ }
+
+ public int getIntProperty(final String name) {
+ return ResourceController.getResourceController().getIntProperty(name);
+ }
+
+ public int getIntProperty(final String name, final int defaultValue) {
+ return ResourceController.getResourceController().getIntProperty(name, defaultValue);
+ }
+
+ public long getLongProperty(final String name, final int defaultValue) {
+ return ResourceController.getResourceController().getLongProperty(name, defaultValue);
+ }
+
+ public String getProperty(final String name) {
+ return ResourceController.getResourceController().getProperty(name);
+ }
+
+ public String getProperty(final String name, final String defaultValue) {
+ return ResourceController.getResourceController().getProperty(name, defaultValue);
+ }
+
+ public Properties getProperties() {
+ return ResourceController.getResourceController().getProperties();
+ }
+
+ /** support config['key'] from Groovy. */
+ public String getAt(final String name) {
+ return getProperty(name);
+ }
+
+ public ResourceBundle getResources() {
+ return ResourceController.getResourceController().getResources();
+ }
+
+ public String getFreeplaneUserDirectory() {
+ return ResourceController.getResourceController().getFreeplaneUserDirectory();
+ }
+ }
+
+ private final Pattern nodeIdPattern = Pattern.compile("ID_\\d+");
+ private final MetaClass nodeMetaClass;
+ private Map<Object, Object> boundVariables;
+ private Proxy.NodeRO node;
+ private Proxy.ControllerRO controller;
+
+
+ public FreeplaneScriptBaseClass() {
+ super();
+ nodeMetaClass = InvokerHelper.getMetaClass(Proxy.NodeRO.class);
+ // Groovy rocks!
+ DefaultGroovyMethods.mixin(Number.class, NodeArithmeticsCategory.class);
+ initBinding();
+ }
+
+ @SuppressWarnings("unchecked")
+ public void initBinding() {
+ boundVariables = super.getBinding().getVariables();
+ // this is important: we need this reference no matter if "node" is overridden later by the user
+ node = (Proxy.NodeRO) boundVariables.get("node");
+ controller = (Proxy.ControllerRO) boundVariables.get("c");
+ }
+
+ @Override
+ public void setBinding(Binding binding) {
+ super.setBinding(addStaticBindings(binding));
+ initBinding();
+ }
+
+ private Binding addStaticBindings(Binding binding) {
+ for (Entry<String, Object> entry : ScriptingConfiguration.getStaticProperties().entrySet()) {
+ binding.setProperty(entry.getKey(), entry.getValue());
+ }
+ return binding;
+ }
+
+ /* <ul>
+ * <li> translate raw node ids to nodes.
+ * <li> "imports" node's methods into the script's namespace
+ * </ul>
+ */
+ public Object getProperty(String property) {
+ // shortcuts for the most usual cases
+ if (property.equals("node")) {
+ return node;
+ }
+ if (property.equals("c")) {
+ return controller;
+ }
+ if (nodeIdPattern.matcher(property).matches()) {
+ return N(property);
+ }
+ else {
+ final Object boundValue = boundVariables.get(property);
+ if (boundValue != null) {
+ return boundValue;
+ }
+ else {
+ try {
+ return nodeMetaClass.getProperty(node, property);
+ }
+ catch (MissingPropertyException e) {
+ return super.getProperty(property);
+ }
+ }
+ }
+ }
+
+ /*
+ * extends super class version by node instance methods.
+ */
+ public Object invokeMethod(String methodName, Object args) {
+ try {
+ return super.invokeMethod(methodName, args);
+ }
+ catch (MissingMethodException mme) {
+ try {
+ return nodeMetaClass.invokeMethod(node, methodName, args);
+ }
+ catch (MissingMethodException e) {
+ throw e;
+ }
+ }
+ }
+
+ /** Shortcut for node.map.node(id) - necessary for ids to other maps. */
+ public Proxy.NodeRO N(String id) {
+ final Proxy.NodeRO node = (Proxy.NodeRO) getBinding().getVariable("node");
+ return node.getMap().node(id);
+ }
+
+ /** Shortcut for node.map.node(id).text. */
+ public String T(String id) {
+ final Proxy.NodeRO n = N(id);
+ return n == null ? null : n.getText();
+ }
+
+ /** Shortcut for node.map.node(id).value. */
+ public Object V(String id) {
+ final Proxy.NodeRO n = N(id);
+ try {
+ return n == null ? null : n.getValue();
+ }
+ catch (ExecuteScriptException e) {
+ return null;
+ }
+ }
+
+ /** returns valueIfNull if value is null and value otherwise. */
+ public Object ifNull(Object value, Object valueIfNull) {
+ return value == null ? valueIfNull : value;
+ }
+
+ /** rounds a number to integral type. */
+ public Long round(final Double d) {
+ if (d == null)
+ return null;
+ return Math.round(d);
+ }
+
+ /** round to the given number of decimal places: <code>round(0.1234, 2) → 0.12</code> */
+ public Double round(final Double d, final int precision) {
+ if (d == null)
+ return d;
+ double factor = 1;
+ for (int i = 0; i < precision; i++) {
+ factor *= 10.;
+ }
+ return Math.round(d * factor) / factor;
+ }
+
+ /** parses text to the proper data type, if possible, setting format to the standard. Parsing is configured via
+ * config file scanner.xml
+ * <pre>
+ * assert parse('2012-11-30') instanceof Date
+ * assert parse('1.22') instanceof Number
+ * // if parsing fails the original string is returned
+ * assert parse('2012XX11-30') == '2012XX11-30'
+ *
+ * def d = parse('2012-10-30')
+ * c.statusInfo = "${d} is ${new Date() - d} days ago"
+ * </pre> */
+ public Object parse(final String text) {
+ return ScannerController.getController().parse(text);
+ }
+
+ /** uses formatString to return a FormattedObject.
+ * <p><em>Note:</em> If you want to format the node core better use the format node attribute instead:
+ * <pre>
+ * node.object = new Date()
+ * node.format = 'dd/MM/yy'
+ * </pre>
+ * @return {@link IFormattedObject} if object is formattable and the unchanged object otherwise. */
+ public Object format(final Object object, final String formatString) {
+ return FormatController.format(object, formatString);
+ }
+
+ /** Applies default date-time format for dates or default number format for numbers. All other objects are left unchanged.
+ * @return {@link IFormattedObject} if object is formattable and the unchanged object otherwise. */
+ public Object format(final Object object) {
+ return FormatController.formatUsingDefault(object);
+ }
+
+ /** Applies default date format (instead of standard date-time) format on the given date.
+ * @return {@link IFormattedObject} if object is formattable and the unchanged object otherwise. */
+ public Object formatDate(final Date date) {
+ final String format = FormatController.getController().getDefaultDateFormat().toPattern();
+ return FormatController.format(date, format);
+ }
+
+ /** formats according to the internal standard, that is the conversion will be reversible
+ * for types that are handled special by the scripting api namely Dates and Numbers.
+ * @see Convertible#toString(Object) */
+ public String toString(final Object o) {
+ return Convertible.toString(o);
+ }
+
+ /** opens a {@link URI} */
+ public void loadUri(final URI uri) {
+ LinkController.getController().loadURI(uri);
+ }
+
+// /** Shortcut for new {@link org.freeplane.plugin.script.proxy.Convertible}. */
+// public Convertible convertible(String string) {
+// return new Convertible(FormulaUtils.eval string, node.get);
+// }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/GenericScript.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/GenericScript.java
new file mode 100644
index 0000000..1d47601
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/GenericScript.java
@@ -0,0 +1,308 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintStream;
+import java.net.URL;
+import java.util.List;
+
+import javax.script.Bindings;
+import javax.script.Compilable;
+import javax.script.CompiledScript;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import javax.script.SimpleScriptContext;
+
+import org.apache.commons.io.FilenameUtils;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.plugin.script.proxy.ProxyFactory;
+
+/**
+ * Implements scripting via JSR233 implementation for all other languages except
+ * Groovy.
+ */
+public class GenericScript implements IScript {
+ public static final class ScriptSource {
+ private final File file;
+
+ private final String script;
+
+ private String cachedFileContent;
+
+ public ScriptSource(String script) {
+ this.script = script;
+ this.file = null;
+ }
+
+ public ScriptSource(File file) {
+ this.script = null;
+ this.file = file;
+ this.cachedFileContent = slurpFile(file);
+ }
+
+ public boolean isFile() {
+ return file != null;
+ }
+
+ public String rereadFile() {
+ cachedFileContent = slurpFile(file);
+ return cachedFileContent;
+ }
+
+ public String getScript() {
+ return isFile() ? cachedFileContent : script;
+ }
+
+ public String getPath() {
+ return isFile() ? file.getAbsolutePath() : null;
+ }
+ }
+
+ private ScriptSource scriptSource;
+
+ private ScriptingPermissions specificPermissions;
+
+ private CompiledScript compiledScript;
+
+ private Throwable errorsInScript;
+
+ private IFreeplaneScriptErrorHandler errorHandler;
+
+ private PrintStream outStream;
+
+ private ScriptContext scriptContext;
+
+ private ScriptEngine engine;
+
+ private boolean compilationEnabled = true;
+
+ private CompileTimeStrategy compileTimeStrategy;
+
+ private ScriptClassLoader scriptClassLoader;
+
+ private void init(ScriptSource scriptSource, ScriptingPermissions permissions) {
+ this.scriptSource = scriptSource;
+ this.specificPermissions = permissions;
+ this.engine = null;
+ compiledScript = null;
+ errorsInScript = null;
+ errorHandler = ScriptResources.IGNORING_SCRIPT_ERROR_HANDLER;
+ outStream = System.out;
+ scriptContext = null;
+ scriptClassLoader = ScriptClassLoader.createClassLoader();
+ }
+
+ private void init(String script, ScriptingPermissions permissions) {
+ init(new ScriptSource(script), permissions);
+ compileTimeStrategy = new CompileTimeStrategy(null);
+ }
+
+ public GenericScript(String script, String scriptEngineName, ScriptingPermissions permissions) {
+ init(script, permissions);
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(scriptClassLoader);
+ ScriptEngineManager scriptEngineManager = createScriptEngineManager(scriptClassLoader);
+ engine = checkNotNull(scriptEngineManager.getEngineByName(scriptEngineName), "name", scriptEngineName);
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ }
+ }
+
+ public GenericScript(File scriptFile, ScriptingPermissions permissions) {
+ init(new ScriptSource(scriptFile), permissions);
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ Thread.currentThread().setContextClassLoader(scriptClassLoader);
+ ScriptEngineManager scriptEngineManager = createScriptEngineManager(scriptClassLoader);
+ final String extension = FilenameUtils.getExtension(scriptFile.getName());
+ engine = checkNotNull(scriptEngineManager.getEngineByExtension(extension), "extension", extension);
+ }
+ finally {
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ }
+ compilationEnabled = !disableScriptCompilation(scriptFile);
+ compileTimeStrategy = new CompileTimeStrategy(scriptFile);
+ }
+
+
+ private static String slurpFile(File scriptFile) {
+ try {
+ return FileUtils.slurpFile(scriptFile);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public IScript setErrorHandler(IFreeplaneScriptErrorHandler pErrorHandler) {
+ this.errorHandler = pErrorHandler;
+ return this;
+ }
+
+ @Override
+ public IScript setOutStream(PrintStream outStream) {
+ this.outStream = outStream;
+ return this;
+ }
+
+ @Override
+ public IScript setScriptContext(ScriptContext scriptContext) {
+ this.scriptContext = scriptContext;
+ return this;
+ }
+
+ @Override
+ public Object getScript() {
+ return scriptSource;
+ }
+
+ @Override
+ public Object execute(final NodeModel node) {
+ try {
+ if (errorsInScript != null && compileTimeStrategy.canUseOldCompiledScript()) {
+ throw new ExecuteScriptException(errorsInScript.getMessage(), errorsInScript);
+ }
+ final PrintStream oldOut = System.out;
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ scriptClassLoader.setSecurityManager(createScriptingSecurityManager());
+ Thread.currentThread().setContextClassLoader(scriptClassLoader);
+ final SimpleScriptContext context = createScriptContext(node);
+ if (compilationEnabled && engine instanceof Compilable) {
+ compileAndCache((Compilable) engine);
+ System.setOut(outStream);
+ return compiledScript.eval(context);
+ } else {
+ System.setOut(outStream);
+ return engine.eval(scriptSource.getScript(), context);
+ }
+ } finally {
+ System.setOut(oldOut);
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ }
+ } catch (final ScriptException e) {
+ handleScriptRuntimeException(e);
+ // :fixme: This throw is only reached, if
+ // handleScriptRuntimeException
+ // does not raise an exception. Should it be here at all?
+ // And if: Shouldn't it raise an ExecuteScriptException?
+ throw new RuntimeException(e);
+ } catch (final Throwable e) {
+ if (Controller.getCurrentController().getSelection() != null && node.hasVisibleContent()) {
+ Controller.getCurrentModeController().getMapController().select(node);
+ }
+ throw new ExecuteScriptException(e.getMessage(), e);
+ }
+ }
+
+
+ private ScriptingSecurityManager createScriptingSecurityManager() {
+ return new ScriptSecurity(scriptSource, specificPermissions, outStream)
+ .getScriptingSecurityManager();
+ }
+
+ private boolean disableScriptCompilation(File scriptFile) {
+ return FilenameUtils.isExtension(scriptFile.getName(),
+ ScriptResources.SCRIPT_COMPILATION_DISABLED_EXTENSIONS);
+ }
+
+ private SimpleScriptContext createScriptContext(final NodeModel node) {
+ final SimpleScriptContext context = new SimpleScriptContext();
+ final OutputStreamWriter outWriter = new OutputStreamWriter(outStream);
+ context.setWriter(outWriter);
+ context.setErrorWriter(outWriter);
+ context.setBindings(createBinding(node), javax.script.ScriptContext.ENGINE_SCOPE);
+ return context;
+ }
+
+ private Bindings createBinding(final NodeModel node) {
+ final Bindings binding = engine.createBindings();
+ binding.put("c", ProxyFactory.createController(scriptContext));
+ binding.put("node", ProxyFactory.createNode(node, scriptContext));
+ binding.putAll(ScriptingConfiguration.getStaticProperties());
+ return binding;
+ }
+
+
+ private static ScriptEngineManager createScriptEngineManager(final ClassLoader classLoader) {
+ ScriptEngineManager scriptEngineManager = new ScriptEngineManager(classLoader);
+ return scriptEngineManager;
+ }
+
+ static List<ScriptEngineFactory> createScriptEngineFactories() {
+ final ClassLoader classLoader = ScriptClassLoader.createClassLoader();
+ return createScriptEngineManager(classLoader).getEngineFactories();
+ }
+
+
+ private void compileAndCache(Compilable engine) throws Throwable {
+ if (compileTimeStrategy.canUseOldCompiledScript()) {
+ return;
+ }
+ compiledScript = null;
+ errorsInScript = null;
+ try {
+ scriptSource.rereadFile();
+ compileTimeStrategy.scriptCompileStart();
+ compiledScript = engine.compile(scriptSource.getScript());
+ compileTimeStrategy.scriptCompiled();
+ } catch (Throwable e) {
+ errorsInScript = e;
+ throw e;
+ }
+ }
+
+ private static ScriptEngine checkNotNull(final ScriptEngine motor, String what, String detail) {
+ if (motor == null) {
+ throw new RuntimeException("can't load script engine by " + what + ": " + detail);
+ }
+ return motor;
+ }
+
+ private void handleScriptRuntimeException(final ScriptException e) {
+ outStream.print("message: " + e.getMessage());
+ int lineNumber = e.getLineNumber();
+ outStream.print("Line number: " + lineNumber);
+ errorHandler.gotoLine(lineNumber);
+ throw new ExecuteScriptException(e.getMessage() + " at line " + lineNumber,
+ // The ScriptException should have a cause. Use
+ // that, it is what we want to know.
+ (e.getCause() == null) ? e : e.getCause());
+ }
+
+ @Override
+ public boolean permissionsEquals(ScriptingPermissions permissions) {
+ if (this.specificPermissions == null) {
+ return this.specificPermissions == permissions;
+ } else {
+ return this.specificPermissions.equals(permissions);
+ }
+ }
+
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/GroovyScript.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/GroovyScript.java
new file mode 100644
index 0000000..289153f
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/GroovyScript.java
@@ -0,0 +1,263 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.File;
+import java.io.PrintStream;
+import java.util.regex.Matcher;
+
+import org.codehaus.groovy.ast.ASTNode;
+import org.codehaus.groovy.ast.ModuleNode;
+import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.runtime.InvokerHelper;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.plugin.script.proxy.ProxyFactory;
+
+import groovy.lang.Binding;
+import groovy.lang.GroovyRuntimeException;
+import groovy.lang.Script;
+
+/**
+ * Special scripting implementation for Groovy.
+ */
+public class GroovyScript implements IScript {
+ final private Object script;
+
+ private final ScriptingPermissions specificPermissions;
+
+ private Script compiledScript;
+
+ private Throwable errorsInScript;
+
+ private IFreeplaneScriptErrorHandler errorHandler;
+
+ private PrintStream outStream;
+
+ private ScriptContext scriptContext;
+
+ private CompileTimeStrategy compileTimeStrategy;
+
+ private ScriptClassLoader scriptClassLoader;
+
+ public GroovyScript(String script) {
+ this((Object) script);
+ }
+
+ public GroovyScript(File script) {
+ this((Object) script);
+ compileTimeStrategy = new CompileTimeStrategy(script);
+ }
+
+ public GroovyScript(String script, ScriptingPermissions permissions) {
+ this((Object) script, permissions);
+ }
+
+ public GroovyScript(File script, ScriptingPermissions permissions) {
+ this((Object) script, permissions);
+ compileTimeStrategy = new CompileTimeStrategy(script);
+ }
+
+ private GroovyScript(Object script, ScriptingPermissions permissions) {
+ super();
+ this.script = script;
+ this.specificPermissions = permissions;
+ compiledScript = null;
+ errorsInScript = null;
+ errorHandler = ScriptResources.IGNORING_SCRIPT_ERROR_HANDLER;
+ outStream = System.out;
+ scriptContext = null;
+ compileTimeStrategy = new CompileTimeStrategy(null);
+ }
+
+ private GroovyScript(Object script) {
+ this(script, null);
+ }
+
+ @Override
+ public IScript setErrorHandler(IFreeplaneScriptErrorHandler pErrorHandler) {
+ this.errorHandler = pErrorHandler;
+ return this;
+ }
+
+ @Override
+ public IScript setOutStream(PrintStream outStream) {
+ this.outStream = outStream;
+ return this;
+ }
+
+ @Override
+ public IScript setScriptContext(ScriptContext scriptContext) {
+ this.scriptContext = scriptContext;
+ return this;
+ }
+
+ @Override
+ public Object getScript() {
+ return script;
+ }
+
+ public Script getCompiledScript() {
+ return compiledScript;
+ }
+
+ @Override
+ public Object execute(final NodeModel node) {
+ try {
+ if (errorsInScript != null && compileTimeStrategy.canUseOldCompiledScript()) {
+ throw new ExecuteScriptException(errorsInScript.getMessage(), errorsInScript);
+ }
+ final PrintStream oldOut = System.out;
+ try {
+ compileAndCache();
+ final Binding binding = createBinding(node);
+ compiledScript.setBinding(binding);
+ System.setOut(outStream);
+ return compiledScript.run();
+ } finally {
+ System.setOut(oldOut);
+ }
+ } catch (final GroovyRuntimeException e) {
+ handleScriptRuntimeException(e);
+ // :fixme: This throw is only reached, if
+ // handleScriptRuntimeException
+ // does not raise an exception. Should it be here at all?
+ // And if: Shouldn't it raise an ExecuteScriptException?
+ throw new RuntimeException(e);
+ } catch (final Throwable e) {
+ if (Controller.getCurrentController().getSelection() != null && node.hasVisibleContent()) {
+ Controller.getCurrentModeController().getMapController().select(node);
+ }
+ throw new ExecuteScriptException(e.getMessage(), e);
+ }
+ }
+
+ private ScriptingSecurityManager createScriptingSecurityManager() {
+ return new ScriptSecurity(script, specificPermissions, outStream)
+ .getScriptingSecurityManager();
+ }
+
+ private Script compileAndCache() throws Throwable {
+ final ScriptingSecurityManager scriptingSecurityManager = createScriptingSecurityManager();
+ if (compileTimeStrategy.canUseOldCompiledScript()) {
+ scriptClassLoader.setSecurityManager(scriptingSecurityManager);
+ return compiledScript;
+ }
+ removeOldScript();
+ errorsInScript = null;
+ if (script instanceof Script) {
+ return (Script) script;
+ } else {
+ try {
+ final Binding binding = createBindingForCompilation();
+ scriptClassLoader = ScriptClassLoader.createClassLoader();
+ scriptClassLoader.setSecurityManager(scriptingSecurityManager);
+ final GroovyShell shell = new GroovyShell(scriptClassLoader, binding,
+ createCompilerConfiguration());
+ compileTimeStrategy.scriptCompileStart();
+ if (script instanceof String) {
+ compiledScript = shell.parse((String) script);
+ } else if (script instanceof File) {
+ compiledScript = shell.parse((File) script);
+ } else {
+ throw new IllegalArgumentException();
+ }
+ compileTimeStrategy.scriptCompiled();
+ return compiledScript;
+ } catch (Throwable e) {
+ errorsInScript = e;
+ throw e;
+ }
+ }
+ }
+
+ private void removeOldScript() {
+ if (compiledScript != null) {
+ InvokerHelper.removeClass(compiledScript.getClass());
+ compiledScript = null;
+ }
+ }
+
+ private Binding createBinding(final NodeModel node) {
+ final Binding binding = new Binding();
+ binding.setVariable("c", ProxyFactory.createController(scriptContext));
+ binding.setVariable("node", ProxyFactory.createNode(node, scriptContext));
+ return binding;
+ }
+
+ private Binding createBindingForCompilation() {
+ final Binding binding = new Binding();
+ binding.setVariable("c", null);
+ binding.setVariable("node", null);
+ return binding;
+ }
+
+ private void handleScriptRuntimeException(final GroovyRuntimeException e) {
+ outStream.print("message: " + e.getMessage());
+ final ModuleNode module = e.getModule();
+ final ASTNode astNode = e.getNode();
+ int lineNumber = -1;
+ if (module != null) {
+ lineNumber = module.getLineNumber();
+ } else if (astNode != null) {
+ lineNumber = astNode.getLineNumber();
+ } else {
+ lineNumber = findLineNumberInString(e.getMessage(), lineNumber);
+ }
+ outStream.print("Line number: " + lineNumber);
+ errorHandler.gotoLine(lineNumber);
+ throw new ExecuteScriptException(e.getMessage() + " at line " + lineNumber, e);
+ }
+
+ static CompilerConfiguration createCompilerConfiguration() {
+ CompilerConfiguration config = new CompilerConfiguration();
+ config.setScriptBaseClass(FreeplaneScriptBaseClass.class.getName());
+ if (!(ScriptResources.getClasspath() == null || ScriptResources.getClasspath().isEmpty())) {
+ config.setClasspathList(ScriptResources.getClasspath());
+ }
+ return config;
+ }
+
+ private int findLineNumberInString(final String resultString, int lineNumber) {
+ final java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(
+ ".*@ line ([0-9]+).*",
+ java.util.regex.Pattern.DOTALL);
+ final Matcher matcher = pattern.matcher(resultString);
+ if (matcher.matches()) {
+ lineNumber = Integer.parseInt(matcher.group(1));
+ }
+ return lineNumber;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ removeOldScript();
+ super.finalize();
+ }
+
+ @Override
+ public boolean permissionsEquals(ScriptingPermissions permissions) {
+ if (this.specificPermissions == null) {
+ return this.specificPermissions == permissions;
+ } else {
+ return this.specificPermissions.equals(permissions);
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/GroovyShell.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/GroovyShell.java
new file mode 100644
index 0000000..7318581
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/GroovyShell.java
@@ -0,0 +1,317 @@
+/*
+ * Copyright 2003-2012 the original author or authors.
+ *
+ * Modified 2016 by Dimitry Polivaev for Freeplane
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.security.AccessController;
+import java.security.CodeSource;
+import java.security.PermissionCollection;
+import java.security.Permissions;
+import java.security.PrivilegedAction;
+import java.util.Map;
+
+import org.codehaus.groovy.control.CompilationFailedException;
+import org.codehaus.groovy.control.CompilationUnit;
+import org.codehaus.groovy.control.CompilerConfiguration;
+import org.codehaus.groovy.control.SourceUnit;
+import org.codehaus.groovy.plugin.GroovyRunner;
+import org.codehaus.groovy.runtime.InvokerHelper;
+import org.codehaus.groovy.runtime.InvokerInvocationException;
+
+import groovy.lang.Binding;
+import groovy.lang.GroovyClassLoader;
+import groovy.lang.GroovyCodeSource;
+import groovy.lang.GroovyObjectSupport;
+import groovy.lang.GroovyRuntimeException;
+import groovy.lang.GroovySystem;
+import groovy.lang.Script;
+
+/**
+ * Represents a groovy shell capable of running arbitrary groovy scripts
+ *
+ * @author <a href="mailto:james at coredevelopers.net">James Strachan</a>
+ * @author Guillaume Laforge
+ * @author Paul King
+ * @version $Revision$
+ */
+class GroovyShell extends GroovyObjectSupport {
+ private static final String DEFAULT_CODE_BASE = "/groovy/shell";
+ private Binding context;
+ private int counter;
+ private CompilerConfiguration config;
+ private GroovyClassLoader loader;
+
+ GroovyShell(ClassLoader parent, Binding binding, final CompilerConfiguration config) {
+ if (binding == null) {
+ throw new IllegalArgumentException("Binding must not be null.");
+ }
+ if (config == null) {
+ throw new IllegalArgumentException("Compiler configuration must not be null.");
+ }
+ final ClassLoader parentLoader = (parent != null) ? parent : GroovyShell.class.getClassLoader();
+ this.loader = AccessController.doPrivileged(new PrivilegedAction<GroovyClassLoader>() {
+ @Override
+ public GroovyClassLoader run() {
+ return new MyGroovyClassLoader(parentLoader, config);
+ }
+ });
+ this.context = binding;
+ this.config = config;
+ }
+
+
+ @Override
+ public Object getProperty(String property) {
+ Object answer = getVariable(property);
+ if (answer == null) {
+ answer = super.getProperty(property);
+ }
+ return answer;
+ }
+
+ @Override
+ public void setProperty(String property, Object newValue) {
+ setVariable(property, newValue);
+ try {
+ super.setProperty(property, newValue);
+ }
+ catch (GroovyRuntimeException e) {
+ // ignore, was probably a dynamic property
+ }
+ }
+
+ /**
+ * if (theClass is a Script) {
+ * run it like a script
+ * } else if (theClass has a main method) {
+ * run the main method
+ * } else if (theClass instanceof GroovyTestCase) {
+ * use the test runner to run it
+ * } else if (theClass implements Runnable) {
+ * if (theClass has a constructor with String[] params)
+ * instantiate theClass with this constructor and run
+ * else if (theClass has a no-args constructor)
+ * instantiate theClass with the no-args constructor and run
+ * }
+ */
+ private Object runScriptOrMainOrTestOrRunnable(Class scriptClass, String[] args) {
+ if (scriptClass == null) {
+ return null;
+ }
+ if (Script.class.isAssignableFrom(scriptClass)) {
+ // treat it just like a script if it is one
+ Script script = null;
+ try {
+ script = (Script) scriptClass.newInstance();
+ }
+ catch (InstantiationException e) {
+ // ignore instantiation errors,, try to do main
+ }
+ catch (IllegalAccessException e) {
+ // ignore instantiation errors, try to do main
+ }
+ if (script != null) {
+ script.setBinding(context);
+ script.setProperty("args", args);
+ return script.run();
+ }
+ }
+ try {
+ // let's find a main method
+ scriptClass.getMethod("main", new Class[] { String[].class });
+ // if that main method exist, invoke it
+ return InvokerHelper.invokeMethod(scriptClass, "main", new Object[] { args });
+ }
+ catch (NoSuchMethodException e) {
+ // if it implements Runnable, try to instantiate it
+ if (Runnable.class.isAssignableFrom(scriptClass)) {
+ return runRunnable(scriptClass, args);
+ }
+ for (Map.Entry<String, GroovyRunner> entry : GroovySystem.RUNNER_REGISTRY.entrySet()) {
+ GroovyRunner runner = entry.getValue();
+ if (runner != null && runner.canRun(scriptClass, this.loader)) {
+ return runner.run(scriptClass, this.loader);
+ }
+ }
+ String message = "This script or class could not be run.\n" + "It should either:\n"
+ + "- have a main method,\n" + "- be a JUnit test or extend GroovyTestCase,\n"
+ + "- implement the Runnable interface,\n"
+ + "- or be compatible with a registered script runner. Known runners:\n";
+ if (GroovySystem.RUNNER_REGISTRY.isEmpty()) {
+ message += " * <none>";
+ }
+ for (Map.Entry<String, GroovyRunner> entry : GroovySystem.RUNNER_REGISTRY.entrySet()) {
+ message += " * " + entry.getKey() + "\n";
+ }
+ throw new GroovyRuntimeException(message);
+ }
+ }
+
+ private Object runRunnable(Class scriptClass, String[] args) {
+ Constructor constructor = null;
+ Runnable runnable = null;
+ Throwable reason = null;
+ try {
+ // first, fetch the constructor taking String[] as parameter
+ constructor = scriptClass.getConstructor(new Class[] { (new String[] {}).getClass() });
+ try {
+ // instantiate a runnable and run it
+ runnable = (Runnable) constructor.newInstance(new Object[] { args });
+ }
+ catch (Throwable t) {
+ reason = t;
+ }
+ }
+ catch (NoSuchMethodException e1) {
+ try {
+ // otherwise, find the default constructor
+ constructor = scriptClass.getConstructor(new Class[] {});
+ try {
+ // instantiate a runnable and run it
+ runnable = (Runnable) constructor.newInstance();
+ }
+ catch (InvocationTargetException ite) {
+ throw new InvokerInvocationException(ite.getTargetException());
+ }
+ catch (Throwable t) {
+ reason = t;
+ }
+ }
+ catch (NoSuchMethodException nsme) {
+ reason = nsme;
+ }
+ }
+ if (constructor != null && runnable != null) {
+ runnable.run();
+ }
+ else {
+ throw new GroovyRuntimeException("This script or class was runnable but could not be run. ", reason);
+ }
+ return null;
+ }
+
+ private Object getVariable(String name) {
+ return context.getVariables().get(name);
+ }
+
+ private void setVariable(String name, Object value) {
+ context.setVariable(name, value);
+ }
+
+ /**
+ * Parses the groovy code contained in codeSource and returns a java class.
+ */
+ private Class parseClass(final GroovyCodeSource codeSource) throws CompilationFailedException {
+ // Don't cache scripts
+ return loader.parseClass(codeSource, false);
+ }
+
+ /**
+ * Parses the given script and returns it ready to be run. When running in a secure environment
+ * (-Djava.security.manager) codeSource.getCodeSource() determines what policy grants should be
+ * given to the script.
+ *
+ * @param codeSource
+ * @return ready to run script
+ */
+ private Script parse(final GroovyCodeSource codeSource) throws CompilationFailedException {
+ return InvokerHelper.createScript(parseClass(codeSource), context);
+ }
+
+ /**
+ * Parses the given script and returns it ready to be run
+ *
+ * @param file is the file of the script (which is used to create the class name of the script)
+ */
+ Script parse(File file) throws CompilationFailedException, IOException {
+ return parse(new GroovyCodeSource(file, config.getSourceEncoding()));
+ }
+
+ /**
+ * Parses the given script and returns it ready to be run
+ *
+ * @param scriptText the text of the script
+ */
+ Script parse(String scriptText) throws CompilationFailedException {
+ return parse(scriptText, generateScriptName());
+ }
+
+ private Script parse(final String scriptText, final String fileName) throws CompilationFailedException {
+ GroovyCodeSource gcs = AccessController.doPrivileged(new PrivilegedAction<GroovyCodeSource>() {
+ @Override
+ public GroovyCodeSource run() {
+ return new GroovyCodeSource(scriptText, fileName, DEFAULT_CODE_BASE);
+ }
+ });
+ return parse(gcs);
+ }
+
+ protected synchronized String generateScriptName() {
+ return "Script" + (++counter) + ".groovy";
+ }
+}
+
+class MyGroovyClassLoader extends GroovyClassLoader {
+ MyGroovyClassLoader(ClassLoader loader, CompilerConfiguration config) {
+ super(loader, config);
+ }
+
+ class MyInnerLoader extends InnerLoader {
+ private final MyGroovyClassLoader delegate;
+
+ MyInnerLoader(MyGroovyClassLoader delegate) {
+ super(delegate);
+ this.delegate = delegate;
+ }
+
+ @Override
+ protected PermissionCollection getPermissions(CodeSource codeSource) {
+ return delegate.getPermissions(codeSource);
+ }
+ }
+
+ @Override
+ protected PermissionCollection getPermissions(CodeSource codeSource) {
+ PermissionCollection perms = new Permissions();
+ perms.setReadOnly();
+ return perms;
+ }
+ /**
+ * creates a ClassCollector for a new compilation.
+ *
+ * @param unit the compilationUnit
+ * @param su the SourceUnit
+ * @return the ClassCollector
+ */
+ @Override
+ protected ClassCollector createCollector(CompilationUnit unit, SourceUnit su) {
+ InnerLoader loader = AccessController.doPrivileged(new PrivilegedAction<InnerLoader>() {
+ @Override
+ public InnerLoader run() {
+ return new MyInnerLoader(MyGroovyClassLoader.this);
+ }
+ });
+ return new ClassCollector(loader, unit, su) {
+ // use inner class to call protected constructor
+ };
+ }
+}
+
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/IFreeplaneScriptErrorHandler.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/IFreeplaneScriptErrorHandler.java
new file mode 100644
index 0000000..b61161d
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/IFreeplaneScriptErrorHandler.java
@@ -0,0 +1,28 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+/**
+ * @author Dimitry Polivaev
+ * 17.12.2012
+ */
+public interface IFreeplaneScriptErrorHandler {
+ void gotoLine(int pLineNumber);
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/IScript.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/IScript.java
new file mode 100644
index 0000000..80e3c63
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/IScript.java
@@ -0,0 +1,42 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.PrintStream;
+
+import org.freeplane.features.map.NodeModel;
+
+/**
+ * @author Dimitry Polivaev
+ * 17.12.2012
+ */
+public interface IScript {
+ public IScript setErrorHandler(IFreeplaneScriptErrorHandler pErrorHandler);
+
+ public IScript setOutStream(PrintStream outStream);
+
+ public IScript setScriptContext(ScriptContext scriptContext);
+
+ public Object getScript();
+
+ public Object execute(final NodeModel node);
+
+ public boolean permissionsEquals(ScriptingPermissions permissions);
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/InternationalizedSecurityManager.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/InternationalizedSecurityManager.java
new file mode 100644
index 0000000..06149ab
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/InternationalizedSecurityManager.java
@@ -0,0 +1,204 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2016 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.FileDescriptor;
+import java.net.InetAddress;
+import java.security.AccessControlException;
+
+import org.freeplane.core.util.TextUtils;
+
+class InternationalizedSecurityManager extends SecurityManager {
+ private static final int PERM_Accept = 0;
+ private static final int PERM_Connect = 1;
+ private static final int PERM_Delete = 7;
+ private static final int PERM_Exec = 5;
+ private static final int PERM_GROUP_EXEC = 2;
+ private static final int PERM_GROUP_FILE = 0;
+ private static final int PERM_GROUP_NETWORK = 1;
+ private static final int PERM_Link = 6;
+ private static final int PERM_Listen = 2;
+ private static final int PERM_Multicast = 3;
+ private static final int PERM_Read = 8;
+ private static final int PERM_SetFactory = 4;
+ private static final int PERM_Write = 9;
+
+ public InternationalizedSecurityManager() {
+ }
+
+ @Override
+ public void checkAccept(final String pHost, final int pPort) {
+ try{
+ super.checkAccept(pHost, pPort);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_NETWORK, InternationalizedSecurityManager.PERM_Accept);
+ }
+ }
+
+ @Override
+ public void checkConnect(final String pHost, final int pPort) {
+ try{
+ super.checkConnect(pHost, pPort);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_NETWORK, InternationalizedSecurityManager.PERM_Connect);
+ }
+ }
+
+ @Override
+ public void checkConnect(final String pHost, final int pPort, final Object pContext) {
+ try{
+ super.checkConnect(pHost, pPort, pContext);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_NETWORK, InternationalizedSecurityManager.PERM_Connect);
+ }
+ }
+
+ @Override
+ public void checkDelete(final String pFile) {
+ try{
+ super.checkDelete(pFile);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_FILE, InternationalizedSecurityManager.PERM_Delete);
+ }
+ }
+
+ @Override
+ public void checkExec(final String pCmd) {
+ try{
+ super.checkExec(pCmd);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_EXEC, InternationalizedSecurityManager.PERM_Exec);
+ }
+ }
+
+
+ @Override
+ public void checkLink(final String pLib) {
+ try{
+ super.checkLink(pLib);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_EXEC, InternationalizedSecurityManager.PERM_Link);
+ }
+ }
+
+ @Override
+ public void checkListen(final int pPort) {
+ try{
+ super.checkListen(pPort);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_NETWORK, InternationalizedSecurityManager.PERM_Listen);
+ }
+ }
+
+ @Override
+ public void checkMulticast(final InetAddress pMaddr) {
+ try{
+ super.checkMulticast(pMaddr);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_NETWORK, InternationalizedSecurityManager.PERM_Multicast);
+ }
+ }
+
+ @Override
+ public void checkMulticast(final InetAddress pMaddr, final byte pTtl) {
+ try{
+ super.checkMulticast(pMaddr, pTtl);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_NETWORK, InternationalizedSecurityManager.PERM_Multicast);
+ }
+ }
+
+ @Override
+ public void checkRead(final FileDescriptor pFd) {
+ try{
+ super.checkRead(pFd);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_FILE, InternationalizedSecurityManager.PERM_Read);
+ }
+ }
+
+ @Override
+ public void checkRead(final String pFile) {
+ try{
+ super.checkRead(pFile);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_FILE, InternationalizedSecurityManager.PERM_Read, pFile);
+ }
+ }
+
+ @Override
+ public void checkRead(final String pFile, final Object pContext) {
+ try{
+ super.checkRead(pFile, pContext);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_FILE, InternationalizedSecurityManager.PERM_Read, pFile);
+ }
+ }
+
+ @Override
+ public void checkSetFactory() {
+ try{
+ super.checkSetFactory();
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_NETWORK, InternationalizedSecurityManager.PERM_SetFactory);
+ }
+ }
+
+ @Override
+ public void checkWrite(final FileDescriptor pFd) {
+ try{
+ super.checkWrite(pFd);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_FILE, InternationalizedSecurityManager.PERM_Write);
+ }
+ }
+
+ @Override
+ public void checkWrite(final String pFile) {
+ try{
+ super.checkWrite(pFile);
+ }
+ catch(AccessControlException e){
+ throw getException(e, InternationalizedSecurityManager.PERM_GROUP_FILE, InternationalizedSecurityManager.PERM_Write);
+ }
+ }
+
+ private SecurityException getException(final AccessControlException e, final int pPermissionGroup, final int pPermission, final String pFile) {
+ final String message = TextUtils.format("plugins/ScriptEditor.FORBIDDEN_ACTION", new Integer(
+ pPermissionGroup), new Integer(pPermission), pFile);
+ return new SecurityException(message, e);
+ }
+
+ private SecurityException getException(AccessControlException e, final int pPermissionGroup, final int pPermission) {
+ return getException(e, pPermissionGroup, pPermission, "");
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/NodeArithmeticsCategory.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/NodeArithmeticsCategory.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/NodeArithmeticsCategory.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/NodeArithmeticsCategory.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/RestrictingClassLoader.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/RestrictingClassLoader.java
new file mode 100644
index 0000000..70f1310
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/RestrictingClassLoader.java
@@ -0,0 +1,20 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2016 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptClassLoader.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptClassLoader.java
new file mode 100644
index 0000000..70ec35d
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptClassLoader.java
@@ -0,0 +1,107 @@
+package org.freeplane.plugin.script;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.AccessController;
+import java.security.Permission;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.freeplane.core.util.ClassLoaderFactory;
+
+public final class ScriptClassLoader extends URLClassLoader {
+ private ScriptingSecurityManager securityManager = null;
+
+ public static ScriptClassLoader createClassLoader() {
+ final List<String> classpath = ScriptResources.getClasspath();
+ final List<URL> urls = new ArrayList<URL>();
+ for (String path : classpath) {
+ urls.add(pathToUrl(path));
+ }
+ urls.addAll(ClassLoaderFactory.jarsInExtDir());
+ ScriptClassLoader classLoader = new ScriptClassLoader(urls.toArray(new URL[urls.size()]),
+ GenericScript.class.getClassLoader());
+ return classLoader;
+ }
+
+ private static URL pathToUrl(String path) {
+ try {
+ return new File(path).toURI().toURL();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private ScriptClassLoader(URL[] urls, ClassLoader parent) {
+ super(urls, parent);
+ }
+
+ @Override
+ public URL getResource(final String name) {
+ return AccessController.doPrivileged(
+ new PrivilegedAction<URL>() {
+ @Override
+ public URL run(){
+ return superGetResource(name);
+ }
+ });
+ }
+
+ private URL superGetResource(String name) {
+ return super.getResource(name);
+ }
+
+ @Override
+ public Enumeration<URL> getResources(final String name) throws IOException {
+ try {
+ return AccessController.doPrivileged(
+ new PrivilegedExceptionAction<Enumeration<URL>>() {
+ @Override
+ public Enumeration<URL> run() throws IOException{
+ return superGetResources(name);
+ }
+ });
+ } catch (PrivilegedActionException e) {
+ throw (IOException)e.getCause();
+ }
+ }
+
+ private Enumeration<URL> superGetResources(String name) throws IOException {
+ return super.getResources(name);
+ }
+
+ @Override
+ protected Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
+ try {
+ return AccessController.doPrivileged(
+ new PrivilegedExceptionAction<Class<?>>() {
+ @Override
+ public Class<?> run() throws ClassNotFoundException{
+ return superLoadClass(name, resolve);
+ }
+ });
+ } catch (PrivilegedActionException e) {
+ throw (ClassNotFoundException)e.getCause();
+ }
+ }
+
+
+ private Class<?> superLoadClass(String name, boolean resolve) throws ClassNotFoundException {
+ return super.loadClass(name, resolve);
+ }
+
+ public void setSecurityManager(ScriptingSecurityManager securityManager) {
+ this.securityManager = securityManager;
+ }
+
+ public boolean implies(Permission permission) {
+ return securityManager != null && securityManager.implies(permission);
+ }
+
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptComboBoxEditor.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptComboBoxEditor.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptComboBoxEditor.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptComboBoxEditor.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptCompiler.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptCompiler.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptCompiler.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptCompiler.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptContext.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptContext.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptContext.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptContext.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditor.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditor.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditor.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditor.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditorPanel.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditorPanel.java
new file mode 100644
index 0000000..7a57414
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditorPanel.java
@@ -0,0 +1,488 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file author is Christian Foltin
+ * It is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.awt.BorderLayout;
+import java.awt.Container;
+import java.awt.Font;
+import java.awt.event.ActionEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.DefaultListModel;
+import javax.swing.JDialog;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JMenu;
+import javax.swing.JMenuBar;
+import javax.swing.JMenuItem;
+import javax.swing.JOptionPane;
+import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
+import javax.swing.JTextArea;
+import javax.swing.ListSelectionModel;
+import javax.swing.WindowConstants;
+import javax.swing.event.CaretEvent;
+import javax.swing.event.CaretListener;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.JTextComponent;
+
+import jsyntaxpane.actions.ActionUtils;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.UIBuilder;
+import org.freeplane.core.ui.components.BlindIcon;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.plugin.script.IFreeplaneScriptErrorHandler;
+
+/**
+ */
+class ScriptEditorPanel extends JDialog {
+
+ static final String GROOVY_EDITOR_FONT = "groovy_editor_font";
+ static final String GROOVY_EDITOR_FONT_SIZE = "groovy_editor_font_size";
+
+ private static final String internalCharset = "UTF-16BE";
+
+ final private class CancelAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private CancelAction(final String pArg0) {
+ super(pArg0);
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ disposeDialog(true);
+ }
+ }
+
+ final private class ExitAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private ExitAction(final String pArg0) {
+ super(pArg0);
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ storeCurrent();
+ disposeDialog(false);
+ }
+ }
+
+ public interface IScriptModel {
+ /**
+ * @return the index of the new script.
+ */
+ int addNewScript();
+
+ ScriptEditorWindowConfigurationStorage decorateDialog(ScriptEditorPanel pPanel,
+ String pWindow_preference_storage_property);
+
+ void endDialog(boolean pIsCanceled);
+
+ Object executeScript(int pIndex, PrintStream outStream, IFreeplaneScriptErrorHandler pErrorHandler);
+
+ int getAmountOfScripts();
+
+ /**
+ * @param pIndex
+ * zero-based
+ * @return a script
+ */
+ ScriptHolder getScript(int pIndex);
+
+ boolean isDirty();
+
+ void setScript(int pIndex, ScriptHolder pScript);
+
+ void storeDialogPositions(ScriptEditorPanel pPanel, ScriptEditorWindowConfigurationStorage pStorage,
+ String pWindow_preference_storage_property);
+ }
+
+ final private class NewScriptAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private NewScriptAction(final String pArg0) {
+ super(pArg0);
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ storeCurrent();
+ mLastSelected = null;
+ final int scriptIndex = mScriptModel.addNewScript();
+ updateFields();
+ select(scriptIndex);
+ }
+ }
+
+ final private class ResultFieldStream extends OutputStream {
+ private final byte[] buf = new byte[2];
+ private int i = 0;
+
+ @Override
+ public void write(final int pByte) throws IOException {
+ buf[i++] = (byte) pByte;
+ if (i == 2) {
+ mScriptResultField.append(new String(buf, internalCharset));
+ i = 0;
+ }
+ }
+
+ @Override
+ public void write(final byte b[], int off, int len) throws IOException {
+ if (i == 1) {
+ write(b[off++]);
+ len--;
+ }
+ if (len <= 0) {
+ return;
+ }
+ final int len2 = len & ~1;
+ mScriptResultField.append(new String(b, off, len2, internalCharset));
+ if (len2 != len) {
+ write(b[len2]);
+ }
+ }
+ }
+
+ final private class RunAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private RunAction(final String pArg0) {
+ super(pArg0);
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ storeCurrent();
+ if (!mScriptList.isSelectionEmpty()) {
+ mScriptResultField.setText("");
+ Object result = null;
+ try {
+ result = mScriptModel.executeScript(mScriptList.getSelectedIndex(), getPrintStream(),
+ getErrorHandler());
+ }
+ catch (Throwable e2) {
+ // make sure the complete stack trace is logged!
+ LogUtils.warn(e2);
+ Throwable cause = e2.getCause();
+ String causeMessage = "";
+ if(cause != null && cause.getMessage()!= null)
+ causeMessage = cause.getMessage();
+ final String message = e2.getMessage() != null ? e2.getMessage() : "";
+ UITools.errorMessage(e2.getClass().getName() + ": " + causeMessage
+ + ((causeMessage.length() != 0 && message.length() != 0) ? ", " : "") + message);
+ result = message;
+ }
+ getPrintStream().print(TextUtils.getText("plugins/ScriptEditor/window.Result") + result);
+ }
+ }
+ }
+
+ public static class ScriptHolder {
+ String mScript;
+ String mScriptName;
+
+ /**
+ * @param pScriptName
+ * script name (starting with "script"
+ * (ScriptingEngine.SCRIPT_PREFIX))
+ * @param pScript
+ * script content
+ */
+ public ScriptHolder(final String pScriptName, final String pScript) {
+ super();
+ mScript = pScript;
+ mScriptName = pScriptName;
+ }
+
+ public String getScript() {
+ return mScript;
+ }
+
+ public String getScriptName() {
+ return mScriptName;
+ }
+
+ public ScriptHolder setScript(final String pScript) {
+ mScript = pScript;
+ return this;
+ }
+
+ public ScriptHolder setScriptName(final String pScriptName) {
+ mScriptName = pScriptName;
+ return this;
+ }
+ }
+
+ final private class SignAction extends AbstractAction {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+// // final private Controller controller;
+
+ private SignAction( final String pArg0) {
+ super(pArg0);
+// this.controller = controller;
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ storeCurrent();
+ if (!mScriptList.isSelectionEmpty()) {
+ final int selectedIndex = mScriptList.getSelectedIndex();
+ final ScriptHolder script = mScriptModel.getScript(selectedIndex);
+ final String signedScript = new SignedScriptHandler().signScript(script.mScript);
+ script.setScript(signedScript);
+ mScriptModel.setScript(selectedIndex, script);
+ mScriptTextField.setText(signedScript);
+ }
+ }
+ }
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ /**
+ *
+ */
+ private static final String WINDOW_PREFERENCE_STORAGE_PROPERTY = "plugins.script.ScriptEditorPanel/window_positions";
+ final private JSplitPane mCentralPanel;
+ final private JSplitPane mCentralUpperPanel;
+ private Integer mLastSelected = null;
+ final private DefaultListModel mListModel;
+ final private AbstractAction mRunAction;
+ final private JList mScriptList;
+ final private IScriptModel mScriptModel;
+ final private JTextArea mScriptResultField;
+ final private JTextComponent mScriptTextField;
+ final private SignAction mSignAction;
+ final private JLabel mStatus;
+
+ public ScriptEditorPanel( final IScriptModel pScriptModel,
+ final boolean pHasNewScriptFunctionality) {
+ super(UITools.getCurrentFrame(), true /* modal */);
+ mScriptModel = pScriptModel;
+ this.setTitle(TextUtils.getText("plugins/ScriptEditor/window.title"));
+ this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
+ this.addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(final WindowEvent event) {
+ disposeDialog(true);
+ }
+ });
+ UITools.addEscapeActionToDialog(this, new AbstractAction() {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public void actionPerformed(final ActionEvent arg0) {
+ disposeDialog(true);
+ }
+ });
+ final Container contentPane = this.getContentPane();
+ contentPane.setLayout(new BorderLayout());
+ mListModel = new DefaultListModel();
+ mScriptList = new JList(mListModel);
+ mScriptList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ mScriptList.addListSelectionListener(new ListSelectionListener() {
+ public void valueChanged(final ListSelectionEvent pEvent) {
+ if (pEvent.getValueIsAdjusting()) {
+ return;
+ }
+ select(mScriptList.getSelectedIndex());
+ }
+ });
+ final JEditorPane editorPane = new JEditorPane();
+ editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
+ mScriptTextField = editorPane;
+ mScriptTextField.setEnabled(false);
+ mCentralUpperPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, mScriptList, new JScrollPane(mScriptTextField));
+ try {
+ editorPane.setContentType("text/groovy");
+
+ final String fontName = ResourceController.getResourceController().getProperty(GROOVY_EDITOR_FONT);
+ final int fontSize = ResourceController.getResourceController().getIntProperty(GROOVY_EDITOR_FONT_SIZE);
+ editorPane.setFont(new Font(fontName, Font.PLAIN, fontSize));
+
+ } catch (Exception e) {
+ LogUtils.warn(e);
+ editorPane.setContentType("text/plain");
+ }
+ mCentralUpperPanel.setContinuousLayout(true);
+ mScriptResultField = new JTextArea();
+ mScriptResultField.setEditable(false);
+ mScriptResultField.setWrapStyleWord(true);
+ mCentralPanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT, mCentralUpperPanel, new JScrollPane(
+ mScriptResultField));
+ mCentralPanel.setDividerLocation(0.8);
+ mCentralPanel.setContinuousLayout(true);
+ contentPane.add(mCentralPanel, BorderLayout.CENTER);
+ mStatus = new JLabel();
+ contentPane.add(mStatus, BorderLayout.SOUTH);
+ mScriptTextField.addCaretListener(new CaretListener() {
+ public void caretUpdate(final CaretEvent arg0) {
+ final int caretPosition = mScriptTextField.getCaretPosition();
+ try {
+ final int lineOfOffset = ActionUtils.getLineNumber(mScriptTextField, caretPosition);
+ mStatus.setText("Line: " + (lineOfOffset + 1) + ", Column: "
+ + (caretPosition - ActionUtils.getLineNumber(mScriptTextField, lineOfOffset) + 1));
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ updateFields();
+ mScriptTextField.repaint();
+ final JMenuBar menuBar = new JMenuBar();
+ final JMenu menu = new JMenu();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(menu, TextUtils.getRawText("plugins/ScriptEditor.menu_actions"));
+ if (pHasNewScriptFunctionality) {
+ addAction(menu, new NewScriptAction(TextUtils.getRawText("plugins/ScriptEditor.new_script")));
+ }
+ mRunAction = new RunAction(TextUtils.getRawText("plugins/ScriptEditor.run"));
+ mRunAction.setEnabled(false);
+ addAction(menu, mRunAction);
+ mSignAction = new SignAction(TextUtils.getRawText("plugins/ScriptEditor.sign"));
+ mSignAction.setEnabled(false);
+ addAction(menu, mSignAction);
+ final AbstractAction cancelAction = new CancelAction(TextUtils.getRawText("plugins/ScriptEditor.cancel"));
+ addAction(menu, cancelAction);
+ final AbstractAction exitAction = new ExitAction(TextUtils.getRawText("plugins/ScriptEditor.exit"));
+ addAction(menu, exitAction);
+ menuBar.add(menu);
+ this.setJMenuBar(menuBar);
+ final ScriptEditorWindowConfigurationStorage storage = mScriptModel.decorateDialog(this,
+ ScriptEditorPanel.WINDOW_PREFERENCE_STORAGE_PROPERTY);
+ if (storage != null) {
+ mCentralUpperPanel.setDividerLocation(storage.getLeftRatio());
+ mCentralPanel.setDividerLocation(storage.getTopRatio());
+ }
+ else {
+ mCentralUpperPanel.setDividerLocation(100);
+ mCentralPanel.setDividerLocation(240);
+ }
+ }
+
+ private void addAction(final JMenu menu, final AbstractAction action) {
+ final JMenuItem item = menu.add(action);
+ LabelAndMnemonicSetter.setLabelAndMnemonic(item, (String) action.getValue(Action.NAME));
+ item.setIcon(new BlindIcon(UIBuilder.ICON_SIZE));
+ }
+
+ /**
+ * @param pIsCanceled
+ */
+ private void disposeDialog(final boolean pIsCanceled) {
+ if (!mScriptList.isSelectionEmpty()) {
+ select(mScriptList.getSelectedIndex());
+ }
+ if (pIsCanceled && mScriptModel.isDirty()) {
+ final int action = JOptionPane.showConfirmDialog(this, TextUtils
+ .getText("ScriptEditorPanel.changed_cancel"), "Freeplane", JOptionPane.OK_CANCEL_OPTION);
+ if (action == JOptionPane.CANCEL_OPTION) {
+ return;
+ }
+ }
+ final ScriptEditorWindowConfigurationStorage storage = new ScriptEditorWindowConfigurationStorage();
+ storage.setLeftRatio(mCentralUpperPanel.getDividerLocation());
+ storage.setTopRatio(mCentralPanel.getDividerLocation());
+ mScriptModel.storeDialogPositions(this, storage, ScriptEditorPanel.WINDOW_PREFERENCE_STORAGE_PROPERTY);
+ this.setVisible(false);
+ this.dispose();
+ mScriptModel.endDialog(pIsCanceled);
+ }
+
+ IFreeplaneScriptErrorHandler getErrorHandler() {
+ return new IFreeplaneScriptErrorHandler() {
+ public void gotoLine(final int pLineNumber) {
+ ActionUtils.setCaretPosition(mScriptTextField, pLineNumber, 1);
+ }
+ };
+ }
+
+ PrintStream getPrintStream() {
+ try {
+ return new PrintStream(new ResultFieldStream(), false, internalCharset);
+ }
+ catch (final UnsupportedEncodingException e) {
+ return null;
+ }
+ }
+
+ private void select(final int pIndex) {
+ mScriptTextField.setEnabled(pIndex >= 0);
+ mRunAction.setEnabled(pIndex >= 0);
+ mSignAction.setEnabled(pIndex >= 0);
+ if (pIndex < 0) {
+ mScriptTextField.setText("");
+ return;
+ }
+ storeCurrent();
+ mScriptTextField.setText(mScriptModel.getScript(pIndex).getScript());
+ mLastSelected = new Integer(pIndex);
+ if (pIndex >= 0 && mScriptList.getSelectedIndex() != pIndex) {
+ mScriptList.setSelectedIndex(pIndex);
+ }
+ }
+
+ private void storeCurrent() {
+ if (mLastSelected != null) {
+ final int oldIndex = mLastSelected.intValue();
+ mScriptModel.setScript(oldIndex, mScriptModel.getScript(oldIndex).setScript(mScriptTextField.getText()));
+ }
+ }
+
+ private void updateFields() {
+ mListModel.clear();
+ for (int i = 0; i < mScriptModel.getAmountOfScripts(); ++i) {
+ final ScriptHolder script = mScriptModel.getScript(i);
+ mListModel.addElement(script.getScriptName());
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditorProperty.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditorProperty.java
new file mode 100644
index 0000000..920c76b
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditorProperty.java
@@ -0,0 +1,94 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JPopupMenu;
+
+import org.freeplane.core.resources.components.IPropertyControl;
+import org.freeplane.core.resources.components.PropertyBean;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.script.IScriptEditorStarter;
+
+import com.jgoodies.forms.builder.DefaultFormBuilder;
+
+class ScriptEditorProperty extends PropertyBean implements IPropertyControl, ActionListener {
+ JButton mButton;
+ final JPopupMenu menu = new JPopupMenu();
+// final private ModeController mMindMapController;
+ String script;
+
+ /**
+ */
+ public ScriptEditorProperty(final String name) {
+ super(name);
+ mButton = new JButton();
+ mButton.addActionListener(this);
+ script = "";
+ }
+
+ public void actionPerformed(final ActionEvent arg0) {
+ final IScriptEditorStarter plugin = (IScriptEditorStarter) Controller
+ .getCurrentModeController().getExtension(
+ IScriptEditorStarter.class);
+ if (plugin != null) {
+ final IScriptEditorStarter starter = plugin;
+ final String resultScript = starter.startEditor(script);
+ if (resultScript != null) {
+ script = resultScript;
+ firePropertyChangeEvent();
+ }
+ }
+ }
+
+ @Override
+ public String getValue() {
+ return script;
+ }
+
+ public void layout(final DefaultFormBuilder builder) {
+ layout(builder, mButton);
+ }
+
+ public void setEnabled(final boolean pEnabled) {
+ mButton.setEnabled(pEnabled);
+ }
+
+ /**
+ */
+ private void setScriptValue(final String result) {
+ if (result == null) {
+ script = "";
+ }
+ else {
+ script = result;
+ }
+ mButton.setText(script);
+ }
+
+ @Override
+ public void setValue(final String value) {
+ setScriptValue(value);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorWindowConfigurationStorage.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditorWindowConfigurationStorage.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorWindowConfigurationStorage.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptEditorWindowConfigurationStorage.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptRenderer.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptRenderer.java
new file mode 100644
index 0000000..197e94d
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptRenderer.java
@@ -0,0 +1,66 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2011 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.awt.Component;
+import java.awt.Dimension;
+
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JComponent;
+import javax.swing.JList;
+
+import org.freeplane.core.util.HtmlUtils;
+
+/**
+ * @author Dimitry Polivaev
+ * Jul 23, 2011
+ */
+public class ScriptRenderer extends DefaultListCellRenderer{
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
+ boolean cellHasFocus) {
+ final JComponent renderer = (JComponent) super.getListCellRendererComponent(list, firstLine(value), index, isSelected, cellHasFocus);
+ final String script = value.toString();
+ if(script.contains("\n")) {
+ renderer.setToolTipText(HtmlUtils.plainToHTML(script));
+ }
+
+ return renderer;
+ }
+
+ private Object firstLine(Object value) {
+ if(! (value instanceof String) )
+ return value;
+ String script = ((String) value).trim();
+ return script.substring(0, Math.min(40, script.length())).trim().replaceAll("\\s+", " ");
+
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ final Dimension preferredSize = super.getPreferredSize();
+ if(! isPreferredSizeSet())
+ preferredSize.width = 100;
+ return preferredSize;
+ }
+
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptResources.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptResources.java
new file mode 100644
index 0000000..3f24d9a
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptResources.java
@@ -0,0 +1,74 @@
+package org.freeplane.plugin.script;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.List;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.LogUtils;
+
+public class ScriptResources {
+ static final IFreeplaneScriptErrorHandler IGNORING_SCRIPT_ERROR_HANDLER = new IFreeplaneScriptErrorHandler() {
+ @Override
+ public void gotoLine(final int pLineNumber) {
+ }
+ };
+ private static final String RESOURCES_SCRIPT_COMPILATION_DISABLED_EXTENSIONS = "script_compilation_disabled_extensions";
+ static final String RESOURCES_SCRIPT_DIRECTORIES = "script_directories";
+ static final String RESOURCES_SCRIPT_CLASSPATH = "script_classpath";
+ static final String[] SCRIPT_COMPILATION_DISABLED_EXTENSIONS = ResourceController.getResourceController()
+ .getProperty(RESOURCES_SCRIPT_COMPILATION_DISABLED_EXTENSIONS, "").split("\\W+");
+ private static final String USER_SCRIPTS_DIR = "scripts";
+ private static final String INIT_SCRIPTS_DIR = "scripts/init";
+ private static final String USER_LIB_DIR = "lib";
+ private static final String BUILTIN_SCRIPTS_DIR = "scripts";
+ private static List<String> classpath;
+ private static final File builtinScriptsDir = buildBuiltinScriptsDir();
+ private static final File userScriptsDir = buildUserScriptsDir(ScriptResources.USER_SCRIPTS_DIR);
+ private static final File initScriptsDir = buildUserScriptsDir(ScriptResources.INIT_SCRIPTS_DIR);
+ private static final File userLibDir = buildUserScriptsDir(ScriptResources.USER_LIB_DIR);
+
+ /** @deprecated use {@link #getUserScriptDir()} instead. */
+ public static File getUserScriptDir() {
+ return getUserScriptsDir();
+ }
+
+ public static File getUserScriptsDir() {
+ return userScriptsDir;
+ }
+
+ public static File getInitScriptsDir() {
+ return initScriptsDir;
+ }
+
+ public static File getUserLibDir() {
+ return userLibDir;
+ }
+
+ static File getBuiltinScriptsDir() {
+ return builtinScriptsDir;
+ }
+
+ static List<String> getClasspath() {
+ return classpath;
+ }
+
+ /** allows to set the classpath for scripts. Due to security considerations it's not possible to set
+ * this more than once. */
+ static void setClasspath(final List<String> newClasspath) {
+ if (classpath != null)
+ throw new SecurityException("reset of script classpath is forbidden.");
+ classpath = Collections.unmodifiableList(newClasspath);
+ if (!classpath.isEmpty())
+ LogUtils.info("extending script's classpath by " + classpath);
+ }
+
+ private static File buildBuiltinScriptsDir() {
+ return new File(ResourceController.getResourceController().getInstallationBaseDir(), BUILTIN_SCRIPTS_DIR);
+ }
+
+ private static File buildUserScriptsDir(String userDir) {
+ return new File(ResourceController.getResourceController().getFreeplaneUserDirectory(),
+ userDir);
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptSecurity.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptSecurity.java
new file mode 100644
index 0000000..15b5c84
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptSecurity.java
@@ -0,0 +1,74 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2012 Dimitry
+ *
+ * This file author is Dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.PrintStream;
+
+import org.freeplane.core.resources.ResourceController;
+
+/**
+ * @author Dimitry Polivaev 19.12.2012
+ */
+public class ScriptSecurity {
+ final private Object script;
+
+ final private ScriptingPermissions specificPermissions;
+
+ final private PrintStream outStream;
+
+ public ScriptSecurity(Object script, ScriptingPermissions specificPermissions,
+ PrintStream outStream) {
+ super();
+ this.script = script;
+ this.specificPermissions = specificPermissions;
+ this.outStream = outStream;
+ }
+
+ ScriptingSecurityManager getScriptingSecurityManager() {
+ final ScriptingSecurityManager scriptingSecurityManager;
+ // get preferences (and store them again after the script execution,
+ // such that the scripts are not able to change them).
+ final ScriptingPermissions permissions = permissions();
+ permissions.assertScriptExecutionAllowed();
+ final boolean executeSignedScripts = permissions
+ .isExecuteSignedScriptsWithoutRestriction();
+ if (executeSignedScripts && isSignedScript()) {
+ scriptingSecurityManager = permissions.getPermissiveScriptingSecurityManager();
+ } else {
+ scriptingSecurityManager = permissions.getScriptingSecurityManager();
+ }
+ return scriptingSecurityManager;
+ }
+
+ private boolean isSignedScript() {
+ return script instanceof String && new SignedScriptHandler().isScriptSigned((String) script,
+ outStream);
+ }
+
+ private ScriptingPermissions permissions() {
+ if (specificPermissions != null) {
+ return specificPermissions;
+ } else {
+ return new ScriptingPermissions(ResourceController.getResourceController()
+ .getProperties());
+ }
+ }
+
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingConfiguration.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingConfiguration.java
new file mode 100644
index 0000000..49b64d6
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingConfiguration.java
@@ -0,0 +1,471 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2009 Volker Boerchers
+ *
+ * This file author is Volker Boerchers
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.script.ScriptEngineFactory;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.ConfigurationUtils;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.MenuUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.main.addons.AddOnProperties;
+import org.freeplane.main.addons.AddOnProperties.AddOnType;
+import org.freeplane.main.addons.AddOnsController;
+import org.freeplane.plugin.script.ExecuteScriptAction.ExecutionMode;
+import org.freeplane.plugin.script.addons.ScriptAddOnProperties;
+import org.freeplane.plugin.script.addons.ScriptAddOnProperties.Script;
+
+/**
+ * scans for scripts to be registered via {@link ScriptingRegistration}.
+ *
+ * @author Volker Boerchers
+ */
+class ScriptingConfiguration {
+ private static final ExecutionMode DEFAULT_EXECUTION_MODE = ExecutionMode.ON_SELECTED_NODE;
+ static class ScriptMetaData {
+ private final TreeMap<ExecutionMode, String> executionModeLocationMap = new TreeMap<ExecutionMode, String>();
+ private final TreeMap<ExecutionMode, String> executionModeTitleKeyMap = new TreeMap<ExecutionMode, String>();
+ private final String scriptName;
+ private ScriptingPermissions permissions;
+
+ ScriptMetaData(final String scriptName) {
+ this.scriptName = scriptName;
+ }
+
+ public Set<ExecutionMode> getExecutionModes() {
+ return executionModeLocationMap.keySet();
+ }
+
+ public void addExecutionMode(final ExecutionMode executionMode, final String location, final String titleKey) {
+ executionModeLocationMap.put(executionMode, location);
+ if (titleKey != null)
+ executionModeTitleKeyMap.put(executionMode, titleKey);
+ }
+
+ protected String getMenuLocation(final ExecutionMode executionMode) {
+ return executionModeLocationMap.get(executionMode);
+ }
+
+ public String getTitleKey(final ExecutionMode executionMode) {
+ final String key = executionModeTitleKeyMap.get(executionMode);
+ return key == null ? getExecutionModeKey(executionMode) : key;
+ }
+
+ public String getScriptName() {
+ return scriptName;
+ }
+
+ public void setPermissions(ScriptingPermissions permissions) {
+ this.permissions = permissions;
+ }
+
+ public ScriptingPermissions getPermissions() {
+ return permissions;
+ }
+
+ public boolean hasMenuLocation() {
+ for (String location : executionModeLocationMap.values()) {
+ if (location != null)
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return "ScriptMetaData(" + scriptName + ", locations: " + executionModeLocationMap + ", titles: "
+ + executionModeTitleKeyMap + ")";
+ }
+ }
+
+ private static final String JAR_REGEX = ".+\\.jar$";
+ private final TreeMap<String, String> menuTitleToPathMap = new TreeMap<String, String>();
+ private final TreeMap<String, ScriptMetaData> menuTitleToMetaDataMap = new TreeMap<String, ScriptMetaData>();
+ private List<IScript> initScripts;
+ private static Map<String, Object> staticProperties = createStaticProperties();
+
+ ScriptingConfiguration() {
+ ScriptResources.setClasspath(buildClasspath());
+ addPluginDefaults();
+ initMenuTitleToPathMap();
+ }
+
+ private void addPluginDefaults() {
+ final URL defaults = this.getClass().getResource(ResourceController.PLUGIN_DEFAULTS_RESOURCE);
+ if (defaults == null)
+ throw new RuntimeException("cannot open " + ResourceController.PLUGIN_DEFAULTS_RESOURCE);
+ Controller.getCurrentController().getResourceController().addDefaults(defaults);
+ }
+
+ private void initMenuTitleToPathMap() {
+ final Map<File, Script> addOnScriptMap = createAddOnScriptMap();
+ addAddOnScripts(addOnScriptMap);
+ addNonAddOnScripts(addOnScriptMap);
+ }
+
+ private void addAddOnScripts(Map<File, Script> addOnScriptMap) {
+ for (File file : addOnScriptMap.keySet()) {
+ addScript(file, addOnScriptMap);
+ }
+ }
+
+ private void addNonAddOnScripts(final Map<File, Script> addOnScriptMap) {
+ final FilenameFilter scriptFilenameFilter = createFilenameFilter(createScriptRegExp());
+ for (File dir : getScriptDirs()) {
+ addNonAddOnScripts(dir, addOnScriptMap, scriptFilenameFilter);
+ }
+ this.initScripts = findInitScripts(scriptFilenameFilter);
+ }
+
+ private List<IScript> findInitScripts(final FilenameFilter scriptFilenameFilter) {
+ final List<IScript> initScripts = new ArrayList<IScript>(0);
+ if (ScriptResources.getInitScriptsDir().isDirectory()) {
+ ScriptingPermissions standardPermissions = null;
+ File[] list = ScriptResources.getInitScriptsDir().listFiles(scriptFilenameFilter);
+ for (File file : list) {
+ initScripts.add(ScriptingEngine.createScriptForFile(file, standardPermissions));
+ }
+ }
+ return initScripts;
+ }
+
+ private Map<File, Script> createAddOnScriptMap() {
+ Map<File, Script> result = new LinkedHashMap<File, Script>();
+ for (ScriptAddOnProperties scriptAddOnProperties : getInstalledScriptAddOns()) {
+ final List<Script> scripts = scriptAddOnProperties.getScripts();
+ for (Script script : scripts) {
+ script.active = scriptAddOnProperties.isActive();
+ result.put(findScriptFile(scriptAddOnProperties, script), script);
+ }
+ }
+ return result;
+ }
+
+ private List<ScriptAddOnProperties> getInstalledScriptAddOns() {
+ final List<ScriptAddOnProperties> installedAddOns = new ArrayList<ScriptAddOnProperties>();
+ for (AddOnProperties addOnProperties : AddOnsController.getController().getInstalledAddOns()) {
+ if (addOnProperties.getAddOnType() == AddOnType.SCRIPT) {
+ installedAddOns.add((ScriptAddOnProperties) addOnProperties);
+ }
+ }
+ return installedAddOns;
+ }
+
+ private File findScriptFile(AddOnProperties addOnProperties, Script script) {
+ final File dir = new File(getPrivateAddOnDirectory(addOnProperties), "scripts");
+ final File result = new File(dir, script.name);
+ return result.exists() ? result : findScriptFile_pre_1_3_x_final(script);
+ }
+
+ private File getPrivateAddOnDirectory(AddOnProperties addOnProperties) {
+ return new File(AddOnsController.getController().getAddOnsDir(), addOnProperties.getName());
+ }
+
+ // add-on scripts are installed in a add-on-private directory since 1.3.x_beta
+ @Deprecated
+ private File findScriptFile_pre_1_3_x_final(Script script) {
+ return new File(ScriptResources.getUserScriptsDir(), script.name);
+ }
+
+ private TreeSet<File> getScriptDirs() {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final String dirsString = resourceController.getProperty(ScriptResources.RESOURCES_SCRIPT_DIRECTORIES);
+ final TreeSet<File> dirs = new TreeSet<File>(); // remove duplicates -> Set
+ if (dirsString != null) {
+ for (String dir : ConfigurationUtils.decodeListValue(dirsString, false)) {
+ dirs.add(createFile(dir));
+ }
+ }
+ dirs.add(ScriptResources.getBuiltinScriptsDir());
+ dirs.add(ScriptResources.getUserScriptsDir());
+ return dirs;
+ }
+
+ /**
+ * if <code>path</code> is not an absolute path, prepends the freeplane user
+ * directory to it.
+ */
+ private File createFile(final String path) {
+ File file = new File(path);
+ if (!file.isAbsolute()) {
+ file = new File(ResourceController.getResourceController().getFreeplaneUserDirectory(), path);
+ }
+ return file;
+ }
+
+ /** scans <code>dir</code> for script files matching a given rexgex. */
+ private void addNonAddOnScripts(final File dir, final Map<File, Script> addOnScriptMap,
+ FilenameFilter filenameFilter) {
+ // add all addOn scripts
+ // find further scripts in configured directories
+ if (dir.isDirectory()) {
+ final File[] files = dir.listFiles(filenameFilter);
+ if (files != null) {
+ for (final File file : files) {
+ if (addOnScriptMap.get(file) == null)
+ addScript(file, addOnScriptMap);
+ }
+ }
+ }
+ else {
+ LogUtils.warn("not a (script) directory: " + dir);
+ }
+ }
+
+ private String createScriptRegExp() {
+ final ArrayList<String> extensions = new ArrayList<String>();
+// extensions.add("clj");
+ for (ScriptEngineFactory scriptEngineFactory : GenericScript.createScriptEngineFactories()) {
+ extensions.addAll(scriptEngineFactory.getExtensions());
+ }
+ LogUtils.info("looking for scripts with the following endings: " + extensions);
+ return ".+\\.(" + StringUtils.join(extensions, "|") + ")$";
+ }
+
+ private FilenameFilter createFilenameFilter(final String regexp) {
+ final FilenameFilter filter = new FilenameFilter() {
+ public boolean accept(final File dir, final String name) {
+ return name.matches(regexp);
+ }
+ };
+ return filter;
+ }
+
+ private void addScript(final File file, final Map<File, Script> addOnScriptMap) {
+ final Script scriptConfig = addOnScriptMap.get(file);
+ if (scriptConfig != null && !scriptConfig.active) {
+ LogUtils.info("skipping deactivated " + scriptConfig);
+ return;
+ }
+ final String menuTitle = disambiguateMenuTitle(getOrCreateMenuTitle(file, scriptConfig));
+ try {
+ menuTitleToPathMap.put(menuTitle, file.getAbsolutePath());
+ final ScriptMetaData metaData = createMetaData(file, menuTitle, scriptConfig);
+ menuTitleToMetaDataMap.put(menuTitle, metaData);
+ final File parentFile = file.getParentFile();
+ if (parentFile.equals(ScriptResources.getBuiltinScriptsDir())) {
+ metaData.setPermissions(ScriptingPermissions.getPermissiveScriptingPermissions());
+ }
+ }
+ catch (final IOException e) {
+ LogUtils.warn("problems with script " + file.getAbsolutePath(), e);
+ menuTitleToPathMap.remove(menuTitle);
+ menuTitleToMetaDataMap.remove(menuTitle);
+ }
+ }
+
+ private String disambiguateMenuTitle(final String menuTitleOrig) {
+ String menuTitle = menuTitleOrig;
+ // add suffix if the same script exists in multiple dirs
+ for (int i = 2; menuTitleToPathMap.containsKey(menuTitle); ++i) {
+ menuTitle = menuTitleOrig + i;
+ }
+ return menuTitle;
+ }
+
+ private ScriptMetaData createMetaData(final File file, final String scriptName,
+ final Script scriptConfig) throws IOException {
+ return scriptConfig == null ? analyseScriptContent(FileUtils.slurpFile(file), scriptName) //
+ : createMetaData(scriptName, scriptConfig);
+ }
+
+ // not private to enable tests
+ ScriptMetaData analyseScriptContent(final String content, final String scriptName) {
+ final ScriptMetaData metaData = new ScriptMetaData(scriptName);
+ setExecutionModes(content, metaData);
+ return metaData;
+ }
+
+ private ScriptMetaData createMetaData(final String scriptName, final Script scriptConfig) {
+ final ScriptMetaData metaData = new ScriptMetaData(scriptName);
+ metaData.addExecutionMode(scriptConfig.executionMode, scriptConfig.menuLocation, scriptConfig.menuTitleKey);
+ metaData.setPermissions(scriptConfig.permissions);
+ return metaData;
+ }
+
+ public static void setExecutionModes(final String content, final ScriptMetaData metaData) {
+ final String modeName = StringUtils.join(ExecutionMode.values(), "|");
+ final String modeDef = "(?:ExecutionMode\\.)?(" + modeName + ")(?:=\"([^]\"]+)(?:\\[([^]\"]+)\\])?\")?";
+ final String modeDefs = "(?:" + modeDef + ",?)+";
+ final Pattern pOuter = makeCaseInsensitivePattern("@ExecutionModes\\(\\{(" + modeDefs + ")\\}\\)");
+ final Matcher mOuter = pOuter.matcher(content.replaceAll("\\s+", ""));
+ if (!mOuter.find()) {
+ metaData.addExecutionMode(DEFAULT_EXECUTION_MODE, null, null);
+// System.err.println(metaData.getScriptName() + ": '" + pOuter + "' did not match "
+// + content.replaceAll("\\s+", ""));
+ return;
+ }
+ final Pattern pattern = makeCaseInsensitivePattern(modeDef);
+ final String[] locations = mOuter.group(1).split(",");
+ for (String match : locations) {
+ final Matcher m = pattern.matcher(match);
+ if (m.matches()) {
+// System.err.println(metaData.getScriptName() + ":" + m.group(1) + "->" + m.group(2) + "->" + m.group(3));
+ metaData.addExecutionMode(ExecutionMode.valueOf(m.group(1).toUpperCase(Locale.ENGLISH)), m.group(2),
+ m.group(3));
+ }
+ else {
+ LogUtils.severe("script " + metaData.getScriptName() + ": not a menu location: '" + match + "'");
+ continue;
+ }
+ }
+ }
+
+ /** some beautification: remove directory and suffix + make first letter uppercase. */
+ private String getOrCreateMenuTitle(final File file, Script scriptConfig) {
+ if (scriptConfig != null)
+ return scriptConfig.menuTitleKey;
+ // TODO: we could add mnemonics handling here! (e.g. by reading '_' as '&')
+ String string = file.getName().replaceFirst("\\.[^.]+", "");
+ // fixup characters that might cause problems in menus
+ string = string.replaceAll("\\s+", "_");
+ return string.length() < 2 ? string : string.substring(0, 1).toUpperCase() + string.substring(1);
+ }
+
+ private static Pattern makeCaseInsensitivePattern(final String regexp) {
+ return Pattern.compile(regexp, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
+ }
+
+ SortedMap<String, String> getMenuTitleToPathMap() {
+ return Collections.unmodifiableSortedMap(menuTitleToPathMap);
+ }
+
+ SortedMap<String, ScriptMetaData> getMenuTitleToMetaDataMap() {
+ return Collections.unmodifiableSortedMap(menuTitleToMetaDataMap);
+ }
+
+ private ArrayList<String> buildClasspath() {
+ final ArrayList<String> classpath = new ArrayList<String>();
+ addClasspathForAddOns(classpath);
+ addClasspathForConfiguredEntries(classpath);
+ return classpath;
+ }
+
+ private void addClasspathForAddOns(final ArrayList<String> classpath) {
+ final List<ScriptAddOnProperties> installedScriptAddOns = getInstalledScriptAddOns();
+ for (ScriptAddOnProperties scriptAddOnProperties : installedScriptAddOns) {
+ final List<String> lib = scriptAddOnProperties.getLib();
+ if (lib != null) {
+ for (String libEntry : lib) {
+ final File dir = new File(getPrivateAddOnDirectory(scriptAddOnProperties), "lib");
+ classpath.add(new File(dir, libEntry).getAbsolutePath());
+ }
+ }
+ }
+ }
+
+ private void addClasspathForConfiguredEntries(final ArrayList<String> classpath) {
+ for (File classpathElement : uniqueClassPathElements(ResourceController.getResourceController())) {
+ addClasspathElement(classpath, classpathElement);
+ }
+ }
+
+ private Set<File> uniqueClassPathElements(final ResourceController resourceController) {
+ final String classpathString = resourceController.getProperty(ScriptResources.RESOURCES_SCRIPT_CLASSPATH);
+ final TreeSet<File> classpathElements = new TreeSet<File>();
+ if (classpathString != null) {
+ for (String string : ConfigurationUtils.decodeListValue(classpathString, false)) {
+ classpathElements.add(createFile(string));
+ }
+ }
+ classpathElements.add(ScriptResources.getUserLibDir());
+ return classpathElements;
+ }
+
+ private void addClasspathElement(final ArrayList<String> classpath, File classpathElement) {
+ final File file = classpathElement;
+ if (!file.exists()) {
+ LogUtils.warn("classpath entry '" + classpathElement + "' doesn't exist. (Use " + File.pathSeparator
+ + " to separate entries.)");
+ }
+ else if (file.isDirectory()) {
+ classpath.add(file.getAbsolutePath());
+ for (final File jar : file.listFiles(createFilenameFilter(JAR_REGEX))) {
+ classpath.add(jar.getAbsolutePath());
+ }
+ }
+ else {
+ classpath.add(file.getAbsolutePath());
+ }
+ }
+
+ List<String> getClasspath() {
+ return ScriptResources.getClasspath();
+ }
+
+ public static Map<String, Object> getStaticProperties() {
+ return staticProperties;
+ }
+
+ private static Map<String, Object> createStaticProperties() {
+ Map<String, Object> properties = new LinkedHashMap<String, Object>();
+ properties.put("logger", new LogUtils());
+ properties.put("ui", new UITools());
+ properties.put("htmlUtils", HtmlUtils.getInstance());
+ properties.put("textUtils", new TextUtils());
+ properties.put("menuUtils", new MenuUtils());
+ properties.put("config", new FreeplaneScriptBaseClass.ConfigProperties());
+ return properties;
+ }
+
+ static String getExecutionModeKey(final ExecuteScriptAction.ExecutionMode executionMode) {
+ switch (executionMode) {
+ case ON_SINGLE_NODE:
+ return "ExecuteScriptOnSingleNode.text";
+ case ON_SELECTED_NODE:
+ return "ExecuteScriptOnSelectedNode.text";
+ case ON_SELECTED_NODE_RECURSIVELY:
+ return "ExecuteScriptOnSelectedNodeRecursively.text";
+ default:
+ throw new AssertionError("unknown ExecutionMode " + executionMode);
+ }
+ }
+
+ public static String getScriptsLocation(String parentKey) {
+ return parentKey + "/scripts";
+ }
+
+ public List<IScript> getInitScripts() {
+ return initScripts;
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingEngine.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingEngine.java
new file mode 100644
index 0000000..4fba15c
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingEngine.java
@@ -0,0 +1,156 @@
+/*
+ * Freeplane - A Program for creating and viewing MindmapsCopyright (C) 2000-2006
+ * Joerg Mueller, Daniel Polansky, Christian Foltin and others.See COPYING for
+ * DetailsThis program is free software; you can redistribute it and/ormodify it
+ * under the terms of the GNU General Public Licenseas published by the Free
+ * Software Foundation; either version 2of the License, or (at your option) any
+ * later version.This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for
+ * more details.You should have received a copy of the GNU General Public
+ * Licensealong with this program; if not, write to the Free SoftwareFoundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Created on
+ * 02.09.2006
+ */
+/*
+ * $Id: ScriptingEngine.java,v 1.1.2.20 2008/04/18 21:18:26 christianfoltin Exp
+ * $
+ */
+package org.freeplane.plugin.script;
+
+import java.io.File;
+import java.io.PrintStream;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.regex.Matcher;
+
+import org.apache.commons.lang.WordUtils;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+
+/**
+ * @author foltin
+ */
+public class ScriptingEngine {
+ public static final String SCRIPT_PREFIX = "script";
+ // need a File for caching! Scripts from String have to be cached elsewhere
+ private static Map<File, IScript> scriptCache = new WeakHashMap<File, IScript>();
+ /**
+ * @param permissions if null use default scripting permissions.
+ * @return the result of the script, or null, if the user has cancelled.
+ * @throws ExecuteScriptException on errors
+ */
+ public static Object executeScript(final NodeModel node, final String script, final IFreeplaneScriptErrorHandler pErrorHandler,
+ final PrintStream pOutStream, final ScriptContext scriptContext,
+ ScriptingPermissions permissions) {
+ return new GroovyScript(script, permissions)
+ .setErrorHandler(pErrorHandler)
+ .setOutStream(pOutStream)
+ .setScriptContext(scriptContext)
+ .execute(node);
+
+ }
+
+ static Object executeScript(final NodeModel node, final File script, final IFreeplaneScriptErrorHandler pErrorHandler,
+ final PrintStream pOutStream, final ScriptContext scriptContext,
+ ScriptingPermissions permissions) {
+ return createScriptForFile(script, permissions) //
+ .setErrorHandler(pErrorHandler) //
+ .setOutStream(pOutStream) //
+ .setScriptContext(scriptContext) //
+ .execute(node);
+ }
+
+ public static int findLineNumberInString(final String resultString, int lineNumber) {
+ final java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(".*@ line ([0-9]+).*",
+ java.util.regex.Pattern.DOTALL);
+ final Matcher matcher = pattern.matcher(resultString);
+ if (matcher.matches()) {
+ lineNumber = Integer.parseInt(matcher.group(1));
+ }
+ return lineNumber;
+ }
+
+ public static Object executeScript(final NodeModel node, final String script) {
+ return new GroovyScript(script).execute(node);
+ }
+
+ public static Object executeScript(NodeModel node, File script, ScriptingPermissions permissions) {
+ return createScriptForFile(script, permissions).execute(node);
+ }
+
+ public synchronized static IScript createScriptForFile(File scriptFile, ScriptingPermissions permissions) {
+ IScript script = scriptCache.get(scriptFile);
+ if (script == null || script.permissionsEquals(permissions)) {
+ final boolean isGroovy = scriptFile.getName().endsWith(".groovy");
+ script = isGroovy ? new GroovyScript(scriptFile, permissions) : new GenericScript(scriptFile, permissions);
+ scriptCache.put(scriptFile, script);
+ }
+ return script;
+ }
+
+ public static Object executeScript(NodeModel node, String script, ScriptingPermissions permissions) {
+ return new GroovyScript(script, permissions) //
+ .execute(node);
+ }
+
+ public static Object executeScript(NodeModel node, String script, PrintStream printStream) {
+ return new GroovyScript(script) //
+ .setOutStream(printStream) //
+ .execute(node);
+ }
+
+ public static Object executeScript(final NodeModel node, final String script, final ScriptContext scriptContext,
+ final ScriptingPermissions permissions) {
+ return new GroovyScript(script, permissions) //
+ .setScriptContext(scriptContext) //
+ .execute(node);
+ }
+
+ static void performScriptOperationRecursive(final NodeModel node) {
+ ModeController modeController = Controller.getCurrentModeController();
+ for (final NodeModel child : modeController.getMapController().childrenUnfolded(node)) {
+ performScriptOperationRecursive(child);
+ }
+ performScriptOperation(node);
+ }
+
+ static void performScriptOperation(final NodeModel node) {
+ final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
+ if (attributes == null) {
+ return;
+ }
+ for (int row = 0; row < attributes.getRowCount(); ++row) {
+ final String attrKey = (String) attributes.getName(row);
+ final Object value = attributes.getValue(row);
+ if(value instanceof String){
+ final String script = (String) value;
+ if (attrKey.startsWith(ScriptingEngine.SCRIPT_PREFIX)) {
+ executeScript(node, script);
+ }
+ }
+ }
+ return;
+ }
+
+ /** @deprecated use ScriptResources.getUserScriptDir() instead. */
+ @Deprecated
+ public static File getUserScriptDir() {
+ return ScriptResources.getUserScriptDir();
+ }
+
+ static void showScriptExceptionErrorMessage(ExecuteScriptException ex) {
+ if (ex.getCause() instanceof SecurityException) {
+ final String message = WordUtils.wrap(ex.getCause().getMessage(), 80, "\n ", false);
+ UITools.errorMessage(TextUtils.format("ExecuteScriptSecurityError.text", message));
+ }
+ else {
+ final String message = WordUtils.wrap(ex.getMessage(), 80, "\n ", false);
+ UITools.errorMessage(TextUtils.format("ExecuteScriptError.text", message));
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingMenuEntryVisitor.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingMenuEntryVisitor.java
new file mode 100644
index 0000000..339bd62
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingMenuEntryVisitor.java
@@ -0,0 +1,182 @@
+package org.freeplane.plugin.script;
+
+import static org.freeplane.plugin.script.ScriptingMenuUtils.noScriptsAvailableMessage;
+import static org.freeplane.plugin.script.ScriptingMenuUtils.scriptNameToMenuItemTitle;
+
+import java.awt.event.ActionEvent;
+import java.util.HashSet;
+import java.util.Map;
+
+import javax.swing.Action;
+
+import org.freeplane.core.ui.AFreeplaneAction;
+import org.freeplane.core.ui.menubuilders.generic.BuildPhaseListener;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryNavigator;
+import org.freeplane.core.ui.menubuilders.generic.EntryNavigatorFactory;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.plugin.script.ExecuteScriptAction.ExecutionMode;
+import org.freeplane.plugin.script.ScriptingConfiguration.ScriptMetaData;
+
+public class ScriptingMenuEntryVisitor implements EntryVisitor, BuildPhaseListener {
+ private ScriptingConfiguration configuration;
+ private final HashSet<String> registeredLocations = new HashSet<String>();
+ private EntryNavigator entryNavigator;
+ private ModeController modeController;
+
+ public ScriptingMenuEntryVisitor(ScriptingConfiguration configuration, ModeController modeController) {
+ this.configuration = configuration;
+ this.modeController = modeController;
+ }
+
+ private EntryNavigator initEntryNavigator(Entry scriptingEntry) {
+ if (entryNavigator == null) {
+ entryNavigator = new EntryNavigatorFactory().createNavigator();
+ }
+ return entryNavigator;
+ }
+
+ /** builds menu entries for scripts without a special menu location. */
+ @Override
+ public void visit(Entry target) {
+ initEntryNavigator(target);
+ for (final Map.Entry<String, String> entry : configuration.getMenuTitleToPathMap().entrySet()) {
+ String scriptName = entry.getKey();
+ final ScriptMetaData metaData = configuration.getMenuTitleToMetaDataMap().get(scriptName);
+ if (!metaData.hasMenuLocation()) {
+ for (final ExecutionMode executionMode : metaData.getExecutionModes()) {
+ target.addChild(createEntry(scriptName, entry.getValue(), executionMode));
+ }
+ }
+ // else: see buildPhaseFinished
+ }
+ if (target.isLeaf()) {
+ target.addChild(createNoScriptsAvailableAction());
+ }
+ }
+
+ @Override
+ public void buildPhaseFinished(Phase actions, Entry target) {
+ if (target.getParent() == null && actions == Phase.ACTIONS) {
+ buildEntriesWithSpecialMenuLocation(target);
+ }
+ }
+
+ private void buildEntriesWithSpecialMenuLocation(Entry target) {
+ for (final Map.Entry<String, String> entry : configuration.getMenuTitleToPathMap().entrySet()) {
+ final ScriptMetaData metaData = configuration.getMenuTitleToMetaDataMap().get(entry.getKey());
+ if (metaData.hasMenuLocation()) {
+ addEntryForGivenLocation(target.getRoot(), metaData, entry.getValue());
+ }
+ // else: see visit
+ }
+ }
+
+ private void addEntryForGivenLocation(Entry rootEntry, final ScriptMetaData metaData, String scriptPath) {
+ for (final ExecutionMode executionMode : metaData.getExecutionModes()) {
+ final String location = metaData.getMenuLocation(executionMode);
+ if (registeredLocations.add(location + "/" + metaData.getScriptName())) {
+ Entry parentEntry = findOrCreateEntry(rootEntry, location);
+ if (parentEntry == null)
+ throw new RuntimeException("internal error: cannot add entry for " + location);
+ Entry entry = createEntry(metaData.getScriptName(), scriptPath, executionMode);
+ parentEntry.addChild(entry);;
+ }
+ }
+ }
+
+ private Entry findOrCreateEntry(Entry rootEntry, final String path) {
+ Entry entry = entryNavigator.findChildByPath(rootEntry, path);
+ if (entry == null) {
+ // System.err.println("creating submenu " + path);
+ Entry parent = findOrCreateEntry(rootEntry, ScriptingMenuUtils.parentLocation(path));
+ Entry menuEntry = new Entry();
+ menuEntry.setName(lastPathElement(path));
+ menuEntry.setAttribute("text", scriptNameToMenuItemTitle(lastPathElement(path)));
+ parent.addChild(menuEntry);
+ return menuEntry;
+ }
+ return entry;
+ }
+
+ private String lastPathElement(String path) {
+ int indexOfSlash = path.lastIndexOf('/');
+ // even works if not found (-1 + 1 = 0)
+ return path.substring(indexOfSlash + 1);
+ }
+
+ private Entry createNoScriptsAvailableAction() {
+ final Entry entry = new Entry();
+ entry.setName("NoScriptsAvailableAction");
+ @SuppressWarnings("serial")
+ final AFreeplaneAction noScriptsAvailableAction = new AFreeplaneAction("NoScriptsAvailableAction", noScriptsAvailableMessage(), null) {
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ }
+ };
+ new EntryAccessor().setAction(entry, noScriptsAvailableAction);
+ return entry;
+ }
+
+ private Entry createEntry(final String scriptName, final String scriptPath, ExecutionMode executionMode) {
+ final ScriptMetaData metaData = configuration.getMenuTitleToMetaDataMap().get(scriptName);
+ final String title = scriptNameToMenuItemTitle(scriptName);
+ return createEntry(createAction(scriptName, scriptPath, executionMode, metaData, title));
+ }
+
+ private Entry createEntry(AFreeplaneAction action) {
+ final EntryAccessor entryAccessor = new EntryAccessor();
+ final Entry scriptEntry = new Entry();
+ scriptEntry.setName(action.getKey());
+ // System.err.println("registering " + scriptEntry.getName());
+ entryAccessor.setAction(scriptEntry, action);
+ return scriptEntry;
+ }
+
+ private AFreeplaneAction createAction(final String scriptName, final String scriptPath,
+ ExecutionMode executionMode, final ScriptMetaData metaData, final String title) {
+ final String key = ExecuteScriptAction.makeMenuItemKey(scriptName, executionMode);
+ final AFreeplaneAction alreadyRegisteredAction = modeController.getAction(key);
+ if (alreadyRegisteredAction == null) {
+ String longTitle = createTooltip(title, executionMode);
+ String menuItemTitle = hasMultipleExcecutionModes(metaData) ? longTitle : title;
+ AFreeplaneAction action = new ExecuteScriptAction(scriptName, menuItemTitle, scriptPath, executionMode,
+ metaData.getPermissions());
+ action.putValue(Action.SHORT_DESCRIPTION, longTitle);
+ action.putValue(Action.LONG_DESCRIPTION, longTitle);
+ modeController.addAction(action);
+ return action;
+ }
+ else {
+ return alreadyRegisteredAction;
+ }
+ }
+
+ private boolean hasMultipleExcecutionModes(ScriptMetaData metaData) {
+ return metaData.getExecutionModes().size() > 1;
+ }
+
+ private String createTooltip(String title, ExecutionMode mode) {
+ return TextUtils.format(executionMode2TranslationProperty(mode), title);
+ }
+
+ private String executionMode2TranslationProperty(ExecutionMode mode) {
+ switch (mode) {
+ case ON_SINGLE_NODE:
+ return "ExecuteScriptOnSingleNode.text";
+ case ON_SELECTED_NODE_RECURSIVELY:
+ return "ExecuteScriptOnSelectedNodeRecursively.text";
+ default:
+ return "ExecuteScriptOnSelectedNode.text";
+ }
+ }
+
+ @Override
+ public boolean shouldSkipChildren(Entry entry) {
+ return true;
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingMenuUtils.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingMenuUtils.java
new file mode 100644
index 0000000..5362759
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingMenuUtils.java
@@ -0,0 +1,65 @@
+package org.freeplane.plugin.script;
+
+import java.text.MessageFormat;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.plugin.script.ExecuteScriptAction.ExecutionMode;
+import org.freeplane.plugin.script.ScriptingConfiguration.ScriptMetaData;
+
+public class ScriptingMenuUtils {
+ static final String LABEL_AVAILABLE_MODES_TOOLTIP = "ExecuteScript.available_modes_tooltip";
+ static final String LABEL_NO_SCRIPTS_AVAILABLE = "ExecuteScripts.noScriptsAvailable";
+
+ public static String parentLocation(String location) {
+ int indexOfSlash = location.lastIndexOf('/');
+ if (indexOfSlash == -1)
+ throw new IllegalArgumentException("location is not an absolute path: " + location);
+ return location.substring(0, indexOfSlash);
+ }
+
+ public static String getMenuItemTitle(ScriptMetaData metaData, ExecutionMode executionMode) {
+ final String titleKey = metaData.getTitleKey(executionMode);
+ final String scriptName = metaData.getScriptName();
+ final String translation = TextUtils.getText(titleKey, titleKey.replace('_', ' '));
+ return translation.contains("{0}") ? MessageFormat.format(translation, scriptNameToMenuItemTitle(scriptName))
+ : translation;
+ }
+
+ /** menuTitle may either be a scriptName or a translation key. */
+ public static String scriptNameToMenuItemTitle(final String scriptName) {
+ final String translation = TextUtils.getText(scriptName, null);
+ if (translation != null) {
+ return translation;
+ }
+ else {
+ // convert CamelCase to Camel Case
+ String capitalized = (scriptName.length() < 2) ? scriptName
+ : scriptName.substring(0, 1).toUpperCase() + scriptName.substring(1);
+ return capitalized.replaceAll("([a-z])([A-Z])", "$1 $2");
+ }
+ }
+
+ public static String noScriptsAvailableMessage() {
+ return "<html><body><em>" + TextUtils.getText(ScriptingMenuUtils.LABEL_NO_SCRIPTS_AVAILABLE)
+ + "</em></body></html>";
+ }
+
+ public static String getMenuTitle(ScriptMetaData metaData, ExecutionMode executionMode) {
+ final String specialLocation = metaData.getMenuLocation(executionMode);
+ if (specialLocation == null) {
+ return scriptNameToMenuItemTitle(metaData.getScriptName());
+ }
+ else {
+ return getTitleForLocation(specialLocation);
+ }
+ }
+
+ // location might be something like /menu_bar/edit/editGoodies.
+ // Use the last path element for label lookup
+ // Try to find text by 1. direct match or 2. with "addons." prefix or 3. use it verbatim
+ public static String getTitleForLocation(final String location) {
+ int index = location.lastIndexOf('/');
+ final String lastKey = location.substring(index + 1);
+ return TextUtils.getText(lastKey, TextUtils.getText("addons." + lastKey, lastKey));
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingPermissions.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingPermissions.java
new file mode 100644
index 0000000..ec6c864
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingPermissions.java
@@ -0,0 +1,185 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file author is Christian Foltin
+ * It is modified by Volker Boerchers in 2011.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.swing.JOptionPane;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
+import org.freeplane.core.util.TextUtils;
+
+/**
+ * @author Volker Boerchers
+ */
+public class ScriptingPermissions {
+ final Map<String, Boolean> permissions = new LinkedHashMap<String, Boolean>();
+ public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING = "execute_scripts_without_asking";
+ public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION = "execute_scripts_without_file_restriction";
+ public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION = "execute_scripts_without_write_restriction";
+ public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION = "execute_scripts_without_exec_restriction";
+ public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION = "execute_scripts_without_network_restriction";
+ public static final String RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED = "signed_script_are_trusted";
+ public static final String RESOURCES_SCRIPT_USER_KEY_NAME_FOR_SIGNING = "script_user_key_name_for_signing";
+ public static final String[] PERMISSION_NAMES = { //
+ RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING //
+ , RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION //
+ , RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION //
+ , RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION //
+ , RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION //
+ , RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED //
+ };
+ private static ScriptingPermissions formulaPermissions;
+ private static ScriptingPermissions permissiveScriptingPermissions;
+
+ public ScriptingPermissions() {
+ // by default nothing is allowed
+ for (String permissionName : PERMISSION_NAMES) {
+ set(permissionName, false);
+ }
+ }
+
+ public ScriptingPermissions(Properties properties) {
+ for (String permissionName : PERMISSION_NAMES) {
+ final Object value = properties.get(permissionName);
+ if (value != null) {
+ final String valueString = value.toString();
+ if(! "".equals(valueString))
+ set(permissionName, Boolean.parseBoolean(valueString));
+ }
+ }
+ }
+
+ public boolean get(String permissionName) {
+ final Boolean savedValue = permissions.get(permissionName);
+ return savedValue != null && savedValue.booleanValue();
+ }
+
+ private void set(String permissionName, boolean value) {
+ permissions.put(permissionName, value);
+ }
+
+ void restorePermissions() {
+ for (String permissionName : PERMISSION_NAMES) {
+ restore(permissionName);
+ }
+ }
+
+ private void restore(final String permissionName) {
+ final Boolean savedValue = permissions.get(permissionName);
+ if (savedValue != null)
+ ResourceController.getResourceController().setProperty(permissionName, savedValue);
+ else
+ ResourceController.getResourceController().setProperty(permissionName, "");
+ }
+
+ ScriptingSecurityManager getScriptingSecurityManager() {
+ boolean readPerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION);
+ boolean writePerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION);
+ boolean networkPerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION);
+ boolean execPerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION);
+ return new ScriptingSecurityManager(readPerm, writePerm, networkPerm, execPerm);
+ }
+
+ /** this method is called only if the formula plugin is active and so formula evaluation is allowed. */
+ public static ScriptingPermissions getFormulaPermissions() {
+ if (formulaPermissions == null) {
+ formulaPermissions = new ScriptingPermissions();
+ formulaPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING, true);
+ // the classpath is set by the user - this forces us to loose the permissions a bit (if the user permits it)
+ if (ScriptResources.getClasspath() != null) {
+ formulaPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION, ResourceController
+ .getResourceController().getBooleanProperty(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION));
+ }
+ }
+ return formulaPermissions;
+ }
+
+ ScriptingSecurityManager getPermissiveScriptingSecurityManager() {
+ return new ScriptingSecurityManager(true, true, true, true);
+ }
+
+ public static ScriptingPermissions getPermissiveScriptingPermissions() {
+ if (permissiveScriptingPermissions == null) {
+ permissiveScriptingPermissions = new ScriptingPermissions();
+ permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING, true);
+ permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION, true);
+ permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION, true);
+ permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION, true);
+ permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION, true);
+ }
+ return permissiveScriptingPermissions;
+ }
+
+ boolean isExecuteSignedScriptsWithoutRestriction() {
+ return get(RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED);
+ }
+
+ private boolean executeScriptsWithoutAsking() {
+ return get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING);
+ }
+
+ public static List<String> getPermissionNames() {
+ return Arrays.asList(PERMISSION_NAMES);
+ }
+
+ public void assertScriptExecutionAllowed() {
+ if (! executeScriptsWithoutAsking()) {
+ final int showResult = OptionalDontShowMeAgainDialog.show("really_execute_script", "confirmation",
+ ScriptingPermissions.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING,
+ OptionalDontShowMeAgainDialog.BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED);
+ if (showResult != JOptionPane.OK_OPTION) {
+ throw new ExecuteScriptException(new SecurityException(TextUtils.getText("script_execution_disabled")));
+ }
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((permissions == null) ? 0 : permissions.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ScriptingPermissions other = (ScriptingPermissions) obj;
+ if (permissions == null) {
+ if (other.permissions != null)
+ return false;
+ }
+ else if (!permissions.equals(other.permissions))
+ return false;
+ return true;
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingPolicy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingPolicy.java
new file mode 100644
index 0000000..f2cb8ef
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingPolicy.java
@@ -0,0 +1,115 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2016 dimitry
+ *
+ * This file author is dimitry
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.awt.AWTPermission;
+import java.io.File;
+import java.io.FilePermission;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.security.AllPermission;
+import java.security.BasicPermission;
+import java.security.CodeSource;
+import java.security.Permission;
+import java.security.Permissions;
+import java.security.Policy;
+import java.security.ProtectionDomain;
+import java.security.cert.Certificate;
+import java.util.PropertyPermission;
+
+import org.freeplane.core.util.Compat;
+import org.freeplane.main.application.ApplicationResourceController;
+import org.osgi.framework.AdminPermission;
+
+/**
+ * @author Dimitry Polivaev
+ * Apr 9, 2016
+ */
+class ScriptingPolicy extends Policy {
+ private static final AllPermission ALL_PERMISSION = new AllPermission();
+ private static final boolean DISABLE_CHECKS = Boolean
+ .getBoolean("org.freeplane.main.application.FreeplaneSecurityManager.disable");
+ final private Policy defaultPolicy;
+ final private Permissions permissions;
+ final private Permissions permissionBlackList;
+ final private CodeSource userLibCodeSource;
+
+ public ScriptingPolicy(Policy policy) {
+ this.defaultPolicy = policy;
+ permissions = new Permissions();
+ permissionBlackList = new Permissions();
+ permissionBlackList.add(new PropertyPermission(ApplicationResourceController.FREEPLANE_BASEDIRECTORY_PROPERTY, "write"));
+ permissionBlackList.add(new PropertyPermission(Compat.FREEPLANE_USERDIR_PROPERTY, "write"));
+ CodeSource userLibCodeSource;
+ try {
+ final String userLibDirectory = Compat.getApplicationUserDirectory() + "/lib/-";
+ final URL userLibUrl = Compat.fileToUrl(new File (userLibDirectory));
+ userLibCodeSource = new CodeSource(userLibUrl, (Certificate[])null);
+ permissionBlackList.add(new FilePermission(userLibDirectory, "write,delete"));
+ final String applicationDirectory = new File(System.getProperty(ApplicationResourceController.FREEPLANE_BASEDIRECTORY_PROPERTY)).getCanonicalPath();
+ permissionBlackList.add(new FilePermission(applicationDirectory + "/-", "write,delete"));
+ } catch (Exception e) {
+ userLibCodeSource = new CodeSource(null, (Certificate[])null);
+ }
+ this.userLibCodeSource = userLibCodeSource;
+ permissions.add(new RuntimePermission("accessDeclaredMembers"));
+ permissions.add(new RuntimePermission("accessClassInPackage.*"));
+ permissions.add(new RuntimePermission("getProtectionDomain"));
+ permissions.add(new RuntimePermission("modifyThreadGroup"));
+ permissions.add(new RuntimePermission("queuePrintJob"));
+ permissions.add(new RuntimePermission("setIO"));
+ permissions.add(new RuntimePermission("exitVM.0"));
+ permissions.add(new PropertyPermission("*", "read,write"));
+ permissions.add(new AdminPermission("*", "resolve,resource"));
+ permissions.add(new AWTPermission("showWindowWithoutWarningBanner"));
+ permissions.add(new AWTPermission("accessClipboard"));
+ permissions.add(new AWTPermission("accessEventQueue"));
+ permissions.add(new AWTPermission("setWindowAlwaysOnTop"));
+ }
+
+
+ @Override
+ public boolean implies(ProtectionDomain domain, Permission permission) {
+ if (DISABLE_CHECKS || //
+ defaultPolicy.implies(domain, permission) || //
+ userLibCodeSource.implies(domain.getCodeSource())) {
+ return true;
+ }
+ final Permission requiredPermission = permissionBlackList.implies(permission) ? ALL_PERMISSION : permission;
+
+ if (permissions.implies(requiredPermission)) {
+ return true;
+ }
+
+ for (ClassLoader classLoader = domain.getClassLoader(); classLoader != null; //
+ classLoader = classLoader.getParent()) {
+ if (classLoader instanceof ScriptClassLoader) {
+ return ((ScriptClassLoader) classLoader).implies(requiredPermission);
+ }
+ }
+ return false;
+ }
+
+ static public void installRestrictingPolicy() {
+ ScriptClassLoader.class.getClassLoader();
+ Policy.setPolicy(new ScriptingPolicy(Policy.getPolicy()));
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingRegistration.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingRegistration.java
new file mode 100644
index 0000000..9b3ae7a
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingRegistration.java
@@ -0,0 +1,302 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file author is Christian Foltin
+ * It is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.awt.Dimension;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.PrintStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Properties;
+
+import javax.swing.ComboBoxEditor;
+
+import org.apache.commons.lang.StringUtils;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.resources.components.IValidator;
+import org.freeplane.core.ui.menubuilders.generic.EntryVisitor;
+import org.freeplane.core.ui.menubuilders.generic.PhaseProcessor.Phase;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.script.IScriptEditorStarter;
+import org.freeplane.features.script.IScriptStarter;
+import org.freeplane.main.addons.AddOnInstaller;
+import org.freeplane.main.addons.AddOnsController;
+import org.freeplane.main.application.ApplicationLifecycleListener;
+import org.freeplane.n3.nanoxml.IXMLParser;
+import org.freeplane.n3.nanoxml.IXMLReader;
+import org.freeplane.n3.nanoxml.StdXMLReader;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.n3.nanoxml.XMLParserFactory;
+import org.freeplane.plugin.script.ScriptEditorPanel.IScriptModel;
+import org.freeplane.plugin.script.ScriptEditorPanel.ScriptHolder;
+import org.freeplane.plugin.script.addons.ManageAddOnsAction;
+import org.freeplane.plugin.script.addons.ManageAddOnsDialog;
+import org.freeplane.plugin.script.addons.ScriptAddOnProperties;
+import org.freeplane.plugin.script.filter.ScriptConditionController;
+
+class ScriptingRegistration {
+ final private class ScriptModel implements IScriptModel {
+ final private String mOriginalScript;
+ private String mScript;
+
+ public ScriptModel(final String pScript) {
+ mScript = pScript;
+ mOriginalScript = pScript;
+ }
+
+ @Override
+ public int addNewScript() {
+ return 0;
+ }
+
+ @Override
+ public ScriptEditorWindowConfigurationStorage decorateDialog(final ScriptEditorPanel pPanel,
+ final String pWindow_preference_storage_property) {
+ final String marshalled = ResourceController.getResourceController().getProperty(
+ pWindow_preference_storage_property);
+ return ScriptEditorWindowConfigurationStorage.decorateDialog(marshalled, pPanel);
+ }
+
+ @Override
+ public void endDialog(final boolean pIsCanceled) {
+ if (pIsCanceled) {
+ mScript = mOriginalScript;
+ }
+ }
+
+ @Override
+ public Object executeScript(final int pIndex, final PrintStream pOutStream, final IFreeplaneScriptErrorHandler pErrorHandler) {
+ final ModeController modeController = Controller.getCurrentModeController();
+ // the script is completely in the hand of the user -> no security issues.
+ final ScriptingPermissions restrictedPermissions = ScriptingPermissions.getPermissiveScriptingPermissions();
+ return ScriptingEngine.executeScript(modeController.getMapController().getSelectedNode(), mScript,
+ pErrorHandler, pOutStream, null, restrictedPermissions);
+ }
+
+ @Override
+ public int getAmountOfScripts() {
+ return 1;
+ }
+
+ public String getScript() {
+ return mScript;
+ }
+
+ @Override
+ public ScriptHolder getScript(final int pIndex) {
+ return new ScriptHolder("Script", mScript);
+ }
+
+ @Override
+ public boolean isDirty() {
+ return !StringUtils.equals(mScript, mOriginalScript);
+ }
+
+ @Override
+ public void setScript(final int pIndex, final ScriptHolder pScript) {
+ mScript = pScript.getScript();
+ }
+
+ @Override
+ public void storeDialogPositions(final ScriptEditorPanel pPanel,
+ final ScriptEditorWindowConfigurationStorage pStorage,
+ final String pWindow_preference_storage_property) {
+ pStorage.storeDialogPositions(pPanel, pWindow_preference_storage_property);
+ }
+ }
+
+ final private HashMap<String, Object> mScriptCookies = new HashMap<String, Object>();
+
+ public ScriptingRegistration(ModeController modeController) {
+ register(modeController);
+ }
+
+ public HashMap<String, Object> getScriptCookies() {
+ return mScriptCookies;
+ }
+
+ private void register(ModeController modeController) {
+ modeController.addExtension(IScriptEditorStarter.class, new IScriptEditorStarter() {
+ @Override
+ public String startEditor(final String pScriptInput) {
+ final ScriptModel scriptModel = new ScriptModel(pScriptInput);
+ final ScriptEditorPanel scriptEditorPanel = new ScriptEditorPanel(scriptModel, false);
+ scriptEditorPanel.setVisible(true);
+ return scriptModel.getScript();
+ }
+
+ @Override
+ public ComboBoxEditor createComboBoxEditor(Dimension minimumSize) {
+ final ScriptComboBoxEditor scriptComboBoxEditor = new ScriptComboBoxEditor();
+ if(minimumSize != null)
+ scriptComboBoxEditor.setMinimumSize(minimumSize);
+ return scriptComboBoxEditor;
+ }
+ });
+ modeController.addExtension(IScriptStarter.class, new IScriptStarter() {
+ @Override
+ public void executeScript(NodeModel node, String script) {
+ ScriptingEngine.executeScript(node, script);
+ }
+ });
+ registerScriptAddOns();
+ if(! modeController.getController().getViewController().isHeadless()){
+ registerGuiStuff(modeController);
+ ScriptCompiler.compileScriptsOnPath(ScriptResources.getClasspath());
+ createUserScriptsDirectory();
+ createInitScriptsDirectory();
+ createUserLibDirectory();
+ }
+ FilterController.getCurrentFilterController().getConditionFactory().addConditionController(100,
+ new ScriptConditionController());
+ ScriptingPolicy.installRestrictingPolicy();
+ System.setSecurityManager(new InternationalizedSecurityManager());
+ }
+
+ private void registerGuiStuff(ModeController modeController) {
+ addPropertiesToOptionPanel();
+ modeController.addAction(new ScriptEditor());
+ modeController.addAction(new ExecuteScriptForAllNodes());
+ modeController.addAction(new ExecuteScriptForSelectionAction());
+ final ManageAddOnsAction manageAddOnsAction = new ManageAddOnsAction();
+ modeController.addAction(manageAddOnsAction);
+ modeController.addExtension(AddOnInstaller.class, new AddOnInstaller() {
+ @Override
+ public void install(final URL url) {
+ final ManageAddOnsDialog dialog = manageAddOnsAction.getDialog();
+ dialog.install(url);
+ }
+ });
+ ScriptingConfiguration configuration = new ScriptingConfiguration();
+ updateMenus(modeController, configuration);
+ registerInitScripts(configuration);
+ }
+
+ private void addPropertiesToOptionPanel() {
+ final URL preferences = this.getClass().getResource("preferences.xml");
+ if (preferences == null)
+ throw new RuntimeException("cannot open preferences");
+ Controller.getCurrentController().addOptionValidator(new IValidator() {
+ @Override
+ public ValidationResult validate(Properties properties) {
+ final ValidationResult result = new ValidationResult();
+ final String readAccessString = properties
+ .getProperty(ScriptingPermissions.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION);
+ final String writeAccessString = properties
+ .getProperty(ScriptingPermissions.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION);
+ final String classpath = properties.getProperty(ScriptResources.RESOURCES_SCRIPT_CLASSPATH);
+ final boolean readAccess = readAccessString != null && Boolean.parseBoolean(readAccessString);
+ final boolean writeAccess = writeAccessString != null && Boolean.parseBoolean(writeAccessString);
+ final boolean classpathIsSet = classpath != null && classpath.length() > 0;
+ if (classpathIsSet && !readAccess) {
+ result.addError(TextUtils.getText("OptionPanel.validate_classpath_needs_readaccess"));
+ }
+ if (writeAccess && !readAccess) {
+ result.addWarning(TextUtils.getText("OptionPanel.validate_write_without_read"));
+ }
+ return result;
+ }
+ });
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ modeController.getOptionPanelBuilder().load(preferences);
+ }
+
+ private void updateMenus(ModeController modeController, final ScriptingConfiguration configuration) {
+ ScriptingMenuEntryVisitor builder = new ScriptingMenuEntryVisitor(configuration, modeController);
+ modeController.addUiBuilder(Phase.ACTIONS, "userScripts", builder, EntryVisitor.ILLEGAL);
+ modeController.getUserInputListenerFactory().addBuildPhaseListener(builder);
+ }
+
+ private void registerScriptAddOns() {
+ File[] addonXmlFiles = AddOnsController.getController().getAddOnsDir().listFiles(new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return name.endsWith(".script.xml");
+ }
+ });
+ final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
+ for (File file : addonXmlFiles) {
+ BufferedInputStream inputStream = null;
+ try {
+ inputStream = new BufferedInputStream(new FileInputStream(file));
+ final IXMLReader reader = new StdXMLReader(inputStream);
+ parser.setReader(reader);
+ final ScriptAddOnProperties addOn = new ScriptAddOnProperties((XMLElement) parser.parse());
+ addOn.setAddOnPropertiesFile(file);
+ AddOnsController.getController().registerInstalledAddOn(addOn);
+ }
+ catch (final Exception e) {
+ LogUtils.warn("error parsing " + file, e);
+ }
+ finally {
+ FileUtils.silentlyClose(inputStream);
+ }
+ }
+ }
+
+ private void registerInitScripts(ScriptingConfiguration configuration) {
+ final List<IScript> initScripts = configuration.getInitScripts();
+ if (!initScripts.isEmpty())
+ Controller.getCurrentController().addApplicationLifecycleListener(new ApplicationLifecycleListener() {
+ @Override
+ public void onStartupFinished() {
+ for (IScript script : initScripts) {
+ LogUtils.info("running init script " + script.getScript());
+ script.execute(null);
+ }
+ }
+ });
+ }
+
+ private void createUserScriptsDirectory() {
+ createDirIfNotExists(ScriptResources.getUserScriptsDir(), "user scripts");
+ }
+
+ private void createInitScriptsDirectory() {
+ createDirIfNotExists(ScriptResources.getInitScriptsDir(), "init scripts");
+ }
+
+ private void createDirIfNotExists(final File scriptDir, String what) {
+ if (!scriptDir.exists()) {
+ LogUtils.info("creating " + what + " directory " + scriptDir);
+ scriptDir.mkdirs();
+ }
+ }
+
+ private void createUserLibDirectory() {
+ final File libDir = ScriptResources.getUserLibDir();
+ if (!libDir.exists()) {
+ LogUtils.info("creating user lib directory " + libDir);
+ libDir.mkdirs();
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingSecurityManager.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingSecurityManager.java
new file mode 100644
index 0000000..d6dd5dd
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/ScriptingSecurityManager.java
@@ -0,0 +1,80 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file author is Christian Foltin
+ * It is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.FilePermission;
+import java.net.SocketPermission;
+import java.security.AllPermission;
+import java.security.Permission;
+import java.security.Permissions;
+
+class ScriptingSecurityManager {
+
+ final private Permissions permissions;
+
+ public ScriptingSecurityManager(boolean pWithoutFileRestriction,
+ boolean pWithoutWriteRestriction,
+ boolean pWithoutNetworkRestriction, boolean pWithoutExecRestriction) {
+ permissions = new Permissions();
+ if (pWithoutExecRestriction && pWithoutFileRestriction && pWithoutWriteRestriction
+ && pWithoutNetworkRestriction) {
+ permissions.add(new AllPermission());
+ }
+ else {
+ if (pWithoutNetworkRestriction) {
+ permissions.add(new SocketPermission("*", "connect,accept,listen,resolve"));
+ permissions.add(new RuntimePermission("setFactory"));
+ }
+
+ if (pWithoutExecRestriction) {
+ permissions.add(new FilePermission("<<ALL FILES>>", "execute"));
+ permissions.add(new RuntimePermission("loadLibrary.*"));
+ }
+ if (pWithoutFileRestriction) {
+ permissions.add(new FilePermission("<<ALL FILES>>", "read"));
+ permissions.add(new RuntimePermission("readFileDescriptor"));
+ }
+
+ if (pWithoutWriteRestriction) {
+ permissions.add(new RuntimePermission("writeFileDescriptor"));
+ permissions.add(new FilePermission("<<ALL FILES>>", "write,delete"));
+ permissions.add(new RuntimePermission("preferences"));
+ }
+ }
+ permissions.setReadOnly();
+ }
+
+ private static final Permission URL_PERMISSION = new SocketPermission("*", "connect");
+
+ public boolean implies(Permission permission) {
+ if (permission.getClass().getSimpleName().equals("URLPermission")) {
+ return isAllowed(URL_PERMISSION);
+ }
+ else {
+ return isAllowed(permission);
+ }
+ }
+
+ private boolean isAllowed(Permission permission) {
+ final boolean isAllowed = permissions.implies(permission);
+ return isAllowed;
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/SignedScriptHandler.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/SignedScriptHandler.java
new file mode 100644
index 0000000..6aaebb4
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/SignedScriptHandler.java
@@ -0,0 +1,192 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
+ *
+ * This file author is Christian Foltin
+ * It is modified by Dimitry Polivaev in 2008.
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.PrivateKey;
+import java.security.Signature;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.components.EnterPasswordDialog;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.encrypt.DesEncrypter;
+
+
+class SignedScriptHandler {
+ static class ScriptContents {
+ final private static Pattern SIGNATURE_WITH_KEY = Pattern.compile(SignedScriptHandler.SIGN_PREFIX_REGEXP);
+ String mKeyName;
+ String mScript;
+ String mSignature;
+
+ public ScriptContents(final String pScript) {
+ final int indexOfSignaturePrefix = pScript.lastIndexOf(SignedScriptHandler.SIGN_PREFIX);
+ final int indexOfSignature = indexOfSignaturePrefix + SignedScriptHandler.SIGN_PREFIX.length();
+ if (indexOfSignaturePrefix > 0 && pScript.length() > indexOfSignature) {
+ mSignature = pScript.substring(indexOfSignature);
+ mScript = pScript.substring(0, indexOfSignaturePrefix);
+ mKeyName = null;
+ }
+ else {
+ final Matcher matcher = ScriptContents.SIGNATURE_WITH_KEY.matcher(pScript);
+ if (matcher.find()) {
+ mScript = pScript.substring(0, matcher.start());
+ mKeyName = matcher.group(1);
+ mSignature = matcher.group(2);
+ }
+ else {
+ mSignature = null;
+ mScript = pScript;
+ mKeyName = null;
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ String prefix;
+ if (mKeyName != null) {
+ prefix = "//SIGN(" + mKeyName + "):";
+ }
+ else {
+ prefix = SignedScriptHandler.SIGN_PREFIX;
+ }
+ return mScript + prefix + mSignature + "\n";
+ }
+ }
+
+ public static final String FREEPLANE_SCRIPT_KEY_NAME = "FreeplaneScriptKey";
+ private static KeyStore mKeyStore = null;
+ private static final String SIGN_PREFIX = "//SIGN:";
+ /** This is for / /SIGN(keyname):signature */
+ private static final String SIGN_PREFIX_REGEXP = "//SIGN\\((.+?)\\):(.*)";
+
+ public SignedScriptHandler() {
+ }
+
+ private void initializeKeystore(final char[] pPassword) {
+ if (SignedScriptHandler.mKeyStore != null) {
+ return;
+ }
+ java.io.FileInputStream fis = null;
+ try {
+ SignedScriptHandler.mKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
+ fis = new java.io.FileInputStream(System.getProperty("user.home") + File.separator + ".keystore");
+ SignedScriptHandler.mKeyStore.load(fis, pPassword);
+ }
+ catch (final FileNotFoundException e) {
+ LogUtils.warn(e);
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ finally {
+ if (fis != null) {
+ try {
+ fis.close();
+ }
+ catch (final IOException e) {
+ LogUtils.severe(e);
+ }
+ }
+ }
+ }
+
+ public boolean isScriptSigned(final String pScript, final OutputStream pOutStream) {
+ final ScriptContents content = new ScriptContents(pScript);
+ if (content.mSignature != null) {
+ try {
+ final Signature instanceVerify = Signature.getInstance("SHA1withDSA");
+ if (content.mKeyName == null) {
+ return false;
+ }
+ else {
+ initializeKeystore(null);
+ instanceVerify.initVerify(SignedScriptHandler.mKeyStore.getCertificate(content.mKeyName));
+ instanceVerify.update(content.mScript.getBytes());
+ final boolean verify = instanceVerify.verify(DesEncrypter.fromBase64(content.mSignature));
+ return verify;
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ try {
+ pOutStream.write(e.toString().getBytes());
+ pOutStream.write("\n".getBytes());
+ }
+ catch (final Exception e1) {
+ LogUtils.severe(e1);
+ }
+ }
+ }
+ return false;
+ }
+
+ public String signScript(final String pScript) {
+ final ScriptContents content = new ScriptContents(pScript);
+ final EnterPasswordDialog pwdDialog = new EnterPasswordDialog(UITools.getCurrentFrame(), false);
+ pwdDialog.setModal(true);
+ pwdDialog.setVisible(true);
+ if (pwdDialog.getResult() == EnterPasswordDialog.CANCEL) {
+ return content.mScript;
+ }
+ final char[] password = pwdDialog.getPassword().toString().toCharArray();
+ initializeKeystore(password);
+ try {
+ final Signature instance = Signature.getInstance("SHA1withDSA");
+ String keyName = FREEPLANE_SCRIPT_KEY_NAME;
+ final ResourceController resourceController = ResourceController.getResourceController();
+ String propertyKeyName = resourceController.getProperty(
+ ScriptingPermissions.RESOURCES_SCRIPT_USER_KEY_NAME_FOR_SIGNING);
+ if (propertyKeyName == null || propertyKeyName.trim().length() == 0){
+ resourceController.setProperty(ScriptingPermissions.RESOURCES_SCRIPT_USER_KEY_NAME_FOR_SIGNING,
+ FREEPLANE_SCRIPT_KEY_NAME);
+ propertyKeyName = keyName;
+ }
+ if (content.mKeyName != null) {
+ keyName = content.mKeyName;
+ }
+ else {
+ content.mKeyName = propertyKeyName;
+ keyName = content.mKeyName;
+ }
+ instance.initSign((PrivateKey) SignedScriptHandler.mKeyStore.getKey(keyName, password));
+ instance.update(content.mScript.getBytes());
+ final byte[] signature = instance.sign();
+ content.mSignature = DesEncrypter.toBase64(signature);
+ return content.toString();
+ }
+ catch (final Exception e) {
+ if(! (e instanceof KeyStoreException))
+ LogUtils.severe(e);
+ UITools.errorMessage(e.getLocalizedMessage());
+ }
+ return content.mScript;
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/UniqueStack.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/UniqueStack.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/UniqueStack.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/UniqueStack.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/AddOnDetailsPanel.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/AddOnDetailsPanel.java
new file mode 100644
index 0000000..1d5b7ba
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/AddOnDetailsPanel.java
@@ -0,0 +1,239 @@
+package org.freeplane.plugin.script.addons;
+
+import java.awt.Dimension;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+import javax.swing.Box;
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.KeyStroke;
+
+import org.freeplane.core.ui.ActionAcceleratorManager;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.ui.menubuilders.FreeplaneResourceAccessor;
+import org.freeplane.core.ui.menubuilders.generic.Entry;
+import org.freeplane.core.ui.menubuilders.generic.EntryAccessor;
+import org.freeplane.core.ui.menubuilders.generic.EntryNavigator;
+import org.freeplane.core.ui.menubuilders.generic.EntryNavigatorFactory;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.icon.IconNotFound;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.main.addons.AddOnProperties;
+import org.freeplane.plugin.script.ExecuteScriptAction;
+import org.freeplane.plugin.script.ScriptingMenuUtils;
+import org.freeplane.plugin.script.addons.ScriptAddOnProperties.Script;
+
+import com.jgoodies.forms.layout.ColumnSpec;
+import com.jgoodies.forms.layout.FormLayout;
+import com.jgoodies.forms.layout.FormSpecs;
+import com.jgoodies.forms.layout.RowSpec;
+
+ at SuppressWarnings("serial")
+public class AddOnDetailsPanel extends JPanel {
+ private int maxWidth = 500;
+ private String warning;
+ private static EntryNavigator entryNavigator = createEntryNavigator();
+
+ public AddOnDetailsPanel(final AddOnProperties addOn, final String warning) {
+ this.warning = warning;
+ setLayout(new FormLayout(new ColumnSpec[] {
+ FormSpecs.DEFAULT_COLSPEC,
+ FormSpecs.RELATED_GAP_COLSPEC,
+ ColumnSpec.decode("default:grow"),},
+ new RowSpec[] {
+ FormSpecs.RELATED_GAP_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,
+ FormSpecs.RELATED_GAP_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,
+ FormSpecs.RELATED_GAP_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,
+ FormSpecs.RELATED_GAP_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,
+ RowSpec.decode("top:default:grow"),}));
+ if (warning != null) {
+ JLabel warningLabel = createWarningLabel(addOn);
+ add(warningLabel, "3, 2");
+ }
+ JLabel imageLabel = createImageLabel(addOn);
+ add(imageLabel, "1, 4");
+ JLabel title = createTitleLabel(addOn);
+ add(title, "3, 4");
+ JLabel author = createAuthorLabel(addOn);
+ add(author, "3, 6");
+ final Box box = Box.createHorizontalBox();
+ box.add(new JLabel(getText("homepage")));
+ box.add(createAddOnHomepageButton(addOn));
+ add(box, "3, 8, left, default");
+ JComponent details = createDetails(addOn);
+ add(details, "3, 9");
+ }
+
+ private static EntryNavigator createEntryNavigator() {
+ EntryNavigator entryNavigator = new EntryNavigatorFactory().createNavigator();
+ return entryNavigator;
+ }
+
+ private JLabel createImageLabel(AddOnProperties addOn) {
+ final JLabel label = new JLabel("");
+ label.setIcon(IconNotFound.createIconOrReturnNotFoundIcon(addOn.getName() + ".png"));
+ return label;
+ }
+
+ /**
+ * @wbp.parser.constructor
+ */
+ public AddOnDetailsPanel(AddOnProperties addOn) {
+ this(addOn, null);
+ }
+
+ private JLabel createWarningLabel(final AddOnProperties addOn) {
+ return new JLabel("<html><body>" + warning.replaceAll("</?(html|body)>", "") + "</body></html>");
+ }
+
+ private JLabel createTitleLabel(final AddOnProperties addOn) {
+ return new JLabel("<html><body><b><font size='+2'>" + toHtml(addOn.getTranslatedName()) + " "
+ + addOn.getVersion().replaceAll("^v", "") + "</font></b></body></html>");
+ }
+
+ private JLabel createAuthorLabel(final AddOnProperties addOn) {
+ final String text = addOn.getAuthor() == null ? "" : "<html><body><strong><font size='-1'>"
+ + getText("authored.by", toHtml(addOn.getAuthor())) + "</font></strong></body></html>";
+ return new JLabel(text);
+ }
+
+ private JComponent createAddOnHomepageButton(final AddOnProperties addOn) {
+ // parse the URI on creation of the dialog to test the URI syntax early
+ try {
+ return UITools.createHtmlLinkStyleButton(addOn.getHomepage().toURI(), addOn.getHomepage().toString());
+ }
+ catch (Exception e) {
+ LogUtils.warn("add-on " + addOn + " has no valid homepage: " + e);
+ return new JLabel("-");
+ }
+ }
+
+ private JComponent createDetails(final AddOnProperties addOn) {
+ final StringBuilder text = new StringBuilder(1024);
+ text.append("<html><body>");
+ text.append(toHtml(addOn.getDescription()));
+ text.append("<p>");
+ if (addOn instanceof ScriptAddOnProperties) {
+ List<Script> scripts = ((ScriptAddOnProperties) addOn).getScripts();
+ if (!scripts.isEmpty()) {
+ text.append("<table border='1'>");
+ text.append(row("th", getText("header.function"), getText("header.menu"), getText("header.shortcut")));
+ for (ScriptAddOnProperties.Script script : scripts) {
+ text.append(row("td", bold(TextUtils.getText(script.menuTitleKey)), HtmlUtils.toXMLEscapedText(formatMenuLocation(script)),
+ formatShortcut(script)));
+ }
+ text.append("</table>");
+ }
+ }
+ text.append("</body></html>");
+ final JLabel label = new JLabel(text.toString());
+ label.setAutoscrolls(true);
+ final ImageIcon icon = IconNotFound.createIconOrReturnNull(addOn.getName() + "-screenshot-1.png");
+ if (icon != null)
+ label.setIcon(icon);
+ return label;
+ }
+
+ private String toHtml(String htmlOrPlainText) {
+ if (HtmlUtils.isHtmlNode(htmlOrPlainText))
+ return htmlOrPlainText.replaceAll("</?(html|body)>", "");
+ else
+ return HtmlUtils.toHTMLEscapedText(htmlOrPlainText);
+ }
+
+ private String formatShortcut(final Script script) {
+ final String menuItemKey = ExecuteScriptAction.makeMenuItemKey(script.menuTitleKey, script.executionMode);
+ final ActionAcceleratorManager acceleratorManager = Controller.getCurrentModeController().getUserInputListenerFactory().getAcceleratorManager();
+ final KeyStroke userDefinedKeystroke = acceleratorManager.getAccelerator(menuItemKey);
+ final KeyStroke keyStroke = userDefinedKeystroke != null ? userDefinedKeystroke : UITools.getKeyStroke(script.keyboardShortcut);
+ return UITools.keyStrokeToString(keyStroke);
+ }
+
+ private String formatMenuLocation(ScriptAddOnProperties.Script script) {
+ final MModeController modeController = (MModeController) Controller.getCurrentModeController();
+ Entry top = modeController.getUserInputListenerFactory().getGenericMenuStructure();
+ final String canonicalPath = entryNavigator.replaceAliases(script.menuLocation);
+ final String[] pathElements = canonicalPath.split("/");
+ Entry entry = top;
+ final ListIterator<String> pathIterator = Arrays.asList(pathElements).listIterator();
+ while (pathIterator.hasNext()) {
+ String name = pathIterator.next();
+ if (!name.isEmpty()) {
+ final Entry child = entry.getChild(name);
+ if (child == null){
+ pathIterator.previous();
+ break;
+ }
+ entry = child;
+ }
+ }
+ if(entry == null)
+ return script.menuLocation;
+ final FreeplaneResourceAccessor resourceAccessor = new FreeplaneResourceAccessor();
+ final EntryAccessor entryAccessor = new EntryAccessor(resourceAccessor);
+ final String entryLocationDescription = entryAccessor.getLocationDescription(entry);
+ if(!pathIterator.hasNext())
+ return entryLocationDescription;
+ StringBuilder menuLocationDescription = new StringBuilder(entryLocationDescription);
+ while(pathIterator.hasNext()){
+ menuLocationDescription.append(EntryAccessor.MENU_ELEMENT_SEPARATOR);
+ menuLocationDescription.append(ScriptingMenuUtils.scriptNameToMenuItemTitle(pathIterator.next()));
+ }
+ return menuLocationDescription.toString();
+ }
+
+ private String bold(final String text) {
+ return "<b>" + text + "</b>";
+ }
+
+ private String row(final String td, final Object... columns) {
+ final String separator = "</" + td + "><" + td + ">";
+ return "<tr><" + td + ">" + org.apache.commons.lang.StringUtils.join(columns, separator) + "</" + td + "></tr>";
+ }
+
+ private static String getText(String key, Object... parameters) {
+ if (parameters.length == 0)
+ return TextUtils.getRawText(getResourceKey(key));
+ else
+ return TextUtils.format(getResourceKey(key), parameters);
+ }
+
+ private static String getResourceKey(final String key) {
+ return "AddOnDetailsPanel." + key;
+ }
+
+ public String getWarning() {
+ return warning;
+ }
+
+ public void setWarning(String warning) {
+ this.warning = warning;
+ }
+
+ public int getMaxWidth() {
+ return maxWidth;
+ }
+
+ public void setMaxWidth(int maxWidth) {
+ this.maxWidth = maxWidth;
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ final Dimension preferredSize = super.getPreferredSize();
+ preferredSize.width = Math.min(preferredSize.width, maxWidth);
+ return preferredSize;
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/AddOnInstallerPanel.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/AddOnInstallerPanel.java
new file mode 100644
index 0000000..1adf584
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/AddOnInstallerPanel.java
@@ -0,0 +1,273 @@
+package org.freeplane.plugin.script.addons;
+
+import java.awt.Component;
+import java.awt.Insets;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+
+import javax.swing.Box;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.JTable;
+import javax.swing.JTextField;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.FileUtils;
+import org.freeplane.core.util.FreeplaneIconUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.mindmapmode.MMapModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.ModeController;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.url.mindmapmode.MFileManager;
+import org.freeplane.main.addons.AddOnProperties;
+import org.freeplane.main.addons.AddOnsController;
+import org.freeplane.plugin.script.ScriptingEngine;
+import org.freeplane.plugin.script.ScriptingPermissions;
+
+import com.jgoodies.forms.factories.DefaultComponentFactory;
+import com.jgoodies.forms.layout.FormSpecs;
+import com.jgoodies.forms.layout.ColumnSpec;
+import com.jgoodies.forms.layout.FormLayout;
+import com.jgoodies.forms.layout.RowSpec;
+
+ at SuppressWarnings("serial")
+public class AddOnInstallerPanel extends JPanel {
+
+ private ManageAddOnsPanel manageAddOnsPanel;
+ private ManageAddOnsPanel manageThemesPanel;
+ private JButton installButton;
+ private JTextField urlField;
+
+ public AddOnInstallerPanel(final ManageAddOnsPanel manageAddOnsPanel, ManageAddOnsPanel manageThemesPanel) {
+ this.manageAddOnsPanel = manageAddOnsPanel;
+ this.manageThemesPanel = manageThemesPanel;
+ setLayout(new FormLayout(new ColumnSpec[] {
+ ColumnSpec.decode("default:grow"),},
+ new RowSpec[] {
+ FormSpecs.RELATED_GAP_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,
+ FormSpecs.RELATED_GAP_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,
+ FormSpecs.RELATED_GAP_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,
+ FormSpecs.RELATED_GAP_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,
+ FormSpecs.RELATED_GAP_ROWSPEC,
+ FormSpecs.DEFAULT_ROWSPEC,}));
+ //
+ // Search
+ //
+ add(DefaultComponentFactory.getInstance().createSeparator(getTitleText("search")), "1, 2");
+ add(createVisitAddOnPageButton(), "1, 4, left, default");
+ add(Box.createVerticalStrut(20), "1, 6");
+ //
+ // Install from known location
+ //
+ add(DefaultComponentFactory.getInstance().createSeparator(getTitleText("install.from.known.location")), "1, 7");
+ installButton = createInstallButton();
+ urlField = createUrlField(installButton);
+ final JButton selectFile = createFileChooser(urlField);
+ installButton.addActionListener(createInstallActionListener());
+ final Box box = Box.createHorizontalBox();
+ box.add(urlField);
+ box.add(selectFile);
+ add(box, "1, 9");
+ add(installButton, "1, 11, right, default");
+// setBackground(Color.WHITE);
+ }
+
+ private static String getText(String key, Object... parameters) {
+ return ManageAddOnsDialog.getText(key, parameters);
+ }
+
+ private static String getTitleText(final String key) {
+ final String titleStyle = "<html><b><font size='+1'>";
+ return titleStyle + getText(key);
+ }
+
+ private JButton createVisitAddOnPageButton() {
+ try {
+ final String addOnsUriString = TextUtils.removeTranslateComment(TextUtils.getText("addons.site"));
+ // parse the URI on creation of the dialog to test the URI syntax early
+ final URI addOnsUri = new URI(addOnsUriString);
+ return UITools.createHtmlLinkStyleButton(addOnsUri, getText("visit.addon.page"));
+ }
+ catch (URISyntaxException ex) {
+ // bad translation?
+ throw new RuntimeException(ex);
+ }
+ }
+
+ private JButton createInstallButton() {
+ final JButton installButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(installButton, getText("install"));
+ installButton.setEnabled(false);
+ // FIXME: get rid of that
+ installButton.setMargin(new Insets(0, 25, 0, 25));
+ return installButton;
+ }
+
+ private ActionListener createInstallActionListener() {
+ return new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ final Controller controller = Controller.getCurrentController();
+ try {
+ LogUtils.info("installing add-on from " + urlField.getText());
+ controller.getViewController().setWaitingCursor(true);
+ final URL url = toURL(urlField.getText());
+ setStatusInfo(getText("status.installing"));
+ final ModeController modeController = controller.getModeController(MModeController.MODENAME);
+ final MFileManager fileManager = (MFileManager) MFileManager.getController(modeController);
+ MapModel newMap = new MMapModel();
+ if (!fileManager.loadCatchExceptions(url, newMap)) {
+ LogUtils.warn("can not load " + url);
+ return;
+ }
+ controller.getModeController().getMapController().fireMapCreated(newMap);
+ AddOnProperties addOn = (AddOnProperties) ScriptingEngine.executeScript(newMap.getRootNode(),
+ getInstallScriptSource(), ScriptingPermissions.getPermissiveScriptingPermissions());
+ if (addOn != null) {
+ setStatusInfo(getText("status.success", addOn.getName()));
+ AddOnsController.getController().registerInstalledAddOn(addOn);
+ final ManageAddOnsPanel managementPanel = addOn.isTheme() ? manageThemesPanel
+ : manageAddOnsPanel;
+ managementPanel.getTableModel().addAddOn(addOn);
+ urlField.setText("");
+ ((JTabbedPane)getParent()).setSelectedComponent(managementPanel);
+ selectLastAddOn(managementPanel);
+ }
+ }
+ catch (Exception ex) {
+ UITools.errorMessage(getText("error", ex.toString()));
+ }
+ finally {
+ controller.getViewController().setWaitingCursor(false);
+ }
+ }
+
+ private String getInstallScriptSource() throws IOException {
+ final ResourceController resourceController = ResourceController.getResourceController();
+ final File scriptDir = new File(resourceController.getInstallationBaseDir(), "scripts");
+ final File installScript = new File(scriptDir, "installScriptAddOn.groovy");
+ if (!installScript.exists())
+ throw new RuntimeException("internal error: installer not found at " + installScript);
+ return FileUtils.slurpFile(installScript);
+ }
+
+ private URL toURL(String urlText) throws MalformedURLException {
+ try {
+ return new URL(urlText);
+ }
+ catch (Exception e2) {
+ return new File(urlText).toURI().toURL();
+ }
+ }
+ };
+ }
+
+ private void selectLastAddOn(JComponent managementPanel) {
+ try {
+ JTable table = findJTable(managementPanel);
+ final int row = table.getModel().getRowCount() - 1;
+ table.getSelectionModel().setSelectionInterval(row, row);
+ }
+ catch (Exception e) {
+ LogUtils.warn("cannot select just installed add-on", e);
+ }
+ }
+
+ private JTable findJTable(JComponent child) {
+ for (Component component : child.getComponents()) {
+ if (component instanceof JTable) {
+ return (JTable) component;
+ }
+ else if (component instanceof JComponent) {
+ final JTable findResult = findJTable((JComponent) component);
+ if (findResult != null)
+ return findResult;
+ }
+ }
+ return null;
+ }
+
+ private JButton createFileChooser(final JTextField urlField) {
+ final JButton selectFile = new JButton(getText("search.file"),
+ FreeplaneIconUtils.createImageIconByResourceKey("OpenAction.icon"));
+ final JFileChooser fileChooser = new JFileChooser();
+ selectFile.setToolTipText(getText("select.tooltip"));
+ selectFile.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
+ selectFile.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ fileChooser.showOpenDialog(urlField);
+ final File selectedFile = fileChooser.getSelectedFile();
+ if (selectedFile != null)
+ urlField.setText(selectedFile.getAbsolutePath());
+ }
+ });
+ return selectFile;
+ }
+
+ private JTextField createUrlField(final JButton install) {
+ final JTextField urlField = new JTextField();
+// urlField.setColumns(100);
+ urlField.setToolTipText(getText("install.tooltip"));
+ urlField.getDocument().addDocumentListener(new DocumentListener() {
+ public void insertUpdate(DocumentEvent e) {
+ updateImpl(e);
+ }
+
+ public void removeUpdate(DocumentEvent e) {
+ updateImpl(e);
+ }
+
+ public void changedUpdate(DocumentEvent e) {
+ updateImpl(e);
+ }
+
+ private void updateImpl(DocumentEvent e) {
+ install.setEnabled(e.getDocument().getLength() > 0);
+ }
+ });
+ urlField.addKeyListener(new KeyAdapter() {
+ public void keyPressed(KeyEvent e) {
+ int key = e.getKeyCode();
+ if (key == KeyEvent.VK_ENTER) {
+ install.requestFocusInWindow();
+ install.doClick();
+ }
+ }
+ });
+ return urlField;
+ }
+
+ JButton getInstallButton() {
+ return installButton;
+ }
+
+ JTextField getUrlField() {
+ return urlField;
+ }
+
+ private static void setStatusInfo(final String message) {
+ Controller.getCurrentController().getViewController().out(message);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddonRenderer.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/AddonRenderer.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddonRenderer.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/AddonRenderer.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ButtonsInCellRenderer.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ButtonsInCellRenderer.java
new file mode 100644
index 0000000..3651405
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ButtonsInCellRenderer.java
@@ -0,0 +1,160 @@
+package org.freeplane.plugin.script.addons;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import javax.swing.AbstractCellEditor;
+import javax.swing.Action;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JTable;
+import javax.swing.UIManager;
+import javax.swing.border.Border;
+import javax.swing.border.LineBorder;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumnModel;
+
+import org.freeplane.main.addons.AddOnProperties;
+
+/**
+ * Editor and Renderer for multiple buttons inside a table cell.
+ * @author Mag. Stefan Hagmann
+ * @see http://www.bgbaden-frauen.ac.at/frauengasse20/uploads/files/Informatik/java/ButtonsInColumn.java
+ */
+ at SuppressWarnings("serial")
+class ButtonsInCellRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener,
+ MouseListener {
+ static final int BUTTON_SPACER = 4;
+ private final JTable table;
+ private final Border border;
+ private Border fborder;
+ private Object editorValue;
+ private boolean isButtonColumnEditor;
+ private JPanel panel;
+ private final Action[] actions;
+ private final JButton[] buttons;
+
+ public ButtonsInCellRenderer(JTable table, JButton[] buttons, Action[] actions, int column) {
+ this.table = table;
+ this.actions = actions;
+ this.buttons = buttons;
+ for (JButton btn : buttons) {
+ btn.setFocusPainted(false);
+ btn.addActionListener(this);
+ }
+ border = buttons[0].getBorder();
+ setFocusBorder(new LineBorder(Color.BLUE));
+ TableColumnModel columnModel = table.getColumnModel();
+ columnModel.getColumn(column).setCellRenderer(this);
+ columnModel.getColumn(column).setCellEditor(this);
+ table.addMouseListener(this);
+ panel = new JPanel();
+ panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
+ panel.add(Box.createHorizontalGlue());
+ if (buttons.length > 0)
+ panel.add(buttons[0]);
+ for (int i = 1; i < buttons.length; i++) {
+ panel.add(Box.createHorizontalStrut(BUTTON_SPACER));
+ panel.add(buttons[i]);
+ }
+ panel.add(Box.createHorizontalStrut(BUTTON_SPACER));
+ }
+
+ private void setFocusBorder(Border focusBorder) {
+ this.fborder = focusBorder;
+ for (JButton btn : buttons) {
+ btn.setBorder(focusBorder);
+ }
+ }
+
+ public Object getCellEditorValue() {
+ return editorValue;
+ }
+
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
+ int row, int column) {
+//FIXME: Java 6
+// final AddOnProperties addOn = model.getAddOnAt(table.convertRowIndexToModel(row));
+ setButtonsVisible(table, row);
+ for (JButton btn : buttons) {
+ if (isSelected) {
+ btn.setForeground(table.getSelectionForeground());
+ btn.setBackground(table.getSelectionBackground());
+ panel.setBackground(table.getSelectionBackground());
+ }
+ else {
+ btn.setForeground(table.getForeground());
+ btn.setBackground(UIManager.getColor("Button.background"));
+ panel.setBackground(table.getBackground());
+ }
+ if (hasFocus) {
+ btn.setBorder(fborder);
+ }
+ else {
+ btn.setBorder(border);
+ }
+ }
+ return panel;
+ }
+
+ protected void setButtonsVisible(JTable table, int row) {
+ final ManageAddOnsPanel.AddOnTableModel model = (ManageAddOnsPanel.AddOnTableModel) table.getModel();
+ final AddOnProperties addOn = model.getAddOnAt(row);
+ for (JButton btn : buttons) {
+ final boolean supportsOperation = addOn.supportsOperation(btn.getName());
+ btn.setVisible(supportsOperation);
+ }
+ }
+
+ public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
+ this.editorValue = value;
+ setButtonsVisible(table, row);
+ return panel;
+ }
+
+ public void actionPerformed(ActionEvent e) {
+//FIXME: Java 6
+// int row = table.convertRowIndexToModel(table.getEditingRow());
+ int row = table.getEditingRow();
+ fireEditingStopped();
+ for (int i = 0; i < buttons.length; i++) {
+ if (e.getSource().equals(buttons[i])) {
+ final ActionEvent event = new ActionEvent(table, ActionEvent.ACTION_PERFORMED, "" + row);
+ actions[i].actionPerformed(event);
+ break;
+ }
+ }
+ }
+
+ /*
+ * When the mouse is pressed the editor is invoked. If you then then drag
+ * the mouse to another cell before releasing it, the editor is still
+ * active. Make sure editing is stopped when the mouse is released.
+ */
+ public void mousePressed(MouseEvent e) {
+ if (table.isEditing() && table.getCellEditor() == this)
+ isButtonColumnEditor = true;
+ }
+
+ public void mouseReleased(MouseEvent e) {
+ if (isButtonColumnEditor && table.isEditing())
+ table.getCellEditor().stopCellEditing();
+ isButtonColumnEditor = false;
+ }
+
+ public void mouseClicked(MouseEvent e) {
+ }
+
+ public void mouseEntered(MouseEvent e) {
+ }
+
+ public void mouseExited(MouseEvent e) {
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsAction.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ManageAddOnsAction.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsAction.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ManageAddOnsAction.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ManageAddOnsDialog.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ManageAddOnsDialog.java
new file mode 100644
index 0000000..e1fadd6
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ManageAddOnsDialog.java
@@ -0,0 +1,136 @@
+package org.freeplane.plugin.script.addons;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.Frame;
+import java.awt.Toolkit;
+import java.awt.Window;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.HierarchyEvent;
+import java.awt.event.HierarchyListener;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+import javax.swing.WindowConstants;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.LabelAndMnemonicSetter;
+import org.freeplane.core.ui.components.UITools;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.main.addons.AddOnProperties;
+
+public class ManageAddOnsDialog extends JDialog {
+ private static final long serialVersionUID = 1L;
+ private AddOnInstallerPanel addOnInstallerPanel;
+ private JTabbedPane tabbedPane;
+
+ public ManageAddOnsDialog(final List<AddOnProperties> addOns) {
+ super((Frame) UITools.getMenuComponent(), TextUtils.getText("ManageAddOnsAction.text"), true);
+ // stolen from FileRevisionsDialog - no idea if actually needed
+ if (getOwner() != null) {
+ final Window[] ownedWindows = getOwner().getOwnedWindows();
+ for (Window w : ownedWindows) {
+ if (w.isVisible()) {
+ w.toBack();
+ }
+ }
+ }
+ tabbedPane = new JTabbedPane();
+ tabbedPane.setPreferredSize(getPreferredSizeForWindow());
+ final ManageAddOnsPanel manageAddOnsPanel = new ManageAddOnsPanel(filterNonThemes(addOns));
+ final ManageAddOnsPanel manageThemesPanel = new ManageAddOnsPanel(filterThemes(addOns));
+ addOnInstallerPanel = new AddOnInstallerPanel(manageAddOnsPanel, manageThemesPanel);
+ tabbedPane.addTab(getText("tab.install"), createIcon("/images/install_addons.png"), addOnInstallerPanel,
+ getText("tab.install.tooltip"));
+ tabbedPane.addTab(getText("tab.manage"), createIcon("/images/manage_addons.png"), manageAddOnsPanel,
+ getText("tab.manage.tooltip"));
+ tabbedPane.addTab(getText("tab.manage.themes"), createIcon("/images/manage_themes.png"), manageThemesPanel,
+ getText("tab.manage.themes.tooltip"));
+ getContentPane().add(tabbedPane, BorderLayout.CENTER);
+ {
+ JPanel buttonPane = new JPanel();
+ buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
+ getContentPane().add(buttonPane, BorderLayout.SOUTH);
+ {
+ JButton closeButton = new JButton();
+ LabelAndMnemonicSetter.setLabelAndMnemonic(closeButton, TextUtils.getRawText("close_btn"));
+ closeButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ setVisible(false);
+ }
+ });
+ buttonPane.add(closeButton);
+ }
+ }
+ pack();
+ setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+ UITools.addEscapeActionToDialog(this);
+ }
+
+ private List<AddOnProperties> filterThemes(final List<AddOnProperties> addOns) {
+ final ArrayList<AddOnProperties> result = new ArrayList<AddOnProperties>(addOns.size());
+ for (AddOnProperties addOn : addOns) {
+ if (addOn.isTheme())
+ result.add(addOn);
+ }
+ return result;
+ }
+
+ private List<AddOnProperties> filterNonThemes(final List<AddOnProperties> addOns) {
+ final ArrayList<AddOnProperties> result = new ArrayList<AddOnProperties>(addOns.size());
+ for (AddOnProperties addOn : addOns) {
+ if (!addOn.isTheme())
+ result.add(addOn);
+ }
+ return result;
+ }
+
+ private ImageIcon createIcon(String resource) {
+ return new ImageIcon(ResourceController.getResourceController().getResource(resource));
+ }
+
+ private Dimension getPreferredSizeForWindow() {
+ final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+ return new Dimension((int) screenSize.getWidth() * 4 / 5, (int) screenSize.getHeight() * 2 / 3);
+ }
+
+ private static String getResourceKey(final String key) {
+ return "ManageAddOnsDialog." + key;
+ }
+
+ static String getText(String key, Object... parameters) {
+ if (parameters.length == 0)
+ return TextUtils.getText(getResourceKey(key));
+ else
+ return TextUtils.format(getResourceKey(key), parameters);
+ }
+
+ public void install(final URL url) {
+ if (addOnInstallerPanel.isShowing()) {
+ addOnInstallerPanel.getUrlField().setText(url.toString());
+ tabbedPane.paintImmediately(0, 0, tabbedPane.getWidth(), tabbedPane.getHeight());
+ addOnInstallerPanel.getInstallButton().doClick();
+ }
+ else {
+ addOnInstallerPanel.addHierarchyListener(new HierarchyListener() {
+ public void hierarchyChanged(HierarchyEvent e) {
+ if (addOnInstallerPanel.isShowing()) {
+ addOnInstallerPanel.removeHierarchyListener(this);
+ install(url);
+ }
+ }
+ });
+ tabbedPane.setSelectedComponent(addOnInstallerPanel);
+ if (!isVisible())
+ setVisible(true);
+ }
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsPanel.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ManageAddOnsPanel.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsPanel.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ManageAddOnsPanel.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ScriptAddOnProperties.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ScriptAddOnProperties.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ScriptAddOnProperties.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/addons/ScriptAddOnProperties.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/defaults.properties b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/defaults.properties
new file mode 100644
index 0000000..bf6ebad
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/defaults.properties
@@ -0,0 +1,9 @@
+execute_scripts_without_asking =
+execute_scripts_without_file_restriction = false
+execute_scripts_without_write_restriction = false
+execute_scripts_without_network_restriction = false
+execute_scripts_without_exec_restriction = false
+signed_script_are_trusted = true
+script_user_key_name_for_signing = FreeplaneScriptKey
+script_directories =
+script_classpath =
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/filter/ScriptCondition.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/filter/ScriptCondition.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/filter/ScriptCondition.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/filter/ScriptCondition.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/filter/ScriptConditionController.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/filter/ScriptConditionController.java
new file mode 100644
index 0000000..9b05963
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/filter/ScriptConditionController.java
@@ -0,0 +1,134 @@
+/*
+ * Freeplane - mind map editor
+ * Copyright (C) 2008 Dimitry Polivaev
+ *
+ * This file author is Dimitry Polivaev
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.freeplane.plugin.script.filter;
+
+import java.awt.Component;
+import java.awt.Dimension;
+
+import javax.swing.ComboBoxEditor;
+import javax.swing.ComboBoxModel;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.DefaultListModel;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListModel;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.IElementaryConditionController;
+import org.freeplane.n3.nanoxml.XMLElement;
+import org.freeplane.plugin.script.ScriptComboBoxEditor;
+import org.freeplane.plugin.script.ScriptRenderer;
+
+
+/**
+ * @author Dimitry Polivaev
+ * 21.12.2008
+ */
+public class ScriptConditionController implements IElementaryConditionController {
+ static final String FILTER_SCRIPT = "filter_script";
+ private final ComboBoxEditor editor = new ScriptComboBoxEditor();
+ private final ListCellRenderer renderer = new ScriptRenderer();
+ private final ComboBoxModel values = new DefaultComboBoxModel();
+
+ public ScriptConditionController() {
+ super();
+ Component showEditorBtn = editor.getEditorComponent();
+ final Dimension preferredSize = showEditorBtn.getPreferredSize();
+ preferredSize.width = 100;
+ showEditorBtn.setPreferredSize(preferredSize);
+
+ }
+
+ public boolean canEditValues(final Object property, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public boolean canHandle(final Object selectedItem) {
+ if (!(selectedItem instanceof TranslatedObject)) {
+ return false;
+ }
+ final TranslatedObject namedObject = (TranslatedObject) selectedItem;
+ return namedObject.objectEquals(ScriptConditionController.FILTER_SCRIPT);
+ }
+
+ public boolean canSelectValues(final Object property, final TranslatedObject simpleCond) {
+ return true;
+ }
+
+ public ASelectableCondition createCondition(final Object selectedItem, final TranslatedObject simpleCond,
+ final Object value, final boolean matchCase,
+ final boolean matchApproximately) {
+ if(value == null)
+ return null;
+ final String string = (String) value;
+ if("".equals(string))
+ return null;
+ return new ScriptCondition(string);
+ }
+
+ public ComboBoxModel getConditionsForProperty(final Object property) {
+ return new DefaultComboBoxModel(getScriptConditionNames());
+ }
+
+ public ListModel getFilteredProperties() {
+ final DefaultListModel list = new DefaultListModel();
+ list.addElement(TextUtils.createTranslatedString(FILTER_SCRIPT));
+ return list;
+ }
+
+ public Object[] getScriptConditionNames() {
+ return new TranslatedObject[] { new TranslatedObject(ScriptCondition.NAME, " ")};
+ }
+
+ public ComboBoxEditor getValueEditor(Object selectedProperty, TranslatedObject selectedCondition) {
+ return editor;
+ }
+
+ public ComboBoxModel getValuesForProperty(final Object selectedItem, TranslatedObject simpleCond) {
+ values.setSelectedItem("");
+ return values;
+ }
+
+ public boolean isCaseDependent(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public boolean supportsApproximateMatching(final Object property, final TranslatedObject simpleCond) {
+ return false;
+ }
+
+ public ASelectableCondition loadCondition(final XMLElement element) {
+ try {
+ if (element.getName().equalsIgnoreCase(ScriptCondition.NAME)) {
+ return ScriptCondition.load(element);
+ }
+ }
+ catch (final Exception e) {
+ LogUtils.severe(e);
+ }
+ return null;
+ }
+
+ public ListCellRenderer getValueRenderer(Object selectedProperty, TranslatedObject selectedCondition) {
+ return renderer;
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/preferences.xml b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/preferences.xml
new file mode 100644
index 0000000..a5f0fbd
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/preferences.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?><preferences_structure xmlns="http://freeplane.sf.net/ui/preferences/1.0">
+<tabbed_pane>
+<tab name="plugins">
+<separator name="scripting">
+<remind_value name="execute_scripts_without_asking"/>
+<boolean name="execute_scripts_without_file_restriction"/>
+<boolean name="execute_scripts_without_write_restriction"/>
+<boolean name="execute_scripts_without_network_restriction"/>
+<boolean name="execute_scripts_without_exec_restriction"/>
+<boolean name="signed_script_are_trusted"/>
+<string name="script_user_key_name_for_signing"/>
+<string name="script_compilation_disabled_extensions"/>
+<string name="script_directories"/>
+<string name="script_classpath"/>
+<font name="groovy_editor_font"/>
+<number name="groovy_editor_font_size" min="4" max="216"/>
+</separator>
+</tab>
+</tabbed_pane>
+</preferences_structure>
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/AbstractProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/AbstractProxy.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/AbstractProxy.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/AbstractProxy.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/AttributesProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/AttributesProxy.java
new file mode 100644
index 0000000..aba2081
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/AttributesProxy.java
@@ -0,0 +1,324 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import groovy.lang.Closure;
+import groovy.lang.MissingMethodException;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.freeplane.features.attribute.Attribute;
+import org.freeplane.features.attribute.AttributeController;
+import org.freeplane.features.attribute.NodeAttributeTableModel;
+import org.freeplane.features.attribute.mindmapmode.MAttributeController;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.map.INodeView;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.view.swing.map.NodeView;
+
+class AttributesProxy extends AbstractProxy<NodeModel> implements Proxy.Attributes {
+ AttributesProxy(final NodeModel delegate, final ScriptContext scriptContext) {
+ super(delegate, scriptContext);
+ }
+
+ public boolean containsKey(String name) {
+ final int index = findFirst(name);
+ return (index != -1);
+ }
+
+ @Deprecated
+ public Object get(final String name) {
+ return getFirst(name);
+ }
+
+ public Object getFirst(final String name) {
+ final int index = findFirst(name);
+ if (index == -1) {
+ return null;
+ }
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ return attributeTableModel.getAttribute(index).getValue();
+ }
+
+ public List<Object> getAll(final String name) {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ if (attributeTableModel == null) {
+ return Collections.emptyList();
+ }
+ final ArrayList<Object> result = new ArrayList<Object>();
+ for (final Attribute attribute : attributeTableModel.getAttributes()) {
+ if (attribute.getName().equals(name)) {
+ result.add(attribute.getValue());
+ }
+ }
+ return result;
+ }
+
+ public List<String> getNames() {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ if (attributeTableModel == null) {
+ return Collections.emptyList();
+ }
+ final ArrayList<String> result = new ArrayList<String>(attributeTableModel.getRowCount());
+ for (final Attribute a : attributeTableModel.getAttributes()) {
+ result.add(a.getName());
+ }
+ return result;
+ }
+
+ @Deprecated
+ public List<String> getAttributeNames() {
+ return getNames();
+ }
+
+ public List<? extends Convertible> getValues() {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ if (attributeTableModel == null) {
+ return Collections.emptyList();
+ }
+ final ArrayList<Convertible> result = new ArrayList<Convertible>(attributeTableModel.getRowCount());
+ for (final Attribute a : attributeTableModel.getAttributes()) {
+ result.add(ProxyUtils.attributeValueToConvertible(getDelegate(), getScriptContext(), a.getValue()));
+ }
+ return result;
+ }
+
+ public Map<String, Object> getMap() {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ if (attributeTableModel == null) {
+ return Collections.emptyMap();
+ }
+ final LinkedHashMap<String, Object> result = new LinkedHashMap<String, Object>(attributeTableModel.getRowCount());
+ for (final Attribute a : attributeTableModel.getAttributes()) {
+ result.put(a.getName(), a.getValue());
+ }
+ return result;
+ }
+
+ public List<? extends Convertible> findValues(Closure<Boolean> closure) {
+ try {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ if (attributeTableModel == null) {
+ return Collections.emptyList();
+ }
+ final ArrayList<Convertible> result = new ArrayList<Convertible>(
+ attributeTableModel.getRowCount());
+ for (final Attribute a : attributeTableModel.getAttributes()) {
+ final Object bool = closure.call(new Object[] { a.getName(), a.getValue() });
+ if (result == null) {
+ throw new RuntimeException("findValues(): closure returned null instead of boolean/Boolean");
+ }
+ if ((Boolean) bool)
+ result.add(ProxyUtils.attributeValueToConvertible(getDelegate(), getScriptContext(), a.getValue()));
+ }
+ return result;
+ }
+ catch (final MissingMethodException e) {
+ throw new RuntimeException("findValues(): closure needs to accept two args and must return boolean/Boolean"
+ + " e.g. findValues{k,v -> k != 'TOTAL'}", e);
+ }
+ catch (final ClassCastException e) {
+ throw new RuntimeException("findValues(): closure returned " + e.getMessage()
+ + " instead of boolean/Boolean");
+ }
+ }
+
+ public Object get(final int index) {
+ return getAndCheckNodeAttributeTableModelForIndex(index, "get:").getValue(index);
+ }
+
+ private NodeAttributeTableModel getAndCheckNodeAttributeTableModelForIndex(final int index, String errorPrefix) {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ if (attributeTableModel == null) {
+ throw new IndexOutOfBoundsException(errorPrefix + index);
+ }
+ return attributeTableModel;
+ }
+
+ public String getKey(int index) {
+ return getAndCheckNodeAttributeTableModelForIndex(index, "getKey:").getAttribute(index).getName();
+ }
+
+ public void set(final int index, final Object value) {
+ final NodeAttributeTableModel attributeTableModel = getAndCheckNodeAttributeTableModelForIndex(index, "set1:");
+ String oldPattern = getOldValueFormatPattern(attributeTableModel, index);
+ getAttributeController().performSetValueAt(attributeTableModel, ProxyUtils.transformObject(value, oldPattern), index, 1);
+ }
+
+ public void set(final int index, final String name, final Object value) {
+ final NodeAttributeTableModel attributeTableModel = getAndCheckNodeAttributeTableModelForIndex(index, "set2:");
+ String oldPattern = getOldValueFormatPattern(attributeTableModel, index);
+ getAttributeController().setAttribute(getDelegate(), index, new Attribute(name, ProxyUtils.transformObject(value, oldPattern)));
+ }
+
+ public int findFirst(final String name) {
+ final List<String> attributeNames = getAttributeNames();
+ for (int i = 0; i < attributeNames.size(); i++) {
+ if (attributeNames.get(i).equals(name)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ @Deprecated
+ public int findAttribute(final String name) {
+ return findFirst(name);
+ }
+
+ @Deprecated
+ public boolean remove(final String name) {
+ final int index = findFirst(name);
+ if (index == -1) {
+ return false;
+ }
+ getAttributeController().removeAttribute(getDelegate(), index);
+ return true;
+ }
+
+ public boolean removeAll(final String name) {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ if (attributeTableModel == null) {
+ return false;
+ }
+ final ArrayList<Integer> toRemove = new ArrayList<Integer>();
+ final Vector<Attribute> attributes = attributeTableModel.getAttributes();
+ for (int i = 0; i < attributes.size(); ++i) {
+ if (attributes.get(i).getName().equals(name)) {
+ toRemove.add(i);
+ }
+ }
+ // do it backwards in order not to invalidate the first indexes
+ for (int i = toRemove.size() - 1; i >= 0; --i) {
+ getAttributeController().removeAttribute(getDelegate(), toRemove.get(i));
+ }
+ return !toRemove.isEmpty();
+ }
+
+ public void remove(final int index) {
+ getAndCheckNodeAttributeTableModelForIndex(index, "remove:");
+ getAttributeController().removeAttribute(getDelegate(), index);
+ }
+
+ public void clear() {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ final int size = attributeTableModel.getRowCount();
+ for (int i = size - 1; i >= 0; i--) {
+ getAttributeController().removeAttribute(getDelegate(), i);
+ }
+ }
+
+ public void set(final String name, final Object value) {
+ final int index = findFirst(name);
+ if (index == -1) {
+ final Attribute attribute = new Attribute(name, ProxyUtils.transformObject(value, null));
+ getAttributeController().addAttribute(getDelegate(), attribute);
+ }
+ else {
+ final String oldPattern = getOldValueFormatPattern(getNodeAttributeTableModel(), index);
+ final Attribute attribute = new Attribute(name, ProxyUtils.transformObject(value, oldPattern));
+ getAttributeController().setAttribute(getDelegate(), index, attribute);
+ }
+ }
+
+ private String getOldValueFormatPattern(NodeAttributeTableModel attributeTableModel, int index) {
+ final Object value = attributeTableModel.getAttribute(index).getValue();
+ return (value instanceof IFormattedObject) ? ((IFormattedObject) value).getPattern() : null;
+ }
+
+ public void add(final String name, final Object value) {
+ final Attribute attribute = new Attribute(name, ProxyUtils.transformObject(value, null));
+ getAttributeController().addAttribute(getDelegate(), attribute);
+ }
+
+ public int size() {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ if (attributeTableModel == null) {
+ return 0;
+ }
+ return attributeTableModel.getRowCount();
+ }
+
+ public boolean isEmpty() {
+ return size() == 0;
+ }
+
+ private MAttributeController getAttributeController() {
+ return (MAttributeController) AttributeController.getController();
+ }
+
+ private NodeAttributeTableModel getNodeAttributeTableModel() {
+ return NodeAttributeTableModel.getModel(getDelegate());
+ }
+
+ /** make <code>if (node.attributes) println "has attributes"</code> work. */
+ public boolean asBoolean() {
+ return !isEmpty();
+ }
+
+ @Override
+ public void optimizeWidths() {
+ for (INodeView view : getDelegate().getViewers()) {
+ if (view instanceof NodeView) {
+ // getAttributeView() will check for null for itself:
+ ((NodeView) view).getAttributeView().setOptimalColumnWidths();
+ return;
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public Iterator<Map.Entry<String, Object>> iterator() {
+ final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
+ if (attributeTableModel == null) {
+ return (Iterator<Map.Entry<String, Object>>) (Object) Collections.emptyMap().entrySet().iterator();
+ }
+ return new Iterator<Map.Entry<String, Object>>() {
+ final private Iterator<Attribute> iterator = attributeTableModel.getAttributes().iterator();
+
+ @Override
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ @Override
+ public Map.Entry<String, Object> next() {
+ final Attribute attribute = iterator.next();
+ return new Map.Entry<String, Object>() {
+
+ @Override
+ public String getKey() {
+ return attribute.getName();
+ }
+
+ @Override
+ public Object getValue() {
+ return attribute.getValue();
+ }
+
+ @Override
+ public Object setValue(Object value) {
+ final Object oldValue = attribute.getValue();
+ attribute.setValue(value);
+ return oldValue;
+ }
+ ;
+ };
+ }
+
+ @Override
+ public void remove() {
+ iterator.remove();
+ }
+ };
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/CloudProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/CloudProxy.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/CloudProxy.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/CloudProxy.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorInListProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorInListProxy.java
new file mode 100644
index 0000000..c49da9b
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorInListProxy.java
@@ -0,0 +1,43 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.freeplane.features.link.NodeLinkModel;
+import org.freeplane.features.link.MapLinks;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ScriptContext;
+
+class ConnectorInListProxy extends AbstractCollection<Proxy.Connector> {
+ private final NodeModel node;
+ private final ScriptContext scriptContext;
+
+ public ConnectorInListProxy(final NodeProxy nodeProxy) {
+ this.node = nodeProxy.getDelegate();
+ this.scriptContext = nodeProxy.getScriptContext();
+ }
+
+ List<NodeLinkModel> getConnectorSet() {
+ final MapLinks allLinks = MapLinks.getLinks(node.getMap());
+ final Set<NodeLinkModel> links = allLinks == null ? null : allLinks.get(node.getID());
+ return links == null ? Collections.<NodeLinkModel> emptyList() : Collections
+ .unmodifiableList(new ArrayList<NodeLinkModel>(links));
+ }
+
+ @Override
+ public Iterator<Proxy.Connector> iterator() {
+ return new ConnectorIterator(getConnectorSet().iterator(), scriptContext);
+ }
+
+ @Override
+ public int size() {
+ return getConnectorSet().size();
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorIterator.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorIterator.java
new file mode 100644
index 0000000..52dcf39
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorIterator.java
@@ -0,0 +1,50 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.NodeLinkModel;
+import org.freeplane.plugin.script.ScriptContext;
+
+class ConnectorIterator implements Iterator<Proxy.Connector> {
+ private final ScriptContext scriptContext;
+ private final Iterator<NodeLinkModel> iterator;
+ private ConnectorModel next;
+
+ public ConnectorIterator(final Iterator<NodeLinkModel> iterator, final ScriptContext scriptContext) {
+ this.scriptContext = scriptContext;
+ this.iterator = iterator;
+ next = getNextConnectorModel();
+ }
+
+ private ConnectorModel getNextConnectorModel() {
+ while (iterator.hasNext()) {
+ final NodeLinkModel linkModel = iterator.next();
+ if (linkModel instanceof ConnectorModel) {
+ return (ConnectorModel) linkModel;
+ }
+ }
+ return null;
+ }
+
+ public boolean hasNext() {
+ return next != null;
+ }
+
+ public Proxy.Connector next() {
+ if (!hasNext()) {
+ throw new NoSuchElementException();
+ }
+ final ConnectorModel current = next;
+ next = getNextConnectorModel();
+ return new ConnectorProxy(current, scriptContext);
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorOutListProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorOutListProxy.java
new file mode 100644
index 0000000..9e77575
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorOutListProxy.java
@@ -0,0 +1,35 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.util.AbstractCollection;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+
+import org.freeplane.features.link.NodeLinkModel;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ScriptContext;
+
+class ConnectorOutListProxy extends AbstractCollection<Proxy.Connector> {
+ private final NodeModel node;
+ private final ScriptContext scriptContext;
+
+ public ConnectorOutListProxy(final NodeProxy nodeProxy) {
+ this.node = nodeProxy.getDelegate();
+ this.scriptContext = nodeProxy.getScriptContext();
+ }
+
+ @Override
+ public Iterator<Proxy.Connector> iterator() {
+ return new ConnectorIterator(Collections.unmodifiableList(new ArrayList<NodeLinkModel>(NodeLinks.getLinks(node)))
+ .iterator(), scriptContext);
+ }
+
+ @Override
+ public int size() {
+ return NodeLinks.getLinks(node).size();
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorProxy.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorProxy.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConnectorProxy.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ControllerProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ControllerProxy.java
new file mode 100644
index 0000000..a861b49
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ControllerProxy.java
@@ -0,0 +1,306 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import groovy.lang.Closure;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.Icon;
+import javax.swing.filechooser.FileFilter;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.ui.IEditHandler.FirstAction;
+import org.freeplane.core.undo.IUndoHandler;
+import org.freeplane.core.util.FreeplaneIconUtils;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.export.mindmapmode.ExportController;
+import org.freeplane.features.export.mindmapmode.IExportEngine;
+import org.freeplane.features.filter.condition.ICondition;
+import org.freeplane.features.map.IMapSelection;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapModel;
+import org.freeplane.features.mapio.MapIO;
+import org.freeplane.features.mapio.mindmapmode.MMapIO;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.mode.mindmapmode.MModeController;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.plugin.script.proxy.Proxy.Map;
+import org.freeplane.plugin.script.proxy.Proxy.Node;
+
+class ControllerProxy implements Proxy.Controller {
+ private final ScriptContext scriptContext;
+
+ public ControllerProxy(final ScriptContext scriptContext) {
+ this.scriptContext = scriptContext;
+ }
+
+ public void centerOnNode(final Node center) {
+ final NodeModel nodeModel = ((NodeProxy) center).getDelegate();
+ Controller.getCurrentController().getSelection().centerNode(nodeModel);
+ }
+
+ public void edit(Node node) {
+ editImpl(node, true);
+ }
+
+ public void editInPopup(Node node) {
+ editImpl(node, false);
+ }
+
+ private void editImpl(Node node, boolean editInline) {
+ final NodeModel nodeModel = ((NodeProxy) node).getDelegate();
+ Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(nodeModel);
+ ((MTextController) TextController.getController()).edit(FirstAction.EDIT_CURRENT, !editInline);
+ }
+
+ public Node getSelected() {
+ if (scriptContext != null)
+ scriptContext.accessAll();
+ return new NodeProxy(Controller.getCurrentController().getSelection().getSelected(), scriptContext);
+ }
+
+ public List<Node> getSelecteds() {
+ if (scriptContext != null)
+ scriptContext.accessAll();
+ return ProxyUtils.createNodeList(Controller.getCurrentController().getSelection().getOrderedSelection(), scriptContext);
+ }
+
+ public List<Node> getSortedSelection(final boolean differentSubtrees) {
+ if (scriptContext != null)
+ scriptContext.accessAll();
+ return ProxyUtils.createNodeList(Controller.getCurrentController().getSelection()
+ .getSortedSelection(differentSubtrees), scriptContext);
+ }
+
+ public void select(final Node toSelect) {
+ if (toSelect != null) {
+ final NodeModel nodeModel = ((NodeProxy) toSelect).getDelegate();
+ Controller.getCurrentModeController().getMapController().displayNode(nodeModel);
+ Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(nodeModel);
+ }
+ }
+
+ public void selectBranch(final Node branchRoot) {
+ if (branchRoot != null) {
+ final NodeModel nodeModel = ((NodeProxy) branchRoot).getDelegate();
+ Controller.getCurrentModeController().getMapController().displayNode(nodeModel);
+ Controller.getCurrentController().getSelection().selectBranch(nodeModel, false);
+ }
+ }
+
+ public void select(final Collection<Node> toSelect) {
+ final IMapSelection selection = Controller.getCurrentController().getSelection();
+ final Iterator<Node> it = toSelect.iterator();
+ if (!it.hasNext()) {
+ return;
+ }
+ selection.selectAsTheOnlyOneSelected(((NodeProxy) it.next()).getDelegate());
+ while (it.hasNext()) {
+ final NodeModel nodeModel = ((NodeProxy) it.next()).getDelegate();
+ Controller.getCurrentController().getSelection().toggleSelected(nodeModel);
+ }
+ }
+
+ public void selectMultipleNodes(final Collection<Node> toSelect) {
+ select(toSelect);
+ }
+
+ public void deactivateUndo() {
+ final MapModel map = Controller.getCurrentController().getMap();
+ if (map instanceof MapModel) {
+ MModeController modeController = ((MModeController) Controller.getCurrentModeController());
+ modeController.deactivateUndo((MMapModel) map);
+ }
+ }
+
+ public void undo() {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ undoHandler.undo();
+ }
+
+ public void redo() {
+ final MapModel map = Controller.getCurrentController().getMap();
+ final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
+ undoHandler.redo();
+ }
+
+ public void setStatusInfo(final String info) {
+ final ViewController viewController = getViewController();
+ viewController.out(info);
+ }
+
+ private ViewController getViewController() {
+ return Controller.getCurrentController().getViewController();
+ }
+
+ private IMapViewManager getMapViewManager() {
+ return Controller.getCurrentController().getMapViewManager();
+ }
+
+ public void setStatusInfo(final String infoPanelKey, final String info) {
+ final ViewController viewController = getViewController();
+ viewController.addStatusInfo(infoPanelKey, info, null);
+ }
+
+ public void setStatusInfo(final String infoPanelKey, final String info, final String iconKey) {
+ final ViewController viewController = getViewController();
+ viewController.addStatusInfo(infoPanelKey, info, FreeplaneIconUtils.createStandardIcon(iconKey));
+ }
+
+ @Deprecated
+ public void setStatusInfo(final String infoPanelKey, final Icon icon) {
+ final ViewController viewController = getViewController();
+ viewController.addStatusInfo(infoPanelKey, null, icon);
+ }
+
+ public FreeplaneVersion getFreeplaneVersion() {
+ return FreeplaneVersion.getVersion();
+ }
+
+ public File getUserDirectory() {
+ return new File(ResourceController.getResourceController().getFreeplaneUserDirectory());
+ }
+
+ @Deprecated
+ public List<Node> find(final ICondition condition) {
+ if (scriptContext != null)
+ scriptContext.accessAll();
+ return ProxyUtils.find(condition, Controller.getCurrentController().getMap().getRootNode(), scriptContext);
+ }
+
+ public List<Node> find(final Closure<Boolean> closure) {
+ if (scriptContext != null)
+ scriptContext.accessAll();
+ return ProxyUtils.find(closure, Controller.getCurrentController().getMap().getRootNode(), scriptContext);
+ }
+
+ // NodeRO: R
+ public List<Node> findAll() {
+ if (scriptContext != null)
+ scriptContext.accessAll();
+ return ProxyUtils.findAll(Controller.getCurrentController().getMap().getRootNode(), scriptContext, true);
+ }
+
+ // NodeRO: R
+ public List<Node> findAllDepthFirst() {
+ if (scriptContext != null)
+ scriptContext.accessAll();
+ return ProxyUtils.findAll(Controller.getCurrentController().getMap().getRootNode(), scriptContext, false);
+ }
+
+ public Map newMap() {
+ final MapModel oldMap = Controller.getCurrentController().getMap();
+ final MMapIO mapIO = (MMapIO) Controller.getCurrentModeController().getExtension(MapIO.class);
+ final MapModel newMap = mapIO.newMapFromDefaultTemplate();
+ restartTransaction(oldMap, newMap);
+ return new MapProxy(newMap, scriptContext);
+ }
+
+ public Map newMapFromTemplate(File templateFile) {
+ final MapModel oldMap = Controller.getCurrentController().getMap();
+ final MMapIO mapIO = (MMapIO) Controller.getCurrentModeController().getExtension(MapIO.class);
+ final MapModel newMap = mapIO.newMapFromTemplate(templateFile);
+ restartTransaction(oldMap, newMap);
+ return new MapProxy(newMap, scriptContext);
+ }
+
+ public Map newMap(URL url) {
+ try {
+ final MapModel oldMap = Controller.getCurrentController().getMap();
+ Controller.getCurrentModeController().getMapController().newMap(url);
+ final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
+ final String key = mapViewManager.checkIfFileIsAlreadyOpened(url);
+ // make the map the current map even if it was already opened
+ if (key == null || !mapViewManager.tryToChangeToMapView(key))
+ throw new RuntimeException("map " + url + " does not seem to be opened");
+ final MapModel newMap = mapViewManager.getModel();
+ restartTransaction(oldMap, newMap);
+ return new MapProxy(newMap, scriptContext);
+ }
+ catch (Exception e) {
+ throw new RuntimeException("error on newMap", e);
+ }
+ }
+
+ private void restartTransaction(final MapModel oldMap, final MapModel newmap) {
+ final IUndoHandler oldUndoHandler = (IUndoHandler) oldMap.getExtension(IUndoHandler.class);
+ final IUndoHandler newUndoHandler = (IUndoHandler) newmap.getExtension(IUndoHandler.class);
+ final int transactionLevel = oldUndoHandler.getTransactionLevel();
+ if(transactionLevel == 0){
+ return;
+ }
+ if(transactionLevel == 1){
+ oldUndoHandler.commit();
+ newUndoHandler.startTransaction();
+ return;
+ }
+ throw new RuntimeException("can not create map inside transaction");
+ }
+
+ public float getZoom() {
+ return getMapViewManager().getZoom();
+ }
+
+ public void setZoom(float ratio) {
+ getMapViewManager().setZoom(ratio);
+ }
+
+ public boolean isInteractive() {
+ return !Boolean.parseBoolean(System.getProperty("nonInteractive"));
+ }
+
+ public List<String> getExportTypeDescriptions() {
+ final ArrayList<String> list = new ArrayList<String>();
+ for (FileFilter fileFilter : ExportController.getContoller().getFileFilters()) {
+ list.add(fileFilter.getDescription());
+ }
+ return list;
+ }
+
+ public void export(Map map, File destFile, String exportTypeDescription, boolean overwriteExisting) {
+ final FileFilter filter = findExportFileFilterByDescription(exportTypeDescription);
+ if (filter == null) {
+ throw new IllegalArgumentException("no export defined for '" + exportTypeDescription + "'");
+ }
+ else if (!overwriteExisting && destFile.exists()) {
+ throw new RuntimeException("destination file " + destFile.getAbsolutePath()
+ + " already exists - set overwriteExisting to true?");
+ }
+ else {
+ final IExportEngine exportEngine = ExportController.getContoller().getFilterMap().get(filter);
+ exportEngine.export(((MapProxy) map).getDelegate(), destFile);
+ LogUtils.info("exported " + map.getFile() + " to " + destFile.getAbsolutePath());
+ }
+ }
+
+ private FileFilter findExportFileFilterByDescription(String exportTypeDescription) {
+ for (FileFilter fileFilter : ExportController.getContoller().getFileFilters()) {
+ if (fileFilter.getDescription().equals(exportTypeDescription))
+ return fileFilter;
+ }
+ return null;
+ }
+
+ public List<Map> getOpenMaps() {
+ Collection<MapModel> mapModels = getMapViewManager().getMaps().values();
+ ArrayList<Map> mapProxies = new ArrayList<Map>(mapModels.size());
+ for (MapModel mapModel : mapModels) {
+ mapProxies.add(new MapProxy(mapModel, scriptContext));
+ }
+ return mapProxies;
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConversionException.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConversionException.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConversionException.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConversionException.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/Convertible.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/Convertible.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/Convertible.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/Convertible.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleDate.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleDate.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleDate.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleDate.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleHtmlText.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleHtmlText.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleHtmlText.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleHtmlText.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNodeText.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleNodeText.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNodeText.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleNodeText.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNoteText.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleNoteText.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNoteText.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleNoteText.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNumber.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleNumber.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleNumber.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleNumber.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleText.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleText.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConvertibleText.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ConvertibleText.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/EdgeProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/EdgeProxy.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/EdgeProxy.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/EdgeProxy.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ExternalObjectProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ExternalObjectProxy.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ExternalObjectProxy.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ExternalObjectProxy.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FontProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/FontProxy.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FontProxy.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/FontProxy.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FormulaCache.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/FormulaCache.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/FormulaCache.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/FormulaCache.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/IconsProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/IconsProxy.java
new file mode 100644
index 0000000..2252916
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/IconsProxy.java
@@ -0,0 +1,164 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.freeplane.features.icon.IconController;
+import org.freeplane.features.icon.MindIcon;
+import org.freeplane.features.icon.factory.IconStoreFactory;
+import org.freeplane.features.icon.mindmapmode.MIconController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.plugin.script.proxy.Proxy.IconsRO;
+
+class IconsProxy extends AbstractProxy<NodeModel> implements Proxy.Icons {
+ IconsProxy(final NodeModel delegate, final ScriptContext scriptContext) {
+ super(delegate, scriptContext);
+ }
+
+ public void add(final String name) {
+ getIconController().addIcon(getDelegate(), IconStoreFactory.create().getMindIcon(name));
+ }
+
+ @Override
+ public void addAll(Collection<String> names) {
+ for (String name : names) {
+ add(name);
+ }
+ }
+
+ @Override
+ public void addAll(IconsRO icons) {
+ for (String name : icons.getIcons()) {
+ add(name);
+ }
+ }
+
+ @Deprecated
+ public void addIcon(final String name) {
+ add(name);
+ }
+
+ private int findIcon(final String iconID) {
+ final List<MindIcon> icons = getDelegate().getIcons();
+ for (int i = 0; i < icons.size(); i++) {
+ if (icons.get(i).getName().equals(iconID)) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ private MIconController getIconController() {
+ return (MIconController) IconController.getController();
+ }
+
+ public String getAt(int index) {
+ final List<MindIcon> icons = getDelegate().getIcons();
+ return icons.size() <= index ? null : icons.get(index).getName();
+ }
+
+ public String getFirst() {
+ final List<MindIcon> icons = getDelegate().getIcons();
+ return icons.isEmpty() ? null : icons.get(0).getName();
+ }
+
+ public boolean contains(String name) {
+ final List<MindIcon> icons = getDelegate().getIcons();
+ for (final MindIcon icon : icons) {
+ if (icon.getName().equals(name))
+ return true;
+ }
+ return false;
+ }
+
+ public int size() {
+ final List<MindIcon> icons = getDelegate().getIcons();
+ return icons.size();
+ }
+
+ public List<String> getIcons() {
+ final List<MindIcon> icons = getDelegate().getIcons();
+ final int size = icons.size();
+ if (size == 0) {
+ return Collections.emptyList();
+ }
+ final ArrayList<String> list = new ArrayList<String>(size);
+ for (final MindIcon icon : icons) {
+ list.add(icon.getName());
+ }
+ return Collections.unmodifiableList(list);
+ }
+
+ public List<URL> getUrls() {
+ final List<MindIcon> icons = getDelegate().getIcons();
+ final int size = icons.size();
+ if (size == 0) {
+ return Collections.emptyList();
+ }
+ final ArrayList<URL> list = new ArrayList<URL>(size);
+ for (final MindIcon icon : icons) {
+ list.add(icon.getUrl());
+ }
+ return Collections.unmodifiableList(list);
+ }
+
+ public Iterator<String> iterator() {
+ return new Iterator<String>() {
+ final Iterator<String> iterator = getIcons().iterator();
+
+ @Override
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ @Override
+ public String next() {
+ return iterator.next();
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException("icons iterator is read-only");
+ }
+ };
+ }
+
+ public boolean remove(final int index) {
+ if (index >= size()) {
+ return false;
+ }
+ getIconController().removeIcon(getDelegate(), index);
+ return true;
+ }
+
+ public boolean remove(final String iconID) {
+ final int index = findIcon(iconID);
+ if (index == -1) {
+ return false;
+ }
+ getIconController().removeIcon(getDelegate(), index);
+ return true;
+ }
+
+ @Deprecated
+ public boolean removeIcon(final String iconID) {
+ return remove(iconID);
+ }
+
+ public void clear() {
+ getIconController().removeAllIcons(getDelegate());
+ }
+
+ /** make <code>if (node.icons) println "has some icon"</code> work. */
+ public boolean asBoolean() {
+ return size() > 0;
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/LinkProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/LinkProxy.java
new file mode 100644
index 0000000..92aec61
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/LinkProxy.java
@@ -0,0 +1,152 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.NodeLinks;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.plugin.script.proxy.Proxy.Node;
+
+class LinkProxy extends AbstractProxy<NodeModel> implements Proxy.Link {
+ LinkProxy(final NodeModel delegate, final ScriptContext scriptContext) {
+ super(delegate, scriptContext);
+ }
+
+ // LinkRO
+ public String getText() {
+ final URI link = getUri();
+ return link == null ? null : link.toString();
+ }
+
+ // LinkRO
+ public URI getUri() {
+ return NodeLinks.getLink(getDelegate());
+ }
+
+ // LinkRO
+ public File getFile() {
+ URI link = getUri();
+ try {
+ if (link == null)
+ return null;
+ if (!link.isAbsolute() && isFileUri(link)) {
+ final File mapFile = getDelegate().getMap().getFile();
+ return mapFile == null ? null : new File(mapFile.getParent(), link.getPath());
+ }
+ return new File(link);
+ }
+ catch (Exception e) {
+ LogUtils.warn("link is not a file uri: " + e);
+ return null;
+ }
+ }
+
+ private boolean isFileUri(URI link) {
+ return link.getScheme() == null || link.getScheme().equals("file");
+ }
+
+ // LinkRO
+ public Node getNode() {
+ final URI uri = getUri();
+ if (uri == null)
+ return null;
+ final String link = uri.toString();
+ if (!link.startsWith("#")) {
+ LogUtils.warn(link + " is no node id link");
+ return null;
+ }
+ final NodeModel targetNode = getDelegate().getMap().getNodeForID(link.substring(1));
+ if (targetNode == null) {
+ LogUtils.warn(link + ": node does not exist (anymore?)");
+ return null;
+ }
+ return new NodeProxy(targetNode, getScriptContext());
+ }
+
+ // LinkRO
+ @Deprecated
+ public String get() {
+ // uses getValidLink() instead of getLink() as in getText()
+ final URI link = NodeLinks.getValidLink(getDelegate());
+ return link == null ? null : link.toString();
+ }
+
+ private MLinkController getLinkController() {
+ return (MLinkController) LinkController.getController();
+ }
+
+ // Link R/W
+ public void setText(String target) {
+ try {
+ if (!removeLinkIfNull(target)) {
+ getLinkController().setLink(getDelegate(), new URI(target), LinkController.LINK_ABSOLUTE);
+ }
+ }
+ catch (final URISyntaxException e) {
+ throw new IllegalArgumentException(e);
+ }
+ }
+
+ // Link R/W
+ public void setUri(URI target) {
+ if (!removeLinkIfNull(target)) {
+ getLinkController().setLink(getDelegate(), target, LinkController.LINK_ABSOLUTE);
+ }
+ }
+
+ // Link R/W
+ public void setFile(File file) {
+ if (!removeLinkIfNull(file)) {
+ getLinkController().setLink(getDelegate(), file.toURI(), LinkController.LINK_ABSOLUTE);
+ }
+ }
+
+ // Link R/W
+ public void setNode(Node node) {
+ if (!removeLinkIfNull(node)) {
+ if (getModeController().getMapController().getNodeFromID(node.getId()) == null) {
+ throw new IllegalArgumentException("target node " + node.toString() + " belongs to a different map");
+ }
+ setText("#" + node.getId());
+ }
+ }
+
+ // Link R/W
+ @Deprecated
+ public boolean set(final String target) {
+ try {
+ setText(target);
+ return true;
+ }
+ catch (RuntimeException e) {
+ LogUtils.warn(e);
+ return false;
+ }
+ }
+
+ private boolean removeLinkIfNull(Object target) {
+ if (target == null){
+ getLinkController().setLink(getDelegate(), (URI) null, LinkController.LINK_ABSOLUTE);
+ return true;
+ }
+ return false;
+ }
+
+ /** make <code>if (node.link) println "has link"</code> work. */
+ public boolean asBoolean() {
+ return getUri() != null;
+ }
+
+ @Override
+ public boolean remove() {
+ return removeLinkIfNull(null);
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/MapProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/MapProxy.java
new file mode 100644
index 0000000..13e4175
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/MapProxy.java
@@ -0,0 +1,196 @@
+package org.freeplane.plugin.script.proxy;
+
+import groovy.lang.Closure;
+
+import java.awt.Color;
+import java.io.File;
+import java.util.Map.Entry;
+
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.features.filter.Filter;
+import org.freeplane.features.filter.FilterController;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.styles.MapStyle;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.ui.IMapViewManager;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.plugin.script.proxy.Proxy.Map;
+import org.freeplane.plugin.script.proxy.Proxy.Node;
+
+public class MapProxy extends AbstractProxy<MapModel> implements Map {
+ public MapProxy(final MapModel map, final ScriptContext scriptContext) {
+ super(map, scriptContext);
+ }
+
+ // MapRO: R
+ public Node node(final String id) {
+ final NodeModel node = getDelegate().getNodeForID(id);
+ return node != null ? new NodeProxy(node, getScriptContext()) : null;
+ }
+
+ // MapRO: R
+ public Node getRoot() {
+ final NodeModel rootNode = getDelegate().getRootNode();
+ return new NodeProxy(rootNode, getScriptContext());
+ }
+
+ @Deprecated
+ public Node getRootNode() {
+ return getRoot();
+ }
+
+ // MapRO: R
+ public File getFile() {
+ return getDelegate().getFile();
+ }
+
+ // MapRO: R
+ public String getName() {
+ final IMapViewManager mapViewManager = getMapViewManager();
+ for (Entry<String, MapModel> map : mapViewManager.getMaps().entrySet()) {
+ if (map.getValue().equals(getDelegate()))
+ return map.getKey();
+ }
+ return null;
+ }
+
+ // MapRO: R
+ public boolean isSaved() {
+ return getDelegate().isSaved();
+ }
+
+ // MapRO: R
+ public Color getBackgroundColor() {
+ // see MapBackgroundColorAction
+ final MapStyle mapStyle = (MapStyle) Controller.getCurrentModeController().getExtension(MapStyle.class);
+ final MapStyleModel model = (MapStyleModel) mapStyle.getMapHook(getDelegate());
+ if (model != null) {
+ return model.getBackgroundColor();
+ }
+ else {
+ final String colorPropertyString = ResourceController.getResourceController().getProperty(
+ MapStyle.RESOURCES_BACKGROUND_COLOR);
+ final Color defaultBgColor = ColorUtils.stringToColor(colorPropertyString);
+ return defaultBgColor;
+ }
+ }
+
+ // MapRO: R
+ public String getBackgroundColorCode() {
+ return ColorUtils.colorToString(getBackgroundColor());
+ }
+
+ // Map: R/W
+ public boolean close(boolean force, boolean allowInteraction) {
+ if (!getDelegate().isSaved() && !force && !allowInteraction)
+ throw new RuntimeException("will not close an unsaved map without being told so");
+ final IMapViewManager mapViewManager = getMapViewManager();
+ changeToThisMap(mapViewManager);
+ return mapViewManager.close(force);
+ }
+
+ private void changeToThisMap(final IMapViewManager mapViewManager) {
+ String mapKey = findMapViewKey(mapViewManager);
+ if (mapKey == null)
+ throw new RuntimeException("map " + getDelegate() + " does not seem to be opened");
+ mapViewManager.changeToMapView(mapKey);
+ }
+
+ private IMapViewManager getMapViewManager() {
+ return getModeController().getController().getMapViewManager();
+ }
+
+ private String findMapViewKey(final IMapViewManager mapViewManager) {
+ for (Entry<String, MapModel> entry : mapViewManager.getMaps().entrySet()) {
+ if (entry.getValue().equals(getDelegate())) {
+ return entry.getKey();
+ }
+ }
+ return null;
+ }
+
+ // Map: R/W
+ public boolean save(boolean allowInteraction) {
+ if (!getDelegate().isSaved() && getDelegate().getURL() == null && !allowInteraction)
+ throw new RuntimeException("no url set for map " + getDelegate());
+ changeToThisMap(getMapViewManager());
+ return getModeController().save();
+ }
+
+ // Map: R/W
+ public void setName(final String title) {
+ changeToThisMap(getMapViewManager());
+ Controller.getCurrentController().getMapViewManager().getMapViewComponent().setName(title);
+ }
+
+ // Map: R/W
+ public void setSaved(final boolean isSaved) {
+ Controller.getCurrentModeController().getMapController().setSaved(getDelegate(), isSaved);
+ }
+
+ // Map: R/W
+ public void setBackgroundColor(Color color) {
+ final MapStyle mapStyle = (MapStyle) Controller.getCurrentModeController().getExtension(MapStyle.class);
+ final MapStyleModel model = (MapStyleModel) mapStyle.getMapHook(getDelegate());
+ mapStyle.setBackgroundColor(model, color);
+ }
+
+ // Map: R/W
+ public void setBackgroundColorCode(String rgbString) {
+ setBackgroundColor(ColorUtils.stringToColor(rgbString));
+ }
+
+ // Map: R/W
+ public void setFilter(final Closure<Boolean> closure) {
+ final FilterController filterController = FilterController.getCurrentFilterController();
+ if (closure == null) {
+ filterController.applyNoFiltering();
+ }
+ else {
+ final Filter filter = new Filter(ProxyUtils.createCondition(closure, getScriptContext()), false, false,
+ true);
+ filterController.applyFilter(filter, getDelegate(), true);
+ }
+ }
+
+ // Map: R/W
+ public void filter(final Closure<Boolean> closure) {
+ setFilter(closure);
+ }
+
+ // Map: R/W
+ public void setFilter(final boolean showAncestors, final boolean showDescendants, final Closure<Boolean> closure) {
+ final FilterController filterController = FilterController.getCurrentFilterController();
+ if (closure == null) {
+ filterController.applyNoFiltering();
+ }
+ else {
+ final Filter filter = new Filter(ProxyUtils.createCondition(closure, getScriptContext()), showAncestors,
+ showDescendants, true);
+ filterController.applyFilter(filter, getDelegate(), true);
+ }
+ }
+
+ // Map: R/W
+ public void filter(final boolean showAncestors, final boolean showDescendants, final Closure<Boolean> closure) {
+ setFilter(showAncestors, showDescendants, closure);
+ }
+
+ // Map: R/W
+ public void redoFilter() {
+ FilterController.getCurrentFilterController().redo();
+ }
+
+ // Map: R/W
+ public void undoFilter() {
+ FilterController.getCurrentFilterController().undo();
+ }
+
+ // Map: RO
+ public Proxy.Properties getStorage() {
+ return new PropertiesProxy(getDelegate(), getScriptContext());
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/NodeProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/NodeProxy.java
new file mode 100644
index 0000000..207bbe0
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/NodeProxy.java
@@ -0,0 +1,926 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.codehaus.groovy.runtime.DefaultGroovyMethods;
+import org.codehaus.groovy.runtime.typehandling.NumberMath;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.undo.IActor;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.LogUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.clipboard.ClipboardController;
+import org.freeplane.features.clipboard.mindmapmode.MClipboardController;
+import org.freeplane.features.encrypt.Base64Coding;
+import org.freeplane.features.encrypt.EncryptionController;
+import org.freeplane.features.encrypt.PasswordStrategy;
+import org.freeplane.features.encrypt.mindmapmode.MEncryptionController;
+import org.freeplane.features.filter.condition.ICondition;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.link.ConnectorModel;
+import org.freeplane.features.link.LinkController;
+import org.freeplane.features.link.mindmapmode.MLinkController;
+import org.freeplane.features.map.EncryptionModel;
+import org.freeplane.features.map.FreeNode;
+import org.freeplane.features.map.MapController.Direction;
+import org.freeplane.features.map.MapModel;
+import org.freeplane.features.map.MapNavigationUtils;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.map.mindmapmode.MMapController;
+import org.freeplane.features.mode.Controller;
+import org.freeplane.features.nodelocation.LocationController;
+import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.features.note.NoteController;
+import org.freeplane.features.note.NoteModel;
+import org.freeplane.features.note.mindmapmode.MNoteController;
+import org.freeplane.features.text.DetailTextModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.features.ui.ViewController;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.plugin.script.proxy.Proxy.Attributes;
+import org.freeplane.plugin.script.proxy.Proxy.Cloud;
+import org.freeplane.plugin.script.proxy.Proxy.Node;
+import org.freeplane.plugin.script.proxy.Proxy.NodeRO;
+import org.freeplane.plugin.script.proxy.Proxy.Reminder;
+
+import groovy.lang.Closure;
+
+class NodeProxy extends AbstractProxy<NodeModel> implements Node {
+ private static final Integer ONE = 1;
+ private static final Integer ZERO = 0;
+
+ public NodeProxy(final NodeModel node, final ScriptContext scriptContext) {
+ super(node, scriptContext);
+ if (scriptContext != null)
+ scriptContext.accessNode(node);
+ }
+
+ // Node: R/W
+ public Proxy.Connector addConnectorTo(final Proxy.Node target) {
+ return addConnectorTo(target.getId());
+ }
+
+ // Node: R/W
+ public Proxy.Connector addConnectorTo(final String targetNodeID) {
+ final MLinkController linkController = (MLinkController) LinkController.getController();
+ final ConnectorModel connectorModel = linkController.addConnector(getDelegate(), targetNodeID);
+ return new ConnectorProxy(connectorModel, getScriptContext());
+ }
+
+ // Node: R/W
+ public Proxy.Node createChild() {
+ final NodeModel newNodeModel = new NodeModel(getDelegate().getMap());
+ getMapController().insertNode(newNodeModel, getDelegate());
+ return new NodeProxy(newNodeModel, getScriptContext());
+ }
+
+ private MMapController getMapController() {
+ return (MMapController) getModeController().getMapController();
+ }
+
+ // Node: R/W
+ public Proxy.Node createChild(final Object value) {
+ final Node child = createChild();
+ child.setObject(value);
+ return child;
+ }
+
+ // Node: R/W
+ public Proxy.Node createChild(final int position) {
+ final NodeModel newNodeModel = new NodeModel(getDelegate().getMap());
+ getMapController().insertNode(newNodeModel, getDelegate(), position);
+ return new NodeProxy(newNodeModel, getScriptContext());
+ }
+
+ // Node: R/W
+ public Proxy.Node appendChild(Proxy.NodeRO node) {
+ return appendBranchImpl(node, false);
+ }
+
+ // Node: R/W
+ public Proxy.Node appendBranch(Proxy.NodeRO node) {
+ return appendBranchImpl(node, true);
+ }
+
+ private Proxy.Node appendBranchImpl(Proxy.NodeRO node, boolean withChildren) {
+ final MClipboardController clipboardController = (MClipboardController) ClipboardController.getController();
+ final NodeModel newNodeModel = clipboardController.duplicate(((NodeProxy) node).getDelegate(), withChildren);
+ getMapController().insertNode(newNodeModel, getDelegate());
+ return new NodeProxy(newNodeModel, getScriptContext());
+ }
+
+ // Node: R/W
+ public void delete() {
+ getMapController().deleteNode(getDelegate());
+ }
+
+ // NodeRO: R
+ public Proxy.Attributes getAttributes() {
+ return new AttributesProxy(getDelegate(), getScriptContext());
+ }
+
+ // NodeRO: R
+ public Convertible getAt(final String attributeName) {
+ final Object value = getAttributes().getFirst(attributeName);
+ return ProxyUtils.attributeValueToConvertible(getDelegate(), getScriptContext(), value);
+ }
+
+ // Node: R/W
+ public Object putAt(final String attributeName, final Object value) {
+ final Attributes attributes = getAttributes();
+ if (value == null) {
+ final int index = attributes.findFirst(attributeName);
+ if (index != -1)
+ attributes.remove(index);
+ // else: ignore request
+ }
+ else {
+ attributes.set(attributeName, value);
+ }
+ return value;
+ }
+
+ // Node: R/W
+ public void setAttributes(Map<String, Object> attributeMap) {
+ final Attributes attributes = getAttributes();
+ attributes.clear();
+ for (Entry<String, Object> entry : attributeMap.entrySet()) {
+ attributes.set(entry.getKey(), entry.getValue());
+ }
+ }
+
+ // Node: R/W
+ public void setDetails(Object details) {
+ setDetailsText(convertConvertibleToHtml(details));
+ }
+
+ // Node: R/W
+ public void setDetailsText(String html) {
+ final MTextController textController = (MTextController) TextController.getController();
+ if (html == null) {
+ textController.setDetailsHidden(getDelegate(), false);
+ textController.setDetails(getDelegate(), null);
+ }
+ else{
+ textController.setDetails(getDelegate(), html);
+ }
+ }
+
+ // Node: R/W
+ public void setHideDetails(boolean hide) {
+ MTextController controller = (MTextController) MTextController.getController();
+ controller.setDetailsHidden(getDelegate(), hide);
+ }
+
+ // NodeRO: R
+ public int getChildPosition(final Proxy.Node childNode) {
+ final NodeModel childNodeModel = ((NodeProxy) childNode).getDelegate();
+ return getDelegate().getIndex(childNodeModel);
+ }
+
+ // NodeRO: R
+ public List<Proxy.Node> getChildren() {
+ return ProxyUtils.createListOfChildren(getDelegate(), getScriptContext());
+ }
+
+ // NodeRO: R
+ public Cloud getCloud() {
+ return new CloudProxy(this);
+ }
+
+ // NodeRO: R
+ public Collection<Proxy.Connector> getConnectorsIn() {
+ return new ConnectorInListProxy(this);
+ }
+
+ // NodeRO: R
+ public Collection<Proxy.Connector> getConnectorsOut() {
+ return new ConnectorOutListProxy(this);
+ }
+
+ // NodeRO: R
+ public Convertible getDetails() {
+ final String detailsText = DetailTextModel.getDetailTextText(getDelegate());
+ return (detailsText == null) ? null : new ConvertibleHtmlText(getDelegate(), getScriptContext(), detailsText);
+ }
+
+ // NodeRO: R
+ public String getDetailsText() {
+ return DetailTextModel.getDetailTextText(getDelegate());
+ }
+
+ // NodeRO: R
+ public boolean getHideDetails() {
+ final DetailTextModel detailText = DetailTextModel.getDetailText(getDelegate());
+ return detailText != null && detailText.isHidden();
+ }
+
+ // NodeRO: R
+ public Proxy.ExternalObject getExternalObject() {
+ return new ExternalObjectProxy(getDelegate(), getScriptContext());
+ }
+
+ // NodeRO: R
+ public Proxy.Icons getIcons() {
+ return new IconsProxy(getDelegate(), getScriptContext());
+ }
+
+ // NodeRO: R
+ public Proxy.Link getLink() {
+ return new LinkProxy(getDelegate(), getScriptContext());
+ }
+
+ // NodeRO: R
+ public Reminder getReminder() {
+ return new ReminderProxy(getDelegate(), getScriptContext());
+ }
+
+ // NodeRO: R
+ public String getId() {
+ return getDelegate().createID();
+ }
+
+ // NodeRO: R
+ @Deprecated
+ public String getNodeID() {
+ return getId();
+ }
+
+ // NodeRO: R
+ public int getNodeLevel(final boolean countHidden) {
+ return getDelegate().getNodeLevel(countHidden);
+ }
+
+ // NodeRO: R
+ public String getPlainNote() {
+ final String noteText = NoteModel.getNoteText(getDelegate());
+ return noteText == null ? null : HtmlUtils.htmlToPlain(noteText);
+ }
+
+ // NodeRO: R
+ public String getNoteText() {
+ return NoteModel.getNoteText(getDelegate());
+ }
+
+ // NodeRO: R
+ public Convertible getNote() {
+ final String noteText = getNoteText();
+ return (noteText == null) ? null : new ConvertibleNoteText(getDelegate(), getScriptContext(), noteText);
+ }
+
+ // NodeRO: R
+ public Proxy.Node getParent() {
+ final NodeModel parentNode = getDelegate().getParentNode();
+ return parentNode != null ? new NodeProxy(parentNode, getScriptContext()) : null;
+ }
+
+ // NodeRO: R
+ @Deprecated
+ public Proxy.Node getParentNode() {
+ return getParent();
+ }
+
+ // NodeRO: R
+ public List<Node> getPathToRoot() {
+ return ProxyUtils.createNodeList(Arrays.asList(getDelegate().getPathToRoot()), getScriptContext());
+ }
+
+ // NodeRO: R
+ public Node getNext() {
+ final NodeModel node = MapNavigationUtils.findNext(Direction.FORWARD, getDelegate(), null);
+ return node == null ? null : new NodeProxy(node, getScriptContext());
+ }
+
+ // NodeRO: R
+ public Node getPrevious() {
+ final NodeModel node = MapNavigationUtils.findPrevious(Direction.BACK, getDelegate(), null);
+ return node == null ? null : new NodeProxy(node, getScriptContext());
+ }
+
+ // NodeRO: R
+ public String getPlainText() {
+ return HtmlUtils.htmlToPlain(getDelegate().getText());
+ }
+
+ // NodeRO: R
+ @Deprecated
+ public String getPlainTextContent() {
+ return getPlainText();
+ }
+
+ // NodeRO: R
+ public String getHtmlText() {
+ final String nodeText = getDelegate().getText();
+ if (HtmlUtils.isHtmlNode(nodeText))
+ return nodeText;
+ else
+ return HtmlUtils.plainToHTML(nodeText);
+ }
+
+ // NodeRO: R
+ public Proxy.NodeStyle getStyle() {
+ return new NodeStyleProxy(getDelegate(), getScriptContext());
+ }
+
+ // NodeRO: R
+ public boolean hasStyle(String styleName) {
+ return NodeStyleProxy.hasStyle(getDelegate(), styleName);
+ }
+
+ // NodeRO: R
+ public String getText() {
+ return getDelegate().getText();
+ }
+
+ // NodeRO: R
+ public String getTransformedText() {
+ final TextController textController = TextController.getController();
+ return textController.getTransformedTextNoThrow(getDelegate());
+ }
+
+ // NodeRO: R
+ public String getShortText() {
+ final TextController textController = TextController.getController();
+ return textController.getShortPlainText(getDelegate());
+ }
+
+ // NodeRO: R
+ public String getDisplayedText(){
+ if(isMinimized())
+ return getShortText();
+ else
+ return getTransformedText();
+ }
+
+ // NodeRO: R
+ public boolean isMinimized(){
+ final TextController textController = TextController.getController();
+ return textController.isMinimized(getDelegate());
+ }
+
+ // NodeRO: R
+ public Object getObject() {
+ final Object userObject = getDelegate().getUserObject();
+ if (userObject instanceof IFormattedObject)
+ return ((IFormattedObject) userObject).getObject();
+ return userObject;
+ }
+
+ // NodeRO: R
+ public byte[] getBinary() {
+ return Base64Coding.decode64(getDelegate().getText().replaceAll("\\s", ""));
+ }
+
+ // NodeRO: R
+ public String getFormat() {
+ final NodeModel nodeModel = getDelegate();
+ final String format = TextController.getController().getNodeFormat(nodeModel);
+ if (format == null && nodeModel.getUserObject() instanceof IFormattedObject)
+ return ((IFormattedObject) nodeModel.getUserObject()).getPattern();
+ return format;
+ }
+
+ // NodeRO: R
+ public Convertible getTo() {
+ return ProxyUtils.nodeModelToConvertible(getDelegate(), getScriptContext());
+ }
+
+ // NodeRO: R
+ public Convertible getValue() {
+ return getTo();
+ }
+
+ // NodeRO: R
+ public boolean isDescendantOf(final Proxy.Node otherNode) {
+ // no need to trace this since it's already logged
+ final NodeModel otherNodeModel = ((NodeProxy) otherNode).getDelegate();
+ NodeModel node = this.getDelegate();
+ do {
+ if (node.equals(otherNodeModel)) {
+ return true;
+ }
+ node = node.getParentNode();
+ } while (node != null);
+ return false;
+ }
+
+ // NodeRO: R
+ public boolean isFolded() {
+ return getDelegate().isFolded();
+ }
+
+ // NodeRO: R
+ public boolean isFree() {
+ final FreeNode freeNode = Controller.getCurrentModeController().getExtension(FreeNode.class);
+ return freeNode.isActive(getDelegate());
+ }
+
+ // NodeRO: R
+ public boolean isLeaf() {
+ return getDelegate().isLeaf();
+ }
+
+ // NodeRO: R
+ public boolean isLeft() {
+ return getDelegate().isLeft();
+ }
+
+ // NodeRO: R
+ public boolean isRoot() {
+ return getDelegate().isRoot();
+ }
+
+ // NodeRO: R
+ public boolean isVisible() {
+ return getDelegate().hasVisibleContent();
+ }
+
+ // Node: R/W
+ public void moveTo(final Proxy.Node parentNodeProxy) {
+ final NodeModel parentNode = ((NodeProxy) parentNodeProxy).getDelegate();
+ final NodeModel movedNode = getDelegate();
+ boolean oldSide = movedNode.isLeft();
+ boolean newSide = parentNode.isRoot() ? oldSide : parentNode.isLeft();
+ getMapController().moveNodesAsChildren(Arrays.asList(movedNode), parentNode, newSide, newSide != oldSide);
+ }
+
+ // Node: R/W
+ public void moveTo(final Proxy.Node parentNodeProxy, final int position) {
+ final NodeModel parentNode = ((NodeProxy) parentNodeProxy).getDelegate();
+ final NodeModel movedNode = getDelegate();
+ ((FreeNode)Controller.getCurrentModeController().getExtension(FreeNode.class)).undoableDeactivateHook(movedNode);
+ boolean oldSide = movedNode.isLeft();
+ boolean newSide = parentNode.isRoot() ? oldSide : parentNode.isLeft();
+ getMapController().moveNodes(Arrays.asList(movedNode), parentNode, position, newSide, newSide != oldSide);
+ }
+
+ // Node: R/W
+ public void removeConnector(final Proxy.Connector connectorToBeRemoved) {
+ final ConnectorProxy connectorProxy = (ConnectorProxy) connectorToBeRemoved;
+ final ConnectorModel link = connectorProxy.getConnector();
+ final MLinkController linkController = (MLinkController) LinkController.getController();
+ linkController.removeArrowLink(link);
+ }
+
+ // Node: R/W
+ public void setFolded(final boolean folded) {
+ getMapController().setFolded(getDelegate(), folded);
+ }
+
+ // Node: R/W
+ public void setFree(boolean free) {
+ final FreeNode freeNode = Controller.getCurrentModeController().getExtension(FreeNode.class);
+ if (free != freeNode.isActive(getDelegate()))
+ freeNode.undoableToggleHook(getDelegate());
+ }
+
+ // Node: R/W
+ public void setMinimized(boolean shortened){
+ final MTextController textController = (MTextController) TextController.getController();
+ textController.setIsMinimized(getDelegate(), shortened);
+ }
+
+ // Node: R/W
+ public void setNote(Object value) {
+ final MNoteController noteController = (MNoteController) NoteController.getController();
+ noteController.setNoteText(getDelegate(), convertConvertibleToHtml(value));
+ }
+
+ private String convertConvertibleToHtml(Object value) {
+ if (value == null)
+ return null;
+ final String text = Convertible.toString(value);
+ // the text content of a Convertible object might be null
+ if (text == null)
+ return null;
+ return HtmlUtils.isHtmlNode(text) ? text : HtmlUtils.plainToHTML(text);
+ }
+
+ // Node: R/W
+ public void setNoteText(final String html) {
+ final MNoteController noteController = (MNoteController) NoteController.getController();
+ noteController.setNoteText(getDelegate(), html);
+ }
+
+ // Node: R/W
+ public void setText(final Object value) {
+ if (value instanceof String) {
+ final MTextController textController = (MTextController) TextController.getController();
+ textController.setNodeText(getDelegate(), (String) value);
+ }
+ else {
+ setObject(value);
+ }
+ }
+
+ // Node: R/W
+ public void setObject(final Object object) {
+ final MTextController textController = (MTextController) TextController.getController();
+ textController.setNodeObject(getDelegate(), ProxyUtils.transformObject(object, null));
+ }
+
+ // Node: R/W
+ public void setDateTime(final Date date) {
+ final MTextController textController = (MTextController) TextController.getController();
+ textController.setNodeObject(getDelegate(), ProxyUtils.createDefaultFormattedDateTime(date));
+ }
+
+ // Node: R/W
+ public void setBinary(final byte[] data) {
+ setObject(Base64Coding.encode64(data).replaceAll("(.{74})", "$1\n"));
+ }
+
+ public void setFormat(final String format) {
+ final MNodeStyleController styleController = (MNodeStyleController) Controller.getCurrentModeController()
+ .getExtension(NodeStyleController.class);
+ styleController.setNodeFormat(getDelegate(), format);
+ }
+
+ public void setLeft(final boolean isLeft) {
+ getDelegate().setLeft(isLeft);
+ }
+
+ // NodeRO: R
+ public Proxy.Map getMap() {
+ final MapModel map = getDelegate().getMap();
+ return map != null ? new MapProxy(map, getScriptContext()) : null;
+ }
+
+ // NodeRO: R
+ @Deprecated
+ public List<Node> find(final ICondition condition) {
+ final NodeModel delegate = getDelegate();
+ if (getScriptContext() != null)
+ getScriptContext().accessBranch(delegate);
+ return ProxyUtils.find(condition, delegate, getScriptContext());
+ }
+
+ // NodeRO: R
+ public List<Node> find(final Closure<Boolean> closure) {
+ final NodeModel delegate = getDelegate();
+ if (getScriptContext() != null)
+ getScriptContext().accessBranch(delegate);
+ return ProxyUtils.find(closure, delegate, getScriptContext());
+ }
+
+ // NodeRO: R
+ public List<Node> findAll() {
+ final NodeModel delegate = getDelegate();
+ if (getScriptContext() != null)
+ getScriptContext().accessBranch(delegate);
+ return ProxyUtils.findAll(delegate, getScriptContext(), true);
+ }
+
+ // NodeRO: R
+ public List<Node> findAllDepthFirst() {
+ final NodeModel delegate = getDelegate();
+ if (getScriptContext() != null)
+ getScriptContext().accessBranch(delegate);
+ return ProxyUtils.findAll(delegate, getScriptContext(), false);
+ }
+
+ // NodeRO: R
+ public Date getLastModifiedAt() {
+ return getDelegate().getHistoryInformation().getLastModifiedAt();
+ }
+
+ // Node: R/W
+ public void setLastModifiedAt(final Date date) {
+ final Date oldDate = getDelegate().getHistoryInformation().getLastModifiedAt();
+ final IActor actor = new IActor() {
+ public void act() {
+ getDelegate().getHistoryInformation().setLastModifiedAt(date);
+ }
+
+ public String getDescription() {
+ return "setLastModifiedAt";
+ }
+
+ public void undo() {
+ getDelegate().getHistoryInformation().setLastModifiedAt(oldDate);
+ }
+ };
+ getModeController().execute(actor, getDelegate().getMap());
+ }
+
+ // NodeRO: R
+ public Date getCreatedAt() {
+ return getDelegate().getHistoryInformation().getCreatedAt();
+ }
+
+ // Node: R/W
+ public void setCreatedAt(final Date date) {
+ final Date oldDate = getDelegate().getHistoryInformation().getCreatedAt();
+ final IActor actor = new IActor() {
+ public void act() {
+ getDelegate().getHistoryInformation().setCreatedAt(date);
+ }
+
+ public String getDescription() {
+ return "setCreatedAt";
+ }
+
+ public void undo() {
+ getDelegate().getHistoryInformation().setCreatedAt(oldDate);
+ }
+ };
+ getModeController().execute(actor, getDelegate().getMap());
+ }
+
+ //
+ // Node arithmetics for
+ // Node <operator> Number
+ // Node <operator> Node
+ // See NodeArithmeticsCategory for
+ // Number <operator> Node
+ //
+ public Number and(final Number number) {
+ return NumberMath.and(this.getTo().getNum0(), number);
+ }
+
+ public Number and(final Proxy.Node node) {
+ return NumberMath.and(this.getTo().getNum0(), node.getTo().getNum0());
+ }
+
+ public Number div(final Number number) {
+ return NumberMath.divide(this.getTo().getNum0(), number);
+ }
+
+ public Number div(final Proxy.Node node) {
+ return NumberMath.divide(this.getTo().getNum0(), node.getTo().getNum0());
+ }
+
+ public Number minus(final Number number) {
+ return NumberMath.subtract(this.getTo().getNum0(), number);
+ }
+
+ public Number minus(final Proxy.Node node) {
+ return NumberMath.subtract(this.getTo().getNum0(), node.getTo().getNum0());
+ }
+
+ public Number mod(final Number number) {
+ return NumberMath.mod(this.getTo().getNum0(), number);
+ }
+
+ public Number mod(final Proxy.Node node) {
+ return NumberMath.mod(this.getTo().getNum0(), node.getTo().getNum0());
+ }
+
+ public Number multiply(final Number number) {
+ return NumberMath.multiply(this.getTo().getNum0(), number);
+ }
+
+ public Number multiply(final Proxy.Node node) {
+ return NumberMath.multiply(this.getTo().getNum0(), node.getTo().getNum0());
+ }
+
+ public Number or(final Number number) {
+ return NumberMath.or(this.getTo().getNum0(), number);
+ }
+
+ public Number or(final Proxy.Node node) {
+ return NumberMath.or(this.getTo().getNum0(), node.getTo().getNum0());
+ }
+
+ public Number plus(final Number number) {
+ return NumberMath.add(this.getTo().getNum0(), number);
+ }
+
+ public Number plus(final Proxy.Node node) {
+ return NumberMath.add(this.getTo().getNum0(), node.getTo().getNum0());
+ }
+
+ public Number power(final Number number) {
+ return DefaultGroovyMethods.power(this.getTo().getNum0(), number);
+ }
+
+ public Number power(final Proxy.Node node) {
+ return DefaultGroovyMethods.power(this.getTo().getNum0(), node.getTo().getNum0());
+ }
+
+ public Number xor(final Number number) {
+ return NumberMath.xor(this.getTo().getNum0(), number);
+ }
+
+ public Number xor(final Proxy.Node node) {
+ return NumberMath.xor(this.getTo().getNum0(), node.getTo().getNum0());
+ }
+
+ public Number negative() {
+ return NumberMath.subtract(ZERO, this.getTo().getNum0());
+ }
+
+ public Number next() {
+ return NumberMath.add(this.getTo().getNum0(), ONE);
+ }
+
+ public Number positive() {
+ return this.getTo().getNum0();
+ }
+
+ public Number previous() {
+ return NumberMath.subtract(this.getTo().getNum0(), ONE);
+ }
+
+ public boolean hasEncryption() {
+ return getEncryptionModel() != null;
+ }
+
+ public boolean isEncrypted() {
+ final EncryptionModel encryptionModel = getEncryptionModel();
+ return encryptionModel != null && !encryptionModel.isAccessible();
+ }
+
+ public void encrypt(String password) {
+ if (!isEncrypted())
+ getEncryptionController().toggleCryptState(getDelegate(), makePasswordStrategy(password));
+ }
+
+ public void decrypt(String password) {
+ if (isEncrypted())
+ getEncryptionController().toggleCryptState(getDelegate(), makePasswordStrategy(password));
+ }
+
+ public void removeEncryption(String password) {
+ getEncryptionController().removeEncryption(getDelegate(), makePasswordStrategy(password));
+ }
+
+ private PasswordStrategy makePasswordStrategy(final String password) {
+ return new PasswordStrategy() {
+ public StringBuilder getPassword() {
+ return new StringBuilder(password);
+ }
+
+ public StringBuilder getPasswordWithConfirmation() {
+ return getPassword();
+ }
+
+ public void onWrongPassword() {
+ LogUtils.info("wrong password for node " + getDelegate());
+ setStatusInfo(TextUtils.getText("accessories/plugins/EncryptNode.properties_wrong_password"));
+ }
+
+ public boolean isCancelled() {
+ return false;
+ }
+ };
+ }
+
+ private void setStatusInfo(String text) {
+ final ViewController viewController = Controller.getCurrentController().getViewController();
+ viewController.out(text);
+ }
+
+ private MEncryptionController getEncryptionController() {
+ return (MEncryptionController) Controller.getCurrentModeController().getExtension(EncryptionController.class);
+ }
+
+ private EncryptionModel getEncryptionModel() {
+ return EncryptionModel.getModel(getDelegate());
+ }
+
+
+ public int getHorizontalShift(){
+ return LocationController.getController().getHorizontalShift(getDelegate()).toBaseUnitsRounded();
+ }
+
+ public int getVerticalShift(){
+ return LocationController.getController().getVerticalShift(getDelegate()).toBaseUnitsRounded();
+ }
+
+ public void setHorizontalShift(final int horizontalShift){
+ final Quantity<LengthUnits> horizontalShiftQuantity = new Quantity<LengthUnits>(horizontalShift, LengthUnits.px);
+ ((MLocationController) LocationController.getController()).setHorizontalShift(getDelegate(),horizontalShiftQuantity);
+ }
+
+ public void setHorizontalShift(Quantity<LengthUnits> verticalShift) {
+ ((MLocationController) LocationController.getController()).setHorizontalShift(getDelegate(), verticalShift);
+ }
+
+ public void setHorizontalShift(String verticalShift) {
+ ((MLocationController) LocationController.getController()).setHorizontalShift(getDelegate(), Quantity.fromString(verticalShift, LengthUnits.px));
+ }
+
+ public void setVerticalShift(final int verticalShift){
+ final Quantity<LengthUnits> verticalShiftQuantity = new Quantity<LengthUnits>(verticalShift, LengthUnits.px);
+ ((MLocationController) LocationController.getController()).setVerticalShift(getDelegate(), verticalShiftQuantity);
+ }
+
+ public void setVerticalShift(Quantity<LengthUnits> verticalShift) {
+ ((MLocationController) LocationController.getController()).setVerticalShift(getDelegate(), verticalShift);
+ }
+
+ public void setVerticalShift(String verticalShift) {
+ ((MLocationController) LocationController.getController()).setVerticalShift(getDelegate(), Quantity.fromString(verticalShift, LengthUnits.px));
+ }
+
+ public int getMinimalDistanceBetweenChildren(){
+ return LocationController.getController().getMinimalDistanceBetweenChildren(getDelegate()).toBaseUnitsRounded();
+ }
+
+ public void setMinimalDistanceBetweenChildren(final int minimalDistanceBetweenChildren){
+ final Quantity<LengthUnits> minimalDistanceBetweenChildrenQuantity = new Quantity<LengthUnits>(minimalDistanceBetweenChildren, LengthUnits.px);
+ ((MLocationController) LocationController.getController()).setMinimalDistanceBetweenChildren(getDelegate(), minimalDistanceBetweenChildrenQuantity);
+ }
+
+ public void setMinimalDistanceBetweenChildren(Quantity<LengthUnits> minimalDistanceBetweenChildren) {
+ ((MLocationController) LocationController.getController()).setMinimalDistanceBetweenChildren(getDelegate(), minimalDistanceBetweenChildren);
+ }
+
+ public void setMinimalDistanceBetweenChildren(String minimalDistanceBetweenChildren) {
+ ((MLocationController) LocationController.getController()).setMinimalDistanceBetweenChildren(getDelegate(), Quantity.fromString(minimalDistanceBetweenChildren, LengthUnits.px));
+ }
+
+ @Override
+ public void sortChildrenBy(Closure<Comparable<Object>> closure) {
+ getScriptContext().accessNode(getDelegate());
+ NodeModel node = getDelegate();
+ final ArrayList<NodeModel> children = new ArrayList<NodeModel>(node.getChildren());
+ Collections.sort(children, comparatorByClosureResult(closure));
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ int i = 0;
+ for (final NodeModel child : children) {
+ ((FreeNode) Controller.getCurrentModeController().getExtension(FreeNode.class))
+ .undoableDeactivateHook(child);
+ mapController.moveNode(child, i++);
+ }
+ }
+
+ private Comparator<NodeModel> comparatorByClosureResult(final Closure<Comparable<Object>> closure) {
+ return new Comparator<NodeModel>() {
+ public int compare(NodeModel o1, NodeModel o2) {
+ return closure.call(o1).compareTo(closure.call(o2));
+ }
+ };
+ }
+
+ @Override
+ public int getCountNodesSharingContent() {
+ return getDelegate().allClones().size() - 1;
+ }
+
+ @Override
+ public int getCountNodesSharingContentAndSubtree() {
+ return getDelegate().subtreeClones().size() - 1;
+ }
+
+ @Override
+ public List<Node> getNodesSharingContent() {
+ final ArrayList<NodeModel> nodeModels = new ArrayList<NodeModel>(getDelegate().allClones().toCollection());
+ nodeModels.remove(getDelegate());
+ return ProxyUtils.createNodeList(nodeModels, getScriptContext());
+ }
+
+ @Override
+ public List<Node> getNodesSharingContentAndSubtree() {
+ final ArrayList<NodeModel> nodeModels = new ArrayList<NodeModel>(getDelegate().subtreeClones().toCollection());
+ nodeModels.remove(getDelegate());
+ return ProxyUtils.createNodeList(nodeModels, getScriptContext());
+ }
+
+ @Override
+ public Node appendAsCloneWithSubtree(NodeRO toBeCloned) {
+ return appendAsCloneImpl(((NodeProxy) toBeCloned).getDelegate(), true);
+ }
+
+ @Override
+ public Node appendAsCloneWithoutSubtree(NodeRO toBeCloned) {
+ return appendAsCloneImpl(((NodeProxy) toBeCloned).getDelegate(), false);
+ }
+
+ private Node appendAsCloneImpl(NodeModel toBeCloned, boolean withSubtree) {
+ final NodeModel target = getDelegate();
+ final MMapController mapController = (MMapController) Controller.getCurrentModeController().getMapController();
+ if (toBeCloned.getParentNode() == null || toBeCloned.isRoot())
+ throw new IllegalArgumentException("can't clone root node or node without parent");
+ if (!toBeCloned.getMap().equals(getDelegate().getMap()))
+ throw new IllegalArgumentException("can't clone a node from another map");
+ if (toBeCloned.subtreeContainsCloneOf(target))
+ throw new IllegalArgumentException("can't clone a node which has this node as child");
+ final NodeModel clone = withSubtree ? toBeCloned.cloneTree() : toBeCloned.cloneContent();
+ mapController.addNewNode(clone, target, target.getChildCount(), target.isNewChildLeft());
+ return new NodeProxy(clone, getScriptContext());
+ }
+
+ @Override
+ public void pasteAsClone() {
+ final MClipboardController clipboardController = (MClipboardController) ClipboardController
+ .getController();
+ clipboardController.addClone(clipboardController.getClipboardContents(), getDelegate());
+ }
+}
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/NodeStyleProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/NodeStyleProxy.java
new file mode 100644
index 0000000..4388122
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/NodeStyleProxy.java
@@ -0,0 +1,216 @@
+/**
+ *
+ */
+package org.freeplane.plugin.script.proxy;
+
+import java.awt.Color;
+import java.util.Collection;
+import java.util.Set;
+
+import org.freeplane.core.resources.TranslatedObject;
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.ColorUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.nodestyle.NodeStyleController;
+import org.freeplane.features.nodestyle.NodeStyleModel;
+import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.features.styles.LogicalStyleController;
+import org.freeplane.features.styles.LogicalStyleModel;
+import org.freeplane.features.styles.MapStyleModel;
+import org.freeplane.features.styles.StyleFactory;
+import org.freeplane.features.styles.StyleTranslatedObject;
+import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.plugin.script.proxy.Proxy.Node;
+
+class NodeStyleProxy extends AbstractProxy<NodeModel> implements Proxy.NodeStyle {
+ NodeStyleProxy(final NodeModel delegate, final ScriptContext scriptContext) {
+ super(delegate, scriptContext);
+ }
+
+ public IStyle getStyle() {
+ return LogicalStyleModel.getStyle(getDelegate());
+ }
+
+ public String getName() {
+ final IStyle style = getStyle();
+ return style == null ? null : StyleTranslatedObject.toKeyString(style);
+ }
+
+ public Node getStyleNode() {
+ final NodeModel styleNode = MapStyleModel.getExtension(getDelegate().getMap()).getStyleNode(getStyle());
+ return new NodeProxy(styleNode, getScriptContext());
+ }
+
+ public Color getBackgroundColor() {
+ return getStyleController().getBackgroundColor(getDelegate());
+ }
+
+ public String getBackgroundColorCode() {
+ return ColorUtils.colorToString(getBackgroundColor());
+ }
+
+ public Proxy.Edge getEdge() {
+ return new EdgeProxy(getDelegate(), getScriptContext());
+ }
+
+ public Proxy.Font getFont() {
+ return new FontProxy(getDelegate(), getScriptContext());
+ }
+
+ public Color getTextColor() {
+ return getStyleController().getColor(getDelegate());
+ }
+
+ @Deprecated
+ public Color getNodeTextColor() {
+ return getTextColor();
+ }
+
+ public String getTextColorCode() {
+ return ColorUtils.colorToString(getTextColor());
+ }
+
+ public boolean isFloating() {
+ return hasStyle(getDelegate(), StyleTranslatedObject.toKeyString(MapStyleModel.FLOATING_STYLE));
+ }
+
+ public int getMinNodeWidth() {
+ return getMinNodeWidthQuantity().toBaseUnitsRounded();
+ }
+
+ public Quantity<LengthUnits> getMinNodeWidthQuantity() {
+ return getStyleController().getMinWidth(getDelegate());
+ }
+
+ public int getMaxNodeWidth() {
+ return getMaxNodeWidthQuantity().toBaseUnitsRounded();
+ }
+
+ public Quantity<LengthUnits> getMaxNodeWidthQuantity() {
+ return getStyleController().getMaxWidth(getDelegate());
+ }
+
+ private MLogicalStyleController getLogicalStyleController() {
+ return (MLogicalStyleController) LogicalStyleController.getController();
+ }
+
+ private MNodeStyleController getStyleController() {
+ return (MNodeStyleController) NodeStyleController.getController();
+ }
+
+ public void setStyle(final IStyle key) {
+ getLogicalStyleController().setStyle(getDelegate(), key);
+ }
+
+ public void setName(String styleName) {
+ if (styleName == null) {
+ setStyle(null);
+ }
+ else {
+ final MapStyleModel mapStyleModel = MapStyleModel.getExtension(getDelegate().getMap());
+ // actually styles is a HashSet so lookup is fast
+ final Set<IStyle> styles = mapStyleModel.getStyles();
+ // search for user defined styles
+ final IStyle styleString = StyleFactory.create(styleName);
+ if (styles.contains(styleString)) {
+ setStyle(styleString);
+ return;
+ }
+ // search for predefined styles by key
+ final IStyle styleNamedObject = StyleFactory.create(new TranslatedObject(styleName));
+ if (styles.contains(styleNamedObject)) {
+ setStyle(styleNamedObject);
+ return;
+ }
+ // search for predefined styles by their translated name (style.toString())
+ for (IStyle style : styles) {
+ if (style.toString().equals(styleName)) {
+ setStyle(style);
+ return;
+ }
+ }
+ throw new IllegalArgumentException("style '" + styleName + "' not found");
+ }
+ }
+
+ public void setBackgroundColor(final Color color) {
+ getStyleController().setBackgroundColor(getDelegate(), color);
+ }
+
+ public void setBackgroundColorCode(final String rgbString) {
+ setBackgroundColor(ColorUtils.stringToColor(rgbString));
+ }
+
+ public void setTextColor(final Color color) {
+ getStyleController().setColor(getDelegate(), color);
+ }
+
+ @Deprecated
+ public void setNodeTextColor(final Color color) {
+ setTextColor(color);
+ }
+
+ public void setTextColorCode(final String rgbString) {
+ setTextColor(ColorUtils.stringToColor(rgbString));
+ }
+
+ public void setFloating(boolean floating) {
+ if (floating) {
+ setStyle(MapStyleModel.FLOATING_STYLE);
+ }
+ else if (MapStyleModel.FLOATING_STYLE.equals(getStyle())) {
+ setStyle(null);
+ }
+ }
+
+ public static boolean hasStyle(NodeModel nodeModel, String styleName) {
+ final Collection<IStyle> styles = LogicalStyleController.getController().getStyles(nodeModel);
+ for (IStyle style : styles) {
+ if (StyleTranslatedObject.toKeyString(style).equals(styleName))
+ return true;
+ }
+ return false;
+ }
+
+ public void setMinNodeWidth(int width) {
+ Quantity<LengthUnits> quantity = inPixels(width);
+ setMinNodeWidth(quantity);
+ }
+
+ public Quantity<LengthUnits> inPixels(int width) {
+ Quantity<LengthUnits> quantity = width != -1 ? new Quantity<LengthUnits>(width, LengthUnits.px) : null;
+ return quantity;
+ }
+
+ public void setMinNodeWidth(Quantity<LengthUnits> width) {
+ getStyleController().setMinNodeWidth(getDelegate(), width);
+ }
+
+ public void setMinNodeWidth(String width) {
+ getStyleController().setMinNodeWidth(getDelegate(), Quantity.fromString(width, LengthUnits.px));
+ }
+
+ public void setMaxNodeWidth(int width) {
+ Quantity<LengthUnits> quantity = inPixels(width);
+ setMaxNodeWidth(quantity);
+ }
+
+ public void setMaxNodeWidth(Quantity<LengthUnits> width) {
+ getStyleController().setMaxNodeWidth(getDelegate(), width);
+ }
+
+ public void setMaxNodeWidth(String width) {
+ getStyleController().setMaxNodeWidth(getDelegate(), Quantity.fromString(width, LengthUnits.px));
+ }
+
+ public boolean isNumberingEnabled() {
+ return NodeStyleModel.getNodeNumbering(getDelegate());
+ }
+
+ public void setNumberingEnabled(boolean enabled) {
+ getStyleController().setNodeNumbering(getDelegate(), enabled);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/PropertiesProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/PropertiesProxy.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/PropertiesProxy.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/PropertiesProxy.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/Proxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/Proxy.java
new file mode 100644
index 0000000..74b9b3e
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/Proxy.java
@@ -0,0 +1,1758 @@
+package org.freeplane.plugin.script.proxy;
+
+import groovy.lang.Closure;
+
+import java.awt.Color;
+import java.io.File;
+import java.net.URI;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.swing.Icon;
+
+import org.freeplane.core.ui.LengthUnits;
+import org.freeplane.core.util.FreeplaneIconUtils;
+import org.freeplane.core.util.FreeplaneVersion;
+import org.freeplane.core.util.HtmlUtils;
+import org.freeplane.core.util.Quantity;
+import org.freeplane.features.edge.EdgeStyle;
+import org.freeplane.features.filter.condition.ICondition;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.FormattedNumber;
+import org.freeplane.features.format.FormattedObject;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.link.ArrowType;
+import org.freeplane.features.styles.IStyle;
+import org.freeplane.plugin.script.ExecuteScriptException;
+import org.freeplane.plugin.script.proxy.Proxy.Map;
+
+/**
+ * This interface alone defines the api for accessing the internal state of the Freeplane. All read-write methods
+ * and properties (with rare, documented exceptions in {@link Controller} and {@link Map}) support undo and
+ * rollback on exceptions.
+ * <p>
+ * Every Proxy subinterface comes in two variants:
+ * <ul>
+ * <li>A read-only interface, like {@link NodeRO}. This collects only the methods that don't change the
+ * underlying object (in case of <code>NodeRO</code> this would be <code>NodeModel</code>.
+ * <li>A read-write interface, like {@link Node}. This inherits from the respective read-only interface all its
+ * methods and properties and adds write access to the underlying object.
+ * </ul>
+ * The main point of this distinction are formulas: <em>Only the methods defined in the read-only interfaces are
+ * supported in Formulas!</em>. Changing values in a Formula are against the Formula concept and lead to corruption
+ * of the caching mechanism for Formulas.
+ */
+public interface Proxy {
+ /** Node's attribute table: <code>node.attributes</code> - read-only.
+ * <p>
+ * Attributes are name - value pairs assigned to a node. A node may have multiple attributes
+ * with the same name.
+ */
+ interface AttributesRO {
+ /** alias for {@link #getFirst(String)}.
+ * @deprecated before 1.1 - use {@link #get(int)}, {@link #getFirst(String)} or {@link #getAll(String)} instead. */
+ @Deprecated
+ Object get(final String name);
+
+ /** returns the <em>first</em> value of an attribute with the given name or null otherwise.
+ * @since 1.2 */
+ Object getFirst(final String name);
+
+ /** returns true if there is any attribute with key <a>name</a>.
+ * @since 1.4 */
+ boolean containsKey(final String name);
+
+ /** returns all values for the attribute name. */
+ List<Object> getAll(final String name);
+
+ /** returns all attribute names in the proper sequence. The number of names returned
+ * is equal to the number of attributes.
+ * <pre>
+ * // rename attribute
+ * int i = 0;
+ * for (String name : attributes.getNames()) {
+ * if (name.equals("xy"))
+ * attributes.set(i, "xyz", attributes.get(i));
+ * ++i;
+ * }
+ * </pre> */
+ List<String> getNames();
+
+ /** @deprecated since 1.2 use #getNames() instead. */
+ List<String> getAttributeNames();
+
+ /** returns all values as a list of {@link Convertible}.
+ * @since 1.2 */
+ List<? extends Convertible> getValues();
+
+ /** returns all attributes as a map. Note that this will erase duplicate keys.
+ * <code>node.attributes = otherNode.attributes.map</code>
+ * @since 1.2 */
+ java.util.Map<String, Object> getMap();
+
+ /** returns the attribute value at the given index.
+ * @throws IndexOutOfBoundsException if index is out of range <tt>(index
+ * < 0 || index >= size())</tt>.*/
+ Object get(final int index);
+
+ /** returns the attribute key at the given index.
+ * @throws IndexOutOfBoundsException if index is out of range <tt>(index
+ * < 0 || index >= size())</tt>.*/
+ String getKey(final int index);
+
+ /** @deprecated since 1.2 - use {@link #findFirst(String)} instead. */
+ int findAttribute(final String name);
+
+ /** returns the index of the first attribute with the given name if one exists or -1 otherwise.
+ * For searches for <em>all</em> attributes with a given name <code>getAttributeNames()</code>
+ * must be used.
+ * @since 1.2*/
+ int findFirst(final String name);
+
+ /** returns the values of all attributes for which the closure returns true. The fact that the values are
+ * returned as a list of {@link Convertible} enables conversion. The following formula sums all attributes
+ * whose names are not equal to 'TOTAL':
+ * <pre>
+ * = attributes.findValues{key,val→ key != 'TOTAL'}.sum(0){it.num0}
+ * </pre>
+ * @param closure A closure that accepts two arguments (String key, Object value) and returns boolean/Boolean.
+ * @since 1.2 */
+ List<? extends Convertible> findValues(Closure<Boolean> closure);
+
+ /** the number of attributes. It is <code>size() == getAttributeNames().size()</code>. */
+ int size();
+
+ /** returns <code>getAttributeNames().isEmpty()</code>.
+ * @since 1.2 */
+ boolean isEmpty();
+ }
+
+ /** Node's attribute table: <code>node.attributes</code> - read-write.
+ * <p>
+ * <b>Notes on attribute setters:</b><ul>
+ * <li> All setter methods try to convert strings to dates, numbers or URIs.
+ * <li> All setter methods apply a default formatting (for display) of the value for dates and numbers.
+ * <li> Attributes don't have style properties so the value objects must know about the right formatting for
+ * themselves.
+ * <li> To enforce a certain formatting use format(): <pre>node['creationDate'] = format(new Date(), 'MM/yyyy')</pre>
+ * </ul>
+ * <p>
+ * <b>Examples:</b>
+ * <pre>
+ * // == text
+ * node["attribute name"] = "a value"
+ * assert node["attribute name"].text == "a value"
+ * assert node.attributes.getFirst("attribute name") == "a value" // the same
+ *
+ * // == numbers and others
+ * // converts numbers and other stuff with toString()
+ * node["a number"] = 1.2
+ * assert node["a number"].text == "1.2"
+ * assert node["a number"].num == 1.2d
+ *
+ * * // == dates
+ * def date = new Date()
+ * node["a date"] = date
+ * assert node["a date"].object.getClass().simpleName == "FormattedDate"
+ * assert node["a date"].date == format(date)
+ *
+ * // == enforce formats on attribute values
+ * node["another date"] = format(date, 'yyyy|MM|dd')
+ * assert node["another date"].date == format(date, 'yyyy|MM|dd')
+ *
+ * // change the date while keeping the silly format
+ * def index = node.attributes.findAttribute("another date")
+ * node.attributes.set(index, new Date(0L))
+ *
+ * // == URIs
+ * def uri = new URI("http://www.freeplane.org")
+ * node["uri"] = uri
+ * assert node["uri"].object.getClass().simpleName == "URI"
+ * assert node["uri"].object == uri
+ *
+ * // == remove an attribute
+ * node["removed attribute"] = "to be removed"
+ * assert node["removed attribute"] == "to be removed"
+ * node["removed attribute"] = null
+ * assert node.attributes.findFirst("removed attribute") == -1
+ * </pre>
+ */
+ interface Attributes extends AttributesRO {
+ /** sets the value of the attribute at an index. This method will not create new attributes.
+ * @throws IndexOutOfBoundsException if index is out of range <tt>(index
+ * < 0 || index >= size())</tt>. */
+ void set(final int index, final Object value);
+
+ /** sets name and value of the attribute at the given index. This method will not create new attributes.
+ * @throws IndexOutOfBoundsException if index is out of range <tt>(index
+ * < 0 || index >= size())</tt>. */
+ void set(final int index, final String name, final Object value);
+
+ /** removes the <em>first</em> attribute with this name.
+ * @return true on removal of an existing attribute and false otherwise.
+ * @deprecated before 1.1 - use {@link #remove(int)} or {@link #removeAll(String)} instead. */
+ @Deprecated
+ boolean remove(final String name);
+
+ /** removes <em>all</em> attributes with this name.
+ * @return true on removal of an existing attribute and false otherwise. */
+ boolean removeAll(final String name);
+
+ /** removes the attribute at the given index.
+ * @throws IndexOutOfBoundsException if index is out of range <tt>(index
+ * < 0 || index >= size())</tt>. */
+ void remove(final int index);
+
+ /** adds an attribute if there is no attribute with the given name or changes
+ * the value <em>of the first</em> attribute with the given name. */
+ void set(final String name, final Object value);
+
+ /** adds an attribute no matter if an attribute with the given name already exists. */
+ void add(final String name, final Object value);
+
+ /** removes all attributes.
+ * @since 1.2 */
+ void clear();
+
+ /** allows application of Groovy collection methods like each(), collect(), ...
+ * <pre>
+ * def keyList = node.attributes.collect { it.key }
+ * def values = node.attributes.collect { it.value }
+ * node.attributes.each {
+ * if (it.key =~ /.*day/)
+ * it.value += ' days'
+ * }
+ * </pre>
+ * @since 1.3.2 */
+ Iterator<java.util.Map.Entry<String, Object>> iterator();
+
+ /** optimize widths of attribute view columns according to contents.
+ * @since 1.4 */
+ void optimizeWidths();
+ }
+
+ /** Here are four ways to enable a cloud on the current node and switch it off again:
+ * <pre>
+ * node.cloud.enabled = true
+ * node.cloud.enabled = false
+ *
+ * node.cloud.shape = 'ROUND_RECT' // either 'ARC', 'STAR', 'RECT' or 'ROUND_RECT'
+ * node.cloud.shape = null
+ *
+ * node.cloud.color = java.awt.Color.YELLOW
+ * node.cloud.color = null
+ *
+ * node.cloud.colorCode = '#00FF66'
+ * node.cloud.color = null
+ * </pre>
+ * @since 1.3 */
+ interface Cloud {
+ /** @since 1.3 */
+ boolean getEnabled();
+ /** @since 1.3 */
+ void setEnabled(boolean enable);
+
+ /** @return either null (if cloud is not enabled), "ARC", "STAR", "RECT" or "ROUND_RECT".
+ * @since 1.3 */
+ String getShape();
+ /** @param shape use "ARC", "STAR", "RECT" or "ROUND_RECT". null removes the cloud
+ * @since 1.3 */
+ void setShape(String shape);
+
+ /** @return either null (if cloud is not enabled) or the current cloud color.
+ * @since 1.3 */
+ Color getColor();
+ /** @since 1.3 */
+ void setColor(Color color);
+
+ /** @return either null (if cloud is not enabled) or a HTML color spec.
+ * @since 1.3 */
+ String getColorCode();
+ /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
+ * @since 1.3 */
+ void setColorCode(String rgbString);
+ }
+
+ /** Graphical connector between nodes:<code>node.connectorsIn</code> / <code>node.connectorsOut</code>
+ * - read-only. */
+ interface ConnectorRO {
+ /** returns one of LINE, LINEAR_PATH, CUBIC_CURVE, EDGE_LIKE.
+ * @since 1.3 */
+ String getShape();
+
+ Color getColor();
+
+ String getColorCode();
+
+ /** @since 1.2 */
+ boolean hasEndArrow();
+
+ /**@deprecated since 1.2 - use {@link #hasEndArrow()} instead */
+ ArrowType getEndArrow();
+
+ String getMiddleLabel();
+
+ Node getSource();
+
+ String getSourceLabel();
+
+ /** @since 1.2 */
+ boolean hasStartArrow();
+
+ /** @deprecated since 1.2 - use {@link #hasStartArrow()} instead */
+ ArrowType getStartArrow();
+
+ Node getTarget();
+
+ String getTargetLabel();
+
+ boolean simulatesEdge();
+
+ /** returns a Point.
+ * @since 1.3.3 */
+ List<Integer> getStartInclination();
+
+ /** returns a Point.
+ * @since 1.3.3 */
+ List<Integer> getEndInclination();
+ }
+
+ /** Graphical connector between nodes:<code>node.connectorsIn</code> / <code>node.connectorsOut</code>
+ * - read-write. */
+ interface Connector extends ConnectorRO {
+ /** @param shape one of LINE, LINEAR_PATH, CUBIC_CURVE, EDGE_LIKE.
+ * @since 1.3 */
+ void setShape(String shape);
+
+ void setColor(Color color);
+
+ /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
+ * @since 1.2 */
+ void setColorCode(String rgbString);
+
+ /** @since 1.2 */
+ void setEndArrow(boolean showArrow);
+
+ /** @deprecated since 1.2 - use {@link #setEndArrow(boolean)} instead */
+ void setEndArrow(ArrowType arrowType);
+
+ void setMiddleLabel(String label);
+
+ void setSimulatesEdge(boolean simulatesEdge);
+
+ void setSourceLabel(String label);
+
+ /** @since 1.2 */
+ void setStartArrow(boolean showArrow);
+
+ /** @deprecated since 1.2 - use {@link #setStartArrow(boolean)} instead */
+ void setStartArrow(ArrowType arrowType);
+
+ void setTargetLabel(String label);
+
+ /** startPoint, endPoint: list of two integers representing a Point.
+ * @since 1.3.3 */
+ void setInclination(final List<Integer> startPoint, final List<Integer> endPoint);
+ }
+
+ /** Access to global state: in scripts, this is available as global variable <code>c</code> - read-only. */
+ interface ControllerRO {
+ /** if multiple nodes are selected returns one (arbitrarily chosen)
+ * selected node or the selected node for a single node selection. */
+ Node getSelected();
+
+ /** A read-only list of selected nodes. That is you cannot select a node by adding it to the returned list. */
+ List<Node> getSelecteds();
+
+ /** returns List<Node> of Node objects sorted on Y
+ *
+ * @param differentSubtrees if true
+ * children/grandchildren/grandgrandchildren/... nodes of selected
+ * parent nodes are excluded from the result. */
+ List<Node> getSortedSelection(boolean differentSubtrees);
+
+ /**
+ * returns Freeplane version.
+ * Use it like this:
+ * <pre>
+ * import org.freeplane.core.util.FreeplaneVersion
+ * import org.freeplane.core.ui.components.UITools
+ *
+ * def required = FreeplaneVersion.getVersion("1.1.2");
+ * if (c.freeplaneVersion < required)
+ * UITools.errorMessage("Freeplane version " + c.freeplaneVersion
+ * + " not supported - update to at least " + required);
+ * </pre>
+ */
+ FreeplaneVersion getFreeplaneVersion();
+
+ /** returns the directory where user settings, logfiles, templates etc. are stored.
+ * @since 1.2 */
+ File getUserDirectory();
+
+ /** Starting from the root node, recursively searches for nodes for which
+ * <code>condition.checkNode(node)</code> returns true.
+ * @deprecated since 1.2 use {@link #find(Closure)} instead. */
+ List<Node> find(ICondition condition);
+
+ /**
+ * Starting from the root node, recursively searches for nodes (in breadth-first sequence) for which
+ * <code>closure.call(node)</code> returns true.
+ * <p>
+ * A find method that uses a Groovy closure ("block") for simple custom searches. As this closure
+ * will be called with a node as an argument (to be referenced by <code>it</code>) the search can
+ * evaluate every node property, like attributes, icons, node text or notes.
+ * <p>
+ * Examples:
+ * <pre>
+ * def nodesWithNotes = c.find{ it.noteText != null }
+ *
+ * def matchingNodes = c.find{ it.text.matches(".*\\d.*") }
+ * def texts = matchingNodes.collect{ it.text }
+ * print "node texts containing numbers:\n " + texts.join("\n ")
+ * </pre>
+ * See {@link Node#find(Closure)} for searches on subtrees.
+ * @param closure a Groovy closure that returns a boolean value. The closure will receive
+ * a NodeModel as an argument which can be tested for a match.
+ * @return all nodes for which <code>closure.call(NodeModel)</code> returns true.
+ */
+ List<Node> find(Closure<Boolean> closure);
+
+ /**
+ * Returns all nodes of the map in breadth-first order, that is, for the following map,
+ * <pre>
+ * 1
+ * 1.1
+ * 1.1.1
+ * 1.1.2
+ * 1.2
+ * 2
+ * </pre>
+ * [1, 1.1, 1.1.1, 1.1.2, 1.2, 2] is returned.
+ * See {@link Node#find(Closure)} for searches on subtrees.
+ * @see #findAllDepthFirst()
+ * @since 1.2 */
+ List<Node> findAll();
+
+ /**
+ * Returns all nodes of the map in depth-first order, that is, for the following map,
+ * <pre>
+ * 1
+ * 1.1
+ * 1.1.1
+ * 1.1.2
+ * 1.2
+ * 2
+ * </pre>
+ * [1.1.1, 1.1.2, 1.1, 1.2, 1, 2] is returned.
+ * See {@link Node#findAllDepthFirst()} for subtrees.
+ * @since 1.2 */
+ List<Node> findAllDepthFirst();
+
+ /** returns the current zoom factor. A value of 1 means 100%.
+ * @since 1.2 */
+ float getZoom();
+
+ /** returns false if the system 'nonInteractive' is set. This can be used in actions to not open dialogs etc.
+ * @since 1.2 */
+ boolean isInteractive();
+
+ List<String> getExportTypeDescriptions();
+
+ /** exports map to destination file, example:
+ * <pre>
+ * println c.getExportTypeDescriptions.join('\n')
+ * boolean overwriteExistingFile = true
+ * c.export(node.map, new File('/tmp/t.png'), 'Portable Network Graphic (PNG) (.png)', overwriteExistingFile)
+ * </pre>
+ * @param exportTypeDescription Use {@link #getExportTypeDescriptions()} to look up available exportTypes
+ * @since 1.3.5 */
+ void export(Map map, File destinationFile, String exportTypeDescription, boolean overwriteExisting);
+ }
+
+ /** Access to global state: in scripts, this is available as global variable <code>c</code> - read-write. */
+ interface Controller extends ControllerRO {
+ void centerOnNode(Node center);
+
+ /** Starts editing node, normally in the inline editor. Does not block until edit has finished.
+ * @since 1.2.2 */
+ void edit(Node node);
+
+ /** opens the appropriate popup text editor. Does not block until edit has finished.
+ * @since 1.2.2 */
+ void editInPopup(Node node);
+
+ void select(Node toSelect);
+
+ /** toSelect is a List<Node> of Node objects
+ * @since 1.4 */
+ void select(Collection<Node> toSelect);
+
+ /** selects branchRoot and all children */
+ void selectBranch(Node branchRoot);
+
+ /** toSelect is a Collection<Node> of Node objects */
+ void selectMultipleNodes(Collection<Node> toSelect);
+
+ /** reset undo / redo lists and deactivate Undo for current script */
+ void deactivateUndo();
+
+ /** invokes undo once - for testing purposes mainly.
+ * @since 1.2 */
+ void undo();
+
+ /** invokes redo once - for testing purposes mainly.
+ * @since 1.2 */
+ void redo();
+
+ /** The main info for the status line with key="standard", use null to remove. Removes icon if there is one. */
+ void setStatusInfo(String info);
+
+ /** Info for status line, null to remove. Removes icon if there is one.
+ * @see #setStatusInfo(String, String, String) */
+ void setStatusInfo(String infoPanelKey, String info);
+
+ /** Info for status line - text and icon - null stands for "remove" (text or icon)
+ * @param infoPanelKey "standard" is the left most standard info panel. If a panel with
+ * this name doesn't exist it will be created.
+ * @param info Info text
+ * @param iconKey key as those that are used for nodes (see {@link Icons#addIcon(String)}).
+ * <pre>
+ * println("all available icon keys: " + FreeplaneIconUtils.listStandardIconKeys())
+ * c.setStatusInfo("standard", "hi there!", "button_ok");
+ * </pre>
+ * @see FreeplaneIconUtils
+ * @since 1.2 */
+ void setStatusInfo(String infoPanelKey, String info, String iconKey);
+
+ /** @deprecated since 1.2 - use {@link #setStatusInfo(String, String, String)} */
+ void setStatusInfo(String infoPanelKey, Icon icon);
+
+ /** opens a new map with a default name in the foreground.
+ * @since 1.2 */
+ Map newMap();
+
+ /** opens a new map for url in the foreground if it isn't opened already.
+ * @since 1.2 */
+ Map newMap(URL url);
+
+ /** opens a new map based on given template.
+ * @since 1.5 */
+ public Map newMapFromTemplate(File templateFile);
+
+ /** a value of 1 means 100%.
+ * @since 1.2 */
+ void setZoom(final float ratio);
+
+ /** a list of all opened maps.
+ * @since 1.5 */
+ List<Map> getOpenMaps();
+ }
+
+ /** Edge to parent node: <code>node.style.edge</code> - read-only. */
+ interface EdgeRO {
+ Color getColor();
+
+ String getColorCode();
+
+ EdgeStyle getType();
+
+ int getWidth();
+ }
+
+ /** Edge to parent node: <code>node.style.edge</code> - read-write. */
+ interface Edge extends EdgeRO {
+ void setColor(Color color);
+
+ /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
+ * @since 1.2 */
+ void setColorCode(String rgbString);
+
+ void setType(EdgeStyle type);
+
+ /** can be -1 for default, 0 for thin, >0 */
+ void setWidth(int width);
+ }
+
+ /** External object: <code>node.externalObject</code> - read-only. */
+ interface ExternalObjectRO {
+ /** returns the object's uri if set or null otherwise.
+ * @since 1.2 */
+ String getUri();
+
+ /** returns the current zoom level as ratio, i.e. 1.0 is returned for 100%.
+ * If there is no external object 1.0 is returned. */
+ float getZoom();
+
+ /** @deprecated since 1.2 - use {@link #getUri()} instead. */
+ String getURI();
+ }
+
+ /** External object: <code>node.externalObject</code> - read-write. */
+ interface ExternalObject extends ExternalObjectRO {
+ /** setting null uri means remove external object.
+ * Starting with Freeplane 1.2.23 there is an additional setUri(Object) method that also accepts File,
+ * URI and URL arguments.
+ * @since 1.2 */
+ void setUri(String target);
+
+ /** setting null uri means remove external object. */
+ void setFile(File target);
+
+ /** set to 1.0 to set it to 100%. If the node has no object assigned this method does nothing. */
+ void setZoom(float zoom);
+
+ /** @deprecated since 1.2 - use {@link #setUri(String)} instead. */
+ void setURI(String uri);
+ }
+
+ /** Node's font: <code>node.style.font</code> - read-only. */
+ interface FontRO {
+ String getName();
+
+ int getSize();
+
+ boolean isBold();
+
+ boolean isBoldSet();
+
+ boolean isItalic();
+
+ boolean isItalicSet();
+
+ boolean isNameSet();
+
+ boolean isSizeSet();
+ }
+
+ /** Node's font: <code>node.style.font</code> - read-write. */
+ interface Font extends FontRO {
+ void resetBold();
+
+ void resetItalic();
+
+ void resetName();
+
+ void resetSize();
+
+ void setBold(boolean bold);
+
+ void setItalic(boolean italic);
+
+ void setName(String name);
+
+ void setSize(int size);
+ }
+
+ /** Node's icons: <code>node.icons</code> - read-only. */
+ interface IconsRO {
+ /** returns the name of the icon at the given index (starting at 0) or null if <code>index ≥ size</code>.
+ * Use it like this: <pre>
+ * def secondIconName = node.icons[1]
+ * </pre>
+ * @since 1.2 */
+ String getAt(int index);
+
+ /** returns the name of the first icon if the node has an icon assigned or null otherwise. Equivalent: <code>node.icons[0]</code>.
+ * @since 1.2 */
+ String getFirst();
+
+ /** returns true if the node has an icon of this name.
+ * @since 1.2 */
+ boolean contains(String name);
+
+ /** returns the number of icons the node has.
+ * @since 1.2 */
+ int size();
+
+ /** returns a read-only list of the names of the icons the node has. Think twice before you use this method
+ * since it leads to ugly code, e.g. use <code>node.icons.first</code> or <code>node.icons[0]</code> instead of
+ * <code>node.icons.icons[0]</code>. Perhaps you could also use iteration over icons, see. */
+ List<String> getIcons();
+
+ /** returns a list of the urls of the icons the node has. */
+ List<URL> getUrls();
+
+ /** allows application of Groovy collection methods like each(), collect(), ...
+ * <pre>
+ * def freeIcons = node.icons.findAll { it.startsWith('free') }
+ * </pre>
+ * @since 1.3.2 */
+ Iterator<String> iterator();
+ }
+
+ /** Node's icons: <code>node.icons</code> - read-write. */
+ interface Icons extends IconsRO {
+ /**
+ * adds an icon to a node if an icon for the given key can be found. The same icon can be added multiple
+ * times.
+ * <pre>
+ * println("all available icon keys: " + FreeplaneIconUtils.listStandardIconKeys())
+ * node.icons.addIcon("button_ok")
+ * </pre>
+ * @see FreeplaneIconUtils */
+ void add(String name);
+
+ /** @since 1.4 */
+ void addAll(Collection<String> names);
+
+ /** @since 1.4 */
+ void addAll(IconsRO icons);
+
+ /** @deprecated since 1.2 - use {@link #add(String)} instead. */
+ void addIcon(String name);
+
+ /** deletes the icon at the given index, returns true if success (icon existed). */
+ boolean remove(int index);
+
+ /** deletes first occurence of icon with the given name, returns true if success (icon existed). */
+ boolean remove(String name);
+
+ /** @deprecated since 1.2 - use {@link #remove(String)} instead. */
+ boolean removeIcon(String name);
+
+ /** removes all icons.
+ * @since 1.2 */
+ void clear();
+ }
+
+ /** Node's link: <code>node.link</code> - read-only.
+ * <p>
+ * None of the getters will throw an exception, even if you call, e.g. getNode() on a File link.
+ * Instead they will return null. To check the link type evaluate getUri().getScheme() or the result
+ * of the special getters.*/
+ interface LinkRO {
+ /** returns the link text, a stringified URI, if a link is defined and null otherwise.
+ * @since 1.2 */
+ String getText();
+
+ /** returns the link as URI if defined and null otherwise. Won't throw an exception.
+ * @since 1.2 */
+ URI getUri();
+
+ /** returns the link as File if defined and if the link target is a valid File URI and null otherwise.
+ * @see File#File(URI).
+ * @since 1.2 */
+ File getFile();
+
+ /** returns the link as Node if defined and if the link target is a valid local link to a node and null otherwise.
+ * @since 1.2 */
+ Node getNode();
+
+ /** @deprecated since 1.2 - use {@link #getText()} instead. */
+ String get();
+ }
+
+ /** Node's link: <code>node.link</code> - read-write. */
+ interface Link extends LinkRO {
+ /** target is a stringified URI. Removes any link if uri is null.
+ * To get a local link (i.e. to another node) target should be: "#" + nodeId or better use setNode(Node).
+ * @throws IllegalArgumentException if target is not convertible into a {@link URI}.
+ * @since 1.2 */
+ void setText(String target);
+
+ /** sets target to uri. Removes any link if uri is null.
+ * @since 1.2 */
+ void setUri(URI uri);
+
+ /** sets target to file. Removes any link if file is null.
+ * @since 1.2 */
+ void setFile(File file);
+
+ /** target is a node of the same map. Shortcut for setTarget("#" + node.nodeId)
+ * Removes any link if node is null.
+ * @throws IllegalArgumentException if node belongs to another map.
+ * @since 1.2 */
+ void setNode(Node node);
+
+ /** @deprecated since 1.2 - use {@link #setText(String)} instead.
+ * @return true if target could be converted to an URI and false otherwise. */
+ boolean set(String target);
+
+ /** removes the link. Same as <code>node.link.text = null</code>.
+ * @return <tt>true</tt> if there was a link to remove.
+ * @since 1.4 */
+ boolean remove();
+ }
+
+ /** The map a node belongs to: <code>node.map</code> - read-only. */
+ interface MapRO {
+ /** @since 1.2 */
+ Node getRoot();
+
+ /** @deprecated since 1.2 - use {@link #getRoot()} instead. */
+ Node getRootNode();
+
+ /** get node by id.
+ * @return the node if the map contains it or null otherwise. */
+ Node node(String id);
+
+ /** returns the filenname of the map as a java.io.File object if available or null otherwise. */
+ File getFile();
+
+ /** returns the title of the MapView.
+ * @since 1.2 */
+ String getName();
+
+ /** @since 1.2 */
+ boolean isSaved();
+
+ /** @since 1.2 */
+ Color getBackgroundColor();
+
+ /** returns HTML color spec like #ff0000 (red) or #222222 (darkgray).
+ * @since 1.2 */
+ String getBackgroundColorCode();
+ }
+
+ /** The map a node belongs to: <code>node.map</code> - read-write. */
+ interface Map extends MapRO {
+ /**
+ * closes a map. Note that there is <em>no undo</em> for this method!
+ * @param force close map even if there are unsaved changes.
+ * @param allowInteraction if (allowInteraction && ! force) a saveAs dialog will be opened if there are
+ * unsaved changes.
+ * @return false if the saveAs was cancelled by the user and true otherwise.
+ * @throws RuntimeException if the map contains changes and parameter force is false.
+ * @since 1.2
+ */
+ boolean close(boolean force, boolean allowInteraction);
+
+ /**
+ * saves the map to disk. Note that there is <em>no undo</em> for this method.
+ * @param allowInteraction if a saveAs dialog should be opened if the map has no assigned URL so far.
+ * @return false if the saveAs was cancelled by the user and true otherwise.
+ * @throws RuntimeException if the map has no assigned URL and parameter allowInteraction is false.
+ * @since 1.2
+ */
+ boolean save(boolean allowInteraction);
+
+ /** @since 1.2 */
+ void setSaved(boolean isSaved);
+
+ /** Sets the map (frame/tab) title. Note that there is <em>no undo</em> for this method!
+ * @since 1.2 */
+ void setName(String title);
+
+ /** @since 1.2 */
+ void setBackgroundColor(Color color);
+
+ /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
+ * @since 1.2 */
+ void setBackgroundColorCode(String rgbString);
+
+ /** install a Groovy closure as the current filter in this map. If <code>closure</code> is null then filtering will
+ * be disabled. The filter state of a node can be checked by {@link Node#isVisible()}. <br>
+ * To undo filtering use <em>Tools → Undo</em>. After execution of the following you have to use it seven times to
+ * return to the initial filter state.
+ * <pre>
+ * // show only matching nodes
+ * node.map.filter{ it.text.contains("todo") }
+ * // equivalent:
+ * node.map.filter = { it.text.contains("todo") }
+ *
+ * // show ancestors of matching nodes
+ * node.map.filter(true, false){ it.text.contains("todo") }
+ * // equivalent:
+ * node.map.setFilter(true, false, { it.text.contains("todo") })
+ *
+ * // show descendants of matching nodes
+ * node.map.filter(false, true){ it.text.contains("todo") }
+ * // equivalent:
+ * node.map.setFilter(false, true, { it.text.contains("todo") })
+ *
+ * // remove filter
+ * node.map.filter = null
+ * </pre>
+ * @since 1.2 */
+ public void filter(final Closure<Boolean> closure);
+
+ /** alias for {@link #filter(Closure)}. Enables assignment to the <code>filter</code> property.
+ * @since 1.2 */
+ public void setFilter(final Closure<Boolean> closure);
+
+ /** With {@link #filter(Closure)} neither ancestors not descendants of the visible nodes are shown. Use this
+ * method to control these options.
+ * @see #filter(Closure)
+ * @since 1.2 */
+ public void filter(final boolean showAncestors, final boolean showDescendants, final Closure<Boolean> closure);
+
+ /** alias for {@link #setFilter(boolean, boolean, Closure)}
+ * @see #filter(Closure)
+ * @since 1.2 */
+ public void setFilter(final boolean showAncestors, final boolean showDescendants, final Closure<Boolean> closure);
+
+ /** reinstalls the previously undone filter if there is any.
+ * Note: undo/redo for filters is separate to the undo/redo for other map state.
+ * @since 1.2 */
+ public void redoFilter();
+
+ /** removes the current filter and reinstalls the previous filter if there is any.
+ * Note: undo/redo for filters is separate to the undo/redo for other map state.
+ * @since 1.2 */
+ public void undoFilter();
+
+ /** returns an accessor to the map specific storage. The value is never null
+ * @since 1.3.6 */
+ public Proxy.Properties getStorage();
+ }
+
+ /** The currently selected node: <code>node</code> - read-only. */
+ interface NodeRO {
+ Attributes getAttributes();
+
+ /** allows to access attribute values like array elements. Note that the returned type is a
+ * {@link Convertible}, not a String. Nevertheless it behaves like a String in almost all respects,
+ * that is, in Groovy scripts it understands all String methods like lenght(), matches() etc.
+ * <pre>
+ * // standard way
+ * node.attributes.set("attribute name", "12")
+ * // implicitely use getAt()
+ * def val = node["attribute name"]
+ * // use all conversions that Convertible provides (num, date, string, ...)
+ * assert val.num == new Long(12)
+ * // or use it just like a string
+ * assert val.startsWith("1")
+ * // check for availability of an attribute this way:
+ * if (node["unknown attribute"])
+ * // surprise: the node has an attribute with key "unknown attribute"
+ * </pre>
+ * @throws ExecuteScriptException
+ * @since 1.2
+ */
+ Convertible getAt(String attributeName);
+
+ /**
+ * @since 1.2
+ */
+ Cloud getCloud();
+
+ /** returns the index (0..) of this node in the (by Y coordinate sorted)
+ * list of this node's children. Returns -1 if childNode is not a child
+ * of this node. */
+ int getChildPosition(Node childNode);
+
+ /** returns the children of this node ordered by Y coordinate. */
+ List<Node> getChildren();
+
+ Collection<Connector> getConnectorsIn();
+
+ Collection<Connector> getConnectorsOut();
+
+ /** returns the raw HTML text of the details if there is any or null otherwise.
+ * @since 1.2 */
+ String getDetailsText();
+
+ /** returns the text of the details as a Convertible like {@link #getNote()} for notes:
+ * <ul>
+ * <li>node.details.to.plain plain text of the node, possibly after formula evaluation
+ * <li>node.details.plain the same.
+ * <li>node.details.string the same.
+ * <li>node.details.html the raw html text. No formula evaluation is applied.
+ * <li>node.details.text the same.
+ * </ul>
+ * @since 1.2 */
+ Convertible getDetails();
+
+ /** returns true if node details are hidden.
+ * @since 1.2 */
+ boolean getHideDetails();
+
+ ExternalObject getExternalObject();
+
+ Icons getIcons();
+
+ Link getLink();
+
+ /** use it to create and inspect {@link Reminder}s. This property is never null. */
+ Reminder getReminder();
+
+ /** the map this node belongs to. */
+ Map getMap();
+
+ /** @deprecated since 1.2 - use Node.getId() instead. */
+ String getNodeID();
+
+ /** @since 1.2 */
+ String getId();
+
+ /** if countHidden is false then only nodes that are matched by the
+ * current filter are counted. */
+ int getNodeLevel(boolean countHidden);
+
+ /** returns the text of the details as a Convertible. Convertibles behave like Strings in most respects.
+ * Additionally String methods are overridden to handle Convertible arguments as if the argument were the
+ * result of Convertible.getText().
+ * <ul>
+ * <li>node.note.to.plain plain text of the node, possibly after formula evaluation
+ * <li>node.note.plain the same.
+ * <li>node.note.text the same.
+ * <li>node.note.html the raw html text. No formula evaluation is applied.
+ * <li>node.note.string the same.
+ * </ul>
+ * @return Convertible getString(), getText() and toString() will return plain text instead of the HTML.
+ * Use {@link #getNoteText()} to get the HTML text.
+ * @throws ExecuteScriptException
+ * @since 1.2
+ */
+ Convertible getNote();
+
+ /** Returns the HTML text of the node. (Notes always contain HTML text.)
+ * @throws ExecuteScriptException */
+ String getNoteText();
+
+ /** @since 1.2 */
+ Node getParent();
+
+ /** @deprecated since 1.2 - use {@link #getParent()} instead. */
+ Node getParentNode();
+
+ /** a list of all nodes starting from this node upto (and including) the root node.
+ * <pre>
+ * def path = pathToRoot.collect{ it.plainText }.join('.')
+ * </pre>
+ * @since 1.3.3 */
+ List<Node> getPathToRoot();
+
+ /** returns the next node with respect to this node in depth-first order.
+ * Returns null if this node is the only one in the map. */
+ Node getNext();
+
+ /** returns the previous node with respect to this node in depth-first order.
+ * Returns null if this node is the only one in the map. */
+ Node getPrevious();
+
+ /** The style attributes of a node can either be changed by assigning a named style like this:
+ * <pre>node.style.name = 'style.ok'</pre>
+ * or by changing attributes for this node individually like this:
+ * <pre>node.style.textColorCode = '#FF0000'</pre>
+ * Conditional styles of a node can only be investigated by {@link Node#hasStyle(String)}. Here a script that
+ * creates an index of all nodes having the style 'todo':
+ * <pre>
+ * def todos = node.map.root.createChild('To Do')
+ * c.find{ it.hasStyle('todo') }.each {
+ * def child = todos.createChild(it.text)
+ * child.link.node = it
+ * }
+ * </pre> */
+ NodeStyle getStyle();
+
+ /** returns true if the node has the style of this name - either manually set or as a conditional style or it is
+ * "default" which all nodes have. The following statement will always be true:
+ * @since 1.2 */
+ boolean hasStyle(String styleName);
+
+ /** Raw text of this node which might be plain or HTML text.
+ * Possible transformations (formula evaluation, formatting, ...) are not applied.
+ * <p>
+ * See
+ * <ul>
+ * <li> {@link #getPlainText()} for plain text or use {@link HtmlUtils#htmlToPlain(String)}.
+ * <li> {@link #getHtmlText()} for HTML text or use {@link HtmlUtils#plainToHTML(String)}.
+ * <li> {@link #getTransformedText()} or {@link #getValue()} for text after formula evaluation.
+ * <li> {@link #getObject()} for possible typed content.
+ * <li> {@link #getTo()} for text/object conversions.
+ * </ul>
+ * @since 1.2 */
+ String getText();
+
+ /** Plain text after removal of possible HTML markup.
+ * Possible transformations (formula evaluation, formatting, ...) are not applied.
+ * @since 1.2 */
+ String getPlainText();
+
+ /** Plain text after removal of possible HTML markup. Formulas are not evaluated.
+ * @deprecated since 1.2 - use getPlainText() or getTo().getPlain() instead. */
+ String getPlainTextContent();
+
+ /** Plain text after removal of possible HTML markup.
+ * Possible transformations (formula evaluation, formatting, ...) are not applied.
+ * @since 1.2 */
+ String getHtmlText();
+
+ /** Plain or HTML text of this node after possible transformation (formula evaluation, formatting, ...).
+ * @since 1.2 */
+ String getTransformedText();
+
+ /** Plain or HTML text of this node after possible transformation (formula evaluation, formatting, ...)
+ * and after text shortening.
+ * See {@link #isMinimized()} for node shortening.
+ * @since 1.2 */
+ String getDisplayedText();
+
+ /** Plain text of this node after possible transformation and forced text shortening.
+ * @since 1.2 */
+ String getShortText();
+
+ /** The object that's displayed as the node text - normally the raw text of this node (then this method is
+ * equivalent to {@link #getText()}).
+ * But in case of typed content (for numbers, dates and calendars) {@link #getObject()} returns
+ * a proper {@link IFormattedObject}. Use {@link #getPlainText()} to remove HTML.
+ * See {@link Node#setObject(Object)} for details.
+ * @since 1.2 */
+ Object getObject();
+
+ /** returns the format string of the formatter if available and null otherwise.
+ * @since 1.2 */
+ String getFormat();
+
+ /**
+ * returns an object that performs conversions (method name is choosen to give descriptive code):
+ * <dl>
+ * <dt>node.to.num <dd>Long or Double, see {@link Convertible#getDate()}.
+ * <dt>node.to.date <dd>Date, see {@link Convertible#getDate()}.
+ * <dt>node.to.string <dd>Text, see {@link Convertible#getString()}.
+ * <dt>node.to.text <dd>an alias for getString(), see {@link Convertible#getText()}.
+ * <dt>node.to.object <dd>returns what fits best, see {@link Convertible#getObject()}.
+ * </dl>
+ * @return ConvertibleObject
+ * @throws ExecuteScriptException on formula evaluation errors
+ * @throws ConversionException on parse errors, e.g. if to.date is invoked on "0.25"
+ * @since 1.2
+ */
+ Convertible getTo();
+
+ /** an alias for {@link #getTo()}.
+ * @throws ExecuteScriptException on formula evaluation errors
+ * @since 1.2 */
+ Convertible getValue();
+
+ /** Returns a <a href="http://www.freesoft.org/CIE/RFC/1521/7.htm">BASE64</a> encoded node text
+ * (see {@link Node#setBinary(byte[])}) as a binary object. Errors are signaled by a null return value.
+ * Whitespace characters are ignored.<br>
+ * Note that this method is not able to catch all encoding errors!
+ * @since 1.2 */
+ byte[] getBinary();
+
+ /** returns true if p is a parent, or grandparent, ... of this node, or if it <em>is equal</em>
+ * to this node; returns false otherwise. */
+ boolean isDescendantOf(Node p);
+
+ /** if this node is folded. Note that the folding state only concerns the visibility of the <em>child nodes</em>. */
+ boolean isFolded();
+
+ /** returns true if this node is freely positionable.
+ * @since 1.2 */
+ public boolean isFree();
+
+ boolean isLeaf();
+
+ boolean isLeft();
+
+ boolean isRoot();
+
+ /** if this node is visible or not (due to filtering). Node folding is not considered.
+ * See {@link #isFolded()} for folding state. */
+ boolean isVisible();
+
+ /** if this node's text is shortened for display. */
+ boolean isMinimized();
+
+ /** The count of node sharing their content with this node. Use <code>if (node.countNodesSharingContent() > 0)</code>
+ * to check if a node has any clones.
+ * <br><em>Note:</em> {@link #getCountNodesSharingContent()} ≥ {@link #getCountNodesSharingContentAndSubtree()}.
+ * @return 0 if this node is standalone or the number of other nodes sharing content otherwise.
+ * @see #getNodesSharingContent()
+ * @see Proxy.Node#appendAsCloneWithSubtree(Proxy.NodeRO)
+ * @see Proxy.Node#appendAsCloneWithoutSubtree(Proxy.NodeRO)
+ * @since 1.5 */
+ int getCountNodesSharingContent();
+
+ /** The count of nodes sharing their content and subtree with this node.
+ * <br><em>Note:</em> {@link #getCountNodesSharingContent()} ≥ {@link #getCountNodesSharingContentAndSubtree()}.
+ * @return 0 if this node has no other nodes it is sharing its content and subtree with or its count otherwise.
+ * @see #getNodesSharingContentAndSubtree()
+ * @see Proxy.Node#appendAsCloneWithSubtree(Proxy.NodeRO)
+ * @see Proxy.Node#appendAsCloneWithoutSubtree(Proxy.NodeRO)
+ * @since 1.5 */
+ int getCountNodesSharingContentAndSubtree();
+
+ /** The count of nodes sharing their content with this node.
+ * <br><em>Note:</em> {@link #getCountNodesSharingContent()} ≥ {@link #getCountNodesSharingContentAndSubtree()}.
+ * @return 0 if this node is standalone or the number of other nodes sharing content otherwise.
+ * @see #getCountNodesSharingContent()
+ * @see Proxy.Node#appendAsCloneWithSubtree(Proxy.NodeRO)
+ * @see Proxy.Node#appendAsCloneWithoutSubtree(Proxy.NodeRO)
+ * @since 1.5 */
+ List<Node> getNodesSharingContent();
+
+ /** The nodes sharing their content and subtree with this node.
+ * @return 0 if this node has no other nodes it is sharing its content and subtree with or its count otherwise.
+ * @see #getCountNodesSharingContentAndSubtree()
+ * @see Proxy.Node#appendAsCloneWithSubtree(Proxy.NodeRO)
+ * @see Proxy.Node#appendAsCloneWithoutSubtree(Proxy.NodeRO)
+ * @since 1.5 */
+ List<Node> getNodesSharingContentAndSubtree();
+
+ /** Starting from this node, recursively searches for nodes for which
+ * <code>condition.checkNode(node)</code> returns true.
+ * @deprecated since 1.2 use {@link #find(Closure)} instead. */
+ List<Node> find(ICondition condition);
+
+ /** Starting from this node, recursively searches for nodes for which <code>closure.call(node)</code>
+ * returns true. See {@link Controller#find(Closure)} for details. */
+ List<Node> find(Closure<Boolean> closure);
+
+ /** Returns all nodes of the branch that starts with this node in breadth-first order.
+ * See {@link Controller#findAll()} for map-global searches.
+ * @since 1.2 */
+ List<Node> findAll();
+
+ /** Returns all nodes of the branch that starts with this node in depth-first order.
+ * See {@link Controller#findAllDepthFirst()} for map-global searches.
+ * @since 1.2 */
+ List<Node> findAllDepthFirst();
+
+ Date getLastModifiedAt();
+
+ Date getCreatedAt();
+
+ /**@since 1.3.7 */
+ int getHorizontalShift();
+
+ /**@since 1.3.7 */
+ int getVerticalShift();
+
+ /**@since 1.3.7 */
+ int getMinimalDistanceBetweenChildren();
+
+ }
+
+ /** The currently selected node: <code>node</code> - read-write. */
+ interface Node extends NodeRO {
+ /** adds a new Connector to the given target node and returns the new
+ * connector for optional further editing (style); also enlists the
+ * Connector on the target Node object. */
+ Connector addConnectorTo(Node target);
+
+ /** as above, using String targetNodeId instead of Node object to establish the connector. */
+ Connector addConnectorTo(String targetNodeId);
+
+ /** inserts *new* node as child, takes care of all construction work and
+ * internal stuff inserts as last child. */
+ Node createChild();
+
+ /** like {@link #createChild()} but sets the node text to the given text.
+ * <pre>
+ * // instead of
+ * def child = node.createChild(); child.setObject(value);
+ * // use
+ * def child = node.createChild(value);
+ * </pre>
+ * @since 1.2 */
+ Node createChild(Object value);
+
+ /** inserts *new* node as child, takes care of all construction work and
+ * internal stuff */
+ Node createChild(int position);
+
+ /** inserts a copy of node as a new child.
+ * @since 1.2 */
+ Node appendChild(NodeRO node);
+
+ /** inserts a copy of the branch starting with node as a new child branch.
+ * @since 1.2 */
+ Node appendBranch(NodeRO node);
+
+ /** inserts the node as a clone of toBeCloned <em>including</em> its current and/or future
+ * subtree. That is all changes of descendent nodes of toBeCloned are reflected in the subtree
+ * of the new node <em>and vice versa</em>.
+ * <br><em>Note:</em> Cloning works symmetrically so we could better speak of two
+ * shared nodes instead of clone and cloned since none of both is privileged.
+ * @return the new child node
+ * @throws IllegalArgumentException if
+ * a) this node (the to-be-parent) is contained in the subtree of toBeCloned,
+ * b) toBeCloned is the root node,
+ * c) toBeCloned comes from a different map.
+ * @since 1.5 */
+ Node appendAsCloneWithSubtree(NodeRO toBeCloned);
+
+ /** inserts the node as a clone of toBeCloned <em>without</em> its current and/or future
+ * subtree. That is toBeCloned and the new node have children of their own.
+ * <br><em>Note:</em> Cloning works symmetrically so we could better speak of two
+ * shared nodes instead of clone and cloned since none of both is privileged.
+ * @return the new child node
+ * @throws IllegalArgumentException if
+ * a) this node (the to-be-parent) is contained in the subtree of toBeCloned,
+ * b) toBeCloned is the root node,
+ * c) toBeCloned comes from a different map.
+ * @since 1.5 */
+ Node appendAsCloneWithoutSubtree(NodeRO toBeCloned);
+
+ /** inserts the node(s) copied from clipboard as clone(s). Errors like
+ * if the clipboard doesn't contain proper content will only be reported to the log.
+ * You should prefer {@link #appendAsCloneWithSubtree(Proxy.NodeRO)} or {@link #appendAsCloneWithoutSubtree(Proxy.NodeRO)}
+ * instead if possible - they give you more control.
+ * @since 1.5 */
+ void pasteAsClone();
+
+ void delete();
+
+ void moveTo(Node parentNode);
+
+ void moveTo(Node parentNode, int position);
+
+ /** removes the given connector on both sides. */
+ void removeConnector(Connector connectorToBeRemoved);
+
+ /**
+ * A node's text is String valued. This methods provides automatic conversion to String in the same way as
+ * for {@link #setText(Object)}, that is special conversion is provided for dates and calendars, other
+ * types are converted via value.toString().
+ *
+ * If the conversion result is not valid HTML it will be automatically converted to HTML.
+ *
+ * @param details An object for conversion to String. Use null to unset the details. Works well for all types
+ * that {@link Convertible} handles, particularly {@link Convertible}s itself.
+ * @since 1.2
+ */
+ void setDetails(Object details);
+
+ /** Sets the raw (HTML) note text. */
+ void setDetailsText(String html);
+
+ /** use node.hideDetails = true/false to control visibility of details.
+ * @since 1.2 */
+ void setHideDetails(boolean hide);
+
+ void setFolded(boolean folded);
+
+ /** set to true if this node should be freely positionable:
+ * <pre>
+ * node.free = true
+ * node.style.floating = true
+ * </pre>
+ * @since 1.2 */
+ void setFree(boolean free);
+
+ void setMinimized(boolean shortened);
+
+ /**
+ * Set the note text:
+ * <ul>
+ * <li>This methods provides automatic conversion to String in a way that node.getNote().getXyz()
+ * methods will be able to convert the string properly to the wanted type.
+ * <li>Special conversion is provided for dates and calendars: They will be converted in a way that
+ * node.note.date and node.note.calendar will work. All other types are converted via value.toString().
+ * <li>If the conversion result is not valid HTML it will be automatically converted to HTML.
+ * </ul>
+ * <p>
+ * <pre>
+ * // converts numbers and other stuff with toString()
+ * node.note = 1.2
+ * assert node.note.text == "<html><body><p>1.2"
+ * assert node.note.plain == "1.2"
+ * assert node.note.num == 1.2d
+ * // == dates
+ * // a date in some non-UTC time zone
+ * def date = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ").
+ * parse("1970-01-01 00:00:00.000-0200")
+ * // converts to "1970-01-01T02:00:00.000+0000" (GMT)
+ * // - note the shift due to the different time zone
+ * // - the missing end tags don't matter for rendering
+ * node.note = date
+ * assert node.note == "<html><body><p>1970-01-01T02:00:00.000+0000"
+ * assert node.note.plain == "1970-01-01T02:00:00.000+0000"
+ * assert node.note.date == date
+ * // == remove note
+ * node.note = null
+ * assert node.note.text == null
+ * </pre>
+ * @param value An object for conversion to String. Works well for all types that {@link Convertible}
+ * handles, particularly {@link Convertible}s itself.
+ * @since 1.2 (note that the old setNoteText() did not support non-String arguments.
+ */
+ void setNote(Object value);
+
+ /** Sets the raw (HTML) note text. */
+ void setNoteText(String html);
+
+ /** If <code>value</code> is a String the node object is set to it verbatim. For all other argument types it's
+ * an alias for {@link #setObject(Object)}.
+ * <pre>
+ * node.text = '006'
+ * assert node.object.class.simpleName == "String"
+ * node.object = '006'
+ * assert node.text == '6'
+ * assert node.object.class.simpleName == "Long"
+ * </pre>
+ * @see #setObject(Object)
+ * @since 1.2, semantics changed for Strings with 1.2.17, see Mantis #1787 */
+ void setText(Object value);
+
+ /**
+ * A node's text object is normally String valued but it can be of any type since every Object can be converted
+ * to String for display. This methods provides automatic conversion to String in a way that node.to.getXyz()
+ * methods will be able to convert the string properly to the wanted type.
+ * <p>
+ * Special support is provided for numbers, dates and calendars that are stored unconverted. For display of
+ * them a standard formatter is used (use #setFormat() to change it). You may also pass {@link IFormattedObject}
+ * instances ({@link FormattedDate}, {@link FormattedNumber} or {@link FormattedObject}) directly to determine
+ * the format in one pass.
+ * <p>
+ * All other types are converted via value.toString().
+ * <p><b>Numbers</b>
+ * <pre>
+ * double number = 1.2222222d
+ * node.object = number
+ * // to enable math with node.object its type is not FormattedNumber
+ * assert node.object.class.simpleName == "Double"
+ * assert node.to.object.class.simpleName == "Double"
+ * // use globally bound TextUtils object
+ * def defaultNumberFormat = textUtils.defaultNumberFormat
+ * assert node.format != null
+ * // e.g. "1.22"
+ * assert node.text == defaultNumberFormat.format(number)
+ * assert node.to.num == number
+ * assert node.to.num + 1.0 == number + 1.0
+ * assert node.object + 1.0 == number + 1.0
+ * </pre>
+ * <p><b>Dates</b>
+ * <pre>
+ * def date = new Date(0) // when Unix time began
+ * node.object = date
+ * assert node.object.class.simpleName == "FormattedDate"
+ * assert node.to.object.class.simpleName == "FormattedDate"
+ * // use globally bound TextUtils object
+ * def defaultDateFormat = textUtils.defaultDateFormat
+ * assert node.object.toString() == defaultDateFormat.format(date)
+ * assert node.format == defaultDateFormat.pattern
+ * // e.g. "01/01/1970"
+ * assert node.text == defaultDateFormat.format(date)
+ * assert node.to.date == date
+ * </pre>
+ * <p><b>Date/Time</b>
+ * <pre>
+ * def date = new Date(0) // when Unix time began
+ * // the default format for dates does not contain a time component. Use node.dateTime to override it.
+ * node.dateTime = date
+ * assert node.object.class.simpleName == "FormattedDate"
+ * assert node.to.object.class.simpleName == "FormattedDate"
+ * // use globally bound TextUtils object
+ * def defaultDateFormat = textUtils.defaultDateTimeFormat
+ * assert node.object.toString() == defaultDateFormat.format(date)
+ * assert node.format == defaultDateFormat.pattern
+ * // e.g. "01/01/1970 01:00"
+ * assert node.text == defaultDateFormat.format(date)
+ * assert node.to.date == date
+ * </pre>
+ * @param value A not-null object.
+ * @since 1.2 */
+ void setObject(Object value);
+
+ /** sets the node text to a default formatted datetime object. (After setObject(Date) no time component is
+ * displayed so use this method if you want the time to be displayed.)
+ * @see #setObject(Object)
+ * @since 1.2 */
+ void setDateTime(Date date);
+
+ /** Converts data to a <a href="http://www.freesoft.org/CIE/RFC/1521/7.htm">BASE64</a> encoded string and
+ * sets it as this node's text. Long lines are folded to a length a bit less than 80.
+ * @since 1.2 */
+ void setBinary(byte[] data);
+
+ /** sets the format string of the formatter. It has to be appropriate for the data type of the contained object,
+ * otherwise the format is simply ignored. For instance use "dd.MM.yyyy" for dates but not for numbers:
+ * <pre>
+ * node.object = new Date()
+ * node.format = "dd.MMM.yyyy" // ok: "13.07.2011"
+ * node.format = "#.00" // still "13.07.2011". See log: "cannot format 13.07.2011 with #.00: multiple points"
+ * </pre>
+ * Numbers:
+ * <pre>
+ * node.object = 1.122
+ * node.format = "#.##" // ok: "1.12" (US, GB, ...) or "1,12" (Germany, ...)
+ * node.format = "#.0000" // ok: "1.1220" (US, GB, ...) or "1,1220" (Germany, ...)
+ * </pre>
+ * @see #setObject(Object)
+ * @since 1.2 */
+ void setFormat(String format);
+
+ void setLastModifiedAt(Date date);
+
+ void setCreatedAt(Date date);
+
+ // Attributes
+ /**
+ * Allows to set and to change attribute like array (or map) elements.
+ * See description of {@link Attributes} for details.
+ * @param value An object for conversion to String. Works well for all types that {@link Convertible}
+ * handles, particularly {@link Convertible}s itself. Use null to unset an attribute.
+ * @return the new value
+ */
+ Object putAt(String attributeName, Object value);
+
+ /** allows to set all attributes at once:
+ * <pre>
+ * node.attributes = [:] // clear the attributes
+ * assert node.attributes.size() == 0
+ * node.attributes = ["1st" : "a value", "2nd" : "another value"] // create 2 attributes
+ * assert node.attributes.size() == 2
+ * node.attributes = ["one attrib" : new Double(1.22)] // replace all attributes
+ * assert node.attributes.size() == 1
+ * assert node.attributes.getFirst("one attrib") == "1.22" // note the type conversion
+ * assert node["one attrib"] == "1.22" // here we compare Convertible with String
+ * </pre>
+ */
+ void setAttributes(java.util.Map<String, Object> attributes);
+
+ void setLeft(boolean isLeft);
+
+ /** Returns true if the node is password protected, no matter if currently accessible (password entered) or not.
+ * @since 1.3.6 */
+ boolean hasEncryption();
+
+ /** decrypts a node and remove the password protection.
+ * @since 1.3.6 */
+ void removeEncryption(String password);
+
+ /** Returns true if the node has password protection and is currently unaccessible (password has to be entered).
+ * @since 1.3.6 */
+ boolean isEncrypted();
+
+ /** encrypts a node. If the node has child nodes the branch is folded.
+ * @since 1.3.6 */
+ void encrypt(String password);
+
+ /** decrypts a node without removing the encryption.
+ * @since 1.3.6 */
+ void decrypt(String password);
+
+ /**@since 1.3.7 */
+ void setHorizontalShift(final int horizontalShift);
+
+ /**@since 1.5.6 */
+ void setHorizontalShift(Quantity<LengthUnits> verticalShift);
+
+ /** use length units like "1 cm" or "6 pt"
+ * @since 1.5.6 */
+ void setHorizontalShift(String verticalShift);
+
+ /**@since 1.3.7 */
+ void setVerticalShift(final int verticalShift);
+
+ /**@since 1.5.6 */
+ void setVerticalShift(Quantity<LengthUnits> verticalShift);
+
+ /** use length units like "1 cm" or "6 pt"
+ * @since 1.5.6 */
+ void setVerticalShift(String verticalShift);
+
+ /**@since 1.3.7 */
+ void setMinimalDistanceBetweenChildren(final int minimalDistanceBetweenChildren);
+
+ /**@since 1.5.6 */
+ void setMinimalDistanceBetweenChildren(Quantity<LengthUnits> verticalShift);
+
+ /** use length units like "1 cm" or "6 pt"
+ * @since 1.5.6 */
+ void setMinimalDistanceBetweenChildren(String verticalShift);
+
+ /**
+ * A sort method that uses the result of the Groovy closure ("block") for comparison. As this closure
+ * will be called with a node as an argument (to be referenced by <code>it</code>) the search can
+ * evaluate every node property, like attributes, icons, node text or notes.
+ * <p>
+ * Examples:
+ * <pre>
+ * // sort by details text
+ * node.sortChildrenBy{ it.details.to.plain }
+ * // sort numerically
+ * node.sortChildrenBy{ it.to.num0 }
+ * </pre>
+ * @param closure a Groovy closure that returns a Comparable value like a String. The closure will receive
+ * a NodeModel as an argument.
+ * @since 1.4.1
+ */
+ void sortChildrenBy(Closure<Comparable<Object>> closure);
+ }
+
+ /** Node's style: <code>node.style</code> - read-only. */
+ interface NodeStyleRO {
+ IStyle getStyle();
+
+ /** Returns the name of the node's style if set or null otherwise. For styles with translated names the
+ * translation key is returned to make the process robust against language setting changes.
+ * It's guaranteed that <code>node.style.name = node.style.name</code> does not change the style.
+ * @since 1.2.2 */
+ String getName();
+
+ Node getStyleNode();
+
+ Color getBackgroundColor();
+
+ /** returns HTML color spec like #ff0000 (red) or #222222 (darkgray).
+ * @since 1.2 */
+ String getBackgroundColorCode();
+
+ Edge getEdge();
+
+ Font getFont();
+
+ /** @deprecated since 1.2 - use {@link #getTextColor()} instead. */
+ Color getNodeTextColor();
+
+ /** @since 1.2 */
+ Color getTextColor();
+
+ String getTextColorCode();
+
+ /** @since 1.2 true if the floating style is set for the node (aka "free node"). */
+ boolean isFloating();
+
+ /** @since 1.2.20 */
+ int getMinNodeWidth();
+
+ /** @since 1.2.20 */
+ int getMaxNodeWidth();
+
+ /** @since 1.3.8 */
+ boolean isNumberingEnabled();
+ }
+
+ /** Node's style: <code>node.style</code> - read-write. */
+ interface NodeStyle extends NodeStyleRO {
+ void setStyle(IStyle style);
+
+ /** Selects a style by name, see menu Styles → Pre/Userdefined styles for valid style names or use
+ * {@link #getName()} to display the name of a node's style.
+ * It's guaranteed that <code>node.style.name = node.style.name</code> does not change the style.
+ * @param styleName can be the name visible in the style menu or its translation key as returned by
+ * {@link #getName()}. (Names of predefined styles are subject to translation.)
+ * Only translation keys will continue to work if the language setting is changed.
+ * @throws IllegalArgumentException if the style does not exist.
+ * @since 1.2.2 */
+ void setName(String styleName);
+
+ void setBackgroundColor(Color color);
+
+ /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
+ * @since 1.2 */
+ void setBackgroundColorCode(String rgbString);
+
+ /** @deprecated since 1.2 - use {@link #setTextColor(Color)} instead. */
+ void setNodeTextColor(Color color);
+
+ /** @since 1.2 */
+ void setTextColor(Color color);
+
+ /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
+ * @since 1.2 */
+ void setTextColorCode(String rgbString);
+
+ /** sets the floating style for the node (aka "free node"). Should normally only be applied to direct
+ * children of the root node.
+ * @since 1.2 */
+ void setFloating(boolean floating);
+
+ /** minNodeWidth in px - set to -1 to restore default.
+ * @since 1.2.20 */
+ void setMinNodeWidth(int width);
+
+ /** Set to null to restore default
+ * @since 1.5.6 */
+ void setMinNodeWidth(Quantity<LengthUnits> width);
+
+ /** use length units like "1 cm" or "6 pt"
+ * @since 1.5.6 */
+ void setMinNodeWidth(String width);
+
+ /** minNodeWidth in px - set to -1 to restore default.
+ * @since 1.2.20 */
+ void setMaxNodeWidth(int width);
+
+ /** Set to null to restore default
+ * @since 1.5.6 */
+ void setMaxNodeWidth(Quantity<LengthUnits> width);
+
+ /** use length units like "1 cm" or "6 pt"
+ * @since 1.5.6 */
+ void setMaxNodeWidth(String width);
+
+ /** @since 1.3.8 */
+ void setNumberingEnabled(boolean enabled);
+ }
+
+ public interface Properties {
+ /** Provides map-like access to properties. Note that the returned type is a
+ * {@link Convertible}, not a String as in the basic storage. Nevertheless it behaves like a String in almost
+ * all respects, that is, in Groovy scripts it understands all String methods like lenght(), matches() etc.
+ * <br>
+ * Note that unlike Attributes.getAt() this method will return <em>null</em> if the property is not set!
+ * @since 1.3.6 */
+ Convertible getAt(String key);
+
+ /**
+ * Allows to set and to change properties.
+ * @param value An object for conversion to String. Works well for all types that {@link Convertible}
+ * handles, particularly {@link Convertible}s itself. Use null to unset an attribute.
+ * @return the new value
+ * @since 1.3.6 */
+ Convertible putAt(String key, Object value);
+
+ /** returns the names of all attributes.
+ * @since 1.3.6 */
+ java.util.Set<String> keySet();
+ }
+
+ /** Reminder: <code>node.reminder</code> - read-only.
+ * <pre>
+ * def rem = node.reminder
+ * if (!rem.remindAt)
+ * c.statusInfo = "this node has no reminder"
+ * else
+ * c.statusInfo = "reminder fires at ${rem.remindAt} and then every ${rem.period} ${rem.periodUnit}"
+ * </pre> */
+ interface ReminderRO {
+ /** The timestamp when the reminder fires first. */
+ Date getRemindAt();
+ /** One of ["MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "YEAR"]. */
+ String getPeriodUnit();
+ /** Count in units of "PeriodUnit". (period=2, periodUnit="WEEK") reminds every two weeks. */
+ Integer getPeriod();
+ /** optional: a Groovy script to execute when the reminder fires. */
+ String getScript();
+ }
+
+ /** Reminder: <code>node.reminder</code> - read-write. For creating and modifying reminders:
+ * <pre>
+ * def reminder = node.reminder
+ * if (!reminder)
+ * c.statusInfo = "node has no reminder"
+ * else
+ * c.statusInfo = "node has a reminder: $reminder"
+ *
+ * def inAMinute = new Date(System.currentTimeMillis() + 60*1000)
+ * node.reminder.createOrReplace(inAMinute, "WEEK", 2)
+ * if (node.map.file) {
+ * node.reminder.setScript("loadUri(new URI('${node.map.file.toURI()}#${node.id}'))")
+ * }
+ * // a click on the node opens time management dialog
+ * node.link.text = 'menuitem:_$TimeListAction$0'
+ * </pre> */
+ interface Reminder extends ReminderRO {
+// /** Creates a new reminder. Removes existing reminders for the same node if they exist.
+// * @param remindAt The timestamp when the reminder should fire. */
+// void createOrReplace(Date remindAt);
+ /** Creates a periodic reminder. To make the reminder fire every second week:
+ * <pre>
+ * node.reminder.createOrReplace(new Date() + 1, "WEEK", 2)
+ * </pre>
+ * @param remindAt The timestamp when the reminder fires first.
+ * @param periodUnit one of ["MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "YEAR"].
+ * @param period counts the periodUnits.
+ * @throws Exception if there is no reminder yet. */
+ void createOrReplace(Date remindAt, String periodUnit, Integer period);
+
+ /** optional: a Groovy script to execute when the reminder fires.
+ * @param scriptSource the script itself, not a path to a file.
+ * @throws NullPointerException if there is no reminder yet. */
+ void setScript(String scriptSource);
+
+ /** removes a reminder from a node. It's not an error if there is no reminder to remove. */
+ void remove();
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ProxyFactory.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ProxyFactory.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ProxyFactory.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ProxyFactory.java
diff --git a/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ProxyUtils.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ProxyUtils.java
new file mode 100644
index 0000000..4699ee5
--- /dev/null
+++ b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ProxyUtils.java
@@ -0,0 +1,252 @@
+package org.freeplane.plugin.script.proxy;
+
+import groovy.lang.Closure;
+
+import java.net.URI;
+import java.util.AbstractList;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.ConcurrentModificationException;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.features.filter.condition.ASelectableCondition;
+import org.freeplane.features.filter.condition.ICondition;
+import org.freeplane.features.format.FormatController;
+import org.freeplane.features.format.FormattedDate;
+import org.freeplane.features.format.FormattedNumber;
+import org.freeplane.features.format.IFormattedObject;
+import org.freeplane.features.map.NodeModel;
+import org.freeplane.features.text.TextController;
+import org.freeplane.features.text.mindmapmode.MTextController;
+import org.freeplane.plugin.script.ScriptContext;
+import org.freeplane.plugin.script.proxy.Proxy.Node;
+
+public class ProxyUtils {
+ static List<Node> createNodeList(final List<NodeModel> list, final ScriptContext scriptContext) {
+ return new AbstractList<Node>() {
+ final private List<NodeModel> nodeModels = list;
+
+ @Override
+ public Node get(final int index) {
+ final NodeModel nodeModel = nodeModels.get(index);
+ return new NodeProxy(nodeModel, scriptContext);
+ }
+
+ @Override
+ public int size() {
+ return nodeModels.size();
+ }
+ };
+ }
+
+ static List<Node> find(final ICondition condition, final NodeModel node, final ScriptContext scriptContext) {
+ return ProxyUtils.createNodeList(ProxyUtils.findImpl(condition, node, true), scriptContext);
+ }
+
+ static List<Node> findAll(final NodeModel node, final ScriptContext scriptContext, boolean breadthFirst) {
+ return ProxyUtils.createNodeList(ProxyUtils.findImpl(null, node, breadthFirst), scriptContext);
+ }
+
+ static List<Node> find(final Closure<Boolean> closure, final NodeModel node, final ScriptContext scriptContext) {
+ return ProxyUtils.find(createCondition(closure, scriptContext), node, scriptContext);
+ }
+
+ static ICondition createCondition(final Closure<Boolean> closure, final ScriptContext scriptContext) {
+ final ICondition condition = new ASelectableCondition() {
+ public boolean checkNode(final NodeModel node) {
+ try {
+ final Boolean result = closure
+ .call(new Object[] { new NodeProxy(node, scriptContext) });
+ if (result == null) {
+ throw new RuntimeException("find(): closure returned null instead of boolean/Boolean");
+ }
+ return result;
+ }
+ catch (final ClassCastException e) {
+ throw new RuntimeException("find(): closure returned " + e.getMessage()
+ + " instead of boolean/Boolean");
+ }
+ }
+
+ @Override
+ protected String createDescription() {
+ return "<Closure>";
+ }
+
+ @Override
+ protected String getName() {
+ return "Closure";
+ }
+ };
+ return condition;
+ }
+
+ /** finds from any node downwards.
+ * @param condition if null every node will match. */
+ @SuppressWarnings("unchecked")
+ private static List<NodeModel> findImpl(final ICondition condition, final NodeModel node, boolean breadthFirst) {
+ final boolean nodeMatches = condition == null || condition.checkNode(node);
+ // a shortcut for non-matching leaves
+ if (node.isLeaf() && !nodeMatches) {
+ return Collections.EMPTY_LIST;
+ }
+ final List<NodeModel> matches = new ArrayList<NodeModel>();
+ if (nodeMatches && breadthFirst) {
+ matches.add(node);
+ }
+ final Enumeration<NodeModel> children = node.children();
+ while (children.hasMoreElements()) {
+ final NodeModel child = children.nextElement();
+ matches.addAll(ProxyUtils.findImpl(condition, child, breadthFirst));
+ }
+ if (nodeMatches && !breadthFirst) {
+ matches.add(node);
+ }
+ return matches;
+ }
+
+ public static List<Proxy.Node> createListOfChildren(final NodeModel nodeModel, final ScriptContext scriptContext) {
+ return new ArrayList<Proxy.Node>(new AbstractList<Proxy.Node>() {
+ @Override
+ public Proxy.Node get(final int index) {
+ final NodeModel child = (NodeModel) nodeModel.getChildAt(index);
+ return new NodeProxy(child, scriptContext);
+ }
+
+ @Override
+ public int size() {
+ return nodeModel.getChildCount();
+ }
+ });
+ }
+
+ /** this method is null-safe, i.e. value may be null and the result is not null. */
+ public static Convertible attributeValueToConvertible(final NodeModel nodeModel, final ScriptContext scriptContext,
+ Object value) {
+ if (value instanceof IFormattedObject)
+ value = ((IFormattedObject) value).getObject();
+ if (value instanceof Number)
+ return new ConvertibleNumber((Number) value);
+ else if (value instanceof Date)
+ return new ConvertibleDate((Date) value);
+ return new ConvertibleText(nodeModel, scriptContext, value == null ? null : value.toString());
+ }
+
+ public static Convertible nodeModelToConvertible(final NodeModel nodeModel, final ScriptContext scriptContext) {
+ Object value = nodeModel.getUserObject();
+ if (value instanceof IFormattedObject)
+ value = ((IFormattedObject) value).getObject();
+ if (value instanceof Number)
+ return new ConvertibleNumber((Number) value);
+ else if (value instanceof Date)
+ return new ConvertibleDate((Date) value);
+ return new ConvertibleNodeText(nodeModel, scriptContext);
+ }
+
+ public static <T> List<T> createList(final Collection<T> collection) {
+ return new AbstractList<T>() {
+ private int lastIndex;
+ private Iterator<T> iterator;
+ @Override
+ public T get(int index) {
+ if(index >= size())
+ throw new NoSuchElementException();
+ if(index == 0)
+ return collection.iterator().next();
+ if(iterator == null || index <= lastIndex){
+ lastIndex = -1;
+ iterator = collection.iterator();
+ }
+ try{
+ T object;
+ for(object = null; lastIndex < index; lastIndex++)
+ object = iterator.next();
+ return object;
+ }
+ catch (ConcurrentModificationException e) {
+ iterator = null;
+ return get(index);
+ }
+ }
+
+ @Override
+ public int indexOf(Object o) {
+ final Iterator<T> it = iterator();
+ int i = -1;
+ while(it.hasNext()){
+ i++;
+ final T next = it.next();
+ if(o ==next || o != null && o.equals(next))
+ return i;
+ }
+ return -1;
+ }
+
+ @Override
+ public int lastIndexOf(Object o) {
+ final Iterator<T> it = iterator();
+ int i = -1;
+ int result = -1;
+ while(it.hasNext()){
+ i++;
+ final T next = it.next();
+ if(o ==next || o != null && o.equals(next))
+ result = i;
+ }
+ return result;
+ }
+
+ @Override
+ public Iterator<T> iterator() {
+ return collection.iterator();
+ }
+
+
+ @Override
+ public int size() {
+ return collection.size();
+ }
+ };
+ }
+
+ /** used for node core texts and for attribute values. Note that it would lead to an error on reopening of a map
+ * if we would allow to assign GStrings here. So all unknown stuff is cast to String. */
+ static Object transformObject(Object objectToTransform, String pattern) {
+ final Object object = createFormattedObjectIfPossible(objectToTransform, pattern);
+ if (object instanceof IFormattedObject)
+ return object;
+ else if (object instanceof Number)
+ return new FormattedNumber((Number) object);
+ else if (object instanceof Date)
+ return createDefaultFormattedDate((Date) object);
+ else if (object instanceof Calendar)
+ return createDefaultFormattedDate(((Calendar) object).getTime());
+ else if (object instanceof URI)
+ return object;
+ else
+ return Convertible.toString(object);
+ }
+
+ private static Object createFormattedObjectIfPossible(Object object, String pattern) {
+ if (object instanceof String)
+ object = ((MTextController) TextController.getController()).guessObjectOrURI(object, pattern);
+ else if (pattern != null)
+ object = FormatController.format(object, pattern);
+ return object;
+ }
+
+ static FormattedDate createDefaultFormattedDate(final Date date) {
+ return FormattedDate.createDefaultFormattedDate(date.getTime(), IFormattedObject.TYPE_DATE);
+ }
+
+ static FormattedDate createDefaultFormattedDateTime(final Date date) {
+ return FormattedDate.createDefaultFormattedDate(date.getTime(), IFormattedObject.TYPE_DATETIME);
+ }
+}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ReminderProxy.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ReminderProxy.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ReminderProxy.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ReminderProxy.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ScriptApiTest.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ScriptApiTest.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ScriptApiTest.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ScriptApiTest.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ScriptUtils.java b/freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ScriptUtils.java
similarity index 100%
rename from freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ScriptUtils.java
rename to freeplane_plugin_script/src/main/java/org/freeplane/plugin/script/proxy/ScriptUtils.java
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/Activator.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/Activator.java
deleted file mode 100644
index b1d0053..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/Activator.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.freeplane.plugin.script;
-
-import java.util.Hashtable;
-
-import jsyntaxpane.DefaultSyntaxKit;
-import jsyntaxpane.syntaxkits.GroovySyntaxKit;
-
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.main.osgi.IModeControllerExtensionProvider;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class Activator implements BundleActivator {
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- public void start(final BundleContext context) throws Exception {
- final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
- props.put("mode", new String[] { MModeController.MODENAME });
- context.registerService(IModeControllerExtensionProvider.class.getName(),
- new IModeControllerExtensionProvider() {
- public void installExtension(ModeController modeController) {
- if(! modeController.getController().getViewController().isHeadless())
- initJSyntaxPane(context);
- new ScriptingRegistration(modeController);
- }
- }, props);
- }
-
- private void initJSyntaxPane(BundleContext context) {
- final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
- try {
- Thread.currentThread().setContextClassLoader(DefaultSyntaxKit.class.getClassLoader());
- DefaultSyntaxKit.initKit();
- final String components = "jsyntaxpane.components.PairsMarker" //
- + ", jsyntaxpane.components.LineNumbersRuler" //
- + ", jsyntaxpane.components.TokenMarker" //
- + ", org.freeplane.plugin.script.NodeIdHighLighter";
- new GroovySyntaxKit().setProperty("Components", components);
- }
- finally {
- Thread.currentThread().setContextClassLoader(contextClassLoader);
- }
-}
-
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- public void stop(final BundleContext context) throws Exception {
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/CompileTimeStrategy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/CompileTimeStrategy.java
deleted file mode 100644
index 0134536..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/CompileTimeStrategy.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2013 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.io.File;
-import java.util.Date;
-
-/**
- * @author Dimitry Polivaev
- * 15.12.2013
- */
-public class CompileTimeStrategy {
- private static final long FILE_CHECK_PERIOD = 100;
- private static final long NEVER = 0;
- private final File scriptFile;
- private long compileTime;
- private long fileModificationTime;
- private long lastFileStampCheckTime;
-
- public CompileTimeStrategy(File scriptFile) {
- this.scriptFile = scriptFile;
- compileTime = NEVER;
- fileModificationTime = NEVER;
- lastFileStampCheckTime = NEVER;
- }
-
- /** mark the beginning of a script compile run */
- public void scriptCompileStart() {
- compileTime = NEVER;
- }
-
- /** mark the end of a successful script compile run */
- public void scriptCompiled() {
- assert (compileTime == NEVER);
- compileTime = now();
- }
-
- private long now() {
- return new Date().getTime();
- }
-
- public boolean canUseOldCompiledScript() {
- if (compileTime == NEVER)
- return false;
- if (scriptFile == null)
- return true;
- long now = now();
- if (now - lastFileStampCheckTime < FILE_CHECK_PERIOD)
- return true;
- lastFileStampCheckTime = now;
- if (!scriptFile.canRead())
- return false;
- fileModificationTime = scriptFile.lastModified();
- boolean canUseOldCompiledScript = compileTime >= fileModificationTime;
- return canUseOldCompiledScript;
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptAction.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptAction.java
deleted file mode 100644
index 8817b78..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ExecuteScriptAction.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Volker Boerchers
- *
- * This file author is Volker Boerchers
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-
-/**
- * Action that executes a script defined by filename.
- *
- * @author vboerchers
- */
-public class ExecuteScriptAction extends AFreeplaneAction {
- private static final long serialVersionUID = 1L;
-
- /** controls how often a script is executed in case of a multi selection. */
- public enum ExecutionMode {
- /** once with <code>node</code> set to one selected (random) node. */
- ON_SINGLE_NODE,
- /** n times for n selected nodes, once for each node. */
- ON_SELECTED_NODE,
- /** script on every selected node and recursively on all of its children. */
- ON_SELECTED_NODE_RECURSIVELY
- }
-
- private final File scriptFile;
- private final ExecutionMode mode;
- private final IScript script;
-
- public ExecuteScriptAction(final String scriptName, final String menuItemName, final String scriptFile,
- final ExecutionMode mode, final boolean cacheContent, ScriptingPermissions permissions) {
- super(ExecuteScriptAction.makeMenuItemKey(scriptName, mode), menuItemName, null);
- this.scriptFile = new File(scriptFile);
- this.mode = mode;
- script = ScriptingEngine.createScriptForFile(this.scriptFile, permissions);
- }
-
- public static String makeMenuItemKey(final String scriptName, final ExecutionMode mode) {
- return scriptName + "_" + mode.toString().toLowerCase();
- }
-
- @Override
- public void actionPerformed(final ActionEvent e) {
- Controller.getCurrentController().getViewController().setWaitingCursor(true);
- try {
- final List<NodeModel> nodes = new ArrayList<NodeModel>();
- if (mode == ExecutionMode.ON_SINGLE_NODE) {
- nodes.add(Controller.getCurrentController().getSelection().getSelected());
- }
- else {
- nodes.addAll(Controller.getCurrentController().getSelection().getSelection());
- }
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- modeController.startTransaction();
- for (final NodeModel node : nodes) {
- try {
- if (mode == ExecutionMode.ON_SELECTED_NODE_RECURSIVELY) {
- // TODO: ensure that a script is invoked only once on every node?
- // (might be a problem with recursive actions if parent and child
- // are selected.)
- executeScriptRecursive(node);
- }
- else {
- script.execute(node);
- }
- }
- catch (ExecuteScriptException ex) {
- final String cause;
- // The ExecuteScriptException should have a cause. Print
- // that, it is what we want to know.
- if (ex.getCause() != null) {
- if (ex.getCause().getCause() != null) {
- LogUtils.warn("ExecuteScriptAction failed:", ex.getCause().getCause());
- cause = ex.getCause().getCause().toString();
- } else {
- LogUtils.warn("ExecuteScriptAction failed:", ex.getCause());
- cause = ex.getCause().toString();
- }
- }
- else {
- LogUtils.warn("ExecuteScriptAction failed:", ex);
- cause = ex.toString();
- }
- LogUtils.warn("error executing script " + scriptFile + " - giving up\n" + cause);
- modeController.delayedRollback();
- ScriptingEngine.showScriptExceptionErrorMessage(ex);
- return;
- }
- }
- modeController.delayedCommit();
- }
- finally {
- Controller.getCurrentController().getViewController().setWaitingCursor(false);
- }
- }
-
- private void executeScriptRecursive(final NodeModel node) {
- ModeController modeController = Controller.getCurrentModeController();
- final NodeModel[] children = modeController.getMapController().childrenUnfolded(node)
- .toArray(new NodeModel[] {});
- for (final NodeModel child : children) {
- executeScriptRecursive(child);
- }
- script.execute(node);
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/FormulaUtils.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/FormulaUtils.java
deleted file mode 100644
index 1da7663..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/FormulaUtils.java
+++ /dev/null
@@ -1,163 +0,0 @@
-package org.freeplane.plugin.script;
-
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.plugin.script.proxy.FormulaCache;
-
-public class FormulaUtils {
- // don't let caching use too much memory - but currently there are little means to cope with unavailable
- // dependency data. It has to be tested but it should "only" lead to some missing updates.
- private static final boolean ENABLE_CACHING = !Controller.getCurrentController().getResourceController()
- .getBooleanProperty("formula_disable_caching");
- static final boolean DEBUG_FORMULA_EVALUATION = false;
-
- /** evaluate text as a script if it starts with '='.
- * @return the evaluation result for script and the original text otherwise
- * @throws ExecuteScriptException */
- public static Object evalIfScript(final NodeModel nodeModel, ScriptContext scriptContext, final String text){
- if (containsFormula(text)) {
- scriptContext = (scriptContext == null) ? new ScriptContext() : scriptContext;
- return eval(nodeModel, scriptContext, text.substring(1));
- }
- else {
- return text;
- }
- }
-
- public static Object safeEvalIfScript(final NodeModel nodeModel, ScriptContext scriptContext, String text) {
- try {
- return evalIfScript(nodeModel, scriptContext, text);
- }
- catch (Exception e) {
- LogUtils.info("could not interpret as a formula (ignored): " + text + " due to " + e.getMessage());
- return text;
- }
- }
-
- public static boolean containsFormula(final String text) {
- return text != null && text.length() > 2 && text.charAt(0) == '=' && text.charAt(1) != '=';
- }
-
- public static boolean containsFormulaCheckHTML(String text) {
- if(HtmlUtils.isHtmlNode(text))
- return htmlContainsFormula(text);
- else
- return containsFormula(text);
- }
-
- private static Pattern FIRST_CHARACTER_IN_HTML = Pattern.compile("(?m)>\\s*[^<\\s]");
- private static boolean htmlContainsFormula(String text) {
- final Matcher matcher = FIRST_CHARACTER_IN_HTML.matcher(text);
- return matcher.find() && text.charAt(matcher.end()-1) == '=';
- }
-
- /** evaluate text as a script.
- * @return the evaluation result.
- * @throws ExecuteScriptException */
- public static Object eval(final NodeModel nodeModel, final ScriptContext scriptContext, final String text) {
- if (DEBUG_FORMULA_EVALUATION)
- System.err.println("eval " + nodeModel.getID() + ": " + text);
- if (!scriptContext.push(nodeModel, text)) {
- throw new StackOverflowError(TextUtils.format("formula.error.circularReference",
- HtmlUtils.htmlToPlain(scriptContext.getStackFront().getText())));
- }
- final ScriptingPermissions restrictedPermissions = ScriptingPermissions.getFormulaPermissions();
- try {
- if (ENABLE_CACHING) {
- final FormulaCache formulaCache = getFormulaCache(nodeModel.getMap());
- Object value = formulaCache.get(nodeModel, text);
- if (value == null) {
- try {
- value = ScriptingEngine.executeScript(nodeModel, text, scriptContext, restrictedPermissions);
- formulaCache.put(nodeModel, text, value);
- if (DEBUG_FORMULA_EVALUATION)
- System.err.println("eval: cache miss: recalculated: " + text);
- }
- catch (ExecuteScriptException e) {
- formulaCache.put(nodeModel, text, e);
- if (DEBUG_FORMULA_EVALUATION)
- System.err.println("eval: cache miss: exception for: " + text);
- throw e;
- }
- }
- else {
- if (DEBUG_FORMULA_EVALUATION)
- System.err.println("eval: cache hit for: " + text);
- scriptContext.accessNode(nodeModel);
- }
- return value;
- }
- else {
- return ScriptingEngine.executeScript(nodeModel, text, scriptContext, restrictedPermissions);
- }
- }
- finally {
- scriptContext.pop();
- }
- }
-
- public static List<NodeModel> manageChangeAndReturnDependencies(boolean includeChanged, final NodeModel... nodes) {
- final ArrayList<NodeModel> dependencies = new ArrayList<NodeModel>();
- for (int i = 0; i < nodes.length; i++) {
- final LinkedHashSet<NodeModel> nodeDependencies = new LinkedHashSet<NodeModel>(0);
- getEvaluationDependencies(nodes[i].getMap()).getDependencies(nodeDependencies, nodes[i]);
- if (nodeDependencies != null)
- dependencies.addAll(nodeDependencies);
- if (includeChanged)
- dependencies.add(nodes[i]);
- }
- if (ENABLE_CACHING) {
- for (NodeModel nodeModel : dependencies) {
- getFormulaCache(nodeModel.getMap()).markAsDirtyIfFormulaNode(nodeModel);
- }
- }
- return dependencies;
- }
-
- private static FormulaCache getFormulaCache(MapModel map) {
- FormulaCache formulaCache = (FormulaCache) map.getExtension(FormulaCache.class);
- if (formulaCache == null) {
- formulaCache = new FormulaCache();
- map.addExtension(formulaCache);
- }
- return formulaCache;
- }
-
- private static EvaluationDependencies getEvaluationDependencies(MapModel map) {
- EvaluationDependencies dependencies = (EvaluationDependencies) map.getExtension(EvaluationDependencies.class);
- if (dependencies == null) {
- dependencies = new EvaluationDependencies();
- map.addExtension(dependencies);
- }
- return dependencies;
- }
-
- public static void accessNode(NodeModel accessingNode, NodeModel accessedNode) {
- getEvaluationDependencies(accessingNode.getMap()).accessNode(accessingNode, accessedNode);
- }
-
- public static void accessBranch(NodeModel accessingNode, NodeModel accessedNode) {
- getEvaluationDependencies(accessingNode.getMap()).accessBranch(accessingNode, accessingNode);
- }
-
- public static void accessAll(NodeModel accessingNode) {
- getEvaluationDependencies(accessingNode.getMap()).accessAll(accessingNode);
- }
-
- public static void clearCache(MapModel map) {
- if (DEBUG_FORMULA_EVALUATION)
- System.out.println("clearing formula cache for " + map.getTitle());
- map.removeExtension(FormulaCache.class);
- map.removeExtension(EvaluationDependencies.class);
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/FreeplaneScriptBaseClass.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/FreeplaneScriptBaseClass.java
deleted file mode 100644
index e20871b..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/FreeplaneScriptBaseClass.java
+++ /dev/null
@@ -1,289 +0,0 @@
-package org.freeplane.plugin.script;
-
-import groovy.lang.Binding;
-import groovy.lang.MetaClass;
-import groovy.lang.MissingMethodException;
-import groovy.lang.MissingPropertyException;
-import groovy.lang.Script;
-
-import java.net.URI;
-import java.util.Date;
-import java.util.Map;
-import java.util.Properties;
-import java.util.ResourceBundle;
-import java.util.regex.Pattern;
-
-import org.codehaus.groovy.runtime.DefaultGroovyMethods;
-import org.codehaus.groovy.runtime.InvokerHelper;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.MenuUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.format.ScannerController;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.plugin.script.proxy.Convertible;
-import org.freeplane.plugin.script.proxy.Proxy;
-
-/** All methods of this class are available as "global" methods in every script.
- * Only documented methods are meant to be used in scripts.
- * <p>The following global objects are provided as shortcuts by the binding of this class:
- * <ul>
- * <li><b>ui:</b> see {@link UITools}</li>
- * <li><b>logger:</b> see {@link LogUtils}</li>
- * <li><b>htmlUtils:</b> see {@link HtmlUtils}</li>
- * <li><b>textUtils:</b> see {@link TextUtils}</li>
- * <li><b>menuUtils:</b> see {@link MenuUtils}</li>
- * <li><b>config:</b> see {@link ConfigProperties}</li>
- * </ul>
- * The following classes may also be useful in scripting:
- * <ul>
- * <li>{@link FreeplaneVersion}</li>
- * </ul>
- */
-public abstract class FreeplaneScriptBaseClass extends Script {
- /**
- * Accessor for Freeplane's configuration: In scripts available
- * as "global variable" <code>config</code>.
- */
- public static class ConfigProperties {
- public boolean getBooleanProperty(final String name) {
- return ResourceController.getResourceController().getBooleanProperty(name);
- }
-
- public double getDoubleProperty(final String name, final double defaultValue) {
- return ResourceController.getResourceController().getDoubleProperty(name, defaultValue);
- }
-
- public int getIntProperty(final String name) {
- return ResourceController.getResourceController().getIntProperty(name);
- }
-
- public int getIntProperty(final String name, final int defaultValue) {
- return ResourceController.getResourceController().getIntProperty(name, defaultValue);
- }
-
- public long getLongProperty(final String name, final int defaultValue) {
- return ResourceController.getResourceController().getLongProperty(name, defaultValue);
- }
-
- public String getProperty(final String name) {
- return ResourceController.getResourceController().getProperty(name);
- }
-
- public String getProperty(final String name, final String defaultValue) {
- return ResourceController.getResourceController().getProperty(name, defaultValue);
- }
-
- public Properties getProperties() {
- return ResourceController.getResourceController().getProperties();
- }
-
- /** support config['key'] from Groovy. */
- public String getAt(final String name) {
- return getProperty(name);
- }
-
- public ResourceBundle getResources() {
- return ResourceController.getResourceController().getResources();
- }
-
- public String getFreeplaneUserDirectory() {
- return ResourceController.getResourceController().getFreeplaneUserDirectory();
- }
- }
-
- private final Pattern nodeIdPattern = Pattern.compile("ID_\\d+");
- private final MetaClass nodeMetaClass;
- private Map<Object, Object> boundVariables;
- private Proxy.NodeRO node;
- private Proxy.ControllerRO controller;
-
-
- public FreeplaneScriptBaseClass() {
- super();
- nodeMetaClass = InvokerHelper.getMetaClass(Proxy.NodeRO.class);
- // Groovy rocks!
- DefaultGroovyMethods.mixin(Number.class, NodeArithmeticsCategory.class);
- initBinding();
- }
-
- @SuppressWarnings("unchecked")
- public void initBinding() {
- boundVariables = super.getBinding().getVariables();
- // this is important: we need this reference no matter if "node" is overridden later by the user
- node = (Proxy.NodeRO) boundVariables.get("node");
- controller = (Proxy.ControllerRO) boundVariables.get("c");
- }
-
- @Override
- public void setBinding(Binding binding) {
- super.setBinding(addStaticBindings(binding));
- initBinding();
- }
-
- private Binding addStaticBindings(Binding binding) {
- binding.setProperty("logger", new LogUtils());
- binding.setProperty("ui", new UITools());
- binding.setProperty("htmlUtils", HtmlUtils.getInstance());
- binding.setProperty("textUtils", new TextUtils());
- binding.setProperty("menuUtils", new MenuUtils());
- binding.setProperty("config", new ConfigProperties());
- return binding;
- }
-
- /* <ul>
- * <li> translate raw node ids to nodes.
- * <li> "imports" node's methods into the script's namespace
- * </ul>
- */
- public Object getProperty(String property) {
- // shortcuts for the most usual cases
- if (property.equals("node")) {
- return node;
- }
- if (property.equals("c")) {
- return controller;
- }
- if (nodeIdPattern.matcher(property).matches()) {
- return N(property);
- }
- else {
- final Object boundValue = boundVariables.get(property);
- if (boundValue != null) {
- return boundValue;
- }
- else {
- try {
- return nodeMetaClass.getProperty(node, property);
- }
- catch (MissingPropertyException e) {
- return super.getProperty(property);
- }
- }
- }
- }
-
- /*
- * extends super class version by node instance methods.
- */
- public Object invokeMethod(String methodName, Object args) {
- try {
- return super.invokeMethod(methodName, args);
- }
- catch (MissingMethodException mme) {
- try {
- return nodeMetaClass.invokeMethod(node, methodName, args);
- }
- catch (MissingMethodException e) {
- throw e;
- }
- }
- }
-
- /** Shortcut for node.map.node(id) - necessary for ids to other maps. */
- public Proxy.NodeRO N(String id) {
- final Proxy.NodeRO node = (Proxy.NodeRO) getBinding().getVariable("node");
- return node.getMap().node(id);
- }
-
- /** Shortcut for node.map.node(id).text. */
- public String T(String id) {
- final Proxy.NodeRO n = N(id);
- return n == null ? null : n.getText();
- }
-
- /** Shortcut for node.map.node(id).value. */
- public Object V(String id) {
- final Proxy.NodeRO n = N(id);
- try {
- return n == null ? null : n.getValue();
- }
- catch (ExecuteScriptException e) {
- return null;
- }
- }
-
- /** returns valueIfNull if value is null and value otherwise. */
- public Object ifNull(Object value, Object valueIfNull) {
- return value == null ? valueIfNull : value;
- }
-
- /** rounds a number to integral type. */
- public Long round(final Double d) {
- if (d == null)
- return null;
- return Math.round(d);
- }
-
- /** round to the given number of decimal places: <code>round(0.1234, 2) -> 0.12</code> */
- public Double round(final Double d, final int precision) {
- if (d == null)
- return d;
- double factor = 1;
- for (int i = 0; i < precision; i++) {
- factor *= 10.;
- }
- return Math.round(d * factor) / factor;
- }
-
- /** parses text to the proper data type, if possible, setting format to the standard. Parsing is configured via
- * config file scanner.xml
- * <pre>
- * assert parse('2012-11-30') instanceof Date
- * assert parse('1.22') instanceof Number
- * // if parsing fails the original string is returned
- * assert parse('2012XX11-30') == '2012XX11-30'
- *
- * def d = parse('2012-10-30')
- * c.statusInfo = "${d} is ${new Date() - d} days ago"
- * </pre> */
- public Object parse(final String text) {
- return ScannerController.getController().parse(text);
- }
-
- /** uses formatString to return a FormattedObject.
- * <p><em>Note:</em> If you want to format the node core better use the format node attribute instead:
- * <pre>
- * node.object = new Date()
- * node.format = 'dd/MM/yy'
- * </pre>
- * @return {@link IFormattedObject} if object is formattable and the unchanged object otherwise. */
- public Object format(final Object object, final String formatString) {
- return FormatController.format(object, formatString);
- }
-
- /** Applies default date-time format for dates or default number format for numbers. All other objects are left unchanged.
- * @return {@link IFormattedObject} if object is formattable and the unchanged object otherwise. */
- public Object format(final Object object) {
- return FormatController.formatUsingDefault(object);
- }
-
- /** Applies default date format (instead of standard date-time) format on the given date.
- * @return {@link IFormattedObject} if object is formattable and the unchanged object otherwise. */
- public Object formatDate(final Date date) {
- final String format = FormatController.getController().getDefaultDateFormat().toPattern();
- return FormatController.format(date, format);
- }
-
- /** formats according to the internal standard, that is the conversion will be reversible
- * for types that are handled special by the scripting api namely Dates and Numbers.
- * @see Convertible#toString(Object) */
- public String toString(final Object o) {
- return Convertible.toString(o);
- }
-
- /** opens a {@link URI} */
- public void loadUri(final URI uri) {
- LinkController.getController().loadURI(uri);
- }
-
-// /** Shortcut for new {@link org.freeplane.plugin.script.proxy.Convertible}. */
-// public Convertible convertible(String string) {
-// return new Convertible(FormulaUtils.eval string, node.get);
-// }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/GenericScript.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/GenericScript.java
deleted file mode 100644
index c05b545..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/GenericScript.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.PrintStream;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.script.Bindings;
-import javax.script.Compilable;
-import javax.script.CompiledScript;
-import javax.script.ScriptEngine;
-import javax.script.ScriptEngineManager;
-import javax.script.ScriptException;
-import javax.script.SimpleScriptContext;
-
-import org.apache.commons.io.FilenameUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.main.application.FreeplaneSecurityManager;
-import org.freeplane.plugin.script.proxy.ProxyFactory;
-
-/**
- * Implements scripting via JSR233 implementation for all other languages except Groovy.
- */
-public class GenericScript implements IScript {
- final private String script;
- private final ScriptingPermissions specificPermissions;
- private CompiledScript compiledScript;
- private Throwable errorsInScript;
- private IFreeplaneScriptErrorHandler errorHandler;
- private PrintStream outStream;
- private ScriptContext scriptContext;
- private final static Object scriptEngineManagerMutex = new Object();
- private static ScriptEngineManager scriptEngineManager;
- private static URLClassLoader classLoader;
- private final ScriptEngine engine;
- private boolean compilationEnabled = true;
- private CompileTimeStrategy compileTimeStrategy;
-
- public GenericScript(String script, ScriptEngine engine, ScriptingPermissions permissions) {
- this.script = script;
- this.specificPermissions = permissions;
- this.engine = engine;
- compiledScript = null;
- errorsInScript = null;
- errorHandler = ScriptResources.IGNORING_SCRIPT_ERROR_HANDLER;
- outStream = System.out;
- scriptContext = null;
- compileTimeStrategy = new CompileTimeStrategy(null);
- }
-
- public GenericScript(String script, String scriptEngineName, ScriptingPermissions permissions) {
- this(script, findScriptEngine(scriptEngineName), permissions);
- }
-
- public GenericScript(File scriptFile, ScriptingPermissions permissions) {
- this(slurpFile(scriptFile), findScriptEngine(scriptFile), permissions);
- engine.put(ScriptEngine.FILENAME, scriptFile.toString());
- compilationEnabled = !disableScriptCompilation(scriptFile);
- compileTimeStrategy = new CompileTimeStrategy(scriptFile);
- }
-
- private static String slurpFile(File scriptFile) {
- try {
- return FileUtils.slurpFile(scriptFile);
- }
- catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public IScript setErrorHandler(IFreeplaneScriptErrorHandler pErrorHandler) {
- this.errorHandler = pErrorHandler;
- return this;
- }
-
- @Override
- public IScript setOutStream(PrintStream outStream) {
- this.outStream = outStream;
- return this;
- }
-
- @Override
- public IScript setScriptContext(ScriptContext scriptContext) {
- this.scriptContext = scriptContext;
- return this;
- }
-
- @Override
- public Object getScript() {
- return script;
- }
-
- @Override
- public Object execute(final NodeModel node) {
- try {
- if (errorsInScript != null && compileTimeStrategy.canUseOldCompiledScript()) {
- throw new ExecuteScriptException(errorsInScript.getMessage(), errorsInScript);
- }
- final ScriptingSecurityManager scriptingSecurityManager = createScriptingSecurityManager();
- final ScriptingPermissions originalScriptingPermissions = new ScriptingPermissions(ResourceController
- .getResourceController().getProperties());
- final FreeplaneSecurityManager securityManager = (FreeplaneSecurityManager) System.getSecurityManager();
- final boolean needToSetFinalSecurityManager = securityManager.needToSetFinalSecurityManager();
- final PrintStream oldOut = System.out;
- try {
- final SimpleScriptContext context = createScriptContext(node);
- if (compilationEnabled && engine instanceof Compilable) {
- compileAndCache((Compilable) engine);
- if (needToSetFinalSecurityManager)
- securityManager.setFinalSecurityManager(scriptingSecurityManager);
- System.setOut(outStream);
- return compiledScript.eval(context);
- }
- else {
- if (needToSetFinalSecurityManager)
- securityManager.setFinalSecurityManager(scriptingSecurityManager);
- System.setOut(outStream);
- return engine.eval(script, context);
- }
- }
- finally {
- System.setOut(oldOut);
- if (needToSetFinalSecurityManager && securityManager.hasFinalSecurityManager())
- securityManager.removeFinalSecurityManager(scriptingSecurityManager);
- /* restore preferences (and assure that the values are unchanged!). */
- originalScriptingPermissions.restorePermissions();
- }
- }
- catch (final ScriptException e) {
- handleScriptRuntimeException(e);
- // :fixme: This throw is only reached, if handleScriptRuntimeException
- // does not raise an exception. Should it be here at all?
- // And if: Shouldn't it raise an ExecuteScriptException?
- throw new RuntimeException(e);
- }
- catch (final Throwable e) {
- if (Controller.getCurrentController().getSelection() != null)
- Controller.getCurrentModeController().getMapController().select(node);
- throw new ExecuteScriptException(e.getMessage(), e);
- }
- }
-
- private ScriptingSecurityManager createScriptingSecurityManager() {
- return new ScriptSecurity(script, specificPermissions, outStream).getScriptingSecurityManager();
- }
-
- private boolean disableScriptCompilation(File scriptFile) {
- return FilenameUtils.isExtension(scriptFile.getName(), ScriptResources.SCRIPT_COMPILATION_DISABLED_EXTENSIONS);
- }
-
- private SimpleScriptContext createScriptContext(final NodeModel node) {
- final SimpleScriptContext context = new SimpleScriptContext();
- final OutputStreamWriter outWriter = new OutputStreamWriter(outStream);
- context.setWriter(outWriter);
- context.setErrorWriter(outWriter);
- context.setBindings(createBinding(node), javax.script.ScriptContext.ENGINE_SCOPE);
- return context;
- }
-
- private Bindings createBinding(final NodeModel node) {
- final Bindings binding = engine.createBindings();
- binding.put("c", ProxyFactory.createController(scriptContext));
- binding.put("node", ProxyFactory.createNode(node, scriptContext));
- return binding;
- }
-
- static ScriptEngineManager getScriptEngineManager() {
- synchronized (scriptEngineManagerMutex) {
- if (scriptEngineManager == null) {
- final ClassLoader classLoader = createClassLoader();
- scriptEngineManager = new ScriptEngineManager(classLoader);
- }
- return scriptEngineManager;
- }
- }
-
- private static ClassLoader createClassLoader() {
- if (classLoader == null) {
- final List<String> classpath = ScriptResources.getClasspath();
- final List<URL> urls = new ArrayList<URL>();
- for (String path : classpath) {
- urls.add(pathToUrl(path));
- }
- classLoader = URLClassLoader.newInstance(urls.toArray(new URL[urls.size()]),
- GenericScript.class.getClassLoader());
- }
- return classLoader;
- }
-
- private static URL pathToUrl(String path) {
- try {
- return new File(path).toURI().toURL();
- }
- catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
-
- private void compileAndCache(Compilable engine) throws Throwable {
- if (compileTimeStrategy.canUseOldCompiledScript())
- return;
- compiledScript = null;
- errorsInScript = null;
- try {
- compileTimeStrategy.scriptCompileStart();
- compiledScript = engine.compile(script);
- compileTimeStrategy.scriptCompiled();
- }
- catch (Throwable e) {
- errorsInScript = e;
- throw e;
- }
- }
-
- private static ScriptEngine findScriptEngine(String scriptEngineName) {
- final ScriptEngineManager manager = getScriptEngineManager();
- return checkNotNull(manager.getEngineByName(scriptEngineName), "name", scriptEngineName);
- }
-
- private static ScriptEngine findScriptEngine(File scriptFile) {
- final ScriptEngineManager manager = getScriptEngineManager();
- final String extension = FilenameUtils.getExtension(scriptFile.getName());
- return checkNotNull(manager.getEngineByExtension(extension), "extension", extension);
- }
-
- private static ScriptEngine checkNotNull(final ScriptEngine motor, String what, String detail) {
- if (motor == null)
- throw new RuntimeException("can't load script engine by " + what + ": " + detail);
- return motor;
- }
-
- private void handleScriptRuntimeException(final ScriptException e) {
- outStream.print("message: " + e.getMessage());
- int lineNumber = e.getLineNumber();
- outStream.print("Line number: " + lineNumber);
- errorHandler.gotoLine(lineNumber);
- throw new ExecuteScriptException(e.getMessage() + " at line " + lineNumber,
- // The ScriptException should have a cause. Use
- // that, it is what we want to know.
- (e.getCause() == null) ? e : e.getCause());
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/GroovyScript.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/GroovyScript.java
deleted file mode 100644
index aabf672..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/GroovyScript.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import groovy.lang.Binding;
-import groovy.lang.GroovyRuntimeException;
-import groovy.lang.GroovyShell;
-import groovy.lang.Script;
-
-import java.io.File;
-import java.io.PrintStream;
-import java.util.regex.Matcher;
-
-import org.codehaus.groovy.ast.ASTNode;
-import org.codehaus.groovy.ast.ModuleNode;
-import org.codehaus.groovy.control.CompilerConfiguration;
-import org.codehaus.groovy.runtime.InvokerHelper;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.main.application.FreeplaneSecurityManager;
-import org.freeplane.plugin.script.proxy.ProxyFactory;
-
-/**
- * Special scripting implementation for Groovy.
- */
-public class GroovyScript implements IScript {
- final private Object script;
- private final ScriptingPermissions specificPermissions;
- private Script compiledScript;
- private Throwable errorsInScript;
- private IFreeplaneScriptErrorHandler errorHandler;
- private PrintStream outStream;
- private ScriptContext scriptContext;
- private CompileTimeStrategy compileTimeStrategy;
-
- public GroovyScript(String script) {
- this((Object) script);
- }
-
- public GroovyScript(File script) {
- this((Object) script);
- compileTimeStrategy = new CompileTimeStrategy(script);
- }
-
- public GroovyScript(String script, ScriptingPermissions permissions) {
- this((Object) script, permissions);
- }
-
- public GroovyScript(File script, ScriptingPermissions permissions) {
- this((Object) script, permissions);
- compileTimeStrategy = new CompileTimeStrategy(script);
- }
-
- private GroovyScript(Object script, ScriptingPermissions permissions) {
- super();
- this.script = script;
- this.specificPermissions = permissions;
- compiledScript = null;
- errorsInScript = null;
- errorHandler = ScriptResources.IGNORING_SCRIPT_ERROR_HANDLER;
- outStream = System.out;
- scriptContext = null;
- compileTimeStrategy = new CompileTimeStrategy(null);
- }
-
- private GroovyScript(Object script) {
- this(script, null);
- }
-
- @Override
- public IScript setErrorHandler(IFreeplaneScriptErrorHandler pErrorHandler) {
- this.errorHandler = pErrorHandler;
- return this;
- }
-
- @Override
- public IScript setOutStream(PrintStream outStream) {
- this.outStream = outStream;
- return this;
- }
-
- @Override
- public IScript setScriptContext(ScriptContext scriptContext) {
- this.scriptContext = scriptContext;
- return this;
- }
-
- @Override
- public Object getScript() {
- return script;
- }
-
- public Script getCompiledScript() {
- return compiledScript;
- }
-
- @Override
- public Object execute(final NodeModel node) {
- try {
- if (errorsInScript != null && compileTimeStrategy.canUseOldCompiledScript()) {
- throw new ExecuteScriptException(errorsInScript.getMessage(), errorsInScript);
- }
- final ScriptingSecurityManager scriptingSecurityManager = createScriptingSecurityManager();
- final ScriptingPermissions originalScriptingPermissions = new ScriptingPermissions(ResourceController
- .getResourceController().getProperties());
- final FreeplaneSecurityManager securityManager = (FreeplaneSecurityManager) System.getSecurityManager();
- final boolean needToSetFinalSecurityManager = securityManager.needToSetFinalSecurityManager();
- final PrintStream oldOut = System.out;
- try {
- compileAndCache();
- final Binding binding = createBinding(node);
- compiledScript.setBinding(binding);
- if (needToSetFinalSecurityManager)
- securityManager.setFinalSecurityManager(scriptingSecurityManager);
- System.setOut(outStream);
- return compiledScript.run();
- }
- finally {
- System.setOut(oldOut);
- if (needToSetFinalSecurityManager && securityManager.hasFinalSecurityManager())
- securityManager.removeFinalSecurityManager(scriptingSecurityManager);
- /* restore preferences (and assure that the values are unchanged!). */
- originalScriptingPermissions.restorePermissions();
- }
- }
- catch (final GroovyRuntimeException e) {
- handleScriptRuntimeException(e);
- // :fixme: This throw is only reached, if handleScriptRuntimeException
- // does not raise an exception. Should it be here at all?
- // And if: Shouldn't it raise an ExecuteScriptException?
- throw new RuntimeException(e);
- }
- catch (final Throwable e) {
- if (Controller.getCurrentController().getSelection() != null)
- Controller.getCurrentModeController().getMapController().select(node);
- throw new ExecuteScriptException(e.getMessage(), e);
- }
- }
-
- private ScriptingSecurityManager createScriptingSecurityManager() {
- return new ScriptSecurity(script, specificPermissions, outStream).getScriptingSecurityManager();
- }
-
- private Script compileAndCache() throws Throwable {
- if (compileTimeStrategy.canUseOldCompiledScript())
- return compiledScript;
- removeOldScript();
- errorsInScript = null;
- if (script instanceof Script)
- return (Script) script;
- else
- try {
- final Binding binding = createBindingForCompilation();
- final ClassLoader classLoader = GroovyScript.class.getClassLoader();
- final GroovyShell shell = new GroovyShell(classLoader, binding, createCompilerConfiguration());
- compileTimeStrategy.scriptCompileStart();
- if (script instanceof String)
- compiledScript = shell.parse((String) script);
- else if (script instanceof File)
- compiledScript = shell.parse((File) script);
- else
- throw new IllegalArgumentException();
- compileTimeStrategy.scriptCompiled();
- return compiledScript;
- }
- catch (Throwable e) {
- errorsInScript = e;
- throw e;
- }
- }
-
- private void removeOldScript() {
- if (compiledScript != null) {
- InvokerHelper.removeClass(compiledScript.getClass());
- compiledScript = null;
- }
- }
-
- private Binding createBinding(final NodeModel node) {
- final Binding binding = new Binding();
- binding.setVariable("c", ProxyFactory.createController(scriptContext));
- binding.setVariable("node", ProxyFactory.createNode(node, scriptContext));
- return binding;
- }
-
- private Binding createBindingForCompilation() {
- final Binding binding = new Binding();
- binding.setVariable("c", null);
- binding.setVariable("node", null);
- return binding;
- }
-
- private void handleScriptRuntimeException(final GroovyRuntimeException e) {
- outStream.print("message: " + e.getMessage());
- final ModuleNode module = e.getModule();
- final ASTNode astNode = e.getNode();
- int lineNumber = -1;
- if (module != null) {
- lineNumber = module.getLineNumber();
- }
- else if (astNode != null) {
- lineNumber = astNode.getLineNumber();
- }
- else {
- lineNumber = findLineNumberInString(e.getMessage(), lineNumber);
- }
- outStream.print("Line number: " + lineNumber);
- errorHandler.gotoLine(lineNumber);
- throw new ExecuteScriptException(e.getMessage() + " at line " + lineNumber, e);
- }
-
- static CompilerConfiguration createCompilerConfiguration() {
- CompilerConfiguration config = new CompilerConfiguration();
- config.setScriptBaseClass(FreeplaneScriptBaseClass.class.getName());
- if (!(ScriptResources.getClasspath() == null || ScriptResources.getClasspath().isEmpty())) {
- config.setClasspathList(ScriptResources.getClasspath());
- }
- return config;
- }
-
- private int findLineNumberInString(final String resultString, int lineNumber) {
- final java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(".*@ line ([0-9]+).*",
- java.util.regex.Pattern.DOTALL);
- final Matcher matcher = pattern.matcher(resultString);
- if (matcher.matches()) {
- lineNumber = Integer.parseInt(matcher.group(1));
- }
- return lineNumber;
- }
-
- @Override
- protected void finalize() throws Throwable {
- removeOldScript();
- super.finalize();
- }
-
-
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/IFreeplaneScriptErrorHandler.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/IFreeplaneScriptErrorHandler.java
deleted file mode 100644
index 904d7b6..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/IFreeplaneScriptErrorHandler.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-/**
- * @author Dimitry Polivaev
- * 17.12.2012
- */
-public interface IFreeplaneScriptErrorHandler {
- void gotoLine(int pLineNumber);
-}
\ No newline at end of file
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/IScript.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/IScript.java
deleted file mode 100644
index 13c8e2e..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/IScript.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.io.PrintStream;
-
-import org.freeplane.features.map.NodeModel;
-
-/**
- * @author Dimitry Polivaev
- * 17.12.2012
- */
-public interface IScript {
- public IScript setErrorHandler(IFreeplaneScriptErrorHandler pErrorHandler);
-
- public IScript setOutStream(PrintStream outStream);
-
- public IScript setScriptContext(ScriptContext scriptContext);
-
- public Object getScript();
-
- public Object execute(final NodeModel node);
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/NodeIdHighLighter.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/NodeIdHighLighter.java
deleted file mode 100644
index 33135f9..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/NodeIdHighLighter.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package org.freeplane.plugin.script;
-
-import java.awt.event.FocusAdapter;
-import java.awt.event.FocusEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.beans.PropertyChangeEvent;
-import java.util.ArrayList;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.swing.JEditorPane;
-import javax.swing.SwingUtilities;
-import javax.swing.event.CaretEvent;
-import javax.swing.event.CaretListener;
-
-import jsyntaxpane.SyntaxDocument;
-import jsyntaxpane.Token;
-import jsyntaxpane.actions.ActionUtils;
-import jsyntaxpane.components.SyntaxComponent;
-import jsyntaxpane.util.Configuration;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-
-public class NodeIdHighLighter implements SyntaxComponent, CaretListener {
- private final Pattern nodeIdPattern = Pattern.compile("(ID_\\d+)|(\"ID_\\d+\")");
- private JEditorPane pane;
- private Status status;
- private ArrayList<NodeModel> nodesOriginallyFolded = new ArrayList<NodeModel>(50);
- private NodeModel originallySelectedNode = null;
-
- /** remove as soon as SyntaxComponent has it in the JDK5 version. */
- private static enum Status {
- INSTALLING,
- DEINSTALLING
- }
-
- public void caretUpdate(CaretEvent e) {
- handle(e.getDot());
- }
-
- public void handle(int pos) {
- SyntaxDocument doc = ActionUtils.getSyntaxDocument(pane);
- if (doc != null) {
- try {
- doc.readLock();
- Token token = doc.getTokenAt(pos);
- if (token == null || !handle(doc, token)) {
- deHighlight();
- }
- }
- finally {
- doc.readUnlock();
- }
- }
- }
-
- private boolean handle(SyntaxDocument doc, Token token) {
- final Matcher matcher = nodeIdPattern.matcher(token.getText(doc));
- if (matcher.matches()) {
- String id = matcher.group(1);
- final NodeModel node = Controller.getCurrentController().getMap().getNodeForID(id);
- if (node != null) {
- final MapController mapController = Controller.getCurrentModeController().getMapController();
- final NodeModel selectedNode = mapController.getSelectedNode();
- if(node.equals(selectedNode)){
- return true;
- }
- NodeModel originallySelectedNode = this.originallySelectedNode;
- if (originallySelectedNode == null)
- originallySelectedNode = mapController.getSelectedNode();
- else{
- deHighlight();
- }
- this.originallySelectedNode = originallySelectedNode;
- mapController.displayNode(node, nodesOriginallyFolded);
- mapController.select(node);
- pane.setToolTipText(node.getText());
- return true;
- }
- else {
- pane.setToolTipText("<html><body bgcolor='#CC0000'>" //
- + TextUtils.format(getResourceKey("node_is_not_defined"), id) + "</body></html>");
- }
- }
- else{
- deHighlight();
- }
- return false;
- }
-
- public void deHighlight() {
- if (originallySelectedNode == null)
- return;
- final Controller controller = Controller.getCurrentController();
- if (controller == null)
- return;
- final MapController mapController = controller.getModeController().getMapController();
- mapController.displayNode(originallySelectedNode);
- mapController.select(originallySelectedNode);
- foldOriginallyFolded(mapController);
- originallySelectedNode = null;
- pane.setToolTipText(null);
- }
-
- private void foldOriginallyFolded(final MapController mapController) {
- final int countNodesOriginallyUnfolded = nodesOriginallyFolded.size();
- if (countNodesOriginallyUnfolded > 0) {
- for (int i = countNodesOriginallyUnfolded - 1; i >= 0; i--)
- mapController.setFolded(nodesOriginallyFolded.get(i), true);
- nodesOriginallyFolded.clear();
- }
- }
-
- public void config(Configuration config) {
- }
-
- public void install(JEditorPane editor) {
- this.pane = editor;
- pane.addCaretListener(this);
- handle(editor.getCaretPosition());
- status = Status.INSTALLING;
- addWindowListener();
-// addFocusListener();
- }
- private void addWindowListener() {
- pane.addFocusListener(new FocusAdapter() {
- @Override
- public void focusGained(FocusEvent e) {
- e.getComponent().removeFocusListener(this);
- SwingUtilities.getWindowAncestor(pane).addWindowListener(new WindowAdapter(){
- @Override
- public void windowClosed(WindowEvent e) {
- e.getWindow().removeWindowListener(this);
- deHighlight();
- }
- });
- }
- });
- }
-
-// private void addFocusListener() {
-// class NodeIdHighLightFocusListener extends FocusAdapter {
-// public void focusLost(FocusEvent e) {
-// deHighlight();
-// }
-// }
-// final FocusListener[] focusListeners = pane.getFocusListeners();
-// for (int i = 0; i < focusListeners.length; i++) {
-// if (focusListeners[i] instanceof NodeIdHighLightFocusListener) {
-// return;
-// }
-// }
-// pane.addFocusListener(new NodeIdHighLightFocusListener());
-// }
-
- public void deinstall(JEditorPane editor) {
- status = Status.DEINSTALLING;
- deHighlight();
- pane.removeCaretListener(this);
- }
-
- public void propertyChange(PropertyChangeEvent evt) {
- if (evt.getPropertyName().equals("document")) {
- pane.removeCaretListener(this);
- if (status.equals(Status.INSTALLING)) {
- pane.addCaretListener(this);
- deHighlight();
- }
- }
- }
-
- public String getResourceKey(final String key) {
- return "org.freeplane.plugin.script.NodeIdHighlighter." + key;
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorPanel.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorPanel.java
deleted file mode 100644
index a7e102b..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorPanel.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.awt.BorderLayout;
-import java.awt.Container;
-import java.awt.Font;
-import java.awt.event.ActionEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.io.UnsupportedEncodingException;
-
-import javax.swing.AbstractAction;
-import javax.swing.Action;
-import javax.swing.DefaultListModel;
-import javax.swing.JDialog;
-import javax.swing.JEditorPane;
-import javax.swing.JLabel;
-import javax.swing.JList;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JScrollPane;
-import javax.swing.JSplitPane;
-import javax.swing.JTextArea;
-import javax.swing.ListSelectionModel;
-import javax.swing.WindowConstants;
-import javax.swing.event.CaretEvent;
-import javax.swing.event.CaretListener;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.JTextComponent;
-
-import jsyntaxpane.actions.ActionUtils;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.UIBuilder;
-import org.freeplane.core.ui.components.BlindIcon;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.plugin.script.IFreeplaneScriptErrorHandler;
-
-/**
- */
-class ScriptEditorPanel extends JDialog {
-
- static final String GROOVY_EDITOR_FONT = "groovy_editor_font";
- static final String GROOVY_EDITOR_FONT_SIZE = "groovy_editor_font_size";
-
- private static final String internalCharset = "UTF-16BE";
-
- final private class CancelAction extends AbstractAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private CancelAction(final String pArg0) {
- super(pArg0);
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- disposeDialog(true);
- }
- }
-
- final private class ExitAction extends AbstractAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private ExitAction(final String pArg0) {
- super(pArg0);
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- storeCurrent();
- disposeDialog(false);
- }
- }
-
- public interface IScriptModel {
- /**
- * @return the index of the new script.
- */
- int addNewScript();
-
- ScriptEditorWindowConfigurationStorage decorateDialog(ScriptEditorPanel pPanel,
- String pWindow_preference_storage_property);
-
- void endDialog(boolean pIsCanceled);
-
- Object executeScript(int pIndex, PrintStream outStream, IFreeplaneScriptErrorHandler pErrorHandler);
-
- int getAmountOfScripts();
-
- /**
- * @param pIndex
- * zero-based
- * @return a script
- */
- ScriptHolder getScript(int pIndex);
-
- boolean isDirty();
-
- void setScript(int pIndex, ScriptHolder pScript);
-
- void storeDialogPositions(ScriptEditorPanel pPanel, ScriptEditorWindowConfigurationStorage pStorage,
- String pWindow_preference_storage_property);
- }
-
- final private class NewScriptAction extends AbstractAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private NewScriptAction(final String pArg0) {
- super(pArg0);
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- storeCurrent();
- mLastSelected = null;
- final int scriptIndex = mScriptModel.addNewScript();
- updateFields();
- select(scriptIndex);
- }
- }
-
- final private class ResultFieldStream extends OutputStream {
- private final byte[] buf = new byte[2];
- private int i = 0;
-
- @Override
- public void write(final int pByte) throws IOException {
- buf[i++] = (byte) pByte;
- if (i == 2) {
- mScriptResultField.append(new String(buf, internalCharset));
- i = 0;
- }
- }
-
- @Override
- public void write(final byte b[], int off, int len) throws IOException {
- if (i == 1) {
- write(b[off++]);
- len--;
- }
- if (len <= 0) {
- return;
- }
- final int len2 = len & ~1;
- mScriptResultField.append(new String(b, off, len2, internalCharset));
- if (len2 != len) {
- write(b[len2]);
- }
- }
- }
-
- final private class RunAction extends AbstractAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private RunAction(final String pArg0) {
- super(pArg0);
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- storeCurrent();
- if (!mScriptList.isSelectionEmpty()) {
- mScriptResultField.setText("");
- Object result = null;
- try {
- result = mScriptModel.executeScript(mScriptList.getSelectedIndex(), getPrintStream(),
- getErrorHandler());
- }
- catch (Throwable e2) {
- // make sure the complete stack trace is logged!
- LogUtils.warn(e2);
- Throwable cause = e2.getCause();
- String causeMessage = "";
- if(cause != null && cause.getMessage()!= null)
- causeMessage = cause.getMessage();
- final String message = e2.getMessage() != null ? e2.getMessage() : "";
- UITools.errorMessage(e2.getClass().getName() + ": " + causeMessage
- + ((causeMessage.length() != 0 && message.length() != 0) ? ", " : "") + message);
- result = message;
- }
- getPrintStream().print(TextUtils.getText("plugins/ScriptEditor/window.Result") + result);
- }
- }
- }
-
- public static class ScriptHolder {
- String mScript;
- String mScriptName;
-
- /**
- * @param pScriptName
- * script name (starting with "script"
- * (ScriptingEngine.SCRIPT_PREFIX))
- * @param pScript
- * script content
- */
- public ScriptHolder(final String pScriptName, final String pScript) {
- super();
- mScript = pScript;
- mScriptName = pScriptName;
- }
-
- public String getScript() {
- return mScript;
- }
-
- public String getScriptName() {
- return mScriptName;
- }
-
- public ScriptHolder setScript(final String pScript) {
- mScript = pScript;
- return this;
- }
-
- public ScriptHolder setScriptName(final String pScriptName) {
- mScriptName = pScriptName;
- return this;
- }
- }
-
- final private class SignAction extends AbstractAction {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-// // final private Controller controller;
-
- private SignAction( final String pArg0) {
- super(pArg0);
-// this.controller = controller;
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- storeCurrent();
- if (!mScriptList.isSelectionEmpty()) {
- final int selectedIndex = mScriptList.getSelectedIndex();
- final ScriptHolder script = mScriptModel.getScript(selectedIndex);
- final String signedScript = new SignedScriptHandler().signScript(script.mScript);
- script.setScript(signedScript);
- mScriptModel.setScript(selectedIndex, script);
- mScriptTextField.setText(signedScript);
- }
- }
- }
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- /**
- *
- */
- private static final String WINDOW_PREFERENCE_STORAGE_PROPERTY = "plugins.script.ScriptEditorPanel/window_positions";
- final private JSplitPane mCentralPanel;
- final private JSplitPane mCentralUpperPanel;
- private Integer mLastSelected = null;
- final private DefaultListModel mListModel;
- final private AbstractAction mRunAction;
- final private JList mScriptList;
- final private IScriptModel mScriptModel;
- final private JTextArea mScriptResultField;
- final private JTextComponent mScriptTextField;
- final private SignAction mSignAction;
- final private JLabel mStatus;
-
- public ScriptEditorPanel( final IScriptModel pScriptModel,
- final boolean pHasNewScriptFunctionality) {
- super(Controller.getCurrentController().getViewController().getJFrame(), true /* modal */);
- mScriptModel = pScriptModel;
- this.setTitle(TextUtils.getText("plugins/ScriptEditor/window.title"));
- this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
- this.addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(final WindowEvent event) {
- disposeDialog(true);
- }
- });
- UITools.addEscapeActionToDialog(this, new AbstractAction() {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(final ActionEvent arg0) {
- disposeDialog(true);
- }
- });
- final Container contentPane = this.getContentPane();
- contentPane.setLayout(new BorderLayout());
- mListModel = new DefaultListModel();
- mScriptList = new JList(mListModel);
- mScriptList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- mScriptList.addListSelectionListener(new ListSelectionListener() {
- public void valueChanged(final ListSelectionEvent pEvent) {
- if (pEvent.getValueIsAdjusting()) {
- return;
- }
- select(mScriptList.getSelectedIndex());
- }
- });
- final JEditorPane editorPane = new JEditorPane();
- editorPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
- mScriptTextField = editorPane;
- mScriptTextField.setEnabled(false);
- mCentralUpperPanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, mScriptList, new JScrollPane(mScriptTextField));
- try {
- editorPane.setContentType("text/groovy");
-
- final String fontName = ResourceController.getResourceController().getProperty(GROOVY_EDITOR_FONT);
- final int fontSize = ResourceController.getResourceController().getIntProperty(GROOVY_EDITOR_FONT_SIZE);
- editorPane.setFont(new Font(fontName, Font.PLAIN, fontSize));
-
- } catch (Exception e) {
- LogUtils.warn(e);
- editorPane.setContentType("text/plain");
- }
- mCentralUpperPanel.setContinuousLayout(true);
- mScriptResultField = new JTextArea();
- mScriptResultField.setEditable(false);
- mScriptResultField.setWrapStyleWord(true);
- mCentralPanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT, mCentralUpperPanel, new JScrollPane(
- mScriptResultField));
- mCentralPanel.setDividerLocation(0.8);
- mCentralPanel.setContinuousLayout(true);
- contentPane.add(mCentralPanel, BorderLayout.CENTER);
- mStatus = new JLabel();
- contentPane.add(mStatus, BorderLayout.SOUTH);
- mScriptTextField.addCaretListener(new CaretListener() {
- public void caretUpdate(final CaretEvent arg0) {
- final int caretPosition = mScriptTextField.getCaretPosition();
- try {
- final int lineOfOffset = ActionUtils.getLineNumber(mScriptTextField, caretPosition);
- mStatus.setText("Line: " + (lineOfOffset + 1) + ", Column: "
- + (caretPosition - ActionUtils.getLineNumber(mScriptTextField, lineOfOffset) + 1));
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- });
- updateFields();
- mScriptTextField.repaint();
- final JMenuBar menuBar = new JMenuBar();
- final JMenu menu = new JMenu();
- MenuBuilder.setLabelAndMnemonic(menu, TextUtils.getRawText("plugins/ScriptEditor.menu_actions"));
- if (pHasNewScriptFunctionality) {
- addAction(menu, new NewScriptAction(TextUtils.getRawText("plugins/ScriptEditor.new_script")));
- }
- mRunAction = new RunAction(TextUtils.getRawText("plugins/ScriptEditor.run"));
- mRunAction.setEnabled(false);
- addAction(menu, mRunAction);
- mSignAction = new SignAction(TextUtils.getRawText("plugins/ScriptEditor.sign"));
- mSignAction.setEnabled(false);
- addAction(menu, mSignAction);
- final AbstractAction cancelAction = new CancelAction(TextUtils.getRawText("plugins/ScriptEditor.cancel"));
- addAction(menu, cancelAction);
- final AbstractAction exitAction = new ExitAction(TextUtils.getRawText("plugins/ScriptEditor.exit"));
- addAction(menu, exitAction);
- menuBar.add(menu);
- this.setJMenuBar(menuBar);
- final ScriptEditorWindowConfigurationStorage storage = mScriptModel.decorateDialog(this,
- ScriptEditorPanel.WINDOW_PREFERENCE_STORAGE_PROPERTY);
- if (storage != null) {
- mCentralUpperPanel.setDividerLocation(storage.getLeftRatio());
- mCentralPanel.setDividerLocation(storage.getTopRatio());
- }
- else {
- mCentralUpperPanel.setDividerLocation(100);
- mCentralPanel.setDividerLocation(240);
- }
- }
-
- private void addAction(final JMenu menu, final AbstractAction action) {
- final JMenuItem item = menu.add(action);
- MenuBuilder.setLabelAndMnemonic(item, (String) action.getValue(Action.NAME));
- item.setIcon(new BlindIcon(UIBuilder.ICON_SIZE));
- }
-
- /**
- * @param pIsCanceled
- */
- private void disposeDialog(final boolean pIsCanceled) {
- if (!mScriptList.isSelectionEmpty()) {
- select(mScriptList.getSelectedIndex());
- }
- if (pIsCanceled && mScriptModel.isDirty()) {
- final int action = JOptionPane.showConfirmDialog(this, TextUtils
- .getText("ScriptEditorPanel.changed_cancel"), "Freeplane", JOptionPane.OK_CANCEL_OPTION);
- if (action == JOptionPane.CANCEL_OPTION) {
- return;
- }
- }
- final ScriptEditorWindowConfigurationStorage storage = new ScriptEditorWindowConfigurationStorage();
- storage.setLeftRatio(mCentralUpperPanel.getDividerLocation());
- storage.setTopRatio(mCentralPanel.getDividerLocation());
- mScriptModel.storeDialogPositions(this, storage, ScriptEditorPanel.WINDOW_PREFERENCE_STORAGE_PROPERTY);
- this.setVisible(false);
- this.dispose();
- mScriptModel.endDialog(pIsCanceled);
- }
-
- IFreeplaneScriptErrorHandler getErrorHandler() {
- return new IFreeplaneScriptErrorHandler() {
- public void gotoLine(final int pLineNumber) {
- ActionUtils.setCaretPosition(mScriptTextField, pLineNumber, 1);
- }
- };
- }
-
- PrintStream getPrintStream() {
- try {
- return new PrintStream(new ResultFieldStream(), false, internalCharset);
- }
- catch (final UnsupportedEncodingException e) {
- return null;
- }
- }
-
- private void select(final int pIndex) {
- mScriptTextField.setEnabled(pIndex >= 0);
- mRunAction.setEnabled(pIndex >= 0);
- mSignAction.setEnabled(pIndex >= 0);
- if (pIndex < 0) {
- mScriptTextField.setText("");
- return;
- }
- storeCurrent();
- mScriptTextField.setText(mScriptModel.getScript(pIndex).getScript());
- mLastSelected = new Integer(pIndex);
- if (pIndex >= 0 && mScriptList.getSelectedIndex() != pIndex) {
- mScriptList.setSelectedIndex(pIndex);
- }
- }
-
- private void storeCurrent() {
- if (mLastSelected != null) {
- final int oldIndex = mLastSelected.intValue();
- mScriptModel.setScript(oldIndex, mScriptModel.getScript(oldIndex).setScript(mScriptTextField.getText()));
- }
- }
-
- private void updateFields() {
- mListModel.clear();
- for (int i = 0; i < mScriptModel.getAmountOfScripts(); ++i) {
- final ScriptHolder script = mScriptModel.getScript(i);
- mListModel.addElement(script.getScriptName());
- }
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorProperty.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorProperty.java
deleted file mode 100644
index 676e018..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptEditorProperty.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JButton;
-import javax.swing.JPopupMenu;
-
-import org.freeplane.core.resources.components.IPropertyControl;
-import org.freeplane.core.resources.components.PropertyBean;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.script.IScriptEditorStarter;
-
-import com.jgoodies.forms.builder.DefaultFormBuilder;
-
-class ScriptEditorProperty extends PropertyBean implements IPropertyControl, ActionListener {
- JButton mButton;
- final JPopupMenu menu = new JPopupMenu();
-// final private ModeController mMindMapController;
- String script;
-
- /**
- */
- public ScriptEditorProperty(final String name) {
- super(name);
- mButton = new JButton();
- mButton.addActionListener(this);
- script = "";
- }
-
- public void actionPerformed(final ActionEvent arg0) {
- final IScriptEditorStarter plugin = (IScriptEditorStarter) Controller
- .getCurrentModeController().getExtension(
- IScriptEditorStarter.class);
- if (plugin != null) {
- final IScriptEditorStarter starter = plugin;
- final String resultScript = starter.startEditor(script);
- if (resultScript != null) {
- script = resultScript;
- firePropertyChangeEvent();
- }
- }
- }
-
- @Override
- public String getValue() {
- return script;
- }
-
- public void layout(final DefaultFormBuilder builder) {
- layout(builder, mButton);
- }
-
- public void setEnabled(final boolean pEnabled) {
- mButton.setEnabled(pEnabled);
- }
-
- /**
- */
- private void setScriptValue(final String result) {
- if (result == null) {
- script = "";
- }
- else {
- script = result;
- }
- mButton.setText(script);
- }
-
- @Override
- public void setValue(final String value) {
- setScriptValue(value);
- }
-
- @Override
- protected Component[] getComponents() {
- return new Component[]{mButton};
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptRenderer.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptRenderer.java
deleted file mode 100644
index 9c1c2c0..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptRenderer.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2011 dimitry
- *
- * This file author is dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.awt.Component;
-import java.awt.Dimension;
-
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.JComponent;
-import javax.swing.JList;
-
-import org.freeplane.core.util.HtmlUtils;
-
-/**
- * @author Dimitry Polivaev
- * Jul 23, 2011
- */
-public class ScriptRenderer extends DefaultListCellRenderer{
- private static final long serialVersionUID = 1L;
-
- @Override
- public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
- boolean cellHasFocus) {
- final JComponent renderer = (JComponent) super.getListCellRendererComponent(list, firstLine(value), index, isSelected, cellHasFocus);
- final String script = value.toString();
- if(script.contains("\n")) {
- renderer.setToolTipText(HtmlUtils.plainToHTML(script));
- }
-
- return renderer;
- }
-
- private Object firstLine(Object value) {
- if(! (value instanceof String) )
- return value;
- String script = ((String) value).trim();
- return script.substring(0, Math.min(40, script.length())).trim().replaceAll("\\s+", " ");
-
- }
-
- @Override
- public Dimension getPreferredSize() {
- final Dimension preferredSize = super.getPreferredSize();
- if(! isPreferredSizeSet())
- preferredSize.width = 100;
- return preferredSize;
- }
-
-}
\ No newline at end of file
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptResources.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptResources.java
deleted file mode 100644
index 721478e..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptResources.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package org.freeplane.plugin.script;
-
-import java.io.File;
-import java.util.Collections;
-import java.util.List;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-
-public class ScriptResources {
- static final IFreeplaneScriptErrorHandler IGNORING_SCRIPT_ERROR_HANDLER = new IFreeplaneScriptErrorHandler() {
- @Override
- public void gotoLine(final int pLineNumber) {
- }
- };
- private static final String RESOURCES_SCRIPT_COMPILATION_DISABLED_EXTENSIONS = "script_compilation_disabled_extensions";
- static final String RESOURCES_SCRIPT_DIRECTORIES = "script_directories";
- static final String RESOURCES_SCRIPT_CLASSPATH = "script_classpath";
- static final String[] SCRIPT_COMPILATION_DISABLED_EXTENSIONS = ResourceController.getResourceController()
- .getProperty(RESOURCES_SCRIPT_COMPILATION_DISABLED_EXTENSIONS, "").split("\\W+");
- private static final String USER_SCRIPTS_DIR = "scripts";
- private static final String USER_LIB_DIR = "lib";
- private static final String BUILTIN_SCRIPTS_DIR = "scripts";
- private static List<String> classpath;
- private static final File builtinScriptsDir = buildBuiltinScriptsDir();
- private static final File userScriptsDir = buildUserScriptsDir(ScriptResources.USER_SCRIPTS_DIR);
- private static final File userLibDir = buildUserScriptsDir(ScriptResources.USER_LIB_DIR);
-
- /** @deprecated use {@link #getUserScriptDir()} instead. */
- public static File getUserScriptDir() {
- return getUserScriptsDir();
- }
-
- public static File getUserScriptsDir() {
- return userScriptsDir;
- }
-
- public static File getUserLibDir() {
- return userLibDir;
- }
-
- static File getBuiltinScriptsDir() {
- return builtinScriptsDir;
- }
-
- static List<String> getClasspath() {
- return classpath;
- }
-
- /** allows to set the classpath for scripts. Due to security considerations it's not possible to set
- * this more than once. */
- static void setClasspath(final List<String> newClasspath) {
- if (classpath != null)
- throw new SecurityException("reset of script classpath is forbidden.");
- classpath = Collections.unmodifiableList(newClasspath);
- if (!classpath.isEmpty())
- LogUtils.info("extending script's classpath by " + classpath);
- }
-
- private static File buildBuiltinScriptsDir() {
- return new File(ResourceController.getResourceController().getInstallationBaseDir(), BUILTIN_SCRIPTS_DIR);
- }
-
- private static File buildUserScriptsDir(String userDir) {
- return new File(ResourceController.getResourceController().getFreeplaneUserDirectory(),
- userDir);
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptSecurity.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptSecurity.java
deleted file mode 100644
index d998ba1..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptSecurity.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2012 Dimitry
- *
- * This file author is Dimitry
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.io.PrintStream;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.main.application.FreeplaneSecurityManager;
-
-/**
- * @author Dimitry Polivaev
- * 19.12.2012
- */
-public class ScriptSecurity {
- final private Object script;
- final private ScriptingPermissions specificPermissions;
- final private PrintStream outStream;
-
- public ScriptSecurity(Object script, ScriptingPermissions specificPermissions, PrintStream outStream) {
- super();
- this.script = script;
- this.specificPermissions = specificPermissions;
- this.outStream = outStream;
- }
-
- ScriptingSecurityManager getScriptingSecurityManager() {
- final FreeplaneSecurityManager securityManager = (FreeplaneSecurityManager) System.getSecurityManager();
- final ScriptingSecurityManager scriptingSecurityManager;
- // get preferences (and store them again after the script execution,
- // such that the scripts are not able to change them).
- if (securityManager.needToSetFinalSecurityManager()) {
- final ScriptingPermissions permissions = permissions();
- permissions.assertScriptExecutionAllowed();
- final boolean executeSignedScripts = permissions.isExecuteSignedScriptsWithoutRestriction();
- if (executeSignedScripts && isSignedScript()) {
- scriptingSecurityManager = permissions.getPermissiveScriptingSecurityManager();
- }
- else {
- scriptingSecurityManager = permissions.getScriptingSecurityManager();
- }
- }
- else {
- // will not be used
- scriptingSecurityManager = null;
- }
- return scriptingSecurityManager;
- }
-
- private boolean isSignedScript() {
- return script instanceof String && new SignedScriptHandler().isScriptSigned((String) script, outStream);
- }
-
- private ScriptingPermissions permissions() {
- if(specificPermissions != null)
- return specificPermissions;
- else
- return new ScriptingPermissions(ResourceController.getResourceController().getProperties());
- }
-
-
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingConfiguration.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingConfiguration.java
deleted file mode 100644
index 31b7be1..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingConfiguration.java
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2009 Volker Boerchers
- *
- * This file author is Volker Boerchers
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.script.ScriptEngineFactory;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.ConfigurationUtils;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.main.addons.AddOnProperties;
-import org.freeplane.main.addons.AddOnProperties.AddOnType;
-import org.freeplane.main.addons.AddOnsController;
-import org.freeplane.plugin.script.ExecuteScriptAction.ExecutionMode;
-import org.freeplane.plugin.script.addons.ScriptAddOnProperties;
-import org.freeplane.plugin.script.addons.ScriptAddOnProperties.Script;
-
-/**
- * scans for scripts to be registered via {@link ScriptingRegistration}.
- *
- * @author Volker Boerchers
- */
-class ScriptingConfiguration {
- static class ScriptMetaData {
- private final TreeMap<ExecutionMode, String> executionModeLocationMap = new TreeMap<ExecutionMode, String>();
- private final TreeMap<ExecutionMode, String> executionModeTitleKeyMap = new TreeMap<ExecutionMode, String>();
- private boolean cacheContent = false;
- private final String scriptName;
- private ScriptingPermissions permissions;
-
- ScriptMetaData(final String scriptName) {
- this.scriptName = scriptName;
- executionModeLocationMap.put(ExecutionMode.ON_SINGLE_NODE, null);
- executionModeLocationMap.put(ExecutionMode.ON_SELECTED_NODE, null);
- executionModeLocationMap.put(ExecutionMode.ON_SELECTED_NODE_RECURSIVELY, null);
- }
-
- public Set<ExecutionMode> getExecutionModes() {
- return executionModeLocationMap.keySet();
- }
-
- public void addExecutionMode(final ExecutionMode executionMode, final String location, final String titleKey) {
- executionModeLocationMap.put(executionMode, location);
- if (titleKey != null)
- executionModeTitleKeyMap.put(executionMode, titleKey);
- }
-
- public void removeExecutionMode(final ExecutionMode executionMode) {
- executionModeLocationMap.remove(executionMode);
- }
-
- public void removeAllExecutionModes() {
- executionModeLocationMap.clear();
- }
-
- protected String getMenuLocation(final ExecutionMode executionMode) {
- return executionModeLocationMap.get(executionMode);
- }
-
- public String getTitleKey(final ExecutionMode executionMode) {
- final String key = executionModeTitleKeyMap.get(executionMode);
- return key == null ? getExecutionModeKey(executionMode) : key;
- }
-
- public boolean cacheContent() {
- return cacheContent;
- }
-
- public void setCacheContent(final boolean cacheContent) {
- this.cacheContent = cacheContent;
- }
-
- public String getScriptName() {
- return scriptName;
- }
-
- public void setPermissions(ScriptingPermissions permissions) {
- this.permissions = permissions;
- }
-
- public ScriptingPermissions getPermissions() {
- return permissions;
- }
- }
-
- private static final String[] MENU_BAR_SCRIPTS_PARENT_LOCATIONS = {"main_menu_scripting", "node_popup_scripting"};
- private static final String JAR_REGEX = ".+\\.jar$";
- private final TreeMap<String, String> menuTitleToPathMap = new TreeMap<String, String>();
- private final TreeMap<String, ScriptMetaData> menuTitleToMetaDataMap = new TreeMap<String, ScriptMetaData>();
-
- ScriptingConfiguration() {
- ScriptResources.setClasspath(buildClasspath());
- addPluginDefaults();
- initMenuTitleToPathMap();
- }
-
- private void addPluginDefaults() {
- final URL defaults = this.getClass().getResource(ResourceController.PLUGIN_DEFAULTS_RESOURCE);
- if (defaults == null)
- throw new RuntimeException("cannot open " + ResourceController.PLUGIN_DEFAULTS_RESOURCE);
- Controller.getCurrentController().getResourceController().addDefaults(defaults);
- }
-
- private void initMenuTitleToPathMap() {
- final Map<File, Script> addOnScriptMap = createAddOnScriptMap();
- addAddOnScripts(addOnScriptMap);
- addNonAddOnScripts(addOnScriptMap);
- }
-
- private void addAddOnScripts(Map<File, Script> addOnScriptMap) {
- for (File file : addOnScriptMap.keySet()) {
- addScript(file, addOnScriptMap);
- }
- }
-
- private void addNonAddOnScripts(final Map<File, Script> addOnScriptMap) {
- final FilenameFilter scriptFilenameFilter = createFilenameFilter(createScriptRegExp());
- for (File dir : getScriptDirs()) {
- addNonAddOnScripts(dir, addOnScriptMap, scriptFilenameFilter);
- }
- }
-
- private Map<File, Script> createAddOnScriptMap() {
- Map<File, Script> result = new LinkedHashMap<File, Script>();
- for (ScriptAddOnProperties scriptAddOnProperties : getInstalledScriptAddOns()) {
- final List<Script> scripts = scriptAddOnProperties.getScripts();
- for (Script script : scripts) {
- script.active = scriptAddOnProperties.isActive();
- result.put(findScriptFile(scriptAddOnProperties, script), script);
- }
- }
- return result;
- }
-
- private List<ScriptAddOnProperties> getInstalledScriptAddOns() {
- final List<ScriptAddOnProperties> installedAddOns = new ArrayList<ScriptAddOnProperties>();
- for (AddOnProperties addOnProperties : AddOnsController.getController().getInstalledAddOns()) {
- if (addOnProperties.getAddOnType() == AddOnType.SCRIPT) {
- installedAddOns.add((ScriptAddOnProperties) addOnProperties);
- }
- }
- return installedAddOns;
- }
-
- private File findScriptFile(AddOnProperties addOnProperties, Script script) {
- final File dir = new File(getPrivateAddOnDirectory(addOnProperties), "scripts");
- final File result = new File(dir, script.name);
- return result.exists() ? result : findScriptFile_pre_1_3_x_final(script);
- }
-
- private File getPrivateAddOnDirectory(AddOnProperties addOnProperties) {
- return new File(AddOnsController.getController().getAddOnsDir(), addOnProperties.getName());
- }
-
- // add-on scripts are installed in a add-on-private directory since 1.3.x_beta
- @Deprecated
- private File findScriptFile_pre_1_3_x_final(Script script) {
- return new File(ScriptResources.getUserScriptsDir(), script.name);
- }
-
- private TreeSet<File> getScriptDirs() {
- final ResourceController resourceController = ResourceController.getResourceController();
- final String dirsString = resourceController.getProperty(ScriptResources.RESOURCES_SCRIPT_DIRECTORIES);
- final TreeSet<File> dirs = new TreeSet<File>(); // remove duplicates -> Set
- if (dirsString != null) {
- for (String dir : ConfigurationUtils.decodeListValue(dirsString, false)) {
- dirs.add(createFile(dir));
- }
- }
- dirs.add(ScriptResources.getBuiltinScriptsDir());
- dirs.add(ScriptResources.getUserScriptsDir());
- return dirs;
- }
-
- /**
- * if <code>path</code> is not an absolute path, prepends the freeplane user
- * directory to it.
- */
- private File createFile(final String path) {
- File file = new File(path);
- if (!file.isAbsolute()) {
- file = new File(ResourceController.getResourceController().getFreeplaneUserDirectory(), path);
- }
- return file;
- }
-
- /** scans <code>dir</code> for script files matching a given rexgex. */
- private void addNonAddOnScripts(final File dir, final Map<File, Script> addOnScriptMap,
- FilenameFilter filenameFilter) {
- // add all addOn scripts
- // find further scripts in configured directories
- if (dir.isDirectory()) {
- final File[] files = dir.listFiles(filenameFilter);
- if (files != null) {
- for (final File file : files) {
- if (addOnScriptMap.get(file) == null)
- addScript(file, addOnScriptMap);
- }
- }
- }
- else {
- LogUtils.warn("not a (script) directory: " + dir);
- }
- }
-
- private String createScriptRegExp() {
- final ArrayList<String> extensions = new ArrayList<String>();
-// extensions.add("clj");
- for (ScriptEngineFactory scriptEngineFactory : GenericScript.getScriptEngineManager().getEngineFactories()) {
- extensions.addAll(scriptEngineFactory.getExtensions());
- }
- LogUtils.info("looking for scripts with the following endings: " + extensions);
- return ".+\\.(" + StringUtils.join(extensions, "|") + ")$";
- }
-
- private FilenameFilter createFilenameFilter(final String regexp) {
- final FilenameFilter filter = new FilenameFilter() {
- public boolean accept(final File dir, final String name) {
- return name.matches(regexp);
- }
- };
- return filter;
- }
-
- private void addScript(final File file, final Map<File, Script> addOnScriptMap) {
- final Script scriptConfig = addOnScriptMap.get(file);
- if (scriptConfig != null && !scriptConfig.active) {
- LogUtils.info("skipping deactivated " + scriptConfig);
- return;
- }
- final String menuTitle = disambiguateMenuTitle(getOrCreateMenuTitle(file, scriptConfig));
- try {
- menuTitleToPathMap.put(menuTitle, file.getAbsolutePath());
- final ScriptMetaData metaData = createMetaData(file, menuTitle, scriptConfig);
- menuTitleToMetaDataMap.put(menuTitle, metaData);
- final File parentFile = file.getParentFile();
- if (parentFile.equals(ScriptResources.getBuiltinScriptsDir())) {
- metaData.setPermissions(ScriptingPermissions.getPermissiveScriptingPermissions());
- }
- }
- catch (final IOException e) {
- LogUtils.warn("problems with script " + file.getAbsolutePath(), e);
- menuTitleToPathMap.remove(menuTitle);
- menuTitleToMetaDataMap.remove(menuTitle);
- }
- }
-
- private String disambiguateMenuTitle(final String menuTitleOrig) {
- String menuTitle = menuTitleOrig;
- // add suffix if the same script exists in multiple dirs
- for (int i = 2; menuTitleToPathMap.containsKey(menuTitle); ++i) {
- menuTitle = menuTitleOrig + i;
- }
- return menuTitle;
- }
-
- private ScriptMetaData createMetaData(final File file, final String scriptName,
- final Script scriptConfig) throws IOException {
- return scriptConfig == null ? analyseScriptContent(FileUtils.slurpFile(file), scriptName) //
- : createMetaData(scriptName, scriptConfig);
- }
-
- // not private to enable tests
- ScriptMetaData analyseScriptContent(final String content, final String scriptName) {
- final ScriptMetaData metaData = new ScriptMetaData(scriptName);
- if (ScriptingConfiguration.firstCharIsEquals(content)) {
- // would make no sense
- metaData.removeExecutionMode(ExecutionMode.ON_SINGLE_NODE);
- }
- setExecutionModes(content, metaData);
- setCacheMode(content, metaData);
- return metaData;
- }
-
- private ScriptMetaData createMetaData(final String scriptName, final Script scriptConfig) {
- final ScriptMetaData metaData = new ScriptMetaData(scriptName);
- metaData.removeAllExecutionModes();
- metaData.addExecutionMode(scriptConfig.executionMode, scriptConfig.menuLocation, scriptConfig.menuTitleKey);
-// metaData.setCacheContent(true);
- metaData.setPermissions(scriptConfig.permissions);
- return metaData;
- }
-
- private void setCacheMode(final String content, final ScriptMetaData metaData) {
- final Pattern cacheScriptPattern = ScriptingConfiguration
- .makeCaseInsensitivePattern("@CacheScriptContent\\s*\\(\\s*(true|false)\\s*\\)");
- final Matcher matcher = cacheScriptPattern.matcher(content);
- if (matcher.find()) {
- metaData.setCacheContent(new Boolean(matcher.group(1)));
- }
- }
-
- public static void setExecutionModes(final String content, final ScriptMetaData metaData) {
- final String modeName = StringUtils.join(ExecutionMode.values(), "|");
- final String modeDef = "(?:ExecutionMode\\.)?(" + modeName + ")(?:=\"([^]\"]+)(?:\\[([^]\"]+)\\])?\")?";
- final String modeDefs = "(?:" + modeDef + ",?)+";
- final Pattern pOuter = makeCaseInsensitivePattern("@ExecutionModes\\(\\{(" + modeDefs + ")\\}\\)");
- final Matcher mOuter = pOuter.matcher(content.replaceAll("\\s+", ""));
- if (!mOuter.find()) {
-// System.err.println(metaData.getScriptName() + ": '" + pOuter + "' did not match "
-// + content.replaceAll("\\s+", ""));
- return;
- }
- metaData.removeAllExecutionModes();
- final Pattern pattern = makeCaseInsensitivePattern(modeDef);
- final String[] locations = mOuter.group(1).split(",");
- for (String match : locations) {
- final Matcher m = pattern.matcher(match);
- if (m.matches()) {
-// System.err.println(metaData.getScriptName() + ":" + m.group(1) + "->" + m.group(2) + "->" + m.group(3));
- metaData.addExecutionMode(ExecutionMode.valueOf(m.group(1).toUpperCase(Locale.ENGLISH)), m.group(2),
- m.group(3));
- }
- else {
- LogUtils.severe("script " + metaData.getScriptName() + ": not a menu location: '" + match + "'");
- continue;
- }
- }
- }
-
- private static boolean firstCharIsEquals(final String content) {
- return content.length() == 0 ? false : content.charAt(0) == '=';
- }
-
- /** some beautification: remove directory and suffix + make first letter uppercase. */
- private String getOrCreateMenuTitle(final File file, Script scriptConfig) {
- if (scriptConfig != null)
- return scriptConfig.menuTitleKey;
- // TODO: we could add mnemonics handling here! (e.g. by reading '_' as '&')
- String string = file.getName().replaceFirst("\\.[^.]+", "");
- // fixup characters that might cause problems in menus
- string = string.replaceAll("\\s+", "_");
- return string.length() < 2 ? string : string.substring(0, 1).toUpperCase() + string.substring(1);
- }
-
- private static Pattern makeCaseInsensitivePattern(final String regexp) {
- return Pattern.compile(regexp, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
- }
-
- SortedMap<String, String> getMenuTitleToPathMap() {
- return Collections.unmodifiableSortedMap(menuTitleToPathMap);
- }
-
- SortedMap<String, ScriptMetaData> getMenuTitleToMetaDataMap() {
- return Collections.unmodifiableSortedMap(menuTitleToMetaDataMap);
- }
-
- private ArrayList<String> buildClasspath() {
- final ArrayList<String> classpath = new ArrayList<String>();
- addClasspathForAddOns(classpath);
- addClasspathForConfiguredEntries(classpath);
- return classpath;
- }
-
- private void addClasspathForAddOns(final ArrayList<String> classpath) {
- final List<ScriptAddOnProperties> installedScriptAddOns = getInstalledScriptAddOns();
- for (ScriptAddOnProperties scriptAddOnProperties : installedScriptAddOns) {
- final List<String> lib = scriptAddOnProperties.getLib();
- if (lib != null) {
- for (String libEntry : lib) {
- final File dir = new File(getPrivateAddOnDirectory(scriptAddOnProperties), "lib");
- classpath.add(new File(dir, libEntry).getAbsolutePath());
- }
- }
- }
- }
-
- private void addClasspathForConfiguredEntries(final ArrayList<String> classpath) {
- for (File classpathElement : uniqueClassPathElements(ResourceController.getResourceController())) {
- addClasspathElement(classpath, classpathElement);
- }
- }
-
- private Set<File> uniqueClassPathElements(final ResourceController resourceController) {
- final String classpathString = resourceController.getProperty(ScriptResources.RESOURCES_SCRIPT_CLASSPATH);
- final TreeSet<File> classpathElements = new TreeSet<File>();
- if (classpathString != null) {
- for (String string : ConfigurationUtils.decodeListValue(classpathString, false)) {
- classpathElements.add(createFile(string));
- }
- }
- classpathElements.add(ScriptResources.getUserLibDir());
- return classpathElements;
- }
-
- private void addClasspathElement(final ArrayList<String> classpath, File classpathElement) {
- final File file = classpathElement;
- if (!file.exists()) {
- LogUtils.warn("classpath entry '" + classpathElement + "' doesn't exist. (Use " + File.pathSeparator
- + " to separate entries.)");
- }
- else if (file.isDirectory()) {
- classpath.add(file.getAbsolutePath());
- for (final File jar : file.listFiles(createFilenameFilter(JAR_REGEX))) {
- classpath.add(jar.getAbsolutePath());
- }
- }
- else {
- classpath.add(file.getAbsolutePath());
- }
- }
-
- List<String> getClasspath() {
- return ScriptResources.getClasspath();
- }
-
- static String getExecutionModeKey(final ExecuteScriptAction.ExecutionMode executionMode) {
- switch (executionMode) {
- case ON_SINGLE_NODE:
- return "ExecuteScriptOnSingleNode.text";
- case ON_SELECTED_NODE:
- return "ExecuteScriptOnSelectedNode.text";
- case ON_SELECTED_NODE_RECURSIVELY:
- return "ExecuteScriptOnSelectedNodeRecursively.text";
- default:
- throw new AssertionError("unknown ExecutionMode " + executionMode);
- }
- }
-
- public static String[] getScriptsParentLocations() {
- return MENU_BAR_SCRIPTS_PARENT_LOCATIONS;
- }
-
- public static String getScriptsLocation(String parentKey) {
- return parentKey + "/scripts";
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingEngine.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingEngine.java
deleted file mode 100644
index 2b51deb..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingEngine.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Freeplane - A Program for creating and viewing MindmapsCopyright (C) 2000-2006
- * Joerg Mueller, Daniel Polansky, Christian Foltin and others.See COPYING for
- * DetailsThis program is free software; you can redistribute it and/ormodify it
- * under the terms of the GNU General Public Licenseas published by the Free
- * Software Foundation; either version 2of the License, or (at your option) any
- * later version.This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for
- * more details.You should have received a copy of the GNU General Public
- * Licensealong with this program; if not, write to the Free SoftwareFoundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Created on
- * 02.09.2006
- */
-/*
- * $Id: ScriptingEngine.java,v 1.1.2.20 2008/04/18 21:18:26 christianfoltin Exp
- * $
- */
-package org.freeplane.plugin.script;
-
-import java.io.File;
-import java.io.PrintStream;
-import java.util.regex.Matcher;
-
-import org.apache.commons.lang.WordUtils;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-
-/**
- * @author foltin
- */
-public class ScriptingEngine {
- public static final String SCRIPT_PREFIX = "script";
- /**
- * @param permissions if null use default scripting permissions.
- * @return the result of the script, or null, if the user has cancelled.
- * @throws ExecuteScriptException on errors
- */
- public static Object executeScript(final NodeModel node, final String script, final IFreeplaneScriptErrorHandler pErrorHandler,
- final PrintStream pOutStream, final ScriptContext scriptContext,
- ScriptingPermissions permissions) {
- return new GroovyScript(script, permissions)
- .setErrorHandler(pErrorHandler)
- .setOutStream(pOutStream)
- .setScriptContext(scriptContext)
- .execute(node);
-
- }
-
- static Object executeScript(final NodeModel node, final File script, final IFreeplaneScriptErrorHandler pErrorHandler,
- final PrintStream pOutStream, final ScriptContext scriptContext,
- ScriptingPermissions permissions) {
- return createScriptForFile(script, permissions) //
- .setErrorHandler(pErrorHandler) //
- .setOutStream(pOutStream) //
- .setScriptContext(scriptContext) //
- .execute(node);
- }
-
- public static int findLineNumberInString(final String resultString, int lineNumber) {
- final java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(".*@ line ([0-9]+).*",
- java.util.regex.Pattern.DOTALL);
- final Matcher matcher = pattern.matcher(resultString);
- if (matcher.matches()) {
- lineNumber = Integer.parseInt(matcher.group(1));
- }
- return lineNumber;
- }
-
- public static Object executeScript(final NodeModel node, final String script) {
- return new GroovyScript(script).execute(node);
- }
-
- public static Object executeScript(NodeModel node, File script, ScriptingPermissions permissions) {
- return createScriptForFile(script, permissions).execute(node);
- }
-
- public static IScript createScriptForFile(File script, ScriptingPermissions permissions) {
- final boolean isGroovy = script.getName().endsWith(".groovy");
- return isGroovy ? new GroovyScript(script, permissions) : new GenericScript(script, permissions);
- }
-
- public static Object executeScript(NodeModel node, String script, ScriptingPermissions permissions) {
- return new GroovyScript(script, permissions) //
- .execute(node);
- }
-
- public static Object executeScript(NodeModel node, String script, PrintStream printStream) {
- return new GroovyScript(script) //
- .setOutStream(printStream) //
- .execute(node);
- }
-
- public static Object executeScript(final NodeModel node, final String script, final ScriptContext scriptContext,
- final ScriptingPermissions permissions) {
- return new GroovyScript(script, permissions) //
- .setScriptContext(scriptContext) //
- .execute(node);
- }
-
- static void performScriptOperationRecursive(final NodeModel node) {
- ModeController modeController = Controller.getCurrentModeController();
- for (final NodeModel child : modeController.getMapController().childrenUnfolded(node)) {
- performScriptOperationRecursive(child);
- }
- performScriptOperation(node);
- }
-
- static void performScriptOperation(final NodeModel node) {
- final NodeAttributeTableModel attributes = NodeAttributeTableModel.getModel(node);
- if (attributes == null) {
- return;
- }
- for (int row = 0; row < attributes.getRowCount(); ++row) {
- final String attrKey = (String) attributes.getName(row);
- final Object value = attributes.getValue(row);
- if(value instanceof String){
- final String script = (String) value;
- if (attrKey.startsWith(ScriptingEngine.SCRIPT_PREFIX)) {
- executeScript(node, script);
- }
- }
- }
- return;
- }
-
- /** @deprecated use ScriptResources.getUserScriptDir() instead. */
- @Deprecated
- public static File getUserScriptDir() {
- return ScriptResources.getUserScriptDir();
- }
-
- static void showScriptExceptionErrorMessage(ExecuteScriptException ex) {
- if (ex.getCause() instanceof SecurityException) {
- final String message = WordUtils.wrap(ex.getCause().getMessage(), 80, "\n ", false);
- UITools.errorMessage(TextUtils.format("ExecuteScriptSecurityError.text", message));
- }
- else {
- final String message = WordUtils.wrap(ex.getMessage(), 80, "\n ", false);
- UITools.errorMessage(TextUtils.format("ExecuteScriptError.text", message));
- }
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingPermissions.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingPermissions.java
deleted file mode 100644
index 07d7b2c..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingPermissions.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Volker Boerchers in 2011.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.OptionalDontShowMeAgainDialog;
-import org.freeplane.core.util.TextUtils;
-
-/**
- * @author Volker Boerchers
- */
-public class ScriptingPermissions {
- final Map<String, Boolean> permissions = new LinkedHashMap<String, Boolean>();
- public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING = "execute_scripts_without_asking";
- public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION = "execute_scripts_without_file_restriction";
- public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION = "execute_scripts_without_write_restriction";
- public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION = "execute_scripts_without_exec_restriction";
- public static final String RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION = "execute_scripts_without_network_restriction";
- public static final String RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED = "signed_script_are_trusted";
- public static final String RESOURCES_SCRIPT_USER_KEY_NAME_FOR_SIGNING = "script_user_key_name_for_signing";
- public static final String[] PERMISSION_NAMES = { //
- RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING //
- , RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION //
- , RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION //
- , RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION //
- , RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION //
- , RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED //
- };
- private static ScriptingPermissions formulaPermissions;
- private static ScriptingPermissions permissiveScriptingPermissions;
-
- public ScriptingPermissions() {
- // by default nothing is allowed
- for (String permissionName : PERMISSION_NAMES) {
- set(permissionName, false);
- }
- }
-
- public ScriptingPermissions(Properties properties) {
- for (String permissionName : PERMISSION_NAMES) {
- final Object value = properties.get(permissionName);
- if (value != null) {
- final String valueString = value.toString();
- if(! "".equals(valueString))
- set(permissionName, Boolean.parseBoolean(valueString));
- }
- }
- }
-
- public boolean get(String permissionName) {
- final Boolean savedValue = permissions.get(permissionName);
- return savedValue != null && savedValue.booleanValue();
- }
-
- private void set(String permissionName, boolean value) {
- permissions.put(permissionName, value);
- }
-
- void restorePermissions() {
- for (String permissionName : PERMISSION_NAMES) {
- restore(permissionName);
- }
- }
-
- private void restore(final String permissionName) {
- final Boolean savedValue = permissions.get(permissionName);
- if (savedValue != null)
- ResourceController.getResourceController().setProperty(permissionName, savedValue);
- else
- ResourceController.getResourceController().setProperty(permissionName, "");
- }
-
- ScriptingSecurityManager getScriptingSecurityManager() {
- boolean readPerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION);
- boolean writePerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION);
- boolean networkPerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION);
- boolean execPerm = get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION);
- return new ScriptingSecurityManager(readPerm, writePerm, networkPerm, execPerm);
- }
-
- /** this method is called only if the formula plugin is active and so formula evaluation is allowed. */
- public static ScriptingPermissions getFormulaPermissions() {
- if (formulaPermissions == null) {
- formulaPermissions = new ScriptingPermissions();
- formulaPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING, true);
- // the classpath is set by the user - this forces us to loose the permissions a bit (if the user permits it)
- if (ScriptResources.getClasspath() != null) {
- formulaPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION, ResourceController
- .getResourceController().getBooleanProperty(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION));
- }
- }
- return formulaPermissions;
- }
-
- ScriptingSecurityManager getPermissiveScriptingSecurityManager() {
- return new ScriptingSecurityManager(true, true, true, true);
- }
-
- public static ScriptingPermissions getPermissiveScriptingPermissions() {
- if (permissiveScriptingPermissions == null) {
- permissiveScriptingPermissions = new ScriptingPermissions();
- permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING, true);
- permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION, true);
- permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION, true);
- permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_NETWORK_RESTRICTION, true);
- permissiveScriptingPermissions.set(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_EXEC_RESTRICTION, true);
- }
- return permissiveScriptingPermissions;
- }
-
- boolean isExecuteSignedScriptsWithoutRestriction() {
- return get(RESOURCES_SIGNED_SCRIPT_ARE_TRUSTED);
- }
-
- private boolean executeScriptsWithoutAsking() {
- return get(RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING);
- }
-
- public static List<String> getPermissionNames() {
- return Arrays.asList(PERMISSION_NAMES);
- }
-
- public void assertScriptExecutionAllowed() {
- if (! executeScriptsWithoutAsking()) {
- final int showResult = OptionalDontShowMeAgainDialog.show("really_execute_script", "confirmation",
- ScriptingPermissions.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING,
- OptionalDontShowMeAgainDialog.BOTH_OK_AND_CANCEL_OPTIONS_ARE_STORED);
- if (showResult != JOptionPane.OK_OPTION) {
- throw new ExecuteScriptException(new SecurityException(TextUtils.getText("script_execution_disabled")));
- }
- }
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingRegistration.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingRegistration.java
deleted file mode 100644
index 5313b44..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingRegistration.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.awt.Dimension;
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FilenameFilter;
-import java.io.PrintStream;
-import java.net.URL;
-import java.text.MessageFormat;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map.Entry;
-import java.util.Properties;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.IValidator;
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.IUserInputListenerFactory;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.script.IScriptEditorStarter;
-import org.freeplane.features.script.IScriptStarter;
-import org.freeplane.main.addons.AddOnInstaller;
-import org.freeplane.main.addons.AddOnsController;
-import org.freeplane.n3.nanoxml.IXMLParser;
-import org.freeplane.n3.nanoxml.IXMLReader;
-import org.freeplane.n3.nanoxml.StdXMLReader;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.n3.nanoxml.XMLParserFactory;
-import org.freeplane.plugin.script.ExecuteScriptAction.ExecutionMode;
-import org.freeplane.plugin.script.ScriptEditorPanel.IScriptModel;
-import org.freeplane.plugin.script.ScriptEditorPanel.ScriptHolder;
-import org.freeplane.plugin.script.ScriptingConfiguration.ScriptMetaData;
-import org.freeplane.plugin.script.addons.ManageAddOnsAction;
-import org.freeplane.plugin.script.addons.ManageAddOnsDialog;
-import org.freeplane.plugin.script.addons.ScriptAddOnProperties;
-import org.freeplane.plugin.script.filter.ScriptConditionController;
-
-class ScriptingRegistration {
- final private class ScriptModel implements IScriptModel {
- final private String mOriginalScript;
- private String mScript;
-
- public ScriptModel(final String pScript) {
- mScript = pScript;
- mOriginalScript = pScript;
- }
-
- public int addNewScript() {
- return 0;
- }
-
- public ScriptEditorWindowConfigurationStorage decorateDialog(final ScriptEditorPanel pPanel,
- final String pWindow_preference_storage_property) {
- final String marshalled = ResourceController.getResourceController().getProperty(
- pWindow_preference_storage_property);
- return ScriptEditorWindowConfigurationStorage.decorateDialog(marshalled, pPanel);
- }
-
- public void endDialog(final boolean pIsCanceled) {
- if (pIsCanceled) {
- mScript = mOriginalScript;
- }
- }
-
- public Object executeScript(final int pIndex, final PrintStream pOutStream, final IFreeplaneScriptErrorHandler pErrorHandler) {
- final ModeController modeController = Controller.getCurrentModeController();
- // the script is completely in the hand of the user -> no security issues.
- final ScriptingPermissions restrictedPermissions = ScriptingPermissions.getPermissiveScriptingPermissions();
- return ScriptingEngine.executeScript(modeController.getMapController().getSelectedNode(), mScript,
- pErrorHandler, pOutStream, null, restrictedPermissions);
- }
-
- public int getAmountOfScripts() {
- return 1;
- }
-
- public String getScript() {
- return mScript;
- }
-
- public ScriptHolder getScript(final int pIndex) {
- return new ScriptHolder("Script", mScript);
- }
-
- public boolean isDirty() {
- return !StringUtils.equals(mScript, mOriginalScript);
- }
-
- public void setScript(final int pIndex, final ScriptHolder pScript) {
- mScript = pScript.getScript();
- }
-
- public void storeDialogPositions(final ScriptEditorPanel pPanel,
- final ScriptEditorWindowConfigurationStorage pStorage,
- final String pWindow_preference_storage_property) {
- pStorage.storeDialogPositions(pPanel, pWindow_preference_storage_property);
- }
- }
-
- final private HashMap<String, Object> mScriptCookies = new HashMap<String, Object>();
-
- public ScriptingRegistration(ModeController modeController) {
- register(modeController);
- }
-
- private void addPropertiesToOptionPanel() {
- final URL preferences = this.getClass().getResource("preferences.xml");
- if (preferences == null)
- throw new RuntimeException("cannot open preferences");
- Controller.getCurrentController().addOptionValidator(new IValidator() {
- public ValidationResult validate(Properties properties) {
- final ValidationResult result = new ValidationResult();
- final String readAccessString = properties
- .getProperty(ScriptingPermissions.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_READ_RESTRICTION);
- final String writeAccessString = properties
- .getProperty(ScriptingPermissions.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_WRITE_RESTRICTION);
- final String classpath = properties.getProperty(ScriptResources.RESOURCES_SCRIPT_CLASSPATH);
- final boolean readAccess = readAccessString != null && Boolean.parseBoolean(readAccessString);
- final boolean writeAccess = writeAccessString != null && Boolean.parseBoolean(writeAccessString);
- final boolean classpathIsSet = classpath != null && classpath.length() > 0;
- if (classpathIsSet && !readAccess) {
- result.addError(TextUtils.getText("OptionPanel.validate_classpath_needs_readaccess"));
- }
- if (writeAccess && !readAccess) {
- result.addWarning(TextUtils.getText("OptionPanel.validate_write_without_read"));
- }
- return result;
- }
- });
- final MModeController modeController = (MModeController) Controller.getCurrentModeController();
- modeController.getOptionPanelBuilder().load(preferences);
- }
-
- public HashMap<String, Object> getScriptCookies() {
- return mScriptCookies;
- }
-
- private void register(ModeController modeController) {
- modeController.addExtension(IScriptEditorStarter.class, new IScriptEditorStarter() {
- public String startEditor(final String pScriptInput) {
- final ScriptModel scriptModel = new ScriptModel(pScriptInput);
- final ScriptEditorPanel scriptEditorPanel = new ScriptEditorPanel(scriptModel, false);
- scriptEditorPanel.setVisible(true);
- return scriptModel.getScript();
- }
-
- public ComboBoxEditor createComboBoxEditor(Dimension minimumSize) {
- final ScriptComboBoxEditor scriptComboBoxEditor = new ScriptComboBoxEditor();
- if(minimumSize != null)
- scriptComboBoxEditor.setMinimumSize(minimumSize);
- return scriptComboBoxEditor;
- }
- });
- modeController.addExtension(IScriptStarter.class, new IScriptStarter() {
- public void executeScript(NodeModel node, String script) {
- ScriptingEngine.executeScript(node, script);
- }
- });
- registerScriptAddOns();
- if(! modeController.getController().getViewController().isHeadless()){
- final IUserInputListenerFactory userInputListenerFactory = modeController.getUserInputListenerFactory();
- addPropertiesToOptionPanel();
- final MenuBuilder menuBuilder = userInputListenerFactory.getMenuBuilder();
- modeController.addAction(new ScriptEditor());
- modeController.addAction(new ExecuteScriptForAllNodes());
- modeController.addAction(new ExecuteScriptForSelectionAction());
- final ManageAddOnsAction manageAddOnsAction = new ManageAddOnsAction();
- modeController.addAction(manageAddOnsAction);
- modeController.addExtension(AddOnInstaller.class, new AddOnInstaller() {
- public void install(final URL url) {
- final ManageAddOnsDialog dialog = manageAddOnsAction.getDialog();
- dialog.install(url);
- }
- });
- final ScriptingConfiguration configuration = new ScriptingConfiguration();
- ScriptCompiler.compileScriptsOnPath(ScriptResources.getClasspath());
- modeController.addMenuContributor(new IMenuContributor() {
- public void updateMenus(ModeController modeController, MenuBuilder builder) {
- registerScripts(menuBuilder, configuration);
- }
- });
- createUserScriptsDirectory();
- createUserLibDirectory();
- }
- FilterController.getCurrentFilterController().getConditionFactory().addConditionController(10,
- new ScriptConditionController());
- }
-
- private void registerScriptAddOns() {
- File[] addonXmlFiles = AddOnsController.getController().getAddOnsDir().listFiles(new FilenameFilter() {
- public boolean accept(File dir, String name) {
- return name.endsWith(".script.xml");
- }
- });
- final IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
- for (File file : addonXmlFiles) {
- BufferedInputStream inputStream = null;
- try {
- inputStream = new BufferedInputStream(new FileInputStream(file));
- final IXMLReader reader = new StdXMLReader(inputStream);
- parser.setReader(reader);
- final ScriptAddOnProperties addOn = new ScriptAddOnProperties((XMLElement) parser.parse());
- addOn.setAddOnPropertiesFile(file);
- AddOnsController.getController().registerInstalledAddOn(addOn);
- }
- catch (final Exception e) {
- LogUtils.warn("error parsing " + file, e);
- }
- finally {
- FileUtils.silentlyClose(inputStream);
- }
- }
- }
-
- private void createUserScriptsDirectory() {
- final File scriptDir = ScriptResources.getUserScriptsDir();
- if (!scriptDir.exists()) {
- LogUtils.info("creating user scripts directory " + scriptDir);
- scriptDir.mkdirs();
- }
- }
-
- private void createUserLibDirectory() {
- final File libDir = ScriptResources.getUserLibDir();
- if (!libDir.exists()) {
- LogUtils.info("creating user lib directory " + libDir);
- libDir.mkdirs();
- }
- }
-
- private void registerScripts(final MenuBuilder menuBuilder, ScriptingConfiguration configuration) {
- final HashSet<String> registeredLocations = new HashSet<String>();
- for (final String scriptsParentLocation : ScriptingConfiguration.getScriptsParentLocations()) {
- final String scriptsLocation = ScriptingConfiguration.getScriptsLocation(scriptsParentLocation);
- addSubMenu(menuBuilder, scriptsParentLocation, scriptsLocation, TextUtils.getText("ExecuteScripts.text"));
- registeredLocations.add(scriptsLocation);
- if (configuration.getMenuTitleToPathMap().isEmpty()) {
- final String message = "<html><body><em>" + TextUtils.getText("ExecuteScripts.noScriptsAvailable")
- + "</em></body></html>";
- menuBuilder.addElement(scriptsLocation, new JMenuItem(message), 0);
- }
- for (final Entry<String, String> entry : configuration.getMenuTitleToPathMap().entrySet()) {
- final String scriptName = entry.getKey();
- final ScriptMetaData metaData = configuration.getMenuTitleToMetaDataMap().get(scriptName);
- // in the worst case three actions will cache a script - should not matter that much since it's unlikely
- // that one script is used in multiple modes by the same user
- for (final ExecutionMode executionMode : metaData.getExecutionModes()) {
- final String titleKey;
- final String scriptLocation;
- String location = metaData.getMenuLocation(executionMode);
- // FIXME: reduce code duplication (VB)
- if (location == null) {
- location = scriptsLocation + "/" + scriptName;
- if (!registeredLocations.contains(location)) {
- final String parentMenuTitle = pimpMenuTitle(metaData.getScriptName());
- addSubMenu(menuBuilder, parentLocation(location), location, parentMenuTitle);
- registeredLocations.add(location);
- }
- titleKey = metaData.getTitleKey(executionMode);
- scriptLocation = location + "/" + titleKey;
- }
- else {
- if (!registeredLocations.contains(location)) {
- addSubMenu(menuBuilder, parentLocation(location), location, getMenuTitle(location));
- registeredLocations.add(location);
- }
- titleKey = metaData.getTitleKey(executionMode);
- scriptLocation = location + "/" + titleKey;
- }
- if (!registeredLocations.contains(scriptLocation)) {
- addMenuItem(menuBuilder, location, entry, executionMode, titleKey, metaData);
- registeredLocations.add(scriptLocation);
- }
- }
- }
- }
- }
-
- // location might be something like /menu_bar/edit/editGoodies
- private String getMenuTitle(final String location) {
- int index = location.lastIndexOf('/');
- final String lastKey = location.substring(index + 1);
- return TextUtils.getText(lastKey, TextUtils.getText("addons." + lastKey, lastKey));
- }
-
- private String parentLocation(String location) {
- return location.replaceFirst("/[^/]*$", "");
- }
-
- private void addSubMenu(final MenuBuilder menuBuilder, final String parentLocation, final String location,
- String menuTitle) {
- if (menuBuilder.get(location) == null) {
- final JMenu menuItem = new JMenu();
- MenuBuilder.setLabelAndMnemonic(menuItem, menuTitle);
- menuBuilder.addMenuItem(parentLocation, menuItem, location, MenuBuilder.AS_CHILD);
- }
- }
-
- private void addMenuItem(final MenuBuilder menuBuilder, final String location, final Entry<String, String> entry,
- final ExecutionMode executionMode, final String titleKey, ScriptMetaData metaData) {
- final String scriptName = entry.getKey();
- final String translation = TextUtils.getText(titleKey, titleKey.replace('_', ' '));
- final String menuName = translation.contains("{0}") ? MessageFormat.format(translation,
- pimpMenuTitle(scriptName)) : translation;
- menuBuilder.addAction(location, new ExecuteScriptAction(scriptName, menuName, entry.getValue(), executionMode,
- metaData.cacheContent(), metaData.getPermissions()), MenuBuilder.AS_CHILD);
- }
-
- /** menuTitle may either be a scriptName or a translation key. */
- private String pimpMenuTitle(final String menuTitle) {
- final String translation = TextUtils.getText(menuTitle, null);
- // convert CamelCase to Camel Case
- return translation != null ? translation : menuTitle.replaceAll("([a-z])([A-Z])", "$1 $2");
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingSecurityManager.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingSecurityManager.java
deleted file mode 100644
index 0d8d133..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/ScriptingSecurityManager.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.io.FileDescriptor;
-import java.net.InetAddress;
-import java.security.Permission;
-import java.util.HashSet;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ICondition;
-import org.freeplane.plugin.script.proxy.Proxy;
-
-/**
- * @author foltin
- */
-class ScriptingSecurityManager extends SecurityManager {
- private static final String INTERNAL_API_PACKAGE_BASE = "org.freeplane";
- private static final HashSet<String> whiteList = createWhiteList();
- private static final int PERM_Accept = 0;
- private static final int PERM_Connect = 1;
- private static final int PERM_Delete = 7;
- private static final int PERM_Exec = 5;
- private static final int PERM_GROUP_EXEC = 2;
- private static final int PERM_GROUP_FILE = 0;
- private static final int PERM_GROUP_NETWORK = 1;
- private static final int PERM_Link = 6;
- private static final int PERM_Listen = 2;
- private static final int PERM_Multicast = 3;
- private static final int PERM_Read = 8;
- private static final int PERM_SetFactory = 4;
- private static final int PERM_Write = 9;
- final private boolean mWithoutReadRestriction;
- final private boolean mWithoutWriteRestriction;
- final private boolean mWithoutExecRestriction;
- final private boolean mWithoutNetworkRestriction;
-
- public ScriptingSecurityManager(final boolean pWithoutFileRestriction, boolean pWithoutWriteRestriction,
- final boolean pWithoutNetworkRestriction, final boolean pWithoutExecRestriction) {
- mWithoutReadRestriction = pWithoutFileRestriction;
- mWithoutWriteRestriction = pWithoutWriteRestriction;
- mWithoutNetworkRestriction = pWithoutNetworkRestriction;
- mWithoutExecRestriction = pWithoutExecRestriction;
- }
-
- private static HashSet<String> createWhiteList() {
- final HashSet<String> result = new HashSet<String>();
- result.add(Proxy.class.getPackage().getName());
- result.add(TextUtils.class.getPackage().getName());
- // this one is under debate since UITools should be moved to the utils package
- result.add(UITools.class.getPackage().getName());
- // this one is necessary due to deprecated API methods: find(ICondition)
- result.add(ICondition.class.getPackage().getName());
- // the following are considered wrong
-// result.add(NodeModel.class.getPackage().getName());
-// result.add(NoteModel.class.getPackage().getName());
-// result.add(LinkController.class.getPackage().getName());
-// result.add(MLinkController.class.getPackage().getName());
-// result.add(MindIcon.class.getPackage().getName());
-// result.add(MindIconFactory.class.getPackage().getName());
-// result.add(MNoteController.class.getPackage().getName());
- return result;
- }
-
- @Override
- public void checkAccept(final String pHost, final int pPort) {
- if (mWithoutNetworkRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_NETWORK, ScriptingSecurityManager.PERM_Accept);
- }
-
- @Override
- public void checkAccess(final Thread pT) {
- }
-
- @Override
- public void checkAccess(final ThreadGroup pG) {
- }
-
- @Override
- public void checkAwtEventQueueAccess() {
- }
-
- @Override
- public void checkConnect(final String pHost, final int pPort) {
- if (mWithoutNetworkRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_NETWORK, ScriptingSecurityManager.PERM_Connect);
- }
-
- @Override
- public void checkConnect(final String pHost, final int pPort, final Object pContext) {
- if (mWithoutNetworkRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_NETWORK, ScriptingSecurityManager.PERM_Connect);
- }
-
- @Override
- public void checkCreateClassLoader() {
- }
-
- @Override
- public void checkDelete(final String pFile) {
- if (mWithoutReadRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_FILE, ScriptingSecurityManager.PERM_Delete);
- }
-
- @Override
- public void checkExec(final String pCmd) {
- if (mWithoutExecRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_EXEC, ScriptingSecurityManager.PERM_Exec);
- }
-
- @Override
- public void checkExit(final int pStatus) {
- }
-
- @Override
- public void checkLink(final String pLib) {
- /*
- * This should permit system libraries to be loaded.
- */
- final HashSet<String> set = new HashSet<String>();
- set.add("awt");
- set.add("net");
- set.add("jpeg");
- set.add("fontmanager");
- if (mWithoutExecRestriction || set.contains(pLib)) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_EXEC, ScriptingSecurityManager.PERM_Link);
- }
-
- @Override
- public void checkListen(final int pPort) {
- if (mWithoutNetworkRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_NETWORK, ScriptingSecurityManager.PERM_Listen);
- }
-
- @Override
- public void checkMemberAccess(final Class<?> arg0, final int arg1) {
- }
-
- @Override
- public void checkMulticast(final InetAddress pMaddr) {
- if (mWithoutNetworkRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_NETWORK, ScriptingSecurityManager.PERM_Multicast);
- }
-
- @Override
- public void checkMulticast(final InetAddress pMaddr, final byte pTtl) {
- if (mWithoutNetworkRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_NETWORK, ScriptingSecurityManager.PERM_Multicast);
- }
-
- @Override
- public void checkPackageAccess(final String pkg) {
- if (pkg.startsWith(INTERNAL_API_PACKAGE_BASE) && !whiteList.contains(pkg)) {
- // temporaribly disabled:
- // throw new SecurityException(TextUtils.format("plugins/ScriptingEngine.illegalAccessToInternalAPI", pkg));
-// LogUtils.warn("access to internal package " + pkg);
- }
- }
-
- @Override
- public void checkPackageDefinition(final String pPkg) {
- }
-
- @Override
- public void checkPermission(final Permission pPerm) {
- }
-
- @Override
- public void checkPermission(final Permission pPerm, final Object pContext) {
- }
-
- @Override
- public void checkPrintJobAccess() {
- }
-
- @Override
- public void checkPropertiesAccess() {
- }
-
- @Override
- public void checkPropertyAccess(final String pKey) {
- }
-
- @Override
- public void checkRead(final FileDescriptor pFd) {
- if (mWithoutReadRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_FILE, ScriptingSecurityManager.PERM_Read);
- }
-
- @Override
- public void checkRead(final String pFile) {
- if (mWithoutReadRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_FILE, ScriptingSecurityManager.PERM_Read, pFile);
- }
-
- @Override
- public void checkRead(final String pFile, final Object pContext) {
- if (mWithoutReadRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_FILE, ScriptingSecurityManager.PERM_Read);
- }
-
- @Override
- public void checkSecurityAccess(final String pTarget) {
- }
-
- @Override
- public void checkSetFactory() {
- if (mWithoutNetworkRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_NETWORK, ScriptingSecurityManager.PERM_SetFactory);
- }
-
- @Override
- public void checkSystemClipboardAccess() {
- }
-
- @Override
- public boolean checkTopLevelWindow(final Object pWindow) {
- return true;
- }
-
- @Override
- public void checkWrite(final FileDescriptor pFd) {
- if (mWithoutWriteRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_FILE, ScriptingSecurityManager.PERM_Write);
- }
-
- @Override
- public void checkWrite(final String pFile) {
- if (mWithoutWriteRestriction) {
- return;
- }
- throw getException(ScriptingSecurityManager.PERM_GROUP_FILE, ScriptingSecurityManager.PERM_Write);
- }
-
- private SecurityException getException(final int pPermissionGroup, final int pPermission, String pFile) {
- return new SecurityException(TextUtils.format("plugins/ScriptEditor.FORBIDDEN_ACTION", new Integer(
- pPermissionGroup), new Integer(pPermission), pFile));
- }
-
- private SecurityException getException(final int pPermissionGroup, final int pPermission) {
- return getException(pPermissionGroup, pPermission, "");
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/SignedScriptHandler.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/SignedScriptHandler.java
deleted file mode 100644
index 8fa9901..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/SignedScriptHandler.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Joerg Mueller, Daniel Polansky, Christian Foltin, Dimitry Polivaev
- *
- * This file author is Christian Foltin
- * It is modified by Dimitry Polivaev in 2008.
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script;
-
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.security.KeyStore;
-import java.security.KeyStoreException;
-import java.security.PrivateKey;
-import java.security.Signature;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateFactory;
-import java.util.Collection;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.components.EnterPasswordDialog;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.encrypt.DesEncrypter;
-import org.freeplane.features.mode.Controller;
-
-/**
- * @author foltin
- */
-class SignedScriptHandler {
- public static class ScriptContents {
- private static Pattern sSignWithKeyPattern = null;
- public String mKeyName;
- public String mScript;
- public String mSignature;
-
- public ScriptContents() {
- if (ScriptContents.sSignWithKeyPattern == null) {
- ScriptContents.sSignWithKeyPattern = Pattern.compile(SignedScriptHandler.SIGN_PREFIX_REGEXP);
- }
- }
-
- public ScriptContents(final String pScript) {
- this();
- final int indexOfSignaturePrefix = pScript.lastIndexOf(SignedScriptHandler.SIGN_PREFIX);
- final int indexOfSignature = indexOfSignaturePrefix + SignedScriptHandler.SIGN_PREFIX.length();
- if (indexOfSignaturePrefix > 0 && pScript.length() > indexOfSignature) {
- mSignature = pScript.substring(indexOfSignature);
- mScript = pScript.substring(0, indexOfSignaturePrefix);
- mKeyName = null;
- }
- else {
- final Matcher matcher = ScriptContents.sSignWithKeyPattern.matcher(pScript);
- if (matcher.find()) {
- mScript = pScript.substring(0, matcher.start());
- mKeyName = matcher.group(1);
- mSignature = matcher.group(2);
- }
- else {
- mSignature = null;
- mScript = pScript;
- mKeyName = null;
- }
- }
- }
-
- @Override
- public String toString() {
- String prefix;
- if (mKeyName != null) {
- prefix = "//SIGN(" + mKeyName + "):";
- }
- else {
- prefix = SignedScriptHandler.SIGN_PREFIX;
- }
- return mScript + prefix + mSignature + "\n";
- }
- }
-
- public static final String FREEPLANE_SCRIPT_KEY_NAME = "FreeplaneScriptKey";
- private static KeyStore mKeyStore = null;
- private static final String SIGN_PREFIX = "//SIGN:";
- /** This is for / /SIGN(keyname):signature */
- private static final String SIGN_PREFIX_REGEXP = "//SIGN\\((.*?)\\):(.*)";
-
- public SignedScriptHandler() {
- }
-
- private void initializeKeystore(final char[] pPassword) {
- if (SignedScriptHandler.mKeyStore != null) {
- return;
- }
- java.io.FileInputStream fis = null;
- try {
- SignedScriptHandler.mKeyStore = KeyStore.getInstance(KeyStore.getDefaultType());
- fis = new java.io.FileInputStream(System.getProperty("user.home") + File.separator + ".keystore");
- SignedScriptHandler.mKeyStore.load(fis, pPassword);
- }
- catch (final FileNotFoundException e) {
- LogUtils.warn(e);
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- finally {
- if (fis != null) {
- try {
- fis.close();
- }
- catch (final IOException e) {
- LogUtils.severe(e);
- }
- }
- }
- }
-
- public boolean isScriptSigned(final String pScript, final OutputStream pOutStream) {
- final ScriptContents content = new ScriptContents(pScript);
- if (content.mSignature != null) {
- try {
- final Signature instanceVerify = Signature.getInstance("SHA1withDSA");
- if (content.mKeyName == null) {
- /**
- * This is the Freeplane public key. keytool -v -rfc
- * -exportcert -alias freeplanescriptkey
- */
- final String cer = "-----BEGIN CERTIFICATE-----\n"
- + "MIIDKDCCAuWgAwIBAgIESAY2ADALBgcqhkjOOAQDBQAwdzELMAkGA1UEBhMCREUxCzAJBgNVBAgT"
- + "AkRFMRMwEQYDVQQHEwpPcGVuU291cmNlMRgwFgYDVQQKEw9zb3VyY2Vmb3JnZS5uZXQxETAPBgNV"
- + "BAsTCEZyZWVNaW5kMRkwFwYDVQQDExBDaHJpc3RpYW4gRm9sdGluMB4XDTA4MDQxNjE3MjMxMloX"
- + "DTA4MDcxNTE3MjMxMlowdzELMAkGA1UEBhMCREUxCzAJBgNVBAgTAkRFMRMwEQYDVQQHEwpPcGVu"
- + "U291cmNlMRgwFgYDVQQKEw9zb3VyY2Vmb3JnZS5uZXQxETAPBgNVBAsTCEZyZWVNaW5kMRkwFwYD"
- + "VQQDExBDaHJpc3RpYW4gRm9sdGluMIIBtzCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9K"
- + "nC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVCl"
- + "pJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3R"
- + "SAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdM"
- + "Cz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/"
- + "C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoDgYQAAoGAZm5z5EZX"
- + "Vhtye5jY3X9w24DJ3yNJbNl2tfkOBIc0KfgyxONTSJKtUpmLI3btUxy3pQf/T8BShlY3PAC0fp3M"
- + "eDG8WRq1wM3luLd1V9SS8EG6tPJBZ3mciCUymTT7n9CZNzATIpqNIXHSD/wljRABedUi8PMg4KbV"
- + "Pnhu6Y6b1uAwCwYHKoZIzjgEAwUAAzAAMC0CFQCFHGwe+HHOvY0MmKYHbiq7fRxMGwIUC0voAGYU"
- + "u6vgVFqdLI5F96JLTqk=" + "\n-----END CERTIFICATE-----\n";
- final CertificateFactory cf = CertificateFactory.getInstance("X.509");
- final Collection<? extends Certificate> c = cf.generateCertificates(new ByteArrayInputStream(cer
- .getBytes()));
- if (c.isEmpty())
- throw new IllegalArgumentException("Internal certificate wrong.");
- for (Certificate cert : c) {
- instanceVerify.initVerify(cert);
- }
- }
- else {
- initializeKeystore(null);
- instanceVerify.initVerify(SignedScriptHandler.mKeyStore.getCertificate(content.mKeyName));
- }
- instanceVerify.update(content.mScript.getBytes());
- final boolean verify = instanceVerify.verify(DesEncrypter.fromBase64(content.mSignature));
- return verify;
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- try {
- pOutStream.write(e.toString().getBytes());
- pOutStream.write("\n".getBytes());
- }
- catch (final Exception e1) {
- LogUtils.severe(e1);
- }
- }
- }
- return false;
- }
-
- public String signScript(final String pScript) {
- final ScriptContents content = new ScriptContents(pScript);
- final EnterPasswordDialog pwdDialog = new EnterPasswordDialog(Controller.getCurrentController().getViewController().getJFrame(), false);
- pwdDialog.setModal(true);
- pwdDialog.setVisible(true);
- if (pwdDialog.getResult() == EnterPasswordDialog.CANCEL) {
- return content.mScript;
- }
- final char[] password = pwdDialog.getPassword().toString().toCharArray();
- initializeKeystore(password);
- try {
- final Signature instance = Signature.getInstance("SHA1withDSA");
- String keyName = SignedScriptHandler.FREEPLANE_SCRIPT_KEY_NAME;
- final String propertyKeyName = ResourceController.getResourceController().getProperty(
- ScriptingPermissions.RESOURCES_SCRIPT_USER_KEY_NAME_FOR_SIGNING);
- if (content.mKeyName != null) {
- keyName = content.mKeyName;
- }
- else if (propertyKeyName != null && propertyKeyName.length() > 0) {
- content.mKeyName = propertyKeyName;
- keyName = content.mKeyName;
- }
- instance.initSign((PrivateKey) SignedScriptHandler.mKeyStore.getKey(keyName, password));
- instance.update(content.mScript.getBytes());
- final byte[] signature = instance.sign();
- content.mSignature = DesEncrypter.toBase64(signature);
- return content.toString();
- }
- catch (final Exception e) {
- if(! (e instanceof KeyStoreException))
- LogUtils.severe(e);
- UITools.errorMessage(e.getLocalizedMessage());
- }
- return content.mScript;
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddOnDetailsPanel.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddOnDetailsPanel.java
deleted file mode 100644
index 9def12a..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddOnDetailsPanel.java
+++ /dev/null
@@ -1,236 +0,0 @@
-package org.freeplane.plugin.script.addons;
-
-import java.awt.Dimension;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import javax.swing.Box;
-import javax.swing.ImageIcon;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JMenuItem;
-import javax.swing.JPanel;
-import javax.swing.KeyStroke;
-import javax.swing.tree.DefaultMutableTreeNode;
-
-import org.apache.commons.lang.StringUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.MenuUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.icon.IconNotFound;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.main.addons.AddOnProperties;
-import org.freeplane.plugin.script.ExecuteScriptAction;
-import org.freeplane.plugin.script.addons.ScriptAddOnProperties.Script;
-
-import com.jgoodies.forms.factories.FormFactory;
-import com.jgoodies.forms.layout.ColumnSpec;
-import com.jgoodies.forms.layout.FormLayout;
-import com.jgoodies.forms.layout.RowSpec;
-
- at SuppressWarnings("serial")
-public class AddOnDetailsPanel extends JPanel {
- private int maxWidth = 500;
- private String warning;
-
- public AddOnDetailsPanel(final AddOnProperties addOn, final String warning) {
- this.warning = warning;
- setLayout(new FormLayout(new ColumnSpec[] {
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,
- ColumnSpec.decode("default:grow"),},
- new RowSpec[] {
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- RowSpec.decode("top:default:grow"),}));
- if (warning != null) {
- JLabel warningLabel = createWarningLabel(addOn);
- add(warningLabel, "3, 2");
- }
- JLabel imageLabel = createImageLabel(addOn);
- add(imageLabel, "1, 4");
- JLabel title = createTitleLabel(addOn);
- add(title, "3, 4");
- JLabel author = createAuthorLabel(addOn);
- add(author, "3, 6");
- final Box box = Box.createHorizontalBox();
- box.add(new JLabel(getText("homepage")));
- box.add(createAddOnHomepageButton(addOn));
- add(box, "3, 8, left, default");
- JComponent details = createDetails(addOn);
- add(details, "3, 9");
- }
-
- private JLabel createImageLabel(AddOnProperties addOn) {
- final JLabel label = new JLabel("");
- label.setIcon(IconNotFound.createIconOrReturnNotFoundIcon(addOn.getName() + ".png"));
- return label;
- }
-
- /**
- * @wbp.parser.constructor
- */
- public AddOnDetailsPanel(AddOnProperties addOn) {
- this(addOn, null);
- }
-
- private JLabel createWarningLabel(final AddOnProperties addOn) {
- return new JLabel("<html><body>" + warning.replaceAll("</?(html|body)>", "") + "</body></html>");
- }
-
- private JLabel createTitleLabel(final AddOnProperties addOn) {
- return new JLabel("<html><body><b><font size='+2'>" + toHtml(addOn.getTranslatedName()) + " "
- + addOn.getVersion().replaceAll("^v", "") + "</font></b></body></html>");
- }
-
- private JLabel createAuthorLabel(final AddOnProperties addOn) {
- final String text = addOn.getAuthor() == null ? "" : "<html><body><strong><font size='-1'>"
- + getText("authored.by", toHtml(addOn.getAuthor())) + "</font></strong></body></html>";
- return new JLabel(text);
- }
-
- private JComponent createAddOnHomepageButton(final AddOnProperties addOn) {
- // parse the URI on creation of the dialog to test the URI syntax early
- try {
- return UITools.createHtmlLinkStyleButton(addOn.getHomepage().toURI(), addOn.getHomepage().toString());
- }
- catch (Exception e) {
- LogUtils.warn("add-on " + addOn + " has no valid homepage: " + e);
- return new JLabel("-");
- }
- }
-
- private JComponent createDetails(final AddOnProperties addOn) {
- final StringBuilder text = new StringBuilder(1024);
- text.append("<html><body>");
- text.append(toHtml(addOn.getDescription()));
- text.append("<p>");
- if (addOn instanceof ScriptAddOnProperties) {
- List<Script> scripts = ((ScriptAddOnProperties) addOn).getScripts();
- if (!scripts.isEmpty()) {
- text.append("<table border='1'>");
- text.append(row("th", getText("header.function"), getText("header.menu"), getText("header.shortcut")));
- for (ScriptAddOnProperties.Script script : scripts) {
- text.append(row("td", bold(TextUtils.getText(script.menuTitleKey)), formatMenuLocation(script),
- formatShortcut(script)));
- }
- text.append("</table>");
- }
- }
- text.append("</body></html>");
- final JLabel label = new JLabel(text.toString());
- label.setAutoscrolls(true);
- final ImageIcon icon = IconNotFound.createIconOrReturnNull(addOn.getName() + "-screenshot-1.png");
- if (icon != null)
- label.setIcon(icon);
- return label;
- }
-
- private String toHtml(String htmlOrPlainText) {
- if (HtmlUtils.isHtmlNode(htmlOrPlainText))
- return htmlOrPlainText.replaceAll("</?(html|body)>", "");
- else
- return HtmlUtils.toHTMLEscapedText(htmlOrPlainText);
- }
-
- private String formatShortcut(final Script script) {
- final String menuItemKey = ExecuteScriptAction.makeMenuItemKey(script.menuTitleKey, script.executionMode);
- final String shortcutKey = MenuUtils.makeAcceleratorKey(menuItemKey);
- final String oldShortcut = ResourceController.getResourceController().getProperty(shortcutKey);
- final KeyStroke keyStroke = UITools.getKeyStroke(oldShortcut != null ? oldShortcut : script.keyboardShortcut);
- return UITools.keyStrokeToString(keyStroke);
- }
-
- private String formatMenuLocation(ScriptAddOnProperties.Script script) {
- final String location = script.menuLocation == null ? "main_menu_scripting" : script.menuLocation;
- MenuBuilder menuBuilder = Controller.getCurrentModeController().getUserInputListenerFactory().getMenuBuilder();
- // "/menu_bar/edit/menu_extensions" -> [Node Extensions, Edit]
- final List<String> pathElements = getMenuPathElements(menuBuilder, location);
- Collections.reverse(pathElements);
- pathElements.add(TextUtils.getText(script.menuTitleKey));
- return StringUtils.join(pathElements.iterator(), "->");
- }
-
- public static List<String> getMenuPathElements(MenuBuilder menuBuilder, final String location) {
- final ArrayList<String> pathElements = new ArrayList<String>();
- final DefaultMutableTreeNode node = menuBuilder.get(location);
- if (node != null) {
- pathElements.addAll(getMenuPathElements(node));
- }
- else {
- int index = location.lastIndexOf('/');
- if (index != -1) {
- final String lastKey = location.substring(index + 1);
- pathElements.add(TextUtils.getText(lastKey, TextUtils.getText("addons." + lastKey, lastKey)));
- // recurse
- if (index > 1)
- pathElements.addAll(getMenuPathElements(menuBuilder, location.substring(0, index)));
- }
- }
- return pathElements;
- }
-
- private static List<String> getMenuPathElements(DefaultMutableTreeNode node) {
- ArrayList<String> pathElements = new ArrayList<String>();
- while (node != null) {
- if (node.getUserObject() instanceof JMenuItem)
- pathElements.add(((JMenuItem) node.getUserObject()).getText());
- node = (DefaultMutableTreeNode) node.getParent();
- }
- return pathElements;
- }
-
- private String bold(final String text) {
- return "<b>" + text + "</b>";
- }
-
- private String row(final String td, final Object... columns) {
- final String separator = "</" + td + "><" + td + ">";
- return "<tr><" + td + ">" + org.apache.commons.lang.StringUtils.join(columns, separator) + "</" + td + "></tr>";
- }
-
- private static String getText(String key, Object... parameters) {
- if (parameters.length == 0)
- return TextUtils.getRawText(getResourceKey(key));
- else
- return TextUtils.format(getResourceKey(key), parameters);
- }
-
- private static String getResourceKey(final String key) {
- return "AddOnDetailsPanel." + key;
- }
-
- public String getWarning() {
- return warning;
- }
-
- public void setWarning(String warning) {
- this.warning = warning;
- }
-
- public int getMaxWidth() {
- return maxWidth;
- }
-
- public void setMaxWidth(int maxWidth) {
- this.maxWidth = maxWidth;
- }
-
- @Override
- public Dimension getPreferredSize() {
- final Dimension preferredSize = super.getPreferredSize();
- preferredSize.width = Math.min(preferredSize.width, maxWidth);
- return preferredSize;
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddOnInstallerPanel.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddOnInstallerPanel.java
deleted file mode 100644
index 9fe0ba6..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/AddOnInstallerPanel.java
+++ /dev/null
@@ -1,273 +0,0 @@
-package org.freeplane.plugin.script.addons;
-
-import java.awt.Component;
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-
-import javax.swing.Box;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JFileChooser;
-import javax.swing.JPanel;
-import javax.swing.JTabbedPane;
-import javax.swing.JTable;
-import javax.swing.JTextField;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.FreeplaneIconUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.mindmapmode.MMapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-import org.freeplane.main.addons.AddOnProperties;
-import org.freeplane.main.addons.AddOnsController;
-import org.freeplane.plugin.script.ScriptingEngine;
-import org.freeplane.plugin.script.ScriptingPermissions;
-
-import com.jgoodies.forms.factories.DefaultComponentFactory;
-import com.jgoodies.forms.factories.FormFactory;
-import com.jgoodies.forms.layout.ColumnSpec;
-import com.jgoodies.forms.layout.FormLayout;
-import com.jgoodies.forms.layout.RowSpec;
-
- at SuppressWarnings("serial")
-public class AddOnInstallerPanel extends JPanel {
-
- private ManageAddOnsPanel manageAddOnsPanel;
- private ManageAddOnsPanel manageThemesPanel;
- private JButton installButton;
- private JTextField urlField;
-
- public AddOnInstallerPanel(final ManageAddOnsPanel manageAddOnsPanel, ManageAddOnsPanel manageThemesPanel) {
- this.manageAddOnsPanel = manageAddOnsPanel;
- this.manageThemesPanel = manageThemesPanel;
- setLayout(new FormLayout(new ColumnSpec[] {
- ColumnSpec.decode("default:grow"),},
- new RowSpec[] {
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,}));
- //
- // Search
- //
- add(DefaultComponentFactory.getInstance().createSeparator(getTitleText("search")), "1, 2");
- add(createVisitAddOnPageButton(), "1, 4, left, default");
- add(Box.createVerticalStrut(20), "1, 6");
- //
- // Install from known location
- //
- add(DefaultComponentFactory.getInstance().createSeparator(getTitleText("install.from.known.location")), "1, 7");
- installButton = createInstallButton();
- urlField = createUrlField(installButton);
- final JButton selectFile = createFileChooser(urlField);
- installButton.addActionListener(createInstallActionListener());
- final Box box = Box.createHorizontalBox();
- box.add(urlField);
- box.add(selectFile);
- add(box, "1, 9");
- add(installButton, "1, 11, right, default");
-// setBackground(Color.WHITE);
- }
-
- private static String getText(String key, Object... parameters) {
- return ManageAddOnsDialog.getText(key, parameters);
- }
-
- private static String getTitleText(final String key) {
- final String titleStyle = "<html><b><font size='+1'>";
- return titleStyle + getText(key);
- }
-
- private JButton createVisitAddOnPageButton() {
- try {
- final String addOnsUriString = TextUtils.removeTranslateComment(TextUtils.getText("addons.site"));
- // parse the URI on creation of the dialog to test the URI syntax early
- final URI addOnsUri = new URI(addOnsUriString);
- return UITools.createHtmlLinkStyleButton(addOnsUri, getText("visit.addon.page"));
- }
- catch (URISyntaxException ex) {
- // bad translation?
- throw new RuntimeException(ex);
- }
- }
-
- private JButton createInstallButton() {
- final JButton installButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(installButton, getText("install"));
- installButton.setEnabled(false);
- // FIXME: get rid of that
- installButton.setMargin(new Insets(0, 25, 0, 25));
- return installButton;
- }
-
- private ActionListener createInstallActionListener() {
- return new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- final Controller controller = Controller.getCurrentController();
- try {
- LogUtils.info("installing add-on from " + urlField.getText());
- controller.getViewController().setWaitingCursor(true);
- final URL url = toURL(urlField.getText());
- setStatusInfo(getText("status.installing"));
- final ModeController modeController = controller.getModeController(MModeController.MODENAME);
- final MFileManager fileManager = (MFileManager) MFileManager.getController(modeController);
- MapModel newMap = new MMapModel();
- if (!fileManager.loadCatchExceptions(url, newMap)) {
- LogUtils.warn("can not load " + url);
- return;
- }
- controller.getModeController().getMapController().fireMapCreated(newMap);
- AddOnProperties addOn = (AddOnProperties) ScriptingEngine.executeScript(newMap.getRootNode(),
- getInstallScriptSource(), ScriptingPermissions.getPermissiveScriptingPermissions());
- if (addOn != null) {
- setStatusInfo(getText("status.success", addOn.getName()));
- AddOnsController.getController().registerInstalledAddOn(addOn);
- final ManageAddOnsPanel managementPanel = addOn.isTheme() ? manageThemesPanel
- : manageAddOnsPanel;
- managementPanel.getTableModel().addAddOn(addOn);
- urlField.setText("");
- ((JTabbedPane)getParent()).setSelectedComponent(managementPanel);
- selectLastAddOn(managementPanel);
- }
- }
- catch (Exception ex) {
- UITools.errorMessage(getText("error", ex.toString()));
- }
- finally {
- controller.getViewController().setWaitingCursor(false);
- }
- }
-
- private String getInstallScriptSource() throws IOException {
- final ResourceController resourceController = ResourceController.getResourceController();
- final File scriptDir = new File(resourceController.getInstallationBaseDir(), "scripts");
- final File installScript = new File(scriptDir, "installScriptAddOn.groovy");
- if (!installScript.exists())
- throw new RuntimeException("internal error: installer not found at " + installScript);
- return FileUtils.slurpFile(installScript);
- }
-
- private URL toURL(String urlText) throws MalformedURLException {
- try {
- return new URL(urlText);
- }
- catch (Exception e2) {
- return new File(urlText).toURI().toURL();
- }
- }
- };
- }
-
- private void selectLastAddOn(JComponent managementPanel) {
- try {
- JTable table = findJTable(managementPanel);
- final int row = table.getModel().getRowCount() - 1;
- table.getSelectionModel().setSelectionInterval(row, row);
- }
- catch (Exception e) {
- LogUtils.warn("cannot select just installed add-on", e);
- }
- }
-
- private JTable findJTable(JComponent child) {
- for (Component component : child.getComponents()) {
- if (component instanceof JTable) {
- return (JTable) component;
- }
- else if (component instanceof JComponent) {
- final JTable findResult = findJTable((JComponent) component);
- if (findResult != null)
- return findResult;
- }
- }
- return null;
- }
-
- private JButton createFileChooser(final JTextField urlField) {
- final JButton selectFile = new JButton(getText("search.file"),
- FreeplaneIconUtils.createImageIconByResourceKey("OpenAction.icon"));
- final JFileChooser fileChooser = new JFileChooser();
- selectFile.setToolTipText(getText("select.tooltip"));
- selectFile.setMaximumSize(UITools.MAX_BUTTON_DIMENSION);
- selectFile.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- fileChooser.showOpenDialog(urlField);
- final File selectedFile = fileChooser.getSelectedFile();
- if (selectedFile != null)
- urlField.setText(selectedFile.getAbsolutePath());
- }
- });
- return selectFile;
- }
-
- private JTextField createUrlField(final JButton install) {
- final JTextField urlField = new JTextField();
-// urlField.setColumns(100);
- urlField.setToolTipText(getText("install.tooltip"));
- urlField.getDocument().addDocumentListener(new DocumentListener() {
- public void insertUpdate(DocumentEvent e) {
- updateImpl(e);
- }
-
- public void removeUpdate(DocumentEvent e) {
- updateImpl(e);
- }
-
- public void changedUpdate(DocumentEvent e) {
- updateImpl(e);
- }
-
- private void updateImpl(DocumentEvent e) {
- install.setEnabled(e.getDocument().getLength() > 0);
- }
- });
- urlField.addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent e) {
- int key = e.getKeyCode();
- if (key == KeyEvent.VK_ENTER) {
- install.requestFocusInWindow();
- install.doClick();
- }
- }
- });
- return urlField;
- }
-
- JButton getInstallButton() {
- return installButton;
- }
-
- JTextField getUrlField() {
- return urlField;
- }
-
- private static void setStatusInfo(final String message) {
- Controller.getCurrentController().getViewController().out(message);
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ButtonsInCellRenderer.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ButtonsInCellRenderer.java
deleted file mode 100644
index 424b207..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ButtonsInCellRenderer.java
+++ /dev/null
@@ -1,160 +0,0 @@
-package org.freeplane.plugin.script.addons;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-
-import javax.swing.AbstractCellEditor;
-import javax.swing.Action;
-import javax.swing.Box;
-import javax.swing.BoxLayout;
-import javax.swing.JButton;
-import javax.swing.JPanel;
-import javax.swing.JTable;
-import javax.swing.UIManager;
-import javax.swing.border.Border;
-import javax.swing.border.LineBorder;
-import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.table.TableColumnModel;
-
-import org.freeplane.main.addons.AddOnProperties;
-
-/**
- * Editor and Renderer for multiple buttons inside a table cell.
- * @author Mag. Stefan Hagmann
- * @see http://www.bgbaden-frauen.ac.at/frauengasse20/uploads/files/Informatik/java/ButtonsInColumn.java
- */
- at SuppressWarnings("serial")
-class ButtonsInCellRenderer extends AbstractCellEditor implements TableCellRenderer, TableCellEditor, ActionListener,
- MouseListener {
- static final int BUTTON_SPACER = 4;
- private final JTable table;
- private final Border border;
- private Border fborder;
- private Object editorValue;
- private boolean isButtonColumnEditor;
- private JPanel panel;
- private final Action[] actions;
- private final JButton[] buttons;
-
- public ButtonsInCellRenderer(JTable table, JButton[] buttons, Action[] actions, int column) {
- this.table = table;
- this.actions = actions;
- this.buttons = buttons;
- for (JButton btn : buttons) {
- btn.setFocusPainted(false);
- btn.addActionListener(this);
- }
- border = buttons[0].getBorder();
- setFocusBorder(new LineBorder(Color.BLUE));
- TableColumnModel columnModel = table.getColumnModel();
- columnModel.getColumn(column).setCellRenderer(this);
- columnModel.getColumn(column).setCellEditor(this);
- table.addMouseListener(this);
- panel = new JPanel();
- panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
- panel.add(Box.createHorizontalGlue());
- if (buttons.length > 0)
- panel.add(buttons[0]);
- for (int i = 1; i < buttons.length; i++) {
- panel.add(Box.createHorizontalStrut(BUTTON_SPACER));
- panel.add(buttons[i]);
- }
- panel.add(Box.createHorizontalStrut(BUTTON_SPACER));
- }
-
- private void setFocusBorder(Border focusBorder) {
- this.fborder = focusBorder;
- for (JButton btn : buttons) {
- btn.setBorder(focusBorder);
- }
- }
-
- public Object getCellEditorValue() {
- return editorValue;
- }
-
- public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
- int row, int column) {
-//FIXME: Java 6
-// final AddOnProperties addOn = model.getAddOnAt(table.convertRowIndexToModel(row));
- setButtonsVisible(table, row);
- for (JButton btn : buttons) {
- if (isSelected) {
- btn.setForeground(table.getSelectionForeground());
- btn.setBackground(table.getSelectionBackground());
- panel.setBackground(table.getSelectionBackground());
- }
- else {
- btn.setForeground(table.getForeground());
- btn.setBackground(UIManager.getColor("Button.background"));
- panel.setBackground(table.getBackground());
- }
- if (hasFocus) {
- btn.setBorder(fborder);
- }
- else {
- btn.setBorder(border);
- }
- }
- return panel;
- }
-
- protected void setButtonsVisible(JTable table, int row) {
- final ManageAddOnsPanel.AddOnTableModel model = (ManageAddOnsPanel.AddOnTableModel) table.getModel();
- final AddOnProperties addOn = model.getAddOnAt(row);
- for (JButton btn : buttons) {
- final boolean supportsOperation = addOn.supportsOperation(btn.getName());
- btn.setVisible(supportsOperation);
- }
- }
-
- public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
- this.editorValue = value;
- setButtonsVisible(table, row);
- return panel;
- }
-
- public void actionPerformed(ActionEvent e) {
-//FIXME: Java 6
-// int row = table.convertRowIndexToModel(table.getEditingRow());
- int row = table.getEditingRow();
- fireEditingStopped();
- for (int i = 0; i < buttons.length; i++) {
- if (e.getSource().equals(buttons[i])) {
- final ActionEvent event = new ActionEvent(table, ActionEvent.ACTION_PERFORMED, "" + row);
- actions[i].actionPerformed(event);
- break;
- }
- }
- }
-
- /*
- * When the mouse is pressed the editor is invoked. If you then then drag
- * the mouse to another cell before releasing it, the editor is still
- * active. Make sure editing is stopped when the mouse is released.
- */
- public void mousePressed(MouseEvent e) {
- if (table.isEditing() && table.getCellEditor() == this)
- isButtonColumnEditor = true;
- }
-
- public void mouseReleased(MouseEvent e) {
- if (isButtonColumnEditor && table.isEditing())
- table.getCellEditor().stopCellEditing();
- isButtonColumnEditor = false;
- }
-
- public void mouseClicked(MouseEvent e) {
- }
-
- public void mouseEntered(MouseEvent e) {
- }
-
- public void mouseExited(MouseEvent e) {
- }
-}
\ No newline at end of file
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsDialog.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsDialog.java
deleted file mode 100644
index 972708d..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/addons/ManageAddOnsDialog.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.freeplane.plugin.script.addons;
-
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Toolkit;
-import java.awt.Window;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.HierarchyEvent;
-import java.awt.event.HierarchyListener;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-import javax.swing.JPanel;
-import javax.swing.JTabbedPane;
-import javax.swing.WindowConstants;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.main.addons.AddOnProperties;
-
-public class ManageAddOnsDialog extends JDialog {
- private static final long serialVersionUID = 1L;
- private AddOnInstallerPanel addOnInstallerPanel;
- private JTabbedPane tabbedPane;
-
- public ManageAddOnsDialog(final List<AddOnProperties> addOns) {
- super(UITools.getFrame(), TextUtils.getText("ManageAddOnsAction.text"), true);
- // stolen from FileRevisionsDialog - no idea if actually needed
- if (getOwner() != null) {
- final Window[] ownedWindows = getOwner().getOwnedWindows();
- for (Window w : ownedWindows) {
- if (w.isVisible()) {
- w.toBack();
- }
- }
- }
- tabbedPane = new JTabbedPane();
- tabbedPane.setPreferredSize(getPreferredSizeForWindow());
- final ManageAddOnsPanel manageAddOnsPanel = new ManageAddOnsPanel(filterNonThemes(addOns));
- final ManageAddOnsPanel manageThemesPanel = new ManageAddOnsPanel(filterThemes(addOns));
- addOnInstallerPanel = new AddOnInstallerPanel(manageAddOnsPanel, manageThemesPanel);
- tabbedPane.addTab(getText("tab.install"), createIcon("/images/install_addons.png"), addOnInstallerPanel,
- getText("tab.install.tooltip"));
- tabbedPane.addTab(getText("tab.manage"), createIcon("/images/manage_addons.png"), manageAddOnsPanel,
- getText("tab.manage.tooltip"));
- tabbedPane.addTab(getText("tab.manage.themes"), createIcon("/images/manage_themes.png"), manageThemesPanel,
- getText("tab.manage.themes.tooltip"));
- getContentPane().add(tabbedPane, BorderLayout.CENTER);
- {
- JPanel buttonPane = new JPanel();
- buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT));
- getContentPane().add(buttonPane, BorderLayout.SOUTH);
- {
- JButton closeButton = new JButton();
- MenuBuilder.setLabelAndMnemonic(closeButton, TextUtils.getRawText("close_btn"));
- closeButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- setVisible(false);
- }
- });
- buttonPane.add(closeButton);
- }
- }
- pack();
- setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
- UITools.addEscapeActionToDialog(this);
- }
-
- private List<AddOnProperties> filterThemes(final List<AddOnProperties> addOns) {
- final ArrayList<AddOnProperties> result = new ArrayList<AddOnProperties>(addOns.size());
- for (AddOnProperties addOn : addOns) {
- if (addOn.isTheme())
- result.add(addOn);
- }
- return result;
- }
-
- private List<AddOnProperties> filterNonThemes(final List<AddOnProperties> addOns) {
- final ArrayList<AddOnProperties> result = new ArrayList<AddOnProperties>(addOns.size());
- for (AddOnProperties addOn : addOns) {
- if (!addOn.isTheme())
- result.add(addOn);
- }
- return result;
- }
-
- private ImageIcon createIcon(String resource) {
- return new ImageIcon(ResourceController.getResourceController().getResource(resource));
- }
-
- private Dimension getPreferredSizeForWindow() {
- final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
- return new Dimension((int) screenSize.getWidth() * 4 / 5, (int) screenSize.getHeight() * 2 / 3);
- }
-
- private static String getResourceKey(final String key) {
- return "ManageAddOnsDialog." + key;
- }
-
- static String getText(String key, Object... parameters) {
- if (parameters.length == 0)
- return TextUtils.getText(getResourceKey(key));
- else
- return TextUtils.format(getResourceKey(key), parameters);
- }
-
- public void install(final URL url) {
- if (addOnInstallerPanel.isShowing()) {
- addOnInstallerPanel.getUrlField().setText(url.toString());
- tabbedPane.paintImmediately(0, 0, tabbedPane.getWidth(), tabbedPane.getHeight());
- addOnInstallerPanel.getInstallButton().doClick();
- }
- else {
- addOnInstallerPanel.addHierarchyListener(new HierarchyListener() {
- public void hierarchyChanged(HierarchyEvent e) {
- if (addOnInstallerPanel.isShowing()) {
- addOnInstallerPanel.removeHierarchyListener(this);
- install(url);
- }
- }
- });
- tabbedPane.setSelectedComponent(addOnInstallerPanel);
- if (!isVisible())
- setVisible(true);
- }
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/defaults.properties b/freeplane_plugin_script/src/org/freeplane/plugin/script/defaults.properties
deleted file mode 100644
index 7f4659a..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/defaults.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-execute_scripts_without_asking =
-execute_scripts_without_file_restriction = false
-execute_scripts_without_write_restriction = false
-execute_scripts_without_network_restriction = false
-execute_scripts_without_exec_restriction = false
-signed_script_are_trusted = true
-script_user_key_name_for_signing =
-script_directories =
-script_classpath =
\ No newline at end of file
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/filter/ScriptConditionController.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/filter/ScriptConditionController.java
deleted file mode 100644
index 6323d8b..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/filter/ScriptConditionController.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Freeplane - mind map editor
- * Copyright (C) 2008 Dimitry Polivaev
- *
- * This file author is Dimitry Polivaev
- *
- * 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.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-package org.freeplane.plugin.script.filter;
-
-import java.awt.Component;
-import java.awt.Dimension;
-
-import javax.swing.ComboBoxEditor;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.DefaultListModel;
-import javax.swing.ListCellRenderer;
-import javax.swing.ListModel;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.filter.condition.ASelectableCondition;
-import org.freeplane.features.filter.condition.IElementaryConditionController;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.script.ScriptComboBoxEditor;
-import org.freeplane.plugin.script.ScriptRenderer;
-
-
-/**
- * @author Dimitry Polivaev
- * 21.12.2008
- */
-public class ScriptConditionController implements IElementaryConditionController {
- static final String FILTER_SCRIPT = "filter_script";
- private final ComboBoxEditor editor = new ScriptComboBoxEditor();
- private final ListCellRenderer renderer = new ScriptRenderer();
- private final ComboBoxModel values = new DefaultComboBoxModel();
-
- public ScriptConditionController() {
- super();
- Component showEditorBtn = editor.getEditorComponent();
- final Dimension preferredSize = showEditorBtn.getPreferredSize();
- preferredSize.width = 100;
- showEditorBtn.setPreferredSize(preferredSize);
-
- }
-
- public boolean canEditValues(final Object property, final NamedObject simpleCond) {
- return true;
- }
-
- public boolean canHandle(final Object selectedItem) {
- if (!(selectedItem instanceof NamedObject)) {
- return false;
- }
- final NamedObject namedObject = (NamedObject) selectedItem;
- return namedObject.objectEquals(ScriptConditionController.FILTER_SCRIPT);
- }
-
- public boolean canSelectValues(final Object property, final NamedObject simpleCond) {
- return true;
- }
-
- public ASelectableCondition createCondition(final Object selectedItem, final NamedObject simpleCond,
- final Object value, final boolean matchCase,
- final boolean matchApproximately) {
- if(value == null)
- return null;
- final String string = (String) value;
- if("".equals(string))
- return null;
- return new ScriptCondition(string);
- }
-
- public ComboBoxModel getConditionsForProperty(final Object property) {
- return new DefaultComboBoxModel(getScriptConditionNames());
- }
-
- public ListModel getFilteredProperties() {
- final DefaultListModel list = new DefaultListModel();
- list.addElement(TextUtils.createTranslatedString(FILTER_SCRIPT));
- return list;
- }
-
- public Object[] getScriptConditionNames() {
- return new NamedObject[] { new NamedObject(ScriptCondition.NAME, " ")};
- }
-
- public ComboBoxEditor getValueEditor(Object selectedProperty, NamedObject selectedCondition) {
- return editor;
- }
-
- public ComboBoxModel getValuesForProperty(final Object selectedItem, NamedObject simpleCond) {
- values.setSelectedItem("");
- return values;
- }
-
- public boolean isCaseDependent(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public boolean supportsApproximateMatching(final Object property, final NamedObject simpleCond) {
- return false;
- }
-
- public ASelectableCondition loadCondition(final XMLElement element) {
- try {
- if (element.getName().equalsIgnoreCase(ScriptCondition.NAME)) {
- return ScriptCondition.load(element);
- }
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- return null;
- }
-
- public ListCellRenderer getValueRenderer(Object selectedProperty, NamedObject selectedCondition) {
- return renderer;
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/preferences.mm b/freeplane_plugin_script/src/org/freeplane/plugin/script/preferences.mm
deleted file mode 100644
index 2b189ca..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/preferences.mm
+++ /dev/null
@@ -1,155 +0,0 @@
-<map version="freeplane 1.3.0">
-<!--To view this file, download free mind mapping software Freeplane from http://freeplane.sourceforge.net -->
-<attribute_registry SHOW_ATTRIBUTES="hide"/>
-<node TEXT="Script Preferences" FOLDED="false" ID="ID_776863743"><hook NAME="MapStyle">
- <conditional_styles>
- <conditional_style ACTIVE="true" STYLE_REF="boolean" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="boolean" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="combo" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="combo" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="choice" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="choice" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="font" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="font" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="number" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="number" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="path" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="path" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="remind_value" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="remind_value" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="separator" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="separator" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="group" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="group" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="color" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="color" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="string" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="string" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="tab" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="tab" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- <conditional_style ACTIVE="true" STYLE_REF="text" LAST="false">
- <attribute_contains_condition ATTRIBUTE="type" VALUE="text" MATCH_CASE="true" MATCH_APPROXIMATELY="false"/>
- </conditional_style>
- </conditional_styles>
- <properties show_icon_for_attributes="false"/>
-
-<map_styles>
-<stylenode LOCALIZED_TEXT="styles.root_node">
-<stylenode LOCALIZED_TEXT="styles.user-defined" POSITION="right">
-<stylenode TEXT="boolean">
-<icon BUILTIN="checked"/>
-</stylenode>
-<stylenode TEXT="combo">
-<icon BUILTIN="list"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-<stylenode TEXT="choice"/>
-<stylenode TEXT="font"/>
-<stylenode TEXT="number"/>
-<stylenode TEXT="path"/>
-<stylenode TEXT="remind_value"/>
-<stylenode TEXT="separator">
-<font BOLD="true"/>
-</stylenode>
-<stylenode TEXT="group">
-<icon BUILTIN="folder"/>
-</stylenode>
-<stylenode TEXT="color">
-<icon BUILTIN="licq"/>
-</stylenode>
-<stylenode TEXT="string">
-<icon BUILTIN="edit"/>
-</stylenode>
-<stylenode TEXT="tab">
-<cloud COLOR="#ccffcc" SHAPE="ARC"/>
-</stylenode>
-<stylenode TEXT="text">
-<icon BUILTIN="info"/>
-</stylenode>
-</stylenode>
-<stylenode LOCALIZED_TEXT="styles.predefined" POSITION="right">
-<stylenode LOCALIZED_TEXT="default"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.details"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.note"/>
-<stylenode LOCALIZED_TEXT="defaultstyle.floating">
-<edge STYLE="hide_edge"/>
-<cloud COLOR="#f0f0f0" SHAPE="ROUND_RECT"/>
-</stylenode>
-</stylenode>
-</stylenode>
-</map_styles>
-</hook>
-<node TEXT="Plugins" POSITION="right" ID="ID_1156983468">
-<attribute NAME="type" VALUE="tab"/>
-<attribute NAME="name" VALUE="plugins"/>
-<node TEXT="Scripting" ID="ID_301669529">
-<attribute NAME="type" VALUE="separator"/>
-<attribute NAME="name" VALUE="scripting"/>
-<node TEXT="Script Execution enabled" ID="ID_1919787107">
-<attribute NAME="type" VALUE="remind_value"/>
-<attribute NAME="name" VALUE="execute_scripts_without_asking"/>
-</node>
-<node TEXT="Permit file/read operations" ID="ID_670476941">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="execute_scripts_without_file_restriction"/>
-</node>
-<node TEXT="Permit file/write operations" ID="ID_357965285">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="execute_scripts_without_write_restriction"/>
-</node>
-<node TEXT="Permit network operations" ID="ID_195127580">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="execute_scripts_without_network_restriction"/>
-</node>
-<node TEXT="Permit to execute other applications" ID="ID_1113896850">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="execute_scripts_without_exec_restriction"/>
-</node>
-<node TEXT="Trust signed scripts" ID="ID_1220206880">
-<attribute NAME="type" VALUE="boolean"/>
-<attribute NAME="name" VALUE="signed_script_are_trusted"/>
-</node>
-<node TEXT="Optional user key alias for signing" ID="ID_613870876">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="script_user_key_name_for_signing"/>
-</node>
-<node TEXT="File extensions not to be compiled" ID="ID_181914556">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="script_compilation_disabled_extensions"/>
-</node>
-<node TEXT="Script search path" ID="ID_425351509">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="script_directories"/>
-</node>
-<node TEXT="Script Classpath" ID="ID_1675835784">
-<attribute NAME="type" VALUE="string"/>
-<attribute NAME="name" VALUE="script_classpath"/>
-</node>
-<node TEXT="Groovy Editor Font" ID="ID_890021469">
-<icon BUILTIN="edit"/>
-<attribute NAME="type" VALUE="font"/>
-<attribute NAME="name" VALUE="groovy_editor_font"/>
-</node>
-<node TEXT="Groovy Editor Font Size" ID="ID_1178357305">
-<icon BUILTIN="edit"/>
-<attribute NAME="type" VALUE="number"/>
-<attribute NAME="name" VALUE="groovy_editor_font_size"/>
-<attribute NAME="min" VALUE="4" OBJECT="org.freeplane.features.format.FormattedNumber|4"/>
-<attribute NAME="max" VALUE="216" OBJECT="org.freeplane.features.format.FormattedNumber|216"/>
-</node>
-</node>
-</node>
-</node>
-</map>
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/AttributesProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/AttributesProxy.java
deleted file mode 100644
index 1d9fc22..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/AttributesProxy.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/**
- *
- */
-package org.freeplane.plugin.script.proxy;
-
-import groovy.lang.Closure;
-import groovy.lang.MissingMethodException;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-import org.freeplane.features.attribute.Attribute;
-import org.freeplane.features.attribute.AttributeController;
-import org.freeplane.features.attribute.NodeAttributeTableModel;
-import org.freeplane.features.attribute.mindmapmode.MAttributeController;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.plugin.script.ScriptContext;
-
-class AttributesProxy extends AbstractProxy<NodeModel> implements Proxy.Attributes {
- AttributesProxy(final NodeModel delegate, final ScriptContext scriptContext) {
- super(delegate, scriptContext);
- }
-
- @Deprecated
- public Object get(final String name) {
- return getFirst(name);
- }
-
- public Object getFirst(final String name) {
- final int index = findAttribute(name);
- if (index == -1) {
- return null;
- }
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- return attributeTableModel.getAttribute(index).getValue();
- }
-
- public List<Object> getAll(final String name) {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- if (attributeTableModel == null) {
- return Collections.emptyList();
- }
- final ArrayList<Object> result = new ArrayList<Object>();
- for (final Attribute attribute : attributeTableModel.getAttributes()) {
- if (attribute.getName().equals(name)) {
- result.add(attribute.getValue());
- }
- }
- return result;
- }
-
- public List<String> getNames() {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- if (attributeTableModel == null) {
- return Collections.emptyList();
- }
- final ArrayList<String> result = new ArrayList<String>(attributeTableModel.getRowCount());
- for (final Attribute a : attributeTableModel.getAttributes()) {
- result.add(a.getName());
- }
- return result;
- }
-
- @Deprecated
- public List<String> getAttributeNames() {
- return getNames();
- }
-
- public List<? extends Convertible> getValues() {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- if (attributeTableModel == null) {
- return Collections.emptyList();
- }
- final ArrayList<Convertible> result = new ArrayList<Convertible>(attributeTableModel.getRowCount());
- for (final Attribute a : attributeTableModel.getAttributes()) {
- result.add(ProxyUtils.attributeValueToConvertible(getDelegate(), getScriptContext(), a.getValue()));
- }
- return result;
- }
-
- public Map<String, Object> getMap() {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- if (attributeTableModel == null) {
- return Collections.emptyMap();
- }
- final LinkedHashMap<String, Object> result = new LinkedHashMap<String, Object>(attributeTableModel.getRowCount());
- for (final Attribute a : attributeTableModel.getAttributes()) {
- result.put(a.getName(), a.getValue());
- }
- return result;
- }
-
- public List<? extends Convertible> findValues(Closure<Boolean> closure) {
- try {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- if (attributeTableModel == null) {
- return Collections.emptyList();
- }
- final ArrayList<Convertible> result = new ArrayList<Convertible>(
- attributeTableModel.getRowCount());
- for (final Attribute a : attributeTableModel.getAttributes()) {
- final Object bool = closure.call(new Object[] { a.getName(), a.getValue() });
- if (result == null) {
- throw new RuntimeException("findValues(): closure returned null instead of boolean/Boolean");
- }
- if ((Boolean) bool)
- result.add(ProxyUtils.attributeValueToConvertible(getDelegate(), getScriptContext(), a.getValue()));
- }
- return result;
- }
- catch (final MissingMethodException e) {
- throw new RuntimeException("findValues(): closure needs to accept two args and must return boolean/Boolean"
- + " e.g. findValues{k,v -> k != 'TOTAL'}", e);
- }
- catch (final ClassCastException e) {
- throw new RuntimeException("findValues(): closure returned " + e.getMessage()
- + " instead of boolean/Boolean");
- }
- }
-
- public Object get(final int index) {
- return getAndCheckNodeAttributeTableModelForIndex(index, "get:").getValue(index);
- }
-
- private NodeAttributeTableModel getAndCheckNodeAttributeTableModelForIndex(final int index, String errorPrefix) {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- if (attributeTableModel == null) {
- throw new IndexOutOfBoundsException(errorPrefix + index);
- }
- return attributeTableModel;
- }
-
- public String getKey(int index) {
- return getAndCheckNodeAttributeTableModelForIndex(index, "getKey:").getAttribute(index).getName();
- }
-
- public void set(final int index, final Object value) {
- final NodeAttributeTableModel attributeTableModel = getAndCheckNodeAttributeTableModelForIndex(index, "set1:");
- String oldPattern = getOldValueFormatPattern(attributeTableModel, index);
- getAttributeController().performSetValueAt(attributeTableModel, ProxyUtils.transformObject(value, oldPattern), index, 1);
- }
-
- public void set(final int index, final String name, final Object value) {
- final NodeAttributeTableModel attributeTableModel = getAndCheckNodeAttributeTableModelForIndex(index, "set2:");
- String oldPattern = getOldValueFormatPattern(attributeTableModel, index);
- getAttributeController().setAttribute(getDelegate(), index, new Attribute(name, ProxyUtils.transformObject(value, oldPattern)));
- }
-
- public int findFirst(final String name) {
- final List<String> attributeNames = getAttributeNames();
- for (int i = 0; i < attributeNames.size(); i++) {
- if (attributeNames.get(i).equals(name)) {
- return i;
- }
- }
- return -1;
- }
-
- @Deprecated
- public int findAttribute(final String name) {
- return findFirst(name);
- }
-
- @Deprecated
- public boolean remove(final String name) {
- final int index = findFirst(name);
- if (index == -1) {
- return false;
- }
- getAttributeController().removeAttribute(getDelegate(), index);
- return true;
- }
-
- public boolean removeAll(final String name) {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- if (attributeTableModel == null) {
- return false;
- }
- final ArrayList<Integer> toRemove = new ArrayList<Integer>();
- final Vector<Attribute> attributes = attributeTableModel.getAttributes();
- for (int i = 0; i < attributes.size(); ++i) {
- if (attributes.get(i).getName().equals(name)) {
- toRemove.add(i);
- }
- }
- // do it backwards in order not to invalidate the first indexes
- for (int i = toRemove.size() - 1; i >= 0; --i) {
- getAttributeController().removeAttribute(getDelegate(), toRemove.get(i));
- }
- return !toRemove.isEmpty();
- }
-
- public void remove(final int index) {
- getAndCheckNodeAttributeTableModelForIndex(index, "remove:");
- getAttributeController().removeAttribute(getDelegate(), index);
- }
-
- public void clear() {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- final int size = attributeTableModel.getRowCount();
- for (int i = size - 1; i >= 0; i--) {
- getAttributeController().removeAttribute(getDelegate(), i);
- }
- }
-
- public void set(final String name, final Object value) {
- final int index = findFirst(name);
- if (index == -1) {
- final Attribute attribute = new Attribute(name, ProxyUtils.transformObject(value, null));
- getAttributeController().addAttribute(getDelegate(), attribute);
- }
- else {
- final String oldPattern = getOldValueFormatPattern(getNodeAttributeTableModel(), index);
- final Attribute attribute = new Attribute(name, ProxyUtils.transformObject(value, oldPattern));
- getAttributeController().setAttribute(getDelegate(), index, attribute);
- }
- }
-
- private String getOldValueFormatPattern(NodeAttributeTableModel attributeTableModel, int index) {
- final Object value = attributeTableModel.getAttribute(index).getValue();
- return (value instanceof IFormattedObject) ? ((IFormattedObject) value).getPattern() : null;
- }
-
- public void add(final String name, final Object value) {
- final Attribute attribute = new Attribute(name, ProxyUtils.transformObject(value, null));
- getAttributeController().addAttribute(getDelegate(), attribute);
- }
-
- public int size() {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- if (attributeTableModel == null) {
- return 0;
- }
- return attributeTableModel.getRowCount();
- }
-
- public boolean isEmpty() {
- return size() == 0;
- }
-
- private MAttributeController getAttributeController() {
- return (MAttributeController) AttributeController.getController();
- }
-
- private NodeAttributeTableModel getNodeAttributeTableModel() {
- return NodeAttributeTableModel.getModel(getDelegate());
- }
-
- /** make <code>if (node.attributes) println "has attributes"</code> work. */
- public boolean asBoolean() {
- return !isEmpty();
- }
-
- @SuppressWarnings("unchecked")
- public Iterator<Map.Entry<String, Object>> iterator() {
- final NodeAttributeTableModel attributeTableModel = getNodeAttributeTableModel();
- if (attributeTableModel == null) {
- return (Iterator<Map.Entry<String, Object>>) (Object) Collections.emptyMap().entrySet().iterator();
- }
- return new Iterator<Map.Entry<String, Object>>() {
- final private Iterator<Attribute> iterator = attributeTableModel.getAttributes().iterator();
-
- @Override
- public boolean hasNext() {
- return iterator.hasNext();
- }
-
- @Override
- public Map.Entry<String, Object> next() {
- final Attribute attribute = iterator.next();
- return new Map.Entry<String, Object>() {
-
- @Override
- public String getKey() {
- return attribute.getName();
- }
-
- @Override
- public Object getValue() {
- return attribute.getValue();
- }
-
- @Override
- public Object setValue(Object value) {
- final Object oldValue = attribute.getValue();
- attribute.setValue(value);
- return oldValue;
- }
- ;
- };
- }
-
- @Override
- public void remove() {
- iterator.remove();
- }
- };
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorInListProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorInListProxy.java
deleted file mode 100644
index ff7a7e2..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorInListProxy.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- *
- */
-package org.freeplane.plugin.script.proxy;
-
-import java.util.AbstractCollection;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.freeplane.features.link.LinkModel;
-import org.freeplane.features.link.MapLinks;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.plugin.script.ScriptContext;
-
-class ConnectorInListProxy extends AbstractCollection<Proxy.Connector> {
- private final NodeModel node;
- private final ScriptContext scriptContext;
-
- public ConnectorInListProxy(final NodeProxy nodeProxy) {
- this.node = nodeProxy.getDelegate();
- this.scriptContext = nodeProxy.getScriptContext();
- }
-
- List<LinkModel> getConnectorSet() {
- final MapLinks allLinks = MapLinks.getLinks(node.getMap());
- final Set<LinkModel> links = allLinks == null ? null : allLinks.get(node.getID());
- return links == null ? Collections.<LinkModel> emptyList() : Collections
- .unmodifiableList(new ArrayList<LinkModel>(links));
- }
-
- @Override
- public Iterator<Proxy.Connector> iterator() {
- return new ConnectorIterator(getConnectorSet().iterator(), scriptContext);
- }
-
- @Override
- public int size() {
- return getConnectorSet().size();
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorIterator.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorIterator.java
deleted file mode 100644
index 5c378b7..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorIterator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- *
- */
-package org.freeplane.plugin.script.proxy;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-import org.freeplane.features.link.ConnectorModel;
-import org.freeplane.features.link.LinkModel;
-import org.freeplane.plugin.script.ScriptContext;
-
-class ConnectorIterator implements Iterator<Proxy.Connector> {
- private final ScriptContext scriptContext;
- private final Iterator<LinkModel> iterator;
- private ConnectorModel next;
-
- public ConnectorIterator(final Iterator<LinkModel> iterator, final ScriptContext scriptContext) {
- this.scriptContext = scriptContext;
- this.iterator = iterator;
- next = getNextConnectorModel();
- }
-
- private ConnectorModel getNextConnectorModel() {
- while (iterator.hasNext()) {
- final LinkModel linkModel = iterator.next();
- if (linkModel instanceof ConnectorModel) {
- return (ConnectorModel) linkModel;
- }
- }
- return null;
- }
-
- public boolean hasNext() {
- return next != null;
- }
-
- public Proxy.Connector next() {
- if (!hasNext()) {
- throw new NoSuchElementException();
- }
- final ConnectorModel current = next;
- next = getNextConnectorModel();
- return new ConnectorProxy(current, scriptContext);
- }
-
- public void remove() {
- throw new UnsupportedOperationException();
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorOutListProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorOutListProxy.java
deleted file mode 100644
index ef0d6f6..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ConnectorOutListProxy.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- *
- */
-package org.freeplane.plugin.script.proxy;
-
-import java.util.AbstractCollection;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.freeplane.features.link.LinkModel;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.plugin.script.ScriptContext;
-
-class ConnectorOutListProxy extends AbstractCollection<Proxy.Connector> {
- private final NodeModel node;
- private final ScriptContext scriptContext;
-
- public ConnectorOutListProxy(final NodeProxy nodeProxy) {
- this.node = nodeProxy.getDelegate();
- this.scriptContext = nodeProxy.getScriptContext();
- }
-
- @Override
- public Iterator<Proxy.Connector> iterator() {
- return new ConnectorIterator(Collections.unmodifiableList(new ArrayList<LinkModel>(NodeLinks.getLinks(node)))
- .iterator(), scriptContext);
- }
-
- @Override
- public int size() {
- return NodeLinks.getLinks(node).size();
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ControllerProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ControllerProxy.java
deleted file mode 100644
index 3ca8d7d..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ControllerProxy.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/**
- *
- */
-package org.freeplane.plugin.script.proxy;
-
-import groovy.lang.Closure;
-
-import java.io.File;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.swing.Icon;
-import javax.swing.filechooser.FileFilter;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.IEditHandler.FirstAction;
-import org.freeplane.core.undo.IUndoHandler;
-import org.freeplane.core.util.FreeplaneIconUtils;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.export.mindmapmode.ExportController;
-import org.freeplane.features.export.mindmapmode.IExportEngine;
-import org.freeplane.features.filter.condition.ICondition;
-import org.freeplane.features.map.IMapSelection;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapModel;
-import org.freeplane.features.mapio.MapIO;
-import org.freeplane.features.mapio.mindmapmode.MMapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.plugin.script.ScriptContext;
-import org.freeplane.plugin.script.proxy.Proxy.Map;
-import org.freeplane.plugin.script.proxy.Proxy.Node;
-
-class ControllerProxy implements Proxy.Controller {
- private final ScriptContext scriptContext;
-
- public ControllerProxy(final ScriptContext scriptContext) {
- this.scriptContext = scriptContext;
- }
-
- public void centerOnNode(final Node center) {
- final NodeModel nodeModel = ((NodeProxy) center).getDelegate();
- Controller.getCurrentController().getSelection().centerNode(nodeModel);
- }
-
- public void edit(Node node) {
- editImpl(node, true);
- }
-
- public void editInPopup(Node node) {
- editImpl(node, false);
- }
-
- private void editImpl(Node node, boolean editInline) {
- final NodeModel nodeModel = ((NodeProxy) node).getDelegate();
- Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(nodeModel);
- ((MTextController) TextController.getController()).edit(FirstAction.EDIT_CURRENT, !editInline);
- }
-
- public Node getSelected() {
- if (scriptContext != null)
- scriptContext.accessAll();
- return new NodeProxy(Controller.getCurrentController().getSelection().getSelected(), scriptContext);
- }
-
- public List<Node> getSelecteds() {
- if (scriptContext != null)
- scriptContext.accessAll();
- return ProxyUtils.createNodeList(Controller.getCurrentController().getSelection().getOrderedSelection(), scriptContext);
- }
-
- public List<Node> getSortedSelection(final boolean differentSubtrees) {
- if (scriptContext != null)
- scriptContext.accessAll();
- return ProxyUtils.createNodeList(Controller.getCurrentController().getSelection()
- .getSortedSelection(differentSubtrees), scriptContext);
- }
-
- public void select(final Node toSelect) {
- if (toSelect != null) {
- final NodeModel nodeModel = ((NodeProxy) toSelect).getDelegate();
- Controller.getCurrentModeController().getMapController().displayNode(nodeModel);
- Controller.getCurrentController().getSelection().selectAsTheOnlyOneSelected(nodeModel);
- }
- }
-
- public void selectBranch(final Node branchRoot) {
- if (branchRoot != null) {
- final NodeModel nodeModel = ((NodeProxy) branchRoot).getDelegate();
- Controller.getCurrentModeController().getMapController().displayNode(nodeModel);
- Controller.getCurrentController().getSelection().selectBranch(nodeModel, false);
- }
- }
-
- public void selectMultipleNodes(final List<Node> toSelect) {
- final IMapSelection selection = Controller.getCurrentController().getSelection();
- final Iterator<Node> it = toSelect.iterator();
- if (!it.hasNext()) {
- return;
- }
- selection.selectAsTheOnlyOneSelected(((NodeProxy) it.next()).getDelegate());
- while (it.hasNext()) {
- final NodeModel nodeModel = ((NodeProxy) it.next()).getDelegate();
- Controller.getCurrentController().getSelection().toggleSelected(nodeModel);
- }
- }
-
- public void deactivateUndo() {
- final MapModel map = Controller.getCurrentController().getMap();
- if (map instanceof MapModel) {
- MModeController modeController = ((MModeController) Controller.getCurrentModeController());
- modeController.deactivateUndo((MMapModel) map);
- }
- }
-
- public void undo() {
- final MapModel map = Controller.getCurrentController().getMap();
- final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
- undoHandler.undo();
- }
-
- public void redo() {
- final MapModel map = Controller.getCurrentController().getMap();
- final IUndoHandler undoHandler = (IUndoHandler) map.getExtension(IUndoHandler.class);
- undoHandler.redo();
- }
-
- public void setStatusInfo(final String info) {
- final ViewController viewController = getViewController();
- viewController.out(info);
- }
-
- private ViewController getViewController() {
- return Controller.getCurrentController().getViewController();
- }
-
- private IMapViewManager getMapViewManager() {
- return Controller.getCurrentController().getMapViewManager();
- }
-
- public void setStatusInfo(final String infoPanelKey, final String info) {
- final ViewController viewController = getViewController();
- viewController.addStatusInfo(infoPanelKey, info, null);
- }
-
- public void setStatusInfo(final String infoPanelKey, final String info, final String iconKey) {
- final ViewController viewController = getViewController();
- viewController.addStatusInfo(infoPanelKey, info, FreeplaneIconUtils.createStandardIcon(iconKey));
- }
-
- @Deprecated
- public void setStatusInfo(final String infoPanelKey, final Icon icon) {
- final ViewController viewController = getViewController();
- viewController.addStatusInfo(infoPanelKey, null, icon);
- }
-
- public FreeplaneVersion getFreeplaneVersion() {
- return FreeplaneVersion.getVersion();
- }
-
- public File getUserDirectory() {
- return new File(ResourceController.getResourceController().getFreeplaneUserDirectory());
- }
-
- @Deprecated
- public List<Node> find(final ICondition condition) {
- if (scriptContext != null)
- scriptContext.accessAll();
- return ProxyUtils.find(condition, Controller.getCurrentController().getMap().getRootNode(), scriptContext);
- }
-
- public List<Node> find(final Closure<Boolean> closure) {
- if (scriptContext != null)
- scriptContext.accessAll();
- return ProxyUtils.find(closure, Controller.getCurrentController().getMap().getRootNode(), scriptContext);
- }
-
- // NodeRO: R
- public List<Node> findAll() {
- if (scriptContext != null)
- scriptContext.accessAll();
- return ProxyUtils.findAll(Controller.getCurrentController().getMap().getRootNode(), scriptContext, true);
- }
-
- // NodeRO: R
- public List<Node> findAllDepthFirst() {
- if (scriptContext != null)
- scriptContext.accessAll();
- return ProxyUtils.findAll(Controller.getCurrentController().getMap().getRootNode(), scriptContext, false);
- }
-
- public Map newMap() {
- final MapModel oldMap = Controller.getCurrentController().getMap();
- final MMapIO mapIO = (MMapIO) Controller.getCurrentModeController().getExtension(MapIO.class);
- final MapModel newMap = mapIO.newMapFromDefaultTemplate();
- restartTransaction(oldMap, newMap);
- return new MapProxy(newMap, scriptContext);
- }
-
- public Map newMap(URL url) {
- try {
- final MapModel oldMap = Controller.getCurrentController().getMap();
- Controller.getCurrentModeController().getMapController().newMap(url);
- final IMapViewManager mapViewManager = Controller.getCurrentController().getMapViewManager();
- final String key = mapViewManager.checkIfFileIsAlreadyOpened(url);
- // make the map the current map even if it was already opened
- if (key == null || !mapViewManager.tryToChangeToMapView(key))
- throw new RuntimeException("map " + url + " does not seem to be opened");
- final MapModel newMap = mapViewManager.getModel();
- restartTransaction(oldMap, newMap);
- return new MapProxy(newMap, scriptContext);
- }
- catch (Exception e) {
- throw new RuntimeException("error on newMap", e);
- }
- }
-
- private void restartTransaction(final MapModel oldMap, final MapModel newmap) {
- final IUndoHandler oldUndoHandler = (IUndoHandler) oldMap.getExtension(IUndoHandler.class);
- final IUndoHandler newUndoHandler = (IUndoHandler) newmap.getExtension(IUndoHandler.class);
- final int transactionLevel = oldUndoHandler.getTransactionLevel();
- if(transactionLevel == 0){
- return;
- }
- if(transactionLevel == 1){
- oldUndoHandler.commit();
- newUndoHandler.startTransaction();
- return;
- }
- throw new RuntimeException("can not create map inside transaction");
- }
-
- public float getZoom() {
- return getMapViewManager().getZoom();
- }
-
- public void setZoom(float ratio) {
- getMapViewManager().setZoom(ratio);
- }
-
- public boolean isInteractive() {
- return !Boolean.parseBoolean(System.getProperty("nonInteractive"));
- }
-
- public List<String> getExportTypeDescriptions() {
- final ArrayList<String> list = new ArrayList<String>();
- for (FileFilter fileFilter : ExportController.getContoller().getFileFilters()) {
- list.add(fileFilter.getDescription());
- }
- return list;
- }
-
- public void export(Map map, File destFile, String exportTypeDescription, boolean overwriteExisting) {
- final FileFilter filter = findExportFileFilterByDescription(exportTypeDescription);
- if (filter == null) {
- throw new IllegalArgumentException("no export defined for '" + exportTypeDescription + "'");
- }
- else if (!overwriteExisting && destFile.exists()) {
- throw new RuntimeException("destination file " + destFile.getAbsolutePath()
- + " already exists - set overwriteExisting to true?");
- }
- else {
- final IExportEngine exportEngine = ExportController.getContoller().getFilterMap().get(filter);
- exportEngine.export(((MapProxy) map).getDelegate(), destFile);
- LogUtils.info("exported " + map.getFile() + " to " + destFile.getAbsolutePath());
- }
- }
-
- private FileFilter findExportFileFilterByDescription(String exportTypeDescription) {
- for (FileFilter fileFilter : ExportController.getContoller().getFileFilters()) {
- if (fileFilter.getDescription().equals(exportTypeDescription))
- return fileFilter;
- }
- return null;
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/IconsProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/IconsProxy.java
deleted file mode 100644
index eb82e05..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/IconsProxy.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- *
- */
-package org.freeplane.plugin.script.proxy;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.freeplane.features.icon.IconController;
-import org.freeplane.features.icon.MindIcon;
-import org.freeplane.features.icon.factory.IconStoreFactory;
-import org.freeplane.features.icon.mindmapmode.MIconController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.plugin.script.ScriptContext;
-
-class IconsProxy extends AbstractProxy<NodeModel> implements Proxy.Icons {
- IconsProxy(final NodeModel delegate, final ScriptContext scriptContext) {
- super(delegate, scriptContext);
- }
-
- public void add(final String name) {
- getIconController().addIcon(getDelegate(), IconStoreFactory.create().getMindIcon(name));
- }
-
- @Deprecated
- public void addIcon(final String name) {
- add(name);
- }
-
- private int findIcon(final String iconID) {
- final List<MindIcon> icons = getDelegate().getIcons();
- for (int i = 0; i < icons.size(); i++) {
- if (icons.get(i).getName().equals(iconID)) {
- return i;
- }
- }
- return -1;
- }
-
- private MIconController getIconController() {
- return (MIconController) IconController.getController();
- }
-
- public String getAt(int index) {
- final List<MindIcon> icons = getDelegate().getIcons();
- return icons.size() <= index ? null : icons.get(index).getName();
- }
-
- public String getFirst() {
- final List<MindIcon> icons = getDelegate().getIcons();
- return icons.isEmpty() ? null : icons.get(0).getName();
- }
-
- public boolean contains(String name) {
- final List<MindIcon> icons = getDelegate().getIcons();
- for (final MindIcon icon : icons) {
- if (icon.getName().equals(name))
- return true;
- }
- return false;
- }
-
- public int size() {
- final List<MindIcon> icons = getDelegate().getIcons();
- return icons.size();
- }
-
- public List<String> getIcons() {
- final List<MindIcon> icons = getDelegate().getIcons();
- final int size = icons.size();
- if (size == 0) {
- return Collections.emptyList();
- }
- final ArrayList<String> list = new ArrayList<String>(size);
- for (final MindIcon icon : icons) {
- list.add(icon.getName());
- }
- return Collections.unmodifiableList(list);
- }
-
- public List<URL> getUrls() {
- final List<MindIcon> icons = getDelegate().getIcons();
- final int size = icons.size();
- if (size == 0) {
- return Collections.emptyList();
- }
- final ArrayList<URL> list = new ArrayList<URL>(size);
- for (final MindIcon icon : icons) {
- list.add(icon.getUrl());
- }
- return Collections.unmodifiableList(list);
- }
-
- public Iterator<String> iterator() {
- return new Iterator<String>() {
- final Iterator<String> iterator = getIcons().iterator();
-
- @Override
- public boolean hasNext() {
- return iterator.hasNext();
- }
-
- @Override
- public String next() {
- return iterator.next();
- }
-
- @Override
- public void remove() {
- throw new UnsupportedOperationException("icons iterator is read-only");
- }
- };
- }
-
- public boolean remove(final int index) {
- if (index >= size()) {
- return false;
- }
- getIconController().removeIcon(getDelegate(), index);
- return true;
- }
-
- public boolean remove(final String iconID) {
- final int index = findIcon(iconID);
- if (index == -1) {
- return false;
- }
- getIconController().removeIcon(getDelegate(), index);
- return true;
- }
-
- @Deprecated
- public boolean removeIcon(final String iconID) {
- return remove(iconID);
- }
-
- public void clear() {
- getIconController().removeAllIcons(getDelegate());
- }
-
- /** make <code>if (node.icons) println "has some icon"</code> work. */
- public boolean asBoolean() {
- return size() > 0;
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/LinkProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/LinkProxy.java
deleted file mode 100644
index 81fcfe2..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/LinkProxy.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/**
- *
- */
-package org.freeplane.plugin.script.proxy;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.plugin.script.ScriptContext;
-import org.freeplane.plugin.script.proxy.Proxy.Node;
-
-class LinkProxy extends AbstractProxy<NodeModel> implements Proxy.Link {
- LinkProxy(final NodeModel delegate, final ScriptContext scriptContext) {
- super(delegate, scriptContext);
- }
-
- // LinkRO
- public String getText() {
- final URI link = getUri();
- return link == null ? null : link.toString();
- }
-
- // LinkRO
- public URI getUri() {
- return NodeLinks.getLink(getDelegate());
- }
-
- // LinkRO
- public File getFile() {
- URI link = getUri();
- try {
- if (link == null)
- return null;
- if (!link.isAbsolute() && isFileUri(link)) {
- final File mapFile = getDelegate().getMap().getFile();
- return mapFile == null ? null : new File(mapFile.getParent(), link.getPath());
- }
- return new File(link);
- }
- catch (Exception e) {
- LogUtils.warn("link is not a file uri: " + e);
- return null;
- }
- }
-
- private boolean isFileUri(URI link) {
- return link.getScheme() == null || link.getScheme().equals("file");
- }
-
- // LinkRO
- public Node getNode() {
- final URI uri = getUri();
- if (uri == null)
- return null;
- final String link = uri.toString();
- if (!link.startsWith("#")) {
- LogUtils.warn(link + " is no node id link");
- return null;
- }
- final NodeModel targetNode = getDelegate().getMap().getNodeForID(link.substring(1));
- if (targetNode == null) {
- LogUtils.warn(link + ": node does not exist (anymore?)");
- return null;
- }
- return new NodeProxy(targetNode, getScriptContext());
- }
-
- // LinkRO
- @Deprecated
- public String get() {
- // uses getValidLink() instead of getLink() as in getText()
- final URI link = NodeLinks.getValidLink(getDelegate());
- return link == null ? null : link.toString();
- }
-
- private MLinkController getLinkController() {
- return (MLinkController) LinkController.getController();
- }
-
- // Link R/W
- public void setText(String target) {
- try {
- if (!removeLinkIfNull(target)) {
- getLinkController().setLink(getDelegate(), new URI(target), LinkController.LINK_ABSOLUTE);
- }
- }
- catch (final URISyntaxException e) {
- throw new IllegalArgumentException(e);
- }
- }
-
- // Link R/W
- public void setUri(URI target) {
- if (!removeLinkIfNull(target)) {
- getLinkController().setLink(getDelegate(), target, LinkController.LINK_ABSOLUTE);
- }
- }
-
- // Link R/W
- public void setFile(File file) {
- if (!removeLinkIfNull(file)) {
- getLinkController().setLink(getDelegate(), file.toURI(), LinkController.LINK_ABSOLUTE);
- }
- }
-
- // Link R/W
- public void setNode(Node node) {
- if (!removeLinkIfNull(node)) {
- if (getModeController().getMapController().getNodeFromID(node.getId()) == null) {
- throw new IllegalArgumentException("target node " + node.toString() + " belongs to a different map");
- }
- setText("#" + node.getId());
- }
- }
-
- // Link R/W
- @Deprecated
- public boolean set(final String target) {
- try {
- setText(target);
- return true;
- }
- catch (RuntimeException e) {
- LogUtils.warn(e);
- return false;
- }
- }
-
- private boolean removeLinkIfNull(Object target) {
- if (target == null){
- getLinkController().setLink(getDelegate(), (URI) null, LinkController.LINK_ABSOLUTE);
- return true;
- }
- return false;
- }
-
- /** make <code>if (node.link) println "has link"</code> work. */
- public boolean asBoolean() {
- return getUri() != null;
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/MapProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/MapProxy.java
deleted file mode 100644
index 48777c5..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/MapProxy.java
+++ /dev/null
@@ -1,196 +0,0 @@
-package org.freeplane.plugin.script.proxy;
-
-import groovy.lang.Closure;
-
-import java.awt.Color;
-import java.io.File;
-import java.util.Map.Entry;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.features.filter.Filter;
-import org.freeplane.features.filter.FilterController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.styles.MapStyle;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.ui.IMapViewManager;
-import org.freeplane.plugin.script.ScriptContext;
-import org.freeplane.plugin.script.proxy.Proxy.Map;
-import org.freeplane.plugin.script.proxy.Proxy.Node;
-
-public class MapProxy extends AbstractProxy<MapModel> implements Map {
- public MapProxy(final MapModel map, final ScriptContext scriptContext) {
- super(map, scriptContext);
- }
-
- // MapRO: R
- public Node node(final String id) {
- final NodeModel node = getDelegate().getNodeForID(id);
- return node != null ? new NodeProxy(node, getScriptContext()) : null;
- }
-
- // MapRO: R
- public Node getRoot() {
- final NodeModel rootNode = getDelegate().getRootNode();
- return new NodeProxy(rootNode, getScriptContext());
- }
-
- @Deprecated
- public Node getRootNode() {
- return getRoot();
- }
-
- // MapRO: R
- public File getFile() {
- return getDelegate().getFile();
- }
-
- // MapRO: R
- public String getName() {
- final IMapViewManager mapViewManager = getMapViewManager();
- for (Entry<String, MapModel> map : mapViewManager.getMaps().entrySet()) {
- if (map.getValue().equals(getDelegate()))
- return map.getKey();
- }
- return null;
- }
-
- // MapRO: R
- public boolean isSaved() {
- return getDelegate().isSaved();
- }
-
- // MapRO: R
- public Color getBackgroundColor() {
- // see MapBackgroundColorAction
- final MapStyle mapStyle = (MapStyle) Controller.getCurrentModeController().getExtension(MapStyle.class);
- final MapStyleModel model = (MapStyleModel) mapStyle.getMapHook();
- if (model != null) {
- return model.getBackgroundColor();
- }
- else {
- final String colorPropertyString = ResourceController.getResourceController().getProperty(
- MapStyle.RESOURCES_BACKGROUND_COLOR);
- final Color defaultBgColor = ColorUtils.stringToColor(colorPropertyString);
- return defaultBgColor;
- }
- }
-
- // MapRO: R
- public String getBackgroundColorCode() {
- return ColorUtils.colorToString(getBackgroundColor());
- }
-
- // Map: R/W
- public boolean close(boolean force, boolean allowInteraction) {
- if (!getDelegate().isSaved() && !force && !allowInteraction)
- throw new RuntimeException("will not close an unsaved map without being told so");
- final IMapViewManager mapViewManager = getMapViewManager();
- changeToThisMap(mapViewManager);
- return mapViewManager.close(force);
- }
-
- private void changeToThisMap(final IMapViewManager mapViewManager) {
- String mapKey = findMapViewKey(mapViewManager);
- if (mapKey == null)
- throw new RuntimeException("map " + getDelegate() + " does not seem to be opened");
- mapViewManager.changeToMapView(mapKey);
- }
-
- private IMapViewManager getMapViewManager() {
- return getModeController().getController().getMapViewManager();
- }
-
- private String findMapViewKey(final IMapViewManager mapViewManager) {
- for (Entry<String, MapModel> entry : mapViewManager.getMaps().entrySet()) {
- if (entry.getValue().equals(getDelegate())) {
- return entry.getKey();
- }
- }
- return null;
- }
-
- // Map: R/W
- public boolean save(boolean allowInteraction) {
- if (!getDelegate().isSaved() && getDelegate().getURL() == null && !allowInteraction)
- throw new RuntimeException("no url set for map " + getDelegate());
- changeToThisMap(getMapViewManager());
- return getModeController().save();
- }
-
- // Map: R/W
- public void setName(final String title) {
- changeToThisMap(getMapViewManager());
- Controller.getCurrentController().getMapViewManager().getMapViewComponent().setName(title);
- }
-
- // Map: R/W
- public void setSaved(final boolean isSaved) {
- Controller.getCurrentModeController().getMapController().setSaved(getDelegate(), isSaved);
- }
-
- // Map: R/W
- public void setBackgroundColor(Color color) {
- final MapStyle mapStyle = (MapStyle) Controller.getCurrentModeController().getExtension(MapStyle.class);
- final MapStyleModel model = (MapStyleModel) mapStyle.getMapHook();
- mapStyle.setBackgroundColor(model, color);
- }
-
- // Map: R/W
- public void setBackgroundColorCode(String rgbString) {
- setBackgroundColor(ColorUtils.stringToColor(rgbString));
- }
-
- // Map: R/W
- public void setFilter(final Closure<Boolean> closure) {
- final FilterController filterController = FilterController.getCurrentFilterController();
- if (closure == null) {
- filterController.applyNoFiltering();
- }
- else {
- final Filter filter = new Filter(ProxyUtils.createCondition(closure, getScriptContext()), false, false,
- true);
- filterController.applyFilter(filter, getDelegate(), true);
- }
- }
-
- // Map: R/W
- public void filter(final Closure<Boolean> closure) {
- setFilter(closure);
- }
-
- // Map: R/W
- public void setFilter(final boolean showAncestors, final boolean showDescendants, final Closure<Boolean> closure) {
- final FilterController filterController = FilterController.getCurrentFilterController();
- if (closure == null) {
- filterController.applyNoFiltering();
- }
- else {
- final Filter filter = new Filter(ProxyUtils.createCondition(closure, getScriptContext()), showAncestors,
- showDescendants, true);
- filterController.applyFilter(filter, getDelegate(), true);
- }
- }
-
- // Map: R/W
- public void filter(final boolean showAncestors, final boolean showDescendants, final Closure<Boolean> closure) {
- setFilter(showAncestors, showDescendants, closure);
- }
-
- // Map: R/W
- public void redoFilter() {
- FilterController.getCurrentFilterController().redo();
- }
-
- // Map: R/W
- public void undoFilter() {
- FilterController.getCurrentFilterController().undo();
- }
-
- // Map: RO
- public Proxy.Properties getStorage() {
- return new PropertiesProxy(getDelegate(), getScriptContext());
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/NodeProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/NodeProxy.java
deleted file mode 100644
index 33d3cc8..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/NodeProxy.java
+++ /dev/null
@@ -1,805 +0,0 @@
-/**
- *
- */
-package org.freeplane.plugin.script.proxy;
-
-import groovy.lang.Closure;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import org.codehaus.groovy.runtime.DefaultGroovyMethods;
-import org.codehaus.groovy.runtime.typehandling.NumberMath;
-import org.freeplane.core.undo.IActor;
-import org.freeplane.core.util.HtmlUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.clipboard.ClipboardController;
-import org.freeplane.features.clipboard.mindmapmode.MClipboardController;
-import org.freeplane.features.encrypt.Base64Coding;
-import org.freeplane.features.encrypt.EncryptionController;
-import org.freeplane.features.encrypt.PasswordStrategy;
-import org.freeplane.features.encrypt.mindmapmode.MEncryptionController;
-import org.freeplane.features.filter.condition.ICondition;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.link.ConnectorModel;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.EncryptionModel;
-import org.freeplane.features.map.FreeNode;
-import org.freeplane.features.map.MapController.Direction;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.MapNavigationUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.map.mindmapmode.MMapController;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.nodelocation.LocationController;
-import org.freeplane.features.nodelocation.mindmapmode.MLocationController;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
-import org.freeplane.features.note.NoteController;
-import org.freeplane.features.note.NoteModel;
-import org.freeplane.features.note.mindmapmode.MNoteController;
-import org.freeplane.features.text.DetailTextModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.plugin.script.ScriptContext;
-import org.freeplane.plugin.script.proxy.Proxy.Attributes;
-import org.freeplane.plugin.script.proxy.Proxy.Cloud;
-import org.freeplane.plugin.script.proxy.Proxy.Node;
-import org.freeplane.plugin.script.proxy.Proxy.Reminder;
-
-class NodeProxy extends AbstractProxy<NodeModel> implements Node {
- private static final Integer ONE = 1;
- private static final Integer ZERO = 0;
-
- public NodeProxy(final NodeModel node, final ScriptContext scriptContext) {
- super(node, scriptContext);
- if (scriptContext != null)
- scriptContext.accessNode(node);
- }
-
- // Node: R/W
- public Proxy.Connector addConnectorTo(final Proxy.Node target) {
- return addConnectorTo(target.getId());
- }
-
- // Node: R/W
- public Proxy.Connector addConnectorTo(final String targetNodeID) {
- final MLinkController linkController = (MLinkController) LinkController.getController();
- final ConnectorModel connectorModel = linkController.addConnector(getDelegate(), targetNodeID);
- return new ConnectorProxy(connectorModel, getScriptContext());
- }
-
- // Node: R/W
- public Proxy.Node createChild() {
- final MMapController mapController = (MMapController) getModeController().getMapController();
- final NodeModel newNodeModel = new NodeModel(getDelegate().getMap());
- mapController.insertNode(newNodeModel, getDelegate());
- return new NodeProxy(newNodeModel, getScriptContext());
- }
-
- // Node: R/W
- public Proxy.Node createChild(final Object value) {
- final Node child = createChild();
- child.setObject(value);
- return child;
- }
-
- // Node: R/W
- public Proxy.Node createChild(final int position) {
- final MMapController mapController = (MMapController) getModeController().getMapController();
- final NodeModel newNodeModel = new NodeModel(getDelegate().getMap());
- mapController.insertNode(newNodeModel, getDelegate(), position);
- return new NodeProxy(newNodeModel, getScriptContext());
- }
-
- // Node: R/W
- public Proxy.Node appendChild(Proxy.NodeRO node) {
- return appendBranchImpl(node, false);
- }
-
- // Node: R/W
- public Proxy.Node appendBranch(Proxy.NodeRO node) {
- return appendBranchImpl(node, true);
- }
-
- private Proxy.Node appendBranchImpl(Proxy.NodeRO node, boolean withChildren) {
- final MClipboardController clipboardController = (MClipboardController) ClipboardController.getController();
- final NodeModel newNodeModel = clipboardController.duplicate(((NodeProxy) node).getDelegate(), withChildren);
- final MMapController mapController = (MMapController) getModeController().getMapController();
- mapController.insertNode(newNodeModel, getDelegate());
- return new NodeProxy(newNodeModel, getScriptContext());
- }
-
- // Node: R/W
- public void delete() {
- final MMapController mapController = (MMapController) getModeController().getMapController();
- mapController.deleteNode(getDelegate());
- }
-
- // NodeRO: R
- public Proxy.Attributes getAttributes() {
- return new AttributesProxy(getDelegate(), getScriptContext());
- }
-
- // NodeRO: R
- public Convertible getAt(final String attributeName) {
- final Object value = getAttributes().getFirst(attributeName);
- return ProxyUtils.attributeValueToConvertible(getDelegate(), getScriptContext(), value);
- }
-
- // Node: R/W
- public Object putAt(final String attributeName, final Object value) {
- final Attributes attributes = getAttributes();
- if (value == null) {
- final int index = attributes.findFirst(attributeName);
- if (index != -1)
- attributes.remove(index);
- // else: ignore request
- }
- else {
- attributes.set(attributeName, value);
- }
- return value;
- }
-
- // Node: R/W
- public void setAttributes(Map<String, Object> attributeMap) {
- final Attributes attributes = getAttributes();
- attributes.clear();
- for (Entry<String, Object> entry : attributeMap.entrySet()) {
- attributes.set(entry.getKey(), entry.getValue());
- }
- }
-
- // Node: R/W
- public void setDetails(Object details) {
- setDetailsText(convertConvertibleToHtml(details));
- }
-
- // Node: R/W
- public void setDetailsText(String html) {
- final MTextController textController = (MTextController) TextController.getController();
- if (html == null) {
- textController.setDetailsHidden(getDelegate(), false);
- textController.setDetails(getDelegate(), null);
- }
- else{
- textController.setDetails(getDelegate(), html);
- }
- }
-
- // Node: R/W
- public void setHideDetails(boolean hide) {
- MTextController controller = (MTextController) MTextController.getController();
- controller.setDetailsHidden(getDelegate(), hide);
- }
-
- // NodeRO: R
- public int getChildPosition(final Proxy.Node childNode) {
- final NodeModel childNodeModel = ((NodeProxy) childNode).getDelegate();
- return getDelegate().getChildPosition(childNodeModel);
- }
-
- // NodeRO: R
- public List<Proxy.Node> getChildren() {
- return ProxyUtils.createListOfChildren(getDelegate(), getScriptContext());
- }
-
- // NodeRO: R
- public Cloud getCloud() {
- return new CloudProxy(this);
- }
-
- // NodeRO: R
- public Collection<Proxy.Connector> getConnectorsIn() {
- return new ConnectorInListProxy(this);
- }
-
- // NodeRO: R
- public Collection<Proxy.Connector> getConnectorsOut() {
- return new ConnectorOutListProxy(this);
- }
-
- // NodeRO: R
- public Convertible getDetails() {
- final String detailsText = DetailTextModel.getDetailTextText(getDelegate());
- return (detailsText == null) ? null : new ConvertibleHtmlText(getDelegate(), getScriptContext(), detailsText);
- }
-
- // NodeRO: R
- public String getDetailsText() {
- return DetailTextModel.getDetailTextText(getDelegate());
- }
-
- // NodeRO: R
- public boolean getHideDetails() {
- final DetailTextModel detailText = DetailTextModel.getDetailText(getDelegate());
- return detailText != null && detailText.isHidden();
- }
-
- // NodeRO: R
- public Proxy.ExternalObject getExternalObject() {
- return new ExternalObjectProxy(getDelegate(), getScriptContext());
- }
-
- // NodeRO: R
- public Proxy.Icons getIcons() {
- return new IconsProxy(getDelegate(), getScriptContext());
- }
-
- // NodeRO: R
- public Proxy.Link getLink() {
- return new LinkProxy(getDelegate(), getScriptContext());
- }
-
- // NodeRO: R
- public Reminder getReminder() {
- return new ReminderProxy(getDelegate(), getScriptContext());
- }
-
- // NodeRO: R
- public String getId() {
- return getDelegate().createID();
- }
-
- // NodeRO: R
- @Deprecated
- public String getNodeID() {
- return getId();
- }
-
- // NodeRO: R
- public int getNodeLevel(final boolean countHidden) {
- return getDelegate().getNodeLevel(countHidden);
- }
-
- // NodeRO: R
- public String getPlainNote() {
- final String noteText = NoteModel.getNoteText(getDelegate());
- return noteText == null ? null : HtmlUtils.htmlToPlain(noteText);
- }
-
- // NodeRO: R
- public String getNoteText() {
- return NoteModel.getNoteText(getDelegate());
- }
-
- // NodeRO: R
- public Convertible getNote() {
- final String noteText = getNoteText();
- return (noteText == null) ? null : new ConvertibleNoteText(getDelegate(), getScriptContext(), noteText);
- }
-
- // NodeRO: R
- public Proxy.Node getParent() {
- final NodeModel parentNode = getDelegate().getParentNode();
- return parentNode != null ? new NodeProxy(parentNode, getScriptContext()) : null;
- }
-
- // NodeRO: R
- @Deprecated
- public Proxy.Node getParentNode() {
- return getParent();
- }
-
- // NodeRO: R
- public List<Node> getPathToRoot() {
- return ProxyUtils.createNodeList(Arrays.asList(getDelegate().getPathToRoot()), getScriptContext());
- }
-
- // NodeRO: R
- public Node getNext() {
- final NodeModel node = MapNavigationUtils.findNext(Direction.FORWARD, getDelegate(), null);
- return node == null ? null : new NodeProxy(node, getScriptContext());
- }
-
- // NodeRO: R
- public Node getPrevious() {
- final NodeModel node = MapNavigationUtils.findPrevious(Direction.BACK, getDelegate(), null);
- return node == null ? null : new NodeProxy(node, getScriptContext());
- }
-
- // NodeRO: R
- public String getPlainText() {
- return HtmlUtils.htmlToPlain(getDelegate().getText());
- }
-
- // NodeRO: R
- @Deprecated
- public String getPlainTextContent() {
- return getPlainText();
- }
-
- // NodeRO: R
- public Proxy.NodeStyle getStyle() {
- return new NodeStyleProxy(getDelegate(), getScriptContext());
- }
-
- // NodeRO: R
- public boolean hasStyle(String styleName) {
- return NodeStyleProxy.hasStyle(getDelegate(), styleName);
- }
-
- // NodeRO: R
- public String getText() {
- return getDelegate().getText();
- }
-
- // NodeRO: R
- public String getTransformedText() {
- final TextController textController = TextController.getController();
- return textController.getTransformedTextNoThrow(getDelegate());
- }
-
- // NodeRO: R
- public String getShortText() {
- final TextController textController = TextController.getController();
- return textController.getShortText(getDelegate());
- }
-
- // NodeRO: R
- public String getDisplayedText(){
- if(isMinimized())
- return getShortText();
- else
- return getTransformedText();
- }
-
- // NodeRO: R
- public boolean isMinimized(){
- final TextController textController = TextController.getController();
- return textController.isMinimized(getDelegate());
- }
-
- // NodeRO: R
- public Object getObject() {
- final Object userObject = getDelegate().getUserObject();
- if (userObject instanceof IFormattedObject)
- return ((IFormattedObject) userObject).getObject();
- return userObject;
- }
-
- // NodeRO: R
- public byte[] getBinary() {
- return Base64Coding.decode64(getDelegate().getText().replaceAll("\\s", ""));
- }
-
- // NodeRO: R
- public String getFormat() {
- final NodeModel nodeModel = getDelegate();
- final String format = TextController.getController().getNodeFormat(nodeModel);
- if (format == null && nodeModel.getUserObject() instanceof IFormattedObject)
- return ((IFormattedObject) nodeModel.getUserObject()).getPattern();
- return format;
- }
-
- // NodeRO: R
- public Convertible getTo() {
- return ProxyUtils.nodeModelToConvertible(getDelegate(), getScriptContext());
- }
-
- // NodeRO: R
- public Convertible getValue() {
- return getTo();
- }
-
- // NodeRO: R
- public boolean isDescendantOf(final Proxy.Node otherNode) {
- // no need to trace this since it's already logged
- final NodeModel otherNodeModel = ((NodeProxy) otherNode).getDelegate();
- NodeModel node = this.getDelegate();
- do {
- if (node.equals(otherNodeModel)) {
- return true;
- }
- node = node.getParentNode();
- } while (node != null);
- return false;
- }
-
- // NodeRO: R
- public boolean isFolded() {
- return getDelegate().isFolded();
- }
-
- // NodeRO: R
- public boolean isFree() {
- final FreeNode freeNode = Controller.getCurrentModeController().getExtension(FreeNode.class);
- return freeNode.isActive(getDelegate());
- }
-
- // NodeRO: R
- public boolean isLeaf() {
- return getDelegate().isLeaf();
- }
-
- // NodeRO: R
- public boolean isLeft() {
- return getDelegate().isLeft();
- }
-
- // NodeRO: R
- public boolean isRoot() {
- return getDelegate().isRoot();
- }
-
- // NodeRO: R
- public boolean isVisible() {
- return getDelegate().isVisible();
- }
-
- // Node: R/W
- public void moveTo(final Proxy.Node parentNodeProxy) {
- final NodeModel parentNode = ((NodeProxy) parentNodeProxy).getDelegate();
- final NodeModel movedNode = getDelegate();
- final MMapController mapController = (MMapController) getModeController().getMapController();
- mapController.moveNodeAsChild(movedNode, parentNode, movedNode.isLeft(), parentNode.isLeft() != movedNode.isLeft());
- }
-
- // Node: R/W
- public void moveTo(final Proxy.Node parentNodeProxy, final int position) {
- final NodeModel parentNode = ((NodeProxy) parentNodeProxy).getDelegate();
- final NodeModel movedNode = getDelegate();
- final MMapController mapController = (MMapController) getModeController().getMapController();
- ((FreeNode)Controller.getCurrentModeController().getExtension(FreeNode.class)).undoableDeactivateHook(movedNode);
- mapController.moveNode(movedNode, parentNode, position, getDelegate().isLeft(), parentNode.isLeft() != movedNode.isLeft());
- }
-
- // Node: R/W
- public void removeConnector(final Proxy.Connector connectorToBeRemoved) {
- final ConnectorProxy connectorProxy = (ConnectorProxy) connectorToBeRemoved;
- final ConnectorModel link = connectorProxy.getConnector();
- final MLinkController linkController = (MLinkController) LinkController.getController();
- linkController.removeArrowLink(link);
- }
-
- // Node: R/W
- public void setFolded(final boolean folded) {
- final MMapController mapController = (MMapController) getModeController().getMapController();
- mapController.setFolded(getDelegate(), folded);
- }
-
- // Node: R/W
- public void setFree(boolean free) {
- final FreeNode freeNode = Controller.getCurrentModeController().getExtension(FreeNode.class);
- if (free != freeNode.isActive(getDelegate()))
- freeNode.undoableToggleHook(getDelegate());
- }
-
- // Node: R/W
- public void setMinimized(boolean shortened){
- final MTextController textController = (MTextController) TextController.getController();
- textController.setIsMinimized(getDelegate(), shortened);
- }
-
- // Node: R/W
- public void setNote(Object value) {
- final MNoteController noteController = (MNoteController) NoteController.getController();
- noteController.setNoteText(getDelegate(), convertConvertibleToHtml(value));
- }
-
- private String convertConvertibleToHtml(Object value) {
- if (value == null)
- return null;
- final String text = Convertible.toString(value);
- // the text content of a Convertible object might be null
- if (text == null)
- return null;
- return HtmlUtils.isHtmlNode(text) ? text : HtmlUtils.plainToHTML(text);
- }
-
- // Node: R/W
- public void setNoteText(final String html) {
- final MNoteController noteController = (MNoteController) NoteController.getController();
- noteController.setNoteText(getDelegate(), html);
- }
-
- // Node: R/W
- public void setText(final Object value) {
- if (value instanceof String) {
- final MTextController textController = (MTextController) TextController.getController();
- textController.setNodeText(getDelegate(), (String) value);
- }
- else {
- setObject(value);
- }
- }
-
- // Node: R/W
- public void setObject(final Object object) {
- final MTextController textController = (MTextController) TextController.getController();
- textController.setNodeObject(getDelegate(), ProxyUtils.transformObject(object, null));
- }
-
- // Node: R/W
- public void setDateTime(final Date date) {
- final MTextController textController = (MTextController) TextController.getController();
- textController.setNodeObject(getDelegate(), ProxyUtils.createDefaultFormattedDateTime(date));
- }
-
- // Node: R/W
- public void setBinary(final byte[] data) {
- setObject(Base64Coding.encode64(data).replaceAll("(.{74})", "$1\n"));
- }
-
- public void setFormat(final String format) {
- final MNodeStyleController styleController = (MNodeStyleController) Controller.getCurrentModeController()
- .getExtension(NodeStyleController.class);
- styleController.setNodeFormat(getDelegate(), format);
- }
-
- public void setLeft(final boolean isLeft) {
- getDelegate().setLeft(isLeft);
- }
-
- // NodeRO: R
- public Proxy.Map getMap() {
- final MapModel map = getDelegate().getMap();
- return map != null ? new MapProxy(map, getScriptContext()) : null;
- }
-
- // NodeRO: R
- @Deprecated
- public List<Node> find(final ICondition condition) {
- final NodeModel delegate = getDelegate();
- if (getScriptContext() != null)
- getScriptContext().accessBranch(delegate);
- return ProxyUtils.find(condition, delegate, getScriptContext());
- }
-
- // NodeRO: R
- public List<Node> find(final Closure<Boolean> closure) {
- final NodeModel delegate = getDelegate();
- if (getScriptContext() != null)
- getScriptContext().accessBranch(delegate);
- return ProxyUtils.find(closure, delegate, getScriptContext());
- }
-
- // NodeRO: R
- public List<Node> findAll() {
- final NodeModel delegate = getDelegate();
- if (getScriptContext() != null)
- getScriptContext().accessBranch(delegate);
- return ProxyUtils.findAll(delegate, getScriptContext(), true);
- }
-
- // NodeRO: R
- public List<Node> findAllDepthFirst() {
- final NodeModel delegate = getDelegate();
- if (getScriptContext() != null)
- getScriptContext().accessBranch(delegate);
- return ProxyUtils.findAll(delegate, getScriptContext(), false);
- }
-
- // NodeRO: R
- public Date getLastModifiedAt() {
- return getDelegate().getHistoryInformation().getLastModifiedAt();
- }
-
- // Node: R/W
- public void setLastModifiedAt(final Date date) {
- final Date oldDate = getDelegate().getHistoryInformation().getLastModifiedAt();
- final IActor actor = new IActor() {
- public void act() {
- getDelegate().getHistoryInformation().setLastModifiedAt(date);
- }
-
- public String getDescription() {
- return "setLastModifiedAt";
- }
-
- public void undo() {
- getDelegate().getHistoryInformation().setLastModifiedAt(oldDate);
- }
- };
- getModeController().execute(actor, getDelegate().getMap());
- }
-
- // NodeRO: R
- public Date getCreatedAt() {
- return getDelegate().getHistoryInformation().getCreatedAt();
- }
-
- // Node: R/W
- public void setCreatedAt(final Date date) {
- final Date oldDate = getDelegate().getHistoryInformation().getCreatedAt();
- final IActor actor = new IActor() {
- public void act() {
- getDelegate().getHistoryInformation().setCreatedAt(date);
- }
-
- public String getDescription() {
- return "setCreatedAt";
- }
-
- public void undo() {
- getDelegate().getHistoryInformation().setCreatedAt(oldDate);
- }
- };
- getModeController().execute(actor, getDelegate().getMap());
- }
-
- //
- // Node arithmetics for
- // Node <operator> Number
- // Node <operator> Node
- // See NodeArithmeticsCategory for
- // Number <operator> Node
- //
- public Number and(final Number number) {
- return NumberMath.and(this.getTo().getNum0(), number);
- }
-
- public Number and(final Proxy.Node node) {
- return NumberMath.and(this.getTo().getNum0(), node.getTo().getNum0());
- }
-
- public Number div(final Number number) {
- return NumberMath.divide(this.getTo().getNum0(), number);
- }
-
- public Number div(final Proxy.Node node) {
- return NumberMath.divide(this.getTo().getNum0(), node.getTo().getNum0());
- }
-
- public Number minus(final Number number) {
- return NumberMath.subtract(this.getTo().getNum0(), number);
- }
-
- public Number minus(final Proxy.Node node) {
- return NumberMath.subtract(this.getTo().getNum0(), node.getTo().getNum0());
- }
-
- public Number mod(final Number number) {
- return NumberMath.mod(this.getTo().getNum0(), number);
- }
-
- public Number mod(final Proxy.Node node) {
- return NumberMath.mod(this.getTo().getNum0(), node.getTo().getNum0());
- }
-
- public Number multiply(final Number number) {
- return NumberMath.multiply(this.getTo().getNum0(), number);
- }
-
- public Number multiply(final Proxy.Node node) {
- return NumberMath.multiply(this.getTo().getNum0(), node.getTo().getNum0());
- }
-
- public Number or(final Number number) {
- return NumberMath.or(this.getTo().getNum0(), number);
- }
-
- public Number or(final Proxy.Node node) {
- return NumberMath.or(this.getTo().getNum0(), node.getTo().getNum0());
- }
-
- public Number plus(final Number number) {
- return NumberMath.add(this.getTo().getNum0(), number);
- }
-
- public Number plus(final Proxy.Node node) {
- return NumberMath.add(this.getTo().getNum0(), node.getTo().getNum0());
- }
-
- public Number power(final Number number) {
- return DefaultGroovyMethods.power(this.getTo().getNum0(), number);
- }
-
- public Number power(final Proxy.Node node) {
- return DefaultGroovyMethods.power(this.getTo().getNum0(), node.getTo().getNum0());
- }
-
- public Number xor(final Number number) {
- return NumberMath.xor(this.getTo().getNum0(), number);
- }
-
- public Number xor(final Proxy.Node node) {
- return NumberMath.xor(this.getTo().getNum0(), node.getTo().getNum0());
- }
-
- public Number negative() {
- return NumberMath.subtract(ZERO, this.getTo().getNum0());
- }
-
- public Number next() {
- return NumberMath.add(this.getTo().getNum0(), ONE);
- }
-
- public Number positive() {
- return this.getTo().getNum0();
- }
-
- public Number previous() {
- return NumberMath.subtract(this.getTo().getNum0(), ONE);
- }
-
- public boolean hasEncryption() {
- return getEncryptionModel() != null;
- }
-
- public boolean isEncrypted() {
- final EncryptionModel encryptionModel = getEncryptionModel();
- return encryptionModel != null && !encryptionModel.isAccessible();
- }
-
- public void encrypt(String password) {
- if (!isEncrypted())
- getEncryptionController().toggleCryptState(getDelegate(), makePasswordStrategy(password));
- }
-
- public void decrypt(String password) {
- if (isEncrypted())
- getEncryptionController().toggleCryptState(getDelegate(), makePasswordStrategy(password));
- }
-
- public void removeEncryption(String password) {
- getEncryptionController().removeEncryption(getDelegate(), makePasswordStrategy(password));
- }
-
- private PasswordStrategy makePasswordStrategy(final String password) {
- return new PasswordStrategy() {
- public StringBuilder getPassword() {
- return new StringBuilder(password);
- }
-
- public StringBuilder getPasswordWithConfirmation() {
- return getPassword();
- }
-
- public void onWrongPassword() {
- LogUtils.info("wrong password for node " + getDelegate());
- setStatusInfo(TextUtils.getText("accessories/plugins/EncryptNode.properties_wrong_password"));
- }
-
- public boolean isCancelled() {
- return false;
- }
- };
- }
-
- private void setStatusInfo(String text) {
- final ViewController viewController = Controller.getCurrentController().getViewController();
- viewController.out(text);
- }
-
- private MEncryptionController getEncryptionController() {
- return (MEncryptionController) Controller.getCurrentModeController().getExtension(EncryptionController.class);
- }
-
- private EncryptionModel getEncryptionModel() {
- return EncryptionModel.getModel(getDelegate());
- }
-
-
- public int getHorizontalShift(){
- return LocationController.getController().getHorizontalShift(getDelegate());
- }
-
- public void setHorizontalShift(final int horizontalShift){
- ((MLocationController) LocationController.getController()).setHorizontalShift(getDelegate(), horizontalShift);
- }
-
- public int getVerticalShift(){
- return LocationController.getController().getVerticalShift(getDelegate());
- }
-
- public void setVerticalShift(final int verticalShift){
- ((MLocationController) LocationController.getController()).setVerticalShift(getDelegate(), verticalShift);
- }
-
- public int getMinimalDistanceBetweenChildren(){
- return LocationController.getController().getMinimalDistanceBetweenChildren(getDelegate());
- }
-
- public void setMinimalDistanceBetweenChildren(final int minimalDistanceBetweenChildren){
- ((MLocationController) LocationController.getController()).setMinimalDistanceBetweenChildren(getDelegate(), minimalDistanceBetweenChildren);
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/NodeStyleProxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/NodeStyleProxy.java
deleted file mode 100644
index 83a7146..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/NodeStyleProxy.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/**
- *
- */
-package org.freeplane.plugin.script.proxy;
-
-import java.awt.Color;
-import java.util.Collection;
-import java.util.Set;
-
-import org.freeplane.core.resources.NamedObject;
-import org.freeplane.core.util.ColorUtils;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.nodestyle.NodeStyleController;
-import org.freeplane.features.nodestyle.NodeStyleModel;
-import org.freeplane.features.nodestyle.mindmapmode.MNodeStyleController;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.features.styles.LogicalStyleController;
-import org.freeplane.features.styles.LogicalStyleModel;
-import org.freeplane.features.styles.MapStyleModel;
-import org.freeplane.features.styles.StyleFactory;
-import org.freeplane.features.styles.StyleNamedObject;
-import org.freeplane.features.styles.mindmapmode.MLogicalStyleController;
-import org.freeplane.plugin.script.ScriptContext;
-import org.freeplane.plugin.script.proxy.Proxy.Node;
-
-class NodeStyleProxy extends AbstractProxy<NodeModel> implements Proxy.NodeStyle {
- NodeStyleProxy(final NodeModel delegate, final ScriptContext scriptContext) {
- super(delegate, scriptContext);
- }
-
- public IStyle getStyle() {
- return LogicalStyleModel.getStyle(getDelegate());
- }
-
- public String getName() {
- final IStyle style = getStyle();
- return style == null ? null : StyleNamedObject.toKeyString(style);
- }
-
- public Node getStyleNode() {
- final NodeModel styleNode = MapStyleModel.getExtension(getDelegate().getMap()).getStyleNode(getStyle());
- return new NodeProxy(styleNode, getScriptContext());
- }
-
- public Color getBackgroundColor() {
- return getStyleController().getBackgroundColor(getDelegate());
- }
-
- public String getBackgroundColorCode() {
- return ColorUtils.colorToString(getBackgroundColor());
- }
-
- public Proxy.Edge getEdge() {
- return new EdgeProxy(getDelegate(), getScriptContext());
- }
-
- public Proxy.Font getFont() {
- return new FontProxy(getDelegate(), getScriptContext());
- }
-
- public Color getTextColor() {
- return getStyleController().getColor(getDelegate());
- }
-
- @Deprecated
- public Color getNodeTextColor() {
- return getTextColor();
- }
-
- public String getTextColorCode() {
- return ColorUtils.colorToString(getTextColor());
- }
-
- public boolean isFloating() {
- return hasStyle(getDelegate(), StyleNamedObject.toKeyString(MapStyleModel.FLOATING_STYLE));
- }
-
- public int getMinNodeWidth() {
- return getStyleController().getMinWidth(getDelegate());
- }
-
- public int getMaxNodeWidth() {
- return getStyleController().getMaxWidth(getDelegate());
- }
-
- private MLogicalStyleController getLogicalStyleController() {
- return (MLogicalStyleController) LogicalStyleController.getController();
- }
-
- private MNodeStyleController getStyleController() {
- return (MNodeStyleController) NodeStyleController.getController();
- }
-
- public void setStyle(final IStyle key) {
- getLogicalStyleController().setStyle(getDelegate(), key);
- }
-
- public void setName(String styleName) {
- if (styleName == null) {
- setStyle(null);
- }
- else {
- final MapStyleModel mapStyleModel = MapStyleModel.getExtension(getDelegate().getMap());
- // actually styles is a HashSet so lookup is fast
- final Set<IStyle> styles = mapStyleModel.getStyles();
- // search for user defined styles
- final IStyle styleString = StyleFactory.create(styleName);
- if (styles.contains(styleString)) {
- setStyle(styleString);
- return;
- }
- // search for predefined styles by key
- final IStyle styleNamedObject = StyleFactory.create(new NamedObject(styleName));
- if (styles.contains(styleNamedObject)) {
- setStyle(styleNamedObject);
- return;
- }
- // search for predefined styles by their translated name (style.toString())
- for (IStyle style : styles) {
- if (style.toString().equals(styleName)) {
- setStyle(style);
- return;
- }
- }
- throw new IllegalArgumentException("style '" + styleName + "' not found");
- }
- }
-
- public void setBackgroundColor(final Color color) {
- getStyleController().setBackgroundColor(getDelegate(), color);
- }
-
- public void setBackgroundColorCode(final String rgbString) {
- setBackgroundColor(ColorUtils.stringToColor(rgbString));
- }
-
- public void setTextColor(final Color color) {
- getStyleController().setColor(getDelegate(), color);
- }
-
- @Deprecated
- public void setNodeTextColor(final Color color) {
- setTextColor(color);
- }
-
- public void setTextColorCode(final String rgbString) {
- setTextColor(ColorUtils.stringToColor(rgbString));
- }
-
- public void setFloating(boolean floating) {
- if (floating) {
- setStyle(MapStyleModel.FLOATING_STYLE);
- }
- else if (MapStyleModel.FLOATING_STYLE.equals(getStyle())) {
- setStyle(null);
- }
- }
-
- public static boolean hasStyle(NodeModel nodeModel, String styleName) {
- final Collection<IStyle> styles = LogicalStyleController.getController().getStyles(nodeModel);
- for (IStyle style : styles) {
- if (StyleNamedObject.toKeyString(style).equals(styleName))
- return true;
- }
- return false;
- }
-
- public void setMinNodeWidth(int width) {
- getStyleController().setMinNodeWidth(getDelegate(), width);
- }
-
- public void setMaxNodeWidth(int width) {
- getStyleController().setMaxNodeWidth(getDelegate(), width);
- }
-
- public boolean isNumberingEnabled() {
- return NodeStyleModel.getNodeNumbering(getDelegate());
- }
-
- public void setNumberingEnabled(boolean enabled) {
- getStyleController().setNodeNumbering(getDelegate(), enabled);
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/Proxy.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/Proxy.java
deleted file mode 100644
index 9c0aa42..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/Proxy.java
+++ /dev/null
@@ -1,1569 +0,0 @@
-package org.freeplane.plugin.script.proxy;
-
-import groovy.lang.Closure;
-
-import java.awt.Color;
-import java.io.File;
-import java.net.URI;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.swing.Icon;
-
-import org.freeplane.core.util.FreeplaneIconUtils;
-import org.freeplane.core.util.FreeplaneVersion;
-import org.freeplane.features.edge.EdgeStyle;
-import org.freeplane.features.filter.condition.ICondition;
-import org.freeplane.features.format.FormattedDate;
-import org.freeplane.features.format.FormattedNumber;
-import org.freeplane.features.format.FormattedObject;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.link.ArrowType;
-import org.freeplane.features.styles.IStyle;
-import org.freeplane.plugin.script.ExecuteScriptException;
-
-/**
- * This interface alone defines the api for accessing the internal state of the Freeplane. All read-write methods
- * and properties (with rare, documented exceptions in {@link Controller} and {@link Map}) support undo and
- * rollback on exceptions.
- * <p>
- * Every Proxy subinterface comes in two variants:
- * <ul>
- * <li>A read-only interface, like {@link NodeRO}. This collects only the methods that don't change the
- * underlying object (in case of <code>NodeRO</code> this would be <code>NodeModel</code>.
- * <li>A read-write interface, like {@link Node}. This inherits from the respective read-only interface all its
- * methods and properties and adds write access to the underlying object.
- * </ul>
- * The main point of this distinction are formulas: <em>Only the methods defined in the read-only interfaces are
- * supported in Formulas!</em>. Changing values in a Formula are against the Formula concept and lead to corruption
- * of the caching mechanism for Formulas.
- */
-public interface Proxy {
- /** Node's attribute table: <code>node.attributes</code> - read-only.
- * <p>
- * Attributes are name - value pairs assigned to a node. A node may have multiple attributes
- * with the same name.
- */
- interface AttributesRO {
- /** alias for {@link #getFirst(String)}.
- * @deprecated before 1.1 - use {@link #get(int)}, {@link #getFirst(String)} or {@link #getAll(String)} instead. */
- @Deprecated
- Object get(final String name);
-
- /** returns the <em>first</em> value of an attribute with the given name or null otherwise.
- * @since 1.2 */
- Object getFirst(final String name);
-
- /** returns all values for the attribute name. */
- List<Object> getAll(final String name);
-
- /** returns all attribute names in the proper sequence. The number of names returned
- * is equal to the number of attributes.
- * <pre>
- * // rename attribute
- * int i = 0;
- * for (String name : attributes.getNames()) {
- * if (name.equals("xy"))
- * attributes.set(i, "xyz", attributes.get(i));
- * ++i;
- * }
- * </pre> */
- List<String> getNames();
-
- /** @deprecated since 1.2 use #getNames() instead. */
- List<String> getAttributeNames();
-
- /** returns all values as a list of {@link Convertible}.
- * @since 1.2 */
- List<? extends Convertible> getValues();
-
- /** returns all attributes as a map. Note that this will erase duplicate keys.
- * <code>node.attributes = otherNode.attributes.map</code>
- * @since 1.2 */
- java.util.Map<String, Object> getMap();
-
- /** returns the attribute value at the given index.
- * @throws IndexOutOfBoundsException if index is out of range <tt>(index
- * < 0 || index >= size())</tt>.*/
- Object get(final int index);
-
- /** returns the attribute key at the given index.
- * @throws IndexOutOfBoundsException if index is out of range <tt>(index
- * < 0 || index >= size())</tt>.*/
- String getKey(final int index);
-
- /** @deprecated since 1.2 - use {@link #findFirst(String)} instead. */
- int findAttribute(final String name);
-
- /** returns the index of the first attribute with the given name if one exists or -1 otherwise.
- * For searches for <em>all</em> attributes with a given name <code>getAttributeNames()</code>
- * must be used.
- * @since 1.2*/
- int findFirst(final String name);
-
- /** returns the values of all attributes for which the closure returns true. The fact that the values are
- * returned as a list of {@link Convertible} enables conversion. The following formula sums all attributes
- * whose names are not equal to 'TOTAL':
- * <pre>
- * = attributes.findValues{key,val-> key != 'TOTAL'}.sum(0){it.num0}
- * </pre>
- * @param closure A closure that accepts two arguments (String key, Object value) and returns boolean/Boolean.
- * @since 1.2 */
- List<? extends Convertible> findValues(Closure<Boolean> closure);
-
- /** the number of attributes. It is <code>size() == getAttributeNames().size()</code>. */
- int size();
-
- /** returns <code>getAttributeNames().isEmpty()</code>.
- * @since 1.2 */
- boolean isEmpty();
- }
-
- /** Node's attribute table: <code>node.attributes</code> - read-write.
- * <p>
- * <b>Notes on attribute setters:</b><ul>
- * <li> All setter methods try to convert strings to dates, numbers or URIs.
- * <li> All setter methods apply a default formatting (for display) of the value for dates and numbers.
- * <li> Attributes don't have style properties so the value objects must know about the right formatting for
- * themselves.
- * <li> To enforce a certain formatting use format(): <pre>node['creationDate'] = format(new Date(), 'MM/yyyy')</pre>
- * </ul>
- * <p>
- * <b>Examples:</b>
- * <pre>
- * // == text
- * node["attribute name"] = "a value"
- * assert node["attribute name"] == "a value"
- * assert node.attributes.getFirst("attribute name") == "a value" // the same
- *
- * // == numbers and others
- * // converts numbers and other stuff with toString()
- * node["a number"] = 1.2
- * assert node["a number"].text == "1.2"
- * assert node["a number"].num == 1.2d
- *
- * * // == dates
- * def date = new Date()
- * node["a date"] = date
- * assert node["a date"].object.getClass().simpleName == "FormattedDate"
- * assert node["a date"].date == format(date)
- *
- * // == enforce formats on attribute values
- * node["another date"] = format(date, 'yyyy|MM|dd')
- * assert node["another date"].date == format(date, 'yyyy|MM|dd')
- *
- * // change the date while keeping the silly format
- * def index = node.attributes.findAttribute("another date")
- * node.attributes.set(index, new Date(0L))
- *
- * // == URIs
- * def uri = new URI("http://www.freeplane.org")
- * node["uri"] = uri
- * assert node["uri"].object.getClass().simpleName == "URI"
- * assert node["uri"].object == uri
- *
- * // == remove an attribute
- * node["removed attribute"] = "to be removed"
- * assert node["removed attribute"] == "to be removed"
- * node["removed attribute"] = null
- * assert node.attributes.findFirst("removed attribute") == -1
- * </pre>
- */
- interface Attributes extends AttributesRO {
- /** sets the value of the attribute at an index. This method will not create new attributes.
- * @throws IndexOutOfBoundsException if index is out of range <tt>(index
- * < 0 || index >= size())</tt>. */
- void set(final int index, final Object value);
-
- /** sets name and value of the attribute at the given index. This method will not create new attributes.
- * @throws IndexOutOfBoundsException if index is out of range <tt>(index
- * < 0 || index >= size())</tt>. */
- void set(final int index, final String name, final Object value);
-
- /** removes the <em>first</em> attribute with this name.
- * @return true on removal of an existing attribute and false otherwise.
- * @deprecated before 1.1 - use {@link #remove(int)} or {@link #removeAll(String)} instead. */
- @Deprecated
- boolean remove(final String name);
-
- /** removes <em>all</em> attributes with this name.
- * @return true on removal of an existing attribute and false otherwise. */
- boolean removeAll(final String name);
-
- /** removes the attribute at the given index.
- * @throws IndexOutOfBoundsException if index is out of range <tt>(index
- * < 0 || index >= size())</tt>. */
- void remove(final int index);
-
- /** adds an attribute if there is no attribute with the given name or changes
- * the value <em>of the first</em> attribute with the given name. */
- void set(final String name, final Object value);
-
- /** adds an attribute no matter if an attribute with the given name already exists. */
- void add(final String name, final Object value);
-
- /** removes all attributes.
- * @since 1.2 */
- void clear();
-
- /** allows application of Groovy collection methods like each(), collect(), ...
- * <pre>
- * def keyList = node.attributes.collect { it.key }
- * def values = node.attributes.collect { it.value }
- * node.attributes.each {
- * if (it.key =~ /.*day/)
- * it.value += ' days'
- * }
- * </pre>
- * @since 1.3.2 */
- Iterator<java.util.Map.Entry<String, Object>> iterator();
- }
-
- /** Here are four ways to enable a cloud on the current node and switch it off again:
- * <pre>
- * node.cloud.enabled = true
- * node.cloud.enabled = false
- *
- * node.cloud.shape = 'ROUND_RECT' // either 'ARC', 'STAR', 'RECT' or 'ROUND_RECT'
- * node.cloud.shape = null
- *
- * node.cloud.color = java.awt.Color.YELLOW
- * node.cloud.color = null
- *
- * node.cloud.colorCode = '#00FF66'
- * node.cloud.color = null
- * </pre>
- * @since 1.3 */
- interface Cloud {
- /** @since 1.3 */
- boolean getEnabled();
- /** @since 1.3 */
- void setEnabled(boolean enable);
-
- /** @return either null (if cloud is not enabled), "ARC", "STAR", "RECT" or "ROUND_RECT".
- * @since 1.3 */
- String getShape();
- /** @param shape use "ARC", "STAR", "RECT" or "ROUND_RECT". null removes the cloud
- * @since 1.3 */
- void setShape(String shape);
-
- /** @return either null (if cloud is not enabled) or the current cloud color.
- * @since 1.3 */
- Color getColor();
- /** @since 1.3 */
- void setColor(Color color);
-
- /** @return either null (if cloud is not enabled) or a HTML color spec.
- * @since 1.3 */
- String getColorCode();
- /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
- * @since 1.3 */
- void setColorCode(String rgbString);
- }
-
- /** Graphical connector between nodes:<code>node.connectorsIn</code> / <code>node.connectorsOut</code>
- * - read-only. */
- interface ConnectorRO {
- /** returns one of LINE, LINEAR_PATH, CUBIC_CURVE, EDGE_LIKE.
- * @since 1.3 */
- String getShape();
-
- Color getColor();
-
- String getColorCode();
-
- /** @since 1.2 */
- boolean hasEndArrow();
-
- /**@deprecated since 1.2 - use {@link #hasEndArrow()} instead */
- ArrowType getEndArrow();
-
- String getMiddleLabel();
-
- Node getSource();
-
- String getSourceLabel();
-
- /** @since 1.2 */
- boolean hasStartArrow();
-
- /** @deprecated since 1.2 - use {@link #hasStartArrow()} instead */
- ArrowType getStartArrow();
-
- Node getTarget();
-
- String getTargetLabel();
-
- boolean simulatesEdge();
-
- /** returns a Point.
- * @since 1.3.3 */
- List<Integer> getStartInclination();
-
- /** returns a Point.
- * @since 1.3.3 */
- List<Integer> getEndInclination();
- }
-
- /** Graphical connector between nodes:<code>node.connectorsIn</code> / <code>node.connectorsOut</code>
- * - read-write. */
- interface Connector extends ConnectorRO {
- /** @param shape one of LINE, LINEAR_PATH, CUBIC_CURVE, EDGE_LIKE.
- * @since 1.3 */
- void setShape(String shape);
-
- void setColor(Color color);
-
- /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
- * @since 1.2 */
- void setColorCode(String rgbString);
-
- /** @since 1.2 */
- void setEndArrow(boolean showArrow);
-
- /** @deprecated since 1.2 - use {@link #setEndArrow(boolean)} instead */
- void setEndArrow(ArrowType arrowType);
-
- void setMiddleLabel(String label);
-
- void setSimulatesEdge(boolean simulatesEdge);
-
- void setSourceLabel(String label);
-
- /** @since 1.2 */
- void setStartArrow(boolean showArrow);
-
- /** @deprecated since 1.2 - use {@link #setStartArrow(boolean)} instead */
- void setStartArrow(ArrowType arrowType);
-
- void setTargetLabel(String label);
-
- /** startPoint, endPoint: list of two integers representing a Point.
- * @since 1.3.3 */
- void setInclination(final List<Integer> startPoint, final List<Integer> endPoint);
- }
-
- /** Access to global state: in scripts, this is available as global variable <code>c</code> - read-only. */
- interface ControllerRO {
- /** if multiple nodes are selected returns one (arbitrarily chosen)
- * selected node or the selected node for a single node selection. */
- Node getSelected();
-
- /** A read-only list of selected nodes. That is you cannot select a node by adding it to the returned list. */
- List<Node> getSelecteds();
-
- /** returns List<Node> of Node objects sorted on Y
- *
- * @param differentSubtrees if true
- * children/grandchildren/grandgrandchildren/... nodes of selected
- * parent nodes are excluded from the result. */
- List<Node> getSortedSelection(boolean differentSubtrees);
-
- /**
- * returns Freeplane version.
- * Use it like this:
- * <pre>
- * import org.freeplane.core.util.FreeplaneVersion
- * import org.freeplane.core.ui.components.UITools
- *
- * def required = FreeplaneVersion.getVersion("1.1.2");
- * if (c.freeplaneVersion < required)
- * UITools.errorMessage("Freeplane version " + c.freeplaneVersion
- * + " not supported - update to at least " + required);
- * </pre>
- */
- FreeplaneVersion getFreeplaneVersion();
-
- /** returns the directory where user settings, logfiles, templates etc. are stored.
- * @since 1.2 */
- File getUserDirectory();
-
- /** Starting from the root node, recursively searches for nodes for which
- * <code>condition.checkNode(node)</code> returns true.
- * @see Node#find(ICondition) for searches on subtrees
- * @deprecated since 1.2 use {@link #find(Closure)} instead. */
- List<Node> find(ICondition condition);
-
- /**
- * Starting from the root node, recursively searches for nodes (in breadth-first sequence) for which
- * <code>closure.call(node)</code> returns true.
- * <p>
- * A find method that uses a Groovy closure ("block") for simple custom searches. As this closure
- * will be called with a node as an argument (to be referenced by <code>it</code>) the search can
- * evaluate every node property, like attributes, icons, node text or notes.
- * <p>
- * Examples:
- * <pre>
- * def nodesWithNotes = c.find{ it.noteText != null }
- *
- * def matchingNodes = c.find{ it.text.matches(".*\\d.*") }
- * def texts = matchingNodes.collect{ it.text }
- * print "node texts containing numbers:\n " + texts.join("\n ")
- * </pre>
- * @param closure a Groovy closure that returns a boolean value. The closure will receive
- * a NodeModel as an argument which can be tested for a match.
- * @return all nodes for which <code>closure.call(NodeModel)</code> returns true.
- * @see Node#find(Closure) for searches on subtrees
- */
- List<Node> find(Closure<Boolean> closure);
-
- /**
- * Returns all nodes of the map in breadth-first order, that is, for the following map,
- * <pre>
- * 1
- * 1.1
- * 1.1.1
- * 1.1.2
- * 1.2
- * 2
- * </pre>
- * [1, 1.1, 1.1.1, 1.1.2, 1.2, 2] is returned.
- * @see Node#find(Closure) for searches on subtrees
- * @since 1.2 */
- List<Node> findAll();
-
- /**
- * Returns all nodes of the map in depth-first order, that is, for the following map,
- * <pre>
- * 1
- * 1.1
- * 1.1.1
- * 1.1.2
- * 1.2
- * 2
- * </pre>
- * [1.1.1, 1.1.2, 1.1, 1.2, 1, 2] is returned.
- * @see Node#findAllDepthFirst() for subtrees
- * @since 1.2 */
- List<Node> findAllDepthFirst();
-
- /** returns the current zoom factor. A value of 1 means 100%.
- * @since 1.2 */
- float getZoom();
-
- /** returns false if the system 'nonInteractive' is set. This can be used in actions to not open dialogs etc.
- * @since 1.2 */
- boolean isInteractive();
-
- List<String> getExportTypeDescriptions();
-
- /** exports map to destination file, example:
- * <pre>
- * println c.getExportTypeDescriptions.join('\n')
- * boolean overwriteExistingFile = true
- * c.export(node.map, new File('/tmp/t.png'), 'Portable Network Graphic (PNG) (.png)', overwriteExistingFile)
- * </pre>
- * @param exportTypeDescription Use {@link #getExportTypeDescriptions()} to look up available exportTypes
- * @since 1.3.5 */
- void export(Map map, File destinationFile, String exportTypeDescription, boolean overwriteExisting);
- }
-
- /** Access to global state: in scripts, this is available as global variable <code>c</code> - read-write. */
- interface Controller extends ControllerRO {
- void centerOnNode(Node center);
-
- /** Starts editing node, normally in the inline editor. Does not block until edit has finished.
- * @since 1.2.2 */
- void edit(Node node);
-
- /** opens the appropriate popup text editor. Does not block until edit has finished.
- * @since 1.2.2 */
- void editInPopup(Node node);
-
- void select(Node toSelect);
-
- /** selects branchRoot and all children */
- void selectBranch(Node branchRoot);
-
- /** toSelect is a List<Node> of Node objects */
- void selectMultipleNodes(List<Node> toSelect);
-
- /** reset undo / redo lists and deactivate Undo for current script */
- void deactivateUndo();
-
- /** invokes undo once - for testing purposes mainly.
- * @since 1.2 */
- void undo();
-
- /** invokes redo once - for testing purposes mainly.
- * @since 1.2 */
- void redo();
-
- /** The main info for the status line with key="standard", use null to remove. Removes icon if there is one. */
- void setStatusInfo(String info);
-
- /** Info for status line, null to remove. Removes icon if there is one.
- * @see #setStatusInfo(String, String, String) */
- void setStatusInfo(String infoPanelKey, String info);
-
- /** Info for status line - text and icon - null stands for "remove" (text or icon)
- * @param infoPanelKey "standard" is the left most standard info panel. If a panel with
- * this name doesn't exist it will be created.
- * @param info Info text
- * @param iconKey key as those that are used for nodes (see {@link Icons#addIcon(String)}).
- * <pre>
- * println("all available icon keys: " + FreeplaneIconUtils.listStandardIconKeys())
- * c.setStatusInfo("standard", "hi there!", "button_ok");
- * </pre>
- * @see FreeplaneIconUtils
- * @since 1.2 */
- void setStatusInfo(String infoPanelKey, String info, String iconKey);
-
- /** @deprecated since 1.2 - use {@link #setStatusInfo(String, String, String)} */
- void setStatusInfo(String infoPanelKey, Icon icon);
-
- /** opens a new map with a default name in the foreground.
- * @since 1.2 */
- Map newMap();
-
- /** opens a new map for url in the foreground if it isn't opened already.
- * @since 1.2 */
- Map newMap(URL url);
-
- /** a value of 1 means 100%.
- * @since 1.2 */
- void setZoom(final float ratio);
- }
-
- /** Edge to parent node: <code>node.style.edge</code> - read-only. */
- interface EdgeRO {
- Color getColor();
-
- String getColorCode();
-
- EdgeStyle getType();
-
- int getWidth();
- }
-
- /** Edge to parent node: <code>node.style.edge</code> - read-write. */
- interface Edge extends EdgeRO {
- void setColor(Color color);
-
- /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
- * @since 1.2 */
- void setColorCode(String rgbString);
-
- void setType(EdgeStyle type);
-
- /** can be -1 for default, 0 for thin, >0 */
- void setWidth(int width);
- }
-
- /** External object: <code>node.externalObject</code> - read-only. */
- interface ExternalObjectRO {
- /** returns the object's uri if set or null otherwise.
- * @since 1.2 */
- String getUri();
-
- /** returns the current zoom level as ratio, i.e. 1.0 is returned for 100%.
- * If there is no external object 1.0 is returned. */
- float getZoom();
-
- /** @deprecated since 1.2 - use {@link #getUri()} instead. */
- String getURI();
- }
-
- /** External object: <code>node.externalObject</code> - read-write. */
- interface ExternalObject extends ExternalObjectRO {
- /** setting null uri means remove external object.
- * Starting with Freeplane 1.2.23 there is an additional setUri(Object) method that also accepts File,
- * URI and URL arguments.
- * @since 1.2 */
- void setUri(String target);
-
- /** setting null uri means remove external object. */
- void setFile(File target);
-
- /** set to 1.0 to set it to 100%. If the node has no object assigned this method does nothing. */
- void setZoom(float zoom);
-
- /** @deprecated since 1.2 - use {@link #setUri(String)} instead. */
- void setURI(String uri);
- }
-
- /** Node's font: <code>node.style.font</code> - read-only. */
- interface FontRO {
- String getName();
-
- int getSize();
-
- boolean isBold();
-
- boolean isBoldSet();
-
- boolean isItalic();
-
- boolean isItalicSet();
-
- boolean isNameSet();
-
- boolean isSizeSet();
- }
-
- /** Node's font: <code>node.style.font</code> - read-write. */
- interface Font extends FontRO {
- void resetBold();
-
- void resetItalic();
-
- void resetName();
-
- void resetSize();
-
- void setBold(boolean bold);
-
- void setItalic(boolean italic);
-
- void setName(String name);
-
- void setSize(int size);
- }
-
- /** Node's icons: <code>node.icons</code> - read-only. */
- interface IconsRO {
- /** returns the name of the icon at the given index (starting at 0) or null if <code>index >= size</code>.
- * Use it like this: <pre>
- * def secondIconName = node.icons[1]
- * </pre>
- * @since 1.2 */
- String getAt(int index);
-
- /** returns the name of the first icon if the node has an icon assigned or null otherwise. Equivalent: <code>node.icons[0]</code>.
- * @since 1.2 */
- String getFirst();
-
- /** returns true if the node has an icon of this name.
- * @since 1.2 */
- boolean contains(String name);
-
- /** returns the number of icons the node has.
- * @since 1.2 */
- int size();
-
- /** returns a read-only list of the names of the icons the node has. Think twice before you use this method
- * since it leads to ugly code, e.g. use <code>node.icons.first</code> or <code>node.icons[0]</code> instead of
- * <code>node.icons.icons[0]</code>. Perhaps you could also use iteration over icons, see. */
- List<String> getIcons();
-
- /** returns a list of the urls of the icons the node has. */
- List<URL> getUrls();
-
- /** allows application of Groovy collection methods like each(), collect(), ...
- * <pre>
- * def freeIcons = node.icons.findAll { it.startsWith('free') }
- * </pre>
- * @since 1.3.2 */
- Iterator<String> iterator();
- }
-
- /** Node's icons: <code>node.icons</code> - read-write. */
- interface Icons extends IconsRO {
- /**
- * adds an icon to a node if an icon for the given key can be found. The same icon can be added multiple
- * times.
- * <pre>
- * println("all available icon keys: " + FreeplaneIconUtils.listStandardIconKeys())
- * node.icons.addIcon("button_ok")
- * </pre>
- * @see FreeplaneIconUtils */
- void add(String name);
-
- /** @deprecated since 1.2 - use {@link #add(String)} instead. */
- void addIcon(String name);
-
- /** deletes the icon at the given index, returns true if success (icon existed). */
- boolean remove(int index);
-
- /** deletes first occurence of icon with the given name, returns true if success (icon existed). */
- boolean remove(String name);
-
- /** @deprecated since 1.2 - use {@link #remove(String)} instead. */
- boolean removeIcon(String name);
-
- /** removes all icons.
- * @since 1.2 */
- void clear();
- }
-
- /** Node's link: <code>node.link</code> - read-only.
- * <p>
- * None of the getters will throw an exception, even if you call, e.g. getNode() on a File link.
- * Instead they will return null. To check the link type evaluate getUri().getScheme() or the result
- * of the special getters.*/
- interface LinkRO {
- /** returns the link text, a stringified URI, if a link is defined and null otherwise.
- * @since 1.2 */
- String getText();
-
- /** returns the link as URI if defined and null otherwise. Won't throw an exception.
- * @since 1.2 */
- URI getUri();
-
- /** returns the link as File if defined and if the link target is a valid File URI and null otherwise.
- * @see File#File(URI).
- * @since 1.2 */
- File getFile();
-
- /** returns the link as Node if defined and if the link target is a valid local link to a node and null otherwise.
- * @since 1.2 */
- Node getNode();
-
- /** @deprecated since 1.2 - use {@link #getText()} instead. */
- String get();
- }
-
- /** Node's link: <code>node.link</code> - read-write. */
- interface Link extends LinkRO {
- /** target is a stringified URI. Removes any link if uri is null.
- * To get a local link (i.e. to another node) target should be: "#" + nodeId or better use setNode(Node).
- * @throws IllegalArgumentException if target is not convertible into a {@link URI}.
- * @since 1.2 */
- void setText(String target);
-
- /** sets target to uri. Removes any link if uri is null.
- * @since 1.2 */
- void setUri(URI uri);
-
- /** sets target to file. Removes any link if file is null.
- * @since 1.2 */
- void setFile(File file);
-
- /** target is a node of the same map. Shortcut for setTarget("#" + node.nodeId)
- * Removes any link if node is null.
- * @throws IllegalArgumentException if node belongs to another map.
- * @since 1.2 */
- void setNode(Node node);
-
- /** @deprecated since 1.2 - use {@link #setText(String)} instead.
- * @return true if target could be converted to an URI and false otherwise. */
- boolean set(String target);
- }
-
- /** The map a node belongs to: <code>node.map</code> - read-only. */
- interface MapRO {
- /** @since 1.2 */
- Node getRoot();
-
- /** @deprecated since 1.2 - use {@link #getRoot()} instead. */
- Node getRootNode();
-
- /** get node by id.
- * @return the node if the map contains it or null otherwise. */
- Node node(String id);
-
- /** returns the filenname of the map as a java.io.File object if available or null otherwise. */
- File getFile();
-
- /** returns the title of the MapView.
- * @since 1.2 */
- String getName();
-
- /** @since 1.2 */
- boolean isSaved();
-
- /** @since 1.2 */
- Color getBackgroundColor();
-
- /** returns HTML color spec like #ff0000 (red) or #222222 (darkgray).
- * @since 1.2 */
- String getBackgroundColorCode();
- }
-
- /** The map a node belongs to: <code>node.map</code> - read-write. */
- interface Map extends MapRO {
- /**
- * closes a map. Note that there is <em>no undo</em> for this method!
- * @param force close map even if there are unsaved changes.
- * @param allowInteraction if (allowInteraction && ! force) a saveAs dialog will be opened if there are
- * unsaved changes.
- * @return false if the saveAs was cancelled by the user and true otherwise.
- * @throws RuntimeException if the map contains changes and parameter force is false.
- * @since 1.2
- */
- boolean close(boolean force, boolean allowInteraction);
-
- /**
- * saves the map to disk. Note that there is <em>no undo</em> for this method.
- * @param allowInteraction if a saveAs dialog should be opened if the map has no assigned URL so far.
- * @return false if the saveAs was cancelled by the user and true otherwise.
- * @throws RuntimeException if the map has no assigned URL and parameter allowInteraction is false.
- * @since 1.2
- */
- boolean save(boolean allowInteraction);
-
- /** @since 1.2 */
- void setSaved(boolean isSaved);
-
- /** Sets the map (frame/tab) title. Note that there is <em>no undo</em> for this method!
- * @since 1.2 */
- void setName(String title);
-
- /** @since 1.2 */
- void setBackgroundColor(Color color);
-
- /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
- * @since 1.2 */
- void setBackgroundColorCode(String rgbString);
-
- /** install a Groovy closure as the current filter in this map. If <code>closure</code> is null then filtering will
- * be disabled. The filter state of a node can be checked by {@link Node#isVisible()}. <br>
- * To undo filtering use <em>Tools -> Undo</em>. After execution of the following you have to use it seven times to
- * return to the initial filter state.
- * <pre>
- * // show only matching nodes
- * node.map.filter{ it.text.contains("todo") }
- * // equivalent:
- * node.map.filter = { it.text.contains("todo") }
- *
- * // show ancestors of matching nodes
- * node.map.filter(true, false){ it.text.contains("todo") }
- * // equivalent:
- * node.map.setFilter(true, false, { it.text.contains("todo") })
- *
- * // show descendants of matching nodes
- * node.map.filter(false, true){ it.text.contains("todo") }
- * // equivalent:
- * node.map.setFilter(false, true, { it.text.contains("todo") })
- *
- * // remove filter
- * node.map.filter = null
- * </pre>
- * @since 1.2 */
- public void filter(final Closure<Boolean> closure);
-
- /** alias for {@link #filter(Closure)}. Enables assignment to the <code>filter</code> property.
- * @since 1.2 */
- public void setFilter(final Closure<Boolean> closure);
-
- /** With {@link #filter(Closure)} neither ancestors not descendants of the visible nodes are shown. Use this
- * method to control these options.
- * @see #filter(Closure)
- * @since 1.2 */
- public void filter(final boolean showAncestors, final boolean showDescendants, final Closure<Boolean> closure);
-
- /** alias for {@link #setFilter(boolean, boolean, Closure)}
- * @see #filter(Closure)
- * @since 1.2 */
- public void setFilter(final boolean showAncestors, final boolean showDescendants, final Closure<Boolean> closure);
-
- /** reinstalls the previously undone filter if there is any.
- * Note: undo/redo for filters is separate to the undo/redo for other map state.
- * @since 1.2 */
- public void redoFilter();
-
- /** removes the current filter and reinstalls the previous filter if there is any.
- * Note: undo/redo for filters is separate to the undo/redo for other map state.
- * @since 1.2 */
- public void undoFilter();
-
- /** returns an accessor to the map specific storage. The value is never null
- * @since 1.3.6 */
- public Proxy.Properties getStorage();
- }
-
- /** The currently selected node: <code>node</code> - read-only. */
- interface NodeRO {
- Attributes getAttributes();
-
- /** allows to access attribute values like array elements. Note that the returned type is a
- * {@link Convertible}, not a String. Nevertheless it behaves like a String in almost all respects,
- * that is, in Groovy scripts it understands all String methods like lenght(), matches() etc.
- * <pre>
- * // standard way
- * node.attributes.set("attribute name", "12")
- * // implicitely use getAt()
- * def val = node["attribute name"]
- * // use all conversions that Convertible provides (num, date, string, ...)
- * assert val.num == new Long(12)
- * // or use it just like a string
- * assert val.startsWith("1")
- * // check for availability of an attribute this way:
- * if (node["unknown attribute"])
- * // surprise: the node has an attribute with key "unknown attribute"
- * </pre>
- * @throws ExecuteScriptException
- * @since 1.2
- */
- Convertible getAt(String attributeName);
-
- /**
- * @since 1.2
- */
- Cloud getCloud();
-
- /** returns the index (0..) of this node in the (by Y coordinate sorted)
- * list of this node's children. Returns -1 if childNode is not a child
- * of this node. */
- int getChildPosition(Node childNode);
-
- /** returns the children of this node ordered by Y coordinate. */
- List<Node> getChildren();
-
- Collection<Connector> getConnectorsIn();
-
- Collection<Connector> getConnectorsOut();
-
- /** returns the raw HTML text of the details if there is any or null otherwise.
- * @since 1.2 */
- String getDetailsText();
-
- /** returns the text of the details as a Convertible like {@link #getNote()} for notes:
- * <ul>
- * <li>node.details.to.plain plain text of the node, possibly after formula evaluation
- * <li>node.details.plain the same.
- * <li>node.details.string the same.
- * <li>node.details.html the raw html text. No formula evaluation is applied.
- * <li>node.details.text the same.
- * </ul>
- * @since 1.2 */
- Convertible getDetails();
-
- /** returns true if node details are hidden.
- * @since 1.2 */
- boolean getHideDetails();
-
- ExternalObject getExternalObject();
-
- Icons getIcons();
-
- Link getLink();
-
- /** use it to create and inspect {@link Reminder}s. This property is never null. */
- Reminder getReminder();
-
- /** the map this node belongs to. */
- Map getMap();
-
- /** @deprecated since 1.2 - use Node.getId() instead. */
- String getNodeID();
-
- /** @since 1.2 */
- String getId();
-
- /** if countHidden is false then only nodes that are matched by the
- * current filter are counted. */
- int getNodeLevel(boolean countHidden);
-
- /** returns the text of the details as a Convertible. Convertibles behave like Strings in most respects.
- * Additionally String methods are overridden to handle Convertible arguments as if the argument were the
- * result of Convertible.getText().
- * <ul>
- * <li>node.note.to.plain plain text of the node, possibly after formula evaluation
- * <li>node.note.plain the same.
- * <li>node.note.text the same.
- * <li>node.note.html the raw html text. No formula evaluation is applied.
- * <li>node.note.string the same.
- * </ul>
- * @return Convertible getString(), getText() and toString() will return plain text instead of the HTML.
- * Use {@link #getNoteText()} to get the HTML text.
- * @throws ExecuteScriptException
- * @since 1.2
- */
- Convertible getNote();
-
- /** Returns the HTML text of the node. (Notes always contain HTML text.)
- * @throws ExecuteScriptException */
- String getNoteText();
-
- /** @since 1.2 */
- Node getParent();
-
- /** @deprecated since 1.2 - use {@link #getParent()} instead. */
- Node getParentNode();
-
- /** a list of all nodes starting from this node upto (and including) the root node.
- * <pre>
- * def path = pathToRoot.collect{ it.plainText }.join('.')
- * </pre>
- * @since 1.3.3 */
- List<Node> getPathToRoot();
-
- /** returns the next node with respect to this node in breadth-first order.
- * Returns null if this node is the only one in the map. */
- Node getNext();
-
- /** returns the previous node with respect to this node in breadth-first order.
- * Returns null if this node is the only one in the map. */
- Node getPrevious();
-
- /** The style attributes of a node can either be changed by assigning a named style like this:
- * <pre>node.style.name = 'style.ok'</pre>
- * or by changing attributes for this node individually like this:
- * <pre>node.style.textColorCode = '#FF0000'</pre>
- * Conditional styles of a node can only be investigated by {@link Node#hasStyle(String)}. Here a script that
- * creates an index of all nodes having the style 'todo':
- * <pre>
- * def todos = node.map.root.createChild('To Do')
- * c.find{ it.hasStyle('todo') }.each {
- * def child = todos.createChild(it.text)
- * child.link.node = it
- * }
- * </pre> */
- NodeStyle getStyle();
-
- /** returns true if the node has the style of this name - either manually set or as a conditional style or it is
- * "default" which all nodes have. The following statement will always be true:
- * @since 1.2 */
- boolean hasStyle(String styleName);
-
- /** use this method to remove all tags from an HTML node. Formulas are not evaluated.
- * @since 1.2 */
- String getPlainText();
-
- /** use this method to remove all tags from an HTML node.
- * @deprecated since 1.2 - use getPlainText() or getTo().getPlain() instead. */
- String getPlainTextContent();
-
- /** The visible text of this node. Use {@link #getPlainText()} to remove HTML.
- * @since 1.2 */
- String getDisplayedText();
- String getTransformedText();
-
- String getShortText();
-
- /** The html text of this node. Use {@link #getPlainText()} to remove HTML.
- * @since 1.2 */
- String getText();
- /** The object that's displayed as the node text - normally the raw text of this node (then this method is
- * equivalent to {@link #getText()}).
- * But in case of typed content (for numbers, dates and calendars) {@link #getObject()} returns
- * a proper {@link IFormattedObject}. Use {@link #getPlainText()} to remove HTML.
- * @since 1.2 */
- Object getObject();
-
- /** returns the format string of the formatter if available and null otherwise.
- * @since 1.2 */
- String getFormat();
-
- /**
- * returns an object that performs conversions (method name is choosen to give descriptive code):
- * <dl>
- * <dt>node.to.num <dd>Long or Double, see {@link Convertible#getDate()}.
- * <dt>node.to.date <dd>Date, see {@link Convertible#getDate()}.
- * <dt>node.to.string <dd>Text, see {@link Convertible#getString()}.
- * <dt>node.to.text <dd>an alias for getString(), see {@link Convertible#getText()}.
- * <dt>node.to.object <dd>returns what fits best, see {@link Convertible#getObject()}.
- * </dl>
- * @return ConvertibleObject
- * @throws ExecuteScriptException on formula evaluation errors
- * @throws ConversionException on parse errors, e.g. if to.date is invoked on "0.25"
- * @since 1.2
- */
- Convertible getTo();
-
- /** an alias for {@link #getTo()}.
- * @throws ExecuteScriptException on formula evaluation errors
- * @since 1.2 */
- Convertible getValue();
-
- /** Returns a <a href="http://www.freesoft.org/CIE/RFC/1521/7.htm">BASE64</a> encoded node text
- * (see {@link Node#setBinary(byte[])}) as a binary object. Errors are signaled by a null return value.
- * Whitespace characters are ignored.<br>
- * Note that this method is not able to catch all encoding errors!
- * @since 1.2 */
- byte[] getBinary();
-
- /** returns true if p is a parent, or grandparent, ... of this node, or if it <em>is equal<em>
- * to this node; returns false otherwise. */
- boolean isDescendantOf(Node p);
-
- boolean isFolded();
-
- /** returns true if this node is freely positionable.
- * @since 1.2 */
- public boolean isFree();
-
- boolean isLeaf();
-
- boolean isLeft();
-
- boolean isRoot();
-
- boolean isVisible();
-
- boolean isMinimized();
-
- /** Starting from this node, recursively searches for nodes for which
- * <code>condition.checkNode(node)</code> returns true.
- * @deprecated since 1.2 use {@link #find(Closure)} instead. */
- List<Node> find(ICondition condition);
-
- /** Starting from this node, recursively searches for nodes for which <code>closure.call(node)</code>
- * returns true. See {@link Controller#find(Closure)} for details. */
- List<Node> find(Closure<Boolean> closure);
-
- /** Returns all nodes of the branch that starts with this node in breadth-first order.
- * @see Controller#findAll() for subtrees
- * @since 1.2 */
- List<Node> findAll();
-
- /** Returns all nodes of the branch that starts with this node in depth-first order.
- * @see Controller#findAllDepthFirst() for subtrees.
- * @since 1.2 */
- List<Node> findAllDepthFirst();
-
- Date getLastModifiedAt();
-
- Date getCreatedAt();
-
- /**@since 1.3.7 */
- int getHorizontalShift();
-
- /**@since 1.3.7 */
- int getVerticalShift();
-
- /**@since 1.3.7 */
- int getMinimalDistanceBetweenChildren();
-
- }
-
- /** The currently selected node: <code>node</code> - read-write. */
- interface Node extends NodeRO {
- /** adds a new Connector to the given target node and returns the new
- * connector for optional further editing (style); also enlists the
- * Connector on the target Node object. */
- Connector addConnectorTo(Node target);
-
- /** as above, using String targetNodeId instead of Node object to establish the connector. */
- Connector addConnectorTo(String targetNodeId);
-
- /** inserts *new* node as child, takes care of all construction work and
- * internal stuff inserts as last child. */
- Node createChild();
-
- /** like {@link #createChild()} but sets the node text to the given text.
- * <pre>
- * // instead of
- * def child = node.createChild(); child.setObject(value);
- * // use
- * def child = node.createChild(value);
- * </pre>
- * @since 1.2 */
- Node createChild(Object value);
-
- /** inserts *new* node as child, takes care of all construction work and
- * internal stuff */
- Node createChild(int position);
-
- /** inserts a copy of node as a new child.
- * @since 1.2 */
- Node appendChild(NodeRO node);
-
- /** inserts a copy of the branch starting with node as a new child branch.
- * @since 1.2 */
- Node appendBranch(NodeRO node);
-
- void delete();
-
- void moveTo(Node parentNode);
-
- void moveTo(Node parentNode, int position);
-
- /** removes the given connector on both sides. */
- void removeConnector(Connector connectorToBeRemoved);
-
- /**
- * A node's text is String valued. This methods provides automatic conversion to String in the same way as
- * for {@link #setText(Object)}, that is special conversion is provided for dates and calendars, other
- * types are converted via value.toString().
- *
- * If the conversion result is not valid HTML it will be automatically converted to HTML.
- *
- * @param details An object for conversion to String. Use null to unset the details. Works well for all types
- * that {@link Convertible} handles, particularly {@link Convertible}s itself.
- * @since 1.2
- */
- void setDetails(Object details);
-
- /** Sets the raw (HTML) note text. */
- void setDetailsText(String html);
-
- /** use node.hideDetails = true/false to control visibility of details.
- * @since 1.2 */
- void setHideDetails(boolean hide);
-
- void setFolded(boolean folded);
-
- /** set to true if this node should be freely positionable:
- * <pre>
- * node.free = true
- * node.style.floating = true
- * </pre>
- * @since 1.2 */
- void setFree(boolean free);
-
- void setMinimized(boolean shortened);
-
- /**
- * Set the note text:
- * <ul>
- * <li>This methods provides automatic conversion to String in a way that node.getNote().getXyz()
- * methods will be able to convert the string properly to the wanted type.
- * <li>Special conversion is provided for dates and calendars: They will be converted in a way that
- * node.note.date and node.note.calendar will work. All other types are converted via value.toString().
- * <li>If the conversion result is not valid HTML it will be automatically converted to HTML.
- * </ul>
- * <p>
- * <pre>
- * // converts numbers and other stuff with toString()
- * node.note = 1.2
- * assert node.note.text == "<html><body><p>1.2"
- * assert node.note.plain == "1.2"
- * assert node.note.num == 1.2d
- * // == dates
- * // a date in some non-UTC time zone
- * def date = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSZ").
- * parse("1970-01-01 00:00:00.000-0200")
- * // converts to "1970-01-01T02:00:00.000+0000" (GMT)
- * // - note the shift due to the different time zone
- * // - the missing end tags don't matter for rendering
- * node.note = date
- * assert node.note == "<html><body><p>1970-01-01T02:00:00.000+0000"
- * assert node.note.plain == "1970-01-01T02:00:00.000+0000"
- * assert node.note.date == date
- * // == remove note
- * node.note = null
- * assert node.note.text == null
- * </pre>
- * @param value An object for conversion to String. Works well for all types that {@link Convertible}
- * handles, particularly {@link Convertible}s itself.
- * @since 1.2 (note that the old setNoteText() did not support non-String arguments.
- */
- void setNote(Object value);
-
- /** Sets the raw (HTML) note text. */
- void setNoteText(String html);
-
- /** If <code>value</code> is a String the node object is set to it verbatim. For all other argument types it's
- * an alias for {@link #setObject(Object)}.
- * <pre>
- * node.text = '006'
- * assert node.object.class.simpleName == "String"
- * node.object = '006'
- * assert node.text == '6'
- * assert node.object.class.simpleName == "Long"
- * </pre>
- * @see #setObject(Object)
- * @since 1.2, semantics changed for Strings with 1.2.17, see Mantis #1787 */
- void setText(Object value);
-
- /**
- * A node's text object is normally String valued but it can be of any type since every Object can be converted
- * to String for display. This methods provides automatic conversion to String in a way that node.to.getXyz()
- * methods will be able to convert the string properly to the wanted type.
- * <p>
- * Special support is provided for numbers, dates and calendars that are stored unconverted. For display of
- * them a standard formatter is used (use #setFormat() to change it). You may also pass {@link IFormattedObject}
- * instances ({@link FormattedDate}, {@link FormattedNumber} or {@link FormattedObject}) directly to determine
- * the format in one pass.
- * <p>
- * All other types are converted via value.toString().
- * <p><b>Numbers</b>
- * <pre>
- * double number = 1.2222222d
- * node.object = number
- * // to enable math with node.object its type is not FormattedNumber
- * assert node.object.class.simpleName == "Double"
- * assert node.to.object.class.simpleName == "Double"
- * // use globally bound TextUtils object
- * def defaultNumberFormat = textUtils.defaultNumberFormat
- * assert node.format != null
- * // e.g. "1.22"
- * assert node.text == defaultNumberFormat.format(number)
- * assert node.to.num == number
- * assert node.to.num + 1.0 == number + 1.0
- * assert node.object + 1.0 == number + 1.0
- * </pre>
- * <p><b>Dates</b>
- * <pre>
- * def date = new Date(0) // when Unix time began
- * node.object = date
- * assert node.object.class.simpleName == "FormattedDate"
- * assert node.to.object.class.simpleName == "FormattedDate"
- * // use globally bound TextUtils object
- * def defaultDateFormat = textUtils.defaultDateFormat
- * assert node.object.toString() == defaultDateFormat.format(date)
- * assert node.format == defaultDateFormat.pattern
- * // e.g. "01/01/1970"
- * assert node.text == defaultDateFormat.format(date)
- * assert node.to.date == date
- * </pre>
- * <p><b>Date/Time</b>
- * <pre>
- * def date = new Date(0) // when Unix time began
- * // the default format for dates does not contain a time component. Use node.dateTime to override it.
- * node.dateTime = date
- * assert node.object.class.simpleName == "FormattedDate"
- * assert node.to.object.class.simpleName == "FormattedDate"
- * // use globally bound TextUtils object
- * def defaultDateFormat = textUtils.defaultDateTimeFormat
- * assert node.object.toString() == defaultDateFormat.format(date)
- * assert node.format == defaultDateFormat.pattern
- * // e.g. "01/01/1970 01:00"
- * assert node.text == defaultDateFormat.format(date)
- * assert node.to.date == date
- * </pre>
- * @param value A not-null object.
- * @since 1.2 */
- void setObject(Object value);
-
- /** sets the node text to a default formatted datetime object. (After setObject(Date) no time component is
- * displayed so use this method if you want the time to be displayed.)
- * @see #setObject(Object)
- * @since 1.2 */
- void setDateTime(Date date);
-
- /** Converts data to a <a href="http://www.freesoft.org/CIE/RFC/1521/7.htm">BASE64</a> encoded string and
- * sets it as this node's text. Long lines are folded to a length a bit less than 80.
- * @since 1.2 */
- void setBinary(byte[] data);
-
- /** sets the format string of the formatter. It has to be appropriate for the data type of the contained object,
- * otherwise the format is simply ignored. For instance use "dd.MM.yyyy" for dates but not for numbers:
- * <pre>
- * node.object = new Date()
- * node.format = "dd.MMM.yyyy" // ok: "13.07.2011"
- * node.format = "#.00" // still "13.07.2011". See log: "cannot format 13.07.2011 with #.00: multiple points"
- * </pre>
- * Numbers:
- * <pre>
- * node.object = 1.122
- * node.format = "#.##" // ok: "1.12" (US, GB, ...) or "1,12" (Germany, ...)
- * node.format = "#.0000" // ok: "1.1220" (US, GB, ...) or "1,1220" (Germany, ...)
- * </pre>
- * @see #setObject(Object)
- * @since 1.2 */
- void setFormat(String format);
-
- void setLastModifiedAt(Date date);
-
- void setCreatedAt(Date date);
-
- // Attributes
- /**
- * Allows to set and to change attribute like array (or map) elements.
- * See description of {@link Attributes} for details.
- * @param value An object for conversion to String. Works well for all types that {@link Convertible}
- * handles, particularly {@link Convertible}s itself. Use null to unset an attribute.
- * @return the new value
- */
- Object putAt(String attributeName, Object value);
-
- /** allows to set all attributes at once:
- * <pre>
- * node.attributes = [:] // clear the attributes
- * assert node.attributes.size() == 0
- * node.attributes = ["1st" : "a value", "2nd" : "another value"] // create 2 attributes
- * assert node.attributes.size() == 2
- * node.attributes = ["one attrib" : new Double(1.22)] // replace all attributes
- * assert node.attributes.size() == 1
- * assert node.attributes.getFirst("one attrib") == "1.22" // note the type conversion
- * assert node["one attrib"] == "1.22" // here we compare Convertible with String
- * </pre>
- */
- void setAttributes(java.util.Map<String, Object> attributes);
-
- void setLeft(boolean isLeft);
-
- /** Returns true if the node is password protected, no matter if currently accessible (password entered) or not.
- * @since 1.3.6 */
- boolean hasEncryption();
-
- /** decrypts a node and remove the password protection.
- * @since 1.3.6 */
- void removeEncryption(String password);
-
- /** Returns true if the node has password protection and is currently unaccessible (password has to be entered).
- * @since 1.3.6 */
- boolean isEncrypted();
-
- /** encrypts a node. If the node has child nodes the branch is folded.
- * @since 1.3.6 */
- void encrypt(String password);
-
- /** decrypts a node without removing the encryption.
- * @since 1.3.6 */
- void decrypt(String password);
-
- /**@since 1.3.7 */
- void setHorizontalShift(final int horizontalShift);
-
- /**@since 1.3.7 */
- void setVerticalShift(final int verticalShift);
-
- /**@since 1.3.7 */
- void setMinimalDistanceBetweenChildren(final int minimalDistanceBetweenChildren);
- }
-
- /** Node's style: <code>node.style</code> - read-only. */
- interface NodeStyleRO {
- IStyle getStyle();
-
- /** Returns the name of the node's style if set or null otherwise. For styles with translated names the
- * translation key is returned to make the process robust against language setting changes.
- * It's guaranteed that <code>node.style.name = node.style.name</code> does not change the style.
- * @since 1.2.2 */
- String getName();
-
- Node getStyleNode();
-
- Color getBackgroundColor();
-
- /** returns HTML color spec like #ff0000 (red) or #222222 (darkgray).
- * @since 1.2 */
- String getBackgroundColorCode();
-
- Edge getEdge();
-
- Font getFont();
-
- /** @deprecated since 1.2 - use {@link #getTextColor()} instead. */
- Color getNodeTextColor();
-
- /** @since 1.2 */
- Color getTextColor();
-
- String getTextColorCode();
-
- /** @since 1.2 true if the floating style is set for the node (aka "free node"). */
- boolean isFloating();
-
- /** @since 1.2.20 */
- int getMinNodeWidth();
-
- /** @since 1.2.20 */
- int getMaxNodeWidth();
-
- /** @since 1.3.8 */
- boolean isNumberingEnabled();
- }
-
- /** Node's style: <code>node.style</code> - read-write. */
- interface NodeStyle extends NodeStyleRO {
- void setStyle(IStyle style);
-
- /** Selects a style by name, see menu Styles -> Pre/Userdefined styles for valid style names or use
- * {@link #getName()} to display the name of a node's style.
- * It's guaranteed that <code>node.style.name = node.style.name</code> does not change the style.
- * @param styleName can be the name visible in the style menu or its translation key as returned by
- * {@link #getName()}. (Names of predefined styles are subject to translation.)
- * Only translation keys will continue to work if the language setting is changed.
- * @throws IllegalArgumentException if the style does not exist.
- * @since 1.2.2 */
- void setName(String styleName);
-
- void setBackgroundColor(Color color);
-
- /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
- * @since 1.2 */
- void setBackgroundColorCode(String rgbString);
-
- /** @deprecated since 1.2 - use {@link #setTextColor(Color)} instead. */
- void setNodeTextColor(Color color);
-
- /** @since 1.2 */
- void setTextColor(Color color);
-
- /** @param rgbString a HTML color spec like #ff0000 (red) or #222222 (darkgray).
- * @since 1.2 */
- void setTextColorCode(String rgbString);
-
- /** sets the floating style for the node (aka "free node"). Should normally only be applied to direct
- * children of the root node.
- * @since 1.2 */
- void setFloating(boolean floating);
-
- /** @since 1.2.20 */
- void setMinNodeWidth(int width);
-
- /** @since 1.2.20 */
- void setMaxNodeWidth(int width);
-
- /** @since 1.3.8 */
- void setNumberingEnabled(boolean enabled);
- }
-
- public interface Properties {
- /** Provides map-like access to properties. Note that the returned type is a
- * {@link Convertible}, not a String as in the basic storage. Nevertheless it behaves like a String in almost
- * all respects, that is, in Groovy scripts it understands all String methods like lenght(), matches() etc.
- * <br>
- * Note that unlike Attributes.getAt() this method will return <em>null</em> if the property is not set!
- * @since 1.3.6 */
- Convertible getAt(String key);
-
- /**
- * Allows to set and to change properties.
- * @param value An object for conversion to String. Works well for all types that {@link Convertible}
- * handles, particularly {@link Convertible}s itself. Use null to unset an attribute.
- * @return the new value
- * @since 1.3.6 */
- Convertible putAt(String key, Object value);
-
- /** returns the names of all attributes.
- * @since 1.3.6 */
- java.util.Set<String> keySet();
- }
-
- /** Reminder: <code>node.reminder</code> - read-only.
- * <pre>
- * def rem = node.reminder
- * if (!rem.remindAt)
- * c.statusInfo = "this node has no reminder"
- * else
- * c.statusInfo = "reminder fires at ${rem.remindAt} and then every ${rem.period} ${rem.periodUnit}"
- * </pre> */
- interface ReminderRO {
- /** The timestamp when the reminder fires first. */
- Date getRemindAt();
- /** One of ["MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "YEAR"]. */
- String getPeriodUnit();
- /** Count in units of "PeriodUnit". (period=2, periodUnit="WEEK") reminds every two weeks. */
- Integer getPeriod();
- /** optional: a Groovy script to execute when the reminder fires. */
- String getScript();
- }
-
- /** Reminder: <code>node.reminder</code> - read-write. For creating and modifying reminders:
- * <pre>
- * def reminder = node.reminder
- * if (!reminder)
- * c.statusInfo = "node has no reminder"
- * else
- * c.statusInfo = "node has a reminder: $reminder"
- *
- * def inAMinute = new Date(System.currentTimeMillis() + 60*1000)
- * node.reminder.createOrReplace(inAMinute, "WEEK", 2)
- * if (node.map.file) {
- * node.reminder.setScript("loadUri(new URI('${node.map.file.toURI()}#${node.id}'))")
- * }
- * // a click on the node opens time management dialog
- * node.link.text = 'menuitem:_$TimeListAction$0'
- * </pre> */
- interface Reminder extends ReminderRO {
-// /** Creates a new reminder. Removes existing reminders for the same node if they exist.
-// * @param remindAt The timestamp when the reminder should fire. */
-// void createOrReplace(Date remindAt);
- /** Creates a periodic reminder. To make the reminder fire every second week:
- * <pre>
- * node.reminder.createOrReplace(new Date() + 1, "WEEK", 2)
- * </pre>
- * @param remindAt The timestamp when the reminder fires first.
- * @param periodUnit one of ["MINUTE", "HOUR", "DAY", "WEEK", "MONTH", "YEAR"].
- * @param period counts the periodUnits.
- * @throws Exception if there is no reminder yet. */
- void createOrReplace(Date remindAt, String periodUnit, Integer period);
-
- /** optional: a Groovy script to execute when the reminder fires.
- * @param scriptSource the script itself, not a path to a file.
- * @throws NullPointerException if there is no reminder yet. */
- void setScript(String scriptSource);
-
- /** removes a reminder from a node. It's not an error if there is no reminder to remove. */
- void remove();
- }
-}
diff --git a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ProxyUtils.java b/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ProxyUtils.java
deleted file mode 100644
index 6af0ef5..0000000
--- a/freeplane_plugin_script/src/org/freeplane/plugin/script/proxy/ProxyUtils.java
+++ /dev/null
@@ -1,240 +0,0 @@
-package org.freeplane.plugin.script.proxy;
-
-import groovy.lang.Closure;
-
-import java.net.URI;
-import java.util.AbstractList;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.ConcurrentModificationException;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-import org.freeplane.features.filter.condition.ICondition;
-import org.freeplane.features.format.FormatController;
-import org.freeplane.features.format.FormattedDate;
-import org.freeplane.features.format.FormattedNumber;
-import org.freeplane.features.format.IFormattedObject;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.text.TextController;
-import org.freeplane.features.text.mindmapmode.MTextController;
-import org.freeplane.plugin.script.ScriptContext;
-import org.freeplane.plugin.script.proxy.Proxy.Node;
-
-public class ProxyUtils {
- static List<Node> createNodeList(final List<NodeModel> list, final ScriptContext scriptContext) {
- return new AbstractList<Node>() {
- final private List<NodeModel> nodeModels = list;
-
- @Override
- public Node get(final int index) {
- final NodeModel nodeModel = nodeModels.get(index);
- return new NodeProxy(nodeModel, scriptContext);
- }
-
- @Override
- public int size() {
- return nodeModels.size();
- }
- };
- }
-
- static List<Node> find(final ICondition condition, final NodeModel node, final ScriptContext scriptContext) {
- return ProxyUtils.createNodeList(ProxyUtils.findImpl(condition, node, true), scriptContext);
- }
-
- static List<Node> findAll(final NodeModel node, final ScriptContext scriptContext, boolean breadthFirst) {
- return ProxyUtils.createNodeList(ProxyUtils.findImpl(null, node, breadthFirst), scriptContext);
- }
-
- static List<Node> find(final Closure<Boolean> closure, final NodeModel node, final ScriptContext scriptContext) {
- return ProxyUtils.find(createCondition(closure, scriptContext), node, scriptContext);
- }
-
- static ICondition createCondition(final Closure<Boolean> closure, final ScriptContext scriptContext) {
- final ICondition condition = new ICondition() {
- public boolean checkNode(final NodeModel node) {
- try {
- final Boolean result = closure
- .call(new Object[] { new NodeProxy(node, scriptContext) });
- if (result == null) {
- throw new RuntimeException("find(): closure returned null instead of boolean/Boolean");
- }
- return result;
- }
- catch (final ClassCastException e) {
- throw new RuntimeException("find(): closure returned " + e.getMessage()
- + " instead of boolean/Boolean");
- }
- }
- };
- return condition;
- }
-
- /** finds from any node downwards.
- * @param condition if null every node will match. */
- @SuppressWarnings("unchecked")
- private static List<NodeModel> findImpl(final ICondition condition, final NodeModel node, boolean breadthFirst) {
- final boolean nodeMatches = condition == null || condition.checkNode(node);
- // a shortcut for non-matching leaves
- if (node.isLeaf() && !nodeMatches) {
- return Collections.EMPTY_LIST;
- }
- final List<NodeModel> matches = new ArrayList<NodeModel>();
- if (nodeMatches && breadthFirst) {
- matches.add(node);
- }
- final Enumeration<NodeModel> children = node.children();
- while (children.hasMoreElements()) {
- final NodeModel child = children.nextElement();
- matches.addAll(ProxyUtils.findImpl(condition, child, breadthFirst));
- }
- if (nodeMatches && !breadthFirst) {
- matches.add(node);
- }
- return matches;
- }
-
- public static List<Proxy.Node> createListOfChildren(final NodeModel nodeModel, final ScriptContext scriptContext) {
- return new ArrayList<Proxy.Node>(new AbstractList<Proxy.Node>() {
- @Override
- public Proxy.Node get(final int index) {
- final NodeModel child = (NodeModel) nodeModel.getChildAt(index);
- return new NodeProxy(child, scriptContext);
- }
-
- @Override
- public int size() {
- return nodeModel.getChildCount();
- }
- });
- }
-
- /** this method is null-safe, i.e. value may be null and the result is not null. */
- public static Convertible attributeValueToConvertible(final NodeModel nodeModel, final ScriptContext scriptContext,
- Object value) {
- if (value instanceof IFormattedObject)
- value = ((IFormattedObject) value).getObject();
- if (value instanceof Number)
- return new ConvertibleNumber((Number) value);
- else if (value instanceof Date)
- return new ConvertibleDate((Date) value);
- return new ConvertibleText(nodeModel, scriptContext, value == null ? null : value.toString());
- }
-
- public static Convertible nodeModelToConvertible(final NodeModel nodeModel, final ScriptContext scriptContext) {
- Object value = nodeModel.getUserObject();
- if (value instanceof IFormattedObject)
- value = ((IFormattedObject) value).getObject();
- if (value instanceof Number)
- return new ConvertibleNumber((Number) value);
- else if (value instanceof Date)
- return new ConvertibleDate((Date) value);
- return new ConvertibleNodeText(nodeModel, scriptContext);
- }
-
- public static <T> List<T> createList(final Collection<T> collection) {
- return new AbstractList<T>() {
- private int lastIndex;
- private Iterator<T> iterator;
- @Override
- public T get(int index) {
- if(index >= size())
- throw new NoSuchElementException();
- if(index == 0)
- return collection.iterator().next();
- if(iterator == null || index <= lastIndex){
- lastIndex = -1;
- iterator = collection.iterator();
- }
- try{
- T object;
- for(object = null; lastIndex < index; lastIndex++)
- object = iterator.next();
- return object;
- }
- catch (ConcurrentModificationException e) {
- iterator = null;
- return get(index);
- }
- }
-
- @Override
- public int indexOf(Object o) {
- final Iterator<T> it = iterator();
- int i = -1;
- while(it.hasNext()){
- i++;
- final T next = it.next();
- if(o ==next || o != null && o.equals(next))
- return i;
- }
- return -1;
- }
-
- @Override
- public int lastIndexOf(Object o) {
- final Iterator<T> it = iterator();
- int i = -1;
- int result = -1;
- while(it.hasNext()){
- i++;
- final T next = it.next();
- if(o ==next || o != null && o.equals(next))
- result = i;
- }
- return result;
- }
-
- @Override
- public Iterator<T> iterator() {
- return collection.iterator();
- }
-
-
- @Override
- public int size() {
- return collection.size();
- }
- };
- }
-
- /** used for node core texts and for attribute values. Note that it would lead to an error on reopening of a map
- * if we would allow to assign GStrings here. So all unknown stuff is cast to String. */
- static Object transformObject(Object objectToTransform, String pattern) {
- final Object object = createFormattedObjectIfPossible(objectToTransform, pattern);
- if (object instanceof IFormattedObject)
- return object;
- else if (object instanceof Number)
- return new FormattedNumber((Number) object);
- else if (object instanceof Date)
- return createDefaultFormattedDate((Date) object);
- else if (object instanceof Calendar)
- return createDefaultFormattedDate(((Calendar) object).getTime());
- else if (object instanceof URI)
- return object;
- else
- return Convertible.toString(object);
- }
-
- private static Object createFormattedObjectIfPossible(Object object, String pattern) {
- if (object instanceof String)
- object = ((MTextController) TextController.getController()).guessObjectOrURI(object, pattern);
- else if (pattern != null)
- object = FormatController.format(object, pattern);
- return object;
- }
-
- static FormattedDate createDefaultFormattedDate(final Date date) {
- return FormattedDate.createDefaultFormattedDate(date.getTime(), IFormattedObject.TYPE_DATE);
- }
-
- static FormattedDate createDefaultFormattedDateTime(final Date date) {
- return FormattedDate.createDefaultFormattedDate(date.getTime(), IFormattedObject.TYPE_DATETIME);
- }
-}
diff --git a/freeplane_plugin_script_test/.classpath b/freeplane_plugin_script_test/.classpath
deleted file mode 100644
index 0ea2de8..0000000
--- a/freeplane_plugin_script_test/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
- <classpathentry kind="src" path="test"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_plugin_script_test/.project b/freeplane_plugin_script_test/.project
deleted file mode 100644
index 85f2f14..0000000
--- a/freeplane_plugin_script_test/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_script_test</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_script_test/.settings/org.eclipse.core.resources.prefs b/freeplane_plugin_script_test/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index a12b2f0..0000000
--- a/freeplane_plugin_script_test/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:44 CET 2010
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/freeplane_plugin_script_test/.settings/org.eclipse.core.runtime.prefs b/freeplane_plugin_script_test/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index 96054e0..0000000
--- a/freeplane_plugin_script_test/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:44 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/freeplane_plugin_script_test/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_script_test/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 2148e2d..0000000
--- a/freeplane_plugin_script_test/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Tue Jan 12 16:53:43 CET 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/freeplane_plugin_script_test/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_script_test/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 0251df2..0000000
--- a/freeplane_plugin_script_test/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Tue Jan 12 16:53:44 CET 2010
-eclipse.preferences.version=1
-pluginProject.equinox=false
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/freeplane_plugin_script_test/META-INF/MANIFEST.MF b/freeplane_plugin_script_test/META-INF/MANIFEST.MF
deleted file mode 100644
index c145e48..0000000
--- a/freeplane_plugin_script_test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Test1
-Bundle-SymbolicName: freeplane_plugin_script_test
-Bundle-Version: 1.0.0.qualifier
-Fragment-Host: org.freeplane.plugin.script;bundle-version="1.0.1"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Export-Package: org.freeplane.plugin.script
-Import-Package: org.junit;version="4.5.0",
- org.junit.runner,
- org.junit.runners
diff --git a/freeplane_plugin_script_test/ant/build.xml b/freeplane_plugin_script_test/ant/build.xml
deleted file mode 100644
index fac7ed3..0000000
--- a/freeplane_plugin_script_test/ant/build.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<project name="freeplane_plugin_script_test" default="test" basedir="..">
- <property name="workspace" location=".." />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="ant/ant.properties" />
- <target name="test">
- <junit>
- <classpath path="${classpath}:${workspace}/freeplane_ant/lib/junit.jar:${workspace}/freeplane_uitest/bin" />
- <formatter type="brief" usefile="false" />
- <batchtest>
- <fileset dir="bin" includes="**/*Test.class" />
- </batchtest>
- </junit>
- <fail message="test failed" if="test.failure" />
- </target>
-</project>
diff --git a/freeplane_plugin_script_test/test/org/freeplane/plugin/script/ConvertibleTest.java b/freeplane_plugin_script_test/test/org/freeplane/plugin/script/ConvertibleTest.java
index 0c2cbb4..b3a374f 100644
--- a/freeplane_plugin_script_test/test/org/freeplane/plugin/script/ConvertibleTest.java
+++ b/freeplane_plugin_script_test/test/org/freeplane/plugin/script/ConvertibleTest.java
@@ -42,8 +42,9 @@ public class ConvertibleTest {
public static void initStatics() {
// we have to start Freeplane to create a Controller for script execution could we avoid that?
System.setProperty("org.freeplane.nosplash", "true");
- final Controller controller = new FreeplaneGUIStarter().createController();
- new FreeplaneGUIStarter().createModeControllers(controller);
+ final FreeplaneGUIStarter freeplaneGUIStarter = new FreeplaneGUIStarter();
+ final Controller controller = freeplaneGUIStarter.createController();
+ freeplaneGUIStarter.createModeControllers(controller);
ResourceController.getResourceController().setProperty(ScriptingPermissions.RESOURCES_EXECUTE_SCRIPTS_WITHOUT_ASKING, true);
}
diff --git a/freeplane_plugin_svg/.classpath b/freeplane_plugin_svg/.classpath
deleted file mode 100644
index 8826fdb..0000000
--- a/freeplane_plugin_svg/.classpath
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry exported="true" kind="lib" path="lib/batik-awt-util.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-bridge.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-css.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-dom.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-ext.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-extension.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-gui-util.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-gvt.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-parser.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-script.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-svg-dom.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-svggen.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-swing.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-transcoder.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-util.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/batik-xml.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/js.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/pdf-transcoder.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/xerces_2_5_0.jar"/>
- <classpathentry exported="true" kind="lib" path="lib/xml-apis.jar"/>
- <classpathentry kind="lib" path="lib/xml-apis-ext.jar"/>
- <classpathentry kind="lib" path="lib/batik-anim.jar"/>
- <classpathentry kind="lib" path="lib/batik-codec.jar"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_plugin_svg/.project b/freeplane_plugin_svg/.project
deleted file mode 100644
index 9ce39b8..0000000
--- a/freeplane_plugin_svg/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_svg</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_svg/.settings/org.eclipse.core.resources.prefs b/freeplane_plugin_svg/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 2f065a7..0000000
--- a/freeplane_plugin_svg/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:55 CET 2010
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/freeplane_plugin_svg/.settings/org.eclipse.core.runtime.prefs b/freeplane_plugin_svg/.settings/org.eclipse.core.runtime.prefs
deleted file mode 100644
index 97df3e6..0000000
--- a/freeplane_plugin_svg/.settings/org.eclipse.core.runtime.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Mon Feb 15 22:57:55 CET 2010
-eclipse.preferences.version=1
-line.separator=\n
diff --git a/freeplane_plugin_svg/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_svg/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index e8dc079..0000000
--- a/freeplane_plugin_svg/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,12 +0,0 @@
-#Mon Apr 13 10:15:48 CEST 2009
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/freeplane_plugin_svg/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_svg/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 16a669c..0000000
--- a/freeplane_plugin_svg/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,5 +0,0 @@
-#Sun Jan 04 22:58:46 CET 2009
-eclipse.preferences.version=1
-pluginProject.equinox=false
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/freeplane_plugin_svg/META-INF/MANIFEST.MF b/freeplane_plugin_svg/META-INF/MANIFEST.MF
deleted file mode 100644
index a6f69e1..0000000
--- a/freeplane_plugin_svg/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.plugin.svg
-Bundle-SymbolicName: org.freeplane.plugin.svg
-Bundle-Version: 1.0.1
-Bundle-Activator: org.freeplane.plugin.svg.Activator
-Import-Package: org.osgi.framework;version="1.3.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.freeplane.core;bundle-version="1.0.1"
-Bundle-ClassPath: lib/batik-awt-util.jar,
- lib/batik-bridge.jar,
- lib/batik-css.jar,
- lib/batik-dom.jar,
- lib/batik-ext.jar,
- lib/batik-extension.jar,
- lib/batik-gui-util.jar,
- lib/batik-gvt.jar,
- lib/batik-parser.jar,
- lib/batik-script.jar,
- lib/batik-anim.jar,
- lib/batik-codec.jar,
- lib/batik-svg-dom.jar,
- lib/batik-svggen.jar,
- lib/batik-swing.jar,
- lib/batik-transcoder.jar,
- lib/batik-util.jar,
- lib/batik-xml.jar,
- lib/js.jar,
- lib/pdf-transcoder.jar,
- lib/xerces_2_5_0.jar,
- lib/xml-apis.jar,
- lib/plugin.jar,
- lib/xml-apis-ext.jar
diff --git a/freeplane_plugin_svg/ant/ant.properties b/freeplane_plugin_svg/ant/ant.properties
deleted file mode 100644
index 92d3a90..0000000
--- a/freeplane_plugin_svg/ant/ant.properties
+++ /dev/null
@@ -1,25 +0,0 @@
-plugin.ext.lib = lib
-
-# Batik - xml.apache.org SVG Library (batik-all.jar)
-batik.jars = ${plugin.ext.lib}/batik-awt-util.jar:${plugin.ext.lib}/batik-bridge.jar:${plugin.ext.lib}/batik-css.jar:${plugin.ext.lib}/batik-dom.jar:${plugin.ext.lib}/batik-extension.jar:${plugin.ext.lib}/batik-ext.jar:${plugin.ext.lib}/batik-codec.jar:${plugin.ext.lib}/batik-anim.jar:${plugin.ext.lib}/batik-gui-util.jar:${plugin.ext.lib}/batik-gvt.jar:${plugin.ext.lib}/batik-parser.jar:${plugin.ext.lib}/batik-script.jar:${plugin.ext.lib}/batik-svg-dom.jar:${plugin.ext.lib}/batik-svggen. [...]
-
-# Rhino - JavaScript engine written in Java
-js.jar = ${plugin.ext.lib}/js.jar
-# FOP - XML to PDF Translator (fop.jar)
-pdf-transcoder.jar = ${plugin.ext.lib}/pdf-transcoder.jar
-
-pdf.jars = ${pdf-transcoder.jar}
-# Possibly also needed to work properly under Debian/Ubuntu:
-# /usr/share/java/avalon-framework.jar
-# /usr/share/java/commons-logging.jar
-# /usr/share/java/commons-io.jar
-# /usr/share/java/xmlgraphics-commons.jar
-
-# Xerces2 - Validating XML parser for Java with DOM level 3 support
-# (xercesImpl.jar and xmlParserAPIs.jar)
-xerces.jar = ${plugin.ext.lib}/xerces_2_5_0.jar
-xml-apis-ext.jar = ${plugin.ext.lib}/xml-apis-ext.jar
-# Xalan2 - XSL Transformations (XSLT) processor in Java
-xml-apis.jar = ${plugin.ext.lib}/xml-apis.jar
-
-xml.jars = ${xerces.jar}:${xml-apis.jar}:${xml-apis-ext.jar}
diff --git a/freeplane_plugin_svg/ant/build.xml b/freeplane_plugin_svg/ant/build.xml
deleted file mode 100644
index e84c392..0000000
--- a/freeplane_plugin_svg/ant/build.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<project name="freeplane_svg" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property name="src" value="src" />
- <property name = "root" value = "."/>
- <property name="osgimanifest" value="${root}/META-INF/MANIFEST.MF" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="ant/ant.properties" />
- <property name="external.jars" value="${commons-lang.jar}:${forms.jar}:${SimplyHTML.jar}:${batik.jars}:${js.jar}:${pdf.jars}:${xml.jars}" />
- <property name="build" value="${root}/build" />
- <property name="dist" value="${root}/dist" />
- <property name="dist.osgi.dir" value="${dist}/org.freeplane.plugin.svg" />
- <property name="freeplaneplugin.jar" value="${dist}/org.freeplane.plugin.svg.jar"/>
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${framework.jar}:${freeplane.jars}:${external.jars}"/>
-
- <target name="build">
- <mkdir dir="${build}" />
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- </javac>
- </target>
-
-
- <target name="dist" depends="build">
- <jar jarfile="lib/plugin.jar">
- <fileset dir="${build}"/>
- </jar>
- <delete dir="${dist.osgi.dir}" quiet="true"/>
- <mkdir dir="${dist.osgi.dir}" />
- <copy todir="${dist.osgi.dir}">
- <fileset dir="${root}">
- <include name="lib/**"/>
- </fileset>
- </copy>
- <mkdir dir="${dist.osgi.dir}/META-INF" />
- <copy tofile="${dist.osgi.dir}/META-INF/MANIFEST.MF" file="${osgimanifest}"/>
- <delete file="lib/plugin.jar" quiet="true"/>
- </target>
-
- <target name="osgi_dist_as_jar" depends="dist">
- <jar jarfile="${freeplaneplugin.jar}">
- <fileset dir="${dist.osgi.dir}">
- <include name="**" />
- </fileset>
- </jar>
- </target>
-
- <target name="clean">
- <delete dir="${build}" quiet="true"/>
- <delete dir="${dist}" quiet="true"/>
- <delete>
- <fileset defaultexcludes="no" dir="${src}" includes="**/*~"/>
- </delete>
- </target>
-
-</project>
-
diff --git a/freeplane_plugin_svg/build.gradle b/freeplane_plugin_svg/build.gradle
new file mode 100644
index 0000000..48be7ca
--- /dev/null
+++ b/freeplane_plugin_svg/build.gradle
@@ -0,0 +1,73 @@
+dependencies {
+ compile project(':freeplane')
+
+ compile 'org.apache.xmlgraphics:batik-anim:1.7',
+ 'org.apache.xmlgraphics:batik-awt-util:1.7',
+ 'org.apache.xmlgraphics:batik-bridge:1.7',
+ 'org.apache.xmlgraphics:batik-codec:1.7',
+ 'org.apache.xmlgraphics:batik-css:1.7',
+ 'org.apache.xmlgraphics:batik-dom:1.7',
+ 'org.apache.xmlgraphics:batik-extension:1.7',
+ 'org.apache.xmlgraphics:batik-ext:1.7',
+ 'org.apache.xmlgraphics:batik-gui-util:1.7',
+ 'org.apache.xmlgraphics:batik-gvt:1.7',
+ 'org.apache.xmlgraphics:batik-parser:1.7',
+ 'org.apache.xmlgraphics:batik-script:1.7',
+ 'org.apache.xmlgraphics:batik-svg-dom:1.7',
+ 'org.apache.xmlgraphics:batik-svggen:1.7',
+ 'org.apache.xmlgraphics:batik-swing:1.7',
+ 'org.apache.xmlgraphics:batik-transcoder:1.7',
+ 'org.apache.xmlgraphics:batik-util:1.7',
+ 'org.apache.xmlgraphics:batik-xml:1.7',
+
+ 'org.mozilla:rhino:1.7R4', // "js.jar"/librhino-java
+
+ // cannot pull this due to broken "avalon" dependency
+ // (replaced by ./lib/pdf-transcoder.jar below):
+ //'org.apache.xmlgraphics:fop:1.1', // "fop.jar"/libfop-java
+
+ // libxml-commons-external-java 1.4.01
+ //WRONG: 'org.apache.xmlgraphics:xmlgraphics-commons:1.4'
+ 'xml-apis:xml-apis:1.4.01',
+ 'xml-apis:xml-apis-ext:1.3.04',
+
+ // need to fix javax.xml.parsers.FactoryConfigurationError:
+ // Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not found
+ // when starting from elipse:
+ 'xerces:xercesImpl:2.11.0'
+
+ // from flatDir "localGitDepsRepository":
+ compile ':pdf-transcoder-1.0' // "fop.jar"/libfop-java
+}
+
+jar {
+ manifest {
+ name = pluginid
+ symbolicName = pluginid
+
+ configurations.runtime.transitive = false
+ def deps = filterAndExternalizePluginDependencies(configurations.runtime.files)
+ deps.add(0, "lib/plugin-" + project.version + '.jar')
+
+ attributes 'Class-Path': deps.join(', ')
+ attributes 'Bundle-ClassPath': '., ' + deps.join(', ')
+
+ instruction 'Bundle-Vendor', 'Freeplane Project'
+ instruction 'Bundle-Activator', pluginid + ".Activator"
+ instruction 'Bundle-RequiredExecutionEnvironment', 'JavaSE-1.6'
+
+ def imports = """\
+ org.osgi.framework;version="1.3.0",
+ org.freeplane.core.*,
+ org.freeplane.features.*,
+ org.freeplane.main.*,
+ org.freeplane.n3.*,
+ org.freeplane.view.*
+ """
+ instruction 'Import-Package', imports.replaceAll("\\s+", "")
+ instruction 'Export-Package', ''
+
+ // Require-Bundle is ignored by bnd => replaced by Import-Package!
+ //instruction 'Require-Bundle', 'org.freeplane.core;bundle-version="1.0.1", org.freeplane.plugin.script;bundle-version="1.0.1"'
+ }
+}
diff --git a/freeplane_plugin_svg/src/org/freeplane/plugin/svg/Activator.java b/freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/Activator.java
similarity index 100%
rename from freeplane_plugin_svg/src/org/freeplane/plugin/svg/Activator.java
rename to freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/Activator.java
diff --git a/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportPdf.java b/freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/ExportPdf.java
similarity index 100%
rename from freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportPdf.java
rename to freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/ExportPdf.java
diff --git a/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportSvg.java b/freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/ExportSvg.java
similarity index 100%
rename from freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportSvg.java
rename to freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/ExportSvg.java
diff --git a/freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportVectorGraphic.java b/freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/ExportVectorGraphic.java
similarity index 100%
rename from freeplane_plugin_svg/src/org/freeplane/plugin/svg/ExportVectorGraphic.java
rename to freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/ExportVectorGraphic.java
diff --git a/freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/SvgViewerFactory.java b/freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/SvgViewerFactory.java
new file mode 100644
index 0000000..61e82d4
--- /dev/null
+++ b/freeplane_plugin_svg/src/main/java/org/freeplane/plugin/svg/SvgViewerFactory.java
@@ -0,0 +1,180 @@
+package org.freeplane.plugin.svg;
+
+import java.awt.Dimension;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+
+import org.apache.batik.swing.JSVGCanvas;
+import org.apache.batik.swing.gvt.GVTTreeRendererAdapter;
+import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
+import org.apache.batik.util.SVGConstants;
+import org.freeplane.core.resources.ResourceController;
+import org.freeplane.core.util.TextUtils;
+import org.freeplane.view.swing.features.filepreview.ExternalResource;
+import org.freeplane.view.swing.features.filepreview.IViewerFactory;
+import org.freeplane.view.swing.features.filepreview.ImageLoadingListener;
+import org.freeplane.view.swing.features.filepreview.ScalableComponent;
+import org.freeplane.view.swing.features.filepreview.ViewerLayoutManager;
+import org.w3c.dom.svg.SVGDocument;
+import org.w3c.dom.svg.SVGLength;
+import org.w3c.dom.svg.SVGSVGElement;
+
+public class SvgViewerFactory implements IViewerFactory {
+
+
+ private final class ViewerComponent extends JSVGCanvas implements ScalableComponent {
+ private static final long serialVersionUID = 1L;
+ private Dimension originalSize = null;
+ private Dimension maximumSize = null;
+
+ public Dimension getOriginalSize() {
+ return new Dimension(originalSize);
+ }
+
+ public void setFinalViewerSize(final Dimension size) {
+ Dimension sizeWithScaleCorrection = fitToMaximumSize(size);
+ setRenderingTransform(initialTransform);
+ setPreferredSize(sizeWithScaleCorrection);
+ setMySize(sizeWithScaleCorrection);
+ setSize(sizeWithScaleCorrection);
+ }
+
+ private Dimension fitToMaximumSize(final Dimension size) {
+ if (maximumSize == null || isUnderMaximumSize(size)) {
+ return size;
+ }
+ else {
+ return maximumSize;
+ }
+ }
+
+ private boolean isUnderMaximumSize(final Dimension size) {
+ return maximumSize.getWidth() >= size.width || maximumSize.getHeight() >= size.height;
+ }
+
+ public void setDraftViewerSize(final Dimension size) {
+ setFinalViewerSize(size);
+ }
+
+ public void setFinalViewerSize(final float zoom) {
+ if (originalSize != null) {
+ int scaledWidth = (int) (originalSize.width * zoom);
+ int scaledHeight = (int) (originalSize.height * zoom);
+ setFinalViewerSize(new Dimension(scaledWidth, scaledHeight));
+ }
+ }
+
+ public ViewerComponent(final URI uri) {
+ super(null, false, false);
+ setDocumentState(ALWAYS_STATIC);
+ setSize(1, 1);
+ addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
+ @Override
+ public void gvtRenderingStarted(final GVTTreeRendererEvent e) {
+ super.gvtRenderingStarted(e);
+ final SVGDocument document = getSVGDocument();
+ final SVGSVGElement rootElement = document.getRootElement();
+ final SVGLength width = rootElement.getWidth().getBaseVal();
+ final SVGLength height = rootElement.getHeight().getBaseVal();
+ float defaultWidth = (float) Math.ceil(width.getValue());
+ float defaultHeigth = (float) Math.ceil(height.getValue());
+ if (defaultWidth == 1f && defaultHeigth == 1f) {
+ defaultWidth = ResourceController.getResourceController().getIntProperty(
+ "default_external_component_width", 200);
+ defaultHeigth = ResourceController.getResourceController().getIntProperty(
+ "default_external_component_height", 200);
+ }
+ originalSize = new Dimension((int) defaultWidth, (int) defaultHeigth);
+ if ("".equals(rootElement.getAttributeNS(null, SVGConstants.SVG_VIEW_BOX_ATTRIBUTE))) {
+ rootElement.setAttributeNS(null, SVGConstants.SVG_VIEW_BOX_ATTRIBUTE, "0 0 " + defaultWidth
+ + " " + defaultHeigth);
+ }
+ removeGVTTreeRendererListener(this);
+ }
+ });
+ setURI(uri.toString());
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ if (originalSize == null) {
+ return new Dimension(1, 1);
+ }
+ return super.getPreferredSize();
+ }
+
+ public void setMaximumComponentSize(Dimension size) {
+ this.maximumSize = size;
+ }
+
+ public void setCenter(boolean center) {
+ }
+
+ public void setImageLoadingListener(final ImageLoadingListener listener) {
+ addGVTTreeRendererListener(new GVTTreeRendererAdapter(){
+ @Override
+ public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
+ listener.imageLoaded();
+ }
+ });
+ }
+ }
+
+ public boolean accept(final URI uri) {
+ return uri.getRawPath().endsWith(".svg");
+ }
+
+ public String getDescription() {
+ return TextUtils.getText("svg");
+ };
+
+ public ScalableComponent createViewer(final ExternalResource resource, final URI uri, final int maximumWidth) {
+ final ViewerComponent canvas = new ViewerComponent(uri);
+ canvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
+ @Override
+ public void gvtRenderingCompleted(final GVTTreeRendererEvent e) {
+ final Dimension originalSize = canvas.getOriginalSize();
+ float r = resource.getZoom();
+ final int originalWidth = originalSize.width;
+ final ViewerLayoutManager viewerLayoutManager = new ViewerLayoutManager(1f, resource, originalSize);
+ canvas.setLayout(viewerLayoutManager);
+ if(r == -1){
+ r = resource.setZoom(originalWidth, maximumWidth);
+ }
+ canvas.setFinalViewerSize(originalSize);
+ canvas.setPreferredSize(viewerLayoutManager.calculatePreferredSize());
+ canvas.revalidate();
+ canvas.removeGVTTreeRendererListener(this);
+ }
+ });
+ return canvas;
+ }
+
+ public ScalableComponent createViewer(final URI uri, final Dimension preferredSize) {
+ final ViewerComponent canvas = new ViewerComponent(uri);
+ canvas.setFinalViewerSize(preferredSize);
+ canvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
+ @Override
+ public void gvtRenderingCompleted(final GVTTreeRendererEvent e) {
+ canvas.setFinalViewerSize(canvas.getSize());
+ canvas.revalidate();
+ canvas.removeGVTTreeRendererListener(this);
+ }
+ });
+ return canvas;
+ }
+
+ public ScalableComponent createViewer(URI uri, final float zoom) throws MalformedURLException, IOException {
+ final ViewerComponent canvas = new ViewerComponent(uri);
+ canvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
+ @Override
+ public void gvtRenderingCompleted(final GVTTreeRendererEvent e) {
+ canvas.setFinalViewerSize(zoom);
+ canvas.revalidate();
+ canvas.removeGVTTreeRendererListener(this);
+ }
+ });
+ return canvas;
+ }
+}
diff --git a/freeplane_plugin_svg/src/org/freeplane/plugin/svg/SvgViewerFactory.java b/freeplane_plugin_svg/src/org/freeplane/plugin/svg/SvgViewerFactory.java
deleted file mode 100644
index f632b92..0000000
--- a/freeplane_plugin_svg/src/org/freeplane/plugin/svg/SvgViewerFactory.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.freeplane.plugin.svg;
-
-import java.awt.Dimension;
-import java.net.URI;
-
-import javax.swing.JComponent;
-
-import org.apache.batik.swing.JSVGCanvas;
-import org.apache.batik.swing.gvt.GVTTreeRendererAdapter;
-import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
-import org.apache.batik.util.SVGConstants;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.view.swing.features.filepreview.ExternalResource;
-import org.freeplane.view.swing.features.filepreview.IViewerFactory;
-import org.freeplane.view.swing.features.filepreview.ViewerLayoutManager;
-import org.w3c.dom.svg.SVGDocument;
-import org.w3c.dom.svg.SVGLength;
-import org.w3c.dom.svg.SVGSVGElement;
-
-public class SvgViewerFactory implements IViewerFactory {
- private final class ViewerComponent extends JSVGCanvas {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Dimension originalSize = null;
-
- protected Dimension getOriginalSize() {
- return new Dimension(originalSize);
- }
-
- public ViewerComponent(final URI uri) {
- super(null, false, false);
- setDocumentState(ALWAYS_STATIC);
- setSize(1, 1);
- addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
- @Override
- public void gvtRenderingStarted(final GVTTreeRendererEvent e) {
- super.gvtRenderingStarted(e);
- final SVGDocument document = getSVGDocument();
- final SVGSVGElement rootElement = document.getRootElement();
- final SVGLength width = rootElement.getWidth().getBaseVal();
- final SVGLength height = rootElement.getHeight().getBaseVal();
- float defaultWidth = (float) Math.ceil(width.getValue());
- float defaultHeigth = (float) Math.ceil(height.getValue());
- if (defaultWidth == 1f && defaultHeigth == 1f) {
- defaultWidth = ResourceController.getResourceController().getIntProperty(
- "default_external_component_width", 200);
- defaultHeigth = ResourceController.getResourceController().getIntProperty(
- "default_external_component_height", 200);
- }
- originalSize = new Dimension((int) defaultWidth, (int) defaultHeigth);
- if ("".equals(rootElement.getAttributeNS(null, SVGConstants.SVG_VIEW_BOX_ATTRIBUTE))) {
- rootElement.setAttributeNS(null, SVGConstants.SVG_VIEW_BOX_ATTRIBUTE, "0 0 " + defaultWidth
- + " " + defaultHeigth);
- }
- setSize(originalSize);
- removeGVTTreeRendererListener(this);
- }
- });
- setURI(uri.toString());
- }
-
- @Override
- public Dimension getPreferredSize() {
- if (originalSize == null) {
- return new Dimension(1, 1);
- }
- return super.getPreferredSize();
- }
- }
-
- public boolean accept(final URI uri) {
- return uri.getRawPath().endsWith(".svg");
- }
-
- public String getDescription() {
- return TextUtils.getText("svg");
- };
-
- public JComponent createViewer(final ExternalResource resource, final URI uri, final int maximumWidth) {
- final ViewerComponent canvas = new ViewerComponent(uri);
- canvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
- @Override
- public void gvtRenderingCompleted(final GVTTreeRendererEvent e) {
- final Dimension preferredSize = canvas.getOriginalSize();
- float r = resource.getZoom();
- final int originalWidth = preferredSize.width;
- if(r == -1){
- r = resource.setZoom(originalWidth, maximumWidth);
- }
- preferredSize.width = (int) (Math.rint(originalWidth * r));
- preferredSize.height = (int) (Math.rint(preferredSize.height * r));
- canvas.setPreferredSize(preferredSize);
- canvas.setLayout(new ViewerLayoutManager(1f));
- canvas.revalidate();
- canvas.removeGVTTreeRendererListener(this);
- }
-
- });
- return canvas;
- }
-
- public JComponent createViewer(final URI uri, final Dimension preferredSize) {
- final ViewerComponent canvas = new ViewerComponent(uri);
- canvas.setPreferredSize(preferredSize);
- canvas.setSize(preferredSize);
- canvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
- @Override
- public void gvtRenderingCompleted(final GVTTreeRendererEvent e) {
- canvas.setMySize(preferredSize);
- canvas.setSize(preferredSize);
- canvas.revalidate();
- canvas.removeGVTTreeRendererListener(this);
- }
- });
- return canvas;
- }
-
- public Dimension getOriginalSize(final JComponent viewer) {
- final ViewerComponent canvas = (ViewerComponent) viewer;
- return canvas.getOriginalSize();
- }
-
- public void setFinalViewerSize(final JComponent viewer, final Dimension size) {
- final JSVGCanvas canvas = (JSVGCanvas) viewer;
- canvas.setMySize(size);
- }
-
- public void setDraftViewerSize(JComponent viewer, Dimension size) {
- setFinalViewerSize(viewer, size);
- }
-}
diff --git a/freeplane_plugin_uispec4j/.classpath b/freeplane_plugin_uispec4j/.classpath
deleted file mode 100644
index 81731b4..0000000
--- a/freeplane_plugin_uispec4j/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="lib" path="lib/uispecjext.jar" sourcepath="lib/uispec4j-2.4-sources.jar"/>
- <classpathentry kind="lib" path="/freeplane/lib/SimplyHTML.jar"/>
- <classpathentry kind="lib" path="lib/uispec4j-2.4-jdk16.jar" sourcepath="lib/uispec4j-2.4-sources.jar"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_plugin_uispec4j/.project b/freeplane_plugin_uispec4j/.project
deleted file mode 100644
index c8b1813..0000000
--- a/freeplane_plugin_uispec4j/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_uispec4j</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_uispec4j/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_uispec4j/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index a5e0169..0000000
--- a/freeplane_plugin_uispec4j/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Mon Apr 05 15:09:30 CEST 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/freeplane_plugin_uispec4j/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_uispec4j/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index b619fd7..0000000
--- a/freeplane_plugin_uispec4j/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Apr 05 15:09:30 CEST 2010
-eclipse.preferences.version=1
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/freeplane_plugin_uispec4j/META-INF/MANIFEST.MF b/freeplane_plugin_uispec4j/META-INF/MANIFEST.MF
deleted file mode 100644
index 820a5c9..0000000
--- a/freeplane_plugin_uispec4j/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,27 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.uispec4j
-Bundle-SymbolicName: org.freeplane.uispec4j
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.freeplane.uispec4j.osgi.Activator
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Import-Package: junit.framework,
- org.osgi.framework;version="1.3.0"
-Require-Bundle: org.freeplane.core;bundle-version="1.0.1",
- org.junit
-Export-Package: org.freeplane.uispec4j.framework,
- org.uispec4j,
- org.uispec4j.assertion,
- org.uispec4j.assertion.testlibrairies,
- org.uispec4j.extension,
- org.uispec4j.finder,
- org.uispec4j.interception,
- org.uispec4j.interception.handlers,
- org.uispec4j.interception.toolkit,
- org.uispec4j.interception.ui,
- org.uispec4j.utils,
- org.uispec4j.xml
-Bundle-ClassPath: .,
- lib/uispecjext.jar,
- lib/uispec4j-2.4-jdk16.jar
diff --git a/freeplane_plugin_uispec4j/ant/build.xml b/freeplane_plugin_uispec4j/ant/build.xml
deleted file mode 100644
index 1620e88..0000000
--- a/freeplane_plugin_uispec4j/ant/build.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<project name="freeplane_uitest" default="buildext" basedir="..">
- <target name="buildext" >
- <java fork="yes" dir="lib"
- classname="org.uispec4j.extension.ExtensionGenerator"
- classpath="ant/asm-3.1.jar:ant/asm-util-3.1.jar:lib/uispec4j-2.4-jdk16.jar"
- >
- <arg value="uispecjext.jar"/>
- <arg value="Node:org.freeplane.uispec4j.framework.Node"/>
- </java>
- </target>
-</project>
diff --git a/freeplane_plugin_uispec4j/infinitest.filters b/freeplane_plugin_uispec4j/infinitest.filters
deleted file mode 100644
index 9abb766..0000000
--- a/freeplane_plugin_uispec4j/infinitest.filters
+++ /dev/null
@@ -1 +0,0 @@
-.*
\ No newline at end of file
diff --git a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/AttributeTableMatcher.java b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/AttributeTableMatcher.java
deleted file mode 100644
index 32a3cd8..0000000
--- a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/AttributeTableMatcher.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- *
- */
-package org.freeplane.uispec4j.framework;
-
-import java.awt.Component;
-
-import javax.swing.JTable;
-
-import org.uispec4j.finder.ComponentMatcher;
-
-public class AttributeTableMatcher implements ComponentMatcher {
- public boolean matches(Component component) {
- return component instanceof JTable && component.getClass().getSimpleName().equals("AttributeTable");
- }
-}
\ No newline at end of file
diff --git a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/ErrorCheckHandler.java b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/ErrorCheckHandler.java
deleted file mode 100644
index 5f9a346..0000000
--- a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/ErrorCheckHandler.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package org.freeplane.uispec4j.framework;
-import java.util.logging.Handler;
-import java.util.logging.Level;
-import java.util.logging.LogRecord;
-
-
-public class ErrorCheckHandler extends Handler {
- private boolean errorsFound = false;
-
- public void close() throws SecurityException {
- }
-
- public void flush() {
- }
-
- public void publish(LogRecord record) {
- final Level level = record.getLevel();
- if(level == Level.OFF) {
- return;
- }
- if(level.intValue() >= Level.SEVERE.intValue())
- {
- errorsFound = true;
- }
- }
- public boolean checkErrors(){
- boolean errors = errorsFound;
- errorsFound = false;
- return errors;
- }
-
-};
-
-
diff --git a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneAdapter.java b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneAdapter.java
deleted file mode 100644
index 7d71f77..0000000
--- a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneAdapter.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.freeplane.uispec4j.framework;
-
-import java.awt.Component;
-import java.util.logging.Logger;
-
-import javax.swing.JFrame;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.uispec4j.osgi.Activator;
-import org.osgi.framework.Bundle;
-import org.uispec4j.Trigger;
-import org.uispec4j.UISpecAdapter;
-import org.uispec4j.Window;
-import org.uispec4j.interception.WindowHandler;
-import org.uispec4j.interception.WindowInterceptor;
-
-/**
- * Adapter that intercepts the window displayed by the main() of a given class.<p/>
- * This adapter keeps the reference of the intercepted window, so that main() is not called on
- * subsequent calls. If you need to run main() again, you can either call {@link #reset()} or create a new
- * adapter.
- */
-public class FreeplaneAdapter implements UISpecAdapter {
- static private FreeplaneWindow window;
- static private ErrorCheckHandler errorCheck = new ErrorCheckHandler();
-
- public FreeplaneAdapter() {
- }
-
- synchronized public Window getMainWindow() {
- if (window == null) {
- intercept();
- Logger parentLogger = Logger.getAnonymousLogger().getParent();
- parentLogger.addHandler(errorCheck);
- }
- return window;
- }
-
- /**
- * Remove mnemonics
- * @param string
- * @return
- */
- String getMenuItemName(String string) {
- final String resourceString = TextUtils.getText(string);
- return resourceString.replaceFirst("&", "");
- }
-
- private Window intercept() {
- final WindowInterceptor interceptor = WindowInterceptor
- .init(new Trigger() {
- public void run() throws Exception {
- Bundle[] bundles = Activator.getBundleContext().getBundles();
- for(Bundle b:bundles){
- if(b.getSymbolicName().equals("org.freeplane.core")){
- b.start();
- return;
- }
- }
- }
- });
- interceptor.process(new WindowHandler() {
- public Trigger process(Window window) throws Exception {
- setWindow(window);
- return Trigger.DO_NOTHING;
- }
- }).process(new WindowHandler() {
- public Trigger process(Window window) throws Exception {
- setWindow(window);
- return Trigger.DO_NOTHING;
- }
- }).run();
- return window;
- }
-
- public void reset() {
- window = null;
- }
-
- static private void setWindow(Window window) {
- final Component f = window.getAwtComponent();
- if (f instanceof JFrame)
- FreeplaneAdapter.window = new FreeplaneWindow((JFrame)f);
- }
-
- public boolean checkLogErrors() {
- return errorCheck.checkErrors();
- }
-
-}
diff --git a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneTestCase.java b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneTestCase.java
deleted file mode 100644
index b8def3f..0000000
--- a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneTestCase.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.freeplane.uispec4j.framework;
-
-import java.lang.reflect.InvocationTargetException;
-
-import javax.swing.SwingUtilities;
-
-import org.freeplane.core.util.TextUtils;
-import org.uispec4j.MenuItem;
-import org.uispec4j.UISpec4J;
-import org.uispec4j.UISpecTestCase;
-import org.uispec4j.utils.ExceptionContainer;
-
-public abstract class FreeplaneTestCase extends UISpecTestCase {
- static private FreeplaneAdapter freeplaneFrameAdapter;
- static protected String openMap;
-
- /**
- * Returns the Window created by the adapter.
- *
- * @throws AdapterNotFoundException if the <code>uispec4j.adapter</code> property does not refer
- * to a valid adapter
- */
- public FreeplaneWindow getFreeMindWindow(){
- return (FreeplaneWindow) getMainWindow();
- }
-
- private void initializeMainWindow() {
- if(freeplaneFrameAdapter == null){
- openMap = System.getProperty("openMap");
- final String[] args;
- if(openMap != null){
- args = new String[1];
- args[0] = openMap;
- }
- else{
- args = new String[0];
- }
- freeplaneFrameAdapter = new FreeplaneAdapter();
- freeplaneFrameAdapter.getMainWindow();
- }
- }
-
- protected void tearDown() throws Exception {
- assertNoErrorsLogged();
- super.tearDown();
- }
-
- protected void assertNoErrorsLogged() {
- assertFalse(freeplaneFrameAdapter.checkLogErrors());
- }
-
- protected MenuItem getMenu(String key){
- return getMainWindow().getMenuBar().getMenu(getMenuItemName(key));
- }
-
- protected String getMenuItemName(String key) {
- return freeplaneFrameAdapter.getMenuItemName(key);
- }
-
- protected String getResourceString(String item) {
- return TextUtils.getText(item);
- }
-
- protected void superSetUp() throws Exception {
- super.setUp();
- UISpec4J.setWindowInterceptionTimeLimit(100000);
- initializeMainWindow();
- setAdapter(freeplaneFrameAdapter);
- freeplaneFrameAdapter.checkLogErrors();
- }
-
- protected void setUp() throws Exception {
- }
-
- // initialize main frame in the main thread,
- // but run the tests in the swing thread.
- public void runBare() throws Throwable {
- superSetUp();
- runBareInSwingThread();
- }
-
- private void runBareInSwingThread() throws Throwable {
- if (SwingUtilities.isEventDispatchThread()) {
- super.runBare();
- return;
- }
- final ExceptionContainer container = new ExceptionContainer();
- try {
- SwingUtilities.invokeAndWait(new Runnable() {
- public void run() {
- try {
- FreeplaneTestCase.super.runBare();
- }
- catch (Throwable e) {
- container.set(e);
- }
- }
- });
- }
- catch (InterruptedException e) {
- throw new RuntimeException(e.getCause());
- }
- catch (InvocationTargetException e) {
- throw new RuntimeException(e.getCause());
- }
- container.rethrowIfNeeded();
- }
-}
diff --git a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneWindow.java b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneWindow.java
deleted file mode 100644
index 6c4c3db..0000000
--- a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/FreeplaneWindow.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.freeplane.uispec4j.framework;
-import javax.swing.JFrame;
-
-import org.junit.Assert;
-
-import org.freeplane.features.mode.Controller;
-import org.uispec4j.Panel;
-import org.uispec4j.TextBox;
-import org.uispec4j.UIComponent;
-import org.uispec4j.Window;
-
-import com.lightdev.app.shtm.SHTMLPanel;
-
-
-public class FreeplaneWindow extends Window {
- public FreeplaneWindow(JFrame frame) {
- super(frame);
- }
-
- public JFrame getFreeMindFrame(){
- return (JFrame)getAwtComponent();
- }
-
- public Controller getController(){
- return (Controller) (getFreeMindFrame().getRootPane()).getClientProperty(Controller.class);
- }
- public Panel getToolbar(final String name){
- return new Panel(getController().getModeController().getUserInputListenerFactory().getToolBar(name));
- }
-
- public TextBox getNoteEditor(){
- SHTMLPanel panel = getShtmlPanel();
- return new TextBox(panel.getEditorPane());
- }
-
- public TextBox getNoteHtmlEditor(){
- SHTMLPanel panel = getShtmlPanel();
- return new TextBox(panel.getSourceEditorPane());
- }
-
- private SHTMLPanel getShtmlPanel() {
- final UIComponent[] components = getUIComponents(SHTMLPanel.class);
- Assert.assertTrue(components.length == 1);
- SHTMLPanel panel = (SHTMLPanel)components[0].getAwtComponent();
- return panel;
- }
-}
diff --git a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/Node.java b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/Node.java
deleted file mode 100644
index 5b4b8c0..0000000
--- a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/framework/Node.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package org.freeplane.uispec4j.framework;
-
-import java.awt.Component;
-import java.awt.Rectangle;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-
-import javax.swing.JComponent;
-import javax.swing.JTable;
-import javax.swing.SwingUtilities;
-
-import org.junit.Assert;
-
-import org.freeplane.view.swing.map.MainView;
-import org.freeplane.view.swing.map.NodeView;
-import org.uispec4j.AbstractUIComponent;
-import org.uispec4j.ComponentAmbiguityException;
-import org.uispec4j.ItemNotFoundException;
-import org.uispec4j.Key;
-import org.uispec4j.Mouse;
-import org.uispec4j.Table;
-import org.uispec4j.TextBox;
-import org.uispec4j.Trigger;
-import org.uispec4j.assertion.Assertion;
-import org.uispec4j.finder.ComponentFinder;
-
-public class Node extends TextBox {
- public static final String TYPE_NAME = "node";
- @SuppressWarnings("rawtypes")
- public static final Class[] SWING_CLASSES = { MainView.class };
-
- private final static AttributeTableMatcher attributeTableMatcher = new AttributeTableMatcher();
- private ComponentFinder finder;
-
- private MainView nodeMainView = null;
- private Table table;
-
- public Node(MainView nodeMainView) {
- super(nodeMainView);
- this.nodeMainView = nodeMainView;
- }
-
- public String getDescriptionTypeName() {
- return TYPE_NAME;
- }
-
- public String getName() {
- return nodeMainView.getText();
- }
-
- public JComponent getAwtComponent() {
- return nodeMainView;
- }
-
- public MainView getMainView() {
- return nodeMainView;
- }
-
- public NodeView getNodeView() {
- return nodeMainView.getNodeView();
- }
-
- public Table getAttributeTable() throws ComponentAmbiguityException, ItemNotFoundException {
- if (table == null) {
- final Component jtable = getFinder().getComponent(attributeTableMatcher);
- table = new Table((JTable) jtable);
- }
- return table;
- }
-
- public Table findAttributeTable() throws ComponentAmbiguityException, ItemNotFoundException {
- if (table == null) {
- final Component jtable = getFinder().findComponent(attributeTableMatcher);
- if(jtable != null){
- table = new Table((JTable) jtable);
- }
- }
- return table;
- }
-
- public Assertion containsAttributeTable() {
- return new Assertion() {
- public void check() {
- Assert.assertTrue(findAttributeTable() != null);
- }
- };
- }
-
- private ComponentFinder getFinder() {
- if (finder == null) {
- finder = new ComponentFinder(getNodeView());
- }
- return finder;
- }
-
- public void click(int row, int column, Key.Modifier modifier) {
- Rectangle rect = new Rectangle(0, 0, nodeMainView.getWidth(), nodeMainView.getHeight());
- Mouse.doClickInRectangle(this, rect, false, modifier);
- }
-
- public void rightClick(int row, int column) {
- Rectangle rect = new Rectangle(0, 0, nodeMainView.getWidth(), nodeMainView.getHeight());
- Mouse.doClickInRectangle(this, rect, true, Key.Modifier.NONE);
- }
-
- public void doubleClick(int row, int column) {
- Rectangle rect = new Rectangle(0, 0, nodeMainView.getWidth(), nodeMainView.getHeight());
- Mouse.doClickInRectangle(this, rect, false, Key.Modifier.NONE);
- Mouse.doDoubleClickInRectangle(getAwtComponent(), rect);
- }
-
- public Trigger triggerClick(final int row, final int column, final Key.Modifier modifier) {
- return new Trigger() {
- public void run() throws Exception {
- click(row, column, modifier);
- }
- };
- }
-
- public Trigger triggerRightClick(final int row, final int column) {
- return new Trigger() {
- public void run() throws Exception {
- rightClick(row, column);
- }
- };
- }
-
- public Trigger triggerDoubleClick(final int row, final int column) {
- return new Trigger() {
- public void run() throws Exception {
- doubleClick(row, column);
- }
- };
- }
-
- public void selectAsTheOnlyOneSelected(){
- final NodeView node = getNodeView();
- node.getMap().selectAsTheOnlyOneSelected(node);
- }
-
- public void toggleSelected(){
- final NodeView node = getNodeView();
- node.getModel().setFolded(!node.getModel().isFolded());
- }
-
- public Node getSelected(){
- final NodeView node = getNodeView();
- return new Node(node.getMap().getSelected().getMainView());
- }
-
- public AbstractUIComponent pressKey(Key key) {
- pressKey(nodeMainView, key);
- return this;
- }
-
- private static void pressKey(final Component component, final Key key) {
- int keyCode = key.getCode();
- int modifier = key.getModifier().getCode();
- KeyEvent event = new KeyEvent(component, KeyEvent.KEY_PRESSED, 0, modifier, keyCode, (char)keyCode);
- if (component.getKeyListeners().length > 0) {
- for (int i = 0; i < component.getKeyListeners().length; i++) {
- KeyListener keyListener = component.getKeyListeners()[i];
- keyListener.keyPressed(event);
- }
- }
- SwingUtilities.processKeyBindings(event);
- }
-
-}
diff --git a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/osgi/Activator.java b/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/osgi/Activator.java
deleted file mode 100644
index a611aef..0000000
--- a/freeplane_plugin_uispec4j/src/org/freeplane/uispec4j/osgi/Activator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.freeplane.uispec4j.osgi;
-
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.uispec4j.UISpec4J;
-
-public class Activator implements BundleActivator {
-
- static private BundleContext bundleContext;
-
- public static BundleContext getBundleContext() {
- return bundleContext;
- }
-
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
- */
- public void start(BundleContext context) throws Exception {
- UISpec4J.init();
- Activator.bundleContext = context;
- }
-
- /*
- * (non-Javadoc)
- * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
- */
- public void stop(BundleContext context) throws Exception {
- }
-
-}
diff --git a/freeplane_plugin_workspace/.classpath b/freeplane_plugin_workspace/.classpath
deleted file mode 100644
index e3476c7..0000000
--- a/freeplane_plugin_workspace/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
- <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="src" path="resources"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/freeplane_plugin_workspace/.project b/freeplane_plugin_workspace/.project
deleted file mode 100644
index 6c330db..0000000
--- a/freeplane_plugin_workspace/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>freeplane_plugin_workspace</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.ManifestBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.pde.SchemaBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.pde.PluginNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
diff --git a/freeplane_plugin_workspace/.settings/org.eclipse.core.resources.prefs b/freeplane_plugin_workspace/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 29a8e67..0000000
--- a/freeplane_plugin_workspace/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-encoding//src/org/freeplane/plugin/workspace/components/dialog/NewProjectDialogPanel.java=UTF-8
diff --git a/freeplane_plugin_workspace/.settings/org.eclipse.jdt.core.prefs b/freeplane_plugin_workspace/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 54e493c..0000000
--- a/freeplane_plugin_workspace/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,11 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.6
diff --git a/freeplane_plugin_workspace/.settings/org.eclipse.pde.core.prefs b/freeplane_plugin_workspace/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index 7b49782..0000000
--- a/freeplane_plugin_workspace/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Thu Jul 14 17:01:05 CEST 2011
-eclipse.preferences.version=1
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/freeplane_plugin_workspace/META-INF/MANIFEST.MF b/freeplane_plugin_workspace/META-INF/MANIFEST.MF
deleted file mode 100644
index eaad370..0000000
--- a/freeplane_plugin_workspace/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,35 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: org.freeplane.plugin.workspace
-Bundle-SymbolicName: org.freeplane.plugin.workspace
-Bundle-Version: 2.0.0
-Bundle-Activator: org.freeplane.plugin.workspace.Activator
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Import-Package: org.apache.commons.io,
- org.osgi.framework;version="1.3.0",
- org.osgi.service.url;version="1.0.0"
-Require-Bundle: org.freeplane.core;bundle-version="1.0.1"
-Export-Package: org.freeplane.core.ui,
- org.freeplane.core.user,
- org.freeplane.core.util,
- org.freeplane.lang,
- org.freeplane.plugin.workspace,
- org.freeplane.plugin.workspace.actions,
- org.freeplane.plugin.workspace.components,
- org.freeplane.plugin.workspace.components.dialog,
- org.freeplane.plugin.workspace.components.menu,
- org.freeplane.plugin.workspace.creator,
- org.freeplane.plugin.workspace.dnd,
- org.freeplane.plugin.workspace.event,
- org.freeplane.plugin.workspace.features,
- org.freeplane.plugin.workspace.handler,
- org.freeplane.plugin.workspace.io,
- org.freeplane.plugin.workspace.io.annotation,
- org.freeplane.plugin.workspace.io.xml,
- org.freeplane.plugin.workspace.listener,
- org.freeplane.plugin.workspace.mindmapmode,
- org.freeplane.plugin.workspace.model,
- org.freeplane.plugin.workspace.model.project,
- org.freeplane.plugin.workspace.nodes
-Bundle-ClassPath: lib/plugin.jar
diff --git a/freeplane_plugin_workspace/ant/ant.properties b/freeplane_plugin_workspace/ant/ant.properties
deleted file mode 100644
index 528c7ba..0000000
--- a/freeplane_plugin_workspace/ant/ant.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-plugin.ext.lib = lib
-jgoodies.jar = ${workspace}/freeplane/dist/org.freeplane.core/lib/forms-1.2.1.jar
-commons_io.jar = ${workspace}/freeplane/dist/org.freeplane.core/lib/commons-io-2.4.jar
diff --git a/freeplane_plugin_workspace/ant/build.xml b/freeplane_plugin_workspace/ant/build.xml
deleted file mode 100644
index 4e92955..0000000
--- a/freeplane_plugin_workspace/ant/build.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-<project name="freeplane_workspace" default="dist" basedir="..">
- <property name="workspace" location=".." />
- <property name="src" value="src" />
- <property name="resources" value="resources" />
- <property name="root" value="."/>
- <property name="osgimanifest" value="${root}/META-INF/MANIFEST.MF" />
- <property file="${workspace}/freeplane_framework/ant/ant.properties" />
- <property file="${workspace}/freeplane/ant/ant.properties" />
- <property file="ant/ant.properties" />
- <property name="external.jars" value="${commons_io.jar}" />
- <property name="build" value="${root}/build" />
- <property name="build" value="${root}/build" />
- <property name="dist" value="${root}/dist" />
- <property name="dist.osgi.dir" value="${dist}/org.freeplane.plugin.workspace" />
- <property name="freeplaneplugin.jar" value="${dist}/org.freeplane.plugin.workspace.jar"/>
- <property name="debug" value="on" />
- <property name="java_source_version" value="1.5" />
- <property name="java_target_version" value="1.5" />
- <property name="build.compiler" value="modern" />
- <property name="classpath" value="${framework.jar}:${freeplane.jars}:${external.jars}:${jhall.jar}:${plugin.jar}:${jgoodies.jar}"/>
-
- <target name="build">
- <mkdir dir="${build}" />
- <javac srcdir="${src}" destdir="${build}" classpath="${classpath}" debug="${debug}"
- source="${java_source_version}" target="${java_target_version}" encoding="utf8">
- </javac>
- </target>
-
-
- <target name="dist" depends="build">
- <jar jarfile="lib/plugin.jar">
- <fileset dir="${build}"/>
- <fileset dir="${resources}"/>
- <fileset dir="${src}">
- <include name="**/*.xml"/>
- <include name="**/*.properties"/>
- </fileset>
- </jar>
- <delete dir="${dist.osgi.dir}" quiet="true"/>
- <mkdir dir="${dist.osgi.dir}" />
- <copy todir="${dist.osgi.dir}">
- <fileset dir="${root}">
- <include name="lib/**"/>
- </fileset>
- </copy>
- <mkdir dir="${dist.osgi.dir}/META-INF" />
- <copy tofile="${dist.osgi.dir}/META-INF/MANIFEST.MF" file="${osgimanifest}"/>
- <delete file="lib/plugin.jar" quiet="true"/>
- </target>
-
- <target name="osgi_dist_as_jar" depends="dist">
- <jar jarfile="${freeplaneplugin.jar}">
- <fileset dir="${dist.osgi.dir}">
- <include name="**" />
- </fileset>
- </jar>
- </target>
-
- <target name="clean">
- <delete dir="${build}" quiet="true"/>
- <delete dir="${dist}" quiet="true"/>
- <delete>
- <fileset defaultexcludes="no" dir="${src}" includes="**/*~"/>
- </delete>
- </target>
-
-</project>
-
diff --git a/freeplane_plugin_workspace/infinitest.filters b/freeplane_plugin_workspace/infinitest.filters
deleted file mode 100644
index 9abb766..0000000
--- a/freeplane_plugin_workspace/infinitest.filters
+++ /dev/null
@@ -1 +0,0 @@
-.*
\ No newline at end of file
diff --git a/freeplane_plugin_workspace/resources/conf/fileIcons.properties b/freeplane_plugin_workspace/resources/conf/fileIcons.properties
deleted file mode 100644
index 063bcb4..0000000
--- a/freeplane_plugin_workspace/resources/conf/fileIcons.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-filetypes=mindmap;pdf
-#mindmap.icon=/images/Freeplane_frame_icon.png
-mindmap.icon=/images/docear16.png
-mindmap.extensions=mm
-pdf.icon=/images/16x16/acrobat.png
-pdf.extensions=pdf
-default.icon=/images/16x16/text-x-preview.png
diff --git a/freeplane_plugin_workspace/resources/conf/filenodetypes.properties b/freeplane_plugin_workspace/resources/conf/filenodetypes.properties
deleted file mode 100644
index 01f3600..0000000
--- a/freeplane_plugin_workspace/resources/conf/filenodetypes.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-org.freeplane.plugin.workspace.creator.DefaultFileNodeCreator = default_handle
-org.freeplane.plugin.workspace.creator.FolderFileNodeCreator = directory_handle
\ No newline at end of file
diff --git a/freeplane_plugin_workspace/resources/conf/workspace_default.xml b/freeplane_plugin_workspace/resources/conf/workspace_default.xml
deleted file mode 100644
index 11979cd..0000000
--- a/freeplane_plugin_workspace/resources/conf/workspace_default.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<workspace name="My Workspace" version="1.0" meta="docear">
- <folder type="virtual" name="Mindmaps">
- <folder type="physical" path="workspace:/mindmaps/" />
- </folder>
-
- <folder type="virtual" name="Miscellaneous" >
- <link type="file" path="workspace:/mindmaps/new_mindmap.mm" />
- <link type="file" path="workspace:/other_mindmap.mm" />
- </folder>
-
-</workspace>
diff --git a/freeplane_plugin_workspace/resources/conf/workspace_default_docear.xml b/freeplane_plugin_workspace/resources/conf/workspace_default_docear.xml
deleted file mode 100644
index cb52945..0000000
--- a/freeplane_plugin_workspace/resources/conf/workspace_default_docear.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<workspace name="My Workspace" version="1.0" meta="docear">
- <folder name="Library" type="library" system="true">
- <link type="incoming" name="Incoming" path="workspace:/@@PROFILENAME@@/library/incoming.mm" window="new" system="true" />
- <link type="literature_annotations" name="Literature & Annotations" path="workspace:/@@PROFILENAME@@/library/literature_and_annotations.mm" system="true" />
- <link type="my_publications" name="My Publications" path="workspace:/@@PROFILENAME@@/library/my_publications.mm" system="true" />
- </folder>
- <folder type="literature_repository" path="" system="true" />
- <folder type="projects" name="Projects" path="" monitor="false" system="true"/>
- <link type="references" path="" system="true" />
-
- <folder type="virtual" name="Miscellaneous" >
- </folder>
-
-</workspace>
diff --git a/freeplane_plugin_workspace/resources/images/16x16/acrobat.png b/freeplane_plugin_workspace/resources/images/16x16/acrobat.png
deleted file mode 100644
index a11a2ba..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/acrobat.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/box.png b/freeplane_plugin_workspace/resources/images/16x16/box.png
deleted file mode 100644
index e9550dd..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/box.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/cross.png b/freeplane_plugin_workspace/resources/images/16x16/cross.png
deleted file mode 100644
index eb5c0f4..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/cross.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/dialog-warning-4.png b/freeplane_plugin_workspace/resources/images/16x16/dialog-warning-4.png
deleted file mode 100644
index e6d163b..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/dialog-warning-4.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/docear16.png b/freeplane_plugin_workspace/resources/images/16x16/docear16.png
deleted file mode 100644
index b5c450c..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/docear16.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/document-close-2.png b/freeplane_plugin_workspace/resources/images/16x16/document-close-2.png
deleted file mode 100644
index 5364649..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/document-close-2.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/document-delete.png b/freeplane_plugin_workspace/resources/images/16x16/document-delete.png
deleted file mode 100644
index 69d7714..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/document-delete.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/document-new-6.png b/freeplane_plugin_workspace/resources/images/16x16/document-new-6.png
deleted file mode 100644
index cf309fb..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/document-new-6.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/drive-harddisk_mount-2.png b/freeplane_plugin_workspace/resources/images/16x16/drive-harddisk_mount-2.png
deleted file mode 100644
index cd90445..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/drive-harddisk_mount-2.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/edit-delete-5.png b/freeplane_plugin_workspace/resources/images/16x16/edit-delete-5.png
deleted file mode 100644
index 0fc4b13..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/edit-delete-5.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/emblem-documents.png b/freeplane_plugin_workspace/resources/images/16x16/emblem-documents.png
deleted file mode 100644
index fc2abb7..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/emblem-documents.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/emblem-package-2.png b/freeplane_plugin_workspace/resources/images/16x16/emblem-package-2.png
deleted file mode 100644
index 47f6e50..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/emblem-package-2.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/folder-blue.png b/freeplane_plugin_workspace/resources/images/16x16/folder-blue.png
deleted file mode 100644
index 329d6eb..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/folder-blue.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/folder-blue_open.png b/freeplane_plugin_workspace/resources/images/16x16/folder-blue_open.png
deleted file mode 100644
index 7bb7579..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/folder-blue_open.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/folder-orange-missing.png b/freeplane_plugin_workspace/resources/images/16x16/folder-orange-missing.png
deleted file mode 100644
index 1146c9c..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/folder-orange-missing.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/folder-orange.png b/freeplane_plugin_workspace/resources/images/16x16/folder-orange.png
deleted file mode 100644
index 536b303..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/folder-orange.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/folder-orange_open.png b/freeplane_plugin_workspace/resources/images/16x16/folder-orange_open.png
deleted file mode 100644
index aa2749f..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/folder-orange_open.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/folder-red.png b/freeplane_plugin_workspace/resources/images/16x16/folder-red.png
deleted file mode 100644
index 899a862..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/folder-red.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/folder-red_open.png b/freeplane_plugin_workspace/resources/images/16x16/folder-red_open.png
deleted file mode 100644
index 247dd00..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/folder-red_open.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/folder-sync.png b/freeplane_plugin_workspace/resources/images/16x16/folder-sync.png
deleted file mode 100644
index 2e9472b..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/folder-sync.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/image-x-generic.png b/freeplane_plugin_workspace/resources/images/16x16/image-x-generic.png
deleted file mode 100644
index 18e3c4a..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/image-x-generic.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/object-group-2.png b/freeplane_plugin_workspace/resources/images/16x16/object-group-2.png
deleted file mode 100644
index dc50bb9..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/object-group-2.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/package.png b/freeplane_plugin_workspace/resources/images/16x16/package.png
deleted file mode 100644
index a0af7d9..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/package.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/preferences-desktop-filetype-association.png b/freeplane_plugin_workspace/resources/images/16x16/preferences-desktop-filetype-association.png
deleted file mode 100644
index 4c31118..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/preferences-desktop-filetype-association.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/text-html-2.png b/freeplane_plugin_workspace/resources/images/16x16/text-html-2.png
deleted file mode 100644
index 1dab581..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/text-html-2.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/text-x-preview.png b/freeplane_plugin_workspace/resources/images/16x16/text-x-preview.png
deleted file mode 100644
index 5f7d6e8..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/text-x-preview.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/view-refresh-4.png b/freeplane_plugin_workspace/resources/images/16x16/view-refresh-4.png
deleted file mode 100644
index fbef1de..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/view-refresh-4.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/16x16/x-office-document.png b/freeplane_plugin_workspace/resources/images/16x16/x-office-document.png
deleted file mode 100644
index aec7bda..0000000
Binary files a/freeplane_plugin_workspace/resources/images/16x16/x-office-document.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/images/project-open-2.png b/freeplane_plugin_workspace/resources/images/project-open-2.png
deleted file mode 100644
index d6803f4..0000000
Binary files a/freeplane_plugin_workspace/resources/images/project-open-2.png and /dev/null differ
diff --git a/freeplane_plugin_workspace/resources/translations/Resources_en.properties b/freeplane_plugin_workspace/resources/translations/Resources_en.properties
deleted file mode 100644
index 44b1afd..0000000
--- a/freeplane_plugin_workspace/resources/translations/Resources_en.properties
+++ /dev/null
@@ -1,116 +0,0 @@
-OptionPanel.relative_to_workspace = Relative to project home
-show_workspace.text = Show Workspace
-OptionPanel.workspace=Workspace
-OptionPanel.separator.workspace_main_options=Main Options
-OptionPanel.workspace_location=Location
-OptionPanel.workspace_location_new=Location
-confirm_create_workspace_text=You are going to create a new Workspace Structure at\:
-confirm_create_workspace_title=Create workspace
-confirm_delete_file_action=Do you really want to delete the file?
-confirm_delete_file_action_title=Delete file
-confirm_rename_file_action=Rename file To
-error_rename_file=Could not rename the file.
-error_rename_file_title=Error
-no_location_set=Please choose a location for your workspace
-browse=Browse...
-ok=Ok
-cancel=Cancel
-add_new_mindmap=Please insert the file name of the new map.
-add_new_mindmap_title=Add new map
-error_file_exists=A file with the given name already exists.
-error_file_exists_title=File already exists
-error_create_workspace_folder=Could not create workspace folder at\:
-error_create_workspace_folder_title=Workspace Folder
-enter_group_name=Enter name
-workspace.profile.new=New profile ...
-new_profile_name=New profile name
-workspace_chooser_help=Please choose the "root directory" that contains all your data,
-#{0} = operating system specific drive letter (for win e.g. 'C:\' or for posix the user home path); {1} = absolute user home path; {2} = lower case application name
-workspace_chooser_help_2= e.g. {1}\\{2}_workspace\\
-
-workspace.node.link.notfound=The linked {0} "{1}" in "{2}" was either deleted or moved. \nPlease refresh the parent folder or remove the node from your workspace.
-workspace.node.link.notfound.directory=directory
-workspace.node.link.notfound.file=file
-
-workspace.node.root.name=Your Projects
-
-org.freeplane.plugin.workspace.nodes.foldertypemyfilesnode.name=My files
-org.freeplane.plugin.workspace.nodes.miscnode.name=Misc
-
-fileexistsdialogpanel.file.text={0} already exists in {1}. Do you want to overwrite it?
-fileexistsdialogpanel.dir.text=Directory {0} already exists in {1}. Do you want to merge them?
-fileexistsdialogpanel.apply2all=Apply to all files
-workspace.fileexists.title.1=Copy destination already exists...
-workspace.fileexists.title.2=Move destination already exists...
-workspace.directory.merge.title=Directory already exists...
-
-
-##################################################
-# workspace main menu entries
-##################################################
-menu.project.entry.label=Project
-
-##################################################
-# workspace actions
-##################################################
-workspace.action.new.label=Add
-workspace.action.location.change.label=Switch Workspace ...
-workspace.action.all.expand.label=Expand Tree
-workspace.action.all.collapse.label=Collapse Tree
-workspace.action.hide.label=Workspace Enabled
-workspace.action.node.refresh.label=Refresh
-
-workspace.action.node.remove.label=Remove from workspace
-workspace.action.node.remove.confirm.text=Do you really want to remove "{0}" from your workspace?
-workspace.action.node.remove.confirm.title=Remove Entry
-workspace.action.project.remove.label= Remove project
-workspace.action.node.new.project.dialog.title=Create new project...
-newprojectdialogpanel.help=Choose a name and the directory for the new project...
-newprojectdialogpanel.name.label=Project name:
-newprojectdialogpanel.name.default=New Project
-newprojectdialogpanel.path.label=Project path:
-newprojectdialogpanel.button.tip=Choose a directory...
-newprojectdialogpanel.warn1=A project with this name already exists in the workspace
-newprojectdialogpanel.warn2=A project for this path already exists in the workspace
-
-workspace.action.project.import.label=Import project...
-importprojectdialogpanel.help=<html>Select the home directory where the project is located <br />and choose between the versions ...</html>
-importprojectdialogpanel.warn1=This directory does not contain any project information
-importprojectdialogpanel.warn2=Please select a project version
-importprojectdialogpanel.warn3=The selected project version is already loaded
-importprojectdialogpanel.path.label=Project home:
-importprojectdialogpanel.button.tip=Choose project home directory...
-importprojectdialogpanel.name.label=Project version:
-workspace.action.node.import.project.dialog.title=Import project
-
-workspace.action.project.new.label=New project...
-workspace.action.node.new.folder.label=New folder...
-workspace.action.node.new.folder.dialog.title=Create new folder...
-workspace.action.node.new.folder.dialog.parent.label=In path:
-workspace.action.node.new.folder.dialog.virtual.label=Folder
-workspace.action.node.new.folder.dialog.disk.label=Link with folder from your disk
-workspace.action.node.new.folder.dialog.input1.label=Name:
-workspace.action.node.new.folder.dialog.input1.default=new folder
-workspace.action.node.new.folder.dialog.input2.label=Folder:
-workspace.action.node.new.link.label=New link to file...
-
-workspace.action.node.open.location.label=Open location
-
-workspace.action.node.copy.label=Copy
-workspace.action.node.cut.label=Cut
-workspace.action.node.paste.label=Paste
-
-workspace.action.node.rename.label=Rename
-workspace.action.file.new.mindmap.label=Mindmap ...
-
-workspace.action.file.new.directory.label=Directory ...
-workspace.action.file.new.directory.title=Create new directory
-
-workspace.action.file.new.file.label=File ...
-
-workspace.action.file.delete.label=Delete from disk
-workspace.action.file.delete.confirm.text=Do you really want to delete "{0}" from your disk?
-workspace.action.file.delete.confirm.title=Delete from disk
-
-workspace.action.node.enable.monitoring.label=Observe for Changes
-workspace.action.node.physical.sort.label=Sort descending
diff --git a/freeplane_plugin_workspace/src/org/freeplane/core/ui/FreeplaneActionCascade.java b/freeplane_plugin_workspace/src/org/freeplane/core/ui/FreeplaneActionCascade.java
deleted file mode 100644
index 674a2f6..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/core/ui/FreeplaneActionCascade.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 02.12.2011
- */
-package org.freeplane.core.ui;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.freeplane.features.mode.Controller;
-
-/**
- *
- */
-public class FreeplaneActionCascade {
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public static void addAction(AFreeplaneAction action) {
- AFreeplaneAction previousAction = Controller.getCurrentController().getAction(action.getKey());
- if(previousAction != null) {
- Controller.getCurrentController().removeAction(action.getKey());
- }
- Controller.getCurrentController().addAction(new FreeplaneActionMultiCaster(previousAction, action));
- }
-
- public static void insertActionBefore(AFreeplaneAction action) {
- AFreeplaneAction previousAction = Controller.getCurrentController().getAction(action.getKey());
- if(previousAction != null) {
- Controller.getCurrentController().removeAction(action.getKey());
- }
- Controller.getCurrentController().addAction(new FreeplaneActionMultiCaster(action, previousAction));
- }
-
- public static boolean hasAction(String key) {
- return (Controller.getCurrentController().getAction(key) != null);
- }
-
- public static AFreeplaneAction[] getActionsForKey(String key) {
- ArrayList<AFreeplaneAction> list = new ArrayList<AFreeplaneAction>();
- AFreeplaneAction action = Controller.getCurrentController().getAction(key);
- if(action == null) {
- return null;
- }
- if(action instanceof FreeplaneActionMultiCaster) {
- traverseCaster(list, (FreeplaneActionMultiCaster) action);
- }
- else {
- list.add(action);
- }
- return list.toArray(new AFreeplaneAction[]{});
- }
-
- private static void traverseCaster(List<AFreeplaneAction> list, FreeplaneActionMultiCaster caster) {
- if(caster.getB() != null) {
- if(caster.getB() instanceof FreeplaneActionMultiCaster) {
- traverseCaster(list, (FreeplaneActionMultiCaster) caster.getB());
- }
- list.add(caster.getB());
- }
- if(caster.getA() != null) {
- if(caster.getA() instanceof FreeplaneActionMultiCaster) {
- traverseCaster(list, (FreeplaneActionMultiCaster) caster.getA());
- }
- list.add(caster.getA());
- }
-
-
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/core/ui/FreeplaneActionMultiCaster.java b/freeplane_plugin_workspace/src/org/freeplane/core/ui/FreeplaneActionMultiCaster.java
deleted file mode 100644
index 89e268f..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/core/ui/FreeplaneActionMultiCaster.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 02.12.2011
- */
-package org.freeplane.core.ui;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-
-/**
- *
- */
- at EnabledAction(checkOnNodeChange=true)
-public class FreeplaneActionMultiCaster extends AFreeplaneAction {
-
- private static final long serialVersionUID = 1L;
-
- private final AFreeplaneAction a;
- private final AFreeplaneAction b;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public FreeplaneActionMultiCaster(AFreeplaneAction a, AFreeplaneAction b) {
- super(b.getKey());
-
- if(a != null) {
- assert(b.getKey().equals(a.getKey()));
- }
- this.a = a;
- this.b = b;
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public boolean isEnabled() {
- return b.isEnabled();
- }
-
- public void setEnabled() {
- if(a != null && checkEnabledAction(a)) this.a.setEnabled();
- if(b != null && checkEnabledAction(b)) this.b.setEnabled();
- }
-
- public AFreeplaneAction getA() {
- return a;
- }
-
- public AFreeplaneAction getB() {
- return b;
- }
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void actionPerformed(ActionEvent e) {
- if(b != null) b.actionPerformed(e);
- if(a != null) a.actionPerformed(e);
- }
-
- private boolean checkEnabledAction(final AFreeplaneAction action) {
- final EnabledAction annotation = action.getClass().getAnnotation(EnabledAction.class);
- if (annotation == null) {
- return false;
- }
- return annotation.checkOnNodeChange();
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/core/user/IUserAccount.java b/freeplane_plugin_workspace/src/org/freeplane/core/user/IUserAccount.java
deleted file mode 100644
index 2a66515..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/core/user/IUserAccount.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.freeplane.core.user;
-
-public interface IUserAccount {
- public String getName();
- public boolean isEnabled();
- public boolean isActive();
- public void activate();
- public void setEnabled(boolean enabled);
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/core/user/LocalUser.java b/freeplane_plugin_workspace/src/org/freeplane/core/user/LocalUser.java
deleted file mode 100644
index 64e6a8d..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/core/user/LocalUser.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.freeplane.core.user;
-
-public class LocalUser implements IUserAccount {
-
- private final String name;
- private boolean enabled = true;
-
- public LocalUser(String username) {
- this.name = username;
- }
-
- public String getName() {
- return this.name;
- }
-
- public boolean isEnabled() {
- return enabled;
- }
-
- public boolean isActive() {
- return this.equals(UserAccountController.getController().getActiveUser());
- }
-
- public void activate() {
- UserAccountController.getController().setActiveUser(this);
- }
-
- public void setEnabled(boolean enabled) {
- this.enabled = enabled;
- }
-
- public String toString() {
- return "LocalUser["+getName()+(isActive() ? ";active":"")+"]";
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/core/user/UserAccountController.java b/freeplane_plugin_workspace/src/org/freeplane/core/user/UserAccountController.java
deleted file mode 100644
index e9be414..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/core/user/UserAccountController.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.freeplane.core.user;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.mode.Controller;
-
-public class UserAccountController implements IExtension {
-
- private IUserAccount activeUser;
-
-
- public static void install(Controller controller) {
- controller.addExtension(UserAccountController.class, new UserAccountController());
- }
-
- public static UserAccountController getController() {
- return Controller.getCurrentController().getExtension(UserAccountController.class);
- }
-
- public void setActiveUser(IUserAccount user) {
- this.activeUser = user;
- }
-
- public IUserAccount getActiveUser() {
- return this.activeUser;
- }
-
- public List<IUserAccount> getUsers() {
- if(activeUser == null) {
- return Collections.emptyList();
- }
- return Arrays.asList(new IUserAccount[]{activeUser});
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/core/util/UniqueIDCreator.java b/freeplane_plugin_workspace/src/org/freeplane/core/util/UniqueIDCreator.java
deleted file mode 100644
index 6f55246..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/core/util/UniqueIDCreator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.freeplane.core.util;
-
-import java.math.BigInteger;
-import java.security.SecureRandom;
-import java.util.Locale;
-
-public abstract class UniqueIDCreator {
- private static UniqueIDCreator idCreator;
-
- public abstract String uniqueID();
-
- public static void setCreator(UniqueIDCreator creator) {
- idCreator = creator;
- }
-
- public static UniqueIDCreator getCreator() {
- if(idCreator == null) {
- idCreator = new UniqueIDCreator() {
- public String uniqueID() {
- SecureRandom random = new SecureRandom();
- String s = new BigInteger(16*8, random).toString(Character.MAX_RADIX);
- return (Long.toHexString(System.currentTimeMillis())+s).toUpperCase(Locale.ENGLISH);
- }
- };
- }
- return idCreator;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/lang/Destructable.java b/freeplane_plugin_workspace/src/org/freeplane/lang/Destructable.java
deleted file mode 100644
index 2778b82..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/lang/Destructable.java
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 01.11.2011
- */
-package org.freeplane.lang;
-
-/**
- *
- */
-public interface Destructable {
- public void disassociateReferences();
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/Activator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/Activator.java
deleted file mode 100644
index 0f43e97..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/Activator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package org.freeplane.plugin.workspace;
-
-import java.util.Hashtable;
-
-import org.freeplane.core.ui.FreeplaneActionCascade;
-import org.freeplane.core.user.UserAccountController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.main.osgi.IControllerExtensionProvider;
-import org.freeplane.main.osgi.IModeControllerExtensionProvider;
-import org.freeplane.plugin.workspace.actions.WorkspaceQuitAction;
-import org.freeplane.plugin.workspace.features.ProjectURLHandler;
-import org.freeplane.plugin.workspace.features.PropertyUrlHandler;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.service.url.URLConstants;
-import org.osgi.service.url.URLStreamHandlerService;
-
-public class Activator implements BundleActivator {
- public void start(final BundleContext context) throws Exception {
- registerClasspathUrlHandler(context);
-
- context.registerService(IControllerExtensionProvider.class.getName(), new IControllerExtensionProvider() {
- public void installExtension(Controller controller) {
- WorkspaceController.install(controller);
- UserAccountController.install(controller);
- LogUtils.info("Workspace controller installed.");
- startControllerExtensions(context, controller);
- }
- }, null);
-
- final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
- //WORKSPACE - todo(low): list all modes from freeplane controller
- props.put("mode", new String[] { MModeController.MODENAME });
-
- context.registerService(IModeControllerExtensionProvider.class.getName(),
- new IModeControllerExtensionProvider() {
- public void installExtension(ModeController modeController) {
- addToQuitChain();
- WorkspaceController.getController().installMode(modeController);
- startPluginServices(context, modeController);
- WorkspaceController.getController().startModeExtension(modeController);
- }
- }, props);
- }
-
- protected final void addToQuitChain() {
- FreeplaneActionCascade.addAction(new WorkspaceQuitAction());
- }
-
- private void registerClasspathUrlHandler(final BundleContext context) {
- Hashtable<String, String[]> properties = new Hashtable<String, String[]>();
-// properties.put(URLConstants.URL_HANDLER_PROTOCOL, new String[] { WorkspaceController.WORKSPACE_RESOURCE_URL_PROTOCOL });
-// context.registerService(URLStreamHandlerService.class.getName(), new WorkspaceUrlHandler(), properties);
-
- properties = new Hashtable<String, String[]>();
- properties.put(URLConstants.URL_HANDLER_PROTOCOL, new String[] { WorkspaceController.PROJECT_RESOURCE_URL_PROTOCOL });
- context.registerService(URLStreamHandlerService.class.getName(), new ProjectURLHandler(), properties);
-
- properties = new Hashtable<String, String[]>();
- properties.put(URLConstants.URL_HANDLER_PROTOCOL, new String[] { WorkspaceController.PROPERTY_RESOURCE_URL_PROTOCOL });
- context.registerService(URLStreamHandlerService.class.getName(), new PropertyUrlHandler(), properties);
- }
-
- public void stop(BundleContext context) throws Exception {
- LogUtils.info("Workspace: shuting down ...");
-// WorkspaceUtils.saveCurrentConfiguration();
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- protected void startPluginServices(BundleContext context, ModeController modeController) {
- try {
- final ServiceReference[] dependends = context.getServiceReferences(WorkspaceDependingService.class.getName(),
- "(dependsOn="+ WorkspaceDependingService.DEPENDS_ON +")");
- if (dependends != null) {
- for (int i = 0; i < dependends.length; i++) {
- final ServiceReference serviceReference = dependends[i];
- final WorkspaceDependingService service = (WorkspaceDependingService) context.getService(serviceReference);
- service.startPlugin(context, modeController);
- context.ungetService(serviceReference);
- }
- }
- }
- catch (final InvalidSyntaxException e) {
- e.printStackTrace();
- }
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- protected void startControllerExtensions(BundleContext context, Controller controller) {
- try {
- final ServiceReference[] extensions = context.getServiceReferences(IWorkspaceDependingControllerExtension.class.getName(), "(dependsOn="+ WorkspaceDependingService.DEPENDS_ON +")");
- if (extensions != null) {
- for (ServiceReference serviceReference : extensions) {
- final IWorkspaceDependingControllerExtension extension = (IWorkspaceDependingControllerExtension) context.getService(serviceReference);
- extension.installExtension(context, controller);
- context.ungetService(serviceReference);
- }
- }
- }
- catch (final InvalidSyntaxException e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/IWorkspaceDependingControllerExtension.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/IWorkspaceDependingControllerExtension.java
deleted file mode 100644
index 8d5ce2a..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/IWorkspaceDependingControllerExtension.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.freeplane.plugin.workspace;
-
-import org.freeplane.features.mode.Controller;
-import org.osgi.framework.BundleContext;
-
-public interface IWorkspaceDependingControllerExtension {
- public void installExtension(BundleContext context, Controller controller);
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/URIUtils.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/URIUtils.java
deleted file mode 100644
index 0abaff2..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/URIUtils.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package org.freeplane.plugin.workspace;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URL;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.link.NodeLinks;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.url.UrlManager;
-
-public abstract class URIUtils {
-
- public static File getAbsoluteFile(URI path) {
- if(path != null) {
- return getFile(URIUtils.getAbsoluteURI(path));
- }
- return null;
- }
-
- public static URI getAbsoluteURI(URI uri) {
- try {
- return UrlManager.getController().getAbsoluteUri(null, uri);
- } catch (MalformedURLException e) {
- LogUtils.warn("could not resolve URI: "+ e.getMessage());
- }
- return null;
- }
-
- public static URI resolveURI(URI base, URI uri) {
- try {
- if(base == null) {
- return getAbsoluteURI(uri);
- }
- else {
- URL url = null;
- try {
- url = UrlManager.getController().getAbsoluteUrl(base, uri);
- return url.toURI();
- }
- catch (Exception e) {
- try {
- return new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), uri.getFragment());
- }
- catch (Exception ex) {
- LogUtils.warn("could not resolve URI: "+ ex.getMessage());
- }
- }
- }
- } catch (Exception e) {
- LogUtils.warn("could not resolve URI: "+ e.getMessage());
- }
- return null;
- }
-
- public static URI getAbsoluteURI(NodeModel node) {
- if(node == null) {
- return null;
- }
- URI uri = NodeLinks.getValidLink(node);
- try {
- return UrlManager.getController().getAbsoluteUri(node.getMap(), uri);
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- return null;
- }
-
- public static URI getAbsoluteURI(MapModel map) {
- if(map != null) {
- try {
- return map.getURL().toURI();
- } catch (Exception e) {
- LogUtils.info("Exception in "+ URIUtils.class+".getAbsoluteURI(MapModel): "+ e.getMessage());
- }
- }
- return null;
- }
-
- public static File getFile(URI absoluteURI) {
- if(absoluteURI != null) {
- if(!"file".equals(absoluteURI.getScheme())) {
- return null;
- }
- try {
- if(absoluteURI.getRawPath().startsWith("//")) {
- new File("\\\\"+absoluteURI.normalize().getPath());
- }
- else {
- return new File(absoluteURI.normalize());
- }
- }
- catch (Exception e) {
- LogUtils.info("Exception in "+ URIUtils.class+".getFile(URI): "+ e.getMessage());
- }
- }
- return null;
- }
-
- public static URI getRelativeURI(File base, File absoluteFile) {
- try {
- if(base == null) {
- return absoluteFile.toURI();
- }
-
- return LinkController.toLinkTypeDependantURI(base, absoluteFile);
- } catch (Exception e) {
- }
- return null;
- }
-
- public static URI createURI(String value) {
- if(value == null) {
- return null;
- }
- try {
- return LinkController.createURI(value);
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- return null;
- }
-
-
- public static String encodedFilePath(String path) throws IllegalArgumentException {
- try {
- URI uri = new URI("file", null, path, null);
- return uri.getRawPath();
- }
- catch (Exception e) {
- throw new IllegalArgumentException("Exception in org.freeplane.plugin.workspace.URIUtils.encodeFilePath(path): "+e.getMessage());
- }
- }
-
- public static String decodedFilePath(String path) throws IllegalArgumentException {
- try {
- URI uri = new URI(path);
- return uri.getPath();
- }
- catch (Exception e) {
- throw new IllegalArgumentException("Exception in org.freeplane.plugin.workspace.URIUtils.encodeFilePath(path): "+e.getMessage());
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/WorkspaceController.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/WorkspaceController.java
deleted file mode 100644
index 9b91ed5..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/WorkspaceController.java
+++ /dev/null
@@ -1,308 +0,0 @@
-package org.freeplane.plugin.workspace;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URL;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.resources.IFreeplanePropertyListener;
-import org.freeplane.core.resources.OptionPanelController;
-import org.freeplane.core.resources.OptionPanelController.PropertyLoadListener;
-import org.freeplane.core.resources.ResourceBundles;
-import org.freeplane.core.resources.components.IPropertyControl;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.FreeplaneActionCascade;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.plugin.workspace.features.AWorkspaceModeExtension;
-import org.freeplane.plugin.workspace.features.ModeControlAlreadyRegisteredException;
-import org.freeplane.plugin.workspace.features.WorkspaceMapModelExtension;
-import org.freeplane.plugin.workspace.features.WorkspaceModelExtensionWriterReader;
-import org.freeplane.plugin.workspace.io.FileSystemManager;
-import org.freeplane.plugin.workspace.mindmapmode.MModeWorkspaceController;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.WorkspaceModel;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public final class WorkspaceController implements IExtension {
- /**
- * @deprecated -- use PROJECT_RESOURCE_URL_PROTOCOL
- */
- @Deprecated
- public static final String WORKSPACE_RESOURCE_URL_PROTOCOL = "workspace";
- public static final String PROJECT_RESOURCE_URL_PROTOCOL = "project";
- public static final String PROPERTY_RESOURCE_URL_PROTOCOL = "property";
- public static final String WORKSPACE_VERSION = "1.0";
-
- private static WorkspaceController self;
- private static Map<Class<? extends ModeController>, Class<? extends AWorkspaceModeExtension>> modeWorkspaceCtrlMap = new HashMap<Class<? extends ModeController>, Class<? extends AWorkspaceModeExtension>>();
-
- private WorkspaceController(Controller controller) {
- self = this;
- }
-
- public static void addAction(final AFreeplaneAction action) {
- if(action == null) {
- return;
- }
- try {
- Controller.getCurrentController().addAction(action);
- } catch (Exception e) {
- LogUtils.info(WorkspaceController.class + ".addAction(): action "+ action.getKey() +" not added! ("+e.getMessage()+")");
- }
- }
-
- public static void addCascadingAction(final AFreeplaneAction action) {
- if(action == null) {
- return;
- }
- try {
- FreeplaneActionCascade.addAction(action);
- } catch (Exception e) {
- LogUtils.info(WorkspaceController.class + ".addCascadingAction(): action "+ action.getKey() +" not added! ("+e.getMessage()+")");
- }
- }
-
- public static void replaceAction(final AFreeplaneAction action) {
- AFreeplaneAction previousAction = getAction(action.getKey());
- if(previousAction != null) {
- removeAction(action.getKey());
- }
- addAction(action);
- }
-
- public static AFreeplaneAction getAction(final String key) {
- try {
- return Controller.getCurrentController().getAction(key);
- } catch (Exception e) {
- LogUtils.info(WorkspaceController.class + ".getAction(): action "+ key +" not found!");
- }
- return null;
- }
-
- public static AFreeplaneAction removeAction(final String key) {
- try {
- return Controller.getCurrentController().removeAction(key);
- } catch (Exception e) {
- LogUtils.info(WorkspaceController.class + "removeAction(): action "+ key +" not found!");
- }
- return null;
- }
-
- public static void install(Controller controller) {
- if(self == null) {
- new WorkspaceController(controller);
- self.setupLanguage(controller);
- }
- controller.addExtension(WorkspaceController.class, self);
- }
-
- public static WorkspaceController getController() {
- return self;
- }
-
- public static void registerWorkspaceModeExtension(Class<? extends ModeController> modeController, Class<? extends AWorkspaceModeExtension> modeWorkspaceCtrl) throws ModeControlAlreadyRegisteredException {
- synchronized (modeWorkspaceCtrlMap) {
- //WORKSPACE - INFO: allow overwrite?
- if(modeWorkspaceCtrlMap.containsKey(modeController)) {
- throw new ModeControlAlreadyRegisteredException(modeController);
- }
- modeWorkspaceCtrlMap.put(modeController, modeWorkspaceCtrl);
- }
- }
-
- public static void removeWorkspaceModeExtension(Class<? extends ModeController> modeController) {
- synchronized (modeWorkspaceCtrlMap) {
- modeWorkspaceCtrlMap.remove(modeController);
- }
- }
-
- public boolean installMode(ModeController modeController) {
- AWorkspaceModeExtension modeCtrl = modeController.getExtension(AWorkspaceModeExtension.class);
- if(modeCtrl == null) {
- Class<? extends AWorkspaceModeExtension> clazz = modeWorkspaceCtrlMap.get(modeController.getClass());
- if(clazz == null) {
- return false;
- }
- try {
- modeCtrl = clazz.getConstructor(ModeController.class).newInstance(modeController);
- modeController.addExtension(AWorkspaceModeExtension.class, modeCtrl);
- WorkspaceModelExtensionWriterReader.register(modeController);
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- else {
- return true;
- }
- return false;
-
- }
-
- private void setupLanguage(Controller controller) {
- setLanguage();
-
- final OptionPanelController optionController = controller.getOptionPanelController();
-
- optionController.addPropertyLoadListener(new PropertyLoadListener() {
- public void propertiesLoaded(Collection<IPropertyControl> properties) {
- setLanguage();
- }
- });
-
- controller.getResourceController().addPropertyChangeListener(new IFreeplanePropertyListener() {
-
- public void propertyChanged(String propertyName, String newValue, String oldValue) {
- if(propertyName.equalsIgnoreCase("language")){
- setLanguage();
- }
- }
- });
- try {
- WorkspaceController.registerWorkspaceModeExtension(MModeController.class, MModeWorkspaceController.class);
- } catch (ModeControlAlreadyRegisteredException e) {
- e.printStackTrace();
- }
-
- }
-
- private void setLanguage() {
- final String DEFAULT_LANGUAGE = "en";
- ResourceBundles resBundle = ((ResourceBundles)Controller.getCurrentController().getResourceController().getResources());
- String lang = resBundle.getLanguageCode();
- if (lang == null || lang.equals(ResourceBundles.LANGUAGE_AUTOMATIC)) {
- lang = DEFAULT_LANGUAGE;
- }
-
- URL res = this.getClass().getResource("/translations/Resources_"+lang+".properties");
- if (res == null) {
- lang = DEFAULT_LANGUAGE;
- res = this.getClass().getResource("/translations/Resources_"+lang+".properties");
- }
-
- if (res == null) {
- return;
- }
-
- resBundle.addResources(resBundle.getLanguageCode(), res);
- }
-
- public void startModeExtension(ModeController modeController) {
- AWorkspaceModeExtension modeCtrl = modeController.getExtension(AWorkspaceModeExtension.class);
- if(modeCtrl == null) {
- return;
- }
- modeCtrl.start(modeController);
-
- }
-
- public void shutdown() {
- for (String modeName : Controller.getCurrentController().getModes()) {
- ModeController modeController = Controller.getCurrentController().getModeController(modeName);
- AWorkspaceModeExtension modeExt = modeController.getExtension(AWorkspaceModeExtension.class);
- if(modeExt == null) {
- continue;
- }
- modeExt.shutdown();
- }
-
- }
-
- public static WorkspaceModel getCurrentModel() {
- return getCurrentModeExtension().getModel();
- }
-
- public static AWorkspaceModeExtension getModeExtension(ModeController modeController) {
- if(modeController == null) {
- return null;
- }
- return modeController.getExtension(AWorkspaceModeExtension.class);
- }
-
- public static AWorkspaceModeExtension getCurrentModeExtension() {
- return getModeExtension(Controller.getCurrentModeController());
- }
-
- public static FileSystemManager getFileSystemMgr() {
- return new FileSystemManager(getCurrentModeExtension().getFileTypeManager());
- }
-
- public static void loadProject(AWorkspaceProject project) throws IOException {
- getCurrentModeExtension().getProjectLoader().loadProject(project);
- }
-
- public static URI getDefaultProjectHome() {
- return getCurrentModeExtension().getDefaultProjectHome();
- }
-
- public static URI getApplicationHome() {
- String appName = Controller.getCurrentController().getResourceController().getProperty("ApplicationName");
- String homePath = System.getProperty("user.home")+ File.separator + appName;
- return new File(homePath).toURI();
- }
-
- public static URI getApplicationSettingsHome() {
- File home = new File(Compat.getFreeplaneUserDirectory());
- return home.toURI();
- }
-
- public static AWorkspaceProject getCurrentProject() {
- return getCurrentModeExtension().getCurrentProject();
- }
-
- public static AWorkspaceProject getProject(AWorkspaceTreeNode node) {
- return getCurrentModel().getProject(node.getModel());
- }
-
- public static AWorkspaceProject getProject(MapModel map) {
- WorkspaceMapModelExtension wmme = getMapModelExtension(map);
- return wmme.getProject();
- }
-
- public static WorkspaceMapModelExtension getMapModelExtension(MapModel map) {
- return getMapModelExtension(map, true);
- }
-
- public static WorkspaceMapModelExtension getMapModelExtension(MapModel map, boolean createIfNotExists) {
- WorkspaceMapModelExtension wmme = map.getExtension(WorkspaceMapModelExtension.class);
- if(createIfNotExists && wmme == null) {
- wmme = new WorkspaceMapModelExtension();
- map.addExtension(WorkspaceMapModelExtension.class, wmme);
- }
- return wmme;
- }
-
- public static AWorkspaceProject addMapToProject(MapModel map, AWorkspaceProject project) {
- return addMapToProject(map, project, true);
- }
-
- public static AWorkspaceProject addMapToProject(MapModel map, AWorkspaceProject project, boolean overwrite) {
- if(map == null || project == null) {
- throw new IllegalArgumentException("NULL");
- }
- WorkspaceMapModelExtension wmme = getMapModelExtension(map);
- AWorkspaceProject oldProject = wmme.getProject();
- if(overwrite || oldProject == null) {
- wmme.setProject(project);
- }
- return oldProject;
- }
-
- public static void save() {
- getCurrentModeExtension().save();
- }
-
-
-
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/WorkspaceDependingService.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/WorkspaceDependingService.java
deleted file mode 100644
index 6633d45..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/WorkspaceDependingService.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 20.10.2011
- */
-package org.freeplane.plugin.workspace;
-
-import java.util.Collection;
-import java.util.Hashtable;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.ModeController;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-/**
- *
- */
-public abstract class WorkspaceDependingService implements BundleActivator{
- public final static String DEPENDS_ON = "org.freeplane.plugin.workspace";
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public abstract void startPlugin(BundleContext context, ModeController modeController);
-
- protected abstract Collection<IWorkspaceDependingControllerExtension> getControllerExtensions();
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public final void start(BundleContext context) throws Exception {
- final Hashtable<String, String[]> props = new Hashtable<String, String[]>();
- props.put("dependsOn", new String[] { DEPENDS_ON }); //$NON-NLS-1$
-
- Collection<IWorkspaceDependingControllerExtension> extensions = getControllerExtensions();
- if(extensions != null) {
- for(IWorkspaceDependingControllerExtension provider : extensions) {
- try {
- context.registerService(IWorkspaceDependingControllerExtension.class.getName(), provider, props);
- }
- catch (Exception e) {
- LogUtils.warn(provider.getClass() +" has not been registered", e);
- }
- }
- }
- context.registerService(WorkspaceDependingService.class.getName(), this, props);
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/AWorkspaceAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/AWorkspaceAction.java
deleted file mode 100644
index fbceddd..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/AWorkspaceAction.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.net.URL;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JPopupMenu;
-import javax.swing.JTree;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public abstract class AWorkspaceAction extends AFreeplaneAction {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public AWorkspaceAction(String key, String title, Icon icon) {
- super(key, title, icon);
- }
-
- public AWorkspaceAction(String key) {
- super(key, TextUtils.getRawText(key + ".label"), null);
- setIcon();
- }
-
- public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
- setEnabled();
- }
-
- public void setEnabled() {
- setEnabled(true);
- }
-
- public void setSelectedFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
- super.setSelected();
- }
-
- public void afterMapChange(final Object newMap) {
- }
-
- private void setIcon() {
- final String iconResource = ResourceController.getResourceController().getProperty(getIconKey(), null);
- if (iconResource != null) {
- // look in this package
- URL url = this.getClass().getResource(iconResource);
- if (url != null) {
- final ImageIcon icon = new ImageIcon(url);
- putValue(SMALL_ICON, icon);
- return;
- }
- // look in workspace package
- url = WorkspaceController.class.getResource(iconResource);
- if (url != null) {
- final ImageIcon icon = new ImageIcon(url);
- putValue(SMALL_ICON, icon);
- return;
- }
- // look in freeplane package
- url = ResourceController.class.getResource(iconResource);
- if (url != null) {
- final ImageIcon icon = new ImageIcon(url);
- putValue(SMALL_ICON, icon);
- return;
- }
-
- LogUtils.severe("can not load icon '" + iconResource + "'");
- }
- }
-
- protected AWorkspaceTreeNode getNodeFromActionEvent(ActionEvent e) {
- JTree tree = null;
- TreePath path = null;
-
- if(e.getSource() instanceof JTree) {
- tree = (JTree) e.getSource();
- path = tree.getSelectionPath();
- }
- else {
- WorkspacePopupMenu pop = getRootPopupMenu((Component) e.getSource());
- if(pop == null) {
- return null;
- }
- tree = (JTree)pop.getInvoker();
- int x = pop.getInvokerLocation().x;
- int y = pop.getInvokerLocation().y;
-
- path = tree.getClosestPathForLocation(x, y);
- }
-
- if(path == null) {
- return null;
- }
- return (AWorkspaceTreeNode) path.getLastPathComponent();
- }
-
- protected AWorkspaceTreeNode[] getSelectedNodes(ActionEvent e) {
- JTree tree = null;
- if(e.getSource() instanceof JTree) {
- tree = (JTree) e.getSource();
- }
- else {
- WorkspacePopupMenu pop = getRootPopupMenu((Component) e.getSource());
- if(pop == null) {
- return null;
- }
- tree = (JTree)pop.getInvoker();
- }
- AWorkspaceTreeNode[] nodes = new AWorkspaceTreeNode[tree.getSelectionPaths().length];
- int i = 0;
- for(TreePath path : tree.getSelectionPaths()) {
- nodes[i++] = (AWorkspaceTreeNode) path.getLastPathComponent();
- }
- return nodes;
- }
-
-
-
- protected AWorkspaceProject getProjectFromActionEvent(ActionEvent e) {
- AWorkspaceTreeNode node = getNodeFromActionEvent(e);
- if(node == null) {
- return null;
- }
- return WorkspaceController.getProject(node);
- }
-
- public WorkspacePopupMenu getRootPopupMenu(Component component) {
- Component parent = component;
- while(!(parent instanceof WorkspacePopupMenu) && parent != null) {
- if(parent.getParent() == null && parent instanceof JPopupMenu) {
- parent = getRootPopupMenu(((JPopupMenu) parent).getInvoker());
- break;
- }
- else {
- parent = parent.getParent();
- }
- }
- return (WorkspacePopupMenu) parent;
- }
-
- protected Component getComponentFromActionEvent(ActionEvent e) {
- WorkspacePopupMenu pop = getRootPopupMenu((Component) e.getSource()); //(WorkspacePopupMenu)((Component) e.getSource()).getParent();
- JTree tree = (JTree)pop.getInvoker();
- return tree.getComponentAt(pop.getInvokerLocation());
- }
-
- static public boolean checkEnabledOnPopup(final AFreeplaneAction action) {
- if(action instanceof AWorkspaceAction) {
- final CheckEnableOnPopup annotation = action.getClass().getAnnotation(CheckEnableOnPopup.class);
- if (annotation != null) {
- return true;
- }
- }
- return false;
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/FileNodeDeleteAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/FileNodeDeleteAction.java
deleted file mode 100644
index 91623d0..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/FileNodeDeleteAction.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-
-import javax.swing.JOptionPane;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
-
- at CheckEnableOnPopup
-public class FileNodeDeleteAction extends AWorkspaceAction {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public FileNodeDeleteAction() {
- super("workspace.action.file.delete");
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPath) {
- if(node.isSystem()|| !node.isTransferable() || (!(node instanceof DefaultFileNode) && !(node instanceof LinkTypeFileNode))) {
- setEnabled(false);
- }
- else{
- setEnabled();
- }
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void actionPerformed(final ActionEvent e) {
- AWorkspaceTreeNode node = this.getNodeFromActionEvent(e);
- int yesorno = JOptionPane.showConfirmDialog(UITools.getFrame(),
- TextUtils.format("workspace.action.file.delete.confirm.text", node.getName()),
- TextUtils.getText("workspace.action.file.delete.confirm.title"),
- JOptionPane.YES_NO_OPTION);
- if (yesorno == JOptionPane.OK_OPTION) {
- deleteFile(node);
- }
- }
-
- private void deleteFile(final AWorkspaceTreeNode node) {
- if (node instanceof DefaultFileNode) {
- ((DefaultFileNode) node).delete();
- }
- else if (node instanceof LinkTypeFileNode) {
- File file = URIUtils.getAbsoluteFile(((LinkTypeFileNode) node).getLinkURI());
- if(file != null) {
- if(!file.delete()) {
- //show message?
- }
- }
- }
- AWorkspaceTreeNode parent = node.getParent();
- node.getModel().removeNodeFromParent(node);
- parent.refresh();
- parent.getModel().requestSave();
-
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/FileNodeNewFileAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/FileNodeNewFileAction.java
deleted file mode 100644
index 1f6a2f3..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/FileNodeNewFileAction.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 15.11.2011
- */
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.EnabledAction;
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-
- at CheckEnableOnPopup
- at EnabledAction(checkOnNodeChange = true)
-public class FileNodeNewFileAction extends AWorkspaceAction {
-
- private static final long serialVersionUID = 1L;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public FileNodeNewFileAction() {
- super("workspace.action.file.new.file");
- }
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public void setEnabled() {
- setEnabled(false);
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void actionPerformed(ActionEvent e) {
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/FileNodeNewMindmapAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/FileNodeNewMindmapAction.java
deleted file mode 100644
index 441d080..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/FileNodeNewMindmapAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URISyntaxException;
-
-import javax.swing.Icon;
-import javax.swing.JOptionPane;
-
-import org.apache.commons.io.FilenameUtils;
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.n3.nanoxml.XMLParseException;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-
-public class FileNodeNewMindmapAction extends AWorkspaceAction {
-
- private static final long serialVersionUID = 1L;
-
- private static final Icon icon;
-
- static {
- icon = DefaultFileNode.getApplicationIcon();
- }
-
- public FileNodeNewMindmapAction() {
- super("workspace.action.file.new.mindmap", TextUtils.getRawText("workspace.action.file.new.mindmap.label"), icon);
- }
-
- public void actionPerformed(final ActionEvent e) {
- Controller.getCurrentController().selectMode(MModeController.MODENAME);
- AWorkspaceTreeNode targetNode = this.getNodeFromActionEvent(e);
- if(targetNode instanceof IFileSystemRepresentation ) {
- String fileName = JOptionPane.showInputDialog(Controller.getCurrentController().getViewController().getContentPane(),
- TextUtils.getText("add_new_mindmap"), TextUtils.getText("add_new_mindmap_title"),
- JOptionPane.OK_CANCEL_OPTION);
-
- if (fileName != null && fileName.length()>0) {
- if (!fileName.endsWith(".mm")) {
- fileName += ".mm";
- }
- File file = new File(((IFileSystemRepresentation) targetNode).getFile(), fileName);
- try {
- file = WorkspaceController.getFileSystemMgr().createFile(fileName, ((IFileSystemRepresentation) targetNode).getFile());
- if (createNewMindmap(file)) {
- targetNode.refresh();
- }
- }
- catch(Exception ex) {
- JOptionPane.showMessageDialog(UITools.getFrame(), ex.getMessage(), "Error ... ", JOptionPane.ERROR_MESSAGE);
- ex.printStackTrace();
- }
-
-
-
- }
- }
- }
-
- private boolean createNewMindmap(final File f) throws FileNotFoundException, XMLParseException, MalformedURLException, IOException, URISyntaxException {
-// final MMapIO mapIO = (MMapIO) Controller.getCurrentModeController().getExtension(MapIO.class);
- WorkspaceNewMapAction.createNewMap(f.toURI(), FilenameUtils.getBaseName(f.getName()), false);
-
-// try {
-// mapIO.newMap(f.toURI().toURL());
-// } catch (XMLException e) {
-// LogUtils.severe(e);
-// }
-
- return true;
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeCopyAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeCopyAction.java
deleted file mode 100644
index 357978f..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeCopyAction.java
+++ /dev/null
@@ -1,81 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.Transferable;
-import java.awt.event.ActionEvent;
-
-import javax.swing.tree.TreePath;
-
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.dnd.DnDController;
-import org.freeplane.plugin.workspace.dnd.IWorkspaceTransferableCreator;
-import org.freeplane.plugin.workspace.dnd.IWorspaceClipboardOwner;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
- at CheckEnableOnPopup
-public class NodeCopyAction extends AWorkspaceAction {
-
- public static final String KEY = "workspace.action.node.copy";
- private static final long serialVersionUID = 1L;
-
- public NodeCopyAction() {
- super(KEY);
- }
-
- public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
- if(node.isSystem() || !node.isTransferable() || !(node instanceof IWorkspaceTransferableCreator)) {
- setEnabled(false);
- }
- else{
- setEnabled();
- }
- }
-
- public void actionPerformed(final ActionEvent e) {
- AWorkspaceTreeNode[] targetNodes = getSelectedNodes(e);
- WorkspaceTransferable transferable = null;
- for (AWorkspaceTreeNode targetNode : targetNodes) {
- if(targetNode instanceof IWorkspaceTransferableCreator) {
- if(transferable == null) {
- transferable = ((IWorkspaceTransferableCreator)targetNode).getTransferable();
- }
- else {
- transferable.merge(((IWorkspaceTransferableCreator)targetNode).getTransferable());
- }
- }
- }
-
- if(transferable == null) {
- return;
- }
-
- Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, new CopyClipboardOwner(transferable));
-
- }
-
-
- class CopyClipboardOwner implements IWorspaceClipboardOwner {
- private final WorkspaceTransferable transferable;
-
- public CopyClipboardOwner(WorkspaceTransferable transfer) {
- this.transferable = transfer;
- DnDController.getSystemClipboardController().setClipboardOwner(this);
- }
-
- public void lostOwnership(Clipboard clipboard, Transferable contents) {
- if(this.equals(DnDController.getSystemClipboardController().getClipboardOwner()) ) {
- DnDController.getSystemClipboardController().resetClipboardOwner(this);
- if(transferable != null) {
- transferable.refreshNodes();
- }
- }
-
- }
-
- public WorkspaceTransferable getTransferable() {
- return this.transferable;
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeCutAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeCutAction.java
deleted file mode 100644
index c0d3c0e..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeCutAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.Transferable;
-import java.awt.event.ActionEvent;
-
-import javax.swing.tree.TreePath;
-
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.dnd.DnDController;
-import org.freeplane.plugin.workspace.dnd.IWorkspaceTransferableCreator;
-import org.freeplane.plugin.workspace.dnd.IWorspaceClipboardOwner;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-
- at CheckEnableOnPopup
-public class NodeCutAction extends AWorkspaceAction {
-
- public static final String KEY = "workspace.action.node.cut";
- private static final long serialVersionUID = 1L;
-
- public NodeCutAction() {
- super(KEY);
- }
-
- public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
- if(node.isSystem() || !node.isTransferable() || !(node instanceof IWorkspaceTransferableCreator) || (node instanceof DefaultFileNode)) {
- setEnabled(false);
- }
- else{
- setEnabled();
- }
- }
-
- public void actionPerformed(final ActionEvent event) {
- AWorkspaceTreeNode[] targetNodes = getSelectedNodes(event);
- WorkspaceTransferable transferable = null;
- for (AWorkspaceTreeNode targetNode : targetNodes) {
- if(targetNode instanceof IWorkspaceTransferableCreator) {
- if(transferable == null) {
- transferable = ((IWorkspaceTransferableCreator)targetNode).getTransferable();
- }
- else {
- transferable.merge(((IWorkspaceTransferableCreator)targetNode).getTransferable());
- }
- }
- }
- if(transferable == null) {
- return;
- }
- transferable.setAsCopy(false);
- Toolkit.getDefaultToolkit().getSystemClipboard().setContents(transferable, new CutClipboardOwner(transferable));
-
-// AWorkspaceTreeNode parent = targetNode.getParent();
-//
-// targetNode.getModel().cutNodeFromParent(targetNode);
-// if(parent != null) {
-// parent.refresh();
-// //parent.getModel().requestSave();
-// }
-
- }
-
- class CutClipboardOwner implements IWorspaceClipboardOwner {
- private final WorkspaceTransferable transferable;
-
- public CutClipboardOwner(WorkspaceTransferable transfer) {
- this.transferable = transfer;
- DnDController.getSystemClipboardController().setClipboardOwner(this);
- }
-
- public void lostOwnership(Clipboard clipboard, Transferable contents) {
- if(this.equals(DnDController.getSystemClipboardController().getClipboardOwner()) ) {
- DnDController.getSystemClipboardController().resetClipboardOwner(this);
- if(transferable != null) {
- transferable.refreshNodes();
- }
- }
- }
-
- public WorkspaceTransferable getTransferable() {
- return this.transferable;
- }
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeNewFolderAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeNewFolderAction.java
deleted file mode 100644
index 9349700..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeNewFolderAction.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 11.11.2011
- */
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.dialog.WorkspaceNewFolderPanel;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-import org.freeplane.plugin.workspace.nodes.FolderLinkNode;
-import org.freeplane.plugin.workspace.nodes.FolderVirtualNode;
-
-
-public class NodeNewFolderAction extends AWorkspaceAction {
-
- private static final long serialVersionUID = 6126361617680877866L;
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public NodeNewFolderAction() {
- super("workspace.action.node.new.folder");
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void actionPerformed(ActionEvent e) {
- AWorkspaceTreeNode targetNode = null;
- if(e == null || getRootPopupMenu((Component) e.getSource()) == null) {
- targetNode = WorkspaceController.getCurrentProject().getModel().getRoot();
- }
- else {
- targetNode = getNodeFromActionEvent(e);
- }
-
- if(targetNode == null) {
- return;
- }
- AWorkspaceProject project = WorkspaceController.getProject(targetNode);
- int mode = WorkspaceNewFolderPanel.MODE_VIRTUAL_PHYSICAL;
- if(targetNode instanceof IFileSystemRepresentation) {
- mode = WorkspaceNewFolderPanel.MODE_VIRTUAL_ONLY;
- }
- WorkspaceNewFolderPanel dialog = new WorkspaceNewFolderPanel(mode , targetNode);
- int response = JOptionPane.showConfirmDialog(UITools.getFrame(), dialog, TextUtils.getText("workspace.action.node.new.folder.dialog.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
- if(response == JOptionPane.OK_OPTION) {
- String value = dialog.getFolderName();
- if(value == null || value.trim().length() <= 0) {
- //WORKSPACE - ToDo: prepare message, or call this method (with error message) again?
- return;
- }
- if(dialog.isLinkedFolder()) {
- File path = new File(dialog.getLinkPath());
- if (path != null) {
- FolderLinkNode node = new FolderLinkNode();
- node.setName(value);
- URI uri = project.getRelativeURI(path.toURI());
- if(uri == null) {
- node.setPath(path.toURI());
- }
- else {
- node.setPath(uri);
- }
- targetNode.getModel().addNodeTo(node, targetNode);
- node.refresh();
- }
- }
- else {
- if(targetNode instanceof IFileSystemRepresentation) {
- try {
- WorkspaceController.getFileSystemMgr().createDirectory(value, ((IFileSystemRepresentation) targetNode).getFile());
- }
- catch (IOException e1) {
- JOptionPane.showMessageDialog(UITools.getFrame(), e1.getMessage());
- }
- }
- else {
- FolderVirtualNode node = new FolderVirtualNode();
- node.setName(value);
- targetNode.getModel().addNodeTo(node, targetNode);
- }
-
- }
- targetNode.refresh();
- targetNode.getModel().requestSave();
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeNewLinkAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeNewLinkAction.java
deleted file mode 100644
index ed9c12c..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeNewLinkAction.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 11.11.2011
- */
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.net.URI;
-
-import javax.swing.JFileChooser;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-import org.freeplane.plugin.workspace.nodes.AFolderNode;
-import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
-
-/**
- *
- */
-public class NodeNewLinkAction extends AWorkspaceAction {
-
- private static final long serialVersionUID = -2738773226743524919L;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
- public NodeNewLinkAction() {
- super("workspace.action.node.new.link");
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void actionPerformed(ActionEvent e) {
- AWorkspaceTreeNode targetNode = null;
- if(e == null || getRootPopupMenu((Component) e.getSource()) == null) {
- targetNode = WorkspaceController.getCurrentProject().getModel().getRoot();
- }
- else {
- targetNode = getNodeFromActionEvent(e);
- }
-
- if(targetNode == null) {
- return;
- }
- AWorkspaceProject project = WorkspaceController.getProject(targetNode);
- if(targetNode instanceof AFolderNode) {
- JFileChooser chooser = new JFileChooser(URIUtils.getAbsoluteFile(((AFolderNode) targetNode).getPath() == null ? WorkspaceController.getCurrentProject().getProjectHome() : ((AFolderNode) targetNode).getPath()));
- chooser.setMultiSelectionEnabled(false);
- int response = chooser.showOpenDialog(UITools.getFrame());
- if(response == JFileChooser.APPROVE_OPTION) {
- File file = chooser.getSelectedFile();
- if(file != null) {
- LinkTypeFileNode node = new LinkTypeFileNode();
- node.setName(file.getName());
- URI path = chooser.getSelectedFile().toURI();
- if (path == null) {
- return;
- }
- URI uri = project.getRelativeURI(path);
- if(uri == null) {
- node.setLinkURI(path);
- }
- else {
- node.setLinkURI(uri);
- }
- targetNode.getModel().addNodeTo(node, targetNode);
- targetNode.refresh();
- targetNode.getModel().requestSave();
- }
- }
- }
-
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeOpenLocationAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeOpenLocationAction.java
deleted file mode 100644
index 44feaee..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeOpenLocationAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.ProjectRootNode;
-import org.freeplane.plugin.workspace.nodes.WorkspaceRootNode;
-
-public class NodeOpenLocationAction extends AWorkspaceAction {
-
- public static final String KEY = "workspace.action.node.open.location";
-
- private static final long serialVersionUID = 1L;
-
- public NodeOpenLocationAction() {
- super(KEY);
- }
-
- public void actionPerformed(ActionEvent event) {
- AWorkspaceTreeNode targetNode = getNodeFromActionEvent(event);
- if(targetNode instanceof IFileSystemRepresentation) {
- openFolder(((IFileSystemRepresentation) targetNode).getFile());
- }
- else if(targetNode instanceof ProjectRootNode) {
- openFolder(URIUtils.getAbsoluteFile(WorkspaceController.getProject(targetNode).getProjectHome()));
- }
-
- else if(targetNode instanceof WorkspaceRootNode) {
- openFolder(URIUtils.getAbsoluteFile(WorkspaceController.getCurrentModeExtension().getDefaultProjectHome()));
- }
- }
-
- protected void openFolder(File folder) {
- try {
- Controller.getCurrentController().getViewController().openDocument(Compat.fileToUrl(folder));
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodePasteAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodePasteAction.java
deleted file mode 100644
index c02a15f..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodePasteAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.Toolkit;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.DnDConstants;
-import java.awt.event.ActionEvent;
-
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.dnd.DnDController;
-import org.freeplane.plugin.workspace.dnd.NoDropHandlerFoundExeption;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
- at CheckEnableOnPopup
-public class NodePasteAction extends AWorkspaceAction {
-
- public static final String KEY = "workspace.action.node.paste";
- private static final long serialVersionUID = 1L;
-
- public NodePasteAction() {
- super(KEY);
- }
-
- public void setEnabled() {
- try {
- if(Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR)
- || Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR)
- || Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR)
- || Toolkit.getDefaultToolkit().getSystemClipboard().isDataFlavorAvailable(WorkspaceTransferable.WORKSPACE_FREEPLANE_NODE_FLAVOR)
- ) {
- setEnabled(true);
- }
- else {
- setEnabled(false);
- }
- }
- catch (Exception ex) {
- // if the system clipboard has a problem
- LogUtils.warn(ex.getLocalizedMessage());
- }
- }
-
- public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
- if(!DnDController.isDropAllowed(node)) {
- setEnabled(false);
- return;
- }
- super.setEnabledFor(node, selectedPaths);
- }
-
- public void actionPerformed(final ActionEvent e) {
- AWorkspaceTreeNode targetNode = getNodeFromActionEvent(e);
- if(DnDController.isDropAllowed(targetNode)) {
- Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
- Transferable transf = clip.getContents(null);
- if(transf == null) {
- return;
- }
- int dndAction = DnDConstants.ACTION_COPY;
- if(transf.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_MOVE_NODE_FLAVOR)) {
- dndAction = DnDConstants.ACTION_MOVE;
- }
- if(WorkspaceController.getCurrentModeExtension().getView() != null) {
- try {
- WorkspaceController.getCurrentModeExtension().getView().getTransferHandler().handleDrop(targetNode, transf, dndAction);
- if(dndAction == DnDConstants.ACTION_MOVE ) {
- clip.setContents(null, null);
- }
- } catch (NoDropHandlerFoundExeption ex) {
- LogUtils.info("Exception in org.freeplane.plugin.workspace.actions.NodePasteAction.actionPerformed(ActionEvent): "+ ex.getMessage());
- }
- }
- }
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeRefreshAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeRefreshAction.java
deleted file mode 100644
index 9f0ba4e..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeRefreshAction.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.IWorkspaceView;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public class NodeRefreshAction extends AWorkspaceAction {
-
- public static final String KEY = "workspace.action.node.refresh";
- private static final long serialVersionUID = 1L;
-
- public NodeRefreshAction() {
- super(KEY);
- }
-
- public void actionPerformed(final ActionEvent e) {
- AWorkspaceTreeNode[] targetNodes = getSelectedNodes(e);
- for (AWorkspaceTreeNode targetNode : targetNodes) {
- if(targetNode == null) {
- targetNode = WorkspaceController.getCurrentModel().getRoot();
- }
- else {
- targetNode.refresh();
- }
- }
- IWorkspaceView view = WorkspaceController.getCurrentModeExtension().getView();
- if(view != null){
- view.refreshView();
- }
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeRemoveAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeRemoveAction.java
deleted file mode 100644
index 8eb2c31..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeRemoveAction.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 10.11.2011
- */
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.JOptionPane;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-
- at CheckEnableOnPopup
-public class NodeRemoveAction extends AWorkspaceAction {
-
- public static final String KEY = "workspace.action.node.remove";
- private static final long serialVersionUID = -8965412338727545850L;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public NodeRemoveAction() {
- super(KEY);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
- if(node.isSystem() || !node.isTransferable() || node instanceof DefaultFileNode) {
- setEnabled(false);
- }
- else{
- setEnabled();
- }
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- public void actionPerformed(ActionEvent e) {
- AWorkspaceTreeNode[] targetNodes = getSelectedNodes(e);
- if(targetNodes.length <= 0) {
- return;
- }
- String question = "the selected nodes";
- if(targetNodes.length == 1) {
- question = targetNodes[0].getName();
- }
- int option = JOptionPane.showConfirmDialog(
- UITools.getFrame()
- ,TextUtils.format("workspace.action.node.remove.confirm.text", question)
- ,TextUtils.getRawText("workspace.action.node.remove.confirm.title")
- ,JOptionPane.YES_NO_OPTION
- ,JOptionPane.QUESTION_MESSAGE
- );
- if(option == JOptionPane.YES_OPTION) {
- for (AWorkspaceTreeNode targetNode : targetNodes) {
- AWorkspaceTreeNode parent = targetNode.getParent();
- if(targetNode instanceof DefaultFileNode) {
- //WORKSPACE - info: used in case of key events
- ((DefaultFileNode) targetNode).delete();
- }
- else {
- targetNode.getModel().removeNodeFromParent(targetNode);
- }
- if(parent != null) {
- parent.refresh();
- }
-
- }
-
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeRenameAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeRenameAction.java
deleted file mode 100644
index 90d033d..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/NodeRenameAction.java
+++ /dev/null
@@ -1,86 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.JOptionPane;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.components.dialog.NodeRenameDialogPanel;
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.IMutableLinkNode;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-
- at CheckEnableOnPopup
-public class NodeRenameAction extends AWorkspaceAction {
-
- public static final String KEY = "workspace.action.node.rename";
- private static final long serialVersionUID = 1L;
-
- public NodeRenameAction() {
- super(KEY);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
- if(node.isSystem() || selectedPaths.length > 1) {
- setEnabled(false);
- }
- else{
- setEnabled();
- }
- }
-
- public void actionPerformed(final ActionEvent e) {
- AWorkspaceTreeNode targetNode = this.getNodeFromActionEvent(e);
-
- String oldName = targetNode.getName();
- NodeRenameDialogPanel panel;
-// if (targetNode instanceof IMutableLinkNode) {
-// panel = new NodeRenameDialogPanel(oldName, true);
-// }
-// else {
- panel = new NodeRenameDialogPanel(oldName);
- if(targetNode instanceof DefaultFileNode) {
- panel.setCheckboxSelected(true);
- }
-// }
- int okButton = JOptionPane.showConfirmDialog(UITools.getFrame(), panel, TextUtils.getText("confirm_rename_file_action"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
- String newName = panel.getText();
-
- if(okButton != JOptionPane.OK_OPTION || oldName.equals(newName)) {
- return;
- }
-
- if (newName != null) {
- if (targetNode instanceof IMutableLinkNode) {
- if (((IMutableLinkNode) targetNode).changeName(newName, panel.applyChangesForLink())) {
- targetNode.refresh();
- }
- else {
- JOptionPane.showMessageDialog(UITools.getFrame(), TextUtils.getText("error_rename_file"),
- TextUtils.getText("error_rename_file_title"), JOptionPane.ERROR_MESSAGE);
- targetNode.setName(oldName);
- }
- }
- else {
- try {
- targetNode.getModel().changeNodeName(targetNode, newName);
- targetNode.refresh();
- }
- catch(Exception ex) {
- JOptionPane.showMessageDialog(UITools.getFrame(), TextUtils.getText("error_rename_file") + " ("+ex.getMessage()+")",
- TextUtils.getText("error_rename_file_title"), JOptionPane.ERROR_MESSAGE);
- }
- }
-
- }
-
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/PhysicalFolderSortOrderAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/PhysicalFolderSortOrderAction.java
deleted file mode 100644
index f88f930..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/PhysicalFolderSortOrderAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 03.02.2012
- */
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-
-/**
- * PhysicalFolderSortOrderAction
- */
- at CheckEnableOnPopup
- at SelectableAction(checkOnPopup = true)
-public class PhysicalFolderSortOrderAction extends AWorkspaceAction {
- public static final String KEY = "workspace.action.node.physical.sort";
- private static final long serialVersionUID = 1L;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
- public PhysicalFolderSortOrderAction() {
- super(KEY);
- }
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public void setSelectedFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
- if(node instanceof IFileSystemRepresentation) {
- if(((IFileSystemRepresentation) node).orderDescending()) {
- setSelected(true);
- return;
- }
- }
- setSelected(false);
- }
-
- public void setEnabledFor(AWorkspaceTreeNode node, TreePath[] selectedPaths) {
- if(!(node instanceof IFileSystemRepresentation)) {
- setEnabled(false);
- }
- else{
- setEnabled();
- }
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- /**
- *
- */
- public void actionPerformed(ActionEvent e) {
- AWorkspaceTreeNode targetNode = getNodeFromActionEvent(e);
- if(targetNode instanceof IFileSystemRepresentation) {
- if(this.isSelected()==((IFileSystemRepresentation) targetNode).orderDescending()) {
- ((IFileSystemRepresentation) targetNode).orderDescending(!this.isSelected());
- targetNode.refresh();
- }
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceCollapseAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceCollapseAction.java
deleted file mode 100644
index 2480801..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceCollapseAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-import java.util.Enumeration;
-
-import javax.swing.tree.TreeNode;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.IWorkspaceView;
-import org.freeplane.plugin.workspace.model.WorkspaceTreeModel;
-
-public class WorkspaceCollapseAction extends AWorkspaceAction {
-
- private static final long serialVersionUID = 1L;
-
- public WorkspaceCollapseAction() {
- super("workspace.action.all.collapse");
- }
-
- public void actionPerformed(final ActionEvent e) {
- collapseAll(getNodeFromActionEvent(e).getModel());
- }
-
- private static void collapseAll(WorkspaceTreeModel model) {
- TreeNode root = (TreeNode) model.getRoot();
- IWorkspaceView view = WorkspaceController.getCurrentModeExtension().getView();
- TreePath rootPath = new TreePath(root);
- for (Enumeration<?> e=root.children(); e.hasMoreElements();) {
- TreeNode n = (TreeNode) e.nextElement();
- TreePath path = rootPath.pathByAddingChild(n);
- collapseAll(view, model, path);
- }
- }
-
- private static void collapseAll(IWorkspaceView view, WorkspaceTreeModel model, TreePath parent) {
- TreeNode node = (TreeNode) parent.getLastPathComponent();
- if (node.getChildCount() >= 0) {
- for (Enumeration<?> e=node.children(); e.hasMoreElements();) {
- TreeNode n = (TreeNode) e.nextElement();
- TreePath path = parent.pathByAddingChild(n);
- collapseAll(view, model, path);
- }
- }
- view.collapsePath(parent);
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceExpandAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceExpandAction.java
deleted file mode 100644
index fca10dc..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceExpandAction.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.IWorkspaceView;
-import org.freeplane.plugin.workspace.components.TreeView;
-
-public class WorkspaceExpandAction extends AWorkspaceAction {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public WorkspaceExpandAction() {
- super("workspace.action.all.expand");
- }
-
- public void actionPerformed(final ActionEvent e) {
- IWorkspaceView view = WorkspaceController.getCurrentModeExtension().getView();
- if(view instanceof TreeView) {
- ((TreeView) view).expandAll(getNodeFromActionEvent(e));
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceImportProjectAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceImportProjectAction.java
deleted file mode 100644
index 11480f7..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceImportProjectAction.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.io.IOException;
-
-import javax.swing.JButton;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.dialog.ImportProjectDialogPanel;
-import org.freeplane.plugin.workspace.io.IProjectSettingsIOHandler.LOAD_RETURN_TYPE;
-import org.freeplane.plugin.workspace.model.WorkspaceModelException;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public class WorkspaceImportProjectAction extends AWorkspaceAction {
-
- private static final long serialVersionUID = 1L;
- public static final String KEY = "workspace.action.project.import";
-
- public WorkspaceImportProjectAction() {
- super(KEY);
- }
-
- public void actionPerformed(ActionEvent event) {
- final ImportProjectDialogPanel dialog = new ImportProjectDialogPanel();
- dialog.setConfirmButton(new Component() {
- private static final long serialVersionUID = 1L;
- private Component confirmButton;
-
- @Override
- public void setEnabled(boolean b) {
- if(confirmButton == null) {
- findButton(dialog);
- }
- if(confirmButton != null) {
- confirmButton.setEnabled(b);
- }
- }
-
- private void findButton(Component dialog) {
- Component parent = dialog.getParent();
- while(parent != null) {
- if(parent instanceof JOptionPane) {
- //WORKSPACE - test: os other than windows7
- for(Component comp : ((JOptionPane) parent).getComponents()) {
- if(comp instanceof JPanel && ((JPanel) comp).getComponentCount() > 0 && ((JPanel) comp).getComponent(0) instanceof JButton) {
- confirmButton = ((JPanel) comp).getComponent(0);
- }
- }
- }
- parent = parent.getParent();
- }
- }
-
- });
-
- int response = JOptionPane.showConfirmDialog(UITools.getFrame(), dialog, TextUtils.getText("workspace.action.node.import.project.dialog.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
-
- if(response == JOptionPane.OK_OPTION) {
- AWorkspaceProject project = dialog.getProject();
- if(project == null) {
- return;
- }
- WorkspaceController.getCurrentModel().addProject(project);
- try {
- LOAD_RETURN_TYPE return_type = WorkspaceController.getCurrentModeExtension().getProjectLoader().loadProject(project);
- if(return_type == LOAD_RETURN_TYPE.NEW_PROJECT && dialog.getProjectName() != null && dialog.getProjectName().length() > 0) {
- project.getModel().changeNodeName(project.getModel().getRoot(), dialog.getProjectName());
- }
- } catch (IOException e) {
- LogUtils.severe(e);
- } catch (WorkspaceModelException e) {
- LogUtils.severe(e);
- }
- }
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceNewMapAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceNewMapAction.java
deleted file mode 100644
index e16f2f3..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceNewMapAction.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 14.12.2011
- */
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URI;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mapio.MapIO;
-import org.freeplane.features.mapio.mindmapmode.MMapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.plugin.workspace.URIUtils;
-
-/**
- * FIX for issue that a new mindmap is always set to <code>saved</code> by
- * default. This Action is used to set the new mindmap to <code>unsaved</code>
- * right after its creation.
- */
-public class WorkspaceNewMapAction extends AFreeplaneAction {
-
- public static final String KEY = "NewMapAction";
- private static final long serialVersionUID = 1L;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
- /**
- *
- */
- public WorkspaceNewMapAction() {
- super(KEY);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- public static MapModel createNewMap() {
- return createNewMap(null, null, false);
- }
-
- public static MapModel createNewMap(final URI uri, String name, boolean save) {
- if (uri == null) {
- save = false;
- }
-
- File f = URIUtils.getAbsoluteFile(uri);
- if (save) {
- if (!createFolderStructure(f)) {
- return null;
- }
- }
- final MMapIO mapIO = (MMapIO) MModeController.getMModeController().getExtension(MapIO.class);
-
- MapModel map = mapIO.newMapFromDefaultTemplate();
- if (map == null) {
- return null;
- }
-
- if (name != null) {
- //WORKSPACE - fixme: the updates do not show in mapview (ask dimitry)
- //String oldName = map.getRootNode().getText();
- map.getRootNode().setText(name);
- Controller.getCurrentController().getMapViewManager().getMapViewComponent().repaint();
- }
-
- if (save) {
- mapIO.save(map, f);
- }
- else {
- if(f != null) {
- try {
- map.setURL(Compat.fileToUrl(f));
- } catch (MalformedURLException e) {
- LogUtils.warn(WorkspaceNewMapAction.class + ": " + e.getMessage());
- }
- }
- Controller.getCurrentModeController().getMapController().setSaved(map, false);
- }
-
-
- //WORKSPACE - todo: remove the following when the "fixme" above has been fixed
- if(f != null) {
- Controller.getCurrentController().close(true);
- try {
- mapIO.newMap(f.toURI().toURL());
- } catch (Exception e) {
- LogUtils.severe(e);
- }
- }
- return map;
- }
-
- private static boolean createFolderStructure(final File f) {
- final File folder = f.getParentFile();
- if (folder.exists()) {
- return true;
- }
- return folder.mkdirs();
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- /**
- *
- */
- @Override
- public void actionPerformed(ActionEvent e) {
- createNewMap();
-
- }
-
- @Override
- public void afterMapChange(final Object newMap) {
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceNewProjectAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceNewProjectAction.java
deleted file mode 100644
index 9c14c44..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceNewProjectAction.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-import java.io.File;
-import java.io.IOException;
-
-import javax.swing.JButton;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.dialog.NewProjectDialogPanel;
-import org.freeplane.plugin.workspace.io.IProjectSettingsIOHandler.LOAD_RETURN_TYPE;
-import org.freeplane.plugin.workspace.model.WorkspaceModelException;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public class WorkspaceNewProjectAction extends AWorkspaceAction {
-
- private static final long serialVersionUID = 1L;
- public static final String KEY = "workspace.action.project.new";
-
- public WorkspaceNewProjectAction() {
- super(KEY);
- }
-
- public void actionPerformed(ActionEvent event) {
- final NewProjectDialogPanel dialog = new NewProjectDialogPanel();
- dialog.setConfirmButton(new Component() {
- private static final long serialVersionUID = 1L;
- private Component confirmButton;
-
- @Override
- public void setEnabled(boolean b) {
- if(confirmButton == null) {
- findButton(dialog);
- }
- if(confirmButton != null) {
- confirmButton.setEnabled(b);
- }
- }
-
- private void findButton(Component dialog) {
- Component parent = dialog.getParent();
- while(parent != null) {
- if(parent instanceof JOptionPane) {
- //WORKSPACE - test: os other than windows7
- for(Component comp : ((JOptionPane) parent).getComponents()) {
- if(comp instanceof JPanel && ((JPanel) comp).getComponentCount() > 0 && ((JPanel) comp).getComponent(0) instanceof JButton) {
- confirmButton = ((JPanel) comp).getComponent(0);
- }
- }
- }
- parent = parent.getParent();
- }
- }
-
- });
-
- int response = JOptionPane.showConfirmDialog(UITools.getFrame(), dialog, TextUtils.getText("workspace.action.node.new.project.dialog.title"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
-
- if(response == JOptionPane.OK_OPTION) {
- File path = URIUtils.getFile(dialog.getProjectPath());
-
- //WORKSPACE - todo: ask for permission to create the directory or check for always_create setting
- if(!path.exists() ) {
- if(path.mkdirs()) {
- LogUtils.info("new project directory created");
- }
- else {
- LogUtils.info("Error: could not create new project directory");
- }
- }
-
- AWorkspaceProject project = AWorkspaceProject.create(null, path.toURI());
- WorkspaceController.getCurrentModel().addProject(project);
- try {
- LOAD_RETURN_TYPE return_type = WorkspaceController.getCurrentModeExtension().getProjectLoader().loadProject(project);
- if(return_type == LOAD_RETURN_TYPE.NEW_PROJECT && dialog.getProjectName() != null && dialog.getProjectName().length() > 0) {
- project.getModel().changeNodeName(project.getModel().getRoot(), dialog.getProjectName());
- }
- } catch (IOException e) {
- LogUtils.severe(e);
- } catch (WorkspaceModelException e) {
- LogUtils.severe(e);
- }
- }
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceProjectOpenLocationAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceProjectOpenLocationAction.java
deleted file mode 100644
index ff61d3a..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceProjectOpenLocationAction.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
- at CheckEnableOnPopup
-public class WorkspaceProjectOpenLocationAction extends NodeOpenLocationAction {
- private static final long serialVersionUID = 1L;
-
- public WorkspaceProjectOpenLocationAction() {
- super();
- }
-
- @Override
- public void setEnabled() {
- if(WorkspaceController.getCurrentProject() == null) {
- setEnabled(false);
- }
- else {
- setEnabled(true);
- }
- }
-
- public void actionPerformed(ActionEvent event) {
- AWorkspaceProject project = WorkspaceController.getCurrentProject();
- if(project == null) {
- return;
- }
-
- openFolder(URIUtils.getAbsoluteFile(project.getProjectHome()));
-
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceQuitAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceQuitAction.java
deleted file mode 100644
index 6602889..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceQuitAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 21.11.2011
- */
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.QuitAction;
-import org.freeplane.plugin.workspace.WorkspaceController;
-
-
-public class WorkspaceQuitAction extends QuitAction {
-
- private static final long serialVersionUID = 1L;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void actionPerformed(ActionEvent e) {
- LogUtils.info("Workspace: saving all settings ...");
- WorkspaceController.getController().shutdown();
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceRemoveProjectAction.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceRemoveProjectAction.java
deleted file mode 100644
index af56845..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/actions/WorkspaceRemoveProjectAction.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 10.11.2011
- */
-package org.freeplane.plugin.workspace.actions;
-
-import java.awt.event.ActionEvent;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.menu.CheckEnableOnPopup;
-import org.freeplane.plugin.workspace.model.WorkspaceModel;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
- at CheckEnableOnPopup
-public class WorkspaceRemoveProjectAction extends AWorkspaceAction {
-
- public static final String KEY = "workspace.action.project.remove";
- private static final long serialVersionUID = -8965412338727545850L;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public WorkspaceRemoveProjectAction() {
- super(KEY);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- @Override
- public void setEnabled() {
- if(WorkspaceController.getCurrentProject() == null) {
- setEnabled(false);
- }
- else {
- setEnabled(true);
- }
- }
-
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- public void actionPerformed(ActionEvent e) {
- AWorkspaceProject project = WorkspaceController.getCurrentProject();
- if(project == null) {
- return;
- }
- //WORKSPACE - todo: dialog that asks for physical deletion as well
- int option = JOptionPane.showConfirmDialog(
- UITools.getFrame()
- ,TextUtils.format("workspace.action.node.remove.confirm.text", project.getModel().getRoot().getName())
- ,TextUtils.getRawText("workspace.action.node.remove.confirm.title")
- ,JOptionPane.YES_NO_OPTION
- ,JOptionPane.QUESTION_MESSAGE
- );
- if(option == JOptionPane.YES_OPTION) {
- //AWorkspaceTreeNode targetNode = getNodeFromActionEvent(e);
- WorkspaceModel model = WorkspaceController.getCurrentModel();
- //model.removeProject(model.getProject(targetNode.getModel()));
- model.removeProject(project);
- model.getRoot().getModel().requestSave();
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/ExpandedStateHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/ExpandedStateHandler.java
deleted file mode 100644
index 42a8f47..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/ExpandedStateHandler.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.freeplane.plugin.workspace.components;
-
-import java.util.Iterator;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import javax.swing.JTree;
-import javax.swing.event.TreeExpansionEvent;
-import javax.swing.event.TreeExpansionListener;
-import javax.swing.event.TreeModelEvent;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.WorkspaceModel;
-import org.freeplane.plugin.workspace.model.WorkspaceModelEvent;
-import org.freeplane.plugin.workspace.model.WorkspaceModelListener;
-import org.freeplane.plugin.workspace.model.WorkspaceTreeModel;
-
-public class ExpandedStateHandler implements TreeExpansionListener, WorkspaceModelListener {
- private Set<String> expandedNodeKeys = new LinkedHashSet<String>();
- private final JTree treeView;
-
- public ExpandedStateHandler(JTree tree) {
- this.treeView = tree;
- }
-
- public void treeExpanded(TreeExpansionEvent event) {
- final AWorkspaceTreeNode node = (AWorkspaceTreeNode)event.getPath().getLastPathComponent();
- expandedNodeKeys.add(node.getKey());
- }
-
- public void treeCollapsed(TreeExpansionEvent event) {
- final AWorkspaceTreeNode node = (AWorkspaceTreeNode)event.getPath().getLastPathComponent();
- expandedNodeKeys.remove(node.getKey());
-
- }
-
- public void treeNodesChanged(TreeModelEvent e) {
- //setExpandedState((WorkspaceModelEvent) e);
- }
-
- public void treeNodesInserted(TreeModelEvent e) {
- //setExpandedState((WorkspaceModelEvent) e);
- }
-
- public void treeNodesRemoved(TreeModelEvent e) {
- //setExpandedState((WorkspaceModelEvent) e);
- }
-
- public void treeStructureChanged(TreeModelEvent e) {
- WorkspaceTreeModel treeModel = WorkspaceController.getCurrentModel().getRoot().getModel();
- setExpandedStates(treeModel, false);
- }
-
- public void projectAdded(WorkspaceModelEvent event) {
- //setExpandedState(event);
- String key = ((AWorkspaceTreeNode) event.getTreePath().getLastPathComponent()).getKey()+"/"+event.getProject().getProjectID();
- expandedNodeKeys.add(key);
- }
-
- public void projectRemoved(WorkspaceModelEvent event) {
- //setExpandedState(event);
- }
-
- public void registerModel(WorkspaceModel model) {
- if(model == null) {
- return;
- }
- model.removeTreeModelListener(this);
- model.addWorldModelListener(this);
- }
-
- public void setExpandedStates(WorkspaceTreeModel targetModel, boolean cleanInvalidEntries) {
- Iterator<String> iter = expandedNodeKeys.iterator();
- try {
- while(iter.hasNext()) {
- AWorkspaceTreeNode node = targetModel.getNode(iter.next());
- if(node != null) {
- treeView.expandPath(node.getTreePath());
- }
- else {
- if(cleanInvalidEntries) {
- iter.remove();
- }
- }
- }
- }
- catch (Exception e) {
- LogUtils.warn("Exception in org.freeplane.plugin.workspace.components.ExpandedStateHandler.setExpandedStates(targetModel, cleanInvalidEntries): aborted");
- }
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/IWorkspaceView.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/IWorkspaceView.java
deleted file mode 100644
index de5a47e..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/IWorkspaceView.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.freeplane.plugin.workspace.components;
-
-import java.awt.Component;
-
-import javax.swing.tree.TreePath;
-
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferHandler;
-import org.freeplane.plugin.workspace.handler.INodeTypeIconManager;
-import org.freeplane.plugin.workspace.mindmapmode.InputController;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.project.IProjectSelectionListener;
-
-
-public interface IWorkspaceView {
-
- public void expandPath(TreePath treePath);
-
- public void collapsePath(TreePath treePath);
-
- public void refreshView();
-
- public boolean containsComponent(Component comp);
-
- public WorkspaceTransferHandler getTransferHandler();
-
- public TreePath getSelectionPath();
-
- public TreePath getPathForLocation(int x, int y);
-
- public INodeTypeIconManager getNodeTypeIconManager();
-
- public AWorkspaceTreeNode getNodeForLocation(int x, int y);
-
- public void addProjectSelectionListener(IProjectSelectionListener projectSelectionListener);
-
- public InputController getInputController();
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/TreeView.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/TreeView.java
deleted file mode 100644
index fa2f436..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/TreeView.java
+++ /dev/null
@@ -1,318 +0,0 @@
-package org.freeplane.plugin.workspace.components;
-
-import java.awt.BorderLayout;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.event.ComponentListener;
-import java.awt.event.MouseListener;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.BorderFactory;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTextField;
-import javax.swing.JTree;
-import javax.swing.event.TreeModelListener;
-import javax.swing.event.TreeSelectionEvent;
-import javax.swing.event.TreeSelectionListener;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.TreeModel;
-import javax.swing.tree.TreeNode;
-import javax.swing.tree.TreePath;
-import javax.swing.tree.TreeSelectionModel;
-
-import org.freeplane.core.ui.components.OneTouchCollapseResizer.ComponentCollapseListener;
-import org.freeplane.core.ui.components.ResizeEvent;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.dnd.DnDController;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferHandler;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.handler.DefaultNodeTypeIconManager;
-import org.freeplane.plugin.workspace.handler.INodeTypeIconManager;
-import org.freeplane.plugin.workspace.listener.DefaultTreeExpansionListener;
-import org.freeplane.plugin.workspace.listener.DefaultWorkspaceSelectionListener;
-import org.freeplane.plugin.workspace.mindmapmode.DefaultFileDropHandler;
-import org.freeplane.plugin.workspace.mindmapmode.FileFolderDropHandler;
-import org.freeplane.plugin.workspace.mindmapmode.InputController;
-import org.freeplane.plugin.workspace.mindmapmode.VirtualFolderDropHandler;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.WorkspaceModel;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-import org.freeplane.plugin.workspace.model.project.IProjectSelectionListener;
-import org.freeplane.plugin.workspace.model.project.ProjectSelectionEvent;
-import org.freeplane.plugin.workspace.nodes.AFolderNode;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-import org.freeplane.plugin.workspace.nodes.FolderFileNode;
-import org.freeplane.plugin.workspace.nodes.FolderLinkNode;
-import org.freeplane.plugin.workspace.nodes.FolderTypeMyFilesNode;
-import org.freeplane.plugin.workspace.nodes.FolderVirtualNode;
-import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
-import org.freeplane.plugin.workspace.nodes.ProjectRootNode;
-import org.freeplane.plugin.workspace.nodes.WorkspaceRootNode;
-
-public class TreeView extends JPanel implements IWorkspaceView, ComponentCollapseListener {
- private static final long serialVersionUID = 1L;
- private static final int view_margin = 3;
-
- protected JTree mTree;
- protected JTextField m_display;
- private WorkspaceTransferHandler transferHandler;
- private INodeTypeIconManager nodeTypeIconManager;
- private List<IProjectSelectionListener> projectSelectionListeners = new ArrayList<IProjectSelectionListener>();
- private AWorkspaceProject lastSelectedProject;
- private InputController inputController;
- private ExpandedStateHandler expandedStateHandler;
-
- public TreeView() {
- this.setLayout(new BorderLayout());
-
- mTree = new JTree();
- mTree.setBorder(BorderFactory.createEmptyBorder(2, view_margin, view_margin, view_margin));
- mTree.putClientProperty("JTree.lineStyle", "Angled");
- mTree.setCellRenderer(new WorkspaceNodeRenderer());
- mTree.setCellEditor(new WorkspaceCellEditor(mTree, (DefaultTreeCellRenderer) mTree.getCellRenderer()));
- mTree.addTreeExpansionListener(new DefaultTreeExpansionListener());
- mTree.addTreeExpansionListener(getExpandedStateHandler());
- mTree.addTreeSelectionListener(new DefaultWorkspaceSelectionListener());
- mTree.addTreeSelectionListener(getProjectSelectionHandler());
- //WORKSPACE - impl(later): enable multi selection
- mTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
- mTree.addMouseListener(getInputController());
- mTree.addMouseMotionListener(getInputController());
- mTree.addKeyListener(getInputController());
- mTree.setRowHeight(18);
- mTree.setShowsRootHandles(false);
- mTree.setEditable(true);
-
- this.transferHandler = WorkspaceTransferHandler.configureDragAndDrop(mTree);
-
- initTransferHandler();
-
-
- this.add(new JScrollPane(mTree), BorderLayout.CENTER);
-
- }
-
- private ExpandedStateHandler getExpandedStateHandler() {
- if(expandedStateHandler == null) {
- expandedStateHandler = new ExpandedStateHandler(mTree);
- }
- return expandedStateHandler;
- }
-
- private void initTransferHandler() {
- getTransferHandler().registerNodeDropHandler(DefaultFileNode.class, new DefaultFileDropHandler());
-
- getTransferHandler().registerNodeDropHandler(FolderFileNode.class, new FileFolderDropHandler());
- getTransferHandler().registerNodeDropHandler(FolderLinkNode.class, new FileFolderDropHandler());
- getTransferHandler().registerNodeDropHandler(FolderTypeMyFilesNode.class, new FileFolderDropHandler());
-
- getTransferHandler().registerNodeDropHandler(FolderVirtualNode.class, new VirtualFolderDropHandler());
- getTransferHandler().registerNodeDropHandler(ProjectRootNode.class, new VirtualFolderDropHandler());
-
- //default fallback for folder
- getTransferHandler().registerNodeDropHandler(AFolderNode.class, new VirtualFolderDropHandler());
-
- DnDController.excludeFromDND(WorkspaceRootNode.class);
- DnDController.excludeFromDND(LinkTypeFileNode.class);
- DnDController.excludeFromDND(DefaultFileNode.class);
- }
-
- public InputController getInputController() {
- if(inputController == null) {
- inputController = new InputController();
- }
- return inputController;
- }
-
- private TreeSelectionListener getProjectSelectionHandler() {
- return new TreeSelectionListener() {
- public void valueChanged(TreeSelectionEvent e) {
- try {
- AWorkspaceProject selected = WorkspaceController.getCurrentModel().getProject(((AWorkspaceTreeNode) e.getNewLeadSelectionPath().getLastPathComponent()).getModel());
- if(selected != lastSelectedProject) {
- fireProjectSelectionChanged(selected);
- }
- }
- catch (Exception ex) {
- // just for convenience, ignore everything
- }
- }
- };
- }
-
- public void addTreeMouseListener(MouseListener l) {
- this.mTree.addMouseListener(l);
- }
-
- public void addTreeComponentListener(ComponentListener l) {
- this.mTree.addComponentListener(l);
- }
-
- public void setPreferredSize(Dimension size) {
- super.setPreferredSize(new Dimension(Math.max(size.width, getMinimumSize().width), Math.max(size.height, getMinimumSize().height)));
- }
-
- public void expandPath(TreePath treePath) {
- mTree.expandPath(treePath);
- }
-
- public void collapsePath(TreePath treePath) {
- mTree.collapsePath(treePath);
- }
-
- public void refreshView() {
- getExpandedStateHandler().setExpandedStates(((AWorkspaceTreeNode)mTree.getModel().getRoot()).getModel(), true);
- }
-
- public void setModel(WorkspaceModel model) {
- if(model instanceof TreeModel) {
- mTree.setModel((TreeModel) model);
- }
- else {
- mTree.setModel(new TreeModelProxy(model));
- }
- getExpandedStateHandler().registerModel(model);
- }
-
- public WorkspaceTransferHandler getTransferHandler() {
- return this.transferHandler;
- }
-
- public void addSelectionPath(TreePath path) {
- mTree.addSelectionPath(path);
- }
-
- public class TreeModelProxy implements TreeModel {
- private final WorkspaceModel model;
-
- public TreeModelProxy(WorkspaceModel model) {
- this.model = model;
- }
-
- public Object getRoot() {
- if(model == null) return null;
- return model.getRoot();
- }
-
- public Object getChild(Object parent, int index) {
- if(parent == null) return null;
- return ((AWorkspaceTreeNode) parent).getChildAt(index);
- }
-
- public int getChildCount(Object parent) {
- if(parent == null) return 0;
- return ((AWorkspaceTreeNode) parent).getChildCount();
- }
-
- public boolean isLeaf(Object node) {
- return ((AWorkspaceTreeNode) node).isLeaf();
- }
-
- public void valueForPathChanged(TreePath path, Object newValue) {
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
- if (node instanceof IWorkspaceNodeActionListener) {
- ((IWorkspaceNodeActionListener) node).handleAction(new WorkspaceActionEvent(node, WorkspaceActionEvent.WSNODE_CHANGED, newValue));
- //nodeChanged(node);
- }
- else {
- node.setName(newValue.toString());
- }
- }
-
- public int getIndexOfChild(Object parent, Object child) {
- return ((AWorkspaceTreeNode) parent).getIndex((TreeNode) child);
- }
-
- public void addTreeModelListener(TreeModelListener l) {
- this.model.addTreeModelListener(l);
- }
-
- public void removeTreeModelListener(TreeModelListener l) {
- this.model.removeTreeModelListener(l);
- }
-
- }
-
- public boolean containsComponent(Component comp) {
- if(this.equals(comp)) {
- return true;
- }
- else if(mTree.equals(comp)) {
- return true;
- }
- return false;
- }
-
- public TreePath getSelectionPath() {
- return mTree.getSelectionPath();
- }
-
- public TreePath getPathForLocation(int x, int y) {
- return mTree.getClosestPathForLocation(x, y);
- }
-
- public INodeTypeIconManager getNodeTypeIconManager() {
- if(nodeTypeIconManager == null) {
- nodeTypeIconManager = new DefaultNodeTypeIconManager();
- }
- return nodeTypeIconManager;
- }
-
- public void componentCollapsed(ResizeEvent event) {
- if(this.equals(event.getSource())) {
- super.setPreferredSize(new Dimension(0, getPreferredSize().height));
- }
- }
-
- public void componentExpanded(ResizeEvent event) {
- if(this.equals(event.getSource())) {
- // nothing
- }
- }
-
- public AWorkspaceTreeNode getNodeForLocation(int x, int y) {
- TreePath path = mTree.getPathForLocation(x, y);
- if(path == null) {
- return null;
- }
- return (AWorkspaceTreeNode) path.getLastPathComponent();
- }
-
- public void addProjectSelectionListener(IProjectSelectionListener listener) {
- if(listener == null) {
- return;
- }
- synchronized (projectSelectionListeners ) {
- projectSelectionListeners.add(listener);
- }
- }
-
- private void fireProjectSelectionChanged(AWorkspaceProject selected) {
-// if(selected == null) {
-// return;
-// }
- ProjectSelectionEvent event = new ProjectSelectionEvent(this, selected, this.lastSelectedProject);
- this.lastSelectedProject = selected;
- synchronized (projectSelectionListeners ) {
- for (IProjectSelectionListener listener : projectSelectionListeners) {
- listener.selectionChanged(event);
- }
- }
-
- }
-
- public void expandAll(AWorkspaceTreeNode nodeFromActionEvent) {
- for (int i = 1; i < mTree.getRowCount(); i++) {
- mTree.expandRow(i);
- }
- }
-
- public final static String BOTTOM_TOOLBAR_STACK = BorderLayout.SOUTH;
- public final static String TOP_TOOLBAR_STACK = BorderLayout.NORTH;
- public void addToolBar(Component comp, String toolBarStack) {
- this.add(comp, toolBarStack);
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/WorkspaceCellEditor.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/WorkspaceCellEditor.java
deleted file mode 100644
index 7550461..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/WorkspaceCellEditor.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 24.07.2011
- */
-package org.freeplane.plugin.workspace.components;
-
-import java.awt.Component;
-import java.awt.event.MouseEvent;
-import java.util.EventObject;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JTree;
-import javax.swing.tree.DefaultTreeCellEditor;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.AFolderNode;
-
-/**
- *
- */
-public class WorkspaceCellEditor extends DefaultTreeCellEditor {
-
- private static final Icon DEFAULT_ICON = new ImageIcon(WorkspaceNodeRenderer.class.getResource("/images/16x16/text-x-preview.png"));
- private static final Icon DEFAULT_FOLDER_CLOSED_ICON = new ImageIcon(WorkspaceNodeRenderer.class.getResource("/images/16x16/folder-blue.png"));
- private static final Icon DEFAULT_FOLDER_OPEN_ICON = new ImageIcon(WorkspaceNodeRenderer.class.getResource("/images/16x16/folder-blue_open.png"));
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /**
- * @param tree
- * @param renderer
- */
- public WorkspaceCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
- super(tree, renderer);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public Component getTreeCellEditorComponent(JTree tree, Object treeNode, boolean isSelected, boolean expanded, boolean leaf,
- int row) {
- if (treeNode instanceof AWorkspaceTreeNode) {
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) treeNode;
- setNodeIcon(renderer,node);
- return super.getTreeCellEditorComponent(tree, node.getName(), isSelected, expanded, leaf, row);
- }
- return super.getTreeCellEditorComponent(tree, treeNode, isSelected, expanded, leaf, row);
- }
-
- public boolean isCellEditable(EventObject event) {
- if (event != null && event.getSource() instanceof JTree) {
- setTree((JTree) event.getSource());
- if (event instanceof MouseEvent) {
- TreePath path = tree.getPathForLocation(((MouseEvent) event).getX(), ((MouseEvent) event).getY());
- if (path != null) {
- AWorkspaceTreeNode treeNode = (AWorkspaceTreeNode) path.getLastPathComponent();
- if(!treeNode.isEditable()) {
- return false;
- }
- }
- }
- }
- else if(event == null && WorkspaceController.getCurrentModeExtension().getView().getSelectionPath() != null) {
- return false;
- }
- return super.isCellEditable(event);
- }
-
- /**
- * @param value
- */
- protected void setNodeIcon(DefaultTreeCellRenderer renderer, AWorkspaceTreeNode wsNode) {
- renderer.setOpenIcon(DEFAULT_FOLDER_OPEN_ICON);
- renderer.setClosedIcon(DEFAULT_FOLDER_CLOSED_ICON);
-
- if(wsNode.setIcons(renderer)) {
- return;
- }
- if(!wsNode.isLeaf() || wsNode instanceof AFolderNode) {
- renderer.setLeafIcon(DEFAULT_FOLDER_CLOSED_ICON);
- }
- else {
- renderer.setLeafIcon(DEFAULT_ICON);
- }
-
-
- }
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/WorkspaceNodeRenderer.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/WorkspaceNodeRenderer.java
deleted file mode 100644
index 05eaf86..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/WorkspaceNodeRenderer.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.freeplane.plugin.workspace.components;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.datatransfer.ClipboardOwner;
-
-import javax.swing.BorderFactory;
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JLabel;
-import javax.swing.JTree;
-import javax.swing.UIManager;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import org.freeplane.plugin.workspace.dnd.DnDController;
-import org.freeplane.plugin.workspace.dnd.IWorspaceClipboardOwner;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.AFolderNode;
-
-public class WorkspaceNodeRenderer extends DefaultTreeCellRenderer {
-
- private int highlightedRow = -1;
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private static final Icon DEFAULT_ICON = new ImageIcon(WorkspaceNodeRenderer.class.getResource("/images/16x16/text-x-preview.png"));
- private static final Icon DEFAULT_FOLDER_CLOSED_ICON = new ImageIcon(WorkspaceNodeRenderer.class.getResource("/images/16x16/folder-blue.png"));
- private static final Icon DEFAULT_FOLDER_OPEN_ICON = new ImageIcon(WorkspaceNodeRenderer.class.getResource("/images/16x16/folder-blue_open.png"));
-
- public WorkspaceNodeRenderer() {
-
- }
-
- public Component getTreeCellRendererComponent(JTree tree, Object treeNode, boolean sel, boolean expanded, boolean leaf, int row,
- boolean hasFocus) {
- if(treeNode != null && treeNode instanceof AWorkspaceTreeNode ) {
- DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) treeNode;
- setNodeIcon(renderer, node);
- setToolTip(renderer, node);
- JLabel label = (JLabel) renderer.getTreeCellRendererComponent(tree, treeNode, sel, expanded, leaf, row, hasFocus);
- if(row == this.highlightedRow) {
- try {
- label.setBorder(BorderFactory.createLineBorder(UIManager.getColor(borderSelectionColor), 1));
- }
- catch (Exception e) {
- label.setBorder(BorderFactory.createLineBorder(label.getForeground(), 1));
- }
- }
- label.setText(node.getName());
- if(isCut(node)) {
- //WORKSPACE - ToDo: make the item transparent (including the icon?)
- int alpha = new Double(255 * 0.5).intValue();
- label.setForeground(new Color(label.getForeground().getRed(), label.getForeground().getGreen(), label.getForeground().getBlue(), alpha));
- }
- return label;
- }
- return super.getTreeCellRendererComponent(tree, treeNode, sel, expanded, leaf, row, hasFocus);
- }
-
- private boolean isCut(AWorkspaceTreeNode node) {
- ClipboardOwner owner = DnDController.getSystemClipboardController().getClipboardOwner();
- if(owner != null && owner instanceof IWorspaceClipboardOwner) {
- if(!((IWorspaceClipboardOwner) owner).getTransferable().isCopy() && ((IWorspaceClipboardOwner) owner).getTransferable().contains(node)) {
- return true;
- }
- }
- return false;
- }
-
- private void setToolTip(DefaultTreeCellRenderer renderer, AWorkspaceTreeNode node) {
- if(node instanceof IFileSystemRepresentation) {
- renderer.setToolTipText(((IFileSystemRepresentation) node).getFile().getPath());
- }
- }
-
- /**
- * @param value
- */
- protected void setNodeIcon(DefaultTreeCellRenderer renderer, AWorkspaceTreeNode wsNode) {
- renderer.setOpenIcon(DEFAULT_FOLDER_OPEN_ICON);
- renderer.setClosedIcon(DEFAULT_FOLDER_CLOSED_ICON);
-
- if(wsNode.setIcons(renderer)) {
- return;
- }
- if(!wsNode.isLeaf() || wsNode instanceof AFolderNode) {
- renderer.setLeafIcon(DEFAULT_FOLDER_CLOSED_ICON);
- }
- else {
- renderer.setLeafIcon(DEFAULT_ICON);
- }
-
-
- }
-
- public void highlightRow(int row) {
- this.highlightedRow = row;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/FileExistsDialogPanel.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/FileExistsDialogPanel.java
deleted file mode 100644
index 8d15613..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/FileExistsDialogPanel.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.freeplane.plugin.workspace.components.dialog;
-
-import java.io.File;
-import java.util.Locale;
-
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.util.TextUtils;
-
-import com.jgoodies.forms.factories.FormFactory;
-import com.jgoodies.forms.layout.ColumnSpec;
-import com.jgoodies.forms.layout.FormLayout;
-import com.jgoodies.forms.layout.RowSpec;
-
-public class FileExistsDialogPanel extends JPanel {
-
- private static final long serialVersionUID = 5240830108148173268L;
- private JCheckBox chckbxUseForAll;
-
- public FileExistsDialogPanel(File targetFile, String message) {
- if(targetFile == null) {
- throw new IllegalArgumentException("NULL");
- }
-
- setLayout(new FormLayout(new ColumnSpec[] {
- FormFactory.RELATED_GAP_COLSPEC,
- ColumnSpec.decode("default:grow"),},
- new RowSpec[] {
- FormFactory.RELATED_GAP_ROWSPEC,
- RowSpec.decode("fill:default:grow"),
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,}));
-
- JLabel lblNewLabel = new JLabel(TextUtils.format(message, targetFile.getName(), targetFile.getParent()));
- lblNewLabel.setVerticalAlignment(SwingConstants.TOP);
- add(lblNewLabel, "2, 2");
-
- chckbxUseForAll = new JCheckBox(TextUtils.getText(FileExistsDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".apply2all"));
- add(chckbxUseForAll, "2, 4");
- }
-
- public boolean applyToAll() {
- return chckbxUseForAll.isSelected();
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/ImportProjectDialogPanel.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/ImportProjectDialogPanel.java
deleted file mode 100644
index f5f7a9e..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/ImportProjectDialogPanel.java
+++ /dev/null
@@ -1,494 +0,0 @@
-package org.freeplane.plugin.workspace.components.dialog;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.NoSuchElementException;
-
-import javax.swing.ComboBoxModel;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JFileChooser;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import javax.swing.SwingConstants;
-import javax.swing.border.MatteBorder;
-import javax.swing.event.ListDataEvent;
-import javax.swing.event.ListDataListener;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.IResultProcessor;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-import org.freeplane.plugin.workspace.model.project.ProjectLoader;
-import org.freeplane.plugin.workspace.nodes.ProjectRootNode;
-
-import com.jgoodies.forms.factories.FormFactory;
-import com.jgoodies.forms.layout.ColumnSpec;
-import com.jgoodies.forms.layout.FormLayout;
-import com.jgoodies.forms.layout.RowSpec;
-
-public class ImportProjectDialogPanel extends JPanel {
- private static final SimpleDateFormat format = new SimpleDateFormat("M/d/yy HH:mm");
- private static final long serialVersionUID = 1L;
- private JTextField txtProjectName;
- private JTextField txtProjectPath;
- private JComboBox projectVersions;
- private ProjectVersionsModel versionModel;
- private JLabel lblWarn;
- private JLabel lblProjectName;
- private Component confirmButton;
-
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public ImportProjectDialogPanel() {
- setPreferredSize(new Dimension(400, 180));
- setLayout(new FormLayout(new ColumnSpec[] {
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,
- ColumnSpec.decode("max(100dlu;min):grow"),
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,},
- new RowSpec[] {
- FormFactory.RELATED_GAP_ROWSPEC,
- RowSpec.decode("fill:max(50dlu;pref)"),
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- RowSpec.decode("fill:default"),
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,}));
-
- JPanel panel = new JPanel();
- panel.setBorder(new MatteBorder(0, 0, 1, 0, (Color) new Color(0, 0, 0)));
- panel.setBackground(Color.WHITE);
- add(panel, "1, 1, 8, 2, fill, fill");
- panel.setLayout(new FormLayout(new ColumnSpec[] {
- FormFactory.RELATED_GAP_COLSPEC,
- ColumnSpec.decode("default:grow"),},
- new RowSpec[] {
- FormFactory.RELATED_GAP_ROWSPEC,
- RowSpec.decode("fill:default:grow"),}));
-
- JLabel lblNewLabel = new JLabel(TextUtils.getText(ImportProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".help"));
- lblNewLabel.setVerticalAlignment(SwingConstants.TOP);
- panel.add(lblNewLabel, "2, 2");
-
- lblWarn = new JLabel(TextUtils.getText(ImportProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".warn1"));
- add(lblWarn, "2, 4, 5, 1");
- URL url = this.getClass().getResource("/images/16x16/dialog-warning-4.png");
- if(url != null) {
- lblWarn.setIcon(new ImageIcon(url));
- }
- lblWarn.setVisible(false);
-
- JLabel lblProjectPath = new JLabel(TextUtils.getText(ImportProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".path.label"));
- lblProjectPath.setHorizontalAlignment(SwingConstants.RIGHT);
- add(lblProjectPath, "2, 6, right, default");
-
- txtProjectPath = new JTextField();
- add(txtProjectPath, "4, 6, fill, default");
- txtProjectPath.setColumns(10);
- txtProjectPath.setEditable(false);
-
- JButton btnBrowse = new JButton("...");
- btnBrowse.setToolTipText(TextUtils.getText(ImportProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".button.tip"));
- btnBrowse.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent event) {
- File home = URIUtils.getAbsoluteFile(getProjectPath());
- while(home != null && !home.exists()) {
- home = home.getParentFile();
- }
- JFileChooser chooser = new JFileChooser(home == null ? getDefaultProjectPath() : home.getAbsolutePath());
- chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- chooser.setMultiSelectionEnabled(false);
- chooser.setFileHidingEnabled(true);
- int response = chooser.showOpenDialog(ImportProjectDialogPanel.this);
- if(response == JFileChooser.APPROVE_OPTION) {
- File file = chooser.getSelectedFile();
- setProjectPath(file.getAbsolutePath());
- }
- }
- });
- add(btnBrowse, "6, 6");
-
- lblProjectName = new JLabel(TextUtils.getText(ImportProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".name.label"));
- lblProjectName.setEnabled(false);
- add(lblProjectName, "2, 8, right, default");
-
- projectVersions = new JComboBox();
- projectVersions.setModel(getComboBoxModel());
- projectVersions.setEnabled(false);
- add(projectVersions, "4, 8, 3, 1, fill, default");
- projectVersions.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- enableConfirmation();
- }
- });
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
-
- protected void setProjectPath(String path) {
- txtProjectPath.setText(path);
- updateProjectVersions();
- }
-
- @Override
- public void paint(Graphics g) {
- enableConfirmation();
- super.paint(g);
- }
-
- private void updateProjectVersions() {
- File home = new File(txtProjectPath.getText());
- getComboBoxModel().clear();
-
- File _data = new File(home, "_data");
- if(_data.exists()) {
- readVersions(_data);
- }
- enableControlls(getComboBoxModel().getSize() > 0);
- }
-
- private void enableControlls(boolean enabled) {
- if(getComboBoxModel().getSize() > 0) {
- projectVersions.setSelectedIndex(0);
- }
- lblWarn.setText(TextUtils.getText(ImportProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".warn1"));
- lblWarn.setVisible(!enabled);
- projectVersions.setEnabled(enabled);
- lblProjectName.setEnabled(enabled);
- enableConfirmation();
- }
-
- private void enableConfirmation() {
- if(confirmButton != null) {
- if(getComboBoxModel().getSelectedItem() == null) {
- confirmButton.setEnabled(false);
- if(projectVersions.isEnabled()) {
- lblWarn.setText(TextUtils.getText(ImportProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".warn2"));
- lblWarn.setVisible(true);
- }
- }
- else {
- if(WorkspaceController.getCurrentModel().getProject(getComboBoxModel().getSelectedItem().getProject().getProjectID()) != null) {
- lblWarn.setText(TextUtils.getText(ImportProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".warn3"));
- lblWarn.setVisible(true);
- confirmButton.setEnabled(false);
- }
- else {
- confirmButton.setEnabled(true);
- lblWarn.setVisible(false);
- }
- }
-
- }
- }
-
-
- private void readVersions(File home) {
- for(File folder : home.listFiles(new FileFilter() {
- public boolean accept(File pathname) {
- if(pathname.isDirectory()) {
- return true;
- }
- return false;
- }
- })) {
-
- File settings = new File(folder, "settings.xml");
- if(settings.exists()) {
- AWorkspaceProject project = AWorkspaceProject.create(folder.getName(), home.getParentFile().toURI());
- String item = new TempProjectLoader().getMetaInfo(project);
- if(item == null) {
- continue;
- }
- getComboBoxModel().addItem(new VersionItem(project, item, new Date(settings.lastModified())));
- }
- }
- }
-
- private ProjectVersionsModel getComboBoxModel() {
- if(this.versionModel == null) {
- this.versionModel = new ProjectVersionsModel();
- }
- return this.versionModel;
- }
-
- protected String getDefaultProjectPath() {
- File base = URIUtils.getAbsoluteFile(WorkspaceController.getDefaultProjectHome());
- return base.getAbsolutePath();
- }
-
- public String getProjectName() {
- return txtProjectName.getText().trim();
- }
-
- public AWorkspaceProject getProject() {
- VersionItem item = (VersionItem) projectVersions.getSelectedItem();
- if(item == null) {
- return null;
- }
- return item.getProject();
- }
-
- private URI getProjectPath() {
- if(txtProjectPath.getText().length()==0) {
- return null;
- }
- return new File(txtProjectPath.getText()).toURI();
- }
-
- public void setConfirmButton(Component comp) {
- this.confirmButton = comp;
- }
-
-
- /***********************************************************************************
- * INTERNAL TYPES
- **********************************************************************************/
-
- class TempProjectLoader extends ProjectLoader {
- StringBuilder versionString;
-
- public String getMetaInfo(AWorkspaceProject project) {
- try {
- versionString = new StringBuilder();
- LOAD_RETURN_TYPE retType = this.loadProject(project);
- if(LOAD_RETURN_TYPE.EXISTING_PROJECT.equals(retType)) {
- return versionString.length() == 0 ? null : versionString.toString();
- }
- } catch (IOException e) {
- LogUtils.warn(e);
- }
- return null;
- }
-
- @Override
- public IResultProcessor getDefaultResultProcessor() {
- return new IResultProcessor() {
- public void process(AWorkspaceTreeNode parent, AWorkspaceTreeNode node) {
- if(node == null) {
- return;
- }
- if(node instanceof ProjectRootNode) {
- versionString.append(node.getName());
- }
- if(parent == null) {
- return;
- }
- parent.addChildNode(node);
- }
-
- public void setProject(AWorkspaceProject project) {
- }
- };
- }
-
-
-
- }
-
- class ProjectVersionsModel implements ComboBoxModel {
-
- private List<VersionItem> items = new ArrayList<VersionItem>();
- private List<ListDataListener> listeners = new ArrayList<ListDataListener>();
- private int selectedIndex = -1;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public int getSize() {
- return items.size();
- }
-
- public Object getElementAt(int index) {
- return items.get(index);
- }
-
- public void addListDataListener(ListDataListener l) {
- listeners.add(l);
- }
-
- public void removeListDataListener(ListDataListener l) {
- listeners.remove(l);
- }
-
- public void setSelectedItem(Object anItem) {
- int idx = items.indexOf(anItem);
- if(idx == -1) {
- throw new NoSuchElementException();
- }
- this.selectedIndex = idx;
- }
-
- public VersionItem getSelectedItem() {
- if(this.selectedIndex == -1) {
- return null;
- }
- return items.get(selectedIndex);
- }
-
- public void clear() {
- int endIdx = items.size();
- this.items.clear();
- fireItemsRemoved(0, endIdx);
- }
-
- private void validateSelection() {
- if(selectedIndex >= items.size()) {
- selectedIndex = items.size()-1;
- }
-
- }
-
- public void setSelectedIndex(int index) {
- if(index < 0 || index >= items.size()) {
- throw new IndexOutOfBoundsException();
- }
- this.selectedIndex = index;
- }
-
- public void addItem(VersionItem item) {
- for(VersionItem it : items) {
- if(it.compareTo(item) < 0) {
- insertItem(item, items.indexOf(it));
- return;
- }
- }
- insertItem(item, items.size());
- }
-
- private void insertItem(VersionItem item, int index) {
- if(item == null) {
- return;
- }
- if(index < 0 || index > items.size()) {
- throw new IndexOutOfBoundsException();
- }
- items.add(index, item);
- fireItemsAdded(index, index);
- }
-
- public void removeItem(VersionItem anItem) {
- if(anItem == null) {
- return;
- }
- int idx = items.indexOf(anItem);
- if(idx == -1) {
- return;
- }
- removeItem(idx);
- }
-
- public VersionItem removeItem(int index) {
- if(index < 0 || index >= items.size()) {
- throw new IndexOutOfBoundsException();
- }
- VersionItem obj = items.remove(index);
- fireItemsRemoved(index, index);
- return obj;
- }
-
- protected void fireItemsAdded(int startIndex, int endIndex) {
- ListDataEvent event = new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, startIndex, endIndex);
- for (int i = items.size()-1; i >= 0; i--) {
- listeners.get(i).intervalAdded(event);
- }
- }
-
- protected void fireItemsRemoved(int startIndex, int endIndex) {
- validateSelection();
- ListDataEvent event = new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, startIndex, endIndex);
- for (int i = items.size()-1; i >= 0; i--) {
- listeners.get(i).intervalRemoved(event);
- }
- }
-
- protected void fireItemsChanged(int startIndex, int endIndex) {
- ListDataEvent event = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, startIndex, endIndex);
- for (int i = items.size()-1; i >= 0; i--) {
- listeners.get(i).contentsChanged(event);
- }
- }
-
- }
-
- public class VersionItem implements Comparable<VersionItem> {
-
- private final AWorkspaceProject project;
- private final Date latestUse;
- private final String name;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public VersionItem(AWorkspaceProject prj, String name, Date version) {
- if(prj == null || name == null || version == null) {
- throw new IllegalArgumentException("NULLPointer");
- }
- this.project = prj;
- this.latestUse = version;
- this.name = name;
- }
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public AWorkspaceProject getProject() {
- return project;
- }
-
- public String toString() {
- return this.name + " [" +format.format(latestUse) + "]";
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public int compareTo(VersionItem o) {
- return (int) (latestUse.getTime()-o.latestUse.getTime());
- }
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/NewDirectoryDialogPanel.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/NewDirectoryDialogPanel.java
deleted file mode 100644
index cde2508..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/NewDirectoryDialogPanel.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 17.11.2011
- */
-package org.freeplane.plugin.workspace.components.dialog;
-
-import java.awt.Dimension;
-
-import javax.swing.JPanel;
-import javax.swing.JLabel;
-import javax.swing.JTextField;
-import com.jgoodies.forms.layout.FormLayout;
-import com.jgoodies.forms.layout.ColumnSpec;
-import com.jgoodies.forms.factories.FormFactory;
-import com.jgoodies.forms.layout.RowSpec;
-
-/**
- *
- */
-public class NewDirectoryDialogPanel extends JPanel {
-
- private static final long serialVersionUID = 1L;
-
- private JTextField txtParentPath;
- private JTextField txtDirectoryName;
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public NewDirectoryDialogPanel(String parentPath) {
- setMinimumSize(new Dimension(240,120));
- setLayout(new FormLayout(new ColumnSpec[] {
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,
- ColumnSpec.decode("36px"),
- FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
- ColumnSpec.decode("86px:grow"),
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.DEFAULT_COLSPEC,},
- new RowSpec[] {
- FormFactory.LINE_GAP_ROWSPEC,
- RowSpec.decode("20px"),
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,}));
-
- JLabel lblIn = new JLabel("In:");
- add(lblIn, "3, 2, right, center");
-
- txtParentPath = new JTextField();
- txtParentPath.setEditable(false);
- txtParentPath.setText(parentPath);
- add(txtParentPath, "5, 2, fill, top");
- txtParentPath.setColumns(10);
-
- JLabel lblName = new JLabel("Name:");
- add(lblName, "3, 4, right, default");
-
- txtDirectoryName = new JTextField();
- txtDirectoryName.setText("");
- txtDirectoryName.requestFocus();
- add(txtDirectoryName, "5, 4, fill, top");
- txtDirectoryName.setColumns(10);
-
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public String getDirectoryName() {
- return txtDirectoryName.getText();
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/NewProjectDialogPanel.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/NewProjectDialogPanel.java
deleted file mode 100644
index 2ed9f5f..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/NewProjectDialogPanel.java
+++ /dev/null
@@ -1,285 +0,0 @@
-package org.freeplane.plugin.workspace.components.dialog;
-
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.io.File;
-import java.net.URI;
-import java.net.URL;
-import java.util.Locale;
-
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JFileChooser;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-import javax.swing.SwingConstants;
-import javax.swing.SwingUtilities;
-import javax.swing.border.MatteBorder;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-import com.jgoodies.forms.factories.FormFactory;
-import com.jgoodies.forms.layout.ColumnSpec;
-import com.jgoodies.forms.layout.FormLayout;
-import com.jgoodies.forms.layout.RowSpec;
-
-public class NewProjectDialogPanel extends JPanel {
-
- private static final long serialVersionUID = 1L;
- private JTextField txtProjectName;
- private JTextField txtProjectPath;
- protected boolean manualChoice = false;
- private JLabel lblWarn;
- private Component confirmButton;
-
- public NewProjectDialogPanel() {
- setPreferredSize(new Dimension(400, 160));
- setLayout(new FormLayout(new ColumnSpec[] {
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,
- ColumnSpec.decode("max(100dlu;min):grow"),
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,},
- new RowSpec[] {
- FormFactory.RELATED_GAP_ROWSPEC,
- RowSpec.decode("fill:max(30dlu;pref)"),
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- RowSpec.decode("fill:default"),
- FormFactory.RELATED_GAP_ROWSPEC,
- RowSpec.decode("fill:default"),}));
-
- JPanel panel = new JPanel();
- panel.setBorder(new MatteBorder(0, 0, 1, 0, (Color) new Color(0, 0, 0)));
- panel.setBackground(Color.WHITE);
- add(panel, "1, 1, 8, 2, fill, fill");
- panel.setLayout(new FormLayout(new ColumnSpec[] {
- FormFactory.RELATED_GAP_COLSPEC,
- ColumnSpec.decode("default:grow"),},
- new RowSpec[] {
- FormFactory.RELATED_GAP_ROWSPEC,
- RowSpec.decode("fill:default:grow"),}));
-
- JLabel lblNewLabel = new JLabel(TextUtils.getText(NewProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".help"));
- lblNewLabel.setVerticalAlignment(SwingConstants.TOP);
- panel.add(lblNewLabel, "2, 2");
-
- lblWarn = new JLabel(TextUtils.getText(ImportProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".warn1"));
- add(lblWarn, "2, 4, 5, 1");
- URL url = this.getClass().getResource("/images/16x16/dialog-warning-4.png");
- if(url != null) {
- lblWarn.setIcon(new ImageIcon(url));
- }
- lblWarn.setVisible(false);
-
- JLabel lblProjectName = new JLabel(TextUtils.getText(NewProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".name.label"));
- lblProjectName.setHorizontalAlignment(SwingConstants.RIGHT);
- add(lblProjectName, "2, 6, right, default");
-
- txtProjectName = new JTextField();
- txtProjectName.setText(TextUtils.getText(NewProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".name.default"));
- add(txtProjectName, "4, 6, fill, default");
- txtProjectName.setColumns(10);
- txtProjectName.addKeyListener(new KeyListener() {
- public void keyTyped(KeyEvent evt) {
- if(isBlackListed(evt.getKeyChar())) {
- evt.consume();
- }
- }
-
- public void keyReleased(KeyEvent evt) {
- if(isBlackListed(evt.getKeyChar())) {
- evt.consume();
- }
- else {
- if(!manualChoice) {
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- setProjectPath(getDefaultProjectPath(getProjectName()));
- }
- });
- }
- }
- }
-
- public void keyPressed(KeyEvent evt) {
- if(isBlackListed(evt.getKeyChar())) {
- evt.consume();
- }
- }
- });
-
- JLabel lblProjectPath = new JLabel(TextUtils.getText(NewProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".path.label"));
- lblProjectPath.setHorizontalAlignment(SwingConstants.RIGHT);
- add(lblProjectPath, "2, 8, right, default");
-
- txtProjectPath = new JTextField(getDefaultProjectPath(txtProjectName.getText()));
- setProjectPath(getDefaultProjectPath(getProjectName()));
- add(txtProjectPath, "4, 8, fill, default");
- txtProjectPath.setColumns(10);
- txtProjectPath.addKeyListener(new KeyListener() {
- public void keyTyped(KeyEvent evt) {
- if(isBlackListed(evt.getKeyChar())) {
- evt.consume();
- }
- else {
- manualChoice = true;
- }
- }
-
- public void keyReleased(KeyEvent evt) {
- if(isBlackListed(evt.getKeyChar())) {
- evt.consume();
- }
- else {
- manualChoice = true;
- }
- enableConfirmation();
- }
-
- public void keyPressed(KeyEvent evt) {
- if(isBlackListed(evt.getKeyChar())) {
- evt.consume();
- }
- else {
- manualChoice = true;
- }
- }
- });
-
- JButton btnBrowse = new JButton("...");
- btnBrowse.setToolTipText(TextUtils.getText(NewProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".button.tip"));
- btnBrowse.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent arg0) {
- File home = URIUtils.getAbsoluteFile(getProjectPath());
- while(home != null && !home.exists()) {
- home = home.getParentFile();
- }
- JFileChooser chooser = new JFileChooser(home == null ? getDefaultProjectPath(getProjectName()) : home.getAbsolutePath());
- chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- chooser.setMultiSelectionEnabled(false);
- chooser.setFileHidingEnabled(true);
- int response = chooser.showOpenDialog(NewProjectDialogPanel.this);
- if(response == JFileChooser.APPROVE_OPTION) {
- File file = chooser.getSelectedFile();
- setProjectPath(file.getAbsolutePath());
- manualChoice = true;
- }
- }
- });
- add(btnBrowse, "6, 8");
- }
-
- @Override
- public void paint(Graphics g) {
- enableConfirmation();
- super.paint(g);
- }
-
- public static boolean isBlackListed(char keyChar) {
- if(
- '%' == keyChar
- || '!' == keyChar
- || '$' == keyChar
- || '§' == keyChar
- || '&' == keyChar
- || '\'' == keyChar
- || '´' == keyChar
- ) {
- return true;
- }
- return false;
- }
-
- protected void setProjectPath(String path) {
- txtProjectPath.setText(path);
- }
-
- protected String getDefaultProjectPath(String projectName) {
- File base = URIUtils.getAbsoluteFile(WorkspaceController.getDefaultProjectHome());
- if(projectName == null) {
- projectName = TextUtils.getText(NewProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".name.default");
- }
- File path = new File(base, projectName.trim());
- int counter = 1;
- while(path.exists() && projectName.trim().length() > 0) {
- path = new File(base, projectName.trim()+" "+(counter++));
- }
- return path.getAbsolutePath();
- }
-
- private void enableConfirmation() {
- if(confirmButton != null) {
- if(NameExistsInWorkspace(getProjectName())) {
- lblWarn.setText(TextUtils.getText(NewProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".warn1"));
- lblWarn.setVisible(true);
- confirmButton.setEnabled(false);
- }
- else if(PathExistsInWorkspace(txtProjectPath.getText())) {
- lblWarn.setText(TextUtils.getText(NewProjectDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".warn2"));
- lblWarn.setVisible(true);
- confirmButton.setEnabled(false);
- }
- else {
- confirmButton.setEnabled(true);
- lblWarn.setVisible(false);
- }
- }
- }
-
- private boolean NameExistsInWorkspace(String name) {
- for(AWorkspaceProject project : WorkspaceController.getCurrentModel().getProjects()) {
- try {
- if(project.getProjectName().equals(name)) {
- return true;
- }
- }
- catch (Exception e) {
- LogUtils.info(""+e.getMessage());
- }
- }
- return false;
- }
-
- private boolean PathExistsInWorkspace(String path) {
- for(AWorkspaceProject project : WorkspaceController.getCurrentModel().getProjects()) {
- try {
- if(URIUtils.getFile(project.getProjectHome()).getAbsolutePath().equals(new File(path).getAbsolutePath())) {
- return true;
- }
- }
- catch (Exception e) {
- LogUtils.info(""+e.getMessage());
- }
- }
- return false;
- }
-
- public String getProjectName() {
- return txtProjectName.getText().trim();
- }
-
- public URI getProjectPath() {
- return new File(txtProjectPath.getText()).toURI();
- }
-
- public void setConfirmButton(Component comp) {
- this.confirmButton = comp;
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/NodeRenameDialogPanel.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/NodeRenameDialogPanel.java
deleted file mode 100644
index 3698486..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/NodeRenameDialogPanel.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 02.02.2012
- */
-package org.freeplane.plugin.workspace.components.dialog;
-
-import java.awt.Dimension;
-
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JTextField;
-
-import com.jgoodies.forms.factories.FormFactory;
-import com.jgoodies.forms.layout.ColumnSpec;
-import com.jgoodies.forms.layout.FormLayout;
-import com.jgoodies.forms.layout.RowSpec;
-import javax.swing.JCheckBox;
-
-/**
- *
- */
-public class NodeRenameDialogPanel extends JPanel {
-
- private static final long serialVersionUID = 1L;
- private JTextField txtNodeName;
- private JCheckBox chckbxRenameLinkToo;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
- public NodeRenameDialogPanel(String oldName) {
- this(oldName,false);
- }
-
- public NodeRenameDialogPanel(String oldName, boolean isMutableNode) {
- setMinimumSize(new Dimension(240,120));
- setLayout(new FormLayout(new ColumnSpec[] {
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,
- ColumnSpec.decode("36px"),
- FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
- ColumnSpec.decode("86px:grow"),
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.DEFAULT_COLSPEC,},
- new RowSpec[] {
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,}));
-
- JLabel lblName = new JLabel("name:");
- add(lblName, "3, 2, right, default");
-
- txtNodeName = new JTextField();
- txtNodeName.setText(oldName);
- txtNodeName.requestFocus();
- add(txtNodeName, "5, 2, fill, top");
- txtNodeName.setColumns(10);
-
- chckbxRenameLinkToo = new JCheckBox("apply changes to the linked file");
- if(isMutableNode) {
- add(chckbxRenameLinkToo, "5, 4");
- }
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public String getText() {
- return txtNodeName.getText();
- }
-
- public boolean applyChangesForLink() {
- return chckbxRenameLinkToo.isSelected();
- }
-
- public void setCheckboxSelected(boolean selected) {
- chckbxRenameLinkToo.setSelected(selected);
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/WorkspaceNewFolderPanel.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/WorkspaceNewFolderPanel.java
deleted file mode 100644
index fd36b51..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/dialog/WorkspaceNewFolderPanel.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 14.11.2011
- */
-package org.freeplane.plugin.workspace.components.dialog;
-
-import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.io.File;
-
-import javax.swing.AbstractAction;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JFileChooser;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JSeparator;
-import javax.swing.JTextField;
-import javax.swing.SwingConstants;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-import com.jgoodies.forms.factories.FormFactory;
-import com.jgoodies.forms.layout.ColumnSpec;
-import com.jgoodies.forms.layout.FormLayout;
-import com.jgoodies.forms.layout.RowSpec;
-
-/**
- *
- */
-public class WorkspaceNewFolderPanel extends JPanel implements ActionListener {
-
- public static final int MODE_VIRTUAL_ONLY = 1;
- public static final int MODE_PHYSICAL_ONLY = 2;
- public static final int MODE_VIRTUAL_PHYSICAL = MODE_VIRTUAL_ONLY|MODE_PHYSICAL_ONLY;
- public static final int VIRTUAL = 1;
- public static final int PHYSICAL = 2;
-
- private static final long serialVersionUID = 3900806255189377784L;
-
-
-
- private JCheckBox chbkLinkFolder;
- private JTextField textField;
- private JLabel lblFolder;
- private JButton button;
- JLabel lblName;
- private JTextField txtFoldername;
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
- public WorkspaceNewFolderPanel(int chooserMode, final AWorkspaceTreeNode targetNode) {
- setMinimumSize(new Dimension(320, 160));
- setPreferredSize(new Dimension(320, 160));
- setLayout(new FormLayout(new ColumnSpec[] {
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.LABEL_COMPONENT_GAP_COLSPEC,
- ColumnSpec.decode("default:grow"),
- FormFactory.RELATED_GAP_COLSPEC,
- FormFactory.DEFAULT_COLSPEC,
- FormFactory.RELATED_GAP_COLSPEC,},
- new RowSpec[] {
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.RELATED_GAP_ROWSPEC,
- FormFactory.DEFAULT_ROWSPEC,}));
-
- JLabel lblPath = new JLabel(TextUtils.getText("workspace.action.node.new.folder.dialog.parent.label"));
- lblPath.setHorizontalAlignment(SwingConstants.RIGHT);
- add(lblPath, "2, 2, right, default");
-
- JLabel lblParentpath = new JLabel("/");
- add(lblParentpath, "4, 2, 3, 1");
- lblParentpath.setText(getParentPath(targetNode));
-
- {
-
- lblName = new JLabel(TextUtils.getText("workspace.action.node.new.folder.dialog.input1.label"));
- lblName.setHorizontalAlignment(SwingConstants.RIGHT);
- add(lblName, "2, 4, right, default");
-
- txtFoldername = new JTextField();
- txtFoldername.setText(TextUtils.getText("workspace.action.node.new.folder.dialog.input1.default"));
- add(txtFoldername, "4, 4, 5, 1, fill, default");
- }
-
- JSeparator separator = new JSeparator();
- add(separator, "2, 6, 7, 1");
-
- {
- chbkLinkFolder = new JCheckBox(TextUtils.getText("workspace.action.node.new.folder.dialog.disk.label"));
- chbkLinkFolder.addActionListener(this);
- chbkLinkFolder.setEnabled((chooserMode&MODE_PHYSICAL_ONLY) > 0);
- chbkLinkFolder.setSelected((chooserMode&MODE_VIRTUAL_ONLY) == 0);
- add(chbkLinkFolder, "2, 8, 7, 1");
-
- lblFolder = new JLabel(TextUtils.getText("workspace.action.node.new.folder.dialog.input2.label"));
- add(lblFolder, "2, 11, 3, 1, right, default");
-
- textField = new JTextField();
- add(textField, "6, 11, fill, default");
-
- button = new JButton(new AbstractAction("...") {
-
- private static final long serialVersionUID = 1L;
-
- public void actionPerformed(ActionEvent e) {
- JFileChooser chooser = new JFileChooser(URIUtils.getAbsoluteFile(WorkspaceController.getCurrentProject().getProjectHome()));
- chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
- chooser.setFileHidingEnabled(true);
- int result = chooser.showOpenDialog(UITools.getFrame());
- if(result == JFileChooser.APPROVE_OPTION) {
- File oldPath = new File("");
- try {
- oldPath = new File(textField.getText());
- }
- catch (Exception ex) {
- }
- textField.setText(chooser.getSelectedFile().getPath());
- String folderName = txtFoldername.getText();
- if (folderName.length()==0 || folderName.equals(TextUtils.getText("workspace.action.node.new.folder.dialog.input1.default")) || oldPath.getName().equals(folderName) ) {
- txtFoldername.setText(chooser.getSelectedFile().getName());
- }
- }
- }
- });
- add(button, "8, 11");
-
- enablePhysicalInput(chbkLinkFolder.isSelected());
- }
- }
-
- /**
- * @param targetNode
- * @return
- */
- private String getParentPath(AWorkspaceTreeNode targetNode) {
- String name = "";
- if(targetNode.getParent() != null) {
- name += getParentPath(targetNode.getParent());
- }
- name += "/" + targetNode.getName();
- return name;
- }
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public String getFolderName() {
- return txtFoldername.getText();
- }
-
- public String getLinkPath() {
- if(isLinkedFolder()) {
- return textField.getText();
- }
-
- return null;
- }
-
- public boolean isLinkedFolder() {
- return chbkLinkFolder.isSelected();
- }
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
-
- public void actionPerformed(ActionEvent e) {
- if(e.getSource().equals(chbkLinkFolder)) {
- if(chbkLinkFolder.isSelected()) {
- enablePhysicalInput(true);
- } else {
- enablePhysicalInput(false);
- }
-
- }
- }
-
- private void enablePhysicalInput(boolean enabled) {
- lblFolder.setEnabled(enabled);
- textField.setEnabled(enabled);
- button.setEnabled(enabled);
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/CheckEnableOnPopup.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/CheckEnableOnPopup.java
deleted file mode 100644
index b861b83..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/CheckEnableOnPopup.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.freeplane.plugin.workspace.components.menu;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
- at Retention(RetentionPolicy.RUNTIME)
-public @interface CheckEnableOnPopup {
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/WorkspacePopupMenu.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/WorkspacePopupMenu.java
deleted file mode 100644
index 8f8589c..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/WorkspacePopupMenu.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.freeplane.plugin.workspace.components.menu;
-
-import java.awt.Point;
-
-import javax.swing.JPopupMenu;
-
-public class WorkspacePopupMenu extends JPopupMenu {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- Point invokerLocation;
-
- public WorkspacePopupMenu(String popupName) {
- super(popupName);
- }
-
- public WorkspacePopupMenu() {
- super();
- }
-
- public Point getInvokerLocation() {
- return invokerLocation;
- }
- public void setInvokerLocation(Point invokerLocation) {
- this.invokerLocation = invokerLocation;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/WorkspacePopupMenuBuilder.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/WorkspacePopupMenuBuilder.java
deleted file mode 100644
index bb0f17d..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/WorkspacePopupMenuBuilder.java
+++ /dev/null
@@ -1,223 +0,0 @@
-package org.freeplane.plugin.workspace.components.menu;
-
-import java.util.Stack;
-
-import javax.swing.JComponent;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.JTree;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.ui.SelectableAction;
-import org.freeplane.core.ui.components.JAutoCheckBoxMenuItem;
-import org.freeplane.core.ui.components.JFreeplaneMenuItem;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.actions.AWorkspaceAction;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public class WorkspacePopupMenuBuilder {
-
- public static final String SEPARATOR = "-----";
-
- public WorkspacePopupMenuBuilder() {
- }
-
- public static void addAction(final JComponent popupMenu, AFreeplaneAction action) {
- assert action != null;
- assert popupMenu != null;
-
- final JMenuItem item;
- if (action.getClass().getAnnotation(SelectableAction.class) != null) {
- item = new JAutoCheckBoxMenuItem(action);
- }
- else {
- item = new JFreeplaneMenuItem(action);
- }
- popupMenu.add(item);
- return;
- }
-
- public static void insertAction(final WorkspacePopupMenu popupMenu, AFreeplaneAction action, int index) {
- assert action != null;
- assert popupMenu != null;
-
- final JMenuItem item;
- if (action.getClass().getAnnotation(SelectableAction.class) != null) {
- item = new JAutoCheckBoxMenuItem(action);
- }
- else {
- item = new JFreeplaneMenuItem(action);
- }
- popupMenu.add(item, index);
- addListeners(popupMenu, action);
- return;
- }
-
- public static void insertAction(final WorkspacePopupMenu popupMenu, String actionKey, int index) {
- assert actionKey != null;
- assert popupMenu != null;
- if(actionKey.equals(SEPARATOR)) {
- popupMenu.add(new JPopupMenu.Separator(), index);
- }
- else {
- AFreeplaneAction action = Controller.getCurrentController().getAction(actionKey);
-
- if(action == null) {
- return;
- }
-
- final JMenuItem item;
- if (action.getClass().getAnnotation(SelectableAction.class) != null) {
- item = new JAutoCheckBoxMenuItem(action);
- }
- else {
- item = new JFreeplaneMenuItem(action);
- }
- popupMenu.add(item, index);
- addListeners(popupMenu, action);
- }
- return;
- }
-
- public static void addActions(final WorkspacePopupMenu popupMenu, final String[] keys) {
- assert popupMenu != null;
- assert keys != null;
-
- Stack<JMenu> subMenuStack = new Stack<JMenu>();
-
- for(String key : keys) {
- if(key == null) {
- continue;
- }
- else
- if(key.equals(SEPARATOR)) {
- if(subMenuStack.size() == 0) {
- popupMenu.addSeparator();
- }
- else {
- subMenuStack.peek().addSeparator();
- }
- }
- else if(key.startsWith("beginSubMenu")) {
- String popupName = key.substring("beginSubMenu".length());
- JMenu subMenu = new JMenu(popupName);
- (subMenuStack.size() == 0 ? popupMenu : subMenuStack.peek()).add(subMenu);
- subMenuStack.push(subMenu);
- }
- else if(key.equals("endSubMenu")) {
- subMenuStack.pop();
- }
- else {
- AFreeplaneAction action = Controller.getCurrentController().getAction(key);
- if(action == null) {
- continue;
- }
- addAction(popupMenu, subMenuStack.size() == 0 ? popupMenu : subMenuStack.peek(), action);
- }
-
- }
- }
-
- private static void addAction(WorkspacePopupMenu popupMenu, JComponent jComponent, AFreeplaneAction action) {
- addAction(jComponent, action);
- addListeners(popupMenu, action);
- }
-
- public static String createSubMenu(String name) {
- return "beginSubMenu"+name;
- }
-
- public static String endSubMenu() {
- return "endSubMenu";
- }
-
- private static void addListeners(final WorkspacePopupMenu popupMenu, final AFreeplaneAction action) {
- if (action instanceof PopupMenuListener) {
- popupMenu.addPopupMenuListener(new DelegatingPopupMenuListener((PopupMenuListener) action, popupMenu));
- }
- if (AFreeplaneAction.checkSelectionOnPopup(action)) {
- popupMenu.addPopupMenuListener(new PopupMenuListener() {
- public void popupMenuCanceled(final PopupMenuEvent e) {
- }
-
- public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
- }
-
- public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
- if(action instanceof AWorkspaceAction && e.getSource() instanceof WorkspacePopupMenu) {
- WorkspacePopupMenu menu = ((WorkspacePopupMenu)e.getSource());
- TreePath[] selectedNodes = ((JTree)menu.getInvoker()).getSelectionPaths();
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) ((JTree)menu.getInvoker()).getClosestPathForLocation(menu.getInvokerLocation().x, menu.getInvokerLocation().y).getLastPathComponent();
- ((AWorkspaceAction) action).setSelectedFor(node, selectedNodes);
- }
- else {
- action.setSelected();
- }
- }
- });
- }
- if (AWorkspaceAction.checkEnabledOnPopup(action)) {
- popupMenu.addPopupMenuListener(new PopupMenuListener() {
- public void popupMenuCanceled(final PopupMenuEvent e) {
- }
-
- public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
- }
-
- public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
- if(action instanceof AWorkspaceAction && e.getSource() instanceof WorkspacePopupMenu) {
- WorkspacePopupMenu menu = ((WorkspacePopupMenu)e.getSource());
- TreePath[] selectedNodes = ((JTree)menu.getInvoker()).getSelectionPaths();
- TreePath path = ((JTree)menu.getInvoker()).getClosestPathForLocation( menu.getInvokerLocation().x , menu.getInvokerLocation().y);
- if(path != null) {
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
- ((AWorkspaceAction) action).setEnabledFor(node, selectedNodes);
- }
- else {
- ((AWorkspaceAction) action).setEnabledFor((AWorkspaceTreeNode) WorkspaceController.getCurrentModel().getRoot(), selectedNodes);
- }
- }
- else {
- action.setEnabled();
- }
- }
- });
- }
- }
-
- static private class DelegatingPopupMenuListener implements PopupMenuListener {
- final private PopupMenuListener listener;
- final private Object source;
-
- public DelegatingPopupMenuListener(final PopupMenuListener listener, final Object source) {
- super();
- this.listener = listener;
- this.source = source;
- }
-
- public Object getSource() {
- return source;
- }
-
- private PopupMenuEvent newEvent() {
- return new PopupMenuEvent(getSource());
- }
-
- public void popupMenuCanceled(final PopupMenuEvent e) {
- listener.popupMenuCanceled(newEvent());
- }
-
- public void popupMenuWillBecomeInvisible(final PopupMenuEvent e) {
- listener.popupMenuWillBecomeInvisible(newEvent());
- }
-
- public void popupMenuWillBecomeVisible(final PopupMenuEvent e) {
- listener.popupMenuWillBecomeVisible(newEvent());
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/WorkspaceToolBar.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/WorkspaceToolBar.java
deleted file mode 100644
index 41a5e00..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/components/menu/WorkspaceToolBar.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 04.11.2011
- */
-package org.freeplane.plugin.workspace.components.menu;
-
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-
-import javax.swing.AbstractAction;
-import javax.swing.AbstractButton;
-import javax.swing.Action;
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JToolBar;
-
-/**
- *
- */
-public class WorkspaceToolBar extends JToolBar {
- protected static Insets nullInsets = new Insets(0, 0, 0, 0);
-
- public WorkspaceToolBar() {
- this.setMargin(WorkspaceToolBar.nullInsets);
- setFloatable(false);
- setRollover(true);
-
- JButton button = add(new AbstractAction("New", new ImageIcon(WorkspaceToolBar.class.getResource("/images/16x16/document-new-6.png"))) {
- private static final long serialVersionUID = 1L;
- public void actionPerformed(ActionEvent e) {
- //WorkspaceController.getController().actionPerformed(e);
- }
- });
- configureComponent(button);
- this.addSeparator((Dimension) null);
- button = add(new AbstractAction("Delete", new ImageIcon(WorkspaceToolBar.class.getResource("/images/16x16/document-delete.png"))) {
- private static final long serialVersionUID = 1L;
- public void actionPerformed(ActionEvent e) {
- //WorkspaceController.getController().actionPerformed(e);
- }
- });
- configureComponent(button);
- }
-
- private static final long serialVersionUID = 1L;
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- protected void configureComponent(final Component comp) {
- if (!(comp instanceof AbstractButton)) {
- return;
- }
- final AbstractButton abstractButton = (AbstractButton) comp;
- final String actionName = (String) abstractButton.getAction().getValue(Action.NAME);
- abstractButton.setName(actionName);
- if (null != abstractButton.getIcon()) {
- final String text = abstractButton.getText();
- final String toolTipText = abstractButton.getToolTipText();
- if (text != null) {
- if (toolTipText == null) {
- abstractButton.setToolTipText(text);
- }
- abstractButton.setText(null);
- }
- }
- if (System.getProperty("os.name").equals("Mac OS X")) {
- abstractButton.putClientProperty("JButton.buttonType", "segmented");
- abstractButton.putClientProperty("JButton.segmentPosition", "middle");
- final Dimension buttonSize = new Dimension(22, 22);
- abstractButton.setPreferredSize(buttonSize);
- abstractButton.setFocusPainted(false);
- }
- abstractButton.setFocusable(false);
- abstractButton.setMargin(WorkspaceToolBar.nullInsets);
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/ActionCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/ActionCreator.java
deleted file mode 100644
index c236050..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/ActionCreator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 16.08.2011
- */
-package org.freeplane.plugin.workspace.creator;
-
-import java.util.Hashtable;
-
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.workspace.model.AWorkspaceNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-/**
- *
- */
-public class ActionCreator extends AWorkspaceNodeCreator {
-
- private Hashtable<String, AWorkspaceNodeCreator> creatorTable = new Hashtable<String, AWorkspaceNodeCreator>();
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- public void addTypeCreator(final String typeName, final AWorkspaceNodeCreator creator) {
- if(creatorTable.containsKey(typeName)) {
- creatorTable.remove(typeName);
- }
- creatorTable.put(typeName, creator);
- }
-
-
- public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement lastBuiltElement) {
- String type = lastBuiltElement.getAttribute("type", null);
- if(type == null || !creatorTable.containsKey(type)) {
- return;
- }
-
- AWorkspaceNodeCreator creator = creatorTable.get(type);
- creator.endElement(parent, tag, userObject, lastBuiltElement);
- }
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- public AWorkspaceTreeNode getNode(XMLElement data) {
- String type = data.getAttribute("type", null);
- if(type == null || !creatorTable.containsKey(type)) {
- return null;
- }
-
- AWorkspaceNodeCreator creator = creatorTable.get(type);
- AWorkspaceTreeNode node = creator.getNode(data);
- return node;
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/DefaultFileNodeCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/DefaultFileNodeCreator.java
deleted file mode 100644
index 8c40880..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/DefaultFileNodeCreator.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 21.07.2011
- */
-package org.freeplane.plugin.workspace.creator;
-
-import java.io.File;
-
-import org.freeplane.plugin.workspace.io.AFileNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-
-/**
- *
- */
-public class DefaultFileNodeCreator extends AFileNodeCreator {
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /**
- * @param tree
- */
- public DefaultFileNodeCreator() {
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public AWorkspaceTreeNode getNode(String name, File file) {
- DefaultFileNode node = new DefaultFileNode(name, file);
- return node;
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderCreator.java
deleted file mode 100644
index 5551ed1..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderCreator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 16.08.2011
- */
-package org.freeplane.plugin.workspace.creator;
-
-import java.util.Hashtable;
-
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.workspace.model.AWorkspaceNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-/**
- *
- */
-public class FolderCreator extends AWorkspaceNodeCreator {
-
- private Hashtable<String, AWorkspaceNodeCreator> creatorTable = new Hashtable<String, AWorkspaceNodeCreator>();
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- public void addTypeCreator(final String typeName, final AWorkspaceNodeCreator creator) {
- if(creatorTable.containsKey(typeName)) {
- creatorTable.remove(typeName);
- }
- creatorTable.put(typeName, creator);
- }
-
-
- public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement lastBuiltElement) {
- String type = lastBuiltElement.getAttribute("type", null);
- if(type == null || !creatorTable.containsKey(type)) {
- return;
- }
-
- AWorkspaceNodeCreator creator = creatorTable.get(type);
- creator.endElement(parent, tag, userObject, lastBuiltElement);
- }
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- public AWorkspaceTreeNode getNode(XMLElement data) {
- String type = data.getAttribute("type", null);
- if(type == null || !creatorTable.containsKey(type)) {
- return null;
- }
-
- AWorkspaceNodeCreator creator = creatorTable.get(type);
- AWorkspaceTreeNode node = creator.getNode(data);
- return node;
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderFileNodeCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderFileNodeCreator.java
deleted file mode 100644
index 3d5f4a4..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderFileNodeCreator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 22.07.2011
- */
-package org.freeplane.plugin.workspace.creator;
-
-import java.io.File;
-
-import org.freeplane.plugin.workspace.io.AFileNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.FolderFileNode;
-
-/**
- *
- */
-public class FolderFileNodeCreator extends AFileNodeCreator {
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /**
- * @param tree
- */
- public FolderFileNodeCreator() {
- }
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public AWorkspaceTreeNode getNode(String name, File file) {
- FolderFileNode node = new FolderFileNode(file.getName(), file);
- return node;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderTypePhysicalCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderTypePhysicalCreator.java
deleted file mode 100644
index 5d3f4bf..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderTypePhysicalCreator.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.freeplane.plugin.workspace.creator;
-
-import java.io.File;
-
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.model.AWorkspaceNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.AFolderNode;
-import org.freeplane.plugin.workspace.nodes.FolderLinkNode;
-
-public class FolderTypePhysicalCreator extends AWorkspaceNodeCreator {
-
- public FolderTypePhysicalCreator() {
- }
-
- public AWorkspaceTreeNode getNode(XMLElement data) {
-
- String type = data.getAttribute("type", AFolderNode.FOLDER_TYPE_PHYSICAL);
- FolderLinkNode node = new FolderLinkNode(type);
-
- String path = data.getAttribute("path", null);
- if (path == null) {
- return null;
- }
- node.setPath(URIUtils.createURI(path));
-
- File file = URIUtils.getAbsoluteFile(node.getPath());
- if (file == null) {
- return null;
- }
-
- boolean monitor = Boolean.parseBoolean(data.getAttribute("monitor", "false"));
- node.enableMonitoring(monitor);
-
- boolean descending = Boolean.parseBoolean(data.getAttribute("orderDescending", "false"));
- node.orderDescending(descending);
-
- String name = data.getAttribute("name", file.getName());
- node.setName(name);
-
- return node;
- }
-
- public void endElement(final Object parent, final String tag, final Object currentNode, final XMLElement lastBuiltElement) {
- super.endElement(parent, tag, currentNode, lastBuiltElement);
- if (currentNode == null) {
- return;
- }
-
- WorkspaceController.getFileSystemMgr().scanFileSystem((AWorkspaceTreeNode) currentNode,
- URIUtils.getAbsoluteFile(((FolderLinkNode) currentNode).getPath()));
-
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderTypeVirtualCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderTypeVirtualCreator.java
deleted file mode 100644
index 4671a7c..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/FolderTypeVirtualCreator.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.freeplane.plugin.workspace.creator;
-
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.workspace.model.AWorkspaceNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.AFolderNode;
-import org.freeplane.plugin.workspace.nodes.FolderVirtualNode;
-
-public class FolderTypeVirtualCreator extends AWorkspaceNodeCreator {
-
- public FolderTypeVirtualCreator() {
- }
-
- @Override
- public AWorkspaceTreeNode getNode(XMLElement data) {
- String name = data.getAttribute("name", "virtual folder");
- String type = data.getAttribute("type", AFolderNode.FOLDER_TYPE_VIRTUAL);
- FolderVirtualNode node = new FolderVirtualNode(type);
- node.setName(name);
- return node;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/LinkCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/LinkCreator.java
deleted file mode 100644
index 09504ee..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/LinkCreator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 16.08.2011
- */
-package org.freeplane.plugin.workspace.creator;
-
-import java.util.Hashtable;
-
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.workspace.model.AWorkspaceNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-/**
- *
- */
-public class LinkCreator extends AWorkspaceNodeCreator {
-
- private Hashtable<String, AWorkspaceNodeCreator> creatorTable = new Hashtable<String, AWorkspaceNodeCreator>();
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public void addTypeCreator(final String typeName, final AWorkspaceNodeCreator creator) {
- if(creatorTable.containsKey(typeName)) {
- creatorTable.remove(typeName);
- }
- creatorTable.put(typeName, creator);
- }
-
- public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement lastBuiltElement) {
- String type = lastBuiltElement.getAttribute("type", null);
- if(type == null || !creatorTable.containsKey(type)) {
- return;
- }
-
- AWorkspaceNodeCreator creator = creatorTable.get(type);
- creator.endElement(parent, tag, userObject, lastBuiltElement);
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- public AWorkspaceTreeNode getNode(XMLElement data) {
- String type = data.getAttribute("type", null);
- if(type == null || !creatorTable.containsKey(type)) {
- return null;
- }
-
- AWorkspaceNodeCreator creator = creatorTable.get(type);
- return creator.getNode(data);
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/LinkTypeFileCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/LinkTypeFileCreator.java
deleted file mode 100644
index 2e8e854..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/LinkTypeFileCreator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.freeplane.plugin.workspace.creator;
-
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.model.AWorkspaceNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
-
-public class LinkTypeFileCreator extends AWorkspaceNodeCreator {
-
- public LinkTypeFileCreator() {
- }
-
- @Override
- public AWorkspaceTreeNode getNode(XMLElement data) {
- String type = data.getAttribute("type", "file");
- LinkTypeFileNode node = new LinkTypeFileNode(type);
-
-
- String path = data.getAttribute("path", null);
- if (path == null || path.length() == 0) {
- return null;
- }
- node.setLinkURI(URIUtils.createURI(path));
- String name = data.getAttribute("name", URIUtils.getAbsoluteFile(node.getLinkURI()).getName());
- node.setName(name);
-
- return node;
-
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/ProjectRootCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/ProjectRootCreator.java
deleted file mode 100644
index 0d5c323..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/creator/ProjectRootCreator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.freeplane.plugin.workspace.creator;
-
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.workspace.model.AWorkspaceNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.ProjectRootNode;
-
-public class ProjectRootCreator extends AWorkspaceNodeCreator {
-
-
- public ProjectRootCreator() {
-
- }
-
- public AWorkspaceTreeNode getNode(XMLElement data) {
- ProjectRootNode node = new ProjectRootNode();
- String name = data.getAttribute("name", "project");
- String id = data.getAttribute("id", null);
- String version = data.getAttribute("version", "freeplane 1.0");
- node.setName(name);
- node.setProjectID(id);
- node.setVersion(version);
- return node;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/AClipboardController.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/AClipboardController.java
deleted file mode 100644
index 6af376d..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/AClipboardController.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.freeplane.plugin.workspace.dnd;
-
-import java.awt.datatransfer.ClipboardOwner;
-
-public abstract class AClipboardController {
-
- private ClipboardOwner owner;
- private Object ownerLock = new Object();
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public ClipboardOwner getClipboardOwner() {
- synchronized (ownerLock ) {
- return owner;
- }
- }
-
- public void resetClipboardOwner(ClipboardOwner oldOwner) {
- synchronized (ownerLock ) {
- if(owner == oldOwner) {
- owner = null;
- }
- }
- }
-
- public void setClipboardOwner(ClipboardOwner newOwner) {
- synchronized (ownerLock ) {
- owner = newOwner;
- }
- }
-
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/DnDController.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/DnDController.java
deleted file mode 100644
index 864918e..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/DnDController.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package org.freeplane.plugin.workspace.dnd;
-
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-
-public class DnDController {
-
- private static AClipboardController systemCBCtrl = null;
- private static Set<Class<? extends AWorkspaceTreeNode>> dropExcludeNodeTypes = new LinkedHashSet<Class<? extends AWorkspaceTreeNode>>();
-
- public static AClipboardController getSystemClipboardController() {
- if(systemCBCtrl == null) {
- systemCBCtrl = new AClipboardController() {
- };
- }
- return systemCBCtrl;
- }
-
- public static boolean isDropAllowed(AWorkspaceTreeNode node) {
- if(node == null) {
- return false;
- }
- synchronized (dropExcludeNodeTypes) {
- if(dropExcludeNodeTypes .contains(node.getClass())) {
- return false;
- }
- return true;
- }
- }
-
- public static void excludeFromDND(Class<? extends AWorkspaceTreeNode> clzz) {
- if(clzz == null) {
- return;
- }
- synchronized (dropExcludeNodeTypes) {
- dropExcludeNodeTypes.add(clzz);
- }
- }
-
- public static void resetExcludeDropSet() {
- synchronized (dropExcludeNodeTypes) {
- dropExcludeNodeTypes.clear();
- }
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/INodeDropHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/INodeDropHandler.java
deleted file mode 100644
index 7e68621..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/INodeDropHandler.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.freeplane.plugin.workspace.dnd;
-
-import java.awt.datatransfer.Transferable;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public interface INodeDropHandler {
-
- public boolean processDrop(AWorkspaceTreeNode targetNode, Transferable transferable, int dropAction);
-
- public boolean acceptDrop(Transferable transferable);
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/IWorkspaceTransferableCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/IWorkspaceTransferableCreator.java
deleted file mode 100644
index fd7064b..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/IWorkspaceTransferableCreator.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 12.08.2011
- */
-package org.freeplane.plugin.workspace.dnd;
-
-
-/**
- *
- */
-public interface IWorkspaceTransferableCreator {
- public WorkspaceTransferable getTransferable();
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/IWorspaceClipboardOwner.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/IWorspaceClipboardOwner.java
deleted file mode 100644
index 878193c..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/IWorspaceClipboardOwner.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.freeplane.plugin.workspace.dnd;
-
-import java.awt.datatransfer.ClipboardOwner;
-
-public interface IWorspaceClipboardOwner extends ClipboardOwner {
- public WorkspaceTransferable getTransferable();
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/NoDropHandlerFoundExeption.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/NoDropHandlerFoundExeption.java
deleted file mode 100644
index a5673aa..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/NoDropHandlerFoundExeption.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.freeplane.plugin.workspace.dnd;
-
-import java.io.IOException;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public class NoDropHandlerFoundExeption extends IOException {
-
- private static final long serialVersionUID = 1L;
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public NoDropHandlerFoundExeption(AWorkspaceTreeNode targetNode) {
- super("no drop handler has been registered for: "+ targetNode.getClass());
- }
-
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/WorkspaceTransferHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/WorkspaceTransferHandler.java
deleted file mode 100644
index 0585e90..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/WorkspaceTransferHandler.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 27.07.2011
- */
-package org.freeplane.plugin.workspace.dnd;
-
-import java.awt.Insets;
-import java.awt.Point;
-import java.awt.Rectangle;
-import java.awt.datatransfer.Clipboard;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.DnDConstants;
-import java.awt.dnd.DropTarget;
-import java.awt.dnd.DropTargetDragEvent;
-import java.awt.dnd.DropTargetDropEvent;
-import java.awt.dnd.DropTargetEvent;
-import java.awt.dnd.DropTargetListener;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import javax.swing.JComponent;
-import javax.swing.JTree;
-import javax.swing.TransferHandler;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.IWorkspaceView;
-import org.freeplane.plugin.workspace.components.WorkspaceNodeRenderer;
-import org.freeplane.plugin.workspace.features.AWorkspaceModeExtension;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.WorkspaceRootNode;
-/**
- *
- */
-public class WorkspaceTransferHandler extends TransferHandler implements DropTargetListener {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private static final Insets DEFAULT_INSETS = new Insets(20, 20, 20, 20);
-
- private JTree tree;
-
- private Map<Class<? extends AWorkspaceTreeNode>, INodeDropHandler> dropHandlers = new LinkedHashMap<Class<? extends AWorkspaceTreeNode>, INodeDropHandler>();
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public WorkspaceTransferHandler(JTree tree) {
- this.tree = tree;
- this.tree.setTransferHandler(this);
- this.tree.setDragEnabled(true);
- this.tree.setAutoscrolls(true);
- new DropTarget(tree, COPY_OR_MOVE, this);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public static WorkspaceTransferHandler configureDragAndDrop(JTree tree) {
- return new WorkspaceTransferHandler(tree);
- }
-
- private void autoscroll(JTree tree, Point cursorLocation) {
- Insets insets = DEFAULT_INSETS;
- Rectangle outer = tree.getVisibleRect();
- Rectangle inner = new Rectangle(outer.x + insets.left, outer.y + insets.top, outer.width - (insets.left + insets.right),
- outer.height - (insets.top + insets.bottom));
- if (!inner.contains(cursorLocation)) {
- Rectangle scrollRect = new Rectangle(cursorLocation.x - insets.left, cursorLocation.y - insets.top, insets.left
- + insets.right, insets.top + insets.bottom);
- tree.scrollRectToVisible(scrollRect);
- }
- }
-
- public Transferable createTransferable(JComponent comp) {
- WorkspaceTransferable transferable = null;
- if (comp instanceof JTree) {
- JTree t = (JTree) comp;
- for (TreePath p : t.getSelectionPaths()) {
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) p.getLastPathComponent();
- if (node instanceof IWorkspaceTransferableCreator) {
- if(transferable == null) {
- transferable = ((IWorkspaceTransferableCreator)node).getTransferable();
- }
- else {
- transferable.merge(((IWorkspaceTransferableCreator)node).getTransferable());
- }
- }
- }
- }
- return transferable;
-
- }
-
- public boolean importData(JComponent comp, Transferable transf) {
- if (comp instanceof JTree) {
- JTree t = (JTree) comp;
- for (TreePath p : t.getSelectionPaths()) {
- AWorkspaceTreeNode targetNode = (AWorkspaceTreeNode) p.getLastPathComponent();
- if (DnDController.isDropAllowed(targetNode)) {
- if(transf == null) {
- return false;
- }
- try {
- return handleDrop(targetNode, transf, DnDConstants.ACTION_COPY);
- } catch (NoDropHandlerFoundExeption e) {
- LogUtils.info("org.freeplane.plugin.workspace.dnd.WorkspaceTransferHandler.importData(comp, transf): " + e.getMessage());
- }
- }
- }
- }
- return false;
- }
-
- public int getSourceActions(JComponent comp) {
- AWorkspaceModeExtension ctrl = WorkspaceController.getCurrentModeExtension();
- if(ctrl.getView().containsComponent(comp)) {
- TreePath selectionPath = ctrl.getView().getSelectionPath();
- if(selectionPath != null) {
- if(selectionPath.getLastPathComponent() instanceof WorkspaceRootNode) {
- return NONE;
- }
- //SYSTEM NODES are vulnerable for DnD move events (e.g. Copy a system file link and delete the copy hard afterwards, maybe the original will also be deleted.)
- if(selectionPath.getLastPathComponent() instanceof AWorkspaceTreeNode
- && ( ((AWorkspaceTreeNode) selectionPath.getLastPathComponent()).isSystem() || !((AWorkspaceTreeNode) selectionPath.getLastPathComponent()).isTransferable() ) ) {
- //DOCEAR: REJECT DnD on system nodes for now
- return NONE;
- }
- }
- }
- return comp.getDropTarget().getDefaultActions();
- }
-
- public void exportToClipboard(JComponent comp, Clipboard clip, int action) throws IllegalStateException {
- super.exportToClipboard(comp, clip, action);
- }
-
- // Causes the Swing drag support to be initiated.
- public void exportAsDrag(JComponent comp, java.awt.event.InputEvent e, int action) {
- super.exportAsDrag(comp, e, action);
- }
-
- // Invoked after data has been exported.
- public void exportDone(JComponent source, Transferable data, int action) {
- super.exportDone(source, data, action);
- }
-
- public boolean handleDrop(AWorkspaceTreeNode targetNode, Transferable transf, int dndAction) throws NoDropHandlerFoundExeption {
- if(targetNode == null) {
- throw new IllegalArgumentException("targetNode is NULL");
- }
-
- INodeDropHandler h = findHandler(targetNode.getClass());
- if(h == null) {
- throw new NoDropHandlerFoundExeption(targetNode);
- }
-
- if(h.acceptDrop(transf)) {
- return h.processDrop(targetNode, transf, dndAction);
- }
- return false;
- }
-
- private INodeDropHandler findHandler(Class<?> clzz) {
- if(clzz == null) {
- return null;
- }
-
- INodeDropHandler h = dropHandlers.get(clzz);
-// if(h == null) {
-//
-// for (Class<?> interf : clzz.getInterfaces()) {
-// h = findHandler(interf);
-// if(h != null) {
-// return h;
-// }
-// }
-//
-// h = findHandler((Class<?>) clzz.getSuperclass());
-// }
-//
- return h;
- }
-
- public void registerNodeDropHandler(Class<? extends AWorkspaceTreeNode> clzz, INodeDropHandler handler) {
- if(clzz == null || handler == null) {
- return;
- }
- synchronized (dropHandlers) {
- dropHandlers.put(clzz, handler);
- }
- }
-
- private boolean processDrop(AWorkspaceTreeNode targetNode, DropTargetDropEvent event) {
- event.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
-
-
- final Transferable transferable = event.getTransferable();
- final int dropAction = event.getDropAction();
- try {
- if(!targetNode.getAllowsChildren()) {
- targetNode = targetNode.getParent();
- }
- if(!DnDController.isDropAllowed(targetNode)) {
- event.dropComplete(false);
- return false;
- }
- if(handleDrop(targetNode, transferable, dropAction)) {
- event.dropComplete(true);
- return true;
- }
- } catch (NoDropHandlerFoundExeption e) {
- LogUtils.info("org.freeplane.plugin.workspace.dnd.WorkspaceTransferHandler.processDrop(targetNode, event): "+ e.getMessage());
- }
-
- event.dropComplete(false);
- return false;
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- /* DropTarget Methods */
-
- public final void drop(DropTargetDropEvent event) {
- IWorkspaceView view = WorkspaceController.getCurrentModeExtension().getView();
- if(view == null) {
- return;
- }
-
- TreePath targetPath = view.getPathForLocation(event.getLocation().x, event.getLocation().y);
- if(targetPath != null) {
- AWorkspaceTreeNode targetNode = (AWorkspaceTreeNode) targetPath.getLastPathComponent();
- if(processDrop(targetNode, event)) {
- return;
- }
- }
- event.rejectDrop();
- }
-
- public final void dragEnter(DropTargetDragEvent dtde) {
- dtde.getDropTargetContext().getDropTarget().setDefaultActions(COPY_OR_MOVE);
- //LogUtils.info("org.freeplane.plugin.workspace.dnd.WorkspaceTransferHandler.dragEnter(dtde)");
- }
-
- public final void dragExit(DropTargetEvent dte) {
- dte.getDropTargetContext().getDropTarget().setDefaultActions(COPY);
- //LogUtils.info("org.freeplane.plugin.workspace.dnd.WorkspaceTransferHandler.dragExit(dte)");
- }
-
- private TreePath lastPathLocation = null;
- public final void dragOver(DropTargetDragEvent dtde) {
- autoscroll(this.tree, dtde.getLocation());
- TreePath path = tree.getPathForLocation(dtde.getLocation().x, dtde.getLocation().y);
- if(path == lastPathLocation) {
- return;
- }
- WorkspaceNodeRenderer renderer = (WorkspaceNodeRenderer) tree.getCellRenderer();
- if(path != null && path != lastPathLocation) {
- lastPathLocation = path;
- renderer.highlightRow(tree.getRowForLocation(dtde.getLocation().x, dtde.getLocation().y));
- tree.repaint();
- }
- else if(lastPathLocation != null) {
- lastPathLocation = null;
- renderer.highlightRow(-1);
- tree.repaint();
- }
- }
-
- public final void dropActionChanged(DropTargetDragEvent dtde) {
- //LogUtils.info("org.freeplane.plugin.workspace.dnd.WorkspaceTransferHandler.dropActionChanged(dtde)");
- }
-
-
-
- /***********************************************************************************
- * INTERNAL CLASSES
- **********************************************************************************/
-
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/WorkspaceTransferable.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/WorkspaceTransferable.java
deleted file mode 100644
index a7200da..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/dnd/WorkspaceTransferable.java
+++ /dev/null
@@ -1,216 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 29.07.2011
- */
-package org.freeplane.plugin.workspace.dnd;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.io.File;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.List;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.AFolderNode;
-
-/**
- *
- */
-public class WorkspaceTransferable implements Transferable {
-
- public static DataFlavor WORKSPACE_DROP_ACTION_FLAVOR; // = new DataFlavor("text/drop-action; class=java.lang.String");
- public static DataFlavor WORKSPACE_NODE_FLAVOR; // = new DataFlavor("application/x-java-jvm-local-objectref; class=org.freeplane.plugin.workspace.config.node.AWorkspaceNode");
- public static DataFlavor WORKSPACE_FILE_LIST_FLAVOR; // = DataFlavor.javaFileListFlavor;
- public static DataFlavor WORKSPACE_FREEPLANE_NODE_FLAVOR; // = new DataFlavor("text/freeplane-nodes; class=java.lang.String");
- public static DataFlavor WORKSPACE_SERIALIZED_FLAVOR;
- public static DataFlavor WORKSPACE_URI_LIST_FLAVOR;
- public static DataFlavor WORKSPACE_MOVE_NODE_FLAVOR;
- static {
- try {
- WORKSPACE_DROP_ACTION_FLAVOR = new DataFlavor("text/drop-action; class=java.lang.String");
- WORKSPACE_NODE_FLAVOR = new DataFlavor("application/x-java-jvm-local-objectref; class=java.util.List");
- WORKSPACE_FILE_LIST_FLAVOR = new DataFlavor("application/x-java-file-list; class=java.util.List");
- WORKSPACE_FREEPLANE_NODE_FLAVOR = new DataFlavor("text/freeplane-nodes; class=java.lang.String");
- WORKSPACE_SERIALIZED_FLAVOR = new DataFlavor("application/x-java-serialized-object; class=java.lang.String");
- WORKSPACE_URI_LIST_FLAVOR = new DataFlavor("text/uri-list; class=java.lang.String");
- WORKSPACE_MOVE_NODE_FLAVOR = new DataFlavor("text/move-action; class=java.lang.String");
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
-
- private final Hashtable<DataFlavor, Object> dataMap = new Hashtable<DataFlavor, Object>();
- private boolean isCopy = true;
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public WorkspaceTransferable(DataFlavor flavor, Object data) {
- addData(flavor, data);
- }
-
- public WorkspaceTransferable() {
- }
-
-
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public boolean isCopy() {
- return this.isCopy ;
- }
-
- public void setAsCopy(boolean asCopy) {
- boolean old = isCopy();
- this.isCopy = asCopy;
- if(old != isCopy()) {
- if(isCopy()) {
- dataMap.remove(WORKSPACE_MOVE_NODE_FLAVOR);
- }
- else {
- dataMap.put(WORKSPACE_MOVE_NODE_FLAVOR, "move-action");
- }
- }
- }
-
- public boolean addData(DataFlavor flavor, Object data) {
- dataMap.put(flavor, data);
- return true;
- }
-
- public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
- if(dataMap.containsKey(flavor)) {
- return dataMap.get(flavor);
- }
- throw new UnsupportedFlavorException(flavor);
- }
-
- public DataFlavor[] getTransferDataFlavors() {
- DataFlavor[] flavors = new DataFlavor[dataMap.size()];
- int i = 0;
- for(Enumeration<DataFlavor> e = dataMap.keys(); e.hasMoreElements(); i++) {
- flavors[i] = e.nextElement();
- }
- return flavors;
- }
-
- // Returns whether or not the specified data flavor is supported for
- // this object.
- public boolean isDataFlavorSupported(DataFlavor flavor) {
- if(dataMap.containsKey(flavor)) {
- return true;
- }
- return false;
- }
-
- public void merge(WorkspaceTransferable transferable) {
- if(transferable == null) {
- return;
- }
- for(DataFlavor flavor : transferable.getTransferDataFlavors()) {
- if(isDataFlavorSupported(flavor)) {
- try {
- merge(flavor, transferable.getTransferData(flavor));
- } catch (UnsupportedFlavorException e) {
- //cannot happen
- }
- }
- else {
- try {
- addData(flavor, transferable.getTransferData(flavor));
- } catch (UnsupportedFlavorException e) {
- //cannot happen
- }
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- private void merge(DataFlavor flavor, Object transferData) {
- if(flavor.equals(WORKSPACE_URI_LIST_FLAVOR)) {
- mergeURIList((String)transferData);
- }
- else if(flavor.equals(WORKSPACE_FILE_LIST_FLAVOR)) {
- mergeFileList((List<File>)transferData);
- }
- else if(flavor.equals(WORKSPACE_NODE_FLAVOR)) {
- mergeNodeList((List<AWorkspaceTreeNode>)transferData);
- }
-
- }
-
- @SuppressWarnings("unchecked")
- private void mergeNodeList(List<AWorkspaceTreeNode> transferData) {
- List<AWorkspaceTreeNode> nodes = (List<AWorkspaceTreeNode>) dataMap.get(WORKSPACE_NODE_FLAVOR);
- for (AWorkspaceTreeNode newNode : transferData) {
- if(!nodes.contains(newNode)) {
- nodes.add(newNode);
- }
- }
- }
-
- @SuppressWarnings("unchecked")
- private void mergeFileList(List<File> transferData) {
- List<File> files = (List<File>) dataMap.get(WORKSPACE_FILE_LIST_FLAVOR);
- for (File newFile : transferData) {
- if(!files.contains(newFile)) {
- files.add(newFile);
- }
- }
- }
-
- private void mergeURIList(String transferData) {
- String URI_SEP = "\r\n";
- String[] uris = transferData.split(URI_SEP);
- StringBuffer buffer = new StringBuffer((String)dataMap.get(WORKSPACE_URI_LIST_FLAVOR));
- for (String uri : uris) {
- if(buffer.indexOf(uri) < 0) {
- buffer.append(URI_SEP);
- buffer.append(uri);
- }
- }
-
- }
-
- @SuppressWarnings("unchecked")
- public boolean contains(AWorkspaceTreeNode node) {
- if(node != null) {
- List<AWorkspaceTreeNode> nodes = (List<AWorkspaceTreeNode>) dataMap.get(WORKSPACE_NODE_FLAVOR);
- if(nodes != null) {
- for (AWorkspaceTreeNode inNode : nodes) {
- if(inNode.getKey().equals(node.getKey())) {
- return true;
- }
- }
- }
- }
- return false;
- }
-
- @SuppressWarnings("unchecked")
- public void refreshNodes() {
- List<AWorkspaceTreeNode> nodes = (List<AWorkspaceTreeNode>) dataMap.get(WORKSPACE_NODE_FLAVOR);
- if(nodes != null) {
- for (AWorkspaceTreeNode node : nodes) {
- if(!(node instanceof AFolderNode)) {
- node.getParent().refresh();
- }
- else {
- node.refresh();
- }
- }
- }
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/AWorkspaceEvent.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/AWorkspaceEvent.java
deleted file mode 100644
index c9bbc9b..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/AWorkspaceEvent.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 19.08.2011
- */
-package org.freeplane.plugin.workspace.event;
-
-import java.util.EventObject;
-
-
-/**
- *
- */
-public class AWorkspaceEvent extends EventObject {
-
- private static final long serialVersionUID = 1L;
-
- private transient boolean consumed = false;
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
- /**
- * @param source
- */
- public AWorkspaceEvent(final Object source) {
- super(source);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public void consume() {
- this.consumed = true;
- }
-
- public boolean isConsumed() {
- return this.consumed;
- }
-
-
- /**
- * Returns a String representation of this Event.
- *
- * @return a String representation of this Event.
- */
- public String toString() {
- return getClass().getName() + "[source=" + source + "]";
- }
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/IWorkspaceListener.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/IWorkspaceListener.java
deleted file mode 100644
index f1620e7..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/IWorkspaceListener.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.freeplane.plugin.workspace.event;
-
-public interface IWorkspaceListener {
- public void handleWorkspaceEvent(AWorkspaceEvent event);
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/IWorkspaceNodeActionListener.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/IWorkspaceNodeActionListener.java
deleted file mode 100644
index b3425fb..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/IWorkspaceNodeActionListener.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package org.freeplane.plugin.workspace.event;
-
-
-public interface IWorkspaceNodeActionListener {
- public void handleAction(WorkspaceActionEvent event);
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/WorkspaceActionEvent.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/WorkspaceActionEvent.java
deleted file mode 100644
index 7b17c8b..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/event/WorkspaceActionEvent.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package org.freeplane.plugin.workspace.event;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-
-public class WorkspaceActionEvent {
- public static final int MOUSE_CLICK = 1;
- public static final int MOUSE_DBLCLICK = 256;
- public static final int MOUSE_LEFT = 2;
- public static final int MOUSE_RIGHT = 4;
-
- public static final int MOUSE_LEFT_CLICK = MOUSE_LEFT+MOUSE_CLICK;
- public static final int MOUSE_LEFT_DBLCLICK = MOUSE_LEFT+MOUSE_DBLCLICK;
- public static final int MOUSE_RIGHT_CLICK = MOUSE_RIGHT+MOUSE_CLICK;
- public static final int MOUSE_RIGHT_DBLCLICK = MOUSE_RIGHT+MOUSE_DBLCLICK;
-
- public static final int POPUP_TRIGGER = 64;
- public static final int WSNODE_CHANGED = 128;
-
- public static final int WSNODE_OPEN_DOCUMENT = MOUSE_LEFT_DBLCLICK;
-
- final private AWorkspaceTreeNode source;
- final private int eventType;
- final private int x;
- final private int y;
- final private Object baggage;
-
- private boolean consumed = false;
-
- public WorkspaceActionEvent(AWorkspaceTreeNode source, int eventType, int x, int y) {
- this(source, eventType, x, y, null);
- }
-
- public WorkspaceActionEvent(AWorkspaceTreeNode source, int eventType, Object baggage) {
- this(source, eventType, 0, 0, baggage);
- }
-
- public WorkspaceActionEvent(AWorkspaceTreeNode source, int eventType, int x, int y, Object baggage) {
- this.x = x;
- this.y = y;
- this.source = source;
- this.eventType = eventType;
- this.baggage = baggage;
- }
-
- public AWorkspaceTreeNode getSource() {
- return source;
- }
-
- public int getType() {
- return eventType;
- }
-
- public int getX() {
- return x;
- }
-
- public int getY() {
- return y;
- }
-
- public Object getBaggage() {
- return baggage;
- }
-
- public void consume() {
- consumed = true;
- }
-
- public boolean isConsumed() {
- return consumed;
- }
-
- private String getTypeTranslated() {
- String type = "";
- if((this.getType()&MOUSE_LEFT) > 0)
- type += "MOUSE_LEFT";
- if((this.getType()&MOUSE_RIGHT) > 0)
- type += "MOUSE_RIGHT";
- if((this.getType()&MOUSE_CLICK) > 0)
- type += "_CLICK";
- if((this.getType()&MOUSE_DBLCLICK) > 0)
- type += "_DBLCLICK";
- if(this.getType() == WSNODE_CHANGED)
- type = "WSNODE_CHANGED";
- return type;
- }
-
- public String toString() {
- return "WorkspaceNodeEvent[type="+getTypeTranslated()+";x="+getX()+";y="+getY()+";source={"+getSource()+((getBaggage()!=null)?"};baggage={"+getBaggage():"")+"}]";
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/AWorkspaceModeExtension.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/AWorkspaceModeExtension.java
deleted file mode 100644
index 5a8f350..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/AWorkspaceModeExtension.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.freeplane.plugin.workspace.features;
-
-import java.net.URI;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.plugin.workspace.components.IWorkspaceView;
-import org.freeplane.plugin.workspace.event.AWorkspaceEvent;
-import org.freeplane.plugin.workspace.event.IWorkspaceListener;
-import org.freeplane.plugin.workspace.handler.IOController;
-import org.freeplane.plugin.workspace.io.FileReadManager;
-import org.freeplane.plugin.workspace.model.WorkspaceModel;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-import org.freeplane.plugin.workspace.model.project.ProjectLoader;
-
-public abstract class AWorkspaceModeExtension implements IExtension {
- private final IOController workspaceIOController = new IOController();
- private final Set<IWorkspaceListener> listeners = new LinkedHashSet<IWorkspaceListener>();
- private ProjectLoader projectLoader;
-
- public AWorkspaceModeExtension(ModeController modeController) {
- }
- public abstract void start(ModeController modeController);
-
- public abstract WorkspaceModel getModel();
- public abstract void setModel(WorkspaceModel model);
- public abstract IWorkspaceView getView();
- public abstract FileReadManager getFileTypeManager();
- public abstract URI getDefaultProjectHome();
- public abstract AWorkspaceProject getCurrentProject();
- public abstract void save();
-
- public abstract void shutdown();
-
- public IOController getIOController() {
- return workspaceIOController;
- }
-
- public final void addWorkspaceListener(IWorkspaceListener listener) {
- if(listener == null) {
- return;
- }
- synchronized (listeners) {
- listeners.add(listener);
- }
- }
-
- public final void removeWorkspaceListener(IWorkspaceListener listener) {
- if(listener == null) {
- return;
- }
- synchronized (listeners) {
- listeners.remove(listener);
- }
- }
-
- public final void dispatchWorkspaceEvent(AWorkspaceEvent event) {
- synchronized (listeners) {
- for (IWorkspaceListener listener : listeners) {
- listener.handleWorkspaceEvent(event);
- }
- }
- }
-
- public ProjectLoader getProjectLoader() {
- if(this.projectLoader == null) {
- this.projectLoader = new ProjectLoader();
- }
- return this.projectLoader;
- }
-
- public void setProjectLoader(ProjectLoader loader) {
- this.projectLoader = loader;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/ModeControlAlreadyRegisteredException.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/ModeControlAlreadyRegisteredException.java
deleted file mode 100644
index 11fb0ad..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/ModeControlAlreadyRegisteredException.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package org.freeplane.plugin.workspace.features;
-
-import org.freeplane.features.mode.ModeController;
-
-public class ModeControlAlreadyRegisteredException extends Exception {
-
- private static final long serialVersionUID = 398606359024873584L;
-
- public ModeControlAlreadyRegisteredException(Class<? extends ModeController> modeController) {
- super("a workspace control is already registered for this mode: "+modeController);
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/ProjectURLHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/ProjectURLHandler.java
deleted file mode 100644
index 66ea08f..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/ProjectURLHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.freeplane.plugin.workspace.features;
-
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLConnection;
-
-import org.apache.commons.io.IOExceptionWithCause;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-import org.osgi.service.url.AbstractURLStreamHandlerService;
-
-public class ProjectURLHandler extends AbstractURLStreamHandlerService {
-
- public URLConnection openConnection(URL url) throws IOException {
- //WORKSPACE - todo: extend with meaningful exception messages
- AWorkspaceProject project = WorkspaceController.getCurrentModel().getProject(url.getAuthority());
- URL absolutePath = resolve(project, url);
- return absolutePath.openConnection();
- }
-
- /**
- * resolve a project-relative path
- * @param project
- * @param url
- * @return
- * @throws IOException
- */
- public static URL resolve(AWorkspaceProject project, URL url) throws IOException {
- if(project == null) {
- throw new IOException("project id is missing");
- }
-
- URL absolutePath = url;
- try {
- String urlFile = url.getFile();
- urlFile = urlFile.startsWith("/") ? urlFile.substring(1): urlFile;
- String projectUrl = project.getProjectHome().toURL().toExternalForm();
- projectUrl = projectUrl.endsWith("/") ? projectUrl.substring(0, projectUrl.length()-1): projectUrl;
- absolutePath = new URL(projectUrl+"/"+urlFile);
- } catch (Exception e) {
- throw new IOExceptionWithCause(e);
- }
- return absolutePath;
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/PropertyUrlHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/PropertyUrlHandler.java
deleted file mode 100644
index 67d052c..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/PropertyUrlHandler.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.freeplane.plugin.workspace.features;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URL;
-import java.net.URLConnection;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.osgi.service.url.AbstractURLStreamHandlerService;
-
-public class PropertyUrlHandler extends AbstractURLStreamHandlerService {
-
- public URLConnection openConnection(URL url) throws IOException {
- String propertyName = url.getPath();
- if (propertyName.startsWith("/")) {
- propertyName = propertyName.substring(1);
- }
-
- String property = ResourceController.getResourceController().getProperty(propertyName);
-
- if (property!=null && property.length()>0) {
- File file = new File(property);
- URL ret = file.toURI().toURL();
- return ret.openConnection();
- }
- LogUtils.warn("Property Path :"+url+" is unknown");
- return null;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/WorkspaceMapModelExtension.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/WorkspaceMapModelExtension.java
deleted file mode 100644
index 1132085..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/WorkspaceMapModelExtension.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.freeplane.plugin.workspace.features;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public class WorkspaceMapModelExtension implements IExtension {
- private AWorkspaceProject project = null;
-
- public AWorkspaceProject getProject() {
- return this.project;
- }
-
- public void setProject(AWorkspaceProject project) {
- this.project = project;
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/WorkspaceModelExtensionWriterReader.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/WorkspaceModelExtensionWriterReader.java
deleted file mode 100644
index 5516661..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/WorkspaceModelExtensionWriterReader.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.freeplane.plugin.workspace.features;
-
-import org.freeplane.core.extension.IExtension;
-import org.freeplane.core.io.IAttributeHandler;
-import org.freeplane.core.io.IExtensionAttributeWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.IMapLifeCycleListener;
-import org.freeplane.features.map.MapController;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public class WorkspaceModelExtensionWriterReader implements IExtensionAttributeWriter {
-
- private static final String PROJECT_ID_XML_TAG = "project";
- private static final String MAP_EXTENSION_XML_TAG = "map";
- private static final String PROJECT_HOME_XML_TAG = "project_last_home";
-
- private WorkspaceModelExtensionWriterReader(MapController mapController) {
- registerAttributeHandlers(mapController.getReadManager());
- mapController.getWriteManager().addExtensionAttributeWriter(WorkspaceMapModelExtension.class, this);
- mapController.addMapLifeCycleListener(new IMapLifeCycleListener() {
-
- public void onRemove(MapModel map) {}
-
- public void onCreate(MapModel map) {
- WorkspaceMapModelExtension wmme = WorkspaceController.getMapModelExtension(map);
- if(wmme.getProject() == null) {
- //WORKSPACE - fixme: make sure a project is loaded and selected?
- try {
- WorkspaceController.addMapToProject(map, WorkspaceController.getCurrentProject());
- }
- catch (Exception e) {
- LogUtils.warn("Exception in "+this.getClass()+".onCreate(MapModel): no current project was selected");
- }
- }
- }
- });
- }
-
- private void registerAttributeHandlers(ReadManager reader) {
- reader.addAttributeHandler(MAP_EXTENSION_XML_TAG, PROJECT_ID_XML_TAG, new IAttributeHandler() {
-
- public void setAttribute(Object map, String value) {
- final MapModel mapModel = (MapModel) map;
-
- WorkspaceMapModelExtension wmme = WorkspaceController.getMapModelExtension(mapModel);
- if(wmme.getProject() == null) {
- AWorkspaceProject prj = WorkspaceController.getCurrentModel().getProject(value);
- if(prj == null) {
- //WORKSPACE - todo: propagate exception
- LogUtils.warn("project with id="+value+" was not found");
- return;
- }
- wmme.setProject(prj);
- }
- }
- });
-
- reader.addAttributeHandler(MAP_EXTENSION_XML_TAG, PROJECT_HOME_XML_TAG, new IAttributeHandler() {
-
- public void setAttribute(Object map, String value) {
- final MapModel mapModel = (MapModel) map;
-
- WorkspaceMapModelExtension wmme = WorkspaceController.getMapModelExtension(mapModel);
- if(wmme.getProject() == null) {
- //WORKSPACE - todo: find project for uri?
-// AWorkspaceProject prj = WorkspaceController.getCurrentModel().getProject(value);
-// if(prj == null) {
-// //WORKSPACE - todo: propagate exception
-// LogUtils.warn("project with id="+value+" was not found");
-// return;
-// }
-// wmme.setProject(prj);
- }
- else {
- //ignore
- }
- }
- });
- }
-
- public void writeAttributes(ITreeWriter writer, Object userObject, IExtension extension) {
- final WorkspaceMapModelExtension wmme = extension != null ? (WorkspaceMapModelExtension) extension : WorkspaceController.getMapModelExtension(((NodeModel) userObject).getMap());
- AWorkspaceProject prj = wmme.getProject();
-
- if(prj == null) {
- return;
- }
- writer.addAttribute(PROJECT_ID_XML_TAG, prj.getProjectID());
- writer.addAttribute(PROJECT_HOME_XML_TAG, prj.getProjectHome().toString());
- }
-
- public static void register(ModeController modeController) {
- new WorkspaceModelExtensionWriterReader(modeController.getMapController());
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/WorkspaceUrlHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/WorkspaceUrlHandler.java
deleted file mode 100644
index c7bfcc5..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/features/WorkspaceUrlHandler.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.freeplane.plugin.workspace.features;
-
-import java.io.IOException;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLConnection;
-
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.osgi.service.url.AbstractURLStreamHandlerService;
-
-/**
- * @deprecated - use {@link ProjectURLHandler} instead
- */
- at Deprecated
-public class WorkspaceUrlHandler extends AbstractURLStreamHandlerService {
-
- public URLConnection openConnection(URL url) throws IOException {
- String path = "";
-// List<AWorkspaceProject> projects = WorkspaceController.getCurrentModel().getProjects();
-// synchronized (projects) {
-// for (AWorkspaceProject project : projects) {
-// File file = new File(project.getProjectHome().getPath() + url.getPath());
-// if(file.exists()) {
-// path = project.getProjectHome().getPath();
-// }
-// }
-// }
-// if(path == null) {
-// return null;
-// }
- path = WorkspaceController.getCurrentProject().getProjectHome().getPath();
- URL ret = new URL("file", null, path + url.getPath());
- try {
- URI uri = ret.toURI();
- if(uri.getPath().startsWith("//")) {
- uri = uri.normalize();
- uri = new URI(uri.getScheme(), null, "///"+uri.getPath(), null);
- }
- else {
- uri = uri.normalize();
- }
- ret = uri.toURL();
- }
- catch (URISyntaxException e) {
- throw new IOException(e.getMessage());
- }
- return ret.openConnection();
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/DefaultFileNodeIconHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/DefaultFileNodeIconHandler.java
deleted file mode 100644
index f4c4c4b..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/DefaultFileNodeIconHandler.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 28.12.2011
- */
-package org.freeplane.plugin.workspace.handler;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Properties;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-
-import org.apache.commons.io.FilenameUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-/**
- *
- */
-public class DefaultFileNodeIconHandler implements INodeTypeIconHandler {
-
- private HashMap<String, Icon> iconMap = new HashMap<String, Icon>();
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public DefaultFileNodeIconHandler() {
- Properties properties = new Properties();
- InputStream inStream = DefaultFileNodeIconHandler.this.getClass().getResourceAsStream("/conf/fileIcons.properties");
- try {
- properties.load(inStream);
- init(properties);
- }
- catch (IOException e) {
- LogUtils.severe("could not load icon configuration for LinkTypeFileIconHandler", e);
- }
- }
-
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- /**
- * @param ext
- * @return
- */
- private Icon selectIconForExtension(String ext) {
- return iconMap.get(ext);
- }
-
- /**
- * @param properties
- */
- private void init(Properties properties) {
- Enumeration<Object> keys = properties.keys();
- while(keys.hasMoreElements()) {
- String key = keys.nextElement().toString();
- if(key.endsWith(".icon")) {
- String keyName = key.substring(0, key.indexOf("."));
- String iconPath = properties.getProperty(key, null);
- URL url = null;
- if(iconPath !=null) {
- url = DefaultFileNodeIconHandler.this.getClass().getResource(iconPath);
- if(url == null) {
- url = ResourceController.class.getResource(iconPath);
- if(url == null) {
- url = ClassLoader.getSystemResource(iconPath);
- if(url == null) {
- url = ClassLoader.getSystemResource(iconPath);
- if(url == null) {
- continue;
- }
- }
- }
- }
- }
- Icon icon = new ImageIcon(url);
- String[] extensions = properties.getProperty(keyName+".extensions", "").split(";");
- for(String ext : extensions) {
- iconMap.put(ext, icon);
- }
-
- }
- }
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public Icon getIconForNode(AWorkspaceTreeNode node) {
- assert(node instanceof IFileSystemRepresentation);
- File file = ((IFileSystemRepresentation) node).getFile();
- if(file != null && file.isFile()) {
- String ext = FilenameUtils.getExtension(file.getName());
- return selectIconForExtension(ext);
- }
- return null;
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/DefaultNodeTypeIconManager.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/DefaultNodeTypeIconManager.java
deleted file mode 100644
index 14596b1..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/DefaultNodeTypeIconManager.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 27.12.2011
- */
-package org.freeplane.plugin.workspace.handler;
-
-import java.util.HashMap;
-
-import javax.swing.Icon;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-/**
- *
- */
-public class DefaultNodeTypeIconManager implements INodeTypeIconManager {
-
- private final HashMap<Class<? extends AWorkspaceTreeNode>, INodeTypeIconHandler> handlers= new HashMap<Class<? extends AWorkspaceTreeNode>, INodeTypeIconHandler>();
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- /* (non-Javadoc)
- * @see org.freeplane.plugin.workspace.controller.INodeTypeIconManager#getIconForNode(org.freeplane.plugin.workspace.model.node.AWorkspaceTreeNode)
- */
- public Icon getIconForNode(AWorkspaceTreeNode node) {
- INodeTypeIconHandler handler = handlers.get(node.getClass());
- if(handler != null) {
- return handler.getIconForNode(node);
- }
- return null;
- }
-
- public void addNodeTypeIconHandler(Class<? extends AWorkspaceTreeNode> type, INodeTypeIconHandler handler) {
- if(type == null || handler == null) {
- return;
- }
- handlers.put(type, handler);
- }
-
- public INodeTypeIconHandler removeNodeTypeIconHandler(Class<? extends AWorkspaceTreeNode> type) {
- if(type == null) {
- return null;
- }
- return handlers.remove(type);
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/DirectoryMergeConflictDialog.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/DirectoryMergeConflictDialog.java
deleted file mode 100644
index 08de7da..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/DirectoryMergeConflictDialog.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.freeplane.plugin.workspace.handler;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Locale;
-import java.util.Properties;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.components.dialog.FileExistsDialogPanel;
-import org.freeplane.plugin.workspace.io.CancelExecutionException;
-import org.freeplane.plugin.workspace.io.IConflictHandler;
-import org.freeplane.plugin.workspace.io.SkipTaskException;
-
-public class DirectoryMergeConflictDialog implements IConflictHandler {
-
- public void resolveConflict(File file, Properties properties) throws IOException {
- if(properties == null) {
- properties = new Properties();
- }
- FileExistsDialogPanel dialog = new FileExistsDialogPanel(file, FileExistsDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".dir.text");
- int opt = JOptionPane.showConfirmDialog(UITools.getFrame(), dialog, TextUtils.getText("workspace.directory.merge.title"), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
- if(opt == JOptionPane.CANCEL_OPTION) {
- throw new CancelExecutionException();
- }
- if(opt == JOptionPane.NO_OPTION) {
- throw new SkipTaskException();
- }
-
- properties.setProperty("mergeAll", String.valueOf(dialog.applyToAll()));
-
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/FileExistsConflictDialog.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/FileExistsConflictDialog.java
deleted file mode 100644
index f341b82..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/FileExistsConflictDialog.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.freeplane.plugin.workspace.handler;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Locale;
-import java.util.Properties;
-
-import javax.swing.JOptionPane;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.components.dialog.FileExistsDialogPanel;
-import org.freeplane.plugin.workspace.io.CancelExecutionException;
-import org.freeplane.plugin.workspace.io.IConflictHandler;
-import org.freeplane.plugin.workspace.io.SkipTaskException;
-
-public class FileExistsConflictDialog implements IConflictHandler {
-
- public void resolveConflict(File file, Properties properties) throws IOException {
- if(properties == null) {
- properties = new Properties();
- }
- FileExistsDialogPanel dialog = new FileExistsDialogPanel(file, FileExistsDialogPanel.class.getSimpleName().toLowerCase(Locale.ENGLISH)+".file.text");
- int opt = JOptionPane.showConfirmDialog(UITools.getFrame(), dialog, TextUtils.getText("workspace.fileexists.title."+ properties.getProperty("opType", "1")), JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
- if(opt == JOptionPane.CANCEL_OPTION) {
- throw new CancelExecutionException();
- }
- if(opt == JOptionPane.NO_OPTION) {
- throw new SkipTaskException();
- }
- properties.setProperty("overwriteAll", String.valueOf(dialog.applyToAll()));
-
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/INodeTypeIconHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/INodeTypeIconHandler.java
deleted file mode 100644
index 14a6808..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/INodeTypeIconHandler.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 27.12.2011
- */
-package org.freeplane.plugin.workspace.handler;
-
-import javax.swing.Icon;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-/**
- *
- */
-public interface INodeTypeIconHandler {
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- public Icon getIconForNode(AWorkspaceTreeNode node);
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/INodeTypeIconManager.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/INodeTypeIconManager.java
deleted file mode 100644
index 0e887eb..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/INodeTypeIconManager.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 27.12.2011
- */
-package org.freeplane.plugin.workspace.handler;
-
-import javax.swing.Icon;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-
-public interface INodeTypeIconManager {
-
- public Icon getIconForNode(AWorkspaceTreeNode node);
- public void addNodeTypeIconHandler(Class<? extends AWorkspaceTreeNode> type, INodeTypeIconHandler handler);
- public INodeTypeIconHandler removeNodeTypeIconHandler(Class<? extends AWorkspaceTreeNode> type);
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/IOController.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/IOController.java
deleted file mode 100644
index de52b2d..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/IOController.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 26.01.2012
- */
-package org.freeplane.plugin.workspace.handler;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Vector;
-
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-/**
- *
- */
-public class IOController {
-
- private final HashMap<Class<? extends AWorkspaceTreeNode>, HashMap<Integer, List<IWorkspaceNodeActionListener>>> listenerMap = new HashMap<Class<? extends AWorkspaceTreeNode>, HashMap<Integer, List<IWorkspaceNodeActionListener>>>();
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- * @param eventType
- * @param node
- **********************************************************************************/
- public List<IWorkspaceNodeActionListener> getNodeActionListeners(Class<? extends AWorkspaceTreeNode> clazz, Integer eventType) {
- HashMap<Integer, List<IWorkspaceNodeActionListener>> wildcard = listenerMap.get(AWorkspaceTreeNode.class);
- HashMap<Integer, List<IWorkspaceNodeActionListener>> levelOne = listenerMap.get(clazz);
- if(levelOne != null) {
- List<IWorkspaceNodeActionListener> result = new ArrayList<IWorkspaceNodeActionListener>();
- if(wildcard != null) {
- List<IWorkspaceNodeActionListener> wildcardListeners = wildcard.get(eventType);
- if(wildcardListeners != null) {
- result.addAll(wildcardListeners);
- }
- }
- if (levelOne.get(eventType) != null) {
- result.addAll(levelOne.get(eventType));
- }
- if(result.size() == 0) {
- return null;
- }
- return result;
- }
- else if(wildcard != null) {
- return wildcard.get(eventType);
-
- }
- return null;
- }
-
-
- public void registerNodeActionListener(Class<? extends AWorkspaceTreeNode> clazz, Integer eventType, IWorkspaceNodeActionListener listener) {
- HashMap<Integer, List<IWorkspaceNodeActionListener>> levelOne = listenerMap.get(clazz);
- if(levelOne == null) {
- HashMap<Integer, List<IWorkspaceNodeActionListener>> levelTwo = new HashMap<Integer, List<IWorkspaceNodeActionListener>>();
- Vector<IWorkspaceNodeActionListener> vec = new Vector<IWorkspaceNodeActionListener>();
- vec.add(listener);
- levelTwo.put(eventType, vec);
- listenerMap.put(clazz, levelTwo);
- }
- else {
- List<IWorkspaceNodeActionListener> listeners = levelOne.get(eventType);
- if(!listeners.contains(listener)) {
- listeners.add(listener);
- }
- }
-
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/LinkTypeFileIconHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/LinkTypeFileIconHandler.java
deleted file mode 100644
index 8004f03..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/handler/LinkTypeFileIconHandler.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 28.12.2011
- */
-package org.freeplane.plugin.workspace.handler;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Properties;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-
-import org.apache.commons.io.FilenameUtils;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
-
-/**
- *
- */
-public class LinkTypeFileIconHandler implements INodeTypeIconHandler {
-
- private HashMap<String, Icon> iconMap = new HashMap<String, Icon>();
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public LinkTypeFileIconHandler() {
- Properties properties = new Properties();
- InputStream inStream = LinkTypeFileIconHandler.this.getClass().getResourceAsStream("/conf/fileIcons.properties");
- try {
- properties.load(inStream);
- init(properties);
- }
- catch (IOException e) {
- LogUtils.severe("could not load icon configuration for LinkTypeFileIconHandler", e);
- }
- }
-
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- /**
- * @param ext
- * @return
- */
- private Icon selectIconForExtension(String ext) {
- return iconMap.get(ext);
- }
-
- /**
- * @param properties
- */
- private void init(Properties properties) {
- Enumeration<Object> keys = properties.keys();
- while(keys.hasMoreElements()) {
- String key = keys.nextElement().toString();
- if(key.endsWith(".icon")) {
- String keyName = key.substring(0, key.indexOf("."));
- String iconPath = properties.getProperty(key, null);
- URL url = null;
- if(iconPath !=null) {
- url = LinkTypeFileIconHandler.this.getClass().getResource(iconPath);
- if(url == null) {
- url = ResourceController.class.getResource(iconPath);
- if(url == null) {
- url = ClassLoader.getSystemResource(iconPath);
- if(url == null) {
- url = ClassLoader.getSystemResource(iconPath);
- if(url == null) {
- continue;
- }
- }
- }
- }
- }
- Icon icon = new ImageIcon(url);
- String[] extensions = properties.getProperty(keyName+".extensions", "").split(";");
- for(String ext : extensions) {
- iconMap.put(ext, icon);
- }
-
- }
- }
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public Icon getIconForNode(AWorkspaceTreeNode node) {
- assert(node instanceof LinkTypeFileNode);
- File file = URIUtils.getAbsoluteFile(((LinkTypeFileNode) node).getLinkURI());
- if(file != null) {
- String ext = FilenameUtils.getExtension(file.getName());
- return selectIconForExtension(ext);
- }
- return null;
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/AFileNodeCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/AFileNodeCreator.java
deleted file mode 100644
index ce8da46..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/AFileNodeCreator.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 21.07.2011
- */
-package org.freeplane.plugin.workspace.io;
-
-import java.io.File;
-import java.util.Vector;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public abstract class AFileNodeCreator implements IFileTypeHandler {
- abstract public AWorkspaceTreeNode getNode(String name, File file);
- private final Vector<Object> typeList = new Vector<Object>();
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public AFileNodeCreator() {
- }
-
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public void addFileType(final String type) {
- assert(type != null);
- if(!typeList.contains(type)) {
- LogUtils.info("["+this.getClass().getName()+"] addFileType: "+type);
- typeList.add(type);
- }
- }
-
- public void removeFileType(final String type) {
- assert(type != null);
- typeList.remove(type);
- }
-
- public void setFileTypeList(final String separatedTypes, final String separator) {
- assert(separator != null || separatedTypes!=null);
- this.typeList.removeAllElements();
- String[] tokens = separatedTypes.trim().split("\\s*["+separator+"]\\s*");
- for(String token : tokens) {
- addFileType(token);
- }
- }
-
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- public AWorkspaceTreeNode createFileNode(AWorkspaceTreeNode parent, String fileExtension, final File file) {
- final AWorkspaceTreeNode node = getNode(file.getName(), file);
- if (node != null) {
- parent.getModel().addNodeTo(node, parent, false);
- return node;
- }
- return parent;
- }
-
-
- public Object[] getSupportedFileTypes() {
- return typeList.toArray();
- }
-
- /***********************************************************************************
- * INTERNAL CLASSES
- **********************************************************************************/
-
- protected static class Path {
- static Path emptyPath() {
- final Path Path = new Path(null);
- Path.path = null;
- return Path;
- }
-
- String parentPath;
- String path;
-
- Path(final String path) {
- parentPath = path;
- }
-
- void setName(final String name) {
- path = parentPath == null ? name : parentPath + '/' + name;
- }
-
- @Override
- public String toString() {
- return path;
- }
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/CancelExecutionException.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/CancelExecutionException.java
deleted file mode 100644
index 9df0924..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/CancelExecutionException.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.freeplane.plugin.workspace.io;
-
-import java.io.IOException;
-
-public class CancelExecutionException extends IOException {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public String getMessage() {
- return "execution canceled";
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/FileReadManager.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/FileReadManager.java
deleted file mode 100644
index d318fb1..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/FileReadManager.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package org.freeplane.plugin.workspace.io;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-
-import org.freeplane.core.io.IReadCompletionListener;
-import org.freeplane.core.io.ListHashTable;
-import org.freeplane.features.map.NodeModel;
-
-public class FileReadManager {
- public final static String DIRECTORY_HANDLE = "__MaG__FS_DIRECTORY__MaG__";
- public final static String DEFAULT_HANDLE = "__MaG__FS_DEFAULT__MaG__";
-
- final private ListHashTable<String, IFileTypeHandler> fileHandlers;
- final private Collection<IReadCompletionListener> readCompletionListeners;
-
- public FileReadManager() {
- super();
- fileHandlers = new ListHashTable<String, IFileTypeHandler>();
- readCompletionListeners = new LinkedList<IReadCompletionListener>();
- }
-
- public void addFileHandler(final String fileExtension, final IFileTypeHandler handler) {
- assert(fileExtension != null);
- assert(fileExtension.length()>0);
- if(fileExtension.toLowerCase().endsWith("default_handle")) {
- fileHandlers.add(DEFAULT_HANDLE, handler);
- return;
- }
- if(fileExtension.toLowerCase().endsWith("directory_handle")) {
- fileHandlers.add(DIRECTORY_HANDLE, handler);
- return;
- }
- fileHandlers.add(fileExtension, handler);
- }
-
- public void addFileHandler(final IFileTypeHandler handler) {
- for(Object ext : handler.getSupportedFileTypes()) {
- addFileHandler(ext.toString(), handler);
- }
- }
-
- public void addReadCompletionListener(final IReadCompletionListener listener) {
- readCompletionListeners.add(listener);
- }
-
- public ListHashTable<String, IFileTypeHandler> getFileTypeHandlers() {
- return fileHandlers;
- }
-
- public void readingCompleted(final NodeModel topNode, final HashMap<String, String> newIds) {
- final Iterator<IReadCompletionListener> iterator = readCompletionListeners.iterator();
- while (iterator.hasNext()) {
- iterator.next().readingCompleted(topNode, newIds);
- }
- }
-
- public void removeElementHandler(final String fileExtension, final IFileTypeHandler handler) {
- final boolean removed = fileHandlers.remove(fileExtension, handler);
- assert removed;
- }
-
- public void removeReadCompletionListener(final IReadCompletionListener listener) {
- final boolean removed = readCompletionListeners.remove(listener);
- assert removed;
- }
-}
-
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/FileSystemManager.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/FileSystemManager.java
deleted file mode 100644
index 83c2ec0..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/FileSystemManager.java
+++ /dev/null
@@ -1,575 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 19.07.2011
- */
-package org.freeplane.plugin.workspace.io;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.commons.io.FileUtils;
-import org.freeplane.core.io.ListHashTable;
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.creator.DefaultFileNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public class FileSystemManager {
-
- private final FileReadManager typeManager;
- private boolean filtering = true;
- private FileReadManager fileTypeManager;
- private static IConflictHandler directoryConflictHandler;
- private static IConflictHandler fileConflictHandler;
-
- public FileSystemManager(final FileReadManager typeManager) {
- if(typeManager == null) {
- this.typeManager = getDefaultFileTypeManager();
- }
- else {
- this.typeManager = typeManager;
- }
- }
-
- public boolean isFiltering() {
- return filtering;
- }
-
- public void setFiltering(boolean filtering) {
- this.filtering = filtering;
- }
-
- public void scanFileSystem(AWorkspaceTreeNode node, File file) {
- scanFileSystem(node, file, null);
- }
-
- public void scanFileSystem(AWorkspaceTreeNode node, File file, FileFilter filter) {
-
- if (file != null && file.exists()) {
- if (file.isDirectory()) {
- if(node instanceof IFileSystemRepresentation) {
- iterateDirectory(node, file, filter, ((IFileSystemRepresentation) node).orderDescending());
- }
- else {
- iterateDirectory(node, file, filter, false);
- }
- }
- else {
- createFileNode(node, file);
- }
- }
- }
-
- /**
- * @param directoryName
- * @param parentDir
- * @throws IOException
- */
- public File createDirectory(String directoryName, File parentDir) throws IOException {
- File newDir = new File(parentDir, directoryName);
- int count = 0;
- while(newDir.exists() && count++ < 100) {
- newDir = new File(parentDir, directoryName + " ("+count+")");
- }
- if(!newDir.mkdirs()) {
- throw new IOException("could not create directory: "+newDir.getPath());
- }
- return newDir;
- }
-
- /**
- * @param directoryName
- * @param parentDir
- * @throws IOException
- */
- public File createFile(String fileName, File parentDir) throws IOException {
- String pureName = fileName;
- String fileExtension = "";
-
- int strPointer = fileName.lastIndexOf(".");
- if(strPointer > -1) {
- pureName = fileName.substring(0, strPointer);
- fileExtension = fileName.substring(strPointer+1);
- }
- File newFile = new File(parentDir, pureName+"."+fileExtension);
- int count = 0;
- while(newFile.exists() && count++ < 100) {
- newFile = new File(parentDir, pureName + " ("+count+")" +(fileExtension.trim().length() > 0 ? "."+fileExtension : ""));
- }
- if(!newFile.createNewFile()) {
- throw new IOException("could not create file: "+newFile.getPath());
- }
- return newFile;
- }
-
- public static void copyFile(File srcFile, File destDir) throws IOException {
- copyFile(srcFile, destDir, false);
- }
-
- public static void copyFile(File srcFile, File destDir, Boolean overwrite) throws IOException {
- if(srcFile == null || destDir == null) {
- throw new IllegalArgumentException("NULL");
- }
- if(!srcFile.exists() || !srcFile.isFile()) {
- throw new IllegalArgumentException("srcFile is not a file or does not exist");
- }
-
- copyFiles(Arrays.asList(new File[]{srcFile}), destDir, overwrite);
-// if(targetFile.exists()) {
-// if(silentOverwrite) {
-// if(!FileUtils.deleteQuietly(targetFile)) {
-// throw new IOException("can not copy file "+targetFile);
-// }
-// }
-// else {
-// throw new FileExistsException(targetFile);
-// }
-// }
-//
-// FileUtils.copyFile(file, targetFile);
- }
-
- public static void copyDirectory(File dir, File newParentDir) throws IOException {
- copyDirectory(dir, newParentDir, false);
- }
-
- public static void copyDirectory(File dir, File newParentDir, boolean overwrite) throws IOException {
- if(dir == null || newParentDir == null) {
- throw new IllegalArgumentException("NULL");
- }
-
- if(newParentDir.exists() && !newParentDir.isDirectory()) {
- throw new IOException("dest is no directory. a directory cannot be copied to a file.");
- }
-
- copyFiles(Arrays.asList(new File[]{dir}), newParentDir, overwrite);
- }
-
- public static void moveFile(File srcFile, File destDir) throws IOException {
- moveFile(srcFile, destDir, false);
- }
-
- public static void moveFile(File srcFile, File destDir, Boolean overwrite) throws IOException {
- if(srcFile == null || destDir == null) {
- throw new IllegalArgumentException("NULL");
- }
- if(!srcFile.exists() || !srcFile.isFile()) {
- throw new IllegalArgumentException("srcFile is not a file or does not exist");
- }
-
- moveFiles(Arrays.asList(new File[]{srcFile}), destDir, overwrite);
- }
-
- public static void moveDirectory(File dir, File newParentDir) throws IOException {
- copyDirectory(dir, newParentDir, false);
- }
-
- public static void moveDirectory(File dir, File newParentDir, boolean overwrite) throws IOException {
- if(dir == null || newParentDir == null) {
- throw new IllegalArgumentException("NULL");
- }
-
- if(newParentDir.exists() && !newParentDir.isDirectory()) {
- throw new IOException("dest is no directory. a directory cannot be copied to a file.");
- }
-
- moveFiles(Arrays.asList(new File[]{dir}), newParentDir, overwrite);
- }
-
- public static void copyFiles(List<File> files, File destDir, boolean overwrite) throws IOException {
- if(files == null || destDir == null) {
- throw new IllegalArgumentException("NULL");
- }
- if(destDir.exists() && !destDir.isDirectory()) {
- throw new IOException("destDir is no directory.");
- }
- List<ITask> opList = new ArrayList<ITask>();
-
- for (File file : files) {
- buildCopyOperationList(file, new File(destDir, file.getName()), opList);
- }
-
- Properties props = new Properties();
- props.setProperty("overwriteAll", String.valueOf(overwrite));
- props.setProperty("mergeAll", String.valueOf(overwrite));
-
- execOperations(opList, props);
- }
-
- public static void moveFiles(List<File> files, File destDir, boolean overwrite) throws IOException {
- if(files == null || destDir == null) {
- throw new IllegalArgumentException("NULL");
- }
- if(destDir.exists() && !destDir.isDirectory()) {
- throw new IOException("destDir is no directory.");
- }
- List<ITask> opList = new ArrayList<ITask>();
-
- for (File file : files) {
- buildMoveOperationList(file, new File(destDir, file.getName()), opList);
- }
-
- Properties props = new Properties();
- props.setProperty("overwriteAll", String.valueOf(overwrite));
- props.setProperty("mergeAll", String.valueOf(overwrite));
-
- execOperations(opList, props);
- }
-
- public static List<ITask> buildCopyOperationList(final File srcFile, final File destFile) {
- List<ITask> list = new ArrayList<ITask>();
- buildCopyOperationList(srcFile, destFile, list);
- return list;
- }
-
- public static List<ITask> buildMoveOperationList(final File srcFile, final File destFile) {
- List<ITask> list = new ArrayList<ITask>();
- buildMoveOperationList(srcFile, destFile, list);
- return list;
- }
-
- public static void buildCopyOperationList(final File srcFile, final File destFile, final List<ITask> ops) {
- if(srcFile.isDirectory()) {
- ops.add(new ITask() {
- public void exec(Properties properties) throws IOException {
- if(onSkipList(destFile.getParentFile(), properties)) {
- addSkippedDir(destFile, properties);
- throw new SkipTaskException();
- }
-
- if(destFile.exists()) {
- properties.setProperty("opType", "1");
- if(!Boolean.parseBoolean(properties.getProperty("mergeAll", "false"))) {
- try {
- getDirectoryConflictHandler().resolveConflict(destFile, properties);
- }
- catch (SkipTaskException e) {
- addSkippedDir(destFile, properties);
- throw e;
- }
- }
- FileUtils.touch(destFile);
- }
- else {
- destFile.mkdirs();
- }
- }
- });
- for(File file : srcFile.listFiles()) {
- buildCopyOperationList(file, new File(destFile, file.getName()), ops);
- }
- }
- else {
- ops.add(new ITask() {
- public void exec(Properties properties) throws IOException {
- if(onSkipList(destFile.getParentFile(), properties)) {
- throw new SkipTaskException();
- }
-
- if(destFile.exists()) {
- properties.setProperty("opType", "1");
- if(!Boolean.parseBoolean(properties.getProperty("overwriteAll", "false"))) {
- getFileConflictHandler().resolveConflict(destFile, properties);
- }
- }
- FileUtils.copyFile(srcFile, destFile);
- }
- });
- }
- }
-
- public static void buildMoveOperationList(final File srcFile, final File destFile, final List<ITask> ops) {
- if(srcFile.isDirectory()) {
- ops.add(new ITask() {
- public void exec(Properties properties) throws IOException {
- if(onSkipList(destFile.getParentFile(), properties)) {
- addSkippedDir(destFile, properties);
- throw new SkipTaskException();
- }
-
- if(destFile.exists()) {
- properties.setProperty("opType", "2");
- if(!Boolean.parseBoolean(properties.getProperty("mergeAll", "false"))) {
- try {
- getDirectoryConflictHandler().resolveConflict(destFile, properties);
- }
- catch (SkipTaskException e) {
- addSkippedDir(destFile, properties);
- throw e;
- }
- }
- FileUtils.touch(destFile);
- }
- else {
- destFile.mkdirs();
- }
- }
- });
- for(File file : srcFile.listFiles()) {
- buildMoveOperationList(file, new File(destFile, file.getName()), ops);
- }
- }
- else {
- ops.add(new ITask() {
- public void exec(Properties properties) throws IOException {
- if(onSkipList(destFile.getParentFile(), properties)) {
- throw new SkipTaskException();
- }
-
- if(destFile.exists()) {
- properties.setProperty("opType", "2");
- if(!Boolean.parseBoolean(properties.getProperty("overwriteAll", "false"))) {
- getFileConflictHandler().resolveConflict(destFile, properties);
- }
- if(!FileUtils.deleteQuietly(destFile)) {
- throw new SkipTaskException();
- }
- }
- FileUtils.moveFile(srcFile, destFile);
- }
- });
- }
- }
-
- private static void addSkippedDir(File dest, Properties properties) {
- if(properties == null || dest == null) {
- return;
- }
- String list = properties.getProperty("skippedDirs", "");
- String entry = dest.getPath()+";";
- if(!list.contains(entry)) {
- list += entry;
- properties.setProperty("skippedDirs", list);
- }
- }
-
- private static boolean onSkipList(File dest, Properties properties) {
- if(properties == null || dest == null) {
- return false;
- }
- String list = properties.getProperty("skippedDirs", "");
- String entry = dest.getPath()+";";
- if(list.contains(entry)) {
- return true;
- }
- return false;
- }
-
- public static IConflictHandler getDirectoryConflictHandler() {
- if(directoryConflictHandler == null) {
- directoryConflictHandler = new IConflictHandler() {
- public void resolveConflict(File file, Properties properties) throws IOException {
- LogUtils.info("Error in org.freeplane.plugin.workspace.io.FileSystemManager: directory already exists: " + file);
- throw new SkipTaskException();
- }
- };
- }
- return directoryConflictHandler;
- }
-
- public static IConflictHandler getFileConflictHandler() {
- if(fileConflictHandler == null) {
- fileConflictHandler = new IConflictHandler() {
- public void resolveConflict(File file, Properties properties) throws IOException {
- LogUtils.info("Error in org.freeplane.plugin.workspace.io.FileSystemManager: file already exists: " + file);
- throw new SkipTaskException();
- }
- };
- }
- return fileConflictHandler;
- }
-
- public static void setDirectoryConflictHandler(IConflictHandler handler) {
- directoryConflictHandler = handler;
- }
-
- public static void setFileConflictHandler(IConflictHandler handler) {
- fileConflictHandler = handler;
- }
-
- public static void execOperations(List<ITask> ops) throws IOException {
- execOperations(ops, null);
- }
-
- public static void execOperations(List<ITask> ops, Properties properties) throws IOException {
- if(ops == null) {
- return;
- }
- if(properties == null) {
- properties = new Properties();
- }
- Iterator<ITask> iter = ops.iterator();
- while (iter.hasNext()) {
- ITask op = iter.next();
- try {
- op.exec(properties);
- iter.remove();
- }
- catch (SkipTaskException e) {
- iter.remove();
- continue;
- }
- }
- }
-
- private ListHashTable<String, IFileTypeHandler> getFileTypeHandlers() {
- return typeManager.getFileTypeHandlers();
- }
-
- private void iterateDirectory(AWorkspaceTreeNode parent, File directory, FileFilter filter, final boolean orderDescending) {
- boolean orderDesc = orderDescending;
-// if(parent instanceof IFileSystemRepresentation) {
-// orderDesc = ((IFileSystemRepresentation) parent).orderDescending();
-// }
-
- for (File file : sortFiles(directory.listFiles(new DirectoryFilter(filter)), orderDesc, true)) {
- AWorkspaceTreeNode newParent = createFileNode(parent, FileReadManager.DIRECTORY_HANDLE, file);
- iterateDirectory(newParent, file, filter, orderDesc);
-
- }
- for (File file : sortFiles(directory.listFiles(new FilesOnlyFilter(filter)), orderDesc, true)) {
- createFileNode(parent, file);
- }
- }
-
- /**
- * @param files
- * @param orderAscending
- * @param ignoreCase
- * @return
- */
- private File[] sortFiles(File[] files, final boolean orderDescending, final boolean ignoreCase) {
- Comparator<File> comparator = new Comparator<File>() {
- public int compare(File o1, File o2) {
- File f1 = o1;
- File f2 = o2;
- if(ignoreCase) {
- f1 = new File(f1.getParentFile(), f1.getName().toLowerCase());
- f2 = new File(f2.getParentFile(), f2.getName().toLowerCase());
- }
- int compareResult = f1.compareTo(f2);
- if(orderDescending) {
- return compareResult*-1;
- }
- return compareResult;
- }
- };
- Arrays.sort(files, comparator);
- return files;
- }
-
- private AWorkspaceTreeNode createFileNode(final AWorkspaceTreeNode parent, final File file) {
- String fileExtension = FileReadManager.DEFAULT_HANDLE;
- int dot = file.getPath().lastIndexOf('.');
- if (-1 != dot) {
- fileExtension = file.getPath().substring(dot);
- }
- return createFileNode(parent, fileExtension, file);
- }
-
- private AWorkspaceTreeNode createFileNode(final AWorkspaceTreeNode parent, String fileExtension, final File file) {
- List<IFileTypeHandler> handlers = getFileTypeHandlers().list(fileExtension);
- if (handlers == null) {
- fileExtension = FileReadManager.DEFAULT_HANDLE;
- handlers = getFileTypeHandlers().list(fileExtension);
- }
- if (handlers != null && handlers.size() == 1) { //WORKSPACE - ToDo: what if there is more than one handler for a single type?
- IFileTypeHandler nodeCreator = handlers.get(0);
- AWorkspaceTreeNode newParent = nodeCreator.createFileNode(parent, fileExtension, file);
- return newParent;
- }
- return parent;
- }
-
-
- /***********************************************************************************
- * INTERNAL CLASS DEFINITIONS
- **********************************************************************************/
-
- private class DirectoryFilter implements FileFilter {
- private boolean filtering = true;
- private FileFilter extraFilter;
-
- public DirectoryFilter(FileFilter filter) {
- this.extraFilter = filter;
- }
-
- public boolean accept(File pathname) {
- if(filtering && pathname.getName().startsWith(".") && !pathname.getName().equals("."+ResourceController.getResourceController().getProperty("workspace.profile"))) {
- return false;
- }
- if (pathname.isDirectory()) {
- if(this.extraFilter == null) {
- return true;
- }
- return this.extraFilter.accept(pathname);
- }
- return false;
- }
- }
-
- private class FilesOnlyFilter implements FileFilter {
- private boolean filtering = true;
- private FileFilter extraFilter;
-
- public FilesOnlyFilter(FileFilter filter) {
- this.extraFilter = filter;
- }
-
- public boolean accept(File pathname) {
- if(filtering && pathname.getName().startsWith(".")) {
- return false;
- }
- if (pathname.isFile()) {
- if(this.extraFilter == null) {
- return true;
- }
- return this.extraFilter.accept(pathname);
- }
- return false;
- }
- }
-
- private FileReadManager getDefaultFileTypeManager() {
- if (this.fileTypeManager == null) {
- this.fileTypeManager = new FileReadManager();
- Properties props = new Properties();
- try {
- props.load(this.getClass().getResourceAsStream("/conf/filenodetypes.properties"));
-
- Class<?>[] args = {};
- for (Object key : props.keySet()) {
- try {
- Class<?> clazz = DefaultFileNodeCreator.class;
-
- clazz = this.getClass().getClassLoader().loadClass(key.toString());
-
- AFileNodeCreator handler = (AFileNodeCreator) clazz.getConstructor(args).newInstance();
- handler.setFileTypeList(props.getProperty(key.toString(), ""), "\\|");
- this.fileTypeManager.addFileHandler(handler);
- }
- catch (ClassNotFoundException e) {
- LogUtils.warn("Class not found [" + key + "]", e);
- }
- catch (ClassCastException e) {
- LogUtils.warn("Class [" + key + "] is not of type: PhysicalNode", e);
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
- return this.fileTypeManager;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IConflictHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IConflictHandler.java
deleted file mode 100644
index 7ec25ac..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IConflictHandler.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.freeplane.plugin.workspace.io;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Properties;
-
-public interface IConflictHandler {
-
- void resolveConflict(File file, Properties properties) throws CancelExecutionException, SkipTaskException, IOException;
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IFileSystemRepresentation.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IFileSystemRepresentation.java
deleted file mode 100644
index eaf5af1..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IFileSystemRepresentation.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.freeplane.plugin.workspace.io;
-
-import java.io.File;
-
-import org.freeplane.plugin.workspace.io.annotation.ExportAsAttribute;
-
-public interface IFileSystemRepresentation {
- public File getFile();
-
- public void orderDescending(boolean enable);
-
- @ExportAsAttribute(name="orderDescending")
- public boolean orderDescending();
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IFileTypeHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IFileTypeHandler.java
deleted file mode 100644
index 4d486eb..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IFileTypeHandler.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.freeplane.plugin.workspace.io;
-
-import java.io.File;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-
-public interface IFileTypeHandler {
- AWorkspaceTreeNode createFileNode(AWorkspaceTreeNode parent, String fileExtension, File file);
- public Object[] getSupportedFileTypes();
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IProjectSettingsIOHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IProjectSettingsIOHandler.java
deleted file mode 100644
index f09d7fd..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/IProjectSettingsIOHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package org.freeplane.plugin.workspace.io;
-
-import java.io.IOException;
-
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public interface IProjectSettingsIOHandler {
- public enum LOAD_RETURN_TYPE {
- /**
- * a new project was created and loaded
- */
- NEW_PROJECT,
- /**
- * an existing project was loaded
- */
- EXISTING_PROJECT,
- /**
- * compatible mode return_type: if an old project version was converted into a newer version
- */
- CONVERTED_PROJECT
- }
-
- /**
- * This method will load an existing project or try to create a new project with the given settings.
- *
- * @param project container with settings necessary to load or create a project
- * @return {@link LOAD_RETURN_TYPE} if the an existing project was loaded, or if a new project was created
- * @throws IOException
- */
- public LOAD_RETURN_TYPE loadProject(AWorkspaceProject project) throws IOException;
-
- /**
- * This method will try to save the given project settings.
- *
- * @param project
- * @throws IOException
- */
- public void storeProject(AWorkspaceProject project) throws IOException;
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/ITask.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/ITask.java
deleted file mode 100644
index a8e7fa4..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/ITask.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.freeplane.plugin.workspace.io;
-
-import java.io.IOException;
-import java.util.Properties;
-
-public interface ITask {
-
- public void exec(Properties properties) throws SkipTaskException, CancelExecutionException, IOException;
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/SkipTaskException.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/SkipTaskException.java
deleted file mode 100644
index 9096e6e..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/SkipTaskException.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.freeplane.plugin.workspace.io;
-
-import java.io.IOException;
-
-public class SkipTaskException extends IOException {
- private static final long serialVersionUID = 1L;
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/StringOutputStream.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/StringOutputStream.java
deleted file mode 100644
index c41da4a..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/StringOutputStream.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 25.10.2011
- */
-package org.freeplane.plugin.workspace.io;
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-/**
- *
- */
-public class StringOutputStream extends OutputStream {
- private final StringBuffer buffer = new StringBuffer();
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public synchronized String getString() {
- return this.buffer.toString();
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- public void write(int b) throws IOException {
- buffer.append(((char) b));
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/annotation/ExportAsAttribute.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/annotation/ExportAsAttribute.java
deleted file mode 100644
index 1a45312..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/annotation/ExportAsAttribute.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 26.07.2011
- */
-package org.freeplane.plugin.workspace.io.annotation;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- *
- */
- at Inherited
- at Retention(RetentionPolicy.RUNTIME)
- at Target(value=ElementType.METHOD)
-public @interface ExportAsAttribute {
- String name();
- boolean defaultBool() default false;
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/xml/ProjectNodeWriter.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/xml/ProjectNodeWriter.java
deleted file mode 100644
index a9b8475..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/xml/ProjectNodeWriter.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 25.07.2011
- */
-package org.freeplane.plugin.workspace.io.xml;
-
-import java.io.IOException;
-import java.lang.reflect.Method;
-
-import org.freeplane.core.io.IAttributeWriter;
-import org.freeplane.core.io.IElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.io.annotation.ExportAsAttribute;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-/**
- *
- */
-public class ProjectNodeWriter implements IElementWriter, IAttributeWriter {
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public ProjectNodeWriter() {
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- /*
- * (non-Javadoc)
- *
- * @see
- * org.freeplane.core.io.IAttributeWriter#writeAttributes(org.freeplane.
- * core.io.ITreeWriter, java.lang.Object, java.lang.String)
- */
- public void writeAttributes(ITreeWriter writer, Object userObject, String tag) {
- AWorkspaceTreeNode wsNode = (AWorkspaceTreeNode) userObject;
- if(wsNode.getType() != null) writer.addAttribute("type", wsNode.getType());
- if(wsNode.getName() != null) writer.addAttribute("name", wsNode.getName());
-
- for(Method m : wsNode.getClass().getMethods()) {
- if(m.getAnnotation(ExportAsAttribute.class) != null && m.getParameterTypes().length == 0 && m.getReturnType() != void.class) {
- writeAdditionalAttribute(writer, wsNode, m);
- }
- }
- }
-
- /**
- * @param userObject
- * @param m
- * @param value
- */
- private void writeAdditionalAttribute(ITreeWriter writer, Object object, Method m) {
- Object[] args = null;
- Object value;
- try {
- value = m.invoke(object, args);
- if(value != null) {
- ExportAsAttribute annotation = m.getAnnotation(ExportAsAttribute.class);
- if(value instanceof Boolean && ((Boolean) value).booleanValue() == annotation.defaultBool()) {
- return;
- }
- String attrName = annotation.name();
- if(attrName.trim().length()==0) throw new IllegalArgumentException("value for annotation 'ExportAsAttribute' must not be empty!");
- writer.addAttribute(attrName.trim(), value.toString());
- }
- }
- catch (IllegalArgumentException e) {
- throw e;
- }
- catch (Exception e) {
- LogUtils.severe("This should not have happend: ", e);
- }
- }
-
- public void writeContent(ITreeWriter writer, Object element, String tag) throws IOException {
- final AWorkspaceTreeNode node = (AWorkspaceTreeNode) element;
- for (int i=0; i < node.getChildCount(); i++) {
- AWorkspaceTreeNode child = node.getChildAt(i);
- if(child == null || child.getTagName() == null) {
- continue;
- }
- writer.addElement(child, child.getTagName());
- }
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/xml/ProjectSettingsWriter.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/xml/ProjectSettingsWriter.java
deleted file mode 100644
index cef4bc3..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/io/xml/ProjectSettingsWriter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 25.07.2011
- */
-package org.freeplane.plugin.workspace.io.xml;
-
-import java.io.IOException;
-import java.io.Writer;
-
-import org.freeplane.core.io.IAttributeWriter;
-import org.freeplane.core.io.IElementWriter;
-import org.freeplane.core.io.ITreeWriter;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.io.xml.TreeXmlWriter;
-import org.freeplane.features.map.MapWriter;
-import org.freeplane.features.map.MapWriter.Hint;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-
-public class ProjectSettingsWriter implements IElementWriter, IAttributeWriter {
-
- final private WriteManager writeManager;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public ProjectSettingsWriter(final WriteManager manager) {
- writeManager = manager;
-
- }
-
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public void storeProject(final Writer writer, AWorkspaceProject project) throws IOException {
- final TreeXmlWriter xmlWriter = new TreeXmlWriter(writeManager, writer);
- xmlWriter.setHint(Hint.MODE, MapWriter.Mode.FILE);
- writeNode(xmlWriter, project.getModel().getRoot());
- xmlWriter.flush();
- writer.close();
- }
-
- private void writeNode(final ITreeWriter xmlWriter, final AWorkspaceTreeNode node) throws IOException {
- final String nodeTag = node.getTagName();
- if(nodeTag == null) return;
-
- xmlWriter.addElement(node, nodeTag);
- }
-
- public void writeNodeAsXml(final Writer writer, final AWorkspaceTreeNode node) throws IOException {
- final TreeXmlWriter xmlWriter = new TreeXmlWriter(writeManager, writer);
- writeNode(xmlWriter, node);
- xmlWriter.flush();
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void writeAttributes(ITreeWriter writer, Object userObject, String tag) {
- }
-
- public void writeContent(ITreeWriter writer, Object element, String tag) throws IOException {
- writeNode(writer, (AWorkspaceTreeNode) element);
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/listener/DefaultTreeExpansionListener.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/listener/DefaultTreeExpansionListener.java
deleted file mode 100644
index 518908d..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/listener/DefaultTreeExpansionListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.freeplane.plugin.workspace.listener;
-
-import javax.swing.event.TreeExpansionEvent;
-import javax.swing.event.TreeExpansionListener;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-
-//Make sure expansion is threaded and updating the tree model
-//only occurs within the event dispatching thread.
-public class DefaultTreeExpansionListener implements TreeExpansionListener {
-
- public void treeExpanded(TreeExpansionEvent event) {
- final AWorkspaceTreeNode node = (AWorkspaceTreeNode)event.getPath().getLastPathComponent();
- if(node instanceof TreeExpansionListener) {
- ((TreeExpansionListener)node).treeExpanded(event);
- }
- }
-
- public void treeCollapsed(TreeExpansionEvent event) {
- final AWorkspaceTreeNode node = (AWorkspaceTreeNode)event.getPath().getLastPathComponent();
- if(node instanceof TreeExpansionListener) {
- ((TreeExpansionListener)node).treeCollapsed(event);
- }
- }
-}
\ No newline at end of file
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/listener/DefaultWorkspaceSelectionListener.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/listener/DefaultWorkspaceSelectionListener.java
deleted file mode 100644
index 2f4c033..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/listener/DefaultWorkspaceSelectionListener.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.freeplane.plugin.workspace.listener;
-
-import javax.swing.event.TreeSelectionEvent;
-import javax.swing.event.TreeSelectionListener;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public class DefaultWorkspaceSelectionListener implements TreeSelectionListener {
- public void valueChanged(TreeSelectionEvent event) {
- AWorkspaceTreeNode node = (AWorkspaceTreeNode)(event.getPath().getLastPathComponent());
- if(node instanceof TreeSelectionListener) {
- ((TreeSelectionListener)node).valueChanged(event);
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/ContextMenuController.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/ContextMenuController.java
deleted file mode 100644
index ec91095..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/ContextMenuController.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.freeplane.plugin.workspace.mindmapmode;
-
-public class ContextMenuController {
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/DefaultFileDropHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/DefaultFileDropHandler.java
deleted file mode 100644
index 66f9d92..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/DefaultFileDropHandler.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.freeplane.plugin.workspace.mindmapmode;
-
-import java.awt.datatransfer.Transferable;
-
-import org.freeplane.plugin.workspace.dnd.INodeDropHandler;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public class DefaultFileDropHandler implements INodeDropHandler {
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public boolean processDrop(AWorkspaceTreeNode targetNode, Transferable transferable, int dropAction) {
- return false;
- }
-
- public boolean acceptDrop(Transferable transferable) {
- return false;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/FileFolderDropHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/FileFolderDropHandler.java
deleted file mode 100644
index 53e99c0..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/FileFolderDropHandler.java
+++ /dev/null
@@ -1,199 +0,0 @@
-package org.freeplane.plugin.workspace.mindmapmode;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.DnDConstants;
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.commons.io.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.IWorkspaceView;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.io.FileSystemManager;
-import org.freeplane.plugin.workspace.io.ITask;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.io.SkipTaskException;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-import org.freeplane.plugin.workspace.nodes.FolderLinkNode;
-import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
-
-public class FileFolderDropHandler extends DefaultFileDropHandler {
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- private void processWorkspaceNodeDrop(AWorkspaceTreeNode targetNode, List<AWorkspaceTreeNode> nodes, int dropAction) {
- try {
- File targetDir = ((IFileSystemRepresentation) targetNode).getFile();
- if (targetDir != null && targetDir.isDirectory()) {
- List<ITask> opList = new ArrayList<ITask>();
- for (AWorkspaceTreeNode node : nodes) {
- if (node instanceof DefaultFileNode) {
- File srcFile = ((DefaultFileNode) node).getFile();
- if (srcFile.equals(targetDir)) {
- continue;
- }
- File destFile = new File(targetDir, srcFile.getName());
- if (dropAction == DnDConstants.ACTION_COPY) {
- FileSystemManager.buildCopyOperationList(srcFile, destFile, opList);
- } else if (dropAction == DnDConstants.ACTION_MOVE) {
- FileSystemManager.buildMoveOperationList(srcFile, destFile, opList);
- opList.add(getPostOperation(targetNode, node, srcFile, destFile));
- }
- }
- else if (node instanceof LinkTypeFileNode) {
- File srcFile = URIUtils.getAbsoluteFile(((LinkTypeFileNode) node).getLinkURI());
- if (srcFile.equals(targetDir)) {
- continue;
- }
- File destFile = new File(targetDir, srcFile.getName());
-
- FileSystemManager.buildCopyOperationList(srcFile, destFile, opList);
- if (dropAction == DnDConstants.ACTION_MOVE) {
- opList.add(getPostOperation(targetNode, node, srcFile, destFile));
- }
- }
- else if (node instanceof FolderLinkNode) {
- File srcFile = URIUtils.getAbsoluteFile(((FolderLinkNode) node).getPath());
- if (srcFile.equals(targetDir)) {
- continue;
- }
- File destFile = new File(targetDir, srcFile.getName());
-
- FileSystemManager.buildCopyOperationList(srcFile, destFile, opList);
- if (dropAction == DnDConstants.ACTION_MOVE) {
- opList.add(getPostOperation(targetNode, node, srcFile, destFile));
- }
- }
- }
- FileSystemManager.execOperations(opList);
- }
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- }
-
- private ITask getPostOperation(final AWorkspaceTreeNode targetNode, final AWorkspaceTreeNode node, final File srcFile, final File destFile) {
- return new ITask() {
- public void exec(Properties properties) throws IOException {
- if(onSkipList(destFile.getParentFile(), properties)) {
- throw new SkipTaskException();
- }
- AWorkspaceTreeNode parent = node.getParent();
- targetNode.getModel().cutNodeFromParent(node);
- parent.refresh();
- targetNode.getModel().nodeMoved(node, srcFile, destFile);
- }
-
- private boolean onSkipList(File dest, Properties properties) {
- if(properties == null || dest == null) {
- return false;
- }
- String list = properties.getProperty("skippedDirs", "");
- String entry = dest.getPath()+";";
- if(list.contains(entry)) {
- return true;
- }
- return false;
- }
- };
-
- }
-
- private void processFileListDrop(AWorkspaceTreeNode targetNode, List<File> files, int dropAction) {
- try {
- File targetDir = ((IFileSystemRepresentation) targetNode).getFile();
- FileSystemManager.copyFiles(files, targetDir, false);
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- targetNode.refresh();
- }
-
- private void processUriListDrop(AWorkspaceTreeNode targetNode, List<URI> uris, int dropAction) {
- try {
- File targetDir = ((IFileSystemRepresentation) targetNode).getFile();
- for (URI uri : uris) {
- File srcFile = new File(uri);
- if (srcFile == null || !srcFile.exists()) {
- continue;
- }
- if (srcFile.isDirectory()) {
- FileUtils.copyDirectoryToDirectory(srcFile, targetDir);
- } else {
- FileUtils.copyFileToDirectory(srcFile, targetDir, true);
- }
- }
- } catch (Exception e) {
- LogUtils.warn(e);
- }
- targetNode.refresh();
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- @SuppressWarnings("unchecked")
- public boolean processDrop(AWorkspaceTreeNode targetNode, Transferable transferable, int dropAction) {
- try {
- if (transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR)) {
- processWorkspaceNodeDrop(targetNode, (List<AWorkspaceTreeNode>) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR),
- dropAction);
- } else if (transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR)) {
- processFileListDrop(targetNode, (List<File>) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR), dropAction);
- } else if (transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR)) {
- ArrayList<URI> uriList = new ArrayList<URI>();
- String uriString = (String) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR);
- if (!uriString.startsWith("file://")) {
- return false;
- }
- String[] uriArray = uriString.split("\r\n");
- for (String singleUri : uriArray) {
- try {
- uriList.add(URIUtils.createURI(singleUri));
- } catch (Exception e) {
- LogUtils.info("org.freeplane.plugin.workspace.mindmapmode.FolderFileDropHandler.processDrop(targetNode, transferable, dropAction)@1"
- + e.getMessage());
- }
- }
- processUriListDrop(targetNode, uriList, dropAction);
- }
-
- targetNode.refresh();
-
- IWorkspaceView view = WorkspaceController.getCurrentModeExtension().getView();
- if(view != null) {
- view.expandPath(targetNode.getTreePath());
- WorkspaceController.getCurrentModeExtension().getView().refreshView();
- }
- } catch (Exception e) {
- LogUtils.warn("org.freeplane.plugin.workspace.mindmapmode.FolderFileDropHandler.processDrop(targetNode, transferable, dropAction)@2", e);
- }
-
- return true;
- }
-
- public boolean acceptDrop(Transferable transferable) {
- for (DataFlavor flavor : transferable.getTransferDataFlavors()) {
- if (WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR.equals(flavor) || WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR.equals(flavor)
- || WorkspaceTransferable.WORKSPACE_NODE_FLAVOR.equals(flavor)) {
- return true;
- }
- }
- return false;
- }
-}
\ No newline at end of file
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/InputController.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/InputController.java
deleted file mode 100644
index 3743021..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/InputController.java
+++ /dev/null
@@ -1,279 +0,0 @@
-package org.freeplane.plugin.workspace.mindmapmode;
-
-import java.awt.Toolkit;
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
-import java.awt.event.MouseMotionListener;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.JTree;
-import javax.swing.KeyStroke;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.actions.NodeCopyAction;
-import org.freeplane.plugin.workspace.actions.NodeCutAction;
-import org.freeplane.plugin.workspace.actions.NodePasteAction;
-import org.freeplane.plugin.workspace.actions.NodeRefreshAction;
-import org.freeplane.plugin.workspace.actions.NodeRemoveAction;
-import org.freeplane.plugin.workspace.actions.NodeRenameAction;
-import org.freeplane.plugin.workspace.components.TreeView;
-import org.freeplane.plugin.workspace.components.WorkspaceNodeRenderer;
-import org.freeplane.plugin.workspace.dnd.DnDController;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public class InputController implements KeyListener, MouseListener, MouseMotionListener {
- // WORKSPACE - ToDo: implement gui for hot-key handling
- private Map<HotKeyIdentifier, String> actionKeyMap = new LinkedHashMap<InputController.HotKeyIdentifier, String>();
-
-
- private TreePath lastSelection = null;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public InputController() {
- initActionKeyMap();
- }
-
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public final TreePath getLastSelectionPath() {
- return lastSelection;
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- public void mouseClicked(MouseEvent e) {
- if (e.isConsumed()) {
- return;
- }
- TreePath path = ((JTree) e.getSource()).getClosestPathForLocation(e.getX(), e.getY());
-
- ((TreeView) WorkspaceController.getCurrentModeExtension().getView()).addSelectionPath(path);
- if (path != null) {
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
- // encode buttons
- int eventType = 0;
- if (e.getButton() == MouseEvent.BUTTON1) {
- eventType += WorkspaceActionEvent.MOUSE_LEFT;
- }
- if (e.getButton() == MouseEvent.BUTTON3) {
- eventType += WorkspaceActionEvent.MOUSE_RIGHT;
- }
- if (e.getClickCount() % 2 == 0) {
- eventType += WorkspaceActionEvent.MOUSE_DBLCLICK;
- } else {
- eventType += WorkspaceActionEvent.MOUSE_CLICK;
- }
-
- if (e.isPopupTrigger()) {
- eventType += WorkspaceActionEvent.POPUP_TRIGGER;
- }
-
- WorkspaceActionEvent event = new WorkspaceActionEvent(node, eventType, e.getX(), e.getY(), e.getComponent());
-
- List<IWorkspaceNodeActionListener> nodeEventListeners = WorkspaceController.getCurrentModeExtension().getIOController()
- .getNodeActionListeners(node.getClass(), eventType);
- if (nodeEventListeners != null) {
- for (IWorkspaceNodeActionListener listener : nodeEventListeners) {
- if (event.isConsumed()) {
- break;
- }
- listener.handleAction(event);
- }
- }
-
- if (!event.isConsumed() && node instanceof IWorkspaceNodeActionListener) {
- ((IWorkspaceNodeActionListener) node).handleAction(event);
- }
-
- } else {
- if (e.getButton() == MouseEvent.BUTTON3) {
- // WorkspaceController.getController().getPopups().showWorkspacePopup(e.getComponent(), e.getX(), e.getY());
- ((AWorkspaceTreeNode) WorkspaceController.getCurrentModel().getRoot()).showPopup(e.getComponent(), e.getX(), e.getY());
- }
- }
- }
-
- public void mousePressed(MouseEvent e) {
- }
-
- public void mouseReleased(MouseEvent e) {
- }
-
- public void mouseEntered(MouseEvent e) {
- }
-
- public void mouseExited(MouseEvent e) {
- }
-
- public void mouseDragged(MouseEvent e) {
- }
-
- public void mouseMoved(MouseEvent e) {
- JTree tree = ((JTree) e.getSource());
- TreePath path = tree.getPathForLocation(e.getX(), e.getY());
- if (path == getLastSelectionPath()) {
- return;
- }
- WorkspaceNodeRenderer renderer = (WorkspaceNodeRenderer) tree.getCellRenderer();
- if (path != null && path != getLastSelectionPath()) {
- lastSelection = path;
- renderer.highlightRow(tree.getRowForLocation(e.getX(), e.getY()));
- tree.repaint();
- } else if (getLastSelectionPath() != null) {
- lastSelection = null;
- renderer.highlightRow(-1);
- tree.repaint();
- }
- }
-
- /*********
- * Keyboard events
- */
-
- private void initActionKeyMap() {
- actionKeyMap.put(new HotKeyIdentifier("copy", KeyStroke.getKeyStroke(KeyEvent.VK_C, /*KeyEvent.CTRL_DOWN_MASK*/Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())), NodeCopyAction.KEY);
- actionKeyMap.put(new HotKeyIdentifier("cut", KeyStroke.getKeyStroke(KeyEvent.VK_X, /*KeyEvent.CTRL_DOWN_MASK*/Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())),NodeCutAction.KEY);
- actionKeyMap.put(new HotKeyIdentifier("paste", KeyStroke.getKeyStroke(KeyEvent.VK_V, /*KeyEvent.CTRL_DOWN_MASK*/Toolkit.getDefaultToolkit().getMenuShortcutKeyMask()),new KeyEventAcceptor() {
-
- public boolean accept(KeyEvent e) {
- TreePath path = ((JTree) e.getSource()).getSelectionPath();
- if (path == null) {
- return false;
- }
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
- if(DnDController.isDropAllowed(node)) {
- return true;
- }
- return false;
- }
- }), NodePasteAction.KEY);
- actionKeyMap.put(new HotKeyIdentifier("delete", KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), new KeyEventAcceptor() {
-
- public boolean accept(KeyEvent e) {
- TreePath path = ((JTree) e.getSource()).getSelectionPath();
- if (path == null) {
- return false;
- }
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
- if(!node.isSystem() && node.isTransferable()) {
- return true;
- }
- return false;
- }
- }), NodeRemoveAction.KEY);
- actionKeyMap.put(new HotKeyIdentifier("rename", KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), new KeyEventAcceptor() {
- public boolean accept(KeyEvent event) {
- TreePath path = ((JTree) event.getSource()).getSelectionPath();
- if (path == null) {
- return false;
- }
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
- if(!node.isSystem()) {
- return true;
- }
- return false;
- }
- }), NodeRenameAction.KEY);
- actionKeyMap.put(new HotKeyIdentifier("refresh", KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0)), NodeRefreshAction.KEY);
-
- }
-
- public void keyTyped(KeyEvent e) {
- }
-
- public void keyPressed(KeyEvent e) {
- KeyStroke currentStroke = KeyStroke.getKeyStrokeForEvent(e);
-
- if (e.getKeyCode() == KeyEvent.VK_ENTER) {
- TreePath path = ((JTree) e.getSource()).getSelectionPath();
- if (path == null) {
- return;
- }
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
-
- if (node instanceof IWorkspaceNodeActionListener) {
- ((IWorkspaceNodeActionListener) node).handleAction(new WorkspaceActionEvent(node, WorkspaceActionEvent.WSNODE_OPEN_DOCUMENT, 0, 0, e
- .getComponent()));
- e.consume();
- }
- }
- else {
- for(HotKeyIdentifier id : actionKeyMap.keySet()) {
- if(currentStroke.equals(id.getKeyStroke())) {
- if(id.accept(e)) {
- AFreeplaneAction action = WorkspaceController.getAction(actionKeyMap.get(id));
- if(action != null) {
- action.actionPerformed(new ActionEvent(e.getSource(), 0, null));
- }
- else {
- LogUtils.info("No action set for: "+ id.getKeyStroke());
- }
- }
- e.consume();
- break;
- }
- }
- }
- }
-
- public void keyReleased(KeyEvent e) {
- }
-
-
- class HotKeyIdentifier {
- private final KeyStroke stroke;
- private final String identifier;
- private final KeyEventAcceptor acceptor;
-
- public HotKeyIdentifier(String id, KeyStroke stroke) {
- this(id, stroke, null);
- }
- public HotKeyIdentifier(String id, KeyStroke stroke, KeyEventAcceptor acceptor) {
- this.identifier = id;
- this.stroke = stroke;
- this.acceptor = acceptor;
- }
-
- public boolean accept(KeyEvent e) {
- if(this.acceptor == null) {
- return true;
- }
- return this.acceptor.accept(e);
- }
-
- public KeyStroke getKeyStroke() {
- return this.stroke;
- }
-
- public String getIdentifier() {
- return this.identifier;
- }
-
- //WORKSPACE - ToDo: localization
-// public String getLocalizedIdentifier() {
-// return TextUtils.getText("workspace.key.action."+getIdentifier().toLowerCase(Locale.ENGLISH));
-// }
-
- }
-
- interface KeyEventAcceptor {
- public boolean accept(KeyEvent event);
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/MModeWorkspaceController.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/MModeWorkspaceController.java
deleted file mode 100644
index d29f76a..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/MModeWorkspaceController.java
+++ /dev/null
@@ -1,505 +0,0 @@
-package org.freeplane.plugin.workspace.mindmapmode;
-
-import java.awt.Container;
-import java.awt.Dimension;
-import java.awt.dnd.DropTarget;
-import java.awt.dnd.DropTargetDropEvent;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Properties;
-
-import javax.swing.Box;
-import javax.swing.JComponent;
-import javax.swing.JMenu;
-import javax.swing.event.PopupMenuEvent;
-import javax.swing.event.PopupMenuListener;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.ui.IMenuContributor;
-import org.freeplane.core.ui.MenuBuilder;
-import org.freeplane.core.ui.components.JResizer.Direction;
-import org.freeplane.core.ui.components.OneTouchCollapseResizer;
-import org.freeplane.core.ui.components.OneTouchCollapseResizer.CollapseDirection;
-import org.freeplane.core.ui.components.OneTouchCollapseResizer.ComponentCollapseListener;
-import org.freeplane.core.ui.components.ResizeEvent;
-import org.freeplane.core.ui.components.ResizerListener;
-import org.freeplane.core.user.IUserAccount;
-import org.freeplane.core.user.LocalUser;
-import org.freeplane.core.user.UserAccountController;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.FileUtils;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.features.ui.INodeViewLifeCycleListener;
-import org.freeplane.features.ui.ViewController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.actions.FileNodeDeleteAction;
-import org.freeplane.plugin.workspace.actions.FileNodeNewFileAction;
-import org.freeplane.plugin.workspace.actions.FileNodeNewMindmapAction;
-import org.freeplane.plugin.workspace.actions.NodeCopyAction;
-import org.freeplane.plugin.workspace.actions.NodeCutAction;
-import org.freeplane.plugin.workspace.actions.NodeNewFolderAction;
-import org.freeplane.plugin.workspace.actions.NodeNewLinkAction;
-import org.freeplane.plugin.workspace.actions.NodeOpenLocationAction;
-import org.freeplane.plugin.workspace.actions.NodePasteAction;
-import org.freeplane.plugin.workspace.actions.NodeRefreshAction;
-import org.freeplane.plugin.workspace.actions.NodeRemoveAction;
-import org.freeplane.plugin.workspace.actions.NodeRenameAction;
-import org.freeplane.plugin.workspace.actions.PhysicalFolderSortOrderAction;
-import org.freeplane.plugin.workspace.actions.WorkspaceCollapseAction;
-import org.freeplane.plugin.workspace.actions.WorkspaceExpandAction;
-import org.freeplane.plugin.workspace.actions.WorkspaceImportProjectAction;
-import org.freeplane.plugin.workspace.actions.WorkspaceNewMapAction;
-import org.freeplane.plugin.workspace.actions.WorkspaceNewProjectAction;
-import org.freeplane.plugin.workspace.actions.WorkspaceProjectOpenLocationAction;
-import org.freeplane.plugin.workspace.actions.WorkspaceRemoveProjectAction;
-import org.freeplane.plugin.workspace.components.IWorkspaceView;
-import org.freeplane.plugin.workspace.components.TreeView;
-import org.freeplane.plugin.workspace.creator.DefaultFileNodeCreator;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.features.AWorkspaceModeExtension;
-import org.freeplane.plugin.workspace.handler.DefaultFileNodeIconHandler;
-import org.freeplane.plugin.workspace.handler.DirectoryMergeConflictDialog;
-import org.freeplane.plugin.workspace.handler.FileExistsConflictDialog;
-import org.freeplane.plugin.workspace.handler.LinkTypeFileIconHandler;
-import org.freeplane.plugin.workspace.io.AFileNodeCreator;
-import org.freeplane.plugin.workspace.io.FileReadManager;
-import org.freeplane.plugin.workspace.io.FileSystemManager;
-import org.freeplane.plugin.workspace.model.WorkspaceModel;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-import org.freeplane.plugin.workspace.model.project.IProjectSelectionListener;
-import org.freeplane.plugin.workspace.model.project.ProjectSelectionEvent;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
-import org.freeplane.view.swing.map.NodeView;
-import org.freeplane.view.swing.ui.mindmapmode.MNodeDropListener;
-
-public class MModeWorkspaceController extends AWorkspaceModeExtension {
-
- private static final String USER_SETTINGS_FILENAME = "user.settings";
-
- abstract class ResizerEventAdapter implements ResizerListener, ComponentCollapseListener {
- }
-
- protected static final String WORKSPACE_VIEW_WIDTH = MModeWorkspaceController.class.getPackage().getName().toLowerCase(Locale.ENGLISH)+".view.width";
- protected static final String WORKSPACE_VIEW_ENABLED = MModeWorkspaceController.class.getPackage().getName().toLowerCase(Locale.ENGLISH)+".view.enabled";
- protected static final String WORKSPACE_VIEW_COLLAPSED = MModeWorkspaceController.class.getPackage().getName().toLowerCase(Locale.ENGLISH)+".view.collapsed";
- protected static final String WORKSPACE_MODEL_PROJECTS = MModeWorkspaceController.class.getPackage().getName().toLowerCase(Locale.ENGLISH)+".model.projects";
- protected static final String WORKSPACE_MODEL_PROJECTS_SEPARATOR = ",";
-
-
- private FileReadManager fileTypeManager;
- private TreeView view;
- private Properties settings;
- private WorkspaceModel wsModel;
- private AWorkspaceProject currentSelectedProject = null;
- private IProjectSelectionListener projectSelectionListener;
-
- public MModeWorkspaceController(ModeController modeController) {
- super(modeController);
- setupController(modeController);
- }
-
- public void start(ModeController modeController) {
- setupSettings(modeController);
- setupActions(modeController);
- setupModel(modeController);
- setupView(modeController);
- }
-
- private void setupController(ModeController modeController) {
- modeController.removeExtension(UrlManager.class);
- UrlManager.install(new MModeWorkspaceUrlManager());
-
- modeController.removeExtension(LinkController.class);
- LinkController.install(MModeWorkspaceLinkController.getController());
-
- //add link type entry to the chooser
- MModeWorkspaceLinkController.getController().prepareOptionPanelBuilder(((MModeController)modeController).getOptionPanelBuilder());
-
- modeController.addINodeViewLifeCycleListener(new INodeViewLifeCycleListener() {
-
- public void onViewCreated(Container nodeView) {
- NodeView node = (NodeView) nodeView;
- final DropTarget dropTarget = new DropTarget(node.getMainView(), new MNodeDropListener() {
- public void drop(final DropTargetDropEvent dtde) {
- DropTargetDropEvent evt = dtde;
- if(dtde.getTransferable().isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR)) {
- evt = new DropTargetDropEvent(dtde.getDropTargetContext(), dtde.getLocation(), dtde.getDropAction(), dtde.getSourceActions(), false);
- }
- super.drop(evt);
- }
- });
- dropTarget.setActive(true);
- }
-
- public void onViewRemoved(Container nodeView) {
- }
-
- });
-
- modeController.addMenuContributor(new IMenuContributor() {
- public void updateMenus(ModeController modeController, MenuBuilder builder) {
- final String MENU_PROJECT_KEY = "/menu_bar/project";
- //insert project menu into main menu
- JMenu projectMenu = new JMenu(TextUtils.getText("menu.project.entry.label"));
- projectMenu.setMnemonic('o');
- builder.addMenuItem("/menu_bar/format", projectMenu, MENU_PROJECT_KEY, MenuBuilder.AFTER);
-
- builder.addAction(MENU_PROJECT_KEY, WorkspaceController.getAction(WorkspaceNewProjectAction.KEY), MenuBuilder.AS_CHILD);
- builder.addAction(MENU_PROJECT_KEY, WorkspaceController.getAction(WorkspaceImportProjectAction.KEY), MenuBuilder.AS_CHILD);
-
- builder.addSeparator(MENU_PROJECT_KEY, MenuBuilder.AS_CHILD);
- final String MENU_PROJECT_ADD_KEY = builder.getMenuKey(MENU_PROJECT_KEY, "new");
- final JMenu addMenu = new JMenu(TextUtils.getText("workspace.action.new.label"));
- builder.addMenuItem(MENU_PROJECT_KEY, addMenu, MENU_PROJECT_ADD_KEY, MenuBuilder.AS_CHILD);
- builder.addAction(MENU_PROJECT_ADD_KEY, new NodeNewFolderAction(), MenuBuilder.AS_CHILD);
- builder.addAction(MENU_PROJECT_ADD_KEY, new NodeNewLinkAction(), MenuBuilder.AS_CHILD);
- final WorkspaceRemoveProjectAction rmProjectAction = new WorkspaceRemoveProjectAction();
- builder.addAction(MENU_PROJECT_KEY, rmProjectAction, MenuBuilder.AS_CHILD);
-
- builder.addSeparator(MENU_PROJECT_KEY, MenuBuilder.AS_CHILD);
- setDefaultAccelerator(builder.getShortcutKey(builder.getMenuKey(MENU_PROJECT_KEY,WorkspaceProjectOpenLocationAction.KEY)), "control alt L");
- final WorkspaceProjectOpenLocationAction openLocAction = new WorkspaceProjectOpenLocationAction();
- builder.addAction(MENU_PROJECT_KEY, openLocAction, MenuBuilder.AS_CHILD);
-
- projectMenu.getPopupMenu().addPopupMenuListener(new PopupMenuListener() {
- public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
- rmProjectAction.setEnabled();
- openLocAction.setEnabled();
- if(WorkspaceController.getCurrentProject() == null) {
- addMenu.setEnabled(false);
- }
- else {
- addMenu.setEnabled(true);
- }
- }
-
- public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {}
-
- public void popupMenuCanceled(PopupMenuEvent e) {}
- });
- }
-
- private void setDefaultAccelerator(final String shortcutKey, String accelerator) {
- if (accelerator != null) {
- if (null == ResourceController.getResourceController().getProperty(shortcutKey, null)) {
- if (Compat.isMacOsX()) {
- accelerator = accelerator.replaceFirst("CONTROL", "META").replaceFirst("control", "meta");
- }
-
- ResourceController.getResourceController().setDefaultProperty(shortcutKey, accelerator);
- }
- }
- }
- });
- }
-
- private void setupSettings(ModeController modeController) {
- loadSettings(getSettingsPath());
- }
-
- private void setupModel(ModeController modeController) {
- String[] projectsIds = settings.getProperty(WORKSPACE_MODEL_PROJECTS, "").split(WORKSPACE_MODEL_PROJECTS_SEPARATOR);
- for (String projectID : projectsIds) {
- String projectHome = settings.getProperty(projectID);
- if(projectHome == null) {
- continue;
- }
- AWorkspaceProject project = null;
- try {
- project = AWorkspaceProject.create(projectID, URIUtils.createURI(projectHome));
- getModel().addProject(project);
- getProjectLoader().loadProject(project);
- }
- catch (Exception e) {
- LogUtils.severe(e);
- if(project != null) {
- getModel().removeProject(project);
- }
- }
- }
- }
-
- private void setupView(ModeController modeController) {
- FileSystemManager.setDirectoryConflictHandler(new DirectoryMergeConflictDialog());
- FileSystemManager.setFileConflictHandler(new FileExistsConflictDialog());
- boolean expanded = true;
- try {
- expanded = !Boolean.parseBoolean(settings.getProperty(WORKSPACE_VIEW_COLLAPSED, "false"));
- }
- catch (Exception e) {
- // ignore -> default is true
- }
-
- OneTouchCollapseResizer otcr = new OneTouchCollapseResizer(Direction.LEFT, CollapseDirection.COLLAPSE_LEFT);
- otcr.addCollapseListener(getWorkspaceView());
- ResizerEventAdapter adapter = new ResizerEventAdapter() {
-
- public void componentResized(ResizeEvent event) {
- if(event.getSource().equals(getView())) {
- settings.setProperty(WORKSPACE_VIEW_WIDTH, String.valueOf(((JComponent) event.getSource()).getPreferredSize().width));
- }
- }
-
- public void componentCollapsed(ResizeEvent event) {
- if(event.getSource().equals(getView())) {
- settings.setProperty(WORKSPACE_VIEW_COLLAPSED, "true");
- }
- }
-
- public void componentExpanded(ResizeEvent event) {
- if(event.getSource().equals(getView())) {
- settings.setProperty(WORKSPACE_VIEW_COLLAPSED, "false");
- }
- }
- };
-
- otcr.addResizerListener(adapter);
- otcr.addCollapseListener(adapter);
-
- Box resizableTools = Box.createHorizontalBox();
- try {
- int width = Integer.parseInt(settings.getProperty(WORKSPACE_VIEW_WIDTH, "250"));
- getWorkspaceView().setPreferredSize(new Dimension(width, 40));
- }
- catch (Exception e) {
- // blindly accept
- }
- resizableTools.add(getWorkspaceView());
- resizableTools.add(otcr);
- otcr.setExpanded(expanded);
- modeController.getUserInputListenerFactory().addToolBar("workspace", ViewController.LEFT, resizableTools);
- getWorkspaceView().setModel(getModel());
- getView().expandPath(getModel().getRoot().getTreePath());
- for(AWorkspaceProject project : getModel().getProjects()) {
- getView().expandPath(project.getModel().getRoot().getTreePath());
- }
-
- getView().getNodeTypeIconManager().addNodeTypeIconHandler(LinkTypeFileNode.class, new LinkTypeFileIconHandler());
- getView().getNodeTypeIconManager().addNodeTypeIconHandler(DefaultFileNode.class, new DefaultFileNodeIconHandler());
- getView().refreshView();
- }
-
- private void setupActions(ModeController modeController) {
- WorkspaceController.addAction(new WorkspaceExpandAction());
- WorkspaceController.addAction(new WorkspaceCollapseAction());
- WorkspaceController.addAction(new WorkspaceNewProjectAction());
- WorkspaceController.addAction(new WorkspaceImportProjectAction());
- WorkspaceController.addAction(new NodeNewFolderAction());
- WorkspaceController.addAction(new NodeNewLinkAction());
- WorkspaceController.addAction(new NodeOpenLocationAction());
-
- //WORKSPACE - fixed: #332
- WorkspaceController.addAction(new NodeCutAction());
- WorkspaceController.addAction(new NodeCopyAction());
- WorkspaceController.addAction(new NodePasteAction());
- WorkspaceController.addAction(new NodeRenameAction());
- WorkspaceController.addAction(new NodeRemoveAction());
- WorkspaceController.addAction(new NodeRefreshAction());
- WorkspaceController.addAction(new WorkspaceRemoveProjectAction());
-
- WorkspaceController.replaceAction(new WorkspaceNewMapAction());
- WorkspaceController.addAction(new FileNodeNewMindmapAction());
- WorkspaceController.addAction(new FileNodeNewFileAction());
- WorkspaceController.addAction(new FileNodeDeleteAction());
-
- WorkspaceController.addAction(new PhysicalFolderSortOrderAction());
- }
-
- private void loadSettings(String settingsPath) {
- final File userPropertiesFolder = new File(settingsPath);
- final File settingsFile = new File(userPropertiesFolder, USER_SETTINGS_FILENAME);
-
- settings = new Properties();
- InputStream in = null;
- try {
- in = new FileInputStream(settingsFile);
- settings.load(in);
- }
- catch (final Exception ex) {
- LogUtils.info("Workspace settings not found, create new file");
- setupDefaultSettings();
- }
- finally {
- FileUtils.silentlyClose(in);
- }
- }
-
- private void setupDefaultSettings() {
- settings.setProperty(WORKSPACE_VIEW_WIDTH, "150");
- settings.setProperty(WORKSPACE_VIEW_ENABLED, "true");
- settings.setProperty(WORKSPACE_VIEW_COLLAPSED, "false");
- }
-
- private void saveSettings(String settingsPath) {
- final File userPropertiesFolder = new File(settingsPath);
- final File settingsFile = new File(userPropertiesFolder, USER_SETTINGS_FILENAME);
- // clear old settings
- String[] projectsIds = settings.getProperty(WORKSPACE_MODEL_PROJECTS, "").split(WORKSPACE_MODEL_PROJECTS_SEPARATOR);
- for (String projectID : projectsIds) {
- settings.remove(projectID);
- }
- // build new project stack
- List<String> projectIDs = new ArrayList<String>();
- synchronized (getModel().getProjects()) {
- for(AWorkspaceProject project : getModel().getProjects()) {
- saveProject(project);
- if(projectIDs.contains(project.getProjectID())) {
- continue;
- }
- projectIDs.add(project.getProjectID());
- settings.setProperty(project.getProjectID(), project.getProjectHome().toString());
- }
- }
- StringBuilder sb = new StringBuilder();
- for (String prjId : projectIDs) {
- if(sb.length()>0) {
- sb.append(WORKSPACE_MODEL_PROJECTS_SEPARATOR);
- }
- sb.append(prjId);
- }
- settings.setProperty(WORKSPACE_MODEL_PROJECTS, sb.toString());
- OutputStream os = null;
- try {
- if(!settingsFile.exists()) {
- settingsFile.getParentFile().mkdirs();
- settingsFile.createNewFile();
- }
- os = new FileOutputStream(settingsFile);
- settings.store(os, "user settings for the workspace");
- }
- catch (final Exception ex) {
- LogUtils.severe("could not store workspace settings.", ex);
- }
- finally {
- FileUtils.silentlyClose(os);
- }
- }
-
- private void saveProject(AWorkspaceProject project) {
- try {
- getProjectLoader().storeProject(project);
- } catch (IOException e) {
- LogUtils.severe(e);
- }
-
- }
-
- private TreeView getWorkspaceView() {
- if (this.view == null) {
- this.view = new TreeView();
- this.view.setMinimumSize(new Dimension(100, 40));
- this.view.setPreferredSize(new Dimension(150, 40));
- this.view.addProjectSelectionListener(getProjectSelectionListener());
- getModel();
- }
- return this.view;
- }
-
- public WorkspaceModel getModel() {
- if(wsModel == null) {
- wsModel = WorkspaceModel.createDefaultModel();
- }
- return wsModel;
- }
-
- public void setModel(WorkspaceModel model) {
- wsModel = model;
- }
-
- @Override
- public IWorkspaceView getView() {
- return getWorkspaceView();
- }
-
- public FileReadManager getFileTypeManager() {
- if (this.fileTypeManager == null) {
- this.fileTypeManager = new FileReadManager();
- Properties props = new Properties();
- try {
- props.load(this.getClass().getResourceAsStream("/conf/filenodetypes.properties"));
-
- Class<?>[] args = {};
- for (Object key : props.keySet()) {
- try {
- Class<?> clazz = DefaultFileNodeCreator.class;
-
- clazz = this.getClass().getClassLoader().loadClass(key.toString());
-
- AFileNodeCreator handler = (AFileNodeCreator) clazz.getConstructor(args).newInstance();
- handler.setFileTypeList(props.getProperty(key.toString(), ""), "\\|");
- this.fileTypeManager.addFileHandler(handler);
- }
- catch (ClassNotFoundException e) {
- LogUtils.warn("Class not found [" + key + "]", e);
- }
- catch (ClassCastException e) {
- LogUtils.warn("Class [" + key + "] is not of type: PhysicalNode", e);
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- catch (IOException e) {
- e.printStackTrace();
- }
- }
- return this.fileTypeManager;
- }
-
- public URI getDefaultProjectHome() {
- File home = URIUtils.getAbsoluteFile(WorkspaceController.getApplicationHome());
- home = new File(home, "projects");
- return home.toURI();
- }
-
- public void shutdown() {
- save();
- }
-
- public String getSettingsPath() {
- IUserAccount user = UserAccountController.getController().getActiveUser();
- if(user == null) {
- user = new LocalUser("local");
- user.activate();
- }
- return URIUtils.getAbsoluteFile(WorkspaceController.getApplicationSettingsHome()).getPath() + File.separator + "users"+File.separator+user.getName();
- }
-
- private IProjectSelectionListener getProjectSelectionListener() {
- if(this.projectSelectionListener == null) {
- this.projectSelectionListener = new IProjectSelectionListener() {
- public void selectionChanged(ProjectSelectionEvent event) {
- currentSelectedProject = event.getSelectedProject();
- }
- };
- }
- return this.projectSelectionListener;
- }
-
- @Override
- public AWorkspaceProject getCurrentProject() {
- return currentSelectedProject;
- }
-
- @Override
- public void save() {
- saveSettings(getSettingsPath());
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/MModeWorkspaceLinkController.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/MModeWorkspaceLinkController.java
deleted file mode 100644
index 9e2e654..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/MModeWorkspaceLinkController.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package org.freeplane.plugin.workspace.mindmapmode;
-
-import java.io.File;
-import java.net.URI;
-import java.util.Enumeration;
-import java.util.List;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.resources.components.ComboProperty;
-import org.freeplane.core.resources.components.IPropertyControl;
-import org.freeplane.core.resources.components.IPropertyControlCreator;
-import org.freeplane.core.resources.components.OptionPanelBuilder;
-import org.freeplane.core.ui.IndexedTree;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.link.mindmapmode.MLinkController;
-import org.freeplane.features.map.NodeModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.features.WorkspaceMapModelExtension;
-
-public class MModeWorkspaceLinkController extends MLinkController {
-
- public final static int LINK_RELATIVE_TO_PROJECT = 2;
- private final static String LINK_RELATIVE_TO_PROJECT_PROPERTY = "relative_to_workspace";
-
- private static MModeWorkspaceLinkController self;
-
- public MModeWorkspaceLinkController(ModeController modeController) {
- super(modeController);
- }
-
- protected void init() {
- }
-
- public static MModeWorkspaceLinkController getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- if(self == null) {
- self = new MModeWorkspaceLinkController(modeController);
- }
- return self;
- }
-
- public void setLink(final NodeModel node, final URI argUri, final int linkType) {
- URI uri = argUri;
- int finalLinkType = linkType;
- if (linkType == LINK_RELATIVE_TO_PROJECT) {
- WorkspaceMapModelExtension mapExt = WorkspaceController.getMapModelExtension(node.getMap());
- if(mapExt != null && mapExt.getProject() != null) {
- uri = mapExt.getProject().getRelativeURI(argUri);
- if(uri == null) {
- uri = argUri;
- }
- else {
- finalLinkType = LINK_ABSOLUTE;
- }
- }
- else {
- if(node.getMap().getFile() != null) {
- finalLinkType = LINK_RELATIVE_TO_MINDMAP;
- }
- else {
- finalLinkType = LINK_ABSOLUTE;
- }
- }
- }
- super.setLink(node, uri, finalLinkType);
-
- }
-
- public int linkType() {
- String linkTypeProperty = ResourceController.getResourceController().getProperty("links");
- if (linkTypeProperty.equals(LINK_RELATIVE_TO_PROJECT_PROPERTY)) {
- return LINK_RELATIVE_TO_PROJECT;
- }
- return super.linkType();
- }
-
- public URI createRelativeURI(final File map, final File input, final int linkType) {
- if (linkType == LINK_ABSOLUTE) {
- return null;
- }
- try {
- if (linkType == LINK_RELATIVE_TO_PROJECT) {
- return WorkspaceController.getCurrentProject().getRelativeURI(input.getAbsoluteFile().toURI());
- }
- else {
- return super.createRelativeURI(map, input, linkType);
- }
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- return null;
- }
-
- /**
- * similar to the File(File base, File ext) contructor. The extend path (child) will be appended to the base path.
- * @param base
- * @param child
- * @return
- */
- public static URI extendPath(URI base, String child) {
- return new File(URIUtils.getAbsoluteFile(base), child).toURI();
- }
-
- public void prepareOptionPanelBuilder(OptionPanelBuilder builder) {
- IndexedTree.Node node = (IndexedTree.Node) builder.getRoot();
- String path = "Environment/hyperlink_types/links";
- final IndexedTree.Node found = getNodeForPath(path, node);
- if(found != null) {
- found.setUserObject(new IPropertyControlCreator() {
- private final IPropertyControlCreator creator = (IPropertyControlCreator) found.getUserObject();
- public IPropertyControl createControl() {
- ComboProperty property = (ComboProperty) creator.createControl();
- List<String> list = property.getPossibleValues();
- list.add(MModeWorkspaceLinkController.LINK_RELATIVE_TO_PROJECT_PROPERTY);
- return new ComboProperty("links", list.toArray(new String[] {}));
- }
-
- });
- }
- }
-
- private IndexedTree.Node getNodeForPath(String path, IndexedTree.Node node) {
- Enumeration<?> children = node.children();
- while(children.hasMoreElements()) {
- IndexedTree.Node child = (IndexedTree.Node)children.nextElement();
- if(child.getKey() != null && path.startsWith(child.getKey().toString())) {
- if(path.equals(child.getKey().toString())) {
- return child;
- }
- return getNodeForPath(path, child);
-
- }
- }
- return null;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/MModeWorkspaceUrlManager.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/MModeWorkspaceUrlManager.java
deleted file mode 100644
index f0e4516..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/MModeWorkspaceUrlManager.java
+++ /dev/null
@@ -1,141 +0,0 @@
-package org.freeplane.plugin.workspace.mindmapmode;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.net.URLConnection;
-
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.map.MapModel;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.ModeController;
-import org.freeplane.features.url.UrlManager;
-import org.freeplane.features.url.mindmapmode.MFileManager;
-
-public class MModeWorkspaceUrlManager extends MFileManager {
- //WORKSPACE - test: implementation of workspace/project relative uri resolving
-
- public static MModeWorkspaceUrlManager getController() {
- final ModeController modeController = Controller.getCurrentModeController();
- return (MModeWorkspaceUrlManager) modeController.getExtension(UrlManager.class);
- }
-
- protected void init() {
-
- }
-
- public URI getAbsoluteUri(final MapModel map, final URI uri) throws MalformedURLException {
- if(uri == null) {
- return null;
- }
- URL url = null;
- try {
- url = getAbsoluteUrl(map, uri);
- if(url == null) {
- return null;
- }
- return url.toURI();
- } catch (URISyntaxException e) {
- try {
- return new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null);
- }
- catch (Exception ex) {
- throw new MalformedURLException(e.getMessage());
- }
- }
- }
-
- public File getAbsoluteFile(final MapModel map, final URI uri) {
- if(uri == null) {
- return null;
- }
- try {
- URLConnection urlConnection;
- // windows drive letters are interpreted as uri schemes -> make a file from the scheme-less uri string and use this to resolve the path
- if(Compat.isWindowsOS() && (uri.getScheme() != null && uri.getScheme().length() == 1)) {
- urlConnection = (new File(uri.toString())).toURI().toURL().openConnection();
- }
- else if(uri.getScheme() == null && !uri.getPath().startsWith(File.separator)) {
- if(map == null) {
- urlConnection = (new File(uri.toString())).toURI().toURL().openConnection();
- }
- else {
- urlConnection = getAbsoluteUri(map, uri).toURL().openConnection();
- }
- }
- else {
- urlConnection = uri.toURL().openConnection();
- }
-
- if (urlConnection == null) {
- return null;
- }
- else {
- URI absoluteUri = urlConnection.getURL().toURI().normalize();
- if("file".equalsIgnoreCase(absoluteUri.getScheme())){
- return new File(absoluteUri);
- }
- }
- }
- catch (URISyntaxException e) {
- LogUtils.warn(e);
- }
- catch (IOException e) {
- LogUtils.warn(e);
- }
- catch (Exception e){
- LogUtils.warn(e);
- }
- return null;
-
- }
-
- public URL getAbsoluteUrl(final MapModel map, final URI uri) throws MalformedURLException {
- try {
- URI baseUri = null;
- if(map != null && map.getURL() != null) {
- baseUri = map.getURL().toURI();
- }
- return getAbsoluteUrl(baseUri, uri);
- } catch (URISyntaxException e) {
- LogUtils.warn(e);
- }
- return null;
- }
-
- public URL getAbsoluteUrl(final URI base, final URI uri) throws MalformedURLException {
- if(uri == null) {
- if(base == null) {
- return null;
- }
- return base.toURL();
- }
- URI preResolved = getAbsoluteURI(uri);
- if(base == null) {
- if(preResolved != null) {
- return preResolved.toURL();
- }
- return null;
- }
- return super.getAbsoluteUrl(base, preResolved);
- }
-
- public URI getAbsoluteURI(final URI uri) {
- try {
- if(uri.getScheme() == null) {
- return uri;
- }
- return uri.toURL().openConnection().getURL().toURI();
- } catch (IOException ex) {
- LogUtils.warn(ex);
- return null;
- } catch (URISyntaxException ex) {
- LogUtils.warn(ex);
- return null;
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/VirtualFolderDropHandler.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/VirtualFolderDropHandler.java
deleted file mode 100644
index 6f9f788..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/mindmapmode/VirtualFolderDropHandler.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package org.freeplane.plugin.workspace.mindmapmode;
-
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.dnd.DnDConstants;
-import java.io.File;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.IWorkspaceView;
-import org.freeplane.plugin.workspace.dnd.INodeDropHandler;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-import org.freeplane.plugin.workspace.nodes.FolderLinkNode;
-import org.freeplane.plugin.workspace.nodes.LinkTypeFileNode;
-
-public class VirtualFolderDropHandler implements INodeDropHandler {
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- private void processWorkspaceNodeDrop(AWorkspaceTreeNode targetNode, List<AWorkspaceTreeNode> nodes, int dropAction) {
- try {
- for(AWorkspaceTreeNode node : nodes) {
- AWorkspaceTreeNode newNode = null;
- if(node instanceof DefaultFileNode) {
- newNode = createFSNodeLinks(targetNode, ((DefaultFileNode) node).getFile());
- }
- else {
- if(dropAction == DnDConstants.ACTION_COPY) {
- newNode = node.clone();
- }
- else if (dropAction == DnDConstants.ACTION_MOVE) {
- AWorkspaceTreeNode parent = node.getParent();
- targetNode.getModel().cutNodeFromParent(node);
- parent.refresh();
- newNode = node;
- }
- }
- if(newNode == null) {
- continue;
- }
- targetNode.getModel().addNodeTo(newNode, targetNode);
-// WorkspaceController.getController().getExpansionStateHandler().addPathKey(this.getKey());
- }
-// WorkspaceUtils.saveCurrentConfiguration();
-
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- }
-
- private void processFileListDrop(AWorkspaceTreeNode targetNode, List<File> files, int dropAction) {
- try {
- for(File srcFile : files) {
- AWorkspaceTreeNode node = createFSNodeLinks(targetNode, srcFile);
- targetNode.getModel().addNodeTo(node, targetNode);
- node.refresh();
- }
-// WorkspaceUtils.saveCurrentConfiguration();
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- }
-
- private void processUriListDrop(AWorkspaceTreeNode targetNode, List<URI> uris, int dropAction) {
- try {
- for(URI uri : uris) {
- File srcFile = new File(uri);
- if(srcFile == null || !srcFile.exists()) {
- continue;
- }
- AWorkspaceTreeNode node = createFSNodeLinks(targetNode, srcFile);
- targetNode.getModel().addNodeTo(node, targetNode);
- node.refresh();
- };
-// WorkspaceUtils.saveCurrentConfiguration();
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- }
-
- /**
- * @param file
- * @return
- */
- private AWorkspaceTreeNode createFSNodeLinks(AWorkspaceTreeNode targetNode, File file) {
- AWorkspaceTreeNode node = null;
- AWorkspaceProject project = WorkspaceController.getProject(targetNode);
- if(file.isDirectory()) {
- FolderLinkNode pNode = new FolderLinkNode();
- pNode.setPath(project.getRelativeURI(file.toURI()));
- node = pNode;
- }
- else {
- LinkTypeFileNode lNode = new LinkTypeFileNode();
- lNode.setLinkURI(project.getRelativeURI(file.toURI()));
- node = lNode;
- }
- node.setName(file.getName());
- return node;
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- @SuppressWarnings("unchecked")
- public boolean processDrop(AWorkspaceTreeNode targetNode, Transferable transferable, int dropAction) {
- try {
- if(transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR)) {
- processWorkspaceNodeDrop(targetNode, (List<AWorkspaceTreeNode>) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR), dropAction);
- }
- else if(transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR)) {
- processFileListDrop(targetNode, (List<File>) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR), dropAction);
- }
- else if(transferable.isDataFlavorSupported(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR)) {
- ArrayList<URI> uriList = new ArrayList<URI>();
- String uriString = (String) transferable.getTransferData(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR);
- if (!uriString.startsWith("file://")) {
- return false;
- }
- String[] uriArray = uriString.split("\r\n");
- for(String singleUri : uriArray) {
- try {
- uriList.add(URIUtils.createURI(singleUri));
- }
- catch (Exception e) {
- LogUtils.info("org.freeplane.plugin.workspace.mindmapmode.VirtualFolderDropHandler.processDrop(targetNode, transferable, dropAction)@1:"+ e.getMessage());
- }
- }
- processUriListDrop(targetNode, uriList, dropAction);
- }
- targetNode.refresh();
-
- IWorkspaceView view = WorkspaceController.getCurrentModeExtension().getView();
- if(view != null) {
- view.expandPath(targetNode.getTreePath());
- WorkspaceController.getCurrentModeExtension().getView().refreshView();
- }
- }
- catch (Exception e) {
- LogUtils.warn("org.freeplane.plugin.workspace.mindmapmode.VirtualFolderDropHandler.processDrop(targetNode, transferable, dropAction)@2", e);
- }
- return true;
- }
-
- public boolean acceptDrop(Transferable transferable) {
- for(DataFlavor flavor : transferable.getTransferDataFlavors()) {
- if(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR.equals(flavor)
- || WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR.equals(flavor)
- || WorkspaceTransferable.WORKSPACE_NODE_FLAVOR.equals(flavor)
- ) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/AWorkspaceNodeCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/AWorkspaceNodeCreator.java
deleted file mode 100644
index f17bca0..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/AWorkspaceNodeCreator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package org.freeplane.plugin.workspace.model;
-
-import org.freeplane.core.io.IElementDOMHandler;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.n3.nanoxml.XMLElement;
-
-public abstract class AWorkspaceNodeCreator implements IElementDOMHandler {
-
- private IResultProcessor resultProcessor;
-
- abstract public AWorkspaceTreeNode getNode(final XMLElement data);
-
-
- public AWorkspaceNodeCreator() {
- }
-
- public Object createElement(final Object parent, final String tag, final XMLElement attributes) {
- if (attributes == null) {
- return null;
- }
-
- AWorkspaceTreeNode node = getNode(attributes);
- if (node == null) {
- return null;
- }
- node.setParent((AWorkspaceTreeNode) parent);
- node.setMandatoryAttributes(attributes);
- //node.initializePopup();
- processResult((AWorkspaceTreeNode) parent, node);
- return node;
- }
-
- public void endElement(final Object parent, final String tag, final Object userObject, final XMLElement lastBuiltElement) {
- }
-
- public void setResultProcessor(IResultProcessor processor) {
- this.resultProcessor = processor;
- }
-
- public IResultProcessor getResultProcessor() {
- return this.resultProcessor;
- }
-
- private void processResult(AWorkspaceTreeNode parent, AWorkspaceTreeNode node) {
- if(getResultProcessor() == null) {
- LogUtils.warn("Missing ResultProcessor for node "+ node.getClass().getName());
- return;
- }
- getResultProcessor().process(parent, node);
- }
-}
\ No newline at end of file
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/AWorkspaceTreeNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/AWorkspaceTreeNode.java
deleted file mode 100644
index 6241ae4..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/AWorkspaceTreeNode.java
+++ /dev/null
@@ -1,279 +0,0 @@
-package org.freeplane.plugin.workspace.model;
-
-import java.awt.Component;
-import java.awt.Point;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.NoSuchElementException;
-
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.TreeNode;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.lang.Destructable;
-import org.freeplane.n3.nanoxml.XMLElement;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.io.annotation.ExportAsAttribute;
-
-
-public abstract class AWorkspaceTreeNode implements Cloneable, TreeNode, Destructable, Serializable {
-
- private static final long serialVersionUID = 1L;
-
- public final static int WSNODE_DEFAULT_MODE = 0;
-
- // needed for TreeNode interface
- private AWorkspaceTreeNode parent = null;
- private ArrayList<AWorkspaceTreeNode> children = new ArrayList<AWorkspaceTreeNode>();
- //private ArrayList<AWorkspaceTreeNode> children = new ArrayList<AWorkspaceTreeNode>();
- private boolean allowsChildren = true;
- private TreePath path = new WorkspaceTreeNodePath(this);
-
- //for workspace nodes
- private String name;
- private int currentMode;
- private final String type;
- private boolean system = false;
- private boolean isTranferable = true;
-
- private WorkspaceTreeModel treeModel;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public AWorkspaceTreeNode(final String type) {
- this.type = type;
- this.currentMode = WSNODE_DEFAULT_MODE;
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- abstract public AWorkspaceTreeNode clone();
-
- abstract public String getTagName();
-
- abstract public void initializePopup();
-
- public abstract WorkspacePopupMenu getContextMenu();
-
-
- public void setParent(AWorkspaceTreeNode node) {
- this.parent = node;
- if(node == null) {
- return;
- }
- path = node.getTreePath().pathByAddingChild(this);
- }
-
- public TreePath getTreePath() {
- return path;
- }
-
-
- public void allowChildren(boolean allow) {
- allowsChildren = allow;
- }
-
- public void addChildNode(AWorkspaceTreeNode node) {
- insertChildNode(node, children.size());
- }
-
- public void insertChildNode(AWorkspaceTreeNode node, int atPos) {
- node.setParent(this);
- children.add(atPos, node);
- }
-
- @ExportAsAttribute(name="system")
- public boolean isSystem() {
- return system;
- }
-
- public void setSystem(boolean system) {
- this.system = system;
- }
-
- public void setTransferable(boolean enabled) {
- this.isTranferable = enabled;
- }
-
- /**
- * @return
- */
- @ExportAsAttribute(name="transferable",defaultBool=true)
- public boolean isTransferable() {
- return isTranferable;
- }
-
-
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getId() {
- return Integer.toHexString(getName() == null ? "".hashCode() : getName().hashCode()).toUpperCase();
- //return Integer.toHexString(super.toString().hashCode()).toUpperCase();
- //return (getName() == null ? "NULL" : getName());
- }
-
- public final String getKey() {
- return getTreePath().toString();
- }
-
- public int getMode() {
- return this.currentMode;
- }
-
- public void setMode(int mode) {
- this.currentMode = mode;
- }
-
- public String getType() {
- return this.type;
- }
-
- public boolean isEditable() {
- return false;
- }
-
- public boolean setIcons(DefaultTreeCellRenderer renderer) {
- return false;
- }
-
- public void setMandatoryAttributes(XMLElement data) {
- String system = data.getAttribute("system", "false");
- if (system.equals("true")) {
- setSystem(true);
- }
- String transferable = data.getAttribute("transferable", "true");
- if (transferable.equals("false")) {
- setTransferable(false);
- }
- }
-
- public void removeAllChildren() {
- for(int i=0; i < children.size(); ) {
- children.remove(i);
- }
- }
-
- public void removeChild(AWorkspaceTreeNode child) {
- children.remove(child);
- }
-
- public int getChildIndex(AWorkspaceTreeNode child) {
- return children.indexOf(child);
- }
-
- public void refresh() {
- //override in child class, if necessary
- getModel().reload(this);
- }
-
- protected AWorkspaceTreeNode clone(AWorkspaceTreeNode node) {
- node.allowChildren(this.getAllowsChildren());
- node.setMode(getMode());
- node.setSystem(isSystem());
- node.setParent(getParent());
- node.setName(getName());
- for(AWorkspaceTreeNode child : this.children) {
- node.addChildNode(child.clone());
- }
- return node;
- }
-
- public String toString() {
- return this.getClass().getSimpleName()+"[type="+this.getType()+";name="+this.getName()+"]";
- }
-
- public void showPopup(Component component, int x, int y) {
- final WorkspacePopupMenu popupMenu = getContextMenu();
- if(popupMenu == null) {
- return;
- }
- popupMenu.setInvokerLocation(new Point(x, y));
- if (popupMenu != null) {
- popupMenu.show(component, x, y);
- }
- }
-
- public AWorkspaceTreeNode getChildById(String id) {
- if(id == null) {
- return null;
- }
- synchronized (children) {
- for (AWorkspaceTreeNode child : children) {
- if(id.equals(child.getId())) {
- return child;
- }
- }
- }
- return null;
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public AWorkspaceTreeNode getChildAt(int childIndex) {
- return children.get(childIndex);
- }
-
- public int getChildCount() {
- return children.size();
- }
-
- public AWorkspaceTreeNode getParent() {
- return this.parent;
- }
-
- public int getIndex(TreeNode node) {
- return children.indexOf(node);
- }
-
- public boolean isLeaf() {
- return !allowsChildren || (children.size() == 0);
- }
-
- public WorkspaceTreeModel getModel() {
- if(this.treeModel == null && getParent() != null) {
- return getParent().getModel();
- }
- return this.treeModel;
- }
-
- public void setModel(WorkspaceTreeModel model) {
- this.treeModel = model;
- }
-
- public Enumeration<AWorkspaceTreeNode> children() {
- return new Enumeration<AWorkspaceTreeNode>() {
- int count = 0;
-
- public boolean hasMoreElements() {
- return count < children.size();
- }
-
- public AWorkspaceTreeNode nextElement() {
- synchronized (children) {
- if (count < children.size()) {
- return (AWorkspaceTreeNode)children.get(count++);
- }
- }
- throw new NoSuchElementException("AWorkspaceTreeNode Enumeration");
- }
- };
- }
-
- public void disassociateReferences() {
- getModel().removeAllElements(this);
- this.parent = null;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/IMutableLinkNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/IMutableLinkNode.java
deleted file mode 100644
index d999205..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/IMutableLinkNode.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 22.11.2011
- */
-package org.freeplane.plugin.workspace.model;
-
-/**
- *
- */
-public interface IMutableLinkNode {
- /**
- * Changes the name of this node.
- *
- * @param newName the new name string
- * @param renameLink set to <code>true</code> if the linked file name should also be renamed, else <code>false</code>
- * @return <code>true</code> if the name was successfully changed, else <code>false</code>
- */
- public boolean changeName(String newName, boolean renameLink);
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/IResultProcessor.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/IResultProcessor.java
deleted file mode 100644
index 409b5b2..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/IResultProcessor.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package org.freeplane.plugin.workspace.model;
-
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public interface IResultProcessor {
-
- void process(AWorkspaceTreeNode parent, AWorkspaceTreeNode node);
- void setProject(AWorkspaceProject project);
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModel.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModel.java
deleted file mode 100644
index 503676b..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModel.java
+++ /dev/null
@@ -1,637 +0,0 @@
-package org.freeplane.plugin.workspace.model;
-
-import java.awt.Toolkit;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-
-import javax.swing.event.TreeModelEvent;
-import javax.swing.event.TreeModelListener;
-import javax.swing.tree.TreeModel;
-import javax.swing.tree.TreeNode;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.model.WorkspaceModelEvent.WorkspaceModelEventType;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-import org.freeplane.plugin.workspace.model.project.IProjectModelListener;
-import org.freeplane.plugin.workspace.model.project.ProjectModel;
-import org.freeplane.plugin.workspace.nodes.WorkspaceRootNode;
-
-public abstract class WorkspaceModel implements TreeModel {
-
- protected List<AWorkspaceProject> projects = new ArrayList<AWorkspaceProject>();
- protected final List<WorkspaceModelListener> listeners = new ArrayList<WorkspaceModelListener>();
-
- protected WorkspaceRootNode root;
- protected IProjectModelListener projectModelListener;
-
- public void addProject(AWorkspaceProject project) {
- if(project == null) {
- return;
- }
- synchronized (projects) {
- if(!projects.contains(project)) {
- projects.add(project);
- project.getModel().addProjectModelListener(getTreeModelListener());
- fireProjectInserted(project);
- }
- }
- }
-
- public void removeProject(AWorkspaceProject project) {
- if(project == null) {
- return;
- }
- synchronized (projects) {
- int index = getProjectIndex(project);
- if(index > -1) {
- projects.remove(project);
- project.getModel().removeProjectModelListener(getTreeModelListener());
- fireProjectRemoved(project, index);
-
- }
- }
- }
-
- private WorkspaceModelEvent validatedModelEvent(WorkspaceModelEvent event) {
- WorkspaceModelEvent evt = event;
- if(event.getTreePath() == null) {
- int[] indices;
- int index = getProjectIndex(event.getProject());
- if(index < 0) {
- indices = new int[]{};
- }
- else {
- indices = new int[]{index};
- }
- evt = new WorkspaceModelEvent(event.getProject(), event.getSource(), getRoot().getTreePath(), indices, event.getChildren());
- }
- return evt;
- }
-
- public int getProjectIndex(AWorkspaceProject project) {
- synchronized (projects) {
- int index = 0;
- for (AWorkspaceProject prj : projects) {
- if(prj.equals(project)) {
- return index;
- }
- index++;
- }
- }
- return -1;
- }
-
- protected void resetClipboard() {
- if(Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null) instanceof WorkspaceTransferable) {
- Toolkit.getDefaultToolkit().getSystemClipboard().setContents(null, null);
- LogUtils.info("clipboard has been reset");
- }
- }
-
- protected IProjectModelListener getTreeModelListener() {
- if(projectModelListener == null) {
- projectModelListener = new IProjectModelListener() {
-
- public void treeStructureChanged(WorkspaceModelEvent event) {
- resetClipboard();
- event = validatedModelEvent(event);
- synchronized (listeners) {
- for (int i = listeners.size()-1; i >= 0; i--) {
- listeners.get(i).treeStructureChanged(event);
- }
- }
- }
-
- public void treeNodesRemoved(WorkspaceModelEvent event) {
- event = validatedModelEvent(event);
- synchronized (listeners) {
- for (int i = listeners.size()-1; i >= 0; i--) {
- listeners.get(i).treeNodesRemoved(event);
- }
- }
- }
-
- public void treeNodesInserted(WorkspaceModelEvent event) {
- event = validatedModelEvent(event);
- synchronized (listeners) {
- for (int i = listeners.size()-1; i >= 0; i--) {
- listeners.get(i).treeNodesInserted(event);
- }
- }
- }
-
- public void treeNodesChanged(WorkspaceModelEvent event) {
- event = validatedModelEvent(event);
- synchronized (listeners) {
- for (int i = listeners.size()-1; i >= 0; i--) {
- listeners.get(i).treeNodesChanged(event);
- }
- }
- }
- };
- }
- return projectModelListener;
- }
-
-
- protected void fireProjectRemoved(AWorkspaceProject project, int index) {
- synchronized (listeners) {
- WorkspaceModelEvent event = new WorkspaceModelEvent(project, this, new Object[]{getRoot()}, new int[]{index}, new Object[]{project.getModel().getRoot()});
- for (int i = listeners.size()-1; i >= 0; i--) {
- WorkspaceModelListener listener = listeners.get(i);
- listener.projectRemoved(event);
- }
- }
- }
-
- protected void fireProjectInserted(AWorkspaceProject project) {
- synchronized (listeners) {
- WorkspaceModelEvent event = new WorkspaceModelEvent(project, this, new Object[]{getRoot()}, new int[]{getProjectIndex(project)}, new Object[]{project.getModel().getRoot()});;
- for (int i = listeners.size()-1; i >= 0; i--) {
- listeners.get(i).projectAdded(event);
- }
- }
- }
-
- protected void fireWorkspaceRenamed(String oldName, String newName) {
- synchronized (listeners) {
- TreeModelEvent event = new WorkspaceModelEvent(null, this, new Object[]{getRoot()}, new int[]{}, new Object[]{});
- for (int i = listeners.size()-1; i >= 0; i--) {
- listeners.get(i).treeNodesChanged(event);
- }
- }
- }
-
- public AWorkspaceTreeNode getRoot() {
- if(root == null) {
- root = new WorkspaceRootNode();
- root.setModel(new DefaultWorkspaceTreeModel());
- }
- return root;
- }
-
- public Object getChild(Object parent, int index) {
- if(parent == getRoot()) {
- int offset = getRoot().getChildCount()-projects.size();
- if(index < offset) {
- return getRoot().getChildAt(index);
- }
- else {
- synchronized (projects) {
- AWorkspaceTreeNode node = projects.get(index-offset).getModel().getRoot();
- return node;
- }
- }
- }
- else {
- return ((AWorkspaceTreeNode) parent).getChildAt(index);
- }
- }
-
- public int getChildCount(Object parent) {
- if(parent == getRoot()) {
- return getRoot().getChildCount();
- }
- else {
- return ((AWorkspaceTreeNode) parent).getChildCount();
- }
- }
-
- public boolean isLeaf(Object node) {
- if(node == getRoot()) {
- return false;
- }
- else {
- return ((TreeNode) node).isLeaf();
- }
- }
-
- public void valueForPathChanged(TreePath path, Object newValue) {
- if(path == null || getRoot().equals(path.getLastPathComponent())) {
- return;
- }
-
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
- if (node instanceof IWorkspaceNodeActionListener) {
- ((IWorkspaceNodeActionListener) node).handleAction(new WorkspaceActionEvent(node, WorkspaceActionEvent.WSNODE_CHANGED, newValue));
- ((ProjectModel) node.getModel()).nodeChanged(node);
- }
- else {
- node.setName(newValue.toString());
- }
- }
-
- public int getIndexOfChild(Object parent, Object child) {
- if(parent == getRoot()) {
- int offset = getRoot().getChildCount();
- if(offset > 0) {
- int index = getRoot().getChildIndex((AWorkspaceTreeNode) child);
- if( index > -1) {
- return index;
- }
- }
- synchronized (projects) {
- int index = 0;
- for (AWorkspaceProject project : projects) {
- if(child.equals(project.getModel().getRoot())) {
- return index+offset;
- }
- index++;
- }
- return -1;
- }
- }
- else {
- return ((AWorkspaceTreeNode) parent).getIndex((TreeNode) child);
- }
- }
-
- public void addTreeModelListener(TreeModelListener l) {
- if(l == null) {
- return;
- }
- WorkspaceModelListener listener = new WrappedTreeModelListener(l);
- synchronized (listeners) {
- if(listeners.contains(listener)) {
- return;
- }
- listeners.add(listener);
- }
- }
-
- public void addWorldModelListener(WorkspaceModelListener l) {
- if(l == null) {
- return;
- }
- synchronized (listeners) {
- if(listeners.contains(l)) {
- return;
- }
- listeners.add(l);
- }
- }
-
- public void removeTreeModelListener(TreeModelListener l) {
- if(l == null) {
- return;
- }
- WorkspaceModelListener listener = new WrappedTreeModelListener(l);
- synchronized (listeners) {
- listeners.remove(listener);
- }
- }
-
- public List<AWorkspaceProject> getProjects() {
- return this.projects;
- }
-
- public static WorkspaceModel createDefaultModel() {
- return new WorkspaceModel() {
- };
- }
-
- public AWorkspaceProject getProject(WorkspaceTreeModel model) {
- synchronized (this.projects) {
- for (AWorkspaceProject project : this.projects) {
- if(project.getModel().equals(model)) {
- return project;
- }
- }
- }
- return null;
- }
-
- public AWorkspaceProject getProject(String projectID) {
- synchronized (this.projects) {
- for (AWorkspaceProject project : this.projects) {
- if(project.getProjectID().equals(projectID)) {
- return project;
- }
- }
- }
- return null;
- }
- /**********************************************************************
- * NESTED CLASSES
- **********************************************************************/
-
- /**
- *
- * @author mag
- *
- */
- protected final class DefaultWorkspaceTreeModel implements WorkspaceTreeModel {
- public void removeNodeFromParent(AWorkspaceTreeNode node) {
- if(node == null) {
- return;
- }
-
- if(getRoot().equals(node.getParent())) {
- //forbidden: use removeProject
- }
- else {
- WorkspaceTreeModel tModel = node.getModel();
- if(tModel == this) {
- AWorkspaceTreeNode parent = node.getParent();
- int index = parent.getChildIndex(node);
- parent.removeChild(node);
- node.disassociateReferences();
- WorkspaceModelEvent event = new WorkspaceModelEvent(null, this, parent.getTreePath(), new int[]{index}, new Object[]{node});
- getTreeModelListener().treeNodesRemoved(event);
- }
- else {
- tModel.removeNodeFromParent(node);
- }
- }
- }
-
- public void removeAllElements(AWorkspaceTreeNode node) {
- if(node == null) {
- return;
- }
-
- if(getRoot().equals(node)) {
- //forbidden: use removeProject
- }
- else {
- WorkspaceTreeModel tModel = node.getModel();
- if(tModel == this) {
- int[] indices = new int[node.getChildCount()];
- Object[] childArray = new Object[node.getChildCount()];
- Enumeration<AWorkspaceTreeNode> children = node.children();
- AWorkspaceTreeNode child = null;
- int i = 0;
- while (children.hasMoreElements()) {
- child = children.nextElement();
- child.disassociateReferences();
- indices[i] = i;
- childArray[i] = child;
- //fireTreeNodesRemoved(this, node.getTreePath(), null, new Object[] { child });
- i++;
- }
- WorkspaceModelEvent event = new WorkspaceModelEvent(null, this, node.getTreePath(), indices, childArray);
- getTreeModelListener().treeNodesRemoved(event);
- node.removeAllChildren();
- }
- else {
- tModel.removeAllElements(node);
- }
- }
- }
-
- public void reload(AWorkspaceTreeNode node) {
- if(node == null) {
- return;
- }
- resetClipboard();
- if(getRoot().equals(node)) {
- for (AWorkspaceProject project : getProjects()) {
- project.getModel().reload();
- }
- }
- else {
- WorkspaceTreeModel tModel = node.getModel();
- if(tModel == this) {
- WorkspaceModelEvent event = new WorkspaceModelEvent(null, this, node.getTreePath(), null, null);
- getTreeModelListener().treeStructureChanged(event);
- //fireTreeStructureChanged(this, node.getTreePath(), null, null);
- }
- else {
- tModel.reload(node);
- }
- }
- }
-
- public void nodeMoved(AWorkspaceTreeNode node, Object from, Object to) {
- if(getRoot().equals(node)) {
- //forbidden for root node
- }
- else {
- WorkspaceTreeModel tModel = node.getModel();
- if(tModel == this) {
- WorkspaceModelEvent event = new WorkspaceModelEvent(null, this, node.getTreePath(), WorkspaceModelEventType.MOVED, from, to);
- getTreeModelListener().treeStructureChanged(event);
- }
- else {
- tModel.nodeMoved(node, from, to);
- }
- }
- }
-
- public boolean insertNodeTo(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode, int atPos, boolean allowRenaming) {
- if(getRoot().equals(targetNode)) {
- //forbidden: only allowed via addProject()
- return false;
- }
- else {
- WorkspaceTreeModel tModel = node.getModel();
- if(tModel == this) {
- node.setParent(targetNode);
- // DOCEAR - look for problems that may caused by this change!!!
- if (allowRenaming) {
- String newNodeName = node.getName();
- int nameCount = 0;
- while (this.containsNode(node.getKey()) && nameCount++ < 100) {
- node.setName(newNodeName + " (" + nameCount + ")");
- }
- }
- if (this.containsNode(node.getKey())) {
- return false;
- }
- targetNode.insertChildNode(node, atPos);
- WorkspaceModelEvent event = new WorkspaceModelEvent(null, this, targetNode.getTreePath(), new int[]{atPos}, new Object[]{node});
- getTreeModelListener().treeNodesInserted(event);
- return true;
- }
- else {
- return tModel.insertNodeTo(node, targetNode, atPos, allowRenaming);
- }
- }
- }
-
- public AWorkspaceTreeNode getRoot() {
- return WorkspaceModel.this.getRoot();
- }
-
- public boolean containsNode(String key) {
- for (AWorkspaceProject project : getProjects()) {
- if(project.getModel().containsNode(key)) {
- return true;
- }
- }
- if(getRoot().getChildCount() > 0) {
- if(getChildByKey(getRoot(), key) != null) {
- return true;
- }
- }
- return false;
- }
-
- private AWorkspaceTreeNode getChildByKey(AWorkspaceTreeNode parent, String key) {
- if(key == null || key.isEmpty()) {
- return null;
- }
- Enumeration<AWorkspaceTreeNode> children = parent.children();
- AWorkspaceTreeNode child = null;
- while (children.hasMoreElements()) {
- child = children.nextElement();
- String childKey = child.getKey();
- if(key.startsWith(childKey)) {
- if(key.equals(childKey)) {
- return child;
- }
- else {
- return getChildByKey(child, key);
- }
- }
- }
- return null;
- }
-
- public AWorkspaceTreeNode getNode(String key) {
- if(getRoot().getKey().equals(key)) {
- return getRoot();
- }
- AWorkspaceTreeNode node = null;
- for (AWorkspaceProject project : getProjects()) {
- ProjectModel pModel = project.getModel();
- String pKey = pModel.getRoot().getKey();
- if(pKey.equals(key)) {
- node = pModel.getRoot();
- break;
- }
- else {
- node = pModel.getNode(key);
- if(node != null) {
- break;
- }
- }
- }
- if(node == null && getRoot().getChildCount() > 0) {
- node = getChildByKey(getRoot(), key);
- }
- return node;
- }
-
- public void cutNodeFromParent(AWorkspaceTreeNode node) {
- if(getRoot().equals(node.getParent())) {
- //forbidden: use removeProject
- }
- else {
- WorkspaceTreeModel tModel = node.getModel();
- if(tModel == this) {
- AWorkspaceTreeNode parent = node.getParent();
- parent.removeChild(node);
- WorkspaceModelEvent event = new WorkspaceModelEvent(null, this, parent.getTreePath(), null, new Object[]{node});
- getTreeModelListener().treeNodesRemoved(event);
- }
- else {
- tModel.cutNodeFromParent(node);
- }
- }
-
- }
-
- public void changeNodeName(AWorkspaceTreeNode node, String newName) throws WorkspaceModelException {
- if(getRoot().equals(node)) {
- String oldName = node.getName();
- node.setName(newName);
- fireWorkspaceRenamed(oldName, newName);
- }
- else {
- WorkspaceTreeModel tModel = node.getModel();
- if(tModel == this) {
- String oldName = node.getName();
- node.setName(newName);
- if (containsNode(node.getKey())) {
- node.setName(oldName);
- throw new WorkspaceModelException("A Node with the name '" + newName + "' already exists.");
- }
- WorkspaceModelEvent event = new WorkspaceModelEvent(null, this, node.getTreePath(), WorkspaceModelEventType.RENAMED, oldName, newName);
- getTreeModelListener().treeNodesChanged(event);
- }
- else {
- tModel.changeNodeName(node, newName);
- }
- }
- }
-
- public boolean addNodeTo(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode, boolean allowRenaming) {
- return insertNodeTo(node, targetNode, targetNode.getChildCount(), allowRenaming);
- }
-
- public boolean addNodeTo(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode) {
- return addNodeTo(node, targetNode, true);
- }
-
- public void requestSave() {
- WorkspaceController.save();
- }
-
- public void nodeChanged(AWorkspaceTreeNode node, Object oldValue, Object newValue) {
- if(getRoot().equals(node)) {
- //should not happen
- }
- else {
- WorkspaceTreeModel tModel = node.getModel();
- if(tModel == this) {
- WorkspaceModelEvent event = new WorkspaceModelEvent(null, this, node.getTreePath(), WorkspaceModelEventType.DEFAULT, oldValue, newValue);
- getTreeModelListener().treeNodesChanged(event);
- } else {
- node.getModel().nodeChanged(node, oldValue, newValue);
- }
- }
- }
- }
-
- /**
- *
- * @author mag
- *
- */
- public class WrappedTreeModelListener implements WorkspaceModelListener {
- private final TreeModelListener wrappedListener;
-
- public WrappedTreeModelListener(TreeModelListener l) {
- if(l == null) {
- throw new IllegalArgumentException();
- }
- this.wrappedListener = l;
- }
-
- public void treeNodesChanged(TreeModelEvent e) {
- wrappedListener.treeNodesChanged(e);
- }
-
- public void treeNodesInserted(TreeModelEvent e) {
- wrappedListener.treeNodesInserted(e);
- }
-
- public void treeNodesRemoved(TreeModelEvent e) {
- wrappedListener.treeNodesRemoved(e);
- }
-
- public void treeStructureChanged(TreeModelEvent e) {
- wrappedListener.treeStructureChanged(e);
- }
-
- public void projectAdded(WorkspaceModelEvent event) {
- //do nth.
- }
-
- public void projectRemoved(WorkspaceModelEvent event) {
- treeNodesRemoved(event);
- }
-
- public boolean equals(Object obj) {
- return super.equals(obj);
- }
-
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModelEvent.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModelEvent.java
deleted file mode 100644
index 56f94fb..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModelEvent.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.freeplane.plugin.workspace.model;
-
-import javax.swing.event.TreeModelEvent;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public class WorkspaceModelEvent extends TreeModelEvent {
-
- private static final long serialVersionUID = 1L;
- private final AWorkspaceProject project;
- private final WorkspaceModelEventType type;
- private final Object oldValue;
- private final Object newValue;
-
- public WorkspaceModelEvent(AWorkspaceProject project, Object source, Object[] path, int[] childIndices, Object[] children) {
- super(source, path, childIndices, children);
- this.project = project;
- this.type = WorkspaceModelEventType.DEFAULT;
- this.oldValue = null;
- this.newValue = null;
- }
-
- public WorkspaceModelEvent(AWorkspaceProject project, Object source, TreePath path, int[] childIndices, Object[] children) {
- super(source, path, childIndices, children);
- this.project = project;
- this.type = WorkspaceModelEventType.DEFAULT;
- this.oldValue = null;
- this.newValue = null;
- }
-
- public WorkspaceModelEvent(AWorkspaceProject project, Object source, Object[] path) {
- this(project, source, new TreePath(path));
- }
-
- public WorkspaceModelEvent(AWorkspaceProject project, Object source, TreePath path) {
- this(project, source, path, WorkspaceModelEventType.DEFAULT, null, null);
- }
-
- public WorkspaceModelEvent(AWorkspaceProject project, Object source, TreePath path, WorkspaceModelEventType type, Object oldValue, Object newValue) {
- super(source, path);
- this.project = project;
- this.type = type;
- this.oldValue = oldValue;
- this.newValue = newValue;
- }
-
- public AWorkspaceProject getProject() {
- return this.project;
- }
-
- public WorkspaceModelEventType getType() {
- return type;
- }
-
- public Object getOldValue() {
- return oldValue;
- }
-
- public Object getNewValue() {
- return newValue;
- }
-
- public enum WorkspaceModelEventType {
- DEFAULT,
- RENAMED,
- MOVED,
- DELETED
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModelException.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModelException.java
deleted file mode 100644
index feb2d75..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModelException.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.freeplane.plugin.workspace.model;
-
-public class WorkspaceModelException extends Exception {
-
- private static final long serialVersionUID = 1L;
-
- public WorkspaceModelException(String message) {
- super(message);
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModelListener.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModelListener.java
deleted file mode 100644
index 11c7b8a..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceModelListener.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.freeplane.plugin.workspace.model;
-
-import javax.swing.event.TreeModelListener;
-
-public interface WorkspaceModelListener extends TreeModelListener {
-
- public void projectAdded(WorkspaceModelEvent event);
-
- public void projectRemoved(WorkspaceModelEvent event);
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceTreeModel.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceTreeModel.java
deleted file mode 100644
index 46a961c..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceTreeModel.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.freeplane.plugin.workspace.model;
-
-
-public interface WorkspaceTreeModel {
- /**
- * @param node
- * @param targetNode
- * @return
- */
- public boolean addNodeTo(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode);
-
- /**
- * @param node
- * @param targetNode
- * @param allowRenaming
- * @return
- */
- public boolean addNodeTo(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode, boolean allowRenaming);
-
- /**
- * @param node
- * @param targetNode
- * @param allowRenaming
- * @return
- */
- public boolean insertNodeTo(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode, int atPos, boolean allowRenaming);
-
- /**
- * @param node
- */
- public void removeAllElements(AWorkspaceTreeNode node);
-
- /**
- * @param node
- */
- public void removeNodeFromParent(AWorkspaceTreeNode node);
-
- /**
- * @param node
- */
- public void cutNodeFromParent(AWorkspaceTreeNode node);
-
- public void nodeMoved(AWorkspaceTreeNode node, Object from, Object to);
-
- public void nodeChanged(AWorkspaceTreeNode node, Object oldValue, Object newValue);
-
- public void changeNodeName(AWorkspaceTreeNode node, String newName) throws WorkspaceModelException;
-
- /**
- * @param key
- * @return
- */
- public boolean containsNode(String key);
-
- /**
- * @param key
- * @return
- */
- public AWorkspaceTreeNode getNode(String key);
-
- public void reload(AWorkspaceTreeNode node);
-
- public AWorkspaceTreeNode getRoot();
-
- public void requestSave();
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceTreeNodePath.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceTreeNodePath.java
deleted file mode 100644
index 1704e8c..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/WorkspaceTreeNodePath.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 03.11.2011
- */
-package org.freeplane.plugin.workspace.model;
-
-import javax.swing.tree.TreePath;
-
-import org.freeplane.lang.Destructable;
-
-/**
- *
- */
-public class WorkspaceTreeNodePath extends TreePath implements Destructable {
- private static final long serialVersionUID = 4611314235642699349L;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /**
- * @see TreePath#TreePath(Object)
- */
- public WorkspaceTreeNodePath(AWorkspaceTreeNode singlePath) {
- super(singlePath);
- }
-
- /**
- * @see TreePath#TreePath(TreePath,Object)
- */
- public WorkspaceTreeNodePath(TreePath parent, AWorkspaceTreeNode lastElement) {
- super(parent, lastElement);
- }
-
- /**
- * @see TreePath#TreePath()
- */
- protected WorkspaceTreeNodePath() {
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public String toString() {
- return (getParentPath() != null ? getParentPath().toString() : "") + "/"
- + ((AWorkspaceTreeNode) getLastPathComponent()).getId();
- }
-
- // public boolean equals(Object o) {
- // if (o == this)
- // return true;
- // if (o instanceof TreePath) {
- // TreePath oTreePath = (TreePath) o;
- //
- // if (getPathCount() != oTreePath.getPathCount())
- // return false;
- //
- // for (TreePath path = this; path != null; path = path.getParentPath()) {
- // if
- // (!(path.getLastPathComponent().equals(oTreePath.getLastPathComponent())))
- // {
- // return false;
- // }
- // oTreePath = oTreePath.getParentPath();
- // }
- // return true;
- // }
- // return false;
- // }
-
- public WorkspaceTreeNodePath getParentPath() {
- return (WorkspaceTreeNodePath) super.getParentPath();
- }
-
- public WorkspaceTreeNodePath pathByAddingChild(Object child) {
- if (child == null) {
- throw new NullPointerException("Null child not allowed");
- }
-
- return new WorkspaceTreeNodePath(this, (AWorkspaceTreeNode) child);
- }
-
- public AWorkspaceTreeNode getPathComponent(int element) {
- return (AWorkspaceTreeNode) super.getPathComponent(element);
- }
-
- public AWorkspaceTreeNode getLastPathComponent() {
- return (AWorkspaceTreeNode) super.getLastPathComponent();
- }
-
- public boolean equals(Object o) {
- if(o instanceof WorkspaceTreeNodePath) {
- return this.toString().equals(o.toString());
- }
- return super.equals(o);
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void disassociateReferences() {
-
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/AWorkspaceProject.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/AWorkspaceProject.java
deleted file mode 100644
index 5b05304..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/AWorkspaceProject.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package org.freeplane.plugin.workspace.model.project;
-
-import java.net.URI;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.freeplane.plugin.workspace.model.WorkspaceModelEvent;
-import org.freeplane.plugin.workspace.model.WorkspaceModelEvent.WorkspaceModelEventType;
-
-public abstract class AWorkspaceProject {
-
- private Map<Class<? extends IWorkspaceProjectExtension>, IWorkspaceProjectExtension> extensions = new LinkedHashMap<Class<? extends IWorkspaceProjectExtension>, IWorkspaceProjectExtension>();
-
- private static IWorkspaceProjectCreater creator = null;
-
- private ProjectModel model;
-
- public abstract ProjectVersion getVersion();
-
- public abstract URI getProjectHome();
-
- public abstract String getProjectID();
-
- public abstract URI getProjectDataPath();
-
- public abstract URI getRelativeURI(URI uri);
-
- public abstract String getProjectName();
-
-
- public ProjectModel getModel() {
- if(this.model == null) {
- this.model = new ProjectModel(this);
- this.model.addProjectModelListener(new DefaultModelChangeListener());
- }
- return this.model;
- }
-
- @SuppressWarnings("unchecked")
- public <T extends IWorkspaceProjectExtension> T getExtensions(Class<T> key) {
- synchronized (extensions) {
- return (T) extensions.get(key);
- }
- }
-
- public IWorkspaceProjectExtension addExtension(IWorkspaceProjectExtension extension) {
- synchronized (extensions) {
- return addExtension(extension.getClass(), extension);
- }
- }
-
- public IWorkspaceProjectExtension addExtension(Class<? extends IWorkspaceProjectExtension> key, IWorkspaceProjectExtension extension) {
- if(extension == null) {
- return null;
- }
- if(key == null) {
- key = extension.getClass();
- }
- synchronized (extensions) {
- return this.extensions.put(key, extension);
- }
- }
-
- public IWorkspaceProjectExtension removeExtension(Class<? extends IWorkspaceProjectExtension> key) {
- if(key == null) {
- return null;
- }
- synchronized (extensions) {
- return this.extensions.remove(key);
- }
- }
-
- public static void setCurrentProjectCreator(IWorkspaceProjectCreater pCreator) {
- creator = pCreator;
- }
-
- public static AWorkspaceProject create(String projectID, URI projectHome) {
- if(projectHome == null) {
- throw new IllegalArgumentException("projectHome(URI)");
- }
-
- if(creator == null) {
- creator = new DefaultWorkspaceProjectCreator();
- }
-
- return creator.newProject(projectID, projectHome);
- }
-
- public String toString() {
- return getModel().getRoot().getName() +"[id="+getProjectID()+";home="+getProjectHome()+"]";
- }
-
- private final class DefaultModelChangeListener implements IProjectModelListener {
-
- public void treeStructureChanged(WorkspaceModelEvent event) {
- }
-
- public void treeNodesRemoved(WorkspaceModelEvent event) {
- }
-
- public void treeNodesInserted(WorkspaceModelEvent event) {
- }
-
- public void treeNodesChanged(WorkspaceModelEvent event) {
- if(event.getType() == WorkspaceModelEventType.RENAMED && getModel().getRoot().equals(event.getTreePath().getLastPathComponent())) {
- //WORKSPACE - info: if the project folder should have the same name as the project
-// File file = URIUtils.getAbsoluteFile(getProjectHome());
-// File targetFile = new File(file.getParentFile(), getModel().getRoot().getName());
-// if(file.exists()) {
-// file.renameTo(targetFile);
-// }
- //setProjectHome(targetFile.toURI());
-
- }
- }
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/DefaultWorkspaceProjectCreator.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/DefaultWorkspaceProjectCreator.java
deleted file mode 100644
index 3290584..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/DefaultWorkspaceProjectCreator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package org.freeplane.plugin.workspace.model.project;
-
-import java.io.File;
-import java.net.URI;
-
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.UniqueIDCreator;
-import org.freeplane.features.link.LinkController;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.nodes.ProjectRootNode;
-
-public class DefaultWorkspaceProjectCreator implements IWorkspaceProjectCreater {
-
- public AWorkspaceProject newProject(final String projectID, final URI projectHome) {
-
- return new AWorkspaceProject() {
- private String id = projectID;
- private URI home = projectHome;
-
- @Override
- public String getProjectID() {
- if(this.id == null) {
- this.id = UniqueIDCreator.getCreator().uniqueID();
- }
- return this.id;
- }
-
- @Override
- public URI getProjectHome() {
- return this.home;
- }
-
- @Override
- public String getProjectName() {
- if(getModel().getRoot() == null) {
- return this.getProjectID();
- }
- return getModel().getRoot().getName().trim();
- }
-
- @Override
- public URI getProjectDataPath() {
- return URIUtils.createURI(getProjectHome().toString()+"/_data/"+getProjectID());
- }
-
- public URI getRelativeURI(URI uri) {
- //WORKSPACE - todo: check new implementation
- /* windows paths on different drives are getting a relative version as well
- * -> modify method that builds the relative paths
- *
- */
- try {
- URI relativeUri = LinkController.getController().createRelativeURI(new File(getProjectHome()), new File(uri), LinkController.LINK_RELATIVE_TO_MINDMAP);
- if(Compat.isWindowsOS() && relativeUri.getRawPath().contains(":")) {
- return uri;
- }
- else {
- return new URI(WorkspaceController.PROJECT_RESOURCE_URL_PROTOCOL + "://"+ getProjectID() +"/"+relativeUri.getRawPath());
- }
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- return null;
- }
-
- @Override
- public ProjectVersion getVersion() {
- String version = null;
- if(getModel().getRoot() != null) {
- version = ((ProjectRootNode)getModel().getRoot()).getVersion();
- }
-
- if(version == null) {
- version = "freeplane 1.0";
- }
-
- return new ProjectVersion(version);
- }
- };
- }
-
-}
\ No newline at end of file
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IProjectModelListener.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IProjectModelListener.java
deleted file mode 100644
index 699af99..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IProjectModelListener.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.freeplane.plugin.workspace.model.project;
-
-import java.util.EventListener;
-
-import org.freeplane.plugin.workspace.model.WorkspaceModelEvent;
-
-
-public interface IProjectModelListener extends EventListener {
-
- public void treeNodesChanged(WorkspaceModelEvent event);
-
- public void treeNodesInserted(WorkspaceModelEvent event);
-
- public void treeNodesRemoved(WorkspaceModelEvent event);
-
- public void treeStructureChanged(WorkspaceModelEvent event);
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IProjectSelectionListener.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IProjectSelectionListener.java
deleted file mode 100644
index 9aa4f66..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IProjectSelectionListener.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.freeplane.plugin.workspace.model.project;
-
-public interface IProjectSelectionListener {
- public void selectionChanged(ProjectSelectionEvent event);
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IWorkspaceProjectCreater.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IWorkspaceProjectCreater.java
deleted file mode 100644
index 4d3af55..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IWorkspaceProjectCreater.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.freeplane.plugin.workspace.model.project;
-
-import java.net.URI;
-
-public interface IWorkspaceProjectCreater {
- AWorkspaceProject newProject(String projectID, URI projectHome);
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IWorkspaceProjectExtension.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IWorkspaceProjectExtension.java
deleted file mode 100644
index 466c3f1..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/IWorkspaceProjectExtension.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.freeplane.plugin.workspace.model.project;
-
-public interface IWorkspaceProjectExtension {
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectLoader.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectLoader.java
deleted file mode 100644
index e5c0636..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectLoader.java
+++ /dev/null
@@ -1,243 +0,0 @@
-package org.freeplane.plugin.workspace.model.project;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Writer;
-import java.net.MalformedURLException;
-import java.net.URI;
-
-import org.apache.commons.io.IOExceptionWithCause;
-import org.freeplane.core.io.ReadManager;
-import org.freeplane.core.io.WriteManager;
-import org.freeplane.core.io.xml.TreeXmlReader;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.n3.nanoxml.XMLException;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.creator.ActionCreator;
-import org.freeplane.plugin.workspace.creator.FolderCreator;
-import org.freeplane.plugin.workspace.creator.FolderTypePhysicalCreator;
-import org.freeplane.plugin.workspace.creator.FolderTypeVirtualCreator;
-import org.freeplane.plugin.workspace.creator.LinkCreator;
-import org.freeplane.plugin.workspace.creator.LinkTypeFileCreator;
-import org.freeplane.plugin.workspace.creator.ProjectRootCreator;
-import org.freeplane.plugin.workspace.io.IProjectSettingsIOHandler;
-import org.freeplane.plugin.workspace.io.xml.ProjectNodeWriter;
-import org.freeplane.plugin.workspace.io.xml.ProjectSettingsWriter;
-import org.freeplane.plugin.workspace.model.AWorkspaceNodeCreator;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.IResultProcessor;
-import org.freeplane.plugin.workspace.nodes.ProjectRootNode;
-
-public class ProjectLoader implements IProjectSettingsIOHandler {
- private final ReadManager readManager;
- private final WriteManager writeManager;
-
- public final static int WSNODE_FOLDER = 1;
- public final static int WSNODE_LINK = 2;
- public final static int WSNODE_ACTION = 4;
-
- private FolderCreator folderCreator = null;
- private LinkCreator linkCreator = null;
- private ActionCreator actionCreator = null;
- private ProjectRootCreator projectRootCreator = null;
-
- private ProjectSettingsWriter projectWriter;
- private IResultProcessor resultProcessor;
-
- public ProjectLoader() {
- this.readManager = new ReadManager();
- this.writeManager = new WriteManager();
- this.projectWriter = new ProjectSettingsWriter(writeManager);
-
- initReadManager();
- initWriteManager();
- }
-
- private void initReadManager() {
- readManager.addElementHandler("workspace", getProjectRootCreator());
- readManager.addElementHandler("project", getProjectRootCreator());
- readManager.addElementHandler("folder", getFolderCreator());
- readManager.addElementHandler("link", getLinkCreator());
- readManager.addElementHandler("action", getActionCreator());
-
- registerTypeCreator(ProjectLoader.WSNODE_FOLDER, "virtual", new FolderTypeVirtualCreator());
- registerTypeCreator(ProjectLoader.WSNODE_FOLDER, "physical", new FolderTypePhysicalCreator());
- registerTypeCreator(ProjectLoader.WSNODE_LINK, "file", new LinkTypeFileCreator());
- }
-
- private void initWriteManager() {
- ProjectNodeWriter writer = new ProjectNodeWriter();
- writeManager.addElementWriter("project", writer);
- writeManager.addAttributeWriter("project", writer);
-
- writeManager.addElementWriter("folder", writer);
- writeManager.addAttributeWriter("folder", writer);
-
- writeManager.addElementWriter("link", writer);
- writeManager.addAttributeWriter("link", writer);
-
- writeManager.addElementWriter("action", writer);
- writeManager.addAttributeWriter("action", writer);
- }
-
- protected ProjectRootCreator getProjectRootCreator() {
- if (this.projectRootCreator == null) {
- this.projectRootCreator = new ProjectRootCreator();
- this.projectRootCreator.setResultProcessor(getDefaultResultProcessor());
- }
- return this.projectRootCreator;
- }
-
- private FolderCreator getFolderCreator() {
- if (this.folderCreator == null) {
- this.folderCreator = new FolderCreator();
- this.folderCreator.setResultProcessor(getDefaultResultProcessor());
- }
- return this.folderCreator;
- }
-
- private ActionCreator getActionCreator() {
- if (this.actionCreator == null) {
- this.actionCreator = new ActionCreator();
- this.actionCreator.setResultProcessor(getDefaultResultProcessor());
- }
- return this.actionCreator;
- }
-
- private LinkCreator getLinkCreator() {
- if (this.linkCreator == null) {
- this.linkCreator = new LinkCreator();
- this.linkCreator.setResultProcessor(getDefaultResultProcessor());
- }
- return this.linkCreator;
- }
-
- public void registerTypeCreator(final int nodeType, final String typeName, final AWorkspaceNodeCreator creator) {
- if (typeName == null || typeName.trim().length() <= 0)
- return;
- switch (nodeType) {
- case WSNODE_FOLDER: {
- getFolderCreator().addTypeCreator(typeName, creator);
- break;
- }
- case WSNODE_LINK: {
- getLinkCreator().addTypeCreator(typeName, creator);
- break;
- }
- case WSNODE_ACTION: {
- getActionCreator().addTypeCreator(typeName, creator);
- break;
- }
- default: {
- throw new IllegalArgumentException("not allowed argument for nodeType. Use only WorkspaceConfiguration.WSNODE_ACTION, WorkspaceConfiguration.WSNODE_FOLDER or WorkspaceConfiguration.WSNODE_LINK.");
- }
- }
- if(creator.getResultProcessor() == null) {
- creator.setResultProcessor(getDefaultResultProcessor());
- }
-
- }
-
- protected void load(final URI xmlFile) throws MalformedURLException, XMLException, IOException {
- final TreeXmlReader reader = new TreeXmlReader(readManager);
- reader.load(new InputStreamReader(new BufferedInputStream(xmlFile.toURL().openStream())));
- }
-
- public synchronized LOAD_RETURN_TYPE loadProject(AWorkspaceProject project) throws IOException {
- try {
- File projectSettings = new File(URIUtils.getAbsoluteFile(project.getProjectDataPath()),"settings.xml");
- if(projectSettings.exists()) {
- getDefaultResultProcessor().setProject(project);
- this.load(projectSettings.toURI());
- return LOAD_RETURN_TYPE.EXISTING_PROJECT;
- }
- else {
- createDefaultProject(project);
- return LOAD_RETURN_TYPE.NEW_PROJECT;
- }
- }
- catch (Exception e) {
- throw new IOExceptionWithCause(e);
- }
- }
-
- private void createDefaultProject(AWorkspaceProject project) {
- ProjectRootNode root = new ProjectRootNode();
- root.setProjectID(project.getProjectID());
- root.setModel(project.getModel());
- root.setName(URIUtils.getAbsoluteFile(project.getProjectHome()).getName());
- project.getModel().setRoot(root);
- // create and load all default nodes
- root.initiateMyFile(project);
- root.refresh();
- }
-
- public IResultProcessor getDefaultResultProcessor() {
- if(this.resultProcessor == null) {
- this.resultProcessor = new DefaultResultProcessor();
- }
- return this.resultProcessor;
- }
-
- private void storeProject(Writer writer, AWorkspaceProject project) throws IOException {
- this.projectWriter.storeProject(writer, project);
- }
-
- public void storeProject(AWorkspaceProject project) throws IOException {
- File outFile = URIUtils.getAbsoluteFile(project.getProjectDataPath());
- outFile = new File(outFile, "settings.xml");
- if(!outFile.exists()) {
- outFile.getParentFile().mkdirs();
- outFile.createNewFile();
- }
- Writer writer = new FileWriter(outFile);
- storeProject(writer, project);
- }
-
- protected ReadManager getReadManager() {
- return readManager;
- }
-
- private class DefaultResultProcessor implements IResultProcessor {
-
- private AWorkspaceProject project;
-
- public AWorkspaceProject getProject() {
- return project;
- }
-
- public void setProject(AWorkspaceProject project) {
- this.project = project;
- }
-
- public void process(AWorkspaceTreeNode parent, AWorkspaceTreeNode node) {
- if(getProject() == null) {
- LogUtils.warn("Missing project container! cannot add node to a model.");
- return;
- }
- if(node instanceof ProjectRootNode) {
- getProject().getModel().setRoot(node);
- if(((ProjectRootNode) node).getProjectID() == null) {
- ((ProjectRootNode) node).setProjectID(getProject().getProjectID());
- }
- ((ProjectRootNode) node).initiateMyFile(getProject());
- }
- else {
- if(parent == null) {
- if (!getProject().getModel().containsNode(node.getKey())) {
- getProject().getModel().addNodeTo(node, (AWorkspaceTreeNode) parent);
- }
- }
- else {
- if (!parent.getModel().containsNode(node.getKey())) {
- parent.getModel().addNodeTo(node, (AWorkspaceTreeNode) parent);
- }
- }
- }
- }
-
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectModel.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectModel.java
deleted file mode 100644
index b4cb389..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectModel.java
+++ /dev/null
@@ -1,561 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 03.11.2011
- */
-package org.freeplane.plugin.workspace.model.project;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-import javax.swing.event.EventListenerList;
-import javax.swing.tree.TreeNode;
-import javax.swing.tree.TreePath;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.WorkspaceModelEvent;
-import org.freeplane.plugin.workspace.model.WorkspaceModelEvent.WorkspaceModelEventType;
-import org.freeplane.plugin.workspace.model.WorkspaceModelException;
-import org.freeplane.plugin.workspace.model.WorkspaceTreeModel;
-import org.freeplane.plugin.workspace.nodes.AFolderNode;
-import org.freeplane.plugin.workspace.nodes.ALinkNode;
-import org.freeplane.plugin.workspace.nodes.DefaultFileNode;
-import org.freeplane.plugin.workspace.nodes.FolderFileNode;
-
-public class ProjectModel implements WorkspaceTreeModel {
-
- private AWorkspaceTreeNode root = null;
- private final Map<String, AWorkspaceTreeNode> hashStringKeyIndex = new HashMap<String, AWorkspaceTreeNode>();
- protected EventListenerList listenerList = new EventListenerList();
- private final AWorkspaceProject PROJECT;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public ProjectModel(AWorkspaceProject project) {
- this.PROJECT = project;
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public AWorkspaceProject getProject() {
- return this.PROJECT;
- }
-
- public IProjectModelListener[] getTreeModelListeners() {
- return (IProjectModelListener[]) listenerList.getListeners(IProjectModelListener.class);
- }
-
- protected void fireTreeNodesChanged(Object source, TreePath path, int[] childIndices, Object[] children) {
- // Guaranteed to return a non-null array
- Object[] listeners = listenerList.getListenerList();
- WorkspaceModelEvent e = null;
- // Process the listeners last to first, notifying
- // those that are interested in this event
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IProjectModelListener.class) {
- // Lazily create the event:
- if (e == null) e = new WorkspaceModelEvent(getProject(), source, path, childIndices, children);
- ((IProjectModelListener) listeners[i + 1]).treeNodesChanged(e);
- }
- }
- }
-
- protected void fireTreeNodeChanged(Object source, TreePath path, int childIndex, Object children, Object oldValue, Object newValue) {
- // Guaranteed to return a non-null array
- Object[] listeners = listenerList.getListenerList();
- WorkspaceModelEvent e = new WorkspaceModelEvent(getProject(), source, path, WorkspaceModelEventType.DEFAULT, oldValue, newValue);
- // Process the listeners last to first, notifying
- // those that are interested in this event
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IProjectModelListener.class) {
- ((IProjectModelListener) listeners[i + 1]).treeNodesChanged(e);
- }
- }
- }
-
- protected void fireTreeNodesInserted(Object source, TreePath path, int[] childIndices, Object[] children) {
- // Guaranteed to return a non-null array
- Object[] listeners = listenerList.getListenerList();
- WorkspaceModelEvent e = null;
- // Process the listeners last to first, notifying
- // those that are interested in this event
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IProjectModelListener.class) {
- // Lazily create the event:
- if (e == null) e = new WorkspaceModelEvent(getProject(), source, path, childIndices, children);
- ((IProjectModelListener) listeners[i + 1]).treeNodesInserted(e);
- }
- }
- }
-
- protected void fireTreeNodesRemoved(Object source, TreePath path, int[] childIndices, Object[] children) {
- // Guaranteed to return a non-null array
- Object[] listeners = listenerList.getListenerList();
- WorkspaceModelEvent e = null;
- // Process the listeners last to first, notifying
- // those that are interested in this event
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IProjectModelListener.class) {
- // Lazily create the event:
- if (e == null) e = new WorkspaceModelEvent(getProject(), source, path, childIndices, children);
- ((IProjectModelListener) listeners[i + 1]).treeNodesRemoved(e);
- }
- }
- }
-
- protected void fireTreeNodesRemoved(Object source, TreePath path, Object from, Object to) {
- // Guaranteed to return a non-null array
- Object[] listeners = listenerList.getListenerList();
- WorkspaceModelEvent e = null;
- // Process the listeners last to first, notifying
- // those that are interested in this event
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IProjectModelListener.class) {
- // Lazily create the event:
- if (e == null) e = new WorkspaceModelEvent(getProject(), source, path, WorkspaceModelEventType.DELETED, from, to);
- ((IProjectModelListener) listeners[i + 1]).treeNodesRemoved(e);
- }
- }
- }
-
- protected void fireTreeStructureChanged(Object source, TreePath path, int[] childIndices, Object[] children) {
- // Guaranteed to return a non-null array
- Object[] listeners = listenerList.getListenerList();
- WorkspaceModelEvent e = null;
- // Process the listeners last to first, notifying
- // those that are interested in this event
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IProjectModelListener.class) {
- // Lazily create the event:
- if (e == null) e = new WorkspaceModelEvent(getProject(), source, path, childIndices, children);
- ((IProjectModelListener) listeners[i + 1]).treeStructureChanged(e);
- }
- }
- }
-
- protected void fireTreeStructureChanged(Object source, TreePath path) {
- // Guaranteed to return a non-null array
- Object[] listeners = listenerList.getListenerList();
- WorkspaceModelEvent e = null;
- // Process the listeners last to first, notifying
- // those that are interested in this event
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IProjectModelListener.class) {
- // Lazily create the event:
- if (e == null) e = new WorkspaceModelEvent(getProject(), source, path);
- ((IProjectModelListener) listeners[i + 1]).treeStructureChanged(e);
- }
- }
- }
-
- protected void fireTreeStructureMoved(Object source, TreePath path, Object from, Object to) {
- // Guaranteed to return a non-null array
- Object[] listeners = listenerList.getListenerList();
- WorkspaceModelEvent e = null;
- // Process the listeners last to first, notifying
- // those that are interested in this event
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IProjectModelListener.class) {
- // Lazily create the event:
- if (e == null) e = new WorkspaceModelEvent(getProject(), source, path, WorkspaceModelEventType.MOVED, from, to);
- ((IProjectModelListener) listeners[i + 1]).treeStructureChanged(e);
- }
- }
- }
-
- protected void fireTreeNodeRenamed(Object source, TreePath path, Object from, Object to) {
- // Guaranteed to return a non-null array
- Object[] listeners = listenerList.getListenerList();
- WorkspaceModelEvent e = null;
- // Process the listeners last to first, notifying
- // those that are interested in this event
- for (int i = listeners.length - 2; i >= 0; i -= 2) {
- if (listeners[i] == IProjectModelListener.class) {
- // Lazily create the event:
- if (e == null) e = new WorkspaceModelEvent(getProject(), source, path, WorkspaceModelEventType.RENAMED, from, to);
- ((IProjectModelListener) listeners[i + 1]).treeNodesChanged(e);
- }
- }
- }
-
- public void reload(AWorkspaceTreeNode node) {
- if (node != null) {
- fireTreeStructureChanged(this, node.getTreePath(), null, null);
- }
- }
-
- public void reload() {
- reload(root);
- }
-
- public void nodeChanged(AWorkspaceTreeNode node) {
- if (listenerList != null && node != null) {
- AWorkspaceTreeNode parent = node.getParent();
-
- if (parent != null) {
- int anIndex = parent.getIndex(node);
- if (anIndex != -1) {
- int[] cIndexs = new int[1];
-
- cIndexs[0] = anIndex;
- nodesChanged(parent, cIndexs);
- }
- }
- else if (node == getRoot()) {
- nodesChanged(node, null);
- }
- }
- }
-
- public void nodeChanged(AWorkspaceTreeNode node, Object oldValue, Object newValue) {
- fireTreeNodeChanged(this, node.getTreePath(), node.getParent().getChildIndex(node), node, oldValue, newValue);
- }
-
- public void nodeMoved(AWorkspaceTreeNode node, Object from, Object to) {
- fireTreeStructureMoved(this, node.getTreePath(), from, to);
- }
-
- public void nodesWereInserted(AWorkspaceTreeNode node, int[] childIndices) {
- if (listenerList != null && node != null && childIndices != null && childIndices.length > 0) {
- int cCount = childIndices.length;
- Object[] newChildren = new Object[cCount];
-
- for (int counter = 0; counter < cCount; counter++)
- newChildren[counter] = node.getChildAt(childIndices[counter]);
- fireTreeNodesInserted(this, node.getTreePath(), childIndices, newChildren);
- }
- }
-
- public void nodesWereRemoved(AWorkspaceTreeNode node, int[] childIndices, Object[] removedChildren) {
- if (node != null && childIndices != null) {
- fireTreeNodesRemoved(this, node.getTreePath(), childIndices, removedChildren);
- }
- }
-
- public void nodesChanged(AWorkspaceTreeNode node, int[] childIndices) {
- if (node != null) {
- if (childIndices != null) {
- int cCount = childIndices.length;
-
- if (cCount > 0) {
- Object[] cChildren = new Object[cCount];
-
- for (int counter = 0; counter < cCount; counter++)
- cChildren[counter] = node.getChildAt(childIndices[counter]);
- fireTreeNodesChanged(this, node.getTreePath(), childIndices, cChildren);
- }
- }
- else if (node == getRoot()) {
- fireTreeNodesChanged(this, node.getTreePath(), null, null);
- }
- }
- }
-
- public void nodeStructureChanged(AWorkspaceTreeNode node) {
- if (node != null) {
- fireTreeStructureChanged(this, node.getTreePath(), null, null);
- }
- }
-
- /**
- * @param key
- * @return
- */
- public boolean containsNode(String key) {
- return this.hashStringKeyIndex.containsKey(key);
- }
-
- /**
- * @param key
- * @return
- */
- public AWorkspaceTreeNode getNode(String key) {
- return this.hashStringKeyIndex.get(key);
- }
-
- /**
- * @param node
- * @param targetNode
- * @return
- */
- public boolean addNodeTo(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode) {
- return addNodeTo(node, targetNode, true);
- }
-
- /**
- * @param node
- * @param targetNode
- * @param allowRenaming
- * @return
- */
- public boolean addNodeTo(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode, boolean allowRenaming) {
- return insertNodeTo(node, targetNode, targetNode.getChildCount(), allowRenaming);
- }
-
- /**
- * @param node
- * @param targetNode
- * @param allowRenaming
- * @return
- */
- public boolean insertNodeTo(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode, int atPos, boolean allowRenaming) {
- if(node.equals(targetNode)) {
- return false;
- }
- node.setParent(targetNode);
- // DOCEAR - look for problems that may caused by this change!!!
- if (allowRenaming) {
- String newNodeName = node.getName();
- int nameCount = 0;
- while (this.containsNode(node.getKey()) && nameCount++ < 100) {
- node.setName(newNodeName + " (" + nameCount + ")");
- }
- }
- if (this.containsNode(node.getKey())) {
- return false;
- }
-
- targetNode.insertChildNode(node, atPos);
- nodesWereInserted(targetNode, new int[] { atPos });
- addToIndexRecursively(node, targetNode);
-
- return true;
- }
-
- private void addToIndexRecursively(AWorkspaceTreeNode node, AWorkspaceTreeNode targetNode) {
- this.hashStringKeyIndex.put(node.getKey(), node);
- if (node.getChildCount() > 0) {
- int[] indices = new int[node.getChildCount()];
- for (int i = 0; i < node.getChildCount(); i++) {
- AWorkspaceTreeNode childNode = node.getChildAt(i);
- addToIndexRecursively(childNode, node);
- indices[i] = targetNode.getChildCount() - 1;
- }
- nodesWereInserted(targetNode, indices);
- }
- }
-
- /**
- * @param node
- */
- public void removeAllElements(AWorkspaceTreeNode node) {
- Enumeration<AWorkspaceTreeNode> children = node.children();
- AWorkspaceTreeNode child = null;
- while (children.hasMoreElements()) {
- child = children.nextElement();
- this.hashStringKeyIndex.remove(child.getKey());
- child.disassociateReferences();
- fireTreeNodesRemoved(this, node.getTreePath(), null, new Object[] { child });
- }
- node.removeAllChildren();
-
- }
-
- /**
- * @param node
- */
- public void removeNodeFromParent(AWorkspaceTreeNode node) {
- this.hashStringKeyIndex.remove(node.getKey());
- AWorkspaceTreeNode parent = node.getParent();
- parent.removeChild(node);
- node.disassociateReferences();
- fireTreeNodesRemoved(this, parent.getTreePath(), null, new Object[] { node });
- }
-
- /**
- * @param node
- */
- public void cutNodeFromParent(AWorkspaceTreeNode node) {
- AWorkspaceTreeNode parent = node.getParent();
- removeFromIndexRecursively(node);
- parent.removeChild(node);
- fireTreeNodesRemoved(this, parent.getTreePath(), null, new Object[] { node });
- }
-
- /**
- * @param node
- */
- private void removeFromIndexRecursively(AWorkspaceTreeNode node) {
- List<AWorkspaceTreeNode> removes = new ArrayList<AWorkspaceTreeNode>();
- this.hashStringKeyIndex.remove(node.getKey());
- if (node.getChildCount() > 0) {
- int[] indices = new int[node.getChildCount()];
- for (int i = 0; i < node.getChildCount(); i++) {
- AWorkspaceTreeNode childNode = node.getChildAt(i);
- removeFromIndexRecursively(childNode);
- removes.add(childNode);
- indices[i] = i;
- }
- fireTreeNodesRemoved(this, node.getTreePath(), indices, removes.toArray());
- }
- }
-
- /**
- * @param node
- */
- private void removeIndexOnlyRecursively(AWorkspaceTreeNode node) {
- this.hashStringKeyIndex.remove(node.getKey());
- if (node.getChildCount() > 0) {
- for (int i = 0; i < node.getChildCount(); i++) {
- AWorkspaceTreeNode childNode = node.getChildAt(i);
- removeIndexOnlyRecursively(childNode);
- }
- }
- }
-
- private void addIndexOnlyRecursively(AWorkspaceTreeNode node) {
- this.hashStringKeyIndex.put(node.getKey(), node);
- if (node.getChildCount() > 0) {
- for (int i = 0; i < node.getChildCount(); i++) {
- AWorkspaceTreeNode childNode = node.getChildAt(i);
- addIndexOnlyRecursively(childNode);
- }
- }
- }
-
- public void changeNodeName(AWorkspaceTreeNode node, String newName) throws WorkspaceModelException {
- String oldName = node.getName();
- node.setName(newName);
- if (this.hashStringKeyIndex.containsKey(node.getKey())) {
- node.setName(oldName);
- throw new WorkspaceModelException("A Node with the name '" + newName + "' already exists.");
- }
- node.setName(oldName);
- removeIndexOnlyRecursively(node);
- node.setName(newName);
- addIndexOnlyRecursively(node);
-
- fireTreeNodeRenamed(this, node.getTreePath(), oldName, newName);
- }
-
- /**
- *
- */
- public void resetIndex() {
- this.hashStringKeyIndex.clear();
- }
-
- public List<URI> getAllNodesFiltered(String filter) {
- HashSet<URI> set = new HashSet<URI>();
- Collection<AWorkspaceTreeNode> values = hashStringKeyIndex.values();
- for (AWorkspaceTreeNode node : values) {
-
- if (node instanceof AFolderNode || node instanceof FolderFileNode) {
- continue;
- }
-
- if (node instanceof DefaultFileNode) {
- File file = ((DefaultFileNode) node).getFile();
- if (file.getName().endsWith(filter)) {
- set.add(file.toURI());
- }
- }
- else if (node instanceof ALinkNode) {
- URI uri = ((ALinkNode) node).getLinkURI();
- if (uri.getPath().endsWith(filter)) {
- URI absUri = URIUtils.getAbsoluteURI(uri);
- if(absUri == null) {
- continue;
- }
- set.add(absUri);
- }
- }
- }
- return Arrays.asList(set.toArray(new URI[] {}));
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public AWorkspaceTreeNode getRoot() {
- return root;
- }
-
- public void setRoot(AWorkspaceTreeNode newRoot) {
- AWorkspaceTreeNode oldRoot = this.root;
- this.root = newRoot;
- if(this.root != null) {
- this.root.setModel(this);
- if(oldRoot == null) {
- fireTreeNodesInserted(this, null, new int[]{}, new Object[]{root});
- }
- else {
- fireTreeNodesChanged(this, null, new int[]{}, new Object[]{root});
- }
- }
- else {
- if(oldRoot != null) {
- fireTreeNodesRemoved(this, null, new int[]{}, new Object[]{oldRoot});
- }
- }
-
- }
-
- public Object getChild(Object parent, int index) {
- return ((AWorkspaceTreeNode) parent).getChildAt(index);
- }
-
- public int getChildCount(Object parent) {
- return ((AWorkspaceTreeNode) parent).getChildCount();
- }
-
- public boolean isLeaf(Object node) {
- return ((AWorkspaceTreeNode) node).isLeaf();
- }
-
- public void valueForPathChanged(TreePath path, Object newValue) {
- AWorkspaceTreeNode node = (AWorkspaceTreeNode) path.getLastPathComponent();
- if (node instanceof IWorkspaceNodeActionListener) {
- ((IWorkspaceNodeActionListener) node).handleAction(new WorkspaceActionEvent(node, WorkspaceActionEvent.WSNODE_CHANGED, newValue));
- nodeChanged(node);
- }
- else {
- node.setName(newValue.toString());
- }
- }
-
- public int getIndexOfChild(Object parent, Object child) {
- return ((AWorkspaceTreeNode) parent).getIndex((TreeNode) child);
- }
-
- public void addProjectModelListener(IProjectModelListener listener) {
- if(listener == null) {
- return;
- }
- listenerList.add(IProjectModelListener.class, listener);
- }
-
- public void removeProjectModelListener(IProjectModelListener listener) {
- if(listener == null) {
- return;
- }
- listenerList.remove(IProjectModelListener.class, listener);
- }
-
- public void requestSave() {
- try {
- WorkspaceController.getCurrentModeExtension().getProjectLoader().storeProject(WorkspaceController.getCurrentModel().getProject(this));
- } catch (IOException e) {
- LogUtils.severe(e);
- }
-
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectSelectionEvent.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectSelectionEvent.java
deleted file mode 100644
index 616d2a5..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectSelectionEvent.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.freeplane.plugin.workspace.model.project;
-
-import java.util.EventObject;
-
-public class ProjectSelectionEvent extends EventObject {
-
- private static final long serialVersionUID = 1L;
- private final AWorkspaceProject selectProject;
- private final AWorkspaceProject oldProject;
-
- public ProjectSelectionEvent(Object source, AWorkspaceProject selected, AWorkspaceProject old) {
- super(source);
- this.selectProject = selected;
- this.oldProject = old;
- }
-
- public AWorkspaceProject getSelectedProject() {
- return selectProject;
- }
-
- public AWorkspaceProject getPreviousProject() {
- return oldProject;
- }
-
- public String toString() {
- return getClass().getName() + "[source=" + source + ";selected="+ getSelectedProject() +";old="+getPreviousProject()+"]";
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectVersion.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectVersion.java
deleted file mode 100644
index f0aebba..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/model/project/ProjectVersion.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.freeplane.plugin.workspace.model.project;
-
-public class ProjectVersion {
-
- private final String versionString;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public ProjectVersion(String versionString) {
- this.versionString = versionString;
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public String getVersionString() {
- return versionString;
- }
-
- public String toString() {
- return versionString;
- }
-
- @Override
- public boolean equals(Object obj) {
- if(obj instanceof ProjectVersion) {
- return this.getVersionString().equals(((ProjectVersion) obj).getVersionString());
- }
- return super.equals(obj);
- }
-
-
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/AActionNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/AActionNode.java
deleted file mode 100644
index 84a5405..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/AActionNode.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 16.08.2011
- */
-package org.freeplane.plugin.workspace.nodes;
-
-import java.awt.Component;
-import java.awt.event.ActionEvent;
-
-import org.freeplane.core.ui.AFreeplaneAction;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.plugin.workspace.dnd.IWorkspaceTransferableCreator;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.io.annotation.ExportAsAttribute;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-
-/**
- *
- */
-public abstract class AActionNode extends AWorkspaceTreeNode implements IWorkspaceNodeActionListener, IWorkspaceTransferableCreator {
-
- private static final long serialVersionUID = 1L;
- public static final String NODE_TYPE = "action";
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /**
- * @param type
- */
- public AActionNode(String type) {
- super(type);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public final WorkspaceTransferable getTransferable() {
- return null;
- }
-
- @ExportAsAttribute(name="system")
- public final boolean isSystem() {
- return true;
- }
-
- public final void setSystem(boolean system) {
- super.setSystem(true);
- }
-
- public final void setTransferable(boolean enabled) {
- super.setTransferable(false);
- }
-
- @ExportAsAttribute(name="transferable",defaultBool=true)
- public final boolean isTransferable() {
- return false;
- }
-
- public void handleAction(WorkspaceActionEvent event) {
- if(event.getType() == WorkspaceActionEvent.WSNODE_OPEN_DOCUMENT) {
- AFreeplaneAction action = Controller.getCurrentController().getAction(getType());
- if(action == null) {
- LogUtils.severe("No action '"+getType()+"' found");
- return;
- }
- action.actionPerformed(new ActionEvent(this, 0, "execute"));
- }
- else if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
- showPopup((Component) event.getBaggage(), event.getX(), event.getY());
- }
- }
-
- public boolean getAllowsChildren() {
- return false;
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public String getTagName() {
- return "action";
- }
-
- @Override
- public void initializePopup() {
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/AFolderNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/AFolderNode.java
deleted file mode 100644
index 01b974e..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/AFolderNode.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 16.08.2011
- */
-package org.freeplane.plugin.workspace.nodes;
-
-import java.net.URI;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-
-
-/**
- *
- */
-public abstract class AFolderNode extends AWorkspaceTreeNode {
-
- private static final long serialVersionUID = 1L;
- final public static String FOLDER_TYPE_PHYSICAL = "physical";
- final public static String FOLDER_TYPE_VIRTUAL = "virtual";
-
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /**
- * @param type
- */
- public AFolderNode(String type) {
- super(type);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public abstract URI getPath();
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public boolean isLeaf() {
- return false;
- }
-
- public String getTagName() {
- return "folder";
- }
-
- public boolean getAllowsChildren() {
- return true;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/ALinkNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/ALinkNode.java
deleted file mode 100644
index bc8a0f7..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/ALinkNode.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 16.08.2011
- */
-package org.freeplane.plugin.workspace.nodes;
-
-import java.net.URI;
-
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-
-/**
- *
- */
-public abstract class ALinkNode extends AWorkspaceTreeNode {
-
- private static final long serialVersionUID = 1L;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public static final String LINK_TYPE_FILE = "file";
-
- /**
- * @param type
- */
- public ALinkNode(String type) {
- super(type);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public abstract URI getLinkURI();
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public final String getTagName() {
- return "link";
- }
-
- public boolean getAllowsChildren() {
- return false;
- }
-
- @Override
- public void initializePopup() {
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/DefaultFileNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/DefaultFileNode.java
deleted file mode 100644
index cce0e19..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/DefaultFileNode.java
+++ /dev/null
@@ -1,363 +0,0 @@
-package org.freeplane.plugin.workspace.nodes;
-
-import java.awt.Component;
-import java.io.File;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.filechooser.FileSystemView;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import org.freeplane.core.resources.ResourceController;
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mapio.MapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
-import org.freeplane.plugin.workspace.dnd.IWorkspaceTransferableCreator;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.io.annotation.ExportAsAttribute;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.IMutableLinkNode;
-
-/**
- *
- */
-public class DefaultFileNode extends AWorkspaceTreeNode implements IWorkspaceNodeActionListener, IWorkspaceTransferableCreator, IFileSystemRepresentation, IMutableLinkNode {
- private static final Icon DEFAULT_ICON = new ImageIcon(AWorkspaceTreeNode.class.getResource("/images/16x16/text-x-preview.png"));
- private static final Icon NOT_EXISTING = new ImageIcon(AWorkspaceTreeNode.class.getResource("/images/16x16/cross.png"));
- private static Icon APPLICATION_ICON = new ImageIcon(ResourceController.class.getResource("/images/Freeplane_frame_icon.png"));
- //new ImageIcon(ResourceController.class.getResource("/images/docear16.png"));
-
-
- private static final long serialVersionUID = 1L;
-
- private static WorkspacePopupMenu popupMenu = null;
-
-
- private File file;
- private boolean orderDescending;
- private Icon icon = null;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /**
- * @param name
- */
- public DefaultFileNode(final String name, final File file) {
- super("physical_file");
- this.setName(name);
- this.file = file;
- icon = WorkspaceController.getCurrentModeExtension().getView().getNodeTypeIconManager().getIconForNode(this);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public boolean rename(final String name) {
- File newFile = new File(getFile().getParentFile(), name);
- if(getFile().renameTo(newFile)) {
- this.file = newFile;
- icon = WorkspaceController.getCurrentModeExtension().getView().getNodeTypeIconManager().getIconForNode(this);
- return true;
- }
- return false;
- }
-
- public void delete() {
- getFile().delete();
- }
-
- public void relocateFile(final File parentFolder) {
- File newFile = new File(parentFolder, getName());
- if(newFile.exists()) {
- this.file = newFile;
- }
- }
-
-// private void copyFileContent(File source, File destination) {
-// try {
-// InputStream in = new DataInputStream(new FileInputStream(source));
-// DataOutputStream out = new DataOutputStream(new FileOutputStream(destination));
-// byte[] buffer = new byte[1024];
-// int len = in.read(buffer);
-// while (len != -1) {
-// out.write(buffer, 0, len);
-// len = in.read(buffer);
-// }
-// in.close();
-// out.close();
-// }
-// catch (FileNotFoundException e) {
-// e.printStackTrace();
-// }
-// catch (IOException e) {
-// e.printStackTrace();
-// }
-// }
-//
-// protected void copyFileTo(File file, File parentFolder) throws IOException {
-// if(parentFolder.isDirectory()) {
-// File target = new File(parentFolder,file.getName());
-// if(file.isDirectory()) {
-// if(target.mkdir()) {
-// for(File child : file.listFiles()) {
-// copyFileTo(child, target);
-// }
-// }
-// else {
-// throw new IOException("Could not create folder: "+target);
-// }
-// }
-// else {
-// if(target.createNewFile()) {
-// copyFileContent(file, target);
-// }
-// else {
-// throw new IOException("Could not create file: "+target);
-// }
-// }
-// }
-// else {
-// throw new IOException("File "+parentFolder+" is no folder");
-// }
-// }
-//
-// /**
-// * @param file
-// * @throws IOException
-// */
-// public void copyTo(File destDirectory) throws IOException {
-// assert(destDirectory != null);
-// if(getFile().equals(destDirectory)) {
-// return;
-// }
-//
-// if(destDirectory.isDirectory()) {
-// try {
-// if(getFile().isDirectory()) {
-// FileUtils.copyDirectoryToDirectory(getFile(), destDirectory);
-// }
-// else {
-// FileUtils.copyFileToDirectory(getFile(), destDirectory);
-// }
-// }
-// catch (FileExistsException e) {
-// LogUtils.info("Exeption in org.freeplane.plugin.workspace.nodes.DefaultFileNode.copyTo(destDirectory): "+e.getMessage());
-// }
-// }
-// else {
-// copyTo(destDirectory.getParentFile());
-// }
-// }
-//
-// public void moveTo(File destDirectory) throws IOException {
-// assert(destDirectory != null);
-// if(getFile().equals(destDirectory)) {
-// return;
-// }
-// if(destDirectory.isDirectory()) {
-// try {
-// if(getFile().isDirectory()) {
-// FileUtils.moveDirectoryToDirectory(getFile(), destDirectory, true);
-// }
-// else {
-// FileUtils.moveFileToDirectory(getFile(), destDirectory, true);
-// }
-// }
-// catch (FileExistsException e) {
-// LogUtils.info("Exeption in org.freeplane.plugin.workspace.nodes.DefaultFileNode.moveTo(destDirectory)"+e.getMessage());
-// }
-// }
-// else {
-// moveTo(destDirectory.getParentFile());
-// }
-// }
-
- public boolean isEditable() {
- return false;
- }
-
- public boolean setIcons(DefaultTreeCellRenderer renderer) {
- if(!getFile().exists()) {
- renderer.setLeafIcon(NOT_EXISTING);
- renderer.setOpenIcon(NOT_EXISTING);
- renderer.setClosedIcon(NOT_EXISTING);
- return true;
- }
-
- if(icon == null) {
- icon = FileSystemView.getFileSystemView().getSystemIcon(getFile());
- renderer.setLeafIcon(icon);
- return true;
- }
- // the next steps should not get reached
- if(icon == null) {
- renderer.setLeafIcon(DEFAULT_ICON);
- } else {
- renderer.setLeafIcon(icon);
- }
- return true;
- }
-
- protected AWorkspaceTreeNode clone(DefaultFileNode node) {
- return super.clone(node);
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public File getFile() {
- return this.file;
- }
-
- public void handleAction(WorkspaceActionEvent event) {
- if(event.getType() == WorkspaceActionEvent.WSNODE_CHANGED) {
- if(changeName(event.getBaggage().toString(), true)) {
- event.consume();
- }
- }
- else if(event.getType() == WorkspaceActionEvent.WSNODE_OPEN_DOCUMENT) {
-
- if(getFile() != null) {
-
- if(!file.exists()) {
-// WorkspaceUtils.showFileNotFoundMessage(file);
- return;
- }
- if(file.getName().toLowerCase().endsWith(".mm") || file.getName().toLowerCase().endsWith(".dcr")) {
- try {
- final URL mapUrl = Compat.fileToUrl(getFile());
- final MapIO mapIO = (MapIO) Controller.getCurrentModeController().getExtension(MapIO.class);
- mapIO.newMap(mapUrl);
-// Controller.getCurrentModeController().getMapController().newMap(mapUrl);
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
- else {
- try {
- Controller.getCurrentController().getViewController().openDocument(Compat.fileToUrl(getFile()));
- }
- catch (Exception e) {
- LogUtils.warn("could not open document ("+getFile()+")", e);
- }
- }
- }
- }
- else if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
- showPopup((Component) event.getBaggage(), event.getX(), event.getY());
- }
- }
-
- public final String getTagName() {
- return null;
- }
-
- public WorkspaceTransferable getTransferable() {
- WorkspaceTransferable transferable = new WorkspaceTransferable();
- try {
- URI uri = URIUtils.getAbsoluteURI(getFile().toURI());
- transferable.addData(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR, uri.toString());
- List<File> fileList = new Vector<File>();
- fileList.add(new File(uri));
- transferable.addData(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR, fileList);
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- if(!this.isSystem()) {
- List<AWorkspaceTreeNode> objectList = new ArrayList<AWorkspaceTreeNode>();
- objectList.add(this);
- transferable.addData(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR, objectList);
- }
- return transferable;
- }
-
- public void initializePopup() {
- if (popupMenu == null) {
- popupMenu = new WorkspacePopupMenu();
- WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
- "workspace.action.node.cut",
- "workspace.action.node.copy",
- "workspace.action.node.paste",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.rename",
- "workspace.action.file.delete",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.refresh"
- });
- }
- }
-
- public AWorkspaceTreeNode clone() {
- DefaultFileNode node = new DefaultFileNode(getName(), getFile());
- return clone(node);
- }
-
- public WorkspacePopupMenu getContextMenu() {
- if (popupMenu == null) {
- initializePopup();
- }
- return popupMenu;
- }
-
- public boolean changeName(String newName, boolean renameLink) {
- String oldName = getName();
- if(rename(newName)) {
- try {
- getModel().changeNodeName(this, newName);
- return true;
- }
- catch(Exception ex) {
- // do nth.
- };
- }
- else {
- LogUtils.warn("cannot rename "+oldName);
- }
- return false;
- }
-
- public void orderDescending(boolean enable) {
- this.orderDescending = enable;
- }
-
- @ExportAsAttribute(name="orderDescending")
- public boolean orderDescending() {
- return orderDescending;
- }
-
- public boolean getAllowsChildren() {
- return false;
- }
-
- public static Icon getApplicationIcon() {
- return APPLICATION_ICON;
- }
-
- public static void setApplicationIcon(Icon icon) {
- if(icon == null) {
- return;
- }
- APPLICATION_ICON = icon;
- }
-
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderFileNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderFileNode.java
deleted file mode 100644
index 8376e60..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderFileNode.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 22.07.2011
- */
-package org.freeplane.plugin.workspace.nodes;
-
-import java.io.File;
-import java.util.Enumeration;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-/**
- *
- */
-public class FolderFileNode extends DefaultFileNode {
- private static final Icon FOLDER_OPEN_ICON = new ImageIcon(DefaultFileNode.class.getResource("/images/16x16/folder-orange_open.png"));
- private static final Icon FOLDER_CLOSED_ICON = new ImageIcon(DefaultFileNode.class.getResource("/images/16x16/folder-orange.png"));
- private static final Icon NOT_EXISTING = new ImageIcon(DefaultFileNode.class.getResource("/images/16x16/folder-orange-missing.png"));
-
- private static final long serialVersionUID = 1L;
-
- private static WorkspacePopupMenu popupMenu = null;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- /**
- * @param name
- * @param file
- */
- public FolderFileNode(String name, File file) {
- super(name, file);
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
- public void delete() {
- delete(getFile());
- }
-
- private void delete(File file) {
- if(file.isDirectory()) {
- for(File child : file.listFiles()) {
- delete(child);
- }
- }
- file.delete();
- }
-
- public boolean setIcons(DefaultTreeCellRenderer renderer) {
- if(getFile() == null || !getFile().exists()) {
- renderer.setLeafIcon(NOT_EXISTING);
- renderer.setOpenIcon(NOT_EXISTING);
- renderer.setClosedIcon(NOT_EXISTING);
- return true;
- }
- renderer.setOpenIcon(FOLDER_OPEN_ICON);
- renderer.setClosedIcon(FOLDER_CLOSED_ICON);
- renderer.setLeafIcon(FOLDER_CLOSED_ICON);
- return true;
- }
-
- public AWorkspaceTreeNode clone() {
- FolderFileNode node = new FolderFileNode(getName(), getFile());
- return clone(node);
- }
-
- public void refresh() {
- try {
- if (getFile().isDirectory()) {
- getModel().removeAllElements(this);
- WorkspaceController.getFileSystemMgr().scanFileSystem(this, getFile());
- getModel().reload(this);
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public void initializePopup() {
- if (popupMenu == null) {
-
- if (popupMenu == null) {
- popupMenu = new WorkspacePopupMenu();
- WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
- WorkspacePopupMenuBuilder.createSubMenu(TextUtils.getRawText("workspace.action.new.label")),
- "workspace.action.node.new.folder",
- "workspace.action.file.new.mindmap",
- WorkspacePopupMenuBuilder.endSubMenu(),
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.open.location",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.cut",
- "workspace.action.node.copy",
- "workspace.action.node.paste",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.rename",
- "workspace.action.file.delete",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.refresh"
- });
- }
- }
- }
-
- public WorkspacePopupMenu getContextMenu() {
- if (popupMenu == null) {
- initializePopup();
- }
- return popupMenu;
- }
-
- public boolean isLeaf() {
- return false;
- }
-
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
- public void handleAction(WorkspaceActionEvent event) {
- if(event.getType() == WorkspaceActionEvent.WSNODE_CHANGED) {
- if(rename(event.getBaggage().toString())) {
- setName(event.getBaggage().toString());
- if(event.getSource() instanceof AWorkspaceTreeNode) {
- Enumeration<AWorkspaceTreeNode> childs = ((AWorkspaceTreeNode)event.getSource()).children();
- while(childs.hasMoreElements()) {
- AWorkspaceTreeNode node = ((AWorkspaceTreeNode) childs.nextElement());
- if(node instanceof DefaultFileNode) {
- ((DefaultFileNode)node).relocateFile(getFile());
- }
- }
- }
- }
- else {
- LogUtils.warn("Could not rename File("+getName()+") to File("+event.getBaggage()+")");
- }
-
- }
- else if(event.getType() == WorkspaceActionEvent.WSNODE_OPEN_DOCUMENT) {
-// try {
-// Controller.getCurrentController().getViewController().openDocument(Compat.fileToUrl(getFile()));
-// event.consume();
-// } catch (Exception e) {
-// LogUtils.warn(e);
-// }
- }
- else {
- super.handleAction(event);
- }
- }
-
- public boolean getAllowsChildren() {
- return true;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderLinkNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderLinkNode.java
deleted file mode 100644
index 4855913..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderLinkNode.java
+++ /dev/null
@@ -1,253 +0,0 @@
-package org.freeplane.plugin.workspace.nodes;
-
-import java.awt.Component;
-import java.io.File;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
-import org.freeplane.plugin.workspace.dnd.IWorkspaceTransferableCreator;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.io.annotation.ExportAsAttribute;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.IMutableLinkNode;
-
-public class FolderLinkNode extends AFolderNode implements IWorkspaceNodeActionListener
- , IWorkspaceTransferableCreator
- , IFileSystemRepresentation
- , IMutableLinkNode {
-
- private static final long serialVersionUID = 1L;
- private static Icon FOLDER_OPEN_ICON = new ImageIcon(FolderLinkNode.class.getResource("/images/16x16/folder-orange_open.png"));
- private static final Icon FOLDER_CLOSED_ICON = new ImageIcon(FolderLinkNode.class.getResource("/images/16x16/folder-orange.png"));
-
- private static WorkspacePopupMenu popupMenu = null;
-
- private URI folderPath;
- private boolean doMonitoring = false;
- private boolean orderDescending = false;
-
- public FolderLinkNode() {
- this(AFolderNode.FOLDER_TYPE_PHYSICAL);
- }
-
- public FolderLinkNode(String id) {
- super(id);
- }
-
- @ExportAsAttribute(name="path")
- public URI getPath() {
- return folderPath;
- }
-
- public void setPath(URI uri) {
- if(isMonitoring()) {
- enableMonitoring(false);
- this.folderPath = uri;
- createIfNeeded(getPath());
- enableMonitoring(true);
- }
- else {
- this.folderPath = uri;
- createIfNeeded(getPath());
- }
- }
-
- private void createIfNeeded(URI uri) {
- File file = URIUtils.getAbsoluteFile(uri);
- if (file != null && !file.exists()) {
- file.mkdirs();
- }
- }
-
- public void initializePopup() {
- if (popupMenu == null) {
-
- if (popupMenu == null) {
- popupMenu = new WorkspacePopupMenu();
- WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
- WorkspacePopupMenuBuilder.createSubMenu(TextUtils.getRawText("workspace.action.new.label")),
- "workspace.action.node.new.folder",
- "workspace.action.file.new.mindmap",
- WorkspacePopupMenuBuilder.endSubMenu(),
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.open.location",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.cut",
- "workspace.action.node.copy",
- "workspace.action.node.paste",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.rename",
- "workspace.action.node.remove",
- "workspace.action.file.delete",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.physical.sort",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.refresh"
- });
- }
- }
- }
-
- public void enableMonitoring(boolean enable) {
- if(getPath() == null) {
- this.doMonitoring = enable;
- }
- else {
- if(enable != this.doMonitoring) {
- this.doMonitoring = enable;
- }
- }
- }
-
- @ExportAsAttribute(name="monitor")
- public boolean isMonitoring() {
- return this.doMonitoring;
- }
-
- public void orderDescending(boolean enable) {
- this.orderDescending = enable;
- }
-
- @ExportAsAttribute(name="orderDescending")
- public boolean orderDescending() {
- return orderDescending;
- }
-
- public void handleAction(WorkspaceActionEvent event) {
- if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
- showPopup( (Component) event.getBaggage(), event.getX(), event.getY());
- event.consume();
- }
- }
-
- public boolean setIcons(DefaultTreeCellRenderer renderer) {
- renderer.setOpenIcon(FOLDER_OPEN_ICON);
- renderer.setClosedIcon(FOLDER_CLOSED_ICON);
- renderer.setLeafIcon(FOLDER_CLOSED_ICON);
- return true;
- }
-
- public String toString() {
- return this.getClass().getSimpleName() + "[id=" + this.getId() + ";name=" + this.getName() + ";path="
- + this.getPath() + "]";
- }
-
- public void refresh() {
- File folder;
- try {
- folder = URIUtils.getAbsoluteFile(getPath());
- if (folder.isDirectory()) {
- getModel().removeAllElements(this);
- WorkspaceController.getFileSystemMgr().scanFileSystem(this, folder);
- getModel().reload(this);
- }
- }
- catch (Exception e) {
- LogUtils.severe(e);
- }
- }
-
- protected AWorkspaceTreeNode clone(FolderLinkNode node) {
- node.setPath(getPath());
- return super.clone(node);
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public WorkspacePopupMenu getContextMenu() {
- if (popupMenu == null) {
- initializePopup();
- }
- return popupMenu;
- }
-
- public AWorkspaceTreeNode clone() {
- FolderLinkNode node = new FolderLinkNode(getType());
- return clone(node);
- }
-
- public WorkspaceTransferable getTransferable() {
- WorkspaceTransferable transferable = new WorkspaceTransferable();
- try {
- URI uri = URIUtils.getAbsoluteURI(getPath());
- transferable.addData(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR, uri.toString());
- List<File> fileList = new Vector<File>();
- fileList.add(new File(uri));
- transferable.addData(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR, fileList);
- if(!this.isSystem()) {
- List<AWorkspaceTreeNode> objectList = new ArrayList<AWorkspaceTreeNode>();
- objectList.add(this);
- transferable.addData(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR, objectList);
- }
- return transferable;
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- return null;
- }
-
- public File getFile() {
- return URIUtils.getAbsoluteFile(this.getPath());
- }
-
- public boolean changeName(String newName, boolean renameLink) {
- assert(newName != null);
- assert(newName.trim().length() > 0);
-
- if(renameLink) {
- File oldFile = URIUtils.getAbsoluteFile(getPath());
- try{
- if(oldFile == null) {
- throw new Exception("failed to resolve the file for"+getName());
- }
- File destFile = new File(oldFile.getParentFile(), newName);
- if(oldFile.exists() && oldFile.renameTo(destFile)) {
- //this.setName(newName);
- try {
- getModel().changeNodeName(this, newName);
- return true;
- }
- catch(Exception ex) {
- destFile.renameTo(oldFile);
- return false;
- }
- }
- else {
- LogUtils.warn("cannot rename "+oldFile.getName());
- }
- }
- catch (Exception e) {
- LogUtils.warn("cannot rename "+oldFile.getName(), e);
- }
- }
- else {
- //this.setName(newName);
- try {
- getModel().changeNodeName(this, newName);
- return true;
- }
- catch(Exception ex) {
- // do nth.
- }
- }
- return false;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderTypeMyFilesNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderTypeMyFilesNode.java
deleted file mode 100644
index d42c35e..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderTypeMyFilesNode.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.freeplane.plugin.workspace.nodes;
-
-import java.awt.Component;
-import java.io.File;
-import java.io.FileFilter;
-import java.net.URI;
-import java.util.Locale;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.io.IFileSystemRepresentation;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-public class FolderTypeMyFilesNode extends AFolderNode implements IWorkspaceNodeActionListener
- , IFileSystemRepresentation {
-
- public static final String TYPE = "myFiles";
- private static final long serialVersionUID = 1L;
- private final AWorkspaceProject project;
- private static WorkspacePopupMenu popupMenu = null;
- private boolean orderDescending = false;
-
- public FolderTypeMyFilesNode(AWorkspaceProject project) {
- super(TYPE);
- this.project = project;
-
- }
-
- public String getName() {
- return TextUtils.getText(FolderTypeMyFilesNode.class.getName().toLowerCase(Locale.ENGLISH)+".name");
- }
-
- @Override
- public URI getPath() {
- return project.getProjectHome();
- }
-
- public AWorkspaceTreeNode clone() {
- return super.clone(new FolderTypeMyFilesNode(project));
- }
-
- public boolean isSystem() {
- return true;
- }
-
- public boolean isTransferable() {
- return false;
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void handleAction(WorkspaceActionEvent event) {
- if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
- showPopup((Component) event.getBaggage(), event.getX(), event.getY());
- }
- }
-
- public void initializePopup() {
- if (popupMenu == null) {
-
- popupMenu = new WorkspacePopupMenu();
- WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
- WorkspacePopupMenuBuilder.createSubMenu(TextUtils.getRawText("workspace.action.new.label")),
- "workspace.action.node.new.folder",
- "workspace.action.file.new.mindmap",
- WorkspacePopupMenuBuilder.endSubMenu(),
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.open.location",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.cut",
- "workspace.action.node.copy",
- "workspace.action.node.paste",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.physical.sort",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.refresh"
- });
- }
-
- }
-
- public WorkspacePopupMenu getContextMenu() {
- if (popupMenu == null) {
- initializePopup();
- }
- return popupMenu;
-}
-
- public void refresh() {
- try {
- File file = URIUtils.getAbsoluteFile(getPath());
- if (file != null) {
- getModel().removeAllElements(this);
- WorkspaceController.getFileSystemMgr().scanFileSystem(this, file, new FileFilter() {
-
- public boolean accept(File pathname) {
- if("_data".equals(pathname.getName())) {
- return false;
- }
- return true;
- }
- });
- getModel().reload(this);
- }
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public final String getTagName() {
- return null;
- }
-
- public File getFile() {
- return URIUtils.getAbsoluteFile(getPath());
- }
-
- public void orderDescending(boolean enable) {
- this.orderDescending = enable;
- }
-
- public boolean orderDescending() {
- return orderDescending;
- }
-
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderVirtualNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderVirtualNode.java
deleted file mode 100644
index ae313d0..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/FolderVirtualNode.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.freeplane.plugin.workspace.nodes;
-
-import java.awt.Component;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
-import org.freeplane.plugin.workspace.dnd.IWorkspaceTransferableCreator;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public class FolderVirtualNode extends AFolderNode implements IWorkspaceNodeActionListener
- , IWorkspaceTransferableCreator {
-
- private static final long serialVersionUID = 1L;
- private static final Icon DEFAULT_ICON = new ImageIcon(AWorkspaceTreeNode.class.getResource("/images/16x16/object-group-2.png"));
-
- private static WorkspacePopupMenu popupMenu = null;
-
- public FolderVirtualNode() {
- super(AFolderNode.FOLDER_TYPE_VIRTUAL);
- }
-
- public FolderVirtualNode(String type) {
- super(type);
- }
-
- public void initializePopup() {
- if (popupMenu == null) {
- popupMenu = new WorkspacePopupMenu();
- WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
- WorkspacePopupMenuBuilder.createSubMenu(TextUtils.getRawText("workspace.action.new.label")),
- "workspace.action.node.new.folder",
- "workspace.action.node.new.link",
- WorkspacePopupMenuBuilder.endSubMenu(),
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.cut",
- "workspace.action.node.copy",
- "workspace.action.node.paste",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.rename",
- "workspace.action.node.remove",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.refresh"
- });
- }
- }
-
- public boolean setIcons(DefaultTreeCellRenderer renderer) {
- renderer.setOpenIcon(DEFAULT_ICON);
- renderer.setClosedIcon(DEFAULT_ICON);
- renderer.setLeafIcon(DEFAULT_ICON);
- return true;
- }
-
- public void handleAction(WorkspaceActionEvent event) {
- if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
- showPopup( (Component) event.getBaggage(), event.getX(), event.getY());
- }
- }
-
-
- public AWorkspaceTreeNode clone() {
- FolderVirtualNode node = new FolderVirtualNode(getType());
- return clone(node);
- }
-
- public WorkspacePopupMenu getContextMenu() {
- if (popupMenu == null) {
- initializePopup();
- }
-
- return popupMenu;
- }
-
- public URI getPath() {
- return null;
- }
-
- public WorkspaceTransferable getTransferable() {
- WorkspaceTransferable transferable = new WorkspaceTransferable();
- try {
- List<AWorkspaceTreeNode> objectList = new ArrayList<AWorkspaceTreeNode>();
- objectList.add(this);
- transferable.addData(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR, objectList);
- return transferable;
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- return null;
- }
-
- public void refresh() {
- getModel().reload(this);
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/LinkTypeFileNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/LinkTypeFileNode.java
deleted file mode 100644
index ecfc255..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/LinkTypeFileNode.java
+++ /dev/null
@@ -1,252 +0,0 @@
-package org.freeplane.plugin.workspace.nodes;
-
-
-import java.awt.Component;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.dnd.DropTargetDropEvent;
-import java.io.File;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Vector;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.filechooser.FileSystemView;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import org.freeplane.core.util.Compat;
-import org.freeplane.core.util.LogUtils;
-import org.freeplane.features.mapio.MapIO;
-import org.freeplane.features.mode.Controller;
-import org.freeplane.features.mode.mindmapmode.MModeController;
-import org.freeplane.plugin.workspace.URIUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.actions.WorkspaceNewMapAction;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
-import org.freeplane.plugin.workspace.dnd.IWorkspaceTransferableCreator;
-import org.freeplane.plugin.workspace.dnd.WorkspaceTransferable;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.io.annotation.ExportAsAttribute;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.IMutableLinkNode;
-
-public class LinkTypeFileNode extends ALinkNode implements IWorkspaceNodeActionListener, IWorkspaceTransferableCreator, IMutableLinkNode {
-
- private static final long serialVersionUID = 1L;
-
- private static final Icon NOT_EXISTING = new ImageIcon(AWorkspaceTreeNode.class.getResource("/images/16x16/cross.png"));
-
- private URI linkPath;
- private static WorkspacePopupMenu popupMenu = null;
- private Icon fileIcon = null;
-
- public LinkTypeFileNode() {
- super(ALinkNode.LINK_TYPE_FILE);
- }
-
- public LinkTypeFileNode(String type) {
- super(type);
- }
-
- public void initializePopup() {
- if (popupMenu == null) {
- popupMenu = new WorkspacePopupMenu();
- WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
- "workspace.action.node.cut",
- "workspace.action.node.copy",
- "workspace.action.node.paste",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.rename",
- "workspace.action.node.remove",
- "workspace.action.file.delete",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.refresh"
- });
- }
- }
-
- @ExportAsAttribute(name="path")
- public URI getLinkURI() {
- return linkPath;
- }
-
- public void setLinkURI(URI linkPath) {
- URI oldUri = this.linkPath;
- this.linkPath = linkPath;
- fileIcon = null;
-
- if(getModel() == null) {
- return;
- }
- getModel().nodeChanged(this, linkPath, oldUri);
- }
-
- public void handleAction(WorkspaceActionEvent event) {
- if(event.getType() == WorkspaceActionEvent.WSNODE_OPEN_DOCUMENT) {
-
- File file = URIUtils.getAbsoluteFile(getLinkURI());
- if(file != null) {
-
- if(file.getName().toLowerCase().endsWith(".mm") || file.getName().toLowerCase().endsWith(".dcr")) {
-
- if(!file.exists() && this.isSystem()){
- if(WorkspaceNewMapAction.createNewMap(getLinkURI(), getName(), true) == null) {
- LogUtils.warn("could not create " + getLinkURI());
- }
- return;
- }
- if(!file.exists() && !this.isSystem()) {
- //WORKSPACE - todo: replace with some kind of view extension call
- //WorkspaceUtils.showFileNotFoundMessage(file);
- return;
- }
-
- try {
- final URL mapUrl = Compat.fileToUrl(file);
-
- final MapIO mapIO = (MapIO) MModeController.getMModeController().getExtension(MapIO.class);
-
- mapIO.newMap(mapUrl);
- }
- catch (final Exception e) {
- LogUtils.severe(e);
- }
- }
- else {
- try {
- Controller.getCurrentController().getViewController().openDocument(Compat.fileToUrl(file));
- }
- catch (Exception e) {
- LogUtils.warn("could not open document ("+getLinkURI()+")", e);
- }
- }
- }
- }
- else if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
- showPopup((Component) event.getBaggage(), event.getX(), event.getY());
- }
- }
-
- public WorkspaceTransferable getTransferable() {
- WorkspaceTransferable transferable = new WorkspaceTransferable();
- try {
- URI uri = URIUtils.getAbsoluteURI(getLinkURI());
- transferable.addData(WorkspaceTransferable.WORKSPACE_URI_LIST_FLAVOR, uri.toString());
- List<File> fileList = new Vector<File>();
- fileList.add(new File(uri));
- transferable.addData(WorkspaceTransferable.WORKSPACE_FILE_LIST_FLAVOR, fileList);
- if(!this.isSystem()) {
- List<AWorkspaceTreeNode> objectList = new ArrayList<AWorkspaceTreeNode>();
- objectList.add(this);
- transferable.addData(WorkspaceTransferable.WORKSPACE_NODE_FLAVOR, objectList);
- }
- return transferable;
- }
- catch (Exception e) {
- LogUtils.warn(e);
- }
- return null;
- }
-
- public boolean getAllowsChildren() {
- return false;
- }
-
- protected AWorkspaceTreeNode clone(LinkTypeFileNode node) {
- node.setLinkURI(getLinkURI());
- return super.clone(node);
- }
-
-
- public AWorkspaceTreeNode clone() {
- LinkTypeFileNode node = new LinkTypeFileNode(getType());
- return clone(node);
- }
-
- public WorkspacePopupMenu getContextMenu() {
- if (popupMenu == null) {
- initializePopup();
- }
- return popupMenu;
- }
-
- public boolean acceptDrop(DataFlavor[] flavors) {
- return false;
- }
-
- public boolean processDrop(DropTargetDropEvent event) {
- event.rejectDrop();
- return true;
- }
-
- public boolean setIcons(DefaultTreeCellRenderer renderer) {
- File file = URIUtils.getAbsoluteFile(getLinkURI());
- if((file == null || !file.exists()) && !isSystem()) {
- renderer.setLeafIcon(NOT_EXISTING);
- renderer.setOpenIcon(NOT_EXISTING);
- renderer.setClosedIcon(NOT_EXISTING);
- return true;
- }
- if(fileIcon == null) {
- if(linkPath != null) {
- fileIcon = WorkspaceController.getCurrentModeExtension().getView().getNodeTypeIconManager().getIconForNode(this);
- }
- }
-
- if(fileIcon == null) {
- fileIcon = FileSystemView.getFileSystemView().getSystemIcon(file);
- if(fileIcon != null) {
- renderer.setLeafIcon(fileIcon);
- return true;
- }
- return false;
- }
- renderer.setLeafIcon(fileIcon);
- return true;
- }
-
- public boolean changeName(String newName, boolean renameLink) {
- assert(newName != null);
- assert(newName.trim().length() > 0);
-
- if(renameLink) {
- File oldFile = URIUtils.getAbsoluteFile(getLinkURI());
- try{
- if(oldFile == null) {
- throw new Exception("failed to resolve the file for"+getName());
- }
- File destFile = new File(oldFile.getParentFile(), newName);
- if(oldFile.exists() && oldFile.renameTo(destFile)) {
- try {
- getModel().changeNodeName(this, newName);
- return true;
- }
- catch(Exception ex) {
- destFile.renameTo(oldFile);
- return false;
- }
- }
- else {
- LogUtils.warn("cannot rename "+oldFile.getName());
- }
- }
- catch (Exception e) {
- LogUtils.warn("cannot rename "+oldFile.getName(), e);
- }
- }
- else {
- try {
- getModel().changeNodeName(this, newName);
- }
- catch(Exception ex) {
- // do nth.
- }
- return true;
- }
- return false;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/ProjectRootNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/ProjectRootNode.java
deleted file mode 100644
index e059b80..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/ProjectRootNode.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/**
- * author: Marcel Genzmehr
- * 23.08.2011
- */
-package org.freeplane.plugin.workspace.nodes;
-
-import java.awt.Component;
-import java.net.URI;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.JOptionPane;
-import javax.swing.tree.DefaultTreeCellRenderer;
-
-import org.freeplane.core.ui.components.UITools;
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.actions.WorkspaceRemoveProjectAction;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.io.annotation.ExportAsAttribute;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-import org.freeplane.plugin.workspace.model.IMutableLinkNode;
-import org.freeplane.plugin.workspace.model.project.AWorkspaceProject;
-
-
-public class ProjectRootNode extends AFolderNode implements IMutableLinkNode, IWorkspaceNodeActionListener {
-
- private static final long serialVersionUID = 1L;
- private static final Icon DEFAULT_ICON = new ImageIcon(AFolderNode.class.getResource("/images/project-open-2.png"));
- private static WorkspacePopupMenu popupMenu = null;
- private String projectID;
- private URI projectRoot = null;
- private String versionID;
-
- /***********************************************************************************
- * CONSTRUCTORS
- **********************************************************************************/
-
- public ProjectRootNode() {
- this(null);
- }
-
- public ProjectRootNode(String type) {
- super(null);
- setParent(WorkspaceController.getCurrentModel().getRoot());
- }
-
- /***********************************************************************************
- * METHODS
- **********************************************************************************/
-
- public URI getPath() {
- return this.projectRoot;
- }
-
- @ExportAsAttribute(name="ID")
- public String getProjectID() {
- return this.projectID;
- }
-
- public void setProjectID(String id) {
- this.projectID = id;
- }
-
- public String getId() {
- return getProjectID() == null ? Integer.toHexString("".hashCode()).toUpperCase() : getProjectID();
- }
-
- public boolean setIcons(DefaultTreeCellRenderer renderer) {
- renderer.setOpenIcon(DEFAULT_ICON);
- renderer.setClosedIcon(DEFAULT_ICON);
- renderer.setLeafIcon(DEFAULT_ICON);
- return true;
- }
-
- protected AWorkspaceTreeNode clone(ProjectRootNode node) {
- return super.clone(node);
- }
-
- /***********************************************************************************
- * REQUIRED METHODS FOR INTERFACES
- **********************************************************************************/
-
- public void handleAction(WorkspaceActionEvent event) {
- if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
- showPopup((Component) event.getBaggage(), event.getX(), event.getY());
- }
- }
-
- public void refresh() {
- try {
- getModel().reload(this);
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public AWorkspaceTreeNode clone() {
- ProjectRootNode node = new ProjectRootNode(getType());
- return clone(node);
- }
-
- public void initializePopup() {
- if (popupMenu == null) {
- popupMenu = new WorkspacePopupMenu();
- WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
- WorkspacePopupMenuBuilder.createSubMenu(TextUtils.getRawText("workspace.action.new.label")),
- "workspace.action.node.new.folder",
- "workspace.action.file.new.mindmap",
- WorkspacePopupMenuBuilder.endSubMenu(),
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.open.location",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.cut",
- "workspace.action.node.copy",
- "workspace.action.node.paste",
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.rename",
- WorkspaceRemoveProjectAction.KEY,
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.node.refresh"
- });
- }
-
- }
-
- public WorkspacePopupMenu getContextMenu() {
- if (popupMenu == null) {
- initializePopup();
- }
- return popupMenu;
- }
-
- public String getTagName() {
- return "project";
- }
-
- public boolean getAllowsChildren() {
- return true;
- }
-
- public void initiateMyFile(AWorkspaceProject project) {
- FolderTypeMyFilesNode myFilesNode = new FolderTypeMyFilesNode(project);
- getModel().addNodeTo(myFilesNode, this);
- myFilesNode.refresh();
- }
-
- public boolean changeName(String newName, boolean renameLink) {
- try {
- if(renameLink) {
- this.getModel().changeNodeName(this, newName);
- }
- else {
- this.setName(newName);
- }
- }
- catch(Exception ex) {
- JOptionPane.showMessageDialog(UITools.getFrame(), TextUtils.getText("error_rename_file") + " ("+ex.getMessage()+")",
- TextUtils.getText("error_rename_file_title"), JOptionPane.ERROR_MESSAGE);
- return false;
- }
- return true;
- }
-
- public void setVersion(String version) {
- this.versionID = version;
- }
-
- @ExportAsAttribute(name="version")
- public String getVersion() {
- return this.versionID;
- }
-}
diff --git a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/WorkspaceRootNode.java b/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/WorkspaceRootNode.java
deleted file mode 100644
index 3cea64f..0000000
--- a/freeplane_plugin_workspace/src/org/freeplane/plugin/workspace/nodes/WorkspaceRootNode.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package org.freeplane.plugin.workspace.nodes;
-
-import java.awt.Component;
-import java.net.URI;
-import java.util.Enumeration;
-import java.util.NoSuchElementException;
-
-import javax.swing.Icon;
-import javax.swing.ImageIcon;
-import javax.swing.tree.DefaultTreeCellRenderer;
-import javax.swing.tree.TreeNode;
-
-import org.freeplane.core.util.TextUtils;
-import org.freeplane.plugin.workspace.WorkspaceController;
-import org.freeplane.plugin.workspace.actions.NodeRefreshAction;
-import org.freeplane.plugin.workspace.actions.WorkspaceImportProjectAction;
-import org.freeplane.plugin.workspace.actions.WorkspaceNewProjectAction;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenu;
-import org.freeplane.plugin.workspace.components.menu.WorkspacePopupMenuBuilder;
-import org.freeplane.plugin.workspace.event.IWorkspaceNodeActionListener;
-import org.freeplane.plugin.workspace.event.WorkspaceActionEvent;
-import org.freeplane.plugin.workspace.model.AWorkspaceTreeNode;
-
-public class WorkspaceRootNode extends AFolderNode implements IWorkspaceNodeActionListener {
-
- private static final long serialVersionUID = 1L;
- private static Icon DEFAULT_ICON = new ImageIcon(
- FolderLinkNode.class.getResource("/images/16x16/preferences-desktop-filetype-association.png"));
- private static WorkspacePopupMenu popupMenu;
-
- public WorkspaceRootNode() {
- super(null);
- }
-
- public final String getTagName() {
- return null;
- }
-
- public void handleAction(WorkspaceActionEvent event) {
- if (event.getType() == WorkspaceActionEvent.MOUSE_RIGHT_CLICK) {
- showPopup((Component) event.getBaggage(), event.getX(), event.getY());
- }
- }
-
- public boolean isSystem() {
- return true;
- }
-
- public boolean setIcons(DefaultTreeCellRenderer renderer) {
- renderer.setOpenIcon(DEFAULT_ICON);
- renderer.setClosedIcon(DEFAULT_ICON);
- renderer.setLeafIcon(DEFAULT_ICON);
- return true;
- }
-
- public void initializePopup() {
- if (popupMenu == null) {
- popupMenu = new WorkspacePopupMenu();
- WorkspacePopupMenuBuilder.addActions(popupMenu, new String[] {
- WorkspaceNewProjectAction.KEY,
- WorkspaceImportProjectAction.KEY,
- WorkspacePopupMenuBuilder.SEPARATOR,
- "workspace.action.all.expand",
- "workspace.action.all.collapse",
- WorkspacePopupMenuBuilder.SEPARATOR,
- NodeRefreshAction.KEY
- });
- }
- }
-
- protected AWorkspaceTreeNode clone(WorkspaceRootNode node) {
- return super.clone(node);
- }
-
- public AWorkspaceTreeNode clone() {
- WorkspaceRootNode node = new WorkspaceRootNode();
- return clone(node);
- }
-
- public WorkspacePopupMenu getContextMenu() {
- if (popupMenu == null) {
- initializePopup();
- }
- return popupMenu;
- }
-
- public String getName() {
- //WORKSPACE - todo: get name from somewhere or set it somehow
- return TextUtils.getText("workspace.node.root.name");
- }
-
- public void refresh() {
- getModel().reload(this);
- }
-
- public URI getPath() {
- // not used for workspace root
- return null;
- }
-
- public boolean isLeaf() {
- return false;
- }
-
- public AWorkspaceTreeNode getChildAt(int childIndex) {
- AWorkspaceTreeNode node = null;
- int offset = super.getChildCount();
- if(offset > 0) {
- node = super.getChildAt(childIndex);
- }
- if(node == null) {
- node = (AWorkspaceTreeNode) WorkspaceController.getCurrentModel().getChild(this, childIndex);
- }
- return node;
- }
-
- public int getChildCount() {
- int offset = super.getChildCount();
- return WorkspaceController.getCurrentModel().getProjects().size()+offset;
- }
-
- public int getIndex(TreeNode node) {
- return WorkspaceController.getCurrentModel().getIndexOfChild(this, node);
- }
-
- public boolean getAllowsChildren() {
- return true;
- }
-
- public Enumeration<AWorkspaceTreeNode> children() {
- return new Enumeration<AWorkspaceTreeNode>() {
- int count = 0;
-
- public boolean hasMoreElements() {
- return count < getChildCount();
- }
-
- public AWorkspaceTreeNode nextElement() {
- if (count < getChildCount()) {
- return getChildAt(count++);
- }
- throw new NoSuchElementException("WorkspaceRoot Enumeration");
- }
- };
- }
-}
diff --git a/freeplane_devresources/infinitest.filters b/freeplane_uitest/infinitest.filters
similarity index 100%
rename from freeplane_devresources/infinitest.filters
rename to freeplane_uitest/infinitest.filters
diff --git a/freeplane_uitest/junit-core-test/org/freeplane/core/util/HtmlUtilsTest.java b/freeplane_uitest/junit-core-test/org/freeplane/core/util/HtmlUtilsTest.java
new file mode 100644
index 0000000..e1fd7dc
--- /dev/null
+++ b/freeplane_uitest/junit-core-test/org/freeplane/core/util/HtmlUtilsTest.java
@@ -0,0 +1,47 @@
+package org.freeplane.core.util;
+
+import static org.freeplane.core.util.HtmlUtils.join;
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+public class HtmlUtilsTest {
+ private final String text1 = "foo";
+ private final String text2 = "bla";
+
+ @Test
+ public void plainToHTML_wraps_text_in_paragraph() {
+ // plainToHTML is used in HtmlUtils.join() which assumes that text is wrapped in <p>
+ assertEquals(body(e("p", "a") + '\n' + e("p", "b")), HtmlUtils.plainToHTML("a\nb"));
+ }
+ @Test
+ public void plainToHTML_creates_two_paragraphs_from_one_newline() {
+ assertEquals(body(e("p", "") + '\n' + e("p", "")), HtmlUtils.plainToHTML("\n"));
+ }
+
+ @Test
+ public void testJoin() {
+ assertEquals(body(e("p", text1) + '\n' + e("p", text2)), join(text1, text2));
+ assertEquals(body(text1 + '\n' + e("p", text2)), join(body(text1), text2));
+ assertEquals(body(e("p", text1) + '\n' + text2), join(text1, body(text2)));
+ assertEquals(body(text1 + '\n' + text2), join(body(text1), body(text2)));
+ }
+
+ @Test
+ public void use_empty_strings_to_inject_paragraphs() {
+ assertEquals(body(text1 + "\n<p></p>\n" + text2), join(body(text1), "", body(text2)));
+ }
+
+ @Test
+ public void use_newline_to_inject_two_paragraphs() {
+ assertEquals(body(text1 + "\n<p></p>\n<p></p>\n" + text2), join(body(text1), "\n", body(text2)));
+ }
+
+ private String body(String body) {
+ return e("html", e("body", body));
+ }
+
+ private String e(String tag, String body) {
+ return String.format("<%s>%s</%s>", tag, body, tag);
+ }
+}
diff --git a/gitinfo.properties b/gitinfo.properties
new file mode 100644
index 0000000..4ba5ebe
--- /dev/null
+++ b/gitinfo.properties
@@ -0,0 +1 @@
+git-revision=7da78d3fc69920ca4f32ba8b13703d9841b64ffa Weblate 2016-07-09 19:53:53 +0200
\ No newline at end of file
diff --git a/gitinfo.txt b/gitinfo.txt
new file mode 100644
index 0000000..4ba5ebe
--- /dev/null
+++ b/gitinfo.txt
@@ -0,0 +1 @@
+git-revision=7da78d3fc69920ca4f32ba8b13703d9841b64ffa Weblate 2016-07-09 19:53:53 +0200
\ No newline at end of file
diff --git a/jdt-config.gradle b/jdt-config.gradle
new file mode 100644
index 0000000..2e4a3da
--- /dev/null
+++ b/jdt-config.gradle
@@ -0,0 +1,17 @@
+subprojects {
+
+ eclipse {
+
+ jdt {
+ // if you want to alter the java versions (by default they are configured with gradle java plugin settings):
+ sourceCompatibility = 1.7
+ targetCompatibility = 1.7
+
+ file {
+ withProperties { properties ->
+ properties.setProperty('org.eclipse.jdt.core.compiler.problem.invalidJavadocTags', 'disabled')
+ }
+ }
+ }
+ }
+}
diff --git a/license.txt b/license.txt
index 82fa1da..d511905 100644
--- a/license.txt
+++ b/license.txt
@@ -1,339 +1,339 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Lesser General
-Public License instead of this License.
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/mac.dist.gradle b/mac.dist.gradle
new file mode 100644
index 0000000..aff29cb
--- /dev/null
+++ b/mac.dist.gradle
@@ -0,0 +1,113 @@
+import org.apache.tools.ant.taskdefs.condition.Os
+import org.apache.tools.ant.filters.*
+
+def appBundlerJar = 'freeplane_framework/mac-appbundler/appbundler-1.0.jar'
+ant.taskdef(
+ name: "appbundler",
+ classname: 'com.oracle.appbundler.AppBundlerTask',
+ classpath: appBundlerJar,
+ onerror: "report"
+)
+
+def build4mac = globalDist + '/build4mac'
+def macappfullpath = new File(build4mac, 'Freeplane.app')
+
+task macosxapp {
+ doFirst {
+ delete build4mac + '/Freeplane.app'
+ mkdir build4mac
+
+ ant.appbundler(
+ outputdirectory: build4mac,
+ name: 'Freeplane',
+ displayname: 'Freeplane',
+ mainclassname: 'org.freeplane.launcher.Launcher',
+ shortversion: distVersion,
+ copyright: "Freeplane ${distVersion}",
+ identifier: 'org.freeplane.core',
+ icon: 'freeplane_framework/mac-appbundler/freeplane.icns',
+ signature: '????'
+ ) {
+ classpath(dir: globalBuild, includes: '*.jar')
+ option(value: "-Xmx512m")
+ option(value: "-Dapple.laf.useScreenMenuBar=true")
+ option(value: "-Xdock:name=Freeplane")
+ }
+
+ def dist_macos_info = macappfullpath.path + '/Contents/Info.plist'
+ ant.xslt(in: new File(dist_macos_info),
+ style: new File('freeplane_framework/mac-appbundler/mac_info_plist.xslt'),
+ out: new File(dist_macos_info + '2')
+ )
+ java.nio.file.Files.move(java.nio.file.Paths.get(dist_macos_info + '2'),
+ java.nio.file.Paths.get(dist_macos_info),
+ java.nio.file.StandardCopyOption.REPLACE_EXISTING)
+
+ def maclauncherfullpath = macappfullpath.path + '/Contents/MacOS'
+ delete maclauncherfullpath + '/JavaAppLauncher'
+ copy {
+ from('freeplane_framework/mac-appbundler'){
+ include('universalJavaApplicationStub.sh')
+ fileMode = 0755
+ }
+ into (maclauncherfullpath)
+ filter(FixCrLfFilter.class, eol:FixCrLfFilter.CrLf.newInstance("lf"))
+ }
+
+ def macjavafullpath = macappfullpath.path + '/Contents/Java'
+ copy {
+ from(globalBuild) {
+ exclude('**/*.bat')
+ exclude('**/*.exe')
+ exclude('*.jar')
+ }
+ into(macjavafullpath)
+ }
+
+ def macresourcesfullpath = macappfullpath.path + '/Contents/Resources'
+ copy {
+ from('freeplane_framework/mac-appbundler') {
+ include('freeplanedoc.icns')
+ }
+ into(macresourcesfullpath)
+ }
+ }
+ for (p in subprojects) {
+ dependsOn p.tasks.getByPath("build")
+ }
+}
+
+task dmg4mac(type: Exec) {
+ onlyIf { Os.isFamily(Os.FAMILY_MAC) }
+
+ commandLine 'hdiutil', 'create', '-srcfolder', macappfullpath.path,
+ globalDist + '/freeplane_app-' + distVersion + '.dmg'
+
+ dependsOn macosxapp
+}
+
+task zip4mac(type: Zip) {
+ destinationDir = new File(globalDist)
+ archiveName = 'freeplane_macos_bin-' + distVersion + '.zip'
+
+ from(build4mac) {
+ exclude('**/universalJavaApplicationStub.sh')
+ }
+ from(build4mac) {
+ include('**/universalJavaApplicationStub.sh')
+ fileMode = 0775
+ }
+
+ into('freeplane-' + distVersion)
+ dependsOn macosxapp
+}
+
+// this grouping task is necessary so that we can clean up build4mac!
+task macDist {
+ dependsOn dmg4mac
+ dependsOn zip4mac
+
+ doLast {
+ delete(build4mac)
+ }
+}
diff --git a/readme.txt b/readme.txt
deleted file mode 100644
index 22ac9af..0000000
--- a/readme.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-The software is distributed under General Public License version 2 or later.
-For complete build run ant in directory freeplane_framework/ant.
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..1e9fca2
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,13 @@
+include 'freeplane',
+ 'freeplane_ant',
+ 'freeplane_framework',
+ 'freeplane_mac',
+ 'freeplane_plugin_bugreport',
+ 'freeplane_plugin_formula',
+ 'freeplane_plugin_latex',
+ 'freeplane_plugin_openmaps',
+ 'freeplane_plugin_script',
+ 'freeplane_plugin_svg',
+ 'freeplane_plugin_jsyntaxpane',
+
+ 'JOrtho_0.4_freeplane'
diff --git a/src.dist.gradle b/src.dist.gradle
new file mode 100644
index 0000000..23c6f5d
--- /dev/null
+++ b/src.dist.gradle
@@ -0,0 +1,146 @@
+import org.apache.tools.ant.filters.FixCrLfFilter
+
+// some shorthands for often-used include(...)/exclude(...) specs:
+def textFilesIncludeSpec(dir) {
+ if (dir == null)
+ return ['**/*.java',
+ '**/*.xml',
+ '**/*.xsl',
+ '**/*.mm',
+ '**/*.properties',
+ '**/*.gradle']
+ else
+ return [dir + '/**/*.java',
+ dir + '/**/*.xml',
+ dir + '/**/*.xsl',
+ dir + '/**/*.mm',
+ dir + '/**/*.properties',
+ dir + '/**/*.gradle']
+}
+
+def buildFilesIncludeSpec() {
+ return ['*/build/**', '*/bin/**']
+}
+
+def miscExcludedFilesSpec() {
+ return ['**/.*/**', // dot files
+ '**/signjar*.properties', // might include credentials!
+ '*/META-INF/MANIFEST.MF']
+}
+
+// NOTE: if you change excludes here, also adapt task 'srcpureTarGz' below
+// (unfortunately there is some redundancy)!
+task srcTarGz(type: Tar) {
+ destinationDir = new File(globalDist)
+ archiveName = 'freeplane_src-' + distVersion + '.tar.gz'
+ compression = 'GZIP'
+ includeEmptyDirs = false
+
+ // text files (convert to LF)
+ from(rootDir) {
+ include('license.txt')
+ include('*.gradle')
+ include(textFilesIncludeSpec('freeplane*'))
+ include(textFilesIncludeSpec('JOrtho_0.4_freeplane'))
+
+ // exclude gradle/eclipse build files for all projects:
+ exclude(buildFilesIncludeSpec())
+ // exclude misc files:
+ exclude(miscExcludedFilesSpec())
+
+ filter(FixCrLfFilter.class,
+ eol:FixCrLfFilter.CrLf.newInstance("lf"))
+ }
+
+ // all other (source) files
+ from(rootDir) {
+ include('freeplane*/**')
+ include('JOrtho_0.4_freeplane/**')
+ exclude(textFilesIncludeSpec(null))
+
+ // exclude gradle/eclipse build files for all projects:
+ exclude(buildFilesIncludeSpec())
+ // exclude misc files:
+ exclude(miscExcludedFilesSpec())
+ }
+
+ // these two files must be included because they are generated from git info
+ // and git info is not available int src/srcpure distribs!
+ from(globalBuild) {
+ include('gitinfo.txt')
+ }
+ from(globalBuild + '/resources') {
+ include('gitinfo.properties')
+ }
+
+ into('freeplane-' + distVersion)
+}
+
+def srcpureAdditionalExcludeSpec() {
+ // built from latex.flex using jflex!
+ return ['freeplane_plugin_jsyntaxpane/src/main/java/jsyntaxpane/lexers/LaTeXLexer.java',
+
+ // the flash files don't have a source in the freeplane-distrib,
+ // which is a problem for Debian,
+ // see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=736106
+ // (the source is here: https://github.com/freeplane/misc/tree/master/flash-browser)
+ // => there is an (inactive) Debian package here:
+ // https://github.com/fnatter/freeplane-flash-browser-debian/
+ 'freeplane/resources/flash/visorFreeplane.swf', 'freeplane/resources/flash/flashobject.js',
+
+ // windows stuff
+ '**/*.exe', '**/*.res', '**/*.jar', '**/*.dll',
+ // MAC stuff
+ '**/*JavaApplicationStub*']
+
+}
+
+task srcpureTarGz(type: Tar) {
+ destinationDir = new File(globalDist)
+ archiveName = 'freeplane_srcpure-' + distVersion + '.tar.gz'
+ compression = 'GZIP'
+ includeEmptyDirs = false
+
+ // text files (convert to LF)
+ from(rootDir) {
+ include('license.txt')
+ include('*.gradle')
+ include(textFilesIncludeSpec('freeplane*'))
+ include(textFilesIncludeSpec('JOrtho_0.4_freeplane'))
+
+ // exclude gradle/eclipse build files for all projects:
+ exclude(buildFilesIncludeSpec())
+ // exclude misc files:
+ exclude(miscExcludedFilesSpec())
+ // exclude additional srcpure stuff
+ exclude(srcpureAdditionalExcludeSpec())
+
+ filter(FixCrLfFilter.class,
+ eol:FixCrLfFilter.CrLf.newInstance("lf"))
+ }
+
+ // all other (source) files
+ from(rootDir) {
+ include('freeplane*/**')
+ include('JOrtho_0.4_freeplane/**')
+ exclude(textFilesIncludeSpec(null))
+
+ // exclude gradle/eclipse build files for all projects:
+ exclude(buildFilesIncludeSpec())
+ // exclude misc files:
+ exclude(miscExcludedFilesSpec())
+ // exclude additional srcpure stuff
+ exclude(srcpureAdditionalExcludeSpec())
+ }
+
+ // these two files must be included because they are generated from git info
+ // and git info is not available int src/srcpure distribs!
+ from(globalBuild) {
+ include('gitinfo.txt')
+ }
+ from(globalBuild + '/resources') {
+ include('gitinfo.properties')
+ }
+
+ into('freeplane-' + distVersion)
+}
diff --git a/win.dist.gradle b/win.dist.gradle
new file mode 100644
index 0000000..6f63d15
--- /dev/null
+++ b/win.dist.gradle
@@ -0,0 +1,100 @@
+import groovy.io.FileType
+import org.apache.tools.ant.taskdefs.condition.Os
+
+task windowsInstaller(type: Exec) {
+ onlyIf { Os.isFamily(Os.FAMILY_WINDOWS) }
+
+ ignoreExitValue = true
+ workingDir = rootDir.path + '/freeplane_framework/windows-installer'
+
+ commandLine 'cmd.exe', '/c', 'ISCC.exe /Q Freeplane_without_Java.iss'
+ doLast {
+ new File(workingDir, 'Freeplane-Setup.exe').renameTo(new File(globalDist, "Freeplane-Setup-${distVersion}.exe"))
+ }
+
+ for (p in subprojects) {
+ dependsOn p.tasks.getByPath("build")
+ }
+}
+
+def portableInstallerDir = new File(globalDist, 'FreeplanePortable').path
+
+task copyWindowsPortableInstallerBasicFiles(type: Copy) {
+ onlyIf { Os.isFamily(Os.FAMILY_WINDOWS) }
+
+ // copy windows-portable files
+ from(rootDir.path + '/freeplane_framework/windows-portable') {
+ include('**')
+ }
+ into(portableInstallerDir)
+}
+task copyWindowsPortableInstallerLicense(type: Copy) {
+ onlyIf { Os.isFamily(Os.FAMILY_WINDOWS) }
+
+ // copy license
+ from(rootDir.path + '/freeplane/resources/') {
+ include('license.txt')
+ rename('license.txt', 'EULA.txt')
+ }
+ into(portableInstallerDir + '/Other/Source/')
+}
+task copyWindowsPortableInstallerIcon(type: Copy) {
+ onlyIf { Os.isFamily(Os.FAMILY_WINDOWS) }
+
+ // copy icon
+ from(rootDir.path + '/freeplane_framework/launch4j') {
+ include('Freeplane_app.ico')
+ rename('Freeplane_app.ico', 'appicon.ico')
+ }
+ into(portableInstallerDir + '/App/AppInfo/')
+}
+
+task copyWindowsPortableInstallerFiles(type: Copy) {
+ onlyIf { Os.isFamily(Os.FAMILY_WINDOWS) }
+
+ // copy INI I
+ from(rootDir.path + '/freeplane_framework/portableApps') {
+ include('portable.ini')
+ rename('portable.ini', 'freeplane.l4j.ini')
+ }
+
+ // copy INI II
+ from(rootDir.path + '/freeplane_framework/portableApps') {
+ include('portable.ini')
+ rename('portable.ini', 'freeplaneConsole.l4j.ini')
+ }
+
+ // copy all other files
+ from (globalBuild) {
+ exclude('*.bat', '*.ini', '*.sh')
+ exclude('doc/api/**')
+ }
+ into(portableInstallerDir + '/App/Freeplane/')
+
+ for (p in subprojects) {
+ dependsOn p.tasks.getByPath("build")
+ }
+ dependsOn copyWindowsPortableInstallerBasicFiles
+ dependsOn copyWindowsPortableInstallerLicense
+ dependsOn copyWindowsPortableInstallerIcon
+}
+
+task windowsPortableInstaller(type: Exec) {
+ onlyIf { Os.isFamily(Os.FAMILY_WINDOWS) }
+
+ // continue the build when running windows but PortableApps.comInstaller.exe is not installed?
+ ignoreExitValue = true
+ workingDir = rootDir.path + '/freeplane_framework'
+
+ commandLine 'cmd.exe', '/c', 'PortableApps.comInstaller.exe', portableInstallerDir
+
+ dependsOn copyWindowsPortableInstallerFiles
+
+ doLast {
+ new File(portableInstallerDir).deleteDir()
+ new File(globalDist).eachFileMatch(FileType.FILES, ~/FreeplanePortable_.*\.paf\.exe/) {
+ f ->
+ f.renameTo(new File(globalDist, "FreeplanePortable-${distVersion}.paf.exe"))
+ }
+ }
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/freeplane.git
More information about the pkg-java-commits
mailing list